From 52577a39f4fe6ee21c552a1da8ef5feff1ec9364 Mon Sep 17 00:00:00 2001 From: wavemotion-dave <75039837+wavemotion-dave@users.noreply.github.com> Date: Wed, 22 Dec 2021 17:58:42 -0500 Subject: [PATCH] V4.6a - more games added to the new CZ80 CPU core and speedup of Z80 core. --- ColecoDS.nds | Bin 788480 -> 788480 bytes Makefile | 2 +- arm9/source/colecoDS.c | 7 +- arm9/source/colecogeneric.c | 1 + arm9/source/cpu/z80/Codes.h | 562 ++++++++++++++++----------------- arm9/source/cpu/z80/CodesCB.h | 380 +++++++++++----------- arm9/source/cpu/z80/CodesED.h | 302 +++++++++--------- arm9/source/cpu/z80/CodesXX.h | 576 +++++++++++++++++----------------- arm9/source/cpu/z80/Z80.c | 393 +++++++++++------------ arm9/source/cpu/z80/Z80.h | 2 +- 10 files changed, 1116 insertions(+), 1109 deletions(-) diff --git a/ColecoDS.nds b/ColecoDS.nds index ffef15a12b12504b686e2831c78bd203257db48d..fe116ebe0b151b210e75bc3183da46172e44223e 100644 GIT binary patch delta 86154 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 PcrjquS@p_~LG}JWWE24` delta 88175 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 diff --git a/Makefile b/Makefile index 42d9f097..d40338c8 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ include $(DEVKITARM)/ds_rules export TARGET := ColecoDS export TOPDIR := $(CURDIR) -export VERSION := 4.6 +export VERSION := 4.6a ICON := -b $(CURDIR)/logo.bmp "ColecoDS $(VERSION);wavemotion-dave;https://github.com/wavemotion-dave/ColecoDS" diff --git a/arm9/source/colecoDS.c b/arm9/source/colecoDS.c index 557c4381..949e4393 100644 --- a/arm9/source/colecoDS.c +++ b/arm9/source/colecoDS.c @@ -44,6 +44,9 @@ #include "cpu/sn76496/SN76496.h" #include "cpu/sn76496/Fake_AY.h" +#include "cpu/z80/Z80.h" +extern Z80 CPU; + // -------------------------------------------------------------------------- // This is the full 64K coleco memory map. @@ -347,7 +350,9 @@ void ResetColecovision(void) sn76496W(0xB0 | 0x0F ,&aycol); // Write new Volume for Channel B (off) sn76496W(0xD0 | 0x0F ,&aycol); // Write new Volume for Channel C (off) - DrZ80_Reset(); // Reset the Z80 CPU Core + DrZ80_Reset(); // Reset the Z80 CPU Core + CPU.IPeriod = TMS9918_LINE; + ResetZ80(&CPU); // Reset the CZ80 core CPU memset(pColecoMem+0x2000, 0xFF, 0x6000); // Reset non-mapped area between BIOS and RAM - SGM RAM might map here diff --git a/arm9/source/colecogeneric.c b/arm9/source/colecogeneric.c index e9d843a5..37e779a3 100644 --- a/arm9/source/colecogeneric.c +++ b/arm9/source/colecogeneric.c @@ -805,6 +805,7 @@ void SetDefaultGameConfig(void) (file_crc == 0x260cdf98) || // Super Pac-Mans (file_crc == 0xae209065) || // Super Space Acer (file_crc == 0xbc8320a0) || // Uridium + (file_crc == 0xa7a8d25e) || // Vanguard (file_crc == 0x530c586f) // Vexxed ) { diff --git a/arm9/source/cpu/z80/Codes.h b/arm9/source/cpu/z80/Codes.h index 35162efc..1f101340 100644 --- a/arm9/source/cpu/z80/Codes.h +++ b/arm9/source/cpu/z80/Codes.h @@ -11,180 +11,180 @@ /** changes to this file. **/ /*************************************************************/ -case JR_NZ: if(R->AF.B.l&Z_FLAG) R->PC.W++; else { R->ICount-=5;M_JR; } break; -case JR_NC: if(R->AF.B.l&C_FLAG) R->PC.W++; else { R->ICount-=5;M_JR; } break; -case JR_Z: if(R->AF.B.l&Z_FLAG) { R->ICount-=5;M_JR; } else R->PC.W++; break; -case JR_C: if(R->AF.B.l&C_FLAG) { R->ICount-=5;M_JR; } else R->PC.W++; break; - -case JP_NZ: if(R->AF.B.l&Z_FLAG) R->PC.W+=2; else { M_JP; } break; -case JP_NC: if(R->AF.B.l&C_FLAG) R->PC.W+=2; else { M_JP; } break; -case JP_PO: if(R->AF.B.l&P_FLAG) R->PC.W+=2; else { M_JP; } break; -case JP_P: if(R->AF.B.l&S_FLAG) R->PC.W+=2; else { M_JP; } break; -case JP_Z: if(R->AF.B.l&Z_FLAG) { M_JP; } else R->PC.W+=2; break; -case JP_C: if(R->AF.B.l&C_FLAG) { M_JP; } else R->PC.W+=2; break; -case JP_PE: if(R->AF.B.l&P_FLAG) { M_JP; } else R->PC.W+=2; break; -case JP_M: if(R->AF.B.l&S_FLAG) { M_JP; } else R->PC.W+=2; break; - -case RET_NZ: if(!(R->AF.B.l&Z_FLAG)) { R->ICount-=6;M_RET; } break; -case RET_NC: if(!(R->AF.B.l&C_FLAG)) { R->ICount-=6;M_RET; } break; -case RET_PO: if(!(R->AF.B.l&P_FLAG)) { R->ICount-=6;M_RET; } break; -case RET_P: if(!(R->AF.B.l&S_FLAG)) { R->ICount-=6;M_RET; } break; -case RET_Z: if(R->AF.B.l&Z_FLAG) { R->ICount-=6;M_RET; } break; -case RET_C: if(R->AF.B.l&C_FLAG) { R->ICount-=6;M_RET; } break; -case RET_PE: if(R->AF.B.l&P_FLAG) { R->ICount-=6;M_RET; } break; -case RET_M: if(R->AF.B.l&S_FLAG) { R->ICount-=6;M_RET; } break; - -case CALL_NZ: if(R->AF.B.l&Z_FLAG) R->PC.W+=2; else { R->ICount-=7;M_CALL; } break; -case CALL_NC: if(R->AF.B.l&C_FLAG) R->PC.W+=2; else { R->ICount-=7;M_CALL; } break; -case CALL_PO: if(R->AF.B.l&P_FLAG) R->PC.W+=2; else { R->ICount-=7;M_CALL; } break; -case CALL_P: if(R->AF.B.l&S_FLAG) R->PC.W+=2; else { R->ICount-=7;M_CALL; } break; -case CALL_Z: if(R->AF.B.l&Z_FLAG) { R->ICount-=7;M_CALL; } else R->PC.W+=2; break; -case CALL_C: if(R->AF.B.l&C_FLAG) { R->ICount-=7;M_CALL; } else R->PC.W+=2; break; -case CALL_PE: if(R->AF.B.l&P_FLAG) { R->ICount-=7;M_CALL; } else R->PC.W+=2; break; -case CALL_M: if(R->AF.B.l&S_FLAG) { R->ICount-=7;M_CALL; } else R->PC.W+=2; break; - -case ADD_B: M_ADD(R->BC.B.h);break; -case ADD_C: M_ADD(R->BC.B.l);break; -case ADD_D: M_ADD(R->DE.B.h);break; -case ADD_E: M_ADD(R->DE.B.l);break; -case ADD_H: M_ADD(R->HL.B.h);break; -case ADD_L: M_ADD(R->HL.B.l);break; -case ADD_A: M_ADD(R->AF.B.h);break; -case ADD_xHL: I=RdZ80(R->HL.W);M_ADD(I);break; -case ADD_BYTE: I=OpZ80(R->PC.W++);M_ADD(I);break; - -case SUB_B: M_SUB(R->BC.B.h);break; -case SUB_C: M_SUB(R->BC.B.l);break; -case SUB_D: M_SUB(R->DE.B.h);break; -case SUB_E: M_SUB(R->DE.B.l);break; -case SUB_H: M_SUB(R->HL.B.h);break; -case SUB_L: M_SUB(R->HL.B.l);break; -case SUB_A: R->AF.B.h=0;R->AF.B.l=N_FLAG|Z_FLAG;break; -case SUB_xHL: I=RdZ80(R->HL.W);M_SUB(I);break; -case SUB_BYTE: I=OpZ80(R->PC.W++);M_SUB(I);break; - -case AND_B: M_AND(R->BC.B.h);break; -case AND_C: M_AND(R->BC.B.l);break; -case AND_D: M_AND(R->DE.B.h);break; -case AND_E: M_AND(R->DE.B.l);break; -case AND_H: M_AND(R->HL.B.h);break; -case AND_L: M_AND(R->HL.B.l);break; -case AND_A: M_AND(R->AF.B.h);break; -case AND_xHL: I=RdZ80(R->HL.W);M_AND(I);break; -case AND_BYTE: I=OpZ80(R->PC.W++);M_AND(I);break; - -case OR_B: M_OR(R->BC.B.h);break; -case OR_C: M_OR(R->BC.B.l);break; -case OR_D: M_OR(R->DE.B.h);break; -case OR_E: M_OR(R->DE.B.l);break; -case OR_H: M_OR(R->HL.B.h);break; -case OR_L: M_OR(R->HL.B.l);break; -case OR_A: M_OR(R->AF.B.h);break; -case OR_xHL: I=RdZ80(R->HL.W);M_OR(I);break; -case OR_BYTE: I=OpZ80(R->PC.W++);M_OR(I);break; - -case ADC_B: M_ADC(R->BC.B.h);break; -case ADC_C: M_ADC(R->BC.B.l);break; -case ADC_D: M_ADC(R->DE.B.h);break; -case ADC_E: M_ADC(R->DE.B.l);break; -case ADC_H: M_ADC(R->HL.B.h);break; -case ADC_L: M_ADC(R->HL.B.l);break; -case ADC_A: M_ADC(R->AF.B.h);break; -case ADC_xHL: I=RdZ80(R->HL.W);M_ADC(I);break; -case ADC_BYTE: I=OpZ80(R->PC.W++);M_ADC(I);break; - -case SBC_B: M_SBC(R->BC.B.h);break; -case SBC_C: M_SBC(R->BC.B.l);break; -case SBC_D: M_SBC(R->DE.B.h);break; -case SBC_E: M_SBC(R->DE.B.l);break; -case SBC_H: M_SBC(R->HL.B.h);break; -case SBC_L: M_SBC(R->HL.B.l);break; -case SBC_A: M_SBC(R->AF.B.h);break; -case SBC_xHL: I=RdZ80(R->HL.W);M_SBC(I);break; -case SBC_BYTE: I=OpZ80(R->PC.W++);M_SBC(I);break; - -case XOR_B: M_XOR(R->BC.B.h);break; -case XOR_C: M_XOR(R->BC.B.l);break; -case XOR_D: M_XOR(R->DE.B.h);break; -case XOR_E: M_XOR(R->DE.B.l);break; -case XOR_H: M_XOR(R->HL.B.h);break; -case XOR_L: M_XOR(R->HL.B.l);break; -case XOR_A: R->AF.B.h=0;R->AF.B.l=P_FLAG|Z_FLAG;break; -case XOR_xHL: I=RdZ80(R->HL.W);M_XOR(I);break; -case XOR_BYTE: I=OpZ80(R->PC.W++);M_XOR(I);break; - -case CP_B: M_CP(R->BC.B.h);break; -case CP_C: M_CP(R->BC.B.l);break; -case CP_D: M_CP(R->DE.B.h);break; -case CP_E: M_CP(R->DE.B.l);break; -case CP_H: M_CP(R->HL.B.h);break; -case CP_L: M_CP(R->HL.B.l);break; -case CP_A: R->AF.B.l=N_FLAG|Z_FLAG;break; -case CP_xHL: I=RdZ80(R->HL.W);M_CP(I);break; -case CP_BYTE: I=OpZ80(R->PC.W++);M_CP(I);break; +case JR_NZ: if(CPU.AF.B.l&Z_FLAG) CPU.PC.W++; else { CPU.ICount-=5;M_JR; } break; +case JR_NC: if(CPU.AF.B.l&C_FLAG) CPU.PC.W++; else { CPU.ICount-=5;M_JR; } break; +case JR_Z: if(CPU.AF.B.l&Z_FLAG) { CPU.ICount-=5;M_JR; } else CPU.PC.W++; break; +case JR_C: if(CPU.AF.B.l&C_FLAG) { CPU.ICount-=5;M_JR; } else CPU.PC.W++; break; + +case JP_NZ: if(CPU.AF.B.l&Z_FLAG) CPU.PC.W+=2; else { M_JP; } break; +case JP_NC: if(CPU.AF.B.l&C_FLAG) CPU.PC.W+=2; else { M_JP; } break; +case JP_PO: if(CPU.AF.B.l&P_FLAG) CPU.PC.W+=2; else { M_JP; } break; +case JP_P: if(CPU.AF.B.l&S_FLAG) CPU.PC.W+=2; else { M_JP; } break; +case JP_Z: if(CPU.AF.B.l&Z_FLAG) { M_JP; } else CPU.PC.W+=2; break; +case JP_C: if(CPU.AF.B.l&C_FLAG) { M_JP; } else CPU.PC.W+=2; break; +case JP_PE: if(CPU.AF.B.l&P_FLAG) { M_JP; } else CPU.PC.W+=2; break; +case JP_M: if(CPU.AF.B.l&S_FLAG) { M_JP; } else CPU.PC.W+=2; break; + +case RET_NZ: if(!(CPU.AF.B.l&Z_FLAG)) { CPU.ICount-=6;M_RET; } break; +case RET_NC: if(!(CPU.AF.B.l&C_FLAG)) { CPU.ICount-=6;M_RET; } break; +case RET_PO: if(!(CPU.AF.B.l&P_FLAG)) { CPU.ICount-=6;M_RET; } break; +case RET_P: if(!(CPU.AF.B.l&S_FLAG)) { CPU.ICount-=6;M_RET; } break; +case RET_Z: if(CPU.AF.B.l&Z_FLAG) { CPU.ICount-=6;M_RET; } break; +case RET_C: if(CPU.AF.B.l&C_FLAG) { CPU.ICount-=6;M_RET; } break; +case RET_PE: if(CPU.AF.B.l&P_FLAG) { CPU.ICount-=6;M_RET; } break; +case RET_M: if(CPU.AF.B.l&S_FLAG) { CPU.ICount-=6;M_RET; } break; + +case CALL_NZ: if(CPU.AF.B.l&Z_FLAG) CPU.PC.W+=2; else { CPU.ICount-=7;M_CALL; } break; +case CALL_NC: if(CPU.AF.B.l&C_FLAG) CPU.PC.W+=2; else { CPU.ICount-=7;M_CALL; } break; +case CALL_PO: if(CPU.AF.B.l&P_FLAG) CPU.PC.W+=2; else { CPU.ICount-=7;M_CALL; } break; +case CALL_P: if(CPU.AF.B.l&S_FLAG) CPU.PC.W+=2; else { CPU.ICount-=7;M_CALL; } break; +case CALL_Z: if(CPU.AF.B.l&Z_FLAG) { CPU.ICount-=7;M_CALL; } else CPU.PC.W+=2; break; +case CALL_C: if(CPU.AF.B.l&C_FLAG) { CPU.ICount-=7;M_CALL; } else CPU.PC.W+=2; break; +case CALL_PE: if(CPU.AF.B.l&P_FLAG) { CPU.ICount-=7;M_CALL; } else CPU.PC.W+=2; break; +case CALL_M: if(CPU.AF.B.l&S_FLAG) { CPU.ICount-=7;M_CALL; } else CPU.PC.W+=2; break; + +case ADD_B: M_ADD(CPU.BC.B.h);break; +case ADD_C: M_ADD(CPU.BC.B.l);break; +case ADD_D: M_ADD(CPU.DE.B.h);break; +case ADD_E: M_ADD(CPU.DE.B.l);break; +case ADD_H: M_ADD(CPU.HL.B.h);break; +case ADD_L: M_ADD(CPU.HL.B.l);break; +case ADD_A: M_ADD(CPU.AF.B.h);break; +case ADD_xHL: I=RdZ80(CPU.HL.W);M_ADD(I);break; +case ADD_BYTE: I=OpZ80(CPU.PC.W++);M_ADD(I);break; + +case SUB_B: M_SUB(CPU.BC.B.h);break; +case SUB_C: M_SUB(CPU.BC.B.l);break; +case SUB_D: M_SUB(CPU.DE.B.h);break; +case SUB_E: M_SUB(CPU.DE.B.l);break; +case SUB_H: M_SUB(CPU.HL.B.h);break; +case SUB_L: M_SUB(CPU.HL.B.l);break; +case SUB_A: CPU.AF.B.h=0;CPU.AF.B.l=N_FLAG|Z_FLAG;break; +case SUB_xHL: I=RdZ80(CPU.HL.W);M_SUB(I);break; +case SUB_BYTE: I=OpZ80(CPU.PC.W++);M_SUB(I);break; + +case AND_B: M_AND(CPU.BC.B.h);break; +case AND_C: M_AND(CPU.BC.B.l);break; +case AND_D: M_AND(CPU.DE.B.h);break; +case AND_E: M_AND(CPU.DE.B.l);break; +case AND_H: M_AND(CPU.HL.B.h);break; +case AND_L: M_AND(CPU.HL.B.l);break; +case AND_A: M_AND(CPU.AF.B.h);break; +case AND_xHL: I=RdZ80(CPU.HL.W);M_AND(I);break; +case AND_BYTE: I=OpZ80(CPU.PC.W++);M_AND(I);break; + +case OR_B: M_OR(CPU.BC.B.h);break; +case OR_C: M_OR(CPU.BC.B.l);break; +case OR_D: M_OR(CPU.DE.B.h);break; +case OR_E: M_OR(CPU.DE.B.l);break; +case OR_H: M_OR(CPU.HL.B.h);break; +case OR_L: M_OR(CPU.HL.B.l);break; +case OR_A: M_OR(CPU.AF.B.h);break; +case OR_xHL: I=RdZ80(CPU.HL.W);M_OR(I);break; +case OR_BYTE: I=OpZ80(CPU.PC.W++);M_OR(I);break; + +case ADC_B: M_ADC(CPU.BC.B.h);break; +case ADC_C: M_ADC(CPU.BC.B.l);break; +case ADC_D: M_ADC(CPU.DE.B.h);break; +case ADC_E: M_ADC(CPU.DE.B.l);break; +case ADC_H: M_ADC(CPU.HL.B.h);break; +case ADC_L: M_ADC(CPU.HL.B.l);break; +case ADC_A: M_ADC(CPU.AF.B.h);break; +case ADC_xHL: I=RdZ80(CPU.HL.W);M_ADC(I);break; +case ADC_BYTE: I=OpZ80(CPU.PC.W++);M_ADC(I);break; + +case SBC_B: M_SBC(CPU.BC.B.h);break; +case SBC_C: M_SBC(CPU.BC.B.l);break; +case SBC_D: M_SBC(CPU.DE.B.h);break; +case SBC_E: M_SBC(CPU.DE.B.l);break; +case SBC_H: M_SBC(CPU.HL.B.h);break; +case SBC_L: M_SBC(CPU.HL.B.l);break; +case SBC_A: M_SBC(CPU.AF.B.h);break; +case SBC_xHL: I=RdZ80(CPU.HL.W);M_SBC(I);break; +case SBC_BYTE: I=OpZ80(CPU.PC.W++);M_SBC(I);break; + +case XOR_B: M_XOR(CPU.BC.B.h);break; +case XOR_C: M_XOR(CPU.BC.B.l);break; +case XOR_D: M_XOR(CPU.DE.B.h);break; +case XOR_E: M_XOR(CPU.DE.B.l);break; +case XOR_H: M_XOR(CPU.HL.B.h);break; +case XOR_L: M_XOR(CPU.HL.B.l);break; +case XOR_A: CPU.AF.B.h=0;CPU.AF.B.l=P_FLAG|Z_FLAG;break; +case XOR_xHL: I=RdZ80(CPU.HL.W);M_XOR(I);break; +case XOR_BYTE: I=OpZ80(CPU.PC.W++);M_XOR(I);break; + +case CP_B: M_CP(CPU.BC.B.h);break; +case CP_C: M_CP(CPU.BC.B.l);break; +case CP_D: M_CP(CPU.DE.B.h);break; +case CP_E: M_CP(CPU.DE.B.l);break; +case CP_H: M_CP(CPU.HL.B.h);break; +case CP_L: M_CP(CPU.HL.B.l);break; +case CP_A: CPU.AF.B.l=N_FLAG|Z_FLAG;break; +case CP_xHL: I=RdZ80(CPU.HL.W);M_CP(I);break; +case CP_BYTE: I=OpZ80(CPU.PC.W++);M_CP(I);break; case LD_BC_WORD: M_LDWORD(BC);break; case LD_DE_WORD: M_LDWORD(DE);break; case LD_HL_WORD: M_LDWORD(HL);break; case LD_SP_WORD: M_LDWORD(SP);break; -case LD_PC_HL: R->PC.W=R->HL.W;JumpZ80(R->PC.W);break; -case LD_SP_HL: R->SP.W=R->HL.W;break; -case LD_A_xBC: R->AF.B.h=RdZ80(R->BC.W);break; -case LD_A_xDE: R->AF.B.h=RdZ80(R->DE.W);break; +case LD_PC_HL: CPU.PC.W=CPU.HL.W;JumpZ80(CPU.PC.W);break; +case LD_SP_HL: CPU.SP.W=CPU.HL.W;break; +case LD_A_xBC: CPU.AF.B.h=RdZ80(CPU.BC.W);break; +case LD_A_xDE: CPU.AF.B.h=RdZ80(CPU.DE.W);break; case ADD_HL_BC: M_ADDW(HL,BC);break; case ADD_HL_DE: M_ADDW(HL,DE);break; case ADD_HL_HL: M_ADDW(HL,HL);break; case ADD_HL_SP: M_ADDW(HL,SP);break; -case DEC_BC: R->BC.W--;break; -case DEC_DE: R->DE.W--;break; -case DEC_HL: R->HL.W--;break; -case DEC_SP: R->SP.W--;break; - -case INC_BC: R->BC.W++;break; -case INC_DE: R->DE.W++;break; -case INC_HL: R->HL.W++;break; -case INC_SP: R->SP.W++;break; - -case DEC_B: M_DEC(R->BC.B.h);break; -case DEC_C: M_DEC(R->BC.B.l);break; -case DEC_D: M_DEC(R->DE.B.h);break; -case DEC_E: M_DEC(R->DE.B.l);break; -case DEC_H: M_DEC(R->HL.B.h);break; -case DEC_L: M_DEC(R->HL.B.l);break; -case DEC_A: M_DEC(R->AF.B.h);break; -case DEC_xHL: I=RdZ80(R->HL.W);M_DEC(I);WrZ80(R->HL.W,I);break; - -case INC_B: M_INC(R->BC.B.h);break; -case INC_C: M_INC(R->BC.B.l);break; -case INC_D: M_INC(R->DE.B.h);break; -case INC_E: M_INC(R->DE.B.l);break; -case INC_H: M_INC(R->HL.B.h);break; -case INC_L: M_INC(R->HL.B.l);break; -case INC_A: M_INC(R->AF.B.h);break; -case INC_xHL: I=RdZ80(R->HL.W);M_INC(I);WrZ80(R->HL.W,I);break; +case DEC_BC: CPU.BC.W--;break; +case DEC_DE: CPU.DE.W--;break; +case DEC_HL: CPU.HL.W--;break; +case DEC_SP: CPU.SP.W--;break; + +case INC_BC: CPU.BC.W++;break; +case INC_DE: CPU.DE.W++;break; +case INC_HL: CPU.HL.W++;break; +case INC_SP: CPU.SP.W++;break; + +case DEC_B: M_DEC(CPU.BC.B.h);break; +case DEC_C: M_DEC(CPU.BC.B.l);break; +case DEC_D: M_DEC(CPU.DE.B.h);break; +case DEC_E: M_DEC(CPU.DE.B.l);break; +case DEC_H: M_DEC(CPU.HL.B.h);break; +case DEC_L: M_DEC(CPU.HL.B.l);break; +case DEC_A: M_DEC(CPU.AF.B.h);break; +case DEC_xHL: I=RdZ80(CPU.HL.W);M_DEC(I);WrZ80(CPU.HL.W,I);break; + +case INC_B: M_INC(CPU.BC.B.h);break; +case INC_C: M_INC(CPU.BC.B.l);break; +case INC_D: M_INC(CPU.DE.B.h);break; +case INC_E: M_INC(CPU.DE.B.l);break; +case INC_H: M_INC(CPU.HL.B.h);break; +case INC_L: M_INC(CPU.HL.B.l);break; +case INC_A: M_INC(CPU.AF.B.h);break; +case INC_xHL: I=RdZ80(CPU.HL.W);M_INC(I);WrZ80(CPU.HL.W,I);break; case RLCA: - I=R->AF.B.h&0x80? C_FLAG:0; - R->AF.B.h=(R->AF.B.h<<1)|I; - R->AF.B.l=(R->AF.B.l&~(C_FLAG|N_FLAG|H_FLAG))|I; + I=CPU.AF.B.h&0x80? C_FLAG:0; + CPU.AF.B.h=(CPU.AF.B.h<<1)|I; + CPU.AF.B.l=(CPU.AF.B.l&~(C_FLAG|N_FLAG|H_FLAG))|I; break; case RLA: - I=R->AF.B.h&0x80? C_FLAG:0; - R->AF.B.h=(R->AF.B.h<<1)|(R->AF.B.l&C_FLAG); - R->AF.B.l=(R->AF.B.l&~(C_FLAG|N_FLAG|H_FLAG))|I; + I=CPU.AF.B.h&0x80? C_FLAG:0; + CPU.AF.B.h=(CPU.AF.B.h<<1)|(CPU.AF.B.l&C_FLAG); + CPU.AF.B.l=(CPU.AF.B.l&~(C_FLAG|N_FLAG|H_FLAG))|I; break; case RRCA: - I=R->AF.B.h&0x01; - R->AF.B.h=(R->AF.B.h>>1)|(I? 0x80:0); - R->AF.B.l=(R->AF.B.l&~(C_FLAG|N_FLAG|H_FLAG))|I; + I=CPU.AF.B.h&0x01; + CPU.AF.B.h=(CPU.AF.B.h>>1)|(I? 0x80:0); + CPU.AF.B.l=(CPU.AF.B.l&~(C_FLAG|N_FLAG|H_FLAG))|I; break; case RRA: - I=R->AF.B.h&0x01; - R->AF.B.h=(R->AF.B.h>>1)|(R->AF.B.l&C_FLAG? 0x80:0); - R->AF.B.l=(R->AF.B.l&~(C_FLAG|N_FLAG|H_FLAG))|I; + I=CPU.AF.B.h&0x01; + CPU.AF.B.h=(CPU.AF.B.h>>1)|(CPU.AF.B.l&C_FLAG? 0x80:0); + CPU.AF.B.l=(CPU.AF.B.l&~(C_FLAG|N_FLAG|H_FLAG))|I; break; case RST00: M_RST(0x0000);break; @@ -206,180 +206,180 @@ case POP_DE: M_POP(DE);break; case POP_HL: M_POP(HL);break; case POP_AF: M_POP(AF);break; -case DJNZ: if(--R->BC.B.h) { R->ICount-=5;M_JR; } else R->PC.W++;break; +case DJNZ: if(--CPU.BC.B.h) { CPU.ICount-=5;M_JR; } else CPU.PC.W++;break; case JP: M_JP;break; case JR: M_JR;break; case CALL: M_CALL;break; case RET: M_RET;break; case SCF: S(C_FLAG);R(N_FLAG|H_FLAG);break; -case CPL: R->AF.B.h=~R->AF.B.h;S(N_FLAG|H_FLAG);break; +case CPL: CPU.AF.B.h=~CPU.AF.B.h;S(N_FLAG|H_FLAG);break; case NOP: break; -case OUTA: I=OpZ80(R->PC.W++);OutZ80(I|(R->AF.W&0xFF00),R->AF.B.h);break; -case INA: I=OpZ80(R->PC.W++);R->AF.B.h=InZ80(I|(R->AF.W&0xFF00));break; +case OUTA: I=OpZ80(CPU.PC.W++);OutZ80(I|(CPU.AF.W&0xFF00),CPU.AF.B.h);break; +case INA: I=OpZ80(CPU.PC.W++);CPU.AF.B.h=InZ80(I|(CPU.AF.W&0xFF00));break; case HALT: - R->PC.W--; - R->IFF|=IFF_HALT; - R->IBackup=0; - R->ICount=0; + CPU.PC.W--; + CPU.IFF|=IFF_HALT; + CPU.IBackup=0; + CPU.ICount=0; break; case DI: - if(R->IFF&IFF_EI) R->ICount+=R->IBackup-1; - R->IFF&=~(IFF_1|IFF_2|IFF_EI); + if(CPU.IFF&IFF_EI) CPU.ICount+=CPU.IBackup-1; + CPU.IFF&=~(IFF_1|IFF_2|IFF_EI); break; case EI: - if(!(R->IFF&(IFF_1|IFF_EI))) + if(!(CPU.IFF&(IFF_1|IFF_EI))) { - R->IFF|=IFF_2|IFF_EI; - R->IBackup=R->ICount; - R->ICount=1; + CPU.IFF|=IFF_2|IFF_EI; + CPU.IBackup=CPU.ICount; + CPU.ICount=1; } break; case CCF: - R->AF.B.l^=C_FLAG;R(N_FLAG|H_FLAG); - R->AF.B.l|=R->AF.B.l&C_FLAG? 0:H_FLAG; + CPU.AF.B.l^=C_FLAG;R(N_FLAG|H_FLAG); + CPU.AF.B.l|=CPU.AF.B.l&C_FLAG? 0:H_FLAG; break; case EXX: - J.W=R->BC.W;R->BC.W=R->BC1.W;R->BC1.W=J.W; - J.W=R->DE.W;R->DE.W=R->DE1.W;R->DE1.W=J.W; - J.W=R->HL.W;R->HL.W=R->HL1.W;R->HL1.W=J.W; + J.W=CPU.BC.W;CPU.BC.W=CPU.BC1.W;CPU.BC1.W=J.W; + J.W=CPU.DE.W;CPU.DE.W=CPU.DE1.W;CPU.DE1.W=J.W; + J.W=CPU.HL.W;CPU.HL.W=CPU.HL1.W;CPU.HL1.W=J.W; break; -case EX_DE_HL: J.W=R->DE.W;R->DE.W=R->HL.W;R->HL.W=J.W;break; -case EX_AF_AF: J.W=R->AF.W;R->AF.W=R->AF1.W;R->AF1.W=J.W;break; +case EX_DE_HL: J.W=CPU.DE.W;CPU.DE.W=CPU.HL.W;CPU.HL.W=J.W;break; +case EX_AF_AF: J.W=CPU.AF.W;CPU.AF.W=CPU.AF1.W;CPU.AF1.W=J.W;break; -case LD_B_B: R->BC.B.h=R->BC.B.h;break; -case LD_C_B: R->BC.B.l=R->BC.B.h;break; -case LD_D_B: R->DE.B.h=R->BC.B.h;break; -case LD_E_B: R->DE.B.l=R->BC.B.h;break; -case LD_H_B: R->HL.B.h=R->BC.B.h;break; -case LD_L_B: R->HL.B.l=R->BC.B.h;break; -case LD_A_B: R->AF.B.h=R->BC.B.h;break; -case LD_xHL_B: WrZ80(R->HL.W,R->BC.B.h);break; - -case LD_B_C: R->BC.B.h=R->BC.B.l;break; -case LD_C_C: R->BC.B.l=R->BC.B.l;break; -case LD_D_C: R->DE.B.h=R->BC.B.l;break; -case LD_E_C: R->DE.B.l=R->BC.B.l;break; -case LD_H_C: R->HL.B.h=R->BC.B.l;break; -case LD_L_C: R->HL.B.l=R->BC.B.l;break; -case LD_A_C: R->AF.B.h=R->BC.B.l;break; -case LD_xHL_C: WrZ80(R->HL.W,R->BC.B.l);break; - -case LD_B_D: R->BC.B.h=R->DE.B.h;break; -case LD_C_D: R->BC.B.l=R->DE.B.h;break; -case LD_D_D: R->DE.B.h=R->DE.B.h;break; -case LD_E_D: R->DE.B.l=R->DE.B.h;break; -case LD_H_D: R->HL.B.h=R->DE.B.h;break; -case LD_L_D: R->HL.B.l=R->DE.B.h;break; -case LD_A_D: R->AF.B.h=R->DE.B.h;break; -case LD_xHL_D: WrZ80(R->HL.W,R->DE.B.h);break; - -case LD_B_E: R->BC.B.h=R->DE.B.l;break; -case LD_C_E: R->BC.B.l=R->DE.B.l;break; -case LD_D_E: R->DE.B.h=R->DE.B.l;break; -case LD_E_E: R->DE.B.l=R->DE.B.l;break; -case LD_H_E: R->HL.B.h=R->DE.B.l;break; -case LD_L_E: R->HL.B.l=R->DE.B.l;break; -case LD_A_E: R->AF.B.h=R->DE.B.l;break; -case LD_xHL_E: WrZ80(R->HL.W,R->DE.B.l);break; - -case LD_B_H: R->BC.B.h=R->HL.B.h;break; -case LD_C_H: R->BC.B.l=R->HL.B.h;break; -case LD_D_H: R->DE.B.h=R->HL.B.h;break; -case LD_E_H: R->DE.B.l=R->HL.B.h;break; -case LD_H_H: R->HL.B.h=R->HL.B.h;break; -case LD_L_H: R->HL.B.l=R->HL.B.h;break; -case LD_A_H: R->AF.B.h=R->HL.B.h;break; -case LD_xHL_H: WrZ80(R->HL.W,R->HL.B.h);break; - -case LD_B_L: R->BC.B.h=R->HL.B.l;break; -case LD_C_L: R->BC.B.l=R->HL.B.l;break; -case LD_D_L: R->DE.B.h=R->HL.B.l;break; -case LD_E_L: R->DE.B.l=R->HL.B.l;break; -case LD_H_L: R->HL.B.h=R->HL.B.l;break; -case LD_L_L: R->HL.B.l=R->HL.B.l;break; -case LD_A_L: R->AF.B.h=R->HL.B.l;break; -case LD_xHL_L: WrZ80(R->HL.W,R->HL.B.l);break; - -case LD_B_A: R->BC.B.h=R->AF.B.h;break; -case LD_C_A: R->BC.B.l=R->AF.B.h;break; -case LD_D_A: R->DE.B.h=R->AF.B.h;break; -case LD_E_A: R->DE.B.l=R->AF.B.h;break; -case LD_H_A: R->HL.B.h=R->AF.B.h;break; -case LD_L_A: R->HL.B.l=R->AF.B.h;break; -case LD_A_A: R->AF.B.h=R->AF.B.h;break; -case LD_xHL_A: WrZ80(R->HL.W,R->AF.B.h);break; - -case LD_xBC_A: WrZ80(R->BC.W,R->AF.B.h);break; -case LD_xDE_A: WrZ80(R->DE.W,R->AF.B.h);break; - -case LD_B_xHL: R->BC.B.h=RdZ80(R->HL.W);break; -case LD_C_xHL: R->BC.B.l=RdZ80(R->HL.W);break; -case LD_D_xHL: R->DE.B.h=RdZ80(R->HL.W);break; -case LD_E_xHL: R->DE.B.l=RdZ80(R->HL.W);break; -case LD_H_xHL: R->HL.B.h=RdZ80(R->HL.W);break; -case LD_L_xHL: R->HL.B.l=RdZ80(R->HL.W);break; -case LD_A_xHL: R->AF.B.h=RdZ80(R->HL.W);break; - -case LD_B_BYTE: R->BC.B.h=OpZ80(R->PC.W++);break; -case LD_C_BYTE: R->BC.B.l=OpZ80(R->PC.W++);break; -case LD_D_BYTE: R->DE.B.h=OpZ80(R->PC.W++);break; -case LD_E_BYTE: R->DE.B.l=OpZ80(R->PC.W++);break; -case LD_H_BYTE: R->HL.B.h=OpZ80(R->PC.W++);break; -case LD_L_BYTE: R->HL.B.l=OpZ80(R->PC.W++);break; -case LD_A_BYTE: R->AF.B.h=OpZ80(R->PC.W++);break; -case LD_xHL_BYTE: WrZ80(R->HL.W,OpZ80(R->PC.W++));break; +case LD_B_B: CPU.BC.B.h=CPU.BC.B.h;break; +case LD_C_B: CPU.BC.B.l=CPU.BC.B.h;break; +case LD_D_B: CPU.DE.B.h=CPU.BC.B.h;break; +case LD_E_B: CPU.DE.B.l=CPU.BC.B.h;break; +case LD_H_B: CPU.HL.B.h=CPU.BC.B.h;break; +case LD_L_B: CPU.HL.B.l=CPU.BC.B.h;break; +case LD_A_B: CPU.AF.B.h=CPU.BC.B.h;break; +case LD_xHL_B: WrZ80(CPU.HL.W,CPU.BC.B.h);break; + +case LD_B_C: CPU.BC.B.h=CPU.BC.B.l;break; +case LD_C_C: CPU.BC.B.l=CPU.BC.B.l;break; +case LD_D_C: CPU.DE.B.h=CPU.BC.B.l;break; +case LD_E_C: CPU.DE.B.l=CPU.BC.B.l;break; +case LD_H_C: CPU.HL.B.h=CPU.BC.B.l;break; +case LD_L_C: CPU.HL.B.l=CPU.BC.B.l;break; +case LD_A_C: CPU.AF.B.h=CPU.BC.B.l;break; +case LD_xHL_C: WrZ80(CPU.HL.W,CPU.BC.B.l);break; + +case LD_B_D: CPU.BC.B.h=CPU.DE.B.h;break; +case LD_C_D: CPU.BC.B.l=CPU.DE.B.h;break; +case LD_D_D: CPU.DE.B.h=CPU.DE.B.h;break; +case LD_E_D: CPU.DE.B.l=CPU.DE.B.h;break; +case LD_H_D: CPU.HL.B.h=CPU.DE.B.h;break; +case LD_L_D: CPU.HL.B.l=CPU.DE.B.h;break; +case LD_A_D: CPU.AF.B.h=CPU.DE.B.h;break; +case LD_xHL_D: WrZ80(CPU.HL.W,CPU.DE.B.h);break; + +case LD_B_E: CPU.BC.B.h=CPU.DE.B.l;break; +case LD_C_E: CPU.BC.B.l=CPU.DE.B.l;break; +case LD_D_E: CPU.DE.B.h=CPU.DE.B.l;break; +case LD_E_E: CPU.DE.B.l=CPU.DE.B.l;break; +case LD_H_E: CPU.HL.B.h=CPU.DE.B.l;break; +case LD_L_E: CPU.HL.B.l=CPU.DE.B.l;break; +case LD_A_E: CPU.AF.B.h=CPU.DE.B.l;break; +case LD_xHL_E: WrZ80(CPU.HL.W,CPU.DE.B.l);break; + +case LD_B_H: CPU.BC.B.h=CPU.HL.B.h;break; +case LD_C_H: CPU.BC.B.l=CPU.HL.B.h;break; +case LD_D_H: CPU.DE.B.h=CPU.HL.B.h;break; +case LD_E_H: CPU.DE.B.l=CPU.HL.B.h;break; +case LD_H_H: CPU.HL.B.h=CPU.HL.B.h;break; +case LD_L_H: CPU.HL.B.l=CPU.HL.B.h;break; +case LD_A_H: CPU.AF.B.h=CPU.HL.B.h;break; +case LD_xHL_H: WrZ80(CPU.HL.W,CPU.HL.B.h);break; + +case LD_B_L: CPU.BC.B.h=CPU.HL.B.l;break; +case LD_C_L: CPU.BC.B.l=CPU.HL.B.l;break; +case LD_D_L: CPU.DE.B.h=CPU.HL.B.l;break; +case LD_E_L: CPU.DE.B.l=CPU.HL.B.l;break; +case LD_H_L: CPU.HL.B.h=CPU.HL.B.l;break; +case LD_L_L: CPU.HL.B.l=CPU.HL.B.l;break; +case LD_A_L: CPU.AF.B.h=CPU.HL.B.l;break; +case LD_xHL_L: WrZ80(CPU.HL.W,CPU.HL.B.l);break; + +case LD_B_A: CPU.BC.B.h=CPU.AF.B.h;break; +case LD_C_A: CPU.BC.B.l=CPU.AF.B.h;break; +case LD_D_A: CPU.DE.B.h=CPU.AF.B.h;break; +case LD_E_A: CPU.DE.B.l=CPU.AF.B.h;break; +case LD_H_A: CPU.HL.B.h=CPU.AF.B.h;break; +case LD_L_A: CPU.HL.B.l=CPU.AF.B.h;break; +case LD_A_A: CPU.AF.B.h=CPU.AF.B.h;break; +case LD_xHL_A: WrZ80(CPU.HL.W,CPU.AF.B.h);break; + +case LD_xBC_A: WrZ80(CPU.BC.W,CPU.AF.B.h);break; +case LD_xDE_A: WrZ80(CPU.DE.W,CPU.AF.B.h);break; + +case LD_B_xHL: CPU.BC.B.h=RdZ80(CPU.HL.W);break; +case LD_C_xHL: CPU.BC.B.l=RdZ80(CPU.HL.W);break; +case LD_D_xHL: CPU.DE.B.h=RdZ80(CPU.HL.W);break; +case LD_E_xHL: CPU.DE.B.l=RdZ80(CPU.HL.W);break; +case LD_H_xHL: CPU.HL.B.h=RdZ80(CPU.HL.W);break; +case LD_L_xHL: CPU.HL.B.l=RdZ80(CPU.HL.W);break; +case LD_A_xHL: CPU.AF.B.h=RdZ80(CPU.HL.W);break; + +case LD_B_BYTE: CPU.BC.B.h=OpZ80(CPU.PC.W++);break; +case LD_C_BYTE: CPU.BC.B.l=OpZ80(CPU.PC.W++);break; +case LD_D_BYTE: CPU.DE.B.h=OpZ80(CPU.PC.W++);break; +case LD_E_BYTE: CPU.DE.B.l=OpZ80(CPU.PC.W++);break; +case LD_H_BYTE: CPU.HL.B.h=OpZ80(CPU.PC.W++);break; +case LD_L_BYTE: CPU.HL.B.l=OpZ80(CPU.PC.W++);break; +case LD_A_BYTE: CPU.AF.B.h=OpZ80(CPU.PC.W++);break; +case LD_xHL_BYTE: WrZ80(CPU.HL.W,OpZ80(CPU.PC.W++));break; case LD_xWORD_HL: - J.B.l=OpZ80(R->PC.W++); - J.B.h=OpZ80(R->PC.W++); - WrZ80(J.W++,R->HL.B.l); - WrZ80(J.W,R->HL.B.h); + J.B.l=OpZ80(CPU.PC.W++); + J.B.h=OpZ80(CPU.PC.W++); + WrZ80(J.W++,CPU.HL.B.l); + WrZ80(J.W,CPU.HL.B.h); break; case LD_HL_xWORD: - J.B.l=OpZ80(R->PC.W++); - J.B.h=OpZ80(R->PC.W++); - R->HL.B.l=RdZ80(J.W++); - R->HL.B.h=RdZ80(J.W); + J.B.l=OpZ80(CPU.PC.W++); + J.B.h=OpZ80(CPU.PC.W++); + CPU.HL.B.l=RdZ80(J.W++); + CPU.HL.B.h=RdZ80(J.W); break; case LD_A_xWORD: - J.B.l=OpZ80(R->PC.W++); - J.B.h=OpZ80(R->PC.W++); - R->AF.B.h=RdZ80(J.W); + J.B.l=OpZ80(CPU.PC.W++); + J.B.h=OpZ80(CPU.PC.W++); + CPU.AF.B.h=RdZ80(J.W); break; case LD_xWORD_A: - J.B.l=OpZ80(R->PC.W++); - J.B.h=OpZ80(R->PC.W++); - WrZ80(J.W,R->AF.B.h); + J.B.l=OpZ80(CPU.PC.W++); + J.B.h=OpZ80(CPU.PC.W++); + WrZ80(J.W,CPU.AF.B.h); break; case EX_HL_xSP: - J.B.l=RdZ80(R->SP.W);WrZ80(R->SP.W++,R->HL.B.l); - J.B.h=RdZ80(R->SP.W);WrZ80(R->SP.W--,R->HL.B.h); - R->HL.W=J.W; + J.B.l=RdZ80(CPU.SP.W);WrZ80(CPU.SP.W++,CPU.HL.B.l); + J.B.h=RdZ80(CPU.SP.W);WrZ80(CPU.SP.W--,CPU.HL.B.h); + CPU.HL.W=J.W; break; case DAA: - J.W=R->AF.B.h; - if(R->AF.B.l&C_FLAG) J.W|=256; - if(R->AF.B.l&H_FLAG) J.W|=512; - if(R->AF.B.l&N_FLAG) J.W|=1024; - R->AF.W=DAATable[J.W]; + J.W=CPU.AF.B.h; + if(CPU.AF.B.l&C_FLAG) J.W|=256; + if(CPU.AF.B.l&H_FLAG) J.W|=512; + if(CPU.AF.B.l&N_FLAG) J.W|=1024; + CPU.AF.W=DAATable[J.W]; break; default: - if(R->TrapBadOps) + if(CPU.TrapBadOps) printf ( "[Z80 %lX] Unrecognized instruction: %02X at PC=%04X\n", - (long)R->User,OpZ80(R->PC.W-1),R->PC.W-1 + (long)CPU.User,OpZ80(CPU.PC.W-1),CPU.PC.W-1 ); break; diff --git a/arm9/source/cpu/z80/CodesCB.h b/arm9/source/cpu/z80/CodesCB.h index 6db53c44..418916d0 100644 --- a/arm9/source/cpu/z80/CodesCB.h +++ b/arm9/source/cpu/z80/CodesCB.h @@ -11,194 +11,194 @@ /** changes to this file. **/ /*************************************************************/ -case RLC_B: M_RLC(R->BC.B.h);break; case RLC_C: M_RLC(R->BC.B.l);break; -case RLC_D: M_RLC(R->DE.B.h);break; case RLC_E: M_RLC(R->DE.B.l);break; -case RLC_H: M_RLC(R->HL.B.h);break; case RLC_L: M_RLC(R->HL.B.l);break; -case RLC_xHL: I=RdZ80(R->HL.W);M_RLC(I);WrZ80(R->HL.W,I);break; -case RLC_A: M_RLC(R->AF.B.h);break; - -case RRC_B: M_RRC(R->BC.B.h);break; case RRC_C: M_RRC(R->BC.B.l);break; -case RRC_D: M_RRC(R->DE.B.h);break; case RRC_E: M_RRC(R->DE.B.l);break; -case RRC_H: M_RRC(R->HL.B.h);break; case RRC_L: M_RRC(R->HL.B.l);break; -case RRC_xHL: I=RdZ80(R->HL.W);M_RRC(I);WrZ80(R->HL.W,I);break; -case RRC_A: M_RRC(R->AF.B.h);break; - -case RL_B: M_RL(R->BC.B.h);break; case RL_C: M_RL(R->BC.B.l);break; -case RL_D: M_RL(R->DE.B.h);break; case RL_E: M_RL(R->DE.B.l);break; -case RL_H: M_RL(R->HL.B.h);break; case RL_L: M_RL(R->HL.B.l);break; -case RL_xHL: I=RdZ80(R->HL.W);M_RL(I);WrZ80(R->HL.W,I);break; -case RL_A: M_RL(R->AF.B.h);break; - -case RR_B: M_RR(R->BC.B.h);break; case RR_C: M_RR(R->BC.B.l);break; -case RR_D: M_RR(R->DE.B.h);break; case RR_E: M_RR(R->DE.B.l);break; -case RR_H: M_RR(R->HL.B.h);break; case RR_L: M_RR(R->HL.B.l);break; -case RR_xHL: I=RdZ80(R->HL.W);M_RR(I);WrZ80(R->HL.W,I);break; -case RR_A: M_RR(R->AF.B.h);break; - -case SLA_B: M_SLA(R->BC.B.h);break; case SLA_C: M_SLA(R->BC.B.l);break; -case SLA_D: M_SLA(R->DE.B.h);break; case SLA_E: M_SLA(R->DE.B.l);break; -case SLA_H: M_SLA(R->HL.B.h);break; case SLA_L: M_SLA(R->HL.B.l);break; -case SLA_xHL: I=RdZ80(R->HL.W);M_SLA(I);WrZ80(R->HL.W,I);break; -case SLA_A: M_SLA(R->AF.B.h);break; - -case SRA_B: M_SRA(R->BC.B.h);break; case SRA_C: M_SRA(R->BC.B.l);break; -case SRA_D: M_SRA(R->DE.B.h);break; case SRA_E: M_SRA(R->DE.B.l);break; -case SRA_H: M_SRA(R->HL.B.h);break; case SRA_L: M_SRA(R->HL.B.l);break; -case SRA_xHL: I=RdZ80(R->HL.W);M_SRA(I);WrZ80(R->HL.W,I);break; -case SRA_A: M_SRA(R->AF.B.h);break; - -case SLL_B: M_SLL(R->BC.B.h);break; case SLL_C: M_SLL(R->BC.B.l);break; -case SLL_D: M_SLL(R->DE.B.h);break; case SLL_E: M_SLL(R->DE.B.l);break; -case SLL_H: M_SLL(R->HL.B.h);break; case SLL_L: M_SLL(R->HL.B.l);break; -case SLL_xHL: I=RdZ80(R->HL.W);M_SLL(I);WrZ80(R->HL.W,I);break; -case SLL_A: M_SLL(R->AF.B.h);break; - -case SRL_B: M_SRL(R->BC.B.h);break; case SRL_C: M_SRL(R->BC.B.l);break; -case SRL_D: M_SRL(R->DE.B.h);break; case SRL_E: M_SRL(R->DE.B.l);break; -case SRL_H: M_SRL(R->HL.B.h);break; case SRL_L: M_SRL(R->HL.B.l);break; -case SRL_xHL: I=RdZ80(R->HL.W);M_SRL(I);WrZ80(R->HL.W,I);break; -case SRL_A: M_SRL(R->AF.B.h);break; +case RLC_B: M_RLC(CPU.BC.B.h);break; case RLC_C: M_RLC(CPU.BC.B.l);break; +case RLC_D: M_RLC(CPU.DE.B.h);break; case RLC_E: M_RLC(CPU.DE.B.l);break; +case RLC_H: M_RLC(CPU.HL.B.h);break; case RLC_L: M_RLC(CPU.HL.B.l);break; +case RLC_xHL: I=RdZ80(CPU.HL.W);M_RLC(I);WrZ80(CPU.HL.W,I);break; +case RLC_A: M_RLC(CPU.AF.B.h);break; + +case RRC_B: M_RRC(CPU.BC.B.h);break; case RRC_C: M_RRC(CPU.BC.B.l);break; +case RRC_D: M_RRC(CPU.DE.B.h);break; case RRC_E: M_RRC(CPU.DE.B.l);break; +case RRC_H: M_RRC(CPU.HL.B.h);break; case RRC_L: M_RRC(CPU.HL.B.l);break; +case RRC_xHL: I=RdZ80(CPU.HL.W);M_RRC(I);WrZ80(CPU.HL.W,I);break; +case RRC_A: M_RRC(CPU.AF.B.h);break; + +case RL_B: M_RL(CPU.BC.B.h);break; case RL_C: M_RL(CPU.BC.B.l);break; +case RL_D: M_RL(CPU.DE.B.h);break; case RL_E: M_RL(CPU.DE.B.l);break; +case RL_H: M_RL(CPU.HL.B.h);break; case RL_L: M_RL(CPU.HL.B.l);break; +case RL_xHL: I=RdZ80(CPU.HL.W);M_RL(I);WrZ80(CPU.HL.W,I);break; +case RL_A: M_RL(CPU.AF.B.h);break; + +case RR_B: M_RR(CPU.BC.B.h);break; case RR_C: M_RR(CPU.BC.B.l);break; +case RR_D: M_RR(CPU.DE.B.h);break; case RR_E: M_RR(CPU.DE.B.l);break; +case RR_H: M_RR(CPU.HL.B.h);break; case RR_L: M_RR(CPU.HL.B.l);break; +case RR_xHL: I=RdZ80(CPU.HL.W);M_RR(I);WrZ80(CPU.HL.W,I);break; +case RR_A: M_RR(CPU.AF.B.h);break; + +case SLA_B: M_SLA(CPU.BC.B.h);break; case SLA_C: M_SLA(CPU.BC.B.l);break; +case SLA_D: M_SLA(CPU.DE.B.h);break; case SLA_E: M_SLA(CPU.DE.B.l);break; +case SLA_H: M_SLA(CPU.HL.B.h);break; case SLA_L: M_SLA(CPU.HL.B.l);break; +case SLA_xHL: I=RdZ80(CPU.HL.W);M_SLA(I);WrZ80(CPU.HL.W,I);break; +case SLA_A: M_SLA(CPU.AF.B.h);break; + +case SRA_B: M_SRA(CPU.BC.B.h);break; case SRA_C: M_SRA(CPU.BC.B.l);break; +case SRA_D: M_SRA(CPU.DE.B.h);break; case SRA_E: M_SRA(CPU.DE.B.l);break; +case SRA_H: M_SRA(CPU.HL.B.h);break; case SRA_L: M_SRA(CPU.HL.B.l);break; +case SRA_xHL: I=RdZ80(CPU.HL.W);M_SRA(I);WrZ80(CPU.HL.W,I);break; +case SRA_A: M_SRA(CPU.AF.B.h);break; + +case SLL_B: M_SLL(CPU.BC.B.h);break; case SLL_C: M_SLL(CPU.BC.B.l);break; +case SLL_D: M_SLL(CPU.DE.B.h);break; case SLL_E: M_SLL(CPU.DE.B.l);break; +case SLL_H: M_SLL(CPU.HL.B.h);break; case SLL_L: M_SLL(CPU.HL.B.l);break; +case SLL_xHL: I=RdZ80(CPU.HL.W);M_SLL(I);WrZ80(CPU.HL.W,I);break; +case SLL_A: M_SLL(CPU.AF.B.h);break; + +case SRL_B: M_SRL(CPU.BC.B.h);break; case SRL_C: M_SRL(CPU.BC.B.l);break; +case SRL_D: M_SRL(CPU.DE.B.h);break; case SRL_E: M_SRL(CPU.DE.B.l);break; +case SRL_H: M_SRL(CPU.HL.B.h);break; case SRL_L: M_SRL(CPU.HL.B.l);break; +case SRL_xHL: I=RdZ80(CPU.HL.W);M_SRL(I);WrZ80(CPU.HL.W,I);break; +case SRL_A: M_SRL(CPU.AF.B.h);break; -case BIT0_B: M_BIT(0,R->BC.B.h);break; case BIT0_C: M_BIT(0,R->BC.B.l);break; -case BIT0_D: M_BIT(0,R->DE.B.h);break; case BIT0_E: M_BIT(0,R->DE.B.l);break; -case BIT0_H: M_BIT(0,R->HL.B.h);break; case BIT0_L: M_BIT(0,R->HL.B.l);break; -case BIT0_xHL: I=RdZ80(R->HL.W);M_BIT(0,I);break; -case BIT0_A: M_BIT(0,R->AF.B.h);break; - -case BIT1_B: M_BIT(1,R->BC.B.h);break; case BIT1_C: M_BIT(1,R->BC.B.l);break; -case BIT1_D: M_BIT(1,R->DE.B.h);break; case BIT1_E: M_BIT(1,R->DE.B.l);break; -case BIT1_H: M_BIT(1,R->HL.B.h);break; case BIT1_L: M_BIT(1,R->HL.B.l);break; -case BIT1_xHL: I=RdZ80(R->HL.W);M_BIT(1,I);break; -case BIT1_A: M_BIT(1,R->AF.B.h);break; - -case BIT2_B: M_BIT(2,R->BC.B.h);break; case BIT2_C: M_BIT(2,R->BC.B.l);break; -case BIT2_D: M_BIT(2,R->DE.B.h);break; case BIT2_E: M_BIT(2,R->DE.B.l);break; -case BIT2_H: M_BIT(2,R->HL.B.h);break; case BIT2_L: M_BIT(2,R->HL.B.l);break; -case BIT2_xHL: I=RdZ80(R->HL.W);M_BIT(2,I);break; -case BIT2_A: M_BIT(2,R->AF.B.h);break; - -case BIT3_B: M_BIT(3,R->BC.B.h);break; case BIT3_C: M_BIT(3,R->BC.B.l);break; -case BIT3_D: M_BIT(3,R->DE.B.h);break; case BIT3_E: M_BIT(3,R->DE.B.l);break; -case BIT3_H: M_BIT(3,R->HL.B.h);break; case BIT3_L: M_BIT(3,R->HL.B.l);break; -case BIT3_xHL: I=RdZ80(R->HL.W);M_BIT(3,I);break; -case BIT3_A: M_BIT(3,R->AF.B.h);break; - -case BIT4_B: M_BIT(4,R->BC.B.h);break; case BIT4_C: M_BIT(4,R->BC.B.l);break; -case BIT4_D: M_BIT(4,R->DE.B.h);break; case BIT4_E: M_BIT(4,R->DE.B.l);break; -case BIT4_H: M_BIT(4,R->HL.B.h);break; case BIT4_L: M_BIT(4,R->HL.B.l);break; -case BIT4_xHL: I=RdZ80(R->HL.W);M_BIT(4,I);break; -case BIT4_A: M_BIT(4,R->AF.B.h);break; - -case BIT5_B: M_BIT(5,R->BC.B.h);break; case BIT5_C: M_BIT(5,R->BC.B.l);break; -case BIT5_D: M_BIT(5,R->DE.B.h);break; case BIT5_E: M_BIT(5,R->DE.B.l);break; -case BIT5_H: M_BIT(5,R->HL.B.h);break; case BIT5_L: M_BIT(5,R->HL.B.l);break; -case BIT5_xHL: I=RdZ80(R->HL.W);M_BIT(5,I);break; -case BIT5_A: M_BIT(5,R->AF.B.h);break; - -case BIT6_B: M_BIT(6,R->BC.B.h);break; case BIT6_C: M_BIT(6,R->BC.B.l);break; -case BIT6_D: M_BIT(6,R->DE.B.h);break; case BIT6_E: M_BIT(6,R->DE.B.l);break; -case BIT6_H: M_BIT(6,R->HL.B.h);break; case BIT6_L: M_BIT(6,R->HL.B.l);break; -case BIT6_xHL: I=RdZ80(R->HL.W);M_BIT(6,I);break; -case BIT6_A: M_BIT(6,R->AF.B.h);break; - -case BIT7_B: M_BIT(7,R->BC.B.h);break; case BIT7_C: M_BIT(7,R->BC.B.l);break; -case BIT7_D: M_BIT(7,R->DE.B.h);break; case BIT7_E: M_BIT(7,R->DE.B.l);break; -case BIT7_H: M_BIT(7,R->HL.B.h);break; case BIT7_L: M_BIT(7,R->HL.B.l);break; -case BIT7_xHL: I=RdZ80(R->HL.W);M_BIT(7,I);break; -case BIT7_A: M_BIT(7,R->AF.B.h);break; - -case RES0_B: M_RES(0,R->BC.B.h);break; case RES0_C: M_RES(0,R->BC.B.l);break; -case RES0_D: M_RES(0,R->DE.B.h);break; case RES0_E: M_RES(0,R->DE.B.l);break; -case RES0_H: M_RES(0,R->HL.B.h);break; case RES0_L: M_RES(0,R->HL.B.l);break; -case RES0_xHL: I=RdZ80(R->HL.W);M_RES(0,I);WrZ80(R->HL.W,I);break; -case RES0_A: M_RES(0,R->AF.B.h);break; - -case RES1_B: M_RES(1,R->BC.B.h);break; case RES1_C: M_RES(1,R->BC.B.l);break; -case RES1_D: M_RES(1,R->DE.B.h);break; case RES1_E: M_RES(1,R->DE.B.l);break; -case RES1_H: M_RES(1,R->HL.B.h);break; case RES1_L: M_RES(1,R->HL.B.l);break; -case RES1_xHL: I=RdZ80(R->HL.W);M_RES(1,I);WrZ80(R->HL.W,I);break; -case RES1_A: M_RES(1,R->AF.B.h);break; - -case RES2_B: M_RES(2,R->BC.B.h);break; case RES2_C: M_RES(2,R->BC.B.l);break; -case RES2_D: M_RES(2,R->DE.B.h);break; case RES2_E: M_RES(2,R->DE.B.l);break; -case RES2_H: M_RES(2,R->HL.B.h);break; case RES2_L: M_RES(2,R->HL.B.l);break; -case RES2_xHL: I=RdZ80(R->HL.W);M_RES(2,I);WrZ80(R->HL.W,I);break; -case RES2_A: M_RES(2,R->AF.B.h);break; - -case RES3_B: M_RES(3,R->BC.B.h);break; case RES3_C: M_RES(3,R->BC.B.l);break; -case RES3_D: M_RES(3,R->DE.B.h);break; case RES3_E: M_RES(3,R->DE.B.l);break; -case RES3_H: M_RES(3,R->HL.B.h);break; case RES3_L: M_RES(3,R->HL.B.l);break; -case RES3_xHL: I=RdZ80(R->HL.W);M_RES(3,I);WrZ80(R->HL.W,I);break; -case RES3_A: M_RES(3,R->AF.B.h);break; - -case RES4_B: M_RES(4,R->BC.B.h);break; case RES4_C: M_RES(4,R->BC.B.l);break; -case RES4_D: M_RES(4,R->DE.B.h);break; case RES4_E: M_RES(4,R->DE.B.l);break; -case RES4_H: M_RES(4,R->HL.B.h);break; case RES4_L: M_RES(4,R->HL.B.l);break; -case RES4_xHL: I=RdZ80(R->HL.W);M_RES(4,I);WrZ80(R->HL.W,I);break; -case RES4_A: M_RES(4,R->AF.B.h);break; - -case RES5_B: M_RES(5,R->BC.B.h);break; case RES5_C: M_RES(5,R->BC.B.l);break; -case RES5_D: M_RES(5,R->DE.B.h);break; case RES5_E: M_RES(5,R->DE.B.l);break; -case RES5_H: M_RES(5,R->HL.B.h);break; case RES5_L: M_RES(5,R->HL.B.l);break; -case RES5_xHL: I=RdZ80(R->HL.W);M_RES(5,I);WrZ80(R->HL.W,I);break; -case RES5_A: M_RES(5,R->AF.B.h);break; - -case RES6_B: M_RES(6,R->BC.B.h);break; case RES6_C: M_RES(6,R->BC.B.l);break; -case RES6_D: M_RES(6,R->DE.B.h);break; case RES6_E: M_RES(6,R->DE.B.l);break; -case RES6_H: M_RES(6,R->HL.B.h);break; case RES6_L: M_RES(6,R->HL.B.l);break; -case RES6_xHL: I=RdZ80(R->HL.W);M_RES(6,I);WrZ80(R->HL.W,I);break; -case RES6_A: M_RES(6,R->AF.B.h);break; - -case RES7_B: M_RES(7,R->BC.B.h);break; case RES7_C: M_RES(7,R->BC.B.l);break; -case RES7_D: M_RES(7,R->DE.B.h);break; case RES7_E: M_RES(7,R->DE.B.l);break; -case RES7_H: M_RES(7,R->HL.B.h);break; case RES7_L: M_RES(7,R->HL.B.l);break; -case RES7_xHL: I=RdZ80(R->HL.W);M_RES(7,I);WrZ80(R->HL.W,I);break; -case RES7_A: M_RES(7,R->AF.B.h);break; - -case SET0_B: M_SET(0,R->BC.B.h);break; case SET0_C: M_SET(0,R->BC.B.l);break; -case SET0_D: M_SET(0,R->DE.B.h);break; case SET0_E: M_SET(0,R->DE.B.l);break; -case SET0_H: M_SET(0,R->HL.B.h);break; case SET0_L: M_SET(0,R->HL.B.l);break; -case SET0_xHL: I=RdZ80(R->HL.W);M_SET(0,I);WrZ80(R->HL.W,I);break; -case SET0_A: M_SET(0,R->AF.B.h);break; - -case SET1_B: M_SET(1,R->BC.B.h);break; case SET1_C: M_SET(1,R->BC.B.l);break; -case SET1_D: M_SET(1,R->DE.B.h);break; case SET1_E: M_SET(1,R->DE.B.l);break; -case SET1_H: M_SET(1,R->HL.B.h);break; case SET1_L: M_SET(1,R->HL.B.l);break; -case SET1_xHL: I=RdZ80(R->HL.W);M_SET(1,I);WrZ80(R->HL.W,I);break; -case SET1_A: M_SET(1,R->AF.B.h);break; - -case SET2_B: M_SET(2,R->BC.B.h);break; case SET2_C: M_SET(2,R->BC.B.l);break; -case SET2_D: M_SET(2,R->DE.B.h);break; case SET2_E: M_SET(2,R->DE.B.l);break; -case SET2_H: M_SET(2,R->HL.B.h);break; case SET2_L: M_SET(2,R->HL.B.l);break; -case SET2_xHL: I=RdZ80(R->HL.W);M_SET(2,I);WrZ80(R->HL.W,I);break; -case SET2_A: M_SET(2,R->AF.B.h);break; - -case SET3_B: M_SET(3,R->BC.B.h);break; case SET3_C: M_SET(3,R->BC.B.l);break; -case SET3_D: M_SET(3,R->DE.B.h);break; case SET3_E: M_SET(3,R->DE.B.l);break; -case SET3_H: M_SET(3,R->HL.B.h);break; case SET3_L: M_SET(3,R->HL.B.l);break; -case SET3_xHL: I=RdZ80(R->HL.W);M_SET(3,I);WrZ80(R->HL.W,I);break; -case SET3_A: M_SET(3,R->AF.B.h);break; - -case SET4_B: M_SET(4,R->BC.B.h);break; case SET4_C: M_SET(4,R->BC.B.l);break; -case SET4_D: M_SET(4,R->DE.B.h);break; case SET4_E: M_SET(4,R->DE.B.l);break; -case SET4_H: M_SET(4,R->HL.B.h);break; case SET4_L: M_SET(4,R->HL.B.l);break; -case SET4_xHL: I=RdZ80(R->HL.W);M_SET(4,I);WrZ80(R->HL.W,I);break; -case SET4_A: M_SET(4,R->AF.B.h);break; - -case SET5_B: M_SET(5,R->BC.B.h);break; case SET5_C: M_SET(5,R->BC.B.l);break; -case SET5_D: M_SET(5,R->DE.B.h);break; case SET5_E: M_SET(5,R->DE.B.l);break; -case SET5_H: M_SET(5,R->HL.B.h);break; case SET5_L: M_SET(5,R->HL.B.l);break; -case SET5_xHL: I=RdZ80(R->HL.W);M_SET(5,I);WrZ80(R->HL.W,I);break; -case SET5_A: M_SET(5,R->AF.B.h);break; - -case SET6_B: M_SET(6,R->BC.B.h);break; case SET6_C: M_SET(6,R->BC.B.l);break; -case SET6_D: M_SET(6,R->DE.B.h);break; case SET6_E: M_SET(6,R->DE.B.l);break; -case SET6_H: M_SET(6,R->HL.B.h);break; case SET6_L: M_SET(6,R->HL.B.l);break; -case SET6_xHL: I=RdZ80(R->HL.W);M_SET(6,I);WrZ80(R->HL.W,I);break; -case SET6_A: M_SET(6,R->AF.B.h);break; - -case SET7_B: M_SET(7,R->BC.B.h);break; case SET7_C: M_SET(7,R->BC.B.l);break; -case SET7_D: M_SET(7,R->DE.B.h);break; case SET7_E: M_SET(7,R->DE.B.l);break; -case SET7_H: M_SET(7,R->HL.B.h);break; case SET7_L: M_SET(7,R->HL.B.l);break; -case SET7_xHL: I=RdZ80(R->HL.W);M_SET(7,I);WrZ80(R->HL.W,I);break; -case SET7_A: M_SET(7,R->AF.B.h);break; +case BIT0_B: M_BIT(0,CPU.BC.B.h);break; case BIT0_C: M_BIT(0,CPU.BC.B.l);break; +case BIT0_D: M_BIT(0,CPU.DE.B.h);break; case BIT0_E: M_BIT(0,CPU.DE.B.l);break; +case BIT0_H: M_BIT(0,CPU.HL.B.h);break; case BIT0_L: M_BIT(0,CPU.HL.B.l);break; +case BIT0_xHL: I=RdZ80(CPU.HL.W);M_BIT(0,I);break; +case BIT0_A: M_BIT(0,CPU.AF.B.h);break; + +case BIT1_B: M_BIT(1,CPU.BC.B.h);break; case BIT1_C: M_BIT(1,CPU.BC.B.l);break; +case BIT1_D: M_BIT(1,CPU.DE.B.h);break; case BIT1_E: M_BIT(1,CPU.DE.B.l);break; +case BIT1_H: M_BIT(1,CPU.HL.B.h);break; case BIT1_L: M_BIT(1,CPU.HL.B.l);break; +case BIT1_xHL: I=RdZ80(CPU.HL.W);M_BIT(1,I);break; +case BIT1_A: M_BIT(1,CPU.AF.B.h);break; + +case BIT2_B: M_BIT(2,CPU.BC.B.h);break; case BIT2_C: M_BIT(2,CPU.BC.B.l);break; +case BIT2_D: M_BIT(2,CPU.DE.B.h);break; case BIT2_E: M_BIT(2,CPU.DE.B.l);break; +case BIT2_H: M_BIT(2,CPU.HL.B.h);break; case BIT2_L: M_BIT(2,CPU.HL.B.l);break; +case BIT2_xHL: I=RdZ80(CPU.HL.W);M_BIT(2,I);break; +case BIT2_A: M_BIT(2,CPU.AF.B.h);break; + +case BIT3_B: M_BIT(3,CPU.BC.B.h);break; case BIT3_C: M_BIT(3,CPU.BC.B.l);break; +case BIT3_D: M_BIT(3,CPU.DE.B.h);break; case BIT3_E: M_BIT(3,CPU.DE.B.l);break; +case BIT3_H: M_BIT(3,CPU.HL.B.h);break; case BIT3_L: M_BIT(3,CPU.HL.B.l);break; +case BIT3_xHL: I=RdZ80(CPU.HL.W);M_BIT(3,I);break; +case BIT3_A: M_BIT(3,CPU.AF.B.h);break; + +case BIT4_B: M_BIT(4,CPU.BC.B.h);break; case BIT4_C: M_BIT(4,CPU.BC.B.l);break; +case BIT4_D: M_BIT(4,CPU.DE.B.h);break; case BIT4_E: M_BIT(4,CPU.DE.B.l);break; +case BIT4_H: M_BIT(4,CPU.HL.B.h);break; case BIT4_L: M_BIT(4,CPU.HL.B.l);break; +case BIT4_xHL: I=RdZ80(CPU.HL.W);M_BIT(4,I);break; +case BIT4_A: M_BIT(4,CPU.AF.B.h);break; + +case BIT5_B: M_BIT(5,CPU.BC.B.h);break; case BIT5_C: M_BIT(5,CPU.BC.B.l);break; +case BIT5_D: M_BIT(5,CPU.DE.B.h);break; case BIT5_E: M_BIT(5,CPU.DE.B.l);break; +case BIT5_H: M_BIT(5,CPU.HL.B.h);break; case BIT5_L: M_BIT(5,CPU.HL.B.l);break; +case BIT5_xHL: I=RdZ80(CPU.HL.W);M_BIT(5,I);break; +case BIT5_A: M_BIT(5,CPU.AF.B.h);break; + +case BIT6_B: M_BIT(6,CPU.BC.B.h);break; case BIT6_C: M_BIT(6,CPU.BC.B.l);break; +case BIT6_D: M_BIT(6,CPU.DE.B.h);break; case BIT6_E: M_BIT(6,CPU.DE.B.l);break; +case BIT6_H: M_BIT(6,CPU.HL.B.h);break; case BIT6_L: M_BIT(6,CPU.HL.B.l);break; +case BIT6_xHL: I=RdZ80(CPU.HL.W);M_BIT(6,I);break; +case BIT6_A: M_BIT(6,CPU.AF.B.h);break; + +case BIT7_B: M_BIT(7,CPU.BC.B.h);break; case BIT7_C: M_BIT(7,CPU.BC.B.l);break; +case BIT7_D: M_BIT(7,CPU.DE.B.h);break; case BIT7_E: M_BIT(7,CPU.DE.B.l);break; +case BIT7_H: M_BIT(7,CPU.HL.B.h);break; case BIT7_L: M_BIT(7,CPU.HL.B.l);break; +case BIT7_xHL: I=RdZ80(CPU.HL.W);M_BIT(7,I);break; +case BIT7_A: M_BIT(7,CPU.AF.B.h);break; + +case RES0_B: M_RES(0,CPU.BC.B.h);break; case RES0_C: M_RES(0,CPU.BC.B.l);break; +case RES0_D: M_RES(0,CPU.DE.B.h);break; case RES0_E: M_RES(0,CPU.DE.B.l);break; +case RES0_H: M_RES(0,CPU.HL.B.h);break; case RES0_L: M_RES(0,CPU.HL.B.l);break; +case RES0_xHL: I=RdZ80(CPU.HL.W);M_RES(0,I);WrZ80(CPU.HL.W,I);break; +case RES0_A: M_RES(0,CPU.AF.B.h);break; + +case RES1_B: M_RES(1,CPU.BC.B.h);break; case RES1_C: M_RES(1,CPU.BC.B.l);break; +case RES1_D: M_RES(1,CPU.DE.B.h);break; case RES1_E: M_RES(1,CPU.DE.B.l);break; +case RES1_H: M_RES(1,CPU.HL.B.h);break; case RES1_L: M_RES(1,CPU.HL.B.l);break; +case RES1_xHL: I=RdZ80(CPU.HL.W);M_RES(1,I);WrZ80(CPU.HL.W,I);break; +case RES1_A: M_RES(1,CPU.AF.B.h);break; + +case RES2_B: M_RES(2,CPU.BC.B.h);break; case RES2_C: M_RES(2,CPU.BC.B.l);break; +case RES2_D: M_RES(2,CPU.DE.B.h);break; case RES2_E: M_RES(2,CPU.DE.B.l);break; +case RES2_H: M_RES(2,CPU.HL.B.h);break; case RES2_L: M_RES(2,CPU.HL.B.l);break; +case RES2_xHL: I=RdZ80(CPU.HL.W);M_RES(2,I);WrZ80(CPU.HL.W,I);break; +case RES2_A: M_RES(2,CPU.AF.B.h);break; + +case RES3_B: M_RES(3,CPU.BC.B.h);break; case RES3_C: M_RES(3,CPU.BC.B.l);break; +case RES3_D: M_RES(3,CPU.DE.B.h);break; case RES3_E: M_RES(3,CPU.DE.B.l);break; +case RES3_H: M_RES(3,CPU.HL.B.h);break; case RES3_L: M_RES(3,CPU.HL.B.l);break; +case RES3_xHL: I=RdZ80(CPU.HL.W);M_RES(3,I);WrZ80(CPU.HL.W,I);break; +case RES3_A: M_RES(3,CPU.AF.B.h);break; + +case RES4_B: M_RES(4,CPU.BC.B.h);break; case RES4_C: M_RES(4,CPU.BC.B.l);break; +case RES4_D: M_RES(4,CPU.DE.B.h);break; case RES4_E: M_RES(4,CPU.DE.B.l);break; +case RES4_H: M_RES(4,CPU.HL.B.h);break; case RES4_L: M_RES(4,CPU.HL.B.l);break; +case RES4_xHL: I=RdZ80(CPU.HL.W);M_RES(4,I);WrZ80(CPU.HL.W,I);break; +case RES4_A: M_RES(4,CPU.AF.B.h);break; + +case RES5_B: M_RES(5,CPU.BC.B.h);break; case RES5_C: M_RES(5,CPU.BC.B.l);break; +case RES5_D: M_RES(5,CPU.DE.B.h);break; case RES5_E: M_RES(5,CPU.DE.B.l);break; +case RES5_H: M_RES(5,CPU.HL.B.h);break; case RES5_L: M_RES(5,CPU.HL.B.l);break; +case RES5_xHL: I=RdZ80(CPU.HL.W);M_RES(5,I);WrZ80(CPU.HL.W,I);break; +case RES5_A: M_RES(5,CPU.AF.B.h);break; + +case RES6_B: M_RES(6,CPU.BC.B.h);break; case RES6_C: M_RES(6,CPU.BC.B.l);break; +case RES6_D: M_RES(6,CPU.DE.B.h);break; case RES6_E: M_RES(6,CPU.DE.B.l);break; +case RES6_H: M_RES(6,CPU.HL.B.h);break; case RES6_L: M_RES(6,CPU.HL.B.l);break; +case RES6_xHL: I=RdZ80(CPU.HL.W);M_RES(6,I);WrZ80(CPU.HL.W,I);break; +case RES6_A: M_RES(6,CPU.AF.B.h);break; + +case RES7_B: M_RES(7,CPU.BC.B.h);break; case RES7_C: M_RES(7,CPU.BC.B.l);break; +case RES7_D: M_RES(7,CPU.DE.B.h);break; case RES7_E: M_RES(7,CPU.DE.B.l);break; +case RES7_H: M_RES(7,CPU.HL.B.h);break; case RES7_L: M_RES(7,CPU.HL.B.l);break; +case RES7_xHL: I=RdZ80(CPU.HL.W);M_RES(7,I);WrZ80(CPU.HL.W,I);break; +case RES7_A: M_RES(7,CPU.AF.B.h);break; + +case SET0_B: M_SET(0,CPU.BC.B.h);break; case SET0_C: M_SET(0,CPU.BC.B.l);break; +case SET0_D: M_SET(0,CPU.DE.B.h);break; case SET0_E: M_SET(0,CPU.DE.B.l);break; +case SET0_H: M_SET(0,CPU.HL.B.h);break; case SET0_L: M_SET(0,CPU.HL.B.l);break; +case SET0_xHL: I=RdZ80(CPU.HL.W);M_SET(0,I);WrZ80(CPU.HL.W,I);break; +case SET0_A: M_SET(0,CPU.AF.B.h);break; + +case SET1_B: M_SET(1,CPU.BC.B.h);break; case SET1_C: M_SET(1,CPU.BC.B.l);break; +case SET1_D: M_SET(1,CPU.DE.B.h);break; case SET1_E: M_SET(1,CPU.DE.B.l);break; +case SET1_H: M_SET(1,CPU.HL.B.h);break; case SET1_L: M_SET(1,CPU.HL.B.l);break; +case SET1_xHL: I=RdZ80(CPU.HL.W);M_SET(1,I);WrZ80(CPU.HL.W,I);break; +case SET1_A: M_SET(1,CPU.AF.B.h);break; + +case SET2_B: M_SET(2,CPU.BC.B.h);break; case SET2_C: M_SET(2,CPU.BC.B.l);break; +case SET2_D: M_SET(2,CPU.DE.B.h);break; case SET2_E: M_SET(2,CPU.DE.B.l);break; +case SET2_H: M_SET(2,CPU.HL.B.h);break; case SET2_L: M_SET(2,CPU.HL.B.l);break; +case SET2_xHL: I=RdZ80(CPU.HL.W);M_SET(2,I);WrZ80(CPU.HL.W,I);break; +case SET2_A: M_SET(2,CPU.AF.B.h);break; + +case SET3_B: M_SET(3,CPU.BC.B.h);break; case SET3_C: M_SET(3,CPU.BC.B.l);break; +case SET3_D: M_SET(3,CPU.DE.B.h);break; case SET3_E: M_SET(3,CPU.DE.B.l);break; +case SET3_H: M_SET(3,CPU.HL.B.h);break; case SET3_L: M_SET(3,CPU.HL.B.l);break; +case SET3_xHL: I=RdZ80(CPU.HL.W);M_SET(3,I);WrZ80(CPU.HL.W,I);break; +case SET3_A: M_SET(3,CPU.AF.B.h);break; + +case SET4_B: M_SET(4,CPU.BC.B.h);break; case SET4_C: M_SET(4,CPU.BC.B.l);break; +case SET4_D: M_SET(4,CPU.DE.B.h);break; case SET4_E: M_SET(4,CPU.DE.B.l);break; +case SET4_H: M_SET(4,CPU.HL.B.h);break; case SET4_L: M_SET(4,CPU.HL.B.l);break; +case SET4_xHL: I=RdZ80(CPU.HL.W);M_SET(4,I);WrZ80(CPU.HL.W,I);break; +case SET4_A: M_SET(4,CPU.AF.B.h);break; + +case SET5_B: M_SET(5,CPU.BC.B.h);break; case SET5_C: M_SET(5,CPU.BC.B.l);break; +case SET5_D: M_SET(5,CPU.DE.B.h);break; case SET5_E: M_SET(5,CPU.DE.B.l);break; +case SET5_H: M_SET(5,CPU.HL.B.h);break; case SET5_L: M_SET(5,CPU.HL.B.l);break; +case SET5_xHL: I=RdZ80(CPU.HL.W);M_SET(5,I);WrZ80(CPU.HL.W,I);break; +case SET5_A: M_SET(5,CPU.AF.B.h);break; + +case SET6_B: M_SET(6,CPU.BC.B.h);break; case SET6_C: M_SET(6,CPU.BC.B.l);break; +case SET6_D: M_SET(6,CPU.DE.B.h);break; case SET6_E: M_SET(6,CPU.DE.B.l);break; +case SET6_H: M_SET(6,CPU.HL.B.h);break; case SET6_L: M_SET(6,CPU.HL.B.l);break; +case SET6_xHL: I=RdZ80(CPU.HL.W);M_SET(6,I);WrZ80(CPU.HL.W,I);break; +case SET6_A: M_SET(6,CPU.AF.B.h);break; + +case SET7_B: M_SET(7,CPU.BC.B.h);break; case SET7_C: M_SET(7,CPU.BC.B.l);break; +case SET7_D: M_SET(7,CPU.DE.B.h);break; case SET7_E: M_SET(7,CPU.DE.B.l);break; +case SET7_H: M_SET(7,CPU.HL.B.h);break; case SET7_L: M_SET(7,CPU.HL.B.l);break; +case SET7_xHL: I=RdZ80(CPU.HL.W);M_SET(7,I);WrZ80(CPU.HL.W,I);break; +case SET7_A: M_SET(7,CPU.AF.B.h);break; diff --git a/arm9/source/cpu/z80/CodesED.h b/arm9/source/cpu/z80/CodesED.h index cb4c8b5a..af8ef15f 100644 --- a/arm9/source/cpu/z80/CodesED.h +++ b/arm9/source/cpu/z80/CodesED.h @@ -26,258 +26,258 @@ case SBC_HL_HL: M_SBCW(HL);break; case SBC_HL_SP: M_SBCW(SP);break; case LD_xWORDe_HL: - J.B.l=OpZ80(R->PC.W++); - J.B.h=OpZ80(R->PC.W++); - WrZ80(J.W++,R->HL.B.l); - WrZ80(J.W,R->HL.B.h); + J.B.l=OpZ80(CPU.PC.W++); + J.B.h=OpZ80(CPU.PC.W++); + WrZ80(J.W++,CPU.HL.B.l); + WrZ80(J.W,CPU.HL.B.h); break; case LD_xWORDe_DE: - J.B.l=OpZ80(R->PC.W++); - J.B.h=OpZ80(R->PC.W++); - WrZ80(J.W++,R->DE.B.l); - WrZ80(J.W,R->DE.B.h); + J.B.l=OpZ80(CPU.PC.W++); + J.B.h=OpZ80(CPU.PC.W++); + WrZ80(J.W++,CPU.DE.B.l); + WrZ80(J.W,CPU.DE.B.h); break; case LD_xWORDe_BC: - J.B.l=OpZ80(R->PC.W++); - J.B.h=OpZ80(R->PC.W++); - WrZ80(J.W++,R->BC.B.l); - WrZ80(J.W,R->BC.B.h); + J.B.l=OpZ80(CPU.PC.W++); + J.B.h=OpZ80(CPU.PC.W++); + WrZ80(J.W++,CPU.BC.B.l); + WrZ80(J.W,CPU.BC.B.h); break; case LD_xWORDe_SP: - J.B.l=OpZ80(R->PC.W++); - J.B.h=OpZ80(R->PC.W++); - WrZ80(J.W++,R->SP.B.l); - WrZ80(J.W,R->SP.B.h); + J.B.l=OpZ80(CPU.PC.W++); + J.B.h=OpZ80(CPU.PC.W++); + WrZ80(J.W++,CPU.SP.B.l); + WrZ80(J.W,CPU.SP.B.h); break; case LD_HL_xWORDe: - J.B.l=OpZ80(R->PC.W++); - J.B.h=OpZ80(R->PC.W++); - R->HL.B.l=RdZ80(J.W++); - R->HL.B.h=RdZ80(J.W); + J.B.l=OpZ80(CPU.PC.W++); + J.B.h=OpZ80(CPU.PC.W++); + CPU.HL.B.l=RdZ80(J.W++); + CPU.HL.B.h=RdZ80(J.W); break; case LD_DE_xWORDe: - J.B.l=OpZ80(R->PC.W++); - J.B.h=OpZ80(R->PC.W++); - R->DE.B.l=RdZ80(J.W++); - R->DE.B.h=RdZ80(J.W); + J.B.l=OpZ80(CPU.PC.W++); + J.B.h=OpZ80(CPU.PC.W++); + CPU.DE.B.l=RdZ80(J.W++); + CPU.DE.B.h=RdZ80(J.W); break; case LD_BC_xWORDe: - J.B.l=OpZ80(R->PC.W++); - J.B.h=OpZ80(R->PC.W++); - R->BC.B.l=RdZ80(J.W++); - R->BC.B.h=RdZ80(J.W); + J.B.l=OpZ80(CPU.PC.W++); + J.B.h=OpZ80(CPU.PC.W++); + CPU.BC.B.l=RdZ80(J.W++); + CPU.BC.B.h=RdZ80(J.W); break; case LD_SP_xWORDe: - J.B.l=OpZ80(R->PC.W++); - J.B.h=OpZ80(R->PC.W++); - R->SP.B.l=RdZ80(J.W++); - R->SP.B.h=RdZ80(J.W); + J.B.l=OpZ80(CPU.PC.W++); + J.B.h=OpZ80(CPU.PC.W++); + CPU.SP.B.l=RdZ80(J.W++); + CPU.SP.B.h=RdZ80(J.W); break; case RRD: - I=RdZ80(R->HL.W); - J.B.l=(I>>4)|(R->AF.B.h<<4); - WrZ80(R->HL.W,J.B.l); - R->AF.B.h=(I&0x0F)|(R->AF.B.h&0xF0); - R->AF.B.l=PZSTable[R->AF.B.h]|(R->AF.B.l&C_FLAG); + I=RdZ80(CPU.HL.W); + J.B.l=(I>>4)|(CPU.AF.B.h<<4); + WrZ80(CPU.HL.W,J.B.l); + CPU.AF.B.h=(I&0x0F)|(CPU.AF.B.h&0xF0); + CPU.AF.B.l=PZSTable[CPU.AF.B.h]|(CPU.AF.B.l&C_FLAG); break; case RLD: - I=RdZ80(R->HL.W); - J.B.l=(I<<4)|(R->AF.B.h&0x0F); - WrZ80(R->HL.W,J.B.l); - R->AF.B.h=(I>>4)|(R->AF.B.h&0xF0); - R->AF.B.l=PZSTable[R->AF.B.h]|(R->AF.B.l&C_FLAG); + I=RdZ80(CPU.HL.W); + J.B.l=(I<<4)|(CPU.AF.B.h&0x0F); + WrZ80(CPU.HL.W,J.B.l); + CPU.AF.B.h=(I>>4)|(CPU.AF.B.h&0xF0); + CPU.AF.B.l=PZSTable[CPU.AF.B.h]|(CPU.AF.B.l&C_FLAG); break; case LD_A_I: - R->AF.B.h=R->I; - R->AF.B.l=(R->AF.B.l&C_FLAG)|(R->IFF&IFF_2? P_FLAG:0)|ZSTable[R->AF.B.h]; + CPU.AF.B.h=CPU.I; + CPU.AF.B.l=(CPU.AF.B.l&C_FLAG)|(CPU.IFF&IFF_2? P_FLAG:0)|ZSTable[CPU.AF.B.h]; break; case LD_A_R: - R->AF.B.h=R->R; - R->AF.B.l=(R->AF.B.l&C_FLAG)|(R->IFF&IFF_2? P_FLAG:0)|ZSTable[R->AF.B.h]; + CPU.AF.B.h=CPU.R; + CPU.AF.B.l=(CPU.AF.B.l&C_FLAG)|(CPU.IFF&IFF_2? P_FLAG:0)|ZSTable[CPU.AF.B.h]; break; -case LD_I_A: R->I=R->AF.B.h;break; -case LD_R_A: R->R=R->AF.B.h;break; +case LD_I_A: CPU.I=CPU.AF.B.h;break; +case LD_R_A: CPU.R=CPU.AF.B.h;break; -case IM_0: R->IFF&=~(IFF_IM1|IFF_IM2);break; -case IM_1: R->IFF=(R->IFF&~IFF_IM2)|IFF_IM1;break; -case IM_2: R->IFF=(R->IFF&~IFF_IM1)|IFF_IM2;break; +case IM_0: CPU.IFF&=~(IFF_IM1|IFF_IM2);break; +case IM_1: CPU.IFF=(CPU.IFF&~IFF_IM2)|IFF_IM1;break; +case IM_2: CPU.IFF=(CPU.IFF&~IFF_IM1)|IFF_IM2;break; case RETI: -case RETN: if(R->IFF&IFF_2) R->IFF|=IFF_1; else R->IFF&=~IFF_1; +case RETN: if(CPU.IFF&IFF_2) CPU.IFF|=IFF_1; else CPU.IFF&=~IFF_1; M_RET;break; -case NEG: I=R->AF.B.h;R->AF.B.h=0;M_SUB(I);break; +case NEG: I=CPU.AF.B.h;CPU.AF.B.h=0;M_SUB(I);break; -case IN_B_xC: M_IN(R->BC.B.h);break; -case IN_C_xC: M_IN(R->BC.B.l);break; -case IN_D_xC: M_IN(R->DE.B.h);break; -case IN_E_xC: M_IN(R->DE.B.l);break; -case IN_H_xC: M_IN(R->HL.B.h);break; -case IN_L_xC: M_IN(R->HL.B.l);break; -case IN_A_xC: M_IN(R->AF.B.h);break; +case IN_B_xC: M_IN(CPU.BC.B.h);break; +case IN_C_xC: M_IN(CPU.BC.B.l);break; +case IN_D_xC: M_IN(CPU.DE.B.h);break; +case IN_E_xC: M_IN(CPU.DE.B.l);break; +case IN_H_xC: M_IN(CPU.HL.B.h);break; +case IN_L_xC: M_IN(CPU.HL.B.l);break; +case IN_A_xC: M_IN(CPU.AF.B.h);break; case IN_F_xC: M_IN(J.B.l);break; -case OUT_xC_B: OutZ80(R->BC.W,R->BC.B.h);break; -case OUT_xC_C: OutZ80(R->BC.W,R->BC.B.l);break; -case OUT_xC_D: OutZ80(R->BC.W,R->DE.B.h);break; -case OUT_xC_E: OutZ80(R->BC.W,R->DE.B.l);break; -case OUT_xC_H: OutZ80(R->BC.W,R->HL.B.h);break; -case OUT_xC_L: OutZ80(R->BC.W,R->HL.B.l);break; -case OUT_xC_A: OutZ80(R->BC.W,R->AF.B.h);break; -case OUT_xC_F: OutZ80(R->BC.W,0);break; +case OUT_xC_B: OutZ80(CPU.BC.W,CPU.BC.B.h);break; +case OUT_xC_C: OutZ80(CPU.BC.W,CPU.BC.B.l);break; +case OUT_xC_D: OutZ80(CPU.BC.W,CPU.DE.B.h);break; +case OUT_xC_E: OutZ80(CPU.BC.W,CPU.DE.B.l);break; +case OUT_xC_H: OutZ80(CPU.BC.W,CPU.HL.B.h);break; +case OUT_xC_L: OutZ80(CPU.BC.W,CPU.HL.B.l);break; +case OUT_xC_A: OutZ80(CPU.BC.W,CPU.AF.B.h);break; +case OUT_xC_F: OutZ80(CPU.BC.W,0);break; case INI: - WrZ80(R->HL.W++,InZ80(R->BC.W)); - --R->BC.B.h; - R->AF.B.l=N_FLAG|(R->BC.B.h? 0:Z_FLAG); + WrZ80(CPU.HL.W++,InZ80(CPU.BC.W)); + --CPU.BC.B.h; + CPU.AF.B.l=N_FLAG|(CPU.BC.B.h? 0:Z_FLAG); break; case INIR: - WrZ80(R->HL.W++,InZ80(R->BC.W)); - if(--R->BC.B.h) { R->AF.B.l=N_FLAG;R->ICount-=21;R->PC.W-=2; } - else { R->AF.B.l=Z_FLAG|N_FLAG;R->ICount-=16; } + WrZ80(CPU.HL.W++,InZ80(CPU.BC.W)); + if(--CPU.BC.B.h) { CPU.AF.B.l=N_FLAG;CPU.ICount-=21;CPU.PC.W-=2; } + else { CPU.AF.B.l=Z_FLAG|N_FLAG;CPU.ICount-=16; } break; case IND: - WrZ80(R->HL.W--,InZ80(R->BC.W)); - --R->BC.B.h; - R->AF.B.l=N_FLAG|(R->BC.B.h? 0:Z_FLAG); + WrZ80(CPU.HL.W--,InZ80(CPU.BC.W)); + --CPU.BC.B.h; + CPU.AF.B.l=N_FLAG|(CPU.BC.B.h? 0:Z_FLAG); break; case INDR: - WrZ80(R->HL.W--,InZ80(R->BC.W)); - if(!--R->BC.B.h) { R->AF.B.l=N_FLAG;R->ICount-=21;R->PC.W-=2; } - else { R->AF.B.l=Z_FLAG|N_FLAG;R->ICount-=16; } + WrZ80(CPU.HL.W--,InZ80(CPU.BC.W)); + if(!--CPU.BC.B.h) { CPU.AF.B.l=N_FLAG;CPU.ICount-=21;CPU.PC.W-=2; } + else { CPU.AF.B.l=Z_FLAG|N_FLAG;CPU.ICount-=16; } break; case OUTI: - --R->BC.B.h; - I=RdZ80(R->HL.W++); - OutZ80(R->BC.W,I); - R->AF.B.l=N_FLAG|(R->BC.B.h? 0:Z_FLAG)|(R->HL.B.l+I>255? (C_FLAG|H_FLAG):0); + --CPU.BC.B.h; + I=RdZ80(CPU.HL.W++); + OutZ80(CPU.BC.W,I); + CPU.AF.B.l=N_FLAG|(CPU.BC.B.h? 0:Z_FLAG)|(CPU.HL.B.l+I>255? (C_FLAG|H_FLAG):0); break; case OTIR: - --R->BC.B.h; - I=RdZ80(R->HL.W++); - OutZ80(R->BC.W,I); - if(R->BC.B.h) + --CPU.BC.B.h; + I=RdZ80(CPU.HL.W++); + OutZ80(CPU.BC.W,I); + if(CPU.BC.B.h) { - R->AF.B.l=N_FLAG|(R->HL.B.l+I>255? (C_FLAG|H_FLAG):0); - R->ICount-=21; - R->PC.W-=2; + CPU.AF.B.l=N_FLAG|(CPU.HL.B.l+I>255? (C_FLAG|H_FLAG):0); + CPU.ICount-=21; + CPU.PC.W-=2; } else { - R->AF.B.l=Z_FLAG|N_FLAG|(R->HL.B.l+I>255? (C_FLAG|H_FLAG):0); - R->ICount-=16; + CPU.AF.B.l=Z_FLAG|N_FLAG|(CPU.HL.B.l+I>255? (C_FLAG|H_FLAG):0); + CPU.ICount-=16; } break; case OUTD: - --R->BC.B.h; - I=RdZ80(R->HL.W--); - OutZ80(R->BC.W,I); - R->AF.B.l=N_FLAG|(R->BC.B.h? 0:Z_FLAG)|(R->HL.B.l+I>255? (C_FLAG|H_FLAG):0); + --CPU.BC.B.h; + I=RdZ80(CPU.HL.W--); + OutZ80(CPU.BC.W,I); + CPU.AF.B.l=N_FLAG|(CPU.BC.B.h? 0:Z_FLAG)|(CPU.HL.B.l+I>255? (C_FLAG|H_FLAG):0); break; case OTDR: - --R->BC.B.h; - I=RdZ80(R->HL.W--); - OutZ80(R->BC.W,I); - if(R->BC.B.h) + --CPU.BC.B.h; + I=RdZ80(CPU.HL.W--); + OutZ80(CPU.BC.W,I); + if(CPU.BC.B.h) { - R->AF.B.l=N_FLAG|(R->HL.B.l+I>255? (C_FLAG|H_FLAG):0); - R->ICount-=21; - R->PC.W-=2; + CPU.AF.B.l=N_FLAG|(CPU.HL.B.l+I>255? (C_FLAG|H_FLAG):0); + CPU.ICount-=21; + CPU.PC.W-=2; } else { - R->AF.B.l=Z_FLAG|N_FLAG|(R->HL.B.l+I>255? (C_FLAG|H_FLAG):0); - R->ICount-=16; + CPU.AF.B.l=Z_FLAG|N_FLAG|(CPU.HL.B.l+I>255? (C_FLAG|H_FLAG):0); + CPU.ICount-=16; } break; case LDI: - WrZ80(R->DE.W++,RdZ80(R->HL.W++)); - --R->BC.W; - R->AF.B.l=(R->AF.B.l&~(N_FLAG|H_FLAG|P_FLAG))|(R->BC.W? P_FLAG:0); + WrZ80(CPU.DE.W++,RdZ80(CPU.HL.W++)); + --CPU.BC.W; + CPU.AF.B.l=(CPU.AF.B.l&~(N_FLAG|H_FLAG|P_FLAG))|(CPU.BC.W? P_FLAG:0); break; case LDIR: - WrZ80(R->DE.W++,RdZ80(R->HL.W++)); - if(--R->BC.W) + WrZ80(CPU.DE.W++,RdZ80(CPU.HL.W++)); + if(--CPU.BC.W) { - R->AF.B.l=(R->AF.B.l&~(H_FLAG|P_FLAG))|N_FLAG; - R->ICount-=21; - R->PC.W-=2; + CPU.AF.B.l=(CPU.AF.B.l&~(H_FLAG|P_FLAG))|N_FLAG; + CPU.ICount-=21; + CPU.PC.W-=2; } else { - R->AF.B.l&=~(N_FLAG|H_FLAG|P_FLAG); - R->ICount-=16; + CPU.AF.B.l&=~(N_FLAG|H_FLAG|P_FLAG); + CPU.ICount-=16; } break; case LDD: - WrZ80(R->DE.W--,RdZ80(R->HL.W--)); - --R->BC.W; - R->AF.B.l=(R->AF.B.l&~(N_FLAG|H_FLAG|P_FLAG))|(R->BC.W? P_FLAG:0); + WrZ80(CPU.DE.W--,RdZ80(CPU.HL.W--)); + --CPU.BC.W; + CPU.AF.B.l=(CPU.AF.B.l&~(N_FLAG|H_FLAG|P_FLAG))|(CPU.BC.W? P_FLAG:0); break; case LDDR: - WrZ80(R->DE.W--,RdZ80(R->HL.W--)); - R->AF.B.l&=~(N_FLAG|H_FLAG|P_FLAG); - if(--R->BC.W) + WrZ80(CPU.DE.W--,RdZ80(CPU.HL.W--)); + CPU.AF.B.l&=~(N_FLAG|H_FLAG|P_FLAG); + if(--CPU.BC.W) { - R->AF.B.l=(R->AF.B.l&~(H_FLAG|P_FLAG))|N_FLAG; - R->ICount-=21; - R->PC.W-=2; + CPU.AF.B.l=(CPU.AF.B.l&~(H_FLAG|P_FLAG))|N_FLAG; + CPU.ICount-=21; + CPU.PC.W-=2; } else { - R->AF.B.l&=~(N_FLAG|H_FLAG|P_FLAG); - R->ICount-=16; + CPU.AF.B.l&=~(N_FLAG|H_FLAG|P_FLAG); + CPU.ICount-=16; } break; case CPI: - I=RdZ80(R->HL.W++); - J.B.l=R->AF.B.h-I; - --R->BC.W; - R->AF.B.l = - N_FLAG|(R->AF.B.l&C_FLAG)|ZSTable[J.B.l]| - ((R->AF.B.h^I^J.B.l)&H_FLAG)|(R->BC.W? P_FLAG:0); + I=RdZ80(CPU.HL.W++); + J.B.l=CPU.AF.B.h-I; + --CPU.BC.W; + CPU.AF.B.l = + N_FLAG|(CPU.AF.B.l&C_FLAG)|ZSTable[J.B.l]| + ((CPU.AF.B.h^I^J.B.l)&H_FLAG)|(CPU.BC.W? P_FLAG:0); break; case CPIR: - I=RdZ80(R->HL.W++); - J.B.l=R->AF.B.h-I; - if(--R->BC.W&&J.B.l) { R->ICount-=21;R->PC.W-=2; } else R->ICount-=16; - R->AF.B.l = - N_FLAG|(R->AF.B.l&C_FLAG)|ZSTable[J.B.l]| - ((R->AF.B.h^I^J.B.l)&H_FLAG)|(R->BC.W? P_FLAG:0); + I=RdZ80(CPU.HL.W++); + J.B.l=CPU.AF.B.h-I; + if(--CPU.BC.W&&J.B.l) { CPU.ICount-=21;CPU.PC.W-=2; } else CPU.ICount-=16; + CPU.AF.B.l = + N_FLAG|(CPU.AF.B.l&C_FLAG)|ZSTable[J.B.l]| + ((CPU.AF.B.h^I^J.B.l)&H_FLAG)|(CPU.BC.W? P_FLAG:0); break; case CPD: - I=RdZ80(R->HL.W--); - J.B.l=R->AF.B.h-I; - --R->BC.W; - R->AF.B.l = - N_FLAG|(R->AF.B.l&C_FLAG)|ZSTable[J.B.l]| - ((R->AF.B.h^I^J.B.l)&H_FLAG)|(R->BC.W? P_FLAG:0); + I=RdZ80(CPU.HL.W--); + J.B.l=CPU.AF.B.h-I; + --CPU.BC.W; + CPU.AF.B.l = + N_FLAG|(CPU.AF.B.l&C_FLAG)|ZSTable[J.B.l]| + ((CPU.AF.B.h^I^J.B.l)&H_FLAG)|(CPU.BC.W? P_FLAG:0); break; case CPDR: - I=RdZ80(R->HL.W--); - J.B.l=R->AF.B.h-I; - if(--R->BC.W&&J.B.l) { R->ICount-=21;R->PC.W-=2; } else R->ICount-=16; - R->AF.B.l = - N_FLAG|(R->AF.B.l&C_FLAG)|ZSTable[J.B.l]| - ((R->AF.B.h^I^J.B.l)&H_FLAG)|(R->BC.W? P_FLAG:0); + I=RdZ80(CPU.HL.W--); + J.B.l=CPU.AF.B.h-I; + if(--CPU.BC.W&&J.B.l) { CPU.ICount-=21;CPU.PC.W-=2; } else CPU.ICount-=16; + CPU.AF.B.l = + N_FLAG|(CPU.AF.B.l&C_FLAG)|ZSTable[J.B.l]| + ((CPU.AF.B.h^I^J.B.l)&H_FLAG)|(CPU.BC.W? P_FLAG:0); break; diff --git a/arm9/source/cpu/z80/CodesXX.h b/arm9/source/cpu/z80/CodesXX.h index 5712df31..6cd0d9c6 100644 --- a/arm9/source/cpu/z80/CodesXX.h +++ b/arm9/source/cpu/z80/CodesXX.h @@ -11,192 +11,192 @@ /** changes to this file. **/ /*************************************************************/ -case JR_NZ: if(R->AF.B.l&Z_FLAG) R->PC.W++; else { R->ICount-=5;M_JR; } break; -case JR_NC: if(R->AF.B.l&C_FLAG) R->PC.W++; else { R->ICount-=5;M_JR; } break; -case JR_Z: if(R->AF.B.l&Z_FLAG) { R->ICount-=5;M_JR; } else R->PC.W++; break; -case JR_C: if(R->AF.B.l&C_FLAG) { R->ICount-=5;M_JR; } else R->PC.W++; break; - -case JP_NZ: if(R->AF.B.l&Z_FLAG) R->PC.W+=2; else { M_JP; } break; -case JP_NC: if(R->AF.B.l&C_FLAG) R->PC.W+=2; else { M_JP; } break; -case JP_PO: if(R->AF.B.l&P_FLAG) R->PC.W+=2; else { M_JP; } break; -case JP_P: if(R->AF.B.l&S_FLAG) R->PC.W+=2; else { M_JP; } break; -case JP_Z: if(R->AF.B.l&Z_FLAG) { M_JP; } else R->PC.W+=2; break; -case JP_C: if(R->AF.B.l&C_FLAG) { M_JP; } else R->PC.W+=2; break; -case JP_PE: if(R->AF.B.l&P_FLAG) { M_JP; } else R->PC.W+=2; break; -case JP_M: if(R->AF.B.l&S_FLAG) { M_JP; } else R->PC.W+=2; break; - -case RET_NZ: if(!(R->AF.B.l&Z_FLAG)) { R->ICount-=6;M_RET; } break; -case RET_NC: if(!(R->AF.B.l&C_FLAG)) { R->ICount-=6;M_RET; } break; -case RET_PO: if(!(R->AF.B.l&P_FLAG)) { R->ICount-=6;M_RET; } break; -case RET_P: if(!(R->AF.B.l&S_FLAG)) { R->ICount-=6;M_RET; } break; -case RET_Z: if(R->AF.B.l&Z_FLAG) { R->ICount-=6;M_RET; } break; -case RET_C: if(R->AF.B.l&C_FLAG) { R->ICount-=6;M_RET; } break; -case RET_PE: if(R->AF.B.l&P_FLAG) { R->ICount-=6;M_RET; } break; -case RET_M: if(R->AF.B.l&S_FLAG) { R->ICount-=6;M_RET; } break; - -case CALL_NZ: if(R->AF.B.l&Z_FLAG) R->PC.W+=2; else { R->ICount-=7;M_CALL; } break; -case CALL_NC: if(R->AF.B.l&C_FLAG) R->PC.W+=2; else { R->ICount-=7;M_CALL; } break; -case CALL_PO: if(R->AF.B.l&P_FLAG) R->PC.W+=2; else { R->ICount-=7;M_CALL; } break; -case CALL_P: if(R->AF.B.l&S_FLAG) R->PC.W+=2; else { R->ICount-=7;M_CALL; } break; -case CALL_Z: if(R->AF.B.l&Z_FLAG) { R->ICount-=7;M_CALL; } else R->PC.W+=2; break; -case CALL_C: if(R->AF.B.l&C_FLAG) { R->ICount-=7;M_CALL; } else R->PC.W+=2; break; -case CALL_PE: if(R->AF.B.l&P_FLAG) { R->ICount-=7;M_CALL; } else R->PC.W+=2; break; -case CALL_M: if(R->AF.B.l&S_FLAG) { R->ICount-=7;M_CALL; } else R->PC.W+=2; break; - -case ADD_B: M_ADD(R->BC.B.h);break; -case ADD_C: M_ADD(R->BC.B.l);break; -case ADD_D: M_ADD(R->DE.B.h);break; -case ADD_E: M_ADD(R->DE.B.l);break; -case ADD_H: M_ADD(R->XX.B.h);break; -case ADD_L: M_ADD(R->XX.B.l);break; -case ADD_A: M_ADD(R->AF.B.h);break; -case ADD_xHL: I=RdZ80(R->XX.W+(offset)OpZ80(R->PC.W++)); +case JR_NZ: if(CPU.AF.B.l&Z_FLAG) CPU.PC.W++; else { CPU.ICount-=5;M_JR; } break; +case JR_NC: if(CPU.AF.B.l&C_FLAG) CPU.PC.W++; else { CPU.ICount-=5;M_JR; } break; +case JR_Z: if(CPU.AF.B.l&Z_FLAG) { CPU.ICount-=5;M_JR; } else CPU.PC.W++; break; +case JR_C: if(CPU.AF.B.l&C_FLAG) { CPU.ICount-=5;M_JR; } else CPU.PC.W++; break; + +case JP_NZ: if(CPU.AF.B.l&Z_FLAG) CPU.PC.W+=2; else { M_JP; } break; +case JP_NC: if(CPU.AF.B.l&C_FLAG) CPU.PC.W+=2; else { M_JP; } break; +case JP_PO: if(CPU.AF.B.l&P_FLAG) CPU.PC.W+=2; else { M_JP; } break; +case JP_P: if(CPU.AF.B.l&S_FLAG) CPU.PC.W+=2; else { M_JP; } break; +case JP_Z: if(CPU.AF.B.l&Z_FLAG) { M_JP; } else CPU.PC.W+=2; break; +case JP_C: if(CPU.AF.B.l&C_FLAG) { M_JP; } else CPU.PC.W+=2; break; +case JP_PE: if(CPU.AF.B.l&P_FLAG) { M_JP; } else CPU.PC.W+=2; break; +case JP_M: if(CPU.AF.B.l&S_FLAG) { M_JP; } else CPU.PC.W+=2; break; + +case RET_NZ: if(!(CPU.AF.B.l&Z_FLAG)) { CPU.ICount-=6;M_RET; } break; +case RET_NC: if(!(CPU.AF.B.l&C_FLAG)) { CPU.ICount-=6;M_RET; } break; +case RET_PO: if(!(CPU.AF.B.l&P_FLAG)) { CPU.ICount-=6;M_RET; } break; +case RET_P: if(!(CPU.AF.B.l&S_FLAG)) { CPU.ICount-=6;M_RET; } break; +case RET_Z: if(CPU.AF.B.l&Z_FLAG) { CPU.ICount-=6;M_RET; } break; +case RET_C: if(CPU.AF.B.l&C_FLAG) { CPU.ICount-=6;M_RET; } break; +case RET_PE: if(CPU.AF.B.l&P_FLAG) { CPU.ICount-=6;M_RET; } break; +case RET_M: if(CPU.AF.B.l&S_FLAG) { CPU.ICount-=6;M_RET; } break; + +case CALL_NZ: if(CPU.AF.B.l&Z_FLAG) CPU.PC.W+=2; else { CPU.ICount-=7;M_CALL; } break; +case CALL_NC: if(CPU.AF.B.l&C_FLAG) CPU.PC.W+=2; else { CPU.ICount-=7;M_CALL; } break; +case CALL_PO: if(CPU.AF.B.l&P_FLAG) CPU.PC.W+=2; else { CPU.ICount-=7;M_CALL; } break; +case CALL_P: if(CPU.AF.B.l&S_FLAG) CPU.PC.W+=2; else { CPU.ICount-=7;M_CALL; } break; +case CALL_Z: if(CPU.AF.B.l&Z_FLAG) { CPU.ICount-=7;M_CALL; } else CPU.PC.W+=2; break; +case CALL_C: if(CPU.AF.B.l&C_FLAG) { CPU.ICount-=7;M_CALL; } else CPU.PC.W+=2; break; +case CALL_PE: if(CPU.AF.B.l&P_FLAG) { CPU.ICount-=7;M_CALL; } else CPU.PC.W+=2; break; +case CALL_M: if(CPU.AF.B.l&S_FLAG) { CPU.ICount-=7;M_CALL; } else CPU.PC.W+=2; break; + +case ADD_B: M_ADD(CPU.BC.B.h);break; +case ADD_C: M_ADD(CPU.BC.B.l);break; +case ADD_D: M_ADD(CPU.DE.B.h);break; +case ADD_E: M_ADD(CPU.DE.B.l);break; +case ADD_H: M_ADD(CPU.XX.B.h);break; +case ADD_L: M_ADD(CPU.XX.B.l);break; +case ADD_A: M_ADD(CPU.AF.B.h);break; +case ADD_xHL: I=RdZ80(CPU.XX.W+(offset)OpZ80(CPU.PC.W++)); M_ADD(I);break; -case ADD_BYTE: I=OpZ80(R->PC.W++);M_ADD(I);break; - -case SUB_B: M_SUB(R->BC.B.h);break; -case SUB_C: M_SUB(R->BC.B.l);break; -case SUB_D: M_SUB(R->DE.B.h);break; -case SUB_E: M_SUB(R->DE.B.l);break; -case SUB_H: M_SUB(R->XX.B.h);break; -case SUB_L: M_SUB(R->XX.B.l);break; -case SUB_A: R->AF.B.h=0;R->AF.B.l=N_FLAG|Z_FLAG;break; -case SUB_xHL: I=RdZ80(R->XX.W+(offset)OpZ80(R->PC.W++)); +case ADD_BYTE: I=OpZ80(CPU.PC.W++);M_ADD(I);break; + +case SUB_B: M_SUB(CPU.BC.B.h);break; +case SUB_C: M_SUB(CPU.BC.B.l);break; +case SUB_D: M_SUB(CPU.DE.B.h);break; +case SUB_E: M_SUB(CPU.DE.B.l);break; +case SUB_H: M_SUB(CPU.XX.B.h);break; +case SUB_L: M_SUB(CPU.XX.B.l);break; +case SUB_A: CPU.AF.B.h=0;CPU.AF.B.l=N_FLAG|Z_FLAG;break; +case SUB_xHL: I=RdZ80(CPU.XX.W+(offset)OpZ80(CPU.PC.W++)); M_SUB(I);break; -case SUB_BYTE: I=OpZ80(R->PC.W++);M_SUB(I);break; - -case AND_B: M_AND(R->BC.B.h);break; -case AND_C: M_AND(R->BC.B.l);break; -case AND_D: M_AND(R->DE.B.h);break; -case AND_E: M_AND(R->DE.B.l);break; -case AND_H: M_AND(R->XX.B.h);break; -case AND_L: M_AND(R->XX.B.l);break; -case AND_A: M_AND(R->AF.B.h);break; -case AND_xHL: I=RdZ80(R->XX.W+(offset)OpZ80(R->PC.W++)); +case SUB_BYTE: I=OpZ80(CPU.PC.W++);M_SUB(I);break; + +case AND_B: M_AND(CPU.BC.B.h);break; +case AND_C: M_AND(CPU.BC.B.l);break; +case AND_D: M_AND(CPU.DE.B.h);break; +case AND_E: M_AND(CPU.DE.B.l);break; +case AND_H: M_AND(CPU.XX.B.h);break; +case AND_L: M_AND(CPU.XX.B.l);break; +case AND_A: M_AND(CPU.AF.B.h);break; +case AND_xHL: I=RdZ80(CPU.XX.W+(offset)OpZ80(CPU.PC.W++)); M_AND(I);break; -case AND_BYTE: I=OpZ80(R->PC.W++);M_AND(I);break; - -case OR_B: M_OR(R->BC.B.h);break; -case OR_C: M_OR(R->BC.B.l);break; -case OR_D: M_OR(R->DE.B.h);break; -case OR_E: M_OR(R->DE.B.l);break; -case OR_H: M_OR(R->XX.B.h);break; -case OR_L: M_OR(R->XX.B.l);break; -case OR_A: M_OR(R->AF.B.h);break; -case OR_xHL: I=RdZ80(R->XX.W+(offset)OpZ80(R->PC.W++)); +case AND_BYTE: I=OpZ80(CPU.PC.W++);M_AND(I);break; + +case OR_B: M_OR(CPU.BC.B.h);break; +case OR_C: M_OR(CPU.BC.B.l);break; +case OR_D: M_OR(CPU.DE.B.h);break; +case OR_E: M_OR(CPU.DE.B.l);break; +case OR_H: M_OR(CPU.XX.B.h);break; +case OR_L: M_OR(CPU.XX.B.l);break; +case OR_A: M_OR(CPU.AF.B.h);break; +case OR_xHL: I=RdZ80(CPU.XX.W+(offset)OpZ80(CPU.PC.W++)); M_OR(I);break; -case OR_BYTE: I=OpZ80(R->PC.W++);M_OR(I);break; - -case ADC_B: M_ADC(R->BC.B.h);break; -case ADC_C: M_ADC(R->BC.B.l);break; -case ADC_D: M_ADC(R->DE.B.h);break; -case ADC_E: M_ADC(R->DE.B.l);break; -case ADC_H: M_ADC(R->XX.B.h);break; -case ADC_L: M_ADC(R->XX.B.l);break; -case ADC_A: M_ADC(R->AF.B.h);break; -case ADC_xHL: I=RdZ80(R->XX.W+(offset)OpZ80(R->PC.W++)); +case OR_BYTE: I=OpZ80(CPU.PC.W++);M_OR(I);break; + +case ADC_B: M_ADC(CPU.BC.B.h);break; +case ADC_C: M_ADC(CPU.BC.B.l);break; +case ADC_D: M_ADC(CPU.DE.B.h);break; +case ADC_E: M_ADC(CPU.DE.B.l);break; +case ADC_H: M_ADC(CPU.XX.B.h);break; +case ADC_L: M_ADC(CPU.XX.B.l);break; +case ADC_A: M_ADC(CPU.AF.B.h);break; +case ADC_xHL: I=RdZ80(CPU.XX.W+(offset)OpZ80(CPU.PC.W++)); M_ADC(I);break; -case ADC_BYTE: I=OpZ80(R->PC.W++);M_ADC(I);break; - -case SBC_B: M_SBC(R->BC.B.h);break; -case SBC_C: M_SBC(R->BC.B.l);break; -case SBC_D: M_SBC(R->DE.B.h);break; -case SBC_E: M_SBC(R->DE.B.l);break; -case SBC_H: M_SBC(R->XX.B.h);break; -case SBC_L: M_SBC(R->XX.B.l);break; -case SBC_A: M_SBC(R->AF.B.h);break; -case SBC_xHL: I=RdZ80(R->XX.W+(offset)OpZ80(R->PC.W++)); +case ADC_BYTE: I=OpZ80(CPU.PC.W++);M_ADC(I);break; + +case SBC_B: M_SBC(CPU.BC.B.h);break; +case SBC_C: M_SBC(CPU.BC.B.l);break; +case SBC_D: M_SBC(CPU.DE.B.h);break; +case SBC_E: M_SBC(CPU.DE.B.l);break; +case SBC_H: M_SBC(CPU.XX.B.h);break; +case SBC_L: M_SBC(CPU.XX.B.l);break; +case SBC_A: M_SBC(CPU.AF.B.h);break; +case SBC_xHL: I=RdZ80(CPU.XX.W+(offset)OpZ80(CPU.PC.W++)); M_SBC(I);break; -case SBC_BYTE: I=OpZ80(R->PC.W++);M_SBC(I);break; - -case XOR_B: M_XOR(R->BC.B.h);break; -case XOR_C: M_XOR(R->BC.B.l);break; -case XOR_D: M_XOR(R->DE.B.h);break; -case XOR_E: M_XOR(R->DE.B.l);break; -case XOR_H: M_XOR(R->XX.B.h);break; -case XOR_L: M_XOR(R->XX.B.l);break; -case XOR_A: R->AF.B.h=0;R->AF.B.l=P_FLAG|Z_FLAG;break; -case XOR_xHL: I=RdZ80(R->XX.W+(offset)OpZ80(R->PC.W++)); +case SBC_BYTE: I=OpZ80(CPU.PC.W++);M_SBC(I);break; + +case XOR_B: M_XOR(CPU.BC.B.h);break; +case XOR_C: M_XOR(CPU.BC.B.l);break; +case XOR_D: M_XOR(CPU.DE.B.h);break; +case XOR_E: M_XOR(CPU.DE.B.l);break; +case XOR_H: M_XOR(CPU.XX.B.h);break; +case XOR_L: M_XOR(CPU.XX.B.l);break; +case XOR_A: CPU.AF.B.h=0;CPU.AF.B.l=P_FLAG|Z_FLAG;break; +case XOR_xHL: I=RdZ80(CPU.XX.W+(offset)OpZ80(CPU.PC.W++)); M_XOR(I);break; -case XOR_BYTE: I=OpZ80(R->PC.W++);M_XOR(I);break; - -case CP_B: M_CP(R->BC.B.h);break; -case CP_C: M_CP(R->BC.B.l);break; -case CP_D: M_CP(R->DE.B.h);break; -case CP_E: M_CP(R->DE.B.l);break; -case CP_H: M_CP(R->XX.B.h);break; -case CP_L: M_CP(R->XX.B.l);break; -case CP_A: R->AF.B.l=N_FLAG|Z_FLAG;break; -case CP_xHL: I=RdZ80(R->XX.W+(offset)OpZ80(R->PC.W++)); +case XOR_BYTE: I=OpZ80(CPU.PC.W++);M_XOR(I);break; + +case CP_B: M_CP(CPU.BC.B.h);break; +case CP_C: M_CP(CPU.BC.B.l);break; +case CP_D: M_CP(CPU.DE.B.h);break; +case CP_E: M_CP(CPU.DE.B.l);break; +case CP_H: M_CP(CPU.XX.B.h);break; +case CP_L: M_CP(CPU.XX.B.l);break; +case CP_A: CPU.AF.B.l=N_FLAG|Z_FLAG;break; +case CP_xHL: I=RdZ80(CPU.XX.W+(offset)OpZ80(CPU.PC.W++)); M_CP(I);break; -case CP_BYTE: I=OpZ80(R->PC.W++);M_CP(I);break; +case CP_BYTE: I=OpZ80(CPU.PC.W++);M_CP(I);break; case LD_BC_WORD: M_LDWORD(BC);break; case LD_DE_WORD: M_LDWORD(DE);break; case LD_HL_WORD: M_LDWORD(XX);break; case LD_SP_WORD: M_LDWORD(SP);break; -case LD_PC_HL: R->PC.W=R->XX.W;JumpZ80(R->PC.W);break; -case LD_SP_HL: R->SP.W=R->XX.W;break; -case LD_A_xBC: R->AF.B.h=RdZ80(R->BC.W);break; -case LD_A_xDE: R->AF.B.h=RdZ80(R->DE.W);break; +case LD_PC_HL: CPU.PC.W=CPU.XX.W;JumpZ80(CPU.PC.W);break; +case LD_SP_HL: CPU.SP.W=CPU.XX.W;break; +case LD_A_xBC: CPU.AF.B.h=RdZ80(CPU.BC.W);break; +case LD_A_xDE: CPU.AF.B.h=RdZ80(CPU.DE.W);break; case ADD_HL_BC: M_ADDW(XX,BC);break; case ADD_HL_DE: M_ADDW(XX,DE);break; case ADD_HL_HL: M_ADDW(XX,XX);break; case ADD_HL_SP: M_ADDW(XX,SP);break; -case DEC_BC: R->BC.W--;break; -case DEC_DE: R->DE.W--;break; -case DEC_HL: R->XX.W--;break; -case DEC_SP: R->SP.W--;break; - -case INC_BC: R->BC.W++;break; -case INC_DE: R->DE.W++;break; -case INC_HL: R->XX.W++;break; -case INC_SP: R->SP.W++;break; - -case DEC_B: M_DEC(R->BC.B.h);break; -case DEC_C: M_DEC(R->BC.B.l);break; -case DEC_D: M_DEC(R->DE.B.h);break; -case DEC_E: M_DEC(R->DE.B.l);break; -case DEC_H: M_DEC(R->XX.B.h);break; -case DEC_L: M_DEC(R->XX.B.l);break; -case DEC_A: M_DEC(R->AF.B.h);break; -case DEC_xHL: I=RdZ80(R->XX.W+(offset)RdZ80(R->PC.W));M_DEC(I); - WrZ80(R->XX.W+(offset)OpZ80(R->PC.W++),I); +case DEC_BC: CPU.BC.W--;break; +case DEC_DE: CPU.DE.W--;break; +case DEC_HL: CPU.XX.W--;break; +case DEC_SP: CPU.SP.W--;break; + +case INC_BC: CPU.BC.W++;break; +case INC_DE: CPU.DE.W++;break; +case INC_HL: CPU.XX.W++;break; +case INC_SP: CPU.SP.W++;break; + +case DEC_B: M_DEC(CPU.BC.B.h);break; +case DEC_C: M_DEC(CPU.BC.B.l);break; +case DEC_D: M_DEC(CPU.DE.B.h);break; +case DEC_E: M_DEC(CPU.DE.B.l);break; +case DEC_H: M_DEC(CPU.XX.B.h);break; +case DEC_L: M_DEC(CPU.XX.B.l);break; +case DEC_A: M_DEC(CPU.AF.B.h);break; +case DEC_xHL: I=RdZ80(CPU.XX.W+(offset)RdZ80(CPU.PC.W));M_DEC(I); + WrZ80(CPU.XX.W+(offset)OpZ80(CPU.PC.W++),I); break; -case INC_B: M_INC(R->BC.B.h);break; -case INC_C: M_INC(R->BC.B.l);break; -case INC_D: M_INC(R->DE.B.h);break; -case INC_E: M_INC(R->DE.B.l);break; -case INC_H: M_INC(R->XX.B.h);break; -case INC_L: M_INC(R->XX.B.l);break; -case INC_A: M_INC(R->AF.B.h);break; -case INC_xHL: I=RdZ80(R->XX.W+(offset)RdZ80(R->PC.W));M_INC(I); - WrZ80(R->XX.W+(offset)OpZ80(R->PC.W++),I); +case INC_B: M_INC(CPU.BC.B.h);break; +case INC_C: M_INC(CPU.BC.B.l);break; +case INC_D: M_INC(CPU.DE.B.h);break; +case INC_E: M_INC(CPU.DE.B.l);break; +case INC_H: M_INC(CPU.XX.B.h);break; +case INC_L: M_INC(CPU.XX.B.l);break; +case INC_A: M_INC(CPU.AF.B.h);break; +case INC_xHL: I=RdZ80(CPU.XX.W+(offset)RdZ80(CPU.PC.W));M_INC(I); + WrZ80(CPU.XX.W+(offset)OpZ80(CPU.PC.W++),I); break; case RLCA: - I=(R->AF.B.h&0x80? C_FLAG:0); - R->AF.B.h=(R->AF.B.h<<1)|I; - R->AF.B.l=(R->AF.B.l&~(C_FLAG|N_FLAG|H_FLAG))|I; + I=(CPU.AF.B.h&0x80? C_FLAG:0); + CPU.AF.B.h=(CPU.AF.B.h<<1)|I; + CPU.AF.B.l=(CPU.AF.B.l&~(C_FLAG|N_FLAG|H_FLAG))|I; break; case RLA: - I=(R->AF.B.h&0x80? C_FLAG:0); - R->AF.B.h=(R->AF.B.h<<1)|(R->AF.B.l&C_FLAG); - R->AF.B.l=(R->AF.B.l&~(C_FLAG|N_FLAG|H_FLAG))|I; + I=(CPU.AF.B.h&0x80? C_FLAG:0); + CPU.AF.B.h=(CPU.AF.B.h<<1)|(CPU.AF.B.l&C_FLAG); + CPU.AF.B.l=(CPU.AF.B.l&~(C_FLAG|N_FLAG|H_FLAG))|I; break; case RRCA: - I=R->AF.B.h&0x01; - R->AF.B.h=(R->AF.B.h>>1)|(I? 0x80:0); - R->AF.B.l=(R->AF.B.l&~(C_FLAG|N_FLAG|H_FLAG))|I; + I=CPU.AF.B.h&0x01; + CPU.AF.B.h=(CPU.AF.B.h>>1)|(I? 0x80:0); + CPU.AF.B.l=(CPU.AF.B.l&~(C_FLAG|N_FLAG|H_FLAG))|I; break; case RRA: - I=R->AF.B.h&0x01; - R->AF.B.h=(R->AF.B.h>>1)|(R->AF.B.l&C_FLAG? 0x80:0); - R->AF.B.l=(R->AF.B.l&~(C_FLAG|N_FLAG|H_FLAG))|I; + I=CPU.AF.B.h&0x01; + CPU.AF.B.h=(CPU.AF.B.h>>1)|(CPU.AF.B.l&C_FLAG? 0x80:0); + CPU.AF.B.l=(CPU.AF.B.l&~(C_FLAG|N_FLAG|H_FLAG))|I; break; case RST00: M_RST(0x0000);break; @@ -218,179 +218,179 @@ case POP_DE: M_POP(DE);break; case POP_HL: M_POP(XX);break; case POP_AF: M_POP(AF);break; -case DJNZ: if(--R->BC.B.h) { R->ICount-=5;M_JR; } else R->PC.W++;break; +case DJNZ: if(--CPU.BC.B.h) { CPU.ICount-=5;M_JR; } else CPU.PC.W++;break; case JP: M_JP;break; case JR: M_JR;break; case CALL: M_CALL;break; case RET: M_RET;break; case SCF: S(C_FLAG);R(N_FLAG|H_FLAG);break; -case CPL: R->AF.B.h=~R->AF.B.h;S(N_FLAG|H_FLAG);break; +case CPL: CPU.AF.B.h=~CPU.AF.B.h;S(N_FLAG|H_FLAG);break; case NOP: break; -case OUTA: I=OpZ80(R->PC.W++);OutZ80(I|(R->AF.W&0xFF00),R->AF.B.h);break; -case INA: I=OpZ80(R->PC.W++);R->AF.B.h=InZ80(I|(R->AF.W&0xFF00));break; +case OUTA: I=OpZ80(CPU.PC.W++);OutZ80(I|(CPU.AF.W&0xFF00),CPU.AF.B.h);break; +case INA: I=OpZ80(CPU.PC.W++);CPU.AF.B.h=InZ80(I|(CPU.AF.W&0xFF00));break; case HALT: - R->PC.W--; - R->IFF|=IFF_HALT; - R->IBackup=0; - R->ICount=0; + CPU.PC.W--; + CPU.IFF|=IFF_HALT; + CPU.IBackup=0; + CPU.ICount=0; break; case DI: - if(R->IFF&IFF_EI) R->ICount+=R->IBackup-1; - R->IFF&=~(IFF_1|IFF_2|IFF_EI); + if(CPU.IFF&IFF_EI) CPU.ICount+=CPU.IBackup-1; + CPU.IFF&=~(IFF_1|IFF_2|IFF_EI); break; case EI: - if(!(R->IFF&(IFF_1|IFF_EI))) + if(!(CPU.IFF&(IFF_1|IFF_EI))) { - R->IFF|=IFF_2|IFF_EI; - R->IBackup=R->ICount; - R->ICount=1; + CPU.IFF|=IFF_2|IFF_EI; + CPU.IBackup=CPU.ICount; + CPU.ICount=1; } break; case CCF: - R->AF.B.l^=C_FLAG;R(N_FLAG|H_FLAG); - R->AF.B.l|=R->AF.B.l&C_FLAG? 0:H_FLAG; + CPU.AF.B.l^=C_FLAG;R(N_FLAG|H_FLAG); + CPU.AF.B.l|=CPU.AF.B.l&C_FLAG? 0:H_FLAG; break; case EXX: - J.W=R->BC.W;R->BC.W=R->BC1.W;R->BC1.W=J.W; - J.W=R->DE.W;R->DE.W=R->DE1.W;R->DE1.W=J.W; - J.W=R->HL.W;R->HL.W=R->HL1.W;R->HL1.W=J.W; + J.W=CPU.BC.W;CPU.BC.W=CPU.BC1.W;CPU.BC1.W=J.W; + J.W=CPU.DE.W;CPU.DE.W=CPU.DE1.W;CPU.DE1.W=J.W; + J.W=CPU.HL.W;CPU.HL.W=CPU.HL1.W;CPU.HL1.W=J.W; break; -case EX_DE_HL: J.W=R->DE.W;R->DE.W=R->HL.W;R->HL.W=J.W;break; -case EX_AF_AF: J.W=R->AF.W;R->AF.W=R->AF1.W;R->AF1.W=J.W;break; +case EX_DE_HL: J.W=CPU.DE.W;CPU.DE.W=CPU.HL.W;CPU.HL.W=J.W;break; +case EX_AF_AF: J.W=CPU.AF.W;CPU.AF.W=CPU.AF1.W;CPU.AF1.W=J.W;break; -case LD_B_B: R->BC.B.h=R->BC.B.h;break; -case LD_C_B: R->BC.B.l=R->BC.B.h;break; -case LD_D_B: R->DE.B.h=R->BC.B.h;break; -case LD_E_B: R->DE.B.l=R->BC.B.h;break; -case LD_H_B: R->XX.B.h=R->BC.B.h;break; -case LD_L_B: R->XX.B.l=R->BC.B.h;break; -case LD_A_B: R->AF.B.h=R->BC.B.h;break; -case LD_xHL_B: J.W=R->XX.W+(offset)OpZ80(R->PC.W++); - WrZ80(J.W,R->BC.B.h);break; - -case LD_B_C: R->BC.B.h=R->BC.B.l;break; -case LD_C_C: R->BC.B.l=R->BC.B.l;break; -case LD_D_C: R->DE.B.h=R->BC.B.l;break; -case LD_E_C: R->DE.B.l=R->BC.B.l;break; -case LD_H_C: R->XX.B.h=R->BC.B.l;break; -case LD_L_C: R->XX.B.l=R->BC.B.l;break; -case LD_A_C: R->AF.B.h=R->BC.B.l;break; -case LD_xHL_C: J.W=R->XX.W+(offset)OpZ80(R->PC.W++); - WrZ80(J.W,R->BC.B.l);break; - -case LD_B_D: R->BC.B.h=R->DE.B.h;break; -case LD_C_D: R->BC.B.l=R->DE.B.h;break; -case LD_D_D: R->DE.B.h=R->DE.B.h;break; -case LD_E_D: R->DE.B.l=R->DE.B.h;break; -case LD_H_D: R->XX.B.h=R->DE.B.h;break; -case LD_L_D: R->XX.B.l=R->DE.B.h;break; -case LD_A_D: R->AF.B.h=R->DE.B.h;break; -case LD_xHL_D: J.W=R->XX.W+(offset)OpZ80(R->PC.W++); - WrZ80(J.W,R->DE.B.h);break; - -case LD_B_E: R->BC.B.h=R->DE.B.l;break; -case LD_C_E: R->BC.B.l=R->DE.B.l;break; -case LD_D_E: R->DE.B.h=R->DE.B.l;break; -case LD_E_E: R->DE.B.l=R->DE.B.l;break; -case LD_H_E: R->XX.B.h=R->DE.B.l;break; -case LD_L_E: R->XX.B.l=R->DE.B.l;break; -case LD_A_E: R->AF.B.h=R->DE.B.l;break; -case LD_xHL_E: J.W=R->XX.W+(offset)OpZ80(R->PC.W++); - WrZ80(J.W,R->DE.B.l);break; - -case LD_B_H: R->BC.B.h=R->XX.B.h;break; -case LD_C_H: R->BC.B.l=R->XX.B.h;break; -case LD_D_H: R->DE.B.h=R->XX.B.h;break; -case LD_E_H: R->DE.B.l=R->XX.B.h;break; -case LD_H_H: R->XX.B.h=R->XX.B.h;break; -case LD_L_H: R->XX.B.l=R->XX.B.h;break; -case LD_A_H: R->AF.B.h=R->XX.B.h;break; -case LD_xHL_H: J.W=R->XX.W+(offset)OpZ80(R->PC.W++); - WrZ80(J.W,R->HL.B.h);break; - -case LD_B_L: R->BC.B.h=R->XX.B.l;break; -case LD_C_L: R->BC.B.l=R->XX.B.l;break; -case LD_D_L: R->DE.B.h=R->XX.B.l;break; -case LD_E_L: R->DE.B.l=R->XX.B.l;break; -case LD_H_L: R->XX.B.h=R->XX.B.l;break; -case LD_L_L: R->XX.B.l=R->XX.B.l;break; -case LD_A_L: R->AF.B.h=R->XX.B.l;break; -case LD_xHL_L: J.W=R->XX.W+(offset)OpZ80(R->PC.W++); - WrZ80(J.W,R->HL.B.l);break; - -case LD_B_A: R->BC.B.h=R->AF.B.h;break; -case LD_C_A: R->BC.B.l=R->AF.B.h;break; -case LD_D_A: R->DE.B.h=R->AF.B.h;break; -case LD_E_A: R->DE.B.l=R->AF.B.h;break; -case LD_H_A: R->XX.B.h=R->AF.B.h;break; -case LD_L_A: R->XX.B.l=R->AF.B.h;break; -case LD_A_A: R->AF.B.h=R->AF.B.h;break; -case LD_xHL_A: J.W=R->XX.W+(offset)OpZ80(R->PC.W++); - WrZ80(J.W,R->AF.B.h);break; - -case LD_xBC_A: WrZ80(R->BC.W,R->AF.B.h);break; -case LD_xDE_A: WrZ80(R->DE.W,R->AF.B.h);break; - -case LD_B_xHL: R->BC.B.h=RdZ80(R->XX.W+(offset)OpZ80(R->PC.W++));break; -case LD_C_xHL: R->BC.B.l=RdZ80(R->XX.W+(offset)OpZ80(R->PC.W++));break; -case LD_D_xHL: R->DE.B.h=RdZ80(R->XX.W+(offset)OpZ80(R->PC.W++));break; -case LD_E_xHL: R->DE.B.l=RdZ80(R->XX.W+(offset)OpZ80(R->PC.W++));break; -case LD_H_xHL: R->HL.B.h=RdZ80(R->XX.W+(offset)OpZ80(R->PC.W++));break; -case LD_L_xHL: R->HL.B.l=RdZ80(R->XX.W+(offset)OpZ80(R->PC.W++));break; -case LD_A_xHL: R->AF.B.h=RdZ80(R->XX.W+(offset)OpZ80(R->PC.W++));break; - -case LD_B_BYTE: R->BC.B.h=OpZ80(R->PC.W++);break; -case LD_C_BYTE: R->BC.B.l=OpZ80(R->PC.W++);break; -case LD_D_BYTE: R->DE.B.h=OpZ80(R->PC.W++);break; -case LD_E_BYTE: R->DE.B.l=OpZ80(R->PC.W++);break; -case LD_H_BYTE: R->XX.B.h=OpZ80(R->PC.W++);break; -case LD_L_BYTE: R->XX.B.l=OpZ80(R->PC.W++);break; -case LD_A_BYTE: R->AF.B.h=OpZ80(R->PC.W++);break; -case LD_xHL_BYTE: J.W=R->XX.W+(offset)OpZ80(R->PC.W++); - WrZ80(J.W,OpZ80(R->PC.W++));break; +case LD_B_B: CPU.BC.B.h=CPU.BC.B.h;break; +case LD_C_B: CPU.BC.B.l=CPU.BC.B.h;break; +case LD_D_B: CPU.DE.B.h=CPU.BC.B.h;break; +case LD_E_B: CPU.DE.B.l=CPU.BC.B.h;break; +case LD_H_B: CPU.XX.B.h=CPU.BC.B.h;break; +case LD_L_B: CPU.XX.B.l=CPU.BC.B.h;break; +case LD_A_B: CPU.AF.B.h=CPU.BC.B.h;break; +case LD_xHL_B: J.W=CPU.XX.W+(offset)OpZ80(CPU.PC.W++); + WrZ80(J.W,CPU.BC.B.h);break; + +case LD_B_C: CPU.BC.B.h=CPU.BC.B.l;break; +case LD_C_C: CPU.BC.B.l=CPU.BC.B.l;break; +case LD_D_C: CPU.DE.B.h=CPU.BC.B.l;break; +case LD_E_C: CPU.DE.B.l=CPU.BC.B.l;break; +case LD_H_C: CPU.XX.B.h=CPU.BC.B.l;break; +case LD_L_C: CPU.XX.B.l=CPU.BC.B.l;break; +case LD_A_C: CPU.AF.B.h=CPU.BC.B.l;break; +case LD_xHL_C: J.W=CPU.XX.W+(offset)OpZ80(CPU.PC.W++); + WrZ80(J.W,CPU.BC.B.l);break; + +case LD_B_D: CPU.BC.B.h=CPU.DE.B.h;break; +case LD_C_D: CPU.BC.B.l=CPU.DE.B.h;break; +case LD_D_D: CPU.DE.B.h=CPU.DE.B.h;break; +case LD_E_D: CPU.DE.B.l=CPU.DE.B.h;break; +case LD_H_D: CPU.XX.B.h=CPU.DE.B.h;break; +case LD_L_D: CPU.XX.B.l=CPU.DE.B.h;break; +case LD_A_D: CPU.AF.B.h=CPU.DE.B.h;break; +case LD_xHL_D: J.W=CPU.XX.W+(offset)OpZ80(CPU.PC.W++); + WrZ80(J.W,CPU.DE.B.h);break; + +case LD_B_E: CPU.BC.B.h=CPU.DE.B.l;break; +case LD_C_E: CPU.BC.B.l=CPU.DE.B.l;break; +case LD_D_E: CPU.DE.B.h=CPU.DE.B.l;break; +case LD_E_E: CPU.DE.B.l=CPU.DE.B.l;break; +case LD_H_E: CPU.XX.B.h=CPU.DE.B.l;break; +case LD_L_E: CPU.XX.B.l=CPU.DE.B.l;break; +case LD_A_E: CPU.AF.B.h=CPU.DE.B.l;break; +case LD_xHL_E: J.W=CPU.XX.W+(offset)OpZ80(CPU.PC.W++); + WrZ80(J.W,CPU.DE.B.l);break; + +case LD_B_H: CPU.BC.B.h=CPU.XX.B.h;break; +case LD_C_H: CPU.BC.B.l=CPU.XX.B.h;break; +case LD_D_H: CPU.DE.B.h=CPU.XX.B.h;break; +case LD_E_H: CPU.DE.B.l=CPU.XX.B.h;break; +case LD_H_H: CPU.XX.B.h=CPU.XX.B.h;break; +case LD_L_H: CPU.XX.B.l=CPU.XX.B.h;break; +case LD_A_H: CPU.AF.B.h=CPU.XX.B.h;break; +case LD_xHL_H: J.W=CPU.XX.W+(offset)OpZ80(CPU.PC.W++); + WrZ80(J.W,CPU.HL.B.h);break; + +case LD_B_L: CPU.BC.B.h=CPU.XX.B.l;break; +case LD_C_L: CPU.BC.B.l=CPU.XX.B.l;break; +case LD_D_L: CPU.DE.B.h=CPU.XX.B.l;break; +case LD_E_L: CPU.DE.B.l=CPU.XX.B.l;break; +case LD_H_L: CPU.XX.B.h=CPU.XX.B.l;break; +case LD_L_L: CPU.XX.B.l=CPU.XX.B.l;break; +case LD_A_L: CPU.AF.B.h=CPU.XX.B.l;break; +case LD_xHL_L: J.W=CPU.XX.W+(offset)OpZ80(CPU.PC.W++); + WrZ80(J.W,CPU.HL.B.l);break; + +case LD_B_A: CPU.BC.B.h=CPU.AF.B.h;break; +case LD_C_A: CPU.BC.B.l=CPU.AF.B.h;break; +case LD_D_A: CPU.DE.B.h=CPU.AF.B.h;break; +case LD_E_A: CPU.DE.B.l=CPU.AF.B.h;break; +case LD_H_A: CPU.XX.B.h=CPU.AF.B.h;break; +case LD_L_A: CPU.XX.B.l=CPU.AF.B.h;break; +case LD_A_A: CPU.AF.B.h=CPU.AF.B.h;break; +case LD_xHL_A: J.W=CPU.XX.W+(offset)OpZ80(CPU.PC.W++); + WrZ80(J.W,CPU.AF.B.h);break; + +case LD_xBC_A: WrZ80(CPU.BC.W,CPU.AF.B.h);break; +case LD_xDE_A: WrZ80(CPU.DE.W,CPU.AF.B.h);break; + +case LD_B_xHL: CPU.BC.B.h=RdZ80(CPU.XX.W+(offset)OpZ80(CPU.PC.W++));break; +case LD_C_xHL: CPU.BC.B.l=RdZ80(CPU.XX.W+(offset)OpZ80(CPU.PC.W++));break; +case LD_D_xHL: CPU.DE.B.h=RdZ80(CPU.XX.W+(offset)OpZ80(CPU.PC.W++));break; +case LD_E_xHL: CPU.DE.B.l=RdZ80(CPU.XX.W+(offset)OpZ80(CPU.PC.W++));break; +case LD_H_xHL: CPU.HL.B.h=RdZ80(CPU.XX.W+(offset)OpZ80(CPU.PC.W++));break; +case LD_L_xHL: CPU.HL.B.l=RdZ80(CPU.XX.W+(offset)OpZ80(CPU.PC.W++));break; +case LD_A_xHL: CPU.AF.B.h=RdZ80(CPU.XX.W+(offset)OpZ80(CPU.PC.W++));break; + +case LD_B_BYTE: CPU.BC.B.h=OpZ80(CPU.PC.W++);break; +case LD_C_BYTE: CPU.BC.B.l=OpZ80(CPU.PC.W++);break; +case LD_D_BYTE: CPU.DE.B.h=OpZ80(CPU.PC.W++);break; +case LD_E_BYTE: CPU.DE.B.l=OpZ80(CPU.PC.W++);break; +case LD_H_BYTE: CPU.XX.B.h=OpZ80(CPU.PC.W++);break; +case LD_L_BYTE: CPU.XX.B.l=OpZ80(CPU.PC.W++);break; +case LD_A_BYTE: CPU.AF.B.h=OpZ80(CPU.PC.W++);break; +case LD_xHL_BYTE: J.W=CPU.XX.W+(offset)OpZ80(CPU.PC.W++); + WrZ80(J.W,OpZ80(CPU.PC.W++));break; case LD_xWORD_HL: - J.B.l=OpZ80(R->PC.W++); - J.B.h=OpZ80(R->PC.W++); - WrZ80(J.W++,R->XX.B.l); - WrZ80(J.W,R->XX.B.h); + J.B.l=OpZ80(CPU.PC.W++); + J.B.h=OpZ80(CPU.PC.W++); + WrZ80(J.W++,CPU.XX.B.l); + WrZ80(J.W,CPU.XX.B.h); break; case LD_HL_xWORD: - J.B.l=OpZ80(R->PC.W++); - J.B.h=OpZ80(R->PC.W++); - R->XX.B.l=RdZ80(J.W++); - R->XX.B.h=RdZ80(J.W); + J.B.l=OpZ80(CPU.PC.W++); + J.B.h=OpZ80(CPU.PC.W++); + CPU.XX.B.l=RdZ80(J.W++); + CPU.XX.B.h=RdZ80(J.W); break; case LD_A_xWORD: - J.B.l=OpZ80(R->PC.W++); - J.B.h=OpZ80(R->PC.W++); - R->AF.B.h=RdZ80(J.W); + J.B.l=OpZ80(CPU.PC.W++); + J.B.h=OpZ80(CPU.PC.W++); + CPU.AF.B.h=RdZ80(J.W); break; case LD_xWORD_A: - J.B.l=OpZ80(R->PC.W++); - J.B.h=OpZ80(R->PC.W++); - WrZ80(J.W,R->AF.B.h); + J.B.l=OpZ80(CPU.PC.W++); + J.B.h=OpZ80(CPU.PC.W++); + WrZ80(J.W,CPU.AF.B.h); break; case EX_HL_xSP: - J.B.l=RdZ80(R->SP.W);WrZ80(R->SP.W++,R->XX.B.l); - J.B.h=RdZ80(R->SP.W);WrZ80(R->SP.W--,R->XX.B.h); - R->XX.W=J.W; + J.B.l=RdZ80(CPU.SP.W);WrZ80(CPU.SP.W++,CPU.XX.B.l); + J.B.h=RdZ80(CPU.SP.W);WrZ80(CPU.SP.W--,CPU.XX.B.h); + CPU.XX.W=J.W; break; case DAA: - J.W=R->AF.B.h; - if(R->AF.B.l&C_FLAG) J.W|=256; - if(R->AF.B.l&H_FLAG) J.W|=512; - if(R->AF.B.l&N_FLAG) J.W|=1024; - R->AF.W=DAATable[J.W]; + J.W=CPU.AF.B.h; + if(CPU.AF.B.l&C_FLAG) J.W|=256; + if(CPU.AF.B.l&H_FLAG) J.W|=512; + if(CPU.AF.B.l&N_FLAG) J.W|=1024; + CPU.AF.W=DAATable[J.W]; break; diff --git a/arm9/source/cpu/z80/Z80.c b/arm9/source/cpu/z80/Z80.c index 9f494b31..dd8328e4 100644 --- a/arm9/source/cpu/z80/Z80.c +++ b/arm9/source/cpu/z80/Z80.c @@ -17,6 +17,8 @@ #include "Tables.h" #include +extern Z80 CPU; + /** INLINE ***************************************************/ /** C99 standard has "inline", but older compilers used **/ /** __inline for the same purpose. **/ @@ -35,181 +37,180 @@ extern byte pColecoMem[]; INLINE byte OpZ80(word A) { return pColecoMem[A]; } -#define S(Fl) R->AF.B.l|=Fl -#define R(Fl) R->AF.B.l&=~(Fl) -#define FLAGS(Rg,Fl) R->AF.B.l=Fl|ZSTable[Rg] -#define INCR(N) R->R=((R->R+(N))&0x7F)|(R->R&0x80) +// ----------------------------------------------- +// These two functions are for the CZ80 core... +// ----------------------------------------------- +extern u8 bMagicMegaCart, romBankMask; +extern void cpu_writemem16 (u8 value,u16 address); +extern void BankSwitch(u8 bank); +INLINE void WrZ80(register word address,register byte Value) +{ + cpu_writemem16(Value, address); +} + +INLINE byte RdZ80(register word address) +{ + if (bMagicMegaCart && (address >= 0xFFC0)) // Handle Megacart Hot Spots + { + BankSwitch(address & romBankMask); + } + return (pColecoMem[address]); +} + +#define S(Fl) CPU.AF.B.l|=Fl +#define R(Fl) CPU.AF.B.l&=~(Fl) +#define FLAGS(Rg,Fl) CPU.AF.B.l=Fl|ZSTable[Rg] +#define INCR(N) CPU.R=((CPU.R+(N))&0x7F)|(CPU.R&0x80) #define M_RLC(Rg) \ - R->AF.B.l=Rg>>7;Rg=(Rg<<1)|R->AF.B.l;R->AF.B.l|=PZSTable[Rg] + CPU.AF.B.l=Rg>>7;Rg=(Rg<<1)|CPU.AF.B.l;CPU.AF.B.l|=PZSTable[Rg] #define M_RRC(Rg) \ - R->AF.B.l=Rg&0x01;Rg=(Rg>>1)|(R->AF.B.l<<7);R->AF.B.l|=PZSTable[Rg] + CPU.AF.B.l=Rg&0x01;Rg=(Rg>>1)|(CPU.AF.B.l<<7);CPU.AF.B.l|=PZSTable[Rg] #define M_RL(Rg) \ if(Rg&0x80) \ { \ - Rg=(Rg<<1)|(R->AF.B.l&C_FLAG); \ - R->AF.B.l=PZSTable[Rg]|C_FLAG; \ + Rg=(Rg<<1)|(CPU.AF.B.l&C_FLAG); \ + CPU.AF.B.l=PZSTable[Rg]|C_FLAG; \ } \ else \ { \ - Rg=(Rg<<1)|(R->AF.B.l&C_FLAG); \ - R->AF.B.l=PZSTable[Rg]; \ + Rg=(Rg<<1)|(CPU.AF.B.l&C_FLAG); \ + CPU.AF.B.l=PZSTable[Rg]; \ } #define M_RR(Rg) \ if(Rg&0x01) \ { \ - Rg=(Rg>>1)|(R->AF.B.l<<7); \ - R->AF.B.l=PZSTable[Rg]|C_FLAG; \ + Rg=(Rg>>1)|(CPU.AF.B.l<<7); \ + CPU.AF.B.l=PZSTable[Rg]|C_FLAG; \ } \ else \ { \ - Rg=(Rg>>1)|(R->AF.B.l<<7); \ - R->AF.B.l=PZSTable[Rg]; \ + Rg=(Rg>>1)|(CPU.AF.B.l<<7); \ + CPU.AF.B.l=PZSTable[Rg]; \ } #define M_SLA(Rg) \ - R->AF.B.l=Rg>>7;Rg<<=1;R->AF.B.l|=PZSTable[Rg] + CPU.AF.B.l=Rg>>7;Rg<<=1;CPU.AF.B.l|=PZSTable[Rg] #define M_SRA(Rg) \ - R->AF.B.l=Rg&C_FLAG;Rg=(Rg>>1)|(Rg&0x80);R->AF.B.l|=PZSTable[Rg] + CPU.AF.B.l=Rg&C_FLAG;Rg=(Rg>>1)|(Rg&0x80);CPU.AF.B.l|=PZSTable[Rg] #define M_SLL(Rg) \ - R->AF.B.l=Rg>>7;Rg=(Rg<<1)|0x01;R->AF.B.l|=PZSTable[Rg] + CPU.AF.B.l=Rg>>7;Rg=(Rg<<1)|0x01;CPU.AF.B.l|=PZSTable[Rg] #define M_SRL(Rg) \ - R->AF.B.l=Rg&0x01;Rg>>=1;R->AF.B.l|=PZSTable[Rg] + CPU.AF.B.l=Rg&0x01;Rg>>=1;CPU.AF.B.l|=PZSTable[Rg] #define M_BIT(Bit,Rg) \ - R->AF.B.l=(R->AF.B.l&C_FLAG)|H_FLAG|PZSTable[Rg&(1<Rg.B.l=OpZ80(R->SP.W++);R->Rg.B.h=OpZ80(R->SP.W++) + CPU.Rg.B.l=OpZ80(CPU.SP.W++);CPU.Rg.B.h=OpZ80(CPU.SP.W++) #define M_PUSH(Rg) \ - WrZ80(--R->SP.W,R->Rg.B.h);WrZ80(--R->SP.W,R->Rg.B.l) + WrZ80(--CPU.SP.W,CPU.Rg.B.h);WrZ80(--CPU.SP.W,CPU.Rg.B.l) #define M_CALL \ - J.B.l=OpZ80(R->PC.W++);J.B.h=OpZ80(R->PC.W++); \ - WrZ80(--R->SP.W,R->PC.B.h);WrZ80(--R->SP.W,R->PC.B.l); \ - R->PC.W=J.W; \ + J.B.l=OpZ80(CPU.PC.W++);J.B.h=OpZ80(CPU.PC.W++); \ + WrZ80(--CPU.SP.W,CPU.PC.B.h);WrZ80(--CPU.SP.W,CPU.PC.B.l); \ + CPU.PC.W=J.W; \ JumpZ80(J.W) -#define M_JP J.B.l=OpZ80(R->PC.W++);J.B.h=OpZ80(R->PC.W);R->PC.W=J.W;JumpZ80(J.W) -#define M_JR R->PC.W+=(offset)OpZ80(R->PC.W)+1;JumpZ80(R->PC.W) -#define M_RET R->PC.B.l=OpZ80(R->SP.W++);R->PC.B.h=OpZ80(R->SP.W++);JumpZ80(R->PC.W) +#define M_JP J.B.l=OpZ80(CPU.PC.W++);J.B.h=OpZ80(CPU.PC.W);CPU.PC.W=J.W;JumpZ80(J.W) +#define M_JR CPU.PC.W+=(offset)OpZ80(CPU.PC.W)+1;JumpZ80(CPU.PC.W) +#define M_RET CPU.PC.B.l=OpZ80(CPU.SP.W++);CPU.PC.B.h=OpZ80(CPU.SP.W++);JumpZ80(CPU.PC.W) #define M_RST(Ad) \ - WrZ80(--R->SP.W,R->PC.B.h);WrZ80(--R->SP.W,R->PC.B.l);R->PC.W=Ad;JumpZ80(Ad) + WrZ80(--CPU.SP.W,CPU.PC.B.h);WrZ80(--CPU.SP.W,CPU.PC.B.l);CPU.PC.W=Ad;JumpZ80(Ad) #define M_LDWORD(Rg) \ - R->Rg.B.l=OpZ80(R->PC.W++);R->Rg.B.h=OpZ80(R->PC.W++) + CPU.Rg.B.l=OpZ80(CPU.PC.W++);CPU.Rg.B.h=OpZ80(CPU.PC.W++) #define M_ADD(Rg) \ - J.W=R->AF.B.h+Rg; \ - R->AF.B.l= \ - (~(R->AF.B.h^Rg)&(Rg^J.B.l)&0x80? V_FLAG:0)| \ + J.W=CPU.AF.B.h+Rg; \ + CPU.AF.B.l= \ + (~(CPU.AF.B.h^Rg)&(Rg^J.B.l)&0x80? V_FLAG:0)| \ J.B.h|ZSTable[J.B.l]| \ - ((R->AF.B.h^Rg^J.B.l)&H_FLAG); \ - R->AF.B.h=J.B.l + ((CPU.AF.B.h^Rg^J.B.l)&H_FLAG); \ + CPU.AF.B.h=J.B.l #define M_SUB(Rg) \ - J.W=R->AF.B.h-Rg; \ - R->AF.B.l= \ - ((R->AF.B.h^Rg)&(R->AF.B.h^J.B.l)&0x80? V_FLAG:0)| \ + J.W=CPU.AF.B.h-Rg; \ + CPU.AF.B.l= \ + ((CPU.AF.B.h^Rg)&(CPU.AF.B.h^J.B.l)&0x80? V_FLAG:0)| \ N_FLAG|-J.B.h|ZSTable[J.B.l]| \ - ((R->AF.B.h^Rg^J.B.l)&H_FLAG); \ - R->AF.B.h=J.B.l + ((CPU.AF.B.h^Rg^J.B.l)&H_FLAG); \ + CPU.AF.B.h=J.B.l #define M_ADC(Rg) \ - J.W=R->AF.B.h+Rg+(R->AF.B.l&C_FLAG); \ - R->AF.B.l= \ - (~(R->AF.B.h^Rg)&(Rg^J.B.l)&0x80? V_FLAG:0)| \ + J.W=CPU.AF.B.h+Rg+(CPU.AF.B.l&C_FLAG); \ + CPU.AF.B.l= \ + (~(CPU.AF.B.h^Rg)&(Rg^J.B.l)&0x80? V_FLAG:0)| \ J.B.h|ZSTable[J.B.l]| \ - ((R->AF.B.h^Rg^J.B.l)&H_FLAG); \ - R->AF.B.h=J.B.l + ((CPU.AF.B.h^Rg^J.B.l)&H_FLAG); \ + CPU.AF.B.h=J.B.l #define M_SBC(Rg) \ - J.W=R->AF.B.h-Rg-(R->AF.B.l&C_FLAG); \ - R->AF.B.l= \ - ((R->AF.B.h^Rg)&(R->AF.B.h^J.B.l)&0x80? V_FLAG:0)| \ + J.W=CPU.AF.B.h-Rg-(CPU.AF.B.l&C_FLAG); \ + CPU.AF.B.l= \ + ((CPU.AF.B.h^Rg)&(CPU.AF.B.h^J.B.l)&0x80? V_FLAG:0)| \ N_FLAG|-J.B.h|ZSTable[J.B.l]| \ - ((R->AF.B.h^Rg^J.B.l)&H_FLAG); \ - R->AF.B.h=J.B.l + ((CPU.AF.B.h^Rg^J.B.l)&H_FLAG); \ + CPU.AF.B.h=J.B.l #define M_CP(Rg) \ - J.W=R->AF.B.h-Rg; \ - R->AF.B.l= \ - ((R->AF.B.h^Rg)&(R->AF.B.h^J.B.l)&0x80? V_FLAG:0)| \ + J.W=CPU.AF.B.h-Rg; \ + CPU.AF.B.l= \ + ((CPU.AF.B.h^Rg)&(CPU.AF.B.h^J.B.l)&0x80? V_FLAG:0)| \ N_FLAG|-J.B.h|ZSTable[J.B.l]| \ - ((R->AF.B.h^Rg^J.B.l)&H_FLAG) + ((CPU.AF.B.h^Rg^J.B.l)&H_FLAG) -#define M_AND(Rg) R->AF.B.h&=Rg;R->AF.B.l=H_FLAG|PZSTable[R->AF.B.h] -#define M_OR(Rg) R->AF.B.h|=Rg;R->AF.B.l=PZSTable[R->AF.B.h] -#define M_XOR(Rg) R->AF.B.h^=Rg;R->AF.B.l=PZSTable[R->AF.B.h] +#define M_AND(Rg) CPU.AF.B.h&=Rg;CPU.AF.B.l=H_FLAG|PZSTable[CPU.AF.B.h] +#define M_OR(Rg) CPU.AF.B.h|=Rg;CPU.AF.B.l=PZSTable[CPU.AF.B.h] +#define M_XOR(Rg) CPU.AF.B.h^=Rg;CPU.AF.B.l=PZSTable[CPU.AF.B.h] #define M_IN(Rg) \ - Rg=InZ80(R->BC.W); \ - R->AF.B.l=PZSTable[Rg]|(R->AF.B.l&C_FLAG) + Rg=InZ80(CPU.BC.W); \ + CPU.AF.B.l=PZSTable[Rg]|(CPU.AF.B.l&C_FLAG) #define M_INC(Rg) \ Rg++; \ - R->AF.B.l= \ - (R->AF.B.l&C_FLAG)|ZSTable[Rg]| \ + CPU.AF.B.l= \ + (CPU.AF.B.l&C_FLAG)|ZSTable[Rg]| \ (Rg==0x80? V_FLAG:0)|(Rg&0x0F? 0:H_FLAG) #define M_DEC(Rg) \ Rg--; \ - R->AF.B.l= \ - N_FLAG|(R->AF.B.l&C_FLAG)|ZSTable[Rg]| \ + CPU.AF.B.l= \ + N_FLAG|(CPU.AF.B.l&C_FLAG)|ZSTable[Rg]| \ (Rg==0x7F? V_FLAG:0)|((Rg&0x0F)==0x0F? H_FLAG:0) #define M_ADDW(Rg1,Rg2) \ - J.W=(R->Rg1.W+R->Rg2.W)&0xFFFF; \ - R->AF.B.l= \ - (R->AF.B.l&~(H_FLAG|N_FLAG|C_FLAG))| \ - ((R->Rg1.W^R->Rg2.W^J.W)&0x1000? H_FLAG:0)| \ - (((long)R->Rg1.W+(long)R->Rg2.W)&0x10000? C_FLAG:0); \ - R->Rg1.W=J.W + J.W=(CPU.Rg1.W+CPU.Rg2.W)&0xFFFF; \ + CPU.AF.B.l= \ + (CPU.AF.B.l&~(H_FLAG|N_FLAG|C_FLAG))| \ + ((CPU.Rg1.W^CPU.Rg2.W^J.W)&0x1000? H_FLAG:0)| \ + (((long)CPU.Rg1.W+(long)CPU.Rg2.W)&0x10000? C_FLAG:0); \ + CPU.Rg1.W=J.W #define M_ADCW(Rg) \ - I=R->AF.B.l&C_FLAG;J.W=(R->HL.W+R->Rg.W+I)&0xFFFF; \ - R->AF.B.l= \ - (((long)R->HL.W+(long)R->Rg.W+(long)I)&0x10000? C_FLAG:0)| \ - (~(R->HL.W^R->Rg.W)&(R->Rg.W^J.W)&0x8000? V_FLAG:0)| \ - ((R->HL.W^R->Rg.W^J.W)&0x1000? H_FLAG:0)| \ + I=CPU.AF.B.l&C_FLAG;J.W=(CPU.HL.W+CPU.Rg.W+I)&0xFFFF; \ + CPU.AF.B.l= \ + (((long)CPU.HL.W+(long)CPU.Rg.W+(long)I)&0x10000? C_FLAG:0)| \ + (~(CPU.HL.W^CPU.Rg.W)&(CPU.Rg.W^J.W)&0x8000? V_FLAG:0)| \ + ((CPU.HL.W^CPU.Rg.W^J.W)&0x1000? H_FLAG:0)| \ (J.W? 0:Z_FLAG)|(J.B.h&S_FLAG); \ - R->HL.W=J.W + CPU.HL.W=J.W #define M_SBCW(Rg) \ - I=R->AF.B.l&C_FLAG;J.W=(R->HL.W-R->Rg.W-I)&0xFFFF; \ - R->AF.B.l= \ + I=CPU.AF.B.l&C_FLAG;J.W=(CPU.HL.W-CPU.Rg.W-I)&0xFFFF; \ + CPU.AF.B.l= \ N_FLAG| \ - (((long)R->HL.W-(long)R->Rg.W-(long)I)&0x10000? C_FLAG:0)| \ - ((R->HL.W^R->Rg.W)&(R->HL.W^J.W)&0x8000? V_FLAG:0)| \ - ((R->HL.W^R->Rg.W^J.W)&0x1000? H_FLAG:0)| \ + (((long)CPU.HL.W-(long)CPU.Rg.W-(long)I)&0x10000? C_FLAG:0)| \ + ((CPU.HL.W^CPU.Rg.W)&(CPU.HL.W^J.W)&0x8000? V_FLAG:0)| \ + ((CPU.HL.W^CPU.Rg.W^J.W)&0x1000? H_FLAG:0)| \ (J.W? 0:Z_FLAG)|(J.B.h&S_FLAG); \ - R->HL.W=J.W - - -// ----------------------------------------------- -// These two functions are for the CZ80 core... -// ----------------------------------------------- -extern u8 bMagicMegaCart, romBankMask; -extern void cpu_writemem16 (u8 value,u16 address); -extern void BankSwitch(u8 bank); -INLINE void WrZ80(register word address,register byte Value) -{ - cpu_writemem16(Value, address); -} - -INLINE byte RdZ80(register word address) -{ - if (bMagicMegaCart && (address >= 0xFFC0)) // Handle Megacart Hot Spots - { - BankSwitch(address & romBankMask); - } - return (pColecoMem[address]); -} + CPU.HL.W=J.W enum Codes @@ -325,8 +326,8 @@ static void CodesCB(register Z80 *R) register byte I; /* Read opcode and count cycles */ - I=OpZ80(R->PC.W++); - R->ICount-=CyclesCB[I]; + I=OpZ80(CPU.PC.W++); + CPU.ICount-=CyclesCB[I]; /* R register incremented on each M1 cycle */ INCR(1); @@ -335,11 +336,11 @@ static void CodesCB(register Z80 *R) { #include "CodesCB.h" default: - if(R->TrapBadOps) + if(CPU.TrapBadOps) printf ( "[Z80 %lX] Unrecognized instruction: CB %02X at PC=%04X\n", - (long)(R->User),OpZ80(R->PC.W-1),R->PC.W-2 + (long)(CPU.User),OpZ80(CPU.PC.W-1),CPU.PC.W-2 ); } } @@ -351,19 +352,19 @@ static void CodesDDCB(register Z80 *R) #define XX IX /* Get offset, read opcode and count cycles */ - J.W=R->XX.W+(offset)OpZ80(R->PC.W++); - I=OpZ80(R->PC.W++); - R->ICount-=CyclesXXCB[I]; + J.W=CPU.XX.W+(offset)OpZ80(CPU.PC.W++); + I=OpZ80(CPU.PC.W++); + CPU.ICount-=CyclesXXCB[I]; switch(I) { #include "CodesXCB.h" default: - if(R->TrapBadOps) + if(CPU.TrapBadOps) printf ( "[Z80 %lX] Unrecognized instruction: DD CB %02X %02X at PC=%04X\n", - (long)(R->User),OpZ80(R->PC.W-2),OpZ80(R->PC.W-1),R->PC.W-4 + (long)(CPU.User),OpZ80(CPU.PC.W-2),OpZ80(CPU.PC.W-1),CPU.PC.W-4 ); } #undef XX @@ -376,19 +377,19 @@ static void CodesFDCB(register Z80 *R) #define XX IY /* Get offset, read opcode and count cycles */ - J.W=R->XX.W+(offset)OpZ80(R->PC.W++); - I=OpZ80(R->PC.W++); - R->ICount-=CyclesXXCB[I]; + J.W=CPU.XX.W+(offset)OpZ80(CPU.PC.W++); + I=OpZ80(CPU.PC.W++); + CPU.ICount-=CyclesXXCB[I]; switch(I) { #include "CodesXCB.h" default: - if(R->TrapBadOps) + if(CPU.TrapBadOps) printf ( "[Z80 %lX] Unrecognized instruction: FD CB %02X %02X at PC=%04X\n", - (long)R->User,OpZ80(R->PC.W-2),OpZ80(R->PC.W-1),R->PC.W-4 + (long)CPU.User,OpZ80(CPU.PC.W-2),OpZ80(CPU.PC.W-1),CPU.PC.W-4 ); } #undef XX @@ -400,8 +401,8 @@ static void CodesED(register Z80 *R) register pair J; /* Read opcode and count cycles */ - I=OpZ80(R->PC.W++); - R->ICount-=CyclesED[I]; + I=OpZ80(CPU.PC.W++); + CPU.ICount-=CyclesED[I]; /* R register incremented on each M1 cycle */ INCR(1); @@ -410,13 +411,13 @@ static void CodesED(register Z80 *R) { #include "CodesED.h" case PFX_ED: - R->PC.W--;break; + CPU.PC.W--;break; default: - if(R->TrapBadOps) + if(CPU.TrapBadOps) printf ( "[Z80 %lX] Unrecognized instruction: ED %02X at PC=%04X\n", - (long)R->User,OpZ80(R->PC.W-1),R->PC.W-2 + (long)CPU.User,OpZ80(CPU.PC.W-1),CPU.PC.W-2 ); } } @@ -428,8 +429,8 @@ static void CodesDD(register Z80 *R) #define XX IX /* Read opcode and count cycles */ - I=OpZ80(R->PC.W++); - R->ICount-=CyclesXX[I]; + I=OpZ80(CPU.PC.W++); + CPU.ICount-=CyclesXX[I]; /* R register incremented on each M1 cycle */ INCR(1); @@ -439,15 +440,15 @@ static void CodesDD(register Z80 *R) #include "CodesXX.h" case PFX_FD: case PFX_DD: - R->PC.W--;break; + CPU.PC.W--;break; case PFX_CB: CodesDDCB(R);break; default: - if(R->TrapBadOps) + if(CPU.TrapBadOps) printf ( "[Z80 %lX] Unrecognized instruction: DD %02X at PC=%04X\n", - (long)R->User,OpZ80(R->PC.W-1),R->PC.W-2 + (long)CPU.User,OpZ80(CPU.PC.W-1),CPU.PC.W-2 ); } #undef XX @@ -460,8 +461,8 @@ static void CodesFD(register Z80 *R) #define XX IY /* Read opcode and count cycles */ - I=OpZ80(R->PC.W++); - R->ICount-=CyclesXX[I]; + I=OpZ80(CPU.PC.W++); + CPU.ICount-=CyclesXX[I]; /* R register incremented on each M1 cycle */ INCR(1); @@ -471,14 +472,14 @@ static void CodesFD(register Z80 *R) #include "CodesXX.h" case PFX_FD: case PFX_DD: - R->PC.W--;break; + CPU.PC.W--;break; case PFX_CB: CodesFDCB(R);break; default: printf ( "Unrecognized instruction: FD %02X at PC=%04X\n", - OpZ80(R->PC.W-1),R->PC.W-2 + OpZ80(CPU.PC.W-1),CPU.PC.W-2 ); } #undef XX @@ -491,26 +492,26 @@ static void CodesFD(register Z80 *R) /*************************************************************/ void ResetZ80(Z80 *R) { - R->PC.W = 0x0000; - R->SP.W = 0xF000; - R->AF.W = 0x0000; - R->BC.W = 0x0000; - R->DE.W = 0x0000; - R->HL.W = 0x0000; - R->AF1.W = 0x0000; - R->BC1.W = 0x0000; - R->DE1.W = 0x0000; - R->HL1.W = 0x0000; - R->IX.W = 0x0000; - R->IY.W = 0x0000; - R->I = 0x00; - R->R = 0x00; - R->IFF = 0x00; - R->ICount = R->IPeriod; - R->IRequest = INT_NONE; - R->IBackup = 0; - - JumpZ80(R->PC.W); + CPU.PC.W = 0x0000; + CPU.SP.W = 0xF000; + CPU.AF.W = 0x0000; + CPU.BC.W = 0x0000; + CPU.DE.W = 0x0000; + CPU.HL.W = 0x0000; + CPU.AF1.W = 0x0000; + CPU.BC1.W = 0x0000; + CPU.DE1.W = 0x0000; + CPU.HL1.W = 0x0000; + CPU.IX.W = 0x0000; + CPU.IY.W = 0x0000; + CPU.I = 0x00; + CPU.R = 0x00; + CPU.IFF = 0x00; + CPU.ICount = CPU.IPeriod; + CPU.IRequest = INT_NONE; + CPU.IBackup = 0; + + JumpZ80(CPU.PC.W); } /** ExecZ80() ************************************************/ @@ -524,21 +525,21 @@ int ExecZ80(register Z80 *R,register int RunCycles) register byte I; register pair J; - for(R->ICount=RunCycles;;) + for(CPU.ICount=RunCycles;;) { - while(R->ICount>0) + while(CPU.ICount>0) { #ifdef DEBUG /* Turn tracing on when reached trap address */ - if(R->PC.W==R->Trap) R->Trace=1; + if(CPU.PC.W==CPU.Trap) CPU.Trace=1; /* Call single-step debugger, exit if requested */ - if(R->Trace) - if(!DebugZ80(R)) return(R->ICount); + if(CPU.Trace) + if(!DebugZ80(R)) return(CPU.ICount); #endif /* Read opcode and count cycles */ - I=OpZ80(R->PC.W++); - R->ICount-=Cycles[I]; + I=OpZ80(CPU.PC.W++); + CPU.ICount-=Cycles[I]; /* R register incremented on each M1 cycle */ INCR(1); @@ -555,15 +556,15 @@ int ExecZ80(register Z80 *R,register int RunCycles) } /* Unless we have come here after EI, exit */ - if(!(R->IFF&IFF_EI)) return(R->ICount); + if(!(CPU.IFF&IFF_EI)) return(CPU.ICount); else { /* Done with AfterEI state */ - R->IFF=(R->IFF&~IFF_EI)|IFF_1; + CPU.IFF=(CPU.IFF&~IFF_EI)|IFF_1; /* Restore the ICount */ - R->ICount+=R->IBackup-1; + CPU.ICount+=CPU.IBackup-1; /* Interrupt CPU if needed */ - if((R->IRequest!=INT_NONE)&&(R->IRequest!=INT_QUIT)) IntZ80(R,R->IRequest); + if((CPU.IRequest!=INT_NONE)&&(CPU.IRequest!=INT_QUIT)) IntZ80(R,CPU.IRequest); } } } @@ -575,60 +576,60 @@ int ExecZ80(register Z80 *R,register int RunCycles) void IntZ80(Z80 *R,word Vector) { /* If HALTed, take CPU off HALT instruction */ - if(R->IFF&IFF_HALT) { R->PC.W++;R->IFF&=~IFF_HALT; } + if(CPU.IFF&IFF_HALT) { CPU.PC.W++;CPU.IFF&=~IFF_HALT; } - if((R->IFF&IFF_1)||(Vector==INT_NMI)) + if((CPU.IFF&IFF_1)||(Vector==INT_NMI)) { /* Save PC on stack */ M_PUSH(PC); /* Automatically reset IRequest if needed */ - if(R->IAutoReset&&(Vector==R->IRequest)) R->IRequest=INT_NONE; + if(CPU.IAutoReset&&(Vector==CPU.IRequest)) CPU.IRequest=INT_NONE; /* If it is NMI... */ if(Vector==INT_NMI) { /* Clear IFF1 */ - R->IFF&=~(IFF_1|IFF_EI); + CPU.IFF&=~(IFF_1|IFF_EI); /* Jump to hardwired NMI vector */ - R->PC.W=0x0066; + CPU.PC.W=0x0066; JumpZ80(0x0066); /* Done */ return; } /* Further interrupts off */ - R->IFF&=~(IFF_1|IFF_2|IFF_EI); + CPU.IFF&=~(IFF_1|IFF_2|IFF_EI); /* If in IM2 mode... */ - if(R->IFF&IFF_IM2) + if(CPU.IFF&IFF_IM2) { /* Make up the vector address */ - Vector=(Vector&0xFF)|((word)(R->I)<<8); + Vector=(Vector&0xFF)|((word)(CPU.I)<<8); /* Read the vector */ - R->PC.B.l=RdZ80(Vector++); - R->PC.B.h=RdZ80(Vector); - JumpZ80(R->PC.W); + CPU.PC.B.l=RdZ80(Vector++); + CPU.PC.B.h=RdZ80(Vector); + JumpZ80(CPU.PC.W); /* Done */ return; } /* If in IM1 mode, just jump to hardwired IRQ vector */ - if(R->IFF&IFF_IM1) { R->PC.W=0x0038;JumpZ80(0x0038);return; } + if(CPU.IFF&IFF_IM1) { CPU.PC.W=0x0038;JumpZ80(0x0038);return; } /* If in IM0 mode... */ /* Jump to a vector */ switch(Vector) { - case INT_RST00: R->PC.W=0x0000;JumpZ80(0x0000);break; - case INT_RST08: R->PC.W=0x0008;JumpZ80(0x0008);break; - case INT_RST10: R->PC.W=0x0010;JumpZ80(0x0010);break; - case INT_RST18: R->PC.W=0x0018;JumpZ80(0x0018);break; - case INT_RST20: R->PC.W=0x0020;JumpZ80(0x0020);break; - case INT_RST28: R->PC.W=0x0028;JumpZ80(0x0028);break; - case INT_RST30: R->PC.W=0x0030;JumpZ80(0x0030);break; - case INT_RST38: R->PC.W=0x0038;JumpZ80(0x0038);break; + case INT_RST00: CPU.PC.W=0x0000;JumpZ80(0x0000);break; + case INT_RST08: CPU.PC.W=0x0008;JumpZ80(0x0008);break; + case INT_RST10: CPU.PC.W=0x0010;JumpZ80(0x0010);break; + case INT_RST18: CPU.PC.W=0x0018;JumpZ80(0x0018);break; + case INT_RST20: CPU.PC.W=0x0020;JumpZ80(0x0020);break; + case INT_RST28: CPU.PC.W=0x0028;JumpZ80(0x0028);break; + case INT_RST30: CPU.PC.W=0x0030;JumpZ80(0x0030);break; + case INT_RST38: CPU.PC.W=0x0038;JumpZ80(0x0038);break; } } } @@ -648,16 +649,16 @@ word RunZ80(Z80 *R) { #ifdef DEBUG /* Turn tracing on when reached trap address */ - if(R->PC.W==R->Trap) R->Trace=1; + if(CPU.PC.W==CPU.Trap) CPU.Trace=1; /* Call single-step debugger, exit if requested */ - if(R->Trace){ - if(!DebugZ80(R)) return(R->PC.W); + if(CPU.Trace){ + if(!DebugZ80(R)) return(CPU.PC.W); } #endif /* Read opcode and count cycles */ - I=OpZ80(R->PC.W++); - R->ICount-=Cycles[I]; + I=OpZ80(CPU.PC.W++); + CPU.ICount-=Cycles[I]; /* R register incremented on each M1 cycle */ INCR(1); @@ -672,37 +673,37 @@ word RunZ80(Z80 *R) } /* If cycle counter expired... */ - if(R->ICount<=0) + if(CPU.ICount<=0) { /* If we have come after EI, get address from IRequest */ /* Otherwise, get it from the loop handler */ - if(R->IFF&IFF_EI) + if(CPU.IFF&IFF_EI) { - R->IFF=(R->IFF&~IFF_EI)|IFF_1; /* Done with AfterEI state */ - R->ICount+=R->IBackup-1; /* Restore the ICount */ + CPU.IFF=(CPU.IFF&~IFF_EI)|IFF_1; /* Done with AfterEI state */ + CPU.ICount+=CPU.IBackup-1; /* Restore the ICount */ /* Call periodic handler or set pending IRQ */ - if(R->ICount>0) J.W=R->IRequest; + if(CPU.ICount>0) J.W=CPU.IRequest; else { J.W=LoopZ80(R); /* Call periodic handler */ - R->ICount+=R->IPeriod; /* Reset the cycle counter */ - if(J.W==INT_NONE) J.W=R->IRequest; /* Pending IRQ */ + CPU.ICount+=CPU.IPeriod; /* Reset the cycle counter */ + if(J.W==INT_NONE) J.W=CPU.IRequest; /* Pending IRQ */ } } else { J.W=LoopZ80(R); /* Call periodic handler */ - R->ICount+=R->IPeriod; /* Reset the cycle counter */ - if(J.W==INT_NONE) J.W=R->IRequest; /* Pending IRQ */ + CPU.ICount+=CPU.IPeriod; /* Reset the cycle counter */ + if(J.W==INT_NONE) J.W=CPU.IRequest; /* Pending IRQ */ } - if(J.W==INT_QUIT) return(R->PC.W); /* Exit if INT_QUIT */ + if(J.W==INT_QUIT) return(CPU.PC.W); /* Exit if INT_QUIT */ if(J.W!=INT_NONE) IntZ80(R,J.W); /* Int-pt if needed */ } } /* Execution stopped */ - return(R->PC.W); + return(CPU.PC.W); } #endif /* !EXECZ80 */ diff --git a/arm9/source/cpu/z80/Z80.h b/arm9/source/cpu/z80/Z80.h index acc876ab..2444f8d8 100644 --- a/arm9/source/cpu/z80/Z80.h +++ b/arm9/source/cpu/z80/Z80.h @@ -19,7 +19,7 @@ extern "C" { /* Compilation options: */ /* #define DEBUG */ /* Compile debugging version */ -#define LSB_FIRST /* Compile for low-endian CPU */ +#define LSB_FIRST /* Compile for low-endian CPU */ /* #define MSB_FIRST */ /* Compile for hi-endian CPU */ #define EXECZ80 /* Call Z80 each scanline */