Pointer-ified the saturn core.

This commit is contained in:
Aaron Giles 2008-12-10 18:24:50 +00:00
parent b3d12a2258
commit dcdfd96f1a
4 changed files with 1015 additions and 1024 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -52,7 +52,8 @@ typedef SaturnNib Saturn64[16];
/**************************************************************************** /****************************************************************************
* The SATURN registers. * The SATURN registers.
****************************************************************************/ ****************************************************************************/
typedef struct typedef struct _saturn_state saturn_state;
struct _saturn_state
{ {
saturn_cpu_core *config; saturn_cpu_core *config;
@ -78,14 +79,13 @@ typedef struct
UINT8 in_irq; /* already servicing IRQ */ UINT8 in_irq; /* already servicing IRQ */
UINT8 pending_irq; /* IRQ is pending */ UINT8 pending_irq; /* IRQ is pending */
UINT8 sleeping; /* low-consumption state */ UINT8 sleeping; /* low-consumption state */
int monitor_id;
int monitor_in;
cpu_irq_callback irq_callback; cpu_irq_callback irq_callback;
const device_config *device; const device_config *device;
const address_space *program; const address_space *program;
} Saturn_Regs; int icount;
};
static int saturn_ICount = 0;
static Saturn_Regs saturn;
/*************************************************************** /***************************************************************
* include the opcode macros, functions and tables * include the opcode macros, functions and tables
@ -102,133 +102,124 @@ static Saturn_Regs saturn;
static CPU_INIT( saturn ) static CPU_INIT( saturn )
{ {
saturn.config = (saturn_cpu_core *) device->static_config; saturn_state *cpustate = device->token;
saturn.irq_callback = irqcallback;
saturn.device = device;
saturn.program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
state_save_register_device_item_array(device, 0,saturn.reg[R0]); cpustate->config = (saturn_cpu_core *) device->static_config;
state_save_register_device_item_array(device, 0,saturn.reg[R1]); cpustate->irq_callback = irqcallback;
state_save_register_device_item_array(device, 0,saturn.reg[R2]); cpustate->device = device;
state_save_register_device_item_array(device, 0,saturn.reg[R3]); cpustate->program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
state_save_register_device_item_array(device, 0,saturn.reg[R4]);
state_save_register_device_item_array(device, 0,saturn.reg[A]); state_save_register_device_item_array(device, 0,cpustate->reg[R0]);
state_save_register_device_item_array(device, 0,saturn.reg[B]); state_save_register_device_item_array(device, 0,cpustate->reg[R1]);
state_save_register_device_item_array(device, 0,saturn.reg[C]); state_save_register_device_item_array(device, 0,cpustate->reg[R2]);
state_save_register_device_item_array(device, 0,saturn.reg[D]); state_save_register_device_item_array(device, 0,cpustate->reg[R3]);
state_save_register_device_item_array(device, 0,saturn.d); state_save_register_device_item_array(device, 0,cpustate->reg[R4]);
state_save_register_device_item(device, 0,saturn.pc); state_save_register_device_item_array(device, 0,cpustate->reg[A]);
state_save_register_device_item(device, 0,saturn.oldpc); state_save_register_device_item_array(device, 0,cpustate->reg[B]);
state_save_register_device_item_array(device, 0,saturn.rstk); state_save_register_device_item_array(device, 0,cpustate->reg[C]);
state_save_register_device_item(device, 0,saturn.out); state_save_register_device_item_array(device, 0,cpustate->reg[D]);
state_save_register_device_item(device, 0,saturn.carry); state_save_register_device_item_array(device, 0,cpustate->d);
state_save_register_device_item(device, 0,saturn.st); state_save_register_device_item(device, 0,cpustate->pc);
state_save_register_device_item(device, 0,saturn.hst); state_save_register_device_item(device, 0,cpustate->oldpc);
state_save_register_device_item(device, 0,saturn.nmi_state); state_save_register_device_item_array(device, 0,cpustate->rstk);
state_save_register_device_item(device, 0,saturn.irq_state); state_save_register_device_item(device, 0,cpustate->out);
state_save_register_device_item(device, 0,saturn.irq_enable); state_save_register_device_item(device, 0,cpustate->carry);
state_save_register_device_item(device, 0,saturn.in_irq); state_save_register_device_item(device, 0,cpustate->st);
state_save_register_device_item(device, 0,saturn.pending_irq); state_save_register_device_item(device, 0,cpustate->hst);
state_save_register_device_item(device, 0,saturn.sleeping); state_save_register_device_item(device, 0,cpustate->nmi_state);
state_save_register_device_item(device, 0,cpustate->irq_state);
state_save_register_device_item(device, 0,cpustate->irq_enable);
state_save_register_device_item(device, 0,cpustate->in_irq);
state_save_register_device_item(device, 0,cpustate->pending_irq);
state_save_register_device_item(device, 0,cpustate->sleeping);
} }
static CPU_RESET( saturn ) static CPU_RESET( saturn )
{ {
saturn.pc=0; saturn_state *cpustate = device->token;
saturn.sleeping = 0;
saturn.irq_enable = 0;
saturn.in_irq = 0;
}
static CPU_GET_CONTEXT( saturn ) cpustate->pc=0;
{ cpustate->sleeping = 0;
if( dst ) cpustate->irq_enable = 0;
*(Saturn_Regs*)dst = saturn; cpustate->in_irq = 0;
}
static CPU_SET_CONTEXT( saturn )
{
if( src )
{
saturn = *(Saturn_Regs*)src;
}
} }
INLINE void saturn_take_irq(saturn_state *cpustate)
INLINE void saturn_take_irq(void)
{ {
saturn.in_irq = 1; /* reset by software, using RTI */ cpustate->in_irq = 1; /* reset by software, using RTI */
saturn.pending_irq = 0; cpustate->pending_irq = 0;
saturn_ICount -= 7; cpustate->icount -= 7;
saturn_push(saturn.pc); saturn_push(cpustate, cpustate->pc);
saturn.pc=IRQ_ADDRESS; cpustate->pc=IRQ_ADDRESS;
LOG(("Saturn '%s' takes IRQ ($%04x)\n", saturn.device->tag, saturn.pc)); LOG(("Saturn '%s' takes IRQ ($%04x)\n", cpustate->device->tag, cpustate->pc));
if (saturn.irq_callback) (*saturn.irq_callback)(saturn.device, SATURN_IRQ_LINE); if (cpustate->irq_callback) (*cpustate->irq_callback)(cpustate->device, SATURN_IRQ_LINE);
} }
static CPU_EXECUTE( saturn ) static CPU_EXECUTE( saturn )
{ {
saturn_ICount = cycles; saturn_state *cpustate = device->token;
cpustate->icount = cycles;
do do
{ {
saturn.oldpc = saturn.pc; cpustate->oldpc = cpustate->pc;
debugger_instruction_hook(device, saturn.pc); debugger_instruction_hook(device, cpustate->pc);
if ( saturn.sleeping ) if ( cpustate->sleeping )
{ {
/* advance time when sleeping */ /* advance time when sleeping */
saturn_ICount -= 100; cpustate->icount -= 100;
} }
else else
{ {
/* takes irq */ /* takes irq */
if ( saturn.pending_irq && (!saturn.in_irq) ) if ( cpustate->pending_irq && (!cpustate->in_irq) )
saturn_take_irq(); saturn_take_irq(cpustate);
/* execute one instruction */ /* execute one instruction */
saturn_instruction(); saturn_instruction(cpustate);
} }
} while (saturn_ICount > 0); } while (cpustate->icount > 0);
return cycles - saturn_ICount; return cycles - cpustate->icount;
} }
static void saturn_set_nmi_line(int state) static void saturn_set_nmi_line(saturn_state *cpustate, int state)
{ {
if ( state == saturn.nmi_state ) return; if ( state == cpustate->nmi_state ) return;
saturn.nmi_state = state; cpustate->nmi_state = state;
if ( state != CLEAR_LINE ) if ( state != CLEAR_LINE )
{ {
LOG(( "SATURN '%s' set_nmi_line(ASSERT)\n", saturn.device->tag)); LOG(( "SATURN '%s' set_nmi_line(ASSERT)\n", cpustate->device->tag));
saturn.pending_irq = 1; cpustate->pending_irq = 1;
} }
} }
static void saturn_set_irq_line(int state) static void saturn_set_irq_line(saturn_state *cpustate, int state)
{ {
if ( state == saturn.irq_state ) return; if ( state == cpustate->irq_state ) return;
saturn.irq_state = state; cpustate->irq_state = state;
if ( state != CLEAR_LINE && saturn.irq_enable ) if ( state != CLEAR_LINE && cpustate->irq_enable )
{ {
LOG(( "SATURN '%s' set_irq_line(ASSERT)\n", saturn.device->tag)); LOG(( "SATURN '%s' set_irq_line(ASSERT)\n", cpustate->device->tag));
saturn.pending_irq = 1; cpustate->pending_irq = 1;
} }
} }
static void saturn_set_wakeup_line(int state) static void saturn_set_wakeup_line(saturn_state *cpustate, int state)
{ {
if (saturn.sleeping && state==1) if (cpustate->sleeping && state==1)
{ {
LOG(( "SATURN '%s' set_wakeup_line(ASSERT)\n", saturn.device->tag)); LOG(( "SATURN '%s' set_wakeup_line(ASSERT)\n", cpustate->device->tag));
if (saturn.irq_callback) (*saturn.irq_callback)(saturn.device, SATURN_WAKEUP_LINE); if (cpustate->irq_callback) (*cpustate->irq_callback)(cpustate->device, SATURN_WAKEUP_LINE);
saturn.sleeping = 0; cpustate->sleeping = 0;
} }
} }
@ -248,40 +239,42 @@ static void IntReg64(Saturn64 r, INT64 d)
static CPU_SET_INFO( saturn ) static CPU_SET_INFO( saturn )
{ {
saturn_state *cpustate = device->token;
switch (state) switch (state)
{ {
/* --- the following bits of info are set as 64-bit signed integers --- */ /* --- the following bits of info are set as 64-bit signed integers --- */
case CPUINFO_INT_INPUT_STATE + SATURN_NMI_LINE: saturn_set_nmi_line(info->i); break; case CPUINFO_INT_INPUT_STATE + SATURN_NMI_LINE: saturn_set_nmi_line(cpustate, info->i); break;
case CPUINFO_INT_INPUT_STATE + SATURN_IRQ_LINE: saturn_set_irq_line(info->i); break; case CPUINFO_INT_INPUT_STATE + SATURN_IRQ_LINE: saturn_set_irq_line(cpustate, info->i); break;
case CPUINFO_INT_INPUT_STATE + SATURN_WAKEUP_LINE: saturn_set_wakeup_line(info->i); break; case CPUINFO_INT_INPUT_STATE + SATURN_WAKEUP_LINE: saturn_set_wakeup_line(cpustate, info->i); break;
case CPUINFO_INT_PC: case CPUINFO_INT_PC:
case CPUINFO_INT_REGISTER + SATURN_PC: saturn.pc = info->i; break; case CPUINFO_INT_REGISTER + SATURN_PC: cpustate->pc = info->i; break;
case CPUINFO_INT_REGISTER + SATURN_D0: saturn.d[0] = info->i; break; case CPUINFO_INT_REGISTER + SATURN_D0: cpustate->d[0] = info->i; break;
case CPUINFO_INT_REGISTER + SATURN_D1: saturn.d[1] = info->i; break; case CPUINFO_INT_REGISTER + SATURN_D1: cpustate->d[1] = info->i; break;
case CPUINFO_INT_REGISTER + SATURN_A: IntReg64(saturn.reg[A], info->i); break; case CPUINFO_INT_REGISTER + SATURN_A: IntReg64(cpustate->reg[A], info->i); break;
case CPUINFO_INT_REGISTER + SATURN_B: IntReg64(saturn.reg[B], info->i); break; case CPUINFO_INT_REGISTER + SATURN_B: IntReg64(cpustate->reg[B], info->i); break;
case CPUINFO_INT_REGISTER + SATURN_C: IntReg64(saturn.reg[C], info->i); break; case CPUINFO_INT_REGISTER + SATURN_C: IntReg64(cpustate->reg[C], info->i); break;
case CPUINFO_INT_REGISTER + SATURN_D: IntReg64(saturn.reg[D], info->i); break; case CPUINFO_INT_REGISTER + SATURN_D: IntReg64(cpustate->reg[D], info->i); break;
case CPUINFO_INT_REGISTER + SATURN_R0: IntReg64(saturn.reg[R0], info->i); break; case CPUINFO_INT_REGISTER + SATURN_R0: IntReg64(cpustate->reg[R0], info->i); break;
case CPUINFO_INT_REGISTER + SATURN_R1: IntReg64(saturn.reg[R1], info->i); break; case CPUINFO_INT_REGISTER + SATURN_R1: IntReg64(cpustate->reg[R1], info->i); break;
case CPUINFO_INT_REGISTER + SATURN_R2: IntReg64(saturn.reg[R2], info->i); break; case CPUINFO_INT_REGISTER + SATURN_R2: IntReg64(cpustate->reg[R2], info->i); break;
case CPUINFO_INT_REGISTER + SATURN_R3: IntReg64(saturn.reg[R3], info->i); break; case CPUINFO_INT_REGISTER + SATURN_R3: IntReg64(cpustate->reg[R3], info->i); break;
case CPUINFO_INT_REGISTER + SATURN_R4: IntReg64(saturn.reg[R4], info->i); break; case CPUINFO_INT_REGISTER + SATURN_R4: IntReg64(cpustate->reg[R4], info->i); break;
case CPUINFO_INT_REGISTER + SATURN_P: saturn.p = info->i; break; case CPUINFO_INT_REGISTER + SATURN_P: cpustate->p = info->i; break;
case CPUINFO_INT_REGISTER + SATURN_OUT: saturn.out = info->i; break; case CPUINFO_INT_REGISTER + SATURN_OUT: cpustate->out = info->i; break;
case CPUINFO_INT_REGISTER + SATURN_CARRY: saturn.carry = info->i; break; case CPUINFO_INT_REGISTER + SATURN_CARRY: cpustate->carry = info->i; break;
case CPUINFO_INT_REGISTER + SATURN_ST: saturn.st = info->i; break; case CPUINFO_INT_REGISTER + SATURN_ST: cpustate->st = info->i; break;
case CPUINFO_INT_REGISTER + SATURN_HST: saturn.hst = info->i; break; case CPUINFO_INT_REGISTER + SATURN_HST: cpustate->hst = info->i; break;
case CPUINFO_INT_REGISTER + SATURN_RSTK0: saturn.rstk[0] = info->i; break; case CPUINFO_INT_REGISTER + SATURN_RSTK0: cpustate->rstk[0] = info->i; break;
case CPUINFO_INT_REGISTER + SATURN_RSTK1: saturn.rstk[1] = info->i; break; case CPUINFO_INT_REGISTER + SATURN_RSTK1: cpustate->rstk[1] = info->i; break;
case CPUINFO_INT_REGISTER + SATURN_RSTK2: saturn.rstk[2] = info->i; break; case CPUINFO_INT_REGISTER + SATURN_RSTK2: cpustate->rstk[2] = info->i; break;
case CPUINFO_INT_REGISTER + SATURN_RSTK3: saturn.rstk[3] = info->i; break; case CPUINFO_INT_REGISTER + SATURN_RSTK3: cpustate->rstk[3] = info->i; break;
case CPUINFO_INT_REGISTER + SATURN_RSTK4: saturn.rstk[4] = info->i; break; case CPUINFO_INT_REGISTER + SATURN_RSTK4: cpustate->rstk[4] = info->i; break;
case CPUINFO_INT_REGISTER + SATURN_RSTK5: saturn.rstk[5] = info->i; break; case CPUINFO_INT_REGISTER + SATURN_RSTK5: cpustate->rstk[5] = info->i; break;
case CPUINFO_INT_REGISTER + SATURN_RSTK6: saturn.rstk[6] = info->i; break; case CPUINFO_INT_REGISTER + SATURN_RSTK6: cpustate->rstk[6] = info->i; break;
case CPUINFO_INT_REGISTER + SATURN_RSTK7: saturn.rstk[7] = info->i; break; case CPUINFO_INT_REGISTER + SATURN_RSTK7: cpustate->rstk[7] = info->i; break;
case CPUINFO_INT_REGISTER + SATURN_SLEEPING: saturn.sleeping = info->i; case CPUINFO_INT_REGISTER + SATURN_SLEEPING: cpustate->sleeping = info->i;
} }
} }
@ -303,10 +296,12 @@ static INT64 Reg64Int(Saturn64 r)
CPU_GET_INFO( saturn ) CPU_GET_INFO( saturn )
{ {
saturn_state *cpustate = (device != NULL) ? device->token : NULL;
switch (state) switch (state)
{ {
/* --- the following bits of info are returned as 64-bit signed integers --- */ /* --- the following bits of info are returned as 64-bit signed integers --- */
case CPUINFO_INT_CONTEXT_SIZE: info->i = sizeof(saturn); break; case CPUINFO_INT_CONTEXT_SIZE: info->i = sizeof(saturn_state); break;
case CPUINFO_INT_INPUT_LINES: info->i = 1; break; case CPUINFO_INT_INPUT_LINES: info->i = 1; break;
case CPUINFO_INT_DEFAULT_IRQ_VECTOR: info->i = 0; break; case CPUINFO_INT_DEFAULT_IRQ_VECTOR: info->i = 0; break;
case CPUINFO_INT_ENDIANNESS: info->i = ENDIANNESS_LITTLE; break; case CPUINFO_INT_ENDIANNESS: info->i = ENDIANNESS_LITTLE; break;
@ -327,51 +322,51 @@ CPU_GET_INFO( saturn )
case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_IO: info->i = 0; break; case CPUINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_IO: info->i = 0; break;
case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_IO: info->i = 0; break; case CPUINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_IO: info->i = 0; break;
case CPUINFO_INT_INPUT_STATE + SATURN_NMI_LINE: info->i = saturn.nmi_state; break; case CPUINFO_INT_INPUT_STATE + SATURN_NMI_LINE: info->i = cpustate->nmi_state; break;
case CPUINFO_INT_INPUT_STATE + SATURN_IRQ_LINE: info->i = saturn.irq_state; break; case CPUINFO_INT_INPUT_STATE + SATURN_IRQ_LINE: info->i = cpustate->irq_state; break;
case CPUINFO_INT_PREVIOUSPC: info->i = saturn.oldpc; break; case CPUINFO_INT_PREVIOUSPC: info->i = cpustate->oldpc; break;
case CPUINFO_INT_PC: case CPUINFO_INT_PC:
case CPUINFO_INT_REGISTER + SATURN_PC: info->i = saturn.pc; break; case CPUINFO_INT_REGISTER + SATURN_PC: info->i = cpustate->pc; break;
case CPUINFO_INT_REGISTER + SATURN_D0: info->i = saturn.d[0]; break; case CPUINFO_INT_REGISTER + SATURN_D0: info->i = cpustate->d[0]; break;
case CPUINFO_INT_REGISTER + SATURN_D1: info->i = saturn.d[1]; break; case CPUINFO_INT_REGISTER + SATURN_D1: info->i = cpustate->d[1]; break;
case CPUINFO_INT_REGISTER + SATURN_A: info->i = Reg64Int(saturn.reg[A]); break; case CPUINFO_INT_REGISTER + SATURN_A: info->i = Reg64Int(cpustate->reg[A]); break;
case CPUINFO_INT_REGISTER + SATURN_B: info->i = Reg64Int(saturn.reg[B]); break; case CPUINFO_INT_REGISTER + SATURN_B: info->i = Reg64Int(cpustate->reg[B]); break;
case CPUINFO_INT_REGISTER + SATURN_C: info->i = Reg64Int(saturn.reg[C]); break; case CPUINFO_INT_REGISTER + SATURN_C: info->i = Reg64Int(cpustate->reg[C]); break;
case CPUINFO_INT_REGISTER + SATURN_D: info->i = Reg64Int(saturn.reg[D]); break; case CPUINFO_INT_REGISTER + SATURN_D: info->i = Reg64Int(cpustate->reg[D]); break;
case CPUINFO_INT_REGISTER + SATURN_R0: info->i = Reg64Int(saturn.reg[R0]); break; case CPUINFO_INT_REGISTER + SATURN_R0: info->i = Reg64Int(cpustate->reg[R0]); break;
case CPUINFO_INT_REGISTER + SATURN_R1: info->i = Reg64Int(saturn.reg[R1]); break; case CPUINFO_INT_REGISTER + SATURN_R1: info->i = Reg64Int(cpustate->reg[R1]); break;
case CPUINFO_INT_REGISTER + SATURN_R2: info->i = Reg64Int(saturn.reg[R2]); break; case CPUINFO_INT_REGISTER + SATURN_R2: info->i = Reg64Int(cpustate->reg[R2]); break;
case CPUINFO_INT_REGISTER + SATURN_R3: info->i = Reg64Int(saturn.reg[R3]); break; case CPUINFO_INT_REGISTER + SATURN_R3: info->i = Reg64Int(cpustate->reg[R3]); break;
case CPUINFO_INT_REGISTER + SATURN_R4: info->i = Reg64Int(saturn.reg[R4]); break; case CPUINFO_INT_REGISTER + SATURN_R4: info->i = Reg64Int(cpustate->reg[R4]); break;
case CPUINFO_INT_REGISTER + SATURN_P: info->i = saturn.p; break; case CPUINFO_INT_REGISTER + SATURN_P: info->i = cpustate->p; break;
case CPUINFO_INT_REGISTER + SATURN_OUT: info->i = saturn.out; break; case CPUINFO_INT_REGISTER + SATURN_OUT: info->i = cpustate->out; break;
case CPUINFO_INT_REGISTER + SATURN_CARRY: info->i = saturn.carry; break; case CPUINFO_INT_REGISTER + SATURN_CARRY: info->i = cpustate->carry; break;
case CPUINFO_INT_REGISTER + SATURN_ST: info->i = saturn.st; break; case CPUINFO_INT_REGISTER + SATURN_ST: info->i = cpustate->st; break;
case CPUINFO_INT_REGISTER + SATURN_HST: info->i = saturn.hst; break; case CPUINFO_INT_REGISTER + SATURN_HST: info->i = cpustate->hst; break;
case CPUINFO_INT_REGISTER + SATURN_RSTK0: info->i = saturn.rstk[0]; break; case CPUINFO_INT_REGISTER + SATURN_RSTK0: info->i = cpustate->rstk[0]; break;
case CPUINFO_INT_REGISTER + SATURN_RSTK1: info->i = saturn.rstk[1]; break; case CPUINFO_INT_REGISTER + SATURN_RSTK1: info->i = cpustate->rstk[1]; break;
case CPUINFO_INT_REGISTER + SATURN_RSTK2: info->i = saturn.rstk[2]; break; case CPUINFO_INT_REGISTER + SATURN_RSTK2: info->i = cpustate->rstk[2]; break;
case CPUINFO_INT_REGISTER + SATURN_RSTK3: info->i = saturn.rstk[3]; break; case CPUINFO_INT_REGISTER + SATURN_RSTK3: info->i = cpustate->rstk[3]; break;
case CPUINFO_INT_REGISTER + SATURN_RSTK4: info->i = saturn.rstk[4]; break; case CPUINFO_INT_REGISTER + SATURN_RSTK4: info->i = cpustate->rstk[4]; break;
case CPUINFO_INT_REGISTER + SATURN_RSTK5: info->i = saturn.rstk[5]; break; case CPUINFO_INT_REGISTER + SATURN_RSTK5: info->i = cpustate->rstk[5]; break;
case CPUINFO_INT_REGISTER + SATURN_RSTK6: info->i = saturn.rstk[6]; break; case CPUINFO_INT_REGISTER + SATURN_RSTK6: info->i = cpustate->rstk[6]; break;
case CPUINFO_INT_REGISTER + SATURN_RSTK7: info->i = saturn.rstk[7]; break; case CPUINFO_INT_REGISTER + SATURN_RSTK7: info->i = cpustate->rstk[7]; break;
case CPUINFO_INT_REGISTER + SATURN_SLEEPING: info->i = saturn.sleeping; case CPUINFO_INT_REGISTER + SATURN_SLEEPING: info->i = cpustate->sleeping;
/* --- the following bits of info are returned as pointers to data or functions --- */ /* --- the following bits of info are returned as pointers to data or functions --- */
case CPUINFO_PTR_SET_INFO: info->setinfo = CPU_SET_INFO_NAME(saturn); break; case CPUINFO_PTR_SET_INFO: info->setinfo = CPU_SET_INFO_NAME(saturn); break;
case CPUINFO_PTR_GET_CONTEXT: info->getcontext = CPU_GET_CONTEXT_NAME(saturn); 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(saturn); break; case CPUINFO_PTR_SET_CONTEXT: info->setcontext = CPU_SET_CONTEXT_NAME(dummy); break;
case CPUINFO_PTR_INIT: info->init = CPU_INIT_NAME(saturn); break; case CPUINFO_PTR_INIT: info->init = CPU_INIT_NAME(saturn); break;
case CPUINFO_PTR_RESET: info->reset = CPU_RESET_NAME(saturn); break; case CPUINFO_PTR_RESET: info->reset = CPU_RESET_NAME(saturn); break;
case CPUINFO_PTR_EXECUTE: info->execute = CPU_EXECUTE_NAME(saturn); break; case CPUINFO_PTR_EXECUTE: info->execute = CPU_EXECUTE_NAME(saturn); break;
case CPUINFO_PTR_BURN: info->burn = NULL; break; case CPUINFO_PTR_BURN: info->burn = NULL; break;
case CPUINFO_PTR_DISASSEMBLE: info->disassemble = CPU_DISASSEMBLE_NAME(saturn); break; case CPUINFO_PTR_DISASSEMBLE: info->disassemble = CPU_DISASSEMBLE_NAME(saturn); break;
case CPUINFO_PTR_INSTRUCTION_COUNTER: info->icount = &saturn_ICount; break; case CPUINFO_PTR_INSTRUCTION_COUNTER: info->icount = &cpustate->icount; break;
/* --- the following bits of info are returned as NULL-terminated strings --- */ /* --- the following bits of info are returned as NULL-terminated strings --- */
case CPUINFO_STR_NAME: strcpy(info->s, "Saturn"); break; case CPUINFO_STR_NAME: strcpy(info->s, "Saturn"); break;
@ -380,33 +375,33 @@ CPU_GET_INFO( saturn )
case CPUINFO_STR_CORE_FILE: strcpy(info->s, __FILE__); break; case CPUINFO_STR_CORE_FILE: strcpy(info->s, __FILE__); break;
case CPUINFO_STR_CORE_CREDITS: strcpy(info->s, "Copyright Peter Trauner, all rights reserved."); break; case CPUINFO_STR_CORE_CREDITS: strcpy(info->s, "Copyright Peter Trauner, all rights reserved."); break;
case CPUINFO_STR_REGISTER + SATURN_PC: sprintf(info->s, "PC: %.5x", saturn.pc);break; case CPUINFO_STR_REGISTER + SATURN_PC: sprintf(info->s, "PC: %.5x", cpustate->pc);break;
case CPUINFO_STR_REGISTER + SATURN_D0: sprintf(info->s, "D0: %.5x", saturn.d[0]);break; case CPUINFO_STR_REGISTER + SATURN_D0: sprintf(info->s, "D0: %.5x", cpustate->d[0]);break;
case CPUINFO_STR_REGISTER + SATURN_D1: sprintf(info->s, "D1: %.5x", saturn.d[1]);break; case CPUINFO_STR_REGISTER + SATURN_D1: sprintf(info->s, "D1: %.5x", cpustate->d[1]);break;
case CPUINFO_STR_REGISTER + SATURN_A: sprintf(info->s, "A: " Reg64Format, Reg64Data(saturn.reg[A]));break; case CPUINFO_STR_REGISTER + SATURN_A: sprintf(info->s, "A: " Reg64Format, Reg64Data(cpustate->reg[A]));break;
case CPUINFO_STR_REGISTER + SATURN_B: sprintf(info->s, "B: " Reg64Format, Reg64Data(saturn.reg[B]));break; case CPUINFO_STR_REGISTER + SATURN_B: sprintf(info->s, "B: " Reg64Format, Reg64Data(cpustate->reg[B]));break;
case CPUINFO_STR_REGISTER + SATURN_C: sprintf(info->s, "C: " Reg64Format, Reg64Data(saturn.reg[C]));break; case CPUINFO_STR_REGISTER + SATURN_C: sprintf(info->s, "C: " Reg64Format, Reg64Data(cpustate->reg[C]));break;
case CPUINFO_STR_REGISTER + SATURN_D: sprintf(info->s, "D: " Reg64Format, Reg64Data(saturn.reg[D]));break; case CPUINFO_STR_REGISTER + SATURN_D: sprintf(info->s, "D: " Reg64Format, Reg64Data(cpustate->reg[D]));break;
case CPUINFO_STR_REGISTER + SATURN_R0: sprintf(info->s, "R0: " Reg64Format, Reg64Data(saturn.reg[R0]));break; case CPUINFO_STR_REGISTER + SATURN_R0: sprintf(info->s, "R0: " Reg64Format, Reg64Data(cpustate->reg[R0]));break;
case CPUINFO_STR_REGISTER + SATURN_R1: sprintf(info->s, "R1: " Reg64Format, Reg64Data(saturn.reg[R1]));break; case CPUINFO_STR_REGISTER + SATURN_R1: sprintf(info->s, "R1: " Reg64Format, Reg64Data(cpustate->reg[R1]));break;
case CPUINFO_STR_REGISTER + SATURN_R2: sprintf(info->s, "R2: " Reg64Format, Reg64Data(saturn.reg[R2]));break; case CPUINFO_STR_REGISTER + SATURN_R2: sprintf(info->s, "R2: " Reg64Format, Reg64Data(cpustate->reg[R2]));break;
case CPUINFO_STR_REGISTER + SATURN_R3: sprintf(info->s, "R3: " Reg64Format, Reg64Data(saturn.reg[R3]));break; case CPUINFO_STR_REGISTER + SATURN_R3: sprintf(info->s, "R3: " Reg64Format, Reg64Data(cpustate->reg[R3]));break;
case CPUINFO_STR_REGISTER + SATURN_R4: sprintf(info->s, "R4: " Reg64Format, Reg64Data(saturn.reg[R4]));break; case CPUINFO_STR_REGISTER + SATURN_R4: sprintf(info->s, "R4: " Reg64Format, Reg64Data(cpustate->reg[R4]));break;
case CPUINFO_STR_REGISTER + SATURN_P: sprintf(info->s, "P:%x", saturn.p);break; case CPUINFO_STR_REGISTER + SATURN_P: sprintf(info->s, "P:%x", cpustate->p);break;
case CPUINFO_STR_REGISTER + SATURN_OUT: sprintf(info->s, "OUT:%.3x", saturn.out);break; case CPUINFO_STR_REGISTER + SATURN_OUT: sprintf(info->s, "OUT:%.3x", cpustate->out);break;
case CPUINFO_STR_REGISTER + SATURN_CARRY: sprintf(info->s, "Carry: %d", saturn.carry);break; case CPUINFO_STR_REGISTER + SATURN_CARRY: sprintf(info->s, "Carry: %d", cpustate->carry);break;
case CPUINFO_STR_REGISTER + SATURN_ST: sprintf(info->s, "ST:%.4x", saturn.st);break; case CPUINFO_STR_REGISTER + SATURN_ST: sprintf(info->s, "ST:%.4x", cpustate->st);break;
case CPUINFO_STR_REGISTER + SATURN_HST: sprintf(info->s, "HST:%x", saturn.hst);break; case CPUINFO_STR_REGISTER + SATURN_HST: sprintf(info->s, "HST:%x", cpustate->hst);break;
case CPUINFO_STR_REGISTER + SATURN_RSTK0: sprintf(info->s, "RSTK0:%.5x", saturn.rstk[0]);break; case CPUINFO_STR_REGISTER + SATURN_RSTK0: sprintf(info->s, "RSTK0:%.5x", cpustate->rstk[0]);break;
case CPUINFO_STR_REGISTER + SATURN_RSTK1: sprintf(info->s, "RSTK1:%.5x", saturn.rstk[1]);break; case CPUINFO_STR_REGISTER + SATURN_RSTK1: sprintf(info->s, "RSTK1:%.5x", cpustate->rstk[1]);break;
case CPUINFO_STR_REGISTER + SATURN_RSTK2: sprintf(info->s, "RSTK2:%.5x", saturn.rstk[2]);break; case CPUINFO_STR_REGISTER + SATURN_RSTK2: sprintf(info->s, "RSTK2:%.5x", cpustate->rstk[2]);break;
case CPUINFO_STR_REGISTER + SATURN_RSTK3: sprintf(info->s, "RSTK3:%.5x", saturn.rstk[3]);break; case CPUINFO_STR_REGISTER + SATURN_RSTK3: sprintf(info->s, "RSTK3:%.5x", cpustate->rstk[3]);break;
case CPUINFO_STR_REGISTER + SATURN_RSTK4: sprintf(info->s, "RSTK4:%.5x", saturn.rstk[4]);break; case CPUINFO_STR_REGISTER + SATURN_RSTK4: sprintf(info->s, "RSTK4:%.5x", cpustate->rstk[4]);break;
case CPUINFO_STR_REGISTER + SATURN_RSTK5: sprintf(info->s, "RSTK5:%.5x", saturn.rstk[5]);break; case CPUINFO_STR_REGISTER + SATURN_RSTK5: sprintf(info->s, "RSTK5:%.5x", cpustate->rstk[5]);break;
case CPUINFO_STR_REGISTER + SATURN_RSTK6: sprintf(info->s, "RSTK6:%.5x", saturn.rstk[6]);break; case CPUINFO_STR_REGISTER + SATURN_RSTK6: sprintf(info->s, "RSTK6:%.5x", cpustate->rstk[6]);break;
case CPUINFO_STR_REGISTER + SATURN_RSTK7: sprintf(info->s, "RSTK7:%.5x", saturn.rstk[7]);break; case CPUINFO_STR_REGISTER + SATURN_RSTK7: sprintf(info->s, "RSTK7:%.5x", cpustate->rstk[7]);break;
case CPUINFO_STR_REGISTER + SATURN_IRQ_STATE: sprintf(info->s, "IRQ:%c%c%c%i", saturn.in_irq?'S':'.', saturn.irq_enable?'e':'.', saturn.pending_irq?'p':'.', saturn.irq_state); break; case CPUINFO_STR_REGISTER + SATURN_IRQ_STATE: sprintf(info->s, "IRQ:%c%c%c%i", cpustate->in_irq?'S':'.', cpustate->irq_enable?'e':'.', cpustate->pending_irq?'p':'.', cpustate->irq_state); break;
case CPUINFO_STR_FLAGS: sprintf(info->s, "%c%c", saturn.decimal?'D':'.', saturn.carry ? 'C':'.'); break; case CPUINFO_STR_FLAGS: sprintf(info->s, "%c%c", cpustate->decimal?'D':'.', cpustate->carry ? 'C':'.'); break;
case CPUINFO_STR_REGISTER + SATURN_SLEEPING: sprintf(info->s, "sleep:%c", saturn.sleeping?'S':'.'); break; case CPUINFO_STR_REGISTER + SATURN_SLEEPING: sprintf(info->s, "sleep:%c", cpustate->sleeping?'S':'.'); break;
} }
} }

View File

@ -1,6 +1,6 @@
/***************************************************************************** /*****************************************************************************
* *
* saturn.h * cpustate->h
* portable saturn emulator interface * portable saturn emulator interface
* (hp calculators) * (hp calculators)
* *
@ -54,14 +54,14 @@ HP38G 09/??/95 1LT8 Yorke
typedef struct _saturn_cpu_core saturn_cpu_core; typedef struct _saturn_cpu_core saturn_cpu_core;
struct _saturn_cpu_core struct _saturn_cpu_core
{ {
void (*out)(running_machine*,int); void (*out)(const device_config*,int);
int (*in)(running_machine*); int (*in)(const device_config*);
void (*reset)(running_machine*); void (*reset)(const device_config*);
void (*config)(running_machine*,int v); void (*config)(const device_config*,int v);
void (*unconfig)(running_machine*,int v); void (*unconfig)(const device_config*,int v);
int (*id)(running_machine*); int (*id)(const device_config*);
void (*crc)(running_machine*,int addr, int data); void (*crc)(const device_config*,int addr, int data);
void (*rsi)(running_machine*); void (*rsi)(const device_config*);
}; };
enum enum