mirror of
https://github.com/holub/mame
synced 2025-04-26 18:23:08 +03:00
mac.cpp, mac128.cpp, macpwrbk030.cpp, macquadra700.cpp: Source 1-second interrupt from RTC rather than inaccurately count VBLANKs
This commit is contained in:
parent
285e17136f
commit
14f9adffcf
@ -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:
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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));
|
||||
|
@ -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));
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user