Logicielsmoto.com
http://www.logicielsmoto.com/phpBB/

Le fonctionnement du Timer / 6846
http://www.logicielsmoto.com/phpBB/viewtopic.php?f=2&t=450
Page 1 sur 1

Auteur:  Tomix3 [ 08 Aoû 2012, 14:18 ]
Sujet du message:  Le fonctionnement du Timer / 6846

Bonjour,

De temps à autre, je peaufine mon émulateur To9 sur Amiga. Il se trouve que j'ai un peu de temps aujourd'hui pour m'attaquer à une bizarrerie du Timer que j'ai détectée il y a X temps grâce au tortur'test de sam (la disquette des guignols).

J'ai pu constater que le Timer mettait 8 cycles avant de s’enclencher à partir du moment où on lui en donne l'ordre. Et DCMOTO émule ce même tempo.
Quand j'ajoute ces 8 cycles, le test sonore de Sam fonctionne impecc sur mon émulateur.

Pourtant mon timer est bien implémenté. C'est-à-dire que je suis, en principe, rigoureusement la doc de Motorola. Les sources de MAME concernant le 6846, vont dans le même sens que moi.

Bref, où est-ce qu'on peut trouver une info officielle sur ce tempo de 8 cycles?
Est-ce qu'on doit appliquer ce même tempo lors du recycle (en mode recycle)?
D'autres trucs à prendre en compte?
Peut-être ai-je manqué une ligne dans la doc de Motorola...

Merci tout le monde.

Auteur:  Tomix3 [ 14 Nov 2012, 11:39 ]
Sujet du message: 

J'ai enfin résolu mon problème.
Réponse ici: http://forum.system-cfg.com/viewtopic.p ... 971#p65971

Auteur:  Samuel Devulder [ 19 Nov 2012, 00:11 ]
Sujet du message: 

Tomix3 a écrit:
J'ai enfin résolu mon problème.
Réponse ici: http://forum.system-cfg.com/viewtopic.p ... 971#p65971

Il n'y a donc pas de retard de 8 cycles? Vas y racontes!

Auteur:  gilles [ 19 Nov 2012, 20:30 ]
Sujet du message: 

n'est ce pas une simple question de respect d'horloge réélle à chaque étape du fonctionnement du 6809 lui même?
ou plus précisement la prise en compte du moment réél d'initialisation du 6846 lors de l'écriture du registre. Généralement (mais pas tous) les émulateurs mémorisent le cycle entre chaque instruction, sauf que le moment réél d'écriture du registre n'est pas le début de l'instruction d'écriture mais on se situe plus proche de la fin, alors pour émuler on corrige comme on peut... et on rajoute quelques cycles à droite à gauche en se basant sur un exemple réél.

Auteur:  Fool-DupleX [ 20 Nov 2012, 12:27 ]
Sujet du message: 

hé mais y'a pas la réponse sur system-cfg, juste une phrase pour dire que t'as trouvé la réponse !

Alors c'est quoi la raison technique exacte ?

Auteur:  Tomix3 [ 21 Nov 2012, 12:05 ]
Sujet du message: 

Salut tout le monde,

Le problème principal venait de moi, donc mea-culpa. Et il n'était pas de 8 cycles (mauvaise interprétation de ma part puisque j'y voyais un pb spécifique au 6846) mais d'un nombre plutôt variable de cycles dépendant de l'instruction exécutée avant le traitement du timer. C'est donc spécifique à mon émulateur.

Une fois mon problème fixé, j'ai établi quelques benchs sur mon vrai To9 avec des relevés de compteur. Et à force de tâtonner, j'ai fini par comprendre comment faire les choses sans faire de rustine. Ceci dit, j'ai pas encore fait le tour de tous les cas. Je dois encore faire d'autres benchs sur mon To9 dès que j'y aurai accès.

