mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 07:17:45 -04:00
sh2 drc: moved host register assignment to code emitters, minor bugfixing
This commit is contained in:
parent
7e940f142e
commit
9bd6706dca
12 changed files with 174 additions and 250 deletions
|
@ -435,8 +435,10 @@ static int software_interrupt(unsigned int pc, unsigned int insn, char *buf, siz
|
|||
return 1;
|
||||
}
|
||||
|
||||
int disarm(uintptr_t pc, uint32_t insn, char *buf, size_t buf_len)
|
||||
int disarm(uintptr_t pc, uint32_t insn, char *buf, size_t buf_len, uintptr_t *addr)
|
||||
{
|
||||
*addr = 0;
|
||||
|
||||
if ((insn & 0x0fffffd0) == 0x012fff10)
|
||||
return branch_and_exchange(pc, insn, buf, buf_len);
|
||||
|
||||
|
@ -464,8 +466,10 @@ int disarm(uintptr_t pc, uint32_t insn, char *buf, size_t buf_len)
|
|||
if ((insn & 0x0e000000) == 0x08000000)
|
||||
return block_data_transfer(pc, insn, buf, buf_len);
|
||||
|
||||
if ((insn & 0x0e000000) == 0x0a000000)
|
||||
if ((insn & 0x0e000000) == 0x0a000000) {
|
||||
*addr = (long)pc + 8 + ((long)(insn << 8) >> 6);
|
||||
return branch(pc, insn, buf, buf_len);
|
||||
}
|
||||
|
||||
if ((insn & 0x0e000000) == 0x0c000000)
|
||||
return coprocessor_data_transfer(pc, insn, buf, buf_len);
|
||||
|
|
|
@ -23,6 +23,6 @@
|
|||
#ifndef DISARM_H
|
||||
#define DISARM_H
|
||||
|
||||
int disarm(uintptr_t long pc, uint32_t, char *buf, unsigned int buf_len);
|
||||
int disarm(uintptr_t pc, uint32_t insn, char *buf, size_t buf_len, uintptr_t *sym);
|
||||
|
||||
#endif /* DISARM_H */
|
||||
|
|
|
@ -274,7 +274,7 @@ static unsigned long j_target(unsigned long pc, uint32_t insn)
|
|||
}
|
||||
|
||||
// main disassembler function
|
||||
int dismips(uintptr_t pc, uint32_t insn, char *buf, unsigned int buflen)
|
||||
int dismips(uintptr_t pc, uint32_t insn, char *buf, size_t buflen, uintptr_t *sym)
|
||||
{
|
||||
const struct insn *pi = decode_insn(insn);
|
||||
char *rs = register_names[(insn >> 21) & 0x1f];
|
||||
|
@ -283,6 +283,7 @@ int dismips(uintptr_t pc, uint32_t insn, char *buf, unsigned int buflen)
|
|||
int sa = (insn >> 6) & 0x1f;
|
||||
int imm = (int16_t) insn;
|
||||
|
||||
*sym = 0;
|
||||
if (pi == NULL) {
|
||||
snprintf(buf, buflen, "0x%x", insn);
|
||||
return 0;
|
||||
|
@ -314,13 +315,16 @@ int dismips(uintptr_t pc, uint32_t insn, char *buf, unsigned int buflen)
|
|||
snprintf(buf, buflen, "%s %s, %s, %d", pi->name, rd, rt, sa);
|
||||
break;
|
||||
case B_IMM_S:
|
||||
snprintf(buf, buflen, "%s %s, 0x%lx", pi->name, rs, b_target(pc, insn));
|
||||
*sym = b_target(pc, insn);
|
||||
snprintf(buf, buflen, "%s %s, 0x%lx", pi->name, rs, *sym);
|
||||
break;
|
||||
case B_IMM_TS:
|
||||
snprintf(buf, buflen, "%s %s, %s, 0x%lx", pi->name, rs, rt, b_target(pc, insn));
|
||||
*sym = b_target(pc, insn);
|
||||
snprintf(buf, buflen, "%s %s, %s, 0x%lx", pi->name, rs, rt, *sym);
|
||||
break;
|
||||
case J_IMM:
|
||||
snprintf(buf, buflen, "%s 0x%lx", pi->name, j_target(pc, insn));
|
||||
*sym = j_target(pc, insn);
|
||||
snprintf(buf, buflen, "%s 0x%lx", pi->name, *sym);
|
||||
break;
|
||||
case A_IMM_TS:
|
||||
if (abs(imm) < 1000)
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#ifndef DISMIPS_H
|
||||
#define DISMIPS_H
|
||||
|
||||
int dismips(uintptr_t pc, uint32_t insn, char *buf, unsigned int buf_len);
|
||||
int dismips(uintptr_t pc, uint32_t insn, char *buf, size_t buf_len, uintptr_t *sym);
|
||||
|
||||
#endif /* DISMIPS_H */
|
||||
|
|
|
@ -46,13 +46,10 @@ void host_dasm(void *addr, int len)
|
|||
|
||||
insn = *(long *)addr;
|
||||
printf(" %08lx %08lx ", (long)addr, insn);
|
||||
if(disasm((unsigned)addr, insn, buf, sizeof(buf)))
|
||||
if(disasm((unsigned)addr, insn, buf, sizeof(buf), &symaddr))
|
||||
{
|
||||
symaddr = 0;
|
||||
if ((insn & 0xe000000) == 0xa000000) {
|
||||
symaddr = (long)addr + 8 + ((long)(insn << 8) >> 6);
|
||||
if (symaddr)
|
||||
name = lookup_name((void *)symaddr);
|
||||
}
|
||||
if (symaddr && name)
|
||||
printf("%s <%s>\n", buf, name);
|
||||
else if (symaddr && !name)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue