6502Bench, pour désassembler PlugJoyst Rapid’Oric Awele-Kalaha HeadOn Les Chemins de Galdeon Compte rendu de visu meet de juin 2021
Edito
Le numéro préparatoire aux vacances renoue avec la tradition. Vous pourrez découvrir dans ce numéro le livre réalisé par Yann et Emmanuel, pour vous adonner au Basic Enrichi. Basix est donc la vedette de l’été, quelques années après une première parution. Grâce à toutes les fonctions ajoutées à notre Basic, peut être l’un d’entre vous se mettra à programmer un jeu que nous découvrirons à la rentrée. Vous pourrez également retrouver Basix sur Oric.org avec un manuel enrichi à la fin de l’été.
Les visu meet se succèdent et c’est toujours avec plaisir que nous échangeons à cette occasion. Alors cochez déjà dans vos agendas la prochaine date. Ce sera sans doute l’occasion de poser des questions à l’auteur de Basix, ou de présenter vos travaux de l’été.
Enfin, gadget ultime pour les collectionneurs … vous trouverez les stickers officiels de Basix et Rapid’Oric, les 2 logiciels du trimestre estampillés CEO. Merci aux auteurs.
Une nouvelle visu meet est prévue le Vendredi 11 Juin à 21h00. Elle est prévue, comme pour les précédentes visu meet, sous la forme d’un googlemeet programmé le 11 Juin de 21h00 à 22h30 … enfin, si les échanges permettent de tenir le timing
Un bon moment de détente pour tous les Oriciens passionés. En direct live, avec de nouvelles démonstrations et échanges.
Les thèmes d’échange ne sont pas définis mais pour sur, nous échangerons sur les nouveautés liées à Orix, les nouveautés de l’année ..
Un jeu de puzzles logiques pour Rom 1.1 et Sedoric (Atmos réel, Euphoric ou Oricutron)
par André C.
Ce jeu a été inventé par Naoki Inaba sous le nom de “Nanba Burokku”. Par la suite, il a été renommé “Tectonics”, “Suguru” ou même “Number blocks”. La version Oric, adaptée aux possibilités de l’écran, bénéficie en outre d’une interface Français/Anglais. Le principe est simple : Le jeu se joue sur une grille. C’est la taille de la grille qui détermine la difficulté du jeu. Cette grille est divisée en zones de 1 à 5 cases, délimitées par des lignes épaisses. Le but du jeu est de remplir la grille avec des chiffres de 1 à 5 de telle manière que : 1) Il n’y ait pas de chiffres identiques à l’intérieur d’une même zone. 2) Il n’y ait pas de chiffres identiques dans les cases qui se touchent, même en diagonale.
TROIS NIVEAUX DE DIFFICULTÉ POUR LA VERSION ORIC
Les règles, qui sont simples, permettent au jeu d’être rapide, du moins pour le premier niveau de difficulté labellisé “Fastoche”. Ce niveau comporte 36 grilles de 4×5 cases pouvant être résolues en une à deux minutes chacune (ce qui vous occupera quand même pour un bon moment).
Niveau “Fastoche”
Les choses se compliquent avec le deuxième niveau “Faisable” dont les 24 grilles, comptent 9×5 cases. Ces grilles peuvent encore être résolues dans un temps raisonnable, mais le nom de “Rapid’Oric” que j’ai attribué à mon jeu commence à être un peu usurpé…
Niveau “Faisable”
Le troisième et dernier niveau “Fortiche” comporte 8 grilles de 11×9 cases et le jeu n’a plus rien de “Rapide”. Ces grilles sont réservées aux malades de la logique. Attention, vous risquez de vous arracher les cheveux (si vous en avez).
Niveau “Fortiche”
LES COMMANDES
Pour résoudre ces grilles, vous disposez des commandes suivantes : -Les 4 flèches pour déplacer le curseur dans la grille. -FUNCT + flèche pour déplacer plus rapidement le curseur. -Touche de 1 à 5 pour placer un chiffre dans la case au curseur. -FUNCT + touche de 1 à 5 pour placer une hypothèse. -Touche 0 pour effacer la case au curseur. -Touche R pour Réinitialiser la grille en cours avec les valeurs de départ. -Touche S pour Sauver la grille en cours. -Touche L pour recharger (Load) la grille précédemment sauvée.
UN PEU DE STRATÉGIE
Il faut commencer par rechercher les zones ne comportant qu’une seule case, car elles ne peuvent contenir que le chiffre 1. Ensuite, vous pourrez peut-être trouver quelques chiffres dans les zones de 2 et 3 cases qui comptent forcément parmi les moins compliquées. Sinon, il faut rechercher les solutions les plus évidentes. Cette stratégie suffit en général pour les grilles “Fastoches”, c’est pourquoi elles sont si rapides à résoudre. Un peu plus de matière grise et de temps seront nécessaires pour les grilles plus grandes.
Premier exemple, illustrant la progression des raisonnements logiques:
Des extraits séquentiels d’une même grille sont rangés de gauche à droite
On repère d’abord une zone mono-case et on y place le chiffre 1. Dans la zone située en dessous, une seule case peut recevoir le chiffre 2. Par suite, la place du chiffre 3 est évidente. Du coup, dans la case du dessus, le chiffre 3 ne peut aller qu’à un seul endroit. Les positions du 4, puis du 5 ne posent alors aucun problème. Et ainsi de suite, jusqu’à résolution de toute la grille…
Deuxième exemple, emprunté à une grille plus complexe:
Les extraits successifs de cette grille sont rangés de gauche à droite, puis de haut en bas.
Ici encore on commence par une zone mono-case qui reçoit avec plaisir le chiffre 1. Dans la zone de 5 cases située au-dessus, le 1 ne peut être placé qu’à un seul endroit. On en profite pour renseigner la zone bi-cases située encore au-dessus en y plaçant les chiffres 1 et 2. Intéressons-nous à la zone de 5 cases en croix située au milieu de l’extrait, car le chiffre 4 ne peut aller qu’à un seul endroit. Par suite, plaçons le chiffre 5, puis le 2 et enfin le 1. La bonne stratégie consiste à tourner autour de ce bloc central de cases résolues. C’est ainsi qu’on trouve où mettre les chiffres 1 et 2 dans les zones adjacentes. J’attire votre attention sur le chiffre 2 ajouté dans le dernier extrait. La stratégie illustrée dans ce cas vous sera souvent très utile lorsque le jeu semblera bloqué. On effet, si on fait le bilan de ce que cette case pourrait contenir, on voit que les chiffres 1, 3, 4 et 5 sont interdits (règle n°2) et donc que seul le chiffre 2 peut y être placé. Il arrivera évidemment que plusieurs chiffres semblent possibles (à un moment donné) pour une même case. L’utilisation de la touche FUNCT vous permettra d’y placer des hypothèses. Ne perdez pas de vue que les hypothèses ne représentent pas seulement des possibilités, elles permettent aussi de statuer sur le contenu éventuel des cases adjacentes. Toutes les grilles ont bien sûr une solution, n’en doutez pas. En toute bonne logique… la logique finira par triompher !
4 : Les previews de l’année 2021 9 : Pong 9 : 10 lignes 10 : CR de l’assemblée générale du 11/02/2021 13 : Compte rendu de visu meet de mars 2021
Edito
L’année 2020 démarre doucement mais surement. Avec une réunion du Comité, l’AG et une réunion CEO-Meet qui restera programmée le 2e vendredi du mois (en Mars / Juin / Septembre / Décembre).
Peu de nouveautés sur ce premier trimestre mais des développements prometteurs en particulier si l’on imagine tout ce que l’on va pouvoir faire avec Orix et le moteur de Raycasting de Jibe; s’ajoute à cela la course de voiture préparée par Yann et quelques démos programmées notamment par ISS et DBug pour les concours de démos du printemps.
Dans les semaines à venir sans doute, il sera organisé une assemblée générale extraordinaire à l’occasion de la révision des statuts plutot poussiéreux. En espérant qu’avec ces nouveaux statuts, nous arriverons à mieux faire reconnaitre l’association des différentes parties prenantes.
8 Manuel du débogueur d’Oricutron 12 Les enveloppes du PSG 8912 14 Créer des écrans texte à partir de fichiers Markdown 16 Musique, Note, Octave et Période 20 Réalisation d’un lecteur de carte Erebus 21 Les «fabricants» d’Erebus 22 Récupérez les sprites des logiciels en Hires 26 Les sons préprogrammés de l’Oric 36 Temporisation en langage machine 40 Undel 46 Hervé Lange, auteur du Secret de Kaïpur 50 Compensation adaptative de la non-linéarité du convertisseur numérique analogique du modulateur d’amplitude du PSG AY-3-891x 54 OricHir 56 Retour sur une année 2020 riche en nouveautés 58 Radar Oric 2 60 CC65 Chess 62 Tetriskov 64 Treasure 68 Ludo 70 Cross Snake 72 El Prisionero / The Prisoner 74 Torrescuerra 75 Tristam Island 76 Oric Bluetooth 78 Carte Mère Oric 84 Des programmes pour votre Oric 86 Compte rendu de visu meet de décembre 2020
Edito
_
Package à venir. Le temps de finir quelques pages de graphismes et quelques tests sans lesquels ce numéro ne serait pas complet. Revenez à l’occasion. Il est possible que soit mis en ligne une version provisoire prochainement (surtout si je mets du temps à finaliser les pages restantes).
Pour les développeurs en herbe, amateurs de beaux graphismes sur Oric, Grégoire a développé un programme de création graphique sur PC. Un programme dédié simulant les capacités graphiques de l’Oric (ou devrait je plutôt parler des contraintes graphiques de l’Oric tant son système vidéo rebute les peintres en herbe).
L’outil simule la manipulation de la zone mémoire haute résolution de l’Oric et reproduit l’image Hires dans une fenêtre, et les datas nécessaires à sa réalisation.
Les principales fonctionnalités :
Exploration via une grille d’affichage des octets correspondants à la mémoire HIRES
La récupération du listing de ‘data’ de la sélection de bloc d’octets pour le C, Basic et ASM
Modification de l’image : dessin en mode pixel
Fonctions en développement : importation d’images de type PNG, BMP ou JPG
A l’ouverture, une fois chargée une image, la première fonctionnalité est l’affichage des octets de la page Hires dans une grille.
On peut alors laisser libre cours à son imagination pour modifier l’image Hires, avec un crayon pour graver les pixels
Aujourd’hui, l’importation des images est réalisée en Noir & Blanc. Une des fonctions en cours de développement permettra d’importer des images et de régler les canaux RVB
D’autres fonctions sont en cours de développement, à l’image du travail en mode AIC de la page Hires.
Découvrez la mise en œuvre du logiciel, présenté par Grégoire dans la vidéo du CEO Meet de Noël. Téléchargez l’outil construit par Grégoire sur son site web.
Quiconque souhaite adresser le sujet du modelage sonore sur Oric se verra tôt ou tard confronté à un des “défaut” de son générateur de son le AY-3-8912: la non linéarité du convertisseur numérique analogique utilisé dans le circuit d’enveloppe.
Cet article présente un procédé de compensation de cette non linéarité capable de s’adapter à différents volumes sonores. Ce mécanisme de linéarisation, en plus de fournir une commande proportionnelle d’amplitude ouvre la porte à la génération d’enveloppe très précise dont la granularité s’adapte automatiquement au volume sonore choisi.
Position du problème
Avant de nous lancer dans le contournement d’un problème, commençons par en cerner l’essence. Quel est exactement le problème de non linéarité du machin truc ?
Le schéma de principe ci-dessous illustre le fonctionnement de la génération sonore sur un Oric en même temps qu’il introduit les grandeurs dont il va être question dans la suite de l’article.
Pour générer un son le PSG AY-3-891x utilise un générateur de signal carré dont il module l’amplitude proportionnellement à une tension issue de la conversion numérique analogique de la valeur d’enveloppe programmée dans le registre d’amplitude. Malheureusement, la conversion numérique vers analogique est entachée d’une non linéarité qui fait que la tension obtenue en sortie n’est pas proportionnelle à la valeur programmée dans le registre d’amplitude. Sur le schéma ci-dessus, on vois que la tension V a une forme arrondie là où la commande d’enveloppe E est en rampe rectiligne.
Ce “problème” est clairement décrit dans les données techniques du composant AY-3-891x, à travers les figures 8 et 9 du document “PSG AY-3-8912 Data Manual” ou entre les figures 2 et 3 du datasheet du PSG AY 3 8912 reproduites ci-dessous:
La figure ci-dessous montre clairement que, là où le générateur d’enveloppe ou la commande manuelle de l’amplitude demande un signal triangulaire (à gauche), la commande analogique en entrée du VCA (Voltage Controlled Amplifier) se trouve être d’aspect plutôt franchement parabolique (figure de droite). Et ce phénomène est pleinement assumée avec l’explication suivante:
Since the primary use of the PSG is to produce sound for the highly imperfect amplitude detection mechanism of the human ear, the D/A conversion is performed in logarithmic steps with a normalized voltage range from 0 to 1 Volt.
datasheet AY-3-8912
Ce qui peut se traduire par:
Puisque la fonction première du PSG est de produire un son à destination du mécanisme hautement imprécis qu’est l’oreille humaine, la conversion numérique analogique est effectuée à l’échelle logarithmique avec une plage de tension normalisée entre 0 et 1 volt.
L’oreille humaine est indéniablement moins précise qu’un modem ou un oscilloscope mais elle est capable de faire la différence entre un violon qui joue un La et un piano qui joue un La .. Et la différence repose, en grande partie, sur l’enveloppe sonore dont cette phrase nous suggère qu’elle peut aisément s’accommoder d’une échelle logarithmique en lieux et place d’une échelle linéaire.
Quelqu’un qui souhaite tenter de faire générer un son précis au AY-3-391x sera bien obligé de se poser la question suivante.
Et dans cet article, je propose une solution qui consiste à linéariser la commande d’enveloppe par une pré-compensation logicielle de la déformation à laquelle on veut échapper.
Pour obtenir une tension V qui soit le plus possible proportionnelle à une consigne d’enveloppe C, on peut élaborer une commande d’enveloppe E qui opère une déformation inverse à celle que va produire la conversion numérique analogique.
Techniquement, cela consiste à appliquer une transformation à la donnée que nous voulons programmer dans le registre d’amplitude du AY-3-391x. Une transformation qui tente de compenser et d’anticiper les dégâts occasionnés lors de la conversion en analogique de notre souhait d’amplitude formulé numériquement.
Identification de la déformation
Dans la version General Instrument du datasheet du AY-3-391x, on trouve une version quotée de la déformation qui nous intéresse.
Des quelques valeurs fournies sur ce graphique, on peut déterminer une tendance :
La valeur de 0.707V pour 14 correspond à 1/sqrt(2)
La valeur de 0.5 V pour 13 correspond à 1/sqrt(4)
La valeur de 0.25 V pour 11 correspond à 1/sqrt(16)
Il vient assez naturellement que la tension V en sortie de convertisseur est exprimable par la formule suivante :
V = 1 / SQRT(2(15-E))
où :
E est le contenu du registre de contrôle de l’amplitude (valeur entière entre 0 et 15).
V est la tension (valeur réelle entre 0 et 1 V)
Dans google, on peut vérifier que la courbe obtenue est proche de celle du modèle.
Compensation de la déformation
Pour inverser cette fonction (et donc compenser son effet) on devra calculer la commande d’enveloppe E par la formule suivante:
E = 15-LOG2(1/(V2))
où :
V est la tension (en volt) que nous voulons en sortie du convertisseur N/A
E est la commande d’enveloppe que nous devons programmer dans le PSG pour obtenir la tension V.
La forme de cette fonction nous donne bien à penser qu’elle compensera la courbe précédente.
Maintenant que nous avons une fonction permettant de compenser la non linéarité sur l’ensemble des valeurs possibles en sortie du convertisseur, nous allons voir comment il est possible d’adapter cette compensation à des situations où nous déciderions de limiter le volume maximum sur un canal tout en gardant la même dynamique du domaine d’entrée. Nous renoncerions aux valeurs hautes de la tension (car c’est là que les imprécisions sont les plus grandes) mais nous garderions toujours 16 valeurs possibles de consigne d’enveloppe. L’objectif est double:
gagner en précision absolue,
offrir la même expressivité d’un son quelque soit le volume sonore auquel on le restitue.
Adaptation de la compensation en fonction du volume
L’idée clé ici est d’associer à la consigne d’enveloppe maximale (15) un extremum de tension correspondent à un palier réel du composant physique. Ceci afin d’adapter au maximum la dynamique d’entrée au potentiel de sorti et bénéficier au maximum du surcroît de précision que nous offre le sacrifice des niveaux électriques élevés
Nous avons vu au tout début que les paliers de tension du composant physique sont sous la forme: 1/sqrt(2^(15-E))
En injectant cette expression dans l’équation vu précédemment, et en simplifiant, il apparaît que la commande d’enveloppe E à programmer dans le PSG s’exprime par:
E = Volume + 2*LOG2(C)
où :
Volume est une valeur entière entre 0 et 15,
C est la consigne d’enveloppe exprimée en 15ème du niveau électrique correspondant à Volume
E est la commande d’enveloppe que nous devons programmer dans le PSG pour obtenir la tension V = C*(15/Volume).
Cette expression est d’une telle simplicité qu’elle m’a très fortement fait douter de mes calculs. J’ai donc écris un petit script python pour:
modéliser la déformation engendrée par le convertisseur numérique analogique,
calculer une table de compensation pour chaque volume sonore (de 0 à 15),
simuler l’effet de la pré-compensation,
comparer avec le cas sans compensation.
Voilà les résultats obtenus pour le volume maximal de 15.
Les points verts représentent la tension électrique obtenue lorsque le registre d’amplitude du circuit d’enveloppe n’est pas transformé. La valeur programmée est directement celle de l’axe des abscisses.
La ligne en jaune représente la tension électrique idéale qui serait obtenue si la conversion numérique analogique était purement linéaire et que nous disposions d’un nombre infini de bit pour exprimer la consigne.
Enfin, les point bleus représentent la tension électrique obtenue par la transformation de la consigne à travers une table de compensation générée par les équations fournies plus haut.
Nous constatons que les points bleus et vert reposent bien tous sur les mêmes paliers réels du composant physique mais qu’ils sont arrangés de telle sorte que leur éloignement à la courbe idéal soit le minimum possible.
L’effet de la linéarisation est indéniable. Voyons comment se comporte l’adaptation de la compensation pour le cas de volume maximum que nous fixerions à certains paliers du composant (paliers pour E=14 et E=12).
L’adaptation de la compensation semble effective.
Cette étude théorique a permis de:
démontrer la faisabilité mathématique d’une linéarisation acceptable du comportement du circuit d’enveloppe du PSG AY-3-391x,
exposer le matériel algorithmique nécessaire à mise en œuvre d’une compensation adaptative.
Vous pouvez télécharger ci-dessous le script python qui m’a servi à générer la table de compensation, simuler son utilisation et vérifier les résultats.
Ou comment insérer un module émetteur dans l’ORIC pour l’utiliser avec une enceinte audio Bluetooth…
On peut se procurer facilement un module BT (BT pour Bluetooth) à un prix très raisonnable :
Une fois la coque enlevée, voici ce module exposé :
À gauche, le connecteur audio utile pour amener les signaux à transmettre, à droite, le connecteur USB qui sert pour l’alimentation. Testé tel quel avec la carte ORIC Mammouth, ça fonctionne bien…
On peut modifier le module pour l’insérer plus facilement dans un ORIC, en lui retirant les deux connecteurs :
Puis en coupant la partie droite qui ne sert plus…
nb : remarquez le marquage du connecteur audio, la pastille L est celle qui sera utilisée pour transmettre le son mono de l’ORIC
Le module est réduit à 3,5 x 2 cm…
Quelques câbles de liaison et il ne reste plus qu’à l’installer dans l’ORIC et à tester…
En gardant le montage de résistances/condensateurs à la sortie de l’AY-3-8912, il suffit de retirer l’amplificateur LM386 de son support.
Il est nécessaire de filtrer le 5 volts (ici, une alimentation à découpage est utilisée et elle génère un léger grésillement dans l’enceinte BT. Après montage du filtre, tout rentre dans l’ordre
Première option : retirer le haut-parleur et placer le module à son emplacement
Voici un ATMOS équipé du module en place du haut-parleur interne :
Ça fonctionne bien ! Et la portée est impressionnante… près de 10 mètres. De plus, cela résoud le problème du réglage du volume sonore propre à nos chères machines…
Oric Explorer est un des meilleurs utilitaires permettant d’inspecter des disquettes (dsk) et cassettes (tap). Damien a revisité le logiciel et ajouté quelques fonctions.
Cette version française a été établie d’après le fichier ReadMe.txt du 15/05/2020 (Oricutron version win64-20200515). La version PDF de cet article est disponible (voir en fin d’article).
English speaking Oricians can directly use the official Oricutron Manual (ReadMe.txt file released with Oricutron).
Au lancement d’Oricutron, il faut presser sur F1 pour accéder au menu principal, qui permet entre autres choses, d’ajouter un clavier Oric virtuel, ce qui peut être utile, voir indispensable.
Touches actives dans les menus en général
Flèches Se déplacer dans le menu
Return Exécuter l’option choisie
DEL Revenir en arrière
ESC Quitter le menu (ou touche Backspace ou BACK avec la souris)
Touches actives dans le mode émulateur
F1 Aller au menu principal (sortie par ESC ou Backspace ou BACK avec la souris).
F2 Entrer dans le mode Débugueur / Moniteur (sortie par F2).
F3 Reset soft (NMI)
F4 Reset hard (reboot)
Shift+F4 Reset Jasmin
F5 Basculer entre les 3 états de la ligne d’information sous l’écran.
F6 Basculer entre vitesse normale / vitesse x20
F7 Enregistrer toutes les disquettes modifiées
Shift+F7 Enregistrer toutes les disquettes modifiées sous un nouveau nom.
F8 Basculer entre mode fenêtre / mode plein écran
F9 Sauver le fichier tape
F10 Démarrer / arrêter la capture vidéo AVI
F11 Copier l’écran texte dans le presse-papiers.
F12 Coller le presse-papiers dans l’écran texte.
Help Aide (pour Amiga, MorphOS and AROS)
AltGr Modificateur supplémentaire
L’intérêt du couple F11/F12 mérite d’être souligné, car il offre une passerelle intéressante entre Oricutron et le système hôte.
Le débogueur / moniteur d’Oricutron
Pour accéder au mode débogueur / moniteur d’Oricutron, vous devez presser la touche F2 (F2 est en fait une bascule entre le débogueur et l’émulateur qui peut être utilisée à tout moment sans perte, ni dans l’émulateur, ni dans le débogueur / moniteur). Un écran apparaît, structuré comme celui de la Fig. 1 : Cet écran est composé de 4 fenêtres :
Fig.1 Etat du débogueur apres assemblage de code LM (a $9812) et positionnement du PC (r pc $9812).
1) Ecran de l’Oric
2) Status du 6502 (“6502 Status”)
3) Une zone dans laquelle alternent les 3 fenêtres suivantes : Moniteur (“Monitor”) / Débogueur (“Debug console”) / Dump mémoire (“Memory watch”). On passe d’une fenêtre à l’autre avec la touche F3.
4) Une zone dans laquelle alternent les 2 fenêtres suivantes : Informations VIA (“VIA Status”) et Informations AY (“AY Status”). On passe d’une fenêtre à l’autre grâce à la touche F4.
Touches actives dans le mode Débogueur / Moniteur
Dans ce mode, outre l’écran de l’Oric, les fenêtres suivantes sont visibles :
“6502 Status” (Fig. 1 en haut à droite).
Fig. 2 Fenêtre “Debug console” (vide pour l’instant).
“Monitor” (Fig. 1 en bas à gauche) ou “Debug console” (Fig. 2) ou “Memory watch” (Fig. 3).
Fig. 3 Fenêtre “Memory watch” (ici on voit la page zéro).Fig. 4 Fenêtre “6502 status” (après réinitialisation de CY par F9).
“VIA Status” (Fig. 1 en bas à droite) ou “AY Status” (Fig. 5).
Fig. 5 Fenêtre “AY status”.
Les touches suivantes sont actives de manière générale, sans qu’il soit nécessaire d’indiquer une fenêtre en particulier.
F1 Aller au menu principal (retour au mode émulateur par ESC ou Backspace ou BACK avec la souris, mais F2 permet de retrouver le Débogueur / Moniteur au même point).
F2 Passer dans le mode émulateur (retour dans le Débogueur / Moniteur par la touche F2).
F3 Pour basculer entre les fenêtres Moniteur (“Monitor”) / Débogueur (“Debug console”) / Dump mémoire (“Memory watch”).
F4 Pour basculer entre les fenêtres Informations VIA (“VIA Status”) et Informations AY (“AY Status”).
F9 Pour réinitialiser le compteur de cycles (ligne CY= dans la fenêtre 6502) (Fig. 4).
F10 Pour exécuter la ligne de code marquée > dans la fenêtre 6502 (Fig. 1 en haut à droite).
F11 Comme F10, mais s’il s’agit d’un sous-programme, celui-ci est exécuté en bloc, sans affichage du détail des lignes de ce sous-programme.
F12 Pour sauter l’instruction marquée > et pointer sur l’instruction suivante. La paire d’écrans “VIA Status” ou “AY Status” affichent des informations en fonction du contexte et ne disposent pas de commandes spécifiques. Par contre, chacune des fenêtres “Monitor”, “Memory watch” et “Debug console”, possède des commandes propres, en plus des commandes listées ci-dessus.
Touches actives dans le mode Console (fenêtre “Debug console”)
Flèches Haut / Bas Historique des commandes.
Touches actives dans le mode Dump Mémoire (fenêtre “Memory watch”)
Flèches Haut / Bas Scrolling Haut / Bas, ligne par ligne.
Shift + Flèches Haut / Bas Scrolling Haut / Bas, écran par écran.
Page Up/Page Down Idem.
Fig. 6 Fenêtre “Memory watch” (Splitée par S).
Chiffres hexadécimaux Pour changer de zone mémoire à visualiser. Exemple $9800 affiche le contenu de la mémoire à partir de $9800 (Fig. 6).
S Activer / désactiver le mode fractionné (Split). Dans ce mode, deux demi-fenêtres “Memory watch” permettent de visualiser deux zones différentes de la mémoire (Fig. 6).
Tab Changer de demi-fenêtre “Memory watch” en mode fractionné. La demi-fenêtre active est indiquée par une coche dans la marge gauche. Les commandes ne sont alors effectives que sur cette demi-fenêtre (Fig. 6).
Instructions en mode moniteur (fenêtre “Monitor”)
En entrée les valeurs numériques sont décimales par défaut. Elles peuvent être hexadécimales si elles sont préfixées par $ ou binaires si elles sont préfixées par %. Presque toutes les sorties sont en mode hexadécimal. Là où vous pouvez entrer un nombre ou une adresse, vous pouvez transmettre un registre CPU ou VIA. (Les registres VIA sont préfixés par V, par exemple VDDRA). Là où vous pouvez entrer une adresse, vous pouvez également utiliser un symbole. En plus des commandes décrites au paragraphe “Touches actives dans le mode Débogueur / Moniteur”, voici les commandes spécifiques du mode Moniteur :
? Affiche toutes les commandes disponibles (RETURN pour avoir l’écran suivant).
Flèches Haut / Bas Historique des commandes.
a <addr> Assembler le code à l’adresse <addr> (assemble) (Fig. 1). Au prompt entrer une ligne de code. L’assembleur passe à la ligne suivante, presser RETURN pour finir.
bc <bp id> Effacer le point d’arrêt indiqué (clear breakpoint).
bcm <bp id> Effacer le point d’arrêt mémoire indiqué (clear memory breakpoint).
bl Lister les points d’arrêt (list breakpoints).
blm Lister les points d’arrêt mémoire (list memory breakpoints).
bs <addr> [zc] Définir un point d’arrêt classique (set breakpoint) (pour les modificateurs zc, voir plus loin dans la partie consacrée aux points d’arrêts).
bsm <addr> [rwc] Définir un point d’arrêt mémoire (set memory breakpoint) (pour les modificateurs rwc, voir plus loin dans la partie consacrée aux points d’arrêts).
bz Supprimer les points d’arrêt (zap breakpoints).
bzm Supprimer les points d’arrêt mémoire (zap memory breakpoints).
Fig. 7 Fenêtre “Monitor” (désassemblage par la commande d $9812).
d <addr> Déassembler à partir de l’adresse <addr> (disassemble) (Fig. 7).
fd <addr> <end> <file> Désassembler dans un fichier, de <addr> à <end> (disassemble to file). Ce fichier <file> est sauvé dans la racine du répertoire Oricutron. Aucune extension, ni entête, n’est ajoutée. Il ne contient que les data bruts, sans informations complémentaires (adresses, type etc.). NB. L’ancienne commande df <addr> <end> <file> n’est plus reconnue.
fw <addr> <len> <file> Sauver une zone mémoire sur la disquette (bin file write) (Fig. 10). Ce fichier <file> est sauvé dans la racine du répertoire Oricutron. Aucune extension, ni entête, n’est ajoutée. Il ne contient que les data bruts, sans informations complémentaires (adresses, type etc.). NB. L’ancienne commande wm (write memory to disk) n’est plus reconnue.
fr <addr> <file> Charge un fichier en mémoire à l’adresse <addr> (bin file read) (Fig. 10). Il s’agit d’un fichier brut préalablement sauvé dans la racine du répertoire Oricutron (ou d’un fichier similaire reconstruit). Il faut donc préciser l’adresse cible et le nom exact.
m <addr> Dumper les 128 octets présents en mémoire à partir de l’adresse <addr> tout en restant dans la fenêtre Moniteur (memory) (Fig. 9). Presser la touche RETURN pour afficher la demi-page suivante. Cette commande est moins puissante que la commande mw ci-après.
mm <addr> <valeur> Modifier la mémoire (modify memory) (Fig. 8).
Fig. 8 Fenêtre “Monitor” (mm modify memory).
mw <addr> Afficher la fenêtre Dump Mémoire et dumper à partir de l’adresse <addr> (memory watch at addr) (Fig. 3). Cette commande est plus puissante que la commande m ci-dessus (Fig. 9) (voir les nombreuses touches actives dans ce mode Dump Mémoire).
Fig. 9 Fenêtre “Monitor” (m dump memory).
nl <fichier> Charger une recopie d’écran (load snapshot) (pas d’extension par défaut).
ns <file> Enregistrer une recopie d’écran (save snapshot) (pas d’extension par défaut).
r <reg> <val> Initialiser le registre <reg> avec la valeur <val> (set register). Exemple “r pc $9812” positionne le Program Compter en $9812 (Fig. 1, fenêtre 6502 status en bas à gauche). Les touches F10 et F11 permettent d’exécuter le code qui se trouve à cette adresse.
Fig. 10 Fenêtre “Monitor” (commandes fw et fr).
q, x ou qm Quitter le moniteur et retourner à l’émulateur (quit, exit, quit moniteur)
qe Quitter l’émulateur (quit emulator)
sa <nom> <addr> Ajouter ou déplacer un symbole utilisateur (add symbol)
sk <nom> Supprimer un symbole utilisateur (kill symbol)
sc Symboles non sensibles à la casse (symbols not case-sensitive)
sC Symboles sensibles à la casse (symbols Case-sensitive)
sl <file> Charger les symboles utilisateur (symbols load) (pas d’extension par défaut)
sx <file> Exporter les symboles utilisateur (export symbols) (pas d’extension par défaut)
sz Supprimer les symboles utilisateur (zap symbols).
Points d’arrêt
Parmi les commandes listées ci-dessus, 8 sont consacrées aux points d’arrêt. C’est dire l’importance qu’ils occupent dans le débogueur / moniteur d’Oricutron. Voici quelques précisions.
Il existe deux types de points d’arrêt. Les points d’arrêt normaux ou “classiques” se déclenchent lorsque le processeur est sur le point d’exécuter l’instruction à l’adresse du point d’arrêt. Les points d’arrêt “mémoire” se déclenchent lors de l’accès ou de la modification de l’adresse du point d’arrêt.
Les points d’arrêt “classiques” peuvent utiliser les modificateurs z et / ou c.
bs $0C00 Arrêt lorsque le processeur est sur le point d’exécuter du code à l’adresse $0C00
bs $0C00 z Idem et met le compteur de cycles à zéro
bs $0C00 zc Met le compteur de cycles à zéro et continue (pas d’arrêt)
bs $0C00 c Continue l’exécution (le point d’arrêt est désactivé)
L’objectif principal des modificateurs z et / ou c est de faciliter le comptage des cycles.
Si des symboles sont chargés, ils peuvent être utilisés à la place des adresses absolues.
Les points d’arrêt “mémoire” peuvent être déclenchés de trois manières: lorsque le processeur est sur le point de lire (r pour read), ou d’écrire (w pour write) à l’adresse ou lorsque la valeur à l’adresse change pour une raison quelconque (c pour change). Le choix du modificateur c (c pour change) n’est pas très heureux, car pour les points d’arrêt normaux, c est déjà utilisé pour continue. Voici quelques exemples d’utilisation :
bsm $0C00 r Arrêt lorsque le processeur est sur le point de lire à l’adresse $0C00
bsm $0C00 rw Arrêt lorsque le processeur est sur le point de lire ou d’écrire à l’adresse $0C00
bsm $0C00 c Déclenche une pause après le changement du contenu de $0C00
bsm $0C00 rwc Déclenche une pause juste avant que le processeur ne lise ou n’écrive à l’adresse $0C00 ou juste après le changement, pour une raison quelconque, du contenu de $0C00.
Fig. Fenêtre “Ecran Oric” (résultat de l’exécution).
Conclusion
Ce manuel est certes très succinct et de nombreuses explications pourraient encore être ajoutées. Néanmoins, j’espère qu’il vous sera utile, comme il l’est pour moi. N’hésitez pas à me faire connaître les manques et les erreurs, afin que je puisse l’améliorer.