Diff for /np2/i286c/i286c_f6.c between versions 1.8 and 1.16

version 1.8, 2003/11/29 00:36:00 version 1.16, 2005/02/07 14:46:10
Line 1 Line 1
 #include        "compiler.h"  #include        "compiler.h"
 #include        "i286.h"  #include        "cpucore.h"
 #include        "i286c.h"  #include        "i286c.h"
 #include        "memory.h"  
 #include        "i286c.mcr"  #include        "i286c.mcr"
   
   
Line 47  I286_F6 _not_ea8(UINT op) { Line 46  I286_F6 _not_ea8(UINT op) {
   
 I286_F6 _neg_ea8(UINT op) {  I286_F6 _neg_ea8(UINT op) {
   
         BYTE    *out;          UINT8   *out;
         UINT    src;          UINT    src;
         UINT    dst;          UINT    dst;
         UINT32  madr;          UINT32  madr;
Line 61  I286_F6 _neg_ea8(UINT op) { Line 60  I286_F6 _neg_ea8(UINT op) {
                 madr = CALC_EA(op);                  madr = CALC_EA(op);
                 if (madr >= I286_MEMWRITEMAX) {                  if (madr >= I286_MEMWRITEMAX) {
                         src = i286_memoryread(madr);                          src = i286_memoryread(madr);
                         BYTE_NEG(dst, src)                          NEGBYTE(dst, src)
                         i286_memorywrite(madr, (BYTE)dst);                          i286_memorywrite(madr, (REG8)dst);
                         return;                          return;
                 }                  }
                 out = mem + madr;                  out = mem + madr;
         }          }
         src = *out;          src = *out;
         BYTE_NEG(dst, src)          NEGBYTE(dst, src)
         *out = (BYTE)dst;          *out = (UINT8)dst;
 }  }
   
 I286_F6 _mul_ea8(UINT op) {  I286_F6 _mul_ea8(UINT op) {
   
         BYTE    src;          UINT8   src;
         UINT    res;          UINT    res;
   
         if (op >= 0xc0) {          if (op >= 0xc0) {
Line 91  I286_F6 _mul_ea8(UINT op) { Line 90  I286_F6 _mul_ea8(UINT op) {
   
 I286_F6 _imul_ea8(UINT op) {  I286_F6 _imul_ea8(UINT op) {
   
         BYTE    src;          UINT8   src;
         SINT32  res;          SINT32  res;
   
         if (op >= 0xc0) {          if (op >= 0xc0) {
Line 109  I286_F6 _imul_ea8(UINT op) { Line 108  I286_F6 _imul_ea8(UINT op) {
 I286_F6 _div_ea8(UINT op) {  I286_F6 _div_ea8(UINT op) {
   
         UINT16  tmp;          UINT16  tmp;
         BYTE    src;          UINT8   src;
         UINT16  ip;          UINT16  ip;
   
         ip = I286_IP;          ip = I286_IP;
         if (op >= 0xc0) {          if (op >= 0xc0) {
                 I286_WORKCLOCK(2);                  I286_WORKCLOCK(14);
                 src = *(REG8_B20(op));                  src = *(REG8_B20(op));
         }          }
         else {          else {
                 I286_WORKCLOCK(7);                  I286_WORKCLOCK(17);
                 src = i286_memoryread(CALC_EA(op));                  src = i286_memoryread(CALC_EA(op));
         }          }
         tmp = I286_AX;          tmp = I286_AX;
         if (tmp < ((UINT16)src << 8)) {          if ((src) && (tmp < ((UINT16)src << 8))) {
                 I286_AL = tmp / src;                  I286_AL = tmp / src;
                 I286_AH = tmp % src;                  I286_AH = tmp % src;
         }          }
Line 134  I286_F6 _div_ea8(UINT op) { Line 133  I286_F6 _div_ea8(UINT op) {
 I286_F6 _idiv_ea8(UINT op) {  I286_F6 _idiv_ea8(UINT op) {
   
         SINT16  tmp, r;          SINT16  tmp, r;
         char    src;          SINT8   src;
         UINT16  ip;          UINT16  ip;
   
         ip = I286_IP;          ip = I286_IP;
Line 143  I286_F6 _idiv_ea8(UINT op) { Line 142  I286_F6 _idiv_ea8(UINT op) {
                 src = *(REG8_B20(op));                  src = *(REG8_B20(op));
         }          }
         else {          else {
                 I286_WORKCLOCK(25);                  I286_WORKCLOCK(20);
                 src = i286_memoryread(CALC_EA(op));                  src = i286_memoryread(CALC_EA(op));
         }          }
         tmp = (SINT16)I286_AX;          tmp = (SINT16)I286_AX;
         if (src) {          if (src) {
                 r = tmp / src;                  r = tmp / src;
                 if (!((r + 0x80) & 0xff00)) {                  if (!((r + 0x80) & 0xff00)) {
                         I286_AL = (char)r;                          I286_AL = (UINT8)r;
                         I286_AH = tmp % src;                          I286_AH = tmp % src;
                         return;                          return;
                 }                  }
Line 214  I286_F6 _neg_ea16(UINT op) { Line 213  I286_F6 _neg_ea16(UINT op) {
                 madr = CALC_EA(op);                  madr = CALC_EA(op);
                 if (INHIBIT_WORDP(madr)) {                  if (INHIBIT_WORDP(madr)) {
                         src = i286_memoryread_w(madr);                          src = i286_memoryread_w(madr);
                         WORD_NEG(dst, src)                          NEGWORD(dst, src)
                         i286_memorywrite_w(madr, (REG16)dst);                          i286_memorywrite_w(madr, (REG16)dst);
                         return;                          return;
                 }                  }
                 out = (UINT16 *)(mem + madr);                  out = (UINT16 *)(mem + madr);
         }          }
         src = *out;          src = *out;
         WORD_NEG(dst, src)          NEGWORD(dst, src)
         *out = (UINT16)dst;          *out = (UINT16)dst;
 }  }
   
Line 269  I286_F6 _div_ea16(UINT op) { Line 268  I286_F6 _div_ea16(UINT op) {
   
         ip = I286_IP;          ip = I286_IP;
         if (op >= 0xc0) {          if (op >= 0xc0) {
                 I286_WORKCLOCK(17);                  I286_WORKCLOCK(22);
                 src = *(REG16_B20(op));                  src = *(REG16_B20(op));
         }          }
         else {          else {
Line 277  I286_F6 _div_ea16(UINT op) { Line 276  I286_F6 _div_ea16(UINT op) {
                 src = i286_memoryread_w(CALC_EA(op));                  src = i286_memoryread_w(CALC_EA(op));
         }          }
         tmp = (I286_DX << 16) + I286_AX;          tmp = (I286_DX << 16) + I286_AX;
         if (tmp < (src << 16)) {          if ((src) && (tmp < (src << 16))) {
                 I286_AX = (SINT16)(tmp / src);                  I286_AX = tmp / src;
                 I286_DX = (SINT16)(tmp % src);                  I286_DX = tmp % src;
         }          }
         else {          else {
                 INT_NUM(0, ip - 2);                                                                             // 80x86                  INT_NUM(0, ip - 2);                                                                             // 80x86
Line 295  I286_F6 _idiv_ea16(UINT op) { Line 294  I286_F6 _idiv_ea16(UINT op) {
   
         ip = I286_IP;          ip = I286_IP;
         if (op >= 0xc0) {          if (op >= 0xc0) {
                 I286_WORKCLOCK(17);                  I286_WORKCLOCK(25);
                 src = *(REG16_B20(op));                  src = *(REG16_B20(op));
         }          }
         else {          else {
                 I286_WORKCLOCK(25);                  I286_WORKCLOCK(28);
                 src = i286_memoryread_w(CALC_EA(op));                  src = i286_memoryread_w(CALC_EA(op));
         }          }
         tmp = (SINT32)((I286_DX << 16) + I286_AX);          tmp = (SINT32)((I286_DX << 16) + I286_AX);

Removed from v.1.8  
changed lines
  Added in v.1.16


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