Logicielsmoto.com

Nous sommes le 23 Juil 2019, 06:31

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 5 messages ] 
Auteur Message
 Sujet du message: Bug emulation instruction CLR
MessagePosté: 28 Mai 2015, 23:05 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1110
Localisation: Brest
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 2729 fois ]
Fichier(s) joint(s):
dcmoto.gif
dcmoto.gif [ 11.64 Kio | Vu 2729 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 2728 fois ]


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

_________________
Good morning, that's a nice Tnetennba


Dernière édition par Samuel Devulder le 28 Mai 2015, 23:41, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
MessagePosté: 28 Mai 2015, 23:30 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1110
Localisation: Brest
L'explication se trouve dans le datasheet du 6809(e)
Fichier(s) joint(s):
expliq.gif
expliq.gif [ 81.62 Kio | Vu 2728 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.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 29 Mai 2015, 12:42 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1054
Localisation: France (24)
... 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 ?

_________________
Marche a suivre pour s'inscrire sur ce forum
Do not forget to contact one of the administrators to validate your registration.
Le site des démos de Puls
L'émulateur Teo


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 29 Mai 2015, 14:43 
Hors ligne

Inscription: 21 Avr 2010, 10:59
Messages: 230
testé sur TEO 1.8.3, pas de bug.

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


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 29 Mai 2015, 15:45 
Hors ligne

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

_________________
Good morning, that's a nice Tnetennba


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

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


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