--- np2/i286x/i286x.cpp 2003/12/01 10:45:46 1.4 +++ np2/i286x/i286x.cpp 2003/12/25 19:26:55 1.11 @@ -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,31 @@ 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 = 0xffff; + CS_BASE = 0xffff0; i286core.s.adrsmask = 0xfffff; } +void i286x_shut(void) { -LABEL void i286_resetprefetch(void) { + CPU_CS = 0xffff; + CS_BASE = 0xffff0; + CPU_IP = 0; + CPU_ADRSMASK = 0xfffff; + i286x_resetprefetch(); +} + + +LABEL void i286x_resetprefetch(void) { __asm { pushad @@ -75,7 +87,7 @@ LABEL void i286_resetprefetch(void) { } } -LABEL void __fastcall i286_interrupt(BYTE vect) { +LABEL void __fastcall i286x_interrupt(BYTE vect) { __asm { pushad @@ -165,7 +177,7 @@ LABEL void __fastcall i286x_localint(voi -LABEL void i286(void) { +LABEL void i286x(void) { __asm { pushad @@ -213,7 +225,7 @@ i286notrap: mov dword ptr (i286core.s. -LABEL void i286_step(void) { +LABEL void i286x_step(void) { __asm { pushad @@ -573,13 +585,15 @@ I286 pop_ss(void) { // 17: pop ss mov SS_BASE, eax mov SS_FIX, eax cmp i286core.s.prefix, 0 // 00/06/24 - je noprefix - call removeprefix - pop eax + jne prefix_exist noprefix: movzx ebp, bh GET_NEXTPRE1 jmp i286op[ebp*4] + +prefix_exist: pop eax // eax<-offset removeprefix + call eax + jmp noprefix } } @@ -2661,7 +2675,22 @@ I286 _popf(void) { // 9D: popf and ah, 3 cmp ah, 3 sete I286_TRAP - I286IRQCHECKTERM + + je irqcheck // fast_intr + test ah, 2 + je nextop + cmp pic.ext_irq, 0 + jne nextop + mov al, pic.pi[0].imr + mov ah, pic.pi[1].imr + not ax + test al, pic.pi[0].irr + jne irqcheck + test ah, pic.pi[1].irr + jne irqcheck +nextop: ret + +irqcheck: I286IRQCHECKTERM } } @@ -3575,7 +3604,23 @@ I286 _iret(void) { // CF: iret cmp ah, 3 sete I286_TRAP RESET_XPREFETCH - I286IRQCHECKTERM + + cmp I286_TRAP, 0 // fast_intr + jne irqcheck + test I286_FLAG, I_FLAG + je nextop + cmp pic.ext_irq, 0 + jne nextop + mov al, pic.pi[0].imr + mov ah, pic.pi[1].imr + not ax + test al, pic.pi[0].irr + jne irqcheck + test ah, pic.pi[1].irr + jne irqcheck +nextop: ret + +irqcheck: I286IRQCHECKTERM } } @@ -4158,14 +4203,28 @@ I286 _sti(void) { // FB: sti __asm { GET_NEXTPRE1 I286CLOCK(2) - or I286_FLAG, I_FLAG + cmp i286core.s.prefix, 0 // ver0.26 00/10/08 + jne prefix_exist // 前方分岐ジャンプなので。 + noprefix: + movzx ebp, bl + bts I286_FLAG, 9 + jne jmp_nextop test I286_FLAG, T_FLAG setne I286_TRAP - cmp i286core.s.prefix, 0 // ver0.26 00/10/08 - jne prefix_exist // 前方分岐ジャンプなので。 -noprefix: movzx eax, bl - call i286op[eax*4] + 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 ah, pic.pi[1].irr + jne nextopandexit +jmp_nextop: jmp i286op[ebp*4] + +nextopandexit: call i286op[ebp*4] I286IRQCHECKTERM prefix_exist: pop eax // eax<-offset removeprefix