Les appels noyau (TRAP) des moniteurs 162Bug (kit68040) et CPU32Bug (kit 68332)


Lire le chapitre 5 du  CPU32 Debugger pour tout connaitre des autres  SYSTEMS CALLS du 162Bug.


Généralités

En plus des commandes accessibles par l'utilisateur, le moniteur offre un certain nombre  de services d'entrées/sorties accessibles par le programmeur: ces appels noyau se font tous à l'aide de l'instruction
trap #15
Pour pouvoir indiquer à la routine qui traite le trap #15 quel appel noyau le programmeur désire activer, il faut mettre derrière cette instruction un mot contenant un code caractérisant l'appel noyau. Par exemple:
trap #15
dc.w $63
est un appel à la routine RETURN qui provoque le retour au moniteur ($63 est le code hexadécimal de l'appel noyau RETURN). Pour rendre votre code plus clair, on recommande de programmer de la manière suivante:
RETURN  equ      $63
               trap     #15
               dc.w    RETURN
La routine qui traite le trap #15 fait progresser le compteur ordinal (registre PC) de l'appelant de manière à lui faire sauter le mot contenant le code. Les paramètres de chaque appel noyau sont passés par la pile, et généralement chaque appel noyau dépile ses paramètres (l'appelant n'a pas à s'en charger).

Exemple d'un autre appel noyau, l'appel OUTSTR qui imprime sur la voie de sortie par défaut (qui est généralement la ligne série nomée "console 1"):
 

OUTSTR    equ        $21                         ; code de l'appel noyau OUTSTR
debut        dc.b       'Bonjour à tous !'    ; tampon
fin             dc.b       0
 
                move.l    #fin,-(sp)         ; adresse du dernier caractère + 1  du buffer
                 move.l   #debut,-(sp)     ; adresse du premier caractère du buffer
                 trap       #15                  ; appel noyau
                dc.w       OUTSTR
retour      nop                              ; ici les adresses fin et début on étés dépilées

Les appels noyau concernent essentiellement les entrées sorties. Pour ces entrées sorties, le noyau gère les notions de voie d'entrée par défaut et de voie de sortie par défaut. Notons la différence avec les commandes qui elles gèrent des voies physiques: 0 est la voie série de connexion avec le PC de développement croisé.


L'appel noyau INCHR

Code: $0
Description:
Lit un caractère sur la voie d'entrée par défaut.
La pile en entrée:
en (SP) doit se trouver un octet non initialise dans lequel INCHR déposera le résultat.
en (SP + 1) doit se trouver un octet non initialise dont le seul but est de maintenir la pile alignée sur un mot.
La pile en sortie
l'appel INCHR ne modifie pas la valeur de SP
en (SP) contient le résultat déposé par INCHR.
en (SP + 1) octet de remplissage pour l'alignement de la pile.
Exemple:
INCHR    equ        $0                        ;
 
              subq.l    #2,sp            ; on fait de la place pour le résultat
              trap       #15
            dc.w       INCHR
              move.b    (sp)+,d0      ; résultat dans d0

L'appel noyau INSTAT

Code: $1
Description:
Teste s'il y a un caractère à lire sur la voie d'entrée par défaut
La pile en entrée:
aucun paramètre
La pile en sortie
l'appel INSTAT ne modifie pas la valeur de SP
La valeur rendue:
le bit Z du code condition vaut 0 s'il y a un caractère à lire, 1 sinon
Exemple:
INSTAT  equ         $1
 
              trap        #15
              dc.w       INSTAT
              beq        rien                ; on se branche a rien s'il n'y a pas de caractere a lire dans d0

L'appel noyau INLN

Code: $2
 
Description:
Lit une ligne de caractère(s) sur la voie d'entrée par défaut
La pile en entrée:
en (SP) doit se trouver un mot long (4 octets) contenant l'adresse du tampon où l'on désire que INLN mette les caractères lus. Ce tampon doit avoir une longueur de 256 octets maximum. Le caractère indiquant la fin de ligne est le retour chariot (la touche Enter du clavier), ce caractère n'est pas mis dans le tampon.
en (SP + 4) doit se trouver un mot long (4 octets) dans lequel INLN déposera l'adresse + 1 du dernier caractère mis dans le tampon.
Exemple:
INLN  equ     $0002 ;
           subq.l  #4,sp ; on fait de la place sur la pile pour le resultat
           pea      (a0) ; on place sur la pile l'adresse du tampon memoire
           trap     #15
           dc.w    INLN
           move.l (sp)+,a1 ; A1 pointe l'adresse du dernier caractere +1

L'appel noyau OUTCHR

Code: $0020
 
Description:
Écrit un caractère sur la voie d'entrée par défaut
La pile en entrée:
en (SP) doit se trouver un octet contenant le caractère à écrire.
en (SP + 1) doit se trouver un octet de remplissage dont le seul but est de maintenir la pile alignée sur un mot. Il est placer automatiquement par le microprocesseur.
La pile en sortie
l'appel OUTCHR dépile les 2 octets
Exemple:
OUTCHR    equ        $0020
 
                  move.b    #'I',-(sp)            ; on met sur la pile le caractère a écrire
                  trap        #15                    ; appel systeme...
                   dc.w        OUTCHR

L'appel noyau OUTSTR

Code: $0021
 
Description:
Écrit une chaîne de caractères sur la sortie par défaut.
La pile en entrée:
en (SP) doit se trouver un mot long (4 octets) contenant l'adresse du premier caractère de la chaîne.
La pile en sortie
l'appel OUTSTR dépile les 2 paramètres soit 8 octets

Exemple:
OUTSTR    equ        $0021
RC            equ        13                   ; Code ASCII du retour chariot (Carriage Return)
LF             equ        10                   ; Code ASCII de l'avance ligne (Line Feed)
 
debut          dc.b       'Bonjour'       ; le texte de la chaîne de caractères
                   dc,b        RC,LF          ; en fin de chaîne
fin              dc.b        0
 
                pea        fin               ; empile l'adresse du dernier caractère + 1
                 pea        debut          ; empile l'adresse du premier caractère
                 trap      #15
                 dc.w      OUTSTR

Simplifer l'appel noyau a l'aide d'une macro

Ajouter la definition de la macro au debut de votre source:

* definition de la macro: "Appel Systeme"
* permet d'utiliser les routines d'I/O du 162-Bug moniteur
*
SYSCALL macro
     trap   #15
     dc.w   \1
     endm

Et son utilisation:
 

OUTSTR   equ            $0021
RC            equ            13         ; Code ASCII du retour chariot (Carriage Return)
LF             equ            10         ; Code ASCII de l'avance ligne (Line Feed)

 
debut        dc.b         'Bonjour'     ; le texte de la chaîne de caractères
                 dc.b          RC,LF         ; en fin de chaîne
fin             dc.b         0
 
                pea            fin           ; empile l'adresse du dernier caractère + 1
                pea           debut        ; empile l'adresse du premier caractère
                SYSCALL  OUTSTR