--- np2/i286c/i286c_f6.c 2003/10/16 17:57:45 1.1.1.1 +++ np2/i286c/i286c_f6.c 2005/02/07 14:46:10 1.16 @@ -1,43 +1,42 @@ #include "compiler.h" -#include "i286.h" +#include "cpucore.h" #include "i286c.h" #include "i286c.mcr" -#include "memory.h" -#include "nevent.h" // ------------------------------------------------------------ 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) { - I286_CLOCK(2); - dst = *(reg8_b20[op]); + I286_WORKCLOCK(2); + dst = *(REG8_B20(op)); } else { - I286_CLOCK(6); - dst = i286_memoryread(c_calc_ea_dst[op]()); + I286_WORKCLOCK(6); + dst = i286_memoryread(CALC_EA(op)); } GET_PCBYTE(src) ANDBYTE(dst, src) } -I286_F6 _not_ea8(DWORD op) { +I286_F6 _not_ea8(UINT op) { - DWORD madr; + UINT32 madr; if (op >= 0xc0) { - I286_CLOCK(2); - *(reg8_b20[op]) ^= 0xff; + I286_WORKCLOCK(2); + *(REG8_B20(op)) ^= 0xff; } else { - I286_CLOCK(7); - madr = c_calc_ea_dst[op](); + I286_WORKCLOCK(7); + madr = CALC_EA(op); if (madr >= I286_MEMWRITEMAX) { - BYTE value = i286_memoryread(madr); - value = ~value; + REG8 value = i286_memoryread(madr); + value ^= 0xff; i286_memorywrite(madr, value); return; } @@ -45,82 +44,84 @@ I286_F6 _not_ea8(DWORD op) { } } -I286_F6 _neg_ea8(DWORD op) { +I286_F6 _neg_ea8(UINT op) { - BYTE *out; - DWORD src, dst, madr; + UINT8 *out; + UINT src; + UINT dst; + UINT32 madr; if (op >= 0xc0) { - I286_CLOCK(2); - out = reg8_b20[op]; + I286_WORKCLOCK(2); + out = REG8_B20(op); } else { - I286_CLOCK(7); - madr = c_calc_ea_dst[op](); + I286_WORKCLOCK(7); + madr = CALC_EA(op); if (madr >= I286_MEMWRITEMAX) { src = i286_memoryread(madr); - BYTE_NEG(dst, src) - i286_memorywrite(madr, (BYTE)dst); + NEGBYTE(dst, src) + i286_memorywrite(madr, (REG8)dst); return; } out = mem + madr; } src = *out; - BYTE_NEG(dst, src) - *out = (BYTE)dst; + NEGBYTE(dst, src) + *out = (UINT8)dst; } -I286_F6 _mul_ea8(DWORD op) { +I286_F6 _mul_ea8(UINT op) { - BYTE src; - DWORD res; + UINT8 src; + UINT res; if (op >= 0xc0) { - I286_CLOCK(13); - src = *(reg8_b20[op]); + I286_WORKCLOCK(13); + src = *(REG8_B20(op)); } else { - I286_CLOCK(16); - src = i286_memoryread(c_calc_ea_dst[op]()); + I286_WORKCLOCK(16); + src = i286_memoryread(CALC_EA(op)); } 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; - long res; + UINT8 src; + SINT32 res; if (op >= 0xc0) { - I286_CLOCK(13); - src = *(reg8_b20[op]); + I286_WORKCLOCK(13); + src = *(REG8_B20(op)); } else { - I286_CLOCK(16); - src = i286_memoryread(c_calc_ea_dst[op]()); + I286_WORKCLOCK(16); + src = i286_memoryread(CALC_EA(op)); } 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; - BYTE src; - WORD ip; + UINT16 tmp; + UINT8 src; + UINT16 ip; ip = I286_IP; if (op >= 0xc0) { - I286_CLOCK(2); - src = *(reg8_b20[op]); + I286_WORKCLOCK(14); + src = *(REG8_B20(op)); } else { - I286_CLOCK(7); - src = i286_memoryread(c_calc_ea_dst[op]()); + I286_WORKCLOCK(17); + src = i286_memoryread(CALC_EA(op)); } tmp = I286_AX; - if (tmp < ((WORD)src << 8)) { + if ((src) && (tmp < ((UINT16)src << 8))) { I286_AL = tmp / src; I286_AH = tmp % src; } @@ -129,26 +130,26 @@ I286_F6 _div_ea8(DWORD op) { } } -I286_F6 _idiv_ea8(DWORD op) { +I286_F6 _idiv_ea8(UINT op) { - short tmp, r; - char src; - WORD ip; + SINT16 tmp, r; + SINT8 src; + UINT16 ip; ip = I286_IP; if (op >= 0xc0) { - I286_CLOCK(17); - src = *(reg8_b20[op]); + I286_WORKCLOCK(17); + src = *(REG8_B20(op)); } else { - I286_CLOCK(25); - src = i286_memoryread(c_calc_ea_dst[op]()); + I286_WORKCLOCK(20); + src = i286_memoryread(CALC_EA(op)); } - tmp = (short)I286_AX; + tmp = (SINT16)I286_AX; if (src) { r = tmp / src; if (!((r + 0x80) & 0xff00)) { - I286_AL = (char)r; + I286_AL = (UINT8)r; I286_AH = tmp % src; return; } @@ -157,150 +158,154 @@ 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) { - I286_CLOCK(2); - dst = *(reg16_b20[op]); + I286_WORKCLOCK(2); + dst = *(REG16_B20(op)); } else { - I286_CLOCK(6); - dst = i286_memoryread_w(c_calc_ea_dst[op]()); + I286_WORKCLOCK(6); + dst = i286_memoryread_w(CALC_EA(op)); } GET_PCWORD(src) ANDWORD(dst, src) } -I286_F6 _not_ea16(DWORD op) { +I286_F6 _not_ea16(UINT op) { - DWORD madr; + UINT32 madr; if (op >= 0xc0) { - I286_CLOCK(2); - *(reg16_b20[op]) ^= 0xffff; + I286_WORKCLOCK(2); + *(REG16_B20(op)) ^= 0xffff; } else { - I286_CLOCK(7); - madr = c_calc_ea_dst[op](); + I286_WORKCLOCK(7); + madr = CALC_EA(op); if (!(INHIBIT_WORDP(madr))) { *(mem + madr) ^= 0xffff; } else { - WORD value = i286_memoryread_w(madr); + REG16 value = i286_memoryread_w(madr); value = ~value; i286_memorywrite_w(madr, value); } } } -I286_F6 _neg_ea16(DWORD op) { +I286_F6 _neg_ea16(UINT op) { - WORD *out; - DWORD src, dst, madr; + UINT16 *out; + UINT32 src; + UINT32 dst; + UINT32 madr; if (op >= 0xc0) { - I286_CLOCK(2); - out = reg16_b20[op]; + I286_WORKCLOCK(2); + out = REG16_B20(op); } else { - I286_CLOCK(7); - madr = c_calc_ea_dst[op](); + I286_WORKCLOCK(7); + madr = CALC_EA(op); if (INHIBIT_WORDP(madr)) { src = i286_memoryread_w(madr); - WORD_NEG(dst, src) - i286_memorywrite_w(madr, (WORD)dst); + NEGWORD(dst, src) + i286_memorywrite_w(madr, (REG16)dst); return; } - out = (WORD *)(mem + madr); + out = (UINT16 *)(mem + madr); } src = *out; - WORD_NEG(dst, src) - *out = (WORD)dst; + NEGWORD(dst, src) + *out = (UINT16)dst; } -I286_F6 _mul_ea16(DWORD op) { +I286_F6 _mul_ea16(UINT op) { - WORD src; - DWORD res; + UINT16 src; + UINT32 res; if (op >= 0xc0) { - I286_CLOCK(21); - src = *(reg16_b20[op]); + I286_WORKCLOCK(21); + src = *(REG16_B20(op)); } else { - I286_CLOCK(24); - src = i286_memoryread_w(c_calc_ea_dst[op]()); + I286_WORKCLOCK(24); + src = i286_memoryread_w(CALC_EA(op)); } WORD_MUL(res, I286_AX, src) - I286_AX = (WORD)res; - I286_DX = (WORD)(res >> 16); + I286_AX = (UINT16)res; + I286_DX = (UINT16)(res >> 16); } -I286_F6 _imul_ea16(DWORD op) { +I286_F6 _imul_ea16(UINT op) { - short src; - long res; + SINT16 src; + SINT32 res; if (op >= 0xc0) { - I286_CLOCK(21); - src = *(reg16_b20[op]); + I286_WORKCLOCK(21); + src = *(REG16_B20(op)); } else { - I286_CLOCK(24); - src = i286_memoryread_w(c_calc_ea_dst[op]()); + I286_WORKCLOCK(24); + src = i286_memoryread_w(CALC_EA(op)); } WORD_IMUL(res, I286_AX, src) - I286_AX = (WORD)res; - I286_DX = (WORD)(res >> 16); + I286_AX = (UINT16)res; + I286_DX = (UINT16)(res >> 16); } -I286_F6 _div_ea16(DWORD op) { +I286_F6 _div_ea16(UINT op) { - DWORD tmp; - WORD src; - WORD ip; + UINT32 tmp; + UINT32 src; + UINT16 ip; ip = I286_IP; if (op >= 0xc0) { - I286_CLOCK(17); - src = *(reg16_b20[op]); + I286_WORKCLOCK(22); + src = *(REG16_B20(op)); } else { - I286_CLOCK(25); - src = i286_memoryread_w(c_calc_ea_dst[op]()); + I286_WORKCLOCK(25); + src = i286_memoryread_w(CALC_EA(op)); } - tmp = ((DWORD)I286_DX << 16) | I286_AX; - if (tmp < ((DWORD)src << 16)) { - I286_AX = (short)(tmp / src); - I286_DX = (short)(tmp % src); + tmp = (I286_DX << 16) + I286_AX; + if ((src) && (tmp < (src << 16))) { + I286_AX = tmp / src; + I286_DX = tmp % src; } else { INT_NUM(0, ip - 2); // 80x86 } } -I286_F6 _idiv_ea16(DWORD op) { +I286_F6 _idiv_ea16(UINT op) { - long tmp, r; - short src; - WORD ip; + SINT32 tmp; + SINT32 r; + SINT16 src; + UINT16 ip; ip = I286_IP; if (op >= 0xc0) { - I286_CLOCK(17); - src = *(reg16_b20[op]); + I286_WORKCLOCK(25); + src = *(REG16_B20(op)); } else { - I286_CLOCK(25); - src = i286_memoryread_w(c_calc_ea_dst[op]()); + I286_WORKCLOCK(28); + src = i286_memoryread_w(CALC_EA(op)); } - tmp = (long)(((DWORD)I286_DX << 16) | I286_AX); + tmp = (SINT32)((I286_DX << 16) + I286_AX); if (src) { r = tmp / src; if (!((r + 0x8000) & 0xffff0000)) { - I286_AX = (short)r; + I286_AX = (SINT16)r; I286_DX = tmp % src; return; }