Daniel a écrit :Quand j'ai commencé l'émulation des TO, j'avais seulement le manuel technique TO9/TO8/TO9+ qui est très laconique à propos du 6846.
Le manuel technique TO7 contient beaucoup plus d'infos extraites du datasheet.
J'ai fait pas mal d'impasses sur le positionnement des bits du registre CSR, et surtout une grosse erreur : le bit CSR0 de l'interruption timer est positionné mais jamais remis à zéro. C'est probablement la cause de l'anomalie sur les fréquences.
oui très probablement.
Il faut que je reprenne ce point avec les informations données par la datasheet. Il y a 4 conditions provoquant la remise à zéro, pas très simples. La quatrième, en particulier est assez complexe.
J'ai toujours trouvé la datashett 6846 et les autres docs décrivant le timer pas claires du tout, ce qui fait croire à une apparente complexité qui est je pense factice. Ce truc doit faire des choses très simple (il n'y a pas des zilions de transistors là dedans pour s'occuper de la partie timer), mais comme c'est expliqué avec le pieds on ne trouve qu'une suite de cas particuliers ou de redondance inutiles. Ainsi comment interpréter ceci
mode continue si TCR3=0, TCR7=1, TCR5=0
Dans ce mode un signal carré est généré sur la sortie 19 (CTO), si cette sortie est validée par TCR7 à 1
Ben oui, mais on est précisément dans le cas TCR7=1. A quoi sert cette info redondante ???
Autre exemple de spec "par exception qui n'en sont pas mais du coup on ne comprends pas pourquoi parler de ca"
- en mode monocoup normal.
A deux exceptions près ce mode est identique au précédent (sam: le mode continu).
1) (sam: détail de la 1ere exception)
2) Le TO7 n'est pas concerné par la 2eme exception (sam: quelle 2eme exception, on en a listé qu'une seule????) puisque les deux entrées CTG-bar et CTC-bar sont au 0V
Pfff... beau b*rdel cette partie de la doc
Cependant la doc indique précisément ce qui fait passer CSR0 à 0:
Le bit CSR0 peut être remis à 0 par:
1) reset externe ou interne (TCR0 à 1) (sam: donc poke &hE7C5,peek(&hE7C5) or 1, le truc qui stoppe le timer)
2) initialisation du compteur
3) commande de lecture du compteur précédé d'une lecture de CSR pendant que CSR0 est à 1. (Sam: c'est ca que je fais: je lis $E7C0 (CSR) jusqu'à ce que le CSR0 est à 1, puis je fais un CMPX (ou D) $E7C6 qui va lire le compteur).
Sauf que le point (2) est mystérieux.
La doc indique ailleurs
Le contenu des registres tampon n'est transféré dans le compteur que lorsqu'on lui en donne l'ordre. Dans le TO7 cet ordre ne peut venir que de la mise à 1 du registre TCR0 (sam: c'est le point 1 ca, encore une redondance inutile) ou avec une commande d'écriture des registres tampons (en fonction du mode (sam: heu ??? ca sert à quoi cette précision compliquer la compréhension???).
Bref je pense que lorsqu'ils parlent du point 2) ils ne font référence qu'à l'écriture dans le registres $E7C7 ($E7C6 ne copie pas le latch, c'est sur la partie basse qu'il est copié) car le point 1) est déjà couvert.
Je suis sur que si on voyait le code Verilog du 6846, ca serait beaucoup plus clair que ces docs verbeuses, redondantes, incomplètes et mal écrites (IMHO).
Tomix avait trouvé certains aspect intéressants du 6846 pour son emul:
http://www.logicielsmoto.com/phpBB/view ... 3581#p3581
A défaut de verilog, le code le plus exact qui existe (car utilisé pour d'autres machines) doit être celui de MAME:
http://mamedev.org/source/src/mess/mach ... 846.c.html
De ce que j'en comprends c'est que lors de la lecture de CSR ($E7C0), les bits CSR0-2 sont indiqués comme devant être passé à 0 le moment venu. Pour CSR0 cela se fait lors de la prochaine lecture du compteut en $E7C6 ou $E7C7 (au 1er des deux lu).