1 // license:BSD-3-Clause
2 // copyright-holders:Luca Elia
3 
4 #include "machine/gen_latch.h"
5 #include "video/ms32_sprite.h"
6 #include "emupal.h"
7 #include "tilemap.h"
8 
9 class tetrisp2_state : public driver_device
10 {
11 public:
tetrisp2_state(const machine_config & mconfig,device_type type,const char * tag)12 	tetrisp2_state(const machine_config &mconfig, device_type type, const char *tag) :
13 		driver_device(mconfig, type, tag),
14 		m_maincpu(*this, "maincpu"),
15 		m_subcpu(*this, "sub"),
16 		m_sprite(*this, "sprite"),
17 		m_rocknms_sub_sprite(*this, "sub_sprite"),
18 		m_spriteram(*this, "spriteram"),
19 		m_spriteram2(*this, "spriteram2"),
20 		m_vram_fg(*this, "vram_fg"),
21 		m_vram_bg(*this, "vram_bg"),
22 		m_vram_rot(*this, "vram_rot"),
23 		m_nvram(*this, "nvram"),
24 		m_scroll_fg(*this, "scroll_fg"),
25 		m_scroll_bg(*this, "scroll_bg"),
26 		m_rotregs(*this, "rotregs"),
27 		m_rocknms_sub_priority(*this, "sub_priority"),
28 		m_rocknms_sub_vram_rot(*this, "sub_vram_rot"),
29 		m_rocknms_sub_vram_fg(*this, "sub_vram_fg"),
30 		m_rocknms_sub_vram_bg(*this, "sub_vram_bg"),
31 		m_rocknms_sub_scroll_fg(*this, "sub_scroll_fg"),
32 		m_rocknms_sub_scroll_bg(*this, "sub_scroll_bg"),
33 		m_rocknms_sub_rotregs(*this, "sub_rotregs"),
34 		m_gfxdecode(*this, "gfxdecode"),
35 		m_sub_gfxdecode(*this, "sub_gfxdecode"),
36 		m_palette(*this, "palette"),
37 		m_sub_palette(*this, "sub_palette"),
38 		m_paletteram(*this, "paletteram"),
39 		m_sub_paletteram(*this, "sub_paletteram"),
40 		m_leds(*this, "led%u", 0U)
41 	{ }
42 
43 	void rockn2(machine_config &config);
44 	void tetrisp2(machine_config &config);
45 	void nndmseal(machine_config &config);
46 	void rocknms(machine_config &config);
47 	void rockn(machine_config &config);
48 
49 	void init_rockn2();
50 	void init_rockn1();
51 	void init_rockn();
52 	void init_rockn3();
53 	void init_rocknms();
54 
55 	DECLARE_CUSTOM_INPUT_MEMBER(rocknms_main2sub_status_r);
56 
57 	TILE_GET_INFO_MEMBER(get_tile_info_bg);
58 	TILE_GET_INFO_MEMBER(stepstag_get_tile_info_fg);
59 	TILE_GET_INFO_MEMBER(get_tile_info_rot);
60 
61 protected:
62 	void rockn_systemregs_w(offs_t offset, u16 data, u16 mem_mask = ~0);
63 	void rocknms_sub_systemregs_w(offs_t offset, u16 data, u16 mem_mask = ~0);
64 	u16 rockn_adpcmbank_r();
65 	void rockn_adpcmbank_w(u16 data);
66 	void rockn2_adpcmbank_w(u16 data);
67 	u16 rockn_soundvolume_r();
68 	void rockn_soundvolume_w(u16 data);
69 	void nndmseal_sound_bank_w(offs_t offset, u16 data, u16 mem_mask = ~0);
70 	u16 tetrisp2_ip_1_word_r();
71 	u16 rockn_nvram_r(offs_t offset);
72 	u16 rocknms_main2sub_r();
73 	void rocknms_main2sub_w(offs_t offset, u16 data, u16 mem_mask = ~0);
74 	void rocknms_sub2main_w(offs_t offset, u16 data, u16 mem_mask = ~0);
75 	void tetrisp2_coincounter_w(u16 data);
76 	void nndmseal_coincounter_w(offs_t offset, u16 data, u16 mem_mask = ~0);
77 	void nndmseal_b20000_w(u16 data);
78 	void tetrisp2_systemregs_w(offs_t offset, u16 data, u16 mem_mask = ~0);
79 	u16 tetrisp2_nvram_r(offs_t offset);
80 	void tetrisp2_nvram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
81 	void tetrisp2_palette_w(offs_t offset, u16 data, u16 mem_mask = ~0);
82 	void rocknms_sub_palette_w(offs_t offset, u16 data, u16 mem_mask = ~0);
83 	void tetrisp2_priority_w(offs_t offset, u16 data, u16 mem_mask = ~0);
84 	void rocknms_sub_priority_w(offs_t offset, u16 data, u16 mem_mask = ~0);
85 	u16 tetrisp2_priority_r(offs_t offset);
86 	void tetrisp2_vram_bg_w(offs_t offset, u16 data, u16 mem_mask = ~0);
87 	void tetrisp2_vram_fg_w(offs_t offset, u16 data, u16 mem_mask = ~0);
88 	void tetrisp2_vram_rot_w(offs_t offset, u16 data, u16 mem_mask = ~0);
89 	void rocknms_sub_vram_bg_w(offs_t offset, u16 data, u16 mem_mask = ~0);
90 	void rocknms_sub_vram_fg_w(offs_t offset, u16 data, u16 mem_mask = ~0);
91 	void rocknms_sub_vram_rot_w(offs_t offset, u16 data, u16 mem_mask = ~0);
92 
93 	TILE_GET_INFO_MEMBER(get_tile_info_fg);
94 
95 	TILE_GET_INFO_MEMBER(get_tile_info_rocknms_sub_bg);
96 	TILE_GET_INFO_MEMBER(get_tile_info_rocknms_sub_fg);
97 	TILE_GET_INFO_MEMBER(get_tile_info_rocknms_sub_rot);
98 
99 	DECLARE_VIDEO_START(tetrisp2);
100 	DECLARE_VIDEO_START(nndmseal);
101 	DECLARE_VIDEO_START(rockntread);
102 	DECLARE_VIDEO_START(rocknms);
103 	u32 screen_update_tetrisp2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
104 	u32 screen_update_rockntread(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
105 	u32 screen_update_rocknms_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
106 	u32 screen_update_rocknms_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
107 	TIMER_CALLBACK_MEMBER(rockn_timer_level4_callback);
108 	TIMER_CALLBACK_MEMBER(rockn_timer_sub_level4_callback);
109 	TIMER_CALLBACK_MEMBER(rockn_timer_level1_callback);
110 	TIMER_CALLBACK_MEMBER(rockn_timer_sub_level1_callback);
111 	void init_rockn_timer();
112 
113 	void nndmseal_map(address_map &map);
114 	void rockn1_map(address_map &map);
115 	void rockn2_map(address_map &map);
116 	void rocknms_main_map(address_map &map);
117 	void rocknms_sub_map(address_map &map);
118 	void tetrisp2_map(address_map &map);
119 
machine_start()120 	virtual void machine_start() override { m_leds.resolve(); }
121 
122 	required_device<cpu_device> m_maincpu;
123 	optional_device<cpu_device> m_subcpu;
124 
125 	required_device<ms32_sprite_device> m_sprite;
126 	optional_device<ms32_sprite_device> m_rocknms_sub_sprite;
127 
128 	required_shared_ptr<u16> m_spriteram;
129 	optional_shared_ptr<u16> m_spriteram2;
130 
131 	u16 m_systemregs[0x10];
132 	required_shared_ptr<u16> m_vram_fg;
133 	required_shared_ptr<u16> m_vram_bg;
134 	required_shared_ptr<u16> m_vram_rot;
135 	required_shared_ptr<u16> m_nvram;
136 	required_shared_ptr<u16> m_scroll_fg;
137 	required_shared_ptr<u16> m_scroll_bg;
138 	required_shared_ptr<u16> m_rotregs;
139 	std::unique_ptr<u8[]> m_priority;
140 	optional_shared_ptr<u16> m_rocknms_sub_priority;
141 	optional_shared_ptr<u16> m_rocknms_sub_vram_rot;
142 	optional_shared_ptr<u16> m_rocknms_sub_vram_fg;
143 	optional_shared_ptr<u16> m_rocknms_sub_vram_bg;
144 	optional_shared_ptr<u16> m_rocknms_sub_scroll_fg;
145 	optional_shared_ptr<u16> m_rocknms_sub_scroll_bg;
146 	optional_shared_ptr<u16> m_rocknms_sub_rotregs;
147 	required_device<gfxdecode_device> m_gfxdecode;
148 	optional_device<gfxdecode_device> m_sub_gfxdecode;
149 	required_device<palette_device> m_palette;
150 	optional_device<palette_device> m_sub_palette;
151 	required_shared_ptr<u16> m_paletteram;
152 	optional_shared_ptr<u16> m_sub_paletteram;
153 	output_finder<45> m_leds;
154 
155 	u16 m_rocknms_sub_systemregs[0x10];
156 	u16 m_rockn_protectdata;
157 	u16 m_rockn_adpcmbank;
158 	u16 m_rockn_soundvolume;
159 	emu_timer *m_rockn_timer_l4;
160 	emu_timer *m_rockn_timer_sub_l4;
161 	emu_timer *m_rockn_timer_l1;
162 	emu_timer *m_rockn_timer_sub_l1;
163 	int m_bank_lo;
164 	int m_bank_hi;
165 	u16 m_rocknms_main2sub;
166 	u16 m_rocknms_sub2main;
167 	int m_flipscreen_old;
168 	tilemap_t *m_tilemap_bg;
169 	tilemap_t *m_tilemap_fg;
170 	tilemap_t *m_tilemap_rot;
171 	tilemap_t *m_tilemap_sub_bg;
172 	tilemap_t *m_tilemap_sub_fg;
173 	tilemap_t *m_tilemap_sub_rot;
174 };
175 
176 class stepstag_state : public tetrisp2_state
177 {
178 public:
stepstag_state(const machine_config & mconfig,device_type type,const char * tag)179 	stepstag_state(const machine_config &mconfig, device_type type, const char *tag) :
180 		tetrisp2_state(mconfig, type, tag),
181 		m_vj_sprite_l(*this, "sprite_l"),
182 		m_vj_sprite_m(*this, "sprite_m"),
183 		m_vj_sprite_r(*this, "sprite_r"),
184 		m_spriteram1(*this, "spriteram1"),
185 		m_spriteram3(*this, "spriteram3"),
186 		m_vj_palette_l(*this, "lpalette"),
187 		m_vj_palette_m(*this, "mpalette"),
188 		m_vj_palette_r(*this, "rpalette"),
189 		m_vj_paletteram_l(*this, "paletteram1"),
190 		m_vj_paletteram_m(*this, "paletteram2"),
191 		m_vj_paletteram_r(*this, "paletteram3"),
192 		m_soundlatch(*this, "soundlatch")
193 	{ }
194 
195 	void stepstag(machine_config &config);
196 	void vjdash(machine_config &config);
197 
198 	void init_stepstag();
199 
200 	DECLARE_VIDEO_START(stepstag);
201 
202 private:
203 	u16 stepstag_coins_r();
204 	u16 vj_upload_idx;
205 	bool vj_upload_fini;
206 	void stepstag_b00000_w(u16 data);
207 	void stepstag_b20000_w(offs_t offset, u16 data, u16 mem_mask = ~0);
208 	void stepstag_main2pc_w(u16 data);
209 	u16 unknown_read_0xc00000();
210 	u16 unknown_read_0xffff00();
211 	u16 stepstag_pc2main_r();
212 	void stepstag_soundlatch_word_w(u16 data);
213 	void stepstag_neon_w(offs_t offset, u16 data, u16 mem_mask = ~0);
214 	void stepstag_step_leds_w(offs_t offset, u16 data, u16 mem_mask = ~0);
215 	void stepstag_button_leds_w(offs_t offset, u16 data, u16 mem_mask = ~0);
216 	void stepstag_palette_left_w(offs_t offset, u16 data, u16 mem_mask = ~0);
217 	void stepstag_palette_mid_w(offs_t offset, u16 data, u16 mem_mask = ~0);
218 	void stepstag_palette_right_w(offs_t offset, u16 data, u16 mem_mask = ~0);
219 
220 	u32 screen_update_stepstag_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
221 	u32 screen_update_stepstag_mid(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
222 	u32 screen_update_stepstag_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
223 	u32 screen_update_stepstag_main(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
224 //  inline int mypal(int x);
225 
226 	void stepstag_map(address_map &map);
227 	void stepstag_sub_map(address_map &map);
228 	void vjdash_map(address_map &map);
229 
230 	optional_device<ms32_sprite_device> m_vj_sprite_l;
231 	optional_device<ms32_sprite_device> m_vj_sprite_m;
232 	optional_device<ms32_sprite_device> m_vj_sprite_r;
233 	required_shared_ptr<u16> m_spriteram1;
234 	required_shared_ptr<u16> m_spriteram3;
235 	optional_device<palette_device> m_vj_palette_l;
236 	optional_device<palette_device> m_vj_palette_m;
237 	optional_device<palette_device> m_vj_palette_r;
238 	optional_shared_ptr<u16> m_vj_paletteram_l;
239 	optional_shared_ptr<u16> m_vj_paletteram_m;
240 	optional_shared_ptr<u16> m_vj_paletteram_r;
241 	required_device<generic_latch_16_device> m_soundlatch;
242 	void convert_yuv422_to_rgb888(palette_device *paldev, u16 *palram,u32 offset);
243 };
244