static void PREFIX186(_rotshft_bd8)(void) /* Opcode 0xc0 */ { unsigned ModRM = FETCH; unsigned count = FETCH; PREFIX86(_rotate_shift_Byte)(ModRM,count); }
static void PREFIX186(_rotshft_wd8)(void) /* Opcode 0xc1 */ { unsigned ModRM = FETCH; unsigned count = FETCH; PREFIX86(_rotate_shift_Word)(ModRM,count); }
static void PREFIX186(_rotshft_wd8)(i8086_state *cpustate) /* Opcode 0xc1 */ { unsigned ModRM = FETCH; unsigned count = FETCH; PREFIX86(_rotate_shift_Word)(cpustate,ModRM,count); }
static void PREFIX186(_rotshft_bd8)(i8086_state *cpustate) /* Opcode 0xc0 */ { unsigned ModRM = FETCH; unsigned src = GetRMByte(ModRM); unsigned count = FETCH; PREFIX86(_rotate_shift_Byte)(cpustate,ModRM,count & 0x1f,src); }
static void PREFIX186(_bound)(void) /* Opcode 0x62 */ { unsigned ModRM = FETCHOP; int low = (INT16)GetRMWord(ModRM); int high= (INT16)GetnextRMWord; int tmp= (INT16)RegWord(ModRM); if (tmp<low || tmp>high) { I.pc-=2; PREFIX86(_interrupt)(5); } ICOUNT -= cycles.bound; }
static void PREFIX186(_bound)(i8086_state *cpustate) /* Opcode 0x62 */ { unsigned ModRM = FETCHOP; int low = (INT16)GetRMWord(ModRM); int high= (INT16)GetnextRMWord; int tmp= (INT16)RegWord(ModRM); if (tmp<low || tmp>high) { cpustate->pc-= ( cpustate->seg_prefix ? 3 : 2 ); PREFIX86(_interrupt)(cpustate, 5); } ICOUNT -= timing.bound; }
static void PREFIX186(_bound)(void) /* Opcode 0x62 */ { unsigned ModRM = FETCHOP; int low = (INT16)GetRMWord(ModRM); int high= (INT16)GetnextRMWord; int tmp= (INT16)RegWord(ModRM); if (tmp<low || tmp>high) { /* OB: on NECs CS:IP points to instruction FOLLOWING the BOUND instruction ! */ #if !defined(V20) I.pc-=2; PREFIX86(_interrupt)(5); #else PREFIX(_interrupt)(5,0); #endif } ICOUNT -= cycles.bound; }
static void i80286_interrupt_descriptor(i80286_state *cpustate,UINT16 number, int hwint, int error) { UINT16 desc[3], gatedesc[3]={0,0,0}, gatesel; UINT8 r; UINT32 addr; if(!PM) return PREFIX86(_interrupt)(cpustate, number); if ((number<<3)>=cpustate->idtr.limit) throw TRAP(GENERAL_PROTECTION_FAULT,(number*8+2+(hwint&&1))); desc[0] = ReadWord(cpustate->idtr.base+(number<<3)); desc[1] = ReadWord(cpustate->idtr.base+(number<<3)+2); desc[2] = ReadWord(cpustate->idtr.base+(number<<3)+4); r = RIGHTS(desc); if (!hwint && (DPL(r)<CPL)) throw TRAP(GENERAL_PROTECTION_FAULT,(number*8+2+(hwint&&1))); if (!PRES(r)) throw TRAP(SEG_NOT_PRESENT,(number*8+2+(hwint&&1))); gatesel = GATESEL(desc); switch (GATE(r)) { case TASKGATE: i80286_switch_task(cpustate, gatesel, CALL); if((hwint == 1) && (error != -1)) PUSH(error); i80286_load_flags(cpustate, cpustate->flags, CPL); break; case INTGATE: case TRAPGATE: if ((addr = i80286_selector_address(cpustate,gatesel)) == -1) throw TRAP(GENERAL_PROTECTION_FAULT,(IDXTBL(gatesel)+(hwint&&1))); gatedesc[0] = ReadWord(addr); gatedesc[1] = ReadWord(addr+2); gatedesc[2] = ReadWord(addr+4); r = RIGHTS(gatedesc); if (!CODE(r) || !SEGDESC(r)) throw TRAP(GENERAL_PROTECTION_FAULT,(IDXTBL(gatesel)+(hwint&&1))); if (DPL(r)>CPL) throw TRAP(GENERAL_PROTECTION_FAULT,(IDXTBL(gatesel)+(hwint&&1))); if (!PRES(r)) throw TRAP(SEG_NOT_PRESENT,(IDXTBL(gatesel)+(hwint&&1))); if (GATEOFF(desc) > LIMIT(gatedesc)) throw TRAP(GENERAL_PROTECTION_FAULT,(int)(hwint&&1)); if (!CONF(r)&&(DPL(r)<CPL)) { // inner call UINT16 tss_ss, tss_sp, oldss, oldsp; tss_ss = ReadWord(cpustate->tr.base+TSS_SS0*2+(DPL(r)*4)); tss_sp = ReadWord(cpustate->tr.base+TSS_SP0*2+(DPL(r)*4)); oldss = cpustate->sregs[SS]; oldsp = cpustate->regs.w[SP]; i80286_data_descriptor_full(cpustate, SS, tss_ss, DPL(r), TRAP(INVALID_TSS,(IDXTBL(tss_ss)+(hwint&&1))), tss_sp-((error != -1)?12:10), (error != -1)?12:10); cpustate->regs.w[SP] = tss_sp; PUSH(oldss); PUSH(oldsp); } else i80286_check_permission(cpustate, SS, cpustate->regs.w[SP]-((error != -1)?8:6), (error != -1)?8:6, I80286_READ); SET_ACC(gatedesc); WriteWord(addr+4, gatedesc[2]); PREFIX(_pushf(cpustate)); PUSH(cpustate->sregs[CS]); PUSH(cpustate->pc-cpustate->base[CS]); if((hwint == 1) && (error != -1)) PUSH(error); cpustate->sregs[CS]=IDXTBL(gatesel) | DPL(r); cpustate->limit[CS]=LIMIT(gatedesc); cpustate->base[CS]=BASE(gatedesc); cpustate->rights[CS]=RIGHTS(gatedesc); cpustate->pc=(cpustate->base[CS]+GATEOFF(desc))&AMASK; cpustate->TF = 0; cpustate->flags &= ~0x4000; if (GATE(RIGHTS(desc)) == INTGATE) cpustate->IF = 0; CHANGE_PC(cpustate->pc); break; default: throw TRAP(GENERAL_PROTECTION_FAULT,(number*8+2+(hwint&&1))); } }
static void PREFIX186(_rotshft_wcl)(i8086_state *cpustate) /* Opcode 0xd3 */ { unsigned ModRM = FETCHOP; PREFIX86(_rotate_shift_Word)(cpustate,ModRM,cpustate->regs.b[CL] & 0x1f,GetRMWord(ModRM)); }