1 // license:BSD-3-Clause
2 // copyright-holders:Luca Elia, David Haywood
3 /*************************************************************************
4 
5     Metro Games
6 
7 *************************************************************************/
8 #ifndef MAME_INCLUDES_METRO_H
9 #define MAME_INCLUDES_METRO_H
10 
11 #pragma once
12 
13 #include "sound/okim6295.h"
14 #include "sound/ym2151.h"
15 #include "sound/es8712.h"
16 #include "video/k053936.h"
17 #include "video/imagetek_i4100.h"
18 #include "machine/eepromser.h"
19 #include "machine/gen_latch.h"
20 #include "machine/timer.h"
21 #include "screen.h"
22 #include "tilemap.h"
23 
24 class metro_state : public driver_device
25 {
26 public:
metro_state(const machine_config & mconfig,device_type type,const char * tag)27 	metro_state(const machine_config &mconfig, device_type type, const char *tag)
28 		: driver_device(mconfig, type, tag)
29 		, m_maincpu(*this, "maincpu")
30 		, m_audiocpu(*this, "audiocpu")
31 		, m_oki(*this, "oki")
32 		, m_ymsnd(*this, "ymsnd")
33 		, m_essnd(*this, "essnd")
34 		, m_vdp(*this, "vdp")
35 		, m_vdp2(*this, "vdp2")
36 		, m_vdp3(*this, "vdp3")
37 		, m_k053936(*this, "k053936")
38 		, m_eeprom(*this, "eeprom")
39 		, m_gfxdecode(*this, "gfxdecode")
40 		, m_screen(*this, "screen")
41 		, m_soundlatch(*this, "soundlatch")
42 		, m_irq_enable(*this, "irq_enable")
43 		, m_irq_levels(*this, "irq_levels")
44 		, m_irq_vectors(*this, "irq_vectors")
45 		, m_input_sel(*this, "input_sel")
46 		, m_k053936_ram(*this, "k053936_ram")
47 		, m_audiobank(*this, "audiobank")
48 		, m_okibank(*this, "okibank")
49 	{ }
50 
51 	void i4100_config(machine_config &config);
52 	void i4100_config_360x224(machine_config &config);
53 	void i4220_config(machine_config &config);
54 	void i4220_config_320x240(machine_config &config);
55 	void i4220_config_304x224(machine_config &config);
56 	void i4300_config(machine_config &config);
57 	void i4300_config_384x224(machine_config &config);
58 	void i4300_config_320x240(machine_config &config);
59 	void metro_upd7810_sound(machine_config &config);
60 	void daitorid_upd7810_sound(machine_config &config);
61 	void poitto(machine_config &config);
62 	void blzntrnd(machine_config &config);
63 	void sankokushi(machine_config &config);
64 	void mouja(machine_config &config);
65 	void toride2g(machine_config &config);
66 	void karatour(machine_config &config);
67 	void skyalert(machine_config &config);
68 	void gakusai(machine_config &config);
69 	void batlbubl(machine_config &config);
70 	void pururun(machine_config &config);
71 	void vmetal(machine_config &config);
72 	void daitorid(machine_config &config);
73 	void puzzli(machine_config &config);
74 	void puzzlia(machine_config &config);
75 	void pangpoms(machine_config &config);
76 	void dokyusp(machine_config &config);
77 	void dokyusei(machine_config &config);
78 	void daitoa(machine_config &config);
79 	void lastfort(machine_config &config);
80 	void puzzlet(machine_config &config);
81 	void gakusai2(machine_config &config);
82 	void balcube(machine_config &config);
83 	void msgogo(machine_config &config);
84 	void gstrik2(machine_config &config);
85 	void lastforg(machine_config &config);
86 	void bangball(machine_config &config);
87 	void dharma(machine_config &config);
88 
89 	void init_karatour();
90 	void init_blzntrnd();
91 	void init_vmetal();
92 	void init_mouja();
93 	void init_balcube();
94 	void init_gakusai();
95 	void init_dharmak();
96 	void init_puzzlet();
97 	void init_metro();
98 	void init_lastfortg();
99 
100 	DECLARE_READ_LINE_MEMBER(custom_soundstatus_r);
101 
102 private:
103 	enum
104 	{
105 		TIMER_KARATOUR_IRQ,
106 		TIMER_MOUJA_IRQ
107 	};
108 
109 	u8 irq_cause_r(offs_t offset);
110 	void irq_cause_w(offs_t offset, u8 data);
111 	u8 irq_vector_r(offs_t offset);
112 	void mouja_irq_timer_ctrl_w(uint16_t data);
113 	void sound_data_w(u8 data);
114 	TIMER_CALLBACK_MEMBER(sound_data_sync);
115 	u8 soundstatus_r();
116 	void soundstatus_w(u8 data);
117 	template<int Mask> void upd7810_rombank_w(u8 data);
118 	u8 upd7810_porta_r();
119 	void upd7810_porta_w(u8 data);
120 	void upd7810_portb_w(u8 data);
121 	void daitorid_portb_w(u8 data);
122 	void coin_lockout_1word_w(u8 data);
123 	void coin_lockout_4words_w(offs_t offset, uint16_t data);
124 	uint16_t balcube_dsw_r(offs_t offset);
125 	uint16_t gakusai_input_r();
126 	void blzntrnd_sh_bankswitch_w(u8 data);
127 	void puzzlet_irq_enable_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
128 	void puzzlet_portb_w(uint16_t data);
129 	void k053936_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
130 	void gakusai_oki_bank_hi_w(u8 data);
131 	void gakusai_oki_bank_lo_w(u8 data);
132 	u8 gakusai_eeprom_r();
133 	void gakusai_eeprom_w(u8 data);
134 	u8 dokyusp_eeprom_r();
135 	void dokyusp_eeprom_bit_w(u8 data);
136 	void dokyusp_eeprom_reset_w(u8 data);
137 	void mouja_sound_rombank_w(u8 data);
138 	DECLARE_WRITE_LINE_MEMBER(vdp_blit_end_w);
139 
140 	// vmetal
141 	void vmetal_control_w(u8 data);
142 	void es8712_reset_w(u8 data);
143 	DECLARE_WRITE_LINE_MEMBER(vmetal_es8712_irq);
144 
145 	TILE_GET_INFO_MEMBER(k053936_get_tile_info);
146 	TILE_GET_INFO_MEMBER(k053936_gstrik2_get_tile_info);
147 	TILEMAP_MAPPER_MEMBER(tilemap_scan_gstrik2);
148 	DECLARE_VIDEO_START(blzntrnd);
149 	DECLARE_VIDEO_START(gstrik2);
150 	uint32_t screen_update_psac_vdp2_mix(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
151 	DECLARE_WRITE_LINE_MEMBER(vblank_irq);
152 	INTERRUPT_GEN_MEMBER(periodic_interrupt);
153 	TIMER_DEVICE_CALLBACK_MEMBER(bangball_scanline);
154 	DECLARE_WRITE_LINE_MEMBER(karatour_vblank_irq);
155 	DECLARE_WRITE_LINE_MEMBER(puzzlet_vblank_irq);
156 	DECLARE_READ_LINE_MEMBER(rxd_r);
157 
158 	void balcube_map(address_map &map);
159 	void bangball_map(address_map &map);
160 	void batlbubl_map(address_map &map);
161 	void blzntrnd_map(address_map &map);
162 	void blzntrnd_sound_io_map(address_map &map);
163 	void blzntrnd_sound_map(address_map &map);
164 	void cpu_space_map(address_map &map);
165 	void daitoa_map(address_map &map);
166 	void daitorid_map(address_map &map);
167 	void dharma_map(address_map &map);
168 	void dokyusei_map(address_map &map);
169 	void dokyusp_map(address_map &map);
170 	void gakusai2_map(address_map &map);
171 	void gakusai_map(address_map &map);
172 	void karatour_map(address_map &map);
173 	void kokushi_map(address_map &map);
174 	void lastforg_map(address_map &map);
175 	void lastfort_map(address_map &map);
176 	void upd7810_map(address_map &map);
177 	void mouja_map(address_map &map);
178 	void mouja_okimap(address_map &map);
179 	void msgogo_map(address_map &map);
180 	void pangpoms_map(address_map &map);
181 	void poitto_map(address_map &map);
182 	void pururun_map(address_map &map);
183 	void puzzlet_io_map(address_map &map);
184 	void puzzlet_map(address_map &map);
185 	void skyalert_map(address_map &map);
186 	void toride2g_map(address_map &map);
187 	void vmetal_map(address_map &map);
188 	void ymf278_map(address_map &map);
189 
190 	virtual void machine_start() override;
191 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
192 
193 	/* devices */
194 	required_device<cpu_device> m_maincpu;
195 	optional_device<cpu_device> m_audiocpu;
196 	optional_device<okim6295_device> m_oki;
197 	optional_device<device_t> m_ymsnd; // TODO set correct type
198 	optional_device<es8712_device> m_essnd;
199 	optional_device<imagetek_i4100_device> m_vdp;
200 	optional_device<imagetek_i4220_device> m_vdp2;
201 	optional_device<imagetek_i4300_device> m_vdp3;
202 
203 	optional_device<k053936_device> m_k053936;
204 	optional_device<eeprom_serial_93cxx_device> m_eeprom;
205 	optional_device<gfxdecode_device> m_gfxdecode;
206 	required_device<screen_device> m_screen;
207 	optional_device<generic_latch_8_device> m_soundlatch;
208 
209 	/* memory pointers */
210 	optional_shared_ptr<uint16_t> m_irq_enable;
211 	optional_shared_ptr<uint16_t> m_irq_levels;
212 	optional_shared_ptr<uint16_t> m_irq_vectors;
213 	optional_shared_ptr<uint16_t> m_input_sel;
214 	optional_shared_ptr<uint16_t> m_k053936_ram;
215 
216 	optional_memory_bank m_audiobank;
217 	optional_memory_bank m_okibank;
218 
219 	/* video-related */
220 	tilemap_t   *m_k053936_tilemap;
221 
222 	/* irq_related */
223 	int         m_vblank_bit;
224 	int         m_blitter_bit;
225 	int         m_irq_line;
226 	u8     m_requested_int[8];
227 	emu_timer   *m_mouja_irq_timer;
228 	emu_timer   *m_karatour_irq_timer;
229 
230 	/* sound related */
231 	u8     m_sound_data;
232 	uint16_t      m_soundstatus;
233 	int         m_porta;
234 	int         m_portb;
235 	int         m_busy_sndcpu;
236 	int         m_essnd_bank;
237 	bool        m_essnd_gate;
238 
239 	/* misc */
240 	int         m_gakusai_oki_bank_lo;
241 	int         m_gakusai_oki_bank_hi;
242 
243 	void update_irq_state();
244 	void metro_common();
245 	void gakusai_oki_bank_set();
246 };
247 
248 #endif // MAME_INCLUDES_METRO_H
249