From 4b27ddbe754760d8a405a96617f55fcaaa372701 Mon Sep 17 00:00:00 2001 From: edmccard Date: Fri, 23 Mar 2012 02:22:02 -0400 Subject: [PATCH] Changed from version to static if for strict/cumulative --- src/Makefile | 2 +- src/d6502/base.d | 22 ++++++++++--- src/d6502/cmos.d | 10 +++--- src/d6502/cpu.d | 71 +++++++++++++++++++++-------------------- src/d6502/nmosbase.d | 6 ++-- src/d6502/nmosundoc.d | 4 +-- src/system/base.d | 6 ++-- src/system/peripheral.d | 2 ++ 8 files changed, 73 insertions(+), 50 deletions(-) diff --git a/src/Makefile b/src/Makefile index 56c2e91..de06db2 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,4 +1,4 @@ -COMPILE_OPTS = -c -version=CycleAccuracy -op -Jdata -I$(GTKD)/src \ +COMPILE_OPTS = -c -op -Jdata -I$(GTKD)/src \ -I$(GTKD)/srcgl -I$(DERELICT)/import LINK_OPTS = -L-lpthread -L-lGL -L-ldl -L-lX11 \ diff --git a/src/d6502/base.d b/src/d6502/base.d index b8fc220..389f892 100644 --- a/src/d6502/base.d +++ b/src/d6502/base.d @@ -22,6 +22,16 @@ module d6502.base; +enum Strict : bool +{ + no, yes +} + +enum Cumulative : bool +{ + no, yes +} + string hexByte(int decByte) { int highNybble = (decByte & 0xF0) >> 4; @@ -60,8 +70,12 @@ final class StatusRegister } } -class CpuBase +class CpuBase(bool strict, bool cumulative) { + enum _isCpuBase = true; + static if (strict) enum _isStrict = true; + static if (cumulative) enum _isCumulative = true; + static string AbstractOpcodes() { string abstractOpcodes; @@ -127,12 +141,12 @@ class CpuBase { string delegate(ushort addr) memoryName; } - version(CycleAccuracy) void delegate() tick; - version(CumulativeCycles) void delegate(int cycles) ticks; + static if (cumulative) void delegate(int cycles) tick; + else void delegate() tick; abstract void run(bool continuous); abstract void stop(); - version(CycleAccuracy) abstract bool checkFinalCycle(); + static if (!cumulative) abstract bool checkFinalCycle(); abstract void resetLow(); abstract void nmiLow(bool signalLow); abstract void irqLow(bool signalLow); diff --git a/src/d6502/cmos.d b/src/d6502/cmos.d index 3954cd9..be0976c 100644 --- a/src/d6502/cmos.d +++ b/src/d6502/cmos.d @@ -25,8 +25,10 @@ module d6502.cmos; import d6502.base; import d6502.cpu; -class Cmos : Cpu +class Cmos(bool strict, bool cumulative) : Cpu!(strict, cumulative) { + enum _isCMOS = true; + this() { super(); @@ -80,7 +82,7 @@ class Cmos : Cpu final void addrNone() { - version(CumulativeCycles) ticks(totalCycles); + static if (cumulative) tick(totalCycles); } final ubyte testSet(ubyte val) @@ -230,7 +232,7 @@ class Cmos : Cpu ushort vector = readWordOperand(); peek(programCounter); programCounter = readWord(vector, cast(ushort)(vector + 1)); - version(CumulativeCycles) ticks(totalCycles); + static if (cumulative) tick(totalCycles); } /* JMP ($$$$,X) */ @@ -240,7 +242,7 @@ class Cmos : Cpu peek(programCounter); ushort vector = cast(ushort)(baseAddress + xIndex); programCounter = readWord(vector, cast(ushort)(vector + 1)); - version(CumulativeCycles) ticks(totalCycles); + static if (cumulative) tick(totalCycles); } /* BIT #$$ */ diff --git a/src/d6502/cpu.d b/src/d6502/cpu.d index 6b104de..a7de8f7 100644 --- a/src/d6502/cpu.d +++ b/src/d6502/cpu.d @@ -24,7 +24,7 @@ module d6502.cpu; import d6502.base; -class Cpu : CpuBase +class Cpu(bool strict, bool cumulative) : CpuBase!(strict, cumulative) { static string InitOpcodes() { @@ -50,8 +50,9 @@ class Cpu : CpuBase void delegate()[256] opcodes; bool continueExecution; - version(CycleAccuracy) bool finalCycle; - version(CumulativeCycles) int totalCycles; + static if (cumulative) int totalCycles; + else bool finalCycle; + debug(disassemble) { @@ -61,7 +62,7 @@ class Cpu : CpuBase final override void run(bool continuous) { assert ((memoryRead !is null) && (memoryWrite !is null)); - version(CycleAccuracy) assert (tick !is null); + assert (tick !is null); continueExecution = continuous; do @@ -70,8 +71,8 @@ class Cpu : CpuBase opcodePC = programCounter; opcode = read(programCounter++); - version(CycleAccuracy) finalCycle = false; - version(CumulativeCycles) totalCycles = 0; + static if (cumulative) totalCycles = 0; + else finalCycle = false; /+ TODO: call sync delegate +/ @@ -89,7 +90,7 @@ class Cpu : CpuBase continueExecution = false; } - version(CycleAccuracy) + static if (!cumulative) { final override bool checkFinalCycle() { @@ -148,19 +149,19 @@ class Cpu : CpuBase push(statusByte); flag.interrupt = true; programCounter = readWord(vector, cast(ushort)(vector + 1)); - version(CumulativeCycles) ticks(totalCycles); + static if (cumulative) tick(totalCycles); } void doReset() { - version(CycleAccuracy) - { - tick(); tick(); - } - version(CumulativeCycles) + static if (cumulative) { totalCycles += 2; } + else + { + tick(); tick(); + } peek(STACK_BASE + stackPointer); --stackPointer; @@ -174,56 +175,56 @@ class Cpu : CpuBase signalActive = testSignals(); programCounter = readWord(RESET_VECTOR, RESET_VECTOR + 1); - version(CumulativeCycles) ticks(totalCycles); + static if (cumulative) tick(totalCycles); } final ubyte read(ushort addr) { - version(CycleAccuracy) tick(); - version(CumulativeCycles) ++totalCycles; + static if (cumulative) ++totalCycles; + else tick(); return memoryRead(addr); } final void write(ushort addr, ubyte val) { - version(CycleAccuracy) tick(); - version(CumulativeCycles) ++totalCycles; + static if (cumulative) ++totalCycles; + else tick(); memoryWrite(addr, val); } final void peek(ushort addr) { - version(CycleAccuracy) tick(); - version(CumulativeCycles) ++totalCycles; - version(StrictMemoryAccess) memoryRead(addr); + static if (cumulative) ++totalCycles; + else tick(); + static if (strict) memoryRead(addr); } final void poke(ushort addr, ubyte val) { - version(CycleAccuracy) tick(); - version(CumulativeCycles) ++totalCycles; - version(StrictMemoryAccess) memoryWrite(addr, val); + static if (cumulative) ++totalCycles; + else tick(); + static if (strict) memoryWrite(addr, val); } final ubyte readFinal(ushort addr) { - version(CycleAccuracy) + static if (cumulative) tick(++totalCycles); + else { finalCycle = true; tick(); } - version(CumulativeCycles) ticks(++totalCycles); return memoryRead(addr); } final void writeFinal(ushort addr, ubyte val) { - version(CycleAccuracy) + static if (cumulative) tick(++totalCycles); + else { finalCycle = true; tick(); } - version(CumulativeCycles) ticks(++totalCycles); memoryWrite(addr, val); } @@ -467,7 +468,7 @@ class Cpu : CpuBase static string SimpleOpcode(string name, string opcode, string action) { string code = "peek(programCounter);\n"; - version(CumulativeCycles) code ~= "ticks(totalCycles);\n"; + static if (cumulative) code ~= "tick(totalCycles);\n"; code ~= (action == "") ? "" : (action ~ ";"); return "override void opcode" ~ opcode ~ "()\n{\n" ~ code ~ "\n}\n"; } @@ -480,7 +481,7 @@ class Cpu : CpuBase static string RegisterOpcode(string name, string opcode, string action) { string code = "peek(programCounter);\n"; - version(CumulativeCycles) code ~= "ticks(totalCycles);\n"; + static if (cumulative) code ~= "tick(totalCycles);\n"; return "override void opcode" ~ opcode ~ "()\n{\n" ~ code ~ UpdateNZ(action) ~ "}\n"; } @@ -489,7 +490,7 @@ class Cpu : CpuBase { string code = "readByteOperand();\n" ~ "if (" ~ action ~ ") addrRelative(cast(byte)operand1);\n"; - version(CumulativeCycles) code ~= "ticks(totalCycles);\n"; + static if (cumulative) code ~= "tick(totalCycles);\n"; return "override void opcode" ~ opcode ~ "()\n{\n" ~ code ~ "}\n"; } @@ -726,7 +727,7 @@ class Cpu : CpuBase pushWord(programCounter); finalAddress |= ((operand2 = read(programCounter)) << 8); - version(CumulativeCycles) ticks(totalCycles); + static if (cumulative) tick(totalCycles); programCounter = finalAddress; } @@ -736,14 +737,14 @@ class Cpu : CpuBase peek(programCounter); flag.fromByte(pull()); programCounter = pullWord(); - version(CumulativeCycles) ticks(totalCycles); + static if (cumulative) tick(totalCycles); } /* JMP $$$$ */ final override void opcode4C() { programCounter = readWordOperand(); - version(CumulativeCycles) ticks(totalCycles); + static if (cumulative) tick(totalCycles); } /* RTS */ @@ -752,7 +753,7 @@ class Cpu : CpuBase peek(programCounter); programCounter = pullWord(); peek(programCounter); - version(CumulativeCycles) ticks(totalCycles); + static if (cumulative) tick(totalCycles); ++programCounter; } } diff --git a/src/d6502/nmosbase.d b/src/d6502/nmosbase.d index 0634c1c..2a2e2b9 100644 --- a/src/d6502/nmosbase.d +++ b/src/d6502/nmosbase.d @@ -24,8 +24,10 @@ module d6502.nmosbase; import d6502.cpu; -class NmosBase : Cpu +class NmosBase(bool strict, bool cumulative) : Cpu!(strict, cumulative) { + enum _isNMOS = true; + this() { super(); @@ -64,6 +66,6 @@ class NmosBase : Cpu ushort vector = readWordOperand(); programCounter = readWord(vector, (vector & 0xFF00) | cast(ubyte)(vector + 1)); - version(CumulativeCycles) ticks(totalCycles); + static if (cumulative) tick(totalCycles); } } diff --git a/src/d6502/nmosundoc.d b/src/d6502/nmosundoc.d index b726cad..1f5c3df 100644 --- a/src/d6502/nmosundoc.d +++ b/src/d6502/nmosundoc.d @@ -25,7 +25,7 @@ module d6502.nmosundoc; import d6502.base; import d6502.nmosbase; -class NmosUndoc : NmosBase +class NmosUndoc(bool strict, bool cumulative) : NmosBase!(strict, cumulative) { this() { @@ -36,7 +36,7 @@ class NmosUndoc : NmosBase final void addrImplied() { peek(programCounter); - version(CumulativeCycles) ticks(totalCycles); + static if (cumulative) tick(totalCycles); } final void strange(ubyte val) diff --git a/src/system/base.d b/src/system/base.d index ff890f1..b2ecda4 100644 --- a/src/system/base.d +++ b/src/system/base.d @@ -26,6 +26,8 @@ import timer; import memory; import d6502.base; +private alias d6502.base.CpuBase!(Strict.no, Cumulative.no) CpuBase; + import ui.sound; import ui.inputevents; @@ -195,7 +197,7 @@ class II : System CpuBase newCpu() { - return new NmosUndoc(); + return new NmosUndoc!(Strict.no, Cumulative.no)(); } IO newIO() @@ -254,7 +256,7 @@ class IIe : System CpuBase newCpu() { // XXX this is enhanced - return new Cmos(); + return new Cmos!(Strict.no, Cumulative.no)(); } IO newIO() diff --git a/src/system/peripheral.d b/src/system/peripheral.d index 988fb0f..8cd7e34 100644 --- a/src/system/peripheral.d +++ b/src/system/peripheral.d @@ -25,6 +25,8 @@ module system.peripheral; import memory; import d6502.base; +private alias d6502.base.CpuBase!(Strict.no, Cumulative.no) CpuBase; + import peripheral.base; import peripheral.diskii; import peripheral.langcard;