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: 1187
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.732-desktop/c
Page créée en 500 millisecondes et consultée 3248 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.