#pragma once
/*#
    # z80.h

    A cycle-stepped Z80 emulator in a C header.

    Do this:
    ~~~~C
    #define CHIPS_IMPL
    ~~~~
    before you include this file in *one* C or C++ file to create the
    implementation.

    Optionally provide
    ~~~C
    #define CHIPS_ASSERT(x) your_own_asset_macro(x)
    ~~~

    ## Emulated Pins
    ***********************************
    *           +-----------+         *
    * M1    <---|           |---> A0  *
    * MREQ  <---|           |---> A1  *
    * IORQ  <---|           |---> A2  *
    * RD    <---|           |---> ..  *
    * WR    <---|    Z80    |---> A15 *
    * HALT  <---|           |         *
    * WAIT  --->|           |<--> D0  *
    * INT   --->|           |<--> D1  *
    * NMI   --->|           |<--> ... *
    * RFSH  <---|           |<--> D7  *
    *           +-----------+         *
    ***********************************

    ## Functions

    ~~~C
    uint64_t z80_init(z80_t* cpu);
    ~~~
        Initializes a new z80_t instance, returns initial pin mask to start
        execution at address 0.

    ~~~C
    uint64_t z80_reset(z80_t* cpu)
    ~~~
        Resets a z80_t instance, returns pin mask to start execution at
        address 0.

    ~~~C
    uint64_t z80_tick(z80_t* cpu, uint64_t pins)
    ~~~
        Step the z80_t instance for one clock cycle.

    ~~~C
    uint64_t z80_prefetch(z80_t* cpu, uint16_t new_pc)
    ~~~
        Call this function to force execution to start at a specific
        PC. Use the returned pin mask as argument into the next z80_tick() call.

    ~~~C
    bool z80_opdone(z80_t* cpu)
    ~~~
        Helper function to detect whether the z80_t instance has completed
        an instruction.

    ## HOWTO

    Initialize a new z80_t instance and start ticking it:
    ~~~C
        z80_t cpu;
        uint64_t pins = z80_init(&cpu);
        while (!done) {
            pins = z80_tick(&cpu, pins);
        }
    ~~~
    Since there is no memory attached yet, the CPU will simply run whatever opcode
    bytes are present on the data bus (in this case the data bus is zero, so the CPU
    just runs throught the same NOP over and over).

    Next, add some memory and inspect and modify the pin mask to handle memory accesses:
    ~~~C
        uint8_t mem[(1<<16)] = {0};
        z80_t cpu;
        uint64_t pins = z80_init(&cpu);
        while (!done) {
            pins = z80_tick(&cpu, pins);
            if (pins & Z80_MREQ) {
                const uint16_t addr = Z80_GET_ADDR(pins);
                if (pins & Z80_RD) {
                    uint8_t data = mem[addr];
                    Z80_SET_DATA(pins, data);
                }
                else if (pins & Z80_WR) {
                    uint8_t data = Z80_GET_DATA(pins);
                    mem[addr] = data;
                }
            }
        }
    ~~~
    The CPU will now run through the whole address space executing NOPs (because the memory is
    filled with 0s instead of a valid program). If there would be a valid Z80 program at memory
    address 0, this would be executed instead.

    IO requests are handled the same as memory requests, but instead of the MREQ pin, the
    IORQ pin must be checked:
    ~~~C
        uint8_t mem[(1<<16)] = {0};
        z80_t cpu;
        uint64_t pins = z80_init(&cpu);
        while (!done) {
            pins = z80_tick(&cpu, pins);
            if (pins & Z80_MREQ) {
                const uint16_t addr = Z80_GET_ADDR(pins);
                if (pins & Z80_RD) {
                    uint8_t data = mem[addr];
                    Z80_SET_DATA(pins, data);
                }
                else if (pins & Z80_WR) {
                    uint8_t data = Z80_GET_DATA(pins);
                    mem[addr] = data;
                }
            }
            else if (pins & Z80_IORQ) {
                const uint16_t port = Z80_GET_ADDR(pins);
                if (pins & Z80_RD) {
                    // handle IO input request at port
                    ...
                }
                else if (pins & Z80_WR) {
                    // handle IO output request at port
                    ...
                }
            }
        }
    ~~~

    Handle interrupt acknowledge cycles by checking for Z80_IORQ|Z80_M1:
    ~~~C
        uint8_t mem[(1<<16)] = {0};
        z80_t cpu;
        uint64_t pins = z80_init(&cpu);
        while (!done) {
            pins = z80_tick(&cpu, pins);
            if (pins & Z80_MREQ) {
                const uint16_t addr = Z80_GET_ADDR(pins);
                if (pins & Z80_RD) {
                    uint8_t data = mem[addr];
                    Z80_SET_DATA(pins, data);
                }
                else if (pins & Z80_WR) {
                    uint8_t data = Z80_GET_DATA(pins);
                    mem[addr] = data;
                }
            }
            else if (pins & Z80_IORQ) {
                const uint16_t addr = Z80_GET_ADDR(pins);
                if (pins & Z80_M1) {
                    // an interrupt acknowledge cycle, depending on the emulated system,
                    // put either an instruction byte, or an interrupt vector on the data bus
                    Z80_SET_DATA(pins, opcode_or_intvec);
                }
                else if (pins & Z80_RD) {
                    // handle IO input request at port `addr`
                    ...
                }
                else if (pins & Z80_WR) {
                    // handle IO output request at port `addr`
                    ...
                }
            }
        }
    ~~~

    To request an interrupt, or inject a wait state just set the respective pin
    (Z80_INT, Z80_NMI, Z80_WAIT), don't forget to clear the pin again later (the
    details on when those pins are set and cleared depend heavily on the
    emulated system).

    !!! note
        NOTE: The Z80_RES pin is currently not emulated. Instead call the `z80_reset()` function.

    To emulate a whole computer system, add the per-tick code for the rest of the system to the
    basic ticking code above.

    If the emulated system uses the Z80 daisychain interrupt protocol (for instance when using
    the Z80 family chips like the PIO or CTC), tick those chips in interrupt priority order and
    set the Z80_IEIO pin before the highest priority chip in the daisychain is ticked:

    ~~~C
        ...
        while (!done) {
            pins = z80_tick(&cpu, pins);
            ...
            // tick Z80 family chips in 'daisychain order':
            pins |= Z80_IEIO;
            ...
            pins = z80ctc_tick(&ctc, pins);
            ...
            pins = z80pio_tick(&pio, pins);
            ...
            // the Z80_INT pin will now be set if any of the chips wants to issue an interrupt request
        }
    ~~~
#*/
/*
    zlib/libpng license

    Copyright (c) 2021 Andre Weissflog
    This software is provided 'as-is', without any express or implied warranty.
    In no event will the authors be held liable for any damages arising from the
    use of this software.
    Permission is granted to anyone to use this software for any purpose,
    including commercial applications, and to alter it and redistribute it
    freely, subject to the following restrictions:
        1. The origin of this software must not be misrepresented; you must not
        claim that you wrote the original software. If you use this software in a
        product, an acknowledgment in the product documentation would be
        appreciated but is not required.
        2. Altered source versions must be plainly marked as such, and must not
        be misrepresented as being the original software.
        3. This notice may not be removed or altered from any source
        distribution.
*/
#include <stdint.h>
#include <stdbool.h>

#ifdef __cplusplus
extern "C" {
#endif

// address pins
#define Z80_PIN_A0  (0)
#define Z80_PIN_A1  (1)
#define Z80_PIN_A2  (2)
#define Z80_PIN_A3  (3)
#define Z80_PIN_A4  (4)
#define Z80_PIN_A5  (5)
#define Z80_PIN_A6  (6)
#define Z80_PIN_A7  (7)
#define Z80_PIN_A8  (8)
#define Z80_PIN_A9  (9)
#define Z80_PIN_A10 (10)
#define Z80_PIN_A11 (11)
#define Z80_PIN_A12 (12)
#define Z80_PIN_A13 (13)
#define Z80_PIN_A14 (14)
#define Z80_PIN_A15 (15)

// data pins
#define Z80_PIN_D0  (16)
#define Z80_PIN_D1  (17)
#define Z80_PIN_D2  (18)
#define Z80_PIN_D3  (19)
#define Z80_PIN_D4  (20)
#define Z80_PIN_D5  (21)
#define Z80_PIN_D6  (22)
#define Z80_PIN_D7  (23)

// control pins
#define Z80_PIN_M1    (24)        // machine cycle 1
#define Z80_PIN_MREQ  (25)        // memory request
#define Z80_PIN_IORQ  (26)        // input/output request
#define Z80_PIN_RD    (27)        // read
#define Z80_PIN_WR    (28)        // write
#define Z80_PIN_HALT  (29)        // halt state
#define Z80_PIN_INT   (30)        // interrupt request
#define Z80_PIN_RES   (31)        // reset requested
#define Z80_PIN_NMI   (32)        // non-maskable interrupt
#define Z80_PIN_WAIT  (33)        // wait requested
#define Z80_PIN_RFSH  (34)        // refresh

// virtual pins (for interrupt daisy chain protocol)
#define Z80_PIN_IEIO  (37)      // unified daisy chain 'Interrupt Enable In+Out'
#define Z80_PIN_RETI  (38)      // cpu has decoded a RETI instruction

// pin bit masks
#define Z80_A0    (1ULL<<Z80_PIN_A0)
#define Z80_A1    (1ULL<<Z80_PIN_A1)
#define Z80_A2    (1ULL<<Z80_PIN_A2)
#define Z80_A3    (1ULL<<Z80_PIN_A3)
#define Z80_A4    (1ULL<<Z80_PIN_A4)
#define Z80_A5    (1ULL<<Z80_PIN_A5)
#define Z80_A6    (1ULL<<Z80_PIN_A6)
#define Z80_A7    (1ULL<<Z80_PIN_A7)
#define Z80_A8    (1ULL<<Z80_PIN_A8)
#define Z80_A9    (1ULL<<Z80_PIN_A9)
#define Z80_A10   (1ULL<<Z80_PIN_A10)
#define Z80_A11   (1ULL<<Z80_PIN_A11)
#define Z80_A12   (1ULL<<Z80_PIN_A12)
#define Z80_A13   (1ULL<<Z80_PIN_A13)
#define Z80_A14   (1ULL<<Z80_PIN_A14)
#define Z80_A15   (1ULL<<Z80_PIN_A15)
#define Z80_D0    (1ULL<<Z80_PIN_D0)
#define Z80_D1    (1ULL<<Z80_PIN_D1)
#define Z80_D2    (1ULL<<Z80_PIN_D2)
#define Z80_D3    (1ULL<<Z80_PIN_D3)
#define Z80_D4    (1ULL<<Z80_PIN_D4)
#define Z80_D5    (1ULL<<Z80_PIN_D5)
#define Z80_D6    (1ULL<<Z80_PIN_D6)
#define Z80_D7    (1ULL<<Z80_PIN_D7)
#define Z80_M1    (1ULL<<Z80_PIN_M1)
#define Z80_MREQ  (1ULL<<Z80_PIN_MREQ)
#define Z80_IORQ  (1ULL<<Z80_PIN_IORQ)
#define Z80_RD    (1ULL<<Z80_PIN_RD)
#define Z80_WR    (1ULL<<Z80_PIN_WR)
#define Z80_HALT  (1ULL<<Z80_PIN_HALT)
#define Z80_INT   (1ULL<<Z80_PIN_INT)
#define Z80_RES   (1ULL<<Z80_PIN_RES)
#define Z80_NMI   (1ULL<<Z80_PIN_NMI)
#define Z80_WAIT  (1ULL<<Z80_PIN_WAIT)
#define Z80_RFSH  (1ULL<<Z80_PIN_RFSH)
#define Z80_IEIO  (1ULL<<Z80_PIN_IEIO)
#define Z80_RETI  (1ULL<<Z80_PIN_RETI)

#define Z80_CTRL_PIN_MASK (Z80_M1|Z80_MREQ|Z80_IORQ|Z80_RD|Z80_WR|Z80_RFSH)
#define Z80_PIN_MASK ((1ULL<<40)-1)

// pin access helper macros
#define Z80_MAKE_PINS(ctrl, addr, data) ((ctrl)|((data&0xFF)<<16)|((addr)&0xFFFFULL))
#define Z80_GET_ADDR(p) ((uint16_t)(p))
#define Z80_SET_ADDR(p,a) {p=((p)&~0xFFFF)|((a)&0xFFFF);}
#define Z80_GET_DATA(p) ((uint8_t)((p)>>16))
#define Z80_SET_DATA(p,d) {p=((p)&~0xFF0000ULL)|(((d)<<16)&0xFF0000ULL);}

// status flags
#define Z80_CF (1<<0)           // carry
#define Z80_NF (1<<1)           // add/subtract
#define Z80_VF (1<<2)           // parity/overflow
#define Z80_PF Z80_VF
#define Z80_XF (1<<3)           // undocumented bit 3
#define Z80_HF (1<<4)           // half carry
#define Z80_YF (1<<5)           // undocumented bit 5
#define Z80_ZF (1<<6)           // zero
#define Z80_SF (1<<7)           // sign

// CPU state
typedef struct {
    uint16_t step;      // the currently active decoder step
    uint16_t addr;      // effective address for (HL),(IX+d),(IY+d)
    uint8_t dlatch;     // temporary store for data bus value
    uint8_t opcode;     // current opcode
    uint8_t hlx_idx;    // index into hlx[] for mapping hl to ix or iy (0: hl, 1: ix, 2: iy)
    bool prefix_active; // true if any prefix currently active (only needed in z80_opdone())
    uint64_t pins;      // last pin state, used for NMI detection
    uint64_t int_bits;  // track INT and NMI state
    union { struct { uint8_t pcl; uint8_t pch; }; uint16_t pc; };

    // NOTE: These unions are fine in C, but not C++.
    union { struct { uint8_t f; uint8_t a; }; uint16_t af; };
    union { struct { uint8_t c; uint8_t b; }; uint16_t bc; };
    union { struct { uint8_t e; uint8_t d; }; uint16_t de; };
    union {
        struct {
            union { struct { uint8_t l; uint8_t h; }; uint16_t hl; };
            union { struct { uint8_t ixl; uint8_t ixh; }; uint16_t ix; };
            union { struct { uint8_t iyl; uint8_t iyh; }; uint16_t iy; };
        };
        struct { union { struct { uint8_t l; uint8_t h; }; uint16_t hl; }; } hlx[3];
    };
    union { struct { uint8_t wzl; uint8_t wzh; }; uint16_t wz; };
    union { struct { uint8_t spl; uint8_t sph; }; uint16_t sp; };
    union { struct { uint8_t r; uint8_t i; }; uint16_t ir; };
    uint16_t af2, bc2, de2, hl2; // shadow register bank
    uint8_t im;
    bool iff1, iff2;
} z80_t;

// initialize a new Z80 instance and return initial pin mask
uint64_t z80_init(z80_t* cpu);
// immediately put Z80 into reset state
uint64_t z80_reset(z80_t* cpu);
// execute one tick, return new pin mask
uint64_t z80_tick(z80_t* cpu, uint64_t pins);
// force execution to continue at address 'new_pc'
uint64_t z80_prefetch(z80_t* cpu, uint16_t new_pc);
// return true when full instruction has finished
bool z80_opdone(z80_t* cpu);

#ifdef __cplusplus
} // extern C
#endif

//-- IMPLEMENTATION ------------------------------------------------------------
#ifdef CHIPS_IMPL
#include <string.h> // memset
#ifndef CHIPS_ASSERT
#include <assert.h>
#define CHIPS_ASSERT(c) assert(c)
#endif

#if defined(__GNUC__)
#define _Z80_UNREACHABLE __builtin_unreachable()
#elif defined(_MSC_VER)
#define _Z80_UNREACHABLE __assume(0)
#else
#define _Z80_UNREACHABLE
#endif

// values for hlx_idx for mapping HL, IX or IY, used as index into hlx[]
#define _Z80_MAP_HL (0)
#define _Z80_MAP_IX (1)
#define _Z80_MAP_IY (2)

uint64_t z80_init(z80_t* cpu) {
    CHIPS_ASSERT(cpu);
    // initial state as described in 'The Undocumented Z80 Documented'
    memset(cpu, 0, sizeof(z80_t));
    cpu->af = cpu->bc = cpu->de = cpu->hl = 0xFFFF;
    cpu->wz = cpu->sp = cpu->ix = cpu->iy = 0xFFFF;
    cpu->af2 = cpu->bc2 = cpu->de2 = cpu->hl2 = 0xFFFF;
    return z80_prefetch(cpu, 0x0000);
}

uint64_t z80_reset(z80_t* cpu) {
    // reset state as described in 'The Undocumented Z80 Documented'
    memset(cpu, 0, sizeof(z80_t));
    cpu->af = cpu->bc = cpu->de = cpu->hl = 0xFFFF;
    cpu->wz = cpu->sp = cpu->ix = cpu->iy = 0xFFFF;
    cpu->af2 = cpu->bc2 = cpu->de2 = cpu->hl2 = 0xFFFF;
    return z80_prefetch(cpu, 0x0000);
}

bool z80_opdone(z80_t* cpu) {
    // because of the overlapped cycle, the result of the previous
    // instruction is only available in M1/T2
    return ((cpu->pins & (Z80_M1|Z80_RD)) == (Z80_M1|Z80_RD)) && !cpu->prefix_active;
}

static inline uint64_t _z80_halt(z80_t* cpu, uint64_t pins) {
    cpu->pc--;
    return pins | Z80_HALT;
}

// sign+zero+parity lookup table
static const uint8_t _z80_szp_flags[256] = {
  0x44,0x00,0x00,0x04,0x00,0x04,0x04,0x00,0x08,0x0c,0x0c,0x08,0x0c,0x08,0x08,0x0c,
  0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04,0x0c,0x08,0x08,0x0c,0x08,0x0c,0x0c,0x08,
  0x20,0x24,0x24,0x20,0x24,0x20,0x20,0x24,0x2c,0x28,0x28,0x2c,0x28,0x2c,0x2c,0x28,
  0x24,0x20,0x20,0x24,0x20,0x24,0x24,0x20,0x28,0x2c,0x2c,0x28,0x2c,0x28,0x28,0x2c,
  0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04,0x0c,0x08,0x08,0x0c,0x08,0x0c,0x0c,0x08,
  0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00,0x08,0x0c,0x0c,0x08,0x0c,0x08,0x08,0x0c,
  0x24,0x20,0x20,0x24,0x20,0x24,0x24,0x20,0x28,0x2c,0x2c,0x28,0x2c,0x28,0x28,0x2c,
  0x20,0x24,0x24,0x20,0x24,0x20,0x20,0x24,0x2c,0x28,0x28,0x2c,0x28,0x2c,0x2c,0x28,
  0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84,0x8c,0x88,0x88,0x8c,0x88,0x8c,0x8c,0x88,
  0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80,0x88,0x8c,0x8c,0x88,0x8c,0x88,0x88,0x8c,
  0xa4,0xa0,0xa0,0xa4,0xa0,0xa4,0xa4,0xa0,0xa8,0xac,0xac,0xa8,0xac,0xa8,0xa8,0xac,
  0xa0,0xa4,0xa4,0xa0,0xa4,0xa0,0xa0,0xa4,0xac,0xa8,0xa8,0xac,0xa8,0xac,0xac,0xa8,
  0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80,0x88,0x8c,0x8c,0x88,0x8c,0x88,0x88,0x8c,
  0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84,0x8c,0x88,0x88,0x8c,0x88,0x8c,0x8c,0x88,
  0xa0,0xa4,0xa4,0xa0,0xa4,0xa0,0xa0,0xa4,0xac,0xa8,0xa8,0xac,0xa8,0xac,0xac,0xa8,
  0xa4,0xa0,0xa0,0xa4,0xa0,0xa4,0xa4,0xa0,0xa8,0xac,0xac,0xa8,0xac,0xa8,0xa8,0xac,
};

static inline uint8_t _z80_sz_flags(uint8_t val) {
    return (val != 0) ? (val & Z80_SF) : Z80_ZF;
}

static inline uint8_t _z80_szyxch_flags(uint8_t acc, uint8_t val, uint32_t res) {
    return _z80_sz_flags(res) |
        (res & (Z80_YF|Z80_XF)) |
        ((res >> 8) & Z80_CF) |
        ((acc ^ val ^ res) & Z80_HF);
}

static inline uint8_t _z80_add_flags(uint8_t acc, uint8_t val, uint32_t res) {
    return _z80_szyxch_flags(acc, val, res) | ((((val ^ acc ^ 0x80) & (val ^ res)) >> 5) & Z80_VF);
}

static inline uint8_t _z80_sub_flags(uint8_t acc, uint8_t val, uint32_t res) {
    return Z80_NF | _z80_szyxch_flags(acc, val, res) | ((((val ^ acc) & (res ^ acc)) >> 5) & Z80_VF);
}

static inline uint8_t _z80_cp_flags(uint8_t acc, uint8_t val, uint32_t res) {
    return Z80_NF |
        _z80_sz_flags(res) |
        (val & (Z80_YF|Z80_XF)) |
        ((res >> 8) & Z80_CF) |
        ((acc ^ val ^ res) & Z80_HF) |
        ((((val ^ acc) & (res ^ acc)) >> 5) & Z80_VF);
}

static inline uint8_t _z80_sziff2_flags(z80_t* cpu, uint8_t val) {
    return (cpu->f & Z80_CF) | _z80_sz_flags(val) | (val & (Z80_YF|Z80_XF)) | (cpu->iff2 ? Z80_PF : 0);
}

static inline void _z80_add8(z80_t* cpu, uint8_t val) {
    uint32_t res = cpu->a + val;
    cpu->f = _z80_add_flags(cpu->a, val, res);
    cpu->a = (uint8_t)res;
}

static inline void _z80_adc8(z80_t* cpu, uint8_t val) {
    uint32_t res = cpu->a + val + (cpu->f & Z80_CF);
    cpu->f = _z80_add_flags(cpu->a, val, res);
    cpu->a = (uint8_t)res;
}

static inline void _z80_sub8(z80_t* cpu, uint8_t val) {
    uint32_t res = (uint32_t) ((int)cpu->a - (int)val);
    cpu->f = _z80_sub_flags(cpu->a, val, res);
    cpu->a = (uint8_t)res;
}

static inline void _z80_sbc8(z80_t* cpu, uint8_t val) {
    uint32_t res = (uint32_t) ((int)cpu->a - (int)val - (cpu->f & Z80_CF));
    cpu->f = _z80_sub_flags(cpu->a, val, res);
    cpu->a = (uint8_t)res;
}

static inline void _z80_and8(z80_t* cpu, uint8_t val) {
    cpu->a &= val;
    cpu->f = _z80_szp_flags[cpu->a] | Z80_HF;
}

static inline void _z80_xor8(z80_t* cpu, uint8_t val) {
    cpu->a ^= val;
    cpu->f = _z80_szp_flags[cpu->a];
}

static inline void _z80_or8(z80_t* cpu, uint8_t val) {
    cpu->a |= val;
    cpu->f = _z80_szp_flags[cpu->a];
}

static inline void _z80_cp8(z80_t* cpu, uint8_t val) {
    uint32_t res = (uint32_t) ((int)cpu->a - (int)val);
    cpu->f = _z80_cp_flags(cpu->a, val, res);
}

static inline void _z80_neg8(z80_t* cpu) {
    uint32_t res = (uint32_t) (0 - (int)cpu->a);
    cpu->f = _z80_sub_flags(0, cpu->a, res);
    cpu->a = (uint8_t)res;
}

static inline uint8_t _z80_inc8(z80_t* cpu, uint8_t val) {
    uint8_t res = val + 1;
    uint8_t f = _z80_sz_flags(res) | (res & (Z80_XF|Z80_YF)) | ((res ^ val) & Z80_HF);
    if (res == 0x80) {
        f |= Z80_VF;
    }
    cpu->f = f | (cpu->f & Z80_CF);
    return res;
}

static inline uint8_t _z80_dec8(z80_t* cpu, uint8_t val) {
    uint8_t res = val - 1;
    uint8_t f = Z80_NF | _z80_sz_flags(res) | (res & (Z80_XF|Z80_YF)) | ((res ^ val) & Z80_HF);
    if (res == 0x7F) {
        f |= Z80_VF;
    }
    cpu->f = f | (cpu->f & Z80_CF);
    return res;
}

static inline void _z80_ex_de_hl(z80_t* cpu) {
    uint16_t tmp = cpu->hl;
    cpu->hl = cpu->de;
    cpu->de = tmp;
}

static inline void _z80_ex_af_af2(z80_t* cpu) {
    uint16_t tmp = cpu->af2;
    cpu->af2 = cpu->af;
    cpu->af = tmp;
}

static inline void _z80_exx(z80_t* cpu) {
    uint16_t tmp;
    tmp = cpu->bc; cpu->bc = cpu->bc2; cpu->bc2 = tmp;
    tmp = cpu->de; cpu->de = cpu->de2; cpu->de2 = tmp;
    tmp = cpu->hl; cpu->hl = cpu->hl2; cpu->hl2 = tmp;
}

static inline void _z80_rlca(z80_t* cpu) {
    uint8_t res = (cpu->a << 1) | (cpu->a >> 7);
    cpu->f = ((cpu->a >> 7) & Z80_CF) | (cpu->f & (Z80_SF|Z80_ZF|Z80_PF)) | (res & (Z80_YF|Z80_XF));
    cpu->a = res;
}

static inline void _z80_rrca(z80_t* cpu) {
    uint8_t res = (cpu->a >> 1) | (cpu->a << 7);
    cpu->f = (cpu->a & Z80_CF) | (cpu->f & (Z80_SF|Z80_ZF|Z80_PF)) | (res & (Z80_YF|Z80_XF));
    cpu->a = res;
}

static inline void _z80_rla(z80_t* cpu) {
    uint8_t res = (cpu->a << 1) | (cpu->f & Z80_CF);
    cpu->f = ((cpu->a >> 7) & Z80_CF) | (cpu->f & (Z80_SF|Z80_ZF|Z80_PF)) | (res & (Z80_YF|Z80_XF));
    cpu->a = res;
}

static inline void _z80_rra(z80_t* cpu) {
    uint8_t res = (cpu->a >> 1) | ((cpu->f & Z80_CF) << 7);
    cpu->f = (cpu->a & Z80_CF) | (cpu->f & (Z80_SF|Z80_ZF|Z80_PF)) | (res & (Z80_YF|Z80_XF));
    cpu->a = res;
}

static inline void _z80_daa(z80_t* cpu) {
    uint8_t res = cpu->a;
    if (cpu->f & Z80_NF) {
        if (((cpu->a & 0xF)>0x9) || (cpu->f & Z80_HF)) {
            res -= 0x06;
        }
        if ((cpu->a > 0x99) || (cpu->f & Z80_CF)) {
            res -= 0x60;
        }
    }
    else {
        if (((cpu->a & 0xF)>0x9) || (cpu->f & Z80_HF)) {
            res += 0x06;
        }
        if ((cpu->a > 0x99) || (cpu->f & Z80_CF)) {
            res += 0x60;
        }
    }
    cpu->f &= Z80_CF|Z80_NF;
    cpu->f |= (cpu->a > 0x99) ? Z80_CF : 0;
    cpu->f |= (cpu->a ^ res) & Z80_HF;
    cpu->f |= _z80_szp_flags[res];
    cpu->a = res;
}

