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 | |