; http://www.cpcrulez.2ya.com
;

;
;       SCROLLING HARD VERTICAL
;
;       (c)Pict / Logon system Mai 1993
;
;       Assemble avec DAMS
;
;       charge en banque #c4    (#4000)
;
        ORG #3000
;       ENT $
;
;       largeur en mots de l'ecran:
;
r1      EQU     32
;
;       Initialisation mode et texte
;
        LD a,1
        CALL #bc0e
        CALL #bb4e
;
;       Dessin de la matrice
;       des blocs
;       (6 blocs de 4 caracteres
;       de hauteur)
;
        LD b,6*4
        LD hl,tabchr
lpaff1  PUSH bc
        LD b,4

lpaff2
;
;       on affiche une ligne
;       de chaque bloc
;
        LD a, (hl)
        INC hl
        CALL #bb5a
        DJNZ lpaff2
        POP bc
;
;       on passe au debut de
;       la ligne suivante grace
;       aux codes de controle
;
        LD a,10
        CALL #bb5a
        LD a,13
        CALL #bb5a
        DJNZ lpaffl
;
;       On sauve les blocs
;
        LD b,24*8
        LD hl,#c000
        LD de , matrix
lcopy   PUSH bc
        LD bC,8
        LDIR
        LD bc,#800-8
        ADD hl,bc

         JP nC,nocarry
         LD bC,#c050
         ADD hl,bc
nocarry  POP bc
         DJNZ lcopy
;
;       Affiche le message
;       en bas de l'ecran
;
        XOR a
        CALL #bc0e
        LD h,15
        LD 1,2
        CALL #bb75
        LD hl,mess
        LD e,2
affmess
        LD a,e
        PUSH hl
        CALL #bb90
        POP hl
        INC e
        LD a, (hl)
        OR a
        JP z,messaff
        INC hl
        CALL #bb5a
        JP affmess
messaff
;       configure le format
;       de l'ecran
;
        LD bc,#bc01
        OUT (C),C
        LD BC,#BD00+r1
        OUT (C),C
        LD bc,#bc02
        OUT (c),c
        LD bC,#bd00+43
        OUT (c) ,c
