CODINGApprendre pas à pas la programmation en assembleur Z80 ★ Annexe hardware de la machine ★

Comment redimensionner l'écran?
Changer les dimensions de l'écran


Excellentissime schéma de feu Grimware, maintes fois copié, jamais égalé.

ld bc,#7F00+%10001100+%00 : out (c),c ; MODE 0
ld bc,#7F00+%10001100+%01 : out (c),c ; MODE 1
ld bc,#7F00+%10001100+%10 : out (c),c ; MODE 2

Bon,c'est bien mignon d'afficher des points, mais tous ces calculs là, sont-ils bien utiles? Plutôt que calculer à chaque fois le modulo, la division (même optimisée), ne serait-il pas possible de faire un tableau de 200 cases qui contienne nos 200 adresses écran déjà calculées?
La réponse est oui! Nous allons générer directement cette table dans l'assembleur.

adresse_ecran=#C000
largeur_ecran=80
tableau
repeat 25 ; notre écran est composé de 25 lignes
repeat 8 ; de blocs de 8 lignes
defw adresse_ecran
adresse_ecran+=#800
rend
adresse_ecran+=largeur_ecran
adresse_ecran-=#4000
rend

; exemple de lecture de ce tableau de 400 octets
; HL=ligne écran
ld bc,tableau
add hl,hl ; adresses 16 bits, il faut indexer de 2 en 2
add hl,bc
ld a,(hl) : inc hl ; on récupère d'abord le poids faible, le Z80 est little endian
ld h,(hl) : ld l,a ; ensuite le poids fort
; HL=adresse de la ligne

Notre programme se trouve considérablement raccourci et plus rapide (mais il occupera un peu plus de mémoire à cause de la table.

BUILDSNA : BANKSET 0
ORG #100
RUN #100
debut

ld bc,160 : ld hl,100 ; en plein milieu de l'écran
call CalculeAdressePixel
ld (hl),c ; écrire le pixel
jr $ ; boucle infinie

CalculeAdressePixel
; BC=coordonnée X (0-319)
; HL=coordonnée Y (0-199)
ld de,tableau
add hl,hl ; adresses 16 bits, il faut indexer de 2 en 2
add hl,de
ld a,(hl) : inc hl
ld h,(hl) : ld l,a
; HL=adresse de la ligne
ld a,c ; on sauvegarde le X avant de diviser par 4
srl bc : srl bc ; diviser le X par 4 pour avoir l'octet en mode 1
add hl,bc
ld c,%10000000 ; encre 1 pour le pixel mode 1 le plus à gauche dans l'octet
and 3 ; avec le modulo 4 on va savoir quel est le pixel en partant de la gauche
jr z,.noShift
.Shift
srl c
dec a
jr nz,.Shift
.noShift
ret ; HL=adresse écran aux coordonnées X/Y données et C est le pixel d'encre 1
;-------------------
adresse_ecran=#C000
largeur_ecran=80
tableau
repeat 25
repeat 8
defw adresse_ecran
adresse_ecran+=#800
rend
adresse_ecran+=largeur_ecran
adresse_ecran-=#4000
rend

★ ANNÉE: 2025
★ AUTEUR: Roudoudou

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.732-desktop/c
Page créée en 750 millisecondes et consultée 9 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.