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