--- np2/i286c/i286c_mn.c 2003/12/12 01:04:40 1.24 +++ np2/i286c/i286c_mn.c 2004/01/22 01:10:04 1.28 @@ -27,7 +27,6 @@ I286FN _reserved(void) { - I286_WORKCLOCK(23); // ToDo INT_NUM(6, I286_IP - 1); } @@ -148,8 +147,17 @@ I286FN _push_es(void) { // 06: pus I286FN _pop_es(void) { // 07: pop es - REGPOP(I286_ES, 5) - ES_BASE = (UINT32)I286_ES << 4; + UINT tmp; + + REGPOP(tmp, 5) + I286_ES = tmp; + if (!(I286_MSW & MSW_PE)) { + ES_BASE = tmp << 4; + NEXT_OPCODE + } + else { + ES_BASE = i286c_selector(tmp); + } } I286FN _or_ea_r8(void) { // 08: or EA, REG8 @@ -382,10 +390,22 @@ I286FN _push_ss(void) { // 16: pus I286FN _pop_ss(void) { // 17: pop ss - REGPOP(I286_SS, 5) - SS_BASE = I286_SS << 4; - SS_FIX = SS_BASE; - NEXT_OPCODE + UINT tmp; + UINT32 base; + + REGPOP(tmp, 5) + I286_SS = tmp; + if (!(I286_MSW & MSW_PE)) { + SS_BASE = tmp << 4; + SS_FIX = tmp << 4; + NEXT_OPCODE + } + else { + base = i286c_selector(tmp); + SS_BASE = base; + SS_FIX = base; + NEXT_OPCODE + } } I286FN _sbb_ea_r8(void) { // 18: sbb EA, REG8 @@ -505,9 +525,22 @@ I286FN _push_ds(void) { // 1e: pus I286FN _pop_ds(void) { // 1f: pop ds - REGPOP(I286_DS, 5) - DS_BASE = I286_DS << 4; - DS_FIX = DS_BASE; + UINT tmp; + UINT32 base; + + REGPOP(tmp, 5) + I286_DS = tmp; + if (!(I286_MSW & MSW_PE)) { + DS_BASE = tmp << 4; + DS_FIX = tmp << 4; + NEXT_OPCODE + } + else { + base = i286c_selector(tmp); + DS_BASE = base; + DS_FIX = base; + NEXT_OPCODE + } } I286FN _and_ea_r8(void) { // 20: and EA, REG8 @@ -1659,6 +1692,7 @@ I286FN _mov_seg_ea(void) { // 8E: mo UINT op; UINT tmp; + UINT32 base; UINT16 ipbak; ipbak = I286_IP; @@ -1671,23 +1705,30 @@ I286FN _mov_seg_ea(void) { // 8E: mo I286_WORKCLOCK(5); tmp = i286_memoryread_w(CALC_EA(op)); } + if (!(I286_MSW & MSW_PE)) { + base = tmp << 4; + } + else { + base = i286c_selector(tmp); + } + switch(op & 0x18) { case 0x00: // es I286_ES = (UINT16)tmp; - ES_BASE = tmp << 4; + ES_BASE = base; break; case 0x10: // ss I286_SS = (UINT16)tmp; - SS_BASE = tmp << 4; - SS_FIX = SS_BASE; + SS_BASE = base; + SS_FIX = base; NEXT_OPCODE break; case 0x18: // ds I286_DS = (UINT16)tmp; - DS_BASE = tmp << 4; - DS_FIX = DS_BASE; + DS_BASE = base; + DS_FIX = base; break; default: // cs @@ -2245,16 +2286,20 @@ I286FN _ret_far(void) { // CB: ret I286FN _int_03(void) { // CC: int 3 - I286_WORKCLOCK(23); + I286_WORKCLOCK(3); INT_NUM(3, I286_IP); } +extern int tr; I286FN _int_data8(void) { // CD: int DATA8 UINT vect; - I286_WORKCLOCK(23); + I286_WORKCLOCK(3); GET_PCBYTE(vect) + if ((vect == 0x21) && (CPU_AX == 0x5f02)) { + tr = 1; + } INT_NUM(vect, I286_IP); } @@ -2262,7 +2307,6 @@ I286FN _into(void) { // CE: into I286_WORKCLOCK(4); if (I286_OV) { - I286_WORKCLOCK(24 - 4); INT_NUM(4, I286_IP); } }