static void CodesDD(register Z80 *R) { register byte I; register pair J; #define XX IX I=OpZ80(R->PC.W++); R->ICount-=CyclesXX[I]; switch(I) { #include "CodesXX.h" case PFX_FD: case PFX_DD: R->PC.W--;break; case PFX_CB: CodesDDCB(R);break; default: if(R->TrapBadOps) printf ( "[Z80 %lX] Unrecognized instruction: DD %02X at PC=%04X\n", (long)R->User,OpZ80(R->PC.W-1),R->PC.W-2 ); } #undef XX }
static void CodesFD(register Z80 *R) { register byte I; register pair J; #define XX IY I=OpZ80(R->PC.W++); R->ICount-=CyclesXX[I]; switch(I) { #include "CodesXX.h" case PFX_FD: case PFX_DD: R->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 ); } #undef XX }
static void CodesFD(register Z80 *R) { register byte I; register pair J; #define XX IY I=OpZ80(R); R->ICount-=z80_CyclesXX[I]; switch(I) { #include "mz80opc5.h" case PFX_FD: case PFX_DD: R->PC.W--;mz80_cache_ip(R);break; case PFX_CB: CodesFDCB(R);break; case HALT: R->PC.W--;R->IFF|=0x80;R->ICount=0;mz80_cache_ip(R);break; default: /* printf */ /* ( */ /* "Unrecognized instruction: FD %02X at PC=%04X\n", */ /* RdZ80(R->PC.W-1),R->PC.W-2 */ /* ); */ system_flags |= F_UNIMPL; } #undef XX }
word RunZ80(Z80 *R) { register byte I; register pair J; R->ICount += R->IPeriod; while ((R->ICount > 0) || (R->IFF&0x20)) { J.W = R->IRequest; R->IRequest = INT_NONE; /* If we have come after EI, get address from IRequest */ /* Otherwise, get it from the loop handler */ if(R->IFF&0x20) { R->ICount+=R->IBackup-1; /* Restore the ICount */ R->IFF&=0xDF; /* Done with AfterEI state */ } if(J.W==INT_QUIT) return(R->PC.W); /* Exit if INT_QUIT */ if(J.W!=INT_NONE) IntZ80(R,J.W); /* Int-pt if needed */ I=OpZ80(R); R->ICount-=z80_Cycles[I]; switch(I) { #include "mz80opc1.h" case PFX_CB: CodesCB(R);break; case PFX_ED: CodesED(R);break; case PFX_FD: CodesFD(R);break; case PFX_DD: CodesDD(R);break; } } /* Execution stopped */ return(R->PC.W); }
static void CodesCB(register Z80 *R) { register byte I; I=OpZ80(R->PC.W++); R->ICount-=CyclesCB[I]; switch(I) { #include "CodesCB.h" default: if(R->TrapBadOps) printf ( "[Z80 %lX] Unrecognized instruction: CB %02X at PC=%04X\n", (long)(R->User),OpZ80(R->PC.W-1),R->PC.W-2 ); } }
static void CodesED(register Z80 *R) { register byte I; register pair J; I=OpZ80(R->PC.W++); R->ICount-=CyclesED[I]; switch(I) { #include "CodesED.h" case PFX_ED: R->PC.W--;break; default: if(R->TrapBadOps) printf ( "[Z80 %lX] Unrecognized instruction: ED %02X at PC=%04X\n", (long)R->User,OpZ80(R->PC.W-1),R->PC.W-2 ); } }
static void CodesFDCB(register Z80 *R) { register pair J; register byte I; #define XX IY J.W=R->XX.W+(offset)OpZ80(R->PC.W++); I=OpZ80(R->PC.W++); R->ICount-=CyclesXXCB[I]; switch(I) { #include "CodesXCB.h" default: if(R->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 ); } #undef XX }
int ExecZ80(register Z80 *R,register int RunCycles) { register byte I; register pair J; for(R->ICount=RunCycles;;) { while(R->ICount>0) { #ifdef DEBUG /* Turn tracing on when reached trap address */ if(R->PC.W==R->Trap) R->Trace=1; /* Call single-step debugger, exit if requested */ if(R->Trace) if(!DebugZ80(R)) return(R->ICount); #endif /* Read opcode and count cycles */ I=OpZ80(R->PC.W++); /* Count cycles */ R->ICount-=Cycles[I]; /* Interpret opcode */ switch(I) { #include "Codes.h" case PFX_CB: CodesCB(R);break; case PFX_ED: CodesED(R);break; case PFX_FD: CodesFD(R);break; case PFX_DD: CodesDD(R);break; } /* Unless we have come here after EI, exit */ if(!(R->IFF&IFF_EI)) { /* Interrupt CPU if needed */ if((R->IRequest!=INT_NONE)&&(R->IRequest!=INT_QUIT)) IntZ80(R,R->IRequest); } else { /* Done with AfterEI state */ R->IFF=(R->IFF&~IFF_EI)|IFF_1; /* Restore the ICount */ R->ICount+=R->IBackup-1; } } return(R->ICount); } }
static void CodesFDCB(register Z80 *R) { register pair J; register byte I; #define XX IY J.W=R->XX.W+(offset)OpZ80(R); I=OpZ80(R); R->ICount-=z80_CyclesXXCB[I]; switch(I) { #include "mz80opc3.h" default: /* if(R->TrapBadOps) */ /* printf */ /* ( */ /* "[Z80 %lX] Unrecognized instruction: FD CB %02X %02X at PC=%04X\n", */ /* (long)R->User,RdZ80(R->PC.W-2),RdZ80(R->PC.W-1),R->PC.W-4 */ /* ); */ system_flags |= F_UNIMPL; break; } #undef XX }
static void CodesCB(register Z80 *R) { register byte I; I=OpZ80(R); R->ICount-=z80_CyclesCB[I]; switch(I) { #include "mz80opc2.h" default: /* if(R->TrapBadOps) */ /* printf */ /* ( */ /* "[Z80 %lX] Unrecognized instruction: CB %02X at PC=%04X\n", */ /* (long)(R->User),RdZ80(R->PC.W-1),R->PC.W-2 */ /* ); */ system_flags |= F_UNIMPL; break; } }
static void CodesED(register Z80 *R) { register byte I; register pair J; I=OpZ80(R); R->ICount-=z80_CyclesED[I]; switch(I) { #include "mz80opc4.h" case PFX_ED: R->PC.W--;mz80_cache_ip(R);break; default: /* if(R->TrapBadOps) */ /* printf */ /* ( */ /* "[Z80 %lX] Unrecognized instruction: ED %02X at PC=%04X\n", */ /* (long)R->User,RdZ80(R->PC.W-1),R->PC.W-2 */ /* ); */ system_flags |= F_UNIMPL; break; } }
word RunZ80(Z80 *R) { register byte I; register pair J; for(;;) { #ifdef DEBUG /* Turn tracing on when reached trap address */ if(R->PC.W==R->Trap) R->Trace=1; /* Call single-step debugger, exit if requested */ if(R->Trace) if(!DebugZ80(R)) return(R->PC.W); #endif I=OpZ80(R->PC.W++); R->ICount-=Cycles[I]; switch(I) { #include "Codes.h" case PFX_CB: CodesCB(R);break; case PFX_ED: CodesED(R);break; case PFX_FD: CodesFD(R);break; case PFX_DD: CodesDD(R);break; } /* If cycle counter expired... */ if(R->ICount<=0) { /* If we have come after EI, get address from IRequest */ /* Otherwise, get it from the loop handler */ if(R->IFF&IFF_EI) { R->IFF=(R->IFF&~IFF_EI)|IFF_1; /* Done with AfterEI state */ R->ICount+=R->IBackup-1; /* Restore the ICount */ /* Call periodic handler or set pending IRQ */ if(R->ICount>0) J.W=R->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 */ } } 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 */ } if(J.W==INT_QUIT) return(R->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); }