Bootrom disable

Bootrom disable

by 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

by 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

by 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

by 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

by 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

by 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

by 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

by 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