Les appels noyau (TRAP) des moniteurs 162Bug
(kit68040) et CPU32Bug (kit 68332)
- Généralités
- L'appel noyau RETURN
Permet de redonner la "main" au moniteur (obligatoire
a chaque fin de programme)
- L'appel noyau INCHR
Lit un caractère sur la voie d'entrée par défaut
- L'appel noyau INSTAT
Teste s'il y a un caractère à lire sur la voie
d'entrée par défaut
- L'appel noyau INLN
Lit une ligne de caractère(s) sur la voie d'entrée par
défaut
- L'appel noyau OUTCHR
Écrit un caractère sur la voie d'entrée par
défaut
- L'appel noyau OUTSTR
Écrit une chaîne de caractères sur la sortie par
défaut.
- Simplifiez vos appels noyaux avec la macro SYSCALL
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