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

RLE3ASM	;Standardpacker
;Run Length Encoding
;Header A2: Speicherabzug
;	3x: KC85/3-Bild
;	4x: KC85/4-Bild
;xx 90 yy es folgen yy gleiche Bytes
;90 00 das Byte 90h speziell einmal
 
ZB	EQU	90H
	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,3
RLFF	LD	C,D
	LD	D,E
	CALL	FETCH
	JR	C,RLCLX
	LD	E,A
	DJNZ	RLFF
RLNE	LD	A,C
	CALL	WRITE
	LD	A,C
	SUB	ZB
	CALL	Z,WRITE
RLFA	LD	B,C
	LD	C,D
	LD	D,E
	CALL	FETCH
	JR	C,RLCL
	LD	E,A
	CP	D
	JR	NZ,RLNE
	CP	C
	JR	NZ,RLNE
	CP	B
	JR	NZ,RLNE
	;Alle 4 Bytes gleich
	LD	A,ZB
	CALL	WRITE
	LD	B,2
RLE9
	CALL	FETCH
	JR	C,RLCL1
	CP	E
	JR	NZ,RLEE
	LD	A,B
	INC	B
	JR	NZ,RLE9
	CALL	WRITE
	JR	RLFF0	;Prefetch-3
RLEE
	LD	E,A
	LD	A,B	;Anzahl
	DEC	A
	CALL	WRITE
	LD	B,2
	JR	RLFF	;Prefetch-2
RLCL1	;Ende, wenn alles gleich war
	LD	A,B
	DEC	A
	JP	WRITE
RLCL
	LD	A,B
	CALL	WRITE
	LD	B,3
RLCLX	LD	A,C
	LD	C,D
	LD	D,E
	CALL	WRITE
	DJNZ	RLCLX
	RET
RLCLE	;Ende gleich
	LD	A,B
	CALL	WRITE
	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
	CP	ZB
	JR	Z,RLD2
	LD	C,A
	CALL	TAKE
	RET	Z
	JR	RLD1
RLD2
	CALL	READ
	OR	A	;Null?
	JR	Z,RLD3
	INC	A	;mind. noch 2
	LD	B,A	;Anzahl
	LD	A,C
	CALL	TAKE	;und 1
	RET	Z
RLD4	LD	A,C
	CALL	TAKE
	RET	Z
	DJNZ	RLD4
	JR	RLD1
RLD3
	LD	C,ZB
	LD	A,C
	CALL	TAKE
	RET	Z
	JR	RLD1
<
RLD3:3
RLD4:&
RLD2:
RLD1:
RLD:÷
TAKE:ô
RDJNZ	RLD4
	JR	RLD1
RLD3
	LD	C,ZB
	LD	A,C
	CALL	TAKE
	RET	Z
	JR	RLD1
<
RLD3:3
RLD4:&
RLD2:
RLD1:
RLD:÷
TAKE:ô
R
Detected encoding: ANSI (CP1252)4
Wrong umlauts? - Assume file is ANSI (CP1252) encoded