Diff for /np2/i286x/i286x.cpp between versions 1.1 and 1.7

version 1.1, 2003/10/16 17:57:25 version 1.7, 2003/12/08 00:55:31
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"
Line 15 Line 15
 #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 52  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));  
   void i286x_reset(void) {
   
           ZeroMemory(&i286core.s, sizeof(i286core.s));
         I286_CS = 0x1fc0;          I286_CS = 0x1fc0;
         CS_BASE = 0x1fc00;          CS_BASE = 0x1fc00;
         ZeroMemory(&GDTR, sizeof(GDTR));          i286core.s.adrsmask = 0xfffff;
         ZeroMemory(&IDTR, sizeof(IDTR));  
         MSW = 0;  
 }  }
   
   
 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(BYTE vect) {
   
         __asm {          __asm {
                                 pushad                                  pushad
Line 92  LABEL void __fastcall i286_interrupt(BYT Line 89  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 121  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 172  LABEL void __fastcall i286x_localint(voi Line 169  LABEL void __fastcall i286x_localint(voi
   
   
   
 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 183  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 194  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 208  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 217  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 232  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 247  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 579  I286 pop_ss(void) {        // 17: pop ss Line 576  I286 pop_ss(void) {        // 17: pop ss
                                 shl             eax, 4                                  // make segreg                                  shl             eax, 4                                  // make segreg
                                 mov             SS_BASE, eax                                  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]
   
   prefix_exist:   pop             eax                                             // eax<-offset removeprefix
                                   call    eax
                                   jmp             noprefix
                 }                  }
 }  }
   
Line 2420  I286 mov_seg_ea(void) {       // 8E: mov Line 2419  I286 mov_seg_ea(void) {       // 8E: mov
                 segsetr:ret                  segsetr:ret
   
                                 align   16                                  align   16
                 setss:  cmp             i286s.prefix, 0                 // 00/05/13                  setss:  cmp             i286core.s.prefix, 0    // 00/05/13
                                 je              noprefix                                  je              noprefix
                                 pop             eax                                  pop             eax
                                 call    eax                                             // eax<-offset removeprefix                                  call    eax                                             // eax<-offset removeprefix
Line 2668  I286 _popf(void) {        // 9D: popf Line 2667  I286 _popf(void) {        // 9D: popf
                                 and             ah, 3                                  and             ah, 3
                                 cmp             ah, 3                                  cmp             ah, 3
                                 sete    I286_TRAP                                  sete    I286_TRAP
                                 I286IRQCHECKTERM  
                                   test    ah, 2                                   // fast_intr
                                   je              nextop
                                   cmp             pic.ext_irq, 0
                                   jne             nextop
                                   mov             al, pic.pi[0].imr
                                   mov             ah, pic.pi[1].imr
                                   not             ax
                                   test    al, pic.pi[0].irr
                                   jne             irqcheck
                                   test    al, pic.pi[1].irr
                                   jne             irqcheck
   nextop:                 ret
   
   irqcheck:               I286IRQCHECKTERM
                 }                  }
 }  }
   
Line 3582  I286 _iret(void) {        // CF: iret Line 3595  I286 _iret(void) {        // CF: iret
                                 cmp             ah, 3                                  cmp             ah, 3
                                 sete    I286_TRAP                                  sete    I286_TRAP
                                 RESET_XPREFETCH                                  RESET_XPREFETCH
                                 I286IRQCHECKTERM  
                                   test    I286_FLAG, I_FLAG               // fast_intr
                                   je              nextop
                                   cmp             pic.ext_irq, 0
                                   jne             nextop
                                   mov             al, pic.pi[0].imr
                                   mov             ah, pic.pi[1].imr
                                   not             ax
                                   test    al, pic.pi[0].irr
                                   jne             irqcheck
                                   test    al, pic.pi[1].irr
                                   jne             irqcheck
   nextop:                 ret
   
   irqcheck:               I286IRQCHECKTERM
                 }                  }
 }  }
   
Line 3897  I286 in_al_data8(void) {      // E4: in  Line 3924  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             i286core.s.inport, eax
                                 movzx   ecx, bh                                  movzx   ecx, bh
 #if 1  #if 1
                                 call    iocore_inp8                                  call    iocore_inp8
Line 3905  I286 in_al_data8(void) {      // E4: in  Line 3932  I286 in_al_data8(void) {      // E4: in 
                                 call    i286_in                                  call    i286_in
 #endif  #endif
                                 mov             I286_AL, al                                  mov             I286_AL, al
                                 mov             i286s.inport, 0                                  mov             i286core.s.inport, 0
                                 GET_NEXTPRE2                                  GET_NEXTPRE2
                                 ret                                  ret
                 }                  }
Line 3917  I286 in_ax_data8(void) {      // E5: in  Line 3944  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 4093  I286 _repe(void) {        // F3: repe Line 4119  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 4192  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                                  cmp             pic.ext_irq, 0                  // fast_intr
                                 jne             prefix_exist                    // 前方分岐ジャンプなので。                                  jne             jmp_nextop
 noprefix:               movzx   eax, bl                                  mov             al, pic.pi[0].imr
                                 call    i286op[eax*4]                                  mov             ah, pic.pi[1].imr
                                   not             ax
                                   test    al, pic.pi[0].irr
                                   jne             nextopandexit
                                   test    al, pic.pi[1].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

Removed from v.1.1  
changed lines
  Added in v.1.7


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