From 03a6a9b383d5161aa8ef0de2b88a03bf0f3b015b Mon Sep 17 00:00:00 2001 From: iris Date: Tue, 19 May 2026 08:48:52 +0200 Subject: [PATCH] ok imma stop using size_t at this point --- core/broadway.cpp | 7 +++++-- core/broadway.hpp | 5 +++-- core/broadway/instructions.cpp | 18 +++++++++++++++++- core/loaders/dol.cpp | 2 +- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/core/broadway.cpp b/core/broadway.cpp index 517cd82..a775858 100644 --- a/core/broadway.cpp +++ b/core/broadway.cpp @@ -147,6 +147,9 @@ void broadway::execute(ircolib::u32 instr, mem &mem) { case 33: lwzu(instr, mem); break; + case 34: + lbz(instr, mem); + break; case 36: stw(instr, mem); break; @@ -179,11 +182,11 @@ void broadway::print_disasm(ircolib::u32 instr) { cs_insn *insn; 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) return; - size_t j; + ircolib::u32 j; for (j = 0; j < count; j++) { std::println("\t0x{:x}:\t{}\t\t{}", insn[j].address, insn[j].mnemonic, insn[j].op_str); } diff --git a/core/broadway.hpp b/core/broadway.hpp index 3fe2e41..a24ceff 100644 --- a/core/broadway.hpp +++ b/core/broadway.hpp @@ -38,8 +38,8 @@ struct broadway { bool get_cr_bit(ircolib::u8 index, ircolib::u8 bit) { return (cr >> index * 4) & (1 << (4 - bit)); } // bat registers indexes - static constexpr std::size_t BAT_LOWER_OFFSET = 0; - static constexpr std::size_t BAT_UPPER_OFFSET = 8; + static constexpr ircolib::u32 BAT_LOWER_OFFSET = 0; + static constexpr ircolib::u32 BAT_UPPER_OFFSET = 8; std::array ibat, dbat; std::array gpr{}; @@ -75,6 +75,7 @@ struct broadway { void stwu(ircolib::u32, mem &); void stbu(ircolib::u32, mem &); void sth(ircolib::u32, mem &); + void lbz(ircolib::u32, mem &); void lwz(ircolib::u32, mem &); void lfd(ircolib::u32, mem &); void bclrx(ircolib::u32); diff --git a/core/broadway/instructions.cpp b/core/broadway/instructions.cpp index 41e6e1e..01ded14 100644 --- a/core/broadway/instructions.cpp +++ b/core/broadway/instructions.cpp @@ -70,7 +70,7 @@ void broadway::bcx(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) { if (dir) { // mtspr @@ -219,6 +219,22 @@ void broadway::lwz(ircolib::u32 instr, mem &mem) { .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(val); }) + .or_else([&](std::string e) { + ircolib::panic("broadway read failed. Reason {} (pc: 0x{:08X})", e, pc - 4); + return std::expected(); + }) + .value(); +} + void broadway::lfd(ircolib::u32 instr, mem &mem) { ircolib::u32 b = gpr[utils::RA(instr)]; if (utils::RA(instr) == 0) diff --git a/core/loaders/dol.cpp b/core/loaders/dol.cpp index 0535724..82e860e 100644 --- a/core/loaders/dol.cpp +++ b/core/loaders/dol.cpp @@ -20,7 +20,7 @@ bool load_dol(const std::string &path, mem &mem, broadway &broadway) { ircolib::u32 bss_address, bss_size, entry_point; } 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 hdr.text[bin_index / 4].offset = std::byteswap(ircolib::read_access(bin, bin_index));