--- np2/i286c/i286c_mn.c 2003/12/03 07:59:57 1.21 +++ np2/i286c/i286c_mn.c 2003/12/17 01:57:41 1.25 @@ -1,7 +1,6 @@ #include "compiler.h" -#include "i286.h" +#include "cpucore.h" #include "i286c.h" -#include "memory.h" #include "pccore.h" #include "iocore.h" #include "bios.h" @@ -28,7 +27,6 @@ I286FN _reserved(void) { - I286_WORKCLOCK(23); // ToDo INT_NUM(6, I286_IP - 1); } @@ -623,13 +621,13 @@ I286FN _segprefix_es(void) { // 26: SS_FIX = ES_BASE; DS_FIX = ES_BASE; - i286core.s.prefix++; - if (i286core.s.prefix < MAX_PREFIX) { + I286_PREFIX++; + if (I286_PREFIX < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op[op](); REMOVE_PREFIX - i286core.s.prefix = 0; + I286_PREFIX = 0; } else { INT_NUM(6, I286_IP); @@ -769,13 +767,13 @@ I286FN _segprefix_cs(void) { // 2e: SS_FIX = CS_BASE; DS_FIX = CS_BASE; - i286core.s.prefix++; - if (i286core.s.prefix < MAX_PREFIX) { + I286_PREFIX++; + if (I286_PREFIX < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op[op](); REMOVE_PREFIX - i286core.s.prefix = 0; + I286_PREFIX = 0; } else { INT_NUM(6, I286_IP); @@ -910,13 +908,13 @@ I286FN _segprefix_ss(void) { // 36: SS_FIX = SS_BASE; DS_FIX = SS_BASE; - i286core.s.prefix++; - if (i286core.s.prefix < MAX_PREFIX) { + I286_PREFIX++; + if (I286_PREFIX < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op[op](); REMOVE_PREFIX - i286core.s.prefix = 0; + I286_PREFIX = 0; } else { INT_NUM(6, I286_IP); @@ -1027,13 +1025,13 @@ I286FN _segprefix_ds(void) { // 3e: SS_FIX = DS_BASE; DS_FIX = DS_BASE; - i286core.s.prefix++; - if (i286core.s.prefix < MAX_PREFIX) { + I286_PREFIX++; + if (I286_PREFIX < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op[op](); REMOVE_PREFIX - i286core.s.prefix = 0; + I286_PREFIX = 0; } else { INT_NUM(6, I286_IP); @@ -1820,7 +1818,7 @@ I286FN _popf(void) { // 9D: popf I286_TRAP = ((flag & 0x300) == 0x300); I286_WORKCLOCK(5); #if defined(INTR_FAST) - if ((flag & I_FLAG) && (PICEXISTINTR)) { + if ((I286_TRAP) || ((flag & I_FLAG) && (PICEXISTINTR))) { I286IRQCHECKTERM } #else @@ -2246,7 +2244,7 @@ I286FN _ret_far(void) { // CB: ret I286FN _int_03(void) { // CC: int 3 - I286_WORKCLOCK(23); + I286_WORKCLOCK(3); INT_NUM(3, I286_IP); } @@ -2254,7 +2252,7 @@ I286FN _int_data8(void) { // CD: int UINT vect; - I286_WORKCLOCK(23); + I286_WORKCLOCK(3); GET_PCBYTE(vect) INT_NUM(vect, I286_IP); } @@ -2263,7 +2261,6 @@ I286FN _into(void) { // CE: into I286_WORKCLOCK(4); if (I286_OV) { - I286_WORKCLOCK(24 - 4); INT_NUM(4, I286_IP); } } @@ -2282,7 +2279,7 @@ I286FN _iret(void) { // CF: iret CS_BASE = I286_CS << 4; I286_WORKCLOCK(31); #if defined(INTR_FAST) - if ((flag & I_FLAG) && (PICEXISTINTR)) { + if ((I286_TRAP) || ((flag & I_FLAG) && (PICEXISTINTR))) { I286IRQCHECKTERM } #else @@ -2341,7 +2338,7 @@ I286FN _shift_ea8_cl(void) { // D2: sh BYTE *out; UINT op; UINT32 madr; - BYTE cl; + REG8 cl; GET_PCBYTE(op) if (op >= 0xc0) { @@ -2369,7 +2366,7 @@ I286FN _shift_ea16_cl(void) { // D3: s UINT16 *out; UINT op; UINT32 madr; - BYTE cl; + REG8 cl; GET_PCBYTE(op) if (op >= 0xc0) { @@ -2475,9 +2472,9 @@ I286FN _in_al_data8(void) { // E4: i I286_WORKCLOCK(5); GET_PCBYTE(port) - i286core.s.inport = CS_BASE + I286_IP; + I286_INPADRS = CS_BASE + I286_IP; I286_AL = iocore_inp8(port); - i286core.s.inport = 0; + I286_INPADRS = 0; } I286FN _in_ax_data8(void) { // E5: in ax, DATA8 @@ -2577,12 +2574,12 @@ I286FN _lock(void) { // F0: lock I286FN _repne(void) { // F2: repne - i286core.s.prefix++; - if (i286core.s.prefix < MAX_PREFIX) { + I286_PREFIX++; + if (I286_PREFIX < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op_repne[op](); - i286core.s.prefix = 0; + I286_PREFIX = 0; } else { INT_NUM(6, I286_IP); @@ -2591,12 +2588,12 @@ I286FN _repne(void) { // F2: repne I286FN _repe(void) { // F3: repe - i286core.s.prefix++; - if (i286core.s.prefix < MAX_PREFIX) { + I286_PREFIX++; + if (I286_PREFIX < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op_repe[op](); - i286core.s.prefix = 0; + I286_PREFIX = 0; } else { INT_NUM(6, I286_IP); @@ -2662,11 +2659,11 @@ I286FN _sti(void) { // FB: sti I286_FLAG |= I_FLAG; I286_TRAP = (I286_FLAG & T_FLAG) >> 8; #if defined(INTR_FAST) - if (!PICEXISTINTR) { - NEXT_OPCODE; + if ((I286_TRAP) || (PICEXISTINTR)) { + REMAIN_ADJUST(1) } else { - REMAIN_ADJUST(1) + NEXT_OPCODE; } #else REMAIN_ADJUST(1) @@ -2985,13 +2982,13 @@ I286FN _repe_segprefix_es(void) { DS_FIX = ES_BASE; SS_FIX = ES_BASE; - i286core.s.prefix++; - if (i286core.s.prefix < MAX_PREFIX) { + I286_PREFIX++; + if (I286_PREFIX < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op_repe[op](); REMOVE_PREFIX - i286core.s.prefix = 0; + I286_PREFIX = 0; } else { INT_NUM(6, I286_IP); @@ -3002,13 +2999,13 @@ I286FN _repe_segprefix_cs(void) { DS_FIX = CS_BASE; SS_FIX = CS_BASE; - i286core.s.prefix++; - if (i286core.s.prefix < MAX_PREFIX) { + I286_PREFIX++; + if (I286_PREFIX < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op_repe[op](); REMOVE_PREFIX - i286core.s.prefix = 0; + I286_PREFIX = 0; } else { INT_NUM(6, I286_IP); @@ -3019,13 +3016,13 @@ I286FN _repe_segprefix_ss(void) { DS_FIX = SS_BASE; SS_FIX = SS_BASE; - i286core.s.prefix++; - if (i286core.s.prefix < MAX_PREFIX) { + I286_PREFIX++; + if (I286_PREFIX < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op_repe[op](); REMOVE_PREFIX - i286core.s.prefix = 0; + I286_PREFIX = 0; } else { INT_NUM(6, I286_IP); @@ -3036,13 +3033,13 @@ I286FN _repe_segprefix_ds(void) { DS_FIX = DS_BASE; SS_FIX = DS_BASE; - i286core.s.prefix++; - if (i286core.s.prefix < MAX_PREFIX) { + I286_PREFIX++; + if (I286_PREFIX < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op_repe[op](); REMOVE_PREFIX - i286core.s.prefix = 0; + I286_PREFIX = 0; } else { INT_NUM(6, I286_IP); @@ -3330,13 +3327,13 @@ I286FN _repne_segprefix_es(void) { DS_FIX = ES_BASE; SS_FIX = ES_BASE; - i286core.s.prefix++; - if (i286core.s.prefix < MAX_PREFIX) { + I286_PREFIX++; + if (I286_PREFIX < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op_repne[op](); REMOVE_PREFIX - i286core.s.prefix = 0; + I286_PREFIX = 0; } else { INT_NUM(6, I286_IP); @@ -3347,13 +3344,13 @@ I286FN _repne_segprefix_cs(void) { DS_FIX = CS_BASE; SS_FIX = CS_BASE; - i286core.s.prefix++; - if (i286core.s.prefix < MAX_PREFIX) { + I286_PREFIX++; + if (I286_PREFIX < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op_repne[op](); REMOVE_PREFIX - i286core.s.prefix = 0; + I286_PREFIX = 0; } else { INT_NUM(6, I286_IP); @@ -3364,13 +3361,13 @@ I286FN _repne_segprefix_ss(void) { DS_FIX = SS_BASE; SS_FIX = SS_BASE; - i286core.s.prefix++; - if (i286core.s.prefix < MAX_PREFIX) { + I286_PREFIX++; + if (I286_PREFIX < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op_repne[op](); REMOVE_PREFIX - i286core.s.prefix = 0; + I286_PREFIX = 0; } else { INT_NUM(6, I286_IP); @@ -3381,13 +3378,13 @@ I286FN _repne_segprefix_ds(void) { DS_FIX = DS_BASE; SS_FIX = DS_BASE; - i286core.s.prefix++; - if (i286core.s.prefix < MAX_PREFIX) { + I286_PREFIX++; + if (I286_PREFIX < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op_repne[op](); REMOVE_PREFIX - i286core.s.prefix = 0; + I286_PREFIX = 0; } else { INT_NUM(6, I286_IP);