swimmer: add nmi clear

This commit is contained in:
hap 2024-11-14 16:54:12 +01:00
parent 74efa6ef7a
commit 68abdc312e
2 changed files with 19 additions and 19 deletions

View File

@ -2,8 +2,7 @@
// copyright-holders:Nicola Salmoria // copyright-holders:Nicola Salmoria
/*************************************************************************** /***************************************************************************
Crazy Climber memory map (preliminary) Nichibutsu Crazy Climber
as described by Lionel Theunissen (lionelth@ozemail.com.au)
Crazy Kong is very similar to Crazy Climber, there is an additional ROM at Crazy Kong is very similar to Crazy Climber, there is an additional ROM at
5000-5fff and RAM is at 6000-6bff. Dip switches and input connections are 5000-5fff and RAM is at 6000-6bff. Dip switches and input connections are
@ -13,7 +12,6 @@ Swimmer is similar but also different (e.g. it has two CPUs and two 8910,
graphics are 3bpp instead of 2) graphics are 3bpp instead of 2)
TODO: TODO:
- verify timings of sound/music on Swimmer
- add tms5110 support to bagmanf - add tms5110 support to bagmanf
- toprollr Coin_B 2C_1C doesn't work right, is it a BTANB? - toprollr Coin_B 2C_1C doesn't work right, is it a BTANB?
@ -153,9 +151,9 @@ Cannon Ball
----------- -----------
The Cannon Ball bootlegs on this Falcon (Crazy Kong) hardware The Cannon Ball bootlegs on this Falcon (Crazy Kong) hardware
don't correctly handle the protection device found on the original don't correctly handle the protection device found on the original
pacman hardware conversion, this causes them to crash after the pacman hardware conversion, this causes them to crash after a few
a few rounds - confirmed on an original PCB. They clearly weren't rounds - confirmed on an original PCB. They clearly weren't tested
tested properly by the bootleggers. properly by the bootleggers.
------------------------------------------------------------------- -------------------------------------------------------------------
@ -398,18 +396,19 @@ void cclimber_state::bagmanf_vblank_irq(int state)
m_maincpu->set_input_line(0, HOLD_LINE); m_maincpu->set_input_line(0, HOLD_LINE);
} }
void cclimber_state::tangramq_sound_nmi_clear_w(uint8_t data) void cclimber_state::sound_nmi_clear_w(uint8_t data)
{ {
m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
} }
uint8_t cclimber_state::sound_nmi_clear_r()
void swimmer_state::swimmer_sh_soundlatch_w(uint8_t data)
{ {
m_soundlatch->write(data); if (!machine().side_effects_disabled())
m_audiocpu->set_input_line_and_vector(0, HOLD_LINE, 0xff); // Z80 sound_nmi_clear_w(0);
return 0xff;
} }
uint8_t swimmer_state::soundlatch_read_and_clear() uint8_t swimmer_state::soundlatch_read_and_clear()
{ {
uint8_t res = m_soundlatch->read(); uint8_t res = m_soundlatch->read();
@ -515,7 +514,7 @@ void swimmer_state::swimmer_root_map(address_map &map)
map(0x9c00, 0x9fff).ram().w(FUNC(swimmer_state::cclimber_colorram_w)).share("colorram"); map(0x9c00, 0x9fff).ram().w(FUNC(swimmer_state::cclimber_colorram_w)).share("colorram");
map(0xa000, 0xa007).w(m_mainlatch, FUNC(ls259_device::write_d0)); map(0xa000, 0xa007).w(m_mainlatch, FUNC(ls259_device::write_d0));
map(0xa000, 0xa000).mirror(0x07ff).portr("P2"); map(0xa000, 0xa000).mirror(0x07ff).portr("P2");
map(0xa800, 0xa800).mirror(0x07ff).portr("P1").w(FUNC(swimmer_state::swimmer_sh_soundlatch_w)); map(0xa800, 0xa800).mirror(0x07ff).portr("P1").w(m_soundlatch, FUNC(generic_latch_8_device::write));
map(0xb000, 0xb000).mirror(0x07ff).portr("DSW1"); map(0xb000, 0xb000).mirror(0x07ff).portr("DSW1");
map(0xb800, 0xb800).mirror(0x07ff).portr("DSW2"); map(0xb800, 0xb800).mirror(0x07ff).portr("DSW2");
} }
@ -665,9 +664,9 @@ void yamato_state::yamato_portmap(address_map &map)
void swimmer_state::swimmer_audio_map(address_map &map) void swimmer_state::swimmer_audio_map(address_map &map)
{ {
map(0x0000, 0x0fff).rom(); map(0x0000, 0x0fff).rom();
map(0x2000, 0x23ff).ram(); map(0x2000, 0x23ff).mirror(0x0c00).ram();
map(0x3000, 0x3000).r(FUNC(swimmer_state::soundlatch_read_and_clear)); map(0x3000, 0x3000).mirror(0x0fff).r(FUNC(swimmer_state::soundlatch_read_and_clear));
map(0x4000, 0x4001).ram(); // ??? map(0x4000, 0x4000).mirror(0x0fff).rw(FUNC(swimmer_state::sound_nmi_clear_r), FUNC(swimmer_state::sound_nmi_clear_w));
} }
void yamato_state::yamato_audio_map(address_map &map) void yamato_state::yamato_audio_map(address_map &map)
@ -701,7 +700,7 @@ void cclimber_state::tangramq_sound_map(address_map &map)
map(0x8000, 0x8001).w("ay1", FUNC(ay8910_device::address_data_w)); map(0x8000, 0x8001).w("ay1", FUNC(ay8910_device::address_data_w));
map(0x8002, 0x8007).w("wave", FUNC(snkwave_device::snkwave_w)); map(0x8002, 0x8007).w("wave", FUNC(snkwave_device::snkwave_w));
map(0x8008, 0x8009).w("ay2", FUNC(ay8910_device::address_data_w)); map(0x8008, 0x8009).w("ay2", FUNC(ay8910_device::address_data_w));
map(0xa000, 0xa000).w(FUNC(cclimber_state::tangramq_sound_nmi_clear_w)); map(0xa000, 0xa000).w(FUNC(cclimber_state::sound_nmi_clear_w));
map(0xe000, 0xe3ff).ram(); map(0xe000, 0xe3ff).ram();
} }
@ -1648,7 +1647,7 @@ void swimmer_state::swimmer(machine_config &config)
Z80(config, m_audiocpu, 4_MHz_XTAL/2); // verified on pcb Z80(config, m_audiocpu, 4_MHz_XTAL/2); // verified on pcb
m_audiocpu->set_addrmap(AS_PROGRAM, &swimmer_state::swimmer_audio_map); m_audiocpu->set_addrmap(AS_PROGRAM, &swimmer_state::swimmer_audio_map);
m_audiocpu->set_addrmap(AS_IO, &swimmer_state::swimmer_audio_portmap); m_audiocpu->set_addrmap(AS_IO, &swimmer_state::swimmer_audio_portmap);
m_audiocpu->set_periodic_int(FUNC(swimmer_state::nmi_line_pulse), attotime::from_ticks(0x4000, 4_MHz_XTAL)); m_audiocpu->set_periodic_int(FUNC(swimmer_state::nmi_line_assert), attotime::from_ticks(0x4000, 4_MHz_XTAL));
// video hardware // video hardware
SCREEN(config, m_screen, SCREEN_TYPE_RASTER); SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
@ -1669,6 +1668,7 @@ void swimmer_state::swimmer(machine_config &config)
SPEAKER(config, "speaker").front_center(); SPEAKER(config, "speaker").front_center();
GENERIC_LATCH_8(config, m_soundlatch); GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, 0, HOLD_LINE); // auto ack
AY8910(config, "ay1", 4_MHz_XTAL/2).add_route(ALL_OUTPUTS, "speaker", 0.25); // verified on pcb AY8910(config, "ay1", 4_MHz_XTAL/2).add_route(ALL_OUTPUTS, "speaker", 0.25); // verified on pcb
AY8910(config, "ay2", 4_MHz_XTAL/2).add_route(ALL_OUTPUTS, "speaker", 0.25); // verified on pcb AY8910(config, "ay2", 4_MHz_XTAL/2).add_route(ALL_OUTPUTS, "speaker", 0.25); // verified on pcb

View File

@ -83,6 +83,8 @@ protected:
void cclimber_portmap(address_map &map) ATTR_COLD; void cclimber_portmap(address_map &map) ATTR_COLD;
void vblank_irq(int state); void vblank_irq(int state);
void sound_nmi_clear_w(uint8_t data);
uint8_t sound_nmi_clear_r();
TILE_GET_INFO_MEMBER(cclimber_get_pf_tile_info); TILE_GET_INFO_MEMBER(cclimber_get_pf_tile_info);
TILE_GET_INFO_MEMBER(cclimber_get_bs_tile_info); TILE_GET_INFO_MEMBER(cclimber_get_bs_tile_info);
@ -98,7 +100,6 @@ private:
bool m_nmi_mask = false; bool m_nmi_mask = false;
void bagmanf_vblank_irq(int state); void bagmanf_vblank_irq(int state);
void tangramq_sound_nmi_clear_w(uint8_t data);
void cclimber_palette(palette_device &palette) const; void cclimber_palette(palette_device &palette) const;
@ -144,7 +145,6 @@ private:
uint16_t m_sidepen = 0; uint16_t m_sidepen = 0;
uint8_t soundlatch_read_and_clear(); uint8_t soundlatch_read_and_clear();
void swimmer_sh_soundlatch_w(uint8_t data);
void sidebg_enable_w(int state); void sidebg_enable_w(int state);
void palette_bank_w(int state); void palette_bank_w(int state);