From 88285571432b6b9d83e4fae389751b30c4f39b74 Mon Sep 17 00:00:00 2001 From: scawful Date: Tue, 23 Aug 2022 14:00:24 -0500 Subject: [PATCH] refactor bitmap and rom --- src/app/gfx/bitmap.cc | 7 ++++--- src/app/rom.cc | 41 +++++++++++++++-------------------------- src/app/rom.h | 9 +++++++++ 3 files changed, 28 insertions(+), 29 deletions(-) diff --git a/src/app/gfx/bitmap.cc b/src/app/gfx/bitmap.cc index 619f8963..5b9a778d 100644 --- a/src/app/gfx/bitmap.cc +++ b/src/app/gfx/bitmap.cc @@ -119,10 +119,11 @@ absl::Status Bitmap::CreateFromTiles(const std::vector &tiles) { absl::Status Bitmap::WritePixel(int pos, uchar pixel) { if (!surface_) { return absl::InternalError("Surface not loaded"); - } - surface_->pixels[pos] = pixel; + } + auto pixels = (char *)surface_->pixels; + pixels[pos] = pixel; return absl::OkStatus(); -} +} } // namespace gfx } // namespace app diff --git a/src/app/rom.cc b/src/app/rom.cc index 2fdd6ff0..0bbaaa69 100644 --- a/src/app/rom.cc +++ b/src/app/rom.cc @@ -20,27 +20,17 @@ #include "app/core/constants.h" #include "app/gfx/bitmap.h" -#define OVERWORLD_GRAPHICS_POS_1 0x4F80 -#define OVERWORLD_GRAPHICS_POS_2 0x505F -#define OVERWORLD_GRAPHICS_POS_3 0x513E #define COMPRESSION_STRING_MOD 7 << 5 -#define SNES_BYTE_MAX 0xFF - -#define CMD_MOD 0x07 -#define CMD_EXPANDED_MOD 0xE0 -#define CMD_EXPANDED_LENGTH_MOD 0x3FF -#define CMD_NORMAL_LENGTH_MOD 0x1F - namespace yaze { namespace app { namespace { int GetGraphicsAddress(const uchar* data, uint8_t offset) { - auto part_one = data[OVERWORLD_GRAPHICS_POS_1 + offset] << 16; - auto part_two = data[OVERWORLD_GRAPHICS_POS_2 + offset] << 8; - auto part_three = data[OVERWORLD_GRAPHICS_POS_3 + offset]; + auto part_one = data[kOverworldGraphicsPos1 + offset] << 16; + auto part_two = data[kOverworldGraphicsPos2 + offset] << 8; + auto part_three = data[kOverworldGraphicsPos3 + offset]; auto snes_addr = (part_one | part_two | part_three); return core::SnesToPc(snes_addr); } @@ -182,7 +172,7 @@ void CheckIntraCopy(const uchar* rom_data, DataSizeArray& data_size_taken, search_start -= start; printf("- Found repeat of %d at %d\n", copied_size, search_start); data_size_taken[kCommandRepeatingBytes] = copied_size; - cmd_args[kCommandRepeatingBytes][0] = search_start & SNES_BYTE_MAX; + cmd_args[kCommandRepeatingBytes][0] = search_start & kSnesByteMax; cmd_args[kCommandRepeatingBytes][1] = search_start >> 8; } current_pos_u = src_data_pos; @@ -279,12 +269,12 @@ absl::StatusOr> SplitCompressionPiece( piece->command, length_left, piece->argument, piece->argument_length); if (mode == kNintendoMode2) { new_piece->argument[0] = - (offset + kMaxLengthCompression) & SNES_BYTE_MAX; + (offset + kMaxLengthCompression) & kSnesByteMax; new_piece->argument[1] = (offset + kMaxLengthCompression) >> 8; } if (mode == kNintendoMode1) { new_piece->argument[1] = - (offset + kMaxLengthCompression) & SNES_BYTE_MAX; + (offset + kMaxLengthCompression) & kSnesByteMax; new_piece->argument[0] = (offset + kMaxLengthCompression) >> 8; } } break; @@ -352,7 +342,7 @@ Bytes CreateCompressionString(std::shared_ptr& start, pos += piece->argument_length; piece = piece->next; } - output.push_back(SNES_BYTE_MAX); + output.push_back(kSnesByteMax); return output; } @@ -502,17 +492,16 @@ absl::StatusOr ROM::Decompress(int offset, int size, bool reversed) { uchar command = 0; uchar header = rom_data_[offset]; - while (header != SNES_BYTE_MAX) { - if ((header & CMD_EXPANDED_MOD) == CMD_EXPANDED_MOD) { + while (header != kSnesByteMax) { + if ((header & kExpandedMod) == kExpandedMod) { // Expanded Command - command = ((header >> 2) & CMD_MOD); - length = - (((header << 8) | rom_data_[offset + 1]) & CMD_EXPANDED_LENGTH_MOD); + command = ((header >> 2) & kCommandMod); + length = (((header << 8) | rom_data_[offset + 1]) & kExpandedLengthMod); offset += 2; // Advance 2 bytes in ROM } else { // Normal Command - command = ((header >> 5) & CMD_MOD); - length = (header & CMD_NORMAL_LENGTH_MOD); + command = ((header >> 5) & kCommandMod); + length = (header & kNormalLengthMod); offset += 1; // Advance 1 byte in ROM } length += 1; // each commands is at least of size 1 even if index 00 @@ -549,8 +538,8 @@ absl::StatusOr ROM::Decompress(int offset, int size, bool reversed) { offset += 1; // Advance 1 byte in the ROM } break; case kCommandRepeatingBytes: { - ushort s1 = ((rom_data_[offset + 1] & SNES_BYTE_MAX) << 8); - ushort s2 = ((rom_data_[offset] & SNES_BYTE_MAX)); + ushort s1 = ((rom_data_[offset + 1] & kSnesByteMax) << 8); + ushort s2 = ((rom_data_[offset] & kSnesByteMax)); if (reversed) { // Reversed byte order for overworld maps auto addr = (rom_data_[offset + 2]) | ((rom_data_[offset + 1]) << 8); if (addr > offset) { diff --git a/src/app/rom.h b/src/app/rom.h index b2f986c3..7200fec1 100644 --- a/src/app/rom.h +++ b/src/app/rom.h @@ -39,6 +39,15 @@ constexpr int kNintendoMode2 = 1; constexpr int kTile32Num = 4432; constexpr int kTitleStringOffset = 0x7FC0; constexpr int kTitleStringLength = 20; +constexpr int kOverworldGraphicsPos1 = 0x4F80; +constexpr int kOverworldGraphicsPos2 = 0x505F; +constexpr int kOverworldGraphicsPos3 = 0x513E; +constexpr int kSnesByteMax = 0xFF; +constexpr int kCommandMod = 0x07; +constexpr int kExpandedMod = 0xE0; +constexpr int kExpandedLengthMod = 0x3FF; +constexpr int kNormalLengthMod = 0x1F; + constexpr uchar kGraphicsBitmap[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};