Set IME and IE

Set IME and IE

by Raoul Alfred Gerber -
Number of replies: 3

Bonjour,

Comme rapidement évoqué à la fin du meeting, nous ne savons pas ce qui est censé set-up IME et IE à quelque chose d'autre que 0 avant la boucle 9D/9F de la bootrom (mentionné aussi dans ce sujet: https://moodlearchive.epfl.ch/2019-2020/mod/forum/discuss.php?d=36268#p74476)

Notre statut actuel:

2 personnes en charge du projet + la donnée ont confirmé que à l'initialisation, ces variables sont = 0.

Ni EDI, ni RETI ne sont jamais appelées dans la bootrom (confirmé par 1 personne en charge du projet, et une dissection des instructions de la bootrom: les bytes FB et F3 y apparaissent, mais en tant que paramètres de l'opcode les précédant)

Il n'est pas censé y avoir de fonctions qui les set explicitement à quelque chose d'autre que 0, ce sont des instructions qui sont censés le faire telles que EDI ou un store à l'address de IE (plus ou moins confirmé par 1-2 personnes en charge du projet)

Nous ne voyons donc pas quelle autre possibilité il existe pour les set à leurs valeurs actives.

Merci

In reply to Raoul Alfred Gerber

Re: Set IME and IE

by Jean-Cédric Chappelier -

comme dit dans Zoom : je ne sais pas ce que vous cherchez avec IME et IE : dans le message que vous citez j'ai mis : « je ne dit pas que c'est lié » justement pour dire sous-entendre que je répondais à leur question précise mais que ce n'est pas de là que le problème venait.
IME et IE n'ont, en effet, aucune raison d'être à 1. (ceci dit IE est exposé sur le but et pourrait donc être écrit).
Seule IF va être mise à 1 par l'interruption VBLANK levée au cycle 83302 (cf https://moodlearchive.epfl.ch/2019-2020/mod/forum/discuss.php?d=37764#p78396), ce qui fait que le

JR Z, -4
mentionné dans la donnée (section « Explication de ce second point ») va casser la boucle car la lecture « BIT 0, [HL] » qui précède va unset Z (HL vaut justement REG_IF == 0xFF0F).
Est-ce que cela vous répond ?

In reply to Jean-Cédric Chappelier

Re: Set IME and IE

by Raoul Alfred Gerber -

A moitié, merci ! 

D'un côté, l'information que à ce moment HL = 0xFF0F explique pourquoi ni IME, ni IE ne sont requis pour sortir de la boucle, donc oui, ça va nous aider pour le debugging, merci.


De l'autre côté, et c'est plus abstrait et moins lié directement à notre code, mais dans ma compréhension, si un Interrupt Master Enable ou un Interrupt Enable sont à 0, alors peu importe la valeur d'IF, on ne va jamais réagir aux interrupts vu qu'il ne sont pas enabled (= activés).

Dans le cas particulier du HALT, apparemment, le master n'est pas nécessaire, mais le IE != 0 l'est quand même, cf la donnée : 

si le processeur est à l’arrêt suite à une instruction HALT, le fait qu’il existe au moins un bit valant 1 à la fois dans IE et dans IF provoquera son réveil,

Et comme le fonctionnement de la gameboy requiert des interruptions, ne serait-ce que pour l'écran, quand est-ce que IME/IE sont activés ? Est-ce à chaque cartridge de le faire pour soi-même ?

In reply to Raoul Alfred Gerber

Re: Set IME and IE

by Jean-Cédric Chappelier -

il n'est pas nécessaire d'avoir une interruption, justement p.ex. la lecture directe à l'adresse 0xFF0F permet de décider quoi faire d'autre si nécessaire comme dans le test de blargg 01 (qui ne gère aucune interruption directement.
Et oui c'est à chaque code de gérer/provoquer si nécessaire les interruptions ; p.ex le test de blargg 02 lève et gère une interruption. (d'autres composants peuvent aussi provoquer des interruptions comme p.ex. le LCDC ou le joypad).