]> Shamusworld >> Repos - stargem2/commitdiff
Fixed EA_ABS macros in v6808
authorShamus Hammons <jlhamm@acm.org>
Tue, 22 Sep 2009 04:34:26 +0000 (04:34 +0000)
committerShamus Hammons <jlhamm@acm.org>
Tue, 22 Sep 2009 04:34:26 +0000 (04:34 +0000)
src/v6808.cpp
stargem2.cfg

index 2022e90c067f8ecaa37e282f1d5e3df899f8426b..b1095eb3604a281b71dc3feb1967ffeebd6a303e 100755 (executable)
@@ -1,5 +1,5 @@
 //
-// Virtual 6808 Emulator v2.0
+// Virtual 6808 Emulator v2.1
 //
 // by James L. Hammons
 // (C) 2006 Underground Software
@@ -14,6 +14,7 @@
 // JLH  11/13/2006  Converted flags to unpacked and separate flags
 // JLH  07/21/2009  Converted clock from 32-bit to 64-bit value, added possible
 //                  "don't branch" optimization
+// JLH  09/21/2009  Fixed EA_ABS macros
 //
 
 // NOTE: V6808_STATE_WAI is not handled in the main loop correctly. !!! FIX !!!
 #define SET_C_CMP16(a,b)               (flagC = ((uint16)(b) < (uint16)(a) ? 1 : 0))
 #define SET_ZNVC_CMP16(a,b,r)  SET_N16(r); SET_Z(r); SET_C_CMP16(a,b); SET_V16(a,b,r)
 
-//Small problem with the EA_ macros: ABS macros don't increment the PC!!! !!! FIX !!! [DONE, kinda]
-//Can't fix for reading...
 #define EA_IMM                         regs.pc++
 #define EA_ZP                          regs.RdMem(regs.pc++)
 #define EA_ZP_X                                (regs.RdMem(regs.pc++) + regs.x)
-#define EA_ABS                         RdMemW(regs.pc)
+#define EA_ABS                         FetchMemW(regs.pc)
 
 #define READ_IMM                       regs.RdMem(EA_IMM)
 #define READ_ZP                                regs.RdMem(EA_ZP)
 #define READ_ZP_X                      regs.RdMem(EA_ZP_X)
-#define READ_ABS                       regs.RdMem(EA_ABS);                     regs.pc += 2
+#define READ_ABS                       regs.RdMem(EA_ABS)
 
-#define READ_IMM16                     RdMemW(regs.pc);                        regs.pc += 2
+#define READ_IMM16                     FetchMemW(regs.pc);
 #define READ_ZP16                      RdMemW(EA_ZP)
 #define READ_ZP_X16                    RdMemW(EA_ZP_X)
-#define READ_ABS16                     RdMemW(EA_ABS);                         regs.pc += 2
+#define READ_ABS16                     RdMemW(EA_ABS)
 
 #define READ_IMM_WB(v)         uint16 addr = EA_IMM;           v = regs.RdMem(addr)
 #define READ_ZP_WB(v)          uint16 addr = EA_ZP;            v = regs.RdMem(addr)
 #define READ_ZP_X_WB(v)                uint16 addr = EA_ZP_X;          v = regs.RdMem(addr)
-#define READ_ABS_WB(v)         uint16 addr = EA_ABS;           v = regs.RdMem(addr); regs.pc += 2
+#define READ_ABS_WB(v)         uint16 addr = EA_ABS;           v = regs.RdMem(addr)
 
 #define WRITE_BACK(d)          regs.WrMem(addr, (d))
 
@@ -123,6 +122,7 @@ static uint8 CPUCycles[256] = {
 // Private function prototypes
 
 static uint16 RdMemW(uint16);
+static uint16 FetchMemW(uint16);
 
 //
 // Read a word out of 6808 memory (little endian format)
@@ -132,6 +132,15 @@ static inline uint16 RdMemW(uint16 address)
        return (uint16)(regs.RdMem(address) << 8) | regs.RdMem(address + 1);
 }
 
+//
+// Fetch a word out of 6808 memory (little endian format). Increments PC
+//
+static inline uint16 FetchMemW(uint16 address)
+{
+       regs.pc += 2;
+       return (uint16)(regs.RdMem(address) << 8) | regs.RdMem(address + 1);
+}
+
 //
 // 6808 OPCODE IMPLEMENTATION
 //
@@ -420,7 +429,6 @@ static void Op6F(void)                                                      // CLR ZP, X
 static void Op7F(void)                                                 // CLR ABS
 {
        regs.WrMem(EA_ABS, 0);
-       regs.pc += 2;
        CLR_NVC;
        SET_Z(0);
 }
@@ -1148,7 +1156,6 @@ static void OpA7(void)                                                    // STAA ZP, X
 static void OpB7(void)                                                 // STAA ABS
 {
        regs.WrMem(EA_ABS, regs.a);
-       regs.pc += 2;
 }
 
 static void OpD7(void)                                                 // STAB ZP
@@ -1164,7 +1171,6 @@ static void OpE7(void)                                                    // STAB ZP, X
 static void OpF7(void)                                                 // STAB ABS
 {
        regs.WrMem(EA_ABS, regs.b);
-       regs.pc += 2;
 }
 
 /*
@@ -1526,7 +1532,6 @@ static void OpEF(void)                                                    // STX ZP, X
 static void OpFF(void)                                                 // STX ABS
 {
        uint16 m = EA_ABS;
-       regs.pc += 2;
        OP_ST_HANDLER(m, regs.x);
 }
 
@@ -1545,7 +1550,6 @@ static void OpAF(void)                                                    // STS ZP, X
 static void OpBF(void)                                                 // STS ABS
 {
        uint16 m = EA_ABS;
-       regs.pc += 2;
        OP_ST_HANDLER(m, regs.s);
 }
 
@@ -1799,7 +1803,6 @@ static void OpAD(void)                                                    // JSR ZP, X
 static void OpBD(void)                                                 // JSR ABS
 {
        uint16 m = EA_ABS;
-       regs.pc += 2;
        PUSH16(regs.pc);
        regs.pc = m;
 }
index 53b7d02291e04ee556dd6ceee621ecd0fbd1fd4f..c5ef48d965e62ffc705ebd87a48a9988f6c23cb0 100755 (executable)
@@ -26,7 +26,7 @@ glFilterType = 0
 
 # Display options: 1 - fullscreen, 0 - windowed
 
-fullscreen = 1
+fullscreen = 0
 
 # Backend renderer (OpenGL dependent): 0 - regular, 1 - "TV" style