CODINGCRTC ★ SCROLLING ★

Crtc - Scrolling (SOS Programmeurs)

Question : Comment faire scroller a gauche une page écran en la remplaçant progressivement par une autre ?

Réponse : Chaque opération de scrolling doit être adaptée à un besoin spécifique . On peut donc concevoir quelques centaines de routines différentes . Faire scroller une page complète est possible mais demande beaucoup de mémoire puisqu'il faut stocker 2 pages complètes en RAM . C'est aussi assez long à effectuer par les voies normales , l'idéal est d'attaquer le problème par les E/S du contrôleur vidéo mais le cas est un peu trop complexe pour être traité ici . Nous y-pensons néanmoins pour les cours de graphisme dans SOS PROGRAMMEURS 90 .

Pour planter le décor de la démonstration qui suit précisons :

1 : La rapidité est essentielle . Il ne faut pas hésiter à agrandir la taille du programme pour diminuer la vitesse d'exécution . Ceci est paradoxal mais tout à fait juste .
2 : Les routines système , excellentes et simple d'emploi son trop lentes pour être utilisées ! Il faut prendre le temps d'aller les activer dans la ROM et elles comportent une foule d'instructions et de tests dont nous n'avons pas besoin . En conséquence , on les élimine .
3 : Toute opération graphique nécéssite des calculs et stockages dans un ou plusieurs buffers . On doit effectuer un maximum de ces opérations avant de toucher à l'écran afin de ne pas aggraver les défauts d'affichage .

--------------------
— ALGORYTHME GENERAL -
--------------------

Charger une page en RAM écran et l'autre dans une zone quelconque de la RAM
; (Le programme utilise la zone &4000 à &7FFF)
; La RAM écran débute en &C000

PHASE 1 : Transférer la colonne de droite de la page stockée dans une zone quelconque de 200 octets .

; +>>>>>>>>>>>>>>>>+
; ^ ; !
; ^ ; !
+-----------------!-+ ;+-+ ; +-------------------+
!*** PAGE STOCK *!*! ;!*! ; !### PAGE ECRAN ###!
!*****************!*! ;!*! ; !###################!
!*****************!*! ;!*! ; !###################!
!*****************!*! ;!*! ; !###################!
!*****************!*! ;!*! ; !###################!
+-----------------!-+ ;+-+ ; +-------------------+
;^
;!
;!



Table de 200 octets pour le stockage temporaire d'une colonne écran

PHASE 2 : Décaler la page stockée d'une colonne vers la droite pour libérer ainsi la colonne de gauche et écraser celle de droite .

>> ; >>
^ ; ^
+-------------------+ ;+-+ ; +-------------------+
! ** PAGE STOCK ***! ;!*! ; !### PAGE ECRAN ###!
! ******************! ;!*! ; !###################!
! ******************! ;!*! ; !###################!
! ******************! ;!*! ; !###################!
! ******************! ;!*! ; !###################!
+-------------------+ ;+-+ ; +-------------------+


PHASE 3 : Prendre la colonne la plus à droite dans l'écran et la transférer dans la colonne la plus à gauche de la zone de stockage .

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
! ;^
+-!-----------------+ ;+-+ ; +-----------------!-+
!#!* PAGE STOCK ***! ;!*! ; !### PAGE ECRAN #!#!
!#!*****************! ;!*! ; !#################!#!
!#!*****************! ;!*! ; !#################!#!
!#!*****************! ;!*! ; !#################!#!
!#!*****************! ;!*! ; !#################!#!
+-!-----------------+ ;+-+ ; +-----------------!-+



PHASE 4 : Décaler l'écran d'une colonne à droite comme on l'a fait précédement pour la zone de stockage .

;>> ; >>
;^ ; ^
+-------------------+ ;+-+ ; +-------------------+
!#** PAGE STOCK ***! ;!*! ; ! ## PAGE ECRAN ###!
!#******************! ;!*! ; ! ##################!
!#******************! ;!*! ; ! ##################!
!#******************! ;!*! ; ! ##################!
!#******************! ;!*! ; ! ##################!
+-------------------+ ;+-+ ; +-------------------+



PHASE 5 : Prendre la colonne précédement mémorisée et la placer dans la colonne écran de gauche .

;.>>>>>>>>>>>>>>.
;^ ; !
+-------------------+ ;+-+ ; +-!-----------------+
!#** PAGE STOCK ***! ;!*! ; !*!# PAGE ECRAN ###!
!#******************! ;!*! ; !*!#################!
!#******************! ;!*! ; !*!#################!
!#******************! ;!*! ; !*!#################!
!#******************! ;!*! ; !*!#################!
+-------------------+ ;+-+ ; +-!-----------------+



PHASE 6 : On recommence en PHASE 1 tant que l'on veut que ça tourne .

-----------------------

Avant de passer au listing du programme proprement dit , précisons au néophyte que l'écran utilise en hauteur 25 caractères . Chacun de ces caractères occupe 8 lignes écran . Le nombre de lignes vidéo de l'écran est donc de 25*8 = 200 lignes .

En largeur , une ligne se compose de 80 octets écrans de 8 pixels chacune . Dans l'exemple donné , les pixels ne nous intéressent pas .
L'adressage écran du CPC est des plus bizaroides ! Il faut en effet ajouter &800 à la valeur d'une case mémoire pour connaître l'adresse de celle située juste en dessous . Mais attention ! Ceci est valable tant que l'on est à l'intérieur d'une même ligne de caractères (8 lignes écran) . Sitôt que l'on passe à la ligne suivante , on doit alors ajouter 80 à la case mémoire située sur la 1ERE LIGNE ECRAN DE LA LIGNE CARACTERE QUI PRECEDE pour trouver le bon octet ... Pas clair tout ça , on en reparlera l'an prochain . En attendant , notez que la routine système #BC26 fait ce calcul pour vous .

Ex : LD HL,#C000
CALL #BC26
Ici HL aura la valeur de la case écran située sous celle #C000 .
AF est modifié par cette routine .

Comme cette routine est trop lente à notre goût , c'est ADINF qui la remplace . ADINF40 est exactement la même mais est adaptée pour la zone d'adresses à partir de &4000 . ADINFDE et ADINFDE40 sont les mêmes mais travaillent sur DE au lieu de HL .

NOTE : Quelques calculs sur 8 bits peuvent surprendre au 1er abord , voir dans la section réponses pour explications .

» SOURCE : SCROLL LATERAL AVEC ECHANGE ENTRE ZONE #4000-#7FFF ET ECRAN -

M.MAIGROT, SOS Programmeurs n°4

★ ANNÉE: ???
★ AUTEUR: MICHEL MAIGROT

★ AMSTRAD CPC ★ DOWNLOAD ★

Dump disquette:
» SOS  Programmeurs  4    FRENCHDATE: 2003-03-28
DL: 949
TYPE: ZIP
SiZE: 128Ko
NOTE: 40 Cyls
.HFE: Χ

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

Lien(s):
» Coding » Graphic - 30 - Etude du Crtc (SOS Programmeurs)
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.7-desktop/c
Page créée en 771 millisecondes et consultée 2620 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.