1 // license:BSD-3-Clause
2 // copyright-holders:Luca Elia
3 /***************************************************************************
4 
5                             -= Jaleco Mega System 1 =-
6 
7                     driver by   Luca Elia (l.elia@tin.it)
8 
9 ***************************************************************************/
10 #ifndef MAME_INCLUDES_MEGASYS1_H
11 #define MAME_INCLUDES_MEGASYS1_H
12 
13 #pragma once
14 
15 #include "machine/gen_latch.h"
16 #include "machine/timer.h"
17 #include "sound/msm5205.h"
18 #include "sound/okim6295.h"
19 #include "video/ms1_tmap.h"
20 #include "emupal.h"
21 #include "screen.h"
22 
23 
24 class megasys1_state : public driver_device
25 {
26 public:
megasys1_state(const machine_config & mconfig,device_type type,const char * tag)27 	megasys1_state(const machine_config &mconfig, device_type type, const char *tag) :
28 		driver_device(mconfig, type, tag),
29 		m_objectram(*this, "objectram"),
30 		m_tmap(*this, "scroll%u", 0),
31 		m_ram(*this, "ram"),
32 		m_maincpu(*this, "maincpu"),
33 		m_audiocpu(*this, "audiocpu"),
34 		m_oki(*this, "oki%u", 1U),
35 		m_p47b_adpcm(*this, "msm%u", 1U),
36 		m_gfxdecode(*this, "gfxdecode"),
37 		m_palette(*this, "palette"),
38 		m_screen(*this, "screen"),
39 		m_soundlatch(*this, "soundlatch%u", 1U),
40 		m_scantimer(*this, "scantimer"),
41 		m_rom_maincpu(*this, "maincpu"),
42 		m_okibank(*this, "okibank"),
43 		m_io_system(*this, "SYSTEM"),
44 		m_io_p1(*this, "P1"),
45 		m_io_p2(*this, "P2"),
46 		m_io_dsw(*this, "DSW"),
47 		m_io_dsw1(*this, "DSW1"),
48 		m_io_dsw2(*this, "DSW2")
49 	{ }
50 
51 	void system_A_soldam(machine_config &config);
52 	void system_B_monkelf(machine_config &config);
53 	void system_A_iganinju(machine_config &config);
54 	void system_A_hachoo(machine_config &config);
55 	void kickoffb(machine_config &config);
56 	void p47b(machine_config &config);
57 	void system_D(machine_config &config);
58 	void system_C(machine_config &config);
59 	void system_Bbl(machine_config &config);
60 	void system_A(machine_config &config);
61 	void system_A_jitsupro(machine_config &config);
62 	void system_B(machine_config &config);
63 	void system_B_hayaosi1(machine_config &config);
64 	void system_Z(machine_config &config);
65 
66 	void init_64street();
67 	void init_chimerab();
68 	void init_peekaboo();
69 	void init_soldam();
70 	void init_astyanax();
71 	void init_stdragon();
72 	void init_hayaosi1();
73 	void init_soldamj();
74 	void init_phantasm();
75 	void init_jitsupro();
76 	void init_iganinju();
77 	void init_cybattlr();
78 	void init_rodlandj();
79 	void init_rittam();
80 	void init_rodlandjb();
81 	void init_avspirit();
82 	void init_monkelf();
83 	void init_edf();
84 	void init_edfp();
85 	void init_bigstrik();
86 	void init_rodland();
87 	void init_edfbl();
88 	void init_stdragona();
89 	void init_stdragonb();
90 	void init_systemz();
91 
92 private:
93 	required_shared_ptr<u16> m_objectram;
94 	optional_device_array<megasys1_tilemap_device, 3> m_tmap;
95 	required_shared_ptr<u16> m_ram;
96 	required_device<cpu_device> m_maincpu;
97 	optional_device<cpu_device> m_audiocpu;
98 	optional_device_array<okim6295_device, 2> m_oki;
99 	optional_device_array<msm5205_device, 2> m_p47b_adpcm;
100 	required_device<gfxdecode_device> m_gfxdecode;
101 	required_device<palette_device> m_palette;
102 	required_device<screen_device> m_screen;
103 	optional_device_array<generic_latch_16_device, 2> m_soundlatch;
104 	optional_device<timer_device> m_scantimer;
105 	required_region_ptr<u16> m_rom_maincpu;
106 	optional_memory_bank m_okibank;
107 	required_ioport m_io_system;
108 	required_ioport m_io_p1;
109 	required_ioport m_io_p2;
110 	optional_ioport m_io_dsw;
111 	optional_ioport m_io_dsw1;
112 	optional_ioport m_io_dsw2;
113 
114 	// configuration
115 	u16 m_ip_select_values[7]; // System B and C
116 	int m_hardware_type_z; // System Z
117 	int m_layers_order[16];
118 	u8 m_ignore_oki_status;
119 
120 	// all
121 	bitmap_ind16 m_sprite_buffer_bitmap;
122 	u16 m_screen_flag;
123 	std::unique_ptr<u16[]> m_buffer_objectram;
124 	std::unique_ptr<u16[]> m_buffer2_objectram;
125 	std::unique_ptr<u16[]> m_buffer_spriteram16;
126 	std::unique_ptr<u16[]> m_buffer2_spriteram16;
127 
128 	// all but System Z
129 	u16 m_active_layers;
130 	u16 m_sprite_flag;
131 
132 	// System B and C
133 	u16 m_ip_latched;
134 
135 	 // System C
136 	u16 m_sprite_bank;
137 
138 	// System A only
139 	int m_mcu_hs;
140 	u16 m_mcu_hs_ram[0x10];
141 
142 	// peekaboo
143 	u16 m_protection_val;
144 
145 	// soldam
146 	u16 *m_spriteram;
147 
148 	DECLARE_WRITE_LINE_MEMBER(sound_irq);
149 	u16 ip_select_r();
150 	void ip_select_w(u16 data);
151 	u16 protection_peekaboo_r();
152 	void protection_peekaboo_w(offs_t offset, u16 data, u16 mem_mask = ~0);
153 	u16 megasys1A_mcu_hs_r(offs_t offset, u16 mem_mask = ~0);
154 	void megasys1A_mcu_hs_w(offs_t offset, u16 data, u16 mem_mask = ~0);
155 	u16 iganinju_mcu_hs_r(offs_t offset, u16 mem_mask = ~0);
156 	void iganinju_mcu_hs_w(offs_t offset, u16 data, u16 mem_mask = ~0);
157 	u16 soldamj_spriteram16_r(offs_t offset);
158 	void soldamj_spriteram16_w(offs_t offset, u16 data, u16 mem_mask = ~0);
159 	u16 stdragon_mcu_hs_r(offs_t offset, u16 mem_mask = ~0);
160 	void stdragon_mcu_hs_w(offs_t offset, u16 data, u16 mem_mask = ~0);
161 	void active_layers_w(offs_t offset, u16 data, u16 mem_mask = ~0);
162 	void sprite_bank_w(offs_t offset, u16 data, u16 mem_mask = ~0);
163 	u16 sprite_flag_r();
164 	void sprite_flag_w(offs_t offset, u16 data, u16 mem_mask = ~0);
165 	void screen_flag_w(offs_t offset, u16 data, u16 mem_mask = ~0);
166 	void soundlatch_w(u16 data);
167 	void soundlatch_z_w(u16 data);
168 	void soundlatch_c_w(u16 data);
169 	void monkelf_scroll0_w(offs_t offset, u16 data, u16 mem_mask = ~0);
170 	void monkelf_scroll1_w(offs_t offset, u16 data, u16 mem_mask = ~0);
171 	void megasys1_set_vreg_flag(int which, int data);
172 	template<int Chip> u8 oki_status_r();
173 	void ram_w(offs_t offset, u16 data);
174 	void p47b_adpcm_w(offs_t offset, u8 data);
175 
176 	DECLARE_MACHINE_RESET(megasys1);
177 	DECLARE_VIDEO_START(megasys1);
178 	DECLARE_VIDEO_START(megasys1_z);
179 	void megasys1_palette(palette_device &palette);
180 	DECLARE_MACHINE_RESET(megasys1_hachoo);
181 
182 	u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
183 	DECLARE_WRITE_LINE_MEMBER(screen_vblank);
184 	INTERRUPT_GEN_MEMBER(megasys1D_irq);
185 	TIMER_DEVICE_CALLBACK_MEMBER(megasys1A_scanline);
186 	TIMER_DEVICE_CALLBACK_MEMBER(megasys1A_iganinju_scanline);
187 	TIMER_DEVICE_CALLBACK_MEMBER(megasys1B_scanline);
188 
189 	void priority_create();
190 	void mix_sprite_bitmap(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
191 	void partial_clear_sprite_bitmap(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, u8 param);
192 	void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect);
193 	inline void draw_16x16_priority_sprite(screen_device &screen, bitmap_ind16 &bitmap,const rectangle &cliprect, s32 code, s32 color, s32 sx, s32 sy, s32 flipx, s32 flipy, u8 mosaic, u8 mosaicsol, s32 priority);
194 	void rodland_gfx_unmangle(const char *region);
195 	void jitsupro_gfx_unmangle(const char *region);
196 	void stdragona_gfx_unmangle(const char *region);
197 	void kickoffb_sound_map(address_map &map);
198 	void p47b_sound_map(address_map &map);
199 	void p47b_extracpu_prg_map(address_map &map);
200 	void p47b_extracpu_io_map(address_map &map);
201 	void megasys1A_map(address_map &map);
202 	void megasys1A_sound_map(address_map &map);
203 	void megasys1A_jitsupro_sound_map(address_map &map);
204 	void megasys1B_edfbl_map(address_map &map);
205 	void megasys1B_map(address_map &map);
206 	void megasys1B_monkelf_map(address_map &map);
207 	void megasys1B_sound_map(address_map &map);
208 	void megasys1C_map(address_map &map);
209 	void megasys1D_map(address_map &map);
210 	void megasys1D_oki_map(address_map &map);
211 	void megasys1Z_map(address_map &map);
212 	void z80_sound_io_map(address_map &map);
213 	void z80_sound_map(address_map &map);
214 };
215 
216 #endif // MAME_INCLUDES_MEGASYS1_H
217