[DCMOTO] Amélioration de la fonction "Trace"

Couvre tous les domaines de l'émulation ou de la virtualisation ainsi que les discussions sur les divers outils associés.

Modérateurs : Papy.G, fneck, Carl

Daniel
Messages : 17288
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [DCMOTO] Amélioration de la fonction "Trace"

Message par Daniel »

Dans dcmoto certaines entrées-sorties ne sont pas complètement émulées, mais détournées par des instructions spéciales. Le nombre de cycles est une approximation très grossière de la fonction remplacée :

Code : Tout sélectionner

11EC : lecture bit cassette
11ED : lecture octet cassette
11EE : ecriture octet cassette
11F2 : ecriture secteur disquette
11F3 : reset contrôleur disquette
11F4 : formatage disquette
11F5 : lecture secteur
11F8 : lecture position souris
11F9 : lecture des boutons de la souris
11FA : sortie sur imprimante
11FC : lecture du clavier
11FD : commande du clavier
11FE : emission sur le nanoreseau
11FF : lecture position crayon optique
Le ralentissement de la trace dans un dossier compressé est difficile à éviter, sauf si on fait la trace en mémoire, mais on risque de manquer de place.

Avec la méthode actuelle (dans un fichier) la taille limite est la place disponible sur le disque dur.
Je peux ajouter une valeur (par exemple 32 secondes), ou changer de pas (par exemple 1, 4, 16, 64 secondes).
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7909
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [DCMOTO] Amélioration de la fonction "Trace"

Message par __sam__ »

Ah ok, ce sont les instructions de l'émulateur .. je me doutais bien d'un truc comme ca. Merci pour l'info. C'est étrange que je tombe dessus dans un jeu qui normalement ne fait plus d'entrées/sorties. Il faudra que j'investigue.

[EDIT] Ok, c'est la lecture du clavier dans le menu du jeu, donc c'est normal.. Plus tard il n'utilise que les manettes, c'est pour ca que je ne l'avais pas encore rencontré.

En tout cas le fichier de trace est très utile pour comprendre "ce qu'il se passe".
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Bentoc
Messages : 178
Inscription : 14 sept. 2019 13:35
Localisation : Var - France

Re: [DCMOTO] Amélioration de la fonction "Trace"

Message par Bentoc »

Toujours en rapport avec la trace, un petit problème du décompilateur :
EC1E est décompilé en LDD $02,X au lieu de LDD -$02,X
dcmoto.png
dcmoto.png (30.79 Kio) Consulté 6147 fois
Daniel
Messages : 17288
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [DCMOTO] Amélioration de la fonction "Trace"

Message par Daniel »

Encore une étourderie : le bit de signe d'un déplacement 5 bits est le bit 4, pas le bit 7 :!:
C'était bon dans le désassembleur 6309, mais pas dans le désassembleur 6809 :oops:
Merci encore une fois pour signalement des bugs 8)

Version 2021.06.28 de dcmoto ici : http://dcmoto.free.fr/emulateur/index.html
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7909
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [DCMOTO] Amélioration de la fonction "Trace"

Message par __sam__ »

