Сообщение от
SMT
а, это мелочь. хранить массив из 16 регистров, они же не меняются со стороны самой AY
а, круто
очередной вариант api для z80, с учетом недоработок предыдущего:
Код:
enum Z80_REG_T {regAF,regBC,regDE,regHL,regAF_,regBC_,regDE_,regHL_,regIX,regIY,regPC,regSP,regIR,regIM/*0,1 или 2*/,regIFF1,regIFF2};
typedef void (*z80_tstate_cb)();
/*последующие 4 callback'a первым аргументом принимают номер такта в шаге, на
котором производится ввод/вывод*/
typedef unsigned char (*z80_pread_cb)(unsigned char t_state, unsigned port);
typedef void (*z80_pwrite_cb)(unsigned char t_state, unsigned port, unsigned char value);
typedef unsigned char (*z80_mread_cb)(unsigned char t_state, unsigned addr);
typedef void (*z80_mwrite_cb)(unsigned char t_state, unsigned addr, unsigned char value);
struct _z80_cpu_context;
typedef struct _z80_cpu_context Z80;
/*создание и инициализация процессора.*/
Z80 *z80_create();
/*уничтожение процессора -- тешу свою страсть к разрушению ;) */
void z80_destroy(Z80 *cpu);
/*выполнение очередной команды, возвращает затраченное кол-во тактов*/
int z80_step(Z80 *cpu);
/*установка callback'a, который будет вызываться на каждом такте эмуляции*/
void z80_set_tstate_callback(Z80 *cpu, z80_tstate_cb cb_fn);
/*установка функции-callback'а на чтение из порта*/
void z80_set_pread_cb(Z80 *cpu, z80_pread_cb cb_fn);
/*установка callback'а на запись в порт*/
void z80_set_pwrite_cb(Z80 *cpu, z80_pwrite_cb cb_fn);
/*установка callback'а на чтение из памяти*/
void z80_set_mread_cb(Z80 *cpu, z80_mread_cb cb_fn);
/*установка callback'а на запись в память*/
void z80_set_mwrite_cb(Z80 *cpu, z80_mwrite_cb cb_fn);
/*прерывание, второй аргумент - код операции для IM0 %)*/
void z80_int(Z80 *cpu, unsigned char op);
/*немаскируемое прерывание*/
void z80_nmi(Z80 *cpu);
/*генерация w_states WAIT-циклов. (при этом будет w_states раз вызван
тактовый callback)
для использования в callback'ах обращения к памяти и
портам*/
void z80_w_states(Z80 *cpu, unsigned w_states);
/*сброс*/
void z80_reset(Z80 *cpu)
/*функция для получения значения регистра*/
unsigned z80_get_reg(Z80 *cpu, enum Z80_REG_T reg);
/*функция для установки значения регистра*/
unsigned z80_set_reg(Z80 *cpu, enum Z80_REG_T reg, unsigned value);
/*возвращает 1 если z80 ждет на halt'e*/
int z80_is_halted(Z80 *cpu);