diff options
Diffstat (limited to 'src/devices/cpu/tms34010/tms34010.h')
-rw-r--r-- | src/devices/cpu/tms34010/tms34010.h | 80 |
1 files changed, 58 insertions, 22 deletions
diff --git a/src/devices/cpu/tms34010/tms34010.h b/src/devices/cpu/tms34010/tms34010.h index 961036b3439..c3d639e3506 100644 --- a/src/devices/cpu/tms34010/tms34010.h +++ b/src/devices/cpu/tms34010/tms34010.h @@ -105,8 +105,8 @@ enum #define TMS340X0_SCANLINE_IND16_CB_MEMBER(_name) void _name(screen_device &screen, bitmap_ind16 &bitmap, int scanline, const tms340x0_device::display_params *params) #define TMS340X0_SCANLINE_RGB32_CB_MEMBER(_name) void _name(screen_device &screen, bitmap_rgb32 &bitmap, int scanline, const tms340x0_device::display_params *params) -#define TMS340X0_TO_SHIFTREG_CB_MEMBER(_name) void _name(memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t address, uint16_t *shiftreg) -#define TMS340X0_FROM_SHIFTREG_CB_MEMBER(_name) void _name(memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t address, uint16_t *shiftreg) +#define TMS340X0_TO_SHIFTREG_CB_MEMBER(_name) void _name(offs_t address, uint16_t *shiftreg) +#define TMS340X0_FROM_SHIFTREG_CB_MEMBER(_name) void _name(offs_t address, uint16_t *shiftreg) class tms340x0_device : public cpu_device, @@ -126,8 +126,8 @@ public: typedef device_delegate<void (screen_device &screen, bitmap_ind16 &bitmap, int scanline, const display_params *params)> scanline_ind16_cb_delegate; typedef device_delegate<void (screen_device &screen, bitmap_rgb32 &bitmap, int scanline, const display_params *params)> scanline_rgb32_cb_delegate; - typedef device_delegate<void (memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t address, uint16_t *shiftreg)> shiftreg_in_cb_delegate; - typedef device_delegate<void (memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t address, uint16_t *shiftreg)> shiftreg_out_cb_delegate; + typedef device_delegate<void (offs_t address, uint16_t *shiftreg)> shiftreg_in_cb_delegate; + typedef device_delegate<void (offs_t address, uint16_t *shiftreg)> shiftreg_out_cb_delegate; void set_halt_on_reset(bool halt_on_reset) { m_halt_on_reset = halt_on_reset; } void set_pixel_clock(uint32_t pixclock) { m_pixclock = pixclock; } @@ -252,7 +252,7 @@ protected: }; // construction/destruction - tms340x0_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, address_map_constructor internal_regs_map = address_map_constructor()); + tms340x0_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, address_map_constructor internal_regs_map, bool is_34020); // device-level overrides virtual void device_start() override; @@ -281,8 +281,8 @@ protected: typedef uint32_t (tms340x0_device::*pixel_op_func)(uint32_t, uint32_t, uint32_t); typedef void (tms340x0_device::*pixblt_op_func)(int, int); typedef void (tms340x0_device::*pixblt_b_op_func)(int); - typedef void (tms340x0_device::*word_write_func)(memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t offset,uint16_t data); - typedef uint16_t (tms340x0_device::*word_read_func)(memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t offset); + typedef void (tms340x0_device::*word_write_func)(offs_t offset, uint16_t data); + typedef uint16_t (tms340x0_device::*word_read_func)(offs_t offset); static const wfield_func s_wfield_functions[32]; static const rfield_func s_rfield_functions[64]; @@ -312,14 +312,13 @@ protected: uint32_t m_convmp; int32_t m_gfxcycles; uint8_t m_pixelshift; - uint8_t m_is_34020; + const bool m_is_34020; bool m_reset_deferred; bool m_halt_on_reset; /* /HCS pin, which determines HALT state after reset */ uint8_t m_hblank_stable; uint8_t m_external_host_access; uint8_t m_executing; - memory_access<32, 1, 3, ENDIANNESS_LITTLE>::cache m_cache; - memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific m_program; + uint32_t m_pixclock; /* the pixel clock (0 means don't adjust screen size) */ int m_pixperclock; /* pixels per clock */ emu_timer *m_scantimer; @@ -354,15 +353,18 @@ protected: uint16_t m_IOregs[64]; uint16_t m_shiftreg[(8 * 512 * sizeof(uint16_t))/2]; - uint32_t TMS34010_RDMEM_DWORD(offs_t A); - void TMS34010_WRMEM_DWORD(offs_t A, uint32_t V); + + virtual uint32_t TMS34010_RDMEM_WORD(offs_t A) = 0; + virtual uint32_t TMS34010_RDMEM_DWORD(offs_t A) = 0; + virtual void TMS34010_WRMEM_WORD(offs_t A, uint32_t V) = 0; + virtual void TMS34010_WRMEM_DWORD(offs_t A, uint32_t V) = 0; void SET_ST(uint32_t st); void RESET_ST(); - uint32_t ROPCODE(); - int16_t PARAM_WORD(); - int32_t PARAM_LONG(); - int16_t PARAM_WORD_NO_INC(); - int32_t PARAM_LONG_NO_INC(); + virtual uint32_t ROPCODE() = 0; + virtual int16_t PARAM_WORD() = 0; + virtual int32_t PARAM_LONG() = 0; + virtual int16_t PARAM_WORD_NO_INC() = 0; + virtual int32_t PARAM_LONG_NO_INC() = 0; uint32_t RBYTE(offs_t offset); void WBYTE(offs_t offset, uint32_t data); uint32_t RLONG(offs_t offset); @@ -892,11 +894,11 @@ protected: int compute_fill_cycles(int left_partials, int right_partials, int full_words, int op_timing); int compute_pixblt_cycles(int left_partials, int right_partials, int full_words, int op_timing); int compute_pixblt_b_cycles(int left_partials, int right_partials, int full_words, int rows, int op_timing, int bpp); - void memory_w(memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t offset,uint16_t data); - uint16_t memory_r(memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t offset); - void shiftreg_w(memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t offset, uint16_t data); - uint16_t shiftreg_r(memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t offset); - uint16_t dummy_shiftreg_r(memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific &space, offs_t offset); + void memory_w(offs_t offset, uint16_t data); + uint16_t memory_r(offs_t offset); + void shiftreg_w(offs_t offset, uint16_t data); + uint16_t shiftreg_r(offs_t offset); + uint16_t dummy_shiftreg_r(offs_t offset); uint32_t pixel_op00(uint32_t dstpix, uint32_t mask, uint32_t srcpix); uint32_t pixel_op01(uint32_t dstpix, uint32_t mask, uint32_t srcpix); uint32_t pixel_op02(uint32_t dstpix, uint32_t mask, uint32_t srcpix); @@ -1016,10 +1018,27 @@ public: virtual u16 io_register_r(offs_t offset) override; protected: + // device-level overrides + virtual void device_start() override; + virtual uint64_t execute_clocks_to_cycles(uint64_t clocks) const noexcept override { return (clocks + 8 - 1) / 8; } virtual uint64_t execute_cycles_to_clocks(uint64_t cycles) const noexcept override { return (cycles * 8); } virtual std::unique_ptr<util::disasm_interface> create_disassembler() override; void internal_regs_map(address_map &map); + + virtual uint32_t ROPCODE() override; + virtual int16_t PARAM_WORD() override; + virtual int32_t PARAM_LONG() override; + virtual int16_t PARAM_WORD_NO_INC() override; + virtual int32_t PARAM_LONG_NO_INC() override; + virtual uint32_t TMS34010_RDMEM_WORD(offs_t A) override; + virtual uint32_t TMS34010_RDMEM_DWORD(offs_t A) override; + virtual void TMS34010_WRMEM_WORD(offs_t A, uint32_t V) override; + virtual void TMS34010_WRMEM_DWORD(offs_t A, uint32_t V) override; + +private: + memory_access<32, 1, 3, ENDIANNESS_LITTLE>::cache m_cache; + memory_access<32, 1, 3, ENDIANNESS_LITTLE>::specific m_program; }; DECLARE_DEVICE_TYPE(TMS34010, tms34010_device) @@ -1034,10 +1053,27 @@ public: virtual u16 io_register_r(offs_t offset) override; protected: + // device-level overrides + virtual void device_start() override; + virtual uint64_t execute_clocks_to_cycles(uint64_t clocks) const noexcept override { return (clocks + 4 - 1) / 4; } virtual uint64_t execute_cycles_to_clocks(uint64_t cycles) const noexcept override { return (cycles * 4); } virtual std::unique_ptr<util::disasm_interface> create_disassembler() override; void internal_regs_map(address_map &map); + + virtual uint32_t ROPCODE() override; + virtual int16_t PARAM_WORD() override; + virtual int32_t PARAM_LONG() override; + virtual int16_t PARAM_WORD_NO_INC() override; + virtual int32_t PARAM_LONG_NO_INC() override; + virtual uint32_t TMS34010_RDMEM_WORD(offs_t A) override; + virtual uint32_t TMS34010_RDMEM_DWORD(offs_t A) override; + virtual void TMS34010_WRMEM_WORD(offs_t A, uint32_t V) override; + virtual void TMS34010_WRMEM_DWORD(offs_t A, uint32_t V) override; + +private: + memory_access<32, 2, 3, ENDIANNESS_LITTLE>::cache m_cache; + memory_access<32, 2, 3, ENDIANNESS_LITTLE>::specific m_program; }; DECLARE_DEVICE_TYPE(TMS34020, tms34020_device) |