taitosj.cpp: Add proper handling of sound cpu NMI on sound command register and semaphore writes and clears. Add note about an unemulated filter effect on one of the AY chips. Some savestate and init fixes. [Lord Nightmare]

This commit is contained in:
Lord-Nightmare 2016-09-18 00:56:51 -04:00
parent be9b9810d6
commit b4054bb635
2 changed files with 39 additions and 14 deletions

View File

@ -175,14 +175,22 @@ TODO:
WRITE8_MEMBER(taitosj_state::taitosj_sndnmi_msk_w)
{
m_sndnmi_disable = data & 0x01;
m_sndnmi_disable = (data & 1);
if ((m_sound_cmd_written && (!m_sndnmi_disable)) || m_sound_semaphore)
m_audiocpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
else
m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
}
WRITE8_MEMBER(taitosj_state::sound_command_w)
{
m_sound_cmd_ack = true;
m_sound_cmd_written = true;
m_soundlatch->write(space,0,data);
if (!m_sndnmi_disable) m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
// figure out NMI State
if ((m_sound_cmd_written && (!m_sndnmi_disable)) || m_sound_semaphore)
m_audiocpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
else
m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
}
@ -192,9 +200,13 @@ WRITE8_MEMBER(taitosj_state::input_port_4_f0_w)
}
// EPORT2
WRITE8_MEMBER(taitosj_state::sound_semaphore_assert_w)
WRITE8_MEMBER(taitosj_state::sound_semaphore_w)
{
m_sound_semaphore = (data & 1) == 1;
m_sound_semaphore = (data & 1);
if ((m_sound_cmd_written && (!m_sndnmi_disable)) || m_sound_semaphore)
m_audiocpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
else
m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
}
CUSTOM_INPUT_MEMBER(taitosj_state::input_port_4_f0_r)
@ -233,7 +245,7 @@ static ADDRESS_MAP_START( taitosj_main_nomcu_map, AS_PROGRAM, 8, taitosj_state )
AM_RANGE(0xd508, 0xd508) AM_MIRROR(0x00f0) AM_WRITE(taitosj_collision_reg_clear_w)
AM_RANGE(0xd509, 0xd50a) AM_MIRROR(0x00f0) AM_WRITEONLY AM_SHARE("gfxpointer")
AM_RANGE(0xd50b, 0xd50b) AM_MIRROR(0x00f0) AM_WRITE(sound_command_w)
AM_RANGE(0xd50c, 0xd50c) AM_MIRROR(0x00f0) AM_WRITE(sound_semaphore_assert_w)
AM_RANGE(0xd50c, 0xd50c) AM_MIRROR(0x00f0) AM_WRITE(sound_semaphore_w)
AM_RANGE(0xd50d, 0xd50d) AM_MIRROR(0x00f0) AM_WRITEONLY /*watchdog_reset_w*/ /* Bio Attack sometimes resets after you die */
AM_RANGE(0xd50e, 0xd50e) AM_MIRROR(0x00f0) AM_WRITE(taitosj_bankswitch_w)
AM_RANGE(0xd50f, 0xd50f) AM_MIRROR(0x00f0) AM_WRITENOP
@ -305,7 +317,7 @@ static ADDRESS_MAP_START( kikstart_main_map, AS_PROGRAM, 8, taitosj_state )
AM_RANGE(0xd508, 0xd508) AM_WRITE(taitosj_collision_reg_clear_w)
AM_RANGE(0xd509, 0xd50a) AM_WRITEONLY AM_SHARE("gfxpointer")
AM_RANGE(0xd50b, 0xd50b) AM_WRITE(sound_command_w)
AM_RANGE(0xd50c, 0xd50c) AM_WRITE(sound_semaphore_assert_w)
AM_RANGE(0xd50c, 0xd50c) AM_WRITE(sound_semaphore_w)
AM_RANGE(0xd50d, 0xd50d) AM_DEVWRITE("watchdog", watchdog_timer_device, reset_w)
AM_RANGE(0xd50e, 0xd50e) AM_WRITE(taitosj_bankswitch_w)
AM_RANGE(0xd600, 0xd600) AM_WRITEONLY AM_SHARE("video_mode")
@ -316,14 +328,14 @@ ADDRESS_MAP_END
// RD5000
READ8_MEMBER(taitosj_state::sound_command_r)
{
m_sound_cmd_ack = false;
m_sound_cmd_written = false;
return m_soundlatch->read(space,0);
}
// RD5001
READ8_MEMBER(taitosj_state::sound_status_r)
{
return (m_sound_cmd_ack == true ? 8 : 0) | (m_sound_semaphore == true ? 4 : 0) | 3;
return (m_sound_cmd_written == true ? 8 : 0) | (m_sound_semaphore == true ? 4 : 0) | 3;
}
// WR5000
@ -336,6 +348,10 @@ WRITE8_MEMBER(taitosj_state::sound_command_ack_w)
WRITE8_MEMBER(taitosj_state::sound_semaphore_clear_w)
{
m_sound_semaphore = false;
if ((m_sound_cmd_written && (!m_sndnmi_disable)) || m_sound_semaphore)
m_audiocpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
else
m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
}
@ -1798,6 +1814,12 @@ static MACHINE_CONFIG_START( nomcu, taitosj_state )
MCFG_SOUND_ADD("ay4", AY8910, XTAL_6MHz/4) // 6mhz/4 on GAME board, AY-3-8910 @ IC50
MCFG_AY8910_OUTPUT_TYPE(AY8910_SINGLE_OUTPUT)
/* TODO: Implement ay4 Port A bits 0 and 1 which connect to a 7416 open
collector inverter, to selectively tie none, either or both of two
capacitors between the ay4 audio output signal and ground, or between
audio output signal and high-z (i.e. do nothing).
Bio Attack uses this?
*/
MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(taitosj_state, taitosj_sndnmi_msk_w)) /* port Bwrite */
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
@ -2703,7 +2725,8 @@ ROM_END
void taitosj_state::reset_common()
{
m_sndnmi_disable = 1;
m_sndnmi_disable = false; // ay-3-8910 resets all registers to 0 on reset
m_sound_semaphore = false;
m_input_port_4_f0 = 0;
/* start in 1st gear */
m_kikstart_gears[0] = 0x02;
@ -2715,6 +2738,8 @@ void taitosj_state::reset_common()
void taitosj_state::init_common()
{
save_item(NAME(m_sndnmi_disable));
save_item(NAME(m_sound_cmd_written));
save_item(NAME(m_sound_semaphore));
save_item(NAME(m_input_port_4_f0));
save_item(NAME(m_kikstart_gears));
save_item(NAME(m_dac_out));

View File

@ -34,7 +34,6 @@ public:
typedef void (taitosj_state::*copy_layer_func_t)(bitmap_ind16 &,
const rectangle &, int, int *, rectangle *);
UINT8 m_sndnmi_disable;
UINT8 m_input_port_4_f0;
UINT8 m_kikstart_gears[2];
INT8 m_dac_out;
@ -63,8 +62,9 @@ public:
UINT8 m_spacecr_prot_value;
UINT8 m_protection_value;
UINT32 m_address;
bool m_sound_cmd_ack;
bool m_sound_semaphore;
bool m_sndnmi_disable; // AKA "CIOB0" on schematic
bool m_sound_cmd_written; // 74ls74 1/2 @ GAME BOARD IC42
bool m_sound_semaphore; // 74ls74 2/2 @ GAME BOARD IC42
bitmap_ind16 m_layer_bitmap[3];
bitmap_ind16 m_sprite_sprite_collbitmap1;
bitmap_ind16 m_sprite_sprite_collbitmap2;
@ -75,7 +75,7 @@ public:
DECLARE_WRITE8_MEMBER(sound_command_w);
DECLARE_READ8_MEMBER(sound_command_r);
DECLARE_READ8_MEMBER(sound_status_r);
DECLARE_WRITE8_MEMBER(sound_semaphore_assert_w);
DECLARE_WRITE8_MEMBER(sound_semaphore_w);
DECLARE_WRITE8_MEMBER(sound_semaphore_clear_w);
DECLARE_WRITE8_MEMBER(taitosj_bankswitch_w);
DECLARE_READ8_MEMBER(taitosj_fake_data_r);