Revenir au plan du site
Scrolling propre au registre 5
Nous avons vu dans
[L'article précédent] comment réaliser un scrolling au registre 5, fonctionnel, sous interruption. Seul souci, les lignes ajoutées font que l'écran visible change de taille. Voyons quelles solutions s'offrent à nous.
Cacher le début de l'écran en remontant l'écran
C'est la solution de facilité. Pas spécialement la plus simple dans notre cas puisque nos routines et nos synchronisations sont déjà réalisées. Aussi je l'évoquerai brièvement. On remonte le premier écran jusqu'à ce qu'il commence dans la partie non visible du moniteur.
Attention, la plupart des émulateurs affichent souvent plus de lignes qu'un moniteur standard. C'est aussi vrai quand on branche son CPC sur un écran plat ou une télévision cathodique => La surface affichée est plus grande. Et on trouvera même certains moniteurs Amstrad mal réglés qui feront de même.
Cette technique reste néanmoins la référence "gratuite" pour les scrollings verticaux à écran de 64 octets de large.
Masquer les lignes en trop avec des rasters en mode 2
C'est à mon sens la solution la plus simple et qui fonctionne partout. Le résultat est plus propre, la mise en oeuvre est simple.
Idéalement on aura toujours l'encre zéro de la couleur du border. On bascule en mode 2 et on change l'encre 1 pour avoir la couleur du border. En mode 2, les autres encres ne sont pas affichées, inutile de changer toutes les encres.
Enfin, au départ visuel logique de l'écran de scrolling, on remet le mode désiré et la première encre. Ni vu, ni connu.
On change l'interruption 01 =>
[SourceComplet]
int01 push af,bc,hl : ld hl,int02 : ld (#39),hl
ld bc,#7F80+%1110 : out (c),c ; MODE 2 + ROM_OFF
ld bc,#7F01 : out (c),0 : ld a,#44 : out (c),a : out (c),c : out (c),a ; ENCRE 0 et 1 comme border
ld b,0 : djnz $ : ld b,9 : djnz $ ; attendre le début écran
ld bc,#7F80+%1101 : out (c),c ; MODE 1 + ROM_OFF
ld bc,#7F01 : out (c),0 : ld a,#54 : out (c),a : out (c),c : ld a,#4E : out (c),a ; ENCRE 0 et 1 normales
pop hl,bc,af : ei : ret
|
Masquer les lignes en trop avec du border
C'est la technique la moins coûteuse en temps machine. On force le CRTC à afficher du border. Pas besoin de changer le mode, pas besoin de modifier les encres.
Seul bémol, forcer le border ne se fait pas de la même façon sur tous les CRTC!
La technique implique donc deux routines différentes, et un test CRTC bien sûr, pour choisir définitivement la routine à appliquer (on changera l'ensemble de l'interruption c'est plus simple).
Encore plus pointu, cacher plusieurs splits en fin de ligne
Pour conclure ce petit article, je vais évoquer la méthode la plus pointue, utiliser plusieurs split-écrans sur la même ligne, afin de pouvoir coller la zone de scroll avec un HUD situé au dessus!
Dans nos exemples, le HUD est toujours dessous car le registre 5 ajoute des lignes en fin d'écran. Si on voulait mettre le HUD au dessus et masquer avec des rasters, la technique resterait possible, mais en laissant une zone noire de 8 lignes pour cacher la partie mobile.
Dans le jeu Pinball Dream de Batman Group, le HUD est collé à la zone de scrolling, impliquant des tricks CRTC poussés et spécifiques à au moins deux modèles. Le résultat est à la hauteur du travail fourni ;)
Technique alternative pour le HUD en haut (avec 8 lignes de marge)
Dans le fanzdisk Focus 2
[LIEN] la misère est cachée en mettant le registre 1 à zéro (ligne de longueur zéro). La précision demande plus de rigueur qu'un masquage au border ou au mode 2.
On démarre le masquage avant la fin du HUD (qui a éventuellement des lignes supplémentaires avec le registre 5). Le changement d'écran se fait pendant le masquage. On remet R1 à la bonne valeur juste avant 8 lignes. Quand l'adresse mémoire change de bloc, peu importe la longueur des lignes précédentes, elles seront toujours bien calculées. Attention cependant dans le cas où R5 vaut zéro, vous pouvez conserver le masquage si et seulement si vous ajustez l'adresse CRTC pour tenir compte des longueurs nulles.
Bref, si la solution semble simple à première vue, elle demande un ajustement très précis => Je déconseille donc aussi ^_^
Technique sans rupture pour un scroll unique
On me souffle à l'oreille qu'il serait possible de mélanger l'usage du registre 9 en début d'écran et de registre 5 en fin d'écran. Et on me resouffle des optimisations
- Le début écran utiliserait le registre 9 pour définir un premier bloc de 2 à 9 lignes. On évite le cas pénible du bloc de 1 ligne (CRTC-2)
- La fin de l'écran utiliserait le registre 5 pour ajouter de 0 à 7 lignes en complément (le registre 5 peut ajouter jusqu'à 31 lignes)
Évidemment, une telle gestion impose un timings précis pour la modification du registre 9 et une petite gymnastique pour le calcul de l'adresse de départ, selon la valeur de R9. C'est à mon sens plus fastidieux qu'avec rupture et il y a toujours le besoin de masquer la misère.
Ainsi s'achève la série d'articles sur les scrollings. J'espère avoir suffisament détaillé chaque technique et vous avoir donné les clefs pour de futurs projets :)