diff options
Diffstat (limited to 'src/mame/drivers/speedatk.cpp')
-rw-r--r-- | src/mame/drivers/speedatk.cpp | 364 |
1 files changed, 0 insertions, 364 deletions
diff --git a/src/mame/drivers/speedatk.cpp b/src/mame/drivers/speedatk.cpp deleted file mode 100644 index 9b35cde163e..00000000000 --- a/src/mame/drivers/speedatk.cpp +++ /dev/null @@ -1,364 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Angelo Salese, Pierpaolo Prazzoli -/***************************************************************************************** - -Speed Attack! (c) 1984 Seta Kikaku Corp. - -driver by Pierpaolo Prazzoli & Angelo Salese, based on early work by David Haywood - -TODO: - - It's possible that there is only one coin chute and not two,needs a real board to know - more about it. - -How to play: - - A to D selects a card. - - Turn takes one or more cards into your hand (depends on how many cards you - putted on the stacks). - - Left & right puts a card on one of the two stacks. - -Notes: - - According to the text gfx rom, there are also a Taito and a KKK versions out there. - ------------------------------------------------------------------------------------------- -SPEED ATTACK! -(c)SETA - -CPU :Z80 x 1 -SOUND :AY-3-8910 x 1 -XTAL :12MHZ - -SETA CUSTOM ? -AC-002 , AC-003 - -CB1-1 :1C -CB0-2 :1D -CB1-3 :1F -CB0-4 :1H -CB0-5 :7C -CB0-6 :7D -CB0-7 :7E - -CB1.BPR :7L TBP18S030 -CB2.BPR :6K 82S129 - ----------------------------------------------------------- - -DIP SWITCH 8BIT (Default: ALL ON) - -SW 1,2 : COIN CREDIT LL:1-1 HL:1-2 LH:1-5 HH:1-10 -SW 3,4 : LEVEL LL:EASY -> LH -> HL -> HH:HARD -SW 5,6 : NOT USE -SW 7 : FLIP SCREEN H:FLIP -SW 8 : TEST MODE H:TEST - - PARTS SIDE | SOLDIER SIDE - ---------------------------- - GND | 1| GND - GND | 2| GND - +5V | 3| +5V - | 4| - +12V | 5| +12V - SPEAKER(+)| 6| SPEAKER(-) - SYNC | 7| COIN COUNTER - B | 8| SERVICE - G | 9| COIN SW - R |10| - PD 6 |11| PS 6 (NOT USE) - PD 5 |12| PS 5 (NOT USE) - PD 4 |13| PS 4 - PD 3 |14| PS 3 - PD 1 |15| PS 1 - PD 2 |16| PS 2 - |17| - |18| - -PS / PD : key matrix -*****************************************************************************************/ - -#include "emu.h" -#include "includes/speedatk.h" - -#include "cpu/z80/z80.h" -#include "machine/watchdog.h" -#include "sound/ay8910.h" -#include "screen.h" -#include "speaker.h" - - -#define MASTER_CLOCK XTAL(12'000'000) - -void speedatk_state::machine_start() -{ - save_item(NAME(m_mux_data)); - save_item(NAME(m_km_status)); - save_item(NAME(m_coin_settings)); - save_item(NAME(m_coin_impulse)); -} - -uint8_t speedatk_state::iox_key_matrix_calc(uint8_t p_side) -{ - static const char *const keynames[] = { "P1_ROW0", "P1_ROW1", "P2_ROW0", "P2_ROW1" }; - - int i, j, t; - - for (i = 0x00 ; i < 0x10 ; i += 8) - { - j = (i / 0x08); - - for (t = 0 ; t < 8 ; t ++) - { - if (!(ioport(keynames[j+p_side])->read() & ( 1 << t ))) - { - return (i + t) | (p_side ? 0x20 : 0x00); - } - } - } - - return 0; -} - -READ8_MEMBER(speedatk_state::key_matrix_r) -{ - if(m_coin_impulse > 0) - { - m_coin_impulse--; - return 0x80; - } - - if((ioport("COINS")->read() & 1) || (ioport("COINS")->read() & 2)) - { - m_coin_impulse = m_coin_settings; - m_coin_impulse--; - return 0x80; - } - - if(m_mux_data != 1 && m_mux_data != 2 && m_mux_data != 4) - return 0xff; //unknown command - - /* both side checks */ - if(m_mux_data == 1) - { - uint8_t p1_side = iox_key_matrix_calc(0); - uint8_t p2_side = iox_key_matrix_calc(2); - - if(p1_side != 0) - return p1_side; - - return p2_side; - } - - /* check individual input side */ - return iox_key_matrix_calc((m_mux_data == 2) ? 0 : 2); -} - -WRITE8_MEMBER(speedatk_state::key_matrix_w) -{ - m_mux_data = data; -} - -/* Key matrix status,used for coin settings and I don't know what else... */ -READ8_MEMBER(speedatk_state::key_matrix_status_r) -{ - /* bit 0: busy flag,active low */ - return (m_km_status & 0xfe) | 1; -} - -/* -xxxx ---- command ----- xxxx param -My guess is that the other commands configs the key matrix, it probably needs some tests on the real thing. -1f -3f -41 -61 -8x coinage setting command -a1 -*/ -WRITE8_MEMBER(speedatk_state::key_matrix_status_w) -{ - m_km_status = data; - if((m_km_status & 0xf0) == 0x80) //coinage setting command - m_coin_settings = m_km_status & 0xf; -} - -void speedatk_state::speedatk_mem(address_map &map) -{ - map(0x0000, 0x7fff).rom(); - map(0x8000, 0x8000).rw(FUNC(speedatk_state::key_matrix_r), FUNC(speedatk_state::key_matrix_w)); - map(0x8001, 0x8001).rw(FUNC(speedatk_state::key_matrix_status_r), FUNC(speedatk_state::key_matrix_status_w)); - map(0x8800, 0x8fff).ram(); - map(0xa000, 0xa3ff).ram().share("videoram"); - map(0xb000, 0xb3ff).ram().share("colorram"); -} - - -void speedatk_state::speedatk_io(address_map &map) -{ - map.global_mask(0xff); - map(0x00, 0x01).w(FUNC(speedatk_state::m6845_w)); //h46505 address / data routing - map(0x24, 0x24).w("watchdog", FUNC(watchdog_timer_device::reset_w)); - map(0x40, 0x40).r("aysnd", FUNC(ay8910_device::data_r)); - map(0x40, 0x41).w("aysnd", FUNC(ay8910_device::address_data_w)); - //what's 60-6f for? Seems used only in attract mode and read back when a 2p play ends ... -} - -static INPUT_PORTS_START( speedatk ) - PORT_START("DSW") - PORT_SERVICE( 0x01, IP_ACTIVE_HIGH ) - PORT_DIPNAME( 0x02, 0x00, DEF_STR( Flip_Screen ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x02, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x04, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x08, DEF_STR( On ) ) - PORT_DIPNAME( 0x30, 0x00, DEF_STR( Difficulty ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x20, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Hard ) ) - PORT_DIPSETTING( 0x30, DEF_STR( Hardest ) ) - PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Coinage ) ) - PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) ) - PORT_DIPSETTING( 0x40, DEF_STR( 1C_5C ) ) - PORT_DIPSETTING( 0xc0, "1 Coin/10 Credits" ) - - PORT_START("P1_ROW0") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("P1 B") PORT_CODE(KEYCODE_X) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("P1 A") PORT_CODE(KEYCODE_Z) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("P1 C") PORT_CODE(KEYCODE_C) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("P1 D") PORT_CODE(KEYCODE_V) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(1) PORT_NAME("P1 Left") PORT_CODE(KEYCODE_A) - - PORT_START("P1_ROW1") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(1) PORT_NAME("P1 Right") PORT_CODE(KEYCODE_S) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START2 ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_PLAYER(1) PORT_NAME("P1 Turn") PORT_CODE(KEYCODE_Q) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("P2_ROW0") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 B") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 A") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 C") - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 D") - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("P2 Left") - - PORT_START("P2_ROW1") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(2) PORT_NAME("P2 Right") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_PLAYER(2) PORT_NAME("P2 Turn") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("COINS") - PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(1) - PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_IMPULSE(1) -INPUT_PORTS_END - -static const gfx_layout charlayout_1bpp = -{ - 8,8, - RGN_FRAC(1,1), - 3, - { 0, 0, 0 }, - { 0, 1, 2, 3, 4, 5, 6, 7 }, - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, - 8*8 -}; - -static const gfx_layout charlayout_3bpp = -{ - 8,8, - RGN_FRAC(1,3), - 3, - { RGN_FRAC(2,3), RGN_FRAC(1,3), RGN_FRAC(0,3) }, - { 0, 1, 2, 3, 4, 5, 6, 7 }, - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, - 8*8 -}; - - -static GFXDECODE_START( gfx_speedatk ) - GFXDECODE_ENTRY( "gfx1", 0, charlayout_1bpp, 0, 32 ) - GFXDECODE_ENTRY( "gfx2", 0, charlayout_3bpp, 0, 32 ) -GFXDECODE_END - -WRITE8_MEMBER(speedatk_state::output_w) -{ - m_flip_scr = data & 0x80; - - if((data & 0x7f) != 0x7f) - logerror("%02x\n",data); -} - -void speedatk_state::speedatk(machine_config &config) -{ - Z80(config, m_maincpu, MASTER_CLOCK/2); //divider is unknown - m_maincpu->set_addrmap(AS_PROGRAM, &speedatk_state::speedatk_mem); - m_maincpu->set_addrmap(AS_IO, &speedatk_state::speedatk_io); - m_maincpu->set_vblank_int("screen", FUNC(speedatk_state::irq0_line_hold)); - - WATCHDOG_TIMER(config, "watchdog").set_vblank_count("screen", 8); // timing is unknown - - /* video hardware */ - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_refresh_hz(60); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - screen.set_size(320, 256); - screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1); - screen.set_screen_update(FUNC(speedatk_state::screen_update)); - - MC6845(config, m_crtc, MASTER_CLOCK/16); /* unknown variant; hand tuned to get ~60 fps */ - m_crtc->set_screen("screen"); - m_crtc->set_show_border_area(false); - m_crtc->set_char_width(8); - - GFXDECODE(config, m_gfxdecode, m_palette, gfx_speedatk); - PALETTE(config, m_palette, FUNC(speedatk_state::speedatk_palette), 0x100, 16); - - /* sound hardware */ - SPEAKER(config, "mono").front_center(); - - ay8910_device &aysnd(AY8910(config, "aysnd", MASTER_CLOCK/4)); //divider is unknown - aysnd.port_b_read_callback().set_ioport("DSW"); - aysnd.port_a_write_callback().set(FUNC(speedatk_state::output_w)); - aysnd.add_route(ALL_OUTPUTS, "mono", 0.5); -} - -ROM_START( speedatk ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "cb1-1", 0x0000, 0x2000, CRC(df988e05) SHA1(0ec91c5f2e1adf952a4fe7aede591e763773a75b) ) - ROM_LOAD( "cb0-2", 0x2000, 0x2000, CRC(be949154) SHA1(8a594a7ebdc8456290919163f7ea4ccb0d1f4edb) ) - ROM_LOAD( "cb1-3", 0x4000, 0x2000, CRC(741a5949) SHA1(7f7bebd4fb73fef9aa28549d100f632c442ac9b3) ) - ROM_LOAD( "cb0-4", 0x6000, 0x2000, CRC(53a9c0c8) SHA1(cd0fd94411dabf09828c1f629891158c40794127) ) - - ROM_REGION( 0x2000, "gfx1", 0 ) - ROM_LOAD( "cb0-7", 0x0000, 0x2000, CRC(a86007b5) SHA1(8e5cab76c37a8d53e1355000cd1a0a85ffae0e8c) ) - - ROM_REGION( 0x6000, "gfx2", 0 ) - ROM_LOAD( "cb0-5", 0x0000, 0x2000, CRC(47a966e7) SHA1(fdaa0f88656afc431bae367679ce6298fa962e0f) ) - ROM_LOAD( "cb0-6", 0x2000, 0x2000, CRC(cc1da937) SHA1(1697bb008bfa5c33a282bd470ac39c324eea7509) ) - ROM_COPY( "gfx2", 0x0000, 0x4000, 0x1000 ) /* Fill the blank space with cards gfx */ - ROM_COPY( "gfx1", 0x1000, 0x5000, 0x1000 ) /* Gfx from cb0-7 */ - - ROM_REGION( 0x0120, "proms", 0 ) - ROM_LOAD( "cb1.bpr", 0x0000, 0x0020, CRC(a0176c23) SHA1(133fb9eef8a6595cac2dcd7edce4789899a59e84) ) /* color PROM */ - ROM_LOAD( "cb2.bpr", 0x0020, 0x0100, CRC(a604cf96) SHA1(a4ef6e77dcd3abe4c27e8e636222a5ee711a51f5) ) /* lookup table */ -ROM_END - -GAME( 1984, speedatk, 0, speedatk, speedatk, speedatk_state, empty_init, ROT0, "Seta Kikaku Corp.", "Speed Attack! (Japan)", MACHINE_SUPPORTS_SAVE ) |