machine virtuelle du PV16SOG

machine virtuelle du PV16SOG

Licence

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

Présentation

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.

Architecture

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.

codes machines

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.

.
opcodemnémoniquedescriptionétat stacks
0BYETermine l'exécution du programme et sortie de la machine virtuelle. Void commane BASIC BYE( -- )
1DROPJette l'élément au sommet de la pile dstack.( n -- )
2DUPClone le sommet de la pile dstack( n -- n n )
3SWAPInterchange les 2 éléments au sommet de dstack( n1 n2 -- n2 n1 )
4OVERCopie le 2ième élément de la pile dstack au sommet.( n1 n2 -- n1 n2 n1 )
5SAVELOOPSauvegarde les registres LIMIT et STEP sur la pile rstack(R: -- STEP LIMIT)
6RESTLOOPRestaure l'état des registres LIMIT et STEP à partir des valeurs au sommet de rstack (R: STEP LIMIT -- )
7LOOPTESTVérifie si la variable de contrôle d'une boucle FOR a dépassé la valeur limite.( -- )
8RNDGénère un nombre pseudo aléatoire qui est empilé sur dstack( -- n )
9ABSRemplace la valeur au sommet de dstack par sa valeur absolue( n -- n )
10BEEPFait entendre une tonalitée. Voir commande BASIC BEEP()( fr ms wait -- )
11TONEFait entendre une note de la gamme tempérér. Voir commande BASIC TONE()(note ms wait -- )
12TICKSEmpile la valeur du compteur de millisecondes du système. Voi fonction BASIC TICKS()( -- u )
13SETTMRInitialise la minuterie pause avec la valeur au sommet de la pile. Voir commande BASIC SETTMR()( n -- )
14TIMEOUTretourne vrai si la minuterie pause est à zéro. Voir fonction BASIC TIMEOUT()( -- f )
15NOISEProduit un bruit blanc d'une durée dont la valeur est au sommet de la pile. Voir commande BASIC NOISE()( u -- )
16CLSMet tous les pixels de l'écran à la valeur indiquée au sommet de la pile. Voir commande BASIC CLS( n -- )
17LOCATEpositionne le curseur texte(ligne col -- )
18BACK_COLORFixe la couleur de fond d'écran pour le texte.( n -- )
19FONT_COLORFixe la couleur des caractères.( n -- )
20EMITAffiche à la position courante du curseur le caractère au sommet de la pile.( n -- )
21DOTImprime l'entier au sommet de la pile.( n -- )
22WKEYAttend que l'utilisateur entre un caractère au clavier( -- n )
23TYPEImprime la chaîne dont l'adresse est au sommet de la pile.( adr -- )
24ACCEPTLecture du clavier jusqu'à &tl;ENTER>( -- adr len)
25SPACEImprime un espace (ASCII 32)( -- )
26CRLFRenvoie le curseur texte au début de la ligne suivante.( -- )
27LITSChaî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)
28LITEntier litéral 16 bits. L'entier suit l'opcode et est empilé au sommet de la pile.( -- n)
29LITCEntier litéral 8 bits. L'entier suit l'opcode et est empilé au sommet de la pile.( -- n)
30FETCHEmpile la variable entier 16 bits dont l'adresse est au sommet de la pile.( adr -- n )
31FETCHCEmpile la variable entier 8 bits dont l'adresse est au sommet de la pile.( adr -- c )
32STORESauvegarde une variable entier 16 bits. var=n( n adr -- )
33STORECSauvegarde une variable entier 8 bits. var#=c( c adr -- )
34NEGATERemplace l'entier au sommet de la pile par son complément à 2( n -- -n )
35NOTRemplace l'entier au sommet de la pile par son complément à 1( n -- ~n )
36ADDAddition( n1 n2 -- n1+n2 )
37SUBSoustraction( n1 n2 -- n1-n2 )
38MULMultiplication( n1 n2 -- n1*n2 )
39DIVDivision entière( n1 n2 -- n1/n2 )
40MODModulo( n1 n2 -- n1%n2 )
41SHRDéclalage à droite de 1 bit.( n -- n/2 )
42SHLDécalage à gauche de 1 bit.( n -- 2*n )
43SQRTRacine carrée entière.( n -- sqrt(n) )
44EQUALCompare les 2 nombres pour l'égalité. Si égaux f=-1 sinon f=0.( n1 n2 -- f )
45NOTEQUALCompares les 2 nombres si différent f=-1 sinon f=0( n1 n2 -- f )
46GTSi n1>n2 f=-1 sinon f=0( n1 n2 -- f )
47GESi n1>=n2 f=-1 sinon f=0( n1 n2 -- f )
48LTSi n1<n2 f=-1 sinon f=0( n1 n2 -- f )
49LESi n1<=n2 f=-1 sinon f=0( n1 n2 -- f )
50BRANCHBranchement relatif inconditionnel. L'offset de 16 bits suis le opcode. IP=IP+offset( -- )
51ZBRANCHBranchement relatif conditionnel à f=0.L'offset de 16 bits suis le opcode. IP=IP+offset ( f -- )
52NZBRANCHBranchement relatif condition à f<>0.L'offset de 16 bits suis le opcode. IP=IP+offset ( f -- )
53CALLBranchement à 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 )
54LEAVESortie de sous-routine restore IP et FP.(R: IP FP -- )
55STRCPYCopy la chaîne ASCIIZ de src vers dest( sr dest -- )
56DOTSUtilisé par TRACE pour afficher l'information sur rstack et dstack( -- )
57SAVESTEPInitisalise le registre STEP avec la valeur qui est au sommet de la pile.
STEP=T
( n -- )
58SAVELIMITInitialise le registre LIMIT avec la valeur qui est au sommet de la pile.
LIMIT=T
( n -- )
59NEXTIncré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 )
60BTESTTest le bit b de n. Si b=1 f=-1 sinon f=0.( n b -- f )
61ALLOCRé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 )
62LCSTOREMet le sommet de la pile dans la variable locale dont l'index suit l'opcode.
[FP+2*I]=T
( n -- )
63LCFETCHEmpile la valeur de la variable locale dont l'index suit l'opcdode.
T=[FP+2*I]
( -- n)
64LCADREmpile l'adresse absolue de la variable local dont l'index suit le opcode.
T=FP+2*I
( -- adr )
65FRAMESauvegarde FP sur rstack et ajuste FP à sa nouvelle valeur en utilisant l'octet qui suis le opcode.
FP=DSP+2*N
( R: -- FP )
66LCVARSPACERé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.
( ... -- ... )
67IDLEExécution d'une boucle vide pour une durée en msec=T. Voir instruction BASIC PAUSE()( n -- )
68JSTICKLecture du joystick et empile le résultat.Voir fonction BASIC JSTICK()( -- n )
69SETPIXELFixe la valeur du pixel situé aux coordonnées {x,y} à la valeur c(x y c -- )
70GETPIXELEmpile la valeur du pixel situé aux coordonnées {x,y}( x y -- c )
71INTConvertie 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 )
72XORPIXELApplique la fonction XOR au pixel situé au coordonnées {x,y} en utilisant la valeur n.( x y n -- )
73SCRLUPGlisse l'affichage de n pixels vers le haut.( n -- )
74SCRLDNGlisse l'affichage de n pixels vers le bas.( n -- )
75SCRLRTGlisse l'affichage de n pixels vers la droite. n doit-être pair.( n -- )
76SCRLLTGlisse l'affichage de n pixels vers la gauche. n doit-être pair.( n -- )
77LINERelie 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 -- )
78SPRITEApplique 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)
79ORFonction binaire OU inclusif.( n1 n2 -- n1|n2 )
80XORFonction binaire OU exclusif.( n1 n2 -- n1^n2 )
81ANDFonction binaire ET.( n1 n2 -- n1&n2 )
82TRACEActive ou désactive le pas à pas de débogage. Déctive si f=0, autrement active.( f -- )
83ROTRotation des 3 éléments supérieurs de la pile dstack.( n1 n2 n3 -- n1 n2 n3 )
84BOXDessine 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 -- )
85KEYLecture du clavier. S'il n'y pas de touche enfoncée retourne 0.( -- k|0 )
86RECTDessine 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 -- )
87LENretourne la longueur de la chaîne ASCIIZ dont l'adresse est au sommet de la pile.( adr -- n )
88SRLOADCharge 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 )
89SRSAVESauvegarde 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.
90SRCLEARMet à 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 -- )
91SRREADCopie 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 -- )
92SRWRITECopie 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 -- )
93MINConserve le plus petit des 2 entiers.( n1 n2 -- min )
94MAXConserve le plus grand des 2 entiers.( n1 n2 -- min )
95MDIVMultiplication double précision suivit d'une division.(n1 n2 n3 -- n1*n2/n3 )
96UBOUNDEmpile l'indice supérieur du tableau dont l'adresse est au sommet de la pile.( adr -- u )
97VIDEOCTRLActivation 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 -- )
98CURLINEEmpile la ligne du curseur texte.( - u )
99CURCOLEmpile la colonne du curseur texte.( -- u )