First pass at sanitising CPU headers.

This commit is contained in:
SarahW 2019-02-07 21:30:53 +00:00
commit 1af0b660b3
18 changed files with 87 additions and 161 deletions

View file

@ -2,7 +2,6 @@
#include <stdint.h>
#include <stdlib.h>
#include "ibm.h"
#include "386.h"
#include "x86.h"
#include "x87.h"
#include "mem.h"
@ -20,7 +19,10 @@ extern int codegen_flags_changed;
extern int nmi_enable;
int inscounts[256];
uint32_t use32;
int stack32;
int optype;
uint32_t oldpc2;
int trap;
@ -31,7 +33,6 @@ extern int cpl_override;
int has_fpu;
extern int fpucount;
uint16_t rds;
uint16_t ea_rseg;
int is486;
@ -42,9 +43,8 @@ int cgate32;
uint8_t romext[32768];
uint8_t *ram,*rom;
uint32_t rmdat32;
#define rmdat rmdat32
#define fetchdat rmdat32
uint32_t rmdat;
uint32_t backupregs[16];
extern int oddeven;
int inttype;
@ -54,9 +54,6 @@ uint32_t oldecx;
uint32_t *eal_r, *eal_w;
uint16_t *mod1add[2][8];
uint32_t *mod1seg[8];
static inline void fetch_ea_32_long(uint32_t rmdat)
{
eal_r = eal_w = NULL;
@ -246,9 +243,9 @@ dontprint=0;
if (!cpu_state.abrt)
{
trap = cpu_state.flags & T_FLAG;
opcode = fetchdat & 0xFF;
uint8_t opcode = fetchdat & 0xFF;
fetchdat >>= 8;
trap = cpu_state.flags & T_FLAG;
if (output == 3)
{
@ -350,7 +347,6 @@ dontprint=0;
addr = (temp << 2) + idt.base;
cpu_state.flags &= ~I_FLAG;
cpu_state.flags &= ~T_FLAG;
oxpc=cpu_state.pc;
cpu_state.pc=readmemw(0,addr);
loadcs(readmemw(0,addr+2));
// if (temp==0x76) pclog("INT to %04X:%04X\n",CS,pc);

View file

@ -1,13 +0,0 @@
extern void cpu_386_flags_extract();
extern void cpu_386_flags_rebuild();
void pmodeint(int num, int soft);
void loadcscall(uint16_t seg);
void loadcsjmp(uint16_t seg, uint32_t oxpc);
void pmoderetf(int is32, uint16_t off);
void pmodeiret(int is32);
void x86_int_sw(int num);
int x86_int_sw_rm(int num);
int divl(uint32_t val);
int idivl(int32_t val);

View file

@ -239,7 +239,4 @@ static inline void seteaq(uint64_t v)
#define getword2f() ((uint16_t)(fetchdat>>8)); cpu_state.pc+=2
#define rmdat rmdat32
#define fetchdat rmdat32
void x86_int(int num);

View file

@ -2,7 +2,6 @@
#include <stdint.h>
#include <stdlib.h>
#include "ibm.h"
#include "386.h"
#include "x86.h"
#include "x86_ops.h"
#include "x87.h"
@ -32,7 +31,6 @@ int cpu_block_end = 0;
int nmi_enable = 1;
int inscounts[256];
uint32_t oldpc2;
int trap;
@ -43,7 +41,6 @@ int cpl_override=0;
int has_fpu;
int fpucount=0;
uint16_t rds;
uint16_t ea_rseg;
int is486;
@ -53,7 +50,6 @@ int cgate32;
uint8_t romext[32768];
uint8_t *ram,*rom;
uint32_t rmdat32;
uint32_t backupregs[16];
int oddeven=0;
int inttype;
@ -61,11 +57,6 @@ int inttype;
uint32_t oldecx;
uint32_t *eal_r, *eal_w;
uint16_t *mod1add[2][8];
uint32_t *mod1seg[8];
static inline void fetch_ea_32_long(uint32_t rmdat)
{
eal_r = eal_w = NULL;
@ -231,7 +222,6 @@ void x86_int(int num)
cpu_state.flags &= ~I_FLAG;
cpu_state.flags &= ~T_FLAG;
oxpc=cpu_state.pc;
cpu_state.pc=readmemw(0,addr);
loadcs(readmemw(0,addr+2));
}
@ -278,7 +268,6 @@ void x86_int_sw(int num)
cpu_state.flags &= ~I_FLAG;
cpu_state.flags &= ~T_FLAG;
oxpc=cpu_state.pc;
cpu_state.pc=readmemw(0,addr);
loadcs(readmemw(0,addr+2));
cycles -= timing_int_rm;
@ -311,7 +300,6 @@ int x86_int_sw_rm(int num)
cpu_state.flags &= ~T_FLAG;
cpu_state.pc = new_pc;
loadcs(new_cs);
oxpc=cpu_state.pc;
cycles -= timing_int_rm;
trap = 0;
@ -548,9 +536,9 @@ void exec386_dynarec(int cycs)
if (!cpu_state.abrt)
{
trap = cpu_state.flags & T_FLAG;
opcode = fetchdat & 0xFF;
uint8_t opcode = fetchdat & 0xFF;
fetchdat >>= 8;
trap = cpu_state.flags & T_FLAG;
// if (output == 3)
// pclog("int %04X(%06X):%04X : %08X %08X %08X %08X %04X %04X %04X(%08X) %04X %04X %04X(%08X) %08X %08X %08X SP=%04X:%08X %02X %04X %i %08X %08X %i %i %02X %02X %02X %02X %02X %f %02X%02X %02X%02X\n",CS,cs,pc,EAX,EBX,ECX,EDX,CS,DS,ES,es,FS,GS,SS,ss,EDI,ESI,EBP,SS,ESP,opcode,flags,ins,0, ldt.base, CPL, stack32, pic.pend, pic.mask, pic.mask2, pic2.pend, pic2.mask, pit.c[0], ram[0x8f13f], ram[0x8f13e], ram[0x8f141], ram[0x8f140]);
@ -685,10 +673,11 @@ void exec386_dynarec(int cycs)
if (!cpu_state.abrt)
{
trap = cpu_state.flags & T_FLAG;
opcode = fetchdat & 0xFF;
uint8_t opcode = fetchdat & 0xFF;
fetchdat >>= 8;
trap = cpu_state.flags & T_FLAG;
// if (output == 3)
// pclog("%04X(%06X):%04X : %08X %08X %08X %08X %04X %04X %04X(%08X) %04X %04X %04X(%08X) %08X %08X %08X SP=%04X:%08X %02X %04X %i %08X %08X %i %i %02X %02X %02X %02X %02X %08x %08x\n",CS,cs,pc,EAX,EBX,ECX,EDX,CS,DS,ES,es,FS,GS,SS,ss,EDI,ESI,EBP,SS,ESP,opcode,flags,ins,0, ldt.base, CPL, stack32, pic.pend, pic.mask, pic.mask2, pic2.pend, pic2.mask, cs+pc, pccache);
@ -757,10 +746,11 @@ void exec386_dynarec(int cycs)
if (!cpu_state.abrt)
{
trap = cpu_state.flags & T_FLAG;
opcode = fetchdat & 0xFF;
uint8_t opcode = fetchdat & 0xFF;
fetchdat >>= 8;
trap = cpu_state.flags & T_FLAG;
// if (output == 3)
// pclog("%04X(%06X):%04X : %08X %08X %08X %08X %04X %04X %04X(%08X) %04X %04X %04X(%08X) %08X %08X %08X SP=%04X:%08X %02X %04X %i %08X %08X %i %i %02X %02X %02X %02X %02X %08x %08x\n",CS,cs,pc,EAX,EBX,ECX,EDX,CS,DS,ES,es,FS,GS,SS,ss,EDI,ESI,EBP,SS,ESP,opcode,flags,ins,0, ldt.base, CPL, stack32, pic.pend, pic.mask, pic.mask2, pic2.pend, pic2.mask, cs+pc, pccache);
@ -885,7 +875,6 @@ void exec386_dynarec(int cycs)
addr=temp<<2;
cpu_state.flags &= ~I_FLAG;
cpu_state.flags &= ~T_FLAG;
oxpc=cpu_state.pc;
cpu_state.pc=readmemw(0,addr);
loadcs(readmemw(0,addr+2));
}

View file

@ -1,6 +1,5 @@
#include "ibm.h"
#include "cpu.h"
#include "386.h"
#include "x86.h"
#include "x86_ops.h"
#include "x87.h"
@ -15,9 +14,6 @@
#include "386_common.h"
extern uint16_t *mod1add[2][8];
extern uint32_t *mod1seg[8];
static inline void fetch_ea_32_long(uint32_t rmdat)
{
eal_r = eal_w = NULL;

View file

@ -38,6 +38,8 @@ int nopageerrors=0;
void FETCHCOMPLETE();
#define IRQTEST ((cpu_state.flags & I_FLAG) && (pic.pend&~pic.mask) && !noint)
#undef readmemb
#undef readmemw
uint8_t readmemb(uint32_t a)
@ -91,9 +93,8 @@ void writememl(uint32_t s, uint32_t a, uint32_t v)
int oldcpl;
int tempc;
uint8_t opcode;
uint16_t pc2,pc3;
int noint=0;
static int noint=0;
int output=0;
@ -330,9 +331,9 @@ reg = If mod=11, (depending on data size, 16 bits/8 bits, 32 bits=extend 16 bit
*/
uint32_t easeg;
int rmdat;
uint32_t rmdat;
uint16_t zero=0;
static uint16_t zero=0;
uint16_t *mod1add[2][8];
uint32_t *mod1seg[8];
@ -429,7 +430,7 @@ static inline void seteaw(uint16_t val)
/*Flags*/
uint8_t znptable8[256];
uint16_t znptable16[65536];
static uint16_t znptable16[65536];
void makeznptable()
{
@ -649,7 +650,6 @@ void resetx86()
EAX = 0;
ESP=0;
mmu_perm=4;
memset(inscounts, 0, sizeof(inscounts));
x86seg_reset();
codegen_reset();
x86_was_reset = 1;
@ -1112,10 +1112,9 @@ void rep(int fv)
}
int inhlt=0;
uint16_t lastpc,lastcs;
static int inhlt=0;
int firstrepcycle;
int skipnextprint=0;
static int skipnextprint=0;
int instime=0;
//#if 0
@ -1136,6 +1135,8 @@ void execx86(int cycs)
// return;
while (cycles>0)
{
uint8_t opcode;
// old83=old82;
// old82=old8;
// if (pc==0x96B && cs==0x9E040) { printf("Hit it\n"); output=1; timetolive=150; }
@ -2450,8 +2451,6 @@ void execx86(int cycs)
cycles-=72;
break;
case 0xCD: /*INT*/
lastpc=cpu_state.pc;
lastcs=CS;
temp=FETCH();
if (cpu_state.ssegs) ss=oldss;

View file

@ -2,7 +2,6 @@
#include "x86.h"
#include "386_common.h"
#include "386.h"
#include "codegen.h"
#include "codegen_ir.h"
#include "codegen_ops.h"

View file

@ -3,7 +3,6 @@
#include "x86.h"
#include "x86_flags.h"
#include "386_common.h"
#include "386.h"
#include "codegen.h"
#include "codegen_ir.h"
#include "codegen_ops.h"

View file

@ -70,7 +70,6 @@ typedef struct FDC
static FDC fdc;
void fdc_callback();
int timetolive;
//#define SECTORS 9
int lastbyte=0;
uint8_t disc_3f7;

View file

@ -276,7 +276,6 @@ uint32_t dr[8];
//#define IOPLV86 ((!(msw&1)) || (CPL<=IOPL))
extern int cycles_lost;
extern int is486;
extern uint8_t opcode;
extern int insc;
extern int fpucount;
extern float mips,flops;

View file

@ -81,7 +81,6 @@ void fullspeed();
int framecount,fps;
int output;
int atfullspeed;
void saveconfig(char *fn);

View file

@ -4,7 +4,6 @@
#include "pit.h"
#include "video.h"
int output;
int intclear;
int keywaiting=0;
int pic_intpending;

View file

@ -1,22 +1,30 @@
extern uint32_t rmdat32;
int oldcpl;
extern uint32_t rmdat;
#define fetchdat rmdat
extern uint32_t easeg;
extern int oldcpl;
extern int nmi_enable;
int tempc;
int output;
int firstrepcycle;
extern int output;
extern int timetolive;
uint32_t easeg,ealimit,ealimitw;
extern uint8_t znptable8[256];
int skipnextprint;
int inhlt;
extern uint32_t use32;
extern int stack32;
extern uint16_t *mod1add[2][8];
extern uint32_t *mod1seg[8];
extern int cgate32;
extern uint32_t *eal_r, *eal_w;
extern int x86_was_reset;
uint8_t opcode;
int noint;
uint16_t lastcs,lastpc;
int timetolive,keyboardtimer;
#define setznp168 setznp16
@ -29,12 +37,6 @@ int timetolive,keyboardtimer;
#define setr16(r,v) cpu_state.regs[r].w=v
#define setr32(r,v) cpu_state.regs[r].l=v
uint8_t znptable8[256];
uint16_t znptable16[65536];
int use32;
int stack32;
#define fetchea() { rmdat=readmemb(cs+pc); pc++; \
reg=(rmdat>>3)&7; \
mod=(rmdat>>6)&3; \
@ -42,34 +44,12 @@ int stack32;
if (mod!=3) fetcheal(); }
int optype;
extern int optype;
#define JMP 1
#define CALL 2
#define IRET 3
#define OPTYPE_INT 4
uint32_t oxpc;
extern uint16_t *mod1add[2][8];
extern uint32_t *mod1seg[8];
#define IRQTEST ((cpu_state.flags & I_FLAG) && (pic.pend&~pic.mask) && !noint)
extern int cgate32;
extern uint32_t *eal_r, *eal_w;
extern uint32_t flags_zn;
extern uint8_t flags_p;
#define FLAG_N (flags_zn>>31)
#define FLAG_Z (flags_zn)
#define FLAG_P (znptable8[flags_p]&P_FLAG)
extern int gpf;
enum
{
@ -86,22 +66,14 @@ extern uint32_t abrt_error;
void x86_doabrt(int x86_abrt);
extern uint8_t opcode2;
extern uint16_t rds;
extern uint32_t rmdat32;
extern int inscounts[256];
extern int codegen_flat_ds;
extern int codegen_flat_ss;
void x86illegal();
void x86seg_reset();
void x86gpf(char *s, uint16_t error);
extern uint16_t zero;
extern int x86_was_reset;
void resetx86();
void softresetx86();
void refreshread();
@ -111,5 +83,13 @@ void execx86(int cycs);
void exec386(int cycs);
void exec386_dynarec(int cycs);
extern int codegen_flat_ds;
extern int codegen_flat_ss;
void pmodeint(int num, int soft);
void loadcscall(uint16_t seg, uint32_t old_pc);
void loadcsjmp(uint16_t seg, uint32_t old_pc);
void pmoderetf(int is32, uint16_t off);
void pmodeiret(int is32);
void x86_int_sw(int num);
int x86_int_sw_rm(int num);
int divl(uint32_t val);
int idivl(int32_t val);

View file

@ -1,3 +1,5 @@
extern int tempc;
enum
{
FLAGS_UNKNOWN,
@ -553,3 +555,5 @@ static inline void setsbc32(uint32_t a, uint32_t b)
cpu_state.flags_op = FLAGS_SBC32;
}
extern void cpu_386_flags_extract();
extern void cpu_386_flags_rebuild();

View file

@ -1,11 +1,10 @@
#define CALL_FAR_w(new_seg, new_pc) \
old_cs = CS; \
old_pc = cpu_state.pc; \
oxpc = cpu_state.pc; \
cpu_state.pc = new_pc; \
optype = CALL; \
cgate16 = cgate32 = 0; \
if (msw & 1) loadcscall(new_seg); \
if (msw & 1) loadcscall(new_seg, old_pc); \
else \
{ \
loadcs(new_seg); \
@ -30,11 +29,10 @@
#define CALL_FAR_l(new_seg, new_pc) \
old_cs = CS; \
old_pc = cpu_state.pc; \
oxpc = cpu_state.pc; \
cpu_state.pc = new_pc; \
optype = CALL; \
cgate16 = cgate32 = 0; \
if (msw & 1) loadcscall(new_seg); \
if (msw & 1) loadcscall(new_seg, old_pc); \
else \
{ \
loadcs(new_seg); \
@ -158,11 +156,11 @@ static int opFF_w_a16(uint32_t fetchdat)
case 0x28: /*JMP far*/
if (cpu_mod != 3)
SEG_CHECK_READ(cpu_state.ea_seg);
oxpc = cpu_state.pc;
old_pc = cpu_state.pc;
new_pc = readmemw(easeg, cpu_state.eaaddr);
new_cs = readmemw(easeg, cpu_state.eaaddr + 2); if (cpu_state.abrt) return 1;
cpu_state.pc = new_pc;
loadcsjmp(new_cs, oxpc); if (cpu_state.abrt) return 1;
loadcsjmp(new_cs, old_pc); if (cpu_state.abrt) return 1;
CPU_BLOCK_END();
PREFETCH_RUN(cycles_old-cycles, 2, rmdat, 2,0,0,0, 0);
PREFETCH_FLUSH();
@ -249,11 +247,11 @@ static int opFF_w_a32(uint32_t fetchdat)
case 0x28: /*JMP far*/
if (cpu_mod != 3)
SEG_CHECK_READ(cpu_state.ea_seg);
oxpc = cpu_state.pc;
old_pc = cpu_state.pc;
new_pc = readmemw(easeg, cpu_state.eaaddr);
new_cs = readmemw(easeg, cpu_state.eaaddr + 2); if (cpu_state.abrt) return 1;
cpu_state.pc = new_pc;
loadcsjmp(new_cs, oxpc); if (cpu_state.abrt) return 1;
loadcsjmp(new_cs, old_pc); if (cpu_state.abrt) return 1;
CPU_BLOCK_END();
PREFETCH_RUN(cycles_old-cycles, 2, rmdat, 2,0,0,0, 1);
PREFETCH_FLUSH();
@ -341,11 +339,11 @@ static int opFF_l_a16(uint32_t fetchdat)
case 0x28: /*JMP far*/
if (cpu_mod != 3)
SEG_CHECK_READ(cpu_state.ea_seg);
oxpc = cpu_state.pc;
old_pc = cpu_state.pc;
new_pc = readmeml(easeg, cpu_state.eaaddr);
new_cs = readmemw(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 1;
cpu_state.pc = new_pc;
loadcsjmp(new_cs, oxpc); if (cpu_state.abrt) return 1;
loadcsjmp(new_cs, old_pc); if (cpu_state.abrt) return 1;
CPU_BLOCK_END();
PREFETCH_RUN(cycles_old-cycles, 2, rmdat, 1,1,0,0, 0);
PREFETCH_FLUSH();
@ -432,11 +430,11 @@ static int opFF_l_a32(uint32_t fetchdat)
case 0x28: /*JMP far*/
if (cpu_mod != 3)
SEG_CHECK_READ(cpu_state.ea_seg);
oxpc = cpu_state.pc;
old_pc = cpu_state.pc;
new_pc = readmeml(easeg, cpu_state.eaaddr);
new_cs = readmemw(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 1;
cpu_state.pc = new_pc;
loadcsjmp(new_cs, oxpc); if (cpu_state.abrt) return 1;
loadcsjmp(new_cs, old_pc); if (cpu_state.abrt) return 1;
CPU_BLOCK_END();
PREFETCH_RUN(cycles_old-cycles, 2, rmdat, 1,1,0,0, 1);
PREFETCH_FLUSH();

View file

@ -270,9 +270,9 @@ static int opJMP_far_a16(uint32_t fetchdat)
{
uint16_t addr = getwordf();
uint16_t seg = getword(); if (cpu_state.abrt) return 1;
uint32_t oxpc = cpu_state.pc;
uint32_t old_pc = cpu_state.pc;
cpu_state.pc = addr;
loadcsjmp(seg, oxpc);
loadcsjmp(seg, old_pc);
CPU_BLOCK_END();
PREFETCH_RUN(11, 5, -1, 0,0,0,0, 0);
PREFETCH_FLUSH();
@ -282,9 +282,9 @@ static int opJMP_far_a32(uint32_t fetchdat)
{
uint32_t addr = getlong();
uint16_t seg = getword(); if (cpu_state.abrt) return 1;
uint32_t oxpc = cpu_state.pc;
uint32_t old_pc = cpu_state.pc;
cpu_state.pc = addr;
loadcsjmp(seg, oxpc);
loadcsjmp(seg, old_pc);
CPU_BLOCK_END();
PREFETCH_RUN(11, 7, -1, 0,0,0,0, 0);
PREFETCH_FLUSH();

View file

@ -4,7 +4,6 @@
pmoderetf(0, stack_offset); \
return 1; \
} \
oxpc = cpu_state.pc; \
if (stack32) \
{ \
cpu_state.pc = readmemw(ss, ESP); \
@ -26,7 +25,6 @@
pmoderetf(1, stack_offset); \
return 1; \
} \
oxpc = cpu_state.pc; \
if (stack32) \
{ \
cpu_state.pc = readmeml(ss, ESP); \
@ -108,7 +106,6 @@ static int opIRET_286(uint32_t fetchdat)
else
{
uint16_t new_cs;
oxpc = cpu_state.pc;
if (stack32)
{
cpu_state.pc = readmemw(ss, ESP);
@ -184,7 +181,6 @@ static int opIRET(uint32_t fetchdat)
else
{
uint16_t new_cs;
oxpc = cpu_state.pc;
if (stack32)
{
cpu_state.pc = readmemw(ss, ESP);
@ -230,7 +226,6 @@ static int opIRETD(uint32_t fetchdat)
else
{
uint16_t new_cs;
oxpc = cpu_state.pc;
if (stack32)
{
cpu_state.pc = readmeml(ss, ESP);

View file

@ -5,7 +5,7 @@
#include "ibm.h"
#include "mem.h"
#include "x86.h"
#include "386.h"
#include "x86_flags.h"
#include "386_common.h"
#include "cpu.h"
#include "config.h"
@ -32,8 +32,6 @@ int intgatesize;
void taskswitch286(uint16_t seg, uint16_t *segdat, int is32);
void taskswitch386(uint16_t seg, uint16_t *segdat);
int output;
/*NOT PRESENT is INT 0B
GPF is INT 0D*/
@ -60,8 +58,6 @@ void x86abort(const char *format, ...)
exit(-1);
}
uint8_t opcode2;
static void seg_reset(x86seg *s)
{
s->access = (0 << 5) | 2;
@ -129,7 +125,6 @@ void x86_doabrt(int x86_abrt)
cpu_state.flags &= ~I_FLAG;
cpu_state.flags &= ~T_FLAG;
oxpc=cpu_state.pc;
cpu_state.pc=readmemw(0,addr);
loadcs(readmemw(0,addr+2));
return;
@ -163,8 +158,6 @@ void x86_doabrt(int x86_abrt)
SP-=4;
}
}
// ingpf = 0;
// abrt = gpf = 1;
}
void x86gpf(char *s, uint16_t error)
{
@ -343,7 +336,7 @@ int loadseg(uint16_t seg, x86seg *s)
{
if (addr>=ldt.limit)
{
pclog("Bigger than LDT limit %04X %04X %02X %02X %02X\n",seg,ldt.limit, opcode, opcode2, 0/*rmdat*/);
pclog("Bigger than LDT limit %04X %04X %02X\n",seg,ldt.limit, 0/*rmdat*/);
// dumppic();
// dumpregs();
// exit(-1);
@ -548,7 +541,7 @@ void loadcs(uint16_t seg)
if ((seg&3)>CPL)
{
x86gpf(NULL,seg&~3);
pclog("loadcs RPL > CPL %04X %04X %i %02X\n",segdat[2],seg,CPL,opcode);
pclog("loadcs RPL > CPL %04X %04X %i\n",segdat[2],seg,CPL);
return;
}
if (CPL != DPL)
@ -592,7 +585,7 @@ void loadcs(uint16_t seg)
switch (segdat[2]&0xF00)
{
default:
pclog("Bad CS %02X %02X %i special descriptor %03X %04X\n",opcode,0/*rmdat*/,optype,segdat[2]&0xF00,seg);
pclog("Bad CS %02X %i special descriptor %03X %04X\n",0/*rmdat*/,optype,segdat[2]&0xF00,seg);
x86gpf(NULL,seg&~3);
return;
}
@ -615,7 +608,7 @@ void loadcs(uint16_t seg)
}
}
void loadcsjmp(uint16_t seg, uint32_t oxpc)
void loadcsjmp(uint16_t seg, uint32_t old_pc)
{
uint16_t segdat[4];
uint32_t addr;
@ -825,7 +818,7 @@ void loadcsjmp(uint16_t seg, uint32_t oxpc)
case 0x100: /*286 Task gate*/
case 0x900: /*386 Task gate*/
// pclog("Task gate\n");
cpu_state.pc=oxpc;
cpu_state.pc = old_pc;
optype=JMP;
cpl_override=1;
taskswitch286(seg,segdat,segdat[2]&0x800);
@ -837,7 +830,7 @@ void loadcsjmp(uint16_t seg, uint32_t oxpc)
return;
default:
pclog("Bad JMP CS %02X %02X %i special descriptor %03X %04X\n",opcode,0/*rmdat*/,optype,segdat[2]&0xF00,seg);
pclog("Bad JMP CS %02X %i special descriptor %03X %04X\n",0/*rmdat*/,optype,segdat[2]&0xF00,seg);
x86gpf(NULL,0);
return;
// dumpregs();
@ -931,7 +924,7 @@ uint32_t POPL()
return templ;
}
void loadcscall(uint16_t seg)
void loadcscall(uint16_t seg, uint32_t old_pc)
{
uint16_t seg2;
uint16_t segdat[4],segdat2[4],newss;
@ -1337,7 +1330,7 @@ void loadcscall(uint16_t seg)
case 0x100: /*286 Task gate*/
case 0x900: /*386 Task gate*/
// pclog("Task gate\n");
cpu_state.pc=oxpc;
cpu_state.pc = old_pc;
cpl_override=1;
taskswitch286(seg,segdat,segdat[2]&0x800);
cpl_override=0;
@ -2070,7 +2063,6 @@ void pmodeiret(int is32)
x86gpf(NULL,0);
return;
}
oxpc=cpu_state.pc;
if (is32)
{
newpc=POPL();
@ -2128,7 +2120,6 @@ void pmodeiret(int is32)
cpl_override=0;
return;
}
oxpc=cpu_state.pc;
flagmask=0xFFFF;
if (CPL) flagmask&=~0x3000;
if (IOPL<CPL) flagmask&=~0x200;