From a659260af38edc86ad27bd670d3460a869aa0d15 Mon Sep 17 00:00:00 2001 From: Sven Schnelle Date: Sat, 17 Nov 2018 19:41:17 +0100 Subject: [PATCH] nereid: add overlay support Required for the upcoming HP 98550A support. --- src/devices/video/nereid.cpp | 111 ++++++++++++++++++++++++++++++----- src/devices/video/nereid.h | 17 +++++- 2 files changed, 111 insertions(+), 17 deletions(-) diff --git a/src/devices/video/nereid.cpp b/src/devices/video/nereid.cpp index b140071b214..c1b8a1beeb6 100644 --- a/src/devices/video/nereid.cpp +++ b/src/devices/video/nereid.cpp @@ -30,77 +30,158 @@ void nereid_device::device_start() save_item(NAME(m_green)); save_item(NAME(m_blue)); save_item(NAME(m_index)); - save_item(NAME(m_palette)); + save_item(NAME(m_video_palette)); + save_item(NAME(m_overlay_palette)); save_item(NAME(m_plane_mask)); + save_item(NAME(m_overlay_ctl)); + save_item(NAME(m_overlay_index)); + save_item(NAME(m_unknown_a0)); } void nereid_device::device_reset() { - memset(&m_palette, 0, sizeof(m_palette)); + std::fill(m_video_palette.begin(), m_video_palette.end(), 0); + std::fill(m_overlay_palette.begin(), m_overlay_palette.end(), 0); + + m_index = 0; + m_plane_mask = 0; + m_overlay_ctl = 0; + m_red = 0; + m_green = 0; + m_blue = 0; + m_unknown_a0 = 0; + m_overlay_index = 0; } READ16_MEMBER(nereid_device::ctrl_r) { LOG("NEREID ctrl_r: %02X\n", offset); - switch(offset & 0x7f) { + switch (offset & 0x7f) { case NEREID_BUSY: return 0; + case NEREID_RED_DATA: return 0xff00 | m_red; + case NEREID_GREEN_DATA: return 0xff00 | m_green; + case NEREID_BLUE_DATA: return 0xff00 | m_blue; + case NEREID_INDEX: + return 0xff00 | ~m_index; + + case NEREID_INDEX0: return 0xff00 | m_index; + + case NEREID_OVERLAY_CTL: + return 0xff00 | m_overlay_ctl; + case NEREID_WRITE_STROBE: return 0xff00; + case NEREID_PLANE_MASK: return 0xff00 | m_plane_mask; + + case NEREID_UNKNOWN_A0: + return 0xff00 | m_unknown_a0; + + case NEREID_OVERLAY_INDEX: + return 0xff00 | m_overlay_index; + + case NEREID_REV: + return 0xff01; + default: - return space.unmap(); + LOG("NEREID ctrl_r: unknown register %04X\n", offset); + return 0xffff;//space.unmap(); } return 0xffff; } WRITE16_MEMBER(nereid_device::ctrl_w) { - LOG("NEREID: ctrl_w %02X = %02X\n", offset, data); + LOG("NEREID: ctrl_w %02X = %02X\n", offset << 1, data); data &= 0xff; - switch(offset & 0x7f) { + switch (offset & 0x7f) { case NEREID_RED_DATA: m_red = data; + LOG("W NEREID_RED_DATA = %04X\n", m_red); break; + case NEREID_GREEN_DATA: m_green = data; + LOG("W NEREID_GREEN_DATA = %04X\n", m_green); break; + case NEREID_BLUE_DATA: m_blue = data; + LOG("W NEREID_BLUE_DATA = %04X\n", m_blue); break; + case NEREID_INDEX: m_index = ~data; + LOG("W NEREID_INDEX = %04X\n", m_index); break; + + case NEREID_INDEX0: + m_index =data; + LOG("W NEREID_INDEX0 = %04X\n", data); + break; + case NEREID_WRITE_STROBE: - LOG("NEREID: set color index %u: rgb_t(%u,%u,%u)\n", - m_index, m_red, m_green, m_blue); - m_palette[m_index] = rgb_t(m_red, m_green, m_blue); + if (m_overlay_index & 8) { + const int index = (m_overlay_index >> 1) & 0x3; + LOG("NEREID: set overlay color index %u: rgb_t(%u,%u,%u)\n", + index, m_red, m_green, m_blue); + m_overlay_palette[index] = rgb_t(m_red, m_green, m_blue); + } else { + LOG("NEREID: set video color index %u: rgb_t(%u,%u,%u)\n", + m_index, m_red, m_green, m_blue); + m_video_palette[m_index] = rgb_t(m_red, m_green, m_blue); + } break; + case NEREID_READ_STROBE: - m_red = m_palette[m_index].r(); - m_green = m_palette[m_index].g(); - m_blue = m_palette[m_index].b(); + m_red = m_video_palette[m_index].r(); + m_green = m_video_palette[m_index].g(); + m_blue = m_video_palette[m_index].b(); break; + case NEREID_PLANE_MASK: m_plane_mask = data; + LOG("W NEREID_PLANE_MASK = %02x\n", m_plane_mask); break; + + case NEREID_OVERLAY_CTL: + m_overlay_ctl = data; + LOG("W NEREID_OVERLAY_CTL = %02x\n", m_overlay_ctl); + break; + + case NEREID_UNKNOWN_A0: + m_unknown_a0 = data; + LOG("UW A0 = %04x\n", data); + break; + + case NEREID_OVERLAY_INDEX: + m_overlay_index = data; + LOG("W OVERLAY_INDEX = %04x\n", data); + break; + default: - LOG("nereid::ctrl_w: %X = %04X (mask %04X)\n", offset, data, mem_mask); + LOG("nereid::ctrl_w: unknown %X = %04X (mask %04X)\n", offset << 1, data, mem_mask); break; } } -rgb_t nereid_device::map_color(uint8_t input) +rgb_t nereid_device::map_color(uint8_t input, uint8_t ovl) { - return m_palette[input & m_plane_mask]; + ovl &= m_overlay_ctl; + + if (ovl == 0) + return m_video_palette[input & m_plane_mask]; + else + return m_overlay_palette[ovl & m_plane_mask]; } diff --git a/src/devices/video/nereid.h b/src/devices/video/nereid.h index 3a5760be2a8..fd470ba8883 100644 --- a/src/devices/video/nereid.h +++ b/src/devices/video/nereid.h @@ -13,7 +13,7 @@ public: DECLARE_READ16_MEMBER(ctrl_r); DECLARE_WRITE16_MEMBER(ctrl_w); - rgb_t map_color(uint8_t input); + rgb_t map_color(uint8_t input, uint8_t ovl = 0); protected: nereid_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); @@ -22,15 +22,25 @@ protected: private: static constexpr int NEREID_BUSY=1; + + static constexpr int NEREID_BLANK_ALL=0x2e; + static constexpr int NEREID_WRITE_STROBE_OVERLAY=0x3c; + static constexpr int NEREID_UNKNOWN_A0=0x50; + static constexpr int NEREID_OVERLAY_CTL=0x51; + static constexpr int NEREID_INDEX0=0x58; static constexpr int NEREID_RED_DATA=0x59; static constexpr int NEREID_GREEN_DATA=0x5a; static constexpr int NEREID_BLUE_DATA=0x5b; static constexpr int NEREID_INDEX=0x5c; static constexpr int NEREID_PLANE_MASK=0x5d; + static constexpr int NEREID_OVERLAY_INDEX=0x5e; + static constexpr int NEREID_REV=0x5f; static constexpr int NEREID_WRITE_STROBE=0x78; static constexpr int NEREID_READ_STROBE=0x7c; - rgb_t m_palette[256]; + + std::array m_video_palette; + std::array m_overlay_palette; /* registers */ uint8_t m_red; @@ -38,6 +48,9 @@ private: uint8_t m_blue; uint8_t m_index; uint8_t m_plane_mask; + uint8_t m_overlay_ctl; + uint8_t m_unknown_a0; + uint8_t m_overlay_index; }; DECLARE_DEVICE_TYPE(NEREID, nereid_device)