summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
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
commitb214d44851452a6cba7b53cf8b90f9d35208158e (patch)
tree174d48f2410aa8b64c955804c0f7a7c7038e6995
parent7e4e85f2e1ab199a7ebf06fb11afa07fee61cbf2 (diff)
CDP1802:
- fixed state code output and load mode
-rw-r--r--src/emu/cpu/cdp1802/cdp1802.c35
-rw-r--r--src/emu/cpu/cdp1802/cdp1802.h8
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;