CODING ★ Fréquence du Z80 sur CPC ★

Z80frequence

Pourquoi dit-on dans certaines documentations que le Z80 du CPC est cadencé à 4MHz, et dans d'autres qu'il est à 3,33 MHz ?

Les deux fréquences sont correctes ! Tout dépend du point de vue : Le CPC possède un quartz à 16 MHz dont la fréquence est divisée par 4 avant d'arriver au Z80. On a donc bien quatre Mhz. Cependant la RAM du CPC est utilisée à la fois par le CPU et le processeur vidéo (il faut bien qu'il lise les octets pour les afficher à l'écran). Pour des raisons techniques, le Z80 et le CRTC6845 ne peuvent accéder à la mémoire en même temps. Il a donc fallu faire un arbitrage : On a préféré privilégier l'affichage, le CRTC a donc la priorité sur le Z80.

Si on avait choisi de privilégier le CPU par rapport au processeur vidéo, on aurait eu des clignotements d'affichage ou des point noirs, du genre de ceux qui se produisent sur le TRS-80.

Comme sur CPC c'est le CRTC qui a la priorité, il peut lire les données au moment où il en a besoin. Le Z80 sera obligé d'attendre que le 6845 lui laisse le champ libre. Ainsi, la fréquence de 3,33 MHz est une moyenne calculée à partir des ralentissements que subit le Z80 à cause du CRTC.

Epilogue

La vitesse des programmes sur CPC sont mesuré en NOP, et non pas en cycles comme c'est le cas sur d'autres machines. Un NOP dure une microseconde, ce qui correspond à la largeur d'un caractère au point de vue du CRTC. Il y a 64 NOPs par ligne, et 312.5 lignes. On a donc 20000 NOPs par frame, et un million par seconde.

Selon MadRam (Alias le Dieu du CPC), seules certaines instructions sont ralenties par le 6845. Il est donc possible de faire des programmes tournant réellement à 4 MHz.

Cet article a été rédigé par CSKi, d'après des indications de MadRam.

----

Sauf sur certains rares CPC (CRTC2?), pas de possibilité de faire du réel entrelacé, et donc le 312,5 est évidemment FAUX en mode standart, et IMPOSSIBLE sur la plupart des CPC même en bidouillant. Il n'y a que 312 lignes pile poil (un nombe entier), et pas 20000 NOPs par frame mais 64*312=19968 NOPs. Anecdote intéressante d'ailleurs, la fonction TIME et autre moyen de décompter les secondes sur Amstrad CPC est... erronée! ca tourne plus vite, à 0,155% près. M'enfin, tout cela est chipoter, car le quartz utilisé dans le CPC n'est pas très très précis... Un test simple à faire: deux LONGs programmes lancés en même temps sur 2 CPCs différents ont de grande chances de ne pas finir en même temps.

Bon, tout ceci a été discuté en meeting avec Madram, il peut confirmer, tout est vrai. Et il me semble qu'il y a quelque chose à ce sujet sur la ML, non?

Signé: anonyme, mais on me reconnaîtra, pas arf!

---

Je sais plus trop les termes techniques, désolé (suffit de prendre une doc sur le Z80 et hop!) mais voilà en petit français pourquoi certaines instructions sont ralenties et d'autres pas. Au cours d'une instruction, il y a plusieurs phases (ou T-cycle?), en gros pour lire les octets de l'instruction, pour exécuter le code proprement dit, et pour stocker éventuellement le résultat de l'instruction (on dit, en vrac, à confirmer FETCH LOAD EXECUTE STORE???).
Bref au cours d'une milliseconde soit 4 T-cycles, y'en a déjà 2 qui sont reservés au circuit vidéo du CPC (le gate array) pour lire 2 octets (et les traduires en niveaux de couleurs pour le tube cathodique). Reste 2 T-cycles, suffisant lors d'une instruction "simple" pour récupérer l'octet de l'instruction. Mais bon imaginons une instruction qui lit plein de choses dans la mémoire genre LD HL,(xxxx). Au cours de cette dernière instruction, le bus est souvent requis lors de l'exécution pour récupérer en xxxx les 2 octets. Manque de pot, le gate array est prioritaire, et donc le Z80 qui lui aussi demande le bus est mis en attente (WAIT STATE?).
Grmpf! on chipote on chipote. Mais bon il est intéressant de dire aussi que le temps d'exécution des instructions est toujours ramené à un multiple de 4 T-cycles = 1 milliseconde. Ainsi, à partir d'une doc sur le Z80 qui donne le nombre de T-cycles par seconde, on peut déduire par défaut le temps que çà prendra en arrondissant au multiple de 4 supérieur. Par défaut: i.e. c'est un minimum, on peut "ajouter" qlq cycles si l'instruction a typiquement besoin du bus.

