Lcdc_cycle retourne ERR_BAD_PARAMETER

Lcdc_cycle retourne ERR_BAD_PARAMETER

by Sebastian Velez De Villa -
Number of replies: 17
Bonjour,
Nous avons un soucis avec la partie II.2 de la dernière semaine du projet. Lorsque nous lançons gameboy_run_until dans generate_image, l'appel à lcdc_cycle retourne ERR_BAD_PARAMETER au bout de 1200468 cycles, empêchant l'affichage correct de l'écran (qui affiche donc juste un écran noir).
Nous passons &(gameboy->screen) et le cycle actuel (paramètre de boucle) à la méthode, et nous avons bien init et plug lcdc dans gameboy_create.
Dans gameboy_run_until, nous faisons [CENSURÉ]

Lcdc_cycle plante systématiquement sur le cycle 1200468. Tous les tests unitaires passent, les blargg aussi (si on enlève l'appel à lcdc_cycle et qu'on garde toute la partie avec #ifdef BLARGG) et l'affichage de l'image de mario dans la partie précédente n'a aucun problème.

Merci de votre aide,

S. Velez et B. Hauer

Modifié par Jean-Cédric Chappelier. (Écrit initialement le samedi, 23 mai 2020, 15:30) : ne donnez pas d'indication sur votre code.

In reply to Sebastian Velez De Villa

Re: Lcdc_cycle retourne ERR_BAD_PARAMETER

by Jean-Cédric Chappelier -

1'200'468 est encore dans la bootrom... (je réfléchis à voix haute)
Avez vous supprimé la boucle artificielle du VBLANK tous les 17'556 cycles ?

(et veuillez ne pas donner d'informations trop « sensibles » sur votre code du projet ;-) )

In reply to Jean-Cédric Chappelier

Lcdc_cycle retourne ERR_BAD_PARAMETER

by Sebastian Velez De Villa -
Oui nous avons supprimé la boucle artificielle aussi.. apparemment nous ne sommes pas les seuls à avoir ce problème.
Et oui désolé, c’était pour que vous compreniez mieux d’où pourrait venir le problème.
In reply to Sebastian Velez De Villa

Re: Lcdc_cycle retourne ERR_BAD_PARAMETER

by Jean-Cédric Chappelier -

je viens de push dans votre dépôt une version de la bibliothèque avec les debug_print « allumés ». Si ça aide je la fournirai à tout le monde.
Si vous ne trouvez pas, ce serait alors aussi utile de donner ici :

  1. le message d'erreur donné par lcdc_cycle
  2. l'état du CPU (dump_cpu)
  3. l'état du lcdc_t (valeur des champs)
In reply to Jean-Cédric Chappelier

Lcdc_cycle retourne ERR_BAD_PARAMETER

by Sebastian Velez De Villa -
D’accord je vais essayer, merci beaucoup
In reply to Sebastian Velez De Villa

Re: Lcdc_cycle retourne ERR_BAD_PARAMETER

by Sebastian Velez De Villa -
Voici les erreurs qui s'affichent en boucle:
image.c:72:image_line_set_word(): Incorrect sizes in image_line (140524149279088, 140524154338304, 140524154338352)
image.c:355:image_own_line_content(): Sizes do not match
lcdc.c:137:lcdc_do_cycle(): error: Bad parameter, when calling: image_own_line_content(&(lcd->display), line_index, new_line)
lcdc.c:171:lcdc_cycle(): cycle 2253828 is bigger than next cycle (2253827)

Pour l'état du cpu: PC=50303, SP=57337, IME=0, IE=0, IF=1, HALT=0, write_listener = 0, idle_time = 0.
Pour l'état du lcdc: on = 128, next_cycle = 2253827, on_cycle = 2253807,DMA_from = 65184, DMA_to = 65184, et window_y = 0.

Merci bien!
In reply to Jean-Cédric Chappelier

Re: Lcdc_cycle retourne ERR_BAD_PARAMETER

by Niels Marco Lachat -

Bonjour,

Nous avons le même problème (ERR_BAD_PARAMETER quand on appelle lcdc_cycle) même avec la libraire mise à jour.

Il semble en fait que lcdc_init ne fait pas son travail et n'initialise pas ses champs (le pointeur sur le cpu est NULL et display a une height de 0). Est-ce que c'est nous qui devons faire cela ? (ça semble bizarre)

Serait-il donc possible d'avoir également la libraire avec les debug_print activés pour nous aider dans notre débuggage?

Merci d'avance



In reply to Niels Marco Lachat

Re: Lcdc_cycle retourne ERR_BAD_PARAMETER

by Jean-Cédric Chappelier -

OK. je lance le push de cette version de la lib vers tous les repos. ça arrive d'ici 1 min ou 2.

In reply to Jean-Cédric Chappelier

Re: Lcdc_cycle retourne ERR_BAD_PARAMETER

by Sophie Sarah Ammann -

Bonjour, nous avons le même problème. Avec la librairie -debug nous avons ces erreurs :

lcdc.c:149:lcdc_do_cycle(): cycle 0 gives a bad line cycle (1)

lcdc.c:172:lcdc_cycle(): cycle 1 is bigger than next cycle (0)

gameboy.c:148:gameboy_run_until(): error: Bad parameter, when calling: lcdc_cycle(&(gameboy->screen), gameboy->cycles)

Pouvez-vous nous aider à débuter pour le debugging ?

(tous les tests unitaires passent, ainsi que Blargg, et test-image) 

In reply to Sophie Sarah Ammann

Re: Lcdc_cycle retourne ERR_BAD_PARAMETER

by Jean-Cédric Chappelier -

hmmm... je suppose que le LCD est off mais qu'une requête de cycle est quand même faite... donc que le « on-state » n'est pas correct... donc que l'état initial du bus à l'adresse REG_LCDC n'était pas correct..

Pour vérifier :
affichez la valeur du champs on_cycle du LCD juste avant l'appel à lcdc_cycle qui vous pose problème ;
faites de même aussi juste après le lcdc_init ;
et affichez aussi la valeur du bus à REG_LCDC.

A voir...

In reply to Jean-Cédric Chappelier

Re: Lcdc_cycle retourne ERR_BAD_PARAMETER

by Sophie Sarah Ammann -

Re bonjour,

Voici les différents champs : 

la valeur de on cycle juste après le call a lcd_init()  : 4294967295

la valeur se trouvant a bus[REG_LCD] : 0

la valeur de on cycle juste avant le call a lcd_cycle() :  18446744073709551615 qui reste ensuite la même pour tous les appels suivants

J'ignore à quelle valeur doit être initialisé lcd mais je suppose que c'est incorrect.


Merci pour votre aide.

In reply to Sophie Sarah Ammann

Re: Lcdc_cycle retourne ERR_BAD_PARAMETER

by Sophie Sarah Ammann -

Pardon, on s'est trompé (on_cycle ne change jamais) : 

la valeur de on cycle juste après le call a lcd_init()  : 18446744073709551615

la valeur se trouvant a bus[REG_LCD] : 0

la valeur de on cycle juste avant le call a lcd_cycle() :  18446744073709551615 qui reste ensuite la même pour tous les appels suivants


In reply to Sophie Sarah Ammann

Re: Lcdc_cycle retourne ERR_BAD_PARAMETER

by Jean-Cédric Chappelier -

Ces valeurs sont correctes. Mais il faudrait aussi le next_cycle, qui doit aussi être à -1 (18446744073709551615).

En regardant le code d'un des groupes (pas le vôtre), le problème venait d'ici :
https://moodlearchive.epfl.ch/2019-2020/mod/forum/discuss.php?d=32096#p74977

Leur struct gameboy_t n'avait pas les bons champs et du coup l'init de next_cycle ne se fait pas correctement.
Pour vérifier : il faut que next_cycle ait la valeur précédente après l'init.
Un autre moyen de vérifier est que l'offset du screen dans gameboy_t doit être 524512

fprintf(stderr, "### offset=%zu\n", offsetof(gameboy_t, screen));

In reply to Jean-Cédric Chappelier

Re: Lcdc_cycle retourne ERR_BAD_PARAMETER

by Sophie Sarah Ammann -

On a mis à jour les champs de gameboy_t et on a enfin le bon résultat :

next_cycle after init : 18446744073709551615 

### offset = 524512

REG_LCDC bus lcd : 0

Cependant il n'y a plus de fenêtre qui s'ouvre. 

In reply to Sebastian Velez De Villa

Lcdc_cycle retourne ERR_BAD_PARAMETER

by Sebastian Velez De Villa -
J’ai retenté de lancer le programme, et cette fois j’ai un ERR_BAD_PARAMETER sur le cycle 2253828...
In reply to Sebastian Velez De Villa

Re: Lcdc_cycle retourne ERR_BAD_PARAMETER

by Jean-Cédric Chappelier -

> apparemment nous ne sommes pas les seuls à avoir ce problème.

à tous ceux qui ont ce problème : je pense que ça vient de l'interface image.c -- bit_vector.c (= de votre implémentation de bit_vector_t différente de la nôtre). Je fais un test avec M. Velez De Villa et vous tiens au courant dès demain.


In reply to Jean-Cédric Chappelier

Re: Lcdc_cycle retourne ERR_BAD_PARAMETER

by Jean-Cédric Chappelier -

Le problème était une trop forte dépendance entre image.c et l'implémentation des bit_vector_t qui rend certains choix d'implémentation de ce type incompatibles avec l'utilisation compilée dans la libbcs212gbfinalext.so ; j'ai donc finalement séparé les deux (image.o et libbcs212gbfinalext.so) de sorte à vous laisser plus de flexibilité dans l'implémentation des bit_vectors. cf https://moodlearchive.epfl.ch/2019-2020/mod/forum/discuss.php?d=26452#p77332