From f4f9a3284b9fcb9b6c1c521d7650611c4c5ff9ea Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Thu, 4 Feb 2021 19:28:19 +0100 Subject: slapstic: Full rewrite, using infrastructure we did not have previously --- src/mame/drivers/atarig1.cpp | 15 +- src/mame/drivers/atarisy1.cpp | 18 +- src/mame/drivers/atarisy2.cpp | 36 +- src/mame/drivers/atetris.cpp | 162 +++---- src/mame/drivers/cyberbal.cpp | 5 +- src/mame/drivers/gauntlet.cpp | 16 +- src/mame/drivers/harddriv.cpp | 27 +- src/mame/drivers/rampart.cpp | 8 +- src/mame/drivers/starwars.cpp | 9 +- src/mame/drivers/xybots.cpp | 5 +- src/mame/includes/atarisy2.h | 13 +- src/mame/includes/atetris.h | 9 +- src/mame/includes/harddriv.h | 8 +- src/mame/includes/starwars.h | 4 +- src/mame/machine/harddriv.cpp | 24 +- src/mame/machine/slapstic.cpp | 965 +++++++++++++++++++++++++----------------- src/mame/machine/slapstic.h | 312 +++++++++----- src/mame/video/atarisy2.cpp | 41 +- 18 files changed, 926 insertions(+), 751 deletions(-) diff --git a/src/mame/drivers/atarig1.cpp b/src/mame/drivers/atarig1.cpp index cd5854db8b0..411ead494d3 100644 --- a/src/mame/drivers/atarig1.cpp +++ b/src/mame/drivers/atarig1.cpp @@ -407,6 +407,7 @@ void atarig1_state::hydra(machine_config &config) hydrap(config); m_maincpu->set_addrmap(AS_PROGRAM, &atarig1_state::hydra_map); SLAPSTIC(config, m_slapstic, 116); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0x78000, 0x79fff, 0x6000); m_slapstic->set_bank(m_slapstic_bank); } @@ -418,6 +419,7 @@ void atarig1_state::pfslap111(machine_config &config) ATARI_RLE_OBJECTS(config, m_rle, 0, modesc_pitfight); SLAPSTIC(config, m_slapstic, 111); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0x38000, 0x39fff, 0x6000); m_slapstic->set_bank(m_slapstic_bank); } @@ -429,6 +431,7 @@ void atarig1_state::pfslap112(machine_config &config) ATARI_RLE_OBJECTS(config, m_rle, 0, modesc_pitfight); SLAPSTIC(config, m_slapstic, 112); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0x38000, 0x39fff, 0x6000); m_slapstic->set_bank(m_slapstic_bank); } @@ -440,6 +443,7 @@ void atarig1_state::pfslap113(machine_config &config) ATARI_RLE_OBJECTS(config, m_rle, 0, modesc_pitfight); SLAPSTIC(config, m_slapstic, 113); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0x38000, 0x39fff, 0x6000); m_slapstic->set_bank(m_slapstic_bank); } @@ -451,6 +455,7 @@ void atarig1_state::pfslap114(machine_config &config) ATARI_RLE_OBJECTS(config, m_rle, 0, modesc_pitfight); SLAPSTIC(config, m_slapstic, 114); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0x38000, 0x39fff, 0x6000); m_slapstic->set_bank(m_slapstic_bank); } @@ -1308,10 +1313,6 @@ ROM_END void atarig1_state::init_hydra() { m_slapstic_bank->configure_entries(0, 4, memregion("maincpu")->base() + 0x78000, 0x2000); - m_maincpu->space(AS_PROGRAM).install_readwrite_tap(0x78000, 0x7ffff, 0, "slapstic", - [this](offs_t offset, u16 &data, u16 mem_mask) { m_slapstic->tweak(offset >> 1); }, - [this](offs_t offset, u16 &data, u16 mem_mask) { m_slapstic->tweak(offset >> 1); }); - m_is_pitfight = false; } @@ -1323,18 +1324,12 @@ void atarig1_state::init_hydrap() void atarig1_state::init_pitfight() { m_slapstic_bank->configure_entries(0, 4, memregion("maincpu")->base() + 0x38000, 0x2000); - m_maincpu->space(AS_PROGRAM).install_readwrite_tap(0x38000, 0x3ffff, 0, "slapstic", - [this](offs_t offset, u16 &data, u16 mem_mask) { m_slapstic->tweak(offset >> 1); }, - [this](offs_t offset, u16 &data, u16 mem_mask) { m_slapstic->tweak(offset >> 1); }); m_is_pitfight = true; } void atarig1_state::init_pitfightb() { m_slapstic_bank->configure_entries(0, 4, memregion("maincpu")->base() + 0x38000, 0x2000); - m_maincpu->space(AS_PROGRAM).install_readwrite_tap(0x38000, 0x3ffff, 0, "slapstic", - [this](offs_t offset, u16 &data, u16 mem_mask) { pitfightb_cheap_slapstic_tweak(offset >> 1); }, - [this](offs_t offset, u16 &data, u16 mem_mask) { pitfightb_cheap_slapstic_tweak(offset >> 1); }); /* not primed by default */ m_bslapstic_primed = false; diff --git a/src/mame/drivers/atarisy1.cpp b/src/mame/drivers/atarisy1.cpp index dc2f3665a19..cd0c4767945 100644 --- a/src/mame/drivers/atarisy1.cpp +++ b/src/mame/drivers/atarisy1.cpp @@ -796,6 +796,7 @@ void atarisy1_state::marble(machine_config &config) { atarisy1(config); SLAPSTIC(config, m_slapstic, 103); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0x80000, 0x87fff, 0); m_slapstic->set_bank(m_slapstic_bank); } @@ -804,6 +805,7 @@ void atarisy1_state::peterpak(machine_config &config) atarisy1(config); add_adc(config); SLAPSTIC(config, m_slapstic, 107); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0x80000, 0x87fff, 0); m_slapstic->set_bank(m_slapstic_bank); // Digital joystick read through ADC @@ -819,6 +821,7 @@ void atarisy1_state::indytemp(machine_config &config) add_adc(config); add_speech(config); SLAPSTIC(config, m_slapstic, 105); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0x80000, 0x87fff, 0); m_slapstic->set_bank(m_slapstic_bank); // Digital joystick read through ADC @@ -834,6 +837,7 @@ void atarisy1_state::roadrunn(machine_config &config) add_adc(config); add_speech(config); SLAPSTIC(config, m_slapstic, 108); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0x80000, 0x87fff, 0); m_slapstic->set_bank(m_slapstic_bank); // Hall-effect analog joystick @@ -847,6 +851,7 @@ void atarisy1_state::roadb109(machine_config &config) add_adc(config); add_speech(config); SLAPSTIC(config, m_slapstic, 109); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0x80000, 0x87fff, 0); m_slapstic->set_bank(m_slapstic_bank); // Road Blasters gas pedal @@ -859,6 +864,7 @@ void atarisy1_state::roadb110(machine_config &config) add_adc(config); add_speech(config); SLAPSTIC(config, m_slapstic, 110); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0x80000, 0x87fff, 0); m_slapstic->set_bank(m_slapstic_bank); // Road Blasters gas pedal @@ -2495,18 +2501,6 @@ ROM_END void atarisy1_state::init_slapstic() { m_slapstic_bank->configure_entries(0, 4, memregion("maincpu")->base() + 0x80000, 0x2000); - m_maincpu->space(AS_PROGRAM).install_readwrite_tap(0x80000, 0x87fff, 0, "slapstic", - [this](offs_t offset, u16 &data, u16 mem_mask) { m_slapstic->tweak(offset >> 1); }, - [this](offs_t offset, u16 &data, u16 mem_mask) { m_slapstic->tweak(offset >> 1); }); - - // Some states of the slapstic seems trigger on the whole address space, but that slows things down too much and this point. - // limit to the ranges marble madness and peterpak actually need - m_maincpu->space(AS_PROGRAM).install_readwrite_tap(0x2ff5a, 0x2ff5b, 0, "slapstic", - [this](offs_t offset, u16 &data, u16 mem_mask) { m_slapstic->tweak(offset >> 1); }, - [this](offs_t offset, u16 &data, u16 mem_mask) { m_slapstic->tweak(offset >> 1); }); - m_maincpu->space(AS_PROGRAM).install_readwrite_tap(0x101d4, 0x101d9, 0, "slapstic", - [this](offs_t offset, u16 &data, u16 mem_mask) { m_slapstic->tweak(offset >> 1); }, - [this](offs_t offset, u16 &data, u16 mem_mask) { m_slapstic->tweak(offset >> 1); }); } void atarisy1_state::init_marble() diff --git a/src/mame/drivers/atarisy2.cpp b/src/mame/drivers/atarisy2.cpp index ae79cf61b6e..306cdd9a271 100644 --- a/src/mame/drivers/atarisy2.cpp +++ b/src/mame/drivers/atarisy2.cpp @@ -799,28 +799,14 @@ void atarisy2_state::main_map(address_map &map) map(0014000, 0014001).mirror(01776).r(FUNC(atarisy2_state::switch_r)); map(0014000, 0014000).mirror(01776).w("watchdog", FUNC(watchdog_timer_device::reset_w)); map(0016000, 0016001).mirror(01776).r(FUNC(atarisy2_state::sound_r)); - map(0020000, 0037777).m(m_vrambank, FUNC(address_map_bank_device::amap16)); + map(0020000, 0037777).view(m_vmmu); + m_vmmu[0](020000, 033777).ram().w(m_alpha_tilemap, FUNC(tilemap_device::write16)).share("alpha"); + m_vmmu[0](034000, 037777).ram().w(FUNC(atarisy2_state::spriteram_w)).share("mob"); + m_vmmu[2](020000, 037777).ram().w(FUNC(atarisy2_state::playfieldt_w)).share(m_playfieldt); + m_vmmu[3](020000, 037777).ram().w(FUNC(atarisy2_state::playfieldb_w)).share(m_playfieldb); map(0040000, 0057777).bankr("rombank1"); map(0060000, 0077777).bankr("rombank2"); map(0100000, 0177777).rom(); - map(0100000, 0100777).rw(FUNC(atarisy2_state::slapstic_r), FUNC(atarisy2_state::slapstic_w)); -} - - -/************************************* - * - * Bankswitched VRAM handlers - * - *************************************/ - -// full memory map derived from schematics -void atarisy2_state::vrambank_map(address_map &map) -{ - map.unmap_value_high(); - map(000000, 013777).ram().w(m_alpha_tilemap, FUNC(tilemap_device::write16)).share("alpha"); - map(014000, 017777).ram().w(FUNC(atarisy2_state::spriteram_w)).share("mob"); - map(020000, 037777).ram(); - map(040000, 077777).ram().w(m_playfield_tilemap, FUNC(tilemap_device::write16)).share("playfield"); } @@ -1275,8 +1261,6 @@ void atarisy2_state::atarisy2(machine_config &config) screen.set_palette("palette"); screen.screen_vblank().set(FUNC(atarisy2_state::vblank_int)); - ADDRESS_MAP_BANK(config, "vrambank").set_map(&atarisy2_state::vrambank_map).set_options(ENDIANNESS_LITTLE, 16, 15, 020000); - // sound hardware SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); @@ -1309,6 +1293,8 @@ void atarisy2_state::paperboy(machine_config &config) { atarisy2(config); SLAPSTIC(config, m_slapstic, 105); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0100000, 0100777, 0); + m_slapstic->set_view(m_vmmu); } @@ -1320,6 +1306,8 @@ void atarisy2_state::_720(machine_config &config) to ~2.2MHz "fixes" the problem */ SLAPSTIC(config, m_slapstic, 107); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0100000, 0100777, 0); + m_slapstic->set_view(m_vmmu); } @@ -1327,6 +1315,8 @@ void atarisy2_state::ssprint(machine_config &config) { atarisy2(config); SLAPSTIC(config, m_slapstic, 108); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0100000, 0100777, 0); + m_slapstic->set_view(m_vmmu); // sound hardware config.device_remove("tms"); @@ -1337,6 +1327,8 @@ void atarisy2_state::csprint(machine_config &config) { atarisy2(config); SLAPSTIC(config, m_slapstic, 109); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0100000, 0100777, 0); + m_slapstic->set_view(m_vmmu); // sound hardware config.device_remove("tms"); @@ -1347,6 +1339,8 @@ void atarisy2_state::apb(machine_config &config) { atarisy2(config); SLAPSTIC(config, m_slapstic, 110); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0100000, 0100777, 0); + m_slapstic->set_view(m_vmmu); } diff --git a/src/mame/drivers/atetris.cpp b/src/mame/drivers/atetris.cpp index f01d599b90f..45389415fc1 100644 --- a/src/mame/drivers/atetris.cpp +++ b/src/mame/drivers/atetris.cpp @@ -98,56 +98,25 @@ void atetris_state::irq_ack_w(uint8_t data) * *************************************/ -void atetris_state::reset_bank() -{ - memcpy(m_slapstic_base, &m_slapstic_source[m_current_bank * 0x4000], 0x4000); -} - - void atetris_state::machine_start() { + /* Prepare the rom bank */ + m_slapstic_bank->configure_entries(0, 2, m_slapstic_region, 0x4000); + m_slapstic_bank->configure_entries(2, 2, m_slapstic_region, 0x4000); + /* Allocate interrupt timer */ m_interrupt_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(atetris_state::interrupt_gen),this)); - - /* Set up save state */ - save_item(NAME(m_current_bank)); - machine().save().register_postload(save_prepost_delegate(FUNC(atetris_state::reset_bank), this)); } void atetris_state::machine_reset() { - m_current_bank = m_slapstic->bank() & 1; - reset_bank(); - /* start interrupts going (32V clocked by 16V) */ m_interrupt_timer->adjust(m_screen->time_until_pos(48), 48); } -/************************************* - * - * Slapstic handler - * - *************************************/ - -uint8_t atetris_state::slapstic_r(offs_t offset) -{ - int result = m_slapstic_base[0x2000 + offset]; - int new_bank = m_slapstic->tweak(offset) & 1; - - /* update for the new bank */ - if (new_bank != m_current_bank) - { - m_current_bank = new_bank; - reset_bank(); - } - return result; -} - - - /************************************* * * Coin counters @@ -168,16 +137,7 @@ void atetris_bartop_state::output_w(uint8_t data) /* atetrisbp: $3c00 also handles ROM bank selection */ /* game writes 0x4 to select bank 0, 0x5 to select bank 1 */ if (data & 4) - { - int new_bank = data & 1; - - /* update for the new bank */ - if (new_bank != m_current_bank) - { - m_current_bank = new_bank; - reset_bank(); - } - } + m_slapstic_bank->set_entry(data & 1); } @@ -200,8 +160,7 @@ void atetris_state::main_map(address_map &map) map(0x3400, 0x3400).mirror(0x03ff).w("eeprom", FUNC(eeprom_parallel_28xx_device::unlock_write8)); map(0x3800, 0x3800).mirror(0x03ff).w(FUNC(atetris_state::irq_ack_w)); map(0x3c00, 0x3c00).mirror(0x03ff).w(FUNC(atetris_state::coincount_w)); - map(0x4000, 0x5fff).rom(); - map(0x6000, 0x7fff).r(FUNC(atetris_state::slapstic_r)); + map(0x4000, 0x7fff).bankr(m_slapstic_bank); map(0x8000, 0xffff).rom(); } @@ -223,8 +182,7 @@ void atetris_state::atetrisb2_map(address_map &map) map(0x3400, 0x3400).w("eeprom", FUNC(eeprom_parallel_28xx_device::unlock_write8)); map(0x3800, 0x3800).w(FUNC(atetris_state::irq_ack_w)); map(0x3c00, 0x3c00).w(FUNC(atetris_state::coincount_w)); - map(0x4000, 0x5fff).rom(); - map(0x6000, 0x7fff).r(FUNC(atetris_state::slapstic_r)); + map(0x4000, 0x7fff).bankr(m_slapstic_bank); map(0x8000, 0xffff).rom(); } @@ -242,8 +200,7 @@ void atetris_mcu_state::atetrisb3_map(address_map &map) map(0x3400, 0x3400).w("eeprom", FUNC(eeprom_parallel_28xx_device::unlock_write8)); map(0x3800, 0x3800).w(FUNC(atetris_mcu_state::irq_ack_w)); map(0x3c00, 0x3c00).w(FUNC(atetris_mcu_state::coincount_w)); - map(0x4000, 0x5fff).rom(); - map(0x6000, 0x7fff).r(FUNC(atetris_mcu_state::slapstic_r)); + map(0x4000, 0x7fff).bankr(m_slapstic_bank); map(0x8000, 0xffff).rom(); } @@ -260,7 +217,8 @@ void atetris_bartop_state::atetrisbp_map(address_map &map) map(0x3400, 0x3400).mirror(0x03ff).w("eeprom", FUNC(eeprom_parallel_28xx_device::unlock_write8)); map(0x3800, 0x3800).mirror(0x03ff).w(FUNC(atetris_bartop_state::irq_ack_w)); map(0x3c00, 0x3c00).mirror(0x03ff).w(FUNC(atetris_bartop_state::output_w)); - map(0x4000, 0xffff).rom(); + map(0x4000, 0x7fff).bankr(m_slapstic_bank); + map(0x8000, 0xffff).rom(); } @@ -380,8 +338,6 @@ void atetris_state::atetris_base(machine_config &config) M6502(config, m_maincpu, MASTER_CLOCK/8); m_maincpu->set_addrmap(AS_PROGRAM, &atetris_state::main_map); - SLAPSTIC(config, m_slapstic, 101); - WATCHDOG_TIMER(config, "watchdog"); /* video hardware */ @@ -400,7 +356,7 @@ void atetris_state::atetris_base(machine_config &config) SPEAKER(config, "mono").front_center(); } -void atetris_state::atetris(machine_config &config) +void atetris_state::atetris_pokey(machine_config &config) { atetris_base(config); @@ -415,6 +371,14 @@ void atetris_state::atetris(machine_config &config) pokey2.add_route(ALL_OUTPUTS, "mono", 0.50); } +void atetris_state::atetris(machine_config &config) +{ + atetris_pokey(config); + + SLAPSTIC(config, m_slapstic, 101); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0x6000, 0x7fff, 0); + m_slapstic->set_bank(m_slapstic_bank); +} void atetris_state::atetrisb2(machine_config &config) { @@ -460,7 +424,7 @@ void atetris_mcu_state::atetrisb3(machine_config &config) void atetris_bartop_state::atetrisbp(machine_config &config) { - atetris(config); + atetris_pokey(config); m_maincpu->set_addrmap(AS_PROGRAM, &atetris_bartop_state::atetrisbp_map); } @@ -473,9 +437,8 @@ void atetris_bartop_state::atetrisbp(machine_config &config) *************************************/ ROM_START( atetris ) - ROM_REGION( 0x18000, "maincpu", 0 ) - ROM_LOAD( "136066-1100.45f", 0x10000, 0x8000, CRC(2acbdb09) SHA1(5e1189227f26563fd3e5372121ea5c915620f892) ) - ROM_CONTINUE( 0x08000, 0x8000 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "136066-1100.45f", 0x0000, 0x10000, CRC(2acbdb09) SHA1(5e1189227f26563fd3e5372121ea5c915620f892) ) ROM_REGION( 0x10000, "gfx1", 0 ) ROM_LOAD( "136066-1101.35a", 0x0000, 0x10000, CRC(84a1939f) SHA1(d8577985fc8ed4e74f74c68b7c00c4855b7c3270) ) @@ -483,9 +446,8 @@ ROM_END ROM_START( atetrisa ) - ROM_REGION( 0x18000, "maincpu", 0 ) - ROM_LOAD( "d1", 0x10000, 0x8000, CRC(2bcab107) SHA1(3cfb8df8cd3782f3ff7f6b32ff15c461352061ee) ) - ROM_CONTINUE( 0x08000, 0x8000 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "d1", 0x0000, 0x10000, CRC(2bcab107) SHA1(3cfb8df8cd3782f3ff7f6b32ff15c461352061ee) ) ROM_REGION( 0x10000, "gfx1", 0 ) ROM_LOAD( "136066-1101.35a", 0x0000, 0x10000, CRC(84a1939f) SHA1(d8577985fc8ed4e74f74c68b7c00c4855b7c3270) ) @@ -493,9 +455,8 @@ ROM_END ROM_START( atetrisb ) - ROM_REGION( 0x18000, "maincpu", 0 ) - ROM_LOAD( "tetris.01", 0x10000, 0x8000, CRC(944d15f6) SHA1(926fa5cb26b6e6a50bea455eec1f6d3fb92aa95c) ) - ROM_CONTINUE( 0x08000, 0x8000 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "tetris.01", 0x0000, 0x10000, CRC(944d15f6) SHA1(926fa5cb26b6e6a50bea455eec1f6d3fb92aa95c) ) ROM_REGION( 0x10000, "gfx1", 0 ) ROM_LOAD( "tetris.02", 0x0000, 0x10000, CRC(5c4e7258) SHA1(58060681a728e74d69b2b6f5d02faa597ca6c226) ) @@ -508,9 +469,8 @@ ROM_END ROM_START( atetrisb2 ) - ROM_REGION( 0x18000, "maincpu", 0 ) // Some bootleg PCBs uses unmodified Atari ROMs - ROM_LOAD( "k1-01", 0x10000, 0x8000, CRC(fa056809) SHA1(e4ccccdf9b04b68127c7b03ae263519cf00f94cb) ) // 27512 - ROM_CONTINUE( 0x08000, 0x8000 ) + ROM_REGION( 0x10000, "maincpu", 0 ) // Some bootleg PCBs uses unmodified Atari ROMs + ROM_LOAD( "k1-01", 0x0000, 0x10000, CRC(fa056809) SHA1(e4ccccdf9b04b68127c7b03ae263519cf00f94cb) ) // 27512 ROM_REGION( 0x10000, "gfx1", 0 ) // Some bootleg PCBs uses unmodified Atari ROMs ROM_LOAD( "136066-1101.35a", 0x0000, 0x10000, CRC(84a1939f) SHA1(d8577985fc8ed4e74f74c68b7c00c4855b7c3270) ) // 27512 @@ -561,9 +521,8 @@ The MCU XTAL is 10.73835 MHz rather than 10 MHz on this PCB. */ ROM_START( atetrisb3 ) - ROM_REGION( 0x18000, "maincpu", 0 ) - ROM_LOAD( "prg.bin", 0x10000, 0x8000, CRC(2bcab107) SHA1(3cfb8df8cd3782f3ff7f6b32ff15c461352061ee) ) - ROM_CONTINUE( 0x08000, 0x8000 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "prg.bin", 0x0000, 0x10000, CRC(2bcab107) SHA1(3cfb8df8cd3782f3ff7f6b32ff15c461352061ee) ) ROM_REGION( 0x10000, "gfx1", 0 ) ROM_LOAD( "gfx.bin", 0x0000, 0x10000, CRC(84a1939f) SHA1(d8577985fc8ed4e74f74c68b7c00c4855b7c3270) ) @@ -587,9 +546,8 @@ ROM_START( atetrisb3 ) ROM_END ROM_START( atetrisb4 ) // bootleg on an unusually big PCB for this game - ROM_REGION( 0x18000, "maincpu", 0 ) - ROM_LOAD( "1.bin", 0x10000, 0x8000, CRC(56589096) SHA1(df0ff776f3e3506c86d703d2283db59a576abea6) ) // only difference is the credits for 'video graphics' where changed - ROM_CONTINUE( 0x08000, 0x8000 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "1.bin", 0x0000, 0x10000, CRC(56589096) SHA1(df0ff776f3e3506c86d703d2283db59a576abea6) ) // only difference is the credits for 'video graphics' where changed ROM_REGION( 0x10000, "gfx1", 0 ) ROM_LOAD( "2.bin", 0x0000, 0x10000, CRC(70859030) SHA1(bb6bf88b75be3a81672e0aa30a8cbd7181bc87d0) ) // unique, but extremely similar to the one of the original @@ -630,9 +588,8 @@ N |PAL16R4 74LS??? 4017 74LS08 74LS32 74LS04 PAL16R4 82S123 74LS32 | 1 2 3 4 5 6 7 8 9 */ ROM_START( atetb3482 ) - ROM_REGION( 0x18000, "maincpu", 0 ) - ROM_LOAD( "i4-d1.bin", 0x10000, 0x8000, CRC(2acbdb09) SHA1(5e1189227f26563fd3e5372121ea5c915620f892) ) - ROM_CONTINUE( 0x08000, 0x8000 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "i4-d1.bin", 0x0000, 0x10000, CRC(2acbdb09) SHA1(5e1189227f26563fd3e5372121ea5c915620f892) ) ROM_REGION( 0x10000, "gfx1", 0 ) ROM_LOAD( "f8-d2.bin", 0x0000, 0x10000, CRC(84a1939f) SHA1(d8577985fc8ed4e74f74c68b7c00c4855b7c3270) ) @@ -696,18 +653,16 @@ wasn't a viable game to make, its the only known example. */ ROM_START( atetrisbp ) - ROM_REGION( 0x18000, "maincpu", 0 ) - ROM_LOAD( "tet_rom_rev1.40f", 0x10000, 0x8000, CRC(b6224e6c) SHA1(6b549317499e91a2f19ec282d927fba08f217488) ) - ROM_CONTINUE( 0x08000, 0x8000 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "tet_rom_rev1.40f", 0x0000, 0x10000, CRC(b6224e6c) SHA1(6b549317499e91a2f19ec282d927fba08f217488) ) ROM_REGION( 0x10000, "gfx1", 0 ) ROM_LOAD( "8901-136066-1101.40p", 0x0000, 0x10000, CRC(84a1939f) SHA1(d8577985fc8ed4e74f74c68b7c00c4855b7c3270) BAD_DUMP ) // "© 1988 ATARI"; not dumped from this set ROM_END ROM_START( atetrisc ) - ROM_REGION( 0x18000, "maincpu", 0 ) - ROM_LOAD( "tetcktl1.rom", 0x10000, 0x8000, CRC(9afd1f4a) SHA1(323d1576d92c905e8e95108b39cabf6fa0c10db6) ) - ROM_CONTINUE( 0x08000, 0x8000 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "tetcktl1.rom", 0x0000, 0x10000, CRC(9afd1f4a) SHA1(323d1576d92c905e8e95108b39cabf6fa0c10db6) ) ROM_REGION( 0x10000, "gfx1", 0 ) ROM_LOAD( "136066-1103.35a", 0x0000, 0x10000, CRC(ec2a7f93) SHA1(cb850141ffd1504f940fa156a39e71a4146d7fea) ) @@ -715,9 +670,8 @@ ROM_END ROM_START( atetrisc2 ) - ROM_REGION( 0x18000, "maincpu", 0 ) - ROM_LOAD( "136066-1102.45f", 0x10000, 0x8000, CRC(1bd28902) SHA1(ae8c34f082bce1f827bf60830f207c46cb282421) ) - ROM_CONTINUE( 0x08000, 0x8000 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "136066-1102.45f", 0x0000, 0x10000, CRC(1bd28902) SHA1(ae8c34f082bce1f827bf60830f207c46cb282421) ) ROM_REGION( 0x10000, "gfx1", 0 ) ROM_LOAD( "136066-1103.35a", 0x0000, 0x10000, CRC(ec2a7f93) SHA1(cb850141ffd1504f940fa156a39e71a4146d7fea) ) @@ -725,35 +679,19 @@ ROM_END -/************************************* - * - * Driver init - * - *************************************/ - -void atetris_state::init_atetris() -{ - uint8_t *rgn = memregion("maincpu")->base(); - - m_slapstic_source = &rgn[0x10000]; - m_slapstic_base = &rgn[0x04000]; -} - - - /************************************* * * Game drivers * *************************************/ -GAME( 1988, atetris, 0, atetris, atetris, atetris_state, init_atetris, ROT0, "Atari Games", "Tetris (set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, atetrisa, atetris, atetris, atetris, atetris_state, init_atetris, ROT0, "Atari Games", "Tetris (set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, atetrisb, atetris, atetris, atetris, atetris_state, init_atetris, ROT0, "bootleg", "Tetris (bootleg set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, atetrisb2, atetris, atetrisb2, atetris, atetris_state, init_atetris, ROT0, "bootleg", "Tetris (bootleg set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, atetrisb3, atetris, atetrisb3, atetris, atetris_mcu_state, init_atetris, ROT0, "bootleg", "Tetris (bootleg set 3)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, atetrisb4, atetris, atetris, atetris, atetris_state, init_atetris, ROT0, "bootleg", "Tetris (bootleg set 4)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, atetb3482, atetris, atetris, atetris, atetris_state, init_atetris, ROT0, "bootleg", "Tetris (bootleg set 5, with UM3482)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -GAME( 1989, atetrisbp, atetris, atetrisbp, atetris, atetris_bartop_state, init_atetris, ROT0, "Atari Games", "Tetris (bartop, prototype)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, atetrisc, atetris, atetris, atetrisc, atetris_state, init_atetris, ROT270, "Atari Games", "Tetris (cocktail set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, atetrisc2, atetris, atetris, atetrisc, atetris_state, init_atetris, ROT270, "Atari Games", "Tetris (cocktail set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, atetris, 0, atetris, atetris, atetris_state, empty_init, ROT0, "Atari Games", "Tetris (set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, atetrisa, atetris, atetris, atetris, atetris_state, empty_init, ROT0, "Atari Games", "Tetris (set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, atetrisb, atetris, atetris, atetris, atetris_state, empty_init, ROT0, "bootleg", "Tetris (bootleg set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, atetrisb2, atetris, atetrisb2, atetris, atetris_state, empty_init, ROT0, "bootleg", "Tetris (bootleg set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, atetrisb3, atetris, atetrisb3, atetris, atetris_mcu_state, empty_init, ROT0, "bootleg", "Tetris (bootleg set 3)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, atetrisb4, atetris, atetris, atetris, atetris_state, empty_init, ROT0, "bootleg", "Tetris (bootleg set 4)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, atetb3482, atetris, atetris, atetris, atetris_state, empty_init, ROT0, "bootleg", "Tetris (bootleg set 5, with UM3482)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +GAME( 1989, atetrisbp, atetris, atetrisbp, atetris, atetris_bartop_state, empty_init, ROT0, "Atari Games", "Tetris (bartop, prototype)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, atetrisc, atetris, atetris, atetrisc, atetris_state, empty_init, ROT270, "Atari Games", "Tetris (cocktail set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, atetrisc2, atetris, atetris, atetrisc, atetris_state, empty_init, ROT270, "Atari Games", "Tetris (cocktail set 2)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/cyberbal.cpp b/src/mame/drivers/cyberbal.cpp index 7fb2c986f52..17034767e28 100644 --- a/src/mame/drivers/cyberbal.cpp +++ b/src/mame/drivers/cyberbal.cpp @@ -421,6 +421,7 @@ void cyberbal_state::cyberbalt(machine_config &config) EEPROM_2816(config, "eeprom").lock_after_write(true); SLAPSTIC(config, m_slapstic, 116); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0x18000, 0x1ffff, 0); m_slapstic->set_bank(m_slapstic_bank); m_maincpu->set_addrmap(AS_PROGRAM, &cyberbal_state::tournament_map); } @@ -1002,10 +1003,6 @@ ROM_END void cyberbal_state::init_cyberbalt() { m_slapstic_bank->configure_entries(0, 4, memregion("maincpu")->base() + 0x18000, 0x2000); - m_maincpu->space(AS_PROGRAM).install_readwrite_tap(0x18000, 0x1ffff, 0, "slapstic", - [this](offs_t offset, u16 &data, u16 mem_mask) { m_slapstic->tweak(offset >> 1); }, - [this](offs_t offset, u16 &data, u16 mem_mask) { m_slapstic->tweak(offset >> 1); }); - } diff --git a/src/mame/drivers/gauntlet.cpp b/src/mame/drivers/gauntlet.cpp index 23d0535223b..7e326407eb4 100644 --- a/src/mame/drivers/gauntlet.cpp +++ b/src/mame/drivers/gauntlet.cpp @@ -549,6 +549,7 @@ void gauntlet_state::gauntlet(machine_config & config) { gauntlet_base(config); SLAPSTIC(config, m_slapstic, 104); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0x38000, 0x3ffff, 0x280000); m_slapstic->set_bank(m_slapstic_bank); } @@ -557,6 +558,7 @@ void gauntlet_state::gaunt2p(machine_config & config) { gauntlet_base(config); SLAPSTIC(config, m_slapstic, 107); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0x38000, 0x3ffff, 0x280000); m_slapstic->set_bank(m_slapstic_bank); } @@ -565,6 +567,7 @@ void gauntlet_state::gauntlet2(machine_config & config) { gauntlet_base(config); SLAPSTIC(config, m_slapstic, 106); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0x38000, 0x3ffff, 0x280000); m_slapstic->set_bank(m_slapstic_bank); } @@ -573,6 +576,7 @@ void gauntlet_state::vindctr2(machine_config & config) { gauntlet_base(config); SLAPSTIC(config, m_slapstic, 118); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0x38000, 0x3ffff, 0x280000); m_slapstic->set_bank(m_slapstic_bank); } @@ -1659,18 +1663,6 @@ void gauntlet_state::common_init(int vindctr2) { u8 *rom = memregion("maincpu")->base(); m_slapstic_bank->configure_entries(0, 4, rom + 0x38000, 0x2000); - m_maincpu->space(AS_PROGRAM).install_readwrite_tap(0x38000, 0x3ffff, 0x280000, "slapstic", - [this](offs_t offset, u16 &data, u16 mem_mask) { m_slapstic->tweak(offset >> 1); }, - [this](offs_t offset, u16 &data, u16 mem_mask) { m_slapstic->tweak(offset >> 1); }); - - - // Out-of-range access on alternate 1 - m_maincpu->space(AS_PROGRAM).install_readwrite_tap(0x4fed0, 0x4fed7, 0x000000, "slapstic", - [this](offs_t offset, u16 &data, u16 mem_mask) { m_slapstic->tweak(offset >> 1); }, - [this](offs_t offset, u16 &data, u16 mem_mask) { m_slapstic->tweak(offset >> 1); }); - m_maincpu->space(AS_PROGRAM).install_readwrite_tap(0x56e54, 0x56e57, 0x000000, "slapstic", - [this](offs_t offset, u16 &data, u16 mem_mask) { m_slapstic->tweak(offset >> 1); }, - [this](offs_t offset, u16 &data, u16 mem_mask) { m_slapstic->tweak(offset >> 1); }); // swap the top and bottom halves of the main CPU ROM images swap_memory(rom + 0x000000, rom + 0x008000, 0x8000); diff --git a/src/mame/drivers/harddriv.cpp b/src/mame/drivers/harddriv.cpp index 625b64f518b..b772fbce815 100644 --- a/src/mame/drivers/harddriv.cpp +++ b/src/mame/drivers/harddriv.cpp @@ -367,7 +367,7 @@ harddriv_state::harddriv_state(const machine_config &mconfig, device_type type, m_dsk_10c(*this, "dsk_10c"), m_dsk_30c(*this, "dsk_30c"), m_dsk_pio_access(0), - m_m68k_slapstic_base(nullptr), + m_m68k_sloop_base(nullptr), m_m68k_sloop_alt_base(nullptr), m_200e(*this, "200e"), m_210e(*this, "210e"), @@ -460,7 +460,8 @@ harddriv_state::harddriv_state(const machine_config &mconfig, device_type type, m_sound_int_state(0), m_video_int_state(0), m_palette(*this, "palette"), - m_slapstic_device(*this, "slapstic"), + m_slapstic(*this, "slapstic"), + m_slapstic_bank(*this, "slapstic_bank"), m_rs232(*this, "rs232") { int i; @@ -1455,7 +1456,9 @@ void harddriv_state::driver_nomsp(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &harddriv_state::driver_68k_map); m_maincpu->set_periodic_int(FUNC(harddriv_state::hd68k_irq_gen), attotime::from_hz(HARDDRIV_MASTER_CLOCK/16/16/16/16/2)); - SLAPSTIC(config, m_slapstic_device, 117); + SLAPSTIC(config, m_slapstic, 117); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0xe0000, 0xe7fff, 0x18000); + m_slapstic->set_bank(m_slapstic_bank); WATCHDOG_TIMER(config, "watchdog"); @@ -5061,8 +5064,8 @@ void harddriv_state::init_racedriv() init_driver_sound(); /* set up the slapstic */ - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xe0000, 0xfffff, read16sm_delegate(*this, FUNC(harddriv_state::rd68k_slapstic_r)), write16sm_delegate(*this, FUNC(harddriv_state::rd68k_slapstic_w))); - m_m68k_slapstic_base = (uint16_t *)(memregion("maincpu")->base() + 0xe0000); + m_maincpu->space(AS_PROGRAM).install_readwrite_bank(0xe0000, 0xe7fff, 0x18000, m_slapstic_bank); + m_slapstic_bank->configure_entries(0, 4, memregion("maincpu")->base() + 0xe0000, 0x8000); /* synchronization */ m_dsp32->space(AS_PROGRAM).install_write_handler(0x613c00, 0x613c03, write32s_delegate(*this, FUNC(harddriv_state::rddsp32_sync0_w))); @@ -5085,8 +5088,8 @@ void harddriv_state::racedrivc_init_common(offs_t gsp_protection) init_driver_sound(); /* set up the slapstic */ - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xe0000, 0xfffff, read16sm_delegate(*this, FUNC(harddriv_state::rd68k_slapstic_r)), write16sm_delegate(*this, FUNC(harddriv_state::rd68k_slapstic_w))); - m_m68k_slapstic_base = (uint16_t *)(memregion("maincpu")->base() + 0xe0000); + m_maincpu->space(AS_PROGRAM).install_readwrite_bank(0xe0000, 0xe7fff, 0x18000, m_slapstic_bank); + m_slapstic_bank->configure_entries(0, 4, memregion("maincpu")->base() + 0xe0000, 0x8000); /* synchronization */ m_dsp32->space(AS_PROGRAM).install_write_handler(0x613c00, 0x613c03, write32s_delegate(*this, FUNC(harddriv_state::rddsp32_sync0_w))); @@ -5119,8 +5122,8 @@ void harddriv_state::init_racedrivc_panorama_side() init_adsp(); /* set up the slapstic */ - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xe0000, 0xfffff, read16sm_delegate(*this, FUNC(harddriv_state::rd68k_slapstic_r)), write16sm_delegate(*this, FUNC(harddriv_state::rd68k_slapstic_w))); - m_m68k_slapstic_base = (uint16_t *)(memregion("maincpu")->base() + 0xe0000); + m_maincpu->space(AS_PROGRAM).install_readwrite_bank(0xe0000, 0xe7fff, 0x18000, m_slapstic_bank); + m_slapstic_bank->configure_entries(0, 4, memregion("maincpu")->base() + 0xe0000, 0x8000); /* set up protection hacks */ m_gsp->space(AS_PROGRAM).install_write_handler(gsp_protection, gsp_protection + 0x0f, write16smo_delegate(*this, FUNC(harddriv_state::hdgsp_protection_w))); @@ -5177,7 +5180,7 @@ void harddriv_state::steeltal_init_common(offs_t ds3_transfer_pc, int proto_sloo else m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xe0000, 0xfffff, read16sm_delegate(*this, FUNC(harddriv_state::st68k_protosloop_r)), write16sm_delegate(*this, FUNC(harddriv_state::st68k_protosloop_w))); - m_m68k_slapstic_base = (uint16_t *)(memregion("maincpu")->base() + 0xe0000); + m_m68k_sloop_base = (uint16_t *)(memregion("maincpu")->base() + 0xe0000); m_m68k_sloop_alt_base = (uint16_t *)(memregion("maincpu")->base() + 0x4e000); /* set up protection hacks */ @@ -5218,8 +5221,8 @@ void harddriv_state::init_strtdriv() init_dsk(); /* set up the slapstic */ - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xe0000, 0xfffff, read16sm_delegate(*this, FUNC(harddriv_state::rd68k_slapstic_r)), write16sm_delegate(*this, FUNC(harddriv_state::rd68k_slapstic_w))); - m_m68k_slapstic_base = (uint16_t *)(memregion("maincpu")->base() + 0xe0000); + m_maincpu->space(AS_PROGRAM).install_readwrite_bank(0xe0000, 0xe7fff, 0x18000, m_slapstic_bank); + m_slapstic_bank->configure_entries(0, 4, memregion("maincpu")->base() + 0xe0000, 0x8000); m_maincpu->space(AS_PROGRAM).install_read_handler(0xa80000, 0xafffff, read16smo_delegate(*this, FUNC(harddriv_state::hda68k_port1_r))); diff --git a/src/mame/drivers/rampart.cpp b/src/mame/drivers/rampart.cpp index 1970a083430..f0317706a49 100644 --- a/src/mame/drivers/rampart.cpp +++ b/src/mame/drivers/rampart.cpp @@ -329,6 +329,7 @@ void rampart_state::rampart(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &rampart_state::main_map); SLAPSTIC(config, m_slapstic, 118); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0x140000, 0x147fff, 0x438000); m_slapstic->set_bank(m_slapstic_bank); TIMER(config, "scantimer").configure_scanline(FUNC(rampart_state::scanline_interrupt), m_screen, 0, 32); @@ -495,13 +496,6 @@ ROM_END void rampart_state::machine_start() { m_slapstic_bank->configure_entries(0, 4, memregion("maincpu")->base() + 0x40000, 0x2000); - m_maincpu->space(AS_PROGRAM).install_readwrite_tap(0x140000, 0x147fff, 0x438000, "slapstic", - [this](offs_t offset, u16 &data, u16 mem_mask) { m_slapstic->tweak(offset >> 1); }, - [this](offs_t offset, u16 &data, u16 mem_mask) { m_slapstic->tweak(offset >> 1); }); - // The slapstic seems to trigger on the whole rom, but that slows things down too much. limit to the range rampart actually needs - m_maincpu->space(AS_PROGRAM).install_readwrite_tap(0x040000, 0x041fff, 0x000000, "slapstic", - [this](offs_t offset, u16 &data, u16 mem_mask) { m_slapstic->tweak(offset >> 1); }, - [this](offs_t offset, u16 &data, u16 mem_mask) { m_slapstic->tweak(offset >> 1); }); } diff --git a/src/mame/drivers/starwars.cpp b/src/mame/drivers/starwars.cpp index cf2eb49e041..63d5a40b436 100644 --- a/src/mame/drivers/starwars.cpp +++ b/src/mame/drivers/starwars.cpp @@ -329,8 +329,9 @@ void starwars_state::esb(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &starwars_state::esb_main_map); - SLAPSTIC(config, m_slapstic_device, 101); - m_slapstic_device->set_bank(m_slapstic_bank); + SLAPSTIC(config, m_slapstic, 101); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0x8000, 0x9fff, 0); + m_slapstic->set_bank(m_slapstic_bank); subdevice("outlatch")->q_out_cb<4>().append_membank("bank2"); } @@ -526,10 +527,6 @@ void starwars_state::init_esb() /* init the slapstic */ m_slapstic_bank->configure_entries(0, 4, memregion("maincpu")->base() + 0x14000, 0x2000); - m_maincpu->space(AS_PROGRAM).install_readwrite_tap(0x8000, 0x9fff, 0, "slapstic", - [this](offs_t offset, u8 &data, u8 mem_mask) { m_slapstic_device->tweak(offset & 0x1fff); }, - [this](offs_t offset, u8 &data, u8 mem_mask) { m_slapstic_device->tweak(offset & 0x1fff); }); - /* prepare the matrix processor */ starwars_mproc_init(); diff --git a/src/mame/drivers/xybots.cpp b/src/mame/drivers/xybots.cpp index 93c902479e8..4d0b57e0773 100644 --- a/src/mame/drivers/xybots.cpp +++ b/src/mame/drivers/xybots.cpp @@ -176,6 +176,7 @@ void xybots_state::xybots(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &xybots_state::main_map); SLAPSTIC(config, m_slapstic, 107); + m_slapstic->set_range(m_maincpu, AS_PROGRAM, 0x8000, 0xffff, 0x7c0000); m_slapstic->set_bank(m_slapstic_bank); EEPROM_2804(config, "eeprom").lock_after_write(true); @@ -383,10 +384,6 @@ ROM_END void xybots_state::machine_start() { m_slapstic_bank->configure_entries(0, 4, memregion("maincpu")->base() + 0x8000, 0x2000); - m_maincpu->space(AS_PROGRAM).install_readwrite_tap(0x8000, 0xffff, 0x7c0000, "slapstic", - [this](offs_t offset, u16 &data, u16 mem_mask) { m_slapstic->tweak(offset >> 1); }, - [this](offs_t offset, u16 &data, u16 mem_mask) { m_slapstic->tweak(offset >> 1); }); - m_h256 = 0x0400; } diff --git a/src/mame/includes/atarisy2.h b/src/mame/includes/atarisy2.h index f6109af67f1..46d0955353b 100644 --- a/src/mame/includes/atarisy2.h +++ b/src/mame/includes/atarisy2.h @@ -32,7 +32,6 @@ public: , m_screen(*this, "screen") , m_mob(*this, "mob") , m_slapstic_region(*this, "maincpu") - , m_vrambank(*this, "vrambank") , m_playfield_tilemap(*this, "playfield") , m_alpha_tilemap(*this, "alpha") , m_xscroll(*this, "xscroll") @@ -44,6 +43,9 @@ public: , m_tms5220(*this, "tms") , m_rombank(*this, "rombank%u", 1U) , m_slapstic(*this, "slapstic") + , m_vmmu(*this, "vmmu") + , m_playfieldt(*this, "playfieldt") + , m_playfieldb(*this, "playfieldb") , m_leds(*this, "led%u", 0U) { } @@ -75,7 +77,6 @@ private: required_device m_screen; required_device m_mob; required_region_ptr m_slapstic_region; - required_device m_vrambank; uint8_t m_interrupt_enable; @@ -99,6 +100,9 @@ private: required_memory_bank_array<2> m_rombank; required_device m_slapstic; + memory_view m_vmmu; + required_shared_ptr m_playfieldt; + required_shared_ptr m_playfieldb; uint8_t m_sound_reset_state; @@ -146,15 +150,14 @@ private: DECLARE_WRITE_LINE_MEMBER(vblank_int); TIMER_CALLBACK_MEMBER(delayed_int_enable_w); TIMER_CALLBACK_MEMBER(reset_yscroll_callback); - uint16_t slapstic_r(offs_t offset); - void slapstic_w(offs_t offset, uint16_t data); void yscroll_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); void xscroll_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); void spriteram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void playfieldt_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void playfieldb_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); static rgb_t RRRRGGGGBBBBIIII(uint32_t raw); static const atari_motion_objects_config s_mob_config; void main_map(address_map &map); void sound_map(address_map &map); - void vrambank_map(address_map &map); }; diff --git a/src/mame/includes/atetris.h b/src/mame/includes/atetris.h index 914edb9f2cd..52b57c075bc 100644 --- a/src/mame/includes/atetris.h +++ b/src/mame/includes/atetris.h @@ -26,11 +26,14 @@ public: m_gfxdecode(*this, "gfxdecode"), m_screen(*this, "screen"), m_slapstic(*this, "slapstic"), + m_slapstic_bank(*this, "slapstic_bank"), + m_slapstic_region(*this, "maincpu"), m_videoram(*this, "videoram") { } void atetris_base(machine_config &config); + void atetris_pokey(machine_config &config); void atetris(machine_config &config); void atetrisb2(machine_config &config); @@ -45,17 +48,15 @@ protected: required_device m_gfxdecode; required_device m_screen; optional_device m_slapstic; + optional_memory_bank m_slapstic_bank; + required_region_ptr m_slapstic_region; required_shared_ptr m_videoram; - uint8_t *m_slapstic_source; - uint8_t *m_slapstic_base; - uint8_t m_current_bank; emu_timer *m_interrupt_timer; tilemap_t *m_bg_tilemap; void irq_ack_w(uint8_t data); - uint8_t slapstic_r(offs_t offset); void coincount_w(uint8_t data); void videoram_w(offs_t offset, uint8_t data); TILE_GET_INFO_MEMBER(get_tile_info); diff --git a/src/mame/includes/harddriv.h b/src/mame/includes/harddriv.h index 53cb84c4f0c..1582020992b 100644 --- a/src/mame/includes/harddriv.h +++ b/src/mame/includes/harddriv.h @@ -235,9 +235,6 @@ protected: /* DSPCOM board */ void hddspcom_control_w(offs_t offset, uint16_t data); - void rd68k_slapstic_w(offs_t offset, uint16_t data); - uint16_t rd68k_slapstic_r(offs_t offset); - /* Game-specific protection */ void st68k_sloop_w(offs_t offset, uint16_t data); uint16_t st68k_sloop_r(offs_t offset); @@ -317,7 +314,7 @@ protected: optional_device m_dsk_30c; uint8_t m_dsk_pio_access; - uint16_t * m_m68k_slapstic_base; + uint16_t * m_m68k_sloop_base; uint16_t * m_m68k_sloop_alt_base; required_device m_200e; @@ -491,7 +488,8 @@ protected: optional_device m_palette; int get_hblank(screen_device &screen) const { return (screen.hpos() > (screen.width() * 9 / 10)); } - optional_device m_slapstic_device; + optional_device m_slapstic; + memory_bank_creator m_slapstic_bank; optional_device m_rs232; diff --git a/src/mame/includes/starwars.h b/src/mame/includes/starwars.h index 9365e325f1e..c9e2afb6f62 100644 --- a/src/mame/includes/starwars.h +++ b/src/mame/includes/starwars.h @@ -32,7 +32,7 @@ public: m_pokey(*this, "pokey%u", 1U), m_tms(*this, "tms"), m_novram(*this, "x2212"), - m_slapstic_device(*this, "slapstic"), + m_slapstic(*this, "slapstic"), m_slapstic_bank(*this, "slapstic_bank") { } @@ -54,7 +54,7 @@ private: required_device_array m_pokey; required_device m_tms; required_device m_novram; - optional_device m_slapstic_device; + optional_device m_slapstic; optional_memory_bank m_slapstic_bank; int m_MPA; diff --git a/src/mame/machine/harddriv.cpp b/src/mame/machine/harddriv.cpp index 456642bd0de..acd7ab10505 100644 --- a/src/mame/machine/harddriv.cpp +++ b/src/mame/machine/harddriv.cpp @@ -1691,26 +1691,6 @@ void harddriv_state::hddspcom_control_w(offs_t offset, uint16_t data) #pragma mark * GAME-SPECIFIC PROTECTION #endif -/************************************* - * - * Race Drivin' slapstic handling - * - *************************************/ - -void harddriv_state::rd68k_slapstic_w(offs_t offset, uint16_t data) -{ - m_slapstic_device->tweak(offset & 0x3fff); -} - - -uint16_t harddriv_state::rd68k_slapstic_r(offs_t offset) -{ - int bank = m_slapstic_device->tweak(offset & 0x3fff) * 0x4000; - return m_m68k_slapstic_base[bank + (offset & 0x3fff)]; -} - - - /************************************* * * Steel Talons SLOOP handling @@ -1753,7 +1733,7 @@ void harddriv_state::st68k_sloop_w(offs_t offset, uint16_t data) uint16_t harddriv_state::st68k_sloop_r(offs_t offset) { int bank = st68k_sloop_tweak(offset) * 0x4000; - return m_m68k_slapstic_base[bank + (offset & 0x3fff)]; + return m_m68k_sloop_base[bank + (offset & 0x3fff)]; } @@ -1818,7 +1798,7 @@ void harddriv_state::st68k_protosloop_w(offs_t offset, uint16_t data) uint16_t harddriv_state::st68k_protosloop_r(offs_t offset) { int bank = st68k_protosloop_tweak(offset) * 0x4000; - return m_m68k_slapstic_base[bank + (offset & 0x3fff)]; + return m_m68k_sloop_base[bank + (offset & 0x3fff)]; } diff --git a/src/mame/machine/slapstic.cpp b/src/mame/machine/slapstic.cpp index fe55dc4cd7e..c65e1422389 100644 --- a/src/mame/machine/slapstic.cpp +++ b/src/mame/machine/slapstic.cpp @@ -177,8 +177,8 @@ slapstic banked region. Specifically: - on 101 and 102, the 2nd alt access must be done outside of the bank region - - on 103 to 108, the 1st alt access can be done anywhere - - on 110 to 118, the 1st and 3rd alt access can be done anywhere + - on 103 to 110, the 1st alt access can be done anywhere + - on 111 to 118, the 1st and 3rd alt access can be done anywhere These out-of-range accesses pose technical difficulties we're not fully handling yet. Similarly, accesses that must be done in sequence get @@ -201,63 +201,19 @@ #include "cpu/m68000/m68000.h" - -/************************************* - * - * Debugging - * - *************************************/ - -#define LOG_SLAPSTIC (0) - - - DEFINE_DEVICE_TYPE(SLAPSTIC, atari_slapstic_device, "slapstic", "Atari Slapstic") atari_slapstic_device::atari_slapstic_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : device_t(mconfig, SLAPSTIC, tag, owner, clock), - state(0), - current_bank(0), - access_68k(-1), - alt_bank(0), - bit_bank(0), - add_bank(0), - bit_xor(0), - m_bank(*this, finder_base::DUMMY_TAG) + m_bank(*this, finder_base::DUMMY_TAG), + m_view(nullptr), + m_space(*this, finder_base::DUMMY_TAG, -1), + m_start(0), + m_end(0), + m_mirror(0), + m_current_bank(0), + m_loaded_bank(0) { - slapstic.bankstart = 0; - slapstic.bank[0] = slapstic.bank[1] = slapstic.bank[2] = slapstic.bank[3] = 0; - slapstic.alt1.mask = 0; - slapstic.alt1.value = 0; - slapstic.alt2.mask = 0; - slapstic.alt2.value = 0; - slapstic.alt3.mask = 0; - slapstic.alt3.value = 0; - slapstic.alt4.mask = 0; - slapstic.alt4.value = 0; - slapstic.altshift = 0; - slapstic.bit1.mask = 0; - slapstic.bit1.value = 0; - slapstic.bit2c0.mask = 0; - slapstic.bit2c0.value = 0; - slapstic.bit2s0.mask = 0; - slapstic.bit2s0.value = 0; - slapstic.bit2c1.mask = 0; - slapstic.bit2c1.value = 0; - slapstic.bit2s1.mask = 0; - slapstic.bit2s1.value = 0; - slapstic.bit3.mask = 0; - slapstic.bit3.value = 0; - slapstic.add1.mask = 0; - slapstic.add1.value = 0; - slapstic.add2.mask = 0; - slapstic.add2.value = 0; - slapstic.addplus1.mask = 0; - slapstic.addplus1.value = 0; - slapstic.addplus2.mask = 0; - slapstic.addplus2.value = 0; - slapstic.add3.mask = 0; - slapstic.add3.value = 0; } /************************************* @@ -266,39 +222,53 @@ atari_slapstic_device::atari_slapstic_device(const machine_config &mconfig, cons * *************************************/ -/* slapstic 137412-101: Empire Strikes Back/Tetris (NOT confirmed) */ -static const struct slapstic_data slapstic101 = +#define UNKNOWN 0xffff +#define NO_BITWISE \ + { UNKNOWN,UNKNOWN }, \ + { UNKNOWN,UNKNOWN }, \ + { UNKNOWN,UNKNOWN }, \ + { UNKNOWN,UNKNOWN }, \ + { UNKNOWN,UNKNOWN }, \ + { UNKNOWN,UNKNOWN }, \ + { UNKNOWN,UNKNOWN } +#define NO_ADDITIVE \ + { UNKNOWN,UNKNOWN }, \ + { UNKNOWN,UNKNOWN }, \ + { UNKNOWN,UNKNOWN }, \ + { UNKNOWN,UNKNOWN }, \ + { UNKNOWN,UNKNOWN } + + +/* slapstic 137412-101: Empire Strikes Back/Tetris */ +const atari_slapstic_device::slapstic_data atari_slapstic_device::slapstic101 = { /* basic banking */ 3, /* starting bank */ { 0x0080,0x0090,0x00a0,0x00b0 },/* bank select values */ /* alternate banking */ - // Real values, to be worked on later -// { 0x1f00,0x1e00 }, /* 1st mask/value in sequence */ -// { 0x1fff,0x1fff }, /* 2nd mask/value in sequence, *outside* of the range */ - - { 0x1fff,0x1dfe }, /* 1st mask/value in sequence */ - { 0x1fff,0x1dff }, /* 2nd mask/value in sequence */ + { 0x1f00,0x1e00 }, /* 1st mask/value in sequence */ + { 0x1fff,0x1fff }, /* 2nd mask/value in sequence, *outside* of the range */ { 0x1ffc,0x1b5c }, /* 3rd mask/value in sequence */ { 0x1fcf,0x0080 }, /* 4th mask/value in sequence */ 0, /* shift to get bank from 3rd */ /* bitwise banking */ - { 0x1ff0,0x1540 }, /* 1st mask/value in sequence */ - { 0x1ff3,0x1540 }, /* clear bit 0 value */ - { 0x1ff3,0x1541 }, /* set bit 0 value */ - { 0x1ff3,0x1542 }, /* clear bit 1 value */ - { 0x1ff3,0x1543 }, /* set bit 1 value */ - { 0x1ff8,0x1550 }, /* final mask/value in sequence */ + { 0x1ff0,0x1540 }, /* 1st mask/value */ + { 0x1fcf,0x0080 }, /* 2nd mask/value */ + { 0x1ff3,0x1540 }, /* clear bit 0 value on odd / set bit 1 on even */ + { 0x1ff3,0x1541 }, /* set bit 0 value on odd / clear bit 1 on even */ + { 0x1ff3,0x1542 }, /* clear bit 1 value on odd / set bit 0 on even */ + { 0x1ff3,0x1543 }, /* set bit 1 value on odd / clear bit 0 on even */ + { 0x1ff8,0x1550 }, /* final mask/value */ /* additive banking */ NO_ADDITIVE }; -/* slapstic 137412-103: Marble Madness (confirmed) */ -static const struct slapstic_data slapstic103 = +/* slapstic 137412-103: Marble Madness */ +const atari_slapstic_device::slapstic_data atari_slapstic_device::slapstic103 = { /* basic banking */ 3, /* starting bank */ @@ -306,8 +276,6 @@ static const struct slapstic_data slapstic103 = /* alternate banking */ // Real values, to be worked on later -// { 0x3e00,0x3a00 }, /* 1st mask/value in sequence */ -// { 0x3ffe,0x3ffe }, /* 2nd mask/value in sequence, *outside* of the range */ { 0x007f,0x002d }, /* 1st mask/value in sequence */ { 0x3fff,0x3d14 }, /* 2nd mask/value in sequence */ { 0x3ffc,0x3d24 }, /* 3rd mask/value in sequence */ @@ -316,10 +284,11 @@ static const struct slapstic_data slapstic103 = /* bitwise banking */ { 0x3ff0,0x34c0 }, /* 1st mask/value in sequence */ - { 0x3ff3,0x34c0 }, /* clear bit 0 value */ - { 0x3ff3,0x34c1 }, /* set bit 0 value */ - { 0x3ff3,0x34c2 }, /* clear bit 1 value */ - { 0x3ff3,0x34c3 }, /* set bit 1 value */ + { 0x3fcf,0x0040 }, /* 2nd mask/value */ + { 0x3ff3,0x34c0 }, /* clear bit 0 value on odd / set bit 1 on even */ + { 0x3ff3,0x34c1 }, /* set bit 0 value on odd / clear bit 1 on even */ + { 0x3ff3,0x34c2 }, /* clear bit 1 value on odd / set bit 0 on even */ + { 0x3ff3,0x34c3 }, /* set bit 1 value on odd / clear bit 0 on even */ { 0x3ff8,0x34d0 }, /* final mask/value in sequence */ /* additive banking */ @@ -327,8 +296,8 @@ static const struct slapstic_data slapstic103 = }; -/* slapstic 137412-104: Gauntlet (confirmed) */ -static const struct slapstic_data slapstic104 = +/* slapstic 137412-104: Gauntlet */ +const atari_slapstic_device::slapstic_data atari_slapstic_device::slapstic104 = { /* basic banking */ 3, /* starting bank */ @@ -343,10 +312,11 @@ static const struct slapstic_data slapstic104 = /* bitwise banking */ { 0x3ff0,0x3d90 }, /* 1st mask/value in sequence */ - { 0x3ff3,0x3d90 }, /* clear bit 0 value */ - { 0x3ff3,0x3d91 }, /* set bit 0 value */ - { 0x3ff3,0x3d92 }, /* clear bit 1 value */ - { 0x3ff3,0x3d93 }, /* set bit 1 value */ + { 0x3fe7,0x0020 }, /* 2nd mask/value */ + { 0x3ff3,0x3d90 }, /* clear bit 0 value on odd / set bit 1 on even */ + { 0x3ff3,0x3d91 }, /* set bit 0 value on odd / clear bit 1 on even */ + { 0x3ff3,0x3d92 }, /* clear bit 1 value on odd / set bit 0 on even */ + { 0x3ff3,0x3d93 }, /* set bit 1 value on odd / clear bit 0 on even */ { 0x3ff8,0x3da0 }, /* final mask/value in sequence */ /* additive banking */ @@ -354,8 +324,8 @@ static const struct slapstic_data slapstic104 = }; -/* slapstic 137412-105: Indiana Jones/Paperboy (confirmed) */ -static const struct slapstic_data slapstic105 = +/* slapstic 137412-105: Indiana Jones/Paperboy */ +const atari_slapstic_device::slapstic_data atari_slapstic_device::slapstic105 = { /* basic banking */ 3, /* starting bank */ @@ -370,10 +340,11 @@ static const struct slapstic_data slapstic105 = /* bitwise banking */ { 0x3ff0,0x35b0 }, /* 1st mask/value in sequence */ - { 0x3ff3,0x35b0 }, /* clear bit 0 value */ - { 0x3ff3,0x35b1 }, /* set bit 0 value */ - { 0x3ff3,0x35b2 }, /* clear bit 1 value */ - { 0x3ff3,0x35b3 }, /* set bit 1 value */ + { 0x3ff3,0x0010 }, /* 2nd mask/value */ + { 0x3ff3,0x35b0 }, /* clear bit 0 value on odd / set bit 1 on even */ + { 0x3ff3,0x35b1 }, /* set bit 0 value on odd / clear bit 1 on even */ + { 0x3ff3,0x35b2 }, /* clear bit 1 value on odd / set bit 0 on even */ + { 0x3ff3,0x35b3 }, /* set bit 1 value on odd / clear bit 0 on even */ { 0x3ff8,0x35c0 }, /* final mask/value in sequence */ /* additive banking */ @@ -381,8 +352,8 @@ static const struct slapstic_data slapstic105 = }; -/* slapstic 137412-106: Gauntlet II (confirmed) */ -static const struct slapstic_data slapstic106 = +/* slapstic 137412-106: Gauntlet II */ +const atari_slapstic_device::slapstic_data atari_slapstic_device::slapstic106 = { /* basic banking */ 3, /* starting bank */ @@ -397,10 +368,11 @@ static const struct slapstic_data slapstic106 = /* bitwise banking */ { 0x3ff0,0x3da0 }, /* 1st mask/value in sequence */ - { 0x3ff3,0x3da0 }, /* clear bit 0 value */ - { 0x3ff3,0x3da1 }, /* set bit 0 value */ - { 0x3ff3,0x3da2 }, /* clear bit 1 value */ - { 0x3ff3,0x3da3 }, /* set bit 1 value */ + { 0x3ff9,0x0008 }, /* 2nd mask/value */ + { 0x3ff3,0x3da0 }, /* clear bit 0 value on odd / set bit 1 on even */ + { 0x3ff3,0x3da1 }, /* set bit 0 value on odd / clear bit 1 on even */ + { 0x3ff3,0x3da2 }, /* clear bit 1 value on odd / set bit 0 on even */ + { 0x3ff3,0x3da3 }, /* set bit 1 value on odd / clear bit 0 on even */ { 0x3ff8,0x3db0 }, /* final mask/value in sequence */ /* additive banking */ @@ -408,8 +380,8 @@ static const struct slapstic_data slapstic106 = }; -/* slapstic 137412-107: Peter Packrat/Xybots/2p Gauntlet/720 (confirmed) */ -static const struct slapstic_data slapstic107 = +/* slapstic 137412-107: Peter Packrat/Xybots/2p Gauntlet/720 */ +const atari_slapstic_device::slapstic_data atari_slapstic_device::slapstic107 = { /* basic banking */ 3, /* starting bank */ @@ -424,10 +396,11 @@ static const struct slapstic_data slapstic107 = /* bitwise banking */ { 0x3ff0,0x00a0 }, /* 1st mask/value in sequence */ - { 0x3ff3,0x00a0 }, /* clear bit 0 value */ - { 0x3ff3,0x00a1 }, /* set bit 0 value */ - { 0x3ff3,0x00a2 }, /* clear bit 1 value */ - { 0x3ff3,0x00a3 }, /* set bit 1 value */ + { 0x3ff9,0x0018 }, /* 2nd mask/value */ + { 0x3ff3,0x00a0 }, /* clear bit 0 value on odd / set bit 1 on even */ + { 0x3ff3,0x00a1 }, /* set bit 0 value on odd / clear bit 1 on even */ + { 0x3ff3,0x00a2 }, /* clear bit 1 value on odd / set bit 0 on even */ + { 0x3ff3,0x00a3 }, /* set bit 1 value on odd / clear bit 0 on even */ { 0x3ff8,0x00b0 }, /* final mask/value in sequence */ /* additive banking */ @@ -435,8 +408,8 @@ static const struct slapstic_data slapstic107 = }; -/* slapstic 137412-108: Road Runner/Super Sprint (confirmed) */ -static const struct slapstic_data slapstic108 = +/* slapstic 137412-108: Road Runner/Super Sprint */ +const atari_slapstic_device::slapstic_data atari_slapstic_device::slapstic108 = { /* basic banking */ 3, /* starting bank */ @@ -451,10 +424,11 @@ static const struct slapstic_data slapstic108 = /* bitwise banking */ { 0x3ff0,0x0060 }, /* 1st mask/value in sequence */ - { 0x3ff3,0x0060 }, /* clear bit 0 value */ - { 0x3ff3,0x0061 }, /* set bit 0 value */ - { 0x3ff3,0x0062 }, /* clear bit 1 value */ - { 0x3ff3,0x0063 }, /* set bit 1 value */ + { 0x3ff9,0x0028 }, /* 2nd mask/value */ + { 0x3ff3,0x0060 }, /* clear bit 0 value on odd / set bit 1 on even */ + { 0x3ff3,0x0061 }, /* set bit 0 value on odd / clear bit 1 on even */ + { 0x3ff3,0x0062 }, /* clear bit 1 value on odd / set bit 0 on even */ + { 0x3ff3,0x0063 }, /* set bit 1 value on odd / clear bit 0 on even */ { 0x3ff8,0x0070 }, /* final mask/value in sequence */ /* additive banking */ @@ -462,8 +436,8 @@ static const struct slapstic_data slapstic108 = }; -/* slapstic 137412-109: Championship Sprint/Road Blasters (confirmed) */ -static const struct slapstic_data slapstic109 = +/* slapstic 137412-109: Championship Sprint/Road Blasters */ +const atari_slapstic_device::slapstic_data atari_slapstic_device::slapstic109 = { /* basic banking */ 3, /* starting bank */ @@ -478,10 +452,11 @@ static const struct slapstic_data slapstic109 = /* bitwise banking */ { 0x3ff0,0x3da0 }, /* 1st mask/value in sequence */ - { 0x3ff3,0x3da0 }, /* clear bit 0 value */ - { 0x3ff3,0x3da1 }, /* set bit 0 value */ - { 0x3ff3,0x3da2 }, /* clear bit 1 value */ - { 0x3ff3,0x3da3 }, /* set bit 1 value */ + { 0x3ff9,0x0008 }, /* 2nd mask/value */ + { 0x3ff3,0x3da0 }, /* clear bit 0 value on odd / set bit 1 on even */ + { 0x3ff3,0x3da1 }, /* set bit 0 value on odd / clear bit 1 on even */ + { 0x3ff3,0x3da2 }, /* clear bit 1 value on odd / set bit 0 on even */ + { 0x3ff3,0x3da3 }, /* set bit 1 value on odd / clear bit 0 on even */ { 0x3ff8,0x3db0 }, /* final mask/value in sequence */ /* additive banking */ @@ -489,8 +464,8 @@ static const struct slapstic_data slapstic109 = }; -/* slapstic 137412-110: Road Blasters/APB (confirmed) */ -static const struct slapstic_data slapstic110 = +/* slapstic 137412-110: Road Blasters/APB */ +const atari_slapstic_device::slapstic_data atari_slapstic_device::slapstic110 = { /* basic banking */ 3, /* starting bank */ @@ -505,10 +480,11 @@ static const struct slapstic_data slapstic110 = /* bitwise banking */ { 0x3ff0,0x34c0 }, /* 1st mask/value in sequence */ - { 0x3ff3,0x34c0 }, /* clear bit 0 value */ - { 0x3ff3,0x34c1 }, /* set bit 0 value */ - { 0x3ff3,0x34c2 }, /* clear bit 1 value */ - { 0x3ff3,0x34c3 }, /* set bit 1 value */ + { 0x3fcf,0x0040 }, /* 2nd mask/value */ + { 0x3ff3,0x34c0 }, /* clear bit 0 value on odd / set bit 1 on even */ + { 0x3ff3,0x34c1 }, /* set bit 0 value on odd / clear bit 1 on even */ + { 0x3ff3,0x34c2 }, /* clear bit 1 value on odd / set bit 0 on even */ + { 0x3ff3,0x34c3 }, /* set bit 1 value on odd / clear bit 0 on even */ { 0x3ff8,0x34d0 }, /* final mask/value in sequence */ /* additive banking */ @@ -523,8 +499,8 @@ static const struct slapstic_data slapstic110 = * *************************************/ -/* slapstic 137412-111: Pit Fighter (Aug 09, 1990 to Aug 22, 1990) (confirmed) */ -static const struct slapstic_data slapstic111 = +/* slapstic 137412-111: Pit Fighter (Aug 09, 1990 to Aug 22, 1990) */ +const atari_slapstic_device::slapstic_data atari_slapstic_device::slapstic111 = { /* basic banking */ 0, /* starting bank */ @@ -549,8 +525,8 @@ static const struct slapstic_data slapstic111 = }; -/* slapstic 137412-112: Pit Fighter (Aug 22, 1990 to Oct 01, 1990) (confirmed) */ -static const struct slapstic_data slapstic112 = +/* slapstic 137412-112: Pit Fighter (Aug 22, 1990 to Oct 01, 1990) */ +const atari_slapstic_device::slapstic_data atari_slapstic_device::slapstic112 = { /* basic banking */ 0, /* starting bank */ @@ -575,8 +551,8 @@ static const struct slapstic_data slapstic112 = }; -/* slapstic 137412-113: Pit Fighter (Oct 09, 1990 to Oct 12, 1990) (confirmed) */ -static const struct slapstic_data slapstic113 = +/* slapstic 137412-113: Pit Fighter (Oct 09, 1990 to Oct 12, 1990) */ +const atari_slapstic_device::slapstic_data atari_slapstic_device::slapstic113 = { /* basic banking */ 0, /* starting bank */ @@ -601,8 +577,8 @@ static const struct slapstic_data slapstic113 = }; -/* slapstic 137412-114: Pit Fighter (Nov 01, 1990 and later) (confirmed) */ -static const struct slapstic_data slapstic114 = +/* slapstic 137412-114: Pit Fighter (Nov 01, 1990 and later) */ +const atari_slapstic_device::slapstic_data atari_slapstic_device::slapstic114 = { /* basic banking */ 0, /* starting bank */ @@ -627,8 +603,8 @@ static const struct slapstic_data slapstic114 = }; -/* slapstic 137412-115: Race Drivin' DSK board (confirmed) */ -static const struct slapstic_data slapstic115 = +/* slapstic 137412-115: Race Drivin' DSK board */ +const atari_slapstic_device::slapstic_data atari_slapstic_device::slapstic115 = { /* basic banking */ 0, /* starting bank */ @@ -653,8 +629,8 @@ static const struct slapstic_data slapstic115 = }; -/* slapstic 137412-116: Hydra (confirmed) */ -static const struct slapstic_data slapstic116 = +/* slapstic 137412-116: Hydra */ +const atari_slapstic_device::slapstic_data atari_slapstic_device::slapstic116 = { /* basic banking */ 0, /* starting bank */ @@ -679,8 +655,8 @@ static const struct slapstic_data slapstic116 = }; -/* slapstic 137412-117: Race Drivin' main board (confirmed) */ -static const struct slapstic_data slapstic117 = +/* slapstic 137412-117: Race Drivin' main board */ +const atari_slapstic_device::slapstic_data atari_slapstic_device::slapstic117 = { /* basic banking */ 0, /* starting bank */ @@ -705,8 +681,8 @@ static const struct slapstic_data slapstic117 = }; -/* slapstic 137412-118: Rampart/Vindicators II (confirmed) */ -static const struct slapstic_data slapstic118 = +/* slapstic 137412-118: Rampart/Vindicators II */ +const atari_slapstic_device::slapstic_data atari_slapstic_device::slapstic118 = { /* basic banking */ 0, /* starting bank */ @@ -739,10 +715,10 @@ static const struct slapstic_data slapstic118 = *************************************/ /* master table */ -static const struct slapstic_data *const slapstic_table[] = +const atari_slapstic_device::slapstic_data *const atari_slapstic_device::slapstic_table[] = { - &slapstic101, /* NOT confirmed! */ - nullptr, /* never seen */ + &slapstic101, + nullptr, /* never seen */ &slapstic103, &slapstic104, &slapstic105, @@ -778,295 +754,504 @@ void atari_slapstic_device::device_validity_check(validity_checker &valid) const void atari_slapstic_device::device_start() { - /* set up the parameters */ - slapstic = *slapstic_table[m_chipnum - 101]; - /* save state */ - save_item(NAME(state)); - save_item(NAME(current_bank)); - save_item(NAME(alt_bank)); - save_item(NAME(bit_bank)); - save_item(NAME(add_bank)); - save_item(NAME(bit_xor)); + save_item(NAME(m_current_bank)); + save_item(NAME(m_loaded_bank)); + + /* Address space tap installation */ + if(m_space->data_width() == 16) + m_space->install_readwrite_tap(0, m_space->addrmask(), 0, "slapstic", + [this](offs_t offset, u16 &, u16) { if(!machine().side_effects_disabled()) m_state->test(offset); }, + [this](offs_t offset, u16 &, u16) { if(!machine().side_effects_disabled()) m_state->test(offset); }); + else + m_space->install_readwrite_tap(0, m_space->addrmask(), 0, "slapstic", + [this](offs_t offset, u8 &, u8) { if(!machine().side_effects_disabled()) m_state->test(offset); }, + [this](offs_t offset, u8 &, u8) { if(!machine().side_effects_disabled()) m_state->test(offset); }); + + checker check(m_start, m_end, m_mirror, m_space->data_width(), m_chipnum == 101 ? 13 : 14); + const auto *info = slapstic_table[m_chipnum - 101]; + + m_s_idle = std::make_unique(this, check, info); + + if(m_chipnum <= 102) { + m_s_active = std::make_unique(this, check, info); + m_s_alt_valid = std::make_unique(this, check, info); + + } else if(m_chipnum <= 110) { + m_s_active = std::make_unique(this, check, info); + m_s_alt_valid = std::make_unique(this, check, info); + + } else { + m_s_active = std::make_unique(this, check, info); + m_s_alt_valid = std::make_unique(this, check, info); + } + + if(m_chipnum <= 110) + m_s_alt_select = std::make_unique(this, check, info, m_space->data_width() == 16 ? 1 : 0); + else + m_s_alt_select = std::make_unique(this, check, info, m_space->data_width() == 16 ? 1 : 0); + + m_s_alt_commit = std::make_unique(this, check, info); + + if(m_chipnum <= 110) { + m_s_bit_load = std::make_unique(this, check, info); + m_s_bit_set_odd = std::make_unique(this, check, info, true); + m_s_bit_set_even = std::make_unique(this, check, info, false); + } + + if(m_chipnum >= 111) { + m_s_add_load = std::make_unique(this, check, info); + m_s_add_set = std::make_unique (this, check, info); + } + + m_state = m_s_idle.get(); } void atari_slapstic_device::device_reset(void) { /* reset the chip */ - state = DISABLED; + m_state = m_s_idle.get(); /* the 111 and later chips seem to reset to bank 0 */ - current_bank = slapstic.bankstart; + change_bank(slapstic_table[m_chipnum - 101]->bankstart); +} +void atari_slapstic_device::change_bank(int bank) +{ + logerror("current bank %d\n", bank); + m_current_bank = bank; if(m_bank) - m_bank->set_entry(current_bank); + m_bank->set_entry(m_current_bank); + if(m_view) + m_view->select(m_current_bank); } +void atari_slapstic_device::commit_bank() +{ + change_bank(m_loaded_bank); +} -/************************************* - * - * Returns active bank without tweaking - * - *************************************/ +atari_slapstic_device::checker::checker(offs_t start, offs_t end, offs_t mirror, int data_width, int address_lines) +{ + m_range_mask = ~((end - start) | mirror); + m_range_value = start; + if(m_range_value & ~m_range_mask) + fatalerror("The slapstic range %x-%x mirror %x is not masking friendly", start, end, mirror); + m_shift = data_width == 16 ? 1 : 0; + m_input_mask = util::make_bitmask(address_lines) << m_shift; +} -int atari_slapstic_device::bank(void) +atari_slapstic_device::test atari_slapstic_device::checker::test_in(const mask_value &mv) const { - return current_bank; + return test(m_range_mask | (mv.mask << m_shift), m_range_value | (mv.value << m_shift)); } +atari_slapstic_device::test atari_slapstic_device::checker::test_any(const mask_value &mv) const +{ + return test(mv.mask << m_shift, mv.value << m_shift); +} +atari_slapstic_device::test atari_slapstic_device::checker::test_inside() const +{ + return test(m_range_mask, m_range_value); +} + +atari_slapstic_device::test atari_slapstic_device::checker::test_reset() const +{ + return test(m_range_mask | m_input_mask, m_range_value); +} + +atari_slapstic_device::test atari_slapstic_device::checker::test_bank(u16 b) const +{ + return test(m_range_mask | m_input_mask, m_range_value | (b << m_shift)); +} -/************************************* - * - * Call this *after* every access - * - *************************************/ -int atari_slapstic_device::tweak(offs_t offset) +// Idle state, waits for a reset to go to active + +atari_slapstic_device::idle::idle(atari_slapstic_device *sl, const checker &check, const slapstic_data *data) : state(sl) { - offset &= 0x3fff; + m_reset = check.test_reset(); +} - /* reset is universal */ - if (offset == 0x0000) - { - state = ENABLED; +void atari_slapstic_device::idle::test(offs_t addr) const +{ + if(m_reset(addr)) { + m_sl->logerror("reset (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_active.get(); } +} - /* otherwise, use the state machine */ - else - { - switch (state) - { - /* DISABLED state: everything is ignored except a reset */ - case DISABLED: - break; - - /* ENABLED state: the chip has been activated and is ready for a bankswitch */ - case ENABLED: - - /* check for request to enter bitwise state */ - if (MATCHES_MASK_VALUE(offset, slapstic.bit1)) - { - state = BITWISE1; - } - - /* check for request to enter additive state */ - else if (MATCHES_MASK_VALUE(offset, slapstic.add1)) - { - state = ADDITIVE1; - } - - /* check for request to enter alternate state */ - else if (MATCHES_MASK_VALUE(offset, slapstic.alt1)) - { - state = ALTERNATE1; - } - - /* check for standard bankswitches */ - else if (offset == slapstic.bank[0]) - { - state = DISABLED; - current_bank = 0; - } - else if (offset == slapstic.bank[1]) - { - state = DISABLED; - current_bank = 1; - } - else if (offset == slapstic.bank[2]) - { - state = DISABLED; - current_bank = 2; - } - else if (offset == slapstic.bank[3]) - { - state = DISABLED; - current_bank = 3; - } - break; - - /* ALTERNATE1 state: look for alternate2 offset, or else fall back to ENABLED */ - /* Can also go to ADDITIVE1. Not a hack, it's real. */ - case ALTERNATE1: - if (MATCHES_MASK_VALUE(offset, slapstic.alt2)) - { - state = ALTERNATE2; - } - else if (MATCHES_MASK_VALUE(offset, slapstic.add1)) - { - state = ADDITIVE1; - } - else - { - state = ENABLED; - } - break; - - /* ALTERNATE2 state: look for altbank offset, or else fall back to ENABLED */ - case ALTERNATE2: - if (MATCHES_MASK_VALUE(offset, slapstic.alt3)) - { - state = ALTERNATE3; - alt_bank = (offset >> slapstic.altshift) & 3; - } - else - { - state = ENABLED; - } - break; - - /* ALTERNATE3 state: wait for the final value to finish the transaction */ - case ALTERNATE3: - if (MATCHES_MASK_VALUE(offset, slapstic.alt4)) - { - state = DISABLED; - current_bank = alt_bank; - } - break; - - /* BITWISE1 state: waiting for a bank to enter the BITWISE state */ - case BITWISE1: - if (offset == slapstic.bank[0] || offset == slapstic.bank[1] || - offset == slapstic.bank[2] || offset == slapstic.bank[3]) - { - state = BITWISE2; - bit_bank = current_bank; - bit_xor = 0; - } - break; - - /* BITWISE2 state: watch for twiddling and the escape mechanism */ - case BITWISE2: - - /* check for clear bit 0 case */ - if (MATCHES_MASK_VALUE(offset ^ bit_xor, slapstic.bit2c0)) - { - bit_bank &= ~1; - bit_xor ^= 3; - } - - /* check for set bit 0 case */ - else if (MATCHES_MASK_VALUE(offset ^ bit_xor, slapstic.bit2s0)) - { - bit_bank |= 1; - bit_xor ^= 3; - } - - /* check for clear bit 1 case */ - else if (MATCHES_MASK_VALUE(offset ^ bit_xor, slapstic.bit2c1)) - { - bit_bank &= ~2; - bit_xor ^= 3; - } - - /* check for set bit 1 case */ - else if (MATCHES_MASK_VALUE(offset ^ bit_xor, slapstic.bit2s1)) - { - bit_bank |= 2; - bit_xor ^= 3; - } - - /* check for escape case */ - else if (MATCHES_MASK_VALUE(offset, slapstic.bit3)) - { - state = BITWISE3; - } - break; - - /* BITWISE3 state: waiting for a bank to seal the deal */ - case BITWISE3: - if (offset == slapstic.bank[0] || offset == slapstic.bank[1] || - offset == slapstic.bank[2] || offset == slapstic.bank[3]) - { - state = DISABLED; - current_bank = bit_bank; - } - break; - - /* ADDITIVE1 state: look for add2 offset, or else fall back to ENABLED */ - case ADDITIVE1: - if (MATCHES_MASK_VALUE(offset, slapstic.add2)) - { - state = ADDITIVE2; - add_bank = current_bank; - } - else - { - state = ENABLED; - } - break; - - /* ADDITIVE2 state: watch for twiddling and the escape mechanism */ - case ADDITIVE2: - - /* check for add 1 case -- can intermix */ - if (MATCHES_MASK_VALUE(offset, slapstic.addplus1)) - { - add_bank = (add_bank + 1) & 3; - } - - /* check for add 2 case -- can intermix */ - if (MATCHES_MASK_VALUE(offset, slapstic.addplus2)) - { - add_bank = (add_bank + 2) & 3; - } - - /* check for escape case -- can intermix with the above */ - if (MATCHES_MASK_VALUE(offset, slapstic.add3)) - { - state = ADDITIVE3; - } - break; - - /* ADDITIVE3 state: waiting for the commit, which is common with alt, but can be delayed */ - case ADDITIVE3: - if (MATCHES_MASK_VALUE(offset, slapstic.alt4)) - { - state = DISABLED; - current_bank = add_bank; - } - break; - } + +// Active state, 101-102, has direct, alt and bitwise, and alt must be done in-range + +atari_slapstic_device::active_101_102::active_101_102(atari_slapstic_device *sl, const checker &check, const slapstic_data *data) : state(sl) +{ + for(int i=0; i != 4; i++) + m_bank[i] = check.test_bank(data->bank[i]); + m_alt = check.test_in(data->alt1); + m_bit = check.test_in(data->bit1); +} + +void atari_slapstic_device::active_101_102::test(offs_t addr) const +{ + if(m_bank[0](addr)) { + m_sl->logerror("direct switch bank 0 (%s)\n", m_sl->machine().describe_context()); + m_sl->change_bank(0); + m_sl->m_state = m_sl->m_s_idle.get(); + } else if(m_bank[1](addr)) { + m_sl->logerror("direct switch bank 1 (%s)\n", m_sl->machine().describe_context()); + m_sl->change_bank(1); + m_sl->m_state = m_sl->m_s_idle.get(); + } else if(m_bank[2](addr)) { + m_sl->logerror("direct switch bank 2 (%s)\n", m_sl->machine().describe_context()); + m_sl->change_bank(2); + m_sl->m_state = m_sl->m_s_idle.get(); + } else if(m_bank[3](addr)) { + m_sl->logerror("direct switch bank 3 (%s)\n", m_sl->machine().describe_context()); + m_sl->change_bank(3); + m_sl->m_state = m_sl->m_s_idle.get(); + } else if(m_alt(addr)) { + m_sl->logerror("alt start (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_alt_valid.get(); + } else if(m_bit(addr)) { + m_sl->logerror("bitwise start (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_bit_load.get(); } +} - /* log this access */ - if (LOG_SLAPSTIC) - slapstic_log(offset); - if(m_bank) - m_bank->set_entry(current_bank); +// Active state, 103-110, has direct, alt and bitwise, and alt can be done anywhere + +atari_slapstic_device::active_103_110::active_103_110(atari_slapstic_device *sl, const checker &check, const slapstic_data *data) : state(sl) +{ + for(int i=0; i != 4; i++) + m_bank[i] = check.test_bank(data->bank[i]); + m_alt = check.test_any(data->alt1); + m_bit = check.test_in(data->bit1); +} - /* return the active bank */ - return current_bank; +void atari_slapstic_device::active_103_110::test(offs_t addr) const +{ + if(m_bank[0](addr)) { + m_sl->logerror("direct switch bank 0 (%s)\n", m_sl->machine().describe_context()); + m_sl->change_bank(0); + m_sl->m_state = m_sl->m_s_idle.get(); + } else if(m_bank[1](addr)) { + m_sl->logerror("direct switch bank 1 (%s)\n", m_sl->machine().describe_context()); + m_sl->change_bank(1); + m_sl->m_state = m_sl->m_s_idle.get(); + } else if(m_bank[2](addr)) { + m_sl->logerror("direct switch bank 2 (%s)\n", m_sl->machine().describe_context()); + m_sl->change_bank(2); + m_sl->m_state = m_sl->m_s_idle.get(); + } else if(m_bank[3](addr)) { + m_sl->logerror("direct switch bank 3 (%s)\n", m_sl->machine().describe_context()); + m_sl->change_bank(3); + m_sl->m_state = m_sl->m_s_idle.get(); + } else if(m_alt(addr)) { + m_sl->logerror("alt start (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_alt_valid.get(); + } else if(m_bit(addr)) { + m_sl->logerror("bitwise start (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_bit_load.get(); + } } +// Active state, 111-118, has direct, alt and add, and alt can be done anywhere -/************************************* - * - * Debugging - * - *************************************/ +atari_slapstic_device::active_111_118::active_111_118(atari_slapstic_device *sl, const checker &check, const slapstic_data *data) : state(sl) +{ + for(int i=0; i != 4; i++) + m_bank[i] = check.test_bank(data->bank[i]); + m_alt = check.test_any(data->alt1); + m_add = check.test_in(data->add1); +} + +void atari_slapstic_device::active_111_118::test(offs_t addr) const +{ + if(m_bank[0](addr)) { + m_sl->logerror("direct switch bank 0 (%s)\n", m_sl->machine().describe_context()); + m_sl->change_bank(0); + m_sl->m_state = m_sl->m_s_idle.get(); + } else if(m_bank[1](addr)) { + m_sl->logerror("direct switch bank 1 (%s)\n", m_sl->machine().describe_context()); + m_sl->change_bank(1); + m_sl->m_state = m_sl->m_s_idle.get(); + } else if(m_bank[2](addr)) { + m_sl->logerror("direct switch bank 2 (%s)\n", m_sl->machine().describe_context()); + m_sl->change_bank(2); + m_sl->m_state = m_sl->m_s_idle.get(); + } else if(m_bank[3](addr)) { + m_sl->logerror("direct switch bank 3 (%s)\n", m_sl->machine().describe_context()); + m_sl->change_bank(3); + m_sl->m_state = m_sl->m_s_idle.get(); + } else if(m_alt(addr)) { + m_sl->logerror("alt start (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_alt_valid.get(); + } else if(m_add(addr)) { + m_sl->logerror("add start (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_add_load.get(); + } +} + + +// alt validation, 101-102 required to be outside of the range (hits a 6809 dummy vma access in practive) + +atari_slapstic_device::alt_valid_101_102::alt_valid_101_102(atari_slapstic_device *sl, const checker &check, const slapstic_data *data) : state(sl) +{ + m_reset = check.test_reset(); + m_inside = check.test_inside(); + m_valid = check.test_any(data->alt2); +} + +void atari_slapstic_device::alt_valid_101_102::test(offs_t addr) const +{ + if(m_reset(addr)) { + m_sl->logerror("reset (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_active.get(); + } else if(!m_inside(addr) && m_valid(addr)) { + m_sl->logerror("alt valid (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_alt_select.get(); + } else { + m_sl->logerror("alt sequence break at valid (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_active.get(); + } +} + + +// alt validation, 103-110, in-range + +atari_slapstic_device::alt_valid_103_110::alt_valid_103_110(atari_slapstic_device *sl, const checker &check, const slapstic_data *data) : state(sl) +{ + m_reset = check.test_reset(); + m_valid = check.test_in(data->alt2); +} + +void atari_slapstic_device::alt_valid_103_110::test(offs_t addr) const +{ + if(m_reset(addr)) { + m_sl->logerror("reset (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_active.get(); + } else if(m_valid(addr)) { + m_sl->logerror("alt valid (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_alt_select.get(); + } else { + m_sl->logerror("alt sequence break at valid (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_active.get(); + } +} + + +// alt validation, 111-118, in-range, can also switch to add + +atari_slapstic_device::alt_valid_111_118::alt_valid_111_118(atari_slapstic_device *sl, const checker &check, const slapstic_data *data) : state(sl) +{ + m_reset = check.test_reset(); + m_valid = check.test_in(data->alt2); + m_add = check.test_in(data->add1); +} + +void atari_slapstic_device::alt_valid_111_118::test(offs_t addr) const +{ + if(m_reset(addr)) { + m_sl->logerror("reset (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_active.get(); + } else if(m_valid(addr)) { + m_sl->logerror("alt valid (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_alt_select.get(); + } else if(m_add(addr)) { + m_sl->logerror("alt switch to add (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_add_load.get(); + } else { + m_sl->logerror("alt sequence break at valid (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_active.get(); + } +} + + +// alt selection, 101-110, access must be done in-range + +atari_slapstic_device::alt_select_101_110::alt_select_101_110(atari_slapstic_device *sl, const checker &check, const slapstic_data *data, int shift) : state(sl) +{ + m_reset = check.test_reset(); + m_select = check.test_in(data->alt3); + m_shift = shift + data->altshift; +} + +void atari_slapstic_device::alt_select_101_110::test(offs_t addr) const +{ + if(m_reset(addr)) { + m_sl->logerror("reset (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_active.get(); + } else if(m_select(addr)) { + m_sl->logerror("alt select (%s)\n", m_sl->machine().describe_context()); + m_sl->m_loaded_bank = (addr >> m_shift) & 3; + m_sl->m_state = m_sl->m_s_alt_commit.get(); + } else { + m_sl->logerror("alt sequence break at select (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_active.get(); + } +} + + +// alt selection, 111-118, access can be done anywhere + +atari_slapstic_device::alt_select_111_118::alt_select_111_118(atari_slapstic_device *sl, const checker &check, const slapstic_data *data, int shift) : state(sl) +{ + m_reset = check.test_reset(); + m_select = check.test_any(data->alt3); + m_shift = shift + data->altshift; +} + +void atari_slapstic_device::alt_select_111_118::test(offs_t addr) const +{ + if(m_reset(addr)) { + m_sl->logerror("reset (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_active.get(); + } else if(m_select(addr)) { + m_sl->logerror("alt select (%s)\n", m_sl->machine().describe_context()); + m_sl->m_loaded_bank = (addr >> m_shift) & 3; + m_sl->m_state = m_sl->m_s_alt_commit.get(); + } else { + m_sl->logerror("alt sequence break at select (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_active.get(); + } +} -void atari_slapstic_device::slapstic_log(offs_t offset) + +// alt commit + +atari_slapstic_device::alt_commit::alt_commit(atari_slapstic_device *sl, const checker &check, const slapstic_data *data) : state(sl) +{ + m_reset = check.test_reset(); + m_commit = check.test_any(data->alt4); +} + +void atari_slapstic_device::alt_commit::test(offs_t addr) const +{ + if(m_reset(addr)) { + m_sl->logerror("reset (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_active.get(); + } else if(m_commit(addr)) { + m_sl->logerror("alt/add commit (%s)\n", m_sl->machine().describe_context()); + m_sl->commit_bank(); + m_sl->m_state = m_sl->m_s_idle.get(); + } +} + + +// bitwise, load the current bank state + +atari_slapstic_device::bit_load::bit_load(atari_slapstic_device *sl, const checker &check, const slapstic_data *data) : state(sl) +{ + m_reset = check.test_reset(); + m_load = check.test_in(data->bit2); +} + +void atari_slapstic_device::bit_load::test(offs_t addr) const +{ + if(m_reset(addr)) { + m_sl->logerror("reset (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_active.get(); + } else if(m_load(addr)) { + m_sl->logerror("bitwise load (%s)\n", m_sl->machine().describe_context()); + m_sl->m_loaded_bank = m_sl->m_current_bank; + m_sl->m_state = m_sl->m_s_bit_set_odd.get(); + } +} + +// bitwise, change one bit + +atari_slapstic_device::bit_set::bit_set(atari_slapstic_device *sl, const checker &check, const slapstic_data *data, bool is_odd) : state(sl), m_is_odd(is_odd) { - const char *mode = "UNKNOWN"; - switch (state) - { - case DISABLED: mode = "DISABLED"; break; - case ENABLED: mode = "ENABLED"; break; - case ALTERNATE1: mode = "ALTERNATE1"; break; - case ALTERNATE2: mode = "ALTERNATE2"; break; - case ALTERNATE3: mode = "ALTERNATE3"; break; - case BITWISE1: mode = "BITWISE1"; break; - case BITWISE2: mode = "BITWISE2"; break; - case BITWISE3: mode = "BITWISE3"; break; - case ADDITIVE1: mode = "ADDITIVE1"; break; - case ADDITIVE2: mode = "ADDITIVE2"; break; - case ADDITIVE3: mode = "ADDITIVE3"; break; + m_reset = check.test_reset(); + m_clear0 = check.test_in(is_odd ? data->bit3c0 : data->bit3s1); + m_set0 = check.test_in(is_odd ? data->bit3s0 : data->bit3c1); + m_clear1 = check.test_in(is_odd ? data->bit3c1 : data->bit3s0); + m_set1 = check.test_in(is_odd ? data->bit3s1 : data->bit3c0); + m_commit = check.test_in(data->bit4); +} + +void atari_slapstic_device::bit_set::test(offs_t addr) const +{ + if(m_reset(addr)) { + m_sl->logerror("reset (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_active.get(); + } else if(m_clear0(addr)) { + m_sl->logerror("bitwise clear 0 (%s)\n", m_sl->machine().describe_context()); + m_sl->m_loaded_bank &= ~1; + m_sl->m_state = m_is_odd ? m_sl->m_s_bit_set_even.get() : m_sl->m_s_bit_set_odd.get(); + } else if(m_set0(addr)) { + m_sl->logerror("bitwise set 0 (%s)\n", m_sl->machine().describe_context()); + m_sl->m_loaded_bank |= 1; + m_sl->m_state = m_is_odd ? m_sl->m_s_bit_set_even.get() : m_sl->m_s_bit_set_odd.get(); + } else if(m_clear1(addr)) { + m_sl->logerror("bitwise clear 1 (%s)\n", m_sl->machine().describe_context()); + m_sl->m_loaded_bank &= ~2; + m_sl->m_state = m_is_odd ? m_sl->m_s_bit_set_even.get() : m_sl->m_s_bit_set_odd.get(); + } else if(m_set1(addr)) { + m_sl->logerror("bitwise set 1 (%s)\n", m_sl->machine().describe_context()); + m_sl->m_loaded_bank |= 2; + m_sl->m_state = m_is_odd ? m_sl->m_s_bit_set_even.get() : m_sl->m_s_bit_set_odd.get(); + } else if(m_commit(addr)) { + m_sl->logerror("bitwise commit %d (%s)\n", m_sl->m_loaded_bank, m_sl->machine().describe_context()); + m_sl->commit_bank(); + m_sl->m_state = m_sl->m_s_idle.get(); + } +} + + +// add, load the current bank state + +atari_slapstic_device::add_load::add_load(atari_slapstic_device *sl, const checker &check, const slapstic_data *data) : state(sl) +{ + m_reset = check.test_reset(); + m_load = check.test_in(data->add2); +} + +void atari_slapstic_device::add_load::test(offs_t addr) const +{ + if(m_reset(addr)) { + m_sl->logerror("reset (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_active.get(); + } else if(m_load(addr)) { + m_sl->logerror("add load (%s)\n", m_sl->machine().describe_context()); + m_sl->m_loaded_bank = m_sl->m_current_bank; + m_sl->m_state = m_sl->m_s_add_set.get(); + } else { + m_sl->logerror("add sequence break at load (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_active.get(); } +} + - logerror("%s: %04x B=%d AB=%d %s %s\n", machine().time().as_string(), offset, current_bank, add_bank, mode, machine().describe_context()); +// add, change the bank number + +atari_slapstic_device::add_set::add_set(atari_slapstic_device *sl, const checker &check, const slapstic_data *data) : state(sl) +{ + m_reset = check.test_reset(); + m_add1 = check.test_in(data->addplus1); + m_add2 = check.test_in(data->addplus2); + m_end = check.test_in(data->add3); +} + +void atari_slapstic_device::add_set::test(offs_t addr) const +{ + if(m_reset(addr)) { + m_sl->logerror("reset (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_active.get(); + } else if(m_add1(addr)) { + m_sl->logerror("add +1 (%s)\n", m_sl->machine().describe_context()); + m_sl->m_loaded_bank = (m_sl->m_loaded_bank + 1) & 3; + } else if(m_add2(addr)) { + m_sl->logerror("add +2 (%s)\n", m_sl->machine().describe_context()); + m_sl->m_loaded_bank = (m_sl->m_loaded_bank + 2) & 3; + } else if(m_end(addr)) { + m_sl->logerror("add end (%s)\n", m_sl->machine().describe_context()); + m_sl->m_state = m_sl->m_s_alt_commit.get(); + } } diff --git a/src/mame/machine/slapstic.h b/src/mame/machine/slapstic.h index 27275a7779d..8d729dd02c4 100644 --- a/src/mame/machine/slapstic.h +++ b/src/mame/machine/slapstic.h @@ -25,127 +25,249 @@ DECLARE_DEVICE_TYPE(SLAPSTIC, atari_slapstic_device) * *************************************/ -struct mask_value +class atari_slapstic_device : public device_t { - int mask, value; -}; +public: + // construction/destruction + atari_slapstic_device(const machine_config &mconfig, const char *tag, device_t *owner, int chipnum) + : atari_slapstic_device(mconfig, tag, owner, u32(0)) + { + m_chipnum = chipnum; + } + atari_slapstic_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); -struct slapstic_data -{ - int bankstart; - int bank[4]; - - struct mask_value alt1; - struct mask_value alt2; - struct mask_value alt3; - struct mask_value alt4; - int altshift; - - struct mask_value bit1; - struct mask_value bit2c0; - struct mask_value bit2s0; - struct mask_value bit2c1; - struct mask_value bit2s1; - struct mask_value bit3; - - struct mask_value add1; - struct mask_value add2; - struct mask_value addplus1; - struct mask_value addplus2; - struct mask_value add3; -}; + template void set_bank(T &&tag) { m_bank.set_tag(std::forward(tag)); } + void set_view(memory_view &view) { m_view = &view; } + template void set_range(T &&tag, int index, offs_t start, offs_t end, offs_t mirror) { + m_space.set_tag(std::forward(tag), index); + m_start = start; + m_end = end; + m_mirror = mirror; + } + void set_chipnum(int chipnum) { m_chipnum = chipnum; } -/************************************* - * - * Shorthand - * - *************************************/ +protected: + virtual void device_start() override; + virtual void device_reset() override; + virtual void device_validity_check(validity_checker &valid) const override; -#define UNKNOWN 0xffff -#define NO_BITWISE \ - { UNKNOWN,UNKNOWN }, \ - { UNKNOWN,UNKNOWN }, \ - { UNKNOWN,UNKNOWN }, \ - { UNKNOWN,UNKNOWN }, \ - { UNKNOWN,UNKNOWN }, \ - { UNKNOWN,UNKNOWN } -#define NO_ADDITIVE \ - { UNKNOWN,UNKNOWN }, \ - { UNKNOWN,UNKNOWN }, \ - { UNKNOWN,UNKNOWN }, \ - { UNKNOWN,UNKNOWN }, \ - { UNKNOWN,UNKNOWN } +private: + struct mask_value { + u16 mask, value; + }; + + + struct slapstic_data { + u8 bankstart; + u16 bank[4]; + + mask_value alt1; + mask_value alt2; + mask_value alt3; + mask_value alt4; + int altshift; + + mask_value bit1; + mask_value bit2; + mask_value bit3c0; + mask_value bit3s0; + mask_value bit3c1; + mask_value bit3s1; + mask_value bit4; + + mask_value add1; + mask_value add2; + mask_value addplus1; + mask_value addplus2; + mask_value add3; + }; + + static const slapstic_data slapstic101; + // 102 has never been encountered + static const slapstic_data slapstic103; + static const slapstic_data slapstic104; + static const slapstic_data slapstic105; + static const slapstic_data slapstic106; + static const slapstic_data slapstic107; + static const slapstic_data slapstic108; + static const slapstic_data slapstic109; + static const slapstic_data slapstic110; + static const slapstic_data slapstic111; + static const slapstic_data slapstic112; + static const slapstic_data slapstic113; + static const slapstic_data slapstic114; + static const slapstic_data slapstic115; + static const slapstic_data slapstic116; + static const slapstic_data slapstic117; + static const slapstic_data slapstic118; + + static const slapstic_data *const slapstic_table[]; + + struct test { + offs_t m_m, m_v; + + test() : m_m(0), m_v(0) {} + test(offs_t m, offs_t v) : m_m(m), m_v(v) {} + bool operator()(offs_t a) const { return (a & m_m) == m_v; } + }; + + struct checker { + offs_t m_range_mask, m_range_value, m_shift, m_input_mask; + + checker(offs_t start, offs_t end, offs_t mirror, int data_width, int address_lines); + + test test_in(const mask_value &mv) const; + test test_any(const mask_value &mv) const; + + test test_inside() const; + + test test_reset() const; + test test_bank(u16 b) const; + }; + + struct state { + atari_slapstic_device *m_sl; + + state(atari_slapstic_device *sl) : m_sl(sl) {} + virtual ~state() = default; + + virtual void test(offs_t addr) const = 0; + }; + + struct idle : public state { + struct test m_reset; + + idle(atari_slapstic_device *sl, const checker &check, const slapstic_data *data); + virtual void test(offs_t addr) const override; + }; + + struct active_101_102 : public state { + struct test m_bank[4], m_alt, m_bit; + + active_101_102(atari_slapstic_device *sl, const checker &check, const slapstic_data *data); + virtual void test(offs_t addr) const override; + }; + + struct active_103_110 : public state { + struct test m_bank[4], m_alt, m_bit; + + active_103_110(atari_slapstic_device *sl, const checker &check, const slapstic_data *data); + virtual void test(offs_t addr) const override; + }; -#define MATCHES_MASK_VALUE(val, maskval) (((val) & (maskval).mask) == (maskval).value) + struct active_111_118 : public state { + struct test m_bank[4], m_alt, m_add; + + active_111_118(atari_slapstic_device *sl, const checker &check, const slapstic_data *data); + virtual void test(offs_t addr) const override; + }; + + struct alt_valid_101_102 : public state { + struct test m_reset, m_inside, m_valid; + alt_valid_101_102(atari_slapstic_device *sl, const checker &check, const slapstic_data *data); + virtual void test(offs_t addr) const override; + }; + struct alt_valid_103_110 : public state { + struct test m_reset, m_valid; -/************************************* - * - * Constants - * - *************************************/ + alt_valid_103_110(atari_slapstic_device *sl, const checker &check, const slapstic_data *data); + virtual void test(offs_t addr) const override; + }; -enum -{ - DISABLED, - ENABLED, - ALTERNATE1, - ALTERNATE2, - ALTERNATE3, - BITWISE1, - BITWISE2, - BITWISE3, - ADDITIVE1, - ADDITIVE2, - ADDITIVE3 -}; + struct alt_valid_111_118 : public state { + struct test m_reset, m_valid, m_add; + alt_valid_111_118(atari_slapstic_device *sl, const checker &check, const slapstic_data *data); + virtual void test(offs_t addr) const override; + }; -class atari_slapstic_device : public device_t -{ -public: - // construction/destruction - atari_slapstic_device(const machine_config &mconfig, const char *tag, device_t *owner, int chipnum) - : atari_slapstic_device(mconfig, tag, owner, u32(0)) - { - m_chipnum = chipnum; - } + struct alt_select_101_110 : public state { + struct test m_reset, m_select; + int m_shift; - atari_slapstic_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + alt_select_101_110(atari_slapstic_device *sl, const checker &check, const slapstic_data *data, int shift); + virtual void test(offs_t addr) const override; + }; - template void set_bank(T &&tag) { m_bank.set_tag(std::forward(tag)); } + struct alt_select_111_118 : public state { + struct test m_reset, m_select; + int m_shift; - int bank(); - int tweak(offs_t offset); + alt_select_111_118(atari_slapstic_device *sl, const checker &check, const slapstic_data *data, int shift); + virtual void test(offs_t addr) const override; + }; - void set_chipnum(int chipnum) { m_chipnum = chipnum; } + struct alt_commit : public state { + struct test m_reset, m_commit; - int m_chipnum; + alt_commit(atari_slapstic_device *sl, const checker &check, const slapstic_data *data); + virtual void test(offs_t addr) const override; + }; - u8 state; - u8 current_bank; - int access_68k; + struct bit_load : public state { + struct test m_reset, m_load; - u8 alt_bank; - u8 bit_bank; - u8 add_bank; - u8 bit_xor; + bit_load(atari_slapstic_device *sl, const checker &check, const slapstic_data *data); + virtual void test(offs_t addr) const override; + }; - struct slapstic_data slapstic; + struct bit_set : public state { + struct test m_reset, m_set0, m_clear0, m_set1, m_clear1, m_commit; + bool m_is_odd; - void slapstic_log(offs_t offset); + bit_set(atari_slapstic_device *sl, const checker &check, const slapstic_data *data, bool odd); + virtual void test(offs_t addr) const override; + }; -protected: - virtual void device_start() override; - virtual void device_reset() override; - virtual void device_validity_check(validity_checker &valid) const override; + struct add_load : public state { + struct test m_reset, m_load; + + add_load(atari_slapstic_device *sl, const checker &check, const slapstic_data *data); + virtual void test(offs_t addr) const override; + }; + + struct add_set : public state { + struct test m_reset, m_add1, m_add2, m_end; + + add_set(atari_slapstic_device *sl, const checker &check, const slapstic_data *data); + virtual void test(offs_t addr) const override; + }; + + + + int m_chipnum; -private: optional_memory_bank m_bank; + memory_view *m_view; + optional_address_space m_space; + offs_t m_start, m_end, m_mirror; + + std::unique_ptr m_s_idle; + std::unique_ptr m_s_active; + + std::unique_ptr m_s_alt_valid; + std::unique_ptr m_s_alt_select; + std::unique_ptr m_s_alt_commit; + + std::unique_ptr m_s_bit_load; + std::unique_ptr m_s_bit_set_odd; + std::unique_ptr m_s_bit_set_even; + + std::unique_ptr m_s_add_load; + std::unique_ptr m_s_add_set; + + const state *m_state; + + u8 m_current_bank; + u8 m_loaded_bank; + + void change_bank(int bank); + void commit_bank(); }; #endif // MAME_INCLUDES_SLAPSTIC_H diff --git a/src/mame/video/atarisy2.cpp b/src/mame/video/atarisy2.cpp index 52029258f87..05770e32924 100644 --- a/src/mame/video/atarisy2.cpp +++ b/src/mame/video/atarisy2.cpp @@ -27,7 +27,7 @@ TILE_GET_INFO_MEMBER(atarisy2_state::get_alpha_tile_info) TILE_GET_INFO_MEMBER(atarisy2_state::get_playfield_tile_info) { - uint16_t data = m_playfield_tilemap->basemem_read(tile_index); + uint16_t data = tile_index < 020000/2 ? m_playfieldt[tile_index] : m_playfieldb[tile_index & (020000/2 - 1)]; int code = (m_playfield_tile_bank[(data >> 10) & 1] << 10) | (data & 0x3ff); int color = (data >> 11) & 7; tileinfo.set(0, code, color, 0); @@ -79,7 +79,6 @@ void atarisy2_state::video_start() { // reset the statics m_yscroll_reset_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(atarisy2_state::reset_yscroll_callback),this)); - m_vrambank->set_bank(0); // save states save_item(NAME(m_playfield_tile_bank)); @@ -181,32 +180,6 @@ rgb_t atarisy2_state::RRRRGGGGBBBBIIII(uint32_t raw) } -/************************************* - * - * Video RAM bank read/write handlers - * - *************************************/ - -uint16_t atarisy2_state::slapstic_r(offs_t offset) -{ - int result = m_slapstic_region[offset + 0100000/2]; - m_slapstic->tweak(offset); - - /* an extra tweak for the next opcode fetch */ - m_vrambank->set_bank(m_slapstic->tweak(0x1234)); - return result; -} - - -void atarisy2_state::slapstic_w(offs_t offset, uint16_t data) -{ - m_slapstic->tweak(offset); - - /* an extra tweak for the next opcode fetch */ - m_vrambank->set_bank(m_slapstic->tweak(0x1234)); -} - - /************************************* * * Video RAM read/write handlers @@ -221,6 +194,18 @@ void atarisy2_state::spriteram_w(offs_t offset, uint16_t data, uint16_t mem_mask COMBINE_DATA(&m_mob->spriteram()[offset]); } +void atarisy2_state::playfieldt_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(m_playfieldt + offset); + m_playfield_tilemap->mark_tile_dirty(offset); +} + +void atarisy2_state::playfieldb_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(m_playfieldb + offset); + m_playfield_tilemap->mark_tile_dirty(offset + 020000/2); +} + /************************************* * -- cgit v1.2.3