CODINGCHRONIQUE A100% DES LOGON SYSTEM ★ LA SCAROLE VERTE Y CALE... ★

Logon System ACPC n°48 - Les scroll hard verticalCoding Chronique A100% Des Logon System
C'est sous ce jeu de mots douteux que je vais vous parler des scrolls hards verticaux, encore appelés  scrolling-Registre 5 en raison de l'aide précieuse que fournit ce registre du CRTC pour décaler vers le haut (ou vers le bas), et avec fluidité, tout un écran.

Cette technique que nous allons vous décrire est employée dans le jeu Mission Genocide (un budget de Firebird que je ne saurais trop vous conseiller) ou dans quelques démos (comme le menu et la Nega-part de The Demo ou la BSC Megademo par exemple).

La méthode est relativement simple (encore fallait-il la trouver), et je m'en va vous l'expliquer de ce pas. Il suffit en fait de séparer l'écran en deux parties au moins, comme pour une rupture toute simple, ainsi que papy Longshot vous l'a expliqué il ya quelque temps dans un précédent numéro. Ce n'est qu'ensuite que le registre 5 intervient: grâce à lui. on décale sans se fatiguer d'une ligne ou plus un des écrans de la rupture, vers le haut ou vers le bas. Comme le registre 5 ne peut varier qu'entre 0 et 31, on ne se sert, en réalité, que des valeurs 0 à 7, et on décale alors l'écran également à l'aide du pointeur Video, autrement dit, les registres 12 et 13 du CRTC. Il faut juste faire attention à une chose, ne pas oublier de changer également la valeur du registre 5 des autres écrans de la rupture. Celle-ci doit être égale au complément à 7 de la valeur du registre 5 de l'écran qui scrolle. Cela doit être fait pour stabiliser les écrans et éviter qu'ils ne sautillent.

Voilà pour la partie hard, mais il reste encore la partie soft, autrement dit l'affichage des motifs du scroll. Eh bien, il suffit de descendre, à chaque balayage d'une ligne sur l'écran, si le scrolling est ascendant et réciproquement, afin de compenser le décalage généré par le scrolling hard. Sous des aspects compliqués, ce système est en réalité très simple, et il est beaucoup plus rapide qu'un scrolling vertical réalisé en soft. Son seul inconvénient est la nécessité d'une rupture, mais ce problème disparaît avec un usage avisé des interruptions, ce qui est en quelque sorte réalisé dans le programme ci-contre puisqu'il se synchronise sur des HALTs.

Voilà justement une parfaite transition pour vous parler du programme de cette fois-ci, mais je trouve qu'il est suffisamment commenté pour ne pas avoir à l'expliquer; disons simplement qu'il fait défiler un message à caractères géants grâce à un scrolling hard vertical. Par contre, je vais vous parler de la façon dont est générée la fonte géante du scrolling.

Etant donné que chaque caractère ne prend que 64 octets en mémoire et fait 256 lignes de haut sur 64 octets (256 pixels en mode 1) sur j'écran, soit 16 Ko, je crois que le mot « géant» n'est pas de trop. Nous avons déjà vaguement parlé de cette technique de compression lors du listing d'une démo. Chaque octet des caractères en mémoire correspond, en fait, à un morceau du caractère géant, un « bloc»utilisé par plusieurs caractères. Dans le programme, ces blocs sont définis grâce à des caractères Ascii assemblés pour ne pas prendre trop de place. Pour la même raison, il n'y a dans le programme que les matrices des caractères qui composent le mot « 100% ». Toutefois, il y a bien une gestion de texte, c'est-à-dire que vous pouvez très bien vous amuser à définir les matrices des autres caractères, avec une restriction cependant: ces caractères doivent être dans l'ordre Ascii. Voilà pourquoi, dans le programme, le « % » de « 1 00% » est remplacé par un « / » (slash), code qui est juste avant le « 0 » et le « 1 » dans l'ordre Ascii. Je rajouterai enfin que ce type de compression par bloc est utilisé, non seulement, dans les démos pour faire défiler des caractères, mais également dans les jeux pour les scrollings de décor.

Donc, le programme fait défiler l'écran du haut vers le bas à raison d'une ligne par balayage. Je vous laisse le soin de voir comment changer le sens ou la vitesse, ce n'est pas compliqué, mais cela demande rigueur et attention. De toute façon, on ne possède que ce dont on a l'expérience...

Sur ces paroles hautement philosophiques (si! si !) je vous laisse méditer. A bientôt!
 

;
;    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 écran
;
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 écran
;
    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

Pict / Logon System, ACPC n°48 Juillet 93, p 20-21-22-23

★ ANNÉE: 1993
★ AUTEUR: PICT

Page précédente : Logon System ACPC n°47 - Sprites !!!!
★ AMSTRAD CPC ★ DOWNLOAD ★

Other platform tool:
» LOGON48  Scrollhard    LISTINGDATE: 2012-08-27
DL: 437
TYPE: text
SiZE: 12Ko
NOTE:

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Chronique A100% par les Logon System
» Coding » Logon System ACPC n°31 - Le CRTC
» Coding » Logon System ACPC n°32 - La rupture
» Coding » Logon System ACPC n°42 - Raster suite et fin ...
» Coding » Logon System ACPC n°33 - Les interruptions du Z80
» Coding » Logon System ACPC n°47 - Sprites !!!!
Je participe au site:
» Vous avez des infos personnel, des fichiers que nous ne possédons pas concernent ce programme ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.732-desktop/c
Page créée en 255 millisecondes et consultée 3648 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.