mirror of
https://github.com/AppleWin/AppleWin.git
synced 2025-01-01 12:31:59 +00:00
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:
parent
9d433c1395
commit
1832b7ccef
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
else // Apple ][
|
||||
{
|
||||
return uExecutedCycles;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
|
||||
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))
|
||||
{
|
||||
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,
|
||||
®s,ioread,iowrite,memdirty,
|
||||
CxReadFunc,CxWriteFunc);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
void CpuReinitialize () {
|
||||
if (cpulibrary[cpuemtype] && cpuinitfunc[cpuemtype])
|
||||
cpuinitfunc[cpuemtype](mem,memshadow[0],memwrite[0],
|
||||
image,lastimage,
|
||||
®s,ioread,iowrite,memdirty,
|
||||
CxReadFunc,CxWriteFunc);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
void CpuResetCompilerData () {
|
||||
if (cpulibrary[CPU_COMPILING] &&
|
||||
(cpulibrary[CPU_COMPILING] != cpulibrary[CPU_INTERPRETIVE]))
|
||||
ZeroMemory(mem+0x10000,0x20000);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
void CpuSetupBenchmark () {
|
||||
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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user