#include #include #include #define FILESIZE 32768 #define X_CHAR 96 #define Y_CHAR 48 static uint8_t buf[FILESIZE * 4]; static uint8_t px[Y_CHAR * 16][X_CHAR * 16]; uint32_t cnvaddr(uint32_t addr) { return addr; } int kuten2glyphno(int ku, int ten) { int n, ix; ix = ten / 32; if (ku < 8) { /* 0区〜7区 */ switch (ix) { case 1: ix = 2; break; case 2: ix = 1; break; } n = (ku + ix * 8) * 32 + (ten % 32); } else if (ku < 16) { /* 8区〜15区 (未定義) */ n = -1; } else if (ku < 32) { /* 16区〜31区 */ n = (ku + 16 + ix * 16) * 32 + (ten % 32); } else if (ku < 48) { /* 32区〜47区 */ n = (ku + 48 + ix * 16) * 32 + (ten % 32); } else { /* 48区以降 (未定義) */ n = -1; } return n; } 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[cnvaddr(i) * 2 + offset] = fgetc(fp); } fclose(fp); return 0; } void draw_char(int x, int y, int n) { int dx, dy; uint16_t d; x *= 16; y *= 16; for (dy = 0; dy < 16; dy++) { if (n >= 0) { d = (buf[n * 0x20 + dy * 2] << 8) | buf[n * 0x20 + dy * 2 + 1]; } else { d = ~0; } for (dx = 0; dx < 16; dx++) { if (d & (0x8000 >> dx)) { px[y + dy][x + dx] = 1; } else { px[y + dy][x + dx] = 0; } } } return; } int main(int argc, char *argv[]) { int n, x, y, c; loadfile("108.bin", 0); loadfile("109.bin", 1); loadfile("110.bin", FILESIZE * 2); loadfile("111.bin", FILESIZE * 2 + 1); for (y = 0; y < Y_CHAR; y++) { for (x = 0; x < X_CHAR; x++) { n = kuten2glyphno(y, x); draw_char(x, y, n); } } for (y = 0; y < Y_CHAR * 16; y++) { for (x = 0; x < X_CHAR * 16; x++) { c = px[y][x] ? 0xff : 0x00; putchar(c); putchar(c); putchar(c); } } return 0; }