Les appels noyau (TRAP) du 162Bug
-
Généralités
-
L'appel noyau RETURN Permet
de redonner la "main" au moniteur 162bug (Cet appel est obligatoir
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
Généralités
En plus des commandes accessibles par l'utilisateur,
le
162bug 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 à
162bug
($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 la station
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.
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.
-
La pile en sortie
-
l'appel INLN ne modifie pas la valeur de sp
-
en 0(sp) contient le résultat déposé par INCHR.
-
en 1(sp) octet de remplissage pour l'alignement de la pile.
-
Exemple:
-
-
INCHR equ
$0000
;
-
-
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 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 d0,-(sp)
; d0 contient le caractère a écrire
-
trap #15
-
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