; 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


DS    8               ; Buffer voor statusbytes
BUFF2:  DB    0               ; Hier wordt plaatje ook in R