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 2Bon,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 debutld 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 CPCrulez[Content Management System] v8.732-desktop/c Page créée en 750 millisecondes et consultée 9 foisL'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. |
|