aboutsummaryrefslogtreecommitdiffstats
path: root/roms/saa5050/genrom.c
diff options
context:
space:
mode:
Diffstat (limited to 'roms/saa5050/genrom.c')
-rw-r--r--roms/saa5050/genrom.c180
1 files changed, 180 insertions, 0 deletions
diff --git a/roms/saa5050/genrom.c b/roms/saa5050/genrom.c
new file mode 100644
index 0000000..9d93bb3
--- /dev/null
+++ b/roms/saa5050/genrom.c
@@ -0,0 +1,180 @@
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+// Characters on a 5x9 matrix. This is padded up to 16 rows when the
+// ROM is generated
+static uint8_t saa5050_charset[] = {
+ 0,0,0,0,0,0,0,0,0,
+ 4,4,4,4,4,0,4,0,0,
+ 10,10,10,0,0,0,0,0,0,
+ 6,9,8,28,8,8,31,0,0,
+ 14,21,20,14,5,21,14,0,0,
+ 24,25,2,4,8,19,3,0,0,
+ 8,20,20,8,21,18,13,0,0,
+ 4,4,4,0,0,0,0,0,0,
+
+ 2,4,8,8,8,4,2,0,0,
+ 8,4,2,2,2,4,8,0,0,
+ 4,21,14,4,14,21,4,0,0,
+ 0,4,4,31,4,4,0,0,0,
+ 0,0,0,0,0,4,4,8,0,
+ 0,0,0,14,0,0,0,0,0,
+ 0,0,0,0,0,0,4,0,0,
+ 0,1,2,4,8,16,0,0,0,
+
+ 4,10,17,17,17,10,4,0,0,
+ 4,12,4,4,4,4,14,0,0,
+ 14,17,1,6,8,16,31,0,0,
+ 31,1,2,6,1,17,14,0,0,
+ 2,6,10,18,31,2,2,0,0,
+ 31,16,30,1,1,17,14,0,0,
+ 6,8,16,30,17,17,14,0,0,
+ 31,1,2,4,8,8,8,0,0,
+
+ 14,17,17,14,17,17,14,0,0,
+ 14,17,17,15,1,2,12,0,0,
+ 0,0,4,0,0,0,4,0,0,
+ 0,0,4,0,0,4,4,8,0,
+ 2,4,8,16,8,4,2,0,0,
+ 0,0,31,0,31,0,0,0,0,
+ 8,4,2,1,2,4,8,0,0,
+ 14,17,2,4,4,0,4,0,0,
+
+ 14,17,23,21,23,16,14,0,0,
+ 4,10,17,17,31,17,17,0,0,
+ 30,17,17,30,17,17,30,0,0,
+ 14,17,16,16,16,17,14,0,0,
+ 30,17,17,17,17,17,30,0,0,
+ 31,16,16,30,16,16,31,0,0,
+ 31,16,16,30,16,16,16,0,0,
+ 14,17,16,16,19,17,15,0,0,
+
+ 17,17,17,31,17,17,17,0,0,
+ 14,4,4,4,4,4,14,0,0,
+ 1,1,1,1,1,17,14,0,0,
+ 17,18,20,24,20,18,17,0,0,
+ 16,16,16,16,16,16,31,0,0,
+ 17,27,21,21,17,17,17,0,0,
+ 17,17,25,21,19,17,17,0,0,
+ 14,17,17,17,17,17,14,0,0,
+
+ 30,17,17,30,16,16,16,0,0,
+ 14,17,17,17,21,18,13,0,0,
+ 30,17,17,30,20,18,17,0,0,
+ 14,17,16,14,1,17,14,0,0,
+ 31,4,4,4,4,4,4,0,0,
+ 17,17,17,17,17,17,14,0,0,
+ 17,17,17,10,10,4,4,0,0,
+ 17,17,17,21,21,21,10,0,0,
+
+ 17,17,10,4,10,17,17,0,0,
+ 17,17,10,4,4,4,4,0,0,
+ 31,1,2,4,8,16,31,0,0,
+ 0,4,8,31,8,4,0,0,0,
+ 16,16,16,16,22,1,2,4,7,
+ 0,4,2,31,2,4,0,0,0,
+ 0,4,14,21,4,4,0,0,0,
+ 10,10,31,10,31,10,10,0,0,
+
+ 0,0,0,31,0,0,0,0,0,
+ 0,0,14,1,15,17,15,0,0,
+ 16,16,30,17,17,17,30,0,0,
+ 0,0,15,16,16,16,15,0,0,
+ 1,1,15,17,17,17,15,0,0,
+ 0,0,14,17,31,16,14,0,0,
+ 2,4,4,14,4,4,4,0,0,
+ 0,0,15,17,17,17,15,1,14,
+
+ 16,16,30,17,17,17,17,0,0,
+ 4,0,12,4,4,4,14,0,0,
+ 4,0,4,4,4,4,4,4,8,
+ 8,8,9,10,12,10,9,0,0,
+ 12,4,4,4,4,4,14,0,0,
+ 0,0,26,21,21,21,21,0,0,
+ 0,0,30,17,17,17,17,0,0,
+ 0,0,14,17,17,17,14,0,0,
+
+ 0,0,30,17,17,17,30,16,16,
+ 0,0,15,17,17,17,15,1,1,
+ 0,0,11,12,8,8,8,0,0,
+ 0,0,15,16,14,1,30,0,0,
+ 4,4,14,4,4,4,2,0,0,
+ 0,0,17,17,17,17,15,0,0,
+ 0,0,17,17,10,10,4,0,0,
+ 0,0,17,17,21,21,10,0,0,
+
+ 0,0,17,10,4,10,17,0,0,
+ 0,0,17,17,17,17,15,1,14,
+ 0,0,31,2,4,8,31,0,0,
+ 8,8,8,8,9,3,5,7,1,
+ 10,10,10,10,10,10,10,0,0,
+ 24,4,24,4,25,3,5,7,1,
+ 0,4,0,31,0,4,0,0,0,
+ 31,31,31,31,31,31,31,0,0,
+};
+
+/* Generates 6x10 teletext graphics symbol according to specified code */
+void gen_gfx(char code,char *base)
+{
+ char *c;
+ int r;
+
+ for (r = 0, c = base; r < 10; r++, c++) {
+ /* Set unused bit 7 to 1 to flag these characters as graphics (the
+ * implementation uses this to determine whether hold and separated
+ * modes should be applied */
+ *c = 128;
+ if (r < 3) {
+ // 1 2
+ if (code & 1) *c += 56;
+ if (code & 2) *c += 7;
+ } else if (r < 7) {
+ // 4 8
+ if (code & 4) *c += 56;
+ if (code & 8) *c += 7;
+ } else {
+ // 16 64
+ if (code & 16) *c += 56;
+ if (code & 64) *c += 7;
+ }
+ }
+}
+
+int main(void) {
+ char *outbuf;
+ int ch,row;
+
+ outbuf = malloc(256 * 16);
+ if (outbuf == NULL) {
+ fprintf(stderr,"Out of memory\n");
+ return 1;
+ }
+
+ /* Unused locations are blank (all zero) */
+ memset(outbuf,0,256 * 16);
+
+ /* Copy character bitmaps to locations 32-127 and 160-255 */
+ for (ch = 0; ch < 96; ch++) {
+ for (row = 0; row < 9; row++) {
+ outbuf[16 * (32 + ch) + row + 1] = saa5050_charset[9 * ch + row];
+ outbuf[16 * (160 + ch) + row + 1] = saa5050_charset[9 * ch + row];
+ }
+ }
+
+ /* Generate graphics in locations 160-191 and 224-255 */
+ for (ch = 160; ch < 192; ch++) {
+ gen_gfx(ch,&outbuf[16 * ch]);
+ }
+ for (ch = 224; ch < 256; ch++) {
+ gen_gfx(ch,&outbuf[16 * ch]);
+ }
+
+ /* Write to stdout */
+ fwrite(outbuf,256 * 16,1,stdout);
+
+ free(outbuf);
+ return 0;
+}
+