Merge pull request #4995 from DavidHaywood/070519

smartfp dma notes (nw)
This commit is contained in:
R. Belmont 2019-05-08 09:56:11 -04:00 committed by GitHub
commit cf7f5b174d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 90 additions and 4 deletions

View File

@ -150,9 +150,54 @@ void unsp_12_device::execute_exxx_group(uint16_t op)
uint8_t rd = (op & 0x0e00) >> 9;
uint8_t shift = (op & 0x0070) >> 4;
uint8_t rs = (op & 0x0007) >> 0;
logerror("%s = %s %s %s\n", regs[rd], regs[rd], lsft[shift], regs[rs]);
unimplemented_opcode(op);
return;
switch (shift)
{
case 0x00:
logerror("%s = %s asr %s\n", regs[rd], regs[rd], regs[rs]);
unimplemented_opcode(op);
return;
case 0x01:
logerror("%s = %s asror %s\n", regs[rd], regs[rd], regs[rs]);
unimplemented_opcode(op);
return;
case 0x02:
logerror("%s = %s lsl %s\n", regs[rd], regs[rd], regs[rs]);
unimplemented_opcode(op);
return;
case 0x03:
logerror("%s = %s lslor %s\n", regs[rd], regs[rd], regs[rs]);
unimplemented_opcode(op);
return;
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]);
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]);
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
return;
}
case 0x06:
logerror("%s = %s rol %s\n", regs[rd], regs[rd], regs[rs]);
unimplemented_opcode(op);
return;
case 0x07:
logerror("%s = %s ror %s\n", regs[rd], regs[rd], regs[rs]);
unimplemented_opcode(op);
return;
}
}
logerror("<DUNNO>\n");

View File

@ -57,8 +57,49 @@ WRITE16_MEMBER(sunplus_gcm394_base_device::unk_w)
break;
case 0xabf:
logerror("%s:possible DMA operation @ 0x%04x (trigger %04x) with params unk:%04x unk:%04x source:%04x length:%04x unk:%04x unk:%04x unk:%04x\n", machine().describe_context(), offset + 0x7000, data, m_dma_params[0], m_dma_params[1], m_dma_params[2], m_dma_params[3], m_dma_params[4], m_dma_params[5], m_dma_params[6]);
{
uint16_t mode = m_dma_params[0];
uint16_t sourcelow = m_dma_params[1];
uint16_t dest = m_dma_params[2];
uint16_t length = m_dma_params[3];
uint16_t srchigh = m_dma_params[4];
logerror("%s:possible DMA operation @ 0x%04x (trigger %04x) with params mode:%04x source:%04x dest:%04x length:%04x srchigh:%04x unk:%04x unk:%04x\n", machine().describe_context(), offset + 0x7000, data, mode, sourcelow, dest, length, srchigh, m_dma_params[5], m_dma_params[6]);
uint32_t source = sourcelow | (srchigh << 16);
// wrlshunt uses the extra params, might be doing very large ROM -> RAM transfers with even more upper address bits?
if (mode == 0x0089) // no source inc, used for memory clear operations? (source usually points at stack value)
{
for (int i = 0; i < length; i++)
{
address_space& mem = m_cpu->space(AS_PROGRAM);
uint16_t val = mem.read_word(source);
mem.write_word(dest, val);
dest += 1;
}
}
else if (mode == 0x0009) // regular copy? (smartfp does 2 copies like this after the initial clears, source definitely points at a correctly sized data structure)
{
for (int i = 0; i < length; i++)
{
address_space& mem = m_cpu->space(AS_PROGRAM);
uint16_t val = mem.read_word(source);
mem.write_word(dest, val);
dest += 1;
source += 1;
}
}
else
{
logerror("unhandled!\n");
}
m_dma_params[0] = m_dma_params[1] = m_dma_params[2] = m_dma_params[3] = m_dma_params[4] = m_dma_params[5] = m_dma_params[6] = 0x0000;
//machine().debug_break();
break;
}
default:
logerror("%s:sunplus_gcm394_base_device::unk_w @ 0x%04x (data 0x%04x)\n", machine().describe_context(), offset + 0x7000, data);