Documentation des p-codes R3 de
Tiny Pascal.
A partir de la version R3, les p-codes ne sont plus des triplets. Un quatrième membre
« décalage » a été ajouté por permettre de décrire la position en octets d’un membre dans une
structure.
Les p-codes sont des quadruplets composés d’un code d’opérande, d’un paramètre, d’une valeur et
d’un décalage :
Opcode Paramètre Valeur Décalage
Les deux premiers champs sont codés sur un octet, tandis que le troisième et le quatrème sont codés
sur 2 octets.
Table des matières
0 LIT.....................................................................................................................................................2
1 OPR...................................................................................................................................................3
2 LOD...................................................................................................................................................6
3 STO....................................................................................................................................................8
4 CAL.................................................................................................................................................10
5 INT...................................................................................................................................................11
6 JMP..................................................................................................................................................12
7 JPC...................................................................................................................................................13
8 CSP..................................................................................................................................................14
9 STC..................................................................................................................................................16
10 SRC................................................................................................................................................17
11 JCC................................................................................................................................................18
12 DAT...............................................................................................................................................19
13 CTS................................................................................................................................................20
14 CTC...............................................................................................................................................21
15 ASM...............................................................................................................................................22
Annexe : translation en code Z80 pour les calculatrices ti8x.............................................................23
0 LIT
Chargement d’une valeur littérale sur la pile.
Syntaxe
LIT <VAL|ADD> nombre l’addresse d’un p-code.
VAL est codé par 0.
ADD est codé par 1.
Détail
Cette instruction permet le chargement d’une valeur sur la pile.
Le paramètre VAL effectue un chargement direct de la valeur sur la pile.
Exemple de chargement de la valeur 10 sur la pile :
LIT VAL 10
Le paramètre ADD effectue un chargement sur la pile de l’adresse d’une chaîne de caractères
constante incluse dans le programme par l’opérande DAT.
1 OPR
Effectue une opération sur des données contenues dans la pile et, le cas échéant, restitue le résultat à
son sommet.
Syntaxe
OPR 0 <RET|NEG|ADD|SUB|MUL|DIV|LBIT|MOD|=|<>|<|>=|>|<=|OR|AND|NOT|
SHL|SHR|INC|DEC|DUP|XOR|STR|SIE|FTO|OTF>
ou
OPR page PGE
Détail
Afin de permettre de produire des applications multi-pages, une nouvelle opération PGE a été
introduite. Elle permet de placer le code généré sur une page choisie parmi 10 possibles (0 à 9).
Le second champ (paramètre) contient le numéro de page pour l’opération PGE. Pour les autres
opérations, ce champ n’a pas de signification et est fixé à 0.
Si le numéro de page vaut 10, le code sera répliqué sur l’ensemble des pages existanteq qui utilisent
ce code. Cela est utile pour placer les fonctions appelées fréquemment sur chaque page, afin de
limiter les chargement de pages qui sont très longs à exécuter.
Les applications multi-pages sont décrites dans le document [Link].
Le bit 7 du troisième champ est à 1 si le ou les opérande(s) sont réel et à 0 si le ou les opérande(s)
sont entiers. Par exemple :
ADD est codé par la valeur 2,
ADDR est codé par la valeur 130.
Le troisième champ codifie l’opération à effectuer de la manière suivante :
Type d’opération Code Signification
T : pointeur du sommet de pile ; S : pile)
RET 0 Cette opération est appelée à la fin d’une procédure ou d’une fonction
afin de retourner au p-code qui suit son appel. En pratique, le mot
situé au sommet de la pile est extrait et vient remplacer la valeur du
compteur de programme. Le pointeur de pile applicative et le pointeur
de base sont restaurés aux valeurs correspondant au bloc appelant.
NEG 1 Change le signe du mot présent au sommet de la pile.
S[T]:=-S[T];
NEGR 129 Change le signe du réel (5 mots) présent au sommet de la pile.
ADD 2 Extrait deux mots du sommet de la pile, les additionne et met le
résultat dans la pile.
T:=T-1; S[T]:=S[T]+S[T+1];
ADDR 130 Extrait deux réels (5 mots chacun) du sommet de la pile, les
additionne et met le résultat dans la pile.
SUB 3 Extrait deux mots du sommet de la pile, soustrait le second du
premier et met le résultat dans la pile.
T:=T-1; S[T]:=S[T]-S[T+1];
SUBR 131 Extrait deux réels (5 mots chacun) du sommet de la pile, soustrait le
second du premier et met le résultat dans la pile.
MUL 4 Extrait deux mots du sommet de la pile, les multiplie et met le résultat
dans la pile.
T:=T-1; S[T]:=S[T]*S[T+1];
MULR 132 Extrait deux deux réels (5 mots chacun) du sommet de la pile, les
multiplie et met le résultat dans la pile.
DIV 5 Extrait deux mots du sommet de la pile, divise le premier par le
second et met le résultat dans la pile.
T:=T-1; S[T]:=S[T] DIV S[T+1];
DIVR 133 Extrait deux réels (5 mots chacun) du sommet de la pile, divise le
premier par le second et met le résultat dans la pile.
LBIT 6 Conserve uniquement le bit de poids faible du mot au sommet de la
pile (test d’imparité). Cette opération n’est pas utilisée dans les
versions actuelles de Tiny Pascal. Elle n’est ni générée par le
compilateur, ni traitée par le translateur.
S[T]:=S[T] AND 1;
MOD 7 Extrait deux mots du sommet de la pile, calcule le reste de la division
euclidienne du premier par le second et met le résultat dans la pile.
T:=T-1; S[T]:=S[T] MOD S[T+1];
= 8 Extrait deux mots du sommet de la pile, met 1 dans la pile si les
nombres sont égaux ou 0 dans le cas contraire.
T:=T-1; S[T]:=S[T]=S[T+1];
=R 136 Extrait deux réels (5 mots chacun) du sommet de la pile, met 1 dans la
pile si les nombres sont égaux ou 0 dans le cas contraire.
<> 9 Extrait deux mots du sommet de la pile, met 1 dans la pile si les
nombres sont différents ou 0 dans le cas contraire.
<>R 137 Extrait deux réels (5 mots chacun) du sommet de la pile, met 1 dans la
pile si les nombres sont différents ou 0 dans le cas contraire.
< 10 Extrait deux mots du sommet de la pile, met 1 dans la pile si le
premier nombre est inférieur au second ou 0 dans le cas contraire.
T:=T-1; S[T]:=S[T]<S[T+1];
<R 138 Extrait deux réels (5 mots chacun) du sommet de la pile, met 1 dans la
pile si le premier nombre est inférieur au second ou 0 dans le cas
contraire.
>= 11 Extrait deux mots du sommet de la pile, met 1 dans la pile si le
premier nombre est supérieur ou égal au second ou 0 dans le cas
contraire.
T:=T-1; S[T]:=S[T]>=S[T+1];
>=R 139 Extrait deux réels (5 mots chacun) du sommet de la pile, met 1 dans la
pile si le premier nombre est supérieur ou égal au second ou 0 dans le
cas contraire.
> 12 Extrait deux mots du sommet de la pile, met 1 dans la pile si le
premier nombre est supérieur au second ou 0 dans le cas contraire.
T:=T-1; S[T]:=S[T]>S[T+1];
>R 140 Extrait deux réels (5 mots chacun) du sommet de la pile, met 1 dans la
pile si le premier nombre est supérieur au second ou 0 dans le cas
contraire.
<= 13 Extrait deux mots du sommet de la pile, met 1 dans la pile si le
premier nombre est inférieur ou égal au second ou 0 dans le cas
contraire.
T:=T-1; S[T]:=S[T]<=S[T+1];
<=R 141 Extrait deux réels (5 mots chacun) du sommet de la pile, met 1 dans la
pile si le premier nombre est inférieur o égal au second ou 0 dans le
cas contraire.
OR 14 Extrait deux mots du sommet de la pile, effectue un ou logique bit à
bit et met le résultat dans la pile.
T:=T-1; S[T]:=S[T] OR S[T+1];
AND 15 Extrait deux mots du sommet de la pile, effectue un et logique bit à
bit et met le résultat dans la pile.
T:=T-1; S[T]:=S[T] AND S[T+1];
NOT 16 Inverse tous les bits du mot situé au sommet de la pile.
S[T]:=S[T] NOT S[T];
SHL 17 Extrait deux mots du sommet de la pile, décale vers la gauche les bits
du premier mot du nombre de bits spécifié par le second.
T:=T-1; S[T]:=S[T] SHL S[T+1];
SHR 18 Extrait deux mots du sommet de la pile, décale vers la droite les bits
du premier mot du nombre de bits spécifié par le second.
T:=T-1; S[T]:=S[T] SHR S[T+1];
INC 19 Ajoute 1 au mot situé au sommet de la pile.
S[T]:=S[T]+1;
DEC 20 Retranche 1 au mot situé au sommet de la pile.
S[T]:=S[T]-1;
DUP 21 Ajoute à la pile une copie de la valeur située au sommet.
T:=T+1; S[T]:=S[T-1];
DUPR 149 Ajoute à la pile une copie de la valeur réelle située au sommet.
T:=T+5; S[T-4..T]:=S[T-9..T-5];
XOR 22 Extrait deux mots du sommet de la pile, effectue un ou exclusif bit à
bit et met le résultat dans la pile.
T:=T-1; S[T]:=S[T] XOR S[T+1];
STR 23 Cette opération n’a jamais été utilisée. Elle n’est ni générée par le
compilateur, ni traitée par le translateur.
SIE 24 Convertit l’octet signé situé au sommet de la pile en mot signé
(conversion 8 bits vers 16 bits). C’est une extension du bit de signe de
l’octet de poids faible vers l’octet de poids fort.
FTO 25 Convertit le réel présent au sommet de la pile en mot signé.
T:=T-4; S[T]:=integer(S[T]);
OTF 26 Convertit le mot signé présent au sommet de la pile en réel.
S[T]:=float(S[T]); T:=T+4;
NOP 27 Ne fait rien.
PGE 28 Définit la page courante. Tout le code qui suit sera placé sur cette
page, jusqu’au prochain changement de page. Si la page courante est
mise à 10, le code qui suit sera répliqué sur l’ensemble des pages
existantes qui utilisent ce code.
2 LOD
Chargement d’une variable sur la pile.
Syntaxe
LOD[R][S][B][X] par valeur
Détail
Le champ opcode contient plusieurs zones codant le mode d’adressage (bit 4), la largeur de mot (bit
5), la nature de l’objet chargé (bit 6) et le type de la variable (bit 7)
Il existe deux types d’adressage, identifiés par le bit 4 du code de l’opération :
Bit 4 = 0 : LOD, adressage direct
Bit 4 = 1 : LODX, adressage indexé
Il existe deux largeurs de mots, identifiées par le bit 5 du code de l’opération :
Bit 5 = 0 : LOD, mot (16 bits)
Bit 5 = 1 : LODB, octet
Il existe deux natures d’objet, identifiés par le bit 6 du code de l’opération :
Bit 6 = 0 : LOD, scalaire
Bit 6 = 1 : LODS, structure
Il existe deux types de variable, identifiés par le bit 7 du code de l’opération :
Bit 7 = 0 : LOD, ordinal
Bit 7 = 1 : LODB, réel
Le tableau suivant regroupe les combinaisons d’opérations de chargement actuellement utilisées par
Tiny Pascal :
Type de chargement Code Signification
T : pointeur du sommet de pile ; S : pile,
SB : alias de pile de type octet,
<var> : voir explication après le tableau
LOD 2 Chargement d’un mot sur la pile.
T:=T+1; S[T]:=<var>;
LODX 18 Chargement d’un mot élément de tableau sur la pile. L’index se
trouve au sommet de la pile.
S[T]:=<var>[S[T]];
LODB 34 Chargement d’un octet sur la pile. Uniquement utilisé pour
par>=250.
T:=T+1; S[T]:=<var>;
LODBX 50 Chargement d’un octet élément de tableau sur la pile. L’index se
trouve au sommet de la pile. La taille d’un élément étant de un
octet, le décalage en octets est égal à l’index.
S[T]:=<var>[S[T]];
LODS 66 Chargement de l’adresse d’une structure sur la pile.
T:=T+1; S[T]:=@<var>;
LODSX 82 Chargement de l’adresse d’un élément de structure sur la pile. Le
décalage en mots se situe sur le sommet de la pile.
S[T]:=@(<var>[S[T]]);
LODR 130 Chargement d’un réel sur la pile.
T:=T+5; SB[T-9..T]:=<var>;
LODRX 146 Chargement d’un réel élément de tableau sur la pile. Le décalage
en mots se situe sur le sommet de la pile.
SB[T..T+9]:=<var>[S[T]]; T:=T+4;
Le champ paramètre permet de spécifier si on souhaite charger une variable gérée par Tiny Pascal
(par<250), ou si une donnée via les ports Z80 (par=252 et par=253), ou placée à une adresse
absolue dans la mémoire physique (par=254 ou par=255).
Si par=252, le port spécifié dans le champ valeur. Il est donc connu à la compilation.
Si par=253, le port est présent au sommet de la pile. Il peut donc être calculé par le programme de
l’utilisateur.
Si par=254, l’adresse est spécifiée dans le champ valeur. Elle est donc connue à la compilation.
Si par=255, l’adresse est présente au sommet de la pile. Elle peut donc être calculée par le
programme de l’utilisateur.
Si par<250, la variable est stockée dans le contexte d’un bloc (programme, procécure ou fonction).
La valeur trouvée dans par indique de combien de niveaux d’imbrication if faut remonter pour
trouver la base de l’allocation mémoire du bloc contenant la variable recherchée. Si par=0, la
variable est locale. Si par>=1, elle appartient à l’invocation la plus récente du par-ième bloc
englobant le bloc courant. Pour plus d’information, lire ce document :
[Link]
Le champ valeur contient alors le décalage entre la variable à chercher et la base de l’allocation
mémoire du bloc concerné.
3 STO
Enregistrement d’une donnée au sommet de la pile dans une variable.
Syntaxe
STO[R][S][B][X] par valeur
Détail
Le champ opcode contient plusieurs zones codant le mode d’adressage (bit 4), la largeur de mot (bit
5), la nature de l’objet enregistré(bit 6) et le type de la variable (bit 7).
La structure de ce champ est identique à celle de l’opération LOD. Voir le chapitre précédent pour
les détails.
Le tableau suivant regroupe les combinaisons d’opérations d’enregistrement actuellement utilisées
par Tiny Pascal :
Type de chargement Code Signification
T : pointeur du sommet de pile ; S : pile,
SB : alias de pile de type octet)
STO 3 Enregistrement dans une variable d’un mot présent sur la pile.
<var>:=S[T]; T:=T-1;
STOX 19 Enregistrement dans un élément de tableau d’un mot présent sur la
pile. L’index se trouve sur la pile.
<var>[S[T-1]]:=S[T];T:=T-2;
STOB 35 Enregistrement d’un octet présent sur la pile. Uniquement utilisé
pour par>=250 et variable globale.
<var>:=S[T]; T:=T-1;
STOBX 51 Enregistrement d’un octet élément de tableau présent sur la pile.
L’index se trouve au sommet de la pile. La taille d’un élément
étant de un octet, le décalage en octets est égal à l’index.
<var>[S[T-1]]:=S[T] and %00FF; T:=T-2;
STOS 67 Duplication d’une structure dont la longueur en mots et l’adresse
sont au sommet de la pile.
FOR I:=0 TO S[T]-1 DO
BEGIN
<var>[I]:=S[S[T-1]+I];
END;
T:=T-2;
STOSX 83 Duplication d’un élément de structure dont le décalage, la longueur
en mots et l’adresse sont au sommet de la pile.
FOR I:=0 TO S[T]-1 DO
BEGIN
<var>[S[T-2][I]:=S[S[T-1]+I];
END;
T:=T-3;
STOR 131 Enregistrement d’un réel sur la pile.
<var>:=SB[T-8..T] ;T:=T-5;
STORX 147 Enregistrement d’un réel élément de tableau sur la [Link] décalage
en mots se trouve au sommet de la pile.
<var>[SB[T-10]]:= SB[T-8..T]; T:=T-6;
Pour les règles concernant le paramètre par, se reporter aux informations situées sous le tableau du
paragraphe LOD.
4 CAL
Appel d’une procédure ou d’une fonction.
Syntaxe
CAL par adresse
Détail
Le champ paramètre permet de spécifier si on souhaite appeler une procedure ou une fonction Tiny
Pascal (par<250), ou un sous-programme placé à une adresse absolue dans la mémoire physique
(par=250, 251, 252, 253, 254 ou 255).
Si par=250, l’adresse est présente au sommet de la pile. Elle peut donc être calculée par le
programme de l’utilisateur. Les registres DE et IX sont protégés contre les modifications effectuées
par le code appelé.
Si par=251, l’appel est identique à par=253, mais les registres sont initialisés par les données
contenues dans un buffer dont l’adresse est spécifiée dans la pile.
Si par=252, l’appel est identique à par=250, mais les registres sont initialisés par les données
contenues dans un buffer dont l’adresse est spécifiée dans la pile.
Si par=253, l’adresse est spécifiée dans le champ valeur. Elle est donc connue à la compilation. Les
registres DE et IX sont protégés contre les modifications effectuées par le code appelé.
Si par=254, l’adresse est spécifiée dans le champ valeur. Elle est donc connue à la compilation.
Si par=255, l’adresse est présente au sommet de la pile. Elle peut donc être calculée par le
programme de l’utilisateur.
Si par<250, l’appel va créer un nouveau contexte d’appel sur la pile applicative, pour garder la trace
des variables locales. Le paramètre par indique l’écart de niveau entre la procédure appelante et la
procédure appelée, ce qui permet d’ajuster le pointeur de bloc statique. Pour plus d’information, se
reporter au lien mentionné dans le chapitre 2.
5 INT
Modifie le pointeur de pile applicative.
Syntaxe
INT 0 valeur
Détail
T:=T+valeur;
Valeur est en entier positif ou négatif.
6 JMP
Saute à une adresse absolue.
Syntaxe
JMP 0 addresse
Détail
PC:=adresse;
7 JPC
Saute à une adresse absolue si la condition est satisfaite.
Syntaxe
JPC c addresse
Détail
if S[T]=c
THEN PC:=adresse;
T:=T-1 ;
8 CSP
Appel des procédures standards du language.
Syntaxe
CSP 0 <INCHR|OUTCH|INNUM|OUTNM|INHEX|OUTHX|INVST|INREL|OUTST|
OUTVS|OUTRL>
Détail
Le second champ n’a pas de signification et est fixé à 0.
Le troisième champ codifie la procédure à exéctuer de la manière suivante :
Type d’opération Code Signification
T : pointeur du sommet de pile ; S : pile)
INCHR 0 Lit un caractère entré par l’utilisateur au clavier de la calculatrice et
place son code sur la pile. L’utilisateur peut corriger les données par
les touches flèches et d’effacement. Le premier caractère n’est
retourné que quand l’utilisateur appuie sur la touche entrée. Il sont
ensuite restitués un par un à chaque appel.
T:=T+1; S[T]:=<inchr>;
OUTCH 1 Ecrit sur l’écran un caractère correspondant au code présent au
sommet de la pile.
<outch>(S[T]); T:=T-1;
INNUM 2 Lit un entier entré au clavier et place sa valeur sur la pile. L’utilisateur
peut corriger les éventuelles erreur de la même façon que pour
l’entrée d’un caractère (INCHR).
T:=T+1; S[T]:=<innum>;
OUTNM 3 Ecrit sur l’écran un entier correspondant à la valeur présente au
sommet de la pile.
<outnm>(S[T]); T:=T-1;
INHEX 4 Lit un entier exprimé en base 16 entré au clavier et place sa valeur sur
la pile. L’utilisateur peut corriger les éventuelles erreur de la même
façon que pour l’entrée d’un caractère (INCHR)
T:=T+1; S[T]:=<inhex>;
OUTHX 5 Ecrit sur l’écran un entier en base 16 correspondant à la valeur
présente au sommet de la pile.
<outhx>(S[T]); T:=T-1;
INVST 6 Lit une séquence de caractères entrés par l’utilisateur au clavier de la
calculatrice et la place dans la variable dont la taille et l’adresse se
trouvent sur la pile. L’utilisateur peut corriger les éventuelles erreur
de la même façon que pour l’entrée d’un caractère (INCHR).
STRSIZE:=S[T]*2-1;
STRADDR:=S[T-1] ;
FOR I:=0 TO min(STRSIZE, <nb caractères>)-1 DO
MEM[STRADDR+I]:=<inchr>;
T:=T-2;
INREL 7 Lit un réel entré au clavier et place sa valeur sur la pile. L’utilisateur
peut corriger les éventuelles erreur de la même façon que pour
l’entrée d’un caractère (INCHR)
T:=T+9; S[T-8..T]:=<inrel>;
OUTST 8 Ecrit sur l’écran une séquence de caractères dont la taille et les
données se trouvent sur la pile.
FOR I:=T-S[T] TO T-1 DO
<outch>(S[I]);
T:=T-S[T]-1;
OUTVS 9 Ecrit sur l’écran une chaine de caractères dont l’adresse se trouve sur
la pile. Note : la longueur se trouve aussi sur la pile, mais elle est déjà
présente dans le premier octet de la chaine.
STRADDR:=S[T-1],
FOR I:=1 TO MEM[STRADDR] DO
<outch>(MEM[STRADDR+I]);
T:=T-2;
OUTRL 10 Ecrit sur l’écran un réel dont la valeur est présente au sommet de la
pile.
<outch>(S[T-8..T]); T:=T-9;
9 STC
Enregistrement d’une donnée au sommet de la pile dans une variable, en conservant la donnée au
sommet de la pile.
Syntaxe
STC[R] par valeur
Détail
Le champ opcode contient plusieurs zones codant le mode d’adressage (bit 4), la largeur de mot (bit
5), la nature de l’objet enregistré(bit 6) et le type de la variable (bit 7).
La structure de ce champ est identique à celle de l’opération LOD. Voir ce chapitre pour les détails.
Le tableau suivant regroupe les combinaisons d’opérations d’enregistrement sans dépilage
actuellement utilisées par Tiny Pascal :
Type de chargement Code Signification
T : pointeur du sommet de pile ; S : pile
STC 9 Enregistrement dans une variable d’un mot présent sur la pile.
<var>:=S[T];
STCR 137 Enregistrement dans une variable d’un réel présent sur la pile.
<var>:=S[T-8..T];
Pour les règles concernant le paramètre par, se reporter aux informations situées sous le tableau du
paragraphe LOD.
10 SRC
Appel d’une routine système TI8x (B_CALL).
Les routines systèmes et leur utilisation sont décrites dans les documents [Link],
[Link] et [Link].
Syntaxe
SRC par adresse
Détail
Le champ paramètre permet de spécifier le mode d’appel de la routine système.
Si par=251, l’appel est identique à par=253, mais les registres sont initialisés par les données
contenues dans un buffer dont l’adresse est spécifiée dans la pile.
Si par=252, l’appel est identique à par=255, mais les registres sont initialisés par les données
contenues dans un buffer dont l’adresse est spécifiée dans la pile.
Si par=253, l’adresse est spécifiée dans le champ valeur. Elle est donc connue à la compilation. Les
registres DE et IX sont protégés contre les modifications effectuées par le code appelé.
Si par=254, l’adresse est spécifiée dans le champ valeur. Elle est donc connue à la compilation.
Si par=255, l’adresse est présente au sommet de la pile. Elle peut donc être calculée par le
programme de l’utilisateur.
11 JCC
Saute à une adresse absolue si la condition est satisfaite, en conservant la condition sur la pile.
Syntaxe
JCC c addresse
Détail
if S[T]=c
THEN PC:=adresse;
12 DAT
Si le mode assembleur est activé, la donnée présente dans le champ valeur est ajoutée à la fin du
fichier assembleur en cours de constitution.
Dans le cas contraire, la donnée présente dans le champs valeur est inscrite dans le code généré.
Syntaxe
DAT 0 valeur
Détail
Le champ valeur est codé su 16 bits, il y a donc deux octets émis pour chaque opération DAT.
13 CTS
Concaténation de chaînes de caractères.
Syntaxe
CTSS par adresse
Détail
Le champ paramètre permet de spécifier si on souhaite concaténer à une variable gérée par Tiny
Pascal (par<250), ou placée à une adresse absolue dans la mémoire physique (par=255).
Se reporter à la fin du paragraphe STO pour plus de détails
Si par=255, à la différence de STO, l’adresse de la chaîne de caractères cible reste sur la pile à la fin
de l’opération.
14 CTC
Ajout d’un caractère à une chaîne de caractères.
Syntaxe
CTCS par adresse
Détail
Le champ paramètre permet de spécifier si on souhaite concaténer à une variable gérée par Tiny
Pascal (par<250), ou placée à une adresse absolue dans la mémoire physique (par=255).
Se reporter à la fin du paragraphe STO pour plus de détails
Si par=255, à la différence de STO, l’adresse de la chaîne de caractères cible reste sur la pile à la fin
de l’opération.
15 ASM
Permet d’intégrer du code en assembleur Z80 dans le flux de p-codes.
Syntaxe
ASM par adresse
Détail
Par défaut, le mode assembleur n’est pas activé.
Le comportement dépend de ce mode.
Si le mode assembleur est inactif avant l’opérateur ASM:
Le mode assembleur devient actif.
Si par=0, il n’y a pas de protection des registres sensibles DE et IX.
Si par=1, les registres sensibles DE et IX sont protégés. Le code de sauvegarde est émis.
Si par=252, le paramètre adresse contient une adresse absolue pointant sur un tampon de 8
octets destiné à initialiser les registes AF, HL, BC et DE et à récupérer leur valeur à la fin de
la séquence d’instructions en assembleur.
Si par=253, l’adresse du tampon est présente sur la pile.
Si le mode assembleur est actif avant l’opérateur ASM:
Le mode assembleur devient inactif.
Le code assembleur est converti en binaire par le programme PASMO et inséré dans le code
généré.
Si par=2, il n’y a pas de protection des registres sensibles DE et IX.
Si par=3, les registres sensibles DE et IX sont protégés. Le code de restauration est émis.
Si par=254 ou par=255, les registes AF, HL, BC et DE sont restitués dans le tampon.
Annexe : translation en code Z80 pour les calculatrices
ti8x
Les registres DE (pointeur de pile applicative) et IX (pointeur sur base du bloc courant) sont utilisés
pour le fonctionnement du code translaté. Ils doivent être préservés par chaque routine système ou
utilisateur.
Annexe : exemples de conversion de code pascal en p-
codes
{ 3 mots }
type
coord_t = record
x : integer;
y : integer
end;
var
p : coord_t; { 2 mots }
begin
p.x := 1;
p.y := 2
end.
1 INT 0 5 0
2 p.x := 1;
2 LIT VAL 1 0
3 STO 0 3 0
4 p.y := 2
4 end.
4 LIT VAL 2 0
5 STO 0 3 2
6 OPR 0 RET 0