From 3bb3b0b65d584f9d1d20051275e32ddbf8552c5a Mon Sep 17 00:00:00 2001 From: hap Date: Mon, 13 Mar 2023 13:52:02 +0100 Subject: upd7759: only detect mode change in idle state --- src/devices/cpu/sm510/sm510base.cpp | 2 +- src/devices/machine/nmc9306.cpp | 9 ++--- src/devices/sound/upd7759.cpp | 73 +++++++++---------------------------- src/devices/sound/upd7759.h | 14 ++----- src/mame/bfm/bfcobra.cpp | 4 -- src/mame/handheld/hh_tms1k.cpp | 2 +- src/mame/sega/segas16b.cpp | 23 +++++------- src/mame/sega/system16.cpp | 7 ++-- src/mame/tryom/chess.cpp | 3 ++ 9 files changed, 44 insertions(+), 93 deletions(-) diff --git a/src/devices/cpu/sm510/sm510base.cpp b/src/devices/cpu/sm510/sm510base.cpp index 96421034b97..5345d203723 100644 --- a/src/devices/cpu/sm510/sm510base.cpp +++ b/src/devices/cpu/sm510/sm510base.cpp @@ -243,7 +243,7 @@ void sm510_base_device::execute_set_input(int line, int state) void sm510_base_device::do_interrupt() { - standard_irq_callback(0, m_pc + m_skip); + standard_irq_callback(0, m_pc); // note: official doc warns that Bl/Bm and the stack are undefined // after waking up, but we leave it unchanged diff --git a/src/devices/machine/nmc9306.cpp b/src/devices/machine/nmc9306.cpp index ba5309421c1..e7e3df4a8a5 100644 --- a/src/devices/machine/nmc9306.cpp +++ b/src/devices/machine/nmc9306.cpp @@ -203,7 +203,7 @@ WRITE_LINE_MEMBER( nmc9306_device::cs_w ) if (m_state == STATE_WRITE) { LOG("NMC9306 WRAL\n"); - for (int address = 0; address < 16; address++) + for (int address = 0; address < 16; address++) { write(address, m_data); } @@ -214,7 +214,7 @@ WRITE_LINE_MEMBER( nmc9306_device::cs_w ) if (m_state == STATE_ERASE) { LOG("NMC9306 ERAL\n"); - for (int address = 0; address < 16; address++) + for (int address = 0; address < 16; address++) { erase(address); } @@ -228,7 +228,6 @@ WRITE_LINE_MEMBER( nmc9306_device::cs_w ) { LOG("NMC9306 WRITE %u:%04x\n", m_address, m_data); write(m_address, m_data); - break; } break; @@ -237,8 +236,8 @@ WRITE_LINE_MEMBER( nmc9306_device::cs_w ) { LOG("NMC9306 ERASE %u\n", m_address); erase(m_address); - break; } + break; } m_state = STATE_IDLE; @@ -382,7 +381,7 @@ WRITE_LINE_MEMBER( nmc9306_device::sk_w ) case STATE_DUMMY_OUT: m_do = 0; - + LOG("NMC9306 Dummy Bit OUT %u\n", m_do); m_state = STATE_DATA_OUT; diff --git a/src/devices/sound/upd7759.cpp b/src/devices/sound/upd7759.cpp index ea1790a40b5..426b1cdecd0 100644 --- a/src/devices/sound/upd7759.cpp +++ b/src/devices/sound/upd7759.cpp @@ -281,7 +281,6 @@ void upd7759_device::device_start() void upd775x_device::device_reset() { m_pos = 0; - //m_fifo_in = 0; // this seems to keep state when /RESET line asserted (test case: konmedal.cpp games) m_state = STATE_IDLE; m_clocks_left = 0; m_nibbles_left = 0; @@ -565,18 +564,13 @@ void upd775x_device::advance_state() } } -TIMER_CALLBACK_MEMBER(upd775x_device::sync_port_write) -{ - m_fifo_in = param; -} - TIMER_CALLBACK_MEMBER(upd7759_device::drq_update) { + m_channel->update(); + uint8_t olddrq = m_drq; int old_state = m_state; - m_channel->update(); - advance_state(); LOG_STATE("upd7759_slave_update: DRQ %d->%d\n", olddrq, m_drq); @@ -590,6 +584,8 @@ TIMER_CALLBACK_MEMBER(upd7759_device::drq_update) m_timer->adjust(m_clock_period * m_clocks_left); } + + /************************************************************ I/O handlers @@ -603,91 +599,64 @@ WRITE_LINE_MEMBER( upd775x_device::reset_w ) TIMER_CALLBACK_MEMBER(upd775x_device::internal_reset_w) { + m_channel->update(); + uint8_t oldreset = m_reset; m_reset = (param != 0); - m_channel->update(); - if (oldreset && !m_reset) device_reset(); } -TIMER_CALLBACK_MEMBER(upd7759_device::internal_reset_w) -{ - uint8_t oldreset = m_reset; - upd775x_device::internal_reset_w(param); - - if (!oldreset && m_reset) - { - if (!m_md) - { - m_mode = MODE_SLAVE; - m_state = STATE_START; - m_timer->adjust(attotime::zero); - } - } -} WRITE_LINE_MEMBER( upd775x_device::start_w ) { machine().scheduler().synchronize(timer_expired_delegate(FUNC(upd775x_device::internal_start_w), this), state); } -void upd7759_device::internal_start_w(int state) +void upd775x_device::internal_start_w(int state) { + m_channel->update(); + uint8_t oldstart = m_start; m_start = (state != 0); LOG_STATE("upd7759_start_w: %d->%d\n", oldstart, m_start); - m_channel->update(); - if (m_state == STATE_IDLE && m_mode == MODE_STAND_ALONE && oldstart && !m_start && m_reset) { m_state = STATE_START; - - if (m_mode == MODE_SLAVE) - m_timer->adjust(attotime::zero); } } -void upd7756_device::internal_start_w(int state) -{ - uint8_t oldstart = m_start; - m_start = (state != 0); - LOG_STATE("upd7759_start_w: %d->%d\n", oldstart, m_start); +void upd775x_device::port_w(u8 data) +{ + machine().scheduler().synchronize(timer_expired_delegate(FUNC(upd775x_device::internal_port_w), this), data); +} +TIMER_CALLBACK_MEMBER(upd775x_device::internal_port_w) +{ m_channel->update(); - if (m_state == STATE_IDLE && oldstart && !m_start && m_reset) - { - m_state = STATE_START; - } + m_fifo_in = param; } WRITE_LINE_MEMBER(upd7759_device::md_w) { - // When called from machine configs/during start up set the mode pin directly. - if (m_timer == nullptr) - { - m_md = state; - return; - } machine().scheduler().synchronize(timer_expired_delegate(FUNC(upd7759_device::internal_md_w), this), state); } - TIMER_CALLBACK_MEMBER(upd7759_device::internal_md_w) { + m_channel->update(); + uint8_t old_md = m_md; m_md = (param != 0); LOG_STATE("upd7759_md_w: %d->%d\n", old_md, m_md); - m_channel->update(); - if (m_state == STATE_IDLE && m_reset) { if (old_md && !m_md) @@ -704,12 +673,6 @@ TIMER_CALLBACK_MEMBER(upd7759_device::internal_md_w) } -void upd775x_device::port_w(u8 data) -{ - machine().scheduler().synchronize(timer_expired_delegate(FUNC(upd775x_device::sync_port_write), this), data); -} - - READ_LINE_MEMBER( upd775x_device::busy_r ) { m_channel->update(); diff --git a/src/devices/sound/upd7759.h b/src/devices/sound/upd7759.h index f23bdb51ac3..af6035ae4ac 100644 --- a/src/devices/sound/upd7759.h +++ b/src/devices/sound/upd7759.h @@ -27,8 +27,9 @@ public: void set_start_delay(uint32_t data) { m_start_delay = data; } protected: - virtual TIMER_CALLBACK_MEMBER(internal_start_w) = 0; + virtual TIMER_CALLBACK_MEMBER(internal_start_w); virtual TIMER_CALLBACK_MEMBER(internal_reset_w); + virtual TIMER_CALLBACK_MEMBER(internal_port_w); enum { @@ -59,8 +60,8 @@ protected: // chip modes enum { - MODE_STAND_ALONE, - MODE_SLAVE + MODE_SLAVE, + MODE_STAND_ALONE }; upd775x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); @@ -78,8 +79,6 @@ protected: void update_adpcm(int data); virtual void advance_state(); - TIMER_CALLBACK_MEMBER(sync_port_write); - // internal state sound_stream *m_channel; // stream channel for playback @@ -138,9 +137,6 @@ protected: virtual void device_start() override; virtual void device_reset() override; - virtual TIMER_CALLBACK_MEMBER(internal_start_w) override; - virtual TIMER_CALLBACK_MEMBER(internal_reset_w) override; - TIMER_CALLBACK_MEMBER(drq_update); void internal_md_w(int state); @@ -158,8 +154,6 @@ protected: upd7756_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); virtual void device_reset() override; - - virtual TIMER_CALLBACK_MEMBER(internal_start_w) override; }; DECLARE_DEVICE_TYPE(UPD7759, upd7759_device) diff --git a/src/mame/bfm/bfcobra.cpp b/src/mame/bfm/bfcobra.cpp index e1819043364..1801b2a009a 100644 --- a/src/mame/bfm/bfcobra.cpp +++ b/src/mame/bfm/bfcobra.cpp @@ -2533,13 +2533,9 @@ void bfcobjam_state::aux_upd7759_w(uint8_t data) if( m_aux_upd7759 ) { m_aux_upd7759->set_rom_bank((data>>2)&3); - m_aux_upd7759->port_w((data>>4)&0xf); - m_aux_upd7759->md_w(1); - m_aux_upd7759->reset_w(BIT(data, 0)); - m_aux_upd7759->start_w(!BIT(data, 1)); } } diff --git a/src/mame/handheld/hh_tms1k.cpp b/src/mame/handheld/hh_tms1k.cpp index ed425af4244..8532056288f 100644 --- a/src/mame/handheld/hh_tms1k.cpp +++ b/src/mame/handheld/hh_tms1k.cpp @@ -1413,7 +1413,7 @@ ROM_END Canon Palmtronic MD-8 (Multi 8) / Canon Canola MD 810 * PCB label: Canon EHI-0115-03 * TMS1070 MCU label TMC1079 (die label: 1070B, 1079A) - * 2-line cyan VFD, each 9-digit 7seg + 1 custom (label 20-ST-22) + * cyan VFD Futaba 20-ST-22, 2-line 9-digit 7seg + 1 custom The only difference between MD-8 and MD 810 is the form factor. The latter is a tabletop calculator. diff --git a/src/mame/sega/segas16b.cpp b/src/mame/sega/segas16b.cpp index 383a264517e..55fd7537d9f 100644 --- a/src/mame/sega/segas16b.cpp +++ b/src/mame/sega/segas16b.cpp @@ -1153,9 +1153,9 @@ void segas16b_state::upd7759_control_w(uint8_t data) int size = memregion("soundcpu")->bytes() - 0x10000; if (size > 0) { - // it is important to write in this order: if the /START line goes low + // it is important to write in this order: if the /MD line goes low // at the same time /RESET goes low, no sample should be started - m_upd7759->start_w(BIT(data, 7)); + m_upd7759->md_w(BIT(~data, 7)); m_upd7759->reset_w(BIT(data, 6)); // banking depends on the ROM board @@ -1280,6 +1280,7 @@ void segas16b_state::machine_reset() m_hwc_input_value = 0; m_mj_input_num = 0; m_mj_last_val = 0; + // if we have a hard-coded mapping configuration, set it now if (m_i8751_initial_config != nullptr) m_mapper->configure_explicit(m_i8751_initial_config); @@ -1727,7 +1728,6 @@ void dfjail_state::dfjail_map(address_map &map) map(0xc42000, 0xc42001).portr("DSW1"); map(0xc42002, 0xc42003).portr("DSW2"); map(0xc43000, 0xc43001).nopw(); - } void segas16b_state::map_fpointbla(address_map &map) @@ -3945,13 +3945,14 @@ void segas16b_state::system16b(machine_config &config) // sound hardware SPEAKER(config, "mono").front_center(); -#if USE_NL - YM2151(config, m_ym2151, MASTER_CLOCK_8MHz/2) - .add_route(0, "netlist", 0.43, 0) - .add_route(1, "netlist", 0.43, 1); + YM2151(config, m_ym2151, MASTER_CLOCK_8MHz/2); + UPD7759(config, m_upd7759); - m_upd7759->md_w(0); m_upd7759->drq().set(FUNC(segas16b_state::upd7759_generate_nmi)); + +#if USE_NL + m_ym2151->add_route(0, "netlist", 0.43, 0); + m_ym2151->add_route(1, "netlist", 0.43, 1); m_upd7759->add_route(0, "netlist", 0.48, 2); NETLIST_SOUND(config, "netlist", 48000) @@ -3969,11 +3970,7 @@ void segas16b_state::system16b(machine_config &config) NETLIST_STREAM_OUTPUT(config, "netlist:cout0", 0, "OUT").set_mult_offset(1.0 / 0.2, 0.0); #else - YM2151(config, m_ym2151, MASTER_CLOCK_8MHz/2).add_route(ALL_OUTPUTS, "mono", 0.43); - - UPD7759(config, m_upd7759); - m_upd7759->md_w(0); - m_upd7759->drq().set(FUNC(segas16b_state::upd7759_generate_nmi)); + m_ym2151->add_route(ALL_OUTPUTS, "mono", 0.43); m_upd7759->add_route(ALL_OUTPUTS, "mono", 0.48); #endif } diff --git a/src/mame/sega/system16.cpp b/src/mame/sega/system16.cpp index e66c1f949b6..fae49799915 100644 --- a/src/mame/sega/system16.cpp +++ b/src/mame/sega/system16.cpp @@ -511,11 +511,11 @@ void segas1x_bootleg_state::sound_7759_map(address_map &map) } -void segas1x_bootleg_state::upd7759_bank_w(uint8_t data)//* +void segas1x_bootleg_state::upd7759_bank_w(uint8_t data) { int offs, size = m_soundcpu_region->bytes() - 0x10000; - m_upd7759->start_w(BIT(data, 7)); + m_upd7759->md_w(BIT(~data, 7)); m_upd7759->reset_w(BIT(data, 6)); offs = 0x10000 + (data * 0x4000) % size; membank("bank1")->set_base(m_soundcpu_region->base() + offs); @@ -2103,7 +2103,6 @@ void segas1x_bootleg_state::z80_ym2151_upd7759(machine_config &config) YM2151(config, "ymsnd", 4000000).add_route(0, "lspeaker", 0.32).add_route(1, "rspeaker", 0.32); UPD7759(config, m_upd7759); - m_upd7759->md_w(0); m_upd7759->drq().set(FUNC(segas1x_bootleg_state::sound_cause_nmi)); m_upd7759->add_route(ALL_OUTPUTS, "lspeaker", 0.48); m_upd7759->add_route(ALL_OUTPUTS, "rspeaker", 0.48); @@ -3152,7 +3151,7 @@ ROM_START( tturfbl ) ROM_LOAD16_BYTE( "12276.4b", 0x60001, 0x10000, CRC(838bd71f) SHA1(82d9d127438f5e1906b1cf40bf3b4727f2ee5685) ) ROM_LOAD16_BYTE( "12280.8b", 0x60000, 0x10000, CRC(639a57cb) SHA1(84fd8b96758d38f9e1ba1a3c2cf8099ec0452784) ) - ROM_REGION( 0x30000, "soundcpu", 0 ) //* sound CPU */ + ROM_REGION( 0x30000, "soundcpu", 0 ) /* sound CPU */ ROM_LOAD( "tt014d68.rom", 0x10000, 0x10000, CRC(d4aab1d9) SHA1(94885896d59da1ecabe2377a194fcf61eaae3765) ) ROM_LOAD( "tt0246ff.rom", 0x20000, 0x10000, CRC(bb4bba8f) SHA1(b182a7e1d0425e93c2c1b93472aafd30a6af6907) ) ROM_END diff --git a/src/mame/tryom/chess.cpp b/src/mame/tryom/chess.cpp index ab73cbe61e4..1d1ab9839be 100644 --- a/src/mame/tryom/chess.cpp +++ b/src/mame/tryom/chess.cpp @@ -17,6 +17,9 @@ The user interface resembles CompuChess. At the "L" prompt, enter level (1-8). At "bP", press A for new game, B for empty board, C to continue. At "0", press 1-4 for an opening book, or 5 to select one at random. +BTANB: +- it locks up after pressing CE while it's thinking + *******************************************************************************/ #include "emu.h" -- cgit v1.2.3