Les principales commandes des moniteurs 162Bug et CPU32Bug




Généralités sur les commandes
 
Le moniteur 162Bug se trouve en UVPROM et constitue le seul programme disponible après avoir mis le courant. Ce moniteur permet essentiellement de charger un programme et de le déboguer.


Les caractères de contrôle du dialogue
 
Il y a 6 caractères de contrôle du dialogue entre l'utilisateur et le programme 16xBug :
Control-H  Efface le dernier caractère tapé.
Delete          Même fonction.
Control-X  Efface le début de ligne déjà tapé.
Control-D  Réaffiche le début de ligne déjà tapé.
Control-S   Stoppe l'affichage sur l'écran.
Control-Q  Reprend l'affichage sur l'écran.

 
Les unités syntaxiques
 
Nous définissons dans cette section, différents éléments syntaxiques qui seront utilisés par les définitions des commandes de 162Bug.
 
On définit les éléments suivants:
 
delim délimiteur : un espace ou une virgule.
chaîne suite de caractères entourés de simples cotes caractère (exemple 'BONJOUR A TOUS').
nombre suite de "chiffres". Les nombres peuvent être exprimés selon l'une quelconque des
              bases suivantes : 2, 8, 10, 16. L'indication de la base est un signe conventionnel placé
              devant le nombre.
base
indicateur
exemple
16
$
$9fa012
10
&
&89021
8
@
@24111
2
%
%100101
 
La base par défaut est la base 16. Pour 162Bug, 10 signifie donc 16 en base 10.
 
expression ensemble de nombres combinés par des opérateurs. Attention : pas de priorités d'opérateurs
                   et les expressions sont évaluées de la gauche vers la droite. Par exemple 1+2*3 vaut 9 !!
                   Par contre, on peut utiliser des parenthèses, pour obtenir le 1 + 2 * 3 des mathématiciens,
                   on peut donc écrire : 1+(2*3).
                   Les opérateurs possibles sont les suivants :
opérateur
 sémantique
+
 addition
-
  soustraction
*
 multiplication
/
 division
??
 décalage droit
!! 
 décalage gauche
&
 et logique
Les opérandes des expressions sont des nombres ou des chaînes. Quand un opérande est une chaîne,
sa valeur est le nombre obtenu par concaténation des valeurs ASCII des caractères de la chaîne.
Exemples :
chaîne utilisée en opérande d'expression valeur
'A'
'AB'
41
4142
L'unité syntaxique adresse
Pour définir une adresse, nous introduirons les notations supplémentaires suivantes :
An Une notation assembleur pour un registre d'adresse du MC68040. (ex : A5 ou A6).
Xn Une notation assembleur pour un registre d'index du MC68040. (ex : A2 ou D3).
Une adresse peut avoir l'une des formes suivantes :
adresse sémantique 
expression
expression + Rn
(An)
expression(An)
expression(An,Xn)
la valeur de expression
contenu de Rn + valeur de expression
contenu de An
contenu de An + valeur de expression
contenu de An + contenu de Xn + valeur de expression
 
L'unité syntaxique intervalle
Un intervalle a la forme syntaxique suivante :
                          adresse1   delim   adresse2
ou :
                          adresse    :    expression
Un intervalle permet de définir une zone de mémoire dont les adresses vont de adresse1 à adresse2 dans la première forme, et de adresse à adresse + expression dans la seconde.
 
L'unité syntaxique taille
Certaines commandes peuvent nécessiter de préciser que la taille d'un paramètre est soit un byte, un mot ou un long mot. Elles utilisent pour cela une taille qui a l'une des 3 formes suivantes :
                          ; B
                          ; W
                          ; L
Lorsque le paramètre taille est optionnel, c'est la valeur W qui est prise par défaut.

Commande bf : remplissage de zone mémoire
Syntaxe :

 
bf   intervalle   delim   expression1   expressiontailleoption
 
S'emantique :
- intervalle définit la zone de mémoire que l'on désire remplir.
- expression1 est la valeur avec laquelle on remplit la zone de mémoire.
- expression2 est un incrément dont est incrémenté expression1 après chaque écriture.
Exemples
bf 10000,11000 2ef4     remplit des mots consécutifs avec la valeur 2ef4.
bf 10000,11000 2ef4;l   remplit des longs mots consécutifs avec la valeur 00002ef4.
bf 10000,1003f 'a' 1;b   remplit avec les codes des caractères A, B, C, etc...
Commande bm : recopie de zone mémoire

 
Syntaxe :
bm   intervalle   delim   adresse   tailleoption
Sémantique :
La commande bm recopie la zone de mémoire définie par intervalle dans une autre zone commande à l'adresse adresse.
Exemples :
bm 10000,11000 20000 recopie la zone mémoire allant de 10000 à 11000 dans la zone de même taille débutant en 20000.

