Aller au contenu
Phosphoneowiki
Sommaire

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.

Où agit chaque famille d'optionsLes options se rangent selon leur rôle autour de la machine émulée. À gauche, ce qu'on lui donne : le programme et le stockage, les entrées scriptées (clavier, manette, souris, écritures en mémoire) et une sauvegarde d'état à reprendre. Au centre, la machine et son horloge. À droite, ce qu'on en tire : fenêtre, son et vidéo ; captures et copies de mémoire ; journaux et arrêts de débogage ; sauvegarde d'état.On lui donneLa machineOn en tireChargerprogramme, stockage, départPilotertouches, manette, souris, pokeReprendre--load-state65C02 + firmware--cycles : combien de temps--realtime : à quelle vitesse--neo-emu : quel backendhorloge en cyclesun essai = toujours le même résultatFenêtre, son, vidéo--sdl · --wav · --recordCaptures--screenshot* · --dump-ram-whenDébogage--trace · --api-log · --break-* · --gdbSauvegarde--save-state-at
Où agit chaque famille d’options, autour de la machine émulée.

Toutes les options en un coup d’œil

OptionCe qu’elle faitPage
fichier.neoCharge 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.basCharge un programme NeoBASIC déjà tokenisé (celui que produit SAVE) sur la page BASIC et le lance (équivaut à exec, $0806).Charger un programme
fichier@ADRESSECharge un fichier brut à une adresse, en hexadécimal.Charger un programme
cold warm exec run@ADRESSEPoint 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
--storageDossier de l’hôte vu par le firmware comme la carte SD ou la clé USB (défaut : storage).Charger un programme
--load-atCharge 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
--floppyRemplace 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
--cyclesS’arrête après N cycles et affiche le bilan : cycles écoulés et nombre d’appels d’API.Durée et cadence
--headlessPas d’affichage.Durée et cadence
--realtimeCadence temps réel sans fenêtre : une trame émulée dure 1/60 s de temps mural.Durée et cadence
--stop-on-self-jmpS’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
--versionAffiche la version et ce qui est compilé dedans.Durée et cadence
--sdlOuvre 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
--scaleTaille initiale de la fenêtre : N fois 320 × 240 (défaut 3).Fenêtre, son et vidéo
--fullscreenPlein écran 4:3 avec bandes noires ; implique –sdl.Fenêtre, son et vidéo
--no-soundCoupe 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
--recordEnregistre l’image et le son dans une vidéo AVI MJPEG à 60 images par seconde.Fenêtre, son et vidéo
--screenshotEnregistre l’écran à la fin de l’exécution.Captures et copies de mémoire
--screenshot-atEnregistre 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-whenEnregistre 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-atComme –screenshot-at, pour la console texte.Captures et copies de mémoire
--screenshot-cursorAjoute 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-whenCopie 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-keysTape 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-atPose 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-atPose 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-whenComme –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-whenComme –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-fromNe trace qu’à partir du cycle indiqué : pour comprendre un blocage tardif sans produire un fichier géant.Journaux, arrêts et débogage
--api-logJournalise 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
--symbolsCharge 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-atArrête l’exécution quand le 65C02 arrive sur cette adresse (hexadécimale ou symbole).Journaux, arrêts et débogage
--watchSurveille 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-apiS’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-dumpAvec –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
--tuiOuvre 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
--gdbLance 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-atSauve l’état après N cycles ; l’émulation continue ensuite normalement.Sauvegarde d’état
--load-stateReprend une sauvegarde avant la première instruction.Sauvegarde d’état
--neo-emuAu 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-latencyGè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-outEn 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-ttyRelie 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-elfLe 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-bbPour 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.