--- np2/i286c/i286c_mn.c 2003/10/17 11:10:02 1.3 +++ np2/i286c/i286c_mn.c 2003/12/01 10:45:46 1.18 @@ -10,16 +10,21 @@ #define MAX_PREFIX 8 -#define NEXT_OPCODE \ - if (nevent.remainclock < 1) { \ - nevent.baseclock += (1 - nevent.remainclock); \ - nevent.remainclock = 1; \ +#define EXISTINTR (isI286EI) && (!pic.ext_irq) && \ + ((pic.pi[0].irr & (~pic.pi[0].imr)) || \ + (pic.pi[1].irr & (~pic.pi[1].imr))) + + +#define NEXT_OPCODE \ + if (I286_REMCLOCK < 1) { \ + I286_BASECLOCK += (1 - I286_REMCLOCK); \ + I286_REMCLOCK = 1; \ } -#define REMAIN_ADJUST(c) \ - if (nevent.remainclock != (c)) { \ - nevent.baseclock += ((c) - nevent.remainclock); \ - nevent.remainclock = (c); \ +#define REMAIN_ADJUST(c) \ + if (I286_REMCLOCK != (c)) { \ + I286_BASECLOCK += ((c) - I286_REMCLOCK); \ + I286_REMCLOCK = (c); \ } @@ -27,7 +32,7 @@ I286FN _reserved(void) { - I286_CLOCK(23); // ToDo + I286_WORKCLOCK(23); // ToDo INT_NUM(6, I286_IP - 1); } @@ -42,16 +47,16 @@ I286FN _add_ea_r8(void) { // 00: ad PREPART_EA_REG8(op, src); 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) { dst = i286_memoryread(madr); ADDBYTE(res, dst, src); - i286_memorywrite(madr, (BYTE)res); + i286_memorywrite(madr, (REG8)res); return; } out = mem + madr; @@ -72,16 +77,16 @@ I286FN _add_ea_r16(void) { // 01: a PREPART_EA_REG16(op, src); 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)) { dst = i286_memoryread_w(madr); ADDWORD(res, dst, src); - i286_memorywrite_w(madr, (UINT16)res); + i286_memorywrite_w(madr, (REG16)res); return; } out = (UINT16 *)(mem + madr); @@ -124,7 +129,7 @@ I286FN _add_al_data8(void) { // 04: UINT src; UINT res; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCBYTE(src); ADDBYTE(res, I286_AL, src); I286_AL = (BYTE)res; @@ -135,7 +140,7 @@ I286FN _add_ax_data16(void) { // 05: UINT src; UINT res; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCWORD(src); ADDWORD(res, I286_AX, src); I286_AX = (UINT16)res; @@ -162,21 +167,23 @@ I286FN _or_ea_r8(void) { // 08: or PREPART_EA_REG8(op, src); 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) { dst = i286_memoryread(madr); ORBYTE(dst, src); - i286_memorywrite(madr, (BYTE)dst); + i286_memorywrite(madr, (REG8)dst); return; } out = mem + madr; } - ORBYTE(*out, src); + dst = *out; + ORBYTE(dst, src); + *out = (BYTE)dst; } I286FN _or_ea_r16(void) { // 09: or EA, REG16 @@ -189,21 +196,23 @@ I286FN _or_ea_r16(void) { // 09: o PREPART_EA_REG16(op, src); 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)) { dst = i286_memoryread_w(madr); ORWORD(dst, src); - i286_memorywrite_w(madr, (UINT16)dst); + i286_memorywrite_w(madr, (REG16)dst); return; } out = (UINT16 *)(mem + madr); } - ORWORD(*out, src); + dst = *out; + ORWORD(dst, src); + *out = (UINT16)dst; } I286FN _or_r8_ea(void) { // 0a: or REG8, EA @@ -211,9 +220,12 @@ I286FN _or_r8_ea(void) { // 0a: or BYTE *out; UINT op; UINT src; + UINT dst; PREPART_REG8_EA(op, src, out, 2, 7); - ORBYTE(*out, src); + dst = *out; + ORBYTE(dst, src); + *out = (BYTE)dst; } I286FN _or_r16_ea(void) { // 0b: or REG16, EA @@ -221,27 +233,36 @@ I286FN _or_r16_ea(void) { // 0b: or UINT16 *out; UINT op; UINT32 src; + UINT32 dst; PREPART_REG16_EA(op, src, out, 2, 7); - ORWORD(*out, src); + dst = *out; + ORWORD(dst, src); + *out = (UINT16)dst; } I286FN _or_al_data8(void) { // 0c: or al, DATA8 UINT src; + UINT dst; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCBYTE(src); - ORBYTE(I286_AL, src); + dst = I286_AL; + ORBYTE(dst, src); + I286_AL = (BYTE)dst; } I286FN _or_ax_data16(void) { // 0d: or ax, DATA16 UINT32 src; + UINT32 dst; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCWORD(src); - ORWORD(I286_AX, src); + dst = I286_AX; + ORWORD(dst, src); + I286_AX = (UINT16)dst; } I286FN _push_cs(void) { // 0e: push cs @@ -260,16 +281,16 @@ I286FN _adc_ea_r8(void) { // 10: ad PREPART_EA_REG8(op, src); 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) { dst = i286_memoryread(madr); ADCBYTE(res, dst, src); - i286_memorywrite(madr, (BYTE)res); + i286_memorywrite(madr, (REG8)res); return; } out = mem + madr; @@ -290,16 +311,16 @@ I286FN _adc_ea_r16(void) { // 11: a PREPART_EA_REG16(op, src); 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)) { dst = i286_memoryread_w(madr); ADCWORD(res, dst, src); - i286_memorywrite_w(madr, (UINT16)res); + i286_memorywrite_w(madr, (REG16)res); return; } out = (UINT16 *)(mem + madr); @@ -342,7 +363,7 @@ I286FN _adc_al_data8(void) { // 14: UINT src; UINT res; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCBYTE(src); ADCBYTE(res, I286_AL, src); I286_AL = (BYTE)res; @@ -353,7 +374,7 @@ I286FN _adc_ax_data16(void) { // 15: UINT32 src; UINT32 res; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCWORD(src); ADCWORD(res, I286_AX, src); I286_AX = (UINT16)res; @@ -383,16 +404,16 @@ I286FN _sbb_ea_r8(void) { // 18: sb PREPART_EA_REG8(op, src); 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) { dst = i286_memoryread(madr); SBBBYTE(res, dst, src); - i286_memorywrite(madr, (BYTE)res); + i286_memorywrite(madr, (REG8)res); return; } out = mem + madr; @@ -413,16 +434,16 @@ I286FN _sbb_ea_r16(void) { // 19: s PREPART_EA_REG16(op, src); 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)) { dst = i286_memoryread_w(madr); SBBWORD(res, dst, src); - i286_memorywrite_w(madr, (UINT16)res); + i286_memorywrite_w(madr, (REG16)res); return; } out = (UINT16 *)(mem + madr); @@ -465,7 +486,7 @@ I286FN _sbb_al_data8(void) { // 1c: UINT src; UINT res; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCBYTE(src); SBBBYTE(res, I286_AL, src); I286_AL = (BYTE)res; @@ -476,7 +497,7 @@ I286FN _sbb_ax_data16(void) { // 1d: UINT32 src; UINT32 res; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCWORD(src); SBBWORD(res, I286_AX, src); I286_AX = (UINT16)res; @@ -504,21 +525,23 @@ I286FN _and_ea_r8(void) { // 20: an PREPART_EA_REG8(op, src); 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) { dst = i286_memoryread(madr); ANDBYTE(dst, src); - i286_memorywrite(madr, (BYTE)dst); + i286_memorywrite(madr, (REG8)dst); return; } out = mem + madr; } - ANDBYTE(*out, src); + dst = *out; + ANDBYTE(dst, src); + *out = (BYTE)dst; } I286FN _and_ea_r16(void) { // 21: and EA, REG16 @@ -531,21 +554,23 @@ I286FN _and_ea_r16(void) { // 21: a PREPART_EA_REG16(op, src); 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)) { dst = i286_memoryread_w(madr); ANDWORD(dst, src); - i286_memorywrite_w(madr, (UINT16)dst); + i286_memorywrite_w(madr, (REG16)dst); return; } out = (UINT16 *)(mem + madr); } - ANDWORD(*out, src); + dst = *out; + ANDWORD(dst, src); + *out = (UINT16)dst; } I286FN _and_r8_ea(void) { // 22: and REG8, EA @@ -553,9 +578,12 @@ I286FN _and_r8_ea(void) { // 22: an BYTE *out; UINT op; UINT src; + UINT dst; PREPART_REG8_EA(op, src, out, 2, 7); - ANDBYTE(*out, src); + dst = *out; + ANDBYTE(dst, src); + *out = (BYTE)dst; } I286FN _and_r16_ea(void) { // 23: and REG16, EA @@ -563,40 +591,49 @@ I286FN _and_r16_ea(void) { // 23: a UINT16 *out; UINT op; UINT32 src; + UINT32 dst; PREPART_REG16_EA(op, src, out, 2, 7); - ANDWORD(*out, src); + dst = *out; + ANDWORD(dst, src); + *out = (UINT16)dst; } I286FN _and_al_data8(void) { // 24: and al, DATA8 UINT src; + UINT dst; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCBYTE(src); - ANDBYTE(I286_AL, src); + dst = I286_AL; + ANDBYTE(dst, src); + I286_AL = (BYTE)dst; } I286FN _and_ax_data16(void) { // 25: and ax, DATA16 UINT32 src; + UINT32 dst; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCWORD(src); - ANDWORD(I286_AX, src); + dst = I286_AX; + ANDWORD(dst, src); + I286_AX = (UINT16)dst; } I286FN _segprefix_es(void) { // 26: es: SS_FIX = ES_BASE; DS_FIX = ES_BASE; - i286reg.prefix++; - if (i286reg.prefix < MAX_PREFIX) { + i286core.s.prefix++; + if (i286core.s.prefix < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op[op](); REMOVE_PREFIX - i286reg.prefix = 0; + i286core.s.prefix = 0; } else { INT_NUM(6, I286_IP); @@ -605,7 +642,7 @@ I286FN _segprefix_es(void) { // 26: I286FN _daa(void) { // 27: daa - I286_CLOCK(3); + I286_WORKCLOCK(3); I286_OV = ((I286_AL < 0x80) && ((I286_AL >= 0x7a) || ((I286_AL >= 0x1a) && (I286_FLAGL & C_FLAG)))); @@ -619,7 +656,7 @@ I286FN _daa(void) { // 27: daa I286_AL += 0x60; } I286_FLAGL &= A_FLAG | C_FLAG; - I286_FLAGL |= szpcflag[I286_AL]; + I286_FLAGL |= BYTESZPF(I286_AL); } I286FN _sub_ea_r8(void) { // 28: sub EA, REG8 @@ -633,22 +670,22 @@ I286FN _sub_ea_r8(void) { // 28: su PREPART_EA_REG8(op, src); 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) { dst = i286_memoryread(madr); - BYTE_SUB(res, dst, src); - i286_memorywrite(madr, (BYTE)res); + SUBBYTE(res, dst, src); + i286_memorywrite(madr, (REG8)res); return; } out = mem + madr; } dst = *out; - BYTE_SUB(res, dst, src); + SUBBYTE(res, dst, src); *out = (BYTE)res; } @@ -663,22 +700,22 @@ I286FN _sub_ea_r16(void) { // 29: s PREPART_EA_REG16(op, src); 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)) { dst = i286_memoryread_w(madr); - WORD_SUB(res, dst, src); - i286_memorywrite_w(madr, (UINT16)res); + SUBWORD(res, dst, src); + i286_memorywrite_w(madr, (REG16)res); return; } out = (UINT16 *)(mem + madr); } dst = *out; - WORD_SUB(res, dst, src); + SUBWORD(res, dst, src); *out = (UINT16)res; } @@ -692,7 +729,7 @@ I286FN _sub_r8_ea(void) { // 2a: su PREPART_REG8_EA(op, src, out, 2, 7); dst = *out; - BYTE_SUB(res, dst, src); + SUBBYTE(res, dst, src); *out = (BYTE)res; } @@ -706,7 +743,7 @@ I286FN _sub_r16_ea(void) { // 2b: s PREPART_REG16_EA(op, src, out, 2, 7); dst = *out; - WORD_SUB(res, dst, src); + SUBWORD(res, dst, src); *out = (UINT16)res; } @@ -715,9 +752,9 @@ I286FN _sub_al_data8(void) { // 2c: UINT src; UINT res; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCBYTE(src); - BYTE_SUB(res, I286_AL, src); + SUBBYTE(res, I286_AL, src); I286_AL = (BYTE)res; } @@ -726,9 +763,9 @@ I286FN _sub_ax_data16(void) { // 2d: UINT32 src; UINT32 res; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCWORD(src); - WORD_SUB(res, I286_AX, src); + SUBWORD(res, I286_AX, src); I286_AX = (UINT16)res; } @@ -736,13 +773,13 @@ I286FN _segprefix_cs(void) { // 2e: SS_FIX = CS_BASE; DS_FIX = CS_BASE; - i286reg.prefix++; - if (i286reg.prefix < MAX_PREFIX) { + i286core.s.prefix++; + if (i286core.s.prefix < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op[op](); REMOVE_PREFIX - i286reg.prefix = 0; + i286core.s.prefix = 0; } else { INT_NUM(6, I286_IP); @@ -751,7 +788,7 @@ I286FN _segprefix_cs(void) { // 2e: I286FN _das(void) { // 2f: das - I286_CLOCK(3) + I286_WORKCLOCK(3); if ((I286_FLAGL & C_FLAG) || (I286_AL > 0x99)) { I286_FLAGL |= C_FLAG; I286_AL -= 0x60; @@ -762,7 +799,7 @@ I286FN _das(void) { // 2f: das I286_AL -= 6; } I286_FLAGL &= A_FLAG | C_FLAG; - I286_FLAGL |= szpcflag[I286_AL]; + I286_FLAGL |= BYTESZPF(I286_AL); } I286FN _xor_ea_r8(void) { // 30: xor EA, REG8 @@ -775,21 +812,23 @@ I286FN _xor_ea_r8(void) { // 30: xo PREPART_EA_REG8(op, src); 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) { dst = i286_memoryread(madr); - BYTE_XOR(dst, src); - i286_memorywrite(madr, (BYTE)dst); + XORBYTE(dst, src); + i286_memorywrite(madr, (REG8)dst); return; } out = mem + madr; } - BYTE_XOR(*out, src); + dst = *out; + XORBYTE(dst, src); + *out = (BYTE)dst; } I286FN _xor_ea_r16(void) { // 31: xor EA, REG16 @@ -802,21 +841,23 @@ I286FN _xor_ea_r16(void) { // 31: x PREPART_EA_REG16(op, src); 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)) { dst = i286_memoryread_w(madr); - WORD_XOR(dst, src); - i286_memorywrite_w(madr, (UINT16)dst); + XORWORD(dst, src); + i286_memorywrite_w(madr, (REG16)dst); return; } out = (UINT16 *)(mem + madr); } - WORD_XOR(*out, src); + dst = *out; + XORWORD(dst, src); + *out = (UINT16)dst; } I286FN _xor_r8_ea(void) { // 32: xor REG8, EA @@ -824,9 +865,12 @@ I286FN _xor_r8_ea(void) { // 32: xo BYTE *out; UINT op; UINT src; + UINT dst; PREPART_REG8_EA(op, src, out, 2, 7); - BYTE_XOR(*out, src); + dst = *out; + XORBYTE(dst, src); + *out = (BYTE)dst; } I286FN _xor_r16_ea(void) { // 33: or REG16, EA @@ -834,40 +878,49 @@ I286FN _xor_r16_ea(void) { // 33: o UINT16 *out; UINT op; UINT32 src; + UINT32 dst; PREPART_REG16_EA(op, src, out, 2, 7); - WORD_XOR(*out, src); + dst = *out; + XORWORD(dst, src); + *out = (UINT16)dst; } I286FN _xor_al_data8(void) { // 34: or al, DATA8 UINT src; + UINT dst; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCBYTE(src); - BYTE_XOR(I286_AL, src); + dst = I286_AL; + XORBYTE(dst, src); + I286_AL = (BYTE)dst; } I286FN _xor_ax_data16(void) { // 35: or ax, DATA16 UINT32 src; + UINT32 dst; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCWORD(src); - WORD_XOR(I286_AX, src); + dst = I286_AX; + XORWORD(dst, src); + I286_AX = (UINT16)dst; } -I286FN _segprefix_ss(void) { // 36: cs: +I286FN _segprefix_ss(void) { // 36: ss: SS_FIX = SS_BASE; DS_FIX = SS_BASE; - i286reg.prefix++; - if (i286reg.prefix < MAX_PREFIX) { + i286core.s.prefix++; + if (i286core.s.prefix < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op[op](); REMOVE_PREFIX - i286reg.prefix = 0; + i286core.s.prefix = 0; } else { INT_NUM(6, I286_IP); @@ -876,7 +929,7 @@ I286FN _segprefix_ss(void) { // 36: I286FN _aaa(void) { // 37: aaa - I286_CLOCK(3) + I286_WORKCLOCK(3); if ((I286_FLAGL & A_FLAG) || ((I286_AL & 0xf) > 9)) { I286_FLAGL |= A_FLAG | C_FLAG; I286_AX += 6; @@ -896,14 +949,14 @@ I286FN _cmp_ea_r8(void) { // 38: cm PREPART_EA_REG8(op, src); if (op >= 0xc0) { - I286_CLOCK(2); - dst = *(reg8_b20[op]); - BYTE_SUB(res, dst, src); + I286_WORKCLOCK(2); + dst = *(REG8_B20(op)); + SUBBYTE(res, dst, src); } else { - I286_CLOCK(7); - dst = i286_memoryread(c_calc_ea_dst[op]()); - BYTE_SUB(res, dst, src); + I286_WORKCLOCK(7); + dst = i286_memoryread(CALC_EA(op)); + SUBBYTE(res, dst, src); } } @@ -916,14 +969,14 @@ I286FN _cmp_ea_r16(void) { // 39: c PREPART_EA_REG16(op, src); if (op >= 0xc0) { - I286_CLOCK(2); - dst = *(reg16_b20[op]); - WORD_SUB(res, dst, src); + I286_WORKCLOCK(2); + dst = *(REG16_B20(op)); + SUBWORD(res, dst, src); } else { - I286_CLOCK(7); - dst = i286_memoryread_w(c_calc_ea_dst[op]()); - WORD_SUB(res, dst, src); + I286_WORKCLOCK(7); + dst = i286_memoryread_w(CALC_EA(op)); + SUBWORD(res, dst, src); } } @@ -937,7 +990,7 @@ I286FN _cmp_r8_ea(void) { // 3a: cm PREPART_REG8_EA(op, src, out, 2, 6); dst = *out; - BYTE_SUB(res, dst, src); + SUBBYTE(res, dst, src); } I286FN _cmp_r16_ea(void) { // 3b: cmp REG16, EA @@ -950,7 +1003,7 @@ I286FN _cmp_r16_ea(void) { // 3b: c PREPART_REG16_EA(op, src, out, 2, 6); dst = *out; - WORD_SUB(res, dst, src); + SUBWORD(res, dst, src); } I286FN _cmp_al_data8(void) { // 3c: cmp al, DATA8 @@ -958,9 +1011,9 @@ I286FN _cmp_al_data8(void) { // 3c: UINT src; UINT res; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCBYTE(src); - BYTE_SUB(res, I286_AL, src); + SUBBYTE(res, I286_AL, src); } I286FN _cmp_ax_data16(void) { // 3d: cmp ax, DATA16 @@ -968,22 +1021,22 @@ I286FN _cmp_ax_data16(void) { // 3d: UINT32 src; UINT32 res; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCWORD(src); - WORD_SUB(res, I286_AX, src); + SUBWORD(res, I286_AX, src); } I286FN _segprefix_ds(void) { // 3e: ds: SS_FIX = DS_BASE; DS_FIX = DS_BASE; - i286reg.prefix++; - if (i286reg.prefix < MAX_PREFIX) { + i286core.s.prefix++; + if (i286core.s.prefix < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op[op](); REMOVE_PREFIX - i286reg.prefix = 0; + i286core.s.prefix = 0; } else { INT_NUM(6, I286_IP); @@ -992,7 +1045,7 @@ I286FN _segprefix_ds(void) { // 3e: I286FN _aas(void) { // 3f: aas - I286_CLOCK(3) + I286_WORKCLOCK(3); if ((I286_FLAGL & A_FLAG) || ((I286_AL & 0xf) > 9)) { I286_FLAGL |= A_FLAG | C_FLAG; I286_AX -= 6; @@ -1003,43 +1056,108 @@ I286FN _aas(void) { // 3f: aas } } -I286_P _inc_ax(void) INCWORD(I286_AX, 2) // 40: inc ax -I286_P _inc_cx(void) INCWORD(I286_CX, 2) // 41: inc cx -I286_P _inc_dx(void) INCWORD(I286_DX, 2) // 42: inc dx -I286_P _inc_bx(void) INCWORD(I286_BX, 2) // 43: inc bx -I286_P _inc_sp(void) INCWORD(I286_SP, 2) // 44: inc sp -I286_P _inc_bp(void) INCWORD(I286_BP, 2) // 45: inc bp -I286_P _inc_si(void) INCWORD(I286_SI, 2) // 46: inc si -I286_P _inc_di(void) INCWORD(I286_DI, 2) // 47: inc di -I286_P _dec_ax(void) DECWORD(I286_AX, 2) // 48: dec ax -I286_P _dec_cx(void) DECWORD(I286_CX, 2) // 49: dec cx -I286_P _dec_dx(void) DECWORD(I286_DX, 2) // 4a: dec dx -I286_P _dec_bx(void) DECWORD(I286_BX, 2) // 4b: dec bx -I286_P _dec_sp(void) DECWORD(I286_SP, 2) // 4c: dec sp -I286_P _dec_bp(void) DECWORD(I286_BP, 2) // 4d: dec bp -I286_P _dec_si(void) DECWORD(I286_SI, 2) // 4e: dec si -I286_P _dec_di(void) DECWORD(I286_DI, 2) // 4f: dec di - -I286_P _push_ax(void) REGPUSH(I286_AX, 3) // 50: push ax -I286_P _push_cx(void) REGPUSH(I286_CX, 3) // 51: push cx -I286_P _push_dx(void) REGPUSH(I286_DX, 3) // 52: push dx -I286_P _push_bx(void) REGPUSH(I286_BX, 3) // 53: push bx -I286_P _push_sp(void) SP_PUSH(I286_SP, 3) // 54: push sp -I286_P _push_bp(void) REGPUSH(I286_BP, 3) // 55: push bp -I286_P _push_si(void) REGPUSH(I286_SI, 3) // 56: push si -I286_P _push_di(void) REGPUSH(I286_DI, 3) // 57: push di -I286_P _pop_ax(void) REGPOP(I286_AX, 5) // 58: pop ax -I286_P _pop_cx(void) REGPOP(I286_CX, 5) // 59: pop cx -I286_P _pop_dx(void) REGPOP(I286_DX, 5) // 5A: pop dx -I286_P _pop_bx(void) REGPOP(I286_BX, 5) // 5B: pop bx -I286_P _pop_sp(void) REGPOP(I286_SP, 5) // 5C: pop sp -I286_P _pop_bp(void) REGPOP(I286_BP, 5) // 5D: pop bp -I286_P _pop_si(void) REGPOP(I286_SI, 5) // 5E: pop si -I286_P _pop_di(void) REGPOP(I286_DI, 5) // 5F: pop di +I286FN _inc_ax(void) INCWORD2(I286_AX, 2) // 40: inc ax +I286FN _inc_cx(void) INCWORD2(I286_CX, 2) // 41: inc cx +I286FN _inc_dx(void) INCWORD2(I286_DX, 2) // 42: inc dx +I286FN _inc_bx(void) INCWORD2(I286_BX, 2) // 43: inc bx +I286FN _inc_sp(void) INCWORD2(I286_SP, 2) // 44: inc sp +I286FN _inc_bp(void) INCWORD2(I286_BP, 2) // 45: inc bp +I286FN _inc_si(void) INCWORD2(I286_SI, 2) // 46: inc si +I286FN _inc_di(void) INCWORD2(I286_DI, 2) // 47: inc di +I286FN _dec_ax(void) DECWORD2(I286_AX, 2) // 48: dec ax +I286FN _dec_cx(void) DECWORD2(I286_CX, 2) // 49: dec cx +I286FN _dec_dx(void) DECWORD2(I286_DX, 2) // 4a: dec dx +I286FN _dec_bx(void) DECWORD2(I286_BX, 2) // 4b: dec bx +I286FN _dec_sp(void) DECWORD2(I286_SP, 2) // 4c: dec sp +I286FN _dec_bp(void) DECWORD2(I286_BP, 2) // 4d: dec bp +I286FN _dec_si(void) DECWORD2(I286_SI, 2) // 4e: dec si +I286FN _dec_di(void) DECWORD2(I286_DI, 2) // 4f: dec di + +I286FN _push_ax(void) REGPUSH(I286_AX, 3) // 50: push ax +I286FN _push_cx(void) REGPUSH(I286_CX, 3) // 51: push cx +I286FN _push_dx(void) REGPUSH(I286_DX, 3) // 52: push dx +I286FN _push_bx(void) REGPUSH(I286_BX, 3) // 53: push bx +I286FN _push_sp(void) SP_PUSH(I286_SP, 3) // 54: push sp +I286FN _push_bp(void) REGPUSH(I286_BP, 3) // 55: push bp +I286FN _push_si(void) REGPUSH(I286_SI, 3) // 56: push si +I286FN _push_di(void) REGPUSH(I286_DI, 3) // 57: push di +I286FN _pop_ax(void) REGPOP(I286_AX, 5) // 58: pop ax +I286FN _pop_cx(void) REGPOP(I286_CX, 5) // 59: pop cx +I286FN _pop_dx(void) REGPOP(I286_DX, 5) // 5A: pop dx +I286FN _pop_bx(void) REGPOP(I286_BX, 5) // 5B: pop bx +I286FN _pop_sp(void) SP_POP(I286_SP, 5) // 5C: pop sp +I286FN _pop_bp(void) REGPOP(I286_BP, 5) // 5D: pop bp +I286FN _pop_si(void) REGPOP(I286_SI, 5) // 5E: pop si +I286FN _pop_di(void) REGPOP(I286_DI, 5) // 5F: pop di -I286_P _pusha(void) { // 60: pusha +#if (defined(ARM) || defined(X11)) && defined(BYTESEX_LITTLE) - UINT16 tmp; +I286FN _pusha(void) { // 60: pusha + + REG16 tmp; + UINT32 addr; + + I286_WORKCLOCK(17); + tmp = I286_SP; + addr = tmp + SS_BASE; + if ((tmp < 16) || (INHIBIT_WORDP(addr))) { + REGPUSH0(I286_AX) + REGPUSH0(I286_CX) + REGPUSH0(I286_DX) + REGPUSH0(I286_BX) + REGPUSH0(tmp) + REGPUSH0(I286_BP) + REGPUSH0(I286_SI) + REGPUSH0(I286_DI) + } + else { + *(UINT16 *)(mem + addr - 2) = I286_AX; + *(UINT16 *)(mem + addr - 4) = I286_CX; + *(UINT16 *)(mem + addr - 6) = I286_DX; + *(UINT16 *)(mem + addr - 8) = I286_BX; + *(UINT16 *)(mem + addr - 10) = tmp; + *(UINT16 *)(mem + addr - 12) = I286_BP; + *(UINT16 *)(mem + addr - 14) = I286_SI; + *(UINT16 *)(mem + addr - 16) = I286_DI; + I286_SP -= 16; + } +} + +I286FN _popa(void) { // 61: popa + + UINT tmp; + UINT32 addr; + + I286_WORKCLOCK(19); + tmp = I286_SP + 16; + addr = tmp + SS_BASE; + if ((tmp >= 0x10000) || (INHIBIT_WORDP(addr))) { + REGPOP0(I286_DI); + REGPOP0(I286_SI); + REGPOP0(I286_BP); + I286_SP += 2; + REGPOP0(I286_BX); + REGPOP0(I286_DX); + REGPOP0(I286_CX); + REGPOP0(I286_AX); + } + else { + I286_DI = *(UINT16 *)(mem + addr - 16); + I286_SI = *(UINT16 *)(mem + addr - 14); + I286_BP = *(UINT16 *)(mem + addr - 12); + I286_BX = *(UINT16 *)(mem + addr - 8); + I286_DX = *(UINT16 *)(mem + addr - 6); + I286_CX = *(UINT16 *)(mem + addr - 4); + I286_AX = *(UINT16 *)(mem + addr - 2); + I286_SP = tmp; + } +} + +#else + +I286FN _pusha(void) { // 60: pusha + + REG16 tmp; tmp = I286_SP; REGPUSH0(I286_AX) @@ -1050,10 +1168,10 @@ I286_P _pusha(void) { // 60: pusha REGPUSH0(I286_BP) REGPUSH0(I286_SI) REGPUSH0(I286_DI) - I286_CLOCK(17) + I286_WORKCLOCK(17); } -I286_P _popa(void) { // 61: popa +I286FN _popa(void) { // 61: popa REGPOP0(I286_DI); REGPOP0(I286_SI); @@ -1063,23 +1181,25 @@ I286_P _popa(void) { // 61: popa REGPOP0(I286_DX); REGPOP0(I286_CX); REGPOP0(I286_AX); - I286_CLOCK(19) + I286_WORKCLOCK(19); } -I286_P _bound(void) { // 62: bound +#endif + +I286FN _bound(void) { // 62: bound UINT vect = 0; UINT op; UINT32 madr; - UINT16 reg; + REG16 reg; - I286_CLOCK(13); // ToDo + I286_WORKCLOCK(13); // ToDo GET_PCBYTE(op); if (op < 0xc0) { - reg = *(reg16_b53[op]); - madr = c_calc_ea_dst[op](); + reg = *(REG16_B53(op)); + madr = CALC_EA(op); if (reg >= i286_memoryread_w(madr)) { - madr += 2; // ToDo + madr += 2; // ToDo if (reg <= i286_memoryread_w(madr)) { return; } @@ -1092,7 +1212,7 @@ I286_P _bound(void) { // 62: bound INT_NUM(vect, I286_IP); } -I286_P _arpl(void) { // 63: arpl +I286FN _arpl(void) { // 63: arpl UINT op; UINT tmp; @@ -1100,11 +1220,11 @@ I286_P _arpl(void) { // 63: arpl GET_PCBYTE(op) tmp = ((op < 0xc0)?1:0); I286_IP += (BYTE)tmp; - I286_CLOCK(tmp + 10); + I286_WORKCLOCK(tmp + 10); INT_NUM(6, I286_IP); } -I286_P _push_data16(void) { // 68: push DATA16 +I286FN _push_data16(void) { // 68: push DATA16 UINT16 tmp; @@ -1112,7 +1232,7 @@ I286_P _push_data16(void) { // 68: pu REGPUSH(tmp, 3) } -I286_P _imul_reg_ea_data16(void) { // 69: imul REG, EA, DATA16 +I286FN _imul_reg_ea_data16(void) { // 69: imul REG, EA, DATA16 UINT16 *out; UINT op; @@ -1126,7 +1246,7 @@ I286_P _imul_reg_ea_data16(void) { // 6 *out = (UINT16)res; } -I286_P _push_data8(void) { // 6A: push DATA8 +I286FN _push_data8(void) { // 6A: push DATA8 UINT16 tmp; @@ -1134,7 +1254,7 @@ I286_P _push_data8(void) { // 6A: pus REGPUSH(tmp, 3) } -I286_P _imul_reg_ea_data8(void) { // 6B: imul REG, EA, DATA8 +I286FN _imul_reg_ea_data8(void) { // 6B: imul REG, EA, DATA8 UINT16 *out; UINT op; @@ -1148,132 +1268,132 @@ I286_P _imul_reg_ea_data8(void) { // 6B *out = (UINT16)res; } -I286_P _insb(void) { // 6C: insb +I286FN _insb(void) { // 6C: insb - BYTE dat; + REG8 dat; - I286_CLOCK(5) + I286_WORKCLOCK(5); dat = iocore_inp8(I286_DX); i286_memorywrite(I286_DI + ES_BASE, dat); I286_DI += STRING_DIR; } -I286_P _insw(void) { // 6D: insw +I286FN _insw(void) { // 6D: insw - UINT16 dat; + REG16 dat; - I286_CLOCK(5) + I286_WORKCLOCK(5); dat = iocore_inp16(I286_DX); i286_memorywrite_w(I286_DI + ES_BASE, dat); I286_DI += STRING_DIRx2; } -I286_P _outsb(void) { // 6E: outsb +I286FN _outsb(void) { // 6E: outsb - BYTE dat; + REG8 dat; - I286_CLOCK(3) + I286_WORKCLOCK(3); dat = i286_memoryread(I286_SI + DS_FIX); I286_SI += STRING_DIR; - iocore_out8(I286_DX, dat); + iocore_out8(I286_DX, (BYTE)dat); } -I286_P _outsw(void) { // 6F: outsw +I286FN _outsw(void) { // 6F: outsw - UINT16 dat; + REG16 dat; - I286_CLOCK(3) + I286_WORKCLOCK(3); dat = i286_memoryread_w(I286_SI + DS_FIX); I286_SI += STRING_DIRx2; - iocore_out16(I286_DX, dat); + iocore_out16(I286_DX, (UINT16)dat); } -I286_P _jo_short(void) { // 70: jo short +I286FN _jo_short(void) { // 70: jo short if (!I286_OV) JMPNOP(2) else JMPSHORT(7) } -I286_P _jno_short(void) { // 71: jno short +I286FN _jno_short(void) { // 71: jno short if (I286_OV) JMPNOP(2) else JMPSHORT(7) } -I286_P _jc_short(void) { // 72: jnae/jb/jc short +I286FN _jc_short(void) { // 72: jnae/jb/jc short if (!(I286_FLAGL & C_FLAG)) JMPNOP(2) else JMPSHORT(7) } -I286_P _jnc_short(void) { // 73: jae/jnb/jnc short +I286FN _jnc_short(void) { // 73: jae/jnb/jnc short if (I286_FLAGL & C_FLAG) JMPNOP(2) else JMPSHORT(7) } -I286_P _jz_short(void) { // 74: je/jz short +I286FN _jz_short(void) { // 74: je/jz short if (!(I286_FLAGL & Z_FLAG)) JMPNOP(2) else JMPSHORT(7) } -I286_P _jnz_short(void) { // 75: jne/jnz short +I286FN _jnz_short(void) { // 75: jne/jnz short if (I286_FLAGL & Z_FLAG) JMPNOP(2) else JMPSHORT(7) } -I286_P _jna_short(void) { // 76: jna/jbe short +I286FN _jna_short(void) { // 76: jna/jbe short if (!(I286_FLAGL & (Z_FLAG | C_FLAG))) JMPNOP(2) else JMPSHORT(7) } -I286_P _ja_short(void) { // 77: ja/jnbe short +I286FN _ja_short(void) { // 77: ja/jnbe short if (I286_FLAGL & (Z_FLAG | C_FLAG)) JMPNOP(2) else JMPSHORT(7) } -I286_P _js_short(void) { // 78: js short +I286FN _js_short(void) { // 78: js short if (!(I286_FLAGL & S_FLAG)) JMPNOP(2) else JMPSHORT(7) } -I286_P _jns_short(void) { // 79: jns short +I286FN _jns_short(void) { // 79: jns short if (I286_FLAGL & S_FLAG) JMPNOP(2) else JMPSHORT(7) } -I286_P _jp_short(void) { // 7A: jp/jpe short +I286FN _jp_short(void) { // 7A: jp/jpe short if (!(I286_FLAGL & P_FLAG)) JMPNOP(2) else JMPSHORT(7) } -I286_P _jnp_short(void) { // 7B: jnp/jpo short +I286FN _jnp_short(void) { // 7B: jnp/jpo short if (I286_FLAGL & P_FLAG) JMPNOP(2) else JMPSHORT(7) } -I286_P _jl_short(void) { // 7C: jl/jnge short +I286FN _jl_short(void) { // 7C: jl/jnge short if (((I286_FLAGL & S_FLAG) == 0) == (I286_OV == 0)) JMPNOP(2) else JMPSHORT(7) } -I286_P _jnl_short(void) { // 7D: jnl/jge short +I286FN _jnl_short(void) { // 7D: jnl/jge short if (((I286_FLAGL & S_FLAG) == 0) != (I286_OV == 0)) JMPNOP(2) else JMPSHORT(7) } -I286_P _jle_short(void) { // 7E: jle/jng short +I286FN _jle_short(void) { // 7E: jle/jng short if ((!(I286_FLAGL & Z_FLAG)) && (((I286_FLAGL & S_FLAG) == 0) == (I286_OV == 0))) JMPNOP(2) else JMPSHORT(7) } -I286_P _jnle_short(void) { // 7F: jg/jnle short +I286FN _jnle_short(void) { // 7F: jg/jnle short if ((I286_FLAGL & Z_FLAG) || (((I286_FLAGL & S_FLAG) == 0) != (I286_OV == 0))) JMPNOP(2) else JMPSHORT(7) } -I286_P _calc_ea8_i8(void) { // 80: op EA8, DATA8 +I286FN _calc_ea8_i8(void) { // 80: op EA8, DATA8 // 82: op EA8, DATA8 BYTE *out; UINT op; @@ -1281,12 +1401,12 @@ I286_P _calc_ea8_i8(void) { // 80: o GET_PCBYTE(op) if (op >= 0xc0) { - I286_CLOCK(3) - out = reg8_b20[op]; + I286_WORKCLOCK(3); + 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) { c_op8xext8_table[(op >> 3) & 7](madr); return; @@ -1296,7 +1416,7 @@ I286_P _calc_ea8_i8(void) { // 80: o c_op8xreg8_table[(op >> 3) & 7](out); } -I286_P _calc_ea16_i16(void) { // 81: op EA16, DATA16 +I286FN _calc_ea16_i16(void) { // 81: op EA16, DATA16 UINT16 *out; UINT op; @@ -1305,12 +1425,12 @@ I286_P _calc_ea16_i16(void) { // 81: GET_PCBYTE(op) if (op >= 0xc0) { - I286_CLOCK(3) - out = reg16_b20[op]; + I286_WORKCLOCK(3); + 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)) { GET_PCWORD(src); c_op8xext16_table[(op >> 3) & 7](madr, src); @@ -1322,7 +1442,7 @@ I286_P _calc_ea16_i16(void) { // 81: c_op8xreg16_table[(op >> 3) & 7](out, src); } -I286_P _calc_ea16_i8(void) { // 83: op EA16, DATA8 +I286FN _calc_ea16_i8(void) { // 83: op EA16, DATA8 UINT16 *out; UINT op; @@ -1331,12 +1451,12 @@ I286_P _calc_ea16_i8(void) { // 83: o GET_PCBYTE(op) if (op >= 0xc0) { - I286_CLOCK(3) - out = reg16_b20[op]; + I286_WORKCLOCK(3); + 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)) { GET_PCBYTES(src); c_op8xext16_table[(op >> 3) & 7](madr, src); @@ -1348,7 +1468,7 @@ I286_P _calc_ea16_i8(void) { // 83: o c_op8xreg16_table[(op >> 3) & 7](out, src); } -I286_P _test_ea_r8(void) { // 84: test EA, REG8 +I286FN _test_ea_r8(void) { // 84: test EA, REG8 BYTE *out; UINT op; @@ -1358,12 +1478,12 @@ I286_P _test_ea_r8(void) { // 84: te PREPART_EA_REG8(op, src); if (op >= 0xc0) { - I286_CLOCK(2); - out = reg8_b20[op]; + I286_WORKCLOCK(2); + out = REG8_B20(op); } else { - I286_CLOCK(6); - madr = c_calc_ea_dst[op](); + I286_WORKCLOCK(6); + madr = CALC_EA(op); if (madr >= I286_MEMWRITEMAX) { tmp = i286_memoryread(madr); ANDBYTE(tmp, src); @@ -1375,7 +1495,7 @@ I286_P _test_ea_r8(void) { // 84: te ANDBYTE(tmp, src); } -I286_P _test_ea_r16(void) { // 85: test EA, REG16 +I286FN _test_ea_r16(void) { // 85: test EA, REG16 UINT16 *out; UINT op; @@ -1385,12 +1505,12 @@ I286_P _test_ea_r16(void) { // 85: t PREPART_EA_REG16(op, src); 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)) { tmp = i286_memoryread_w(madr); ANDWORD(tmp, src); @@ -1402,7 +1522,7 @@ I286_P _test_ea_r16(void) { // 85: t ANDWORD(tmp, src); } -I286_P _xchg_ea_r8(void) { // 86: xchg EA, REG8 +I286FN _xchg_ea_r8(void) { // 86: xchg EA, REG8 BYTE *out; BYTE *src; @@ -1411,12 +1531,12 @@ I286_P _xchg_ea_r8(void) { // 86: xc PREPART_EA_REG8P(op, src); if (op >= 0xc0) { - I286_CLOCK(3); - out = reg8_b20[op]; + I286_WORKCLOCK(3); + out = REG8_B20(op); } else { - I286_CLOCK(5); - madr = c_calc_ea_dst[op](); + I286_WORKCLOCK(5); + madr = CALC_EA(op); if (madr >= I286_MEMWRITEMAX) { BYTE tmp = i286_memoryread(madr); i286_memorywrite(madr, *src); @@ -1428,7 +1548,7 @@ I286_P _xchg_ea_r8(void) { // 86: xc SWAPBYTE(*out, *src); } -I286_P _xchg_ea_r16(void) { // 87: xchg EA, REG16 +I286FN _xchg_ea_r16(void) { // 87: xchg EA, REG16 UINT16 *out; UINT16 *src; @@ -1437,12 +1557,12 @@ I286_P _xchg_ea_r16(void) { // 87: x PREPART_EA_REG16P(op, src); if (op >= 0xc0) { - I286_CLOCK(3); - out = reg16_b20[op]; + I286_WORKCLOCK(3); + out = REG16_B20(op); } else { - I286_CLOCK(5); - madr = c_calc_ea_dst[op](); + I286_WORKCLOCK(5); + madr = CALC_EA(op); if (INHIBIT_WORDP(madr)) { UINT16 tmp = i286_memoryread_w(madr); i286_memorywrite_w(madr, *src); @@ -1454,7 +1574,7 @@ I286_P _xchg_ea_r16(void) { // 87: x SWAPWORD(*out, *src); } -I286_P _mov_ea_r8(void) { // 88: mov EA, REG8 +I286FN _mov_ea_r8(void) { // 88: mov EA, REG8 BYTE src; UINT op; @@ -1462,33 +1582,33 @@ I286_P _mov_ea_r8(void) { // 88: mov PREPART_EA_REG8(op, src) if (op >= 0xc0) { - I286_CLOCK(2); - *(reg8_b20[op]) = src; + I286_WORKCLOCK(2); + *(REG8_B20(op)) = src; } else { - I286_CLOCK(3); - madr = c_calc_ea_dst[op](); + I286_WORKCLOCK(3); + madr = CALC_EA(op); i286_memorywrite(madr, src); } } -I286_P _mov_ea_r16(void) { // 89: mov EA, REG16 +I286FN _mov_ea_r16(void) { // 89: mov EA, REG16 UINT16 src; UINT op; PREPART_EA_REG16(op, src); if (op >= 0xc0) { - I286_CLOCK(2); - *(reg16_b20[op]) = src; + I286_WORKCLOCK(2); + *(REG16_B20(op)) = src; } else { - I286_CLOCK(3); - i286_memorywrite_w(c_calc_ea_dst[op](), src); + I286_WORKCLOCK(3); + i286_memorywrite_w(CALC_EA(op), src); } } -I286_P _mov_r8_ea(void) { // 8A: mov REG8, EA +I286FN _mov_r8_ea(void) { // 8A: mov REG8, EA BYTE *out; BYTE src; @@ -1498,7 +1618,7 @@ I286_P _mov_r8_ea(void) { // 8A: mov *out = src; } -I286_P _mov_r16_ea(void) { // 8B: mov REG16, EA +I286FN _mov_r16_ea(void) { // 8B: mov REG16, EA UINT16 *out; UINT16 src; @@ -1508,7 +1628,7 @@ I286_P _mov_r16_ea(void) { // 8B: mo *out = src; } -I286_P _mov_ea_seg(void) { // 8C: mov EA, segreg +I286FN _mov_ea_seg(void) { // 8C: mov EA, segreg UINT op; UINT16 tmp; @@ -1516,30 +1636,30 @@ I286_P _mov_ea_seg(void) { // 8C: mo GET_PCBYTE(op); tmp = *SEGMENTPTR((op >> 3) & 3); if (op >= 0xc0) { - I286_CLOCK(2) - *(reg16_b20[op]) = tmp; + I286_WORKCLOCK(2); + *(REG16_B20(op)) = tmp; } else { - I286_CLOCK(3) - i286_memorywrite_w(c_calc_ea_dst[op](), tmp); + I286_WORKCLOCK(3); + i286_memorywrite_w(CALC_EA(op), tmp); } } -I286_P _lea_r16_ea(void) { // 8D: lea REG16, EA +I286FN _lea_r16_ea(void) { // 8D: lea REG16, EA UINT op; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCBYTE(op) if (op < 0xc0) { - *(reg16_b53[op]) = c_calc_lea[op](); + *(REG16_B53(op)) = CALC_LEA(op); } else { INT_NUM(6, I286_SP - 2); } } -I286_P _mov_seg_ea(void) { // 8E: mov segrem, EA +I286FN _mov_seg_ea(void) { // 8E: mov segrem, EA UINT op; UINT tmp; @@ -1548,12 +1668,12 @@ I286_P _mov_seg_ea(void) { // 8E: mo ipbak = I286_IP; GET_PCBYTE(op); if (op >= 0xc0) { - I286_CLOCK(2) - tmp = *(reg16_b20[op]); + I286_WORKCLOCK(2); + tmp = *(REG16_B20(op)); } else { - I286_CLOCK(5) - tmp = i286_memoryread_w(c_calc_ea_dst[op]()); + I286_WORKCLOCK(5); + tmp = i286_memoryread_w(CALC_EA(op)); } switch(op & 0x18) { case 0x00: // es @@ -1580,29 +1700,29 @@ I286_P _mov_seg_ea(void) { // 8E: mo } } -I286_P _pop_ea(void) { // 8F: pop EA +I286FN _pop_ea(void) { // 8F: pop EA UINT op; UINT16 tmp; - I286_CLOCK(5) + I286_WORKCLOCK(5); REGPOP0(tmp) GET_PCBYTE(op) if (op < 0xc0) { - i286_memorywrite_w(c_calc_ea_dst[op](), tmp); + i286_memorywrite_w(CALC_EA(op), tmp); } else { - *(reg16_b20[op]) = tmp; + *(REG16_B20(op)) = tmp; } } -I286_P _nop(void) { // 90: nop / bios func +I286FN _nop(void) { // 90: nop / bios func #if 1 // call BIOS UINT32 adrs; - adrs = ((I286_IP - 1) & 0xffff) + CS_BASE; + adrs = LOW16(I286_IP - 1) + CS_BASE; if ((adrs >= 0xf8000) && (adrs < 0x100000)) { biosfunc(adrs); ES_BASE = I286_ES << 4; @@ -1613,68 +1733,68 @@ I286_P _nop(void) { // 90: nop / b DS_FIX = DS_BASE; } #endif - I286_CLOCK(3) + I286_WORKCLOCK(3); } -I286_P _xchg_ax_cx(void) { // 91: xchg ax, cx +I286FN _xchg_ax_cx(void) { // 91: xchg ax, cx - I286_CLOCK(3); + I286_WORKCLOCK(3); SWAPWORD(I286_AX, I286_CX); } -I286_P _xchg_ax_dx(void) { // 92: xchg ax, dx +I286FN _xchg_ax_dx(void) { // 92: xchg ax, dx - I286_CLOCK(3); + I286_WORKCLOCK(3); SWAPWORD(I286_AX, I286_DX); } -I286_P _xchg_ax_bx(void) { // 93: xchg ax, bx +I286FN _xchg_ax_bx(void) { // 93: xchg ax, bx - I286_CLOCK(3); + I286_WORKCLOCK(3); SWAPWORD(I286_AX, I286_BX); } -I286_P _xchg_ax_sp(void) { // 94: xchg ax, sp +I286FN _xchg_ax_sp(void) { // 94: xchg ax, sp - I286_CLOCK(3); + I286_WORKCLOCK(3); SWAPWORD(I286_AX, I286_SP); } -I286_P _xchg_ax_bp(void) { // 95: xchg ax, bp +I286FN _xchg_ax_bp(void) { // 95: xchg ax, bp - I286_CLOCK(3); + I286_WORKCLOCK(3); SWAPWORD(I286_AX, I286_BP); } -I286_P _xchg_ax_si(void) { // 96: xchg ax, si +I286FN _xchg_ax_si(void) { // 96: xchg ax, si - I286_CLOCK(3); + I286_WORKCLOCK(3); SWAPWORD(I286_AX, I286_SI); } -I286_P _xchg_ax_di(void) { // 97: xchg ax, di +I286FN _xchg_ax_di(void) { // 97: xchg ax, di - I286_CLOCK(3); + I286_WORKCLOCK(3); SWAPWORD(I286_AX, I286_DI); } -I286_P _cbw(void) { // 98: cbw +I286FN _cbw(void) { // 98: cbw - I286_CLOCK(2) + I286_WORKCLOCK(2); I286_AX = __CBW(I286_AL); } -I286_P _cwd(void) { // 99: cwd +I286FN _cwd(void) { // 99: cwd - I286_CLOCK(2) + I286_WORKCLOCK(2); I286_DX = ((I286_AH & 0x80)?0xffff:0x0000); } -I286_P _call_far(void) { // 9A: call far +I286FN _call_far(void) { // 9A: call far UINT16 newip; - I286_CLOCK(13) + I286_WORKCLOCK(13); REGPUSH0(I286_CS) GET_PCWORD(newip) GET_PCWORD(I286_CS) @@ -1683,218 +1803,226 @@ I286_P _call_far(void) { // 9A: call I286_IP = newip; } -I286_P _wait(void) { // 9B: wait +I286FN _wait(void) { // 9B: wait - I286_CLOCK(2) + I286_WORKCLOCK(2); } -I286_P _pushf(void) { // 9C: pushf +I286FN _pushf(void) { // 9C: pushf REGPUSH(REAL_FLAGREG, 3) } -I286_P _popf(void) { // 9D: popf +I286FN _popf(void) { // 9D: popf - I286_CLOCK(5) - REGPOP0(I286_FLAG) - I286_OV = I286_FLAG & O_FLAG; - I286_FLAG &= (0xfff ^ O_FLAG); - I286_TRAP = ((I286_FLAG & 0x300) == 0x300); + UINT flag; + + I286_WORKCLOCK(5); + REGPOP0(flag) + I286_OV = flag & O_FLAG; + I286_FLAG = flag & (0xfff ^ O_FLAG); + I286_TRAP = ((flag & 0x300) == 0x300); +#if defined(INTR_FAST) + if (EXISTINTR) { + I286IRQCHECKTERM + } +#else I286IRQCHECKTERM +#endif } -I286_P _sahf(void) { // 9E: sahf +I286FN _sahf(void) { // 9E: sahf - I286_CLOCK(2) + I286_WORKCLOCK(2); I286_FLAGL = I286_AH; } -I286_P _lahf(void) { // 9F: lahf +I286FN _lahf(void) { // 9F: lahf - I286_CLOCK(2) + I286_WORKCLOCK(2); I286_AH = I286_FLAGL; } -I286_P _mov_al_m8(void) { // A0: mov al, m8 +I286FN _mov_al_m8(void) { // A0: mov al, m8 UINT op; - I286_CLOCK(5) + I286_WORKCLOCK(5); GET_PCWORD(op) I286_AL = i286_memoryread(DS_FIX + op); } -I286_P _mov_ax_m16(void) { // A1: mov ax, m16 +I286FN _mov_ax_m16(void) { // A1: mov ax, m16 UINT op; - I286_CLOCK(5) + I286_WORKCLOCK(5); GET_PCWORD(op) I286_AX = i286_memoryread_w(DS_FIX + op); } -I286_P _mov_m8_al(void) { // A2: mov m8, al +I286FN _mov_m8_al(void) { // A2: mov m8, al UINT op; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCWORD(op) i286_memorywrite(DS_FIX + op, I286_AL); } -I286_P _mov_m16_ax(void) { // A3: mov m16, ax +I286FN _mov_m16_ax(void) { // A3: mov m16, ax UINT op; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCWORD(op); i286_memorywrite_w(DS_FIX + op, I286_AX); } -I286_P _movsb(void) { // A4: movsb +I286FN _movsb(void) { // A4: movsb BYTE tmp; - I286_CLOCK(5) + I286_WORKCLOCK(5); tmp = i286_memoryread(I286_SI + DS_FIX); i286_memorywrite(I286_DI + ES_BASE, tmp); I286_SI += STRING_DIR; I286_DI += STRING_DIR; } -I286_P _movsw(void) { // A5: movsw +I286FN _movsw(void) { // A5: movsw UINT16 tmp; - I286_CLOCK(5) + I286_WORKCLOCK(5); tmp = i286_memoryread_w(I286_SI + DS_FIX); i286_memorywrite_w(I286_DI + ES_BASE, tmp); I286_SI += STRING_DIRx2; I286_DI += STRING_DIRx2; } -I286_P _cmpsb(void) { // A6: cmpsb +I286FN _cmpsb(void) { // A6: cmpsb UINT src; UINT dst; UINT res; - I286_CLOCK(8) + I286_WORKCLOCK(8); dst = i286_memoryread(I286_SI + DS_FIX); src = i286_memoryread(I286_DI + ES_BASE); - BYTE_SUB(res, dst, src) + SUBBYTE(res, dst, src) I286_SI += STRING_DIR; I286_DI += STRING_DIR; } -I286_P _cmpsw(void) { // A7: cmpsw +I286FN _cmpsw(void) { // A7: cmpsw UINT32 src; UINT32 dst; UINT32 res; - I286_CLOCK(8) + I286_WORKCLOCK(8); dst = i286_memoryread_w(I286_SI + DS_FIX); src = i286_memoryread_w(I286_DI + ES_BASE); - WORD_SUB(res, dst, src) + SUBWORD(res, dst, src) I286_SI += STRING_DIRx2; I286_DI += STRING_DIRx2; } -I286_P _test_al_data8(void) { // A8: test al, DATA8 +I286FN _test_al_data8(void) { // A8: test al, DATA8 UINT src; UINT dst; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCBYTE(src) dst = I286_AL; ANDBYTE(dst, src) } -I286_P _test_ax_data16(void) { // A9: test ax, DATA16 +I286FN _test_ax_data16(void) { // A9: test ax, DATA16 UINT32 src; UINT32 dst; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCWORD(src) dst = I286_AX; ANDWORD(dst, src) } -I286_P _stosb(void) { // AA: stosw +I286FN _stosb(void) { // AA: stosw - I286_CLOCK(3) + I286_WORKCLOCK(3); i286_memorywrite(I286_DI + ES_BASE, I286_AL); I286_DI += STRING_DIR; } -I286_P _stosw(void) { // AB: stosw +I286FN _stosw(void) { // AB: stosw - I286_CLOCK(3) + I286_WORKCLOCK(3); i286_memorywrite_w(I286_DI + ES_BASE, I286_AX); I286_DI += STRING_DIRx2; } -I286_P _lodsb(void) { // AC: lodsb +I286FN _lodsb(void) { // AC: lodsb - I286_CLOCK(5) + I286_WORKCLOCK(5); I286_AL = i286_memoryread(I286_SI + DS_FIX); I286_SI += STRING_DIR; } -I286_P _lodsw(void) { // AD: lodsw +I286FN _lodsw(void) { // AD: lodsw - I286_CLOCK(5) + I286_WORKCLOCK(5); I286_AX = i286_memoryread_w(I286_SI + DS_FIX); I286_SI += STRING_DIRx2; } -I286_P _scasb(void) { // AE: scasb +I286FN _scasb(void) { // AE: scasb UINT src; UINT dst; UINT res; - I286_CLOCK(7) + I286_WORKCLOCK(7); src = i286_memoryread(I286_DI + ES_BASE); dst = I286_AL; - BYTE_SUB(res, dst, src) + SUBBYTE(res, dst, src) I286_DI += STRING_DIR; } -I286_P _scasw(void) { // AF: scasw +I286FN _scasw(void) { // AF: scasw UINT32 src; UINT32 dst; UINT32 res; - I286_CLOCK(7) + I286_WORKCLOCK(7); src = i286_memoryread_w(I286_DI + ES_BASE); dst = I286_AX; - WORD_SUB(res, dst, src) + SUBWORD(res, dst, src) I286_DI += STRING_DIRx2; } -I286_P _mov_al_imm(void) MOVIMM8(I286_AL) // B0: mov al, imm8 -I286_P _mov_cl_imm(void) MOVIMM8(I286_CL) // B1: mov cl, imm8 -I286_P _mov_dl_imm(void) MOVIMM8(I286_DL) // B2: mov dl, imm8 -I286_P _mov_bl_imm(void) MOVIMM8(I286_BL) // B3: mov bl, imm8 -I286_P _mov_ah_imm(void) MOVIMM8(I286_AH) // B4: mov ah, imm8 -I286_P _mov_ch_imm(void) MOVIMM8(I286_CH) // B5: mov ch, imm8 -I286_P _mov_dh_imm(void) MOVIMM8(I286_DH) // B6: mov dh, imm8 -I286_P _mov_bh_imm(void) MOVIMM8(I286_BH) // B7: mov bh, imm8 -I286_P _mov_ax_imm(void) MOVIMM16(I286_AX) // B8: mov ax, imm16 -I286_P _mov_cx_imm(void) MOVIMM16(I286_CX) // B9: mov cx, imm16 -I286_P _mov_dx_imm(void) MOVIMM16(I286_DX) // BA: mov dx, imm16 -I286_P _mov_bx_imm(void) MOVIMM16(I286_BX) // BB: mov bx, imm16 -I286_P _mov_sp_imm(void) MOVIMM16(I286_SP) // BC: mov sp, imm16 -I286_P _mov_bp_imm(void) MOVIMM16(I286_BP) // BD: mov bp, imm16 -I286_P _mov_si_imm(void) MOVIMM16(I286_SI) // BE: mov si, imm16 -I286_P _mov_di_imm(void) MOVIMM16(I286_DI) // BF: mov di, imm16 +I286FN _mov_al_imm(void) MOVIMM8(I286_AL) // B0: mov al, imm8 +I286FN _mov_cl_imm(void) MOVIMM8(I286_CL) // B1: mov cl, imm8 +I286FN _mov_dl_imm(void) MOVIMM8(I286_DL) // B2: mov dl, imm8 +I286FN _mov_bl_imm(void) MOVIMM8(I286_BL) // B3: mov bl, imm8 +I286FN _mov_ah_imm(void) MOVIMM8(I286_AH) // B4: mov ah, imm8 +I286FN _mov_ch_imm(void) MOVIMM8(I286_CH) // B5: mov ch, imm8 +I286FN _mov_dh_imm(void) MOVIMM8(I286_DH) // B6: mov dh, imm8 +I286FN _mov_bh_imm(void) MOVIMM8(I286_BH) // B7: mov bh, imm8 +I286FN _mov_ax_imm(void) MOVIMM16(I286_AX) // B8: mov ax, imm16 +I286FN _mov_cx_imm(void) MOVIMM16(I286_CX) // B9: mov cx, imm16 +I286FN _mov_dx_imm(void) MOVIMM16(I286_DX) // BA: mov dx, imm16 +I286FN _mov_bx_imm(void) MOVIMM16(I286_BX) // BB: mov bx, imm16 +I286FN _mov_sp_imm(void) MOVIMM16(I286_SP) // BC: mov sp, imm16 +I286FN _mov_bp_imm(void) MOVIMM16(I286_BP) // BD: mov bp, imm16 +I286FN _mov_si_imm(void) MOVIMM16(I286_SI) // BE: mov si, imm16 +I286FN _mov_di_imm(void) MOVIMM16(I286_DI) // BF: mov di, imm16 -I286_P _shift_ea8_data8(void) { // C0: shift EA8, DATA8 +I286FN _shift_ea8_data8(void) { // C0: shift EA8, DATA8 BYTE *out; UINT op; @@ -1903,26 +2031,26 @@ I286_P _shift_ea8_data8(void) { // C0 GET_PCBYTE(op) if (op >= 0xc0) { - I286_CLOCK(5) - out = reg8_b20[op]; + I286_WORKCLOCK(5); + out = REG8_B20(op); } else { - I286_CLOCK(8); - madr = c_calc_ea_dst[op](); + I286_WORKCLOCK(8); + madr = CALC_EA(op); if (madr >= I286_MEMWRITEMAX) { GET_PCBYTE(cl) - I286_CLOCK(cl); + I286_WORKCLOCK(cl); sft_e8cl_table[(op >> 3) & 7](madr, cl); return; } out = mem + madr; } GET_PCBYTE(cl) - I286_CLOCK(cl); + I286_WORKCLOCK(cl); sft_r8cl_table[(op >> 3) & 7](out, cl); } -I286_P _shift_ea16_data8(void) { // C1: shift EA16, DATA8 +I286FN _shift_ea16_data8(void) { // C1: shift EA16, DATA8 UINT16 *out; UINT op; @@ -1931,53 +2059,53 @@ I286_P _shift_ea16_data8(void) { // C1 GET_PCBYTE(op) if (op >= 0xc0) { - I286_CLOCK(5) - out = reg16_b20[op]; + I286_WORKCLOCK(5); + out = REG16_B20(op); } else { - I286_CLOCK(8); - madr = c_calc_ea_dst[op](); + I286_WORKCLOCK(8); + madr = CALC_EA(op); if (INHIBIT_WORDP(madr)) { GET_PCBYTE(cl); - I286_CLOCK(cl); + I286_WORKCLOCK(cl); sft_e16cl_table[(op >> 3) & 7](madr, cl); return; } out = (UINT16 *)(mem + madr); } GET_PCBYTE(cl); - I286_CLOCK(cl); + I286_WORKCLOCK(cl); sft_r16cl_table[(op >> 3) & 7](out, cl); } -I286_P _ret_near_data16(void) { // C2: ret near DATA16 +I286FN _ret_near_data16(void) { // C2: ret near DATA16 UINT16 ad; - I286_CLOCK(11) + I286_WORKCLOCK(11); GET_PCWORD(ad) REGPOP0(I286_IP) I286_SP += ad; } -I286_P _ret_near(void) { // C3: ret near +I286FN _ret_near(void) { // C3: ret near - I286_CLOCK(11) + I286_WORKCLOCK(11); REGPOP0(I286_IP) } -I286_P _les_r16_ea(void) { // C4: les REG16, EA +I286FN _les_r16_ea(void) { // C4: les REG16, EA UINT op; - UINT16 ad; + UINT32 seg; + UINT ad; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCBYTE(op) if (op < 0xc0) { - ad = c_get_ea[op](); - *(reg16_b53[op]) = i286_memoryread_w(ad + EA_FIX); - ad += 2; - I286_ES = i286_memoryread_w(ad + EA_FIX); + ad = GET_EA(op, &seg); + *(REG16_B53(op)) = i286_memoryread_w(seg + ad); + I286_ES = i286_memoryread_w(seg + LOW16(ad + 2)); ES_BASE = I286_ES << 4; } else { @@ -1985,18 +2113,18 @@ I286_P _les_r16_ea(void) { // C4: le } } -I286_P _lds_r16_ea(void) { // C5: lds REG16, EA +I286FN _lds_r16_ea(void) { // C5: lds REG16, EA UINT op; - UINT16 ad; + UINT32 seg; + UINT ad; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCBYTE(op) if (op < 0xc0) { - ad = c_get_ea[op](); - *(reg16_b53[op]) = i286_memoryread_w(ad + EA_FIX); - ad += 2; - I286_DS = i286_memoryread_w(ad + EA_FIX); + ad = GET_EA(op, &seg); + *(REG16_B53(op)) = i286_memoryread_w(seg + ad); + I286_DS = i286_memoryread_w(seg + LOW16(ad + 2)); DS_BASE = I286_DS << 4; DS_FIX = DS_BASE; } @@ -2005,45 +2133,45 @@ I286_P _lds_r16_ea(void) { // C5: ld } } -I286_P _mov_ea8_data8(void) { // C6: mov EA8, DATA8 +I286FN _mov_ea8_data8(void) { // C6: mov EA8, DATA8 UINT op; GET_PCBYTE(op) if (op >= 0xc0) { - I286_CLOCK(2) - GET_PCBYTE(*(reg8_b53[op])) + I286_WORKCLOCK(2); + GET_PCBYTE(*(REG8_B53(op))) } - else { - UINT ad; + else { // 03/11/23 + UINT32 ad; BYTE val; - I286_CLOCK(3) - ad = c_get_ea[op](); + I286_WORKCLOCK(3); + ad = CALC_EA(op); GET_PCBYTE(val) - i286_memorywrite(ad + EA_FIX, val); + i286_memorywrite(ad, val); } } -I286_P _mov_ea16_data16(void) { // C7: mov EA16, DATA16 +I286FN _mov_ea16_data16(void) { // C7: mov EA16, DATA16 UINT op; GET_PCBYTE(op) if (op >= 0xc0) { - I286_CLOCK(2) - GET_PCWORD(*(reg16_b53[op])) + I286_WORKCLOCK(2); + GET_PCWORD(*(REG16_B53(op))) } - else { - UINT ad; + else { // 03/11/23 + UINT32 ad; UINT16 val; - I286_CLOCK(3) - ad = c_get_ea[op](); + I286_WORKCLOCK(3); + ad = CALC_EA(op); GET_PCWORD(val) - i286_memorywrite_w(ad + EA_FIX, val); + i286_memorywrite_w(ad, val); } } -I286_P _enter(void) { // C8: enter DATA16, DATA8 +I286FN _enter(void) { // C8: enter DATA16, DATA8 UINT16 dimsize; BYTE level; @@ -2053,7 +2181,7 @@ I286_P _enter(void) { // C8: enter REGPUSH0(I286_BP) level &= 0x1f; if (!level) { // enter level=0 - I286_CLOCK(11) + I286_WORKCLOCK(11); I286_BP = I286_SP; I286_SP -= dimsize; } @@ -2061,7 +2189,7 @@ I286_P _enter(void) { // C8: enter level--; if (!level) { // enter level=1 UINT16 tmp; - I286_CLOCK(15) + I286_WORKCLOCK(15); tmp = I286_SP; REGPUSH0(tmp) I286_BP = tmp; @@ -2069,14 +2197,22 @@ I286_P _enter(void) { // C8: enter } else { // enter level=2-31 UINT16 bp; - I286_CLOCK(12 + level*4) + I286_WORKCLOCK(12 + level*4); bp = I286_BP; I286_BP = I286_SP; while(level--) { +#if 1 // なにやってんだヲレ + REG16 val; + bp -= 2; + I286_SP -= 2; + val = i286_memoryread_w(bp + SS_BASE); + i286_memorywrite_w(I286_SP + SS_BASE, val); +#else UINT16 val = i286_memoryread_w(bp + SS_BASE); i286_memorywrite_w(I286_SP + SS_BASE, val); bp -= 2; I286_SP -= 2; +#endif } REGPUSH0(I286_BP) I286_SP -= dimsize; @@ -2084,18 +2220,18 @@ I286_P _enter(void) { // C8: enter } } -I286_P leave(void) { // C9: leave +I286FN fleave(void) { // C9: leave - I286_CLOCK(5) + I286_WORKCLOCK(5); I286_SP = I286_BP; REGPOP0(I286_BP) } -I286_P _ret_far_data16(void) { // CA: ret far DATA16 +I286FN _ret_far_data16(void) { // CA: ret far DATA16 UINT16 ad; - I286_CLOCK(15) + I286_WORKCLOCK(15); GET_PCWORD(ad) REGPOP0(I286_IP) REGPOP0(I286_CS) @@ -2103,53 +2239,61 @@ I286_P _ret_far_data16(void) { // CA: CS_BASE = I286_CS << 4; } -I286_P _ret_far(void) { // CB: ret far +I286FN _ret_far(void) { // CB: ret far - I286_CLOCK(15) + I286_WORKCLOCK(15); REGPOP0(I286_IP) REGPOP0(I286_CS) CS_BASE = I286_CS << 4; } -I286_P _int_03(void) { // CC: int 3 +I286FN _int_03(void) { // CC: int 3 - I286_CLOCK(23) + I286_WORKCLOCK(23); INT_NUM(3, I286_IP); } -I286_P _int_data8(void) { // CD: int DATA8 +I286FN _int_data8(void) { // CD: int DATA8 UINT vect; - I286_CLOCK(23) + I286_WORKCLOCK(23); GET_PCBYTE(vect) INT_NUM(vect, I286_IP); } -I286_P _into(void) { // CE: into +I286FN _into(void) { // CE: into - I286_CLOCK(4) + I286_WORKCLOCK(4); if (I286_OV) { - I286_CLOCK(24 - 4) + I286_WORKCLOCK(24 - 4); INT_NUM(4, I286_IP); } } -I286_P _iret(void) { // CF: iret +I286FN _iret(void) { // CF: iret + + UINT flag; extirq_pop(); - I286_CLOCK(31) + I286_WORKCLOCK(31); REGPOP0(I286_IP) REGPOP0(I286_CS) - REGPOP0(I286_FLAG) - I286_OV = I286_FLAG & O_FLAG; - I286_FLAG &= 0x7ff; - I286_TRAP = ((I286_FLAG & 0x300) == 0x300); + REGPOP0(flag) + I286_OV = flag & O_FLAG; + I286_FLAG = flag & (0xfff ^ O_FLAG); + I286_TRAP = ((flag & 0x300) == 0x300); CS_BASE = I286_CS << 4; +#if defined(INTR_FAST) + if (EXISTINTR) { + I286IRQCHECKTERM + } +#else I286IRQCHECKTERM +#endif } -I286_P _shift_ea8_1(void) { // D0: shift EA8, 1 +I286FN _shift_ea8_1(void) { // D0: shift EA8, 1 BYTE *out; UINT op; @@ -2157,12 +2301,12 @@ I286_P _shift_ea8_1(void) { // D0: sh GET_PCBYTE(op) 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) { sft_e8_table[(op >> 3) & 7](madr); return; @@ -2172,7 +2316,7 @@ I286_P _shift_ea8_1(void) { // D0: sh sft_r8_table[(op >> 3) & 7](out); } -I286_P _shift_ea16_1(void) { // D1: shift EA16, 1 +I286FN _shift_ea16_1(void) { // D1: shift EA16, 1 UINT16 *out; UINT op; @@ -2180,12 +2324,12 @@ I286_P _shift_ea16_1(void) { // D1: sh GET_PCBYTE(op) 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)) { sft_e16_table[(op >> 3) & 7](madr); return; @@ -2195,7 +2339,7 @@ I286_P _shift_ea16_1(void) { // D1: sh sft_r16_table[(op >> 3) & 7](out); } -I286_P _shift_ea8_cl(void) { // D2: shift EA8, cl +I286FN _shift_ea8_cl(void) { // D2: shift EA8, cl BYTE *out; UINT op; @@ -2204,26 +2348,26 @@ I286_P _shift_ea8_cl(void) { // D2: sh GET_PCBYTE(op) if (op >= 0xc0) { - I286_CLOCK(5) - out = reg8_b20[op]; + I286_WORKCLOCK(5); + out = REG8_B20(op); } else { - I286_CLOCK(8); - madr = c_calc_ea_dst[op](); + I286_WORKCLOCK(8); + madr = CALC_EA(op); if (madr >= I286_MEMWRITEMAX) { cl = I286_CL; - I286_CLOCK(cl); + I286_WORKCLOCK(cl); sft_e8cl_table[(op >> 3) & 7](madr, cl); return; } out = mem + madr; } cl = I286_CL; - I286_CLOCK(cl); + I286_WORKCLOCK(cl); sft_r8cl_table[(op >> 3) & 7](out, cl); } -I286_P _shift_ea16_cl(void) { // D3: shift EA16, cl +I286FN _shift_ea16_cl(void) { // D3: shift EA16, cl UINT16 *out; UINT op; @@ -2232,38 +2376,38 @@ I286_P _shift_ea16_cl(void) { // D3: s GET_PCBYTE(op) if (op >= 0xc0) { - I286_CLOCK(5) - out = reg16_b20[op]; + I286_WORKCLOCK(5); + out = REG16_B20(op); } else { - I286_CLOCK(8); - madr = c_calc_ea_dst[op](); + I286_WORKCLOCK(8); + madr = CALC_EA(op); if (INHIBIT_WORDP(madr)) { cl = I286_CL; - I286_CLOCK(cl); + I286_WORKCLOCK(cl); sft_e16cl_table[(op >> 3) & 7](madr, cl); return; } out = (UINT16 *)(mem + madr); } cl = I286_CL; - I286_CLOCK(cl); + I286_WORKCLOCK(cl); sft_r16cl_table[(op >> 3) & 7](out, cl); } -I286_P _aam(void) { // D4: AAM +I286FN _aam(void) { // D4: AAM BYTE al; BYTE div; - I286_CLOCK(16) + I286_WORKCLOCK(16); GET_PCBYTE(div); if (div) { al = I286_AL; I286_AH = al / div; I286_AL = al % div; I286_FLAGL &= ~(S_FLAG | Z_FLAG | P_FLAG); - I286_FLAGL |= szpflag_w[I286_AX]; + I286_FLAGL |= WORDSZPF(I286_AX); } else { INT_NUM(0, I286_IP - 2); // 80286 @@ -2271,210 +2415,210 @@ I286_P _aam(void) { // D4: AAM } } -I286_P _aad(void) { // D5: AAD +I286FN _aad(void) { // D5: AAD BYTE mul; - I286_CLOCK(14) + I286_WORKCLOCK(14); GET_PCBYTE(mul); I286_AL += (BYTE)(I286_AH * mul); I286_AH = 0; I286_FLAGL &= ~(S_FLAG | Z_FLAG | P_FLAG); - I286_FLAGL |= szpcflag[I286_AL]; + I286_FLAGL |= BYTESZPF(I286_AL); } -I286_P _setalc(void) { // D6: setalc (80286) +I286FN _setalc(void) { // D6: setalc (80286) I286_AL = ((I286_FLAGL & C_FLAG)?0xff:0); } -I286_P _xlat(void) { // D7: xlat +I286FN _xlat(void) { // D7: xlat - I286_CLOCK(5) - I286_AL = i286_memoryread(((I286_AL + I286_BX) & 0xffff) + DS_FIX); + I286_WORKCLOCK(5); + I286_AL = i286_memoryread(LOW16(I286_AL + I286_BX) + DS_FIX); } -I286_P _esc(void) { // D8: esc +I286FN _esc(void) { // D8: esc UINT op; - I286_CLOCK(2) + I286_WORKCLOCK(2); GET_PCBYTE(op) if (op < 0xc0) { - c_calc_lea[op](); + CALC_LEA(op); } } -I286_P _loopnz(void) { // E0: loopnz +I286FN _loopnz(void) { // E0: loopnz I286_CX--; if ((!I286_CX) || (I286_FLAGL & Z_FLAG)) JMPNOP(4) else JMPSHORT(8) } -I286_P _loopz(void) { // E1: loopz +I286FN _loopz(void) { // E1: loopz I286_CX--; if ((!I286_CX) || (!(I286_FLAGL & Z_FLAG))) JMPNOP(4) else JMPSHORT(8) } -I286_P _loop(void) { // E2: loop +I286FN _loop(void) { // E2: loop I286_CX--; if (!I286_CX) JMPNOP(4) else JMPSHORT(8) } -I286_P _jcxz(void) { // E3: jcxz +I286FN _jcxz(void) { // E3: jcxz if (I286_CX) JMPNOP(4) else JMPSHORT(8) } -I286_P _in_al_data8(void) { // E4: in al, DATA8 +I286FN _in_al_data8(void) { // E4: in al, DATA8 UINT port; - I286_CLOCK(5) + I286_WORKCLOCK(5); GET_PCBYTE(port) - i286reg.inport = CS_BASE + I286_IP; + i286core.s.inport = CS_BASE + I286_IP; I286_AL = iocore_inp8(port); - i286reg.inport = 0; + i286core.s.inport = 0; } -I286_P _in_ax_data8(void) { // E5: in ax, DATA8 +I286FN _in_ax_data8(void) { // E5: in ax, DATA8 UINT port; - I286_CLOCK(5) + I286_WORKCLOCK(5); GET_PCBYTE(port) I286_AX = iocore_inp16(port); } -I286_P _out_data8_al(void) { // E6: out DATA8, al +I286FN _out_data8_al(void) { // E6: out DATA8, al UINT port; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCBYTE(port); iocore_out8(port, I286_AL); } -I286_P _out_data8_ax(void) { // E7: out DATA8, ax +I286FN _out_data8_ax(void) { // E7: out DATA8, ax UINT port; - I286_CLOCK(3) + I286_WORKCLOCK(3); GET_PCBYTE(port); iocore_out16(port, I286_AX); } -I286_P _call_near(void) { // E8: call near +I286FN _call_near(void) { // E8: call near UINT16 ad; - I286_CLOCK(7) + I286_WORKCLOCK(7); GET_PCWORD(ad) REGPUSH0(I286_IP) I286_IP += ad; } -I286_P _jmp_near(void) { // E9: jmp near +I286FN _jmp_near(void) { // E9: jmp near UINT16 ad; - I286_CLOCK(7) + I286_WORKCLOCK(7); GET_PCWORD(ad) I286_IP += ad; } -I286_P _jmp_far(void) { // EA: jmp far +I286FN _jmp_far(void) { // EA: jmp far UINT16 ad; - I286_CLOCK(11) + I286_WORKCLOCK(11); GET_PCWORD(ad); GET_PCWORD(I286_CS); CS_BASE = I286_CS << 4; I286_IP = ad; } -I286_P _jmp_short(void) { // EB: jmp short +I286FN _jmp_short(void) { // EB: jmp short UINT16 ad; - I286_CLOCK(7) + I286_WORKCLOCK(7); GET_PCBYTES(ad) I286_IP += ad; } -I286_P _in_al_dx(void) { // EC: in al, dx +I286FN _in_al_dx(void) { // EC: in al, dx - I286_CLOCK(5) + I286_WORKCLOCK(5); I286_AL = iocore_inp8(I286_DX); } -I286_P _in_ax_dx(void) { // ED: in ax, dx +I286FN _in_ax_dx(void) { // ED: in ax, dx - I286_CLOCK(5) + I286_WORKCLOCK(5); I286_AX = iocore_inp16(I286_DX); } -I286_P _out_dx_al(void) { // EE: out dx, al +I286FN _out_dx_al(void) { // EE: out dx, al - I286_CLOCK(3) + I286_WORKCLOCK(3); iocore_out8(I286_DX, I286_AL); } -I286_P _out_dx_ax(void) { // EF: out dx, ax +I286FN _out_dx_ax(void) { // EF: out dx, ax - I286_CLOCK(3) + I286_WORKCLOCK(3); iocore_out16(I286_DX, I286_AX); } -I286_P _lock(void) { // F0: lock +I286FN _lock(void) { // F0: lock // F1: lock - I286_CLOCK(2) + I286_WORKCLOCK(2); } -I286_P _repne(void) { // F2: repne +I286FN _repne(void) { // F2: repne - i286reg.prefix++; - if (i286reg.prefix < MAX_PREFIX) { + i286core.s.prefix++; + if (i286core.s.prefix < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op_repne[op](); - i286reg.prefix = 0; + i286core.s.prefix = 0; } else { INT_NUM(6, I286_IP); } } -I286_P _repe(void) { // F3: repe +I286FN _repe(void) { // F3: repe - i286reg.prefix++; - if (i286reg.prefix < MAX_PREFIX) { + i286core.s.prefix++; + if (i286core.s.prefix < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op_repe[op](); - i286reg.prefix = 0; + i286core.s.prefix = 0; } else { INT_NUM(6, I286_IP); } } -I286_P _hlt(void) { // F4: hlt +I286FN _hlt(void) { // F4: hlt - nevent.remainclock = -1; + I286_REMCLOCK = -1; I286_IP--; } -I286_P _cmc(void) { // F5: cmc +I286FN _cmc(void) { // F5: cmc - I286_CLOCK(2) + I286_WORKCLOCK(2); I286_FLAGL ^= C_FLAG; } -I286_P _ope0xf6(void) { // F6: +I286FN _ope0xf6(void) { // F6: UINT op; @@ -2482,7 +2626,7 @@ I286_P _ope0xf6(void) { // F6: c_ope0xf6_table[(op >> 3) & 7](op); } -I286_P _ope0xf7(void) { // F7: +I286FN _ope0xf7(void) { // F7: UINT op; @@ -2490,47 +2634,57 @@ I286_P _ope0xf7(void) { // F7: c_ope0xf7_table[(op >> 3) & 7](op); } -I286_P _clc(void) { // F8: clc +I286FN _clc(void) { // F8: clc - I286_CLOCK(2) + I286_WORKCLOCK(2); I286_FLAGL &= ~C_FLAG; } -I286_P _stc(void) { // F9: stc +I286FN _stc(void) { // F9: stc - I286_CLOCK(2) + I286_WORKCLOCK(2); I286_FLAGL |= C_FLAG; } -I286_P _cli(void) { // FA: cli +I286FN _cli(void) { // FA: cli - I286_CLOCK(2) + I286_WORKCLOCK(2); I286_FLAG &= ~I_FLAG; I286_TRAP = 0; } -I286_P _sti(void) { // FB: sti +I286FN _sti(void) { // FB: sti - I286_CLOCK(2) + I286_WORKCLOCK(2); +#if defined(INTR_FAST) + if (I286_FLAG & I_FLAG) { + return; // 更新の意味なし + } +#endif I286_FLAG |= I_FLAG; - I286_TRAP = (I286_FLAG & T_FLAG) >> 8; // ToDo - + I286_TRAP = (I286_FLAG & T_FLAG) >> 8; +#if defined(INTR_FAST) + if (EXISTINTR) { + REMAIN_ADJUST(1) + } +#else REMAIN_ADJUST(1) +#endif } -I286_P _cld(void) { // FC: cld +I286FN _cld(void) { // FC: cld - I286_CLOCK(2) + I286_WORKCLOCK(2); I286_FLAG &= ~D_FLAG; } -I286_P _std(void) { // FD: std +I286FN _std(void) { // FD: std - I286_CLOCK(2) + I286_WORKCLOCK(2); I286_FLAG |= D_FLAG; } -I286_P _ope0xfe(void) { // FE: +I286FN _ope0xfe(void) { // FE: UINT op; @@ -2538,7 +2692,7 @@ I286_P _ope0xfe(void) { // FE: c_ope0xfe_table[(op >> 3) & 1](op); } -I286_P _ope0xff(void) { // FF: +I286FN _ope0xff(void) { // FF: UINT op; @@ -2762,7 +2916,7 @@ const I286OP i286op[] = { _mov_ea8_data8, // C6: mov EA8, DATA8 _mov_ea16_data16, // C7: mov EA16, DATA16 _enter, // C8: enter DATA16, DATA8 - leave, // C9: leave + fleave, // C9: leave _ret_far_data16, // CA: ret far DATA16 _ret_far, // CB: ret far _int_03, // CC: int 3 @@ -2826,68 +2980,68 @@ const I286OP i286op[] = { // ----------------------------------------------------------------- repe -I286_P _repe_segprefix_es(void) { +I286FN _repe_segprefix_es(void) { DS_FIX = ES_BASE; SS_FIX = ES_BASE; - i286reg.prefix++; - if (i286reg.prefix < MAX_PREFIX) { + i286core.s.prefix++; + if (i286core.s.prefix < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op_repe[op](); REMOVE_PREFIX - i286reg.prefix = 0; + i286core.s.prefix = 0; } else { INT_NUM(6, I286_IP); } } -I286_P _repe_segprefix_cs(void) { +I286FN _repe_segprefix_cs(void) { DS_FIX = CS_BASE; SS_FIX = CS_BASE; - i286reg.prefix++; - if (i286reg.prefix < MAX_PREFIX) { + i286core.s.prefix++; + if (i286core.s.prefix < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op_repe[op](); REMOVE_PREFIX - i286reg.prefix = 0; + i286core.s.prefix = 0; } else { INT_NUM(6, I286_IP); } } -I286_P _repe_segprefix_ss(void) { +I286FN _repe_segprefix_ss(void) { DS_FIX = SS_BASE; SS_FIX = SS_BASE; - i286reg.prefix++; - if (i286reg.prefix < MAX_PREFIX) { + i286core.s.prefix++; + if (i286core.s.prefix < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op_repe[op](); REMOVE_PREFIX - i286reg.prefix = 0; + i286core.s.prefix = 0; } else { INT_NUM(6, I286_IP); } } -I286_P _repe_segprefix_ds(void) { +I286FN _repe_segprefix_ds(void) { DS_FIX = DS_BASE; SS_FIX = DS_BASE; - i286reg.prefix++; - if (i286reg.prefix < MAX_PREFIX) { + i286core.s.prefix++; + if (i286core.s.prefix < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op_repe[op](); REMOVE_PREFIX - i286reg.prefix = 0; + i286core.s.prefix = 0; } else { INT_NUM(6, I286_IP); @@ -3075,7 +3229,7 @@ const I286OP i286op_repe[] = { i286c_repe_cmpsw, // A7: repe cmpsw _test_al_data8, // A8: test al, DATA8 _test_ax_data16, // A9: test ax, DATA16 - i286c_rep_stosb, // AA: rep stosw + i286c_rep_stosb, // AA: rep stosb i286c_rep_stosw, // AB: rep stosw i286c_rep_lodsb, // AC: rep lodsb i286c_rep_lodsw, // AD: rep lodsw @@ -3108,7 +3262,7 @@ const I286OP i286op_repe[] = { _mov_ea8_data8, // C6: mov EA8, DATA8 _mov_ea16_data16, // C7: mov EA16, DATA16 _enter, // C8: enter DATA16, DATA8 - leave, // C9: leave + fleave, // C9: leave _ret_far_data16, // CA: ret far DATA16 _ret_far, // CB: ret far _int_03, // CC: int 3 @@ -3171,68 +3325,68 @@ const I286OP i286op_repe[] = { // ----------------------------------------------------------------- repne -I286_P _repne_segprefix_es(void) { +I286FN _repne_segprefix_es(void) { DS_FIX = ES_BASE; SS_FIX = ES_BASE; - i286reg.prefix++; - if (i286reg.prefix < MAX_PREFIX) { + i286core.s.prefix++; + if (i286core.s.prefix < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op_repne[op](); REMOVE_PREFIX - i286reg.prefix = 0; + i286core.s.prefix = 0; } else { INT_NUM(6, I286_IP); } } -I286_P _repne_segprefix_cs(void) { +I286FN _repne_segprefix_cs(void) { DS_FIX = CS_BASE; SS_FIX = CS_BASE; - i286reg.prefix++; - if (i286reg.prefix < MAX_PREFIX) { + i286core.s.prefix++; + if (i286core.s.prefix < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op_repne[op](); REMOVE_PREFIX - i286reg.prefix = 0; + i286core.s.prefix = 0; } else { INT_NUM(6, I286_IP); } } -I286_P _repne_segprefix_ss(void) { +I286FN _repne_segprefix_ss(void) { DS_FIX = SS_BASE; SS_FIX = SS_BASE; - i286reg.prefix++; - if (i286reg.prefix < MAX_PREFIX) { + i286core.s.prefix++; + if (i286core.s.prefix < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op_repne[op](); REMOVE_PREFIX - i286reg.prefix = 0; + i286core.s.prefix = 0; } else { INT_NUM(6, I286_IP); } } -I286_P _repne_segprefix_ds(void) { +I286FN _repne_segprefix_ds(void) { DS_FIX = DS_BASE; SS_FIX = DS_BASE; - i286reg.prefix++; - if (i286reg.prefix < MAX_PREFIX) { + i286core.s.prefix++; + if (i286core.s.prefix < MAX_PREFIX) { UINT op; GET_PCBYTE(op); i286op_repne[op](); REMOVE_PREFIX - i286reg.prefix = 0; + i286core.s.prefix = 0; } else { INT_NUM(6, I286_IP); @@ -3420,7 +3574,7 @@ const I286OP i286op_repne[] = { i286c_repne_cmpsw, // A7: repne cmpsw _test_al_data8, // A8: test al, DATA8 _test_ax_data16, // A9: test ax, DATA16 - i286c_rep_stosb, // AA: rep stosw + i286c_rep_stosb, // AA: rep stosb i286c_rep_stosw, // AB: rep stosw i286c_rep_lodsb, // AC: rep lodsb i286c_rep_lodsw, // AD: rep lodsw @@ -3453,7 +3607,7 @@ const I286OP i286op_repne[] = { _mov_ea8_data8, // C6: mov EA8, DATA8 _mov_ea16_data16, // C7: mov EA16, DATA16 _enter, // C8: enter DATA16, DATA8 - leave, // C9: leave + fleave, // C9: leave _ret_far_data16, // CA: ret far DATA16 _ret_far, // CB: ret far _int_03, // CC: int 3