1 // license:BSD-3-Clause
2 // copyright-holders:Nicola Salmoria, Tormod Tjaberg, Mirko Buffoni,Lee Taylor, Valerio Verrando, Zsolt Vasvari
3 // thanks-to:Michael Strutts, Marco Cassili
4 /***************************************************************************
5 
6     8080-based black and white hardware
7 
8 ****************************************************************************/
9 #ifndef MAME_INCLUDES_8080BW_H
10 #define MAME_INCLUDES_8080BW_H
11 
12 #pragma once
13 
14 #include "audio/8080bw.h"
15 #include "includes/mw8080bw.h"
16 
17 #include "machine/eepromser.h"
18 #include "machine/timer.h"
19 #include "sound/samples.h"
20 #include "sound/sn76477.h"
21 #include "sound/spkrdev.h"
22 
23 #include "emupal.h"
24 #include "screen.h"
25 
26 
27 /* for games in 8080bw.c */
28 #define CABINET_PORT_TAG                  "CAB"
29 
30 
31 class _8080bw_state : public mw8080bw_state
32 {
33 public:
_8080bw_state(const machine_config & mconfig,device_type type,const char * tag)34 	_8080bw_state(const machine_config &mconfig, device_type type, const char *tag)
35 		: mw8080bw_state(mconfig, type, tag)
36 		, m_audiocpu(*this, "audiocpu")
37 		, m_schaser_effect_555_timer(*this, "schaser_sh_555")
38 		, m_claybust_gun_on(*this, "claybust_gun")
39 		, m_sn(*this, "snsnd")
40 		, m_samples(*this, "samples")
41 		, m_speaker(*this, "speaker")
42 		, m_eeprom(*this, "eeprom")
43 		, m_palette(*this, "palette")
44 		, m_colorram(*this, "colorram")
45 		, m_gunx(*this, "GUNX")
46 		, m_guny(*this, "GUNY")
47 		, m_timer_state(1)
48 	{ }
49 
50 	void indianbtbr(machine_config &config);
51 	void claybust(machine_config &config);
52 	void shuttlei(machine_config &config);
53 	void spcewarla(machine_config &config);
54 	void escmars(machine_config &config);
55 	void lrescue(machine_config &config);
56 	void invmulti(machine_config &config);
57 	void yosakdon(machine_config &config);
58 	void polaris(machine_config &config);
59 	void attackfc(machine_config &config);
60 	void astropal(machine_config &config);
61 	void rollingc(machine_config &config);
62 	void vortex(machine_config &config);
63 	void invrvnge(machine_config &config);
64 	void sflush(machine_config &config);
65 	void invadpt2(machine_config &config);
66 	void lupin3a(machine_config &config);
67 	void indianbt(machine_config &config);
68 	void starw1(machine_config &config);
69 	void cosmo(machine_config &config);
70 	void spcewars(machine_config &config);
71 	void cosmicmo(machine_config &config);
72 	void darthvdr(machine_config &config);
73 	void ballbomb(machine_config &config);
74 	void spacecom(machine_config &config);
75 	void crashrd(machine_config &config);
76 	void schasercv(machine_config &config);
77 	void lupin3(machine_config &config);
78 	void spacerng(machine_config &config);
79 	void steelwkr(machine_config &config);
80 	void schaser(machine_config &config);
81 
82 	void init_invmulti();
83 	void init_spacecom();
84 	void init_vortex();
85 	void init_attackfc();
86 	void init_invrvnge();
87 
88 	DECLARE_READ_LINE_MEMBER(sflush_80_r);
89 	uint8_t sflush_in0_r();
90 	DECLARE_INPUT_CHANGED_MEMBER(claybust_gun_trigger);
91 	DECLARE_READ_LINE_MEMBER(claybust_gun_on_r);
92 
93 protected:
94 	void clear_extra_columns( bitmap_rgb32 &bitmap, int color );
95 	inline void set_8_pixels( bitmap_rgb32 &bitmap, uint8_t y, uint8_t x, uint8_t data, int fore_color, int back_color );
96 
97 	/* devices/memory pointers */
98 	optional_device<cpu_device> m_audiocpu;
99 	optional_device<timer_device> m_schaser_effect_555_timer;
100 	optional_device<timer_device> m_claybust_gun_on;
101 	optional_device<sn76477_device> m_sn;
102 	optional_device<samples_device> m_samples;
103 	optional_device<speaker_sound_device> m_speaker;
104 	optional_device<eeprom_serial_93cxx_device> m_eeprom;
105 	optional_device<palette_device> m_palette;
106 	optional_shared_ptr<uint8_t> m_colorram;
107 
108 private:
109 	/* misc game specific */
110 	optional_ioport m_gunx;
111 	optional_ioport m_guny;
112 
113 	uint8_t m_color_map;
114 	uint8_t m_screen_red;
115 	uint8_t m_fleet_step;
116 
117 	std::unique_ptr<uint8_t[]> m_scattered_colorram;
118 	std::unique_ptr<uint8_t[]> m_scattered_colorram2;
119 
120 	/* sound-related */
121 	uint8_t       m_port_1_last_extra;
122 	uint8_t       m_port_2_last_extra;
123 	uint8_t       m_port_3_last_extra;
124 
125 	attotime m_schaser_effect_555_time_remain;
126 	int32_t m_schaser_effect_555_time_remain_savable;
127 	int m_schaser_effect_555_is_low;
128 	int m_schaser_explosion;
129 	int m_schaser_last_effect;
130 	uint8_t m_polaris_cloud_speed;
131 	uint8_t m_polaris_cloud_pos;
132 	uint8_t m_schaser_background_disable;
133 	uint8_t m_schaser_background_select;
134 	uint16_t m_claybust_gun_pos;
135 	u8 m_sound_data;
136 	bool m_timer_state;
137 
138 	TIMER_DEVICE_CALLBACK_MEMBER(nmi_timer);
139 	uint8_t indianbt_r();
140 	uint8_t polaris_port00_r();
141 	void steelwkr_sh_port_3_w(uint8_t data);
142 	void invadpt2_sh_port_1_w(uint8_t data);
143 	void invadpt2_sh_port_2_w(uint8_t data);
144 	void spacerng_sh_port_2_w(uint8_t data);
145 	void spcewars_sh_port_w(uint8_t data);
146 	void lrescue_sh_port_1_w(uint8_t data);
147 	void lrescue_sh_port_2_w(uint8_t data);
148 	void cosmo_sh_port_2_w(uint8_t data);
149 	uint8_t darthvdr_01_r();
150 	void darthvdr_00_w(uint8_t data);
151 	void darthvdr_08_w(uint8_t data);
152 	IRQ_CALLBACK_MEMBER(darthvdr_interrupt_vector);
153 	void ballbomb_01_w(uint8_t data);
154 	void ballbomb_sh_port_1_w(uint8_t data);
155 	void ballbomb_sh_port_2_w(uint8_t data);
156 	void indianbt_sh_port_1_w(uint8_t data);
157 	void indianbt_sh_port_2_w(uint8_t data);
158 	void indianbtbr_sh_port_1_w(uint8_t data);
159 	void indianbtbr_sh_port_2_w(uint8_t data);
160 	uint8_t indianbtbr_01_r();
161 	void schaser_sh_port_1_w(uint8_t data);
162 	void schaser_sh_port_2_w(uint8_t data);
163 	void rollingc_sh_port_w(uint8_t data);
164 	uint8_t invrvnge_02_r();
165 	void invrvnge_port03_w(uint8_t data);
166 	void invrvnge_port05_w(uint8_t data);
167 	void lupin3_00_w(uint8_t data);
168 	void lupin3_sh_port_1_w(uint8_t data);
169 	void lupin3_sh_port_2_w(uint8_t data);
170 	uint8_t schasercv_02_r();
171 	void schasercv_sh_port_1_w(uint8_t data);
172 	void schasercv_sh_port_2_w(uint8_t data);
173 	void crashrd_port03_w(uint8_t data);
174 	void crashrd_port05_w(uint8_t data);
175 	void yosakdon_sh_port_1_w(uint8_t data);
176 	void yosakdon_sh_port_2_w(uint8_t data);
177 	uint8_t shuttlei_ff_r();
178 	void shuttlei_ff_w(uint8_t data);
179 	void shuttlei_sh_port_1_w(uint8_t data);
180 	void shuttlei_sh_port_2_w(uint8_t data);
181 	uint8_t claybust_gun_lo_r();
182 	uint8_t claybust_gun_hi_r();
183 	uint8_t invmulti_eeprom_r();
184 	void invmulti_eeprom_w(uint8_t data);
185 	void invmulti_bank_w(uint8_t data);
186 
187 	uint8_t rollingc_scattered_colorram_r(offs_t offset);
188 	void rollingc_scattered_colorram_w(offs_t offset, uint8_t data);
189 	uint8_t rollingc_scattered_colorram2_r(offs_t offset);
190 	void rollingc_scattered_colorram2_w(offs_t offset, uint8_t data);
191 	uint8_t schaser_scattered_colorram_r(offs_t offset);
192 	void schaser_scattered_colorram_w(offs_t offset, uint8_t data);
193 
194 	DECLARE_MACHINE_START(extra_8080bw);
195 	DECLARE_MACHINE_START(rollingc);
196 	DECLARE_MACHINE_START(sflush);
197 	DECLARE_MACHINE_START(schaser);
198 	DECLARE_MACHINE_START(schasercv);
199 	DECLARE_MACHINE_RESET(schaser);
200 	DECLARE_MACHINE_START(polaris);
201 	DECLARE_MACHINE_START(darthvdr);
202 	DECLARE_MACHINE_RESET(darthvdr);
203 	DECLARE_MACHINE_START(extra_8080bw_sh);
204 	DECLARE_MACHINE_START(extra_8080bw_vh);
205 	DECLARE_MACHINE_START(schaser_sh);
206 	DECLARE_MACHINE_RESET(schaser_sh);
207 	DECLARE_MACHINE_START(claybust);
208 
209 	void rollingc_palette(palette_device &palette) const;
210 	void sflush_palette(palette_device &palette) const;
211 
212 	uint32_t screen_update_invadpt2(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
213 	uint32_t screen_update_cosmo(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
214 	uint32_t screen_update_rollingc(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
215 	uint32_t screen_update_schaser(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
216 	uint32_t screen_update_schasercv(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
217 	uint32_t screen_update_sflush(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
218 	uint32_t screen_update_indianbt(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
219 	uint32_t screen_update_lupin3(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
220 	uint32_t screen_update_polaris(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
221 	uint32_t screen_update_ballbomb(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
222 	uint32_t screen_update_shuttlei(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
223 	uint32_t screen_update_spacecom(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
224 
225 	DECLARE_WRITE_LINE_MEMBER(polaris_60hz_w);
226 	TIMER_DEVICE_CALLBACK_MEMBER(claybust_gun_callback);
227 	TIMER_DEVICE_CALLBACK_MEMBER(schaser_effect_555_cb);
228 	void indianbt_sh_port_3_w(uint8_t data);
229 	void polaris_sh_port_1_w(uint8_t data);
230 	void polaris_sh_port_2_w(uint8_t data);
231 	void polaris_sh_port_3_w(uint8_t data);
232 
233 	void schaser_reinit_555_time_remain();
234 	inline void set_pixel( bitmap_rgb32 &bitmap, uint8_t y, uint8_t x, int color );
235 
236 	void invaders_samples_audio(machine_config &config);
237 
238 	void astropal_io_map(address_map &map);
239 	void attackfc_io_map(address_map &map);
240 	void ballbomb_io_map(address_map &map);
241 	void claybust_io_map(address_map &map);
242 	void cosmicmo_io_map(address_map &map);
243 	void cosmo_io_map(address_map &map);
244 	void cosmo_map(address_map &map);
245 	void crashrd_io_map(address_map &map);
246 	void darthvdr_io_map(address_map &map);
247 	void darthvdr_map(address_map &map);
248 	void escmars_map(address_map &map);
249 	void indianbt_io_map(address_map &map);
250 	void indianbtbr_io_map(address_map &map);
251 	void invadpt2_io_map(address_map &map);
252 	void invmulti_map(address_map &map);
253 	void invrvnge_io_map(address_map &map);
254 	void invrvnge_sound_map(address_map &map);
255 	void lrescue_io_map(address_map &map);
256 	void lupin3_io_map(address_map &map);
257 	void polaris_io_map(address_map &map);
258 	void rollingc_io_map(address_map &map);
259 	void rollingc_map(address_map &map);
260 	void schaser_io_map(address_map &map);
261 	void schaser_map(address_map &map);
262 	void schasercv_io_map(address_map &map);
263 	void sflush_map(address_map &map);
264 	void shuttlei_io_map(address_map &map);
265 	void shuttlei_map(address_map &map);
266 	void spacecom_io_map(address_map &map);
267 	void spacecom_map(address_map &map);
268 	void spacerng_io_map(address_map &map);
269 	void spcewarla_io_map(address_map &map);
270 	void spcewars_io_map(address_map &map);
271 	void starw1_io_map(address_map &map);
272 	void steelwkr_io_map(address_map &map);
273 	void vortex_io_map(address_map &map);
274 	void yosakdon_io_map(address_map &map);
275 	void yosakdon_map(address_map &map);
276 };
277 
278 
279 /*----------- defined in audio/8080bw.cpp -----------*/
280 extern const char *const lrescue_sample_names[];
281 extern const char *const lupin3_sample_names[];
282 
283 DISCRETE_SOUND_EXTERN( ballbomb_discrete );
284 DISCRETE_SOUND_EXTERN( indianbt_discrete );
285 DISCRETE_SOUND_EXTERN( polaris_discrete );
286 DISCRETE_SOUND_EXTERN( schaser_discrete );
287 
288 /*******************************************************/
289 /*                                                     */
290 /* Cane (Model Racing)                                 */
291 /*                                                     */
292 /*******************************************************/
293 class cane_state : public _8080bw_state
294 {
295 public:
cane_state(machine_config const & mconfig,device_type type,char const * tag)296 	cane_state(machine_config const &mconfig, device_type type, char const *tag) :
297 		_8080bw_state(mconfig, type, tag)
298 	{
299 	}
300 
301 	void cane(machine_config &config);
302 	void cane_audio(machine_config &config);
303 
304 protected:
305 	void cane_unknown_port0_w(u8 data);
306 
307 private:
308 	void cane_io_map(address_map &map);
309 	void cane_map(address_map &map);
310 };
311 
312 DISCRETE_SOUND_EXTERN( cane_discrete );
313 
314 /*******************************************************/
315 /*                                                     */
316 /* Model Racing "Orbite"                               */
317 /*                                                     */
318 /*******************************************************/
319 class orbite_state : public _8080bw_state
320 {
321 public:
orbite_state(machine_config const & mconfig,device_type type,char const * tag)322 	orbite_state(machine_config const &mconfig, device_type type, char const *tag) :
323 		_8080bw_state(mconfig, type, tag),
324 		m_main_ram(*this, "main_ram")
325 	{
326 	}
327 
328 	void orbite(machine_config &config);
329 
330 protected:
331 	required_shared_ptr<uint8_t> m_main_ram;
332 	std::unique_ptr<uint8_t[]> m_scattered_colorram;
333 
334 	virtual void machine_start() override;
335 
336 	u8 orbite_scattered_colorram_r(ATTR_UNUSED address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED u8 mem_mask = 0xff);
337 	void orbite_scattered_colorram_w(ATTR_UNUSED address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED u8 data, ATTR_UNUSED u8 mem_mask = 0xff);
338 
339 private:
340 	void orbite_io_map(address_map &map);
341 	void orbite_map(address_map &map);
342 
343 	u32 screen_update_orbite(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
344 };
345 
346 #endif // MAME_INCLUDES_8080BW_H
347