Diff for /np2/i286c/i286c_f6.c between versions 1.1 and 1.3

version 1.1, 2003/10/16 17:57:45 version 1.3, 2003/10/17 11:10:02
Line 8 Line 8
   
 // ------------------------------------------------------------ opecode 0xf6,7  // ------------------------------------------------------------ opecode 0xf6,7
   
 I286_F6 _test_ea8_data8(DWORD op) {  I286_F6 _test_ea8_data8(UINT op) {
   
         DWORD   src, dst;          UINT    src;
           UINT    dst;
   
         if (op >= 0xc0) {          if (op >= 0xc0) {
                 I286_CLOCK(2);                  I286_CLOCK(2);
Line 24  I286_F6 _test_ea8_data8(DWORD op) { Line 25  I286_F6 _test_ea8_data8(DWORD op) {
         ANDBYTE(dst, src)          ANDBYTE(dst, src)
 }  }
   
 I286_F6 _not_ea8(DWORD op) {  I286_F6 _not_ea8(UINT op) {
   
         DWORD   madr;          UINT32  madr;
   
         if (op >= 0xc0) {          if (op >= 0xc0) {
                 I286_CLOCK(2);                  I286_CLOCK(2);
Line 45  I286_F6 _not_ea8(DWORD op) { Line 46  I286_F6 _not_ea8(DWORD op) {
         }          }
 }  }
   
 I286_F6 _neg_ea8(DWORD op) {  I286_F6 _neg_ea8(UINT op) {
   
         BYTE    *out;          BYTE    *out;
         DWORD   src, dst, madr;          UINT    src;
           UINT    dst;
           UINT32  madr;
   
         if (op >= 0xc0) {          if (op >= 0xc0) {
                 I286_CLOCK(2);                  I286_CLOCK(2);
Line 70  I286_F6 _neg_ea8(DWORD op) { Line 73  I286_F6 _neg_ea8(DWORD op) {
         *out = (BYTE)dst;          *out = (BYTE)dst;
 }  }
   
 I286_F6 _mul_ea8(DWORD op) {  I286_F6 _mul_ea8(UINT op) {
   
         BYTE    src;          BYTE    src;
         DWORD   res;          UINT    res;
   
         if (op >= 0xc0) {          if (op >= 0xc0) {
                 I286_CLOCK(13);                  I286_CLOCK(13);
Line 84  I286_F6 _mul_ea8(DWORD op) { Line 87  I286_F6 _mul_ea8(DWORD op) {
                 src = i286_memoryread(c_calc_ea_dst[op]());                  src = i286_memoryread(c_calc_ea_dst[op]());
         }          }
         BYTE_MUL(res, I286_AL, src)          BYTE_MUL(res, I286_AL, src)
         I286_AX = (WORD)res;          I286_AX = (UINT16)res;
 }  }
   
 I286_F6 _imul_ea8(DWORD op) {  I286_F6 _imul_ea8(UINT op) {
   
         BYTE    src;          BYTE    src;
         long    res;          SINT32  res;
   
         if (op >= 0xc0) {          if (op >= 0xc0) {
                 I286_CLOCK(13);                  I286_CLOCK(13);
Line 101  I286_F6 _imul_ea8(DWORD op) { Line 104  I286_F6 _imul_ea8(DWORD op) {
                 src = i286_memoryread(c_calc_ea_dst[op]());                  src = i286_memoryread(c_calc_ea_dst[op]());
         }          }
         BYTE_IMUL(res, I286_AL, src)          BYTE_IMUL(res, I286_AL, src)
         I286_AX = (WORD)res;          I286_AX = (UINT16)res;
 }  }
   
 I286_F6 _div_ea8(DWORD op) {  I286_F6 _div_ea8(UINT op) {
   
         WORD    tmp;          UINT16  tmp;
         BYTE    src;          BYTE    src;
         WORD    ip;          UINT16  ip;
   
         ip = I286_IP;          ip = I286_IP;
         if (op >= 0xc0) {          if (op >= 0xc0) {
Line 120  I286_F6 _div_ea8(DWORD op) { Line 123  I286_F6 _div_ea8(DWORD op) {
                 src = i286_memoryread(c_calc_ea_dst[op]());                  src = i286_memoryread(c_calc_ea_dst[op]());
         }          }
         tmp = I286_AX;          tmp = I286_AX;
         if (tmp < ((WORD)src << 8)) {          if (tmp < ((UINT16)src << 8)) {
                 I286_AL = tmp / src;                  I286_AL = tmp / src;
                 I286_AH = tmp % src;                  I286_AH = tmp % src;
         }          }
Line 129  I286_F6 _div_ea8(DWORD op) { Line 132  I286_F6 _div_ea8(DWORD op) {
         }          }
 }  }
   
 I286_F6 _idiv_ea8(DWORD op) {  I286_F6 _idiv_ea8(UINT op) {
   
         short   tmp, r;          SINT16  tmp, r;
         char    src;          char    src;
         WORD    ip;          UINT16  ip;
   
         ip = I286_IP;          ip = I286_IP;
         if (op >= 0xc0) {          if (op >= 0xc0) {
Line 144  I286_F6 _idiv_ea8(DWORD op) { Line 147  I286_F6 _idiv_ea8(DWORD op) {
                 I286_CLOCK(25);                  I286_CLOCK(25);
                 src = i286_memoryread(c_calc_ea_dst[op]());                  src = i286_memoryread(c_calc_ea_dst[op]());
         }          }
         tmp = (short)I286_AX;          tmp = (SINT16)I286_AX;
         if (src) {          if (src) {
                 r = tmp / src;                  r = tmp / src;
                 if (!((r + 0x80) & 0xff00)) {                  if (!((r + 0x80) & 0xff00)) {
Line 157  I286_F6 _idiv_ea8(DWORD op) { Line 160  I286_F6 _idiv_ea8(DWORD op) {
 }  }
   
   
 I286_F6 _test_ea16_data16(DWORD op) {  I286_F6 _test_ea16_data16(UINT op) {
   
         DWORD   src, dst;          UINT32  src;
           UINT32  dst;
   
         if (op >= 0xc0) {          if (op >= 0xc0) {
                 I286_CLOCK(2);                  I286_CLOCK(2);
Line 173  I286_F6 _test_ea16_data16(DWORD op) { Line 177  I286_F6 _test_ea16_data16(DWORD op) {
         ANDWORD(dst, src)          ANDWORD(dst, src)
 }  }
   
 I286_F6 _not_ea16(DWORD op) {  I286_F6 _not_ea16(UINT op) {
   
         DWORD   madr;          UINT32  madr;
   
         if (op >= 0xc0) {          if (op >= 0xc0) {
                 I286_CLOCK(2);                  I286_CLOCK(2);
Line 188  I286_F6 _not_ea16(DWORD op) { Line 192  I286_F6 _not_ea16(DWORD op) {
                         *(mem + madr) ^= 0xffff;                          *(mem + madr) ^= 0xffff;
                 }                  }
                 else {                  else {
                         WORD value = i286_memoryread_w(madr);                          UINT16 value = i286_memoryread_w(madr);
                         value = ~value;                          value = ~value;
                         i286_memorywrite_w(madr, value);                          i286_memorywrite_w(madr, value);
                 }                  }
         }          }
 }  }
   
 I286_F6 _neg_ea16(DWORD op) {  I286_F6 _neg_ea16(UINT op) {
   
         WORD    *out;          UINT16  *out;
         DWORD   src, dst, madr;          UINT32  src;
           UINT32  dst;
           UINT32  madr;
   
         if (op >= 0xc0) {          if (op >= 0xc0) {
                 I286_CLOCK(2);                  I286_CLOCK(2);
Line 210  I286_F6 _neg_ea16(DWORD op) { Line 216  I286_F6 _neg_ea16(DWORD op) {
                 if (INHIBIT_WORDP(madr)) {                  if (INHIBIT_WORDP(madr)) {
                         src = i286_memoryread_w(madr);                          src = i286_memoryread_w(madr);
                         WORD_NEG(dst, src)                          WORD_NEG(dst, src)
                         i286_memorywrite_w(madr, (WORD)dst);                          i286_memorywrite_w(madr, (UINT16)dst);
                         return;                          return;
                 }                  }
                 out = (WORD *)(mem + madr);                  out = (UINT16 *)(mem + madr);
         }          }
         src = *out;          src = *out;
         WORD_NEG(dst, src)          WORD_NEG(dst, src)
         *out = (WORD)dst;          *out = (UINT16)dst;
 }  }
   
 I286_F6 _mul_ea16(DWORD op) {  I286_F6 _mul_ea16(UINT op) {
   
         WORD    src;          UINT16  src;
         DWORD   res;          UINT32  res;
   
         if (op >= 0xc0) {          if (op >= 0xc0) {
                 I286_CLOCK(21);                  I286_CLOCK(21);
Line 234  I286_F6 _mul_ea16(DWORD op) { Line 240  I286_F6 _mul_ea16(DWORD op) {
                 src = i286_memoryread_w(c_calc_ea_dst[op]());                  src = i286_memoryread_w(c_calc_ea_dst[op]());
         }          }
         WORD_MUL(res, I286_AX, src)          WORD_MUL(res, I286_AX, src)
         I286_AX = (WORD)res;          I286_AX = (UINT16)res;
         I286_DX = (WORD)(res >> 16);          I286_DX = (UINT16)(res >> 16);
 }  }
   
 I286_F6 _imul_ea16(DWORD op) {  I286_F6 _imul_ea16(UINT op) {
   
         short   src;          SINT16  src;
         long    res;          SINT32  res;
   
         if (op >= 0xc0) {          if (op >= 0xc0) {
                 I286_CLOCK(21);                  I286_CLOCK(21);
Line 252  I286_F6 _imul_ea16(DWORD op) { Line 258  I286_F6 _imul_ea16(DWORD op) {
                 src = i286_memoryread_w(c_calc_ea_dst[op]());                  src = i286_memoryread_w(c_calc_ea_dst[op]());
         }          }
         WORD_IMUL(res, I286_AX, src)          WORD_IMUL(res, I286_AX, src)
         I286_AX = (WORD)res;          I286_AX = (UINT16)res;
         I286_DX = (WORD)(res >> 16);          I286_DX = (UINT16)(res >> 16);
 }  }
   
 I286_F6 _div_ea16(DWORD op) {  I286_F6 _div_ea16(UINT op) {
   
         DWORD   tmp;          UINT32  tmp;
         WORD    src;          UINT32  src;
         WORD    ip;          UINT16  ip;
   
         ip = I286_IP;          ip = I286_IP;
         if (op >= 0xc0) {          if (op >= 0xc0) {
Line 271  I286_F6 _div_ea16(DWORD op) { Line 277  I286_F6 _div_ea16(DWORD op) {
                 I286_CLOCK(25);                  I286_CLOCK(25);
                 src = i286_memoryread_w(c_calc_ea_dst[op]());                  src = i286_memoryread_w(c_calc_ea_dst[op]());
         }          }
         tmp = ((DWORD)I286_DX << 16) | I286_AX;          tmp = (I286_DX << 16) + I286_AX;
         if (tmp < ((DWORD)src << 16)) {          if (tmp < (src << 16)) {
                 I286_AX = (short)(tmp / src);                  I286_AX = (SINT16)(tmp / src);
                 I286_DX = (short)(tmp % src);                  I286_DX = (SINT16)(tmp % src);
         }          }
         else {          else {
                 INT_NUM(0, ip - 2);                                                                             // 80x86                  INT_NUM(0, ip - 2);                                                                             // 80x86
         }          }
 }  }
   
 I286_F6 _idiv_ea16(DWORD op) {  I286_F6 _idiv_ea16(UINT op) {
   
         long    tmp, r;          SINT32  tmp;
         short   src;          SINT32  r;
         WORD    ip;          SINT16  src;
           UINT16  ip;
   
         ip = I286_IP;          ip = I286_IP;
         if (op >= 0xc0) {          if (op >= 0xc0) {
Line 296  I286_F6 _idiv_ea16(DWORD op) { Line 303  I286_F6 _idiv_ea16(DWORD op) {
                 I286_CLOCK(25);                  I286_CLOCK(25);
                 src = i286_memoryread_w(c_calc_ea_dst[op]());                  src = i286_memoryread_w(c_calc_ea_dst[op]());
         }          }
         tmp = (long)(((DWORD)I286_DX << 16) | I286_AX);          tmp = (SINT32)((I286_DX << 16) + I286_AX);
         if (src) {          if (src) {
                 r = tmp / src;                  r = tmp / src;
                 if (!((r + 0x8000) & 0xffff0000)) {                  if (!((r + 0x8000) & 0xffff0000)) {
                         I286_AX = (short)r;                          I286_AX = (SINT16)r;
                         I286_DX = tmp % src;                          I286_DX = tmp % src;
                         return;                          return;
                 }                  }

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


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