static inline void _z80_cpl(z80_t* cpu) {
    cpu->a ^= 0xFF;
    cpu->f= (cpu->f & (Z80_SF|Z80_ZF|Z80_PF|Z80_CF)) |Z80_HF|Z80_NF| (cpu->a & (Z80_YF|Z80_XF));
}

static inline void _z80_scf(z80_t* cpu) {
    cpu->f = (cpu->f & (Z80_SF|Z80_ZF|Z80_PF|Z80_CF)) | Z80_CF | (cpu->a & (Z80_YF|Z80_XF));
}

static inline void _z80_ccf(z80_t* cpu) {
    cpu->f = ((cpu->f & (Z80_SF|Z80_ZF|Z80_PF|Z80_CF)) | ((cpu->f & Z80_CF)<<4) | (cpu->a & (Z80_YF|Z80_XF))) ^ Z80_CF;
}

static inline void _z80_add16(z80_t* cpu, uint16_t val) {
    const uint16_t acc = cpu->hlx[cpu->hlx_idx].hl;
    cpu->wz = acc + 1;
    const uint32_t res = acc + val;
    cpu->hlx[cpu->hlx_idx].hl = res;
    cpu->f = (cpu->f & (Z80_SF|Z80_ZF|Z80_VF)) |
             (((acc ^ res ^ val)>>8)&Z80_HF) |
             ((res >> 16) & Z80_CF) |
             ((res >> 8) & (Z80_YF|Z80_XF));
}

static inline void _z80_adc16(z80_t* cpu, uint16_t val) {
    // NOTE: adc is ED-prefixed, so they are never rewired to IX/IY
    const uint16_t acc = cpu->hl;
    cpu->wz = acc + 1;
    const uint32_t res = acc + val + (cpu->f & Z80_CF);
    cpu->hl = res;
    cpu->f = (((val ^ acc ^ 0x8000) & (val ^ res) & 0x8000) >> 13) |
             (((acc ^ res ^ val) >>8 ) & Z80_HF) |
             ((res >> 16) & Z80_CF) |
             ((res >> 8) & (Z80_SF|Z80_YF|Z80_XF)) |
             ((res & 0xFFFF) ? 0 : Z80_ZF);
}

static inline void _z80_sbc16(z80_t* cpu, uint16_t val) {
    // NOTE: sbc is ED-prefixed, so they are never rewired to IX/IY
    const uint16_t acc = cpu->hl;
    cpu->wz = acc + 1;
    const uint32_t res = acc - val - (cpu->f & Z80_CF);
    cpu->hl = res;
    cpu->f = (Z80_NF | (((val ^ acc) & (acc ^ res) & 0x8000) >> 13)) |
             (((acc ^ res ^ val) >> 8) & Z80_HF) |
             ((res >> 16) & Z80_CF) |
             ((res >> 8) & (Z80_SF|Z80_YF|Z80_XF)) |
             ((res & 0xFFFF) ? 0 : Z80_ZF);
}

static inline bool _z80_ldi_ldd(z80_t* cpu, uint8_t val) {
    const uint8_t res = cpu->a + val;
    cpu->bc -= 1;
    cpu->f = (cpu->f & (Z80_SF|Z80_ZF|Z80_CF)) |
             ((res & 2) ? Z80_YF : 0) |
             ((res & 8) ? Z80_XF : 0) |
             (cpu->bc ? Z80_VF : 0);
    return cpu->bc != 0;
}

static inline bool _z80_cpi_cpd(z80_t* cpu, uint8_t val) {
    uint32_t res = (uint32_t) ((int)cpu->a - (int)val);
    cpu->bc -= 1;
    uint8_t f = (cpu->f & Z80_CF)|Z80_NF|_z80_sz_flags(res);
    if ((res & 0xF) > ((uint32_t)cpu->a & 0xF)) {
        f |= Z80_HF;
        res--;
    }
    if (res & 2) { f |= Z80_YF; }
    if (res & 8) { f |= Z80_XF; }
    if (cpu->bc) { f |= Z80_VF; }
    cpu->f = f;
    return (cpu->bc != 0) && !(f & Z80_ZF);
}

static inline bool _z80_ini_ind(z80_t* cpu, uint8_t val, uint8_t c) {
    const uint8_t b = cpu->b;
    uint8_t f = _z80_sz_flags(b) | (b & (Z80_XF|Z80_YF));
    if (val & Z80_SF) { f |= Z80_NF; }
    uint32_t t = (uint32_t)c + val;
    if (t & 0x100) { f |= Z80_HF|Z80_CF; }
    f |= _z80_szp_flags[((uint8_t)(t & 7)) ^ b] & Z80_PF;
    cpu->f = f;
    return (b != 0);
}

static inline bool _z80_outi_outd(z80_t* cpu, uint8_t val) {
    const uint8_t b = cpu->b;
    uint8_t f = _z80_sz_flags(b) | (b & (Z80_XF|Z80_YF));
    if (val & Z80_SF) { f |= Z80_NF; }
    uint32_t t = (uint32_t)cpu->l + val;
    if (t & 0x0100) { f |= Z80_HF|Z80_CF; }
    f |= _z80_szp_flags[((uint8_t)(t & 7)) ^ b] & Z80_PF;
    cpu->f = f;
    return (b != 0);
}

static inline uint8_t _z80_in(z80_t* cpu, uint8_t val) {
    cpu->f = (cpu->f & Z80_CF) | _z80_szp_flags[val];
    return val;
}

static inline uint8_t _z80_rrd(z80_t* cpu, uint8_t val) {
    const uint8_t l = cpu->a & 0x0F;
    cpu->a = (cpu->a & 0xF0) | (val & 0x0F);
    val = (val >> 4) | (l << 4);
    cpu->f = (cpu->f & Z80_CF) | _z80_szp_flags[cpu->a];
    return val;
}

static inline uint8_t _z80_rld(z80_t* cpu, uint8_t val) {
    const uint8_t l = cpu->a & 0x0F;
    cpu->a = (cpu->a & 0xF0) | (val >> 4);
    val = (val << 4) | l;
    cpu->f = (cpu->f & Z80_CF) | _z80_szp_flags[cpu->a];
    return val;
}

static inline uint8_t _z80_rlc(z80_t* cpu, uint8_t val) {
    uint8_t res = (val<<1) | (val>>7);
    cpu->f = _z80_szp_flags[res] | ((val>>7) & Z80_CF);
    return res;
}

static inline uint8_t _z80_rrc(z80_t* cpu, uint8_t val) {
    uint8_t res = (val>>1) | (val<<7);
    cpu->f = _z80_szp_flags[res] | (val & Z80_CF);
    return res;
}

static inline uint8_t _z80_rl(z80_t* cpu, uint8_t val) {
    uint8_t res = (val<<1) | (cpu->f & Z80_CF);
    cpu->f = _z80_szp_flags[res] | ((val>>7) & Z80_CF);
    return res;
}

static inline uint8_t _z80_rr(z80_t* cpu, uint8_t val) {
    uint8_t res = (val>>1) | ((cpu->f & Z80_CF)<<7);
    cpu->f = _z80_szp_flags[res] | (val & Z80_CF);
    return res;
}

static inline uint8_t _z80_sla(z80_t* cpu, uint8_t val) {
    uint8_t res = val<<1;
    cpu->f = _z80_szp_flags[res] | ((val>>7) & Z80_CF);
    return res;
}

static inline uint8_t _z80_sra(z80_t* cpu, uint8_t val) {
    uint8_t res = (val>>1) | (val & 0x80);
    cpu->f = _z80_szp_flags[res] | (val & Z80_CF);
    return res;
}

static inline uint8_t _z80_sll(z80_t* cpu, uint8_t val) {
    uint8_t res = (val<<1) | 1;
    cpu->f = _z80_szp_flags[res] | ((val>>7) & Z80_CF);
    return res;
}

static inline uint8_t _z80_srl(z80_t* cpu, uint8_t val) {
    uint8_t res = val>>1;
    cpu->f = _z80_szp_flags[res] | (val & Z80_CF);
    return res;
}

static inline uint64_t _z80_set_ab(uint64_t pins, uint16_t ab) {
    return (pins & ~0xFFFF) | ab;
}

static inline uint64_t _z80_set_ab_x(uint64_t pins, uint16_t ab, uint64_t x) {
    return (pins & ~0xFFFF) | ab | x;
}

static inline uint64_t _z80_set_ab_db(uint64_t pins, uint16_t ab, uint8_t db) {
    return (pins & ~0xFFFFFF) | (db<<16) | ab;
}

static inline uint64_t _z80_set_ab_db_x(uint64_t pins, uint16_t ab, uint8_t db, uint64_t x) {
    return (pins & ~0xFFFFFF) | (db<<16) | ab | x;
}

static inline uint8_t _z80_get_db(uint64_t pins) {
    return (uint8_t)(pins>>16);
}

// CB-prefix block action
static inline bool _z80_cb_action(z80_t* cpu, uint8_t z0, uint8_t z1) {
    const uint8_t x = cpu->opcode>>6;
    const uint8_t y = (cpu->opcode>>3)&7;
    uint8_t val, res;
    switch (z0) {
        case 0: val = cpu->b; break;
        case 1: val = cpu->c; break;
        case 2: val = cpu->d; break;
        case 3: val = cpu->e; break;
        case 4: val = cpu->h; break;
        case 5: val = cpu->l; break;
        case 6: val = cpu->dlatch; break;   // (HL)
        case 7: val = cpu->a; break;
        default: _Z80_UNREACHABLE;
    }
    switch (x) {
        case 0: // rot/shift
            switch (y) {
                case 0: res = _z80_rlc(cpu, val); break;
                case 1: res = _z80_rrc(cpu, val); break;
                case 2: res = _z80_rl(cpu, val); break;
                case 3: res = _z80_rr(cpu, val); break;
                case 4: res = _z80_sla(cpu, val); break;
                case 5: res = _z80_sra(cpu, val); break;
                case 6: res = _z80_sll(cpu, val); break;
                case 7: res = _z80_srl(cpu, val); break;
                default: _Z80_UNREACHABLE;
            }
            break;
        case 1: // bit
            res = val & (1<<y);
            cpu->f = (cpu->f & Z80_CF) | Z80_HF | (res ? (res & Z80_SF) : (Z80_ZF|Z80_PF));
            if (z0 == 6) {
                cpu->f |= (cpu->wz >> 8) & (Z80_YF|Z80_XF);
            }
            else {
                cpu->f |= val & (Z80_YF|Z80_XF);
            }
            break;
        case 2: // res
            res = val & ~(1 << y);
            break;
        case 3: // set
            res = val | (1 << y);
            break;
        default: _Z80_UNREACHABLE;
    }
    // don't write result back for BIT
    if (x != 1) {
        cpu->dlatch = res;
        switch (z1) {
            case 0: cpu->b = res; break;
            case 1: cpu->c = res; break;
            case 2: cpu->d = res; break;
            case 3: cpu->e = res; break;
            case 4: cpu->h = res; break;
            case 5: cpu->l = res; break;
            case 6: break;   // (HL)
            case 7: cpu->a = res; break;
            default: _Z80_UNREACHABLE;
        }
        return true;
    }
    else {
        return false;
    }
}

// compute the effective memory address for DD+CB/FD+CB instructions
static inline void _z80_ddfdcb_addr(z80_t* cpu, uint64_t pins) {
    uint8_t d = _z80_get_db(pins);
    cpu->addr = cpu->hlx[cpu->hlx_idx].hl + (int8_t)d;
    cpu->wz = cpu->addr;
}

// special case opstate table slots
#define _Z80_OPSTATE_SLOT_CB        (0)
#define _Z80_OPSTATE_SLOT_CBHL      (1)
#define _Z80_OPSTATE_SLOT_DDFDCB    (2)
#define _Z80_OPSTATE_SLOT_INT_IM0   (3)
#define _Z80_OPSTATE_SLOT_INT_IM1   (4)
#define _Z80_OPSTATE_SLOT_INT_IM2   (5)
#define _Z80_OPSTATE_SLOT_NMI       (6)
#define _Z80_OPSTATE_NUM_SPECIAL_OPS (7)

#define _Z80_OPSTATE_STEP_INDIRECT (5)          // see case-branch '6'
#define _Z80_OPSTATE_STEP_INDIRECT_IMM8 (13)    // see case-branch '14'

static const uint16_t _z80_optable[256] = {
      27,  // 00: NOP (M:1 T:4 steps:1)
      28,  // 01: LD BC,nn (M:3 T:10 steps:7)
      35,  // 02: LD (BC),A (M:2 T:7 steps:4)
      39,  // 03: INC BC (M:2 T:6 steps:3)
      42,  // 04: INC B (M:1 T:4 steps:1)
      43,  // 05: DEC B (M:1 T:4 steps:1)
      44,  // 06: LD B,n (M:2 T:7 steps:4)
      48,  // 07: RLCA (M:1 T:4 steps:1)
      49,  // 08: EX AF,AF' (M:1 T:4 steps:1)
      50,  // 09: ADD HL,BC (M:2 T:11 steps:8)
      58,  // 0A: LD A,(BC) (M:2 T:7 steps:4)
      62,  // 0B: DEC BC (M:2 T:6 steps:3)
      65,  // 0C: INC C (M:1 T:4 steps:1)
      66,  // 0D: DEC C (M:1 T:4 steps:1)
      67,  // 0E: LD C,n (M:2 T:7 steps:4)
      71,  // 0F: RRCA (M:1 T:4 steps:1)
      72,  // 10: DJNZ d (M:4 T:13 steps:10)
      82,  // 11: LD DE,nn (M:3 T:10 steps:7)
      89,  // 12: LD (DE),A (M:2 T:7 steps:4)
      93,  // 13: INC DE (M:2 T:6 steps:3)
      96,  // 14: INC D (M:1 T:4 steps:1)
      97,  // 15: DEC D (M:1 T:4 steps:1)
      98,  // 16: LD D,n (M:2 T:7 steps:4)
     102,  // 17: RLA (M:1 T:4 steps:1)
     103,  // 18: JR d (M:3 T:12 steps:9)
     112,  // 19: ADD HL,DE (M:2 T:11 steps:8)
     120,  // 1A: LD A,(DE) (M:2 T:7 steps:4)
     124,  // 1B: DEC DE (M:2 T:6 steps:3)
     127,  // 1C: INC E (M:1 T:4 steps:1)
     128,  // 1D: DEC E (M:1 T:4 steps:1)
     129,  // 1E: LD E,n (M:2 T:7 steps:4)
     133,  // 1F: RRA (M:1 T:4 steps:1)
     134,  // 20: JR NZ,d (M:3 T:12 steps:9)
     143,  // 21: LD HL,nn (M:3 T:10 steps:7)
     150,  // 22: LD (nn),HL (M:5 T:16 steps:13)
     163,  // 23: INC HL (M:2 T:6 steps:3)
     166,  // 24: INC H (M:1 T:4 steps:1)
     167,  // 25: DEC H (M:1 T:4 steps:1)
     168,  // 26: LD H,n (M:2 T:7 steps:4)
     172,  // 27: DAA (M:1 T:4 steps:1)
     173,  // 28: JR Z,d (M:3 T:12 steps:9)
     182,  // 29: ADD HL,HL (M:2 T:11 steps:8)
     190,  // 2A: LD HL,(nn) (M:5 T:16 steps:13)
     203,  // 2B: DEC HL (M:2 T:6 steps:3)
     206,  // 2C: INC L (M:1 T:4 steps:1)
     207,  // 2D: DEC L (M:1 T:4 steps:1)
     208,  // 2E: LD L,n (M:2 T:7 steps:4)
     212,  // 2F: CPL (M:1 T:4 steps:1)
     213,  // 30: JR NC,d (M:3 T:12 steps:9)
     222,  // 31: LD SP,nn (M:3 T:10 steps:7)
     229,  // 32: LD (nn),A (M:4 T:13 steps:10)
     239,  // 33: INC SP (M:2 T:6 steps:3)
     242,  // 34: INC (HL) (M:3 T:11 steps:8)
     250,  // 35: DEC (HL) (M:3 T:11 steps:8)
     258,  // 36: LD (HL),n (M:3 T:10 steps:7)
     265,  // 37: SCF (M:1 T:4 steps:1)
     266,  // 38: JR C,d (M:3 T:12 steps:9)
     275,  // 39: ADD HL,SP (M:2 T:11 steps:8)
     283,  // 3A: LD A,(nn) (M:4 T:13 steps:10)
     293,  // 3B: DEC SP (M:2 T:6 steps:3)
     296,  // 3C: INC A (M:1 T:4 steps:1)
     297,  // 3D: DEC A (M:1 T:4 steps:1)
     298,  // 3E: LD A,n (M:2 T:7 steps:4)
     302,  // 3F: CCF (M:1 T:4 steps:1)
     303,  // 40: LD B,B (M:1 T:4 steps:1)
     304,  // 41: LD B,C (M:1 T:4 steps:1)
     305,  // 42: LD B,D (M:1 T:4 steps:1)
     306,  // 43: LD B,E (M:1 T:4 steps:1)
     307,  // 44: LD B,H (M:1 T:4 steps:1)
     308,  // 45: LD B,L (M:1 T:4 steps:1)
     309,  // 46: LD B,(HL) (M:2 T:7 steps:4)
     313,  // 47: LD B,A (M:1 T:4 steps:1)
     314,  // 48: LD C,B (M:1 T:4 steps:1)
     315,  // 49: LD C,C (M:1 T:4 steps:1)
     316,  // 4A: LD C,D (M:1 T:4 steps:1)
     317,  // 4B: LD C,E (M:1 T:4 steps:1)
     318,  // 4C: LD C,H (M:1 T:4 steps:1)
     319,  // 4D: LD C,L (M:1 T:4 steps:1)
     320,  // 4E: LD C,(HL) (M:2 T:7 steps:4)
     324,  // 4F: LD C,A (M:1 T:4 steps:1)
     325,  // 50: LD D,B (M:1 T:4 steps:1)
     326,  // 51: LD D,C (M:1 T:4 steps:1)
     327,  // 52: LD D,D (M:1 T:4 steps:1)
     328,  // 53: LD D,E (M:1 T:4 steps:1)
     329,  // 54: LD D,H (M:1 T:4 steps:1)
     330,  // 55: LD D,L (M:1 T:4 steps:1)
     331,  // 56: LD D,(HL) (M:2 T:7 steps:4)
     335,  // 57: LD D,A (M:1 T:4 steps:1)
     336,  // 58: LD E,B (M:1 T:4 steps:1)
     337,  // 59: LD E,C (M:1 T:4 steps:1)
     338,  // 5A: LD E,D (M:1 T:4 steps:1)
     339,  // 5B: LD E,E (M:1 T:4 steps:1)
     340,  // 5C: LD E,H (M:1 T:4 steps:1)
     341,  // 5D: LD E,L (M:1 T:4 steps:1)
     342,  // 5E: LD E,(HL) (M:2 T:7 steps:4)
     346,  // 5F: LD E,A (M:1 T:4 steps:1)
     347,  // 60: LD H,B (M:1 T:4 steps:1)
     348,  // 61: LD H,C (M:1 T:4 steps:1)
     349,  // 62: LD H,D (M:1 T:4 steps:1)
     350,  // 63: LD H,E (M:1 T:4 steps:1)
     351,  // 64: LD H,H (M:1 T:4 steps:1)
     352,  // 65: LD H,L (M:1 T:4 steps:1)
     353,  // 66: LD H,(HL) (M:2 T:7 steps:4)
     357,  // 67: LD H,A (M:1 T:4 steps:1)
     358,  // 68: LD L,B (M:1 T:4 steps:1)
     359,  // 69: LD L,C (M:1 T:4 steps:1)
     360,  // 6A: LD L,D (M:1 T:4 steps:1)
     361,  // 6B: LD L,E (M:1 T:4 steps:1)
     362,  // 6C: LD L,H (M:1 T:4 steps:1)
     363,  // 6D: LD L,L (M:1 T:4 steps:1)
     364,  // 6E: LD L,(HL) (M:2 T:7 steps:4)
     368,  // 6F: LD L,A (M:1 T:4 steps:1)
     369,  // 70: LD (HL),B (M:2 T:7 steps:4)
     373,  // 71: LD (HL),C (M:2 T:7 steps:4)
     377,  // 72: LD (HL),D (M:2 T:7 steps:4)
     381,  // 73: LD (HL),E (M:2 T:7 steps:4)
     385,  // 74: LD (HL),H (M:2 T:7 steps:4)
     389,  // 75: LD (HL),L (M:2 T:7 steps:4)
     393,  // 76: HALT (M:1 T:4 steps:1)
     394,  // 77: LD (HL),A (M:2 T:7 steps:4)
     398,  // 78: LD A,B (M:1 T:4 steps:1)
     399,  // 79: LD A,C (M:1 T:4 steps:1)
     400,  // 7A: LD A,D (M:1 T:4 steps:1)
     401,  // 7B: LD A,E (M:1 T:4 steps:1)
     402,  // 7C: LD A,H (M:1 T:4 steps:1)
     403,  // 7D: LD A,L (M:1 T:4 steps:1)
     404,  // 7E: LD A,(HL) (M:2 T:7 steps:4)
     408,  // 7F: LD A,A (M:1 T:4 steps:1)
     409,  // 80: ADD B (M:1 T:4 steps:1)
     410,  // 81: ADD C (M:1 T:4 steps:1)
     411,  // 82: ADD D (M:1 T:4 steps:1)
     412,  // 83: ADD E (M:1 T:4 steps:1)
     413,  // 84: ADD H (M:1 T:4 steps:1)
     414,  // 85: ADD L (M:1 T:4 steps:1)
     415,  // 86: ADD (HL) (M:2 T:7 steps:4)
     419,  // 87: ADD A (M:1 T:4 steps:1)
     420,  // 88: ADC B (M:1 T:4 steps:1)
     421,  // 89: ADC C (M:1 T:4 steps:1)
     422,  // 8A: ADC D (M:1 T:4 steps:1)
     423,  // 8B: ADC E (M:1 T:4 steps:1)
     424,  // 8C: ADC H (M:1 T:4 steps:1)
     425,  // 8D: ADC L (M:1 T:4 steps:1)
     426,  // 8E: ADC (HL) (M:2 T:7 steps:4)
     430,  // 8F: ADC A (M:1 T:4 steps:1)
     431,  // 90: SUB B (M:1 T:4 steps:1)
     432,  // 91: SUB C (M:1 T:4 steps:1)
     433,  // 92: SUB D (M:1 T:4 steps:1)
     434,  // 93: SUB E (M:1 T:4 steps:1)
     435,  // 94: SUB H (M:1 T:4 steps:1)
     436,  // 95: SUB L (M:1 T:4 steps:1)
     437,  // 96: SUB (HL) (M:2 T:7 steps:4)
     441,  // 97: SUB A (M:1 T:4 steps:1)
     442,  // 98: SBC B (M:1 T:4 steps:1)
     443,  // 99: SBC C (M:1 T:4 steps:1)
     444,  // 9A: SBC D (M:1 T:4 steps:1)
     445,  // 9B: SBC E (M:1 T:4 steps:1)
     446,  // 9C: SBC H (M:1 T:4 steps:1)
     447,  // 9D: SBC L (M:1 T:4 steps:1)
     448,  // 9E: SBC (HL) (M:2 T:7 steps:4)
     452,  // 9F: SBC A (M:1 T:4 steps:1)
     453,  // A0: AND B (M:1 T:4 steps:1)
     454,  // A1: AND C (M:1 T:4 steps:1)
     455,  // A2: AND D (M:1 T:4 steps:1)
     456,  // A3: AND E (M:1 T:4 steps:1)
     457,  // A4: AND H (M:1 T:4 steps:1)
     458,  // A5: AND L (M:1 T:4 steps:1)
     459,  // A6: AND (HL) (M:2 T:7 steps:4)
     463,  // A7: AND A (M:1 T:4 steps:1)
     464,  // A8: XOR B (M:1 T:4 steps:1)
     465,  // A9: XOR C (M:1 T:4 steps:1)
     466,  // AA: XOR D (M:1 T:4 steps:1)
     467,  // AB: XOR E (M:1 T:4 steps:1)
     468,  // AC: XOR H (M:1 T:4 steps:1)
     469,  // AD: XOR L (M:1 T:4 steps:1)
     470,  // AE: XOR (HL) (M:2 T:7 steps:4)
     474,  // AF: XOR A (M:1 T:4 steps:1)
     475,  // B0: OR B (M:1 T:4 steps:1)
     476,  // B1: OR C (M:1 T:4 steps:1)
     477,  // B2: OR D (M:1 T:4 steps:1)
     478,  // B3: OR E (M:1 T:4 steps:1)
     479,  // B4: OR H (M:1 T:4 steps:1)
     480,  // B5: OR L (M:1 T:4 steps:1)
     481,  // B6: OR (HL) (M:2 T:7 steps:4)
     485,  // B7: OR A (M:1 T:4 steps:1)
     486,  // B8: CP B (M:1 T:4 steps:1)
     487,  // B9: CP C (M:1 T:4 steps:1)
     488,  // BA: CP D (M:1 T:4 steps:1)
     489,  // BB: CP E (M:1 T:4 steps:1)
     490,  // BC: CP H (M:1 T:4 steps:1)
     491,  // BD: CP L (M:1 T:4 steps:1)
     492,  // BE: CP (HL) (M:2 T:7 steps:4)
     496,  // BF: CP A (M:1 T:4 steps:1)
     497,  // C0: RET NZ (M:4 T:11 steps:8)
     505,  // C1: POP BC (M:3 T:10 steps:7)
     512,  // C2: JP NZ,nn (M:3 T:10 steps:7)
     519,  // C3: JP nn (M:3 T:10 steps:7)
     526,  // C4: CALL NZ,nn (M:6 T:17 steps:14)
     540,  // C5: PUSH BC (M:4 T:11 steps:8)
     548,  // C6: ADD n (M:2 T:7 steps:4)
     552,  // C7: RST 0h (M:4 T:11 steps:8)
     560,  // C8: RET Z (M:4 T:11 steps:8)
     568,  // C9: RET (M:3 T:10 steps:7)
     575,  // CA: JP Z,nn (M:3 T:10 steps:7)
     582,  // CB: CB prefix (M:1 T:4 steps:1)
     583,  // CC: CALL Z,nn (M:6 T:17 steps:14)
     597,  // CD: CALL nn (M:5 T:17 steps:14)
     611,  // CE: ADC n (M:2 T:7 steps:4)
     615,  // CF: RST 8h (M:4 T:11 steps:8)
     623,  // D0: RET NC (M:4 T:11 steps:8)
     631,  // D1: POP DE (M:3 T:10 steps:7)
     638,  // D2: JP NC,nn (M:3 T:10 steps:7)
     645,  // D3: OUT (n),A (M:3 T:11 steps:8)
     653,  // D4: CALL NC,nn (M:6 T:17 steps:14)
     667,  // D5: PUSH DE (M:4 T:11 steps:8)
     675,  // D6: SUB n (M:2 T:7 steps:4)
     679,  // D7: RST 10h (M:4 T:11 steps:8)
     687,  // D8: RET C (M:4 T:11 steps:8)
     695,  // D9: EXX (M:1 T:4 steps:1)
     696,  // DA: JP C,nn (M:3 T:10 steps:7)
     703,  // DB: IN A,(n) (M:3 T:11 steps:8)
     711,  // DC: CALL C,nn (M:6 T:17 steps:14)
     725,  // DD: DD prefix (M:1 T:4 steps:1)
     726,  // DE: SBC n (M:2 T:7 steps:4)
     730,  // DF: RST 18h (M:4 T:11 steps:8)
     738,  // E0: RET PO (M:4 T:11 steps:8)
     746,  // E1: POP HL (M:3 T:10 steps:7)
     753,  // E2: JP PO,nn (M:3 T:10 steps:7)
     760,  // E3: EX (SP),HL (M:5 T:19 steps:16)
     776,  // E4: CALL PO,nn (M:6 T:17 steps:14)
     790,  // E5: PUSH HL (M:4 T:11 steps:8)
     798,  // E6: AND n (M:2 T:7 steps:4)
     802,  // E7: RST 20h (M:4 T:11 steps:8)
     810,  // E8: RET PE (M:4 T:11 steps:8)
     818,  // E9: JP HL (M:1 T:4 steps:1)
     819,  // EA: JP PE,nn (M:3 T:10 steps:7)
     826,  // EB: EX DE,HL (M:1 T:4 steps:1)
     827,  // EC: CALL PE,nn (M:6 T:17 steps:14)
     841,  // ED: ED prefix (M:1 T:4 steps:1)
     842,  // EE: XOR n (M:2 T:7 steps:4)
     846,  // EF: RST 28h (M:4 T:11 steps:8)
     854,  // F0: RET P (M:4 T:11 steps:8)
     862,  // F1: POP AF (M:3 T:10 steps:7)
     869,  // F2: JP P,nn (M:3 T:10 steps:7)
     876,  // F3: DI (M:1 T:4 steps:1)
     877,  // F4: CALL P,nn (M:6 T:17 steps:14)
     891,  // F5: PUSH AF (M:4 T:11 steps:8)
     899,  // F6: OR n (M:2 T:7 steps:4)
     903,  // F7: RST 30h (M:4 T:11 steps:8)
     911,  // F8: RET M (M:4 T:11 steps:8)
     919,  // F9: LD SP,HL (M:2 T:6 steps:3)
     922,  // FA: JP M,nn (M:3 T:10 steps:7)
     929,  // FB: EI (M:1 T:4 steps:1)
     930,  // FC: CALL M,nn (M:6 T:17 steps:14)
     944,  // FD: FD prefix (M:1 T:4 steps:1)
     945,  // FE: CP n (M:2 T:7 steps:4)
     949,  // FF: RST 38h (M:4 T:11 steps:8)
 };