Calculons...

si 4 T-Cycles, arrondi à 4, + 0%
si 5 T-Cycles, arrondi à 8, + 60%
si 6 T-Cycles, arrondi à 8, + 33%
si 7 T-Cycles, arrondi à 8, + 14%
si 8 T-Cycles, arrondi à 8, + 0%
si 9 T-Cycles, arrondi à 12, + 33%
si 10 T-Cycles, arrondi à 12, + 20%
si 11 T-Cycles, arrondi à 12, + 9%

En supposant que les instructions sont équitablement réparti sur ces 8 catégories (arbitraire!!!), çà fait déjà en moyenne 20% de temps en plus. Soit en inversant pas 4 Mhz mais au max 4/(100+20%)= 3,33 Mhz. Héhé, comment arriver avec plein d'approximation à qqch de proche à ce qui se dit. Y'a d'autres calculs de fait, cf ceux de FutureOS.
A+

Globiboulga.

---

Tu as raison pour les 312 lignes. Cependant j'ai beau réfléchir aux explications de MadRam, je n'arrive toujours pas à comprendre POURQUOI c'est impossible de générer cette demi ligne supplémentaire. Avec quelques outs bien placés on peut générer un écran de 313 lignes, dont la dernière ne mesure que 32 NOPs au lieu de 64 ! On pourrait aussi générer un écran de 312 lignes, dont la dernière ferait 98 NOPs. Faudra que je teste ça à l'occasion.

Sinon tes remarques sont très intéressantes. Je peux les ajouter à l'article ?
Si oui dans les remerciements je met "Merci à Globiboulga", ou "Merci à Roudoudou" ? ;-)

---

(Je pense que tu seras déçu quand tu sauras qui je suis. Par avance désolé.)

Ce que tu décris (par bidouille créer une 313ème ligne de 32 ms), c'est joli, ça peut marcher, qu'en penses Madram?

Sans cette bidouille cependant, en hard donc, c'est par le registre 8 du CRTC qu'on est censé mettre en route l'entrelacé. Un test simple (c'est Yves qui me l'a fait de visu en meeting, merci à lui) c'est de comparer les débuts des 2 VBLs sur un même écran (reg4 (à confirmer) y'a vraiment de l'entrelacé que sur CRTC2, c'est à dire que les 2 (débuts des) VBLs sont décalées de 32ms (alors que sur CRTC "normal" les 2 VBLs commence à la même position horinzontale). Toujours de mémoire (c'est qu'il m'en a appris des choses Madram) cette feature (l'entrelacé) est en théorie une caractéristique "standart" du CRTC, ce qui permettrait de conclure que les CRTC0 ou 1 ou 3 ou 4 ne sont que de pâles imitations/copies/mal copiés, que seul le CRTC2 répond au cahier des charges d'un CRTC 6845 avec toutes ses fonctions dont l'entrelacé.:)

★ AMSTRAD CPC ★ DOWNLOAD ★

Aucun fichier de disponible:
» Vous avez des fichiers que nous ne possédons pas concernent cette page ?
★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » L'Instruction RST du Z80
» Coding » Z80: La division
» Coding » DZ80 (Mark Incley)
» Coding » Clefs1 11 - Jeu d'Instructions du Z80
» Coding » Menu - Z80
» Coding Src's » Relocating Z80 Code (The Amstrad User)
Je participe au site:
» Vous avez des infos personnel, des fichiers que nous ne possédons pas concernent ce programme ?
» 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 226 millisecondes et consultée 1759 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.