#include "compiler.h"
#include "parts.h"
#include "dosio.h"
#include "font.h"
#include "defipl.res"
const ROMIMG __extromimage = {{'R','O','M','A','R','E','A'}};
// ---- bios
static const OEMCHAR iplx1[] = OEMTEXT("IPLROM.X1");
static const OEMCHAR iplx1t[] = OEMTEXT("IPLROM.X1T");
static void loadbios(ROMIMG *img) {
FILEH fh;
CopyMemory(img->bios1, defaultiplrom, sizeof(defaultiplrom));
CopyMemory(img->bios2, defaultiplrom, sizeof(defaultiplrom));
fh = file_open_rb_c(iplx1);
if (fh != FILEH_INVALID) {
file_read(fh, img->bios1, 0x1000);
file_close(fh);
}
fh = file_open_rb_c(iplx1t);
if (fh != FILEH_INVALID) {
file_read(fh, img->bios2, 0x8000);
file_close(fh);
}
}
// ---- font
static const OEMCHAR font0808[] = OEMTEXT("FNT0808.X1");
static const OEMCHAR font0816[] = OEMTEXT("FNT0816.X1");
static const OEMCHAR font1616[] = OEMTEXT("FNT1616.X1");
static const UINT8 jis2x1t[64] = {
0xff, 0xff, 0xff, 0xff, // 0x00
0xff, 0xff, 0xff, 0xff, // 0x08
0xff, 0xff, 0xff, 0xff, // 0x10
0xff, 0xff, 0xff, 0xff, // 0x18
0xff, 0x00, 0x02, 0x01, // 0x20
0xff, 0xff, 0xff, 0xff, // 0x28
0xff, 0x04, 0x06, 0x08, // 0x30
0xff, 0x05, 0x07, 0x09, // 0x38
0xff, 0x0a, 0x0c, 0x0e, // 0x40
0xff, 0x0b, 0x0d, 0x0f, // 0x48
0xff, 0x10, 0x12, 0x14, // 0x50
0xff, 0x11, 0x13, 0x15, // 0x58
0xff, 0x16, 0x18, 0x1a, // 0x60
0xff, 0x17, 0x19, 0x1b, // 0x68
0xff, 0x1c, 0x1e, 0x1d, // 0x70
0xff, 0xff, 0xff, 0xff}; // 0x78
static UINT32 fadrsx1t(UINT jis) {
UINT badr;
UINT32 ret;
badr = jis2x1t[((jis >> 9) & 0x3c) + ((jis >> 5) & 3)];
if (badr & 0xc0) {
return((UINT32)-1);
}
ret = (badr << 12);
ret += ((jis & 0x700) << 1);
ret += ((jis & 0x01f) << 4);
return(ret);
}
static void knjcpy(ROMIMG *img, const UINT8 *src, UINT from, UINT to) {
UINT i;
UINT h;
UINT l;
UINT sjis;
UINT j;
const UINT8 *p;
UINT32 addr;
UINT8 *q;
for (i=from; i<to; i++) {
h = i << 8;
for (l=0x21; l<0x7f; l++) {
sjis = jis2sjis(h + l);
if ((sjis >= 0x8140) && (sjis < 0x84c0)) {
p = src + 0x00000 + ((sjis - 0x8140) << 5);
}
else if ((sjis >= 0x8890) && (sjis < 0xa000)) {
p = src + 0x07000 + ((sjis - 0x8890) << 5);
}
else if ((sjis >= 0xe040) && (sjis < 0xeab0)) {
p = src + 0x35e00 + ((sjis - 0xe040) << 5);
}
else {
p = NULL;
}
if (p) {
addr = fadrsx1t(h + l);
if (addr != (UINT32)-1) {
// コピーする
q = img->knjx1t + addr;
for (j=0; j<16; j++) {
q[0] = p[0];
q[FONTX1T_LR] = p[1];
p += 2;
q += 1;
}
}
}
}
}
}
static void cnvx1t2x1(ROMIMG *img) {
UINT i;
UINT j;
UINT32 addr;
const UINT8 *src;
UINT8 *dst;
dst = img->knjx1 + 0x0100;
for (i=0x2100; i<0x2800; i+=0x100) {
for (j=0x20; j<0x80; j+=0x20) {
addr = fadrsx1t(i + j);
if (addr != (UINT32)-1) {
src = img->knjx1t + addr;
CopyMemory(dst, src, 0x200);
CopyMemory(dst + FONTX1_LR, src + FONTX1T_LR, 0x200);
}
dst += 0x200;
}
}
dst = img->knjx1 + 0x4000;
for (i=0x3000; i<0x5000; i+=0x100) {
for (j=0x20; j<0x80; j+=0x20) {
addr = fadrsx1t(i + j);
if (addr != (UINT32)-1) {
src = img->knjx1t + addr;
CopyMemory(dst, src, 0x200);
CopyMemory(dst + FONTX1_LR, src + FONTX1T_LR, 0x200);
}
dst += 0x200;
}
}
}
static void loadfont(ROMIMG *img) {
FILEH fh;
UINT8 *work;
fh = file_open_rb_c(font0808);
if (fh != FILEH_INVALID) {
file_read(fh, img->ank, 0x800);
file_close(fh);
}
fh = file_open_rb_c(font0816);
if (fh != FILEH_INVALID) {
file_read(fh, img->txt, 0x1000);
file_close(fh);
}
work = (UINT8 *)_MALLOC(306176, "loadfont");
if (work == NULL) {
goto lf_err1;
}
fh = file_open_rb_c(font1616);
if (fh == FILEH_INVALID) {
goto lf_err2;
}
file_read(fh, work, 306176);
file_close(fh);
knjcpy(img, work, 0x21, 0x50);
knjcpy(img, work, 0x50, 0x78);
CopyMemory(img->knjx1t + 0x03000, img->knjx1t + 0x02000, 0x1000);
CopyMemory(img->knjx1t + 0x23000, img->knjx1t + 0x22000, 0x1000);
CopyMemory(img->knjx1t + 0x1f000, img->knjx1t + 0x1e000, 0x1000);
CopyMemory(img->knjx1t + 0x3f000, img->knjx1t + 0x3e000, 0x1000);
cnvx1t2x1(img);
lf_err2:
_MFREE(work);
lf_err1:
return;
}
// ----
void win9xsub_initialize(void) {
ROMIMG *img;
DWORD oldprotect;
img = (ROMIMG *)&__extromimage;
VirtualProtect((void *)&__extromimage, sizeof(__extromimage),
PAGE_WRITECOPY, &oldprotect);
loadbios(img);
loadfont(img);
VirtualProtect((void *)&__extromimage, sizeof(__extromimage),
oldprotect, NULL);
}
RetroPC.NET-CVS <cvs@retropc.net>