1 // license:BSD-3-Clause
2 // copyright-holders:Nicola Salmoria
3 #ifndef MAME_INCLUDES_GALAGA_H
4 #define MAME_INCLUDES_GALAGA_H
5 
6 #pragma once
7 
8 #include "video/starfield_05xx.h"
9 #include "machine/74259.h"
10 #include "sound/discrete.h"
11 #include "sound/namco.h"
12 #include "sound/samples.h"
13 #include "emupal.h"
14 #include "screen.h"
15 #include "tilemap.h"
16 
17 
18 class galaga_state : public driver_device
19 {
20 public:
galaga_state(const machine_config & mconfig,device_type type,const char * tag)21 	galaga_state(const machine_config &mconfig, device_type type, const char *tag)
22 		: driver_device(mconfig, type, tag)
23 		, m_videoram(*this, "videoram")
24 		, m_galaga_ram1(*this, "galaga_ram1")
25 		, m_galaga_ram2(*this, "galaga_ram2")
26 		, m_galaga_ram3(*this, "galaga_ram3")
27 		, m_videolatch(*this, "videolatch")
28 		, m_maincpu(*this, "maincpu")
29 		, m_subcpu(*this, "sub")
30 		, m_subcpu2(*this, "sub2")
31 		, m_namco_sound(*this, "namco")
32 		, m_gfxdecode(*this, "gfxdecode")
33 		, m_screen(*this, "screen")
34 		, m_palette(*this, "palette")
35 		, m_leds(*this, "led%u", 0U)
36 		, m_starfield(*this, "starfield")
37 		, m_galaga_gfxbank(0)
38 		, m_main_irq_mask(0)
39 		, m_sub_irq_mask(0)
40 		, m_sub2_nmi_mask(0)
41 	{ }
42 
43 	uint8_t bosco_dsw_r(offs_t offset);
44 	DECLARE_WRITE_LINE_MEMBER(flip_screen_w);
45 	DECLARE_WRITE_LINE_MEMBER(irq1_clear_w);
46 	DECLARE_WRITE_LINE_MEMBER(irq2_clear_w);
47 	DECLARE_WRITE_LINE_MEMBER(nmion_w);
48 	void galaga_videoram_w(offs_t offset, uint8_t data);
49 	DECLARE_WRITE_LINE_MEMBER(gatsbee_bank_w);
50 	void out(uint8_t data);
51 	DECLARE_WRITE_LINE_MEMBER(lockout);
52 	uint8_t namco_52xx_rom_r(offs_t offset);
53 	uint8_t namco_52xx_si_r();
54 	void init_galaga();
55 	void init_gatsbee();
56 	TILEMAP_MAPPER_MEMBER(tilemap_scan);
57 	TILE_GET_INFO_MEMBER(get_tile_info);
58 	DECLARE_VIDEO_START(galaga);
59 	void galaga_palette(palette_device &palette) const;
60 	uint32_t screen_update_galaga(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
61 	DECLARE_WRITE_LINE_MEMBER(screen_vblank_galaga);
62 	DECLARE_WRITE_LINE_MEMBER(vblank_irq);
63 	TIMER_CALLBACK_MEMBER(cpu3_interrupt_callback);
64 	void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect );
65 	uint16_t get_next_lfsr_state(uint16_t lfsr);
66 	void draw_stars(bitmap_ind16 &bitmap, const rectangle &cliprect );
67 	void galaga(machine_config &config);
68 	void gatsbee(machine_config &config);
69 	void galagab(machine_config &config);
70 	void dzigzag_mem4(address_map &map);
71 	void galaga_map(address_map &map);
72 	void galaga_mem4(address_map &map);
73 	void gatsbee_main_map(address_map &map);
74 
75 protected:
76 	virtual void machine_start() override;
77 	virtual void machine_reset() override;
78 
79 	/* memory pointers, devices */
80 	optional_shared_ptr<uint8_t> m_videoram;
81 	optional_shared_ptr<uint8_t> m_galaga_ram1;
82 	optional_shared_ptr<uint8_t> m_galaga_ram2;
83 	optional_shared_ptr<uint8_t> m_galaga_ram3;
84 	optional_device<ls259_device> m_videolatch; // not present on Xevious
85 	required_device<cpu_device> m_maincpu;
86 	required_device<cpu_device> m_subcpu;
87 	required_device<cpu_device> m_subcpu2;
88 	required_device<namco_device> m_namco_sound;
89 	required_device<gfxdecode_device> m_gfxdecode;
90 	required_device<screen_device> m_screen;
91 	required_device<palette_device> m_palette;
92 	output_finder<2> m_leds;
93 	optional_device<starfield_05xx_device> m_starfield; // not present on battles, digdug, xevious
94 	emu_timer *m_cpu3_interrupt_timer;
95 
96 	uint32_t m_galaga_gfxbank; // used by gatsbee
97 
98 	/* shared */
99 	tilemap_t *m_fg_tilemap;
100 	tilemap_t *m_bg_tilemap;
101 
102 	uint8_t m_main_irq_mask;
103 	uint8_t m_sub_irq_mask;
104 	uint8_t m_sub2_nmi_mask;
105 };
106 
107 DISCRETE_SOUND_EXTERN( galaga_discrete );
108 DISCRETE_SOUND_EXTERN( bosco_discrete );
109 
110 #endif // MAME_INCLUDES_GALAGA_H
111