First pass at sanitising CPU headers.
This commit is contained in:
parent
2735920f58
commit
1af0b660b3
18 changed files with 87 additions and 161 deletions
22
src/386.c
22
src/386.c
|
|
@ -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;
|
||||
|
|
@ -245,10 +242,10 @@ dontprint=0;
|
|||
fetchdat = fastreadl(cs + cpu_state.pc);
|
||||
|
||||
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);
|
||||
|
|
|
|||
13
src/386.h
13
src/386.h
|
|
@ -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);
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,9 +673,10 @@ 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));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
21
src/808x.c
21
src/808x.c
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
1
src/pc.c
1
src/pc.c
|
|
@ -81,7 +81,6 @@ void fullspeed();
|
|||
|
||||
int framecount,fps;
|
||||
|
||||
int output;
|
||||
int atfullspeed;
|
||||
|
||||
void saveconfig(char *fn);
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@
|
|||
#include "pit.h"
|
||||
#include "video.h"
|
||||
|
||||
int output;
|
||||
int intclear;
|
||||
int keywaiting=0;
|
||||
int pic_intpending;
|
||||
|
|
|
|||
86
src/x86.h
86
src/x86.h
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
27
src/x86seg.c
27
src/x86seg.c
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue