summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan C <ianc@noddybox.co.uk>2023-04-23 08:24:31 +0800
committerIan C <ianc@noddybox.co.uk>2023-04-23 08:24:31 +0800
commit1d1e0acb5b4494f7c1b041e24e5de4f0614a150b (patch)
treef43094ced9e4b3dae4e9912eef606a9c567c635e
parentef18a653053c30237a9aff27eea91d38bd308987 (diff)
Updated Z80 emulation
-rw-r--r--include/z80.h43
-rw-r--r--include/z80_config.h6
-rw-r--r--include/z80_private.h73
-rw-r--r--source/z80.c26
-rw-r--r--source/z80_decode.c873
5 files changed, 607 insertions, 414 deletions
diff --git a/include/z80.h b/include/z80.h
index ef24fd0..c9bd107 100644
--- a/include/z80.h
+++ b/include/z80.h
@@ -56,20 +56,30 @@ typedef signed char Z80Relative;
typedef unsigned short Z80Word;
-/* A Z80 16-bit register. To access the HI/LO component use the indexes
- Z80_HI_WORD and Z80_LO_WORD which will be initialised once Z80Init has been
- called.
+/* A Z80 16-bit register made up of 2 8-bit registers.
*/
+#ifdef Z80_LITTLE_ENDIAN
+typedef struct
+{
+ Z80Byte lo;
+ Z80Byte hi;
+} Z80RegPair;
+#endif
+
+#ifdef Z80_BIG_ENDIAN
+typedef struct
+{
+ Z80Byte hi;
+ Z80Byte lo;
+} Z80RegPair;
+#endif
+
typedef union
{
Z80Word w;
- Z80Byte b[2];
+ Z80RegPair b;
} Z80Reg;
-extern int Z80_HI_WORD;
-extern int Z80_LO_WORD;
-
-
/* The processor
*/
struct Z80Private;
@@ -134,13 +144,23 @@ typedef int (*Z80Callback)(Z80 *cpu, Z80Val data);
*/
typedef enum
{
- eZ80_Instruction, /* data = no cycles since reset */
+ eZ80_Instruction, /* data = cycles as returned by Z80Cycles */
eZ80_EDHook, /* data = byte after ED opcode (only for NOP opcodes) */
eZ80_Halt, /* data = 1 halt raised, 0 halt cleared by int */
eZ80_RETI, /* data = ignored */
eZ80_NO_CALLBACK /* leave at end */
} Z80CallbackReason;
+/* Defines cycle timers
+*/
+typedef enum
+{
+ Z80_TIMER_1,
+ Z80_TIMER_2,
+ Z80_TIMER_3,
+ Z80_NO_TIMERS
+} Z80Timer;
+
/* Flags in the F register
*/
@@ -235,6 +255,11 @@ void Z80Exec(Z80 *cpu);
Z80Val Z80Cycles(Z80 *cpu);
void Z80ResetCycles(Z80 *cpu, Z80Val cycles);
+/* Timers that count in cycle counts
+*/
+Z80Val Z80GetTimer(Z80 *cpu, Z80Timer timer);
+void Z80SetTimer(Z80 *cpu, Z80Timer timer, Z80Val cycles);
+
/* Set address to label mappings for the disassembler
*/
diff --git a/include/z80_config.h b/include/z80_config.h
index 8d9ee79..4168dc3 100644
--- a/include/z80_config.h
+++ b/include/z80_config.h
@@ -37,6 +37,12 @@
#define ENABLE_DISASSEM
+/* Pick one of these as appropriate for your real CPU
+#define Z80_BIG_ENDIAN
+*/
+#define Z80_LITTLE_ENDIAN
+
+
/* Define this to enable the array-based memory model. In this mode
an externally visible Z80Byte array called Z80_MEMORY must be
defined. The macros RAMBOT and RAMTOP define the writable area of
diff --git a/include/z80_private.h b/include/z80_private.h
index 10cf97e..e3d721a 100644
--- a/include/z80_private.h
+++ b/include/z80_private.h
@@ -19,14 +19,14 @@
-------------------------------------------------------------------------
- $Id: z80_private.h 13 2006-10-12 16:38:57Z ianc $
+ $Id$
Private macros for Z80
*/
#ifndef Z80_PRIVATE_H
-#define Z80_PRIVATE_H "$Id: z80_private.h 13 2006-10-12 16:38:57Z ianc $"
+#define Z80_PRIVATE_H "$Id$"
#include "z80_config.h"
@@ -48,6 +48,8 @@ struct Z80Private
{
Z80Val cycle;
+ Z80Val timer[Z80_NO_TIMERS];
+
int halt;
Z80Byte shift;
@@ -69,6 +71,8 @@ struct Z80Private
Z80Callback callback[eZ80_NO_CALLBACK][MAX_PER_CALLBACK];
int last_cb;
+
+ Z80Reg memptr;
};
#define PRIV cpu->priv
@@ -114,18 +118,21 @@ extern Z80Byte Z80_MEMORY[];
#define B3_Z80 0x08
#define B5_Z80 0x20
+#define HIDDEN_Z80 (B3_Z80|B5_Z80)
#define SET(v,b) (v)|=b
#define CLR(v,b) (v)&=~(b)
-#define SETFLAG(f) SET(cpu->AF.b[LO],f)
-#define CLRFLAG(f) CLR(cpu->AF.b[LO],f)
+#define SETFLAG(f) SET(cpu->AF.b.lo,f)
+#define CLRFLAG(f) CLR(cpu->AF.b.lo,f)
#ifdef ENABLE_ARRAY_MEMORY
#define PEEK(addr) Z80_MEMORY[addr]
+/* This can't be a macro as the macro is used as PEEKW(FETCH_WORD)
+*/
static inline Z80Word PEEKW(Z80Word addr)
{
return (PEEK(addr) | (Z80Word)PEEK(addr+1)<<8);
@@ -154,6 +161,9 @@ static inline Z80Word PEEKW(Z80Word addr)
#else
+Z80Word FPEEKW(Z80 *cpu, Z80Word addr);
+void FPOKEW(Z80 *cpu, Z80Word addr, Z80Word val);
+
#define PEEK(addr) (PRIV->mread(cpu,addr))
#define PEEKW(addr) FPEEKW(cpu,addr)
@@ -166,19 +176,37 @@ static inline Z80Word PEEKW(Z80Word addr)
#endif
-#define IS_C (cpu->AF.b[LO]&C_Z80)
-#define IS_N (cpu->AF.b[LO]&N_Z80)
-#define IS_P (cpu->AF.b[LO]&P_Z80)
-#define IS_H (cpu->AF.b[LO]&H_Z80)
-#define IS_Z (cpu->AF.b[LO]&Z_Z80)
-#define IS_S (cpu->AF.b[LO]&S_Z80)
+#define IS_C (cpu->AF.b.lo&C_Z80)
+#define IS_N (cpu->AF.b.lo&N_Z80)
+#define IS_P (cpu->AF.b.lo&P_Z80)
+#define IS_H (cpu->AF.b.lo&H_Z80)
+#define IS_Z (cpu->AF.b.lo&Z_Z80)
+#define IS_S (cpu->AF.b.lo&S_Z80)
#define CARRY IS_C
#define IS_IX_IY (PRIV->shift==0xdd || PRIV->shift==0xfd)
-#define OFFSET(off) off=(IS_IX_IY ? (Z80Relative)FETCH_BYTE:0)
-#define TSTATE(n) PRIV->cycle+=n
+#define OFFSET(base,off) do \
+ { \
+ if (IS_IX_IY) \
+ { \
+ off=(Z80Relative)FETCH_BYTE; \
+ PRIV->memptr.w=base+off; \
+ } \
+ else \
+ { \
+ off=0; \
+ } \
+ } while(0)
+
+#define TSTATE(n) do \
+ { \
+ PRIV->cycle+=n; \
+ PRIV->timer[Z80_TIMER_1]+=n; \
+ PRIV->timer[Z80_TIMER_2]+=n; \
+ PRIV->timer[Z80_TIMER_3]+=n; \
+ } while(0)
#define ADD_R(v) cpu->R=((cpu->R&0x80)|((cpu->R+(v))&0x7f))
#define INC_R ADD_R(1)
@@ -211,19 +239,32 @@ static inline Z80Word PEEKW(Z80Word addr)
cpu->SP+=2; \
} while(0)
-#define SETHIDDEN(res) cpu->AF.b[LO]=(cpu->AF.b[LO]&~(B3_Z80|B5_Z80))|\
+#define SETHIDDEN(res) cpu->AF.b.lo=(cpu->AF.b.lo&~(B3_Z80|B5_Z80))|\
((res)&(B3_Z80|B5_Z80))
#define CALL do \
{ \
PUSH(cpu->PC+2); \
cpu->PC=PEEKW(cpu->PC); \
+ PRIV->memptr.w=cpu->PC; \
} while(0)
#define NOCALL cpu->PC+=2
-#define JP cpu->PC=PEEKW(cpu->PC)
-#define NOJP cpu->PC+=2
-#define JR cpu->PC+=(Z80Relative)PEEK(cpu->PC)+1
+
+#define JP do \
+ { \
+ cpu->PC=PEEKW(cpu->PC); \
+ PRIV->memptr.w=cpu->PC; \
+ } while(0)
+
+#define NOJP NOCALL
+
+#define JR do \
+ { \
+ cpu->PC+=(Z80Relative)PEEK(cpu->PC)+1; \
+ PRIV->memptr.w=cpu->PC; \
+ } while(0)
+
#define NOJR cpu->PC++
#define OUT(P,V) do \
diff --git a/source/z80.c b/source/z80.c
index e5f6c92..d18640a 100644
--- a/source/z80.c
+++ b/source/z80.c
@@ -50,6 +50,8 @@ static void InitTables()
static void Z80_CheckInterrupt(Z80 *cpu)
{
+ Z80Word vector;
+
/* Check interrupts
*/
if (PRIV->raise)
@@ -68,6 +70,7 @@ static void Z80_CheckInterrupt(Z80 *cpu)
PRIV->nmi=FALSE;
PUSH(cpu->PC);
cpu->PC=0x66;
+ PRIV->memptr.w=cpu->PC;
}
else if (cpu->IFF1)
{
@@ -95,11 +98,14 @@ static void Z80_CheckInterrupt(Z80 *cpu)
case 1:
PUSH(cpu->PC);
cpu->PC=0x38;
+ PRIV->memptr.w=cpu->PC;
break;
case 2:
PUSH(cpu->PC);
- cpu->PC=(Z80Word)cpu->I*256+PRIV->devbyte;
+ vector=(Z80Word)cpu->I*256+PRIV->devbyte;
+ cpu->PC=PEEKW(vector);
+ PRIV->memptr.w=cpu->PC;
break;
}
}
@@ -170,6 +176,10 @@ Z80 *Z80Init(Z80ReadMemory read_memory,
void Z80Reset(Z80 *cpu)
{
PRIV->cycle=0;
+ PRIV->timer[Z80_TIMER_1]=0;
+ PRIV->timer[Z80_TIMER_2]=0;
+ PRIV->timer[Z80_TIMER_3]=0;
+
cpu->PC=0;
cpu->AF.w=0xffff;
@@ -194,6 +204,8 @@ void Z80Reset(Z80 *cpu)
PRIV->raise=FALSE;
PRIV->nmi=FALSE;
+
+ PRIV->memptr.w = 0x0000;
}
@@ -209,6 +221,18 @@ void Z80ResetCycles(Z80 *cpu, Z80Val cycles)
}
+Z80Val Z80GetTimer(Z80 *cpu, Z80Timer timer)
+{
+ return PRIV->timer[timer];
+}
+
+
+void Z80SetTimer(Z80 *cpu, Z80Timer timer, Z80Val cycles)
+{
+ PRIV->timer[timer] = cycles;
+}
+
+
int Z80LodgeCallback(Z80 *cpu, Z80CallbackReason reason, Z80Callback callback)
{
int f;
diff --git a/source/z80_decode.c b/source/z80_decode.c
index 614f384..15d0179 100644
--- a/source/z80_decode.c
+++ b/source/z80_decode.c
@@ -19,7 +19,7 @@
-------------------------------------------------------------------------
- $Id: z80_decode.c 4 2006-10-04 23:05:43Z ianc $
+ $Id$
*/
#include <stdlib.h>
@@ -36,13 +36,6 @@ static Z80Byte Ptable[512];
static Z80Byte Stable[512];
static Z80Byte Ztable[512];
-
-int Z80_HI_WORD;
-int Z80_LO_WORD;
-
-#define HI Z80_HI_WORD
-#define LO Z80_LO_WORD
-
/* ---------------------------------------- MISC FUNCTIONS
*/
void Z80_InitialiseInternals(void)
@@ -54,17 +47,7 @@ void Z80_InitialiseInternals(void)
*/
r.w=0x1234;
- if (r.b[0] == 0x12)
- {
- HI=0;
- LO=1;
- }
- else if (r.b[1] == 0x12)
- {
- HI=1;
- LO=0;
- }
- else
+ if (r.b.hi != 0x12 || r.b.lo != 0x34)
{
exit(1);
}
@@ -119,13 +102,13 @@ void Z80_InitialiseInternals(void)
}
#ifndef ENABLE_ARRAY_MEMORY
-static Z80Word FPEEKW(Z80 *cpu, Z80Word addr)
+Z80Word FPEEKW(Z80 *cpu, Z80Word addr)
{
return (PEEK(addr) | (Z80Word)PEEK(addr+1)<<8);
}
-static void FPOKEW(Z80 *cpu, Z80Word addr, Z80Word val)
+void FPOKEW(Z80 *cpu, Z80Word addr, Z80Word val)
{
PRIV->mwrite(cpu,addr,val);
PRIV->mwrite(cpu,addr+1,val>>8);
@@ -150,12 +133,12 @@ do { \
do { \
Z80Byte VAL=ONCE; \
unsigned w; \
- w=cpu->AF.b[HI]+(unsigned)VAL; \
- cpu->AF.b[LO]=SZtable[w]; \
- if ((cpu->AF.b[HI]^w^VAL)&H_Z80) cpu->AF.b[LO]|=H_Z80; \
- if ((VAL^cpu->AF.b[HI]^0x80)&(VAL^w)&0x80) cpu->AF.b[LO]|=P_Z80; \
+ w=cpu->AF.b.hi+(unsigned)VAL; \
+ cpu->AF.b.lo=SZtable[w]; \
+ if ((cpu->AF.b.hi^w^VAL)&H_Z80) cpu->AF.b.lo|=H_Z80; \
+ if ((VAL^cpu->AF.b.hi^0x80)&(VAL^w)&0x80) cpu->AF.b.lo|=P_Z80; \
SETHIDDEN(w); \
- cpu->AF.b[HI]=w; \
+ cpu->AF.b.hi=w; \
} while(0)
@@ -163,12 +146,12 @@ do { \
do { \
Z80Byte VAL=ONCE; \
unsigned w; \
- w=(cpu->AF.b[HI]+(unsigned)VAL+CARRY)&0x1ff; \
- cpu->AF.b[LO]=SZtable[w]; \
- if ((cpu->AF.b[HI]^w^VAL)&H_Z80) cpu->AF.b[LO]|=H_Z80; \
- if ((VAL^cpu->AF.b[HI]^0x80)&(VAL^w)&0x80) cpu->AF.b[LO]|=P_Z80; \
+ w=(cpu->AF.b.hi+(unsigned)VAL+CARRY)&0x1ff; \
+ cpu->AF.b.lo=SZtable[w]; \
+ if ((cpu->AF.b.hi^w^VAL)&H_Z80) cpu->AF.b.lo|=H_Z80; \
+ if ((VAL^cpu->AF.b.hi^0x80)&(VAL^w)&0x80) cpu->AF.b.lo|=P_Z80; \
SETHIDDEN(w); \
- cpu->AF.b[HI]=w; \
+ cpu->AF.b.hi=w; \
} while(0)
@@ -176,12 +159,12 @@ do { \
do { \
Z80Byte VAL=ONCE; \
unsigned w; \
- w=(cpu->AF.b[HI]-(unsigned)VAL)&0x1ff; \
- cpu->AF.b[LO]=SZtable[w]|N_Z80; \
- if ((cpu->AF.b[HI]^w^VAL)&H_Z80) cpu->AF.b[LO]|=H_Z80; \
- if ((VAL^cpu->AF.b[HI])&(cpu->AF.b[HI]^w)&0x80) cpu->AF.b[LO]|=P_Z80; \
+ w=(cpu->AF.b.hi-(unsigned)VAL)&0x1ff; \
+ cpu->AF.b.lo=SZtable[w]|N_Z80; \
+ if ((cpu->AF.b.hi^w^VAL)&H_Z80) cpu->AF.b.lo|=H_Z80; \
+ if ((VAL^cpu->AF.b.hi)&(cpu->AF.b.hi^w)&0x80) cpu->AF.b.lo|=P_Z80; \
SETHIDDEN(w); \
- cpu->AF.b[HI]=w; \
+ cpu->AF.b.hi=w; \
} while(0)
@@ -189,10 +172,10 @@ do { \
do { \
Z80Byte VAL=ONCE; \
unsigned w; \
- w=(cpu->AF.b[HI]-(unsigned)VAL)&0x1ff; \
- cpu->AF.b[LO]=SZtable[w]|N_Z80; \
- if ((cpu->AF.b[HI]^w^VAL)&H_Z80) cpu->AF.b[LO]|=H_Z80; \
- if ((VAL^cpu->AF.b[HI])&(cpu->AF.b[HI]^w)&0x80) cpu->AF.b[LO]|=P_Z80; \
+ w=(cpu->AF.b.hi-(unsigned)VAL)&0x1ff; \
+ cpu->AF.b.lo=SZtable[w]|N_Z80; \
+ if ((cpu->AF.b.hi^w^VAL)&H_Z80) cpu->AF.b.lo|=H_Z80; \
+ if ((VAL^cpu->AF.b.hi)&(cpu->AF.b.hi^w)&0x80) cpu->AF.b.lo|=P_Z80; \
SETHIDDEN(VAL); \
} while(0)
@@ -201,12 +184,12 @@ do { \
do { \
Z80Byte VAL=ONCE; \
unsigned w; \
- w=(cpu->AF.b[HI]-(unsigned)VAL-CARRY)&0x1ff; \
- cpu->AF.b[LO]=SZtable[w]|N_Z80; \
- if ((cpu->AF.b[HI]^w^VAL)&H_Z80) cpu->AF.b[LO]|=H_Z80; \
- if ((VAL^cpu->AF.b[HI])&(cpu->AF.b[HI]^w)&0x80) cpu->AF.b[LO]|=P_Z80; \
+ w=(cpu->AF.b.hi-(unsigned)VAL-CARRY)&0x1ff; \
+ cpu->AF.b.lo=SZtable[w]|N_Z80; \
+ if ((cpu->AF.b.hi^w^VAL)&H_Z80) cpu->AF.b.lo|=H_Z80; \
+ if ((VAL^cpu->AF.b.hi)&(cpu->AF.b.hi^w)&0x80) cpu->AF.b.lo|=P_Z80; \
SETHIDDEN(w); \
- cpu->AF.b[HI]=w; \
+ cpu->AF.b.hi=w; \
} while(0)
@@ -214,10 +197,11 @@ do { \
do { \
Z80Word VAL=ONCE; \
Z80Val w; \
+ cpu->priv->memptr.w=REG+1; \
w=(REG)+(Z80Val)VAL; \
- cpu->AF.b[LO]&=(S_Z80|Z_Z80|V_Z80); \
- if (w>0xffff) cpu->AF.b[LO]|=C_Z80; \
- if (((REG)^w^VAL)&0x1000) cpu->AF.b[LO]|=H_Z80; \
+ cpu->AF.b.lo&=(S_Z80|Z_Z80|V_Z80); \
+ if (w>0xffff) cpu->AF.b.lo|=C_Z80; \
+ if (((REG)^w^VAL)&0x1000) cpu->AF.b.lo|=H_Z80; \
SETHIDDEN(w>>8); \
(REG)=w; \
} while(0)
@@ -227,13 +211,14 @@ do { \
do { \
Z80Word VAL=ONCE; \
Z80Val w; \
+ cpu->priv->memptr.w=REG+1; \
w=(REG)+(Z80Val)VAL+CARRY; \
- cpu->AF.b[LO]=0; \
- if ((w&0xffff)==0) cpu->AF.b[LO]=Z_Z80; \
- if (w&0x8000) cpu->AF.b[LO]|=S_Z80; \
- if (w>0xffff) cpu->AF.b[LO]|=C_Z80; \
- if ((VAL^(REG)^0x8000)&((REG)^w)&0x8000) cpu->AF.b[LO]|=P_Z80; \
- if (((REG)^w^VAL)&0x1000) cpu->AF.b[LO]|=H_Z80; \
+ cpu->AF.b.lo=0; \
+ if ((w&0xffff)==0) cpu->AF.b.lo=Z_Z80; \
+ if (w&0x8000) cpu->AF.b.lo|=S_Z80; \
+ if (w>0xffff) cpu->AF.b.lo|=C_Z80; \
+ if ((VAL^(REG)^0x8000)&((REG)^w)&0x8000) cpu->AF.b.lo|=P_Z80; \
+ if (((REG)^w^VAL)&0x1000) cpu->AF.b.lo|=H_Z80; \
SETHIDDEN(w>>8); \
(REG)=w; \
} while(0)
@@ -243,13 +228,14 @@ do { \
do { \
Z80Word VAL=ONCE; \
Z80Val w; \
+ cpu->priv->memptr.w=REG+1; \
w=(REG)-(Z80Val)VAL-CARRY; \
- cpu->AF.b[LO]=N_Z80; \
- if (w&0x8000) cpu->AF.b[LO]|=S_Z80; \
- if ((w&0xffff)==0) cpu->AF.b[LO]|=Z_Z80; \
- if (w>0xffff) cpu->AF.b[LO]|=C_Z80; \
- if ((VAL^(REG))&((REG)^w)&0x8000) cpu->AF.b[LO]|=P_Z80; \
- if (((REG)^w^VAL)&0x1000) cpu->AF.b[LO]|=H_Z80; \
+ cpu->AF.b.lo=N_Z80; \
+ if (w&0x8000) cpu->AF.b.lo|=S_Z80; \
+ if ((w&0xffff)==0) cpu->AF.b.lo|=Z_Z80; \
+ if (w>0xffff) cpu->AF.b.lo|=C_Z80; \
+ if ((VAL^(REG))&((REG)^w)&0x8000) cpu->AF.b.lo|=P_Z80; \
+ if (((REG)^w^VAL)&0x1000) cpu->AF.b.lo|=H_Z80; \
SETHIDDEN(w>>8); \
(REG)=w; \
} while(0)
@@ -258,19 +244,19 @@ do { \
#define INC8(REG) \
do { \
(REG)++; \
- cpu->AF.b[LO]=CARRY|SZtable[(REG)]; \
- if ((REG)==0x80) cpu->AF.b[LO]|=P_Z80; \
- if (((REG)&0x0f)==0) cpu->AF.b[LO]|=H_Z80; \
+ cpu->AF.b.lo=CARRY|SZtable[(REG)]|((REG)&(B3_Z80|B5_Z80)); \
+ if ((REG)==0x80) cpu->AF.b.lo|=P_Z80; \
+ if (((REG)&0x0f)==0) cpu->AF.b.lo|=H_Z80; \
} while(0)
#define DEC8(REG) \
do { \
(REG)--; \
- cpu->AF.b[LO]=N_Z80|CARRY; \
- if ((REG)==0x7f) cpu->AF.b[LO]|=P_Z80; \
- if (((REG)&0x0f)==0x0f) cpu->AF.b[LO]|=H_Z80; \
- cpu->AF.b[LO]|=SZtable[(REG)]; \
+ cpu->AF.b.lo=N_Z80|CARRY|((REG)&(B3_Z80|B5_Z80)); \
+ if ((REG)==0x7f) cpu->AF.b.lo|=P_Z80; \
+ if (((REG)&0x0f)==0x0f) cpu->AF.b.lo|=H_Z80; \
+ cpu->AF.b.lo|=SZtable[(REG)]; \
} while(0)
@@ -285,6 +271,7 @@ do { \
#define OP_ON_MEM_WITH_ARG(OP,addr,arg) \
do { \
Z80Byte memop=PEEK(addr); \
+ PRIV->memptr.w=addr; \
OP(memop,arg); \
POKE(addr,memop); \
} while(0)
@@ -312,9 +299,9 @@ do { \
*/
#define RRCA \
do { \
- cpu->AF.b[LO]=(cpu->AF.b[LO]&(S_Z80|Z_Z80|P_Z80))|(cpu->AF.b[HI]&C_Z80); \
- cpu->AF.b[HI]=(cpu->AF.b[HI]>>1)|(cpu->AF.b[HI]<<7); \
- SETHIDDEN(cpu->AF.b[HI]); \
+ cpu->AF.b.lo=(cpu->AF.b.lo&(S_Z80|Z_Z80|P_Z80))|(cpu->AF.b.hi&C_Z80); \
+ cpu->AF.b.hi=(cpu->AF.b.hi>>1)|(cpu->AF.b.hi<<7); \
+ SETHIDDEN(cpu->AF.b.hi); \
} while(0)
@@ -322,9 +309,9 @@ do { \
do { \
Z80Byte c; \
c=CARRY; \
- cpu->AF.b[LO]=(cpu->AF.b[LO]&(S_Z80|Z_Z80|P_Z80))|(cpu->AF.b[HI]&C_Z80); \
- cpu->AF.b[HI]=(cpu->AF.b[HI]>>1)|(c<<7); \
- SETHIDDEN(cpu->AF.b[HI]); \
+ cpu->AF.b.lo=(cpu->AF.b.lo&(S_Z80|Z_Z80|P_Z80))|(cpu->AF.b.hi&C_Z80); \
+ cpu->AF.b.hi=(cpu->AF.b.hi>>1)|(c<<7); \
+ SETHIDDEN(cpu->AF.b.hi); \
} while(0)
@@ -333,7 +320,7 @@ do { \
Z80Byte c; \
c=(REG)&C_Z80; \
(REG)=((REG)>>1)|((REG)<<7); \
- cpu->AF.b[LO]=PSZtable[(REG)]|c; \
+ cpu->AF.b.lo=PSZtable[(REG)]|c; \
SETHIDDEN(REG); \
} while(0)
@@ -343,16 +330,16 @@ do { \
Z80Byte c; \
c=(REG)&C_Z80; \
(REG)=((REG)>>1)|(CARRY<<7); \
- cpu->AF.b[LO]=PSZtable[(REG)]|c; \
+ cpu->AF.b.lo=PSZtable[(REG)]|c; \
SETHIDDEN(REG); \
} while(0)
#define RLCA \
do { \
- cpu->AF.b[LO]=(cpu->AF.b[LO]&(S_Z80|Z_Z80|P_Z80))|(cpu->AF.b[HI]>>7); \
- cpu->AF.b[HI]=(cpu->AF.b[HI]<<1)|(cpu->AF.b[HI]>>7); \
- SETHIDDEN(cpu->AF.b[HI]); \
+ cpu->AF.b.lo=(cpu->AF.b.lo&(S_Z80|Z_Z80|P_Z80))|(cpu->AF.b.hi>>7); \
+ cpu->AF.b.hi=(cpu->AF.b.hi<<1)|(cpu->AF.b.hi>>7); \
+ SETHIDDEN(cpu->AF.b.hi); \
} while(0)
@@ -360,9 +347,9 @@ do { \
do { \
Z80Byte c; \
c=CARRY; \
- cpu->AF.b[LO]=(cpu->AF.b[LO]&(S_Z80|Z_Z80|P_Z80))|(cpu->AF.b[HI]>>7); \
- cpu->AF.b[HI]=(cpu->AF.b[HI]<<1)|c; \
- SETHIDDEN(cpu->AF.b[HI]); \
+ cpu->AF.b.lo=(cpu->AF.b.lo&(S_Z80|Z_Z80|P_Z80))|(cpu->AF.b.hi>>7); \
+ cpu->AF.b.hi=(cpu->AF.b.hi<<1)|c; \
+ SETHIDDEN(cpu->AF.b.hi); \
} while(0)
@@ -371,7 +358,7 @@ do { \
Z80Byte c; \
c=(REG)>>7; \
(REG)=((REG)<<1)|c; \
- cpu->AF.b[LO]=PSZtable[(REG)]|c; \
+ cpu->AF.b.lo=PSZtable[(REG)]|c; \
SETHIDDEN(REG); \
} while(0)
@@ -381,7 +368,7 @@ do { \
Z80Byte c; \
c=(REG)>>7; \
(REG)=((REG)<<1)|CARRY; \
- cpu->AF.b[LO]=PSZtable[(REG)]|c; \
+ cpu->AF.b.lo=PSZtable[(REG)]|c; \
SETHIDDEN(REG); \
} while(0)
@@ -391,7 +378,7 @@ do { \
Z80Byte c; \
c=(REG)&C_Z80; \
(REG)>>=1; \
- cpu->AF.b[LO]=PSZtable[(REG)]|c; \
+ cpu->AF.b.lo=PSZtable[(REG)]|c; \
SETHIDDEN(REG); \
} while(0)
@@ -401,7 +388,7 @@ do { \
Z80Byte c; \
c=(REG)&C_Z80; \
(REG)=((REG)>>1)|((REG)&0x80); \
- cpu->AF.b[LO]=PSZtable[(REG)]|c; \
+ cpu->AF.b.lo=PSZtable[(REG)]|c; \
SETHIDDEN(REG); \
} while(0)
@@ -411,7 +398,7 @@ do { \
Z80Byte c; \
c=(REG)>>7; \
(REG)=((REG)<<1)|1; \
- cpu->AF.b[LO]=PSZtable[(REG)]|c; \
+ cpu->AF.b.lo=PSZtable[(REG)]|c; \
SETHIDDEN(REG); \
} while(0)
@@ -421,7 +408,7 @@ do { \
Z80Byte c; \
c=(REG)>>7; \
(REG)=(REG)<<1; \
- cpu->AF.b[LO]=PSZtable[(REG)]|c; \
+ cpu->AF.b.lo=PSZtable[(REG)]|c; \
SETHIDDEN(REG); \
} while(0)
@@ -430,42 +417,58 @@ do { \
*/
#define AND(VAL) \
do { \
- cpu->AF.b[HI]&=VAL; \
- cpu->AF.b[LO]=PSZtable[cpu->AF.b[HI]]|H_Z80; \
- SETHIDDEN(cpu->AF.b[HI]); \
+ cpu->AF.b.hi&=VAL; \
+ cpu->AF.b.lo=PSZtable[cpu->AF.b.hi]|H_Z80; \
+ SETHIDDEN(cpu->AF.b.hi); \
} while(0)
#define OR(VAL) \
do { \
- cpu->AF.b[HI]|=VAL; \
- cpu->AF.b[LO]=PSZtable[cpu->AF.b[HI]]; \
- SETHIDDEN(cpu->AF.b[HI]); \
+ cpu->AF.b.hi|=VAL; \
+ cpu->AF.b.lo=PSZtable[cpu->AF.b.hi]; \
+ SETHIDDEN(cpu->AF.b.hi); \
} while(0)
#define XOR(VAL) \
do { \
- cpu->AF.b[HI]^=VAL; \
- cpu->AF.b[LO]=PSZtable[cpu->AF.b[HI]]; \
- SETHIDDEN(cpu->AF.b[HI]); \
+ cpu->AF.b.hi^=VAL; \
+ cpu->AF.b.lo=PSZtable[cpu->AF.b.hi]; \
+ SETHIDDEN(cpu->AF.b.hi); \
} while(0)
#define BIT(REG,B) \
do { \
- cpu->AF.b[LO]=CARRY|H_Z80; \
- if ((REG)&(1<<B)) \
+ Z80Byte b=(REG)&(1<<B); \
+ cpu->AF.b.lo&=C_Z80; \
+ cpu->AF.b.lo|=H_Z80; \
+ if (b) \
+ { \
+ cpu->AF.b.lo|=S_Z80&b; \
+ } \
+ else \
+ { \
+ cpu->AF.b.lo|=Z_Z80|P_Z80; \
+ } \
+ SETHIDDEN(REG); \
+} while(0)
+
+#define BIT_MEMPTR(REG,B) \
+do { \
+ Z80Byte b=(REG)&(1<<B); \
+ cpu->AF.b.lo&=C_Z80; \
+ cpu->AF.b.lo|=H_Z80; \
+ if (b) \
{ \
- if (B==7 && (REG&S_Z80)) cpu->AF.b[LO]|=S_Z80; \
- if (B==5 && (REG&B5_Z80)) cpu->AF.b[LO]|=B5_Z80; \
- if (B==3 && (REG&B3_Z80)) cpu->AF.b[LO]|=B3_Z80; \
+ cpu->AF.b.lo|=S_Z80&b; \
} \
else \
{ \
- cpu->AF.b[LO]|=Z_Z80; \
- cpu->AF.b[LO]|=P_Z80; \
+ cpu->AF.b.lo|=Z_Z80|P_Z80; \
} \
+ SETHIDDEN(PRIV->memptr.b.hi); \
} while(0)
#define BIT_SET(REG,B) (REG)|=(1<<B)
@@ -524,6 +527,7 @@ do { \
{ \
TSTATE(11); \
POP(cpu->PC); \
+ PRIV->memptr.w=cpu->PC; \
} \
else \
{ \
@@ -535,13 +539,14 @@ do { \
#define RST(ADDR) \
TSTATE(11); \
PUSH(cpu->PC); \
- cpu->PC=ADDR
+ cpu->PC=ADDR; \
+ PRIV->memptr.w=ADDR
/* ---------------------------------------- BLOCK OPERATIONS
*/
#define LDI \
do { \
- Z80Byte b; \
+ Z80Byte b,a1; \
\
b=PEEK(cpu->HL.w); \
POKE(cpu->DE.w,b); \
@@ -557,12 +562,14 @@ do { \
else \
CLRFLAG(P_Z80); \
\
- SETHIDDEN(cpu->AF.b[HI]+b); \
+ a1=cpu->AF.b.hi+b; \
+ if (a1&2) SETFLAG(B5_Z80); else CLRFLAG(B5_Z80); \
+ if (a1&B3_Z80) SETFLAG(B3_Z80); else CLRFLAG(B3_Z80); \
} while(0)
#define LDD \
do { \
- Z80Byte b; \
+ Z80Byte b,a1; \
\
b=PEEK(cpu->HL.w); \
POKE(cpu->DE.w,b); \
@@ -578,17 +585,23 @@ do { \
else \
CLRFLAG(P_Z80); \
\
- SETHIDDEN(cpu->AF.b[HI]+b); \
+ a1=cpu->AF.b.hi+b; \
+ if (a1&2) SETFLAG(B5_Z80); else CLRFLAG(B5_Z80); \
+ if (a1&B3_Z80) SETFLAG(B3_Z80); else CLRFLAG(B3_Z80); \
} while(0)
#define CPI \
do { \
- Z80Byte c,b; \
+ Z80Byte c,b,a1; \
\
c=CARRY; \
b=PEEK(cpu->HL.w); \
\
CMP8(b); \
+ a1=cpu->AF.b.hi-b-(IS_H?1:0); \
+ \
+ if (a1&2) SETFLAG(B5_Z80); else CLRFLAG(B5_Z80); \
+ if (a1&B3_Z80) SETFLAG(B3_Z80); else CLRFLAG(B3_Z80); \
\
if (c) \
SETFLAG(C_Z80); \
@@ -606,13 +619,17 @@ do { \
#define CPD \
do { \
- Z80Byte c,b; \
+ Z80Byte c,b,a1; \
\
c=CARRY; \
b=PEEK(cpu->HL.w); \
\
CMP8(b); \
+ a1=cpu->AF.b.hi-b-(IS_H?1:0); \
\
+ if (a1&2) SETFLAG(B5_Z80); else CLRFLAG(B5_Z80); \
+ if (a1&B3_Z80) SETFLAG(B3_Z80); else CLRFLAG(B3_Z80); \
+\
if (c) \
SETFLAG(C_Z80); \
else \
@@ -635,13 +652,13 @@ do { \
b=IN(cpu->BC.w); \
POKE(cpu->HL.w,b); \
\
- cpu->BC.b[HI]--; \
+ cpu->BC.b.hi--; \
cpu->HL.w++; \
\
- cpu->AF.b[LO]=SZtable[cpu->BC.b[HI]]; \
- SETHIDDEN(cpu->BC.b[HI]); \
+ cpu->AF.b.lo=SZtable[cpu->BC.b.hi]; \
+ SETHIDDEN(cpu->BC.b.hi); \
\
- w=(((Z80Word)cpu->BC.b[LO])&0xff)+b; \
+ w=(((Z80Word)cpu->BC.b.lo)&0xff)+b; \
\
if (b&0x80) \
SETFLAG(N_Z80); \
@@ -666,13 +683,13 @@ do { \
b=IN(cpu->BC.w); \
POKE(cpu->HL.w,b); \
\
- cpu->BC.b[HI]--; \
+ cpu->BC.b.hi--; \
cpu->HL.w--; \
\
- cpu->AF.b[LO]=SZtable[cpu->BC.b[HI]]; \
- SETHIDDEN(cpu->BC.b[HI]); \
+ cpu->AF.b.lo=SZtable[cpu->BC.b.hi]; \
+ SETHIDDEN(cpu->BC.b.hi); \
\
- w=(((Z80Word)cpu->BC.b[LO])&0xff)+b; \
+ w=(((Z80Word)cpu->BC.b.lo)&0xff)+b; \
\
if (b&0x80) \
SETFLAG(N_Z80); \
@@ -694,10 +711,10 @@ do { \
OUT(cpu->BC.w,PEEK(cpu->HL.w)); \
\
cpu->HL.w++; \
- cpu->BC.b[HI]--; \
+ cpu->BC.b.hi--; \
\
- cpu->AF.b[LO]=SZtable[cpu->BC.b[HI]]; \
- SETHIDDEN(cpu->BC.b[HI]); \
+ cpu->AF.b.lo=SZtable[cpu->BC.b.hi]; \
+ SETHIDDEN(cpu->BC.b.hi); \
} while(0)
#define OUTD \
@@ -705,11 +722,11 @@ do { \
OUT(cpu->BC.w,PEEK(cpu->HL.w)); \
\
cpu->HL.w--; \
- cpu->BC.b[HI]--; \
+ cpu->BC.b.hi--; \
\
- cpu->AF.b[LO]=SZtable[cpu->BC.b[HI]]; \
+ cpu->AF.b.lo=SZtable[cpu->BC.b.hi]; \
SETFLAG(N_Z80); \
- SETHIDDEN(cpu->BC.b[HI]); \
+ SETHIDDEN(cpu->BC.b.hi); \
} while(0)
@@ -719,22 +736,22 @@ do { \
#define LD_BLOCK(BASE,DEST,DEST2) \
case BASE: /* LD DEST,B */ \
TSTATE(4); \
- DEST=cpu->BC.b[HI]; \
+ DEST=cpu->BC.b.hi; \
break; \
\
case BASE+1: /* LD DEST,C */ \
TSTATE(4); \
- DEST=cpu->BC.b[LO]; \
+ DEST=cpu->BC.b.lo; \
break; \
\
case BASE+2: /* LD DEST,D */ \
TSTATE(4); \
- DEST=cpu->DE.b[HI]; \
+ DEST=cpu->DE.b.hi; \
break; \
\
case BASE+3: /* LD DEST,E */ \
TSTATE(4); \
- DEST=cpu->DE.b[LO]; \
+ DEST=cpu->DE.b.lo; \
break; \
\
case BASE+4: /* LD DEST,H */ \
@@ -749,34 +766,34 @@ do { \
\
case BASE+6: /* LD DEST,(HL) */ \
TSTATE(7); \
- OFFSET(off); \
+ OFFSET(*HL,off); \
DEST2=PEEK(*HL+off); \
break; \
\
case BASE+7: /* LD DEST,A */ \
TSTATE(4); \
- DEST=cpu->AF.b[HI]; \
+ DEST=cpu->AF.b.hi; \
break;
#define ALU_BLOCK(BASE,OP) \
case BASE: /* OP A,B */ \
TSTATE(4); \
- OP(cpu->BC.b[HI]); \
+ OP(cpu->BC.b.hi); \
break; \
\
case BASE+1: /* OP A,C */ \
TSTATE(4); \
- OP(cpu->BC.b[LO]); \
+ OP(cpu->BC.b.lo); \
break; \
\
case BASE+2: /* OP A,D */ \
TSTATE(4); \
- OP(cpu->DE.b[HI]); \
+ OP(cpu->DE.b.hi); \
break; \
\
case BASE+3: /* OP A,E */ \
TSTATE(4); \
- OP(cpu->DE.b[LO]); \
+ OP(cpu->DE.b.lo); \
break; \
\
case BASE+4: /* OP A,H */ \
@@ -791,13 +808,13 @@ do { \
\
case BASE+6: /* OP A,(HL) */ \
TSTATE(7); \
- OFFSET(off); \
+ OFFSET(*HL,off); \
OP_ON_MEM(OP,*HL+off); \
break; \
\
case BASE+7: /* OP A,A */ \
TSTATE(4); \
- OP(cpu->AF.b[HI]); \
+ OP(cpu->AF.b.hi); \
break;
@@ -807,32 +824,32 @@ do { \
#define CB_ALU_BLOCK(BASE,OP) \
case BASE: /* OP B */ \
TSTATE(8); \
- OP(cpu->BC.b[HI]); \
+ OP(cpu->BC.b.hi); \
break; \
\
case BASE+1: /* OP C */ \
TSTATE(8); \
- OP(cpu->BC.b[LO]); \
+ OP(cpu->BC.b.lo); \
break; \
\
case BASE+2: /* OP D */ \
TSTATE(8); \
- OP(cpu->DE.b[HI]); \
+ OP(cpu->DE.b.hi); \
break; \
\
case BASE+3: /* OP E */ \
TSTATE(8); \
- OP(cpu->DE.b[LO]); \
+ OP(cpu->DE.b.lo); \
break; \
\
case BASE+4: /* OP H */ \
TSTATE(8); \
- OP(cpu->HL.b[HI]); \
+ OP(cpu->HL.b.hi); \
break; \
\
case BASE+5: /* OP L */ \
TSTATE(8); \
- OP(cpu->HL.b[LO]); \
+ OP(cpu->HL.b.lo); \
break; \
\
case BASE+6: /* OP (HL) */ \
@@ -842,48 +859,48 @@ do { \
\
case BASE+7: /* OP A */ \
TSTATE(8); \
- OP(cpu->AF.b[HI]); \
+ OP(cpu->AF.b.hi); \
break;
-#define CB_BITMANIP_BLOCK(BASE,OP,BIT_NO) \
+#define CB_BITMANIP_BLOCK(BASE,OP,OP2,BIT_NO) \
case BASE: /* OP B */ \
TSTATE(8); \
- OP(cpu->BC.b[HI],BIT_NO); \
+ OP(cpu->BC.b.hi,BIT_NO); \
break; \
\
case BASE+1: /* OP C */ \
TSTATE(8); \
- OP(cpu->BC.b[LO],BIT_NO); \
+ OP(cpu->BC.b.lo,BIT_NO); \
break; \
\
case BASE+2: /* OP D */ \
TSTATE(8); \
- OP(cpu->DE.b[HI],BIT_NO); \
+ OP(cpu->DE.b.hi,BIT_NO); \
break; \
\
case BASE+3: /* OP E */ \
TSTATE(8); \
- OP(cpu->DE.b[LO],BIT_NO); \
+ OP(cpu->DE.b.lo,BIT_NO); \
break; \
\
case BASE+4: /* OP H */ \
TSTATE(8); \
- OP(cpu->HL.b[HI],BIT_NO); \
+ OP(cpu->HL.b.hi,BIT_NO); \
break; \
\
case BASE+5: /* OP L */ \
TSTATE(8); \
- OP(cpu->HL.b[LO],BIT_NO); \
+ OP(cpu->HL.b.lo,BIT_NO); \
break; \
\
- case BASE+6: /* OP (HL) */ \
+ case BASE+6: /* OP2 (HL) */ \
TSTATE(12); \
- OP_ON_MEM_WITH_ARG(OP,cpu->HL.w,BIT_NO); \
+ OP_ON_MEM_WITH_ARG(OP2,cpu->HL.w,BIT_NO); \
break; \
\
case BASE+7: /* OP A */ \
TSTATE(8); \
- OP(cpu->AF.b[HI],BIT_NO); \
+ OP(cpu->AF.b.hi,BIT_NO); \
break;
/* ---------------------------------------- SHIFTED CB OPCODE SHORT-HAND BLOCKS
@@ -892,32 +909,32 @@ do { \
#define SHIFTED_CB_ALU_BLOCK(BASE,OP) \
case BASE: /* OP B */ \
TSTATE(8); \
- OP_ON_MEM_WITH_COPY(OP,addr,cpu->BC.b[HI]); \
+ OP_ON_MEM_WITH_COPY(OP,addr,cpu->BC.b.hi); \
break; \
\
case BASE+1: /* OP C */ \
TSTATE(8); \
- OP_ON_MEM_WITH_COPY(OP,addr,cpu->BC.b[LO]); \
+ OP_ON_MEM_WITH_COPY(OP,addr,cpu->BC.b.lo); \
break; \
\
case BASE+2: /* OP D */ \
TSTATE(8); \
- OP_ON_MEM_WITH_COPY(OP,addr,cpu->DE.b[HI]); \
+ OP_ON_MEM_WITH_COPY(OP,addr,cpu->DE.b.hi); \
break; \
\
case BASE+3: /* OP E */ \
TSTATE(8); \
- OP_ON_MEM_WITH_COPY(OP,addr,cpu->DE.b[LO]); \
+ OP_ON_MEM_WITH_COPY(OP,addr,cpu->DE.b.lo); \
break; \
\
case BASE+4: /* OP H */ \
TSTATE(8); \
- OP_ON_MEM_WITH_COPY(OP,addr,cpu->HL.b[HI]); \
+ OP_ON_MEM_WITH_COPY(OP,addr,cpu->HL.b.hi); \
break; \
\
case BASE+5: /* OP L */ \
TSTATE(8); \
- OP_ON_MEM_WITH_COPY(OP,addr,cpu->HL.b[LO]); \
+ OP_ON_MEM_WITH_COPY(OP,addr,cpu->HL.b.lo); \
break; \
\
case BASE+6: /* OP (HL) */ \
@@ -927,48 +944,48 @@ do { \
\
case BASE+7: /* OP A */ \
TSTATE(8); \
- OP_ON_MEM_WITH_COPY(OP,addr,cpu->AF.b[HI]); \
+ OP_ON_MEM_WITH_COPY(OP,addr,cpu->AF.b.hi); \
break;
-#define SHIFTED_CB_BITMANIP_BLOCK(BASE,OP,BIT_NO) \
+#define SHIFTED_CB_BITMANIP_BLOCK(BASE,OP,OP2,BIT_NO) \
case BASE: /* OP B */ \
TSTATE(8); \
- OP_ON_MEM_WITH_ARG_AND_COPY(OP,addr,BIT_NO,cpu->BC.b[HI]); \
+ OP_ON_MEM_WITH_ARG_AND_COPY(OP,addr,BIT_NO,cpu->BC.b.hi); \
break; \
\
case BASE+1: /* OP C */ \
TSTATE(8); \
- OP_ON_MEM_WITH_ARG_AND_COPY(OP,addr,BIT_NO,cpu->BC.b[LO]); \
+ OP_ON_MEM_WITH_ARG_AND_COPY(OP,addr,BIT_NO,cpu->BC.b.lo); \
break; \
\
case BASE+2: /* OP D */ \
TSTATE(8); \
- OP_ON_MEM_WITH_ARG_AND_COPY(OP,addr,BIT_NO,cpu->DE.b[HI]); \
+ OP_ON_MEM_WITH_ARG_AND_COPY(OP,addr,BIT_NO,cpu->DE.b.hi); \
break; \
\
case BASE+3: /* OP E */ \
TSTATE(8); \
- OP_ON_MEM_WITH_ARG_AND_COPY(OP,addr,BIT_NO,cpu->DE.b[LO]); \
+ OP_ON_MEM_WITH_ARG_AND_COPY(OP,addr,BIT_NO,cpu->DE.b.lo); \
break; \
\
case BASE+4: /* OP H */ \
TSTATE(8); \
- OP_ON_MEM_WITH_ARG_AND_COPY(OP,addr,BIT_NO,cpu->HL.b[HI]); \
+ OP_ON_MEM_WITH_ARG_AND_COPY(OP,addr,BIT_NO,cpu->HL.b.hi); \
break; \
\
case BASE+5: /* OP L */ \
TSTATE(8); \
- OP_ON_MEM_WITH_ARG_AND_COPY(OP,addr,BIT_NO,cpu->HL.b[LO]); \
+ OP_ON_MEM_WITH_ARG_AND_COPY(OP,addr,BIT_NO,cpu->HL.b.lo); \
break; \
\
- case BASE+6: /* OP (HL) */ \
+ case BASE+6: /* OP2 (HL) */ \
TSTATE(12); \
- OP_ON_MEM_WITH_ARG(OP,addr,BIT_NO); \
+ OP_ON_MEM_WITH_ARG(OP2,addr,BIT_NO); \
break; \
\
case BASE+7: /* OP A */ \
TSTATE(8); \
- OP_ON_MEM_WITH_ARG_AND_COPY(OP,addr,BIT_NO,cpu->AF.b[HI]); \
+ OP_ON_MEM_WITH_ARG_AND_COPY(OP,addr,BIT_NO,cpu->AF.b.hi); \
break;
/* ---------------------------------------- DAA
@@ -980,35 +997,36 @@ do { \
static void DAA (Z80 *cpu)
{
Z80Byte add=0;
- Z80Byte carry=0;
- Z80Byte nf=cpu->AF.b[LO]&N_Z80;
- Z80Byte acc=cpu->AF.b[HI];
+ Z80Byte carry=cpu->AF.b.lo&C_Z80;
+ Z80Byte nf=cpu->AF.b.lo&N_Z80;
+ Z80Byte acc=cpu->AF.b.hi;
- if (acc>0x99 || IS_C)
+ if (acc > 0x99 || IS_C)
{
add|=0x60;
- carry=C_Z80;
+
+ if (acc > 0x99)
+ {
+ carry=C_Z80;
+ }
}
- if ((acc&0xf)>0x9 || IS_H)
+ if ((acc&0xf) > 0x9 || IS_H)
{
add|=0x06;
}
if (nf)
{
- cpu->AF.b[HI]-=add;
+ SUB8(add);
}
else
{
- cpu->AF.b[HI]+=add;
+ ADD8(add);
}
- cpu->AF.b[LO]=PSZtable[cpu->AF.b[HI]]
- | carry
- | nf
- | ((acc^cpu->AF.b[HI])&H_Z80)
- | (cpu->AF.b[HI]&(B3_Z80|B5_Z80));
+ cpu->AF.b.lo = (cpu->AF.b.lo & ~(C_Z80|P_Z80)) | carry |
+ Ptable[cpu->AF.b.hi];
}
/* ---------------------------------------- HANDLERS FOR ED OPCODES
@@ -1022,20 +1040,20 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
if (PRIV->pread)
{
- cpu->BC.b[HI]=PRIV->pread(cpu,cpu->BC.w);
+ cpu->BC.b.hi=PRIV->pread(cpu,cpu->BC.w);
}
else
{
- cpu->BC.b[HI]=0;
+ cpu->BC.b.hi=0;
}
- cpu->AF.b[LO]=CARRY|PSZtable[cpu->BC.b[HI]];
- SETHIDDEN(cpu->BC.b[HI]);
+ cpu->AF.b.lo=CARRY|PSZtable[cpu->BC.b.hi];
+ SETHIDDEN(cpu->BC.b.hi);
break;
case 0x41: /* OUT (C),B */
TSTATE(12);
- if (PRIV->pwrite) PRIV->pwrite(cpu,cpu->BC.w,cpu->BC.b[HI]);
+ if (PRIV->pwrite) PRIV->pwrite(cpu,cpu->BC.w,cpu->BC.b.hi);
break;
case 0x42: /* SBC HL,BC */
@@ -1044,21 +1062,25 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
break;
case 0x43: /* LD (nnnn),BC */
+ {
+ Z80Word addr=FETCH_WORD;
TSTATE(20);
- POKEW(FETCH_WORD,cpu->BC.w);
+ POKEW(addr,cpu->BC.w);
+ cpu->priv->memptr.w=addr+1;
break;
+ }
case 0x44: /* NEG */
- {
+ {
Z80Byte b;
TSTATE(8);
- b=cpu->AF.b[HI];
- cpu->AF.b[HI]=0;
+ b=cpu->AF.b.hi;
+ cpu->AF.b.hi=0;
SUB8(b);
break;
- }
+ }
case 0x45: /* RETN */
TSTATE(14);
@@ -1073,7 +1095,7 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
case 0x47: /* LD I,A */
TSTATE(9);
- cpu->I=cpu->AF.b[HI];
+ cpu->I=cpu->AF.b.hi;
break;
case 0x48: /* IN C,(C) */
@@ -1081,20 +1103,20 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
if (PRIV->pread)
{
- cpu->BC.b[LO]=PRIV->pread(cpu,cpu->BC.w);
+ cpu->BC.b.lo=PRIV->pread(cpu,cpu->BC.w);
}
else
{
- cpu->BC.b[LO]=0;
+ cpu->BC.b.lo=0;
}
- cpu->AF.b[LO]=CARRY|PSZtable[cpu->BC.b[LO]];
- SETHIDDEN(cpu->BC.b[LO]);
+ cpu->AF.b.lo=CARRY|PSZtable[cpu->BC.b.lo];
+ SETHIDDEN(cpu->BC.b.lo);
break;
case 0x49: /* OUT (C),C */
TSTATE(12);
- if (PRIV->pwrite) PRIV->pwrite(cpu,cpu->BC.w,cpu->BC.b[LO]);
+ if (PRIV->pwrite) PRIV->pwrite(cpu,cpu->BC.w,cpu->BC.b.lo);
break;
case 0x4a: /* ADC HL,BC */
@@ -1103,9 +1125,13 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
break;
case 0x4b: /* LD BC,(nnnn) */
+ {
+ Z80Word addr=FETCH_WORD;
TSTATE(20);
- cpu->BC.w=PEEKW(FETCH_WORD);
+ cpu->BC.w=PEEKW(addr);
+ cpu->priv->memptr.w=addr+1;
break;
+ }
case 0x4c: /* NEG */
{
@@ -1113,8 +1139,8 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
TSTATE(8);
- b=cpu->AF.b[HI];
- cpu->AF.b[HI]=0;
+ b=cpu->AF.b.hi;
+ cpu->AF.b.hi=0;
SUB8(b);
break;
}
@@ -1124,6 +1150,7 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
CALLBACK(eZ80_RETI,0);
cpu->IFF1=cpu->IFF2;
POP(cpu->PC);
+ cpu->priv->memptr.w=cpu->PC;
break;
case 0x4e: /* IM 0/1 */
@@ -1133,7 +1160,7 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
case 0x4f: /* LD R,A */
TSTATE(9);
- cpu->R=cpu->AF.b[HI];
+ cpu->R=cpu->AF.b.hi;
break;
case 0x50: /* IN D,(C) */
@@ -1141,20 +1168,20 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
if (PRIV->pread)
{
- cpu->DE.b[HI]=PRIV->pread(cpu,cpu->BC.w);
+ cpu->DE.b.hi=PRIV->pread(cpu,cpu->BC.w);
}
else
{
- cpu->DE.b[HI]=0;
+ cpu->DE.b.hi=0;
}
- cpu->AF.b[LO]=CARRY|PSZtable[cpu->DE.b[HI]];
- SETHIDDEN(cpu->BC.b[HI]);
+ cpu->AF.b.lo=CARRY|PSZtable[cpu->DE.b.hi];
+ SETHIDDEN(cpu->BC.b.hi);
break;
case 0x51: /* OUT (C),D */
TSTATE(12);
- if (PRIV->pwrite) PRIV->pwrite(cpu,cpu->BC.w,cpu->DE.b[HI]);
+ if (PRIV->pwrite) PRIV->pwrite(cpu,cpu->BC.w,cpu->DE.b.hi);
break;
case 0x52: /* SBC HL,DE */
@@ -1163,21 +1190,25 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
break;
case 0x53: /* LD (nnnn),DE */
+ {
+ Z80Word addr=FETCH_WORD;
TSTATE(20);
- POKEW(FETCH_WORD,cpu->DE.w);
+ POKEW(addr,cpu->DE.w);
+ cpu->priv->memptr.w=addr+1;
break;
+ }
case 0x54: /* NEG */
- {
+ {
Z80Byte b;
TSTATE(8);
- b=cpu->AF.b[HI];
- cpu->AF.b[HI]=0;
+ b=cpu->AF.b.hi;
+ cpu->AF.b.hi=0;
SUB8(b);
break;
- }
+ }
case 0x55: /* RETN */
TSTATE(14);
@@ -1192,7 +1223,7 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
case 0x57: /* LD A,I */
TSTATE(9);
- cpu->AF.b[HI]=cpu->I;
+ cpu->AF.b.hi=cpu->I;
break;
case 0x58: /* IN E,(C) */
@@ -1200,20 +1231,20 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
if (PRIV->pread)
{
- cpu->DE.b[LO]=PRIV->pread(cpu,cpu->BC.w);
+ cpu->DE.b.lo=PRIV->pread(cpu,cpu->BC.w);
}
else
{
- cpu->BC.b[LO]=0;
+ cpu->BC.b.lo=0;
}
- cpu->AF.b[LO]=CARRY|PSZtable[cpu->DE.b[LO]];
- SETHIDDEN(cpu->DE.b[LO]);
+ cpu->AF.b.lo=CARRY|PSZtable[cpu->DE.b.lo];
+ SETHIDDEN(cpu->DE.b.lo);
break;
case 0x59: /* OUT (C),E */
TSTATE(12);
- if (PRIV->pwrite) PRIV->pwrite(cpu,cpu->BC.w,cpu->DE.b[LO]);
+ if (PRIV->pwrite) PRIV->pwrite(cpu,cpu->BC.w,cpu->DE.b.lo);
break;
case 0x5a: /* ADC HL,DE */
@@ -1222,21 +1253,25 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
break;
case 0x5b: /* LD DE,(nnnn) */
+ {
+ Z80Word addr=FETCH_WORD;
TSTATE(20);
- cpu->DE.w=PEEKW(FETCH_WORD);
+ cpu->DE.w=PEEKW(addr);
+ cpu->priv->memptr.w=addr+1;
break;
+ }
case 0x5c: /* NEG */
- {
+ {
Z80Byte b;
TSTATE(8);
- b=cpu->AF.b[HI];
- cpu->AF.b[HI]=0;
+ b=cpu->AF.b.hi;
+ cpu->AF.b.hi=0;
SUB8(b);
break;
- }
+ }
case 0x5d: /* RETN */
TSTATE(14);
@@ -1251,7 +1286,7 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
case 0x5f: /* LD A,R */
TSTATE(9);
- cpu->AF.b[HI]=cpu->R;
+ cpu->AF.b.hi=cpu->R;
break;
case 0x60: /* IN H,(C) */
@@ -1259,20 +1294,20 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
if (PRIV->pread)
{
- cpu->HL.b[HI]=PRIV->pread(cpu,cpu->BC.w);
+ cpu->HL.b.hi=PRIV->pread(cpu,cpu->BC.w);
}
else
{
- cpu->HL.b[HI]=0;
+ cpu->HL.b.hi=0;
}
- cpu->AF.b[LO]=CARRY|PSZtable[cpu->HL.b[HI]];
- SETHIDDEN(cpu->HL.b[HI]);
+ cpu->AF.b.lo=CARRY|PSZtable[cpu->HL.b.hi];
+ SETHIDDEN(cpu->HL.b.hi);
break;
case 0x61: /* OUT (C),H */
TSTATE(12);
- if (PRIV->pwrite) PRIV->pwrite(cpu,cpu->BC.w,cpu->HL.b[HI]);
+ if (PRIV->pwrite) PRIV->pwrite(cpu,cpu->BC.w,cpu->HL.b.hi);
break;
case 0x62: /* SBC HL,HL */
@@ -1281,9 +1316,13 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
break;
case 0x63: /* LD (nnnn),HL */
+ {
+ Z80Word addr=FETCH_WORD;
TSTATE(20);
- POKEW(FETCH_WORD,cpu->HL.w);
+ POKEW(addr,cpu->HL.w);
+ cpu->priv->memptr.w=addr+1;
break;
+ }
case 0x64: /* NEG */
{
@@ -1291,8 +1330,8 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
TSTATE(8);
- b=cpu->AF.b[HI];
- cpu->AF.b[HI]=0;
+ b=cpu->AF.b.hi;
+ cpu->AF.b.hi=0;
SUB8(b);
break;
}
@@ -1309,40 +1348,41 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
break;
case 0x67: /* RRD */
- {
+ {
Z80Byte b;
TSTATE(18);
b=PEEK(cpu->HL.w);
+ cpu->priv->memptr.w=cpu->HL.w+1;
- POKE(cpu->HL.w,(b>>4)|(cpu->AF.b[HI]<<4));
- cpu->AF.b[HI]=(cpu->AF.b[HI]&0xf0)|(b&0x0f);
+ POKE(cpu->HL.w,(b>>4)|(cpu->AF.b.hi<<4));
+ cpu->AF.b.hi=(cpu->AF.b.hi&0xf0)|(b&0x0f);
- cpu->AF.b[LO]=CARRY|PSZtable[cpu->AF.b[HI]];
- SETHIDDEN(cpu->AF.b[HI]);
+ cpu->AF.b.lo=CARRY|PSZtable[cpu->AF.b.hi];
+ SETHIDDEN(cpu->AF.b.hi);
break;
- }
+ }
case 0x68: /* IN L,(C) */
TSTATE(12);
if (PRIV->pread)
{
- cpu->HL.b[LO]=PRIV->pread(cpu,cpu->BC.w);
+ cpu->HL.b.lo=PRIV->pread(cpu,cpu->BC.w);
}
else
{
- cpu->HL.b[LO]=0;
+ cpu->HL.b.lo=0;
}
- cpu->AF.b[LO]=CARRY|PSZtable[cpu->HL.b[LO]];
- SETHIDDEN(cpu->HL.b[LO]);
+ cpu->AF.b.lo=CARRY|PSZtable[cpu->HL.b.lo];
+ SETHIDDEN(cpu->HL.b.lo);
break;
case 0x69: /* OUT (C),L */
TSTATE(12);
- if (PRIV->pwrite) PRIV->pwrite(cpu,cpu->BC.w,cpu->HL.b[LO]);
+ if (PRIV->pwrite) PRIV->pwrite(cpu,cpu->BC.w,cpu->HL.b.lo);
break;
case 0x6a: /* ADC HL,HL */
@@ -1351,21 +1391,25 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
break;
case 0x6b: /* LD HL,(nnnn) */
+ {
+ Z80Word addr=FETCH_WORD;
TSTATE(20);
- cpu->HL.w=PEEKW(FETCH_WORD);
+ cpu->HL.w=PEEKW(addr);
+ cpu->priv->memptr.w=addr+1;
break;
+ }
case 0x6c: /* NEG */
- {
+ {
Z80Byte b;
TSTATE(8);
- b=cpu->AF.b[HI];
- cpu->AF.b[HI]=0;
+ b=cpu->AF.b.hi;
+ cpu->AF.b.hi=0;
SUB8(b);
break;
- }
+ }
case 0x6d: /* RETN */
TSTATE(14);
@@ -1379,23 +1423,24 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
break;
case 0x6f: /* RLD */
- {
+ {
Z80Byte b;
TSTATE(18);
b=PEEK(cpu->HL.w);
+ cpu->priv->memptr.w=cpu->HL.w+1;
- POKE(cpu->HL.w,(b<<4)|(cpu->AF.b[HI]&0x0f));
- cpu->AF.b[HI]=(cpu->AF.b[HI]&0xf0)|(b>>4);
+ POKE(cpu->HL.w,(b<<4)|(cpu->AF.b.hi&0x0f));
+ cpu->AF.b.hi=(cpu->AF.b.hi&0xf0)|(b>>4);
- cpu->AF.b[LO]=CARRY|PSZtable[cpu->AF.b[HI]];
- SETHIDDEN(cpu->AF.b[HI]);
+ cpu->AF.b.lo=CARRY|PSZtable[cpu->AF.b.hi];
+ SETHIDDEN(cpu->AF.b.hi);
break;
- }
+ }
case 0x70: /* IN (C) */
- {
+ {
Z80Byte b;
TSTATE(12);
@@ -1409,14 +1454,14 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
b=0;
}
- cpu->AF.b[LO]=CARRY|PSZtable[b];
+ cpu->AF.b.lo=CARRY|PSZtable[b];
SETHIDDEN(b);
break;
- }
+ }
case 0x71: /* OUT (C) */
TSTATE(12);
- if (PRIV->pwrite) PRIV->pwrite(cpu,cpu->BC.w,0);
+ if (PRIV->pwrite) PRIV->pwrite(cpu,cpu->BC.w,255);
break;
case 0x72: /* SBC HL,SP */
@@ -1430,16 +1475,16 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
break;
case 0x74: /* NEG */
- {
+ {
Z80Byte b;
TSTATE(8);
- b=cpu->AF.b[HI];
- cpu->AF.b[HI]=0;
+ b=cpu->AF.b.hi;
+ cpu->AF.b.hi=0;
SUB8(b);
break;
- }
+ }
case 0x75: /* RETN */
TSTATE(14);
@@ -1462,20 +1507,22 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
if (PRIV->pread)
{
- cpu->AF.b[HI]=PRIV->pread(cpu,cpu->BC.w);
+ cpu->AF.b.hi=PRIV->pread(cpu,cpu->BC.w);
}
else
{
- cpu->AF.b[HI]=0;
+ cpu->AF.b.hi=0;
}
- cpu->AF.b[LO]=CARRY|PSZtable[cpu->AF.b[HI]];
- SETHIDDEN(cpu->AF.b[HI]);
+ cpu->AF.b.lo=CARRY|PSZtable[cpu->AF.b.hi];
+ PRIV->memptr.w=cpu->BC.w+1;
+ SETHIDDEN(cpu->AF.b.hi);
break;
case 0x79: /* OUT (C),A */
TSTATE(12);
- if (PRIV->pwrite) PRIV->pwrite(cpu,cpu->BC.w,cpu->AF.b[HI]);
+ if (PRIV->pwrite) PRIV->pwrite(cpu,cpu->BC.w,cpu->AF.b.hi);
+ PRIV->memptr.w=cpu->BC.w+1;
break;
case 0x7a: /* ADC HL,SP */
@@ -1489,16 +1536,16 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
break;
case 0x7c: /* NEG */
- {
+ {
Z80Byte b;
TSTATE(8);
- b=cpu->AF.b[HI];
- cpu->AF.b[HI]=0;
+ b=cpu->AF.b.hi;
+ cpu->AF.b.hi=0;
SUB8(b);
break;
- }
+ }
case 0x7d: /* RETN */
TSTATE(14);
@@ -1524,16 +1571,19 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
case 0xa1: /* CPI */
TSTATE(16);
CPI;
+ PRIV->memptr.w++;
break;
case 0xa2: /* INI */
TSTATE(16);
+ PRIV->memptr.w = cpu->BC.w + 1;
INI;
break;
case 0xa3: /* OUTI */
TSTATE(16);
OUTI;
+ PRIV->memptr.w=cpu->BC.w+1;
break;
case 0xa8: /* LDD */
@@ -1544,25 +1594,32 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
case 0xa9: /* CPD */
TSTATE(16);
CPD;
+ PRIV->memptr.w--;
break;
case 0xaa: /* IND */
TSTATE(16);
+ PRIV->memptr.w = cpu->BC.w - 1;
IND;
break;
case 0xab: /* OUTD */
TSTATE(16);
OUTD;
+ PRIV->memptr.w=cpu->BC.w-1;
break;
case 0xb0: /* LDIR */
TSTATE(16);
+
LDI;
+
if (cpu->BC.w)
{
TSTATE(5);
cpu->PC-=2;
+ SETHIDDEN((cpu->PC)>>8);
+ PRIV->memptr.w=cpu->PC+1;
}
break;
@@ -1573,11 +1630,17 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
{
TSTATE(5);
cpu->PC-=2;
+ PRIV->memptr.w++;
}
+ else
+ {
+ PRIV->memptr.w=cpu->PC-1;
+ }
break;
case 0xb2: /* INIR */
TSTATE(16);
+ PRIV->memptr.w = cpu->BC.w + 1;
INI;
if (cpu->BC.w)
{
@@ -1589,6 +1652,7 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
case 0xb3: /* OTIR */
TSTATE(16);
OUTI;
+ PRIV->memptr.w=cpu->BC.w+1;
if (cpu->BC.w)
{
TSTATE(5);
@@ -1598,11 +1662,15 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
case 0xb8: /* LDDR */
TSTATE(16);
+
LDD;
+
if (cpu->BC.w)
{
TSTATE(5);
cpu->PC-=2;
+ SETHIDDEN((cpu->PC)>>8);
+ PRIV->memptr.w=cpu->PC+1;
}
break;
@@ -1613,11 +1681,17 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
{
TSTATE(5);
cpu->PC-=2;
+ PRIV->memptr.w++;
}
+ else
+ {
+ PRIV->memptr.w=cpu->PC-1;
+ }
break;
case 0xba: /* INDR */
TSTATE(16);
+ PRIV->memptr.w = cpu->BC.w-1;
IND;
if (cpu->BC.w)
{
@@ -1629,6 +1703,7 @@ static void DecodeED(Z80 *cpu, Z80Byte opcode)
case 0xbb: /* OTDR */
TSTATE(16);
OUTD;
+ PRIV->memptr.w=cpu->BC.w-1;
if (cpu->BC.w)
{
TSTATE(5);
@@ -1661,32 +1736,32 @@ static void DecodeCB(Z80 *cpu, Z80Byte opcode)
CB_ALU_BLOCK(0x30,SLL)
CB_ALU_BLOCK(0x38,SRL)
- CB_BITMANIP_BLOCK(0x40,BIT,0)
- CB_BITMANIP_BLOCK(0x48,BIT,1)
- CB_BITMANIP_BLOCK(0x50,BIT,2)
- CB_BITMANIP_BLOCK(0x58,BIT,3)
- CB_BITMANIP_BLOCK(0x60,BIT,4)
- CB_BITMANIP_BLOCK(0x68,BIT,5)
- CB_BITMANIP_BLOCK(0x70,BIT,6)
- CB_BITMANIP_BLOCK(0x78,BIT,7)
-
- CB_BITMANIP_BLOCK(0x80,BIT_RES,0)
- CB_BITMANIP_BLOCK(0x88,BIT_RES,1)
- CB_BITMANIP_BLOCK(0x90,BIT_RES,2)
- CB_BITMANIP_BLOCK(0x98,BIT_RES,3)
- CB_BITMANIP_BLOCK(0xa0,BIT_RES,4)
- CB_BITMANIP_BLOCK(0xa8,BIT_RES,5)
- CB_BITMANIP_BLOCK(0xb0,BIT_RES,6)
- CB_BITMANIP_BLOCK(0xb8,BIT_RES,7)
-
- CB_BITMANIP_BLOCK(0xc0,BIT_SET,0)
- CB_BITMANIP_BLOCK(0xc8,BIT_SET,1)
- CB_BITMANIP_BLOCK(0xd0,BIT_SET,2)
- CB_BITMANIP_BLOCK(0xd8,BIT_SET,3)
- CB_BITMANIP_BLOCK(0xe0,BIT_SET,4)
- CB_BITMANIP_BLOCK(0xe8,BIT_SET,5)
- CB_BITMANIP_BLOCK(0xf0,BIT_SET,6)
- CB_BITMANIP_BLOCK(0xf8,BIT_SET,7)
+ CB_BITMANIP_BLOCK(0x40,BIT,BIT_MEMPTR,0)
+ CB_BITMANIP_BLOCK(0x48,BIT,BIT_MEMPTR,1)
+ CB_BITMANIP_BLOCK(0x50,BIT,BIT_MEMPTR,2)
+ CB_BITMANIP_BLOCK(0x58,BIT,BIT_MEMPTR,3)
+ CB_BITMANIP_BLOCK(0x60,BIT,BIT_MEMPTR,4)
+ CB_BITMANIP_BLOCK(0x68,BIT,BIT_MEMPTR,5)
+ CB_BITMANIP_BLOCK(0x70,BIT,BIT_MEMPTR,6)
+ CB_BITMANIP_BLOCK(0x78,BIT,BIT_MEMPTR,7)
+
+ CB_BITMANIP_BLOCK(0x80,BIT_RES,BIT_RES,0)
+ CB_BITMANIP_BLOCK(0x88,BIT_RES,BIT_RES,1)
+ CB_BITMANIP_BLOCK(0x90,BIT_RES,BIT_RES,2)
+ CB_BITMANIP_BLOCK(0x98,BIT_RES,BIT_RES,3)
+ CB_BITMANIP_BLOCK(0xa0,BIT_RES,BIT_RES,4)
+ CB_BITMANIP_BLOCK(0xa8,BIT_RES,BIT_RES,5)
+ CB_BITMANIP_BLOCK(0xb0,BIT_RES,BIT_RES,6)
+ CB_BITMANIP_BLOCK(0xb8,BIT_RES,BIT_RES,7)
+
+ CB_BITMANIP_BLOCK(0xc0,BIT_SET,BIT_SET,0)
+ CB_BITMANIP_BLOCK(0xc8,BIT_SET,BIT_SET,1)
+ CB_BITMANIP_BLOCK(0xd0,BIT_SET,BIT_SET,2)
+ CB_BITMANIP_BLOCK(0xd8,BIT_SET,BIT_SET,3)
+ CB_BITMANIP_BLOCK(0xe0,BIT_SET,BIT_SET,4)
+ CB_BITMANIP_BLOCK(0xe8,BIT_SET,BIT_SET,5)
+ CB_BITMANIP_BLOCK(0xf0,BIT_SET,BIT_SET,6)
+ CB_BITMANIP_BLOCK(0xf8,BIT_SET,BIT_SET,7)
}
}
@@ -1701,9 +1776,11 @@ static void ShiftedDecodeCB(Z80 *cpu, Z80Byte opcode, Z80Relative offset)
{
case 0xdd:
addr=cpu->IX.w+offset;
+ PRIV->memptr.w=addr;
break;
case 0xfd:
addr=cpu->IY.w+offset;
+ PRIV->memptr.w=addr;
break;
default:
addr=cpu->HL.w; /* Play safe... */
@@ -1721,32 +1798,32 @@ static void ShiftedDecodeCB(Z80 *cpu, Z80Byte opcode, Z80Relative offset)
SHIFTED_CB_ALU_BLOCK(0x30,SLL)
SHIFTED_CB_ALU_BLOCK(0x38,SRL)
- SHIFTED_CB_BITMANIP_BLOCK(0x40,BIT,0)
- SHIFTED_CB_BITMANIP_BLOCK(0x48,BIT,1)
- SHIFTED_CB_BITMANIP_BLOCK(0x50,BIT,2)
- SHIFTED_CB_BITMANIP_BLOCK(0x58,BIT,3)
- SHIFTED_CB_BITMANIP_BLOCK(0x60,BIT,4)
- SHIFTED_CB_BITMANIP_BLOCK(0x68,BIT,5)
- SHIFTED_CB_BITMANIP_BLOCK(0x70,BIT,6)
- SHIFTED_CB_BITMANIP_BLOCK(0x78,BIT,7)
-
- SHIFTED_CB_BITMANIP_BLOCK(0x80,BIT_RES,0)
- SHIFTED_CB_BITMANIP_BLOCK(0x88,BIT_RES,1)
- SHIFTED_CB_BITMANIP_BLOCK(0x90,BIT_RES,2)
- SHIFTED_CB_BITMANIP_BLOCK(0x98,BIT_RES,3)
- SHIFTED_CB_BITMANIP_BLOCK(0xa0,BIT_RES,4)
- SHIFTED_CB_BITMANIP_BLOCK(0xa8,BIT_RES,5)
- SHIFTED_CB_BITMANIP_BLOCK(0xb0,BIT_RES,6)
- SHIFTED_CB_BITMANIP_BLOCK(0xb8,BIT_RES,7)
-
- SHIFTED_CB_BITMANIP_BLOCK(0xc0,BIT_SET,0)
- SHIFTED_CB_BITMANIP_BLOCK(0xc8,BIT_SET,1)
- SHIFTED_CB_BITMANIP_BLOCK(0xd0,BIT_SET,2)
- SHIFTED_CB_BITMANIP_BLOCK(0xd8,BIT_SET,3)
- SHIFTED_CB_BITMANIP_BLOCK(0xe0,BIT_SET,4)
- SHIFTED_CB_BITMANIP_BLOCK(0xe8,BIT_SET,5)
- SHIFTED_CB_BITMANIP_BLOCK(0xf0,BIT_SET,6)
- SHIFTED_CB_BITMANIP_BLOCK(0xf8,BIT_SET,7)
+ SHIFTED_CB_BITMANIP_BLOCK(0x40,BIT_MEMPTR,BIT_MEMPTR,0)
+ SHIFTED_CB_BITMANIP_BLOCK(0x48,BIT_MEMPTR,BIT_MEMPTR,1)
+ SHIFTED_CB_BITMANIP_BLOCK(0x50,BIT_MEMPTR,BIT_MEMPTR,2)
+ SHIFTED_CB_BITMANIP_BLOCK(0x58,BIT_MEMPTR,BIT_MEMPTR,3)
+ SHIFTED_CB_BITMANIP_BLOCK(0x60,BIT_MEMPTR,BIT_MEMPTR,4)
+ SHIFTED_CB_BITMANIP_BLOCK(0x68,BIT_MEMPTR,BIT_MEMPTR,5)
+ SHIFTED_CB_BITMANIP_BLOCK(0x70,BIT_MEMPTR,BIT_MEMPTR,6)
+ SHIFTED_CB_BITMANIP_BLOCK(0x78,BIT_MEMPTR,BIT_MEMPTR,7)
+
+ SHIFTED_CB_BITMANIP_BLOCK(0x80,BIT_RES,BIT_RES,0)
+ SHIFTED_CB_BITMANIP_BLOCK(0x88,BIT_RES,BIT_RES,1)
+ SHIFTED_CB_BITMANIP_BLOCK(0x90,BIT_RES,BIT_RES,2)
+ SHIFTED_CB_BITMANIP_BLOCK(0x98,BIT_RES,BIT_RES,3)
+ SHIFTED_CB_BITMANIP_BLOCK(0xa0,BIT_RES,BIT_RES,4)
+ SHIFTED_CB_BITMANIP_BLOCK(0xa8,BIT_RES,BIT_RES,5)
+ SHIFTED_CB_BITMANIP_BLOCK(0xb0,BIT_RES,BIT_RES,6)
+ SHIFTED_CB_BITMANIP_BLOCK(0xb8,BIT_RES,BIT_RES,7)
+
+ SHIFTED_CB_BITMANIP_BLOCK(0xc0,BIT_SET,BIT_SET,0)
+ SHIFTED_CB_BITMANIP_BLOCK(0xc8,BIT_SET,BIT_SET,1)
+ SHIFTED_CB_BITMANIP_BLOCK(0xd0,BIT_SET,BIT_SET,2)
+ SHIFTED_CB_BITMANIP_BLOCK(0xd8,BIT_SET,BIT_SET,3)
+ SHIFTED_CB_BITMANIP_BLOCK(0xe0,BIT_SET,BIT_SET,4)
+ SHIFTED_CB_BITMANIP_BLOCK(0xe8,BIT_SET,BIT_SET,5)
+ SHIFTED_CB_BITMANIP_BLOCK(0xf0,BIT_SET,BIT_SET,6)
+ SHIFTED_CB_BITMANIP_BLOCK(0xf8,BIT_SET,BIT_SET,7)
}
}
@@ -1766,18 +1843,18 @@ void Z80_Decode(Z80 *cpu, Z80Byte opcode)
{
case 0xdd:
HL=&(cpu->IX.w);
- L=cpu->IX.b+LO;
- H=cpu->IX.b+HI;
+ L=&(cpu->IX.b.lo);
+ H=&(cpu->IX.b.hi);
break;
case 0xfd:
HL=&(cpu->IY.w);
- L=cpu->IY.b+LO;
- H=cpu->IY.b+HI;
+ L=&(cpu->IY.b.lo);
+ H=&(cpu->IY.b.hi);
break;
default:
HL=&(cpu->HL.w);
- L=cpu->HL.b+LO;
- H=cpu->HL.b+HI;
+ L=&(cpu->HL.b.lo);
+ H=&(cpu->HL.b.hi);
break;
}
@@ -1794,7 +1871,9 @@ void Z80_Decode(Z80 *cpu, Z80Byte opcode)
case 0x02: /* LD (BC),A */
TSTATE(7);
- POKE(cpu->BC.w,cpu->AF.b[HI]);
+ POKE(cpu->BC.w,cpu->AF.b.hi);
+ cpu->priv->memptr.b.lo=(cpu->BC.w+1)&0xff;
+ cpu->priv->memptr.b.hi=cpu->AF.b.hi;
break;
case 0x03: /* INC BC */
@@ -1804,17 +1883,17 @@ void Z80_Decode(Z80 *cpu, Z80Byte opcode)
case 0x04: /* INC B */
TSTATE(4);
- INC8(cpu->BC.b[HI]);
+ INC8(cpu->BC.b.hi);
break;
case 0x05: /* DEC B */
TSTATE(4);
- DEC8(cpu->BC.b[HI]);
+ DEC8(cpu->BC.b.hi);
break;
case 0x06: /* LD B,n */
TSTATE(7);
- cpu->BC.b[HI]=FETCH_BYTE;
+ cpu->BC.b.hi=FETCH_BYTE;
break;
case 0x07: /* RLCA */
@@ -1834,7 +1913,8 @@ void Z80_Decode(Z80 *cpu, Z80Byte opcode)
case 0x0a: /* LD A,(BC) */
TSTATE(7);
- cpu->AF.b[HI]=PEEK(cpu->BC.w);
+ cpu->AF.b.hi=PEEK(cpu->BC.w);
+ cpu->priv->memptr.w=cpu->BC.w+1;
break;
case 0x0b: /* DEC BC */
@@ -1844,17 +1924,17 @@ void Z80_Decode(Z80 *cpu, Z80Byte opcode)
case 0x0c: /* INC C */
TSTATE(4);
- INC8(cpu->BC.b[LO]);
+ INC8(cpu->BC.b.lo);
break;
case 0x0d: /* DEC C */
TSTATE(4);
- DEC8(cpu->BC.b[LO]);
+ DEC8(cpu->BC.b.lo);
break;
case 0x0e: /* LD C,n */
TSTATE(7);
- cpu->BC.b[LO]=FETCH_BYTE;
+ cpu->BC.b.lo=FETCH_BYTE;
break;
case 0x0f: /* RRCA */
@@ -1863,7 +1943,7 @@ void Z80_Decode(Z80 *cpu, Z80Byte opcode)
break;
case 0x10: /* DJNZ */
- if (--(cpu->BC.b[HI]))
+ if (--(cpu->BC.b.hi))
{
TSTATE(13);
JR;
@@ -1882,7 +1962,9 @@ void Z80_Decode(Z80 *cpu, Z80Byte opcode)
case 0x12: /* LD (DE),A */
TSTATE(7);
- POKE(cpu->DE.w,cpu->AF.b[HI]);
+ POKE(cpu->DE.w,cpu->AF.b.hi);
+ cpu->priv->memptr.b.lo=(cpu->DE.w+1)&0xff;
+ cpu->priv->memptr.b.hi=cpu->AF.b.hi;
break;
case 0x13: /* INC DE */
@@ -1892,17 +1974,17 @@ void Z80_Decode(Z80 *cpu, Z80Byte opcode)
case 0x14: /* INC D */
TSTATE(4);
- INC8(cpu->DE.b[HI]);
+ INC8(cpu->DE.b.hi);
break;
case 0x15: /* DEC D */
TSTATE(4);
- DEC8(cpu->DE.b[HI]);
+ DEC8(cpu->DE.b.hi);
break;
case 0x16: /* LD D,n */
TSTATE(7);
- cpu->DE.b[HI]=FETCH_BYTE;
+ cpu->DE.b.hi=FETCH_BYTE;
break;
case 0x17: /* RLA */
@@ -1922,7 +2004,8 @@ void Z80_Decode(Z80 *cpu, Z80Byte opcode)
case 0x1a: /* LD A,(DE) */
TSTATE(7);
- cpu->AF.b[HI]=PEEK(cpu->DE.w);
+ cpu->AF.b.hi=PEEK(cpu->DE.w);
+ cpu->priv->memptr.w=cpu->DE.w+1;
break;
case 0x1b: /* DEC DE */
@@ -1932,17 +2015,17 @@ void Z80_Decode(Z80 *cpu, Z80Byte opcode)
case 0x1c: /* INC E */
TSTATE(4);
- INC8(cpu->DE.b[LO]);
+ INC8(cpu->DE.b.lo);
break;
case 0x1d: /* DEC E */
TSTATE(4);
- DEC8(cpu->DE.b[LO]);
+ DEC8(cpu->DE.b.lo);
break;
case 0x1e: /* LD E,n */
TSTATE(7);
- cpu->DE.b[LO]=FETCH_BYTE;
+ cpu->DE.b.lo=FETCH_BYTE;
break;
case 0x1f: /* RRA */
@@ -2025,10 +2108,10 @@ void Z80_Decode(Z80 *cpu, Z80Byte opcode)
case 0x2f: /* CPL */
TSTATE(4);
- cpu->AF.b[HI]^=0xff;
+ cpu->AF.b.hi^=0xff;
SETFLAG(H_Z80);
SETFLAG(N_Z80);
- SETHIDDEN(cpu->AF.b[HI]);
+ SETHIDDEN(cpu->AF.b.hi);
break;
case 0x30: /* JR NC,d */
@@ -2041,9 +2124,14 @@ void Z80_Decode(Z80 *cpu, Z80Byte opcode)
break;
case 0x32: /* LD (nnnn),A */
+ {
+ Z80Word addr=FETCH_WORD;
TSTATE(13);
- POKE(FETCH_WORD,cpu->AF.b[HI]);
+ POKE(addr,cpu->AF.b.hi);
+ cpu->priv->memptr.b.lo=(addr + 1) & 0xff;
+ cpu->priv->memptr.b.hi=cpu->AF.b.hi;
break;
+ }
case 0x33: /* INC SP */
TSTATE(6);
@@ -2052,27 +2140,27 @@ void Z80_Decode(Z80 *cpu, Z80Byte opcode)
case 0x34: /* INC (HL) */
TSTATE(11);
- OFFSET(off);
+ OFFSET(*HL,off);
OP_ON_MEM(INC8,*HL+off);
break;
case 0x35: /* DEC (HL) */
TSTATE(11);
- OFFSET(off);
+ OFFSET(*HL,off);
OP_ON_MEM(DEC8,*HL+off);
break;
case 0x36: /* LD (HL),n */
TSTATE(10);
- OFFSET(off);
+ OFFSET(*HL,off);
POKE(*HL+off,FETCH_BYTE);
break;
case 0x37: /* SCF */
TSTATE(4);
- cpu->AF.b[LO]=(cpu->AF.b[LO]&(S_Z80|Z_Z80|P_Z80))
+ cpu->AF.b.lo=(cpu->AF.b.lo&(S_Z80|Z_Z80|P_Z80))
| C_Z80
- | (cpu->AF.b[HI]&(B3_Z80|B5_Z80));
+ | (cpu->AF.b.hi&(B3_Z80|B5_Z80));
break;
case 0x38: /* JR C,d */
@@ -2085,9 +2173,13 @@ void Z80_Decode(Z80 *cpu, Z80Byte opcode)
break;
case 0x3a: /* LD A,(nnnn) */
+ {
+ Z80Word addr=FETCH_WORD;
TSTATE(13);
- cpu->AF.b[HI]=PEEK(FETCH_WORD);
+ cpu->AF.b.hi=PEEK(addr);
+ cpu->priv->memptr.w=addr + 1;
break;
+ }
case 0x3b: /* DEC SP */
TSTATE(6);
@@ -2096,72 +2188,74 @@ void Z80_Decode(Z80 *cpu, Z80Byte opcode)
case 0x3c: /* INC A */
TSTATE(4);
- INC8(cpu->AF.b[HI]);
+ INC8(cpu->AF.b.hi);
break;
case 0x3d: /* DEC A */
TSTATE(4);
- DEC8(cpu->AF.b[HI]);
+ DEC8(cpu->AF.b.hi);
break;
case 0x3e: /* LD A,n */
TSTATE(7);
- cpu->AF.b[HI]=FETCH_BYTE;
+ cpu->AF.b.hi=FETCH_BYTE;
break;
case 0x3f: /* CCF */
TSTATE(4);
+ CLRFLAG(N_Z80);
+
if (CARRY)
SETFLAG(H_Z80);
else
CLRFLAG(H_Z80);
- cpu->AF.b[LO]^=C_Z80;
- SETHIDDEN(cpu->AF.b[HI]);
+ cpu->AF.b.lo^=C_Z80;
+ SETHIDDEN(cpu->AF.b.hi);
break;
- LD_BLOCK(0x40,cpu->BC.b[HI],cpu->BC.b[HI])
- LD_BLOCK(0x48,cpu->BC.b[LO],cpu->BC.b[LO])
- LD_BLOCK(0x50,cpu->DE.b[HI],cpu->DE.b[HI])
- LD_BLOCK(0x58,cpu->DE.b[LO],cpu->DE.b[LO])
- LD_BLOCK(0x60,*H,cpu->HL.b[HI])
- LD_BLOCK(0x68,*L,cpu->HL.b[LO])
+ LD_BLOCK(0x40,cpu->BC.b.hi,cpu->BC.b.hi)
+ LD_BLOCK(0x48,cpu->BC.b.lo,cpu->BC.b.lo)
+ LD_BLOCK(0x50,cpu->DE.b.hi,cpu->DE.b.hi)
+ LD_BLOCK(0x58,cpu->DE.b.lo,cpu->DE.b.lo)
+ LD_BLOCK(0x60,*H,cpu->HL.b.hi)
+ LD_BLOCK(0x68,*L,cpu->HL.b.lo)
case 0x70: /* LD (HL),B */
TSTATE(7);
- OFFSET(off);
- POKE(*HL+off,cpu->BC.b[HI]);
+ OFFSET(*HL,off);
+ POKE(*HL+off,cpu->BC.b.hi);
break;
case 0x71: /* LD (HL),C */
TSTATE(7);
- OFFSET(off);
- POKE(*HL+off,cpu->BC.b[LO]);
+ OFFSET(*HL,off);
+ POKE(*HL+off,cpu->BC.b.lo);
break;
case 0x72: /* LD (HL),D */
TSTATE(7);
- OFFSET(off);
- POKE(*HL+off,cpu->DE.b[HI]);
+ OFFSET(*HL,off);
+ POKE(*HL+off,cpu->DE.b.hi);
break;
case 0x73: /* LD (HL),E */
TSTATE(7);
- OFFSET(off);
- POKE(*HL+off,cpu->DE.b[LO]);
+ OFFSET(*HL,off);
+ POKE(*HL+off,cpu->DE.b.lo);
break;
case 0x74: /* LD (HL),H */
TSTATE(7);
- OFFSET(off);
- POKE(*HL+off,cpu->HL.b[HI]);
+ OFFSET(*HL,off);
+ POKE(*HL+off,cpu->HL.b.hi);
break;
case 0x75: /* LD (HL),L */
TSTATE(7);
- OFFSET(off);
- POKE(*HL+off,cpu->HL.b[LO]);
+ OFFSET(*HL,off);
+ POKE(*HL+off,cpu->HL.b.lo);
break;
case 0x76: /* HALT */
@@ -2176,11 +2270,11 @@ void Z80_Decode(Z80 *cpu, Z80Byte opcode)
case 0x77: /* LD (HL),A */
TSTATE(7);
- OFFSET(off);
- POKE(*HL+off,cpu->AF.b[HI]);
+ OFFSET(*HL,off);
+ POKE(*HL+off,cpu->AF.b.hi);
break;
- LD_BLOCK(0x78,cpu->AF.b[HI],cpu->AF.b[HI])
+ LD_BLOCK(0x78,cpu->AF.b.hi,cpu->AF.b.hi)
ALU_BLOCK(0x80,ADD8)
ALU_BLOCK(0x88,ADC8)
@@ -2294,8 +2388,9 @@ void Z80_Decode(Z80 *cpu, Z80Byte opcode)
Z80Word port;
port=FETCH_BYTE;
- port|=(Z80Word)cpu->AF.b[HI]<<8;
- PRIV->pwrite(cpu,port,cpu->AF.b[HI]);
+ port|=(Z80Word)cpu->AF.b.hi<<8;
+ PRIV->memptr.w=port+1;
+ PRIV->pwrite(cpu,port,cpu->AF.b.hi);
}
else
cpu->PC++;
@@ -2341,8 +2436,9 @@ void Z80_Decode(Z80 *cpu, Z80Byte opcode)
Z80Word port;
port=FETCH_BYTE;
- port|=(Z80Word)cpu->AF.b[HI]<<8;
- cpu->AF.b[HI]=PRIV->pread(cpu,port);
+ port|=(Z80Word)cpu->AF.b.hi<<8;
+ cpu->AF.b.hi=PRIV->pread(cpu,port);
+ PRIV->memptr.w=port+1;
}
else
cpu->PC++;
@@ -2383,14 +2479,15 @@ void Z80_Decode(Z80 *cpu, Z80Byte opcode)
break;
case 0xe3: /* EX (SP),HL */
- {
+ {
Z80Word tmp;
TSTATE(19);
POP(tmp);
PUSH(*HL);
*HL=tmp;
- }
+ cpu->priv->memptr.w=tmp;
break;
+ }
case 0xe4: /* CALL PO,nnnn */
CALL_COND(!IS_P);