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

De la K7 vers le DK

Lorsque l'on entreprend d'adapter un logiciel TO7 sur cassette aux TO8/TO9 sur disquette peut se poser le problème des chargements et sauvegardes de fichiers compatibles avec le système d'exploitation. Si on veut conserver toute sa compatibilité au logiciel, il est exclu alors de recourir à l'ExtraMoniteur. Surtout que, bien souvent, les logiciels TO7 ne se rechignent pas à s'implanter en mémoire à partir de l'adresse $6100, recouvrant ainsi la zone des registres nécessaires au bon fonctionnement de l'ExtraMoniteur.

Or se trouvent dans le contrôleur des routines qui permettent une gestion primitive des lecteurs de disquettes et du coup d'élaborer des programmes suffisamment courts pour être implantés en lieu et place des routines pour les opérations cassette.

Pour une exécution correcte du programme TO7 sur TO8/TO9, des deux programmes de chargement/sauvegarde, il faut "émuler" un TO7, puisque les registres ExtraMoniteur peuvent être recouverts par le programme:

	  ...
          SETDP  $60
          LDA    #$60     | Fixe le
          TFR    A,DP     | DP à $60
          LDS    #$XXXX   Déclare le pointeur de pile (de préférence)
          ORCC   #$50     Gel des interruptions
          CLR    $6019    Plus d'interruptions
          CLR    $60D1    Reset du basic demandé
          LDB    $E7E7    |
          ANDB   #$EF     | Commutation RAM par PIA
          STB    $E7E7    |
          LDB    #$F0      | Les terminateurs
          STB    $601A     | de ligne pointent
          STB    $601C     | désormais en ROM
          STB    $601E     |
          ...

Avant toute exécution des deux programmes suivants, le registre DKDRV ($6049) doit comporter le numéro de lecteur puis, selon la densité, le registre $60ED l'adresse d'un buffer de 256 ou 128 octets à 0 pour la FAT et le registre $60E9 l'adresse d'un buffer de 256 ou 128 octets pour le catalogue. Selon la taille de la mémoire libre, ces buffers peuvent être déclarés en RAM écran. Ne pas oublier non plus de mettre le registre DP à $60.

Les 4 étiquettes pointant sur les erreurs éventuelles permettent leur différenciation:

