Logicielsmoto.com

Nous sommes le 16 Oct 2019, 20:20

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 7 messages ] 
Auteur Message
MessagePosté: 08 Aoû 2012, 14:18 
Hors ligne

Inscription: 27 Avr 2006, 09:04
Messages: 101
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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 14 Nov 2012, 11:39 
Hors ligne

Inscription: 27 Avr 2006, 09:04
Messages: 101
J'ai enfin résolu mon problème.
Réponse ici: http://forum.system-cfg.com/viewtopic.p ... 971#p65971


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 19 Nov 2012, 00:11 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1112
Localisation: Brest
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!


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 19 Nov 2012, 20:30 
Hors ligne

Inscription: 21 Avr 2010, 10:59
Messages: 230
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.

_________________
http://www.alternative-system.com


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 20 Nov 2012, 12:27 
Hors ligne

Inscription: 06 Juin 2004, 08:23
Messages: 373
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 ?


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 21 Nov 2012, 12:05 
Hors ligne

Inscription: 27 Avr 2006, 09:04
Messages: 101
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+


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 22 Nov 2012, 21:32 
Hors ligne

Inscription: 21 Avr 2010, 10:59
Messages: 230
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.

_________________
http://www.alternative-system.com


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 7 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 4 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages
Vous ne pouvez pas joindre des fichiers

Rechercher:
Aller à:  
cron
Développé par phpBB® Forum Software © phpBB Group
Traduction par phpBB-fr.com