__sam__ a écrit : ↑03 févr. 2021 22:51
Reste à présent à retrouver à quel endroit le DP diverge entre les deux émulateurs.
Bon j'ai pas trouvé l'endroit, mais par contre l'examen de la routine IRQ du TO7/70 est instructive:
Code : Tout sélectionner
FB73 B6E7C0 LDA $E7C0 Test TC0 (interruption timer)
FB76 2B04 BMI $FB7C
FB78 6E9F6021 JMP [$6021] Non ==> hook en IRQ
FB7C 44 LSRA Oui ==> possible interruption timer
FB7D 2501 BCS $FB80 A=$81 ?
FB7F 3B RTI Non ==> on arrive jamais là
FB80 B66019 LDA $6019
FB83 8520 BITA #$20 TimePT actif ?
FB85 2704 BEQ $FB8B Non ==> ignore
FB87 6E9F6027 JMP [$6027] Oui ==> ok routine timer utilisateur
De ce qu'on remarque c'est que DP n'est pas modifié dans la ROM TO7/70 (contrairement au TO8 où j'ai j'avais vu qu'on y mettait un $E7 fort utile que j'exploite). Donc la routine timer utilisateur récupère celui qu'on avait avant l'IRQ. Par chance DP vaut typiquement $E7 dans le programme principal et donc quand l'interruption arrive, on a DP=$E7. Ca marche.
Par contre si une routine appelée (au pif GETC) fait passer temporairement DP à $60 et que, pas de chance, l'interruption timer se produit pile à ce moment là(*), la routine timer utilisateur se retrouve avoir un DP pointant ailleurs que la zone des registres I/O. Bim freeze!!
___
(*) ce moment là est dans la routine anti-rebond de GETC
Code : Tout sélectionner
F1C0 8E0271 LDX #$0271 3
F1C3 301F LEAX -$01,X 5
F1C5 26FC BNE $F1C3 3
qui fait une boucle d'attente d'exactement 5ms (200hz), ce qui est nettement plus long que la période du timer qu'on utilise (880hz ==> 1.1ms). Bref: cette boucle qui s'execute avec DP=$60 et les interruptions autorisées provoquera un freeze.
La cause racine du bug est trouvée!! Clairement le bug est dans le player qui assume que les routines TimePT ont toujours DP=$E7. C'est vrai sur TO8/TO9 et pas sur TO7.
Mais cela n'explique pas pourquoi sous DCMoto on arrive pas à provoquer cela par appui sur une touche car la boucle de 5ms est bien présente en $F1C0 et le CCR est identique pour les deux émuls (interruptions autorisées (**)). Pourtant l'interruption timer n'est pas levée durant ces 5ms (200hz) sous DCMOTO.
Daniel, y a t'il une particularité dans l'émulation de l'interruption timer sous DCMOTO qui ferait qu'elle ne se lève pas à ce moment de la ROM ? (genre sa précision ne serait que de 10ms, mais j'en doute, la musique serait très imprécise)
____
(**) Ce truc là est bizarre car fort justement dans le code de getc de la démo on désactive les interruptions quand on appelle GETC mais ca sert à rien car visiblement en rom les interruptions son ré-activées peu avant le test anti-rebond.