summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/tms34010/tms34010.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/tms34010/tms34010.h')
-rw-r--r--src/devices/cpu/tms34010/tms34010.h80
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)