diff options
author | Curt Coder <curtcoder@mail.com> | 2009-07-17 11:27:16 +0000 |
---|---|---|
committer | Curt Coder <curtcoder@mail.com> | 2009-07-17 11:27:16 +0000 |
commit | b214d44851452a6cba7b53cf8b90f9d35208158e (patch) | |
tree | 174d48f2410aa8b64c955804c0f7a7c7038e6995 | |
parent | 7e4e85f2e1ab199a7ebf06fb11afa07fee61cbf2 (diff) |
CDP1802:
- fixed state code output and load mode
-rw-r--r-- | src/emu/cpu/cdp1802/cdp1802.c | 35 | ||||
-rw-r--r-- | src/emu/cpu/cdp1802/cdp1802.h | 8 |
2 files changed, 32 insertions, 11 deletions
diff --git a/src/emu/cpu/cdp1802/cdp1802.c b/src/emu/cpu/cdp1802/cdp1802.c index a26fe710b19..ce648cb6075 100644 --- a/src/emu/cpu/cdp1802/cdp1802.c +++ b/src/emu/cpu/cdp1802/cdp1802.c @@ -48,6 +48,7 @@ struct _cdp1802_state /* cpu state */ cdp1802_cpu_state state; /* processor state */ + cdp1802_state_code state_code; /* state code */ cdp1802_control_mode mode; /* 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(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(IE, "%1u", ie, 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) { cdp1802_state_code state_code = CDP1802_STATE_CODE_S0_FETCH; + int sc0, sc1; switch (cpustate->state) { @@ -266,7 +269,10 @@ static void cdp1802_output_state_code(const device_config *device) 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_output_state_code(device); - switch (cpustate->state) { case CDP1802_STATE_1_RESET: @@ -885,10 +889,24 @@ static CPU_EXECUTE( cdp1802 ) switch (cpustate->mode) { case CDP1802_MODE_LOAD: - I = 0; - N = 0; - cpustate->state = CDP1802_STATE_1_EXECUTE; - cdp1802_run(device); + if (cpustate->prevmode == CDP1802_MODE_RESET) + { + cpustate->prevmode = CDP1802_MODE_LOAD; + + /* 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; case CDP1802_MODE_RESET: @@ -905,6 +923,7 @@ static CPU_EXECUTE( cdp1802 ) { case CDP1802_MODE_LOAD: // 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; break; @@ -926,6 +945,8 @@ static CPU_EXECUTE( cdp1802 ) } break; } + + cdp1802_output_state_code(device); } while (cpustate->icount > 0); diff --git a/src/emu/cpu/cdp1802/cdp1802.h b/src/emu/cpu/cdp1802/cdp1802.h index c1bd3a6300a..dcbeb879898 100644 --- a/src/emu/cpu/cdp1802/cdp1802.h +++ b/src/emu/cpu/cdp1802/cdp1802.h @@ -46,7 +46,7 @@ typedef enum _cdp1802_control_mode cdp1802_control_mode; enum _cdp1802_state_code { - CDP1802_STATE_CODE_S0_FETCH, + CDP1802_STATE_CODE_S0_FETCH = 0, CDP1802_STATE_CODE_S1_EXECUTE, CDP1802_STATE_CODE_S2_DMA, CDP1802_STATE_CODE_S3_INTERRUPT @@ -58,7 +58,7 @@ enum 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_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 }; @@ -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); #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); -#define CDP1802_SC_WRITE(name) void name(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, int sc0, int sc1) /* interface */ typedef struct _cdp1802_interface cdp1802_interface; |