Ce document fait partie du projet PV16SOG et est fourni sous licence CC-NC-SA-BY V3.0
auteur: Jacques Deschênes
révision 1.0
Copyright: 2015,2016, Jacques Deschênes
L'ordinateur PV16SOG possède un interpréteur BASIC qui exécute du bytecode sur une machine virtuelle à piles. Ce document décris cette machine virtuelle.
Cette machine virtuelle utilise 8 des 16 registres du PIC24EP512MC202 pour ses états internes ainsi que 2 piles. la première pile dstack est utilisée pour les arguments et la deuxième rstack est utilisée pour conserver les adresses de retours des sous-programmes ainsi que pour sauvegarder les registres STEP et LIMIT lors de l'imbrication de boucles FOR. Les registres de la machine virtuelle sont les suivants:
la pile dstack peut contenir 128 éléments et la pile rstack 64. Étant donné ces tailles limités il faut-être prudent dans l'utilisation des fonctions récursives.
Cette table contient la description de chacun des codes machine (opcode) utilisés par la machine virtuelle. La notation état stack est une illustration de l'état de la pile dstack ou rstack avant et après l'exécution de cette instruction.
opcode | mnémonique | description | état stacks |
---|---|---|---|
0 | BYE | Termine l'exécution du programme et sortie de la machine virtuelle. Void commane BASIC BYE | ( -- ) |
1 | DROP | Jette l'élément au sommet de la pile dstack. | ( n -- ) |
2 | DUP | Clone le sommet de la pile dstack | ( n -- n n ) |
3 | SWAP | Interchange les 2 éléments au sommet de dstack | ( n1 n2 -- n2 n1 ) |
4 | OVER | Copie le 2ième élément de la pile dstack au sommet. | ( n1 n2 -- n1 n2 n1 ) |
5 | SAVELOOP | Sauvegarde les registres LIMIT et STEP sur la pile rstack | (R: -- STEP LIMIT) |
6 | RESTLOOP | Restaure l'état des registres LIMIT et STEP à partir des valeurs au sommet de rstack | (R: STEP LIMIT -- ) |
7 | LOOPTEST | Vérifie si la variable de contrôle d'une boucle FOR a dépassé la valeur limite. | ( -- ) |
8 | RND | Génère un nombre pseudo aléatoire qui est empilé sur dstack | ( -- n ) |
9 | ABS | Remplace la valeur au sommet de dstack par sa valeur absolue | ( n -- n ) |
10 | BEEP | Fait entendre une tonalitée. Voir commande BASIC BEEP() | ( fr ms wait -- ) |
11 | TONE | Fait entendre une note de la gamme tempérér. Voir commande BASIC TONE() | (note ms wait -- ) |
12 | TICKS | Empile la valeur du compteur de millisecondes du système. Voi fonction BASIC TICKS() | ( -- u ) |
13 | SETTMR | Initialise la minuterie pause avec la valeur au sommet de la pile. Voir commande BASIC SETTMR() | ( n -- ) |
14 | TIMEOUT | retourne vrai si la minuterie pause est à zéro. Voir fonction BASIC TIMEOUT() | ( -- f ) |
15 | NOISE | Produit un bruit blanc d'une durée dont la valeur est au sommet de la pile. Voir commande BASIC NOISE() | ( u -- ) |
16 | CLS | Met tous les pixels de l'écran à la valeur indiquée au sommet de la pile. Voir commande BASIC CLS | ( n -- ) |
17 | LOCATE | positionne le curseur texte | (ligne col -- ) |
18 | BACK_COLOR | Fixe la couleur de fond d'écran pour le texte. | ( n -- ) |
19 | FONT_COLOR | Fixe la couleur des caractères. | ( n -- ) |
20 | EMIT | Affiche à la position courante du curseur le caractère au sommet de la pile. | ( n -- ) |
21 | DOT | Imprime l'entier au sommet de la pile. | ( n -- ) |
22 | WKEY | Attend que l'utilisateur entre un caractère au clavier | ( -- n ) |
23 | TYPE | Imprime la chaîne dont l'adresse est au sommet de la pile. | ( adr -- ) |
24 | ACCEPT | Lecture du clavier jusqu'à &tl;ENTER> | ( -- adr len) |
25 | SPACE | Imprime un espace (ASCII 32) | ( -- ) |
26 | CRLF | Renvoie le curseur texte au début de la ligne suivante. | ( -- ) |
27 | LITS | Chaîne litérale. Cet opcode est suivit d'un octet et d'une chaîne ASCIIZ. L'octet est la longueur de la chaîne incluant le zéro terminal. L'adresse de la chaîne est placé au sommet de la pile et IP est positionné après la chaîne. | IP=IP+LEN ( -- adr) |
28 | LIT | Entier litéral 16 bits. L'entier suit l'opcode et est empilé au sommet de la pile. | ( -- n) |
29 | LITC | Entier litéral 8 bits. L'entier suit l'opcode et est empilé au sommet de la pile. | ( -- n) |
30 | FETCH | Empile la variable entier 16 bits dont l'adresse est au sommet de la pile. | ( adr -- n ) |
31 | FETCHC | Empile la variable entier 8 bits dont l'adresse est au sommet de la pile. | ( adr -- c ) |
32 | STORE | Sauvegarde une variable entier 16 bits. var=n | ( n adr -- ) |
33 | STOREC | Sauvegarde une variable entier 8 bits. var#=c | ( c adr -- ) |
34 | NEGATE | Remplace l'entier au sommet de la pile par son complément à 2 | ( n -- -n ) |
35 | NOT | Remplace l'entier au sommet de la pile par son complément à 1 | ( n -- ~n ) |
36 | ADD | Addition | ( n1 n2 -- n1+n2 ) |
37 | SUB | Soustraction | ( n1 n2 -- n1-n2 ) |
38 | MUL | Multiplication | ( n1 n2 -- n1*n2 ) |
39 | DIV | Division entière | ( n1 n2 -- n1/n2 ) |
40 | MOD | Modulo | ( n1 n2 -- n1%n2 ) |
41 | SHR | Déclalage à droite de 1 bit. | ( n -- n/2 ) |
42 | SHL | Décalage à gauche de 1 bit. | ( n -- 2*n ) |
43 | SQRT | Racine carrée entière. | ( n -- sqrt(n) ) |
44 | EQUAL | Compare les 2 nombres pour l'égalité. Si égaux f=-1 sinon f=0. | ( n1 n2 -- f ) |
45 | NOTEQUAL | Compares les 2 nombres si différent f=-1 sinon f=0 | ( n1 n2 -- f ) |
46 | GT | Si n1>n2 f=-1 sinon f=0 | ( n1 n2 -- f ) |
47 | GE | Si n1>=n2 f=-1 sinon f=0 | ( n1 n2 -- f ) |
48 | LT | Si n1<n2 f=-1 sinon f=0 | ( n1 n2 -- f ) |
49 | LE | Si n1<=n2 f=-1 sinon f=0 | ( n1 n2 -- f ) |
50 | BRANCH | Branchement relatif inconditionnel. L'offset de 16 bits suis le opcode. IP=IP+offset | ( -- ) |
51 | ZBRANCH | Branchement relatif conditionnel à f=0.L'offset de 16 bits suis le opcode. IP=IP+offset | ( f -- ) |
52 | NZBRANCH | Branchement relatif condition à f<>0.L'offset de 16 bits suis le opcode. IP=IP+offset | ( f -- ) |
53 | CALL | Branchement à une sous-routine dont l'adresse de 16 bits suis le opcode. Empile IP sur rstack.
NOTE: Le opcode FRAME doit toujours être exécuté après celui-ci. | (R: -- IP ) |
54 | LEAVE | Sortie de sous-routine restore IP et FP. | (R: IP FP -- ) |
55 | STRCPY | Copy la chaîne ASCIIZ de src vers dest | ( sr dest -- ) |
56 | DOTS | Utilisé par TRACE pour afficher l'information sur rstack et dstack | ( -- ) |
57 | SAVESTEP | Initisalise le registre STEP avec la valeur qui est au sommet de la pile.
STEP=T | ( n -- ) |
58 | SAVELIMIT | Initialise le registre LIMIT avec la valeur qui est au sommet de la pile. LIMIT=T | ( n -- ) |
59 | NEXT | Incrémente la variable de contrôle d'une boucle FOR avec la valeur STEP. adr est l'adresse de la variable à incrémenter. | ( adr -- adr ) |
60 | BTEST | Test le bit b de n. Si b=1 f=-1 sinon f=0. | ( n b -- f ) |
61 | ALLOC | Réserve un bloc de size octets dans l'espace programme et empile l'adresse du bloc. Si l'espace libre est insuffisant empile 0. | ( size -- adr|0 ) |
62 | LCSTORE | Met le sommet de la pile dans la variable locale dont l'index suit l'opcode. [FP+2*I]=T | ( n -- ) |
63 | LCFETCH | Empile la valeur de la variable locale dont l'index suit l'opcdode. T=[FP+2*I] | ( -- n) |
64 | LCADR | Empile l'adresse absolue de la variable local dont l'index suit le opcode. T=FP+2*I | ( -- adr ) |
65 | FRAME | Sauvegarde FP sur rstack et ajuste FP à sa nouvelle valeur en utilisant l'octet qui suis le opcode.
FP=DSP+2*N | ( R: -- FP ) |
66 | LCVARSPACE | Réserve de l'espace sur dstack pour les variables locales. Le nombre de variables
locales suis l'opcode. DSP=DSP+2*N où N est la valeur qui suis le opcode. | ( ... -- ... ) |
67 | IDLE | Exécution d'une boucle vide pour une durée en msec=T. Voir instruction BASIC PAUSE() | ( n -- ) |
68 | JSTICK | Lecture du joystick et empile le résultat.Voir fonction BASIC JSTICK() | ( -- n ) |
69 | SETPIXEL | Fixe la valeur du pixel situé aux coordonnées {x,y} à la valeur c | (x y c -- ) |
70 | GETPIXEL | Empile la valeur du pixel situé aux coordonnées {x,y} | ( x y -- c ) |
71 | INT | Convertie en entier la chaîne ASCII qui se trouve dans le _pad. Le _pad est un espace réservé pour la saisie par INPUT. | ( -- n ) |
72 | XORPIXEL | Applique la fonction XOR au pixel situé au coordonnées {x,y} en utilisant la valeur n. | ( x y n -- ) |
73 | SCRLUP | Glisse l'affichage de n pixels vers le haut. | ( n -- ) |
74 | SCRLDN | Glisse l'affichage de n pixels vers le bas. | ( n -- ) |
75 | SCRLRT | Glisse l'affichage de n pixels vers la droite. n doit-être pair. | ( n -- ) |
76 | SCRLLT | Glisse l'affichage de n pixels vers la gauche. n doit-être pair. | ( n -- ) |
77 | LINE | Relie les coordonnées {x0,y0} et {x1,y} par une ligne droite. La valeur c est la couleur de ligne. | ( x0 y0 x1 y1 c -- ) |
78 | SPRITE | Applique un sprite à l'écran en utilisant la fonction XOR bit à bit. Les coordonnées {x,y} représente la position du coin supérieur gauche. w est la largeur en pixels. h est la hauteur en pixel. adr est l'adresse du sprite. Empile un indicateur de collision. f=-1 si collision sinon f=0. | .( x y w h adr -- f) |
79 | OR | Fonction binaire OU inclusif. | ( n1 n2 -- n1|n2 ) |
80 | XOR | Fonction binaire OU exclusif. | ( n1 n2 -- n1^n2 ) |
81 | AND | Fonction binaire ET. | ( n1 n2 -- n1&n2 ) |
82 | TRACE | Active ou désactive le pas à pas de débogage. Déctive si f=0, autrement active. | ( f -- ) |
83 | ROT | Rotation des 3 éléments supérieurs de la pile dstack. | ( n1 n2 n3 -- n1 n2 n3 ) |
84 | BOX | Dessine une rectangle plein de couleur c dont le coin supérieur gauche est aux coordonnées {x,y}. w est la largeur en pixels et >h la hauteur. | ( x y w h c -- ) |
85 | KEY | Lecture du clavier. S'il n'y pas de touche enfoncée retourne 0. | ( -- k|0 ) |
86 | RECT | Dessine un rectangle vide de couleur c dont le coin supérieur gauche est aux coordonnées {x,y}. w est la largeur en pixels et >h la hauteur. | ( x y w h c -- ) |
87 | LEN | retourne la longueur de la chaîne ASCIIZ dont l'adresse est au sommet de la pile. | ( adr -- n ) |
88 | SRLOAD | Charge un fichier dans la mémoire SPI RAM. adr est l'adresse de la chaîne ASCIIZ qui correspond au nom du fichier. n est le nombre d'octets lus. | ( adr -- n ) |
89 | SRSAVE | Sauvegarde la mémoire SPI RAM dans un fichier. adr est un pointeur sur le nom du fichier et size est le nombre d'octets à sauvegarder. | |
90 | SRCLEAR | Met à zéro une région de la mémoire SPI RAM. adr est l'adresse de début. size est la grandeur en octets. | ( adr size -- ) |
91 | SRREAD | Copie d'une région de la mémoire SPI RAM dans une variable. adr est l'adresse du début de la région et size est le nombre d'octets à copier. var est un pointeur sur la variable. | ( adr var size -- ) |
92 | SRWRITE | Copie du contenu d'une variable dans la mémoire SPI RAM. adr est l'adresse de début de la copie dans SPI RAM. size est le nombre d'octets à copier. var est un pointeur sur la variable. | (adr var size -- ) |
93 | MIN | Conserve le plus petit des 2 entiers. | ( n1 n2 -- min ) |
94 | MAX | Conserve le plus grand des 2 entiers. | ( n1 n2 -- min ) |
95 | MDIV | Multiplication double précision suivit d'une division. | (n1 n2 n3 -- n1*n2/n3 ) |
96 | UBOUND | Empile l'indice supérieur du tableau dont l'adresse est au sommet de la pile. | ( adr -- u ) |
97 | VIDEOCTRL | Activation ou désactivation de la sortie vidéo. Si f=0 la sortie vidéo est activée sinon elle est déscativée. | ( f -- ) |
98 | CURLINE | Empile la ligne du curseur texte. | ( - u ) |
99 | CURCOL | Empile la colonne du curseur texte. | ( -- u ) |