Example #1
0
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
}
Example #2
0
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
}
Example #3
0
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
}
Example #4
0
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);
}
Example #5
0
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
        );
  }
}
Example #6
0
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
        );
  }
}
Example #7
0
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
}
Example #8
0
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);
  }
}
Example #9
0
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
}
Example #10
0
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;
  }
}
Example #11
0
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;
  }
}
Example #12
0
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);
}