diff --git a/src/app/rom.h b/src/app/rom.h index 3a3aad63..2f903eb2 100644 --- a/src/app/rom.h +++ b/src/app/rom.h @@ -206,8 +206,16 @@ class Rom : public core::ExperimentFlags { */ absl::Status SaveAllPalettes(); + absl::Status ReadWritePreconditions() { + if (!is_loaded_) { + return absl::FailedPreconditionError("ROM not loaded"); + } + return absl::OkStatus(); + } + // Read functions absl::StatusOr ReadByte(int offset) { + RETURN_IF_ERROR(ReadWritePreconditions()); if (offset >= rom_data_.size()) { return absl::FailedPreconditionError("Offset out of range"); } @@ -215,6 +223,7 @@ class Rom : public core::ExperimentFlags { } absl::StatusOr ReadWord(int offset) { + RETURN_IF_ERROR(ReadWritePreconditions()); if (offset + 1 >= rom_data_.size()) { return absl::FailedPreconditionError("Offset out of range"); } @@ -227,8 +236,9 @@ class Rom : public core::ExperimentFlags { } absl::StatusOr ReadLong(int offset) { + RETURN_IF_ERROR(ReadWritePreconditions()); if (offset + 2 >= rom_data_.size()) { - return absl::FailedPreconditionError("Offset out of range"); + return absl::OutOfRangeError("Offset out of range"); } auto result = (uint32_t)(rom_data_[offset] | (rom_data_[offset + 1] << 8) | (rom_data_[offset + 2] << 16)); @@ -237,8 +247,9 @@ class Rom : public core::ExperimentFlags { absl::StatusOr> ReadByteVector(uint32_t offset, uint32_t length) { + RETURN_IF_ERROR(ReadWritePreconditions()); if (offset + length > rom_data_.size()) { - return absl::FailedPreconditionError("Offset and length out of range"); + return absl::OutOfRangeError("Offset and length out of range"); } std::vector result; for (int i = offset; i < offset + length; i++) {