CODING ★ MÉMOIRE ECRAN : L'OFFSET ★

Mémoire écran : l'offset

Faisant suite à notre brillant article du numéro 27 relatif à la mémoire écran des CPC (mieux vaut tard que jamais), abordons aujourd'hui un sujet de première importance concernant ladite mémoire : l'OFFSET.

Ce nom au demeurant barbare, dissimule une fonction à l'Amstrad, qui peut sembler déroutante à plus d'un titre. L'offset est la différence entre l'adresse courante de la mémoire écran et l'adresse écran définie par le système à l'initialisation. Cette définition obscure nécessite un brin de développement. Pour essayer de la mieux comprendre, tapez le (minuscule) programme ci-dessous :

10 REM Offset nul
20 MODE 2
30 LOAD"SCREEN", &C000
40 GOTO 40

Ce programme suppose bien entendu que vous disposiez, sur disquette ou cassette, d'un fichier binaire de 17 Ko représentant une image écran dans un mode quelconque. Vous constatez que le CPC a tout simplement chargé à l'écran l'image portant le nom SCREEN BIN et vous êtes satisfait du résultat. Ajoutez maintenant la ligne :

15 LOCATE 1,25: PRINT STRING$(10,10);:LOCATE 1,1

Relancez le programme et ô surprise, ô étonnement ! votre super ordinateur a-t-il encore fait des siennes ? Voici votre belle image représentée en dépit du bon sens ! L'explication de ce phénomène pour le moins bizarre est en fait très simple.

384 Manquants !

Il est de notoriété publique qu'en mode 2, huit octets suffisent pour afficher un caractère à l'écran. Nous avons 25 X 80 caractères, soit 2 000 caractères affichables. Or, 2 000 X 8 octects. La RAM écran occupant normalement 16 384 octets (de &C000 à &FFFF), 384 octects manquent à l'appel.

Même chose en mode 1, où 16 octets pour un caractère, à raison de 1 000 (25 X 40) caractères, font 16 000 octets et en mode 0, où 32 octets pour un caractère, 500 (25 x 20) caractères affichables, font bel et bien 16 000 octets. Que fabriquent ces 384 maudits octets ? A quoi servent-ils ? A rien apparemment, du moins en l'absence de scrolling. Donc, si vous estimez que votre application ne nécessite pas de scroll, rien ne vous empêche d'utiliser cet espace pour loger, par exemple, une petite routine en langage machine, ou bien des données. Toutefois attention. Ces 384 octets sont remis à 0 par le premier CLS venu, à moins qu'une routine CLS de votre cru n'épargne la zone en question. Quant à utiliser l'instruction MODE (ou la routine système BC0E), c'est complètement hors de question. Cela dit, l'offset, ce n'est pas à proprement parler ces 384 octets. Reprenons notre petit programme (exemple) de tout à l'heure, mais sans la ligne 15. Après l'instruction MODE 2, la mémoire écran est totalement vidée, le curseur texte est repositionné en (1,1) et on se retrouve en mode 80 caractères par ligne. Dans ce cas, le premier octet situé en haut à gauche de l'écran a normalement pour adresse &C000. Or, après rajout de la ligne 15, &C000 se trouve remplacé par &FAD0. Pourquoi ? Parce que tout simplement, lors d'un scrolling de' l'écran, ce n'est pas le « continu » de la mémoire qui est décalé, mais bien la mémoire elle-même.

OFFSET = &FAD0 - &C000 = &3AD0

MODE ALITE

Cette astuce, obtenue par une action appropriée sur le contrôleur vidéo (le CRTC 6845), garantit une très grande vitesse de défilement (c'est d'ailleurs cette méthode qui est utilisée par la routine BC4D, à l'inverse de BC50, qui réalise un scrolling totalement logiciel). Les registres du 6845 concernés sont R12 et R13, s'occupant respectivement de fixer l'octet fort et l'octet faible de l'adresse de début de la mémoire écran. Essayez le programme suivant et contemplez le résultat :

10 MODE 2: LOAD"SCRENN",&C000
20 FOR I = 0 TO 40
30 CALL &BD19: REM synchronisation balayage
40 OUT &BC00, 12:OUT &BD00,1
50 NEXT I
60 GOTO 20

Il est bien évidemment possible d'obtenir la même chose en langage machine, soit par des instructions OUT, soit en passant par la routine système située en BC05 (HL doit contenir l'offset désiré, qui doit être obligatoirement divisible par 2). Pour mieux comprendre l'effet de cette routine, essayez, après divers scrollings horizontaux ou verticaux, d'appeler la routine BC0B, qui demande l'offset de la mémoire écran (en sortie, A contient l'octet le plus significatif de la mémoire écran, et HL l'offset courant).

Pour les Pros

Il est peu probable qu'au début, la plupart d'entre vous utilisent à bon escient cette particularité de l'Amstrad. Sachez toutefois qu'une action sur le contrôleur vidéo, est encore la méthode la mieux appropriée à la réalisation de jeux d'arcade et d'action. Citons comme référence Tornado Low Level, dont le scrolling multidirectionnel étonne encore le monde entier, ou plus récemment Bob Winner, qui atteint la quasi-perfection. Donc, nous ne saurions trop vous conseiller l'étude attentive de ce phénomène et son assimilation parfaite pour une utilisation optimum. Surtout, ne vous laissez pas envahir par le découragement si le résultat de vos efforts n'est pas à la mesure de vos espérances (comme en toute chose d'ailleurs).

AM-MAG

★ ANNÉE: ???
★ AUTEUR: S. Schreiber

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

Lien(s):
» Coding » La page pédagogique d'hebdogiciel 127: La Memoire
» Coding » Structure de la mémoire écran de l'Amstrad CPC par ANTIBUG
» Coding » Clefs2 10 - Cpm22 Ext Residente Memoire
» Coding » AMSLIVE n°10 - Memoire du CPC 2
» Coding » Clefs2 10 - Cpm22 Carte Memoire
» Coding » Ali Gator - 08. La mémoire écran (Micro-Mag)
Je participe au site:

» 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
Page créée en 202 millisecondes et consultée 1843 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.