//
-// Virtual 6808 Emulator v2.0
+// Virtual 6808 Emulator v2.1
//
// by James L. Hammons
// (C) 2006 Underground Software
// 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))
// Private function prototypes
static uint16 RdMemW(uint16);
+static uint16 FetchMemW(uint16);
//
// Read a word out of 6808 memory (little endian format)
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
//
static void Op7F(void) // CLR ABS
{
regs.WrMem(EA_ABS, 0);
- regs.pc += 2;
CLR_NVC;
SET_Z(0);
}
static void OpB7(void) // STAA ABS
{
regs.WrMem(EA_ABS, regs.a);
- regs.pc += 2;
}
static void OpD7(void) // STAB ZP
static void OpF7(void) // STAB ABS
{
regs.WrMem(EA_ABS, regs.b);
- regs.pc += 2;
}
/*
static void OpFF(void) // STX ABS
{
uint16 m = EA_ABS;
- regs.pc += 2;
OP_ST_HANDLER(m, regs.x);
}
static void OpBF(void) // STS ABS
{
uint16 m = EA_ABS;
- regs.pc += 2;
OP_ST_HANDLER(m, regs.s);
}
static void OpBD(void) // JSR ABS
{
uint16 m = EA_ABS;
- regs.pc += 2;
PUSH16(regs.pc);
regs.pc = m;
}