Référence technique
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 |