From cd09405e93abdb52507bd27e1ad4fa68b42b2c6b Mon Sep 17 00:00:00 2001 From: Ian C Date: Mon, 4 Sep 2006 00:19:24 +0000 Subject: ALU8 and ALU16 now validate against ZEXDOC. --- z80_decode.c | 40 ++++++++++++++++++++-------------------- z80_private.h | 3 +++ 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/z80_decode.c b/z80_decode.c index 81760ae..036e34e 100644 --- a/z80_decode.c +++ b/z80_decode.c @@ -150,7 +150,7 @@ static Z80Word FPEEKW(Z80 *cpu, Z80Word addr) */ #define SWAP(A,B) \ do { \ - Z80Word swap_tmp; \ + unsigned swap_tmp; \ swap_tmp=A; \ A=B; \ B=swap_tmp; \ @@ -162,11 +162,11 @@ do { \ #define ADD8(ONCE) \ do { \ Z80Byte VAL=ONCE; \ - Z80Word w; \ - w=cpu->AF.b[HI]+(Z80Word)VAL; \ + 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)&(cpu->AF.b[HI]^w)&0x80) cpu->AF.b[LO]|=P_Z80; \ + if ((VAL^cpu->AF.b[HI]^0x80)&(VAL^w)&0x80) cpu->AF.b[LO]|=P_Z80; \ SETHIDDEN(w); \ cpu->AF.b[HI]=w; \ } while(0) @@ -175,11 +175,11 @@ do { \ #define ADC8(ONCE) \ do { \ Z80Byte VAL=ONCE; \ - Z80Word w; \ - w=(cpu->AF.b[HI]+(Z80Word)VAL+CARRY)&0x1ff; \ + 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)&(cpu->AF.b[HI]^w)&0x80) cpu->AF.b[LO]|=P_Z80; \ + if ((VAL^cpu->AF.b[HI]^0x80)&(VAL^w)&0x80) cpu->AF.b[LO]|=P_Z80; \ SETHIDDEN(w); \ cpu->AF.b[HI]=w; \ } while(0) @@ -188,11 +188,11 @@ do { \ #define SUB8(ONCE) \ do { \ Z80Byte VAL=ONCE; \ - Z80Word w; \ - w=(cpu->AF.b[HI]-(Z80Word)VAL)&0x1ff; \ + 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]^0x80)&(cpu->AF.b[HI]^w)&0x80) cpu->AF.b[LO]|=P_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; \ } while(0) @@ -201,11 +201,11 @@ do { \ #define CMP8(ONCE) \ do { \ Z80Byte VAL=ONCE; \ - Z80Word w; \ - w=(cpu->AF.b[HI]-(Z80Word)VAL)&0x1ff; \ + 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]^0x80)&(cpu->AF.b[HI]^w)&0x80) cpu->AF.b[LO]|=P_Z80; \ + if ((VAL^cpu->AF.b[HI])&(cpu->AF.b[HI]^w)&0x80) cpu->AF.b[LO]|=P_Z80; \ SETHIDDEN(VAL); \ } while(0) @@ -213,11 +213,11 @@ do { \ #define SBC8(ONCE) \ do { \ Z80Byte VAL=ONCE; \ - Z80Word w; \ - w=(cpu->AF.b[HI]-(Z80Word)VAL-CARRY)&0x1ff; \ + 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]^0x80)&(cpu->AF.b[HI]^w)&0x80) cpu->AF.b[LO]|=P_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; \ } while(0) @@ -243,6 +243,7 @@ do { \ 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; \ @@ -257,11 +258,10 @@ do { \ Z80Val w; \ w=(REG)-(Z80Val)VAL-CARRY; \ cpu->AF.b[LO]=N_Z80; \ - if ((w&0xffff)==0) cpu->AF.b[LO]=Z_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))&(VAL^w)&0x8000) cpu->AF.b[LO]|=P_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; \ @@ -442,8 +442,8 @@ do { \ else \ { \ if (B==7) cpu->AF.b[LO]|=S_Z80; \ - if (B==5) cpu->AF.b[LO]|=B5_Z80; \ - if (B==3) cpu->AF.b[LO]|=B3_Z80; \ + else if (B==5) cpu->AF.b[LO]|=B5_Z80; \ + else if (B==3) cpu->AF.b[LO]|=B3_Z80; \ } \ } while(0) diff --git a/z80_private.h b/z80_private.h index 2797a8a..7a23d36 100644 --- a/z80_private.h +++ b/z80_private.h @@ -42,6 +42,9 @@ /* ---------------------------------------- TYPES */ + +typedef signed short sword; + typedef union { Z80Word w; -- cgit v1.2.3