diff options
Diffstat (limited to 'src/mame/drivers/firetrap.cpp')
-rw-r--r-- | src/mame/drivers/firetrap.cpp | 66 |
1 files changed, 39 insertions, 27 deletions
diff --git a/src/mame/drivers/firetrap.cpp b/src/mame/drivers/firetrap.cpp index a5e87c82127..e4063e437cf 100644 --- a/src/mame/drivers/firetrap.cpp +++ b/src/mame/drivers/firetrap.cpp @@ -166,6 +166,11 @@ Stephh's notes (based on the games Z80 code and some tests) : - Bugs in test mode : * when lives are set to "2", it displays "1". +Many interrupt-related gates, flip-flops and connections are crossed out +on the schematics. Coins were once supposed to trigger IRQs on the main +CPU, and the YM3526 was intended to drive the 6502 IRQ line directly, with +the MSM5205-derived interrupt assigned to the NMI line instead. + ***************************************************************************/ #include "emu.h" @@ -173,6 +178,7 @@ Stephh's notes (based on the games Z80 code and some tests) : #include "cpu/z80/z80.h" #include "cpu/m6502/m6502.h" +#include "cpu/mcs51/mcs51.h" #include "sound/3526intf.h" #include "screen.h" #include "speaker.h" @@ -305,36 +311,35 @@ WRITE8_MEMBER(firetrap_state::firetrap_8751_w) m_i8751_current_command=data; } -WRITE8_MEMBER(firetrap_state::firetrap_sound_command_w) +WRITE8_MEMBER(firetrap_state::sound_flip_flop_w) { - m_soundlatch->write(space, offset, data); - m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); + m_msm->reset_w(!BIT(data, 0)); + m_sound_irq_enable = BIT(data, 1); + if (!m_sound_irq_enable) + m_audiocpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE); } -WRITE8_MEMBER(firetrap_state::firetrap_sound_2400_w) -{ - m_msm->reset_w(~data & 0x01); - m_sound_irq_enable = data & 0x02; -} - -WRITE8_MEMBER(firetrap_state::firetrap_sound_bankselect_w) +WRITE8_MEMBER(firetrap_state::sound_bankselect_w) { membank("bank2")->set_entry(data & 0x01); } WRITE_LINE_MEMBER(firetrap_state::firetrap_adpcm_int) { - m_msm->data_w(m_msm5205next >> 4); - m_msm5205next <<= 4; + if (state) + { + m_adpcm_toggle ^= 1; + m_adpcm_select->select_w(m_adpcm_toggle); - m_adpcm_toggle ^= 1; - if (m_sound_irq_enable && m_adpcm_toggle) - m_audiocpu->set_input_line(M6502_IRQ_LINE, HOLD_LINE); + if (m_sound_irq_enable && m_adpcm_toggle) + m_audiocpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE); + } } -WRITE8_MEMBER(firetrap_state::firetrap_adpcm_data_w) +WRITE8_MEMBER(firetrap_state::adpcm_data_w) { - m_msm5205next = data; + m_audiocpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE); + m_adpcm_select->ba_w(data); } WRITE8_MEMBER(firetrap_state::flip_screen_w) @@ -352,7 +357,7 @@ static ADDRESS_MAP_START( firetrap_map, AS_PROGRAM, 8, firetrap_state ) AM_RANGE(0xe000, 0xe7ff) AM_RAM_WRITE(firetrap_fgvideoram_w) AM_SHARE("fgvideoram") AM_RANGE(0xe800, 0xe97f) AM_RAM AM_SHARE("spriteram") AM_RANGE(0xf000, 0xf000) AM_WRITENOP /* IRQ acknowledge */ - AM_RANGE(0xf001, 0xf001) AM_WRITE(firetrap_sound_command_w) + AM_RANGE(0xf001, 0xf001) AM_DEVWRITE("soundlatch", generic_latch_8_device, write) AM_RANGE(0xf002, 0xf002) AM_WRITE(firetrap_bankselect_w) AM_RANGE(0xf003, 0xf003) AM_WRITE(flip_screen_w) AM_RANGE(0xf004, 0xf004) AM_WRITE(firetrap_nmi_disable_w) @@ -378,7 +383,7 @@ static ADDRESS_MAP_START( firetrap_bootleg_map, AS_PROGRAM, 8, firetrap_state ) AM_RANGE(0xe000, 0xe7ff) AM_RAM_WRITE(firetrap_fgvideoram_w) AM_SHARE("fgvideoram") AM_RANGE(0xe800, 0xe97f) AM_RAM AM_SHARE("spriteram") AM_RANGE(0xf000, 0xf000) AM_WRITENOP /* IRQ acknowledge */ - AM_RANGE(0xf001, 0xf001) AM_WRITE(firetrap_sound_command_w) + AM_RANGE(0xf001, 0xf001) AM_DEVWRITE("soundlatch", generic_latch_8_device, write) AM_RANGE(0xf002, 0xf002) AM_WRITE(firetrap_bankselect_w) AM_RANGE(0xf003, 0xf003) AM_WRITE(flip_screen_w) AM_RANGE(0xf004, 0xf004) AM_WRITE(firetrap_nmi_disable_w) @@ -399,9 +404,9 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8, firetrap_state ) AM_RANGE(0x0000, 0x07ff) AM_RAM AM_RANGE(0x1000, 0x1001) AM_DEVWRITE("ymsnd", ym3526_device, write) - AM_RANGE(0x2000, 0x2000) AM_WRITE(firetrap_adpcm_data_w) /* ADPCM data for the MSM5205 chip */ - AM_RANGE(0x2400, 0x2400) AM_WRITE(firetrap_sound_2400_w) - AM_RANGE(0x2800, 0x2800) AM_WRITE(firetrap_sound_bankselect_w) + AM_RANGE(0x2000, 0x2000) AM_WRITE(adpcm_data_w) + AM_RANGE(0x2400, 0x2400) AM_WRITE(sound_flip_flop_w) + AM_RANGE(0x2800, 0x2800) AM_WRITE(sound_bankselect_w) AM_RANGE(0x3400, 0x3400) AM_DEVREAD("soundlatch", generic_latch_8_device, read) AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("bank2") AM_RANGE(0x8000, 0xffff) AM_ROM @@ -595,7 +600,6 @@ void firetrap_state::machine_start() save_item(NAME(m_nmi_enable)); save_item(NAME(m_i8751_return)); save_item(NAME(m_i8751_init_ptr)); - save_item(NAME(m_msm5205next)); save_item(NAME(m_adpcm_toggle)); save_item(NAME(m_coin_command_pending)); save_item(NAME(m_scroll1_x)); @@ -621,7 +625,6 @@ void firetrap_state::machine_reset() m_nmi_enable = 0; m_i8751_return = 0; m_i8751_init_ptr = 0; - m_msm5205next = 0xff; m_adpcm_toggle = 0; m_coin_command_pending = 0; } @@ -638,6 +641,8 @@ static MACHINE_CONFIG_START( firetrap ) /* IRQs are caused by the ADPCM chip */ /* NMIs are caused by the main CPU */ + MCFG_CPU_ADD("mcu", I8751, XTAL_8MHz) + MCFG_DEVICE_DISABLE() /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -656,12 +661,16 @@ static MACHINE_CONFIG_START( firetrap ) MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_GENERIC_LATCH_8_ADD("soundlatch") + MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("audiocpu", INPUT_LINE_NMI)) MCFG_SOUND_ADD("ymsnd", YM3526, FIRETRAP_XTAL/4) // 3 MHz MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) + MCFG_DEVICE_ADD("adpcm_select", LS157, 0) + MCFG_74157_OUT_CB(DEVWRITE8("msm", msm5205_device, data_w)) + MCFG_SOUND_ADD("msm", MSM5205, FIRETRAP_XTAL/32) // 375 kHz - MCFG_MSM5205_VCLK_CB(WRITELINE(firetrap_state, firetrap_adpcm_int)) /* interrupt function */ + MCFG_MSM5205_VCK_CALLBACK(WRITELINE(firetrap_state, firetrap_adpcm_int)) MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 7.8125kHz */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30) MACHINE_CONFIG_END @@ -678,7 +687,6 @@ static MACHINE_CONFIG_START( firetrapbl ) /* IRQs are caused by the ADPCM chip */ /* NMIs are caused by the main CPU */ - /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57.4034) @@ -696,12 +704,16 @@ static MACHINE_CONFIG_START( firetrapbl ) MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_GENERIC_LATCH_8_ADD("soundlatch") + MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("audiocpu", INPUT_LINE_NMI)) MCFG_SOUND_ADD("ymsnd", YM3526, FIRETRAP_XTAL/4) // 3 MHz MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) + MCFG_DEVICE_ADD("adpcm_select", LS157, 0) + MCFG_74157_OUT_CB(DEVWRITE8("msm", msm5205_device, data_w)) + MCFG_SOUND_ADD("msm", MSM5205, FIRETRAP_XTAL/32) // 375 kHz - MCFG_MSM5205_VCLK_CB(WRITELINE(firetrap_state, firetrap_adpcm_int)) /* interrupt function */ + MCFG_MSM5205_VCK_CALLBACK(WRITELINE(firetrap_state, firetrap_adpcm_int)) MCFG_MSM5205_PRESCALER_SELECTOR(S48_4B) /* 7.8125kHz */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30) MACHINE_CONFIG_END |