summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2022-07-14 21:59:49 -0400
committer AJR <ajrhacker@users.noreply.github.com>2022-07-14 22:00:18 -0400
commit14f9adffcfbc2aba923321646d67a6067bda9ffc (patch)
tree81b040eb0fcc4bb6b7887ecbc2d32a1d3d36e561
parent285e17136f3f8d7c02dc4b5548ac2e7ab24b57c9 (diff)
mac.cpp, mac128.cpp, macpwrbk030.cpp, macquadra700.cpp: Source 1-second interrupt from RTC rather than inaccurately count VBLANKs
-rw-r--r--src/mame/apple/mac.cpp3
-rw-r--r--src/mame/apple/mac.h2
-rw-r--r--src/mame/apple/mac128.cpp17
-rw-r--r--src/mame/apple/mac_m.cpp11
-rw-r--r--src/mame/apple/macpwrbk030.cpp32
-rw-r--r--src/mame/apple/macquadra700.cpp15
-rw-r--r--src/mame/apple/macrtc.cpp39
-rw-r--r--src/mame/apple/macrtc.h9
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<applefdintf_device> m_iwm;
required_device_array<floppy_connector, 2> m_floppy;
optional_device<mac_keyboard_port_device> m_mackbd;
- optional_device<rtc3430042_device> m_rtc;
+ required_device<rtc3430042_device> m_rtc;
required_device<screen_device> m_screen;
required_device<dac_12bit_r2r_device> m_dac; // actually 1-bit pwm w/8-bit counters
required_device<filter_biquad_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<ram_device> m_ram;
required_device<applefdintf_device> m_swim;
required_device_array<floppy_connector, 2> m_floppy;
+ required_device<rtc3430042_device> m_rtc;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
required_device<asc_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;