forked from KolibriOS/kolibrios
79 lines
1.8 KiB
PHP
79 lines
1.8 KiB
PHP
|
/********************************************************************************/
|
||
|
/* */
|
||
|
/* 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;
|
||
|
}
|
||
|
|