macpdm: Add vblank irq

This commit is contained in:
Olivier Galibert 2021-03-24 14:03:20 +01:00
parent 5c124e2e87
commit e097edd6ab
3 changed files with 13 additions and 9 deletions

View File

@ -24,12 +24,14 @@ mac_video_sonora_device::mac_video_sonora_device(const machine_config &mconfig,
device_t(mconfig, MAC_VIDEO_SONORA, tag, owner, clock),
m_screen(*this, "screen"),
m_palette(*this, "palette"),
m_monitor_config(*this, "monitor")
m_monitor_config(*this, "monitor"),
m_screen_vblank(*this)
{
}
void mac_video_sonora_device::device_start()
{
m_screen_vblank.resolve_safe();
m_vram = nullptr;
save_item(NAME(m_vram_offset));
@ -56,6 +58,7 @@ void mac_video_sonora_device::device_add_mconfig(machine_config &config)
// dot clock, htotal, hstart, hend, vtotal, vstart, vend
m_screen->set_raw(31334400, 896, 0, 640, 525, 0, 480);
m_screen->set_screen_update(FUNC(mac_video_sonora_device::screen_update));
m_screen->screen_vblank().set([this](int state) { m_screen_vblank(state && (m_modeline_id != -1)); });
PALETTE(config, m_palette).set_entries(256);
}

View File

@ -27,8 +27,7 @@ public:
DECLARE_READ_LINE_MEMBER(vblank) const { return m_screen->vblank(); }
DECLARE_READ_LINE_MEMBER(hblank) const { return m_screen->hblank(); }
auto screen_vblank() { return m_screen->screen_vblank(); }
auto scanline() { return m_screen->scanline(); }
auto screen_vblank() { return m_screen_vblank.bind(); }
void set_vram_base(const uint64_t *vram) { m_vram = vram; }
void set_vram_offset(uint32_t offset) { m_vram_offset = offset; }
@ -54,6 +53,7 @@ private:
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
required_ioport m_monitor_config;
devcb_write_line m_screen_vblank;
const uint64_t *m_vram;
uint32_t m_vram_offset;

View File

@ -291,7 +291,7 @@ void macpdm_state::driver_reset()
m_via2_ier = 0x00;
m_via2_ifr = 0x00;
m_via2_sier = 0x00;
m_via2_sifr = 0x07;
m_via2_sifr = 0x7f;
m_irq_control = 0;
@ -374,11 +374,11 @@ void macpdm_state::via2_irq_main_set(uint8_t mask, int state)
void macpdm_state::via2_irq_slot_set(uint8_t mask, int state)
{
if(((m_via2_sifr & mask) != 0) == state)
if(((m_via2_sifr & mask) == 0) == state)
return;
m_via2_sifr ^= mask;
via2_irq_main_set(0x02, (m_via2_sifr & m_via2_sier) != 0);
via2_irq_main_set(0x02, ((~m_via2_sifr) & m_via2_sier) != 0);
}
@ -460,7 +460,7 @@ void macpdm_state::via2_ier_w(uint8_t data)
logerror("via2 ier %s %s %s %s\n",
m_via2_ier & 0x20 ? "fdc" : "-",
m_via2_ier & 0x20 ? "sound" : "-",
m_via2_ier & 0x10 ? "sound" : "-",
m_via2_ier & 0x08 ? "scsi" : "-",
m_via2_ier & 0x02 ? "slot" : "-",
m_via2_ier & 0x01 ? "scsidrq" : "-");
@ -491,7 +491,7 @@ void macpdm_state::via2_sier_w(uint8_t data)
m_via2_sier & 0x10 ? "slot1" : "-",
m_via2_sier & 0x08 ? "slot0" : "-");
via2_irq_main_set(0x02, (m_via2_sifr & m_via2_sier) != 0);
via2_irq_main_set(0x02, ((~m_via2_sifr) & m_via2_sier) != 0);
}
uint8_t macpdm_state::via2_sifr_r()
@ -999,6 +999,7 @@ void macpdm_state::macpdm(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &macpdm_state::pdm_map);
MAC_VIDEO_SONORA(config, m_video);
m_video->screen_vblank().set(FUNC(macpdm_state::vblank_irq));
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
@ -1075,4 +1076,4 @@ ROM_START( pmac6100 )
ROM_END
COMP( 1994, pmac6100, 0, 0, macpdm, macpdm, macpdm_state, driver_init, "Apple Computer", "Power Macintosh 6100/60", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
COMP( 1994, pmac6100, 0, 0, macpdm, macpdm, macpdm_state, driver_init, "Apple Computer", "Power Macintosh 6100/60", MACHINE_NOT_WORKING )