ppu disasm: Improve BC formatting

This commit is contained in:
Eladash 2019-09-19 10:39:28 +03:00 committed by Ivan
parent 2c47e39f08
commit 718491c56d
1 changed files with 42 additions and 26 deletions

View File

@ -804,93 +804,109 @@ void PPUDisAsm::BC(ppu_opcode_t op)
return; return;
} }
//TODO: aa lk
const u8 bo0 = (bo & 0x10) ? 1 : 0; const u8 bo0 = (bo & 0x10) ? 1 : 0;
const u8 bo1 = (bo & 0x08) ? 1 : 0; const u8 bo1 = (bo & 0x08) ? 1 : 0;
const u8 bo2 = (bo & 0x04) ? 1 : 0; const u8 bo2 = (bo & 0x04) ? 1 : 0;
const u8 bo3 = (bo & 0x02) ? 1 : 0; const u8 bo3 = (bo & 0x02) ? 1 : 0;
const u8 bo4 = (bo & 0x01) ? 1 : 0; const u8 bo4 = (bo & 0x01) ? 1 : 0;
std::add_pointer_t<const char> inst{""}, sign = inst;
if (bo0 && !bo1 && !bo2 && bo3 && !bo4) if (bo0 && !bo1 && !bo2 && bo3 && !bo4)
{ {
DisAsm_CR_BRANCH("bdz", bi / 4, bd); return; inst = "bdz";
} }
else if (bo0 && bo1 && !bo2 && bo3 && !bo4) else if (bo0 && bo1 && !bo2 && bo3 && !bo4)
{ {
DisAsm_CR_BRANCH("bdz-", bi / 4, bd); return; inst = "bdz", sign = "-";
} }
else if (bo0 && bo1 && !bo2 && bo3 && bo4) else if (bo0 && bo1 && !bo2 && bo3 && bo4)
{ {
DisAsm_CR_BRANCH("bdz+", bi / 4, bd); return; inst = "bdz", sign = "+";
} }
else if (bo0 && !bo1 && !bo2 && !bo3 && !bo4) else if (bo0 && !bo1 && !bo2 && !bo3 && !bo4)
{ {
DisAsm_CR_BRANCH("bdnz", bi / 4, bd); return; inst = "bdnz";
} }
else if (bo0 && bo1 && !bo2 && !bo3 && !bo4) else if (bo0 && bo1 && !bo2 && !bo3 && !bo4)
{ {
DisAsm_CR_BRANCH("bdnz-", bi / 4, bd); return; inst = "bdnz", sign = "-";
} }
else if (bo0 && bo1 && !bo2 && !bo3 && bo4) else if (bo0 && bo1 && !bo2 && !bo3 && bo4)
{ {
DisAsm_CR_BRANCH("bdnz+", bi / 4, bd); return; inst = "bdnz", sign = "+";
} }
else if (!bo0 && !bo1 && bo2 && !bo3 && !bo4) else if (!bo0 && !bo1 && bo2 && !bo3 && !bo4)
{ {
switch (bi % 4) switch (bi % 4)
{ {
case 0x0: DisAsm_CR_BRANCH("bge", bi / 4, bd); return; case 0x0: inst = "bge"; break;
case 0x1: DisAsm_CR_BRANCH("ble", bi / 4, bd); return; case 0x1: inst = "ble"; break;
case 0x2: DisAsm_CR_BRANCH("bne", bi / 4, bd); return; case 0x2: inst = "bne"; break;
case 0x3: inst = "bns"; break;
} }
} }
else if (!bo0 && !bo1 && bo2 && bo3 && !bo4) else if (!bo0 && !bo1 && bo2 && bo3 && !bo4)
{ {
sign = "-";
switch (bi % 4) switch (bi % 4)
{ {
case 0x0: DisAsm_CR_BRANCH("bge-", bi / 4, bd); return; case 0x0: inst = "bge"; break;
case 0x1: DisAsm_CR_BRANCH("ble-", bi / 4, bd); return; case 0x1: inst = "ble"; break;
case 0x2: DisAsm_CR_BRANCH("bne-", bi / 4, bd); return; case 0x2: inst = "bne"; break;
case 0x3: inst = "bns"; break;
} }
} }
else if (!bo0 && !bo1 && bo2 && bo3 && bo4) else if (!bo0 && !bo1 && bo2 && bo3 && bo4)
{ {
sign = "+";
switch (bi % 4) switch (bi % 4)
{ {
case 0x0: DisAsm_CR_BRANCH("bge+", bi / 4, bd); return; case 0x0: inst = "bge"; break;
case 0x1: DisAsm_CR_BRANCH("ble+", bi / 4, bd); return; case 0x1: inst = "ble"; break;
case 0x2: DisAsm_CR_BRANCH("bne+", bi / 4, bd); return; case 0x2: inst = "bne"; break;
case 0x3: inst = "bns"; break;
} }
} }
else if (!bo0 && bo1 && bo2 && !bo3 && !bo4) else if (!bo0 && bo1 && bo2 && !bo3 && !bo4)
{ {
switch (bi % 4) switch (bi % 4)
{ {
case 0x0: DisAsm_CR_BRANCH("blt", bi / 4, bd); return; case 0x0: inst = "blt"; break;
case 0x1: DisAsm_CR_BRANCH("bgt", bi / 4, bd); return; case 0x1: inst = "bgt"; break;
case 0x2: DisAsm_CR_BRANCH("beq", bi / 4, bd); return; case 0x2: inst = "beq"; break;
case 0x3: inst = "bso"; break;
} }
} }
else if (!bo0 && bo1 && bo2 && bo3 && !bo4) else if (!bo0 && bo1 && bo2 && bo3 && !bo4)
{ {
sign = "-";
switch (bi % 4) switch (bi % 4)
{ {
case 0x0: DisAsm_CR_BRANCH("blt-", bi / 4, bd); return; case 0x0: inst = "blt"; break;
case 0x1: DisAsm_CR_BRANCH("bgt-", bi / 4, bd); return; case 0x1: inst = "bgt"; break;
case 0x2: DisAsm_CR_BRANCH("beq-", bi / 4, bd); return; case 0x2: inst = "beq"; break;
case 0x3: inst = "bso"; break;
} }
} }
else if (!bo0 && bo1 && bo2 && bo3 && bo4) else if (!bo0 && bo1 && bo2 && bo3 && bo4)
{ {
sign = "+";
switch (bi % 4) switch (bi % 4)
{ {
case 0x0: DisAsm_CR_BRANCH("blt+", bi / 4, bd); return; case 0x0: inst = "blt"; break;
case 0x1: DisAsm_CR_BRANCH("bgt+", bi / 4, bd); return; case 0x1: inst = "bgt"; break;
case 0x2: DisAsm_CR_BRANCH("beq+", bi / 4, bd); return; case 0x2: inst = "beq"; break;
case 0x3: inst = "bso"; break;
} }
} }
Write(fmt::format("bc [%x:%x:%x:%x:%x], cr%d[%x], 0x%x, %d, %d", bo0, bo1, bo2, bo3, bo4, bi / 4, bi % 4, bd, aa, lk)); if (inst[0] == '\0')
{
return Write(fmt::format("bc 0x%x, 0x%x, 0x%x, %d, %d", bo, bi, bd, aa, lk));
}
DisAsm_CR_BRANCH(std::string(inst) + (lk ? "l" : "") + (aa ? "a" : "") + sign, bi / 4, bd);
} }
void PPUDisAsm::SC(ppu_opcode_t op) void PPUDisAsm::SC(ppu_opcode_t op)