Du reset du contrôleur
Un reset du contrôleur, quoi de plus facile à faire ? On poke la commande de reset $01 à ladresse $6048
($2048 pour les MO) et on exécute ladresse $E004 ($A004 pour les MO). On pourrait croire que cela
est suffisant. Mais il nen est malheureusement rien.
Pour les contrôleurs ne gérant que la simple densité, pas de subtilités. Le
code « C » renvoyé en DKSTA renseigne correctement le programmeur. Pour les contrôleurs qui
sont capables de gérer les formats tant double que simple densité, le code renvoyé est toujours
« D », même si le contrôleur donne la possibilité au programmeur de passer en simple densité.
Un autre registre est alors utilisé pour fixer la taille dun secteur et donc la densité en vigueur.
Par exemple, les contrôleurs THMFC1 utilisent le registre $6058 ($2058 pour les MO). On remarque, dans
la routine moniteur du reset contrôleur, une bien étrange portion de programme, qui ne varie dune
machine à lautre que pour le registre fixant la densité :
SETDP $60 Pour les TO
SETDP $20 Pour les MO
...
CLR <$58 Fixe en double densité
LDD <$E9 |
SUBD <$ED |
BGE TST0 | Calcule la distance entre
COMA | le tampon mémoire de FAT et de secteur
COMB |
ADDD #$0001 |
TST0 TSTA |
BNE TST1 | Si distance de 128
TSTB | à 255, passe en
BPL TST1 | simple densité
COM <$58 |
TST1 ...
$60E9/$60EA ($20E9/$20EA pour les MO) contient ladresse du tampon mémoire de secteur pour le MiniDos et $60ED/$60EE ($20ED/$20EE
pour les MO) celle du tampon mémoire de FAT pour le MiniDos. A lallumage de la machine, ces registres
sont à $0000 et ne risquent pas de causer le moindre souci. Or ils sont utilisés dans le reset du contrôleur :
dans le cas de la double densité, si leur valeur change, cela risque de poser un problème. Et le MiniDos,
pour rappel, est utilisé par la plupart des premiers logiciels Thomson gérant les lecteurs disquette.
Après analyse du programme, on en déduit que, dans un cas général, si la distance
entre les pointeurs de FAT et de secteur est de 128 octets, le moniteur forcera la simple densité à
linitialisation du contrôleur. Si la distance est de 256 octets, le moniteur forcera la double
densité.
Lors de louverture dun fichier en double densité par le MiniDos,
le secteur de FAT est chargé et les deux moitiés du tampon sont interchangées pour permettre au moniteur
daccéder à tous les octets par un registre indexé 8 bits. Le pointeur de FAT est positionné désormais
en conséquence au milieu de ce secteur. Dans le mode sauvegarde, ce secteur de FAT est rétabli en clôture
de fichier. Pas dans le mode lecture : pour peu que les tampons mémoire de FAT et de secteur soient
consécutifs, la distance les séparant est alors de 128 octets et le contrôleur passera automatiquement
en simple densité à un nouveau reset du contrôleur par le moniteur si les pointeurs sur les tampons
mémoire de FAT et de secteur ne sont pas réinitialisés. Quils le soient prouve la compétence du
programmeur mais rien nempêche lutilisateur dappuyer sur le bouton du reset pendant
une lecture... ou une écriture.
Si, après un reset à froid de votre machine (tous les registres MiniDos se
retrouvent à 0), vous tapez sous Basic les lignes de programme suivantes (1ère colonne pour les TO,
2ème colonne pour les MO) :
10 POKE&H60EA,128 10 POKE&H20EA,128 Change poids faible du ptr FAT MiniDos
20 POKE&H6048,1 20 POKE&H2048,1 Fixe code dinitialisation du contrôleur
30 EXEC&HE004 30 EXEC&HA004 Exécute opération standard du contrôleur
... puis que vous tentez un DIR, le système génèrera un « Device I/O Error » et persistera même
après un reset à chaud puisque la simple densité a été déclarée pour le système par le moniteur, cest
à dire au niveau le plus bas. Pour revenir à létat initial, tapez alors les lignes suivantes :
10 POKE&H60EA,0 10 POKE&H20EA,0 Efface poids faible du ptr FAT MiniDos
20 POKE&H6048,1 20 POKE&H2048,1 Fixe code dinitialisation du contrôleur
30 EXEC&HE004 30 EXEC&HA004 Exécute opération standard du contrôleur
En conclusion, la présence de données dans les registres $60E9/$20E9, $60EA/$20EA, $60ED/$20ED et $60EE/$20EE
peut avoir une influence sur une initialisation correcte du contrôleur par le moniteur. La solution
est de mettre à jour les pointeurs de FAT et de secteur juste avant deffectuer un reset moniteur
du contrôleur pour éviter une initialisation erronée:
SETDP $60 Pour les TO
SETDP $20 Pour les MO
LDX #BUF | Initialise le tampon
STX <$E9 | mémoire de secteur
LDX #FAT | Initialise le tampon
STX <$ED | mémoire de FAT
... Reset moniteur du contrôleur
... ou simplement, dans le cas de la double densité, mettre les poids faibles de ces pointeurs
à 0 :
SETDP $60 Pour les TO
SETDP $20 Pour les MO
...
10 POKE&H60EA,0 10 POKE&h20EA,0 CLR <$EA Efface ptr secteur
20 POKE&H60EE,0 20 POKE&H20EE,0 CLR <$EE Efface ptr FAT
30 POKE&H6048,1 30 POKE&H2048,1 ... Reset du contrôleur
40 EXEC&HE004 40 EXEC&HA004
|