From 0f268291ed957b76c35a8f91915053dda1147c67 Mon Sep 17 00:00:00 2001 From: Curt Coder Date: Tue, 19 Oct 2010 13:01:57 +0000 Subject: [PATCH] Removed old CDP1802 CPU. (no whatsnew) --- .gitattributes | 3 - src/emu/cpu/cdp1802/1802dasm.c | 174 ----- src/emu/cpu/cdp1802/cdp1802.c | 1110 -------------------------------- src/emu/cpu/cdp1802/cdp1802.h | 99 --- src/emu/cpu/cpu.mak | 15 - src/mame/mame.mak | 1 - 6 files changed, 1402 deletions(-) delete mode 100644 src/emu/cpu/cdp1802/1802dasm.c delete mode 100644 src/emu/cpu/cdp1802/cdp1802.c delete mode 100644 src/emu/cpu/cdp1802/cdp1802.h diff --git a/.gitattributes b/.gitattributes index 706ca65df44..ce4cd122e0f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -56,9 +56,6 @@ src/emu/cpu/avr8/avr8dasm.c svneol=native#text/plain src/emu/cpu/ccpu/ccpu.c svneol=native#text/plain src/emu/cpu/ccpu/ccpu.h svneol=native#text/plain src/emu/cpu/ccpu/ccpudasm.c svneol=native#text/plain -src/emu/cpu/cdp1802/1802dasm.c svneol=native#text/plain -src/emu/cpu/cdp1802/cdp1802.c svneol=native#text/plain -src/emu/cpu/cdp1802/cdp1802.h svneol=native#text/plain src/emu/cpu/cop400/cop400.c svneol=native#text/plain src/emu/cpu/cop400/cop400.h svneol=native#text/plain src/emu/cpu/cop400/cop400op.c svneol=native#text/plain diff --git a/src/emu/cpu/cdp1802/1802dasm.c b/src/emu/cpu/cdp1802/1802dasm.c deleted file mode 100644 index 9271c3bcbc6..00000000000 --- a/src/emu/cpu/cdp1802/1802dasm.c +++ /dev/null @@ -1,174 +0,0 @@ -/***************************************************************************** - * - * disasm.c - * portable cosmac cdp1802 emulator interface - * - * Copyright Peter Trauner, all rights reserved. - * - * - This source code is released as freeware for non-commercial purposes. - * - You are free to use and redistribute this code in modified or - * unmodified form, provided you list me in the credits. - * - If you modify this source code, you must add a notice to each modified - * source file that it has been changed. If you're a nice person, you - * will clearly mark each change too. :) - * - If you wish to use this for commercial purposes, please contact me at - * peter.trauner@jk.uni-linz.ac.at - * - The author of this copywritten work reserves the right to change the - * terms of its usage and license at any time, including retroactively - * - This entire notice must remain in the source code. - * - *****************************************************************************/ - -#include "emu.h" -#include "debugger.h" - -#include "cdp1802.h" - -typedef enum -{ - Ill, - Imm, - Imp, - Imp2, // lownibble contains register number - Imp3, // bit 0,1,2 1..7 contains n0,n1,n2 level - Low, // only low byte of address specified - Abs -} Adr; - -static const struct { const char *mnemonic; Adr adr; } table[]={ - { "IDL", Imp }, { "LDN", Imp2},{ 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - - { "INC", Imp2},{ 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - - { "DEC", Imp2},{ 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - - - { "BR", Low }, { "BQ", Low }, { "BZ", Low }, { "BDF", Low }, - { "B1", Low }, { "B2", Low }, { "B3", Low }, { "B4", Low }, - { "SKP", Low }, { "BNQ", Low }, { "BNZ", Low }, { "BNF", Low }, - { "BN1", Low }, { "BN2", Low }, { "BN3", Low }, { "BN4", Low }, - - { "LDA", Imp2},{ 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - - { "STR", Imp2},{ 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - - { "IRX", Imp } ,{ "OUT", Imp3},{ 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - { 0 } ,{ "INP", Imp3},{ 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - - { "RET", Imp }, { "DIS", Imp }, { "LDXA", Imp }, { "STXD", Imp }, - { "ADC", Imp }, { "SDB", Imp }, { "SHRC", Imp }, { "SMB", Imp }, - { "SAV", Imp }, { "MARK", Imp }, { "REQ", Imp }, { "SEQ", Imp }, - { "ADCI", Imm }, { "SDBI", Imm }, { "SHLC", Imp }, { "SMBI", Imm }, - - - { "GLO", Imp2},{ 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - - { "GHI", Imp2},{ 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - - { "PLO", Imp2},{ 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - - { "PHI", Imp2},{ 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - - { "LBR", Abs }, { "LBQ", Abs }, { "LBZ", Abs }, { "LBDF", Abs }, - { "NOP", Imp }, { "LSNQ", Imp }, { "LSNZ", Imp }, { "LSNF", Imp }, - { "LSKP", Imp }, { "LBNQ", Abs }, { "LBNZ", Abs }, { "LBNF", Abs }, - { "LSIE", Imp }, { "LSQ", Imp }, { "LSZ", Imp }, { "LSDF", Imp }, - - { "SEP", Imp2},{ 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - - { "SEX", Imp2},{ 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, - - { "LDX", Imp }, { "OR", Imp }, { "AND", Imp }, { "XOR", Imp }, - { "ADD", Imp }, { "SD", Imp }, { "SHR", Imp }, { "SM", Imp }, - { "LDI", Imm }, { "ORI", Imm }, { "ANI", Imm }, { "XRI", Imm }, - { "ADI", Imm }, { "SDI", Imm }, { "SHL", Imp }, { "SMI", Imm }, - -}; - -CPU_DISASSEMBLE( cdp1802 ) -{ - UINT32 flags = 0; - int oldpc = pc; - int oper; - UINT16 absolut; - oldpc&=0xffff; - pc=oldpc; - oper=oprom[pc++ - oldpc]; - - switch(oper&0xf0) { - case 0: - if (oper==0) { - sprintf(buffer,"%-5s",table[oper].mnemonic); - } else { - sprintf(buffer,"%-5sR%.1x",table[(oper&0xf0)|1].mnemonic, oper&0x0f); - } - break; - case 0xd0: - flags = DASMFLAG_STEP_OVER; - /* fall through */ - case 0x10: - case 0x20: - case 0x40: - case 0x50: - case 0x80: - case 0x90: - case 0xa0: - case 0xb0: - case 0xe0: - sprintf(buffer,"%-5sR%.1x",table[oper&0xf0].mnemonic, oper&0x0f); - break; - default: - switch(oper&0xf8) { - case 0x60: - if (oper==0x60) { - sprintf(buffer,"%-5s",table[oper].mnemonic); - } else { - sprintf(buffer,"%-5s%d",table[(oper&0xf8)|1].mnemonic, oper&0x7); - } - break; - case 0x68: - sprintf(buffer,"%-5s%d",table[(oper&0xf8)|1].mnemonic, oper&0x7); - break; - default: - switch (table[oper].adr) { - case Imp: - sprintf(buffer,"%-5s",table[oper].mnemonic); - if (oper == 0x70 || oper == 0x71) - flags = DASMFLAG_STEP_OUT; - break; - case Imm: - sprintf(buffer,"%-5s#%.2x",table[oper].mnemonic,oprom[pc++ - oldpc]); - break; - case Low: - absolut=oprom[pc++ - oldpc]; - absolut|=pc&0xff00; - sprintf(buffer,"%-5s%.4x",table[oper].mnemonic,absolut); - break; - case Abs: - absolut=oprom[pc++ - oldpc]<<8; - absolut|=oprom[pc++ - oldpc]; - sprintf(buffer,"%-5s%.4x",table[oper].mnemonic,absolut); - break; - default: - sprintf(buffer,"%-5s%.2x","ill",oper); - break; - } - break; - } - break; - } - - return (pc-oldpc) | flags | DASMFLAG_SUPPORTED; -} - diff --git a/src/emu/cpu/cdp1802/cdp1802.c b/src/emu/cpu/cdp1802/cdp1802.c deleted file mode 100644 index c9ac2a57039..00000000000 --- a/src/emu/cpu/cdp1802/cdp1802.c +++ /dev/null @@ -1,1110 +0,0 @@ -#include "emu.h" -#include "debugger.h" -#include "cdp1802.h" - -#define CDP1802_CYCLES_RESET 8 -#define CDP1802_CYCLES_INIT 8 // really 9, but needs to be 8 to synchronize cdp1861 video timings -#define CDP1802_CYCLES_FETCH 8 -#define CDP1802_CYCLES_EXECUTE 8 -#define CDP1802_CYCLES_DMA 8 -#define CDP1802_CYCLES_INTERRUPT 8 - -enum _cdp1802_cpu_state -{ - CDP1802_STATE_0_FETCH, - CDP1802_STATE_1_RESET, - CDP1802_STATE_1_INIT, - CDP1802_STATE_1_EXECUTE, - CDP1802_STATE_2_DMA_IN, - CDP1802_STATE_2_DMA_OUT, - CDP1802_STATE_3_INT -}; -typedef enum _cdp1802_cpu_state cdp1802_cpu_state; - -typedef struct _cdp1802_state cdp1802_state; -struct _cdp1802_state -{ - const cdp1802_interface *intf; - - address_space *program; - direct_read_data *direct; - address_space *io; - - devcb_resolved_write_line out_q_func; - devcb_resolved_read8 in_dma_func; - devcb_resolved_write8 out_dma_func; - - /* registers */ - UINT8 d; /* data register (accumulator) */ - int df; /* data flag (ALU carry) */ - UINT8 b; /* auxiliary holding register */ - UINT16 r[16]; /* scratchpad registers */ - UINT8 p; /* designates which register is Program Counter */ - UINT8 x; /* designates which register is Data Pointer */ - UINT8 n; /* low-order instruction digit */ - UINT8 i; /* high-order instruction digit */ - UINT8 t; /* temporary register */ - int ie; /* interrupt enable */ - int q; /* output flip-flop */ - UINT8 flags; // used for I/O only - - /* 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 */ - - /* input lines */ - int irq; /* interrupt request */ - int dmain; /* DMA input request */ - int dmaout; /* DMA output request */ - int ef; /* external flags */ - - /* execution logic */ - int icount; /* instruction counter */ -}; - -/*************************************************************************** - CPU STATE DESCRIPTION -***************************************************************************/ - -INLINE cdp1802_state *get_safe_token(running_device *device) -{ - assert(device != NULL); - assert(device->type() == CDP1802); - return (cdp1802_state *)downcast(device)->token(); -} - -#define OPCODE_R(addr) cpustate->direct->read_decrypted_byte(addr) -#define RAM_R(addr) cpustate->program->read_byte(addr) -#define RAM_W(addr, data) cpustate->program->write_byte(addr, data) -#define IO_R(addr) cpustate->io->read_byte(addr) -#define IO_W(addr, data) cpustate->io->write_byte(addr, data) - -#define P cpustate->p -#define X cpustate->x -#define D cpustate->d -#define B cpustate->b -#define T cpustate->t -#define R cpustate->r -#define DF cpustate->df -#define IE cpustate->ie -#define Q cpustate->q -#define N cpustate->n -#define I cpustate->i - -INLINE void cdp1802_add(cdp1802_state *cpustate, int left, int right) -{ - int result = left + right; - D = result & 0xff; - DF = (result & 0x100) >> 8; -} - -INLINE void cdp1802_add_carry(cdp1802_state *cpustate, int left, int right) -{ - int result = left + right + DF; - D = result & 0xff; - DF = (result & 0x100) >> 8; -} - -INLINE void cdp1802_sub(cdp1802_state *cpustate, int left, int right) -{ - int result = left + (~right & 0xff) + 1; - - D = result & 0xff; - DF = (result & 0x100) >> 8; -} - -INLINE void cdp1802_sub_carry(cdp1802_state *cpustate, int left, int right) -{ - int result = left + (~right & 0xff) + DF; - - D = result & 0xff; - DF = (result & 0x100) >> 8; -} - -INLINE void cdp1802_short_branch(cdp1802_state *cpustate, int taken) -{ - if (taken) - { - R[P] = (R[P] & 0xff00) | OPCODE_R(R[P]); - } - else - { - R[P] = R[P] + 1; - } -} - -INLINE void cdp1802_long_branch(cdp1802_state *cpustate, int taken) -{ - if (taken) - { - // S1#1 - - B = OPCODE_R(R[P]); - R[P] = R[P] + 1; - - // S1#2 - - R[P] = (B << 8) | OPCODE_R(R[P]); - } - else - { - // S1#1 - - R[P] = R[P] + 1; - - // S1#2 - - R[P] = R[P] + 1; - } -} - -INLINE void cdp1802_long_skip(cdp1802_state *cpustate, int taken) -{ - if (taken) - { - // S1#1 - - R[P] = R[P] + 1; - - // S1#2 - - R[P] = R[P] + 1; - } -} - -static void cdp1802_sample_ef(running_device *device) -{ - cdp1802_state *cpustate = get_safe_token(device); - - if (cpustate->intf->ef_r) - { - cpustate->ef = cpustate->intf->ef_r(device) & 0x0f; - } - else - { - cpustate->ef = 0x0f; - } -} - -static void cdp1802_output_state_code(running_device *device) -{ - cdp1802_state *cpustate = get_safe_token(device); - - if (cpustate->intf->sc_w) - { - cdp1802_state_code state_code = CDP1802_STATE_CODE_S0_FETCH; - int sc0, sc1; - - switch (cpustate->state) - { - case CDP1802_STATE_0_FETCH: - state_code = CDP1802_STATE_CODE_S0_FETCH; - break; - - case CDP1802_STATE_1_EXECUTE: - case CDP1802_STATE_1_RESET: - case CDP1802_STATE_1_INIT: - state_code = CDP1802_STATE_CODE_S1_EXECUTE; - break; - - case CDP1802_STATE_2_DMA_IN: - case CDP1802_STATE_2_DMA_OUT: - state_code = CDP1802_STATE_CODE_S2_DMA; - break; - - case CDP1802_STATE_3_INT: - state_code = CDP1802_STATE_CODE_S3_INTERRUPT; - break; - } - - sc0 = BIT(state_code, 0); - sc1 = BIT(state_code, 1); - - cpustate->intf->sc_w(device, state_code, sc0, sc1); - } -} - -static void cdp1802_run(running_device *device) -{ - cdp1802_state *cpustate = get_safe_token(device); - - switch (cpustate->state) - { - case CDP1802_STATE_1_RESET: - - I = 0; - N = 0; - Q = 0; - IE = 1; - - cpustate->icount -= CDP1802_CYCLES_RESET; - - debugger_instruction_hook(device, R[P]); - - break; - - case CDP1802_STATE_1_INIT: - - X = 0; - P = 0; - R[0] = 0; - - cpustate->icount -= CDP1802_CYCLES_INIT; - - if (cpustate->dmain) - { - cpustate->state = CDP1802_STATE_2_DMA_IN; - } - else if (cpustate->dmaout) - { - cpustate->state = CDP1802_STATE_2_DMA_OUT; - } - else - { - cpustate->state = CDP1802_STATE_0_FETCH; - } - - debugger_instruction_hook(device, R[P]); - - break; - - case CDP1802_STATE_0_FETCH: - { - UINT8 opcode = OPCODE_R(R[P]); - - I = opcode >> 4; - N = opcode & 0x0f; - R[P] = R[P] + 1; - - cpustate->icount -= CDP1802_CYCLES_FETCH; - - cpustate->state = CDP1802_STATE_1_EXECUTE; - } - break; - - case CDP1802_STATE_1_EXECUTE: - - cdp1802_sample_ef(device); - - switch (I) - { - case 0: - if (N > 0) - { - D = RAM_R(R[N]); - } - break; - - case 1: - R[N] = R[N] + 1; - break; - - case 2: - R[N] = R[N] - 1; - break; - - case 3: - switch (N) - { - case 0: - cdp1802_short_branch(cpustate, 1); - break; - - case 1: - cdp1802_short_branch(cpustate, Q == 1); - break; - - case 2: - cdp1802_short_branch(cpustate, D == 0); - break; - - case 3: - cdp1802_short_branch(cpustate, DF == 1); - break; - - case 4: - cdp1802_short_branch(cpustate, (cpustate->ef & EF1) ? 0 : 1); - break; - - case 5: - cdp1802_short_branch(cpustate, (cpustate->ef & EF2) ? 0 : 1); - break; - - case 6: - cdp1802_short_branch(cpustate, (cpustate->ef & EF3) ? 0 : 1); - break; - - case 7: - cdp1802_short_branch(cpustate, (cpustate->ef & EF4) ? 0 : 1); - break; - - case 8: - cdp1802_short_branch(cpustate, 0); - break; - - case 9: - cdp1802_short_branch(cpustate, Q == 0); - break; - - case 0xa: - cdp1802_short_branch(cpustate, D != 0); - break; - - case 0xb: - cdp1802_short_branch(cpustate, DF == 0); - break; - - case 0xc: - cdp1802_short_branch(cpustate, (cpustate->ef & EF1) ? 1 : 0); - break; - - case 0xd: - cdp1802_short_branch(cpustate, (cpustate->ef & EF2) ? 1 : 0); - break; - - case 0xe: - cdp1802_short_branch(cpustate, (cpustate->ef & EF3) ? 1 : 0); - break; - - case 0xf: - cdp1802_short_branch(cpustate, (cpustate->ef & EF4) ? 1 : 0); - break; - } - break; - - case 4: - D = RAM_R(R[N]); - R[N] = R[N] + 1; - break; - - case 5: - RAM_W(R[N], D); - break; - - case 6: - switch (N) - { - case 0: - R[X] = R[X] + 1; - break; - - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - IO_W(N, RAM_R(R[X])); - R[X] = R[X] + 1; - break; - - case 8: - /* - - A note about INP 0 (0x68) from Tom Pittman's "A Short Course in Programming": - - If you look carefully, you will notice that we never studied the opcode "68". - That's because it is not a defined 1802 instruction. It has the form of an INP - instruction, but 0 is not a defined input port, so if you execute it (try it!) - nothing is input. "Nothing" is the answer to a question; it is data, and something - will be put in the accumulator and memory (so now you know what the computer uses - to mean "nothing"). - - However, since the result of the "68" opcode is unpredictable, it should not be - used in your programs. In fact, "68" is the first byte of a series of additional - instructions for the 1804 and 1805 microprocessors. - - http://www.ittybittycomputers.com/IttyBitty/ShortCor.htm - - */ - case 9: - case 0xa: - case 0xb: - case 0xc: - case 0xd: - case 0xe: - case 0xf: - { - UINT8 data = IO_R(N & 0x07); - RAM_W(R[X], data); - D = data; - } - break; - } - break; - - case 7: - switch (N) - { - case 0: - { - UINT8 data = RAM_R(R[X]); - R[X] = R[X] + 1; - P = data & 0xf; - X = data >> 4; - IE = 1; - } - break; - - case 1: - { - UINT8 data = RAM_R(R[X]); - R[X] = R[X] + 1; - P = data & 0xf; - X = data >> 4; - IE = 0; - } - break; - - case 2: - D = RAM_R(R[X]); - R[X] = R[X] + 1; - break; - - case 3: - RAM_W(R[X], D); - R[X] = R[X] - 1; - break; - - case 4: - cdp1802_add_carry(cpustate, RAM_R(R[X]), D); - break; - - case 5: - cdp1802_sub_carry(cpustate, RAM_R(R[X]), D); - break; - - case 6: - { - int b = DF; - DF = D & 1; - D >>= 1; - if (b) D |= 0x80; - } - break; - - case 7: - cdp1802_sub_carry(cpustate, D, RAM_R(R[X])); - break; - - case 8: - RAM_W(R[X], T); - break; - - case 9: - { - UINT8 result = (X << 4) | P; - T = result; - RAM_W(R[2], result); - X = P; - R[2] = R[2] - 1; - } - break; - - case 0xa: - Q = 0; - - devcb_call_write_line(&cpustate->out_q_func, Q); - break; - - case 0xb: - Q = 1; - - devcb_call_write_line(&cpustate->out_q_func, Q); - break; - - case 0xc: - cdp1802_add_carry(cpustate, RAM_R(R[P]), D); - R[P] = R[P] + 1; - break; - - case 0xd: - cdp1802_sub_carry(cpustate, RAM_R(R[P]), D); - R[P] = R[P] + 1; - break; - - case 0xe: - { - int b = DF; - DF = D & 0x80; - D <<= 1; - if (b) D |= 1; - } - break; - - case 0xf: - cdp1802_sub_carry(cpustate, D, RAM_R(R[P])); - R[P] = R[P] + 1; - break; - } - break; - - case 8: - D = R[N] & 0xff; - break; - - case 9: - D = (R[N] >> 8) & 0xff; - break; - - case 0xa: - R[N] = (R[N] & 0xff00) | D; - break; - - case 0xb: - R[N] = (D << 8) | (R[N] & 0xff); - break; - - case 0xc: - cdp1802_output_state_code(device); - - switch (N) - { - case 0: - cdp1802_long_branch(cpustate, 1); - break; - - case 1: - cdp1802_long_branch(cpustate, Q == 1); - break; - - case 2: - cdp1802_long_branch(cpustate, D == 0); - break; - - case 3: - cdp1802_long_branch(cpustate, DF == 1); - break; - - case 4: - // NOP - break; - - case 5: - cdp1802_long_skip(cpustate, Q == 0); - break; - - case 6: - cdp1802_long_skip(cpustate, D != 0); - break; - - case 7: - cdp1802_long_skip(cpustate, DF == 0); - break; - - case 8: - cdp1802_long_skip(cpustate, 1); - break; - - case 9: - cdp1802_long_branch(cpustate, Q == 0); - break; - - case 0xa: - cdp1802_long_branch(cpustate, D != 0); - break; - - case 0xb: - cdp1802_long_branch(cpustate, DF == 0); - break; - - case 0xc: - cdp1802_long_skip(cpustate, IE == 1); - break; - - case 0xd: - cdp1802_long_skip(cpustate, Q == 1); - break; - - case 0xe: - cdp1802_long_skip(cpustate, D == 0); - break; - - case 0xf: - cdp1802_long_skip(cpustate, DF == 1); - break; - } - - cpustate->icount -= CDP1802_CYCLES_EXECUTE; - break; - - case 0xd: - P = N; - break; - - case 0xe: - X = N; - break; - - case 0xf: - switch (N) - { - case 0: - D = RAM_R(R[X]); - break; - - case 1: - D = RAM_R(R[X]) | D; - break; - - case 2: - D = RAM_R(R[X]) & D; - break; - - case 3: - D = RAM_R(R[X]) ^ D; - break; - - case 4: - cdp1802_add(cpustate, RAM_R(R[X]), D); - break; - - case 5: - cdp1802_sub(cpustate, RAM_R(R[X]), D); - break; - - case 6: - DF = D & 0x01; - D = D >> 1; - break; - - case 7: - cdp1802_sub(cpustate, D, RAM_R(R[X])); - break; - - case 8: - D = RAM_R(R[P]); - R[P] = R[P] + 1; - break; - - case 9: - D = RAM_R(R[P]) | D; - R[P] = R[P] + 1; - break; - - case 0xa: - D = RAM_R(R[P]) & D; - R[P] = R[P] + 1; - break; - - case 0xb: - D = RAM_R(R[P]) ^ D; - R[P] = R[P] + 1; - break; - - case 0xc: - cdp1802_add(cpustate, RAM_R(R[P]), D); - R[P] = R[P] + 1; - break; - - case 0xd: - cdp1802_sub(cpustate, RAM_R(R[P]), D); - R[P] = R[P] + 1; - break; - - case 0xe: - DF = (D & 0x80) >> 7; - D = D << 1; - break; - - case 0xf: - cdp1802_sub(cpustate, D, RAM_R(R[P])); - R[P] = R[P] + 1; - break; - } - break; - } - - cpustate->icount -= CDP1802_CYCLES_EXECUTE; - - if (cpustate->dmain) - { - cpustate->state = CDP1802_STATE_2_DMA_IN; - } - else if (cpustate->dmaout) - { - cpustate->state = CDP1802_STATE_2_DMA_OUT; - } - else if (IE && cpustate->irq) - { - cpustate->state = CDP1802_STATE_3_INT; - } - else if ((I > 0) || (N > 0)) // not idling - { - cpustate->state = CDP1802_STATE_0_FETCH; - } - - debugger_instruction_hook(device, R[P]); - - break; - - case CDP1802_STATE_2_DMA_IN: - - RAM_W(R[0], devcb_call_read8(&cpustate->in_dma_func, R[0])); - - R[0] = R[0] + 1; - - cpustate->icount -= CDP1802_CYCLES_DMA; - - if (cpustate->dmain) - { - cpustate->state = CDP1802_STATE_2_DMA_IN; - } - else if (cpustate->dmaout) - { - cpustate->state = CDP1802_STATE_2_DMA_OUT; - } - else if (IE && cpustate->irq) - { - cpustate->state = CDP1802_STATE_3_INT; - } - else if (cpustate->mode == CDP1802_MODE_LOAD) - { - cpustate->state = CDP1802_STATE_1_EXECUTE; - } - else - { - cpustate->state = CDP1802_STATE_0_FETCH; - } - break; - - case CDP1802_STATE_2_DMA_OUT: - - devcb_call_write8(&cpustate->out_dma_func, R[0], RAM_R(R[0])); - - R[0] = R[0] + 1; - - cpustate->icount -= CDP1802_CYCLES_DMA; - - if (cpustate->dmain) - { - cpustate->state = CDP1802_STATE_2_DMA_IN; - } - else if (cpustate->dmaout) - { - cpustate->state = CDP1802_STATE_2_DMA_OUT; - } - else if (IE && cpustate->irq) - { - cpustate->state = CDP1802_STATE_3_INT; - } - else - { - cpustate->state = CDP1802_STATE_0_FETCH; - } - break; - - case CDP1802_STATE_3_INT: - - T = (X << 4) | P; - X = 2; - P = 1; - IE = 0; - - cpustate->icount -= CDP1802_CYCLES_INTERRUPT; - - if (cpustate->dmain) - { - cpustate->state = CDP1802_STATE_2_DMA_IN; - } - else if (cpustate->dmaout) - { - cpustate->state = CDP1802_STATE_2_DMA_OUT; - } - else - { - cpustate->state = CDP1802_STATE_0_FETCH; - } - - debugger_instruction_hook(device, R[P]); - - break; - } -} - -static CPU_EXECUTE( cdp1802 ) -{ - cdp1802_state *cpustate = get_safe_token(device); - - cpustate->prevmode = cpustate->mode; - cpustate->mode = cpustate->intf->mode_r(device); - - do - { - switch (cpustate->mode) - { - case CDP1802_MODE_LOAD: - 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: - cpustate->state = CDP1802_STATE_1_RESET; - cdp1802_run(device); - break; - - case CDP1802_MODE_PAUSE: - cpustate->icount -= 1; - break; - - case CDP1802_MODE_RUN: - switch (cpustate->prevmode) - { - 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; - - case CDP1802_MODE_RESET: - cpustate->prevmode = CDP1802_MODE_RUN; - cpustate->state = CDP1802_STATE_1_INIT; - cdp1802_run(device); - break; - - case CDP1802_MODE_PAUSE: - cpustate->prevmode = CDP1802_MODE_RUN; - cpustate->state = CDP1802_STATE_0_FETCH; - cdp1802_run(device); - break; - - case CDP1802_MODE_RUN: - cdp1802_run(device); - break; - } - break; - } - - cdp1802_output_state_code(device); - } - while (cpustate->icount > 0); -} - -static CPU_RESET( cdp1802 ) -{ - cdp1802_state *cpustate = get_safe_token(device); - - cpustate->mode = CDP1802_MODE_RESET; -} - -static CPU_IMPORT_STATE( cdp1802 ) -{ - cdp1802_state *cpustate = get_safe_token(device); - - switch (entry.index()) - { - case STATE_GENFLAGS: - cpustate->df = (cpustate->flags >> 1) & 1; - cpustate->ie = (cpustate->flags >> 1) & 1; - cpustate->q = (cpustate->flags >> 0) & 1; - break; - } -} - -static CPU_EXPORT_STATE( cdp1802 ) -{ - cdp1802_state *cpustate = get_safe_token(device); - - switch (entry.index()) - { - case STATE_GENFLAGS: - cpustate->flags = (cpustate->df ? 0x04 : 0x00) | - (cpustate->ie ? 0x02 : 0x00) | - (cpustate->q ? 0x01 : 0x00); - break; - } -} - -static CPU_EXPORT_STRING( cdp1802 ) -{ - cdp1802_state *cpustate = get_safe_token(device); - - switch (entry.index()) - { - case STATE_GENFLAGS: - string.printf("%c%c%c", - cpustate->df ? 'D' : '.', - cpustate->ie ? 'I' : '.', - cpustate->q ? 'Q' : '.'); - break; - } -} - -static CPU_INIT( cdp1802 ) -{ - cdp1802_state *cpustate = get_safe_token(device); - int i; - - cpustate->intf = (cdp1802_interface *) device->baseconfig().static_config(); - - /* resolve callbacks */ - devcb_resolve_write_line(&cpustate->out_q_func, &cpustate->intf->out_q_func, device); - devcb_resolve_read8(&cpustate->in_dma_func, &cpustate->intf->in_dma_func, device); - devcb_resolve_write8(&cpustate->out_dma_func, &cpustate->intf->out_dma_func, device); - - /* set up the state table */ - { - device_state_interface *state; - device->interface(state); - state->state_add(STATE_GENPC, "GENPC", R[P]).noshow(); - state->state_add(STATE_GENFLAGS, "GENFLAGS", cpustate->flags).mask(0x7).callimport().callexport().noshow().formatstr("%3s"); - - state->state_add(CDP1802_P, "P", cpustate->p).mask(0xf); - state->state_add(CDP1802_X, "X", cpustate->x).mask(0xf); - state->state_add(CDP1802_D, "D", cpustate->d); - state->state_add(CDP1802_B, "B", cpustate->b); - state->state_add(CDP1802_T, "T", cpustate->t); - - state->state_add(CDP1802_I, "I", cpustate->i).mask(0xf); - state->state_add(CDP1802_N, "N", cpustate->n).mask(0xf); - - astring tempstr; - for (int regnum = 0; regnum < 16; regnum++) - state->state_add(CDP1802_R0 + regnum, tempstr.format("R%x", regnum), cpustate->r[regnum]); - - state->state_add(CDP1802_SC, "SC", cpustate->state_code).mask(0x3).noshow(); - state->state_add(CDP1802_DF, "DF", cpustate->df).mask(0x1).noshow(); - state->state_add(CDP1802_IE, "IE", cpustate->ie).mask(0x1).noshow(); - state->state_add(CDP1802_Q, "Q", cpustate->q).mask(0x1).noshow(); - } - - /* find address spaces */ - cpustate->program = device->space(AS_PROGRAM); - cpustate->direct = &cpustate->program->direct(); - cpustate->io = device->space(AS_IO); - - /* set initial values */ - cpustate->p = mame_rand(device->machine) & 0x0f; - cpustate->x = mame_rand(device->machine) & 0x0f; - cpustate->d = mame_rand(device->machine); - cpustate->b = mame_rand(device->machine); - cpustate->t = mame_rand(device->machine); - cpustate->n = mame_rand(device->machine) & 0x0f; - cpustate->i = mame_rand(device->machine) & 0x0f; - - for (i = 0; i < 16; i++) - { - cpustate->r[i] = mame_rand(device->machine); - } - - cpustate->mode = CDP1802_MODE_RESET; - cpustate->prevmode = cpustate->mode; - cpustate->irq = CLEAR_LINE; - cpustate->dmain = CLEAR_LINE; - cpustate->dmaout = CLEAR_LINE; - - /* register for state saving */ - state_save_register_device_item(device, 0, cpustate->p); - state_save_register_device_item(device, 0, cpustate->x); - state_save_register_device_item(device, 0, cpustate->d); - state_save_register_device_item(device, 0, cpustate->b); - state_save_register_device_item(device, 0, cpustate->t); - state_save_register_device_item_array(device, 0, cpustate->r); - state_save_register_device_item(device, 0, cpustate->df); - state_save_register_device_item(device, 0, cpustate->ie); - state_save_register_device_item(device, 0, cpustate->q); - state_save_register_device_item(device, 0, cpustate->n); - state_save_register_device_item(device, 0, cpustate->i); - state_save_register_device_item(device, 0, cpustate->state); - state_save_register_device_item(device, 0, cpustate->prevmode); - state_save_register_device_item(device, 0, cpustate->mode); - state_save_register_device_item(device, 0, cpustate->irq); - state_save_register_device_item(device, 0, cpustate->dmain); - state_save_register_device_item(device, 0, cpustate->dmaout); - state_save_register_device_item(device, 0, cpustate->ef); -} - -/************************************************************************** - * Generic set_info - **************************************************************************/ - -static CPU_SET_INFO( cdp1802 ) -{ - cdp1802_state *cpustate = get_safe_token(device); - - switch (state) - { - case CPUINFO_INT_INPUT_STATE + CDP1802_INPUT_LINE_INT: cpustate->irq = info->i; break; - case CPUINFO_INT_INPUT_STATE + CDP1802_INPUT_LINE_DMAIN: cpustate->dmain = info->i; break; - case CPUINFO_INT_INPUT_STATE + CDP1802_INPUT_LINE_DMAOUT: cpustate->dmaout = info->i; break; - } -} - -/************************************************************************** - * Generic get_info - **************************************************************************/ - -CPU_GET_INFO( cdp1802 ) -{ - cdp1802_state *cpustate = (device != NULL && device->token() != NULL) ? get_safe_token(device) : NULL; - - switch (state) - { - /* --- the following bits of info are returned as 64-bit signed integers --- */ - case CPUINFO_INT_CONTEXT_SIZE: info->i = sizeof(cdp1802_state); break; - case CPUINFO_INT_INPUT_LINES: info->i = 3; break; - case CPUINFO_INT_DEFAULT_IRQ_VECTOR: info->i = 0; break; - case DEVINFO_INT_ENDIANNESS: info->i = ENDIANNESS_BIG; break; - case CPUINFO_INT_CLOCK_MULTIPLIER: info->i = 1; break; - case CPUINFO_INT_CLOCK_DIVIDER: info->i = 1; break; - case CPUINFO_INT_MIN_INSTRUCTION_BYTES: info->i = 1; break; - case CPUINFO_INT_MAX_INSTRUCTION_BYTES: info->i = 3; break; - case CPUINFO_INT_MIN_CYCLES: info->i = CDP1802_CYCLES_EXECUTE * 2; break; - case CPUINFO_INT_MAX_CYCLES: info->i = CDP1802_CYCLES_EXECUTE * 3; break; - - case DEVINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_PROGRAM: info->i = 8; break; - case DEVINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_PROGRAM: info->i = 16; break; - case DEVINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_PROGRAM: info->i = 0; break; - case DEVINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_DATA: info->i = 0; break; - case DEVINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_DATA: info->i = 0; break; - case DEVINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_DATA: info->i = 0; break; - case DEVINFO_INT_DATABUS_WIDTH + ADDRESS_SPACE_IO: info->i = 8; break; - case DEVINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACE_IO: info->i = 3; break; - case DEVINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACE_IO: info->i = 0; break; - - case CPUINFO_INT_INPUT_STATE + CDP1802_INPUT_LINE_INT: info->i = cpustate->irq; break; - case CPUINFO_INT_INPUT_STATE + CDP1802_INPUT_LINE_DMAIN: info->i = cpustate->dmain; break; - case CPUINFO_INT_INPUT_STATE + CDP1802_INPUT_LINE_DMAOUT: info->i = cpustate->dmaout; break; - - /* --- the following bits of info are returned as pointers to functions --- */ - case CPUINFO_FCT_SET_INFO: info->setinfo = CPU_SET_INFO_NAME(cdp1802); break; - case CPUINFO_FCT_INIT: info->init = CPU_INIT_NAME(cdp1802); break; - case CPUINFO_FCT_RESET: info->reset = CPU_RESET_NAME(cdp1802); break; - case CPUINFO_FCT_EXECUTE: info->execute = CPU_EXECUTE_NAME(cdp1802); break; - case CPUINFO_FCT_DISASSEMBLE: info->disassemble = CPU_DISASSEMBLE_NAME(cdp1802); break; - case CPUINFO_FCT_IMPORT_STATE: info->import_state = CPU_IMPORT_STATE_NAME(cdp1802); break; - case CPUINFO_FCT_EXPORT_STATE: info->export_state = CPU_EXPORT_STATE_NAME(cdp1802); break; - case CPUINFO_FCT_EXPORT_STRING: info->export_string = CPU_EXPORT_STRING_NAME(cdp1802); break; - - /* --- the following bits of info are returned as pointers --- */ - case CPUINFO_PTR_INSTRUCTION_COUNTER: info->icount = &cpustate->icount; break; - - /* --- the following bits of info are returned as NULL-terminated strings --- */ - case DEVINFO_STR_NAME: strcpy(info->s, "CDP1802"); break; - case DEVINFO_STR_FAMILY: strcpy(info->s, "RCA COSMAC"); break; - case DEVINFO_STR_VERSION: strcpy(info->s, "1.0"); break; - case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; - case DEVINFO_STR_CREDITS: strcpy(info->s, "Copyright Nicola Salmoria and the MAME Team"); break; - } -} - -DEFINE_LEGACY_CPU_DEVICE(CDP1802, cdp1802); diff --git a/src/emu/cpu/cdp1802/cdp1802.h b/src/emu/cpu/cdp1802/cdp1802.h deleted file mode 100644 index 74b25b19287..00000000000 --- a/src/emu/cpu/cdp1802/cdp1802.h +++ /dev/null @@ -1,99 +0,0 @@ -#pragma once - -#ifndef __CDP1802_H__ -#define __CDP1802_H__ - -/* - - RCA COSMAC Series Microprocessors - - Type Internal ROM Internal RAM Timer - ----------------------------------------------------- - CDP1802 none none no - CDP1803 ? ? ? - CDP1804 2 KB 64 bytes yes - CDP1805 none 64 bytes yes - CDP1806 none none yes - -*/ - -enum -{ - CDP1802_INPUT_LINE_INT, - CDP1802_INPUT_LINE_DMAIN, - CDP1802_INPUT_LINE_DMAOUT -}; - -enum -{ - EF1 = 0x01, - EF2 = 0x02, - EF3 = 0x04, - EF4 = 0x08 -}; - -enum _cdp1802_control_mode -{ - CDP1802_MODE_LOAD, - CDP1802_MODE_RESET, - CDP1802_MODE_PAUSE, - CDP1802_MODE_RUN -}; -typedef enum _cdp1802_control_mode cdp1802_control_mode; - -enum _cdp1802_state_code -{ - CDP1802_STATE_CODE_S0_FETCH = 0, - CDP1802_STATE_CODE_S1_EXECUTE, - CDP1802_STATE_CODE_S2_DMA, - CDP1802_STATE_CODE_S3_INTERRUPT -}; -typedef enum _cdp1802_state_code cdp1802_state_code; - -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_SC, - CDP1802_GENPC = STATE_GENPC -}; - -typedef cdp1802_control_mode (*cdp1802_mode_read_func)(running_device *device); -#define CDP1802_MODE_READ(name) cdp1802_control_mode name(running_device *device) - -typedef UINT8 (*cdp1802_ef_read_func)(running_device *device); -#define CDP1802_EF_READ(name) UINT8 name(running_device *device) - -typedef void (*cdp1802_sc_write_func)(running_device *device, cdp1802_state_code state, int sc0, int sc1); -#define CDP1802_SC_WRITE(name) void name(running_device *device, cdp1802_state_code state, int sc0, int sc1) - -/* interface */ -typedef struct _cdp1802_interface cdp1802_interface; -struct _cdp1802_interface -{ - /* if specified, this gets called for every change of the mode pins (pins 2 and 3) */ - cdp1802_mode_read_func mode_r; - - /* if specified, this gets called for every change read of the external flags (pins 21 thru 24) */ - cdp1802_ef_read_func ef_r; - - /* if specified, this gets called for every change of the processor state (pins 5 and 6) */ - cdp1802_sc_write_func sc_w; - - /* if specified, this gets called for every change of the Q pin (pin 4) */ - devcb_write_line out_q_func; - - /* if specified, this gets called for every DMA read */ - devcb_read8 in_dma_func; - - /* if specified, this gets called for every DMA write */ - devcb_write8 out_dma_func; -}; -#define CDP1802_INTERFACE(name) const cdp1802_interface (name) = - -DECLARE_LEGACY_CPU_DEVICE(CDP1802, cdp1802); - -extern CPU_DISASSEMBLE( cdp1802 ); - -#endif /* __CDP1802_H__ */ diff --git a/src/emu/cpu/cpu.mak b/src/emu/cpu/cpu.mak index 123961fc99b..c82ac9bc291 100644 --- a/src/emu/cpu/cpu.mak +++ b/src/emu/cpu/cpu.mak @@ -275,21 +275,6 @@ $(CPUOBJ)/esrip/esrip.o: $(CPUSRC)/esrip/esrip.c \ -#------------------------------------------------- -# RCA CDP1802 -#------------------------------------------------- - -ifneq ($(filter CDP1802,$(CPUS)),) -OBJDIRS += $(CPUOBJ)/cdp1802 -CPUOBJS += $(CPUOBJ)/cdp1802/cdp1802.o -DASMOBJS += $(CPUOBJ)/cdp1802/1802dasm.o -endif - -$(CPUOBJ)/cdp1802/cdp1802.o: $(CPUSRC)/cdp1802/cdp1802.c \ - $(CPUSRC)/cdp1802/cdp1802.h - - - #------------------------------------------------- # RCA COSMAC #------------------------------------------------- diff --git a/src/mame/mame.mak b/src/mame/mame.mak index 60f09620fe8..57fc0a63e9b 100644 --- a/src/mame/mame.mak +++ b/src/mame/mame.mak @@ -95,7 +95,6 @@ CPUS += ADSP21062 CPUS += DSP56156 CPUS += RSP CPUS += ALPHA8201 -CPUS += CDP1802 CPUS += COP400 CPUS += TLCS90 CPUS += TLCS900