CODINGCLASSEURS WEKA ★ Comment exploiter toutes les ressources et augmenter les performances de votre AMSTRAD CPC ★

9/2.3 - Le debuggerCoding Classeurs Weka
9/2.3 - Le debugger

Qu'est-ce qu'un debugger ?

Ce mot vient du mot anglais « bug » qui signifie erreur en français. Un debugger est un outil qui permet de faciliter la mise au point des pro­grammes écrits en assembleur. C'est un complément indispensable aux programmes précédents : désassembleur et assembleur.
Analyse du problème

Nous allons créer un debugger écrit dans le langage assembleur Z80 le moins complexe mais le plus complet possible. Les fonctions minimum d'un tel programme sont :

  • Lecture d'un programme source (en code exécutable) par exemple créé par le programme assembleur décrit en 9/2.2 ;
  • Sauvegarde sur disquette d'un programme source éventuellement modifié, ou d'une zone mémoire;
  • Exécution d'un programme ou d'une partie de programme à partir d'une adresse déterminée et jusqu'à une adresse déterminée puis affi­chage des registres lorsque l'adresse finale est atteinte ;
  • Affichage et éventuellement modification d'une case mémoire ;
  • Affichage d'une zone mémoire.

Les fonctions que nous venons d'énumérer sont accessibles par un menu affiché en début de programme et après chaque commande. Une fonc­tion est activée en tapant la lettre du menu correspondante (par exem­ple L pour Lecture, X pour exécution, etc.). Passez en mode CAPS LOCK pour que le debugger fonctionne correctement. Si vous tapez une option que le debugger ne comprend pas, le menu est réaffiché et aucune autre action n'est effectuée.

Les fonctions du debugger sont développées dans le programme assem­bleur qui suit. Nous allons les examiner en détail.

I. Lecture d'un programme objet

Les actions réalisées par cette option sont les suivantes :

– saisie du nom du programme à lire :

Pour cela, nous avons créé une routine de lecture (SAINOM) qui permet de lire une chaîne alphanumérique quelconque de longueur maximum 12 caractères qui se termine par le caractère CR (Carnage Return). La chaîne est stockée dans un buffer de lecture (BUFF). La routine de lecture suit la logique suivante :

– ouverture du fichier :

L'ouverture du fichier se fait en utilisant la macro du Firmware qui se trouve à l'adresse #BC77 et qui a pour nom CAS IN OPEN. A noter que cette macro est utilisable sur les trois CPC 464, 664 et 6128).

– lecture de l'adresse d'implantation :

Cette lecture est précédée de l'affichage du message "A implanter à l'adresse : __ ".

La lecture de l'adresse d'implantation est faite en utilisant une autre routine que SAINOM pour rendre automatique le retour chariot en fin de saisie. En effet, le nombre de caractères saisis est invariablement quatre. Le code ASCII de chaque caractère est stocké séquentiellement dans la zone BUFF. La logique de la routine SP1 créée à cet effet est la suivante :

– Lecture du fichier ouvert en lecture :

La lecture du fichier se fait en utilisant la macro du Firmware située à l'adresse #BC83quia pour nom CAS IN DIRECT. A noter que cette routine est identique sur les trois systèmes CPC. Sur les modèles 664 et 6128, la lecture se fait cependant sur disquette.

– Fermeture du fichier ouvert en lecture :

La fermeture du fichier se fait en utilisant la macro du Firmware située à l'adresse #BC7A qui a pour nom CAS IN CLOSE. A noter que cette routine est identique sur les trois systèmes CPC.
Comme dans toutes les options du menu, les registres AF, BC, DE et HL sont mis en pile au début de la routine et dépilés en fin de routine.

