Vos papiers, s'il vous plaît !
Le repérage de l'ordinateur concerne les programmes compatibles.
Selon la machine varient les emplacements de mémoires, les adresses de registres,
l'écran, etc... Certes, les programmeurs soucieux de faire tourner leurs programmes
en langage machine sur plusieurs ordinateurs doivent déjà avoir une connaissance
assez large des Thomson.
La valeur 8 bits contenue dans le registre $FFF0 (registre
commun à toute la gamme TO/MO) permet à tout programmeur de cerner d'emblée
et avec une grande précision le type de la machine utilisée. Cette valeur
peut varier selon les conditions connues suivantes:

...mais la reconnaissance peut être plus fine, si l'on veut différencier un TO d'un
MO. Les zones de RAM commutables de ces deux familles se trouvent à des adresses
différentes, de $6000 à $9FFF pour les MO et de $A000 à $DFFF ($BFFF sur TO7)
pour les TO. $A000 étant l'adresse de la ROM pour le disque sur MO, il suffit
donc de tenter d'altérer la valeur à cette adresse et d'en tirer les conclusions:
LDX #$A000 Pointeur pour test
LDB ,X Protège valeur
COM ,X Complémente mémoire
CMPB ,X | Si mémoire inchangée,
BEQ MO | il s'agit d'un MO
STB ,X | Ne pas oublier de restituer
... | la valeur initiale pour le TO
...ou en basic:
A=&HA000:D=PEEK(A):POKEA,NOT(PEEK(A))AND255:IFPEEK(A)<>D THEN POKE(A),D:
PRINT"TO"ELSEPRINT"MO"
Bien quil sagisse là de la méthode couramment utilisée, elle nest malheureusement
pas totalement fiable, puisque la mémoire vive dun TO7 sans extension ne
couvre pas cette adresse. Il pourrait y avoir confusion avec un MO. Il est
alors toujours possible de tester le poids fort du vecteur de SWI3, celui-ci
pointant en ROM sur les MO et en RAM sur les TO. Le programme précédent ne
servirait plus alors quà tester la présence dune extension mémoire sur TO7 :
TST $FFF2 Teste le vecteur de SWI3
BMI MO Si négatif, il s'agit d'un MO
...ou en basic:
D=PEEK(&HFFF2):IF D>127 THEN PRINT"MO" ELSE PRINT"TO"
...ou de vérifier le bit 6 du registre DP : sil est à 1, il sagit dun TO ;
sil est à 0, il sagit dun MO.
En poussant la recherche à son extrémité, comment différencier
un TO8 d'un TO8D? Il semblerait judicieux, puisque la différence réside dans
le fait que seul le TO8D possède un
lecteur interne, de
tester le bit 7 de l'image du registre
$E7E7 en $6081, qui indique la présence d'un lecteur externe. Mais
le TO8D peut lui aussi tourner en contrôleur externe. Ce ne serait donc pas
un test fiable.
La seule différence invariable entre ces deux machines
est dans le dessin du menu général (cf. "Désassemblage du Moniteur du
TO8D" par Obsidian). Le graphique MIG du "D" de TO8D se trouve
en banque 1 du moniteur et décale certaines données à cet endroit. Le test
sera donc, par exemple:
LDD #PROG | Initialise vecteur
STD $6055 | de JSR
JSR $FFA0 Exécute en banque 1
CMPB #$DC | Si donnée = $DC,
BEQ TO8D | il s'agit d'un TO8
... Sinon, c'est un TO8
PROG LDB $F600 Récupère la donnée
RTS |
...ou en basic:
A=&HE7C3:POKE A,PEEK(A) OR &H10:D=PEEK(&HF600):POKEA,PEEK(A) AND &HEF:
IFD=&HDC THEN PRINT"TO8D" ELSE PRINT"TO8"
Appendice sur la reconnaissance du contrôleur
Pour vérifier la présence d'un contrôleur (interne ou
externe), on testera les 4 premiers caractères de la zone réservée à cet effet,
en $A000 pour les MO et en $E000 pour les TO:
- Caractère 1 : Immatriculation du contrôleur disque ("M" pour Thomson Micro-Informatique, "D" pour Western Digital, etc...)
- Caractère 2 : Taille de la FAT ("K" pour 80 octets, "T" pour 160 octets, etc...)
- Caractère 3 : Densité du support ("D" pour double densité, "C" pour simple densité, etc...).
- Caractère 4 : Checksum du descriptif de contrôleur, c'est à dire la somme des 3 caractères précédents augmentée de $55.
Outre le fait de rechercher un type de contrôleur précis,
le calcul de validité du checksum de descriptif peut renseigner immédiatement
sur sa présence.
|