|
|
| version 1.37, 2005/02/07 14:46:10 | version 1.41, 2005/05/12 05:10:02 |
|---|---|
| Line 5 | Line 5 |
| #include "iocore.h" | #include "iocore.h" |
| #include "bios.h" | #include "bios.h" |
| #include "i286c.mcr" | #include "i286c.mcr" |
| #if defined(ENABLE_TRAP) | |
| #include "inttrap.h" | |
| #endif | |
| #define MAX_PREFIX 8 | #define MAX_PREFIX 8 |
| Line 958 I286FN _cmp_ea_r8(void) { // 38: cm | Line 961 I286FN _cmp_ea_r8(void) { // 38: cm |
| SUBBYTE(res, dst, src); | SUBBYTE(res, dst, src); |
| } | } |
| else { | else { |
| I286_WORKCLOCK(7); | I286_WORKCLOCK(6); |
| dst = i286_memoryread(CALC_EA(op)); | dst = i286_memoryread(CALC_EA(op)); |
| SUBBYTE(res, dst, src); | SUBBYTE(res, dst, src); |
| } | } |
| Line 978 I286FN _cmp_ea_r16(void) { // 39: c | Line 981 I286FN _cmp_ea_r16(void) { // 39: c |
| SUBWORD(res, dst, src); | SUBWORD(res, dst, src); |
| } | } |
| else { | else { |
| I286_WORKCLOCK(7); | I286_WORKCLOCK(6); |
| dst = i286_memoryread_w(CALC_EA(op)); | dst = i286_memoryread_w(CALC_EA(op)); |
| SUBWORD(res, dst, src); | SUBWORD(res, dst, src); |
| } | } |
| Line 1314 I286FN _outsw(void) { // 6F: outsw | Line 1317 I286FN _outsw(void) { // 6F: outsw |
| I286FN _jo_short(void) { // 70: jo short | I286FN _jo_short(void) { // 70: jo short |
| if (!I286_OV) JMPNOP(2) else JMPSHORT(7) | if (!I286_OV) JMPNOP(3) else JMPSHORT(7) |
| } | } |
| I286FN _jno_short(void) { // 71: jno short | I286FN _jno_short(void) { // 71: jno short |
| if (I286_OV) JMPNOP(2) else JMPSHORT(7) | if (I286_OV) JMPNOP(3) else JMPSHORT(7) |
| } | } |
| I286FN _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) | if (!(I286_FLAGL & C_FLAG)) JMPNOP(3) else JMPSHORT(7) |
| } | } |
| I286FN _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) | if (I286_FLAGL & C_FLAG) JMPNOP(3) else JMPSHORT(7) |
| } | } |
| I286FN _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) | if (!(I286_FLAGL & Z_FLAG)) JMPNOP(3) else JMPSHORT(7) |
| } | } |
| I286FN _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) | if (I286_FLAGL & Z_FLAG) JMPNOP(3) else JMPSHORT(7) |
| } | } |
| I286FN _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) | if (!(I286_FLAGL & (Z_FLAG | C_FLAG))) JMPNOP(3) else JMPSHORT(7) |
| } | } |
| I286FN _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) | if (I286_FLAGL & (Z_FLAG | C_FLAG)) JMPNOP(3) else JMPSHORT(7) |
| } | } |
| I286FN _js_short(void) { // 78: js short | I286FN _js_short(void) { // 78: js short |
| if (!(I286_FLAGL & S_FLAG)) JMPNOP(2) else JMPSHORT(7) | if (!(I286_FLAGL & S_FLAG)) JMPNOP(3) else JMPSHORT(7) |
| } | } |
| I286FN _jns_short(void) { // 79: jns short | I286FN _jns_short(void) { // 79: jns short |
| if (I286_FLAGL & S_FLAG) JMPNOP(2) else JMPSHORT(7) | if (I286_FLAGL & S_FLAG) JMPNOP(3) else JMPSHORT(7) |
| } | } |
| I286FN _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) | if (!(I286_FLAGL & P_FLAG)) JMPNOP(3) else JMPSHORT(7) |
| } | } |
| I286FN _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) | if (I286_FLAGL & P_FLAG) JMPNOP(3) else JMPSHORT(7) |
| } | } |
| I286FN _jl_short(void) { // 7C: jl/jnge short | I286FN _jl_short(void) { // 7C: jl/jnge short |
| if (((I286_FLAGL & S_FLAG) == 0) == (I286_OV == 0)) | if (((I286_FLAGL & S_FLAG) == 0) == (I286_OV == 0)) |
| JMPNOP(2) else JMPSHORT(7) | JMPNOP(3) else JMPSHORT(7) |
| } | } |
| I286FN _jnl_short(void) { // 7D: jnl/jge short | I286FN _jnl_short(void) { // 7D: jnl/jge short |
| if (((I286_FLAGL & S_FLAG) == 0) != (I286_OV == 0)) | if (((I286_FLAGL & S_FLAG) == 0) != (I286_OV == 0)) |
| JMPNOP(2) else JMPSHORT(7) | JMPNOP(3) else JMPSHORT(7) |
| } | } |
| I286FN _jle_short(void) { // 7E: jle/jng short | I286FN _jle_short(void) { // 7E: jle/jng short |
| if ((!(I286_FLAGL & Z_FLAG)) && | if ((!(I286_FLAGL & Z_FLAG)) && |
| (((I286_FLAGL & S_FLAG) == 0) == (I286_OV == 0))) | (((I286_FLAGL & S_FLAG) == 0) == (I286_OV == 0))) |
| JMPNOP(2) else JMPSHORT(7) | JMPNOP(3) else JMPSHORT(7) |
| } | } |
| I286FN _jnle_short(void) { // 7F: jg/jnle short | I286FN _jnle_short(void) { // 7F: jg/jnle short |
| if ((I286_FLAGL & Z_FLAG) || | if ((I286_FLAGL & Z_FLAG) || |
| (((I286_FLAGL & S_FLAG) == 0) != (I286_OV == 0))) | (((I286_FLAGL & S_FLAG) == 0) != (I286_OV == 0))) |
| JMPNOP(2) else JMPSHORT(7) | JMPNOP(3) else JMPSHORT(7) |
| } | } |
| I286FN _calc_ea8_i8(void) { // 80: op EA8, DATA8 | I286FN _calc_ea8_i8(void) { // 80: op EA8, DATA8 |
| Line 1513 I286FN _test_ea_r16(void) { // 85: t | Line 1516 I286FN _test_ea_r16(void) { // 85: t |
| out = REG16_B20(op); | out = REG16_B20(op); |
| } | } |
| else { | else { |
| I286_WORKCLOCK(7); | I286_WORKCLOCK(6); |
| madr = CALC_EA(op); | madr = CALC_EA(op); |
| if (INHIBIT_WORDP(madr)) { | if (INHIBIT_WORDP(madr)) { |
| tmp = i286_memoryread_w(madr); | tmp = i286_memoryread_w(madr); |
| Line 2203 I286FN _enter(void) { // C8: enter | Line 2206 I286FN _enter(void) { // C8: enter |
| } | } |
| else { // enter level=2-31 | else { // enter level=2-31 |
| UINT16 bp; | UINT16 bp; |
| I286_WORKCLOCK(12 + level*4); | I286_WORKCLOCK(12 + 4 + level*4); |
| bp = I286_BP; | bp = I286_BP; |
| I286_BP = I286_SP; | I286_BP = I286_SP; |
| while(level--) { | while(level--) { |
| Line 2265 I286FN _int_data8(void) { // CD: int | Line 2268 I286FN _int_data8(void) { // CD: int |
| I286_WORKCLOCK(3); | I286_WORKCLOCK(3); |
| GET_PCBYTE(vect) | GET_PCBYTE(vect) |
| #if 0 | #if defined(ENABLE_TRAP) |
| if ((vect == 0x42) && (CPU_AL != 6)) { | softinttrap(CPU_CS, CPU_IP - 2, vect); |
| 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 | #endif |
| INT_NUM(vect, I286_IP); | INT_NUM(vect, I286_IP); |
| } | } |
| Line 3401 const I286OP i286op_repe[] = { | Line 3181 const I286OP i286op_repe[] = { |
| i286c_rep_insb, // 6C: rep insb | i286c_rep_insb, // 6C: rep insb |
| i286c_rep_insw, // 6D: rep insw | i286c_rep_insw, // 6D: rep insw |
| i286c_rep_outsb, // 6E: rep outsb | i286c_rep_outsb, // 6E: rep outsb |
| i286c_rep_outsb, // 6F: rep outsw | i286c_rep_outsw, // 6F: rep outsw |
| _jo_short, // 70: jo short | _jo_short, // 70: jo short |
| _jno_short, // 71: jno short | _jno_short, // 71: jno short |
| Line 3746 const I286OP i286op_repne[] = { | Line 3526 const I286OP i286op_repne[] = { |
| i286c_rep_insb, // 6C: rep insb | i286c_rep_insb, // 6C: rep insb |
| i286c_rep_insw, // 6D: rep insw | i286c_rep_insw, // 6D: rep insw |
| i286c_rep_outsb, // 6E: rep outsb | i286c_rep_outsb, // 6E: rep outsb |
| i286c_rep_outsb, // 6F: rep outsw | i286c_rep_outsw, // 6F: rep outsw |
| _jo_short, // 70: jo short | _jo_short, // 70: jo short |
| _jno_short, // 71: jno short | _jno_short, // 71: jno short |