-
-
Save ssrb/c37366b515519f980b2f68cab9a7bdde to your computer and use it in GitHub Desktop.
SOTA $52000
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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