1
0
Fork 0

Changed some cpu functions to get opcode length as parameter

Added cli and sti functions
Changed LAR/LSL opcodes to preload the value incase it doesn't get changed
Added some support illegal opcodes


Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@1748
This commit is contained in:
Sjoerd van der Berg 2004-03-31 17:28:16 +00:00
parent cd5f7c9666
commit 410ceedaba
6 changed files with 58 additions and 39 deletions

View file

@ -103,9 +103,13 @@ restartopcode:
#include "core_full/save.h"
nextopcode:;
}
exit_core:
LEAVECORE;
return CBRET_NONE;
illegalopcode:
LEAVECORE;
reg_eip-=(IPPoint-inst.opcode_start);
CPU_Exception(0x6,0);
goto restart_core;
}

View file

@ -206,6 +206,30 @@ l_M_Ed:
inst.op1.d = Pop_32();
inst.op2.d = Pop_16();
break;
case L_PFLGw:
if ((reg_flags & FLAG_VM) && ((reg_flags & FLAG_IOPL)!=FLAG_IOPL)) {
LEAVECORE;reg_eip-=IPPoint-inst.opcode_start;
CPU_Exception(13,0);
goto restart_core;
}
SETFLAGSw(Pop_16());
if (GETFLAG(IF) && PIC_IRQCheck) {
SaveIP();
return CBRET_NONE;
}
break;
case L_PFLGd:
if ((reg_flags & FLAG_VM) && ((reg_flags & FLAG_IOPL)!=FLAG_IOPL)) {
LEAVECORE;reg_eip-=IPPoint-inst.opcode_start;
CPU_Exception(13,0);
goto restart_core;
}
SETFLAGSd(Pop_32());
if (GETFLAG(IF) && PIC_IRQCheck) {
SaveIP();
return CBRET_NONE;
}
break;
case L_Ib:
inst.op1.d=Fetchb();
break;
@ -296,14 +320,14 @@ l_M_Ed:
break;
case D_IRETw:
LEAVECORE;
CPU_IRET(false);
CPU_IRET(false,IPPoint-inst.opcode_start);
if (GETFLAG(IF) && PIC_IRQCheck) {
return CBRET_NONE;
}
goto restart_core;
case D_IRETd:
LEAVECORE;
CPU_IRET(true);
CPU_IRET(true,IPPoint-inst.opcode_start);
if (GETFLAG(IF) && PIC_IRQCheck) {
return CBRET_NONE;
}
@ -312,23 +336,23 @@ l_M_Ed:
{
Bitu words=Fetchw();
LEAVECORE;
CPU_RET(false,words);
CPU_RET(false,words,IPPoint-inst.opcode_start);
goto restart_core;
}
case D_RETFw:
LEAVECORE;
CPU_RET(false,0);
CPU_RET(false,0,IPPoint-inst.opcode_start);
goto restart_core;
case D_RETFdIw:
{
Bitu words=Fetchw();
LEAVECORE;
CPU_RET(true,words);
CPU_RET(true,words,IPPoint-inst.opcode_start);
goto restart_core;
}
case D_RETFd:
LEAVECORE;
CPU_RET(true,0);
CPU_RET(true,0,IPPoint-inst.opcode_start);
goto restart_core;
/* Direct operations */
case L_STRING:
@ -403,14 +427,14 @@ l_M_Ed:
else reg_edx=0;
goto nextopcode;
case D_CLI:
SETFLAGBIT(IF,false);
LEAVECORE;
if (CPU_CLI(IPPoint-inst.opcode_start))
goto restart_core;
goto nextopcode;
case D_STI:
SETFLAGBIT(IF,true);
if (GETFLAG(IF) && PIC_IRQCheck) {
LEAVECORE;
return CBRET_NONE;
}
LEAVECORE;
if (CPU_STI(IPPoint-inst.opcode_start))
goto restart_core;
goto nextopcode;
case D_STC:
FillFlags();SETFLAGBIT(CF,true);
@ -531,6 +555,6 @@ l_M_Ed:
goto nextopcode;
default:
LOG(LOG_CPU,LOG_ERROR)("LOAD:Unhandled code %d opcode %X",inst.code.load,inst.entry);
break;
goto illegalopcode;
}

View file

@ -323,19 +323,19 @@ switch (inst.code.op) {
break;
case O_CALLFw:
LEAVECORE;
CPU_CALL(false,inst.op2.d,inst.op1.d);
CPU_CALL(false,inst.op2.d,inst.op1.d,IPPoint-inst.opcode_start);
goto restart_core;
case O_CALLFd:
LEAVECORE;
CPU_CALL(true,inst.op2.d,inst.op1.d);
CPU_CALL(true,inst.op2.d,inst.op1.d,IPPoint-inst.opcode_start);
goto restart_core;
case O_JMPFw:
LEAVECORE;
CPU_JMP(false,inst.op2.d,inst.op1.d);
CPU_JMP(false,inst.op2.d,inst.op1.d,IPPoint-inst.opcode_start);
goto restart_core;
case O_JMPFd:
LEAVECORE;
CPU_JMP(true,inst.op2.d,inst.op1.d);
CPU_JMP(true,inst.op2.d,inst.op1.d,IPPoint-inst.opcode_start);
goto restart_core;
case O_INT:
LEAVECORE;
@ -458,19 +458,22 @@ switch (inst.code.op) {
case O_LAR:
{
FillFlags();
Bitu ar;CPU_LAR(inst.op1.d,ar);
Bitu ar=inst.op2.d;
CPU_LAR(inst.op1.w,ar);
inst.op1.d=(Bit32u)ar;
}
break;
case O_LSL:
{
FillFlags();
Bitu limit;CPU_LSL(inst.op1.d,limit);
Bitu limit=inst.op2.d;
CPU_LSL(inst.op1.w,limit);
inst.op1.d=(Bit32u)limit;
}
break;
case O_ARPL:
{
if ((reg_flags & FLAG_VM) || !cpu.pmode) goto illegalopcode;
FillFlags();
Bitu new_sel=inst.op1.d;
CPU_ARPL(new_sel,inst.op2.d);

View file

@ -110,7 +110,7 @@ static OpCode OpCodeTable[1024]={
/* 0x98 - 0x9f */
{D_CBW ,0 ,0 ,0 },{D_CWD ,0 ,0 ,0 },
{L_Ifw ,O_CALLFw ,0 ,0 },{D_WAIT ,0 ,0 ,0 },
{L_FLG ,0 ,S_PUSHw,0 },{L_POPw ,0 ,S_FLGw ,0 },
{L_FLG ,0 ,S_PUSHw,0 },{L_PFLGw ,0 ,0 ,0 },
{L_REGb ,0 ,S_FLGb ,REGI_AH},{L_FLG ,0 ,S_REGb ,REGI_AH},
/* 0xa0 - 0xa7 */
@ -182,7 +182,7 @@ static OpCode OpCodeTable[1024]={
/* 0x100 - 0x107 */
{L_MODRM ,O_GRP6w ,S_Ew ,M_Ew },{L_MODRM ,O_GRP7w ,S_Ew ,M_Ew },
{L_MODRM ,O_LAR ,S_Gw ,M_Ew },{L_MODRM ,O_LSL ,S_Gw ,M_Ew },
{L_MODRM ,O_LAR ,S_Gw ,M_EwGw },{L_MODRM ,O_LSL ,S_Gw ,M_EwGw },
{0 ,0 ,0 ,0 },{0 ,0 ,0 ,0 },
{D_CLTS ,0 ,0 ,0 },{0 ,0 ,0 ,0 },
/* 0x108 - 0x10f */
@ -466,7 +466,7 @@ static OpCode OpCodeTable[1024]={
/* 0x298 - 0x29f */
{D_CWDE ,0 ,0 ,0 },{D_CDQ ,0 ,0 ,0 },
{L_Ifd ,O_CALLFd ,0 ,0 },{D_WAIT ,0 ,0 ,0 },
{L_FLG ,0 ,S_PUSHd,0 },{L_POPd ,0 ,S_FLGd ,0 },
{L_FLG ,0 ,S_PUSHd,0 },{L_PFLGw ,0 ,0 ,0 },
{L_REGb ,0 ,S_FLGb ,REGI_AH},{L_FLG ,0 ,S_REGb ,REGI_AH},
/* 0x2a0 - 0x2a7 */
@ -538,7 +538,7 @@ static OpCode OpCodeTable[1024]={
/* 0x300 - 0x307 */
{L_MODRM ,O_GRP6d ,S_Ew ,M_Ew },{L_MODRM ,O_GRP7d ,S_Ew ,M_Ew },
{L_MODRM ,O_LAR ,S_Gd ,M_Ew },{L_MODRM ,O_LSL ,S_Gd ,M_Ew },
{L_MODRM ,O_LAR ,S_Gd ,M_EdGd },{L_MODRM ,O_LSL ,S_Gd ,M_EdGd },
{0 ,0 ,0 ,0 },{0 ,0 ,0 ,0 },
{D_CLTS ,0 ,0 ,0 },{0 ,0 ,0 ,0 },
/* 0x308 - 0x30f */

View file

@ -113,20 +113,6 @@ switch (inst.code.save) {
case S_FLGb:
SETFLAGSb(inst.op1.b);
break;
case S_FLGw:
SETFLAGSw(inst.op1.w);
if (GETFLAG(IF) && PIC_IRQCheck) {
SaveIP();
return CBRET_NONE;
}
break;
case S_FLGd:
SETFLAGSd(inst.op1.d);
if (GETFLAG(IF) && PIC_IRQCheck) {
SaveIP();
return CBRET_NONE;
}
break;
case 0:
break;
default:

View file

@ -13,10 +13,12 @@ enum {
L_REGbIb,L_REGwIw,L_REGdId,
L_POPw,L_POPd,
L_POPfw,L_POPfd,
L_PFLGw,L_PFLGd,
L_SEG,
L_FLG,L_INTO,
L_VAL,
L_PRESEG,
L_DOUBLE,
@ -113,7 +115,7 @@ enum {
S_AIPw,S_C_AIPw,
S_AIPd,S_C_AIPd,
S_FLGb,S_FLGw,S_FLGd,
S_FLGb,
S_IP,S_IPIw,
};