summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2018-02-10 22:56:23 -0500
committer AJR <ajrhacker@users.noreply.github.com>2018-02-10 23:01:27 -0500
commit20962b6b1af247ea763c891b77a36f82947674d0 (patch)
treee51f3d666faab9dd3936e674fce4620a2a5aade0
parente35934262407866ce8665b0e46a7a78b2041538b (diff)
vtvideo: Assert vertical blanking interrupt through device callback (nw)
-rw-r--r--src/mame/drivers/rainbow.cpp22
-rw-r--r--src/mame/drivers/vt100.cpp19
-rw-r--r--src/mame/video/vtvideo.cpp19
-rw-r--r--src/mame/video/vtvideo.h12
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<uint8_t> 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 <class Object> static devcb_base &set_ram_rd_callback(device_t &device, Object &&cb) { return downcast<vt100_video_device &>(device).m_read_ram.set_callback(std::forward<Object>(cb)); }
- template <class Object> static devcb_base &set_clear_video_irq_wr_callback(device_t &device, Object &&cb) { return downcast<vt100_video_device &>(device).m_write_clear_video_interrupt.set_callback(std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &set_vert_freq_intr_wr_callback(device_t &device, Object &&cb) { return downcast<vt100_video_device &>(device).m_write_vert_freq_intr.set_callback(std::forward<Object>(cb)); }
template <class Object> static devcb_base &set_lba7_wr_callback(device_t &device, Object &&cb) { return downcast<vt100_video_device &>(device).m_write_lba7.set_callback(std::forward<Object>(cb)); }
static void set_chargen_tag(device_t &device, const char *tag) { downcast<vt100_video_device &>(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);