--- /dev/null
+/**
+ * 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 = 0x42,
+ .ws_type = 0x01,
+ .cart_nr = 0x01,
+ .romsize = 0x03,
+ .ramsize = 0x00,
+ .wsspec = 0x04,
+ .checksum = 0x0000
+};
+
+
+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:
+
+ printf("done\n");
+ fflush(fp);
+ fclose(fp);
+}
+