| version 1.8, 2003/12/09 15:49:14 | version 1.28, 2005/04/04 11:50:59 | 
| Line 5 | Line 5 | 
 | #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" | 
 | #include        "i286xea.mcr" | #include        "i286xea.mcr" | 
 | #include        "v30patch.h" | #include        "v30patch.h" | 
 | #include        "bios.h" | #include        "bios.h" | 
| #include        "dmap.h" | #include        "dmax86.h" | 
|  | #if defined(ENABLE_TRAP) | 
|  | #include        "steptrap.h" | 
|  | #include        "inttrap.h" | 
|  | #endif | 
 |  |  | 
 |  |  | 
 | I286CORE        i286core; | I286CORE        i286core; | 
 |  |  | 
| const BYTE iflags[256] = {                                      // Z_FLAG, S_FLAG, P_FLAG | const UINT8 iflags[256] = {                                     // Z_FLAG, S_FLAG, P_FLAG | 
 | 0x44, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, | 0x44, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, | 
 | 0x00, 0x04, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, | 0x00, 0x04, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, | 
 | 0x00, 0x04, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, | 0x00, 0x04, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, | 
| Line 58  void i286x_initialize(void) { | Line 61  void i286x_initialize(void) { | 
 | v30xinit(); | v30xinit(); | 
 | } | } | 
 |  |  | 
 |  | void i286x_deinitialize(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) { | void i286x_reset(void) { | 
 |  |  | 
 | ZeroMemory(&i286core.s, sizeof(i286core.s)); | ZeroMemory(&i286core.s, sizeof(i286core.s)); | 
| I286_CS = 0x1fc0; | i286x_initreg(); | 
| CS_BASE = 0x1fc00; | } | 
| i286core.s.adrsmask = 0xfffff; |  | 
|  | 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 = (UINT8 *)_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) { | 
|  |  | 
|  | UINT8   *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; | 
 | } | } | 
 |  |  | 
 |  |  | 
| Line 79  LABEL void i286x_resetprefetch(void) { | Line 142  LABEL void i286x_resetprefetch(void) { | 
 | } | } | 
 | } | } | 
 |  |  | 
