mirror of
https://github.com/holub/mame
synced 2025-05-22 13:48:55 +03:00
CPU cores now compile cleanly.
This commit is contained in:
parent
d0527ba566
commit
46494694d1
@ -9,7 +9,6 @@
|
|||||||
#define CDP1802_CYCLES_DMA 8
|
#define CDP1802_CYCLES_DMA 8
|
||||||
#define CDP1802_CYCLES_INTERRUPT 8
|
#define CDP1802_CYCLES_INTERRUPT 8
|
||||||
|
|
||||||
typedef enum _cdp1802_cpu_state cdp1802_cpu_state;
|
|
||||||
enum _cdp1802_cpu_state
|
enum _cdp1802_cpu_state
|
||||||
{
|
{
|
||||||
CDP1802_STATE_0_FETCH,
|
CDP1802_STATE_0_FETCH,
|
||||||
@ -20,6 +19,7 @@ enum _cdp1802_cpu_state
|
|||||||
CDP1802_STATE_2_DMA_OUT,
|
CDP1802_STATE_2_DMA_OUT,
|
||||||
CDP1802_STATE_3_INT
|
CDP1802_STATE_3_INT
|
||||||
};
|
};
|
||||||
|
typedef enum _cdp1802_cpu_state cdp1802_cpu_state;
|
||||||
|
|
||||||
typedef struct _cdp1802_state cdp1802_state;
|
typedef struct _cdp1802_state cdp1802_state;
|
||||||
struct _cdp1802_state
|
struct _cdp1802_state
|
||||||
|
@ -148,9 +148,11 @@ struct _cop400_state
|
|||||||
emu_timer *microbus_timer;
|
emu_timer *microbus_timer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef void (*cop400_opcode_func) (cop400_state *cpustate, UINT8 opcode);
|
||||||
|
|
||||||
struct _cop400_opcode_map {
|
struct _cop400_opcode_map {
|
||||||
unsigned cycles;
|
unsigned cycles;
|
||||||
void (*function) (cop400_state *cpustate, UINT8 opcode);
|
cop400_opcode_func function;
|
||||||
};
|
};
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
@ -1206,7 +1208,7 @@ static CPU_EXECUTE( cop400 )
|
|||||||
|
|
||||||
if (BIT(EN, 1) && BIT(IL, 1))
|
if (BIT(EN, 1) && BIT(IL, 1))
|
||||||
{
|
{
|
||||||
void *function = cpustate->opcode_map[ROM(PC)].function;
|
cop400_opcode_func function = cpustate->opcode_map[ROM(PC)].function;
|
||||||
|
|
||||||
if ((function != jp) && (function != jmp) && (function != jsr))
|
if ((function != jp) && (function != jmp) && (function != jsr))
|
||||||
{
|
{
|
||||||
@ -1231,7 +1233,7 @@ static CPU_EXECUTE( cop400 )
|
|||||||
|
|
||||||
if (cpustate->skip)
|
if (cpustate->skip)
|
||||||
{
|
{
|
||||||
void *function = cpustate->opcode_map[ROM(PC)].function;
|
cop400_opcode_func function = cpustate->opcode_map[ROM(PC)].function;
|
||||||
|
|
||||||
opcode = ROM(PC);
|
opcode = ROM(PC);
|
||||||
|
|
||||||
|
@ -73,16 +73,15 @@ enum
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* CKI bonding options */
|
/* CKI bonding options */
|
||||||
typedef enum _cop400_cki_bond cop400_cki_bond;
|
|
||||||
enum _cop400_cki_bond {
|
enum _cop400_cki_bond {
|
||||||
COP400_CKI_DIVISOR_4 = 4,
|
COP400_CKI_DIVISOR_4 = 4,
|
||||||
COP400_CKI_DIVISOR_8 = 8,
|
COP400_CKI_DIVISOR_8 = 8,
|
||||||
COP400_CKI_DIVISOR_16 = 16,
|
COP400_CKI_DIVISOR_16 = 16,
|
||||||
COP400_CKI_DIVISOR_32 = 32
|
COP400_CKI_DIVISOR_32 = 32
|
||||||
};
|
};
|
||||||
|
typedef enum _cop400_cki_bond cop400_cki_bond;
|
||||||
|
|
||||||
/* CKO bonding options */
|
/* CKO bonding options */
|
||||||
typedef enum _cop400_cko_bond cop400_cko_bond;
|
|
||||||
enum _cop400_cko_bond {
|
enum _cop400_cko_bond {
|
||||||
COP400_CKO_OSCILLATOR_OUTPUT = 0,
|
COP400_CKO_OSCILLATOR_OUTPUT = 0,
|
||||||
COP400_CKO_RAM_POWER_SUPPLY,
|
COP400_CKO_RAM_POWER_SUPPLY,
|
||||||
@ -90,13 +89,14 @@ enum _cop400_cko_bond {
|
|||||||
COP400_CKO_SYNC_INPUT,
|
COP400_CKO_SYNC_INPUT,
|
||||||
COP400_CKO_GENERAL_PURPOSE_INPUT
|
COP400_CKO_GENERAL_PURPOSE_INPUT
|
||||||
};
|
};
|
||||||
|
typedef enum _cop400_cko_bond cop400_cko_bond;
|
||||||
|
|
||||||
/* microbus bonding options */
|
/* microbus bonding options */
|
||||||
typedef enum _cop400_microbus cop400_microbus;
|
|
||||||
enum _cop400_microbus {
|
enum _cop400_microbus {
|
||||||
COP400_MICROBUS_DISABLED = 0,
|
COP400_MICROBUS_DISABLED = 0,
|
||||||
COP400_MICROBUS_ENABLED
|
COP400_MICROBUS_ENABLED
|
||||||
};
|
};
|
||||||
|
typedef enum _cop400_microbus cop400_microbus;
|
||||||
|
|
||||||
/* interface */
|
/* interface */
|
||||||
typedef struct _cop400_interface cop400_interface;
|
typedef struct _cop400_interface cop400_interface;
|
||||||
|
@ -589,7 +589,7 @@ drccodeptr drclabel_get_codeptr(drclabel_list *list, drcuml_codelabel label, drc
|
|||||||
|
|
||||||
/* if no code pointer, request an OOB callback */
|
/* if no code pointer, request an OOB callback */
|
||||||
if (curlabel->codeptr == NULL && fixup != NULL)
|
if (curlabel->codeptr == NULL && fixup != NULL)
|
||||||
drccache_request_oob_codegen(list->cache, label_oob_callback, curlabel, fixup, param);
|
drccache_request_oob_codegen(list->cache, label_oob_callback, curlabel, (void *)fixup, param);
|
||||||
|
|
||||||
return curlabel->codeptr;
|
return curlabel->codeptr;
|
||||||
}
|
}
|
||||||
|
@ -538,7 +538,7 @@ static drcbe_state *drcbex86_alloc(drcuml_state *drcuml, drccache *cache, const
|
|||||||
drcbe_state *drcbe;
|
drcbe_state *drcbe;
|
||||||
|
|
||||||
/* allocate space in the cache for our state */
|
/* allocate space in the cache for our state */
|
||||||
drcbe = drccache_memory_alloc(cache, sizeof(*drcbe));
|
drcbe = (drcbe_state *)drccache_memory_alloc(cache, sizeof(*drcbe));
|
||||||
if (drcbe == NULL)
|
if (drcbe == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
memset(drcbe, 0, sizeof(*drcbe));
|
memset(drcbe, 0, sizeof(*drcbe));
|
||||||
@ -700,22 +700,26 @@ static void drcbex86_reset(drcbe_state *drcbe)
|
|||||||
emit_mov_m32_r32(dst, MBD(REG_ECX, offsetof(drcuml_machine_state, exp)), REG_EAX); // mov state->exp,eax
|
emit_mov_m32_r32(dst, MBD(REG_ECX, offsetof(drcuml_machine_state, exp)), REG_EAX); // mov state->exp,eax
|
||||||
for (regnum = 0; regnum < ARRAY_LENGTH(drcbe->state.r); regnum++)
|
for (regnum = 0; regnum < ARRAY_LENGTH(drcbe->state.r); regnum++)
|
||||||
{
|
{
|
||||||
|
int regoffsl = (int)&((drcuml_machine_state *)NULL)->r[regnum].w.l;
|
||||||
|
int regoffsh = (int)&((drcuml_machine_state *)NULL)->r[regnum].w.h;
|
||||||
if (int_register_map[regnum] != 0)
|
if (int_register_map[regnum] != 0)
|
||||||
emit_mov_m32_r32(dst, MBD(REG_ECX, offsetof(drcuml_machine_state, r[regnum].w.l)), int_register_map[regnum]);
|
emit_mov_m32_r32(dst, MBD(REG_ECX, regoffsl), int_register_map[regnum]);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
emit_mov_r32_m32(dst, REG_EAX, MABS(&drcbe->state.r[regnum].w.l));
|
emit_mov_r32_m32(dst, REG_EAX, MABS(&drcbe->state.r[regnum].w.l));
|
||||||
emit_mov_m32_r32(dst, MBD(REG_ECX, offsetof(drcuml_machine_state, r[regnum].w.l)), REG_EAX);
|
emit_mov_m32_r32(dst, MBD(REG_ECX, regoffsl), REG_EAX);
|
||||||
}
|
}
|
||||||
emit_mov_r32_m32(dst, REG_EAX, MABS(&drcbe->state.r[regnum].w.h));
|
emit_mov_r32_m32(dst, REG_EAX, MABS(&drcbe->state.r[regnum].w.h));
|
||||||
emit_mov_m32_r32(dst, MBD(REG_ECX, offsetof(drcuml_machine_state, r[regnum].w.h)), REG_EAX);
|
emit_mov_m32_r32(dst, MBD(REG_ECX, regoffsh), REG_EAX);
|
||||||
}
|
}
|
||||||
for (regnum = 0; regnum < ARRAY_LENGTH(drcbe->state.f); regnum++)
|
for (regnum = 0; regnum < ARRAY_LENGTH(drcbe->state.f); regnum++)
|
||||||
{
|
{
|
||||||
|
int regoffsl = (int)&((drcuml_machine_state *)NULL)->f[regnum].s.l;
|
||||||
|
int regoffsh = (int)&((drcuml_machine_state *)NULL)->f[regnum].s.h;
|
||||||
emit_mov_r32_m32(dst, REG_EAX, MABS(&drcbe->state.f[regnum].s.l));
|
emit_mov_r32_m32(dst, REG_EAX, MABS(&drcbe->state.f[regnum].s.l));
|
||||||
emit_mov_m32_r32(dst, MBD(REG_ECX, offsetof(drcuml_machine_state, f[regnum].s.l)), REG_EAX);
|
emit_mov_m32_r32(dst, MBD(REG_ECX, regoffsl), REG_EAX);
|
||||||
emit_mov_r32_m32(dst, REG_EAX, MABS(&drcbe->state.f[regnum].s.h));
|
emit_mov_r32_m32(dst, REG_EAX, MABS(&drcbe->state.f[regnum].s.h));
|
||||||
emit_mov_m32_r32(dst, MBD(REG_ECX, offsetof(drcuml_machine_state, f[regnum].s.h)), REG_EAX);
|
emit_mov_m32_r32(dst, MBD(REG_ECX, regoffsh), REG_EAX);
|
||||||
}
|
}
|
||||||
emit_ret(dst); // ret
|
emit_ret(dst); // ret
|
||||||
if (drcbe->log != NULL && !drcbe->logged_common)
|
if (drcbe->log != NULL && !drcbe->logged_common)
|
||||||
@ -725,21 +729,25 @@ static void drcbex86_reset(drcbe_state *drcbe)
|
|||||||
drcbe->restore = *dst;
|
drcbe->restore = *dst;
|
||||||
for (regnum = 0; regnum < ARRAY_LENGTH(drcbe->state.r); regnum++)
|
for (regnum = 0; regnum < ARRAY_LENGTH(drcbe->state.r); regnum++)
|
||||||
{
|
{
|
||||||
|
int regoffsl = (int)&((drcuml_machine_state *)NULL)->r[regnum].w.l;
|
||||||
|
int regoffsh = (int)&((drcuml_machine_state *)NULL)->r[regnum].w.h;
|
||||||
if (int_register_map[regnum] != 0)
|
if (int_register_map[regnum] != 0)
|
||||||
emit_mov_r32_m32(dst, int_register_map[regnum], MBD(REG_ECX, offsetof(drcuml_machine_state, r[regnum].w.l)));
|
emit_mov_r32_m32(dst, int_register_map[regnum], MBD(REG_ECX, regoffsl));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
emit_mov_r32_m32(dst, REG_EAX, MBD(REG_ECX, offsetof(drcuml_machine_state, r[regnum].w.l)));
|
emit_mov_r32_m32(dst, REG_EAX, MBD(REG_ECX, regoffsl));
|
||||||
emit_mov_m32_r32(dst, MABS(&drcbe->state.r[regnum].w.l), REG_EAX);
|
emit_mov_m32_r32(dst, MABS(&drcbe->state.r[regnum].w.l), REG_EAX);
|
||||||
}
|
}
|
||||||
emit_mov_r32_m32(dst, REG_EAX, MBD(REG_ECX, offsetof(drcuml_machine_state, r[regnum].w.h)));
|
emit_mov_r32_m32(dst, REG_EAX, MBD(REG_ECX, regoffsh));
|
||||||
emit_mov_m32_r32(dst, MABS(&drcbe->state.r[regnum].w.h), REG_EAX);
|
emit_mov_m32_r32(dst, MABS(&drcbe->state.r[regnum].w.h), REG_EAX);
|
||||||
}
|
}
|
||||||
for (regnum = 0; regnum < ARRAY_LENGTH(drcbe->state.f); regnum++)
|
for (regnum = 0; regnum < ARRAY_LENGTH(drcbe->state.f); regnum++)
|
||||||
{
|
{
|
||||||
emit_mov_r32_m32(dst, REG_EAX, MBD(REG_ECX, offsetof(drcuml_machine_state, f[regnum].s.l)));
|
int regoffsl = (int)&((drcuml_machine_state *)NULL)->f[regnum].s.l;
|
||||||
|
int regoffsh = (int)&((drcuml_machine_state *)NULL)->f[regnum].s.h;
|
||||||
|
emit_mov_r32_m32(dst, REG_EAX, MBD(REG_ECX, regoffsl));
|
||||||
emit_mov_m32_r32(dst, MABS(&drcbe->state.f[regnum].s.l), REG_EAX);
|
emit_mov_m32_r32(dst, MABS(&drcbe->state.f[regnum].s.l), REG_EAX);
|
||||||
emit_mov_r32_m32(dst, REG_EAX, MBD(REG_ECX, offsetof(drcuml_machine_state, f[regnum].s.h)));
|
emit_mov_r32_m32(dst, REG_EAX, MBD(REG_ECX, regoffsh));
|
||||||
emit_mov_m32_r32(dst, MABS(&drcbe->state.f[regnum].s.h), REG_EAX);
|
emit_mov_m32_r32(dst, MABS(&drcbe->state.f[regnum].s.h), REG_EAX);
|
||||||
}
|
}
|
||||||
emit_movzx_r32_m8(dst, REG_EAX, MBD(REG_ECX, offsetof(drcuml_machine_state, fmod)));// movzx eax,state->fmod
|
emit_movzx_r32_m8(dst, REG_EAX, MBD(REG_ECX, offsetof(drcuml_machine_state, fmod)));// movzx eax,state->fmod
|
||||||
@ -3014,7 +3022,7 @@ static void emit_fstp_p(x86code **dst, int size, const drcuml_parameter *param)
|
|||||||
|
|
||||||
static void fixup_label(void *parameter, drccodeptr labelcodeptr)
|
static void fixup_label(void *parameter, drccodeptr labelcodeptr)
|
||||||
{
|
{
|
||||||
drccodeptr src = parameter;
|
drccodeptr src = (drccodeptr)parameter;
|
||||||
|
|
||||||
/* find the end of the instruction */
|
/* find the end of the instruction */
|
||||||
if (src[0] == 0xe3)
|
if (src[0] == 0xe3)
|
||||||
@ -3045,9 +3053,9 @@ static void fixup_label(void *parameter, drccodeptr labelcodeptr)
|
|||||||
static void fixup_exception(drccodeptr *codeptr, void *param1, void *param2, void *param3)
|
static void fixup_exception(drccodeptr *codeptr, void *param1, void *param2, void *param3)
|
||||||
{
|
{
|
||||||
drcuml_parameter handp, exp;
|
drcuml_parameter handp, exp;
|
||||||
drcbe_state *drcbe = param1;
|
drcbe_state *drcbe = (drcbe_state *)param1;
|
||||||
drccodeptr src = param2;
|
drccodeptr src = (drccodeptr)param2;
|
||||||
const drcuml_instruction *inst = param3;
|
const drcuml_instruction *inst = (const drcuml_instruction *)param3;
|
||||||
drccodeptr dst = *codeptr;
|
drccodeptr dst = *codeptr;
|
||||||
drccodeptr *targetptr;
|
drccodeptr *targetptr;
|
||||||
|
|
||||||
|
@ -393,3 +393,12 @@ static void PCDDR_set(dsp56k_core* cpustate, UINT16 value);
|
|||||||
/* Port C Dtaa Register (PCD) */
|
/* Port C Dtaa Register (PCD) */
|
||||||
static void PCD_set(dsp56k_core* cpustate, UINT16 value);
|
static void PCD_set(dsp56k_core* cpustate, UINT16 value);
|
||||||
|
|
||||||
|
|
||||||
|
INLINE dsp56k_core *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_DSP56156);
|
||||||
|
return (dsp56k_core *)device->token;
|
||||||
|
}
|
||||||
|
@ -74,7 +74,7 @@ static DIRECT_UPDATE_HANDLER( dsp56k_direct_handler )
|
|||||||
{
|
{
|
||||||
if (address >= (0x0000<<1) && address <= (0x07ff<<1))
|
if (address >= (0x0000<<1) && address <= (0x07ff<<1))
|
||||||
{
|
{
|
||||||
direct->raw = direct->decrypted = (void*)(dsp56k_program_ram - (0x0000<<1));
|
direct->raw = direct->decrypted = (UINT8 *)(dsp56k_program_ram - (0x0000<<1));
|
||||||
return ~0;
|
return ~0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,7 +166,7 @@ static void set_irq_line(dsp56k_core* cpustate, int irqline, int state)
|
|||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
static CPU_INIT( dsp56k )
|
static CPU_INIT( dsp56k )
|
||||||
{
|
{
|
||||||
dsp56k_core* cpustate = device->token;
|
dsp56k_core* cpustate = get_safe_token(device);
|
||||||
|
|
||||||
// Call specific module inits
|
// Call specific module inits
|
||||||
pcu_init(cpustate);
|
pcu_init(cpustate);
|
||||||
@ -228,7 +228,7 @@ static void alu_reset(dsp56k_core* cpustate)
|
|||||||
|
|
||||||
static CPU_RESET( dsp56k )
|
static CPU_RESET( dsp56k )
|
||||||
{
|
{
|
||||||
dsp56k_core* cpustate = device->token;
|
dsp56k_core* cpustate = get_safe_token(device);
|
||||||
logerror("Dsp56k reset\n");
|
logerror("Dsp56k reset\n");
|
||||||
|
|
||||||
cpustate->interrupt_cycles = 0;
|
cpustate->interrupt_cycles = 0;
|
||||||
@ -266,7 +266,7 @@ static CPU_EXIT( dsp56k )
|
|||||||
|
|
||||||
static CPU_EXECUTE( dsp56k )
|
static CPU_EXECUTE( dsp56k )
|
||||||
{
|
{
|
||||||
dsp56k_core* cpustate = device->token;
|
dsp56k_core* cpustate = get_safe_token(device);
|
||||||
|
|
||||||
/* If reset line is asserted, do nothing */
|
/* If reset line is asserted, do nothing */
|
||||||
if (cpustate->reset_state)
|
if (cpustate->reset_state)
|
||||||
@ -320,7 +320,7 @@ ADDRESS_MAP_END
|
|||||||
|
|
||||||
static CPU_SET_INFO( dsp56k )
|
static CPU_SET_INFO( dsp56k )
|
||||||
{
|
{
|
||||||
dsp56k_core* cpustate = device->token;
|
dsp56k_core* cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -388,7 +388,7 @@ static CPU_SET_INFO( dsp56k )
|
|||||||
|
|
||||||
CPU_GET_INFO( dsp56k )
|
CPU_GET_INFO( dsp56k )
|
||||||
{
|
{
|
||||||
dsp56k_core* cpustate = (device != NULL) ? device->token : NULL;
|
dsp56k_core* cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
@ -612,7 +612,7 @@ static void dsp56k_host_interface_reset(dsp56k_core* cpustate)
|
|||||||
/* They represent the host side of the dsp56k's host interface */
|
/* They represent the host side of the dsp56k's host interface */
|
||||||
void dsp56k_host_interface_write(device_config* device, UINT8 offset, UINT8 data)
|
void dsp56k_host_interface_write(device_config* device, UINT8 offset, UINT8 data)
|
||||||
{
|
{
|
||||||
dsp56k_core* cpustate = device->token;
|
dsp56k_core* cpustate = get_safe_token(device);
|
||||||
|
|
||||||
/* Not exactly correct since the bootstrap hack doesn't need this to be true */
|
/* Not exactly correct since the bootstrap hack doesn't need this to be true */
|
||||||
/*
|
/*
|
||||||
@ -708,7 +708,7 @@ void dsp56k_host_interface_write(device_config* device, UINT8 offset, UINT8 data
|
|||||||
|
|
||||||
UINT8 dsp56k_host_interface_read(device_config* device, UINT8 offset)
|
UINT8 dsp56k_host_interface_read(device_config* device, UINT8 offset)
|
||||||
{
|
{
|
||||||
dsp56k_core* cpustate = device->token;
|
dsp56k_core* cpustate = get_safe_token(device);
|
||||||
|
|
||||||
/* Not exactly correct since the bootstrap hack doesn't need this to be true */
|
/* Not exactly correct since the bootstrap hack doesn't need this to be true */
|
||||||
/*
|
/*
|
||||||
@ -936,6 +936,6 @@ static void dsp56k_io_reset(dsp56k_core* cpustate)
|
|||||||
/* MISC*/
|
/* MISC*/
|
||||||
UINT16 dsp56k_get_peripheral_memory(device_config* device, UINT16 addr)
|
UINT16 dsp56k_get_peripheral_memory(device_config* device, UINT16 addr)
|
||||||
{
|
{
|
||||||
// TODO // THIS COMES BACK dsp56k_core* cpustate = device->token;
|
// TODO // THIS COMES BACK dsp56k_core* cpustate = get_safe_token(device);
|
||||||
return dsp56k_peripheral_ram[A2O(addr)];
|
return dsp56k_peripheral_ram[A2O(addr)];
|
||||||
}
|
}
|
||||||
|
@ -1874,7 +1874,7 @@ static size_t dsp56k_op_cmpm(dsp56k_core* cpustate, const UINT16 op_byte, typed_
|
|||||||
if (absS & U64(0x0000000080000000))
|
if (absS & U64(0x0000000080000000))
|
||||||
absS |= U64(0xffffffff80000000);
|
absS |= U64(0xffffffff80000000);
|
||||||
}
|
}
|
||||||
absS = abs(absS);
|
absS = (absS < 0) ? -absS : absS;
|
||||||
|
|
||||||
/* Sign extend and get absolute value of the destination */
|
/* Sign extend and get absolute value of the destination */
|
||||||
if (D.addr == &A || D.addr == &B)
|
if (D.addr == &A || D.addr == &B)
|
||||||
@ -1889,7 +1889,7 @@ static size_t dsp56k_op_cmpm(dsp56k_core* cpustate, const UINT16 op_byte, typed_
|
|||||||
if (absS & U64(0x0000000080000000))
|
if (absS & U64(0x0000000080000000))
|
||||||
absS |= U64(0xffffffff80000000);
|
absS |= U64(0xffffffff80000000);
|
||||||
}
|
}
|
||||||
absD = abs(absD);
|
absD = (absD < 0) ? -absD : absD;
|
||||||
|
|
||||||
/* Compare */
|
/* Compare */
|
||||||
absResult = absD - absS;
|
absResult = absD - absS;
|
||||||
|
@ -514,12 +514,12 @@ unsigned dasm_hyperstone(char *buffer, unsigned pc, const UINT8 *oprom, unsigned
|
|||||||
lim = op & 0xfff;
|
lim = op & 0xfff;
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(buffer, "XM%x %s, %s, $%x", (UINT8)(float) pow(2, xcode), dest, source, lim);
|
sprintf(buffer, "XM%x %s, %s, $%x", (UINT8)(float) pow(2.0, xcode), dest, source, lim);
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sprintf(buffer, "XX%x %s, %s, 0", (UINT8)(float) pow(2, (xcode - 4)), dest, source);
|
sprintf(buffer, "XX%x %s, %s, 0", (UINT8)(float) pow(2.0, (xcode - 4)), dest, source);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -190,7 +190,6 @@ static CPU_RESET( h6280 )
|
|||||||
/* read the reset vector into PC */
|
/* read the reset vector into PC */
|
||||||
PCL = RDMEM(cpustate, H6280_RESET_VEC);
|
PCL = RDMEM(cpustate, H6280_RESET_VEC);
|
||||||
PCH = RDMEM(cpustate, (H6280_RESET_VEC+1));
|
PCH = RDMEM(cpustate, (H6280_RESET_VEC+1));
|
||||||
CHANGE_PC;
|
|
||||||
|
|
||||||
/* CPU starts in low speed mode */
|
/* CPU starts in low speed mode */
|
||||||
cpustate->clocks_per_cycle = 4;
|
cpustate->clocks_per_cycle = 4;
|
||||||
@ -226,8 +225,6 @@ static CPU_EXECUTE( h6280 )
|
|||||||
/* Execute instructions */
|
/* Execute instructions */
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
if ((cpustate->ppc.w.l ^ cpustate->pc.w.l) & 0xe000)
|
|
||||||
CHANGE_PC;
|
|
||||||
cpustate->ppc = cpustate->pc;
|
cpustate->ppc = cpustate->pc;
|
||||||
|
|
||||||
debugger_instruction_hook(device, PCW);
|
debugger_instruction_hook(device, PCW);
|
||||||
|
@ -28,7 +28,6 @@
|
|||||||
#define S cpustate->sp.b.l
|
#define S cpustate->sp.b.l
|
||||||
|
|
||||||
#define TRANSLATED(addr) ((cpustate->mmr[(addr)>>13] << 13) | ((addr)&0x1fff))
|
#define TRANSLATED(addr) ((cpustate->mmr[(addr)>>13] << 13) | ((addr)&0x1fff))
|
||||||
#define CHANGE_PC
|
|
||||||
#define H6280_CYCLES(cyc) \
|
#define H6280_CYCLES(cyc) \
|
||||||
{ \
|
{ \
|
||||||
cpustate->ICount -= ((cyc) * cpustate->clocks_per_cycle); \
|
cpustate->ICount -= ((cyc) * cpustate->clocks_per_cycle); \
|
||||||
|
@ -396,8 +396,8 @@ static void build_cycle_table(void)
|
|||||||
int i, j;
|
int i, j;
|
||||||
for (j=0; j < X86_NUM_CPUS; j++)
|
for (j=0; j < X86_NUM_CPUS; j++)
|
||||||
{
|
{
|
||||||
cycle_table_rm[j] = auto_malloc(sizeof(UINT8) * CYCLES_NUM_OPCODES);
|
cycle_table_rm[j] = (UINT8 *)auto_malloc(sizeof(UINT8) * CYCLES_NUM_OPCODES);
|
||||||
cycle_table_pm[j] = auto_malloc(sizeof(UINT8) * CYCLES_NUM_OPCODES);
|
cycle_table_pm[j] = (UINT8 *)auto_malloc(sizeof(UINT8) * CYCLES_NUM_OPCODES);
|
||||||
|
|
||||||
for (i=0; i < sizeof(x86_cycle_table)/sizeof(X86_CYCLE_TABLE); i++)
|
for (i=0; i < sizeof(x86_cycle_table)/sizeof(X86_CYCLE_TABLE); i++)
|
||||||
{
|
{
|
||||||
@ -445,8 +445,8 @@ static void I386OP(decode_two_byte)(i386_state *cpustate)
|
|||||||
|
|
||||||
static UINT64 i386_debug_segbase(void *globalref, void *ref, UINT32 params, const UINT64 *param)
|
static UINT64 i386_debug_segbase(void *globalref, void *ref, UINT32 params, const UINT64 *param)
|
||||||
{
|
{
|
||||||
const device_config *device = ref;
|
const device_config *device = (const device_config *)ref;
|
||||||
i386_state *cpustate = device->token;
|
i386_state *cpustate = get_safe_token(device);
|
||||||
UINT32 result;
|
UINT32 result;
|
||||||
I386_SREG seg;
|
I386_SREG seg;
|
||||||
|
|
||||||
@ -466,8 +466,8 @@ static UINT64 i386_debug_segbase(void *globalref, void *ref, UINT32 params, cons
|
|||||||
|
|
||||||
static UINT64 i386_debug_seglimit(void *globalref, void *ref, UINT32 params, const UINT64 *param)
|
static UINT64 i386_debug_seglimit(void *globalref, void *ref, UINT32 params, const UINT64 *param)
|
||||||
{
|
{
|
||||||
const device_config *device = ref;
|
const device_config *device = (const device_config *)ref;
|
||||||
i386_state *cpustate = device->token;
|
i386_state *cpustate = get_safe_token(device);
|
||||||
UINT32 result = 0;
|
UINT32 result = 0;
|
||||||
I386_SREG seg;
|
I386_SREG seg;
|
||||||
|
|
||||||
@ -491,8 +491,8 @@ static CPU_DEBUG_INIT( i386 )
|
|||||||
|
|
||||||
static STATE_POSTLOAD( i386_postload )
|
static STATE_POSTLOAD( i386_postload )
|
||||||
{
|
{
|
||||||
const device_config *device = param;
|
const device_config *device = (const device_config *)param;
|
||||||
i386_state *cpustate = device->token;
|
i386_state *cpustate = get_safe_token(device);
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < 6; i++)
|
for (i = 0; i < 6; i++)
|
||||||
i386_load_segment_descriptor(cpustate,i);
|
i386_load_segment_descriptor(cpustate,i);
|
||||||
@ -505,7 +505,7 @@ static CPU_INIT( i386 )
|
|||||||
static const int regs8[8] = {AL,CL,DL,BL,AH,CH,DH,BH};
|
static const int regs8[8] = {AL,CL,DL,BL,AH,CH,DH,BH};
|
||||||
static const int regs16[8] = {AX,CX,DX,BX,SP,BP,SI,DI};
|
static const int regs16[8] = {AX,CX,DX,BX,SP,BP,SI,DI};
|
||||||
static const int regs32[8] = {EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI};
|
static const int regs32[8] = {EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI};
|
||||||
i386_state *cpustate = device->token;
|
i386_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
build_cycle_table();
|
build_cycle_table();
|
||||||
|
|
||||||
@ -622,7 +622,7 @@ static void build_opcode_table(i386_state *cpustate, UINT32 features)
|
|||||||
|
|
||||||
static CPU_RESET( i386 )
|
static CPU_RESET( i386 )
|
||||||
{
|
{
|
||||||
i386_state *cpustate = device->token;
|
i386_state *cpustate = get_safe_token(device);
|
||||||
cpu_irq_callback save_irqcallback;
|
cpu_irq_callback save_irqcallback;
|
||||||
|
|
||||||
save_irqcallback = cpustate->irq_callback;
|
save_irqcallback = cpustate->irq_callback;
|
||||||
@ -692,7 +692,7 @@ static void i386_set_a20_line(i386_state *cpustate,int state)
|
|||||||
|
|
||||||
static CPU_EXECUTE( i386 )
|
static CPU_EXECUTE( i386 )
|
||||||
{
|
{
|
||||||
i386_state *cpustate = device->token;
|
i386_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->cycles = cycles;
|
cpustate->cycles = cycles;
|
||||||
cpustate->base_cycles = cycles;
|
cpustate->base_cycles = cycles;
|
||||||
@ -726,7 +726,7 @@ static CPU_EXECUTE( i386 )
|
|||||||
|
|
||||||
static CPU_TRANSLATE( i386 )
|
static CPU_TRANSLATE( i386 )
|
||||||
{
|
{
|
||||||
i386_state *cpustate = device->token;
|
i386_state *cpustate = get_safe_token(device);
|
||||||
int result = 1;
|
int result = 1;
|
||||||
if (space == ADDRESS_SPACE_PROGRAM)
|
if (space == ADDRESS_SPACE_PROGRAM)
|
||||||
{
|
{
|
||||||
@ -739,13 +739,13 @@ static CPU_TRANSLATE( i386 )
|
|||||||
|
|
||||||
static CPU_DISASSEMBLE( i386 )
|
static CPU_DISASSEMBLE( i386 )
|
||||||
{
|
{
|
||||||
i386_state *cpustate = device->token;
|
i386_state *cpustate = get_safe_token(device);
|
||||||
return i386_dasm_one(buffer, pc, oprom, cpustate->sreg[CS].d ? 32 : 16);
|
return i386_dasm_one(buffer, pc, oprom, cpustate->sreg[CS].d ? 32 : 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
static CPU_SET_INFO( i386 )
|
static CPU_SET_INFO( i386 )
|
||||||
{
|
{
|
||||||
i386_state *cpustate = device->token;
|
i386_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
if (state == CPUINFO_INT_INPUT_STATE+INPUT_LINE_A20)
|
if (state == CPUINFO_INT_INPUT_STATE+INPUT_LINE_A20)
|
||||||
{
|
{
|
||||||
@ -846,7 +846,7 @@ static CPU_SET_INFO( i386 )
|
|||||||
|
|
||||||
CPU_GET_INFO( i386 )
|
CPU_GET_INFO( i386 )
|
||||||
{
|
{
|
||||||
i386_state *cpustate = (device != NULL) ? device->token : NULL;
|
i386_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -1071,7 +1071,7 @@ static CPU_INIT( i486 )
|
|||||||
|
|
||||||
static CPU_RESET( i486 )
|
static CPU_RESET( i486 )
|
||||||
{
|
{
|
||||||
i386_state *cpustate = device->token;
|
i386_state *cpustate = get_safe_token(device);
|
||||||
cpu_irq_callback save_irqcallback;
|
cpu_irq_callback save_irqcallback;
|
||||||
|
|
||||||
save_irqcallback = cpustate->irq_callback;
|
save_irqcallback = cpustate->irq_callback;
|
||||||
@ -1115,7 +1115,7 @@ static CPU_EXIT( i486 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( i486 )
|
static CPU_SET_INFO( i486 )
|
||||||
{
|
{
|
||||||
i386_state *cpustate = device->token;
|
i386_state *cpustate = get_safe_token(device);
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
case CPUINFO_INT_REGISTER + X87_CTRL: cpustate->fpu_control_word = info->i; break;
|
case CPUINFO_INT_REGISTER + X87_CTRL: cpustate->fpu_control_word = info->i; break;
|
||||||
@ -1135,7 +1135,7 @@ static CPU_SET_INFO( i486 )
|
|||||||
|
|
||||||
CPU_GET_INFO( i486 )
|
CPU_GET_INFO( i486 )
|
||||||
{
|
{
|
||||||
i386_state *cpustate = (device != NULL) ? device->token : NULL;
|
i386_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
case CPUINFO_FCT_SET_INFO: info->setinfo = CPU_SET_INFO_NAME(i486);break;
|
case CPUINFO_FCT_SET_INFO: info->setinfo = CPU_SET_INFO_NAME(i486);break;
|
||||||
@ -1184,7 +1184,7 @@ static CPU_INIT( pentium )
|
|||||||
|
|
||||||
static CPU_RESET( pentium )
|
static CPU_RESET( pentium )
|
||||||
{
|
{
|
||||||
i386_state *cpustate = device->token;
|
i386_state *cpustate = get_safe_token(device);
|
||||||
cpu_irq_callback save_irqcallback;
|
cpu_irq_callback save_irqcallback;
|
||||||
|
|
||||||
save_irqcallback = cpustate->irq_callback;
|
save_irqcallback = cpustate->irq_callback;
|
||||||
@ -1248,7 +1248,7 @@ static CPU_EXIT( pentium )
|
|||||||
|
|
||||||
static CPU_SET_INFO( pentium )
|
static CPU_SET_INFO( pentium )
|
||||||
{
|
{
|
||||||
i386_state *cpustate = device->token;
|
i386_state *cpustate = get_safe_token(device);
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
case CPUINFO_INT_REGISTER + X87_CTRL: cpustate->fpu_control_word = info->i; break;
|
case CPUINFO_INT_REGISTER + X87_CTRL: cpustate->fpu_control_word = info->i; break;
|
||||||
@ -1268,7 +1268,7 @@ static CPU_SET_INFO( pentium )
|
|||||||
|
|
||||||
CPU_GET_INFO( pentium )
|
CPU_GET_INFO( pentium )
|
||||||
{
|
{
|
||||||
i386_state *cpustate = (device != NULL) ? device->token : NULL;
|
i386_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
case CPUINFO_FCT_SET_INFO: info->setinfo = CPU_SET_INFO_NAME(pentium); break;
|
case CPUINFO_FCT_SET_INFO: info->setinfo = CPU_SET_INFO_NAME(pentium); break;
|
||||||
@ -1317,7 +1317,7 @@ static CPU_INIT( mediagx )
|
|||||||
|
|
||||||
static CPU_RESET( mediagx )
|
static CPU_RESET( mediagx )
|
||||||
{
|
{
|
||||||
i386_state *cpustate = device->token;
|
i386_state *cpustate = get_safe_token(device);
|
||||||
cpu_irq_callback save_irqcallback;
|
cpu_irq_callback save_irqcallback;
|
||||||
|
|
||||||
save_irqcallback = cpustate->irq_callback;
|
save_irqcallback = cpustate->irq_callback;
|
||||||
@ -1381,7 +1381,7 @@ static CPU_EXIT( mediagx )
|
|||||||
|
|
||||||
static CPU_SET_INFO( mediagx )
|
static CPU_SET_INFO( mediagx )
|
||||||
{
|
{
|
||||||
i386_state *cpustate = device->token;
|
i386_state *cpustate = get_safe_token(device);
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
case CPUINFO_INT_REGISTER + X87_CTRL: cpustate->fpu_control_word = info->i; break;
|
case CPUINFO_INT_REGISTER + X87_CTRL: cpustate->fpu_control_word = info->i; break;
|
||||||
@ -1401,7 +1401,7 @@ static CPU_SET_INFO( mediagx )
|
|||||||
|
|
||||||
CPU_GET_INFO( mediagx )
|
CPU_GET_INFO( mediagx )
|
||||||
{
|
{
|
||||||
i386_state *cpustate = (device != NULL) ? device->token : NULL;
|
i386_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
case CPUINFO_FCT_SET_INFO: info->setinfo = CPU_SET_INFO_NAME(mediagx); break;
|
case CPUINFO_FCT_SET_INFO: info->setinfo = CPU_SET_INFO_NAME(mediagx); break;
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#ifndef __I386_H__
|
#ifndef __I386_H__
|
||||||
#define __I386_H__
|
#define __I386_H__
|
||||||
|
|
||||||
|
#include "i386.h"
|
||||||
#include "cpuintrf.h"
|
#include "cpuintrf.h"
|
||||||
|
|
||||||
#define I386OP(XX) i386_##XX
|
#define I386OP(XX) i386_##XX
|
||||||
@ -280,6 +281,17 @@ struct _i386_state
|
|||||||
UINT8 *cycle_table_rm;
|
UINT8 *cycle_table_rm;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE i386_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_I386 ||
|
||||||
|
cpu_get_type(device) == CPU_I486 ||
|
||||||
|
cpu_get_type(device) == CPU_PENTIUM ||
|
||||||
|
cpu_get_type(device) == CPU_MEDIAGX);
|
||||||
|
return (i386_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
extern int i386_parity_table[256];
|
extern int i386_parity_table[256];
|
||||||
|
|
||||||
|
@ -78,6 +78,15 @@ struct _i80286_state
|
|||||||
UINT16 eo; /* HJB 12/13/98 effective offset of the address (before segment is added) */
|
UINT16 eo; /* HJB 12/13/98 effective offset of the address (before segment is added) */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE i80286_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_I80286);
|
||||||
|
return (i80286_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
#define INT_IRQ 0x01
|
#define INT_IRQ 0x01
|
||||||
#define NMI_IRQ 0x02
|
#define NMI_IRQ 0x02
|
||||||
|
|
||||||
@ -138,7 +147,7 @@ static void i80286_set_a20_line(i80286_state *cpustate, int state)
|
|||||||
|
|
||||||
static CPU_RESET( i80286 )
|
static CPU_RESET( i80286 )
|
||||||
{
|
{
|
||||||
i80286_state *cpustate = device->token;
|
i80286_state *cpustate = get_safe_token(device);
|
||||||
static int urinit=1;
|
static int urinit=1;
|
||||||
|
|
||||||
/* in my docu not all registers are initialized! */
|
/* in my docu not all registers are initialized! */
|
||||||
@ -194,7 +203,7 @@ static void set_irq_line(i80286_state *cpustate, int irqline, int state)
|
|||||||
|
|
||||||
static CPU_EXECUTE( i80286 )
|
static CPU_EXECUTE( i80286 )
|
||||||
{
|
{
|
||||||
i80286_state *cpustate = device->token;
|
i80286_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
/* copy over the cycle counts if they're not correct */
|
/* copy over the cycle counts if they're not correct */
|
||||||
if (timing.id != 80286)
|
if (timing.id != 80286)
|
||||||
@ -233,7 +242,7 @@ static CPU_DISASSEMBLE( i80286 )
|
|||||||
|
|
||||||
static CPU_INIT( i80286 )
|
static CPU_INIT( i80286 )
|
||||||
{
|
{
|
||||||
i80286_state *cpustate = device->token;
|
i80286_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
state_save_register_device_item_array(device, 0, cpustate->regs.w);
|
state_save_register_device_item_array(device, 0, cpustate->regs.w);
|
||||||
state_save_register_device_item(device, 0, cpustate->amask);
|
state_save_register_device_item(device, 0, cpustate->amask);
|
||||||
@ -295,7 +304,7 @@ static CPU_INIT( i80286 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( i80286 )
|
static CPU_SET_INFO( i80286 )
|
||||||
{
|
{
|
||||||
i80286_state *cpustate = device->token;
|
i80286_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -368,7 +377,7 @@ static CPU_SET_INFO( i80286 )
|
|||||||
|
|
||||||
CPU_GET_INFO( i80286 )
|
CPU_GET_INFO( i80286 )
|
||||||
{
|
{
|
||||||
i80286_state *cpustate = (device != NULL) ? device->token : NULL;
|
i80286_state *cpustate = (device != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
@ -69,6 +69,16 @@ struct _i8086_state
|
|||||||
UINT16 eo; /* HJB 12/13/98 effective offset of the address (before segment is added) */
|
UINT16 eo; /* HJB 12/13/98 effective offset of the address (before segment is added) */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE i8086_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_I8086 ||
|
||||||
|
cpu_get_type(device) == CPU_I8088 ||
|
||||||
|
cpu_get_type(device) == CPU_I80186);
|
||||||
|
return (i8086_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
CPU STATE DESCRIPTION
|
CPU STATE DESCRIPTION
|
||||||
@ -151,7 +161,7 @@ static UINT8 parity_table[256];
|
|||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
static void i8086_state_register(const device_config *device)
|
static void i8086_state_register(const device_config *device)
|
||||||
{
|
{
|
||||||
i8086_state *cpustate = device->token;
|
i8086_state *cpustate = get_safe_token(device);
|
||||||
state_save_register_device_item_array(device, 0, cpustate->regs.w);
|
state_save_register_device_item_array(device, 0, cpustate->regs.w);
|
||||||
state_save_register_device_item(device, 0, cpustate->pc);
|
state_save_register_device_item(device, 0, cpustate->pc);
|
||||||
state_save_register_device_item(device, 0, cpustate->prevpc);
|
state_save_register_device_item(device, 0, cpustate->prevpc);
|
||||||
@ -178,7 +188,7 @@ static void i8086_state_register(const device_config *device)
|
|||||||
|
|
||||||
static CPU_INIT( i8086 )
|
static CPU_INIT( i8086 )
|
||||||
{
|
{
|
||||||
i8086_state *cpustate = device->token;
|
i8086_state *cpustate = get_safe_token(device);
|
||||||
unsigned int i, j, c;
|
unsigned int i, j, c;
|
||||||
static const BREGS reg_name[8] = {AL, CL, DL, BL, AH, CH, DH, BH};
|
static const BREGS reg_name[8] = {AL, CL, DL, BL, AH, CH, DH, BH};
|
||||||
for (i = 0; i < 256; i++)
|
for (i = 0; i < 256; i++)
|
||||||
@ -219,7 +229,7 @@ static CPU_INIT( i8086 )
|
|||||||
#if (HAS_I8088||HAS_I80188)
|
#if (HAS_I8088||HAS_I80188)
|
||||||
static CPU_INIT( i8088 )
|
static CPU_INIT( i8088 )
|
||||||
{
|
{
|
||||||
i8086_state *cpustate = device->token;
|
i8086_state *cpustate = get_safe_token(device);
|
||||||
CPU_INIT_CALL(i8086);
|
CPU_INIT_CALL(i8086);
|
||||||
configure_memory_8bit(cpustate);
|
configure_memory_8bit(cpustate);
|
||||||
}
|
}
|
||||||
@ -227,7 +237,7 @@ static CPU_INIT( i8088 )
|
|||||||
|
|
||||||
static CPU_RESET( i8086 )
|
static CPU_RESET( i8086 )
|
||||||
{
|
{
|
||||||
i8086_state *cpustate = device->token;
|
i8086_state *cpustate = get_safe_token(device);
|
||||||
cpu_irq_callback save_irqcallback;
|
cpu_irq_callback save_irqcallback;
|
||||||
memory_interface save_mem;
|
memory_interface save_mem;
|
||||||
cpu_state_table save_state;
|
cpu_state_table save_state;
|
||||||
@ -286,7 +296,7 @@ static void set_test_line(i8086_state *cpustate, int state)
|
|||||||
|
|
||||||
static CPU_EXECUTE( i8086 )
|
static CPU_EXECUTE( i8086 )
|
||||||
{
|
{
|
||||||
i8086_state *cpustate = device->token;
|
i8086_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
/* copy over the cycle counts if they're not correct */
|
/* copy over the cycle counts if they're not correct */
|
||||||
if (timing.id != 8086)
|
if (timing.id != 8086)
|
||||||
@ -342,7 +352,7 @@ static CPU_DISASSEMBLE( i8086 )
|
|||||||
|
|
||||||
static CPU_EXECUTE( i80186 )
|
static CPU_EXECUTE( i80186 )
|
||||||
{
|
{
|
||||||
i8086_state *cpustate = device->token;
|
i8086_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
/* copy over the cycle counts if they're not correct */
|
/* copy over the cycle counts if they're not correct */
|
||||||
if (timing.id != 80186)
|
if (timing.id != 80186)
|
||||||
@ -382,7 +392,7 @@ static CPU_EXECUTE( i80186 )
|
|||||||
|
|
||||||
static CPU_IMPORT_STATE( i8086 )
|
static CPU_IMPORT_STATE( i8086 )
|
||||||
{
|
{
|
||||||
i8086_state *cpustate = device->token;
|
i8086_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (entry->index)
|
switch (entry->index)
|
||||||
{
|
{
|
||||||
@ -436,7 +446,7 @@ static CPU_IMPORT_STATE( i8086 )
|
|||||||
|
|
||||||
static CPU_EXPORT_STATE( i8086 )
|
static CPU_EXPORT_STATE( i8086 )
|
||||||
{
|
{
|
||||||
i8086_state *cpustate = device->token;
|
i8086_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (entry->index)
|
switch (entry->index)
|
||||||
{
|
{
|
||||||
@ -461,7 +471,7 @@ static CPU_EXPORT_STATE( i8086 )
|
|||||||
|
|
||||||
static CPU_EXPORT_STRING( i8086 )
|
static CPU_EXPORT_STRING( i8086 )
|
||||||
{
|
{
|
||||||
i8086_state *cpustate = device->token;
|
i8086_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (entry->index)
|
switch (entry->index)
|
||||||
{
|
{
|
||||||
@ -486,7 +496,7 @@ static CPU_EXPORT_STRING( i8086 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( i8086 )
|
static CPU_SET_INFO( i8086 )
|
||||||
{
|
{
|
||||||
i8086_state *cpustate = device->token;
|
i8086_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -505,7 +515,7 @@ static CPU_SET_INFO( i8086 )
|
|||||||
|
|
||||||
CPU_GET_INFO( i8086 )
|
CPU_GET_INFO( i8086 )
|
||||||
{
|
{
|
||||||
i8086_state *cpustate = (device != NULL) ? device->token : NULL;
|
i8086_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
@ -27,7 +27,7 @@ TODO: Separate out i860XR and i860XP (make different types, etc).
|
|||||||
|
|
||||||
static CPU_INIT( i860 )
|
static CPU_INIT( i860 )
|
||||||
{
|
{
|
||||||
i860_state_t *cpustate = device->token;
|
i860_state_t *cpustate = get_safe_token(device);
|
||||||
cpustate->device = device;
|
cpustate->device = device;
|
||||||
cpustate->program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
|
cpustate->program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
|
||||||
reset_i860(cpustate);
|
reset_i860(cpustate);
|
||||||
@ -43,7 +43,7 @@ static CPU_INIT( i860 )
|
|||||||
|
|
||||||
static CPU_RESET( i860 )
|
static CPU_RESET( i860 )
|
||||||
{
|
{
|
||||||
i860_state_t *cpustate = device->token;
|
i860_state_t *cpustate = get_safe_token(device);
|
||||||
reset_i860(cpustate);
|
reset_i860(cpustate);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,7 +81,7 @@ static CPU_DISASSEMBLE( i860 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( i860 )
|
static CPU_SET_INFO( i860 )
|
||||||
{
|
{
|
||||||
i860_state_t *cpustate = device->token;
|
i860_state_t *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch(state)
|
switch(state)
|
||||||
{
|
{
|
||||||
@ -175,7 +175,7 @@ static CPU_SET_INFO( i860 )
|
|||||||
|
|
||||||
CPU_GET_INFO( i860 )
|
CPU_GET_INFO( i860 )
|
||||||
{
|
{
|
||||||
i860_state_t *cpustate = (device != NULL) ? device->token : NULL;
|
i860_state_t *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
@ -177,6 +177,15 @@ typedef struct {
|
|||||||
|
|
||||||
} i860_state_t;
|
} i860_state_t;
|
||||||
|
|
||||||
|
INLINE i860_state_t *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_I860);
|
||||||
|
return (i860_state_t *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
PUBLIC FUNCTIONS
|
PUBLIC FUNCTIONS
|
||||||
|
@ -4440,7 +4440,7 @@ void reset_i860 (i860s *cpustate)
|
|||||||
|
|
||||||
static CPU_EXECUTE( i860 )
|
static CPU_EXECUTE( i860 )
|
||||||
{
|
{
|
||||||
i860_state_t *cpustate = device->token;
|
i860_state_t *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
/* Check if the data bus is held by another device, and bail if so.
|
/* Check if the data bus is held by another device, and bail if so.
|
||||||
Also check for reset. */
|
Also check for reset. */
|
||||||
|
@ -39,6 +39,15 @@ struct _i960_state_t {
|
|||||||
int icount;
|
int icount;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE i960_state_t *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_I960);
|
||||||
|
return (i960_state_t *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
static void do_call(i960_state_t *i960, UINT32 adr, int type, UINT32 stack);
|
static void do_call(i960_state_t *i960, UINT32 adr, int type, UINT32 stack);
|
||||||
|
|
||||||
INLINE UINT32 i960_read_dword_unaligned(i960_state_t *i960, UINT32 address)
|
INLINE UINT32 i960_read_dword_unaligned(i960_state_t *i960, UINT32 address)
|
||||||
@ -1946,7 +1955,7 @@ INLINE void execute_op(i960_state_t *i960, UINT32 opcode)
|
|||||||
|
|
||||||
static CPU_EXECUTE( i960 )
|
static CPU_EXECUTE( i960 )
|
||||||
{
|
{
|
||||||
i960_state_t *i960 = device->token;
|
i960_state_t *i960 = get_safe_token(device);
|
||||||
UINT32 opcode;
|
UINT32 opcode;
|
||||||
|
|
||||||
i960->icount = cycles;
|
i960->icount = cycles;
|
||||||
@ -2035,7 +2044,7 @@ static void set_irq_line(i960_state_t *i960, int irqline, int state)
|
|||||||
|
|
||||||
static CPU_SET_INFO( i960 )
|
static CPU_SET_INFO( i960 )
|
||||||
{
|
{
|
||||||
i960_state_t *i960 = device->token;
|
i960_state_t *i960 = get_safe_token(device);
|
||||||
|
|
||||||
if(state >= CPUINFO_INT_REGISTER+I960_R0 && state <= CPUINFO_INT_REGISTER + I960_G15) {
|
if(state >= CPUINFO_INT_REGISTER+I960_R0 && state <= CPUINFO_INT_REGISTER + I960_G15) {
|
||||||
i960->r[state - (CPUINFO_INT_REGISTER + I960_R0)] = info->i;
|
i960->r[state - (CPUINFO_INT_REGISTER + I960_R0)] = info->i;
|
||||||
@ -2057,7 +2066,7 @@ static CPU_SET_INFO( i960 )
|
|||||||
|
|
||||||
static CPU_INIT( i960 )
|
static CPU_INIT( i960 )
|
||||||
{
|
{
|
||||||
i960_state_t *i960 = device->token;
|
i960_state_t *i960 = get_safe_token(device);
|
||||||
|
|
||||||
i960->irq_cb = irqcallback;
|
i960->irq_cb = irqcallback;
|
||||||
i960->device = device;
|
i960->device = device;
|
||||||
@ -2090,7 +2099,7 @@ static CPU_DISASSEMBLE( i960 )
|
|||||||
|
|
||||||
static CPU_RESET( i960 )
|
static CPU_RESET( i960 )
|
||||||
{
|
{
|
||||||
i960_state_t *i960 = device->token;
|
i960_state_t *i960 = get_safe_token(device);
|
||||||
|
|
||||||
i960->SAT = memory_read_dword_32le(i960->program, 0);
|
i960->SAT = memory_read_dword_32le(i960->program, 0);
|
||||||
i960->PRCB = memory_read_dword_32le(i960->program, 4);
|
i960->PRCB = memory_read_dword_32le(i960->program, 4);
|
||||||
@ -2111,7 +2120,7 @@ static CPU_RESET( i960 )
|
|||||||
|
|
||||||
CPU_GET_INFO( i960 )
|
CPU_GET_INFO( i960 )
|
||||||
{
|
{
|
||||||
i960_state_t *i960 = (device != NULL) ? device->token : NULL;
|
i960_state_t *i960 = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
if(state >= CPUINFO_INT_REGISTER+I960_R0 && state <= CPUINFO_INT_REGISTER + I960_G15) {
|
if(state >= CPUINFO_INT_REGISTER+I960_R0 && state <= CPUINFO_INT_REGISTER + I960_G15) {
|
||||||
info->i = i960->r[state - (CPUINFO_INT_REGISTER + I960_R0)];
|
info->i = i960->r[state - (CPUINFO_INT_REGISTER + I960_R0)];
|
||||||
@ -2224,12 +2233,12 @@ CPU_GET_INFO( i960 )
|
|||||||
// on the real hardware (e.g. Model 2's interrupt control registers)
|
// on the real hardware (e.g. Model 2's interrupt control registers)
|
||||||
void i960_noburst(const device_config *device)
|
void i960_noburst(const device_config *device)
|
||||||
{
|
{
|
||||||
i960_state_t *i960 = device->token;
|
i960_state_t *i960 = get_safe_token(device);
|
||||||
i960->bursting = 0;
|
i960->bursting = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void i960_stall(const device_config *device)
|
void i960_stall(const device_config *device)
|
||||||
{
|
{
|
||||||
i960_state_t *i960 = device->token;
|
i960_state_t *i960 = get_safe_token(device);
|
||||||
i960->IP = i960->PIP;
|
i960->IP = i960->PIP;
|
||||||
}
|
}
|
||||||
|
@ -65,6 +65,15 @@ struct _konami_state
|
|||||||
konami_set_lines_func setlines_callback;
|
konami_set_lines_func setlines_callback;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE konami_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_KONAMI);
|
||||||
|
return (konami_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
/* flag bits in the cc register */
|
/* flag bits in the cc register */
|
||||||
#define CC_C 0x01 /* Carry */
|
#define CC_C 0x01 /* Carry */
|
||||||
#define CC_V 0x02 /* Overflow */
|
#define CC_V 0x02 /* Overflow */
|
||||||
@ -391,7 +400,7 @@ static void check_irq_lines(konami_state *cpustate)
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
static CPU_INIT( konami )
|
static CPU_INIT( konami )
|
||||||
{
|
{
|
||||||
konami_state *cpustate = device->token;
|
konami_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->irq_callback = irqcallback;
|
cpustate->irq_callback = irqcallback;
|
||||||
cpustate->device = device;
|
cpustate->device = device;
|
||||||
@ -414,7 +423,7 @@ static CPU_INIT( konami )
|
|||||||
|
|
||||||
static CPU_RESET( konami )
|
static CPU_RESET( konami )
|
||||||
{
|
{
|
||||||
konami_state *cpustate = device->token;
|
konami_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->int_state = 0;
|
cpustate->int_state = 0;
|
||||||
cpustate->nmi_state = CLEAR_LINE;
|
cpustate->nmi_state = CLEAR_LINE;
|
||||||
@ -462,7 +471,7 @@ static void set_irq_line(konami_state *cpustate, int irqline, int state)
|
|||||||
/* execute instructions on this CPU until icount expires */
|
/* execute instructions on this CPU until icount expires */
|
||||||
static CPU_EXECUTE( konami )
|
static CPU_EXECUTE( konami )
|
||||||
{
|
{
|
||||||
konami_state *cpustate = device->token;
|
konami_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
check_irq_lines(cpustate);
|
check_irq_lines(cpustate);
|
||||||
@ -501,7 +510,7 @@ static CPU_EXECUTE( konami )
|
|||||||
|
|
||||||
static CPU_SET_INFO( konami )
|
static CPU_SET_INFO( konami )
|
||||||
{
|
{
|
||||||
konami_state *cpustate = device->token;
|
konami_state *cpustate = get_safe_token(device);
|
||||||
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 --- */
|
||||||
@ -534,7 +543,7 @@ static CPU_SET_INFO( konami )
|
|||||||
|
|
||||||
CPU_GET_INFO( konami )
|
CPU_GET_INFO( konami )
|
||||||
{
|
{
|
||||||
konami_state *cpustate = (device != NULL) ? device->token : NULL;
|
konami_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : 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 --- */
|
||||||
|
@ -67,6 +67,15 @@ struct _lh5810_state
|
|||||||
int icount;
|
int icount;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE lh5801_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_LH5801);
|
||||||
|
return (lh5801_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
#define P cpustate->p.w.l
|
#define P cpustate->p.w.l
|
||||||
#define S cpustate->s.w.l
|
#define S cpustate->s.w.l
|
||||||
#define U cpustate->u.w.l
|
#define U cpustate->u.w.l
|
||||||
@ -92,7 +101,7 @@ struct _lh5810_state
|
|||||||
|
|
||||||
static CPU_INIT( lh5801 )
|
static CPU_INIT( lh5801 )
|
||||||
{
|
{
|
||||||
lh5801_state *cpustate = device->token;
|
lh5801_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
memset(cpustate, 0, sizeof(*cpustate));
|
memset(cpustate, 0, sizeof(*cpustate));
|
||||||
cpustate->config = (const lh5801_cpu_core *) device->static_config;
|
cpustate->config = (const lh5801_cpu_core *) device->static_config;
|
||||||
@ -102,7 +111,7 @@ static CPU_INIT( lh5801 )
|
|||||||
|
|
||||||
static CPU_RESET( lh5801 )
|
static CPU_RESET( lh5801 )
|
||||||
{
|
{
|
||||||
lh5801_state *cpustate = device->token;
|
lh5801_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
P = (memory_read_byte(cpustate->program, 0xfffe)<<8) | memory_read_byte(cpustate->program, 0xffff);
|
P = (memory_read_byte(cpustate->program, 0xfffe)<<8) | memory_read_byte(cpustate->program, 0xffff);
|
||||||
|
|
||||||
@ -111,7 +120,7 @@ static CPU_RESET( lh5801 )
|
|||||||
|
|
||||||
static CPU_EXECUTE( lh5801 )
|
static CPU_EXECUTE( lh5801 )
|
||||||
{
|
{
|
||||||
lh5801_state *cpustate = device->token;
|
lh5801_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
@ -144,7 +153,7 @@ static void set_irq_line(lh5801_state *cpustate, int irqline, int state)
|
|||||||
|
|
||||||
static CPU_SET_INFO( lh5801 )
|
static CPU_SET_INFO( lh5801 )
|
||||||
{
|
{
|
||||||
lh5801_state *cpustate = device->token;
|
lh5801_state *cpustate = get_safe_token(device);
|
||||||
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 --- */
|
||||||
@ -174,7 +183,7 @@ static CPU_SET_INFO( lh5801 )
|
|||||||
|
|
||||||
CPU_GET_INFO( lh5801 )
|
CPU_GET_INFO( lh5801 )
|
||||||
{
|
{
|
||||||
lh5801_state *cpustate = (device != NULL) ? device->token : NULL;
|
lh5801_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
@ -113,6 +113,15 @@ union _lr35902_state {
|
|||||||
lr35902_8BitRegs b;
|
lr35902_8BitRegs b;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE lr35902_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_LR35902);
|
||||||
|
return (lr35902_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
typedef int (*OpcodeEmulator) (lr35902_state *cpustate);
|
typedef int (*OpcodeEmulator) (lr35902_state *cpustate);
|
||||||
|
|
||||||
#define IME 0x01
|
#define IME 0x01
|
||||||
@ -180,7 +189,7 @@ static const int CyclesCB[256] =
|
|||||||
|
|
||||||
static CPU_INIT( lr35902 )
|
static CPU_INIT( lr35902 )
|
||||||
{
|
{
|
||||||
lr35902_state *cpustate = device->token;
|
lr35902_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->w.config = (const lr35902_cpu_core *) device->static_config;
|
cpustate->w.config = (const lr35902_cpu_core *) device->static_config;
|
||||||
cpustate->w.irq_callback = irqcallback;
|
cpustate->w.irq_callback = irqcallback;
|
||||||
@ -195,7 +204,7 @@ static CPU_INIT( lr35902 )
|
|||||||
/************************************************************/
|
/************************************************************/
|
||||||
static CPU_RESET( lr35902 )
|
static CPU_RESET( lr35902 )
|
||||||
{
|
{
|
||||||
lr35902_state *cpustate = device->token;
|
lr35902_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->w.AF = 0x0000;
|
cpustate->w.AF = 0x0000;
|
||||||
cpustate->w.BC = 0x0000;
|
cpustate->w.BC = 0x0000;
|
||||||
@ -300,7 +309,7 @@ INLINE void lr35902_ProcessInterrupts (lr35902_state *cpustate)
|
|||||||
/************************************************************/
|
/************************************************************/
|
||||||
static CPU_EXECUTE( lr35902 )
|
static CPU_EXECUTE( lr35902 )
|
||||||
{
|
{
|
||||||
lr35902_state *cpustate = device->token;
|
lr35902_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->w.icount = cycles;
|
cpustate->w.icount = cycles;
|
||||||
|
|
||||||
@ -336,7 +345,7 @@ static CPU_EXECUTE( lr35902 )
|
|||||||
|
|
||||||
static CPU_BURN( lr35902 )
|
static CPU_BURN( lr35902 )
|
||||||
{
|
{
|
||||||
lr35902_state *cpustate = device->token;
|
lr35902_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
if( cycles > 0 )
|
if( cycles > 0 )
|
||||||
{
|
{
|
||||||
@ -378,7 +387,7 @@ static void lr35902_clear_pending_interrupts (lr35902_state *cpustate)
|
|||||||
|
|
||||||
static CPU_SET_INFO( lr35902 )
|
static CPU_SET_INFO( lr35902 )
|
||||||
{
|
{
|
||||||
lr35902_state *cpustate = device->token;
|
lr35902_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -406,7 +415,7 @@ static CPU_SET_INFO( lr35902 )
|
|||||||
|
|
||||||
CPU_GET_INFO( lr35902 )
|
CPU_GET_INFO( lr35902 )
|
||||||
{
|
{
|
||||||
lr35902_state *cpustate = (device != NULL) ? device->token : NULL;
|
lr35902_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
@ -53,6 +53,7 @@
|
|||||||
|
|
||||||
#include "debugger.h"
|
#include "debugger.h"
|
||||||
#include "cpuexec.h"
|
#include "cpuexec.h"
|
||||||
|
#include "m37710.h"
|
||||||
#include "m37710cm.h"
|
#include "m37710cm.h"
|
||||||
|
|
||||||
#define M37710_DEBUG (0) // enables verbose logging for peripherals, etc.
|
#define M37710_DEBUG (0) // enables verbose logging for peripherals, etc.
|
||||||
@ -260,7 +261,7 @@ static const char *const m37710_tnames[8] =
|
|||||||
|
|
||||||
static TIMER_CALLBACK( m37710_timer_cb )
|
static TIMER_CALLBACK( m37710_timer_cb )
|
||||||
{
|
{
|
||||||
m37710i_cpu_struct *cpustate = ptr;
|
m37710i_cpu_struct *cpustate = (m37710i_cpu_struct *)ptr;
|
||||||
int which = param;
|
int which = param;
|
||||||
int curirq = M37710_LINE_TIMERA0 - which;
|
int curirq = M37710_LINE_TIMERA0 - which;
|
||||||
|
|
||||||
@ -763,7 +764,7 @@ void m37710i_update_irqs(m37710i_cpu_struct *cpustate)
|
|||||||
|
|
||||||
static CPU_RESET( m37710 )
|
static CPU_RESET( m37710 )
|
||||||
{
|
{
|
||||||
m37710i_cpu_struct *cpustate = device->token;
|
m37710i_cpu_struct *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
/* Start the CPU */
|
/* Start the CPU */
|
||||||
CPU_STOPPED = 0;
|
CPU_STOPPED = 0;
|
||||||
@ -811,7 +812,7 @@ static CPU_EXIT( m37710 )
|
|||||||
/* Execute some instructions */
|
/* Execute some instructions */
|
||||||
static CPU_EXECUTE( m37710 )
|
static CPU_EXECUTE( m37710 )
|
||||||
{
|
{
|
||||||
m37710i_cpu_struct *m37710 = device->token;
|
m37710i_cpu_struct *m37710 = get_safe_token(device);
|
||||||
|
|
||||||
m37710i_update_irqs(m37710);
|
m37710i_update_irqs(m37710);
|
||||||
|
|
||||||
@ -869,7 +870,7 @@ void m37710_set_irq_callback(cpu_irq_callback callback)
|
|||||||
|
|
||||||
static CPU_DISASSEMBLE( m37710 )
|
static CPU_DISASSEMBLE( m37710 )
|
||||||
{
|
{
|
||||||
m37710i_cpu_struct *cpustate = device->token;
|
m37710i_cpu_struct *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
return m7700_disassemble(buffer, (pc&0xffff), pc>>16, oprom, FLAG_M, FLAG_X);
|
return m7700_disassemble(buffer, (pc&0xffff), pc>>16, oprom, FLAG_M, FLAG_X);
|
||||||
}
|
}
|
||||||
@ -887,7 +888,7 @@ static STATE_POSTLOAD( m37710_restore_state )
|
|||||||
|
|
||||||
static CPU_INIT( m37710 )
|
static CPU_INIT( m37710 )
|
||||||
{
|
{
|
||||||
m37710i_cpu_struct *cpustate = device->token;
|
m37710i_cpu_struct *cpustate = get_safe_token(device);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
memset(cpustate, 0, sizeof(cpustate));
|
memset(cpustate, 0, sizeof(cpustate));
|
||||||
@ -963,7 +964,7 @@ static CPU_INIT( m37710 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( m37710 )
|
static CPU_SET_INFO( m37710 )
|
||||||
{
|
{
|
||||||
m37710i_cpu_struct *cpustate = device->token;
|
m37710i_cpu_struct *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -1012,7 +1013,7 @@ ADDRESS_MAP_END
|
|||||||
|
|
||||||
CPU_GET_INFO( m37710 )
|
CPU_GET_INFO( m37710 )
|
||||||
{
|
{
|
||||||
m37710i_cpu_struct *cpustate = (device != NULL) ? device->token : NULL;
|
m37710i_cpu_struct *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
@ -129,6 +129,15 @@ struct _m37710i_cpu_struct
|
|||||||
emu_timer *timers[8];
|
emu_timer *timers[8];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE m37710i_cpu_struct *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_M37710 ||
|
||||||
|
cpu_get_type(device) == CPU_M37702);
|
||||||
|
return (m37710i_cpu_struct *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
extern uint m37710i_adc_tbl[];
|
extern uint m37710i_adc_tbl[];
|
||||||
extern uint m37710i_sbc_tbl[];
|
extern uint m37710i_sbc_tbl[];
|
||||||
|
@ -66,7 +66,7 @@ enum addr_mode {
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum opcodes {
|
enum opcodes {
|
||||||
adc, and, asl, bcc, bcs, beq, bit, bmi,
|
adc, and_,asl, bcc, bcs, beq, bit, bmi,
|
||||||
bne, bpl, m6502_brk, bvc, bvs, clc, cld, cli,
|
bne, bpl, m6502_brk, bvc, bvs, clc, cld, cli,
|
||||||
clv, cmp, cpx, cpy, dec, dex, dey, eor,
|
clv, cmp, cpx, cpy, dec, dex, dey, eor,
|
||||||
inc, inx, iny, jmp, jsr, lda, ldx, ldy,
|
inc, inx, iny, jmp, jsr, lda, ldx, ldy,
|
||||||
@ -148,14 +148,14 @@ static const struct op6502_info op6502[256] = {
|
|||||||
{nop,zpx},{ora,zpx},{asl,zpx},{slo,zpx},
|
{nop,zpx},{ora,zpx},{asl,zpx},{slo,zpx},
|
||||||
{clc,imp},{ora,aby},{nop,imp},{slo,aby},
|
{clc,imp},{ora,aby},{nop,imp},{slo,aby},
|
||||||
{nop,abx},{ora,abx},{asl,abx},{slo,abx},
|
{nop,abx},{ora,abx},{asl,abx},{slo,abx},
|
||||||
{jsr,adr},{and,idx},{kil,non},{rla,idx},/* 20 */
|
{jsr,adr},{and_,idx},{kil,non},{rla,idx},/* 20 */
|
||||||
{bit,zpg},{and,zpg},{rol,zpg},{rla,zpg},
|
{bit,zpg},{and_,zpg},{rol,zpg},{rla,zpg},
|
||||||
{plp,imp},{and,imm},{rol,acc},{anc,imm},
|
{plp,imp},{and_,imm},{rol,acc},{anc,imm},
|
||||||
{bit,aba},{and,aba},{rol,aba},{rla,aba},
|
{bit,aba},{and_,aba},{rol,aba},{rla,aba},
|
||||||
{bmi,rel},{and,idy},{kil,non},{rla,idy},/* 30 */
|
{bmi,rel},{and_,idy},{kil,non},{rla,idy},/* 30 */
|
||||||
{nop,zpx},{and,zpx},{rol,zpx},{rla,zpx},
|
{nop,zpx},{and_,zpx},{rol,zpx},{rla,zpx},
|
||||||
{sec,imp},{and,aby},{nop,imp},{rla,aby},
|
{sec,imp},{and_,aby},{nop,imp},{rla,aby},
|
||||||
{nop,abx},{and,abx},{rol,abx},{rla,abx},
|
{nop,abx},{and_,abx},{rol,abx},{rla,abx},
|
||||||
{rti,imp},{eor,idx},{kil,non},{sre,idx},/* 40 */
|
{rti,imp},{eor,idx},{kil,non},{sre,idx},/* 40 */
|
||||||
{nop,zpg},{eor,zpg},{lsr,zpg},{sre,zpg},
|
{nop,zpg},{eor,zpg},{lsr,zpg},{sre,zpg},
|
||||||
{pha,imp},{eor,imm},{lsr,acc},{asr,imm},
|
{pha,imp},{eor,imm},{lsr,acc},{asr,imm},
|
||||||
@ -215,14 +215,14 @@ static const struct op6502_info op65c02[256] = {
|
|||||||
{trb,zpg},{ora,zpx},{asl,zpx},{rmb,zpg},
|
{trb,zpg},{ora,zpx},{asl,zpx},{rmb,zpg},
|
||||||
{clc,imp},{ora,aby},{ina,imp},{ill,non},
|
{clc,imp},{ora,aby},{ina,imp},{ill,non},
|
||||||
{trb,aba},{ora,abx},{asl,abx},{bbr,zpb},
|
{trb,aba},{ora,abx},{asl,abx},{bbr,zpb},
|
||||||
{jsr,adr},{and,idx},{ill,non},{ill,non},/* 20 */
|
{jsr,adr},{and_,idx},{ill,non},{ill,non},/* 20 */
|
||||||
{bit,zpg},{and,zpg},{rol,zpg},{rmb,zpg},
|
{bit,zpg},{and_,zpg},{rol,zpg},{rmb,zpg},
|
||||||
{plp,imp},{and,imm},{rol,acc},{ill,non},
|
{plp,imp},{and_,imm},{rol,acc},{ill,non},
|
||||||
{bit,aba},{and,aba},{rol,aba},{bbr,zpb},
|
{bit,aba},{and_,aba},{rol,aba},{bbr,zpb},
|
||||||
{bmi,rel},{and,idy},{and,zpi},{ill,non},/* 30 */
|
{bmi,rel},{and_,idy},{and_,zpi},{ill,non},/* 30 */
|
||||||
{bit,zpx},{and,zpx},{rol,zpx},{rmb,zpg},
|
{bit,zpx},{and_,zpx},{rol,zpx},{rmb,zpg},
|
||||||
{sec,imp},{and,aby},{dea,imp},{ill,non},
|
{sec,imp},{and_,aby},{dea,imp},{ill,non},
|
||||||
{bit,abx},{and,abx},{rol,abx},{bbr,zpb},
|
{bit,abx},{and_,abx},{rol,abx},{bbr,zpb},
|
||||||
{rti,imp},{eor,idx},{ill,non},{ill,non},/* 40 */
|
{rti,imp},{eor,idx},{ill,non},{ill,non},/* 40 */
|
||||||
{ill,non},{eor,zpg},{lsr,zpg},{rmb,zpg},
|
{ill,non},{eor,zpg},{lsr,zpg},{rmb,zpg},
|
||||||
{pha,imp},{eor,imm},{lsr,acc},{ill,non},
|
{pha,imp},{eor,imm},{lsr,acc},{ill,non},
|
||||||
@ -283,14 +283,14 @@ static const struct op6502_info op65sc02[256] = {
|
|||||||
{trb,zpg},{ora,zpx},{asl,zpx},{rmb,zpg},
|
{trb,zpg},{ora,zpx},{asl,zpx},{rmb,zpg},
|
||||||
{clc,imp},{ora,aby},{ina,imp},{ill,non},
|
{clc,imp},{ora,aby},{ina,imp},{ill,non},
|
||||||
{trb,aba},{ora,abx},{asl,abx},{bbr,zpb},
|
{trb,aba},{ora,abx},{asl,abx},{bbr,zpb},
|
||||||
{jsr,adr},{and,idx},{ill,non},{ill,non},/* 20 */
|
{jsr,adr},{and_,idx},{ill,non},{ill,non},/* 20 */
|
||||||
{bit,zpg},{and,zpg},{rol,zpg},{rmb,zpg},
|
{bit,zpg},{and_,zpg},{rol,zpg},{rmb,zpg},
|
||||||
{plp,imp},{and,imm},{rol,acc},{ill,non},
|
{plp,imp},{and_,imm},{rol,acc},{ill,non},
|
||||||
{bit,aba},{and,aba},{rol,aba},{bbr,zpb},
|
{bit,aba},{and_,aba},{rol,aba},{bbr,zpb},
|
||||||
{bmi,rel},{and,idy},{and,zpi},{ill,non},/* 30 */
|
{bmi,rel},{and_,idy},{and_,zpi},{ill,non},/* 30 */
|
||||||
{bit,zpx},{and,zpx},{rol,zpx},{rmb,zpg},
|
{bit,zpx},{and_,zpx},{rol,zpx},{rmb,zpg},
|
||||||
{sec,imp},{and,aby},{dea,imp},{ill,non},
|
{sec,imp},{and_,aby},{dea,imp},{ill,non},
|
||||||
{bit,abx},{and,abx},{rol,abx},{bbr,zpb},
|
{bit,abx},{and_,abx},{rol,abx},{bbr,zpb},
|
||||||
{rti,imp},{eor,idx},{ill,non},{ill,non},/* 40 */
|
{rti,imp},{eor,idx},{ill,non},{ill,non},/* 40 */
|
||||||
{ill,non},{eor,zpg},{lsr,zpg},{rmb,zpg},
|
{ill,non},{eor,zpg},{lsr,zpg},{rmb,zpg},
|
||||||
{pha,imp},{eor,imm},{lsr,acc},{ill,non},
|
{pha,imp},{eor,imm},{lsr,acc},{ill,non},
|
||||||
@ -351,14 +351,14 @@ static const struct op6502_info op65ce02[256] = {
|
|||||||
{trb,zpg},{ora,zpx},{asl,zpx},{rmb,zpg},
|
{trb,zpg},{ora,zpx},{asl,zpx},{rmb,zpg},
|
||||||
{clc,imp},{ora,aby},{ina,imp},{inz,imp},
|
{clc,imp},{ora,aby},{ina,imp},{inz,imp},
|
||||||
{trb,aba},{ora,abx},{asl,abx},{bbr,zpb},
|
{trb,aba},{ora,abx},{asl,abx},{bbr,zpb},
|
||||||
{jsr,adr},{and,idx},{jsr,ind},{jsr,iax},/* 20 */
|
{jsr,adr},{and_,idx},{jsr,ind},{jsr,iax},/* 20 */
|
||||||
{bit,zpg},{and,zpg},{rol,zpg},{rmb,zpg},
|
{bit,zpg},{and_,zpg},{rol,zpg},{rmb,zpg},
|
||||||
{plp,imp},{and,imm},{rol,acc},{tys,imp},
|
{plp,imp},{and_,imm},{rol,acc},{tys,imp},
|
||||||
{bit,aba},{and,aba},{rol,aba},{bbr,zpb},
|
{bit,aba},{and_,aba},{rol,aba},{bbr,zpb},
|
||||||
{bmi,rel},{and,idz},{and,zpi},{bmi,rw2},/* 30 */
|
{bmi,rel},{and_,idz},{and_,zpi},{bmi,rw2},/* 30 */
|
||||||
{bit,zpx},{and,zpx},{rol,zpx},{rmb,zpg},
|
{bit,zpx},{and_,zpx},{rol,zpx},{rmb,zpg},
|
||||||
{sec,imp},{and,aby},{dea,imp},{dez,imp},
|
{sec,imp},{and_,aby},{dea,imp},{dez,imp},
|
||||||
{bit,abx},{and,abx},{rol,abx},{bbr,zpb},
|
{bit,abx},{and_,abx},{rol,abx},{bbr,zpb},
|
||||||
{rti,imp},{eor,idx},{neg,imp},{asr2,imp},/* 40 */
|
{rti,imp},{eor,idx},{neg,imp},{asr2,imp},/* 40 */
|
||||||
{asr2,zpg},{eor,zpg},{lsr,zpg},{rmb,zpg},
|
{asr2,zpg},{eor,zpg},{lsr,zpg},{rmb,zpg},
|
||||||
{pha,imp},{eor,imm},{lsr,acc},{taz,imp},
|
{pha,imp},{eor,imm},{lsr,acc},{taz,imp},
|
||||||
@ -421,14 +421,14 @@ static const struct op6502_info op4510[256] = {
|
|||||||
{trb,zpg},{ora,zpx},{asl,zpx},{rmb,zpg},
|
{trb,zpg},{ora,zpx},{asl,zpx},{rmb,zpg},
|
||||||
{clc,imp},{ora,aby},{ina,imp},{inz,imp},
|
{clc,imp},{ora,aby},{ina,imp},{inz,imp},
|
||||||
{trb,aba},{ora,abx},{asl,abx},{bbr,zpb},
|
{trb,aba},{ora,abx},{asl,abx},{bbr,zpb},
|
||||||
{jsr,adr},{and,idx},{jsr,ind},{jsr,iax},/* 20 */
|
{jsr,adr},{and_,idx},{jsr,ind},{jsr,iax},/* 20 */
|
||||||
{bit,zpg},{and,zpg},{rol,zpg},{rmb,zpg},
|
{bit,zpg},{and_,zpg},{rol,zpg},{rmb,zpg},
|
||||||
{plp,imp},{and,imm},{rol,acc},{tys,imp},
|
{plp,imp},{and_,imm},{rol,acc},{tys,imp},
|
||||||
{bit,aba},{and,aba},{rol,aba},{bbr,zpb},
|
{bit,aba},{and_,aba},{rol,aba},{bbr,zpb},
|
||||||
{bmi,rel},{and,idz},{and,zpi},{bmi,rw2},/* 30 */
|
{bmi,rel},{and_,idz},{and_,zpi},{bmi,rw2},/* 30 */
|
||||||
{bit,zpx},{and,zpx},{rol,zpx},{rmb,zpg},
|
{bit,zpx},{and_,zpx},{rol,zpx},{rmb,zpg},
|
||||||
{sec,imp},{and,aby},{dea,imp},{dez,imp},
|
{sec,imp},{and_,aby},{dea,imp},{dez,imp},
|
||||||
{bit,abx},{and,abx},{rol,abx},{bbr,zpb},
|
{bit,abx},{and_,abx},{rol,abx},{bbr,zpb},
|
||||||
{rti,imp},{eor,idx},{neg,imp},{asr2,imp},/* 40 */
|
{rti,imp},{eor,idx},{neg,imp},{asr2,imp},/* 40 */
|
||||||
{asr2,zpg},{eor,zpg},{lsr,zpg},{rmb,zpg},
|
{asr2,zpg},{eor,zpg},{lsr,zpg},{rmb,zpg},
|
||||||
{pha,imp},{eor,imm},{lsr,acc},{taz,imp},
|
{pha,imp},{eor,imm},{lsr,acc},{taz,imp},
|
||||||
@ -491,14 +491,14 @@ static const struct op6502_info opdeco16[256] =
|
|||||||
{ill,non},{ora,zpx},{asl,zpx},{ill,non},
|
{ill,non},{ora,zpx},{asl,zpx},{ill,non},
|
||||||
{clc,imp},{ora,aby},{ill,non},{ill,non},
|
{clc,imp},{ora,aby},{ill,non},{ill,non},
|
||||||
{ill,non},{ora,abx},{asl,abx},{ill,non},
|
{ill,non},{ora,abx},{asl,abx},{ill,non},
|
||||||
{jsr,adr},{and,idx},{ill,non},{u23,zpg},/* 20 */
|
{jsr,adr},{and_,idx},{ill,non},{u23,zpg},/* 20 */
|
||||||
{bit,zpg},{and,zpg},{rol,zpg},{ill,non},
|
{bit,zpg},{and_,zpg},{rol,zpg},{ill,non},
|
||||||
{plp,imp},{and,imm},{rol,acc},{ill,non},
|
{plp,imp},{and_,imm},{rol,acc},{ill,non},
|
||||||
{bit,aba},{and,aba},{rol,aba},{ill,non},
|
{bit,aba},{and_,aba},{rol,aba},{ill,non},
|
||||||
{bmi,rel},{and,idy},{ill,non},{ill,non},/* 30 */
|
{bmi,rel},{and_,idy},{ill,non},{ill,non},/* 30 */
|
||||||
{ill,non},{and,zpx},{rol,zpx},{ill,non},
|
{ill,non},{and_,zpx},{rol,zpx},{ill,non},
|
||||||
{sec,imp},{and,aby},{ill,non},{ill,non},
|
{sec,imp},{and_,aby},{ill,non},{ill,non},
|
||||||
{ill,non},{and,abx},{rol,abx},{u3F,zpg},
|
{ill,non},{and_,abx},{rol,abx},{u3F,zpg},
|
||||||
{rti,imp},{eor,idx},{ill,non},{ill,non},/* 40 */
|
{rti,imp},{eor,idx},{ill,non},{ill,non},/* 40 */
|
||||||
{ill,non},{eor,zpg},{lsr,zpg},{ill,non},
|
{ill,non},{eor,zpg},{lsr,zpg},{ill,non},
|
||||||
{pha,imp},{eor,imm},{lsr,acc},{u4B,zpg},
|
{pha,imp},{eor,imm},{lsr,acc},{u4B,zpg},
|
||||||
|
@ -155,6 +155,15 @@ struct _m4510_Regs {
|
|||||||
m6510_port_write_func port_write;
|
m6510_port_write_func port_write;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE m4510_Regs *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_M4510);
|
||||||
|
return (m4510_Regs *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
/***************************************************************
|
/***************************************************************
|
||||||
* include the opcode macros, functions and tables
|
* include the opcode macros, functions and tables
|
||||||
***************************************************************/
|
***************************************************************/
|
||||||
@ -176,18 +185,18 @@ INLINE int m4510_cpu_readop_arg(m4510_Regs *cpustate)
|
|||||||
|
|
||||||
static UINT8 default_rdmem_id(const address_space *space, offs_t address)
|
static UINT8 default_rdmem_id(const address_space *space, offs_t address)
|
||||||
{
|
{
|
||||||
m4510_Regs *cpustate = space->cpu->token;
|
m4510_Regs *cpustate = get_safe_token(space->cpu);
|
||||||
return memory_read_byte_8le(space, M4510_MEM(address));
|
return memory_read_byte_8le(space, M4510_MEM(address));
|
||||||
}
|
}
|
||||||
static void default_wrmem_id(const address_space *space, offs_t address, UINT8 data)
|
static void default_wrmem_id(const address_space *space, offs_t address, UINT8 data)
|
||||||
{
|
{
|
||||||
m4510_Regs *cpustate = space->cpu->token;
|
m4510_Regs *cpustate = get_safe_token(space->cpu);
|
||||||
memory_write_byte_8le(space, M4510_MEM(address), data);
|
memory_write_byte_8le(space, M4510_MEM(address), data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static CPU_INIT( m4510 )
|
static CPU_INIT( m4510 )
|
||||||
{
|
{
|
||||||
m4510_Regs *cpustate = device->token;
|
m4510_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->interrupt_inhibit = 0;
|
cpustate->interrupt_inhibit = 0;
|
||||||
cpustate->rdmem_id = default_rdmem_id;
|
cpustate->rdmem_id = default_rdmem_id;
|
||||||
@ -199,7 +208,7 @@ static CPU_INIT( m4510 )
|
|||||||
|
|
||||||
static CPU_RESET( m4510 )
|
static CPU_RESET( m4510 )
|
||||||
{
|
{
|
||||||
m4510_Regs *cpustate = device->token;
|
m4510_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->insn = insn4510;
|
cpustate->insn = insn4510;
|
||||||
|
|
||||||
@ -253,7 +262,7 @@ INLINE void m4510_take_irq(m4510_Regs *cpustate)
|
|||||||
|
|
||||||
static CPU_EXECUTE( m4510 )
|
static CPU_EXECUTE( m4510 )
|
||||||
{
|
{
|
||||||
m4510_Regs *cpustate = device->token;
|
m4510_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
@ -334,7 +343,7 @@ static UINT8 m4510_get_port(m4510_Regs *cpustate)
|
|||||||
static READ8_HANDLER( m4510_read_0000 )
|
static READ8_HANDLER( m4510_read_0000 )
|
||||||
{
|
{
|
||||||
UINT8 result = 0x00;
|
UINT8 result = 0x00;
|
||||||
m4510_Regs *cpustate = space->cpu->token;
|
m4510_Regs *cpustate = get_safe_token(space->cpu);
|
||||||
|
|
||||||
switch(offset)
|
switch(offset)
|
||||||
{
|
{
|
||||||
@ -352,7 +361,7 @@ static READ8_HANDLER( m4510_read_0000 )
|
|||||||
|
|
||||||
static WRITE8_HANDLER( m4510_write_0000 )
|
static WRITE8_HANDLER( m4510_write_0000 )
|
||||||
{
|
{
|
||||||
m4510_Regs *cpustate = space->cpu->token;
|
m4510_Regs *cpustate = get_safe_token(space->cpu);
|
||||||
|
|
||||||
switch(offset)
|
switch(offset)
|
||||||
{
|
{
|
||||||
@ -374,7 +383,7 @@ ADDRESS_MAP_END
|
|||||||
|
|
||||||
static CPU_TRANSLATE( m4510 )
|
static CPU_TRANSLATE( m4510 )
|
||||||
{
|
{
|
||||||
m4510_Regs *cpustate = device->token;
|
m4510_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
if (space == ADDRESS_SPACE_PROGRAM)
|
if (space == ADDRESS_SPACE_PROGRAM)
|
||||||
*address = M4510_MEM(*address);
|
*address = M4510_MEM(*address);
|
||||||
@ -387,7 +396,7 @@ static CPU_TRANSLATE( m4510 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( m4510 )
|
static CPU_SET_INFO( m4510 )
|
||||||
{
|
{
|
||||||
m4510_Regs *cpustate = device->token;
|
m4510_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -434,7 +443,7 @@ static CPU_SET_INFO( m4510 )
|
|||||||
|
|
||||||
CPU_GET_INFO( m4510 )
|
CPU_GET_INFO( m4510 )
|
||||||
{
|
{
|
||||||
m4510_Regs *cpustate = (device != NULL) ? device->token : NULL;
|
m4510_Regs *cpustate = (device != NULL && device != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
@ -91,6 +91,22 @@ struct _m6502_Regs
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE m6502_Regs *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_M6502 ||
|
||||||
|
cpu_get_type(device) == CPU_M6510 ||
|
||||||
|
cpu_get_type(device) == CPU_M6510T ||
|
||||||
|
cpu_get_type(device) == CPU_M7501 ||
|
||||||
|
cpu_get_type(device) == CPU_M8502 ||
|
||||||
|
cpu_get_type(device) == CPU_N2A03 ||
|
||||||
|
cpu_get_type(device) == CPU_M65C02 ||
|
||||||
|
cpu_get_type(device) == CPU_M65SC02 ||
|
||||||
|
cpu_get_type(device) == CPU_DECO16);
|
||||||
|
return (m6502_Regs *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
static UINT8 default_rdmem_id(const address_space *space, offs_t offset) { return memory_read_byte_8le(space, offset); }
|
static UINT8 default_rdmem_id(const address_space *space, offs_t offset) { return memory_read_byte_8le(space, offset); }
|
||||||
static void default_wdmem_id(const address_space *space, offs_t offset, UINT8 data) { memory_write_byte_8le(space, offset, data); }
|
static void default_wdmem_id(const address_space *space, offs_t offset, UINT8 data) { memory_write_byte_8le(space, offset, data); }
|
||||||
@ -132,7 +148,7 @@ static void default_wdmem_id(const address_space *space, offs_t offset, UINT8 da
|
|||||||
|
|
||||||
static void m6502_common_init(const device_config *device, cpu_irq_callback irqcallback, UINT8 subtype, void (*const *insn)(m6502_Regs *cpustate), const char *type)
|
static void m6502_common_init(const device_config *device, cpu_irq_callback irqcallback, UINT8 subtype, void (*const *insn)(m6502_Regs *cpustate), const char *type)
|
||||||
{
|
{
|
||||||
m6502_Regs *cpustate = device->token;
|
m6502_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->irq_callback = irqcallback;
|
cpustate->irq_callback = irqcallback;
|
||||||
cpustate->device = device;
|
cpustate->device = device;
|
||||||
@ -170,7 +186,7 @@ static CPU_INIT( m6502 )
|
|||||||
|
|
||||||
static CPU_RESET( m6502 )
|
static CPU_RESET( m6502 )
|
||||||
{
|
{
|
||||||
m6502_Regs *cpustate = device->token;
|
m6502_Regs *cpustate = get_safe_token(device);
|
||||||
/* wipe out the rest of the m6502 structure */
|
/* wipe out the rest of the m6502 structure */
|
||||||
/* read the reset vector into PC */
|
/* read the reset vector into PC */
|
||||||
PCL = RDMEM(M6502_RST_VEC);
|
PCL = RDMEM(M6502_RST_VEC);
|
||||||
@ -210,7 +226,7 @@ INLINE void m6502_take_irq(m6502_Regs *cpustate)
|
|||||||
|
|
||||||
static CPU_EXECUTE( m6502 )
|
static CPU_EXECUTE( m6502 )
|
||||||
{
|
{
|
||||||
m6502_Regs *cpustate = device->token;
|
m6502_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
@ -322,7 +338,7 @@ static CPU_INIT( n2a03 )
|
|||||||
from the PSG core when such an occasion arises. */
|
from the PSG core when such an occasion arises. */
|
||||||
void n2a03_irq(const device_config *device)
|
void n2a03_irq(const device_config *device)
|
||||||
{
|
{
|
||||||
m6502_Regs *cpustate = device->token;
|
m6502_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
m6502_take_irq(cpustate);
|
m6502_take_irq(cpustate);
|
||||||
}
|
}
|
||||||
@ -341,7 +357,7 @@ static CPU_INIT( m6510 )
|
|||||||
|
|
||||||
static CPU_RESET( m6510 )
|
static CPU_RESET( m6510 )
|
||||||
{
|
{
|
||||||
m6502_Regs *cpustate = device->token;
|
m6502_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
CPU_RESET_CALL(m6502);
|
CPU_RESET_CALL(m6502);
|
||||||
cpustate->port = 0xff;
|
cpustate->port = 0xff;
|
||||||
@ -355,7 +371,7 @@ static UINT8 m6510_get_port(m6502_Regs *cpustate)
|
|||||||
|
|
||||||
static READ8_HANDLER( m6510_read_0000 )
|
static READ8_HANDLER( m6510_read_0000 )
|
||||||
{
|
{
|
||||||
m6502_Regs *cpustate = space->cpu->token;
|
m6502_Regs *cpustate = get_safe_token(space->cpu);
|
||||||
UINT8 result = 0x00;
|
UINT8 result = 0x00;
|
||||||
|
|
||||||
switch(offset)
|
switch(offset)
|
||||||
@ -374,7 +390,7 @@ static READ8_HANDLER( m6510_read_0000 )
|
|||||||
|
|
||||||
static WRITE8_HANDLER( m6510_write_0000 )
|
static WRITE8_HANDLER( m6510_write_0000 )
|
||||||
{
|
{
|
||||||
m6502_Regs *cpustate = space->cpu->token;
|
m6502_Regs *cpustate = get_safe_token(space->cpu);
|
||||||
|
|
||||||
switch(offset)
|
switch(offset)
|
||||||
{
|
{
|
||||||
@ -409,7 +425,7 @@ static CPU_INIT( m65c02 )
|
|||||||
|
|
||||||
static CPU_RESET( m65c02 )
|
static CPU_RESET( m65c02 )
|
||||||
{
|
{
|
||||||
m6502_Regs *cpustate = device->token;
|
m6502_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
CPU_RESET_CALL(m6502);
|
CPU_RESET_CALL(m6502);
|
||||||
P &=~F_D;
|
P &=~F_D;
|
||||||
@ -436,7 +452,7 @@ INLINE void m65c02_take_irq(m6502_Regs *cpustate)
|
|||||||
|
|
||||||
static CPU_EXECUTE( m65c02 )
|
static CPU_EXECUTE( m65c02 )
|
||||||
{
|
{
|
||||||
m6502_Regs *cpustate = device->token;
|
m6502_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
@ -521,7 +537,7 @@ static CPU_INIT( m65sc02 )
|
|||||||
|
|
||||||
static CPU_INIT( deco16 )
|
static CPU_INIT( deco16 )
|
||||||
{
|
{
|
||||||
m6502_Regs *cpustate = device->token;
|
m6502_Regs *cpustate = get_safe_token(device);
|
||||||
m6502_common_init(device, irqcallback, SUBTYPE_DECO16, insndeco16, "deco16");
|
m6502_common_init(device, irqcallback, SUBTYPE_DECO16, insndeco16, "deco16");
|
||||||
cpustate->io = memory_find_address_space(device, ADDRESS_SPACE_IO);
|
cpustate->io = memory_find_address_space(device, ADDRESS_SPACE_IO);
|
||||||
}
|
}
|
||||||
@ -529,7 +545,7 @@ static CPU_INIT( deco16 )
|
|||||||
|
|
||||||
static CPU_RESET( deco16 )
|
static CPU_RESET( deco16 )
|
||||||
{
|
{
|
||||||
m6502_Regs *cpustate = device->token;
|
m6502_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
CPU_RESET_CALL(m6502);
|
CPU_RESET_CALL(m6502);
|
||||||
cpustate->subtype = SUBTYPE_DECO16;
|
cpustate->subtype = SUBTYPE_DECO16;
|
||||||
@ -606,7 +622,7 @@ static void deco16_set_irq_line(m6502_Regs *cpustate, int irqline, int state)
|
|||||||
|
|
||||||
static CPU_EXECUTE( deco16 )
|
static CPU_EXECUTE( deco16 )
|
||||||
{
|
{
|
||||||
m6502_Regs *cpustate = device->token;
|
m6502_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
@ -659,7 +675,7 @@ static CPU_EXECUTE( deco16 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( m6502 )
|
static CPU_SET_INFO( m6502 )
|
||||||
{
|
{
|
||||||
m6502_Regs *cpustate = device->token;
|
m6502_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -693,7 +709,7 @@ static CPU_SET_INFO( m6502 )
|
|||||||
|
|
||||||
CPU_GET_INFO( m6502 )
|
CPU_GET_INFO( m6502 )
|
||||||
{
|
{
|
||||||
m6502_Regs *cpustate = (device != NULL) ? device->token : NULL;
|
m6502_Regs *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -808,7 +824,7 @@ CPU_GET_INFO( n2a03 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( m6510 )
|
static CPU_SET_INFO( m6510 )
|
||||||
{
|
{
|
||||||
m6502_Regs *cpustate = device->token;
|
m6502_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -822,7 +838,7 @@ static CPU_SET_INFO( m6510 )
|
|||||||
|
|
||||||
CPU_GET_INFO( m6510 )
|
CPU_GET_INFO( m6510 )
|
||||||
{
|
{
|
||||||
m6502_Regs *cpustate = (device != NULL) ? device->token : NULL;
|
m6502_Regs *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -908,7 +924,7 @@ CPU_GET_INFO( m8502 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( m65c02 )
|
static CPU_SET_INFO( m65c02 )
|
||||||
{
|
{
|
||||||
m6502_Regs *cpustate = device->token;
|
m6502_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -972,7 +988,7 @@ CPU_GET_INFO( m65sc02 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( deco16 )
|
static CPU_SET_INFO( deco16 )
|
||||||
{
|
{
|
||||||
m6502_Regs *cpustate = device->token;
|
m6502_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
@ -86,6 +86,14 @@ struct _m6509_Regs {
|
|||||||
m6502_write_indexed_func wrmem_id; /* writemem callback for indexed instructions */
|
m6502_write_indexed_func wrmem_id; /* writemem callback for indexed instructions */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE m6509_Regs *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_M6509);
|
||||||
|
return (m6509_Regs *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
/***************************************************************
|
/***************************************************************
|
||||||
* include the opcode macros, functions and tables
|
* include the opcode macros, functions and tables
|
||||||
@ -132,7 +140,7 @@ static void default_wdmem_id(const address_space *space, offs_t address, UINT8 d
|
|||||||
|
|
||||||
static CPU_INIT( m6509 )
|
static CPU_INIT( m6509 )
|
||||||
{
|
{
|
||||||
m6509_Regs *cpustate = device->token;
|
m6509_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->rdmem_id = default_rdmem_id;
|
cpustate->rdmem_id = default_rdmem_id;
|
||||||
cpustate->wrmem_id = default_wdmem_id;
|
cpustate->wrmem_id = default_wdmem_id;
|
||||||
@ -143,7 +151,7 @@ static CPU_INIT( m6509 )
|
|||||||
|
|
||||||
static CPU_RESET( m6509 )
|
static CPU_RESET( m6509 )
|
||||||
{
|
{
|
||||||
m6509_Regs *cpustate = device->token;
|
m6509_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->insn = insn6509;
|
cpustate->insn = insn6509;
|
||||||
|
|
||||||
@ -190,7 +198,7 @@ INLINE void m6509_take_irq( m6509_Regs *cpustate)
|
|||||||
|
|
||||||
static CPU_EXECUTE( m6509 )
|
static CPU_EXECUTE( m6509 )
|
||||||
{
|
{
|
||||||
m6509_Regs *cpustate = device->token;
|
m6509_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
@ -280,7 +288,7 @@ static void m6509_set_irq_line(m6509_Regs *cpustate, int irqline, int state)
|
|||||||
|
|
||||||
static CPU_SET_INFO( m6509 )
|
static CPU_SET_INFO( m6509 )
|
||||||
{
|
{
|
||||||
m6509_Regs *cpustate = device->token;
|
m6509_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -316,7 +324,7 @@ static CPU_SET_INFO( m6509 )
|
|||||||
|
|
||||||
CPU_GET_INFO( m6509 )
|
CPU_GET_INFO( m6509 )
|
||||||
{
|
{
|
||||||
m6509_Regs *cpustate = (device != NULL) ? device->token : NULL;
|
m6509_Regs *cpustate = (device != NULL && device != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
@ -80,6 +80,15 @@ struct _m65ce02_Regs {
|
|||||||
m6502_write_indexed_func wrmem_id; /* writemem callback for indexed instructions */
|
m6502_write_indexed_func wrmem_id; /* writemem callback for indexed instructions */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE m65ce02_Regs *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_M65CE02);
|
||||||
|
return (m65ce02_Regs *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
/***************************************************************
|
/***************************************************************
|
||||||
* include the opcode macros, functions and tables
|
* include the opcode macros, functions and tables
|
||||||
***************************************************************/
|
***************************************************************/
|
||||||
@ -91,7 +100,7 @@ static void default_wdmem_id(const address_space *space, offs_t address, UINT8 d
|
|||||||
|
|
||||||
static CPU_INIT( m65ce02 )
|
static CPU_INIT( m65ce02 )
|
||||||
{
|
{
|
||||||
m65ce02_Regs *cpustate = device->token;
|
m65ce02_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->rdmem_id = default_rdmem_id;
|
cpustate->rdmem_id = default_rdmem_id;
|
||||||
cpustate->wrmem_id = default_wdmem_id;
|
cpustate->wrmem_id = default_wdmem_id;
|
||||||
@ -102,7 +111,7 @@ static CPU_INIT( m65ce02 )
|
|||||||
|
|
||||||
static CPU_RESET( m65ce02 )
|
static CPU_RESET( m65ce02 )
|
||||||
{
|
{
|
||||||
m65ce02_Regs *cpustate = device->token;
|
m65ce02_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->insn = insn65ce02;
|
cpustate->insn = insn65ce02;
|
||||||
|
|
||||||
@ -148,7 +157,7 @@ INLINE void m65ce02_take_irq(m65ce02_Regs *cpustate)
|
|||||||
|
|
||||||
static CPU_EXECUTE( m65ce02 )
|
static CPU_EXECUTE( m65ce02 )
|
||||||
{
|
{
|
||||||
m65ce02_Regs *cpustate = device->token;
|
m65ce02_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
@ -227,7 +236,7 @@ static void m65ce02_set_irq_line(m65ce02_Regs *cpustate, int irqline, int state)
|
|||||||
|
|
||||||
static CPU_SET_INFO( m65ce02 )
|
static CPU_SET_INFO( m65ce02 )
|
||||||
{
|
{
|
||||||
m65ce02_Regs *cpustate = device->token;
|
m65ce02_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch( state )
|
switch( state )
|
||||||
{
|
{
|
||||||
@ -260,7 +269,7 @@ static CPU_SET_INFO( m65ce02 )
|
|||||||
|
|
||||||
CPU_GET_INFO( m65ce02 )
|
CPU_GET_INFO( m65ce02 )
|
||||||
{
|
{
|
||||||
m65ce02_Regs *cpustate = (device != NULL) ? device->token : NULL;
|
m65ce02_Regs *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch( state )
|
switch( state )
|
||||||
{
|
{
|
||||||
|
@ -47,7 +47,7 @@ enum op_names {
|
|||||||
oim, ora, orb, psha, pshb, pshx, pula, pulb,
|
oim, ora, orb, psha, pshb, pshx, pula, pulb,
|
||||||
pulx, rol, rola, rolb, ror, rora, rorb, rti,
|
pulx, rol, rola, rolb, ror, rora, rorb, rti,
|
||||||
rts, sba, sbca, sbcb, sec, sev, sta, stb,
|
rts, sba, sbca, sbcb, sec, sev, sta, stb,
|
||||||
std, sei, sts, stx, suba, subb, subd, swi,
|
_std, sei, sts, stx, suba, subb, subd, swi,
|
||||||
wai, tab, tap, tba, tim, tpa, tst, tsta,
|
wai, tab, tap, tba, tim, tpa, tst, tsta,
|
||||||
tstb, tsx, txs, asx1, asx2, xgdx, addx, adcx
|
tstb, tsx, txs, asx1, asx2, xgdx, addx, adcx
|
||||||
};
|
};
|
||||||
@ -131,19 +131,19 @@ static const UINT8 table[0x102][3] = {
|
|||||||
{subb,imb,0},{cmpb,imb,0},{sbcb,imb,0},{addd,imw,1},/* c0 */
|
{subb,imb,0},{cmpb,imb,0},{sbcb,imb,0},{addd,imw,1},/* c0 */
|
||||||
{andb,imb,0},{bitb,imb,0},{ldb, imb,0},{stb, imb,0},
|
{andb,imb,0},{bitb,imb,0},{ldb, imb,0},{stb, imb,0},
|
||||||
{eorb,imb,0},{adcb,imb,0},{orb, imb,0},{addb,imb,0},
|
{eorb,imb,0},{adcb,imb,0},{orb, imb,0},{addb,imb,0},
|
||||||
{ldd, imw,1},{std, imw,1},{ldx, imw,0},{stx, imw,0},
|
{ldd, imw,1},{_std,imw,1},{ldx, imw,0},{stx, imw,0},
|
||||||
{subb,dir,0},{cmpb,dir,0},{sbcb,dir,0},{addd,dir,1},/* d0 */
|
{subb,dir,0},{cmpb,dir,0},{sbcb,dir,0},{addd,dir,1},/* d0 */
|
||||||
{andb,dir,0},{bitb,dir,0},{ldb, dir,0},{stb, dir,0},
|
{andb,dir,0},{bitb,dir,0},{ldb, dir,0},{stb, dir,0},
|
||||||
{eorb,dir,0},{adcb,dir,0},{orb, dir,0},{addb,dir,0},
|
{eorb,dir,0},{adcb,dir,0},{orb, dir,0},{addb,dir,0},
|
||||||
{ldd, dir,1},{std, dir,1},{ldx, dir,0},{stx, dir,0},
|
{ldd, dir,1},{_std,dir,1},{ldx, dir,0},{stx, dir,0},
|
||||||
{subb,idx,0},{cmpb,idx,0},{sbcb,idx,0},{addd,idx,1},/* e0 */
|
{subb,idx,0},{cmpb,idx,0},{sbcb,idx,0},{addd,idx,1},/* e0 */
|
||||||
{andb,idx,0},{bitb,idx,0},{ldb, idx,0},{stb, idx,0},
|
{andb,idx,0},{bitb,idx,0},{ldb, idx,0},{stb, idx,0},
|
||||||
{eorb,idx,0},{adcb,idx,0},{orb, idx,0},{addb,idx,0},
|
{eorb,idx,0},{adcb,idx,0},{orb, idx,0},{addb,idx,0},
|
||||||
{ldd, idx,1},{std, idx,1},{ldx, idx,0},{stx, idx,0},
|
{ldd, idx,1},{_std,idx,1},{ldx, idx,0},{stx, idx,0},
|
||||||
{subb,ext,0},{cmpb,ext,0},{sbcb,ext,0},{addd,ext,1},/* f0 */
|
{subb,ext,0},{cmpb,ext,0},{sbcb,ext,0},{addd,ext,1},/* f0 */
|
||||||
{andb,ext,0},{bitb,ext,0},{ldb, ext,0},{stb, ext,0},
|
{andb,ext,0},{bitb,ext,0},{ldb, ext,0},{stb, ext,0},
|
||||||
{eorb,ext,0},{adcb,ext,0},{orb, ext,0},{addb,ext,0},
|
{eorb,ext,0},{adcb,ext,0},{orb, ext,0},{addb,ext,0},
|
||||||
{ldd, ext,1},{std, ext,1},{ldx, ext,0},{stx, ext,0},
|
{ldd, ext,1},{_std,ext,1},{ldx, ext,0},{stx, ext,0},
|
||||||
|
|
||||||
/* extra instruction $fc for NSC-8105 */
|
/* extra instruction $fc for NSC-8105 */
|
||||||
{addx,ext,0},
|
{addx,ext,0},
|
||||||
|
@ -152,7 +152,20 @@ struct _m6800_state
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//static void *token; /* for READ8/WRITE8 handlers */
|
INLINE m6800_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_M6800 ||
|
||||||
|
cpu_get_type(device) == CPU_M6801 ||
|
||||||
|
cpu_get_type(device) == CPU_M6802 ||
|
||||||
|
cpu_get_type(device) == CPU_M6803 ||
|
||||||
|
cpu_get_type(device) == CPU_M6808 ||
|
||||||
|
cpu_get_type(device) == CPU_HD63701 ||
|
||||||
|
cpu_get_type(device) == CPU_NSC8105);
|
||||||
|
return (m6800_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
static void hd63701_trap_pc(m6800_state *cpustate);
|
static void hd63701_trap_pc(m6800_state *cpustate);
|
||||||
@ -663,7 +676,7 @@ static int m6800_rx(m6800_state *cpustate)
|
|||||||
|
|
||||||
static TIMER_CALLBACK(m6800_tx_tick)
|
static TIMER_CALLBACK(m6800_tx_tick)
|
||||||
{
|
{
|
||||||
m6800_state *cpustate = ptr;
|
m6800_state *cpustate = (m6800_state *)ptr;
|
||||||
|
|
||||||
if (cpustate->trcsr & M6800_TRCSR_TE)
|
if (cpustate->trcsr & M6800_TRCSR_TE)
|
||||||
{
|
{
|
||||||
@ -737,7 +750,7 @@ static TIMER_CALLBACK(m6800_tx_tick)
|
|||||||
|
|
||||||
static TIMER_CALLBACK(m6800_rx_tick)
|
static TIMER_CALLBACK(m6800_rx_tick)
|
||||||
{
|
{
|
||||||
m6800_state *cpustate =ptr;
|
m6800_state *cpustate = (m6800_state *)ptr;
|
||||||
|
|
||||||
if (cpustate->trcsr & M6800_TRCSR_RE)
|
if (cpustate->trcsr & M6800_TRCSR_RE)
|
||||||
{
|
{
|
||||||
@ -884,7 +897,7 @@ static void state_register(m6800_state *cpustate, const char *type)
|
|||||||
|
|
||||||
static CPU_INIT( m6800 )
|
static CPU_INIT( m6800 )
|
||||||
{
|
{
|
||||||
m6800_state *cpustate = device->token;
|
m6800_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
|
cpustate->program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
|
||||||
cpustate->data = memory_find_address_space(device, ADDRESS_SPACE_DATA);
|
cpustate->data = memory_find_address_space(device, ADDRESS_SPACE_DATA);
|
||||||
@ -900,7 +913,7 @@ static CPU_INIT( m6800 )
|
|||||||
|
|
||||||
static CPU_RESET( m6800 )
|
static CPU_RESET( m6800 )
|
||||||
{
|
{
|
||||||
m6800_state *cpustate = device->token;
|
m6800_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
SEI; /* IRQ disabled */
|
SEI; /* IRQ disabled */
|
||||||
PCD = RM16(cpustate, 0xfffe );
|
PCD = RM16(cpustate, 0xfffe );
|
||||||
@ -1242,7 +1255,7 @@ INLINE void m6800_execute_one(m6800_state *cpustate, UINT8 ireg)
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static CPU_EXECUTE( m6800 )
|
static CPU_EXECUTE( m6800 )
|
||||||
{
|
{
|
||||||
m6800_state *cpustate = device->token;
|
m6800_state *cpustate = get_safe_token(device);
|
||||||
UINT8 ireg;
|
UINT8 ireg;
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
@ -1276,7 +1289,7 @@ static CPU_EXECUTE( m6800 )
|
|||||||
#if (HAS_M6801)
|
#if (HAS_M6801)
|
||||||
static CPU_INIT( m6801 )
|
static CPU_INIT( m6801 )
|
||||||
{
|
{
|
||||||
m6800_state *cpustate = device->token;
|
m6800_state *cpustate = get_safe_token(device);
|
||||||
// cpustate->subtype = SUBTYPE_M6801;
|
// cpustate->subtype = SUBTYPE_M6801;
|
||||||
cpustate->insn = m6803_insn;
|
cpustate->insn = m6803_insn;
|
||||||
cpustate->cycles = cycles_6803;
|
cpustate->cycles = cycles_6803;
|
||||||
@ -1301,7 +1314,7 @@ static CPU_INIT( m6801 )
|
|||||||
#if (HAS_M6802)
|
#if (HAS_M6802)
|
||||||
static CPU_INIT( m6802 )
|
static CPU_INIT( m6802 )
|
||||||
{
|
{
|
||||||
m6800_state *cpustate = device->token;
|
m6800_state *cpustate = get_safe_token(device);
|
||||||
// cpustate->subtype = SUBTYPE_M6802;
|
// cpustate->subtype = SUBTYPE_M6802;
|
||||||
cpustate->insn = m6800_insn;
|
cpustate->insn = m6800_insn;
|
||||||
cpustate->cycles = cycles_6800;
|
cpustate->cycles = cycles_6800;
|
||||||
@ -1322,7 +1335,7 @@ static CPU_INIT( m6802 )
|
|||||||
#if (HAS_M6803)
|
#if (HAS_M6803)
|
||||||
static CPU_INIT( m6803 )
|
static CPU_INIT( m6803 )
|
||||||
{
|
{
|
||||||
m6800_state *cpustate = device->token;
|
m6800_state *cpustate = get_safe_token(device);
|
||||||
// cpustate->subtype = SUBTYPE_M6803;
|
// cpustate->subtype = SUBTYPE_M6803;
|
||||||
cpustate->insn = m6803_insn;
|
cpustate->insn = m6803_insn;
|
||||||
cpustate->cycles = cycles_6803;
|
cpustate->cycles = cycles_6803;
|
||||||
@ -1614,7 +1627,7 @@ INLINE void m6803_execute_one(m6800_state *cpustate, UINT8 ireg)
|
|||||||
#if (HAS_M6803||HAS_M6801)
|
#if (HAS_M6803||HAS_M6801)
|
||||||
static CPU_EXECUTE( m6803 )
|
static CPU_EXECUTE( m6803 )
|
||||||
{
|
{
|
||||||
m6800_state *cpustate = device->token;
|
m6800_state *cpustate = get_safe_token(device);
|
||||||
UINT8 ireg;
|
UINT8 ireg;
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
@ -1662,7 +1675,7 @@ ADDRESS_MAP_END
|
|||||||
#if (HAS_M6808)
|
#if (HAS_M6808)
|
||||||
static CPU_INIT( m6808 )
|
static CPU_INIT( m6808 )
|
||||||
{
|
{
|
||||||
m6800_state *cpustate = device->token;
|
m6800_state *cpustate = get_safe_token(device);
|
||||||
// cpustate->subtype = SUBTYPE_M6808;
|
// cpustate->subtype = SUBTYPE_M6808;
|
||||||
cpustate->insn = m6800_insn;
|
cpustate->insn = m6800_insn;
|
||||||
cpustate->cycles = cycles_6800;
|
cpustate->cycles = cycles_6800;
|
||||||
@ -1684,7 +1697,7 @@ static CPU_INIT( m6808 )
|
|||||||
|
|
||||||
static CPU_INIT( hd63701 )
|
static CPU_INIT( hd63701 )
|
||||||
{
|
{
|
||||||
m6800_state *cpustate = device->token;
|
m6800_state *cpustate = get_safe_token(device);
|
||||||
// cpustate->subtype = SUBTYPE_HD63701;
|
// cpustate->subtype = SUBTYPE_HD63701;
|
||||||
cpustate->insn = hd63701_insn;
|
cpustate->insn = hd63701_insn;
|
||||||
cpustate->cycles = cycles_63701;
|
cpustate->cycles = cycles_63701;
|
||||||
@ -1974,7 +1987,7 @@ INLINE void hd63071_execute_one(m6800_state *cpustate, UINT8 ireg)
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static CPU_EXECUTE( hd63701 )
|
static CPU_EXECUTE( hd63701 )
|
||||||
{
|
{
|
||||||
m6800_state *cpustate = device->token;
|
m6800_state *cpustate = get_safe_token(device);
|
||||||
UINT8 ireg;
|
UINT8 ireg;
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
@ -2037,7 +2050,7 @@ WRITE8_HANDLER( hd63701_internal_registers_w )
|
|||||||
#if (HAS_NSC8105)
|
#if (HAS_NSC8105)
|
||||||
static CPU_INIT( nsc8105 )
|
static CPU_INIT( nsc8105 )
|
||||||
{
|
{
|
||||||
m6800_state *cpustate = device->token;
|
m6800_state *cpustate = get_safe_token(device);
|
||||||
// cpustate->subtype = SUBTYPE_NSC8105;
|
// cpustate->subtype = SUBTYPE_NSC8105;
|
||||||
cpustate->device = device;
|
cpustate->device = device;
|
||||||
|
|
||||||
@ -2322,7 +2335,7 @@ INLINE void nsc8105_execute_one(m6800_state *cpustate, UINT8 ireg)
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static CPU_EXECUTE( nsc8105 )
|
static CPU_EXECUTE( nsc8105 )
|
||||||
{
|
{
|
||||||
m6800_state *cpustate = device->token;
|
m6800_state *cpustate = get_safe_token(device);
|
||||||
UINT8 ireg;
|
UINT8 ireg;
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
@ -2356,7 +2369,7 @@ static CPU_EXECUTE( nsc8105 )
|
|||||||
|
|
||||||
static READ8_HANDLER( m6803_internal_registers_r )
|
static READ8_HANDLER( m6803_internal_registers_r )
|
||||||
{
|
{
|
||||||
m6800_state *cpustate = space->cpu->token;
|
m6800_state *cpustate = get_safe_token(space->cpu);
|
||||||
|
|
||||||
switch (offset)
|
switch (offset)
|
||||||
{
|
{
|
||||||
@ -2454,7 +2467,7 @@ static READ8_HANDLER( m6803_internal_registers_r )
|
|||||||
|
|
||||||
static WRITE8_HANDLER( m6803_internal_registers_w )
|
static WRITE8_HANDLER( m6803_internal_registers_w )
|
||||||
{
|
{
|
||||||
m6800_state *cpustate = space->cpu->token;
|
m6800_state *cpustate = get_safe_token(space->cpu);
|
||||||
|
|
||||||
switch (offset)
|
switch (offset)
|
||||||
{
|
{
|
||||||
@ -2650,7 +2663,7 @@ static WRITE8_HANDLER( m6803_internal_registers_w )
|
|||||||
|
|
||||||
static CPU_SET_INFO( m6800 )
|
static CPU_SET_INFO( m6800 )
|
||||||
{
|
{
|
||||||
m6800_state *cpustate = device->token;
|
m6800_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -2678,7 +2691,7 @@ static CPU_SET_INFO( m6800 )
|
|||||||
|
|
||||||
CPU_GET_INFO( m6800 )
|
CPU_GET_INFO( m6800 )
|
||||||
{
|
{
|
||||||
m6800_state *cpustate = device ? device->token : NULL;
|
m6800_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : 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 --- */
|
||||||
|
@ -474,6 +474,20 @@ static const cpu_state_table state_table_template =
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
INLINE m68ki_cpu_core *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_M68000 ||
|
||||||
|
cpu_get_type(device) == CPU_M68008 ||
|
||||||
|
cpu_get_type(device) == CPU_M68010 ||
|
||||||
|
cpu_get_type(device) == CPU_M68EC020 ||
|
||||||
|
cpu_get_type(device) == CPU_M68020 ||
|
||||||
|
cpu_get_type(device) == CPU_M68040);
|
||||||
|
return (m68ki_cpu_core *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
/* ======================================================================== */
|
/* ======================================================================== */
|
||||||
/* ================================= API ================================== */
|
/* ================================= API ================================== */
|
||||||
/* ======================================================================== */
|
/* ======================================================================== */
|
||||||
@ -504,7 +518,7 @@ static void set_irq_line(m68ki_cpu_core *m68k, int irqline, int state)
|
|||||||
|
|
||||||
static void m68k_presave(running_machine *machine, void *param)
|
static void m68k_presave(running_machine *machine, void *param)
|
||||||
{
|
{
|
||||||
m68ki_cpu_core *m68k = param;
|
m68ki_cpu_core *m68k = (m68ki_cpu_core *)param;
|
||||||
m68k->save_sr = m68ki_get_sr(m68k);
|
m68k->save_sr = m68ki_get_sr(m68k);
|
||||||
m68k->save_stopped = (m68k->stopped & STOP_LEVEL_STOP) != 0;
|
m68k->save_stopped = (m68k->stopped & STOP_LEVEL_STOP) != 0;
|
||||||
m68k->save_halted = (m68k->stopped & STOP_LEVEL_HALT) != 0;
|
m68k->save_halted = (m68k->stopped & STOP_LEVEL_HALT) != 0;
|
||||||
@ -512,7 +526,7 @@ static void m68k_presave(running_machine *machine, void *param)
|
|||||||
|
|
||||||
static void m68k_postload(running_machine *machine, void *param)
|
static void m68k_postload(running_machine *machine, void *param)
|
||||||
{
|
{
|
||||||
m68ki_cpu_core *m68k = param;
|
m68ki_cpu_core *m68k = (m68ki_cpu_core *)param;
|
||||||
m68ki_set_sr_noint_nosp(m68k, m68k->save_sr);
|
m68ki_set_sr_noint_nosp(m68k, m68k->save_sr);
|
||||||
m68k->stopped = m68k->save_stopped ? STOP_LEVEL_STOP : 0
|
m68k->stopped = m68k->save_stopped ? STOP_LEVEL_STOP : 0
|
||||||
| m68k->save_halted ? STOP_LEVEL_HALT : 0;
|
| m68k->save_halted ? STOP_LEVEL_HALT : 0;
|
||||||
@ -523,7 +537,7 @@ static void m68k_postload(running_machine *machine, void *param)
|
|||||||
/* Execute some instructions until we use up cycles clock cycles */
|
/* Execute some instructions until we use up cycles clock cycles */
|
||||||
static CPU_EXECUTE( m68k )
|
static CPU_EXECUTE( m68k )
|
||||||
{
|
{
|
||||||
m68ki_cpu_core *m68k = device->token;
|
m68ki_cpu_core *m68k = get_safe_token(device);
|
||||||
|
|
||||||
/* Set our pool of clock cycles available */
|
/* Set our pool of clock cycles available */
|
||||||
m68k->remaining_cycles = cycles;
|
m68k->remaining_cycles = cycles;
|
||||||
@ -572,7 +586,7 @@ static CPU_EXECUTE( m68k )
|
|||||||
static CPU_INIT( m68k )
|
static CPU_INIT( m68k )
|
||||||
{
|
{
|
||||||
static UINT32 emulation_initialized = 0;
|
static UINT32 emulation_initialized = 0;
|
||||||
m68ki_cpu_core *m68k = device->token;
|
m68ki_cpu_core *m68k = get_safe_token(device);
|
||||||
|
|
||||||
m68k->device = device;
|
m68k->device = device;
|
||||||
m68k->program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
|
m68k->program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
|
||||||
@ -614,7 +628,7 @@ static CPU_INIT( m68k )
|
|||||||
/* Pulse the RESET line on the CPU */
|
/* Pulse the RESET line on the CPU */
|
||||||
static CPU_RESET( m68k )
|
static CPU_RESET( m68k )
|
||||||
{
|
{
|
||||||
m68ki_cpu_core *m68k = device->token;
|
m68ki_cpu_core *m68k = get_safe_token(device);
|
||||||
|
|
||||||
/* Clear all stop levels and eat up all remaining cycles */
|
/* Clear all stop levels and eat up all remaining cycles */
|
||||||
m68k->stopped = 0;
|
m68k->stopped = 0;
|
||||||
@ -650,7 +664,7 @@ static CPU_RESET( m68k )
|
|||||||
|
|
||||||
static CPU_DISASSEMBLE( m68k )
|
static CPU_DISASSEMBLE( m68k )
|
||||||
{
|
{
|
||||||
m68ki_cpu_core *m68k = device->token;
|
m68ki_cpu_core *m68k = get_safe_token(device);
|
||||||
return m68k_disassemble_raw(buffer, pc, oprom, opram, m68k->dasm_type);
|
return m68k_disassemble_raw(buffer, pc, oprom, opram, m68k->dasm_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -662,7 +676,7 @@ static CPU_DISASSEMBLE( m68k )
|
|||||||
|
|
||||||
static CPU_IMPORT_STATE( m68k )
|
static CPU_IMPORT_STATE( m68k )
|
||||||
{
|
{
|
||||||
m68ki_cpu_core *m68k = device->token;
|
m68ki_cpu_core *m68k = get_safe_token(device);
|
||||||
|
|
||||||
switch (entry->index)
|
switch (entry->index)
|
||||||
{
|
{
|
||||||
@ -700,7 +714,7 @@ static CPU_IMPORT_STATE( m68k )
|
|||||||
|
|
||||||
static CPU_EXPORT_STATE( m68k )
|
static CPU_EXPORT_STATE( m68k )
|
||||||
{
|
{
|
||||||
m68ki_cpu_core *m68k = device->token;
|
m68ki_cpu_core *m68k = get_safe_token(device);
|
||||||
|
|
||||||
switch (entry->index)
|
switch (entry->index)
|
||||||
{
|
{
|
||||||
@ -728,7 +742,7 @@ static CPU_EXPORT_STATE( m68k )
|
|||||||
|
|
||||||
static CPU_SET_INFO( m68k )
|
static CPU_SET_INFO( m68k )
|
||||||
{
|
{
|
||||||
m68ki_cpu_core *m68k = device->token;
|
m68ki_cpu_core *m68k = get_safe_token(device);
|
||||||
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 --- */
|
||||||
@ -754,7 +768,7 @@ static CPU_SET_INFO( m68k )
|
|||||||
|
|
||||||
static CPU_GET_INFO( m68k )
|
static CPU_GET_INFO( m68k )
|
||||||
{
|
{
|
||||||
m68ki_cpu_core *m68k = (device != NULL) ? device->token : NULL;
|
m68ki_cpu_core *m68k = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
int sr;
|
int sr;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
@ -832,7 +846,7 @@ static CPU_GET_INFO( m68k )
|
|||||||
|
|
||||||
void m68k_set_encrypted_opcode_range(const device_config *device, offs_t start, offs_t end)
|
void m68k_set_encrypted_opcode_range(const device_config *device, offs_t start, offs_t end)
|
||||||
{
|
{
|
||||||
m68ki_cpu_core *m68k = device->token;
|
m68ki_cpu_core *m68k = get_safe_token(device);
|
||||||
m68k->encrypted_start = start;
|
m68k->encrypted_start = start;
|
||||||
m68k->encrypted_end = end;
|
m68k->encrypted_end = end;
|
||||||
}
|
}
|
||||||
@ -866,7 +880,7 @@ static const m68k_memory_interface interface_d8 =
|
|||||||
|
|
||||||
static UINT16 read_immediate_16(const address_space *space, offs_t address)
|
static UINT16 read_immediate_16(const address_space *space, offs_t address)
|
||||||
{
|
{
|
||||||
m68ki_cpu_core *m68k = space->cpu->token;
|
m68ki_cpu_core *m68k = get_safe_token(space->cpu);
|
||||||
return memory_decrypted_read_word(space, (address) ^ m68k->memory.opcode_xor);
|
return memory_decrypted_read_word(space, (address) ^ m68k->memory.opcode_xor);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -972,7 +986,7 @@ static const m68k_memory_interface interface_d32 =
|
|||||||
|
|
||||||
static CPU_INIT( m68000 )
|
static CPU_INIT( m68000 )
|
||||||
{
|
{
|
||||||
m68ki_cpu_core *m68k = device->token;
|
m68ki_cpu_core *m68k = get_safe_token(device);
|
||||||
|
|
||||||
CPU_INIT_CALL(m68k);
|
CPU_INIT_CALL(m68k);
|
||||||
|
|
||||||
@ -1015,7 +1029,7 @@ CPU_GET_INFO( m68000 )
|
|||||||
|
|
||||||
static CPU_INIT( m68008 )
|
static CPU_INIT( m68008 )
|
||||||
{
|
{
|
||||||
m68ki_cpu_core *m68k = device->token;
|
m68ki_cpu_core *m68k = get_safe_token(device);
|
||||||
|
|
||||||
CPU_INIT_CALL(m68k);
|
CPU_INIT_CALL(m68k);
|
||||||
|
|
||||||
@ -1062,7 +1076,7 @@ CPU_GET_INFO( m68008 )
|
|||||||
|
|
||||||
static CPU_INIT( m68010 )
|
static CPU_INIT( m68010 )
|
||||||
{
|
{
|
||||||
m68ki_cpu_core *m68k = device->token;
|
m68ki_cpu_core *m68k = get_safe_token(device);
|
||||||
|
|
||||||
CPU_INIT_CALL(m68k);
|
CPU_INIT_CALL(m68k);
|
||||||
|
|
||||||
@ -1105,7 +1119,7 @@ CPU_GET_INFO( m68010 )
|
|||||||
|
|
||||||
static CPU_INIT( m68020 )
|
static CPU_INIT( m68020 )
|
||||||
{
|
{
|
||||||
m68ki_cpu_core *m68k = device->token;
|
m68ki_cpu_core *m68k = get_safe_token(device);
|
||||||
|
|
||||||
CPU_INIT_CALL(m68k);
|
CPU_INIT_CALL(m68k);
|
||||||
|
|
||||||
@ -1129,7 +1143,7 @@ static CPU_INIT( m68020 )
|
|||||||
|
|
||||||
CPU_GET_INFO( m68020 )
|
CPU_GET_INFO( m68020 )
|
||||||
{
|
{
|
||||||
m68ki_cpu_core *m68k = (device != NULL) ? device->token : NULL;
|
m68ki_cpu_core *m68k = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
int sr;
|
int sr;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
@ -1180,7 +1194,7 @@ CPU_GET_INFO( m68020 )
|
|||||||
|
|
||||||
static CPU_INIT( m68ec020 )
|
static CPU_INIT( m68ec020 )
|
||||||
{
|
{
|
||||||
m68ki_cpu_core *m68k = device->token;
|
m68ki_cpu_core *m68k = get_safe_token(device);
|
||||||
|
|
||||||
CPU_INIT_CALL(m68k);
|
CPU_INIT_CALL(m68k);
|
||||||
|
|
||||||
@ -1225,7 +1239,7 @@ CPU_GET_INFO( m68ec020 )
|
|||||||
|
|
||||||
static CPU_INIT( m68040 )
|
static CPU_INIT( m68040 )
|
||||||
{
|
{
|
||||||
m68ki_cpu_core *m68k = device->token;
|
m68ki_cpu_core *m68k = get_safe_token(device);
|
||||||
|
|
||||||
CPU_INIT_CALL(m68k);
|
CPU_INIT_CALL(m68k);
|
||||||
|
|
||||||
@ -1249,7 +1263,7 @@ static CPU_INIT( m68040 )
|
|||||||
|
|
||||||
CPU_GET_INFO( m68040 )
|
CPU_GET_INFO( m68040 )
|
||||||
{
|
{
|
||||||
m68ki_cpu_core *m68k = (device != NULL) ? device->token : NULL;
|
m68ki_cpu_core *m68k = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
int sr;
|
int sr;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
|
@ -564,7 +564,6 @@ struct _m68ki_cpu_core
|
|||||||
int initial_cycles;
|
int initial_cycles;
|
||||||
int remaining_cycles; /* Number of clocks remaining */
|
int remaining_cycles; /* Number of clocks remaining */
|
||||||
UINT32 tracing;
|
UINT32 tracing;
|
||||||
UINT32 address_space;
|
|
||||||
|
|
||||||
jmp_buf aerr_trap;
|
jmp_buf aerr_trap;
|
||||||
UINT32 aerr_address;
|
UINT32 aerr_address;
|
||||||
|
@ -1213,7 +1213,7 @@ static void read_insert(char* insert)
|
|||||||
/* ============================= MAIN FUNCTION ============================ */
|
/* ============================= MAIN FUNCTION ============================ */
|
||||||
/* ======================================================================== */
|
/* ======================================================================== */
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
/* File stuff */
|
/* File stuff */
|
||||||
char output_path[M68K_MAX_DIR] = "";
|
char output_path[M68K_MAX_DIR] = "";
|
||||||
|
@ -66,6 +66,17 @@ typedef struct
|
|||||||
int nmi_state;
|
int nmi_state;
|
||||||
} m6805_Regs;
|
} m6805_Regs;
|
||||||
|
|
||||||
|
INLINE m6805_Regs *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_M6805 ||
|
||||||
|
cpu_get_type(device) == CPU_M68705 ||
|
||||||
|
cpu_get_type(device) == CPU_HD63705);
|
||||||
|
return (m6805_Regs *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
/* Read a byte from given memory location */
|
/* Read a byte from given memory location */
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
@ -452,7 +463,7 @@ static void state_register(m6805_Regs *cpustate, const char *type, const device_
|
|||||||
|
|
||||||
static CPU_INIT( m6805 )
|
static CPU_INIT( m6805 )
|
||||||
{
|
{
|
||||||
m6805_Regs *cpustate = device->token;
|
m6805_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
state_register(cpustate, "m6805", device);
|
state_register(cpustate, "m6805", device);
|
||||||
cpustate->irq_callback = irqcallback;
|
cpustate->irq_callback = irqcallback;
|
||||||
@ -462,7 +473,7 @@ static CPU_INIT( m6805 )
|
|||||||
|
|
||||||
static CPU_RESET( m6805 )
|
static CPU_RESET( m6805 )
|
||||||
{
|
{
|
||||||
m6805_Regs *cpustate = device->token;
|
m6805_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpu_irq_callback save_irqcallback = cpustate->irq_callback;
|
cpu_irq_callback save_irqcallback = cpustate->irq_callback;
|
||||||
memset(cpustate, 0, sizeof(m6805_Regs));
|
memset(cpustate, 0, sizeof(m6805_Regs));
|
||||||
@ -509,7 +520,7 @@ static void set_irq_line( m6805_Regs *cpustate, int irqline, int state )
|
|||||||
static CPU_EXECUTE( m6805 )
|
static CPU_EXECUTE( m6805 )
|
||||||
{
|
{
|
||||||
UINT8 ireg;
|
UINT8 ireg;
|
||||||
m6805_Regs *cpustate = device->token;
|
m6805_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
S = SP_ADJUST( S ); /* Taken from CPU_SET_CONTEXT when pointer'afying */
|
S = SP_ADJUST( S ); /* Taken from CPU_SET_CONTEXT when pointer'afying */
|
||||||
cpustate->iCount = cycles;
|
cpustate->iCount = cycles;
|
||||||
@ -809,7 +820,7 @@ static CPU_EXECUTE( m6805 )
|
|||||||
#if (HAS_M68705)
|
#if (HAS_M68705)
|
||||||
static CPU_INIT( m68705 )
|
static CPU_INIT( m68705 )
|
||||||
{
|
{
|
||||||
m6805_Regs *cpustate = device->token;
|
m6805_Regs *cpustate = get_safe_token(device);
|
||||||
state_register(cpustate, "m68705", device);
|
state_register(cpustate, "m68705", device);
|
||||||
cpustate->irq_callback = irqcallback;
|
cpustate->irq_callback = irqcallback;
|
||||||
cpustate->device = device;
|
cpustate->device = device;
|
||||||
@ -817,7 +828,7 @@ static CPU_INIT( m68705 )
|
|||||||
|
|
||||||
static CPU_RESET( m68705 )
|
static CPU_RESET( m68705 )
|
||||||
{
|
{
|
||||||
m6805_Regs *cpustate = device->token;
|
m6805_Regs *cpustate = get_safe_token(device);
|
||||||
CPU_RESET_CALL(m6805);
|
CPU_RESET_CALL(m6805);
|
||||||
|
|
||||||
/* Overide default 6805 type */
|
/* Overide default 6805 type */
|
||||||
@ -840,7 +851,7 @@ static void m68705_set_irq_line(m6805_Regs *cpustate, int irqline, int state)
|
|||||||
#if (HAS_HD63705)
|
#if (HAS_HD63705)
|
||||||
static CPU_INIT( hd63705 )
|
static CPU_INIT( hd63705 )
|
||||||
{
|
{
|
||||||
m6805_Regs *cpustate = device->token;
|
m6805_Regs *cpustate = get_safe_token(device);
|
||||||
state_register(cpustate, "hd63705", device);
|
state_register(cpustate, "hd63705", device);
|
||||||
cpustate->irq_callback = irqcallback;
|
cpustate->irq_callback = irqcallback;
|
||||||
cpustate->device = device;
|
cpustate->device = device;
|
||||||
@ -848,7 +859,7 @@ static CPU_INIT( hd63705 )
|
|||||||
|
|
||||||
static CPU_RESET( hd63705 )
|
static CPU_RESET( hd63705 )
|
||||||
{
|
{
|
||||||
m6805_Regs *cpustate = device->token;
|
m6805_Regs *cpustate = get_safe_token(device);
|
||||||
CPU_RESET_CALL(m6805);
|
CPU_RESET_CALL(m6805);
|
||||||
|
|
||||||
/* Overide default 6805 types */
|
/* Overide default 6805 types */
|
||||||
@ -886,7 +897,7 @@ static void hd63705_set_irq_line(m6805_Regs *cpustate, int irqline, int state)
|
|||||||
|
|
||||||
static CPU_SET_INFO( m6805 )
|
static CPU_SET_INFO( m6805 )
|
||||||
{
|
{
|
||||||
m6805_Regs *cpustate = device->token;
|
m6805_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -911,7 +922,7 @@ static CPU_SET_INFO( m6805 )
|
|||||||
|
|
||||||
CPU_GET_INFO( m6805 )
|
CPU_GET_INFO( m6805 )
|
||||||
{
|
{
|
||||||
m6805_Regs *cpustate = (device != NULL) ? device->token : NULL;
|
m6805_Regs *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -993,7 +1004,7 @@ CPU_GET_INFO( m6805 )
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
static CPU_SET_INFO( m68705 )
|
static CPU_SET_INFO( m68705 )
|
||||||
{
|
{
|
||||||
m6805_Regs *cpustate = device->token;
|
m6805_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch(state)
|
switch(state)
|
||||||
{
|
{
|
||||||
@ -1006,7 +1017,7 @@ static CPU_SET_INFO( m68705 )
|
|||||||
|
|
||||||
CPU_GET_INFO( m68705 )
|
CPU_GET_INFO( m68705 )
|
||||||
{
|
{
|
||||||
m6805_Regs *cpustate = (device != NULL) ? device->token : NULL;
|
m6805_Regs *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -1034,7 +1045,7 @@ CPU_GET_INFO( m68705 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( hd63705 )
|
static CPU_SET_INFO( hd63705 )
|
||||||
{
|
{
|
||||||
m6805_Regs *cpustate = device->token;
|
m6805_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -1055,7 +1066,7 @@ static CPU_SET_INFO( hd63705 )
|
|||||||
|
|
||||||
CPU_GET_INFO( hd63705 )
|
CPU_GET_INFO( hd63705 )
|
||||||
{
|
{
|
||||||
m6805_Regs *cpustate = (device != NULL) ? device->token : NULL;
|
m6805_Regs *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
@ -368,7 +368,7 @@ CPU_DISASSEMBLE( m6809 )
|
|||||||
const UINT8 *operandarray;
|
const UINT8 *operandarray;
|
||||||
unsigned int ea, flags;
|
unsigned int ea, flags;
|
||||||
int numoperands, offset, indirect;
|
int numoperands, offset, indirect;
|
||||||
const m6809_config *configdata = device ? device->static_config : NULL;
|
const m6809_config *configdata = device ? (const m6809_config *)device->static_config : NULL;
|
||||||
int encrypt_only_first_byte = configdata ? configdata->encrypt_only_first_byte : 0;
|
int encrypt_only_first_byte = configdata ? configdata->encrypt_only_first_byte : 0;
|
||||||
|
|
||||||
int i, p = 0, page = 0, opcode_found = FALSE;
|
int i, p = 0, page = 0, opcode_found = FALSE;
|
||||||
|
@ -110,6 +110,16 @@ struct _m68_state_t
|
|||||||
UINT8 nmi_state;
|
UINT8 nmi_state;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE m68_state_t *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_M6809 ||
|
||||||
|
cpu_get_type(device) == CPU_M6809E);
|
||||||
|
return (m68_state_t *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
static void check_irq_lines( m68_state_t *m68_state );
|
static void check_irq_lines( m68_state_t *m68_state );
|
||||||
static void IIError(m68_state_t *m68_state);
|
static void IIError(m68_state_t *m68_state);
|
||||||
|
|
||||||
@ -366,8 +376,8 @@ static CPU_INIT( m6809 )
|
|||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
const m6809_config *configdata = device->static_config ? device->static_config : &default_config;
|
const m6809_config *configdata = device->static_config ? (const m6809_config *)device->static_config : &default_config;
|
||||||
m68_state_t *m68_state = device->token;
|
m68_state_t *m68_state = get_safe_token(device);
|
||||||
|
|
||||||
m68_state->config = configdata;
|
m68_state->config = configdata;
|
||||||
m68_state->irq_callback = irqcallback;
|
m68_state->irq_callback = irqcallback;
|
||||||
@ -397,7 +407,7 @@ static CPU_INIT( m6809 )
|
|||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
static CPU_RESET( m6809 )
|
static CPU_RESET( m6809 )
|
||||||
{
|
{
|
||||||
m68_state_t *m68_state = device->token;
|
m68_state_t *m68_state = get_safe_token(device);
|
||||||
|
|
||||||
m68_state->int_state = 0;
|
m68_state->int_state = 0;
|
||||||
m68_state->nmi_state = CLEAR_LINE;
|
m68_state->nmi_state = CLEAR_LINE;
|
||||||
@ -475,7 +485,7 @@ static void set_irq_line(m68_state_t *m68_state, int irqline, int state)
|
|||||||
/* execute instructions on this CPU until icount expires */
|
/* execute instructions on this CPU until icount expires */
|
||||||
static CPU_EXECUTE( m6809 ) /* NS 970908 */
|
static CPU_EXECUTE( m6809 ) /* NS 970908 */
|
||||||
{
|
{
|
||||||
m68_state_t *m68_state = device->token;
|
m68_state_t *m68_state = get_safe_token(device);
|
||||||
|
|
||||||
m68_state->icount = cycles - m68_state->extra_cycles;
|
m68_state->icount = cycles - m68_state->extra_cycles;
|
||||||
m68_state->extra_cycles = 0;
|
m68_state->extra_cycles = 0;
|
||||||
@ -1060,7 +1070,7 @@ INLINE void fetch_effective_address( m68_state_t *m68_state )
|
|||||||
|
|
||||||
static CPU_SET_INFO( m6809 )
|
static CPU_SET_INFO( m6809 )
|
||||||
{
|
{
|
||||||
m68_state_t *m68_state = device->token;
|
m68_state_t *m68_state = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -1091,7 +1101,7 @@ static CPU_SET_INFO( m6809 )
|
|||||||
|
|
||||||
CPU_GET_INFO( m6809 )
|
CPU_GET_INFO( m6809 )
|
||||||
{
|
{
|
||||||
m68_state_t *m68_state = (device != NULL) ? device->token : NULL;
|
m68_state_t *m68_state = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
@ -62,6 +62,15 @@ struct _mb86233_state
|
|||||||
UINT32 *Tables;
|
UINT32 *Tables;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE mb86233_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_MB86233);
|
||||||
|
return (mb86233_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
MACROS
|
MACROS
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
@ -95,7 +104,7 @@ struct _mb86233_state
|
|||||||
|
|
||||||
static CPU_INIT( mb86233 )
|
static CPU_INIT( mb86233 )
|
||||||
{
|
{
|
||||||
mb86233_state *cpustate = device->token;
|
mb86233_state *cpustate = get_safe_token(device);
|
||||||
mb86233_cpu_core * _config = (mb86233_cpu_core *)device->static_config;
|
mb86233_cpu_core * _config = (mb86233_cpu_core *)device->static_config;
|
||||||
(void)irqcallback;
|
(void)irqcallback;
|
||||||
|
|
||||||
@ -109,7 +118,7 @@ static CPU_INIT( mb86233 )
|
|||||||
cpustate->fifo_write_cb = _config->fifo_write_cb;
|
cpustate->fifo_write_cb = _config->fifo_write_cb;
|
||||||
}
|
}
|
||||||
|
|
||||||
cpustate->RAM = auto_malloc(2 * 0x200 * sizeof(UINT32)); /* 2x 2KB */
|
cpustate->RAM = (UINT32 *)auto_malloc(2 * 0x200 * sizeof(UINT32)); /* 2x 2KB */
|
||||||
memset( cpustate->RAM, 0, 2 * 0x200 * sizeof(UINT32) );
|
memset( cpustate->RAM, 0, 2 * 0x200 * sizeof(UINT32) );
|
||||||
cpustate->ARAM = &cpustate->RAM[0];
|
cpustate->ARAM = &cpustate->RAM[0];
|
||||||
cpustate->BRAM = &cpustate->RAM[0x200];
|
cpustate->BRAM = &cpustate->RAM[0x200];
|
||||||
@ -120,7 +129,7 @@ static CPU_INIT( mb86233 )
|
|||||||
|
|
||||||
static CPU_RESET( mb86233 )
|
static CPU_RESET( mb86233 )
|
||||||
{
|
{
|
||||||
mb86233_state *cpustate = device->token;
|
mb86233_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
/* zero registers and flags */
|
/* zero registers and flags */
|
||||||
cpustate->pc = 0;
|
cpustate->pc = 0;
|
||||||
@ -928,7 +937,7 @@ static UINT32 INDIRECT( mb86233_state *cpustate, UINT32 reg, int source )
|
|||||||
|
|
||||||
static CPU_EXECUTE( mb86233 )
|
static CPU_EXECUTE( mb86233 )
|
||||||
{
|
{
|
||||||
mb86233_state *cpustate = device->token;
|
mb86233_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
@ -1568,7 +1577,7 @@ static CPU_DISASSEMBLE( mb86233 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( mb86233 )
|
static CPU_SET_INFO( mb86233 )
|
||||||
{
|
{
|
||||||
mb86233_state *cpustate = device->token;
|
mb86233_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -1609,7 +1618,7 @@ static CPU_SET_INFO( mb86233 )
|
|||||||
|
|
||||||
CPU_GET_INFO( mb86233 )
|
CPU_GET_INFO( mb86233 )
|
||||||
{
|
{
|
||||||
mb86233_state *cpustate = (device != NULL) ? device->token : NULL;
|
mb86233_state *cpustate = (device != NULL && device != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
@ -60,6 +60,19 @@ struct _mb88_state
|
|||||||
int icount;
|
int icount;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE mb88_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_MB88 ||
|
||||||
|
cpu_get_type(device) == CPU_MB8841 ||
|
||||||
|
cpu_get_type(device) == CPU_MB8842 ||
|
||||||
|
cpu_get_type(device) == CPU_MB8843 ||
|
||||||
|
cpu_get_type(device) == CPU_MB8844);
|
||||||
|
return (mb88_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
MACROS
|
MACROS
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
@ -99,7 +112,7 @@ struct _mb88_state
|
|||||||
|
|
||||||
static CPU_INIT( mb88 )
|
static CPU_INIT( mb88 )
|
||||||
{
|
{
|
||||||
mb88_state *cpustate = device->token;
|
mb88_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
if ( device->static_config )
|
if ( device->static_config )
|
||||||
{
|
{
|
||||||
@ -138,7 +151,7 @@ static CPU_INIT( mb88 )
|
|||||||
|
|
||||||
static CPU_RESET( mb88 )
|
static CPU_RESET( mb88 )
|
||||||
{
|
{
|
||||||
mb88_state *cpustate = device->token;
|
mb88_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
/* zero registers and flags */
|
/* zero registers and flags */
|
||||||
cpustate->PC = 0;
|
cpustate->PC = 0;
|
||||||
@ -216,7 +229,7 @@ static void update_pio( mb88_state *cpustate )
|
|||||||
|
|
||||||
static CPU_EXECUTE( mb88 )
|
static CPU_EXECUTE( mb88 )
|
||||||
{
|
{
|
||||||
mb88_state *cpustate = device->token;
|
mb88_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
@ -737,7 +750,7 @@ static CPU_EXECUTE( mb88 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( mb88 )
|
static CPU_SET_INFO( mb88 )
|
||||||
{
|
{
|
||||||
mb88_state *cpustate = device->token;
|
mb88_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -776,7 +789,7 @@ static CPU_SET_INFO( mb88 )
|
|||||||
|
|
||||||
CPU_GET_INFO( mb88 )
|
CPU_GET_INFO( mb88 )
|
||||||
{
|
{
|
||||||
mb88_state *cpustate = (device != NULL) ? device->token : NULL;
|
mb88_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
@ -63,6 +63,15 @@ struct _hc11_state
|
|||||||
int internal_ram_size;
|
int internal_ram_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE hc11_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_MC68HC11);
|
||||||
|
return (hc11_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
#define HC11OP(XX) hc11_##XX
|
#define HC11OP(XX) hc11_##XX
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
@ -316,7 +325,7 @@ static void (*hc11_optable_page4[256])(hc11_state *cpustate);
|
|||||||
|
|
||||||
static CPU_INIT( hc11 )
|
static CPU_INIT( hc11 )
|
||||||
{
|
{
|
||||||
hc11_state *cpustate = device->token;
|
hc11_state *cpustate = get_safe_token(device);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* clear the opcode tables */
|
/* clear the opcode tables */
|
||||||
@ -347,7 +356,7 @@ static CPU_INIT( hc11 )
|
|||||||
}
|
}
|
||||||
|
|
||||||
cpustate->internal_ram_size = 1280; /* FIXME: this is for MC68HC11M0 */
|
cpustate->internal_ram_size = 1280; /* FIXME: this is for MC68HC11M0 */
|
||||||
cpustate->internal_ram = auto_malloc(cpustate->internal_ram_size);
|
cpustate->internal_ram = (UINT8 *)auto_malloc(cpustate->internal_ram_size);
|
||||||
|
|
||||||
cpustate->reg_position = 0;
|
cpustate->reg_position = 0;
|
||||||
cpustate->ram_position = 0x100;
|
cpustate->ram_position = 0x100;
|
||||||
@ -359,7 +368,7 @@ static CPU_INIT( hc11 )
|
|||||||
|
|
||||||
static CPU_RESET( hc11 )
|
static CPU_RESET( hc11 )
|
||||||
{
|
{
|
||||||
hc11_state *cpustate = device->token;
|
hc11_state *cpustate = get_safe_token(device);
|
||||||
cpustate->pc = READ16(cpustate, 0xfffe);
|
cpustate->pc = READ16(cpustate, 0xfffe);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -370,7 +379,7 @@ static CPU_EXIT( hc11 )
|
|||||||
|
|
||||||
static CPU_EXECUTE( hc11 )
|
static CPU_EXECUTE( hc11 )
|
||||||
{
|
{
|
||||||
hc11_state *cpustate = device->token;
|
hc11_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
@ -392,7 +401,7 @@ static CPU_EXECUTE( hc11 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( mc68hc11 )
|
static CPU_SET_INFO( mc68hc11 )
|
||||||
{
|
{
|
||||||
hc11_state *cpustate = device->token;
|
hc11_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -409,7 +418,7 @@ static CPU_SET_INFO( mc68hc11 )
|
|||||||
|
|
||||||
CPU_GET_INFO( mc68hc11 )
|
CPU_GET_INFO( mc68hc11 )
|
||||||
{
|
{
|
||||||
hc11_state *cpustate = (device != NULL) ? device->token : NULL;
|
hc11_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch(state)
|
switch(state)
|
||||||
{
|
{
|
||||||
|
@ -323,7 +323,7 @@ INLINE UINT8 argument_fetch(mcs48_state *cpustate)
|
|||||||
|
|
||||||
INLINE void update_regptr(mcs48_state *cpustate)
|
INLINE void update_regptr(mcs48_state *cpustate)
|
||||||
{
|
{
|
||||||
cpustate->regptr = memory_get_write_ptr(cpustate->data, (cpustate->psw & B_FLAG) ? 24 : 0);
|
cpustate->regptr = (UINT8 *)memory_get_write_ptr(cpustate->data, (cpustate->psw & B_FLAG) ? 24 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -687,8 +687,8 @@ INLINE UINT8 r_psw(mcs51_state_t *mcs51_state) { return SFR_A(ADDR_PSW); }
|
|||||||
|
|
||||||
INLINE void update_ptrs(mcs51_state_t *mcs51_state)
|
INLINE void update_ptrs(mcs51_state_t *mcs51_state)
|
||||||
{
|
{
|
||||||
mcs51_state->internal_ram = memory_get_write_ptr(mcs51_state->data, 0x00);
|
mcs51_state->internal_ram = (UINT8 *)memory_get_write_ptr(mcs51_state->data, 0x00);
|
||||||
mcs51_state->sfr_ram = memory_get_write_ptr(mcs51_state->data, 0x100);
|
mcs51_state->sfr_ram = (UINT8 *)memory_get_write_ptr(mcs51_state->data, 0x100);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2381,7 +2381,7 @@ static CPU_INIT( ds5002fp )
|
|||||||
{
|
{
|
||||||
/* default configuration */
|
/* default configuration */
|
||||||
static const ds5002fp_config default_config = { 0x00, 0x00, 0x00 };
|
static const ds5002fp_config default_config = { 0x00, 0x00, 0x00 };
|
||||||
const ds5002fp_config *sconfig = device->static_config ? device->static_config : &default_config;
|
const ds5002fp_config *sconfig = device->static_config ? (const ds5002fp_config *)device->static_config : &default_config;
|
||||||
mcs51_state_t *mcs51_state = get_safe_token(device);
|
mcs51_state_t *mcs51_state = get_safe_token(device);
|
||||||
|
|
||||||
CPU_INIT_CALL( mcs51 );
|
CPU_INIT_CALL( mcs51 );
|
||||||
|
@ -72,7 +72,7 @@ INLINE int tlb_entry_is_global(const mips3_tlb_entry *entry)
|
|||||||
|
|
||||||
void mips3com_init(mips3_state *mips, mips3_flavor flavor, int bigendian, const device_config *device, cpu_irq_callback irqcallback)
|
void mips3com_init(mips3_state *mips, mips3_flavor flavor, int bigendian, const device_config *device, cpu_irq_callback irqcallback)
|
||||||
{
|
{
|
||||||
const mips3_config *config = device->static_config;
|
const mips3_config *config = (const mips3_config *)device->static_config;
|
||||||
int tlbindex;
|
int tlbindex;
|
||||||
|
|
||||||
/* initialize based on the config */
|
/* initialize based on the config */
|
||||||
|
@ -274,6 +274,31 @@ static const UINT8 fpmode_source[4] =
|
|||||||
INLINE FUNCTIONS
|
INLINE FUNCTIONS
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
|
INLINE mips3_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_VR4300BE ||
|
||||||
|
cpu_get_type(device) == CPU_VR4300LE ||
|
||||||
|
cpu_get_type(device) == CPU_VR4310BE ||
|
||||||
|
cpu_get_type(device) == CPU_VR4310LE ||
|
||||||
|
cpu_get_type(device) == CPU_R4600BE ||
|
||||||
|
cpu_get_type(device) == CPU_R4600LE ||
|
||||||
|
cpu_get_type(device) == CPU_R4650BE ||
|
||||||
|
cpu_get_type(device) == CPU_R4650LE ||
|
||||||
|
cpu_get_type(device) == CPU_R4700BE ||
|
||||||
|
cpu_get_type(device) == CPU_R4700LE ||
|
||||||
|
cpu_get_type(device) == CPU_R5000BE ||
|
||||||
|
cpu_get_type(device) == CPU_R5000LE ||
|
||||||
|
cpu_get_type(device) == CPU_QED5271BE ||
|
||||||
|
cpu_get_type(device) == CPU_QED5271LE ||
|
||||||
|
cpu_get_type(device) == CPU_RM7000BE ||
|
||||||
|
cpu_get_type(device) == CPU_RM7000LE);
|
||||||
|
return *(mips3_state **)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*-------------------------------------------------
|
/*-------------------------------------------------
|
||||||
epc - compute the exception PC from a
|
epc - compute the exception PC from a
|
||||||
descriptor
|
descriptor
|
||||||
@ -352,19 +377,19 @@ static void mips3_init(mips3_flavor flavor, int bigendian, const device_config *
|
|||||||
int regnum;
|
int regnum;
|
||||||
|
|
||||||
/* allocate enough space for the cache and the core */
|
/* allocate enough space for the cache and the core */
|
||||||
cache = drccache_alloc(CACHE_SIZE + sizeof(*mips3));
|
cache = (drccache *)drccache_alloc(CACHE_SIZE + sizeof(*mips3));
|
||||||
if (cache == NULL)
|
if (cache == NULL)
|
||||||
fatalerror("Unable to allocate cache of size %d", (UINT32)(CACHE_SIZE + sizeof(*mips3)));
|
fatalerror("Unable to allocate cache of size %d", (UINT32)(CACHE_SIZE + sizeof(*mips3)));
|
||||||
|
|
||||||
/* allocate the core memory */
|
/* allocate the core memory */
|
||||||
*(mips3_state **)device->token = mips3 = drccache_memory_alloc_near(cache, sizeof(*mips3));
|
*(mips3_state **)device->token = mips3 = (mips3_state *)drccache_memory_alloc_near(cache, sizeof(*mips3));
|
||||||
memset(mips3, 0, sizeof(*mips3));
|
memset(mips3, 0, sizeof(*mips3));
|
||||||
|
|
||||||
/* initialize the core */
|
/* initialize the core */
|
||||||
mips3com_init(mips3, flavor, bigendian, device, irqcallback);
|
mips3com_init(mips3, flavor, bigendian, device, irqcallback);
|
||||||
|
|
||||||
/* allocate the implementation-specific state from the full cache */
|
/* allocate the implementation-specific state from the full cache */
|
||||||
mips3->impstate = drccache_memory_alloc_near(cache, sizeof(*mips3->impstate));
|
mips3->impstate = (mips3imp_state *)drccache_memory_alloc_near(cache, sizeof(*mips3->impstate));
|
||||||
memset(mips3->impstate, 0, sizeof(*mips3->impstate));
|
memset(mips3->impstate, 0, sizeof(*mips3->impstate));
|
||||||
mips3->impstate->cache = cache;
|
mips3->impstate->cache = cache;
|
||||||
|
|
||||||
@ -471,7 +496,7 @@ static void mips3_init(mips3_flavor flavor, int bigendian, const device_config *
|
|||||||
|
|
||||||
static CPU_RESET( mips3 )
|
static CPU_RESET( mips3 )
|
||||||
{
|
{
|
||||||
mips3_state *mips3 = *(mips3_state **)device->token;
|
mips3_state *mips3 = get_safe_token(device);
|
||||||
|
|
||||||
/* reset the common code and mark the cache dirty */
|
/* reset the common code and mark the cache dirty */
|
||||||
mips3com_reset(mips3);
|
mips3com_reset(mips3);
|
||||||
@ -487,7 +512,7 @@ static CPU_RESET( mips3 )
|
|||||||
|
|
||||||
static CPU_EXECUTE( mips3 )
|
static CPU_EXECUTE( mips3 )
|
||||||
{
|
{
|
||||||
mips3_state *mips3 = *(mips3_state **)device->token;
|
mips3_state *mips3 = get_safe_token(device);
|
||||||
drcuml_state *drcuml = mips3->impstate->drcuml;
|
drcuml_state *drcuml = mips3->impstate->drcuml;
|
||||||
int execute_result;
|
int execute_result;
|
||||||
|
|
||||||
@ -524,7 +549,7 @@ static CPU_EXECUTE( mips3 )
|
|||||||
|
|
||||||
static CPU_EXIT( mips3 )
|
static CPU_EXIT( mips3 )
|
||||||
{
|
{
|
||||||
mips3_state *mips3 = *(mips3_state **)device->token;
|
mips3_state *mips3 = get_safe_token(device);
|
||||||
mips3com_exit(mips3);
|
mips3com_exit(mips3);
|
||||||
|
|
||||||
/* clean up the DRC */
|
/* clean up the DRC */
|
||||||
@ -541,7 +566,7 @@ static CPU_EXIT( mips3 )
|
|||||||
|
|
||||||
static CPU_TRANSLATE( mips3 )
|
static CPU_TRANSLATE( mips3 )
|
||||||
{
|
{
|
||||||
mips3_state *mips3 = *(mips3_state **)device->token;
|
mips3_state *mips3 = get_safe_token(device);
|
||||||
return mips3com_translate_address(mips3, space, intention, address);
|
return mips3com_translate_address(mips3, space, intention, address);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -552,7 +577,7 @@ static CPU_TRANSLATE( mips3 )
|
|||||||
|
|
||||||
static CPU_DISASSEMBLE( mips3 )
|
static CPU_DISASSEMBLE( mips3 )
|
||||||
{
|
{
|
||||||
mips3_state *mips3 = *(mips3_state **)device->token;
|
mips3_state *mips3 = get_safe_token(device);
|
||||||
return mips3com_dasm(mips3, buffer, pc, oprom, opram);
|
return mips3com_dasm(mips3, buffer, pc, oprom, opram);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -564,7 +589,7 @@ static CPU_DISASSEMBLE( mips3 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( mips3 )
|
static CPU_SET_INFO( mips3 )
|
||||||
{
|
{
|
||||||
mips3_state *mips3 = *(mips3_state **)device->token;
|
mips3_state *mips3 = get_safe_token(device);
|
||||||
|
|
||||||
/* --- everything is handled generically --- */
|
/* --- everything is handled generically --- */
|
||||||
mips3com_set_info(mips3, state, info);
|
mips3com_set_info(mips3, state, info);
|
||||||
@ -578,7 +603,7 @@ static CPU_SET_INFO( mips3 )
|
|||||||
|
|
||||||
static CPU_GET_INFO( mips3 )
|
static CPU_GET_INFO( mips3 )
|
||||||
{
|
{
|
||||||
mips3_state *mips3 = (device != NULL && device->token != NULL) ? *(mips3_state **)device->token : NULL;
|
mips3_state *mips3 = (device != NULL && device->token != NULL) ? get_safe_token(device) : 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 --- */
|
||||||
@ -609,7 +634,7 @@ static CPU_GET_INFO( mips3 )
|
|||||||
|
|
||||||
void mips3drc_set_options(const device_config *device, UINT32 options)
|
void mips3drc_set_options(const device_config *device, UINT32 options)
|
||||||
{
|
{
|
||||||
mips3_state *mips3 = *(mips3_state **)device->token;
|
mips3_state *mips3 = get_safe_token(device);
|
||||||
mips3->impstate->drcoptions = options;
|
mips3->impstate->drcoptions = options;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -621,7 +646,7 @@ void mips3drc_set_options(const device_config *device, UINT32 options)
|
|||||||
|
|
||||||
void mips3drc_add_fastram(const device_config *device, offs_t start, offs_t end, UINT8 readonly, void *base)
|
void mips3drc_add_fastram(const device_config *device, offs_t start, offs_t end, UINT8 readonly, void *base)
|
||||||
{
|
{
|
||||||
mips3_state *mips3 = *(mips3_state **)device->token;
|
mips3_state *mips3 = get_safe_token(device);
|
||||||
if (mips3->impstate->fastram_select < ARRAY_LENGTH(mips3->impstate->fastram))
|
if (mips3->impstate->fastram_select < ARRAY_LENGTH(mips3->impstate->fastram))
|
||||||
{
|
{
|
||||||
mips3->impstate->fastram[mips3->impstate->fastram_select].start = start;
|
mips3->impstate->fastram[mips3->impstate->fastram_select].start = start;
|
||||||
@ -639,7 +664,7 @@ void mips3drc_add_fastram(const device_config *device, offs_t start, offs_t end,
|
|||||||
|
|
||||||
void mips3drc_add_hotspot(const device_config *device, offs_t pc, UINT32 opcode, UINT32 cycles)
|
void mips3drc_add_hotspot(const device_config *device, offs_t pc, UINT32 opcode, UINT32 cycles)
|
||||||
{
|
{
|
||||||
mips3_state *mips3 = *(mips3_state **)device->token;
|
mips3_state *mips3 = get_safe_token(device);
|
||||||
if (mips3->impstate->hotspot_select < ARRAY_LENGTH(mips3->impstate->hotspot))
|
if (mips3->impstate->hotspot_select < ARRAY_LENGTH(mips3->impstate->hotspot))
|
||||||
{
|
{
|
||||||
mips3->impstate->hotspot[mips3->impstate->hotspot_select].pc = pc;
|
mips3->impstate->hotspot[mips3->impstate->hotspot_select].pc = pc;
|
||||||
@ -822,7 +847,7 @@ static void code_compile_block(mips3_state *mips3, UINT8 mode, offs_t pc)
|
|||||||
|
|
||||||
static void cfunc_get_cycles(void *param)
|
static void cfunc_get_cycles(void *param)
|
||||||
{
|
{
|
||||||
mips3_state *mips3 = param;
|
mips3_state *mips3 = (mips3_state *)param;
|
||||||
mips3->impstate->numcycles = cpu_get_total_cycles(mips3->device);
|
mips3->impstate->numcycles = cpu_get_total_cycles(mips3->device);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -834,7 +859,7 @@ static void cfunc_get_cycles(void *param)
|
|||||||
|
|
||||||
static void cfunc_printf_exception(void *param)
|
static void cfunc_printf_exception(void *param)
|
||||||
{
|
{
|
||||||
mips3_state *mips3 = param;
|
mips3_state *mips3 = (mips3_state *)param;
|
||||||
printf("Exception: EPC=%08X Cause=%08X BadVAddr=%08X Jmp=%08X\n", (UINT32)mips3->cpr[0][COP0_EPC], (UINT32)mips3->cpr[0][COP0_Cause], (UINT32)mips3->cpr[0][COP0_BadVAddr], mips3->pc);
|
printf("Exception: EPC=%08X Cause=%08X BadVAddr=%08X Jmp=%08X\n", (UINT32)mips3->cpr[0][COP0_EPC], (UINT32)mips3->cpr[0][COP0_Cause], (UINT32)mips3->cpr[0][COP0_BadVAddr], mips3->pc);
|
||||||
cfunc_printf_probe(mips3);
|
cfunc_printf_probe(mips3);
|
||||||
}
|
}
|
||||||
@ -847,7 +872,7 @@ static void cfunc_printf_exception(void *param)
|
|||||||
|
|
||||||
static void cfunc_printf_debug(void *param)
|
static void cfunc_printf_debug(void *param)
|
||||||
{
|
{
|
||||||
mips3_state *mips3 = param;
|
mips3_state *mips3 = (mips3_state *)param;
|
||||||
printf(mips3->impstate->format, mips3->impstate->arg0, mips3->impstate->arg1);
|
printf(mips3->impstate->format, mips3->impstate->arg0, mips3->impstate->arg1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -859,7 +884,7 @@ static void cfunc_printf_debug(void *param)
|
|||||||
|
|
||||||
static void cfunc_printf_probe(void *param)
|
static void cfunc_printf_probe(void *param)
|
||||||
{
|
{
|
||||||
mips3_state *mips3 = param;
|
mips3_state *mips3 = (mips3_state *)param;
|
||||||
|
|
||||||
printf(" PC=%08X r1=%08X%08X r2=%08X%08X r3=%08X%08X\n",
|
printf(" PC=%08X r1=%08X%08X r2=%08X%08X r3=%08X%08X\n",
|
||||||
mips3->pc,
|
mips3->pc,
|
||||||
@ -914,7 +939,7 @@ static void cfunc_printf_probe(void *param)
|
|||||||
|
|
||||||
static void cfunc_unimplemented(void *param)
|
static void cfunc_unimplemented(void *param)
|
||||||
{
|
{
|
||||||
mips3_state *mips3 = param;
|
mips3_state *mips3 = (mips3_state *)param;
|
||||||
UINT32 opcode = mips3->impstate->arg0;
|
UINT32 opcode = mips3->impstate->arg0;
|
||||||
fatalerror("PC=%08X: Unimplemented op %08X (%02X,%02X)", mips3->pc, opcode, opcode >> 26, opcode & 0x3f);
|
fatalerror("PC=%08X: Unimplemented op %08X (%02X,%02X)", mips3->pc, opcode, opcode >> 26, opcode & 0x3f);
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,7 @@ static int describe_instruction_cop2(mips3_state *mips, UINT32 op, opcode_desc *
|
|||||||
|
|
||||||
int mips3fe_describe(void *param, opcode_desc *desc, const opcode_desc *prev)
|
int mips3fe_describe(void *param, opcode_desc *desc, const opcode_desc *prev)
|
||||||
{
|
{
|
||||||
mips3_state *mips = param;
|
mips3_state *mips = (mips3_state *)param;
|
||||||
UINT32 op, opswitch;
|
UINT32 op, opswitch;
|
||||||
|
|
||||||
/* compute the physical PC */
|
/* compute the physical PC */
|
||||||
|
@ -193,6 +193,15 @@ struct _psxcpu_state
|
|||||||
UINT32 bad_word_address_mask;
|
UINT32 bad_word_address_mask;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE psxcpu_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_PSXCPU);
|
||||||
|
return (psxcpu_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
static const UINT32 mips_mtc0_writemask[]=
|
static const UINT32 mips_mtc0_writemask[]=
|
||||||
{
|
{
|
||||||
0x00000000, /* !INDEX */
|
0x00000000, /* !INDEX */
|
||||||
@ -1278,7 +1287,7 @@ static void mips_update_address_masks( psxcpu_state *psxcpu )
|
|||||||
|
|
||||||
static READ32_HANDLER( psx_berr_r )
|
static READ32_HANDLER( psx_berr_r )
|
||||||
{
|
{
|
||||||
psxcpu_state *psxcpu = space->cpu->token;
|
psxcpu_state *psxcpu = get_safe_token(space->cpu);
|
||||||
|
|
||||||
psxcpu->berr = 1;
|
psxcpu->berr = 1;
|
||||||
|
|
||||||
@ -1287,14 +1296,14 @@ static READ32_HANDLER( psx_berr_r )
|
|||||||
|
|
||||||
static WRITE32_HANDLER( psx_berr_w )
|
static WRITE32_HANDLER( psx_berr_w )
|
||||||
{
|
{
|
||||||
psxcpu_state *psxcpu = space->cpu->token;
|
psxcpu_state *psxcpu = get_safe_token(space->cpu);
|
||||||
|
|
||||||
psxcpu->berr = 1;
|
psxcpu->berr = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mips_update_scratchpad( const address_space *space )
|
static void mips_update_scratchpad( const address_space *space )
|
||||||
{
|
{
|
||||||
psxcpu_state *psxcpu = space->cpu->token;
|
psxcpu_state *psxcpu = get_safe_token(space->cpu);
|
||||||
|
|
||||||
if( ( psxcpu->biu & BIU_RAM ) == 0 )
|
if( ( psxcpu->biu & BIU_RAM ) == 0 )
|
||||||
{
|
{
|
||||||
@ -1302,11 +1311,11 @@ static void mips_update_scratchpad( const address_space *space )
|
|||||||
}
|
}
|
||||||
else if( ( psxcpu->biu & BIU_DS ) == 0 )
|
else if( ( psxcpu->biu & BIU_DS ) == 0 )
|
||||||
{
|
{
|
||||||
memory_install_readwrite32_handler( space, 0x1f800000, 0x1f8003ff, 0, 0, psx_berr_r, SMH_NOP );
|
memory_install_readwrite32_handler( space, 0x1f800000, 0x1f8003ff, 0, 0, psx_berr_r, (write32_space_func)SMH_NOP );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
memory_install_readwrite32_handler( space, 0x1f800000, 0x1f8003ff, 0, 0, SMH_BANK32, SMH_BANK32 );
|
memory_install_readwrite32_handler( space, 0x1f800000, 0x1f8003ff, 0, 0, (read32_space_func)SMH_BANK32, (write32_space_func)SMH_BANK32 );
|
||||||
|
|
||||||
memory_set_bankptr(space->machine, 32, psxcpu->dcache );
|
memory_set_bankptr(space->machine, 32, psxcpu->dcache );
|
||||||
}
|
}
|
||||||
@ -1590,7 +1599,7 @@ INLINE int mips_store_data_address_breakpoint( psxcpu_state *psxcpu, UINT32 addr
|
|||||||
|
|
||||||
static STATE_POSTLOAD( mips_postload )
|
static STATE_POSTLOAD( mips_postload )
|
||||||
{
|
{
|
||||||
psxcpu_state *psxcpu = param;
|
psxcpu_state *psxcpu = (psxcpu_state *)param;
|
||||||
|
|
||||||
mips_update_memory_handlers( psxcpu );
|
mips_update_memory_handlers( psxcpu );
|
||||||
mips_update_address_masks( psxcpu );
|
mips_update_address_masks( psxcpu );
|
||||||
@ -1599,7 +1608,7 @@ static STATE_POSTLOAD( mips_postload )
|
|||||||
|
|
||||||
static void mips_state_register( const char *type, const device_config *device )
|
static void mips_state_register( const char *type, const device_config *device )
|
||||||
{
|
{
|
||||||
psxcpu_state *psxcpu = device->token;
|
psxcpu_state *psxcpu = get_safe_token(device);
|
||||||
|
|
||||||
state_save_register_device_item( device, 0, psxcpu->op );
|
state_save_register_device_item( device, 0, psxcpu->op );
|
||||||
state_save_register_device_item( device, 0, psxcpu->pc );
|
state_save_register_device_item( device, 0, psxcpu->pc );
|
||||||
@ -1623,7 +1632,7 @@ static void mips_state_register( const char *type, const device_config *device )
|
|||||||
|
|
||||||
static CPU_INIT( psxcpu )
|
static CPU_INIT( psxcpu )
|
||||||
{
|
{
|
||||||
psxcpu_state *psxcpu = device->token;
|
psxcpu_state *psxcpu = get_safe_token(device);
|
||||||
// psxcpu->intf = (psxcpu_interface *) device->static_config;
|
// psxcpu->intf = (psxcpu_interface *) device->static_config;
|
||||||
|
|
||||||
psxcpu->irq_callback = irqcallback;
|
psxcpu->irq_callback = irqcallback;
|
||||||
@ -1635,7 +1644,7 @@ static CPU_INIT( psxcpu )
|
|||||||
|
|
||||||
static CPU_RESET( psxcpu )
|
static CPU_RESET( psxcpu )
|
||||||
{
|
{
|
||||||
psxcpu_state *psxcpu = device->token;
|
psxcpu_state *psxcpu = get_safe_token(device);
|
||||||
|
|
||||||
psxcpu->delayr = 0;
|
psxcpu->delayr = 0;
|
||||||
psxcpu->delayv = 0;
|
psxcpu->delayv = 0;
|
||||||
@ -1838,7 +1847,7 @@ static void mips_bc( psxcpu_state *psxcpu, int cop, int sr_cu, int condition )
|
|||||||
|
|
||||||
static CPU_EXECUTE( psxcpu )
|
static CPU_EXECUTE( psxcpu )
|
||||||
{
|
{
|
||||||
psxcpu_state *psxcpu = device->token;
|
psxcpu_state *psxcpu = get_safe_token(device);
|
||||||
|
|
||||||
psxcpu->icount = cycles;
|
psxcpu->icount = cycles;
|
||||||
|
|
||||||
@ -2896,14 +2905,14 @@ static void set_irq_line( psxcpu_state *psxcpu, int irqline, int state )
|
|||||||
|
|
||||||
static READ32_HANDLER( psx_biu_r )
|
static READ32_HANDLER( psx_biu_r )
|
||||||
{
|
{
|
||||||
psxcpu_state *psxcpu = space->cpu->token;
|
psxcpu_state *psxcpu = get_safe_token(space->cpu);
|
||||||
|
|
||||||
return psxcpu->biu;
|
return psxcpu->biu;
|
||||||
}
|
}
|
||||||
|
|
||||||
static WRITE32_HANDLER( psx_biu_w )
|
static WRITE32_HANDLER( psx_biu_w )
|
||||||
{
|
{
|
||||||
psxcpu_state *psxcpu = space->cpu->token;
|
psxcpu_state *psxcpu = get_safe_token(space->cpu);
|
||||||
UINT32 old = psxcpu->biu;
|
UINT32 old = psxcpu->biu;
|
||||||
|
|
||||||
COMBINE_DATA( &psxcpu->biu );
|
COMBINE_DATA( &psxcpu->biu );
|
||||||
@ -2941,7 +2950,7 @@ ADDRESS_MAP_END
|
|||||||
|
|
||||||
static CPU_DISASSEMBLE( psxcpu )
|
static CPU_DISASSEMBLE( psxcpu )
|
||||||
{
|
{
|
||||||
psxcpu_state *psxcpu = device->token;
|
psxcpu_state *psxcpu = get_safe_token(device);
|
||||||
DasmPSXCPU_state state;
|
DasmPSXCPU_state state;
|
||||||
|
|
||||||
state.pc = psxcpu->pc;
|
state.pc = psxcpu->pc;
|
||||||
@ -5960,7 +5969,7 @@ static void docop2( psxcpu_state *psxcpu, int gteop )
|
|||||||
|
|
||||||
static CPU_SET_INFO( psxcpu )
|
static CPU_SET_INFO( psxcpu )
|
||||||
{
|
{
|
||||||
psxcpu_state *psxcpu = device->token;
|
psxcpu_state *psxcpu = get_safe_token(device);
|
||||||
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 --- */
|
||||||
@ -6102,7 +6111,7 @@ static CPU_SET_INFO( psxcpu )
|
|||||||
|
|
||||||
CPU_GET_INFO( psxcpu )
|
CPU_GET_INFO( psxcpu )
|
||||||
{
|
{
|
||||||
psxcpu_state *psxcpu = (device != NULL) ? device->token : NULL;
|
psxcpu_state *psxcpu = (device != NULL && device->token != NULL) ? get_safe_token(device) : 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 --- */
|
||||||
|
@ -159,6 +159,17 @@ struct _r3000_state
|
|||||||
size_t dcache_size;
|
size_t dcache_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE r3000_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_R3000BE ||
|
||||||
|
cpu_get_type(device) == CPU_R3000LE ||
|
||||||
|
cpu_get_type(device) == CPU_R3041BE ||
|
||||||
|
cpu_get_type(device) == CPU_R3041LE);
|
||||||
|
return (r3000_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
@ -286,12 +297,12 @@ static void set_irq_line(r3000_state *r3000, int irqline, int state)
|
|||||||
|
|
||||||
static CPU_INIT( r3000 )
|
static CPU_INIT( r3000 )
|
||||||
{
|
{
|
||||||
const r3000_cpu_core *configdata = device->static_config;
|
const r3000_cpu_core *configdata = (const r3000_cpu_core *)device->static_config;
|
||||||
r3000_state *r3000 = device->token;
|
r3000_state *r3000 = get_safe_token(device);
|
||||||
|
|
||||||
/* allocate memory */
|
/* allocate memory */
|
||||||
r3000->icache = auto_malloc(configdata->icache);
|
r3000->icache = (UINT32 *)auto_malloc(configdata->icache);
|
||||||
r3000->dcache = auto_malloc(configdata->dcache);
|
r3000->dcache = (UINT32 *)auto_malloc(configdata->dcache);
|
||||||
|
|
||||||
r3000->icache_size = configdata->icache;
|
r3000->icache_size = configdata->icache;
|
||||||
r3000->dcache_size = configdata->dcache;
|
r3000->dcache_size = configdata->dcache;
|
||||||
@ -340,12 +351,12 @@ static void r3000_reset(r3000_state *r3000, int bigendian)
|
|||||||
|
|
||||||
static CPU_RESET( r3000be )
|
static CPU_RESET( r3000be )
|
||||||
{
|
{
|
||||||
r3000_reset(device->token, 1);
|
r3000_reset(get_safe_token(device), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static CPU_RESET( r3000le )
|
static CPU_RESET( r3000le )
|
||||||
{
|
{
|
||||||
r3000_reset(device->token, 0);
|
r3000_reset(get_safe_token(device), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -677,7 +688,7 @@ INLINE void handle_cop3(r3000_state *r3000, UINT32 op)
|
|||||||
|
|
||||||
static CPU_EXECUTE( r3000 )
|
static CPU_EXECUTE( r3000 )
|
||||||
{
|
{
|
||||||
r3000_state *r3000 = device->token;
|
r3000_state *r3000 = get_safe_token(device);
|
||||||
|
|
||||||
/* count cycles and interrupt cycles */
|
/* count cycles and interrupt cycles */
|
||||||
r3000->icount = cycles;
|
r3000->icount = cycles;
|
||||||
@ -902,84 +913,84 @@ static CPU_DISASSEMBLE( r3000le )
|
|||||||
|
|
||||||
static UINT8 readcache_be(const address_space *space, offs_t offset)
|
static UINT8 readcache_be(const address_space *space, offs_t offset)
|
||||||
{
|
{
|
||||||
r3000_state *r3000 = space->cpu->token;
|
r3000_state *r3000 = get_safe_token(space->cpu);
|
||||||
offset &= 0x1fffffff;
|
offset &= 0x1fffffff;
|
||||||
return (offset * 4 < r3000->cache_size) ? r3000->cache[BYTE4_XOR_BE(offset)] : 0xff;
|
return (offset * 4 < r3000->cache_size) ? r3000->cache[BYTE4_XOR_BE(offset)] : 0xff;
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT16 readcache_be_word(const address_space *space, offs_t offset)
|
static UINT16 readcache_be_word(const address_space *space, offs_t offset)
|
||||||
{
|
{
|
||||||
r3000_state *r3000 = space->cpu->token;
|
r3000_state *r3000 = get_safe_token(space->cpu);
|
||||||
offset &= 0x1fffffff;
|
offset &= 0x1fffffff;
|
||||||
return (offset * 4 < r3000->cache_size) ? *(UINT16 *)&r3000->cache[WORD_XOR_BE(offset)] : 0xffff;
|
return (offset * 4 < r3000->cache_size) ? *(UINT16 *)&r3000->cache[WORD_XOR_BE(offset)] : 0xffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT32 readcache_be_dword(const address_space *space, offs_t offset)
|
static UINT32 readcache_be_dword(const address_space *space, offs_t offset)
|
||||||
{
|
{
|
||||||
r3000_state *r3000 = space->cpu->token;
|
r3000_state *r3000 = get_safe_token(space->cpu);
|
||||||
offset &= 0x1fffffff;
|
offset &= 0x1fffffff;
|
||||||
return (offset * 4 < r3000->cache_size) ? *(UINT32 *)&r3000->cache[offset] : 0xffffffff;
|
return (offset * 4 < r3000->cache_size) ? *(UINT32 *)&r3000->cache[offset] : 0xffffffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void writecache_be(const address_space *space, offs_t offset, UINT8 data)
|
static void writecache_be(const address_space *space, offs_t offset, UINT8 data)
|
||||||
{
|
{
|
||||||
r3000_state *r3000 = space->cpu->token;
|
r3000_state *r3000 = get_safe_token(space->cpu);
|
||||||
offset &= 0x1fffffff;
|
offset &= 0x1fffffff;
|
||||||
if (offset * 4 < r3000->cache_size) r3000->cache[BYTE4_XOR_BE(offset)] = data;
|
if (offset * 4 < r3000->cache_size) r3000->cache[BYTE4_XOR_BE(offset)] = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void writecache_be_word(const address_space *space, offs_t offset, UINT16 data)
|
static void writecache_be_word(const address_space *space, offs_t offset, UINT16 data)
|
||||||
{
|
{
|
||||||
r3000_state *r3000 = space->cpu->token;
|
r3000_state *r3000 = get_safe_token(space->cpu);
|
||||||
offset &= 0x1fffffff;
|
offset &= 0x1fffffff;
|
||||||
if (offset * 4 < r3000->cache_size) *(UINT16 *)&r3000->cache[WORD_XOR_BE(offset)] = data;
|
if (offset * 4 < r3000->cache_size) *(UINT16 *)&r3000->cache[WORD_XOR_BE(offset)] = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void writecache_be_dword(const address_space *space, offs_t offset, UINT32 data)
|
static void writecache_be_dword(const address_space *space, offs_t offset, UINT32 data)
|
||||||
{
|
{
|
||||||
r3000_state *r3000 = space->cpu->token;
|
r3000_state *r3000 = get_safe_token(space->cpu);
|
||||||
offset &= 0x1fffffff;
|
offset &= 0x1fffffff;
|
||||||
if (offset * 4 < r3000->cache_size) *(UINT32 *)&r3000->cache[offset] = data;
|
if (offset * 4 < r3000->cache_size) *(UINT32 *)&r3000->cache[offset] = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT8 readcache_le(const address_space *space, offs_t offset)
|
static UINT8 readcache_le(const address_space *space, offs_t offset)
|
||||||
{
|
{
|
||||||
r3000_state *r3000 = space->cpu->token;
|
r3000_state *r3000 = get_safe_token(space->cpu);
|
||||||
offset &= 0x1fffffff;
|
offset &= 0x1fffffff;
|
||||||
return (offset * 4 < r3000->cache_size) ? r3000->cache[BYTE4_XOR_LE(offset)] : 0xff;
|
return (offset * 4 < r3000->cache_size) ? r3000->cache[BYTE4_XOR_LE(offset)] : 0xff;
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT16 readcache_le_word(const address_space *space, offs_t offset)
|
static UINT16 readcache_le_word(const address_space *space, offs_t offset)
|
||||||
{
|
{
|
||||||
r3000_state *r3000 = space->cpu->token;
|
r3000_state *r3000 = get_safe_token(space->cpu);
|
||||||
offset &= 0x1fffffff;
|
offset &= 0x1fffffff;
|
||||||
return (offset * 4 < r3000->cache_size) ? *(UINT16 *)&r3000->cache[WORD_XOR_LE(offset)] : 0xffff;
|
return (offset * 4 < r3000->cache_size) ? *(UINT16 *)&r3000->cache[WORD_XOR_LE(offset)] : 0xffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT32 readcache_le_dword(const address_space *space, offs_t offset)
|
static UINT32 readcache_le_dword(const address_space *space, offs_t offset)
|
||||||
{
|
{
|
||||||
r3000_state *r3000 = space->cpu->token;
|
r3000_state *r3000 = get_safe_token(space->cpu);
|
||||||
offset &= 0x1fffffff;
|
offset &= 0x1fffffff;
|
||||||
return (offset * 4 < r3000->cache_size) ? *(UINT32 *)&r3000->cache[offset] : 0xffffffff;
|
return (offset * 4 < r3000->cache_size) ? *(UINT32 *)&r3000->cache[offset] : 0xffffffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void writecache_le(const address_space *space, offs_t offset, UINT8 data)
|
static void writecache_le(const address_space *space, offs_t offset, UINT8 data)
|
||||||
{
|
{
|
||||||
r3000_state *r3000 = space->cpu->token;
|
r3000_state *r3000 = get_safe_token(space->cpu);
|
||||||
offset &= 0x1fffffff;
|
offset &= 0x1fffffff;
|
||||||
if (offset * 4 < r3000->cache_size) r3000->cache[BYTE4_XOR_LE(offset)] = data;
|
if (offset * 4 < r3000->cache_size) r3000->cache[BYTE4_XOR_LE(offset)] = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void writecache_le_word(const address_space *space, offs_t offset, UINT16 data)
|
static void writecache_le_word(const address_space *space, offs_t offset, UINT16 data)
|
||||||
{
|
{
|
||||||
r3000_state *r3000 = space->cpu->token;
|
r3000_state *r3000 = get_safe_token(space->cpu);
|
||||||
offset &= 0x1fffffff;
|
offset &= 0x1fffffff;
|
||||||
if (offset * 4 < r3000->cache_size) *(UINT16 *)&r3000->cache[WORD_XOR_LE(offset)] = data;
|
if (offset * 4 < r3000->cache_size) *(UINT16 *)&r3000->cache[WORD_XOR_LE(offset)] = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void writecache_le_dword(const address_space *space, offs_t offset, UINT32 data)
|
static void writecache_le_dword(const address_space *space, offs_t offset, UINT32 data)
|
||||||
{
|
{
|
||||||
r3000_state *r3000 = space->cpu->token;
|
r3000_state *r3000 = get_safe_token(space->cpu);
|
||||||
offset &= 0x1fffffff;
|
offset &= 0x1fffffff;
|
||||||
if (offset * 4 < r3000->cache_size) *(UINT32 *)&r3000->cache[offset] = data;
|
if (offset * 4 < r3000->cache_size) *(UINT32 *)&r3000->cache[offset] = data;
|
||||||
}
|
}
|
||||||
@ -1109,7 +1120,7 @@ static void swr_le(r3000_state *r3000, UINT32 op)
|
|||||||
|
|
||||||
static CPU_SET_INFO( r3000 )
|
static CPU_SET_INFO( r3000 )
|
||||||
{
|
{
|
||||||
r3000_state *r3000 = device->token;
|
r3000_state *r3000 = get_safe_token(device);
|
||||||
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 --- */
|
||||||
@ -1168,7 +1179,7 @@ static CPU_SET_INFO( r3000 )
|
|||||||
|
|
||||||
static CPU_GET_INFO( r3000 )
|
static CPU_GET_INFO( r3000 )
|
||||||
{
|
{
|
||||||
r3000_state *r3000 = (device != NULL) ? device->token : NULL;
|
r3000_state *r3000 = (device != NULL && device->token != NULL) ? get_safe_token(device) : 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 --- */
|
||||||
|
@ -180,6 +180,19 @@ struct _nec_state_t
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE nec_state_t *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_V20 ||
|
||||||
|
cpu_get_type(device) == CPU_V25 ||
|
||||||
|
cpu_get_type(device) == CPU_V30 ||
|
||||||
|
cpu_get_type(device) == CPU_V33 ||
|
||||||
|
cpu_get_type(device) == CPU_V35);
|
||||||
|
return (nec_state_t *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
/* The interrupt number of a pending external interrupt pending NMI is 2. */
|
/* The interrupt number of a pending external interrupt pending NMI is 2. */
|
||||||
/* For INTR interrupts, the level is caught on the bus during an INTA cycle */
|
/* For INTR interrupts, the level is caught on the bus during an INTA cycle */
|
||||||
|
|
||||||
@ -267,7 +280,7 @@ static UINT8 fetchop(nec_state_t *nec_state)
|
|||||||
|
|
||||||
static CPU_RESET( nec )
|
static CPU_RESET( nec )
|
||||||
{
|
{
|
||||||
nec_state_t *nec_state = device->token;
|
nec_state_t *nec_state = get_safe_token(device);
|
||||||
unsigned int i,j,c;
|
unsigned int i,j,c;
|
||||||
static const BREGS reg_name[8]={ AL, CL, DL, BL, AH, CH, DH, BH };
|
static const BREGS reg_name[8]={ AL, CL, DL, BL, AH, CH, DH, BH };
|
||||||
|
|
||||||
@ -1082,15 +1095,15 @@ static void set_poll_line(nec_state_t *nec_state, int state)
|
|||||||
|
|
||||||
static CPU_DISASSEMBLE( nec )
|
static CPU_DISASSEMBLE( nec )
|
||||||
{
|
{
|
||||||
nec_state_t *nec_state = device->token;
|
nec_state_t *nec_state = get_safe_token(device);
|
||||||
|
|
||||||
return necv_dasm_one(buffer, pc, oprom, nec_state->config);
|
return necv_dasm_one(buffer, pc, oprom, nec_state->config);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nec_init(const device_config *device, cpu_irq_callback irqcallback, int type)
|
static void nec_init(const device_config *device, cpu_irq_callback irqcallback, int type)
|
||||||
{
|
{
|
||||||
const nec_config *config = device->static_config ? device->static_config : &default_config;
|
const nec_config *config = device->static_config ? (const nec_config *)device->static_config : &default_config;
|
||||||
nec_state_t *nec_state = device->token;
|
nec_state_t *nec_state = get_safe_token(device);
|
||||||
|
|
||||||
nec_state->config = config;
|
nec_state->config = config;
|
||||||
|
|
||||||
@ -1179,7 +1192,7 @@ static void configure_memory_16bit(nec_state_t *nec_state)
|
|||||||
|
|
||||||
static CPU_EXECUTE( necv )
|
static CPU_EXECUTE( necv )
|
||||||
{
|
{
|
||||||
nec_state_t *nec_state = device->token;
|
nec_state_t *nec_state = get_safe_token(device);
|
||||||
int prev_ICount;
|
int prev_ICount;
|
||||||
|
|
||||||
nec_state->icount=cycles;
|
nec_state->icount=cycles;
|
||||||
@ -1210,7 +1223,7 @@ static CPU_EXECUTE( necv )
|
|||||||
#if (HAS_V20||HAS_V25)
|
#if (HAS_V20||HAS_V25)
|
||||||
static CPU_INIT( v20 )
|
static CPU_INIT( v20 )
|
||||||
{
|
{
|
||||||
nec_state_t *nec_state = device->token;
|
nec_state_t *nec_state = get_safe_token(device);
|
||||||
|
|
||||||
nec_init(device, irqcallback, 0);
|
nec_init(device, irqcallback, 0);
|
||||||
configure_memory_8bit(nec_state);
|
configure_memory_8bit(nec_state);
|
||||||
@ -1223,7 +1236,7 @@ static CPU_INIT( v20 )
|
|||||||
#if (HAS_V30||HAS_V35)
|
#if (HAS_V30||HAS_V35)
|
||||||
static CPU_INIT( v30 )
|
static CPU_INIT( v30 )
|
||||||
{
|
{
|
||||||
nec_state_t *nec_state = device->token;
|
nec_state_t *nec_state = get_safe_token(device);
|
||||||
|
|
||||||
nec_init(device, irqcallback, 1);
|
nec_init(device, irqcallback, 1);
|
||||||
configure_memory_16bit(nec_state);
|
configure_memory_16bit(nec_state);
|
||||||
@ -1237,7 +1250,7 @@ static CPU_INIT( v30 )
|
|||||||
#if (HAS_V33)
|
#if (HAS_V33)
|
||||||
static CPU_INIT( v33 )
|
static CPU_INIT( v33 )
|
||||||
{
|
{
|
||||||
nec_state_t *nec_state = device->token;
|
nec_state_t *nec_state = get_safe_token(device);
|
||||||
|
|
||||||
nec_init(device, irqcallback, 2);
|
nec_init(device, irqcallback, 2);
|
||||||
nec_state->chip_type=V33;
|
nec_state->chip_type=V33;
|
||||||
@ -1259,7 +1272,7 @@ static CPU_INIT( v33 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( nec )
|
static CPU_SET_INFO( nec )
|
||||||
{
|
{
|
||||||
nec_state_t *nec_state = device->token;
|
nec_state_t *nec_state = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -1317,7 +1330,7 @@ static CPU_SET_INFO( nec )
|
|||||||
|
|
||||||
static CPU_GET_INFO( nec )
|
static CPU_GET_INFO( nec )
|
||||||
{
|
{
|
||||||
nec_state_t *nec_state = (device != NULL) ? device->token : NULL;
|
nec_state_t *nec_state = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
int flags;
|
int flags;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
|
@ -421,6 +421,15 @@ struct _pdp1_state
|
|||||||
int icount;
|
int icount;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE pdp1_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_PDP1);
|
||||||
|
return (pdp1_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
static void execute_instruction(pdp1_state *cpustate);
|
static void execute_instruction(pdp1_state *cpustate);
|
||||||
static void null_iot (const device_config *device, int op2, int nac, int mb, int *io, int ac);
|
static void null_iot (const device_config *device, int op2, int nac, int mb, int *io, int ac);
|
||||||
static void lem_eem_iot(const device_config *device, int op2, int nac, int mb, int *io, int ac);
|
static void lem_eem_iot(const device_config *device, int op2, int nac, int mb, int *io, int ac);
|
||||||
@ -529,8 +538,8 @@ static void pdp1_set_irq_line (pdp1_state *cpustate, int irqline, int state)
|
|||||||
|
|
||||||
static CPU_INIT( pdp1 )
|
static CPU_INIT( pdp1 )
|
||||||
{
|
{
|
||||||
const pdp1_reset_param_t *param = device->static_config;
|
const pdp1_reset_param_t *param = (const pdp1_reset_param_t *)device->static_config;
|
||||||
pdp1_state *cpustate = device->token;
|
pdp1_state *cpustate = get_safe_token(device);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* clean-up */
|
/* clean-up */
|
||||||
@ -611,7 +620,7 @@ static const char instruction_kind[32] =
|
|||||||
/* execute instructions on this CPU until icount expires */
|
/* execute instructions on this CPU until icount expires */
|
||||||
static CPU_EXECUTE( pdp1 )
|
static CPU_EXECUTE( pdp1 )
|
||||||
{
|
{
|
||||||
pdp1_state *cpustate = device->token;
|
pdp1_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
@ -859,7 +868,7 @@ static CPU_EXECUTE( pdp1 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( pdp1 )
|
static CPU_SET_INFO( pdp1 )
|
||||||
{
|
{
|
||||||
pdp1_state *cpustate = device->token;
|
pdp1_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -927,7 +936,7 @@ static CPU_SET_INFO( pdp1 )
|
|||||||
|
|
||||||
CPU_GET_INFO( pdp1 )
|
CPU_GET_INFO( pdp1 )
|
||||||
{
|
{
|
||||||
pdp1_state *cpustate = (device != NULL) ? device->token : NULL;
|
pdp1_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -1696,7 +1705,7 @@ no_fetch:
|
|||||||
*/
|
*/
|
||||||
static void null_iot(const device_config *device, int op2, int nac, int mb, int *io, int ac)
|
static void null_iot(const device_config *device, int op2, int nac, int mb, int *io, int ac)
|
||||||
{
|
{
|
||||||
pdp1_state *cpustate = device->token;
|
pdp1_state *cpustate = get_safe_token(device);
|
||||||
/* Note that the dummy IOT 0 is used to wait for the completion pulse
|
/* Note that the dummy IOT 0 is used to wait for the completion pulse
|
||||||
generated by the a pending IOT (IOT with completion pulse but no IO wait) */
|
generated by the a pending IOT (IOT with completion pulse but no IO wait) */
|
||||||
if (LOG_IOT_EXTRA)
|
if (LOG_IOT_EXTRA)
|
||||||
@ -1719,7 +1728,7 @@ static void null_iot(const device_config *device, int op2, int nac, int mb, int
|
|||||||
*/
|
*/
|
||||||
static void lem_eem_iot(const device_config *device, int op2, int nac, int mb, int *io, int ac)
|
static void lem_eem_iot(const device_config *device, int op2, int nac, int mb, int *io, int ac)
|
||||||
{
|
{
|
||||||
pdp1_state *cpustate = device->token;
|
pdp1_state *cpustate = get_safe_token(device);
|
||||||
if (! cpustate->extend_support) /* extend mode supported? */
|
if (! cpustate->extend_support) /* extend mode supported? */
|
||||||
{
|
{
|
||||||
if (LOG)
|
if (LOG)
|
||||||
@ -1743,7 +1752,7 @@ static void lem_eem_iot(const device_config *device, int op2, int nac, int mb, i
|
|||||||
*/
|
*/
|
||||||
static void sbs_iot(const device_config *device, int op2, int nac, int mb, int *io, int ac)
|
static void sbs_iot(const device_config *device, int op2, int nac, int mb, int *io, int ac)
|
||||||
{
|
{
|
||||||
pdp1_state *cpustate = device->token;
|
pdp1_state *cpustate = get_safe_token(device);
|
||||||
switch (op2)
|
switch (op2)
|
||||||
{
|
{
|
||||||
case 054: /* LSM */
|
case 054: /* LSM */
|
||||||
@ -1787,7 +1796,7 @@ static void sbs_iot(const device_config *device, int op2, int nac, int mb, int *
|
|||||||
*/
|
*/
|
||||||
static void type_20_sbs_iot(const device_config *device, int op2, int nac, int mb, int *io, int ac)
|
static void type_20_sbs_iot(const device_config *device, int op2, int nac, int mb, int *io, int ac)
|
||||||
{
|
{
|
||||||
pdp1_state *cpustate = device->token;
|
pdp1_state *cpustate = get_safe_token(device);
|
||||||
int channel, mask;
|
int channel, mask;
|
||||||
if (! cpustate->type_20_sbs) /* type 20 sequence break system supported? */
|
if (! cpustate->type_20_sbs) /* type 20 sequence break system supported? */
|
||||||
{
|
{
|
||||||
|
@ -68,6 +68,15 @@ struct _tx0_state
|
|||||||
const address_space *program;
|
const address_space *program;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE tx0_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_TX0_64KW ||
|
||||||
|
cpu_get_type(device) == CPU_TX0_8KW);
|
||||||
|
return (tx0_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
#define READ_TX0_18BIT(A) ((signed)memory_read_dword_32be(cpustate->program, (A)<<2))
|
#define READ_TX0_18BIT(A) ((signed)memory_read_dword_32be(cpustate->program, (A)<<2))
|
||||||
#define WRITE_TX0_18BIT(A,V) (memory_write_dword_32be(cpustate->program, (A)<<2,(V)))
|
#define WRITE_TX0_18BIT(A,V) (memory_write_dword_32be(cpustate->program, (A)<<2,(V)))
|
||||||
@ -120,10 +129,10 @@ static void tx0_write(tx0_state *cpustate, offs_t address, int data)
|
|||||||
|
|
||||||
static void tx0_init_common(int is_64kw, const device_config *device, cpu_irq_callback irqcallback)
|
static void tx0_init_common(int is_64kw, const device_config *device, cpu_irq_callback irqcallback)
|
||||||
{
|
{
|
||||||
tx0_state *cpustate = device->token;
|
tx0_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
/* clean-up */
|
/* clean-up */
|
||||||
cpustate->iface = device->static_config;
|
cpustate->iface = (const tx0_reset_param_t *)device->static_config;
|
||||||
|
|
||||||
cpustate->address_mask = is_64kw ? ADDRESS_MASK_64KW : ADDRESS_MASK_8KW;
|
cpustate->address_mask = is_64kw ? ADDRESS_MASK_64KW : ADDRESS_MASK_8KW;
|
||||||
cpustate->ir_mask = is_64kw ? 03 : 037;
|
cpustate->ir_mask = is_64kw ? 03 : 037;
|
||||||
@ -144,7 +153,7 @@ static CPU_INIT( tx0_8kw)
|
|||||||
|
|
||||||
static CPU_RESET( tx0 )
|
static CPU_RESET( tx0 )
|
||||||
{
|
{
|
||||||
tx0_state *cpustate = device->token;
|
tx0_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
/* reset CPU flip-flops */
|
/* reset CPU flip-flops */
|
||||||
pulse_reset(device);
|
pulse_reset(device);
|
||||||
@ -155,7 +164,7 @@ static CPU_RESET( tx0 )
|
|||||||
/* execute instructions on this CPU until icount expires */
|
/* execute instructions on this CPU until icount expires */
|
||||||
static CPU_EXECUTE( tx0_64kw )
|
static CPU_EXECUTE( tx0_64kw )
|
||||||
{
|
{
|
||||||
tx0_state *cpustate = device->token;
|
tx0_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
@ -265,7 +274,7 @@ static CPU_EXECUTE( tx0_64kw )
|
|||||||
/* execute instructions on this CPU until icount expires */
|
/* execute instructions on this CPU until icount expires */
|
||||||
static CPU_EXECUTE( tx0_8kw )
|
static CPU_EXECUTE( tx0_8kw )
|
||||||
{
|
{
|
||||||
tx0_state *cpustate = device->token;
|
tx0_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
@ -375,7 +384,7 @@ static CPU_EXECUTE( tx0_8kw )
|
|||||||
|
|
||||||
static CPU_SET_INFO( tx0 )
|
static CPU_SET_INFO( tx0 )
|
||||||
{
|
{
|
||||||
tx0_state *cpustate = device->token;
|
tx0_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -426,7 +435,7 @@ static CPU_SET_INFO( tx0 )
|
|||||||
|
|
||||||
CPU_GET_INFO( tx0_64kw )
|
CPU_GET_INFO( tx0_64kw )
|
||||||
{
|
{
|
||||||
tx0_state *cpustate = ( device != NULL ) ? device->token : NULL;
|
tx0_state *cpustate = ( device != NULL && device->token != NULL ) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -552,7 +561,7 @@ CPU_GET_INFO( tx0_64kw )
|
|||||||
|
|
||||||
CPU_GET_INFO( tx0_8kw )
|
CPU_GET_INFO( tx0_8kw )
|
||||||
{
|
{
|
||||||
tx0_state *cpustate = ( device != NULL ) ? device->token : NULL;
|
tx0_state *cpustate = ( device != NULL && device->token != NULL ) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -680,7 +689,7 @@ CPU_GET_INFO( tx0_8kw )
|
|||||||
/* execute one instruction */
|
/* execute one instruction */
|
||||||
static void execute_instruction_64kw(const device_config *device)
|
static void execute_instruction_64kw(const device_config *device)
|
||||||
{
|
{
|
||||||
tx0_state *cpustate = device->token;
|
tx0_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
if (! cpustate->cycle)
|
if (! cpustate->cycle)
|
||||||
{
|
{
|
||||||
@ -779,13 +788,13 @@ static void execute_instruction_64kw(const device_config *device)
|
|||||||
if ((MAR & 0000104) == 0000100)
|
if ((MAR & 0000104) == 0000100)
|
||||||
/* (1.1) PEN = Read the light pen flip-flops 1 and 2 into AC(0) and
|
/* (1.1) PEN = Read the light pen flip-flops 1 and 2 into AC(0) and
|
||||||
AC(1). */
|
AC(1). */
|
||||||
/*...*/;
|
/*...*/{ }
|
||||||
|
|
||||||
if ((MAR & 0000104) == 0000004)
|
if ((MAR & 0000104) == 0000004)
|
||||||
/* (1.1) TAC = Insert a one in each digital position of the AC
|
/* (1.1) TAC = Insert a one in each digital position of the AC
|
||||||
wherever there is a one in the corresponding digital position
|
wherever there is a one in the corresponding digital position
|
||||||
of the TAC. */
|
of the TAC. */
|
||||||
/*...*/;
|
/*...*/ { }
|
||||||
|
|
||||||
if (MAR & 0000040)
|
if (MAR & 0000040)
|
||||||
/* (1.2) COM = Complement every digit in the accumulator */
|
/* (1.2) COM = Complement every digit in the accumulator */
|
||||||
@ -797,7 +806,7 @@ static void execute_instruction_64kw(const device_config *device)
|
|||||||
|
|
||||||
if ((MAR & 0000003) == 3)
|
if ((MAR & 0000003) == 3)
|
||||||
/* (1.2) TBR = Store the contents of the TBR in the MBR. */
|
/* (1.2) TBR = Store the contents of the TBR in the MBR. */
|
||||||
/*...*/;
|
/*...*/ { }
|
||||||
|
|
||||||
if ((MAR & 0000003) == 2)
|
if ((MAR & 0000003) == 2)
|
||||||
/* (1.3) LMB = Store the contents of the LR in the MBR. */
|
/* (1.3) LMB = Store the contents of the LR in the MBR. */
|
||||||
@ -871,7 +880,7 @@ static void indexed_address_eval(tx0_state *cpustate)
|
|||||||
/* execute one instruction */
|
/* execute one instruction */
|
||||||
static void execute_instruction_8kw(const device_config *device)
|
static void execute_instruction_8kw(const device_config *device)
|
||||||
{
|
{
|
||||||
tx0_state *cpustate = device->token;
|
tx0_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
if (! cpustate->cycle)
|
if (! cpustate->cycle)
|
||||||
{
|
{
|
||||||
@ -1277,7 +1286,7 @@ static void execute_instruction_8kw(const device_config *device)
|
|||||||
*/
|
*/
|
||||||
static void pulse_reset(const device_config *device)
|
static void pulse_reset(const device_config *device)
|
||||||
{
|
{
|
||||||
tx0_state *cpustate = device->token;
|
tx0_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
/* processor registers */
|
/* processor registers */
|
||||||
PC = 0; /* ??? */
|
PC = 0; /* ??? */
|
||||||
|
@ -104,6 +104,18 @@ struct _pic16c5x_state
|
|||||||
const address_space *io;
|
const address_space *io;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE pic16c5x_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_PIC16C54 ||
|
||||||
|
cpu_get_type(device) == CPU_PIC16C55 ||
|
||||||
|
cpu_get_type(device) == CPU_PIC16C56 ||
|
||||||
|
cpu_get_type(device) == CPU_PIC16C57 ||
|
||||||
|
cpu_get_type(device) == CPU_PIC16C58);
|
||||||
|
return (pic16c5x_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
/* opcode table entry */
|
/* opcode table entry */
|
||||||
typedef struct _pic16c5x_opcode pic16c5x_opcode;
|
typedef struct _pic16c5x_opcode pic16c5x_opcode;
|
||||||
@ -734,7 +746,7 @@ static const pic16c5x_opcode_00x opcode_00x[16]=
|
|||||||
|
|
||||||
static CPU_INIT( pic16c5x )
|
static CPU_INIT( pic16c5x )
|
||||||
{
|
{
|
||||||
pic16c5x_state *cpustate = device->token;
|
pic16c5x_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
state_save_register_device_item(device, 0, cpustate->W);
|
state_save_register_device_item(device, 0, cpustate->W);
|
||||||
state_save_register_device_item(device, 0, cpustate->ALU);
|
state_save_register_device_item(device, 0, cpustate->ALU);
|
||||||
@ -805,7 +817,7 @@ static void pic16c5x_soft_reset(pic16c5x_state *cpustate)
|
|||||||
|
|
||||||
void pic16c5x_set_config(const device_config *cpu, int data)
|
void pic16c5x_set_config(const device_config *cpu, int data)
|
||||||
{
|
{
|
||||||
pic16c5x_state *cpustate = cpu->token;
|
pic16c5x_state *cpustate = get_safe_token(cpu);
|
||||||
|
|
||||||
logerror("Writing %04x to the PIC16C5x config register\n",data);
|
logerror("Writing %04x to the PIC16C5x config register\n",data);
|
||||||
cpustate->temp_config = (data & 0xfff);
|
cpustate->temp_config = (data & 0xfff);
|
||||||
@ -889,7 +901,7 @@ static void pic16c5x_update_timer(pic16c5x_state *cpustate, int counts)
|
|||||||
|
|
||||||
static CPU_EXECUTE( pic16c5x )
|
static CPU_EXECUTE( pic16c5x )
|
||||||
{
|
{
|
||||||
pic16c5x_state *cpustate = device->token;
|
pic16c5x_state *cpustate = get_safe_token(device);
|
||||||
int T0_in;
|
int T0_in;
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
@ -964,7 +976,7 @@ static CPU_EXECUTE( pic16c5x )
|
|||||||
|
|
||||||
static CPU_SET_INFO( pic16c5x )
|
static CPU_SET_INFO( pic16c5x )
|
||||||
{
|
{
|
||||||
pic16c5x_state *cpustate = device->token;
|
pic16c5x_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -998,7 +1010,7 @@ static CPU_SET_INFO( pic16c5x )
|
|||||||
|
|
||||||
static CPU_GET_INFO( pic16c5x )
|
static CPU_GET_INFO( pic16c5x )
|
||||||
{
|
{
|
||||||
pic16c5x_state *cpustate = (device != NULL) ? device->token : NULL;
|
pic16c5x_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -1118,7 +1130,7 @@ ADDRESS_MAP_END
|
|||||||
|
|
||||||
static CPU_RESET( pic16c54 )
|
static CPU_RESET( pic16c54 )
|
||||||
{
|
{
|
||||||
pic16c5x_state *cpustate = device->token;
|
pic16c5x_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->picmodel = 0x16C54;
|
cpustate->picmodel = 0x16C54;
|
||||||
cpustate->picRAMmask = 0x1f;
|
cpustate->picRAMmask = 0x1f;
|
||||||
@ -1172,7 +1184,7 @@ ADDRESS_MAP_END
|
|||||||
|
|
||||||
static CPU_RESET( pic16c55 )
|
static CPU_RESET( pic16c55 )
|
||||||
{
|
{
|
||||||
pic16c5x_state *cpustate = device->token;
|
pic16c5x_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->picmodel = 0x16C55;
|
cpustate->picmodel = 0x16C55;
|
||||||
cpustate->picRAMmask = 0x1f;
|
cpustate->picRAMmask = 0x1f;
|
||||||
@ -1226,7 +1238,7 @@ ADDRESS_MAP_END
|
|||||||
|
|
||||||
static CPU_RESET( pic16c56 )
|
static CPU_RESET( pic16c56 )
|
||||||
{
|
{
|
||||||
pic16c5x_state *cpustate = device->token;
|
pic16c5x_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->picmodel = 0x16C56;
|
cpustate->picmodel = 0x16C56;
|
||||||
cpustate->picRAMmask = 0x1f;
|
cpustate->picRAMmask = 0x1f;
|
||||||
@ -1285,7 +1297,7 @@ ADDRESS_MAP_END
|
|||||||
|
|
||||||
static CPU_RESET( pic16c57 )
|
static CPU_RESET( pic16c57 )
|
||||||
{
|
{
|
||||||
pic16c5x_state *cpustate = device->token;
|
pic16c5x_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->picmodel = 0x16C57;
|
cpustate->picmodel = 0x16C57;
|
||||||
cpustate->picRAMmask = 0x7f;
|
cpustate->picRAMmask = 0x7f;
|
||||||
@ -1345,7 +1357,7 @@ ADDRESS_MAP_END
|
|||||||
|
|
||||||
static CPU_RESET( pic16c58 )
|
static CPU_RESET( pic16c58 )
|
||||||
{
|
{
|
||||||
pic16c5x_state *cpustate = device->token;
|
pic16c5x_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->picmodel = 0x16C58;
|
cpustate->picmodel = 0x16C58;
|
||||||
cpustate->picRAMmask = 0x7f;
|
cpustate->picRAMmask = 0x7f;
|
||||||
|
@ -186,7 +186,7 @@ INLINE void set_decrementer(powerpc_state *ppc, UINT32 newdec)
|
|||||||
|
|
||||||
void ppccom_init(powerpc_state *ppc, powerpc_flavor flavor, UINT8 cap, int tb_divisor, const device_config *device, cpu_irq_callback irqcallback)
|
void ppccom_init(powerpc_state *ppc, powerpc_flavor flavor, UINT8 cap, int tb_divisor, const device_config *device, cpu_irq_callback irqcallback)
|
||||||
{
|
{
|
||||||
const powerpc_config *config = device->static_config;
|
const powerpc_config *config = (const powerpc_config *)device->static_config;
|
||||||
|
|
||||||
/* initialize based on the config */
|
/* initialize based on the config */
|
||||||
memset(ppc, 0, sizeof(*ppc));
|
memset(ppc, 0, sizeof(*ppc));
|
||||||
@ -429,7 +429,7 @@ static UINT32 ppccom_translate_address_internal(powerpc_state *ppc, int intentio
|
|||||||
for (hashnum = 0; hashnum < 2; hashnum++)
|
for (hashnum = 0; hashnum < 2; hashnum++)
|
||||||
{
|
{
|
||||||
offs_t ptegaddr = hashbase | ((hash << 6) & hashmask);
|
offs_t ptegaddr = hashbase | ((hash << 6) & hashmask);
|
||||||
UINT32 *ptegptr = memory_get_read_ptr(ppc->program, ptegaddr);
|
UINT32 *ptegptr = (UINT32 *)memory_get_read_ptr(ppc->program, ptegaddr);
|
||||||
|
|
||||||
/* should only have valid memory here, but make sure */
|
/* should only have valid memory here, but make sure */
|
||||||
if (ptegptr != NULL)
|
if (ptegptr != NULL)
|
||||||
@ -1246,7 +1246,7 @@ void ppccom_get_info(powerpc_state *ppc, UINT32 state, cpuinfo *info)
|
|||||||
|
|
||||||
static TIMER_CALLBACK( decrementer_int_callback )
|
static TIMER_CALLBACK( decrementer_int_callback )
|
||||||
{
|
{
|
||||||
powerpc_state *ppc = ptr;
|
powerpc_state *ppc = (powerpc_state *)ptr;
|
||||||
UINT64 cycles_until_next;
|
UINT64 cycles_until_next;
|
||||||
|
|
||||||
/* set the decrementer IRQ state */
|
/* set the decrementer IRQ state */
|
||||||
@ -1506,7 +1506,7 @@ static void ppc4xx_dma_exec(powerpc_state *ppc, int dmachan)
|
|||||||
|
|
||||||
static TIMER_CALLBACK( ppc4xx_fit_callback )
|
static TIMER_CALLBACK( ppc4xx_fit_callback )
|
||||||
{
|
{
|
||||||
powerpc_state *ppc = ptr;
|
powerpc_state *ppc = (powerpc_state *)ptr;
|
||||||
|
|
||||||
/* if this is a real callback and we are enabled, signal an interrupt */
|
/* if this is a real callback and we are enabled, signal an interrupt */
|
||||||
if (param)
|
if (param)
|
||||||
@ -1536,7 +1536,7 @@ static TIMER_CALLBACK( ppc4xx_fit_callback )
|
|||||||
|
|
||||||
static TIMER_CALLBACK( ppc4xx_pit_callback )
|
static TIMER_CALLBACK( ppc4xx_pit_callback )
|
||||||
{
|
{
|
||||||
powerpc_state *ppc = ptr;
|
powerpc_state *ppc = (powerpc_state *)ptr;
|
||||||
|
|
||||||
/* if this is a real callback and we are enabled, signal an interrupt */
|
/* if this is a real callback and we are enabled, signal an interrupt */
|
||||||
if (param)
|
if (param)
|
||||||
@ -1647,7 +1647,7 @@ static void ppc4xx_spu_timer_reset(powerpc_state *ppc)
|
|||||||
|
|
||||||
static TIMER_CALLBACK( ppc4xx_spu_callback )
|
static TIMER_CALLBACK( ppc4xx_spu_callback )
|
||||||
{
|
{
|
||||||
powerpc_state *ppc = ptr;
|
powerpc_state *ppc = (powerpc_state *)ptr;
|
||||||
|
|
||||||
/* transmit enabled? */
|
/* transmit enabled? */
|
||||||
if (ppc->spu.regs[SPU4XX_TX_COMMAND] & 0x80)
|
if (ppc->spu.regs[SPU4XX_TX_COMMAND] & 0x80)
|
||||||
|
@ -435,6 +435,23 @@ static const UINT8 fcmp_cr_table_source[32] =
|
|||||||
INLINE FUNCTIONS
|
INLINE FUNCTIONS
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
|
INLINE powerpc_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_PPC403GA ||
|
||||||
|
cpu_get_type(device) == CPU_PPC403GCX ||
|
||||||
|
cpu_get_type(device) == CPU_PPC601 ||
|
||||||
|
cpu_get_type(device) == CPU_PPC602 ||
|
||||||
|
cpu_get_type(device) == CPU_PPC603 ||
|
||||||
|
cpu_get_type(device) == CPU_PPC603E ||
|
||||||
|
cpu_get_type(device) == CPU_PPC603R ||
|
||||||
|
cpu_get_type(device) == CPU_PPC604 ||
|
||||||
|
cpu_get_type(device) == CPU_MPC8240);
|
||||||
|
return *(powerpc_state **)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------
|
/*-------------------------------------------------
|
||||||
alloc_handle - allocate a handle if not
|
alloc_handle - allocate a handle if not
|
||||||
already allocated
|
already allocated
|
||||||
@ -552,14 +569,14 @@ static void ppcdrc_init(powerpc_flavor flavor, UINT8 cap, int tb_divisor, const
|
|||||||
fatalerror("Unable to allocate cache of size %d", (UINT32)(CACHE_SIZE + sizeof(*ppc)));
|
fatalerror("Unable to allocate cache of size %d", (UINT32)(CACHE_SIZE + sizeof(*ppc)));
|
||||||
|
|
||||||
/* allocate the core from the near cache */
|
/* allocate the core from the near cache */
|
||||||
*(powerpc_state **)device->token = ppc = drccache_memory_alloc_near(cache, sizeof(*ppc));
|
*(powerpc_state **)device->token = ppc = (powerpc_state *)drccache_memory_alloc_near(cache, sizeof(*ppc));
|
||||||
memset(ppc, 0, sizeof(*ppc));
|
memset(ppc, 0, sizeof(*ppc));
|
||||||
|
|
||||||
/* initialize the core */
|
/* initialize the core */
|
||||||
ppccom_init(ppc, flavor, cap, tb_divisor, device, irqcallback);
|
ppccom_init(ppc, flavor, cap, tb_divisor, device, irqcallback);
|
||||||
|
|
||||||
/* allocate the implementation-specific state from the full cache */
|
/* allocate the implementation-specific state from the full cache */
|
||||||
ppc->impstate = drccache_memory_alloc_near(cache, sizeof(*ppc->impstate));
|
ppc->impstate = (ppcimp_state *)drccache_memory_alloc_near(cache, sizeof(*ppc->impstate));
|
||||||
memset(ppc->impstate, 0, sizeof(*ppc->impstate));
|
memset(ppc->impstate, 0, sizeof(*ppc->impstate));
|
||||||
ppc->impstate->cache = cache;
|
ppc->impstate->cache = cache;
|
||||||
|
|
||||||
@ -670,7 +687,7 @@ static void ppcdrc_init(powerpc_flavor flavor, UINT8 cap, int tb_divisor, const
|
|||||||
|
|
||||||
static CPU_RESET( ppcdrc )
|
static CPU_RESET( ppcdrc )
|
||||||
{
|
{
|
||||||
powerpc_state *ppc = *(powerpc_state **)device->token;
|
powerpc_state *ppc = get_safe_token(device);
|
||||||
|
|
||||||
/* reset the common code and mark the cache dirty */
|
/* reset the common code and mark the cache dirty */
|
||||||
ppccom_reset(ppc);
|
ppccom_reset(ppc);
|
||||||
@ -686,7 +703,7 @@ static CPU_RESET( ppcdrc )
|
|||||||
|
|
||||||
static CPU_EXECUTE( ppcdrc )
|
static CPU_EXECUTE( ppcdrc )
|
||||||
{
|
{
|
||||||
powerpc_state *ppc = *(powerpc_state **)device->token;
|
powerpc_state *ppc = get_safe_token(device);
|
||||||
drcuml_state *drcuml = ppc->impstate->drcuml;
|
drcuml_state *drcuml = ppc->impstate->drcuml;
|
||||||
int execute_result;
|
int execute_result;
|
||||||
|
|
||||||
@ -723,7 +740,7 @@ static CPU_EXECUTE( ppcdrc )
|
|||||||
|
|
||||||
static CPU_EXIT( ppcdrc )
|
static CPU_EXIT( ppcdrc )
|
||||||
{
|
{
|
||||||
powerpc_state *ppc = *(powerpc_state **)device->token;
|
powerpc_state *ppc = get_safe_token(device);
|
||||||
ppccom_exit(ppc);
|
ppccom_exit(ppc);
|
||||||
|
|
||||||
/* clean up the DRC */
|
/* clean up the DRC */
|
||||||
@ -740,7 +757,7 @@ static CPU_EXIT( ppcdrc )
|
|||||||
|
|
||||||
static CPU_TRANSLATE( ppcdrc )
|
static CPU_TRANSLATE( ppcdrc )
|
||||||
{
|
{
|
||||||
powerpc_state *ppc = *(powerpc_state **)device->token;
|
powerpc_state *ppc = get_safe_token(device);
|
||||||
return ppccom_translate_address(ppc, space, intention, address);
|
return ppccom_translate_address(ppc, space, intention, address);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -751,7 +768,7 @@ static CPU_TRANSLATE( ppcdrc )
|
|||||||
|
|
||||||
static CPU_DISASSEMBLE( ppcdrc )
|
static CPU_DISASSEMBLE( ppcdrc )
|
||||||
{
|
{
|
||||||
powerpc_state *ppc = *(powerpc_state **)device->token;
|
powerpc_state *ppc = get_safe_token(device);
|
||||||
return ppccom_dasm(ppc, buffer, pc, oprom, opram);
|
return ppccom_dasm(ppc, buffer, pc, oprom, opram);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -763,7 +780,7 @@ static CPU_DISASSEMBLE( ppcdrc )
|
|||||||
|
|
||||||
static CPU_SET_INFO( ppcdrc )
|
static CPU_SET_INFO( ppcdrc )
|
||||||
{
|
{
|
||||||
powerpc_state *ppc = *(powerpc_state **)device->token;
|
powerpc_state *ppc = get_safe_token(device);
|
||||||
|
|
||||||
/* --- everything is handled generically --- */
|
/* --- everything is handled generically --- */
|
||||||
ppccom_set_info(ppc, state, info);
|
ppccom_set_info(ppc, state, info);
|
||||||
@ -777,7 +794,7 @@ static CPU_SET_INFO( ppcdrc )
|
|||||||
|
|
||||||
static CPU_GET_INFO( ppcdrc )
|
static CPU_GET_INFO( ppcdrc )
|
||||||
{
|
{
|
||||||
powerpc_state *ppc = (device != NULL && device->token != NULL) ? *(powerpc_state **)device->token : NULL;
|
powerpc_state *ppc = (device != NULL && device->token != NULL) ? get_safe_token(device) : 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 --- */
|
||||||
@ -808,7 +825,7 @@ static CPU_GET_INFO( ppcdrc )
|
|||||||
|
|
||||||
void ppcdrc_set_options(const device_config *device, UINT32 options)
|
void ppcdrc_set_options(const device_config *device, UINT32 options)
|
||||||
{
|
{
|
||||||
powerpc_state *ppc = *(powerpc_state **)device->token;
|
powerpc_state *ppc = get_safe_token(device);
|
||||||
ppc->impstate->drcoptions = options;
|
ppc->impstate->drcoptions = options;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -820,7 +837,7 @@ void ppcdrc_set_options(const device_config *device, UINT32 options)
|
|||||||
|
|
||||||
void ppcdrc_add_fastram(const device_config *device, offs_t start, offs_t end, UINT8 readonly, void *base)
|
void ppcdrc_add_fastram(const device_config *device, offs_t start, offs_t end, UINT8 readonly, void *base)
|
||||||
{
|
{
|
||||||
powerpc_state *ppc = *(powerpc_state **)device->token;
|
powerpc_state *ppc = get_safe_token(device);
|
||||||
if (ppc->impstate->fastram_select < ARRAY_LENGTH(ppc->impstate->fastram))
|
if (ppc->impstate->fastram_select < ARRAY_LENGTH(ppc->impstate->fastram))
|
||||||
{
|
{
|
||||||
ppc->impstate->fastram[ppc->impstate->fastram_select].start = start;
|
ppc->impstate->fastram[ppc->impstate->fastram_select].start = start;
|
||||||
@ -838,7 +855,7 @@ void ppcdrc_add_fastram(const device_config *device, offs_t start, offs_t end, U
|
|||||||
|
|
||||||
void ppcdrc_add_hotspot(const device_config *device, offs_t pc, UINT32 opcode, UINT32 cycles)
|
void ppcdrc_add_hotspot(const device_config *device, offs_t pc, UINT32 opcode, UINT32 cycles)
|
||||||
{
|
{
|
||||||
powerpc_state *ppc = *(powerpc_state **)device->token;
|
powerpc_state *ppc = get_safe_token(device);
|
||||||
if (ppc->impstate->hotspot_select < ARRAY_LENGTH(ppc->impstate->hotspot))
|
if (ppc->impstate->hotspot_select < ARRAY_LENGTH(ppc->impstate->hotspot))
|
||||||
{
|
{
|
||||||
ppc->impstate->hotspot[ppc->impstate->hotspot_select].pc = pc;
|
ppc->impstate->hotspot[ppc->impstate->hotspot_select].pc = pc;
|
||||||
@ -1032,7 +1049,7 @@ static void code_compile_block(powerpc_state *ppc, UINT8 mode, offs_t pc)
|
|||||||
|
|
||||||
static void cfunc_printf_exception(void *param)
|
static void cfunc_printf_exception(void *param)
|
||||||
{
|
{
|
||||||
powerpc_state *ppc = param;
|
powerpc_state *ppc = (powerpc_state *)param;
|
||||||
printf("Exception: type=%2d EPC=%08X MSR=%08X\n", ppc->param0, ppc->spr[SPROEA_SRR0], ppc->spr[SPROEA_SRR1]);
|
printf("Exception: type=%2d EPC=%08X MSR=%08X\n", ppc->param0, ppc->spr[SPROEA_SRR0], ppc->spr[SPROEA_SRR1]);
|
||||||
cfunc_printf_probe(ppc);
|
cfunc_printf_probe(ppc);
|
||||||
}
|
}
|
||||||
@ -1045,7 +1062,7 @@ static void cfunc_printf_exception(void *param)
|
|||||||
|
|
||||||
static void cfunc_printf_debug(void *param)
|
static void cfunc_printf_debug(void *param)
|
||||||
{
|
{
|
||||||
powerpc_state *ppc = param;
|
powerpc_state *ppc = (powerpc_state *)param;
|
||||||
printf(ppc->impstate->format, ppc->impstate->arg0, ppc->impstate->arg1);
|
printf(ppc->impstate->format, ppc->impstate->arg0, ppc->impstate->arg1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1057,7 +1074,7 @@ static void cfunc_printf_debug(void *param)
|
|||||||
|
|
||||||
static void cfunc_printf_probe(void *param)
|
static void cfunc_printf_probe(void *param)
|
||||||
{
|
{
|
||||||
powerpc_state *ppc = param;
|
powerpc_state *ppc = (powerpc_state *)param;
|
||||||
UINT32 pc = (UINT32)(FPTR)param;
|
UINT32 pc = (UINT32)(FPTR)param;
|
||||||
|
|
||||||
printf(" PC=%08X\n", pc);
|
printf(" PC=%08X\n", pc);
|
||||||
@ -1087,7 +1104,7 @@ static void cfunc_printf_probe(void *param)
|
|||||||
|
|
||||||
static void cfunc_unimplemented(void *param)
|
static void cfunc_unimplemented(void *param)
|
||||||
{
|
{
|
||||||
powerpc_state *ppc = param;
|
powerpc_state *ppc = (powerpc_state *)param;
|
||||||
UINT32 opcode = ppc->impstate->arg0;
|
UINT32 opcode = ppc->impstate->arg0;
|
||||||
fatalerror("PC=%08X: Unimplemented op %08X", ppc->pc, opcode);
|
fatalerror("PC=%08X: Unimplemented op %08X", ppc->pc, opcode);
|
||||||
}
|
}
|
||||||
@ -1459,7 +1476,7 @@ static void static_generate_memory_accessor(powerpc_state *ppc, int mode, int si
|
|||||||
/* on exit, read result is in I0 */
|
/* on exit, read result is in I0 */
|
||||||
/* routine trashes I0-I3 */
|
/* routine trashes I0-I3 */
|
||||||
drcuml_state *drcuml = ppc->impstate->drcuml;
|
drcuml_state *drcuml = ppc->impstate->drcuml;
|
||||||
int fastxor = BYTE8_XOR_BE(0) >> (cpu_get_databus_width(ppc->device, ADDRESS_SPACE_PROGRAM) < 64);
|
int fastxor = BYTE8_XOR_BE(0) >> (int)(cpu_get_databus_width(ppc->device, ADDRESS_SPACE_PROGRAM) < 64);
|
||||||
drcuml_block *block;
|
drcuml_block *block;
|
||||||
jmp_buf errorbuf;
|
jmp_buf errorbuf;
|
||||||
int translate_type;
|
int translate_type;
|
||||||
@ -4237,7 +4254,7 @@ static void log_opcode_desc(drcuml_state *drcuml, const opcode_desc *desclist, i
|
|||||||
|
|
||||||
static CPU_GET_INFO( ppcdrc4xx )
|
static CPU_GET_INFO( ppcdrc4xx )
|
||||||
{
|
{
|
||||||
powerpc_state *ppc = (device != NULL && device->token != NULL) ? *(powerpc_state **)device->token : NULL;
|
powerpc_state *ppc = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
CPU_GET_INFO_CALL(ppcdrc);
|
CPU_GET_INFO_CALL(ppcdrc);
|
||||||
ppc4xx_get_info(ppc, state, info);
|
ppc4xx_get_info(ppc, state, info);
|
||||||
}
|
}
|
||||||
@ -4250,7 +4267,7 @@ static CPU_GET_INFO( ppcdrc4xx )
|
|||||||
|
|
||||||
static CPU_SET_INFO( ppcdrc4xx )
|
static CPU_SET_INFO( ppcdrc4xx )
|
||||||
{
|
{
|
||||||
powerpc_state *ppc = *(powerpc_state **)device->token;
|
powerpc_state *ppc = get_safe_token(device);
|
||||||
CPU_SET_INFO_CALL(ppcdrc);
|
CPU_SET_INFO_CALL(ppcdrc);
|
||||||
ppc4xx_set_info(ppc, state, info);
|
ppc4xx_set_info(ppc, state, info);
|
||||||
}
|
}
|
||||||
|
@ -129,7 +129,7 @@ INLINE int is_603_class(const powerpc_state *ppc)
|
|||||||
|
|
||||||
int ppcfe_describe(void *param, opcode_desc *desc, const opcode_desc *prev)
|
int ppcfe_describe(void *param, opcode_desc *desc, const opcode_desc *prev)
|
||||||
{
|
{
|
||||||
powerpc_state *ppc = param;
|
powerpc_state *ppc = (powerpc_state *)param;
|
||||||
UINT32 op, opswitch;
|
UINT32 op, opswitch;
|
||||||
int regnum;
|
int regnum;
|
||||||
|
|
||||||
|
@ -63,6 +63,14 @@ struct _rsp_state
|
|||||||
int icount;
|
int icount;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE rsp_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_RSP);
|
||||||
|
return (rsp_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#define RSREG ((op >> 21) & 0x1f)
|
#define RSREG ((op >> 21) & 0x1f)
|
||||||
@ -343,10 +351,10 @@ static const int vector_elements_2[16][8] =
|
|||||||
|
|
||||||
static CPU_INIT( rsp )
|
static CPU_INIT( rsp )
|
||||||
{
|
{
|
||||||
rsp_state *cpustate = device->token;
|
rsp_state *cpustate = get_safe_token(device);
|
||||||
int regIdx;
|
int regIdx;
|
||||||
int accumIdx;
|
int accumIdx;
|
||||||
cpustate->config = device->static_config;
|
cpustate->config = (const rsp_config *)device->static_config;
|
||||||
|
|
||||||
if (LOG_INSTRUCTION_EXECUTION)
|
if (LOG_INSTRUCTION_EXECUTION)
|
||||||
cpustate->exec_output = fopen("rsp_execute.txt", "wt");
|
cpustate->exec_output = fopen("rsp_execute.txt", "wt");
|
||||||
@ -387,7 +395,7 @@ static CPU_INIT( rsp )
|
|||||||
|
|
||||||
static CPU_EXIT( rsp )
|
static CPU_EXIT( rsp )
|
||||||
{
|
{
|
||||||
rsp_state *cpustate = device->token;
|
rsp_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
#if SAVE_DISASM
|
#if SAVE_DISASM
|
||||||
{
|
{
|
||||||
@ -435,7 +443,7 @@ static CPU_EXIT( rsp )
|
|||||||
|
|
||||||
static CPU_RESET( rsp )
|
static CPU_RESET( rsp )
|
||||||
{
|
{
|
||||||
rsp_state *cpustate = device->token;
|
rsp_state *cpustate = get_safe_token(device);
|
||||||
cpustate->nextpc = ~0;
|
cpustate->nextpc = ~0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2528,7 +2536,7 @@ static void handle_vector_ops(rsp_state *cpustate, UINT32 op)
|
|||||||
i = 0;
|
i = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sqr = (INT32)(0x7fffffff / sqrt(sqr));
|
sqr = (INT32)(0x7fffffff / sqrt((double)sqr));
|
||||||
for (i = 31; i > 0; i--)
|
for (i = 31; i > 0; i--)
|
||||||
{
|
{
|
||||||
if (sqr & (1 << i))
|
if (sqr & (1 << i))
|
||||||
@ -2585,7 +2593,7 @@ static void handle_vector_ops(rsp_state *cpustate, UINT32 op)
|
|||||||
|
|
||||||
static CPU_EXECUTE( rsp )
|
static CPU_EXECUTE( rsp )
|
||||||
{
|
{
|
||||||
rsp_state *cpustate = device->token;
|
rsp_state *cpustate = get_safe_token(device);
|
||||||
UINT32 op;
|
UINT32 op;
|
||||||
|
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
@ -2869,7 +2877,7 @@ static CPU_DISASSEMBLE( rsp )
|
|||||||
|
|
||||||
static CPU_SET_INFO( rsp )
|
static CPU_SET_INFO( rsp )
|
||||||
{
|
{
|
||||||
rsp_state *cpustate = device->token;
|
rsp_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -2917,7 +2925,7 @@ static CPU_SET_INFO( rsp )
|
|||||||
|
|
||||||
CPU_GET_INFO( rsp )
|
CPU_GET_INFO( rsp )
|
||||||
{
|
{
|
||||||
rsp_state *cpustate = (device != NULL) ? device->token : NULL;
|
rsp_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch(state)
|
switch(state)
|
||||||
{
|
{
|
||||||
|
@ -46,6 +46,15 @@ struct _s2650_regs {
|
|||||||
const address_space *io;
|
const address_space *io;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE s2650_regs *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_S2650);
|
||||||
|
return (s2650_regs *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
/* condition code changes for a byte */
|
/* condition code changes for a byte */
|
||||||
static const UINT8 ccc[0x200] = {
|
static const UINT8 ccc[0x200] = {
|
||||||
0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
|
0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
|
||||||
@ -759,7 +768,7 @@ static void BRA_EA(void) _BRA_EA()
|
|||||||
|
|
||||||
static CPU_INIT( s2650 )
|
static CPU_INIT( s2650 )
|
||||||
{
|
{
|
||||||
s2650_regs *s2650c = device->token;
|
s2650_regs *s2650c = get_safe_token(device);
|
||||||
|
|
||||||
s2650c->irq_callback = irqcallback;
|
s2650c->irq_callback = irqcallback;
|
||||||
s2650c->device = device;
|
s2650c->device = device;
|
||||||
@ -782,7 +791,7 @@ static CPU_INIT( s2650 )
|
|||||||
|
|
||||||
static CPU_RESET( s2650 )
|
static CPU_RESET( s2650 )
|
||||||
{
|
{
|
||||||
s2650_regs *s2650c = device->token;
|
s2650_regs *s2650c = get_safe_token(device);
|
||||||
|
|
||||||
s2650c->ppc = 0;
|
s2650c->ppc = 0;
|
||||||
s2650c->page = 0,
|
s2650c->page = 0,
|
||||||
@ -851,7 +860,7 @@ static int s2650_get_sense(s2650_regs *s2650c)
|
|||||||
|
|
||||||
static CPU_EXECUTE( s2650 )
|
static CPU_EXECUTE( s2650 )
|
||||||
{
|
{
|
||||||
s2650_regs *s2650c = device->token;
|
s2650_regs *s2650c = get_safe_token(device);
|
||||||
|
|
||||||
s2650c->icount = cycles;
|
s2650c->icount = cycles;
|
||||||
do
|
do
|
||||||
@ -1470,7 +1479,7 @@ static CPU_EXECUTE( s2650 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( s2650 )
|
static CPU_SET_INFO( s2650 )
|
||||||
{
|
{
|
||||||
s2650_regs *s2650c = device->token;
|
s2650_regs *s2650c = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -1507,7 +1516,7 @@ static CPU_SET_INFO( s2650 )
|
|||||||
|
|
||||||
CPU_GET_INFO( s2650 )
|
CPU_GET_INFO( s2650 )
|
||||||
{
|
{
|
||||||
s2650_regs *s2650c = device ? device->token : NULL;
|
s2650_regs *s2650c = (device != NULL && device->token != NULL) ? get_safe_token(device) : 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 --- */
|
||||||
|
@ -86,6 +86,15 @@ struct _saturn_state
|
|||||||
int icount;
|
int icount;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE saturn_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_SATURN);
|
||||||
|
return (saturn_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
/***************************************************************
|
/***************************************************************
|
||||||
* include the opcode macros, functions and tables
|
* include the opcode macros, functions and tables
|
||||||
***************************************************************/
|
***************************************************************/
|
||||||
@ -101,7 +110,7 @@ struct _saturn_state
|
|||||||
|
|
||||||
static CPU_INIT( saturn )
|
static CPU_INIT( saturn )
|
||||||
{
|
{
|
||||||
saturn_state *cpustate = device->token;
|
saturn_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->config = (saturn_cpu_core *) device->static_config;
|
cpustate->config = (saturn_cpu_core *) device->static_config;
|
||||||
cpustate->irq_callback = irqcallback;
|
cpustate->irq_callback = irqcallback;
|
||||||
@ -135,7 +144,7 @@ static CPU_INIT( saturn )
|
|||||||
|
|
||||||
static CPU_RESET( saturn )
|
static CPU_RESET( saturn )
|
||||||
{
|
{
|
||||||
saturn_state *cpustate = device->token;
|
saturn_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->pc=0;
|
cpustate->pc=0;
|
||||||
cpustate->sleeping = 0;
|
cpustate->sleeping = 0;
|
||||||
@ -159,7 +168,7 @@ INLINE void saturn_take_irq(saturn_state *cpustate)
|
|||||||
|
|
||||||
static CPU_EXECUTE( saturn )
|
static CPU_EXECUTE( saturn )
|
||||||
{
|
{
|
||||||
saturn_state *cpustate = device->token;
|
saturn_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
@ -238,7 +247,7 @@ static void IntReg64(Saturn64 r, INT64 d)
|
|||||||
|
|
||||||
static CPU_SET_INFO( saturn )
|
static CPU_SET_INFO( saturn )
|
||||||
{
|
{
|
||||||
saturn_state *cpustate = device->token;
|
saturn_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -295,7 +304,7 @@ static INT64 Reg64Int(Saturn64 r)
|
|||||||
|
|
||||||
CPU_GET_INFO( saturn )
|
CPU_GET_INFO( saturn )
|
||||||
{
|
{
|
||||||
saturn_state *cpustate = (device != NULL) ? device->token : NULL;
|
saturn_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
@ -59,15 +59,24 @@ struct _sc61860_state
|
|||||||
int icount;
|
int icount;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE sc61860_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_SC61860);
|
||||||
|
return (sc61860_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
UINT8 *sc61860_internal_ram(const device_config *device)
|
UINT8 *sc61860_internal_ram(const device_config *device)
|
||||||
{
|
{
|
||||||
sc61860_state *cpustate = device->token;
|
sc61860_state *cpustate = get_safe_token(device);
|
||||||
return cpustate->ram;
|
return cpustate->ram;
|
||||||
}
|
}
|
||||||
|
|
||||||
static TIMER_CALLBACK(sc61860_2ms_tick)
|
static TIMER_CALLBACK(sc61860_2ms_tick)
|
||||||
{
|
{
|
||||||
sc61860_state *cpustate = ptr;
|
sc61860_state *cpustate = (sc61860_state *)ptr;
|
||||||
if (--cpustate->timer.count == 0)
|
if (--cpustate->timer.count == 0)
|
||||||
{
|
{
|
||||||
cpustate->timer.count = 128;
|
cpustate->timer.count = 128;
|
||||||
@ -84,7 +93,7 @@ static TIMER_CALLBACK(sc61860_2ms_tick)
|
|||||||
|
|
||||||
static CPU_RESET( sc61860 )
|
static CPU_RESET( sc61860 )
|
||||||
{
|
{
|
||||||
sc61860_state *cpustate = device->token;
|
sc61860_state *cpustate = get_safe_token(device);
|
||||||
cpustate->timer.t2ms=0;
|
cpustate->timer.t2ms=0;
|
||||||
cpustate->timer.t512ms=0;
|
cpustate->timer.t512ms=0;
|
||||||
cpustate->timer.count=256;
|
cpustate->timer.count=256;
|
||||||
@ -93,7 +102,7 @@ static CPU_RESET( sc61860 )
|
|||||||
|
|
||||||
static CPU_INIT( sc61860 )
|
static CPU_INIT( sc61860 )
|
||||||
{
|
{
|
||||||
sc61860_state *cpustate = device->token;
|
sc61860_state *cpustate = get_safe_token(device);
|
||||||
cpustate->config = (sc61860_cpu_core *) device->static_config;
|
cpustate->config = (sc61860_cpu_core *) device->static_config;
|
||||||
timer_pulse(device->machine, ATTOTIME_IN_HZ(500), cpustate, 0, sc61860_2ms_tick);
|
timer_pulse(device->machine, ATTOTIME_IN_HZ(500), cpustate, 0, sc61860_2ms_tick);
|
||||||
cpustate->device = device;
|
cpustate->device = device;
|
||||||
@ -102,7 +111,7 @@ static CPU_INIT( sc61860 )
|
|||||||
|
|
||||||
static CPU_EXECUTE( sc61860 )
|
static CPU_EXECUTE( sc61860 )
|
||||||
{
|
{
|
||||||
sc61860_state *cpustate = device->token;
|
sc61860_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
@ -140,7 +149,7 @@ static CPU_EXECUTE( sc61860 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( sc61860 )
|
static CPU_SET_INFO( sc61860 )
|
||||||
{
|
{
|
||||||
sc61860_state *cpustate = device->token;
|
sc61860_state *cpustate = get_safe_token(device);
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -164,7 +173,7 @@ static CPU_SET_INFO( sc61860 )
|
|||||||
|
|
||||||
CPU_GET_INFO( sc61860 )
|
CPU_GET_INFO( sc61860 )
|
||||||
{
|
{
|
||||||
sc61860_state *cpustate = (device != NULL) ? device->token : NULL;
|
sc61860_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : 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 --- */
|
||||||
|
@ -3245,7 +3245,7 @@ INLINE void op1111(SH4 *sh4, UINT16 opcode)
|
|||||||
static CPU_RESET( sh4 )
|
static CPU_RESET( sh4 )
|
||||||
{
|
{
|
||||||
SH4 *sh4 = get_safe_token(device);
|
SH4 *sh4 = get_safe_token(device);
|
||||||
void *tsaved[4];
|
emu_timer *tsaved[4];
|
||||||
emu_timer *tsave[5];
|
emu_timer *tsave[5];
|
||||||
UINT32 *m;
|
UINT32 *m;
|
||||||
int save_is_slave;
|
int save_is_slave;
|
||||||
|
@ -30,6 +30,15 @@ static const UINT16 tcnt[] = { TCNT0, TCNT1, TCNT2 };
|
|||||||
static const UINT16 tcor[] = { TCOR0, TCOR1, TCOR2 };
|
static const UINT16 tcor[] = { TCOR0, TCOR1, TCOR2 };
|
||||||
static const UINT16 tcr[] = { TCR0, TCR1, TCR2 };
|
static const UINT16 tcr[] = { TCR0, TCR1, TCR2 };
|
||||||
|
|
||||||
|
INLINE SH4 *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_SH4);
|
||||||
|
return (SH4 *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
void sh4_change_register_bank(SH4 *sh4, int to)
|
void sh4_change_register_bank(SH4 *sh4, int to)
|
||||||
{
|
{
|
||||||
int s;
|
int s;
|
||||||
@ -254,7 +263,7 @@ static void sh4_timer_recompute(SH4 *sh4, int which)
|
|||||||
|
|
||||||
static TIMER_CALLBACK( sh4_refresh_timer_callback )
|
static TIMER_CALLBACK( sh4_refresh_timer_callback )
|
||||||
{
|
{
|
||||||
SH4 *sh4 = ptr;
|
SH4 *sh4 = (SH4 *)ptr;
|
||||||
|
|
||||||
sh4->m[RTCNT] = 0;
|
sh4->m[RTCNT] = 0;
|
||||||
sh4_refresh_timer_recompute(sh4);
|
sh4_refresh_timer_recompute(sh4);
|
||||||
@ -365,7 +374,7 @@ static void increment_rtc_time(SH4 *sh4, int mode)
|
|||||||
|
|
||||||
static TIMER_CALLBACK( sh4_rtc_timer_callback )
|
static TIMER_CALLBACK( sh4_rtc_timer_callback )
|
||||||
{
|
{
|
||||||
SH4 *sh4 = ptr;
|
SH4 *sh4 = (SH4 *)ptr;
|
||||||
|
|
||||||
timer_adjust_oneshot(sh4->rtc_timer, ATTOTIME_IN_HZ(128), 0);
|
timer_adjust_oneshot(sh4->rtc_timer, ATTOTIME_IN_HZ(128), 0);
|
||||||
sh4->m[R64CNT] = (sh4->m[R64CNT]+1) & 0x7f;
|
sh4->m[R64CNT] = (sh4->m[R64CNT]+1) & 0x7f;
|
||||||
@ -380,7 +389,7 @@ static TIMER_CALLBACK( sh4_rtc_timer_callback )
|
|||||||
static TIMER_CALLBACK( sh4_timer_callback )
|
static TIMER_CALLBACK( sh4_timer_callback )
|
||||||
{
|
{
|
||||||
static const UINT16 tuni[] = { SH4_INTC_TUNI0, SH4_INTC_TUNI1, SH4_INTC_TUNI2 };
|
static const UINT16 tuni[] = { SH4_INTC_TUNI0, SH4_INTC_TUNI1, SH4_INTC_TUNI2 };
|
||||||
SH4 *sh4 = ptr;
|
SH4 *sh4 = (SH4 *)ptr;
|
||||||
int which = param;
|
int which = param;
|
||||||
int idx = tcr[which];
|
int idx = tcr[which];
|
||||||
|
|
||||||
@ -393,7 +402,7 @@ static TIMER_CALLBACK( sh4_timer_callback )
|
|||||||
|
|
||||||
static TIMER_CALLBACK( sh4_dmac_callback )
|
static TIMER_CALLBACK( sh4_dmac_callback )
|
||||||
{
|
{
|
||||||
SH4 *sh4 = ptr;
|
SH4 *sh4 = (SH4 *)ptr;
|
||||||
int channel = param;
|
int channel = param;
|
||||||
|
|
||||||
LOG(("SH4 '%s': DMA %d complete\n", sh4->device->tag, channel));
|
LOG(("SH4 '%s': DMA %d complete\n", sh4->device->tag, channel));
|
||||||
@ -623,7 +632,7 @@ int s;
|
|||||||
|
|
||||||
WRITE32_HANDLER( sh4_internal_w )
|
WRITE32_HANDLER( sh4_internal_w )
|
||||||
{
|
{
|
||||||
SH4 *sh4 = space->cpu->token;
|
SH4 *sh4 = get_safe_token(space->cpu);
|
||||||
int a;
|
int a;
|
||||||
UINT32 old = sh4->m[offset];
|
UINT32 old = sh4->m[offset];
|
||||||
COMBINE_DATA(sh4->m+offset);
|
COMBINE_DATA(sh4->m+offset);
|
||||||
@ -909,7 +918,7 @@ WRITE32_HANDLER( sh4_internal_w )
|
|||||||
|
|
||||||
READ32_HANDLER( sh4_internal_r )
|
READ32_HANDLER( sh4_internal_r )
|
||||||
{
|
{
|
||||||
SH4 *sh4 = space->cpu->token;
|
SH4 *sh4 = get_safe_token(space->cpu);
|
||||||
// logerror("sh4_internal_r: Read %08x (%x) @ %08x\n", 0xfe000000+((offset & 0x3fc0) << 11)+((offset & 0x3f) << 2), offset, mem_mask);
|
// logerror("sh4_internal_r: Read %08x (%x) @ %08x\n", 0xfe000000+((offset & 0x3fc0) << 11)+((offset & 0x3f) << 2), offset, mem_mask);
|
||||||
switch( offset )
|
switch( offset )
|
||||||
{
|
{
|
||||||
@ -958,7 +967,7 @@ READ32_HANDLER( sh4_internal_r )
|
|||||||
|
|
||||||
void sh4_set_frt_input(const device_config *device, int state)
|
void sh4_set_frt_input(const device_config *device, int state)
|
||||||
{
|
{
|
||||||
SH4 *sh4 = device->token;
|
SH4 *sh4 = get_safe_token(device);
|
||||||
|
|
||||||
if(state == PULSE_LINE)
|
if(state == PULSE_LINE)
|
||||||
{
|
{
|
||||||
@ -994,7 +1003,7 @@ void sh4_set_frt_input(const device_config *device, int state)
|
|||||||
|
|
||||||
void sh4_set_irln_input(const device_config *device, int value)
|
void sh4_set_irln_input(const device_config *device, int value)
|
||||||
{
|
{
|
||||||
SH4 *sh4 = device->token;
|
SH4 *sh4 = get_safe_token(device);
|
||||||
|
|
||||||
if (sh4->irln == value)
|
if (sh4->irln == value)
|
||||||
return;
|
return;
|
||||||
@ -1123,7 +1132,7 @@ void sh4_parse_configuration(SH4 *sh4, const struct sh4_config *conf)
|
|||||||
|
|
||||||
void sh4_common_init(const device_config *device)
|
void sh4_common_init(const device_config *device)
|
||||||
{
|
{
|
||||||
SH4 *sh4 = device->token;
|
SH4 *sh4 = get_safe_token(device);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i=0; i<3; i++)
|
for (i=0; i<3; i++)
|
||||||
@ -1145,7 +1154,7 @@ void sh4_common_init(const device_config *device)
|
|||||||
sh4->rtc_timer = timer_alloc(device->machine, sh4_rtc_timer_callback, sh4);
|
sh4->rtc_timer = timer_alloc(device->machine, sh4_rtc_timer_callback, sh4);
|
||||||
timer_adjust_oneshot(sh4->rtc_timer, attotime_never, 0);
|
timer_adjust_oneshot(sh4->rtc_timer, attotime_never, 0);
|
||||||
|
|
||||||
sh4->m = auto_malloc(16384*4);
|
sh4->m = (UINT32 *)auto_malloc(16384*4);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sh4_dma_ddt(SH4 *sh4, struct sh4_ddt_dma *s)
|
void sh4_dma_ddt(SH4 *sh4, struct sh4_ddt_dma *s)
|
||||||
|
@ -55,6 +55,15 @@ struct _sm8500_state
|
|||||||
UINT8 internal_ram[0x500];
|
UINT8 internal_ram[0x500];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE sm8500_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_SM8500);
|
||||||
|
return (sm8500_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
static const UINT8 sm8500_b2w[8] = {
|
static const UINT8 sm8500_b2w[8] = {
|
||||||
0, 8, 2, 10, 4, 12, 6, 14
|
0, 8, 2, 10, 4, 12, 6, 14
|
||||||
};
|
};
|
||||||
@ -86,7 +95,7 @@ INLINE void sm85cpu_mem_writeword( sm8500_state *cpustate, UINT32 address, UINT1
|
|||||||
|
|
||||||
static CPU_INIT( sm8500 )
|
static CPU_INIT( sm8500 )
|
||||||
{
|
{
|
||||||
sm8500_state *cpustate = device->token;
|
sm8500_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->irq_callback = irqcallback;
|
cpustate->irq_callback = irqcallback;
|
||||||
cpustate->device = device;
|
cpustate->device = device;
|
||||||
@ -103,7 +112,7 @@ static CPU_INIT( sm8500 )
|
|||||||
|
|
||||||
static CPU_RESET( sm8500 )
|
static CPU_RESET( sm8500 )
|
||||||
{
|
{
|
||||||
sm8500_state *cpustate = device->token;
|
sm8500_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->PC = 0x1020;
|
cpustate->PC = 0x1020;
|
||||||
cpustate->IE0 = 0;
|
cpustate->IE0 = 0;
|
||||||
@ -217,7 +226,7 @@ INLINE void sm8500_process_interrupts(sm8500_state *cpustate) {
|
|||||||
|
|
||||||
static CPU_EXECUTE( sm8500 )
|
static CPU_EXECUTE( sm8500 )
|
||||||
{
|
{
|
||||||
sm8500_state *cpustate = device->token;
|
sm8500_state *cpustate = get_safe_token(device);
|
||||||
UINT8 op;
|
UINT8 op;
|
||||||
UINT16 oldpc;
|
UINT16 oldpc;
|
||||||
int mycycles;
|
int mycycles;
|
||||||
@ -258,7 +267,7 @@ static CPU_EXECUTE( sm8500 )
|
|||||||
|
|
||||||
static CPU_BURN( sm8500 )
|
static CPU_BURN( sm8500 )
|
||||||
{
|
{
|
||||||
sm8500_state *cpustate = device->token;
|
sm8500_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
if ( cycles > 0 ) {
|
if ( cycles > 0 ) {
|
||||||
/* burn a number of 4 cycles */
|
/* burn a number of 4 cycles */
|
||||||
@ -381,7 +390,7 @@ static void sm8500_set_irq_line( sm8500_state *cpustate, int irqline, int state
|
|||||||
|
|
||||||
static CPU_SET_INFO( sm8500 )
|
static CPU_SET_INFO( sm8500 )
|
||||||
{
|
{
|
||||||
sm8500_state *cpustate = device->token;
|
sm8500_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch(state)
|
switch(state)
|
||||||
{
|
{
|
||||||
@ -435,7 +444,7 @@ static CPU_SET_INFO( sm8500 )
|
|||||||
|
|
||||||
CPU_GET_INFO( sm8500 )
|
CPU_GET_INFO( sm8500 )
|
||||||
{
|
{
|
||||||
sm8500_state *cpustate = (device != NULL) ? device->token : NULL;
|
sm8500_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch(state)
|
switch(state)
|
||||||
{
|
{
|
||||||
|
@ -97,6 +97,15 @@ typedef struct
|
|||||||
int spc_int32;
|
int spc_int32;
|
||||||
} spc700i_cpu;
|
} spc700i_cpu;
|
||||||
|
|
||||||
|
INLINE spc700i_cpu *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_SPC700);
|
||||||
|
return (spc700i_cpu *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
/* ======================================================================== */
|
/* ======================================================================== */
|
||||||
/* ==================== ARCHITECTURE-DEPENDANT DEFINES ==================== */
|
/* ==================== ARCHITECTURE-DEPENDANT DEFINES ==================== */
|
||||||
/* ======================================================================== */
|
/* ======================================================================== */
|
||||||
@ -1239,7 +1248,7 @@ INLINE void SET_FLAG_I(spc700i_cpu *cpustate, uint value)
|
|||||||
|
|
||||||
static CPU_INIT( spc700 )
|
static CPU_INIT( spc700 )
|
||||||
{
|
{
|
||||||
spc700i_cpu *cpustate = device->token;
|
spc700i_cpu *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
INT_ACK = irqcallback;
|
INT_ACK = irqcallback;
|
||||||
cpustate->device = device;
|
cpustate->device = device;
|
||||||
@ -1249,7 +1258,7 @@ static CPU_INIT( spc700 )
|
|||||||
|
|
||||||
static CPU_RESET( spc700 )
|
static CPU_RESET( spc700 )
|
||||||
{
|
{
|
||||||
spc700i_cpu *cpustate = device->token;
|
spc700i_cpu *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
CPU_STOPPED = 0;
|
CPU_STOPPED = 0;
|
||||||
#if !SPC700_OPTIMIZE_SNES
|
#if !SPC700_OPTIMIZE_SNES
|
||||||
@ -1307,7 +1316,7 @@ static void spc700_set_irq_line(spc700i_cpu *cpustate,int line, int state)
|
|||||||
/* Execute instructions for <clocks> cycles */
|
/* Execute instructions for <clocks> cycles */
|
||||||
static CPU_EXECUTE( spc700 )
|
static CPU_EXECUTE( spc700 )
|
||||||
{
|
{
|
||||||
spc700i_cpu *cpustate = device->token;
|
spc700i_cpu *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
CLOCKS = CPU_STOPPED ? 0 : cycles;
|
CLOCKS = CPU_STOPPED ? 0 : cycles;
|
||||||
while(CLOCKS > 0)
|
while(CLOCKS > 0)
|
||||||
@ -1586,7 +1595,7 @@ static CPU_EXECUTE( spc700 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( spc700 )
|
static CPU_SET_INFO( spc700 )
|
||||||
{
|
{
|
||||||
spc700i_cpu *cpustate = device->token;
|
spc700i_cpu *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -1613,7 +1622,7 @@ static CPU_SET_INFO( spc700 )
|
|||||||
|
|
||||||
CPU_GET_INFO( spc700 )
|
CPU_GET_INFO( spc700 )
|
||||||
{
|
{
|
||||||
spc700i_cpu *cpustate = (device != NULL) ? device->token : NULL;
|
spc700i_cpu *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
uint p = 0;
|
uint p = 0;
|
||||||
|
|
||||||
if (cpustate != NULL)
|
if (cpustate != NULL)
|
||||||
|
@ -55,6 +55,14 @@ struct _ssp1601_state_t
|
|||||||
const address_space *io;
|
const address_space *io;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE ssp1601_state_t *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_SSP1601);
|
||||||
|
return (ssp1601_state_t *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -502,7 +510,7 @@ static UINT32 ptr2_read(ssp1601_state_t *ssp1601_state, int op)
|
|||||||
|
|
||||||
static CPU_INIT( ssp1601 )
|
static CPU_INIT( ssp1601 )
|
||||||
{
|
{
|
||||||
ssp1601_state_t *ssp1601_state = device->token;
|
ssp1601_state_t *ssp1601_state = get_safe_token(device);
|
||||||
|
|
||||||
state_save_register_device_item(device, 0, rX);
|
state_save_register_device_item(device, 0, rX);
|
||||||
state_save_register_device_item(device, 0, rY);
|
state_save_register_device_item(device, 0, rY);
|
||||||
@ -532,7 +540,7 @@ static CPU_EXIT( ssp1601 )
|
|||||||
|
|
||||||
static CPU_RESET( ssp1601 )
|
static CPU_RESET( ssp1601 )
|
||||||
{
|
{
|
||||||
ssp1601_state_t *ssp1601_state = device->token;
|
ssp1601_state_t *ssp1601_state = get_safe_token(device);
|
||||||
|
|
||||||
rPC = 0x400;
|
rPC = 0x400;
|
||||||
rSTACK = 0; // ? using ascending stack
|
rSTACK = 0; // ? using ascending stack
|
||||||
@ -542,7 +550,7 @@ static CPU_RESET( ssp1601 )
|
|||||||
|
|
||||||
static CPU_EXECUTE( ssp1601 )
|
static CPU_EXECUTE( ssp1601 )
|
||||||
{
|
{
|
||||||
ssp1601_state_t *ssp1601_state = device->token;
|
ssp1601_state_t *ssp1601_state = get_safe_token(device);
|
||||||
|
|
||||||
ssp1601_state->g_cycles = cycles;
|
ssp1601_state->g_cycles = cycles;
|
||||||
|
|
||||||
@ -758,7 +766,7 @@ static CPU_EXECUTE( ssp1601 )
|
|||||||
|
|
||||||
static CPU_DISASSEMBLE( ssp1601 )
|
static CPU_DISASSEMBLE( ssp1601 )
|
||||||
{
|
{
|
||||||
//ssp1601_state_t *ssp1601_state = device->token;
|
//ssp1601_state_t *ssp1601_state = get_safe_token(device);
|
||||||
|
|
||||||
return dasm_ssp1601(buffer, pc, oprom);
|
return dasm_ssp1601(buffer, pc, oprom);
|
||||||
}
|
}
|
||||||
@ -767,7 +775,7 @@ static CPU_DISASSEMBLE( ssp1601 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( ssp1601 )
|
static CPU_SET_INFO( ssp1601 )
|
||||||
{
|
{
|
||||||
ssp1601_state_t *ssp1601_state = device->token;
|
ssp1601_state_t *ssp1601_state = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -808,7 +816,7 @@ static CPU_SET_INFO( ssp1601 )
|
|||||||
|
|
||||||
CPU_GET_INFO( ssp1601 )
|
CPU_GET_INFO( ssp1601 )
|
||||||
{
|
{
|
||||||
ssp1601_state_t *ssp1601_state = (device != NULL) ? device->token : NULL;
|
ssp1601_state_t *ssp1601_state = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
@ -10,7 +10,8 @@
|
|||||||
#include "cpuexec.h"
|
#include "cpuexec.h"
|
||||||
#include "tlcs90.h"
|
#include "tlcs90.h"
|
||||||
|
|
||||||
typedef enum { UNKNOWN, NOP, EX, EXX, LD, LDW, LDA, LDI, LDIR, LDD, LDDR, CPI, CPIR, CPD, CPDR, PUSH, POP, JP, JR, CALL, CALLR, RET, RETI, HALT, DI, EI, SWI, DAA, CPL, NEG, LDAR, RCF, SCF, CCF, TSET, BIT, SET, RES, INC, DEC, INCX, DECX, INCW, DECW, ADD, ADC, SUB, SBC, AND, XOR, OR, CP, RLC, RRC, RL, RR, SLA, SRA, SLL, SRL, RLD, RRD, DJNZ, MUL, DIV } e_op;
|
typedef enum { UNKNOWN, NOP, EX, EXX, LD, LDW, LDA, LDI, LDIR, LDD, LDDR, CPI, CPIR, CPD, CPDR, PUSH, POP, JP, JR, CALL, CALLR, RET, RETI, HALT, DI, EI, SWI, DAA, CPL, NEG, LDAR, RCF, SCF, CCF, TSET, BIT, SET, RES, INC, DEC, INCX, DECX, INCW, DECW, ADD, ADC, SUB, SBC, AND, XOR, OR, CP, RLC, RRC, RL, RR, SLA, SRA, SLL, SRL, RLD, RRD, DJNZ, MUL, DIV } _e_op;
|
||||||
|
typedef UINT8 e_op;
|
||||||
static const char *const op_names[] = { "??", "nop", "ex", "exx", "ld", "ldw", "lda", "ldi", "ldir", "ldd", "lddr", "cpi", "cpir", "cpd", "cpdr", "push", "pop", "jp", "jr", "call", "callr", "ret", "reti", "halt", "di", "ei", "swi", "daa", "cpl", "neg", "ldar", "rcf", "scf", "ccf", "tset", "bit", "set", "res", "inc", "dec", "incx", "decx", "incw", "decw", "add", "adc", "sub", "sbc", "and", "xor", "or", "cp", "rlc", "rrc", "rl", "rr", "sla", "sra", "sll", "srl", "rld", "rrd", "djnz", "mul", "div" };
|
static const char *const op_names[] = { "??", "nop", "ex", "exx", "ld", "ldw", "lda", "ldi", "ldir", "ldd", "lddr", "cpi", "cpir", "cpd", "cpdr", "push", "pop", "jp", "jr", "call", "callr", "ret", "reti", "halt", "di", "ei", "swi", "daa", "cpl", "neg", "ldar", "rcf", "scf", "ccf", "tset", "bit", "set", "res", "inc", "dec", "incx", "decx", "incw", "decw", "add", "adc", "sub", "sbc", "and", "xor", "or", "cp", "rlc", "rrc", "rl", "rr", "sla", "sra", "sll", "srl", "rld", "rrd", "djnz", "mul", "div" };
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@ -59,6 +60,18 @@ typedef struct
|
|||||||
|
|
||||||
} t90_Regs;
|
} t90_Regs;
|
||||||
|
|
||||||
|
INLINE t90_Regs *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_TMP90840 ||
|
||||||
|
cpu_get_type(device) == CPU_TMP90841 ||
|
||||||
|
cpu_get_type(device) == CPU_TMP91640 ||
|
||||||
|
cpu_get_type(device) == CPU_TMP91641);
|
||||||
|
return (t90_Regs *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
T90_B, T90_C, T90_D, T90_E, T90_H, T90_L, T90_A,
|
T90_B, T90_C, T90_D, T90_E, T90_H, T90_L, T90_A,
|
||||||
T90_BC, T90_DE, T90_HL, T90_XX, T90_IX, T90_IY, T90_SP,
|
T90_BC, T90_DE, T90_HL, T90_XX, T90_IX, T90_IY, T90_SP,
|
||||||
@ -997,7 +1010,7 @@ static int sprint_arg(char *buffer, UINT32 pc, const char *pre, const e_mode mod
|
|||||||
|
|
||||||
CPU_DISASSEMBLE( t90 )
|
CPU_DISASSEMBLE( t90 )
|
||||||
{
|
{
|
||||||
t90_Regs *cpustate = device->token;
|
t90_Regs *cpustate = get_safe_token(device);
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
cpustate->addr = pc;
|
cpustate->addr = pc;
|
||||||
@ -1268,6 +1281,7 @@ INT2 P82 Rising Edge -
|
|||||||
*************************************************************************************************************/
|
*************************************************************************************************************/
|
||||||
|
|
||||||
typedef enum { INTSWI = 0, INTNMI, INTWD, INT0, INTT0, INTT1, INTT2, INTT3, INTT4, INT1, INTT5, INT2, INTRX, INTTX, INTMAX } e_irq;
|
typedef enum { INTSWI = 0, INTNMI, INTWD, INT0, INTT0, INTT1, INTT2, INTT3, INTT4, INT1, INTT5, INT2, INTRX, INTTX, INTMAX } e_irq;
|
||||||
|
DECLARE_ENUM_OPERATORS(e_irq)
|
||||||
|
|
||||||
INLINE void leave_halt(t90_Regs *cpustate)
|
INLINE void leave_halt(t90_Regs *cpustate)
|
||||||
{
|
{
|
||||||
@ -1326,7 +1340,7 @@ INLINE void Cyc_f(t90_Regs *cpustate) { cpustate->icount -= cpustate->cyc_f; }
|
|||||||
|
|
||||||
static CPU_EXECUTE( t90 )
|
static CPU_EXECUTE( t90 )
|
||||||
{
|
{
|
||||||
t90_Regs *cpustate = device->token;
|
t90_Regs *cpustate = get_safe_token(device);
|
||||||
UINT8 a8,b8;
|
UINT8 a8,b8;
|
||||||
UINT16 a16,b16;
|
UINT16 a16,b16;
|
||||||
unsigned a32;
|
unsigned a32;
|
||||||
@ -1968,7 +1982,7 @@ static CPU_EXECUTE( t90 )
|
|||||||
|
|
||||||
static CPU_RESET( t90 )
|
static CPU_RESET( t90 )
|
||||||
{
|
{
|
||||||
t90_Regs *cpustate = device->token;
|
t90_Regs *cpustate = get_safe_token(device);
|
||||||
cpustate->irq_state = 0;
|
cpustate->irq_state = 0;
|
||||||
cpustate->irq_mask = 0;
|
cpustate->irq_mask = 0;
|
||||||
cpustate->pc.d = 0x0000;
|
cpustate->pc.d = 0x0000;
|
||||||
@ -1988,7 +2002,7 @@ static CPU_EXIT( t90 )
|
|||||||
|
|
||||||
static CPU_BURN( t90 )
|
static CPU_BURN( t90 )
|
||||||
{
|
{
|
||||||
t90_Regs *cpustate = device->token;
|
t90_Regs *cpustate = get_safe_token(device);
|
||||||
cpustate->icount -= 4 * ((cycles + 3) / 4);
|
cpustate->icount -= 4 * ((cycles + 3) / 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2266,7 +2280,7 @@ FFED BX R/W Reset Description
|
|||||||
|
|
||||||
static READ8_HANDLER( t90_internal_registers_r )
|
static READ8_HANDLER( t90_internal_registers_r )
|
||||||
{
|
{
|
||||||
t90_Regs *cpustate = space->cpu->token;
|
t90_Regs *cpustate = get_safe_token(space->cpu);
|
||||||
|
|
||||||
#define RIO memory_read_byte_8le( cpustate->io, T90_IOBASE+offset )
|
#define RIO memory_read_byte_8le( cpustate->io, T90_IOBASE+offset )
|
||||||
|
|
||||||
@ -2378,7 +2392,7 @@ static void t90_stop_timer4(t90_Regs *cpustate)
|
|||||||
|
|
||||||
static TIMER_CALLBACK( t90_timer_callback )
|
static TIMER_CALLBACK( t90_timer_callback )
|
||||||
{
|
{
|
||||||
t90_Regs *cpustate = ptr;
|
t90_Regs *cpustate = (t90_Regs *)ptr;
|
||||||
int is16bit;
|
int is16bit;
|
||||||
int i = param;
|
int i = param;
|
||||||
|
|
||||||
@ -2450,7 +2464,7 @@ static TIMER_CALLBACK( t90_timer4_callback )
|
|||||||
{
|
{
|
||||||
// logerror("CPU Timer 4 fired! value = %d\n", (unsigned)cpustate->timer_value[4]);
|
// logerror("CPU Timer 4 fired! value = %d\n", (unsigned)cpustate->timer_value[4]);
|
||||||
|
|
||||||
t90_Regs *cpustate = ptr;
|
t90_Regs *cpustate = (t90_Regs *)ptr;
|
||||||
cpustate->timer4_value++;
|
cpustate->timer4_value++;
|
||||||
|
|
||||||
// Match
|
// Match
|
||||||
@ -2480,7 +2494,7 @@ static WRITE8_HANDLER( t90_internal_registers_w )
|
|||||||
{
|
{
|
||||||
#define WIO memory_write_byte_8le( cpustate->io, T90_IOBASE+offset, data )
|
#define WIO memory_write_byte_8le( cpustate->io, T90_IOBASE+offset, data )
|
||||||
|
|
||||||
t90_Regs *cpustate = space->cpu->token;
|
t90_Regs *cpustate = get_safe_token(space->cpu);
|
||||||
UINT8 out_mask;
|
UINT8 out_mask;
|
||||||
UINT8 old = cpustate->internal_registers[offset];
|
UINT8 old = cpustate->internal_registers[offset];
|
||||||
switch ( T90_IOBASE + offset )
|
switch ( T90_IOBASE + offset )
|
||||||
@ -2617,7 +2631,7 @@ static WRITE8_HANDLER( t90_internal_registers_w )
|
|||||||
|
|
||||||
static CPU_INIT( t90 )
|
static CPU_INIT( t90 )
|
||||||
{
|
{
|
||||||
t90_Regs *cpustate = device->token;
|
t90_Regs *cpustate = get_safe_token(device);
|
||||||
int i, p;
|
int i, p;
|
||||||
|
|
||||||
// state_save_register_device_item(device, 0, Z80.prvpc.w.l);
|
// state_save_register_device_item(device, 0, Z80.prvpc.w.l);
|
||||||
@ -2691,7 +2705,7 @@ ADDRESS_MAP_END
|
|||||||
|
|
||||||
static CPU_SET_INFO( t90 )
|
static CPU_SET_INFO( t90 )
|
||||||
{
|
{
|
||||||
t90_Regs *cpustate = device->token;
|
t90_Regs *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -2724,7 +2738,7 @@ static CPU_SET_INFO( t90 )
|
|||||||
|
|
||||||
CPU_GET_INFO( tmp90840 )
|
CPU_GET_INFO( tmp90840 )
|
||||||
{
|
{
|
||||||
t90_Regs *cpustate = (device != NULL) ? device->token : NULL;
|
t90_Regs *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
@ -96,6 +96,14 @@ struct _tms32010_state
|
|||||||
const address_space *io;
|
const address_space *io;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE tms32010_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_TMS32010);
|
||||||
|
return (tms32010_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
/* opcode table entry */
|
/* opcode table entry */
|
||||||
typedef struct _tms32010_opcode tms32010_opcode;
|
typedef struct _tms32010_opcode tms32010_opcode;
|
||||||
@ -377,7 +385,7 @@ static void adds(tms32010_state *cpustate)
|
|||||||
cpustate->ACC.d += cpustate->ALU.d;
|
cpustate->ACC.d += cpustate->ALU.d;
|
||||||
CALCULATE_ADD_OVERFLOW(cpustate, cpustate->ALU.d);
|
CALCULATE_ADD_OVERFLOW(cpustate, cpustate->ALU.d);
|
||||||
}
|
}
|
||||||
static void and(tms32010_state *cpustate)
|
static void and_(tms32010_state *cpustate)
|
||||||
{
|
{
|
||||||
getdata(cpustate, 0,0);
|
getdata(cpustate, 0,0);
|
||||||
cpustate->ACC.d &= cpustate->ALU.d;
|
cpustate->ACC.d &= cpustate->ALU.d;
|
||||||
@ -583,7 +591,7 @@ static void nop(tms32010_state *cpustate)
|
|||||||
{
|
{
|
||||||
/* Nothing to do */
|
/* Nothing to do */
|
||||||
}
|
}
|
||||||
static void or(tms32010_state *cpustate)
|
static void or_(tms32010_state *cpustate)
|
||||||
{
|
{
|
||||||
getdata(cpustate, 0,0);
|
getdata(cpustate, 0,0);
|
||||||
cpustate->ACC.w.l |= cpustate->ALU.w.l;
|
cpustate->ACC.w.l |= cpustate->ALU.w.l;
|
||||||
@ -690,7 +698,7 @@ static void tblw(tms32010_state *cpustate)
|
|||||||
M_WRTROM(((cpustate->ACC.w.l & cpustate->addr_mask)),cpustate->ALU.w.l);
|
M_WRTROM(((cpustate->ACC.w.l & cpustate->addr_mask)),cpustate->ALU.w.l);
|
||||||
cpustate->STACK[0] = cpustate->STACK[1];
|
cpustate->STACK[0] = cpustate->STACK[1];
|
||||||
}
|
}
|
||||||
static void xor(tms32010_state *cpustate)
|
static void xor_(tms32010_state *cpustate)
|
||||||
{
|
{
|
||||||
getdata(cpustate, 0,0);
|
getdata(cpustate, 0,0);
|
||||||
cpustate->ACC.w.l ^= cpustate->ALU.w.l;
|
cpustate->ACC.w.l ^= cpustate->ALU.w.l;
|
||||||
@ -735,7 +743,7 @@ static const tms32010_opcode opcode_main[256]=
|
|||||||
/*60*/ {1, addh },{1, adds },{1, subh },{1, subs },{1, subc },{1, zalh },{1, zals },{3, tblr },
|
/*60*/ {1, addh },{1, adds },{1, subh },{1, subs },{1, subc },{1, zalh },{1, zals },{3, tblr },
|
||||||
/*68*/ {1, larp_mar},{1, dmov },{1, lt },{1, ltd },{1, lta },{1, mpy },{1, ldpk },{1, ldp },
|
/*68*/ {1, larp_mar},{1, dmov },{1, lt },{1, ltd },{1, lta },{1, mpy },{1, ldpk },{1, ldp },
|
||||||
/*70*/ {1, lark_ar0},{1, lark_ar1 },{0, illegal },{0, illegal },{0, illegal },{0, illegal },{0, illegal },{0, illegal },
|
/*70*/ {1, lark_ar0},{1, lark_ar1 },{0, illegal },{0, illegal },{0, illegal },{0, illegal },{0, illegal },{0, illegal },
|
||||||
/*78*/ {1, xor },{1, and },{1, or },{1, lst },{1, sst },{3, tblw },{1, lack },{0, opcodes_7F },
|
/*78*/ {1, xor_ },{1, and_ },{1, or_ },{1, lst },{1, sst },{3, tblw },{1, lack },{0, opcodes_7F },
|
||||||
/*80*/ {1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },
|
/*80*/ {1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },
|
||||||
/*88*/ {1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },
|
/*88*/ {1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },
|
||||||
/*90*/ {1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },
|
/*90*/ {1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },{1, mpyk },
|
||||||
@ -769,7 +777,7 @@ static const tms32010_opcode_7F opcode_7F[32]=
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static CPU_INIT( tms32010 )
|
static CPU_INIT( tms32010 )
|
||||||
{
|
{
|
||||||
tms32010_state *cpustate = device->token;
|
tms32010_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
state_save_register_device_item(device, 0, cpustate->PC);
|
state_save_register_device_item(device, 0, cpustate->PC);
|
||||||
state_save_register_device_item(device, 0, cpustate->PREVPC);
|
state_save_register_device_item(device, 0, cpustate->PREVPC);
|
||||||
@ -803,7 +811,7 @@ static CPU_INIT( tms32010 )
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static CPU_RESET( tms32010 )
|
static CPU_RESET( tms32010 )
|
||||||
{
|
{
|
||||||
tms32010_state *cpustate = device->token;
|
tms32010_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->PC = 0;
|
cpustate->PC = 0;
|
||||||
cpustate->STR = 0x7efe; // OV cleared
|
cpustate->STR = 0x7efe; // OV cleared
|
||||||
@ -846,7 +854,7 @@ static int Ext_IRQ(tms32010_state *cpustate)
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static CPU_EXECUTE( tms32010 )
|
static CPU_EXECUTE( tms32010 )
|
||||||
{
|
{
|
||||||
tms32010_state *cpustate = device->token;
|
tms32010_state *cpustate = get_safe_token(device);
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
do
|
do
|
||||||
@ -905,7 +913,7 @@ ADDRESS_MAP_END
|
|||||||
|
|
||||||
static CPU_SET_INFO( tms32010 )
|
static CPU_SET_INFO( tms32010 )
|
||||||
{
|
{
|
||||||
tms32010_state *cpustate = device->token;
|
tms32010_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -935,7 +943,7 @@ static CPU_SET_INFO( tms32010 )
|
|||||||
|
|
||||||
CPU_GET_INFO( tms32010 )
|
CPU_GET_INFO( tms32010 )
|
||||||
{
|
{
|
||||||
tms32010_state *cpustate = (device != NULL) ? device->token : NULL;
|
tms32010_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
@ -180,6 +180,15 @@ struct _tms32025_state
|
|||||||
UINT16 *datamap[0x200];
|
UINT16 *datamap[0x200];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE tms32025_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_TMS32025 ||
|
||||||
|
cpu_get_type(device) == CPU_TMS32026);
|
||||||
|
return (tms32025_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
/* opcode table entry */
|
/* opcode table entry */
|
||||||
typedef struct _tms32025_opcode tms32025_opcode;
|
typedef struct _tms32025_opcode tms32025_opcode;
|
||||||
@ -643,7 +652,7 @@ static void adrk(tms32025_state *cpustate)
|
|||||||
{
|
{
|
||||||
cpustate->AR[ARP] += cpustate->opcode.b.l;
|
cpustate->AR[ARP] += cpustate->opcode.b.l;
|
||||||
}
|
}
|
||||||
static void and(tms32025_state *cpustate)
|
static void and_(tms32025_state *cpustate)
|
||||||
{
|
{
|
||||||
GETDATA(cpustate, 0, 0);
|
GETDATA(cpustate, 0, 0);
|
||||||
cpustate->ACC.d &= cpustate->ALU.d;
|
cpustate->ACC.d &= cpustate->ALU.d;
|
||||||
@ -1223,7 +1232,7 @@ static void norm(tms32025_state *cpustate)
|
|||||||
MODIFY_AR_ARP(cpustate);
|
MODIFY_AR_ARP(cpustate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static void or(tms32025_state *cpustate)
|
static void or_(tms32025_state *cpustate)
|
||||||
{
|
{
|
||||||
GETDATA(cpustate, 0, 0);
|
GETDATA(cpustate, 0, 0);
|
||||||
cpustate->ACC.w.l |= cpustate->ALU.w.l;
|
cpustate->ACC.w.l |= cpustate->ALU.w.l;
|
||||||
@ -1577,7 +1586,7 @@ static void trap(tms32025_state *cpustate)
|
|||||||
PUSH_STACK(cpustate, cpustate->PC);
|
PUSH_STACK(cpustate, cpustate->PC);
|
||||||
SET_PC(0x001E); /* Trap vector */
|
SET_PC(0x001E); /* Trap vector */
|
||||||
}
|
}
|
||||||
static void xor(tms32025_state *cpustate)
|
static void xor_(tms32025_state *cpustate)
|
||||||
{
|
{
|
||||||
GETDATA(cpustate, 0, 0);
|
GETDATA(cpustate, 0, 0);
|
||||||
cpustate->ACC.w.l ^= cpustate->ALU.w.l;
|
cpustate->ACC.w.l ^= cpustate->ALU.w.l;
|
||||||
@ -1626,7 +1635,7 @@ static const tms32025_opcode opcode_main[256]=
|
|||||||
/*30*/ {1*CLK, lar_ar0 },{1*CLK, lar_ar1 },{1*CLK, lar_ar2 },{1*CLK, lar_ar3 },{1*CLK, lar_ar4 },{1*CLK, lar_ar5 },{1*CLK, lar_ar6 },{1*CLK, lar_ar7 },
|
/*30*/ {1*CLK, lar_ar0 },{1*CLK, lar_ar1 },{1*CLK, lar_ar2 },{1*CLK, lar_ar3 },{1*CLK, lar_ar4 },{1*CLK, lar_ar5 },{1*CLK, lar_ar6 },{1*CLK, lar_ar7 },
|
||||||
/*38*/ {1*CLK, mpy },{1*CLK, sqra },{1*CLK, mpya },{1*CLK, mpys },{1*CLK, lt },{1*CLK, lta },{1*CLK, ltp },{1*CLK, ltd },
|
/*38*/ {1*CLK, mpy },{1*CLK, sqra },{1*CLK, mpya },{1*CLK, mpys },{1*CLK, lt },{1*CLK, lta },{1*CLK, ltp },{1*CLK, ltd },
|
||||||
/*40*/ {1*CLK, zalh },{1*CLK, zals },{1*CLK, lact },{1*CLK, addc },{1*CLK, subh },{1*CLK, subs },{1*CLK, subt },{1*CLK, subc },
|
/*40*/ {1*CLK, zalh },{1*CLK, zals },{1*CLK, lact },{1*CLK, addc },{1*CLK, subh },{1*CLK, subs },{1*CLK, subt },{1*CLK, subc },
|
||||||
/*48*/ {1*CLK, addh },{1*CLK, adds },{1*CLK, addt },{1*CLK, rpt },{1*CLK, xor },{1*CLK, or },{1*CLK, and },{1*CLK, subb },
|
/*48*/ {1*CLK, addh },{1*CLK, adds },{1*CLK, addt },{1*CLK, rpt },{1*CLK, xor_ },{1*CLK, or_ },{1*CLK, and_ },{1*CLK, subb },
|
||||||
/*50*/ {1*CLK, lst },{1*CLK, lst1 },{1*CLK, ldp },{1*CLK, lph },{1*CLK, pshd },{1*CLK, mar },{1*CLK, dmov },{1*CLK, bitt },
|
/*50*/ {1*CLK, lst },{1*CLK, lst1 },{1*CLK, ldp },{1*CLK, lph },{1*CLK, pshd },{1*CLK, mar },{1*CLK, dmov },{1*CLK, bitt },
|
||||||
/*58*/ {3*CLK, tblr },{2*CLK, tblw },{1*CLK, sqrs },{1*CLK, lts },{2*CLK, macd },{2*CLK, mac },{2*CLK, bc },{2*CLK, bnc },
|
/*58*/ {3*CLK, tblr },{2*CLK, tblw },{1*CLK, sqrs },{1*CLK, lts },{2*CLK, macd },{2*CLK, mac },{2*CLK, bc },{2*CLK, bnc },
|
||||||
/*60*/ {1*CLK, sacl },{1*CLK, sacl },{1*CLK, sacl },{1*CLK, sacl },{1*CLK, sacl },{1*CLK, sacl },{1*CLK, sacl },{1*CLK, sacl },
|
/*60*/ {1*CLK, sacl },{1*CLK, sacl },{1*CLK, sacl },{1*CLK, sacl },{1*CLK, sacl },{1*CLK, sacl },{1*CLK, sacl },{1*CLK, sacl },
|
||||||
@ -1699,9 +1708,9 @@ static const tms32025_opcode_Dx opcode_Dx_subset[8]= /* Instructions living unde
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static CPU_INIT( tms32025 )
|
static CPU_INIT( tms32025 )
|
||||||
{
|
{
|
||||||
tms32025_state *cpustate = device->token;
|
tms32025_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->intRAM = auto_malloc(0x800*2);
|
cpustate->intRAM = (UINT16 *)auto_malloc(0x800*2);
|
||||||
cpustate->irq_callback = irqcallback;
|
cpustate->irq_callback = irqcallback;
|
||||||
cpustate->device = device;
|
cpustate->device = device;
|
||||||
cpustate->program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
|
cpustate->program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
|
||||||
@ -1754,7 +1763,7 @@ static CPU_INIT( tms32025 )
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static CPU_RESET( tms32025 )
|
static CPU_RESET( tms32025 )
|
||||||
{
|
{
|
||||||
tms32025_state *cpustate = device->token;
|
tms32025_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
SET_PC(0); /* Starting address on a reset */
|
SET_PC(0); /* Starting address on a reset */
|
||||||
cpustate->STR0 |= 0x0600; /* INTM and unused bit set to 1 */
|
cpustate->STR0 |= 0x0600; /* INTM and unused bit set to 1 */
|
||||||
@ -1790,7 +1799,7 @@ static CPU_RESET( tms32025 )
|
|||||||
#if (HAS_TMS32026)
|
#if (HAS_TMS32026)
|
||||||
static CPU_RESET( tms32026 )
|
static CPU_RESET( tms32026 )
|
||||||
{
|
{
|
||||||
tms32025_state *cpustate = device->token;
|
tms32025_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
CPU_RESET_CALL(tms32025);
|
CPU_RESET_CALL(tms32025);
|
||||||
|
|
||||||
@ -1941,7 +1950,7 @@ again:
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static CPU_EXECUTE( tms32025 )
|
static CPU_EXECUTE( tms32025 )
|
||||||
{
|
{
|
||||||
tms32025_state *cpustate = device->token;
|
tms32025_state *cpustate = get_safe_token(device);
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
|
|
||||||
@ -2097,7 +2106,7 @@ static void set_irq_line(tms32025_state *cpustate, int irqline, int state)
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static CPU_READOP( tms32025 )
|
static CPU_READOP( tms32025 )
|
||||||
{
|
{
|
||||||
tms32025_state *cpustate = device->token;
|
tms32025_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
void *ptr;
|
void *ptr;
|
||||||
|
|
||||||
@ -2122,7 +2131,7 @@ static CPU_READOP( tms32025 )
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static CPU_READ( tms32025 )
|
static CPU_READ( tms32025 )
|
||||||
{
|
{
|
||||||
tms32025_state *cpustate = device->token;
|
tms32025_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
void *ptr = NULL;
|
void *ptr = NULL;
|
||||||
UINT64 temp = 0;
|
UINT64 temp = 0;
|
||||||
@ -2175,7 +2184,7 @@ static CPU_READ( tms32025 )
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static CPU_WRITE( tms32025 )
|
static CPU_WRITE( tms32025 )
|
||||||
{
|
{
|
||||||
tms32025_state *cpustate = device->token;
|
tms32025_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
void *ptr = NULL;
|
void *ptr = NULL;
|
||||||
|
|
||||||
@ -2224,7 +2233,7 @@ static CPU_WRITE( tms32025 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( tms32025 )
|
static CPU_SET_INFO( tms32025 )
|
||||||
{
|
{
|
||||||
tms32025_state *cpustate = device->token;
|
tms32025_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -2280,7 +2289,7 @@ static CPU_SET_INFO( tms32025 )
|
|||||||
|
|
||||||
CPU_GET_INFO( tms32025 )
|
CPU_GET_INFO( tms32025 )
|
||||||
{
|
{
|
||||||
tms32025_state *cpustate = (device != NULL) ? device->token : NULL;
|
tms32025_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
@ -67,7 +67,7 @@
|
|||||||
FORWARD DECLARATIONS
|
FORWARD DECLARATIONS
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
void (*const tms32031ops[])(tms32031_state *tms, UINT32 op);
|
extern void (*const tms32031ops[])(tms32031_state *tms, UINT32 op);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -122,6 +122,15 @@ struct _tms32031_state
|
|||||||
const address_space *program;
|
const address_space *program;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE tms32031_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_TMS32031);
|
||||||
|
return (tms32031_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
@ -358,8 +367,8 @@ static void set_irq_line(tms32031_state *tms, int irqline, int state)
|
|||||||
|
|
||||||
static CPU_INIT( tms32031 )
|
static CPU_INIT( tms32031 )
|
||||||
{
|
{
|
||||||
const tms32031_config *configdata = device->static_config;
|
const tms32031_config *configdata = (const tms32031_config *)device->static_config;
|
||||||
tms32031_state *tms = device->token;
|
tms32031_state *tms = get_safe_token(device);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
tms->irq_callback = irqcallback;
|
tms->irq_callback = irqcallback;
|
||||||
@ -388,7 +397,7 @@ static CPU_INIT( tms32031 )
|
|||||||
|
|
||||||
static CPU_RESET( tms32031 )
|
static CPU_RESET( tms32031 )
|
||||||
{
|
{
|
||||||
tms32031_state *tms = device->token;
|
tms32031_state *tms = get_safe_token(device);
|
||||||
|
|
||||||
/* if we have a config struct, get the boot ROM address */
|
/* if we have a config struct, get the boot ROM address */
|
||||||
if (tms->bootoffset)
|
if (tms->bootoffset)
|
||||||
@ -416,7 +425,7 @@ static CPU_RESET( tms32031 )
|
|||||||
|
|
||||||
static CPU_RESET( tms32032 )
|
static CPU_RESET( tms32032 )
|
||||||
{
|
{
|
||||||
tms32031_state *tms = device->token;
|
tms32031_state *tms = get_safe_token(device);
|
||||||
CPU_RESET_CALL(tms32031);
|
CPU_RESET_CALL(tms32031);
|
||||||
tms->is_32032 = TRUE;
|
tms->is_32032 = TRUE;
|
||||||
}
|
}
|
||||||
@ -452,7 +461,7 @@ static CPU_EXIT( tms32031 )
|
|||||||
|
|
||||||
static CPU_EXECUTE( tms32031 )
|
static CPU_EXECUTE( tms32031 )
|
||||||
{
|
{
|
||||||
tms32031_state *tms = device->token;
|
tms32031_state *tms = get_safe_token(device);
|
||||||
|
|
||||||
/* check IRQs up front */
|
/* check IRQs up front */
|
||||||
tms->icount = cycles;
|
tms->icount = cycles;
|
||||||
@ -612,7 +621,7 @@ static UINT32 boot_loader(tms32031_state *tms, UINT32 boot_rom_addr)
|
|||||||
|
|
||||||
static CPU_SET_INFO( tms32031 )
|
static CPU_SET_INFO( tms32031 )
|
||||||
{
|
{
|
||||||
tms32031_state *tms = device->token;
|
tms32031_state *tms = get_safe_token(device);
|
||||||
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 --- */
|
||||||
@ -691,7 +700,7 @@ ADDRESS_MAP_END
|
|||||||
|
|
||||||
CPU_GET_INFO( tms32031 )
|
CPU_GET_INFO( tms32031 )
|
||||||
{
|
{
|
||||||
tms32031_state *tms = (device != NULL) ? device->token : NULL;
|
tms32031_state *tms = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
float ftemp;
|
float ftemp;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
|
@ -149,6 +149,15 @@ struct _tms32051_state
|
|||||||
int icount;
|
int icount;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE tms32051_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_TMS32051);
|
||||||
|
return (tms32051_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
static void delay_slot(tms32051_state *cpustate, UINT16 startpc);
|
static void delay_slot(tms32051_state *cpustate, UINT16 startpc);
|
||||||
static void save_interrupt_context(tms32051_state *cpustate);
|
static void save_interrupt_context(tms32051_state *cpustate);
|
||||||
static void restore_interrupt_context(tms32051_state *cpustate);
|
static void restore_interrupt_context(tms32051_state *cpustate);
|
||||||
@ -213,7 +222,7 @@ static void delay_slot(tms32051_state *cpustate, UINT16 startpc)
|
|||||||
|
|
||||||
static CPU_INIT( tms )
|
static CPU_INIT( tms )
|
||||||
{
|
{
|
||||||
tms32051_state *cpustate = device->token;
|
tms32051_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->device = device;
|
cpustate->device = device;
|
||||||
cpustate->program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
|
cpustate->program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
|
||||||
@ -222,7 +231,7 @@ static CPU_INIT( tms )
|
|||||||
|
|
||||||
static CPU_RESET( tms )
|
static CPU_RESET( tms )
|
||||||
{
|
{
|
||||||
tms32051_state *cpustate = device->token;
|
tms32051_state *cpustate = get_safe_token(device);
|
||||||
int i;
|
int i;
|
||||||
UINT16 src, dst, length;
|
UINT16 src, dst, length;
|
||||||
|
|
||||||
@ -328,7 +337,7 @@ static CPU_EXIT( tms )
|
|||||||
|
|
||||||
static CPU_EXECUTE( tms )
|
static CPU_EXECUTE( tms )
|
||||||
{
|
{
|
||||||
tms32051_state *cpustate = device->token;
|
tms32051_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
@ -396,7 +405,7 @@ static CPU_EXECUTE( tms )
|
|||||||
|
|
||||||
static READ16_HANDLER( cpuregs_r )
|
static READ16_HANDLER( cpuregs_r )
|
||||||
{
|
{
|
||||||
tms32051_state *cpustate = space->cpu->token;
|
tms32051_state *cpustate = get_safe_token(space->cpu);
|
||||||
|
|
||||||
switch (offset)
|
switch (offset)
|
||||||
{
|
{
|
||||||
@ -448,7 +457,7 @@ static READ16_HANDLER( cpuregs_r )
|
|||||||
|
|
||||||
static WRITE16_HANDLER( cpuregs_w )
|
static WRITE16_HANDLER( cpuregs_w )
|
||||||
{
|
{
|
||||||
tms32051_state *cpustate = space->cpu->token;
|
tms32051_state *cpustate = get_safe_token(space->cpu);
|
||||||
|
|
||||||
switch (offset)
|
switch (offset)
|
||||||
{
|
{
|
||||||
@ -542,7 +551,7 @@ ADDRESS_MAP_END
|
|||||||
|
|
||||||
static CPU_SET_INFO( tms )
|
static CPU_SET_INFO( tms )
|
||||||
{
|
{
|
||||||
tms32051_state *cpustate = device->token;
|
tms32051_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -553,7 +562,7 @@ static CPU_SET_INFO( tms )
|
|||||||
|
|
||||||
static CPU_READ( tms )
|
static CPU_READ( tms )
|
||||||
{
|
{
|
||||||
tms32051_state *cpustate = device->token;
|
tms32051_state *cpustate = get_safe_token(device);
|
||||||
if (space == ADDRESS_SPACE_PROGRAM)
|
if (space == ADDRESS_SPACE_PROGRAM)
|
||||||
{
|
{
|
||||||
*value = (PM_READ16(cpustate, offset>>1) >> ((offset & 1) ? 0 : 8)) & 0xff;
|
*value = (PM_READ16(cpustate, offset>>1) >> ((offset & 1) ? 0 : 8)) & 0xff;
|
||||||
@ -567,7 +576,7 @@ static CPU_READ( tms )
|
|||||||
|
|
||||||
static CPU_GET_INFO( tms )
|
static CPU_GET_INFO( tms )
|
||||||
{
|
{
|
||||||
tms32051_state *cpustate = (device != NULL) ? device->token : NULL;
|
tms32051_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch(state)
|
switch(state)
|
||||||
{
|
{
|
||||||
@ -673,7 +682,7 @@ static CPU_GET_INFO( tms )
|
|||||||
#if (HAS_TMS32051)
|
#if (HAS_TMS32051)
|
||||||
static CPU_SET_INFO( tms32051 )
|
static CPU_SET_INFO( tms32051 )
|
||||||
{
|
{
|
||||||
tms32051_state *cpustate = device->token;
|
tms32051_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
if (state >= CPUINFO_INT_INPUT_STATE && state <= CPUINFO_INT_INPUT_STATE + 5)
|
if (state >= CPUINFO_INT_INPUT_STATE && state <= CPUINFO_INT_INPUT_STATE + 5)
|
||||||
{
|
{
|
||||||
|
@ -203,7 +203,7 @@ static int compute_pixblt_b_cycles(int left_partials, int right_partials, int fu
|
|||||||
/* Shift register handling */
|
/* Shift register handling */
|
||||||
static void shiftreg_w(const address_space *space, offs_t offset,UINT16 data)
|
static void shiftreg_w(const address_space *space, offs_t offset,UINT16 data)
|
||||||
{
|
{
|
||||||
tms34010_state *tms = space->cpu->token;
|
tms34010_state *tms = get_safe_token(space->cpu);
|
||||||
if (tms->config->from_shiftreg)
|
if (tms->config->from_shiftreg)
|
||||||
(*tms->config->from_shiftreg)(space, (UINT32)(offset << 3) & ~15, &tms->shiftreg[0]);
|
(*tms->config->from_shiftreg)(space, (UINT32)(offset << 3) & ~15, &tms->shiftreg[0]);
|
||||||
else
|
else
|
||||||
@ -212,7 +212,7 @@ static void shiftreg_w(const address_space *space, offs_t offset,UINT16 data)
|
|||||||
|
|
||||||
static UINT16 shiftreg_r(const address_space *space, offs_t offset)
|
static UINT16 shiftreg_r(const address_space *space, offs_t offset)
|
||||||
{
|
{
|
||||||
tms34010_state *tms = space->cpu->token;
|
tms34010_state *tms = get_safe_token(space->cpu);
|
||||||
if (tms->config->to_shiftreg)
|
if (tms->config->to_shiftreg)
|
||||||
(*tms->config->to_shiftreg)(space, (UINT32)(offset << 3) & ~15, &tms->shiftreg[0]);
|
(*tms->config->to_shiftreg)(space, (UINT32)(offset << 3) & ~15, &tms->shiftreg[0]);
|
||||||
else
|
else
|
||||||
@ -222,7 +222,7 @@ static UINT16 shiftreg_r(const address_space *space, offs_t offset)
|
|||||||
|
|
||||||
static UINT16 dummy_shiftreg_r(const address_space *space, offs_t offset)
|
static UINT16 dummy_shiftreg_r(const address_space *space, offs_t offset)
|
||||||
{
|
{
|
||||||
tms34010_state *tms = space->cpu->token;
|
tms34010_state *tms = get_safe_token(space->cpu);
|
||||||
return tms->shiftreg[0];
|
return tms->shiftreg[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,6 +82,16 @@ struct _tms34010_state
|
|||||||
cpu_state_table state;
|
cpu_state_table state;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE tms34010_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_TMS34010 ||
|
||||||
|
cpu_get_type(device) == CPU_TMS34020);
|
||||||
|
return (tms34010_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
#include "34010ops.h"
|
#include "34010ops.h"
|
||||||
|
|
||||||
|
|
||||||
@ -673,8 +683,8 @@ static void check_interrupt(tms34010_state *tms)
|
|||||||
|
|
||||||
static CPU_INIT( tms34010 )
|
static CPU_INIT( tms34010 )
|
||||||
{
|
{
|
||||||
const tms34010_config *configdata = device->static_config ? device->static_config : &default_config;
|
const tms34010_config *configdata = device->static_config ? (const tms34010_config *)device->static_config : &default_config;
|
||||||
tms34010_state *tms = device->token;
|
tms34010_state *tms = get_safe_token(device);
|
||||||
|
|
||||||
tms->external_host_access = FALSE;
|
tms->external_host_access = FALSE;
|
||||||
|
|
||||||
@ -694,7 +704,7 @@ static CPU_INIT( tms34010 )
|
|||||||
timer_adjust_oneshot(tms->scantimer, attotime_zero, 0);
|
timer_adjust_oneshot(tms->scantimer, attotime_zero, 0);
|
||||||
|
|
||||||
/* allocate the shiftreg */
|
/* allocate the shiftreg */
|
||||||
tms->shiftreg = auto_malloc(SHIFTREG_SIZE);
|
tms->shiftreg = (UINT16 *)auto_malloc(SHIFTREG_SIZE);
|
||||||
|
|
||||||
state_save_register_device_item(device, 0, tms->pc);
|
state_save_register_device_item(device, 0, tms->pc);
|
||||||
state_save_register_device_item(device, 0, tms->st);
|
state_save_register_device_item(device, 0, tms->st);
|
||||||
@ -713,7 +723,7 @@ static CPU_INIT( tms34010 )
|
|||||||
static CPU_RESET( tms34010 )
|
static CPU_RESET( tms34010 )
|
||||||
{
|
{
|
||||||
/* zap the state and copy in the config pointer */
|
/* zap the state and copy in the config pointer */
|
||||||
tms34010_state *tms = device->token;
|
tms34010_state *tms = get_safe_token(device);
|
||||||
const tms34010_config *config = tms->config;
|
const tms34010_config *config = tms->config;
|
||||||
const device_config *screen = tms->screen;
|
const device_config *screen = tms->screen;
|
||||||
UINT16 *shiftreg = tms->shiftreg;
|
UINT16 *shiftreg = tms->shiftreg;
|
||||||
@ -746,7 +756,7 @@ static CPU_RESET( tms34010 )
|
|||||||
|
|
||||||
static CPU_RESET( tms34020 )
|
static CPU_RESET( tms34020 )
|
||||||
{
|
{
|
||||||
tms34010_state *tms = device->token;
|
tms34010_state *tms = get_safe_token(device);
|
||||||
CPU_RESET_CALL(tms34010);
|
CPU_RESET_CALL(tms34010);
|
||||||
tms->is_34020 = 1;
|
tms->is_34020 = 1;
|
||||||
}
|
}
|
||||||
@ -759,7 +769,7 @@ static CPU_RESET( tms34020 )
|
|||||||
|
|
||||||
static CPU_EXIT( tms34010 )
|
static CPU_EXIT( tms34010 )
|
||||||
{
|
{
|
||||||
tms34010_state *tms = device->token;
|
tms34010_state *tms = get_safe_token(device);
|
||||||
tms->shiftreg = NULL;
|
tms->shiftreg = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -800,7 +810,7 @@ static void set_irq_line(tms34010_state *tms, int irqline, int linestate)
|
|||||||
|
|
||||||
static TIMER_CALLBACK( internal_interrupt_callback )
|
static TIMER_CALLBACK( internal_interrupt_callback )
|
||||||
{
|
{
|
||||||
tms34010_state *tms = ptr;
|
tms34010_state *tms = (tms34010_state *)ptr;
|
||||||
int type = param;
|
int type = param;
|
||||||
|
|
||||||
/* call through to the CPU to generate the int */
|
/* call through to the CPU to generate the int */
|
||||||
@ -819,7 +829,7 @@ static TIMER_CALLBACK( internal_interrupt_callback )
|
|||||||
|
|
||||||
static CPU_EXECUTE( tms34010 )
|
static CPU_EXECUTE( tms34010 )
|
||||||
{
|
{
|
||||||
tms34010_state *tms = device->token;
|
tms34010_state *tms = get_safe_token(device);
|
||||||
|
|
||||||
/* Get out if CPU is halted. Absolutely no interrupts must be taken!!! */
|
/* Get out if CPU is halted. Absolutely no interrupts must be taken!!! */
|
||||||
if (IOREG(tms, REG_HSTCTLH) & 0x8000)
|
if (IOREG(tms, REG_HSTCTLH) & 0x8000)
|
||||||
@ -948,7 +958,7 @@ static void set_raster_op(tms34010_state *tms)
|
|||||||
|
|
||||||
static TIMER_CALLBACK( scanline_callback )
|
static TIMER_CALLBACK( scanline_callback )
|
||||||
{
|
{
|
||||||
tms34010_state *tms = ptr;
|
tms34010_state *tms = (tms34010_state *)ptr;
|
||||||
const rectangle *current_visarea;
|
const rectangle *current_visarea;
|
||||||
int vsblnk, veblnk, vtotal;
|
int vsblnk, veblnk, vtotal;
|
||||||
int vcount = param;
|
int vcount = param;
|
||||||
@ -1088,7 +1098,7 @@ static TIMER_CALLBACK( scanline_callback )
|
|||||||
|
|
||||||
void tms34010_get_display_params(const device_config *cpu, tms34010_display_params *params)
|
void tms34010_get_display_params(const device_config *cpu, tms34010_display_params *params)
|
||||||
{
|
{
|
||||||
tms34010_state *tms = cpu->token;
|
tms34010_state *tms = get_safe_token(cpu);
|
||||||
|
|
||||||
params->enabled = ((SMART_IOREG(tms, DPYCTL) & 0x8000) != 0);
|
params->enabled = ((SMART_IOREG(tms, DPYCTL) & 0x8000) != 0);
|
||||||
params->vcount = SMART_IOREG(tms, VCOUNT);
|
params->vcount = SMART_IOREG(tms, VCOUNT);
|
||||||
@ -1134,7 +1144,7 @@ VIDEO_UPDATE( tms340x0 )
|
|||||||
cpu_type type = cpu_get_type(cpu);
|
cpu_type type = cpu_get_type(cpu);
|
||||||
if (type == CPU_TMS34010 || type == CPU_TMS34020)
|
if (type == CPU_TMS34010 || type == CPU_TMS34020)
|
||||||
{
|
{
|
||||||
tms = cpu->token;
|
tms = get_safe_token(cpu);
|
||||||
if (tms->config != NULL && tms->config->scanline_callback != NULL && tms->screen == screen)
|
if (tms->config != NULL && tms->config->scanline_callback != NULL && tms->screen == screen)
|
||||||
break;
|
break;
|
||||||
tms = NULL;
|
tms = NULL;
|
||||||
@ -1198,7 +1208,7 @@ static const char *const ioreg_name[] =
|
|||||||
|
|
||||||
WRITE16_HANDLER( tms34010_io_register_w )
|
WRITE16_HANDLER( tms34010_io_register_w )
|
||||||
{
|
{
|
||||||
tms34010_state *tms = space->cpu->token;
|
tms34010_state *tms = get_safe_token(space->cpu);
|
||||||
int oldreg, newreg;
|
int oldreg, newreg;
|
||||||
|
|
||||||
/* Set register */
|
/* Set register */
|
||||||
@ -1341,7 +1351,7 @@ static const char *const ioreg020_name[] =
|
|||||||
|
|
||||||
WRITE16_HANDLER( tms34020_io_register_w )
|
WRITE16_HANDLER( tms34020_io_register_w )
|
||||||
{
|
{
|
||||||
tms34010_state *tms = space->cpu->token;
|
tms34010_state *tms = get_safe_token(space->cpu);
|
||||||
int oldreg, newreg;
|
int oldreg, newreg;
|
||||||
|
|
||||||
/* Set register */
|
/* Set register */
|
||||||
@ -1504,7 +1514,7 @@ WRITE16_HANDLER( tms34020_io_register_w )
|
|||||||
|
|
||||||
READ16_HANDLER( tms34010_io_register_r )
|
READ16_HANDLER( tms34010_io_register_r )
|
||||||
{
|
{
|
||||||
tms34010_state *tms = space->cpu->token;
|
tms34010_state *tms = get_safe_token(space->cpu);
|
||||||
int result, total;
|
int result, total;
|
||||||
|
|
||||||
// if (LOG_CONTROL_REGS)
|
// if (LOG_CONTROL_REGS)
|
||||||
@ -1547,7 +1557,7 @@ READ16_HANDLER( tms34010_io_register_r )
|
|||||||
|
|
||||||
READ16_HANDLER( tms34020_io_register_r )
|
READ16_HANDLER( tms34020_io_register_r )
|
||||||
{
|
{
|
||||||
tms34010_state *tms = space->cpu->token;
|
tms34010_state *tms = get_safe_token(space->cpu);
|
||||||
int result, total;
|
int result, total;
|
||||||
|
|
||||||
// if (LOG_CONTROL_REGS)
|
// if (LOG_CONTROL_REGS)
|
||||||
@ -1589,7 +1599,7 @@ READ16_HANDLER( tms34020_io_register_r )
|
|||||||
|
|
||||||
static STATE_POSTLOAD( tms34010_state_postload )
|
static STATE_POSTLOAD( tms34010_state_postload )
|
||||||
{
|
{
|
||||||
tms34010_state *tms = param;
|
tms34010_state *tms = (tms34010_state *)param;
|
||||||
set_raster_op(tms);
|
set_raster_op(tms);
|
||||||
set_pixel_function(tms);
|
set_pixel_function(tms);
|
||||||
}
|
}
|
||||||
@ -1602,7 +1612,7 @@ static STATE_POSTLOAD( tms34010_state_postload )
|
|||||||
void tms34010_host_w(const device_config *cpu, int reg, int data)
|
void tms34010_host_w(const device_config *cpu, int reg, int data)
|
||||||
{
|
{
|
||||||
const address_space *space;
|
const address_space *space;
|
||||||
tms34010_state *tms = cpu->token;
|
tms34010_state *tms = get_safe_token(cpu);
|
||||||
unsigned int addr;
|
unsigned int addr;
|
||||||
|
|
||||||
switch (reg)
|
switch (reg)
|
||||||
@ -1657,7 +1667,7 @@ void tms34010_host_w(const device_config *cpu, int reg, int data)
|
|||||||
|
|
||||||
int tms34010_host_r(const device_config *cpu, int reg)
|
int tms34010_host_r(const device_config *cpu, int reg)
|
||||||
{
|
{
|
||||||
tms34010_state *tms = cpu->token;
|
tms34010_state *tms = get_safe_token(cpu);
|
||||||
unsigned int addr;
|
unsigned int addr;
|
||||||
int result = 0;
|
int result = 0;
|
||||||
|
|
||||||
@ -1714,7 +1724,7 @@ int tms34010_host_r(const device_config *cpu, int reg)
|
|||||||
|
|
||||||
static CPU_SET_INFO( tms34010 )
|
static CPU_SET_INFO( tms34010 )
|
||||||
{
|
{
|
||||||
tms34010_state *tms = device->token;
|
tms34010_state *tms = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -1732,7 +1742,7 @@ static CPU_SET_INFO( tms34010 )
|
|||||||
|
|
||||||
CPU_GET_INFO( tms34010 )
|
CPU_GET_INFO( tms34010 )
|
||||||
{
|
{
|
||||||
tms34010_state *tms = (device != NULL) ? device->token : NULL;
|
tms34010_state *tms = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
@ -106,6 +106,15 @@ typedef struct {
|
|||||||
int unsupported_inst_warning;
|
int unsupported_inst_warning;
|
||||||
} tms57002_t;
|
} tms57002_t;
|
||||||
|
|
||||||
|
INLINE tms57002_t *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_TMS57002);
|
||||||
|
return (tms57002_t *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
static void tms57002_cache_flush(tms57002_t *s);
|
static void tms57002_cache_flush(tms57002_t *s);
|
||||||
|
|
||||||
static const char *tms57002_get_memadr(UINT32 opcode, char type)
|
static const char *tms57002_get_memadr(UINT32 opcode, char type)
|
||||||
@ -191,7 +200,7 @@ static CPU_DISASSEMBLE(tms57002)
|
|||||||
|
|
||||||
WRITE8_DEVICE_HANDLER(tms57002_pload_w)
|
WRITE8_DEVICE_HANDLER(tms57002_pload_w)
|
||||||
{
|
{
|
||||||
tms57002_t *s = device->token;
|
tms57002_t *s = get_safe_token(device);
|
||||||
UINT8 olds = s->sti;
|
UINT8 olds = s->sti;
|
||||||
|
|
||||||
if(data)
|
if(data)
|
||||||
@ -205,7 +214,7 @@ WRITE8_DEVICE_HANDLER(tms57002_pload_w)
|
|||||||
|
|
||||||
WRITE8_DEVICE_HANDLER(tms57002_cload_w)
|
WRITE8_DEVICE_HANDLER(tms57002_cload_w)
|
||||||
{
|
{
|
||||||
tms57002_t *s = device->token;
|
tms57002_t *s = get_safe_token(device);
|
||||||
UINT8 olds = s->sti;
|
UINT8 olds = s->sti;
|
||||||
if(data)
|
if(data)
|
||||||
s->sti &= ~IN_CLOAD;
|
s->sti &= ~IN_CLOAD;
|
||||||
@ -217,7 +226,7 @@ WRITE8_DEVICE_HANDLER(tms57002_cload_w)
|
|||||||
|
|
||||||
static CPU_RESET(tms57002)
|
static CPU_RESET(tms57002)
|
||||||
{
|
{
|
||||||
tms57002_t *s = device->token;
|
tms57002_t *s = get_safe_token(device);
|
||||||
|
|
||||||
s->sti = (s->sti & ~(SU_MASK|S_READ|S_WRITE|S_BRANCH|S_HOST)) | (SU_ST0|S_IDLE);
|
s->sti = (s->sti & ~(SU_MASK|S_READ|S_WRITE|S_BRANCH|S_HOST)) | (SU_ST0|S_IDLE);
|
||||||
s->pc = 0;
|
s->pc = 0;
|
||||||
@ -240,7 +249,7 @@ static CPU_RESET(tms57002)
|
|||||||
|
|
||||||
WRITE8_DEVICE_HANDLER(tms57002_data_w)
|
WRITE8_DEVICE_HANDLER(tms57002_data_w)
|
||||||
{
|
{
|
||||||
tms57002_t *s = device->token;
|
tms57002_t *s = get_safe_token(device);
|
||||||
|
|
||||||
switch(s->sti & (IN_PLOAD|IN_CLOAD)) {
|
switch(s->sti & (IN_PLOAD|IN_CLOAD)) {
|
||||||
case 0:
|
case 0:
|
||||||
@ -297,7 +306,7 @@ WRITE8_DEVICE_HANDLER(tms57002_data_w)
|
|||||||
|
|
||||||
READ8_DEVICE_HANDLER(tms57002_data_r)
|
READ8_DEVICE_HANDLER(tms57002_data_r)
|
||||||
{
|
{
|
||||||
tms57002_t *s = device->token;
|
tms57002_t *s = get_safe_token(device);
|
||||||
UINT8 res;
|
UINT8 res;
|
||||||
if(!(s->sti & S_HOST))
|
if(!(s->sti & S_HOST))
|
||||||
return 0xff;
|
return 0xff;
|
||||||
@ -319,13 +328,13 @@ READ8_DEVICE_HANDLER(tms57002_empty_r)
|
|||||||
|
|
||||||
READ8_DEVICE_HANDLER(tms57002_dready_r)
|
READ8_DEVICE_HANDLER(tms57002_dready_r)
|
||||||
{
|
{
|
||||||
tms57002_t *s = device->token;
|
tms57002_t *s = get_safe_token(device);
|
||||||
return s->sti & S_HOST ? 0 : 1;
|
return s->sti & S_HOST ? 0 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tms57002_sync(const device_config *device)
|
void tms57002_sync(const device_config *device)
|
||||||
{
|
{
|
||||||
tms57002_t *s = device->token;
|
tms57002_t *s = get_safe_token(device);
|
||||||
|
|
||||||
if(s->sti & (IN_PLOAD | IN_CLOAD))
|
if(s->sti & (IN_PLOAD | IN_CLOAD))
|
||||||
return;
|
return;
|
||||||
@ -1345,7 +1354,7 @@ static int tms57002_decode_get_pc(tms57002_t *s)
|
|||||||
|
|
||||||
static CPU_EXECUTE(tms57002)
|
static CPU_EXECUTE(tms57002)
|
||||||
{
|
{
|
||||||
tms57002_t *s = device->token;
|
tms57002_t *s = get_safe_token(device);
|
||||||
int initial_cycles = cycles;
|
int initial_cycles = cycles;
|
||||||
int ipc = -1;
|
int ipc = -1;
|
||||||
|
|
||||||
@ -1409,7 +1418,7 @@ static CPU_EXECUTE(tms57002)
|
|||||||
|
|
||||||
static CPU_INIT(tms57002)
|
static CPU_INIT(tms57002)
|
||||||
{
|
{
|
||||||
tms57002_t *s = device->token;
|
tms57002_t *s = get_safe_token(device);
|
||||||
tms57002_cache_flush(s);
|
tms57002_cache_flush(s);
|
||||||
s->sti = S_IDLE;
|
s->sti = S_IDLE;
|
||||||
s->program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
|
s->program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
|
||||||
@ -1427,7 +1436,7 @@ ADDRESS_MAP_END
|
|||||||
|
|
||||||
CPU_GET_INFO(tms57002)
|
CPU_GET_INFO(tms57002)
|
||||||
{
|
{
|
||||||
tms57002_t *s = (device != NULL) ? device->token : NULL;
|
tms57002_t *s = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch(state) {
|
switch(state) {
|
||||||
case CPUINFO_INT_CONTEXT_SIZE: info->i = sizeof(tms57002_t); break;
|
case CPUINFO_INT_CONTEXT_SIZE: info->i = sizeof(tms57002_t); break;
|
||||||
|
@ -928,7 +928,7 @@ static void clear(void)
|
|||||||
clear_cat(cat3, 0x80);
|
clear_cat(cat3, 0x80);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
if(argc != 3) {
|
if(argc != 3) {
|
||||||
fprintf(stderr, "Usage:\n%s tmsinstr.lst tms57002.inc\n", argv[0]);
|
fprintf(stderr, "Usage:\n%s tmsinstr.lst tms57002.inc\n", argv[0]);
|
||||||
|
@ -86,6 +86,16 @@ struct _tms7000_state
|
|||||||
UINT8 idle_state; /* Set after the execution of an idle instruction */
|
UINT8 idle_state; /* Set after the execution of an idle instruction */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE tms7000_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_TMS7000 ||
|
||||||
|
cpu_get_type(device) == CPU_TMS7000_EXL);
|
||||||
|
return (tms7000_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
#define pPC cpustate->pc.w.l
|
#define pPC cpustate->pc.w.l
|
||||||
#define PC cpustate->pc
|
#define PC cpustate->pc
|
||||||
#define pSP cpustate->sp
|
#define pSP cpustate->sp
|
||||||
@ -153,7 +163,7 @@ INLINE void WRF16( tms7000_state *cpustate, UINT32 mAddr, PAIR p ) /*Write regis
|
|||||||
|
|
||||||
static CPU_INIT( tms7000 )
|
static CPU_INIT( tms7000 )
|
||||||
{
|
{
|
||||||
tms7000_state *cpustate = device->token;
|
tms7000_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->irq_callback = irqcallback;
|
cpustate->irq_callback = irqcallback;
|
||||||
cpustate->device = device;
|
cpustate->device = device;
|
||||||
@ -185,7 +195,7 @@ static CPU_INIT( tms7000 )
|
|||||||
|
|
||||||
static CPU_RESET( tms7000 )
|
static CPU_RESET( tms7000 )
|
||||||
{
|
{
|
||||||
tms7000_state *cpustate = device->token;
|
tms7000_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
// cpustate->architecture = (int)param;
|
// cpustate->architecture = (int)param;
|
||||||
|
|
||||||
@ -229,7 +239,7 @@ static CPU_RESET( tms7000 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( tms7000 )
|
static CPU_SET_INFO( tms7000 )
|
||||||
{
|
{
|
||||||
tms7000_state *cpustate = device->token;
|
tms7000_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -256,7 +266,7 @@ static CPU_SET_INFO( tms7000 )
|
|||||||
|
|
||||||
CPU_GET_INFO( tms7000 )
|
CPU_GET_INFO( tms7000 )
|
||||||
{
|
{
|
||||||
tms7000_state *cpustate = (device != NULL) ? device->token : NULL;
|
tms7000_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch( state )
|
switch( state )
|
||||||
{
|
{
|
||||||
@ -434,7 +444,7 @@ static void tms7000_do_interrupt( tms7000_state *cpustate, UINT16 address, UINT8
|
|||||||
|
|
||||||
static CPU_EXECUTE( tms7000 )
|
static CPU_EXECUTE( tms7000 )
|
||||||
{
|
{
|
||||||
tms7000_state *cpustate = device->token;
|
tms7000_state *cpustate = get_safe_token(device);
|
||||||
int op;
|
int op;
|
||||||
|
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
@ -476,7 +486,7 @@ static CPU_EXECUTE( tms7000 )
|
|||||||
|
|
||||||
static CPU_EXECUTE( tms7000_exl )
|
static CPU_EXECUTE( tms7000_exl )
|
||||||
{
|
{
|
||||||
tms7000_state *cpustate = device->token;
|
tms7000_state *cpustate = get_safe_token(device);
|
||||||
int op;
|
int op;
|
||||||
|
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
@ -522,7 +532,7 @@ static CPU_EXECUTE( tms7000_exl )
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
void tms7000_A6EC1( const device_config *device )
|
void tms7000_A6EC1( const device_config *device )
|
||||||
{
|
{
|
||||||
tms7000_state *cpustate = device->token;
|
tms7000_state *cpustate = get_safe_token(device);
|
||||||
if( (cpustate->pf[0x03] & 0x80) == 0x80 ) /* Is timer system active? */
|
if( (cpustate->pf[0x03] & 0x80) == 0x80 ) /* Is timer system active? */
|
||||||
{
|
{
|
||||||
if( (cpustate->pf[0x03] & 0x40) == 0x40) /* Is event counter the timer source? */
|
if( (cpustate->pf[0x03] & 0x40) == 0x40) /* Is event counter the timer source? */
|
||||||
@ -532,7 +542,7 @@ void tms7000_A6EC1( const device_config *device )
|
|||||||
|
|
||||||
static void tms7000_service_timer1( const device_config *device )
|
static void tms7000_service_timer1( const device_config *device )
|
||||||
{
|
{
|
||||||
tms7000_state *cpustate = device->token;
|
tms7000_state *cpustate = get_safe_token(device);
|
||||||
if( --cpustate->t1_prescaler < 0 ) /* Decrement prescaler and check for underflow */
|
if( --cpustate->t1_prescaler < 0 ) /* Decrement prescaler and check for underflow */
|
||||||
{
|
{
|
||||||
cpustate->t1_prescaler = cpustate->pf[3] & 0x1f; /* Reload prescaler (5 bit) */
|
cpustate->t1_prescaler = cpustate->pf[3] & 0x1f; /* Reload prescaler (5 bit) */
|
||||||
@ -552,7 +562,7 @@ static void tms7000_service_timer1( const device_config *device )
|
|||||||
|
|
||||||
static WRITE8_HANDLER( tms70x0_pf_w ) /* Perpherial file write */
|
static WRITE8_HANDLER( tms70x0_pf_w ) /* Perpherial file write */
|
||||||
{
|
{
|
||||||
tms7000_state *cpustate = space->cpu->token;
|
tms7000_state *cpustate = get_safe_token(space->cpu);
|
||||||
UINT8 temp1, temp2, temp3;
|
UINT8 temp1, temp2, temp3;
|
||||||
|
|
||||||
switch( offset )
|
switch( offset )
|
||||||
@ -621,7 +631,7 @@ static WRITE8_HANDLER( tms70x0_pf_w ) /* Perpherial file write */
|
|||||||
|
|
||||||
static READ8_HANDLER( tms70x0_pf_r ) /* Perpherial file read */
|
static READ8_HANDLER( tms70x0_pf_r ) /* Perpherial file read */
|
||||||
{
|
{
|
||||||
tms7000_state *cpustate = space->cpu->token;
|
tms7000_state *cpustate = get_safe_token(space->cpu);
|
||||||
UINT8 result;
|
UINT8 result;
|
||||||
UINT8 temp1, temp2, temp3;
|
UINT8 temp1, temp2, temp3;
|
||||||
|
|
||||||
@ -714,11 +724,11 @@ static UINT16 bcd_sub( UINT16 a, UINT16 b)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static WRITE8_HANDLER( tms7000_internal_w ) {
|
static WRITE8_HANDLER( tms7000_internal_w ) {
|
||||||
tms7000_state *cpustate = space->cpu->token;
|
tms7000_state *cpustate = get_safe_token(space->cpu);
|
||||||
cpustate->rf[ offset ] = data;
|
cpustate->rf[ offset ] = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
static READ8_HANDLER( tms7000_internal_r ) {
|
static READ8_HANDLER( tms7000_internal_r ) {
|
||||||
tms7000_state *cpustate = space->cpu->token;
|
tms7000_state *cpustate = get_safe_token(space->cpu);
|
||||||
return cpustate->rf[ offset ];
|
return cpustate->rf[ offset ];
|
||||||
}
|
}
|
||||||
|
@ -511,6 +511,15 @@ struct _tms99xx_state
|
|||||||
int extra_byte; /* buffer holding the unused byte in a word read */
|
int extra_byte; /* buffer holding the unused byte in a word read */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE tms99xx_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == TMS99XX_GET_INFO);
|
||||||
|
return (tms99xx_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
#if (TMS99XX_MODEL == TMS9995_ID)
|
#if (TMS99XX_MODEL == TMS9995_ID)
|
||||||
static void reset_decrementer(tms99xx_state *cpustate);
|
static void reset_decrementer(tms99xx_state *cpustate);
|
||||||
#endif
|
#endif
|
||||||
@ -536,13 +545,13 @@ READ16_HANDLER(ti990_10_internal_r)
|
|||||||
*/
|
*/
|
||||||
READ8_HANDLER(tms9995_internal1_r)
|
READ8_HANDLER(tms9995_internal1_r)
|
||||||
{
|
{
|
||||||
tms99xx_state *cpustate = space->cpu->token;
|
tms99xx_state *cpustate = get_safe_token(space->cpu);
|
||||||
return cpustate->RAM[offset];
|
return cpustate->RAM[offset];
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE8_HANDLER(tms9995_internal1_w)
|
WRITE8_HANDLER(tms9995_internal1_w)
|
||||||
{
|
{
|
||||||
tms99xx_state *cpustate = space->cpu->token;
|
tms99xx_state *cpustate = get_safe_token(space->cpu);
|
||||||
cpustate->RAM[offset]=data;
|
cpustate->RAM[offset]=data;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -551,13 +560,13 @@ WRITE8_HANDLER(tms9995_internal1_w)
|
|||||||
*/
|
*/
|
||||||
READ8_HANDLER(tms9995_internal2_r)
|
READ8_HANDLER(tms9995_internal2_r)
|
||||||
{
|
{
|
||||||
tms99xx_state *cpustate = space->cpu->token;
|
tms99xx_state *cpustate = get_safe_token(space->cpu);
|
||||||
return cpustate->RAM[offset+0xfc];
|
return cpustate->RAM[offset+0xfc];
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE8_HANDLER(tms9995_internal2_w)
|
WRITE8_HANDLER(tms9995_internal2_w)
|
||||||
{
|
{
|
||||||
tms99xx_state *cpustate = space->cpu->token;
|
tms99xx_state *cpustate = get_safe_token(space->cpu);
|
||||||
cpustate->RAM[offset+0xfc]=data;
|
cpustate->RAM[offset+0xfc]=data;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -928,7 +937,7 @@ WRITE8_HANDLER(tms9995_internal2_w)
|
|||||||
/* read decrementer */
|
/* read decrementer */
|
||||||
if (cpustate->decrementer_enabled && !(cpustate->flag & 1))
|
if (cpustate->decrementer_enabled && !(cpustate->flag & 1))
|
||||||
/* timer mode, timer enabled */
|
/* timer mode, timer enabled */
|
||||||
return ceil(cpu_attotime_to_clocks(cpustate->device, attotime_div(timer_timeleft(cpustate->timer), 16)));
|
return cpu_attotime_to_clocks(cpustate->device, attotime_div(timer_timeleft(cpustate->timer), 16));
|
||||||
else
|
else
|
||||||
/* event counter mode or timer mode, timer disabled */
|
/* event counter mode or timer mode, timer disabled */
|
||||||
return cpustate->decrementer_count;
|
return cpustate->decrementer_count;
|
||||||
@ -992,7 +1001,7 @@ WRITE8_HANDLER(tms9995_internal2_w)
|
|||||||
|
|
||||||
if (cpustate->decrementer_enabled && !(cpustate->flag & 1))
|
if (cpustate->decrementer_enabled && !(cpustate->flag & 1))
|
||||||
/* timer mode, timer enabled */
|
/* timer mode, timer enabled */
|
||||||
value = ceil(cpu_attotime_to_clocks(cpustate->device, attotime_div(timer_timeleft(cpustate->timer), 16)));
|
value = cpu_attotime_to_clocks(cpustate->device, attotime_div(timer_timeleft(cpustate->timer), 16));
|
||||||
else
|
else
|
||||||
/* event counter mode or timer mode, timer disabled */
|
/* event counter mode or timer mode, timer disabled */
|
||||||
value = cpustate->decrementer_count;
|
value = cpustate->decrementer_count;
|
||||||
@ -1071,7 +1080,7 @@ INLINE void WRITEREG_DEBUG(tms99xx_state *cpustate, int reg, UINT16 data)
|
|||||||
#if (TMS99XX_MODEL == TI990_10_ID)
|
#if (TMS99XX_MODEL == TI990_10_ID)
|
||||||
READ8_HANDLER(ti990_10_mapper_cru_r)
|
READ8_HANDLER(ti990_10_mapper_cru_r)
|
||||||
{
|
{
|
||||||
tms99xx_state *cpustate = space->cpu->token;
|
tms99xx_state *cpustate = get_safe_token(space->cpu);
|
||||||
int reply = 0;
|
int reply = 0;
|
||||||
|
|
||||||
switch(cpustate->mapper_cru_read_register)
|
switch(cpustate->mapper_cru_read_register)
|
||||||
@ -1110,7 +1119,7 @@ INLINE void WRITEREG_DEBUG(tms99xx_state *cpustate, int reg, UINT16 data)
|
|||||||
|
|
||||||
WRITE8_HANDLER(ti990_10_mapper_cru_w)
|
WRITE8_HANDLER(ti990_10_mapper_cru_w)
|
||||||
{
|
{
|
||||||
tms99xx_state *cpustate = space->cpu->token;
|
tms99xx_state *cpustate = get_safe_token(space->cpu);
|
||||||
switch (offset)
|
switch (offset)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
@ -1152,13 +1161,13 @@ INLINE void WRITEREG_DEBUG(tms99xx_state *cpustate, int reg, UINT16 data)
|
|||||||
|
|
||||||
READ8_HANDLER(ti990_10_eir_cru_r)
|
READ8_HANDLER(ti990_10_eir_cru_r)
|
||||||
{
|
{
|
||||||
tms99xx_state *cpustate = space->cpu->token;
|
tms99xx_state *cpustate = get_safe_token(space->cpu);
|
||||||
return (offset == 1) ? (cpustate->error_interrupt_register & 0xff) : 0;
|
return (offset == 1) ? (cpustate->error_interrupt_register & 0xff) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE8_HANDLER(ti990_10_eir_cru_w)
|
WRITE8_HANDLER(ti990_10_eir_cru_w)
|
||||||
{
|
{
|
||||||
tms99xx_state *cpustate = space->cpu->token;
|
tms99xx_state *cpustate = get_safe_token(space->cpu);
|
||||||
if (offset < 4) /* does not work for EIR_MAPERR */
|
if (offset < 4) /* does not work for EIR_MAPERR */
|
||||||
{
|
{
|
||||||
cpustate->error_interrupt_register &= ~ (1 << offset);
|
cpustate->error_interrupt_register &= ~ (1 << offset);
|
||||||
@ -1205,7 +1214,7 @@ static void set_flag1(tms99xx_state *cpustate, int val);
|
|||||||
|
|
||||||
static void register_for_save_state(const device_config *device)
|
static void register_for_save_state(const device_config *device)
|
||||||
{
|
{
|
||||||
tms99xx_state *cpustate = device->token;
|
tms99xx_state *cpustate = get_safe_token(device);
|
||||||
state_save_register_device_item(device, 0, cpustate->WP);
|
state_save_register_device_item(device, 0, cpustate->WP);
|
||||||
state_save_register_device_item(device, 0, cpustate->PC);
|
state_save_register_device_item(device, 0, cpustate->PC);
|
||||||
state_save_register_device_item(device, 0, cpustate->STATUS);
|
state_save_register_device_item(device, 0, cpustate->STATUS);
|
||||||
@ -1282,7 +1291,7 @@ static void register_for_save_state(const device_config *device)
|
|||||||
static CPU_INIT( tms99xx )
|
static CPU_INIT( tms99xx )
|
||||||
{
|
{
|
||||||
const TMS99XX_RESET_PARAM *param = (const TMS99XX_RESET_PARAM *) device->static_config;
|
const TMS99XX_RESET_PARAM *param = (const TMS99XX_RESET_PARAM *) device->static_config;
|
||||||
tms99xx_state *cpustate = device->token;
|
tms99xx_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
register_for_save_state(device);
|
register_for_save_state(device);
|
||||||
|
|
||||||
@ -1328,7 +1337,7 @@ static CPU_INIT( tms99xx )
|
|||||||
*/
|
*/
|
||||||
static CPU_RESET( tms99xx )
|
static CPU_RESET( tms99xx )
|
||||||
{
|
{
|
||||||
tms99xx_state *cpustate = device->token;
|
tms99xx_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->STATUS = 0; /* TMS9980 and TMS9995 Data Books say so */
|
cpustate->STATUS = 0; /* TMS9980 and TMS9995 Data Books say so */
|
||||||
getstat(cpustate);
|
getstat(cpustate);
|
||||||
@ -1397,7 +1406,7 @@ INLINE UINT16 fetch(tms99xx_state *cpustate)
|
|||||||
|
|
||||||
static CPU_EXECUTE( tms99xx )
|
static CPU_EXECUTE( tms99xx )
|
||||||
{
|
{
|
||||||
tms99xx_state *cpustate = device->token;
|
tms99xx_state *cpustate = get_safe_token(device);
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
cpustate->lds_flag = 0;
|
cpustate->lds_flag = 0;
|
||||||
@ -1776,7 +1785,7 @@ static void tms99xx_set_irq_line(tms99xx_state *cpustate, int irqline, int state
|
|||||||
*/
|
*/
|
||||||
static TIMER_CALLBACK( decrementer_callback )
|
static TIMER_CALLBACK( decrementer_callback )
|
||||||
{
|
{
|
||||||
tms99xx_state *cpustate = ptr;
|
tms99xx_state *cpustate = (tms99xx_state *)ptr;
|
||||||
|
|
||||||
/* request decrementer interrupt */
|
/* request decrementer interrupt */
|
||||||
cpustate->int_latch |= 0x8;
|
cpustate->int_latch |= 0x8;
|
||||||
@ -4576,7 +4585,7 @@ INLINE void execute(tms99xx_state *cpustate, UINT16 opcode)
|
|||||||
|
|
||||||
static CPU_SET_INFO( tms99xx )
|
static CPU_SET_INFO( tms99xx )
|
||||||
{
|
{
|
||||||
tms99xx_state *cpustate = device->token;
|
tms99xx_state *cpustate = get_safe_token(device);
|
||||||
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 --- */
|
||||||
@ -4658,7 +4667,7 @@ static CPU_SET_INFO( tms99xx )
|
|||||||
|
|
||||||
void TMS99XX_GET_INFO(const device_config *device, UINT32 state, cpuinfo *info)
|
void TMS99XX_GET_INFO(const device_config *device, UINT32 state, cpuinfo *info)
|
||||||
{
|
{
|
||||||
tms99xx_state *cpustate = (device != NULL) ? device->token : NULL;
|
tms99xx_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : 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 --- */
|
||||||
|
@ -5369,7 +5369,7 @@ static offs_t Dasm( char *buffer, offs_t pc, const struct dasm_s *dasmXX, const
|
|||||||
UINT32 flags = 0;
|
UINT32 flags = 0;
|
||||||
|
|
||||||
t = dasmXX[op].token;
|
t = dasmXX[op].token;
|
||||||
a = dasmXX[op].args;
|
a = (const char *)dasmXX[op].args;
|
||||||
|
|
||||||
/* 0 token means prefix opcode (use table from args) */
|
/* 0 token means prefix opcode (use table from args) */
|
||||||
if (0 == t)
|
if (0 == t)
|
||||||
@ -5378,7 +5378,7 @@ static offs_t Dasm( char *buffer, offs_t pc, const struct dasm_s *dasmXX, const
|
|||||||
|
|
||||||
op2 = oprom[idx++];
|
op2 = oprom[idx++];
|
||||||
t = p_dasm[op2].token;
|
t = p_dasm[op2].token;
|
||||||
a = p_dasm[op2].args;
|
a = (const char *)p_dasm[op2].args;
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer += sprintf(buffer, "%-8.8s", token[t]);
|
buffer += sprintf(buffer, "%-8.8s", token[t]);
|
||||||
|
@ -502,6 +502,19 @@ struct _upd7810_state
|
|||||||
int icount;
|
int icount;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE upd7810_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_UPD7810 ||
|
||||||
|
cpu_get_type(device) == CPU_UPD7807 ||
|
||||||
|
cpu_get_type(device) == CPU_UPD7801 ||
|
||||||
|
cpu_get_type(device) == CPU_UPD78C05 ||
|
||||||
|
cpu_get_type(device) == CPU_UPD78C06);
|
||||||
|
return (upd7810_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
#define CY 0x01
|
#define CY 0x01
|
||||||
#define F1 0x02
|
#define F1 0x02
|
||||||
#define L0 0x04
|
#define L0 0x04
|
||||||
@ -1621,7 +1634,7 @@ static void upd78c05_timers(upd7810_state *cpustate, int cycles)
|
|||||||
|
|
||||||
static CPU_INIT( upd7810 )
|
static CPU_INIT( upd7810 )
|
||||||
{
|
{
|
||||||
upd7810_state *cpustate = device->token;
|
upd7810_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->config = *(const UPD7810_CONFIG*) device->static_config;
|
cpustate->config = *(const UPD7810_CONFIG*) device->static_config;
|
||||||
cpustate->irq_callback = irqcallback;
|
cpustate->irq_callback = irqcallback;
|
||||||
@ -1698,7 +1711,7 @@ static CPU_INIT( upd7810 )
|
|||||||
|
|
||||||
static CPU_RESET( upd7810 )
|
static CPU_RESET( upd7810 )
|
||||||
{
|
{
|
||||||
upd7810_state *cpustate = device->token;
|
upd7810_state *cpustate = get_safe_token(device);
|
||||||
UPD7810_CONFIG save_config;
|
UPD7810_CONFIG save_config;
|
||||||
cpu_irq_callback save_irqcallback;
|
cpu_irq_callback save_irqcallback;
|
||||||
|
|
||||||
@ -1743,14 +1756,14 @@ static CPU_RESET( upd7810 )
|
|||||||
|
|
||||||
static CPU_RESET( upd7807 )
|
static CPU_RESET( upd7807 )
|
||||||
{
|
{
|
||||||
upd7810_state *cpustate = device->token;
|
upd7810_state *cpustate = get_safe_token(device);
|
||||||
CPU_RESET_CALL(upd7810);
|
CPU_RESET_CALL(upd7810);
|
||||||
cpustate->opXX = opXX_7807;
|
cpustate->opXX = opXX_7807;
|
||||||
}
|
}
|
||||||
|
|
||||||
static CPU_RESET( upd7801 )
|
static CPU_RESET( upd7801 )
|
||||||
{
|
{
|
||||||
upd7810_state *cpustate = device->token;
|
upd7810_state *cpustate = get_safe_token(device);
|
||||||
CPU_RESET_CALL(upd7810);
|
CPU_RESET_CALL(upd7810);
|
||||||
cpustate->op48 = op48_7801;
|
cpustate->op48 = op48_7801;
|
||||||
cpustate->op4C = op4C_7801;
|
cpustate->op4C = op4C_7801;
|
||||||
@ -1764,7 +1777,7 @@ static CPU_RESET( upd7801 )
|
|||||||
|
|
||||||
static CPU_RESET( upd78c05 )
|
static CPU_RESET( upd78c05 )
|
||||||
{
|
{
|
||||||
upd7810_state *cpustate = device->token;
|
upd7810_state *cpustate = get_safe_token(device);
|
||||||
CPU_RESET_CALL(upd7810);
|
CPU_RESET_CALL(upd7810);
|
||||||
cpustate->op48 = op48_78c05;
|
cpustate->op48 = op48_78c05;
|
||||||
cpustate->op4C = op4C_78c05;
|
cpustate->op4C = op4C_78c05;
|
||||||
@ -1784,7 +1797,7 @@ static CPU_RESET( upd78c05 )
|
|||||||
|
|
||||||
static CPU_RESET( upd78c06 )
|
static CPU_RESET( upd78c06 )
|
||||||
{
|
{
|
||||||
upd7810_state *cpustate = device->token;
|
upd7810_state *cpustate = get_safe_token(device);
|
||||||
CPU_RESET_CALL(upd78c05);
|
CPU_RESET_CALL(upd78c05);
|
||||||
cpustate->op48 = op48_78c06;
|
cpustate->op48 = op48_78c06;
|
||||||
cpustate->op4C = op4C_78c06;
|
cpustate->op4C = op4C_78c06;
|
||||||
@ -1802,7 +1815,7 @@ static CPU_EXIT( upd7810 )
|
|||||||
|
|
||||||
static CPU_EXECUTE( upd7810 )
|
static CPU_EXECUTE( upd7810 )
|
||||||
{
|
{
|
||||||
upd7810_state *cpustate = device->token;
|
upd7810_state *cpustate = get_safe_token(device);
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
do
|
do
|
||||||
@ -1927,7 +1940,7 @@ static void set_irq_line(upd7810_state *cpustate, int irqline, int state)
|
|||||||
|
|
||||||
static CPU_SET_INFO( upd7810 )
|
static CPU_SET_INFO( upd7810 )
|
||||||
{
|
{
|
||||||
upd7810_state *cpustate = device->token;
|
upd7810_state *cpustate = get_safe_token(device);
|
||||||
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 --- */
|
||||||
@ -2001,7 +2014,7 @@ static CPU_SET_INFO( upd7810 )
|
|||||||
|
|
||||||
CPU_GET_INFO( upd7810 )
|
CPU_GET_INFO( upd7810 )
|
||||||
{
|
{
|
||||||
upd7810_state *cpustate = (device != NULL) ? device->token : NULL;
|
upd7810_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : 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 --- */
|
||||||
|
@ -92,6 +92,15 @@ struct _v30mz_state
|
|||||||
UINT16 e16;
|
UINT16 e16;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE v30mz_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_V30MZ);
|
||||||
|
return (v30mz_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
/* cpu state */
|
/* cpu state */
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
@ -113,7 +122,7 @@ static UINT8 parity_table[256];
|
|||||||
|
|
||||||
static CPU_RESET( nec )
|
static CPU_RESET( nec )
|
||||||
{
|
{
|
||||||
v30mz_state *cpustate = device->token;
|
v30mz_state *cpustate = get_safe_token(device);
|
||||||
unsigned int i,j,c;
|
unsigned int i,j,c;
|
||||||
static const BREGS reg_name[8]={ AL, CL, DL, BL, AH, CH, DH, BH };
|
static const BREGS reg_name[8]={ AL, CL, DL, BL, AH, CH, DH, BH };
|
||||||
cpu_irq_callback save_irqcallback;
|
cpu_irq_callback save_irqcallback;
|
||||||
@ -915,7 +924,7 @@ static CPU_DISASSEMBLE( nec )
|
|||||||
|
|
||||||
static void nec_init(const device_config *device, cpu_irq_callback irqcallback, int type)
|
static void nec_init(const device_config *device, cpu_irq_callback irqcallback, int type)
|
||||||
{
|
{
|
||||||
v30mz_state *cpustate = device->token;
|
v30mz_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
state_save_register_device_item_array(device, 0, cpustate->regs.w);
|
state_save_register_device_item_array(device, 0, cpustate->regs.w);
|
||||||
state_save_register_device_item_array(device, 0, cpustate->sregs);
|
state_save_register_device_item_array(device, 0, cpustate->sregs);
|
||||||
@ -945,7 +954,7 @@ static void nec_init(const device_config *device, cpu_irq_callback irqcallback,
|
|||||||
static CPU_INIT( v30mz ) { nec_init(device, irqcallback, 3); }
|
static CPU_INIT( v30mz ) { nec_init(device, irqcallback, 3); }
|
||||||
static CPU_EXECUTE( v30mz )
|
static CPU_EXECUTE( v30mz )
|
||||||
{
|
{
|
||||||
v30mz_state *cpustate = device->token;
|
v30mz_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->icount=cycles;
|
cpustate->icount=cycles;
|
||||||
|
|
||||||
@ -977,7 +986,7 @@ static CPU_EXECUTE( v30mz )
|
|||||||
|
|
||||||
static CPU_SET_INFO( nec )
|
static CPU_SET_INFO( nec )
|
||||||
{
|
{
|
||||||
v30mz_state *cpustate = device->token;
|
v30mz_state *cpustate = get_safe_token(device);
|
||||||
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 --- */
|
||||||
@ -1033,7 +1042,7 @@ static CPU_SET_INFO( nec )
|
|||||||
|
|
||||||
CPU_GET_INFO( v30mz )
|
CPU_GET_INFO( v30mz )
|
||||||
{
|
{
|
||||||
v30mz_state *cpustate = (device != NULL) ? device->token : NULL;
|
v30mz_state *cpustate = (device != NULL && device != NULL) ? get_safe_token(device) : NULL;
|
||||||
int flags;
|
int flags;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
|
@ -110,6 +110,16 @@ struct _v60_state
|
|||||||
UINT8 moddim;
|
UINT8 moddim;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE v60_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_V60 ||
|
||||||
|
cpu_get_type(device) == CPU_V70);
|
||||||
|
return (v60_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Prevent warnings on NetBSD. All identifiers beginning with an underscore
|
* Prevent warnings on NetBSD. All identifiers beginning with an underscore
|
||||||
* followed by an uppercase letter are reserved by the C standard (ISO / IEC
|
* followed by an uppercase letter are reserved by the C standard (ISO / IEC
|
||||||
@ -324,7 +334,7 @@ static UINT32 opUNHANDLED(v60_state *cpustate)
|
|||||||
|
|
||||||
static void base_init(const device_config *device, cpu_irq_callback irqcallback)
|
static void base_init(const device_config *device, cpu_irq_callback irqcallback)
|
||||||
{
|
{
|
||||||
v60_state *cpustate = device->token;
|
v60_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->stall_io = 0;
|
cpustate->stall_io = 0;
|
||||||
cpustate->irq_cb = irqcallback;
|
cpustate->irq_cb = irqcallback;
|
||||||
@ -344,7 +354,7 @@ static void base_init(const device_config *device, cpu_irq_callback irqcallback)
|
|||||||
|
|
||||||
static CPU_INIT( v60 )
|
static CPU_INIT( v60 )
|
||||||
{
|
{
|
||||||
v60_state *cpustate = device->token;
|
v60_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
base_init(device, irqcallback);
|
base_init(device, irqcallback);
|
||||||
// Set cpustate->PIR (Processor ID) for NEC cpustate-> LSB is reserved to NEC,
|
// Set cpustate->PIR (Processor ID) for NEC cpustate-> LSB is reserved to NEC,
|
||||||
@ -358,7 +368,7 @@ static CPU_INIT( v60 )
|
|||||||
|
|
||||||
static CPU_INIT( v70 )
|
static CPU_INIT( v70 )
|
||||||
{
|
{
|
||||||
v60_state *cpustate = device->token;
|
v60_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
base_init(device, irqcallback);
|
base_init(device, irqcallback);
|
||||||
// Set cpustate->PIR (Processor ID) for NEC v70. LSB is reserved to NEC,
|
// Set cpustate->PIR (Processor ID) for NEC v70. LSB is reserved to NEC,
|
||||||
@ -372,7 +382,7 @@ static CPU_INIT( v70 )
|
|||||||
|
|
||||||
static CPU_RESET( v60 )
|
static CPU_RESET( v60 )
|
||||||
{
|
{
|
||||||
v60_state *cpustate = device->token;
|
v60_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->PSW = 0x10000000;
|
cpustate->PSW = 0x10000000;
|
||||||
cpustate->PC = cpustate->info.start_pc;
|
cpustate->PC = cpustate->info.start_pc;
|
||||||
@ -393,7 +403,7 @@ static CPU_EXIT( v60 )
|
|||||||
|
|
||||||
void v60_stall(const device_config *device)
|
void v60_stall(const device_config *device)
|
||||||
{
|
{
|
||||||
v60_state *cpustate = device->token;
|
v60_state *cpustate = get_safe_token(device);
|
||||||
cpustate->stall_io = 1;
|
cpustate->stall_io = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -450,7 +460,7 @@ static void set_irq_line(v60_state *cpustate, int irqline, int state)
|
|||||||
|
|
||||||
static CPU_EXECUTE( v60 )
|
static CPU_EXECUTE( v60 )
|
||||||
{
|
{
|
||||||
v60_state *cpustate = device->token;
|
v60_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
if (cpustate->irq_line != CLEAR_LINE)
|
if (cpustate->irq_line != CLEAR_LINE)
|
||||||
@ -482,7 +492,7 @@ CPU_DISASSEMBLE( v70 );
|
|||||||
|
|
||||||
static CPU_SET_INFO( v60 )
|
static CPU_SET_INFO( v60 )
|
||||||
{
|
{
|
||||||
v60_state *cpustate = device->token;
|
v60_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -562,7 +572,7 @@ static CPU_SET_INFO( v60 )
|
|||||||
|
|
||||||
CPU_GET_INFO( v60 )
|
CPU_GET_INFO( v60 )
|
||||||
{
|
{
|
||||||
v60_state *cpustate = (device != NULL) ? device->token : NULL;
|
v60_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
@ -36,6 +36,15 @@ struct _v810_state
|
|||||||
int icount;
|
int icount;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE v810_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_V810);
|
||||||
|
return (v810_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
#define R0 reg[0]
|
#define R0 reg[0]
|
||||||
#define R1 reg[1]
|
#define R1 reg[1]
|
||||||
#define R2 reg[2]
|
#define R2 reg[2]
|
||||||
@ -987,7 +996,7 @@ static UINT32 (*const OpCodeTable[64])(v810_state *cpustate,UINT32 op) =
|
|||||||
|
|
||||||
static CPU_INIT( v810 )
|
static CPU_INIT( v810 )
|
||||||
{
|
{
|
||||||
v810_state *cpustate = device->token;
|
v810_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->irq_line = CLEAR_LINE;
|
cpustate->irq_line = CLEAR_LINE;
|
||||||
cpustate->nmi_line = CLEAR_LINE;
|
cpustate->nmi_line = CLEAR_LINE;
|
||||||
@ -1005,7 +1014,7 @@ static CPU_INIT( v810 )
|
|||||||
|
|
||||||
static CPU_RESET( v810 )
|
static CPU_RESET( v810 )
|
||||||
{
|
{
|
||||||
v810_state *cpustate = device->token;
|
v810_state *cpustate = get_safe_token(device);
|
||||||
int i;
|
int i;
|
||||||
for(i=0;i<64;i++) cpustate->reg[i]=0;
|
for(i=0;i<64;i++) cpustate->reg[i]=0;
|
||||||
cpustate->PC = 0xfffffff0;
|
cpustate->PC = 0xfffffff0;
|
||||||
@ -1015,7 +1024,7 @@ static CPU_RESET( v810 )
|
|||||||
|
|
||||||
static CPU_EXECUTE( v810 )
|
static CPU_EXECUTE( v810 )
|
||||||
{
|
{
|
||||||
v810_state *cpustate = device->token;
|
v810_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
while(cpustate->icount>0)
|
while(cpustate->icount>0)
|
||||||
@ -1042,7 +1051,7 @@ static void set_irq_line(v810_state *cpustate, int irqline, int state)
|
|||||||
|
|
||||||
static CPU_SET_INFO( v810 )
|
static CPU_SET_INFO( v810 )
|
||||||
{
|
{
|
||||||
v810_state *cpustate = device->token;
|
v810_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -1125,7 +1134,7 @@ static CPU_SET_INFO( v810 )
|
|||||||
|
|
||||||
CPU_GET_INFO( v810 )
|
CPU_GET_INFO( v810 )
|
||||||
{
|
{
|
||||||
v810_state *cpustate = (device != NULL) ? device->token : NULL;
|
v810_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
@ -42,8 +42,8 @@ struct _log_comment
|
|||||||
|
|
||||||
|
|
||||||
/* data ranges */
|
/* data ranges */
|
||||||
typedef struct _data_range data_range;
|
typedef struct _data_range_t data_range_t;
|
||||||
struct _data_range
|
struct _data_range_t
|
||||||
{
|
{
|
||||||
x86code * base;
|
x86code * base;
|
||||||
x86code * end;
|
x86code * end;
|
||||||
@ -57,7 +57,7 @@ struct _x86log_context
|
|||||||
astring * filename; /* name of the file */
|
astring * filename; /* name of the file */
|
||||||
FILE * file; /* file we are logging to */
|
FILE * file; /* file we are logging to */
|
||||||
|
|
||||||
data_range data_range[MAX_DATA_RANGES]; /* list of data ranges */
|
data_range_t data_range[MAX_DATA_RANGES]; /* list of data ranges */
|
||||||
int data_range_count; /* number of data ranges */
|
int data_range_count; /* number of data ranges */
|
||||||
|
|
||||||
log_comment comment_list[MAX_COMMENTS]; /* list of comments */
|
log_comment comment_list[MAX_COMMENTS]; /* list of comments */
|
||||||
@ -161,7 +161,7 @@ void x86log_add_comment(x86log_context *log, x86code *base, const char *format,
|
|||||||
|
|
||||||
void x86log_mark_as_data(x86log_context *log, x86code *base, x86code *end, int size)
|
void x86log_mark_as_data(x86log_context *log, x86code *base, x86code *end, int size)
|
||||||
{
|
{
|
||||||
data_range *data;
|
data_range_t *data;
|
||||||
|
|
||||||
assert(log->data_range_count < MAX_DATA_RANGES);
|
assert(log->data_range_count < MAX_DATA_RANGES);
|
||||||
assert(end >= base);
|
assert(end >= base);
|
||||||
@ -191,8 +191,8 @@ void x86log_disasm_code_range(x86log_context *log, const char *label, x86code *s
|
|||||||
{
|
{
|
||||||
const log_comment *lastcomment = &log->comment_list[log->comment_count];
|
const log_comment *lastcomment = &log->comment_list[log->comment_count];
|
||||||
const log_comment *curcomment = &log->comment_list[0];
|
const log_comment *curcomment = &log->comment_list[0];
|
||||||
const data_range *lastdata = &log->data_range[log->data_range_count];
|
const data_range_t *lastdata = &log->data_range[log->data_range_count];
|
||||||
const data_range *curdata = &log->data_range[0];
|
const data_range_t *curdata = &log->data_range[0];
|
||||||
x86code *cur = start;
|
x86code *cur = start;
|
||||||
|
|
||||||
/* print the optional label */
|
/* print the optional label */
|
||||||
|
@ -124,6 +124,15 @@ struct _z180_state
|
|||||||
int icount;
|
int icount;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE z180_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_Z180);
|
||||||
|
return (z180_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
static void set_irq_line(z180_state *cpustate, int irqline, int state);
|
static void set_irq_line(z180_state *cpustate, int irqline, int state);
|
||||||
|
|
||||||
#define CF 0x01
|
#define CF 0x01
|
||||||
@ -2004,10 +2013,10 @@ static void z180_write_iolines(z180_state *cpustate, UINT32 data)
|
|||||||
|
|
||||||
static CPU_INIT( z180 )
|
static CPU_INIT( z180 )
|
||||||
{
|
{
|
||||||
z180_state *cpustate = device->token;
|
z180_state *cpustate = get_safe_token(device);
|
||||||
cpustate->daisy = NULL;
|
cpustate->daisy = NULL;
|
||||||
if (device->static_config)
|
if (device->static_config)
|
||||||
cpustate->daisy = z80daisy_init(device, device->static_config);
|
cpustate->daisy = z80daisy_init(device, (const z80_daisy_chain *)device->static_config);
|
||||||
cpustate->irq_callback = irqcallback;
|
cpustate->irq_callback = irqcallback;
|
||||||
cpustate->device = device;
|
cpustate->device = device;
|
||||||
cpustate->program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
|
cpustate->program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
|
||||||
@ -2050,7 +2059,7 @@ static CPU_INIT( z180 )
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static CPU_RESET( z180 )
|
static CPU_RESET( z180 )
|
||||||
{
|
{
|
||||||
z180_state *cpustate = device->token;
|
z180_state *cpustate = get_safe_token(device);
|
||||||
z80_daisy_state *save_daisy;
|
z80_daisy_state *save_daisy;
|
||||||
cpu_irq_callback save_irqcallback;
|
cpu_irq_callback save_irqcallback;
|
||||||
cpu_state_table save_table;
|
cpu_state_table save_table;
|
||||||
@ -2303,7 +2312,7 @@ static void check_interrupts(z180_state *cpustate)
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static CPU_EXECUTE( z180 )
|
static CPU_EXECUTE( z180 )
|
||||||
{
|
{
|
||||||
z180_state *cpustate = device->token;
|
z180_state *cpustate = get_safe_token(device);
|
||||||
int old_icount = cycles;
|
int old_icount = cycles;
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
@ -2394,7 +2403,7 @@ again:
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static CPU_BURN( z180 )
|
static CPU_BURN( z180 )
|
||||||
{
|
{
|
||||||
z180_state *cpustate = device->token;
|
z180_state *cpustate = get_safe_token(device);
|
||||||
if( cycles > 0 )
|
if( cycles > 0 )
|
||||||
{
|
{
|
||||||
/* NOP takes 3 cycles per instruction */
|
/* NOP takes 3 cycles per instruction */
|
||||||
@ -2434,7 +2443,7 @@ static CPU_TRANSLATE( z180 )
|
|||||||
{
|
{
|
||||||
if (space == ADDRESS_SPACE_PROGRAM)
|
if (space == ADDRESS_SPACE_PROGRAM)
|
||||||
{
|
{
|
||||||
z180_state *cpustate = device->token;
|
z180_state *cpustate = get_safe_token(device);
|
||||||
*address = MMU_REMAP_ADDR(cpustate, *address);
|
*address = MMU_REMAP_ADDR(cpustate, *address);
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -2447,7 +2456,7 @@ static CPU_TRANSLATE( z180 )
|
|||||||
|
|
||||||
static CPU_IMPORT_STATE( z180 )
|
static CPU_IMPORT_STATE( z180 )
|
||||||
{
|
{
|
||||||
z180_state *cpustate = device->token;
|
z180_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (entry->index)
|
switch (entry->index)
|
||||||
{
|
{
|
||||||
@ -2475,7 +2484,7 @@ static CPU_IMPORT_STATE( z180 )
|
|||||||
|
|
||||||
static CPU_EXPORT_STATE( z180 )
|
static CPU_EXPORT_STATE( z180 )
|
||||||
{
|
{
|
||||||
z180_state *cpustate = device->token;
|
z180_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (entry->index)
|
switch (entry->index)
|
||||||
{
|
{
|
||||||
@ -2500,7 +2509,7 @@ static CPU_EXPORT_STATE( z180 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( z180 )
|
static CPU_SET_INFO( z180 )
|
||||||
{
|
{
|
||||||
z180_state *cpustate = device->token;
|
z180_state *cpustate = get_safe_token(device);
|
||||||
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 --- */
|
||||||
@ -2508,12 +2517,12 @@ static CPU_SET_INFO( z180 )
|
|||||||
case CPUINFO_INT_INPUT_STATE + Z180_INT0: set_irq_line(cpustate, Z180_INT0, info->i); break;
|
case CPUINFO_INT_INPUT_STATE + Z180_INT0: set_irq_line(cpustate, Z180_INT0, info->i); break;
|
||||||
|
|
||||||
/* --- the following bits of info are set as pointers to data or functions --- */
|
/* --- the following bits of info are set as pointers to data or functions --- */
|
||||||
case CPUINFO_PTR_Z180_CYCLE_TABLE + Z180_TABLE_op: cc[Z180_TABLE_op] = info->p; break;
|
case CPUINFO_PTR_Z180_CYCLE_TABLE + Z180_TABLE_op: cc[Z180_TABLE_op] = (const UINT8 *)info->p; break;
|
||||||
case CPUINFO_PTR_Z180_CYCLE_TABLE + Z180_TABLE_cb: cc[Z180_TABLE_cb] = info->p; break;
|
case CPUINFO_PTR_Z180_CYCLE_TABLE + Z180_TABLE_cb: cc[Z180_TABLE_cb] = (const UINT8 *)info->p; break;
|
||||||
case CPUINFO_PTR_Z180_CYCLE_TABLE + Z180_TABLE_ed: cc[Z180_TABLE_ed] = info->p; break;
|
case CPUINFO_PTR_Z180_CYCLE_TABLE + Z180_TABLE_ed: cc[Z180_TABLE_ed] = (const UINT8 *)info->p; break;
|
||||||
case CPUINFO_PTR_Z180_CYCLE_TABLE + Z180_TABLE_xy: cc[Z180_TABLE_xy] = info->p; break;
|
case CPUINFO_PTR_Z180_CYCLE_TABLE + Z180_TABLE_xy: cc[Z180_TABLE_xy] = (const UINT8 *)info->p; break;
|
||||||
case CPUINFO_PTR_Z180_CYCLE_TABLE + Z180_TABLE_xycb: cc[Z180_TABLE_xycb] = info->p; break;
|
case CPUINFO_PTR_Z180_CYCLE_TABLE + Z180_TABLE_xycb: cc[Z180_TABLE_xycb] = (const UINT8 *)info->p; break;
|
||||||
case CPUINFO_PTR_Z180_CYCLE_TABLE + Z180_TABLE_ex: cc[Z180_TABLE_ex] = info->p; break;
|
case CPUINFO_PTR_Z180_CYCLE_TABLE + Z180_TABLE_ex: cc[Z180_TABLE_ex] = (const UINT8 *)info->p; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2524,7 +2533,7 @@ static CPU_SET_INFO( z180 )
|
|||||||
|
|
||||||
CPU_GET_INFO( z180 )
|
CPU_GET_INFO( z180 )
|
||||||
{
|
{
|
||||||
z180_state *cpustate = (device != NULL) ? device->token : NULL;
|
z180_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : 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 --- */
|
||||||
|
@ -71,7 +71,7 @@ INLINE void z180_mmu(z180_state *cpustate)
|
|||||||
#define RM(cs,addr) memory_read_byte_8le((cs)->program, MMU_REMAP_ADDR(cs,addr))
|
#define RM(cs,addr) memory_read_byte_8le((cs)->program, MMU_REMAP_ADDR(cs,addr))
|
||||||
UINT8 z180_readmem(const device_config *device, offs_t offset)
|
UINT8 z180_readmem(const device_config *device, offs_t offset)
|
||||||
{
|
{
|
||||||
z180_state *cpustate = device->token;
|
z180_state *cpustate = get_safe_token(device);
|
||||||
return RM(cpustate, offset);
|
return RM(cpustate, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,7 +81,7 @@ UINT8 z180_readmem(const device_config *device, offs_t offset)
|
|||||||
#define WM(cs,addr,value) memory_write_byte_8le((cs)->program, MMU_REMAP_ADDR(cs,addr),value)
|
#define WM(cs,addr,value) memory_write_byte_8le((cs)->program, MMU_REMAP_ADDR(cs,addr),value)
|
||||||
void z180_writemem(const device_config *device, offs_t offset, UINT8 data)
|
void z180_writemem(const device_config *device, offs_t offset, UINT8 data)
|
||||||
{
|
{
|
||||||
z180_state *cpustate = device->token;
|
z180_state *cpustate = get_safe_token(device);
|
||||||
WM(cpustate, offset, data);
|
WM(cpustate, offset, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,6 +138,15 @@ struct _z80_state
|
|||||||
UINT8 rtemp;
|
UINT8 rtemp;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
INLINE z80_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_Z80);
|
||||||
|
return (z80_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
#define CF 0x01
|
#define CF 0x01
|
||||||
#define NF 0x02
|
#define NF 0x02
|
||||||
#define PF 0x04
|
#define PF 0x04
|
||||||
@ -3322,7 +3331,7 @@ static void take_interrupt(z80_state *z80)
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static CPU_INIT( z80 )
|
static CPU_INIT( z80 )
|
||||||
{
|
{
|
||||||
z80_state *z80 = device->token;
|
z80_state *z80 = get_safe_token(device);
|
||||||
int i, p;
|
int i, p;
|
||||||
|
|
||||||
/* setup cycle tables */
|
/* setup cycle tables */
|
||||||
@ -3444,7 +3453,7 @@ static CPU_INIT( z80 )
|
|||||||
/* Reset registers to their initial values */
|
/* Reset registers to their initial values */
|
||||||
memset(z80, 0, sizeof(*z80));
|
memset(z80, 0, sizeof(*z80));
|
||||||
if (device->static_config != NULL)
|
if (device->static_config != NULL)
|
||||||
z80->daisy = z80daisy_init(device, device->static_config);
|
z80->daisy = z80daisy_init(device, (const z80_daisy_chain *)device->static_config);
|
||||||
z80->irq_callback = irqcallback;
|
z80->irq_callback = irqcallback;
|
||||||
z80->device = device;
|
z80->device = device;
|
||||||
z80->program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
|
z80->program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
|
||||||
@ -3463,7 +3472,7 @@ static CPU_INIT( z80 )
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static CPU_RESET( z80 )
|
static CPU_RESET( z80 )
|
||||||
{
|
{
|
||||||
z80_state *z80 = device->token;
|
z80_state *z80 = get_safe_token(device);
|
||||||
|
|
||||||
z80->PC = 0x0000;
|
z80->PC = 0x0000;
|
||||||
z80->i = 0;
|
z80->i = 0;
|
||||||
@ -3493,7 +3502,7 @@ static CPU_EXIT( z80 )
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static CPU_EXECUTE( z80 )
|
static CPU_EXECUTE( z80 )
|
||||||
{
|
{
|
||||||
z80_state *z80 = device->token;
|
z80_state *z80 = get_safe_token(device);
|
||||||
|
|
||||||
z80->icount = cycles;
|
z80->icount = cycles;
|
||||||
|
|
||||||
@ -3535,7 +3544,7 @@ static CPU_EXECUTE( z80 )
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static CPU_BURN( z80 )
|
static CPU_BURN( z80 )
|
||||||
{
|
{
|
||||||
z80_state *z80 = device->token;
|
z80_state *z80 = get_safe_token(device);
|
||||||
|
|
||||||
if( cycles > 0 )
|
if( cycles > 0 )
|
||||||
{
|
{
|
||||||
@ -3577,7 +3586,7 @@ static void set_irq_line(z80_state *z80, int irqline, int state)
|
|||||||
|
|
||||||
static CPU_IMPORT_STATE( z80 )
|
static CPU_IMPORT_STATE( z80 )
|
||||||
{
|
{
|
||||||
z80_state *cpustate = device->token;
|
z80_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (entry->index)
|
switch (entry->index)
|
||||||
{
|
{
|
||||||
@ -3595,7 +3604,7 @@ static CPU_IMPORT_STATE( z80 )
|
|||||||
|
|
||||||
static CPU_EXPORT_STATE( z80 )
|
static CPU_EXPORT_STATE( z80 )
|
||||||
{
|
{
|
||||||
z80_state *cpustate = device->token;
|
z80_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (entry->index)
|
switch (entry->index)
|
||||||
{
|
{
|
||||||
@ -3616,7 +3625,7 @@ static CPU_EXPORT_STATE( z80 )
|
|||||||
|
|
||||||
static CPU_SET_INFO( z80 )
|
static CPU_SET_INFO( z80 )
|
||||||
{
|
{
|
||||||
z80_state *z80 = device->token;
|
z80_state *z80 = get_safe_token(device);
|
||||||
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 --- */
|
||||||
@ -3624,12 +3633,12 @@ static CPU_SET_INFO( z80 )
|
|||||||
case CPUINFO_INT_INPUT_STATE + 0: set_irq_line(z80, 0, info->i); break;
|
case CPUINFO_INT_INPUT_STATE + 0: set_irq_line(z80, 0, info->i); break;
|
||||||
|
|
||||||
/* --- the following bits of info are set as pointers to data or functions --- */
|
/* --- the following bits of info are set as pointers to data or functions --- */
|
||||||
case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_op: cc[Z80_TABLE_op] = info->p; break;
|
case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_op: cc[Z80_TABLE_op] = (const UINT8 *)info->p; break;
|
||||||
case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_cb: cc[Z80_TABLE_cb] = info->p; break;
|
case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_cb: cc[Z80_TABLE_cb] = (const UINT8 *)info->p; break;
|
||||||
case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_ed: cc[Z80_TABLE_ed] = info->p; break;
|
case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_ed: cc[Z80_TABLE_ed] = (const UINT8 *)info->p; break;
|
||||||
case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_xy: cc[Z80_TABLE_xy] = info->p; break;
|
case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_xy: cc[Z80_TABLE_xy] = (const UINT8 *)info->p; break;
|
||||||
case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_xycb: cc[Z80_TABLE_xycb] = info->p; break;
|
case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_xycb: cc[Z80_TABLE_xycb] = (const UINT8 *)info->p; break;
|
||||||
case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_ex: cc[Z80_TABLE_ex] = info->p; break;
|
case CPUINFO_PTR_Z80_CYCLE_TABLE + Z80_TABLE_ex: cc[Z80_TABLE_ex] = (const UINT8 *)info->p; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3641,7 +3650,7 @@ static CPU_SET_INFO( z80 )
|
|||||||
|
|
||||||
CPU_GET_INFO( z80 )
|
CPU_GET_INFO( z80 )
|
||||||
{
|
{
|
||||||
z80_state *z80 = (device != NULL) ? device->token : NULL;
|
z80_state *z80 = (device != NULL && device->token != NULL) ? get_safe_token(device) : 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 --- */
|
||||||
|
@ -29,7 +29,7 @@ z80_daisy_state *z80daisy_init(const device_config *cpudevice, const z80_daisy_c
|
|||||||
/* create a linked list of devices */
|
/* create a linked list of devices */
|
||||||
for ( ; daisy->devname != NULL; daisy++)
|
for ( ; daisy->devname != NULL; daisy++)
|
||||||
{
|
{
|
||||||
*tailptr = auto_malloc(sizeof(**tailptr));
|
*tailptr = (z80_daisy_state *)auto_malloc(sizeof(**tailptr));
|
||||||
(*tailptr)->next = NULL;
|
(*tailptr)->next = NULL;
|
||||||
(*tailptr)->device = devtag_get_device(cpudevice->machine, device_inherit_tag(tempstring, cpudevice->tag, daisy->devname));
|
(*tailptr)->device = devtag_get_device(cpudevice->machine, device_inherit_tag(tempstring, cpudevice->tag, daisy->devname));
|
||||||
if ((*tailptr)->device == NULL)
|
if ((*tailptr)->device == NULL)
|
||||||
|
@ -86,6 +86,15 @@ struct _z8000_state
|
|||||||
|
|
||||||
#include "z8000cpu.h"
|
#include "z8000cpu.h"
|
||||||
|
|
||||||
|
INLINE z8000_state *get_safe_token(const device_config *device)
|
||||||
|
{
|
||||||
|
assert(device != NULL);
|
||||||
|
assert(device->token != NULL);
|
||||||
|
assert(device->type == CPU);
|
||||||
|
assert(cpu_get_type(device) == CPU_Z8000);
|
||||||
|
return (z8000_state *)device->token;
|
||||||
|
}
|
||||||
|
|
||||||
/* opcode execution table */
|
/* opcode execution table */
|
||||||
Z8000_exec *z8000_exec = NULL;
|
Z8000_exec *z8000_exec = NULL;
|
||||||
|
|
||||||
@ -335,7 +344,7 @@ INLINE void Interrupt(z8000_state *cpustate)
|
|||||||
|
|
||||||
static CPU_INIT( z8000 )
|
static CPU_INIT( z8000 )
|
||||||
{
|
{
|
||||||
z8000_state *cpustate = device->token;
|
z8000_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->irq_callback = irqcallback;
|
cpustate->irq_callback = irqcallback;
|
||||||
cpustate->device = device;
|
cpustate->device = device;
|
||||||
@ -349,7 +358,7 @@ static CPU_INIT( z8000 )
|
|||||||
|
|
||||||
static CPU_RESET( z8000 )
|
static CPU_RESET( z8000 )
|
||||||
{
|
{
|
||||||
z8000_state *cpustate = device->token;
|
z8000_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpu_irq_callback save_irqcallback = cpustate->irq_callback;
|
cpu_irq_callback save_irqcallback = cpustate->irq_callback;
|
||||||
memset(cpustate, 0, sizeof(*cpustate));
|
memset(cpustate, 0, sizeof(*cpustate));
|
||||||
@ -368,7 +377,7 @@ static CPU_EXIT( z8000 )
|
|||||||
|
|
||||||
static CPU_EXECUTE( z8000 )
|
static CPU_EXECUTE( z8000 )
|
||||||
{
|
{
|
||||||
z8000_state *cpustate = device->token;
|
z8000_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cpustate->icount = cycles;
|
cpustate->icount = cycles;
|
||||||
|
|
||||||
@ -461,7 +470,7 @@ static void set_irq_line(z8000_state *cpustate, int irqline, int state)
|
|||||||
|
|
||||||
static CPU_SET_INFO( z8000 )
|
static CPU_SET_INFO( z8000 )
|
||||||
{
|
{
|
||||||
z8000_state *cpustate = device->token;
|
z8000_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
@ -507,7 +516,7 @@ static CPU_SET_INFO( z8000 )
|
|||||||
|
|
||||||
CPU_GET_INFO( z8000 )
|
CPU_GET_INFO( z8000 )
|
||||||
{
|
{
|
||||||
z8000_state *cpustate = (device != NULL) ? device->token : NULL;
|
z8000_state *cpustate = (device != NULL && device->token != NULL) ? get_safe_token(device) : NULL;
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user