Source file: /~heha/hs/kcemu/kcswberg.zip/DISK/RLE.ASM

RLEASM	;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