Added CreateCompressionStringV2
This commit is contained in:
@@ -25,11 +25,11 @@ namespace app {
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
uint GetGraphicsAddress(const uchar* data, uint8_t offset) {
|
int GetGraphicsAddress(const uchar* data, uint8_t offset) {
|
||||||
auto part_one = data[0x4F80 + offset] << 16;
|
auto part_one = data[0x4F80 + offset] << 16;
|
||||||
auto part_two = data[0x505F + offset] << 8;
|
auto part_two = data[0x505F + offset] << 8;
|
||||||
auto part_three = data[0x513E + offset];
|
auto part_three = data[0x513E + offset];
|
||||||
auto snes_addr = uint{(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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ char* HexString(const char* str, const uint size) {
|
|||||||
return toret;
|
return toret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrintCompressionPiece(CompressionPiece* piece) {
|
void PrintCompressionPiece(const std::shared_ptr<CompressionPiece>& piece) {
|
||||||
printf("Command : %d\n", piece->command);
|
printf("Command : %d\n", piece->command);
|
||||||
printf("length : %d\n", piece->length);
|
printf("length : %d\n", piece->length);
|
||||||
printf("Argument length : %d\n", piece->argument_length);
|
printf("Argument length : %d\n", piece->argument_length);
|
||||||
@@ -77,7 +77,7 @@ std::shared_ptr<CompressionPiece> MergeCopy(
|
|||||||
}
|
}
|
||||||
piece->argument_length = piece->length;
|
piece->argument_length = piece->length;
|
||||||
|
|
||||||
PrintCompressionPiece(piece.get());
|
PrintCompressionPiece(piece);
|
||||||
|
|
||||||
auto p_next_next = piece->next->next;
|
auto p_next_next = piece->next->next;
|
||||||
piece->next = p_next_next;
|
piece->next = p_next_next;
|
||||||
@@ -153,7 +153,7 @@ uint CreateCompressionString(std::shared_ptr<CompressionPiece>& start,
|
|||||||
// We need to split the command
|
// We need to split the command
|
||||||
auto new_piece = SplitCompressionPiece(piece, mode);
|
auto new_piece = SplitCompressionPiece(piece, mode);
|
||||||
printf("New added piece\n");
|
printf("New added piece\n");
|
||||||
PrintCompressionPiece(new_piece.get());
|
PrintCompressionPiece(new_piece);
|
||||||
new_piece->next = piece->next;
|
new_piece->next = piece->next;
|
||||||
piece->next = new_piece;
|
piece->next = new_piece;
|
||||||
continue;
|
continue;
|
||||||
@@ -185,6 +185,64 @@ uint CreateCompressionString(std::shared_ptr<CompressionPiece>& start,
|
|||||||
return pos + 1;
|
return pos + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Bytes CreateCompressionStringV2(std::shared_ptr<CompressionPiece>& start,
|
||||||
|
int mode) {
|
||||||
|
uint pos = 0;
|
||||||
|
auto piece = start;
|
||||||
|
Bytes output;
|
||||||
|
|
||||||
|
while (piece != nullptr) {
|
||||||
|
// Normal header
|
||||||
|
if (piece->length <= kMaxLengthNormalHeader) {
|
||||||
|
output.push_back(BUILD_HEADER(piece->command, piece->length));
|
||||||
|
pos++;
|
||||||
|
} else {
|
||||||
|
if (piece->length <= kMaxLengthCompression) {
|
||||||
|
output.push_back((7 << 5) | ((uchar)piece->command << 2) |
|
||||||
|
(((piece->length - 1) & 0xFF00) >> 8));
|
||||||
|
pos++;
|
||||||
|
printf("Building extended header : cmd: %d, length: %d - %02X\n",
|
||||||
|
piece->command, piece->length, output[pos - 1]);
|
||||||
|
output.push_back(((piece->length - 1) & 0x00FF)); // (char)
|
||||||
|
pos++;
|
||||||
|
} else {
|
||||||
|
// We need to split the command
|
||||||
|
auto new_piece = SplitCompressionPiece(piece, mode);
|
||||||
|
printf("New added piece\n");
|
||||||
|
PrintCompressionPiece(new_piece);
|
||||||
|
new_piece->next = piece->next;
|
||||||
|
piece->next = new_piece;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (piece->command == kCommandRepeatingBytes) {
|
||||||
|
char tmp[2];
|
||||||
|
if (mode == kNintendoMode2) {
|
||||||
|
tmp[0] = piece->argument[0];
|
||||||
|
tmp[1] = piece->argument[1];
|
||||||
|
}
|
||||||
|
if (mode == kNintendoMode1) {
|
||||||
|
tmp[0] = piece->argument[1];
|
||||||
|
tmp[1] = piece->argument[0];
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 2; ++i) {
|
||||||
|
output.push_back(tmp[i]);
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < piece->argument_length; ++i) {
|
||||||
|
output.push_back(piece->argument[i]);
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pos += piece->argument_length;
|
||||||
|
piece = piece->next;
|
||||||
|
}
|
||||||
|
output.push_back(0xFF);
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
// Test every command to see the gain with current position
|
// Test every command to see the gain with current position
|
||||||
void TestAllCommands(const uchar* rom_data, DataSizeArray& data_size_taken,
|
void TestAllCommands(const uchar* rom_data, DataSizeArray& data_size_taken,
|
||||||
CommandArgumentArray& cmd_args, uint& u_data_pos,
|
CommandArgumentArray& cmd_args, uint& u_data_pos,
|
||||||
@@ -310,14 +368,18 @@ void CompressionCommandAlternative(
|
|||||||
const CommandSizeArray& cmd_size, const CommandArgumentArray& cmd_args,
|
const CommandSizeArray& cmd_size, const CommandArgumentArray& cmd_args,
|
||||||
uint& u_data_pos, uint& bytes_since_last_compression, uint& cmd_with_max,
|
uint& u_data_pos, uint& bytes_since_last_compression, uint& cmd_with_max,
|
||||||
uint& max_win) {
|
uint& max_win) {
|
||||||
// printf("- Ok we get a gain from %d\n", cmd_with_max);
|
printf("- Ok we get a gain from %d\n", cmd_with_max);
|
||||||
char buffer[2];
|
char buffer[2];
|
||||||
buffer[0] = cmd_args[cmd_with_max][0];
|
buffer[0] = cmd_args[cmd_with_max][0];
|
||||||
|
|
||||||
if (cmd_size[cmd_with_max] == 2) buffer[1] = cmd_args[cmd_with_max][1];
|
if (cmd_size[cmd_with_max] == 2) {
|
||||||
|
buffer[1] = cmd_args[cmd_with_max][1];
|
||||||
|
}
|
||||||
|
|
||||||
auto new_comp_piece = NewCompressionPiece(cmd_with_max, max_win, buffer,
|
auto new_comp_piece = NewCompressionPiece(cmd_with_max, max_win, buffer,
|
||||||
cmd_size[cmd_with_max]);
|
cmd_size[cmd_with_max]);
|
||||||
|
printf("Here");
|
||||||
|
PrintCompressionPiece(new_comp_piece);
|
||||||
// If we let non compressed stuff, we need to add a copy chuck before
|
// If we let non compressed stuff, we need to add a copy chuck before
|
||||||
if (bytes_since_last_compression != 0) {
|
if (bytes_since_last_compression != 0) {
|
||||||
std::string copy_buff;
|
std::string copy_buff;
|
||||||
@@ -367,6 +429,7 @@ absl::StatusOr<Bytes> ROM::Compress(const int start, const int length,
|
|||||||
ValidateForByteGain(data_size_taken, cmd_size, max_win, cmd_with_max);
|
ValidateForByteGain(data_size_taken, cmd_size, max_win, cmd_with_max);
|
||||||
|
|
||||||
if (cmd_with_max == kCommandDirectCopy) {
|
if (cmd_with_max == kCommandDirectCopy) {
|
||||||
|
printf("- Best command is copy\n");
|
||||||
// This is the worse case
|
// This is the worse case
|
||||||
CompressionDirectCopy(rom_data_.data(), compressed_chain, u_data_pos,
|
CompressionDirectCopy(rom_data_.data(), compressed_chain, u_data_pos,
|
||||||
bytes_since_last_compression, last_pos);
|
bytes_since_last_compression, last_pos);
|
||||||
@@ -384,7 +447,7 @@ absl::StatusOr<Bytes> ROM::Compress(const int start, const int length,
|
|||||||
// We don't call merge copy so we need more space
|
// We don't call merge copy so we need more space
|
||||||
auto tmp = (uchar*)malloc(length * 2);
|
auto tmp = (uchar*)malloc(length * 2);
|
||||||
auto compressed_size =
|
auto compressed_size =
|
||||||
CreateCompressionString(compressed_chain_start->next, tmp, mode);
|
CreateCompressionStringV2(compressed_chain_start->next, tmp, mode);
|
||||||
uint p;
|
uint p;
|
||||||
|
|
||||||
auto response = Decompress(0);
|
auto response = Decompress(0);
|
||||||
@@ -403,6 +466,14 @@ absl::StatusOr<Bytes> ROM::Compress(const int start, const int length,
|
|||||||
}
|
}
|
||||||
|
|
||||||
MergeCopy(compressed_chain_start->next); // First is a dumb place holder
|
MergeCopy(compressed_chain_start->next); // First is a dumb place holder
|
||||||
|
|
||||||
|
compressed_chain = compressed_chain_start->next;
|
||||||
|
while (compressed_chain != NULL) {
|
||||||
|
printf("--Piece--\n");
|
||||||
|
PrintCompressionPiece(compressed_chain);
|
||||||
|
compressed_chain = compressed_chain->next;
|
||||||
|
}
|
||||||
|
|
||||||
uchar temporary_string[length + 10];
|
uchar temporary_string[length + 10];
|
||||||
auto compressed_size = CreateCompressionString(compressed_chain_start->next,
|
auto compressed_size = CreateCompressionString(compressed_chain_start->next,
|
||||||
temporary_string, mode);
|
temporary_string, mode);
|
||||||
|
|||||||
Reference in New Issue
Block a user