mac.cpp, mac128.cpp, macpwrbk030.cpp, macquadra700.cpp: Source 1-second interrupt from RTC rather than inaccurately count VBLANKs

This commit is contained in:
AJR 2022-07-14 21:59:49 -04:00
parent 285e17136f
commit 14f9adffcf
8 changed files with 65 additions and 63 deletions

View File

@ -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:

View File

@ -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;

View File

@ -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));

View File

@ -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)
{

View File

@ -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));

View File

@ -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));

View File

@ -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,11 +98,16 @@ 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)
{
m_cko = !m_cko;
m_cko_cb(m_cko);
// seconds register increments following rising edge of CKO
if (m_cko)
advance_seconds();
}

View File

@ -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;