--- np2/i286x/i286xcts.cpp 2003/10/16 17:57:29 1.1.1.1 +++ np2/i286x/i286xcts.cpp 2004/01/28 23:36:13 1.10 @@ -1,31 +1,160 @@ #include "compiler.h" -#include "nevent.h" -#include "i286.h" +#include "cpucore.h" #include "i286x.h" #include "i286xadr.h" #include "i286xcts.h" -#include "memory.h" #include "i286x.mcr" #include "i286xea.mcr" +typedef void (*I286OP_0F)(void); + + +// ---- 0f 00 + +I286 _sldt(void) { + + __asm { + PREPART_EA16(2) + mov dx, I286_LDTR + mov word ptr I286_REG[eax*2], dx + GET_NEXTPRE2 + ret + MEMORY_EA16(3) + mov ax, I286_LDTR + mov word ptr I286_MEM[ecx], ax + ret + extmem_eareg16: + mov dx, I286_LDTR + jmp i286_memorywrite_w + } +} + +I286 _str(void) { + + __asm { + PREPART_EA16(3) + mov dx, I286_TR + mov word ptr I286_REG[eax*2], dx + GET_NEXTPRE2 + ret + MEMORY_EA16(6) + mov ax, I286_TR + mov word ptr I286_MEM[ecx], ax + ret + extmem_eareg16: + mov dx, I286_TR + jmp i286_memorywrite_w + } +} + +I286 _lldt(void) { + + __asm { + PREPART_EA16(17) + mov ax, word ptr I286_REG[eax*2] + call lldt_sub + GET_NEXTPRE2 + ret + MEMORY_EA16(19) + mov ax, word ptr I286_MEM[ecx] + jmp short lldt_sub + EXTMEM_EA16 + +lldt_sub: mov word ptr I286_LDTR, ax + call i286x_selector + mov ecx, eax + call i286_memoryread_w + mov I286_LDTRC.limit, ax + add ecx, 2 + call i286_memoryread_w + mov I286_LDTRC.base, ax + add ecx, 2 + call i286_memoryread + mov I286_LDTRC.base24, al + ret + } +} + +I286 _ltr(void) { + + __asm { + PREPART_EA16(17) + mov ax, word ptr I286_REG[eax*2] + call ltr_sub + GET_NEXTPRE2 + ret + MEMORY_EA16(19) + mov ax, word ptr I286_MEM[ecx] + jmp short ltr_sub + EXTMEM_EA16 + +ltr_sub: mov word ptr I286_TR, ax + call i286x_selector + mov ecx, eax + call i286_memoryread_w + mov I286_TRC.limit, ax + add ecx, 2 + call i286_memoryread_w + mov I286_TRC.base, ax + add ecx, 2 + call i286_memoryread + mov I286_TRC.base24, al + ret + } +} + +I286 _verr(void) { + + __asm { + PREPART_EA16(14) + mov ax, word ptr I286_REG[eax*2] + GET_NEXTPRE2 + ret + MEMORY_EA16(16) + mov ax, word ptr I286_MEM[ecx] + ret + EXTMEM_EA16 + ret + } +} + +I286 _verw(void) { + + __asm { + PREPART_EA16(14) + mov ax, word ptr I286_REG[eax*2] + GET_NEXTPRE2 + ret + MEMORY_EA16(16) + mov ax, word ptr I286_MEM[ecx] + ret + EXTMEM_EA16 + ret + } +} + +static const I286OP_0F cts0x_table[] = { + _sldt, _str, _lldt, _ltr, + _verr, _verw, _verr, _verw}; + + +// ---- 0f 01 + I286 _sgdt(void) { __asm { cmp al, 0c0h jnc register_eareg16 I286CLOCK(11) - call p_get_ea[eax*4] - lea ecx, [edi + ebp] - mov dx, word ptr GDTR + call p_ea_dst[eax*4] + mov dx, word ptr I286_GDTR call i286_memorywrite_w - add bp, 2 - lea ecx, [edi + ebp] - mov dx, word ptr (GDTR+2) + add ecx, 2 + mov dx, word ptr (I286_GDTR + 2) call i286_memorywrite_w - add bp, 2 - lea ecx, [edi + ebp] - mov dl, byte ptr (GDTR+4) // ver0.29 + add ecx, 2 + mov dl, byte ptr (I286_GDTR + 4) mov dh, -1 jmp i286_memorywrite_w align 4 @@ -34,24 +163,20 @@ I286 _sgdt(void) { } } - I286 _sidt(void) { __asm { cmp al, 0c0h jnc register_eareg16 I286CLOCK(12) - call p_get_ea[eax*4] - lea ecx, [edi + ebp] - mov dx, word ptr IDTR + call p_ea_dst[eax*4] + mov dx, word ptr I286_IDTR call i286_memorywrite_w - add bp, 2 - lea ecx, [edi + ebp] - mov dx, word ptr (IDTR+2) + add ecx, 2 + mov dx, word ptr (I286_IDTR + 2) call i286_memorywrite_w - add bp, 2 - lea ecx, [edi + ebp] - mov dl, byte ptr (IDTR+4) // ver0.29 + add ecx, 2 + mov dl, byte ptr (I286_IDTR + 4) mov dh, -1 jmp i286_memorywrite_w align 4 @@ -60,25 +185,21 @@ I286 _sidt(void) { } } - I286 _lgdt(void) { __asm { cmp al, 0c0h jnc register_eareg16 I286CLOCK(11) - call p_get_ea[eax*4] - lea ecx, [edi + ebp] - call i286_memoryread_w - mov word ptr GDTR, ax - add bp, 2 - lea ecx, [edi + ebp] + call p_ea_dst[eax*4] call i286_memoryread_w - mov word ptr (GDTR+2), ax - add bp, 2 - lea ecx, [edi + ebp] + mov word ptr I286_GDTR, ax + add ecx, 2 call i286_memoryread_w - mov word ptr (GDTR+4), ax + mov word ptr (I286_GDTR + 2), ax + add ecx, 2 + call i286_memoryread + mov byte ptr (I286_GDTR + 4), al ret align 4 register_eareg16: @@ -86,25 +207,21 @@ I286 _lgdt(void) { } } - I286 _lidt(void) { __asm { cmp al, 0c0h jnc register_eareg16 I286CLOCK(12) - call p_get_ea[eax*4] - lea ecx, [edi + ebp] - call i286_memoryread_w - mov word ptr IDTR, ax - add bp, 2 - lea ecx, [edi + ebp] + call p_ea_dst[eax*4] call i286_memoryread_w - mov word ptr (IDTR+2), ax - add bp, 2 - lea ecx, [edi + ebp] + mov word ptr I286_IDTR, ax + add ecx, 2 call i286_memoryread_w - mov word ptr (IDTR+4), ax + mov word ptr (I286_IDTR + 2), ax + add ecx, 2 + call i286_memoryread + mov byte ptr (I286_IDTR + 4), al ret align 4 register_eareg16: @@ -112,54 +229,49 @@ I286 _lidt(void) { } } - I286 _smsw(void) { __asm { PREPART_EA16(3) - mov dx, MSW + mov dx, I286_MSW mov word ptr I286_REG[eax*2], dx GET_NEXTPRE2 ret MEMORY_EA16(6) - mov ax, MSW + mov ax, I286_MSW mov word ptr I286_MEM[ecx], ax ret extmem_eareg16: - mov dx, MSW + mov dx, I286_MSW jmp i286_memorywrite_w } } - I286 _lmsw(void) { __asm { + and I286_MSW, MSW_PE PREPART_EA16(2) mov ax, word ptr I286_REG[eax*2] - and ax, 0ch - mov MSW, ax + or I286_MSW, ax GET_NEXTPRE2 ret MEMORY_EA16(3) mov ax, word ptr I286_MEM[ecx] - and ax, 0ch - mov MSW, ax + or I286_MSW, ax ret EXTMEM_EA16 - and ax, 0ch - mov MSW, ax + or I286_MSW, ax ret } } +static const I286OP_0F cts1x_table[] = { + _sgdt, _sidt, _lgdt, _lidt, + _smsw, _smsw, _lmsw, _lmsw}; -static void (*cts1_xtable[])(void) = { - _sgdt, _sidt, - _lgdt, _lidt, - _smsw, _smsw, - _lmsw, _lmsw}; +// ---- I286EXT _xcts(void) { @@ -167,41 +279,43 @@ I286EXT _xcts(void) { mov edi, esi GET_NEXTPRE1 test bl, bl - je realmodeint6rm + je short i286_cts0 dec bl - je i286_cts1 - sub bl, 2 - jnc realmodeint6 - -realmodeint6rm: movzx eax, bh - cmp al, 0c0h - jnc realmodeint6 - call p_get_ea[eax*4] + je short i286_cts1 + cmp bl, (5 - 1) + je short loadall286 + jmp expint6 align 4 -realmodeint6: cmp bl, (5 - 3) - je loadall286 - mov si, di // ver0.27 このタイプ・・・ - I286CLOCK(20) // 全部修正しなきゃ(汗 - INT_NUM(6) // i286とi386で挙動が違うから - // いやらしいね… +i286_cts0: test I286_MSW, MSW_PE + je expint6 + movzx eax, bh + mov edi, eax + shr edi, 3-2 + and edi, 7*4 + jmp cts0x_table[edi] + align 4 i286_cts1: movzx eax, bh mov edi, eax shr edi, 3-2 and edi, 7*4 - jmp cts1_xtable[edi] + jmp cts1x_table[edi] align 4 loadall286: I286CLOCK(195) mov ax, word ptr mem[0x0804] // MSW - mov MSW, ax + mov I286_MSW, ax + mov ax, word ptr mem[0x0816] // TR + mov I286_TR, ax mov ax, word ptr mem[0x0818] // flag mov I286_FLAG, ax and ah, 3 cmp ah, 3 sete I286_TRAP mov si, word ptr mem[0x081a] // ip + mov ax, word ptr mem[0x081c] // LDTR + mov I286_LDTR, ax mov ax, word ptr mem[0x081e] // ds mov I286_DS, ax mov ax, word ptr mem[0x0820] // ss @@ -241,8 +355,33 @@ loadall286: I286CLOCK(195) mov DS_BASE, eax mov DS_FIX, eax + mov eax, dword ptr mem[0x084e] // GDTR + mov dword ptr (I286_GDTR.base), eax + mov ax, word ptr mem[0x0852] + mov I286_GDTR.limit, ax + + mov eax, dword ptr mem[0x0854] // LDTRC + mov dword ptr (I286_LDTRC.base), eax + mov ax, word ptr mem[0x0858] + mov I286_LDTRC.limit, ax + + mov eax, dword ptr mem[0x085a] // IDTR + mov dword ptr (I286_IDTR.base), eax + mov ax, word ptr mem[0x085e] + mov I286_IDTR.limit, ax + + mov eax, dword ptr mem[0x0860] // TRC + mov dword ptr (I286_TRC.base), eax + mov ax, word ptr mem[0x0864] + mov I286_TRC.limit, ax + RESET_XPREFETCH I286IRQCHECKTERM - } + + align 4 +expint6: mov si, di // ver0.27 このタイプ・・・ + I286CLOCK(20) // 全部修正しなきゃ(汗 + INT_NUM(6) // i286とi386で挙動が違うから + } // いやらしいね… }