ce qui suit s'applique à toutes
les machines des séries 12xx, 13xx et 14xx.
Exception faite pour les machines à CPU 4 bits qui ne permettent pas l'acces au langage machine où donc CALL
n'existe pas.
Les instructions qui donnent accès au langage machine et à la gestion de la mémoire ne sont pas présentes dans le manuel :
PEEK @dresse
:
retourne la valeur d'un octet de la mémoire.
POKE @dresse, val1 [, val2 ...]
:
modifie la valeur d'un octet en mémoire. Par exemple, POKE
&4000, &01, &02
modifie les octets &4000 en lui
affectant la valeur 1 et &4001 avec la valeur 2.
CALL @dresse
: lance
un programme en langage machine qui se trouve à l'adresse
indiquée.
CLOAD M [nom_de_fichier][;][@dresse]
:
charge depuis la K7 une zone mémoire. Si @dresse est
indiquée, la zone mémoire est chargée à
partir de cette adresse (mais il
n'est pas possible d'indiquer la longueur : ça sera forcement
celle contenue dans l'enregistrement). Attention : s'il
s'agit d'un programme en langage machine,
aucune relocation n'est faite. S'il n'était pas
relogeable, il se plantera donc lamentablement !
Le ';
'
n'est nécessaire que si les 2 arguments sont présents.
CSAVE M [nom_de_fichier;]@dr1,@dr2
: Sauve la zone mémoire comprise entre les 2 adresses
spécifiées.
LOAD M
and SAVE M
ne semblent pas exister.
Le PC-1350 n'a pas à proprement parler de caractères cachés. Simplement, un POKE &6F16, PEEK &6F16 OR 128
permet d'afficher les caractères KATANA. [SML] passe le clavier en mode japonnais, alors que [SHIFT][SML] donne accès aux minuscules.
Le PC-1401 posseide 2 caractéres accessibles uniquement par POKE
: 253 correspond au caractéres d'insertion et 254 au curseur.
4 octets sont réservés au codage d'une ligne de basic : elle débute par son numéro (2 octets) suivit de la longueur (1 octet). On trouve ensuite le codage des commandes BASIC elles-mêmes. Enfin elle se termine par un &0d ou 13 qui indique que cette ligne est finie.
-1 | &0d de la ligne précédente. |
---|---|
0 | poids fort du numéro de ligne (si 255, le programme est fini) |
1 | poids faible du numéro de ligne |
2 | longueur de la ligne (@dresse de cet octet + sa valeur donne l'adresse du &0d finissant cette ligne). |
... | Codage de la ligne (jusqu'à 79 octets) |
fin | &0d indiquant la fin de la ligne |
Il est donc facile de faire
revenir un programme effacé par NEW
: il suffit de mettre le
premier octet de la zone basic (qui doit valoir 255) à 0.
Par exemple, sur un 1401, un POKE &3801,0
permet de récupérer
le programme. ATTENTION : les pointeurs ne sont pas modifiés,
donc pour l'ordinateur, la mémoire est toujours vide. Une
tentative de modifier le programme se terminera très mal !
Malgré ce que dit le manuel, il est tout a fait possible d'avoir une ligne 0 : il suffit simplement de poker 0,0 à la place du numéro de ligne. Comme le BASIC ne la gère pas, elle sera ni modifiable, ni effaçable, et ne peut être appelée par aucune instruction qui demande un numéro de ligne.
Elles sont stockées dans une zone mémoire de 208 octets
qui leur est réservée (à ma connaissance,
toujours à la fin de la mémoire du BASIC). Elles font toujours 8 octets.
Si le premier octet contient 245 s'il s'agit d'une
variable alphanumérique.
Les autres variables sont allouées à la volée par le BASIC. La mémoire utilisateur est gérée par 3 pointeurs :
début du programme BASIC :
Ce pointeur peut être modifié pour réserver de
la mémoire pour stocker par exemple un programme en langage
machine. Comme seul un « reset » peut le
réinitialiser, le programme est protégé des
NEW
, CLEAR
, CLOAD
ou d'une allocation mémoire.
Fin du programme BASIC
Début des variables
simples : adresse de la première variable simple. Après
un CLEAR
, il pointe sur le début des variables fixes.
Lorsque l'on ajoute des lignes à
un programme BASIC, le pointeur « Fin de Programme »
augmente en fonction de la longueur de cette ligne. Lorsque l'on crée
une nouvelle variable, le pointeur de « début des
variables » décroît en fonction de la taille
de cette variable.
MEM
renvoie la différence entre
ces 2 pointeurs.
Les variables automatiques (par exemple A(27) sans qu'il n'y eu de DIM sur A) sont codées comme des variables simples, hormis le fait qu'elles ont forcement une longueur de 8 octets et que chaque variable a son propre type.
La structure suivante permet de renseigner la variable créée : elle comporte 7 octets
Octet 0 Code ASCII du premier caractère du nom. |
Octet 1 2eme caractère du nom + code d'identification |
Octet 2 Poids fort de la taille de l'objet alloué +3 |
Octet 3 Poids faible de la taille de l'objet alloué +3 |
Octet 4 Dimension des tableaux |
Octet 5 Dimension des tableaux |
Octet 6 Taille d'un objet de tableau | |
AB ou A1 | 'A' |
'B' '1' | 0 | 11 | 0 | 0 | 8 |
AB$ ou A1$ | 'A' |
'B' + 64 (130) | 0 | 19 | 0 | 0 | 16 |
DIM AB(5) ou DIM A1(5) | 'A' |
'B' + 128 (194) | 0 | 51 | 5 | 0 | 8 |
DIM AB$(5)*20 | 'A' |
'B' - 64 (2) | 0 | 123 | 5 | 0 | 20 |
DIM AB(8,9) | 'A' |
'B' + 128 (194) | 2 | 211 | 9 | 8 | 8 |
DIM AB$(8,9) | 'A' |
'B' - 64 (2) | 5 | 163 | 9 | 8 | 16 |
DIM A1$(5) | 'A' |
'1' + 192 (241) | 0 | 99 | 5 | 0 | 16 |
DIM A1$(8,9) | 'A' |
'1' + 192 (241) | 5 | 163 | 9 | 8 | 16 |
A(30) sans DIM (variables automatiques) | 'A' |
'@' (64) | 0 | 35 | 0 | 0 | 8 |
Voici la table de codage des mots clefs du BASIC.
Elle s'applique à tous les PC de la game 12?? (hormis les machines 4 bits, 1211, 1212, 1245, 1251, ...), 13??, 14?? et 2500. Les PC-1500, PC-1600 et PC-E500 ont une table totalement differente.
Les instructions du BASIC utilisent les codes &80 (128) à &FE (239)
Ces codes sont aussi utilisés pour les caractères KATANA. Pour les différentier des token BASIC, ces derniers sont préfixés par un &FE (254).
Par exemple, sur PC-1350, après avoir bien sur validé les KATANA,
POKE &6C38, &FE, &DB, 0
donne Y$
= READ
alors que
POKE &6C38, &FE, &FE, &DB, 0
donne Y$
= carré vide
8 | 9 | A | B | C | D | E | |
---|---|---|---|---|---|---|---|
0 | FACT | RND | RUN | RANDOM | TO | GOSUB | |
1 | REC | LN | AND | NEW | DEGREE | STEP | AREAD |
2 | POL | LOG | OR | CONT | RADIAN | THEN | LPRINT |
3 | ROT | EXP | NOT | PASS | GRAD | ON | RETURN |
4 | DECI | SQR | ASC | LIST | BEEP | IF | RESTORE |
5 | HEX | SIN | VAL | LLIST | WAIT | FOR | CHAIN |
6 | TEN | COS | LEN | CSAVE | GOTO | LET | GCURSOR |
7 | RCP | TAN | PEEK | CLOAD | TRON | REM | GPRINT |
8 | SQU | INT | CHR$ | MERGE | TROFF | END | LINE |
9 | CUR | ABS | STR$ | CLEAR | NEXT | POINT | |
A | HSN | SGN | MID$ | USING | STOP | PSET | |
B | HCS | DEG | LEFT$ | OPEN | DIM | READ | PRESET |
C | HTN | DMS | RIGHT$ | CLOSE | CALL | DATA | BASIC |
D | AHS | ASN | INKEY$ | SAVE | POKE | PAUSE | TEXT |
E | AHC | ACS | PI | LOAD | CLS | OPEN$ | |
F | AHT | ATN | MEM | CONSOLE | CURSOR | INPUT |
Le PC les plus récents (1360, 1403, 1475, ...) ont un basic étendu : ils utilisent en plus, une seconde table d'instruction dont la valeur est préfixées d'un &FE.
Je n'ai pas fait de table pour ces instructions mais vous les trouverez dans les sources de WAV2BIN (un grand merci à Pocket).