diff --git a/src/devices/cpu/unsp/unsp_exxx.cpp b/src/devices/cpu/unsp/unsp_exxx.cpp index ddbc32bc570..2572910cf43 100644 --- a/src/devices/cpu/unsp/unsp_exxx.cpp +++ b/src/devices/cpu/unsp/unsp_exxx.cpp @@ -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("\n"); diff --git a/src/devices/machine/sunplus_gcm394.cpp b/src/devices/machine/sunplus_gcm394.cpp index d73ac892aa1..bac31d747cc 100644 --- a/src/devices/machine/sunplus_gcm394.cpp +++ b/src/devices/machine/sunplus_gcm394.cpp @@ -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);