Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save blowfish64/b19e794114140bb372a79fa28afc4a3a to your computer and use it in GitHub Desktop.
Save blowfish64/b19e794114140bb372a79fa28afc4a3a to your computer and use it in GitHub Desktop.
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
// This offset is only for UDNL modules in kHn unpacked PSBBN 0.32...
// Adjust if needed
#define DATA_OFFSET 0x1720
int psbbn_ioprp_decompress(uint8_t *a1, uint8_t *a2)
{
uint32_t *v1;
int v2; // $t1
uint8_t *v3; // $t2
uint8_t *v4; // $t0
int v5; // $a1
int v6; // $a0
int v7; // $a1
int v8; // $a2
int v9; // $a1
int v10; // $a1
int v11; // $a2
int v12; // $a1
int v13; // $a1
int v14; // $a2
int v15; // $a1
int v16; // $a1
int v17; // $a1
int v18; // $a0
int v19; // $a2
int v20; // $a1
int v21; // $a0
int v22; // $a0
unsigned int v23; // $v1
uint8_t *v24; // $a1
int v25; // $v1
char v26; // $v0
uint8_t *v27; // $a1
char v28; // $v0
int v30; // [sp+0h] [-30h]
int v31; // [sp+4h] [-2Ch]
int v32; // [sp+4h] [-2Ch]
int v33; // [sp+4h] [-2Ch]
int v34; // [sp+4h] [-2Ch]
char v35; // [sp+Ch] [-24h]
int v36; // [sp+10h] [-20h]
uint8_t *v37; // [sp+14h] [-1Ch]
uint8_t *v38; // [sp+14h] [-1Ch]
uint8_t *v39; // [sp+14h] [-1Ch]
uint8_t *v40; // [sp+14h] [-1Ch]
unsigned int v41; // [sp+18h] [-18h]
uint8_t *v42; // [sp+20h] [-10h]
uint8_t *v43; // [sp+20h] [-10h]
uint8_t *v44; // [sp+20h] [-10h]
uint8_t *v45; // [sp+20h] [-10h]
uint8_t *v46; // [sp+24h] [-Ch]
uint8_t *v47; // [sp+28h] [-8h]
v1 = (uint32_t *)a1;
v2 = 0;
v30 = *v1;
v3 = &a2[v1[0] - v1[1]];
v41 = v1[1];
v4 = v3;
v42 = (uint8_t *)(v1 + 4);
v46 = (uint8_t *)(v1 + 4);
v37 = (uint8_t *)v1 + v1[2] + 16;
v47 = v37;
while ( 1 )
{
if ( !v2 )
{
v2 = 30;
v5 = *v42;
v6 = *v37;
v38 = v37 + 1;
v43 = v42 + 1;
v7 = v6 ^ v5;
if ( v47 == v43 )
v43 = v46;
v32 = v7 << 8;
v8 = *v43;
v9 = *v38;
v44 = v43 + 1;
v39 = v38 + 1;
v10 = v9 ^ v8;
if ( v47 == v44 )
v44 = v46;
v33 = (v32 | v10) << 8;
v11 = *v44;
v12 = *v39;
v45 = v44 + 1;
v40 = v39 + 1;
v13 = v12 ^ v11;
if ( v47 == v45 )
v45 = v46;
v34 = (v33 | v13) << 8;
v14 = *v45;
v15 = *v40;
v42 = v45 + 1;
v37 = v40 + 1;
v16 = v15 ^ v14;
if ( v47 == v42 )
v42 = v46;
v31 = v34 | v16;
v35 = 14 - (v31 & 3);
v36 = 0x3FFF >> (v31 & 3);
}
v17 = *v42;
v18 = *v37++;
++v42;
v19 = v18 ^ v17;
if ( v47 == v42 )
v42 = v46;
if ( v31 >= 0 )
{
*v4++ = v19;
}
else
{
v20 = *v42;
v21 = *v37++;
++v42;
v22 = v21 ^ v20;
if ( v47 == v42 )
v42 = v46;
v23 = (v19 << 8) | v22;
v24 = v4 - ((v23 & v36) + 1);
v25 = (v23 >> v35) + 2;
v26 = *v24;
v27 = v24 + 1;
for ( *v4++ = v26; v25; ++v4 )
{
--v25;
v28 = *v27++;
*v4 = v28;
}
}
--v2;
if ( v4 - v3 >= v41 )
break;
v31 *= 2;
}
return v30;
}
int main(int argc, char** argv)
{
if (argc != 3)
return 1;
FILE* infile = fopen(argv[1], "rb");
if (!infile)
return 2;
fseek(infile, 0, SEEK_END);
uint32_t cmp_sz = ftell(infile);
fseek(infile, DATA_OFFSET, SEEK_SET);
uint32_t unc_sz = 0;
size_t read_header_sz = fread(&unc_sz, 1, 4, infile);
if (read_header_sz != 4)
return 3;
fseek(infile, 0, SEEK_SET);
uint8_t *cmp_dat = malloc(cmp_sz);
if (!cmp_dat)
return 4;
uint8_t *unc_dat = malloc(unc_sz);
if (!unc_dat)
return 5;
size_t read_cmp_sz = fread(cmp_dat, 1, cmp_sz, infile);
if (read_cmp_sz != cmp_sz)
return 6;
fclose(infile);
psbbn_ioprp_decompress(cmp_dat + DATA_OFFSET, unc_dat);
FILE* outfile = fopen(argv[2], "wb");
if (!outfile)
return 7;
fwrite(unc_dat, 1, unc_sz, outfile);
fclose(outfile);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment