| version 1.4, 2003/10/19 14:56:15 | version 1.14, 2004/02/18 18:29:29 | 
| Line 1 | Line 1 | 
 | #include        "compiler.h" | #include        "compiler.h" | 
| #include        "i286.h" | #include        "cpucore.h" | 
 | #include        "i286c.h" | #include        "i286c.h" | 
 | #include        "i286c.mcr" | #include        "i286c.mcr" | 
 | #include        "memory.h" |  | 
 | #include        "nevent.h" |  | 
 |  |  | 
 |  |  | 
 | // ------------------------------------------------------------ opecode 0xfe,f | // ------------------------------------------------------------ opecode 0xfe,f | 
| Line 18  I286_F6 _nop_int(UINT op) { | Line 16  I286_F6 _nop_int(UINT op) { | 
 | I286_F6 _inc_ea8(UINT op) { | I286_F6 _inc_ea8(UINT op) { | 
 |  |  | 
 | UINT32  madr; | UINT32  madr; | 
| BYTE    *out; | UINT8   *out; | 
|  | REG8    res; | 
 |  |  | 
 | if (op >= 0xc0) { | if (op >= 0xc0) { | 
 | I286_WORKCLOCK(2); | I286_WORKCLOCK(2); | 
| out = reg8_b20[op]; | out = REG8_B20(op); | 
 | } | } | 
 | else { | else { | 
 | I286_WORKCLOCK(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 = (UINT8)res; | 
 | } | } | 
 |  |  | 
 | I286_F6 _dec_ea8(UINT op) { | I286_F6 _dec_ea8(UINT op) { | 
 |  |  | 
 | UINT32  madr; | UINT32  madr; | 
| BYTE    *out; | UINT8   *out; | 
|  | REG8    res; | 
 |  |  | 
 | if (op >= 0xc0) { | if (op >= 0xc0) { | 
 | I286_WORKCLOCK(2); | I286_WORKCLOCK(2); | 
| out = reg8_b20[op]; | out = REG8_B20(op); | 
 | } | } | 
 | else { | else { | 
 | I286_WORKCLOCK(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 = (UINT8)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_WORKCLOCK(2); | I286_WORKCLOCK(2); | 
| out = reg16_b20[op]; | out = REG16_B20(op); | 
 | } | } | 
 | else { | else { | 
 | I286_WORKCLOCK(7); | I286_WORKCLOCK(7); | 
| madr = c_calc_ea_dst[op](); | madr = CALC_EA(op); | 
 | if (INHIBIT_WORDP(madr)) { | if (INHIBIT_WORDP(madr)) { | 
| UINT16 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 = (UINT16 *)(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_WORKCLOCK(2); | I286_WORKCLOCK(2); | 
| out = reg16_b20[op]; | out = REG16_B20(op); | 
 | } | } | 
 | else { | else { | 
 | I286_WORKCLOCK(7); | I286_WORKCLOCK(7); | 
| madr = c_calc_ea_dst[op](); | madr = CALC_EA(op); | 
 | if (INHIBIT_WORDP(madr)) { | if (INHIBIT_WORDP(madr)) { | 
| UINT16 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 = (UINT16 *)(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 113  I286_F6 _call_ea16(UINT op) { | Line 123  I286_F6 _call_ea16(UINT op) { | 
 |  |  | 
 | if (op >= 0xc0) { | if (op >= 0xc0) { | 
 | I286_WORKCLOCK(7); | I286_WORKCLOCK(7); | 
| src = *(reg16_b20[op]); | src = *(REG16_B20(op)); | 
 | } | } | 
 | else { | else { | 
 | I286_WORKCLOCK(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 135  I286_F6 _call_ea16(UINT op) { | 
 |  |  | 
 | I286_F6 _call_far_ea16(UINT op) { | I286_F6 _call_far_ea16(UINT op) { | 
 |  |  | 
 |  | UINT32  seg; | 
 |  | UINT    ad; | 
 |  |  | 
 | I286_WORKCLOCK(16); | 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 = SEGSELECT(I286_CS); | 
| CS_BASE = I286_CS << 4; |  | 
 | } | } | 
 | else { | else { | 
 | INT_NUM(6, I286_IP - 2); | INT_NUM(6, I286_IP - 2); | 
| Line 144  I286_F6 _jmp_ea16(UINT op) { | Line 156  I286_F6 _jmp_ea16(UINT op) { | 
 |  |  | 
 | if (op >= 0xc0) { | if (op >= 0xc0) { | 
 | I286_WORKCLOCK(7); | I286_WORKCLOCK(7); | 
| I286_IP = *(reg16_b20[op]); | I286_IP = *(REG16_B20(op)); | 
 | } | } | 
 | else { | else { | 
 | I286_WORKCLOCK(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) { | 
 |  |  | 
 |  | UINT32  seg; | 
 |  | UINT    ad; | 
 |  |  | 
 | I286_WORKCLOCK(11); | 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 = SEGSELECT(I286_CS); | 
| CS_BASE = I286_CS << 4; |  | 
 | } | } | 
 | else { | else { | 
 | INT_NUM(6, I286_IP - 2); | INT_NUM(6, I286_IP - 2); | 
| Line 173  I286_F6 _push_ea16(UINT op) { | Line 187  I286_F6 _push_ea16(UINT op) { | 
 |  |  | 
 | if (op >= 0xc0) { | if (op >= 0xc0) { | 
 | I286_WORKCLOCK(3); | I286_WORKCLOCK(3); | 
| src = *(reg16_b20[op]); | src = *(REG16_B20(op)); | 
 | } | } | 
 | else { | else { | 
 | I286_WORKCLOCK(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 189  I286_F6 _pop_ea16(UINT op) { | Line 203  I286_F6 _pop_ea16(UINT op) { | 
 | REGPOP0(src); | REGPOP0(src); | 
 | I286_WORKCLOCK(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); | 
 | } | } | 
 | } | } | 
 |  |  |