i need to start caring about carry >.<

This commit is contained in:
2026-05-19 12:26:51 +02:00
parent 8824b6b75a
commit f9ab690ccd
17 changed files with 558 additions and 18 deletions
+61 -6
View File
@@ -45,7 +45,10 @@ void broadway::decode_special3(ircolib::u32 instr, mem &mem) {
mtfsf(instr);
break;
default:
ircolib::panic("broadway unknown special3 {} (0x{:04X}) (pc 0x{:08X})", secondary, secondary, pc - 4);
std::println("broadway unknown special3 {} (0x{:04X}) (pc 0x{:08X})", secondary, secondary, pc - 4);
std::println("disassembly:");
print_disasm(instr);
ircolib::panic("LR: 0x{:08X}", lr);
}
}
@@ -55,6 +58,15 @@ void broadway::decode_special2(ircolib::u32 instr, mem &mem) {
case 0x000:
cmp(instr);
break;
case 0x013:
mfcr(instr);
break;
case 0x017:
lwzx(instr, mem);
break;
case 0x01C:
and(instr);
break;
case 0x020:
cmpl(instr);
break;
@@ -64,9 +76,21 @@ void broadway::decode_special2(ircolib::u32 instr, mem &mem) {
case 0x053:
mfmsr(instr);
break;
case 0x090:
mtcrf(instr);
break;
case 0x092:
mtmsr(instr);
break;
case 0x097:
stwx(instr, mem);
break;
case 0x0D2:
ircolib::warn("broadway TODO mtsr (pc 0x{:08X})", pc - 4);
break;
case 0x0EB:
mullw(instr);
break;
case 0x1BC:
or (instr);
break;
@@ -80,10 +104,16 @@ void broadway::decode_special2(ircolib::u32 instr, mem &mem) {
case 0x10A:
add(instr);
break;
case 0x1CB:
divwu(instr);
break;
case 0x256: // sync
break;
default:
ircolib::panic("broadway unknown special2 {} (0x{:04X}) (pc 0x{:08X})", secondary, secondary, pc - 4);
std::println("broadway unknown special2 {} (0x{:04X}) (pc 0x{:08X})", secondary, secondary, pc - 4);
std::println("disassembly:");
print_disasm(instr);
ircolib::panic("LR: 0x{:08X}", lr);
}
}
@@ -98,19 +128,32 @@ void broadway::decode_special1(ircolib::u32 instr, mem &mem) {
case 0x96: // isync
break;
default:
ircolib::panic("broadway unknown special1 {} (0x{:04X}) (pc 0x{:08X})", utils::secondary(instr),
utils::secondary(instr), pc - 4);
std::println("broadway unknown special1 {} (0x{:04X}) (pc 0x{:08X})", utils::secondary(instr),
utils::secondary(instr), pc - 4);
std::println("disassembly:");
print_disasm(instr);
ircolib::panic("LR: 0x{:08X}", lr);
}
}
void broadway::execute(ircolib::u32 instr, mem &mem) {
switch (utils::primary(instr)) {
const auto primary = utils::primary(instr);
switch (primary) {
case 7:
mulli(instr);
break;
case 10:
cmpli(instr);
break;
case 11:
cmpi(instr);
break;
case 12:
addic(instr);
break;
case 13:
addicr(instr);
break;
case 14:
addi(instr);
break;
@@ -126,6 +169,9 @@ void broadway::execute(ircolib::u32 instr, mem &mem) {
case 19:
decode_special1(instr, mem);
break;
case 20:
rlwimi(instr);
break;
case 21:
rlwinm(instr);
break;
@@ -138,6 +184,9 @@ void broadway::execute(ircolib::u32 instr, mem &mem) {
case 28:
andi(instr);
break;
case 29:
andis(instr);
break;
case 31:
decode_special2(instr, mem);
break;
@@ -156,9 +205,15 @@ void broadway::execute(ircolib::u32 instr, mem &mem) {
case 37:
stwu(instr, mem);
break;
case 38:
stb(instr, mem);
break;
case 39:
stbu(instr, mem);
break;
case 40:
lhz(instr, mem);
break;
case 44:
sth(instr, mem);
break;
@@ -169,7 +224,7 @@ void broadway::execute(ircolib::u32 instr, mem &mem) {
decode_special3(instr, mem);
break;
default:
std::println("broadway::execute unimplemented instruction 0x{:08X} / 0b{:032b}", instr, instr);
std::println("broadway::execute unimplemented instruction 0x{:08X} / 0b{:032b} ({})", instr, instr, primary);
std::println("disassembly:");
print_disasm(instr);
ircolib::panic("LR: 0x{:08X}", lr);