--- np2/bios/bios.c 2004/03/08 12:45:58 1.54 +++ np2/bios/bios.c 2004/03/14 23:45:43 1.59 @@ -56,20 +56,25 @@ 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) { ZeroMemory(mem, 0xa0000); + ZeroMemory(mem + 0x100000, 0x10000); + 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); @@ -164,6 +169,11 @@ static void bios_reinitbyswitch(void) { mem[0x45c] = 0x40; #endif + // FDC + if (fdc.support144) { + mem[MEMB_F144_SUP] |= fdc.equip; + } + // IDE initialize if (pccore.hddif & PCHDD_IDE) { mem[MEMB_SYS_TYPE] |= 0x80; // IDE @@ -237,6 +247,8 @@ void bios_initialize(void) { } #if defined(BIOS_SIMULATE) +// CopyMemory(mem + BIOS_BASE, biosfd80, sizeof(biosfd80)); + // BIOS hookのアドレス変更 for (i=0; i<0x20; i++) { STOREINTELWORD(mem + 0xfd868 + i*2, biosoffset[i]); @@ -280,7 +292,7 @@ void bios_initialize(void) { // mem[MEMB_BIOS_FLAG0] = 0x03; // mem[MEMB_F2DD_MODE] = 0xff; // SETBIOSMEM16(MEMW_DISK_EQUIP, 0x0003); - mem[0x005ae] |= 0x03; // ver0.31 +// mem[0x005ae] |= 0x03; CopyMemory(mem + 0x0fde00, keytable[0], 0x300); // bios0x09_init(); @@ -324,8 +336,15 @@ static void bios_boot(void) { bios_vectorset(); bios0x09_init(); bios_reinitbyswitch(); + bios0x18_0c(); - if (sysport.c & 0x20) { + 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; @@ -337,11 +356,6 @@ static void bios_boot(void) { SETBIOSMEM16(0x004fc, 0xffff); } else { - if (!np2cfg.ITF_WORK) { - for (i=0; i<8; i++) { - mem[MEMB_MSW + (i*4)] = msw_default[i]; - } - } CPU_IP = 0x0002; } } @@ -393,6 +407,25 @@ UINT MEMCALL biosfunc(UINT32 adrs) { return(0); } +// 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")); + } + else if (pte & CPU_PTE_BASEADDR_MASK) { + TRACEOUT(("page0: physical address != 0 (pte = %.8x)", pte)); + } + } + } +#endif + switch(adrs) { case BIOS_BASE + BIOSOFST_EOIM: CPU_REMCLOCK -= 300;