;
;       On interrompt le
; firmware
;
        DI
        LD hl, (#38)
        LD (syst+1),hl
        LD hl,#c9fb
        LD (#38) ,hl
;
;       Passe en Banque #cO
;       qui est en fait une
;       partie de l'ecran.
;
        LD bc,#7fc0
        OUT (c) ,c

;       Efface l'ecran en #4000

        LD hl,#4000
        LD (hl),0
        PUSH hl
        POP de
        PUSH de
        POP bc
        INC de
        DEC bc
        LDIR
;
;       Change les couleurs
;       des encres
;
        LD      hl ,mess
        LD bC,#7f00+13
colorip OUT (c),c
        DEC hl
        LD a, (hl)
        OUT (c),a
        DEC c
        JP nz,colorlp
;
;       Boucle principale
;
BCLP DI
;
;       on attend la synchro Verticale

        LD      B,#F5
vs      IN      A, (C)
        RRA
        JP NC,vs
;
;       Aussitot apres,on configure
;       les registres pour la rupture
;
;       On affiche 256 lignes
        LD BC,#BC06
        OUT (C),C
        LD BC,#BD20
        OUT (C),C
        LD BC,#BC07
        OUT (C),C
        LD BC,#BD7F
        OUT (C),C
;
;       On passe en mode 1
;       et on initialise le
;       diviseur d'interruption
;
        LD BC,#7F9d
        EI
;
;       On met en noir l'encre 1
;       afin de cacher l'effet de
;       saccade creer par le decalage
;       de l'ecran
        LD      de,#0154
        OUT (c),c
        OUT (c) ,d
        OUT (c) ,e
;
;       Gestion Scroll Vertical
;
;       on envoie l'adresse Hard
;       de l'ecran aux registres
;       du CRTC
;
OFFSET LD HL,#1000
       LD BC,#BC0C
       OUT (C),C
       INC B
       OUT (C) ,H
       DEC b
       INC c
       OUT (C),C
       INC B
       OUT (C),L
;
;       On fait monter l'ecran
;       d'une ligne grace au
;       registre 5,et toutes
;       les 8 lignes,on change
;       l'adresse Hard de l'ecran
;
charup LD de,rl
VERTY LD A,8
speed SUB 1
      AND 7
      LD      (VERTY+1) ,A
      JP nZ,ver
      ADD HL,de
ver
;
;       On s'assure que l'adresse
;       hard de l'ecran scrollant
;       ne deborde pas
;
        LD c,a
        LD a,h
        AND %11
        OR #10
        LD h,a
        LD (OFFSET+1) ,HL
;
;       On envoie la valeur de
;       decalage au registre 5
;       du crtc
;
        LD a,c
xor1    XOR     0
        LD BC,#BC05
        OUT (C),C
        INC B
        OUT (C) ,A
;
;       on attend quelques lignes
;
        LD      bC,260
tempo
        DEC bc
        LD a,b
        OR c
        JP nz,tempo
;
;       puis on initialise
;       le reg 4 du CRTC
        LD      BC,#BCP4
        OUT (C),C
        LD BC,#BD1B
        OUT (C),C
;
;       ainsi que l'adresse
;       du second ecran
;
OFFSET2 LD HL,#3000
        LD BC,#BC0C
        OUT (C),C
        INC B
        OUT (C),H
        DEC b
        INC c
        OUT (C),C
        INC B
        OUT (C) ,L
;
;       Il faut alors
;       complementer le
;       registre 5
;
VERTICAL LD A, (VERTY+l)
         LD BC,#BC05
         OUT (C),C
         INC B
xor2     XOR     7
         OUT (C) ,A

;       puis on affiche
;       le 1er raster

        LD      bC,3
temp1   DEC     bc
        LD a,b
        OR c
        JP nz,temp1
        LD hl,raster1
        LD a,10
        LD bC,#7f01
        OUT (c) ,c
rastlp1 LD c, (hl)
        OUT (c),c
        INC hl
        LD e,12
tempr1
       DEC e
       JP nz,temprl
       NOP
       NOP
       DEC a
       JP nz,rastlpl
;
;       On a plus qu'a attendre
;
Nl HALT
N2 HALT
N3 HALT
N4 HALT
;
;       ...attendre encore...
;
        LD bC,324
temp2   DEC     bc
        LD a,b
        OR c
        JP nz,temp2
;
;       et afficher le 2nd raster
;
        LD hl,raster2
        LD a,10
        LD bC,#7f01
        OUT (c),c
rastlp2 LD c, (hl)
        OUT (c) ,c
        INC hl
LD e,12
tempr2
        DEC e
        JP nz,tempr2
        NOP
        NOP
        DEC a
        JP nz,rastlp2
N5      HALT
;
;       Passe en mode 0
        1
        LD bc,#7f8c
        OUT (c) ,c
;
;       Reconfigure les
;       registres du CRTC
;       pour le 2eme ecran
;
        LD BC,#BC04
        OUT (C),C
        LD BC,#BD07
        OUT (C) ,C
        LD BC,#BC07
        OUT (C) ,C
        LD BC,#BD05
        OUT (C),C
        LD BC,#BC06
        OUT (C),C
        LD BC,#BD05
        OUT (C),C
;
;       Gestion de l'affichage
;
;       les blocs font 32 lignes
;       de hauteur
;
ctmat LD a,#lf
        INC a
        AND #H
        LD (ctmat+l),a
        JP nZ,cnty
;
;       les caracteres font 8 blocs de hauteur
;
ctchr   LD   a,7
        INC  a
        AND  7
        LD   (ctchr+l) ,a
        JP   nz,chline
;
;       gestion du texte
;
ctxt    LD  hl,text
        LD  a, (hl)
        INC hl
        OR  a
        JP  nZ,charok
        LD  hl,text
        LD  a, (hl)
        INC hl


charok
        LD (ctxt+l) ,hl
        CP 32
        JP nz,nospace
;
;       si c'est un caractere
;       d'espacement,on affiche
;       des octets nuls (qui sont
;       en fait dans le 1er bloc)

        LD      hl,matrix
        LD (chline+l) ,hl
;
;       et on s'arrange pour qu'il
;       fasse 4 blocs de haut
;
        LD a,4
        LD (ctchr+l),a
        JP chline
;
;       sinon gn trouve quelle
;       matrice lui correspond
;       (on multiplie par 64,
;       ce qui est la taille
;       de la matrice d'un
; caractere)
;
nospace
        SUB 47
        LD h,0
        LD l,a
        ADD hl,hl
        ADD hl,hl
        ADD hl,hl
        ADD hl,hl
        ADD hl,hl
        ADD hl,hl
        LD de,tabchar
        ADD hl,de
        LD (chline+l) ,hl
;
;       on copie l'adresse de la
;       des blocs dans un buffer
;
chline LD hl,tabchar
       LD bC,matrix
       PUSH iy
       LD iy,buffer
       LD a,8
nline
      LD d, (hl)
      LD e,0
      EX de,hl
      ADD hl,bc
      EX de,hl
      INC hl
      LD (iy+1) ,d
      LD (iy+0) ,e
      INC iy
      INC iy
      DEC a
      JP nZ,nline
      POP iy
      LD (chline+l) ,hl
;
;       On descend sur llecran  .
;       d'une ligne pour compenser
;       l'effet de scrolling
;
cnty    LD      hl,#4000
        LD a,h
        ADD a,8
        LD h,3
        AND #38
        JP nZ,noca
        LD a,h
        SUB #40
        LD h,a
        LD a,l
        ADD a,rl*2
        LD l,a
        JP nC,noca
        INC h
        LD a,h
        AND 7
        JP nZ,noca
        LD a,h
        SUB 8
        LD h,a
noca
        LD (cnty+l) ,hl
;
;       on affiche une ligne de
;       chacun des blocs du
;       caractere grace a la pile
;       qui pointe sur le buffer
;       decrit plus haut
;
        EX de,hl
        DI
        LD (stack+l),sp
        LD sp,buffer
        LD a,8
mlp
        POP hl
        LDI
        LDI
        LDI
        LDI

        LDI
        LDI
        LDI
        LDI
        PUSH hl
        POP hl
        DEC a
        JP nz,mlp
stack   LD sp,0
;
;       Test de la barre espace
;
scan
        LD BC,#F40E
        OUT (C),C
        LD BC,#F6C0
        OUT (C) ,C
        XOR a
        OUT (c) ,a
        LD BC,#F792
        OUT (C),C
        DEC b
        LD C,#45
        OUT (C),C
        LD B,#F4
        IN A, (C)
        LD BC,#F782
        OUT (C),C
        DEC b
        LD C,#00
        OUT (C),C
        EI
        AND #80
        JP NZ,BCLP
;
;       Fin du programme:
;       on restaure les registres
;       du CRTC,les banques de
;       memoire et le systeme
;
sys
        DI
        LD bC,#7fc4
        LD de,#014b
        OUT (c),c
        OUT (c) ,d
        OUT (c) ,e
        LD BC,#BC04
        OUT (C),C
        INC B
        LD C,38
        OUT (C) ,C
        LD BC,#BC02
        OUT (C) ,C
        INC B
        LD C,46
        OUT (C),C
        LD BC,#BC01
        OUT (C),C
        INC B
        LD C,40
        OUT (C),C
        LD BC,#BC07
        OUT (C),C
        INC B
        LD C,30
        OUT (C) ,C
        LD bc,#bc06
        OUT (c),c
        INC b
        LD c,25
        OUT (c),c
syst    LD      HL,#0000
        LD (#38) ,hl
        EI
        RET

        ;
        ;       table des couleurs
        ;       du raster du haut
        ;

raster1
DEFB #44,#44
DEFB #55
DEFB #57
DEFB #5f,#5f
DEFB #53,#4b,#5b
DEFB #4b
;
        ;       table des couleurs
        ;       du raster du bas

raster2
        DEFB #43,#4b,#43
        DEFB #4a,#4a
        DEFB #4e
        DEFB #4c
        DEFB #5C,#5c
;
;       Table des couleurs
;       des encres
;
        DEFB #54,#4b,#44,#55
        DEFB #57,#5f,#53,#54
        DEFB #4b,#43,#4a,#4e
        DEFB #4c,#5c
;
;    Message du bas de l'ecran
;
mess
        DEFM Logon system


DEFB 0
;
;       Message scrollant
;
text    DEFM 100/
        DEFB 0

;       Matrices des blocs
;
tabchr
v       EQU     128
DEFB v,v,v,v
DEFB v,v,v,v
DEFB v,v,v,v
DEFB v,v,v,v
p       EQU     143
DEFB p,p,p,p
DEFB p,p,p,p
DEFB p,p,p,p
DEFB p,p,p,p
q   EQU     212
DEFB p,p,p,q
DEFB p,p,q,v
DEFB p,q,v,v
DEFB q,v,v,v
s   EQU     213
DEFB s,p,p,p
DEFB v,s,p,p
DEFB v,v,s,p
DEFB v,v,v,s
t   EQU     214
DEFB V,V,v,t
DEFB V,v,t,p
DEFB v,t,p,p
DEFB t,p,p,p
u   EQU     215
DEFB u,v,v,v
DEFB p,u,v,v
DEFB p,p,u,v
DEFB p,p,p,u
;
;       Matrices des caracteres
;
tabchar
;%      (Attention,on prend en
;       fait le code ASCII du
;       caractere "/"-slash~)
        ;
DEFB 0,4,1,5,0,0,4,0
DEFB 0,1,0,1,0,4,2,0
DEFB 0,3,1,2,4,2,0,0
DEFB 0,0,0,4,2,0,rend en
        ;       fait le code ASCII du
        ;       caractere "/"-slash-)
        ;
DEFB 0,4,1,5,0,0,4,0
DEFB 0,1,0,1,0,4,2,0
DEFB 0,3,1,2,4,2,0,0
DEFB 0,0,0,4,2,0,0,0
DEFB 0,0,4,2,4,1,5,0
DEFB 0,4,2,0,1,0,1,0
DEFB 0,2,0,0,3,1,2,0
DEFB 0,0,0,0,0,0,0,0
;0
DEFB 0,4,1,1,1,1,5,0
DEFB 0,1,1,0,0,1,1,0
DEFB 0,1,1,0,4,1,1,0
DEFB 0,1,1,4,2,1,1,0
DEFB 0,1,1,2,0,1,1,0
DEFB 0,1,1,0,0,1,1,0
DEFB 0,3,1,1,1,1,2,0
DEFB 0,0,0,0,0,0,0,0
;1
DEFB 0,0,4,1,1,0,0,0
DEFB 0,0,1,1,1,0,0,0
DEFB 0,0,0,1,1,0,0,0
DEFB 0,0,0,1,1,0,0,0
DEFB 0,0,0,1,1,0,0,0
DEFB 0,0,0,1,1,0,0,0
DEFB 0,1,1,1,1,1,1,0
DEFB 0,0,0,0,0,0,0,0
;espace
;
        ;       Buffer pour les blocs
matrix DEFS 64*24
;
        ;       buffer pour l'affichage
        ;       des lignes

buffer  DEFS 2*8,0
end