; http://www.cpcrulez.fr
;

         ORG  #a000
;        ENT  $
;
;rasters (c) 1990 Pour Noix De Croco No 5... Par DUFFY
;
;attention, revenir sous basic pour faire le CALL &A000 et presser la petite
;touche ENTER pour executer car si sous basic ou sous dams, vous pressez
;la grosse touche ENTER (ou RETURN), vous aurrez pas le temps de voir....
;
init                                    ;met les rasters sous interruption
         CALL #bd19                     ;pause pour pression de touche
         CALL #bd19
         CALL #bd19
         DI
         LD   hl,(#39)
         LD   (saut+1),hl               ;met l'adresse de la routine a la
         LD   hl,tub                    ;place du RST #38 qui est appele tous
         LD   (#39),hl                  ;les 300e de seconde
         EI                             ;(le balayage ecran se fait tous le 50e
bcl                                     ;attente de touche
         EI
         HALT                           ;attend proch'interruption (les rasters
         DI
;
clav                                    ;ENTER/RETURN presse
         PUSH AF
         PUSH BC
         PUSH HL
         LD   HL,stock
         LD   BC,#F40E
         OUT  (C),C
         LD   B,#F6
         IN   A,(C)
         AND  #30
         LD   C,A
         OR   #C0
         OUT  (C),A
         OUT  (C),C
         INC  B
         LD   A,#92
         OUT  (C),A
         PUSH BC
         SET  6,C
clavlp   LD   B,#F6
         OUT  (C),C
         LD   B,#F4
         IN   A,(C)
         LD   (HL),A
         INC  HL
         INC  C
         LD   A,C
         AND  #0F
         CP   #0A
         JR   NZ,clavlp
         POP  BC
         LD   A,#82
         OUT  (C),A
         DEC  B
         OUT  (C),C
         POP  HL
         POP  BC
         POP  AF
;
         LD   a,(stock+2)
         CP   #ff
         JP   z,bcl                     ;si pas presse, continu rasters
         JP   denit                     ;sinon fin
;
stock    DEFS 9,0
denit
         DI                             ;enleve la routine du rst #38
         LD   hl,(saut+1)               ;et remet ancienne adresse
         LD   (#39),hl
         EI
         RET                            ;retour basic
;
adrtub1  DEFW tbtub1                    ;pointe sur le tube couleur rouge
adrtub2  DEFW tbtub2                    ;couleur bleue
adrtub3  DEFW tbtub3                    ;en changeant les numeros, on
adrtub4  DEFW tbtub4                    ;change les couleurs de chaque tube
adrtub5  DEFW tbtub2
adrtub6  DEFW tbtub5
adrtub7  DEFW tbtub5
adrtub8  DEFW tbtub2
adrtub9  DEFW tbtub4
adrtub10 DEFW tbtub3
adrtub11 DEFW tbtub2
adrtub12 DEFW tbtub1
;
notub1   DEFB 0                         ;tube No 1 -> Locate vertical a 0
cotub1   DEFB 0                         ;sens (0=descend, 1=monte)
notub2   DEFB 10                        ;locate sur hauter ecran
cotub2   DEFB 0                         ;descend
notub3   DEFB 20
cotub3   DEFB 0
notub4   DEFB 30
cotub4   DEFB 0
notub5   DEFB 40
cotub5   DEFB 0
notub6   DEFB 50
cotub6   DEFB 0
notub7   DEFB 60
cotub7   DEFB 0
notub8   DEFB 70
cotub8   DEFB 0
notub9   DEFB 80
cotub9   DEFB 0
notub10  DEFB 90
cotub10  DEFB 0
notub11  DEFB 100
cotub11  DEFB 0
notub12  DEFB 110
cotub12  DEFB 0
notub13  DEFB 110
cotub13  DEFB 0
;
tub
         DI
;
         PUSH af                        ;bd19
         PUSH bc
         LD   b,#f5                     ;balayage ecran en haut ?
         IN   a,(c)
         RRA
         JP   c,tuba                    ;si oui commence routine
         POP  bc
         POP  af
         JP   saut                      ;si non alors fin
tuba
         POP  bc
         POP  af
;
         PUSH hl                        ;sauve registres
         PUSH bc                        ;(sauf ix et iy mais c'est pas grave)
         PUSH af
;
         LD   iy,adrtub1                ;iy pointe sur 1er tube
         LD   ix,notub1                 ;ix pointe sur sens du 1er tube
         LD   b,12                      ;nombre de tubes a afficher
         CALL tub1                      ;met les dans table
         DEFS 59,0                      ;pause pour demarrer bien a gauche
;
         LD   hl,table-1                ;hl pointe sur table a mettre sur ecran
         LD   bc,#7f10                  ;#10 = tub dans border (ink 16)
tubloop
         INC  hl                        ;augmente sur table
         LD   a,(hl)                    ;prend couleur de la table
         OR   a                         ;= 0 ?
         JP   z,fin                     ;alors fin, tout est affiche
;
         OUT  (c),c                     ;choisi ink
         OUT  (c),a                     ;met couleur dans ink (ici ink=border)
         LD   c,0                       ;couleur 0 (paper)
         OUT  (c),c
         OUT  (c),a                     ;met-z-y couleur aussi
         LD   c,#10                     ;rechoisi border pour la prochaine fois
         DEFS 97,0                      ;tub=2 lignes de haut (33 pour une)
;
;
         JP   tubloop                   ;ligne suivante sur ecran
fin
         POP  af                        ;retire les registres sauves au debut
         POP  bc
         POP  hl
;
saut     JP   #b941                     ;saute a l'adresse normale du RST #38
;
tbtub2   DEFB #54,#44,#55,#5d,#5f,#53   ;couleurs tube rouge
         DEFB #5f,#55,#44,#54,#54
;
tbtub1   DEFB #54,#5c,#4c,#4e,#4a,#4a   ;couleurs tube bleu
         DEFB #4e,#4c,#5c,#54,#54
tbtub3   DEFB #54,#56,#52,#42,#59,#59   ;couleurs tube vert
         DEFB #42,#52,#56,#54,#54
tbtub4   DEFB #54,#58,#45,#4d,#4f,#4f   ;couleurs tube violet
         DEFB #4d,#45,#58,#54,#54
tbtub5   DEFB #54,#4e,#4a,#43,#4b,#4b   ;couleurs tube jaune
         DEFB #43,#4a,#4e,#54,#54
;
table                                   ;ici la table a afficher sur l'ecran
         DEFS 132,#54                   ;nb lignes de haut
         DEFW 0                         ;fin par 2 zeros par securite
;
tub1                                    ;affiche tube dans la table ci-dessus
         LD   a,(ix+1)                  ;sens de deplacement tube ?
         OR   a                         ;descend ?
         LD   a,(ix+0)                  ;met position vertical dans A
         JP   nz,tub1m                  ;si non (descend?), va a monte !
;
tub1d                                   ;routine qui fait descendre le tube act
         INC  a
         CP   121                       ;tube sur derniere ligne ? (130+11)
         JP   nz,tub1ds                 ;non alors continu
         LD   (ix+1),a                  ;sinon met valeur dans sens
         LD   hl,table                  ;debut table dans HL
         LD   d,0
         LD   e,a                       ;position locate dans DE
         ADD  hl,de                     ;additionne le tout
         EX   de,hl                     ;et on a le position absolue dans DE
         LD   h,(iy+01)
         LD   l,(iy+00)                 ;hl=adresse couleurs du tube actuel
         JP   trans                     ;transfert sur table
;
tub1ds                                  ;descend
         LD   (ix+0),a                  ;stocke position actuelle
tub1ds2  LD   hl,table                  ;meme scenario que 11 ligne + haut
         LD   d,0
         LD   e,a
         ADD  hl,de
         EX   de,hl
         LD   h,(iy+01)
         LD   l,(iy+00)
         JP   trans
;
tub1m                                   ;fait monter tubular
         DEC  a                         ;tube tout en haut ?
         CP   0                         ;(pas OR A, faut meme duree que CP 130)
         JP   nz,tub1ms                 ;si non continu
         LD   (ix+1),a                  ;si oui, stocke sens
         LD   hl,table                  ;et rememe scenario
         LD   d,0                       ;(transfert sur table)
         LD   e,a
         ADD  hl,de
         EX   de,hl
         LD   h,(iy+01)
         LD   l,(iy+00)
         JP   trans
tub1ms
         LD   (ix+0),a
tub1msx  LD   hl,table
         LD   d,0
         LD   e,a
         ADD  hl,de
         EX   de,hl
         LD   h,(iy+01)
         LD   l,(iy+00)
         JP   trans
;oui, je sais, le Jp ci-dessus va juste en dessous, mais c'est pour avoir
;toujours la meme duree d'execution par sens...
trans
         PUSH bc                        ;sauve compteur de tube
         LDI                            ;transfert des 11 lignes de couleurs
         LDI
         LDI
         LDI
         LDI
         LDI
         LDI
         LDI
         LDI
         LDI
         LDI
         POP  bc
         INC  ix                        ;pointeur sur position du tube suivant
         INC  ix
         INC  iy                        ;pointeur sur sens du tube suivant
         INC  iy
         DEC  b                         ;compteur de tube a zero ?
         JP   nz,tub1                   ;si non, on affiche un autre tube
;
         RET                            ;retour a l'affichage sur ecran
;