smartfp / unsp research / improvements (#5075)

* smartfp / unsp research / improvements (nw)

* more bits (nw)
This commit is contained in:
David Haywood 2019-05-18 13:29:55 +01:00 committed by R. Belmont
parent 5b1123c6e2
commit 2d6a44b90e
4 changed files with 70 additions and 26 deletions

View File

@ -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

View File

@ -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);

View File

@ -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; }

View File

@ -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