diff options
author | mooglyguy <therealmogminer@gmail.com> | 2019-11-18 17:30:38 +0100 |
---|---|---|
committer | MooglyGuy <therealmogminer@gmail.com> | 2019-11-18 17:31:09 +0100 |
commit | b54cb1804b4eff6f1e4be82a43e346c30d6755ab (patch) | |
tree | ba6ef819ed48a53cc0f194fafb5896f2ebb8b77b /src/devices/bus | |
parent | 0a0d0fd9b03b791767b1400f713d63aa1647fcba (diff) |
-sun4c_mmu.cpp: Made generic to support sun4 MMU mode, and cleaned up save state usage. [Ryan Holtz]
-sun4.cpp: Various changes: [Ryan Holtz]
* Split sun4 and sun4c hardware emulation into separate derived classes.
* Hooked up Sbus IRQs.
* Removed now-unnecessary duplicate MMU code.
-cgsix.cpp: Added VSync IRQ, cleaned up save state usage, and added THC MISC register. [Ryan Holtz]
-sparc.cpp: Renamed MB86901 to SPARCV7, and added a separate class for SPARCV8. [Ryan Holtz]
-bt45x.cpp: Made logmacro.h usage more consistent. [Ryan Holtz]
Diffstat (limited to 'src/devices/bus')
-rw-r--r-- | src/devices/bus/sbus/cgsix.cpp | 107 | ||||
-rw-r--r-- | src/devices/bus/sbus/cgsix.h | 35 | ||||
-rw-r--r-- | src/devices/bus/sbus/sbus.h | 2 |
3 files changed, 117 insertions, 27 deletions
diff --git a/src/devices/bus/sbus/cgsix.cpp b/src/devices/bus/sbus/cgsix.cpp index 1b71bed21ae..1cdd99da2b0 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(0x00300000, 0x00300fff).rw(FUNC(sbus_cgsix_device::fbc_r), FUNC(sbus_cgsix_device::fbc_w)); + map(0x00301818, 0x0030181b).rw(FUNC(sbus_cgsix_device::thc_misc_r), FUNC(sbus_cgsix_device::thc_misc_w)); 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)); @@ -44,6 +46,8 @@ void sbus_cgsix_device::device_start() m_cursor_ram = std::make_unique<uint32_t[]>(32 * 2); save_pointer(NAME(m_cursor_ram), 32 * 2); + save_item(NAME(m_fbc.m_config)); + save_item(NAME(m_fbc.m_misc)); save_item(NAME(m_fbc.m_clip_check)); save_item(NAME(m_fbc.m_status)); save_item(NAME(m_fbc.m_draw_status)); @@ -149,29 +153,20 @@ void sbus_cgsix_device::device_start() save_item(NAME(m_fbc.m_vertex_count)); - for (int i = 0; i < 0x1000; i++) - { - save_item(NAME(m_fbc.m_prim_buf[i].m_absx), i); - save_item(NAME(m_fbc.m_prim_buf[i].m_absy), i); - save_item(NAME(m_fbc.m_prim_buf[i].m_absz), i); - save_item(NAME(m_fbc.m_prim_buf[i].m_relx), i); - save_item(NAME(m_fbc.m_prim_buf[i].m_rely), i); - save_item(NAME(m_fbc.m_prim_buf[i].m_relz), i); - save_item(NAME(m_fbc.m_prim_buf[i].m_r), i); - save_item(NAME(m_fbc.m_prim_buf[i].m_g), i); - save_item(NAME(m_fbc.m_prim_buf[i].m_b), i); - save_item(NAME(m_fbc.m_prim_buf[i].m_a), i); - } + m_fbc.m_prim_buf = std::make_unique<vertex[]>(0x1000); // Unknown size on hardware + save_pointer(NAME(reinterpret_cast<uint8_t*>(m_fbc.m_prim_buf.get())), sizeof(vertex) * 0x1000); save_item(NAME(m_fbc.m_curr_prim_type)); + save_item(NAME(m_thc_misc)); save_item(NAME(m_cursor_x)); save_item(NAME(m_cursor_y)); } void sbus_cgsix_device::device_reset() { - memset(&m_fbc, 0, sizeof(m_fbc)); + m_fbc.m_vertex_count = 0; + m_thc_misc = 0; } uint32_t sbus_cgsix_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) @@ -255,7 +250,8 @@ uint8_t sbus_cgsix_device::perform_rasterop(uint8_t src, uint8_t dst, uint8_t ma const uint8_t s = src & mask; const uint8_t d = dst & mask; const uint32_t rop = rops[f | b]; - //logerror("f:%d b:%d s:%02x d:%02x rop:%d\n", f >> 1, b, s, d, rop); + //if (fbc_misc_data() == FBC_MISC_DATA_COLOR8) + //logerror("f:%d b:%d s:%02x d:%02x rop:%d\n", f >> 1, b, s, d, rop); uint8_t value = 0; switch (rop) @@ -280,17 +276,21 @@ uint8_t sbus_cgsix_device::perform_rasterop(uint8_t src, uint8_t dst, uint8_t ma } result |= value & mask; } + //if (fbc_misc_data() == FBC_MISC_DATA_COLOR8) + //logerror("result: %02x\n", result); return result; } void sbus_cgsix_device::handle_font_poke() { - if (fbc_misc_draw() != FBC_MISC_DRAW_RENDER) + if (fbc_misc_draw() > FBC_MISC_DRAW_RENDER) { logerror("handle_font_poke: Unsupported font draw mode %d, abandoning draw\n", fbc_misc_draw()); return; } + const bool color8 = (fbc_misc_data() == FBC_MISC_DATA_COLOR8); + uint32_t pixel_mask = fbc_get_pixel_mask(); uint8_t plane_mask = fbc_get_plane_mask(); @@ -300,13 +300,20 @@ void sbus_cgsix_device::handle_font_poke() const int width = (int)m_fbc.m_x1 - (int)m_fbc.m_x0; const uint32_t font = m_fbc.m_font; uint32_t x = m_fbc.m_x0; - logerror("Width: %d, bits %d to %d\n", width, 31, 31 - width); - for (int bit = 31; bit >= (31 - width) && x < 1152; bit--, x++) + //logerror("Width: %d, bits %d to %d\n", width, 31, 31 - width); + int step_size = color8 ? 8 : 1; + int start_bit = 32 - step_size; + + for (int bit = start_bit; bit >= (start_bit - width * step_size) && x < 1152; bit -= step_size, x++) { if (!BIT(pixel_mask, 31 - (x % 32))) continue; - const uint8_t src = BIT(font, bit) ? 0xff : 0x00; + uint8_t src = 0; + if (color8) + src = (font >> bit) & 0xff; + else + src = BIT(font, bit) ? 0xff : 0x00; const uint8_t dst = vram[BYTE4_XOR_BE(x)]; vram[BYTE4_XOR_BE(x)]= perform_rasterop(src, dst, plane_mask); } @@ -351,7 +358,7 @@ uint8_t sbus_cgsix_device::fbc_get_plane_mask() // NOTE: This is basically untested, and probably full of bugs! void sbus_cgsix_device::handle_draw_command() { - if (fbc_misc_draw() != FBC_MISC_DRAW_RENDER) + if (fbc_misc_draw() > FBC_MISC_DRAW_RENDER) { logerror("handle_draw_command: Unsupported draw mode %d, abandoning draw\n", fbc_misc_draw()); return; @@ -377,8 +384,8 @@ void sbus_cgsix_device::handle_draw_command() uint32_t vindex = 0; while (vindex < m_fbc.m_vertex_count) { - vertex_t &v0 = m_fbc.m_prim_buf[vindex++]; - vertex_t &v1 = m_fbc.m_prim_buf[vindex++]; + vertex &v0 = m_fbc.m_prim_buf[vindex++]; + vertex &v1 = m_fbc.m_prim_buf[vindex++]; for (uint32_t y = v0.m_absy; y <= v1.m_absy; y++) { @@ -454,6 +461,12 @@ READ32_MEMBER(sbus_cgsix_device::fbc_r) uint32_t ret = 0; switch (offset) { + case FBC_CONFIG: + { + const uint32_t data = (m_fbc.m_config & FBC_CONFIG_MASK) | FBC_CONFIG_FBID | FBC_CONFIG_VERSION; + logerror("%s: fbc_r: CONFIG (%08x & %08x)\n", machine().describe_context(), data, mem_mask); + return data; + } case FBC_MISC: logerror("fbc_r: MISC (%08x & %08x)\n", m_fbc.m_misc, mem_mask); return m_fbc.m_misc; @@ -780,6 +793,10 @@ WRITE32_MEMBER(sbus_cgsix_device::fbc_w) switch (offset) { + case FBC_CONFIG: + COMBINE_DATA(&m_fbc.m_config); + logerror("fbc_w: CONFIG = %08x & %08x)\n", data, mem_mask); + break; case FBC_MISC: COMBINE_DATA(&m_fbc.m_misc); logerror("fbc_w: MISC = %08x & %08x\n", data, mem_mask); @@ -1237,6 +1254,50 @@ WRITE32_MEMBER(sbus_cgsix_device::cursor_ram_w) COMBINE_DATA(&m_cursor_ram[offset]); } +READ32_MEMBER(sbus_cgsix_device::thc_misc_r) +{ + logerror("thc_misc_r: %08x & %08x\n", m_thc_misc | THC_MISC_REV, mem_mask); + return m_thc_misc | THC_MISC_REV; +} + +WRITE32_MEMBER(sbus_cgsix_device::thc_misc_w) +{ + logerror("thc_misc_w: %08x & %08x\n", data, mem_mask); + if (BIT(data, THC_MISC_IRQ_BIT) && BIT(m_thc_misc, THC_MISC_IRQ_BIT)) + { + data &= ~(1 << THC_MISC_IRQ_BIT); + lower_irq(4); + } + if (BIT(data, THC_MISC_IRQEN_BIT)) + { + data &= ~(1 << THC_MISC_IRQ_BIT); + } + + COMBINE_DATA(&m_thc_misc); + m_thc_misc &= THC_MISC_WRITE_MASK; +} + +WRITE_LINE_MEMBER(sbus_cgsix_device::vblank_w) +{ + int old_state = BIT(m_thc_misc, THC_MISC_VSYNC_BIT); + if (old_state != state) + { + if (state) + { + m_thc_misc |= 1 << THC_MISC_VSYNC_BIT; + if (BIT(m_thc_misc, THC_MISC_IRQEN_BIT)) + { + m_thc_misc |= 1 << THC_MISC_IRQ_BIT; + raise_irq(4); + } + } + else + { + m_thc_misc &= ~(1 << THC_MISC_VSYNC_BIT); + } + } +} + //------------------------------------------------- // TurboGX implementation //------------------------------------------------- @@ -1262,6 +1323,7 @@ void sbus_turbogx_device::device_add_mconfig(machine_config &config) SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_screen_update(FUNC(sbus_turbogx_device::screen_update)); m_screen->set_raw(105.561_MHz_XTAL, 1472, 0, 1152, 943, 0, 900); + m_screen->screen_vblank().set(FUNC(sbus_turbogx_device::vblank_w)); BT458(config, m_ramdac, 0); } @@ -1303,6 +1365,7 @@ void sbus_turbogxp_device::device_add_mconfig(machine_config &config) m_screen->set_size(1152, 900); m_screen->set_visarea(0, 1152-1, 0, 900-1); m_screen->set_refresh_hz(72); + m_screen->screen_vblank().set(FUNC(sbus_turbogxp_device::vblank_w)); BT467(config, m_ramdac, 0); } diff --git a/src/devices/bus/sbus/cgsix.h b/src/devices/bus/sbus/cgsix.h index abd1a33ec58..47423f1e724 100644 --- a/src/devices/bus/sbus/cgsix.h +++ b/src/devices/bus/sbus/cgsix.h @@ -44,10 +44,13 @@ protected: DECLARE_WRITE32_MEMBER(vram_w); DECLARE_READ32_MEMBER(fbc_r); DECLARE_WRITE32_MEMBER(fbc_w); + DECLARE_READ32_MEMBER(thc_misc_r); + DECLARE_WRITE32_MEMBER(thc_misc_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); + DECLARE_WRITE_LINE_MEMBER(vblank_w); uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); uint8_t perform_rasterop(uint8_t src, uint8_t dst, uint8_t mask = 0xff); @@ -79,6 +82,27 @@ protected: enum { + THC_MISC_IRQ_BIT = 4, + THC_MISC_IRQEN_BIT = 5, + THC_MISC_CURRES_BIT = 6, + THC_MISC_SYNCEN_BIT = 7, + THC_MISC_VSYNC_BIT = 8, + THC_MISC_SYNC_BIT = 9, + THC_MISC_ENVID_BIT = 10, + THC_MISC_RESET_BIT = 12, + THC_MISC_REV = 0x00010000, + THC_MISC_WRITE_MASK = 0x000014ff + }; + + enum + { + FBC_CONFIG_FBID = 0x60000000, + FBC_CONFIG_VERSION = 0x00100000, + FBC_CONFIG_MASK = 0x000f3fff + }; + + enum + { FBC_MISC_INDEX_SHIFT = 4, FBC_MISC_INDEX_MOD_SHIFT = 6, FBC_MISC_BDISP_SHIFT = 7, @@ -233,6 +257,7 @@ protected: enum { + FBC_CONFIG = 0x000/4, FBC_MISC = 0x004/4, FBC_CLIP_CHECK = 0x008/4, @@ -339,7 +364,7 @@ protected: FBC_IRECT_A = 0x93c/4, }; - struct vertex_t + struct vertex { uint32_t m_absx; uint32_t m_absy; @@ -364,8 +389,9 @@ protected: PRIM_COUNT }; - struct fbc_t + struct fbc { + uint32_t m_config; uint32_t m_misc; uint32_t m_clip_check; uint32_t m_status; @@ -471,11 +497,12 @@ protected: uint32_t m_irect_b; uint32_t m_irect_a; - vertex_t m_prim_buf[0x1000]; // unknown size + std::unique_ptr<vertex[]> m_prim_buf; uint32_t m_vertex_count; uint32_t m_curr_prim_type; }; + uint32_t m_thc_misc; int16_t m_cursor_x; int16_t m_cursor_y; @@ -485,7 +512,7 @@ protected: required_device<screen_device> m_screen; required_device<bt458_device> m_ramdac; - fbc_t m_fbc; + fbc m_fbc; uint32_t m_vram_size; }; diff --git a/src/devices/bus/sbus/sbus.h b/src/devices/bus/sbus/sbus.h index fdd33ff1d6b..7dfe0da8866 100644 --- a/src/devices/bus/sbus/sbus.h +++ b/src/devices/bus/sbus/sbus.h @@ -103,7 +103,7 @@ protected: virtual void device_start() override; // internal state - required_device<mb86901_device> m_maincpu; + required_device<sparc_base_device> m_maincpu; required_device<address_map_bank_device> m_type1space; address_space *m_space; |