Les options
Phosphoneo s’utilise par sa ligne de commande : phosphoneo [programme] [options]. Les options sont rangées ci-dessous par famille, selon ce qu’elles font autour de la machine émulée. Chaque famille a sa page, avec la syntaxe de chaque option, ce qu’elle fait, un exemple réel (la sortie citée est celle de l’émulateur) et ses pièges.
Toutes les options en un coup d’œil
| Option | Ce qu’elle fait | Page |
|---|---|---|
fichier.neo | Charge un exécutable .neo (le format du firmware : une suite de blocs, chacun avec son adresse, et une adresse d’exécution). | Charger un programme |
fichier.bas | Charge un programme NeoBASIC déjà tokenisé (celui que produit SAVE) sur la page BASIC et le lance (équivaut à exec, $0806). | Charger un programme |
fichier@ADRESSE | Charge un fichier brut à une adresse, en hexadécimal. | Charger un programme |
cold warm exec run@ADRESSE | Point de départ du 65C02 une fois les fichiers chargés : cold = $0800, warm = $0803, exec = $0806 (les trois entrées du noyau), run@HEX = n’importe quelle adresse. | Charger un programme |
--storage | Dossier de l’hôte vu par le firmware comme la carte SD ou la clé USB (défaut : storage). | Charger un programme |
--load-at | Charge un .neo ou un .bas après N cycles et redémarre le 65C02 dessus : ce que fait la page web quand on choisit un programme. | Charger un programme |
--floppy | Remplace le dossier de stockage par un vrai lecteur de disquettes (ou n’importe quel périphérique bloc), servi par le FatFs du firmware : les appels du 65C02 empruntent la même pile que sur la carte, au dernier maillon près. | Charger un programme |
--cycles | S’arrête après N cycles et affiche le bilan : cycles écoulés et nombre d’appels d’API. | Durée et cadence |
--headless | Pas d’affichage. | Durée et cadence |
--realtime | Cadence temps réel sans fenêtre : une trame émulée dure 1/60 s de temps mural. | Durée et cadence |
--stop-on-self-jmp | S’arrête quand le programme exécute un JMP vers sa propre adresse (le « JMP * » qui clôt un programme de test) et dit où et quand. | Durée et cadence |
--version | Affiche la version et ce qui est compilé dedans. | Durée et cadence |
--sdl | Ouvre une fenêtre SDL2 : image du mode vidéo courant (4:3, redimensionnable), clavier et souris transmis au firmware, son, manette. | Fenêtre, son et vidéo |
--scale | Taille initiale de la fenêtre : N fois 320 × 240 (défaut 3). | Fenêtre, son et vidéo |
--fullscreen | Plein écran 4:3 avec bandes noires ; implique –sdl. | Fenêtre, son et vidéo |
--no-sound | Coupe la sortie sonore de la fenêtre. | Fenêtre, son et vidéo |
--wav | Écrit le son du firmware dans un fichier WAV. | Fenêtre, son et vidéo |
--record | Enregistre l’image et le son dans une vidéo AVI MJPEG à 60 images par seconde. | Fenêtre, son et vidéo |
--screenshot | Enregistre l’écran à la fin de l’exécution. | Captures et copies de mémoire |
--screenshot-at | Enregistre l’écran après N cycles, pendant l’exécution (64 captures au plus, avec les variantes ci-dessous). | Captures et copies de mémoire |
--screenshot-when | Enregistre l’écran quand le mot 16 bits stocké en mémoire à l’ADRESSE (hexadécimal) vaut VALEUR (décimal). | Captures et copies de mémoire |
--screenshot-text | Écrit la console (la grille de texte 53 × 30) dans un fichier, à la fin. | Captures et copies de mémoire |
--screenshot-text-at | Comme –screenshot-at, pour la console texte. | Captures et copies de mémoire |
--screenshot-cursor | Ajoute le curseur de souris à la capture, dessiné comme le fait la carte (16 × 16, $FF transparent, rien en monochrome). | Captures et copies de mémoire |
--dump-ram-when | Copie les 64 Ko de RAM dans un fichier quand RAM[ADRESSE] vaut VALEUR (hexadécimal ; au-dessus de FF, c’est le mot 16 bits RAM[ADRESSE..ADRESSE+1]). | Captures et copies de mémoire |
--type-keys | Tape le TEXTE au clavier à partir du cycle indiqué, touche par touche (appui, relâchement), en clavier américain. | Clavier, manette, souris et mémoire |
--gamepad-at | Pose l’état de la manette après N cycles : BITS est un nombre hexadécimal, un bit par bouton. | Clavier, manette, souris et mémoire |
--mouse-at | Pose la position de la souris (en pixels) et l’état des boutons (bit 0 gauche, bit 1 droit, bit 2 milieu) après N cycles. | Clavier, manette, souris et mémoire |
--mouse-when | Comme –mouse-at, mais déclenché quand le mot 16 bits en mémoire à l’ADRESSE (hexadécimal) vaut VALEUR (décimal) : cliquer « à la trame 120 » sans calculer de cycle. | Clavier, manette, souris et mémoire |
--poke-at | Écrit un octet en mémoire (ADRESSE et VALEUR en hexadécimal) après N cycles. | Clavier, manette, souris et mémoire |
--poke-when | Comme –poke-at, mais déclenché quand le mot 16 bits à l’ADRESSE vaut VALEUR (décimal). | Clavier, manette, souris et mémoire |
--trace | É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). | Journaux, arrêts et débogage |
--trace-from | Ne trace qu’à partir du cycle indiqué : pour comprendre un blocage tardif sans produire un fichier géant. | Journaux, arrêts et débogage |
--api-log | 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. | Journaux, arrêts et débogage |
--symbols | 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. | Journaux, arrêts et débogage |
--break-at | Arrête l’exécution quand le 65C02 arrive sur cette adresse (hexadécimale ou symbole). | Journaux, arrêts et débogage |
--watch | 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). | Journaux, arrêts et débogage |
--break-api | 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. | Journaux, arrêts et débogage |
--break-dump | 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. | Journaux, arrêts et débogage |
--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. | Journaux, arrêts et débogage |
--gdb | 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. | Journaux, arrêts et débogage |
--save-state-at | Sauve l’état après N cycles ; l’émulation continue ensuite normalement. | Sauvegarde d’état |
--load-state | Reprend une sauvegarde avant la première instruction. | Sauvegarde d’état |
--neo-emu | Au lieu du comportement lié (le code de l’API compilé dans Phosphoneo), exécute le vrai fichier ELF du firmware sur l’émulateur de RP2040 : le programme PIO qui sert le bus sert celui du 65C02, comme sur la carte. | Co-simulation et latences |
--api-latency | Gèle le 65C02 pendant chaque appel d’API du nombre de cycles de la table (par fonction), au lieu de 0 par défaut. | Co-simulation et latences |
--api-latency-out | En co-simulation, écrit la table de latence mesurée à la fin de l’exécution (c’est ainsi que tools/apilat_table.py construit la table de –api-latency). | Co-simulation et latences |
--cdc-tty | Relie le port série USB (groupe 14) du firmware à un terminal ou pseudo-terminal de l’hôte : le programme croit parler à un modem sur USB. | Co-simulation et latences |
--multiboot --slot-bin --slot-elf | Le sélecteur de démarrage multiple du firmware : –multiboot démarre par neoboot.elf, –slot-bin N:FICHIER place un binaire dans le slot N de la flash émulée (répétable), –slot-elf N:ELF désigne le firmware « reload » du slot N (BBC Micro, Oric), qui prend le bus en bit-bang après l’appel 1,14 et dessine en MODE 7. | Co-simulation et latences |
--bb-disc --type-keys-bb --shots-bb | Pour les firmwares reload : –bb-disc présente une image de disquette (.ssd/.dsd pour le BBC) comme la clé USB ; –type-keys-bb tape du texte N cycles après la bascule sur le bus bit-bang ; –shots-bb règle le délai des captures après cette bascule (défaut 4 000 000 cycles, arrêt à +2 000 000). | Co-simulation et latences |
Les outils qui accompagnent l’émulateur (mkneo.py, fake_modem.py, golden.sh…) sont décrits dans la référence.
- Charger un programmeComment donner un programme à Phosphoneo : .neo, .bas, binaire à une adresse, point de départ, stockage, chargement en cours de route, lecteur de disquettes.
- Durée et cadenceCombien de temps tourne Phosphoneo et à quelle vitesse : nombre de cycles, mode sans affichage, temps réel sans fenêtre, arrêt sur boucle infinie, version.
- Fenêtre, son et vidéoJouer dans une fenêtre SDL à 60 images par seconde avec son et manette, ou enregistrer l'image et le son : --sdl, --scale, --fullscreen, --wav, --record.
- Captures et copies de mémoireEnregistrer ce que voit le programme : image PPM, console en texte, curseur de souris, capture déclenchée par une valeur en mémoire, copie de la RAM.
- Clavier, manette, souris et mémoirePiloter un programme sans personne : frappe automatique et ses séquences spéciales, manette, souris, écriture en mémoire à un cycle donné ou sur une condition.
- Journaux, arrêts et débogageComprendre un programme qui se comporte mal : trace des instructions, journal des appels d'API, symboles, points d'arrêt, surveillance, moniteur et gdb.
- Sauvegarde d'étatFiger l'émulation à un cycle donné et la reprendre plus tard, exactement : --save-state-at et --load-state, ce qui est sauvé, les limites, un exemple.
- Co-simulation et latencesLes options du second backend, qui exécute le vrai firmware ARM sur un RP2040 émulé : --neo-emu, --api-latency, modem USB, multi-boot et firmwares reload.