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

version 1.1.1.1, 2003/10/16 17:57:25 version 1.26, 2005/03/24 02:21:21
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"
 #include        "i286xea.mcr"  #include        "i286xea.mcr"
 #include        "v30patch.h"  #include        "v30patch.h"
 #include        "bios.h"  #include        "bios.h"
 #include        "dmap.h"  #include        "dmax86.h"
   #if defined(ENABLE_TRAP)
   #include        "steptrap.h"
   #include        "inttrap.h"
   #endif
   
   
         I286REGS        i286r;          I286CORE        i286core;
         I286STAT        i286s;  
         I286DTR         GDTR;  
         I286DTR         IDTR;  
         UINT16          MSW;  
   
 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 56  const BYTE iflags[256] = {     // Z_FLAG Line 55  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();
           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) {
   
           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 = (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;
   
         i286xadr_init();                                                        // 毎回通すのはどうか…          frame &= 3;
         v30init();                                                                      // 毎回通すのはどうか…          if (addr < USE_HIMEM) {
         ZeroMemory(&i286r, sizeof(i286r));                  ptr = mem + addr;
         ZeroMemory(&i286s, sizeof(i286s));          }
         I286_CS = 0x1fc0;          else if ((addr - 0x100000 + 0x4000) <= CPU_EXTMEMSIZE) {
         CS_BASE = 0x1fc00;                  ptr = CPU_EXTMEM + (addr - 0x100000);
         ZeroMemory(&GDTR, sizeof(GDTR));          }
         ZeroMemory(&IDTR, sizeof(IDTR));          else {
         MSW = 0;                  ptr = mem + 0xc0000 + (frame << 14);
           }
           i286core.e.ems[frame] = ptr;
 }  }
   
   
 LABEL void i286_resetprefetch(void) {  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(UINT8 vect) {
   
         __asm {          __asm {
                                 pushad                                  pushad
Line 92  LABEL void __fastcall i286_interrupt(BYT Line 152  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 184  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 231  LABEL void __fastcall i286x_localint(voi
 }  }
   
   
   // プロテクトモードのセレクタ(in ax / ret eax)
   LABEL void __fastcall i286x_selector(void) {
   
           __asm {
                                   mov             ecx, dword ptr (I286_GDTR.base)
                                   test    eax, 4
                                   je              short ixsl_1
                                   mov             ecx, dword ptr (I286_LDTRC.base)
   ixsl_1:                 and             eax, not 7
                                   and             ecx, 0ffffffh
                                   lea             ecx, [ecx + eax + 2]
                                   call    i286_memoryread_w
                                   push    eax
                                   add             ecx, 2
                                   call    i286_memoryread
                                   pop             ecx
                                   and             eax, 0ffh
                                   movzx   ecx, cx
                                   shl             eax, 16
                                   add             eax, ecx
                                   ret
                   }
   }
   
   
 LABEL void 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 184  LABEL void i286(void) { Line 268  LABEL void i286(void) {
                                 cmp             dmac.working, 0                                  cmp             dmac.working, 0
                                 jne             short i286_dma_mnlp                                  jne             short i286_dma_mnlp
   
 i286_mnlp:              movzx   eax, bl  i286_mnlp:
   #if defined(ENABLE_TRAP)
                                   mov             edx, esi
                                   movzx   ecx, I286_CS
                                   call    steptrap
   #endif
                                   movzx   eax, bl
                                 call    i286op[eax*4]                                  call    i286op[eax*4]
                                 cmp             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
   
                                 align   16                                  align   16
 i286_dma_mnlp:  movzx   eax, bl  i286_dma_mnlp:
   #if defined(ENABLE_TRAP)
                                   mov             edx, esi
                                   movzx   ecx, I286_CS
                                   call    steptrap
   #endif
                                   movzx   eax, bl
                                 call    i286op[eax*4]                                  call    i286op[eax*4]
                                 call    dmap_i286                                  call    dmax86
                                 cmp             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
   
                                 align   16                                  align   16
 i286_trapping:  movzx   eax, bl  i286_trapping:
   #if defined(ENABLE_TRAP)
                                   mov             edx, esi
                                   movzx   ecx, I286_CS
                                   call    steptrap
   #endif
                                   movzx   eax, bl
                                 call    i286op[eax*4]                                  call    i286op[eax*4]
                                 cmp             I286_TRAP, 0                                  cmp             I286_TRAP, 0
                                 je              i286notrap                                  je              i286notrap
                                 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 322  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 337  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    dmax86
                                 popad                                  popad
                                 ret                                  ret
                 }                  }
Line 250  nexts: Line 352  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 365  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 469  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 682  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 811  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 1717  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 1798  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 1840  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 2298  I286 mov_ea_r8(void) {       // 88: mov  Line 2407  I286 mov_ea_r8(void) {       // 88: mov 
                 __asm {                  __asm {
                                 PREPART_EA_REG8(2)                                  PREPART_EA_REG8(2)
                                         mov             I286_REG[eax], dl                                          mov             I286_REG[eax], dl
                                         GET_NEXTPRE2                                    // ea_regの regregだけ                                          GET_NEXTPRE1                                    // ea_regの regregだけ
                                         ret                                          ret
                                         align   16                                          align   16
                         memory_eareg8:                          memory_eareg8:
Line 2403  I286 mov_seg_ea(void) {       // 8E: mov Line 2512  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 2538  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 2736  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 2786  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 2896  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 2914  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 2932  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 2953  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 2993  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 3007  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 3051  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 3067  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 3392  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 3425  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 3385  I286 _enter(void) {        // C8: enter  Line 3509  I286 _enter(void) {        // C8: enter 
                                 je              enter0                                  je              enter0
                                 dec             eax                                  dec             eax
                                 je              enter1                                  je              enter1
                                 lea             ecx, [eax*4 + 12]                                  lea             ecx, [eax*4 + 12 + 4]
                                 I286CLOCK(ecx)                                  I286CLOCK(ecx)
                                 push    ebx                                  push    ebx
                                 movzx   ebx, I286_BP                                  movzx   ebx, I286_BP
Line 3465  I286 ret_far_data16(void) {      // CA:  Line 3589  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 3617  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 3523  I286 int_data8(void) {       // CD: int  Line 3657  I286 int_data8(void) {       // CD: int 
                                 lea             ecx, [edi + ebp]                                  lea             ecx, [edi + ebp]
                                 mov             dx, I286_CS                                  mov             dx, I286_CS
                                 call    i286_memorywrite_w                                  call    i286_memorywrite_w
   #if defined(ENABLE_TRAP)
                                   movzx   eax, bh
                                   push    eax
                                   lea             edx, [esi - 1]
                                   movzx   ecx, I286_CS
                                   call    softinttrap
   #endif
                                 movzx   eax, bh                                  movzx   eax, bh
                                 sub             bp, 2                                  sub             bp, 2
                                 mov             I286_SP, bp                                  mov             I286_SP, bp
Line 3542  I286 int_data8(void) {       // CD: int  Line 3683  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 3697  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 3721  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 3904  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 4049  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 4065  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 4082  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 4135  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 4165  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 4190  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 4232  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 4305  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 4378  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 4702  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 5026  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.26


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