diff options
author | MooglyGuy <therealmogminer@gmail.com> | 2019-11-16 12:47:19 +0100 |
---|---|---|
committer | MooglyGuy <therealmogminer@gmail.com> | 2019-11-16 12:47:19 +0100 |
commit | 11fbd2c10ac02adc737d8293a84cda2106b5d3a1 (patch) | |
tree | 099cf958282a8fe0b228c4c52c0bcadc1042524c /src | |
parent | 9c37fd07fa0d8933d4987da2ec7eb61a716ec3cb (diff) |
-cgsix: Added hardware cursor support. [Ryan Holtz]
Diffstat (limited to 'src')
-rw-r--r-- | src/devices/bus/sbus/cgsix.cpp | 50 | ||||
-rw-r--r-- | src/devices/bus/sbus/cgsix.h | 8 |
2 files changed, 54 insertions, 4 deletions
diff --git a/src/devices/bus/sbus/cgsix.cpp b/src/devices/bus/sbus/cgsix.cpp index 07766ba4c17..b64b6df289c 100644 --- a/src/devices/bus/sbus/cgsix.cpp +++ b/src/devices/bus/sbus/cgsix.cpp @@ -21,6 +21,8 @@ void sbus_cgsix_device::base_map(address_map &map) map(0x00000000, 0x01ffffff).rw(FUNC(sbus_cgsix_device::unknown_r), FUNC(sbus_cgsix_device::unknown_w)); map(0x00000000, 0x00007fff).r(FUNC(sbus_cgsix_device::rom_r)); map(0x00200000, 0x0020000f).m(m_ramdac, FUNC(bt458_device::map)).umask32(0xff000000); + map(0x003018fc, 0x003018ff).rw(FUNC(sbus_cgsix_device::cursor_address_r), FUNC(sbus_cgsix_device::cursor_address_w)); + map(0x00301900, 0x003019ff).rw(FUNC(sbus_cgsix_device::cursor_ram_r), FUNC(sbus_cgsix_device::cursor_ram_w)); map(0x00700000, 0x00700fff).rw(FUNC(sbus_cgsix_device::fbc_r), FUNC(sbus_cgsix_device::fbc_w)); } @@ -36,10 +38,12 @@ sbus_cgsix_device::sbus_cgsix_device(const machine_config &mconfig, device_type void sbus_cgsix_device::device_start() { m_vram = std::make_unique<uint32_t[]>(m_vram_size / 4); - save_pointer(NAME(m_vram), m_vram_size / 4); save_item(NAME(m_vram_size)); + m_cursor_ram = std::make_unique<uint32_t[]>(32 * 2); + save_pointer(NAME(m_cursor_ram), 32 * 2); + save_item(NAME(m_fbc.m_clip_check)); save_item(NAME(m_fbc.m_status)); save_item(NAME(m_fbc.m_draw_status)); @@ -170,11 +174,28 @@ uint32_t sbus_cgsix_device::screen_update(screen_device &screen, bitmap_rgb32 &b const pen_t *pens = m_ramdac->pens(); uint8_t *vram = (uint8_t *)&m_vram[0]; - for (int y = 0; y < 900; y++) + for (int16_t y = 0; y < 900; y++) { uint32_t *scanline = &bitmap.pix32(y); - for (int x = 0; x < 1152; x++) + const bool cursor_row_hit = (y >= m_cursor_y && y < (m_cursor_y + 32)); + for (int16_t x = 0; x < 1152; x++) { + uint8_t cursor_pixel = 0; + const bool cursor_column_hit = (x >= m_cursor_x && x < (m_cursor_x + 32)); + if (cursor_row_hit && cursor_column_hit) + { + const int16_t cursor_row = y - m_cursor_y; + const uint32_t cursor_bit = 31 - (x - m_cursor_x); + const uint32_t cursor_plane_a = m_cursor_ram[cursor_row]; + const uint32_t cursor_plane_b = m_cursor_ram[cursor_row + 32]; + cursor_pixel = (BIT(cursor_plane_b, cursor_bit) << 1) | BIT(cursor_plane_a, cursor_bit); + if (cursor_pixel) + { + *scanline++ = pens[0x100 + cursor_pixel]; + continue; + } + } + const uint8_t pixel = vram[y * 1152 + BYTE4_XOR_BE(x)]; *scanline++ = pens[pixel]; } @@ -824,7 +845,7 @@ WRITE32_MEMBER(sbus_cgsix_device::fbc_w) COMBINE_DATA(&m_fbc.m_clip_maxx); break; case FBC_CLIP_MAXY: - logerror("fbc_w: CLIP_MAXY (%08x & %08x\n", data, mem_mask); + logerror("fbc_w: CLIP_MAXY = %08x & %08x\n", data, mem_mask); COMBINE_DATA(&m_fbc.m_clip_maxy); break; @@ -1110,6 +1131,27 @@ WRITE32_MEMBER(sbus_cgsix_device::fbc_w) } } +READ32_MEMBER(sbus_cgsix_device::cursor_address_r) +{ + return (m_cursor_x << 16) | (uint16_t)m_cursor_y; +} + +WRITE32_MEMBER(sbus_cgsix_device::cursor_address_w) +{ + m_cursor_x = (int16_t)(data >> 16); + m_cursor_y = (int16_t)data; +} + +READ32_MEMBER(sbus_cgsix_device::cursor_ram_r) +{ + return m_cursor_ram[offset]; +} + +WRITE32_MEMBER(sbus_cgsix_device::cursor_ram_w) +{ + COMBINE_DATA(&m_cursor_ram[offset]); +} + //------------------------------------------------- // TurboGX implementation //------------------------------------------------- diff --git a/src/devices/bus/sbus/cgsix.h b/src/devices/bus/sbus/cgsix.h index 3bee124d229..81d33e5ec88 100644 --- a/src/devices/bus/sbus/cgsix.h +++ b/src/devices/bus/sbus/cgsix.h @@ -44,6 +44,10 @@ protected: DECLARE_WRITE32_MEMBER(vram_w); DECLARE_READ32_MEMBER(fbc_r); DECLARE_WRITE32_MEMBER(fbc_w); + DECLARE_READ32_MEMBER(cursor_address_r); + DECLARE_WRITE32_MEMBER(cursor_address_w); + DECLARE_READ32_MEMBER(cursor_ram_r); + DECLARE_WRITE32_MEMBER(cursor_ram_w); uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); uint8_t perform_rasterop(uint8_t src, uint8_t dst); @@ -467,8 +471,12 @@ protected: uint32_t m_curr_prim_type; }; + int16_t m_cursor_x; + int16_t m_cursor_y; + required_memory_region m_rom; std::unique_ptr<uint32_t[]> m_vram; + std::unique_ptr<uint32_t[]> m_cursor_ram; required_device<screen_device> m_screen; required_device<bt458_device> m_ramdac; |