mirror of
https://github.com/holub/mame
synced 2025-05-24 23:05:32 +03:00
Pointer-ified the saturn core.
This commit is contained in:
parent
b3d12a2258
commit
dcdfd96f1a
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -52,7 +52,8 @@ typedef SaturnNib Saturn64[16];
|
||||
/****************************************************************************
|
||||
* The SATURN registers.
|
||||
****************************************************************************/
|
||||
typedef struct
|
||||
typedef struct _saturn_state saturn_state;
|
||||
struct _saturn_state
|
||||
{
|
||||
saturn_cpu_core *config;
|
||||
|
||||
@ -78,14 +79,13 @@ typedef struct
|
||||
UINT8 in_irq; /* already servicing IRQ */
|
||||
UINT8 pending_irq; /* IRQ is pending */
|
||||
UINT8 sleeping; /* low-consumption state */
|
||||
int monitor_id;
|
||||
int monitor_in;
|
||||
cpu_irq_callback irq_callback;
|
||||
const device_config *device;
|
||||
const address_space *program;
|
||||
} Saturn_Regs;
|
||||
|
||||
static int saturn_ICount = 0;
|
||||
|
||||
static Saturn_Regs saturn;
|
||||
int icount;
|
||||
};
|
||||
|
||||
/***************************************************************
|
||||
* include the opcode macros, functions and tables
|
||||
@ -102,133 +102,124 @@ static Saturn_Regs saturn;
|
||||
|
||||
static CPU_INIT( saturn )
|
||||
{
|
||||
saturn.config = (saturn_cpu_core *) device->static_config;
|
||||
saturn.irq_callback = irqcallback;
|
||||
saturn.device = device;
|
||||
saturn.program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
|
||||
saturn_state *cpustate = device->token;
|
||||
|
||||
cpustate->config = (saturn_cpu_core *) device->static_config;
|
||||
cpustate->irq_callback = irqcallback;
|
||||
cpustate->device = device;
|
||||
cpustate->program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
|
||||
|
||||
state_save_register_device_item_array(device, 0,saturn.reg[R0]);
|
||||
state_save_register_device_item_array(device, 0,saturn.reg[R1]);
|
||||
state_save_register_device_item_array(device, 0,saturn.reg[R2]);
|
||||
state_save_register_device_item_array(device, 0,saturn.reg[R3]);
|
||||
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,saturn.reg[B]);
|
||||
state_save_register_device_item_array(device, 0,saturn.reg[C]);
|
||||
state_save_register_device_item_array(device, 0,saturn.reg[D]);
|
||||
state_save_register_device_item_array(device, 0,saturn.d);
|
||||
state_save_register_device_item(device, 0,saturn.pc);
|
||||
state_save_register_device_item(device, 0,saturn.oldpc);
|
||||
state_save_register_device_item_array(device, 0,saturn.rstk);
|
||||
state_save_register_device_item(device, 0,saturn.out);
|
||||
state_save_register_device_item(device, 0,saturn.carry);
|
||||
state_save_register_device_item(device, 0,saturn.st);
|
||||
state_save_register_device_item(device, 0,saturn.hst);
|
||||
state_save_register_device_item(device, 0,saturn.nmi_state);
|
||||
state_save_register_device_item(device, 0,saturn.irq_state);
|
||||
state_save_register_device_item(device, 0,saturn.irq_enable);
|
||||
state_save_register_device_item(device, 0,saturn.in_irq);
|
||||
state_save_register_device_item(device, 0,saturn.pending_irq);
|
||||
state_save_register_device_item(device, 0,saturn.sleeping);
|
||||
state_save_register_device_item_array(device, 0,cpustate->reg[R0]);
|
||||
state_save_register_device_item_array(device, 0,cpustate->reg[R1]);
|
||||
state_save_register_device_item_array(device, 0,cpustate->reg[R2]);
|
||||
state_save_register_device_item_array(device, 0,cpustate->reg[R3]);
|
||||
state_save_register_device_item_array(device, 0,cpustate->reg[R4]);
|
||||
state_save_register_device_item_array(device, 0,cpustate->reg[A]);
|
||||
state_save_register_device_item_array(device, 0,cpustate->reg[B]);
|
||||
state_save_register_device_item_array(device, 0,cpustate->reg[C]);
|
||||
state_save_register_device_item_array(device, 0,cpustate->reg[D]);
|
||||
state_save_register_device_item_array(device, 0,cpustate->d);
|
||||
state_save_register_device_item(device, 0,cpustate->pc);
|
||||
state_save_register_device_item(device, 0,cpustate->oldpc);
|
||||
state_save_register_device_item_array(device, 0,cpustate->rstk);
|
||||
state_save_register_device_item(device, 0,cpustate->out);
|
||||
state_save_register_device_item(device, 0,cpustate->carry);
|
||||
state_save_register_device_item(device, 0,cpustate->st);
|
||||
state_save_register_device_item(device, 0,cpustate->hst);
|
||||
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 )
|
||||
{
|
||||
saturn.pc=0;
|
||||
saturn.sleeping = 0;
|
||||
saturn.irq_enable = 0;
|
||||
saturn.in_irq = 0;
|
||||
}
|
||||
|
||||
static CPU_GET_CONTEXT( saturn )
|
||||
{
|
||||
if( dst )
|
||||
*(Saturn_Regs*)dst = saturn;
|
||||
}
|
||||
|
||||
static CPU_SET_CONTEXT( saturn )
|
||||
{
|
||||
if( src )
|
||||
{
|
||||
saturn = *(Saturn_Regs*)src;
|
||||
}
|
||||
saturn_state *cpustate = device->token;
|
||||
|
||||
cpustate->pc=0;
|
||||
cpustate->sleeping = 0;
|
||||
cpustate->irq_enable = 0;
|
||||
cpustate->in_irq = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
INLINE void saturn_take_irq(void)
|
||||
INLINE void saturn_take_irq(saturn_state *cpustate)
|
||||
{
|
||||
saturn.in_irq = 1; /* reset by software, using RTI */
|
||||
saturn.pending_irq = 0;
|
||||
saturn_ICount -= 7;
|
||||
saturn_push(saturn.pc);
|
||||
saturn.pc=IRQ_ADDRESS;
|
||||
cpustate->in_irq = 1; /* reset by software, using RTI */
|
||||
cpustate->pending_irq = 0;
|
||||
cpustate->icount -= 7;
|
||||
saturn_push(cpustate, cpustate->pc);
|
||||
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 )
|
||||
{
|
||||
saturn_ICount = cycles;
|
||||
saturn_state *cpustate = device->token;
|
||||
|
||||
cpustate->icount = cycles;
|
||||
|
||||
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 */
|
||||
saturn_ICount -= 100;
|
||||
cpustate->icount -= 100;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* takes irq */
|
||||
if ( saturn.pending_irq && (!saturn.in_irq) )
|
||||
saturn_take_irq();
|
||||
if ( cpustate->pending_irq && (!cpustate->in_irq) )
|
||||
saturn_take_irq(cpustate);
|
||||
|
||||
/* 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;
|
||||
saturn.nmi_state = state;
|
||||
if ( state == cpustate->nmi_state ) return;
|
||||
cpustate->nmi_state = state;
|
||||
if ( state != CLEAR_LINE )
|
||||
{
|
||||
LOG(( "SATURN '%s' set_nmi_line(ASSERT)\n", saturn.device->tag));
|
||||
saturn.pending_irq = 1;
|
||||
LOG(( "SATURN '%s' set_nmi_line(ASSERT)\n", cpustate->device->tag));
|
||||
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;
|
||||
saturn.irq_state = state;
|
||||
if ( state != CLEAR_LINE && saturn.irq_enable )
|
||||
if ( state == cpustate->irq_state ) return;
|
||||
cpustate->irq_state = state;
|
||||
if ( state != CLEAR_LINE && cpustate->irq_enable )
|
||||
{
|
||||
LOG(( "SATURN '%s' set_irq_line(ASSERT)\n", saturn.device->tag));
|
||||
saturn.pending_irq = 1;
|
||||
LOG(( "SATURN '%s' set_irq_line(ASSERT)\n", cpustate->device->tag));
|
||||
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));
|
||||
if (saturn.irq_callback) (*saturn.irq_callback)(saturn.device, SATURN_WAKEUP_LINE);
|
||||
saturn.sleeping = 0;
|
||||
LOG(( "SATURN '%s' set_wakeup_line(ASSERT)\n", cpustate->device->tag));
|
||||
if (cpustate->irq_callback) (*cpustate->irq_callback)(cpustate->device, SATURN_WAKEUP_LINE);
|
||||
cpustate->sleeping = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -248,40 +239,42 @@ static void IntReg64(Saturn64 r, INT64 d)
|
||||
|
||||
static CPU_SET_INFO( saturn )
|
||||
{
|
||||
saturn_state *cpustate = device->token;
|
||||
|
||||
switch (state)
|
||||
{
|
||||
/* --- 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_IRQ_LINE: saturn_set_irq_line(info->i); break;
|
||||
case CPUINFO_INT_INPUT_STATE + SATURN_WAKEUP_LINE: saturn_set_wakeup_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(cpustate, 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_REGISTER + SATURN_PC: saturn.pc = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_D0: saturn.d[0] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_D1: saturn.d[1] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_A: IntReg64(saturn.reg[A], info->i); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_B: IntReg64(saturn.reg[B], info->i); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_C: IntReg64(saturn.reg[C], info->i); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_D: IntReg64(saturn.reg[D], info->i); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_R0: IntReg64(saturn.reg[R0], info->i); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_R1: IntReg64(saturn.reg[R1], info->i); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_R2: IntReg64(saturn.reg[R2], info->i); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_R3: IntReg64(saturn.reg[R3], info->i); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_R4: IntReg64(saturn.reg[R4], info->i); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_P: saturn.p = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_OUT: saturn.out = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_CARRY: saturn.carry = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_ST: saturn.st = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_HST: saturn.hst = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK0: saturn.rstk[0] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK1: saturn.rstk[1] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK2: saturn.rstk[2] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK3: saturn.rstk[3] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK4: saturn.rstk[4] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK5: saturn.rstk[5] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK6: saturn.rstk[6] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK7: saturn.rstk[7] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_SLEEPING: saturn.sleeping = info->i;
|
||||
case CPUINFO_INT_REGISTER + SATURN_PC: cpustate->pc = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_D0: cpustate->d[0] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_D1: cpustate->d[1] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_A: IntReg64(cpustate->reg[A], info->i); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_B: IntReg64(cpustate->reg[B], info->i); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_C: IntReg64(cpustate->reg[C], info->i); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_D: IntReg64(cpustate->reg[D], info->i); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_R0: IntReg64(cpustate->reg[R0], info->i); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_R1: IntReg64(cpustate->reg[R1], info->i); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_R2: IntReg64(cpustate->reg[R2], info->i); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_R3: IntReg64(cpustate->reg[R3], info->i); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_R4: IntReg64(cpustate->reg[R4], info->i); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_P: cpustate->p = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_OUT: cpustate->out = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_CARRY: cpustate->carry = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_ST: cpustate->st = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_HST: cpustate->hst = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK0: cpustate->rstk[0] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK1: cpustate->rstk[1] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK2: cpustate->rstk[2] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK3: cpustate->rstk[3] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK4: cpustate->rstk[4] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK5: cpustate->rstk[5] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK6: cpustate->rstk[6] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK7: cpustate->rstk[7] = info->i; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_SLEEPING: cpustate->sleeping = info->i;
|
||||
}
|
||||
}
|
||||
|
||||
@ -303,10 +296,12 @@ static INT64 Reg64Int(Saturn64 r)
|
||||
|
||||
CPU_GET_INFO( saturn )
|
||||
{
|
||||
saturn_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(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_DEFAULT_IRQ_VECTOR: info->i = 0; 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_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_IRQ_LINE: info->i = saturn.irq_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 = 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_REGISTER + SATURN_PC: info->i = saturn.pc; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_D0: info->i = saturn.d[0]; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_D1: info->i = saturn.d[1]; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_PC: info->i = cpustate->pc; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_D0: info->i = cpustate->d[0]; 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_B: info->i = Reg64Int(saturn.reg[B]); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_C: info->i = Reg64Int(saturn.reg[C]); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_D: info->i = Reg64Int(saturn.reg[D]); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_R0: info->i = Reg64Int(saturn.reg[R0]); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_R1: info->i = Reg64Int(saturn.reg[R1]); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_R2: info->i = Reg64Int(saturn.reg[R2]); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_R3: info->i = Reg64Int(saturn.reg[R3]); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_R4: info->i = Reg64Int(saturn.reg[R4]); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_A: info->i = Reg64Int(cpustate->reg[A]); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_B: info->i = Reg64Int(cpustate->reg[B]); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_C: info->i = Reg64Int(cpustate->reg[C]); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_D: info->i = Reg64Int(cpustate->reg[D]); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_R0: info->i = Reg64Int(cpustate->reg[R0]); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_R1: info->i = Reg64Int(cpustate->reg[R1]); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_R2: info->i = Reg64Int(cpustate->reg[R2]); break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_R3: info->i = Reg64Int(cpustate->reg[R3]); 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_OUT: info->i = saturn.out; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_CARRY: info->i = saturn.carry; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_ST: info->i = saturn.st; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_HST: info->i = saturn.hst; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK0: info->i = saturn.rstk[0]; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK1: info->i = saturn.rstk[1]; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK2: info->i = saturn.rstk[2]; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK3: info->i = saturn.rstk[3]; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK4: info->i = saturn.rstk[4]; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK5: info->i = saturn.rstk[5]; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK6: info->i = saturn.rstk[6]; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK7: info->i = saturn.rstk[7]; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_SLEEPING: info->i = saturn.sleeping;
|
||||
case CPUINFO_INT_REGISTER + SATURN_P: info->i = cpustate->p; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_OUT: info->i = cpustate->out; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_CARRY: info->i = cpustate->carry; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_ST: info->i = cpustate->st; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_HST: info->i = cpustate->hst; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK0: info->i = cpustate->rstk[0]; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK1: info->i = cpustate->rstk[1]; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK2: info->i = cpustate->rstk[2]; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK3: info->i = cpustate->rstk[3]; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK4: info->i = cpustate->rstk[4]; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK5: info->i = cpustate->rstk[5]; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK6: info->i = cpustate->rstk[6]; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_RSTK7: info->i = cpustate->rstk[7]; break;
|
||||
case CPUINFO_INT_REGISTER + SATURN_SLEEPING: info->i = cpustate->sleeping;
|
||||
|
||||
/* --- 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_GET_CONTEXT: info->getcontext = CPU_GET_CONTEXT_NAME(saturn); break;
|
||||
case CPUINFO_PTR_SET_CONTEXT: info->setcontext = CPU_SET_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(dummy); 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_EXECUTE: info->execute = CPU_EXECUTE_NAME(saturn); break;
|
||||
case CPUINFO_PTR_BURN: info->burn = NULL; 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 --- */
|
||||
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_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_D0: sprintf(info->s, "D0: %.5x", saturn.d[0]);break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_D1: sprintf(info->s, "D1: %.5x", saturn.d[1]);break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_A: sprintf(info->s, "A: " Reg64Format, Reg64Data(saturn.reg[A]));break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_B: sprintf(info->s, "B: " Reg64Format, Reg64Data(saturn.reg[B]));break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_C: sprintf(info->s, "C: " Reg64Format, Reg64Data(saturn.reg[C]));break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_D: sprintf(info->s, "D: " Reg64Format, Reg64Data(saturn.reg[D]));break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_R0: sprintf(info->s, "R0: " Reg64Format, Reg64Data(saturn.reg[R0]));break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_R1: sprintf(info->s, "R1: " Reg64Format, Reg64Data(saturn.reg[R1]));break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_R2: sprintf(info->s, "R2: " Reg64Format, Reg64Data(saturn.reg[R2]));break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_R3: sprintf(info->s, "R3: " Reg64Format, Reg64Data(saturn.reg[R3]));break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_R4: sprintf(info->s, "R4: " Reg64Format, Reg64Data(saturn.reg[R4]));break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_P: sprintf(info->s, "P:%x", saturn.p);break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_OUT: sprintf(info->s, "OUT:%.3x", saturn.out);break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_CARRY: sprintf(info->s, "Carry: %d", saturn.carry);break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_ST: sprintf(info->s, "ST:%.4x", saturn.st);break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_HST: sprintf(info->s, "HST:%x", saturn.hst);break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_RSTK0: sprintf(info->s, "RSTK0:%.5x", saturn.rstk[0]);break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_RSTK1: sprintf(info->s, "RSTK1:%.5x", saturn.rstk[1]);break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_RSTK2: sprintf(info->s, "RSTK2:%.5x", saturn.rstk[2]);break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_RSTK3: sprintf(info->s, "RSTK3:%.5x", saturn.rstk[3]);break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_RSTK4: sprintf(info->s, "RSTK4:%.5x", saturn.rstk[4]);break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_RSTK5: sprintf(info->s, "RSTK5:%.5x", saturn.rstk[5]);break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_RSTK6: sprintf(info->s, "RSTK6:%.5x", saturn.rstk[6]);break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_RSTK7: sprintf(info->s, "RSTK7:%.5x", saturn.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_FLAGS: sprintf(info->s, "%c%c", saturn.decimal?'D':'.', saturn.carry ? 'C':'.'); break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_SLEEPING: sprintf(info->s, "sleep:%c", saturn.sleeping?'S':'.'); 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", cpustate->d[0]);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(cpustate->reg[A]));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(cpustate->reg[C]));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(cpustate->reg[R0]));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(cpustate->reg[R2]));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(cpustate->reg[R4]));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", cpustate->out);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", cpustate->st);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", cpustate->rstk[0]);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", cpustate->rstk[2]);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", cpustate->rstk[4]);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", cpustate->rstk[6]);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", 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", cpustate->decimal?'D':'.', cpustate->carry ? 'C':'.'); break;
|
||||
case CPUINFO_STR_REGISTER + SATURN_SLEEPING: sprintf(info->s, "sleep:%c", cpustate->sleeping?'S':'.'); break;
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* saturn.h
|
||||
* cpustate->h
|
||||
* portable saturn emulator interface
|
||||
* (hp calculators)
|
||||
*
|
||||
@ -54,14 +54,14 @@ HP38G 09/??/95 1LT8 Yorke
|
||||
typedef struct _saturn_cpu_core saturn_cpu_core;
|
||||
struct _saturn_cpu_core
|
||||
{
|
||||
void (*out)(running_machine*,int);
|
||||
int (*in)(running_machine*);
|
||||
void (*reset)(running_machine*);
|
||||
void (*config)(running_machine*,int v);
|
||||
void (*unconfig)(running_machine*,int v);
|
||||
int (*id)(running_machine*);
|
||||
void (*crc)(running_machine*,int addr, int data);
|
||||
void (*rsi)(running_machine*);
|
||||
void (*out)(const device_config*,int);
|
||||
int (*in)(const device_config*);
|
||||
void (*reset)(const device_config*);
|
||||
void (*config)(const device_config*,int v);
|
||||
void (*unconfig)(const device_config*,int v);
|
||||
int (*id)(const device_config*);
|
||||
void (*crc)(const device_config*,int addr, int data);
|
||||
void (*rsi)(const device_config*);
|
||||
};
|
||||
|
||||
enum
|
||||
|
Loading…
Reference in New Issue
Block a user