Commande br : mise d'un point d'arrêt
 

Syntaxe :
br   adresseoption    nombre-de-passagesoption
dans lequel nombre-de-passages a la structure :              :         expression
S'emantique :
La commande br permet de mettre un point d'arrêt à une certaine adresse. Quand en exécutant le programme, le processeur accède à adresse pour y lire une instruction, le programme est stoppé, son état est sauvegardé et le contrôle est redonné à 162Bug. L'utilisateur peut alors inspecter l'état du programme à l'aide des commandes (par exemple rd pour afficher la valeur des registres)
Exemples :
On met un point d'arrêt en 20000 :
 
162-Bug>br 20000
BREAKPOINTS 00020000
162-Bug>
 
On voit que 162Bug après avoir exécuté la commande, affiche l'ensemble des points d'arrêts valides à cet instant.
Si la commande est utilisée avec un nombre-de-passages, le moniteur met un point d'arrêt à l'adresse indiquée, mais l'arrêt ne se fera qu'après être passé nombre-depassages fois sur le point d'arrêt.
On met un point d'arrêt en 20000, mais on ne veut s'arrêter qu'au deuxième passage :
162-Bug>br 20000:2
BREAKPOINTS 00020000:2
Si la commande est utilisée sans aucune option, elle a pour effet de faire lister l'ensemble des points d'arrêts qui sont actuellement mis dans le programme.
Commande nobr : suppression d'un point d'arrêt
Syntaxe :
nobr          adresseoption
S'emantique :
cette commande supprime le point d'arrêt qui se trouve à adresse. Si la commande est utilisée sans indiquer d'adresse, elle supprime tous les points d'arrêt.
Commande bs : Recherche dans une zone de mémoire
Syntaxe :
La commande bs peut avoir l'une des deux formes suivantes :
         bs  intervalle          delim         chaîne       tailleoption
ou :
         bs  intervalle         delim         expression1         expression2option           tailleoption
S'emantique :
Dans la première forme on demande au moniteur de rechercher la chaîne dans la zone mémoire définie par intervalle.
Dans la deuxième forme, on demande au moniteur de rechercher la valeur de expression1 dans la zone mémoire définie par intervalle. La taille de la valeur à rechercher peut être précisée par le paramètre taille, sinon elle est prise par défaut comme étant un mot. Le paramètre optionnel expression2 est un masque indiquant la manière dont se fait la comparaison de la valeur courante avec expression1. Pour que la valeur courante soit considérée comme correspondant à expression1, il suffit qu'elle lui corresponde pour les seuls bit à 1 dans le masque.
Exemples :
Recherchons à quelle adresse 162Bug possède la chaîne qui lui sert de prompt :
 
162-Bug>bs ff800000 ff880000 '162-Bug'
Effective address: FF800000
Effective address: FF880000
FF8633AD
162-Bug>
 
On voit que cette chaîne se trouve à l'adresse FF8633AD. Attention, une telle recherche prend environ 4 minutes.
Recherchons dans le moniteur des mots contenant la valeur 1234:
 
162-Bug>bs ff800000 ff880000 1234
Effective address: FF800000
Effective address: FF87FFFF
FF81D816   | 1234    FF822CD6  | 1234    FF83BAB2 | 1234    FF83BAD2 | 1234
FF83BAFA | 1234    FF83C8A8  | 1234    FF83C980   | 1234    FF83C9A2  | 1234
FF83CFE8   | 1234     FF83D00A | 1234     FF83D01E | 1234
162-Bug>
 
