summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author cracyc <cracyc@users.noreply.github.com>2022-06-05 18:54:27 -0500
committer cracyc <cracyc@users.noreply.github.com>2022-06-05 18:54:27 -0500
commit1f5ab9989ba19820af74bfb2586d89b4b9f38a8a (patch)
treed64010c98bd3fdb7df087b2186cc07aa4ef73ef4
parent80aec0d71f9e4d2494659733f8765df8d2e896f2 (diff)
ega: latch start address
-rw-r--r--src/devices/video/crtc_ega.cpp10
-rw-r--r--src/devices/video/crtc_ega.h1
2 files changed, 8 insertions, 3 deletions
diff --git a/src/devices/video/crtc_ega.cpp b/src/devices/video/crtc_ega.cpp
index f64bcfc3bb8..781b435f48e 100644
--- a/src/devices/video/crtc_ega.cpp
+++ b/src/devices/video/crtc_ega.cpp
@@ -34,7 +34,7 @@ crtc_ega_device::crtc_ega_device(const machine_config &mconfig, const char *tag,
, m_irq_enable(0), m_vert_disp_end(0), m_offset(0), m_underline_loc(0)
, m_vert_blank_start(0), m_vert_blank_end(0)
, m_mode_control(0), m_line_compare(0), m_register_address_latch(0)
- , m_cursor_state(false), m_cursor_blink_count(0)
+ , m_start_addr_latch(0), m_cursor_state(false), m_cursor_blink_count(0)
, m_hpixels_per_column(0), m_cur(0), m_hsync(0), m_vsync(0), m_vblank(0), m_de(0)
, m_character_counter(0), m_hsync_width_counter(0), m_line_counter(0), m_raster_counter(0), m_vsync_width_counter(0)
, m_line_enable_ff(false), m_vsync_ff(0), m_adjust_active(0), m_line_address(0), m_cursor_x(0)
@@ -115,8 +115,8 @@ void crtc_ega_device::register_w(uint8_t data)
case 0x0b: m_cursor_end_ras = data & 0x1f;
m_cursor_skew = ((data & 0x60) >> 5);
break;
- case 0x0c: m_disp_start_addr = ((data & 0xff) << 8) | (m_disp_start_addr & 0x00ff); break;
- case 0x0d: m_disp_start_addr = ((data & 0xff) << 0) | (m_disp_start_addr & 0xff00); break;
+ case 0x0c: m_start_addr_latch = ((data & 0xff) << 8) | (m_start_addr_latch & 0x00ff); break;
+ case 0x0d: m_start_addr_latch = ((data & 0xff) << 0) | (m_start_addr_latch & 0xff00); break;
case 0x0e: m_cursor_addr = ((data & 0xff) << 8) | (m_cursor_addr & 0x00ff); break;
case 0x0f: m_cursor_addr = ((data & 0xff) << 0) | (m_cursor_addr & 0xff00); break;
case 0x10: m_vert_retr_start = ((data & 0xff) << 0) | (m_vert_retr_start & 0x0100); break;
@@ -281,6 +281,8 @@ void crtc_ega_device::set_vblank(int state)
m_res_out_vblank_cb(m_vblank);
if (!m_res_out_irq_cb.isnull() && !m_irq_enable)
m_res_out_irq_cb(m_vblank);
+ if (state)
+ m_disp_start_addr = m_start_addr_latch;
}
}
@@ -633,6 +635,7 @@ void crtc_ega_device::device_start()
m_cursor_end_ras = 0;
m_cursor_skew = 0;
m_disp_start_addr = 0;
+ m_start_addr_latch = 0;
m_light_pen_addr = 0;
m_vert_retr_end = 0;
m_offset = 0;
@@ -668,6 +671,7 @@ void crtc_ega_device::device_start()
save_item(NAME(m_cursor_start_ras));
save_item(NAME(m_cursor_end_ras));
save_item(NAME(m_disp_start_addr));
+ save_item(NAME(m_start_addr_latch));
save_item(NAME(m_cursor_addr));
save_item(NAME(m_light_pen_addr));
save_item(NAME(m_light_pen_latched));
diff --git a/src/devices/video/crtc_ega.h b/src/devices/video/crtc_ega.h
index 223c07e076e..62bcac8c5c3 100644
--- a/src/devices/video/crtc_ega.h
+++ b/src/devices/video/crtc_ega.h
@@ -129,6 +129,7 @@ private:
/* other internal state */
uint8_t m_register_address_latch;
+ uint16_t m_start_addr_latch;
bool m_cursor_state; /* 0 = off, 1 = on */
uint8_t m_cursor_blink_count;
int m_hpixels_per_column; /* number of pixels per video memory address */