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 <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;
|
||||||
|
|
@ -245,10 +242,10 @@ dontprint=0;
|
||||||
fetchdat = fastreadl(cs + cpu_state.pc);
|
fetchdat = fastreadl(cs + cpu_state.pc);
|
||||||
|
|
||||||
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);
|
||||||
|
|
|
||||||
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 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);
|
||||||
|
|
|
||||||
|
|
@ -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,9 +673,10 @@ 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));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
21
src/808x.c
21
src/808x.c
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
1
src/pc.c
1
src/pc.c
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
86
src/x86.h
86
src/x86.h
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
27
src/x86seg.c
27
src/x86seg.c
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue