| 31 | |
| 32 | |
| 33 | static void parseDisasm(SymbolGuardian& guardian, const char* disasm, char* opcode, char* arguments, size_t arguments_size, bool insertSymbols) |
| 34 | { |
| 35 | if (*disasm == '(') |
| 36 | { |
| 37 | while (*disasm != ')' && *disasm != 0) |
| 38 | disasm++; |
| 39 | if (*disasm == ')') |
| 40 | disasm++; |
| 41 | } |
| 42 | |
| 43 | // copy opcode |
| 44 | while (*disasm != 0 && *disasm != '\t') |
| 45 | { |
| 46 | *opcode++ = *disasm++; |
| 47 | } |
| 48 | *opcode = 0; |
| 49 | |
| 50 | if (*disasm++ == 0) |
| 51 | { |
| 52 | *arguments = 0; |
| 53 | return; |
| 54 | } |
| 55 | |
| 56 | char* arguments_start = arguments; |
| 57 | const char* jumpAddress = strstr(disasm,"->$"); |
| 58 | const char* jumpRegister = strstr(disasm,"->"); |
| 59 | while (*disasm != 0) |
| 60 | { |
| 61 | // parse symbol |
| 62 | if (disasm == jumpAddress) |
| 63 | { |
| 64 | u32 branchTarget; |
| 65 | sscanf(disasm+3,"0x%08x",&branchTarget); |
| 66 | |
| 67 | const std::string addressSymbol = guardian.SymbolStartingAtAddress(branchTarget).name; |
| 68 | if (!addressSymbol.empty() && insertSymbols) |
| 69 | { |
| 70 | arguments += std::snprintf(arguments, arguments_size - (arguments - arguments_start), "%s",addressSymbol.c_str()); |
| 71 | } else { |
| 72 | arguments += std::snprintf(arguments, arguments_size - (arguments - arguments_start), "0x%08X",branchTarget); |
| 73 | } |
| 74 | |
| 75 | disasm += 3+2+8; |
| 76 | continue; |
| 77 | } |
| 78 | |
| 79 | if (disasm == jumpRegister) |
| 80 | disasm += 2; |
| 81 | |
| 82 | if (*disasm == ' ') |
| 83 | { |
| 84 | disasm++; |
| 85 | continue; |
| 86 | } |
| 87 | *arguments++ = *disasm++; |
| 88 | } |
| 89 | |
| 90 | *arguments = 0; |
no test coverage detected