diff options
Diffstat (limited to 'src/devices/cpu/tms32025/tms32025.h')
-rw-r--r-- | src/devices/cpu/tms32025/tms32025.h | 160 |
1 files changed, 92 insertions, 68 deletions
diff --git a/src/devices/cpu/tms32025/tms32025.h b/src/devices/cpu/tms32025/tms32025.h index 924f0a774cc..c35a2841c74 100644 --- a/src/devices/cpu/tms32025/tms32025.h +++ b/src/devices/cpu/tms32025/tms32025.h @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Tony La Porta, hap +// copyright-holders:Tony La Porta /**************************************************************************\ * Texas Instruments TMS320x25 DSP Emulator * * * @@ -17,8 +17,8 @@ * * \***************************************************************************/ -#ifndef MAME_TMS32025_TMS32025_H -#define MAME_TMS32025_TMS32025_H +#ifndef MAME_CPU_TMS32025_TMS32025_H +#define MAME_CPU_TMS32025_TMS32025_H #pragma once @@ -58,13 +58,9 @@ enum */ -class tms32025_device : public cpu_device +class tms3202x_device : public cpu_device { public: - // construction/destruction - tms32025_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - tms32025_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); - // configuration helpers auto bio_in_cb() { return m_bio_in.bind(); } auto hold_in_cb() { return m_hold_in.bind(); } @@ -73,49 +69,33 @@ public: auto dr_in_cb() { return m_dr_in.bind(); } auto dx_out_cb() { return m_dx_out.bind(); } - void set_mp_mc(bool state) { m_mp_mc = state; } + //void tms32025_program(address_map &map) ATTR_COLD; + void tms3202x_data(address_map &map) ATTR_COLD; + void tms32026_data(address_map &map) ATTR_COLD; - DECLARE_READ16_MEMBER( drr_r); - DECLARE_WRITE16_MEMBER(drr_w); - DECLARE_READ16_MEMBER( dxr_r); - DECLARE_WRITE16_MEMBER(dxr_w); - DECLARE_READ16_MEMBER( tim_r); - DECLARE_WRITE16_MEMBER(tim_w); - DECLARE_READ16_MEMBER( prd_r); - DECLARE_WRITE16_MEMBER(prd_w); - DECLARE_READ16_MEMBER( imr_r); - DECLARE_WRITE16_MEMBER(imr_w); - DECLARE_READ16_MEMBER( greg_r); - DECLARE_WRITE16_MEMBER(greg_w); - - //void tms32025_program(address_map &map); - void tms32025_data(address_map &map); - void tms32026_data(address_map &map); protected: - tms32025_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, address_map_constructor prgmap, address_map_constructor datamap); + // construction/destruction + tms3202x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, unsigned stack_depth, address_map_constructor prgmap, address_map_constructor datamap); - // device-level overrides - virtual void device_start() override; - virtual void device_reset() override; + // device_t implementation + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; - // device_execute_interface overrides - virtual uint32_t execute_min_cycles() const override { return 4; } - virtual uint32_t execute_max_cycles() const override { return 20; } - virtual uint32_t execute_input_lines() const override { return 6; } + // device_execute_interface implementation + virtual uint32_t execute_min_cycles() const noexcept override { return 4; } + virtual uint32_t execute_max_cycles() const noexcept override { return 20; } virtual void execute_run() override; virtual void execute_set_input(int inputnum, int state) override; - // device_memory_interface overrides + // device_memory_interface implementation virtual space_config_vector memory_space_config() const override; - // device_state_interface overrides + // device_state_interface implementation virtual void state_string_export(const device_state_entry &entry, std::string &str) const override; - // device_disasm_interface overrides + // device_disasm_interface implementation virtual std::unique_ptr<util::disasm_interface> create_disassembler() override; - virtual const tiny_rom_entry *device_rom_region() const override; - void common_reset(); address_space_config m_program_config; @@ -127,12 +107,12 @@ protected: required_shared_ptr<uint16_t> m_b2; optional_shared_ptr<uint16_t> m_b3; - address_space *m_program; - memory_access_cache<1, -1, ENDIANNESS_BIG> *m_cache; - address_space *m_data; - address_space *m_io; + memory_access<16, 1, -1, ENDIANNESS_BIG>::cache m_cache; + memory_access<16, 1, -1, ENDIANNESS_BIG>::specific m_program; + memory_access<16, 1, -1, ENDIANNESS_BIG>::specific m_data; + memory_access<16, 1, -1, ENDIANNESS_BIG>::specific m_io; - typedef void ( tms32025_device::*opcode_func ) (); + typedef void ( tms3202x_device::*opcode_func ) (); struct tms32025_opcode { uint8_t cycles; @@ -149,6 +129,8 @@ protected: devcb_read16 m_dr_in; devcb_write16 m_dx_out; + unsigned const m_stack_limit; + /******************** CPU Internal Registers *******************/ uint16_t m_PREVPC; /* previous program counter */ @@ -160,8 +142,8 @@ protected: PAIR m_ACC; PAIR m_Preg; uint16_t m_Treg; - uint16_t m_AR[8]; - uint16_t m_STACK[8]; + uint16_t m_AR[8]; // 5 for TMS32020, 8 for rest + uint16_t m_STACK[8]; // 4 level for TMS32020, 8 level for rest PAIR m_ALU; uint16_t m_drr, m_dxr, m_tim, m_prd, m_imr, m_greg; @@ -183,27 +165,39 @@ protected: int m_icount; int m_mHackIgnoreARP; /* special handling for lst, lst1 instructions */ int m_waiting_for_serial_frame; - bool m_mp_mc; - inline void CLR0(uint16_t flag); - inline void SET0(uint16_t flag); - inline void CLR1(uint16_t flag); - inline void SET1(uint16_t flag); - inline void MODIFY_DP(int data); - inline void MODIFY_PM(int data); - inline void MODIFY_ARP(int data); + uint16_t drr_r(); + void drr_w(uint16_t data); + uint16_t dxr_r(); + void dxr_w(uint16_t data); + uint16_t tim_r(); + void tim_w(uint16_t data); + uint16_t prd_r(); + void prd_w(uint16_t data); + uint16_t imr_r(); + void imr_w(uint16_t data); + uint16_t greg_r(); + void greg_w(uint16_t data); + + void CLR0(uint16_t flag); + void SET0(uint16_t flag); + void CLR1(uint16_t flag); + void SET1(uint16_t flag); + void MODIFY_DP(int data); + void MODIFY_PM(int data); + void MODIFY_ARP(int data); uint16_t reverse_carry_add(uint16_t arg0, uint16_t arg1 ); - inline void MODIFY_AR_ARP(); - inline void CALCULATE_ADD_CARRY(); - inline void CALCULATE_SUB_CARRY(); - inline void CALCULATE_ADD_OVERFLOW(int32_t addval); - inline void CALCULATE_SUB_OVERFLOW(int32_t subval); - inline uint16_t POP_STACK(); - inline void PUSH_STACK(uint16_t data); - inline void SHIFT_Preg_TO_ALU(); - inline void GETDATA(int shift,int signext); - inline void PUTDATA(uint16_t data); - inline void PUTDATA_SST(uint16_t data); + void MODIFY_AR_ARP(); + void CALCULATE_ADD_CARRY(); + void CALCULATE_SUB_CARRY(); + void CALCULATE_ADD_OVERFLOW(int32_t addval); + void CALCULATE_SUB_OVERFLOW(int32_t subval); + uint16_t POP_STACK(); + void PUSH_STACK(uint16_t data); + void SHIFT_Preg_TO_ALU(); + void GETDATA(int shift,int signext); + void PUTDATA(uint16_t data); + void PUTDATA_SST(uint16_t data); void opcodes_CE(); void opcodes_Dx(); void illegal(); @@ -359,10 +353,39 @@ protected: void zalh(); void zalr(); void zals(); - inline int process_IRQs(); - inline void process_timer(int clocks); + int process_IRQs(); + void process_timer(int clocks); +}; + + +class tms32020_device : public tms3202x_device +{ +public: + // construction/destruction + tms32020_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; +class tms32025_device : public tms3202x_device +{ +public: + // construction/destruction + tms32025_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + // configuration helpers + void set_mp_mc(bool state) { m_mp_mc = state; } + +protected: + // construction/destruction + tms32025_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + tms32025_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, address_map_constructor prgmap, address_map_constructor datamap); + + // device_t implementation + virtual void device_start() override ATTR_COLD; + + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; + + bool m_mp_mc; +}; class tms32026_device : public tms32025_device { @@ -371,13 +394,14 @@ public: tms32026_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: - virtual void device_reset() override; + virtual void device_reset() override ATTR_COLD; virtual void cnfd() override; virtual void cnfp() override; virtual void conf() override; }; +DECLARE_DEVICE_TYPE(TMS32020, tms32020_device) DECLARE_DEVICE_TYPE(TMS32025, tms32025_device) DECLARE_DEVICE_TYPE(TMS32026, tms32026_device) -#endif // MAME_TMS32025_TMS32025_H +#endif // MAME_CPU_TMS32025_TMS32025_H |