From 2d6a44b90ed494336bf0f323743fa1cf17d7b28a Mon Sep 17 00:00:00 2001 From: David Haywood Date: Sat, 18 May 2019 13:29:55 +0100 Subject: [PATCH] smartfp / unsp research / improvements (#5075) * smartfp / unsp research / improvements (nw) * more bits (nw) --- src/devices/cpu/unsp/unsp_exxx.cpp | 6 +-- src/devices/cpu/unsp/unsp_fxxx.cpp | 22 +++++++-- src/devices/machine/sunplus_gcm394_video.cpp | 52 +++++++++++++++++--- src/mame/drivers/sunplus_gcm394.cpp | 16 ++---- 4 files changed, 70 insertions(+), 26 deletions(-) diff --git a/src/devices/cpu/unsp/unsp_exxx.cpp b/src/devices/cpu/unsp/unsp_exxx.cpp index 57242b85488..5eb74881b7b 100644 --- a/src/devices/cpu/unsp/unsp_exxx.cpp +++ b/src/devices/cpu/unsp/unsp_exxx.cpp @@ -164,7 +164,7 @@ void unsp_12_device::execute_exxx_group(uint16_t op) return; case 0x02: - logerror("%s = %s lsl %s\n", regs[rd], regs[rd], regs[rs]); + logerror("pc:%06x: %s = %s lsl %s (%04x %04x)\n", UNSP_LPC, regs[rd], regs[rd], regs[rs], m_core->m_r[rd], m_core->m_r[rs]); m_core->m_r[rd] = m_core->m_r[rd] << m_core->m_r[rs]; return; @@ -175,13 +175,13 @@ void unsp_12_device::execute_exxx_group(uint16_t op) case 0x04: // smartfp loops increasing shift by 4 up to values of 28? (but regs are 16-bit?) - logerror("%s = %s lsr %s (%04x %04x)\n", regs[rd], regs[rd], regs[rs], m_core->m_r[rd], m_core->m_r[rs]); + logerror("pc:%06x: %s = %s lsr %s (%04x %04x)\n", UNSP_LPC, regs[rd], regs[rd], regs[rs], m_core->m_r[rd], m_core->m_r[rs]); m_core->m_r[rd] = m_core->m_r[rd] >> m_core->m_r[rs]; return; case 0x05: { - logerror("%s = %s lsror %s (%04x %04x)\n", regs[rd], regs[rd], regs[rs], m_core->m_r[rd], m_core->m_r[rs]); + logerror("pc:%06x: %s = %s lsror %s (%04x %04x)\n", UNSP_LPC, regs[rd], regs[rd], regs[rs], m_core->m_r[rd], m_core->m_r[rs]); uint16_t tmp = m_core->m_r[rd]; m_core->m_r[rd] = m_core->m_r[rd] >> m_core->m_r[rs]; m_core->m_r[rd] |= tmp; // guess diff --git a/src/devices/cpu/unsp/unsp_fxxx.cpp b/src/devices/cpu/unsp/unsp_fxxx.cpp index d0e4b5b776b..649bc162160 100644 --- a/src/devices/cpu/unsp/unsp_fxxx.cpp +++ b/src/devices/cpu/unsp/unsp_fxxx.cpp @@ -251,7 +251,6 @@ void unsp_12_device::execute_fxxx_101_group(uint16_t op) { m_core->m_icount -= 1; // unknown count uint32_t addr = m_core->m_r[REG_R3] | ((m_core->m_r[REG_R4] & 0x3f) << 16); - add_lpc(1); push(m_core->m_r[REG_PC], &m_core->m_r[REG_SP]); push(m_core->m_r[REG_SR], &m_core->m_r[REG_SP]); m_core->m_r[REG_PC] = addr & 0x0000ffff; @@ -280,12 +279,27 @@ void unsp_12_device::execute_fxxx_101_group(uint16_t op) case 0xf16c: case 0xf36c: case 0xf56c: case 0xf76c: case 0xf96c: case 0xfb6c: case 0xfd6c: case 0xff6c: case 0xf174: case 0xf374: case 0xf574: case 0xf774: case 0xf974: case 0xfb74: case 0xfd74: case 0xff74: case 0xf17c: case 0xf37c: case 0xf57c: case 0xf77c: case 0xf97c: case 0xfb7c: case 0xfd7c: case 0xff7c: + { //unimplemented_opcode(op); // what is this, sign extend / sign expand / zero expand? it doesn't seem to be exponent - logerror("r2 = exp r4 (with r2 = %04x r4 = %04x)\n", m_core->m_r[REG_R2], m_core->m_r[REG_R4]); - m_core->m_r[REG_R2] = 0x0001; // WRONG!! - return; + // palette uploads in smartfp depend on this, however this logic only works for the first few, so isn't correct + uint16_t result = m_core->m_r[REG_R4];// rand(); + uint16_t temp = m_core->m_r[REG_R4]; + for (int i = 0; i < 16; i++) + { + int bit = (temp << i) & 0x8000; + + if (bit) + break; + + result |= 1 << (15 - i); + } + + logerror("pc:%06x: r2 = exp r4 (with r2 = %04x r4 = %04x) (returning %04x)\n", UNSP_LPC, m_core->m_r[REG_R2], m_core->m_r[REG_R4], result); + m_core->m_r[REG_R2] = result; + return; + } default: return unsp_device::execute_fxxx_101_group(op); diff --git a/src/devices/machine/sunplus_gcm394_video.cpp b/src/devices/machine/sunplus_gcm394_video.cpp index 42eeae74b21..81431d1b556 100644 --- a/src/devices/machine/sunplus_gcm394_video.cpp +++ b/src/devices/machine/sunplus_gcm394_video.cpp @@ -229,8 +229,9 @@ void gcm394_base_video_device::draw(const rectangle &cliprect, uint32_t line, ui { uint32_t nc_bpp = ((bpp) + 1) << 1; - palette_offset >>= nc_bpp; - palette_offset <<= nc_bpp; + // probably don't do this here as this SoC has extended palette for higher bpp modes + //palette_offset >>= nc_bpp; + //palette_offset <<= nc_bpp; uint32_t bits_per_row = nc_bpp * w / 16; //uint32_t words_per_tile = bits_per_row * h; @@ -269,7 +270,31 @@ void gcm394_base_video_device::draw(const rectangle &cliprect, uint32_t line, ui } nbits -= nc_bpp; - uint32_t pal = palette_offset + (bits >> 16); + int pen = bits >> 16; + + int current_palette_offset = palette_offset; + + // for planes above 4bpp palette ends up being pulled from different places? + if (nc_bpp < 6) + { + // 2bpp + // 4bpp + + current_palette_offset |= 0x0800; + + } + else if (nc_bpp < 8) + { + // 6bpp + + } + else + { + pen = machine().rand() & 0x1f; + // 8bpp + } + + uint32_t pal = current_palette_offset + pen; bits &= 0xffff; if (RowScroll) @@ -345,7 +370,7 @@ void gcm394_base_video_device::draw_page(const rectangle &cliprect, uint32_t sca if (x0 & 1) palette >>= 8; - tile |= (palette & 0x0003) << 16; + tile |= (palette & 0x0007) << 16; if (!tile) continue; @@ -373,7 +398,8 @@ void gcm394_base_video_device::draw_page(const rectangle &cliprect, uint32_t sca const uint32_t yflipmask = tileattr & TILE_Y_FLIP ? tile_h - 1 : 0; uint32_t palette_offset = (tileattr & 0x0f00) >> 4; - palette_offset |= 0x0900; + //palette_offset |= 0x0900; + palette_offset |= 0x0100; const uint8_t bpp = tileattr & 0x0003; @@ -466,7 +492,8 @@ void gcm394_base_video_device::draw_sprite(const rectangle &cliprect, uint32_t s const uint32_t yflipmask = attr & TILE_Y_FLIP ? h - 1 : 0; uint32_t palette_offset = (attr & 0x0f00) >> 4; - palette_offset |= 0x0d00; + //palette_offset |= 0x0d00; + palette_offset |= 0x0500; if (blend) { @@ -746,7 +773,18 @@ WRITE16_MEMBER(gcm394_base_video_device::video_703a_w) { LOGMASKED(LOG_GCM394_VI READ16_MEMBER(gcm394_base_video_device::video_7062_r) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_7062_r\n", machine().describe_context()); return m_7062; } WRITE16_MEMBER(gcm394_base_video_device::video_7062_w) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_7062_w %04x\n", machine().describe_context(), data); m_7062 = data; } -WRITE16_MEMBER(gcm394_base_video_device::video_7063_w) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_7063_w %04x\n", machine().describe_context(), data); m_7063 = data; } +WRITE16_MEMBER(gcm394_base_video_device::video_7063_w) +{ + LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_7063_w %04x\n", machine().describe_context(), data); + m_7063 = data; + + // ack or enable? happens near start of the IRQ + if (data & 0x01) + { + m_video_irq_status &= ~1; + check_video_irq(); + } +} WRITE16_MEMBER(gcm394_base_video_device::video_702a_w) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_702a_w %04x\n", machine().describe_context(), data); m_702a = data; } diff --git a/src/mame/drivers/sunplus_gcm394.cpp b/src/mame/drivers/sunplus_gcm394.cpp index 473a5ae3448..0bd86d4a533 100644 --- a/src/mame/drivers/sunplus_gcm394.cpp +++ b/src/mame/drivers/sunplus_gcm394.cpp @@ -157,18 +157,10 @@ static INPUT_PORTS_START( gcm394 ) PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x1000, 0x1000, "Test 1/2" ) - PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x8000, 0x8000, "Test 2/2" ) - PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) // hold button 1 and 4 on startup for test screen + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON4 ) INPUT_PORTS_END