mirror of
https://github.com/holub/mame
synced 2025-05-29 00:53:09 +03:00
CDP1802:
- fixed state code output and load mode
This commit is contained in:
parent
7e4e85f2e1
commit
b214d44851
@ -48,6 +48,7 @@ struct _cdp1802_state
|
|||||||
|
|
||||||
/* cpu state */
|
/* cpu state */
|
||||||
cdp1802_cpu_state state; /* processor state */
|
cdp1802_cpu_state state; /* processor state */
|
||||||
|
cdp1802_state_code state_code; /* state code */
|
||||||
cdp1802_control_mode mode; /* control mode */
|
cdp1802_control_mode mode; /* control mode */
|
||||||
cdp1802_control_mode prevmode; /* previous control mode */
|
cdp1802_control_mode prevmode; /* previous control mode */
|
||||||
|
|
||||||
@ -101,6 +102,7 @@ static const cpu_state_entry state_array[] =
|
|||||||
CDP1802_STATE_ENTRY(Re, "%04X", r[14], 0xffff, 0)
|
CDP1802_STATE_ENTRY(Re, "%04X", r[14], 0xffff, 0)
|
||||||
CDP1802_STATE_ENTRY(Rf, "%04X", r[15], 0xffff, 0)
|
CDP1802_STATE_ENTRY(Rf, "%04X", r[15], 0xffff, 0)
|
||||||
|
|
||||||
|
CDP1802_STATE_ENTRY(SC, "%1u", state_code, 0x3, CPUSTATE_NOSHOW)
|
||||||
CDP1802_STATE_ENTRY(DF, "%1u", df, 0x1, CPUSTATE_NOSHOW)
|
CDP1802_STATE_ENTRY(DF, "%1u", df, 0x1, CPUSTATE_NOSHOW)
|
||||||
CDP1802_STATE_ENTRY(IE, "%1u", ie, 0x1, CPUSTATE_NOSHOW)
|
CDP1802_STATE_ENTRY(IE, "%1u", ie, 0x1, CPUSTATE_NOSHOW)
|
||||||
CDP1802_STATE_ENTRY(Q, "%1u", q, 0x1, CPUSTATE_NOSHOW)
|
CDP1802_STATE_ENTRY(Q, "%1u", q, 0x1, CPUSTATE_NOSHOW)
|
||||||
@ -243,6 +245,7 @@ static void cdp1802_output_state_code(const device_config *device)
|
|||||||
if (cpustate->intf->sc_w)
|
if (cpustate->intf->sc_w)
|
||||||
{
|
{
|
||||||
cdp1802_state_code state_code = CDP1802_STATE_CODE_S0_FETCH;
|
cdp1802_state_code state_code = CDP1802_STATE_CODE_S0_FETCH;
|
||||||
|
int sc0, sc1;
|
||||||
|
|
||||||
switch (cpustate->state)
|
switch (cpustate->state)
|
||||||
{
|
{
|
||||||
@ -266,7 +269,10 @@ static void cdp1802_output_state_code(const device_config *device)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
cpustate->intf->sc_w(device, state_code);
|
sc0 = BIT(state_code, 0);
|
||||||
|
sc1 = BIT(state_code, 1);
|
||||||
|
|
||||||
|
cpustate->intf->sc_w(device, state_code, sc0, sc1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -274,8 +280,6 @@ static void cdp1802_run(const device_config *device)
|
|||||||
{
|
{
|
||||||
cdp1802_state *cpustate = get_safe_token(device);
|
cdp1802_state *cpustate = get_safe_token(device);
|
||||||
|
|
||||||
cdp1802_output_state_code(device);
|
|
||||||
|
|
||||||
switch (cpustate->state)
|
switch (cpustate->state)
|
||||||
{
|
{
|
||||||
case CDP1802_STATE_1_RESET:
|
case CDP1802_STATE_1_RESET:
|
||||||
@ -885,10 +889,24 @@ static CPU_EXECUTE( cdp1802 )
|
|||||||
switch (cpustate->mode)
|
switch (cpustate->mode)
|
||||||
{
|
{
|
||||||
case CDP1802_MODE_LOAD:
|
case CDP1802_MODE_LOAD:
|
||||||
I = 0;
|
if (cpustate->prevmode == CDP1802_MODE_RESET)
|
||||||
N = 0;
|
{
|
||||||
cpustate->state = CDP1802_STATE_1_EXECUTE;
|
cpustate->prevmode = CDP1802_MODE_LOAD;
|
||||||
cdp1802_run(device);
|
|
||||||
|
/* execute initialization cycle */
|
||||||
|
cpustate->state = CDP1802_STATE_1_INIT;
|
||||||
|
cdp1802_run(device);
|
||||||
|
|
||||||
|
/* next state is IDLE */
|
||||||
|
cpustate->state = CDP1802_STATE_1_EXECUTE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* idle */
|
||||||
|
I = 0;
|
||||||
|
N = 0;
|
||||||
|
cdp1802_run(device);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CDP1802_MODE_RESET:
|
case CDP1802_MODE_RESET:
|
||||||
@ -905,6 +923,7 @@ static CPU_EXECUTE( cdp1802 )
|
|||||||
{
|
{
|
||||||
case CDP1802_MODE_LOAD:
|
case CDP1802_MODE_LOAD:
|
||||||
// RUN mode cannot be initiated from LOAD mode
|
// RUN mode cannot be initiated from LOAD mode
|
||||||
|
logerror("CDP1802 '%s' Tried to initiate RUN mode from LOAD mode\n", device->tag);
|
||||||
cpustate->mode = CDP1802_MODE_LOAD;
|
cpustate->mode = CDP1802_MODE_LOAD;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -926,6 +945,8 @@ static CPU_EXECUTE( cdp1802 )
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cdp1802_output_state_code(device);
|
||||||
}
|
}
|
||||||
while (cpustate->icount > 0);
|
while (cpustate->icount > 0);
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ typedef enum _cdp1802_control_mode cdp1802_control_mode;
|
|||||||
|
|
||||||
enum _cdp1802_state_code
|
enum _cdp1802_state_code
|
||||||
{
|
{
|
||||||
CDP1802_STATE_CODE_S0_FETCH,
|
CDP1802_STATE_CODE_S0_FETCH = 0,
|
||||||
CDP1802_STATE_CODE_S1_EXECUTE,
|
CDP1802_STATE_CODE_S1_EXECUTE,
|
||||||
CDP1802_STATE_CODE_S2_DMA,
|
CDP1802_STATE_CODE_S2_DMA,
|
||||||
CDP1802_STATE_CODE_S3_INTERRUPT
|
CDP1802_STATE_CODE_S3_INTERRUPT
|
||||||
@ -58,7 +58,7 @@ enum
|
|||||||
CDP1802_P, CDP1802_X, CDP1802_D, CDP1802_B, CDP1802_T,
|
CDP1802_P, CDP1802_X, CDP1802_D, CDP1802_B, CDP1802_T,
|
||||||
CDP1802_R0, CDP1802_R1, CDP1802_R2, CDP1802_R3, CDP1802_R4, CDP1802_R5, CDP1802_R6, CDP1802_R7,
|
CDP1802_R0, CDP1802_R1, CDP1802_R2, CDP1802_R3, CDP1802_R4, CDP1802_R5, CDP1802_R6, CDP1802_R7,
|
||||||
CDP1802_R8, CDP1802_R9, CDP1802_Ra, CDP1802_Rb, CDP1802_Rc, CDP1802_Rd, CDP1802_Re, CDP1802_Rf,
|
CDP1802_R8, CDP1802_R9, CDP1802_Ra, CDP1802_Rb, CDP1802_Rc, CDP1802_Rd, CDP1802_Re, CDP1802_Rf,
|
||||||
CDP1802_DF, CDP1802_IE, CDP1802_Q, CDP1802_N, CDP1802_I,
|
CDP1802_DF, CDP1802_IE, CDP1802_Q, CDP1802_N, CDP1802_I, CDP1802_SC,
|
||||||
CDP1802_GENPC = REG_GENPC
|
CDP1802_GENPC = REG_GENPC
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -68,8 +68,8 @@ typedef cdp1802_control_mode (*cdp1802_mode_read_func)(const device_config *devi
|
|||||||
typedef UINT8 (*cdp1802_ef_read_func)(const device_config *device);
|
typedef UINT8 (*cdp1802_ef_read_func)(const device_config *device);
|
||||||
#define CDP1802_EF_READ(name) UINT8 name(const device_config *device)
|
#define CDP1802_EF_READ(name) UINT8 name(const device_config *device)
|
||||||
|
|
||||||
typedef void (*cdp1802_sc_write_func)(const device_config *device, cdp1802_state_code state);
|
typedef void (*cdp1802_sc_write_func)(const device_config *device, cdp1802_state_code state, int sc0, int sc1);
|
||||||
#define CDP1802_SC_WRITE(name) void name(const device_config *device, cdp1802_state_code state)
|
#define CDP1802_SC_WRITE(name) void name(const device_config *device, cdp1802_state_code state, int sc0, int sc1)
|
||||||
|
|
||||||
/* interface */
|
/* interface */
|
||||||
typedef struct _cdp1802_interface cdp1802_interface;
|
typedef struct _cdp1802_interface cdp1802_interface;
|
||||||
|
Loading…
Reference in New Issue
Block a user