Rewritten 808x CPU emulation core based on reenigne's XTCE, VisiOn, SnatchIt, and 8088 MPH now work correctly;
Fixed PC speaker sound volume in PIT mode 0; A few CPU emulation clean-ups; Hard disk controller changing redone in a less messy way; Re-added the long-missing key send delay handling to the XT keyboard handler; Fixed a bug that was causing SLiRP not to work when compiled with MingW/GCC 7.3.0-2 or newer; Some serial mouse and port fixes; A lot of changes to printer emulation, mostly based on DOSBox-X; Printer PNG writer now uses statically linked libpng; Added support for the HxC MFM floppy image format and upped 86F format version to 2.12; Ported various things from PCem and some from VARCem; Added the S3 86c801/805 emulation (patch from TheCollector1995); Fixed and renamed the EGA monitor options; Better synchronized the 808x to the PIT and the CGA; Fixed the CGA wait state calculation; Cleaned up some things in mem.c; Fixed some things in the floppy emulation to make VisiOn get the correct errors from the copy protection disk; Fixed several renderer-related bugs, including the SDL2 renderer's failure to take screenshots; The Jenkins builds are now compiled with MingW/GCC 7.4.0-1 and include all the required DLL's.
This commit is contained in:
@@ -27,53 +27,33 @@
|
||||
|
||||
extern int codegen_flags_changed;
|
||||
|
||||
extern int nmi_enable;
|
||||
int cpl_override = 0, fpucount = 0;
|
||||
int tempc, oldcpl, optype, inttype, oddeven = 0;
|
||||
int use32, stack32;
|
||||
|
||||
int inscounts[256];
|
||||
uint32_t oldpc2;
|
||||
uint16_t flags, eflags;
|
||||
uint16_t rds, ea_rseg;
|
||||
uint16_t oldcs;
|
||||
|
||||
int trap;
|
||||
|
||||
uint16_t flags,eflags;
|
||||
uint32_t oldds,oldss,olddslimit,oldsslimit,olddslimitw,oldsslimitw;
|
||||
uint32_t oldds, oldss, olddslimit, oldsslimit,
|
||||
olddslimitw, oldsslimitw;
|
||||
uint32_t *eal_r, *eal_w;
|
||||
uint32_t oxpc, cr2, cr3, cr4;
|
||||
uint32_t dr[8];
|
||||
uint32_t rmdat32;
|
||||
uint32_t backupregs[16];
|
||||
|
||||
x86seg gdt,ldt,idt,tr;
|
||||
x86seg _cs,_ds,_es,_ss,_fs,_gs;
|
||||
x86seg _oldds;
|
||||
|
||||
|
||||
|
||||
extern int cpl_override;
|
||||
|
||||
extern int fpucount;
|
||||
uint16_t rds;
|
||||
uint16_t ea_rseg;
|
||||
|
||||
int cgate32;
|
||||
|
||||
uint32_t cr2, cr3, cr4;
|
||||
uint32_t dr[8];
|
||||
|
||||
uint32_t rmdat32;
|
||||
#define rmdat rmdat32
|
||||
#define fetchdat rmdat32
|
||||
uint32_t backupregs[16];
|
||||
extern int oddeven;
|
||||
int inttype;
|
||||
|
||||
|
||||
uint32_t oldcs2;
|
||||
uint32_t oldecx;
|
||||
|
||||
uint32_t *eal_r, *eal_w;
|
||||
|
||||
uint16_t *mod1add[2][8];
|
||||
uint32_t *mod1seg[8];
|
||||
|
||||
|
||||
#define fetch_ea_16(rmdat) cpu_state.pc++; cpu_mod=(rmdat >> 6) & 3; cpu_reg=(rmdat >> 3) & 7; cpu_rm = rmdat & 7; if (cpu_mod != 3) { fetch_ea_16_long(rmdat); if (cpu_state.abrt) return 0; }
|
||||
#define fetch_ea_32(rmdat) cpu_state.pc++; cpu_mod=(rmdat >> 6) & 3; cpu_reg=(rmdat >> 3) & 7; cpu_rm = rmdat & 7; if (cpu_mod != 3) { fetch_ea_32_long(rmdat); } if (cpu_state.abrt) return 0
|
||||
|
||||
|
||||
#include "x86_flags.h"
|
||||
|
||||
#define getbytef() ((uint8_t)(fetchdat)); cpu_state.pc++
|
||||
@@ -149,11 +129,6 @@ void exec386(int cycs)
|
||||
timer_start_period(cycles << TIMER_SHIFT);
|
||||
while (cycdiff < cycle_period)
|
||||
{
|
||||
/* testr[0]=EAX; testr[1]=EBX; testr[2]=ECX; testr[3]=EDX;
|
||||
testr[4]=ESI; testr[5]=EDI; testr[6]=EBP; testr[7]=ESP;*/
|
||||
/* testr[8]=flags;*/
|
||||
/* oldcs2=oldcs; */
|
||||
/* oldpc2=oldpc; */
|
||||
oldcs=CS;
|
||||
cpu_state.oldpc = cpu_state.pc;
|
||||
oldcpl=CPL;
|
||||
|
||||
@@ -34,43 +34,10 @@ uint32_t cpu_cur_status = 0;
|
||||
int cpu_reps, cpu_reps_latched;
|
||||
int cpu_notreps, cpu_notreps_latched;
|
||||
|
||||
int inrecomp = 0;
|
||||
int inrecomp = 0, cpu_block_end = 0;
|
||||
int cpu_recomp_blocks, cpu_recomp_full_ins, cpu_new_blocks;
|
||||
int cpu_recomp_blocks_latched, cpu_recomp_ins_latched, cpu_recomp_full_ins_latched, cpu_new_blocks_latched;
|
||||
|
||||
int cpu_block_end = 0;
|
||||
|
||||
int nmi_enable = 1;
|
||||
|
||||
int inscounts[256];
|
||||
uint32_t oldpc2;
|
||||
|
||||
int trap;
|
||||
|
||||
|
||||
|
||||
int cpl_override=0;
|
||||
|
||||
int fpucount=0;
|
||||
uint16_t rds;
|
||||
uint16_t ea_rseg;
|
||||
|
||||
int cgate32;
|
||||
|
||||
uint32_t rmdat32;
|
||||
uint32_t backupregs[16];
|
||||
int oddeven=0;
|
||||
int inttype;
|
||||
|
||||
|
||||
uint32_t oldcs2;
|
||||
uint32_t oldecx;
|
||||
|
||||
uint32_t *eal_r, *eal_w;
|
||||
|
||||
uint16_t *mod1add[2][8];
|
||||
uint32_t *mod1seg[8];
|
||||
|
||||
|
||||
#ifdef ENABLE_386_DYNAREC_LOG
|
||||
int x386_dynarec_do_log = ENABLE_386_DYNAREC_LOG;#endif
|
||||
|
||||
5687
src/cpu/808x.c
5687
src/cpu/808x.c
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* CPU type handler.
|
||||
*
|
||||
* Version: @(#)cpu.h 1.0.12 2018/10/02
|
||||
* Version: @(#)cpu.h 1.0.13 2018/11/14
|
||||
*
|
||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||
* leilei,
|
||||
@@ -442,7 +442,6 @@ extern void codegen_block_end(void);
|
||||
extern void codegen_reset(void);
|
||||
extern void cpu_set_edx(void);
|
||||
extern int divl(uint32_t val);
|
||||
extern void dumpregs(int __force);
|
||||
extern void execx86(int cycs);
|
||||
extern void exec386(int cycs);
|
||||
extern void exec386_dynarec(int cycs);
|
||||
@@ -463,8 +462,12 @@ extern void x86gpf(char *s, uint16_t error);
|
||||
extern void x86np(char *s, uint16_t error);
|
||||
extern void x86ss(char *s, uint16_t error);
|
||||
extern void x86ts(char *s, uint16_t error);
|
||||
|
||||
#ifdef ENABLE_808X_LOG
|
||||
extern void dumpregs(int __force);
|
||||
extern void x87_dumpregs(void);
|
||||
extern void x87_reset(void);
|
||||
#endif
|
||||
|
||||
extern int cpu_effective;
|
||||
extern void cpu_dynamic_switch(int new_cpu);
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
CPU cpus_8088[] = {
|
||||
/*8088 standard*/
|
||||
{"8088/4.77", CPU_8088, 0, 4772728, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1},
|
||||
{"8088/7.16", CPU_8088, 1, 14318184/2, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1},
|
||||
{"8088/7.16", CPU_8088, 1, 7159092, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1},
|
||||
{"8088/8", CPU_8088, 1, 8000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1},
|
||||
{"", -1, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0}
|
||||
};
|
||||
@@ -67,16 +67,16 @@ CPU cpus_pcjr[] = {
|
||||
CPU cpus_europc[] = {
|
||||
/*8088 EuroPC*/
|
||||
{"8088/4.77", CPU_8088, 0, 4772728, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1},
|
||||
{"8088/7.16", CPU_8088, 1, 14318184/2, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1},
|
||||
{"8088/9.54", CPU_8088, 1, 4772728*2, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1},
|
||||
{"8088/7.16", CPU_8088, 1, 7159092, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1},
|
||||
{"8088/9.54", CPU_8088, 1, 9545456, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1},
|
||||
{"", -1, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0}
|
||||
};
|
||||
|
||||
CPU cpus_8086[] = {
|
||||
/*8086 standard*/
|
||||
{"8086/7.16", CPU_8086, 1, 14318184/2, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1},
|
||||
{"8086/7.16", CPU_8086, 1, 7159092, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1},
|
||||
{"8086/8", CPU_8086, 1, 8000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1},
|
||||
{"8086/9.54", CPU_8086, 1, 4772728*2, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1},
|
||||
{"8086/9.54", CPU_8086, 1, 9545456, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1},
|
||||
{"8086/10", CPU_8086, 2, 10000000, 1, 0, 0, 0, 0, 0, 0,0,0,0, 1},
|
||||
{"", -1, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0}
|
||||
};
|
||||
|
||||
102
src/cpu/x86.h
102
src/cpu/x86.h
@@ -1,23 +1,28 @@
|
||||
uint16_t oldcs;
|
||||
extern uint32_t rmdat32;
|
||||
int oldcpl;
|
||||
extern uint8_t opcode, opcode2;
|
||||
extern uint8_t flags_p;
|
||||
extern uint8_t znptable8[256];
|
||||
|
||||
extern int nmi_enable;
|
||||
extern uint16_t zero, oldcs;
|
||||
extern uint16_t lastcs, lastpc;
|
||||
extern uint16_t rds, ea_rseg;
|
||||
extern uint16_t znptable16[65536];
|
||||
extern uint16_t *mod1add[2][8];
|
||||
|
||||
int tempc;
|
||||
int output;
|
||||
int firstrepcycle;
|
||||
extern int x86_was_reset, codegen_flat_ds;
|
||||
extern int codegen_flat_ss, nmi_enable;
|
||||
extern int timetolive, keyboardtimer, trap;
|
||||
extern int tempc, optype, use32, stack32;
|
||||
extern int oldcpl, cgate32, cpl_override, fpucount;
|
||||
extern int gpf, nmi_enable;
|
||||
extern int oddeven, inttype;
|
||||
|
||||
uint32_t easeg,ealimit,ealimitw;
|
||||
extern uint32_t rmdat32, easeg;
|
||||
extern uint32_t oxpc, flags_zn;
|
||||
extern uint32_t abrt_error;
|
||||
extern uint32_t backupregs[16];
|
||||
extern uint32_t *mod1seg[8];
|
||||
extern uint32_t *eal_r, *eal_w;
|
||||
|
||||
int skipnextprint;
|
||||
int inhlt;
|
||||
|
||||
uint8_t opcode;
|
||||
int noint;
|
||||
|
||||
uint16_t lastcs,lastpc;
|
||||
extern int timetolive,keyboardtimer;
|
||||
|
||||
#define setznp168 setznp16
|
||||
|
||||
@@ -30,47 +35,25 @@ extern 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];
|
||||
#define fetchea() { \
|
||||
rmdat = readmemb(cs + pc); \
|
||||
pc++; \
|
||||
reg = (rmdat >> 3) & 7; \
|
||||
mod = (rmdat >> 6) & 3; \
|
||||
rm = rmdat & 7; \
|
||||
if (mod!=3) \
|
||||
fetcheal(); \
|
||||
}
|
||||
|
||||
int use32;
|
||||
int stack32;
|
||||
|
||||
#define fetchea() { rmdat=readmemb(cs+pc); pc++; \
|
||||
reg=(rmdat>>3)&7; \
|
||||
mod=(rmdat>>6)&3; \
|
||||
rm=rmdat&7; \
|
||||
if (mod!=3) fetcheal(); }
|
||||
|
||||
|
||||
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 ((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
|
||||
{
|
||||
@@ -83,25 +66,8 @@ enum
|
||||
ABRT_PF = 0xE
|
||||
};
|
||||
|
||||
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];
|
||||
|
||||
void x86illegal();
|
||||
|
||||
void x86seg_reset();
|
||||
void x86gpf(char *s, uint16_t error);
|
||||
|
||||
extern uint16_t zero;
|
||||
|
||||
extern int x86_was_reset;
|
||||
|
||||
extern int codegen_flat_ds;
|
||||
extern int codegen_flat_ss;
|
||||
extern void x86_doabrt(int x86_abrt);
|
||||
extern void x86illegal();
|
||||
extern void x86seg_reset();
|
||||
extern void x86gpf(char *s, uint16_t error);
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* x86 CPU segment emulation.
|
||||
*
|
||||
* Version: @(#)x86seg.c 1.0.8 2018/10/17
|
||||
* Version: @(#)x86seg.c 1.0.9 2018/11/14
|
||||
*
|
||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
@@ -46,7 +46,7 @@ int dtimes = 0;
|
||||
int btimes = 0;
|
||||
|
||||
uint32_t abrt_error;
|
||||
int cgate16,cgate32;
|
||||
int cgate16, cgate32;
|
||||
|
||||
#define breaknullsegs 0
|
||||
|
||||
@@ -55,7 +55,6 @@ int intgatesize;
|
||||
void taskswitch286(uint16_t seg, uint16_t *segdat, int is32);
|
||||
void taskswitch386(uint16_t seg, uint16_t *segdat);
|
||||
|
||||
int output;
|
||||
void pmodeint(int num, int soft);
|
||||
/*NOT PRESENT is INT 0B
|
||||
GPF is INT 0D*/
|
||||
@@ -89,7 +88,9 @@ void x86abort(const char *format, ...)
|
||||
va_end(ap);
|
||||
fflush(stdlog);
|
||||
nvr_save();
|
||||
#ifdef ENABLE_808X_LOG
|
||||
dumpregs(1);
|
||||
#endif
|
||||
fflush(stdlog);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
@@ -65,6 +65,7 @@ void x87_settag(uint16_t new_tag)
|
||||
cpu_state.tag[7] = (new_tag >> 14) & 3;
|
||||
}
|
||||
|
||||
#ifdef ENABLE_808X_LOG
|
||||
void x87_dumpregs()
|
||||
{
|
||||
if (cpu_state.ismmx)
|
||||
@@ -79,21 +80,4 @@ void x87_dumpregs()
|
||||
}
|
||||
fpu_log("Status = %04X Control = %04X Tag = %04X\n", cpu_state.npxs, cpu_state.npxc, x87_gettag());
|
||||
}
|
||||
|
||||
void x87_print()
|
||||
{
|
||||
if (cpu_state.ismmx)
|
||||
{
|
||||
fpu_log("\tMM0=%016llX\tMM1=%016llX\tMM2=%016llX\tMM3=%016llX\t", cpu_state.MM[0].q, cpu_state.MM[1].q, cpu_state.MM[2].q, cpu_state.MM[3].q);
|
||||
fpu_log("MM4=%016llX\tMM5=%016llX\tMM6=%016llX\tMM7=%016llX\n", cpu_state.MM[4].q, cpu_state.MM[5].q, cpu_state.MM[6].q, cpu_state.MM[7].q);
|
||||
}
|
||||
else
|
||||
{
|
||||
fpu_log("\tST(0)=%.20f\tST(1)=%.20f\tST(2)=%f\tST(3)=%f\t",cpu_state.ST[cpu_state.TOP&7],cpu_state.ST[(cpu_state.TOP+1)&7],cpu_state.ST[(cpu_state.TOP+2)&7],cpu_state.ST[(cpu_state.TOP+3)&7]);
|
||||
fpu_log("ST(4)=%f\tST(5)=%f\tST(6)=%f\tST(7)=%f\tTOP=%i CR=%04X SR=%04X TAG=%04X\n",cpu_state.ST[(cpu_state.TOP+4)&7],cpu_state.ST[(cpu_state.TOP+5)&7],cpu_state.ST[(cpu_state.TOP+6)&7],cpu_state.ST[(cpu_state.TOP+7)&7], cpu_state.TOP, cpu_state.npxc, cpu_state.npxs, x87_gettag());
|
||||
}
|
||||
}
|
||||
|
||||
void x87_reset()
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user