ok imma stop using size_t at this point
This commit is contained in:
+5
-2
@@ -147,6 +147,9 @@ void broadway::execute(ircolib::u32 instr, mem &mem) {
|
|||||||
case 33:
|
case 33:
|
||||||
lwzu(instr, mem);
|
lwzu(instr, mem);
|
||||||
break;
|
break;
|
||||||
|
case 34:
|
||||||
|
lbz(instr, mem);
|
||||||
|
break;
|
||||||
case 36:
|
case 36:
|
||||||
stw(instr, mem);
|
stw(instr, mem);
|
||||||
break;
|
break;
|
||||||
@@ -179,11 +182,11 @@ void broadway::print_disasm(ircolib::u32 instr) {
|
|||||||
|
|
||||||
cs_insn *insn;
|
cs_insn *insn;
|
||||||
auto instr_buff = ircolib::integral_to_slice(std::byteswap(instr));
|
auto instr_buff = ircolib::integral_to_slice(std::byteswap(instr));
|
||||||
size_t count = cs_disasm(capstone, instr_buff.data(), instr_buff.size(), pc - 4, 1, &insn);
|
ircolib::u32 count = cs_disasm(capstone, instr_buff.data(), instr_buff.size(), pc - 4, 1, &insn);
|
||||||
if (count <= 0)
|
if (count <= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
size_t j;
|
ircolib::u32 j;
|
||||||
for (j = 0; j < count; j++) {
|
for (j = 0; j < count; j++) {
|
||||||
std::println("\t0x{:x}:\t{}\t\t{}", insn[j].address, insn[j].mnemonic, insn[j].op_str);
|
std::println("\t0x{:x}:\t{}\t\t{}", insn[j].address, insn[j].mnemonic, insn[j].op_str);
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-2
@@ -38,8 +38,8 @@ struct broadway {
|
|||||||
bool get_cr_bit(ircolib::u8 index, ircolib::u8 bit) { return (cr >> index * 4) & (1 << (4 - bit)); }
|
bool get_cr_bit(ircolib::u8 index, ircolib::u8 bit) { return (cr >> index * 4) & (1 << (4 - bit)); }
|
||||||
|
|
||||||
// bat registers indexes
|
// bat registers indexes
|
||||||
static constexpr std::size_t BAT_LOWER_OFFSET = 0;
|
static constexpr ircolib::u32 BAT_LOWER_OFFSET = 0;
|
||||||
static constexpr std::size_t BAT_UPPER_OFFSET = 8;
|
static constexpr ircolib::u32 BAT_UPPER_OFFSET = 8;
|
||||||
|
|
||||||
std::array<ircolib::u32, 16> ibat, dbat;
|
std::array<ircolib::u32, 16> ibat, dbat;
|
||||||
std::array<ircolib::u32, 32> gpr{};
|
std::array<ircolib::u32, 32> gpr{};
|
||||||
@@ -75,6 +75,7 @@ struct broadway {
|
|||||||
void stwu(ircolib::u32, mem &);
|
void stwu(ircolib::u32, mem &);
|
||||||
void stbu(ircolib::u32, mem &);
|
void stbu(ircolib::u32, mem &);
|
||||||
void sth(ircolib::u32, mem &);
|
void sth(ircolib::u32, mem &);
|
||||||
|
void lbz(ircolib::u32, mem &);
|
||||||
void lwz(ircolib::u32, mem &);
|
void lwz(ircolib::u32, mem &);
|
||||||
void lfd(ircolib::u32, mem &);
|
void lfd(ircolib::u32, mem &);
|
||||||
void bclrx(ircolib::u32);
|
void bclrx(ircolib::u32);
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ void broadway::bcx(ircolib::u32 instr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void broadway::mftspr(bool dir, ircolib::u32 instr) {
|
void broadway::mftspr(bool dir, ircolib::u32 instr) {
|
||||||
const size_t spr_field = (instr >> 11) & 0x3FF;
|
const ircolib::u32 spr_field = (instr >> 11) & 0x3FF;
|
||||||
|
|
||||||
auto move_to_or_from_spr = [&](ircolib::u32 &spr) {
|
auto move_to_or_from_spr = [&](ircolib::u32 &spr) {
|
||||||
if (dir) { // mtspr
|
if (dir) { // mtspr
|
||||||
@@ -219,6 +219,22 @@ void broadway::lwz(ircolib::u32 instr, mem &mem) {
|
|||||||
.value();
|
.value();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void broadway::lbz(ircolib::u32 instr, mem &mem) {
|
||||||
|
ircolib::u32 b = gpr[utils::RA(instr)];
|
||||||
|
if (utils::RA(instr) == 0)
|
||||||
|
b = 0;
|
||||||
|
|
||||||
|
ircolib::u32 ea = ircolib::s32(b) + utils::SIMM(instr);
|
||||||
|
|
||||||
|
gpr[utils::RD(instr)] = mem.read8(ea)
|
||||||
|
.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 - 4);
|
||||||
|
return std::expected<ircolib::u32, std::string>();
|
||||||
|
})
|
||||||
|
.value();
|
||||||
|
}
|
||||||
|
|
||||||
void broadway::lfd(ircolib::u32 instr, mem &mem) {
|
void broadway::lfd(ircolib::u32 instr, mem &mem) {
|
||||||
ircolib::u32 b = gpr[utils::RA(instr)];
|
ircolib::u32 b = gpr[utils::RA(instr)];
|
||||||
if (utils::RA(instr) == 0)
|
if (utils::RA(instr) == 0)
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ bool load_dol(const std::string &path, mem &mem, broadway &broadway) {
|
|||||||
ircolib::u32 bss_address, bss_size, entry_point;
|
ircolib::u32 bss_address, bss_size, entry_point;
|
||||||
} hdr;
|
} hdr;
|
||||||
|
|
||||||
for (size_t bin_index = 0; bin_index < 0xD8; bin_index += 4) {
|
for (ircolib::u32 bin_index = 0; bin_index < 0xD8; bin_index += 4) {
|
||||||
if (ircolib::is_inside_range(bin_index, 0, 0x1b)) // text file offsets
|
if (ircolib::is_inside_range(bin_index, 0, 0x1b)) // text file offsets
|
||||||
hdr.text[bin_index / 4].offset = std::byteswap(ircolib::read_access<ircolib::u32>(bin, bin_index));
|
hdr.text[bin_index / 4].offset = std::byteswap(ircolib::read_access<ircolib::u32>(bin, bin_index));
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user