diff --git a/docs/source/techspecs/cpu_device.rst b/docs/source/techspecs/cpu_device.rst index 3d1170a42992f..c21a20a4fe71e 100644 --- a/docs/source/techspecs/cpu_device.rst +++ b/docs/source/techspecs/cpu_device.rst @@ -183,9 +183,9 @@ the access time and false is returned to tell to do the access. The method ``access_before_delay`` allows to try to run an access after a given delay. The tag is an opaque, non-nullptr value used to -characterize the source of the delay, so taht the delay is not applied +characterize the source of the delay, so that the delay is not applied multiple times. Similarly to the previous method cycles are eaten and -true is returned to abort the access, false do execute it. +true is returned to abort the access, false to execute it. .. code-block:: C++ diff --git a/src/mame/technos/spdodgeb.cpp b/src/mame/technos/spdodgeb.cpp index 9a931952676e7..2f2fefb4e9989 100644 --- a/src/mame/technos/spdodgeb.cpp +++ b/src/mame/technos/spdodgeb.cpp @@ -555,7 +555,7 @@ void spdodgeb_state::machine_reset() { m_adpcm_pos[0] = m_adpcm_pos[1] = 0; m_adpcm_end[0] = m_adpcm_end[1] = 0; - m_adpcm_idle[0] = m_adpcm_data[1] = 0; + m_adpcm_idle[0] = m_adpcm_idle[1] = 0; m_adpcm_data[0] = m_adpcm_data[1] = -1; m_mcu_status = 0; memset(m_inputs, 0, sizeof(m_inputs)); diff --git a/src/mame/tecmo/tecmo.cpp b/src/mame/tecmo/tecmo.cpp index 800ff70e893b3..5b7df91586050 100644 --- a/src/mame/tecmo/tecmo.cpp +++ b/src/mame/tecmo/tecmo.cpp @@ -259,8 +259,7 @@ void tecmo_state::adpcm_vol_w(uint8_t data) void tecmo_state::adpcm_int(int state) { - if (m_adpcm_pos >= m_adpcm_end || - m_adpcm_pos >= m_adpcm_rom.bytes()) + if (m_adpcm_pos >= m_adpcm_end || m_adpcm_pos >= m_adpcm_rom.bytes()) m_msm->reset_w(1); else if (m_adpcm_data != -1) { diff --git a/src/mame/universal/docastle.cpp b/src/mame/universal/docastle.cpp index 8f7f3a41d03e9..a2f1e876b9ac5 100644 --- a/src/mame/universal/docastle.cpp +++ b/src/mame/universal/docastle.cpp @@ -150,16 +150,10 @@ ac00 sound port 4 CURSOR pin. The cursor is configured at scanline 0, and causes the games to update the next video frame during active display. What is the culprit here? For now, it's simply hooked up to vsync. -- correct adpcm status in idsoccer -- real values for the adpcm interface in idsoccer -- bad adpcm sound in attract mode for idsoccer clones (once you get them to boot up) -- idsoccer clones lock up MAME after writing junk to CRTC. Workaround: - idsoccera/idsoccert: maincpu bp 1120 -> pc=1123 -> run - asoccer: maincpu bp 1120 -> pc=1135 -> run - Or simply ROM_FILL(0x247, 1, 0x23 or 0x35 instead of 0x20) on the subcpu (not - guaranteed that a permanent ROM hack like this won't break anything). - This 0x1120 is a return address written to the stack after communicating with - the subcpu. Maybe protection. See MT05419. +- verify real values for the adpcm interface in idsoccer +- idsoccera gives a subcpu ROM checksum error (hold START at boot). idsoccert + subcpu ROM dump is identical, so it's probably fine? Moreover, idsoccert + gives maincpu ROM checksum errors. *******************************************************************************/ @@ -265,7 +259,8 @@ class idsoccer_state : public docastle_state public: idsoccer_state(const machine_config &mconfig, device_type type, const char *tag) : docastle_state(mconfig, type, tag), - m_msm(*this, "msm") + m_msm(*this, "msm"), + m_adpcm_rom(*this, "adpcm") { } void idsoccer(machine_config &config); @@ -276,11 +271,11 @@ class idsoccer_state : public docastle_state private: required_device m_msm; + required_region_ptr m_adpcm_rom; - int m_adpcm_pos = 0; - int m_adpcm_idle = 0; - int m_adpcm_data = 0; - int m_adpcm_status = 0; + uint32_t m_adpcm_pos = 0; + uint32_t m_adpcm_end = 0; + uint8_t m_adpcm_idle = 0; void idsoccer_map(address_map &map) ATTR_COLD; @@ -307,9 +302,8 @@ void idsoccer_state::machine_start() docastle_state::machine_start(); save_item(NAME(m_adpcm_pos)); - save_item(NAME(m_adpcm_data)); + save_item(NAME(m_adpcm_end)); save_item(NAME(m_adpcm_idle)); - save_item(NAME(m_adpcm_status)); } void docastle_state::machine_reset() @@ -330,12 +324,7 @@ void idsoccer_state::machine_reset() { docastle_state::machine_reset(); - m_prev_ma6 = 0; - - m_adpcm_pos = 0; - m_adpcm_idle = 0; - m_adpcm_data = -1; - m_adpcm_status = 0; + m_adpcm_idle = 1; } @@ -664,28 +653,22 @@ void docastle_state::subcpu_nmi_w(uint8_t data) void idsoccer_state::adpcm_int(int state) { - if (m_adpcm_pos >= memregion("adpcm")->bytes()) + if (m_adpcm_pos >= m_adpcm_end || m_adpcm_pos >= m_adpcm_rom.bytes() * 2) { m_adpcm_idle = 1; m_msm->reset_w(1); } - else if (m_adpcm_data != -1) - { - m_msm->data_w(m_adpcm_data & 0x0f); - m_adpcm_data = -1; - } else { - m_adpcm_data = memregion("adpcm")->base()[m_adpcm_pos++]; - m_msm->data_w(m_adpcm_data >> 4); + uint8_t data = m_adpcm_rom[m_adpcm_pos / 2]; + m_msm->data_w(m_adpcm_pos & 1 ? data & 0xf : data >> 4); + m_adpcm_pos++; } } uint8_t idsoccer_state::adpcm_status_r() { - // this is wrong, but the samples work anyway!! - m_adpcm_status ^= 0x80; - return m_adpcm_status; + return m_adpcm_idle ? 0 : 0x80; } void idsoccer_state::adpcm_w(uint8_t data) @@ -695,9 +678,10 @@ void idsoccer_state::adpcm_w(uint8_t data) m_adpcm_idle = 1; m_msm->reset_w(1); } - else + else if (data & 0x40) { - m_adpcm_pos = (data & 0x7f) * 0x200; + m_adpcm_pos = (data & 3) * 0x8000; + m_adpcm_end = m_adpcm_pos + 0x8000; m_adpcm_idle = 0; m_msm->reset_w(0); } @@ -1110,9 +1094,9 @@ void idsoccer_state::idsoccer(machine_config &config) MCFG_VIDEO_START_OVERRIDE(idsoccer_state,dorunrun) // sound hardware - MSM5205(config, m_msm, 384_kHz_XTAL); // Crystal verified on American Soccer board. + MSM5205(config, m_msm, 384_kHz_XTAL); // XTAL verified on American Soccer board m_msm->vck_legacy_callback().set(FUNC(idsoccer_state::adpcm_int)); // interrupt function - m_msm->set_prescaler_selector(msm5205_device::S64_4B); // 6 kHz ??? + m_msm->set_prescaler_selector(msm5205_device::S48_4B); // 8 kHz? m_msm->add_route(ALL_OUTPUTS, "mono", 0.40); } @@ -1509,8 +1493,6 @@ ROM_START( idsoccera ) ROM_REGION( 0x8000, "gfx1", 0 ) ROM_LOAD( "indoor.e6", 0x0000, 0x4000, CRC(a57c7a11) SHA1(9faebad0050da05101811427f350e163a7811396) ) - // some graphic / sound ROMs also differ on this set - verify them - // the sound ROM causes bad sound, but the implementation is hacked ROM_REGION( 0x20000, "gfx2", 0 ) ROM_LOAD( "indoor.p3", 0x00000, 0x8000, CRC(b42a6f4a) SHA1(ddce4438b3649610bd3703cbd7592aaa9a3eda0e) ) ROM_LOAD( "indoor.n3", 0x08000, 0x8000, CRC(fa2b1c77) SHA1(0d8e9db065c76621deb58575f01c6ec5ee6cf6b0) ) @@ -1518,7 +1500,7 @@ ROM_START( idsoccera ) ROM_LOAD( "indoor.k3", 0x18000, 0x8000, CRC(a2a69223) SHA1(6bd9b76e0119643450c9f64c80b52e9056da82d6) ) ROM_REGION( 0x10000, "adpcm", 0 ) - ROM_LOAD( "indoor.ic1", 0x0000, 0x4000, CRC(3bb65dc7) SHA1(499151903b3da9fa2455b3d2c04863b3e33e853d) ) // different (causes bad sound in attract, but isn't a bad dump since it has been confirmed on multiple boards) + ROM_LOAD( "indoor.ic1", 0x0000, 0x4000, CRC(3bb65dc7) SHA1(499151903b3da9fa2455b3d2c04863b3e33e853d) ) // different ROM_LOAD( "indoor.ic3", 0x8000, 0x4000, CRC(27bebba3) SHA1(cf752b22603c1e2a0b33958481c652d6d56ebf68) ) ROM_LOAD( "indoor.ic4", 0xc000, 0x4000, CRC(dd5ffaa2) SHA1(4bc4330a54ca93448a8fe05207d3fb1a3a9872e1) ) @@ -1619,7 +1601,7 @@ GAME( 1984, dowild, 0, dorunrun, dowild, docastle_state, empty_init GAME( 1984, jjack, 0, dorunrun, jjack, docastle_state, empty_init, ROT270, "Universal", "Jumping Jack", MACHINE_SUPPORTS_SAVE ) GAME( 1984, kickridr, 0, dorunrun, kickridr, docastle_state, empty_init, ROT0, "Universal", "Kick Rider", MACHINE_SUPPORTS_SAVE ) -GAME( 1985, idsoccer, 0, idsoccer, idsoccer, idsoccer_state, empty_init, ROT0, "Universal", "Indoor Soccer (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL ) -GAME( 1985, idsoccera, idsoccer, idsoccer, idsoccer, idsoccer_state, empty_init, ROT0, "Universal", "Indoor Soccer (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // see MT05419 -GAME( 1985, idsoccert, idsoccer, idsoccer, idsoccer, idsoccer_state, empty_init, ROT0, "Universal (Tecfri license)", "Indoor Soccer (Tecfri license PCB)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // see MT05419 -GAME( 1987, asoccer, idsoccer, idsoccer, idsoccer, idsoccer_state, empty_init, ROT0, "Universal", "American Soccer", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // see MT05419 +GAME( 1985, idsoccer, 0, idsoccer, idsoccer, idsoccer_state, empty_init, ROT0, "Universal", "Indoor Soccer (set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1985, idsoccera, idsoccer, idsoccer, idsoccer, idsoccer_state, empty_init, ROT0, "Universal", "Indoor Soccer (set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1985, idsoccert, idsoccer, idsoccer, idsoccer, idsoccer_state, empty_init, ROT0, "Universal (Tecfri license)", "Indoor Soccer (Tecfri)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, asoccer, idsoccer, idsoccer, idsoccer, idsoccer_state, empty_init, ROT0, "Universal", "American Soccer (Japan)", MACHINE_SUPPORTS_SAVE )