On voit que le moniteur trouve cette valeur en 11 endroits et cette fois-ci la recherche prend environ 15 secondes, car les comparaisons se font mot par mot au lieu d'octet par octet.
Cherchons maintenant toujours dans le code de 162Bug un mot contenant la valeur x001x010x011x100 o`u x représente un bit dont la valeur peut être 0 ou 1.
 
162-Bug>bs ff800000 ff880000 1234 7777
Effective address: FF800000
Effective address: FF87FFFF
FF802814  | 12BC    FF802914  | 12BC    FF802A50  | 12BC    FF802AE4 | 123C
FF802B12 | 123C     FF8090F0  | 12BC    FF81B88A | 12BC    FF81B88E | 12BC
....
162-Bug>
 
Commande gd : exécution sans point d'arrêt
Syntaxe :
gd      adresseoption
S'emantique :
Cette commande demande à 16xBug de lancer l'exécution à l'adresse adresse si celle-ci est précisée, ou à partir du contenu du registre PC, l'exécution se faisant en ignorant les points d'arrêts éventuels.
 
Commande gn : exécution d'une instruction
Syntaxe :
gn
Sémantique :
Cette commande demande à 16xBug de mettre un point d'arrêt temporaire, à l'adresse de l'instruction suivante, et de lancer l'exécution. Une seule instruction va donc s'exécuter, sauf si l'instruction courante est un JSR ou BSR auquel cas c'est toute la routine appelée qui va s'exécuter.
 
Commande go : exécution avec point d'arrêt
Syntaxe :
go           adresseoption
Sémantique :
Cette commande demande à 162Bug de lancer l'exécution à l'adresse adresse si celle-ci est précisée, ou à partir du contenu du registre PC. L'exécution s'arrêtera sur le premier point d'arrêt rencontre'.
 
Commande gt : exécution avec point d'arrêt temporaire
Syntaxe :
gt      adresse
Sémantique :
Cette commande demande à 162Bug de lancer l'exécution à partir du contenu du registre PC après avoir mis un point d'arrêt temporaire à l'adresse adresse.
 
Commande he : aide en ligne
Syntaxe :
he          nom-de-commandeoption
Sémantique :
La commande he sans paramètre provoque l'affichage de l'ensemble des commandes acceptées par 162Bug accompagnées d'un texte très court résumant leur utilisation.
Utilisée avec en paramètre nom-de-commande, he affiche la syntaxe de la commande.
Exemples :
 
162-Bug>he bm
Block of Memory Move: BM !RANGE?!DEL?!ADDR?[;B--W--L]
162-Bug>
 
Commande ma : définition de macro
Syntaxe :
ma        nomoption
Sémantique :
Cette commande a pour but de définir une macro de nom nom. Après avoir émis la commande, l'utilisateur tape une suite de lignes terminées par une ligne vide. Cette suite de lignes forme le corps de la macro nom. Ensuite, nom est un raccourci d'écriture pour l'ensemble des lignes formant le corps de la macro.
Exemples :
Par exemple, faisons une macro pour afficher le contenu de la pile sur une longueur de 16 mots :
 
162-Bug> ma pile
M=md 0(a7):10
M=
162-Bug>
 
La commande md est une commande de visualisation de la mémoire. Maintenant, utilisons la macro :
 
162-Bug> pile
162-Bug> md 0(a7):10
00004000 0000 FFFF 0000 FFFF 0000 FFFF 0000 FFFF ................
00004010 0000 FFFF 0000 FFFF 0000 FFFF 0000 FFFF ................
 
On voit que 162Bug avant d'exécuter chaque commande du corps de la macro, imprime cette commande.
Les macros admettent des paramètres grâce au caractère d'échappement \. Dans le corps d'une macro, les chaînes \0, \1, \2 etc... seront remplacées respectivement par le premier, second troisième etc... paramètre. Paramétrons la macro précédente :
 
162-Bug> ma pile
M=md 0(A7):\0
M=
162-Bug>
 
puis utilisons la :
 
162-Bug> pile 10
162-Bug> md 0(A7):10
00300000 0000 0000 0000 0000 0000 0400 0000 0000 ................
00300010 1000 0000 0008 0000 0000 0000 0000 0080 ................
162-Bug>
 
A noter que l'exécution de ma sans paramètre provoque l'affichage de toutes les macros définies.
 
Commande noma : effacement de macro
Syntaxe :
noma         nomoption
Sémantique :
La commande noma permet d'effacer une macro dont on donne le nom, ou d'effacer toutes les macros si le paramètre nom est absent.
 
Commande md : visualiser le contenu d'une zone de mémoire
Syntaxe :
           md       intervalle            tailleoption
ou
           md       intervalle           ; di
Sémantique :
La première forme demande à 162Bug de réaliser un dump en hexadécimal de la zone de mémoire définie par intervalle. La seconde forme demande à 16xBug de désassembler une zone de mémoire. On peut, à la place d'un intervalle, donner une adresse. Dans ce cas, la zone mémoire est prise comme débutant à adresse et ayant une longueur de 16 octets.
Exemples :
Regardons le d'ebut du code du moniteur 162Bug qui se trouve dans une UVPROM à l'adresse ff800000:
 
162-Bug> md ff800000 l
FF800000 FFE0E000 FF800A36 FF800DBA FF800DC4 .......6........
162-Bug>
 
(tailleoption = l pour formater l'affichage en Long Word en mot de 4 octets). Sur un reset le kit 68040 initialise son mircoprocesseur en chargent la valeur FFE0E000 dans le pointeur de pile système, et la valeur FF800A36 dans PC. D'esassemblons alors la routine reset de 162Bug :
 
162-Bug> md FF800A36 ;di
FF800A36 46FC2700                 MOVE.W     #$2700,SR
FF800A3A 4EF9FF80 0A40      JMP               ($FF800A40).L
FF800A40 203C00FF C040       MOVE.L       #$FFC040,D0
FF800A46 4E7B0007                 MOVEC.L    D0,DTT1
FF800A4A 207CFFF4 2000       MOVEA.L    #$FFF42000,A0
FF800A50 317C0001 0026         MOVE.W     #$1,$26(A0)
FF800A56 243CFFE0 0000        MOVE.L       #$FFE00000,D2
FF800A5C 4842                          SWAP.W      D2
...
 
Commande mm : modification du contenu d'une zone mémoire
Syntaxe :
        mm     adresse            tailleoption
ou
        md      adresse             ; di
Sémantique :
Cette commande est une commande interactive qui permet d'inspecter une suite de mémoire contiguës débutant à adresse et d'en modifier certaines.
Exemples:
Nous allons inspecter (et éventuellement modifier) à partir de l'adresse 3e00.
162-Bug> mm 3e00
00003E00 0000?
00003E02 FFFF? 1
00003E04 0000?
00003E06 FFFF? 2
00003E08 0000? .
162-Bug>
On voit que les mémoires d'adresse 3e00 et 3e04 contenaient la valeur 0 et que l'utilisateur ne les a pas modifiées, et que les mémoires d'adresse 3e02 et 3e06 contenaient ffff et que leur précédent contenu a été remplacé par 1 et 2. L'utilisateur signifie la fin de la commande mm en tapant une ligne ne contenant que le caractère . (point).
 
On peut également utiliser la commande mm avec l'option di. Dans ce cas, mm désassemble instruction par instruction, et à chaque fois autorise l'utilisateur a taper le source d'une autre instruction à la place. Il n'est raisonnable d'utiliser cette option que pour faire des modifications minimes au programme.
 
Commande rd : visualisation des registres
Syntaxe :
rd
Sémantique :
Cette commande provoque l'affichage des registres ainsi que le désassemblage de l'instruction courante (celle pointée pars PC)
 
Commande rm : visualisation/ modification de registres
Syntaxe :
rm           nom
Sémantique :
Cette commande est une commande interactive fonctionnant à la manière de mm permettant de visualiser et éventuellement de modifier le contenu des registres. Le nom indiqué doit être un nom de registre.
Exemples :
On inspecte D3, D4, D5 et on ne modifie que D5 :
 
162-Bug> rm d3
D3 =00000000 ?                  <-- Retour chariot invisible
D4 =00000001 ? 2
D5 =00000000 ? .
162-Bug>
 
Autre exemple, la modification du registre d'état. Dans l'interaction ci-dessous, on remet dans le registre d'état la valeur convenable pour 162Bug (mode maître, masqué).
 
162-Bug> rm sr SR =0000=TR:OFF....0.....? 2700
VBR =00000000? .
162-Bug>
 
Commande t : exécution d'une instruction
Syntaxe :
t        expressionoption
Sémantique :
Cette commande demande d'exécuter un nombre d'instruction égal à expression. Si le expression est omis, elle est prise égale à 1. Après chaque instruction 162Bug imprime tous les registres et désassemble l'instruction courante (la prochaine à exécuter). Cette commande permet de tracer l'exécution d'un programme en pas à pas (le mode pas 'a pas).
 
Commande tt : trace avec point d'arrêt temporaire
Syntaxe :
tt            adresse
Sémantique :
Cette commande demande au 162Bug de lancer l'exécution en mode trace (exécution pas à pas avec affichage du contenu des registres après chaque instruction), avec un point d'arrêt temporaire.
 
L'ensemble des commandes en un coup d'œil
Visualiser/Modifier la mémoire
bf         Block Fill                  pour remplir une zone de mémoire
bm       Block Move              Recopie de zone de mémoire
bs          Block Search           Recherche dans une zone de mémoire
md        Memory Display       Affichage du contenu d'une zone mémoire
mm       Memory Modify       Modification d'une zone de mémoire
Visualiser/modifier les registres
rd          Register Display       Affichage du contenu des registres
rm         Register Modify       Modification du contenu des registres
Gestion des points d'arrêt
br           Breakpoint                Pose d'un point d'arrêt
nobr       No Breakpoint          Suppression de points d'arrêt
Exécution des programmes
gd          Go Direct                  Exécution sans point d'arrêt
gn          Go Next                    Exécution d'une instruction
go           Go                           Exécution avec points d'arrêt
gt           Go to Temporary      Exécution jusqu'à point d'arrêt temporaire
t             Trace                        Exécution d'une instruction
tt            Trace to Temporary  Exécution pas à pas jusqu'a point d'arrêt temporaire
Divers
he           Help                           Aide en ligne
noma      No Macro                  Effacement de macro
ma          MAcro                       Définition de macro