#include <stdio.h> // encoded strings for printing to screen: static unsigned char SCORE_STR96[] = {5, 29, 13, 25, 28, 15}; static unsigned char HIGH_SCORE_STR96[] = {10, 18,19,17,18,0,29,13,25,28,15}; static unsigned char CREDITS_STR128[] = {8, 13,28,15,14,19,30,29,0}; static unsigned char INSERT_COIN_STR128[] = {11, 19,24,29,15,28,30,0,13,25,19,24}; static unsigned char PRESS_START_STR128[] = {11, 26,28,15,29,29,0,29,30,11,28,30}; // Hmmm... I think it actually said PUSH start... // font data: static unsigned char font_points[] = { /* 0 */ 0xae, 0xe4, 0x40, 0x0a, /* 1 */ 0x2c, /* 2 */ 0xae, 0xe9, 0x95, 0x50, 0x04, /* 3 */ 0x04, 0x79, 0x4e, 0xea, /* 4 */ 0xa5, 0x59, 0x72, // originally 0x5a, 0x59, 0x4e, /* 5 */ 0x04, 0x49, 0x95, 0x5a, 0xae, /* 6 */ 0x59, 0x94, 0x40, 0x0a, /* 7 */ 0x2e, 0xea, /* 8 */ 0x04, 0xae, 0x59, 0xe4, 0xa0, /* 9 */ 0xea, 0xa5, 0x59, 0xe4, /* A */ 0x4e, 0xae, 0x59, 0xa0, /* B */ 0x69, 0x04, 0x4e, 0xea, 0xb1, /* C */ 0xae, 0x40, 0x0a, /* D */ 0xad, 0xd9, 0x93, 0x30, 0x0a, // originally 0xae, 0xe4, 0x40, 0x1b, (note fewer segments - changes length and index tables) /* E */ 0x40, 0x0a, 0x57, 0xae, /* F */ 0x0a, 0x57, 0xae, /* G */ 0x79, 0x94, 0x40, 0x0a, 0xae, /* H */ 0x0a, 0x59, 0x4e, /* I */ 0x2c, /* J */ 0x50, 0x03, 0x3d, 0xbe, /* K */ 0x0a, 0xe5, 0x54, /* L */ 0x0a, 0x04, /* M */ 0x0a, 0xa7, 0x7e, 0xe4, /* N */ 0x0a, 0xa4, 0x4e, /* O */ 0xae, 0xe4, 0x40, 0x0a, /* P */ 0x0a, 0xae, 0xe9, 0x95, /* Q */ 0x0a, 0xae, 0xe4, 0x40, 0x48, /* R */ 0x48, 0x59, 0x9e, 0xea, 0xa0, /* S */ 0x04, 0x49, 0x95, 0x5a, 0xae, /* T */ 0xae, 0xc2, /* U */ 0x0a, 0x04, 0x4e, /* V */ 0xa2, 0x2e, /* W */ 0xa1, 0x17, 0x73, 0x3e, /* X */ 0x0e, 0xa4, /* Y */ 0x27, 0x7a, 0x7e, /* Z */ 0xae, 0xe0, 0x04, }; static unsigned char font_length[] = { /* 0 */ 4, /* 1 */ 1, /* 2 */ 5, /* 3 */ 4, /* 4 */ 3, /* 5 */ 5, /* 6 */ 4, /* 7 */ 2, /* 8 */ 5, /* 9 */ 4, /* A */ 4, /* B */ 5, /* C */ 3, /* D */ 5, /* E */ 4, /* F */ 3, /* G */ 5, /* H */ 3, /* I */ 1, /* J */ 4, /* K */ 3, /* L */ 2, /* M */ 4, /* N */ 3, /* O */ 4, /* P */ 4, /* Q */ 5, /* R */ 5, /* S */ 5, /* T */ 2, /* U */ 3, /* V */ 2, /* W */ 4, /* X */ 2, /* Y */ 3, /* Z */ 3, }; static unsigned char font_index[] = { /* 0 */ 0, /* 1 */ 4, /* 2 */ 5, /* 3 */ 10, /* 4 */ 14, /* 5 */ 17, /* 6 */ 22, /* 7 */ 26, /* 8 */ 28, /* 9 */ 33, /* A */ 37, /* B */ 41, /* C */ 46, /* D */ 49, /* E */ 54, /* F */ 58, /* G */ 61, /* H */ 66, /* I */ 69, /* J */ 70, /* K */ 74, /* L */ 77, /* M */ 79, /* N */ 83, /* O */ 86, /* P */ 90, /* Q */ 94, /* R */ 99, /* S */ 104, /* T */ 109, /* U */ 111, /* V */ 114, /* W */ 116, /* X */ 120, /* Y */ 122, /* Z */ 125, }; void seg(int segtype, int y, int x) { } int cur_abs_x = 0, cur_abs_y = 0, start_abs_x = 0, lastwas = 1; int last_dumped_abs_x = 0, last_dumped_abs_y = 0; static void move_rel(int y, int x) { if (x == 0 && y == 0) return; cur_abs_x += x; cur_abs_y += y; lastwas = 1; } static void line_rel(int y, int x) { if (y == 0 && x == 0) return; if (lastwas == 1) { // dump a move if ( (cur_abs_x != last_dumped_abs_x) || (cur_abs_y != last_dumped_abs_y) ) fprintf(stdout, " move_rel_XY(%d,%d); // to %d,%d\n", cur_abs_x-last_dumped_abs_x, cur_abs_y-last_dumped_abs_y, cur_abs_x, cur_abs_y); // we are now reliably at the start position last_dumped_abs_x = cur_abs_x; last_dumped_abs_y = cur_abs_y; } cur_abs_x += x; cur_abs_y += y; if (cur_abs_x != last_dumped_abs_x || cur_abs_y != last_dumped_abs_y) fprintf(stdout, " line_rel_XY(%d,%d); // to %d,%d\n", x,y, cur_abs_x, cur_abs_y); last_dumped_abs_x = cur_abs_x; last_dumped_abs_y = cur_abs_y; lastwas = 0; } static void move_abs(int y, int x) { if ( (cur_abs_x != last_dumped_abs_x) || (cur_abs_y != last_dumped_abs_y) ) { move_rel(cur_abs_x-last_dumped_abs_x, cur_abs_y-last_dumped_abs_y); //fprintf(stdout, " move_rel_XY(%d,%d) # to %d,%d\n", cur_abs_x-last_dumped_abs_x, cur_abs_y-last_dumped_abs_y, // cur_abs_x, cur_abs_y); //last_dumped_abs_x = cur_abs_x; last_dumped_abs_y = cur_abs_y; } cur_abs_x = x; cur_abs_y = y; lastwas = 1; } static void segment(unsigned char coords) { short fromx; short fromy; short tox; short toy; short from, to; // remember to use shifts instead of divides (unless GCC does it for us?) // clever packing may be undone by overhead of div&modulo 5 ... reconsider using less dense tables? to = coords & 15; tox = ((to % 5) * 4); toy = ((to / 5) * 12); from = coords >> 4; fromx = ((from % 5) * 4); fromy = ((from / 5) * 12); // assumes starts at 0,0 relative to current letter: move_rel((char)fromy, (char)fromx); line_rel((char)(toy-fromy), (char)(tox-fromx)); move_rel((char)-toy, (char)-tox); // back to origin } static void ch(unsigned char charno, short scale) { if (charno /* > 0U */) { // 0 is blank space {unsigned char i, limit; // If the array indexes, and calculations, in the for loop test comparison are recalculated on every loop, perhaps // we should pre-calculate them before entering the loop, and use the cached values? i = font_index[charno-1]; limit = font_index[charno-1]+font_length[charno-1]; while (i < limit) { segment(font_points[i++]); } } } // add move back here once debugged } void text(char *name, unsigned char *s, int scale) { int i; fprintf(stdout, "void SHOW_%s(char absx, char absy, char scale) {\n", name); fprintf(stdout, " reset_beam();\n"); fprintf(stdout, " set_scale(0x7f);\n"); fprintf(stdout, " move_rel_XY(absx, absy);\n"); fprintf(stdout, " set_scale(scale);\n"); start_abs_x = 0; cur_abs_x = cur_abs_y = 0; last_dumped_abs_x = 0; last_dumped_abs_y = 0; for (i = 1; i <= s[0]; i++) { move_abs(0, start_abs_x); // start of next letter ch(s[i], scale); // leave at 0,0 relative to current letter only start_abs_x += 24; // all letters are 16 wide } fprintf(stdout, "}\n\n"); } int main(int argc, char **argv) { int i; text("SCORE", SCORE_STR96, 96); text("HIGH_SCORE", HIGH_SCORE_STR96, 96); text("CREDITS", CREDITS_STR128, 128); text("INSERT_COIN", INSERT_COIN_STR128, 128); text("PRESS_START", PRESS_START_STR128, 128); }