Je pense être tombé sur un bug :(

En examinant une portion de code linéaire (sans saut dedans ou dehors), par exemple:

Code : Tout sélectionner

68D6 53         COMB                       2
68D7 43         COMA                       2
68D8 58         ASLB                       2
68D9 49         ROLA                       2 
, et en comptant le nb de passage dans chacune, je m'attendais à avoir la même chose partout: passer en 68D6 nous fait aussi exécuter 68D7, D8, D9. Or j'obtiens ceci:$ grep -e '^68D6' dcmoto_trace.txt |wc -l
9961
$ grep -e '^68D7' dcmoto_trace.txt |wc -l
9773
$ grep -e '^68D8' dcmoto_trace.txt |wc -l
9779
$ grep -e '^68D9' dcmoto_trace.txt |wc -l
9771[/code]C'est à dire qu'on a pas du tout les mêmes valeurs. C'est tout à fait illogique!

En analysant plus en détail la trace, je suis tombé sur ceci:

Code : Tout sélectionner

68D4 33CB       LEAU   D,U                 8        52697   D=FE73 X=9C46 Y=43C0 U=ABC7 S=9FF1 DP=00 CC=E9 | Banques: SYST=0 ROM=0 RAM=1F MEMO=0 VIDEO=1
68D6 53         COMB                       2        52705   D=FE73 X=9C46 Y=43C0 U=AA3A S=9FF1 DP=00 CC=E9 | Banques: SYST=0 ROM=0 RAM=1F MEMO=0 VIDEO=1
FAC1 86E7       LDA    #$E7                2        52724   D=FE73 X=9C46 Y=43C0 U=AA3A S=9FE5 DP=00 CC=F9 | Banques: SYST=0 ROM=0 RAM=1F MEMO=0 VIDEO=1
FAC3 1F8B       TFR    A,DP                6        52726   D=E773 X=9C46 Y=43C0 U=AA3A S=9FE5 DP=00 CC=F9 | Banques: SYST=0 ROM=0 RAM=1F MEMO=0 VIDEO=1
...
765 2A02       BPL    $6769               3        52840   D=C011 X=9C46 Y=43C0 U=AA3A S=9FE5 DP=67 CC=D8 | Banques: SYST=0 ROM=0 RAM=1F MEMO=0 VIDEO=1
6767 CB11       ADDB   #$11                2        52843   D=C011 X=9C46 Y=43C0 U=AA3A S=9FE5 DP=67 CC=D8 | Banques: SYST=0 ROM=0 RAM=1F MEMO=0 VIDEO=1
6769 F7E7CD     STB    $E7CD               5        52845   D=C022 X=9C46 Y=43C0 U=AA3A S=9FE5 DP=67 CC=D0 | Banques: SYST=0 ROM=0 RAM=1F MEMO=0 VIDEO=1
676C B6E7C6     LDA    $E7C6               5        52850   D=C022 X=9C46 Y=43C0 U=AA3A S=9FE5 DP=67 CC=D0 | Banques: SYST=0 ROM=0 RAM=1F MEMO=0 VIDEO=1
676F 3B         RTI                       16/4      52855   D=0122 X=9C46 Y=43C0 U=AA3A S=9FE5 DP=67 CC=D0 | Banques: SYST=0 ROM=0 RAM=1F MEMO=0 VIDEO=1
68D6 53         COMB                       2        52871   D=FE73 X=9C46 Y=43C0 U=AA3A S=9FF1 DP=00 CC=E9 | Banques: SYST=0 ROM=0 RAM=1F MEMO=0 VIDEO=1
68D7 43         COMA                       2        52873   D=FE8C X=9C46 Y=43C0 U=AA3A S=9FF1 DP=00 CC=E9 | Banques: SYST=0 ROM=0 RAM=1F MEMO=0 VIDEO=1
Ce qu'il se passe c'est qu'une interruption se produit durant le COMB en 68D6.. Bon oui c'est normal (le programme utilise les interruptions), mais.. mais à la sortie de l'interruption (RTI) la trace réaffiche le COMB, qui est donc compté deux fois là où le COMA qui suit ne l'est qu'une fois avec mes stats (wc -l) plus haut.

Alors est-ce normal d'avoir cette instruction dédoublée dans la trace ? (je ne pense pas que l'émulateur ait exécuté deux fois le COMB, le résultat aurait été catastrophique et j'aurais vu des anomales bien plus graves je pense.)
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
__sam__
Messages : 7909
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [DCMOTO] Amélioration de la fonction "Trace"

Message par __sam__ »

Je pense être tombé sur un bug, pas forcément gênant dans l'absolu sauf si comme on fait des stats ou que l'on essaye de comprendre un programme que l'on a pas écrit soi-même.

En examinant une portion de code linéaire (sans saut dedans ou dehors), par exemple:

Code : Tout sélectionner

68D6 53         COMB                       2
68D7 43         COMA                       2
68D8 58         ASLB                       2
68D9 49         ROLA                       2 
et en comptant le nombres de passages dans chacune, je m'attendais à avoir la +/- le même total partout: passer en 68D6 nous fait aussi exécuter 68D7, D8, D9. Or j'obtiens ceci:

Code : Tout sélectionner

$ grep -e '^68D6' dcmoto_trace.txt |wc -l
9961
$ grep -e '^68D7' dcmoto_trace.txt |wc -l
9773
$ grep -e '^68D8' dcmoto_trace.txt |wc -l
9779
$ grep -e '^68D9' dcmoto_trace.txt |wc -l
9771
C'est à dire qu'on a pas du tout les mêmes valeurs. C'est tout à fait illogique!

En analysant plus en détail la trace, je suis tombé sur ceci:

Code : Tout sélectionner

68D4 33CB       LEAU   D,U                 8        52697   D=FE73 X=9C46 Y=43C0 U=ABC7 S=9FF1 DP=00 CC=E9 | Banques: SYST=0 ROM=0 RAM=1F MEMO=0 VIDEO=1
68D6 53         COMB                       2        52705   D=FE73 X=9C46 Y=43C0 U=AA3A S=9FF1 DP=00 CC=E9 | Banques: SYST=0 ROM=0 RAM=1F MEMO=0 VIDEO=1

vvvvvvvvvvvvvvvv IRQ vvvvvvvvvvvvvvvv
FAC1 86E7       LDA    #$E7                2        52724   D=FE73 X=9C46 Y=43C0 U=AA3A S=9FE5 DP=00 CC=F9 | Banques: SYST=0 ROM=0 RAM=1F MEMO=0 VIDEO=1
FAC3 1F8B       TFR    A,DP                6        52726   D=E773 X=9C46 Y=43C0 U=AA3A S=9FE5 DP=00 CC=F9 | Banques: SYST=0 ROM=0 RAM=1F MEMO=0 VIDEO=1
...
6767 CB11       ADDB   #$11                2        52843   D=C011 X=9C46 Y=43C0 U=AA3A S=9FE5 DP=67 CC=D8 | Banques: SYST=0 ROM=0 RAM=1F MEMO=0 VIDEO=1
6769 F7E7CD     STB    $E7CD               5        52845   D=C022 X=9C46 Y=43C0 U=AA3A S=9FE5 DP=67 CC=D0 | Banques: SYST=0 ROM=0 RAM=1F MEMO=0 VIDEO=1
676C B6E7C6     LDA    $E7C6               5        52850   D=C022 X=9C46 Y=43C0 U=AA3A S=9FE5 DP=67 CC=D0 | Banques: SYST=0 ROM=0 RAM=1F MEMO=0 VIDEO=1
676F 3B         RTI                       16/4      52855   D=0122 X=9C46 Y=43C0 U=AA3A S=9FE5 DP=67 CC=D0 | Banques: SYST=0 ROM=0 RAM=1F MEMO=0 VIDEO=1
^^^^^^^^^^^^^ FIN IRQ ^^^^^^^^^^^^^^^

68D6 53         COMB                       2        52871   D=FE73 X=9C46 Y=43C0 U=AA3A S=9FF1 DP=00 CC=E9 | Banques: SYST=0 ROM=0 RAM=1F MEMO=0 VIDEO=1
68D7 43         COMA                       2        52873   D=FE8C X=9C46 Y=43C0 U=AA3A S=9FF1 DP=00 CC=E9 | Banques: SYST=0 ROM=0 RAM=1F MEMO=0 VIDEO=1
Ce qu'il se passe c'est qu'une interruption se produit durant le COMB en 68D6.. Bon oui c'est normal (le programme utilise les interruptions), mais.. mais à la sortie de l'interruption (RTI) la trace réaffiche le COMB, qui est donc compté deux fois là où le COMA qui suit ne l'est qu'une fois avec mes stats (wc -l) plus haut.

Alors est-ce normal d'avoir cette instruction dédoublée dans la trace ? (je ne pense pas que l'émulateur ait exécuté deux fois le COMB, le résultat aurait été catastrophique et j'aurais vu des anomales bien plus graves je pense.)
Dernière modification par __sam__ le 30 juin 2021 23:05, modifié 5 fois.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Daniel
Messages : 17288
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [DCMOTO] Amélioration de la fonction "Trace"

Message par Daniel »

Présenté comme ça, c'est effectivement un bug, mais c'est tellement gros qu'il faut que je me replonge dans le code pour trouver l'explication.
Réponse dès que possible...
Daniel
L'obstacle augmente mon ardeur.
Avatar de l’utilisateur
Silou78
Messages : 382
Inscription : 11 févr. 2017 14:54
Localisation : Yvelines (78)

Re: [DCMOTO] Amélioration de la fonction "Trace"

Message par Silou78 »

Y a-t-il eu une interruption entre 21h21 et 21h22 qui a fait que la trace du message se retrouve en double ? :D
Ou bien c'est le PC hôte sur lequel l'émulateur a été lancé qui a une fâcheuse tendance à doubler les traces et messages ? :?
Bon ok, je connais la sortie... :arrow: :mrgreen:
Sylvain
Daniel
Messages : 17288
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [DCMOTO] Amélioration de la fonction "Trace"

Message par Daniel »

Dans la trace, le COMB après le RTI est bon, par contre le COMB avant l'IRQ est en trop, il ne devrait pas être affiché. L'interruption est arrivée juste avant son exécution, il a donc été exécuté après le RTI, pas avant. Je vais corriger, ce n'est pas difficile.

Il y a une autre erreur au moins aussi grave : L'IRQ et les autres interruptions, FIRQ et NMI, ne sont pas des instructions, mais elles devraient figurer dans la trace, car elles consomment des cycles et modifient le registre S. Je vais les ajouter.

Je m'interroge sur le nombre de cycles exact pour une interruption. Y-a-t-il une description précise dans la documentation ? Est-ce la durée nécessaire pour empiler les registres ? Ou un peu plus ? La lecture de l'adresse contenue dans le vecteur d'interruption doit prendre quelques cycles. Actuellement il semble que dcmoto compte 21 cycles pour l'IRQ, est-ce exact ? Je n'arrive pas à retrouver comment cette valeur a été obtenue.
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7909
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [DCMOTO] Amélioration de la fonction "Trace"

Message par __sam__ »

Et bien il y a ce diagramme dans le manuel Motorola:
Image

Cependant la vraie info se trouve dans les bus timings:
10_0001.gif
10_0001.gif (54.73 Kio) Consulté 6013 fois
11_0001.gif
11_0001.gif (50.99 Kio) Consulté 6013 fois
[/url]

Donc je dirais FIRQ = 1 + (m+9-m) = 12 cycles, et IRQ = 1 + (m+18-m) = 19 cycles

PS: Fabien, tiens ce message qui contient la balise URL autour d'une balise attachement montre un bug (balise de fermeture visible, liens pas autour des fichiers attachés, etc)
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Daniel
Messages : 17288
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [DCMOTO] Amélioration de la fonction "Trace"

Message par Daniel »

Pour FIRQ, c'est 10 cycles, je crois.
Dans l'émulateur dcmoto j'ai bien programmé ces valeurs, par contre dans le compteur de cycles de l'outil de mise au point j'ai l'impression qu'il y a 21 cycles pour l'IRQ. C'est encore une autre erreur, je vais enquêter... Je préfère régler tous les problèmes avant de diffuser une nouvelle version.
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7909
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [DCMOTO] Amélioration de la fonction "Trace"

Message par __sam__ »

__sam__ a écrit : 01 juil. 2021 12:12 Donc je dirais FIRQ = 1 + (m+9-m) = 12 cycles
Daniel a écrit : 01 juil. 2021 12:58 Pour FIRQ, c'est 10 cycles, je crois.
Arf 1 + (m+9-m) = 10. Je ne sais plus compter !!!
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Daniel
Messages : 17288
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [DCMOTO] Amélioration de la fonction "Trace"

Message par Daniel »

Dcmoto version 2021.07.01 ici --> http://dcmoto.free.fr/emulateur/index.html

- Suppression de la ligne redondante (non exécutée) juste avant l'interruption.
- Ajout d'une ligne "interruption" précisant le type d'interruption et le nombre de cycles.
- Amélioration de petits détails, en particulier le décalage du nombre de cycles total depuis le début de la trace.
- Pour me faire pardonner les bugs, j'ai ajouté à la trace l'option "32 secondes".

La présentation a très peu changé, par contre il y a eu beaucoup de modifications dans le programme.
J'espère ne pas avoir introduit d'autres anomalies, mais rien n'est garanti.
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7909
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [DCMOTO] Amélioration de la fonction "Trace"

Message par __sam__ »

(bon comme les problèmes de MàJ de PC m'ennuient, je reviens à des trucs plus sympa :) )

J'ai aussi l'impression que tu as changé la valeur des registres. Avant on affichait les valeurs avant execution, mais à présent j'observe ceci:

Code : Tout sélectionner

BFAE BEC7B4     LDX    $C7B4               6       704656   D=000E X=8E44 Y=7A32 U=C312 S=BC63 DP=61 CC=D8 | Banques: SYST=0 ROM=0 RAM=1F MEMO=0 VIDEO=1
BFB1 EC81       LDD    ,X++                8       704664   D=1313 X=8E46 Y=7A32 U=C312 S=BC63 DP=61 CC=D0 | Banques: SYST=0 ROM=0 RAM=1F MEMO=0 VIDEO=1
ce qui indique qu'on retrouve la valeur de X après les ++, donc à la fin de l'instruction. Est-ce toujours le cas ou y a t'il des exceptions ?
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Daniel
Messages : 17288
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [DCMOTO] Amélioration de la fonction "Trace"

Message par Daniel »

Effectivement, il y a un décalage par rapport à la version précédente. L'instruction n'est plus affichée dans la trace avant son exécution, mais après. C'est pour que le nombre de cycles cumulés depuis le début de la trace (déterminé par l'émulateur après exécution de l'instruction) soit en phase avec le nombre de cycles de l'instruction (déterminé par le désassembleur). Et aussi pour que l'instruction ne soit pas affichée dans la trace si elle est précédée d'une interruption (pour corriger le bug précédent).

A partir de la version 2021.07.01 de dcmoto l'instruction, ainsi que la valeur des registres, est donc affichée dans la trace après exécution.

Le nombre de cycles estimé par le désassembleur est redondant, car le nombre de cycles réellement exécutés est connu, c'est la différence entre les cumuls de cycles de deux lignes successives. J'ai laissé l'estimation du désassembleur, c'est un moyen de la contrôler. Dans le cas des branchements longs, le désassembleur donne les deux valeurs (sans branchement / avec branchement), par contre la différence des cycles cumulés donne le nombre de cycles réel.
Daniel
L'obstacle augmente mon ardeur.
Répondre