1/********************************************************************************/
2/*                                                                              */
3/* CZ80 exec include source file                                                */
4/* C Z80 emulator version 0.91                                                  */
5/* Copyright 2004-2005 Stephane Dallongeville                                   */
6/*                                                                              */
7/********************************************************************************/
8
9int FASTCALL Cz80_Exec(cz80_struc *cpu, int cycles)
10{
11#if CZ80_USE_JUMPTABLE
12    #include "cz80jmp.inc"
13#endif
14
15    cz80_struc *CPU;
16    uint16_t PC;
17    int CCnt;
18    uint8_t Opcode;
19
20    CPU = cpu;
21    PC = CPU->PC;
22
23    if (CPU->Status & (CZ80_RUNNING | CZ80_DISABLE | CZ80_FAULTED))
24    {
25        return -(CPU->Status);
26    }
27
28#if CZ80_SIZE_OPT
29    CPU->CycleToDo = CPU->CycleSup = cycles;
30    CCnt = 0;
31#else
32    CPU->CycleToDo = CCnt = cycles;
33    CPU->CycleSup = 0;
34#endif
35    CPU->Status |= CZ80_RUNNING;
36
37#if CZ80_SIZE_OPT
38Cz80_Exec_Check:
39    if (CCnt <= 0) goto Cz80_Exec_End;
40#else
41    goto Cz80_Exec_End;
42#endif
43
44Cz80_Exec:
45    {
46        Opcode = FETCH_BYTE;
47    Cz80_Exec_IM0:
48        {
49            union16 *data = pzHL;
50
51            #include "cz80_op.inc"
52        }
53    }
54
55Cz80_Exec_End:
56    CHECK_INT
57    if ((CCnt += CPU->CycleSup) > 0)
58    {
59        CPU->CycleSup = 0;
60        if (!(CPU->Status & CZ80_HALTED)) goto Cz80_Exec;
61
62        // CPU halted
63        CCnt = 0;
64    }
65
66Cz80_Exec_Really_End:
67    CPU->Status &= ~CZ80_RUNNING;
68    CPU->PC = PC;
69
70    // number of executed cycles
71    CCnt = CPU->CycleToDo - CCnt;
72
73    // update R register
74    zR = (zR + (CCnt >> 2)) & 0x7F;
75
76    return CCnt;
77}
78
79