tools: romheader and padder
authorRobin Krens <robin@robinkrens.nl>
Sat, 4 Jun 2022 12:45:07 +0000 (14:45 +0200)
committerRobin Krens <robin@robinkrens.nl>
Sat, 4 Jun 2022 12:45:07 +0000 (14:45 +0200)
tools/romheader.c [new file with mode: 0644]

diff --git a/tools/romheader.c b/tools/romheader.c
new file mode 100644 (file)
index 0000000..39d6543
--- /dev/null
@@ -0,0 +1,82 @@
+/**
+ * File              : romheader.c
+ * Author            : Robin Krens <robin@robinkrens.nl>
+ * Date              : 04.06.2022
+ * Last Modified Date: 04.06.2022
+ * Last Modified By  : Robin Krens <robin@robinkrens.nl>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+
+#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);
+}
+