Add support for the dsk2rom tweak.
This commit is contained in:
parent
9378eadf71
commit
2e0a6f1a12
@ -1,4 +1,5 @@
|
|||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <iomanip>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@ -7,16 +8,21 @@ using data_type = unsigned char;
|
|||||||
class Uncompressor
|
class Uncompressor
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit Uncompressor(const std::vector<unsigned char>& inData)
|
explicit Uncompressor(const std::vector<unsigned char>& inData, bool dsk2rom_tweak = false)
|
||||||
: compressedData(inData)
|
: compressedData(inData)
|
||||||
{
|
{
|
||||||
std::vector<unsigned char> output;
|
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();
|
data_type first_byte = getByte();
|
||||||
output.push_back(first_byte);
|
output.push_back(first_byte);
|
||||||
dataPosition = 2;
|
dataPosition = dsk2rom_tweak ? 1 : 2;
|
||||||
|
|
||||||
while (dataPosition < inData.size())
|
while (dataPosition < inData.size())
|
||||||
{
|
{
|
||||||
@ -24,7 +30,7 @@ public:
|
|||||||
{
|
{
|
||||||
data_type length = getInterlacedEliasGamma() + 1;
|
data_type length = getInterlacedEliasGamma() + 1;
|
||||||
|
|
||||||
if (length == 255)
|
if (length == 255 || (dsk2rom_tweak && length == 0))
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -33,8 +39,10 @@ public:
|
|||||||
if (offset & 0x80)
|
if (offset & 0x80)
|
||||||
{
|
{
|
||||||
offset = offset & 0x7F;
|
offset = offset & 0x7F;
|
||||||
switch(q_value)
|
switch (q_value)
|
||||||
{
|
{
|
||||||
|
case 7:
|
||||||
|
offset = offset | (getBit() << 13);
|
||||||
case 6:
|
case 6:
|
||||||
offset = offset | (getBit() << 12);
|
offset = offset | (getBit() << 12);
|
||||||
case 5:
|
case 5:
|
||||||
@ -67,12 +75,20 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
for (unsigned char byte: output)
|
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:
|
private:
|
||||||
int dataPosition = 0;
|
int dataPosition = 0;
|
||||||
int varPosition = 0;
|
int varPosition = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user