diff options
| author | 2026-05-04 03:40:40 +0900 | |
|---|---|---|
| committer | 2026-05-04 04:40:40 +1000 | |
| commit | a92540ec95bbdf814974555b547e91c188cc496b (patch) | |
| tree | 3164d328742cfd370212500a57f545a36a6a9c2e | |
| parent | 37ee3f7cd3fbc151b80dff0d620b2cea2dfe54c0 (diff) | |
cinematronics/leland*.cpp: Updated and cleaned up code: (#15296)
* Added notes about video RAM configuration (match hardware - 4 64K*4 bit chips populated in hardware; double buffered?)
* Use memory_view for palette RAM and battery-backed RAM access.
* Simplified master CPU bank switching, simplified XROM loading and access.
* Reduced literal tag usage, use explicitly sized integers in saved states.
* Suppress side effects for debugger reads.
* Reduced duplication, made naming more consistent.
* Use hexadecimal masks, use BIT helper to extract bits.
* Use references rather than pointers, reduced preprocessor macros.
| -rw-r--r-- | src/mame/cinematronics/leland.cpp | 136 | ||||
| -rw-r--r-- | src/mame/cinematronics/leland.h | 127 | ||||
| -rw-r--r-- | src/mame/cinematronics/leland_a.cpp | 68 | ||||
| -rw-r--r-- | src/mame/cinematronics/leland_a.h | 6 | ||||
| -rw-r--r-- | src/mame/cinematronics/leland_m.cpp | 459 | ||||
| -rw-r--r-- | src/mame/cinematronics/leland_v.cpp | 146 |
6 files changed, 431 insertions, 511 deletions
diff --git a/src/mame/cinematronics/leland.cpp b/src/mame/cinematronics/leland.cpp index 720bfac3b4c..d502297bd63 100644 --- a/src/mame/cinematronics/leland.cpp +++ b/src/mame/cinematronics/leland.cpp @@ -35,6 +35,9 @@ Known bugs: * none at this time + TODO: + * accessing upper half of video RAM is not implemented (double buffering?) + **************************************************************************** Ivan 'Ironman' Stewart's Super Off-Road, Leland, 1989 @@ -208,9 +211,7 @@ Notes: /* Master Clock2 is for Asylum, Ataxx, Brute Force, Danny Sullivan's Indy Heat, World Soccer Finals */ -#define MASTER_CLOCK2 XTAL_28_63636MHZ -#define MASTER_CLOCK XTAL(12'000'000) -#define VIDEO_CLOCK XTAL(14'318'181) +//#define MASTER_CLOCK2 XTAL(28'636'363) /************************************* @@ -219,16 +220,24 @@ Notes: * *************************************/ -void leland_state::master_map_program(address_map &map) +void leland_state::master_common_map_program(address_map &map) { - map(0x0000, 0x1fff).rom(); - map(0x2000, 0x9fff).bankr(m_master_bankslot[0]); - map(0xa000, 0xdfff).bankr(m_master_bankslot[1]).w(FUNC(leland_state::leland_battery_ram_w)); + map(0x0000, 0x1fff).rom().region("master", 0); map(0xe000, 0xefff).ram().share(m_mainram); - map(0xf000, 0xf3ff).rw(FUNC(leland_state::gated_paletteram_r), FUNC(leland_state::gated_paletteram_w)).share("palette"); + map(0xf000, 0xf3ff).view(m_palette_view); + m_palette_view[0](0xf000, 0xf3ff).ram().w(m_palette, FUNC(palette_device::write8)).share("palette"); map(0xf800, 0xf801).w(FUNC(leland_state::master_video_addr_w)); } + +void leland_state::master_map_program(address_map &map) +{ + master_common_map_program(map); + map(0x2000, 0xdfff).bankr(m_master_bankslot); + map(0xa000, 0xdfff).view(m_battery_ram_view); + m_battery_ram_view[0](0xa000, 0xdfff).ram().share(m_battery_ram); +} + void leland_state::master_map_io(address_map &map) { map.global_mask(0xff); @@ -236,6 +245,16 @@ void leland_state::master_map_io(address_map &map) map(0xfd, 0xff).rw(FUNC(leland_state::master_analog_key_r), FUNC(leland_state::master_analog_key_w)); } + +void redline_state::master_redline_map_program(address_map &map) +{ + master_common_map_program(map); + map(0x2000, 0x9fff).bankr(m_master_bankslot); + map(0xa000, 0xdfff).rom().region("master", 0xa000); + map(0xa000, 0xdfff).view(m_battery_ram_view); + m_battery_ram_view[0](0xa000, 0xdfff).ram().share(m_battery_ram); +} + void redline_state::master_redline_map_io(address_map &map) { map.global_mask(0xff); @@ -248,14 +267,20 @@ void redline_state::master_redline_map_io(address_map &map) void ataxx_state::master_map_program_2(address_map &map) { - map(0x0000, 0x1fff).rom(); - map(0x2000, 0x9fff).bankr(m_master_bankslot[0]); - map(0xa000, 0xdfff).bankr(m_master_bankslot[1]).w(FUNC(ataxx_state::ataxx_battery_ram_w)); + map(0x0000, 0x1fff).rom().region("master", 0); + map(0x2000, 0x9fff).bankr(m_master_bankslot); + map(0xa000, 0xdfff).rom().region("master", 0xa000); + map(0xa000, 0xdfff).view(m_battery_ram_view); + m_battery_ram_view[0](0xa000, 0xdfff).ram().share(m_battery_ram); + m_battery_ram_view[1](0xa000, 0xdfff).rw(FUNC(ataxx_state::qram_r), FUNC(ataxx_state::qram_w)); map(0xe000, 0xf7ff).ram().share(m_mainram); - map(0xf800, 0xffff).rw(FUNC(ataxx_state::paletteram_and_misc_r), FUNC(ataxx_state::paletteram_and_misc_w)).share("palette"); + map(0xf800, 0xfffb).ram().share(m_tram); + map(0xfff8, 0xfff9).w(FUNC(ataxx_state::master_video_addr_w)); + map(0xfffc, 0xffff).rw(FUNC(ataxx_state::xrom_r), FUNC(ataxx_state::xrom_w)); + map(0xf800, 0xffff).view(m_palette_view); + m_palette_view[0](0xf800, 0xffff).ram().w(m_palette, FUNC(palette_device::write8)).share("palette"); } - void ataxx_state::master_map_io_2(address_map &map) { map.global_mask(0xff); @@ -291,33 +316,32 @@ void redline_state::slave_large_map_program(address_map &map) { map(0x0000, 0x1fff).rom(); map(0x4000, 0xbfff).bankr(m_slave_bankslot); - map(0xc000, 0xc000).w(FUNC(leland_state::slave_large_banksw_w)); + map(0xc000, 0xc000).w(FUNC(redline_state::slave_large_banksw_w)); map(0xe000, 0xefff).ram(); - map(0xf800, 0xf801).w(FUNC(leland_state::slave_video_addr_w)); - map(0xf802, 0xf802).r(FUNC(leland_state::raster_r)); + map(0xf800, 0xf801).w(FUNC(redline_state::slave_video_addr_w)); + map(0xf802, 0xf802).r(FUNC(redline_state::raster_r)); } void leland_state::slave_map_io(address_map &map) { map.global_mask(0xff); - map(0x00, 0x1f).rw(FUNC(leland_state::leland_svram_port_r), FUNC(leland_state::leland_svram_port_w)); - map(0x40, 0x5f).rw(FUNC(leland_state::leland_svram_port_r), FUNC(leland_state::leland_svram_port_w)); + map(0x00, 0x1f).mirror(0x40).rw(FUNC(leland_state::leland_svram_port_r), FUNC(leland_state::leland_svram_port_w)); } -void leland_state::slave_map_program(address_map &map) +void ataxx_state::slave_map_program(address_map &map) { map(0x0000, 0x1fff).rom(); map(0x2000, 0x9fff).bankr(m_slave_bankslot); map(0xa000, 0xdfff).rom(); map(0xe000, 0xefff).ram(); - map(0xfffc, 0xfffd).w(FUNC(leland_state::slave_video_addr_w)); - map(0xfffe, 0xfffe).r(FUNC(leland_state::raster_r)); - map(0xffff, 0xffff).w(FUNC(leland_state::ataxx_slave_banksw_w)); + map(0xfffc, 0xfffd).w(FUNC(ataxx_state::slave_video_addr_w)); + map(0xfffe, 0xfffe).r(FUNC(ataxx_state::raster_r)); + map(0xffff, 0xffff).w(FUNC(ataxx_state::ataxx_slave_banksw_w)); } -void leland_state::asylum_slave_map_program(address_map &map) +void ataxx_state::asylum_slave_map_program(address_map &map) { slave_map_program(map); map(0xf000, 0xfffb).ram(); @@ -1125,12 +1149,12 @@ INPUT_PORTS_END void leland_state::leland(machine_config &config) { /* basic machine hardware */ - Z80(config, m_master, MASTER_CLOCK/2); + Z80(config, m_master, XTAL(12'000'000)/2); m_master->set_addrmap(AS_PROGRAM, &leland_state::master_map_program); m_master->set_addrmap(AS_IO, &leland_state::master_map_io); m_master->set_vblank_int("screen", FUNC(leland_state::leland_master_interrupt)); - Z80(config, m_slave, MASTER_CLOCK/2); + Z80(config, m_slave, XTAL(12'000'000)/2); m_slave->set_addrmap(AS_PROGRAM, &leland_state::slave_small_map_program); m_slave->set_addrmap(AS_IO, &leland_state::slave_map_io); @@ -1167,6 +1191,7 @@ void redline_state::redline(machine_config &config) leland(config); /* basic machine hardware */ + m_master->set_addrmap(AS_PROGRAM, &redline_state::master_redline_map_program); m_master->set_addrmap(AS_IO, &redline_state::master_redline_map_io); /* sound hardware */ @@ -2820,7 +2845,7 @@ ROM_START( ataxx ) ROM_LOAD( "e-302-31010-01.u102", 0x80000, 0x20000, CRC(a951228c) SHA1(7ec5cf4d0aa3702be9236d155bea373a06c0be03) ) ROM_LOAD( "e-302-31011-01.u103", 0xa0000, 0x20000, CRC(ed326164) SHA1(8706192f525ece200587cee7e7beb4a1975bf63e) ) - ROM_REGION( 0x40000, "xrom", ROMREGION_ERASEFF ) // X-ROM (data used by main processor) + ROM_REGION16_LE( 0x40000, "xrom", ROMREGION_ERASEFF ) // X-ROM (data used by master z80) // Empty / not used ROM_REGION16_BE( 0x100, "eeprom", 0 ) @@ -2853,7 +2878,7 @@ ROM_START( ataxxa ) ROM_LOAD( "e-302-31010-01.u102", 0x80000, 0x20000, CRC(a951228c) SHA1(7ec5cf4d0aa3702be9236d155bea373a06c0be03) ) ROM_LOAD( "e-302-31011-01.u103", 0xa0000, 0x20000, CRC(ed326164) SHA1(8706192f525ece200587cee7e7beb4a1975bf63e) ) - ROM_REGION( 0x40000, "xrom", ROMREGION_ERASEFF ) // X-ROM (data used by main processor) + ROM_REGION16_LE( 0x40000, "xrom", ROMREGION_ERASEFF ) // X-ROM (data used by master z80) // Empty / not used ROM_REGION16_BE( 0x100, "eeprom", 0 ) @@ -2886,7 +2911,7 @@ ROM_START( ataxxe ) ROM_LOAD( "e-302-31010-01.u102", 0x80000, 0x20000, CRC(a951228c) SHA1(7ec5cf4d0aa3702be9236d155bea373a06c0be03) ) ROM_LOAD( "e-302-31011-01.u103", 0xa0000, 0x20000, CRC(ed326164) SHA1(8706192f525ece200587cee7e7beb4a1975bf63e) ) - ROM_REGION( 0x40000, "xrom", ROMREGION_ERASEFF ) // X-ROM (data used by main processor) + ROM_REGION16_LE( 0x40000, "xrom", ROMREGION_ERASEFF ) // X-ROM (data used by master z80) // Empty / not used ROM_REGION16_BE( 0x100, "eeprom", 0 ) @@ -2919,7 +2944,7 @@ ROM_START( ataxxj ) ROM_LOAD( "e-302-31010-01.u102", 0x80000, 0x20000, CRC(a951228c) SHA1(7ec5cf4d0aa3702be9236d155bea373a06c0be03) ) ROM_LOAD( "e-302-31011-01.u103", 0xa0000, 0x20000, CRC(ed326164) SHA1(8706192f525ece200587cee7e7beb4a1975bf63e) ) - ROM_REGION( 0x40000, "xrom", ROMREGION_ERASEFF ) // X-ROM (data used by main processor) + ROM_REGION16_LE( 0x40000, "xrom", ROMREGION_ERASEFF ) // X-ROM (data used by master z80) // Empty / not used ROM_REGION16_BE( 0x100, "eeprom", 0 ) @@ -2967,9 +2992,9 @@ ROM_START( wsf ) ROM_LOAD( "e-302-30015-02.u149", 0x40000, 0x10000, CRC(b30c4ff3) SHA1(8bd709bd277584fc32983424873097300eb791c6) ) ROM_LOAD( "e-302-30016-02.u150", 0x50000, 0x10000, CRC(3bc8efac) SHA1(78451b935fba519603db0de2e2d06e83b3d4353a) ) - ROM_REGION( 0x20000, "xrom", 0 ) // X-ROM (data used by main processor) - ROM_LOAD( "e-302-30009-01.u68", 0x00000, 0x10000, CRC(f2fbfc15) SHA1(712cfa7b11135b1f568f38cc478ef5a3330d0608) ) - ROM_LOAD( "e-302-30010-01.u69", 0x10000, 0x10000, CRC(b4ed2d3b) SHA1(61c9d86b63cf000187a105c6eed967fecb2f3c1c) ) + ROM_REGION16_LE( 0x40000, "xrom", ROMREGION_ERASEFF ) // X-ROM (data used by master z80) + ROM_LOAD16_BYTE( "e-302-30009-01.u68", 0x00000, 0x10000, CRC(f2fbfc15) SHA1(712cfa7b11135b1f568f38cc478ef5a3330d0608) ) + ROM_LOAD16_BYTE( "e-302-30010-01.u69", 0x00001, 0x10000, CRC(b4ed2d3b) SHA1(61c9d86b63cf000187a105c6eed967fecb2f3c1c) ) ROM_REGION( 0x20000, "custom:ext", 0 ) // externally clocked DAC data ROM_LOAD( "e-302-30021-02.u8", 0x00000, 0x20000, CRC(a8f97be4) SHA1(738a2ec96a923ef3b3c62425365d4455ba200119) ) @@ -3010,9 +3035,9 @@ ROM_START( wsf3 ) ROM_LOAD( "e-302-30015-01.u149", 0x40000, 0x10000, CRC(5d9064f2) SHA1(7a68a379aa6a6cd0518e8a4107b2e646f5700c2b) ) ROM_LOAD( "e-302-30016-01.u150", 0x50000, 0x10000, CRC(d76389cd) SHA1(2b7e6cd662ffde177b110ad0ed2e42fe4ccf811f) ) - ROM_REGION( 0x20000, "xrom", 0 ) // X-ROM (data used by main processor) - ROM_LOAD( "e-302-30009-01.u68", 0x00000, 0x10000, CRC(f2fbfc15) SHA1(712cfa7b11135b1f568f38cc478ef5a3330d0608) ) - ROM_LOAD( "e-302-30010-01.u69", 0x10000, 0x10000, CRC(b4ed2d3b) SHA1(61c9d86b63cf000187a105c6eed967fecb2f3c1c) ) + ROM_REGION16_LE( 0x40000, "xrom", ROMREGION_ERASEFF ) // X-ROM (data used by master z80) + ROM_LOAD16_BYTE( "e-302-30009-01.u68", 0x00000, 0x10000, CRC(f2fbfc15) SHA1(712cfa7b11135b1f568f38cc478ef5a3330d0608) ) + ROM_LOAD16_BYTE( "e-302-30010-01.u69", 0x00001, 0x10000, CRC(b4ed2d3b) SHA1(61c9d86b63cf000187a105c6eed967fecb2f3c1c) ) ROM_REGION( 0x20000, "custom:ext", 0 ) // externally clocked DAC data ROM_LOAD( "e-302-30021-01.u8", 0x00000, 0x20000, CRC(bb91dc10) SHA1(a7d8676867b5cfe1049040e593985af57ef04334) ) @@ -3066,11 +3091,9 @@ ROM_START( indyheat ) ROM_LOAD( "e-302-33005-01.u149", 0x80000, 0x20000, CRC(29056791) SHA1(343452b883f139eb09da6b5f384aa680d3a2218c) ) ROM_LOAD( "e-302-33006-01.u150", 0xa0000, 0x20000, CRC(cb73dd6a) SHA1(60aabedbab409acaf8ba4f2366125290825971a4) ) - ROM_REGION( 0x40000, "xrom", 0 ) // X-ROM (data used by main processor) - ROM_LOAD( "e-302-33015-01.u68", 0x00000, 0x10000, CRC(9e88efb3) SHA1(983bc22c9401b9d6c959dd211b6b7dfa1a6c14e2) ) - ROM_CONTINUE( 0x20000, 0x10000 ) - ROM_LOAD( "e-302-33016-01.u69", 0x10000, 0x10000, CRC(aa39fcb3) SHA1(0cb328d784cda3e0dff3a018f52f9b06bc5d46b8) ) - ROM_CONTINUE( 0x30000, 0x10000 ) + ROM_REGION16_LE( 0x40000, "xrom", 0 ) // X-ROM (data used by master z80) + ROM_LOAD16_BYTE( "e-302-33015-01.u68", 0x00000, 0x20000, CRC(9e88efb3) SHA1(983bc22c9401b9d6c959dd211b6b7dfa1a6c14e2) ) + ROM_LOAD16_BYTE( "e-302-33016-01.u69", 0x00001, 0x20000, CRC(aa39fcb3) SHA1(0cb328d784cda3e0dff3a018f52f9b06bc5d46b8) ) ROM_REGION( 0x40000, "custom:ext", 0 ) // externally clocked DAC data ROM_LOAD( "e-302-33025-01.u8", 0x00000, 0x20000, CRC(9f16e5b6) SHA1(0ea814db7f647f39d11dcde793a17831fca3bddd) ) @@ -3115,11 +3138,9 @@ ROM_START( brutforc ) ROM_LOAD( "u149", 0x100000, 0x40000, CRC(cf48401c) SHA1(70ba8f2d5f81795c26c2a552c29c913c5d3bd784) ) ROM_LOAD( "u150", 0x140000, 0x40000, CRC(ca9e1e33) SHA1(f9889042b536e1fb5521702bc807d5aa0e6a25d1) ) - ROM_REGION( 0x40000, "xrom", 0 ) // X-ROM (data used by main processor) - ROM_LOAD( "u68", 0x00000, 0x10000, CRC(77c8de62) SHA1(ae15f84b7bf3d6705edf9f41d8de7b6ecab2bcf9) ) - ROM_CONTINUE( 0x20000, 0x10000 ) - ROM_LOAD( "u69", 0x10000, 0x10000, CRC(113aa6d5) SHA1(d032a04338e12135ba410afd71cf9538e99eb109) ) - ROM_CONTINUE( 0x30000, 0x10000 ) + ROM_REGION16_LE( 0x40000, "xrom", 0 ) // X-ROM (data used by master z80) + ROM_LOAD16_BYTE( "u68", 0x00000, 0x20000, CRC(77c8de62) SHA1(ae15f84b7bf3d6705edf9f41d8de7b6ecab2bcf9) ) + ROM_LOAD16_BYTE( "u69", 0x00001, 0x20000, CRC(113aa6d5) SHA1(d032a04338e12135ba410afd71cf9538e99eb109) ) ROM_REGION( 0x80000, "custom:ext", 0 ) // externally clocked DAC data ROM_LOAD( "u8", 0x00000, 0x20000, CRC(1e0ead72) SHA1(879d5ba244238af21f6a516494c504721570ec15) ) @@ -3172,11 +3193,9 @@ ROM_START( asylum ) ROM_LOAD( "asy-chr4.149", 0x100000, 0x40000, CRC(dbc2b155) SHA1(ba0d90b5a6acc53ecd02317cb82b630451e9d0e9) ) ROM_LOAD( "asy-chr5.150", 0x140000, 0x40000, CRC(9675e44f) SHA1(d2633d21fa9e798b8f96d96fdce5bb99a7dc5ba5) ) - ROM_REGION( 0x40000, "xrom", 0 ) // X-ROM (data used by main processor) - ROM_LOAD( "asy-m4.68", 0x00000, 0x10000, CRC(77c8de62) SHA1(ae15f84b7bf3d6705edf9f41d8de7b6ecab2bcf9) ) - ROM_CONTINUE( 0x20000, 0x10000 ) - ROM_LOAD( "asy-m5.69", 0x10000, 0x10000, CRC(bfc50d6c) SHA1(3239242358e8336354a9bd35f75f9057f079b298) ) - ROM_CONTINUE( 0x30000, 0x10000 ) + ROM_REGION16_LE( 0x40000, "xrom", 0 ) // X-ROM (data used by master z80) + ROM_LOAD16_BYTE( "asy-m4.68", 0x00000, 0x20000, CRC(77c8de62) SHA1(ae15f84b7bf3d6705edf9f41d8de7b6ecab2bcf9) ) + ROM_LOAD16_BYTE( "asy-m5.69", 0x00001, 0x20000, CRC(bfc50d6c) SHA1(3239242358e8336354a9bd35f75f9057f079b298) ) ROM_REGION( 0x80000, "custom:ext", 0 ) // externally clocked DAC data ROM_LOAD( "asy-65.8", 0x00000, 0x20000, CRC(624ad02f) SHA1(ce2dd0d11ff39a8e04d1c27cdaca3f068e6fbcf2) ) @@ -3211,8 +3230,7 @@ void leland_state::init_cerberus() { /* master CPU bankswitching */ m_update_master_bank = &leland_state::cerberus_bankswitch; - m_master_bankslot[0]->set_base(memregion("master")->base() + 0x2000); - m_master_bankslot[1]->set_base(memregion("master")->base() + 0xa000); + m_master_bankslot->set_base(memregion("master")->base() + 0x2000); m_slave_bankslot->set_base(memregion("slave")->base() + 0x2000); /* set up the master CPU I/O ports */ @@ -3265,7 +3283,7 @@ void leland_state::init_alleymas() /* kludge warning: the game uses location E0CA to determine if the joysticks are available */ /* it gets cleared by the code, but there is no obvious way for the value to be set to a */ /* non-zero value. If the value is zero, the joystick is never read. */ - m_master->space(AS_PROGRAM).install_write_handler(0xe0ca, 0xe0ca, write8smo_delegate(*this, FUNC(leland_state::alleymas_joystick_kludge))); + m_master->space(AS_PROGRAM).install_write_handler(0xe0ca, 0xe0ca, write8smo_delegate(*this, FUNC(leland_state::alleymas_joystick_kludge_w))); m_alleymas_kludge_mem = m_mainram + (0xe0ca - 0xe000); } @@ -3518,16 +3536,6 @@ void ataxx_state::init_ataxx() } -void ataxx_state::init_ataxxj() -{ - rotate_memory("master"); - rotate_memory("slave"); - - /* set up additional input ports */ - m_master->space(AS_IO).install_read_handler(0x00, 0x03, read8sm_delegate(*this, FUNC(ataxx_state::ataxx_trackball_r))); -} - - void ataxx_state::init_wsf() { rotate_memory("master"); @@ -3634,7 +3642,7 @@ GAME( 1990, pigouta, pigout, lelandi, pigout, redline_state, init_pigo GAME( 1990, ataxx, 0, ataxx, ataxx, ataxx_state, init_ataxx, ROT0, "Leland Corporation", "Ataxx (rev 5)", 0 ) GAME( 1990, ataxxa, ataxx, ataxx, ataxx, ataxx_state, init_ataxx, ROT0, "Leland Corporation", "Ataxx (rev 4)", 0 ) GAME( 1990, ataxxe, ataxx, ataxx, ataxx, ataxx_state, init_ataxx, ROT0, "Leland Corporation", "Ataxx (Europe)", 0 ) -GAME( 1990, ataxxj, ataxx, ataxx, ataxx, ataxx_state, init_ataxxj, ROT0, "Leland Corporation (Capcom license)", "Ataxx (Japan)", 0 ) +GAME( 1990, ataxxj, ataxx, ataxx, ataxx, ataxx_state, init_ataxx, ROT0, "Leland Corporation (Capcom license)", "Ataxx (Japan)", 0 ) GAME( 1990, wsf, 0, wsf, wsf, ataxx_state, init_wsf, ROT0, "Leland Corporation", "World Soccer Finals (rev 4)", 0 ) GAME( 1990, wsf3, wsf, wsf, wsf, ataxx_state, init_wsf, ROT0, "Leland Corporation", "World Soccer Finals (rev 3)", 0 ) GAME( 1991, indyheat, 0, wsf, indyheat, ataxx_state, init_indyheat, ROT0, "Leland Corporation", "Danny Sullivan's Indy Heat (rev 1)", 0 ) diff --git a/src/mame/cinematronics/leland.h b/src/mame/cinematronics/leland.h index 5a65a19f453..d1134c47511 100644 --- a/src/mame/cinematronics/leland.h +++ b/src/mame/cinematronics/leland.h @@ -13,13 +13,11 @@ #include "machine/eepromser.h" #include "sound/dac.h" #include "sound/ay8910.h" + #include "emupal.h" #include "screen.h" #include "tilemap.h" -#define LELAND_BATTERY_RAM_SIZE 0x4000 -#define ATAXX_EXTRA_TRAM_SIZE 0x800 - class leland_80186_sound_device; @@ -31,15 +29,17 @@ public: , m_master(*this, "master") , m_slave(*this, "slave") , m_mainram(*this, "mainram") - , m_master_bankslot(*this, "masterbank_%u", 0U) + , m_master_bankslot(*this, "masterbank") , m_master_base(*this, "master") , m_slave_bankslot(*this, "slavebank") , m_slave_base(*this, "slave") , m_eeprom(*this, "eeprom") - , m_battery_ram(*this, "battery", 0x4000, ENDIANNESS_LITTLE) + , m_battery_ram(*this, "battery") , m_palette(*this, "palette") , m_screen(*this, "screen") , m_gfxdecode(*this, "gfxdecode") + , m_palette_view(*this, "palette_view") + , m_battery_ram_view(*this, "battery_ram_view") , m_io_in(*this, "IN%u", 0U) , m_io_an(*this, "AN%u", 0U) , m_dac(*this, "dac%u", 0U) @@ -67,63 +67,38 @@ public: void mayhem_bankswitch(); void dangerz_bankswitch(); void basebal2_bankswitch(); - void redline_bankswitch(); - void offroad_bankswitch(); + void redline_bankswitch(); void viper_bankswitch(); - - u8 raster_r(); - void slave_video_addr_w(offs_t offset, u8 data); - void slave_large_banksw_w(u8 data); - void master_video_addr_w(offs_t offset, u8 data); - - TIMER_CALLBACK_MEMBER(ataxx_interrupt_callback); + void offroad_bankswitch(); protected: required_device<cpu_device> m_master; required_device<cpu_device> m_slave; required_shared_ptr<u8> m_mainram; - required_memory_bank_array<2> m_master_bankslot; + required_memory_bank m_master_bankslot; required_region_ptr<u8> m_master_base; required_memory_bank m_slave_bankslot; required_region_ptr<u8> m_slave_base; required_device<eeprom_serial_93cxx_device> m_eeprom; - memory_share_creator<u8> m_battery_ram; + required_shared_ptr<u8> m_battery_ram; required_device<palette_device> m_palette; required_device<screen_device> m_screen; required_device<gfxdecode_device> m_gfxdecode; + memory_view m_palette_view; + memory_view m_battery_ram_view; optional_ioport_array<4> m_io_in; optional_ioport_array<6> m_io_an; emu_timer *m_master_int_timer = nullptr; - u8 m_battery_ram_enable = 0U; - - void rotate_memory(const char *cpuname); - int dial_compute_value(int new_val, int indx); u8 m_dial_last_input[4]{}; u8 m_dial_last_result[4]{}; u8 m_analog_result = 0U; - int m_dangerz_x = 0; - int m_dangerz_y = 0; - - void init_master_ports(u8 mvram_base, u8 io_base); - void (leland_state::*m_update_master_bank)(); - - int vram_port_r(offs_t offset, int num); - void vram_port_w(offs_t offset, u8 data, int num); - - u8 m_wcol_enable = 0U; - - u8 master_analog_key_r(offs_t offset); - void master_analog_key_w(offs_t offset, u8 data); - u8 dangerz_input_y_r(); - u8 dangerz_input_x_r(); - u8 dangerz_input_upper_r(); - void scroll_w(offs_t offset, u8 data); - void leland_master_alt_bankswitch_w(u8 data); + s32 m_dangerz_x = 0; + s32 m_dangerz_y = 0; tilemap_t *m_tilemap = nullptr; u16 m_xscroll = 0U; @@ -133,17 +108,43 @@ protected: struct vram_state_data { + u8 m_buffer = 0U; // MSB of address u16 m_addr = 0U; u8 m_latch[2]{}; }; struct vram_state_data m_vram_state[2]; - void slave_map_program(address_map &map) ATTR_COLD; - void asylum_slave_map_program(address_map &map) ATTR_COLD; + void rotate_memory(const char *cpuname); + + int dial_compute_value(int new_val, int indx); + void init_master_ports(u8 mvram_base, u8 io_base); + void (leland_state::*m_update_master_bank)(); + + void update_battery_ram_view(bool enable); + + void init_vram(); + + int vram_port_r(offs_t offset, int num); + void vram_port_w(offs_t offset, u8 data, int num); + + u8 master_analog_key_r(offs_t offset); + void master_analog_key_w(offs_t offset, u8 data); + u8 dangerz_input_y_r(); + u8 dangerz_input_x_r(); + u8 dangerz_input_upper_r(); + void scroll_w(offs_t offset, u8 data); + void leland_master_alt_bankswitch_w(u8 data); TIMER_CALLBACK_MEMBER(leland_delayed_mvram_w); + u8 raster_r(); + void slave_video_addr_w(offs_t offset, u8 data); + void slave_large_banksw_w(u8 data); + void master_video_addr_w(offs_t offset, u8 data); + + void master_common_map_program(address_map &map) ATTR_COLD; + private: optional_device_array<dac_byte_interface, 2> m_dac; optional_device<ay8910_device> m_ay8910; @@ -168,14 +169,10 @@ private: u8 cerberus_dial_1_r(); u8 cerberus_dial_2_r(); - void alleymas_joystick_kludge(u8 data); - void leland_battery_ram_w(offs_t offset, u8 data); + void alleymas_joystick_kludge_w(u8 data); u8 leland_master_input_r(offs_t offset); void leland_master_output_w(offs_t offset, u8 data); - void gated_paletteram_w(offs_t offset, u8 data); - u8 gated_paletteram_r(offs_t offset); void slave_small_banksw_w(u8 data); - void ataxx_slave_banksw_w(u8 data); void leland_mvram_port_w(offs_t offset, u8 data); u8 leland_mvram_port_r(offs_t offset); void leland_svram_port_w(offs_t offset, u8 data); @@ -201,8 +198,8 @@ private: void leland_init_eeprom(u8 default_val, const u16 *data, u8 serial_offset, u8 serial_type); void ataxx_init_eeprom(const u16 *data); - int keycard_r(); - void keycard_w(int data); + u8 keycard_r(); + void keycard_w(u8 data); void master_map_io(address_map &map) ATTR_COLD; void master_map_program(address_map &map) ATTR_COLD; void slave_map_io(address_map &map) ATTR_COLD; @@ -244,6 +241,7 @@ private: u8 offroad_wheel_3_r(); void redline_master_alt_bankswitch_w(u8 data); + void master_redline_map_program(address_map &map) ATTR_COLD; void master_redline_map_io(address_map &map) ATTR_COLD; void slave_large_map_program(address_map &map) ATTR_COLD; @@ -258,11 +256,12 @@ public: : leland_state(mconfig, type, tag) , m_sound(*this, "custom") , m_xrom_base(*this, "xrom") + , m_qram(*this, "qram", 0x10000, ENDIANNESS_LITTLE) + , m_tram(*this, "tram") { } void init_ataxx(); - void init_ataxxj(); void init_wsf(); void init_indyheat(); void init_brutforc(); @@ -272,16 +271,24 @@ public: void wsf(machine_config &config); void asylum(machine_config &config); +protected: + virtual void machine_start() override ATTR_COLD; + virtual void machine_reset() override ATTR_COLD; + virtual void video_start() override ATTR_COLD; + private: u8 ataxx_trackball_r(offs_t offset); u8 indyheat_analog_r(offs_t offset); void indyheat_analog_w(offs_t offset, u8 data); - void ataxx_battery_ram_w(offs_t offset, u8 data); + u8 qram_r(offs_t offset); + void qram_w(offs_t offset, u8 data); + u8 ataxx_master_input_r(offs_t offset); void ataxx_master_output_w(offs_t offset, u8 data); - void paletteram_and_misc_w(offs_t offset, u8 data); - u8 paletteram_and_misc_r(offs_t offset); + void xrom_w(offs_t offset, u8 data); + u8 xrom_r(offs_t offset); + void ataxx_slave_banksw_w(u8 data); void ataxx_mvram_port_w(offs_t offset, u8 data); void ataxx_svram_port_w(offs_t offset, u8 data); u8 ataxx_mvram_port_r(offs_t offset); @@ -292,27 +299,25 @@ private: TILEMAP_MAPPER_MEMBER(ataxx_scan); TILE_GET_INFO_MEMBER(ataxx_get_tile_info); + TIMER_CALLBACK_MEMBER(ataxx_interrupt_callback); void ataxx_bankswitch(); - virtual void machine_start() override ATTR_COLD; - virtual void machine_reset() override ATTR_COLD; - virtual void video_start() override ATTR_COLD; - void ataxx_video(machine_config &config); - void master_map_program_2(address_map &map) ATTR_COLD; + void asylum_slave_map_program(address_map &map) ATTR_COLD; void master_map_io_2(address_map &map) ATTR_COLD; + void master_map_program_2(address_map &map) ATTR_COLD; void slave_map_io_2(address_map &map) ATTR_COLD; + void slave_map_program(address_map &map) ATTR_COLD; required_device<leland_80186_sound_device> m_sound; - required_region_ptr<u8> m_xrom_base; + required_region_ptr<u16> m_xrom_base; + memory_share_creator<u8> m_qram; + required_shared_ptr<u8> m_tram; - std::unique_ptr<u8[]> m_ataxx_qram{}; u8 m_master_bank = 0U; - u32 m_xrom1_addr = 0U; - u32 m_xrom2_addr = 0U; - std::unique_ptr<u8[]> m_extra_tram{}; + u32 m_xrom_addr[2]{}; }; diff --git a/src/mame/cinematronics/leland_a.cpp b/src/mame/cinematronics/leland_a.cpp index e574747934e..da05ad9f469 100644 --- a/src/mame/cinematronics/leland_a.cpp +++ b/src/mame/cinematronics/leland_a.cpp @@ -155,7 +155,7 @@ void leland_80186_sound_device::device_add_mconfig(machine_config &config) m_dacvol[i]->add_route(0, m_dac[i], 1.0, DAC_INPUT_RANGE_HI); m_dacvol[i]->add_route(0, m_dac[i], -1.0, DAC_INPUT_RANGE_LO); } - AD7533(config, "dac9", 0).add_route(ALL_OUTPUTS, "speaker", 1.0); // ad7533.u64 + AD7533(config, m_dac9, 0).add_route(ALL_OUTPUTS, "speaker", 1.0); // ad7533.u64 PIT8254(config, m_pit[0], 0); m_pit[0]->set_clk<0>(4000000); @@ -232,7 +232,7 @@ void ataxx_80186_sound_device::device_add_mconfig(machine_config &config) m_dacvol[i]->add_route(0, m_dac[i], 1.0, DAC_INPUT_RANGE_HI); m_dacvol[i]->add_route(0, m_dac[i], -1.0, DAC_INPUT_RANGE_LO); } - AD7533(config, "dac9", 0).add_route(ALL_OUTPUTS, "speaker", 1.0); // unknown DAC + AD7533(config, m_dac9, 0).add_route(ALL_OUTPUTS, "speaker", 1.0); // unknown DAC PIT8254(config, m_pit[0], 0); m_pit[0]->set_clk<0>(4000000); @@ -262,7 +262,7 @@ void wsf_80186_sound_device::device_add_mconfig(machine_config &config) m_dacvol[i]->add_route(0, m_dac[i], 1.0, DAC_INPUT_RANGE_HI); m_dacvol[i]->add_route(0, m_dac[i], -1.0, DAC_INPUT_RANGE_LO); // unknown DAC } - AD7533(config, "dac9", 0).add_route(ALL_OUTPUTS, "speaker", 1.0); // unknown DAC + AD7533(config, m_dac9, 0).add_route(ALL_OUTPUTS, "speaker", 1.0); // unknown DAC /* sound hardware */ YM2151(config, m_ymsnd, 4000000); @@ -332,7 +332,7 @@ void leland_80186_sound_device::device_start() m_response_sync = false; m_ext_start = 0; m_ext_stop = 0; - m_ext_active = 0; + m_ext_active = false; } void leland_80186_sound_device::device_reset() @@ -343,7 +343,7 @@ void leland_80186_sound_device::device_reset() m_response_sync = false; m_ext_start = 0; m_ext_stop = 0; - m_ext_active = 0; + m_ext_active = false; if (m_type == TYPE_WSF) m_dacvol[3]->write(0xff); //TODO: determine how to set this if at all @@ -366,6 +366,16 @@ leland_80186_sound_device::leland_80186_sound_device(const machine_config &mconf , m_pit(*this, "pit%u", 0U) , m_audiocpu(*this, "audiocpu") , m_ymsnd(*this, "ymsnd") + , m_peripheral(0) + , m_last_control(0) + , m_clock_active(0) + , m_clock_tick(0) + , m_sound_command(0) + , m_sound_response(0) + , m_response_sync(false) + , m_ext_start(0) + , m_ext_stop(0) + , m_ext_active(false) , m_master(*this, finder_base::DUMMY_TAG) , m_ext_base(*this, "ext") { @@ -406,7 +416,7 @@ void leland_80186_sound_device::peripheral_ctrl(offs_t offset, u16 data) case 4: { u32 temp = (m_peripheral & 0xffc0) << 4; - if (data & 0x0040) + if (BIT(data, 6)) { m_audiocpu->space(AS_PROGRAM).install_readwrite_handler(temp, temp + 0x2ff, read16s_delegate(*this, FUNC(leland_80186_sound_device::peripheral_r)), write16s_delegate(*this, FUNC(leland_80186_sound_device::peripheral_w))); } @@ -434,34 +444,34 @@ void leland_80186_sound_device::peripheral_ctrl(offs_t offset, u16 data) void leland_80186_sound_device::leland_80186_control_w(u8 data) { /* see if anything changed */ - int diff = (m_last_control ^ data) & 0xf8; + const u8 diff = (m_last_control ^ data) & 0xf8; if (diff == 0) return; m_last_control = data; LOGMASKED(LOG_COMM, "%s:80186 control = %02X%s%s%s%s%s\n", machine().describe_context(), data, - (data & 0x80) ? "" : " /RESET", - (data & 0x40) ? "" : " ZNMI", - (data & 0x20) ? "" : " INT0", - (data & 0x10) ? "" : " /TEST", - (data & 0x08) ? "" : " INT1"); + BIT(data, 7) ? "" : " /RESET", + BIT(data, 6) ? "" : " ZNMI", + BIT(data, 5) ? "" : " INT0", + BIT(data, 4) ? "" : " /TEST", + BIT(data, 3) ? "" : " INT1"); /* /RESET */ - m_audiocpu->set_input_line(INPUT_LINE_RESET, (data & 0x80) ? CLEAR_LINE : ASSERT_LINE); - m_audiocpu->set_input_line(INPUT_LINE_TEST, (data & 0x10) ? CLEAR_LINE : ASSERT_LINE); + m_audiocpu->set_input_line(INPUT_LINE_RESET, BIT(data, 7) ? CLEAR_LINE : ASSERT_LINE); + m_audiocpu->set_input_line(INPUT_LINE_TEST, BIT(data, 4) ? CLEAR_LINE : ASSERT_LINE); /* /NMI */ /* If the master CPU doesn't get a response by the time it's ready to send the next command, it uses an NMI to force the issue; unfortunately, this seems to really screw up the sound system. It turns out it's better to just wait for the original interrupt to occur naturally */ - //m_audiocpu->set_input_line(INPUT_LINE_NMI, (data & 0x40) ? CLEAR_LINE : ASSERT_LINE); + //m_audiocpu->set_input_line(INPUT_LINE_NMI, BIT(data, 6) ? CLEAR_LINE : ASSERT_LINE); /* INT0 */ - m_audiocpu->int0_w(data & 0x20); + m_audiocpu->int0_w(BIT(data, 5)); /* INT1 */ - m_audiocpu->int1_w(data & 0x08); + m_audiocpu->int1_w(BIT(data, 3)); /* handle reset here */ if ((diff & 0x80) && (data & 0x80)) reset(); @@ -528,7 +538,7 @@ u8 leland_80186_sound_device::response_r() void leland_80186_sound_device::dac_w(offs_t offset, u16 data, u16 mem_mask) { - int dac = offset & 7; + const int dac = offset & 7; /* handle value changes */ if (ACCESSING_BITS_0_7) @@ -558,7 +568,7 @@ void redline_80186_sound_device::redline_dac_w(offs_t offset, u16 data) dac_w(offset, data, 0xffff); } -void leland_80186_sound_device::ataxx_dac_control(offs_t offset, u16 data, u16 mem_mask) +void leland_80186_sound_device::ataxx_dac_control_w(offs_t offset, u16 data, u16 mem_mask) { if (ACCESSING_BITS_0_7) { @@ -589,11 +599,11 @@ void leland_80186_sound_device::ataxx_dac_control(offs_t offset, u16 data, u16 m switch (offset) { case 0x04: - m_ext_active = 1; + m_ext_active = true; LOGMASKED(LOG_EXTERN, "External DAC active\n"); return; case 0x05: - m_ext_active = 0; + m_ext_active = false; LOGMASKED(LOG_EXTERN, "External DAC inactive\n"); return; case 0x06: @@ -625,7 +635,7 @@ void leland_80186_sound_device::ataxx_dac_control(offs_t offset, u16 data, u16 m u16 leland_80186_sound_device::peripheral_r(offs_t offset, u16 mem_mask) { - int select = offset / 0x40; + const int select = offset >> 6; offset &= 0x3f; switch (select) @@ -643,7 +653,8 @@ u16 leland_80186_sound_device::peripheral_r(offs_t offset, u16 mem_mask) return ((m_clock_active << 1) & 0x7e); case 1: - LOGMASKED(LOG_COMM, "%s:Read sound command latch = %02X\n", machine().describe_context(), m_soundlatch->read()); + if (!machine().side_effects_disabled()) + LOGMASKED(LOG_COMM, "%s:Read sound command latch = %02X\n", machine().describe_context(), m_soundlatch->read()); return m_soundlatch->read(); case 2: @@ -667,12 +678,13 @@ u16 leland_80186_sound_device::peripheral_r(offs_t offset, u16 mem_mask) if (ACCESSING_BITS_0_7) return m_pit[2]->read(offset & 3); } - else + else if (!machine().side_effects_disabled()) LOGMASKED(LOG_WARN, "%s:Unexpected peripheral read %d/%02X\n", machine().describe_context(), select, offset*2); break; default: - LOGMASKED(LOG_WARN, "%s:Unexpected peripheral read %d/%02X\n", machine().describe_context(), select, offset*2); + if (!machine().side_effects_disabled()) + LOGMASKED(LOG_WARN, "%s:Unexpected peripheral read %d/%02X\n", machine().describe_context(), select, offset*2); break; } return 0xffff; @@ -681,7 +693,7 @@ u16 leland_80186_sound_device::peripheral_r(offs_t offset, u16 mem_mask) void leland_80186_sound_device::peripheral_w(offs_t offset, u16 data, u16 mem_mask) { - int select = offset / 0x40; + const int select = offset >> 6; offset &= 0x3f; switch (select) @@ -721,7 +733,7 @@ void leland_80186_sound_device::peripheral_w(offs_t offset, u16 data, u16 mem_ma case 5: /* Ataxx/WSF/Indy Heat only */ if (m_type > TYPE_REDLINE) - ataxx_dac_control(offset, data, mem_mask); + ataxx_dac_control_w(offset, data, mem_mask); break; default: @@ -741,7 +753,7 @@ void leland_80186_sound_device::peripheral_w(offs_t offset, u16 data, u16 mem_ma void leland_80186_sound_device::ataxx_80186_control_w(u8 data) { /* compute the bit-shuffled variants of the bits and then write them */ - int modified = ((data & 0x01) << 7) | + const u8 modified = ((data & 0x01) << 7) | ((data & 0x02) << 5) | ((data & 0x04) << 3) | ((data & 0x08) << 1); diff --git a/src/mame/cinematronics/leland_a.h b/src/mame/cinematronics/leland_a.h index 86387886a72..a6002f16dc0 100644 --- a/src/mame/cinematronics/leland_a.h +++ b/src/mame/cinematronics/leland_a.h @@ -35,7 +35,7 @@ public: void command_hi_w(u8 data); u8 response_r(); void dac_w(offs_t offset, u16 data, u16 mem_mask = ~0); - void ataxx_dac_control(offs_t offset, u16 data, u16 mem_mask = ~0); + void ataxx_dac_control_w(offs_t offset, u16 data, u16 mem_mask = ~0); void i80186_tmr0_w(int state); void i80186_tmr1_w(int state); @@ -74,7 +74,7 @@ protected: void leland_80186_map_program(address_map &map) ATTR_COLD; private: - void set_clock_line(int which, int state) { m_clock_active = state ? (m_clock_active | (1<<which)) : (m_clock_active & ~(1<<which)); } + void set_clock_line(int which, int state) { m_clock_active = state ? (m_clock_active | (1 << which)) : (m_clock_active & ~(1 << which)); } // internal state u16 m_peripheral; @@ -86,7 +86,7 @@ private: bool m_response_sync; u32 m_ext_start; u32 m_ext_stop; - u8 m_ext_active; + bool m_ext_active; required_device<cpu_device> m_master; diff --git a/src/mame/cinematronics/leland_m.cpp b/src/mame/cinematronics/leland_m.cpp index bd64cd6814f..18bb5b8367b 100644 --- a/src/mame/cinematronics/leland_m.cpp +++ b/src/mame/cinematronics/leland_m.cpp @@ -14,6 +14,8 @@ #include "cpu/z80/z80.h" +#include <algorithm> + /************************************* * @@ -49,31 +51,33 @@ int leland_state::dial_compute_value(int new_val, int indx) int delta = new_val - (int)m_dial_last_input[indx]; u8 result = m_dial_last_result[indx] & 0x80; - m_dial_last_input[indx] = new_val; + if (!machine().side_effects_disabled()) + { + m_dial_last_input[indx] = new_val; - if (delta > 0x80) - delta -= 0x100; - else if (delta < -0x80) - delta += 0x100; + if (delta > 0x80) + delta -= 0x100; + else if (delta < -0x80) + delta += 0x100; - if (delta < 0) - { - result = 0x80; - delta = -delta; - } - else if (delta > 0) - result = 0x00; + if (delta < 0) + { + result = 0x80; + delta = -delta; + } + else if (delta > 0) + result = 0x00; - if (delta > 0x1f) - delta = 0x1f; - result |= (m_dial_last_result[indx] + delta) & 0x1f; + if (delta > 0x1f) + delta = 0x1f; + result |= (m_dial_last_result[indx] + delta) & 0x1f; - m_dial_last_result[indx] = result; + m_dial_last_result[indx] = result; + } return result; } - /************************************* * * Cerberus inputs @@ -82,28 +86,27 @@ int leland_state::dial_compute_value(int new_val, int indx) u8 leland_state::cerberus_dial_1_r() { - int original = m_io_in[0]->read(); - int modified = dial_compute_value(m_io_an[0]->read(), 0); + const u8 original = m_io_in[0]->read(); + const u8 modified = dial_compute_value(m_io_an[0]->read(), 0); return (original & 0xc0) | ((modified & 0x80) >> 2) | (modified & 0x1f); } u8 leland_state::cerberus_dial_2_r() { - int original = m_io_in[2]->read(); - int modified = dial_compute_value(m_io_an[1]->read(), 1); + const u8 original = m_io_in[2]->read(); + const u8 modified = dial_compute_value(m_io_an[1]->read(), 1); return (original & 0xc0) | ((modified & 0x80) >> 2) | (modified & 0x1f); } - /************************************* * * Alley Master inputs * *************************************/ -void leland_state::alleymas_joystick_kludge(u8 data) +void leland_state::alleymas_joystick_kludge_w(u8 data) { /* catch the case where they clear this memory location at PC $1827 and change */ /* the value written to be a 1 */ @@ -124,7 +127,6 @@ void leland_state::alleymas_joystick_kludge(u8 data) } - /************************************* * * Danger Zone inputs @@ -133,8 +135,8 @@ void leland_state::alleymas_joystick_kludge(u8 data) void leland_state::update_dangerz_xy() { - u8 newy = m_io_an[0]->read(); - u8 newx = m_io_an[1]->read(); + const u8 newy = m_io_an[0]->read(); + const u8 newx = m_io_an[1]->read(); int deltay = newy - m_dial_last_input[0]; int deltax = newx - m_dial_last_input[1]; @@ -143,12 +145,8 @@ void leland_state::update_dangerz_xy() if (deltax <= -128) deltax += 256; else if (deltax >= 128) deltax -= 256; - m_dangerz_y += deltay; - m_dangerz_x += deltax; - if (m_dangerz_y < 0) m_dangerz_y = 0; - else if (m_dangerz_y >= 1024) m_dangerz_y = 1023; - if (m_dangerz_x < 0) m_dangerz_x = 0; - else if (m_dangerz_x >= 1024) m_dangerz_x = 1023; + m_dangerz_y = std::clamp(m_dangerz_y + deltay, 0, 1023); + m_dangerz_x = std::clamp(m_dangerz_x + deltax, 0, 1023); m_dial_last_input[0] = newy; m_dial_last_input[1] = newx; @@ -157,26 +155,28 @@ void leland_state::update_dangerz_xy() u8 leland_state::dangerz_input_y_r() { - update_dangerz_xy(); + if (!machine().side_effects_disabled()) + update_dangerz_xy(); return m_dangerz_y & 0xff; } u8 leland_state::dangerz_input_x_r() { - update_dangerz_xy(); + if (!machine().side_effects_disabled()) + update_dangerz_xy(); return m_dangerz_x & 0xff; } u8 leland_state::dangerz_input_upper_r() { - update_dangerz_xy(); + if (!machine().side_effects_disabled()) + update_dangerz_xy(); return ((m_dangerz_y >> 2) & 0xc0) | ((m_dangerz_x >> 8) & 0x03); } - /************************************* * * Red Line Racer inputs @@ -211,7 +211,6 @@ u8 redline_state::redline_wheel_2_r() } - /************************************* * * Super Offroad inputs @@ -236,7 +235,6 @@ u8 redline_state::offroad_wheel_3_r() } - /************************************* * * Ataxx inputs @@ -249,7 +247,6 @@ u8 ataxx_state::ataxx_trackball_r(offs_t offset) } - /************************************* * * Indy Heat inputs @@ -270,7 +267,8 @@ u8 ataxx_state::indyheat_analog_r(offs_t offset) return 0; case 3: - LOGMASKED(LOG_WARN, "Unexpected analog read(%02X)\n", 8 + offset); + if (!machine().side_effects_disabled()) + LOGMASKED(LOG_WARN, "%s: Unexpected analog read(%02X)\n", machine().describe_context(), 8 + offset); break; } return 0xff; @@ -294,7 +292,6 @@ void ataxx_state::indyheat_analog_w(offs_t offset, u8 data) } - /************************************* * * Machine initialization @@ -307,7 +304,6 @@ void leland_state::machine_start() m_master_int_timer = timer_alloc(FUNC(leland_state::leland_interrupt_callback), this); save_item(NAME(m_dac_control)); - save_item(NAME(m_wcol_enable)); save_item(NAME(m_analog_result)); save_item(NAME(m_dial_last_input)); save_item(NAME(m_dial_last_result)); @@ -319,7 +315,6 @@ void leland_state::machine_start() save_item(NAME(m_top_board_bank)); save_item(NAME(m_sound_port_bank)); save_item(NAME(m_alternate_bank)); - save_item(NAME(m_battery_ram_enable)); } @@ -329,7 +324,7 @@ void leland_state::machine_reset() /* reset globals */ sound_port_w(0); - m_wcol_enable = 0; + m_palette_view.disable(); m_dangerz_x = 512; m_dangerz_y = 512; @@ -359,35 +354,28 @@ void leland_state::machine_reset() void ataxx_state::machine_start() { // TODO: further untangle driver so the base class doesn't have stuff that isn't common and this can call the base implementation - /* set the odd data banks */ - m_extra_tram = std::make_unique<u8[]>(ATAXX_EXTRA_TRAM_SIZE); - /* start scanline interrupts going */ - m_master_int_timer = timer_alloc(FUNC(leland_state::ataxx_interrupt_callback), this); + m_master_int_timer = timer_alloc(FUNC(ataxx_state::ataxx_interrupt_callback), this); - save_item(NAME(m_wcol_enable)); save_item(NAME(m_dial_last_input)); save_item(NAME(m_dial_last_result)); save_item(NAME(m_master_bank)); - save_item(NAME(m_xrom1_addr)); - save_item(NAME(m_xrom2_addr)); - save_item(NAME(m_battery_ram_enable)); - save_pointer(NAME(m_extra_tram), ATAXX_EXTRA_TRAM_SIZE); + save_item(NAME(m_xrom_addr)); } void ataxx_state::machine_reset() { // TODO: further untangle driver so the base class doesn't have stuff that isn't common and this can call the base implementation - memset(m_extra_tram.get(), 0, ATAXX_EXTRA_TRAM_SIZE); + std::fill_n(&m_tram[0], m_tram.length(), 0); m_master_int_timer->adjust(m_screen->time_until_pos(8), 8); /* initialize the XROM */ - m_xrom1_addr = 0; - m_xrom2_addr = 0; + m_xrom_addr[0] = 0; + m_xrom_addr[1] = 0; /* reset globals */ - m_wcol_enable = 0; + m_palette_view.disable(); m_analog_result = 0xff; memset(m_dial_last_input, 0, sizeof(m_dial_last_input)); @@ -404,7 +392,6 @@ void ataxx_state::machine_reset() } - /************************************* * * Master CPU interrupt handling @@ -425,9 +412,9 @@ TIMER_CALLBACK_MEMBER(leland_state::leland_interrupt_callback) } -TIMER_CALLBACK_MEMBER(leland_state::ataxx_interrupt_callback) +TIMER_CALLBACK_MEMBER(ataxx_state::ataxx_interrupt_callback) { - u8 scanline = param; + const u8 scanline = param; /* interrupts generated according to the interrupt control register */ m_master->set_input_line(0, HOLD_LINE); @@ -445,7 +432,6 @@ INTERRUPT_GEN_MEMBER(leland_state::leland_master_interrupt) } - /************************************* * * Master CPU bankswitch handlers @@ -456,8 +442,8 @@ void leland_state::leland_master_alt_bankswitch_w(u8 data) { /* update any bankswitching */ if ((m_alternate_bank ^ data) & 0x0f) - LOGMASKED(LOG_BANKSWITCHING_M, "%04X:alternate_bank = %02X\n", m_master->pc(), data & 0x0f); - m_alternate_bank = data & 15; + LOGMASKED(LOG_BANKSWITCHING_M, "%s:alternate_bank = %02X\n", machine().describe_context(), data & 0x0f); + m_alternate_bank = data & 0x0f; (this->*m_update_master_bank)(); } @@ -481,30 +467,20 @@ void leland_state::cerberus_bankswitch() /* bankswitching for Mayhem 2002, Power Play, World Series Baseball, and Alley Master */ void leland_state::mayhem_bankswitch() { - u8 *address; - - m_battery_ram_enable = ((m_sound_port_bank & 0x24) == 0); - - address = (!(m_sound_port_bank & 0x04)) ? &m_master_base[0x10000] : &m_master_base[0x1c000]; - m_master_bankslot[0]->set_base(address); + update_battery_ram_view((m_sound_port_bank & 0x24) == 0); - address = m_battery_ram_enable ? m_battery_ram : &address[0x8000]; - m_master_bankslot[1]->set_base(address); + u8 *address = (!BIT(m_sound_port_bank, 2)) ? &m_master_base[0x10000] : &m_master_base[0x1c000]; + m_master_bankslot->set_base(address); } /* bankswitching for Danger Zone */ void leland_state::dangerz_bankswitch() { - u8 *address; - - m_battery_ram_enable = ((m_top_board_bank & 0x80) != 0); - - address = (!(m_alternate_bank & 1)) ? &m_master_base[0x02000] : &m_master_base[0x12000]; - m_master_bankslot[0]->set_base(address); + update_battery_ram_view(BIT(m_top_board_bank, 7)); - address = m_battery_ram_enable ? m_battery_ram : &address[0x8000]; - m_master_bankslot[1]->set_base(address); + u8 *address = (!BIT(m_alternate_bank, 0)) ? &m_master_base[0x02000] : &m_master_base[0x12000]; + m_master_bankslot->set_base(address); } @@ -513,16 +489,14 @@ void leland_state::basebal2_bankswitch() { u8 *address; - m_battery_ram_enable = (m_top_board_bank & 0x80); + const bool battery_ram_enable = BIT(m_top_board_bank, 7); + update_battery_ram_view(battery_ram_enable); - if (!m_battery_ram_enable) - address = (!(m_sound_port_bank & 0x04)) ? &m_master_base[0x10000] : &m_master_base[0x1c000]; + if (!battery_ram_enable) + address = (!BIT(m_sound_port_bank, 2)) ? &m_master_base[0x10000] : &m_master_base[0x1c000]; else - address = (!(m_top_board_bank & 0x40)) ? &m_master_base[0x28000] : &m_master_base[0x30000]; - m_master_bankslot[0]->set_base(address); - - address = m_battery_ram_enable ? m_battery_ram : &address[0x8000]; - m_master_bankslot[1]->set_base(address); + address = (!BIT(m_top_board_bank, 6)) ? &m_master_base[0x28000] : &m_master_base[0x30000]; + m_master_bankslot->set_base(address); } @@ -530,15 +504,11 @@ void leland_state::basebal2_bankswitch() void leland_state::redline_bankswitch() { static const u32 bank_list[] = { 0x10000, 0x18000, 0x02000, 0x02000 }; - u8 *address; - - m_battery_ram_enable = ((m_alternate_bank & 3) == 1); - address = &m_master_base[bank_list[m_alternate_bank & 3]]; - m_master_bankslot[0]->set_base(address); + update_battery_ram_view((m_alternate_bank & 3) == 1); - address = m_battery_ram_enable ? m_battery_ram : &m_master_base[0xa000]; - m_master_bankslot[1]->set_base(address); + u8 *address = &m_master_base[bank_list[m_alternate_bank & 3]]; + m_master_bankslot->set_base(address); } @@ -546,20 +516,16 @@ void leland_state::redline_bankswitch() void leland_state::viper_bankswitch() { static const u32 bank_list[] = { 0x02000, 0x10000, 0x18000, 0x02000 }; - u8 *address; - m_battery_ram_enable = ((m_alternate_bank & 0x04) != 0); + update_battery_ram_view(BIT(m_alternate_bank, 2)); - address = &m_master_base[bank_list[m_alternate_bank & 3]]; + u8 *address = &m_master_base[bank_list[m_alternate_bank & 3]]; if (bank_list[m_alternate_bank & 3] >= m_master_base.length()) { LOGMASKED(LOG_WARN, "%s:Master bank %02X out of range!\n", machine().describe_context(), m_alternate_bank & 3); address = &m_master_base[bank_list[0]]; } - m_master_bankslot[0]->set_base(address); - - address = m_battery_ram_enable ? m_battery_ram : &m_master_base[0xa000]; - m_master_bankslot[1]->set_base(address); + m_master_bankslot->set_base(address); } @@ -567,20 +533,16 @@ void leland_state::viper_bankswitch() void leland_state::offroad_bankswitch() { static const u32 bank_list[] = { 0x02000, 0x02000, 0x10000, 0x18000, 0x20000, 0x28000, 0x30000, 0x38000 }; - u8 *address; - m_battery_ram_enable = ((m_alternate_bank & 7) == 1); + update_battery_ram_view((m_alternate_bank & 7) == 1); - address = &m_master_base[bank_list[m_alternate_bank & 7]]; + u8 *address = &m_master_base[bank_list[m_alternate_bank & 7]]; if (bank_list[m_alternate_bank & 7] >= m_master_base.length()) { LOGMASKED(LOG_WARN, "%s:Master bank %02X out of range!\n", machine().describe_context(), m_alternate_bank & 7); address = &m_master_base[bank_list[0]]; } - m_master_bankslot[0]->set_base(address); - - address = m_battery_ram_enable ? m_battery_ram : &m_master_base[0xa000]; - m_master_bankslot[1]->set_base(address); + m_master_bankslot->set_base(address); } @@ -592,31 +554,29 @@ void ataxx_state::ataxx_bankswitch() 0x02000, 0x18000, 0x20000, 0x28000, 0x30000, 0x38000, 0x40000, 0x48000, 0x50000, 0x58000, 0x60000, 0x68000, 0x70000, 0x78000, 0x80000, 0x88000 }; - u8 *address; - m_battery_ram_enable = ((m_master_bank & 0x30) == 0x10); - - address = &m_master_base[bank_list[m_master_bank & 15]]; - if (bank_list[m_master_bank & 15] >= m_master_base.length()) + u8 *address = &m_master_base[bank_list[m_master_bank & 0x0f]]; + if (bank_list[m_master_bank & 0x0f] >= m_master_base.length()) { - LOGMASKED(LOG_WARN, "%s:Master bank %02X out of range!\n", machine().describe_context(), m_master_bank & 15); + LOGMASKED(LOG_WARN, "%s:Master bank %02X out of range!\n", machine().describe_context(), m_master_bank & 0x0f); address = &m_master_base[bank_list[0]]; } - m_master_bankslot[0]->set_base(address); + m_master_bankslot->set_base(address); - if (m_battery_ram_enable) - address = m_battery_ram; + if ((m_master_bank & 0x30) == 0x10) + m_battery_ram_view.select(0); else if ((m_master_bank & 0x30) == 0x20) - address = &m_ataxx_qram[(m_master_bank & 0xc0) << 8]; + m_battery_ram_view.select(1); else - address = &m_master_base[0xa000]; - m_master_bankslot[1]->set_base(address); + m_battery_ram_view.disable(); - m_wcol_enable = ((m_master_bank & 0x30) == 0x30); + if ((m_master_bank & 0x30) == 0x30) + m_palette_view.select(0); + else + m_palette_view.disable(); } - /************************************* * * EEPROM handling (64 x 16bits) @@ -627,7 +587,6 @@ void leland_state::leland_init_eeprom(u8 default_val, const u16 *data, u8 serial { u8 xorval = (serial_type == SERIAL_TYPE_ADD_XOR || serial_type == SERIAL_TYPE_ENCRYPT_XOR) ? 0xff : 0x00; u8 eeprom_data[64*2]; - u32 serial; /* NOTE: This code is just illustrative, and explains how to generate the @@ -662,8 +621,8 @@ void leland_state::leland_init_eeprom(u8 default_val, const u16 *data, u8 serial /* fill in the preset data */ while (*data != 0xffff) { - int offset = *data++; - int value = *data++; + const u16 offset = *data++; + const u16 value = *data++; eeprom_data[offset * 2 + 0] = value >> 8; eeprom_data[offset * 2 + 1] = value & 0xff; } @@ -673,7 +632,7 @@ void leland_state::leland_init_eeprom(u8 default_val, const u16 *data, u8 serial Team QB: 21101957 AAFB: 26101119 and 26101039 */ - serial = 0x12345678; + const u32 serial = 0x12345678; /* switch off the serial number type */ switch (serial_type) @@ -681,15 +640,14 @@ void leland_state::leland_init_eeprom(u8 default_val, const u16 *data, u8 serial case SERIAL_TYPE_ADD: case SERIAL_TYPE_ADD_XOR: { - int i; - for (i = 0; i < 10; i++) + for (int i = 0; i < 10; i++) { int digit; if (i >= 8) digit = 0; else - digit = ((serial << (i * 4)) >> 28) & 15; + digit = ((serial << (i * 4)) >> 28) & 0x0f; digit = ('0' + digit) * 2; eeprom_data[serial_offset * 2 + 0 + (i ^ 1)] = (digit / 3) ^ xorval; @@ -702,13 +660,11 @@ void leland_state::leland_init_eeprom(u8 default_val, const u16 *data, u8 serial case SERIAL_TYPE_ENCRYPT: case SERIAL_TYPE_ENCRYPT_XOR: { - int d, e, h, l; - /* break the serial number out into pieces */ - l = (serial >> 24) & 0xff; - h = (serial >> 16) & 0xff; - e = (serial >> 8) & 0xff; - d = serial & 0xff; + int l = (serial >> 24) & 0xff; + int h = (serial >> 16) & 0xff; + int e = (serial >> 8) & 0xff; + int d = serial & 0xff; /* decrypt the data */ h = ((h ^ 0x2a ^ l) ^ 0xff) + 5; @@ -727,7 +683,6 @@ void leland_state::leland_init_eeprom(u8 default_val, const u16 *data, u8 serial } - /************************************* * * EEPROM handling (128 x 16bits) @@ -739,7 +694,6 @@ void leland_state::ataxx_init_eeprom(const u16 *data) u8 eeprom_data[128*2]; u8 serial_offset = 0; u8 default_val = 0; - u32 serial; /* NOTE: This code is just illustrative, and explains how to generate the @@ -753,8 +707,8 @@ void leland_state::ataxx_init_eeprom(const u16 *data) /* fill in the preset data */ while (*data != 0xffff) { - int offset = *data++; - int value = *data++; + const u16 offset = *data++; + const u16 value = *data++; eeprom_data[offset * 2 + 0] = value >> 8; eeprom_data[offset * 2 + 1] = value & 0xff; } @@ -764,17 +718,15 @@ void leland_state::ataxx_init_eeprom(const u16 *data) WSF: 30101190 Indy Heat: 31201339 */ - serial = 0x12345678; + const u32 serial = 0x12345678; /* encrypt the serial number */ { - int d, e, h, l; - /* break the serial number out into pieces */ - l = (serial >> 24) & 0xff; - h = (serial >> 16) & 0xff; - e = (serial >> 8) & 0xff; - d = serial & 0xff; + int l = (serial >> 24) & 0xff; + int h = (serial >> 16) & 0xff; + int e = (serial >> 8) & 0xff; + int d = serial & 0xff; /* decrypt the data */ h = ((h ^ 0x2a ^ l) ^ 0xff) + 5; @@ -791,8 +743,8 @@ void leland_state::ataxx_init_eeprom(const u16 *data) /* compute the checksum */ { - int i, sum = 0; - for (i = 0; i < 0x7f * 2; i++) + u16 sum = 0; + for (int i = 0; i < 0x7f * 2; i++) sum += eeprom_data[i]; sum ^= 0xffff; eeprom_data[0x7f * 2 + 0] = (sum >> 8) & 0xff; @@ -801,7 +753,6 @@ void leland_state::ataxx_init_eeprom(const u16 *data) } - /************************************* * * Ataxx EEPROM interfacing @@ -810,8 +761,9 @@ void leland_state::ataxx_init_eeprom(const u16 *data) u8 ataxx_state::eeprom_r() { - int port = m_io_in[2]->read(); - LOGMASKED(LOG_EEPROM, "%s:EE read\n", machine().describe_context()); + const u8 port = m_io_in[2]->read(); + if (!machine().side_effects_disabled()) + LOGMASKED(LOG_EEPROM, "%s:EE read\n", machine().describe_context()); return port; } @@ -819,51 +771,28 @@ u8 ataxx_state::eeprom_r() void ataxx_state::eeprom_w(u8 data) { LOGMASKED(LOG_EEPROM, "%s:EE write %d%d%d\n", machine().describe_context(), - (data >> 6) & 1, (data >> 5) & 1, (data >> 4) & 1); + BIT(data, 6), BIT(data, 5), BIT(data, 4)); m_eeprom->di_write (BIT(data, 4)); m_eeprom->clk_write(BIT(data, 5)); m_eeprom->cs_write (BIT(data, 6)); } - /************************************* * * Battery backed RAM * *************************************/ -void leland_state::leland_battery_ram_w(offs_t offset, u8 data) -{ - if (m_battery_ram_enable) - { - LOGMASKED(LOG_BATTERY_RAM, "%04X:BatteryW@%04X=%02X\n", m_master->pc(), offset, data); - m_battery_ram[offset] = data; - } - else - LOGMASKED(LOG_WARN, "%04X:BatteryW@%04X (invalid!)\n", m_master->pc(), offset); -} - - -void ataxx_state::ataxx_battery_ram_w(offs_t offset, u8 data) +void leland_state::update_battery_ram_view(bool enable) { - if (m_battery_ram_enable) - { - LOGMASKED(LOG_BATTERY_RAM, "%04X:BatteryW@%04X=%02X\n", m_master->pc(), offset, data); - m_battery_ram[offset] = data; - } - else if ((m_master_bank & 0x30) == 0x20) - { - m_screen->update_partial(m_screen->vpos() - 1); - m_ataxx_qram[((m_master_bank & 0xc0) << 8) | offset] = data; - m_tilemap->mark_tile_dirty(((m_master_bank & 0x80) << 8) | offset); - } + if (enable) + m_battery_ram_view.select(0); else - LOGMASKED(LOG_WARN, "%04X:BatteryW@%04X (invalid!)\n", m_master->pc(), offset); + m_battery_ram_view.disable(); } - /************************************* * * Master CPU keycard I/O @@ -912,33 +841,38 @@ void ataxx_state::ataxx_battery_ram_w(offs_t offset, u8 data) --------------------------------------------------------------------*/ -int leland_state::keycard_r() +u8 leland_state::keycard_r() { - int result = 0; + u8 result = 0; - LOGMASKED(LOG_KEYCARDS_FULL, " (%s:keycard_r)\n", machine().describe_context()); + if (!machine().side_effects_disabled()) + LOGMASKED(LOG_KEYCARDS_FULL, " (%s:keycard_r)\n", machine().describe_context()); /* if we have a valid keycard read state, we're reading from the keycard */ - if (m_keycard_state & 0x80) + if (BIT(m_keycard_state, 7)) { /* clock in new data */ if (m_keycard_bit == 1) { - m_keycard_shift = 0xff; /* no data, but this is where we would clock it in */ - LOGMASKED(LOG_KEYCARDS, " (clocked in %02X)\n", m_keycard_shift); + if (!machine().side_effects_disabled()) + { + m_keycard_shift = 0xff; /* no data, but this is where we would clock it in */ + LOGMASKED(LOG_KEYCARDS, " (clocked in %02X)\n", m_keycard_shift); + } } /* clock in the bit */ - result = (~m_keycard_shift & 1) << ((m_keycard_state >> 4) & 3); - LOGMASKED(LOG_KEYCARDS, " (read %02X)\n", result); + result = BIT(~m_keycard_shift, 0) << ((m_keycard_state >> 4) & 3); + if (!machine().side_effects_disabled()) + LOGMASKED(LOG_KEYCARDS, " (read %02X)\n", result); } return result; } -void leland_state::keycard_w(int data) +void leland_state::keycard_w(u8 data) { - int new_state = data & 0xb0; - int new_clock = data & 0x40; + const u8 new_state = data & 0xb0; + const bool new_clock = BIT(data, 6); LOGMASKED(LOG_KEYCARDS_FULL, " (%s:keycard_w=%02X)\n", machine().describe_context(), data); @@ -972,7 +906,7 @@ void leland_state::keycard_w(int data) LOGMASKED(LOG_KEYCARDS, " (write %02X)\n", data); m_keycard_shift &= ~0x80; - if (data & (1 << ((new_state >> 4) & 3))) + if (BIT(data, ((new_state >> 4) & 3))) m_keycard_shift |= 0x80; /* clock out the data on the last bit */ @@ -1003,7 +937,6 @@ void leland_state::keycard_w(int data) } - /************************************* * * Master CPU analog and keycard I/O @@ -1012,7 +945,7 @@ void leland_state::keycard_w(int data) u8 leland_state::master_analog_key_r(offs_t offset) { - int result = 0; + u8 result = 0; switch (offset) { @@ -1036,7 +969,6 @@ u8 leland_state::master_analog_key_r(offs_t offset) } - void leland_state::master_analog_key_w(offs_t offset, u8 data) { switch (offset) @@ -1045,11 +977,11 @@ void leland_state::master_analog_key_w(offs_t offset, u8 data) break; case 0x01: /* FE = analog port select/bankswitch */ - m_analog_result = m_io_an[data & 15]->read(); + m_analog_result = m_io_an[data & 0x0f]->read(); /* update top board banking for some games */ if ((m_top_board_bank ^ data) & 0xc0) - LOGMASKED(LOG_BANKSWITCHING_M, "%04X:top_board_bank = %02X\n", m_master->pc(), data & 0xc0); + LOGMASKED(LOG_BANKSWITCHING_M, "%s:top_board_bank = %02X\n", machine().describe_context(), data & 0xc0); m_top_board_bank = data & 0xc0; (this->*m_update_master_bank)(); break; @@ -1061,7 +993,6 @@ void leland_state::master_analog_key_w(offs_t offset, u8 data) } - /************************************* * * Master CPU internal I/O @@ -1070,7 +1001,7 @@ void leland_state::master_analog_key_w(offs_t offset, u8 data) u8 leland_state::leland_master_input_r(offs_t offset) { - int result = 0xff; + u8 result = 0xff; switch (offset) { @@ -1086,7 +1017,8 @@ u8 leland_state::leland_master_input_r(offs_t offset) case 0x02: /* /GIN2 */ case 0x12: - m_master->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); + if (!machine().side_effects_disabled()) + m_master->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); break; case 0x03: /* /IGID */ @@ -1104,11 +1036,13 @@ u8 leland_state::leland_master_input_r(offs_t offset) case 0x11: /* /GIN1 */ result = m_io_in[3]->read(); - LOGMASKED(LOG_EEPROM, "%s:EE read\n", machine().describe_context()); + if (!machine().side_effects_disabled()) + LOGMASKED(LOG_EEPROM, "%s:EE read\n", machine().describe_context()); break; default: - LOGMASKED(LOG_WARN, "Master I/O read offset %02X\n", offset); + if (!machine().side_effects_disabled()) + LOGMASKED(LOG_WARN, "Master I/O read offset %02X\n", offset); break; } return result; @@ -1121,7 +1055,10 @@ void leland_state::leland_master_output_w(offs_t offset, u8 data) { case 0x09: /* /MCONT */ m_slave->set_input_line(INPUT_LINE_RESET, BIT(data, 0) ? CLEAR_LINE : ASSERT_LINE); - m_wcol_enable = BIT(data, 1); + if (BIT(data, 1)) + m_palette_view.select(0); + else + m_palette_view.disable(); m_slave->set_input_line(INPUT_LINE_NMI, BIT(data, 2) ? CLEAR_LINE : ASSERT_LINE); m_slave->set_input_line(0, BIT(data, 3) ? CLEAR_LINE : ASSERT_LINE); @@ -1157,7 +1094,7 @@ void leland_state::leland_master_output_w(offs_t offset, u8 data) u8 ataxx_state::ataxx_master_input_r(offs_t offset) { - int result = 0xff; + u8 result = 0xff; switch (offset) { @@ -1172,7 +1109,8 @@ u8 ataxx_state::ataxx_master_input_r(offs_t offset) break; default: - LOGMASKED(LOG_WARN, "Master I/O read offset %02X\n", offset); + if (!machine().side_effects_disabled()) + LOGMASKED(LOG_WARN, "Master I/O read offset %02X\n", offset); break; } return result; @@ -1192,20 +1130,20 @@ void ataxx_state::ataxx_master_output_w(offs_t offset, u8 data) case 0x04: /* /MBNK */ if ((m_master_bank ^ data) & 0xff) - LOGMASKED(LOG_BANKSWITCHING_M, "%04X:master_bank = %02X\n", m_master->pc(), data & 0xff); + LOGMASKED(LOG_BANKSWITCHING_M, "%s:master_bank = %02X\n", machine().describe_context(), data & 0xff); m_master_bank = data; ataxx_bankswitch(); break; case 0x05: /* /SLV0 */ - m_slave->set_input_line(0, (data & 0x01) ? CLEAR_LINE : ASSERT_LINE); - m_slave->set_input_line(INPUT_LINE_NMI, (data & 0x04) ? CLEAR_LINE : ASSERT_LINE); - m_slave->set_input_line(INPUT_LINE_RESET, (data & 0x10) ? CLEAR_LINE : ASSERT_LINE); + m_slave->set_input_line(0, BIT(data, 0) ? CLEAR_LINE : ASSERT_LINE); + m_slave->set_input_line(INPUT_LINE_NMI, BIT(data, 2) ? CLEAR_LINE : ASSERT_LINE); + m_slave->set_input_line(INPUT_LINE_RESET, BIT(data, 4) ? CLEAR_LINE : ASSERT_LINE); break; case 0x08: /* */ { - u8 scanline = data + 1; + const u8 scanline = data + 1; m_master_int_timer->adjust(m_screen->time_until_pos(scanline), scanline); break; } @@ -1217,81 +1155,33 @@ void ataxx_state::ataxx_master_output_w(offs_t offset, u8 data) } - /************************************* * * Master CPU palette gates * *************************************/ -void leland_state::gated_paletteram_w(offs_t offset, u8 data) +void ataxx_state::xrom_w(offs_t offset, u8 data) { - if (m_wcol_enable) - m_palette->write8(offset, data); + offset &= 3; + const u8 slot = BIT(offset, 1); + const u8 shift = BIT(offset, 0) << 3; + m_xrom_addr[slot] = (m_xrom_addr[slot] & ~(0xff << shift)) | (u32(data & 0xff) << shift); + LOGMASKED(LOG_XROM, "%s:XROM%d address %s write = %02X (addr=%04X)\n", machine().describe_context(), slot, slot ? "high" : "low", data, m_xrom_addr[slot]); } -u8 leland_state::gated_paletteram_r(offs_t offset) +u8 ataxx_state::xrom_r(offs_t offset) { - if (m_wcol_enable) - return m_palette->basemem().read8(offset); - return 0xff; -} - - -void ataxx_state::paletteram_and_misc_w(offs_t offset, u8 data) -{ - if (m_wcol_enable) - m_palette->write8(offset, data); - else if (offset == 0x7f8 || offset == 0x7f9) - master_video_addr_w(offset - 0x7f8, data); - else if (offset == 0x7fc) - { - m_xrom1_addr = (m_xrom1_addr & 0xff00) | (data & 0x00ff); - LOGMASKED(LOG_XROM, "%04X:XROM1 address low write = %02X (addr=%04X)\n", m_master->pc(), data, m_xrom1_addr); - } - else if (offset == 0x7fd) - { - m_xrom1_addr = (m_xrom1_addr & 0x00ff) | ((data << 8) & 0xff00); - LOGMASKED(LOG_XROM, "%04X:XROM1 address high write = %02X (addr=%04X)\n", m_master->pc(), data, m_xrom1_addr); - } - else if (offset == 0x7fe) - { - m_xrom2_addr = (m_xrom2_addr & 0xff00) | (data & 0x00ff); - LOGMASKED(LOG_XROM, "%04X:XROM2 address low write = %02X (addr=%04X)\n", m_master->pc(), data, m_xrom2_addr); - } - else if (offset == 0x7ff) - { - m_xrom2_addr = (m_xrom2_addr & 0x00ff) | ((data << 8) & 0xff00); - LOGMASKED(LOG_XROM, "%04X:XROM2 address high write = %02X (addr=%04X)\n", m_master->pc(), data, m_xrom2_addr); - } - else - m_extra_tram[offset] = data; -} - - -u8 ataxx_state::paletteram_and_misc_r(offs_t offset) -{ - if (m_wcol_enable) - return m_palette->basemem().read8(offset); - else if (offset == 0x7fc || offset == 0x7fd) - { - int result = m_xrom_base[0x00000 | m_xrom1_addr | ((offset & 1) << 16)]; - LOGMASKED(LOG_XROM, "%04X:XROM1 read(%d) = %02X (addr=%04X)\n", m_master->pc(), offset - 0x7fc, result, m_xrom1_addr); - return result; - } - else if (offset == 0x7fe || offset == 0x7ff) - { - int result = m_xrom_base[0x20000 | m_xrom2_addr | ((offset & 1) << 16)]; - LOGMASKED(LOG_XROM, "%04X:XROM2 read(%d) = %02X (addr=%04X)\n", m_master->pc(), offset - 0x7fc, result, m_xrom2_addr); - return result; - } - else - return m_extra_tram[offset]; + offset &= 3; + const u8 slot = BIT(offset, 1); + const u8 result = m_xrom_base[(u32(slot) << 16) | m_xrom_addr[slot]] >> (BIT(offset, 0) << 3) & 0xff; + if (!machine().side_effects_disabled()) + LOGMASKED(LOG_XROM, "%s:XROM%d read(%d) = %02X (addr=%04X)\n", machine().describe_context(), slot, offset, result, m_xrom_addr[slot]); + return result; } - /************************************* * * AY8910-controlled graphics latch @@ -1321,7 +1211,6 @@ void leland_state::sound_port_w(u8 data) } - /************************************* * * Slave CPU bankswitching @@ -1330,59 +1219,58 @@ void leland_state::sound_port_w(u8 data) void leland_state::slave_small_banksw_w(u8 data) { - int bankaddress = 0x10000 + 0xc000 * (data & 1); + int bankaddress = 0x10000 + 0xc000 * BIT(data, 0); if (bankaddress >= m_slave_base.length()) { - LOGMASKED(LOG_WARN, "%04X:Slave bank %02X out of range!", m_slave->pc(), data & 1); + LOGMASKED(LOG_WARN, "%s:Slave bank %02X out of range!", machine().describe_context(), BIT(data, 0)); bankaddress = 0x10000; } m_slave_bankslot->set_base(&m_slave_base[bankaddress]); - LOGMASKED(LOG_BANKSWITCHING_S, "%04X:Slave bank = %02X (%05X)\n", m_slave->pc(), data & 1, bankaddress); + LOGMASKED(LOG_BANKSWITCHING_S, "%s:Slave bank = %02X (%05X)\n", machine().describe_context(), BIT(data, 0), bankaddress); } void leland_state::slave_large_banksw_w(u8 data) { - int bankaddress = 0x10000 + 0x8000 * (data & 15); + int bankaddress = 0x10000 + 0x8000 * (data & 0x0f); if (bankaddress >= m_slave_base.length()) { - LOGMASKED(LOG_WARN, "%04X:Slave bank %02X out of range!", m_slave->pc(), data & 15); + LOGMASKED(LOG_WARN, "%s:Slave bank %02X out of range!", machine().describe_context(), data & 0x0f); bankaddress = 0x10000; } m_slave_bankslot->set_base(&m_slave_base[bankaddress]); - LOGMASKED(LOG_BANKSWITCHING_S, "%04X:Slave bank = %02X (%05X)\n", m_slave->pc(), data & 15, bankaddress); + LOGMASKED(LOG_BANKSWITCHING_S, "%s:Slave bank = %02X (%05X)\n", machine().describe_context(), data & 0x0f, bankaddress); } -void leland_state::ataxx_slave_banksw_w(u8 data) +void ataxx_state::ataxx_slave_banksw_w(u8 data) { - int bankaddress, bank = data & 15; + int bankaddress, bank = data & 0x0f; if (bank == 0) bankaddress = 0x2000; else { - bankaddress = 0x10000 * bank + 0x8000 * ((data >> 4) & 1); + bankaddress = 0x10000 * bank + 0x8000 * BIT(data, 4); if (m_slave_base.length() > 0x100000) - bankaddress += 0x100000 * ((data >> 5) & 1); + bankaddress += 0x100000 * BIT(data, 5); } if (bankaddress >= m_slave_base.length()) { - LOGMASKED(LOG_WARN, "%04X:Slave bank %02X out of range!", m_slave->pc(), data & 0x3f); + LOGMASKED(LOG_WARN, "%s:Slave bank %02X out of range!", machine().describe_context(), data & 0x3f); bankaddress = 0x2000; } m_slave_bankslot->set_base(&m_slave_base[bankaddress]); - LOGMASKED(LOG_BANKSWITCHING_S, "%04X:Slave bank = %02X (%05X)\n", m_slave->pc(), data, bankaddress); + LOGMASKED(LOG_BANKSWITCHING_S, "%s:Slave bank = %02X (%05X)\n", machine().describe_context(), data, bankaddress); } - /************************************* * * Slave CPU I/O @@ -1395,7 +1283,6 @@ u8 leland_state::raster_r() } - /************************************* * * Driver initialization @@ -1406,7 +1293,7 @@ u8 leland_state::raster_r() void leland_state::rotate_memory(const char *cpuname) { int startaddr = 0x10000; - int banks = (memregion(cpuname)->bytes() - startaddr) / 0x8000; + const int banks = (memregion(cpuname)->bytes() - startaddr) / 0x8000; u8 *ram = memregion(cpuname)->base(); u8 temp[0x2000]; diff --git a/src/mame/cinematronics/leland_v.cpp b/src/mame/cinematronics/leland_v.cpp index f25870e864b..3208406836a 100644 --- a/src/mame/cinematronics/leland_v.cpp +++ b/src/mame/cinematronics/leland_v.cpp @@ -21,8 +21,8 @@ /* constants */ -static constexpr int VRAM_SIZE = 0x10000; -static constexpr int QRAM_SIZE = 0x10000; +// TODO: double buffered? hardware has 4 64Kx4bit DRAM chips for video RAM. +static constexpr int VRAM_SIZE = 0x20000; /************************************* @@ -34,13 +34,13 @@ static constexpr int QRAM_SIZE = 0x10000; TIMER_CALLBACK_MEMBER(leland_state::scanline_callback) { u8 scanline = param; - u8 last_scanline = scanline - 1; + const u8 last_scanline = scanline - 1; /* update the DACs */ - if (!(m_dac_control & 0x01)) + if (!BIT(m_dac_control, 0)) m_dac[0]->write(m_video_ram[last_scanline << 8 | 0xa0]); - if (!(m_dac_control & 0x02)) + if (!BIT(m_dac_control, 1)) m_dac[1]->write(m_video_ram[last_scanline << 8 | 0xa1]); scanline++; @@ -64,9 +64,9 @@ TILEMAP_MAPPER_MEMBER(leland_state::leland_scan) TILE_GET_INFO_MEMBER(leland_state::leland_get_tile_info) { - int char_bank = ((m_gfxbank >> 4) & 0x03) << 10; - int prom_bank = ((m_gfxbank >> 3) & 0x01) << 13; - int tile = m_bg_prom[prom_bank | tile_index] | ((tile_index >> 7) & 0x300) | char_bank; + const int char_bank = ((m_gfxbank >> 4) & 0x03) << 10; + const int prom_bank = BIT(m_gfxbank, 3) << 13; + const int tile = m_bg_prom[prom_bank | tile_index] | ((tile_index >> 7) & 0x300) | char_bank; tileinfo.set(0, tile, m_bg_prom[prom_bank | tile_index] >> 5, 0); } @@ -85,10 +85,22 @@ TILEMAP_MAPPER_MEMBER(ataxx_state::ataxx_scan) TILE_GET_INFO_MEMBER(ataxx_state::ataxx_get_tile_info) { - u16 tile = m_ataxx_qram[tile_index] | ((m_ataxx_qram[0x4000 | tile_index] & 0x7f) << 8); + const u16 tile = m_qram[tile_index] | ((m_qram[0x4000 | tile_index] & 0x7f) << 8); tileinfo.set(0, tile, 0, 0); } +u8 ataxx_state::qram_r(offs_t offset) +{ + return m_qram[((m_master_bank & 0xc0) << 8) | offset]; +} + +void ataxx_state::qram_w(offs_t offset, u8 data) +{ + m_screen->update_partial(m_screen->vpos() - 1); + m_qram[((m_master_bank & 0xc0) << 8) | offset] = data; + m_tilemap->mark_tile_dirty(((m_master_bank & 0x80) << 8) | offset); +} + /************************************* * @@ -96,28 +108,35 @@ TILE_GET_INFO_MEMBER(ataxx_state::ataxx_get_tile_info) * *************************************/ +void leland_state::init_vram() +{ + m_video_ram = make_unique_clear<u8[]>(VRAM_SIZE); + + save_pointer(NAME(m_video_ram), VRAM_SIZE); + save_item(NAME(m_xscroll)); + save_item(NAME(m_yscroll)); + for (u8 i = 0; i < 2; i++) + { + save_item(NAME(m_vram_state[i].m_buffer), i); + save_item(NAME(m_vram_state[i].m_addr), i); + save_item(NAME(m_vram_state[i].m_latch), i); + } +} + void leland_state::video_start() { /* tilemap */ m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(leland_state::leland_get_tile_info)), tilemap_mapper_delegate(*this, FUNC(leland_state::leland_scan)), 8, 8, 256, 256); /* allocate memory */ - m_video_ram = make_unique_clear<u8[]>(VRAM_SIZE); + init_vram(); /* scanline timer */ m_scanline_timer = timer_alloc(FUNC(leland_state::scanline_callback), this); m_scanline_timer->adjust(m_screen->time_until_pos(0)); save_item(NAME(m_gfx_control)); - save_pointer(NAME(m_video_ram), VRAM_SIZE); - save_item(NAME(m_xscroll)); - save_item(NAME(m_yscroll)); save_item(NAME(m_gfxbank)); - for (u8 i = 0; i < 2; i++) - { - save_item(NAME(m_vram_state[i].m_addr), i); - save_item(NAME(m_vram_state[i].m_latch), i); - } } void ataxx_state::video_start() @@ -127,20 +146,7 @@ void ataxx_state::video_start() m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(ataxx_state::ataxx_get_tile_info)), tilemap_mapper_delegate(*this, FUNC(ataxx_state::ataxx_scan)), 8, 8, 256, 128); /* first do the standard stuff */ - m_video_ram = make_unique_clear<u8[]>(VRAM_SIZE); - - /* allocate memory */ - m_ataxx_qram = make_unique_clear<u8[]>(QRAM_SIZE); - - save_pointer(NAME(m_video_ram), VRAM_SIZE); - save_pointer(NAME(m_ataxx_qram), QRAM_SIZE); - save_item(NAME(m_xscroll)); - save_item(NAME(m_yscroll)); - for (u8 i = 0; i < 2; i++) - { - save_item(NAME(m_vram_state[i].m_addr), i); - save_item(NAME(m_vram_state[i].m_latch), i); - } + init_vram(); } @@ -199,12 +205,15 @@ void leland_state::gfx_port_w(u8 data) void leland_state::video_addr_w(offs_t offset, u8 data, int num) { - struct vram_state_data &state = m_vram_state[num]; + vram_state_data &state = m_vram_state[num]; if (!offset) state.m_addr = (state.m_addr & 0xfe00) | ((data << 1) & 0x01fe); else + { state.m_addr = ((data << 9) & 0xfe00) | (state.m_addr & 0x01fe); + state.m_buffer = BIT(data, 7); + } } @@ -216,10 +225,10 @@ void leland_state::video_addr_w(offs_t offset, u8 data, int num) int leland_state::vram_port_r(offs_t offset, int num) { - struct vram_state_data *state = m_vram_state + num; - int addr = state->m_addr; - int inc = (offset >> 2) & 2; - int ret; + vram_state_data &state = m_vram_state[num]; + u16 addr = state.m_addr; + const int inc = (offset >> 2) & 2; + u8 ret; switch (offset & 7) { @@ -241,18 +250,18 @@ int leland_state::vram_port_r(offs_t offset, int num) default: if (!machine().side_effects_disabled()) - LOGMASKED(LOG_WARN, "%s: Warning: Unknown video port %02x read (address=%04x)\n", - machine().describe_context(), offset, addr); + LOGMASKED(LOG_WARN, "%s: Warning: Unknown video port %02x read (address=%05x)\n", + machine().describe_context(), offset, (state.m_buffer << 16) | addr); ret = 0; break; } if (!machine().side_effects_disabled()) { - state->m_addr = addr; + state.m_addr = addr; if (addr >= 0xf000) - LOGMASKED(LOG_COMM, "%s:%s comm read %04X = %02X\n", machine().describe_context(), num ? "slave" : "master", addr, ret); + LOGMASKED(LOG_COMM, "%s:%s comm read %05X = %02X\n", machine().describe_context(), num ? "slave" : "master", (state.m_buffer << 16) | addr, ret); } return ret; @@ -267,73 +276,72 @@ int leland_state::vram_port_r(offs_t offset, int num) void leland_state::vram_port_w(offs_t offset, u8 data, int num) { - u8 *video_ram = m_video_ram.get(); - struct vram_state_data *state = m_vram_state + num; - int addr = state->m_addr; - int inc = (offset >> 2) & 2; - int trans = (offset >> 4) & num; + vram_state_data &state = m_vram_state[num]; + u16 addr = state.m_addr; + const int inc = (offset >> 2) & 2; + const bool trans = (offset >> 4) & num; m_screen->update_partial(m_screen->vpos() - 1); if (addr >= 0xf000) - LOGMASKED(LOG_COMM, "%s:%s comm write %04X = %02X\n", machine().describe_context(), num ? "slave" : "master", addr, data); + LOGMASKED(LOG_COMM, "%s:%s comm write %05X = %02X\n", machine().describe_context(), num ? "slave" : "master", (state.m_buffer << 16) | addr, data); /* based on the low 3 bits of the offset, update the destination */ switch (offset & 7) { case 1: /* write hi = data, lo = latch */ - video_ram[addr & ~1] = state->m_latch[0]; - video_ram[addr | 1] = data; + m_video_ram[addr & ~1] = state.m_latch[0]; + m_video_ram[addr | 1] = data; addr += inc; break; case 2: /* write hi = latch, lo = data */ - video_ram[addr & ~1] = data; - video_ram[addr | 1] = state->m_latch[1]; + m_video_ram[addr & ~1] = data; + m_video_ram[addr | 1] = state.m_latch[1]; addr += inc; break; case 3: /* write hi/lo = data (alternating) */ if (trans) { - if (!(data & 0xf0)) data |= video_ram[addr] & 0xf0; - if (!(data & 0x0f)) data |= video_ram[addr] & 0x0f; + if (!(data & 0xf0)) data |= m_video_ram[addr] & 0xf0; + if (!(data & 0x0f)) data |= m_video_ram[addr] & 0x0f; } - video_ram[addr] = data; + m_video_ram[addr] = data; addr += inc & (addr << 1); addr ^= 1; break; case 5: /* write hi = data */ - state->m_latch[1] = data; + state.m_latch[1] = data; if (trans) { - if (!(data & 0xf0)) data |= video_ram[addr | 1] & 0xf0; - if (!(data & 0x0f)) data |= video_ram[addr | 1] & 0x0f; + if (!(data & 0xf0)) data |= m_video_ram[addr | 1] & 0xf0; + if (!(data & 0x0f)) data |= m_video_ram[addr | 1] & 0x0f; } - video_ram[addr | 1] = data; + m_video_ram[addr | 1] = data; addr += inc; break; case 6: /* write lo = data */ - state->m_latch[0] = data; + state.m_latch[0] = data; if (trans) { - if (!(data & 0xf0)) data |= video_ram[addr & ~1] & 0xf0; - if (!(data & 0x0f)) data |= video_ram[addr & ~1] & 0x0f; + if (!(data & 0xf0)) data |= m_video_ram[addr & ~1] & 0xf0; + if (!(data & 0x0f)) data |= m_video_ram[addr & ~1] & 0x0f; } - video_ram[addr & ~1] = data; + m_video_ram[addr & ~1] = data; addr += inc; break; default: - LOGMASKED(LOG_WARN, "%s:Warning: Unknown video port write (address=%04x value=%02x)\n", - machine().describe_context(), offset, addr); + LOGMASKED(LOG_WARN, "%s:Warning: Unknown video port %02x write (address=%05x value=%02x)\n", + machine().describe_context(), offset, (state.m_buffer << 16) | addr, data); break; } /* update the address and plane */ - state->m_addr = addr; + state.m_addr = addr; } @@ -351,9 +359,9 @@ void leland_state::master_video_addr_w(offs_t offset, u8 data) TIMER_CALLBACK_MEMBER(leland_state::leland_delayed_mvram_w) { - int num = (param >> 16) & 1; - int offset = (param >> 8) & 0xff; - int data = param & 0xff; + const int num = (param >> 16) & 1; + const int offset = (param >> 8) & 0xff; + const int data = param & 0xff; vram_port_w(offset, data, num); } @@ -459,7 +467,7 @@ u32 leland_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, con pen_t pen = dst[x] & 0x3f; /* foreground is d6-d9 */ - if (x & 0x01) + if (BIT(x, 0)) pen = pen | ((fg_src[x >> 1] & 0x0f) << 6); else pen = pen | ((fg_src[x >> 1] & 0xf0) << 2); |
