Décodage des fichiers Microsoft BASIC vers ASCII
Détokeniseurs pour les Basic Microsoft
Introduction
Pour les ordinateurs 8-bits des années 1970-1980, la mémoire maximale addressable était de 64 kilooctets. Une partie étant consommée par l'affichage, le système d'exploitation et l'interpréteur BASIC, il était nécessaire de stocker les programmes en mémoire vive sous une forme compressée. Les mots-clés du basic étaient donc remplacés par des codes d'un octet appelés tokens. Les numéros de ligne et les constantes numériques pouvaient aussi être représentés sous forme compressée. La place sur les disquettes étant également limitée (une disquette 5 pouces 1/4 stockant au maximum 360 kilooctets) les programmes étaient aussi sauvegardés sous cette forme compressée.
Pour pouvoir reconstituer le programme BASIC initial à partir de ce fichier compressé, il faut pouvoir remplacer les tokens par les mots clés du langage. Malheureusement, chaque constructeur informatique avait ses propres mots clés dans sa variante du BASIC, et sa propre correspondance entre les tokens et les mots clés.
Cependant, beaucoup de ces ordinateurs utilisaient des variantes du Basic Microsoft, et même si les tokens étaient différents, la structure du programme "tokenisé" était la même.
Sur un ordinateur moderne, si on dispose d'un émulateur pour l'ancienne machine, il est possible de charger le fichier dans l'émulateur et de le lister.
En l'absence d'émulateur, un "détokeniseur" permet de lister le programme Basic original. Pour les Basic Microsoft, il est possible de disposer d'une famille de détokeniseurs.
Je me suis servi d'un détokeniseur écrit par Christian A. Ratliff pour le GW-Basic de l'IBM PC pour générer un ensemble de détokeniseurs pour TRS-80 (Level II, Model 4, and CoCo), Dragon 32, MSX-Basic et MBASIC-80 (pour CP/M). Ce sont des programmes en mode texte qui fonctionnent dans un terminal. Il se compilent sur Linux avec gcc et devraient fonctionner aussi sur les autres Unix (BSD, OpenIndiana, AIX, Solaris, HP-UX, etc...) , Windows (avec un remplacement pour curses/termcap), MacOSX.
Les Basic Microsoft en général
| interprète BASIC | Doubles tokens | Arithmétique |
|---|---|---|
| TRS-80 Basic Level II | Non | Virgule flottante |
| Exidy Sorcerer ROM-PAC Basic | Non | Virgule flottante | Nascom Basic | Non | Virgule flottante |
| Ohio Scientific Basic | Non | Virgule flottante |
| Microsoft BASIC (MBASIC) for CP/M 80 | Oui | Virgule Flottante |
| Dragon 32/64 | Oui | Virgule flottante |
| TRS-80 Color Computer | Oui | Virgule flottante |
| MSX-Basic | Oui | Décimal Codé Binaire |
| GW-Basic/BASICA | Oui (3 types) | Virgule flottante |
Dans tous les BASICs Microsoft, le fichier tokenisé commence par le code hexadécimal 0xff. Chaque ligne commence par deux octets indiquant l"e;adresse mémoire de la ligne, puis deux autres octets pour le numéro de ligne. Le tokens représentant les mots clés du Basic, les constantes alphanumériques, et les noms de variables suivent. La ligne se finit par le code hexadécimal 0x00.
Voyons sur un exemple (le MBASIC avec CP/M-80). La première ligne est le BASIC, la seconde sa forme tokénisée avec les valeurs hexadécimales.
- Les deux premiers octets, qui contiennent l"e;adresse mémoire ne nous intéressent pas.
- Le troisiéme et le quatrième nous donnent 0x7d (hexadecimal) soit 7*16+13=125 (decimal) et 0. Le numéro de ligne est (quatrième octet =0 )*256 + (troisième octet = 125) = 125 en décimal.
- Le cinquième octet est le token 0x82 et correspond au mot-clé FOR du BASIC.
- Le sixième octet ( code ASCII 0x20 in hexadecimal) est un espace, le septème le nom de variable I (code ASCII 0x49)
- le huitième le token 0xf0 qui correspond au mot-clé BASIC = (affectation)
- le neuvième0x12=0x11+0x01 est la constante 1
- le dixième octet est un espace
- le onzième octet est le token 0xce qui correspond au mot-clé BASIC TO
- le douzième octet est 0x15=0x11+0x04 et représente la constante 4.
- le dernier octets, 0x00 indique la fin de la ligne
TRS-80 Basic Level II
Le TRS/80 était un microordinateur fabriqué par Tandy Radio Shack dans les années 1980. Son Basic Level II est un Microsoft BASIC qui code tous les tokens sur un octet, et représente les nombres réels en virgule flottante binaire (c'est à dire sous la forme 1.11100011011011×2^{101111}). Les tokens sont indiqués sur le site d"e;Ira Goldkland (voir Tokenized BASIC Leonard Erickson).TRS-80 Model 4 Basic
Le TRS/80 Model 4 était le successeur du Model I. Le Basic du Model 4 diffère du Basic Level II par la présence de tokens codés sur deux octets (dual opcodes) le premier étant 0xff. Ces tokens sont aussi décrits sur le site d"e; Ira Goldkland site (voir Tokenized BASIC Leonard Erickson ).Microsoft BASIC for CP/M
CP/M était un système d"e;exploitation pour les microordinateurs 8 bits utilisant les microprocesseurs Intel 8080, Zilog Z80 ou Intel 8085 conçu par Digital Research à la fin des années 1970. Il était utilisé sur des ordinateurs à usage professionnel. Microsoft a créé un interprète BASIC pour CP/M, appelé MBASIC. Ce basic représente les nombres réel en virgule flottante binaire, et possède des instructions codées sur deux octets (dual opcodes) commençant avec 0xff. Les constantes entières sont précédées de 0x0e si elles représentent un numéro de ligne, de 0x0f si elles tiennent dans un seul octet, de 0x1c si elles tiennent dans deux octets. Les constantes réelles simples précision (occupant 4 octets) sont précédées de 0x1d les constantes double précision (occupant 8 octets) sont précédées de 0x1f.MSX-Basic
MSX était un standard pour des microordinateurs familiaux basés sur le microprocesseur Zilog Z80 conçu au Japon par ASCII corporation dans les années 1980 puis adopté par les constructeurs Japonais et Coréens ainsi que par Philipps aux Pays-Bas. L"e;interprète BASIC était conçu par Microsoft. Contrairement, aux BASICs CP/M ou TRS-80, le MSX-Basic utilise une représentation Décimal Codé Binaire pour les réels. En Décimal Codé Binaire, deux chiffres d"e;un réel sont stockés dans chaque octet, de sorte que le nombre 0x12 0x34 hexadécimal (c"e;est à dire 1*16+2=18 3*16+4=52 in decimal) représente le nombre décimal 12 34 . Une constante réelle apparaît sous la forme 1.23456×10^{-7}. L"e;avantage de cette représentation representation est que le nombre 1/5=0.2 peut être représenté exactement, alors qu'en virgule flottante binaire, une troncature serait inévitable. Cette représentation est avantageuse dans des calculs financiers, mais elle est moins économique en mémoire, et plus lente pour les calculs. Le MSX-Basic possède des instructions codées sur deux octets (dual opcodes) commençant avec 0xff. La liste des tokens est décrite dans the MSX2 Technical manual.BASICA/GWBasic
BASICA était l"e;interprète BASIC de l"e;IBM PC. GW-Basic était utilisé sur les ordinateurs compatibles MS-DOS ou on IBM PC. Les tokens sont décrits sur cette page : GW-BASIC tokenised program format. Ce basic utilise des double opcodes qui peuvent commencer par 0xfd,0xfe,0xff.
Il utilise la virgule flottante binaire pour représenter les réels en simple précision (4 octets) et en double precision (8 octets). Comme dans le Basic CP/M, les constantes entières sont précédées de 0x0e si elles représentent un numéro de ligne, de 0x0f si elles tiennent dans un seul octet, de 0x1c si elles tiennent dans deux octets. Les constantes réelles simples précision (occupant 4 octets) sont précédées de 0x1d les constantes double précision (occupant 8 octets) sont précédées de 0x1f.
Commentaires
Enregistrer un commentaire
Les commentaires seront rejetés.