mirror of
https://github.com/holub/mame
synced 2025-04-22 16:31:49 +03:00
upd7759: only detect mode change in idle state
This commit is contained in:
parent
7daa460652
commit
3bb3b0b65d
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
@ -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)
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user