#include #include #include #define FILESIZE 16384 #define ROMSIZE 262144 static unsigned char buf[FILESIZE * 8]; static unsigned char RomData[ROMSIZE]; /* this is not required, but it should be same style */ static unsigned char font_213f[] = { 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, }; /* required for JIS1 */ static unsigned char font_2140[] = { 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, }; static unsigned short zenkaku_table[] = { 0x2020, 0x203f, 0x2120, 0x213f, 0x2220, 0x223f, 0x2320, 0x233f, 0x2420, 0x243f, 0x2520, 0x253f, 0x2620, 0x263f, 0x2720, 0x273f, 0x2040, 0x205f, 0x2140, 0x215f, 0x2240, 0x225f, 0x2340, 0x235f, 0x2440, 0x245f, 0x2540, 0x255f, 0x2640, 0x265f, 0x2740, 0x275f, 0x2060, 0x207f, 0x2160, 0x217f, 0x2260, 0x227f, 0x2360, 0x237f, 0x2460, 0x247f, 0x2560, 0x257f, 0x2660, 0x267f, 0x2760, 0x277f, 0x4020, 0x403f, 0x4120, 0x413f, 0x4220, 0x423f, 0x4320, 0x433f, 0x4420, 0x443f, 0x4520, 0x453f, 0x4620, 0x463f, 0x4720, 0x473f, 0x4820, 0x483f, 0x4920, 0x493f, 0x4a20, 0x4a3f, 0x4b20, 0x4b3f, 0x4c20, 0x4c3f, 0x4d20, 0x4d3f, 0x4e20, 0x4e3f, 0x4f20, 0x4f3f, 0x3020, 0x303f, 0x3120, 0x313f, 0x3220, 0x323f, 0x3320, 0x333f, 0x3420, 0x343f, 0x3520, 0x353f, 0x3620, 0x363f, 0x3720, 0x373f, 0x3820, 0x383f, 0x3920, 0x393f, 0x3a20, 0x3a3f, 0x3b20, 0x3b3f, 0x3c20, 0x3c3f, 0x3d20, 0x3d3f, 0x3e20, 0x3e3f, 0x3f20, 0x3f3f, 0x4040, 0x405f, 0x4140, 0x415f, 0x4240, 0x425f, 0x4340, 0x435f, 0x4440, 0x445f, 0x4540, 0x455f, 0x4640, 0x465f, 0x4740, 0x475f, 0x4840, 0x485f, 0x4940, 0x495f, 0x4a40, 0x4a5f, 0x4b40, 0x4b5f, 0x4c40, 0x4c5f, 0x4d40, 0x4d5f, 0x4e40, 0x4e5f, 0x4f40, 0x4f5f, 0x3040, 0x305f, 0x3140, 0x315f, 0x3240, 0x325f, 0x3340, 0x335f, 0x3440, 0x345f, 0x3540, 0x355f, 0x3640, 0x365f, 0x3740, 0x375f, 0x3840, 0x385f, 0x3940, 0x395f, 0x3a40, 0x3a5f, 0x3b40, 0x3b5f, 0x3c40, 0x3c5f, 0x3d40, 0x3d5f, 0x3e40, 0x3e5f, 0x3f40, 0x3f5f, 0x4060, 0x407f, 0x4160, 0x417f, 0x4260, 0x427f, 0x4360, 0x437f, 0x4460, 0x447f, 0x4560, 0x457f, 0x4660, 0x467f, 0x4760, 0x477f, 0x4860, 0x487f, 0x4960, 0x497f, 0x4a60, 0x4a7f, 0x4b60, 0x4b7f, 0x4c60, 0x4c7f, 0x4d60, 0x4d7f, 0x4e60, 0x4e7f, 0x4f60, 0x4f7f, 0x3060, 0x307f, 0x3160, 0x317f, 0x3260, 0x327f, 0x3360, 0x337f, 0x3460, 0x347f, 0x3560, 0x357f, 0x3660, 0x367f, 0x3760, 0x377f, 0x3860, 0x387f, 0x3960, 0x397f, 0x3a60, 0x3a7f, 0x3b60, 0x3b7f, 0x3c60, 0x3c7f, 0x3d60, 0x3d7f, 0x3e60, 0x3e7f, 0x3f60, 0x3f7f, }; static unsigned char revert8(unsigned char data) { int i; unsigned char v; v = 0; for (i = 0; i < 8; i++) { if (data & (1 << i)) v |= (0x80 >> i); } return v; } static void convert_kanji_font(unsigned char *in, unsigned char *out) { int i; for (i = 0; i < 8; i++) { out[i + 0] = in[i * 2]; out[i + 8] = in[i * 2 + 1]; out[i + 16] = in[i * 2 + 16]; out[i + 24] = in[i * 2 + 17]; } } static void convert_ank_font16(unsigned char *in, unsigned char *out) { int i; for (i = 0; i < 8; i++) { out[i + 0] = in[i]; out[i + 16] = in[i + 8]; } } static void convert_ank_font8(unsigned char *in, unsigned char *out) { int i; for (i = 0; i < 8; i++) { out[i + 8] = 0; out[i + 24] = in[i]; } } static unsigned char *get_kanji_pointer(int jis) { int kuten, ku, ten, idx, offset; kuten = jis - 0x2020; ku = (kuten >> 8) & 0xff; ten = kuten & 0xff; /* invalid */ if (ku >= 96 || ten >= 96) return NULL; /* no convert */ if (ku == 0 || (ku > 8 && ku < 16)) return NULL; if (ku < 48) { idx = ku * 96 + ten - (ku >= 16) * 512; offset = 0; } else { idx = (ku - 48) * 96 + ten; offset = 0x00020000; } return RomData + offset + 32 * idx; } static int loadfile(char *filename, int offset) { int i; FILE *fp; fp = fopen(filename, "r"); if (fp == NULL) { printf("loadfile: %s open error\n", filename); return -1; } for (i = 0; i < FILESIZE; i++) { buf[i * 2 + offset] = fgetc(fp); } fclose(fp); return 0; } static void convert_zenkaku(void) { int i, j; unsigned char *in, *out; in = buf + 0x2000; for (i = 0; i < sizeof(zenkaku_table) / sizeof(uint16_t); i += 2) { for (j = zenkaku_table[i]; j <= zenkaku_table[i + 1]; j++) { out = get_kanji_pointer(j); if (out != NULL) convert_kanji_font(in, out); in += 0x20; } } } static void convert_hankaku(void) { int i; unsigned char *in, *out; for (i = 0x20; i < 0x80; i++) { out = RomData + (i - 0x20) * 32; in = buf + (i - 0x20) * 16 + 512; convert_ank_font16(in, out); in = buf + (i - 0x20) * 8 + 4352; convert_ank_font8(in, out); } for (i = 0xa0; i < 0xe0; i++) { out = RomData + (i - 0xa0 + 96 * 9) * 32; in = buf + (i - 0x20) * 16 + 512; convert_ank_font16(in, out); in = buf + (i - 0x20) * 8 + 4352; convert_ank_font8(in, out); } } int main(int argc, char *argv[]) { FILE *fp; int i; loadfile("font1-042.bin", FILESIZE * 0 + 0); loadfile("font2-041.bin", FILESIZE * 0 + 1); loadfile("font3-043.bin", FILESIZE * 2 + 0); loadfile("font4-044.bin", FILESIZE * 2 + 1); loadfile("font5-036.bin", FILESIZE * 4 + 0); loadfile("font6-037.bin", FILESIZE * 4 + 1); loadfile("font7-045.bin", FILESIZE * 6 + 0); loadfile("font8-046.bin", FILESIZE * 6 + 1); for (i = 0; i < sizeof(buf); i++) buf[i] = revert8(buf[i]); memset(RomData, ~0, ROMSIZE); convert_zenkaku(); convert_hankaku(); convert_kanji_font(font_213f, get_kanji_pointer(0x213f)); convert_kanji_font(font_2140, get_kanji_pointer(0x2140)); fp = fopen("kanji-p88.rom", "w"); if (fp != NULL) { fwrite(RomData, ROMSIZE, 1, fp); fclose(fp); } return 0; }