1 // license:BSD-3-Clause
2 // copyright-holders:Aaron Giles
3 /*************************************************************************
4 
5     BattleToads
6 
7     Common definitions
8 
9 *************************************************************************/
10 
11 #include "cpu/tms34010/tms34010.h"
12 #include "cpu/z80/z80.h"
13 #include "video/tlc34076.h"
14 #include "sound/bsmt2000.h"
15 #include "machine/nvram.h"
16 #include "emupal.h"
17 #include "screen.h"
18 
19 class btoads_state : public driver_device
20 {
21 public:
btoads_state(const machine_config & mconfig,device_type type,const char * tag)22 	btoads_state(const machine_config &mconfig, device_type type, const char *tag)
23 		: driver_device(mconfig, type, tag),
24 		m_vram_fg0(*this, "vram_fg0", 32),
25 		m_vram_fg1(*this, "vram_fg1", 32),
26 		m_vram_fg_data(*this, "vram_fg_data", 32),
27 		m_vram_bg0(*this, "vram_bg0", 32),
28 		m_vram_bg1(*this, "vram_bg1", 32),
29 		m_sprite_scale(*this, "sprite_scale", 32),
30 		m_sprite_control(*this, "sprite_control", 32),
31 		m_maincpu(*this, "maincpu"),
32 		m_audiocpu(*this, "audiocpu"),
33 		m_bsmt(*this, "bsmt"),
34 		m_tlc34076(*this, "tlc34076"),
35 		m_screen(*this, "screen") { }
36 
37 	DECLARE_READ_LINE_MEMBER( main_to_sound_r );
38 	DECLARE_READ_LINE_MEMBER( sound_to_main_r );
39 
40 	void btoads(machine_config &config);
41 
42 protected:
43 	// device overrides
44 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
45 
46 	// driver_device overrides
47 	virtual void machine_start() override;
48 	virtual void video_start() override;
49 
50 private:
51 	// timer IDs
52 	enum
53 	{
54 		TIMER_ID_NOP,
55 		TIMER_ID_DELAYED_SOUND
56 	};
57 
58 	// shared pointers
59 	required_shared_ptr<uint8_t> m_vram_fg0;
60 	required_shared_ptr<uint8_t> m_vram_fg1;
61 	required_shared_ptr<uint16_t> m_vram_fg_data;
62 	required_shared_ptr<uint16_t> m_vram_bg0;
63 	required_shared_ptr<uint16_t> m_vram_bg1;
64 	required_shared_ptr<uint16_t> m_sprite_scale;
65 	required_shared_ptr<uint16_t> m_sprite_control;
66 
67 	// state
68 	uint8_t m_main_to_sound_data;
69 	uint8_t m_main_to_sound_ready;
70 	uint8_t m_sound_to_main_data;
71 	uint8_t m_sound_to_main_ready;
72 	uint8_t m_sound_int_state;
73 	uint8_t *m_vram_fg_draw;
74 	uint8_t *m_vram_fg_display;
75 	int32_t m_xscroll0;
76 	int32_t m_yscroll0;
77 	int32_t m_xscroll1;
78 	int32_t m_yscroll1;
79 	uint8_t m_screen_control;
80 	uint16_t m_sprite_source_offs;
81 	uint8_t *m_sprite_dest_base;
82 	uint16_t m_sprite_dest_offs;
83 	uint16_t m_misc_control;
84 	int m_xcount;
85 	std::unique_ptr<uint8_t[]> m_nvram_data;
86 
87 	// in drivers/btoads
88 	void nvram_w(offs_t offset, uint8_t data);
89 	uint8_t nvram_r(offs_t offset);
90 	void main_sound_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
91 	uint16_t main_sound_r();
92 	void sound_data_w(uint8_t data);
93 	uint8_t sound_data_r();
94 	uint8_t sound_ready_to_send_r();
95 	uint8_t sound_data_ready_r();
96 	void sound_int_state_w(uint8_t data);
97 	uint8_t bsmt_ready_r();
98 	void bsmt2000_port_w(offs_t offset, uint8_t data);
99 
100 	// in video/btoads
101 	void misc_control_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
102 	void display_control_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
103 	void scroll0_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
104 	void scroll1_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
105 	void vram_bg0_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
106 	void vram_bg1_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
107 	uint16_t vram_bg0_r(offs_t offset);
108 	uint16_t vram_bg1_r(offs_t offset);
109 	void vram_fg_display_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
110 	void vram_fg_draw_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
111 	uint16_t vram_fg_display_r(offs_t offset);
112 	uint16_t vram_fg_draw_r(offs_t offset);
113 	void render_sprite_row(uint16_t *sprite_source, uint32_t address);
114 	TMS340X0_TO_SHIFTREG_CB_MEMBER(to_shiftreg);
115 	TMS340X0_FROM_SHIFTREG_CB_MEMBER(from_shiftreg);
116 	TMS340X0_SCANLINE_RGB32_CB_MEMBER(scanline_update);
117 
118 	// devices
119 	required_device<tms34020_device> m_maincpu;
120 	required_device<z80_device> m_audiocpu;
121 	required_device<bsmt2000_device> m_bsmt;
122 	required_device<tlc34076_device> m_tlc34076;
123 	required_device<screen_device> m_screen;
124 
125 	void main_map(address_map &map);
126 	void sound_io_map(address_map &map);
127 	void sound_map(address_map &map);
128 };
129