| version 1.1.1.1, 2003/10/16 17:57:45 | version 1.7, 2003/11/24 09:14:01 | 
| 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); | 
 | } | } | 
 | #endif | #endif | 
 |  |  | 
| I286_F6 _inc_ea8(DWORD op) { | I286_F6 _inc_ea8(UINT op) { | 
 |  |  | 
| DWORD   madr; | UINT32  madr; | 
 | BYTE    *out; | BYTE    *out; | 
 |  |  | 
 | 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); | BYTE value = i286_memoryread(madr); | 
 | BYTE_INC(value) | BYTE_INC(value) | 
| Line 38  I286_F6 _inc_ea8(DWORD op) { | Line 37  I286_F6 _inc_ea8(DWORD op) { | 
 | BYTE_INC(*out) | BYTE_INC(*out) | 
 | } | } | 
 |  |  | 
| I286_F6 _dec_ea8(DWORD op) { | I286_F6 _dec_ea8(UINT op) { | 
 |  |  | 
| DWORD   madr; | UINT32  madr; | 
 | BYTE    *out; | BYTE    *out; | 
 |  |  | 
 | 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); | BYTE value = i286_memoryread(madr); | 
 | BYTE_DEC(value) | BYTE_DEC(value) | 
| Line 61  I286_F6 _dec_ea8(DWORD op) { | Line 60  I286_F6 _dec_ea8(DWORD op) { | 
 | BYTE_DEC(*out) | BYTE_DEC(*out) | 
 | } | } | 
 |  |  | 
| I286_F6 _inc_ea16(DWORD op) { | I286_F6 _inc_ea16(UINT op) { | 
 |  |  | 
| DWORD   madr; | UINT32  madr; | 
| WORD    *out; | UINT16  *out; | 
 |  |  | 
 | 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); | UINT16 value = i286_memoryread_w(madr); | 
 | WORD_INC(value) | WORD_INC(value) | 
 | i286_memorywrite_w(madr, value); | i286_memorywrite_w(madr, value); | 
 | return; | return; | 
 | } | } | 
| out = (WORD *)(mem + madr); | out = (UINT16 *)(mem + madr); | 
 | } | } | 
 | WORD_INC(*out) | WORD_INC(*out) | 
 | } | } | 
 |  |  | 
| I286_F6 _dec_ea16(DWORD op) { | I286_F6 _dec_ea16(UINT op) { | 
 |  |  | 
| DWORD   madr; | UINT32  madr; | 
| WORD    *out; | UINT16  *out; | 
 |  |  | 
 | 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); | UINT16 value = i286_memoryread_w(madr); | 
 | WORD_DEC(value) | WORD_DEC(value) | 
 | i286_memorywrite_w(madr, value); | i286_memorywrite_w(madr, value); | 
 | return; | return; | 
 | } | } | 
| out = (WORD *)(mem + madr); | out = (UINT16 *)(mem + madr); | 
 | } | } | 
 | WORD_DEC(*out) | WORD_DEC(*out) | 
 | } | } | 
 |  |  | 
| I286_F6 _call_ea16(DWORD op) { | I286_F6 _call_ea16(UINT op) { | 
 |  |  | 
| WORD    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; | 
 | } | } | 
 |  |  | 
| I286_F6 _call_far_ea16(DWORD op) { | I286_F6 _call_far_ea16(UINT op) { | 
 |  |  | 
| I286_CLOCK(16) | UINT32  seg; | 
|  | UINT16  ad; | 
|  |  | 
|  | I286_WORKCLOCK(16); | 
 | if (op < 0xc0) { | if (op < 0xc0) { | 
| WORD 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; | ad += 2; | 
| I286_CS = i286_memoryread_w(ad + EA_FIX); | I286_CS = i286_memoryread_w(seg + ad); | 
| CS_BASE = (DWORD)I286_CS << 4; | CS_BASE = I286_CS << 4; | 
 | } | } | 
 | else { | else { | 
 | INT_NUM(6, I286_IP - 2); | INT_NUM(6, I286_IP - 2); | 
 | } | } | 
 | } | } | 
 |  |  | 
| I286_F6 _jmp_ea16(DWORD 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(DWORD op) { | I286_F6 _jmp_far_ea16(UINT op) { | 
|  |  | 
|  | UINT32  seg; | 
|  | UINT16  ad; | 
 |  |  | 
| I286_CLOCK(11) | I286_WORKCLOCK(11); | 
 | if (op < 0xc0) { | if (op < 0xc0) { | 
| WORD 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; | ad += 2; | 
| I286_CS = i286_memoryread_w(ad + EA_FIX); | I286_CS = i286_memoryread_w(seg + ad); | 
| CS_BASE = (DWORD)I286_CS << 4; | CS_BASE = I286_CS << 4; | 
 | } | } | 
 | else { | else { | 
 | INT_NUM(6, I286_IP - 2); | INT_NUM(6, I286_IP - 2); | 
 | } | } | 
 | } | } | 
 |  |  | 
| I286_F6 _push_ea16(DWORD op) { | I286_F6 _push_ea16(UINT op) { | 
 |  |  | 
| WORD    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); | 
 | } | } | 
 |  |  | 
| I286_F6 _pop_ea16(DWORD op) { | I286_F6 _pop_ea16(UINT op) { | 
 |  |  | 
| WORD    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); | 
 | } | } | 
 | } | } | 
 |  |  |