Diff for /np2/i286x/i286xs.cpp between versions 1.1.1.1 and 1.7

version 1.1.1.1, 2003/10/16 17:57:28 version 1.7, 2004/08/03 10:11:37
Line 1 Line 1
 #include        "compiler.h"  #include        "compiler.h"
 #include        "nevent.h"  #include        "cpucore.h"
 #include        "i286.h"  
 #include        "i286x.h"  #include        "i286x.h"
 #include        "i286xadr.h"  #include        "i286xadr.h"
 #include        "memory.h"  #include        "i286xs.h"
 #include        "i286x.mcr"  #include        "i286x.mcr"
 #include        "i286xea.mcr"  #include        "i286xea.mcr"
   
Line 163  I286 cmp_ext8_i(void) { Line 162  I286 cmp_ext8_i(void) {
   
   
                                                                         // dest: I286_REG[eax] src: dl                                                                          // dest: I286_REG[eax] src: dl
 void (*op8xreg8_xtable[])(void) = {  const I286TBL op8xreg8_xtable[8] = {
                 add_r8_i,               or_r8_i,                adc_r8_i,               sbb_r8_i,                  add_r8_i,               or_r8_i,                adc_r8_i,               sbb_r8_i,
                 and_r8_i,               sub_r8_i,               xor_r8_i,               cmp_r8_i};                  and_r8_i,               sub_r8_i,               xor_r8_i,               cmp_r8_i};
   
                                                                         // dest: ecx  src: dl                                                                          // dest: ecx  src: dl
 void (*op8xext8_xtable[])(void) = {  const I286TBL op8xext8_xtable[8] = {
                 add_ext8_i,             or_ext8_i,              adc_ext8_i,             sbb_ext8_i,                  add_ext8_i,             or_ext8_i,              adc_ext8_i,             sbb_ext8_i,
                 and_ext8_i,             sub_ext8_i,             xor_ext8_i,             cmp_ext8_i};                  and_ext8_i,             sub_ext8_i,             xor_ext8_i,             cmp_ext8_i};
   
Line 330  I286 cmp_ext16_i(void) { Line 329  I286 cmp_ext16_i(void) {
   
   
                                                                         // dest: ebp src: bx                                                                          // dest: ebp src: bx
 void (*op8xreg16_xtable[])(void) = {  const I286TBL op8xreg16_xtable[8] = {
                 add_r16_i,              or_r16_i,               adc_r16_i,              sbb_r16_i,                  add_r16_i,              or_r16_i,               adc_r16_i,              sbb_r16_i,
                 and_r16_i,              sub_r16_i,              xor_r16_i,              cmp_r16_i};                  and_r16_i,              sub_r16_i,              xor_r16_i,              cmp_r16_i};
   
                                                                         // dest: [ecx]=dx  src: bx                                                                          // dest: [ecx]=dx  src: bx
 void (*op8xext16_xtable[])(void) = {  const I286TBL op8xext16_xtable[8] = {
                 add_ext16_i,    or_ext16_i,             adc_ext16_i,    sbb_ext16_i,                  add_ext16_i,    or_ext16_i,             adc_ext16_i,    sbb_ext16_i,
                 and_ext16_i,    sub_ext16_i,    xor_ext16_i,    cmp_ext16_i};                  and_ext16_i,    sub_ext16_i,    xor_ext16_i,    cmp_ext16_i};
   
Line 418  I286 cmp_ext16a_i(void) { Line 417  I286 cmp_ext16a_i(void) {
 }  }
   
                                                                         // dest: [ecx]=dx  src: ax                                                                          // dest: [ecx]=dx  src: ax
 void (*op8xext16_atable[])(void) = {  const I286TBL op8xext16_atable[8] = {
                 add_ext16a_i,   or_ext16a_i,    adc_ext16a_i,   sbb_ext16a_i,                  add_ext16a_i,   or_ext16a_i,    adc_ext16a_i,   sbb_ext16a_i,
                 and_ext16a_i,   sub_ext16a_i,   xor_ext16a_i,   cmp_ext16a_i};                  and_ext16a_i,   sub_ext16a_i,   xor_ext16a_i,   cmp_ext16a_i};
   
Line 663  I286 sar_ext8_1(void) { Line 662  I286 sar_ext8_1(void) {
 }  }
   
   
 void (*sftreg8_xtable[])(void) = {  const I286TBL sftreg8_xtable[8] = {
                 rol_r8_1,               ror_r8_1,               rcl_r8_1,               rcr_r8_1,                  rol_r8_1,               ror_r8_1,               rcl_r8_1,               rcr_r8_1,
                 shl_r8_1,               shr_r8_1,               shl_r8_1,               sar_r8_1};                  shl_r8_1,               shr_r8_1,               shl_r8_1,               sar_r8_1};
   
 void (*sftmem8_xtable[])(void) = {  const I286TBL sftmem8_xtable[8] = {
                 rol_mem8_1,             ror_mem8_1,             rcl_mem8_1,             rcr_mem8_1,                  rol_mem8_1,             ror_mem8_1,             rcl_mem8_1,             rcr_mem8_1,
                 shl_mem8_1,             shr_mem8_1,             shl_mem8_1,             sar_mem8_1};                  shl_mem8_1,             shr_mem8_1,             shl_mem8_1,             sar_mem8_1};
   
 void (*sftext8_xtable[])(void) = {  const I286TBL sftext8_xtable[8] = {
                 rol_ext8_1,             ror_ext8_1,             rcl_ext8_1,             rcr_ext8_1,                  rol_ext8_1,             ror_ext8_1,             rcl_ext8_1,             rcr_ext8_1,
                 shl_ext8_1,             shr_ext8_1,             shl_ext8_1,             sar_ext8_1};                  shl_ext8_1,             shr_ext8_1,             shl_ext8_1,             sar_ext8_1};
   
Line 916  I286 sar_ext16_1(void) { Line 915  I286 sar_ext16_1(void) {
 }  }
   
   
 void (*sftreg16_xtable[])(void) = {  const I286TBL sftreg16_xtable[8] = {
                 rol_r16_1,              ror_r16_1,              rcl_r16_1,              rcr_r16_1,                  rol_r16_1,              ror_r16_1,              rcl_r16_1,              rcr_r16_1,
                 shl_r16_1,              shr_r16_1,              shl_r16_1,              sar_r16_1};                  shl_r16_1,              shr_r16_1,              shl_r16_1,              sar_r16_1};
   
 void (*sftmem16_xtable[])(void) = {  const I286TBL sftmem16_xtable[8] = {
                 rol_mem16_1,    ror_mem16_1,    rcl_mem16_1,    rcr_mem16_1,                  rol_mem16_1,    ror_mem16_1,    rcl_mem16_1,    rcr_mem16_1,
                 shl_mem16_1,    shr_mem16_1,    shl_mem16_1,    sar_mem16_1};                  shl_mem16_1,    shr_mem16_1,    shl_mem16_1,    sar_mem16_1};
   
 void (*sftext16_xtable[])(void) = {  const I286TBL sftext16_xtable[8] = {
                 rol_ext16_1,    ror_ext16_1,    rcl_ext16_1,    rcr_ext16_1,                  rol_ext16_1,    ror_ext16_1,    rcl_ext16_1,    rcr_ext16_1,
                 shl_ext16_1,    shr_ext16_1,    shl_ext16_1,    sar_ext16_1};                  shl_ext16_1,    shr_ext16_1,    shl_ext16_1,    sar_ext16_1};
   
Line 1098  I286 sar_ext8_cl(void) { Line 1097  I286 sar_ext8_cl(void) {
 }  }
   
   
 void (*sftreg8cl_xtable[])(void) = {  const I286TBL sftreg8cl_xtable[8] = {
                 rol_r8_cl,              ror_r8_cl,              rcl_r8_cl,              rcr_r8_cl,                  rol_r8_cl,              ror_r8_cl,              rcl_r8_cl,              rcr_r8_cl,
                 shl_r8_cl,              shr_r8_cl,              shl_r8_cl,              sar_r8_cl};                  shl_r8_cl,              shr_r8_cl,              shl_r8_cl,              sar_r8_cl};
   
 void (*sftext8cl_xtable[])(void) = {  const I286TBL sftext8cl_xtable[8] = {
                 rol_ext8_cl,    ror_ext8_cl,    rcl_ext8_cl,    rcr_ext8_cl,                  rol_ext8_cl,    ror_ext8_cl,    rcl_ext8_cl,    rcr_ext8_cl,
                 shl_ext8_cl,    shr_ext8_cl,    shl_ext8_cl,    sar_ext8_cl};                  shl_ext8_cl,    shr_ext8_cl,    shl_ext8_cl,    sar_ext8_cl};
   
Line 1276  I286 sar_ext16_cl(void) { Line 1275  I286 sar_ext16_cl(void) {
 }  }
   
   
 void (*sftreg16cl_xtable[])(void) = {  const I286TBL sftreg16cl_xtable[8] = {
                 rol_r16_cl,             ror_r16_cl,             rcl_r16_cl,             rcr_r16_cl,                  rol_r16_cl,             ror_r16_cl,             rcl_r16_cl,             rcr_r16_cl,
                 shl_r16_cl,             shr_r16_cl,             shl_r16_cl,             sar_r16_cl};                  shl_r16_cl,             shr_r16_cl,             shl_r16_cl,             sar_r16_cl};
   
 void (*sftext16cl_xtable[])(void) = {  const I286TBL sftext16cl_xtable[8] = {
                 rol_ext16_cl,   ror_ext16_cl,   rcl_ext16_cl,   rcr_ext16_cl,                  rol_ext16_cl,   ror_ext16_cl,   rcl_ext16_cl,   rcr_ext16_cl,
                 shl_ext16_cl,   shr_ext16_cl,   shl_ext16_cl,   sar_ext16_cl};                  shl_ext16_cl,   shr_ext16_cl,   shl_ext16_cl,   sar_ext16_cl};
   
Line 1398  I286 imul_ea8(void) { Line 1397  I286 imul_ea8(void) {
 I286 div_ea8(void) {  I286 div_ea8(void) {
   
                 __asm {                  __asm {
                                   push    esi
                                 PREPART_EA8(14)                                  PREPART_EA8(14)
                                         movzx   ebp, byte ptr I286_REG[eax]                                          movzx   ebp, byte ptr I286_REG[eax]
                                         GET_NEXTPRE2                                          GET_NEXTPRE2
                                         jmp             divcheck                                          jmp             divcheck
                                 MEMORY_EA8(22)                                  MEMORY_EA8(17)
                                         movzx   ebp, byte ptr I286_MEM[ecx]                                          movzx   ebp, byte ptr I286_MEM[ecx]
                                         jmp             divcheck                                          jmp             divcheck
                                 EXTMEM_EA8                                  EXTMEM_EA8
                                         movzx   ebp, al                                          movzx   ebp, al
                                         align   4  
                 divcheck:                                  align   4
                                         test    ebp, ebp          divcheck:       test    ebp, ebp
                                         je              divovf                                  je              divovf
                                         mov             ax, I286_AX                                  mov             ax, I286_AX
                                         xor             dx, dx                                  xor             dx, dx
                                         div             bp                                  div             bp
                                         mov             I286_AL, al                                  mov             I286_AL, al
                                         mov             I286_AH, dl                                  mov             I286_AH, dl
                                         mov             dx, ax                                  mov             dx, ax
                                         FLAG_STORE_OF                                  FLAG_STORE_OF
                                         test    dh, dh                                  test    dh, dh
                                         jne             divovf                                  jne             divovf
                                         ret                                  pop             eax
                                         align   4                                  ret
                 divovf:  
                                         INT_NUM(0)                                  align   4
           divovf:         pop             esi
                                   INT_NUM(0)
                 }                  }
 }  }
   
 I286 idiv_ea8(void) {  I286 idiv_ea8(void) {
   
                 __asm {                  __asm {
                                   push    esi
                                 PREPART_EA8(17)                                  PREPART_EA8(17)
                                         movsx   ebp, byte ptr I286_REG[eax]                                          movsx   ebp, byte ptr I286_REG[eax]
                                         GET_NEXTPRE2                                          GET_NEXTPRE2
                                         jmp             idivcheck                                          jmp             idivcheck
                                 MEMORY_EA8(25)                                  MEMORY_EA8(20)
                                         movsx   ebp, byte ptr I286_MEM[ecx]                                          movsx   ebp, byte ptr I286_MEM[ecx]
                                         jmp             idivcheck                                          jmp             idivcheck
                                 EXTMEM_EA8                                  EXTMEM_EA8
                                         movsx   ebp, al                                          movsx   ebp, al
                                         align   4  
                 idivcheck:                                  align   4
                                         test    ebp, ebp          idivcheck:      test    ebp, ebp
                                         je              idivovf                                  je              idivovf
                                         mov             ax, I286_AX                                  mov             ax, I286_AX
                                         cwd                                  cwd
                                         idiv    bp                                  idiv    bp
                                         mov             I286_AL, al                                  mov             I286_AL, al
                                         mov             I286_AH, dl                                  mov             I286_AH, dl
                                         mov             dx, ax                                  mov             dx, ax
                                         FLAG_STORE_OF                                  FLAG_STORE_OF
                                         bt              dx, 7                                  bt              dx, 7
                                         adc             dh, 0                                  adc             dh, 0
                                         jne             idivovf                                  jne             idivovf
                                         ret                                  pop             eax
                                         align   4                                  ret
                 idivovf:  
                                         INT_NUM(0)                                  align   4
           idivovf:        pop             esi
                                   INT_NUM(0)
                 }                  }
 }  }
   
Line 1577  I286 imul_ea16(void) { Line 1582  I286 imul_ea16(void) {
 I286 div_ea16(void) {  I286 div_ea16(void) {
   
                 __asm {                  __asm {
                                 PREPART_EA16(17)                                  push    esi
                                   PREPART_EA16(22)
                                         movzx   ebp, word ptr I286_REG[eax*2]                                          movzx   ebp, word ptr I286_REG[eax*2]
                                         GET_NEXTPRE2                                          GET_NEXTPRE2
                                         jmp             divcheck                                          jmp             divcheck
Line 1586  I286 div_ea16(void) { Line 1592  I286 div_ea16(void) {
                                         jmp             divcheck                                          jmp             divcheck
                                 EXTMEM_EA16                                  EXTMEM_EA16
                                         movzx   ebp, ax                                          movzx   ebp, ax
                                         align   4  
                 divcheck:                                  align   4
                                         test    ebp, ebp          divcheck:       test    ebp, ebp
                                         je              divovf                                  je              divovf
                                         movzx   eax, I286_DX                                  movzx   eax, I286_DX
                                         shl             eax, 16                                  shl             eax, 16
                                         mov             ax, I286_AX                                  mov             ax, I286_AX
                                         xor             edx, edx                                  xor             edx, edx
                                         div             ebp                                  div             ebp
                                         mov             I286_AX, ax                                  mov             I286_AX, ax
                                         mov             I286_DX, dx                                  mov             I286_DX, dx
                                         FLAG_STORE_OF                                  FLAG_STORE_OF
                                         cmp             eax, 10000h                                  cmp             eax, 10000h
                                         jae             divovf                                  jae             divovf
                                         ret                                  pop             eax
                                         align   4                                  ret
                         divovf:  
                                         INT_NUM(0)                                  align   4
           divovf:         pop             esi
                                   INT_NUM(0)
                 }                  }
 }  }
   
 I286 idiv_ea16(void) {  I286 idiv_ea16(void) {
   
                 __asm {                  __asm {
                                 PREPART_EA16(20)                                  push    esi
                                   PREPART_EA16(25)
                                         movsx   ebp, word ptr I286_REG[eax*2]                                          movsx   ebp, word ptr I286_REG[eax*2]
                                         GET_NEXTPRE2                                          GET_NEXTPRE2
                                         jmp             idivcheck                                          jmp             idivcheck
Line 1620  I286 idiv_ea16(void) { Line 1629  I286 idiv_ea16(void) {
                                 EXTMEM_EA16                                  EXTMEM_EA16
                                         cwde                                          cwde
                                         mov             ebp, eax                                          mov             ebp, eax
                                         align   4  
                 idivcheck:                                  align   4
                                         test    ebp, ebp          idivcheck:      test    ebp, ebp
                                         je              idivovf                                  je              idivovf
                                         movzx   eax, I286_DX                                  movzx   eax, I286_DX
                                         shl             eax, 16                                  shl             eax, 16
                                         mov             ax, I286_AX                                  mov             ax, I286_AX
                                         cdq                                  cdq
                                         idiv    ebp                                  idiv    ebp
                                         mov             I286_AX, ax                                  mov             I286_AX, ax
                                         mov             I286_DX, dx                                  mov             I286_DX, dx
                                         mov             edx, eax                                  mov             edx, eax
                                         FLAG_STORE_OF                                  FLAG_STORE_OF
                                         shr             edx, 16                                  shr             edx, 16
                                         adc             dx, 0                                  adc             dx, 0
                                         jne             idivovf                                  jne             idivovf
                                         ret                                  pop             eax
                                         align   4                                  ret
                 idivovf:  
                                         INT_NUM(0)                                  align   4
           idivovf:        pop             esi
                                   INT_NUM(0)
                 }                  }
 }  }
   
 void (*ope0xf6_xtable[])(void) = {  const I286TBL ope0xf6_xtable[8] = {
                         test_ea8_data8,         test_ea8_data8,                          test_ea8_data8,         test_ea8_data8,
                         not_ea8,                        neg_ea8,                          not_ea8,                        neg_ea8,
                         mul_ea8,                        imul_ea8,                          mul_ea8,                        imul_ea8,
                         div_ea8,                        idiv_ea8};                          div_ea8,                        idiv_ea8};
   
 void (*ope0xf7_xtable[])(void) = {  const I286TBL ope0xf7_xtable[8] = {
                         test_ea16_data16,       test_ea16_data16,                          test_ea16_data16,       test_ea16_data16,
                         not_ea16,                       neg_ea16,                          not_ea16,                       neg_ea16,
                         mul_ea16,                       imul_ea16,                          mul_ea16,                       imul_ea16,
Line 1794  I286 call_far_ea16(void) { Line 1805  I286 call_far_ea16(void) {
                                 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 call_far_pe
                                 shl             eax, 4                                  // make segreg                                  shl             eax, 4                                  // make segreg
                                 mov             CS_BASE, eax  call_far_base:  mov             CS_BASE, eax
                                 RESET_XPREFETCH                                  RESET_XPREFETCH
                                 ret                                  ret
                                 align   4  
                 register_eareg16:  call_far_pe:    push    offset call_far_base
                                   jmp             i286x_selector
   
   register_eareg16:
                                 INT_NUM(6)                                  INT_NUM(6)
                 }                  }
 }  }
Line 1839  I286 jmp_far_ea16(void) { Line 1855  I286 jmp_far_ea16(void) {
                                 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 jmp_far_pe
                                 shl             eax, 4                                  // make segreg                                  shl             eax, 4                                  // make segreg
                                 mov             CS_BASE, eax  jmp_far_base:   mov             CS_BASE, eax
                                 RESET_XPREFETCH                                  RESET_XPREFETCH
                                 ret                                  ret
                                 align   4  
                 register_eareg16:  jmp_far_pe:             push    offset jmp_far_base
                                   jmp             i286x_selector
   
   register_eareg16:
                                 INT_NUM(6)                                  INT_NUM(6)
                 }                  }
 }  }
Line 1898  I286 pop_ea16(void) { Line 1919  I286 pop_ea16(void) {
 }  }
   
   
 void (*ope0xfe_xtable[])(void) = {  const I286TBL ope0xfe_xtable[2] = {
                         inc_ea8,                        dec_ea8};                          inc_ea8,                        dec_ea8};
   
 void (*ope0xff_xtable[])(void) = {  const I286TBL ope0xff_xtable[8] = {
                         inc_ea16,                       dec_ea16,                          inc_ea16,                       dec_ea16,
                         call_ea16,                      call_far_ea16,                          call_ea16,                      call_far_ea16,
                         jmp_ea16,                       jmp_far_ea16,                          jmp_ea16,                       jmp_far_ea16,

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


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