static const uint16_t _z80_ddfd_optable[256] = {
      27,  // 00: NOP (M:1 T:4 steps:1)
      28,  // 01: LD BC,nn (M:3 T:10 steps:7)
      35,  // 02: LD (BC),A (M:2 T:7 steps:4)
      39,  // 03: INC BC (M:2 T:6 steps:3)
      42,  // 04: INC B (M:1 T:4 steps:1)
      43,  // 05: DEC B (M:1 T:4 steps:1)
      44,  // 06: LD B,n (M:2 T:7 steps:4)
      48,  // 07: RLCA (M:1 T:4 steps:1)
      49,  // 08: EX AF,AF' (M:1 T:4 steps:1)
      50,  // 09: ADD HL,BC (M:2 T:11 steps:8)
      58,  // 0A: LD A,(BC) (M:2 T:7 steps:4)
      62,  // 0B: DEC BC (M:2 T:6 steps:3)
      65,  // 0C: INC C (M:1 T:4 steps:1)
      66,  // 0D: DEC C (M:1 T:4 steps:1)
      67,  // 0E: LD C,n (M:2 T:7 steps:4)
      71,  // 0F: RRCA (M:1 T:4 steps:1)
      72,  // 10: DJNZ d (M:4 T:13 steps:10)
      82,  // 11: LD DE,nn (M:3 T:10 steps:7)
      89,  // 12: LD (DE),A (M:2 T:7 steps:4)
      93,  // 13: INC DE (M:2 T:6 steps:3)
      96,  // 14: INC D (M:1 T:4 steps:1)
      97,  // 15: DEC D (M:1 T:4 steps:1)
      98,  // 16: LD D,n (M:2 T:7 steps:4)
     102,  // 17: RLA (M:1 T:4 steps:1)
     103,  // 18: JR d (M:3 T:12 steps:9)
     112,  // 19: ADD HL,DE (M:2 T:11 steps:8)
     120,  // 1A: LD A,(DE) (M:2 T:7 steps:4)
     124,  // 1B: DEC DE (M:2 T:6 steps:3)
     127,  // 1C: INC E (M:1 T:4 steps:1)
     128,  // 1D: DEC E (M:1 T:4 steps:1)
     129,  // 1E: LD E,n (M:2 T:7 steps:4)
     133,  // 1F: RRA (M:1 T:4 steps:1)
     134,  // 20: JR NZ,d (M:3 T:12 steps:9)
     143,  // 21: LD HL,nn (M:3 T:10 steps:7)
     150,  // 22: LD (nn),HL (M:5 T:16 steps:13)
     163,  // 23: INC HL (M:2 T:6 steps:3)
     166,  // 24: INC H (M:1 T:4 steps:1)
     167,  // 25: DEC H (M:1 T:4 steps:1)
     168,  // 26: LD H,n (M:2 T:7 steps:4)
     172,  // 27: DAA (M:1 T:4 steps:1)
     173,  // 28: JR Z,d (M:3 T:12 steps:9)
     182,  // 29: ADD HL,HL (M:2 T:11 steps:8)
     190,  // 2A: LD HL,(nn) (M:5 T:16 steps:13)
     203,  // 2B: DEC HL (M:2 T:6 steps:3)
     206,  // 2C: INC L (M:1 T:4 steps:1)
     207,  // 2D: DEC L (M:1 T:4 steps:1)
     208,  // 2E: LD L,n (M:2 T:7 steps:4)
     212,  // 2F: CPL (M:1 T:4 steps:1)
     213,  // 30: JR NC,d (M:3 T:12 steps:9)
     222,  // 31: LD SP,nn (M:3 T:10 steps:7)
     229,  // 32: LD (nn),A (M:4 T:13 steps:10)
     239,  // 33: INC SP (M:2 T:6 steps:3)
    _Z80_OPSTATE_STEP_INDIRECT,  // 34: INC (HL) (M:3 T:11 steps:8)
    _Z80_OPSTATE_STEP_INDIRECT,  // 35: DEC (HL) (M:3 T:11 steps:8)
    _Z80_OPSTATE_STEP_INDIRECT_IMM8,  // 36: LD (HL),n (M:3 T:10 steps:7)
     265,  // 37: SCF (M:1 T:4 steps:1)
     266,  // 38: JR C,d (M:3 T:12 steps:9)
     275,  // 39: ADD HL,SP (M:2 T:11 steps:8)
     283,  // 3A: LD A,(nn) (M:4 T:13 steps:10)
     293,  // 3B: DEC SP (M:2 T:6 steps:3)
     296,  // 3C: INC A (M:1 T:4 steps:1)
     297,  // 3D: DEC A (M:1 T:4 steps:1)
     298,  // 3E: LD A,n (M:2 T:7 steps:4)
     302,  // 3F: CCF (M:1 T:4 steps:1)
     303,  // 40: LD B,B (M:1 T:4 steps:1)
     304,  // 41: LD B,C (M:1 T:4 steps:1)
     305,  // 42: LD B,D (M:1 T:4 steps:1)
     306,  // 43: LD B,E (M:1 T:4 steps:1)
     307,  // 44: LD B,H (M:1 T:4 steps:1)
     308,  // 45: LD B,L (M:1 T:4 steps:1)
    _Z80_OPSTATE_STEP_INDIRECT,  // 46: LD B,(HL) (M:2 T:7 steps:4)
     313,  // 47: LD B,A (M:1 T:4 steps:1)
     314,  // 48: LD C,B (M:1 T:4 steps:1)
     315,  // 49: LD C,C (M:1 T:4 steps:1)
     316,  // 4A: LD C,D (M:1 T:4 steps:1)
     317,  // 4B: LD C,E (M:1 T:4 steps:1)
     318,  // 4C: LD C,H (M:1 T:4 steps:1)
     319,  // 4D: LD C,L (M:1 T:4 steps:1)
    _Z80_OPSTATE_STEP_INDIRECT,  // 4E: LD C,(HL) (M:2 T:7 steps:4)
     324,  // 4F: LD C,A (M:1 T:4 steps:1)
     325,  // 50: LD D,B (M:1 T:4 steps:1)
     326,  // 51: LD D,C (M:1 T:4 steps:1)
     327,  // 52: LD D,D (M:1 T:4 steps:1)
     328,  // 53: LD D,E (M:1 T:4 steps:1)
     329,  // 54: LD D,H (M:1 T:4 steps:1)
     330,  // 55: LD D,L (M:1 T:4 steps:1)
    _Z80_OPSTATE_STEP_INDIRECT,  // 56: LD D,(HL) (M:2 T:7 steps:4)
     335,  // 57: LD D,A (M:1 T:4 steps:1)
     336,  // 58: LD E,B (M:1 T:4 steps:1)
     337,  // 59: LD E,C (M:1 T:4 steps:1)
     338,  // 5A: LD E,D (M:1 T:4 steps:1)
     339,  // 5B: LD E,E (M:1 T:4 steps:1)
     340,  // 5C: LD E,H (M:1 T:4 steps:1)
     341,  // 5D: LD E,L (M:1 T:4 steps:1)
    _Z80_OPSTATE_STEP_INDIRECT,  // 5E: LD E,(HL) (M:2 T:7 steps:4)
     346,  // 5F: LD E,A (M:1 T:4 steps:1)
     347,  // 60: LD H,B (M:1 T:4 steps:1)
     348,  // 61: LD H,C (M:1 T:4 steps:1)
     349,  // 62: LD H,D (M:1 T:4 steps:1)
     350,  // 63: LD H,E (M:1 T:4 steps:1)
     351,  // 64: LD H,H (M:1 T:4 steps:1)
     352,  // 65: LD H,L (M:1 T:4 steps:1)
    _Z80_OPSTATE_STEP_INDIRECT,  // 66: LD H,(HL) (M:2 T:7 steps:4)
     357,  // 67: LD H,A (M:1 T:4 steps:1)
     358,  // 68: LD L,B (M:1 T:4 steps:1)
     359,  // 69: LD L,C (M:1 T:4 steps:1)
     360,  // 6A: LD L,D (M:1 T:4 steps:1)
     361,  // 6B: LD L,E (M:1 T:4 steps:1)
     362,  // 6C: LD L,H (M:1 T:4 steps:1)
     363,  // 6D: LD L,L (M:1 T:4 steps:1)
    _Z80_OPSTATE_STEP_INDIRECT,  // 6E: LD L,(HL) (M:2 T:7 steps:4)
     368,  // 6F: LD L,A (M:1 T:4 steps:1)
    _Z80_OPSTATE_STEP_INDIRECT,  // 70: LD (HL),B (M:2 T:7 steps:4)
    _Z80_OPSTATE_STEP_INDIRECT,  // 71: LD (HL),C (M:2 T:7 steps:4)
    _Z80_OPSTATE_STEP_INDIRECT,  // 72: LD (HL),D (M:2 T:7 steps:4)
    _Z80_OPSTATE_STEP_INDIRECT,  // 73: LD (HL),E (M:2 T:7 steps:4)
    _Z80_OPSTATE_STEP_INDIRECT,  // 74: LD (HL),H (M:2 T:7 steps:4)
    _Z80_OPSTATE_STEP_INDIRECT,  // 75: LD (HL),L (M:2 T:7 steps:4)
     393,  // 76: HALT (M:1 T:4 steps:1)
    _Z80_OPSTATE_STEP_INDIRECT,  // 77: LD (HL),A (M:2 T:7 steps:4)
     398,  // 78: LD A,B (M:1 T:4 steps:1)
     399,  // 79: LD A,C (M:1 T:4 steps:1)
     400,  // 7A: LD A,D (M:1 T:4 steps:1)
     401,  // 7B: LD A,E (M:1 T:4 steps:1)
     402,  // 7C: LD A,H (M:1 T:4 steps:1)
     403,  // 7D: LD A,L (M:1 T:4 steps:1)
    _Z80_OPSTATE_STEP_INDIRECT,  // 7E: LD A,(HL) (M:2 T:7 steps:4)
     408,  // 7F: LD A,A (M:1 T:4 steps:1)
     409,  // 80: ADD B (M:1 T:4 steps:1)
     410,  // 81: ADD C (M:1 T:4 steps:1)
     411,  // 82: ADD D (M:1 T:4 steps:1)
     412,  // 83: ADD E (M:1 T:4 steps:1)
     413,  // 84: ADD H (M:1 T:4 steps:1)
     414,  // 85: ADD L (M:1 T:4 steps:1)
    _Z80_OPSTATE_STEP_INDIRECT,  // 86: ADD (HL) (M:2 T:7 steps:4)
     419,  // 87: ADD A (M:1 T:4 steps:1)
     420,  // 88: ADC B (M:1 T:4 steps:1)
     421,  // 89: ADC C (M:1 T:4 steps:1)
     422,  // 8A: ADC D (M:1 T:4 steps:1)
     423,  // 8B: ADC E (M:1 T:4 steps:1)
     424,  // 8C: ADC H (M:1 T:4 steps:1)
     425,  // 8D: ADC L (M:1 T:4 steps:1)
    _Z80_OPSTATE_STEP_INDIRECT,  // 8E: ADC (HL) (M:2 T:7 steps:4)
     430,  // 8F: ADC A (M:1 T:4 steps:1)
     431,  // 90: SUB B (M:1 T:4 steps:1)
     432,  // 91: SUB C (M:1 T:4 steps:1)
     433,  // 92: SUB D (M:1 T:4 steps:1)
     434,  // 93: SUB E (M:1 T:4 steps:1)
     435,  // 94: SUB H (M:1 T:4 steps:1)
     436,  // 95: SUB L (M:1 T:4 steps:1)
    _Z80_OPSTATE_STEP_INDIRECT,  // 96: SUB (HL) (M:2 T:7 steps:4)
     441,  // 97: SUB A (M:1 T:4 steps:1)
     442,  // 98: SBC B (M:1 T:4 steps:1)
     443,  // 99: SBC C (M:1 T:4 steps:1)
     444,  // 9A: SBC D (M:1 T:4 steps:1)
     445,  // 9B: SBC E (M:1 T:4 steps:1)
     446,  // 9C: SBC H (M:1 T:4 steps:1)
     447,  // 9D: SBC L (M:1 T:4 steps:1)
    _Z80_OPSTATE_STEP_INDIRECT,  // 9E: SBC (HL) (M:2 T:7 steps:4)
     452,  // 9F: SBC A (M:1 T:4 steps:1)
     453,  // A0: AND B (M:1 T:4 steps:1)
     454,  // A1: AND C (M:1 T:4 steps:1)
     455,  // A2: AND D (M:1 T:4 steps:1)
     456,  // A3: AND E (M:1 T:4 steps:1)
     457,  // A4: AND H (M:1 T:4 steps:1)
     458,  // A5: AND L (M:1 T:4 steps:1)
    _Z80_OPSTATE_STEP_INDIRECT,  // A6: AND (HL) (M:2 T:7 steps:4)
     463,  // A7: AND A (M:1 T:4 steps:1)
     464,  // A8: XOR B (M:1 T:4 steps:1)
     465,  // A9: XOR C (M:1 T:4 steps:1)
     466,  // AA: XOR D (M:1 T:4 steps:1)
     467,  // AB: XOR E (M:1 T:4 steps:1)
     468,  // AC: XOR H (M:1 T:4 steps:1)
     469,  // AD: XOR L (M:1 T:4 steps:1)
    _Z80_OPSTATE_STEP_INDIRECT,  // AE: XOR (HL) (M:2 T:7 steps:4)
     474,  // AF: XOR A (M:1 T:4 steps:1)
     475,  // B0: OR B (M:1 T:4 steps:1)
     476,  // B1: OR C (M:1 T:4 steps:1)
     477,  // B2: OR D (M:1 T:4 steps:1)
     478,  // B3: OR E (M:1 T:4 steps:1)
     479,  // B4: OR H (M:1 T:4 steps:1)
     480,  // B5: OR L (M:1 T:4 steps:1)
    _Z80_OPSTATE_STEP_INDIRECT,  // B6: OR (HL) (M:2 T:7 steps:4)
     485,  // B7: OR A (M:1 T:4 steps:1)
     486,  // B8: CP B (M:1 T:4 steps:1)
     487,  // B9: CP C (M:1 T:4 steps:1)
     488,  // BA: CP D (M:1 T:4 steps:1)
     489,  // BB: CP E (M:1 T:4 steps:1)
     490,  // BC: CP H (M:1 T:4 steps:1)
     491,  // BD: CP L (M:1 T:4 steps:1)
    _Z80_OPSTATE_STEP_INDIRECT,  // BE: CP (HL) (M:2 T:7 steps:4)
     496,  // BF: CP A (M:1 T:4 steps:1)
     497,  // C0: RET NZ (M:4 T:11 steps:8)
     505,  // C1: POP BC (M:3 T:10 steps:7)
     512,  // C2: JP NZ,nn (M:3 T:10 steps:7)
     519,  // C3: JP nn (M:3 T:10 steps:7)
     526,  // C4: CALL NZ,nn (M:6 T:17 steps:14)
     540,  // C5: PUSH BC (M:4 T:11 steps:8)
     548,  // C6: ADD n (M:2 T:7 steps:4)
     552,  // C7: RST 0h (M:4 T:11 steps:8)
     560,  // C8: RET Z (M:4 T:11 steps:8)
     568,  // C9: RET (M:3 T:10 steps:7)
     575,  // CA: JP Z,nn (M:3 T:10 steps:7)
     582,  // CB: CB prefix (M:1 T:4 steps:1)
     583,  // CC: CALL Z,nn (M:6 T:17 steps:14)
     597,  // CD: CALL nn (M:5 T:17 steps:14)
     611,  // CE: ADC n (M:2 T:7 steps:4)
     615,  // CF: RST 8h (M:4 T:11 steps:8)
     623,  // D0: RET NC (M:4 T:11 steps:8)
     631,  // D1: POP DE (M:3 T:10 steps:7)
     638,  // D2: JP NC,nn (M:3 T:10 steps:7)
     645,  // D3: OUT (n),A (M:3 T:11 steps:8)
     653,  // D4: CALL NC,nn (M:6 T:17 steps:14)
     667,  // D5: PUSH DE (M:4 T:11 steps:8)
     675,  // D6: SUB n (M:2 T:7 steps:4)
     679,  // D7: RST 10h (M:4 T:11 steps:8)
     687,  // D8: RET C (M:4 T:11 steps:8)
     695,  // D9: EXX (M:1 T:4 steps:1)
     696,  // DA: JP C,nn (M:3 T:10 steps:7)
     703,  // DB: IN A,(n) (M:3 T:11 steps:8)
     711,  // DC: CALL C,nn (M:6 T:17 steps:14)
     725,  // DD: DD prefix (M:1 T:4 steps:1)
     726,  // DE: SBC n (M:2 T:7 steps:4)
     730,  // DF: RST 18h (M:4 T:11 steps:8)
     738,  // E0: RET PO (M:4 T:11 steps:8)
     746,  // E1: POP HL (M:3 T:10 steps:7)
     753,  // E2: JP PO,nn (M:3 T:10 steps:7)
     760,  // E3: EX (SP),HL (M:5 T:19 steps:16)
     776,  // E4: CALL PO,nn (M:6 T:17 steps:14)
     790,  // E5: PUSH HL (M:4 T:11 steps:8)
     798,  // E6: AND n (M:2 T:7 steps:4)
     802,  // E7: RST 20h (M:4 T:11 steps:8)
     810,  // E8: RET PE (M:4 T:11 steps:8)
     818,  // E9: JP HL (M:1 T:4 steps:1)
     819,  // EA: JP PE,nn (M:3 T:10 steps:7)
     826,  // EB: EX DE,HL (M:1 T:4 steps:1)
     827,  // EC: CALL PE,nn (M:6 T:17 steps:14)
     841,  // ED: ED prefix (M:1 T:4 steps:1)
     842,  // EE: XOR n (M:2 T:7 steps:4)
     846,  // EF: RST 28h (M:4 T:11 steps:8)
     854,  // F0: RET P (M:4 T:11 steps:8)
     862,  // F1: POP AF (M:3 T:10 steps:7)
     869,  // F2: JP P,nn (M:3 T:10 steps:7)
     876,  // F3: DI (M:1 T:4 steps:1)
     877,  // F4: CALL P,nn (M:6 T:17 steps:14)
     891,  // F5: PUSH AF (M:4 T:11 steps:8)
     899,  // F6: OR n (M:2 T:7 steps:4)
     903,  // F7: RST 30h (M:4 T:11 steps:8)
     911,  // F8: RET M (M:4 T:11 steps:8)
     919,  // F9: LD SP,HL (M:2 T:6 steps:3)
     922,  // FA: JP M,nn (M:3 T:10 steps:7)
     929,  // FB: EI (M:1 T:4 steps:1)
     930,  // FC: CALL M,nn (M:6 T:17 steps:14)
     944,  // FD: FD prefix (M:1 T:4 steps:1)
     945,  // FE: CP n (M:2 T:7 steps:4)
     949,  // FF: RST 38h (M:4 T:11 steps:8)
 };

