From 765c8e3f85b172a155a9172ec3bc8a6fb965f671 Mon Sep 17 00:00:00 2001 From: Ian C Date: Mon, 21 Mar 2016 06:31:38 +0000 Subject: Added missing files from previous commit. --- src/rawout.c | 89 +++++++++++++++++++++++++++++++++++ src/rawout.h | 55 ++++++++++++++++++++++ src/specout.c | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/specout.h | 56 ++++++++++++++++++++++ 4 files changed, 347 insertions(+) create mode 100644 src/rawout.c create mode 100644 src/rawout.h create mode 100644 src/specout.c create mode 100644 src/specout.h (limited to 'src') diff --git a/src/rawout.c b/src/rawout.c new file mode 100644 index 0000000..35ff650 --- /dev/null +++ b/src/rawout.c @@ -0,0 +1,89 @@ +/* + + casm - Simple, portable assembler + + Copyright (C) 2003-2015 Ian Cowburn (ianc@noddybox.demon.co.uk) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + ------------------------------------------------------------------------- + + Various output type handlers. + +*/ +#include +#include + +#include "global.h" +#include "rawout.h" + + +/* ---------------------------------------- INTERFACES +*/ +const ValueTable *RawOutputOptions(void) +{ + return NULL; +} + +CommandStatus RawOutputSetOption(int opt, int argc, char *argv[], + int quoted[], char *error, size_t error_size) +{ + return CMD_NOT_KNOWN; +} + +int RawOutput(const char *filename, const char *filename_bank, + MemoryBank **bank, int count, char *error, size_t error_size) +{ + char buff[4096]; + int f; + + for(f = 0; f < count; f++) + { + FILE *fp; + const char *name; + const Byte *mem; + int min, max; + + if (count == 1) + { + name = filename; + } + else + { + snprintf(buff, sizeof buff, filename_bank, bank[f]->number); + name = buff; + } + + if (!(fp = fopen(name, "wb"))) + { + snprintf(error, error_size, "Failed to open %s\n", name); + return FALSE; + } + + mem = bank[f]->memory; + min = bank[f]->min_address_used; + max = bank[f]->max_address_used; + + fwrite(mem + min, 1, max - min + 1, fp); + + fclose(fp); + } + + return TRUE; +} + + +/* +vim: ai sw=4 ts=8 expandtab +*/ diff --git a/src/rawout.h b/src/rawout.h new file mode 100644 index 0000000..08fc42f --- /dev/null +++ b/src/rawout.h @@ -0,0 +1,55 @@ +/* + + casm - Simple, portable assembler + + Copyright (C) 2003-2015 Ian Cowburn (ianc@noddybox.demon.co.uk) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + ------------------------------------------------------------------------- + + RAW binary file output + +*/ + +#ifndef CASM_RAWOUT_H +#define CASM_RAWOUT_H + +#include "parse.h" +#include "state.h" +#include "cmd.h" + +/* ---------------------------------------- INTERFACES +*/ + + +/* RAW Output options +*/ +const ValueTable *RawOutputOptions(void); + +CommandStatus RawOutputSetOption(int opt, int argc, char *argv[], + int quoted[], char *error, size_t error_size); + + +/* RAW output of assembly. Returns TRUE if OK, FALSE for failure. +*/ +int RawOutput(const char *filename, const char *filename_bank, + MemoryBank **bank, int count, + char *error, size_t error_size); + +#endif + +/* +vim: ai sw=4 ts=8 expandtab +*/ diff --git a/src/specout.c b/src/specout.c new file mode 100644 index 0000000..e5ed897 --- /dev/null +++ b/src/specout.c @@ -0,0 +1,147 @@ +/* + + casm - Simple, portable assembler + + Copyright (C) 2003-2015 Ian Cowburn (ianc@noddybox.demon.co.uk) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + ------------------------------------------------------------------------- + + Spectrum TAP file output handler. + +*/ +#include +#include + +#include "global.h" +#include "specout.h" + + +/* ---------------------------------------- PRIVATE FUNCTIONS +*/ + +static Byte TapByte(FILE *fp, Byte b, Byte chk) +{ + chk ^= b; + putc(b, fp); + return chk; +} + + +static Byte TapWord(FILE *fp, int w, Byte chk) +{ + chk = TapByte(fp, w & 0xff, chk); + chk = TapByte(fp, (w & 0xff00) >> 8, chk); + return chk; +} + + +static Byte TapString(FILE *fp, const char *p, int len, Byte chk) +{ + while(len--) + { + chk = TapByte(fp, *p ? *p++ : ' ', chk); + } + + return chk; +} + + +/* ---------------------------------------- INTERFACES +*/ +const ValueTable *SpecTAPOutputOptions(void) +{ + return NULL; +} + +CommandStatus SpecTAPOutputSetOption(int opt, int argc, char *argv[], + int quoted[], + char *error, size_t error_size) +{ + return CMD_NOT_KNOWN; +} + +int SpecTAPOutput(const char *filename, const char *filename_bank, + MemoryBank **bank, int count, char *error, size_t error_size) +{ + FILE *fp = fopen(filename, "wb"); + int f; + + if (!fp) + { + snprintf(error, error_size, "Failed to create %s\n", filename); + return FALSE; + } + + for(f = 0; f < count; f++) + { + Byte chk = 0; + const Byte *mem; + int min, max, len; + + mem = bank[f]->memory; + min = bank[f]->min_address_used; + max = bank[f]->max_address_used; + len = max - min + 1; + + TapWord(fp, 19, 0); + + chk = TapByte(fp, 0, chk); + chk = TapByte(fp, 3, chk); + + if (count == 1) + { + chk = TapString(fp, filename, 10, chk); + } + else + { + char fn[16]; + + snprintf(fn, sizeof fn, filename_bank, bank[f]->number); + chk = TapString(fp, fn, 10, chk); + } + + chk = TapWord(fp, len, chk); + chk = TapWord(fp, min, chk); + chk = TapWord(fp, 32768, chk); + + TapByte(fp, chk, 0); + + /* Output file data + */ + TapWord(fp, len + 2, 0); + + chk = 0; + + chk = TapByte(fp, 0xff, chk); + + while(min <= max) + { + chk = TapByte(fp, mem[min], chk); + min++; + } + + TapByte(fp, chk, 0); + } + + fclose(fp); + + return TRUE; +} + + +/* +vim: ai sw=4 ts=8 expandtab +*/ diff --git a/src/specout.h b/src/specout.h new file mode 100644 index 0000000..7520ed2 --- /dev/null +++ b/src/specout.h @@ -0,0 +1,56 @@ +/* + + casm - Simple, portable assembler + + Copyright (C) 2003-2015 Ian Cowburn (ianc@noddybox.demon.co.uk) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + ------------------------------------------------------------------------- + + Spectrum TAP file output + +*/ + +#ifndef CASM_SPECOUT_H +#define CASM_SPECOUT_H + +#include "parse.h" +#include "state.h" +#include "cmd.h" + +/* ---------------------------------------- INTERFACES +*/ + + +/* RAW Output options +*/ +const ValueTable *SpecTAPOutputOptions(void); + +CommandStatus SpecTAPOutputSetOption(int opt, int argc, char *argv[], + int quoted[], char *error, + size_t error_size); + + +/* Spectrum TAP output of assembly. Returns TRUE if OK, FALSE for failure. +*/ +int SpecTAPOutput(const char *filename, const char *filename_bank, + MemoryBank **bank, int count, + char *error, size_t error_size); + +#endif + +/* +vim: ai sw=4 ts=8 expandtab +*/ -- cgit v1.2.3