1 // license:BSD-3-Clause
2 // copyright-holders:Aaron Giles
3 /*************************************************************************
4 
5     Driver for early Williams games
6 
7 **************************************************************************/
8 #ifndef MAME_INCLUDES_WILLIAMS_H
9 #define MAME_INCLUDES_WILLIAMS_H
10 
11 #pragma once
12 
13 #include "audio/williams.h"
14 #include "audio/s11c_bg.h"
15 #include "cpu/m6800/m6800.h"
16 #include "cpu/m6809/m6809.h"
17 #include "machine/6821pia.h"
18 #include "machine/74157.h"
19 #include "machine/bankdev.h"
20 #include "machine/ticket.h"
21 #include "machine/timer.h"
22 #include "machine/watchdog.h"
23 #include "sound/hc55516.h"
24 #include "emupal.h"
25 #include "screen.h"
26 #include "tilemap.h"
27 
28 class williams_state : public driver_device
29 {
30 public:
williams_state(const machine_config & mconfig,device_type type,const char * tag)31 	williams_state(const machine_config &mconfig, device_type type, const char *tag) :
32 		driver_device(mconfig, type, tag),
33 		m_nvram(*this, "nvram"),
34 		m_videoram(*this, "videoram"),
35 		m_mainbank(*this, "mainbank"),
36 		m_maincpu(*this, "maincpu"),
37 		m_soundcpu(*this, "soundcpu"),
38 		m_watchdog(*this, "watchdog"),
39 		m_screen(*this, "screen"),
40 		m_palette(*this, "palette"),
41 		m_paletteram(*this, "paletteram"),
42 		m_pia(*this, "pia_%u", 0U)
43 	{ }
44 
45 	void lottofun(machine_config &config);
46 	void williams_base(machine_config &config);
47 
48 	void init_stargate();
49 	void init_playball();
50 	void init_lottofun();
51 	void init_robotron();
52 
53 	u8 port_0_49way_r();
54 	virtual u8 video_counter_r();
55 	virtual void watchdog_reset_w(u8 data);
56 
57 	virtual TIMER_DEVICE_CALLBACK_MEMBER(va11_callback);
58 	TIMER_DEVICE_CALLBACK_MEMBER(count240_callback);
59 
60 	virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
61 	void palette_init(palette_device &palette) const;
62 
63 protected:
64 	virtual void machine_start() override;
65 	virtual void video_start() override;
66 
67 	enum
68 	{
69 		//controlbyte (0xCA00) bit definitions
70 		WMS_BLITTER_CONTROLBYTE_NO_EVEN = 0x80,
71 		WMS_BLITTER_CONTROLBYTE_NO_ODD = 0x40,
72 		WMS_BLITTER_CONTROLBYTE_SHIFT = 0x20,
73 		WMS_BLITTER_CONTROLBYTE_SOLID = 0x10,
74 		WMS_BLITTER_CONTROLBYTE_FOREGROUND_ONLY = 0x08,
75 		WMS_BLITTER_CONTROLBYTE_SLOW = 0x04, //2us blits instead of 1us
76 		WMS_BLITTER_CONTROLBYTE_DST_STRIDE_256 = 0x02,
77 		WMS_BLITTER_CONTROLBYTE_SRC_STRIDE_256 = 0x01
78 	};
79 
80 	required_shared_ptr<uint8_t> m_nvram;
81 	required_shared_ptr<uint8_t> m_videoram;
82 	optional_memory_bank m_mainbank;
83 	uint8_t m_blitter_config;
84 	uint16_t m_blitter_clip_address;
85 	uint8_t m_blitter_window_enable;
86 	uint8_t m_cocktail;
87 	std::unique_ptr<rgb_t[]> m_palette_lookup;
88 	uint8_t m_blitterram[8];
89 	uint8_t m_blitter_xor;
90 	uint8_t m_blitter_remap_index;
91 	const uint8_t *m_blitter_remap;
92 	std::unique_ptr<uint8_t[]> m_blitter_remap_lookup;
93 	virtual void vram_select_w(u8 data);
94 	virtual void cmos_w(offs_t offset, u8 data);
95 	void sinistar_vram_select_w(u8 data);
96 	void blitter_w(address_space &space, offs_t offset, u8 data);
97 
98 	TIMER_CALLBACK_MEMBER(deferred_snd_cmd_w);
99 
100 	void snd_cmd_w(u8 data);
101 
102 	DECLARE_WRITE_LINE_MEMBER(lottofun_coin_lock_w);
103 
104 	void state_save_register();
105 	void blitter_init(int blitter_config, const uint8_t *remap_prom);
106 	inline void blit_pixel(address_space &space, int dstaddr, int srcdata, int controlbyte);
107 	int blitter_core(address_space &space, int sstart, int dstart, int w, int h, int data);
108 
109 	required_device<cpu_device> m_maincpu;
110 	required_device<cpu_device> m_soundcpu;
111 	required_device<watchdog_timer_device> m_watchdog;
112 	required_device<screen_device> m_screen;
113 	optional_device<palette_device> m_palette;
114 	optional_shared_ptr<uint8_t> m_paletteram;
115 	optional_device_array<pia6821_device, 4> m_pia;
116 
117 	virtual void sound_map(address_map &map);
118 	void base_map(address_map &map);
119 };
120 
121 class defender_state : public williams_state
122 {
123 public:
defender_state(const machine_config & mconfig,device_type type,const char * tag)124 	defender_state(const machine_config &mconfig, device_type type, const char *tag) :
125 		williams_state(mconfig, type, tag),
126 		m_bankc000(*this, "bankc000")
127 	{ }
128 
129 	void defender(machine_config &config);
130 	void jin(machine_config &config);
131 
132 protected:
133 	virtual void driver_init() override;
134 
135 	virtual void main_map(address_map &map);
136 
137 	void video_control_w(u8 data);
138 
139 	required_device<address_map_bank_device> m_bankc000;
140 
141 private:
machine_start()142 	virtual void machine_start() override { }
143 	virtual void machine_reset() override;
144 
145 	void bankc000_map(address_map &map);
146 	virtual void sound_map(address_map &map) override;
147 
148 	void bank_select_w(u8 data);
149 };
150 
151 class defndjeu_state : public defender_state
152 {
153 public:
defndjeu_state(const machine_config & mconfig,device_type type,const char * tag)154 	defndjeu_state(const machine_config &mconfig, device_type type, const char *tag) :
155 		defender_state(mconfig, type, tag)
156 	{ }
157 
158 private:
159 	virtual void driver_init() override;
160 };
161 
162 class mayday_state : public defender_state
163 {
164 public:
mayday_state(const machine_config & mconfig,device_type type,const char * tag)165 	mayday_state(const machine_config &mconfig, device_type type, const char *tag) :
166 		defender_state(mconfig, type, tag)
167 	{ }
168 
169 private:
170 	virtual void driver_init() override;
171 
172 	virtual void main_map(address_map &map) override;
173 
174 	uint8_t *m_protection;
175 	u8 protection_r(offs_t offset);
176 };
177 
178 class sinistar_state : public williams_state
179 {
180 public:
sinistar_state(const machine_config & mconfig,device_type type,const char * tag)181 	sinistar_state(const machine_config &mconfig, device_type type, const char *tag) :
182 		williams_state(mconfig, type, tag)
183 	{ }
184 
185 	void sinistar(machine_config &config);
186 
187 private:
188 	virtual void driver_init() override;
189 
190 	virtual void vram_select_w(u8 data) override;
191 
192 	void main_map(address_map &map);
193 };
194 
195 class bubbles_state : public williams_state
196 {
197 public:
bubbles_state(const machine_config & mconfig,device_type type,const char * tag)198 	bubbles_state(const machine_config &mconfig, device_type type, const char *tag) :
199 		williams_state(mconfig, type, tag)
200 	{ }
201 
202 	void bubbles(machine_config &config);
203 
204 private:
205 	virtual void driver_init() override;
206 
207 	void main_map(address_map &map);
208 
209 	virtual void cmos_w(offs_t offset, u8 data) override;
210 };
211 
212 class playball_state : public williams_state
213 {
214 public:
playball_state(const machine_config & mconfig,device_type type,const char * tag)215 	playball_state(const machine_config &mconfig, device_type type, const char *tag) :
216 		williams_state(mconfig, type, tag)
217 	{ }
218 
219 	void playball(machine_config &config);
220 
221 private:
222 	virtual void driver_init() override;
223 
224 	void snd_cmd_w(u8 data);
225 };
226 
227 class williams_muxed_state : public williams_state
228 {
229 public:
williams_muxed_state(const machine_config & mconfig,device_type type,const char * tag)230 	williams_muxed_state(const machine_config &mconfig, device_type type, const char *tag) :
231 		williams_state(mconfig, type, tag),
232 		m_mux0(*this, "mux_0"),
233 		m_mux1(*this, "mux_1")
234 	{ }
235 
236 	void williams_muxed(machine_config &config);
237 
238 	void init_splat();
239 	void init_joust();
240 	void init_alienar();
241 	void init_alienaru();
242 
243 private:
244 	required_device<ls157_device> m_mux0;
245 	required_device<ls157_device> m_mux1;
246 };
247 
248 class spdball_state : public williams_state
249 {
250 public:
spdball_state(const machine_config & mconfig,device_type type,const char * tag)251 	spdball_state(const machine_config &mconfig, device_type type, const char *tag) :
252 		williams_state(mconfig, type, tag)
253 	{ }
254 
255 	void spdball(machine_config &config);
256 
257 private:
258 	virtual void driver_init() override;
259 
260 	void main_map(address_map &map);
261 };
262 
263 class blaster_state : public williams_state
264 {
265 public:
blaster_state(const machine_config & mconfig,device_type type,const char * tag)266 	blaster_state(const machine_config &mconfig, device_type type, const char *tag) :
267 		williams_state(mconfig, type, tag),
268 		m_soundcpu_b(*this, "soundcpu_b"),
269 		m_palette_0(*this, "blaster_pal0"),
270 		m_scanline_control(*this, "blaster_scan"),
271 		m_bankb(*this, "blaster_bankb"),
272 		m_muxa(*this, "mux_a"),
273 		m_muxb(*this, "mux_b")
274 	{ }
275 
276 	void blastkit(machine_config &config);
277 	void blaster(machine_config &config);
278 
279 private:
280 	virtual void machine_start() override;
281 	virtual void video_start() override;
282 	virtual void driver_init() override;
283 
284 	optional_device<cpu_device> m_soundcpu_b;
285 	required_shared_ptr<uint8_t> m_palette_0;
286 	required_shared_ptr<uint8_t> m_scanline_control;
287 	optional_memory_bank m_bankb;
288 	required_device<ls157_x2_device> m_muxa;
289 	optional_device<ls157_device> m_muxb;
290 
291 	rgb_t m_color0;
292 	uint8_t m_video_control;
293 	uint8_t m_vram_bank;
294 	uint8_t m_rom_bank;
295 
296 	virtual void vram_select_w(u8 data) override;
297 	void bank_select_w(u8 data);
298 	void remap_select_w(u8 data);
299 	void video_control_w(u8 data);
300 	TIMER_CALLBACK_MEMBER(deferred_snd_cmd_w);
301 	void snd_cmd_w(u8 data);
302 
303 	virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override;
304 
305 	inline void update_blaster_banking();
306 
307 	void main_map(address_map &map);
308 	void sound2_map(address_map &map);
309 };
310 
311 class williams2_state : public williams_state
312 {
313 public:
williams2_state(const machine_config & mconfig,device_type type,const char * tag)314 	williams2_state(const machine_config &mconfig, device_type type, const char *tag) :
315 		williams_state(mconfig, type, tag),
316 		m_bank8000(*this, "bank8000"),
317 		m_gfxdecode(*this, "gfxdecode"),
318 		m_tileram(*this, "williams2_tile"),
319 		m_gain(  { 0.25f, 0.25f, 0.25f }),
320 		m_offset({ 0.00f, 0.00f, 0.00f })
321 	{ }
322 
323 	void williams2_base(machine_config &config);
324 
INPUT_CHANGED_MEMBER(rgb_gain)325 	INPUT_CHANGED_MEMBER(rgb_gain)
326 	{
327 		if (param < 3)
328 			m_gain[param] = float(newval) / 100.0f;
329 		else
330 			m_offset[param - 3] = (float(newval) / 100.0f) - 1.0f;
331 		rebuild_palette();
332 	}
333 
334 protected:
335 	virtual void machine_start() override;
336 	virtual void machine_reset() override;
337 	virtual void video_start() override;
338 
339 	required_device<address_map_bank_device> m_bank8000;
340 	required_device<gfxdecode_device> m_gfxdecode;
341 	required_shared_ptr<uint8_t> m_tileram;
342 
343 	tilemap_t *m_bg_tilemap;
344 	uint16_t m_tilemap_xscroll;
345 	uint8_t m_fg_color;
346 	std::array<float, 3> m_gain;
347 	std::array<float, 3> m_offset;
348 
349 	virtual u8 video_counter_r() override;
350 
351 	virtual TILE_GET_INFO_MEMBER(get_tile_info);
352 	void bank_select_w(u8 data);
353 	virtual void watchdog_reset_w(u8 data) override;
354 	void segments_w(u8 data);
355 
356 	rgb_t calc_col(uint16_t lo, uint16_t hi);
357 	void paletteram_w(offs_t offset, u8 data);
358 	void rebuild_palette();
359 	void fg_select_w(u8 data);
360 	virtual void bg_select_w(u8 data);
361 	void tileram_w(offs_t offset, u8 data);
362 	void xscroll_low_w(u8 data);
363 	void xscroll_high_w(u8 data);
364 	void blit_window_enable_w(u8 data);
365 	virtual TIMER_DEVICE_CALLBACK_MEMBER(va11_callback) override;
366 	TIMER_DEVICE_CALLBACK_MEMBER(endscreen_callback);
367 	TIMER_CALLBACK_MEMBER(deferred_snd_cmd_w);
368 	void snd_cmd_w(u8 data);
369 
370 	virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override;
371 
372 	void bank8000_map(address_map &map);
373 	void common_map(address_map &map);
374 	virtual void sound_map(address_map &map) override;
375 
376 	void video_control_w(u8 data);
377 };
378 
379 class williams_d000_rom_state : public williams2_state
380 {
381 public:
williams_d000_rom_state(const machine_config & mconfig,device_type type,const char * tag)382 	williams_d000_rom_state(const machine_config &mconfig, device_type type, const char *tag) :
383 		williams2_state(mconfig, type, tag)
384 	{ }
385 
386 protected:
387 	void d000_map(address_map &map);
388 };
389 
390 class williams_d000_ram_state : public williams2_state
391 {
392 public:
williams_d000_ram_state(const machine_config & mconfig,device_type type,const char * tag)393 	williams_d000_ram_state(const machine_config &mconfig, device_type type, const char *tag) :
394 		williams2_state(mconfig, type, tag)
395 	{ }
396 
397 protected:
398 	void d000_map(address_map &map);
399 };
400 
401 class inferno_state : public williams_d000_ram_state
402 {
403 public:
inferno_state(const machine_config & mconfig,device_type type,const char * tag)404 	inferno_state(const machine_config &mconfig, device_type type, const char *tag) :
405 		williams_d000_ram_state(mconfig, type, tag),
406 		m_mux(*this, "mux")
407 	{ }
408 
409 	void inferno(machine_config &config);
410 
411 private:
412 	virtual void driver_init() override;
413 
414 	required_device<ls157_device> m_mux;
415 };
416 
417 class mysticm_state : public williams_d000_ram_state
418 {
419 public:
mysticm_state(const machine_config & mconfig,device_type type,const char * tag)420 	mysticm_state(const machine_config &mconfig, device_type type, const char *tag) :
421 		williams_d000_ram_state(mconfig, type, tag)
422 	{
423 		// overwrite defaults for mysticm
424 		m_gain =   {   0.8f, 0.73f,  0.81f };
425 		m_offset = { -0.27f, 0.00f, -0.22f };
426 	}
427 
428 	void mysticm(machine_config &config);
429 
430 protected:
431 	virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override;
432 
433 private:
434 	virtual void driver_init() override;
435 
436 	virtual TILE_GET_INFO_MEMBER(get_tile_info) override;
437 	virtual void bg_select_w(u8 data) override;
438 
439 	int color_decode(uint8_t base_col, int sig_J1, int y);
440 
441 	uint8_t m_bg_color;
442 
443 };
444 
445 class tshoot_state : public williams_d000_rom_state
446 {
447 public:
tshoot_state(const machine_config & mconfig,device_type type,const char * tag)448 	tshoot_state(const machine_config &mconfig, device_type type, const char *tag) :
449 		williams_d000_rom_state(mconfig, type, tag),
450 		m_mux(*this, "mux"),
451 		m_gun(*this, {"GUNX", "GUNY"}),
452 		m_grenade_lamp(*this, "Grenade_lamp"),
453 		m_gun_lamp(*this, "Gun_lamp"),
454 		m_p1_gun_recoil(*this, "Player1_Gun_Recoil"),
455 		m_feather_blower(*this, "Feather_Blower")
456 	{ }
457 
458 	void tshoot(machine_config &config);
459 
460 	template <int P> DECLARE_CUSTOM_INPUT_MEMBER(gun_r);
461 
462 private:
463 	virtual void machine_start() override;
464 	virtual void driver_init() override;
465 
466 	DECLARE_WRITE_LINE_MEMBER(maxvol_w);
467 	void lamp_w(u8 data);
468 
469 	required_device<ls157_device> m_mux;
470 	required_ioport_array<2> m_gun;
471 	output_finder<> m_grenade_lamp;
472 	output_finder<> m_gun_lamp;
473 	output_finder<> m_p1_gun_recoil;
474 	output_finder<> m_feather_blower;
475 };
476 
477 class joust2_state : public williams_d000_rom_state
478 {
479 public:
joust2_state(const machine_config & mconfig,device_type type,const char * tag)480 	joust2_state(const machine_config &mconfig, device_type type, const char *tag) :
481 		williams_d000_rom_state(mconfig, type, tag),
482 		m_mux(*this, "mux"),
483 		m_bg(*this, "bg")
484 	{ }
485 
486 	void joust2(machine_config &config);
487 
488 private:
489 	virtual void machine_start() override;
490 	virtual void driver_init() override;
491 
492 	required_device<ls157_device> m_mux;
493 	required_device<s11_obg_device> m_bg;
494 	uint16_t m_current_sound_data;
495 
496 	virtual TILE_GET_INFO_MEMBER(get_tile_info) override;
497 	virtual void bg_select_w(u8 data) override;
498 
499 	TIMER_CALLBACK_MEMBER(deferred_snd_cmd_w);
500 	void snd_cmd_w(u8 data);
501 	DECLARE_WRITE_LINE_MEMBER(pia_s11_bg_strobe_w);
502 };
503 
504 /*----------- defined in video/williams.cpp -----------*/
505 
506 #define WILLIAMS_BLITTER_NONE       0       /* no blitter */
507 #define WILLIAMS_BLITTER_SC1        1       /* Special Chip 1 blitter */
508 #define WILLIAMS_BLITTER_SC2        2       /* Special Chip 2 "bugfixed" blitter */
509 
510 #define WILLIAMS_TILEMAP_MYSTICM    0       /* IC79 is a 74LS85 comparator */
511 #define WILLIAMS_TILEMAP_TSHOOT     1       /* IC79 is a 74LS157 selector jumpered to be enabled */
512 #define WILLIAMS_TILEMAP_JOUST2     2       /* IC79 is a 74LS157 selector jumpered to be disabled */
513 
514 #endif // MAME_INCLUDES_WILLIAMS_H
515