J'ai enfin pu utiliser le code que j'ai fait en utilisant l'émulateur DCMOTO (émulateur génial, merci Daniel) sur le vrai matériel car j'ai enfin reçu le sddrive (encore une fois, merci Daniel !).
J'ai découvert un comportement sur l'émulateur qui n'est pas similaire à la vraie machine et cela concerne le comportement du timer. J'ai trouvé du code reproductible pour tester à la fois sur le matériel réel et sur l'émulateur (to7-70) et je peux confirmer dans mon cas que le comportement est différent.
Le cas est le suivant :
- J'utilise mon propre code de vecteur d'interruption, dans lequel je change la fréquence du timer dans le temps ; voici mon code de vecteur d'interruption :
Code : Tout sélectionner
; le vecteur d'interruption réel
intr
dec .waiter ; intervalle pour changer le timer
bne .ok
lda #255
sta .waiter
ldd .myfreq ; charger la fréquence actuelle
subd #50 ; rendre plus rapide
std .myfreq
.smc
std TMRCP
.ok
.intrc
ldb $E7C3 ; si vous gardez ceci, mais désactivez la ligne 74, l'émulateur fonctionne, mais pas le matériel.
lda $E7C1 ; poke le soundcbip
eora #8
sta $E7C1
; lda TMRCP ; effacer le contrôleur de temporisation
rti
.waiter dc.b 255
.myfreq dc.w 2499
Si on `décompose' ensuite `lda TMRCP', cela fonctionne sur le vrai matériel. De cet exemple, je déduis que l'utilisation du registre $E7C3 sur l'émulateur a un effet secondaire lié au registre TMRCP, qui n'est pas présent sur le matériel réel.
Ci-joint vous trouverez un fichier zip avec quelques trucs :
- code source complet de l'exemple ci-dessus (assemblé avec vasm6809)
- 3 binaires (fd/sd) que l'on peut tester sur le matériel réel et sur l'émulateur pour vérifier s'ils se comportent de la même manière ; mais vous pouvez tout aussi bien changer le code source ou créer l'exemple vous-même.
J'espère que vous pourrez comprendre pourquoi l'émulateur se comporte différemment.
Bien à vous,
Wietze
p.s. J'espère que ce qui précède est clair, je peux fournir une vidéo du comportement réel du matériel si vous le souhaitez.