; http://www.cpcrulez.fr
;
;
; Source pour MAXAM ? et l'assembleur de WinAPE par hERMOL
;

        org  10000


Start:
        call CPCplusUnlock         ;
                                   ;
        ld   bc,&7fb8              ; l'ASIC -> &4000-&7fff
        out  (c),c                 ;
                                   ;
        call fadein                ; routine
                                   ;
        ld bc,&7fa0                ; ferme l'axc a l'ASIC
        out (c),c                  ;
        ret                        ; FINISH

fadein:
         ld   hl,&6400             ; copie les couleurs ->
         ld   de,paletteINIT       ; le buffer de travail
         ld   bc,&20               ; 16 + le border
         ldir                      ;
                                   ;
         ld   b,16                 ; travail avec les 16 teintes
                                   ;
okaich:  push bc                   ;
                                   ;
         ld   b,16                 ; travail avec les 15 couleurs + le border
         ld   hl,paletteINIT       ;

loopall: xor  a                    ; le bas
         cp   (hl)                 ; poids ford + poids faible
         jr   z,deja0              ; a 0 ?

         ld   a,(hl)               ; non, alors isole
         and  %00001111            ; les 4 bits droit
         cp   0                    ;
         jr   z,deja01             ; a 0 ?

         dec  a                    ; -1
         ld   c,a                  ;

deja01:  ld   a,(hl)               ; le haut (4 bits de gauche)
         and  %11110000            ;
         cp   0                    ; a 0 ?
         jr   z,deja02             ; oui ...

         rra                       ; non,
         rra                       ; rotation de 4 bits
         rra                       ; vers la droite
         rra                       ; (thx to Targhan & Offset)

         dec  a                    ; -1

         rla                       ; rotation de 4 bits
         rla                       ; vers la gauche
         rla                       ;
         rla                       ;

deja02:  add  a,c                  ; poids fort + poids faible
         ld   (hl),a               ; pose la modif

         xor  a                    ; a = 0

deja0:   inc  hl                   ; 2 eme octet de couleur
         cp   (hl)                 ;
         jr   z,deja1              ; a 0 ?
                                   ;
         ld   a,(hl)               ; non
         dec  a                    ; -1
         ld   (hl),a               ; pose la modif
                                   ;
         xor  a                    ; a = 0
                                   ;
deja1:   inc  hl                   ; prochaine couleur
                                   ;
         djnz loopall              ; loop si b>0
                                   ;
         push hl                   ;
         push bc                   ;
                                   ;
         ld   hl,paletteINIT       ; modif la palette
         call FixPalette           ;
                                   ;
         pop  bc                   ;
         pop  hl                   ;
                                   ;
frame:   LD   B,#F5                ; call &bd19
         IN   A,(C)                ;
         RRA                       ;
         JR   NC,frame             ;
                                   ;
         pop  bc                   ;
                                   ;
         djnz okaich               ; loop si b>0
                                   ;
         ret                       ; finish


;;;;; HL = palette datas
FixPalette:
         di                        ;
         push hl                   ;
         ld de,&6420               ; le border = ink 0,x
         ld bc,2                   ;
         ldir                      ;
                                   ;
         pop hl                    ;
         ld de,&6400               ; les 15 encres
         ld bc,15*2                ;
         ldir                      ;
         ei                        ;
         ret                       ; return

;;; Datas
paletteINIT dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

;;; CPC Plus - debloque l'ASIC
CPCplusUnlock:
         di
         ld b,&BC
         ld hl,sequence
         ld e,17
SeqLoop: ld a,(hl)
         out (c),a
         inc hl
         dec e
         jr nz,SeqLoop
         ei
         ret

Sequence    db &FF,&00,&FF,&77,&B3,&51,&A8,&D4,&62,&39,&9C,&46,&2B
            db &15,&8A,&CD,&EE