// license:GPL-2.0+ // copyright-holders:Jarek Burczynski /**************************************************************************** Forty-Love (c) Taito 1984 driver by Jarek Burczynski ****************************************************************************/ /* TO DO: - sprites graphics decoding could be changed to only use color codes 8-15 (now it decodes all 64 colors). - sprite memory needs to be buffered ? - inputs labels for Field Day, also fix the p3 / p4 controls (actually routes to p1 / p2) - pixel layer needs priority ? */ /* Game : 40-0 (Forty-Love Tennis game) Manufacturer : Taito Game number : A30 Vintage : 1984 Game serial/model number : M4300006B ? I don't have the wiring harness for this board, so don't know if it works. One GFX ROM is bad though. See A30-26.u23\A30-26.txt for details about the bad ROM. To summarise: Dumps from GFX ROM A30-26.u23 were inconsistent. Reads with checksums 41A3 and 415F occurred a couple of times, and the difference is one byte at offset $0004 (data $CC or $88). Maybe one of these reads is correct or closest to the real ROM. We are using the one with checksum 415F, the other one makes one sprite looks worse. This is a four board system - Main, Video, ROM, and Sound boards. Details: Main board: J1100004A / K1100010A <--label with K1100026A covers these 1 x NEC D780C-1 (Z80) CPU 1 x Motorola M68705P5S MCU 1 x Mitsubishi M5517P SRAM chip 1 x (8bit x 2048) used 1 x Fujitsu MB14241 ??? chip ( DAC ????? ) 4 x Fujitsu MB81416-10 DRAM chips 4 x (4bit x 16384) 1/2 used 1 x TD62003P (lamps/LEDs driver) 1 x 8MHz xtal 3 x 8way DSW Sound board: J1100005A / K1100011A 1 x NEC D780C-1 (Z80) CPU 1 x Mitsubishi M5517P SRAM chip 1 x (8bit x 2048) used 1 x Yamaha YM2149 1 x OKI M5232 1 x Fujitsu MB3731 Audio amp 1 x 8MHz xtal Video board: J1100008A / K1100025A 4 x AMD AM93422 RAM chips 4 x (4bit x 256) 1/2 used 2 x Mitsubishi M5517P SRAM chips 2 x (8bit x 2048) 1/2 used 6 x Mitsubishi M53357P (=LS157) 1 x 18.432MHz xtal ROM board: J9100005A / K9100008A ROMS: Programmer Device Legend: Checksum ___ A30-08.u08 AD5C 2764 \ A30-09.u09 C1E4 2764 \ A30-10.u10 C6B1 2764 \ Sound Board ROMs A30-11.u37 ACD8 2764 / A30-12.u38 B7C4 2764 / A30-13.u39 6B43 2764 ___/ A30-14.u41 M68705P5S ___> Main board MCU A30-15.u03 2F6E 6353 \ A30-16.u01 2E97 6353 \ Video board BPROMs A30-17.u02 2CD3 6353 / All read as 82S137 A30-18.u13 15E5 7643 ___/ A30-19.ic1 C88C 2764 \ A30-20.ic2 7B40 2764 \ ROM board ROMs. A30-21.ic3 E2B4 2764 \ These are Program ROMs for A30-22.ic4 8937 2764 / the main board A30-23.ic5 A6F6 2764 / A30-24.ic6 75DC 2764 ___/ A30-25.u22 1903 2764 \ A30-26.u23 ?? 2764 BAD ! \ A30-27.u24 005B 2764 \ A30-28.u25 279F 2764 \ Video board GFX ROMs A30-29.u62 BAA4 2764 / A30-30.u63 0BB6 2764 / A30-31.u64 461C 2764 / A30-32.u65 E764 2764 ___/ Notes, Programmer used: HiLo All-08A programmer. Q and P connectors, provide connection between the main and video board, via ribbon cables. The following are board layouts, and component locations. Main-Board J1100004A / K1100010A <--label with K1100026A covers these +--------------------------------------------------+ | DSW1 DSW2 DSW3 | | 5517 Z80 | = | = ROMskt | P == = ROMskt 68705P5 (A30-14) == = == Wiring harness | ROMskt MB14241 TD62003 == connector | == = == = == Q 81416 Ribbon = | = 81416 cable = === Wiring harness = 81416 to sound S === connector | 81416 board --> = === | 8MHz = | +--------------------------------------------------+ ROM board J9100005A / K9100008A +------------------------+ | | | ROMskt A30-23 A30-24 | | | | ROMskt A30-21 A30-22 | | | | ROMskt A30-19 A30-20 | +------------------------+ Video Board J1100008A / K1100025A +--------------------------------------------------+ | A30-32 A30-15 | | A30-28 A30-18 A30-17 | = A30-31 A30-16 | = A30-27 | Q A30-30 | = A30-26 == =18.432MHz A30-29 == | 53357 53357 A30-25 == Wiring harness | == connector = 53357 5517 == = 53357 53357 == P 53357 93422 | = 93422 | = 93422 | | 5517 93422 | | | +--------------------------------------------------+ Sound Board J1100005A / K1100011A (The following representation is rotated 90 degrees anti-clockwise) _______ Ribbon cable +------------------------+ \|/ to main board | A30-13 A30-14 A30-15 +----------+ | |||S||| | | Z80 | | YM2149 MB3731 | | A30-08 | | A30-09 | | M5232 A30-10 | | 5517 | | | | | | 8MHz | +-----------------------------------+ Side view --Sound board------------------- -----ROM board--- --------Main board-------------------------------- --------Video board------------------------------- Details by Quench ************************************************************* FieldDay by Taito Same board as 40-Love M4300048A 18.432 mhz crystal 2x m5m5517 4x am93422 (2101) A17-15->18 6353 1024x4 prom M4300049A (relabeled J1100004A/K1100010A) 8 mhz crystal 4x 4416 1x m5m5517 z80c a17_14 protection processor. 28 Pin Motorola 15-00011-01 DA68235 (Labeled 8909) Next to MB14241 Rom Daughterboard K9100013A (relabeled J9100005A/K9100008A) Sound Board K1100024A (relabeled J1100005A/K1100011A) 8 Mhz crystal DZ80C YM2149 Oki M5232 (6532?) Notes - Has jumper setting for 122HZ or 61HZ) */ #include "emu.h" #include "includes/40love.h" #include "cpu/m6805/m6805.h" #include "cpu/z80/z80.h" #include "machine/input_merger.h" #include "sound/dac.h" #include "sound/volt_reg.h" #include "screen.h" #include "speaker.h" #if 0 WRITE8_MEMBER(fortyl_state::fortyl_coin_counter_w) { machine().bookkeeping().coin_counter_w(offset,data); } #endif WRITE8_MEMBER(fortyl_state::bank_select_w) { if ((data != 0x02) && (data != 0xfd)) { // logerror("WRONG BANK SELECT = %x !!!!\n",data); // popmessage("WRONG BANK SELECT = %x !!!!\n",data); } membank("bank1")->set_entry(data & 1); } WRITE8_MEMBER(fortyl_state::pix1_w) { // if (data > 7) // logerror("pix1 = %2x\n", data); m_pix1 = data; } READ8_MEMBER(fortyl_state::fortyl_mcu_status_r) { // bit 0 = when 1, MCU is ready to receive data from main CPU // bit 1 = when 1, MCU has sent data to the main CPU return ((CLEAR_LINE == m_bmcu->host_semaphore_r()) ? 0x01 : 0x00) | ((CLEAR_LINE != m_bmcu->mcu_semaphore_r()) ? 0x02 : 0x00); } WRITE8_MEMBER(fortyl_state::pix1_mcu_w) { // if (data > 7) // logerror("pix1 = %2x\n", data); m_pix1 = data; } WRITE8_MEMBER(fortyl_state::pix2_w) { // if ((data!=0x00) && (data != 0xff)) // logerror("pix2 = %2x\n", data); m_pix2[0] = m_pix2[1]; m_pix2[1] = data; } #if 0 READ8_MEMBER(fortyl_state::pix1_r) { return m_pix1; } #endif READ8_MEMBER(fortyl_state::pix2_r) { int res; int d1 = m_pix1 & 7; res = (((m_pix2[1] << (d1 + 8)) | (m_pix2[0] << d1)) & 0xff00) >> 8; return res; } /***************************************************************************/ void fortyl_state::init_undoukai() { uint8_t *ROM = memregion("maincpu")->base(); membank("bank1")->configure_entries(0, 2, &ROM[0x10000], 0x2000); m_pix_color[0] = 0x000; m_pix_color[1] = 0x1e3; m_pix_color[2] = 0x16c; m_pix_color[3] = 0x1ec; } void fortyl_state::init_40love() { uint8_t *ROM = memregion("maincpu")->base(); membank("bank1")->configure_entries(0, 2, &ROM[0x10000], 0x2000); #if 0 /* character ROM hack to show a white line on the opponent side */ uint8_t *ROM = memregion("gfx2")->base(); int adr = 0x10 * 0x022b; ROM[adr + 0x000a] = 0x00; ROM[adr + 0x000b] = 0x00; ROM[adr + 0x400a] = 0x00; ROM[adr + 0x400b] = 0x00; #endif m_pix_color[0] = 0x000; m_pix_color[1] = 0x1e3; m_pix_color[2] = 0x16c; m_pix_color[3] = 0x1ec; } /***************************************************************************/ READ8_MEMBER(fortyl_state::snd_flag_r) { return (m_soundlatch2->pending_r() ? 2 : 0) | 0xfd; } /***************************************************************************/ void fortyl_state::_40love_map(address_map &map) { map(0x0000, 0x7fff).rom(); map(0x8000, 0x87ff).ram(); /* M5517P on main board */ map(0x8800, 0x8800).rw(m_bmcu, FUNC(taito68705_mcu_device::data_r), FUNC(taito68705_mcu_device::data_w)); map(0x8801, 0x8801).rw(this, FUNC(fortyl_state::fortyl_mcu_status_r), FUNC(fortyl_state::pix1_mcu_w)); //pixel layer related map(0x8802, 0x8802).w(this, FUNC(fortyl_state::bank_select_w)); map(0x8803, 0x8803).rw(this, FUNC(fortyl_state::pix2_r), FUNC(fortyl_state::pix2_w)); //pixel layer related map(0x8804, 0x8804).r(m_soundlatch2, FUNC(generic_latch_8_device::read)); map(0x8804, 0x8804).w("soundlatch", FUNC(generic_latch_8_device::write)); map(0x8805, 0x8805).r(this, FUNC(fortyl_state::snd_flag_r)).nopw(); /*sound_reset*/ //???? map(0x8807, 0x8807).nopr(); /* unknown */ map(0x8808, 0x8808).portr("DSW3"); map(0x8809, 0x8809).portr("P1"); map(0x880a, 0x880a).portr("SYSTEM"); map(0x880b, 0x880b).portr("P2"); map(0x880c, 0x880c).portr("DSW1").w(this, FUNC(fortyl_state::fortyl_pixram_sel_w)); /* pixram bank select */ map(0x880d, 0x880d).portr("DSW2").nopw(); /* unknown */ map(0x9000, 0x97ff).rw(this, FUNC(fortyl_state::fortyl_bg_videoram_r), FUNC(fortyl_state::fortyl_bg_videoram_w)).share("videoram"); /* #1 M5517P on video board */ map(0x9800, 0x983f).ram().share("video_ctrl"); /* video control area */ map(0x9840, 0x987f).ram().share("spriteram"); /* sprites part 1 */ map(0x9880, 0x98bf).rw(this, FUNC(fortyl_state::fortyl_bg_colorram_r), FUNC(fortyl_state::fortyl_bg_colorram_w)).share("colorram"); /* background attributes (2 bytes per line) */ map(0x98c0, 0x98ff).ram().share("spriteram2");/* sprites part 2 */ map(0xa000, 0xbfff).bankr("bank1"); //AM_RANGE(0xbf00, 0xbfff) writes here when zooms-in/out, left-over or pixel line clearance? map(0xc000, 0xffff).rw(this, FUNC(fortyl_state::fortyl_pixram_r), FUNC(fortyl_state::fortyl_pixram_w)); /* banked pixel layer */ } void fortyl_state::undoukai_map(address_map &map) { map(0x0000, 0x7fff).rom(); map(0x8000, 0x9fff).bankr("bank1"); map(0xa000, 0xa7ff).ram().share("mcu_ram"); /* M5517P on main board */ map(0xa800, 0xa800).rw(m_bmcu, FUNC(taito68705_mcu_device::data_r), FUNC(taito68705_mcu_device::data_w)); map(0xa801, 0xa801).rw(this, FUNC(fortyl_state::fortyl_mcu_status_r), FUNC(fortyl_state::pix1_w)); //pixel layer related map(0xa802, 0xa802).w(this, FUNC(fortyl_state::bank_select_w)); map(0xa803, 0xa803).rw(this, FUNC(fortyl_state::pix2_r), FUNC(fortyl_state::pix2_w)); //pixel layer related map(0xa804, 0xa804).r(m_soundlatch2, FUNC(generic_latch_8_device::read)); map(0xa804, 0xa804).w("soundlatch", FUNC(generic_latch_8_device::write)); map(0xa805, 0xa805).r(this, FUNC(fortyl_state::snd_flag_r)).nopw(); /*sound_reset*/ //???? map(0xa807, 0xa807).nopr().nopw(); /* unknown */ map(0xa808, 0xa808).portr("DSW3"); map(0xa809, 0xa809).portr("P1"); map(0xa80a, 0xa80a).portr("SYSTEM"); map(0xa80b, 0xa80b).portr("P2"); map(0xa80c, 0xa80c).portr("DSW1").w(this, FUNC(fortyl_state::fortyl_pixram_sel_w)); /* pixram bank select */ map(0xa80d, 0xa80d).portr("DSW2").nopw(); /* unknown */ map(0xb000, 0xb7ff).rw(this, FUNC(fortyl_state::fortyl_bg_videoram_r), FUNC(fortyl_state::fortyl_bg_videoram_w)).share("videoram"); /* #1 M5517P on video board */ map(0xb800, 0xb83f).ram().share("video_ctrl"); /* video control area */ map(0xb840, 0xb87f).ram().share("spriteram"); /* sprites part 1 */ map(0xb880, 0xb8bf).rw(this, FUNC(fortyl_state::fortyl_bg_colorram_r), FUNC(fortyl_state::fortyl_bg_colorram_w)).share("colorram"); /* background attributes (2 bytes per line) */ map(0xb8e0, 0xb8ff).ram().share("spriteram2"); /* sprites part 2 */ map(0xc000, 0xffff).rw(this, FUNC(fortyl_state::fortyl_pixram_r), FUNC(fortyl_state::fortyl_pixram_w)); } WRITE8_MEMBER(fortyl_state::sound_control_0_w) { m_snd_ctrl0 = data & 0xff; // popmessage("SND0 0=%02x 1=%02x 2=%02x 3=%02x", m_snd_ctrl0, m_snd_ctrl1, m_snd_ctrl2, m_snd_ctrl3); /* this definitely controls main melody voice on 2'-1 and 4'-1 outputs */ for(int i=0;i<4;i++) m_ta7630->set_channel_volume(m_msm,i,m_snd_ctrl0 >> 4); //m_msm->set_output_gain(0, m_vol_ctrl[(m_snd_ctrl0 >> 4) & 15] / 100.0); /* group1 from msm5232 */ //m_msm->set_output_gain(1, m_vol_ctrl[(m_snd_ctrl0 >> 4) & 15] / 100.0); /* group1 from msm5232 */ //m_msm->set_output_gain(2, m_vol_ctrl[(m_snd_ctrl0 >> 4) & 15] / 100.0); /* group1 from msm5232 */ //m_msm->set_output_gain(3, m_vol_ctrl[(m_snd_ctrl0 >> 4) & 15] / 100.0); /* group1 from msm5232 */ } WRITE8_MEMBER(fortyl_state::sound_control_1_w) { m_snd_ctrl1 = data & 0xff; // popmessage("SND1 0=%02x 1=%02x 2=%02x 3=%02x", m_snd_ctrl0, m_snd_ctrl1, m_snd_ctrl2, m_snd_ctrl3); for(int i=0;i<4;i++) m_ta7630->set_channel_volume(m_msm,i+4,m_snd_ctrl1 >> 4); //m_msm->set_output_gain(4, m_vol_ctrl[(m_snd_ctrl1 >> 4) & 15] / 100.0); /* group2 from msm5232 */ //m_msm->set_output_gain(5, m_vol_ctrl[(m_snd_ctrl1 >> 4) & 15] / 100.0); /* group2 from msm5232 */ //m_msm->set_output_gain(6, m_vol_ctrl[(m_snd_ctrl1 >> 4) & 15] / 100.0); /* group2 from msm5232 */ //m_msm->set_output_gain(7, m_vol_ctrl[(m_snd_ctrl1 >> 4) & 15] / 100.0); /* group2 from msm5232 */ } WRITE8_MEMBER(fortyl_state::sound_control_2_w) { m_snd_ctrl2 = data & 0xff; // popmessage("SND2 0=%02x 1=%02x 2=%02x 3=%02x", m_snd_ctrl0, m_snd_ctrl1, m_snd_ctrl2, m_snd_ctrl3); m_ta7630->set_device_volume(m_ay,m_snd_ctrl2 >> 4); } WRITE8_MEMBER(fortyl_state::sound_control_3_w)/* unknown */ { m_snd_ctrl3 = data & 0xff; // popmessage("SND3 0=%02x 1=%02x 2=%02x 3=%02x", m_snd_ctrl0, m_snd_ctrl1, m_snd_ctrl2, m_snd_ctrl3); } void fortyl_state::sound_map(address_map &map) { map(0x0000, 0xbfff).rom(); map(0xc000, 0xc7ff).ram(); map(0xc800, 0xc801).w(m_ay, FUNC(ay8910_device::address_data_w)); map(0xca00, 0xca0d).w(m_msm, FUNC(msm5232_device::write)); map(0xcc00, 0xcc00).w(this, FUNC(fortyl_state::sound_control_0_w)); map(0xce00, 0xce00).w(this, FUNC(fortyl_state::sound_control_1_w)); map(0xd800, 0xd800).r("soundlatch", FUNC(generic_latch_8_device::read)); map(0xd800, 0xd800).w(m_soundlatch2, FUNC(generic_latch_8_device::write)); map(0xda00, 0xda00).nopr(); // unknown read map(0xda00, 0xda00).w("soundnmi", FUNC(input_merger_device::in_set<1>)); // enable NMI map(0xdc00, 0xdc00).w("soundnmi", FUNC(input_merger_device::in_clear<1>)); // disable NMI map(0xde00, 0xde00).nopr().w("dac", FUNC(dac_byte_interface::write)); /* signed 8-bit DAC - unknown read */ map(0xe000, 0xefff).rom(); /* space for diagnostics ROM */ } static INPUT_PORTS_START( 40love ) PORT_START("DSW1") PORT_DIPUNKNOWN_DIPLOC( 0x01, 0x01, "SW1:1" ) PORT_DIPUNKNOWN_DIPLOC( 0x02, 0x02, "SW1:2" ) PORT_DIPNAME( 0x04, 0x04, DEF_STR( Free_Play ) ) PORT_DIPLOCATION("SW1:3") PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x18, 0x18, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:4,5") PORT_DIPSETTING( 0x00, "1" ) PORT_DIPSETTING( 0x18, "3" ) PORT_DIPSETTING( 0x10, "5" ) PORT_DIPSETTING( 0x08, "6" ) PORT_DIPUNKNOWN_DIPLOC( 0x20, 0x20, "SW1:6" ) PORT_DIPNAME( 0x40, 0x00, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:7") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x40, DEF_STR( On ) ) PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:8") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x80, DEF_STR( Cocktail ) ) PORT_START("DSW2") /* All OK */ PORT_DIPNAME( 0x0f, 0x00, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW2:1,2,3,4") PORT_DIPSETTING( 0x0f, DEF_STR( 9C_1C ) ) PORT_DIPSETTING( 0x0e, DEF_STR( 8C_1C ) ) PORT_DIPSETTING( 0x0d, DEF_STR( 7C_1C ) ) PORT_DIPSETTING( 0x0c, DEF_STR( 6C_1C ) ) PORT_DIPSETTING( 0x0b, DEF_STR( 5C_1C ) ) PORT_DIPSETTING( 0x0a, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0x09, DEF_STR( 3C_1C ) ) PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x01, DEF_STR( 1C_2C ) ) PORT_DIPSETTING( 0x02, DEF_STR( 1C_3C ) ) PORT_DIPSETTING( 0x03, DEF_STR( 1C_4C ) ) PORT_DIPSETTING( 0x04, DEF_STR( 1C_5C ) ) PORT_DIPSETTING( 0x05, DEF_STR( 1C_6C ) ) PORT_DIPSETTING( 0x06, DEF_STR( 1C_7C ) ) PORT_DIPSETTING( 0x07, DEF_STR( 1C_8C ) ) PORT_DIPNAME( 0xf0, 0x00, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW2:5,6,7,8") PORT_DIPSETTING( 0xf0, DEF_STR( 9C_1C ) ) PORT_DIPSETTING( 0xe0, DEF_STR( 8C_1C ) ) PORT_DIPSETTING( 0xd0, DEF_STR( 7C_1C ) ) PORT_DIPSETTING( 0xc0, DEF_STR( 6C_1C ) ) PORT_DIPSETTING( 0xb0, DEF_STR( 5C_1C ) ) PORT_DIPSETTING( 0xa0, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0x90, DEF_STR( 3C_1C ) ) PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) ) PORT_DIPSETTING( 0x20, DEF_STR( 1C_3C ) ) PORT_DIPSETTING( 0x30, DEF_STR( 1C_4C ) ) PORT_DIPSETTING( 0x40, DEF_STR( 1C_5C ) ) PORT_DIPSETTING( 0x50, DEF_STR( 1C_6C ) ) PORT_DIPSETTING( 0x60, DEF_STR( 1C_7C ) ) PORT_DIPSETTING( 0x70, DEF_STR( 1C_8C ) ) PORT_START("DSW3") PORT_DIPUNKNOWN_DIPLOC( 0x01, 0x01, "SW3:1" ) PORT_DIPUNKNOWN_DIPLOC( 0x02, 0x02, "SW3:2" ) PORT_DIPUNKNOWN_DIPLOC( 0x04, 0x04, "SW3:3" ) PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "SW3:4" ) PORT_DIPNAME( 0x10, 0x10, "Coinage Display" ) PORT_DIPLOCATION("SW3:5") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x10, DEF_STR( On ) ) PORT_DIPNAME( 0x20, 0x20, "Year Display" ) PORT_DIPLOCATION("SW3:6") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x20, DEF_STR( On ) ) PORT_DIPNAME( 0x40, 0x40, "Player Always Wins (Cheat)") PORT_DIPLOCATION("SW3:7") PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x80, 0x80, "Coin Slots" ) PORT_DIPLOCATION("SW3:8") PORT_DIPSETTING( 0x00, "1" ) PORT_DIPSETTING( 0x80, "2" ) PORT_START("SYSTEM") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x04, IP_ACTIVE_HIGH,IPT_COIN1 ) PORT_BIT( 0x08, IP_ACTIVE_HIGH,IPT_COIN2 ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_TILT ) PORT_START("P1") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("P1 Stance Change Button") PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("P1 Lob Button") PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 Stroke Button") PORT_START("P2") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_COCKTAIL PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_COCKTAIL PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_COCKTAIL PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY PORT_COCKTAIL PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Stance Change Button") PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Lob Button") PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Stroke Button") INPUT_PORTS_END static INPUT_PORTS_START( undoukai ) PORT_INCLUDE( 40love ) PORT_MODIFY("DSW1") PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:1,2") PORT_DIPSETTING( 0x00, "4 (Hard)" ) PORT_DIPSETTING( 0x01, "3" ) PORT_DIPSETTING( 0x02, "2" ) PORT_DIPSETTING( 0x03, "1 (Easy)" ) PORT_DIPNAME( 0x08, 0x08, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:4") PORT_DIPSETTING( 0x08, "1" ) PORT_DIPSETTING( 0x00, "2" ) PORT_DIPNAME( 0x10, 0x10, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW1:5") PORT_DIPSETTING( 0x10, DEF_STR( None ) ) PORT_DIPSETTING( 0x00, "100000 200000" ) PORT_DIPNAME( 0x20, 0x20, DEF_STR( Players ) ) PORT_DIPLOCATION("SW1:6") PORT_DIPSETTING( 0x20, "1 Or 2" ) PORT_DIPSETTING( 0x00, "1 To 4" ) PORT_DIPNAME( 0x40, 0x40, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:7") PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_MODIFY("DSW3") /* & START */ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_START1 ) PORT_DIPNAME( 0x04, 0x04, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW3:3") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x04, DEF_STR( On ) ) PORT_DIPNAME( 0x08, 0x08, "Freeze" ) PORT_DIPLOCATION("SW3:4") PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x40, 0x40, "No Qualify (Cheat)") PORT_DIPLOCATION("SW3:7") PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_MODIFY("SYSTEM") PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_MODIFY("P1") PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START3 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START4 ) PORT_MODIFY("P2") PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(3) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(3) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(4) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(4) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(4) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END static const gfx_layout char_layout = { 8,8, 0x400, 4, { 2*0x2000*8+0, 2*0x2000*8+4, 0,4 }, { 3,2,1,0, 11,10,9,8 }, { 0*8,2*8,4*8,6*8,8*8,10*8,12*8,14*8 }, 16*8 }; static const gfx_layout sprite_layout = { 16,16, RGN_FRAC(1,2), 4, { RGN_FRAC(1,2)+0, RGN_FRAC(1,2)+4, 0,4 }, { 3,2,1,0, 11,10,9,8, 16*8+3, 16*8+2, 16*8+1, 16*8+0, 16*8+11, 16*8+10, 16*8+9, 16*8+8 }, { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16, 16*16, 17*16, 18*16, 19*16, 20*16, 21*16, 22*16, 23*16 }, 64*8 }; static GFXDECODE_START( gfx_40love ) GFXDECODE_ENTRY( "gfx2", 0, char_layout, 0, 64 ) GFXDECODE_ENTRY( "gfx1", 0, sprite_layout, 0, 64 ) GFXDECODE_END /*******************************************************************************/ MACHINE_START_MEMBER(fortyl_state,40love) { /* video */ save_item(NAME(m_pix1)); save_item(NAME(m_pix2)); save_item(NAME(m_color_bank)); save_item(NAME(m_screen_disable)); /* sound */ save_item(NAME(m_vol_ctrl)); save_item(NAME(m_snd_ctrl0)); save_item(NAME(m_snd_ctrl1)); save_item(NAME(m_snd_ctrl2)); save_item(NAME(m_snd_ctrl3)); } MACHINE_RESET_MEMBER(fortyl_state,common) { //MACHINE_RESET_CALL_MEMBER(ta7630); /* video */ m_pix1 = 0; m_pix2[0] = 0; m_pix2[1] = 0; m_color_bank = false; /* sound */ m_snd_ctrl0 = 0; m_snd_ctrl1 = 0; m_snd_ctrl2 = 0; m_snd_ctrl3 = 0; } MACHINE_RESET_MEMBER(fortyl_state,40love) { MACHINE_RESET_CALL_MEMBER(common); } MACHINE_CONFIG_START(fortyl_state::_40love) /* basic machine hardware */ MCFG_DEVICE_ADD("maincpu",Z80,8000000/2) /* OK */ MCFG_DEVICE_PROGRAM_MAP(_40love_map) MCFG_DEVICE_VBLANK_INT_DRIVER("screen", fortyl_state, irq0_line_hold) MCFG_DEVICE_ADD("audiocpu",Z80,8000000/2) /* OK */ MCFG_DEVICE_PROGRAM_MAP(sound_map) MCFG_DEVICE_PERIODIC_INT_DRIVER(fortyl_state, irq0_line_hold, 2*60) /* source/number of IRQs is unknown */ MCFG_GENERIC_LATCH_8_ADD("soundlatch") MCFG_GENERIC_LATCH_DATA_PENDING_CB(WRITELINE("soundnmi", input_merger_device, in_w<0>)) MCFG_GENERIC_LATCH_8_ADD("soundlatch2") MCFG_INPUT_MERGER_ALL_HIGH("soundnmi") MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("audiocpu", INPUT_LINE_NMI)) MCFG_DEVICE_ADD("bmcu", TAITO68705_MCU, 18432000/6) /* OK */ MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* high interleave to ensure proper synchronization of CPUs */ MCFG_MACHINE_START_OVERRIDE(fortyl_state,40love) MCFG_MACHINE_RESET_OVERRIDE(fortyl_state,40love) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(128,128+255, 2*8, 30*8-1) MCFG_SCREEN_UPDATE_DRIVER(fortyl_state, screen_update_fortyl) MCFG_SCREEN_PALETTE("palette") MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_40love) MCFG_PALETTE_ADD_RRRRGGGGBBBB_PROMS("palette", "proms", 1024) /* sound hardware */ SPEAKER(config, "speaker").front_center(); MCFG_TA7630_ADD("ta7630") MCFG_DEVICE_ADD("aysnd", AY8910, 2000000) MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(*this, fortyl_state, sound_control_2_w)) MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(*this, fortyl_state, sound_control_3_w)) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.1) MCFG_DEVICE_ADD("msm", MSM5232, 8000000/4) MCFG_MSM5232_SET_CAPACITORS(1.0e-6, 1.0e-6, 1.0e-6, 1.0e-6, 1.0e-6, 1.0e-6, 1.0e-6, 1.0e-6) /* 1.0 uF capacitors (verified on real PCB) */ MCFG_SOUND_ROUTE(0, "speaker", 1.0) // pin 28 2'-1 MCFG_SOUND_ROUTE(1, "speaker", 1.0) // pin 29 4'-1 MCFG_SOUND_ROUTE(2, "speaker", 1.0) // pin 30 8'-1 MCFG_SOUND_ROUTE(3, "speaker", 1.0) // pin 31 16'-1 MCFG_SOUND_ROUTE(4, "speaker", 1.0) // pin 36 2'-2 MCFG_SOUND_ROUTE(5, "speaker", 1.0) // pin 35 4'-2 MCFG_SOUND_ROUTE(6, "speaker", 1.0) // pin 34 8'-2 MCFG_SOUND_ROUTE(7, "speaker", 1.0) // pin 33 16'-2 // pin 1 SOLO 8' not mapped // pin 2 SOLO 16' not mapped // pin 22 Noise Output not mapped MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.2) // unknown DAC MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0) MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT) MACHINE_CONFIG_END MACHINE_CONFIG_START(fortyl_state::undoukai) /* basic machine hardware */ MCFG_DEVICE_ADD("maincpu",Z80,8000000/2) MCFG_DEVICE_PROGRAM_MAP(undoukai_map) MCFG_DEVICE_VBLANK_INT_DRIVER("screen", fortyl_state, irq0_line_hold) MCFG_DEVICE_ADD("audiocpu",Z80,8000000/2) MCFG_DEVICE_PROGRAM_MAP(sound_map) MCFG_DEVICE_PERIODIC_INT_DRIVER(fortyl_state, irq0_line_hold, 2*60) /* source/number of IRQs is unknown */ MCFG_GENERIC_LATCH_8_ADD("soundlatch") MCFG_GENERIC_LATCH_DATA_PENDING_CB(WRITELINE("soundnmi", input_merger_device, in_w<0>)) MCFG_GENERIC_LATCH_8_ADD("soundlatch2") MCFG_INPUT_MERGER_ALL_HIGH("soundnmi") MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("audiocpu", INPUT_LINE_NMI)) MCFG_DEVICE_ADD("bmcu", TAITO68705_MCU, 18432000/6) MCFG_QUANTUM_TIME(attotime::from_hz(6000)) MCFG_MACHINE_START_OVERRIDE(fortyl_state,40love) MCFG_MACHINE_RESET_OVERRIDE(fortyl_state,40love) /* init machine */ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(128,128+255, 2*8, 30*8-1) MCFG_SCREEN_UPDATE_DRIVER(fortyl_state, screen_update_fortyl) MCFG_SCREEN_PALETTE("palette") MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_40love) MCFG_PALETTE_ADD_RRRRGGGGBBBB_PROMS("palette", "proms", 1024) /* sound hardware */ SPEAKER(config, "speaker").front_center(); MCFG_TA7630_ADD("ta7630") MCFG_DEVICE_ADD("aysnd", AY8910, 2000000) MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(*this, fortyl_state, sound_control_2_w)) MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(*this, fortyl_state, sound_control_3_w)) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.1) MCFG_DEVICE_ADD("msm", MSM5232, 8000000/4) MCFG_MSM5232_SET_CAPACITORS(1.0e-6, 1.0e-6, 1.0e-6, 1.0e-6, 1.0e-6, 1.0e-6, 1.0e-6, 1.0e-6) /* 1.0 uF capacitors (verified on real PCB) */ MCFG_SOUND_ROUTE(0, "speaker", 1.0) // pin 28 2'-1 MCFG_SOUND_ROUTE(1, "speaker", 1.0) // pin 29 4'-1 MCFG_SOUND_ROUTE(2, "speaker", 1.0) // pin 30 8'-1 MCFG_SOUND_ROUTE(3, "speaker", 1.0) // pin 31 16'-1 MCFG_SOUND_ROUTE(4, "speaker", 1.0) // pin 36 2'-2 MCFG_SOUND_ROUTE(5, "speaker", 1.0) // pin 35 4'-2 MCFG_SOUND_ROUTE(6, "speaker", 1.0) // pin 34 8'-2 MCFG_SOUND_ROUTE(7, "speaker", 1.0) // pin 33 16'-2 // pin 1 SOLO 8' not mapped // pin 2 SOLO 16' not mapped // pin 22 Noise Output not mapped MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.2) // unknown DAC MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0) MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT) MACHINE_CONFIG_END /*******************************************************************************/ ROM_START( 40love ) ROM_REGION( 0x14000, "maincpu", 0 ) /* Z80 main CPU */ ROM_LOAD( "a30-19.ic1", 0x00000, 0x2000, CRC(7baca598) SHA1(b1767f5af9b3f484afb4423afe1f9c15db92c2ac) ) ROM_LOAD( "a30-20.ic2", 0x02000, 0x2000, CRC(a7b4f2cc) SHA1(67f570874fa0feb21f2a9a0712fadf78ebaad91c) ) ROM_LOAD( "a30-21.ic3", 0x04000, 0x2000, CRC(49a372e8) SHA1(7c15fac65369d2e90b432c0f5c8e1d7295c379d1) ) ROM_LOAD( "a30-22.ic4", 0x06000, 0x2000, CRC(0c06d2b3) SHA1(e5b0c8e57b0a6d131496e168023e12bacc17e93e) ) ROM_LOAD( "a30-23.ic5", 0x10000, 0x2000, CRC(6dcd186e) SHA1(c8d88a2f35ba77ea822bdd8133033c8eb0bb5f72) ) /* banked at 0xa000 */ ROM_LOAD( "a30-24.ic6", 0x12000, 0x2000, CRC(590c20c8) SHA1(93689d6a299dfbe33ffec42d13378091d8589b34) ) /* banked at 0xa000 */ ROM_REGION( 0x10000, "audiocpu", 0 ) /* Z80 sound CPU */ ROM_LOAD( "a30-08.u08", 0x0000, 0x2000, CRC(2fc42ee1) SHA1(b56e5f9acbcdc476252e188f41ad7249dba6f8e1) ) ROM_LOAD( "a30-09.u09", 0x2000, 0x2000, CRC(3a75abce) SHA1(ad2df26789d38196c0677c22ab8f176e99604b18) ) ROM_LOAD( "a30-10.u10", 0x4000, 0x2000, CRC(393c4b5b) SHA1(a8e1dd5c33e929bc832cccc13b85ecd13fff1eb2) ) ROM_LOAD( "a30-11.u37", 0x6000, 0x2000, CRC(11b2c6d2) SHA1(d55690512a37c4df2386a845e0cfb14f8052295b) ) ROM_LOAD( "a30-12.u38", 0x8000, 0x2000, CRC(f7afd475) SHA1(dd09d5ca7fec5e0454f9efb8ebc722561010f124) ) ROM_LOAD( "a30-13.u39", 0xa000, 0x2000, CRC(e806630f) SHA1(09022aae88ea0171a0aacf3260fa3a95e8faeb21) ) ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 2k for the microcontroller */ ROM_LOAD( "a30-14" , 0x0000, 0x0800, CRC(c4690279) SHA1(60bc77e03b9be434bb97a374a2fedeb8d049a660) ) ROM_REGION( 0x8000, "gfx1", 0 ) ROM_LOAD( "a30-25.u22", 0x0000, 0x2000, CRC(15e594cf) SHA1(d2d506a55f6ac2c191e5d5b3127021cde366c71c) ) ROM_LOAD( "a30-26.u23", 0x2000, 0x2000, BAD_DUMP CRC(3a45a205) SHA1(0939ecaabbb9be2a0719ef252e3f244299734ba6) ) /* this actually seems good, but we need to find another one to verify */ ROM_LOAD( "a30-27.u24", 0x4000, 0x2000, CRC(57c67f6f) SHA1(293e5bfa7c859886abd70f78fe2e4b13a3fce3f5) ) ROM_LOAD( "a30-28.u25", 0x6000, 0x2000, CRC(d581d067) SHA1(ce132cf2503917f0846b838c6ce4ad4183181bf9) ) ROM_REGION( 0x8000, "gfx2", 0 ) ROM_LOAD( "a30-29.u62", 0x0000, 0x2000, CRC(02deaf40) SHA1(fb424a40bd9d959664a6d1ddf477fc16e694b9fa) ) ROM_LOAD( "a30-30.u63", 0x2000, 0x2000, CRC(439f3731) SHA1(4661149baa8472989cc8ac85c51e55df69957d99) ) ROM_LOAD( "a30-31.u64", 0x4000, 0x2000, CRC(7ed70e81) SHA1(f90a3ce701ebe746803cf01ea1f6725c552007de) ) ROM_LOAD( "a30-32.u65", 0x6000, 0x2000, CRC(0434655b) SHA1(261c5e60e830967564c053dc1d40fbf1e7194fc8) ) ROM_REGION( 0x1000, "proms", 0 ) ROM_LOAD( "a30-15.u03", 0x0000, 0x0400, CRC(55e38cc7) SHA1(823a6d7f29eadf5d12702d782d4297b0d4c65a0e) ) /* red */ ROM_LOAD( "a30-16.u01", 0x0400, 0x0400, CRC(13997e20) SHA1(9fae1cf633409a88263dc66a17b1c2eeccd05f4f) ) /* green */ ROM_LOAD( "a30-17.u02", 0x0800, 0x0400, CRC(5031f2f3) SHA1(1836d82fdc9f39cb318a791af2a935c27baabfd7) ) /* blue */ ROM_LOAD( "a30-18.u13", 0x0c00, 0x0400, CRC(78697c0f) SHA1(31382ed4c0d44024f7f57a9de6407527f4d5b0d1) ) /* ??? */ ROM_END ROM_START( 40lovej ) ROM_REGION( 0x14000, "maincpu", 0 ) /* Z80 main CPU */ ROM_LOAD( "a30_01.70", 0x000000, 0x004000, CRC(1b89829e) SHA1(d875a4e3586fd9fb2e354e4353c9144ad68ce620) ) ROM_LOAD( "a30_02.71", 0x004000, 0x004000, CRC(1468e71e) SHA1(e251ddf42ab51e9c391c213f54b709b71a3f1519) ) ROM_LOAD( "a30_03.72", 0x010000, 0x004000, CRC(dbc0049d) SHA1(1fca22ca0794564bbd1f946afb644fef0342acca) ) ROM_REGION( 0x10000, "audiocpu", ROMREGION_ERASEFF ) /* Z80 sound CPU */ // not in the provided set, identical? ROM_LOAD( "a30-08.u08", 0x0000, 0x2000, BAD_DUMP CRC(2fc42ee1) SHA1(b56e5f9acbcdc476252e188f41ad7249dba6f8e1) ) ROM_LOAD( "a30-09.u09", 0x2000, 0x2000, BAD_DUMP CRC(3a75abce) SHA1(ad2df26789d38196c0677c22ab8f176e99604b18) ) ROM_LOAD( "a30-10.u10", 0x4000, 0x2000, BAD_DUMP CRC(393c4b5b) SHA1(a8e1dd5c33e929bc832cccc13b85ecd13fff1eb2) ) ROM_LOAD( "a30-11.u37", 0x6000, 0x2000, BAD_DUMP CRC(11b2c6d2) SHA1(d55690512a37c4df2386a845e0cfb14f8052295b) ) ROM_LOAD( "a30-12.u38", 0x8000, 0x2000, BAD_DUMP CRC(f7afd475) SHA1(dd09d5ca7fec5e0454f9efb8ebc722561010f124) ) ROM_LOAD( "a30-13.u39", 0xa000, 0x2000, BAD_DUMP CRC(e806630f) SHA1(09022aae88ea0171a0aacf3260fa3a95e8faeb21) ) ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 2k for the microcontroller */ // taken from World set, the provided one causes bad hw message ROM_LOAD( "a30-14" , 0x0000, 0x0800, BAD_DUMP CRC(c4690279) SHA1(60bc77e03b9be434bb97a374a2fedeb8d049a660) ) // ROM_LOAD( "a30_14", 0x000000, 0x000800, BAD_DUMP CRC(a4f770ce) SHA1(868e98528e8824e7329e9a298603e456bbc1f1f0) ) ROM_REGION( 0x8000, "gfx1", 0 ) ROM_LOAD( "a30_04.18", 0x000000, 0x004000, CRC(529a7489) SHA1(cf3fa83f16e2e62c1a4aa74b00080f1e167865a6) ) ROM_LOAD( "a30_05.19", 0x004000, 0x004000, CRC(7017e5f1) SHA1(fc614fd41109a9a6236ed4a331eda74e5d49b946) ) ROM_REGION( 0x8000, "gfx2", 0 ) ROM_LOAD( "a30_06.59", 0x000000, 0x004000, CRC(f744ea8e) SHA1(0bf6deabfac47237347af810332bc3716e3a26f0) ) ROM_LOAD( "a30_07.60", 0x004000, 0x004000, CRC(b2af1359) SHA1(6a21e38cfb65d52b7e1209101f0dd497f9a71f46) ) ROM_REGION( 0x1000, "proms", 0 ) // not provided ROM_LOAD( "a30-15.u03", 0x0000, 0x0400, BAD_DUMP CRC(55e38cc7) SHA1(823a6d7f29eadf5d12702d782d4297b0d4c65a0e) ) /* red */ ROM_LOAD( "a30-16.u01", 0x0400, 0x0400, BAD_DUMP CRC(13997e20) SHA1(9fae1cf633409a88263dc66a17b1c2eeccd05f4f) ) /* green */ ROM_LOAD( "a30-17.u02", 0x0800, 0x0400, BAD_DUMP CRC(5031f2f3) SHA1(1836d82fdc9f39cb318a791af2a935c27baabfd7) ) /* blue */ ROM_LOAD( "a30-18.u13", 0x0c00, 0x0400, BAD_DUMP CRC(78697c0f) SHA1(31382ed4c0d44024f7f57a9de6407527f4d5b0d1) ) /* ??? */ ROM_END ROM_START( fieldday ) ROM_REGION( 0x14000, "maincpu", 0 ) /* Z80 main CPU */ ROM_LOAD( "a17_44.bin", 0x00000, 0x2000, CRC(d59812e1) SHA1(f3e7e2f09fba5964c92813cd652aa093fe3e4415) ) ROM_LOAD( "a17_45.bin", 0x02000, 0x2000, CRC(828bfb9a) SHA1(0be24ec076b715d65e9c8e01e3be76628e4f60ed) ) ROM_LOAD( "a23_05.bin", 0x04000, 0x2000, CRC(2670cad3) SHA1(8ba3a6b788fa4e997f9153226f6f13b32fc33124) ) ROM_LOAD( "a23_06.bin", 0x06000, 0x2000, CRC(737ce7de) SHA1(52a46fe14978e217de81dcd529d16d62fb5a4e46) ) ROM_LOAD( "a23_07.bin", 0x10000, 0x2000, CRC(ee2fb306) SHA1(f2b0a6af279b459fe61d56ba4d36d519318376fb) ) ROM_LOAD( "a23_08.bin", 0x12000, 0x2000, CRC(1ed2f1ad) SHA1(e3cf954dd2c34759147d0c85da7a716a8eb0e820) ) ROM_COPY( "maincpu" , 0x10000, 0x8000, 0x2000 ) /* to avoid 'bank bug' */ ROM_REGION( 0x10000, "audiocpu", 0 ) /* Z80 sound CPU */ ROM_LOAD( "a17_24.bin", 0x0000, 0x2000, CRC(6bac6b7f) SHA1(eb95192204a868737d609b789312ac37c31d3071) ) ROM_LOAD( "a17_25.bin", 0x2000, 0x2000, CRC(570b90b1) SHA1(2a8c3bebd15655ffbfeaf40c2db90292afbb11ef) ) ROM_LOAD( "a17_26.bin", 0x4000, 0x2000, CRC(7a8ea7f4) SHA1(1d9d2b54645266f95aa89cdbec6f82d4ac20d6e4) ) ROM_LOAD( "a17_27.bin", 0x6000, 0x2000, CRC(e10594d9) SHA1(3df15b8b0c7af9fed93eca27237e15e6a7a8f835) ) ROM_LOAD( "a17_28.bin", 0x8000, 0x2000, CRC(1a4d1dae) SHA1(fbc3c55ad9f15ead432c136eec648fe22e523ea7) ) ROM_LOAD( "a17_29.bin", 0xa000, 0x2000, CRC(3c540007) SHA1(549e7ff260214c538913ff548dcb088987845911) ) ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 2k for the microcontroller */ ROM_LOAD( "a17_14.bin", 0x0000, 0x0800, CRC(a686894d) SHA1(0578747a1869db98ee1962822491103f3f082cba) ) ROM_REGION( 0x8000, "gfx1", 0 ) ROM_LOAD( "a17_36.bin", 0x0000, 0x2000, CRC(e3dd51f7) SHA1(95a97ea925c5bc7bdc00887e6d17d817b36befc4) ) ROM_LOAD( "a17_37.bin", 0x2000, 0x2000, CRC(1623f71f) SHA1(f5df7498b9a08e82ea11cb1b1fcdabca48cbf33a) ) ROM_LOAD( "a17_38.bin", 0x4000, 0x2000, CRC(ca9f74db) SHA1(a002f1dfa9497793bfb18292e7a71ae12d70fb88) ) ROM_LOAD( "a17_39.bin", 0x6000, 0x2000, CRC(fb6c667c) SHA1(da56be8d997db199588ee22fae30cc6d87e80704) ) ROM_REGION( 0x8000, "gfx2", 0 ) ROM_LOAD( "a23_09.bin", 0x0000, 0x2000, CRC(1e430be5) SHA1(9296e1a0d820bb218578d55b739b4fc5fdafb125) ) ROM_LOAD( "a23_10.bin", 0x2000, 0x2000, CRC(ee2e54f0) SHA1(0a92fa39696a8005f9441131b6d98205b7c26e7b) ) ROM_LOAD( "a23_11.bin", 0x4000, 0x2000, CRC(6d37f15c) SHA1(3eb9a2e230d88f2871e6972a01d8e7cc7db1b123) ) ROM_LOAD( "a23_12.bin", 0x6000, 0x2000, CRC(86da42d2) SHA1(aa79cd954c96217ca2daf37addac168f8cca24f9) ) ROM_REGION( 0x1000, "proms", 0 ) ROM_LOAD( "a17-15.10v", 0x0000, 0x0400, CRC(9df472b7) SHA1(0cd9dd735238daf8e8228ba9481df57fb8925328) ) /* red */ ROM_LOAD( "a17-16.8v", 0x0400, 0x0400, CRC(3bf1ff5f) SHA1(a0453851aefa9acdba4a86aaca8c442cb8550987) ) /* green */ ROM_LOAD( "a17-17.9v", 0x0800, 0x0400, CRC(c42ae956) SHA1(057ce3783305c98622f7dfc0ee7d4882137a2ef8) ) /* blue */ ROM_LOAD( "a17-18.23v", 0x0c00, 0x0400, CRC(3023a1da) SHA1(08ce4c6e99d04b358d66f0588852311d07183619) ) /* ??? */ ROM_END ROM_START( undoukai ) ROM_REGION( 0x14000, "maincpu", 0 ) /* Z80 main CPU */ ROM_LOAD( "a17-01.70c", 0x00000, 0x4000, CRC(6ce324d9) SHA1(9c5207ac897eaae5a6aa1a05a918c9cb58544664) ) ROM_LOAD( "a17-02.71c", 0x04000, 0x4000, CRC(055c7ef1) SHA1(f974bd441b8e3621ac5f8d36104791c97051a97a) ) ROM_LOAD( "a17-03.72c", 0x10000, 0x4000, CRC(9034a5c5) SHA1(bc3dae0dee08b6989275ac220fc76bfe61367154) ) /* banked at 0x8000 */ ROM_COPY( "maincpu" , 0x10000, 0x8000, 0x2000 ) /* to avoid 'bank bug' */ ROM_REGION( 0x10000, "audiocpu", 0 ) /* Z80 sound CPU */ ROM_LOAD( "a17-08.8s", 0x0000, 0x2000, CRC(2545aa0e) SHA1(190ef99890251e1e49b14ffd28f2badb4d0d8fbe) ) ROM_LOAD( "a17-09.9s", 0x2000, 0x2000, CRC(57e2cdbb) SHA1(ae6187d62fb36a37be06040e0fd85e0252cdf750) ) ROM_LOAD( "a17-10.10s", 0x4000, 0x2000, CRC(38a288fe) SHA1(af4979cae59ca2569a3663132451b9b554552a79) ) ROM_LOAD( "a17-11.37s", 0x6000, 0x2000, CRC(036d6969) SHA1(20e03dab14d44bf3c7c6aace3b28b2826581d1c7) ) ROM_LOAD( "a17-12.38s", 0x8000, 0x2000, CRC(cb7e6dcd) SHA1(5286c6d340c1d465caebae5dd7e3d4ff8b7f8f5e) ) ROM_LOAD( "a17-13.39s", 0xa000, 0x2000, CRC(0a40930e) SHA1(8c4b9fa0aed67a3e269c2136ef81791fc8acd1da) ) ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 2k for the microcontroller */ ROM_LOAD( "a17_14.bin", 0x0000, 0x0800, CRC(a686894d) SHA1(0578747a1869db98ee1962822491103f3f082cba) ) ROM_REGION( 0x8000, "gfx1", 0 ) ROM_LOAD( "a17-04.18v", 0x0000, 0x4000, CRC(84dabee2) SHA1(698f12ee4201665988248853dafbf4b16dfc6517) ) ROM_LOAD( "a17-05.19v", 0x4000, 0x4000, CRC(10bf3451) SHA1(23ebb1409c90d225ff5a13ad23d4dff1acaf904a) ) ROM_REGION( 0x8000, "gfx2", 0 ) ROM_LOAD( "a17-06.59v", 0x0000, 0x4000, CRC(50f28ad9) SHA1(001555ad123ac85000999b1aa39c1b2568e26f46) ) ROM_LOAD( "a17-07.60v", 0x4000, 0x4000, CRC(7a4b4238) SHA1(8e58803645e61a7144a659d403f318a8899d36e2) ) ROM_REGION( 0x1000, "proms", 0 ) ROM_LOAD( "a17-15.10v", 0x0000, 0x0400, CRC(9df472b7) SHA1(0cd9dd735238daf8e8228ba9481df57fb8925328) ) /* red */ ROM_LOAD( "a17-16.8v", 0x0400, 0x0400, CRC(3bf1ff5f) SHA1(a0453851aefa9acdba4a86aaca8c442cb8550987) ) /* green */ ROM_LOAD( "a17-17.9v", 0x0800, 0x0400, CRC(c42ae956) SHA1(057ce3783305c98622f7dfc0ee7d4882137a2ef8) ) /* blue */ ROM_LOAD( "a17-18.23v", 0x0c00, 0x0400, CRC(3023a1da) SHA1(08ce4c6e99d04b358d66f0588852311d07183619) ) /* ??? */ ROM_END GAME( 1984, 40love, 0, _40love, 40love, fortyl_state, init_40love, ROT0, "Taito Corporation", "Forty-Love (World)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) GAME( 1984, 40lovej, 40love, _40love, 40love, fortyl_state, init_40love, ROT0, "Taito Corporation", "Forty-Love (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) // several ROMs needs double checking GAME( 1984, fieldday, 0, undoukai, undoukai, fortyl_state, init_undoukai, ROT0, "Taito Corporation", "Field Day", MACHINE_SUPPORTS_SAVE ) GAME( 1984, undoukai, fieldday, undoukai, undoukai, fortyl_state, init_undoukai, ROT0, "Taito Corporation", "The Undoukai (Japan)", MACHINE_SUPPORTS_SAVE )