static const uint16_t _z80_ed_optable[256] = {
     957,  // 00: ED NOP (M:1 T:4 steps:1)
     957,  // 01: ED NOP (M:1 T:4 steps:1)
     957,  // 02: ED NOP (M:1 T:4 steps:1)
     957,  // 03: ED NOP (M:1 T:4 steps:1)
     957,  // 04: ED NOP (M:1 T:4 steps:1)
     957,  // 05: ED NOP (M:1 T:4 steps:1)
     957,  // 06: ED NOP (M:1 T:4 steps:1)
     957,  // 07: ED NOP (M:1 T:4 steps:1)
     957,  // 08: ED NOP (M:1 T:4 steps:1)
     957,  // 09: ED NOP (M:1 T:4 steps:1)
     957,  // 0A: ED NOP (M:1 T:4 steps:1)
     957,  // 0B: ED NOP (M:1 T:4 steps:1)
     957,  // 0C: ED NOP (M:1 T:4 steps:1)
     957,  // 0D: ED NOP (M:1 T:4 steps:1)
     957,  // 0E: ED NOP (M:1 T:4 steps:1)
     957,  // 0F: ED NOP (M:1 T:4 steps:1)
     957,  // 10: ED NOP (M:1 T:4 steps:1)
     957,  // 11: ED NOP (M:1 T:4 steps:1)
     957,  // 12: ED NOP (M:1 T:4 steps:1)
     957,  // 13: ED NOP (M:1 T:4 steps:1)
     957,  // 14: ED NOP (M:1 T:4 steps:1)
     957,  // 15: ED NOP (M:1 T:4 steps:1)
     957,  // 16: ED NOP (M:1 T:4 steps:1)
     957,  // 17: ED NOP (M:1 T:4 steps:1)
     957,  // 18: ED NOP (M:1 T:4 steps:1)
     957,  // 19: ED NOP (M:1 T:4 steps:1)
     957,  // 1A: ED NOP (M:1 T:4 steps:1)
     957,  // 1B: ED NOP (M:1 T:4 steps:1)
     957,  // 1C: ED NOP (M:1 T:4 steps:1)
     957,  // 1D: ED NOP (M:1 T:4 steps:1)
     957,  // 1E: ED NOP (M:1 T:4 steps:1)
     957,  // 1F: ED NOP (M:1 T:4 steps:1)
     957,  // 20: ED NOP (M:1 T:4 steps:1)
     957,  // 21: ED NOP (M:1 T:4 steps:1)
     957,  // 22: ED NOP (M:1 T:4 steps:1)
     957,  // 23: ED NOP (M:1 T:4 steps:1)
     957,  // 24: ED NOP (M:1 T:4 steps:1)
     957,  // 25: ED NOP (M:1 T:4 steps:1)
     957,  // 26: ED NOP (M:1 T:4 steps:1)
     957,  // 27: ED NOP (M:1 T:4 steps:1)
     957,  // 28: ED NOP (M:1 T:4 steps:1)
     957,  // 29: ED NOP (M:1 T:4 steps:1)
     957,  // 2A: ED NOP (M:1 T:4 steps:1)
     957,  // 2B: ED NOP (M:1 T:4 steps:1)
     957,  // 2C: ED NOP (M:1 T:4 steps:1)
     957,  // 2D: ED NOP (M:1 T:4 steps:1)
     957,  // 2E: ED NOP (M:1 T:4 steps:1)
     957,  // 2F: ED NOP (M:1 T:4 steps:1)
     957,  // 30: ED NOP (M:1 T:4 steps:1)
     957,  // 31: ED NOP (M:1 T:4 steps:1)
     957,  // 32: ED NOP (M:1 T:4 steps:1)
     957,  // 33: ED NOP (M:1 T:4 steps:1)
     957,  // 34: ED NOP (M:1 T:4 steps:1)
     957,  // 35: ED NOP (M:1 T:4 steps:1)
     957,  // 36: ED NOP (M:1 T:4 steps:1)
     957,  // 37: ED NOP (M:1 T:4 steps:1)
     957,  // 38: ED NOP (M:1 T:4 steps:1)
     957,  // 39: ED NOP (M:1 T:4 steps:1)
     957,  // 3A: ED NOP (M:1 T:4 steps:1)
     957,  // 3B: ED NOP (M:1 T:4 steps:1)
     957,  // 3C: ED NOP (M:1 T:4 steps:1)
     957,  // 3D: ED NOP (M:1 T:4 steps:1)
     957,  // 3E: ED NOP (M:1 T:4 steps:1)
     957,  // 3F: ED NOP (M:1 T:4 steps:1)
     958,  // 40: IN B,(C) (M:2 T:8 steps:5)
     963,  // 41: OUT (C),B (M:2 T:8 steps:5)
     968,  // 42: SBC HL,BC (M:2 T:11 steps:8)
     976,  // 43: LD (nn),BC (M:5 T:16 steps:13)
     989,  // 44: NEG (M:1 T:4 steps:1)
     990,  // 45: RETN (M:3 T:10 steps:7)
     997,  // 46: IM 0 (M:1 T:4 steps:1)
     998,  // 47: LD I,A (M:2 T:5 steps:2)
    1000,  // 48: IN C,(C) (M:2 T:8 steps:5)
    1005,  // 49: OUT (C),C (M:2 T:8 steps:5)
    1010,  // 4A: ADC HL,BC (M:2 T:11 steps:8)
    1018,  // 4B: LD BC,(nn) (M:5 T:16 steps:13)
     989,  // 4C: NEG (M:1 T:4 steps:1)
    1031,  // 4D: RETI (M:3 T:10 steps:7)
    1038,  // 4E: IM 0 (M:1 T:4 steps:1)
    1039,  // 4F: LD R,A (M:2 T:5 steps:2)
    1041,  // 50: IN D,(C) (M:2 T:8 steps:5)
    1046,  // 51: OUT (C),D (M:2 T:8 steps:5)
    1051,  // 52: SBC HL,DE (M:2 T:11 steps:8)
    1059,  // 53: LD (nn),DE (M:5 T:16 steps:13)
     989,  // 54: NEG (M:1 T:4 steps:1)
    1031,  // 55: RETI (M:3 T:10 steps:7)
    1072,  // 56: IM 1 (M:1 T:4 steps:1)
    1073,  // 57: LD A,I (M:2 T:5 steps:2)
    1075,  // 58: IN E,(C) (M:2 T:8 steps:5)
    1080,  // 59: OUT (C),E (M:2 T:8 steps:5)
    1085,  // 5A: ADC HL,DE (M:2 T:11 steps:8)
    1093,  // 5B: LD DE,(nn) (M:5 T:16 steps:13)
     989,  // 5C: NEG (M:1 T:4 steps:1)
    1031,  // 5D: RETI (M:3 T:10 steps:7)
    1106,  // 5E: IM 2 (M:1 T:4 steps:1)
    1107,  // 5F: LD A,R (M:2 T:5 steps:2)
    1109,  // 60: IN H,(C) (M:2 T:8 steps:5)
    1114,  // 61: OUT (C),H (M:2 T:8 steps:5)
    1119,  // 62: SBC HL,HL (M:2 T:11 steps:8)
    1127,  // 63: LD (nn),HL (M:5 T:16 steps:13)
     989,  // 64: NEG (M:1 T:4 steps:1)
    1031,  // 65: RETI (M:3 T:10 steps:7)
    1140,  // 66: IM 0 (M:1 T:4 steps:1)
    1141,  // 67: RRD (M:4 T:14 steps:11)
    1152,  // 68: IN L,(C) (M:2 T:8 steps:5)
    1157,  // 69: OUT (C),L (M:2 T:8 steps:5)
    1162,  // 6A: ADC HL,HL (M:2 T:11 steps:8)
    1170,  // 6B: LD HL,(nn) (M:5 T:16 steps:13)
     989,  // 6C: NEG (M:1 T:4 steps:1)
    1031,  // 6D: RETI (M:3 T:10 steps:7)
    1183,  // 6E: IM 0 (M:1 T:4 steps:1)
    1184,  // 6F: RLD (M:4 T:14 steps:11)
    1195,  // 70: IN (C) (M:2 T:8 steps:5)
    1200,  // 71: OUT (C),0 (M:2 T:8 steps:5)
    1205,  // 72: SBC HL,SP (M:2 T:11 steps:8)
    1213,  // 73: LD (nn),SP (M:5 T:16 steps:13)
     989,  // 74: NEG (M:1 T:4 steps:1)
    1031,  // 75: RETI (M:3 T:10 steps:7)
    1226,  // 76: IM 1 (M:1 T:4 steps:1)
     957,  // 77: ED NOP (M:1 T:4 steps:1)
    1227,  // 78: IN A,(C) (M:2 T:8 steps:5)
    1232,  // 79: OUT (C),A (M:2 T:8 steps:5)
    1237,  // 7A: ADC HL,SP (M:2 T:11 steps:8)
    1245,  // 7B: LD SP,(nn) (M:5 T:16 steps:13)
     989,  // 7C: NEG (M:1 T:4 steps:1)
    1031,  // 7D: RETI (M:3 T:10 steps:7)
    1258,  // 7E: IM 2 (M:1 T:4 steps:1)
     957,  // 7F: ED NOP (M:1 T:4 steps:1)
     957,  // 80: ED NOP (M:1 T:4 steps:1)
     957,  // 81: ED NOP (M:1 T:4 steps:1)
     957,  // 82: ED NOP (M:1 T:4 steps:1)
     957,  // 83: ED NOP (M:1 T:4 steps:1)
     957,  // 84: ED NOP (M:1 T:4 steps:1)
     957,  // 85: ED NOP (M:1 T:4 steps:1)
     957,  // 86: ED NOP (M:1 T:4 steps:1)
     957,  // 87: ED NOP (M:1 T:4 steps:1)
     957,  // 88: ED NOP (M:1 T:4 steps:1)
     957,  // 89: ED NOP (M:1 T:4 steps:1)
     957,  // 8A: ED NOP (M:1 T:4 steps:1)
     957,  // 8B: ED NOP (M:1 T:4 steps:1)
     957,  // 8C: ED NOP (M:1 T:4 steps:1)
     957,  // 8D: ED NOP (M:1 T:4 steps:1)
     957,  // 8E: ED NOP (M:1 T:4 steps:1)
     957,  // 8F: ED NOP (M:1 T:4 steps:1)
     957,  // 90: ED NOP (M:1 T:4 steps:1)
     957,  // 91: ED NOP (M:1 T:4 steps:1)
     957,  // 92: ED NOP (M:1 T:4 steps:1)
     957,  // 93: ED NOP (M:1 T:4 steps:1)
     957,  // 94: ED NOP (M:1 T:4 steps:1)
     957,  // 95: ED NOP (M:1 T:4 steps:1)
     957,  // 96: ED NOP (M:1 T:4 steps:1)
     957,  // 97: ED NOP (M:1 T:4 steps:1)
     957,  // 98: ED NOP (M:1 T:4 steps:1)
     957,  // 99: ED NOP (M:1 T:4 steps:1)
     957,  // 9A: ED NOP (M:1 T:4 steps:1)
     957,  // 9B: ED NOP (M:1 T:4 steps:1)
     957,  // 9C: ED NOP (M:1 T:4 steps:1)
     957,  // 9D: ED NOP (M:1 T:4 steps:1)
     957,  // 9E: ED NOP (M:1 T:4 steps:1)
     957,  // 9F: ED NOP (M:1 T:4 steps:1)
    1259,  // A0: LDI (M:4 T:12 steps:9)
    1268,  // A1: CPI (M:3 T:12 steps:9)
    1277,  // A2: INI (M:4 T:12 steps:9)
    1286,  // A3: OUTI (M:4 T:12 steps:9)
     957,  // A4: ED NOP (M:1 T:4 steps:1)
     957,  // A5: ED NOP (M:1 T:4 steps:1)
     957,  // A6: ED NOP (M:1 T:4 steps:1)
     957,  // A7: ED NOP (M:1 T:4 steps:1)
    1295,  // A8: LDD (M:4 T:12 steps:9)
    1304,  // A9: CPD (M:3 T:12 steps:9)
    1313,  // AA: IND (M:4 T:12 steps:9)
    1322,  // AB: OUTD (M:4 T:12 steps:9)
     957,  // AC: ED NOP (M:1 T:4 steps:1)
     957,  // AD: ED NOP (M:1 T:4 steps:1)
     957,  // AE: ED NOP (M:1 T:4 steps:1)
     957,  // AF: ED NOP (M:1 T:4 steps:1)
    1331,  // B0: LDIR (M:5 T:17 steps:14)
    1345,  // B1: CPIR (M:4 T:17 steps:14)
    1359,  // B2: INIR (M:5 T:17 steps:14)
    1373,  // B3: OTIR (M:5 T:17 steps:14)
     957,  // B4: ED NOP (M:1 T:4 steps:1)
     957,  // B5: ED NOP (M:1 T:4 steps:1)
     957,  // B6: ED NOP (M:1 T:4 steps:1)
     957,  // B7: ED NOP (M:1 T:4 steps:1)
    1387,  // B8: LDDR (M:5 T:17 steps:14)
    1401,  // B9: CPDR (M:4 T:17 steps:14)
    1415,  // BA: INDR (M:5 T:17 steps:14)
    1429,  // BB: OTDR (M:5 T:17 steps:14)
     957,  // BC: ED NOP (M:1 T:4 steps:1)
     957,  // BD: ED NOP (M:1 T:4 steps:1)
     957,  // BE: ED NOP (M:1 T:4 steps:1)
     957,  // BF: ED NOP (M:1 T:4 steps:1)
     957,  // C0: ED NOP (M:1 T:4 steps:1)
     957,  // C1: ED NOP (M:1 T:4 steps:1)
     957,  // C2: ED NOP (M:1 T:4 steps:1)
     957,  // C3: ED NOP (M:1 T:4 steps:1)
     957,  // C4: ED NOP (M:1 T:4 steps:1)
     957,  // C5: ED NOP (M:1 T:4 steps:1)
     957,  // C6: ED NOP (M:1 T:4 steps:1)
     957,  // C7: ED NOP (M:1 T:4 steps:1)
     957,  // C8: ED NOP (M:1 T:4 steps:1)
     957,  // C9: ED NOP (M:1 T:4 steps:1)
     957,  // CA: ED NOP (M:1 T:4 steps:1)
     957,  // CB: ED NOP (M:1 T:4 steps:1)
     957,  // CC: ED NOP (M:1 T:4 steps:1)
     957,  // CD: ED NOP (M:1 T:4 steps:1)
     957,  // CE: ED NOP (M:1 T:4 steps:1)
     957,  // CF: ED NOP (M:1 T:4 steps:1)
     957,  // D0: ED NOP (M:1 T:4 steps:1)
     957,  // D1: ED NOP (M:1 T:4 steps:1)
     957,  // D2: ED NOP (M:1 T:4 steps:1)
     957,  // D3: ED NOP (M:1 T:4 steps:1)
     957,  // D4: ED NOP (M:1 T:4 steps:1)
     957,  // D5: ED NOP (M:1 T:4 steps:1)
     957,  // D6: ED NOP (M:1 T:4 steps:1)
     957,  // D7: ED NOP (M:1 T:4 steps:1)
     957,  // D8: ED NOP (M:1 T:4 steps:1)
     957,  // D9: ED NOP (M:1 T:4 steps:1)
     957,  // DA: ED NOP (M:1 T:4 steps:1)
     957,  // DB: ED NOP (M:1 T:4 steps:1)
     957,  // DC: ED NOP (M:1 T:4 steps:1)
     957,  // DD: ED NOP (M:1 T:4 steps:1)
     957,  // DE: ED NOP (M:1 T:4 steps:1)
     957,  // DF: ED NOP (M:1 T:4 steps:1)
     957,  // E0: ED NOP (M:1 T:4 steps:1)
     957,  // E1: ED NOP (M:1 T:4 steps:1)
     957,  // E2: ED NOP (M:1 T:4 steps:1)
     957,  // E3: ED NOP (M:1 T:4 steps:1)
     957,  // E4: ED NOP (M:1 T:4 steps:1)
     957,  // E5: ED NOP (M:1 T:4 steps:1)
     957,  // E6: ED NOP (M:1 T:4 steps:1)
     957,  // E7: ED NOP (M:1 T:4 steps:1)
     957,  // E8: ED NOP (M:1 T:4 steps:1)
     957,  // E9: ED NOP (M:1 T:4 steps:1)
     957,  // EA: ED NOP (M:1 T:4 steps:1)
     957,  // EB: ED NOP (M:1 T:4 steps:1)
     957,  // EC: ED NOP (M:1 T:4 steps:1)
     957,  // ED: ED NOP (M:1 T:4 steps:1)
     957,  // EE: ED NOP (M:1 T:4 steps:1)
     957,  // EF: ED NOP (M:1 T:4 steps:1)
     957,  // F0: ED NOP (M:1 T:4 steps:1)
     957,  // F1: ED NOP (M:1 T:4 steps:1)
     957,  // F2: ED NOP (M:1 T:4 steps:1)
     957,  // F3: ED NOP (M:1 T:4 steps:1)
     957,  // F4: ED NOP (M:1 T:4 steps:1)
     957,  // F5: ED NOP (M:1 T:4 steps:1)
     957,  // F6: ED NOP (M:1 T:4 steps:1)
     957,  // F7: ED NOP (M:1 T:4 steps:1)
     957,  // F8: ED NOP (M:1 T:4 steps:1)
     957,  // F9: ED NOP (M:1 T:4 steps:1)
     957,  // FA: ED NOP (M:1 T:4 steps:1)
     957,  // FB: ED NOP (M:1 T:4 steps:1)
     957,  // FC: ED NOP (M:1 T:4 steps:1)
     957,  // FD: ED NOP (M:1 T:4 steps:1)
     957,  // FE: ED NOP (M:1 T:4 steps:1)
     957,  // FF: ED NOP (M:1 T:4 steps:1)
 };

static const uint16_t _z80_special_optable[_Z80_OPSTATE_NUM_SPECIAL_OPS] = {
    1443,  // 00: cb (M:1 T:4 steps:1)
    1444,  // 01: cbhl (M:3 T:11 steps:8)
    1452,  // 02: ddfdcb (M:6 T:18 steps:15)
    1467,  // 03: int_im0 (M:6 T:9 steps:6)
    1473,  // 04: int_im1 (M:7 T:16 steps:13)
    1486,  // 05: int_im2 (M:9 T:22 steps:19)
    1505,  // 06: nmi (M:5 T:14 steps:11)
 };

// initiate refresh cycle
static inline uint64_t _z80_refresh(z80_t* cpu, uint64_t pins) {
    pins = _z80_set_ab_x(pins, cpu->ir, Z80_MREQ|Z80_RFSH);
    cpu->r = (cpu->r & 0x80) | ((cpu->r + 1) & 0x7F);
    return pins;
}

// initiate a fetch machine cycle for regular (non-prefixed) instructions, or initiate interrupt handling
static inline uint64_t _z80_fetch(z80_t* cpu, uint64_t pins) {
    cpu->hlx_idx = 0;
    cpu->prefix_active = false;
    // shortcut no interrupts requested
    if (cpu->int_bits == 0) {
        cpu->step = 0xFFFF;
        return _z80_set_ab_x(pins, cpu->pc++, Z80_M1|Z80_MREQ|Z80_RD);
    }
    else if (cpu->int_bits & Z80_NMI) {
        // non-maskable interrupt starts with a regular M1 machine cycle
        cpu->step = _z80_special_optable[_Z80_OPSTATE_SLOT_NMI];
        cpu->int_bits = 0;
        if (pins & Z80_HALT) {
            pins &= ~Z80_HALT;
            cpu->pc++;
        }
        // NOTE: PC is *not* incremented!
        return _z80_set_ab_x(pins, cpu->pc, Z80_M1|Z80_MREQ|Z80_RD);
    }
    else if (cpu->int_bits & Z80_INT) {
        if (cpu->iff1) {
            // maskable interrupts start with a special M1 machine cycle which
            // doesn't fetch the next opcode, but instead activate the
            // pins M1|IOQR to request a special byte which is handled differently
            // depending on interrupt mode
            cpu->step = _z80_special_optable[_Z80_OPSTATE_SLOT_INT_IM0 + cpu->im];
            cpu->int_bits = 0;
            if (pins & Z80_HALT) {
                pins &= ~Z80_HALT;
                cpu->pc++;
            }
            // NOTE: PC is not incremented, and no pins are activated here
            return pins;
        }
        else {
            // oops, maskable interrupt requested but disabled
            cpu->step = 0xFFFF;
            return _z80_set_ab_x(pins, cpu->pc++, Z80_M1|Z80_MREQ|Z80_RD);
        }
    }
    else {
        _Z80_UNREACHABLE;
        return pins;
    }
}

static inline uint64_t _z80_fetch_cb(z80_t* cpu, uint64_t pins) {
    cpu->prefix_active = true;
    if (cpu->hlx_idx > 0) {
        // this is a DD+CB / FD+CB instruction, continue
        // execution on the special DDCB/FDCB decoder block which
        // loads the d-offset first and then the opcode in a
        // regular memory read machine cycle
        cpu->step = _z80_special_optable[_Z80_OPSTATE_SLOT_DDFDCB];
    }
    else {
        // this is a regular CB-prefixed instruction, continue
        // execution on a special fetch machine cycle which doesn't
        // handle DD/FD prefix and then branches either to the
        // special CB or CBHL decoder block
        cpu->step = 21; // => step 22: opcode fetch for CB prefixed instructions
        pins = _z80_set_ab_x(pins, cpu->pc++, Z80_M1|Z80_MREQ|Z80_RD);
    }
    return pins;
}

static inline uint64_t _z80_fetch_dd(z80_t* cpu, uint64_t pins) {
    cpu->step = 2;   // => step 3: opcode fetch for DD/FD prefixed instructions
    cpu->hlx_idx = 1;
    cpu->prefix_active = true;
    return _z80_set_ab_x(pins, cpu->pc++, Z80_M1|Z80_MREQ|Z80_RD);
}

static inline uint64_t _z80_fetch_fd(z80_t* cpu, uint64_t pins) {
    cpu->step = 2;   // => step 3: opcode fetch for DD/FD prefixed instructions
    cpu->hlx_idx = 2;
    cpu->prefix_active = true;
    return _z80_set_ab_x(pins, cpu->pc++, Z80_M1|Z80_MREQ|Z80_RD);
}

static inline uint64_t _z80_fetch_ed(z80_t* cpu, uint64_t pins) {
    cpu->step = 24; // => step 25: opcode fetch for ED prefixed instructions
    cpu->hlx_idx = 0;
    cpu->prefix_active = true;
    return _z80_set_ab_x(pins, cpu->pc++, Z80_M1|Z80_MREQ|Z80_RD);
}

uint64_t z80_prefetch(z80_t* cpu, uint16_t new_pc) {
    cpu->pc = new_pc;
    // overlapped M1:T1 of the NOP instruction to initiate opcode fetch at new pc
    cpu->step = _z80_optable[0] + 1;
    return 0;
}

// pin helper macros
#define _sa(ab)             pins=_z80_set_ab(pins,ab)
#define _sax(ab,x)          pins=_z80_set_ab_x(pins,ab,x)
#define _sad(ab,d)          pins=_z80_set_ab_db(pins,ab,d)
#define _sadx(ab,d,x)       pins=_z80_set_ab_db_x(pins,ab,d,x)
#define _gd()               _z80_get_db(pins)

// high level helper macros
#define _skip(n)        cpu->step+=(n);
#define _fetch_dd()     pins=_z80_fetch_dd(cpu,pins);
#define _fetch_fd()     pins=_z80_fetch_fd(cpu,pins);
#define _fetch_ed()     pins=_z80_fetch_ed(cpu,pins);
#define _fetch_cb()     pins=_z80_fetch_cb(cpu,pins);
#define _mread(ab)      _sax(ab,Z80_MREQ|Z80_RD)
#define _mwrite(ab,d)   _sadx(ab,d,Z80_MREQ|Z80_WR)
#define _ioread(ab)     _sax(ab,Z80_IORQ|Z80_RD)
#define _iowrite(ab,d)  _sadx(ab,d,Z80_IORQ|Z80_WR)
#define _wait()         {if(pins&Z80_WAIT)goto track_int_bits;}
#define _cc_nz          (!(cpu->f&Z80_ZF))
#define _cc_z           (cpu->f&Z80_ZF)
#define _cc_nc          (!(cpu->f&Z80_CF))
#define _cc_c           (cpu->f&Z80_CF)
#define _cc_po          (!(cpu->f&Z80_PF))
#define _cc_pe          (cpu->f&Z80_PF)
#define _cc_p           (!(cpu->f&Z80_SF))
#define _cc_m           (cpu->f&Z80_SF)

