Clean-up to CPU module

. Removed all obsolete DLL code
. Simplified CpuCalcCycles()
. Split 6502/65C02 emu into 2 funcs
. Removed redundant vars: pages, cpuemutype
Bug fix #8300 : 80-col text in Silvern Castle got corrupted
This commit is contained in:
tomch 2006-11-01 21:45:56 +00:00
parent 9d433c1395
commit 1832b7ccef
7 changed files with 712 additions and 885 deletions

View File

@ -46,9 +46,6 @@ bool g_bFullSpeed = false;
// Win32
HINSTANCE g_hInstance = (HINSTANCE)0;
static DWORD lastfastpaging = 0;
static DWORD lasttrimimages = 0;
AppMode_e g_nAppMode = MODE_LOGO;
static int lastmode = MODE_LOGO;
@ -70,21 +67,6 @@ bool g_bDisableDirectSound = false;
//===========================================================================
void CheckFastPaging ()
{
if ((pages >= 10) && CpuSupportsFastPaging())
{
lastfastpaging = cumulativecycles;
if (cpuemtype == CPU_COMPILING)
{
lasttrimimages = cumulativecycles;
MemSetFastPaging(1);
}
}
}
//===========================================================================
#define DBG_CALC_FREQ 0
#if DBG_CALC_FREQ
const UINT MAX_CNT = 256;
@ -145,7 +127,6 @@ void ContinueExecution()
cyclenum = dwExecutedCycles;
CheckFastPaging();
DiskUpdatePosition(dwExecutedCycles);
JoyUpdatePosition();
VideoUpdateVbl(g_dwCyclesThisFrame);
@ -155,21 +136,6 @@ void ContinueExecution()
//
if (cpuemtype == CPU_FASTPAGING) //?
{
if ((!pages) && (cumulativecycles-lastfastpaging > 500000))
{
MemSetFastPaging(0);
}
else if (cumulativecycles-lasttrimimages > 500000)
{
MemTrimImages();
lasttrimimages = cumulativecycles;
}
}
//
const DWORD CLKS_PER_MS = (DWORD)g_fCurrentCLK6502 / 1000;
emulmsec_frac += dwExecutedCycles;
@ -179,8 +145,6 @@ void ContinueExecution()
emulmsec_frac %= CLKS_PER_MS;
}
pages = 0; //?
//
// DETERMINE WHETHER THE SCREEN WAS UPDATED, THE DISK WAS SPINNING,
// OR THE KEYBOARD I/O PORTS WERE BEING EXCESSIVELY QUERIED THIS CLOCKTICK

View File

