Pointer-ified the lr35902 core.

This commit is contained in:
Aaron Giles 2008-12-10 17:50:50 +00:00
parent 5f39c19227
commit 540f1eefb4
4 changed files with 880 additions and 888 deletions

View File

@ -45,9 +45,9 @@
#define FLAG_H 0x20
#define FLAG_C 0x10
#define CYCLES_PASSED(X) lr35902_ICount -= ((X) / (Regs.w.gb_speed)); \
if ( Regs.w.timer_fired_func ) { \
Regs.w.timer_fired_func( X ); \
#define CYCLES_PASSED(X) cpustate->w.icount -= ((X) / (cpustate->w.gb_speed)); \
if ( cpustate->w.timer_fired_func ) { \
cpustate->w.timer_fired_func( cpustate->w.device, X ); \
}
typedef struct {
@ -66,8 +66,9 @@ typedef struct {
cpu_irq_callback irq_callback;
const device_config *device;
const address_space *program;
int icount;
/* Timer stuff */
void (*timer_fired_func)(int cycles);
lr35902_timer_fired_func timer_fired_func;
/* Fetch & execute related */
int execution_state;
UINT8 op;
@ -105,14 +106,14 @@ typedef struct {
} lr35902_8BitRegs;
#endif
typedef union {
typedef union _lr35902_state lr35902_state;
union _lr35902_state {
lr35902_16BitRegs w;
lr35902_8BitRegs b;
} lr35902_regs;
};
typedef int (*OpcodeEmulator) (void);
static lr35902_regs Regs;
typedef int (*OpcodeEmulator) (lr35902_state *cpustate);
#define IME 0x01
#define HALTED 0x02
@ -121,25 +122,22 @@ static lr35902_regs Regs;
/* Memory functions */
/****************************************************************************/
#define mem_ReadByte(A) ((UINT8)memory_read_byte_8le(Regs.w.program,A))
#define mem_WriteByte(A,V) (memory_write_byte_8le(Regs.w.program,A,V))
#define mem_ReadByte(cs,A) ((UINT8)memory_read_byte_8le((cs)->w.program,A))
#define mem_WriteByte(cs,A,V) (memory_write_byte_8le((cs)->w.program,A,V))
INLINE UINT16 mem_ReadWord (UINT32 address)
INLINE UINT16 mem_ReadWord (lr35902_state *cpustate, UINT32 address)
{
UINT16 value = (UINT16) mem_ReadByte ((address + 1) & 0xffff) << 8;
value |= mem_ReadByte (address);
UINT16 value = (UINT16) mem_ReadByte (cpustate, (address + 1) & 0xffff) << 8;
value |= mem_ReadByte (cpustate, address);
return value;
}
INLINE void mem_WriteWord (UINT32 address, UINT16 value)
INLINE void mem_WriteWord (lr35902_state *cpustate, UINT32 address, UINT16 value)
{
mem_WriteByte (address, value & 0xFF);
mem_WriteByte ((address + 1) & 0xffff, value >> 8);
mem_WriteByte (cpustate, address, value & 0xFF);
mem_WriteByte (cpustate, (address + 1) & 0xffff, value >> 8);
}
/* Nr of cycles to run */
static int lr35902_ICount;
static const int Cycles[256] =
{
4,12, 8, 8, 4, 4, 8, 4,20, 8, 8, 8, 4, 4, 8, 4,
@ -182,65 +180,69 @@ static const int CyclesCB[256] =
static CPU_INIT( lr35902 )
{
Regs.w.config = (const lr35902_cpu_core *) device->static_config;
Regs.w.irq_callback = irqcallback;
Regs.w.device = device;
Regs.w.program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
lr35902_state *cpustate = device->token;
cpustate->w.config = (const lr35902_cpu_core *) device->static_config;
cpustate->w.irq_callback = irqcallback;
cpustate->w.device = device;
cpustate->w.program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
}
/*** Reset lr353902 registers: ******************************/
/*** This function can be used to reset the register ***/
/*** file before starting execution with lr35902_execute()***/
/*** file before starting execution with lr35902_execute(cpustate)***/
/*** It sets the registers to their initial values. ***/
/************************************************************/
static CPU_RESET( lr35902 )
{
Regs.w.AF = 0x0000;
Regs.w.BC = 0x0000;
Regs.w.DE = 0x0000;
Regs.w.HL = 0x0000;
Regs.w.SP = 0x0000;
Regs.w.PC = 0x0000;
Regs.w.timer_fired_func = NULL;
Regs.w.features = LR35902_FEATURE_HALT_BUG;
if (Regs.w.config)
{
if ( Regs.w.config->regs ) {
Regs.w.AF = Regs.w.config->regs[0];
Regs.w.BC = Regs.w.config->regs[1];
Regs.w.DE = Regs.w.config->regs[2];
Regs.w.HL = Regs.w.config->regs[3];
Regs.w.SP = Regs.w.config->regs[4];
Regs.w.PC = Regs.w.config->regs[5];
}
Regs.w.timer_fired_func = Regs.w.config->timer_fired_func;
Regs.w.features = Regs.w.config->features;
}
Regs.w.enable = 0;
Regs.w.IE = 0;
Regs.w.IF = 0;
lr35902_state *cpustate = device->token;
Regs.w.execution_state = 0;
Regs.w.doHALTbug = 0;
Regs.w.ei_delay = 0;
Regs.w.gb_speed_change_pending = 0;
Regs.w.gb_speed = 1;
cpustate->w.AF = 0x0000;
cpustate->w.BC = 0x0000;
cpustate->w.DE = 0x0000;
cpustate->w.HL = 0x0000;
cpustate->w.SP = 0x0000;
cpustate->w.PC = 0x0000;
cpustate->w.timer_fired_func = NULL;
cpustate->w.features = LR35902_FEATURE_HALT_BUG;
if (cpustate->w.config)
{
if ( cpustate->w.config->regs ) {
cpustate->w.AF = cpustate->w.config->regs[0];
cpustate->w.BC = cpustate->w.config->regs[1];
cpustate->w.DE = cpustate->w.config->regs[2];
cpustate->w.HL = cpustate->w.config->regs[3];
cpustate->w.SP = cpustate->w.config->regs[4];
cpustate->w.PC = cpustate->w.config->regs[5];
}
cpustate->w.timer_fired_func = cpustate->w.config->timer_fired_func;
cpustate->w.features = cpustate->w.config->features;
}
cpustate->w.enable = 0;
cpustate->w.IE = 0;
cpustate->w.IF = 0;
cpustate->w.execution_state = 0;
cpustate->w.doHALTbug = 0;
cpustate->w.ei_delay = 0;
cpustate->w.gb_speed_change_pending = 0;
cpustate->w.gb_speed = 1;
}
INLINE void lr35902_ProcessInterrupts (void)
INLINE void lr35902_ProcessInterrupts (lr35902_state *cpustate)
{
UINT8 irq = Regs.w.IE & Regs.w.IF;
UINT8 irq = cpustate->w.IE & cpustate->w.IF;
/* Interrupts should be taken after the first instruction after an EI instruction */
if (Regs.w.ei_delay) {
Regs.w.ei_delay = 0;
if (cpustate->w.ei_delay) {
cpustate->w.ei_delay = 0;
return;
}
/*
logerror("Attempting to process LR35902 Interrupt IRQ $%02X\n", irq);
logerror("Attempting to process LR35902 Interrupt IE $%02X\n", Regs.w.IE);
logerror("Attempting to process LR35902 Interrupt IF $%02X\n", Regs.w.IF);
logerror("Attempting to process LR35902 Interrupt IE $%02X\n", cpustate->w.IE);
logerror("Attempting to process LR35902 Interrupt IF $%02X\n", cpustate->w.IF);
*/
if (irq)
{
@ -253,17 +255,17 @@ INLINE void lr35902_ProcessInterrupts (void)
{
if( irq & (1<<irqline) )
{
if (Regs.w.enable & HALTED)
if (cpustate->w.enable & HALTED)
{
Regs.w.enable &= ~HALTED;
Regs.w.IF &= ~(1 << irqline);
Regs.w.PC++;
if ( Regs.w.features & LR35902_FEATURE_HALT_BUG ) {
if ( ! Regs.w.enable & IME ) {
cpustate->w.enable &= ~HALTED;
cpustate->w.IF &= ~(1 << irqline);
cpustate->w.PC++;
if ( cpustate->w.features & LR35902_FEATURE_HALT_BUG ) {
if ( ! cpustate->w.enable & IME ) {
/* Old cpu core (dmg/mgb/sgb) */
/* check if the HALT bug should be performed */
if ( Regs.w.haltIFstatus ) {
Regs.w.doHALTbug = 1;
if ( cpustate->w.haltIFstatus ) {
cpustate->w.doHALTbug = 1;
}
}
} else {
@ -275,16 +277,16 @@ INLINE void lr35902_ProcessInterrupts (void)
}
}
}
if ( Regs.w.enable & IME ) {
if ( Regs.w.irq_callback )
(*Regs.w.irq_callback)(Regs.w.device, irqline);
Regs.w.enable &= ~IME;
Regs.w.IF &= ~(1 << irqline);
if ( cpustate->w.enable & IME ) {
if ( cpustate->w.irq_callback )
(*cpustate->w.irq_callback)(cpustate->w.device, irqline);
cpustate->w.enable &= ~IME;
cpustate->w.IF &= ~(1 << irqline);
CYCLES_PASSED( 20 );
Regs.w.SP -= 2;
mem_WriteWord (Regs.w.SP, Regs.w.PC);
Regs.w.PC = 0x40 + irqline * 8;
/*logerror("LR35902 Interrupt PC $%04X\n", Regs.w.PC );*/
cpustate->w.SP -= 2;
mem_WriteWord (cpustate, cpustate->w.SP, cpustate->w.PC);
cpustate->w.PC = 0x40 + irqline * 8;
/*logerror("LR35902 Interrupt PC $%04X\n", cpustate->w.PC );*/
return;
}
}
@ -298,100 +300,86 @@ INLINE void lr35902_ProcessInterrupts (void)
/************************************************************/
static CPU_EXECUTE( lr35902 )
{
lr35902_ICount = cycles;
lr35902_state *cpustate = device->token;
cpustate->w.icount = cycles;
do
{
if ( Regs.w.execution_state ) {
if ( cpustate->w.execution_state ) {
UINT8 x;
/* Execute instruction */
switch( Regs.w.op ) {
switch( cpustate->w.op ) {
#include "opc_main.h"
}
} else {
/* Fetch and count cycles */
lr35902_ProcessInterrupts ();
debugger_instruction_hook(device, Regs.w.PC);
if ( Regs.w.enable & HALTED ) {
lr35902_ProcessInterrupts (cpustate);
debugger_instruction_hook(device, cpustate->w.PC);
if ( cpustate->w.enable & HALTED ) {
CYCLES_PASSED( Cycles[0x76] );
Regs.w.execution_state = 1;
cpustate->w.execution_state = 1;
} else {
Regs.w.op = mem_ReadByte (Regs.w.PC++);
if ( Regs.w.doHALTbug ) {
Regs.w.PC--;
Regs.w.doHALTbug = 0;
cpustate->w.op = mem_ReadByte (cpustate, cpustate->w.PC++);
if ( cpustate->w.doHALTbug ) {
cpustate->w.PC--;
cpustate->w.doHALTbug = 0;
}
CYCLES_PASSED( Cycles[Regs.w.op] );
CYCLES_PASSED( Cycles[cpustate->w.op] );
}
}
Regs.w.execution_state ^= 1;
} while (lr35902_ICount > 0);
cpustate->w.execution_state ^= 1;
} while (cpustate->w.icount > 0);
return cycles - lr35902_ICount;
return cycles - cpustate->w.icount;
}
static CPU_BURN( lr35902 )
{
lr35902_state *cpustate = device->token;
if( cycles > 0 )
{
/* NOP takes 4 cycles per instruction */
int n = (cycles + 3) / 4;
lr35902_ICount -= 4 * n;
cpustate->w.icount -= 4 * n;
}
}
/****************************************************************************/
/* Set all registers to given values */
/****************************************************************************/
static CPU_SET_CONTEXT( lr35902 )
{
if( src )
Regs = *(lr35902_regs *)src;
}
/****************************************************************************/
/* Get all registers in given buffer */
/****************************************************************************/
static CPU_GET_CONTEXT( lr35902 )
{
if( dst )
*(lr35902_regs *)dst = Regs;
}
static void lr35902_set_irq_line (int irqline, int state)
static void lr35902_set_irq_line (lr35902_state *cpustate, int irqline, int state)
{
/*logerror("setting irq line 0x%02x state 0x%08x\n", irqline, state);*/
//if( Regs.w.irq_state == state )
//if( cpustate->w.irq_state == state )
// return;
Regs.w.irq_state = state;
cpustate->w.irq_state = state;
if( state == ASSERT_LINE )
{
Regs.w.IF |= (0x01 << irqline);
/*logerror("LR35902 assert irq line %d ($%02X)\n", irqline, Regs.w.IF);*/
cpustate->w.IF |= (0x01 << irqline);
/*logerror("LR35902 assert irq line %d ($%02X)\n", irqline, cpustate->w.IF);*/
}
else
{
Regs.w.IF &= ~(0x01 << irqline);
/*logerror("LR35902 clear irq line %d ($%02X)\n", irqline, Regs.w.IF);*/
cpustate->w.IF &= ~(0x01 << irqline);
/*logerror("LR35902 clear irq line %d ($%02X)\n", irqline, cpustate->w.IF);*/
}
}
#ifdef UNUSED_FUNCTION
static void lr35902_clear_pending_interrupts (void)
static void lr35902_clear_pending_interrupts (lr35902_state *cpustate)
{
Regs.w.IF = 0;
cpustate->w.IF = 0;
}
#endif
static CPU_SET_INFO( lr35902 )
{
lr35902_state *cpustate = device->token;
switch (state)
{
/* --- the following bits of info are set as 64-bit signed integers --- */
@ -399,29 +387,31 @@ static CPU_SET_INFO( lr35902 )
case CPUINFO_INT_INPUT_STATE + 1:
case CPUINFO_INT_INPUT_STATE + 2:
case CPUINFO_INT_INPUT_STATE + 3:
case CPUINFO_INT_INPUT_STATE + 4: lr35902_set_irq_line(state-CPUINFO_INT_INPUT_STATE, info->i); break;
case CPUINFO_INT_INPUT_STATE + 4: lr35902_set_irq_line(cpustate, state-CPUINFO_INT_INPUT_STATE, info->i); break;
case CPUINFO_INT_SP: Regs.w.SP = info->i; break;
case CPUINFO_INT_PC: Regs.w.PC = info->i; break;
case CPUINFO_INT_SP: cpustate->w.SP = info->i; break;
case CPUINFO_INT_PC: cpustate->w.PC = info->i; break;
case CPUINFO_INT_REGISTER + LR35902_PC: Regs.w.PC = info->i; break;
case CPUINFO_INT_REGISTER + LR35902_SP: Regs.w.SP = info->i; break;
case CPUINFO_INT_REGISTER + LR35902_AF: Regs.w.AF = info->i; break;
case CPUINFO_INT_REGISTER + LR35902_BC: Regs.w.BC = info->i; break;
case CPUINFO_INT_REGISTER + LR35902_DE: Regs.w.DE = info->i; break;
case CPUINFO_INT_REGISTER + LR35902_HL: Regs.w.HL = info->i; break;
case CPUINFO_INT_REGISTER + LR35902_IE: Regs.w.IE = info->i; break;
case CPUINFO_INT_REGISTER + LR35902_IF: Regs.w.IF = info->i; break;
case CPUINFO_INT_REGISTER + LR35902_SPEED: Regs.w.gb_speed_change_pending = info->i & 0x01; break;
case CPUINFO_INT_REGISTER + LR35902_PC: cpustate->w.PC = info->i; break;
case CPUINFO_INT_REGISTER + LR35902_SP: cpustate->w.SP = info->i; break;
case CPUINFO_INT_REGISTER + LR35902_AF: cpustate->w.AF = info->i; break;
case CPUINFO_INT_REGISTER + LR35902_BC: cpustate->w.BC = info->i; break;
case CPUINFO_INT_REGISTER + LR35902_DE: cpustate->w.DE = info->i; break;
case CPUINFO_INT_REGISTER + LR35902_HL: cpustate->w.HL = info->i; break;
case CPUINFO_INT_REGISTER + LR35902_IE: cpustate->w.IE = info->i; break;
case CPUINFO_INT_REGISTER + LR35902_IF: cpustate->w.IF = info->i; break;
case CPUINFO_INT_REGISTER + LR35902_SPEED: cpustate->w.gb_speed_change_pending = info->i & 0x01; break;
}
}
CPU_GET_INFO( lr35902 )
{
lr35902_state *cpustate = (device != NULL) ? device->token : NULL;
switch (state)
{
/* --- the following bits of info are returned as 64-bit signed integers --- */
case CPUINFO_INT_CONTEXT_SIZE: info->i = sizeof(Regs); break;
case CPUINFO_INT_CONTEXT_SIZE: info->i = sizeof(lr35902_state); break;
case CPUINFO_INT_INPUT_LINES: info->i = 5; break;
case CPUINFO_INT_DEFAULT_IRQ_VECTOR: info->i = 0xff; break;
case CPUINFO_INT_ENDIANNESS: info->i = ENDIANNESS_LITTLE; break;
@ -442,36 +432,36 @@ CPU_GET_INFO( lr35902 )
case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_IO: info->i = 16; break;
case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_IO: info->i = 0; break;
case CPUINFO_INT_SP: info->i = Regs.w.SP; break;
case CPUINFO_INT_PC: info->i = Regs.w.PC; break;
case CPUINFO_INT_SP: info->i = cpustate->w.SP; break;
case CPUINFO_INT_PC: info->i = cpustate->w.PC; break;
case CPUINFO_INT_PREVIOUSPC: info->i = 0; /* TODO??? */ break;
case CPUINFO_INT_INPUT_STATE + 0:
case CPUINFO_INT_INPUT_STATE + 1:
case CPUINFO_INT_INPUT_STATE + 2:
case CPUINFO_INT_INPUT_STATE + 3:
case CPUINFO_INT_INPUT_STATE + 4: info->i = Regs.w.IF & (1 << (state-CPUINFO_INT_INPUT_STATE)); break;
case CPUINFO_INT_INPUT_STATE + 4: info->i = cpustate->w.IF & (1 << (state-CPUINFO_INT_INPUT_STATE)); break;
case CPUINFO_INT_REGISTER + LR35902_PC: info->i = Regs.w.PC; break;
case CPUINFO_INT_REGISTER + LR35902_SP: info->i = Regs.w.SP; break;
case CPUINFO_INT_REGISTER + LR35902_AF: info->i = Regs.w.AF; break;
case CPUINFO_INT_REGISTER + LR35902_BC: info->i = Regs.w.BC; break;
case CPUINFO_INT_REGISTER + LR35902_DE: info->i = Regs.w.DE; break;
case CPUINFO_INT_REGISTER + LR35902_HL: info->i = Regs.w.HL; break;
case CPUINFO_INT_REGISTER + LR35902_IE: info->i = Regs.w.IE; break;
case CPUINFO_INT_REGISTER + LR35902_IF: info->i = Regs.w.IF; break;
case CPUINFO_INT_REGISTER + LR35902_SPEED: info->i = 0x7E | ( ( Regs.w.gb_speed - 1 ) << 7 ) | Regs.w.gb_speed_change_pending; break;
case CPUINFO_INT_REGISTER + LR35902_PC: info->i = cpustate->w.PC; break;
case CPUINFO_INT_REGISTER + LR35902_SP: info->i = cpustate->w.SP; break;
case CPUINFO_INT_REGISTER + LR35902_AF: info->i = cpustate->w.AF; break;
case CPUINFO_INT_REGISTER + LR35902_BC: info->i = cpustate->w.BC; break;
case CPUINFO_INT_REGISTER + LR35902_DE: info->i = cpustate->w.DE; break;
case CPUINFO_INT_REGISTER + LR35902_HL: info->i = cpustate->w.HL; break;
case CPUINFO_INT_REGISTER + LR35902_IE: info->i = cpustate->w.IE; break;
case CPUINFO_INT_REGISTER + LR35902_IF: info->i = cpustate->w.IF; break;
case CPUINFO_INT_REGISTER + LR35902_SPEED: info->i = 0x7E | ( ( cpustate->w.gb_speed - 1 ) << 7 ) | cpustate->w.gb_speed_change_pending; break;
/* --- the following bits of info are returned as pointers to data or functions --- */
case CPUINFO_PTR_SET_INFO: info->setinfo = CPU_SET_INFO_NAME(lr35902); break;
case CPUINFO_PTR_GET_CONTEXT: info->getcontext = CPU_GET_CONTEXT_NAME(lr35902); break;
case CPUINFO_PTR_SET_CONTEXT: info->setcontext = CPU_SET_CONTEXT_NAME(lr35902); break;
case CPUINFO_PTR_GET_CONTEXT: info->getcontext = CPU_GET_CONTEXT_NAME(dummy); break;
case CPUINFO_PTR_SET_CONTEXT: info->setcontext = CPU_SET_CONTEXT_NAME(dummy); break;
case CPUINFO_PTR_INIT: info->init = CPU_INIT_NAME(lr35902); break;
case CPUINFO_PTR_RESET: info->reset = CPU_RESET_NAME(lr35902); break;
case CPUINFO_PTR_EXECUTE: info->execute = CPU_EXECUTE_NAME(lr35902); break;
case CPUINFO_PTR_BURN: info->burn = CPU_BURN_NAME(lr35902); break;
case CPUINFO_PTR_DISASSEMBLE: info->disassemble = CPU_DISASSEMBLE_NAME(lr35902); break;
case CPUINFO_PTR_INSTRUCTION_COUNTER: info->icount = &lr35902_ICount; break;
case CPUINFO_PTR_INSTRUCTION_COUNTER: info->icount = &cpustate->w.icount; break;
/* --- the following bits of info are returned as NULL-terminated strings --- */
case CPUINFO_STR_NAME: strcpy(info->s, "LR35902"); break;
@ -482,24 +472,24 @@ CPU_GET_INFO( lr35902 )
case CPUINFO_STR_FLAGS:
sprintf(info->s, "%c%c%c%c%c%c%c%c",
Regs.b.F & 0x80 ? 'Z':'.',
Regs.b.F & 0x40 ? 'N':'.',
Regs.b.F & 0x20 ? 'H':'.',
Regs.b.F & 0x10 ? 'C':'.',
Regs.b.F & 0x08 ? '3':'.',
Regs.b.F & 0x04 ? '2':'.',
Regs.b.F & 0x02 ? '1':'.',
Regs.b.F & 0x01 ? '0':'.');
cpustate->b.F & 0x80 ? 'Z':'.',
cpustate->b.F & 0x40 ? 'N':'.',
cpustate->b.F & 0x20 ? 'H':'.',
cpustate->b.F & 0x10 ? 'C':'.',
cpustate->b.F & 0x08 ? '3':'.',
cpustate->b.F & 0x04 ? '2':'.',
cpustate->b.F & 0x02 ? '1':'.',
cpustate->b.F & 0x01 ? '0':'.');
break;
case CPUINFO_STR_REGISTER + LR35902_PC: sprintf(info->s, "PC:%04X", Regs.w.PC); break;
case CPUINFO_STR_REGISTER + LR35902_SP: sprintf(info->s, "SP:%04X", Regs.w.SP); break;
case CPUINFO_STR_REGISTER + LR35902_AF: sprintf(info->s, "AF:%04X", Regs.w.AF); break;
case CPUINFO_STR_REGISTER + LR35902_BC: sprintf(info->s, "BC:%04X", Regs.w.BC); break;
case CPUINFO_STR_REGISTER + LR35902_DE: sprintf(info->s, "DE:%04X", Regs.w.DE); break;
case CPUINFO_STR_REGISTER + LR35902_HL: sprintf(info->s, "HL:%04X", Regs.w.HL); break;
case CPUINFO_STR_REGISTER + LR35902_IRQ_STATE: sprintf(info->s, "IRQ:%X", Regs.w.enable & IME ); break;
case CPUINFO_STR_REGISTER + LR35902_IE: sprintf(info->s, "IE:%02X", Regs.w.IE); break;
case CPUINFO_STR_REGISTER + LR35902_IF: sprintf(info->s, "IF:%02X", Regs.w.IF); break;
case CPUINFO_STR_REGISTER + LR35902_PC: sprintf(info->s, "PC:%04X", cpustate->w.PC); break;
case CPUINFO_STR_REGISTER + LR35902_SP: sprintf(info->s, "SP:%04X", cpustate->w.SP); break;
case CPUINFO_STR_REGISTER + LR35902_AF: sprintf(info->s, "AF:%04X", cpustate->w.AF); break;
case CPUINFO_STR_REGISTER + LR35902_BC: sprintf(info->s, "BC:%04X", cpustate->w.BC); break;
case CPUINFO_STR_REGISTER + LR35902_DE: sprintf(info->s, "DE:%04X", cpustate->w.DE); break;
case CPUINFO_STR_REGISTER + LR35902_HL: sprintf(info->s, "HL:%04X", cpustate->w.HL); break;
case CPUINFO_STR_REGISTER + LR35902_IRQ_STATE: sprintf(info->s, "IRQ:%X", cpustate->w.enable & IME ); break;
case CPUINFO_STR_REGISTER + LR35902_IE: sprintf(info->s, "IE:%02X", cpustate->w.IE); break;
case CPUINFO_STR_REGISTER + LR35902_IF: sprintf(info->s, "IF:%02X", cpustate->w.IF); break;
}
}

View File

@ -5,12 +5,14 @@
#include "cpuintrf.h"
typedef void (*lr35902_timer_fired_func)(const device_config *device, int cycles);
typedef struct _lr35902_cpu_core lr35902_cpu_core;
struct _lr35902_cpu_core
{
const UINT16 *regs;
UINT8 features;
void (*timer_fired_func)(int cycles);
lr35902_timer_fired_func timer_fired_func;
};
enum

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff