--- np2/bios/bios.c 2004/03/08 15:27:07 1.56 +++ np2/bios/bios.c 2004/05/21 08:40:27 1.63 @@ -8,13 +8,14 @@ #include "biosmem.h" #include "sxsibios.h" #include "lio.h" +#include "vram.h" #include "fddfile.h" #include "fdd_mtr.h" #include "fdfmt.h" #include "keytable.res" #include "itfrom.res" #include "startup.res" -#include "biosboot.res" +#include "biosfd80.res" #define BIOS_SIMULATE @@ -23,9 +24,6 @@ static const char neccheck[] = "Copyright (C) 1983 by NEC Corporation"; - // 00/05/18 MS-DOS6.2 on PC-9801VX calling proc -static const BYTE printmain[] = {0x90, 0x5a, 0x1f, 0xcf}; - typedef struct { UINT8 port; UINT8 data; @@ -56,15 +54,15 @@ static void bios_itfprepare(void) { const IODATA *p; const IODATA *pterm; + crtc_biosreset(); + gdc_biosreset(); + p = iodata; pterm = iodata + (sizeof(iodata) / sizeof(IODATA)); while(p < pterm) { iocore_out8(p->port, p->data); p++; } - - // GDCの初期化。 - // … } static void bios_memclear(void) { @@ -74,10 +72,14 @@ static void bios_memclear(void) { if (CPU_EXTMEM) { ZeroMemory(CPU_EXTMEM, CPU_EXTMEMSIZE); } + bios0x18_16(0x20, 0xe1); ZeroMemory(mem + VRAM0_B, 0x18000); ZeroMemory(mem + VRAM0_E, 0x08000); ZeroMemory(mem + VRAM1_B, 0x18000); ZeroMemory(mem + VRAM1_E, 0x08000); +#if defined(SUPPORT_PC9821) + ZeroMemory(vramex, sizeof(vramex)); +#endif } static void bios_reinitbyswitch(void) { @@ -87,18 +89,6 @@ static void bios_reinitbyswitch(void) { BYTE biosflag; UINT8 boot; -#if defined(CPUCORE_IA32) - UINT16 org_cs; - UINT16 org_ip; - - org_cs = CPU_CS; - org_ip = CPU_IP; - CPU_SHUT(); - CPU_CS = org_cs; - CPU_IP = org_ip; - SETBIOSMEM16(0x00486, CPU_DX); -#endif - if (!(np2cfg.dipsw[2] & 0x80)) { #if defined(CPUCORE_IA32) mem[MEMB_SYS_TYPE] = 0x03; // 80386〜 @@ -185,12 +175,9 @@ static void bios_vectorset(void) { UINT i; - for (i=0; i<0x400; i+=4) { - SETBIOSMEM16(i+0, BIOSOFST_IRET); - SETBIOSMEM16(i+2, BIOS_SEG); - } for (i=0; i<0x20; i++) { - *(UINT16 *)(mem + (i*4)) = *(UINT16 *)(mem + 0xfd868 + (i*2)); + *(UINT16 *)(mem + (i*4)) = *(UINT16 *)(mem + BIOS_BASE + BIOS_TABLE + (i*2)); + SETBIOSMEM16((i * 4) + 2, BIOS_SEG); } SETBIOSMEM32(0x1e*4, 0xe8000000); } @@ -206,64 +193,55 @@ static void bios_screeninit(void) { } -// CDSで見てる為、変更…(涙 -static const UINT16 biosoffset[0x20] = { - BIOSOFST_IRET, BIOSOFST_IRET, BIOSOFST_02, BIOSOFST_IRET, - BIOSOFST_IRET, BIOSOFST_IRET, BIOSOFST_IRET, BIOSOFST_IRET, - - BIOSOFST_08, BIOSOFST_09, BIOSOFST_EOIM, BIOSOFST_EOIM, - BIOSOFST_0c, BIOSOFST_EOIM, BIOSOFST_EOIM, BIOSOFST_EOIM, - - BIOSOFST_EOIS, BIOSOFST_EOIS, BIOSOFST_12, BIOSOFST_13, - BIOSOFST_EOIS, BIOSOFST_EOIS, BIOSOFST_EOIS, BIOSOFST_EOIS, - - BIOSOFST_18, BIOSOFST_19, BIOSOFST_1a, BIOSOFST_1b, - BIOSOFST_1c, BIOSOFST_IRET, BIOSOFST_1e, BIOSOFST_1f}; - - void bios_initialize(void) { char path[MAX_PATH]; FILEH fh; UINT i; + UINT32 tmp; UINT pos; biosrom = FALSE; - - // まぁDISK BASIC動くようになるからいいんじゃないですか? - // BASIC BIOSは 8086コードのように見えるけど… getbiospath(path, str_biosrom, sizeof(path)); fh = file_open_rb(path); if (fh != FILEH_INVALID) { - if (file_read(fh, mem + 0x0e8000, 0x18000) == 0x18000) { - TRACEOUT(("load bios.rom")); - biosrom = TRUE; - } + biosrom = (file_read(fh, mem + 0x0e8000, 0x18000) == 0x18000); file_close(fh); } - if (!biosrom) { + if (biosrom) { + TRACEOUT(("load bios.rom")); + // PnP BIOSを潰す + for (i=0; i<0x10000; i+=0x10) { + tmp = LOADINTELDWORD(mem + 0xf0000 + i); + if (tmp == 0x506e5024) { + TRACEOUT(("found PnP BIOS at %.5x", 0xf0000 + i)); + STOREINTELDWORD(mem + 0xf0000 + i, 0x32504e24); + } + } + } + else { CopyMemory(mem + 0x0e8000, nosyscode, sizeof(nosyscode)); } -#if defined(BIOS_SIMULATE) - // BIOS hookのアドレス変更 - for (i=0; i<0x20; i++) { - STOREINTELWORD(mem + 0xfd868 + i*2, biosoffset[i]); - } - SETBIOSMEM16(BIOS_BASE + BIOSOFST_IRET, 0x50cf); - SETBIOSMEM16(BIOS_BASE + BIOSOFST_WAIT, 0xcf90); - for (i=(BIOS_BASE+BIOSOFST_EOIM); i<=(BIOS_BASE+BIOSOFST_1f); i+=2) { - SETBIOSMEM16(i, 0xcf90); +#if defined(SUPPORT_PC9821) + getbiospath(path, "bios9821.rom", sizeof(path)); + fh = file_open_rb(path); + if (fh != FILEH_INVALID) { + if (file_read(fh, mem + 0x0d8000, 0x2000) == 0x2000) { + // IDE BIOSを潰す + TRACEOUT(("load bios9821.rom")); + STOREINTELWORD(mem + 0x0d8009, 0); + } + file_close(fh); } - CopyMemory(mem + BIOS_BASE + BIOSOFST_PRT, printmain, sizeof(printmain)); +#endif -// bios_vectorset(); +#if defined(BIOS_SIMULATE) + CopyMemory(mem + BIOS_BASE, biosfd80, sizeof(biosfd80)); if (!biosrom) { lio_initialize(); } - SETBIOSMEM16(0xfd800, 0xcb90); - SETBIOSMEM16(0xfd802, 0xcb90); for (i=0; i<8; i+=2) { STOREINTELWORD(mem + 0xfd800 + 0x1aaf + i, 0x1ab7); STOREINTELWORD(mem + 0xfd800 + 0x1ad7 + i, 0x1adf); @@ -284,15 +262,7 @@ void bios_initialize(void) { CopyMemory(mem + 0xf538e, itfrom + pos, 0x27); } -// bios_reinitbyswitch(); -// mem[MEMB_CRT_STS_FLAG] = 0x84; // -> bios_screeninit() -// mem[MEMB_BIOS_FLAG0] = 0x03; -// mem[MEMB_F2DD_MODE] = 0xff; -// SETBIOSMEM16(MEMW_DISK_EQUIP, 0x0003); -// mem[0x005ae] |= 0x03; - - CopyMemory(mem + 0x0fde00, keytable[0], 0x300); -// bios0x09_init(); + CopyMemory(mem + 0x0fd800 + 0x0e00, keytable[0], 0x300); CopyMemory(mem + ITF_ADRS, itfrom, sizeof(itfrom)); mem[ITF_ADRS + 0x7ff0] = 0xea; @@ -303,8 +273,6 @@ void bios_initialize(void) { else if ((pccore.model & PCMODELMASK) == PCMODEL_VM) { mem[ITF_ADRS + 0x7ff1] = 0x08; } - - CopyMemory(mem + 0xfd800 + 0x2400, biosboot, sizeof(biosboot)); #else fh = file_open_c("itf.rom"); if (fh != FILEH_INVALID) { @@ -318,82 +286,36 @@ void bios_initialize(void) { CopyMemory(mem + 0x1e8000, mem + 0x0e8000, 0x10000); } -static void bios_boot(void) { + +static void bios_itfcall(void) { int i; - if (!(sysport.c & 0x80)) { - CPU_SP = GETBIOSMEM16(0x00404); - CPU_SS = GETBIOSMEM16(0x00406); -// TRACEOUT(("CPU Reset... SS:SP = %.4x:%.4x", CPU_SS, CPU_SP)); - } - else { - bios_itfprepare(); - bios_memclear(); - bios_vectorset(); - bios0x09_init(); - bios_reinitbyswitch(); - - if (!np2cfg.ITF_WORK) { - for (i=0; i<8; i++) { - mem[MEMB_MSW + (i*4)] = msw_default[i]; - } - CPU_IP = 0x0002; - } - else if (sysport.c & 0x20) { - CPU_CS = 0x0000; - CPU_IP = 0x04f8; - CPU_DS = 0x0000; - CPU_DX = 0x43d; - CPU_AL = 0x10; - mem[0x004f8] = 0xee; // out dx, al - mem[0x004f9] = 0xea; // call far - SETBIOSMEM16(0x004fa, 0x0000); - SETBIOSMEM16(0x004fc, 0xffff); + bios_itfprepare(); + bios_memclear(); + bios_vectorset(); + bios0x09_init(); + bios_reinitbyswitch(); + bios0x18_0c(); + + if (!np2cfg.ITF_WORK) { + for (i=0; i<8; i++) { + mem[MEMB_MSW + (i*4)] = msw_default[i]; } - else { - CPU_IP = 0x0002; - } - } -} - -// テスト(こんなんじゃだめぽ -static void bios0x1f(void) { - - BYTE work[256]; - UINT32 src; - UINT32 dst; - UINT leng; - UINT l; - - if (CPU_AH == 0x90) { - MEML_READSTR(CPU_ES, CPU_BX + 0x10, work, 0x10); - src = work[2] + (work[3] << 8) + (work[4] << 16) + CPU_SI; - dst = work[10] + (work[11] << 8) + (work[12] << 16) + CPU_DI; - leng = LOW16(CPU_CX - 1) + 1; - TRACEOUT(("protect bios: memmove")); - TRACEOUT(("%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x", - work[0], work[1], work[2], work[3], - work[4], work[5], work[6], work[7])); - TRACEOUT(("%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x", - work[8], work[9], work[10], work[11], - work[12], work[13], work[14], work[15])); - TRACEOUT(("SI=%.4x DI=%.4x CX=%.4x", CPU_SI, CPU_DI, CPU_CX)); - TRACEOUT(("src:%08x dst:%08x leng:%08x", src, dst, leng)); - do { - l = min(leng, 256); - MEML_READ(src, work, l); - MEML_WRITE(dst, work, l); - src += l; - dst += l; - leng -= l; - } while(leng); + CPU_FLAGL |= C_FLAG; } else { - TRACEOUT(("unsupport protect bios AH=%.2x", CPU_AH)); + CPU_DX = 0x43d; + CPU_AL = 0x10; + mem[0x004f8] = 0xee; // out dx, al + mem[0x004f9] = 0xea; // call far + SETBIOSMEM16(0x004fa, 0x0000); + SETBIOSMEM16(0x004fc, 0xffff); + CPU_FLAGL &= ~C_FLAG; } } + UINT MEMCALL biosfunc(UINT32 adrs) { UINT16 bootseg; @@ -403,31 +325,47 @@ UINT MEMCALL biosfunc(UINT32 adrs) { return(0); } - switch(adrs) { - case BIOS_BASE + BIOSOFST_EOIM: - CPU_REMCLOCK -= 300; - iocore_out8(0x00, 0x20); - return(0); - - case BIOS_BASE + BIOSOFST_EOIS: - iocore_out8(0x08, 0x20); - if (!pic.pi[1].isr) { - iocore_out8(0x00, 0x20); +// TRACEOUT(("biosfunc(%x)", adrs)); +#if defined(CPUCORE_IA32) && defined(TRACE) + if (CPU_STAT_PAGING) { + UINT32 pde = i286_memoryread_d(CPU_STAT_PDE_BASE); + if (!(pde & CPU_PDE_PRESENT)) { + TRACEOUT(("page0: PTE not present")); + } + else { + UINT32 pte = i286_memoryread_d(pde & CPU_PDE_BASEADDR_MASK); + if (!(pte & CPU_PTE_PRESENT)) { + TRACEOUT(("page0: not present")); } - return(0); + else if (pte & CPU_PTE_BASEADDR_MASK) { + TRACEOUT(("page0: physical address != 0 (pte = %.8x)", pte)); + } + } + } +#endif - case BIOS_BASE + BIOSOFST_02: - CPU_REMCLOCK -= 300; - bios0x02(); + switch(adrs) { + case BIOS_BASE + BIOSOFST_ITF: // リセット + bios_itfcall(); return(1); - case BIOS_BASE + BIOSOFST_08: - CPU_REMCLOCK -= 300; - bios0x08(); + case BIOS_BASE + BIOSOFST_INIT: // ブート +#if 1 // for RanceII + bios_memclear(); +#endif + bios_vectorset(); + bios_reinitbyswitch(); + bios_vectorset(); + bios_screeninit(); + if (((pccore.model & PCMODELMASK) >= PCMODEL_VX) && + (pccore.sound & 0x7e)) { + iocore_out8(0x188, 0x27); + iocore_out8(0x18a, 0x3f); + } return(1); case BIOS_BASE + BIOSOFST_09: - CPU_REMCLOCK -= 300; + CPU_REMCLOCK -= 500; bios0x09(); return(1); @@ -456,9 +394,14 @@ UINT MEMCALL biosfunc(UINT32 adrs) { bios0x19(); return(1); - case BIOS_BASE + BIOSOFST_1a: + case BIOS_BASE + BIOSOFST_CMT: + CPU_REMCLOCK -= 200; + bios0x1a_cmt(); + return(1); + + case BIOS_BASE + BIOSOFST_PRT: CPU_REMCLOCK -= 200; - bios0x1a(); + bios0x1a_prt(); return(1); case BIOS_BASE + BIOSOFST_1b: @@ -499,38 +442,6 @@ UINT MEMCALL biosfunc(UINT32 adrs) { } return(1); - case BIOS_BASE + BIOSOFST_PRT: - bios0x1a_main(); - return(0); - - case 0xfd800: // リセット - bios_boot(); - return(1); - - case 0xfd802: // ブート - bios_reinitbyswitch(); - bios_vectorset(); - bios_screeninit(); - if (((pccore.model & PCMODELMASK) >= PCMODEL_VX) && - (pccore.sound & 0x7e)) { - iocore_out8(0x188, 0x27); - iocore_out8(0x18a, 0x3f); - } - -#if 1 // ver0.73 - CPU_CS = 0xfd80; // SASI/SCSIリセット - CPU_IP = 0x2400; -#else - bootseg = bootstrapload(); - CPU_STI; - CPU_CS = (bootseg != 0)?bootseg:0xe800; - CPU_DS = 0x0000; - CPU_SS = 0x0030; - CPU_SP = 0x00e6; - CPU_IP = 0x0000; -#endif - return(1); - case 0xfffe8: // ブートストラップロード CPU_REMCLOCK -= 2000; bootseg = bootstrapload(); @@ -562,12 +473,6 @@ UINT MEMCALL biosfunc(UINT32 adrs) { } return(0); } - - if (biosrom) { - return(0); - } - CPU_IP--; - CPU_REMCLOCK = -1; - return(1); + return(0); }