II. Sauvegarde d'un programme objet ou d'une zone mémoire

  • Les registres AF, BC, DE et HL sont sauvegardés en début de routine ;
  • Le nom du fichier cassette ou disquette est demandé en utilisant la même routine (SAINOM) que pour l'option de lecture précédemment décrite ;
  • Le fichier est ouvert en écriture en utilisant la macro du Firmware située en #BC8C (CAS OUT OPEN) ;
  • Les adresses de début et de fin de sauvegarde sont demandées en utilisant le sous-programme de saisie SP1 ;
  • Les données correspondantes sont alors envoyées vers le lecteur de cassettes ou de disquettes en utilisant la macro du Firmware située en #BC98 (CAS OUT DIRECT) ;
  • Le fichier ouvert en écriture est enfin fermé en utilisant la macro du Firmware située en #BC8F (CAS OUT CLOSE).
  • Les registres AF, BC, DE et HL sont dépilés et le sous-programme rend la main au menu.

III. Exécution d'un programme

  • Les registres AF, BC, DE et HL sont sauvegardés en début de routine ;
  • Les adresses de début et de fin d'exécution sont lues en utilisant la routine SP1. Ces adresses sont sauvegardées dans les variables ADDEB et ADFIN ;
  • Les trois octets de code commençant à l'adresse de fin d'exécution sont sauvegardés dans une zone buffer (BSTOP) ;
  • Le code JP #83D0H(#C3, #D0, #83) est implantédans cette zone. Ce code permet d'activer la routine d'affichage du contenu des regis­tres. Voyons en détail son fonctionnement ?.
    • Une routine de nom ALPHA affiche toutes les constantes texte (nom des registres) sur l'écran ;
    • Une routine de nom AVAL affiche le contenu des registres. Pour cela, une routine d'affichage spécifique a été développée. Elle a pour nom HEAS. Le quartet supérieur est séparé du quartet inférieur, converti en ASCII, et affiché par une routine Firmware.

L'organigramme suivant décrit l'enchaînement des opérations de conversion et d'affichage :

  • La routine d'affichage des registres Tend la main à la routine EXEC qui restitue le code sauvegardé dans BSTOP, dépile les registres et rend la main au menu.

IV. Affichage du contenu d'une mémoire

  • Les registres AF, BC, DE et HL sont sauvegardés en début de routine ;
  • L'adresse de la mémoire à afficher est saisie grâce à la routine SP1 décrite précédemment ;
  • Le contenu de cette mémoire est alors converti en ASCII et affiché par la routine HEAS ;
  • La routine SAISIE est alors activée. Elle permet de lire la nouvelle valeur qui sera stockée dans la mémoire sélectionnée. Retapez la même valeur si vous ne voulez pas la modifier ;
  • La routine ASCHEX convertit (ASCII->HEXA) les caractères ASCII entrés au clavier acquis dans la routine SAISIE. Le code HEXA résultant de la conversion est alors stocké dans la mémoire sélectionnée ;
  • Les registres empilés en début de fonction sont dépilés et le contrôle est redonné au programme de menu.

V. Affichage d'une zone mémoire : fonction DUMP

  • Les registres AF, BC, DE et HL sont sauvegardés en début de routine ;
  • L'adresse de début de DUMP est saisie grâce à la routine SP1 décrite précédemment ;
  • L'affichage des mémoires commence à cette adresse et respecte le format suivant :

  • Les registres empilés en début de fonction sont dépilés et le contrôle est redonné au programme de menu.

VI. Retour au BASIC

Le programme debugger étant activé sous BASIC, il suffit d'une instruction RET pour y retourner. C'est ce que réalise l'option B du menu.
Deux méthodes sont possibles :

  • Saisie en assembleur ;
  • Saisie en BASIC.

1e méthode

Vous pouvez utiliser l'assembleur décrit dans cet ouvrage ou un autre assembleur pour entrer le programme « debugger ». Voici le listing commenté du programme en page 7.























Une fois le programme saisi et assemblé, vous sauvegarderez la zone mémoire comprise entre #8000 et #8543. Le programme BASIC suivant permettra d'activer le debugger :

2e méthode

Si vous préférez saisir le programme debugger sous BASIC, il vous faudra procéder en deux étapes :

1 ) Saisie d'un programme qui contient les codes HEXA du programme debugger et, qui fabrique le programme binaire DEBUG.BIN (Cf. programme page suivante).

2) Activation du debugger par le même programme BASIC que celui décrit page suivante.



Page précédente : 9/2.2 - L'assembleur
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 529 millisecondes et consultée 1463 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.