--- np2/i286c/i286c_mn.c 2003/12/01 17:13:36 1.19 +++ np2/i286c/i286c_mn.c 2005/02/04 05:32:23 1.36 @@ -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); } @@ -149,8 +147,11 @@ 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; + ES_BASE = SEGSELECT(tmp); } I286FN _or_ea_r8(void) { // 08: or EA, REG8 @@ -383,8 +384,11 @@ I286FN _push_ss(void) { // 16: pus I286FN _pop_ss(void) { // 17: pop ss - REGPOP(I286_SS, 5) - SS_BASE = I286_SS << 4; + UINT tmp; + + REGPOP(tmp, 5) + I286_SS = tmp; + SS_BASE = SEGSELECT(tmp); SS_FIX = SS_BASE; NEXT_OPCODE } @@ -506,8 +510,11 @@ I286FN _push_ds(void) { // 1e: pus I286FN _pop_ds(void) { // 1f: pop ds - REGPOP(I286_DS, 5) - DS_BASE = I286_DS << 4; + UINT tmp; + + REGPOP(tmp, 5) + I286_DS = tmp; + DS_BASE = SEGSELECT(tmp); DS_FIX = DS_BASE; } @@ -623,13 +630,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 +776,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 +917,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); @@ -934,6 +941,7 @@ I286FN _aaa(void) { // 37: aaa else { I286_FLAGL &= ~(A_FLAG | C_FLAG); } + I286_AL &= 0x0f; } I286FN _cmp_ea_r8(void) { // 38: cmp EA, REG8 @@ -1026,13 +1034,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); @@ -1659,6 +1667,7 @@ I286FN _mov_seg_ea(void) { // 8E: mo UINT op; UINT tmp; + UINT32 base; UINT16 ipbak; ipbak = I286_IP; @@ -1671,23 +1680,24 @@ I286FN _mov_seg_ea(void) { // 8E: mo I286_WORKCLOCK(5); tmp = i286_memoryread_w(CALC_EA(op)); } + base = SEGSELECT(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 @@ -1794,7 +1804,7 @@ I286FN _call_far(void) { // 9A: call REGPUSH0(I286_CS) GET_PCWORD(newip) GET_PCWORD(I286_CS) - CS_BASE = I286_CS << 4; + CS_BASE = SEGSELECT(I286_CS); REGPUSH0(I286_IP) I286_IP = newip; } @@ -1813,13 +1823,13 @@ I286FN _popf(void) { // 9D: popf UINT flag; - I286_WORKCLOCK(5); REGPOP0(flag) I286_OV = flag & O_FLAG; I286_FLAG = flag & (0xfff ^ O_FLAG); 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 @@ -2102,7 +2112,7 @@ I286FN _les_r16_ea(void) { // C4: le 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; + ES_BASE = SEGSELECT(I286_ES); } else { INT_NUM(6, I286_IP - 2); @@ -2121,7 +2131,7 @@ I286FN _lds_r16_ea(void) { // C5: ld 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_BASE = SEGSELECT(I286_DS); DS_FIX = DS_BASE; } else { @@ -2232,7 +2242,7 @@ I286FN _ret_far_data16(void) { // CA: REGPOP0(I286_IP) REGPOP0(I286_CS) I286_SP += ad; - CS_BASE = I286_CS << 4; + CS_BASE = SEGSELECT(I286_CS); } I286FN _ret_far(void) { // CB: ret far @@ -2240,12 +2250,12 @@ I286FN _ret_far(void) { // CB: ret I286_WORKCLOCK(15); REGPOP0(I286_IP) REGPOP0(I286_CS) - CS_BASE = I286_CS << 4; + CS_BASE = SEGSELECT(I286_CS); } I286FN _int_03(void) { // CC: int 3 - I286_WORKCLOCK(23); + I286_WORKCLOCK(3); INT_NUM(3, I286_IP); } @@ -2253,8 +2263,234 @@ I286FN _int_data8(void) { // CD: int UINT vect; - I286_WORKCLOCK(23); + I286_WORKCLOCK(3); GET_PCBYTE(vect) +#if 0 + if ((vect == 0x42) && (CPU_AL != 6)) { + TRACEOUT(("%.4x:%.4x INT-42 AL=%.2x", CPU_CS, CPU_IP, CPU_AL)); + } +#endif +#if 0 + if (vect == 0x2f) { + TRACEOUT(("%.4x:%.4x INT-2f BX=%.4x/DX=%.4x", CPU_CS, CPU_IP, CPU_BX, CPU_DX)); + } +#endif +#if 1 + if (vect == 0xd2) { + TRACEOUT(("%.4x:%.4x INT-d2 AX=%.4x", CPU_CS, CPU_IP, CPU_AX)); + } +#endif +#if 0 + if (vect == 0x60) { + TRACEOUT(("%.4x:%.4x INT-60 AX=%.4x", CPU_CS, CPU_IP, CPU_AX)); + } +#endif +#if 0 + if (vect == 0xa0) { + TRACEOUT(("%.4x:%.4x INT-a0 AX=%.4x", CPU_CS, CPU_IP, CPU_AX)); + } + if (vect == 0xa2) { + TRACEOUT(("%.4x:%.4x INT-a2", CPU_CS, CPU_IP)); + } + if (vect == 0xa4) { + TRACEOUT(("%.4x:%.4x INT-a4", CPU_CS, CPU_IP)); + } +#endif +#if 0 + if (vect == 0x60) { + TRACEOUT(("%.4x:%.4x INT-60 AH=%.2x", CPU_CS, CPU_IP, CPU_AH)); + if (CPU_AH == 1) { + TRACEOUT(("->%.4x:%.4x", CPU_ES, CPU_BX)); + } + } +#endif +#if 0 + if (vect == 0x40) { + TRACEOUT(("%.4x:%.4x INT-40 AH=%.2x", CPU_CS, CPU_IP, CPU_AH)); + } + if (vect == 0x66) { + switch(CPU_AL) { + case 1: + TRACEOUT(("%.4x:%.4x INT-66:01 play", CPU_CS, CPU_IP)); + break; + case 2: + TRACEOUT(("%.4x:%.4x INT-66:02 stop", CPU_CS, CPU_IP)); + break; + case 9: + TRACEOUT(("%.4x:%.4x INT-66:09 setdata AH=%.2x ES:BX=%.4x:%.4x DX=%.4x", CPU_CS, CPU_IP, CPU_AH, CPU_ES, CPU_BX, CPU_DX)); + break; + case 0x0d: + TRACEOUT(("%.4x:%.4x INT-66:0d setdata ES:BX=%.4x:%.4x", CPU_CS, CPU_IP, CPU_ES, CPU_BX)); + break; + + default: + TRACEOUT(("%.4x:%.4x INT-66 AX=%.4x", CPU_CS, CPU_IP, CPU_AX)); + break; + } + } +#endif +#if 0 + if (vect == 0x40) { + TRACEOUT(("%.4x:%.4x INT-40 AX=%.4x DS=%.4x DI=%.4x", CPU_CS, CPU_IP, CPU_AX, CPU_DS, CPU_DI)); + } + if (vect == 0x41) { + TRACEOUT(("%.4x:%.4x INT-41 AX=%.4x DX=%.4x", CPU_CS, CPU_IP, CPU_AX, CPU_DX)); + } +#endif +#if 0 + if (vect == 0x41) { + TRACEOUT(("%.4x:%.4x INT-41 AX=%.4x %.4x:%.4x", + CPU_CS, CPU_IP, CPU_AX, CPU_DS, CPU_SI)); + } + if (vect == 0x42) { + switch(CPU_AH) { + case 0xd3: + case 0xd0: + break; + + case 0xfd: + case 0xfc: + case 0xfa: + case 0xf8: + case 0xe3: + TRACEOUT(("%.4x:%.4x INT-42 AX=%.4x %.4x:%.4x", + CPU_CS, CPU_IP, CPU_AX, CPU_BX, CPU_BP)); + break; + + default: + TRACEOUT(("%.4x:%.4x INT-42 AX=%.4x", CPU_CS, CPU_IP, CPU_AX)); + break; + } + } +#endif +#if 0 + if (vect == 0x40) { + TRACEOUT(("%.4x:%.4x INT-40 SI=%.4x %.4x:%.4x:%.4x", + CPU_CS, CPU_IP, CPU_SI, + MEML_READ16(CPU_DS, CPU_SI + 0), + MEML_READ16(CPU_DS, CPU_SI + 2), + MEML_READ16(CPU_DS, CPU_SI + 4))); + } + if (vect == 0xd2) { + TRACEOUT(("%.4x:%.4x INT-D2 AX=%.4x", CPU_CS, CPU_IP, CPU_AX)); + } +#endif +#if 0 + if (vect == 0x40) { + TRACEOUT(("INT 40H - AL=%.2x", CPU_AL)); + } +#endif +#if defined(TRACE) + if (vect == 0x21) { + char f[128]; + UINT i; + char c; + switch(CPU_AH) { + case 0x3d: + for (i=0; i<127; i++) { + c = MEML_READ8(CPU_DS, CPU_DX + i); + if (c == '\0') break; + f[i] = c; + } + f[i] = 0; + TRACEOUT(("DOS: %.4x:%.4x Open Handle AL=%.2x DS:DX=%.4x:%.4x[%s]", CPU_CS, CPU_IP, CPU_AL, CPU_DS, CPU_DX, f)); + break; + + case 0x3f: + TRACEOUT(("DOS: %.4x:%.4x Read Handle BX=%.4x DS:DX=%.4x:%.4x CX=%.4x", CPU_CS, CPU_IP, CPU_BX, CPU_DS, CPU_DX, CPU_CX)); + break; + + case 0x42: + TRACEOUT(("DOS: %.4x:%.4x Move File Pointer BX=%.4x CX:DX=%.4x:%.4x AL=%.2x", CPU_CS, CPU_IP, CPU_BX, CPU_CX, CPU_DX, CPU_AL)); + break; + } + } +#endif +#if 0 + if (vect == 0xf5) { + TRACEOUT(("%.4x:%.4x INT-F5 AH=%.2x STACK=%.4x", CPU_CS, CPU_IP, + CPU_AH, MEML_READ16(CPU_SS, CPU_SP + 2))); + } +#endif +#if 0 + if (vect == 0x69) { + TRACEOUT(("%.4x:%.4x INT-69 AX=%.4x", CPU_CS, CPU_IP, CPU_AX)); + } +#endif +#if 0 + if ((vect == 0x40) && (CPU_AX != 4)) { + TRACEOUT(("%.4x:%.4x INT-40 AX=%.4x", CPU_CS, CPU_IP, CPU_AX)); + } +#endif +#if 0 + if (vect == 0x7f) { + switch(CPU_AH) { + case 0: + TRACEOUT(("INT-7F AH=00 Load data DS:DX = %.4x:%.4x", CPU_DS, CPU_DX)); + break; + + case 1: + TRACEOUT(("INT-7F AH=01 Play data AL=%.2x", CPU_AL)); + break; + + case 2: + TRACEOUT(("INT-7F AH=02 Stop Data")); + break; + + case 3: + TRACEOUT(("INT-7F AH=03 Get Status")); + break; + + case 4: + TRACEOUT(("INT-7F AH=04 Set Parameter AL=%.2x", CPU_AL)); + break; + } + } +#endif +#if defined(TRACE) + if (vect == 0x7f) { + UINT i, j; + switch(CPU_AH) { + case 0: + TRACEOUT(("INT-7F AH=00 Load data DS:DX = %.4x:%.4x", CPU_DS, CPU_DX)); + for (i=0; i<16; i+=4) { + char buf[256]; + for (j=0; j<4; j++) { + sprintf(buf + (j * 6), "0x%.2x, ", + MEML_READ8(CPU_DS, CPU_DX + i + j)); + } + TRACEOUT(("%s", buf)); + } + break; + + case 1: + TRACEOUT(("INT-7F AH=01 Play data AL=%.2x", CPU_AL)); + break; + + case 2: + TRACEOUT(("INT-7F AH=02 Stop Data")); + break; + + case 3: +// TRACEOUT(("INT-7F AH=03 Get Status")); + break; + + case 4: + TRACEOUT(("INT-7F AH=04 Set Parameter AL=%.2x", CPU_AL)); + break; + + default: + TRACEOUT(("INT-7F AH=%.2x", CPU_AH)); + break; + } + } +#endif +#if 0 // defined(TRACE) + if ((vect >= 0xa0) && (vect < 0xb0)) { +extern void lio_look(UINT vect); + lio_look(vect); + } +#endif INT_NUM(vect, I286_IP); } @@ -2262,7 +2498,6 @@ I286FN _into(void) { // CE: into I286_WORKCLOCK(4); if (I286_OV) { - I286_WORKCLOCK(24 - 4); INT_NUM(4, I286_IP); } } @@ -2271,8 +2506,6 @@ I286FN _iret(void) { // CF: iret UINT flag; - extirq_pop(); - I286_WORKCLOCK(31); REGPOP0(I286_IP) REGPOP0(I286_CS) REGPOP0(flag) @@ -2280,8 +2513,10 @@ I286FN _iret(void) { // CF: iret I286_FLAG = flag & (0xfff ^ O_FLAG); I286_TRAP = ((flag & 0x300) == 0x300); CS_BASE = I286_CS << 4; +// CS_BASE = SEGSELECT(I286_CS); + I286_WORKCLOCK(31); #if defined(INTR_FAST) - if ((flag & I_FLAG) && (PICEXISTINTR)) { + if ((I286_TRAP) || ((flag & I_FLAG) && (PICEXISTINTR))) { I286IRQCHECKTERM } #else @@ -2340,7 +2575,7 @@ I286FN _shift_ea8_cl(void) { // D2: sh BYTE *out; UINT op; UINT32 madr; - BYTE cl; + REG8 cl; GET_PCBYTE(op) if (op >= 0xc0) { @@ -2368,7 +2603,7 @@ I286FN _shift_ea16_cl(void) { // D3: s UINT16 *out; UINT op; UINT32 madr; - BYTE cl; + REG8 cl; GET_PCBYTE(op) if (op >= 0xc0) { @@ -2474,9 +2709,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 @@ -2532,8 +2767,8 @@ I286FN _jmp_far(void) { // EA: jmp I286_WORKCLOCK(11); GET_PCWORD(ad); GET_PCWORD(I286_CS); - CS_BASE = I286_CS << 4; I286_IP = ad; + CS_BASE = SEGSELECT(I286_CS); } I286FN _jmp_short(void) { // EB: jmp short @@ -2576,12 +2811,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); @@ -2590,12 +2825,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); @@ -2654,15 +2889,19 @@ I286FN _sti(void) { // FB: sti I286_WORKCLOCK(2); #if defined(INTR_FAST) if (I286_FLAG & I_FLAG) { + NEXT_OPCODE; return; // 更新の意味なし } #endif I286_FLAG |= I_FLAG; I286_TRAP = (I286_FLAG & T_FLAG) >> 8; #if defined(INTR_FAST) - if (PICEXISTINTR) { + if ((I286_TRAP) || (PICEXISTINTR)) { REMAIN_ADJUST(1) } + else { + NEXT_OPCODE; + } #else REMAIN_ADJUST(1) #endif @@ -2980,13 +3219,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); @@ -2997,13 +3236,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); @@ -3014,13 +3253,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); @@ -3031,13 +3270,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); @@ -3325,13 +3564,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); @@ -3342,13 +3581,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); @@ -3359,13 +3598,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); @@ -3376,13 +3615,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);