--- np2/i286c/i286c_fe.c 2003/10/17 07:17:20 1.2 +++ np2/i286c/i286c_fe.c 2003/12/08 00:55:31 1.11 @@ -1,15 +1,14 @@ #include "compiler.h" -#include "i286.h" +#include "cpucore.h" #include "i286c.h" -#include "i286c.mcr" #include "memory.h" -#include "nevent.h" +#include "i286c.mcr" // ------------------------------------------------------------ opecode 0xfe,f #if 0 -I286_F6 _nop_int(DWORD op) { +I286_F6 _nop_int(UINT op) { INT_NUM(6, I286_IP - 2); } @@ -19,92 +18,104 @@ I286_F6 _inc_ea8(UINT op) { UINT32 madr; BYTE *out; + REG8 res; 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) { - BYTE value = i286_memoryread(madr); - BYTE_INC(value) - i286_memorywrite(madr, value); + res = i286_memoryread(madr); + INCBYTE(res) + i286_memorywrite(madr, res); return; } out = mem + madr; } - BYTE_INC(*out) + res = *out; + INCBYTE(res) + *out = (BYTE)res; } I286_F6 _dec_ea8(UINT op) { UINT32 madr; BYTE *out; + REG8 res; 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) { - BYTE value = i286_memoryread(madr); - BYTE_DEC(value) - i286_memorywrite(madr, value); + res = i286_memoryread(madr); + DECBYTE(res) + i286_memorywrite(madr, res); return; } out = mem + madr; } - BYTE_DEC(*out) + res = *out; + DECBYTE(res) + *out = (BYTE)res; } I286_F6 _inc_ea16(UINT op) { UINT32 madr; UINT16 *out; + REG16 res; 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)) { - WORD value = i286_memoryread_w(madr); - WORD_INC(value) - i286_memorywrite_w(madr, value); + res = i286_memoryread_w(madr); + INCWORD(res) + i286_memorywrite_w(madr, res); return; } - out = (WORD *)(mem + madr); + out = (UINT16 *)(mem + madr); } - WORD_INC(*out) + res = *out; + INCWORD(res) + *out = (UINT16)res; } I286_F6 _dec_ea16(UINT op) { UINT32 madr; UINT16 *out; + REG16 res; 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)) { - WORD value = i286_memoryread_w(madr); - WORD_DEC(value) - i286_memorywrite_w(madr, value); + res = i286_memoryread_w(madr); + DECWORD(res) + i286_memorywrite_w(madr, res); return; } - out = (WORD *)(mem + madr); + out = (UINT16 *)(mem + madr); } - WORD_DEC(*out) + res = *out; + DECWORD(res) + *out = (UINT16)res; } I286_F6 _call_ea16(UINT op) { @@ -112,12 +123,12 @@ I286_F6 _call_ea16(UINT op) { UINT16 src; if (op >= 0xc0) { - I286_CLOCK(7) - src = *(reg16_b20[op]); + I286_WORKCLOCK(7); + src = *(REG16_B20(op)); } else { - I286_CLOCK(11) - src = i286_memoryread_w(c_calc_ea_dst[op]()); + I286_WORKCLOCK(11); + src = i286_memoryread_w(CALC_EA(op)); } REGPUSH0(I286_IP); I286_IP = src; @@ -125,15 +136,17 @@ I286_F6 _call_ea16(UINT op) { I286_F6 _call_far_ea16(UINT op) { - I286_CLOCK(16) + UINT32 seg; + UINT ad; + + I286_WORKCLOCK(16); if (op < 0xc0) { - UINT16 ad = c_get_ea[op](); + ad = GET_EA(op, &seg); REGPUSH0(I286_CS) // ToDo REGPUSH0(I286_IP) - I286_IP = i286_memoryread_w(ad + EA_FIX); - ad += 2; - I286_CS = i286_memoryread_w(ad + EA_FIX); - CS_BASE = (DWORD)I286_CS << 4; + I286_IP = i286_memoryread_w(seg + ad); + I286_CS = i286_memoryread_w(seg + LOW16(ad + 2)); + CS_BASE = I286_CS << 4; } else { INT_NUM(6, I286_IP - 2); @@ -143,23 +156,25 @@ I286_F6 _call_far_ea16(UINT op) { I286_F6 _jmp_ea16(UINT op) { if (op >= 0xc0) { - I286_CLOCK(7) - I286_IP = *(reg16_b20[op]); + I286_WORKCLOCK(7); + I286_IP = *(REG16_B20(op)); } else { - I286_CLOCK(11) - I286_IP = i286_memoryread_w(c_calc_ea_dst[op]()); + I286_WORKCLOCK(11); + I286_IP = i286_memoryread_w(CALC_EA(op)); } } I286_F6 _jmp_far_ea16(UINT op) { - I286_CLOCK(11) + UINT32 seg; + UINT ad; + + I286_WORKCLOCK(11); if (op < 0xc0) { - UINT16 ad = c_get_ea[op](); - I286_IP = i286_memoryread_w(ad + EA_FIX); - ad += 2; - I286_CS = i286_memoryread_w(ad + EA_FIX); + ad = GET_EA(op, &seg); + I286_IP = i286_memoryread_w(seg + ad); + I286_CS = i286_memoryread_w(seg + LOW16(ad + 2)); CS_BASE = I286_CS << 4; } else { @@ -172,12 +187,12 @@ I286_F6 _push_ea16(UINT op) { UINT16 src; if (op >= 0xc0) { - I286_CLOCK(3) - src = *(reg16_b20[op]); + I286_WORKCLOCK(3); + src = *(REG16_B20(op)); } else { - I286_CLOCK(5) - src = i286_memoryread_w(c_calc_ea_dst[op]()); + I286_WORKCLOCK(5); + src = i286_memoryread_w(CALC_EA(op)); } REGPUSH0(src); } @@ -187,12 +202,12 @@ I286_F6 _pop_ea16(UINT op) { UINT16 src; REGPOP0(src); - I286_CLOCK(5) + I286_WORKCLOCK(5); if (op >= 0xc0) { - *(reg16_b20[op]) = src; + *(REG16_B20(op)) = src; } else { - i286_memorywrite_w(c_calc_ea_dst[op](), src); + i286_memorywrite_w(CALC_EA(op), src); } }