| LABEL void __fastcall i286x_interrupt(BYTE vect) { | LABEL void __fastcall i286x_interrupt(UINT8 vect) { | 
 |  |  | 
 | __asm { | __asm { | 
 | pushad | pushad | 
| Line 168  LABEL void __fastcall i286x_localint(voi | Line 231  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 i286x(void) { | LABEL void i286x(void) { | 
 |  |  | 
| Line 181  LABEL void i286x(void) { | Line 268  LABEL void i286x(void) { | 
 | cmp             dmac.working, 0 | cmp             dmac.working, 0 | 
 | jne             short i286_dma_mnlp | jne             short i286_dma_mnlp | 
 |  |  | 
| i286_mnlp:              movzx   eax, bl | i286_mnlp: | 
|  | #if defined(ENABLE_TRAP) | 
|  | mov             edx, esi | 
|  | movzx   ecx, I286_CS | 
|  | call    steptrap | 
|  | #endif | 
|  | movzx   eax, bl | 
 | call    i286op[eax*4] | call    i286op[eax*4] | 
 | cmp             I286_REMCLOCK, 0 | cmp             I286_REMCLOCK, 0 | 
 | jg              i286_mnlp | jg              i286_mnlp | 
| Line 191  i286_mnlp:  movzx eax, bl | Line 284  i286_mnlp:  movzx eax, bl | 
 | ret | ret | 
 |  |  | 
 | align   16 | align   16 | 
| i286_dma_mnlp:  movzx   eax, bl | i286_dma_mnlp: | 
|  | #if defined(ENABLE_TRAP) | 
|  | mov             edx, esi | 
|  | movzx   ecx, I286_CS | 
|  | call    steptrap | 
|  | #endif | 
|  | movzx   eax, bl | 
 | call    i286op[eax*4] | call    i286op[eax*4] | 
| call    dmap_i286 | call    dmax86 | 
 | cmp             I286_REMCLOCK, 0 | cmp             I286_REMCLOCK, 0 | 
 | jg              i286_dma_mnlp | jg              i286_dma_mnlp | 
 | mov             dword ptr (i286core.s.prefetchque), ebx | mov             dword ptr (i286core.s.prefetchque), ebx | 
| Line 202  i286_dma_mnlp: movzx eax, bl | Line 301  i286_dma_mnlp: movzx eax, bl | 
 | ret | ret | 
 |  |  | 
 | align   16 | align   16 | 
| i286_trapping:  movzx   eax, bl | i286_trapping: | 
|  | #if defined(ENABLE_TRAP) | 
|  | mov             edx, esi | 
|  | movzx   ecx, I286_CS | 
|  | call    steptrap | 
|  | #endif | 
|  | movzx   eax, bl | 
 | call    i286op[eax*4] | call    i286op[eax*4] | 
 | cmp             I286_TRAP, 0 | cmp             I286_TRAP, 0 | 
 | je              i286notrap | je              i286notrap | 
| Line 224  LABEL void i286x_step(void) { | Line 329  LABEL void i286x_step(void) { | 
 | mov             ebx, dword ptr (i286core.s.prefetchque) | mov             ebx, dword ptr (i286core.s.prefetchque) | 
 | movzx   esi, I286_IP | movzx   esi, I286_IP | 
 |  |  | 
 |  | #if defined(ENABLE_TRAP) | 
 |  | mov             edx, esi | 
 |  | movzx   ecx, I286_CS | 
 |  | call    steptrap | 
 |  | #endif | 
 |  |  | 
 | movzx   eax, bl | movzx   eax, bl | 
 | call    i286op[eax*4] | call    i286op[eax*4] | 
 |  |  | 
| Line 235  nexts: | Line 346  nexts: | 
 | mov             dword ptr (i286core.s.prefetchque), ebx | mov             dword ptr (i286core.s.prefetchque), ebx | 
 | mov             I286_IP, si | mov             I286_IP, si | 
 |  |  | 
| call    dmap_i286 | call    dmax86 | 
 | popad | popad | 
 | ret | ret | 
 | } | } | 
| Line 260  LABEL void removeprefix(void) { | Line 371  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 364  I286 pop_es(void) {        // 07: pop es | Line 475  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 572  I286 pop_ss(void) {        // 17: pop ss | Line 688  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             i286core.s.prefix, 0            // 00/06/24 | cmp             i286core.s.prefix, 0            // 00/06/24 | 
 | jne             prefix_exist | jne             prefix_exist | 
| Line 583  I286 pop_ss(void) {        // 17: pop ss | Line 701  I286 pop_ss(void) {        // 17: pop ss | 
 | 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 | prefix_exist:   pop             eax                                             // eax<-offset removeprefix | 
 | call    eax | call    eax | 
 | jmp             noprefix | jmp             noprefix | 
| Line 696  I286 pop_ds(void) {        // 1F: pop ds | Line 817  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 1597  I286 _arpl(void) { | Line 1723  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 1678  I286 _insb(void) {        // 6C: insb | Line 1804  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 1725  I286 _outsb(void) {        // 6E: outsb | Line 1846  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 2402  I286 mov_seg_ea(void) {       // 8E: mov | Line 2518  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             i286core.s.prefix, 0    // 00/05/13 | 
 | je              noprefix | je              noprefix | 
 | pop             eax | pop             eax | 
| Line 2427  I286 mov_seg_ea(void) {       // 8E: mov | Line 2544  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 2624  I286 call_far(void) {       // 9A: call | Line 2742  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 2671  I286 _popf(void) {        // 9D: popf | Line 2796  I286 _popf(void) {        // 9D: popf | 
 | je              irqcheck                                // fast_intr | je              irqcheck                                // fast_intr | 
 | test    ah, 2 | test    ah, 2 | 
 | je              nextop | je              nextop | 
| cmp             pic.ext_irq, 0 | mov             al, pic.pi[0 * (type _PICITEM)].imr | 
| jne             nextop | mov             ah, pic.pi[1 * (type _PICITEM)].imr | 
| mov             al, pic.pi[0].imr |  | 
| mov             ah, pic.pi[1].imr |  | 
 | not             ax | not             ax | 
| test    al, pic.pi[0].irr | test    al, pic.pi[0 * (type _PICITEM)].irr | 
 | jne             irqcheck | jne             irqcheck | 
| test    al, pic.pi[1].irr | test    ah, pic.pi[1 * (type _PICITEM)].irr | 
 | jne             irqcheck | jne             irqcheck | 
 | nextop:                 ret | nextop:                 ret | 
 |  |  | 
| Line 2779  I286 _movsb(void) {        // A4: movsb | Line 2902  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 2799  I286 _movsw(void) {        // A5: movsw | Line 2920  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 2819  I286 _cmpsb(void) {        // A6: cmpsb | Line 2938  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 2842  I286 _cmpsw(void) {        // A7: cmpsw | Line 2959  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 2884  I286 _stosb(void) {        // AA: stosb | Line 2999  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 2900  I286 _stosw(void) {        // AB: stosw | Line 3013  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 2946  I286 _scasb(void) {        // AE: scasb | Line 3057  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 2964  I286 _scasw(void) {        // AF: scasw | Line 3073  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 3291  I286 les_r16_ea(void) {       // C4: les | Line 3398  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 3320  I286 lds_r16_ea(void) {       // C5: lds | Line 3431  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 3343  I286 mov_ea8_data8(void) {      // C6: m | Line 3459  I286 mov_ea8_data8(void) {      // C6: m | 
 | bt              bp, 2 | bt              bp, 2 | 
 | rcl             ebp, 1 | rcl             ebp, 1 | 
 | and             ebp, 7 | and             ebp, 7 | 
| GET_NEXTPRE2 | GET_NEXTPRE3 | 
 | mov             byte ptr I286_REG[ebp], dh | mov             byte ptr I286_REG[ebp], dh | 
 | ret | ret | 
 | align   16 | align   16 | 
| Line 3399  I286 _enter(void) {        // C8: enter | Line 3515  I286 _enter(void) {        // C8: enter | 
 | je              enter0 | je              enter0 | 
 | dec             eax | dec             eax | 
 | je              enter1 | je              enter1 | 
| lea             ecx, [eax*4 + 12] | lea             ecx, [eax*4 + 12 + 4] | 
 | I286CLOCK(ecx) | I286CLOCK(ecx) | 
 | push    ebx | push    ebx | 
 | movzx   ebx, I286_BP | movzx   ebx, I286_BP | 
| Line 3479  I286 ret_far_data16(void) {      // CA: | Line 3595  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 3502  I286 ret_far(void) {       // CB: ret fa | Line 3623  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 3537  I286 int_data8(void) {       // CD: int | Line 3663  I286 int_data8(void) {       // CD: int | 
 | lea             ecx, [edi + ebp] | lea             ecx, [edi + ebp] | 
 | mov             dx, I286_CS | mov             dx, I286_CS | 
 | call    i286_memorywrite_w | call    i286_memorywrite_w | 
 |  | #if defined(ENABLE_TRAP) | 
 |  | movzx   eax, bh | 
 |  | push    eax | 
 |  | lea             edx, [esi - 1] | 
 |  | movzx   ecx, I286_CS | 
 |  | call    softinttrap | 
 |  | #endif | 
 | movzx   eax, bh | movzx   eax, bh | 
 | sub             bp, 2 | sub             bp, 2 | 
 | mov             I286_SP, bp | mov             I286_SP, bp | 
| Line 3556  I286 int_data8(void) {       // CD: int | Line 3689  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 3571  I286 _into(void) {        // CE: into | Line 3703  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 3601  I286 _iret(void) {        // CF: iret | Line 3732  I286 _iret(void) {        // CF: iret | 
 | jne             irqcheck | jne             irqcheck | 
 | test    I286_FLAG, I_FLAG | test    I286_FLAG, I_FLAG | 
 | je              nextop | je              nextop | 
| cmp             pic.ext_irq, 0 | mov             al, pic.pi[0 * (type _PICITEM)].imr | 
| jne             nextop | mov             ah, pic.pi[1 * (type _PICITEM)].imr | 
| mov             al, pic.pi[0].imr |  | 
| mov             ah, pic.pi[1].imr |  | 
 | not             ax | not             ax | 
| test    al, pic.pi[0].irr | test    al, pic.pi[0 * (type _PICITEM)].irr | 
 | jne             irqcheck | jne             irqcheck | 
| test    al, pic.pi[1].irr | test    ah, pic.pi[1 * (type _PICITEM)].irr | 
 | jne             irqcheck | jne             irqcheck | 
 | nextop:                 ret | nextop:                 ret | 
 |  |  | 
| Line 3781  nzflagsed:  xor  al, ah | Line 3910  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 3927  I286 in_al_data8(void) {      // E4: in | Line 4055  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             i286core.s.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             i286core.s.inport, 0 | mov             I286_INPADRS, 0 | 
 | GET_NEXTPRE2 | GET_NEXTPRE2 | 
 | ret | ret | 
 | } | } | 
| Line 3964  I286 out_data8_al(void) {      // E6: ou | Line 4088  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 4021  I286 jmp_far(void) {       // EA: jmp fa | Line 4141  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 4044  I286 in_al_dx(void) {       // EC: in al | Line 4171  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 4074  I286 out_dx_al(void) {       // EE: out | Line 4196  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 4205  I286 _sti(void) {        // FB: sti | Line 4321  I286 _sti(void) {        // FB: sti | 
 | setne   I286_TRAP | setne   I286_TRAP | 
 |  |  | 
 | jne             nextopandexit                   // fast_intr | jne             nextopandexit                   // fast_intr | 
| cmp             pic.ext_irq, 0 | mov             al, pic.pi[0 * (type _PICITEM)].imr | 
| jne             jmp_nextop | mov             ah, pic.pi[1 * (type _PICITEM)].imr | 
| mov             al, pic.pi[0].imr |  | 
| mov             ah, pic.pi[1].imr |  | 
 | not             ax | not             ax | 
| test    al, pic.pi[0].irr | test    al, pic.pi[0 * (type _PICITEM)].irr | 
 | jne             nextopandexit | jne             nextopandexit | 
| test    al, pic.pi[1].irr | test    ah, pic.pi[1 * (type _PICITEM)].irr | 
 | jne             nextopandexit | jne             nextopandexit | 
 | jmp_nextop:             jmp             i286op[ebp*4] | jmp_nextop:             jmp             i286op[ebp*4] | 
 |  |  | 
| Line 4270  I286 _ope0xff(void) {       // FF: | Line 4384  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 4594  I286 repe_segprefix_ds(void) { | Line 4708  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 4918  I286 repne_segprefix_ds(void) { | Line 5032  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 |