Journaux, arrêts et débogage
Dans cette page
Il y a deux niveaux d’observation : ce que fait le 65C02 (instructions, mémoire) et ce que demande le programme au firmware (appels d’API). Les deux journaux se recoupent : l’écriture à $FF00 dans la trace est l’appel qui apparaît dans le journal d’API.
--trace
Syntaxe : --trace trace.txt
Écrit chaque instruction exécutée : adresse, octet de code, instruction désassemblée, registres A X Y S P, cycle, et ea= l’adresse effective de l’opérande (- s’il n’y en a pas). Les JSR vers l’API sont reconnus. Attention à la taille : une seconde de machine fait plusieurs millions de lignes.
Exemple
$ phosphoneo g.neo --cycles 2000000 --trace trace.txt
0800 A9 LDA #$02 A=00 X=00 Y=00 S=FD P=24 cyc=7 ea=-
0802 8D STA $FF01 A=02 X=00 Y=00 S=FD P=24 cyc=9 ea=FF01
0805 A9 LDA #$00 A=02 X=00 Y=00 S=FD P=24 cyc=13 ea=-
--trace-from
Syntaxe : --trace-from CYCLES
Ne trace qu’à partir du cycle indiqué : pour comprendre un blocage tardif sans produire un fichier géant.
Exemple
$ phosphoneo g.neo --cycles 2000000 --trace-from 300 --trace tr.txt
--api-log
Syntaxe : --api-log journal.log[:G,G…]
Journalise chaque appel d’API au moment où il est traité : cycle, adresse de l’instruction, groupe, fonction, paramètres avant et après, code d’erreur. Si des groupes sont donnés après un deux-points, seuls ceux-là sont gardés (jusqu’au groupe 63, donc aussi la boîte à outils de Trinity, groupes 32 à 38). Pas disponible avec le backend de co-simulation.
Exemple
$ phosphoneo graphics.neo6502@800 cold --cycles 3000000 --api-log api.log:5
cycle=67 pc=082F grp=5 fn=2 p=00000000E000E000 r=00000000E000E000 err=0
cycle=127 pc=0861 grp=5 fn=3 p=00000000E000E000 r=00000000E000E000 err=0
cycle=187 pc=0893 grp=5 fn=4 p=00000000E000E000 r=00000000E000E000 err=0
À savoir. Lecture : groupe 5 (graphisme), fonction 2 = tracer une ligne, 3 = rectangle plein, 4 = ellipse pleine.
err=0: aucune erreur ;err=17sur un fichier absent.
--symbols
Syntaxe : --symbols prog.lbl
Charge un fichier de symboles : lignes al ADRESSE .nom (format VICE, produit par 64tass et cc65), nom = $ADRESSE, ou exports d’un .map de ld65. Les noms apparaissent dans la trace et le moniteur, et on peut les donner à --break-at et --watch. Attention : l’adresse est écrite sans C: devant.
Exemple
$ phosphoneo g.neo --symbols g.lbl --break-at apres_couleur
phosphoneo : 2 symboles (g.lbl)
phosphoneo : point d'arret en $0805 (cycle 13) A=02 X=00 Y=00 S=FD P=24
À savoir. Un nom inconnu n’arrête rien : Phosphoneo écrit « symbole inconnu » et continue.
--break-at
Syntaxe : --break-at ADRESSE|nom
Arrête l’exécution quand le 65C02 arrive sur cette adresse (hexadécimale ou symbole). Répétable. Sans moniteur ni gdb, Phosphoneo affiche l’état des registres et sort avec le code 3.
Exemple
$ phosphoneo graphics.neo6502@800 cold --break-at 0805
phosphoneo : point d'arret en $0805 (cycle 13) A=02 X=00 Y=00 S=FD P=24
phosphoneo : 13 cycles, 0 appels API
--watch
Syntaxe : --watch ADRESSE[:w|r|rw]
Surveille une adresse de la mémoire : arrêt à la première écriture (:w, par défaut), lecture (:r) ou l’une ou l’autre (:rw). Comme --break-at, accepte un symbole.
Exemple
$ phosphoneo graphics.neo6502@800 cold --watch FF01:w --cycles 100000
phosphoneo : surveillance $FF01 en $0805 (cycle 13) A=02 X=00 Y=00 S=FD P=24
--break-api
Syntaxe : --break-api GROUPE[,FONCTION]
S’arrête avant l’appel d’API demandé (tous ceux du groupe si la fonction est omise), pour regarder ses paramètres tels que le programme les a posés. Huit arrêts au plus. L’état et les paramètres sont affichés, et le code de sortie est 3.
Exemple
$ phosphoneo graphics.neo6502@800 cold --break-api 5,3
phosphoneo : appel API 5,3 en $0864 (cycle 127) A=05 X=00 Y=00 S=FD P=24 fn=3 p=00000000E000E000
phosphoneo : 127 cycles, 1 appels API
--break-dump
Syntaxe : --break-dump ram.bin
Avec --break-at, --watch ou --break-api : copie les 64 Ko de RAM dans le fichier au moment de l’arrêt, pour les examiner ensuite à tête reposée.
Exemple
$ phosphoneo prog.neo --break-api 3,2 --break-dump ram.bin
--tui
Syntaxe : --tui
Ouvre un moniteur ncurses : arrêt au reset, pas à pas (s instruction, n sans entrer dans les JSR, c continuer), points d’arrêt et de surveillance, mémoire, console. Nécessite ncursesw au moment de la compilation.
Exemple
$ phosphoneo prog.neo --symbols prog.lbl --break-at main --tui
--gdb
Syntaxe : --gdb [PORT]
Lance un serveur gdb (protocole RSP) sur 127.0.0.1:PORT (défaut 1234) et attend l’arrivée du débogueur ; l’exécution s’arrête au reset. Points d’arrêt, surveillance, pas à pas, Ctrl-C.
Exemple
$ phosphoneo prog.neo --gdb 1234 # puis, dans gdb : target remote :1234