From: Robin Krens Date: Sat, 4 Jun 2022 12:45:07 +0000 (+0200) Subject: tools: romheader and padder X-Git-Url: https://robinkrens.nl/gitweb/?a=commitdiff_plain;h=2490a287de9cfce9c5c7f50219f9d3386fd9395d;p=swan-dev tools: romheader and padder --- diff --git a/tools/romheader.c b/tools/romheader.c new file mode 100644 index 0000000..39d6543 --- /dev/null +++ b/tools/romheader.c @@ -0,0 +1,82 @@ +/** + * File : romheader.c + * Author : Robin Krens + * Date : 04.06.2022 + * Last Modified Date: 04.06.2022 + * Last Modified By : Robin Krens + */ + +#include +#include +#include +#include + +#define VERBOSE 1 +#define SEGMENT_SIZE 0x10000 + +/* simple tool to pad 0xFF and to add ROM header + * romheader structure is as follows: */ + +struct __attribute__((__packed__)) rom_header { + uint8_t jmpf; + uint16_t label; + uint16_t segment; + uint8_t padding; + uint8_t dev_id; + uint8_t ws_type; + uint8_t cart_nr; + uint8_t padding2; + uint8_t romsize; + uint8_t ramsize; + uint8_t wsspec; + uint8_t padding3; + uint16_t checksum; +}; + +static struct rom_header header = { + .jmpf = 0xEA, + .label = 0x0, + .segment = 0xF000, + .dev_id = 0x0, + .ws_type = 0x1, + .cart_nr = 0x0, + .romsize = 0x0, + .ramsize = 0x0, + .wsspec = 0x0, + .checksum = 0xAAAA, +}; + + +int main(void) +{ + FILE *fp; + /* open for appending, so seek postion is at end */ + fp = fopen("test.wsc", "a"); + if (fp == NULL) { + perror("can not open file"); + exit(EXIT_FAILURE); + } + + unsigned pos = ftell(fp); + int gap = (SEGMENT_SIZE - pos) - sizeof(struct rom_header); + if (gap <= 0) + goto cleanup; + + char dummy[SEGMENT_SIZE + 1]; + memset(dummy, 0xFF, SEGMENT_SIZE); + + unsigned wc = fwrite(dummy, sizeof(char), gap, fp); + wc += fwrite(&header, sizeof(char), sizeof(struct rom_header), fp); + + if (VERBOSE) { + printf("size of struct: %ld\n", sizeof(struct rom_header)); + printf("pos: %d, gap to fill: %d\n", pos, gap); + printf("written %d\n", wc); + } + +cleanup: + + fflush(fp); + fclose(fp); +} +