summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author cam900 <dbtlrchl@naver.com>2026-05-04 03:40:40 +0900
committer GitHub <noreply@github.com>2026-05-04 04:40:40 +1000
commita92540ec95bbdf814974555b547e91c188cc496b (patch)
tree3164d328742cfd370212500a57f545a36a6a9c2e
parent37ee3f7cd3fbc151b80dff0d620b2cea2dfe54c0 (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.cpp136
-rw-r--r--src/mame/cinematronics/leland.h127
-rw-r--r--src/mame/cinematronics/leland_a.cpp68
-rw-r--r--src/mame/cinematronics/leland_a.h6
-rw-r--r--src/mame/cinematronics/leland_m.cpp459
-rw-r--r--src/mame/cinematronics/leland_v.cpp146
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);