summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/tms32010/tms32010.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/tms32010/tms32010.h')
-rw-r--r--src/devices/cpu/tms32010/tms32010.h222
1 files changed, 222 insertions, 0 deletions
diff --git a/src/devices/cpu/tms32010/tms32010.h b/src/devices/cpu/tms32010/tms32010.h
new file mode 100644
index 00000000000..6059d1efa57
--- /dev/null
+++ b/src/devices/cpu/tms32010/tms32010.h
@@ -0,0 +1,222 @@
+// license:BSD-3-Clause
+// copyright-holders:Tony La Porta
+ /**************************************************************************\
+ * Texas Instruments TMS32010 DSP Emulator *
+ * *
+ * Copyright Tony La Porta *
+ * You are not allowed to distribute this software commercially. *
+ * Written for the MAME project. *
+ * *
+ * *
+ * Note : This is a word based microcontroller, with addressing *
+ * architecture based on the Harvard addressing scheme. *
+ * *
+ \**************************************************************************/
+
+#pragma once
+
+#ifndef __TMS32010_H__
+#define __TMS32010_H__
+
+
+
+
+/****************************************************************************
+ * Use this in the I/O port address fields of your driver for the BIO pin
+ * i.e,
+ * AM_RANGE(TMS32010_BIO, TMS32010_BIO) AM_READ(twincobr_bio_line_r)
+ */
+
+#define TMS32010_BIO 0x10 /* BIO input */
+
+
+#define TMS32010_INT_PENDING 0x80000000
+#define TMS32010_INT_NONE 0
+
+
+enum
+{
+ TMS32010_PC=1, TMS32010_SP, TMS32010_STR, TMS32010_ACC,
+ TMS32010_PREG, TMS32010_TREG, TMS32010_AR0, TMS32010_AR1,
+ TMS32010_STK0, TMS32010_STK1, TMS32010_STK2, TMS32010_STK3
+};
+
+
+/****************************************************************************
+ * Public Functions
+ */
+
+
+class tms32010_device : public cpu_device
+{
+public:
+ // construction/destruction
+ tms32010_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ tms32010_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source, int addr_mask);
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ // device_execute_interface overrides
+ virtual UINT32 execute_min_cycles() const { return 1; }
+ virtual UINT32 execute_max_cycles() const { return 3; }
+ virtual UINT32 execute_input_lines() const { return 1; }
+ virtual void execute_run();
+ virtual void execute_set_input(int inputnum, int state);
+ virtual UINT64 execute_clocks_to_cycles(UINT64 clocks) const { return (clocks + 4 - 1) / 4; }
+ virtual UINT64 execute_cycles_to_clocks(UINT64 cycles) const { return (cycles * 4); }
+
+ // device_memory_interface overrides
+ virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : ( (spacenum == AS_DATA) ? &m_data_config : NULL ) ); }
+
+ // device_state_interface overrides
+ void state_string_export(const device_state_entry &entry, std::string &str);
+
+ // device_disasm_interface overrides
+ virtual UINT32 disasm_min_opcode_bytes() const { return 2; }
+ virtual UINT32 disasm_max_opcode_bytes() const { return 4; }
+ virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options);
+
+private:
+ address_space_config m_program_config;
+ address_space_config m_data_config;
+ address_space_config m_io_config;
+
+ typedef void ( tms32010_device::*opcode_func ) ();
+ struct tms32010_opcode
+ {
+ UINT8 cycles;
+ opcode_func function;
+ };
+ static const tms32010_opcode s_opcode_main[256];
+ static const tms32010_opcode s_opcode_7F[32];
+
+ /******************** CPU Internal Registers *******************/
+ UINT16 m_PC;
+ UINT16 m_PREVPC; /* previous program counter */
+ UINT16 m_STR;
+ PAIR m_ACC;
+ PAIR m_ALU;
+ PAIR m_Preg;
+ UINT16 m_Treg;
+ UINT16 m_AR[2];
+ UINT16 m_STACK[4];
+
+ PAIR m_opcode;
+ int m_INTF; /* Pending Interrupt flag */
+ int m_icount;
+ PAIR m_oldacc;
+ UINT16 m_memaccess;
+ int m_addr_mask;
+
+ address_space *m_program;
+ direct_read_data *m_direct;
+ address_space *m_data;
+ address_space *m_io;
+
+ inline void CLR(UINT16 flag);
+ inline void SET_FLAG(UINT16 flag);
+ inline void CALCULATE_ADD_OVERFLOW(INT32 addval);
+ inline void CALCULATE_SUB_OVERFLOW(INT32 subval);
+ inline UINT16 POP_STACK();
+ inline void PUSH_STACK(UINT16 data);
+ inline void UPDATE_AR();
+ inline void UPDATE_ARP();
+ inline void getdata(UINT8 shift,UINT8 signext);
+ inline void putdata(UINT16 data);
+ inline void putdata_sar(UINT8 data);
+ inline void putdata_sst(UINT16 data);
+ void opcodes_7F();
+ void illegal();
+ void abst();
+ void add_sh();
+ void addh();
+ void adds();
+ void and_();
+ void apac();
+ void br();
+ void banz();
+ void bgez();
+ void bgz();
+ void bioz();
+ void blez();
+ void blz();
+ void bnz();
+ void bv();
+ void bz();
+ void cala();
+ void call();
+ void dint();
+ void dmov();
+ void eint();
+ void in_p();
+ void lac_sh();
+ void lack();
+ void lar_ar0();
+ void lar_ar1();
+ void lark_ar0();
+ void lark_ar1();
+ void larp_mar();
+ void ldp();
+ void ldpk();
+ void lst();
+ void lt();
+ void lta();
+ void ltd();
+ void mpy();
+ void mpyk();
+ void nop();
+ void or_();
+ void out_p();
+ void pac();
+ void pop();
+ void push();
+ void ret();
+ void rovm();
+ void sach_sh();
+ void sacl();
+ void sar_ar0();
+ void sar_ar1();
+ void sovm();
+ void spac();
+ void sst();
+ void sub_sh();
+ void subc();
+ void subh();
+ void subs();
+ void tblr();
+ void tblw();
+ void xor_();
+ void zac();
+ void zalh();
+ void zals();
+ inline int add_branch_cycle();
+ int Ext_IRQ();
+
+};
+
+
+class tms32015_device : public tms32010_device
+{
+public:
+ // construction/destruction
+ tms32015_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+};
+
+
+class tms32016_device : public tms32010_device
+{
+public:
+ // construction/destruction
+ tms32016_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+};
+
+
+extern const device_type TMS32010;
+extern const device_type TMS32015;
+extern const device_type TMS32016;
+
+
+#endif /* __TMS32010_H__ */