From 755f17458bfee4b9487fec2c57498d82c54663e0 Mon Sep 17 00:00:00 2001 From: AJR Date: Tue, 12 Jun 2018 10:35:16 -0400 Subject: [PATCH] jedi: Moderate driver overhaul - Split NVRAM between two 4-bit X2212 devices - Guarantee an invalid checksum when default NVRAM data is used (so that the manufacturer's high scores will be installed) - Soundlatch modernization - Use WSQ handler to drive TMS5220 --- src/mame/audio/jedi.cpp | 99 ++++++--------------------------------- src/mame/drivers/jedi.cpp | 59 +++++++++++++++-------- src/mame/includes/jedi.h | 38 +++++---------- 3 files changed, 68 insertions(+), 128 deletions(-) diff --git a/src/mame/audio/jedi.cpp b/src/mame/audio/jedi.cpp index f13e0e5ffc3..31d2d6dc4db 100644 --- a/src/mame/audio/jedi.cpp +++ b/src/mame/audio/jedi.cpp @@ -16,40 +16,6 @@ -/************************************* - * - * Start - * - *************************************/ - -void jedi_state::sound_start() -{ - /* set up save state */ - save_item(NAME(m_audio_latch)); - save_item(NAME(m_audio_ack_latch)); - save_item(NAME(m_speech_strobe_state)); -} - - - -/************************************* - * - * Reset - * - *************************************/ - -void jedi_state::sound_reset() -{ - /* init globals */ - m_audio_latch = 0; - m_audio_ack_latch = 0; - *m_audio_comm_stat = 0; - *m_speech_data = 0; - m_speech_strobe_state = 0; -} - - - /************************************* * * Interrupt handling @@ -72,53 +38,20 @@ WRITE8_MEMBER(jedi_state::irq_ack_w) WRITE_LINE_MEMBER(jedi_state::audio_reset_w) { m_audiocpu->set_input_line(INPUT_LINE_RESET, state ? CLEAR_LINE : ASSERT_LINE); + if (!state) + m_tms->set_output_gain(ALL_OUTPUTS, 0.0); } -TIMER_CALLBACK_MEMBER(jedi_state::delayed_audio_latch_w) +READ8_MEMBER(jedi_state::audio_comm_stat_r) { - m_audio_latch = param; - *m_audio_comm_stat |= 0x80; -} - - -WRITE8_MEMBER(jedi_state::jedi_audio_latch_w) -{ - machine().scheduler().synchronize(timer_expired_delegate(FUNC(jedi_state::delayed_audio_latch_w), this), data); -} - - -READ8_MEMBER(jedi_state::audio_latch_r) -{ - *m_audio_comm_stat &= ~0x80; - return m_audio_latch; + return (m_soundlatch->pending_r() << 7) | (m_sacklatch->pending_r() << 6); } CUSTOM_INPUT_MEMBER(jedi_state::jedi_audio_comm_stat_r) { - return *m_audio_comm_stat >> 6; -} - - - -/************************************* - * - * Sound CPU -> Main CPU communications - * - *************************************/ - -READ8_MEMBER(jedi_state::jedi_audio_ack_latch_r) -{ - *m_audio_comm_stat &= ~0x40; - return m_audio_ack_latch; -} - - -WRITE8_MEMBER(jedi_state::audio_ack_latch_w) -{ - m_audio_ack_latch = data; - *m_audio_comm_stat |= 0x40; + return (m_soundlatch->pending_r() << 1) | m_sacklatch->pending_r(); } @@ -131,13 +64,7 @@ WRITE8_MEMBER(jedi_state::audio_ack_latch_w) WRITE8_MEMBER(jedi_state::speech_strobe_w) { - int new_speech_strobe_state = (~offset >> 8) & 1; - - if ((new_speech_strobe_state != m_speech_strobe_state) && new_speech_strobe_state) - { - m_tms->data_w(space, 0, *m_speech_data); - } - m_speech_strobe_state = new_speech_strobe_state; + m_tms->wsq_w(BIT(offset, 8)); } @@ -149,7 +76,8 @@ READ8_MEMBER(jedi_state::speech_ready_r) WRITE8_MEMBER(jedi_state::speech_reset_w) { - /* not supported by the TMS5220 emulator */ + // Flip-flop at 8C controls the power supply to the TMS5220 (through transistors Q6 and Q7) + m_tms->set_output_gain(ALL_OUTPUTS, BIT(data, 0) ? 1.0 : 0.0); } @@ -168,14 +96,14 @@ void jedi_state::audio_map(address_map &map) map(0x0820, 0x082f).mirror(0x07c0).rw("pokey3", FUNC(pokey_device::read), FUNC(pokey_device::write)); map(0x0830, 0x083f).mirror(0x07c0).rw("pokey4", FUNC(pokey_device::read), FUNC(pokey_device::write)); map(0x1000, 0x1000).mirror(0x00ff).nopr().w(FUNC(jedi_state::irq_ack_w)); - map(0x1100, 0x1100).mirror(0x00ff).nopr().writeonly().share("speech_data"); + map(0x1100, 0x1100).mirror(0x00ff).nopr().w("tms", FUNC(tms5220_device::data_w)); map(0x1200, 0x13ff).nopr().w(FUNC(jedi_state::speech_strobe_w)); - map(0x1400, 0x1400).mirror(0x00ff).nopr().w(FUNC(jedi_state::audio_ack_latch_w)); + map(0x1400, 0x1400).mirror(0x00ff).nopr().w("sacklatch", FUNC(generic_latch_8_device::write)); map(0x1500, 0x1500).mirror(0x00ff).nopr().w(FUNC(jedi_state::speech_reset_w)); map(0x1600, 0x17ff).noprw(); - map(0x1800, 0x1800).mirror(0x03ff).r(FUNC(jedi_state::audio_latch_r)).nopw(); + map(0x1800, 0x1800).mirror(0x03ff).r("soundlatch", FUNC(generic_latch_8_device::read)).nopw(); map(0x1c00, 0x1c00).mirror(0x03fe).r(FUNC(jedi_state::speech_ready_r)).nopw(); - map(0x1c01, 0x1c01).mirror(0x03fe).readonly().nopw().share("audio_comm_stat"); + map(0x1c01, 0x1c01).mirror(0x03fe).r(FUNC(jedi_state::audio_comm_stat_r)).nopw(); map(0x2000, 0x7fff).noprw(); map(0x8000, 0xffff).rom(); } @@ -217,4 +145,7 @@ MACHINE_CONFIG_START(jedi_state::jedi_audio) MCFG_DEVICE_ADD("tms", TMS5220, JEDI_TMS5220_CLOCK) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) + + MCFG_GENERIC_LATCH_8_ADD("soundlatch") // 5E (LS374) + 3E (LS279) pins 13-15 + MCFG_GENERIC_LATCH_8_ADD("sacklatch") // 4E (LS374) + 3E (LS279) pins 1-4 MACHINE_CONFIG_END diff --git a/src/mame/drivers/jedi.cpp b/src/mame/drivers/jedi.cpp index 7411bd5590f..a827529ddef 100644 --- a/src/mame/drivers/jedi.cpp +++ b/src/mame/drivers/jedi.cpp @@ -165,9 +165,6 @@ void jedi_state::machine_start() /* configure the banks */ membank("bank1")->configure_entries(0, 3, memregion("maincpu")->base() + 0x10000, 0x4000); - - /* set up save state */ - save_item(NAME(m_nvram_enabled)); } @@ -180,9 +177,8 @@ void jedi_state::machine_start() void jedi_state::machine_reset() { - /* init globals */ - m_a2d_select = 0; - m_nvram_enabled = 0; + m_novram[0]->recall(1); + m_novram[1]->recall(1); } @@ -223,20 +219,36 @@ WRITE_LINE_MEMBER(jedi_state::coin_counter_right_w) /************************************* * - * NVRAM + * X2212-30 NOVRAM * *************************************/ -WRITE8_MEMBER(jedi_state::nvram_data_w) +READ8_MEMBER(jedi_state::novram_data_r) { - if (m_nvram_enabled) - m_nvram[offset] = data; + return (m_novram[0]->read(space, offset) & 0x0f) | (m_novram[1]->read(space, offset) << 4); } -WRITE8_MEMBER(jedi_state::nvram_enable_w) +WRITE8_MEMBER(jedi_state::novram_data_w) { - m_nvram_enabled = ~offset & 1; + m_novram[0]->write(space, offset, data & 0x0f); + m_novram[1]->write(space, offset, data >> 4); +} + + +WRITE8_MEMBER(jedi_state::novram_recall_w) +{ + m_novram[0]->recall(BIT(offset, 0)); + m_novram[1]->recall(BIT(offset, 0)); +} + + +WRITE8_MEMBER(jedi_state::novram_store_w) +{ + m_novram[0]->store(1); + m_novram[1]->store(1); + m_novram[0]->store(0); + m_novram[1]->store(0); } @@ -250,19 +262,19 @@ WRITE8_MEMBER(jedi_state::nvram_enable_w) void jedi_state::main_map(address_map &map) { map(0x0000, 0x07ff).ram(); - map(0x0800, 0x08ff).mirror(0x0300).ram().w(FUNC(jedi_state::nvram_data_w)).share("nvram"); + map(0x0800, 0x08ff).mirror(0x0300).rw(FUNC(jedi_state::novram_data_r), FUNC(jedi_state::novram_data_w)); map(0x0c00, 0x0c00).mirror(0x03fe).portr("0c00").nopw(); map(0x0c01, 0x0c01).mirror(0x03fe).portr("0c01").nopw(); map(0x1000, 0x13ff).noprw(); - map(0x1400, 0x1400).mirror(0x03ff).r(FUNC(jedi_state::jedi_audio_ack_latch_r)).nopw(); + map(0x1400, 0x1400).mirror(0x03ff).r("sacklatch", FUNC(generic_latch_8_device::read)).nopw(); map(0x1800, 0x1800).mirror(0x03ff).r("adc", FUNC(adc0808_device::data_r)).nopw(); - map(0x1c00, 0x1c01).mirror(0x007e).nopr().w(FUNC(jedi_state::nvram_enable_w)); + map(0x1c00, 0x1c01).mirror(0x007e).nopr().w(FUNC(jedi_state::novram_recall_w)); map(0x1c80, 0x1c87).mirror(0x0078).nopr().w("adc", FUNC(adc0808_device::address_offset_start_w)); - map(0x1d00, 0x1d00).mirror(0x007f).noprw(); /* write: NVRAM store */ + map(0x1d00, 0x1d00).mirror(0x007f).nopr().w(FUNC(jedi_state::novram_store_w)); map(0x1d80, 0x1d80).mirror(0x007f).nopr().w("watchdog", FUNC(watchdog_timer_device::reset_w)); map(0x1e00, 0x1e00).mirror(0x007f).nopr().w(FUNC(jedi_state::main_irq_ack_w)); map(0x1e80, 0x1e87).mirror(0x0078).nopr().w("outlatch", FUNC(ls259_device::write_d7)); - map(0x1f00, 0x1f00).mirror(0x007f).nopr().w(FUNC(jedi_state::jedi_audio_latch_w)); + map(0x1f00, 0x1f00).mirror(0x007f).nopr().w("soundlatch", FUNC(generic_latch_8_device::write)); map(0x1f80, 0x1f80).mirror(0x007f).nopr().w(FUNC(jedi_state::rom_banksel_w)); map(0x2000, 0x27ff).ram().share("backgroundram"); map(0x2800, 0x2fff).ram().share("paletteram"); @@ -324,9 +336,10 @@ MACHINE_CONFIG_START(jedi_state::jedi) MCFG_QUANTUM_TIME(attotime::from_hz(240)) - MCFG_NVRAM_ADD_0FILL("nvram") + MCFG_X2212_ADD("novram12b") + MCFG_X2212_ADD("novram12c") - MCFG_DEVICE_ADD("adc", ADC0809, JEDI_AUDIO_CPU_OSC / 2 / 9) + MCFG_DEVICE_ADD("adc", ADC0809, JEDI_AUDIO_CPU_OSC / 2 / 9) // nominally 666 kHz MCFG_ADC0808_IN0_CB(IOPORT("STICKY")) MCFG_ADC0808_IN1_CB(NOOP) // SPARE MCFG_ADC0808_IN2_CB(IOPORT("STICKX")) @@ -386,6 +399,14 @@ ROM_START( jedi ) ROM_REGION( 0x1000, "proms", 0 ) /* background smoothing */ ROM_LOAD( "136030-117.bin", 0x0000, 0x0400, CRC(9831bd55) SHA1(12945ef2d1582914125b9ee591567034d71d6573) ) ROM_LOAD( "136030-118.bin", 0x0800, 0x0400, CRC(261fbfe7) SHA1(efc65a74a3718563a07b718e34d8a7aa23339a69) ) + + // NOVRAM default fills are specified to guarantee an invalid checksum + ROM_REGION( 0x100, "novram12b", 0 ) + ROM_FILL( 0x00, 0x100, 0x0f ) + ROM_FILL( 0x50, 0x010, 0x00 ) + ROM_REGION( 0x100, "novram12c", 0 ) + ROM_FILL( 0x00, 0x100, 0x0f ) + ROM_FILL( 0x50, 0x010, 0x00 ) ROM_END diff --git a/src/mame/includes/jedi.h b/src/mame/includes/jedi.h index 33ff8f86b3e..d0d0e3f4466 100644 --- a/src/mame/includes/jedi.h +++ b/src/mame/includes/jedi.h @@ -10,6 +10,8 @@ #pragma once +#include "machine/gen_latch.h" +#include "machine/x2212.h" #include "sound/tms5220.h" #include "screen.h" @@ -28,17 +30,17 @@ class jedi_state : public driver_device public: jedi_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_nvram(*this, "nvram") , m_backgroundram(*this, "backgroundram"), m_paletteram(*this, "paletteram"), m_foregroundram(*this, "foregroundram"), m_spriteram(*this, "spriteram"), m_smoothing_table(*this, "smoothing_table"), - m_audio_comm_stat(*this, "audio_comm_stat"), - m_speech_data(*this, "speech_data"), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), + m_soundlatch(*this, "soundlatch"), + m_sacklatch(*this, "sacklatch"), m_tms(*this, "tms"), + m_novram(*this, "novram12%c", 'b'), m_screen(*this, "screen") { } @@ -48,33 +50,27 @@ public: protected: DECLARE_WRITE8_MEMBER(main_irq_ack_w); DECLARE_WRITE8_MEMBER(rom_banksel_w); - DECLARE_READ8_MEMBER(a2d_data_r); - DECLARE_WRITE8_MEMBER(a2d_select_w); DECLARE_WRITE_LINE_MEMBER(coin_counter_left_w); DECLARE_WRITE_LINE_MEMBER(coin_counter_right_w); - DECLARE_WRITE8_MEMBER(nvram_data_w); - DECLARE_WRITE8_MEMBER(nvram_enable_w); + DECLARE_READ8_MEMBER(novram_data_r); + DECLARE_WRITE8_MEMBER(novram_data_w); + DECLARE_WRITE8_MEMBER(novram_recall_w); + DECLARE_WRITE8_MEMBER(novram_store_w); DECLARE_WRITE8_MEMBER(jedi_vscroll_w); DECLARE_WRITE8_MEMBER(jedi_hscroll_w); DECLARE_WRITE8_MEMBER(irq_ack_w); DECLARE_WRITE_LINE_MEMBER(audio_reset_w); - DECLARE_WRITE8_MEMBER(jedi_audio_latch_w); - DECLARE_READ8_MEMBER(audio_latch_r); - DECLARE_READ8_MEMBER(jedi_audio_ack_latch_r); - DECLARE_WRITE8_MEMBER(audio_ack_latch_w); + DECLARE_READ8_MEMBER(audio_comm_stat_r); DECLARE_WRITE8_MEMBER(speech_strobe_w); DECLARE_READ8_MEMBER(speech_ready_r); DECLARE_WRITE8_MEMBER(speech_reset_w); virtual void machine_start() override; virtual void machine_reset() override; - virtual void sound_start() override; - virtual void sound_reset() override; virtual void video_start() override; DECLARE_WRITE_LINE_MEMBER(foreground_bank_w); DECLARE_WRITE_LINE_MEMBER(video_off_w); uint32_t screen_update_jedi(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); TIMER_CALLBACK_MEMBER(generate_interrupt); - TIMER_CALLBACK_MEMBER(delayed_audio_latch_w); void get_pens(pen_t *pens); void do_pen_lookup(bitmap_rgb32 &bitmap, const rectangle &cliprect); void draw_background_and_text(bitmap_rgb32 &bitmap, const rectangle &cliprect); @@ -85,11 +81,7 @@ protected: void main_map(address_map &map); private: - required_shared_ptr m_nvram; - /* machine state */ - uint8_t m_a2d_select; - uint8_t m_nvram_enabled; emu_timer *m_interrupt_timer; /* video state */ @@ -103,16 +95,12 @@ private: bool m_foreground_bank; bool m_video_off; - /* audio state */ - uint8_t m_audio_latch; - uint8_t m_audio_ack_latch; - required_shared_ptr m_audio_comm_stat; - required_shared_ptr m_speech_data; - uint8_t m_speech_strobe_state; - required_device m_maincpu; required_device m_audiocpu; + required_device m_soundlatch; + required_device m_sacklatch; required_device m_tms; + required_device_array m_novram; required_device m_screen; };