|
|
| version 1.18, 2003/12/01 10:45:46 | version 1.23, 2003/12/11 21:57:38 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | #include "compiler.h" |
| #include "i286.h" | #include "cpucore.h" |
| #include "i286c.h" | #include "i286c.h" |
| #include "memory.h" | #include "memory.h" |
| #include "pccore.h" | #include "pccore.h" |
| Line 10 | Line 10 |
| #define MAX_PREFIX 8 | #define MAX_PREFIX 8 |
| #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 \ | #define NEXT_OPCODE \ |
| if (I286_REMCLOCK < 1) { \ | if (I286_REMCLOCK < 1) { \ |
| Line 627 I286FN _segprefix_es(void) { // 26: | Line 623 I286FN _segprefix_es(void) { // 26: |
| SS_FIX = ES_BASE; | SS_FIX = ES_BASE; |
| DS_FIX = ES_BASE; | DS_FIX = ES_BASE; |
| i286core.s.prefix++; | I286_PREFIX++; |
| if (i286core.s.prefix < MAX_PREFIX) { | if (I286_PREFIX < MAX_PREFIX) { |
| UINT op; | UINT op; |
| GET_PCBYTE(op); | GET_PCBYTE(op); |
| i286op[op](); | i286op[op](); |
| REMOVE_PREFIX | REMOVE_PREFIX |
| i286core.s.prefix = 0; | I286_PREFIX = 0; |
| } | } |
| else { | else { |
| INT_NUM(6, I286_IP); | INT_NUM(6, I286_IP); |
| Line 773 I286FN _segprefix_cs(void) { // 2e: | Line 769 I286FN _segprefix_cs(void) { // 2e: |
| SS_FIX = CS_BASE; | SS_FIX = CS_BASE; |
| DS_FIX = CS_BASE; | DS_FIX = CS_BASE; |
| i286core.s.prefix++; | I286_PREFIX++; |
| if (i286core.s.prefix < MAX_PREFIX) { | if (I286_PREFIX < MAX_PREFIX) { |
| UINT op; | UINT op; |
| GET_PCBYTE(op); | GET_PCBYTE(op); |
| i286op[op](); | i286op[op](); |
| REMOVE_PREFIX | REMOVE_PREFIX |
| i286core.s.prefix = 0; | I286_PREFIX = 0; |
| } | } |
| else { | else { |
| INT_NUM(6, I286_IP); | INT_NUM(6, I286_IP); |
| Line 914 I286FN _segprefix_ss(void) { // 36: | Line 910 I286FN _segprefix_ss(void) { // 36: |
| SS_FIX = SS_BASE; | SS_FIX = SS_BASE; |
| DS_FIX = SS_BASE; | DS_FIX = SS_BASE; |
| i286core.s.prefix++; | I286_PREFIX++; |
| if (i286core.s.prefix < MAX_PREFIX) { | if (I286_PREFIX < MAX_PREFIX) { |
| UINT op; | UINT op; |
| GET_PCBYTE(op); | GET_PCBYTE(op); |
| i286op[op](); | i286op[op](); |
| REMOVE_PREFIX | REMOVE_PREFIX |
| i286core.s.prefix = 0; | I286_PREFIX = 0; |
| } | } |
| else { | else { |
| INT_NUM(6, I286_IP); | INT_NUM(6, I286_IP); |
| Line 938 I286FN _aaa(void) { // 37: aaa | Line 934 I286FN _aaa(void) { // 37: aaa |
| else { | else { |
| I286_FLAGL &= ~(A_FLAG | C_FLAG); | I286_FLAGL &= ~(A_FLAG | C_FLAG); |
| } | } |
| I286_AL &= 0x0f; | |
| } | } |
| I286FN _cmp_ea_r8(void) { // 38: cmp EA, REG8 | I286FN _cmp_ea_r8(void) { // 38: cmp EA, REG8 |
| Line 1030 I286FN _segprefix_ds(void) { // 3e: | Line 1027 I286FN _segprefix_ds(void) { // 3e: |
| SS_FIX = DS_BASE; | SS_FIX = DS_BASE; |
| DS_FIX = DS_BASE; | DS_FIX = DS_BASE; |
| i286core.s.prefix++; | I286_PREFIX++; |
| if (i286core.s.prefix < MAX_PREFIX) { | if (I286_PREFIX < MAX_PREFIX) { |
| UINT op; | UINT op; |
| GET_PCBYTE(op); | GET_PCBYTE(op); |
| i286op[op](); | i286op[op](); |
| REMOVE_PREFIX | REMOVE_PREFIX |
| i286core.s.prefix = 0; | I286_PREFIX = 0; |
| } | } |
| else { | else { |
| INT_NUM(6, I286_IP); | INT_NUM(6, I286_IP); |
| Line 1817 I286FN _popf(void) { // 9D: popf | Line 1814 I286FN _popf(void) { // 9D: popf |
| UINT flag; | UINT flag; |
| I286_WORKCLOCK(5); | |
| REGPOP0(flag) | REGPOP0(flag) |
| I286_OV = flag & O_FLAG; | I286_OV = flag & O_FLAG; |
| I286_FLAG = flag & (0xfff ^ O_FLAG); | I286_FLAG = flag & (0xfff ^ O_FLAG); |
| I286_TRAP = ((flag & 0x300) == 0x300); | I286_TRAP = ((flag & 0x300) == 0x300); |
| I286_WORKCLOCK(5); | |
| #if defined(INTR_FAST) | #if defined(INTR_FAST) |
| if (EXISTINTR) { | if ((I286_TRAP) || ((flag & I_FLAG) && (PICEXISTINTR))) { |
| I286IRQCHECKTERM | I286IRQCHECKTERM |
| } | } |
| #else | #else |
| Line 2276 I286FN _iret(void) { // CF: iret | Line 2273 I286FN _iret(void) { // CF: iret |
| UINT flag; | UINT flag; |
| extirq_pop(); | extirq_pop(); |
| I286_WORKCLOCK(31); | |
| REGPOP0(I286_IP) | REGPOP0(I286_IP) |
| REGPOP0(I286_CS) | REGPOP0(I286_CS) |
| REGPOP0(flag) | REGPOP0(flag) |
| Line 2284 I286FN _iret(void) { // CF: iret | Line 2280 I286FN _iret(void) { // CF: iret |
| I286_FLAG = flag & (0xfff ^ O_FLAG); | I286_FLAG = flag & (0xfff ^ O_FLAG); |
| I286_TRAP = ((flag & 0x300) == 0x300); | I286_TRAP = ((flag & 0x300) == 0x300); |
| CS_BASE = I286_CS << 4; | CS_BASE = I286_CS << 4; |
| I286_WORKCLOCK(31); | |
| #if defined(INTR_FAST) | #if defined(INTR_FAST) |
| if (EXISTINTR) { | if ((I286_TRAP) || ((flag & I_FLAG) && (PICEXISTINTR))) { |
| I286IRQCHECKTERM | I286IRQCHECKTERM |
| } | } |
| #else | #else |
| Line 2344 I286FN _shift_ea8_cl(void) { // D2: sh | Line 2341 I286FN _shift_ea8_cl(void) { // D2: sh |
| BYTE *out; | BYTE *out; |
| UINT op; | UINT op; |
| UINT32 madr; | UINT32 madr; |
| BYTE cl; | REG8 cl; |
| GET_PCBYTE(op) | GET_PCBYTE(op) |
| if (op >= 0xc0) { | if (op >= 0xc0) { |
| Line 2372 I286FN _shift_ea16_cl(void) { // D3: s | Line 2369 I286FN _shift_ea16_cl(void) { // D3: s |
| UINT16 *out; | UINT16 *out; |
| UINT op; | UINT op; |
| UINT32 madr; | UINT32 madr; |
| BYTE cl; | REG8 cl; |
| GET_PCBYTE(op) | GET_PCBYTE(op) |
| if (op >= 0xc0) { | if (op >= 0xc0) { |
| Line 2478 I286FN _in_al_data8(void) { // E4: i | Line 2475 I286FN _in_al_data8(void) { // E4: i |
| I286_WORKCLOCK(5); | I286_WORKCLOCK(5); |
| GET_PCBYTE(port) | GET_PCBYTE(port) |
| i286core.s.inport = CS_BASE + I286_IP; | I286_INPADRS = CS_BASE + I286_IP; |
| I286_AL = iocore_inp8(port); | I286_AL = iocore_inp8(port); |
| i286core.s.inport = 0; | I286_INPADRS = 0; |
| } | } |
| I286FN _in_ax_data8(void) { // E5: in ax, DATA8 | I286FN _in_ax_data8(void) { // E5: in ax, DATA8 |
| Line 2580 I286FN _lock(void) { // F0: lock | Line 2577 I286FN _lock(void) { // F0: lock |
| I286FN _repne(void) { // F2: repne | I286FN _repne(void) { // F2: repne |
| i286core.s.prefix++; | I286_PREFIX++; |
| if (i286core.s.prefix < MAX_PREFIX) { | if (I286_PREFIX < MAX_PREFIX) { |
| UINT op; | UINT op; |
| GET_PCBYTE(op); | GET_PCBYTE(op); |
| i286op_repne[op](); | i286op_repne[op](); |
| i286core.s.prefix = 0; | I286_PREFIX = 0; |
| } | } |
| else { | else { |
| INT_NUM(6, I286_IP); | INT_NUM(6, I286_IP); |
| Line 2594 I286FN _repne(void) { // F2: repne | Line 2591 I286FN _repne(void) { // F2: repne |
| I286FN _repe(void) { // F3: repe | I286FN _repe(void) { // F3: repe |
| i286core.s.prefix++; | I286_PREFIX++; |
| if (i286core.s.prefix < MAX_PREFIX) { | if (I286_PREFIX < MAX_PREFIX) { |
| UINT op; | UINT op; |
| GET_PCBYTE(op); | GET_PCBYTE(op); |
| i286op_repe[op](); | i286op_repe[op](); |
| i286core.s.prefix = 0; | I286_PREFIX = 0; |
| } | } |
| else { | else { |
| INT_NUM(6, I286_IP); | INT_NUM(6, I286_IP); |
| Line 2658 I286FN _sti(void) { // FB: sti | Line 2655 I286FN _sti(void) { // FB: sti |
| I286_WORKCLOCK(2); | I286_WORKCLOCK(2); |
| #if defined(INTR_FAST) | #if defined(INTR_FAST) |
| if (I286_FLAG & I_FLAG) { | if (I286_FLAG & I_FLAG) { |
| NEXT_OPCODE; | |
| return; // 更新の意味なし | return; // 更新の意味なし |
| } | } |
| #endif | #endif |
| I286_FLAG |= I_FLAG; | I286_FLAG |= I_FLAG; |
| I286_TRAP = (I286_FLAG & T_FLAG) >> 8; | I286_TRAP = (I286_FLAG & T_FLAG) >> 8; |
| #if defined(INTR_FAST) | #if defined(INTR_FAST) |
| if (EXISTINTR) { | if ((I286_TRAP) || (PICEXISTINTR)) { |
| REMAIN_ADJUST(1) | REMAIN_ADJUST(1) |
| } | } |
| else { | |
| NEXT_OPCODE; | |
| } | |
| #else | #else |
| REMAIN_ADJUST(1) | REMAIN_ADJUST(1) |
| #endif | #endif |
| Line 2984 I286FN _repe_segprefix_es(void) { | Line 2985 I286FN _repe_segprefix_es(void) { |
| DS_FIX = ES_BASE; | DS_FIX = ES_BASE; |
| SS_FIX = ES_BASE; | SS_FIX = ES_BASE; |
| i286core.s.prefix++; | I286_PREFIX++; |
| if (i286core.s.prefix < MAX_PREFIX) { | if (I286_PREFIX < MAX_PREFIX) { |
| UINT op; | UINT op; |
| GET_PCBYTE(op); | GET_PCBYTE(op); |
| i286op_repe[op](); | i286op_repe[op](); |
| REMOVE_PREFIX | REMOVE_PREFIX |
| i286core.s.prefix = 0; | I286_PREFIX = 0; |
| } | } |
| else { | else { |
| INT_NUM(6, I286_IP); | INT_NUM(6, I286_IP); |
| Line 3001 I286FN _repe_segprefix_cs(void) { | Line 3002 I286FN _repe_segprefix_cs(void) { |
| DS_FIX = CS_BASE; | DS_FIX = CS_BASE; |
| SS_FIX = CS_BASE; | SS_FIX = CS_BASE; |
| i286core.s.prefix++; | I286_PREFIX++; |
| if (i286core.s.prefix < MAX_PREFIX) { | if (I286_PREFIX < MAX_PREFIX) { |
| UINT op; | UINT op; |
| GET_PCBYTE(op); | GET_PCBYTE(op); |
| i286op_repe[op](); | i286op_repe[op](); |
| REMOVE_PREFIX | REMOVE_PREFIX |
| i286core.s.prefix = 0; | I286_PREFIX = 0; |
| } | } |
| else { | else { |
| INT_NUM(6, I286_IP); | INT_NUM(6, I286_IP); |
| Line 3018 I286FN _repe_segprefix_ss(void) { | Line 3019 I286FN _repe_segprefix_ss(void) { |
| DS_FIX = SS_BASE; | DS_FIX = SS_BASE; |
| SS_FIX = SS_BASE; | SS_FIX = SS_BASE; |
| i286core.s.prefix++; | I286_PREFIX++; |
| if (i286core.s.prefix < MAX_PREFIX) { | if (I286_PREFIX < MAX_PREFIX) { |
| UINT op; | UINT op; |
| GET_PCBYTE(op); | GET_PCBYTE(op); |
| i286op_repe[op](); | i286op_repe[op](); |
| REMOVE_PREFIX | REMOVE_PREFIX |
| i286core.s.prefix = 0; | I286_PREFIX = 0; |
| } | } |
| else { | else { |
| INT_NUM(6, I286_IP); | INT_NUM(6, I286_IP); |
| Line 3035 I286FN _repe_segprefix_ds(void) { | Line 3036 I286FN _repe_segprefix_ds(void) { |
| DS_FIX = DS_BASE; | DS_FIX = DS_BASE; |
| SS_FIX = DS_BASE; | SS_FIX = DS_BASE; |
| i286core.s.prefix++; | I286_PREFIX++; |
| if (i286core.s.prefix < MAX_PREFIX) { | if (I286_PREFIX < MAX_PREFIX) { |
| UINT op; | UINT op; |
| GET_PCBYTE(op); | GET_PCBYTE(op); |
| i286op_repe[op](); | i286op_repe[op](); |
| REMOVE_PREFIX | REMOVE_PREFIX |
| i286core.s.prefix = 0; | I286_PREFIX = 0; |
| } | } |
| else { | else { |
| INT_NUM(6, I286_IP); | INT_NUM(6, I286_IP); |
| Line 3329 I286FN _repne_segprefix_es(void) { | Line 3330 I286FN _repne_segprefix_es(void) { |
| DS_FIX = ES_BASE; | DS_FIX = ES_BASE; |
| SS_FIX = ES_BASE; | SS_FIX = ES_BASE; |
| i286core.s.prefix++; | I286_PREFIX++; |
| if (i286core.s.prefix < MAX_PREFIX) { | if (I286_PREFIX < MAX_PREFIX) { |
| UINT op; | UINT op; |
| GET_PCBYTE(op); | GET_PCBYTE(op); |
| i286op_repne[op](); | i286op_repne[op](); |
| REMOVE_PREFIX | REMOVE_PREFIX |
| i286core.s.prefix = 0; | I286_PREFIX = 0; |
| } | } |
| else { | else { |
| INT_NUM(6, I286_IP); | INT_NUM(6, I286_IP); |
| Line 3346 I286FN _repne_segprefix_cs(void) { | Line 3347 I286FN _repne_segprefix_cs(void) { |
| DS_FIX = CS_BASE; | DS_FIX = CS_BASE; |
| SS_FIX = CS_BASE; | SS_FIX = CS_BASE; |
| i286core.s.prefix++; | I286_PREFIX++; |
| if (i286core.s.prefix < MAX_PREFIX) { | if (I286_PREFIX < MAX_PREFIX) { |
| UINT op; | UINT op; |
| GET_PCBYTE(op); | GET_PCBYTE(op); |
| i286op_repne[op](); | i286op_repne[op](); |
| REMOVE_PREFIX | REMOVE_PREFIX |
| i286core.s.prefix = 0; | I286_PREFIX = 0; |
| } | } |
| else { | else { |
| INT_NUM(6, I286_IP); | INT_NUM(6, I286_IP); |
| Line 3363 I286FN _repne_segprefix_ss(void) { | Line 3364 I286FN _repne_segprefix_ss(void) { |
| DS_FIX = SS_BASE; | DS_FIX = SS_BASE; |
| SS_FIX = SS_BASE; | SS_FIX = SS_BASE; |
| i286core.s.prefix++; | I286_PREFIX++; |
| if (i286core.s.prefix < MAX_PREFIX) { | if (I286_PREFIX < MAX_PREFIX) { |
| UINT op; | UINT op; |
| GET_PCBYTE(op); | GET_PCBYTE(op); |
| i286op_repne[op](); | i286op_repne[op](); |
| REMOVE_PREFIX | REMOVE_PREFIX |
| i286core.s.prefix = 0; | I286_PREFIX = 0; |
| } | } |
| else { | else { |
| INT_NUM(6, I286_IP); | INT_NUM(6, I286_IP); |
| Line 3380 I286FN _repne_segprefix_ds(void) { | Line 3381 I286FN _repne_segprefix_ds(void) { |
| DS_FIX = DS_BASE; | DS_FIX = DS_BASE; |
| SS_FIX = DS_BASE; | SS_FIX = DS_BASE; |
| i286core.s.prefix++; | I286_PREFIX++; |
| if (i286core.s.prefix < MAX_PREFIX) { | if (I286_PREFIX < MAX_PREFIX) { |
| UINT op; | UINT op; |
| GET_PCBYTE(op); | GET_PCBYTE(op); |
| i286op_repne[op](); | i286op_repne[op](); |
| REMOVE_PREFIX | REMOVE_PREFIX |
| i286core.s.prefix = 0; | I286_PREFIX = 0; |
| } | } |
| else { | else { |
| INT_NUM(6, I286_IP); | INT_NUM(6, I286_IP); |