From d3ce5204d2863e9635e3029b203cdf0ae0ba28bf Mon Sep 17 00:00:00 2001 From: angelosa Date: Thu, 13 Jul 2023 02:06:17 +0200 Subject: video/pc_vga_paradise.cpp: remove m_ext_gc_view and use custom handlers in place --- src/devices/video/pc_vga_paradise.cpp | 71 ++++++++++++++++------------------- src/devices/video/pc_vga_paradise.h | 7 ++-- 2 files changed, 36 insertions(+), 42 deletions(-) diff --git a/src/devices/video/pc_vga_paradise.cpp b/src/devices/video/pc_vga_paradise.cpp index 1457dba5f46..7169fac70db 100644 --- a/src/devices/video/pc_vga_paradise.cpp +++ b/src/devices/video/pc_vga_paradise.cpp @@ -6,12 +6,12 @@ Paradise / Western Digital (S)VGA chipsets - PVGA1A - PVGA1A-JK / WD90C90-JK (same as PVGA1A with extra connectors?) - -TODO: -- Complete WD90C00-JK -- WD90C11-LR / WD90C11A-LR (WD90C00 with new sequencer regs) +- WD90C00-JK (extended CRTC regs) +- WD90C11-LR / WD90C11A-LR (extended sequencer regs) - WD90C30-LR / WD90C31-LR / WD90C31-ZS / WD90C31A-LR / WD90C31A-ZS - WD90C33-ZZ + +TODO: - WD90C24A-ZZ / WD90C24A2-ZZ (mobile chips, no ISA option) - WD90C26A (apple/macpwrbk030.cpp macpb180c, no ISA) - WD9710-MZ (PCI + MPEG-1, a.k.a. Pipeline 9710 / 9712) @@ -19,6 +19,7 @@ TODO: - Memory Data pins (MD) & CNF - /EBROM signal (for enabling ROM readback) - AIDA16 & UniVBE VESA suite detects 'C11 as 'C30, is the ROM mislabeled? +- CRTC group locks; **************************************************************************************************/ @@ -47,7 +48,6 @@ DEFINE_DEVICE_TYPE(WD90C30, wd90c30_vga_device, "wd90c30_vga", "Western Digital pvga1a_vga_device::pvga1a_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : svga_device(mconfig, type, tag, owner, clock) - , m_ext_gc_view(*this, "ext_gc_view") { m_gc_space_config = address_space_config("gc_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(pvga1a_vga_device::gc_map), this)); } @@ -77,10 +77,9 @@ void pvga1a_vga_device::device_reset() m_memory_size = 0; m_video_control = 0; // Really &= 0x8; at POR according to docs m_video_select = 0; - m_ega_compatible = false; + m_ega_compatible_mode = false; m_crtc_lock = 0; m_ext_gc_unlock = false; - m_ext_gc_view.select(1); } uint8_t pvga1a_vga_device::mem_r(offs_t offset) @@ -102,37 +101,34 @@ void pvga1a_vga_device::mem_w(offs_t offset, uint8_t data) svga_device::mem_w(offset, data); } +u8 pvga1a_vga_device::gc_data_r(offs_t offset) +{ + if (m_ega_compatible_mode && vga.gc.index >= 9 && vga.gc.index <= 0xe) + { + LOGLOCKED("Attempt to read ext. GC register offset [%02x] while locked\n", vga.gc.index); + return 0xff; + } + return svga_device::gc_data_r(offset); +} + +void pvga1a_vga_device::gc_data_w(offs_t offset, u8 data) +{ + if (!m_ext_gc_unlock && vga.gc.index >= 9 && vga.gc.index <= 0xe) + { + LOGLOCKED("Attempt to write ext. GC register offset [%02x] <- %02x while locked\n", vga.gc.index, data); + return; + } + svga_device::gc_data_w(offset, data); +} + void pvga1a_vga_device::gc_map(address_map &map) { svga_device::gc_map(map); - map(0x09, 0x0e).view(m_ext_gc_view); - m_ext_gc_view[0](0x09, 0x0e).lr8( - NAME([this] (offs_t offset) { - LOGLOCKED("Attempt to R ext. GC register offset %02x while locked\n", offset + 9); - return 0xff; - }) - ).unmapw(); - m_ext_gc_view[1](0x09, 0x0a).r(FUNC(pvga1a_vga_device::address_offset_r)).unmapw(); - m_ext_gc_view[1](0x0b, 0x0b).r(FUNC(pvga1a_vga_device::memory_size_r)).unmapw(); - m_ext_gc_view[1](0x0c, 0x0c).r(FUNC(pvga1a_vga_device::video_select_r)).unmapw(); - m_ext_gc_view[1](0x0d, 0x0d).r(FUNC(pvga1a_vga_device::crtc_lock_r)).unmapw(); - m_ext_gc_view[1](0x0e, 0x0e).r(FUNC(pvga1a_vga_device::video_control_r)).unmapw(); - m_ext_gc_view[2](0x09, 0x0e).lr8( - NAME([this] (offs_t offset) { - LOGLOCKED("Attempt to R ext. GC register offset %02x while locked\n", offset + 9); - return 0xff; - }) - ); - m_ext_gc_view[2](0x09, 0x0a).w(FUNC(pvga1a_vga_device::address_offset_w)); - m_ext_gc_view[2](0x0b, 0x0b).w(FUNC(pvga1a_vga_device::memory_size_w)); - m_ext_gc_view[2](0x0c, 0x0c).w(FUNC(pvga1a_vga_device::video_select_w)); - m_ext_gc_view[2](0x0d, 0x0d).w(FUNC(pvga1a_vga_device::crtc_lock_w)); - m_ext_gc_view[2](0x0e, 0x0e).w(FUNC(pvga1a_vga_device::video_control_w)); - m_ext_gc_view[3](0x09, 0x0a).rw(FUNC(pvga1a_vga_device::address_offset_r), FUNC(pvga1a_vga_device::address_offset_w)); - m_ext_gc_view[3](0x0b, 0x0b).rw(FUNC(pvga1a_vga_device::memory_size_r), FUNC(pvga1a_vga_device::memory_size_w)); - m_ext_gc_view[3](0x0c, 0x0c).rw(FUNC(pvga1a_vga_device::video_select_r), FUNC(pvga1a_vga_device::video_select_w)); - m_ext_gc_view[3](0x0d, 0x0d).rw(FUNC(pvga1a_vga_device::crtc_lock_r), FUNC(pvga1a_vga_device::crtc_lock_w)); - m_ext_gc_view[3](0x0e, 0x0e).rw(FUNC(pvga1a_vga_device::video_control_r), FUNC(pvga1a_vga_device::video_control_w)); + map(0x09, 0x0a).rw(FUNC(pvga1a_vga_device::address_offset_r), FUNC(pvga1a_vga_device::address_offset_w)); + map(0x0b, 0x0b).rw(FUNC(pvga1a_vga_device::memory_size_r), FUNC(pvga1a_vga_device::memory_size_w)); + map(0x0c, 0x0c).rw(FUNC(pvga1a_vga_device::video_select_r), FUNC(pvga1a_vga_device::video_select_w)); + map(0x0d, 0x0d).rw(FUNC(pvga1a_vga_device::crtc_lock_r), FUNC(pvga1a_vga_device::crtc_lock_w)); + map(0x0e, 0x0e).rw(FUNC(pvga1a_vga_device::video_control_r), FUNC(pvga1a_vga_device::video_control_w)); map(0x0f, 0x0f).rw(FUNC(pvga1a_vga_device::ext_gc_status_r), FUNC(pvga1a_vga_device::ext_gc_unlock_w)); } @@ -269,9 +265,7 @@ void pvga1a_vga_device::video_control_w(offs_t offset, u8 data) LOG("PR4 Video Control W %02x\n", data); m_video_control = data; svga.rgb8_en = BIT(data, 0); - m_ega_compatible = bool(BIT(data, 1)); - m_ext_gc_view.select(m_ext_gc_unlock << 1 | !m_ega_compatible); - + m_ega_compatible_mode = bool(BIT(data, 1)); } /* @@ -291,7 +285,6 @@ void pvga1a_vga_device::ext_gc_unlock_w(offs_t offset, u8 data) { m_ext_gc_unlock = (data & 0x7) == 5; LOGLOCKED("PR5 %s state (%02x)\n", m_ext_gc_unlock ? "unlock" : "lock", data); - m_ext_gc_view.select(m_ext_gc_unlock << 1 | !m_ega_compatible); } /************************************** diff --git a/src/devices/video/pc_vga_paradise.h b/src/devices/video/pc_vga_paradise.h index 484908dbc20..614a036486f 100644 --- a/src/devices/video/pc_vga_paradise.h +++ b/src/devices/video/pc_vga_paradise.h @@ -24,11 +24,12 @@ protected: virtual void device_reset() override; virtual void gc_map(address_map &map) override; - memory_view m_ext_gc_view; - u8 m_video_select = 0; u8 m_crtc_lock = 0; private: + virtual u8 gc_data_r(offs_t offset) override; + virtual void gc_data_w(offs_t offset, u8 data) override; + u8 address_offset_r(offs_t offset); void address_offset_w(offs_t offset, u8 data); u8 memory_size_r(offs_t offset); @@ -45,7 +46,7 @@ private: u8 m_memory_size = 0; u8 m_video_control = 0; bool m_ext_gc_unlock = false; - bool m_ega_compatible = false; + bool m_ega_compatible_mode = false; }; class wd90c00_vga_device : public pvga1a_vga_device -- cgit v1.2.3