Référence technique

Guide de langage PC-BASIC

Format de fichiers tokenisés

Un fichier de programme à jetons sur un périphérique de disque a le format suivant.

Octet magique FF

Lignes de programme

Chaque ligne est stockée comme suit :

Octets  Format Signification
2

Entier little-endian 16 bits non signé.

Emplacement mémoire de la ligne suivant la ligne courante.
Ceci est utilisé en interne par GW-BASIC mais ignoré lorsqu'un programme est chargé.
2

Variable

1
Entier little-endian 16 bits non signé.

BASIC tokenisé, voir ci-dessous.

00 (octet NUL)
Le numéro de ligne.

Le contenu de la ligne.

Marqueur de fin de ligne.

Marqueur de fin de fichier

Un 1A est écrit pour marquer la fin du fichier. Ceci est facultatif ; le fichier sera lu sans problème s'il est omis.

BASIC tokenisé

Les caractères ASCII imprimables compris entre 20 et 7E sont utilisés pour les littéraux de chaîne, les commentaires, les noms de variable et les éléments de syntaxe d'instruction qui ne sont pas des mots réservés. Les mots réservés sont représentés par leurs jetons de mots réservés et les littéraux numériques sont représentés par des séquences de jetons numériques.

Séquences de jetons numériques

Les littéraux numériques sont stockés dans des programmes tokenisés selon la représentation suivante.

Tous les nombres sont positifs ; les nombres négatifs sont stockés simplement en faisant précéder le nombre de EA , le jeton pour -.

Classe Octets Format
Numéros de ligne indirects 3 0E suivi d'un entier little-endian 16 bits non signé.
Entiers octaux 3 0B suivi d'un entier little-endian 16 bits non signé.
Entiers hexadécimaux 3 0C suivi d'un entier little-endian 16 bits non signé.
Entiers décimaux positifs inférieurs à 11 1 Les jetons 11—1B représentent 0—10.
Entiers décimaux positifs inférieurs à 256 2 0F suivi d'un entier 8 bits non signé.
Autres entiers décimaux 3 1C suivi d'un complément à deux signé 16 bits little-endian.

GW-BASIC reconnaîtra un nombre négatif rencontré de cette façon mais il ne stockera pas lui-même les nombres négatifs en utilisant le complément à deux, mais plutôt en faisant précéder le nombre positif avec EA.
Nombre à virgule flottante simple précision 5 1D suivi d'un single de quatre octets au format binaire Microsoft.
Nombre à virgule flottante double précision 9 1F suivi d'un double de huit octets au format binaire Microsoft.

Jetons de mot-clé La plupart des mots-clés dans PC-BASIC sont des mots réservés. Les mots réservés sont représentés dans un programme tokenisé par un jeton à un ou deux octets.

La liste complète est ci-dessous. Tous les noms de fonctions et opérateurs sont des mots réservés et toutes les instructions commencent par un mot réservé (qui dans le cas de LET est facultatif). Cependant, l'inverse n'est pas vrai : tous les mots réservés ne sont pas des instructions, des fonctions ou des opérateurs.

