Bootrom disable

Bootrom disable

par Sophie Sarah Ammann,
Number of replies: 7

Bonjour,

Nous avons un problème lors de l'exécution de Fibonnaci car on ne détecte aucun write à l'adresse BOOT_ROM_REG_DISABLE. 

(tous les tests unitaires fonctionnent, on a bien plug la bottom avec la macro donnée)

Auriez-vous une piste pour nous aider à débugger ?

D'avance merci 

In reply to Sophie Sarah Ammann

Re: Bootrom disable

par Cédric Hölzl,

Bonjour,

la bootrom attend une interuption VBLANK (sans la quelle elle boucle à l'infini). Lancez vous bien cette interruption dans votre code ? (elle ne se lance pas automatiquement à ce stade du projet)

In reply to Cédric Hölzl

Re: Bootrom disable

par Sophie Sarah Ammann,

Oui on a lancé manuellement VBLANK comme demandé.

On a remarqué que IME n'était jamais allumé, et IE n'est jamais set dans notre programme. 

Avons-nous raté une ligne des pdf quant à la gestion de IME et IE ? 

In reply to Sophie Sarah Ammann

Re: Bootrom disable

par Jean-Cédric Chappelier,

Restez vous dans la boucle PC=9D, PC=9F ou en sortez vous (PC=A1 ; comme indiqué dans la sous-section « Explication de ce second point » de la section « Test ») ?
Et pour info (je ne dit pas que c'est lié), les familles EDI et RETI peuvent set IME à 1.

In reply to Jean-Cédric Chappelier

Bootrom disable

par David Mathieu Pedrucci,
Bonjour,
Nous nous excusons de persister, cependant nous sommes arrivé à un point mort et manquons d'idée pour nous en sortir. Les instructions sont bien écrite dans la mémoire du composant bootrom. L'execution du programme Fibonacci fonctionne, ainsi que tous les unit-test et test-cpu à notre disposition. Le PC semble fonctionner correctement.
Nous ignorons pourquoi les interruptions ne sont jamais activées, que ça soit IME ou IE. Aucune écriture ne se fait à l'adresse REG_BOOTROM_DISABLE, aucun appel n'est fait aux instructions EDI ou RETI. Tout cela nous laisse supposer qu'il y a une erreur lors de la lecture de la bootrom, mais nous ignorons où aller chercher car la lecture de toutes les autres séquences d'instructions semblent fonctionner correctement.
Auriez-vous une idée de piste que nous pourrions suivre, ou un processus qui nous mènerait à trouver nos erreurs?

Merci beaucoup pour votre aide
In reply to Jean-Cédric Chappelier

Re: Bootrom disable

par Sophie Sarah Ammann,

Bonjour, 

Pour apporter encore des précisions quand à l'exécution du bootrom, voici les premières instructions :

{kind = DIRECT, family = LD_R16SP_N16, opcode = 49 '1', bytes = 3 '\003', cycles = 3 '\003', xtra_cycles = 0 '\000'}

{kind = DIRECT, family = LD_R16SP_N16, opcode = 33 '!', bytes = 3 '\003', cycles = 3 '\003', xtra_cycles = 0 '\000'}

{kind = DIRECT, family = LD_HLRU_A, opcode = 34 '"', bytes = 1 '\001', cycles = 2 '\002', xtra_cycles = 0 '\000'}

{kind = PREFIXED, family = BIT_U3_R8, opcode = 108 'l', bytes = 2 '\002', cycles = 2 '\002', xtra_cycles = 0 '\000'}

{kind = DIRECT, family = JR_CC_E8, opcode = 40 '(', bytes = 2 '\002', cycles = 2 '\002', xtra_cycles = 0 '\000'}

{kind = DIRECT, family = LD_HLRU_A, opcode = 34 '"', bytes = 1 '\001', cycles = 2 '\002', xtra_cycles = 0 '\000'}

{kind = PREFIXED, family = BIT_U3_R8, opcode = 108 'l', bytes = 2 '\002', cycles = 2 '\002', xtra_cycles = 0 '\000'}

{kind = DIRECT, family = JR_CC_E8, opcode = 40 '(', bytes = 2 '\002', cycles = 2 '\002', xtra_cycles = 0 '\000'}

{kind = DIRECT, family = LD_HLRU_A, opcode = 34 '"', bytes = 1 '\001', cycles = 2 '\002', xtra_cycles = 0 '\000'}

{kind = PREFIXED, family = BIT_U3_R8, opcode = 108 'l', bytes = 2 '\002', cycles = 2 '\002', xtra_cycles = 0 '\000'}

{kind = DIRECT, family = JR_CC_E8, opcode = 40 '(', bytes = 2 '\002', cycles = 2 '\002', xtra_cycles = 0 '\000'}

{kind = DIRECT, family = LD_HLRU_A, opcode = 34 '"', bytes = 1 '\001', cycles = 2 '\002', xtra_cycles = 0 '\000'}

{kind = PREFIXED, family = BIT_U3_R8, opcode = 108 'l', bytes = 2 '\002', cycles = 2 '\002', xtra_cycles = 0 '\000'}

{kind = DIRECT, family = JR_CC_E8, opcode = 40 '(', bytes = 2 '\002', cycles = 2 '\002', xtra_cycles = 0 '\000'}

{kind = DIRECT, family = LD_HLRU_A, opcode = 34 '"', bytes = 1 '\001', cycles = 2 '\002', xtra_cycles = 0 '\000'}

{kind = PREFIXED, family = BIT_U3_R8, opcode = 108 'l', bytes = 2 '\002', cycles = 2 '\002', xtra_cycles = 0 '\000'}

Comme prévu.

Ensuite au cycle i = 17556, on appelle bel est bien : cpu_request_interrupt(&gameboy->cpu, VBLANK);

et l'instruction lue dans le même cycle est :

{kind = DIRECT, family = LD_HLRU_A, opcode = 34 '"', bytes = 1 '\001', cycles = 2 '\002', xtra_cycles = 0 '\000'}

Ensuite :

i = 17557

pas d'instruction, car idle_time = 0

    donc cpu->idle_time -= 1;

i = 17558

{kind = PREFIXED, family = BIT_U3_R8, opcode = 108 'l', bytes = 2 '\002', cycles = 2 '\002', xtra_cycles = 0 '\000'}

.... 

On retourne dans la boucle... 

Quelqu'un pourrait peut-être nous éclairer en comparant avec les sorties attendues ? 

Merci 

In reply to Sophie Sarah Ammann

Bootrom disable

par Sophie Sarah Ammann,
Nous sommes restés dans les PC 9D et 9F. L’instruction EDI n’a jamais été appelée. IME et IE n’ont jamais été set à autre chose que 0. IF a par contre bien été lancée.
Merci beaucoup pour votre aide
In reply to Sophie Sarah Ammann

Re: Bootrom disable - SOLVED

par David Mathieu Pedrucci,

Si ça peut aider quelqu'un, notre problème provenait de gameboy_create() dont les composants étaient mal initialisés. De plus certaines incrémentations de xtra_cycles et du PC dans cpu_dispatch étaient également incorrectes