|
|
| version 1.19, 2003/12/01 17:13:36 | version 1.24, 2003/12/12 01:04:40 |
|---|---|
| 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 "pccore.h" | #include "pccore.h" |
| #include "iocore.h" | #include "iocore.h" |
| #include "bios.h" | #include "bios.h" |
| Line 623 I286FN _segprefix_es(void) { // 26: | Line 622 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 769 I286FN _segprefix_cs(void) { // 2e: | Line 768 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 910 I286FN _segprefix_ss(void) { // 36: | Line 909 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 934 I286FN _aaa(void) { // 37: aaa | Line 933 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 1026 I286FN _segprefix_ds(void) { // 3e: | Line 1026 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 1813 I286FN _popf(void) { // 9D: popf | Line 1813 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 ((flag & I_FLAG) && (PICEXISTINTR)) { | if ((I286_TRAP) || ((flag & I_FLAG) && (PICEXISTINTR))) { |
| I286IRQCHECKTERM | I286IRQCHECKTERM |
| } | } |
| #else | #else |
| Line 2272 I286FN _iret(void) { // CF: iret | Line 2272 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 2280 I286FN _iret(void) { // CF: iret | Line 2279 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 ((flag & I_FLAG) && (PICEXISTINTR)) { | if ((I286_TRAP) || ((flag & I_FLAG) && (PICEXISTINTR))) { |
| I286IRQCHECKTERM | I286IRQCHECKTERM |
| } | } |
| #else | #else |
| Line 2340 I286FN _shift_ea8_cl(void) { // D2: sh | Line 2340 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 2368 I286FN _shift_ea16_cl(void) { // D3: s | Line 2368 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 2474 I286FN _in_al_data8(void) { // E4: i | Line 2474 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 2576 I286FN _lock(void) { // F0: lock | Line 2576 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 2590 I286FN _repne(void) { // F2: repne | Line 2590 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 2654 I286FN _sti(void) { // FB: sti | Line 2654 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 (PICEXISTINTR) { | if ((I286_TRAP) || (PICEXISTINTR)) { |
| REMAIN_ADJUST(1) | REMAIN_ADJUST(1) |
| } | } |
| else { | |
| NEXT_OPCODE; | |
| } | |
| #else | #else |
| REMAIN_ADJUST(1) | REMAIN_ADJUST(1) |
| #endif | #endif |
| Line 2980 I286FN _repe_segprefix_es(void) { | Line 2984 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 2997 I286FN _repe_segprefix_cs(void) { | Line 3001 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 3014 I286FN _repe_segprefix_ss(void) { | Line 3018 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 3031 I286FN _repe_segprefix_ds(void) { | Line 3035 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 3325 I286FN _repne_segprefix_es(void) { | Line 3329 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 3342 I286FN _repne_segprefix_cs(void) { | Line 3346 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 3359 I286FN _repne_segprefix_ss(void) { | Line 3363 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 3376 I286FN _repne_segprefix_ds(void) { | Line 3380 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); |