uint64_t z80_tick(z80_t* cpu, uint64_t pins) {
    pins &= ~(Z80_CTRL_PIN_MASK|Z80_RETI);
    switch (cpu->step) {
        //=== shared fetch machine cycle for non-DD/FD-prefixed ops
        // M1/T2: load opcode from data bus
        case 0: _wait(); cpu->opcode = _gd(); goto step_next;
        // M1/T3: refresh cycle
        case 1: pins = _z80_refresh(cpu, pins); goto step_next;
        // M1/T4: branch to instruction 'payload'
        case 2: {
            cpu->step = _z80_optable[cpu->opcode];
            // preload effective address for (HL) ops
            cpu->addr = cpu->hl;
        } goto step_next;
        //=== shared fetch machine cycle for DD/FD-prefixed ops
        // M1/T2: load opcode from data bus
        case 3: _wait(); cpu->opcode = _gd(); goto step_next;
        // M1/T3: refresh cycle
        case 4: pins = _z80_refresh(cpu, pins); goto step_next;
        // M1/T4: branch to instruction 'payload'
        case 5: {
            cpu->step = _z80_ddfd_optable[cpu->opcode];
            cpu->addr = cpu->hlx[cpu->hlx_idx].hl;
        } goto step_next;
        //=== optional d-loading cycle for (IX+d), (IY+d)
        //--- mread
        case 6: goto step_next;
        case 7: _wait();_mread(cpu->pc++); goto step_next;
        case 8: cpu->addr += (int8_t)_gd(); cpu->wz = cpu->addr; goto step_next;
        //--- filler ticks
        case 9: goto step_next;
        case 10: goto step_next;
        case 11: goto step_next;
        case 12: goto step_next;
        case 13: {
            // branch to actual instruction
            cpu->step = _z80_optable[cpu->opcode];
        } goto step_next;
        //=== special case d-loading cycle for (IX+d),n where the immediate load
        //    is hidden in the d-cycle load
        //--- mread for d offset
        case 14: goto step_next;
        case 15: _wait();_mread(cpu->pc++); goto step_next;
        case 16: cpu->addr += (int8_t)_gd(); cpu->wz = cpu->addr; goto step_next;
        //--- mread for n
        case 17: goto step_next;
        case 18: _wait();_mread(cpu->pc++); goto step_next;
        case 19: cpu->dlatch=_gd(); goto step_next;
        //--- filler tick
        case 20: goto step_next;
        case 21: {
            // branch to ld (hl),n and skip the original mread cycle for loading 'n'
            cpu->step = _z80_optable[cpu->opcode] + 3;
        } goto step_next;
        //=== special opcode fetch machine cycle for CB-prefixed instructions
        case 22: _wait(); cpu->opcode = _gd(); goto step_next;
        case 23: pins = _z80_refresh(cpu, pins); goto step_next;
        case 24: {
            if ((cpu->opcode & 7) == 6) {
                // this is a (HL) instruction
                cpu->addr = cpu->hl;
                cpu->step = _z80_special_optable[_Z80_OPSTATE_SLOT_CBHL];
            }
            else {
                cpu->step = _z80_special_optable[_Z80_OPSTATE_SLOT_CB];
            }
        } goto step_next;
        //=== special opcode fetch machine cycle for ED-prefixed instructions
        // M1/T2: load opcode from data bus
        case 25: _wait(); cpu->opcode = _gd(); goto step_next;
        // M1/T3: refresh cycle
        case 26: pins = _z80_refresh(cpu, pins); goto step_next;
        // M1/T4: branch to instruction 'payload'
        case 27: cpu->step = _z80_ed_optable[cpu->opcode]; goto step_next;
        //=== from here on code-generated
        
        //  00: NOP (M:1 T:4)
        // -- overlapped
        case   28: goto fetch_next;
        
        //  01: LD BC,nn (M:3 T:10)
        // -- mread
        case   29: goto step_next;
        case   30: _wait();_mread(cpu->pc++);goto step_next;
        case   31: cpu->c=_gd();goto step_next;
        // -- mread
        case   32: goto step_next;
        case   33: _wait();_mread(cpu->pc++);goto step_next;
        case   34: cpu->b=_gd();goto step_next;
        // -- overlapped
        case   35: goto fetch_next;
        
        //  02: LD (BC),A (M:2 T:7)
        // -- mwrite
        case   36: goto step_next;
        case   37: _wait();_mwrite(cpu->bc,cpu->a);cpu->wzl=cpu->c+1;cpu->wzh=cpu->a;goto step_next;
        case   38: goto step_next;
        // -- overlapped
        case   39: goto fetch_next;
        
        //  03: INC BC (M:2 T:6)
        // -- generic
        case   40: cpu->bc++;goto step_next;
        case   41: goto step_next;
        // -- overlapped
        case   42: goto fetch_next;
        
        //  04: INC B (M:1 T:4)
        // -- overlapped
        case   43: cpu->b=_z80_inc8(cpu,cpu->b);goto fetch_next;
        
        //  05: DEC B (M:1 T:4)
        // -- overlapped
        case   44: cpu->b=_z80_dec8(cpu,cpu->b);goto fetch_next;
        
        //  06: LD B,n (M:2 T:7)
        // -- mread
        case   45: goto step_next;
        case   46: _wait();_mread(cpu->pc++);goto step_next;
        case   47: cpu->b=_gd();goto step_next;
        // -- overlapped
        case   48: goto fetch_next;
        
        //  07: RLCA (M:1 T:4)
        // -- overlapped
        case   49: _z80_rlca(cpu);goto fetch_next;
        
        //  08: EX AF,AF' (M:1 T:4)
        // -- overlapped
        case   50: _z80_ex_af_af2(cpu);goto fetch_next;
        
        //  09: ADD HL,BC (M:2 T:11)
        // -- generic
        case   51: _z80_add16(cpu,cpu->bc);goto step_next;
        case   52: goto step_next;
        case   53: goto step_next;
        case   54: goto step_next;
        case   55: goto step_next;
        case   56: goto step_next;
        case   57: goto step_next;
        // -- overlapped
        case   58: goto fetch_next;
        
        //  0A: LD A,(BC) (M:2 T:7)
        // -- mread
        case   59: goto step_next;
        case   60: _wait();_mread(cpu->bc);goto step_next;
        case   61: cpu->a=_gd();cpu->wz=cpu->bc+1;goto step_next;
        // -- overlapped
        case   62: goto fetch_next;
        
        //  0B: DEC BC (M:2 T:6)
        // -- generic
        case   63: cpu->bc--;goto step_next;
        case   64: goto step_next;
        // -- overlapped
        case   65: goto fetch_next;
        
        //  0C: INC C (M:1 T:4)
        // -- overlapped
        case   66: cpu->c=_z80_inc8(cpu,cpu->c);goto fetch_next;
        
        //  0D: DEC C (M:1 T:4)
        // -- overlapped
        case   67: cpu->c=_z80_dec8(cpu,cpu->c);goto fetch_next;
        
        //  0E: LD C,n (M:2 T:7)
        // -- mread
        case   68: goto step_next;
        case   69: _wait();_mread(cpu->pc++);goto step_next;
        case   70: cpu->c=_gd();goto step_next;
        // -- overlapped
        case   71: goto fetch_next;
        
        //  0F: RRCA (M:1 T:4)
        // -- overlapped
        case   72: _z80_rrca(cpu);goto fetch_next;
        
        //  10: DJNZ d (M:4 T:13)
        // -- generic
        case   73: goto step_next;
        // -- mread
        case   74: goto step_next;
        case   75: _wait();_mread(cpu->pc++);goto step_next;
        case   76: cpu->dlatch=_gd();if(--cpu->b==0){_skip(5);};goto step_next;
        // -- generic
        case   77: cpu->pc+=(int8_t)cpu->dlatch;cpu->wz=cpu->pc;goto step_next;
        case   78: goto step_next;
        case   79: goto step_next;
        case   80: goto step_next;
        case   81: goto step_next;
        // -- overlapped
        case   82: goto fetch_next;
        
        //  11: LD DE,nn (M:3 T:10)
        // -- mread
        case   83: goto step_next;
        case   84: _wait();_mread(cpu->pc++);goto step_next;
        case   85: cpu->e=_gd();goto step_next;
        // -- mread
        case   86: goto step_next;
        case   87: _wait();_mread(cpu->pc++);goto step_next;
        case   88: cpu->d=_gd();goto step_next;
        // -- overlapped
        case   89: goto fetch_next;
        
        //  12: LD (DE),A (M:2 T:7)
        // -- mwrite
        case   90: goto step_next;
        case   91: _wait();_mwrite(cpu->de,cpu->a);cpu->wzl=cpu->e+1;cpu->wzh=cpu->a;goto step_next;
        case   92: goto step_next;
        // -- overlapped
        case   93: goto fetch_next;
        
        //  13: INC DE (M:2 T:6)
        // -- generic
        case   94: cpu->de++;goto step_next;
        case   95: goto step_next;
        // -- overlapped
        case   96: goto fetch_next;
        
        //  14: INC D (M:1 T:4)
        // -- overlapped
        case   97: cpu->d=_z80_inc8(cpu,cpu->d);goto fetch_next;
        
        //  15: DEC D (M:1 T:4)
        // -- overlapped
        case   98: cpu->d=_z80_dec8(cpu,cpu->d);goto fetch_next;
        
        //  16: LD D,n (M:2 T:7)
        // -- mread
        case   99: goto step_next;
        case  100: _wait();_mread(cpu->pc++);goto step_next;
        case  101: cpu->d=_gd();goto step_next;
        // -- overlapped
        case  102: goto fetch_next;
        
        //  17: RLA (M:1 T:4)
        // -- overlapped
        case  103: _z80_rla(cpu);goto fetch_next;
        
        //  18: JR d (M:3 T:12)
        // -- mread
        case  104: goto step_next;
        case  105: _wait();_mread(cpu->pc++);goto step_next;
        case  106: cpu->dlatch=_gd();goto step_next;
        // -- generic
        case  107: cpu->pc+=(int8_t)cpu->dlatch;cpu->wz=cpu->pc;goto step_next;
        case  108: goto step_next;
        case  109: goto step_next;
        case  110: goto step_next;
        case  111: goto step_next;
        // -- overlapped
        case  112: goto fetch_next;
        
        //  19: ADD HL,DE (M:2 T:11)
        // -- generic
        case  113: _z80_add16(cpu,cpu->de);goto step_next;
        case  114: goto step_next;
        case  115: goto step_next;
        case  116: goto step_next;
        case  117: goto step_next;
        case  118: goto step_next;
        case  119: goto step_next;
        // -- overlapped
        case  120: goto fetch_next;
        
        //  1A: LD A,(DE) (M:2 T:7)
        // -- mread
        case  121: goto step_next;
        case  122: _wait();_mread(cpu->de);goto step_next;
        case  123: cpu->a=_gd();cpu->wz=cpu->de+1;goto step_next;
        // -- overlapped
        case  124: goto fetch_next;
        
        //  1B: DEC DE (M:2 T:6)
        // -- generic
        case  125: cpu->de--;goto step_next;
        case  126: goto step_next;
        // -- overlapped
        case  127: goto fetch_next;
        
        //  1C: INC E (M:1 T:4)
        // -- overlapped
        case  128: cpu->e=_z80_inc8(cpu,cpu->e);goto fetch_next;
        
        //  1D: DEC E (M:1 T:4)
        // -- overlapped
        case  129: cpu->e=_z80_dec8(cpu,cpu->e);goto fetch_next;
        
        //  1E: LD E,n (M:2 T:7)
        // -- mread
        case  130: goto step_next;
        case  131: _wait();_mread(cpu->pc++);goto step_next;
        case  132: cpu->e=_gd();goto step_next;
        // -- overlapped
        case  133: goto fetch_next;
        
        //  1F: RRA (M:1 T:4)
        // -- overlapped
        case  134: _z80_rra(cpu);goto fetch_next;
        
        //  20: JR NZ,d (M:3 T:12)
        // -- mread
        case  135: goto step_next;
        case  136: _wait();_mread(cpu->pc++);goto step_next;
        case  137: cpu->dlatch=_gd();if(!(_cc_nz)){_skip(5);};goto step_next;
        // -- generic
        case  138: cpu->pc+=(int8_t)cpu->dlatch;cpu->wz=cpu->pc;goto step_next;
        case  139: goto step_next;
        case  140: goto step_next;
        case  141: goto step_next;
        case  142: goto step_next;
        // -- overlapped
        case  143: goto fetch_next;
        
        //  21: LD HL,nn (M:3 T:10)
        // -- mread
        case  144: goto step_next;
        case  145: _wait();_mread(cpu->pc++);goto step_next;
        case  146: cpu->hlx[cpu->hlx_idx].l=_gd();goto step_next;
        // -- mread
        case  147: goto step_next;
        case  148: _wait();_mread(cpu->pc++);goto step_next;
        case  149: cpu->hlx[cpu->hlx_idx].h=_gd();goto step_next;
        // -- overlapped
        case  150: goto fetch_next;
        
        //  22: LD (nn),HL (M:5 T:16)
        // -- mread
        case  151: goto step_next;
        case  152: _wait();_mread(cpu->pc++);goto step_next;
        case  153: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  154: goto step_next;
        case  155: _wait();_mread(cpu->pc++);goto step_next;
        case  156: cpu->wzh=_gd();goto step_next;
        // -- mwrite
        case  157: goto step_next;
        case  158: _wait();_mwrite(cpu->wz++,cpu->hlx[cpu->hlx_idx].l);goto step_next;
        case  159: goto step_next;
        // -- mwrite
        case  160: goto step_next;
        case  161: _wait();_mwrite(cpu->wz,cpu->hlx[cpu->hlx_idx].h);goto step_next;
        case  162: goto step_next;
        // -- overlapped
        case  163: goto fetch_next;
        
        //  23: INC HL (M:2 T:6)
        // -- generic
        case  164: cpu->hlx[cpu->hlx_idx].hl++;goto step_next;
        case  165: goto step_next;
        // -- overlapped
        case  166: goto fetch_next;
        
        //  24: INC H (M:1 T:4)
        // -- overlapped
        case  167: cpu->hlx[cpu->hlx_idx].h=_z80_inc8(cpu,cpu->hlx[cpu->hlx_idx].h);goto fetch_next;
        
        //  25: DEC H (M:1 T:4)
        // -- overlapped
        case  168: cpu->hlx[cpu->hlx_idx].h=_z80_dec8(cpu,cpu->hlx[cpu->hlx_idx].h);goto fetch_next;
        
        //  26: LD H,n (M:2 T:7)
        // -- mread
        case  169: goto step_next;
        case  170: _wait();_mread(cpu->pc++);goto step_next;
        case  171: cpu->hlx[cpu->hlx_idx].h=_gd();goto step_next;
        // -- overlapped
        case  172: goto fetch_next;
        
        //  27: DAA (M:1 T:4)
        // -- overlapped
        case  173: _z80_daa(cpu);goto fetch_next;
        
        //  28: JR Z,d (M:3 T:12)
        // -- mread
        case  174: goto step_next;
        case  175: _wait();_mread(cpu->pc++);goto step_next;
        case  176: cpu->dlatch=_gd();if(!(_cc_z)){_skip(5);};goto step_next;
        // -- generic
        case  177: cpu->pc+=(int8_t)cpu->dlatch;cpu->wz=cpu->pc;goto step_next;
        case  178: goto step_next;
        case  179: goto step_next;
        case  180: goto step_next;
        case  181: goto step_next;
        // -- overlapped
        case  182: goto fetch_next;
        
        //  29: ADD HL,HL (M:2 T:11)
        // -- generic
        case  183: _z80_add16(cpu,cpu->hlx[cpu->hlx_idx].hl);goto step_next;
        case  184: goto step_next;
        case  185: goto step_next;
        case  186: goto step_next;
        case  187: goto step_next;
        case  188: goto step_next;
        case  189: goto step_next;
        // -- overlapped
        case  190: goto fetch_next;
        
        //  2A: LD HL,(nn) (M:5 T:16)
        // -- mread
        case  191: goto step_next;
        case  192: _wait();_mread(cpu->pc++);goto step_next;
        case  193: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  194: goto step_next;
        case  195: _wait();_mread(cpu->pc++);goto step_next;
        case  196: cpu->wzh=_gd();goto step_next;
        // -- mread
        case  197: goto step_next;
        case  198: _wait();_mread(cpu->wz++);goto step_next;
        case  199: cpu->hlx[cpu->hlx_idx].l=_gd();goto step_next;
        // -- mread
        case  200: goto step_next;
        case  201: _wait();_mread(cpu->wz);goto step_next;
        case  202: cpu->hlx[cpu->hlx_idx].h=_gd();goto step_next;
        // -- overlapped
        case  203: goto fetch_next;
        
        //  2B: DEC HL (M:2 T:6)
        // -- generic
        case  204: cpu->hlx[cpu->hlx_idx].hl--;goto step_next;
        case  205: goto step_next;
        // -- overlapped
        case  206: goto fetch_next;
        
        //  2C: INC L (M:1 T:4)
        // -- overlapped
        case  207: cpu->hlx[cpu->hlx_idx].l=_z80_inc8(cpu,cpu->hlx[cpu->hlx_idx].l);goto fetch_next;
        
        //  2D: DEC L (M:1 T:4)
        // -- overlapped
        case  208: cpu->hlx[cpu->hlx_idx].l=_z80_dec8(cpu,cpu->hlx[cpu->hlx_idx].l);goto fetch_next;
        
        //  2E: LD L,n (M:2 T:7)
        // -- mread
        case  209: goto step_next;
        case  210: _wait();_mread(cpu->pc++);goto step_next;
        case  211: cpu->hlx[cpu->hlx_idx].l=_gd();goto step_next;
        // -- overlapped
        case  212: goto fetch_next;
        
        //  2F: CPL (M:1 T:4)
        // -- overlapped
        case  213: _z80_cpl(cpu);goto fetch_next;
        
        //  30: JR NC,d (M:3 T:12)
        // -- mread
        case  214: goto step_next;
        case  215: _wait();_mread(cpu->pc++);goto step_next;
        case  216: cpu->dlatch=_gd();if(!(_cc_nc)){_skip(5);};goto step_next;
        // -- generic
        case  217: cpu->pc+=(int8_t)cpu->dlatch;cpu->wz=cpu->pc;goto step_next;
        case  218: goto step_next;
        case  219: goto step_next;
        case  220: goto step_next;
        case  221: goto step_next;
        // -- overlapped
        case  222: goto fetch_next;
        
        //  31: LD SP,nn (M:3 T:10)
        // -- mread
        case  223: goto step_next;
        case  224: _wait();_mread(cpu->pc++);goto step_next;
        case  225: cpu->spl=_gd();goto step_next;
        // -- mread
        case  226: goto step_next;
        case  227: _wait();_mread(cpu->pc++);goto step_next;
        case  228: cpu->sph=_gd();goto step_next;
        // -- overlapped
        case  229: goto fetch_next;
        
        //  32: LD (nn),A (M:4 T:13)
        // -- mread
        case  230: goto step_next;
        case  231: _wait();_mread(cpu->pc++);goto step_next;
        case  232: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  233: goto step_next;
        case  234: _wait();_mread(cpu->pc++);goto step_next;
        case  235: cpu->wzh=_gd();goto step_next;
        // -- mwrite
        case  236: goto step_next;
        case  237: _wait();_mwrite(cpu->wz++,cpu->a);cpu->wzh=cpu->a;goto step_next;
        case  238: goto step_next;
        // -- overlapped
        case  239: goto fetch_next;
        
        //  33: INC SP (M:2 T:6)
        // -- generic
        case  240: cpu->sp++;goto step_next;
        case  241: goto step_next;
        // -- overlapped
        case  242: goto fetch_next;
        
        //  34: INC (HL) (M:3 T:11)
        // -- mread
        case  243: goto step_next;
        case  244: _wait();_mread(cpu->addr);goto step_next;
        case  245: cpu->dlatch=_gd();cpu->dlatch=_z80_inc8(cpu,cpu->dlatch);goto step_next;
        case  246: goto step_next;
        // -- mwrite
        case  247: goto step_next;
        case  248: _wait();_mwrite(cpu->addr,cpu->dlatch);goto step_next;
        case  249: goto step_next;
        // -- overlapped
        case  250: goto fetch_next;
        
        //  35: DEC (HL) (M:3 T:11)
        // -- mread
        case  251: goto step_next;
        case  252: _wait();_mread(cpu->addr);goto step_next;
        case  253: cpu->dlatch=_gd();cpu->dlatch=_z80_dec8(cpu,cpu->dlatch);goto step_next;
        case  254: goto step_next;
        // -- mwrite
        case  255: goto step_next;
        case  256: _wait();_mwrite(cpu->addr,cpu->dlatch);goto step_next;
        case  257: goto step_next;
        // -- overlapped
        case  258: goto fetch_next;
        
        //  36: LD (HL),n (M:3 T:10)
        // -- mread
        case  259: goto step_next;
        case  260: _wait();_mread(cpu->pc++);goto step_next;
        case  261: cpu->dlatch=_gd();goto step_next;
        // -- mwrite
        case  262: goto step_next;
        case  263: _wait();_mwrite(cpu->addr,cpu->dlatch);goto step_next;
        case  264: goto step_next;
        // -- overlapped
        case  265: goto fetch_next;
        
        //  37: SCF (M:1 T:4)
        // -- overlapped
        case  266: _z80_scf(cpu);goto fetch_next;
        
        //  38: JR C,d (M:3 T:12)
        // -- mread
        case  267: goto step_next;
        case  268: _wait();_mread(cpu->pc++);goto step_next;
        case  269: cpu->dlatch=_gd();if(!(_cc_c)){_skip(5);};goto step_next;
        // -- generic
        case  270: cpu->pc+=(int8_t)cpu->dlatch;cpu->wz=cpu->pc;goto step_next;
        case  271: goto step_next;
        case  272: goto step_next;
        case  273: goto step_next;
        case  274: goto step_next;
        // -- overlapped
        case  275: goto fetch_next;
        
        //  39: ADD HL,SP (M:2 T:11)
        // -- generic
        case  276: _z80_add16(cpu,cpu->sp);goto step_next;
        case  277: goto step_next;
        case  278: goto step_next;
        case  279: goto step_next;
        case  280: goto step_next;
        case  281: goto step_next;
        case  282: goto step_next;
        // -- overlapped
        case  283: goto fetch_next;
        
        //  3A: LD A,(nn) (M:4 T:13)
        // -- mread
        case  284: goto step_next;
        case  285: _wait();_mread(cpu->pc++);goto step_next;
        case  286: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  287: goto step_next;
        case  288: _wait();_mread(cpu->pc++);goto step_next;
        case  289: cpu->wzh=_gd();goto step_next;
        // -- mread
        case  290: goto step_next;
        case  291: _wait();_mread(cpu->wz++);goto step_next;
        case  292: cpu->a=_gd();goto step_next;
        // -- overlapped
        case  293: goto fetch_next;
        
        //  3B: DEC SP (M:2 T:6)
        // -- generic
        case  294: cpu->sp--;goto step_next;
        case  295: goto step_next;
        // -- overlapped
        case  296: goto fetch_next;
        
        //  3C: INC A (M:1 T:4)
        // -- overlapped
        case  297: cpu->a=_z80_inc8(cpu,cpu->a);goto fetch_next;
        
        //  3D: DEC A (M:1 T:4)
        // -- overlapped
        case  298: cpu->a=_z80_dec8(cpu,cpu->a);goto fetch_next;
        
        //  3E: LD A,n (M:2 T:7)
        // -- mread
        case  299: goto step_next;
        case  300: _wait();_mread(cpu->pc++);goto step_next;
        case  301: cpu->a=_gd();goto step_next;
        // -- overlapped
        case  302: goto fetch_next;
        
        //  3F: CCF (M:1 T:4)
        // -- overlapped
        case  303: _z80_ccf(cpu);goto fetch_next;
        
        //  40: LD B,B (M:1 T:4)
        // -- overlapped
        case  304: cpu->b=cpu->b;goto fetch_next;
        
        //  41: LD B,C (M:1 T:4)
        // -- overlapped
        case  305: cpu->b=cpu->c;goto fetch_next;
        
        //  42: LD B,D (M:1 T:4)
        // -- overlapped
        case  306: cpu->b=cpu->d;goto fetch_next;
        
        //  43: LD B,E (M:1 T:4)
        // -- overlapped
        case  307: cpu->b=cpu->e;goto fetch_next;
        
        //  44: LD B,H (M:1 T:4)
        // -- overlapped
        case  308: cpu->b=cpu->hlx[cpu->hlx_idx].h;goto fetch_next;
        
        //  45: LD B,L (M:1 T:4)
        // -- overlapped
        case  309: cpu->b=cpu->hlx[cpu->hlx_idx].l;goto fetch_next;
        
        //  46: LD B,(HL) (M:2 T:7)
        // -- mread
        case  310: goto step_next;
        case  311: _wait();_mread(cpu->addr);goto step_next;
        case  312: cpu->b=_gd();goto step_next;
        // -- overlapped
        case  313: goto fetch_next;
        
        //  47: LD B,A (M:1 T:4)
        // -- overlapped
        case  314: cpu->b=cpu->a;goto fetch_next;
        
        //  48: LD C,B (M:1 T:4)
        // -- overlapped
        case  315: cpu->c=cpu->b;goto fetch_next;
        
        //  49: LD C,C (M:1 T:4)
        // -- overlapped
        case  316: cpu->c=cpu->c;goto fetch_next;
        
        //  4A: LD C,D (M:1 T:4)
        // -- overlapped
        case  317: cpu->c=cpu->d;goto fetch_next;
        
        //  4B: LD C,E (M:1 T:4)
        // -- overlapped
        case  318: cpu->c=cpu->e;goto fetch_next;
        
        //  4C: LD C,H (M:1 T:4)
        // -- overlapped
        case  319: cpu->c=cpu->hlx[cpu->hlx_idx].h;goto fetch_next;
        
        //  4D: LD C,L (M:1 T:4)
        // -- overlapped
        case  320: cpu->c=cpu->hlx[cpu->hlx_idx].l;goto fetch_next;
        
        //  4E: LD C,(HL) (M:2 T:7)
        // -- mread
        case  321: goto step_next;
        case  322: _wait();_mread(cpu->addr);goto step_next;
        case  323: cpu->c=_gd();goto step_next;
        // -- overlapped
        case  324: goto fetch_next;
        
        //  4F: LD C,A (M:1 T:4)
        // -- overlapped
        case  325: cpu->c=cpu->a;goto fetch_next;
        
        //  50: LD D,B (M:1 T:4)
        // -- overlapped
        case  326: cpu->d=cpu->b;goto fetch_next;
        
        //  51: LD D,C (M:1 T:4)
        // -- overlapped
        case  327: cpu->d=cpu->c;goto fetch_next;
        
        //  52: LD D,D (M:1 T:4)
        // -- overlapped
        case  328: cpu->d=cpu->d;goto fetch_next;
        
        //  53: LD D,E (M:1 T:4)
        // -- overlapped
        case  329: cpu->d=cpu->e;goto fetch_next;
        
        //  54: LD D,H (M:1 T:4)
        // -- overlapped
        case  330: cpu->d=cpu->hlx[cpu->hlx_idx].h;goto fetch_next;
        
        //  55: LD D,L (M:1 T:4)
        // -- overlapped
        case  331: cpu->d=cpu->hlx[cpu->hlx_idx].l;goto fetch_next;
        
        //  56: LD D,(HL) (M:2 T:7)
        // -- mread
        case  332: goto step_next;
        case  333: _wait();_mread(cpu->addr);goto step_next;
        case  334: cpu->d=_gd();goto step_next;
        // -- overlapped
        case  335: goto fetch_next;
        
        //  57: LD D,A (M:1 T:4)
        // -- overlapped
        case  336: cpu->d=cpu->a;goto fetch_next;
        
        //  58: LD E,B (M:1 T:4)
        // -- overlapped
        case  337: cpu->e=cpu->b;goto fetch_next;
        
        //  59: LD E,C (M:1 T:4)
        // -- overlapped
        case  338: cpu->e=cpu->c;goto fetch_next;
        
        //  5A: LD E,D (M:1 T:4)
        // -- overlapped
        case  339: cpu->e=cpu->d;goto fetch_next;
        
        //  5B: LD E,E (M:1 T:4)
        // -- overlapped
        case  340: cpu->e=cpu->e;goto fetch_next;
        
        //  5C: LD E,H (M:1 T:4)
        // -- overlapped
        case  341: cpu->e=cpu->hlx[cpu->hlx_idx].h;goto fetch_next;
        
        //  5D: LD E,L (M:1 T:4)
        // -- overlapped
        case  342: cpu->e=cpu->hlx[cpu->hlx_idx].l;goto fetch_next;
        
        //  5E: LD E,(HL) (M:2 T:7)
        // -- mread
        case  343: goto step_next;
        case  344: _wait();_mread(cpu->addr);goto step_next;
        case  345: cpu->e=_gd();goto step_next;
        // -- overlapped
        case  346: goto fetch_next;
        
        //  5F: LD E,A (M:1 T:4)
        // -- overlapped
        case  347: cpu->e=cpu->a;goto fetch_next;
        
        //  60: LD H,B (M:1 T:4)
        // -- overlapped
        case  348: cpu->hlx[cpu->hlx_idx].h=cpu->b;goto fetch_next;
        
        //  61: LD H,C (M:1 T:4)
        // -- overlapped
        case  349: cpu->hlx[cpu->hlx_idx].h=cpu->c;goto fetch_next;
        
        //  62: LD H,D (M:1 T:4)
        // -- overlapped
        case  350: cpu->hlx[cpu->hlx_idx].h=cpu->d;goto fetch_next;
        
        //  63: LD H,E (M:1 T:4)
        // -- overlapped
        case  351: cpu->hlx[cpu->hlx_idx].h=cpu->e;goto fetch_next;
        
        //  64: LD H,H (M:1 T:4)
        // -- overlapped
        case  352: cpu->hlx[cpu->hlx_idx].h=cpu->hlx[cpu->hlx_idx].h;goto fetch_next;
        
        //  65: LD H,L (M:1 T:4)
        // -- overlapped
        case  353: cpu->hlx[cpu->hlx_idx].h=cpu->hlx[cpu->hlx_idx].l;goto fetch_next;
        
        //  66: LD H,(HL) (M:2 T:7)
        // -- mread
        case  354: goto step_next;
        case  355: _wait();_mread(cpu->addr);goto step_next;
        case  356: cpu->h=_gd();goto step_next;
        // -- overlapped
        case  357: goto fetch_next;
        
        //  67: LD H,A (M:1 T:4)
        // -- overlapped
        case  358: cpu->hlx[cpu->hlx_idx].h=cpu->a;goto fetch_next;
        
        //  68: LD L,B (M:1 T:4)
        // -- overlapped
        case  359: cpu->hlx[cpu->hlx_idx].l=cpu->b;goto fetch_next;
        
        //  69: LD L,C (M:1 T:4)
        // -- overlapped
        case  360: cpu->hlx[cpu->hlx_idx].l=cpu->c;goto fetch_next;
        
        //  6A: LD L,D (M:1 T:4)
        // -- overlapped
        case  361: cpu->hlx[cpu->hlx_idx].l=cpu->d;goto fetch_next;
        
        //  6B: LD L,E (M:1 T:4)
        // -- overlapped
        case  362: cpu->hlx[cpu->hlx_idx].l=cpu->e;goto fetch_next;
        
        //  6C: LD L,H (M:1 T:4)
        // -- overlapped
        case  363: cpu->hlx[cpu->hlx_idx].l=cpu->hlx[cpu->hlx_idx].h;goto fetch_next;
        
        //  6D: LD L,L (M:1 T:4)
        // -- overlapped
        case  364: cpu->hlx[cpu->hlx_idx].l=cpu->hlx[cpu->hlx_idx].l;goto fetch_next;
        
        //  6E: LD L,(HL) (M:2 T:7)
        // -- mread
        case  365: goto step_next;
        case  366: _wait();_mread(cpu->addr);goto step_next;
        case  367: cpu->l=_gd();goto step_next;
        // -- overlapped
        case  368: goto fetch_next;
        
        //  6F: LD L,A (M:1 T:4)
        // -- overlapped
        case  369: cpu->hlx[cpu->hlx_idx].l=cpu->a;goto fetch_next;
        
        //  70: LD (HL),B (M:2 T:7)
        // -- mwrite
        case  370: goto step_next;
        case  371: _wait();_mwrite(cpu->addr,cpu->b);goto step_next;
        case  372: goto step_next;
        // -- overlapped
        case  373: goto fetch_next;
        
        //  71: LD (HL),C (M:2 T:7)
        // -- mwrite
        case  374: goto step_next;
        case  375: _wait();_mwrite(cpu->addr,cpu->c);goto step_next;
        case  376: goto step_next;
        // -- overlapped
        case  377: goto fetch_next;
        
        //  72: LD (HL),D (M:2 T:7)
        // -- mwrite
        case  378: goto step_next;
        case  379: _wait();_mwrite(cpu->addr,cpu->d);goto step_next;
        case  380: goto step_next;
        // -- overlapped
        case  381: goto fetch_next;
        
        //  73: LD (HL),E (M:2 T:7)
        // -- mwrite
        case  382: goto step_next;
        case  383: _wait();_mwrite(cpu->addr,cpu->e);goto step_next;
        case  384: goto step_next;
        // -- overlapped
        case  385: goto fetch_next;
        
        //  74: LD (HL),H (M:2 T:7)
        // -- mwrite
        case  386: goto step_next;
        case  387: _wait();_mwrite(cpu->addr,cpu->h);goto step_next;
        case  388: goto step_next;
        // -- overlapped
        case  389: goto fetch_next;
        
        //  75: LD (HL),L (M:2 T:7)
        // -- mwrite
        case  390: goto step_next;
        case  391: _wait();_mwrite(cpu->addr,cpu->l);goto step_next;
        case  392: goto step_next;
        // -- overlapped
        case  393: goto fetch_next;
        
        //  76: HALT (M:1 T:4)
        // -- overlapped
        case  394: pins=_z80_halt(cpu,pins);goto fetch_next;
        
        //  77: LD (HL),A (M:2 T:7)
        // -- mwrite
        case  395: goto step_next;
        case  396: _wait();_mwrite(cpu->addr,cpu->a);goto step_next;
        case  397: goto step_next;
        // -- overlapped
        case  398: goto fetch_next;
        
        //  78: LD A,B (M:1 T:4)
        // -- overlapped
        case  399: cpu->a=cpu->b;goto fetch_next;
        
        //  79: LD A,C (M:1 T:4)
        // -- overlapped
        case  400: cpu->a=cpu->c;goto fetch_next;
        
        //  7A: LD A,D (M:1 T:4)
        // -- overlapped
        case  401: cpu->a=cpu->d;goto fetch_next;
        
        //  7B: LD A,E (M:1 T:4)
        // -- overlapped
        case  402: cpu->a=cpu->e;goto fetch_next;
        
        //  7C: LD A,H (M:1 T:4)
        // -- overlapped
        case  403: cpu->a=cpu->hlx[cpu->hlx_idx].h;goto fetch_next;
        
        //  7D: LD A,L (M:1 T:4)
        // -- overlapped
        case  404: cpu->a=cpu->hlx[cpu->hlx_idx].l;goto fetch_next;
        
        //  7E: LD A,(HL) (M:2 T:7)
        // -- mread
        case  405: goto step_next;
        case  406: _wait();_mread(cpu->addr);goto step_next;
        case  407: cpu->a=_gd();goto step_next;
        // -- overlapped
        case  408: goto fetch_next;
        
        //  7F: LD A,A (M:1 T:4)
        // -- overlapped
        case  409: cpu->a=cpu->a;goto fetch_next;
        
        //  80: ADD B (M:1 T:4)
        // -- overlapped
        case  410: _z80_add8(cpu,cpu->b);goto fetch_next;
        
        //  81: ADD C (M:1 T:4)
        // -- overlapped
        case  411: _z80_add8(cpu,cpu->c);goto fetch_next;
        
        //  82: ADD D (M:1 T:4)
        // -- overlapped
        case  412: _z80_add8(cpu,cpu->d);goto fetch_next;
        
        //  83: ADD E (M:1 T:4)
        // -- overlapped
        case  413: _z80_add8(cpu,cpu->e);goto fetch_next;
        
        //  84: ADD H (M:1 T:4)
        // -- overlapped
        case  414: _z80_add8(cpu,cpu->hlx[cpu->hlx_idx].h);goto fetch_next;
        
        //  85: ADD L (M:1 T:4)
        // -- overlapped
        case  415: _z80_add8(cpu,cpu->hlx[cpu->hlx_idx].l);goto fetch_next;
        
        //  86: ADD (HL) (M:2 T:7)
        // -- mread
        case  416: goto step_next;
        case  417: _wait();_mread(cpu->addr);goto step_next;
        case  418: cpu->dlatch=_gd();goto step_next;
        // -- overlapped
        case  419: _z80_add8(cpu,cpu->dlatch);goto fetch_next;
        
        //  87: ADD A (M:1 T:4)
        // -- overlapped
        case  420: _z80_add8(cpu,cpu->a);goto fetch_next;
        
        //  88: ADC B (M:1 T:4)
        // -- overlapped
        case  421: _z80_adc8(cpu,cpu->b);goto fetch_next;
        
        //  89: ADC C (M:1 T:4)
        // -- overlapped
        case  422: _z80_adc8(cpu,cpu->c);goto fetch_next;
        
        //  8A: ADC D (M:1 T:4)
        // -- overlapped
        case  423: _z80_adc8(cpu,cpu->d);goto fetch_next;
        
        //  8B: ADC E (M:1 T:4)
        // -- overlapped
        case  424: _z80_adc8(cpu,cpu->e);goto fetch_next;
        
        //  8C: ADC H (M:1 T:4)
        // -- overlapped
        case  425: _z80_adc8(cpu,cpu->hlx[cpu->hlx_idx].h);goto fetch_next;
        
        //  8D: ADC L (M:1 T:4)
        // -- overlapped
        case  426: _z80_adc8(cpu,cpu->hlx[cpu->hlx_idx].l);goto fetch_next;
        
        //  8E: ADC (HL) (M:2 T:7)
        // -- mread
        case  427: goto step_next;
        case  428: _wait();_mread(cpu->addr);goto step_next;
        case  429: cpu->dlatch=_gd();goto step_next;
        // -- overlapped
        case  430: _z80_adc8(cpu,cpu->dlatch);goto fetch_next;
        
        //  8F: ADC A (M:1 T:4)
        // -- overlapped
        case  431: _z80_adc8(cpu,cpu->a);goto fetch_next;
        
        //  90: SUB B (M:1 T:4)
        // -- overlapped
        case  432: _z80_sub8(cpu,cpu->b);goto fetch_next;
        
        //  91: SUB C (M:1 T:4)
        // -- overlapped
        case  433: _z80_sub8(cpu,cpu->c);goto fetch_next;
        
        //  92: SUB D (M:1 T:4)
        // -- overlapped
        case  434: _z80_sub8(cpu,cpu->d);goto fetch_next;
        
        //  93: SUB E (M:1 T:4)
        // -- overlapped
        case  435: _z80_sub8(cpu,cpu->e);goto fetch_next;
        
        //  94: SUB H (M:1 T:4)
        // -- overlapped
        case  436: _z80_sub8(cpu,cpu->hlx[cpu->hlx_idx].h);goto fetch_next;
        
        //  95: SUB L (M:1 T:4)
        // -- overlapped
        case  437: _z80_sub8(cpu,cpu->hlx[cpu->hlx_idx].l);goto fetch_next;
        
        //  96: SUB (HL) (M:2 T:7)
        // -- mread
        case  438: goto step_next;
        case  439: _wait();_mread(cpu->addr);goto step_next;
        case  440: cpu->dlatch=_gd();goto step_next;
        // -- overlapped
        case  441: _z80_sub8(cpu,cpu->dlatch);goto fetch_next;
        
        //  97: SUB A (M:1 T:4)
        // -- overlapped
        case  442: _z80_sub8(cpu,cpu->a);goto fetch_next;
        
        //  98: SBC B (M:1 T:4)
        // -- overlapped
        case  443: _z80_sbc8(cpu,cpu->b);goto fetch_next;
        
        //  99: SBC C (M:1 T:4)
        // -- overlapped
        case  444: _z80_sbc8(cpu,cpu->c);goto fetch_next;
        
        //  9A: SBC D (M:1 T:4)
        // -- overlapped
        case  445: _z80_sbc8(cpu,cpu->d);goto fetch_next;
        
        //  9B: SBC E (M:1 T:4)
        // -- overlapped
        case  446: _z80_sbc8(cpu,cpu->e);goto fetch_next;
        
        //  9C: SBC H (M:1 T:4)
        // -- overlapped
        case  447: _z80_sbc8(cpu,cpu->hlx[cpu->hlx_idx].h);goto fetch_next;
        
        //  9D: SBC L (M:1 T:4)
        // -- overlapped
        case  448: _z80_sbc8(cpu,cpu->hlx[cpu->hlx_idx].l);goto fetch_next;
        
        //  9E: SBC (HL) (M:2 T:7)
        // -- mread
        case  449: goto step_next;
        case  450: _wait();_mread(cpu->addr);goto step_next;
        case  451: cpu->dlatch=_gd();goto step_next;
        // -- overlapped
        case  452: _z80_sbc8(cpu,cpu->dlatch);goto fetch_next;
        
        //  9F: SBC A (M:1 T:4)
        // -- overlapped
        case  453: _z80_sbc8(cpu,cpu->a);goto fetch_next;
        
        //  A0: AND B (M:1 T:4)
        // -- overlapped
        case  454: _z80_and8(cpu,cpu->b);goto fetch_next;
        
        //  A1: AND C (M:1 T:4)
        // -- overlapped
        case  455: _z80_and8(cpu,cpu->c);goto fetch_next;
        
        //  A2: AND D (M:1 T:4)
        // -- overlapped
        case  456: _z80_and8(cpu,cpu->d);goto fetch_next;
        
        //  A3: AND E (M:1 T:4)
        // -- overlapped
        case  457: _z80_and8(cpu,cpu->e);goto fetch_next;
        
        //  A4: AND H (M:1 T:4)
        // -- overlapped
        case  458: _z80_and8(cpu,cpu->hlx[cpu->hlx_idx].h);goto fetch_next;
        
        //  A5: AND L (M:1 T:4)
        // -- overlapped
        case  459: _z80_and8(cpu,cpu->hlx[cpu->hlx_idx].l);goto fetch_next;
        
        //  A6: AND (HL) (M:2 T:7)
        // -- mread
        case  460: goto step_next;
        case  461: _wait();_mread(cpu->addr);goto step_next;
        case  462: cpu->dlatch=_gd();goto step_next;
        // -- overlapped
        case  463: _z80_and8(cpu,cpu->dlatch);goto fetch_next;
        
        //  A7: AND A (M:1 T:4)
        // -- overlapped
        case  464: _z80_and8(cpu,cpu->a);goto fetch_next;
        
        //  A8: XOR B (M:1 T:4)
        // -- overlapped
        case  465: _z80_xor8(cpu,cpu->b);goto fetch_next;
        
        //  A9: XOR C (M:1 T:4)
        // -- overlapped
        case  466: _z80_xor8(cpu,cpu->c);goto fetch_next;
        
        //  AA: XOR D (M:1 T:4)
        // -- overlapped
        case  467: _z80_xor8(cpu,cpu->d);goto fetch_next;
        
        //  AB: XOR E (M:1 T:4)
        // -- overlapped
        case  468: _z80_xor8(cpu,cpu->e);goto fetch_next;
        
        //  AC: XOR H (M:1 T:4)
        // -- overlapped
        case  469: _z80_xor8(cpu,cpu->hlx[cpu->hlx_idx].h);goto fetch_next;
        
        //  AD: XOR L (M:1 T:4)
        // -- overlapped
        case  470: _z80_xor8(cpu,cpu->hlx[cpu->hlx_idx].l);goto fetch_next;
        
        //  AE: XOR (HL) (M:2 T:7)
        // -- mread
        case  471: goto step_next;
        case  472: _wait();_mread(cpu->addr);goto step_next;
        case  473: cpu->dlatch=_gd();goto step_next;
        // -- overlapped
        case  474: _z80_xor8(cpu,cpu->dlatch);goto fetch_next;
        
        //  AF: XOR A (M:1 T:4)
        // -- overlapped
        case  475: _z80_xor8(cpu,cpu->a);goto fetch_next;
        
        //  B0: OR B (M:1 T:4)
        // -- overlapped
        case  476: _z80_or8(cpu,cpu->b);goto fetch_next;
        
        //  B1: OR C (M:1 T:4)
        // -- overlapped
        case  477: _z80_or8(cpu,cpu->c);goto fetch_next;
        
        //  B2: OR D (M:1 T:4)
        // -- overlapped
        case  478: _z80_or8(cpu,cpu->d);goto fetch_next;
        
        //  B3: OR E (M:1 T:4)
        // -- overlapped
        case  479: _z80_or8(cpu,cpu->e);goto fetch_next;
        
        //  B4: OR H (M:1 T:4)
        // -- overlapped
        case  480: _z80_or8(cpu,cpu->hlx[cpu->hlx_idx].h);goto fetch_next;
        
        //  B5: OR L (M:1 T:4)
        // -- overlapped
        case  481: _z80_or8(cpu,cpu->hlx[cpu->hlx_idx].l);goto fetch_next;
        
        //  B6: OR (HL) (M:2 T:7)
        // -- mread
        case  482: goto step_next;
        case  483: _wait();_mread(cpu->addr);goto step_next;
        case  484: cpu->dlatch=_gd();goto step_next;
        // -- overlapped
        case  485: _z80_or8(cpu,cpu->dlatch);goto fetch_next;
        
        //  B7: OR A (M:1 T:4)
        // -- overlapped
        case  486: _z80_or8(cpu,cpu->a);goto fetch_next;
        
        //  B8: CP B (M:1 T:4)
        // -- overlapped
        case  487: _z80_cp8(cpu,cpu->b);goto fetch_next;
        
        //  B9: CP C (M:1 T:4)
        // -- overlapped
        case  488: _z80_cp8(cpu,cpu->c);goto fetch_next;
        
        //  BA: CP D (M:1 T:4)
        // -- overlapped
        case  489: _z80_cp8(cpu,cpu->d);goto fetch_next;
        
        //  BB: CP E (M:1 T:4)
        // -- overlapped
        case  490: _z80_cp8(cpu,cpu->e);goto fetch_next;
        
        //  BC: CP H (M:1 T:4)
        // -- overlapped
        case  491: _z80_cp8(cpu,cpu->hlx[cpu->hlx_idx].h);goto fetch_next;
        
        //  BD: CP L (M:1 T:4)
        // -- overlapped
        case  492: _z80_cp8(cpu,cpu->hlx[cpu->hlx_idx].l);goto fetch_next;
        
        //  BE: CP (HL) (M:2 T:7)
        // -- mread
        case  493: goto step_next;
        case  494: _wait();_mread(cpu->addr);goto step_next;
        case  495: cpu->dlatch=_gd();goto step_next;
        // -- overlapped
        case  496: _z80_cp8(cpu,cpu->dlatch);goto fetch_next;
        
        //  BF: CP A (M:1 T:4)
        // -- overlapped
        case  497: _z80_cp8(cpu,cpu->a);goto fetch_next;
        
        //  C0: RET NZ (M:4 T:11)
        // -- generic
        case  498: if(!_cc_nz){_skip(6);};goto step_next;
        // -- mread
        case  499: goto step_next;
        case  500: _wait();_mread(cpu->sp++);goto step_next;
        case  501: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  502: goto step_next;
        case  503: _wait();_mread(cpu->sp++);goto step_next;
        case  504: cpu->wzh=_gd();cpu->pc=cpu->wz;goto step_next;
        // -- overlapped
        case  505: goto fetch_next;
        
        //  C1: POP BC (M:3 T:10)
        // -- mread
        case  506: goto step_next;
        case  507: _wait();_mread(cpu->sp++);goto step_next;
        case  508: cpu->c=_gd();goto step_next;
        // -- mread
        case  509: goto step_next;
        case  510: _wait();_mread(cpu->sp++);goto step_next;
        case  511: cpu->b=_gd();goto step_next;
        // -- overlapped
        case  512: goto fetch_next;
        
        //  C2: JP NZ,nn (M:3 T:10)
        // -- mread
        case  513: goto step_next;
        case  514: _wait();_mread(cpu->pc++);goto step_next;
        case  515: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  516: goto step_next;
        case  517: _wait();_mread(cpu->pc++);goto step_next;
        case  518: cpu->wzh=_gd();if(_cc_nz){cpu->pc=cpu->wz;};goto step_next;
        // -- overlapped
        case  519: goto fetch_next;
        
        //  C3: JP nn (M:3 T:10)
        // -- mread
        case  520: goto step_next;
        case  521: _wait();_mread(cpu->pc++);goto step_next;
        case  522: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  523: goto step_next;
        case  524: _wait();_mread(cpu->pc++);goto step_next;
        case  525: cpu->wzh=_gd();cpu->pc=cpu->wz;goto step_next;
        // -- overlapped
        case  526: goto fetch_next;
        
        //  C4: CALL NZ,nn (M:6 T:17)
        // -- mread
        case  527: goto step_next;
        case  528: _wait();_mread(cpu->pc++);goto step_next;
        case  529: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  530: goto step_next;
        case  531: _wait();_mread(cpu->pc++);goto step_next;
        case  532: cpu->wzh=_gd();if (!_cc_nz){_skip(7);};goto step_next;
        // -- generic
        case  533: goto step_next;
        // -- mwrite
        case  534: goto step_next;
        case  535: _wait();_mwrite(--cpu->sp,cpu->pch);goto step_next;
        case  536: goto step_next;
        // -- mwrite
        case  537: goto step_next;
        case  538: _wait();_mwrite(--cpu->sp,cpu->pcl);cpu->pc=cpu->wz;goto step_next;
        case  539: goto step_next;
        // -- overlapped
        case  540: goto fetch_next;
        
        //  C5: PUSH BC (M:4 T:11)
        // -- generic
        case  541: goto step_next;
        // -- mwrite
        case  542: goto step_next;
        case  543: _wait();_mwrite(--cpu->sp,cpu->b);goto step_next;
        case  544: goto step_next;
        // -- mwrite
        case  545: goto step_next;
        case  546: _wait();_mwrite(--cpu->sp,cpu->c);goto step_next;
        case  547: goto step_next;
        // -- overlapped
        case  548: goto fetch_next;
        
        //  C6: ADD n (M:2 T:7)
        // -- mread
        case  549: goto step_next;
        case  550: _wait();_mread(cpu->pc++);goto step_next;
        case  551: cpu->dlatch=_gd();goto step_next;
        // -- overlapped
        case  552: _z80_add8(cpu,cpu->dlatch);goto fetch_next;
        
        //  C7: RST 0h (M:4 T:11)
        // -- generic
        case  553: goto step_next;
        // -- mwrite
        case  554: goto step_next;
        case  555: _wait();_mwrite(--cpu->sp,cpu->pch);goto step_next;
        case  556: goto step_next;
        // -- mwrite
        case  557: goto step_next;
        case  558: _wait();_mwrite(--cpu->sp,cpu->pcl);cpu->wz=0x00;cpu->pc=cpu->wz;goto step_next;
        case  559: goto step_next;
        // -- overlapped
        case  560: goto fetch_next;
        
        //  C8: RET Z (M:4 T:11)
        // -- generic
        case  561: if(!_cc_z){_skip(6);};goto step_next;
        // -- mread
        case  562: goto step_next;
        case  563: _wait();_mread(cpu->sp++);goto step_next;
        case  564: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  565: goto step_next;
        case  566: _wait();_mread(cpu->sp++);goto step_next;
        case  567: cpu->wzh=_gd();cpu->pc=cpu->wz;goto step_next;
        // -- overlapped
        case  568: goto fetch_next;
        
        //  C9: RET (M:3 T:10)
        // -- mread
        case  569: goto step_next;
        case  570: _wait();_mread(cpu->sp++);goto step_next;
        case  571: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  572: goto step_next;
        case  573: _wait();_mread(cpu->sp++);goto step_next;
        case  574: cpu->wzh=_gd();cpu->pc=cpu->wz;goto step_next;
        // -- overlapped
        case  575: goto fetch_next;
        
        //  CA: JP Z,nn (M:3 T:10)
        // -- mread
        case  576: goto step_next;
        case  577: _wait();_mread(cpu->pc++);goto step_next;
        case  578: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  579: goto step_next;
        case  580: _wait();_mread(cpu->pc++);goto step_next;
        case  581: cpu->wzh=_gd();if(_cc_z){cpu->pc=cpu->wz;};goto step_next;
        // -- overlapped
        case  582: goto fetch_next;
        
        //  CB: CB prefix (M:1 T:4)
        // -- overlapped
        case  583: _fetch_cb();goto step_next;
        
        //  CC: CALL Z,nn (M:6 T:17)
        // -- mread
        case  584: goto step_next;
        case  585: _wait();_mread(cpu->pc++);goto step_next;
        case  586: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  587: goto step_next;
        case  588: _wait();_mread(cpu->pc++);goto step_next;
        case  589: cpu->wzh=_gd();if (!_cc_z){_skip(7);};goto step_next;
        // -- generic
        case  590: goto step_next;
        // -- mwrite
        case  591: goto step_next;
        case  592: _wait();_mwrite(--cpu->sp,cpu->pch);goto step_next;
        case  593: goto step_next;
        // -- mwrite
        case  594: goto step_next;
        case  595: _wait();_mwrite(--cpu->sp,cpu->pcl);cpu->pc=cpu->wz;goto step_next;
        case  596: goto step_next;
        // -- overlapped
        case  597: goto fetch_next;
        
        //  CD: CALL nn (M:5 T:17)
        // -- mread
        case  598: goto step_next;
        case  599: _wait();_mread(cpu->pc++);goto step_next;
        case  600: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  601: goto step_next;
        case  602: _wait();_mread(cpu->pc++);goto step_next;
        case  603: cpu->wzh=_gd();goto step_next;
        case  604: goto step_next;
        // -- mwrite
        case  605: goto step_next;
        case  606: _wait();_mwrite(--cpu->sp,cpu->pch);goto step_next;
        case  607: goto step_next;
        // -- mwrite
        case  608: goto step_next;
        case  609: _wait();_mwrite(--cpu->sp,cpu->pcl);cpu->pc=cpu->wz;goto step_next;
        case  610: goto step_next;
        // -- overlapped
        case  611: goto fetch_next;
        
        //  CE: ADC n (M:2 T:7)
        // -- mread
        case  612: goto step_next;
        case  613: _wait();_mread(cpu->pc++);goto step_next;
        case  614: cpu->dlatch=_gd();goto step_next;
        // -- overlapped
        case  615: _z80_adc8(cpu,cpu->dlatch);goto fetch_next;
        
        //  CF: RST 8h (M:4 T:11)
        // -- generic
        case  616: goto step_next;
        // -- mwrite
        case  617: goto step_next;
        case  618: _wait();_mwrite(--cpu->sp,cpu->pch);goto step_next;
        case  619: goto step_next;
        // -- mwrite
        case  620: goto step_next;
        case  621: _wait();_mwrite(--cpu->sp,cpu->pcl);cpu->wz=0x08;cpu->pc=cpu->wz;goto step_next;
        case  622: goto step_next;
        // -- overlapped
        case  623: goto fetch_next;
        
        //  D0: RET NC (M:4 T:11)
        // -- generic
        case  624: if(!_cc_nc){_skip(6);};goto step_next;
        // -- mread
        case  625: goto step_next;
        case  626: _wait();_mread(cpu->sp++);goto step_next;
        case  627: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  628: goto step_next;
        case  629: _wait();_mread(cpu->sp++);goto step_next;
        case  630: cpu->wzh=_gd();cpu->pc=cpu->wz;goto step_next;
        // -- overlapped
        case  631: goto fetch_next;
        
        //  D1: POP DE (M:3 T:10)
        // -- mread
        case  632: goto step_next;
        case  633: _wait();_mread(cpu->sp++);goto step_next;
        case  634: cpu->e=_gd();goto step_next;
        // -- mread
        case  635: goto step_next;
        case  636: _wait();_mread(cpu->sp++);goto step_next;
        case  637: cpu->d=_gd();goto step_next;
        // -- overlapped
        case  638: goto fetch_next;
        
        //  D2: JP NC,nn (M:3 T:10)
        // -- mread
        case  639: goto step_next;
        case  640: _wait();_mread(cpu->pc++);goto step_next;
        case  641: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  642: goto step_next;
        case  643: _wait();_mread(cpu->pc++);goto step_next;
        case  644: cpu->wzh=_gd();if(_cc_nc){cpu->pc=cpu->wz;};goto step_next;
        // -- overlapped
        case  645: goto fetch_next;
        
        //  D3: OUT (n),A (M:3 T:11)
        // -- mread
        case  646: goto step_next;
        case  647: _wait();_mread(cpu->pc++);goto step_next;
        case  648: cpu->wzl=_gd();cpu->wzh=cpu->a;goto step_next;
        // -- iowrite
        case  649: goto step_next;
        case  650: _iowrite(cpu->wz,cpu->a);goto step_next;
        case  651: _wait();cpu->wzl++;goto step_next;
        case  652: goto step_next;
        // -- overlapped
        case  653: goto fetch_next;
        
        //  D4: CALL NC,nn (M:6 T:17)
        // -- mread
        case  654: goto step_next;
        case  655: _wait();_mread(cpu->pc++);goto step_next;
        case  656: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  657: goto step_next;
        case  658: _wait();_mread(cpu->pc++);goto step_next;
        case  659: cpu->wzh=_gd();if (!_cc_nc){_skip(7);};goto step_next;
        // -- generic
        case  660: goto step_next;
        // -- mwrite
        case  661: goto step_next;
        case  662: _wait();_mwrite(--cpu->sp,cpu->pch);goto step_next;
        case  663: goto step_next;
        // -- mwrite
        case  664: goto step_next;
        case  665: _wait();_mwrite(--cpu->sp,cpu->pcl);cpu->pc=cpu->wz;goto step_next;
        case  666: goto step_next;
        // -- overlapped
        case  667: goto fetch_next;
        
        //  D5: PUSH DE (M:4 T:11)
        // -- generic
        case  668: goto step_next;
        // -- mwrite
        case  669: goto step_next;
        case  670: _wait();_mwrite(--cpu->sp,cpu->d);goto step_next;
        case  671: goto step_next;
        // -- mwrite
        case  672: goto step_next;
        case  673: _wait();_mwrite(--cpu->sp,cpu->e);goto step_next;
        case  674: goto step_next;
        // -- overlapped
        case  675: goto fetch_next;
        
        //  D6: SUB n (M:2 T:7)
        // -- mread
        case  676: goto step_next;
        case  677: _wait();_mread(cpu->pc++);goto step_next;
        case  678: cpu->dlatch=_gd();goto step_next;
        // -- overlapped
        case  679: _z80_sub8(cpu,cpu->dlatch);goto fetch_next;
        
        //  D7: RST 10h (M:4 T:11)
        // -- generic
        case  680: goto step_next;
        // -- mwrite
        case  681: goto step_next;
        case  682: _wait();_mwrite(--cpu->sp,cpu->pch);goto step_next;
        case  683: goto step_next;
        // -- mwrite
        case  684: goto step_next;
        case  685: _wait();_mwrite(--cpu->sp,cpu->pcl);cpu->wz=0x10;cpu->pc=cpu->wz;goto step_next;
        case  686: goto step_next;
        // -- overlapped
        case  687: goto fetch_next;
        
        //  D8: RET C (M:4 T:11)
        // -- generic
        case  688: if(!_cc_c){_skip(6);};goto step_next;
        // -- mread
        case  689: goto step_next;
        case  690: _wait();_mread(cpu->sp++);goto step_next;
        case  691: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  692: goto step_next;
        case  693: _wait();_mread(cpu->sp++);goto step_next;
        case  694: cpu->wzh=_gd();cpu->pc=cpu->wz;goto step_next;
        // -- overlapped
        case  695: goto fetch_next;
        
        //  D9: EXX (M:1 T:4)
        // -- overlapped
        case  696: _z80_exx(cpu);goto fetch_next;
        
        //  DA: JP C,nn (M:3 T:10)
        // -- mread
        case  697: goto step_next;
        case  698: _wait();_mread(cpu->pc++);goto step_next;
        case  699: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  700: goto step_next;
        case  701: _wait();_mread(cpu->pc++);goto step_next;
        case  702: cpu->wzh=_gd();if(_cc_c){cpu->pc=cpu->wz;};goto step_next;
        // -- overlapped
        case  703: goto fetch_next;
        
        //  DB: IN A,(n) (M:3 T:11)
        // -- mread
        case  704: goto step_next;
        case  705: _wait();_mread(cpu->pc++);goto step_next;
        case  706: cpu->wzl=_gd();cpu->wzh=cpu->a;goto step_next;
        // -- ioread
        case  707: goto step_next;
        case  708: goto step_next;
        case  709: _wait();_ioread(cpu->wz++);goto step_next;
        case  710: cpu->a=_gd();goto step_next;
        // -- overlapped
        case  711: goto fetch_next;
        
        //  DC: CALL C,nn (M:6 T:17)
        // -- mread
        case  712: goto step_next;
        case  713: _wait();_mread(cpu->pc++);goto step_next;
        case  714: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  715: goto step_next;
        case  716: _wait();_mread(cpu->pc++);goto step_next;
        case  717: cpu->wzh=_gd();if (!_cc_c){_skip(7);};goto step_next;
        // -- generic
        case  718: goto step_next;
        // -- mwrite
        case  719: goto step_next;
        case  720: _wait();_mwrite(--cpu->sp,cpu->pch);goto step_next;
        case  721: goto step_next;
        // -- mwrite
        case  722: goto step_next;
        case  723: _wait();_mwrite(--cpu->sp,cpu->pcl);cpu->pc=cpu->wz;goto step_next;
        case  724: goto step_next;
        // -- overlapped
        case  725: goto fetch_next;
        
        //  DD: DD prefix (M:1 T:4)
        // -- overlapped
        case  726: _fetch_dd();goto step_next;
        
        //  DE: SBC n (M:2 T:7)
        // -- mread
        case  727: goto step_next;
        case  728: _wait();_mread(cpu->pc++);goto step_next;
        case  729: cpu->dlatch=_gd();goto step_next;
        // -- overlapped
        case  730: _z80_sbc8(cpu,cpu->dlatch);goto fetch_next;
        
        //  DF: RST 18h (M:4 T:11)
        // -- generic
        case  731: goto step_next;
        // -- mwrite
        case  732: goto step_next;
        case  733: _wait();_mwrite(--cpu->sp,cpu->pch);goto step_next;
        case  734: goto step_next;
        // -- mwrite
        case  735: goto step_next;
        case  736: _wait();_mwrite(--cpu->sp,cpu->pcl);cpu->wz=0x18;cpu->pc=cpu->wz;goto step_next;
        case  737: goto step_next;
        // -- overlapped
        case  738: goto fetch_next;
        
        //  E0: RET PO (M:4 T:11)
        // -- generic
        case  739: if(!_cc_po){_skip(6);};goto step_next;
        // -- mread
        case  740: goto step_next;
        case  741: _wait();_mread(cpu->sp++);goto step_next;
        case  742: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  743: goto step_next;
        case  744: _wait();_mread(cpu->sp++);goto step_next;
        case  745: cpu->wzh=_gd();cpu->pc=cpu->wz;goto step_next;
        // -- overlapped
        case  746: goto fetch_next;
        
        //  E1: POP HL (M:3 T:10)
        // -- mread
        case  747: goto step_next;
        case  748: _wait();_mread(cpu->sp++);goto step_next;
        case  749: cpu->hlx[cpu->hlx_idx].l=_gd();goto step_next;
        // -- mread
        case  750: goto step_next;
        case  751: _wait();_mread(cpu->sp++);goto step_next;
        case  752: cpu->hlx[cpu->hlx_idx].h=_gd();goto step_next;
        // -- overlapped
        case  753: goto fetch_next;
        
        //  E2: JP PO,nn (M:3 T:10)
        // -- mread
        case  754: goto step_next;
        case  755: _wait();_mread(cpu->pc++);goto step_next;
        case  756: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  757: goto step_next;
        case  758: _wait();_mread(cpu->pc++);goto step_next;
        case  759: cpu->wzh=_gd();if(_cc_po){cpu->pc=cpu->wz;};goto step_next;
        // -- overlapped
        case  760: goto fetch_next;
        
        //  E3: EX (SP),HL (M:5 T:19)
        // -- mread
        case  761: goto step_next;
        case  762: _wait();_mread(cpu->sp);goto step_next;
        case  763: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  764: goto step_next;
        case  765: _wait();_mread(cpu->sp+1);goto step_next;
        case  766: cpu->wzh=_gd();goto step_next;
        case  767: goto step_next;
        // -- mwrite
        case  768: goto step_next;
        case  769: _wait();_mwrite(cpu->sp+1,cpu->hlx[cpu->hlx_idx].h);goto step_next;
        case  770: goto step_next;
        // -- mwrite
        case  771: goto step_next;
        case  772: _wait();_mwrite(cpu->sp,cpu->hlx[cpu->hlx_idx].l);cpu->hlx[cpu->hlx_idx].hl=cpu->wz;goto step_next;
        case  773: goto step_next;
        case  774: goto step_next;
        case  775: goto step_next;
        // -- overlapped
        case  776: goto fetch_next;
        
        //  E4: CALL PO,nn (M:6 T:17)
        // -- mread
        case  777: goto step_next;
        case  778: _wait();_mread(cpu->pc++);goto step_next;
        case  779: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  780: goto step_next;
        case  781: _wait();_mread(cpu->pc++);goto step_next;
        case  782: cpu->wzh=_gd();if (!_cc_po){_skip(7);};goto step_next;
        // -- generic
        case  783: goto step_next;
        // -- mwrite
        case  784: goto step_next;
        case  785: _wait();_mwrite(--cpu->sp,cpu->pch);goto step_next;
        case  786: goto step_next;
        // -- mwrite
        case  787: goto step_next;
        case  788: _wait();_mwrite(--cpu->sp,cpu->pcl);cpu->pc=cpu->wz;goto step_next;
        case  789: goto step_next;
        // -- overlapped
        case  790: goto fetch_next;
        
        //  E5: PUSH HL (M:4 T:11)
        // -- generic
        case  791: goto step_next;
        // -- mwrite
        case  792: goto step_next;
        case  793: _wait();_mwrite(--cpu->sp,cpu->hlx[cpu->hlx_idx].h);goto step_next;
        case  794: goto step_next;
        // -- mwrite
        case  795: goto step_next;
        case  796: _wait();_mwrite(--cpu->sp,cpu->hlx[cpu->hlx_idx].l);goto step_next;
        case  797: goto step_next;
        // -- overlapped
        case  798: goto fetch_next;
        
        //  E6: AND n (M:2 T:7)
        // -- mread
        case  799: goto step_next;
        case  800: _wait();_mread(cpu->pc++);goto step_next;
        case  801: cpu->dlatch=_gd();goto step_next;
        // -- overlapped
        case  802: _z80_and8(cpu,cpu->dlatch);goto fetch_next;
        
        //  E7: RST 20h (M:4 T:11)
        // -- generic
        case  803: goto step_next;
        // -- mwrite
        case  804: goto step_next;
        case  805: _wait();_mwrite(--cpu->sp,cpu->pch);goto step_next;
        case  806: goto step_next;
        // -- mwrite
        case  807: goto step_next;
        case  808: _wait();_mwrite(--cpu->sp,cpu->pcl);cpu->wz=0x20;cpu->pc=cpu->wz;goto step_next;
        case  809: goto step_next;
        // -- overlapped
        case  810: goto fetch_next;
        
        //  E8: RET PE (M:4 T:11)
        // -- generic
        case  811: if(!_cc_pe){_skip(6);};goto step_next;
        // -- mread
        case  812: goto step_next;
        case  813: _wait();_mread(cpu->sp++);goto step_next;
        case  814: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  815: goto step_next;
        case  816: _wait();_mread(cpu->sp++);goto step_next;
        case  817: cpu->wzh=_gd();cpu->pc=cpu->wz;goto step_next;
        // -- overlapped
        case  818: goto fetch_next;
        
        //  E9: JP HL (M:1 T:4)
        // -- overlapped
        case  819: cpu->pc=cpu->hlx[cpu->hlx_idx].hl;goto fetch_next;
        
        //  EA: JP PE,nn (M:3 T:10)
        // -- mread
        case  820: goto step_next;
        case  821: _wait();_mread(cpu->pc++);goto step_next;
        case  822: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  823: goto step_next;
        case  824: _wait();_mread(cpu->pc++);goto step_next;
        case  825: cpu->wzh=_gd();if(_cc_pe){cpu->pc=cpu->wz;};goto step_next;
        // -- overlapped
        case  826: goto fetch_next;
        
        //  EB: EX DE,HL (M:1 T:4)
        // -- overlapped
        case  827: _z80_ex_de_hl(cpu);goto fetch_next;
        
        //  EC: CALL PE,nn (M:6 T:17)
        // -- mread
        case  828: goto step_next;
        case  829: _wait();_mread(cpu->pc++);goto step_next;
        case  830: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  831: goto step_next;
        case  832: _wait();_mread(cpu->pc++);goto step_next;
        case  833: cpu->wzh=_gd();if (!_cc_pe){_skip(7);};goto step_next;
        // -- generic
        case  834: goto step_next;
        // -- mwrite
        case  835: goto step_next;
        case  836: _wait();_mwrite(--cpu->sp,cpu->pch);goto step_next;
        case  837: goto step_next;
        // -- mwrite
        case  838: goto step_next;
        case  839: _wait();_mwrite(--cpu->sp,cpu->pcl);cpu->pc=cpu->wz;goto step_next;
        case  840: goto step_next;
        // -- overlapped
        case  841: goto fetch_next;
        
        //  ED: ED prefix (M:1 T:4)
        // -- overlapped
        case  842: _fetch_ed();goto step_next;
        
        //  EE: XOR n (M:2 T:7)
        // -- mread
        case  843: goto step_next;
        case  844: _wait();_mread(cpu->pc++);goto step_next;
        case  845: cpu->dlatch=_gd();goto step_next;
        // -- overlapped
        case  846: _z80_xor8(cpu,cpu->dlatch);goto fetch_next;
        
        //  EF: RST 28h (M:4 T:11)
        // -- generic
        case  847: goto step_next;
        // -- mwrite
        case  848: goto step_next;
        case  849: _wait();_mwrite(--cpu->sp,cpu->pch);goto step_next;
        case  850: goto step_next;
        // -- mwrite
        case  851: goto step_next;
        case  852: _wait();_mwrite(--cpu->sp,cpu->pcl);cpu->wz=0x28;cpu->pc=cpu->wz;goto step_next;
        case  853: goto step_next;
        // -- overlapped
        case  854: goto fetch_next;
        
        //  F0: RET P (M:4 T:11)
        // -- generic
        case  855: if(!_cc_p){_skip(6);};goto step_next;
        // -- mread
        case  856: goto step_next;
        case  857: _wait();_mread(cpu->sp++);goto step_next;
        case  858: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  859: goto step_next;
        case  860: _wait();_mread(cpu->sp++);goto step_next;
        case  861: cpu->wzh=_gd();cpu->pc=cpu->wz;goto step_next;
        // -- overlapped
        case  862: goto fetch_next;
        
        //  F1: POP AF (M:3 T:10)
        // -- mread
        case  863: goto step_next;
        case  864: _wait();_mread(cpu->sp++);goto step_next;
        case  865: cpu->f=_gd();goto step_next;
        // -- mread
        case  866: goto step_next;
        case  867: _wait();_mread(cpu->sp++);goto step_next;
        case  868: cpu->a=_gd();goto step_next;
        // -- overlapped
        case  869: goto fetch_next;
        
        //  F2: JP P,nn (M:3 T:10)
        // -- mread
        case  870: goto step_next;
        case  871: _wait();_mread(cpu->pc++);goto step_next;
        case  872: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  873: goto step_next;
        case  874: _wait();_mread(cpu->pc++);goto step_next;
        case  875: cpu->wzh=_gd();if(_cc_p){cpu->pc=cpu->wz;};goto step_next;
        // -- overlapped
        case  876: goto fetch_next;
        
        //  F3: DI (M:1 T:4)
        // -- overlapped
        case  877: cpu->iff1=cpu->iff2=false;goto fetch_next;
        
        //  F4: CALL P,nn (M:6 T:17)
        // -- mread
        case  878: goto step_next;
        case  879: _wait();_mread(cpu->pc++);goto step_next;
        case  880: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  881: goto step_next;
        case  882: _wait();_mread(cpu->pc++);goto step_next;
        case  883: cpu->wzh=_gd();if (!_cc_p){_skip(7);};goto step_next;
        // -- generic
        case  884: goto step_next;
        // -- mwrite
        case  885: goto step_next;
        case  886: _wait();_mwrite(--cpu->sp,cpu->pch);goto step_next;
        case  887: goto step_next;
        // -- mwrite
        case  888: goto step_next;
        case  889: _wait();_mwrite(--cpu->sp,cpu->pcl);cpu->pc=cpu->wz;goto step_next;
        case  890: goto step_next;
        // -- overlapped
        case  891: goto fetch_next;
        
        //  F5: PUSH AF (M:4 T:11)
        // -- generic
        case  892: goto step_next;
        // -- mwrite
        case  893: goto step_next;
        case  894: _wait();_mwrite(--cpu->sp,cpu->a);goto step_next;
        case  895: goto step_next;
        // -- mwrite
        case  896: goto step_next;
        case  897: _wait();_mwrite(--cpu->sp,cpu->f);goto step_next;
        case  898: goto step_next;
        // -- overlapped
        case  899: goto fetch_next;
        
        //  F6: OR n (M:2 T:7)
        // -- mread
        case  900: goto step_next;
        case  901: _wait();_mread(cpu->pc++);goto step_next;
        case  902: cpu->dlatch=_gd();goto step_next;
        // -- overlapped
        case  903: _z80_or8(cpu,cpu->dlatch);goto fetch_next;
        
        //  F7: RST 30h (M:4 T:11)
        // -- generic
        case  904: goto step_next;
        // -- mwrite
        case  905: goto step_next;
        case  906: _wait();_mwrite(--cpu->sp,cpu->pch);goto step_next;
        case  907: goto step_next;
        // -- mwrite
        case  908: goto step_next;
        case  909: _wait();_mwrite(--cpu->sp,cpu->pcl);cpu->wz=0x30;cpu->pc=cpu->wz;goto step_next;
        case  910: goto step_next;
        // -- overlapped
        case  911: goto fetch_next;
        
        //  F8: RET M (M:4 T:11)
        // -- generic
        case  912: if(!_cc_m){_skip(6);};goto step_next;
        // -- mread
        case  913: goto step_next;
        case  914: _wait();_mread(cpu->sp++);goto step_next;
        case  915: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  916: goto step_next;
        case  917: _wait();_mread(cpu->sp++);goto step_next;
        case  918: cpu->wzh=_gd();cpu->pc=cpu->wz;goto step_next;
        // -- overlapped
        case  919: goto fetch_next;
        
        //  F9: LD SP,HL (M:2 T:6)
        // -- generic
        case  920: cpu->sp=cpu->hlx[cpu->hlx_idx].hl;goto step_next;
        case  921: goto step_next;
        // -- overlapped
        case  922: goto fetch_next;
        
        //  FA: JP M,nn (M:3 T:10)
        // -- mread
        case  923: goto step_next;
        case  924: _wait();_mread(cpu->pc++);goto step_next;
        case  925: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  926: goto step_next;
        case  927: _wait();_mread(cpu->pc++);goto step_next;
        case  928: cpu->wzh=_gd();if(_cc_m){cpu->pc=cpu->wz;};goto step_next;
        // -- overlapped
        case  929: goto fetch_next;
        
        //  FB: EI (M:1 T:4)
        // -- overlapped
        case  930: cpu->iff1=cpu->iff2=false;pins=_z80_fetch(cpu,pins);cpu->iff1=cpu->iff2=true;goto step_next;
        
        //  FC: CALL M,nn (M:6 T:17)
        // -- mread
        case  931: goto step_next;
        case  932: _wait();_mread(cpu->pc++);goto step_next;
        case  933: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  934: goto step_next;
        case  935: _wait();_mread(cpu->pc++);goto step_next;
        case  936: cpu->wzh=_gd();if (!_cc_m){_skip(7);};goto step_next;
        // -- generic
        case  937: goto step_next;
        // -- mwrite
        case  938: goto step_next;
        case  939: _wait();_mwrite(--cpu->sp,cpu->pch);goto step_next;
        case  940: goto step_next;
        // -- mwrite
        case  941: goto step_next;
        case  942: _wait();_mwrite(--cpu->sp,cpu->pcl);cpu->pc=cpu->wz;goto step_next;
        case  943: goto step_next;
        // -- overlapped
        case  944: goto fetch_next;
        
        //  FD: FD prefix (M:1 T:4)
        // -- overlapped
        case  945: _fetch_fd();goto step_next;
        
        //  FE: CP n (M:2 T:7)
        // -- mread
        case  946: goto step_next;
        case  947: _wait();_mread(cpu->pc++);goto step_next;
        case  948: cpu->dlatch=_gd();goto step_next;
        // -- overlapped
        case  949: _z80_cp8(cpu,cpu->dlatch);goto fetch_next;
        
        //  FF: RST 38h (M:4 T:11)
        // -- generic
        case  950: goto step_next;
        // -- mwrite
        case  951: goto step_next;
        case  952: _wait();_mwrite(--cpu->sp,cpu->pch);goto step_next;
        case  953: goto step_next;
        // -- mwrite
        case  954: goto step_next;
        case  955: _wait();_mwrite(--cpu->sp,cpu->pcl);cpu->wz=0x38;cpu->pc=cpu->wz;goto step_next;
        case  956: goto step_next;
        // -- overlapped
        case  957: goto fetch_next;
        
        // ED 00: ED NOP (M:1 T:4)
        // -- overlapped
        case  958: goto fetch_next;
        
        // ED 40: IN B,(C) (M:2 T:8)
        // -- ioread
        case  959: goto step_next;
        case  960: goto step_next;
        case  961: _wait();_ioread(cpu->bc);goto step_next;
        case  962: cpu->dlatch=_gd();cpu->wz=cpu->bc+1;goto step_next;
        // -- overlapped
        case  963: cpu->b=_z80_in(cpu,cpu->dlatch);goto fetch_next;
        
        // ED 41: OUT (C),B (M:2 T:8)
        // -- iowrite
        case  964: goto step_next;
        case  965: _iowrite(cpu->bc,cpu->b);goto step_next;
        case  966: _wait();cpu->wz=cpu->bc+1;goto step_next;
        case  967: goto step_next;
        // -- overlapped
        case  968: goto fetch_next;
        
        // ED 42: SBC HL,BC (M:2 T:11)
        // -- generic
        case  969: _z80_sbc16(cpu,cpu->bc);goto step_next;
        case  970: goto step_next;
        case  971: goto step_next;
        case  972: goto step_next;
        case  973: goto step_next;
        case  974: goto step_next;
        case  975: goto step_next;
        // -- overlapped
        case  976: goto fetch_next;
        
        // ED 43: LD (nn),BC (M:5 T:16)
        // -- mread
        case  977: goto step_next;
        case  978: _wait();_mread(cpu->pc++);goto step_next;
        case  979: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  980: goto step_next;
        case  981: _wait();_mread(cpu->pc++);goto step_next;
        case  982: cpu->wzh=_gd();goto step_next;
        // -- mwrite
        case  983: goto step_next;
        case  984: _wait();_mwrite(cpu->wz++,cpu->c);goto step_next;
        case  985: goto step_next;
        // -- mwrite
        case  986: goto step_next;
        case  987: _wait();_mwrite(cpu->wz,cpu->b);goto step_next;
        case  988: goto step_next;
        // -- overlapped
        case  989: goto fetch_next;
        
        // ED 44: NEG (M:1 T:4)
        // -- overlapped
        case  990: _z80_neg8(cpu);goto fetch_next;
        
        // ED 45: RETN (M:3 T:10)
        // -- mread
        case  991: goto step_next;
        case  992: _wait();_mread(cpu->sp++);goto step_next;
        case  993: cpu->wzl=_gd();goto step_next;
        // -- mread
        case  994: goto step_next;
        case  995: _wait();_mread(cpu->sp++);goto step_next;
        case  996: cpu->wzh=_gd();cpu->pc=cpu->wz;goto step_next;
        // -- overlapped
        case  997: pins=_z80_fetch(cpu,pins);cpu->iff1=cpu->iff2;goto step_next;
        
        // ED 46: IM 0 (M:1 T:4)
        // -- overlapped
        case  998: cpu->im=0;goto fetch_next;
        
        // ED 47: LD I,A (M:2 T:5)
        // -- generic
        case  999: goto step_next;
        // -- overlapped
        case 1000: cpu->i=cpu->a;goto fetch_next;
        
        // ED 48: IN C,(C) (M:2 T:8)
        // -- ioread
        case 1001: goto step_next;
        case 1002: goto step_next;
        case 1003: _wait();_ioread(cpu->bc);goto step_next;
        case 1004: cpu->dlatch=_gd();cpu->wz=cpu->bc+1;goto step_next;
        // -- overlapped
        case 1005: cpu->c=_z80_in(cpu,cpu->dlatch);goto fetch_next;
        
        // ED 49: OUT (C),C (M:2 T:8)
        // -- iowrite
        case 1006: goto step_next;
        case 1007: _iowrite(cpu->bc,cpu->c);goto step_next;
        case 1008: _wait();cpu->wz=cpu->bc+1;goto step_next;
        case 1009: goto step_next;
        // -- overlapped
        case 1010: goto fetch_next;
        
        // ED 4A: ADC HL,BC (M:2 T:11)
        // -- generic
        case 1011: _z80_adc16(cpu,cpu->bc);goto step_next;
        case 1012: goto step_next;
        case 1013: goto step_next;
        case 1014: goto step_next;
        case 1015: goto step_next;
        case 1016: goto step_next;
        case 1017: goto step_next;
        // -- overlapped
        case 1018: goto fetch_next;
        
        // ED 4B: LD BC,(nn) (M:5 T:16)
        // -- mread
        case 1019: goto step_next;
        case 1020: _wait();_mread(cpu->pc++);goto step_next;
        case 1021: cpu->wzl=_gd();goto step_next;
        // -- mread
        case 1022: goto step_next;
        case 1023: _wait();_mread(cpu->pc++);goto step_next;
        case 1024: cpu->wzh=_gd();goto step_next;
        // -- mread
        case 1025: goto step_next;
        case 1026: _wait();_mread(cpu->wz++);goto step_next;
        case 1027: cpu->c=_gd();goto step_next;
        // -- mread
        case 1028: goto step_next;
        case 1029: _wait();_mread(cpu->wz);goto step_next;
        case 1030: cpu->b=_gd();goto step_next;
        // -- overlapped
        case 1031: goto fetch_next;
        
        // ED 4D: RETI (M:3 T:10)
        // -- mread
        case 1032: goto step_next;
        case 1033: _wait();_mread(cpu->sp++);goto step_next;
        case 1034: cpu->wzl=_gd();pins|=Z80_RETI;goto step_next;
        // -- mread
        case 1035: goto step_next;
        case 1036: _wait();_mread(cpu->sp++);goto step_next;
        case 1037: cpu->wzh=_gd();cpu->pc=cpu->wz;goto step_next;
        // -- overlapped
        case 1038: pins=_z80_fetch(cpu,pins);cpu->iff1=cpu->iff2;goto step_next;
        
        // ED 4E: IM 0 (M:1 T:4)
        // -- overlapped
        case 1039: cpu->im=0;goto fetch_next;
        
        // ED 4F: LD R,A (M:2 T:5)
        // -- generic
        case 1040: goto step_next;
        // -- overlapped
        case 1041: cpu->r=cpu->a;goto fetch_next;
        
        // ED 50: IN D,(C) (M:2 T:8)
        // -- ioread
        case 1042: goto step_next;
        case 1043: goto step_next;
        case 1044: _wait();_ioread(cpu->bc);goto step_next;
        case 1045: cpu->dlatch=_gd();cpu->wz=cpu->bc+1;goto step_next;
        // -- overlapped
        case 1046: cpu->d=_z80_in(cpu,cpu->dlatch);goto fetch_next;
        
        // ED 51: OUT (C),D (M:2 T:8)
        // -- iowrite
        case 1047: goto step_next;
        case 1048: _iowrite(cpu->bc,cpu->d);goto step_next;
        case 1049: _wait();cpu->wz=cpu->bc+1;goto step_next;
        case 1050: goto step_next;
        // -- overlapped
        case 1051: goto fetch_next;
        
        // ED 52: SBC HL,DE (M:2 T:11)
        // -- generic
        case 1052: _z80_sbc16(cpu,cpu->de);goto step_next;
        case 1053: goto step_next;
        case 1054: goto step_next;
        case 1055: goto step_next;
        case 1056: goto step_next;
        case 1057: goto step_next;
        case 1058: goto step_next;
        // -- overlapped
        case 1059: goto fetch_next;
        
        // ED 53: LD (nn),DE (M:5 T:16)
        // -- mread
        case 1060: goto step_next;
        case 1061: _wait();_mread(cpu->pc++);goto step_next;
        case 1062: cpu->wzl=_gd();goto step_next;
        // -- mread
        case 1063: goto step_next;
        case 1064: _wait();_mread(cpu->pc++);goto step_next;
        case 1065: cpu->wzh=_gd();goto step_next;
        // -- mwrite
        case 1066: goto step_next;
        case 1067: _wait();_mwrite(cpu->wz++,cpu->e);goto step_next;
        case 1068: goto step_next;
        // -- mwrite
        case 1069: goto step_next;
        case 1070: _wait();_mwrite(cpu->wz,cpu->d);goto step_next;
        case 1071: goto step_next;
        // -- overlapped
        case 1072: goto fetch_next;
        
        // ED 56: IM 1 (M:1 T:4)
        // -- overlapped
        case 1073: cpu->im=1;goto fetch_next;
        
        // ED 57: LD A,I (M:2 T:5)
        // -- generic
        case 1074: goto step_next;
        // -- overlapped
        case 1075: cpu->a=cpu->i;cpu->f=_z80_sziff2_flags(cpu, cpu->i);goto fetch_next;
        
        // ED 58: IN E,(C) (M:2 T:8)
        // -- ioread
        case 1076: goto step_next;
        case 1077: goto step_next;
        case 1078: _wait();_ioread(cpu->bc);goto step_next;
        case 1079: cpu->dlatch=_gd();cpu->wz=cpu->bc+1;goto step_next;
        // -- overlapped
        case 1080: cpu->e=_z80_in(cpu,cpu->dlatch);goto fetch_next;
        
        // ED 59: OUT (C),E (M:2 T:8)
        // -- iowrite
        case 1081: goto step_next;
        case 1082: _iowrite(cpu->bc,cpu->e);goto step_next;
        case 1083: _wait();cpu->wz=cpu->bc+1;goto step_next;
        case 1084: goto step_next;
        // -- overlapped
        case 1085: goto fetch_next;
        
        // ED 5A: ADC HL,DE (M:2 T:11)
        // -- generic
        case 1086: _z80_adc16(cpu,cpu->de);goto step_next;
        case 1087: goto step_next;
        case 1088: goto step_next;
        case 1089: goto step_next;
        case 1090: goto step_next;
        case 1091: goto step_next;
        case 1092: goto step_next;
        // -- overlapped
        case 1093: goto fetch_next;
        
        // ED 5B: LD DE,(nn) (M:5 T:16)
        // -- mread
        case 1094: goto step_next;
        case 1095: _wait();_mread(cpu->pc++);goto step_next;
        case 1096: cpu->wzl=_gd();goto step_next;
        // -- mread
        case 1097: goto step_next;
        case 1098: _wait();_mread(cpu->pc++);goto step_next;
        case 1099: cpu->wzh=_gd();goto step_next;
        // -- mread
        case 1100: goto step_next;
        case 1101: _wait();_mread(cpu->wz++);goto step_next;
        case 1102: cpu->e=_gd();goto step_next;
        // -- mread
        case 1103: goto step_next;
        case 1104: _wait();_mread(cpu->wz);goto step_next;
        case 1105: cpu->d=_gd();goto step_next;
        // -- overlapped
        case 1106: goto fetch_next;
        
        // ED 5E: IM 2 (M:1 T:4)
        // -- overlapped
        case 1107: cpu->im=2;goto fetch_next;
        
        // ED 5F: LD A,R (M:2 T:5)
        // -- generic
        case 1108: goto step_next;
        // -- overlapped
        case 1109: cpu->a=cpu->r;cpu->f=_z80_sziff2_flags(cpu, cpu->r);goto fetch_next;
        
        // ED 60: IN H,(C) (M:2 T:8)
        // -- ioread
        case 1110: goto step_next;
        case 1111: goto step_next;
        case 1112: _wait();_ioread(cpu->bc);goto step_next;
        case 1113: cpu->dlatch=_gd();cpu->wz=cpu->bc+1;goto step_next;
        // -- overlapped
        case 1114: cpu->h=_z80_in(cpu,cpu->dlatch);goto fetch_next;
        
        // ED 61: OUT (C),H (M:2 T:8)
        // -- iowrite
        case 1115: goto step_next;
        case 1116: _iowrite(cpu->bc,cpu->h);goto step_next;
        case 1117: _wait();cpu->wz=cpu->bc+1;goto step_next;
        case 1118: goto step_next;
        // -- overlapped
        case 1119: goto fetch_next;
        
        // ED 62: SBC HL,HL (M:2 T:11)
        // -- generic
        case 1120: _z80_sbc16(cpu,cpu->hl);goto step_next;
        case 1121: goto step_next;
        case 1122: goto step_next;
        case 1123: goto step_next;
        case 1124: goto step_next;
        case 1125: goto step_next;
        case 1126: goto step_next;
        // -- overlapped
        case 1127: goto fetch_next;
        
        // ED 63: LD (nn),HL (M:5 T:16)
        // -- mread
        case 1128: goto step_next;
        case 1129: _wait();_mread(cpu->pc++);goto step_next;
        case 1130: cpu->wzl=_gd();goto step_next;
        // -- mread
        case 1131: goto step_next;
        case 1132: _wait();_mread(cpu->pc++);goto step_next;
        case 1133: cpu->wzh=_gd();goto step_next;
        // -- mwrite
        case 1134: goto step_next;
        case 1135: _wait();_mwrite(cpu->wz++,cpu->l);goto step_next;
        case 1136: goto step_next;
        // -- mwrite
        case 1137: goto step_next;
        case 1138: _wait();_mwrite(cpu->wz,cpu->h);goto step_next;
        case 1139: goto step_next;
        // -- overlapped
        case 1140: goto fetch_next;
        
        // ED 66: IM 0 (M:1 T:4)
        // -- overlapped
        case 1141: cpu->im=0;goto fetch_next;
        
        // ED 67: RRD (M:4 T:14)
        // -- mread
        case 1142: goto step_next;
        case 1143: _wait();_mread(cpu->hl);goto step_next;
        case 1144: cpu->dlatch=_gd();goto step_next;
        // -- generic
        case 1145: cpu->dlatch=_z80_rrd(cpu,cpu->dlatch);goto step_next;
        case 1146: goto step_next;
        case 1147: goto step_next;
        case 1148: goto step_next;
        // -- mwrite
        case 1149: goto step_next;
        case 1150: _wait();_mwrite(cpu->hl,cpu->dlatch);cpu->wz=cpu->hl+1;goto step_next;
        case 1151: goto step_next;
        // -- overlapped
        case 1152: goto fetch_next;
        
        // ED 68: IN L,(C) (M:2 T:8)
        // -- ioread
        case 1153: goto step_next;
        case 1154: goto step_next;
        case 1155: _wait();_ioread(cpu->bc);goto step_next;
        case 1156: cpu->dlatch=_gd();cpu->wz=cpu->bc+1;goto step_next;
        // -- overlapped
        case 1157: cpu->l=_z80_in(cpu,cpu->dlatch);goto fetch_next;
        
        // ED 69: OUT (C),L (M:2 T:8)
        // -- iowrite
        case 1158: goto step_next;
        case 1159: _iowrite(cpu->bc,cpu->l);goto step_next;
        case 1160: _wait();cpu->wz=cpu->bc+1;goto step_next;
        case 1161: goto step_next;
        // -- overlapped
        case 1162: goto fetch_next;
        
        // ED 6A: ADC HL,HL (M:2 T:11)
        // -- generic
        case 1163: _z80_adc16(cpu,cpu->hl);goto step_next;
        case 1164: goto step_next;
        case 1165: goto step_next;
        case 1166: goto step_next;
        case 1167: goto step_next;
        case 1168: goto step_next;
        case 1169: goto step_next;
        // -- overlapped
        case 1170: goto fetch_next;
        
        // ED 6B: LD HL,(nn) (M:5 T:16)
        // -- mread
        case 1171: goto step_next;
        case 1172: _wait();_mread(cpu->pc++);goto step_next;
        case 1173: cpu->wzl=_gd();goto step_next;
        // -- mread
        case 1174: goto step_next;
        case 1175: _wait();_mread(cpu->pc++);goto step_next;
        case 1176: cpu->wzh=_gd();goto step_next;
        // -- mread
        case 1177: goto step_next;
        case 1178: _wait();_mread(cpu->wz++);goto step_next;
        case 1179: cpu->l=_gd();goto step_next;
        // -- mread
        case 1180: goto step_next;
        case 1181: _wait();_mread(cpu->wz);goto step_next;
        case 1182: cpu->h=_gd();goto step_next;
        // -- overlapped
        case 1183: goto fetch_next;
        
        // ED 6E: IM 0 (M:1 T:4)
        // -- overlapped
        case 1184: cpu->im=0;goto fetch_next;
        
        // ED 6F: RLD (M:4 T:14)
        // -- mread
        case 1185: goto step_next;
        case 1186: _wait();_mread(cpu->hl);goto step_next;
        case 1187: cpu->dlatch=_gd();goto step_next;
        // -- generic
        case 1188: cpu->dlatch=_z80_rld(cpu,cpu->dlatch);goto step_next;
        case 1189: goto step_next;
        case 1190: goto step_next;
        case 1191: goto step_next;
        // -- mwrite
        case 1192: goto step_next;
        case 1193: _wait();_mwrite(cpu->hl,cpu->dlatch);cpu->wz=cpu->hl+1;goto step_next;
        case 1194: goto step_next;
        // -- overlapped
        case 1195: goto fetch_next;
        
        // ED 70: IN (C) (M:2 T:8)
        // -- ioread
        case 1196: goto step_next;
        case 1197: goto step_next;
        case 1198: _wait();_ioread(cpu->bc);goto step_next;
        case 1199: cpu->dlatch=_gd();cpu->wz=cpu->bc+1;goto step_next;
        // -- overlapped
        case 1200: _z80_in(cpu,cpu->dlatch);goto fetch_next;
        
        // ED 71: OUT (C),0 (M:2 T:8)
        // -- iowrite
        case 1201: goto step_next;
        case 1202: _iowrite(cpu->bc,0);goto step_next;
        case 1203: _wait();cpu->wz=cpu->bc+1;goto step_next;
        case 1204: goto step_next;
        // -- overlapped
        case 1205: goto fetch_next;
        
        // ED 72: SBC HL,SP (M:2 T:11)
        // -- generic
        case 1206: _z80_sbc16(cpu,cpu->sp);goto step_next;
        case 1207: goto step_next;
        case 1208: goto step_next;
        case 1209: goto step_next;
        case 1210: goto step_next;
        case 1211: goto step_next;
        case 1212: goto step_next;
        // -- overlapped
        case 1213: goto fetch_next;
        
        // ED 73: LD (nn),SP (M:5 T:16)
        // -- mread
        case 1214: goto step_next;
        case 1215: _wait();_mread(cpu->pc++);goto step_next;
        case 1216: cpu->wzl=_gd();goto step_next;
        // -- mread
        case 1217: goto step_next;
        case 1218: _wait();_mread(cpu->pc++);goto step_next;
        case 1219: cpu->wzh=_gd();goto step_next;
        // -- mwrite
        case 1220: goto step_next;
        case 1221: _wait();_mwrite(cpu->wz++,cpu->spl);goto step_next;
        case 1222: goto step_next;
        // -- mwrite
        case 1223: goto step_next;
        case 1224: _wait();_mwrite(cpu->wz,cpu->sph);goto step_next;
        case 1225: goto step_next;
        // -- overlapped
        case 1226: goto fetch_next;
        
        // ED 76: IM 1 (M:1 T:4)
        // -- overlapped
        case 1227: cpu->im=1;goto fetch_next;
        
        // ED 78: IN A,(C) (M:2 T:8)
        // -- ioread
        case 1228: goto step_next;
        case 1229: goto step_next;
        case 1230: _wait();_ioread(cpu->bc);goto step_next;
        case 1231: cpu->dlatch=_gd();cpu->wz=cpu->bc+1;goto step_next;
        // -- overlapped
        case 1232: cpu->a=_z80_in(cpu,cpu->dlatch);goto fetch_next;
        
        // ED 79: OUT (C),A (M:2 T:8)
        // -- iowrite
        case 1233: goto step_next;
        case 1234: _iowrite(cpu->bc,cpu->a);goto step_next;
        case 1235: _wait();cpu->wz=cpu->bc+1;goto step_next;
        case 1236: goto step_next;
        // -- overlapped
        case 1237: goto fetch_next;
        
        // ED 7A: ADC HL,SP (M:2 T:11)
        // -- generic
        case 1238: _z80_adc16(cpu,cpu->sp);goto step_next;
        case 1239: goto step_next;
        case 1240: goto step_next;
        case 1241: goto step_next;
        case 1242: goto step_next;
        case 1243: goto step_next;
        case 1244: goto step_next;
        // -- overlapped
        case 1245: goto fetch_next;
        
        // ED 7B: LD SP,(nn) (M:5 T:16)
        // -- mread
        case 1246: goto step_next;
        case 1247: _wait();_mread(cpu->pc++);goto step_next;
        case 1248: cpu->wzl=_gd();goto step_next;
        // -- mread
        case 1249: goto step_next;
        case 1250: _wait();_mread(cpu->pc++);goto step_next;
        case 1251: cpu->wzh=_gd();goto step_next;
        // -- mread
        case 1252: goto step_next;
        case 1253: _wait();_mread(cpu->wz++);goto step_next;
        case 1254: cpu->spl=_gd();goto step_next;
        // -- mread
        case 1255: goto step_next;
        case 1256: _wait();_mread(cpu->wz);goto step_next;
        case 1257: cpu->sph=_gd();goto step_next;
        // -- overlapped
        case 1258: goto fetch_next;
        
        // ED 7E: IM 2 (M:1 T:4)
        // -- overlapped
        case 1259: cpu->im=2;goto fetch_next;
        
        // ED A0: LDI (M:4 T:12)
        // -- mread
        case 1260: goto step_next;
        case 1261: _wait();_mread(cpu->hl++);goto step_next;
        case 1262: cpu->dlatch=_gd();goto step_next;
        // -- mwrite
        case 1263: goto step_next;
        case 1264: _wait();_mwrite(cpu->de++,cpu->dlatch);goto step_next;
        case 1265: goto step_next;
        // -- generic
        case 1266: _z80_ldi_ldd(cpu,cpu->dlatch);goto step_next;
        case 1267: goto step_next;
        // -- overlapped
        case 1268: goto fetch_next;
        
        // ED A1: CPI (M:3 T:12)
        // -- mread
        case 1269: goto step_next;
        case 1270: _wait();_mread(cpu->hl++);goto step_next;
        case 1271: cpu->dlatch=_gd();goto step_next;
        // -- generic
        case 1272: cpu->wz++;_z80_cpi_cpd(cpu,cpu->dlatch);goto step_next;
        case 1273: goto step_next;
        case 1274: goto step_next;
        case 1275: goto step_next;
        case 1276: goto step_next;
        // -- overlapped
        case 1277: goto fetch_next;
        
        // ED A2: INI (M:4 T:12)
        // -- generic
        case 1278: goto step_next;
        // -- ioread
        case 1279: goto step_next;
        case 1280: goto step_next;
        case 1281: _wait();_ioread(cpu->bc);goto step_next;
        case 1282: cpu->dlatch=_gd();cpu->wz=cpu->bc+1;cpu->b--;;goto step_next;
        // -- mwrite
        case 1283: goto step_next;
        case 1284: _wait();_mwrite(cpu->hl++,cpu->dlatch);_z80_ini_ind(cpu,cpu->dlatch,cpu->c+1);goto step_next;
        case 1285: goto step_next;
        // -- overlapped
        case 1286: goto fetch_next;
        
        // ED A3: OUTI (M:4 T:12)
        // -- generic
        case 1287: goto step_next;
        // -- mread
        case 1288: goto step_next;
        case 1289: _wait();_mread(cpu->hl++);goto step_next;
        case 1290: cpu->dlatch=_gd();cpu->b--;goto step_next;
        // -- iowrite
        case 1291: goto step_next;
        case 1292: _iowrite(cpu->bc,cpu->dlatch);goto step_next;
        case 1293: _wait();cpu->wz=cpu->bc+1;_z80_outi_outd(cpu,cpu->dlatch);goto step_next;
        case 1294: goto step_next;
        // -- overlapped
        case 1295: goto fetch_next;
        
        // ED A8: LDD (M:4 T:12)
        // -- mread
        case 1296: goto step_next;
        case 1297: _wait();_mread(cpu->hl--);goto step_next;
        case 1298: cpu->dlatch=_gd();goto step_next;
        // -- mwrite
        case 1299: goto step_next;
        case 1300: _wait();_mwrite(cpu->de--,cpu->dlatch);goto step_next;
        case 1301: goto step_next;
        // -- generic
        case 1302: _z80_ldi_ldd(cpu,cpu->dlatch);goto step_next;
        case 1303: goto step_next;
        // -- overlapped
        case 1304: goto fetch_next;
        
        // ED A9: CPD (M:3 T:12)
        // -- mread
        case 1305: goto step_next;
        case 1306: _wait();_mread(cpu->hl--);goto step_next;
        case 1307: cpu->dlatch=_gd();goto step_next;
        // -- generic
        case 1308: cpu->wz--;_z80_cpi_cpd(cpu,cpu->dlatch);goto step_next;
        case 1309: goto step_next;
        case 1310: goto step_next;
        case 1311: goto step_next;
        case 1312: goto step_next;
        // -- overlapped
        case 1313: goto fetch_next;
        
        // ED AA: IND (M:4 T:12)
        // -- generic
        case 1314: goto step_next;
        // -- ioread
        case 1315: goto step_next;
        case 1316: goto step_next;
        case 1317: _wait();_ioread(cpu->bc);goto step_next;
        case 1318: cpu->dlatch=_gd();cpu->wz=cpu->bc-1;cpu->b--;;goto step_next;
        // -- mwrite
        case 1319: goto step_next;
        case 1320: _wait();_mwrite(cpu->hl--,cpu->dlatch);_z80_ini_ind(cpu,cpu->dlatch,cpu->c-1);goto step_next;
        case 1321: goto step_next;
        // -- overlapped
        case 1322: goto fetch_next;
        
        // ED AB: OUTD (M:4 T:12)
        // -- generic
        case 1323: goto step_next;
        // -- mread
        case 1324: goto step_next;
        case 1325: _wait();_mread(cpu->hl--);goto step_next;
        case 1326: cpu->dlatch=_gd();cpu->b--;goto step_next;
        // -- iowrite
        case 1327: goto step_next;
        case 1328: _iowrite(cpu->bc,cpu->dlatch);goto step_next;
        case 1329: _wait();cpu->wz=cpu->bc-1;_z80_outi_outd(cpu,cpu->dlatch);goto step_next;
        case 1330: goto step_next;
        // -- overlapped
        case 1331: goto fetch_next;
        
        // ED B0: LDIR (M:5 T:17)
        // -- mread
        case 1332: goto step_next;
        case 1333: _wait();_mread(cpu->hl++);goto step_next;
        case 1334: cpu->dlatch=_gd();goto step_next;
        // -- mwrite
        case 1335: goto step_next;
        case 1336: _wait();_mwrite(cpu->de++,cpu->dlatch);goto step_next;
        case 1337: goto step_next;
        // -- generic
        case 1338: if(!_z80_ldi_ldd(cpu,cpu->dlatch)){_skip(5);};goto step_next;
        case 1339: goto step_next;
        // -- generic
        case 1340: cpu->wz=--cpu->pc;--cpu->pc;;goto step_next;
        case 1341: goto step_next;
        case 1342: goto step_next;
        case 1343: goto step_next;
        case 1344: goto step_next;
        // -- overlapped
        case 1345: goto fetch_next;
        
        // ED B1: CPIR (M:4 T:17)
        // -- mread
        case 1346: goto step_next;
        case 1347: _wait();_mread(cpu->hl++);goto step_next;
        case 1348: cpu->dlatch=_gd();goto step_next;
        // -- generic
        case 1349: cpu->wz++;if(!_z80_cpi_cpd(cpu,cpu->dlatch)){_skip(5);};goto step_next;
        case 1350: goto step_next;
        case 1351: goto step_next;
        case 1352: goto step_next;
        case 1353: goto step_next;
        // -- generic
        case 1354: cpu->wz=--cpu->pc;--cpu->pc;goto step_next;
        case 1355: goto step_next;
        case 1356: goto step_next;
        case 1357: goto step_next;
        case 1358: goto step_next;
        // -- overlapped
        case 1359: goto fetch_next;
        
        // ED B2: INIR (M:5 T:17)
        // -- generic
        case 1360: goto step_next;
        // -- ioread
        case 1361: goto step_next;
        case 1362: goto step_next;
        case 1363: _wait();_ioread(cpu->bc);goto step_next;
        case 1364: cpu->dlatch=_gd();cpu->wz=cpu->bc+1;cpu->b--;;goto step_next;
        // -- mwrite
        case 1365: goto step_next;
        case 1366: _wait();_mwrite(cpu->hl++,cpu->dlatch);if (!_z80_ini_ind(cpu,cpu->dlatch,cpu->c+1)){_skip(5);};goto step_next;
        case 1367: goto step_next;
        // -- generic
        case 1368: cpu->wz=--cpu->pc;--cpu->pc;goto step_next;
        case 1369: goto step_next;
        case 1370: goto step_next;
        case 1371: goto step_next;
        case 1372: goto step_next;
        // -- overlapped
        case 1373: goto fetch_next;
        
        // ED B3: OTIR (M:5 T:17)
        // -- generic
        case 1374: goto step_next;
        // -- mread
        case 1375: goto step_next;
        case 1376: _wait();_mread(cpu->hl++);goto step_next;
        case 1377: cpu->dlatch=_gd();cpu->b--;goto step_next;
        // -- iowrite
        case 1378: goto step_next;
        case 1379: _iowrite(cpu->bc,cpu->dlatch);goto step_next;
        case 1380: _wait();cpu->wz=cpu->bc+1;if(!_z80_outi_outd(cpu,cpu->dlatch)){_skip(5);};goto step_next;
        case 1381: goto step_next;
        // -- generic
        case 1382: cpu->wz=--cpu->pc;--cpu->pc;goto step_next;
        case 1383: goto step_next;
        case 1384: goto step_next;
        case 1385: goto step_next;
        case 1386: goto step_next;
        // -- overlapped
        case 1387: goto fetch_next;
        
        // ED B8: LDDR (M:5 T:17)
        // -- mread
        case 1388: goto step_next;
        case 1389: _wait();_mread(cpu->hl--);goto step_next;
        case 1390: cpu->dlatch=_gd();goto step_next;
        // -- mwrite
        case 1391: goto step_next;
        case 1392: _wait();_mwrite(cpu->de--,cpu->dlatch);goto step_next;
        case 1393: goto step_next;
        // -- generic
        case 1394: if(!_z80_ldi_ldd(cpu,cpu->dlatch)){_skip(5);};goto step_next;
        case 1395: goto step_next;
        // -- generic
        case 1396: cpu->wz=--cpu->pc;--cpu->pc;;goto step_next;
        case 1397: goto step_next;
        case 1398: goto step_next;
        case 1399: goto step_next;
        case 1400: goto step_next;
        // -- overlapped
        case 1401: goto fetch_next;
        
        // ED B9: CPDR (M:4 T:17)
        // -- mread
        case 1402: goto step_next;
        case 1403: _wait();_mread(cpu->hl--);goto step_next;
        case 1404: cpu->dlatch=_gd();goto step_next;
        // -- generic
        case 1405: cpu->wz--;if(!_z80_cpi_cpd(cpu,cpu->dlatch)){_skip(5);};goto step_next;
        case 1406: goto step_next;
        case 1407: goto step_next;
        case 1408: goto step_next;
        case 1409: goto step_next;
        // -- generic
        case 1410: cpu->wz=--cpu->pc;--cpu->pc;goto step_next;
        case 1411: goto step_next;
        case 1412: goto step_next;
        case 1413: goto step_next;
        case 1414: goto step_next;
        // -- overlapped
        case 1415: goto fetch_next;
        
        // ED BA: INDR (M:5 T:17)
        // -- generic
        case 1416: goto step_next;
        // -- ioread
        case 1417: goto step_next;
        case 1418: goto step_next;
        case 1419: _wait();_ioread(cpu->bc);goto step_next;
        case 1420: cpu->dlatch=_gd();cpu->wz=cpu->bc-1;cpu->b--;;goto step_next;
        // -- mwrite
        case 1421: goto step_next;
        case 1422: _wait();_mwrite(cpu->hl--,cpu->dlatch);if (!_z80_ini_ind(cpu,cpu->dlatch,cpu->c-1)){_skip(5);};goto step_next;
        case 1423: goto step_next;
        // -- generic
        case 1424: cpu->wz=--cpu->pc;--cpu->pc;goto step_next;
        case 1425: goto step_next;
        case 1426: goto step_next;
        case 1427: goto step_next;
        case 1428: goto step_next;
        // -- overlapped
        case 1429: goto fetch_next;
        
        // ED BB: OTDR (M:5 T:17)
        // -- generic
        case 1430: goto step_next;
        // -- mread
        case 1431: goto step_next;
        case 1432: _wait();_mread(cpu->hl--);goto step_next;
        case 1433: cpu->dlatch=_gd();cpu->b--;goto step_next;
        // -- iowrite
        case 1434: goto step_next;
        case 1435: _iowrite(cpu->bc,cpu->dlatch);goto step_next;
        case 1436: _wait();cpu->wz=cpu->bc-1;if(!_z80_outi_outd(cpu,cpu->dlatch)){_skip(5);};goto step_next;
        case 1437: goto step_next;
        // -- generic
        case 1438: cpu->wz=--cpu->pc;--cpu->pc;goto step_next;
        case 1439: goto step_next;
        case 1440: goto step_next;
        case 1441: goto step_next;
        case 1442: goto step_next;
        // -- overlapped
        case 1443: goto fetch_next;
        
        // CB 00: cb (M:1 T:4)
        // -- overlapped
        case 1444: {uint8_t z=cpu->opcode&7;_z80_cb_action(cpu,z,z);};goto fetch_next;
        
        // CB 00: cbhl (M:3 T:11)
        // -- mread
        case 1445: goto step_next;
        case 1446: _wait();_mread(cpu->hl);goto step_next;
        case 1447: cpu->dlatch=_gd();if(!_z80_cb_action(cpu,6,6)){_skip(3);};goto step_next;
        case 1448: goto step_next;
        // -- mwrite
        case 1449: goto step_next;
        case 1450: _wait();_mwrite(cpu->hl,cpu->dlatch);goto step_next;
        case 1451: goto step_next;
        // -- overlapped
        case 1452: goto fetch_next;
        
        // CB 00: ddfdcb (M:6 T:18)
        // -- generic
        case 1453: _wait();_mread(cpu->pc++);goto step_next;
        // -- generic
        case 1454: _z80_ddfdcb_addr(cpu,pins);goto step_next;
        // -- mread
        case 1455: goto step_next;
        case 1456: _wait();_mread(cpu->pc++);goto step_next;
        case 1457: cpu->opcode=_gd();goto step_next;
        case 1458: goto step_next;
        case 1459: goto step_next;
        // -- mread
        case 1460: goto step_next;
        case 1461: _wait();_mread(cpu->addr);goto step_next;
        case 1462: cpu->dlatch=_gd();if(!_z80_cb_action(cpu,6,cpu->opcode&7)){_skip(3);};goto step_next;
        case 1463: goto step_next;
        // -- mwrite
        case 1464: goto step_next;
        case 1465: _wait();_mwrite(cpu->addr,cpu->dlatch);goto step_next;
        case 1466: goto step_next;
        // -- overlapped
        case 1467: goto fetch_next;
        
        //  00: int_im0 (M:6 T:9)
        // -- generic
        case 1468: cpu->iff1=cpu->iff2=false;goto step_next;
        // -- generic
        case 1469: pins|=(Z80_M1|Z80_IORQ);goto step_next;
        // -- generic
        case 1470: _wait();cpu->opcode=_z80_get_db(pins);goto step_next;
        // -- generic
        case 1471: pins=_z80_refresh(cpu,pins);goto step_next;
        // -- generic
        case 1472: cpu->step=_z80_optable[cpu->opcode]; cpu->addr=cpu->hl;goto step_next;
        // -- overlapped
        case 1473: goto fetch_next;
        
        //  00: int_im1 (M:7 T:16)
        // -- generic
        case 1474: cpu->iff1=cpu->iff2=false;goto step_next;
        // -- generic
        case 1475: pins|=(Z80_M1|Z80_IORQ);goto step_next;
        // -- generic
        case 1476: _wait();goto step_next;
        // -- generic
        case 1477: pins=_z80_refresh(cpu,pins);goto step_next;
        case 1478: goto step_next;
        case 1479: goto step_next;
        // -- mwrite
        case 1480: goto step_next;
        case 1481: _wait();_mwrite(--cpu->sp,cpu->pch);goto step_next;
        case 1482: goto step_next;
        // -- mwrite
        case 1483: goto step_next;
        case 1484: _wait();_mwrite(--cpu->sp,cpu->pcl);cpu->wz=cpu->pc=0x0038;goto step_next;
        case 1485: goto step_next;
        // -- overlapped
        case 1486: goto fetch_next;
        
        //  00: int_im2 (M:9 T:22)
        // -- generic
        case 1487: cpu->iff1=cpu->iff2=false;goto step_next;
        // -- generic
        case 1488: pins|=(Z80_M1|Z80_IORQ);goto step_next;
        // -- generic
        case 1489: _wait();cpu->dlatch=_z80_get_db(pins);goto step_next;
        // -- generic
        case 1490: pins=_z80_refresh(cpu,pins);goto step_next;
        case 1491: goto step_next;
        case 1492: goto step_next;
        // -- mwrite
        case 1493: goto step_next;
        case 1494: _wait();_mwrite(--cpu->sp,cpu->pch);goto step_next;
        case 1495: goto step_next;
        // -- mwrite
        case 1496: goto step_next;
        case 1497: _wait();_mwrite(--cpu->sp,cpu->pcl);cpu->wzl=cpu->dlatch;cpu->wzh=cpu->i;goto step_next;
        case 1498: goto step_next;
        // -- mread
        case 1499: goto step_next;
        case 1500: _wait();_mread(cpu->wz++);goto step_next;
        case 1501: cpu->dlatch=_gd();goto step_next;
        // -- mread
        case 1502: goto step_next;
        case 1503: _wait();_mread(cpu->wz);goto step_next;
        case 1504: cpu->wzh=_gd();cpu->wzl=cpu->dlatch;cpu->pc=cpu->wz;goto step_next;
        // -- overlapped
        case 1505: goto fetch_next;
        
        //  00: nmi (M:5 T:14)
        // -- generic
        case 1506: _wait();cpu->iff1=false;goto step_next;
        // -- generic
        case 1507: pins=_z80_refresh(cpu,pins);goto step_next;
        case 1508: goto step_next;
        case 1509: goto step_next;
        // -- mwrite
        case 1510: goto step_next;
        case 1511: _wait();_mwrite(--cpu->sp,cpu->pch);goto step_next;
        case 1512: goto step_next;
        // -- mwrite
        case 1513: goto step_next;
        case 1514: _wait();_mwrite(--cpu->sp,cpu->pcl);cpu->wz=cpu->pc=0x0066;goto step_next;
        case 1515: goto step_next;
        // -- overlapped
        case 1516: goto fetch_next;

        default: _Z80_UNREACHABLE;
    }
fetch_next: pins = _z80_fetch(cpu, pins);
step_next:  cpu->step += 1;
track_int_bits: {
        // track NMI 0 => 1 edge and current INT pin state, this will track the
        // relevant interrupt status up to the last instruction cycle and will
        // be checked in the first M1 cycle (during _fetch)
        const uint64_t rising_nmi = (pins ^ cpu->pins) & pins; // NMI 0 => 1
        cpu->pins = pins;
        cpu->int_bits = ((cpu->int_bits | rising_nmi) & Z80_NMI) | (pins & Z80_INT);
    }
    return pins;
}

#undef _sa
#undef _sax
#undef _sad
#undef _sadx
#undef _gd
#undef _skip
#undef _fetch_dd
#undef _fetch_fd
#undef _fetch_ed
#undef _fetch_cb
#undef _mread
#undef _mwrite
#undef _ioread
#undef _iowrite
#undef _wait
#undef _cc_nz
#undef _cc_z
#undef _cc_nc
#undef _cc_c
#undef _cc_po
#undef _cc_pe
#undef _cc_p
#undef _cc_m

#endif // CHIPS_IMPL
