RLE3 ASM ;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
|
|