1 // license:BSD-3-Clause
2 // copyright-holders:Roberto Ventura, Leandro Dardini, Yochizo, Nicola Salmoria
3 /******************************************************************************
4 
5     UPL "sprite framebuffer" hardware
6 
7 ******************************************************************************/
8 #ifndef MAME_INCLUDES_NINJAKD2_H
9 #define MAME_INCLUDES_NINJAKD2_H
10 
11 #pragma once
12 
13 #include "sound/samples.h"
14 #include "emupal.h"
15 #include "screen.h"
16 #include "tilemap.h"
17 
18 class ninjakd2_state : public driver_device
19 {
20 public:
ninjakd2_state(const machine_config & mconfig,device_type type,const char * tag)21 	ninjakd2_state(const machine_config &mconfig, device_type type, const char *tag) :
22 		driver_device(mconfig, type, tag),
23 		m_maincpu(*this,"maincpu"),
24 		m_palette(*this, "palette"),
25 		m_bg_videoram(*this, "bg_videoram"),
26 		m_gfxdecode(*this, "gfxdecode"),
27 		m_screen(*this, "screen"),
28 		m_soundcpu(*this, "soundcpu"),
29 		m_pcm(*this, "pcm"),
30 		m_pcm_region(*this, "pcm"),
31 		m_fg_videoram(*this, "fg_videoram"),
32 		m_spriteram(*this, "spriteram"),
33 		m_decrypted_opcodes(*this, "decrypted_opcodes"),
34 		m_mainbank(*this, "mainbank")
35 	{ }
36 
37 	void ninjakd2b(machine_config &config);
38 	void ninjakd2(machine_config &config);
39 
40 	void init_ninjakd2();
41 	void init_bootleg();
42 
43 protected:
44 	void ninjakd2_bgvideoram_w(offs_t offset, uint8_t data);
45 	void ninjakd2_fgvideoram_w(offs_t offset, uint8_t data);
46 	void ninjakd2_bg_ctrl_w(offs_t offset, uint8_t data);
47 	void ninjakd2_sprite_overdraw_w(uint8_t data);
48 
49 	void ninjakd2_bankselect_w(uint8_t data);
50 	void ninjakd2_soundreset_w(uint8_t data);
51 
52 	required_device<cpu_device> m_maincpu;
53 	required_device<palette_device> m_palette;
54 	optional_shared_ptr<uint8_t> m_bg_videoram;
55 	required_device<gfxdecode_device> m_gfxdecode;
56 	required_device<screen_device> m_screen;
57 	required_device<cpu_device> m_soundcpu;
58 
59 	uint8_t m_vram_bank_mask;
60 	int m_robokid_sprites;
61 	bool (*m_stencil_compare_function) (uint16_t pal);
62 	int m_sprites_updated;
63 	tilemap_t* m_fg_tilemap;
64 	tilemap_t* m_bg_tilemap;
65 	bitmap_ind16 m_sprites_bitmap;
66 
67 	void video_init_common();
68 
69 	void ninjakd2_pcm_play_w(uint8_t data);
70 	SAMPLES_START_CB_MEMBER(ninjakd2_init_samples);
71 
72 	TILE_GET_INFO_MEMBER(get_fg_tile_info);
73 	TILE_GET_INFO_MEMBER(ninjakd2_get_bg_tile_info);
74 	uint32_t screen_update_ninjakd2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
75 	DECLARE_WRITE_LINE_MEMBER(screen_vblank_ninjakd2);
76 
77 	void bg_ctrl(int offset, int data, tilemap_t* tilemap);
78 	void gfx_unscramble();
79 	void update_sprites();
80 
81 	void ninjakid_nopcm_sound_cpu(address_map &map);
82 
83 	virtual void machine_start() override;
84 	virtual void machine_reset() override;
85 	virtual void video_start() override;
86 
87 	void ninjakd2_core(machine_config &config);
88 
89 private:
90 	optional_device<samples_device> m_pcm;
91 	optional_memory_region m_pcm_region;
92 	required_shared_ptr<uint8_t> m_fg_videoram;
93 	required_shared_ptr<uint8_t> m_spriteram;
94 	optional_shared_ptr<uint8_t> m_decrypted_opcodes;
95 
96 	required_memory_bank m_mainbank;
97 
98 	const int16_t* m_sampledata;
99 	int m_next_sprite_overdraw_enabled;
100 	uint8_t m_rom_bank_mask;
101 
102 	void draw_sprites( bitmap_ind16 &bitmap);
103 	void erase_sprites( bitmap_ind16 &bitmap);
104 	void lineswap_gfx_roms(const char *region, const int bit);
105 	void decrypted_opcodes_map(address_map &map);
106 	void ninjakd2_main_cpu(address_map &map);
107 	void ninjakd2_sound_cpu(address_map &map);
108 	void ninjakd2_sound_io(address_map &map);
109 };
110 
111 class mnight_state : public ninjakd2_state
112 {
113 public:
mnight_state(const machine_config & mconfig,device_type type,const char * tag)114 	mnight_state(const machine_config &mconfig, device_type type, const char *tag) :
115 		ninjakd2_state(mconfig, type, tag)
116 	{ }
117 
118 	void arkarea(machine_config &config);
119 	void mnight(machine_config &config);
120 
121 	void init_mnight();
122 
123 private:
124 	void mnight_main_cpu(address_map &map);
125 
126 	TILE_GET_INFO_MEMBER(mnight_get_bg_tile_info);
127 	DECLARE_VIDEO_START(mnight);
128 	DECLARE_VIDEO_START(arkarea);
129 
130 };
131 
132 class robokid_state : public mnight_state
133 {
134 public:
robokid_state(const machine_config & mconfig,device_type type,const char * tag)135 	robokid_state(const machine_config &mconfig, device_type type, const char *tag) :
136 		mnight_state(mconfig, type, tag)
137 	{ }
138 
139 	void robokid(machine_config &config);
140 
141 	void init_robokid();
142 	void init_robokidj();
143 
144 protected:
145 	template<int Layer> uint8_t robokid_bg_videoram_r(offs_t offset);
146 	template<int Layer> void robokid_bg_videoram_w(offs_t offset, uint8_t data);
147 	template<int Layer> void robokid_bg_ctrl_w(offs_t offset, uint8_t data);
148 	template<int Layer> void robokid_bg_bank_w(uint8_t data);
149 	tilemap_t* m_robokid_tilemap[3];
150 
151 	void video_init_banked(uint32_t vram_alloc_size);
152 	TILEMAP_MAPPER_MEMBER(robokid_bg_scan);
153 	template<int Layer> TILE_GET_INFO_MEMBER(robokid_get_bg_tile_info);
154 
155 	void robokid_main_cpu(address_map &map);
156 
157 private:
158 	uint8_t motion_error_verbose_r();
159 
160 	DECLARE_VIDEO_START(robokid);
161 	uint32_t screen_update_robokid(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
162 
163 	void motion_error_kludge(uint16_t offset);
164 	uint8_t m_robokid_bg_bank[3];
165 	std::unique_ptr<uint8_t[]> m_robokid_bg_videoram[3];
166 };
167 
168 class omegaf_state : public robokid_state
169 {
170 public:
omegaf_state(const machine_config & mconfig,device_type type,const char * tag)171 	omegaf_state(const machine_config &mconfig, device_type type, const char *tag) :
172 		robokid_state(mconfig, type, tag),
173 		m_dsw_io(*this, "DIPSW%u", 1U),
174 		m_pad_io(*this, "PAD%u", 1U)
175 	{ }
176 
177 	void omegaf(machine_config &config);
178 
179 protected:
180 	virtual void machine_start() override;
181 	virtual void machine_reset() override;
182 
183 private:
184 	uint8_t unk_r();
185 	uint8_t io_protection_r(offs_t offset);
186 	void io_protection_w(offs_t offset, uint8_t data);
187 
188 	void omegaf_main_cpu(address_map &map);
189 
190 	DECLARE_VIDEO_START(omegaf);
191 	TILEMAP_MAPPER_MEMBER(omegaf_bg_scan);
192 	uint32_t screen_update_omegaf(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
193 
194 	required_ioport_array<2> m_dsw_io;
195 	required_ioport_array<2> m_pad_io;
196 
197 	void io_protection_start();
198 	void io_protection_reset();
199 
200 	uint8_t m_io_protection[3];
201 	uint8_t m_io_protection_input;
202 	int m_io_protection_tick;
203 };
204 
205 #endif // MAME_INCLUDES_NINJAKD2_H
206