/* casm - Simple, portable assembler Copyright (C) 2003-2015 Ian Cowburn (ianc@noddybox.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 . ------------------------------------------------------------------------- Intel HEX output handler. */ #include #include #include #include "global.h" #include "codepage.h" #include "hexout.h" #include "expr.h" /* ---------------------------------------- MACROS & TYPES */ /* ---------------------------------------- PRIVATE TYPES AND VARS */ enum option_t { OPT_NULL_BYTE }; static const ValueTable option_set[]= { {"hex-null", OPT_NULL_BYTE}, {NULL} }; typedef struct { int null_byte; } Options; static Options options = { 0 }; /* ---------------------------------------- PRIVATE FUNCTIONS */ /* ---------------------------------------- INTERFACES */ const ValueTable *HEXOutputOptions(void) { return option_set; } CommandStatus HEXOutputSetOption(int opt, int argc, char *argv[], int quoted[], char *err, size_t errsize) { CommandStatus stat = CMD_OK; CMD_ARGC_CHECK(1); switch(opt) { case OPT_NULL_BYTE: CMD_EXPR(argv[0], options.null_byte); break; default: break; } return stat; } int HEXOutput(const char *filename, const char *filename_bank, MemoryBank **bank, int count, char *error, size_t error_size) { int f; for(f = 0; f < count; f++) { FILE *fp; char buff[4096]; const char *name; Byte *mem; int r; 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", name); return FALSE; } mem = bank[f]->memory; for(r = 0; r < 0xffff; r += 16) { int n; int found = 0; for(n = 0; n < 16 && !found; n++) { if (mem[r+n] != options.null_byte) { found = 1; } } if (found) { Byte csum = 0; fprintf(fp, ":10%4.4X00", r); for(n = 0; n < 16; n++) { fprintf(fp, "%2.2X", mem[r+n]); csum += mem[r+n]; } csum = ~csum; csum++; fprintf(fp, "%2.2X\n", csum); } } fprintf(fp, ":00000001FF\n"); fclose(fp); } return TRUE; } /* vim: ai sw=4 ts=8 expandtab */