From 14f9adffcfbc2aba923321646d67a6067bda9ffc Mon Sep 17 00:00:00 2001 From: AJR Date: Thu, 14 Jul 2022 21:59:49 -0400 Subject: mac.cpp, mac128.cpp, macpwrbk030.cpp, macquadra700.cpp: Source 1-second interrupt from RTC rather than inaccurately count VBLANKs --- src/mame/apple/mac.cpp | 3 +++ src/mame/apple/mac.h | 2 +- src/mame/apple/mac128.cpp | 17 ++--------------- src/mame/apple/mac_m.cpp | 11 ----------- src/mame/apple/macpwrbk030.cpp | 32 +++++++++++++++++--------------- src/mame/apple/macquadra700.cpp | 15 +-------------- src/mame/apple/macrtc.cpp | 39 +++++++++++++++++++++++++++++++++------ src/mame/apple/macrtc.h | 9 ++++++++- 8 files changed, 65 insertions(+), 63 deletions(-) diff --git a/src/mame/apple/mac.cpp b/src/mame/apple/mac.cpp index de21e4257fa..adf57c066d9 100644 --- a/src/mame/apple/mac.cpp +++ b/src/mame/apple/mac.cpp @@ -569,7 +569,10 @@ static void mac_lcpds_cards(device_slot_interface &device) void mac_state::add_base_devices(machine_config &config, bool rtc, int woz_version) { if (rtc) + { RTC3430042(config, m_rtc, XTAL(32'768)); + m_rtc->cko_cb().set(m_via1, FUNC(via6522_device::write_ca2)); + } switch (woz_version) { case 0: diff --git a/src/mame/apple/mac.h b/src/mame/apple/mac.h index d48bb5bf6ad..32e6e0ddb29 100644 --- a/src/mame/apple/mac.h +++ b/src/mame/apple/mac.h @@ -233,7 +233,7 @@ private: bool m_main_buffer = false; int m_adb_irq_pending = 0; int m_screen_buffer = 0; - int irq_count = 0, ca1_data = 0, ca2_data = 0; + int ca1_data = 0; // 60.15 Hz timer for RBV/V8/Eagle/VASP/etc. emu_timer *m_6015_timer = nullptr; diff --git a/src/mame/apple/mac128.cpp b/src/mame/apple/mac128.cpp index 27c5518f7f4..8b9de31d903 100644 --- a/src/mame/apple/mac128.cpp +++ b/src/mame/apple/mac128.cpp @@ -177,7 +177,7 @@ private: required_device m_iwm; required_device_array m_floppy; optional_device m_mackbd; - optional_device m_rtc; + required_device m_rtc; required_device m_screen; required_device m_dac; // actually 1-bit pwm w/8-bit counters required_device m_filter; @@ -251,7 +251,6 @@ private: uint32_t m_overlay = 0; - int m_irq_count = 0, m_ca2_data = 0; uint8_t m_mouse_bit[2]{}, m_mouse_last[2]{}; int16_t m_mouse_last_m[2]{}, m_mouse_count[2]{}; int m_screen_buffer = 0; @@ -286,8 +285,6 @@ void mac128_state::machine_start() m_hblank_timer = timer_alloc(FUNC(mac128_state::mac_hblank), this); save_item(NAME(m_overlay)); - save_item(NAME(m_irq_count)); - save_item(NAME(m_ca2_data)); save_item(NAME(m_mouse_bit)); save_item(NAME(m_mouse_last)); save_item(NAME(m_mouse_last_m)); @@ -321,8 +318,6 @@ void mac128_state::machine_reset() m_snd_enable = false; m_main_buffer = true; m_snd_vol = 3; - m_irq_count = 0; - m_ca2_data = 0; m_adb_irq_pending = 0; m_drive_select = 0; m_scsiirq_enable = 0; @@ -419,15 +414,6 @@ void mac128_state::vblank_irq() { m_macadb->adb_vblank(); } - - if (++m_irq_count == 60) - { - m_irq_count = 0; - - m_ca2_data ^= 1; - /* signal 1 Hz irq on CA2 input on the VIA */ - m_via->write_ca2(m_ca2_data); - } } void mac128_state::update_volume() @@ -1149,6 +1135,7 @@ void mac128_state::mac512ke(machine_config &config) /* devices */ RTC3430042(config, m_rtc, 32.768_kHz_XTAL); + m_rtc->cko_cb().set(m_via, FUNC(via6522_device::write_ca2)); IWM(config, m_iwm, C7M); m_iwm->phases_cb().set(FUNC(mac128_state::phases_w)); diff --git a/src/mame/apple/mac_m.cpp b/src/mame/apple/mac_m.cpp index 7ef649acd7f..f4d8a771f99 100644 --- a/src/mame/apple/mac_m.cpp +++ b/src/mame/apple/mac_m.cpp @@ -1014,9 +1014,7 @@ void mac_state::machine_start() save_item(NAME(m_nubus_irq_state)); save_item(NAME(m_se30_vbl_enable)); save_item(NAME(m_adb_irq_pending)); - save_item(NAME(irq_count)); save_item(NAME(ca1_data)); - save_item(NAME(ca2_data)); save_item(NAME(m_rbv_regs)); save_item(NAME(m_rbv_ier)); save_item(NAME(m_rbv_ifr)); @@ -1293,15 +1291,6 @@ void mac_state::vblank_irq() m_macadb->adb_vblank(); } - if (++irq_count == 60) - { - irq_count = 0; - - ca2_data ^= 1; - /* signal 1 Hz irq on CA2 input on the VIA */ - m_via1->write_ca2(ca2_data); - } - // handle SE/30 vblank IRQ if (m_model == MODEL_MAC_SE30) { diff --git a/src/mame/apple/macpwrbk030.cpp b/src/mame/apple/macpwrbk030.cpp index b7ad9236206..17b813b50f4 100644 --- a/src/mame/apple/macpwrbk030.cpp +++ b/src/mame/apple/macpwrbk030.cpp @@ -145,6 +145,7 @@ public: m_ram(*this, RAM_TAG), m_swim(*this, "fdc"), m_floppy(*this, "fdc:%d", 0U), + m_rtc(*this, "rtc"), m_screen(*this, "screen"), m_palette(*this, "palette"), m_asc(*this, "asc"), @@ -179,6 +180,7 @@ private: required_device m_ram; required_device m_swim; required_device_array m_floppy; + required_device m_rtc; required_device m_screen; required_device m_palette; required_device m_asc; @@ -219,7 +221,7 @@ private: TIMER_CALLBACK_MEMBER(mac_6015_tick); WRITE_LINE_MEMBER(via_cb2_w) { m_macadb->adb_data_w(state); } int m_via_interrupt = 0, m_via2_interrupt = 0, m_scc_interrupt = 0, m_asc_interrupt = 0, m_last_taken_interrupt = 0; - int m_irq_count = 0, m_ca1_data = 0, m_ca2_data = 0, m_via2_ca1_hack = 0; + int m_ca1_data = 0, m_via2_ca1_hack = 0; u32 rom_switch_r(offs_t offset); bool m_overlay = false; @@ -396,7 +398,7 @@ void macpb030_state::machine_start() m_rom_size = memregion("bootrom")->bytes(); m_via_interrupt = m_via2_interrupt = m_scc_interrupt = m_asc_interrupt = 0; m_last_taken_interrupt = -1; - m_irq_count = m_ca1_data = m_ca2_data = 0; + m_ca1_data = 0; m_6015_timer = timer_alloc(FUNC(macpb030_state::mac_6015_tick), this); m_6015_timer->adjust(attotime::never); @@ -407,7 +409,7 @@ void macpb030_state::machine_reset() m_overlay = true; m_via_interrupt = m_via2_interrupt = m_scc_interrupt = m_asc_interrupt = 0; m_last_taken_interrupt = -1; - m_irq_count = m_ca1_data = m_ca2_data = 0; + m_ca1_data = 0; m_via2_ca1_hack = 0; m_cur_floppy = nullptr; @@ -602,15 +604,6 @@ TIMER_CALLBACK_MEMBER(macpb030_state::mac_6015_tick) m_pmu->set_input_line(m50753_device::M50753_INT1_LINE, ASSERT_LINE); m_macadb->adb_vblank(); - - if (++m_irq_count == 60) - { - m_irq_count = 0; - - m_ca2_data ^= 1; - /* signal 1 Hz irq on CA2 input on the VIA */ - m_via1->write_ca2(m_ca2_data); - } } u16 macpb030_state::scsi_r(offs_t offset, u16 mem_mask) @@ -845,7 +838,7 @@ u8 macpb030_state::mac_via_in_a() u8 macpb030_state::mac_via_in_b() { - return 0x08; // flag indicating no Target Disk Mode + return 0x08 | m_rtc->data_r(); // flag indicating no Target Disk Mode } void macpb030_state::mac_via_out_a(u8 data) @@ -863,6 +856,9 @@ void macpb030_state::mac_via_out_a(u8 data) void macpb030_state::mac_via_out_b(u8 data) { + m_rtc->ce_w(BIT(data, 2)); + m_rtc->data_w(BIT(data, 0)); + m_rtc->clk_w(BIT(data, 1)); } u8 macpb030_state::mac_via2_in_a() @@ -923,6 +919,9 @@ void macpb030_state::macpb140(machine_config &config) m_macadb->set_mcu_mode(true); m_macadb->adb_data_callback().set(FUNC(macpb030_state::set_adb_line)); + RTC3430042(config, m_rtc, 32.768_kHz_XTAL); + m_rtc->cko_cb().set(m_via1, FUNC(via6522_device::write_ca2)); + SWIM1(config, m_swim, C15M); m_swim->phases_cb().set(FUNC(macpb030_state::phases_w)); m_swim->devsel_cb().set(FUNC(macpb030_state::devsel_w)); @@ -954,7 +953,7 @@ void macpb030_state::macpb140(machine_config &config) SCC85C30(config, m_scc, C7M); // m_scc->intrq_callback().set(FUNC(macpb030_state::set_scc_interrupt)); - R65NC22(config, m_via1, C7M/10); + R65C22(config, m_via1, C7M/10); m_via1->readpa_handler().set(FUNC(macpb030_state::mac_via_in_a)); m_via1->readpb_handler().set(FUNC(macpb030_state::mac_via_in_b)); m_via1->writepa_handler().set(FUNC(macpb030_state::mac_via_out_a)); @@ -1035,6 +1034,9 @@ void macpb030_state::macpb160(machine_config &config) m_macadb->set_mcu_mode(true); m_macadb->adb_data_callback().set(FUNC(macpb030_state::set_adb_line)); + RTC3430042(config, m_rtc, 32.768_kHz_XTAL); + m_rtc->cko_cb().set(m_via1, FUNC(via6522_device::write_ca2)); + SWIM1(config, m_swim, C15M); m_swim->phases_cb().set(FUNC(macpb030_state::phases_w)); m_swim->devsel_cb().set(FUNC(macpb030_state::devsel_w)); @@ -1066,7 +1068,7 @@ void macpb030_state::macpb160(machine_config &config) SCC85C30(config, m_scc, C7M); // m_scc->intrq_callback().set(FUNC(macpb030_state::set_scc_interrupt)); - R65NC22(config, m_via1, C7M / 10); + R65C22(config, m_via1, C7M / 10); m_via1->readpa_handler().set(FUNC(macpb030_state::mac_via_in_a)); m_via1->readpb_handler().set(FUNC(macpb030_state::mac_via_in_b)); m_via1->writepa_handler().set(FUNC(macpb030_state::mac_via_out_a)); diff --git a/src/mame/apple/macquadra700.cpp b/src/mame/apple/macquadra700.cpp index 698ca9677fa..a90aa4a173b 100644 --- a/src/mame/apple/macquadra700.cpp +++ b/src/mame/apple/macquadra700.cpp @@ -158,7 +158,6 @@ private: TIMER_CALLBACK_MEMBER(mac_6015_tick); WRITE_LINE_MEMBER(via_cb2_w) { m_macadb->adb_data_w(state); } int m_via_interrupt = 0, m_via2_interrupt = 0, m_scc_interrupt = 0, m_last_taken_interrupt = 0; - int m_irq_count = 0, m_ca2_data = 0; uint32_t rom_switch_r(offs_t offset); bool m_overlay = 0; @@ -235,7 +234,6 @@ void macquadra_state::machine_start() m_rom_size = memregion("bootrom")->bytes(); m_via_interrupt = m_via2_interrupt = m_scc_interrupt = 0; m_last_taken_interrupt = -1; - m_irq_count = m_ca2_data = 0; m_6015_timer = timer_alloc(FUNC(macquadra_state::mac_6015_tick), this); m_6015_timer->adjust(attotime::never); @@ -261,8 +259,6 @@ void macquadra_state::machine_start() save_item(NAME(m_via2_interrupt)); save_item(NAME(m_scc_interrupt)); save_item(NAME(m_last_taken_interrupt)); - save_item(NAME(m_irq_count)); - save_item(NAME(m_ca2_data)); save_item(NAME(m_overlay)); } @@ -275,7 +271,6 @@ void macquadra_state::machine_reset() m_overlay = true; m_via_interrupt = m_via2_interrupt = m_scc_interrupt = 0; m_last_taken_interrupt = -1; - m_irq_count = m_ca2_data = 0; // put ROM mirror at 0 address_space& space = m_maincpu->space(AS_PROGRAM); @@ -766,15 +761,6 @@ TIMER_CALLBACK_MEMBER(macquadra_state::mac_6015_tick) { /* handle ADB keyboard/mouse */ m_macadb->adb_vblank(); - - if (++m_irq_count == 60) - { - m_irq_count = 0; - - m_ca2_data ^= 1; - /* signal 1 Hz irq on CA2 input on the VIA */ - m_via1->write_ca2(m_ca2_data); - } } uint8_t macquadra_state::mac_5396_r(offs_t offset) @@ -937,6 +923,7 @@ void macquadra_state::macqd700(machine_config &config) PALETTE(config, m_palette).set_entries(256); RTC3430042(config, m_rtc, XTAL(32'768)); + m_rtc->cko_cb().set(m_via1, FUNC(via6522_device::write_ca2)); SWIM1(config, m_swim, C15M); m_swim->phases_cb().set(FUNC(macquadra_state::phases_w)); diff --git a/src/mame/apple/macrtc.cpp b/src/mame/apple/macrtc.cpp index c286aaf438f..46741e0f28c 100644 --- a/src/mame/apple/macrtc.cpp +++ b/src/mame/apple/macrtc.cpp @@ -43,10 +43,16 @@ DEFINE_DEVICE_TYPE(RTC3430042, rtc3430042_device, "rtc3430042", "Apple 343-0042 rtc3430042_device::rtc3430042_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, RTC3430042, tag, owner, clock), device_rtc_interface(mconfig, *this), - device_nvram_interface(mconfig, *this) + device_nvram_interface(mconfig, *this), + m_cko_cb(*this) { } +void rtc3430042_device::device_resolve_objects() +{ + m_cko_cb.resolve_safe(); +} + //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -54,10 +60,26 @@ rtc3430042_device::rtc3430042_device(const machine_config &mconfig, const char * void rtc3430042_device::device_start() { // allocate timers - m_clock_timer = timer_alloc(FUNC(rtc3430042_device::seconds_tick), this); - m_clock_timer->adjust(attotime::from_hz(clock() / 32768), 0, attotime::from_hz(clock() / 32768)); + attotime period = clocks_to_attotime(32768 / 2); + m_clock_timer = timer_alloc(FUNC(rtc3430042_device::half_seconds_tick), this); + m_clock_timer->adjust(period, 0, period); + m_cko = true; // state saving + save_item(NAME(m_rtc_rTCEnb)); + save_item(NAME(m_rtc_rTCClk)); + save_item(NAME(m_rtc_data_byte)); + save_item(NAME(m_rtc_bit_count)); + save_item(NAME(m_rtc_data_dir)); + save_item(NAME(m_rtc_data_out)); + save_item(NAME(m_rtc_cmd)); + save_item(NAME(m_rtc_write_protect)); + save_item(NAME(m_rtc_seconds)); + save_item(NAME(m_pram)); + save_item(NAME(m_rtc_xpaddr)); + save_item(NAME(m_rtc_state)); + save_item(NAME(m_data_latch)); + save_item(NAME(m_cko)); } void rtc3430042_device::device_reset() @@ -76,12 +98,17 @@ void rtc3430042_device::device_reset() } //------------------------------------------------- -// seconds_tick - +// half_second_tick - //------------------------------------------------- -TIMER_CALLBACK_MEMBER(rtc3430042_device::seconds_tick) +TIMER_CALLBACK_MEMBER(rtc3430042_device::half_seconds_tick) { - advance_seconds(); + m_cko = !m_cko; + m_cko_cb(m_cko); + + // seconds register increments following rising edge of CKO + if (m_cko) + advance_seconds(); } //------------------------------------------------- diff --git a/src/mame/apple/macrtc.h b/src/mame/apple/macrtc.h index 66476e63c4c..3daf9e8d753 100644 --- a/src/mame/apple/macrtc.h +++ b/src/mame/apple/macrtc.h @@ -34,8 +34,12 @@ public: DECLARE_READ_LINE_MEMBER( data_r ); DECLARE_WRITE_LINE_MEMBER( data_w ); + // 1 second square wave output + auto cko_cb() { return m_cko_cb.bind(); } + protected: // device-level overrides + virtual void device_resolve_objects() override; virtual void device_start() override; virtual void device_reset() override; @@ -48,9 +52,11 @@ protected: virtual bool nvram_read(util::read_stream &file) override; virtual bool nvram_write(util::write_stream &file) override; - TIMER_CALLBACK_MEMBER(seconds_tick); + TIMER_CALLBACK_MEMBER(half_seconds_tick); private: + devcb_write_line m_cko_cb; + /* state of rTCEnb and rTCClk lines */ uint8_t m_rtc_rTCEnb = 0; uint8_t m_rtc_rTCClk = 0; @@ -78,6 +84,7 @@ private: uint8_t m_rtc_xpaddr = 0; uint8_t m_rtc_state = 0; uint8_t m_data_latch = 0; + bool m_cko = false; // timers emu_timer *m_clock_timer = nullptr; -- cgit v1.2.3