Revenir au plan du site

Manipuler l'écran du CPC



Équivalent du vecteur #BC26 - Passer à la ligne suivante

Méthode universelle
ld a,h : add 8 : ld h,a : and #38 : ret nz
ld a,LargeurEcran : add l : ld l,a : ld a,#C0 : adc h : ld h,a : res 3,h
ret

Méthode pour la page #C000 (2 nops + rapide)
ld a,h : add 8 : ld h,a : ret nc
ld a,LargeurEcran : add l : ld l,a : ld a,#C0 : adc h : ld h,a : res 3,h
ret

Vous pouvez adapter cette routine pour n'importe quel registre (avec l'utilisation de LDIR, on préfère passer le registre DE à la ligne)

À partir d'une ligne de bloc paire, descendre de deux lignes (écran 64 de large)
Le saut de 2 lignes ne pose aucune difficulté particulière dans ce sens.
HLsauteDeuxLignes
ld a,h : add 16 : ld h,a : and #38 : ret nz
ld a,LargeurEcran : add l : ld l,a : ld a,#C0 : adc h : ld h,a : res 3,h
ret


Équivalent du vecteur #BC29 - Passer à la ligne précédente

Méthode universelle
ld a,h : sub 8 : ld h,a : and #38 : cp #38 : ret nz
ld a,lo(16384-LargeurEcran) : add l : ld l,a : ld a,#3F : adc h : ld h,a : set 3,h
ret

Vous pouvez adapter cette routine pour n'importe quel registre (avec l'utilisation de LDIR, on préfère passer le registre DE à la ligne)

À partir d'une ligne de bloc paire, remonter de deux lignes (écran de 64 de large)
Le test de rebouclage est un peu plus tricky (test des bits 4 et 5 par le INC après un OR)
La compensation est aussi modifiée pour sauter directement au bloc 6
HLretourDeuxLignes
ld a,h : sub 16 : ld h,a : or #CF : inc a : ret nz
ld a,l : add #C0 : ld l,a : ld a,#47 : adc h : ld h,a : res 3,h
ret


Faire évoluer son pointeur écran en restant dans la même ligne de bloc

Quand on décale l'écran vers la droite ou la gauche, il faut gérer le rebouclage de la ligne de bloc. Ce snipet fonctionne partout et sur toutes les lignes.
ld a,h : and %11111000 : ld c,a : Mettre les 5 bits supérieurs de HL dans C
inc hl
ld a,h : and 7 : or c : ld h,a ; ne récupérer que la position dans le bloc et forcer le bloc

Mieux, en utilisant le Bit Merge Hacks!
ld a,h ; on conserve la version précédente de H
inc hl
xor h ; A xor nouveau H
and %11111000
xor h ; nouveau H dont les 5 bits sont remplacés par ceux de l'ancien
ld h,a

Et pour gratter un peu plus :)
inc l
jr nz,_+ ; label anonyme de proximité suivant
ld a,h ; on conserve la version précédente de H
inc h
xor h ; A xor nouveau H
and %11111000
xor h ; nouveau H dont les 5 bits sont remplacés par ceux de l'ancien
ld h,a
_:

C'est pareil pour INC HL que DEC HL que ADD HL,BC


Afficher en entrelacé avec le codage gray

Il faut au préalable organiser ses données en conséquence et (idéalement) organiser ses données en zig-zag (convGeneric et Martine savent le faire en option).

Ensuite, pour passer à la ligne "suivante", un RES ou un SET suffit car l'ordre des lignes fait qu'il n'y a qu'un seul bit à changer dans l'adresse. Ce n'est pas possible d'utiliser cette optimisation avec les lignes dans l'ordre logique.
set 3,h   ; #C000 => #C800
set 4,h   ; #C800 => #D800
res 3,h   ; #D800 => #D000
set 5,h   ; #D000 => #F000
set 3,h   ; #F000 => #F800
res 4,h   ; #F800 => #E800
res 3,h   ; #E800 => #E000
add hl,de ; #E000 => #C0xx avec DE = LARGEUR_ECRAN - #2000