kolibrios/programs/emulator/dgen-sdl-1.33/cz80/cz80exec.inc

79 lines
1.8 KiB
PHP
Raw Normal View History

/********************************************************************************/
/* */
/* CZ80 exec include source file */
/* C Z80 emulator version 0.91 */
/* Copyright 2004-2005 Stephane Dallongeville */
/* */
/********************************************************************************/
int FASTCALL Cz80_Exec(cz80_struc *cpu, int cycles)
{
#if CZ80_USE_JUMPTABLE
#include "cz80jmp.inc"
#endif
cz80_struc *CPU;
uint16_t PC;
int CCnt;
uint8_t Opcode;
CPU = cpu;
PC = CPU->PC;
if (CPU->Status & (CZ80_RUNNING | CZ80_DISABLE | CZ80_FAULTED))
{
return -(CPU->Status);
}
#if CZ80_SIZE_OPT
CPU->CycleToDo = CPU->CycleSup = cycles;
CCnt = 0;
#else
CPU->CycleToDo = CCnt = cycles;
CPU->CycleSup = 0;
#endif
CPU->Status |= CZ80_RUNNING;
#if CZ80_SIZE_OPT
Cz80_Exec_Check:
if (CCnt <= 0) goto Cz80_Exec_End;
#else
goto Cz80_Exec_End;
#endif
Cz80_Exec:
{
Opcode = FETCH_BYTE;
Cz80_Exec_IM0:
{
union16 *data = pzHL;
#include "cz80_op.inc"
}
}
Cz80_Exec_End:
CHECK_INT
if ((CCnt += CPU->CycleSup) > 0)
{
CPU->CycleSup = 0;
if (!(CPU->Status & CZ80_HALTED)) goto Cz80_Exec;
// CPU halted
CCnt = 0;
}
Cz80_Exec_Really_End:
CPU->Status &= ~CZ80_RUNNING;
CPU->PC = PC;
// number of executed cycles
CCnt = CPU->CycleToDo - CCnt;
// update R register
zR = (zR + (CCnt >> 2)) & 0x7F;
return CCnt;
}