change repeating bytes decompression command

This commit is contained in:
scawful
2022-09-09 17:10:32 -05:00
parent fb02608c6f
commit 47ca184292

View File

@@ -528,8 +528,14 @@ absl::StatusOr<Bytes> ROM::Decompress(int offset, int size, int mode) {
offset += 1; // Advance 1 byte in the ROM offset += 1; // Advance 1 byte in the ROM
} break; } break;
case kCommandRepeatingBytes: { case kCommandRepeatingBytes: {
ushort s1 = ((rom_data_[offset + 1] & kSnesByteMax) << 8);
ushort s2 = ((rom_data_[offset] & kSnesByteMax));
int addr = (s1 | s2);
if (mode == kNintendoMode1) { // Reversed byte order for overworld maps if (mode == kNintendoMode1) { // Reversed byte order for overworld maps
auto addr = (rom_data_[offset + 2]) | ((rom_data_[offset + 1]) << 8); addr = (s2 | s1);
}
if (addr > offset) { if (addr > offset) {
return absl::InternalError(absl::StrFormat( return absl::InternalError(absl::StrFormat(
"DecompressOverworld: Offset for command copy exceeds " "DecompressOverworld: Offset for command copy exceeds "
@@ -542,18 +548,11 @@ absl::StatusOr<Bytes> ROM::Decompress(int offset, int size, int mode) {
buffer.resize(size); buffer.resize(size);
} }
memcpy(buffer.data() + buffer_pos, rom_data_.data() + addr, length);
offset += 2;
} else {
ushort s1 = ((rom_data_[offset + 1] & kSnesByteMax) << 8);
ushort s2 = ((rom_data_[offset] & kSnesByteMax));
auto addr = (s1 | s2);
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
buffer[buffer_pos] = buffer[addr + i]; buffer[buffer_pos] = buffer[addr + i];
buffer_pos++; buffer_pos++;
} }
offset += 2; // Advance 2 bytes in the ROM offset += 2; // Advance 2 bytes in the ROM
}
} break; } break;
default: { default: {