refactor bitmap and rom
This commit is contained in:
@@ -119,10 +119,11 @@ absl::Status Bitmap::CreateFromTiles(const std::vector<Bitmap> &tiles) {
|
|||||||
absl::Status Bitmap::WritePixel(int pos, uchar pixel) {
|
absl::Status Bitmap::WritePixel(int pos, uchar pixel) {
|
||||||
if (!surface_) {
|
if (!surface_) {
|
||||||
return absl::InternalError("Surface not loaded");
|
return absl::InternalError("Surface not loaded");
|
||||||
}
|
}
|
||||||
surface_->pixels[pos] = pixel;
|
auto pixels = (char *)surface_->pixels;
|
||||||
|
pixels[pos] = pixel;
|
||||||
return absl::OkStatus();
|
return absl::OkStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace gfx
|
} // namespace gfx
|
||||||
} // namespace app
|
} // namespace app
|
||||||
|
|||||||
@@ -20,27 +20,17 @@
|
|||||||
#include "app/core/constants.h"
|
#include "app/core/constants.h"
|
||||||
#include "app/gfx/bitmap.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 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 yaze {
|
||||||
namespace app {
|
namespace app {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
int GetGraphicsAddress(const uchar* data, uint8_t offset) {
|
int GetGraphicsAddress(const uchar* data, uint8_t offset) {
|
||||||
auto part_one = data[OVERWORLD_GRAPHICS_POS_1 + offset] << 16;
|
auto part_one = data[kOverworldGraphicsPos1 + offset] << 16;
|
||||||
auto part_two = data[OVERWORLD_GRAPHICS_POS_2 + offset] << 8;
|
auto part_two = data[kOverworldGraphicsPos2 + offset] << 8;
|
||||||
auto part_three = data[OVERWORLD_GRAPHICS_POS_3 + offset];
|
auto part_three = data[kOverworldGraphicsPos3 + offset];
|
||||||
auto snes_addr = (part_one | part_two | part_three);
|
auto snes_addr = (part_one | part_two | part_three);
|
||||||
return core::SnesToPc(snes_addr);
|
return core::SnesToPc(snes_addr);
|
||||||
}
|
}
|
||||||
@@ -182,7 +172,7 @@ void CheckIntraCopy(const uchar* rom_data, DataSizeArray& data_size_taken,
|
|||||||
search_start -= start;
|
search_start -= start;
|
||||||
printf("- Found repeat of %d at %d\n", copied_size, search_start);
|
printf("- Found repeat of %d at %d\n", copied_size, search_start);
|
||||||
data_size_taken[kCommandRepeatingBytes] = copied_size;
|
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;
|
cmd_args[kCommandRepeatingBytes][1] = search_start >> 8;
|
||||||
}
|
}
|
||||||
current_pos_u = src_data_pos;
|
current_pos_u = src_data_pos;
|
||||||
@@ -279,12 +269,12 @@ absl::StatusOr<std::shared_ptr<CompressionPiece>> SplitCompressionPiece(
|
|||||||
piece->command, length_left, piece->argument, piece->argument_length);
|
piece->command, length_left, piece->argument, piece->argument_length);
|
||||||
if (mode == kNintendoMode2) {
|
if (mode == kNintendoMode2) {
|
||||||
new_piece->argument[0] =
|
new_piece->argument[0] =
|
||||||
(offset + kMaxLengthCompression) & SNES_BYTE_MAX;
|
(offset + kMaxLengthCompression) & kSnesByteMax;
|
||||||
new_piece->argument[1] = (offset + kMaxLengthCompression) >> 8;
|
new_piece->argument[1] = (offset + kMaxLengthCompression) >> 8;
|
||||||
}
|
}
|
||||||
if (mode == kNintendoMode1) {
|
if (mode == kNintendoMode1) {
|
||||||
new_piece->argument[1] =
|
new_piece->argument[1] =
|
||||||
(offset + kMaxLengthCompression) & SNES_BYTE_MAX;
|
(offset + kMaxLengthCompression) & kSnesByteMax;
|
||||||
new_piece->argument[0] = (offset + kMaxLengthCompression) >> 8;
|
new_piece->argument[0] = (offset + kMaxLengthCompression) >> 8;
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
@@ -352,7 +342,7 @@ Bytes CreateCompressionString(std::shared_ptr<CompressionPiece>& start,
|
|||||||
pos += piece->argument_length;
|
pos += piece->argument_length;
|
||||||
piece = piece->next;
|
piece = piece->next;
|
||||||
}
|
}
|
||||||
output.push_back(SNES_BYTE_MAX);
|
output.push_back(kSnesByteMax);
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -502,17 +492,16 @@ absl::StatusOr<Bytes> ROM::Decompress(int offset, int size, bool reversed) {
|
|||||||
uchar command = 0;
|
uchar command = 0;
|
||||||
uchar header = rom_data_[offset];
|
uchar header = rom_data_[offset];
|
||||||
|
|
||||||
while (header != SNES_BYTE_MAX) {
|
while (header != kSnesByteMax) {
|
||||||
if ((header & CMD_EXPANDED_MOD) == CMD_EXPANDED_MOD) {
|
if ((header & kExpandedMod) == kExpandedMod) {
|
||||||
// Expanded Command
|
// Expanded Command
|
||||||
command = ((header >> 2) & CMD_MOD);
|
command = ((header >> 2) & kCommandMod);
|
||||||
length =
|
length = (((header << 8) | rom_data_[offset + 1]) & kExpandedLengthMod);
|
||||||
(((header << 8) | rom_data_[offset + 1]) & CMD_EXPANDED_LENGTH_MOD);
|
|
||||||
offset += 2; // Advance 2 bytes in ROM
|
offset += 2; // Advance 2 bytes in ROM
|
||||||
} else {
|
} else {
|
||||||
// Normal Command
|
// Normal Command
|
||||||
command = ((header >> 5) & CMD_MOD);
|
command = ((header >> 5) & kCommandMod);
|
||||||
length = (header & CMD_NORMAL_LENGTH_MOD);
|
length = (header & kNormalLengthMod);
|
||||||
offset += 1; // Advance 1 byte in ROM
|
offset += 1; // Advance 1 byte in ROM
|
||||||
}
|
}
|
||||||
length += 1; // each commands is at least of size 1 even if index 00
|
length += 1; // each commands is at least of size 1 even if index 00
|
||||||
@@ -549,8 +538,8 @@ absl::StatusOr<Bytes> ROM::Decompress(int offset, int size, bool reversed) {
|
|||||||
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] & SNES_BYTE_MAX) << 8);
|
ushort s1 = ((rom_data_[offset + 1] & kSnesByteMax) << 8);
|
||||||
ushort s2 = ((rom_data_[offset] & SNES_BYTE_MAX));
|
ushort s2 = ((rom_data_[offset] & kSnesByteMax));
|
||||||
if (reversed) { // Reversed byte order for overworld maps
|
if (reversed) { // Reversed byte order for overworld maps
|
||||||
auto addr = (rom_data_[offset + 2]) | ((rom_data_[offset + 1]) << 8);
|
auto addr = (rom_data_[offset + 2]) | ((rom_data_[offset + 1]) << 8);
|
||||||
if (addr > offset) {
|
if (addr > offset) {
|
||||||
|
|||||||
@@ -39,6 +39,15 @@ constexpr int kNintendoMode2 = 1;
|
|||||||
constexpr int kTile32Num = 4432;
|
constexpr int kTile32Num = 4432;
|
||||||
constexpr int kTitleStringOffset = 0x7FC0;
|
constexpr int kTitleStringOffset = 0x7FC0;
|
||||||
constexpr int kTitleStringLength = 20;
|
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,
|
constexpr uchar kGraphicsBitmap[8] = {0x80, 0x40, 0x20, 0x10,
|
||||||
0x08, 0x04, 0x02, 0x01};
|
0x08, 0x04, 0x02, 0x01};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user