Je livre ici mon histoire, c'est-à-dire ce que j'ai appris mais que vous savez peut-être déjà ou pas. Au moins, ça laisse une trace écrite pour ceux qui chercheraient:

- Comme @gilles l'a écrit, pour bien compter, il faut savoir quand relever les cycles pour agir sur le timer. Donc, pour chaque instruction LD, ST, PSH, ADD, etc., il faut prendre un cycle par accès bus, en fin d'instruction (façon de parler). En clair, si on fait un 'LDA $e7c6', le registre du timer, est lu 1 cycle avant la fin de l'instruction. Dans le cas d'un 'LDD $e7c6', '$e7c6' est lue 2 cycles avant la fin de l'instruction. Et '$e7c7' est lue un cycle avant la fin. Idem dans le cas d'un STA ou un STD. Donc, j'ai modifié mes instructions de lecture/écriture en conséquence.

- Comme c'est marqué dans la doc, le timer utilise un registre temporaire pour bien fonctionner sur un proc 8 bits. Quand on fait un 'STD $e7c6', le 6809 écrit la donnée en big endian. Le timer mets d'abord la valeur d'$e7c6 dans un registre temporaire, et attend la donnée d'$e7c7 pour recomposer la valeur d'initialisation du timer avec le registre temporaire. C'est l'écriture dans $e7c7 qui change la valeur du latch. Et c'est donc l'écriture dans cette adresse qui peut enclencher la réinitialisation du timer. L'écriture dans $e7c6 ne produit aucune action sur le timer.

- A l'inverse, quand on fait un 'LDD $e7c6', il faut savoir que le timer fait un relevé de compteur à la lecture d'$e7c6. Et il stock le poids fort qui sera donné par $e7c7, dans un registre temporaire (probablement le même que pour l'écriture mais je dois faire un test sur mon to9 pour le vérifier). De cette manière, quand le 6809 lit $e7c7 juste après, le relevé est cohérent. En effet, imaginons que le décompteur soit à $0100 au moment de la lecture d'$e7c6 via un LDD; un cycle se passe et la valeur passe virtuellement à $00ff; le 6809 lit ensuite $e7c7 et prend la valeur $ff; au final, on aurait $01ff dans le registre 'D'. D'où l'utilité du registre temporaire. J'ai fait le test et, APRES avoir lu $e7c6, c'est toujours la même valeur que l'on lit dans $e7c7. C'est bien la lecture d'$e7c6 qui enclenche l'initialisation d'$e7c7. (La plupart des émulateurs se gourre ici)


Je me suis penché ensuite sur la problématique du décomptage 1 millionième/1 huitième et comment ce flag était pris en compte (bit3 d'$e7c5).
Après beaucoup de tests, la solution était simple. Ce flag est pris en compte au moment de l'écriture en $e7c7 (mais j'ai encore des conditions à vérifier dans ce cas). Il est également pris en compte quand le décompteur est en fonctionnement et que l'on change le flag d'$e7c5 tout en gardant le bit0 à 0. En revanche, il n'est pas pris en compte quand vous allumez le décomptage (bit0 à 0) alors que le décompteur était à l'arrêt juste avant (bit0 à 1).

J'ai appris enfin un truc que je ne savais pas: on peut changer la valeur d'initialisation du timer pendant un décomptage. Par contre, il y a des conditions. J'ai implémenté les choses comme dans le code de MESS mais j'attends de faire des tests sur mon To9, pour faire le tour du sujet. A moins que quelqu'un d'autre ici s'en charge...

Voilà pour le moment. J'espère que c'est au moins clair, sinon instructif pour vous.

a+

Auteur:  gilles [ 22 Nov 2012, 21:32 ]
Sujet du message: 

la fin est un peu surprenante, je m'attendais plutôt à l'inverse, c'est à dire une prise en compte du multiplicateur uniquement au début d'un cycle de décomptage et pas en cours.

Page 1 sur 1 Heures au format UTC + 1 heure
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/