--- np2/i286x/i286x.cpp 2003/12/01 18:25:03 1.5 +++ np2/i286x/i286x.cpp 2003/12/25 20:30:22 1.13 @@ -1,11 +1,10 @@ #include "compiler.h" -#include "i286.h" +#include "cpucore.h" #include "i286x.h" #include "i286xadr.h" #include "i286xs.h" #include "i286xrep.h" #include "i286xcts.h" -#include "memory.h" #include "pccore.h" #include "iocore.h" #include "i286x.mcr" @@ -52,18 +51,44 @@ const BYTE iflags[256] = { // Z_FLAG 0x80, 0x84, 0x84, 0x80, 0x84, 0x80, 0x80, 0x84}; -void i286_reset(void) { +void i286x_initialize(void) { + + i286xadr_init(); + v30xinit(); +} + +void i286x_reset(void) { - i286xadr_init(); // 毎回通すのはどうか… - v30init(); // 毎回通すのはどうか… ZeroMemory(&i286core.s, sizeof(i286core.s)); - I286_CS = 0x1fc0; - CS_BASE = 0x1fc00; + I286_CS = 0xf000; + CS_BASE = 0xf0000; + I286_IP = 0xfff0; i286core.s.adrsmask = 0xfffff; } +void i286x_shut(void) { -LABEL void i286_resetprefetch(void) { + I286_MSW = 0; + + I286_ES = 0; + I286_CS = 0xf000; + I286_SS = 0; + I286_DS = 0; + + ES_BASE = 0; + CS_BASE = 0xf0000; + SS_BASE = 0; + DS_BASE = 0; + SS_FIX = 0; + DS_FIX = 0; + + I286_IP = 0xfff0; + I286_ADRSMASK = 0xfffff; + i286x_resetprefetch(); +} + + +LABEL void i286x_resetprefetch(void) { __asm { pushad @@ -75,7 +100,7 @@ LABEL void i286_resetprefetch(void) { } } -LABEL void __fastcall i286_interrupt(BYTE vect) { +LABEL void __fastcall i286x_interrupt(BYTE vect) { __asm { pushad @@ -165,7 +190,7 @@ LABEL void __fastcall i286x_localint(voi -LABEL void i286(void) { +LABEL void i286x(void) { __asm { pushad @@ -213,7 +238,7 @@ i286notrap: mov dword ptr (i286core.s. -LABEL void i286_step(void) { +LABEL void i286x_step(void) { __asm { pushad @@ -2664,7 +2689,8 @@ I286 _popf(void) { // 9D: popf cmp ah, 3 sete I286_TRAP - test ah, 2 // fast_intr + je irqcheck // fast_intr + test ah, 2 je nextop cmp pic.ext_irq, 0 jne nextop @@ -2673,7 +2699,7 @@ I286 _popf(void) { // 9D: popf not ax test al, pic.pi[0].irr jne irqcheck - test al, pic.pi[1].irr + test ah, pic.pi[1].irr jne irqcheck nextop: ret @@ -3592,7 +3618,9 @@ I286 _iret(void) { // CF: iret sete I286_TRAP RESET_XPREFETCH - test I286_FLAG, I_FLAG // fast_intr + cmp I286_TRAP, 0 // fast_intr + jne irqcheck + test I286_FLAG, I_FLAG je nextop cmp pic.ext_irq, 0 jne nextop @@ -3601,7 +3629,7 @@ I286 _iret(void) { // CF: iret not ax test al, pic.pi[0].irr jne irqcheck - test al, pic.pi[1].irr + test ah, pic.pi[1].irr jne irqcheck nextop: ret @@ -4197,14 +4225,15 @@ I286 _sti(void) { // FB: sti test I286_FLAG, T_FLAG setne I286_TRAP - cmp pic.ext_irq, 0 // fast_intr + jne nextopandexit // fast_intr + cmp pic.ext_irq, 0 jne jmp_nextop mov al, pic.pi[0].imr mov ah, pic.pi[1].imr not ax test al, pic.pi[0].irr jne nextopandexit - test al, pic.pi[1].irr + test ah, pic.pi[1].irr jne nextopandexit jmp_nextop: jmp i286op[ebp*4]