Le TRS-80 ne dispose pas d’horloge en temps réel, il n’est donc pas aisé d’avoir une référence temporelle précise.
Sachant que la synchronisation verticale est à 60Hz précise, si on compte ces synchronisations il est possible de compter précisément le temps. Le comptage est ici validé par l’intermédiaire d’un drapeau sur le registre CTRL.
Si les poids faibles comptent de 0 à 5, on obtient un diviseur par 6 ce qui permet de compter à la cadence de 60/6 = 10 Hz donc incrémenter le compteur tous les dixièmes de secondes.
CPLD DONNEES
CTRL_TPS.t = 'b'1 ; /* DIVISEUR PAR 6, LE POIDS FAIBLE SIGNALE LES SYNCHRO */
TPS_D1.t = CTRL_TPS ;
TPS_D2.t = TPS_D1 & CTRL_TPS ;
CTRL_TPS.ck = !VGA_VSYNC ;
TPS_D1.ck = !VGA_VSYNC ;
TPS_D2.ck = !VGA_VSYNC ;
CTRL_TPS.ar = TPS_D2 & TPS_D1 ;
TPS_D1.ar = TPS_D2 & TPS_D1 ;
TPS_D2.ar = TPS_D2 & TPS_D1 ;
TPS_D3.t = TPS_D2 & !TPS_D1 & CTRL_TPS ; /* COMPTER DE DIXIEMES DE SECONDES */
TPS_D4.t = TPS_D3 & TPS_D2 & !TPS_D1 & CTRL_TPS ;
TPS_D5.t = TPS_D4 & TPS_D3 & TPS_D2 & !TPS_D1 & CTRL_TPS ;
TPS_D6.t = TPS_D5 & TPS_D4 & TPS_D3 & TPS_D2 & !TPS_D1 & CTRL_TPS ;
TPS_D7.t = TPS_D6 & TPS_D5 & TPS_D4 & TPS_D3 & TPS_D2 & !TPS_D1 & CTRL_TPS ;
TPS_D3.ck = !VGA_VSYNC ;
TPS_D4.ck = !VGA_VSYNC ;
TPS_D5.ck = !VGA_VSYNC ;
TPS_D6.ck = !VGA_VSYNC ;
TPS_D7.ck = !VGA_VSYNC ;
Les poids faibles CTRL_TPS, TPS_D1 et TPS_D2 permettent de voir les sixièmes d’horloges. A partir de TPS_D3, on peut lire les dixièmes de secondes. Afin de faciliter l’exploitation, on limitera ce compteur à la valeur de 29,9 il bouclera donc toutes les 3,0s.
CPLD ADRESSES
TPS_D3.ar = TPS_D7 & TPS_D6 & TPS_D5 & !TPS_D4 & TPS_D3 ;
TPS_D4.ar = TPS_D7 & TPS_D6 & TPS_D5 & !TPS_D4 & TPS_D3 ;
TPS_D5.ar = TPS_D7 & TPS_D6 & TPS_D5 & !TPS_D4 & TPS_D3 ;
TPS_D6.ar = TPS_D7 & TPS_D6 & TPS_D5 & !TPS_D4 & TPS_D3 ;
TPS_D7.ar = TPS_D7 & TPS_D6 & TPS_D5 & !TPS_D4 & TPS_D3 ;
Il peut maintenant être souhaité de remettre à zéro ce compteur, on peut le rendre possible en se servant d’un drapeau du registre CTRL. La procédure est donc d’arrêter le comptage (CTRL_TPS = ‘0’) Faire passer le compteur à zéro (CTRL_TPR = ‘1’) puis relancer le comptage (CTRL_TPS = ‘1’). Le drapeau de remise à zéro est fugitif et automatiquement replacé à ‘0’.
CPLD DONNEES
CTRL_TPR.ar = CTRL_TPR ;
Les signaux de réinitialisation des bascules deviennent donc :
CPLD DONNEES
CTRL_TPS.ar = TPS_D1 & TPS_D2 # CTRL_TPR ;
TPS_D1.ar = TPS_D7 & TPS_D6 & TPS_D5 & !TPS_D4 & TPS_D3 # CTRL_TPR ;
TPS_D2.ar = TPS_D7 & TPS_D6 & TPS_D5 & !TPS_D4 & TPS_D3 # CTRL_TPR ;
TPS_D3.ar = TPS_D7 & TPS_D6 & TPS_D5 & !TPS_D4 & TPS_D3 # CTRL_TPR ;
TPS_D4.ar = TPS_D7 & TPS_D6 & TPS_D5 & !TPS_D4 & TPS_D3 # CTRL_TPR ;
TPS_D5.ar = TPS_D7 & TPS_D6 & TPS_D5 & !TPS_D4 & TPS_D3 # CTRL_TPR ;
TPS_D6.ar = TPS_D7 & TPS_D6 & TPS_D5 & !TPS_D4 & TPS_D3 # CTRL_TPR ;
TPS_D7.ar = TPS_D7 & TPS_D6 & TPS_D5 & !TPS_D4 & TPS_D3 # CTRL_TPR ;
Pour être précis, comme nous n’avons pas choisi une horloge de 25,175MHz, nous avons en fait :
$\displaystyle \frac{15000000 Hz}{480 pixels . 524 lignes} = 59,64 Hz$ soit une précision de $\displaystyle \frac{59,64}{60} = 0,994$ soit 0,6%
Pour plus de précision, il faudrait compenser en ne scannant que 521 lignes pour obtenir une précision de 0,03% d'erreur et une fréquence verticale de 59,98Hz.