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