Par exemple, TO et SPC( n'apparaissent que dans le cadre d'une syntaxe d'instruction. De plus, certains mots clés qui font partie de la syntaxe d'une instruction ne sont pas des mots réservés : par exemple, AS , BASE et ACCESS.

Les mots-clés qui ne sont pas des mots réservés sont épelés en texte intégral dans la source tokenisée. Un nom de variable ou de fonction définie par l'utilisateur ne doit pas être identique à un mot réservé. La liste ci-dessous est une liste exhaustive de mots réservés qui peuvent être utilisés pour déterminer si un nom est légal.

81 END
84 DATA
87 READ
8A RUN
8D GOSUB
90 STOP
93 LIST
96 WAIT
99 CONT
9E LLIST
A2 TRON
A5 ERASE
A8 RESUME
AB RENUM
AE DEFSNG
B1 WHILE
B7 WRITE
BA OPEN
BD MERGE
C0 CLS
C3 BLOAD
C6 PSET
C9 KEY
CD THEN
D0 USR
D3 NOT
D6 STRING$
D9 '
DC POINT
E6 >
E9 +
EC /
EF OR
F2 IMP
FD81 CVI
FD84 MKI$
FD8B EXTERR
FE83 SYSTEM
FE86 RSET
FE89 GET
FE8C CHAIN
FE8F PAINT
FE92 DRAW
FE95 ERDEV
FE98 MKDIR
FE9B ENVIRON
FE9E PMAP
FEA1 CALLS
FEA8 UNLOCK
FF83 MID$
FF86 ABS
FF89 SIN
FF8C COS
FF8F FRE
FF92 LEN
FF95 ASC
FF98 SPACE$
FF9A HEX$
FF9E CDBL
FFA1 STICK
FFA4 LOC
82 FOR
 85 INPUT
88 LET
8B IF
8E RETURN
91 PRINT
94 NEW
97 DEF
9C OUT
A0 WIDTH
A3 TROFF
A6 EDIT
A9 DELETE
AC DEFSTR
AF DEFDBL
B2 WEND
B8 OPTION
BB CLOSE
BE SAVE
C1 MOTOR
C4 SOUND
C7 PRESET
CA LOCATE
CE TAB(
D1 FN
D4 ERL
D7 USING
DA VARPTR
DD OFF
E7 =
EA -
ED ^
F0 XOR
F3 MOD
FD82 CVS
FD85 MKS$
FE81 FILES
FE84 NAME
FE87 KILL
FE8A RESET
 FE8D DATE$
FE90 COM
FE93 PLAY
FE96 IOCTL
FE99 RMDIR
FE9C VIEW
FE9F PALETTE
FEA5 PCOPY
FF81 LEFT$
FF84 SGN
FF87 SQR
FF8A LOG
FF8D TAN
FF90 INP
FF93 STR$
FF96 CHR$
FF99 OCT$
FF9C CINT
FF9F FIX
FFA2 STRIG
FFA5 LOF
83 NEXT
 86 DIM
89 GOTO
8C RESTORE
8F REM
92 CLEAR
95 ON
98 POKE
9D LPRINT
A1 ELSE
A4 SWAP
A7 ERROR
AA AUTO
AD DEFINT
B0 LINE
B3 CALL
B9 RANDOMIZE
BC LOAD
BF COLOR
C2 BSAVE
C5 BEEP
C8 SCREEN
CC TO
CF STEP
D2 SPC(
D5 ERR
D8 INSTR
DB CSRLIN
DE INKEY$
E8 <
EB *
EE AND
F1 EQV
F4 \
FD83 CVD
FD86 MKD$
FE82 FIELD
FE85 LSET
FE88 PUT
FE8B COMMON
 FE8E TIME$
FE91 CIRCLE
FE94 TIMER
FE97 CHDIR
FE9A SHELL
FE9D WINDOW
FEA0 LCOPY
FEA7 LOCK
FF82 RIGHT$
FF85 INT
FF88 RND
FF8B EXP
FF8E ATN
FF91 POS
FF94 VAL
FF97 PEEK
FF9B LPOS
FF9D CSNG
FFA0 PEN
FFA3 EOF

Les mots réservés supplémentaires suivants sont activés par l'option syntax={pcjr|tandy}.

FEA4 NOISE     FEA6 TERM

Jetons à usage interne Les jetons 10, 1E et 0D sont connus pour être utilisés en interne par GW-BASIC. Ils ne doivent pas apparaître dans un fichier de programme à jetons correctement stocké.

Format binaire Microsoft

Les nombres à virgule flottante dans GW-BASIC et PC-BASIC sont représentés au format binaire Microsoft (MBF), qui diffère de la norme IEEE 754 utilisée par pratiquement tous les logiciels et matériels modernes.

Par conséquent, les fichiers binaires générés par l'un ou l'autre BASIC sont entièrement compatibles entre eux et avec certaines applications contemporaines de GW-BASIC, mais ne sont pas facilement interchangeables avec d'autres logiciels. QBASIC, par exemple, utilise des flottants IEEE.

MBF diffère de l'IEEE par la position du bit de signe et par l'utilisation de seulement 8 bits pour l'exposant, à la fois en simple et en double précision. Cela rend la plage de nombres autorisés dans un nombre à double précision MBF plus petite, mais leur précision plus élevée, que pour un double IEEE :

un simple MBF a 23 bits de précision, tandis qu'un double MBF a 55 bits de précision. Les deux ont la même portée.

Contrairement à IEEE, le format binaire Microsoft ne prend pas en charge les zéros signés, les nombres inférieurs à la normale, les infinis ou les valeurs non numériques.

Les nombres à virgule flottante MBF sont représentés en octets comme suit :

Simple M3 M2 M1 E0
Double M7 M6 M5 M4 M3 M2 M1 E0

Ici, E0 est l'octet exposant et les autres octets forment la mantisse, dans l'ordre little-endian de sorte que M1 est l'octet le plus significatif.

Le bit le plus significatif de M1 est le bit de signe, suivi des bits les plus significatifs de la mantisse :

M1 = s0 f1 f2 f3 f4 f5 f6 f7.

Les autres octets contiennent les bits de mantisse les moins significatifs :

M2 = f8 f9 fA fB fC fD fE fF, et ainsi de suite.

La valeur du nombre à virgule flottante est v = 0 si E0 = 0 et v = (-1) s0 × mantisse × 2 E0 - 128 sinon, où la mantisse est formée comme une fraction binaire mantisse = 0. 1 f1 f2 f3...

Format de fichier protégé

Le format protégé est une forme cryptée du format tokenisé. GW-BASIC refusera d'afficher le code source de ces fichiers. Ce schéma de protection pourrait facilement être contourné en changeant un indicateur en mémoire. Les programmes de déprotection ont largement circulé pendant des décennies et l'algorithme et les clés de décryptage ont été publiés dans un magazine mathématique.

Un fichier de programme protégé sur un périphérique de disque a le format suivant.

Octet magique
FE

Charge utile

Contenu chiffré d'un fichier de programme à jeton, y compris son marqueur de fin de fichier mais à l'exclusion de son octet magique. Le chiffrement de chiffrement tourne à travers une clé de 11 octets et une clé de 13 octets afin que la transformation résultante soit la même après 143 octets.

Pour chaque octet

• Soustraire l'octet correspondant de la séquence de 11 octets
0B 0A 09 08 07 06 05 04 03 02 01
• Exclusif-ou avec l'octet correspondant de la clé de 11 octets
1E 1D C4 77 26 97 E0 74 59 88 7C
• Exclusif-ou avec l'octet correspondant de la clé de 13 octets
A9 84 8D CD 75 83 43 63 24 83 19 F7 9A
• Ajouter l'octet correspondant de la séquence de 13 octets
0D 0C 0B 0A 09 08 07 06 05 04 03 02 01

Marqueur de fin de fichier

Un 1A est écrit pour marquer la fin du fichier. Ceci est facultatif ; le fichier sera lu sans problème s'il est omis. Étant donné que le marqueur de fin de fichier du programme tokenisé est inclus dans le contenu crypté, un fichier protégé est généralement plus long d'un octet que son équivalent non protégé.

Format de fichier BSAVE

Un fichier de vidage de mémoire sur un périphérique de disque a le format suivant.

Octet magique

DF

Entête

Octets Format Signification
2 Entier Little-endian 16 bits non signé. Segment du bloc mémoire.
2 Entier Little-endian 16 bits non signé. Décalage du premier octet du bloc mémoire.
2 Entier Little-endian 16 bits non signé. Longueur du bloc mémoire en octets.

Payload, Les octets du bloc mémoire.

Bas de page, Sur Tandy uniquement, l'octet magique et les six octets de l'entête sont répétés ici.

Ceci est facultatif ; le fichier sera lu sans problème s'il est omis.

Marqueur de fin de fichier

Un 1A est écrit pour marquer la fin du fichier. Ceci est facultatif ; le fichier sera lu sans problème s'il est omis.

Format de fichier de cassette

Les fichiers sur cassette sont stockés sous forme de son modulé en fréquence. Le format de charge utile des fichiers sur cassette est le même que pour les fichiers sur disque, mais les entêtes sont différents et les fichiers peuvent être divisés en morceaux.

Modulation
Un 1 bit est représenté par une seule période d'onde de 1 ms (1000 Hz). Un bit 0 est représenté par une seule période d'onde de 0,5 ms (2000 Hz).

Format d'octet
Un octet est envoyé sous la forme de 8 bits, le plus significatif en premier. Il n'y a pas de bit de démarrage ou d'arrêt.

Format d'enregistrement
Un fichier est composé de deux enregistrements ou plus. Chaque enregistrement a le format suivant :

Octets Format Signification
256 octets Tous les FF Onde pilote de 2048 ms à 1000 Hz, utilisée pour l'étalonnage.
1 bit 0 Bit de synchronisation.
1 octet 16 (SYN) Octet de synchronisation.
256 octets   Bloc de données.
2 octets Entier big-endian 16 bits non signé Somme de contrôle CRC-16-CCITT.
31 bits 30 1 suivis d'un 0. Marqueur de fin d'enregistrement.

Les fichiers tokenisés, protégés et BSAVE consistent en un enregistrement d'entête suivi d'un seul enregistrement pouvant contenir plusieurs blocs de données de 256 octets, chacun suivi des 2 octets CRC.

Les fichiers de programme en texte brut et les fichiers de données se composent d'un enregistrement d'entête suivi de plusieurs enregistrements d'un seul bloc.

Format du bloc d'entête

Octets Format Signification
1 A5 Octet magique d'enregistrement d'entête
8 8 caractères Nom de fichier.
1   Type de fichier. 00 pour fichier de données, 01 pour vidage mémoire, 20 ou A0 pour
protégé, 40 pour le programme en texte brut, 80 pour le tokenisé
programme.
2 Entier petit-boutiste 16 bits non signé Longueur du prochain enregistrement de données, en octets.
2 Entier petit-boutiste 16 bits non signé Segment d'emplacement de mémoire.
2 Entier petit-boutiste 16 bits non signé Décalage de l'emplacement mémoire.
1 00 Fin des données d'entête
239 Tout 01 Remplissage
Format de bloc de données
Octets Format Signification
1 Entier non signé 8 bits Nombre d'octets de charge utile dans le dernier enregistrement, plus un. Si zéro, l'enregistrement suivant n'est pas le dernier enregistrement.
255   Données de charge utile. S'il s'agit du dernier enregistrement, tous les octets inutilisés sont remplis en répétant le dernier octet de charge utile.

Formats de fichier d'émulateur

PC-BASIC utilise un certain nombre de formats de fichiers pour prendre en charge son émulation de matériel hérité, qui sont documentés dans cette section. Ces formats de fichiers ne sont pas utilisés par GW-BASIC ou les logiciels contemporains.

Format de fichier de police HEX

Le format de fichier HEX pour les bitfonts a été développé par Roman Czyborra pour le package GNU Unifont. PC-BASIC utilise une version étendue de ce format de fichier pour stocker ses polices.

Un fichier HEX est un fichier texte ASCII, composé de lignes terminées par LF. Chaque ligne de ce fichier est l'une des suivantes :

• Vide

• Un commentaire, commençant par un caractère #.

• Un ou plusieurs points de code Unicode hexadécimaux de 4 ou 6 caractères, séparés par des virgules, suivis de deux-points, suivis d'un nombre hexadécimal représentant le glyphe. Un nombre à 64 chiffres hexadécimaux ou plus représente un glyphe pleine largeur (16xN), chaque ligne de 16 pixels étant représentée par quatre chiffres hexadécimaux. Un nombre plus court représente un glyphe demi-largeur (8xN), chaque rangée de 8 pixels étant représentée par deux chiffres hexadécimaux.

Format de fichier de page de code UCP

Les mappages Unicode-codepage sont stockés dans des fichiers UCP.

Un fichier UCP est un fichier texte ASCII, composé de lignes terminées par LF. Chaque ligne de ce fichier est l'une des suivantes :

• Vide

• Un commentaire, commençant par un caractère #.

• Un point de page de code hexadécimal à 2 ou 4 caractères, suivi de deux-points, suivi d'une liste séparée par des virgules de points de code Unicode hexadécimaux à 4 ou 6 caractères. Si plusieurs points de code Unicode sont fournis pour un point de page de code, les points de code se combinent en un seul glyphe.

Format de fichier de bande CAS

Un fichier CAS est une représentation au niveau du bit des données de cassette introduites par l'émulateur PCE.

Les fichiers CAS produits par PC-BASIC commencent par les caractères PC-BASIC tapeEOF. Cette séquence est suivie de sept bits 0, suivis du contenu de la bande. Les sept bits zéro sont destinés à garantir que le contenu de la bande est aligné sur les octets ; le bit un est constitué par le bit de synchronisation suivant l'onde pilote.

Notez que PC-BASIC ne nécessite pas la séquence d'introduction pour lire correctement un fichier CAS, ni que le contenu d'un fichier CAS soit aligné sur les octets. Cependant, les nouveaux fichiers produits par PC-BASIC suivent cette convention.

Codes de caractères

Selon le contexte, PC-BASIC traitera un point de code dans la plage des caractères de contrôle comme un caractère de contrôle ou comme un glyphe défini par la page de code active qui par défaut est la page de code 437. Les points de code de &h80 ou plus sont toujours interprétés comme un glyphe de page de code.

ASCII

Ceci est une liste du code standard américain pour l'échange d'informations (ASCII). ASCII ne couvre que 128 caractères et définit les plages de points de code &h00 – &h1F et &h7F comme contrôle caractères auxquels aucun glyphe imprimable n'est attribué.

Cela inclut des valeurs telles que le caractère de retour chariot ( CR ) qui termine une ligne de programme. Dans le contexte de cette documentation, le caractère &h1A ( SUB ) sera généralement indiqué comme EOF puisqu'il joue le rôle de marqueur de fin de fichier sous DOS.

Page de code 437

Ce tableau montre les caractères qui sont produits par les 256 points de code à un octet lorsque la page de codes DOS Latin USA 437 est chargée, qui est la valeur par défaut. D'autres pages de code peuvent être chargées pour affecter d'autres caractères à ces points de code.

• Le point de code &h00 ne peut pas être redéfini.

• La redéfinition des caractères dans la plage de points de code ASCII imprimables &h20 – &h7E entraînera l'affichage d'un glyphe différent à l'écran, mais le caractère continuera d'être traité comme le caractère ASCII correspondant. Il conservera sa valeur ASCII lorsqu'il sera transcodé en UTF-8. Cela se produit, par exemple, avec le signe Yen ( ¥ ) qui est affecté au point de code ASCII &h5C dans la page de codes 932 : dans cette page de codes, il est traité comme s'il s'agissait d'une barre oblique inverse ( \ ).

• Tous les autres caractères peuvent être redéfinis en chargeant une autre page de code avec l'option page de code. Cela affectera à la fois les glyphes visuels et les valeurs de caractère Unicode de ces caractères.

Codes des touches de clavier

Scancodes

PC-BASIC utilise des scancodes PC / XT, qui proviennent du clavier IBM Model F à 83 touches fourni avec l'IBM PC 5150.

La disposition de ce clavier était assez distincte des claviers standard modernes avec 101 touches ou plus, mais les touches sur un clavier moderne produit le même scancode que la touche avec la même fonction sur le modèle F.

Par exemple, la touche qui (sur un clavier américain) produit le \ était située à côté de la touche Maj gauche sur le clavier du modèle F et a le scancode &h2B. La barre oblique inverse (US) a toujours ce scancode, même s'il se trouve maintenant généralement au-dessus de la touche Entrée.

Pour compliquer davantage les choses, les claviers pour différents paramètres régionaux ont leur disposition remappée dans le logiciel plutôt que dans le matériel, ce qui signifie qu'ils produisent le même scancode que la touche qui, sur un clavier américain, se trouve au même emplacement, quel que soit le caractère qu'ils produisent réellement.

Par conséquent, le A sur un clavier français produira le même scancode que le Q sur un clavier britannique ou américain.

La touche US \ susmentionnée est identifiée avec la touche qui se trouve généralement en bas à gauche de la touche Entrée sur les claviers non américains.

Par exemple, sur mon clavier britannique, il s'agit de la touche #. Les claviers non américains ont une touche supplémentaire à côté de la touche Maj gauche qui, sur le clavier britannique, est le \. Par conséquent, bien que cette clé se trouve au même emplacement et ait la même fonction que le modèle F \ , elle a un scancode différent.

Dans le tableau ci-dessous, les touches sont marquées par leur fonction sur un clavier américain, mais il faut garder à l'esprit que le scancode est lié à la position, et non à la fonction, de la touche.



Codes e-ASCII

Outre les scancodes, la plupart des clés portent également une valeur de caractère que la documentation GW-BASIC appelle ASCII étendu. Comme il s'agit d'un terme plutôt surchargé, nous utiliserons l'abréviation e-ASCII exclusivement pour ces valeurs. Les valeurs renvoyées par la fonction INKEY$ sont des valeurs e-ASCII.

Les codes e-ASCII ont une longueur d'un ou deux octets ; les codes à un octet sont simplement des codes ASCII tandis que les codes à deux octets consistent en un caractère NUL plus un code indiquant la touche enfoncée. Certains de ces codes, mais certainement pas tous, correspondent aux scancodes des clés.

Contrairement aux scancodes, les codes e-ASCII des touches non modifiées et ceux des touches modifiées par Shift, Ctrl ou Alt sont tous différents.

Les codes e-ASCII non modifiés, majuscules et Ctrl sont liés à la signification d'une touche, et non à son emplacement.

Par exemple, les e-ASCII pour Ctrl + a sont les mêmes sur un clavier français et américain. En revanche, les codes Alt ed sont connectés à l'emplacement de la clé, comme les scancodes.

La disposition du clavier américain est utilisée dans le tableau ci-dessous.



Modèle de mémoire

PC-BASIC (plutôt imparfaitement) émule la mémoire de MS-DOS en mode réel. Cela signifie que la mémoire peut être adressée par segments de 64 Ko. Chaque adresse mémoire est donnée par la valeur du segment et le décalage de 0 à 65 535 octets par rapport à ce segment.

Notez que les segments se chevauchent : l'adresse mémoire réelle est trouvée par segment*16 + offset. La taille de mémoire maximale qui peut être adressée par ce schéma est donc de 1 Mo, qui était la taille de la mémoire conventionnelle et supérieure dans MS-DOS en mode réel.

Aperçu

Les domaines de la mémoire avec une importance particulière sont :

Segment Nom Objectif
&h0000 Mémoire basse Contient des informations sur la machine, entre autres
&h13AD (peut varier) Segment de données Code de programme, variables, tableaux, chaînes
&hA000 (EGA) Segment vidéo Textes et graphiques sur écrans visibles et virtuels
&hB000 (MDA)    
&hB800 (CGA)    
&hC000 -- Définition de la police RAM, entre autres
&hF000 Mémoire en lecture seule Définition de la police ROM, entre autres

Segment de données

Le segment de données est organisé comme suit. Les adresses peuvent varier en fonction des paramètres des différentes options ; ici sont les valeurs par défaut pour GW-BASIC 3.23.

Décalage Taille (octets) Fonction
&h0000 3429  
&h0D65 (max-files+1) *322  
&h126D 3 + c  
&h1270 + c v  
&h1270 + c + v a  
&hFDFC - s a  
&hFDFC 512  
&hFFFE    

 

 

 

 

 

 

 

 

Recherche personnalisée