|
|
| 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; |
| } | } |