Aller au contenu
Phosphoneowiki
Sommaire

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=17 sur 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

Sources dans le dépôt : src/main.c, README.md.