referencepcode

Ceci est une ancienne révision du document !


Toutes les instructions p-code ont une mnémonique de 4 caractères. D'éventuels paramètres peuvent se trouver à la suite.
Les paramètres possibles sont :

  • d1 : nombre non signé sur 8 bits, de 0 à 255
  • d3 : nombre non signé sur 24 bits, de 0 à 16777215 (en big-endian)
  • d8 : nombre non signé sur 64 bits (en big-endian)
  • string : chaîne de caractères (mono-octet), précédée de sa longueur, soit sur 1 octet (d1), soit sur 3 octets (d3)

Concernant la syntaxe assembleur, les paramètres ont la signification suivante :

  • <num3> : numérique non signé sur 3 chiffres
  • <num8> : numérique non signé sur 8 chiffres
  • <number> : nombre positif ou négatif sur 19 chiffres
  • <string> : chaîne de 1 à 255 caractères
  • <strmod> : chaîne de 3 à 45 caractères
  • <dquote> : chaîne de 0 à 255 caractères, entourée de double quote
  • <oper> : chaîne valant EQNELTGTLEGEANDORNOT
  • <operdyn> : chaîne valant EQNELTGTLEGE
  • <varsys> : chaîne de caractères contenant le nom d'une variable système

Gestion des adresses et sauts : en construction.

Dans l'ordre de la traduction numérique de chaque instruction. La taille donne le nombre d'octets pris par chaque instruction.

