UINT8 fontfm7_read(const OEMCHAR *filename, UINT8 loading) { FILEH fh; UINT8 *work; OEMCHAR fname[MAX_PATH]; work = (UINT8 *)_MALLOC(0x20000, "fm7font"); if (work == NULL) { goto frf7_err1; } file_cpyname(fname, filename, NELEMENTS(fname)); // 8dot ANKを読み込む必要はある? if (loading & FONT_ANK8) { file_cutname(fname); file_catname(fname, fm7ankname, NELEMENTS(fname)); fh = file_open_rb(fname); if (fh != FILEH_INVALID) { if (file_read(fh, work, 2048) == 2048) { loading &= ~FONT_ANK8; fontdata_ank8store(work + 0x100, 0x20, 0x60); fontdata_ank8store(work + 0x500, 0xa0, 0x40); } file_close(fh); } } // 16dot ASCII 及び 漢字を読み込む必要はあるか? if (loading & (FONT_ANK16a | FONT_KNJ1)) { file_cutname(fname); file_catname(fname, fm7knjname, NELEMENTS(fname)); fh = file_open_rb(fname); if (fh != FILEH_INVALID) { if (file_read(fh, work, 0x20000) == 0x20000) { // 16dot ASCIIを読み込む? if (loading & FONT_ANK16a) { loading &= ~FONT_ANK16a; fm7ankcpy(fontrom + 0x80200, work, 0x20, 0x7f); fontdata_patch16a(); } // 第一水準漢字を読み込む? if (loading & FONT_KNJ1) { loading &= ~FONT_KNJ1; fm7knjcpy(fontrom, work, 0x01, 0x30); fontdata_patchjis(); } } file_close(fh); } } _MFREE(work); frf7_err1: return(loading); }
UINT8 fontpc88_read(const OEMCHAR *filename, UINT8 loading) { FILEH fh; UINT8 *work; OEMCHAR fname[MAX_PATH]; work = (UINT8 *)_MALLOC(0x20000, "pc88font"); if (work == NULL) { goto fr88_err1; } file_cpyname(fname, filename, NELEMENTS(fname)); // 第2水準以外を読む必要はある? if (loading & (FONT_ANK8 | FONTLOAD_ANK | FONT_KNJ1)) { // あったら読み込んでみる file_cutname(fname); file_catname(fname, pc88knj1name, NELEMENTS(fname)); fh = file_open_rb(fname); if (fh != FILEH_INVALID) { if (file_read(fh, work, 0x20000) == 0x20000) { // 8dot ANKを読む必要があるか if (loading & FONT_ANK8) { loading &= ~FONT_ANK8; fontdata_ank8store(work + 0x1000, 0, 256); } // 16dot ASCIIを読む必要があるか if (loading & FONT_ANK16a) { loading &= ~FONT_ANK16a; CopyMemory(fontrom + 0x80000, work + 0x0000, 16*128); } // 16dot ANK(0x80〜)を読む必要があるか if (loading & FONT_ANK16b) { loading &= ~FONT_ANK16b; CopyMemory(fontrom + 0x80800, work + 0x0800, 16*128); } // 第一水準漢字を読み込む? if (loading & FONT_KNJ1) { loading &= ~FONT_KNJ1; pc88knjcpy1(fontrom, work, 0x01, 0x30); fontdata_patchjis(); } } // クローズして セクション終わり file_close(fh); } } // 第2水準を読む必要はある? if (loading & FONT_KNJ2) { // あったら読み込んでみる file_cutname(fname); file_catname(fname, pc88knj2name, NELEMENTS(fname)); fh = file_open_rb(fname); if (fh != FILEH_INVALID) { if (file_read(fh, work, 0x20000) == 0x20000) { loading &= ~FONT_KNJ2; pc88knjcpy2(fontrom, work, 0x31, 0x56); } // クローズして セクション終わり file_close(fh); } } // ANKを読み込む必要はある? if (loading & (FONT_ANK8 | FONTLOAD_ANK)) { // あったら読み込んでみる file_cutname(fname); file_catname(fname, pc88ankname, NELEMENTS(fname)); fh = file_open_rb(fname); if (fh != FILEH_INVALID) { // 読み込んでみる if (file_read(fh, work, 0x1800) == 0x1800) { // 8dot ANKを読む必要があるか if (loading & FONT_ANK8) { loading &= ~FONT_ANK8; fontdata_ank8store(work + 0x0000, 0, 256); } // 16dot ASCIIを読む必要があるか if (loading & FONT_ANK16a) { loading &= ~FONT_ANK16a; CopyMemory(fontrom + 0x80000, work + 0x0800, 16*128); } // 16dot ANK(0x80〜)を読む必要があるか if (loading & FONT_ANK16b) { loading &= ~FONT_ANK16b; CopyMemory(fontrom + 0x80800, work + 0x1000, 16*128); } } // クローズして ANKは終わり file_close(fh); } } _MFREE(work); fr88_err1: return(loading); }
UINT8 fontx1_read(const OEMCHAR *filename, UINT8 loading) { FILEH fh; UINT8 *work; OEMCHAR fname[MAX_PATH]; work = (UINT8 *)_MALLOC(306176, "x1font"); if (work == NULL) { goto frx1_err1; } file_cpyname(fname, filename, NELEMENTS(fname)); // 8dot ANKを読み込む必要はある? if (loading & FONT_ANK8) { file_cutname(fname); file_catname(fname, x1ank1name, NELEMENTS(fname)); fh = file_open_rb(fname); if (fh != FILEH_INVALID) { if (file_read(fh, work, 2048) == 2048) { loading &= ~FONT_ANK8; fontdata_ank8store(work + 0x100, 0x20, 0x60); fontdata_ank8store(work + 0x500, 0xa0, 0x40); } file_close(fh); } } // 16dot ANKを読み込む必要はあるか? if (loading & FONTLOAD_ANK) { file_cutname(fname); file_catname(fname, x1ank2name, NELEMENTS(fname)); fh = file_open_rb(fname); if (fh != FILEH_INVALID) { if (file_read(fh, work, 4096) == 4096) { // 16dot ASCIIを読む必要があるか if (loading & FONT_ANK16a) { loading &= ~FONT_ANK16a; CopyMemory(fontrom + 0x80200, work + 0x200, 0x60*16); fontdata_patch16a(); } // 16dot ANK(0x80〜)を読む必要があるか if (loading & FONT_ANK16b) { loading &= ~FONT_ANK16b; CopyMemory(fontrom + 0x80a00, work + 0xa00, 0x40*16); fontdata_patch16b(); } } file_close(fh); } } // 漢字を読み込む必要はあるか? if (loading & (FONT_KNJ1 | FONT_KNJ2)) { file_cutname(fname); file_catname(fname, x1knjname, NELEMENTS(fname)); fh = file_open_rb(fname); if (fh != FILEH_INVALID) { if (file_read(fh, work, 306176) == 306176) { // 第一水準漢字を読み込む? if (loading & FONT_KNJ1) { loading &= ~FONT_KNJ1; x1knjcpy(fontrom, work, 0x01, 0x30); fontdata_patchjis(); } // 第二水準を読む必要はある? if (loading & FONT_KNJ2) { loading &= ~FONT_KNJ2; x1knjcpy(fontrom, work, 0x31, 0x50); } } file_close(fh); } } // メモリを解放する _MFREE(work); frx1_err1: return(loading); }
UINT8 fontv98_read(const OEMCHAR *filename, UINT8 loading) { FILEH fh; UINT8 *v98fnt; if (!(loading & FONTLOAD_ALL)) { goto frv_err1; } // ファイルをオープン fh = file_open_rb(filename); if (fh == FILEH_INVALID) { goto frv_err1; } v98fnt = (UINT8 *)_MALLOC(V98FILESIZE, "v98font"); if (v98fnt == NULL) { goto frv_err2; } // FONT.ROM の読み込み if (file_read(fh, v98fnt, V98FILESIZE) != V98FILESIZE) { goto frv_err3; } // 8x8 フォントを読む必要がある? if (loading & FONT_ANK8) { loading &= ~FONT_ANK8; fontdata_ank8store(v98fnt, 0, 256); } // 8x16 フォント(〜0x7f)を読む必要がある? if (loading & FONT_ANK16a) { loading &= ~FONT_ANK16a; CopyMemory(fontrom + 0x80000, v98fnt + 0x0800, 16*128); } // 8x16 フォント(0x80〜)を読む必要がある? if (loading & FONT_ANK16b) { loading &= ~FONT_ANK16b; CopyMemory(fontrom + 0x80800, v98fnt + 0x1000, 16*128); } // 第一水準漢字を読む必要がある? if (loading & FONT_KNJ1) { loading &= ~FONT_KNJ1; v98knjcpy(fontrom, v98fnt, 0x01, 0x30); } // 第二水準漢字を読む必要がある? if (loading & FONT_KNJ2) { loading &= ~FONT_KNJ2; v98knjcpy(fontrom, v98fnt, 0x30, 0x56); } // 拡張漢字を読む必要がある? if (loading & FONT_KNJ3) { loading &= ~FONT_KNJ3; v98knjcpy(fontrom, v98fnt, 0x58, 0x5d); } frv_err3: _MFREE(v98fnt); frv_err2: file_close(fh); // 後始末 frv_err1: return(loading); }
UINT8 fontx68k_read(const OEMCHAR *filename, UINT8 loading) { FILEH fh; UINT8 *work; // ファイルをオープン fh = file_open_rb(filename); if (fh == FILEH_INVALID) { goto fr68_err1; } // メモリアロケート work = (UINT8 *)_MALLOC(0x3b800, "x68kfont"); if (work == NULL) { goto fr68_err2; } // CGROM.DAT の読み込み if (file_read(fh, work, 0x3b800) != 0x3b800) { goto fr68_err3; } // 8dot ANKを読む必要があるか if (loading & FONT_ANK8) { loading &= ~FONT_ANK8; fontdata_ank8store(work + 0x3a100, 0x20, 0x60); fontdata_ank8store(work + 0x3a500, 0xa0, 0x40); } // 16dot ASCIIを読む必要があるか if (loading & FONT_ANK16a) { loading &= ~FONT_ANK16a; CopyMemory(fontrom + 0x80200, work + 0x3aa00, 0x60*16); fontdata_patch16a(); } // 16dot ANK(0x80~)を読む必要があるか if (loading & FONT_ANK16b) { loading &= ~FONT_ANK16b; CopyMemory(fontrom + 0x80a00, work + 0x3b200, 0x40*16); fontdata_patch16b(); } // 第一水準漢字を読み込む? if (loading & FONT_KNJ1) { loading &= ~FONT_KNJ1; x68kknjcpy(fontrom, work, 0x01, 0x30); fontdata_patchjis(); } // 第二水準を読む必要はある? if (loading & FONT_KNJ2) { loading &= ~FONT_KNJ2; x68kknjcpy(fontrom, work, 0x30, 0x60); } fr68_err3: _MFREE(work); fr68_err2: file_close(fh); fr68_err1: return(loading); }
/** * Loads font files * @param[in] filename The name of the font file * @param[in] force If this parameter is TRUE, load file always * If this parameter is FALSE, load when font is not ready * @return font type */ UINT8 font_load(const OEMCHAR *filename, BOOL force) { UINT i; const UINT8 *p; UINT8 *q; UINT j; OEMCHAR fname[MAX_PATH]; UINT8 type; UINT8 loading; if (filename) { file_cpyname(fname, filename, NELEMENTS(fname)); } else { fname[0] = '\0'; } type = fonttypecheck(fname); if ((!type) && (!force)) { return(0); } // 外字: font[??560-??57f], font[??d60-??d7f] は削らないように… for (i=0; i<0x80; i++) { q = fontrom + (i << 12); ZeroMemory(q + 0x000, 0x0560 - 0x000); ZeroMemory(q + 0x580, 0x0d60 - 0x580); ZeroMemory(q + 0xd80, 0x1000 - 0xd80); } fontdata_ank8store(fontdata_8, 0, 256); p = fontdata_8; q = fontrom + 0x80000; for (i=0; i<256; i++) { for (j=0; j<8; j++) { q[0] = p[0]; q[1] = p[0]; p += 1; q += 2; } } loading = 0xff; switch(type) { case FONTTYPE_PC98: loading = fontpc98_read(fname, loading); break; case FONTTYPE_V98: loading = fontv98_read(fname, loading); break; case FONTTYPE_PC88: loading = fontpc88_read(fname, loading); break; case FONTTYPE_FM7: loading = fontfm7_read(fname, loading); break; case FONTTYPE_X1: loading = fontx1_read(fname, loading); break; case FONTTYPE_X68: loading = fontx68k_read(fname, loading); break; } loading = fontpc98_read(file_getcd(pc98fontname), loading); loading = fontv98_read(file_getcd(v98fontname), loading); loading = fontpc88_read(file_getcd(pc88ankname), loading); if (loading & FONTLOAD_16) { file_cpyname(fname, file_getcd(fonttmpname), NELEMENTS(fname)); if (file_attr(fname) == -1) { makepc98bmp(fname); } loading = fontpc98_read(fname, loading); } return(type); }