Fonctionnement du simulateur:
Les hichiers .map
Les fichiers .map sont lus par
l'émulateur pour construire les différents
périphériques et le gestionnaire de registres. La syntaxe
est relativement simple, à chaque ligne on déclare un
périphérique. Les lignes se composent d'un identifiant,
d'un séparateur « : » puis de un ou des
paramètres. Les ligne commençant par « # »
sont considérées comme des commentaires et ne sont pas
traitées.
Actuellement les deux
périphériques disponibles sont la ROM et la RAM. Pour
déclarer une mémoire RAM il suffit de mettre la ligne
« RAM:0x00000000,0xFFFFFFFF » les paramètres sont
les adresses de début et de fin de la mémoire. Les
adresses doivent être sur quatre octet et en hexadécimal.
Pour déclarer une mémoire ROM il suffit de mettre la
ligne « ROM:fic.hex » le paramètre est le fichier
.hex à partir duquel sera initialisé la mémoire
ROM.
Un identifiant est
réservé : il sagit de Regsiter. Cet identifiant nous
permet de connaître le nombre de registres du processeur, le seul
paramètre à passer est le nombre de registres (en
décimal).
Les hichiers .hex
Le format .hex est un format
développé par Intel pour transférer des
données dans une mémoire ROM, nous avons
légèrement ce modifié ce format afin de pouvoir
nous en servir pour le simple-cpu. Les fichiers .hex sont
utilisé pour initialiser la ROM de l'émulateur.
Le fichier se lit ligne par
lignes, les lignes sont des suites d'octets, tous les octets sont
écrits en hexadécimal, et occupent deux
caractères. Par exemple un octet de valeur 255 en décimal
s'écrit FF .
Chaque ligne commence par
« : » ensuite le premier octet est la taille des
données pure contenues sur la ligne. Après l'adresse
à partir de la quelle il faut charger les données, est
écrite sur quatre octets, à la différence du
format Intel qui lui ne prévoyait que deux octets pour
l'adresse. Après l'adresse il y à un octet à
zéro, c'est l'octet de commande, mais dans notre cas il sera
toujours à zéro. Après cet octet à
zéro, on a les données à charger. Après les
données on a un dernier octet, le checksum. Pour vérifier
l'intégrité d'une ligne il faut faire la somme des tous
les octets de la ligne un à un, si cette somme vaut zéro
modulo 256 alors la ligne est correcte. Les lignes commençant
par « # » sont considérées comme des
commentaires et ne sont pas traitées.
Utilisation du debugger.
Au lancement le debugger affiche
les différents périphériques de l'architecture.
Lorsque le simulateur est prêt vous pouvez lancer vos commandes
voici les différentes commandes reconnues par le
débugger:
-
run (ou r) :
Lance ou relance l'exécution du programme. Le programme commence toujours à l'addresse 0. Vous ne pouvez pas rentrer de commandes tant que le programme n'a pas été arrêté par un breakpoint (pensez donc à mettre un ou plusieurs breakpoints avant de lancer le programme).
-
break 0xNNNNNNNN (ou b) :
Le programme sera arrêté à l'adresse 0xNNNNNNN, ou s'il il tente de lire ou d'écrire à cette addresse -
step (ou s):
Cette commande exécute une seule instruction et vous redonne la main pour que vous puissiez rentrer un commande. -
continue (ou c):
Cette commande reprend l'exécution du programme jusqu'au prochain breakpoint. -
instruction (ou i):
Cette commande lit, décode et affiche l'instruction pointée par R0. -
display (ou d):
Pour la commande display il y a deux utilisations possibles. "display m 0xNNNNNNNN n" cette commande affiche les n octets à partir de l'adresse 0xNNNNNNNN. L'autre utilisation de display est "display r n" cela permet d'afficher le contenu du registre n. -
quit (ou q):
Cette commande quite l'émulateur.