1 // license:BSD-3-Clause
2 // copyright-holders:Luca Elia, David Haywood
3 /***************************************************************************
4 
5                             -= Kaneko 16 Bit Games =-
6 
7 ***************************************************************************/
8 #ifndef MAME_INCLUDES_KANEKO16_H
9 #define MAME_INCLUDES_KANEKO16_H
10 
11 #pragma once
12 
13 #include "cpu/m68000/m68000.h"
14 #include "cpu/z80/z80.h"
15 #include "machine/eepromser.h"
16 #include "machine/gen_latch.h"
17 #include "machine/kaneko_calc3.h"
18 #include "machine/kaneko_hit.h"
19 #include "machine/kaneko_toybox.h"
20 #include "machine/nvram.h"
21 #include "machine/timer.h"
22 #include "machine/watchdog.h"
23 #include "sound/ay8910.h"
24 #include "sound/okim6295.h"
25 #include "sound/ym2151.h"
26 #include "video/bufsprite.h"
27 #include "video/kaneko_spr.h"
28 #include "video/kaneko_tmap.h"
29 #include "emupal.h"
30 #include "screen.h"
31 
32 class kaneko16_state : public driver_device
33 {
34 public:
kaneko16_state(const machine_config & mconfig,device_type type,const char * tag)35 	kaneko16_state(const machine_config &mconfig, device_type type, const char *tag) :
36 		driver_device(mconfig, type, tag),
37 		m_maincpu(*this, "maincpu"),
38 		m_ym2149(*this, "ym2149_%u", 1),
39 		m_oki(*this, "oki%u", 1),
40 		m_view2(*this, "view2_%u", 0),
41 		m_kaneko_hit(*this, "kan_hit"),
42 		m_kaneko_spr(*this, "kan_spr"),
43 		m_kaneko_calc3(*this, "calc3_prot"),
44 		m_toybox(*this, "toybox"),
45 		m_screen(*this, "screen"),
46 		m_palette(*this, "palette"),
47 		m_bgpalette(*this, "bgpalette"),
48 		m_eeprom(*this, "eeprom"),
49 		m_soundlatch(*this, "soundlatch"),
50 		m_watchdog(*this, "watchdog"),
51 		m_spriteram(*this, "spriteram"),
52 		m_mainregion(*this, "maincpu"),
53 		m_mainram(*this, "mainram"),
54 		m_mcuram(*this, "mcuram"),
55 		m_okiregion(*this, "oki%u", 1),
56 		m_okibank(*this, "okibank%u", 1),
57 		m_p2_port(*this, "P2"),
58 		m_fake_port(*this, "FAKE"),
59 		m_dsw_port(*this, "DSW1"),
60 		m_eepromout_port(*this, "EEPROMOUT"),
61 		m_wheel_port(*this, "WHEEL%u", 0U),
62 		m_audiocpu(*this, "audiocpu"),
63 		m_ymsnd(*this, "ymsnd")
64 	{
65 	}
66 
67 	void init_bakubrkr();
68 
69 	void bakubrkr(machine_config &config);
70 	void wingforc(machine_config &config);
71 	void blazeon(machine_config &config);
72 	void mgcrystl(machine_config &config);
73 
74 protected:
75 	required_device<m68000_device> m_maincpu;
76 	optional_device_array<ym2149_device, 2> m_ym2149;
77 	optional_device_array<okim6295_device, 2> m_oki;
78 	optional_device_array<kaneko_view2_tilemap_device, 2> m_view2;
79 	optional_device<kaneko_hit_device> m_kaneko_hit;
80 	required_device<kaneko16_sprite_device> m_kaneko_spr;
81 	optional_device<kaneko_calc3_device> m_kaneko_calc3;
82 	optional_device<kaneko_toybox_device> m_toybox;
83 	required_device<screen_device> m_screen;
84 	required_device<palette_device> m_palette;
85 	optional_device<palette_device> m_bgpalette;
86 	optional_device<eeprom_serial_93cxx_device> m_eeprom;
87 	optional_device<generic_latch_8_device> m_soundlatch;
88 	optional_device<watchdog_timer_device> m_watchdog;
89 	optional_device<buffered_spriteram16_device> m_spriteram;
90 
91 	required_region_ptr<u16> m_mainregion;
92 	optional_shared_ptr<u16> m_mainram;
93 	optional_shared_ptr<u16> m_mcuram;
94 
95 	optional_memory_region_array<2> m_okiregion;
96 	optional_memory_bank_array<2> m_okibank;
97 
98 	optional_ioport m_p2_port;
99 	optional_ioport m_fake_port;
100 	optional_ioport m_dsw_port;
101 	optional_ioport m_eepromout_port;
102 	optional_ioport_array<3> m_wheel_port;
103 
104 	u16 m_disp_enable;
105 
106 	int m_VIEW2_2_pri;
107 
108 	virtual void common_oki_bank_install(int bankno, size_t fixedsize, size_t bankedsize);
109 	void coin_lockout_w(u8 data);
110 	void bloodwar_coin_lockout_w(u8 data);
111 
112 	void display_enable_w(offs_t offset, u16 data, u16 mem_mask = ~0); // (u16 data, u16 mem_mask = ~0);
113 
114 	template<unsigned Chip> u16 ym2149_r(offs_t offset);
115 	template<unsigned Chip> void ym2149_w(offs_t offset, u16 data, u16 mem_mask = ~0);
116 	template<unsigned Mask> void oki_bank0_w(u8 data);
117 	template<unsigned Mask> void oki_bank1_w(u8 data);
118 
119 	DECLARE_MACHINE_RESET(gtmr);
120 	DECLARE_MACHINE_RESET(mgcrystl);
121 	virtual void video_start() override;
122 	u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
123 
124 	template<class BitmapClass>
125 	u32 screen_update_common(screen_device &screen, BitmapClass &bitmap, const rectangle &cliprect);
126 
127 	TIMER_DEVICE_CALLBACK_MEMBER(interrupt);
128 
129 	template<class BitmapClass>
130 	void fill_bitmap(BitmapClass &bitmap, const rectangle &cliprect);
131 
132 	void gtmr_oki1_map(address_map &map);
133 	void gtmr_oki2_map(address_map &map);
134 
135 private:
136 	optional_device<z80_device> m_audiocpu;
137 	optional_device<ym2151_device> m_ymsnd;
138 
139 	u8 eeprom_r();
140 	void eeprom_w(u8 data);
141 	void eeprom_cs_w(u8 data);
142 
143 	void bakubrkr_map(address_map &map);
144 	void bakubrkr_oki1_map(address_map &map);
145 	void blazeon_map(address_map &map);
146 	void blazeon_soundmem(address_map &map);
147 	void blazeon_soundport(address_map &map);
148 	void mgcrystl_map(address_map &map);
149 	void wingforc_soundport(address_map &map);
150 };
151 
152 class kaneko16_gtmr_state : public kaneko16_state
153 {
154 public:
kaneko16_gtmr_state(const machine_config & mconfig,device_type type,const char * tag)155 	kaneko16_gtmr_state(const machine_config &mconfig, device_type type, const char *tag) :
156 		kaneko16_state(mconfig, type, tag)
157 	{
158 	}
159 
160 	void init_gtmr();
161 	void bonkadv(machine_config &config);
162 	void gtmr(machine_config &config);
163 	void gtmr2(machine_config &config);
164 	void gtmre(machine_config &config);
165 	void bloodwar(machine_config &config);
166 
167 protected:
168 	virtual void common_oki_bank_install(int bankno, size_t fixedsize, size_t bankedsize) override;
169 
170 private:
171 	u16 gtmr_wheel_r();
172 	u16 gtmr2_wheel_r();
173 	u16 gtmr2_IN1_r();
174 
175 	void bloodwar_map(address_map &map);
176 	void bonkadv_map(address_map &map);
177 	void gtmr2_map(address_map &map);
178 	void gtmr_map(address_map &map);
179 };
180 
181 class kaneko16_berlwall_state : public kaneko16_state
182 {
183 public:
kaneko16_berlwall_state(const machine_config & mconfig,device_type type,const char * tag)184 	kaneko16_berlwall_state(const machine_config &mconfig, device_type type, const char *tag) :
185 		kaneko16_state(mconfig, type, tag),
186 		m_bg15_scroll(*this, "bg15_scroll"),
187 		m_bgpalette(*this, "bgpalette")
188 	{
189 	}
190 
191 	void init_berlwall();
192 	void init_berlwallk();
193 	void init_berlwallt();
194 	void init_berlwall_common();
195 	void berlwall(machine_config &config);
196 
197 protected:
198 	virtual void video_start() override;
199 
200 private:
201 	optional_shared_ptr<u16> m_bg15_scroll;
202 	required_device<palette_device> m_bgpalette;
203 
204 	bitmap_ind16 m_bg15_bitmap[32];
205 
206 	u8 bg15_select_r();
207 	void bg15_select_w(u8 data);
208 	u8 bg15_bright_r();
209 	void bg15_bright_w(u8 data);
210 
211 	void berlwall_oki_w(offs_t offset, u16 data, u16 mem_mask = ~0);
212 
213 	u16 berlwall_spriteram_r(offs_t offset);
214 	void berlwall_spriteram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
215 	u16 berlwall_spriteregs_r(offs_t offset);
216 	void berlwall_spriteregs_w(offs_t offset, u16 data, u16 mem_mask = ~0);
217 
218 	u8 m_bg15_select;
219 	u8 m_bg15_bright;
220 
221 	u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
222 	void render_15bpp_bitmap(bitmap_rgb32 &bitmap, const rectangle &cliprect);
223 
224 	void patch_protection(u32 bra_offset,u16 bra_value,u16 checksum);
225 	void berlwall_map(address_map &map);
226 };
227 
228 class kaneko16_shogwarr_state : public kaneko16_state
229 {
230 public:
kaneko16_shogwarr_state(const machine_config & mconfig,device_type type,const char * tag)231 	kaneko16_shogwarr_state(const machine_config &mconfig, device_type type, const char *tag) :
232 		kaneko16_state(mconfig, type, tag),
233 		m_calc3_prot(*this, "calc3_prot")
234 	{
235 	}
236 	void init_shogwarr();
237 	void init_brapboys();
238 
239 	void shogwarr(machine_config &config);
240 	void brapboys(machine_config &config);
241 
242 private:
243 	optional_device<kaneko_calc3_device> m_calc3_prot;
244 
245 	TIMER_DEVICE_CALLBACK_MEMBER(shogwarr_interrupt);
246 
247 	void shogwarr_oki_bank_w(u8 data);
248 
249 	void brapboys_oki2_map(address_map &map);
250 	void shogwarr_map(address_map &map);
251 };
252 
253 #endif
254