162 lines
1.8 KiB
PHP
162 lines
1.8 KiB
PHP
; ByteBoozer Decruncher /HCL May.2003
|
|
; B2 Decruncher December 2014
|
|
|
|
; call: Y = AddrLo
|
|
; X = AddrHi
|
|
|
|
;Variables.. #Bytes
|
|
zp_base = $02 ; -
|
|
bits = zp_base ;1
|
|
put = zp_base+2 ;2
|
|
|
|
#macro GetNextBit() {.(
|
|
asl bits
|
|
bne DgEnd
|
|
jsr GetNewBits
|
|
DgEnd
|
|
.)}
|
|
|
|
#macro GetLen() {.(
|
|
lda #1
|
|
GlLoop
|
|
.GetNextBit()
|
|
bcc GlEnd
|
|
.GetNextBit()
|
|
rol
|
|
bpl GlLoop
|
|
GlEnd
|
|
.)}
|
|
|
|
Decrunch
|
|
sty Get1+1
|
|
sty Get2+1
|
|
sty Get3+1
|
|
stx Get1+2
|
|
stx Get2+2
|
|
stx Get3+2
|
|
|
|
ldx #0
|
|
jsr GetNewBits
|
|
sty put-1,x
|
|
cpx #2
|
|
bcc *-7
|
|
lda #$80
|
|
sta bits
|
|
DLoop
|
|
.GetNextBit()
|
|
bcs Match
|
|
Literal
|
|
; Literal run.. get length.
|
|
.GetLen()
|
|
sta LLen+1
|
|
|
|
ldy #0
|
|
LLoop
|
|
Get3 lda $feed,x
|
|
inx
|
|
bne *+5
|
|
jsr GnbInc
|
|
L1 sta (put),y
|
|
iny
|
|
LLen cpy #0
|
|
bne LLoop
|
|
|
|
clc
|
|
tya
|
|
adc put
|
|
sta put
|
|
bcc *+4
|
|
inc put+1
|
|
|
|
iny
|
|
beq DLoop
|
|
|
|
; Has to continue with a match..
|
|
|
|
Match
|
|
; Match.. get length.
|
|
.GetLen()
|
|
sta MLen+1
|
|
|
|
; Length 255 -> EOF
|
|
cmp #$ff
|
|
beq End
|
|
|
|
; Get num bits
|
|
cmp #2
|
|
lda #0
|
|
rol
|
|
.GetNextBit()
|
|
rol
|
|
.GetNextBit()
|
|
rol
|
|
tay
|
|
lda Tab,y
|
|
beq M8
|
|
|
|
; Get bits < 8
|
|
M_1 .GetNextBit()
|
|
rol
|
|
bcs M_1
|
|
bmi MShort
|
|
M8
|
|
; Get byte
|
|
eor #$ff
|
|
tay
|
|
Get2 lda $feed,x
|
|
inx
|
|
bne *+5
|
|
jsr GnbInc
|
|
jmp Mdone
|
|
MShort
|
|
ldy #$ff
|
|
Mdone
|
|
;clc
|
|
adc put
|
|
sta MLda+1
|
|
tya
|
|
adc put+1
|
|
sta MLda+2
|
|
|
|
ldy #$ff
|
|
MLoop iny
|
|
MLda lda $beef,y
|
|
sta (put),y
|
|
MLen cpy #0
|
|
bne MLoop
|
|
|
|
;sec
|
|
tya
|
|
adc put
|
|
sta put
|
|
bcc *+4
|
|
inc put+1
|
|
|
|
jmp DLoop
|
|
|
|
End rts
|
|
|
|
GetNewBits
|
|
Get1 ldy $feed,x
|
|
sty bits
|
|
rol bits
|
|
inx
|
|
bne GnbEnd
|
|
GnbInc inc Get1+2
|
|
inc Get2+2
|
|
inc Get3+2
|
|
GnbEnd
|
|
rts
|
|
|
|
Tab
|
|
; Short offsets
|
|
.byte %11011111 ; 3
|
|
.byte %11111011 ; 6
|
|
.byte %00000000 ; 8
|
|
.byte %10000000 ; 10
|
|
; Long offsets
|
|
.byte %11101111 ; 4
|
|
.byte %11111101 ; 7
|
|
.byte %10000000 ; 10
|
|
.byte %11110000 ; 13
|