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

Bug emulation instruction CLR
http://www.logicielsmoto.com/phpBB/viewtopic.php?f=2&t=523
Page 1 sur 1

Auteur:  Samuel Devulder [ 28 Mai 2015, 23:05 ]
Sujet du message:  Bug emulation instruction CLR

Considérons la boucle "loop2" dans le code ASM suivant
Code:
       org    $9000
       
ini    ldb    #15
       stb    ,-s
loop1  ldb    #27
       jsr    $E803
       ldb    ,s
       cmpb   #7
       ble    *+4
       addb   #$20
       addb   #$50
       jsr    $E803
       ldb    #$20
       jsr    $E803
       dec    ,s
       bne    loop1
       
       ldb    ,s+
       stb    $E7DB
loop2  stb    $E7DA       
       clr    $E7DA
       addb   #16
       bne    loop2
       rts

A la lecture, il semble évident que ce code envoie $00n0 à la palette avec n=0..15 et qu'il doit donc produire un dégradé de vert.

C'est d'ailleurs ce que font les émulateurs:
Fichier(s) joint(s):
TEO.gif
TEO.gif [ 5.12 Kio | Vu 13035 fois ]
Fichier(s) joint(s):
dcmoto.gif
dcmoto.gif [ 11.64 Kio | Vu 13035 fois ]

Or un vrai thomson ne fait pas ca du tout. Le seul émulateur qui reproduit fidèlement le bon comportement est MESS:
Fichier(s) joint(s):
MESS.gif
MESS.gif [ 7.69 Kio | Vu 13034 fois ]


On voit que l'on est loin du dégradé, ce qui semble illogique.

Auteur:  Samuel Devulder [ 28 Mai 2015, 23:30 ]
Sujet du message:  Re: Bug emulation instruction CLR

L'explication se trouve dans le datasheet du 6809(e)
Fichier(s) joint(s):
expliq.gif
expliq.gif [ 81.62 Kio | Vu 13034 fois ]

J'ai indiqué le problème en rouge.

On voit que les instructions ASL,ASR,COM,DEC,INC <memoire> etc commencent par un cycle de lecture de mémoire, puis sont suivi par l'opération en interne (avec don't care sur le bus à ce moment là) et terminent par un cycle d'écriture en mémoire. Tout ca pour 6 cycles (2 cycles par étapes).

C'est parfait, mais là où il y a un truc pas cool sur le 6809 est que CLR <memoire> est construit sur le même schéma. Cela signifie qu'il s'exécute lui aussi en 6 cycles, mais pire que cette instruction qui a priori ne fait qu'une simple écriture, effectue systématiquement une lecture en première étape.

Sur de la mémoire classique cela n'a pas d'influence, sauf que c'est plus lent qu'un STB <memoire> qui ne nécessite que 4 cycles.

Mais sur le circuit palette en $E7DA, cela a un effet de bord rigolo: tout accès à ce registre incrémente automatiquement $E7DB. Donc comme CLR effectue 2 accès, il incrémente $E7DB deux fois. Résultat: alors qu'on pense écrire 0 à l'offset "n" positionnant $E7DB à "n+1", on ne touche pas à la valeur à l'offset "n", mais on écrit 0 à l'offset "n+1", laissant $E7DB à la valeur "n+2".

Avec le prog de test, cela produit le motif exposé dans MESS. Je pense que MESS émule correctement le cycle de lecture de l'instruction CLR, ce que ne font ni TEO ni DCMOTO.

Je pense que cette différence entre émulateur et vraie machine se répare facilement en ajoutant un accès en lecture à l'adresse mémoire pour l'émulation de l'instruction CLR.

Auteur:  Prehisto [ 29 Mai 2015, 12:42 ]
Sujet du message:  Re: Bug emulation instruction CLR

... pourtant Teo lit la donnée avant de l'écrire :
Code:
static void clrm(void) {    /* N0Z1V0C0 */
    switch (step) {
        /* [Data : EA] */
        case 0x21 : value=LoadByte(address);
                    break;
        /* [Don't Care] */
        case 0x22 : break;
        ... etc ...

Ne crois-tu pas que cela a plutôt quelque chose à voir avec le processus de rafraîchissement de l'écran ?

Auteur:  gilles [ 29 Mai 2015, 14:43 ]
Sujet du message:  Re: Bug emulation instruction CLR

testé sur TEO 1.8.3, pas de bug.

Auteur:  Samuel Devulder [ 29 Mai 2015, 15:45 ]
Sujet du message:  Re: Bug emulation instruction CLR

Prehisto a écrit:
... pourtant Teo lit la donnée avant de l'écrire :
...
Ne crois-tu pas que cela a plutôt quelque chose à voir avec le processus de rafraîchissement de l'écran ?

En fait c'est de ma faute... pour le devel j'utilise une vieille version de TEO qui contient le bug absent de la 1.8.3.

Bon reste plus qu'à optimiser en taille un calcul de sinus*63 et je pourrais proposer bientôt un nouveau quizz "que fait ce programme". Le résultat sera cependant moins joli que sur PC car la palette n'est pas assez linéaire dans le dégradé thomson. Mais bon ce sera aussi rapide et peut-être plus petit, c'est déjà ca.

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