Skip to content

Instantly share code, notes, and snippets.

@ssrb
Last active May 25, 2018 04:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ssrb/c37366b515519f980b2f68cab9a7bdde to your computer and use it in GitHub Desktop.
Save ssrb/c37366b515519f980b2f68cab9a7bdde to your computer and use it in GitHub Desktop.
SOTA $52000
//ROM:0005201E movea.l ($7C).w,a3
//ROM:00052022 adda.l #$20000,a3
const char *src = *((const char *)0x7C) + 0x20000
//ROM:00052028 lea ($6CB10).l,a0
char *dst = 0x6CB10
//ROM:0005202E bsr.w sub_5273
decrunch(src, dst);
// ROM:0005273E sub_5273E:
void decrunch(const char *src /*a3*/, char *dst /*a0*/) {
// ROM:0005273E lea $C(a3),a5
const uint32_t *srcstart = (const uint32_t *)(src + 0xC);
// ROM:00052742 movea.l a0,a4
uint32_t *dststart = (uint32_t *)dst;
// ROM:00052744 adda.l 8(a3),a5
size_t srclen = *(const uint32_t *)(src + 0x8);
const uint32_t *srccurr = srcstart + srclen;
// ROM:00052748 adda.l 4(a3),a0
size_t dstlen = *(const uint32_t *)(src + 0x4);
char *dstcurr = dststart + dstlen;
// ROM:0005274C moveq #$7F,d3
// ROM:0005274E moveq #0,d4
// ROM:00052750 moveq #3,d5
// ROM:00052752 moveq #7,d6
// ROM:00052754 move.b 3(a3),d4
// ROM:00052758 move.l -(a5),d7
uint32_t data = *(--srccurr);
// ROM:0005275A loc_5275A:
do {
// ROM:0005275A moveq #0,d2
int idx = 0;
// ROM:0005275C lsr.l #1,d7
uint32_t cflag = data & 1;
uint32_t xflag = cflag;
data >>= 1;
// ROM:0005275E bne.s loc_52764
if (data == 0) {
// ROM:00052760 move.l -(a5),d7
data = *(--srccurr);
// ROM:00052762 roxr.l #1,d7
cflag = data & 1;
data >>= 1;
data |= xflag << 31;
xflag = cflag;
}
// ROM:00052764 loc_52764:
// ROM:00052764 bcc.s loc_52788
if (cflag) {
uint8_t idx2 = 0;
// ROM:00052766 loc_52766:
do {
// ROM:00052766 move.w d5,d1
// ROM:00052768 bsr.s sub_527D0
idx2 = sub_527D0(3);
// ROM:0005276A add.l d0,d2
idx += idx2;
// ROM:0005276C cmp.w d6,d0
// ROM:0005276E beq.s loc_52766
} while (idx2 == 7);
// ROM:00052770 loc_52770:
do {
//ROM:00052770 move.w d6,d1
int cnt = 7;
// ROM:00052772 loc_52772:
do {
// ROM:00052772 lsr.l #1,d7
cflag = data & 1;
xflag = cflag;
data >>= 1;
// ROM:00052774 bne.s loc_5277A
if (data == 0) {
// ROM:00052776 move.l -(a5),d7
data = *(--srccurr);
// ROM:00052778 roxr.l #1,d7
cflag = data & 1;
data >>= 1;
data |= xflag << 31;
xflag = cflag;
}
// ROM:0005277A loc_5277A:
// ROM:0005277A roxr.b #1,d0
cflag = idx2 & 1;
idx2 >> 1;
idx2 |= xflag << 7;
xflag = cflag;
// ROM:0005277C dbf d1,loc_52772
} while (--cnt != -1);
// ROM:00052780 move.b d0,-(a0)
*dstcurr = idx2;
--dstcurr;
idx -= 1;
// ROM:00052782 subq.l #1,d2
// ROM:00052784 bne.s loc_52770
} while (idx != 0);
// ROM:00052786 bra.s loc_527CA
} else {
int idx2 = 0;
// ROM:00052788 loc_52788:
// ROM:00052788 moveq #1,d1
// ROM:0005278A bsr.s sub_527D2
// ROM:0005278C moveq #0,d1
// ROM:0005278E move.l d0,d2
idx = sub_527D2(1);
// ROM:00052790 move.b (a3,d0.w),d1
char val = src[idx & 0xF];
// ROM:00052794 cmp.w d5,d0
// ROM:00052796 bne.s loc_527BE
if (idx == 3) {
// ROM:00052798 lsr.l #1,d7
cflag = data & 1;
xflag = cflag;
data >>= 1;
// ROM:0005279A bne.s loc_527A0
if (data == 0) {
// ROM:0005279C move.l -(a5),d7
data = *(--srccurr);
// ROM:0005279E roxr.l #1,d7
cflag = data & 1;
data >>= 1;
data |= xflag << 31;
xflag = cflag;
}
// ROM:000527A0 loc_527A0:
// ROM:000527A0 bcs.s loc_527B2
if (!cflag) {
// ROM:000527A2 loc_527A2:
do {
// ROM:000527A2 move.w d6,d1
// ROM:000527A4 bsr.s sub_527D0
idx2 = sub_527D0(7);
// ROM:000527A6 add.l d0,d2
idx += idx2;
// ROM:000527A8 cmp.w d3,d0
// ROM:000527AA beq.s loc_527A2
} while (idx2 == 0x7F);
// ROM:000527AC add.l d6,d2
// ROM:000527AE add.l d6,d2
idx += 2 * 7;
// ROM:000527B0 bra.s loc_527BC
} else {
// ROM:000527B2 loc_527B2:
do {
// ROM:000527B2 move.w d5,d1
// ROM:000527B4 bsr.s sub_527D0
idx2 = sub_527D0(3);
// ROM:000527B6 add.l d0,d2
idx += idx2;
// ROM:000527B8 cmp.w d6,d0
// ROM:000527BA beq.s loc_527B2
} while (idx2 == 7);
}
// ROM:000527BC loc_527BC:
// ROM:000527BC move.w d4,d1
val = src[3];
} // if (idx = c)
// ROM:000527BE loc_527BE:
// ROM:000527BE addq.l #1,d2
idx += 1;
// ROM:000527C0 bsr.s sub_527D2
int idx3 = sub_527D2(val);
// ROM:000527C2 loc_527C2:
do {
// ROM:000527C2 move.b (a0,d0.w),-(a0)
*dstcurr = dstcurr[idx3];
--dstcurr;
// ROM:000527C6 subq.l #1,d2
idx -= 1;
// ROM:000527C8 bpl.s loc_527C2
} while (idx > 0);
}
// ROM:000527CA loc_527CA:
// ROM:000527CA cmpa.l a0,a4
// ROM:000527CC bcs.s loc_5275A
} while (dstcurr >= dststart);
// ROM:000527CE rt
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment