Unbelievable. This has even breathed life back into the legendary Nemesis. Simply wonderful to see you back here, man. Now if only we could get LOst back over here... [/wishful]
Jesus Christ. You're back!!! I've just posted your s2 colourized ending hack a while ago, thought you'll never came back. But you're back. Totally amazing! This beta truly has a strange power to bring all oldbies back. And yes, I wish LOst was back too.
dfljhaskgsdhdseugrfdhbjdn Its like encountering a legendary Pokemon. :D Well for me it is, I've never seen Nemesis before. D: And worse similie of the day.
Fuck you!!!! Worship ME!!!!!!!!!!! Yeah, because it uses the Sonic 1 driver - in the Wai beta, they use the Z80 driver, which, at the time, was still being worked on.
Ah that explains why the PSP Genesis emulator doesn't play any sound at all when I try to use WAI's BETA on it. It plays sound but doesn't show the graphics properley on drx's proto.... DJ
Hey, can I help too? I'm kinda skilled when it comes to find algorhythms. Where can I find more details on what is this new compression about? Graphics, I guess?
Here's the subroutine (I haven't really had a go at it, but it should be easy to write a decomperssor for it): Code (Text): ;---------------------------------------------------- ; Unknown compression format decompression routine ;---------------------------------------------------- UnknownDec: moveq #0,d0 move.w #$7FF,d4 moveq #0,d5 moveq #0,d6 move.w a3,d7 subq.w #1,d2 beq.w loc_1DCC subq.w #1,d2 beq.w loc_1D4E subq.w #1,d2 beq.w loc_1CD0 subq.w #1,d2 beq.w loc_1C52 subq.w #1,d2 beq.w loc_1BD6 subq.w #1,d2 beq.w loc_1B58 subq.w #1,d2 beq.w loc_1ADE loc_1A62: move.b (a0)+,d1 add.b d1,d1 bcs.s loc_1ADC movea.l a2,a6 add.b d1,d1 bcs.s loc_1A84 move.b (a1)+,d5 suba.l d5,a6 add.b d1,d1 bcc.s loc_1A78 move.b (a6)+,(a2)+ loc_1A78: move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_1ACC bra.w loc_1BD6 loc_1A84: 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_1A98 add.b d1,d1 bcs.s loc_1AAE bra.s loc_1AB0 loc_1A98: add.b d1,d1 bcc.s loc_1AAC moveq #0,d0 move.b (a1)+,d0 beq.s loc_1ABE subq.w #6,d0 bmi.s loc_1AC4 loc_1AA6: move.b (a6)+,(a2)+ dbf d0,loc_1AA6 loc_1AAC: move.b (a6)+,(a2)+ loc_1AAE: move.b (a6)+,(a2)+ loc_1AB0: move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_1AD4 bra.w loc_1DCC loc_1ABE: move.w #0,d0 rts loc_1AC4: move.w #$FFFF,d0 moveq #1,d2 rts loc_1ACC: move.w #1,d0 moveq #5,d2 rts loc_1AD4: move.w #1,d0 moveq #1,d2 rts loc_1ADC: move.b (a1)+,(a2)+ loc_1ADE: add.b d1,d1 bcs.s loc_1B56 movea.l a2,a6 add.b d1,d1 bcs.s loc_1AFE move.b (a1)+,d5 suba.l d5,a6 add.b d1,d1 bcc.s loc_1AF2 move.b (a6)+,(a2)+ loc_1AF2: move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_1B46 bra.w loc_1C52 loc_1AFE: 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_1B12 add.b d1,d1 bcs.s loc_1B28 bra.s loc_1B2A loc_1B12: add.b d1,d1 bcc.s loc_1B26 moveq #0,d0 move.b (a1)+,d0 beq.s loc_1B38 subq.w #6,d0 bmi.s loc_1B3E loc_1B20: move.b (a6)+,(a2)+ dbf d0,loc_1B20 loc_1B26: move.b (a6)+,(a2)+ loc_1B28: move.b (a6)+,(a2)+ loc_1B2A: move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_1B4E bra.w loc_1A62 loc_1B38: move.w #0,d0 rts loc_1B3E: move.w #$FFFF,d0 moveq #0,d2 rts loc_1B46: move.w #1,d0 moveq #4,d2 rts loc_1B4E: move.w #1,d0 moveq #0,d2 rts loc_1B56: move.b (a1)+,(a2)+ loc_1B58: add.b d1,d1 bcs.s loc_1BD4 movea.l a2,a6 add.b d1,d1 bcs.s loc_1B78 move.b (a1)+,d5 suba.l d5,a6 add.b d1,d1 bcc.s loc_1B6C move.b (a6)+,(a2)+ loc_1B6C: move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_1BC4 bra.w loc_1CD0 loc_1B78: 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_1B8E move.b (a0)+,d1 add.b d1,d1 bcs.s loc_1BA6 bra.s loc_1BA8 loc_1B8E: move.b (a0)+,d1 add.b d1,d1 bcc.s loc_1BA4 moveq #0,d0 move.b (a1)+,d0 beq.s loc_1BB6 subq.w #6,d0 bmi.s loc_1BBC loc_1B9E: move.b (a6)+,(a2)+ dbf d0,loc_1B9E loc_1BA4: move.b (a6)+,(a2)+ loc_1BA6: move.b (a6)+,(a2)+ loc_1BA8: move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_1BCC bra.w loc_1ADE loc_1BB6: move.w #0,d0 rts loc_1BBC: move.w #$FFFF,d0 moveq #7,d2 rts loc_1BC4: move.w #1,d0 moveq #3,d2 rts loc_1BCC: move.w #1,d0 moveq #7,d2 rts loc_1BD4: move.b (a1)+,(a2)+ loc_1BD6: . add.b d1,d1 bcs.s loc_1C50 movea.l a2,a6 add.b d1,d1 bcs.s loc_1BF6 move.b (a1)+,d5 suba.l d5,a6 add.b d1,d1 bcc.s loc_1BEA move.b (a6)+,(a2)+ loc_1BEA: move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_1C40 bra.w loc_1D4E loc_1BF6: 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_1C0C add.b d1,d1 bcs.s loc_1C22 bra.s loc_1C24 loc_1C0C: add.b d1,d1 bcc.s loc_1C20 moveq #0,d0 move.b (a1)+,d0 beq.s loc_1C32 subq.w #6,d0 bmi.s loc_1C38 loc_1C1A: move.b (a6)+,(a2)+ dbf d0,loc_1C1A loc_1C20: move.b (a6)+,(a2)+ loc_1C22: move.b (a6)+,(a2)+ loc_1C24: move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_1C48 bra.w loc_1B58 loc_1C32: move.w #0,d0 rts loc_1C38: move.w #$FFFF,d0 moveq #6,d2 rts loc_1C40: move.w #1,d0 moveq #2,d2 rts loc_1C48: move.w #1,d0 moveq #6,d2 rts loc_1C50: move.b (a1)+,(a2)+ loc_1C52: add.b d1,d1 bcs.s loc_1CCE movea.l a2,a6 add.b d1,d1 bcs.s loc_1C72 move.b (a1)+,d5 suba.l d5,a6 add.b d1,d1 bcc.s loc_1C66 move.b (a6)+,(a2)+ loc_1C66: move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_1CBE bra.w loc_1DCC loc_1C72: 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_1C8A add.b d1,d1 bcs.s loc_1CA0 bra.s loc_1CA2 loc_1C8A: add.b d1,d1 bcc.s loc_1C9E moveq #0,d0 move.b (a1)+,d0 beq.s loc_1CB0 subq.w #6,d0 bmi.s loc_1CB6 loc_1C98: move.b (a6)+,(a2)+ dbf d0,loc_1C98 loc_1C9E: move.b (a6)+,(a2)+ loc_1CA0: move.b (a6)+,(a2)+ loc_1CA2: move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_1CC6 bra.w loc_1BD6 loc_1CB0: move.w #0,d0 rts loc_1CB6: move.w #$FFFF,d0 moveq #5,d2 rts loc_1CBE: move.w #1,d0 moveq #1,d2 rts loc_1CC6: move.w #1,d0 moveq #5,d2 rts loc_1CCE: move.b (a1)+,(a2)+ loc_1CD0: add.b d1,d1 bcs.s loc_1D4C movea.l a2,a6 add.b d1,d1 bcs.s loc_1CF0 move.b (a1)+,d5 suba.l d5,a6 add.b d1,d1 bcc.s loc_1CE4 move.b (a6)+,(a2)+ loc_1CE4: move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_1D3C bra.w loc_1A62 loc_1CF0: 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_1D08 add.b d1,d1 bcs.s loc_1D1E bra.s loc_1D20 loc_1D08: add.b d1,d1 bcc.s loc_1D1C moveq #0,d0 move.b (a1)+,d0 beq.s loc_1D2E subq.w #6,d0 bmi.s loc_1D34 loc_1D16: move.b (a6)+,(a2)+ dbf d0,loc_1D16 loc_1D1C: move.b (a6)+,(a2)+ loc_1D1E: move.b (a6)+,(a2)+ loc_1D20: move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_1D44 bra.w loc_1C52 loc_1D2E: move.w #0,d0 rts loc_1D34: move.w #$FFFF,d0 moveq #4,d2 rts loc_1D3C: move.w #1,d0 moveq #8,d2 rts loc_1D44: move.w #1,d0 moveq #4,d2 rts loc_1D4C: move.b (a1)+,(a2)+ loc_1D4E: add.b d1,d1 bcs.s loc_1DCA movea.l a2,a6 add.b d1,d1 bcs.s loc_1D70 move.b (a0)+,d1 move.b (a1)+,d5 suba.l d5,a6 add.b d1,d1 bcc.s loc_1D64 move.b (a6)+,(a2)+ loc_1D64: move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_1DBA bra.w loc_1ADE loc_1D70: 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_1D86 add.b d1,d1 bcs.s loc_1D9C bra.s loc_1D9E loc_1D86: add.b d1,d1 bcc.s loc_1D9A moveq #0,d0 move.b (a1)+,d0 beq.s loc_1DAC subq.w #6,d0 bmi.s loc_1DB2 loc_1D94: move.b (a6)+,(a2)+ dbf d0,loc_1D94 loc_1D9A: move.b (a6)+,(a2)+ loc_1D9C: move.b (a6)+,(a2)+ loc_1D9E: move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_1DC2 bra.w loc_1CD0 loc_1DAC: move.w #0,d0 rts loc_1DB2: move.w #$FFFF,d0 moveq #3,d2 rts loc_1DBA: move.w #1,d0 moveq #7,d2 rts loc_1DC2: move.w #1,d0 moveq #3,d2 rts loc_1DCA: move.b (a1)+,(a2)+ loc_1DCC: add.b d1,d1 bcs.s loc_1E46 move.b (a0)+,d1 movea.l a2,a6 add.b d1,d1 bcs.s loc_1DEE move.b (a1)+,d5 suba.l d5,a6 add.b d1,d1 bcc.s loc_1DE2 move.b (a6)+,(a2)+ loc_1DE2: move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_1E36 bra.w loc_1B58 loc_1DEE: 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_1E02 add.b d1,d1 bcs.s loc_1E18 bra.s loc_1E1A loc_1E02: add.b d1,d1 bcc.s loc_1E16 moveq #0,d0 move.b (a1)+,d0 beq.s loc_1E28 subq.w #6,d0 bmi.s loc_1E2E loc_1E10: move.b (a6)+,(a2)+ dbf d0,loc_1E10 loc_1E16: move.b (a6)+,(a2)+ loc_1E18: move.b (a6)+,(a2)+ loc_1E1A: move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ move.b (a6)+,(a2)+ cmp.w a2,d7 bls.s loc_1E3E bra.w loc_1D4E loc_1E28: move.w #0,d0 rts loc_1E2E: move.w #$FFFF,d0 moveq #2,d2 rts loc_1E36: move.w #1,d0 moveq #6,d2 rts loc_1E3E: move.w #1,d0 moveq #2,d2 rts loc_1E46: move.b (a1)+,(a2)+ bra.w loc_1A62 ; End of function UnknownDec The code that calls it: Code (Text): moveq #0,d1 moveq #0,d2 move.w (a0)+,d0 lea (a0,d0.w),a1 lea ($FFFF0000).l,a2 lea ($FFFF8000).w,a3 loc_732C: bsr.w UnknownDec tst.w d0 bmi.s loc_732C Seems to be moduled or something. It seems pretty familiar for some reason... I'd make a decompressor/compressor, but it seems pretty pointless, since it's used for GHZ 128x128 mappings and only for that (all other mappings are uncompressed). Apparently they were trying out a new compression algorithm, but ended up scraping the idea. Edit: the a0 obviously holds the GHZ compressed 128x128 mappings address
Interesting. The compression format is LZ77 based, but the bit flags are split from the data. The archive starts at 0x000DD850, and has a two byte header indicating the size of the bitflag block. The archive has the following (extremely general) form: size (word) bitflags[size] data[?] The location of the bitflag block is loaded into A0, and the location of the data block is loaded into A1. This is probably an early implementation of Kozinski compression. It's obvious why they changed from this method. Splitting the bitflags and the data offers no advantages, adds the size of the header onto every archive, and introduces a maximum archive size due to the fixed length of the header. Anyway, a kozinski decompressor could be adapted to work for this archive without much difficulty. When I get home this afternoon I'll dig up my decompressor see about knocking up a modified version.
Yes, but why would they implement an early (as you suggested) version of Kosinski, when they already implemented the final version of it in Sonic 1?
I just want to say that this is exciting news and I will be willing to lend a hand in anyway I can...
They did? I don't recall Kozinski being used anywhere in Sonic 1. There doesn't seem to be anything in my notes, so if there is any data compressed using Kozinski in Sonic 1, I never found it.
Scratch that, Kozinski is indeed used in Sonic 1. I keep forgetting how horribly dated my guides are. I don't think we even had a compressor for Kozinski, or even used the name Kozinski, when I wrote those things. Anyway, on the spur of the moment, I just wrote a program to locate and decompress all potential kozinski archives within a rom, similar to the nemsrch program I wrote ages back. This one isn't quite as reliable yet (it gives a few false positives), but it does the job reasonably well. Anyone working on S3/S&K might find it useful. You can download it from http://www.bestsharing.com/files/ms0011831...ozsrch.rar.html