Diff for /np2/i286x/i286x.cpp between versions 1.9 and 1.24

version 1.9, 2003/12/12 01:04:40 version 1.24, 2005/02/12 12:13:58
Line 11 Line 11
 #include        "i286xea.mcr"  #include        "i286xea.mcr"
 #include        "v30patch.h"  #include        "v30patch.h"
 #include        "bios.h"  #include        "bios.h"
 #include        "dmap.h"  #include        "dmax86.h"
   
   
         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 57  void i286x_initialize(void) { Line 57  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 78  LABEL void i286x_resetprefetch(void) { Line 138  LABEL void i286x_resetprefetch(void) {
         }          }
 }  }
   
 LABEL void __fastcall i286x_interrupt(BYTE vect) {  LABEL void __fastcall i286x_interrupt(UINT8 vect) {
   
         __asm {          __asm {
                                 pushad                                  pushad
Line 167  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 i286x(void) {  LABEL void i286x(void) {
   
Line 192  i286_mnlp:  movzx eax, bl Line 276  i286_mnlp:  movzx eax, bl
                                 align   16                                  align   16
 i286_dma_mnlp:  movzx   eax, bl  i286_dma_mnlp:  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 234  nexts: Line 318  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 259  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 363  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 571  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             i286core.s.prefix, 0            // 00/06/24                                  cmp             i286core.s.prefix, 0            // 00/06/24
                                 jne             prefix_exist                                  jne             prefix_exist
Line 582  I286 pop_ss(void) {        // 17: pop ss Line 673  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 695  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 1596  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 1677  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 1724  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 2401  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             i286core.s.prefix, 0    // 00/05/13
                                 je              noprefix                                  je              noprefix
                                 pop             eax                                  pop             eax
Line 2426  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 2623  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 2670  I286 _popf(void) {        // 9D: popf Line 2768  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 2778  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 2798  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 2818  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 2841  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 2883  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 2899  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 2945  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 2963  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 3290  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 3319  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 3478  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 3501  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 3555  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 3570  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 3600  I286 _iret(void) {        // CF: iret Line 3697  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 3780  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 3926  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             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 3963  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 4020  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 4043  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 4073  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 4204  I286 _sti(void) {        // FB: sti Line 4286  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 4269  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 4593  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 4917  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

Removed from v.1.9  
changed lines
  Added in v.1.24


RetroPC.NET-CVS <cvs@retropc.net>