upd7759: only detect mode change in idle state

This commit is contained in:
hap 2023-03-13 13:52:02 +01:00
parent 7daa460652
commit 3bb3b0b65d
9 changed files with 44 additions and 93 deletions

View File

@ -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

View File

@ -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;

View File

@ -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)
void upd775x_device::port_w(u8 data)
{
uint8_t oldstart = m_start;
m_start = (state != 0);
LOG_STATE("upd7759_start_w: %d->%d\n", oldstart, m_start);
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();

View File

@ -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)

View File

@ -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));
}
}

View File

@ -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.

View File

@ -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
}

View File

@ -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

View File

@ -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"