1 // license:BSD-3-Clause
2 // copyright-holders:Mirko Buffoni,Nicola Salmoria,Bryan McPhail,David Haywood,R. Belmont,Alex Marshall,Angelo Salese,Luca Elia
3 // thanks-to:Richard Bush
4 #ifndef MAME_INCLUDES_NMK16_H
5 #define MAME_INCLUDES_NMK16_H
6 
7 #pragma once
8 
9 #include "audio/seibu.h"
10 #include "machine/gen_latch.h"
11 #include "machine/nmk004.h"
12 #include "machine/timer.h"
13 #include "sound/okim6295.h"
14 #include "video/nmk16spr.h"
15 #include "emupal.h"
16 #include "screen.h"
17 #include "tilemap.h"
18 
19 class nmk16_state : public driver_device, public seibu_sound_common
20 {
21 public:
nmk16_state(const machine_config & mconfig,device_type type,const char * tag)22 	nmk16_state(const machine_config &mconfig, device_type type, const char *tag) :
23 		driver_device(mconfig, type, tag),
24 		m_maincpu(*this, "maincpu"),
25 		m_audiocpu(*this, "audiocpu"),
26 		m_oki(*this, "oki%u", 1U),
27 		m_gfxdecode(*this, "gfxdecode"),
28 		m_screen(*this, "screen"),
29 		m_palette(*this, "palette"),
30 		m_spritegen(*this, "spritegen"),
31 		m_nmk004(*this, "nmk004"),
32 		m_soundlatch(*this, "soundlatch"),
33 		m_bgvideoram(*this, "bgvideoram%u", 0U),
34 		m_txvideoram(*this, "txvideoram"),
35 		m_mainram(*this, "mainram"),
36 		m_gunnail_scrollram(*this, "scrollram"),
37 		m_spriteram(*this, "spriteram"),
38 		m_gunnail_scrollramy(*this, "scrollramy"),
39 		m_tilemap_rom(*this, "tilerom"),
40 		m_audiobank(*this, "audiobank"),
41 		m_okibank(*this, "okibank%u", 1U),
42 		m_dsw_io(*this, "DSW%u", 1U),
43 		m_in_io(*this, "IN%u", 0U),
44 		m_sprdma_base(0x8000)
45 	{ }
46 
47 	void vandyke(machine_config &config);
48 	void tdragon_prot(machine_config &config);
49 	void tdragon2(machine_config &config);
50 	void tharrier(machine_config &config);
51 	void raphero(machine_config &config);
52 	void tdragon(machine_config &config);
53 	void tdragonb(machine_config &config);
54 	void gunnail(machine_config &config);
55 	void gunnailb(machine_config &config);
56 	void hachamf(machine_config &config);
57 	void bjtwin(machine_config &config);
58 	void ssmissin(machine_config &config);
59 	void bioship(machine_config &config);
60 	void macross2(machine_config &config);
61 	void blkheart(machine_config &config);
62 	void manybloc(machine_config &config);
63 	void acrobatm(machine_config &config);
64 	void strahl(machine_config &config);
65 	void strahljbl(machine_config &config);
66 	void tdragon3h(machine_config &config);
67 	void hachamf_prot(machine_config &config);
68 	void macross(machine_config &config);
69 	void mustangb(machine_config &config);
70 	void mustang(machine_config &config);
71 	void twinactn(machine_config &config);
72 	void vandykeb(machine_config &config);
73 
74 	void init_nmk();
75 	void init_tharrier();
76 	void init_vandykeb();
77 	void init_tdragonb();
78 	void init_ssmissin();
79 	void init_twinactn();
80 	void init_hachamf_prot();
81 	void init_tdragon_prot();
82 	void init_banked_audiocpu();
83 	void init_gunnailb();
84 	void init_bjtwin();
85 
86 protected:
87 	TIMER_DEVICE_CALLBACK_MEMBER(nmk16_scanline);
88 	u32 screen_update_macross(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
89 
90 	void txvideoram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
91 	void flipscreen_w(u8 data);
92 	void tilebank_w(u8 data);
93 
94 	void macross2_sound_bank_w(u8 data);
95 
96 	required_device<cpu_device> m_maincpu;
97 	optional_device<cpu_device> m_audiocpu;
98 	optional_device_array<okim6295_device, 2> m_oki;
99 	required_device<gfxdecode_device> m_gfxdecode;
100 	required_device<screen_device> m_screen;
101 	required_device<palette_device> m_palette;
102 	required_device<nmk_16bit_sprite_device> m_spritegen;
103 	optional_device<nmk004_device> m_nmk004;
104 	optional_device<generic_latch_8_device> m_soundlatch;
105 
106 	optional_shared_ptr_array<u16, 2> m_bgvideoram;
107 	optional_shared_ptr<u16> m_txvideoram;
108 	required_shared_ptr<u16> m_mainram;
109 	optional_shared_ptr<u16> m_gunnail_scrollram;
110 	optional_shared_ptr<u8> m_spriteram;
111 	optional_shared_ptr<u16> m_gunnail_scrollramy;
112 
113 	optional_region_ptr<u16> m_tilemap_rom;
114 	optional_memory_bank m_audiobank;
115 	optional_memory_bank_array<2> m_okibank;
116 
117 	optional_ioport_array<2> m_dsw_io;
118 	optional_ioport_array<3> m_in_io;
119 
120 	emu_timer *m_dma_timer;
121 	int m_tilerambank;
122 	int m_sprdma_base;
123 	int mask[4*2];
124 	std::unique_ptr<u16[]> m_spriteram_old;
125 	std::unique_ptr<u16[]> m_spriteram_old2;
126 	int m_bgbank;
127 	int m_bioship_background_bank;
128 	tilemap_t *m_bg_tilemap[2];
129 	tilemap_t *m_tx_tilemap;
130 	int m_mustang_bg_xscroll;
131 	u8 m_scroll[2][4];
132 	u16 m_vscroll[4];
133 	int m_prot_count;
134 	u8 m_input_pressed;
135 	u8 m_start_helper;
136 	u8 m_coin_count[2];
137 	u8 m_coin_count_frac[2];
138 	void mainram_strange_w(offs_t offset, u16 data/*, u16 mem_mask = ~0*/);
139 	u16 mainram_swapped_r(offs_t offset);
140 	void mainram_swapped_w(offs_t offset, u16 data, u16 mem_mask = ~0);
141 	void ssmissin_soundbank_w(u8 data);
142 	void tharrier_mcu_control_w(u16 data);
143 	u16 tharrier_mcu_r(offs_t offset, u16 mem_mask = ~0);
144 	void macross2_sound_reset_w(u16 data);
145 	template<unsigned Chip> void tharrier_oki_bankswitch_w(u8 data);
146 	void hachamf_mainram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
147 	void tdragon_mainram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
148 	u16 vandykeb_r();
149 	u16 tdragonb_prot_r();
150 	template<unsigned Layer> void bgvideoram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
151 	void mustang_scroll_w(u16 data);
152 	void raphero_scroll_w(offs_t offset, u16 data, u16 mem_mask = ~0);
153 	template<unsigned Layer> void scroll_w(offs_t offset, u8 data);
154 	void bjtwin_scroll_w(offs_t offset, u8 data);
155 	void vandyke_scroll_w(offs_t offset, u16 data);
156 	void vandykeb_scroll_w(offs_t offset, u16 data, u16 mem_mask = ~0);
157 	void manybloc_scroll_w(offs_t offset, u16 data, u16 mem_mask = ~0);
158 	void bioship_bank_w(u8 data);
159 	void nmk004_x0016_w(u16 data);
160 	void nmk004_bioship_x0016_w(u16 data);
161 	void save_protregs();
162 
163 	void set_hacky_interrupt_timing(machine_config &config);
164 	void set_hacky_screen_lowres(machine_config &config);
165 	void set_hacky_screen_hires(machine_config &config);
166 
167 	TILEMAP_MAPPER_MEMBER(tilemap_scan_pages);
168 	template<unsigned Layer, unsigned Gfx> TILE_GET_INFO_MEMBER(common_get_bg_tile_info);
169 	TILE_GET_INFO_MEMBER(common_get_tx_tile_info);
170 	TILE_GET_INFO_MEMBER(bioship_get_bg_tile_info);
171 	TILE_GET_INFO_MEMBER(bjtwin_get_bg_tile_info);
172 	DECLARE_VIDEO_START(macross);
173 	DECLARE_VIDEO_START(bioship);
174 	DECLARE_VIDEO_START(strahl);
175 	DECLARE_VIDEO_START(macross2);
176 	DECLARE_VIDEO_START(gunnail);
177 	DECLARE_VIDEO_START(bjtwin);
178 	void get_colour_4bit(u32 &colour, u32 &pri_mask);
179 	void get_colour_5bit(u32 &colour, u32 &pri_mask);
180 	void get_sprite_flip(u16 attr, int &flipx, int &flipy, int &code);
181 	u32 screen_update_tharrier(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
182 	u32 screen_update_strahl(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
183 	u32 screen_update_bjtwin(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
184 	TIMER_CALLBACK_MEMBER(dma_callback);
185 	TIMER_DEVICE_CALLBACK_MEMBER(tdragon_mcu_sim);
186 	TIMER_DEVICE_CALLBACK_MEMBER(hachamf_mcu_sim);
187 	TIMER_DEVICE_CALLBACK_MEMBER(manybloc_scanline);
188 	void video_init();
189 	void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, u16 *src);
190 	void bg_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer = 0);
191 	void tx_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
192 	void mcu_run(u8 dsw_setting);
193 	u8 decode_byte(u8 src, const u8 *bitp);
194 	u32 bjtwin_address_map_bg0(u32 addr);
195 	u16 decode_word(u16 src, const u8 *bitp);
196 	u32 bjtwin_address_map_sprites(u32 addr);
197 	void decode_gfx();
198 	void decode_tdragonb();
199 	void decode_ssmissin();
200 
201 	void acrobatm_map(address_map &map);
202 	void bioship_map(address_map &map);
203 	void bjtwin_map(address_map &map);
204 	void gunnail_map(address_map &map);
205 	void gunnailb_map(address_map &map);
206 	void gunnailb_sound_map(address_map &map);
207 	void gunnailb_sound_io_map(address_map &map);
208 	void hachamf_map(address_map &map);
209 	void macross2_map(address_map &map);
210 	void macross2_sound_io_map(address_map &map);
211 	void macross2_sound_map(address_map &map);
212 	void macross_map(address_map &map);
213 	void manybloc_map(address_map &map);
214 	void mustang_map(address_map &map);
215 	void mustangb_map(address_map &map);
216 	void oki1_map(address_map &map);
217 	void oki2_map(address_map &map);
218 	void raphero_map(address_map &map);
219 	void raphero_sound_mem_map(address_map &map);
220 	void ssmissin_map(address_map &map);
221 	void ssmissin_sound_map(address_map &map);
222 	void strahl_map(address_map &map);
223 	void strahljbl_map(address_map &map);
224 	void tdragon2_map(address_map &map);
225 	void tdragon3h_map(address_map &map);
226 	void tdragon3h_sound_io_map(address_map &map);
227 	void tdragon_map(address_map &map);
228 	void tdragonb_map(address_map &map);
229 	void tharrier_map(address_map &map);
230 	void tharrier_sound_io_map(address_map &map);
231 	void tharrier_sound_map(address_map &map);
232 	void twinactn_map(address_map &map);
233 	void vandyke_map(address_map &map);
234 	void vandykeb_map(address_map &map);
235 };
236 
237 class afega_state : public nmk16_state
238 {
239 public:
afega_state(const machine_config & mconfig,device_type type,const char * tag)240 	afega_state(const machine_config &mconfig, device_type type, const char *tag) :
241 		nmk16_state(mconfig, type, tag),
242 		m_afega_scroll(*this, "afega_scroll_%u", 0U)
243 	{}
244 
245 	void firehawk(machine_config &config);
246 	void grdnstrm(machine_config &config);
247 	void grdnstrmk(machine_config &config);
248 	void popspops(machine_config &config);
249 	void redhawki(machine_config &config);
250 	void redhawkb(machine_config &config);
251 	void stagger1(machine_config &config);
252 	void spec2k(machine_config &config);
253 
254 	void init_bubl2000();
255 	void init_grdnstrm();
256 	void init_grdnstrmau();
257 	void init_redfoxwp2a();
258 	void init_grdnstrmg();
259 	void init_redhawk();
260 	void init_redhawkg();
261 	void init_redhawki();
262 	void init_spec2k();
263 
264 private:
265 	optional_shared_ptr_array<u16, 2> m_afega_scroll;
266 
267 	u16 afega_unknown_r();
268 	void spec2k_oki1_banking_w(u8 data);
269 	template<unsigned Scroll> void afega_scroll_w(offs_t offset, u16 data, u16 mem_mask = ~0);
270 
271 	TILE_GET_INFO_MEMBER(get_bg_tile_info_8bit);
272 	DECLARE_VIDEO_START(grdnstrm);
273 	u32 screen_update_afega(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
274 	u32 screen_update_firehawk(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
275 	u32 screen_update_redhawki(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
276 	u32 screen_update_redhawkb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
277 	u32 screen_update_bubl2000(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
278 	void video_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int dsw_flipscreen, int xoffset, int yoffset, int attr_mask);
279 	void redhawki_video_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
280 
281 	void afega_map(address_map &map);
282 	void afega_sound_cpu(address_map &map);
283 	void firehawk_map(address_map &map);
284 	void firehawk_sound_cpu(address_map &map);
285 };
286 
287 class nmk16_tomagic_state : public nmk16_state
288 {
289 public:
nmk16_tomagic_state(const machine_config & mconfig,device_type type,const char * tag)290 	nmk16_tomagic_state(const machine_config &mconfig, device_type type, const char *tag) :
291 		nmk16_state(mconfig, type, tag)
292 	{}
293 
294 	void tomagic(machine_config &config);
295 
296 	void init_tomagic();
297 
298 private:
299 	void tomagic_map(address_map &map);
300 	void tomagic_sound_map(address_map &map);
301 	void tomagic_sound_io_map(address_map &map);
302 };
303 
304 #endif //MAME_INCLUDES_NMK16_H
305