Question au sujet de timer

Question au sujet de timer

par Antoine Jean Pierre Masanet,
Number of replies: 3

1) Dans timer_bus_listener, pour le cas de REG_TAC, nous sommes supposé appeler timer_state avec le previous state et le state actuel. Cependant, il ne semble pas possible d'obtenir le previous state étant donne que l'écriture a l'adresse REG_TAC a deja été effectue en memoire. Sommes-nous donc suppose rajouter un bit_t dans la structure timer qui retient le previous state pour pallier a cela?

2) Dans le test timer_cycle_exec, une fois que le secondary timer repasse 0xFF, le timer lance une interruption et va donc écrire a l'adresse pointé par cpu->IF .Or, il nous semble que ce pointeur, n'est initialise que lorsque qu'on cree le component register dans gameboy_create. Le test n'appelant gameboy_create, comment la memoire pointée par cpu->IF est cree?

Merci d'avance les éclaircissement,

Antoine

In reply to Antoine Jean Pierre Masanet

Re: Question au sujet de timer

par Jean-Cédric Chappelier,
  1. C'est une excellent question !
    En fait, dans notre spécification (mais ce n'est peut être pas dit assez clairment), le « old state » c'est l'état avant traitement de l'interruption TAC, mais après l'écriture en effet ; puisqu'en effet c'est dans le timer_bus_listener que nous vous demandons de faire cela ;
    Donc, non pas d'ajout à la struct pour récupérer l'état avant l'écriture sur le bus.
    (ceci dit, le comportement précis du timer est plus complexe (cf https://gbdev.gg8.se/wiki/articles/Timer_Obscure_Behaviour ) mais nous n'allons pas aussi loin.

  2. je ne comprends pas ; dans ce test en question, nous gérons cpu.IF directement ; voulez-vous dire qu'il n'est pas mappé sur le bus ? (mais nous ne testons pas le bus à cet endroit)
In reply to Jean-Cédric Chappelier

Re: Question au sujet de timer

par Antoine Jean Pierre Masanet,

1. Merci c'est plus clair maintenant

2. Apres relecture de notre code, l'erreur venait de notre cote, nous avions pris IF comme un pointeur sur un data_t qui pointe au meme endroit que le bus a l'adresse correspondante et non un data_t sur lequel le bus pointe.

In reply to Antoine Jean Pierre Masanet

Re: Question au sujet de timer

par Antoine Mehdi De Gendt,

Bonjour,

Suite à la question d'un groupe, voici d'autres précisions sur le timer_bus_listener.

Dans l'absolu il serait mieux d'avoir un old_state dans le struct gbtimer_t. Ce serait nécessaire pour une implémentation plus précise du timer (cf le lien dans le post plus haut).

Cependant, pour ce projet cela ne change rien. Il est inutile pour notre implémentation de la gameboy d'avoir un champ old_state dans gbtimer_t.

Ainsi, en cas d'écriture sur REG_DIV l'appel à timer_incr_if_state_change peut conduire à un incrément du timer secondaire. Mais, en cas d'écriture à l'adresse REG_TAC cet appel ne fera jamais rien.