Je cite un bout de notre échange d'ailleurs, si ça peut faire avancer l'histoire :
La fonction qui va lire la "data" de la musique, c'est abc_read_char: (ligne 514). Elle pointe sur la chaine des data, en extrait un octet et retourne celui-ci. Elle est utilisée entre autre par parse_abc:: (ligne 216). Donc parse_abc:: appel abc_read_char et au retour, reçoit l'octet de "musique". Si celui-ci vaut 0, alors c'est qu'on est en fin de zique donc bye bye. Ce qui merdouille c'est (à prioris) le mode d'adressage utilisé dans abc_read_char, ligne 519, 524,559 et 532: 4 fois il y a usage de "lda(bloc_de_data),offset". Or, quand on jette un oeil sur la doc du 6502, on voit qu'il utilise des registres nommés x et y. Et a prioris, c'est le cas dans abc_read_char avec par exemple lda (abc_score_ptr0),y
Le "hic" c'est que x et y sont des registres sur.... 1 byte!
Voir ici, le petit paragraphe "Simplicity is key":
https://www.dwheeler.com/6502/oneelkruns/asm1step.htmlOn y lit "The 6502 handles data in its registers, each of which holds one byte
(8-bits) of data." et cela concerne entre autre x et y.
Avec ce système d'adressage, on est donc limité à un offset sur un byte pour pointer dans la zic.
Comment changer ça? dans l'état actuel, il y a 4 pointeurs définis ligne 10: abc_score_ptr0, 1, 2 et 3. Or ces pointeurs ne semble pas bouger. Ils sont initialisés et pointent donc chacun sur le début des blocs de zic (il y a 4 blocs dans la zic). Le déplacement dans ces blocs ne se fait PAS en déplaçant ces pointeurs mais en augmentant l'offset y (ligne 535, on incrémente l'offset avec iny).
La solution serait donc de déclarer 8 pointeurs: 4 qui sont fixes (les 4 actuels) et 4 qu'on va déplacer à chaque lecture. Car LDA adresse la mémoire en 16bits, on pourrait donc avec 65535 octets de zic ce qui serait effectivement plus sympa.
A tester:
Ligne 10, en plus des déclarations de
abc_score_ptr0 ds 2
abc_score_ptr1 ds 2
abc_score_ptr2 ds 2
abc_score_ptr3 ds 2
ajouter 4 autres pointeurs:
abc_score_ptr0_tmp ds 2
abc_score_ptr1_tmp ds 2
abc_score_ptr2_tmp ds 2
abc_score_ptr3_tmp ds 2
Ligne 97, ajouter:
sta abc_score_ptr0_tmp
afin de stocker le pointeur dans notre pointeur "mobile"
Faire pareil avec ptr1, 2 et 3, lignes 108,119 et 128
Dans abc_read_char, à la place de
lda (abc_score_ptr0),y
mettre:
lda (abc_score_ptr0_tmp)
inc abc_score_ptr0_tmp
On va donc lire avec notre pointeur temporaire et on va l'incrémenter. On fait pareil pour la lecture de ptr_1, 2 et 3
On peut aussi commenter la ligne iny qui ne sert plus.
En l'état actuel, ça ne fonctionne toujours pas. Si vous voyez un truc qui cloche...