Having got my feet wet with LZSS, I read up on Kosinski, Saxman, and Comper's compression schemes, all of which were supported in my Captain PlaneEd tool. I then remembered my tool supported an addition compression, which it inherited from the original PlaneEd project: "Kid Chameleon". The format was cracked some time ago, and (de)compressors were made for it. Out of curiosity, I hunted down the original ASM decompressor in a Kid Chameleon disassembly. To my amazement, the decompressor looked identical to the ASM decompressor I'd seen in a Nick Arcade disassembly mere days ago. I used one of the Chameleon decompressors to decompress S2NA GHZ's chunks, and it worked. Kid Chameleon also used Enigma, and was developed by STI. This leads me to the question of if this compression was a fourth 'standard' compression offered by Sega themself, along with Nemesis, Engima, and Kosinski. Though, as MainMemory pointed out to me, this could also be STI's own in-house compression. You can find the decompressor labelled sub_13684 in the Kid Chameleon disassembly. A copy of it is below. It can be found in the Nick Arcade disassembly under the name UnknownDec. Spoiler Code (ASM): sub_13684: ; CODE XREF: Load_InGame:loc_11C10p ; SomeDecToVRAM+8p ... moveq #0,d0 move.w #$7FF,d4 moveq #0,d5 moveq #0,d6 move.w a3,d7 subq.w #1,d2 beq.w loc_13A24 subq.w #1,d2 beq.w loc_139A6 subq.w #1,d2 beq.w loc_13928 subq.w #1,d2 beq.w loc_138AA subq.w #1,d2 beq.w loc_1382E subq.w #1,d2 beq.w loc_137B0 subq.w #1,d2 beq.w loc_13736 SomDec_BitPos0: ; CODE XREF: sub_13684+108j ; sub_13684+2C0j ... move.b (a0)+,d1 add.b d1,d1 bcs.s SomDec_BP0_DrcCpy move.l a2,a6 add.b d1,d1 bcs.s SomDec_BP0_LongRef move.b (a1)+,d5 suba.l d5,a6 add.b d1,d1 bcc.s loc_136D0 move.b (a6)+,(a2)+ loc_136D0: ; CODE XREF: sub_13684+48j move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_13724 bra.w loc_1382E ; --------------------------------------------------------------------------- SomDec_BP0_LongRef: ; CODE XREF: sub_13684+40j lsl.w #3,d1 move.w d1,d6 and.w d4,d6 ; d4 = $7FF move.b (a1)+,d6 suba.l d6,a6 add.b d1,d1 bcs.s SomDec_BP0_LongRef_2or3 add.b d1,d1 bcs.s loc_13706 bra.s loc_13708 ; --------------------------------------------------------------------------- SomDec_BP0_LongRef_2or3: ; CODE XREF: sub_13684+64j add.b d1,d1 bcc.s SomDec_BP0_LongRef_2 moveq #0,d0 move.b (a1)+,d0 ; read amount of bytes beq.s loc_13716 subq.w #6,d0 bmi.s loc_1371C loc_136FE: ; CODE XREF: sub_13684+7Cj move.b (a6)+,(a2)+ dbf d0,loc_136FE SomDec_BP0_LongRef_2: ; CODE XREF: sub_13684+6Ej move.b (a6)+,(a2)+ loc_13706: ; CODE XREF: sub_13684+68j move.b (a6)+,(a2)+ loc_13708: ; CODE XREF: sub_13684+6Aj move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_1372C bra.w loc_13A24 ; --------------------------------------------------------------------------- loc_13716: ; CODE XREF: sub_13684+74j move.w #0,d0 rts ; --------------------------------------------------------------------------- loc_1371C: ; CODE XREF: sub_13684+78j move.w #$FFFF,d0 moveq #1,d2 rts ; --------------------------------------------------------------------------- loc_13724: ; CODE XREF: sub_13684+52j move.w #1,d0 moveq #5,d2 rts ; --------------------------------------------------------------------------- loc_1372C: ; CODE XREF: sub_13684+8Cj move.w #1,d0 moveq #1,d2 rts ; --------------------------------------------------------------------------- SomDec_BP0_DrcCpy: ; CODE XREF: sub_13684+3Aj move.b (a1)+,(a2)+ loc_13736: ; CODE XREF: sub_13684+32j ; sub_13684+186j ... add.b d1,d1 bcs.s loc_137AE move.l a2,a6 add.b d1,d1 bcs.s loc_13756 move.b (a1)+,d5 suba.l d5,a6 add.b d1,d1 bcc.s loc_1374A move.b (a6)+,(a2)+ loc_1374A: ; CODE XREF: sub_13684+C2j move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_1379E bra.w loc_138AA ; --------------------------------------------------------------------------- loc_13756: ; CODE XREF: sub_13684+BAj lsl.w #3,d1 move.w d1,d6 and.w d4,d6 move.b (a1)+,d6 suba.l d6,a6 add.b d1,d1 bcs.s loc_1376A add.b d1,d1 bcs.s loc_13780 bra.s loc_13782 ; --------------------------------------------------------------------------- loc_1376A: ; CODE XREF: sub_13684+DEj add.b d1,d1 bcc.s loc_1377E moveq #0,d0 move.b (a1)+,d0 beq.s loc_13790 subq.w #6,d0 bmi.s loc_13796 loc_13778: ; CODE XREF: sub_13684+F6j move.b (a6)+,(a2)+ dbf d0,loc_13778 loc_1377E: ; CODE XREF: sub_13684+E8j move.b (a6)+,(a2)+ loc_13780: ; CODE XREF: sub_13684+E2j move.b (a6)+,(a2)+ loc_13782: ; CODE XREF: sub_13684+E4j move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_137A6 bra.w SomDec_BitPos0 ; --------------------------------------------------------------------------- loc_13790: ; CODE XREF: sub_13684+EEj move.w #0,d0 rts ; --------------------------------------------------------------------------- loc_13796: ; CODE XREF: sub_13684+F2j move.w #$FFFF,d0 moveq #0,d2 rts ; --------------------------------------------------------------------------- loc_1379E: ; CODE XREF: sub_13684+CCj move.w #1,d0 moveq #4,d2 rts ; --------------------------------------------------------------------------- loc_137A6: ; CODE XREF: sub_13684+106j move.w #1,d0 moveq #0,d2 rts ; --------------------------------------------------------------------------- loc_137AE: ; CODE XREF: sub_13684+B4j move.b (a1)+,(a2)+ loc_137B0: ; CODE XREF: sub_13684+2Cj ; sub_13684+202j ... add.b d1,d1 bcs.s loc_1382C move.l a2,a6 add.b d1,d1 bcs.s loc_137D0 move.b (a1)+,d5 suba.l d5,a6 add.b d1,d1 bcc.s loc_137C4 move.b (a6)+,(a2)+ loc_137C4: ; CODE XREF: sub_13684+13Cj move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_1381C bra.w loc_13928 ; --------------------------------------------------------------------------- loc_137D0: ; CODE XREF: sub_13684+134j lsl.w #3,d1 move.w d1,d6 and.w d4,d6 move.b (a1)+,d6 suba.l d6,a6 add.b d1,d1 bcs.s loc_137E6 move.b (a0)+,d1 add.b d1,d1 bcs.s loc_137FE bra.s loc_13800 ; --------------------------------------------------------------------------- loc_137E6: ; CODE XREF: sub_13684+158j move.b (a0)+,d1 add.b d1,d1 bcc.s loc_137FC moveq #0,d0 move.b (a1)+,d0 beq.s loc_1380E subq.w #6,d0 bmi.s loc_13814 loc_137F6: ; CODE XREF: sub_13684+174j move.b (a6)+,(a2)+ dbf d0,loc_137F6 loc_137FC: ; CODE XREF: sub_13684+166j move.b (a6)+,(a2)+ loc_137FE: ; CODE XREF: sub_13684+15Ej move.b (a6)+,(a2)+ loc_13800: ; CODE XREF: sub_13684+160j move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_13824 bra.w loc_13736 ; --------------------------------------------------------------------------- loc_1380E: ; CODE XREF: sub_13684+16Cj move.w #0,d0 rts ; --------------------------------------------------------------------------- loc_13814: ; CODE XREF: sub_13684+170j move.w #$FFFF,d0 moveq #7,d2 rts ; --------------------------------------------------------------------------- loc_1381C: ; CODE XREF: sub_13684+146j move.w #1,d0 moveq #3,d2 rts ; --------------------------------------------------------------------------- loc_13824: ; CODE XREF: sub_13684+184j move.w #1,d0 moveq #7,d2 rts ; --------------------------------------------------------------------------- loc_1382C: ; CODE XREF: sub_13684+12Ej move.b (a1)+,(a2)+ loc_1382E: ; CODE XREF: sub_13684+26j ; sub_13684+54j ... add.b d1,d1 bcs.s loc_138A8 move.l a2,a6 add.b d1,d1 bcs.s loc_1384E move.b (a1)+,d5 suba.l d5,a6 add.b d1,d1 bcc.s loc_13842 move.b (a6)+,(a2)+ loc_13842: ; CODE XREF: sub_13684+1BAj move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_13898 bra.w loc_139A6 ; --------------------------------------------------------------------------- loc_1384E: ; CODE XREF: sub_13684+1B2j lsl.w #3,d1 move.b (a0)+,d1 move.w d1,d6 and.w d4,d6 move.b (a1)+,d6 suba.l d6,a6 add.b d1,d1 bcs.s loc_13864 add.b d1,d1 bcs.s loc_1387A bra.s loc_1387C ; --------------------------------------------------------------------------- loc_13864: ; CODE XREF: sub_13684+1D8j add.b d1,d1 bcc.s loc_13878 moveq #0,d0 move.b (a1)+,d0 beq.s loc_1388A subq.w #6,d0 bmi.s loc_13890 loc_13872: ; CODE XREF: sub_13684+1F0j move.b (a6)+,(a2)+ dbf d0,loc_13872 loc_13878: ; CODE XREF: sub_13684+1E2j move.b (a6)+,(a2)+ loc_1387A: ; CODE XREF: sub_13684+1DCj move.b (a6)+,(a2)+ loc_1387C: ; CODE XREF: sub_13684+1DEj move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_138A0 bra.w loc_137B0 ; --------------------------------------------------------------------------- loc_1388A: ; CODE XREF: sub_13684+1E8j move.w #0,d0 rts ; --------------------------------------------------------------------------- loc_13890: ; CODE XREF: sub_13684+1ECj move.w #$FFFF,d0 moveq #6,d2 rts ; --------------------------------------------------------------------------- loc_13898: ; CODE XREF: sub_13684+1C4j move.w #1,d0 moveq #2,d2 rts ; --------------------------------------------------------------------------- loc_138A0: ; CODE XREF: sub_13684+200j move.w #1,d0 moveq #6,d2 rts ; --------------------------------------------------------------------------- loc_138A8: ; CODE XREF: sub_13684+1ACj move.b (a1)+,(a2)+ loc_138AA: ; CODE XREF: sub_13684+20j ; sub_13684+CEj ... add.b d1,d1 bcs.s loc_13926 move.l a2,a6 add.b d1,d1 bcs.s loc_138CA move.b (a1)+,d5 suba.l d5,a6 add.b d1,d1 bcc.s loc_138BE move.b (a6)+,(a2)+ loc_138BE: ; CODE XREF: sub_13684+236j move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_13916 bra.w loc_13A24 ; --------------------------------------------------------------------------- loc_138CA: ; CODE XREF: sub_13684+22Ej lsl.w #2,d1 move.b (a0)+,d1 add.w d1,d1 move.w d1,d6 and.w d4,d6 move.b (a1)+,d6 suba.l d6,a6 add.b d1,d1 bcs.s loc_138E2 add.b d1,d1 bcs.s loc_138F8 bra.s loc_138FA ; --------------------------------------------------------------------------- loc_138E2: ; CODE XREF: sub_13684+256j add.b d1,d1 bcc.s loc_138F6 moveq #0,d0 move.b (a1)+,d0 beq.s loc_13908 subq.w #6,d0 bmi.s loc_1390E loc_138F0: ; CODE XREF: sub_13684+26Ej move.b (a6)+,(a2)+ dbf d0,loc_138F0 loc_138F6: ; CODE XREF: sub_13684+260j move.b (a6)+,(a2)+ loc_138F8: ; CODE XREF: sub_13684+25Aj move.b (a6)+,(a2)+ loc_138FA: ; CODE XREF: sub_13684+25Cj move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_1391E bra.w loc_1382E ; --------------------------------------------------------------------------- loc_13908: ; CODE XREF: sub_13684+266j move.w #0,d0 rts ; --------------------------------------------------------------------------- loc_1390E: ; CODE XREF: sub_13684+26Aj move.w #$FFFF,d0 moveq #5,d2 rts ; --------------------------------------------------------------------------- loc_13916: ; CODE XREF: sub_13684+240j move.w #1,d0 moveq #1,d2 rts ; --------------------------------------------------------------------------- loc_1391E: ; CODE XREF: sub_13684+27Ej move.w #1,d0 moveq #5,d2 rts ; --------------------------------------------------------------------------- loc_13926: ; CODE XREF: sub_13684+228j move.b (a1)+,(a2)+ loc_13928: ; CODE XREF: sub_13684+1Aj ; sub_13684+148j ... add.b d1,d1 bcs.s loc_139A4 move.l a2,a6 add.b d1,d1 bcs.s loc_13948 move.b (a1)+,d5 suba.l d5,a6 add.b d1,d1 bcc.s loc_1393C move.b (a6)+,(a2)+ loc_1393C: ; CODE XREF: sub_13684+2B4j move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_13994 bra.w SomDec_BitPos0 ; --------------------------------------------------------------------------- loc_13948: ; CODE XREF: sub_13684+2ACj add.w d1,d1 move.b (a0)+,d1 lsl.w #2,d1 move.w d1,d6 and.w d4,d6 move.b (a1)+,d6 suba.l d6,a6 add.b d1,d1 bcs.s loc_13960 add.b d1,d1 bcs.s loc_13976 bra.s loc_13978 ; --------------------------------------------------------------------------- loc_13960: ; CODE XREF: sub_13684+2D4j add.b d1,d1 bcc.s loc_13974 moveq #0,d0 move.b (a1)+,d0 beq.s loc_13986 subq.w #6,d0 bmi.s loc_1398C loc_1396E: ; CODE XREF: sub_13684+2ECj move.b (a6)+,(a2)+ dbf d0,loc_1396E loc_13974: ; CODE XREF: sub_13684+2DEj move.b (a6)+,(a2)+ loc_13976: ; CODE XREF: sub_13684+2D8j move.b (a6)+,(a2)+ loc_13978: ; CODE XREF: sub_13684+2DAj move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_1399C bra.w loc_138AA ; --------------------------------------------------------------------------- loc_13986: ; CODE XREF: sub_13684+2E4j move.w #0,d0 rts ; --------------------------------------------------------------------------- loc_1398C: ; CODE XREF: sub_13684+2E8j move.w #$FFFF,d0 moveq #4,d2 rts ; --------------------------------------------------------------------------- loc_13994: ; CODE XREF: sub_13684+2BEj move.w #1,d0 moveq #8,d2 rts ; --------------------------------------------------------------------------- loc_1399C: ; CODE XREF: sub_13684+2FCj move.w #1,d0 moveq #4,d2 rts ; --------------------------------------------------------------------------- loc_139A4: ; CODE XREF: sub_13684+2A6j move.b (a1)+,(a2)+ loc_139A6: ; CODE XREF: sub_13684+14j ; sub_13684+1C6j ... add.b d1,d1 bcs.s loc_13A22 move.l a2,a6 add.b d1,d1 bcs.s loc_139C8 move.b (a0)+,d1 move.b (a1)+,d5 suba.l d5,a6 add.b d1,d1 bcc.s loc_139BC move.b (a6)+,(a2)+ loc_139BC: ; CODE XREF: sub_13684+334j move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_13A12 bra.w loc_13736 ; --------------------------------------------------------------------------- loc_139C8: ; CODE XREF: sub_13684+32Aj move.b (a0)+,d1 lsl.w #3,d1 move.w d1,d6 and.w d4,d6 move.b (a1)+,d6 suba.l d6,a6 add.b d1,d1 bcs.s loc_139DE add.b d1,d1 bcs.s loc_139F4 bra.s loc_139F6 ; --------------------------------------------------------------------------- loc_139DE: ; CODE XREF: sub_13684+352j add.b d1,d1 bcc.s loc_139F2 moveq #0,d0 move.b (a1)+,d0 beq.s loc_13A04 subq.w #6,d0 bmi.s loc_13A0A loc_139EC: ; CODE XREF: sub_13684+36Aj move.b (a6)+,(a2)+ dbf d0,loc_139EC loc_139F2: ; CODE XREF: sub_13684+35Cj move.b (a6)+,(a2)+ loc_139F4: ; CODE XREF: sub_13684+356j move.b (a6)+,(a2)+ loc_139F6: ; CODE XREF: sub_13684+358j move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_13A1A bra.w loc_13928 ; --------------------------------------------------------------------------- loc_13A04: ; CODE XREF: sub_13684+362j move.w #0,d0 rts ; --------------------------------------------------------------------------- loc_13A0A: ; CODE XREF: sub_13684+366j move.w #$FFFF,d0 moveq #3,d2 rts ; --------------------------------------------------------------------------- loc_13A12: ; CODE XREF: sub_13684+33Ej move.w #1,d0 moveq #7,d2 rts ; --------------------------------------------------------------------------- loc_13A1A: ; CODE XREF: sub_13684+37Aj move.w #1,d0 moveq #3,d2 rts ; --------------------------------------------------------------------------- loc_13A22: ; CODE XREF: sub_13684+324j move.b (a1)+,(a2)+ loc_13A24: ; CODE XREF: sub_13684+Ej ; sub_13684+8Ej ... add.b d1,d1 bcs.s loc_13A9E move.b (a0)+,d1 move.l a2,a6 add.b d1,d1 bcs.s loc_13A46 move.b (a1)+,d5 suba.l d5,a6 add.b d1,d1 bcc.s loc_13A3A move.b (a6)+,(a2)+ loc_13A3A: ; CODE XREF: sub_13684+3B2j move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_13A8E bra.w loc_137B0 ; --------------------------------------------------------------------------- loc_13A46: ; CODE XREF: sub_13684+3AAj lsl.w #3,d1 move.w d1,d6 and.w d4,d6 move.b (a1)+,d6 suba.l d6,a6 add.b d1,d1 bcs.s loc_13A5A add.b d1,d1 bcs.s loc_13A70 bra.s loc_13A72 ; --------------------------------------------------------------------------- loc_13A5A: ; CODE XREF: sub_13684+3CEj add.b d1,d1 bcc.s loc_13A6E moveq #0,d0 move.b (a1)+,d0 beq.s loc_13A80 subq.w #6,d0 bmi.s loc_13A86 loc_13A68: ; CODE XREF: sub_13684+3E6j move.b (a6)+,(a2)+ dbf d0,loc_13A68 loc_13A6E: ; CODE XREF: sub_13684+3D8j move.b (a6)+,(a2)+ loc_13A70: ; CODE XREF: sub_13684+3D2j move.b (a6)+,(a2)+ loc_13A72: ; CODE XREF: sub_13684+3D4j move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_13A96 bra.w loc_139A6 ; --------------------------------------------------------------------------- loc_13A80: ; CODE XREF: sub_13684+3DEj move.w #0,d0 rts ; --------------------------------------------------------------------------- loc_13A86: ; CODE XREF: sub_13684+3E2j move.w #$FFFF,d0 moveq #2,d2 rts ; --------------------------------------------------------------------------- loc_13A8E: ; CODE XREF: sub_13684+3BCj move.w #1,d0 moveq #6,d2 rts ; --------------------------------------------------------------------------- loc_13A96: ; CODE XREF: sub_13684+3F6j move.w #1,d0 moveq #2,d2 rts ; --------------------------------------------------------------------------- loc_13A9E: ; CODE XREF: sub_13684+3A2j move.b (a1)+,(a2)+ bra.w SomDec_BitPos0 ; End of function sub_13684
That's good to know - I wondered about the "Unknown" compression in Sonic 2 NA, and why it was in the ROM for all of like, 2 things, and that does shed a small amount of light on at least what it is... Heaven knows why they felt the need to use a different compression for GHZ's blocks/Chunks in the first place, though. Good eye, spotting that though, I had no idea what that format was.
Given that GHZ was leftover from a previous point in development, it's possible that they intended to use this compression algorithm but then changed their minds. Or maybe they were just experimenting with it.
It's probably the latter. Maybe it could have been one of Sega Technical Institute's first coding exercises while collaborating with Sonic Team. As an interesting footnote, Kid Chameleon was released in America on May 28, 1992. That was around the time that the Sonic 2 Nick Arcade build was presumably assembled.
I'm still trying to figure the format out, but if I do, I'll see if I can make it part of FW-KENSC, like I did with Rocket.