CodeInstructionParamètresTailleLibelléSyntaxe assembleur
000VERSd12Ne fait rien, donne la version du compilé qui s'exécuteVERS <num3>
001JUMPd34Saut a l'adresse d3, en relatif par rapport au début du bloc en cours : programme ou sub
002DECLd1 string2+d1Déclare une variable dont le nom est <string> et de longueur <d1>. La longueur <d1> du nom de la variable est [1 , 24]DECL <string>
003SRCLd34Indique le début du code correspondant à la ligne <d3> du code source W, pour le fichier en cours (principal / include). Sert de point d'arrêt en mode debug. N° de ligne pris en compte dans le calcul de la couverture de codeSRCL <num8>
004BEXCd34Donne l'adresse du bloc exception, juste après instruction EXCE, en relatif a partir de BEXCBEXC
005EXCE 1Marque la fin du bloc de traitement et le début du bloc exception, du programme ou sous-programme en cours. Si l'exécuteur de code arrive à cette instruction sans exception, cela force le retour à l'appelantEXCE
006CATC 1Efface l'exception en cours, dans le bloc exception uniquement, et force le retour à l'appelantCATC
007THRWd34Lève une exception de n° <d3>. Dans le bloc traitement, provoque le saut au début du bloc exception. Dans le bloc exception, remplace l'exception courante et force le retour à l'appelantTHRW <num8>
008PARTd12Définit le numéro de la portion de code en coursPART <num3>
009RETN 1Force le retour à l'appelant, valide dans le bloc de traitement et le bloc exceptionRETN
010CALLd1 string2+d1Appelle la sub <string>CALL _
CALL <string>
011PARMd1 string2+d1Dépile dans la call stack un pointeur et créé la variable PARAM correspondante dans la hash locale sur ce nom pour ce pointeur. A utiliser avec l'instruction de déclaration d'une sub SUBRPARM <string>
012SUBRd1 string d35+d1Déclaration d'une sub de nom <string> (remplace DECL pour les sub) et force un saut dans le code après le ENDS, en relatif par rapport à l'instruction SUBRSUBR <string>
013COMPd12Compare les 2 éléments de la pile, les dépile puis empile 1 si le résultat de la comparaison est vrai, 0 si faux. Les opérateurs de comparaisons sont, de 1 à 9 ⇒ = # < > <= >= and or not COMP <oper>
014JMPFd34Force un saut dans le code si la dernière comparaison était fausse ⇒ l'élément de la pile = 0. La valeur est dépilée. Le saut (d3) est en relatif par rapport au début du programme ou sous-programme en cours
015JMPTd34Force un saut dans le code si la dernière comparaison était vraie ⇒ même comportement sinon que JMPF
016ADDN 1Additionne les 2 éléments de la pile, dépile les 2 éléments et empile le résultat. Si une valeur Dynamic est empilée, un conversion numérique est essayée, avec levée d'exception si la conversion n'est pas possible (valeur non numérique)ADDN
017SBCN 1Soustrait les 2 éléments de la pile, comportement identique à ADDNSBCN
018MULN 1Multiplie les 2 éléments de la pile, comportement identique à ADDNMULN
019DIVN 1Divise les 2 éléments de la pile, comportement identique à ADDN, exception si diviseur nulDIVN
020INTE 1Prend la valeur entière de la pile, dépile et empile le résultat, conversion essayée si la valeur est un DynamicINTE
021FRAC 1Prend la valeur fractionnaire de la pile, comportement identique à INTEFRAC
022NEGN 1Prend la valeur entière de la pile, comportement identique à INTENEGN
023ABSN 1Prend la valeur entière de la pile, comportement identique à INTEABSN
024MODLd1 string2+d1Appel d'un module externe (dlfcn.h module.o ayant un seul point d'entrée), les paramètres sont pris de la call stack (maximum 3) ; la chaine doit être de la forme ⇒ module@fonctionMODL <strmod>
025PSHCd89Pousse sur la pile la constante sur 64 bits d8 (en big endian)PSHC <number>
026PSHV 1Empile la variable en cours ad_var PSHV
027POPV 1Dépile dans la variable en cours ad_var POPV
028PVARd1 string2+d1Met dans ad_var l'adresse de la variable, soit de la hash locale soit de la hash globale (+ gestion mode “typeof”)PVAR <string>
029PVAHd1 string2+d1Met dans ad_var l'adresse de la variable lue de la hashtable pointée elle aussi par ad_var (+ gestion mode “typeof”)PVAH <string>
030WRIT 1Ecrit dans la console (sortie standard) le contenu de la variable pointée par ad_var (Number ou Dynamic), ne fait rien si programme demon WRIT
031WRLN 1Identique à WRIT avec de plus un saut de ligne écrit à la finWRLN
032DSETd1 string2+d1Affecte la chaine <string> à la variable pointée par ad_var (maxi. 255 caractères)DSET <dquote>
033DEXV 1Correspond à <ad_var>{pile, pile} = pile (suite PVAR)DEXV
034DCMPop d1 string3+d1Compare la chaine de la variable pointée par ad_var avec le contenu de la variable de nom <string> (op: = # < > <= >=, 1 a 6). Le résultat est empilé, 1 si condition vraie, 0 si fausseDCMP <operdyn> <string>
035DSTOd1 string2+d1Correspond à <ad_var>{pile,pile} = variable <nom>. Si <d1> = 0, le contenu est lu de int_dynamic. Si une valeur de pile vaut 0, le contenu complet calculé précédemment est gardé.DSTO _
DSTO <string>
036LETVd1 string2+d1Affectation simple de variable. La variable de nom <string> reçoit la valeur de celle pointée par ad_var. Si <d1> = 0, l'affectation va dans int_dynamic.VLET _
VLET <string>
037DCATd1 string2+d1Concaténation : à la variable de nom <string> est concaténée la valeur de celle pointée par ad_var. Si <d1> = 0, la concaténation se fait dans int_dynamic.DCAT _
DCAT <string>
038DTON 1Convertit la variable pointée par ad_var en numérique et l'empileDTON
039NTOD 1Dépile et convertit le nombre en chaine, mis dans ad_var.NTOD
040DELE 1Supprime la variable <ad_var> de la hash locale/globale et effectue les libérations associées (sauf si objet/sub)DELE <string>
041HLET 1Affecte à la variable pointée par ad_var une hashtable vierge. Le modulo et séparateur sont dans la pile, si 0 une valeur par défaut est utilisée.HLET
042CLASd1 strin1 d1 string22+d1Créé une classe globale de nom <string1> héritée de la classe de nom <string2>. Si <d1> de <string2> = 0, la classe Base comme classe mère est prise par défaut.CLAS <string>
043NLETd1 string2+d1Instancie un objet, global, de la classe de nom <string>. La variable pointée par ad_var prend le type VAR_PARAM et pointe sur l'objet créé.NLET <string>
044INCLd1 string2+d1Include dans le source W : indique un changement de fichier source en cours (utile au debugger). Si <d1> = 0, correspond à un retour d'include.INCL <string>
INCL
045PNAMd1 string2+d1Nom du programme principal (PROG ou BACK).PNAM <string>
PNAM
046PSH0 1Empile la constante 0PSH0
047PSH1 1Empile la constante 1PSH1
048PSH2 1Empile la constante 2PSH2
049PSH3 1Empile la constante 3PSH3
050PSH4 1Empile la constante 4PSH4
051PSH5 1Empile la constante 5PSH5
052PSH6 1Empile la constante 6PSH6
053PSH7 1Empile la constante 7PSH7
054PSH8 1Empile la constante 8PSH8
055PSH9 1Empile la constante 9PSH9
056PSHAd12Empile la @VARSYS de code d1PSHA <varsys>
057SQRT 1Calcule le racine carre de la pile, dépile et empile le résultatPROG
058IEXP 1Puissance entiere a partir des 2 elements de la pile, dépile les 2 nombres et empile le résultatBACK
059CLIBd1 string2+d1Appel de la library de nom <string>. Les paramètres sont pris de la call stack. <string>.wp est le nom du fichier binaire qui est chargé en mémoire (binaire W)CLIB <string>
060PVAId1 string2+d1Met dans ad_var l'adresse de la variable lue de la hashtable pointée elle aussi par ad_var, mais via une indirection : la variable de nom <string> donne le vrai nom de la variable à chercher (+ gestion mode “typeof”)PVAI <string>
061DIVE 1Divise les 2 éléments de la pile en gardant la partie entière uniquement, comportement identique à ADDN, exception si diviseur nulDIVE
062MODN 1Divise les 2 éléments de la pile en gardant le reste uniquement (modulo), comportement identique à ADDN, exception si diviseur nulMODN
063INPT 1Réalise une saisie au clavier (entrée standard) et met le résultat dans la variable pointée par ad_var, convertie en chaineINPT
064PVAT 1Met dans le pointeur de variable ad_var l'adresse d'une variable temporaire _tmp999 automatique, pour accès immédiat dans l'instruction suivantePVAT
065TYPO 1Fait passer le programme en cours en mode typeof, pour ne pas générer d'exception si une variable est inconnue dans les syntaxes du type ?var.var2!var3. etc.. Renvoie le typeof. Attention : entre les instructions TYPO et PSHT ne doivent se trouver que des instructions PVAR et n fois PVAH/PVAITYPO
066PSHT 1Empile le type de la variable pointée par ad_var (typeof), -1 si inconnu. Cette instruction annule le mode typeof (annulation a faire aussi quand exception autre que var inconnue)PSHT
067CRAZ 1Vide la call stack servant au passage des paramètres avant les instruction CALL CLIB MODLCRAZ
068CPANd1 string2+d1Empile dans la call stack la var <ad_var> en nommant le parametre <string> (a utiliser avant CALL/CLIB/MODL)CPSH <string>
069RETT 1Dépile et si la valeur est # 0 (vrai), force le retour à l'appelant, valide dans le bloc de traitement et le bloc exceptionRETT
070SELE 1initialise la var de ad_var pour foreach dynamic/hashtableSELE
071RNXT 1lit l'item suivant de ad_var et met le résultat dans la var empilée dans la call stak (dépilage au passage)RNXT
072CPHA 1empile dans la call stack la var ad_var en paramCPHA
073PHDEd1 string2+d1enchainement PVAH/PVAI, en dernier crée/remplace dans la hash la var <string> avec le contenu de la pile (number/dynamic) - letPHDE <string>
074PIDEd1 string2+d1enchainement PVAH/PVAI, en dernier crée/remplace dans la hash (avec indirection) la var <string> avec le contenu de la pile (number/dynamic) - letPIDE <string>
075PHDHd1 string2+d1enchainement PVAH/PVAI, en dernier crée/remplace dans la hash la var hash <string> (la pile contient modulo/séparateur) - letPHDH <string>
076PIDHd1 string2+d1enchainement PVAH/PVAI, en dernier crée/remplace dans la hash (avec indirection) la var hash <string> (la pile contient modulo/séparateur) - letPIDH <string>
077PHDOd1 string2+d1enchainement PVAH/PVAI, en dernier cherche la sub <string> dans la classe, si pas trouve dans les classes mèresPJDO <string>
078PIDOd1 string 2+d1enchainement PVAH/PVAI, en dernier cherche la sub <string> (avec indirection) dans la classe, si pas trouve dans les classes mèresPIDO <string>
079PHDSd1 string d3 5+d1enchainement PVAH/PVAI, en dernier crée/remplace dans la hash la sub <string>PHDS <string> <d3>
080PIDSd1 string d3 5+d1enchainement PVAH/PVAI, en dernier crée/remplace dans la hash (avec indirection) la sub <string>PIDS <string> <d3>
081TYPE 1trouve le type de l'élément de la pile num/str/vide, dépile + met le résultatTYPE
082ROUN 1arrondi l'élément pile2 sur le nombre de décimales pile1, dépile et arrondi l'élément de la pile
si nb décimales n'est pas 0 1 2 3 4 5, utilise la précision courante
ROUN
083LENG 1calcule la longueur de l'élément de la pile (comme si chaine), dépile + met le résultatLENG
084COUN 1compte le nombre de caractère (1er de pile2) trouve dans pile1, dépile + met le résultatCOUN
085DCOF 1dcount(var), comme le nombre de champs, en prenant le séparateur courantDCOF
086FIEL 1”fonction _ckgedit_QUOTckgedit>field_ckgedit_QUOTckgedit> : chercher dans la chaine pile1, avec le caractère pile2 (1er car), le champ no pile3, dépile + met le résultatFIEL
087INDX 1index(var, search, occ)INDX
088SRCH 1search(var) search string in fieldSRCH
089CHNG 1change(var, cherche, remplace)CHNG
090FMTA 1format - alignment (left right center)FMTA
091INSE 1insert(var, chaine, field)INSE
092REMV 1remove(var, field)REMV
093TONU 1tonum : force la conversion de l'élément de la pile en numérique, exception si non numériqueTONU
094TOST 1tostring : force la conversion de l'élément de la pile en chaineTOST
095CCAT 1concat : : concatène pile1 et pile2, dépile 2 fois + met le résultat“CCAT
096SSTR 1substring ou notation [9,9] : prend la substring de la pile + met le résultat (base 0 pour début, longueur ; si 1 seul param : part de la fin (que longueur))SSTR
097SSEP 1set sep : prend les séparateur de la pile + dépile les 2 + maj séparateurSSEP
098FLDF 1idem FIEL mais utilise le séparateur @currfm (pour faire x{1})FLDF
099FLDS 1idem FIEL mais utilise le séparateur @currfm et @currvm (pour faire x{1,2})FLDS
100DCOS 1dcount(var, numchamp)DCOS
101FMTT 1Format trim FMTT
102FMTS 1Format surround FMTS
103SCHS 1search(var, numField) search string in subfield of the field givenSCHS
104INSS 1insert(var, chaine, field, subfield)INSS
105REMS 1remove(var, field, subfield)REMS
106DEXHd1 string2+lgad_var_hash.string<pile1, pile2> = pile3 (suite PHDE)DEXH
107DEXId1 string2+lgad_var_hash!string<pile1, pile2> = pile3 (suite PIDE)DEXI
108PRECd1 2force la précision a <d1> décimales (de 0 a 5)PREC <d1>
109DESV 1ad_var[pile1, pile2] = pile3 (suite PVAR)DESV
110DESHd1 string2+lgad_var_hash.string[pile1, pile2] = pile3 (suite PHDE/PIDE)DESH
111DESId1 string2+lgad_var_hash!string[pile1, pile2] = pile3 (suite PHDE/PIDE)DESI
112DEZV 1ad_var<pile1, pile2>[pile3, pile4] = pile5 (suite PVAR)DEZV
113DEZHd1 string2+lgad_var_hash.string<pile1, pile2>[pile3, pile4] = pile5 (suite PHDE/PIDE)DEZH
114DEZId1 string2+lgad_var_hash!string<pile1, pile2>[pile3, pile4] = pile5 (suite PHDE/PIDE)DEZI
115SDBGd3 string4+d3liste des fichiers sources + num lignes (pour debugger)SDBG <string>
116PHDNd1 string2+lgenchainement PVAH/PVAI, en dernier cree/remplace dans la hash <ad_var_hash> la var <string > qui sera utilisée ensuite par NLET (mis dans <ad_var>)PHDN <string>
117PIDNd1 string2+lgenchainement PVAH/PVAI, en dernier cree/remplace dans la hash <ad_var_hash> (avec indirection) la var <string > qui sera utilisée ensuite par NLET (mis dans <ad_var>)PIDN <string>
118SADV 1sauvegarde ad_var dans ad_var_sav (suite enchainement PVAR/PVAH/PVAI)SADV
119VLET 1affectation de variable sans expression, traite tous les types. Correspond a : ad_var = ad_var_sav (copie)VLET
120PHDVd1 string2+lgidem VLET mais en fin de chaine de vars hash pour la var <string>PHDV <string>
121PIDVd1 string2+lgidem VLET mais en fin de chaine de vars hash pour la var <string>, avec indirectionPIDV <string>
122HCOU 1idem PVAH/PVAI mais renvoi le nombre d'élément de la hash/objet en cours (dans ad_var = e→int_number)HCOU
123PVHDd1 string2+lgenchainement PVAH/PVAI, en dernier supprime dans la hash <ad_var_hash> la var <string> (idem DELE mais avec suppression)
124PVIDd1 string2+lgenchainement PVAH/PVAI, en dernier supprime dans la hash <ad_var_hash> la var <string> (avec indirection) (idem DELE mais avec suppression)
125SSRC 1sortedsearch(var) search sorted string in field
126SSCS 1search(var, numField) search sorted string in subfield of the field given
127CPHH 1idem CPHA mais avec flag positionne indiquant l'empilage d'une var appartenant a une hash
128CPHNd1 string2+lgempile dans la call stack la var ad_var en nommant le parametre <nom> (idem CPAN) et avec flag positionne indiquant l'empilage d'une var appartenant a une hash
250PROG 1Indique que le binaire est un programme, premiere instruction du binaire sinon endp
251LIBR 1Indique que le binaire est une library, pas un programme exécutable directement. Première instruction du binaire.LIBR
252ENDL 1Fin de library, avec libération des éléments locaux à la library uniquementENDL
253BACK 1Indique un binaire executable en mode demon, premiere instructionTEST
254ENDS 1Fin du sous-programme en cours, avec libération des éléments locaux à la sub uniquementENDS
255ENDP 1Fin du programme principale en cours, en effectuant toutes les libérations mémoires. Instruction appelée de manière forcée en cas d'erreur non gérable par une exceptionENDP
  • referencepcode.1785673421.txt.gz
  • Dernière modification : 2026/08/02 12:23
  • de root