ZX1 I/O stream decompressor. (last update: 20/07/22)
CODE: xxl
ENTRY: destination adress store in ZX1_OUTPUT, ( no stream? source in ZX1_INPUT )
ZX1_OUTPUT equ ZP
copysrc equ ZP+2
mwa #packed_data ZX1_INPUT
mwa #destination ZX1_OUTPUT
jsr unZX1
unzx1
ldy #$ff
sty offsetL
sty offsetH
iny ; 0
sty lenL
sty lenH
lda #$80
dzx1_literals jsr dzx1_elias
pha
cop0 jsr GET_BYTE
ldy #$00
sta (ZX1_OUTPUT),y
inw ZX1_OUTPUT
lda #$ff
lenL equ *-1
bne @+
dec lenH
@ dec lenL
bne cop0
lda #$ff
lenH equ *-1
bne cop0
pla
asl @
bcs dzx1_new_offset
jsr dzx1_elias
dzx1_copy pha
lda ZX1_OUTPUT
clc
adc #$ff
offsetL equ *-1
sta copysrc
lda ZX1_OUTPUT+1
adc #$ff
offsetH equ *-1
sta copysrc+1
ldy #$00
ldx lenH
beq Remainder
Page lda (copysrc),y
sta (ZX1_OUTPUT),y
iny
bne Page
inc copysrc+1
inc ZX1_OUTPUT+1
dex
bne Page
Remainder ldx lenL
beq copyDone
copyByte lda (copysrc),y
sta (ZX1_OUTPUT),y
iny
dex
bne copyByte
tya
clc
adc ZX1_OUTPUT
sta ZX1_OUTPUT
bcc copyDone
inc ZX1_OUTPUT+1
copyDone stx lenH
stx lenL
pla
asl @
bcc dzx1_literals
dzx1_new_offset
ldx #$ff
stx offsetH
pha
jsr GET_BYTE
sta offsetL
ror offsetL
bcc dzx1_msb_skip
jsr GET_BYTE
sta offsetH
ror offsetH
inc offsetH
bne @+
pla
rts ; end
@ rol offsetL
dzx1_msb_skip pla
jsr dzx1_elias
inc lenL
bne @+
inc lenH
@ jmp dzx1_copy
dzx1_elias inc lenL
dzx1_elias_loop
asl @
bne dzx1_elias_skip
jsr GET_BYTE
sec
rol @
dzx1_elias_skip
bcs dzx1_elias_backtrack
rts
dzx1_elias_backtrack
asl @
rol lenL
rol lenH
jmp dzx1_elias_loop
Jeśli dane znajdują się w pamięci a nie w pliku należy wymienić odwołania:
jsr xBIOS_GET_BYTE na jsr GET_BYTE
GET_BYTE lda $ffff
ZX1_INPUT equ *-2
inw ZX1_INPUT
rts
zobacz:
https://github.com/einar-saukas/ZX1
