|
|
| version 1.5, 2003/12/08 00:55:31 | version 1.9, 2004/01/05 05:04:53 |
|---|---|
| Line 3 | Line 3 |
| #include "i286x.h" | #include "i286x.h" |
| #include "i286xadr.h" | #include "i286xadr.h" |
| #include "i286xcts.h" | #include "i286xcts.h" |
| #include "memory.h" | |
| #include "i286x.mcr" | #include "i286x.mcr" |
| #include "i286xea.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) { | I286 _sgdt(void) { |
| __asm { | __asm { |
| cmp al, 0c0h | cmp al, 0c0h |
| jnc register_eareg16 | jnc register_eareg16 |
| I286CLOCK(11) | I286CLOCK(11) |
| call p_get_ea[eax*4] | call p_ea_dst[eax*4] |
| lea ecx, [edi + ebp] | mov dx, word ptr I286_GDTR |
| mov dx, word ptr i286core.s.GDTR | |
| call i286_memorywrite_w | call i286_memorywrite_w |
| add bp, 2 | add ecx, 2 |
| lea ecx, [edi + ebp] | mov dx, word ptr (I286_GDTR + 2) |
| mov dx, word ptr (i286core.s.GDTR+2) | |
| call i286_memorywrite_w | call i286_memorywrite_w |
| add bp, 2 | add ecx, 2 |
| lea ecx, [edi + ebp] | mov dl, byte ptr (I286_GDTR + 4) |
| mov dl, byte ptr (i286core.s.GDTR+4) // ver0.29 | |
| mov dh, -1 | mov dh, -1 |
| jmp i286_memorywrite_w | jmp i286_memorywrite_w |
| align 4 | align 4 |
| Line 33 I286 _sgdt(void) { | Line 163 I286 _sgdt(void) { |
| } | } |
| } | } |
| I286 _sidt(void) { | I286 _sidt(void) { |
| __asm { | __asm { |
| cmp al, 0c0h | cmp al, 0c0h |
| jnc register_eareg16 | jnc register_eareg16 |
| I286CLOCK(12) | I286CLOCK(12) |
| call p_get_ea[eax*4] | call p_ea_dst[eax*4] |
| lea ecx, [edi + ebp] | mov dx, word ptr I286_IDTR |
| mov dx, word ptr i286core.s.IDTR | |
| call i286_memorywrite_w | call i286_memorywrite_w |
| add bp, 2 | add ecx, 2 |
| lea ecx, [edi + ebp] | mov dx, word ptr (I286_IDTR + 2) |
| mov dx, word ptr (i286core.s.IDTR+2) | |
| call i286_memorywrite_w | call i286_memorywrite_w |
| add bp, 2 | add ecx, 2 |
| lea ecx, [edi + ebp] | lea ecx, [edi + ebp] |
| mov dl, byte ptr (i286core.s.IDTR+4) // ver0.29 | mov dl, byte ptr (I286_IDTR + 4) |
| mov dh, -1 | mov dh, -1 |
| jmp i286_memorywrite_w | jmp i286_memorywrite_w |
| align 4 | align 4 |
| Line 59 I286 _sidt(void) { | Line 186 I286 _sidt(void) { |
| } | } |
| } | } |
| I286 _lgdt(void) { | I286 _lgdt(void) { |
| __asm { | __asm { |
| cmp al, 0c0h | cmp al, 0c0h |
| jnc register_eareg16 | jnc register_eareg16 |
| I286CLOCK(11) | I286CLOCK(11) |
| call p_get_ea[eax*4] | call p_ea_dst[eax*4] |
| lea ecx, [edi + ebp] | |
| call i286_memoryread_w | call i286_memoryread_w |
| mov word ptr i286core.s.GDTR, ax | mov word ptr I286_GDTR, ax |
| add bp, 2 | add ecx, 2 |
| lea ecx, [edi + ebp] | |
| call i286_memoryread_w | |
| mov word ptr (i286core.s.GDTR+2), ax | |
| add bp, 2 | |
| lea ecx, [edi + ebp] | |
| call i286_memoryread_w | call i286_memoryread_w |
| mov word ptr (i286core.s.GDTR+4), ax | mov word ptr (I286_GDTR + 2), ax |
| add ecx, 2 | |
| call i286_memoryread | |
| mov byte ptr (I286_GDTR + 4), al | |
| ret | ret |
| align 4 | align 4 |
| register_eareg16: | register_eareg16: |
| Line 85 I286 _lgdt(void) { | Line 208 I286 _lgdt(void) { |
| } | } |
| } | } |
| I286 _lidt(void) { | I286 _lidt(void) { |
| __asm { | __asm { |
| cmp al, 0c0h | cmp al, 0c0h |
| jnc register_eareg16 | jnc register_eareg16 |
| I286CLOCK(12) | I286CLOCK(12) |
| call p_get_ea[eax*4] | call p_ea_dst[eax*4] |
| lea ecx, [edi + ebp] | |
| call i286_memoryread_w | call i286_memoryread_w |
| mov word ptr i286core.s.IDTR, ax | mov word ptr I286_IDTR, ax |
| add bp, 2 | add ecx, 2 |
| lea ecx, [edi + ebp] | |
| call i286_memoryread_w | call i286_memoryread_w |
| mov word ptr (i286core.s.IDTR+2), ax | mov word ptr (I286_IDTR + 2), ax |
| add bp, 2 | add ecx, 2 |
| lea ecx, [edi + ebp] | call i286_memoryread |
| call i286_memoryread_w | mov byte ptr (I286_IDTR + 4), al |
| mov word ptr (i286core.s.IDTR+4), ax | |
| ret | ret |
| align 4 | align 4 |
| register_eareg16: | register_eareg16: |
| Line 111 I286 _lidt(void) { | Line 230 I286 _lidt(void) { |
| } | } |
| } | } |
| I286 _smsw(void) { | I286 _smsw(void) { |
| __asm { | __asm { |
| PREPART_EA16(3) | PREPART_EA16(3) |
| mov dx, i286core.s.MSW | mov dx, I286_MSW |
| mov word ptr I286_REG[eax*2], dx | mov word ptr I286_REG[eax*2], dx |
| GET_NEXTPRE2 | GET_NEXTPRE2 |
| ret | ret |
| MEMORY_EA16(6) | MEMORY_EA16(6) |
| mov ax, i286core.s.MSW | mov ax, I286_MSW |
| mov word ptr I286_MEM[ecx], ax | mov word ptr I286_MEM[ecx], ax |
| ret | ret |
| extmem_eareg16: | extmem_eareg16: |
| mov dx, i286core.s.MSW | mov dx, I286_MSW |
| jmp i286_memorywrite_w | jmp i286_memorywrite_w |
| } | } |
| } | } |
| I286 _lmsw(void) { | I286 _lmsw(void) { |
| __asm { | __asm { |
| and I286_MSW, MSW_PE | |
| PREPART_EA16(2) | PREPART_EA16(2) |
| mov ax, word ptr I286_REG[eax*2] | mov ax, word ptr I286_REG[eax*2] |
| and ax, 0ch | or I286_MSW, ax |
| mov i286core.s.MSW, ax | |
| GET_NEXTPRE2 | GET_NEXTPRE2 |
| ret | ret |
| MEMORY_EA16(3) | MEMORY_EA16(3) |
| mov ax, word ptr I286_MEM[ecx] | mov ax, word ptr I286_MEM[ecx] |
| and ax, 0ch | or I286_MSW, ax |
| mov i286core.s.MSW, ax | |
| ret | ret |
| EXTMEM_EA16 | EXTMEM_EA16 |
| and ax, 0ch | or I286_MSW, ax |
| mov i286core.s.MSW, ax | |
| ret | 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) { | I286EXT _xcts(void) { |
| Line 166 I286EXT _xcts(void) { | Line 280 I286EXT _xcts(void) { |
| mov edi, esi | mov edi, esi |
| GET_NEXTPRE1 | GET_NEXTPRE1 |
| test bl, bl | test bl, bl |
| je realmodeint6rm | je short i286_cts0 |
| dec bl | dec bl |
| je i286_cts1 | je short i286_cts1 |
| sub bl, 2 | cmp bl, (5 - 1) |
| jnc realmodeint6 | je short loadall286 |
| jmp expint6 | |
| realmodeint6rm: movzx eax, bh | |
| cmp al, 0c0h | |
| jnc realmodeint6 | |
| call p_get_ea[eax*4] | |
| align 4 | align 4 |
| realmodeint6: cmp bl, (5 - 3) | i286_cts0: test I286_MSW, MSW_PE |
| je loadall286 | je expint6 |
| mov si, di // ver0.27 このタイプ・・・ | movzx eax, bh |
| I286CLOCK(20) // 全部修正しなきゃ(汗 | mov edi, eax |
| INT_NUM(6) // i286とi386で挙動が違うから | shr edi, 3-2 |
| // いやらしいね… | and edi, 7*4 |
| jmp cts0x_table[edi] | |
| align 4 | align 4 |
| i286_cts1: movzx eax, bh | i286_cts1: movzx eax, bh |
| mov edi, eax | mov edi, eax |
| shr edi, 3-2 | shr edi, 3-2 |
| and edi, 7*4 | and edi, 7*4 |
| jmp cts1_xtable[edi] | jmp cts1x_table[edi] |
| align 4 | align 4 |
| loadall286: I286CLOCK(195) | loadall286: I286CLOCK(195) |
| mov ax, word ptr mem[0x0804] // MSW | mov ax, word ptr mem[0x0804] // MSW |
| mov i286core.s.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 ax, word ptr mem[0x0818] // flag |
| mov I286_FLAG, ax | mov I286_FLAG, ax |
| and ah, 3 | and ah, 3 |
| cmp ah, 3 | cmp ah, 3 |
| sete I286_TRAP | sete I286_TRAP |
| mov si, word ptr mem[0x081a] // ip | 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 ax, word ptr mem[0x081e] // ds |
| mov I286_DS, ax | mov I286_DS, ax |
| mov ax, word ptr mem[0x0820] // ss | mov ax, word ptr mem[0x0820] // ss |
| Line 240 loadall286: I286CLOCK(195) | Line 356 loadall286: I286CLOCK(195) |
| mov DS_BASE, eax | mov DS_BASE, eax |
| mov DS_FIX, 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 | RESET_XPREFETCH |
| I286IRQCHECKTERM | I286IRQCHECKTERM |
| } | |
| align 4 | |
| expint6: mov si, di // ver0.27 このタイプ・・・ | |
| I286CLOCK(20) // 全部修正しなきゃ(汗 | |
| INT_NUM(6) // i286とi386で挙動が違うから | |
| } // いやらしいね… | |
| } | } |