- ERRIO  -> Gestion de "I/O Error"
  - ERRDF  -> Gestion de "Disk Full"
  - ERRCTF -> Gestion de "Directory Full"
  - ERRNF  -> Gestion de "File Not Found"
  *--------------------------------------*|*--------------------------------------*
  * Module de chargement pour un fichier *|* Module de sauvegarde pour un fichier *
  * Entrées:                             *|* Entrées:                             *
  * A = Type du fichier                  *|* A = Type du fichier                  *
  * B = Flag du fichier ($00/$FF)        *|* B = Flag du fichier ($00/$FF)        *
  * X = Pointeur sur nom de fichier      *|* X = Pointeur sur nom de fichier      *
  * U = Adresse d'implantation           *|* Y = Adresse de départ                *
  *--------------------------------------*|* U = Adresse de départ + taille       *
  LOAD   STD    $60EB   Type de fichier   |*--------------------------------------*
         STX    $60E7   Nom du fichier    |SAVE   STD    $60EB   Type de fichier
         STU    $60F1   Adr d'implantation|       STX    $60E7   Nom du fichier
  * Chargement de la FAT                  |       STY    $60F1   Adr de départ
         JSR    $E00D   Charge la FAT     |       STU    $60F3   Adr de fin
         BCS    ERRIO   Si "I/O Error"    |* Chargement de la FAT
  * Recherche du fichier                  |       JSR    $E00D   Charge la FAT
         LDA    #1      | Initialise      |       BCS    ERRIO   Si "I/O Error"
         STA    $60F0   | en LOAD         |* Création du fichier
         JSR    $E010   Recherche fichier |       LDA    #3      | Init sauvegarde
         TST    $60F9   | Si $60F9 à 0,   |       STA    $60F0   | avec écrasement
         BEQ    ERRNF   | fich non trouvé |       JSR    $E019   Crée le fichier
  * Convertit numéro de bloc              |       BCC    SAVE0   Si ok, passe
  LOAD0  JSR    $E01F   Convertit bloc    |       CMPA   #5      | Si catalogue
         STB    $604B   Initialise piste  |       BEQ    ERRCTF  | plein, sort
         LDX    $60ED   Pointeur sur FAT  |       BRA    ERRIO   Sinon, "I/O Error"
         LDB    $60F6   Bloc courant      |* Convertit numéro de bloc
         INCB           | Bloc            |SAVE0  JSR    $E01F   Convertit bloc
         LDB    B,X     | suivant         |       STB    $604B   Initialise piste
         STB    $60F6   Sauve le bloc     |       LDB    #-8     | Initialise
         CMPB   #$C0    | Si dernier bloc,|       STB    $60FA   | compteur secteur
         BHI    LOAD1   | récupère taille |       LDY    $60ED   Ptr FAT dans Y
         LDB    #$08    8 secteurs à charg|       LDX    $60F1   Ptr mémoire dans X
  LOAD1  ANDB   #$0F    Isole taille bloc |* Sauve le fichier
         STA    $604C   Sauve premier bloc|SAVE1  STA    $604C   Initialise secteur
         ADDB   $604C   Ajoute départ bloc|       STX    $604F   Initialise buffer
         DECB           Ajuste dern bloc  |       JSR    $E82A   Sauve le secteur
         STB    $60F3   Sauve dernier bloc|       BCS    ERRIO   Si "I/O Error"
         LDU    $60F1   Récupère ptr mem  |       LDB    $6058   | Calcule taille
  * Charge les secteurs                   |       COMB           | secteur selon
  LOAD2  JSR    $E82A   Charge le secteur |       ORB    #$80    | densité
         BCS    ERRIO   Si "I/O Error"    |       ABX            Ajuste pointeur
         LDX    $604F   Ptr buffer secteur|       CMPX   $60F3   | Si fin atteinte,
         LDA    $604C   | Si secteur pas  |       BHS    SAVE2   | sort
         CMPA   $60F3   | secteur maximum,|       STX    $60F1   Sauve ptr mémoire
         BNE    LOAD3   | passe           |       INCA           Secteur suivant
         LDA    $60F6    | Si dernier     |       INC    $60FA   | Si pas fin du
         CMPA   #$C0     | secteur du     |       BNE    SAVE1   | bloc, boucle
         BHI    LOAD4    | fichier, sort  |       JSR    $E01C   Cherche bloc libre
         BSR    TFR     Transfère données |       BCS    ERRDF   Si plus, erreur
         STU    $60F1   Sauve implantation|       LDA    $60F6   Bloc courant
         BRA    LOAD0   Bloc suivant      |       LDB    $60F9   Bloc suivant
  LOAD3  BSR    TFR     Transfère données |       INCA           | Assure chaînage
         INC    $604C   Secteur + 1       |       STB    A,Y     | des blocs de FAT
         BRA    LOAD2   Secteur suivant   |       STB    $60F6   Sauve bloc courant
  * Chargement dernier secteur et sortie  |       BRA    SAVE0   Bloc suivant
  LOAD4  LDD    $60F7   Taille dern sect  |* Clôture du fichier
         BEQ    LOAD5   Si 0, sort        |SAVE2  LDA    $60F6   Bloc courant
         BSR    TFR0    Transfère données |       LDB    $60FA   Compteur secteur
  LOAD5  CLRA           C de CC à 0       |       ADDB   #$C9    | Ajuste et
         RTS             |                |       INCA           | écrit taille du
                                          |       STB    A,Y     | bloc de fin
  * Transfert des données                 |       JSR    $E022   Clôt le fichier
  TFR    LDB    $6058    | Ajuste taille  |       BCS    ERRIO   Si "I/O Error"
         COMB            | maximum du     |       LDB    #1      | Passe en
         ORB    #$80     | secteur        |       STB    $60F0   | lecture
  TFR0   LDA    ,X+     |                 |       JSR    $E010   Recherche fichier
         STA    ,U+     | Transfère       |       BCS    ERRIO   Si "I/O Error"
         DECB           | les données     |       LDD    $60F3   | Définit la
         BNE    TFR0    |                 |       SUBD   $60F1   | taille du
  TFR1   RTS             |                |       STD    14,Y    | dernier secteur
                                          |       JSR    $E016   Sauve catalogue
                                          |       BCS    ERRIO   Si "I/O Error"
                                          |       RTS             |
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