ARJ4 decompressor. (last update: 20/10/21)
CODE: Konop, Rastan, xxl
ENTRY:
mwa #packed_data ARJ4_INPUT
mwa #destination ARJ4_OUTPUT
mwa #Length ARJ4_LENGTH
jsr unARJ4
packed_data ins 'conan.arj4',8,.FILESIZE 'conan.arj4'-8
destination equ $A150
ARJ4_INPUT equ $80
ARJ4_OUTPUT equ $82
copysrc equ $84
bitcount equ $86
bitbuf equ $87
ARJ4_LENGTH equ $88
lenL equ $8A
offs equ $8B ;2
temp equ $8D
unARJ4 ldy #$00 ; przez cala procke = 0
lda #$80
sta bitcount
countLoop lda ARJ4_LENGTH
ora ARJ4_LENGTH+1
bne cont
rts ; koniec
cont jsr getBit
bcs startSld
ldx #$08
jsr getBits ; pobierz bajt
lda offs
jsr PUT_BYTE
bcc countLoop ; zawsze
startSld jsr getLengthBits ; mamy w C bit
lda offs
sec ; +1
adc lenL
sta lenL
inc lenL ; +1 w sumie +2
jsr getOffsBits ; offset
lda offs+1
adc temp ; c=0
sta offs+1
lda ARJ4_OUTPUT
sbc offs ; c=0 -1
sta copysrc
lda ARJ4_OUTPUT+1
sbc offs+1
sta copysrc+1
copyLoop jsr copy
dec lenL
bne copyLoop
beq countLoop
getLengthBits
ldx #$06 ; 7 bitow, pierwszy juz jest
lda #$01 ; pierwsze C
sta lenL
getLBLoop jsr getBit
bcc correctL
rol lenL
dex
bne getLBLoop
correctL lda #$07+1
bcc setOffs ; C=1
getOffsBits ldx #$03
sty temp
getOBLoop jsr getBit
bcc correctO
rol temp
dex
bne getOBLoop
jsr getBit
correctO rol temp ; max 4 bity hi
lda #$0c+1 ;c=0
setOffs stx offs
sbc offs
tax
getBits sty offs
sty offs+1
getbLoop jsr getBit
rol offs
rol offs+1
dex
bne getbLoop
rts
getbit asl bitcount
bne @+
rol bitcount ; c=1 wiec ustawi najmlodszy bit
GET_BYTE lda (ARJ4_INPUT),y
inw ARJ4_INPUT
sta bitbuf
@ asl bitbuf
rts
copy lda (copysrc),y
inw copysrc
PUT_BYTE sta (ARJ4_OUTPUT),y
inw ARJ4_OUTPUT
dew ARJ4_LENGTH
rts
zobacz: http://onorisoft.free.fr/jag/bjlpak.zip
arjbeta.exe a -m4 conan.arj conan.gfx
dumparj conan.arj conan.gfx conan.arj4
