Add support for the dsk2rom tweak.

This commit is contained in:
Sylvain Glaize 2024-02-21 22:43:31 +01:00
parent 9378eadf71
commit 2e0a6f1a12

View File

@ -1,4 +1,5 @@
#include <fstream>
#include <iomanip>
#include <iostream>
#include <vector>
@ -7,16 +8,21 @@ using data_type = unsigned char;
class Uncompressor
{
public:
explicit Uncompressor(const std::vector<unsigned char>& inData)
explicit Uncompressor(const std::vector<unsigned char>& inData, bool dsk2rom_tweak = false)
: compressedData(inData)
{
std::vector<unsigned char> output;
int q_value = (getBit() << 2 | getBit() << 1 | getBit()) + 1;
// The dsk2rom version has a fixed value of 2 for q_value and doesn't read it from the compressed variable stream
int q_value = 2;
if (!dsk2rom_tweak)
{
q_value = (getBit() << 2 | getBit() << 1 | getBit()) + 1;
}
data_type first_byte = getByte();
output.push_back(first_byte);
dataPosition = 2;
dataPosition = dsk2rom_tweak ? 1 : 2;
while (dataPosition < inData.size())
{
@ -24,7 +30,7 @@ public:
{
data_type length = getInterlacedEliasGamma() + 1;
if (length == 255)
if (length == 255 || (dsk2rom_tweak && length == 0))
{
break;
}
@ -35,6 +41,8 @@ public:
offset = offset & 0x7F;
switch (q_value)
{
case 7:
offset = offset | (getBit() << 13);
case 6:
offset = offset | (getBit() << 12);
case 5:
@ -67,12 +75,20 @@ public:
}
}
int count = 0;
for (unsigned char byte: output)
{
std::cout << byte;
std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(byte) << " ";
if (++count % 30 == 0)
{
std::cout << std::endl;
}
}
std::cout << std::endl;
std::cout << "Output size: " << output.size() << std::endl;
}
private:
int dataPosition = 0;
int varPosition = 0;