|
|
| version 1.1.1.1, 2003/10/16 17:57:25 | version 1.22, 2004/08/03 10:11:37 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | #include "compiler.h" |
| #include "i286.h" | #include "cpucore.h" |
| #include "i286x.h" | #include "i286x.h" |
| #include "i286xadr.h" | #include "i286xadr.h" |
| #include "i286xs.h" | #include "i286xs.h" |
| #include "i286xrep.h" | #include "i286xrep.h" |
| #include "i286xcts.h" | #include "i286xcts.h" |
| #include "memory.h" | |
| #include "pccore.h" | #include "pccore.h" |
| #include "iocore.h" | #include "iocore.h" |
| #include "i286x.mcr" | #include "i286x.mcr" |
| Line 15 | Line 14 |
| #include "dmap.h" | #include "dmap.h" |
| I286REGS i286r; | I286CORE i286core; |
| I286STAT i286s; | |
| I286DTR GDTR; | |
| I286DTR IDTR; | |
| UINT16 MSW; | |
| const BYTE iflags[256] = { // Z_FLAG, S_FLAG, P_FLAG | const BYTE iflags[256] = { // Z_FLAG, S_FLAG, P_FLAG |
| 0x44, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, | 0x44, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, |
| Line 56 const BYTE iflags[256] = { // Z_FLAG | Line 51 const BYTE iflags[256] = { // Z_FLAG |
| 0x80, 0x84, 0x84, 0x80, 0x84, 0x80, 0x80, 0x84}; | 0x80, 0x84, 0x84, 0x80, 0x84, 0x80, 0x80, 0x84}; |
| void i286_reset(void) { | void i286x_initialize(void) { |
| i286xadr_init(); // 毎回通すのはどうか… | i286xadr_init(); |
| v30init(); // 毎回通すのはどうか… | v30xinit(); |
| ZeroMemory(&i286r, sizeof(i286r)); | |
| ZeroMemory(&i286s, sizeof(i286s)); | |
| I286_CS = 0x1fc0; | |
| CS_BASE = 0x1fc00; | |
| ZeroMemory(&GDTR, sizeof(GDTR)); | |
| ZeroMemory(&IDTR, sizeof(IDTR)); | |
| MSW = 0; | |
| } | } |
| void i286x_deinitialize(void) { | |
| LABEL void i286_resetprefetch(void) { | if (CPU_EXTMEM) { |
| _MFREE(CPU_EXTMEM); | |
| CPU_EXTMEM = NULL; | |
| CPU_EXTMEMSIZE = 0; | |
| } | |
| } | |
| static void i286x_initreg(void) { | |
| I286_CS = 0xf000; | |
| CS_BASE = 0xf0000; | |
| I286_IP = 0xfff0; | |
| i286core.s.adrsmask = 0xfffff; | |
| i286x_resetprefetch(); | |
| } | |
| void i286x_reset(void) { | |
| ZeroMemory(&i286core.s, sizeof(i286core.s)); | |
| i286x_initreg(); | |
| } | |
| void i286x_shut(void) { | |
| ZeroMemory(&i286core.s, offsetof(I286STAT, cpu_type)); | |
| i286x_initreg(); | |
| } | |
| void i286x_setextsize(UINT32 size) { | |
| if (CPU_EXTMEMSIZE != size) { | |
| if (CPU_EXTMEM) { | |
| _MFREE(CPU_EXTMEM); | |
| CPU_EXTMEM = NULL; | |
| } | |
| if (size) { | |
| CPU_EXTMEM = (BYTE *)_MALLOC(size + 16, "EXTMEM"); | |
| if (CPU_EXTMEM == NULL) { | |
| size = 0; | |
| } | |
| } | |
| CPU_EXTMEMSIZE = size; | |
| } | |
| i286core.e.ems[0] = mem + 0xc0000; | |
| i286core.e.ems[1] = mem + 0xc4000; | |
| i286core.e.ems[2] = mem + 0xc8000; | |
| i286core.e.ems[3] = mem + 0xcc000; | |
| } | |
| void i286x_setemm(UINT frame, UINT32 addr) { | |
| BYTE *ptr; | |
| frame &= 3; | |
| if (addr < USE_HIMEM) { | |
| ptr = mem + addr; | |
| } | |
| else if ((addr - 0x100000 + 0x4000) <= CPU_EXTMEMSIZE) { | |
| ptr = CPU_EXTMEM + (addr - 0x100000); | |
| } | |
| else { | |
| ptr = mem + 0xc0000 + (frame << 14); | |
| } | |
| i286core.e.ems[frame] = ptr; | |
| } | |
| LABEL void i286x_resetprefetch(void) { | |
| __asm { | __asm { |
| pushad | pushad |
| movzx esi, I286_IP | movzx esi, I286_IP |
| RESET_XPREFETCH | RESET_XPREFETCH |
| mov dword ptr (i286s.prefetchque), ebx | mov dword ptr (i286core.s.prefetchque), ebx |
| popad | popad |
| ret | ret |
| } | } |
| } | } |
| LABEL void __fastcall i286_interrupt(BYTE vect) { | LABEL void __fastcall i286x_interrupt(BYTE vect) { |
| __asm { | __asm { |
| pushad | pushad |
| Line 92 LABEL void __fastcall i286_interrupt(BYT | Line 148 LABEL void __fastcall i286_interrupt(BYT |
| sub bx, 2 | sub bx, 2 |
| // hlt.. | // hlt.. |
| cmp byte ptr (i286s.prefetchque), 0f4h // hlt | cmp byte ptr (i286core.s.prefetchque), 0f4h // hlt |
| jne short nonhlt | jne short nonhlt |
| inc I286_IP | inc I286_IP |
| nonhlt: mov edi, SS_BASE | nonhlt: mov edi, SS_BASE |
| Line 124 nonhlt: mov edi, SS_BASE | Line 180 nonhlt: mov edi, SS_BASE |
| shl eax, 4 // make segreg | shl eax, 4 // make segreg |
| mov CS_BASE, eax | mov CS_BASE, eax |
| RESET_XPREFETCH | RESET_XPREFETCH |
| mov dword ptr (i286s.prefetchque), ebx | mov dword ptr (i286core.s.prefetchque), ebx |
| popad | popad |
| ret | ret |
| Line 171 LABEL void __fastcall i286x_localint(voi | Line 227 LABEL void __fastcall i286x_localint(voi |
| } | } |
| // プロテクトモードのセレクタ(in ax / ret eax) | |
| LABEL void __fastcall i286x_selector(void) { | |
| __asm { | |
| mov ecx, dword ptr (I286_GDTR.base) | |
| test eax, 4 | |
| je short ixsl_1 | |
| mov ecx, dword ptr (I286_LDTRC.base) | |
| ixsl_1: and eax, not 7 | |
| and ecx, 0ffffffh | |
| lea ecx, [ecx + eax + 2] | |
| call i286_memoryread_w | |
| push eax | |
| add ecx, 2 | |
| call i286_memoryread | |
| pop ecx | |
| and eax, 0ffh | |
| movzx ecx, cx | |
| shl eax, 16 | |
| add eax, ecx | |
| ret | |
| } | |
| } | |
| LABEL void i286(void) { | LABEL void i286x(void) { |
| __asm { | __asm { |
| pushad | pushad |
| mov ebx, dword ptr (i286s.prefetchque) | mov ebx, dword ptr (i286core.s.prefetchque) |
| movzx esi, I286_IP | movzx esi, I286_IP |
| cmp I286_TRAP, 0 | cmp I286_TRAP, 0 |
| Line 186 LABEL void i286(void) { | Line 266 LABEL void i286(void) { |
| i286_mnlp: movzx eax, bl | i286_mnlp: movzx eax, bl |
| call i286op[eax*4] | call i286op[eax*4] |
| cmp nevent.remainclock, 0 | cmp I286_REMCLOCK, 0 |
| jg i286_mnlp | jg i286_mnlp |
| mov dword ptr (i286s.prefetchque), ebx | mov dword ptr (i286core.s.prefetchque), ebx |
| mov I286_IP, si | mov I286_IP, si |
| popad | popad |
| ret | ret |
| Line 197 i286_mnlp: movzx eax, bl | Line 277 i286_mnlp: movzx eax, bl |
| i286_dma_mnlp: movzx eax, bl | i286_dma_mnlp: movzx eax, bl |
| call i286op[eax*4] | call i286op[eax*4] |
| call dmap_i286 | call dmap_i286 |
| cmp nevent.remainclock, 0 | cmp I286_REMCLOCK, 0 |
| jg i286_dma_mnlp | jg i286_dma_mnlp |
| mov dword ptr (i286s.prefetchque), ebx | mov dword ptr (i286core.s.prefetchque), ebx |
| mov I286_IP, si | mov I286_IP, si |
| popad | popad |
| ret | ret |
| Line 211 i286_trapping: movzx eax, bl | Line 291 i286_trapping: movzx eax, bl |
| je i286notrap | je i286notrap |
| mov ecx, 1 | mov ecx, 1 |
| call i286x_localint | call i286x_localint |
| i286notrap: mov dword ptr (i286s.prefetchque), ebx | i286notrap: mov dword ptr (i286core.s.prefetchque), ebx |
| mov I286_IP, si | mov I286_IP, si |
| popad | popad |
| ret | ret |
| Line 220 i286notrap: mov dword ptr (i286s.prefe | Line 300 i286notrap: mov dword ptr (i286s.prefe |
| LABEL void i286_step(void) { | LABEL void i286x_step(void) { |
| __asm { | __asm { |
| pushad | pushad |
| mov ebx, dword ptr (i286s.prefetchque) | mov ebx, dword ptr (i286core.s.prefetchque) |
| movzx esi, I286_IP | movzx esi, I286_IP |
| movzx eax, bl | movzx eax, bl |
| Line 235 LABEL void i286_step(void) { | Line 315 LABEL void i286_step(void) { |
| mov ecx, 1 | mov ecx, 1 |
| call i286x_localint | call i286x_localint |
| nexts: | nexts: |
| mov dword ptr (i286s.prefetchque), ebx | mov dword ptr (i286core.s.prefetchque), ebx |
| mov I286_IP, si | mov I286_IP, si |
| call dmap_i286 | call dmap_i286 |
| Line 250 nexts: | Line 330 nexts: |
| LABEL void removeprefix(void) { | LABEL void removeprefix(void) { |
| __asm { | __asm { |
| mov i286s.prefix, 0 | mov i286core.s.prefix, 0 |
| mov eax, DS_BASE | mov eax, DS_BASE |
| mov DS_FIX, eax | mov DS_FIX, eax |
| mov eax, SS_BASE | mov eax, SS_BASE |
| Line 263 LABEL void removeprefix(void) { | Line 343 LABEL void removeprefix(void) { |
| I286 _reserved(void) { | I286 _reserved(void) { |
| __asm { | __asm { |
| inc si // 01/08/31 | // inc si // 01/08/31 |
| INT_NUM(6) | INT_NUM(6) |
| } | } |
| } | } |
| Line 367 I286 pop_es(void) { // 07: pop es | Line 447 I286 pop_es(void) { // 07: pop es |
| __asm { | __asm { |
| I286CLOCK(5) | I286CLOCK(5) |
| REGPOP(I286_ES) | REGPOP(I286_ES) |
| and eax, 00ffffh | movzx eax, ax |
| test byte ptr (I286_MSW), MSW_PE | |
| jne short pop_es_pe | |
| shl eax, 4 // make segreg | shl eax, 4 // make segreg |
| mov ES_BASE, eax | pop_es_base: mov ES_BASE, eax |
| GET_NEXTPRE1 | GET_NEXTPRE1 |
| ret | ret |
| pop_es_pe: push offset pop_es_base | |
| jmp i286x_selector | |
| } | } |
| } | } |
| Line 575 I286 pop_ss(void) { // 17: pop ss | Line 660 I286 pop_ss(void) { // 17: pop ss |
| __asm { | __asm { |
| I286CLOCK(5) | I286CLOCK(5) |
| REGPOP(I286_SS) | REGPOP(I286_SS) |
| and eax, 00ffffh | movzx eax, ax |
| test byte ptr (I286_MSW), MSW_PE | |
| jne short pop_ss_pe | |
| shl eax, 4 // make segreg | shl eax, 4 // make segreg |
| mov SS_BASE, eax | pop_ss_base: mov SS_BASE, eax |
| mov SS_FIX, eax | mov SS_FIX, eax |
| cmp i286s.prefix, 0 // 00/06/24 | cmp i286core.s.prefix, 0 // 00/06/24 |
| je noprefix | jne prefix_exist |
| call removeprefix | |
| pop eax | |
| noprefix: | noprefix: |
| movzx ebp, bh | movzx ebp, bh |
| GET_NEXTPRE1 | GET_NEXTPRE1 |
| jmp i286op[ebp*4] | jmp i286op[ebp*4] |
| pop_ss_pe: push offset pop_ss_base | |
| jmp i286x_selector | |
| prefix_exist: pop eax // eax<-offset removeprefix | |
| call eax | |
| jmp noprefix | |
| } | } |
| } | } |
| Line 697 I286 pop_ds(void) { // 1F: pop ds | Line 789 I286 pop_ds(void) { // 1F: pop ds |
| __asm { | __asm { |
| I286CLOCK(5) | I286CLOCK(5) |
| REGPOP(I286_DS) | REGPOP(I286_DS) |
| and eax, 00ffffh | movzx eax, ax |
| test byte ptr (I286_MSW), MSW_PE | |
| jne short pop_ds_pe | |
| shl eax, 4 // make segreg | shl eax, 4 // make segreg |
| mov DS_BASE, eax | pop_ds_base: mov DS_BASE, eax |
| mov DS_FIX, eax | mov DS_FIX, eax |
| GET_NEXTPRE1 | GET_NEXTPRE1 |
| ret | ret |
| pop_ds_pe: push offset pop_ds_base | |
| jmp i286x_selector | |
| } | } |
| } | } |
| Line 1598 I286 _arpl(void) { | Line 1695 I286 _arpl(void) { |
| xor eax, eax | xor eax, eax |
| cmp bh, 0c0h | cmp bh, 0c0h |
| setc al | setc al |
| add si, ax | // add si, ax |
| add eax, 10 | add eax, 10 |
| I286CLOCK(eax) | I286CLOCK(eax) |
| INT_NUM(6) | INT_NUM(6) |
| Line 1679 I286 _insb(void) { // 6C: insb | Line 1776 I286 _insb(void) { // 6C: insb |
| __asm { | __asm { |
| GET_NEXTPRE1 | GET_NEXTPRE1 |
| I286CLOCK(5) | I286CLOCK(5) |
| #if 1 | |
| movzx ecx, I286_DX | movzx ecx, I286_DX |
| call iocore_inp8 | call iocore_inp8 |
| #else | |
| mov cx, I286_DX | |
| call i286_in | |
| #endif | |
| mov dl, al | mov dl, al |
| movzx ecx, I286_ES | movzx ecx, I286_ES |
| shl ecx, 4 | shl ecx, 4 |
| Line 1726 I286 _outsb(void) { // 6E: outsb | Line 1818 I286 _outsb(void) { // 6E: outsb |
| mov dl, al | mov dl, al |
| STRING_DIR | STRING_DIR |
| add I286_SI, ax | add I286_SI, ax |
| #if 1 | |
| movzx ecx, I286_DX | movzx ecx, I286_DX |
| jmp iocore_out8 | jmp iocore_out8 |
| #else | |
| mov cx, I286_DX | |
| jmp i286_out | |
| #endif | |
| } | } |
| } | } |
| Line 2403 I286 mov_seg_ea(void) { // 8E: mov | Line 2490 I286 mov_seg_ea(void) { // 8E: mov |
| GET_NEXTPRE2 | GET_NEXTPRE2 |
| mov ax, word ptr I286_REG[edi*2] | mov ax, word ptr I286_REG[edi*2] |
| jmp segset | jmp segset |
| align 16 | align 4 |
| src_memory: | src_memory: |
| I286CLOCK(5) | I286CLOCK(5) |
| call p_ea_dst[eax*4] | call p_ea_dst[eax*4] |
| call i286_memoryread_w | call i286_memoryread_w |
| segset: | segset: |
| mov word ptr I286_SEGREG[ebp], ax | mov word ptr I286_SEGREG[ebp], ax |
| and eax, 0000ffffh | movzx eax, ax |
| test byte ptr (I286_MSW), MSW_PE | |
| jne short mov_seg_pe | |
| shl eax, 4 // make segreg | shl eax, 4 // make segreg |
| mov SEG_BASE[ebp*2], eax | mov_seg_base: mov SEG_BASE[ebp*2], eax |
| sub ebp, 2*2 | sub ebp, 2*2 |
| jc segsetr | jc short segsetr |
| mov SS_FIX[ebp*2], eax | mov SS_FIX[ebp*2], eax |
| je setss | je short setss |
| segsetr:ret | segsetr:ret |
| align 16 | setss: cmp i286core.s.prefix, 0 // 00/05/13 |
| setss: cmp i286s.prefix, 0 // 00/05/13 | |
| je noprefix | je noprefix |
| pop eax | pop eax |
| call eax // eax<-offset removeprefix | call eax // eax<-offset removeprefix |
| Line 2428 I286 mov_seg_ea(void) { // 8E: mov | Line 2516 I286 mov_seg_ea(void) { // 8E: mov |
| movzx eax, bl | movzx eax, bl |
| jmp i286op[eax*4] | jmp i286op[eax*4] |
| align 16 | mov_seg_pe: push offset mov_seg_base |
| fixcs: | jmp i286x_selector |
| INT_NUM(6) | |
| fixcs: INT_NUM(6) | |
| } | } |
| } | } |
| Line 2625 I286 call_far(void) { // 9A: call | Line 2714 I286 call_far(void) { // 9A: call |
| mov si, bx | mov si, bx |
| shr ebx, 16 | shr ebx, 16 |
| mov I286_CS, bx | mov I286_CS, bx |
| test byte ptr (I286_MSW), MSW_PE | |
| jne short call_far_pe | |
| shl ebx, 4 | shl ebx, 4 |
| mov CS_BASE, ebx | mov CS_BASE, ebx |
| RESET_XPREFETCH | call_far_base: RESET_XPREFETCH |
| ret | ret |
| call_far_pe: mov eax, ebx | |
| call i286x_selector | |
| mov CS_BASE, eax | |
| jmp short call_far_base | |
| } | } |
| } | } |
| Line 2668 I286 _popf(void) { // 9D: popf | Line 2764 I286 _popf(void) { // 9D: popf |
| and ah, 3 | and ah, 3 |
| cmp ah, 3 | cmp ah, 3 |
| sete I286_TRAP | sete I286_TRAP |
| I286IRQCHECKTERM | |
| je irqcheck // fast_intr | |
| test ah, 2 | |
| je nextop | |
| mov al, pic.pi[0 * (type _PICITEM)].imr | |
| mov ah, pic.pi[1 * (type _PICITEM)].imr | |
| not ax | |
| test al, pic.pi[0 * (type _PICITEM)].irr | |
| jne irqcheck | |
| test ah, pic.pi[1 * (type _PICITEM)].irr | |
| jne irqcheck | |
| nextop: ret | |
| irqcheck: I286IRQCHECKTERM | |
| } | } |
| } | } |
| Line 2765 I286 _movsb(void) { // A4: movsb | Line 2874 I286 _movsb(void) { // A4: movsb |
| add ecx, DS_FIX | add ecx, DS_FIX |
| call i286_memoryread | call i286_memoryread |
| mov dl, al | mov dl, al |
| movzx ecx, I286_ES | movzx ecx, I286_DI |
| shl ecx, 4 | add ecx, ES_BASE |
| movzx eax, I286_DI | |
| add ecx, eax | |
| STRING_DIR | STRING_DIR |
| add I286_SI, ax | add I286_SI, ax |
| add I286_DI, ax | add I286_DI, ax |
| Line 2785 I286 _movsw(void) { // A5: movsw | Line 2892 I286 _movsw(void) { // A5: movsw |
| add ecx, DS_FIX | add ecx, DS_FIX |
| call i286_memoryread_w | call i286_memoryread_w |
| mov dx, ax | mov dx, ax |
| movzx ecx, I286_ES | movzx ecx, I286_DI |
| shl ecx, 4 | add ecx, ES_BASE |
| movzx eax, I286_DI | |
| add ecx, eax | |
| STRING_DIRx2 | STRING_DIRx2 |
| add I286_SI, ax | add I286_SI, ax |
| add I286_DI, ax | add I286_DI, ax |
| Line 2805 I286 _cmpsb(void) { // A6: cmpsb | Line 2910 I286 _cmpsb(void) { // A6: cmpsb |
| add ecx, DS_FIX | add ecx, DS_FIX |
| call i286_memoryread | call i286_memoryread |
| mov dl, al | mov dl, al |
| movzx ecx, I286_ES | movzx ecx, I286_DI |
| shl ecx, 4 | add ecx, ES_BASE |
| movzx eax, I286_DI | |
| add ecx, eax | |
| call i286_memoryread | call i286_memoryread |
| cmp dl, al | cmp dl, al |
| FLAG_STORE_OF | FLAG_STORE_OF |
| Line 2828 I286 _cmpsw(void) { // A7: cmpsw | Line 2931 I286 _cmpsw(void) { // A7: cmpsw |
| add ecx, DS_FIX | add ecx, DS_FIX |
| call i286_memoryread_w | call i286_memoryread_w |
| mov edx, eax | mov edx, eax |
| movzx ecx, I286_ES | movzx ecx, I286_DI |
| shl ecx, 4 | add ecx, ES_BASE |
| movzx eax, I286_DI | |
| add ecx, eax | |
| call i286_memoryread_w | call i286_memoryread_w |
| cmp dx, ax | cmp dx, ax |
| FLAG_STORE_OF | FLAG_STORE_OF |
| Line 2870 I286 _stosb(void) { // AA: stosb | Line 2971 I286 _stosb(void) { // AA: stosb |
| __asm { | __asm { |
| GET_NEXTPRE1 | GET_NEXTPRE1 |
| I286CLOCK(3) | I286CLOCK(3) |
| movzx ecx, I286_ES | movzx ecx, I286_DI |
| shl ecx, 4 | add ecx, ES_BASE |
| movzx eax, I286_DI | |
| add ecx, eax | |
| STRING_DIR | STRING_DIR |
| add I286_DI, ax | add I286_DI, ax |
| mov dl, I286_AL | mov dl, I286_AL |
| Line 2886 I286 _stosw(void) { // AB: stosw | Line 2985 I286 _stosw(void) { // AB: stosw |
| __asm { | __asm { |
| GET_NEXTPRE1 | GET_NEXTPRE1 |
| I286CLOCK(3) | I286CLOCK(3) |
| movzx ecx, I286_ES | movzx ecx, I286_DI |
| shl ecx, 4 | add ecx, ES_BASE |
| movzx eax, I286_DI | |
| add ecx, eax | |
| STRING_DIRx2 | STRING_DIRx2 |
| add I286_DI, ax | add I286_DI, ax |
| mov dx, I286_AX | mov dx, I286_AX |
| Line 2932 I286 _scasb(void) { // AE: scasb | Line 3029 I286 _scasb(void) { // AE: scasb |
| __asm { | __asm { |
| GET_NEXTPRE1 | GET_NEXTPRE1 |
| I286CLOCK(7) | I286CLOCK(7) |
| movzx ecx, I286_ES | movzx ecx, I286_DI |
| shl ecx, 4 | add ecx, ES_BASE |
| movzx eax, I286_DI | |
| add ecx, eax | |
| call i286_memoryread | call i286_memoryread |
| cmp I286_AL, al | cmp I286_AL, al |
| FLAG_STORE_OF | FLAG_STORE_OF |
| Line 2950 I286 _scasw(void) { // AF: scasw | Line 3045 I286 _scasw(void) { // AF: scasw |
| __asm { | __asm { |
| GET_NEXTPRE1 | GET_NEXTPRE1 |
| I286CLOCK(7) | I286CLOCK(7) |
| movzx ecx, I286_ES | movzx ecx, I286_DI |
| shl ecx, 4 | add ecx, ES_BASE |
| movzx eax, I286_DI | |
| add ecx, eax | |
| call i286_memoryread_w | call i286_memoryread_w |
| cmp I286_AX, ax | cmp I286_AX, ax |
| FLAG_STORE_OF | FLAG_STORE_OF |
| Line 3277 I286 les_r16_ea(void) { // C4: les | Line 3370 I286 les_r16_ea(void) { // C4: les |
| lea ecx, [edi + ebp] | lea ecx, [edi + ebp] |
| call i286_memoryread_w | call i286_memoryread_w |
| mov I286_ES, ax | mov I286_ES, ax |
| and eax, 0000ffffh | movzx eax, ax |
| test byte ptr (I286_MSW), MSW_PE | |
| jne short les_pe | |
| shl eax, 4 // make segreg | shl eax, 4 // make segreg |
| mov ES_BASE, eax | les_base: mov ES_BASE, eax |
| ret | ret |
| align 16 | |
| src_register: | les_pe: push offset les_base |
| INT_NUM(6) | jmp i286x_selector |
| src_register: INT_NUM(6) | |
| } | } |
| } | } |
| Line 3306 I286 lds_r16_ea(void) { // C5: lds | Line 3403 I286 lds_r16_ea(void) { // C5: lds |
| lea ecx, [edi + ebp] | lea ecx, [edi + ebp] |
| call i286_memoryread_w | call i286_memoryread_w |
| mov I286_DS, ax | mov I286_DS, ax |
| and eax, 0000ffffh | movzx eax, ax |
| test byte ptr (I286_MSW), MSW_PE | |
| jne short lds_pe | |
| shl eax, 4 // make segreg | shl eax, 4 // make segreg |
| mov DS_BASE, eax | lds_base: mov DS_BASE, eax |
| mov DS_FIX, eax | mov DS_FIX, eax |
| ret | ret |
| align 16 | |
| src_register: | lds_pe: push offset lds_base |
| INT_NUM(6) | jmp i286x_selector |
| src_register: INT_NUM(6) | |
| } | } |
| } | } |
| Line 3465 I286 ret_far_data16(void) { // CA: | Line 3567 I286 ret_far_data16(void) { // CA: |
| lea ecx, [edi + ebp] | lea ecx, [edi + ebp] |
| call i286_memoryread_w | call i286_memoryread_w |
| mov I286_CS, ax | mov I286_CS, ax |
| and eax, 0000ffffh | movzx eax, ax |
| test byte ptr (I286_MSW), MSW_PE | |
| jne short ret_far16_pe | |
| shl eax, 4 // make segreg | shl eax, 4 // make segreg |
| mov CS_BASE, eax | ret_far16_base: mov CS_BASE, eax |
| add I286_SP, 4 | add I286_SP, 4 |
| RESET_XPREFETCH | RESET_XPREFETCH |
| ret | ret |
| ret_far16_pe: push offset ret_far16_base | |
| jmp i286x_selector | |
| } | } |
| } | } |
| Line 3488 I286 ret_far(void) { // CB: ret fa | Line 3595 I286 ret_far(void) { // CB: ret fa |
| add bx, 2 | add bx, 2 |
| call i286_memoryread_w | call i286_memoryread_w |
| mov I286_CS, ax | mov I286_CS, ax |
| and eax, 0000ffffh | movzx eax, ax |
| test byte ptr (I286_MSW), MSW_PE | |
| jne short ret_far_pe | |
| shl eax, 4 // make segreg | shl eax, 4 // make segreg |
| mov CS_BASE, eax | ret_far_base: mov CS_BASE, eax |
| mov ebp, eax | mov ebp, eax |
| mov I286_SP, bx | mov I286_SP, bx |
| RESET_XPREFETCH | RESET_XPREFETCH |
| ret | ret |
| ret_far_pe: push offset ret_far_base | |
| jmp i286x_selector | |
| } | } |
| } | } |
| Line 3542 I286 int_data8(void) { // CD: int | Line 3654 I286 int_data8(void) { // CD: int |
| I286 _into(void) { // CE: into | I286 _into(void) { // CE: into |
| __asm { | __asm { |
| I286CLOCK(4) | |
| test I286_FLAG, O_FLAG | test I286_FLAG, O_FLAG |
| jne intovf | jne intovf |
| I286CLOCK(4) | |
| GET_NEXTPRE1 | GET_NEXTPRE1 |
| ret | ret |
| align 16 | |
| intovf: | intovf: inc si // ver0.80 |
| I286CLOCK(24) | |
| INT_NUM(4) | INT_NUM(4) |
| } | } |
| } | } |
| Line 3557 I286 _into(void) { // CE: into | Line 3668 I286 _into(void) { // CE: into |
| I286 _iret(void) { // CF: iret | I286 _iret(void) { // CF: iret |
| __asm { | __asm { |
| call extirq_pop | |
| I286CLOCK(31) | I286CLOCK(31) |
| mov edi, SS_BASE | mov edi, SS_BASE |
| movzx ebx, I286_SP | movzx ebx, I286_SP |
| Line 3582 I286 _iret(void) { // CF: iret | Line 3692 I286 _iret(void) { // CF: iret |
| cmp ah, 3 | cmp ah, 3 |
| sete I286_TRAP | sete I286_TRAP |
| RESET_XPREFETCH | RESET_XPREFETCH |
| I286IRQCHECKTERM | |
| cmp I286_TRAP, 0 // fast_intr | |
| jne irqcheck | |
| test I286_FLAG, I_FLAG | |
| je nextop | |
| mov al, pic.pi[0 * (type _PICITEM)].imr | |
| mov ah, pic.pi[1 * (type _PICITEM)].imr | |
| not ax | |
| test al, pic.pi[0 * (type _PICITEM)].irr | |
| jne irqcheck | |
| test ah, pic.pi[1 * (type _PICITEM)].irr | |
| jne irqcheck | |
| nextop: ret | |
| irqcheck: I286IRQCHECKTERM | |
| } | } |
| } | } |
| Line 3751 nzflagsed: xor al, ah | Line 3875 nzflagsed: xor al, ah |
| or I286_FLAGL, al | or I286_FLAGL, al |
| GET_NEXTPRE2 | GET_NEXTPRE2 |
| ret | ret |
| align 16 | |
| div0: | div0: INT_NUM(0) |
| INT_NUM(0) | |
| } | } |
| } | } |
| Line 3897 I286 in_al_data8(void) { // E4: in | Line 4020 I286 in_al_data8(void) { // E4: in |
| I286CLOCK(5) | I286CLOCK(5) |
| lea eax, [esi + 2] | lea eax, [esi + 2] |
| add eax, CS_BASE | add eax, CS_BASE |
| mov i286s.inport, eax | mov I286_INPADRS, eax |
| movzx ecx, bh | movzx ecx, bh |
| #if 1 | |
| call iocore_inp8 | call iocore_inp8 |
| #else | |
| call i286_in | |
| #endif | |
| mov I286_AL, al | mov I286_AL, al |
| mov i286s.inport, 0 | mov I286_INPADRS, 0 |
| GET_NEXTPRE2 | GET_NEXTPRE2 |
| ret | ret |
| } | } |
| Line 3917 I286 in_ax_data8(void) { // E5: in | Line 4036 I286 in_ax_data8(void) { // E5: in |
| I286CLOCK(5) | I286CLOCK(5) |
| lea eax, [esi + 2] | lea eax, [esi + 2] |
| add eax, CS_BASE | add eax, CS_BASE |
| mov i286s.inport, eax | |
| movzx ecx, bh | movzx ecx, bh |
| call iocore_inp16 | call iocore_inp16 |
| mov I286_AX, ax | mov I286_AX, ax |
| Line 3935 I286 out_data8_al(void) { // E6: ou | Line 4053 I286 out_data8_al(void) { // E6: ou |
| GET_NEXTPRE2 | GET_NEXTPRE2 |
| pop ecx | pop ecx |
| mov dl, I286_AL | mov dl, I286_AL |
| #if 1 | |
| jmp iocore_out8 | jmp iocore_out8 |
| #else | } |
| jmp i286_out | |
| #endif | |
| } | |
| } | } |
| I286 out_data8_ax(void) { // E7: out DATA8, ax | I286 out_data8_ax(void) { // E7: out DATA8, ax |
| Line 3992 I286 jmp_far(void) { // EA: jmp fa | Line 4106 I286 jmp_far(void) { // EA: jmp fa |
| mov si, bx | mov si, bx |
| shr ebx, 16 | shr ebx, 16 |
| mov I286_CS, bx | mov I286_CS, bx |
| test byte ptr (I286_MSW), MSW_PE | |
| jne short jmp_far_pe | |
| shl ebx, 4 // make segreg | shl ebx, 4 // make segreg |
| mov CS_BASE, ebx | mov CS_BASE, ebx |
| RESET_XPREFETCH | jmp_far_base: RESET_XPREFETCH |
| ret | ret |
| jmp_far_pe: mov eax, ebx | |
| call i286x_selector | |
| mov CS_BASE, eax | |
| jmp short jmp_far_base | |
| } | } |
| } | } |
| Line 4015 I286 in_al_dx(void) { // EC: in al | Line 4136 I286 in_al_dx(void) { // EC: in al |
| __asm { | __asm { |
| I286CLOCK(5) | I286CLOCK(5) |
| #if 1 | |
| movzx ecx, I286_DX | movzx ecx, I286_DX |
| call iocore_inp8 | call iocore_inp8 |
| #else | |
| mov cx, I286_DX | |
| call i286_in | |
| #endif | |
| mov I286_AL, al | mov I286_AL, al |
| GET_NEXTPRE1 | GET_NEXTPRE1 |
| ret | ret |
| Line 4045 I286 out_dx_al(void) { // EE: out | Line 4161 I286 out_dx_al(void) { // EE: out |
| __asm { | __asm { |
| GET_NEXTPRE1 | GET_NEXTPRE1 |
| I286CLOCK(3) | I286CLOCK(3) |
| #if 1 | |
| movzx ecx, I286_DX | movzx ecx, I286_DX |
| mov dl, I286_AL | mov dl, I286_AL |
| jmp iocore_out8 | jmp iocore_out8 |
| #else | |
| mov cx, I286_DX | |
| mov dl, I286_AL | |
| jmp i286_out | |
| #endif | |
| } | } |
| } | } |
| Line 4093 I286 _repe(void) { // F3: repe | Line 4203 I286 _repe(void) { // F3: repe |
| I286 _hlt(void) { // F4: hlt | I286 _hlt(void) { // F4: hlt |
| __asm { | __asm { |
| mov nevent.remainclock, -1 | mov I286_REMCLOCK, -1 |
| ret | ret |
| } | } |
| } | } |
| Line 4166 I286 _sti(void) { // FB: sti | Line 4276 I286 _sti(void) { // FB: sti |
| __asm { | __asm { |
| GET_NEXTPRE1 | GET_NEXTPRE1 |
| I286CLOCK(2) | 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 | test I286_FLAG, T_FLAG |
| setne I286_TRAP | setne I286_TRAP |
| cmp i286s.prefix, 0 // ver0.26 00/10/08 | jne nextopandexit // fast_intr |
| jne prefix_exist // 前方分岐ジャンプなので。 | mov al, pic.pi[0 * (type _PICITEM)].imr |
| noprefix: movzx eax, bl | mov ah, pic.pi[1 * (type _PICITEM)].imr |
| call i286op[eax*4] | not ax |
| test al, pic.pi[0 * (type _PICITEM)].irr | |
| jne nextopandexit | |
| test ah, pic.pi[1 * (type _PICITEM)].irr | |
| jne nextopandexit | |
| jmp_nextop: jmp i286op[ebp*4] | |
| nextopandexit: call i286op[ebp*4] | |
| I286IRQCHECKTERM | I286IRQCHECKTERM |
| prefix_exist: pop eax // eax<-offset removeprefix | prefix_exist: pop eax // eax<-offset removeprefix |
| Line 4227 I286 _ope0xff(void) { // FF: | Line 4349 I286 _ope0xff(void) { // FF: |
| // ------------------------------------------------------------------------- | // ------------------------------------------------------------------------- |
| void (*i286op[])(void) = { | const I286TBL i286op[256] = { |
| add_ea_r8, // 00: add EA, REG8 | add_ea_r8, // 00: add EA, REG8 |
| add_ea_r16, // 01: add EA, REG16 | add_ea_r16, // 01: add EA, REG16 |
| add_r8_ea, // 02: add REG8, EA | add_r8_ea, // 02: add REG8, EA |
| Line 4551 I286 repe_segprefix_ds(void) { | Line 4673 I286 repe_segprefix_ds(void) { |
| } | } |
| } | } |
| void (*i286op_repe[])(void) = { | const I286TBL i286op_repe[256] = { |
| add_ea_r8, // 00: add EA, REG8 | add_ea_r8, // 00: add EA, REG8 |
| add_ea_r16, // 01: add EA, REG16 | add_ea_r16, // 01: add EA, REG16 |
| add_r8_ea, // 02: add REG8, EA | add_r8_ea, // 02: add REG8, EA |
| Line 4875 I286 repne_segprefix_ds(void) { | Line 4997 I286 repne_segprefix_ds(void) { |
| } | } |
| } | } |
| void (*i286op_repne[])(void) = { | const I286TBL i286op_repne[256] = { |
| add_ea_r8, // 00: add EA, REG8 | add_ea_r8, // 00: add EA, REG8 |
| add_ea_r16, // 01: add EA, REG16 | add_ea_r16, // 01: add EA, REG16 |
| add_r8_ea, // 02: add REG8, EA | add_r8_ea, // 02: add REG8, EA |