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

View file

@ -2,7 +2,6 @@
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include "ibm.h" #include "ibm.h"
#include "386.h"
#include "x86.h" #include "x86.h"
#include "x86_ops.h" #include "x86_ops.h"
#include "x87.h" #include "x87.h"
@ -32,7 +31,6 @@ int cpu_block_end = 0;
int nmi_enable = 1; int nmi_enable = 1;
int inscounts[256];
uint32_t oldpc2; uint32_t oldpc2;
int trap; int trap;
@ -43,7 +41,6 @@ int cpl_override=0;
int has_fpu; int has_fpu;
int fpucount=0; int fpucount=0;
uint16_t rds;
uint16_t ea_rseg; uint16_t ea_rseg;
int is486; int is486;
@ -53,7 +50,6 @@ int cgate32;
uint8_t romext[32768]; uint8_t romext[32768];
uint8_t *ram,*rom; uint8_t *ram,*rom;
uint32_t rmdat32;
uint32_t backupregs[16]; uint32_t backupregs[16];
int oddeven=0; int oddeven=0;
int inttype; int inttype;
@ -61,11 +57,6 @@ int inttype;
uint32_t oldecx; 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) static inline void fetch_ea_32_long(uint32_t rmdat)
{ {
eal_r = eal_w = NULL; eal_r = eal_w = NULL;
@ -231,7 +222,6 @@ void x86_int(int num)
cpu_state.flags &= ~I_FLAG; cpu_state.flags &= ~I_FLAG;
cpu_state.flags &= ~T_FLAG; cpu_state.flags &= ~T_FLAG;
oxpc=cpu_state.pc;
cpu_state.pc=readmemw(0,addr); cpu_state.pc=readmemw(0,addr);
loadcs(readmemw(0,addr+2)); loadcs(readmemw(0,addr+2));
} }
@ -278,7 +268,6 @@ void x86_int_sw(int num)
cpu_state.flags &= ~I_FLAG; cpu_state.flags &= ~I_FLAG;
cpu_state.flags &= ~T_FLAG; cpu_state.flags &= ~T_FLAG;
oxpc=cpu_state.pc;
cpu_state.pc=readmemw(0,addr); cpu_state.pc=readmemw(0,addr);
loadcs(readmemw(0,addr+2)); loadcs(readmemw(0,addr+2));
cycles -= timing_int_rm; cycles -= timing_int_rm;
@ -311,7 +300,6 @@ int x86_int_sw_rm(int num)
cpu_state.flags &= ~T_FLAG; cpu_state.flags &= ~T_FLAG;
cpu_state.pc = new_pc; cpu_state.pc = new_pc;
loadcs(new_cs); loadcs(new_cs);
oxpc=cpu_state.pc;
cycles -= timing_int_rm; cycles -= timing_int_rm;
trap = 0; trap = 0;
@ -548,9 +536,9 @@ void exec386_dynarec(int cycs)
if (!cpu_state.abrt) if (!cpu_state.abrt)
{ {
trap = cpu_state.flags & T_FLAG; uint8_t opcode = fetchdat & 0xFF;
opcode = fetchdat & 0xFF;
fetchdat >>= 8; fetchdat >>= 8;
trap = cpu_state.flags & T_FLAG;
// if (output == 3) // 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]); // 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) if (!cpu_state.abrt)
{ {
trap = cpu_state.flags & T_FLAG; uint8_t opcode = fetchdat & 0xFF;
opcode = fetchdat & 0xFF;
fetchdat >>= 8; fetchdat >>= 8;
trap = cpu_state.flags & T_FLAG;
// if (output == 3) // 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); // 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) if (!cpu_state.abrt)
{ {
trap = cpu_state.flags & T_FLAG; uint8_t opcode = fetchdat & 0xFF;
opcode = fetchdat & 0xFF;
fetchdat >>= 8; fetchdat >>= 8;
trap = cpu_state.flags & T_FLAG;
// if (output == 3) // 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); // 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; addr=temp<<2;
cpu_state.flags &= ~I_FLAG; cpu_state.flags &= ~I_FLAG;
cpu_state.flags &= ~T_FLAG; cpu_state.flags &= ~T_FLAG;
oxpc=cpu_state.pc;
cpu_state.pc=readmemw(0,addr); cpu_state.pc=readmemw(0,addr);
loadcs(readmemw(0,addr+2)); loadcs(readmemw(0,addr+2));
} }

View file

@ -1,6 +1,5 @@
#include "ibm.h" #include "ibm.h"
#include "cpu.h" #include "cpu.h"
#include "386.h"
#include "x86.h" #include "x86.h"
#include "x86_ops.h" #include "x86_ops.h"
#include "x87.h" #include "x87.h"
@ -15,9 +14,6 @@
#include "386_common.h" #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) static inline void fetch_ea_32_long(uint32_t rmdat)
{ {
eal_r = eal_w = NULL; eal_r = eal_w = NULL;

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,22 +1,30 @@
extern uint32_t rmdat32; extern uint32_t rmdat;
int oldcpl; #define fetchdat rmdat
extern uint32_t easeg;
extern int oldcpl;
extern int nmi_enable; extern int nmi_enable;
int tempc; extern int output;
int output; extern int timetolive;
int firstrepcycle;
uint32_t easeg,ealimit,ealimitw; extern uint8_t znptable8[256];
int skipnextprint; extern uint32_t use32;
int inhlt; 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 #define setznp168 setznp16
@ -29,12 +37,6 @@ int timetolive,keyboardtimer;
#define setr16(r,v) cpu_state.regs[r].w=v #define setr16(r,v) cpu_state.regs[r].w=v
#define setr32(r,v) cpu_state.regs[r].l=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++; \ #define fetchea() { rmdat=readmemb(cs+pc); pc++; \
reg=(rmdat>>3)&7; \ reg=(rmdat>>3)&7; \
mod=(rmdat>>6)&3; \ mod=(rmdat>>6)&3; \
@ -42,34 +44,12 @@ int stack32;
if (mod!=3) fetcheal(); } if (mod!=3) fetcheal(); }
int optype; extern int optype;
#define JMP 1 #define JMP 1
#define CALL 2 #define CALL 2
#define IRET 3 #define IRET 3
#define OPTYPE_INT 4 #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 enum
{ {
@ -86,22 +66,14 @@ extern uint32_t abrt_error;
void x86_doabrt(int x86_abrt); void x86_doabrt(int x86_abrt);
extern uint8_t opcode2; extern int codegen_flat_ds;
extern int codegen_flat_ss;
extern uint16_t rds;
extern uint32_t rmdat32;
extern int inscounts[256];
void x86illegal(); void x86illegal();
void x86seg_reset(); void x86seg_reset();
void x86gpf(char *s, uint16_t error); void x86gpf(char *s, uint16_t error);
extern uint16_t zero;
extern int x86_was_reset;
void resetx86(); void resetx86();
void softresetx86(); void softresetx86();
void refreshread(); void refreshread();
@ -111,5 +83,13 @@ void execx86(int cycs);
void exec386(int cycs); void exec386(int cycs);
void exec386_dynarec(int cycs); void exec386_dynarec(int cycs);
extern int codegen_flat_ds; void pmodeint(int num, int soft);
extern int codegen_flat_ss; 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 enum
{ {
FLAGS_UNKNOWN, FLAGS_UNKNOWN,
@ -553,3 +555,5 @@ static inline void setsbc32(uint32_t a, uint32_t b)
cpu_state.flags_op = FLAGS_SBC32; 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) \ #define CALL_FAR_w(new_seg, new_pc) \
old_cs = CS; \ old_cs = CS; \
old_pc = cpu_state.pc; \ old_pc = cpu_state.pc; \
oxpc = cpu_state.pc; \
cpu_state.pc = new_pc; \ cpu_state.pc = new_pc; \
optype = CALL; \ optype = CALL; \
cgate16 = cgate32 = 0; \ cgate16 = cgate32 = 0; \
if (msw & 1) loadcscall(new_seg); \ if (msw & 1) loadcscall(new_seg, old_pc); \
else \ else \
{ \ { \
loadcs(new_seg); \ loadcs(new_seg); \
@ -30,11 +29,10 @@
#define CALL_FAR_l(new_seg, new_pc) \ #define CALL_FAR_l(new_seg, new_pc) \
old_cs = CS; \ old_cs = CS; \
old_pc = cpu_state.pc; \ old_pc = cpu_state.pc; \
oxpc = cpu_state.pc; \
cpu_state.pc = new_pc; \ cpu_state.pc = new_pc; \
optype = CALL; \ optype = CALL; \
cgate16 = cgate32 = 0; \ cgate16 = cgate32 = 0; \
if (msw & 1) loadcscall(new_seg); \ if (msw & 1) loadcscall(new_seg, old_pc); \
else \ else \
{ \ { \
loadcs(new_seg); \ loadcs(new_seg); \
@ -158,11 +156,11 @@ static int opFF_w_a16(uint32_t fetchdat)
case 0x28: /*JMP far*/ case 0x28: /*JMP far*/
if (cpu_mod != 3) if (cpu_mod != 3)
SEG_CHECK_READ(cpu_state.ea_seg); SEG_CHECK_READ(cpu_state.ea_seg);
oxpc = cpu_state.pc; old_pc = cpu_state.pc;
new_pc = readmemw(easeg, cpu_state.eaaddr); new_pc = readmemw(easeg, cpu_state.eaaddr);
new_cs = readmemw(easeg, cpu_state.eaaddr + 2); if (cpu_state.abrt) return 1; new_cs = readmemw(easeg, cpu_state.eaaddr + 2); if (cpu_state.abrt) return 1;
cpu_state.pc = new_pc; 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(); CPU_BLOCK_END();
PREFETCH_RUN(cycles_old-cycles, 2, rmdat, 2,0,0,0, 0); PREFETCH_RUN(cycles_old-cycles, 2, rmdat, 2,0,0,0, 0);
PREFETCH_FLUSH(); PREFETCH_FLUSH();
@ -249,11 +247,11 @@ static int opFF_w_a32(uint32_t fetchdat)
case 0x28: /*JMP far*/ case 0x28: /*JMP far*/
if (cpu_mod != 3) if (cpu_mod != 3)
SEG_CHECK_READ(cpu_state.ea_seg); SEG_CHECK_READ(cpu_state.ea_seg);
oxpc = cpu_state.pc; old_pc = cpu_state.pc;
new_pc = readmemw(easeg, cpu_state.eaaddr); new_pc = readmemw(easeg, cpu_state.eaaddr);
new_cs = readmemw(easeg, cpu_state.eaaddr + 2); if (cpu_state.abrt) return 1; new_cs = readmemw(easeg, cpu_state.eaaddr + 2); if (cpu_state.abrt) return 1;
cpu_state.pc = new_pc; 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(); CPU_BLOCK_END();
PREFETCH_RUN(cycles_old-cycles, 2, rmdat, 2,0,0,0, 1); PREFETCH_RUN(cycles_old-cycles, 2, rmdat, 2,0,0,0, 1);
PREFETCH_FLUSH(); PREFETCH_FLUSH();
@ -341,11 +339,11 @@ static int opFF_l_a16(uint32_t fetchdat)
case 0x28: /*JMP far*/ case 0x28: /*JMP far*/
if (cpu_mod != 3) if (cpu_mod != 3)
SEG_CHECK_READ(cpu_state.ea_seg); SEG_CHECK_READ(cpu_state.ea_seg);
oxpc = cpu_state.pc; old_pc = cpu_state.pc;
new_pc = readmeml(easeg, cpu_state.eaaddr); new_pc = readmeml(easeg, cpu_state.eaaddr);
new_cs = readmemw(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 1; new_cs = readmemw(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 1;
cpu_state.pc = new_pc; 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(); CPU_BLOCK_END();
PREFETCH_RUN(cycles_old-cycles, 2, rmdat, 1,1,0,0, 0); PREFETCH_RUN(cycles_old-cycles, 2, rmdat, 1,1,0,0, 0);
PREFETCH_FLUSH(); PREFETCH_FLUSH();
@ -432,11 +430,11 @@ static int opFF_l_a32(uint32_t fetchdat)
case 0x28: /*JMP far*/ case 0x28: /*JMP far*/
if (cpu_mod != 3) if (cpu_mod != 3)
SEG_CHECK_READ(cpu_state.ea_seg); SEG_CHECK_READ(cpu_state.ea_seg);
oxpc = cpu_state.pc; old_pc = cpu_state.pc;
new_pc = readmeml(easeg, cpu_state.eaaddr); new_pc = readmeml(easeg, cpu_state.eaaddr);
new_cs = readmemw(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 1; new_cs = readmemw(easeg, cpu_state.eaaddr + 4); if (cpu_state.abrt) return 1;
cpu_state.pc = new_pc; 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(); CPU_BLOCK_END();
PREFETCH_RUN(cycles_old-cycles, 2, rmdat, 1,1,0,0, 1); PREFETCH_RUN(cycles_old-cycles, 2, rmdat, 1,1,0,0, 1);
PREFETCH_FLUSH(); PREFETCH_FLUSH();

View file

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

View file

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

View file

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