
|
AGE decrunch routine MS/RM, 00-00-00
; gedisassembleerd(?) door Michiel Spoor
; uitgezocht/wat verbeterd door Roderik Muit
ORG 0C000H
; ---- AGE-DECRUNCHER ----
; A - Page to put to
; HL - Start Address of DATA (PIC)
; D - Y-Offset
; E - X-Offset (moet even zijn)
; vB:
LD A,1 ; Page 0
LD DE,00H ; Coors (0,0)
LD HL,8800H ; Address of Pic
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
START:
SRL A
LD (PAGE),A
RR D
RR E
PUSH DE
LD B,(HL) ; lengte X * 2
INC HL
LD C,(HL) ; lengte Y
INC HL
LD A,(HL) ; lengte Y van eerste stuk (dat niet ge-XORd moet)
INC HL
EX AF,AF
PUSH BC
CALL FILBUF ; Vul buffer (DE, B, C gezet)
EXX
POP BC ; BC=lengtes, HL=VRAM-ad.
POP HL
DB 0FEH ; Sla EX AF,AF over
LOOP1: EX AF,AF
PUSH BC
LD A,(PAGE)
CALL SETVDP
LD DE,BUFF2
DLIJN1: EXX ; Haal volgende byte, zet in BUFF2 en OUT naar
CALL GETBYT ; VRAM
EXX
LD (DE),A
INC DE
OUT (98H),A
DJNZ DLIJN1
EI
LD C,80H ; VRAM-adres met 128 verhogen: volgende lijn
ADD HL,BC
POP BC
DEC C
RET Z
EX AF,AF
DEC A ; Zelfde methode als nog in eerste stuk
JP NZ,LOOP1
LOOP2: PUSH BC ; Tweede stuk:
LD A,(PAGE)
CALL SETVDP
LD DE,BUFF2
EX DE,HL ; DE=VRAM-adres
DLIJN2: EXX ; Doe zelfde, maar XOR nu met data van vorige
CALL GETBYT ; lijn
EXX
XOR (HL)
LD (HL),A
INC HL
OUT (98H),A
DJNZ DLIJN2
EI
EX DE,HL
LD C,80H
ADD HL,BC
POP BC
DEC C
JP NZ,LOOP2
RET
GETBYT: XOR A
SLA B ; Volgende byte uit geheugen in A,
JR NC,SKIP1 ; of 0 als bitje=0
LD A,(HL)
INC HL
SKIP1: DEC C
RET NZ
PUSH AF ; Einde buffer?
LD A,E
CP BUFF2 AND 0FFH
JR NZ,J1
DB 0FEH ; Sla PUSH over
FILBUF: PUSH AF ; Vul buffer opnieuw
LD C,(HL)
INC HL
LD DE,BUFFER
LD B,8
DJRT1: XOR A
SLA C
JR NC,SKOP
LD A,(HL)
INC HL
SKOP: LD (DE),A
INC DE
DJNZ DJRT1
LD DE,BUFFER
J1: LD A,(DE) ; Volgende byte uit buffer
LD B,A
INC DE
LD C,8
POP AF
RET
SETVDP: DI
LD C,H
RL C
RLA
RL C
RLA
OUT (99H),A
LD A,8EH
OUT (99H),A
LD A,L
OUT (99H),A
LD A,H
AND 127
OR 64
OUT (99H),A
RET
PAGE: DB 0 ; page van 64K
BUFFER: DS 8 ; Buffer voor statusbytes
BUFF2: DB 0 ; Hier wordt plaatje ook in RAM opgeslagen
|