1 // license:BSD-3-Clause
2 // copyright-holders:Quench
3 /***************************************************************************
4 
5         ToaPlan game hardware from 1987
6         --------------------------------
7         Driver by: Quench
8 
9 
10 Supported games:
11 
12     Toaplan Board Number:   TP-009
13     Taito Game Number:      B25
14         Wardner         (World)
15         Pyros           (USA)
16         Wardner no Mori (Japan)
17 
18 Notes:
19         Basically the same video and machine hardware as Flying Shark,
20           except for the Main CPU which is a Z80 here.
21         See twincobr.cpp machine and video drivers to complete the
22           hardware setup.
23         To enter the "test mode", press START1 when the grid is displayed.
24         Press 0 (actually P1 button 3) on startup to skip some video RAM tests
25         (code at 0x6d25 in 'wardner', 0x6d2f in 'wardnerj' or 0x6d2c in 'pyros').
26 
27 **************************** Memory & I/O Maps *****************************
28 Z80:(0)  Main CPU
29 0000-6fff Main ROM
30 7000-7fff Main RAM
31 8000-ffff Level and scenery ROMS. This is banked with the following
32 8000-8fff Sprite RAM
33 a000-adff Palette RAM
34 ae00-afff Spare unused, but tested Palette RAM
35 c000-c7ff Sound RAM - shared with C000-C7FF in Z80(1) RAM
36 
37 in:
38 50      DSW A
39 52      DSW B
40 54      Player 1 controls
41 56      Player 2 controls
42 58      VBlank (bit 7) and coin-in/start inputs
43 60      LSB data from char display layer
44 61      MSB data from char display layer
45 62      LSB data from BG   display layer
46 63      MSB data from BG   display layer
47 64      LSB data from FG   display layer
48 65      MSB data from FG   display layer
49 
50 out:
51 00      6845 CRTC offset register
52 02      6845 CRTC register data
53 10      char scroll LSB   < Y >
54 11      char scroll MSB   < Y >
55 12      char scroll LSB     X
56 13      char scroll MSB     X
57 14      char LSB RAM offset     20h * 40h  (0-07ff) and (4000-47ff) ???
58 15      char MSB RAM offset
59 20      BG   scroll LSB   < Y >
60 21      BG   scroll MSB   < Y >
61 22      BG   scroll LSB     X
62 23      BG   scroll MSB     X
63 24      BG   LSB RAM offset     40h * 40h  (0-0fff)
64 25      BG   MSB RAM offset
65 30      FG   scroll LSB   < Y >
66 31      FG   scroll MSB   < Y >
67 32      FG   scroll LSB     X
68 33      FG   scroll MSB     X
69 34      FG   LSB RAM offset     40h * 40h  (0-0fff)
70 35      FG   MSB RAM offset
71 40      spare scroll LSB  < Y >  (Not used)
72 41      spare scroll MSB  < Y >  (Not used)
73 5a-5c   Control registers
74         bits 7-4 always 0
75         bits 3-1 select the control signal to drive.
76         bit   0  is the value passed to the control signal.
77 5a      data
78         00-01   INT line to TMS320C10 DSP (Active low trigger)
79         0c-0d   lockout for coin A input (Active low lockout)
80         0e-0f   lockout for coin B input (Active low lockout)
81 5c      data
82         00-01   ???
83         02-03   ???
84         04-05   Active low INTerrupt to Z80(0) for screen refresh
85         06-07   Flip Screen (Active high flips)
86         08-09   Background RAM display bank switch
87         0a-0b   Foreground ROM display bank switch (not used here)
88         0c-0d   ??? (what the hell does this do ?)
89 60      LSB data to char display layer
90 61      MSB data to char display layer
91 62      LSB data to BG   display layer
92 63      MSB data to BG   display layer
93 64      LSB data to FG   display layer
94 65      MSB data to FG   display layer
95 70      ROM bank selector for Z80(0) address 8000-ffff
96         data
97         00  switch ROM from 8000-ffff out, and put sprite/palette/sound RAM back.
98         02  switch lower half of B25-18.ROM  ROM to 8000-ffff
99         03  switch upper half of B25-18.ROM  ROM to 8000-ffff
100         04  switch lower half of B25-19.ROM  ROM to 8000-ffff
101         05  switch upper half of B25-19.ROM  ROM to 8000-ffff
102         07  switch               B25-30.ROM  ROM to 8000-ffff
103 
104 
105 
106 Z80:(1)  Sound CPU
107 0000-7fff Main ROM
108 8000-807f RAM ???
109 c000-cfff Sound RAM, $C000-C7FF shared with $C000-C7FF in Z80(0) ram
110 
111 
112 
113 TMS320C10 DSP: Harvard type architecture. RAM and ROM on separate data buses.
114 0000-05ff ROM 16-bit opcodes (word access only).
115 0000-0090 Internal RAM (words).
116 
117 in:
118 01      data read from addressed Z80:(0) address space (Main RAM/Sprite RAM)
119 
120 out:
121 00      address of Z80:(0) to read/write to
122 01      data to write to addressed Z80:(0) address space (Main RAM/Sprite RAM)
123 03      bit 15 goes to BIO line of TMS320C10. BIO is a polled input line.
124 
125 
126 ***************************************************************************/
127 
128 
129 #include "emu.h"
130 #include "includes/twincobr.h"
131 #include "includes/toaplipt.h"
132 
133 #include "cpu/tms32010/tms32010.h"
134 #include "cpu/z80/z80.h"
135 #include "machine/74259.h"
136 #include "machine/bankdev.h"
137 #include "sound/3812intf.h"
138 #include "speaker.h"
139 
140 
141 class wardner_state : public twincobr_state
142 {
143 public:
wardner_state(const machine_config & mconfig,device_type type,const char * tag)144 	wardner_state(const machine_config &mconfig, device_type type, const char *tag)
145 		: twincobr_state(mconfig, type, tag)
146 		, m_membank(*this, "membank")
147 	{
148 	}
149 
150 	void wardner(machine_config &config);
151 
152 	void init_wardner();
153 
154 protected:
155 	virtual void driver_start() override;
156 	virtual void machine_reset() override;
157 
158 private:
159 	required_device<address_map_bank_device> m_membank;
160 
161 	void wardner_bank_w(uint8_t data);
162 
163 	void dsp_io_map(address_map &map);
164 	void dsp_program_map(address_map &map);
165 	void main_bank_map(address_map &map);
166 	void main_io_map(address_map &map);
167 	void main_program_map(address_map &map);
168 	void sound_io_map(address_map &map);
169 	void sound_program_map(address_map &map);
170 };
171 
172 
173 /***************************** Z80 Main Memory Map **************************/
174 
wardner_bank_w(uint8_t data)175 void wardner_state::wardner_bank_w(uint8_t data)
176 {
177 	m_membank->set_bank(data & 7);
178 }
179 
main_program_map(address_map & map)180 void wardner_state::main_program_map(address_map &map)
181 {
182 	map(0x0000, 0x6fff).rom();
183 	map(0x7000, 0x7fff).ram();
184 	map(0x8000, 0x8fff).w(FUNC(wardner_state::wardner_sprite_w));                     // .share("spriteram8")
185 	map(0xa000, 0xafff).w(m_palette, FUNC(palette_device::write8));  // .share("palette")
186 	map(0xc000, 0xc7ff).writeonly().share("sharedram");
187 	map(0x8000, 0xffff).r(m_membank, FUNC(address_map_bank_device::read8));
188 }
189 
190 // Overlapped RAM/Banked ROM
191 // Can't use map(0x00000, 0x3ffff) for ROM because the shared pointers get messed up somehow
main_bank_map(address_map & map)192 void wardner_state::main_bank_map(address_map &map)
193 {
194 	map(0x00000, 0x00fff).r(FUNC(wardner_state::wardner_sprite_r)).share("spriteram8");
195 	map(0x01000, 0x01fff).rom().region("maincpu", 0x1000);
196 	map(0x02000, 0x02fff).readonly().share("palette");
197 	map(0x03000, 0x03fff).rom().region("maincpu", 0x3000);
198 	map(0x04000, 0x047ff).readonly().share("sharedram");
199 	map(0x04800, 0x3ffff).rom().region("maincpu", 0x4800);
200 }
201 
main_io_map(address_map & map)202 void wardner_state::main_io_map(address_map &map)
203 {
204 	map.global_mask(0xff);
205 	map(0x00, 0x00).w("crtc", FUNC(mc6845_device::address_w));
206 	map(0x02, 0x02).w("crtc", FUNC(mc6845_device::register_w));
207 	map(0x10, 0x13).w(FUNC(wardner_state::wardner_txscroll_w));       /* scroll text layer */
208 	map(0x14, 0x15).w(FUNC(wardner_state::wardner_txlayer_w));        /* offset in text video RAM */
209 	map(0x20, 0x23).w(FUNC(wardner_state::wardner_bgscroll_w));       /* scroll bg layer */
210 	map(0x24, 0x25).w(FUNC(wardner_state::wardner_bglayer_w));        /* offset in bg video RAM */
211 	map(0x30, 0x33).w(FUNC(wardner_state::wardner_fgscroll_w));       /* scroll fg layer */
212 	map(0x34, 0x35).w(FUNC(wardner_state::wardner_fglayer_w));        /* offset in fg video RAM */
213 	map(0x40, 0x43).w(FUNC(wardner_state::wardner_exscroll_w));       /* scroll extra layer (not used) */
214 	map(0x50, 0x50).portr("DSWA");
215 	map(0x52, 0x52).portr("DSWB");
216 	map(0x54, 0x54).portr("P1");
217 	map(0x56, 0x56).portr("P2");
218 	map(0x58, 0x58).portr("SYSTEM");
219 	map(0x5a, 0x5a).w("coinlatch", FUNC(ls259_device::write_nibble_d0));
220 	map(0x5c, 0x5c).w("mainlatch", FUNC(ls259_device::write_nibble_d0));
221 	map(0x60, 0x65).rw(FUNC(wardner_state::wardner_videoram_r), FUNC(wardner_state::wardner_videoram_w));
222 	map(0x70, 0x70).w(FUNC(wardner_state::wardner_bank_w));
223 }
224 
225 
226 /***************************** Z80 Sound Memory Map *************************/
227 
sound_program_map(address_map & map)228 void wardner_state::sound_program_map(address_map &map)
229 {
230 	map(0x0000, 0x7fff).rom();
231 	map(0x8000, 0x807f).ram();
232 	map(0xc000, 0xc7ff).ram().share("sharedram");
233 	map(0xc800, 0xcfff).ram();
234 }
235 
sound_io_map(address_map & map)236 void wardner_state::sound_io_map(address_map &map)
237 {
238 	map.global_mask(0xff);
239 	map(0x00, 0x01).rw("ymsnd", FUNC(ym3812_device::read), FUNC(ym3812_device::write));
240 }
241 
242 
243 /***************************** TMS32010 Memory Map **************************/
244 
dsp_program_map(address_map & map)245 void wardner_state::dsp_program_map(address_map &map)
246 {
247 	map(0x000, 0x5ff).rom();
248 }
249 
250 	/* $000 - 08F  TMS32010 Internal Data RAM in Data Address Space */
251 
dsp_io_map(address_map & map)252 void wardner_state::dsp_io_map(address_map &map)
253 {
254 	map(0x00, 0x00).w(FUNC(wardner_state::wardner_dsp_addrsel_w));
255 	map(0x01, 0x01).rw(FUNC(wardner_state::wardner_dsp_r), FUNC(wardner_state::wardner_dsp_w));
256 	map(0x03, 0x03).w(FUNC(wardner_state::twincobr_dsp_bio_w));
257 }
258 
259 
260 /*****************************************************************************
261 
262     Input Port definitions
263 
264 *****************************************************************************/
265 
266 /* verified from Z80 code */
267 static INPUT_PORTS_START( wardner_generic )
268 	PORT_START("P1")
269 	TOAPLAN_JOY_UDLR_2_BUTTONS( 1 )                         /* buttons 3 & 4 named "SHOTC" and "SHOTD" in "test mode" */
270 
271 	PORT_START("P2")
272 	TOAPLAN_JOY_UDLR_2_BUTTONS( 2 )                         /* buttons 3 & 4 named "SHOTC" and "SHOTD" in "test mode" */
273 
274 	PORT_START("SYSTEM")
275 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 )
276 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_TILT )
277 	TOAPLAN_TEST_SWITCH( 0x04, IP_ACTIVE_HIGH )             /* "TEST" in "test mode" */
278 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_COIN1 )
279 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_COIN2 )
280 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 )
281 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_START2 )
282 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen")            /* "V-BLANKING" in "test mode" */
283 
284 	PORT_START("DSWA")
285 	TOAPLAN_MACHINE_COCKTAIL_LOC(SW1)
286 	TOAPLAN_COINAGE_WORLD_LOC(SW1)
287 
288 	PORT_START("DSWB")
289 	TOAPLAN_DIFFICULTY_LOC(SW2)
290 	PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:!3,!4") /* table at 0x13ce ('wardner') or 0x13de ('wardnerj') */
291 	PORT_DIPSETTING(    0x00, "30k 80k 50k+" )
292 	PORT_DIPSETTING(    0x04, "50k 100k 50k+" )
293 	PORT_DIPSETTING(    0x08, "30k Only" )
294 	PORT_DIPSETTING(    0x0c, "50k Only" )
295 	PORT_DIPNAME( 0x30, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:!5,!6")
296 	PORT_DIPSETTING(    0x30, "1" )
297 	PORT_DIPSETTING(    0x00, "3" )
298 	PORT_DIPSETTING(    0x10, "4" )
299 	PORT_DIPSETTING(    0x20, "5" )
300 	PORT_DIPUNUSED_DIPLOC( 0x40, IP_ACTIVE_HIGH, "SW2:!7" )
301 	PORT_DIPUNUSED_DIPLOC( 0x80, IP_ACTIVE_HIGH, "SW2:!8" )
302 INPUT_PORTS_END
303 
304 /* verified from Z80 code */
305 static INPUT_PORTS_START( wardner )
306 	PORT_INCLUDE( wardner_generic )
307 
308 	PORT_MODIFY("P1")
309 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Skip Video RAM Tests") PORT_CODE(KEYCODE_0)
310 	/* actually player 1 button 3 - not used in gameplay */
311 	/* code at 0x6d25 ('wardner'), 0x6d2f ('wardnerj') or 0x6d2c ('pyros') */
312 INPUT_PORTS_END
313 
314 /* verified from Z80 code */
315 static INPUT_PORTS_START( wardnerj )
316 	PORT_INCLUDE( wardner )
317 
318 	PORT_MODIFY("DSWA")
319 	TOAPLAN_COINAGE_JAPAN_LOC(SW1)
320 INPUT_PORTS_END
321 
322 /* verified from Z80 code */
323 static INPUT_PORTS_START( pyros )
324 	PORT_INCLUDE( wardnerj )
325 
326 	PORT_MODIFY("DSWB")
327 	PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:!3,!4") /* table at 0x13ce */
328 	PORT_DIPSETTING(    0x00, "30k 80k 50k+" )
329 	PORT_DIPSETTING(    0x04, "50k 100k 50k+" )
330 	PORT_DIPSETTING(    0x08, "50k Only" )
331 	PORT_DIPSETTING(    0x0c, "100k Only" )
332 	PORT_DIPNAME( 0x40, 0x00, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW2:!7")   /* additional code at 0x6037 */
333 	PORT_DIPSETTING(    0x40, DEF_STR( No ) )
334 	PORT_DIPSETTING(    0x00, DEF_STR( Yes ) )
335 INPUT_PORTS_END
336 
337 
338 
339 static const gfx_layout charlayout =
340 {
341 	8,8,             /* 8*8 characters */
342 	RGN_FRAC(1,3),   /* 2048 characters */
343 	3,               /* 3 bits per pixel */
344 	{ RGN_FRAC(0,3), RGN_FRAC(1,3), RGN_FRAC(2,3) }, /* the bitplanes are separated */
345 	{ STEP8(0,1) },
346 	{ STEP8(0,8) },
347 	8*8              /* every char takes 8 consecutive bytes */
348 };
349 
350 static const gfx_layout tilelayout =
351 {
352 	8,8,             /* 8*8 tiles */
353 	RGN_FRAC(1,4),   /* 4096 tiles */
354 	4,               /* 4 bits per pixel */
355 	{ RGN_FRAC(0,4), RGN_FRAC(1,4), RGN_FRAC(2,4), RGN_FRAC(3,4) }, /* the bitplanes are separated */
356 	{ STEP8(0,1) },
357 	{ STEP8(0,8) },
358 	8*8              /* every tile takes 8 consecutive bytes */
359 };
360 
361 
362 static GFXDECODE_START( gfx_wardner )
363 	GFXDECODE_ENTRY( "gfx1", 0x00000, charlayout,   1536, 32 )  /* colors 1536-1791 */
364 	GFXDECODE_ENTRY( "gfx2", 0x00000, tilelayout,   1280, 16 )  /* colors 1280-1535 */
365 	GFXDECODE_ENTRY( "gfx3", 0x00000, tilelayout,   1024, 16 )  /* colors 1024-1079 */
366 GFXDECODE_END
367 
368 
driver_start()369 void wardner_state::driver_start()
370 {
371 	/* Save-State stuff in src/machine/twincobr.cpp */
372 	driver_savestate();
373 }
374 
machine_reset()375 void wardner_state::machine_reset()
376 {
377 	twincobr_state::machine_reset();
378 
379 	m_membank->set_bank(0);
380 }
381 
wardner(machine_config & config)382 void wardner_state::wardner(machine_config &config)
383 {
384 	/* basic machine hardware */
385 	Z80(config, m_maincpu, XTAL(24'000'000) / 4);   /* 6MHz */
386 	m_maincpu->set_addrmap(AS_PROGRAM, &wardner_state::main_program_map);
387 	m_maincpu->set_addrmap(AS_IO, &wardner_state::main_io_map);
388 
389 	ADDRESS_MAP_BANK(config, "membank").set_map(&wardner_state::main_bank_map).set_options(ENDIANNESS_LITTLE, 8, 18, 0x8000);
390 
391 	z80_device &audiocpu(Z80(config, "audiocpu", XTAL(14'000'000) / 4));    /* 3.5MHz */
392 	audiocpu.set_addrmap(AS_PROGRAM, &wardner_state::sound_program_map);
393 	audiocpu.set_addrmap(AS_IO, &wardner_state::sound_io_map);
394 
395 	TMS32010(config, m_dsp, XTAL(14'000'000));       /* 14MHz Crystal CLKin */
396 	m_dsp->set_addrmap(AS_PROGRAM, &wardner_state::dsp_program_map);
397 	/* Data Map is internal to the CPU */
398 	m_dsp->set_addrmap(AS_IO, &wardner_state::dsp_io_map);
399 	m_dsp->bio().set(FUNC(wardner_state::twincobr_bio_r));
400 
401 	config.set_maximum_quantum(attotime::from_hz(6000)); /* 100 CPU slices per frame */
402 
403 	ls259_device &mainlatch(LS259(config, "mainlatch"));
404 	mainlatch.q_out_cb<2>().set(FUNC(wardner_state::int_enable_w));
405 	mainlatch.q_out_cb<3>().set(FUNC(wardner_state::flipscreen_w));
406 	mainlatch.q_out_cb<4>().set(FUNC(wardner_state::bg_ram_bank_w));
407 	mainlatch.q_out_cb<5>().set(FUNC(wardner_state::fg_rom_bank_w));
408 	mainlatch.q_out_cb<6>().set(FUNC(wardner_state::display_on_w));
409 
410 	ls259_device &coinlatch(LS259(config, "coinlatch"));
411 	coinlatch.q_out_cb<0>().set(FUNC(wardner_state::dsp_int_w));
412 	coinlatch.q_out_cb<4>().set(FUNC(wardner_state::coin_counter_1_w));
413 	coinlatch.q_out_cb<5>().set(FUNC(wardner_state::coin_counter_2_w));
414 	coinlatch.q_out_cb<6>().set(FUNC(wardner_state::coin_lockout_1_w));
415 	coinlatch.q_out_cb<7>().set(FUNC(wardner_state::coin_lockout_2_w));
416 
417 	/* video hardware */
418 	hd6845s_device &crtc(HD6845S(config, "crtc", XTAL(14'000'000)/4)); /* 3.5MHz measured on CLKin */
419 	crtc.set_screen(m_screen);
420 	crtc.set_show_border_area(false);
421 	crtc.set_char_width(2);
422 
423 	TOAPLAN_SCU(config, m_spritegen, 0);
424 	m_spritegen->set_palette(m_palette);
425 	m_spritegen->set_xoffsets(32, 14);
426 
427 	BUFFERED_SPRITERAM8(config, m_spriteram8);
428 
429 	SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
430 	m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
431 	m_screen->set_raw(14_MHz_XTAL/2, 446, 0, 320, 286, 0, 240);
432 	m_screen->set_screen_update(FUNC(wardner_state::screen_update));
433 	m_screen->screen_vblank().set(m_spriteram8, FUNC(buffered_spriteram8_device::vblank_copy_rising));
434 	m_screen->screen_vblank().append(FUNC(wardner_state::wardner_vblank_irq));
435 
436 	GFXDECODE(config, m_gfxdecode, m_palette, gfx_wardner);
437 	PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 4096);
438 
439 	/* sound hardware */
440 	SPEAKER(config, "mono").front_center();
441 
442 	ym3812_device &ymsnd(YM3812(config, "ymsnd", XTAL(14'000'000) / 4));
443 	ymsnd.irq_handler().set_inputline("audiocpu", 0);
444 	ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
445 }
446 
447 
448 
449 /***************************************************************************
450 
451   Game driver(s)
452 
453 ***************************************************************************/
454 
455 ROM_START( wardner )
456 	ROM_REGION( 0x40000, "maincpu", ROMREGION_ERASEFF ) /* Banked Main Z80 code */
457 	ROM_LOAD( "b25-31.6m",  0x00000, 0x08000, CRC(c5dd56fd) SHA1(f0a09557150e9c1c6b9d8e125f5408fc269c9d17) )    /* Main Z80 code */
458 	ROM_LOAD( "b25-18.7m",  0x10000, 0x10000, CRC(9aab8ee2) SHA1(16fa44b75f4a3a5b1ff713690a299ecec2b5a4bf) )    /* OBJ ROMs */
459 	ROM_LOAD( "b25-19.8m",  0x20000, 0x10000, CRC(95b68813) SHA1(06ea1b1d6e2e6326ceb9324fc471d082fda6112e) )
460 	ROM_LOAD( "b25-32.10m", 0x38000, 0x08000, CRC(347f411b) SHA1(1fb2883d74d10350cb1c62fb58d5783652861b37) )
461 
462 	ROM_REGION( 0x10000, "audiocpu", 0 )    /* Sound Z80 code */
463 	ROM_LOAD( "b25-16.4k", 0x00000, 0x08000, CRC(e5202ff8) SHA1(15ae8c0bb16a20bee14e8d80d81c249404ab1463) )
464 
465 	ROM_REGION( 0x2000, "dsp", 0 )  /* Co-Processor TMS320C10 */
466 	ROMX_LOAD( "82s137.1d",  0x0000, 0x0400, CRC(cc5b3f53) SHA1(33589665ac995cc4645b56bbcd6d1c1cd5368f88), ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI | ROM_SKIP(1) ) /* msb */
467 	ROMX_LOAD( "82s137.1e",  0x0000, 0x0400, CRC(47351d55) SHA1(826add3ea3987f2c9ba2d3fc69a4ad2d9b033c89), ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO | ROM_SKIP(1) )
468 	ROMX_LOAD( "82s137.3d",  0x0001, 0x0400, CRC(70b537b9) SHA1(5211ec4605894727747dda66b70c9427652b16b4), ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI | ROM_SKIP(1) ) /* lsb */
469 	ROMX_LOAD( "82s137.3e",  0x0001, 0x0400, CRC(6edb2de8) SHA1(48459037c3b865f0c0d63a416fa71ba1119f7a09), ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO | ROM_SKIP(1) )
470 	ROMX_LOAD( "82s131.3b",  0x0800, 0x0200, CRC(9dfffaff) SHA1(2f4a1c1afba6a362dc5774a82656883b08fa16f2), ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI | ROM_SKIP(1) )
471 	ROMX_LOAD( "82s131.3a",  0x0800, 0x0200, CRC(712bad47) SHA1(b9f7be13cbd90a17fe7d13fb7987a0b9b759ccad), ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO | ROM_SKIP(1) )
472 	ROMX_LOAD( "82s131.2a",  0x0801, 0x0200, CRC(ac843ca6) SHA1(8fd278748ec89d8ebe2d4f3bf8b6731f357ddfb3), ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI | ROM_SKIP(1) )
473 	ROMX_LOAD( "82s131.1a",  0x0801, 0x0200, CRC(50452ff8) SHA1(76964fa9ee89a51cc71904e08cfc83bf81bb89aa), ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO | ROM_SKIP(1) )
474 
475 	ROM_REGION( 0x0c000, "gfx1", 0 )    /* chars */
476 	ROM_LOAD( "b25-28.10f", 0x00000, 0x04000, CRC(1392b60d) SHA1(86b9eab87f8d5f68fda500420f4ed61331089fc2) )
477 	ROM_LOAD( "b25-27.8f",  0x04000, 0x04000, CRC(0ed848da) SHA1(e4b38e21c101a28a8961a9fe30c9cb10919cc148) )
478 	ROM_LOAD( "b25-26.7f",  0x08000, 0x04000, CRC(79792c86) SHA1(648b97f1ec30d46e40e60eb13159b4f6f86e9243) )
479 
480 	ROM_REGION( 0x20000, "gfx2", 0 )    /* fg tiles */
481 	ROM_LOAD( "b25-12.18f",  0x00000, 0x08000, CRC(15d08848) SHA1(e2e62d95a3f240664b5e0ac0f163a0d5cefa5312) )
482 	ROM_LOAD( "b25-15.23f",  0x08000, 0x08000, CRC(cdd2d408) SHA1(7e4d77f8725fa30d4d65e811d10e0b2c00b23cfe) )
483 	ROM_LOAD( "b25-14.21f",  0x10000, 0x08000, CRC(5a2aef4f) SHA1(60f4ab2582a924defb5241ab367826ae1f4b3f5e) )
484 	ROM_LOAD( "b25-13.19f",  0x18000, 0x08000, CRC(be21db2b) SHA1(7fc1809618f2432c9ec6eb33ce57a5faffd44974) )
485 
486 	ROM_REGION( 0x20000, "gfx3", 0 )    /* bg tiles */
487 	ROM_LOAD( "b25-08.12f",  0x00000, 0x08000, CRC(883ccaa3) SHA1(90d686094eac6e80caf8e2cf90c00bb41a0d26e2) )
488 	ROM_LOAD( "b25-11.16f",  0x08000, 0x08000, CRC(d6ebd510) SHA1(d65e0db7756ebe6828bf637a6c915bb06082636c) )
489 	ROM_LOAD( "b25-10.15f",  0x10000, 0x08000, CRC(b9a61e81) SHA1(541e579664d583fbbf81111046115018fdaff073) )
490 	ROM_LOAD( "b25-09.14f",  0x18000, 0x08000, CRC(585411b7) SHA1(67c0f4b7ab303341d5481c4024dc4199acb7c279) )
491 
492 	ROM_REGION( 0x40000, "scu", 0 )    /* sprites */
493 	ROM_LOAD( "b25-01.14c",  0x00000, 0x10000, CRC(42ec01fb) SHA1(646192a2e89f795ed016860cdcdc0b5ef645fca2) )
494 	ROM_LOAD( "b25-02.16c",  0x10000, 0x10000, CRC(6c0130b7) SHA1(8b6ad72848d03c3d4ee3acd35abbb3a0e678122c) )
495 	ROM_LOAD( "b25-03.17c",  0x20000, 0x10000, CRC(b923db99) SHA1(2f4be81afdf200586bc44b1e94553d84d16d0b62) )
496 	ROM_LOAD( "b25-04.19c",  0x30000, 0x10000, CRC(8059573c) SHA1(75bd19e504433438b85ed00e50e85fb98eebf4de) )
497 
498 	ROM_REGION( 0x260, "proms", 0 )     /* nibble bproms, lo/hi order to be determined */
499 	ROM_LOAD( "82s129.b19",  0x000, 0x100, CRC(24e7d62f) SHA1(1c06a1ef1b6a722794ca1d5ee2c476ecaa5178a3) )   /* sprite priority control ?? */
500 	ROM_LOAD( "82s129.b18",  0x100, 0x100, CRC(a50cef09) SHA1(55cafb5b2551b80ae708e9b966cf37c70a16d310) )   /* sprite priority control ?? */
501 	ROM_LOAD( "82s123.b21",  0x200, 0x020, CRC(f72482db) SHA1(b0cb911f9c81f6088a5aa8760916ddae1f8534d7) )   /* sprite control ?? */
502 	ROM_LOAD( "82s123.c6",   0x220, 0x020, CRC(bc88cced) SHA1(5055362710c0f58823c05fb4c0e0eec638b91e3d) )   /* sprite attribute (flip/position) ?? */
503 	ROM_LOAD( "82s123.f1",   0x240, 0x020, CRC(4fb5df2a) SHA1(506ef2c8e4cf45c256d6831a0a5760732f2de422) )   /* tile to sprite priority ?? */
504 ROM_END
505 
506 ROM_START( pyros )
507 	ROM_REGION( 0x40000, "maincpu", ROMREGION_ERASEFF ) /* Banked Z80 code */
508 	ROM_LOAD( "b25-29.6m",  0x00000, 0x08000, CRC(b568294d) SHA1(5d04dd006f5180fa0c9340e2efa6613625d712a8) )    /* Main Z80 code */
509 	ROM_LOAD( "b25-18.7m",  0x10000, 0x10000, CRC(9aab8ee2) SHA1(16fa44b75f4a3a5b1ff713690a299ecec2b5a4bf) )    /* OBJ ROMs */
510 	ROM_LOAD( "b25-19.8m",  0x20000, 0x10000, CRC(95b68813) SHA1(06ea1b1d6e2e6326ceb9324fc471d082fda6112e) )
511 	ROM_LOAD( "b25-30.10m", 0x38000, 0x08000, CRC(5056c799) SHA1(9750fa8bf5d1181a4fecbcbf822f8f027bebd5a8) )
512 
513 	ROM_REGION( 0x10000, "audiocpu", 0 )    /* Sound Z80 code */
514 	ROM_LOAD( "b25-16.4k", 0x00000, 0x08000, CRC(e5202ff8) SHA1(15ae8c0bb16a20bee14e8d80d81c249404ab1463) )
515 
516 	ROM_REGION( 0x2000, "dsp", 0 )  /* Co-Processor TMS320C10 */
517 	ROMX_LOAD( "82s137.1d",  0x0000, 0x0400, CRC(cc5b3f53) SHA1(33589665ac995cc4645b56bbcd6d1c1cd5368f88), ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI | ROM_SKIP(1) ) /* msb */
518 	ROMX_LOAD( "82s137.1e",  0x0000, 0x0400, CRC(47351d55) SHA1(826add3ea3987f2c9ba2d3fc69a4ad2d9b033c89), ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO | ROM_SKIP(1) )
519 	ROMX_LOAD( "82s137.3d",  0x0001, 0x0400, CRC(70b537b9) SHA1(5211ec4605894727747dda66b70c9427652b16b4), ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI | ROM_SKIP(1) ) /* lsb */
520 	ROMX_LOAD( "82s137.3e",  0x0001, 0x0400, CRC(6edb2de8) SHA1(48459037c3b865f0c0d63a416fa71ba1119f7a09), ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO | ROM_SKIP(1) )
521 	ROMX_LOAD( "82s131.3b",  0x0800, 0x0200, CRC(9dfffaff) SHA1(2f4a1c1afba6a362dc5774a82656883b08fa16f2), ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI | ROM_SKIP(1) )
522 	ROMX_LOAD( "82s131.3a",  0x0800, 0x0200, CRC(712bad47) SHA1(b9f7be13cbd90a17fe7d13fb7987a0b9b759ccad), ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO | ROM_SKIP(1) )
523 	ROMX_LOAD( "82s131.2a",  0x0801, 0x0200, CRC(ac843ca6) SHA1(8fd278748ec89d8ebe2d4f3bf8b6731f357ddfb3), ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI | ROM_SKIP(1) )
524 	ROMX_LOAD( "82s131.1a",  0x0801, 0x0200, CRC(50452ff8) SHA1(76964fa9ee89a51cc71904e08cfc83bf81bb89aa), ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO | ROM_SKIP(1) )
525 
526 	ROM_REGION( 0x0c000, "gfx1", 0 )    /* chars */
527 	ROM_LOAD( "b25-35.10f", 0x00000, 0x04000, CRC(fec6f0c0) SHA1(f91d698fa0712659c2e6b382a8166b1cacc50a3f) )
528 	ROM_LOAD( "b25-34.8f",  0x04000, 0x04000, CRC(02505dad) SHA1(28993c68a17929d6b819ca81cdf60985531fc80b) )
529 	ROM_LOAD( "b25-33.7f",  0x08000, 0x04000, CRC(9a55fcb9) SHA1(e04d68cc0b80b79b5f4c19c14b2e87f226f45ac8) )
530 
531 	ROM_REGION( 0x20000, "gfx2", 0 )    /* fg tiles */
532 	ROM_LOAD( "b25-12.18f",  0x00000, 0x08000, CRC(15d08848) SHA1(e2e62d95a3f240664b5e0ac0f163a0d5cefa5312) )
533 	ROM_LOAD( "b25-15.23f",  0x08000, 0x08000, CRC(cdd2d408) SHA1(7e4d77f8725fa30d4d65e811d10e0b2c00b23cfe) )
534 	ROM_LOAD( "b25-14.21f",  0x10000, 0x08000, CRC(5a2aef4f) SHA1(60f4ab2582a924defb5241ab367826ae1f4b3f5e) )
535 	ROM_LOAD( "b25-13.19f",  0x18000, 0x08000, CRC(be21db2b) SHA1(7fc1809618f2432c9ec6eb33ce57a5faffd44974) )
536 
537 	ROM_REGION( 0x20000, "gfx3", 0 )    /* bg tiles */
538 	ROM_LOAD( "b25-08.12f",  0x00000, 0x08000, CRC(883ccaa3) SHA1(90d686094eac6e80caf8e2cf90c00bb41a0d26e2) )
539 	ROM_LOAD( "b25-11.16f",  0x08000, 0x08000, CRC(d6ebd510) SHA1(d65e0db7756ebe6828bf637a6c915bb06082636c) )
540 	ROM_LOAD( "b25-10.15f",  0x10000, 0x08000, CRC(b9a61e81) SHA1(541e579664d583fbbf81111046115018fdaff073) )
541 	ROM_LOAD( "b25-09.14f",  0x18000, 0x08000, CRC(585411b7) SHA1(67c0f4b7ab303341d5481c4024dc4199acb7c279) )
542 
543 	ROM_REGION( 0x40000, "scu", 0 )    /* sprites */
544 	ROM_LOAD( "b25-01.14c",  0x00000, 0x10000, CRC(42ec01fb) SHA1(646192a2e89f795ed016860cdcdc0b5ef645fca2) )
545 	ROM_LOAD( "b25-02.16c",  0x10000, 0x10000, CRC(6c0130b7) SHA1(8b6ad72848d03c3d4ee3acd35abbb3a0e678122c) )
546 	ROM_LOAD( "b25-03.17c",  0x20000, 0x10000, CRC(b923db99) SHA1(2f4be81afdf200586bc44b1e94553d84d16d0b62) )
547 	ROM_LOAD( "b25-04.19c",  0x30000, 0x10000, CRC(8059573c) SHA1(75bd19e504433438b85ed00e50e85fb98eebf4de) )
548 
549 	ROM_REGION( 0x260, "proms", 0 )     /* nibble bproms, lo/hi order to be determined */
550 	ROM_LOAD( "82s129.b19",  0x000, 0x100, CRC(24e7d62f) SHA1(1c06a1ef1b6a722794ca1d5ee2c476ecaa5178a3) )   /* sprite priority control ?? */
551 	ROM_LOAD( "82s129.b18",  0x100, 0x100, CRC(a50cef09) SHA1(55cafb5b2551b80ae708e9b966cf37c70a16d310) )   /* sprite priority control ?? */
552 	ROM_LOAD( "82s123.b21",  0x200, 0x020, CRC(f72482db) SHA1(b0cb911f9c81f6088a5aa8760916ddae1f8534d7) )   /* sprite control ?? */
553 	ROM_LOAD( "82s123.c6",   0x220, 0x020, CRC(bc88cced) SHA1(5055362710c0f58823c05fb4c0e0eec638b91e3d) )   /* sprite attribute (flip/position) ?? */
554 	ROM_LOAD( "82s123.f1",   0x240, 0x020, CRC(4fb5df2a) SHA1(506ef2c8e4cf45c256d6831a0a5760732f2de422) )   /* tile to sprite priority ?? */
555 ROM_END
556 
557 ROM_START( wardnerj )
558 	ROM_REGION( 0x40000, "maincpu", ROMREGION_ERASEFF ) /* Banked Z80 code */
559 	ROM_LOAD( "b25-17.6m",  0x00000, 0x08000, CRC(4164dca9) SHA1(1f02c0991d7c14230043e34cb4b8e089b467b234) )   /* Main Z80 code */
560 	ROM_LOAD( "b25-18.7m",  0x10000, 0x10000, CRC(9aab8ee2) SHA1(16fa44b75f4a3a5b1ff713690a299ecec2b5a4bf) )   /* OBJ ROMs */
561 	ROM_LOAD( "b25-19.8m",  0x20000, 0x10000, CRC(95b68813) SHA1(06ea1b1d6e2e6326ceb9324fc471d082fda6112e) )
562 	ROM_LOAD( "b25-20.10m", 0x38000, 0x08000, CRC(1113ad38) SHA1(88f89054954b1d2776ceaedc7a3605190808d7e5) )
563 
564 	ROM_REGION( 0x10000, "audiocpu", 0 )    /* Sound Z80 code */
565 	ROM_LOAD( "b25-16.4k", 0x00000, 0x08000, CRC(e5202ff8) SHA1(15ae8c0bb16a20bee14e8d80d81c249404ab1463) )
566 
567 	ROM_REGION( 0x2000, "dsp", 0 )  /* Co-Processor TMS320C10 */
568 	ROMX_LOAD( "82s137.1d",  0x0000, 0x0400, CRC(cc5b3f53) SHA1(33589665ac995cc4645b56bbcd6d1c1cd5368f88), ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI | ROM_SKIP(1) ) /* msb */
569 	ROMX_LOAD( "82s137.1e",  0x0000, 0x0400, CRC(47351d55) SHA1(826add3ea3987f2c9ba2d3fc69a4ad2d9b033c89), ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO | ROM_SKIP(1) )
570 	ROMX_LOAD( "82s137.3d",  0x0001, 0x0400, CRC(70b537b9) SHA1(5211ec4605894727747dda66b70c9427652b16b4), ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI | ROM_SKIP(1) ) /* lsb */
571 	ROMX_LOAD( "82s137.3e",  0x0001, 0x0400, CRC(6edb2de8) SHA1(48459037c3b865f0c0d63a416fa71ba1119f7a09), ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO | ROM_SKIP(1) )
572 	ROMX_LOAD( "82s131.3b",  0x0800, 0x0200, CRC(9dfffaff) SHA1(2f4a1c1afba6a362dc5774a82656883b08fa16f2), ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI | ROM_SKIP(1) )
573 	ROMX_LOAD( "82s131.3a",  0x0800, 0x0200, CRC(712bad47) SHA1(b9f7be13cbd90a17fe7d13fb7987a0b9b759ccad), ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO | ROM_SKIP(1) )
574 	ROMX_LOAD( "82s131.2a",  0x0801, 0x0200, CRC(ac843ca6) SHA1(8fd278748ec89d8ebe2d4f3bf8b6731f357ddfb3), ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI | ROM_SKIP(1) )
575 	ROMX_LOAD( "82s131.1a",  0x0801, 0x0200, CRC(50452ff8) SHA1(76964fa9ee89a51cc71904e08cfc83bf81bb89aa), ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO | ROM_SKIP(1) )
576 
577 	ROM_REGION( 0x0c000, "gfx1", 0 )    /* chars */
578 	ROM_LOAD( "b25-07.10f", 0x00000, 0x04000, CRC(50e329e0) SHA1(5d5fb7043457d952b28101acb909ed65bf13a2dc) )
579 	ROM_LOAD( "b25-06.8f",  0x04000, 0x04000, CRC(3bfeb6ae) SHA1(3a251f49901ccb17b5fedf81980d54e4f6f49d4d) )
580 	ROM_LOAD( "b25-05.7f",  0x08000, 0x04000, CRC(be36a53e) SHA1(320fc5b88ed1fce1aa8d8e76e1046206c138b35c) )
581 
582 	ROM_REGION( 0x20000, "gfx2", 0 )    /* fg tiles */
583 	ROM_LOAD( "b25-12.18f",  0x00000, 0x08000, CRC(15d08848) SHA1(e2e62d95a3f240664b5e0ac0f163a0d5cefa5312) )
584 	ROM_LOAD( "b25-15.23f",  0x08000, 0x08000, CRC(cdd2d408) SHA1(7e4d77f8725fa30d4d65e811d10e0b2c00b23cfe) )
585 	ROM_LOAD( "b25-14.21f",  0x10000, 0x08000, CRC(5a2aef4f) SHA1(60f4ab2582a924defb5241ab367826ae1f4b3f5e) )
586 	ROM_LOAD( "b25-13.19f",  0x18000, 0x08000, CRC(be21db2b) SHA1(7fc1809618f2432c9ec6eb33ce57a5faffd44974) )
587 
588 	ROM_REGION( 0x20000, "gfx3", 0 )    /* bg tiles */
589 	ROM_LOAD( "b25-08.12f",  0x00000, 0x08000, CRC(883ccaa3) SHA1(90d686094eac6e80caf8e2cf90c00bb41a0d26e2) )
590 	ROM_LOAD( "b25-11.16f",  0x08000, 0x08000, CRC(d6ebd510) SHA1(d65e0db7756ebe6828bf637a6c915bb06082636c) )
591 	ROM_LOAD( "b25-10.15f",  0x10000, 0x08000, CRC(b9a61e81) SHA1(541e579664d583fbbf81111046115018fdaff073) )
592 	ROM_LOAD( "b25-09.14f",  0x18000, 0x08000, CRC(585411b7) SHA1(67c0f4b7ab303341d5481c4024dc4199acb7c279) )
593 
594 	ROM_REGION( 0x40000, "scu", 0 )    /* sprites */
595 	ROM_LOAD( "b25-01.14c",  0x00000, 0x10000, CRC(42ec01fb) SHA1(646192a2e89f795ed016860cdcdc0b5ef645fca2) )
596 	ROM_LOAD( "b25-02.16c",  0x10000, 0x10000, CRC(6c0130b7) SHA1(8b6ad72848d03c3d4ee3acd35abbb3a0e678122c) )
597 	ROM_LOAD( "b25-03.17c",  0x20000, 0x10000, CRC(b923db99) SHA1(2f4be81afdf200586bc44b1e94553d84d16d0b62) )
598 	ROM_LOAD( "b25-04.19c",  0x30000, 0x10000, CRC(8059573c) SHA1(75bd19e504433438b85ed00e50e85fb98eebf4de) )
599 
600 	ROM_REGION( 0x260, "proms", 0 )     /* nibble bproms, lo/hi order to be determined */
601 	ROM_LOAD( "82s129.b19",  0x000, 0x100, CRC(24e7d62f) SHA1(1c06a1ef1b6a722794ca1d5ee2c476ecaa5178a3) )   /* sprite priority control ?? */
602 	ROM_LOAD( "82s129.b18",  0x100, 0x100, CRC(a50cef09) SHA1(55cafb5b2551b80ae708e9b966cf37c70a16d310) )   /* sprite priority control ?? */
603 	ROM_LOAD( "82s123.b21",  0x200, 0x020, CRC(f72482db) SHA1(b0cb911f9c81f6088a5aa8760916ddae1f8534d7) )   /* sprite control ?? */
604 	ROM_LOAD( "82s123.c6",   0x220, 0x020, CRC(bc88cced) SHA1(5055362710c0f58823c05fb4c0e0eec638b91e3d) )   /* sprite attribute (flip/position) ?? */
605 	ROM_LOAD( "82s123.f1",   0x240, 0x020, CRC(4fb5df2a) SHA1(506ef2c8e4cf45c256d6831a0a5760732f2de422) )   /* tile to sprite priority ?? */
606 ROM_END
607 
608 
609 GAME( 1987, wardner,  0,       wardner, wardner,  wardner_state, empty_init, ROT0, "Toaplan / Taito Corporation Japan",   "Wardner (World)",         MACHINE_SUPPORTS_SAVE )
610 GAME( 1987, pyros,    wardner, wardner, pyros,    wardner_state, empty_init, ROT0, "Toaplan / Taito America Corporation", "Pyros (US)",              MACHINE_SUPPORTS_SAVE )
611 GAME( 1987, wardnerj, wardner, wardner, wardnerj, wardner_state, empty_init, ROT0, "Toaplan / Taito Corporation",         "Wardner no Mori (Japan)", MACHINE_SUPPORTS_SAVE )
612