3#include "absl/strings/str_format.h"
13 const auto& data = rom->
data();
14 return static_cast<uint16_t
>(data[pc_addr] | (data[pc_addr + 1] << 8));
20 return absl::FailedPreconditionError(
"ROM not loaded");
23 if (layout_id < 0 || layout_id >=
static_cast<int>(kRoomLayoutPointers.size())) {
24 return absl::InvalidArgumentError(absl::StrFormat(
"Invalid layout id %d", layout_id));
27 uint32_t snes_addr = kRoomLayoutPointers[layout_id];
28 int pc_addr =
SnesToPc(
static_cast<int>(snes_addr));
29 if (pc_addr < 0 || pc_addr >=
static_cast<int>(
rom_->
size())) {
30 return absl::OutOfRangeError(absl::StrFormat(
"Layout pointer %d out of range", layout_id));
39 if (!addr_result.ok()) {
40 return addr_result.status();
43 int pos = addr_result.value();
47 while (pos + 2 <
static_cast<int>(
rom_->
size())) {
48 uint8_t b1 = rom_data[pos];
49 uint8_t b2 = rom_data[pos + 1];
51 if (b1 == 0xFF && b2 == 0xFF) {
60 if (pos + 2 >=
static_cast<int>(
rom_->
size())) {
64 uint8_t b3 = rom_data[pos + 2];
73 return absl::OkStatus();
The Rom class is used to load, save, and modify Rom data.
std::vector< RoomObject > objects_
absl::StatusOr< int > GetLayoutAddress(int layout_id) const
absl::Status LoadLayout(int layout_id)
static RoomObject DecodeObjectFromBytes(uint8_t b1, uint8_t b2, uint8_t b3, uint8_t layer)
uint16_t ReadWord(const Rom *rom, int pc_addr)
constexpr uint16_t kLayerTerminator
Zelda 3 specific classes and functions.
uint32_t SnesToPc(uint32_t addr) noexcept