From 20962b6b1af247ea763c891b77a36f82947674d0 Mon Sep 17 00:00:00 2001 From: AJR Date: Sat, 10 Feb 2018 22:56:23 -0500 Subject: vtvideo: Assert vertical blanking interrupt through device callback (nw) --- src/mame/drivers/rainbow.cpp | 22 ++++++++-------------- src/mame/drivers/vt100.cpp | 19 ++++++------------- src/mame/video/vtvideo.cpp | 19 +++++++++++++++---- src/mame/video/vtvideo.h | 12 +++++++----- 4 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/mame/drivers/rainbow.cpp b/src/mame/drivers/rainbow.cpp index ea97e065bbe..5753d38c033 100644 --- a/src/mame/drivers/rainbow.cpp +++ b/src/mame/drivers/rainbow.cpp @@ -534,7 +534,7 @@ public: } DECLARE_READ8_MEMBER(read_video_ram_r); - DECLARE_WRITE_LINE_MEMBER(clear_video_interrupt); + DECLARE_WRITE_LINE_MEMBER(video_interrupt); DECLARE_READ8_MEMBER(diagnostic_r); DECLARE_WRITE8_MEMBER(diagnostic_w); @@ -609,7 +609,6 @@ public: DECLARE_READ8_MEMBER(GDC_EXTRA_REGISTER_r); uint32_t screen_update_rainbow(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - INTERRUPT_GEN_MEMBER(vblank_irq); IRQ_CALLBACK_MEMBER(irq_callback); DECLARE_WRITE_LINE_MEMBER(write_keyboard_clock); @@ -2626,12 +2625,14 @@ WRITE_LINE_MEMBER(rainbow_state::GDC_vblank_irq) } // 7220 vblank IRQ -INTERRUPT_GEN_MEMBER(rainbow_state::vblank_irq) +WRITE_LINE_MEMBER(rainbow_state::video_interrupt) { - raise_8088_irq(IRQ_8088_VBL); - m_crtc->notify_vblank(true); + if (state == ASSERT_LINE) + raise_8088_irq(IRQ_8088_VBL); + else + lower_8088_irq(IRQ_8088_VBL); - if (m_POWER_GOOD && m_crtc->MHFU(MHFU_IS_ENABLED)) // If enabled... + if (state == ASSERT_LINE && m_POWER_GOOD && m_crtc->MHFU(MHFU_IS_ENABLED)) // If enabled... { if (m_crtc->MHFU(MHFU_VALUE) > 10) // + more than (10 * 16.666) msecs gone (108 ms would be by the book) { @@ -2644,12 +2645,6 @@ INTERRUPT_GEN_MEMBER(rainbow_state::vblank_irq) } } -WRITE_LINE_MEMBER(rainbow_state::clear_video_interrupt) -{ - lower_8088_irq(IRQ_8088_VBL); - m_crtc->notify_vblank(false); -} - // Reflects bits from 'diagnostic_w' (1:1), except test jumpers READ8_MEMBER(rainbow_state::diagnostic_r) // 8088 (port 0A READ). Fig.4-29 + table 4-15 { @@ -3194,7 +3189,6 @@ MCFG_CPU_IO_MAP(rainbow8088_io) MCFG_CPU_ADD("subcpu", Z80, XTAL(24'073'400) / 6) MCFG_CPU_PROGRAM_MAP(rainbowz80_mem) MCFG_CPU_IO_MAP(rainbowz80_io) -MCFG_CPU_VBLANK_INT_DRIVER("screen", rainbow_state, vblank_irq) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -3209,7 +3203,7 @@ MCFG_DEVICE_ADD("vt100_video", RAINBOW_VIDEO, XTAL(24'073'400)) MCFG_VT_SET_SCREEN("screen") MCFG_VT_CHARGEN("chargen") MCFG_VT_VIDEO_RAM_CALLBACK(READ8(rainbow_state, read_video_ram_r)) -MCFG_VT_VIDEO_CLEAR_VIDEO_INTERRUPT_CALLBACK(WRITELINE(rainbow_state, clear_video_interrupt)) +MCFG_VT_VIDEO_VERT_FREQ_INTR_CALLBACK(WRITELINE(rainbow_state, video_interrupt)) // *************************** COLOR GRAPHICS (OPTION) ************************************** // While the OSC frequency is confirmed, the divider is not (refresh rate is ~60 Hz with 32). diff --git a/src/mame/drivers/vt100.cpp b/src/mame/drivers/vt100.cpp index dd8e7b8f3e3..d51e4cc0724 100644 --- a/src/mame/drivers/vt100.cpp +++ b/src/mame/drivers/vt100.cpp @@ -64,7 +64,7 @@ public: DECLARE_WRITE8_MEMBER(vt100_baud_rate_w); DECLARE_WRITE8_MEMBER(vt100_nvr_latch_w); DECLARE_READ8_MEMBER(vt100_read_video_ram_r); - DECLARE_WRITE_LINE_MEMBER(vt100_clear_video_interrupt); + DECLARE_WRITE_LINE_MEMBER(vert_freq_intr_w); required_shared_ptr m_p_ram; bool m_keyboard_int; bool m_receiver_int; @@ -72,7 +72,6 @@ public: virtual void machine_start() override; virtual void machine_reset() override; uint32_t screen_update_vt100(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - INTERRUPT_GEN_MEMBER(vt100_vertical_interrupt); IRQ_CALLBACK_MEMBER(vt100_irq_callback); void vt102(machine_config &config); void vt100(machine_config &config); @@ -233,15 +232,11 @@ READ8_MEMBER( vt100_state::vt100_read_video_ram_r ) return m_p_ram[offset]; } -WRITE_LINE_MEMBER( vt100_state::vt100_clear_video_interrupt ) +WRITE_LINE_MEMBER( vt100_state::vert_freq_intr_w ) { - m_vertical_int = 0; -} - -INTERRUPT_GEN_MEMBER(vt100_state::vt100_vertical_interrupt) -{ - m_vertical_int = 1; - device.execute().set_input_line(0, HOLD_LINE); + m_vertical_int = (state == ASSERT_LINE) ? 1 : 0; + if (state) + m_maincpu->set_input_line(0, HOLD_LINE); } /* F4 Character Displayer */ @@ -267,7 +262,6 @@ MACHINE_CONFIG_START(vt100_state::vt100) MCFG_CPU_ADD("maincpu",I8080, XTAL(24'883'200) / 9) MCFG_CPU_PROGRAM_MAP(vt100_mem) MCFG_CPU_IO_MAP(vt100_io) - MCFG_CPU_VBLANK_INT_DRIVER("screen", vt100_state, vt100_vertical_interrupt) MCFG_CPU_IRQ_ACKNOWLEDGE_DRIVER(vt100_state,vt100_irq_callback) /* video hardware */ @@ -286,7 +280,7 @@ MACHINE_CONFIG_START(vt100_state::vt100) MCFG_VT_SET_SCREEN("screen") MCFG_VT_CHARGEN("chargen") MCFG_VT_VIDEO_RAM_CALLBACK(READ8(vt100_state, vt100_read_video_ram_r)) - MCFG_VT_VIDEO_CLEAR_VIDEO_INTERRUPT_CALLBACK(WRITELINE(vt100_state, vt100_clear_video_interrupt)) + MCFG_VT_VIDEO_VERT_FREQ_INTR_CALLBACK(WRITELINE(vt100_state, vert_freq_intr_w)) MCFG_VT_VIDEO_LBA7_CALLBACK(DEVWRITELINE("nvr", er1400_device, clock_w)) MCFG_DEVICE_ADD("i8251", I8251, 0) // 2.7648Mhz phi-clock (not used for tx clock or rx clock?) @@ -318,7 +312,6 @@ MACHINE_CONFIG_DERIVED(vt100_state::vt102, vt100) MCFG_CPU_REPLACE("maincpu", I8085A, XTAL(24'073'400) / 4) MCFG_CPU_PROGRAM_MAP(vt100_mem) MCFG_CPU_IO_MAP(vt100_io) - MCFG_CPU_VBLANK_INT_DRIVER("screen", vt100_state, vt100_vertical_interrupt) MCFG_CPU_IRQ_ACKNOWLEDGE_DRIVER(vt100_state,vt100_irq_callback) MACHINE_CONFIG_END diff --git a/src/mame/video/vtvideo.cpp b/src/mame/video/vtvideo.cpp index 937d2580ec0..87305255a9a 100644 --- a/src/mame/video/vtvideo.cpp +++ b/src/mame/video/vtvideo.cpp @@ -77,7 +77,7 @@ vt100_video_device::vt100_video_device(const machine_config &mconfig, device_typ : device_t(mconfig, type, tag, owner, clock) , device_video_interface(mconfig, *this) , m_read_ram(*this) - , m_write_clear_video_interrupt(*this) + , m_write_vert_freq_intr(*this) , m_write_lba7(*this) , m_char_rom(*this, finder_base::DUMMY_TAG) , m_palette(*this, "palette") @@ -105,13 +105,15 @@ void vt100_video_device::device_start() { /* resolve callbacks */ m_read_ram.resolve_safe(0); - m_write_clear_video_interrupt.resolve_safe(); + m_write_vert_freq_intr.resolve_safe(); m_write_lba7.resolve_safe(); // LBA7 is scan line frequency update m_lba7_change_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(vt100_video_device::lba7_change), this)); m_lba7_change_timer->adjust(clocks_to_attotime(765), 0, clocks_to_attotime(765)); + screen().register_vblank_callback(vblank_state_delegate(&vt100_video_device::vblank_callback, this)); + save_item(NAME(m_lba7)); save_item(NAME(m_scroll_latch)); save_item(NAME(m_blink_flip_flop)); @@ -220,12 +222,20 @@ void vt100_video_device::recompute_parameters() LOG("(RECOMPUTE) * LINEDOUBLER *\n"); } - READ_LINE_MEMBER(vt100_video_device::lba7_r) { return m_lba7; } +void vt100_video_device::vblank_callback(screen_device &screen, bool state) +{ + if (state) + { + m_write_vert_freq_intr(ASSERT_LINE); + notify_vblank(true); + } +} + // Also used by Rainbow-100 ************ WRITE8_MEMBER(vt100_video_device::dc012_w) { @@ -268,7 +278,8 @@ WRITE8_MEMBER(vt100_video_device::dc012_w) break; case 0x09: // clear vertical frequency interrupt; - m_write_clear_video_interrupt(0); + m_write_vert_freq_intr(CLEAR_LINE); + notify_vblank(false); break; case 0x0a: // PDF: reverse field ON diff --git a/src/mame/video/vtvideo.h b/src/mame/video/vtvideo.h index 1c86fcdc745..01d677867d1 100644 --- a/src/mame/video/vtvideo.h +++ b/src/mame/video/vtvideo.h @@ -22,7 +22,7 @@ public: vt100_video_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); template static devcb_base &set_ram_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_ram.set_callback(std::forward(cb)); } - template static devcb_base &set_clear_video_irq_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_clear_video_interrupt.set_callback(std::forward(cb)); } + template static devcb_base &set_vert_freq_intr_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_vert_freq_intr.set_callback(std::forward(cb)); } template static devcb_base &set_lba7_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_lba7.set_callback(std::forward(cb)); } static void set_chargen_tag(device_t &device, const char *tag) { downcast(device).m_char_rom.set_tag(tag); } @@ -44,11 +44,13 @@ protected: // internal state void recompute_parameters(); + void vblank_callback(screen_device &screen, bool state); virtual void display_char(bitmap_ind16 &bitmap, uint8_t code, int x, int y, uint8_t scroll_region, uint8_t display_type); TIMER_CALLBACK_MEMBER(lba7_change); + virtual void notify_vblank(bool choice) { } devcb_read8 m_read_ram; - devcb_write8 m_write_clear_video_interrupt; + devcb_write_line m_write_vert_freq_intr; devcb_write_line m_write_lba7; int m_lba7; @@ -91,10 +93,10 @@ public: int MHFU(int); void palette_select(int choice); - void notify_vblank(bool choice); protected: virtual void display_char(bitmap_ind16 &bitmap, uint8_t code, int x, int y, uint8_t scroll_region, uint8_t display_type) override; + virtual void notify_vblank(bool choice) override; virtual void device_reset() override; virtual void device_add_mconfig(machine_config &config) override; }; @@ -111,8 +113,8 @@ DECLARE_DEVICE_TYPE(RAINBOW_VIDEO, rainbow_video_device) #define MCFG_VT_VIDEO_RAM_CALLBACK(_read) \ devcb = &vt100_video_device::set_ram_rd_callback(*device, DEVCB_##_read); -#define MCFG_VT_VIDEO_CLEAR_VIDEO_INTERRUPT_CALLBACK(_write) \ - devcb = &vt100_video_device::set_clear_video_irq_wr_callback(*device, DEVCB_##_write); +#define MCFG_VT_VIDEO_VERT_FREQ_INTR_CALLBACK(_write) \ + devcb = &vt100_video_device::set_vert_freq_intr_wr_callback(*device, DEVCB_##_write); #define MCFG_VT_VIDEO_LBA7_CALLBACK(_write) \ devcb = &vt100_video_device::set_lba7_wr_callback(*device, DEVCB_##_write); -- cgit v1.2.3