From: Shamus Hammons Date: Tue, 22 Sep 2009 04:34:26 +0000 (+0000) Subject: Fixed EA_ABS macros in v6808 X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=stargem2;a=commitdiff_plain;h=0cb2826bf02b98a5527d04cda97e35b18493cf6c Fixed EA_ABS macros in v6808 --- diff --git a/src/v6808.cpp b/src/v6808.cpp index 2022e90..b1095eb 100755 --- a/src/v6808.cpp +++ b/src/v6808.cpp @@ -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 !!! @@ -59,27 +60,25 @@ #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; } diff --git a/stargem2.cfg b/stargem2.cfg index 53b7d02..c5ef48d 100755 --- a/stargem2.cfg +++ b/stargem2.cfg @@ -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