Diff for /np2/i286x/i286x.cpp between versions 1.1.1.1 and 1.22

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

Removed from v.1.1.1.1  
changed lines
  Added in v.1.22


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