- fixed state code output and load mode
This commit is contained in:
Curt Coder 2009-07-17 11:27:16 +00:00
parent 7e4e85f2e1
commit b214d44851
2 changed files with 32 additions and 11 deletions

View File

@ -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);

View File

@ -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;