RLE ASM ;Universalpacker
;Run Length Encoding
DB 7FH,7FH,'PACK',1
CP 3
JR C,MSG
CALL RLE
RET
MSG
CALL 0F003H
DB 23H,'AnfAdr EndAdr '
DB 'ZielAdr!',13,10,0
RET
FETCH ;Lesen von (HL++),
;Dateiende CY=1
PUSH HL
PUSH DE
LD DE,(0B784H)
OR A
SBC HL,DE
POP DE
POP HL
LD A,M
INC HL
CCF
RET
WRITE ;Schreiben nach (ARG3++)
PUSH HL
LD HL,(0B786H)
LD M,A
INC HL
LD (0B786H),HL
POP HL
RET
RLE
LD A,0A2H
CALL WRITE
LD A,L
CALL WRITE
LD A,H
CALL WRITE
EX DE,HL
OR A
SBC HL,DE
EX DE,HL
LD A,E
CALL WRITE
LD A,D
CALL WRITE
RLFF0 ;Header OK
LD B,2
RLFF
LD D,C
CALL FETCH
JR C,RLCLX
LD C,A
DJNZ RLFF
;Prefetch OK
LD IY,0
ADD IY,SP
RLE0 LD B,0
RLFA LD E,D
LD D,C
INC B
CALL FETCH
JR C,RLCL
LD C,A
CP D
JR NZ,RLNE
CP E
JR NZ,RLNE
;Alle 3 Bytes gleich
DEC B
JR Z,RLE1
;Stack L{nge B ausgeben
;mit Vorbyte B+127
CALL OUTSTK
LD SP,IY
RLE1
LD B,3
RLFB INC B
LD E,D
LD D,C
CALL FETCH
JR C,RLCL1
CP C
LD C,A
LD A,B
JR NZ,RLE4 ;ungleich
CP 130
JR C,RLFB
SUB 3
CALL WRITE
LD A,D
CALL WRITE
JR RLFF0
RLE4
SUB 4
CALL WRITE
LD A,D
CALL WRITE
LD B,1
JR RLFF
RLCL1 ;Ende, wenn alles gleich war
LD A,B
SUB 4
CALL WRITE
LD A,D
CALL WRITE
RET
RLCLX
LD A,B
CP 2
RET Z
JR RLCLX2
RLCL ;Ende, wenn alles ungleich war
LD A,E
PUSH AF
INC SP
LD A,B
CP 128
JR C,RLCL2
CALL OUTSTK
LD SP,IY
LD B,0
RLCL2 INC B
RLCLX2 PUSH DE
INC SP
CALL OUTSTK
LD SP,IY
RET
RLNE ;wenn ungleich
LD A,E
PUSH AF
INC SP ;PUSH A
LD A,B
CP 128
JR C,RLFA
CALL OUTSTK
LD SP,IY
JR RLE0
OUTSTK ;Ausgabe B Bytes auf Stack,
;vorher B+127
LD A,B
ADD 127
CALL WRITE
PUSH IY
OUTST1
DEC IY
LD A,(IY)
CALL WRITE
DJNZ OUTST1
POP IY
RET
;******************************
DB 7FH,7FH,'UNPACK',1
OR A
JR Z,MSGU
CALL RLD
RET Z
CALL 0F003H
DB 23H,'Fehler!',10,13,0
RET
MSGU
CALL 0F003H
DB 23H,'QuellAdr!',10,13,0
RET
READ
LD A,M
INC HL
RET
TAKE
LD (DE),A
INC DE
DEC IY
LD A,HY
OR LY ;Z=1:Ende
RET
RLD ;Run Length Decoding
CALL READ
CP 0A2H
RET NZ ;Falscher Head
CALL READ
LD E,A
CALL READ
LD D,A
CALL READ
LD LY,A
CALL READ
LD HY,A
RLD1 CALL READ
BIT 7,A
JR Z,RLD2
AND 7FH
INC A
LD B,A
RLD3 CALL READ
CALL TAKE
RET Z
DJNZ RLD3
JR RLD1
RLD2
ADD 3
LD B,A
CALL READ
LD C,A
RLD4 LD A,C
CALL TAKE
RET Z
DJNZ RLD4
JR RLD1
t
RLD4:m
RLD2:b
RLD3:W
RLD1:?
RLD:6
TAKE:3
CALL READ
LD C,A
RLD4 LD A,C
CALL TAKE
RET Z
DJNZ RLD4
JR RLD1
t
RLD4:m
RLD2:b
RLD3:W
RLD1:?
RLD:6
TAKE:3
Detected encoding: ASCII (7 bit) | 2
|