CODINGAMSLIVE ★ AMSLIVE n°04 - Z80 : LA VIE S'ECOULE ; LE CPC C'EST COOL ★

AMSLIVE n°04 - Z80Coding Amslive

Cet article est lié aux autres grandes sagas d'AMSLIVE. Ses (inédites) informations destinées à savoir vous synchroniser n'importe où sur l'écran seront utiles en programmation, pour la rubrique CRTC et pour les rasters d'OFFSET.

LES INTERRUPTIONS

Prenez un compteur (encore un ! Avez-vous remarqué comme l'informatique peut se Réduire à un nombre restreint de Concepts) croissant (0, 1, 2...). Après 51, ce compteur repasse à 0 et le Gâte Array en profite pour envoyer un signal d'interruption.

HBL & RAZ

Ce sont les HBL qui génèrent l'incrémentation de ce Compteur d'Interruption. Il est donc possible d'augmenter ou de réduire la fréquence des interruptions, mais ceci offre peu d'intérêt, surtout que vous sacrifieriez la stabilité de l'écran. Pour remettre à zéro ce Cl, OUTez &9C, &9D ou &9E au GA (port &7Fxx). Cette commande change aussi le mode graphique (respectivement 0, 1 ou 2). La prochaine int aura alors lieu 52 lignes rasters plus tard.

VBL

Plus fort, la VBL remet aussi CI à 0. Deux lignes de VBL engendrent le traitement suivant :

Si C1<32, autrement dit si le bit 5 (oui oui le bit 5 !) de CI est nul, CI <= 0.

Sinon, C1 <= 0 aussi, mais une interruption est générée.

Par défaut, la période entre 2 VBL est de 312 lignes, soit exactement 6*52. Quand le test est fait, CI vient d'être remis à 0, avec envoi d'une interruption. La RAZ de CI ne l'affecte pas puisqu'il est déjà à 0 ! Si vous construisez un écran de 313 lignes (à titre d'exemple pédagogique, car il n'est pas propre ne pas avoir 312 lignes), l'int est produite une ligne avant le test. Lors de celui-ci, CI=1. Il est donc remis à 0 sans interruption. Ce qui fait que 53 lignes séparent l'int présente pendant la VBL et la suivante.

Avec 311 lignes, CI vaut 51 lors du test. Il est remis à 0 et une int est produite. Cette fois 51 lignes séparent l'int générée avant la VBL et la suivante.

SANS VBL

Il est donc possible d'avoir des routines synchronisées sans attente VBL. Si vous savez que vous êtes dans les 52 dernières lignes de l'écran, un HALT vous placera a peu près 120 µs après le début de la VBL.

Une solution encore meilleure est de placer toutes les routines nécessitant d'être synchros (musique, ruptures...) sous interruption.

Le programme principal pourra avoir une durée variable (à ce propos, pourquoi toujours des animations en 50 ou 25 Hz ? Cela peut être entre les deux : un flipping (synchro, lui) se chargera de changer les pages, quelques fois après 0.02 s, d'autres fois après 0.04 s...). Tout le temps machine est alors entièrement utilisé, pour peu que vous remplaciez les boucles d'attente par des routines à durées fixes.

TRAVAIL PRATIQUE AMUSANT

Placez en #38 une routine de rasters. Le prog principal consistera en une boucle contenant un test de touche pour pouvoir sortir du programme ! Ca marche ? Ok ! Maintenant faites gicler la VBL (R7 > 38). Exécutez. A moins de régler V-HOLD, l'écran est déstabilisé, mais les rasters sont synchros avec lui. Toujours sans VBL, mettez R5 à 1. Relancez. Whaou les scrolls différentiels !

Explication : l'écran boucle au bout de 313 lignes. Mais les int, sans la VBL pour réajuster, au bout de 312 lignes, donc 1 ligne plus tôt : les rasters remontent par rapport à l'écran. Essayez avec R4=37 et R5=7.

TEST DE RUPTURE

Vous avez créé un écran rupté ? Pour s'assurer que le nombre de lignes total est bien 312, procédez comme suit : 1ère étape : Remplacez l'attente VBL par une synchro avec HALT (vous pourrez rétablir après le test). 2ème étape : Ne générez plus de VBL. Si 312 lignes : l'écran sera juste déstabilisé. Sinon, les repères HALT vont changer (cf Travail Pratique) : gros caca.

DI EN PAIX

Amslive 1, page &17 : je vous racontais que le GA maintenait sa demande d'int jusqu'à ce qu'elle soit acceptée. Vous en avez donc légitiment conclu que si une int intervenait alors qu'elle est interdite par un DI, alors elle aurait lieu immédiatement après un EI. En fait, ce n'est pas exactement cas : le RST #38 se produit non pas après le EI, mais après l'instruction qui suit le EI (il faut bien laisser au Z80 le temps de faire son ménage -voire son manège). Même si Tint n'est pas validée par le Z80, CI continue son petit bonhomme de chemin. Mais après le EI, un test similaire à celui vu pour la VBL est fait : L'interruption est générée de toutes façons, mais :

Si CI<32, CI est inchangé (la prochaine int sera alors produite 21 à 52 lignes plus tard).
Sinon, CI <-0.

AMSLIVE n°4

★ ANNÉE: ???
★ AUTEUR: MADRAM

Page précédente : AMSLIVE n°04 - Initiation Au Soundtracker

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

Lien(s):
» Coding » AMSLIVE n°07 - SINUS SITE , LA SUITE (2/2)
» Coding » AMSLIVE n°08 - 3D - BRESEN MAD (2/2)
» Coding » AMSLIVE n°05 - Multiplication de Solutions
» Coding » AMSLIVE n°18 - BIDULES ET MACHINS VRAIMENT CHOUETTES
» Coding » AMSLIVE n°14 - Multiplication Saignee a Mort
» Coding » Z80frequence
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/c
Page créée en 231 millisecondes et consultée 2474 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.