Envoyer un e-mail à Collection ThomsonCollection Thomson
EditoForum 2002Liens
Nanoreseau
Docs
Logiciels
Matériel
Imprimer le document
Retour à la liste

Du reset du contrôleur

Un reset du contrôleur, quoi de plus facile à faire ? On poke la commande de reset $01 à l’adresse $6048 ($2048 pour les MO) et on exécute l’adresse $E004 ($A004 pour les MO). On pourrait croire que cela est suffisant. Mais il n’en 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 d’un 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 d’une machine à l’autre 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 l’adresse 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 l’allumage 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é à l’initialisation du contrôleur. Si la distance est de 256 octets, le moniteur forcera la double densité.

Lors de l’ouverture d’un 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 d’accé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. Qu’ils le soient prouve la compétence du programmeur mais rien n’empêche l’utilisateur d’appuyer 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 d’initialisation 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, c’est à 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 d’initialisation 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 d’effectuer 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 
Site
Plus
Forums
Code
Créations

*Site en favoris
*Page en favoris
*Site en démarrage
*Page en démarrage


Haut de page

Collection Thomson 2015 © Ghislain Fournier & François Mouret