there might be an off by 1 error...
This commit is contained in:
+49
-1
@@ -17,27 +17,66 @@ void broadway::set_pc(ircolib::u32 value) { pc = value; }
|
||||
|
||||
void broadway::run(mem &mem) {
|
||||
for (int i = 0; i < 12150000; i++) {
|
||||
// std::println("pc: 0x{:08X}", pc);
|
||||
execute(fetch(mem), mem);
|
||||
}
|
||||
}
|
||||
|
||||
ircolib::u32 broadway::fetch(mem &mem) {
|
||||
ircolib::u32 val = mem.read32(pc);
|
||||
ircolib::u32 val = mem.read32(pc)
|
||||
.and_then([&](ircolib::u32 val) { return std::expected<ircolib::u32, std::string>(val); })
|
||||
.or_else([&](std::string e) {
|
||||
ircolib::panic("broadway read failed. Reason {} (pc: 0x{:08X})", e, pc);
|
||||
return std::expected<ircolib::u32, std::string>();
|
||||
})
|
||||
.value();
|
||||
pc += 4;
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
void broadway::decode_special3(ircolib::u32 instr, mem &mem) {
|
||||
auto secondary = utils::secondary(instr);
|
||||
switch (secondary) {
|
||||
case 38:
|
||||
mtfsb1(instr);
|
||||
break;
|
||||
case 711:
|
||||
mtfsf(instr);
|
||||
break;
|
||||
default:
|
||||
ircolib::panic("broadway unknown special3 {} (0x{:04X}) (pc 0x{:08X})", secondary, secondary, pc - 4);
|
||||
}
|
||||
}
|
||||
|
||||
void broadway::decode_special2(ircolib::u32 instr, mem &mem) {
|
||||
auto secondary = utils::secondary(instr);
|
||||
switch (secondary) {
|
||||
case 0x000:
|
||||
cmp(instr);
|
||||
break;
|
||||
case 0x020:
|
||||
cmpl(instr);
|
||||
break;
|
||||
case 0x028:
|
||||
subf(instr);
|
||||
break;
|
||||
case 0x053:
|
||||
mfmsr(instr);
|
||||
break;
|
||||
case 0x0D2:
|
||||
ircolib::warn("broadway TODO mtsr (pc 0x{:08X})", pc - 4);
|
||||
break;
|
||||
case 0x1BC:
|
||||
or (instr);
|
||||
break;
|
||||
case 0x153:
|
||||
case 0x1D3:
|
||||
mftspr(ircolib::is_bit_set<ircolib::u32, 7>(secondary), instr);
|
||||
break;
|
||||
case 0x1DC:
|
||||
nand(instr);
|
||||
break;
|
||||
case 0x10A:
|
||||
add(instr);
|
||||
break;
|
||||
@@ -66,6 +105,9 @@ void broadway::decode_special1(ircolib::u32 instr, mem &mem) {
|
||||
|
||||
void broadway::execute(ircolib::u32 instr, mem &mem) {
|
||||
switch (utils::primary(instr)) {
|
||||
case 10:
|
||||
cmpli(instr);
|
||||
break;
|
||||
case 11:
|
||||
cmpi(instr);
|
||||
break;
|
||||
@@ -111,12 +153,18 @@ void broadway::execute(ircolib::u32 instr, mem &mem) {
|
||||
case 37:
|
||||
stwu(instr, mem);
|
||||
break;
|
||||
case 39:
|
||||
stbu(instr, mem);
|
||||
break;
|
||||
case 44:
|
||||
sth(instr, mem);
|
||||
break;
|
||||
case 50:
|
||||
lfd(instr, mem);
|
||||
break;
|
||||
case 63:
|
||||
decode_special3(instr, mem);
|
||||
break;
|
||||
default:
|
||||
std::println("broadway::execute unimplemented instruction 0x{:08X} / 0b{:032b}", instr, instr);
|
||||
std::println("disassembly:");
|
||||
|
||||
Reference in New Issue
Block a user