Diff for /np2/i286x/i286xcts.cpp between versions 1.5 and 1.9

version 1.5, 2003/12/08 00:55:31 version 1.9, 2004/01/05 05:04:53
Line 3 Line 3
 #include        "i286x.h"  #include        "i286x.h"
 #include        "i286xadr.h"  #include        "i286xadr.h"
 #include        "i286xcts.h"  #include        "i286xcts.h"
 #include        "memory.h"  
 #include        "i286x.mcr"  #include        "i286x.mcr"
 #include        "i286xea.mcr"  #include        "i286xea.mcr"
   
   
   typedef void (*I286OP_0F)(void);
   
   
   // ---- 0f 00
   
   I286 _sldt(void) {
   
                   __asm {
                                   PREPART_EA16(2)
                                           mov             dx, I286_LDTR
                                           mov             word ptr I286_REG[eax*2], dx
                                           GET_NEXTPRE2
                                           ret
                                   MEMORY_EA16(3)
                                           mov             ax, I286_LDTR
                                           mov             word ptr I286_MEM[ecx], ax
                                           ret
                                   extmem_eareg16:
                                           mov             dx, I286_LDTR
                                           jmp             i286_memorywrite_w
                   }
   }
   
   I286 _str(void) {
   
                   __asm {
                                   PREPART_EA16(3)
                                           mov             dx, I286_TR
                                           mov             word ptr I286_REG[eax*2], dx
                                           GET_NEXTPRE2
                                           ret
                                   MEMORY_EA16(6)
                                           mov             ax, I286_TR
                                           mov             word ptr I286_MEM[ecx], ax
                                           ret
                                   extmem_eareg16:
                                           mov             dx, I286_TR
                                           jmp             i286_memorywrite_w
                   }
   }
   
   I286 _lldt(void) {
   
                   __asm {
                                   PREPART_EA16(17)
                                           mov             ax, word ptr I286_REG[eax*2]
                                           call    lldt_sub
                                           GET_NEXTPRE2
                                           ret
                                   MEMORY_EA16(19)
                                           mov             ax, word ptr I286_MEM[ecx]
                                           jmp             short lldt_sub
                                   EXTMEM_EA16
   
   lldt_sub:                       mov             word ptr I286_LDTR, ax
                                           call    i286x_selector
                                           mov             ecx, eax
                                           call    i286_memoryread_w
                                           mov             I286_LDTRC.limit, ax
                                           add             ecx, 2
                                           call    i286_memoryread_w
                                           mov             I286_LDTRC.base, ax
                                           add             ecx, 2
                                           call    i286_memoryread
                                           mov             I286_LDTRC.base24, al
                                           ret
                   }
   }
   
   I286 _ltr(void) {
   
                   __asm {
                                   PREPART_EA16(17)
                                           mov             ax, word ptr I286_REG[eax*2]
                                           call    ltr_sub
                                           GET_NEXTPRE2
                                           ret
                                   MEMORY_EA16(19)
                                           mov             ax, word ptr I286_MEM[ecx]
                                           jmp             short ltr_sub
                                   EXTMEM_EA16
   
   ltr_sub:                        mov             word ptr I286_TR, ax
                                           call    i286x_selector
                                           mov             ecx, eax
                                           call    i286_memoryread_w
                                           mov             I286_TRC.limit, ax
                                           add             ecx, 2
                                           call    i286_memoryread_w
                                           mov             I286_TRC.base, ax
                                           add             ecx, 2
                                           call    i286_memoryread
                                           mov             I286_TRC.base24, al
                                           ret
                   }
   }
   
   I286 _verr(void) {
   
                   __asm {
                                   PREPART_EA16(14)
                                           mov             ax, word ptr I286_REG[eax*2]
                                           GET_NEXTPRE2
                                           ret
                                   MEMORY_EA16(16)
                                           mov             ax, word ptr I286_MEM[ecx]
                                           ret
                                   EXTMEM_EA16
                                           ret
                   }
   }
   
   I286 _verw(void) {
   
                   __asm {
                                   PREPART_EA16(14)
                                           mov             ax, word ptr I286_REG[eax*2]
                                           GET_NEXTPRE2
                                           ret
                                   MEMORY_EA16(16)
                                           mov             ax, word ptr I286_MEM[ecx]
                                           ret
                                   EXTMEM_EA16
                                           ret
                   }
   }
   
   static const I286OP_0F cts0x_table[] = {
                           _sldt,  _str,   _lldt,  _ltr,
                           _verr,  _verw,  _verr,  _verw};
   
   
   // ---- 0f 01
   
 I286 _sgdt(void) {  I286 _sgdt(void) {
   
                 __asm {                  __asm {
                                 cmp             al, 0c0h                                  cmp             al, 0c0h
                                 jnc             register_eareg16                                  jnc             register_eareg16
                                 I286CLOCK(11)                                  I286CLOCK(11)
                                 call    p_get_ea[eax*4]                                  call    p_ea_dst[eax*4]
                                 lea             ecx, [edi + ebp]                                  mov             dx, word ptr I286_GDTR
                                 mov             dx, word ptr i286core.s.GDTR  
                                 call    i286_memorywrite_w                                  call    i286_memorywrite_w
                                 add             bp, 2                                  add             ecx, 2
                                 lea             ecx, [edi + ebp]                                  mov             dx, word ptr (I286_GDTR + 2)
                                 mov             dx, word ptr (i286core.s.GDTR+2)  
                                 call    i286_memorywrite_w                                  call    i286_memorywrite_w
                                 add             bp, 2                                  add             ecx, 2
                                 lea             ecx, [edi + ebp]                                  mov             dl, byte ptr (I286_GDTR + 4)
                                 mov             dl, byte ptr (i286core.s.GDTR+4)                        // ver0.29  
                                 mov             dh, -1                                  mov             dh, -1
                                 jmp             i286_memorywrite_w                                  jmp             i286_memorywrite_w
                                 align   4                                  align   4
Line 33  I286 _sgdt(void) { Line 163  I286 _sgdt(void) {
                 }                  }
 }  }
   
   
 I286 _sidt(void) {  I286 _sidt(void) {
   
                 __asm {                  __asm {
                                 cmp             al, 0c0h                                  cmp             al, 0c0h
                                 jnc             register_eareg16                                  jnc             register_eareg16
                                 I286CLOCK(12)                                  I286CLOCK(12)
                                 call    p_get_ea[eax*4]                                  call    p_ea_dst[eax*4]
                                 lea             ecx, [edi + ebp]                                  mov             dx, word ptr I286_IDTR
                                 mov             dx, word ptr i286core.s.IDTR  
                                 call    i286_memorywrite_w                                  call    i286_memorywrite_w
                                 add             bp, 2                                  add             ecx, 2
                                 lea             ecx, [edi + ebp]                                  mov             dx, word ptr (I286_IDTR + 2)
                                 mov             dx, word ptr (i286core.s.IDTR+2)  
                                 call    i286_memorywrite_w                                  call    i286_memorywrite_w
                                 add             bp, 2                                  add             ecx, 2
                                 lea             ecx, [edi + ebp]                                  lea             ecx, [edi + ebp]
                                 mov             dl, byte ptr (i286core.s.IDTR+4)                        // ver0.29                                  mov             dl, byte ptr (I286_IDTR + 4)
                                 mov             dh, -1                                  mov             dh, -1
                                 jmp             i286_memorywrite_w                                  jmp             i286_memorywrite_w
                                 align   4                                  align   4
Line 59  I286 _sidt(void) { Line 186  I286 _sidt(void) {
                 }                  }
 }  }
   
   
 I286 _lgdt(void) {  I286 _lgdt(void) {
   
                 __asm {                  __asm {
                                 cmp             al, 0c0h                                  cmp             al, 0c0h
                                 jnc             register_eareg16                                  jnc             register_eareg16
                                 I286CLOCK(11)                                  I286CLOCK(11)
                                 call    p_get_ea[eax*4]                                  call    p_ea_dst[eax*4]
                                 lea             ecx, [edi + ebp]  
                                 call    i286_memoryread_w                                  call    i286_memoryread_w
                                 mov             word ptr i286core.s.GDTR, ax                                  mov             word ptr I286_GDTR, ax
                                 add             bp, 2                                  add             ecx, 2
                                 lea             ecx, [edi + ebp]  
                                 call    i286_memoryread_w  
                                 mov             word ptr (i286core.s.GDTR+2), ax  
                                 add             bp, 2  
                                 lea             ecx, [edi + ebp]  
                                 call    i286_memoryread_w                                  call    i286_memoryread_w
                                 mov             word ptr (i286core.s.GDTR+4), ax                                  mov             word ptr (I286_GDTR + 2), ax
                                   add             ecx, 2
                                   call    i286_memoryread
                                   mov             byte ptr (I286_GDTR + 4), al
                                 ret                                  ret
                                 align   4                                  align   4
                 register_eareg16:                  register_eareg16:
Line 85  I286 _lgdt(void) { Line 208  I286 _lgdt(void) {
                 }                  }
 }  }
   
   
 I286 _lidt(void) {  I286 _lidt(void) {
   
                 __asm {                  __asm {
                                 cmp             al, 0c0h                                  cmp             al, 0c0h
                                 jnc             register_eareg16                                  jnc             register_eareg16
                                 I286CLOCK(12)                                  I286CLOCK(12)
                                 call    p_get_ea[eax*4]                                  call    p_ea_dst[eax*4]
                                 lea             ecx, [edi + ebp]  
                                 call    i286_memoryread_w                                  call    i286_memoryread_w
                                 mov             word ptr i286core.s.IDTR, ax                                  mov             word ptr I286_IDTR, ax
                                 add             bp, 2                                  add             ecx, 2
                                 lea             ecx, [edi + ebp]  
                                 call    i286_memoryread_w                                  call    i286_memoryread_w
                                 mov             word ptr (i286core.s.IDTR+2), ax                                  mov             word ptr (I286_IDTR + 2), ax
                                 add             bp, 2                                  add             ecx, 2
                                 lea             ecx, [edi + ebp]                                  call    i286_memoryread
                                 call    i286_memoryread_w                                  mov             byte ptr (I286_IDTR + 4), al
                                 mov             word ptr (i286core.s.IDTR+4), ax  
                                 ret                                  ret
                                 align   4                                  align   4
                 register_eareg16:                  register_eareg16:
Line 111  I286 _lidt(void) { Line 230  I286 _lidt(void) {
                 }                  }
 }  }
   
   
 I286 _smsw(void) {  I286 _smsw(void) {
   
                 __asm {                  __asm {
                                 PREPART_EA16(3)                                  PREPART_EA16(3)
                                         mov             dx, i286core.s.MSW                                          mov             dx, I286_MSW
                                         mov             word ptr I286_REG[eax*2], dx                                          mov             word ptr I286_REG[eax*2], dx
                                         GET_NEXTPRE2                                          GET_NEXTPRE2
                                         ret                                          ret
                                 MEMORY_EA16(6)                                  MEMORY_EA16(6)
                                         mov             ax, i286core.s.MSW                                          mov             ax, I286_MSW
                                         mov             word ptr I286_MEM[ecx], ax                                          mov             word ptr I286_MEM[ecx], ax
                                         ret                                          ret
                                 extmem_eareg16:                                  extmem_eareg16:
                                         mov             dx, i286core.s.MSW                                          mov             dx, I286_MSW
                                         jmp             i286_memorywrite_w                                          jmp             i286_memorywrite_w
                 }                  }
 }  }
   
   
 I286 _lmsw(void) {  I286 _lmsw(void) {
   
                 __asm {                  __asm {
                                   and             I286_MSW, MSW_PE
                                 PREPART_EA16(2)                                  PREPART_EA16(2)
                                         mov             ax, word ptr I286_REG[eax*2]                                          mov             ax, word ptr I286_REG[eax*2]
                                         and             ax, 0ch                                          or              I286_MSW, ax
                                         mov             i286core.s.MSW, ax  
                                         GET_NEXTPRE2                                          GET_NEXTPRE2
                                         ret                                          ret
                                 MEMORY_EA16(3)                                  MEMORY_EA16(3)
                                         mov             ax, word ptr I286_MEM[ecx]                                          mov             ax, word ptr I286_MEM[ecx]
                                         and             ax, 0ch                                          or              I286_MSW, ax
                                         mov             i286core.s.MSW, ax  
                                         ret                                          ret
                                 EXTMEM_EA16                                  EXTMEM_EA16
                                         and             ax, 0ch                                          or              I286_MSW, ax
                                         mov             i286core.s.MSW, ax  
                                         ret                                          ret
                 }                  }
 }  }
   
   static const I286OP_0F cts1x_table[] = {
                           _sgdt,  _sidt,  _lgdt,  _lidt,
                           _smsw,  _smsw,  _lmsw,  _lmsw};
   
 static void (*cts1_xtable[])(void) = {  
                         _sgdt,                          _sidt,  
                         _lgdt,                          _lidt,  
                         _smsw,                          _smsw,  
                         _lmsw,                          _lmsw};  
   
   // ----
   
 I286EXT _xcts(void) {  I286EXT _xcts(void) {
   
Line 166  I286EXT _xcts(void) { Line 280  I286EXT _xcts(void) {
                                 mov             edi, esi                                  mov             edi, esi
                                 GET_NEXTPRE1                                  GET_NEXTPRE1
                                 test    bl, bl                                  test    bl, bl
                                 je              realmodeint6rm                                  je              short i286_cts0
                                 dec             bl                                  dec             bl
                                 je              i286_cts1                                  je              short i286_cts1
                                 sub             bl, 2                                  cmp             bl, (5 - 1)
                                 jnc             realmodeint6                                  je              short loadall286
                                   jmp             expint6
 realmodeint6rm: movzx   eax, bh  
                                 cmp             al, 0c0h  
                                 jnc             realmodeint6  
                                 call    p_get_ea[eax*4]  
   
                                 align   4                                  align   4
 realmodeint6:   cmp             bl, (5 - 3)  i286_cts0:              test    I286_MSW, MSW_PE
                                 je              loadall286                                  je              expint6
                                 mov             si, di                                  // ver0.27 このタイプ・・・                                  movzx   eax, bh
                                 I286CLOCK(20)                                   // 全部修正しなきゃ(汗                                  mov             edi, eax
                                 INT_NUM(6)                                              // i286とi386で挙動が違うから                                  shr             edi, 3-2
                                                                                                 // いやらしいね…                                  and             edi, 7*4
                                   jmp             cts0x_table[edi]
   
                                 align   4                                  align   4
 i286_cts1:              movzx   eax, bh  i286_cts1:              movzx   eax, bh
                                 mov             edi, eax                                  mov             edi, eax
                                 shr             edi, 3-2                                  shr             edi, 3-2
                                 and             edi, 7*4                                  and             edi, 7*4
                                 jmp             cts1_xtable[edi]                                  jmp             cts1x_table[edi]
   
                                 align   4                                  align   4
 loadall286:             I286CLOCK(195)  loadall286:             I286CLOCK(195)
                                 mov             ax, word ptr mem[0x0804]                // MSW                                  mov             ax, word ptr mem[0x0804]                // MSW
                                 mov             i286core.s.MSW, ax                                  mov             I286_MSW, ax
                                   mov             ax, word ptr mem[0x0816]                // TR
                                   mov             I286_TR, ax
                                 mov             ax, word ptr mem[0x0818]                // flag                                  mov             ax, word ptr mem[0x0818]                // flag
                                 mov             I286_FLAG, ax                                  mov             I286_FLAG, ax
                                 and             ah, 3                                  and             ah, 3
                                 cmp             ah, 3                                  cmp             ah, 3
                                 sete    I286_TRAP                                  sete    I286_TRAP
                                 mov             si, word ptr mem[0x081a]                // ip                                  mov             si, word ptr mem[0x081a]                // ip
                                   mov             ax, word ptr mem[0x081c]                // LDTR
                                   mov             I286_LDTR, ax
                                 mov             ax, word ptr mem[0x081e]                // ds                                  mov             ax, word ptr mem[0x081e]                // ds
                                 mov             I286_DS, ax                                  mov             I286_DS, ax
                                 mov             ax, word ptr mem[0x0820]                // ss                                  mov             ax, word ptr mem[0x0820]                // ss
Line 240  loadall286:  I286CLOCK(195) Line 356  loadall286:  I286CLOCK(195)
                                 mov             DS_BASE, eax                                  mov             DS_BASE, eax
                                 mov             DS_FIX, eax                                  mov             DS_FIX, eax
   
                                   mov             eax, dword ptr mem[0x084e]              // GDTR
                                   mov             dword ptr (I286_GDTR.base), eax
                                   mov             ax, word ptr mem[0x0852]
                                   mov             I286_GDTR.limit, ax
   
                                   mov             eax, dword ptr mem[0x0854]              // LDTRC
                                   mov             dword ptr (I286_LDTRC.base), eax
                                   mov             ax, word ptr mem[0x0858]
                                   mov             I286_LDTRC.limit, ax
   
                                   mov             eax, dword ptr mem[0x085a]              // IDTR
                                   mov             dword ptr (I286_IDTR.base), eax
                                   mov             ax, word ptr mem[0x085e]
                                   mov             I286_IDTR.limit, ax
   
                                   mov             eax, dword ptr mem[0x0860]              // TRC
                                   mov             dword ptr (I286_TRC.base), eax
                                   mov             ax, word ptr mem[0x0864]
                                   mov             I286_TRC.limit, ax
   
                                 RESET_XPREFETCH                                  RESET_XPREFETCH
                                 I286IRQCHECKTERM                                  I286IRQCHECKTERM
                 }  
                                   align   4
   expint6:                mov             si, di                                  // ver0.27 このタイプ・・・
                                   I286CLOCK(20)                                   // 全部修正しなきゃ(汗
                                   INT_NUM(6)                                              // i286とi386で挙動が違うから
                   }                                                                               // いやらしいね…
 }  }
   

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


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