@ -99,33 +99,20 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#define SHORTOPCODES 22
#define BENCHOPCODES 33
typedef DWORD (__stdcall *cpuexecutetype)(DWORD);
typedef void (__stdcall *cpugetcodetype)(WORD,LPBYTE *,DWORD *);
typedef void (__stdcall *cpuinittype )(LPBYTE,LPBYTE *,LPBYTE *,DWORD,DWORD,
LPVOID,iofunction *,iofunction *,LPBYTE,
cxfunction, cxfunction);
typedef DWORD (__stdcall *cpuversiontype)(void);
// What is this 6502 code?
static BYTE benchopcode[BENCHOPCODES] = {0x06,0x16,0x24,0x45,0x48,0x65,0x68,0x76,
0x84,0x85,0x86,0x91,0x94,0xA4,0xA5,0xA6,
0xB1,0xB4,0xC0,0xC4,0xC5,0xE6,
0x19,0x6D,0x8D,0x99,0x9D,0xAD,0xB9,0xBD,
0xDD,0xED,0xEE};
DWORD cpuemtype = CPU_COMPILING;
static cpuexecutetype cpuexecutefunc[3] = {NULL,NULL,NULL};
static cpugetcodetype cpugetcodefunc[3] = {NULL,NULL,NULL};
static cpuinittype cpuinitfunc[3] = {NULL,NULL,NULL};
static cpuversiontype cpuversionfunc[3] = {NULL,NULL,NULL};
static HINSTANCE cpulibrary[3] = {(HINSTANCE)0,(HINSTANCE)0,(HINSTANCE)0};
regsrec regs;
unsigned __int64 g_nCumulativeCycles = 0;
static ULONG g_nCyclesSubmitted; // Number of cycles submitted to CpuExecute()
static ULONG g_nCyclesExecuted;
static signed long nInternalCyclesLeft;
static signed long g_uInternalExecutedCycles;
//
@ -156,17 +143,17 @@ static volatile BOOL g_bNmiFlank = FALSE; // Positive going flank on NMI line
| (flagz ? AF_ZERO : 0) \
| AF_RESERVED | AF_BREAK;
// CYC(a): This can be optimised, as only certain opcodes will affect uExtraCycles
#define CYC(a) cycles += (a)+uExtraCycles; MB_UpdateCycles((a)+uExtraCycles);
#define CYC(a) uExecutedCycles += (a)+uExtraCycles; MB_UpdateCycles((a)+uExtraCycles);
#define POP (*(mem+((regs.sp >= 0x1FF) ? (regs.sp = 0x100) : ++regs.sp)))
#define PUSH(a) *(mem+regs.sp--) = (a); \
if (regs.sp < 0x100) \
regs.sp = 0x1FF;
#define READ ( \
((addr & 0xFF00) == 0xC000) \
? ioread[addr & 0xFF](regs.pc,(BYTE)addr,0,0,nInternalCyclesLeft) \
? ioread[addr & 0xFF](regs.pc,(BYTE)addr,0,0,uExecutedCycles) \
: ( \
(((addr & 0xFF00) == 0xC400) || ((addr & 0xFF00) == 0xC500)) \
? CxReadFunc(regs.pc, addr, 0, 0, nInternalCyclesLeft) \
? CxReadFunc(regs.pc, addr, 0, 0, uExecutedCycles) \
: *(mem+addr) \
) \
)
@ -181,9 +168,9 @@ static volatile BOOL g_bNmiFlank = FALSE; // Positive going flank on NMI line
if (page) \
*(page+(addr & 0xFF)) = (BYTE)(a); \
else if ((addr & 0xFF00) == 0xC000) \
iowrite[addr & 0xFF](regs.pc,(BYTE)addr,1,(BYTE)(a),nInternalCyclesLeft); \
iowrite[addr & 0xFF](regs.pc,(BYTE)addr,1,(BYTE)(a),uExecutedCycles); \
else if(((addr & 0xFF00) == 0xC400) || ((addr & 0xFF00) == 0xC500)) \
CxWriteFunc(regs.pc, addr, 1, (BYTE)(a), nInternalCyclesLeft); \
CxWriteFunc(regs.pc, addr, 1, (BYTE)(a), uExecutedCycles); \
}
//
@ -802,13 +789,13 @@ UINT g_nMean = 0;
UINT g_nMin = 0xFFFFFFFF;
UINT g_nMax = 0;
static inline void DoIrqProfiling(DWORD cycles)
static inline void DoIrqProfiling(DWORD uCycles)
{
#ifdef _DEBUG
if(regs.ps & AF_INTERRUPT)
return; // Still in Apple's ROM
g_nCycleIrqEnd = g_nCumulativeCycles + cycles;
g_nCycleIrqEnd = g_nCumulativeCycles + uCycles;
g_nCycleIrqTime = (UINT) (g_nCycleIrqEnd - g_nCycleIrqStart);
if(g_nCycleIrqTime > g_nMax) g_nMax = g_nCycleIrqTime;
@ -832,7 +819,8 @@ static inline void DoIrqProfiling(DWORD cycles)
}
//===========================================================================
static DWORD InternalCpuExecute (DWORD totalcycles)
static DWORD Cpu65C02 (DWORD uTotalCycles)
{
WORD addr;
BOOL flagc; // must always be 0 or 1, no other values allowed
@ -843,16 +831,14 @@ static DWORD InternalCpuExecute (DWORD totalcycles)
WORD temp2;
WORD val;
AF_TO_EF
DWORD cycles = 0;
DWORD uExecutedCycles = 0;
BOOL bSlowerOnPagecross; // Set if opcode writes to memory (eg. ASL, STA)
WORD base;
bool bBreakOnInvalid = false;
if (g_bApple2e)
{
do
{
nInternalCyclesLeft = (totalcycles<<8) - (cycles<<8);
g_uInternalExecutedCycles = uExecutedCycles;
USHORT uExtraCycles = 0;
BYTE iOpcode = *(mem+regs.pc);
@ -927,7 +913,7 @@ static DWORD InternalCpuExecute (DWORD totalcycles)
case 0x3D: ABSX AND CYC(4) break;
case 0x3E: ABSX ROL_CMOS CYC(6) break;
case 0x3F: INV NOP CYC(2) break;
case 0x40: RTI CYC(6) DoIrqProfiling(cycles); break;
case 0x40: RTI CYC(6) DoIrqProfiling(uExecutedCycles); break;
case 0x41: INDX EOR CYC(6) break;
case 0x42: INV IMM NOP CYC(2) break;
case 0x43: INV NOP CYC(2) break;
@ -1125,7 +1111,7 @@ static DWORD InternalCpuExecute (DWORD totalcycles)
{
// NMI signals are only serviced once
g_bNmiFlank = FALSE;
g_nCycleIrqStart = g_nCumulativeCycles + cycles;
g_nCycleIrqStart = g_nCumulativeCycles + uExecutedCycles;
PUSH(regs.pc >> 8)
PUSH(regs.pc & 0xFF)
EF_TO_AF
@ -1138,7 +1124,7 @@ static DWORD InternalCpuExecute (DWORD totalcycles)
if(g_bmIRQ && !(regs.ps & AF_INTERRUPT))
{
// IRQ signals are deasserted when a specific r/w operation is done on device
g_nCycleIrqStart = g_nCumulativeCycles + cycles;
g_nCycleIrqStart = g_nCumulativeCycles + uExecutedCycles;
PUSH(regs.pc >> 8)
PUSH(regs.pc & 0xFF)
EF_TO_AF
@ -1150,15 +1136,34 @@ static DWORD InternalCpuExecute (DWORD totalcycles)
if (bBreakOnInvalid)
break;
} while (cycles < totalcycles);
} while (uExecutedCycles < uTotalCycles);
EF_TO_AF
return cycles;
return uExecutedCycles;
}
else // Apple ][
//===========================================================================
static DWORD Cpu6502 (DWORD uTotalCycles)
{
WORD addr;
BOOL flagc; // must always be 0 or 1, no other values allowed
BOOL flagn; // must always be 0 or 0x80.
BOOL flagv; // any value allowed
BOOL flagz; // any value allowed
WORD temp;
WORD temp2;
WORD val;
AF_TO_EF
DWORD uExecutedCycles = 0;
BOOL bSlowerOnPagecross; // Set if opcode writes to memory (eg. ASL, STA)
WORD base;
bool bBreakOnInvalid = false;
do
{
nInternalCyclesLeft = (totalcycles<<8) - (cycles<<8);
g_uInternalExecutedCycles = uExecutedCycles;
USHORT uExtraCycles = 0;
BYTE iOpcode = *(mem+regs.pc);
@ -1233,7 +1238,7 @@ static DWORD InternalCpuExecute (DWORD totalcycles)
case 0x3D: ABSX AND CYC(4) break;
case 0x3E: ABSX ROL_NMOS CYC(6) break;
case 0x3F: INV ABSX RLA CYC(7) break;
case 0x40: RTI CYC(6) DoIrqProfiling(cycles); break;
case 0x40: RTI CYC(6) DoIrqProfiling(uExecutedCycles); break;
case 0x41: INDX EOR CYC(6) break;
case 0x42: INV HLT CYC(2) break;
case 0x43: INV INDX LSE CYC(8) break;
@ -1431,7 +1436,7 @@ static DWORD InternalCpuExecute (DWORD totalcycles)
{
// NMI signals are only serviced once
g_bNmiFlank = FALSE;
g_nCycleIrqStart = g_nCumulativeCycles + cycles;
g_nCycleIrqStart = g_nCumulativeCycles + uExecutedCycles;
PUSH(regs.pc >> 8)
PUSH(regs.pc & 0xFF)
EF_TO_AF
@ -1444,7 +1449,7 @@ static DWORD InternalCpuExecute (DWORD totalcycles)
if(g_bmIRQ && !(regs.ps & AF_INTERRUPT) && !regs.bJammed)
{
// IRQ signals are deasserted when a specific r/w operation is done on device
g_nCycleIrqStart = g_nCumulativeCycles + cycles;
g_nCycleIrqStart = g_nCumulativeCycles + uExecutedCycles;
PUSH(regs.pc >> 8)
PUSH(regs.pc & 0xFF)
EF_TO_AF
@ -1456,11 +1461,21 @@ static DWORD InternalCpuExecute (DWORD totalcycles)
if (bBreakOnInvalid)
break;
} while (cycles < totalcycles);
} while (uExecutedCycles < uTotalCycles);
EF_TO_AF
return cycles;
return uExecutedCycles;
}
//===========================================================================
static DWORD InternalCpuExecute (DWORD uTotalCycles)
{
if (g_bApple2e)
return Cpu65C02(uTotalCycles);
else // Apple ][
return Cpu6502(uTotalCycles);
}
//
@ -1468,16 +1483,9 @@ static DWORD InternalCpuExecute (DWORD totalcycles)
//
//===========================================================================
void CpuDestroy () {
int loop = 3;
while (loop--) {
if (cpulibrary[loop])
FreeLibrary(cpulibrary[loop]);
cpuexecutefunc[loop] = NULL;
cpugetcodefunc[loop] = NULL;
cpulibrary[loop] = (HINSTANCE)0;
}
void CpuDestroy ()
{
if (g_bCritSectionValid)
{
DeleteCriticalSection(&g_CriticalSection);
@ -1492,103 +1500,47 @@ void CpuDestroy () {
// g_nCyclesExecuted
// g_nCumulativeCycles
//
void CpuCalcCycles(ULONG nCyclesLeft)
void CpuCalcCycles(ULONG nCyclesExecuted)
{
ULONG nCycles;
if((nCyclesLeft & 0x80000000) == 0)
{
nCyclesLeft >>= 8;
nCycles = g_nCyclesSubmitted - (g_nCyclesExecuted + nCyclesLeft); // Always +ve
_ASSERT(!(nCycles & 0x8000000));
}
else
{
nCyclesLeft = ~nCyclesLeft;
nCyclesLeft >>= 8;
nCycles = nCyclesLeft + 1;
nCycles = (g_nCyclesSubmitted + nCycles) - g_nCyclesExecuted;
}
// Calc # of cycles executed since this func was last called
ULONG nCycles = nCyclesExecuted - g_nCyclesExecuted;
g_nCyclesExecuted += nCycles;
g_nCumulativeCycles += nCycles;
if (cpuexecutefunc[cpuemtype])
MB_UpdateCycles((USHORT) nCycles); // OLD: Support external dll emulator
}
//===========================================================================
ULONG CpuGetCyclesThisFrame()
{
CpuCalcCycles(nInternalCyclesLeft); // TODO: simplify the whole cycle system!
CpuCalcCycles(g_uInternalExecutedCycles);
return g_dwCyclesThisFrame + g_nCyclesExecuted;
}
//===========================================================================
DWORD CpuExecute (DWORD cycles)
{
static BOOL laststep = 0;
DWORD result = 0;
g_nCyclesSubmitted = cycles;
DWORD CpuExecute (DWORD uCycles)
{
DWORD uExecutedCycles = 0;
g_nCyclesSubmitted = uCycles;
g_nCyclesExecuted = 0;
// IF WE ARE SINGLE STEPPING, USE THE INTERPRETIVE EMULATOR
if (!cycles)
{
laststep = 1;
if (cpuexecutefunc[1])
result=cpuexecutefunc[1](0);
else
result=InternalCpuExecute(0);
}
if (uCycles == 0) // Do single step
uExecutedCycles = InternalCpuExecute(0);
else // Do multi-opcode emulation
uExecutedCycles = InternalCpuExecute(uCycles);
// OTHERWISE, USE THE CURRENT EMULATOR.
else
{
if (laststep)
{
CpuResetCompilerData();
laststep = 0;
}
// Don't break into 0xFFFF chunks, as at 4Mhz, /cycles/ > 0xFFFF (Spkr code ASSERTs)
// DLLs accept a 23-bit number for cycles.
if (cpuexecutefunc[cpuemtype])
result=cpuexecutefunc[cpuemtype](cycles);
else
result=InternalCpuExecute(cycles);
}
// IF WE ARE USING THE EXTERNAL 6502 64K EMULATOR, MARK PAGES $40-$BF AS
// DIRTY, BECAUSE IT DOES NOT KEEP TRACK OF DIRTY PAGES IN THAT RANGE.
if ((!g_bApple2e) && cpuexecutefunc[1])
{
int page = 0xC0;
while (page-- > 0x40)
*(memdirty+page) = 0xFF;
}
UINT nRemainingCycles = result - g_nCyclesExecuted;
UINT nRemainingCycles = uExecutedCycles - g_nCyclesExecuted;
g_nCumulativeCycles += nRemainingCycles;
if (cpuexecutefunc[cpuemtype])
MB_UpdateCycles((USHORT) nRemainingCycles); // OLD: Support external dll emulator
return result;
return uExecutedCycles;
}
//===========================================================================
void CpuGetCode (WORD address, LPBYTE *codeptr, DWORD *codelength) {
*codeptr = NULL;
*codelength = 0;
if (cpugetcodefunc[0])
cpugetcodefunc[0](address,codeptr,codelength);
}
//===========================================================================
#define MIN_DLL_VERSION 1
void CpuInitialize () {
void CpuInitialize ()
{
CpuDestroy();
regs.a = regs.x = regs.y = regs.ps = 0xFF;
regs.sp = 0x01FF;
@ -1598,72 +1550,12 @@ void CpuInitialize () {
g_bCritSectionValid = true;
CpuIrqReset();
CpuNmiReset();
#ifdef _X86_
// TO DO:
// . FreeLibrary isn't being called if DLLs' version is too low
// . This code is going to get ditched, so ignore this!
if (mem) {
TCHAR filename[MAX_PATH];
_tcscpy(filename,g_sProgramDir);
_tcscat(filename,TEXT("65C02C.DLL"));
cpulibrary[CPU_COMPILING] = LoadLibrary(filename);
_tcscpy(filename,g_sProgramDir);
_tcscat(filename,g_bApple2e ? TEXT("65C02.DLL") : TEXT("6502.DLL"));
cpulibrary[CPU_INTERPRETIVE] = LoadLibrary(filename);
if (!cpulibrary[CPU_INTERPRETIVE]) {
_tcscpy(filename,g_sProgramDir);
_tcscat(filename,TEXT("65C02.DLL"));
cpulibrary[CPU_INTERPRETIVE] = LoadLibrary(filename);
}
_tcscpy(filename,g_sProgramDir);
_tcscat(filename,TEXT("65C02P.DLL"));
cpulibrary[CPU_FASTPAGING] = LoadLibrary(filename);
if (!cpulibrary[CPU_COMPILING])
cpulibrary[CPU_COMPILING] = cpulibrary[CPU_INTERPRETIVE];
int loop = 3;
while (loop--)
if (cpulibrary[loop]) {
cpuversionfunc[loop] = (cpuversiontype)GetProcAddress(cpulibrary[loop],
TEXT("CpuVersion"));
if (cpuversionfunc[loop] && (cpuversionfunc[loop]()>=MIN_DLL_VERSION))
//===========================================================================
void CpuSetupBenchmark ()
{
cpuexecutefunc[loop] = (cpuexecutetype)GetProcAddress(cpulibrary[loop],
TEXT("CpuExecute"));
cpugetcodefunc[loop] = (cpugetcodetype)GetProcAddress(cpulibrary[loop],
TEXT("CpuGetCode"));
cpuinitfunc[loop] = (cpuinittype)GetProcAddress(cpulibrary[loop],
TEXT("CpuInitialize"));
if (cpuinitfunc[loop])
cpuinitfunc[loop](mem,memshadow[0],memwrite[0],
image,lastimage,
&regs,ioread,iowrite,memdirty,
CxReadFunc,CxWriteFunc);
}
}
}
#endif
}
//===========================================================================
void CpuReinitialize () {
if (cpulibrary[cpuemtype] && cpuinitfunc[cpuemtype])
cpuinitfunc[cpuemtype](mem,memshadow[0],memwrite[0],
image,lastimage,
&regs,ioread,iowrite,memdirty,
CxReadFunc,CxWriteFunc);
}
//===========================================================================
void CpuResetCompilerData () {
if (cpulibrary[CPU_COMPILING] &&
(cpulibrary[CPU_COMPILING] != cpulibrary[CPU_INTERPRETIVE]))
ZeroMemory(mem+0x10000,0x20000);
}
//===========================================================================
void CpuSetupBenchmark () {
regs.a = 0;
regs.x = 0;
regs.y = 0;
@ -1674,15 +1566,18 @@ void CpuSetupBenchmark () {
{
int addr = 0x300;
int opcode = 0;
do {
do
{
*(mem+addr++) = benchopcode[opcode];
*(mem+addr++) = benchopcode[opcode];
if (opcode >= SHORTOPCODES)
*(mem+addr++) = 0;
if ((++opcode >= BENCHOPCODES) || ((addr & 0x0F) >= 0x0B)) {
if ((++opcode >= BENCHOPCODES) || ((addr & 0x0F) >= 0x0B))
{
*(mem+addr++) = 0x4C;
*(mem+addr++) = (opcode >= BENCHOPCODES) ? 0x00
: ((addr >> 4)+1) << 4;
*(mem+addr++) = (opcode >= BENCHOPCODES) ? 0x00 : ((addr >> 4)+1) << 4;
*(mem+addr++) = 0x03;
while (addr & 0x0F)
++addr;
@ -1692,11 +1587,7 @@ void CpuSetupBenchmark () {
}
//===========================================================================
BOOL CpuSupportsFastPaging () {
return (cpulibrary[CPU_FASTPAGING] != (HINSTANCE)0);
}
//===========================================================================
void CpuIrqReset()
{
_ASSERT(g_bCritSectionValid);
@ -1722,6 +1613,7 @@ void CpuIrqDeassert(eIRQSRC Device)
}
//===========================================================================
void CpuNmiReset()
{
_ASSERT(g_bCritSectionValid);
@ -1750,6 +1642,7 @@ void CpuNmiDeassert(eIRQSRC Device)
}
//===========================================================================
void CpuReset()
{
// 7 cycles
@ -1761,6 +1654,7 @@ void CpuReset()
}
//===========================================================================
DWORD CpuGetSnapshot(SS_CPU6502* pSS)
{
pSS->A = regs.a;

View File

@ -1,9 +1,5 @@
#pragma once
#define CPU_COMPILING 0
#define CPU_INTERPRETIVE 1
#define CPU_FASTPAGING 2
typedef struct _regsrec {
BYTE a; // accumulator
BYTE x; // index X
@ -14,20 +10,15 @@ typedef struct _regsrec {
BYTE bJammed; // CPU has crashed (NMOS 6502 only)
} regsrec, *regsptr;
extern DWORD cpuemtype;
extern regsrec regs;
extern unsigned __int64 g_nCumulativeCycles;
void CpuDestroy ();
void CpuCalcCycles(ULONG nCyclesLeft);
DWORD CpuExecute (DWORD);
void CpuGetCode (WORD,LPBYTE *,DWORD *);
ULONG CpuGetCyclesThisFrame();
void CpuInitialize ();
void CpuReinitialize ();
void CpuResetCompilerData ();
void CpuSetupBenchmark ();
BOOL CpuSupportsFastPaging ();
void CpuIrqReset();
void CpuIrqAssert(eIRQSRC Device);
void CpuIrqDeassert(eIRQSRC Device);

View File

@ -8147,11 +8147,6 @@ void DebugBegin ()
// This is called every time the emulator is reset.
// And everytime the debugger is entered.
if (cpuemtype == CPU_FASTPAGING)
{
MemSetFastPaging(0);
}
g_nAppMode = MODE_DEBUG;
FrameRefreshStatus(DRAW_TITLE);

View File

@ -581,7 +581,7 @@ static DWORD imagemode[MAXIMAGES];
LPBYTE memshadow[MAXIMAGES][0x100];
LPBYTE memwrite[MAXIMAGES][0x100];
static BOOL fastpaging = 0;
static BOOL fastpaging = 0; // Redundant: only ever set to 0, by MemSetFastPaging(0)
DWORD image = 0;
DWORD lastimage = 0;
static BOOL lastwriteram = 0;
@ -593,7 +593,6 @@ static LPBYTE memmain = NULL;
static DWORD memmode = MF_BANK2 | MF_SLOTCXROM | MF_WRITERAM;
static LPBYTE memrom = NULL;
static BOOL modechanging = 0;
DWORD pages = 0;
MemoryInitPattern_e g_eMemoryInitPattern = MIP_FF_FF_00_00;
@ -672,7 +671,6 @@ void UpdateFastPaging () {
mem = memimage+(image << 16);
UpdatePaging(1,0);
}
CpuReinitialize();
}
//===========================================================================
@ -1049,10 +1047,6 @@ void MemSetFastPaging (BOOL on) {
imagemode[0] = memmode;
if (!fastpaging)
UpdatePaging(1,0);
cpuemtype = fastpaging ? CPU_FASTPAGING : CPU_COMPILING;
CpuReinitialize();
if (cpuemtype == CPU_COMPILING)
CpuResetCompilerData();
}
//===========================================================================
@ -1108,8 +1102,6 @@ BYTE __stdcall MemSetPaging (WORD programcounter, BYTE address, BYTE write, BYTE
else
{
UpdatePaging(0,0);
if (cpuemtype == CPU_COMPILING)
CpuResetCompilerData();
}
}
break;
@ -1136,7 +1128,6 @@ BYTE __stdcall MemSetPaging (WORD programcounter, BYTE address, BYTE write, BYTE
// WRITE TABLES.
if ((lastmemmode != memmode) || modechanging) {
modechanging = 0;
++pages;
// IF FAST PAGING IS ACTIVE, WE KEEP MULTIPLE COMPLETE MEMORY IMAGES
// AND WRITE TABLES, AND SWITCH BETWEEN THEM. THE FAST PAGING VERSION
@ -1148,8 +1139,6 @@ BYTE __stdcall MemSetPaging (WORD programcounter, BYTE address, BYTE write, BYTE
// WRITE TABLE, AND UPDATE THEM EVERY TIME PAGING IS CHANGED.
else {
UpdatePaging(0,0);
if (cpuemtype == CPU_COMPILING)
CpuResetCompilerData();
}
}
@ -1181,7 +1170,6 @@ void MemTrimImages () {
image = realimage;
mem = memimage+(image << 16);
memmode = imagemode[image];
CpuReinitialize();
}
if (++trimnumber >= lastimage)
trimnumber = 0;
@ -1270,7 +1258,6 @@ DWORD MemSetSnapshot(SS_BaseMemory* pSS)
//
pages = 0;
modechanging = 0;
UpdatePaging(1,0); // Initialize=1, UpdateWriteOnly=0

View File

@ -17,7 +17,6 @@ extern DWORD image;
extern DWORD lastimage;
extern LPBYTE mem;
extern LPBYTE memdirty;
extern DWORD pages;
#ifdef RAMWORKS
extern UINT g_uMaxExPages; // user requested ram pages (from cmd line)

View File

@ -986,7 +986,7 @@ void SetLastDrawnImage () {
memcpy(vidlastmem+0x2000,g_pHiresBank0,0x2000);
if (SW_DHIRES && SW_HIRES)
memcpy(vidlastmem,g_pHiresBank1,0x2000);
if (SW_80COL && !SW_HIRES)
else if (SW_80COL) // Don't test for !SW_HIRES, as some 80-col text routines have SW_HIRES set (Bug #8300)
memcpy(vidlastmem,g_pTextBank1,0x400);
int loop;
for (loop = 0; loop < 256; loop++)
@ -2079,10 +2079,7 @@ BYTE __stdcall VideoSetMode (WORD, BYTE address, BYTE write, BYTE, ULONG) {
}
if (oldpage2 != SW_PAGE2) {
static DWORD lastrefresh = 0;
BOOL fastvideoslowcpu = 0;
if ((cpuemtype == CPU_FASTPAGING) && (emulmsec-lastrefresh >= 20))
fastvideoslowcpu = 1;
if ((displaypage2 && !SW_PAGE2) || (!behind) || fastvideoslowcpu) {
if ((displaypage2 && !SW_PAGE2) || (!behind)) {
displaypage2 = (SW_PAGE2 != 0);
if (!redrawfull) {
VideoRefreshScreen();