In English: A guide to the lesser-documented commands of the Tony Tebby floppy-disk toolkit found on most QL disk interfaces (a limited version on the Cumana, full Toolkit II on the Sandy Super-Q-Board): FLP_OPT for safety level, start-up delay and track count, single-sided formatting with an asterisk in the medium name, and direct sector access by opening "flpx_*dyz" with GET, BGET, PUT and BPUT. Three SuperBASIC listings follow: msdisk2_bas, which dumps an MS-DOS disk sector by sector in hex and ASCII, and DISKCOPY_BAS, a fast whole-disk copier, with a slower "elegant" DISKCOPY2 variant.
Printed title: Exploration de FLP_. The article below is in French, as printed in QL_DOC n6 (October-November 1988).
L’ajout de lecteurs de disquettes à un QL améliore le système de 300% car les µdives sont bien gentils, mais ils sont trop lents, de capacité assez limitée et sujets à des performances qui peuvent rendre un QListe très nerveux.
Peu importe le controleur que vous possèdez, il y a de bonne chance pour que le TOOLKIT présent pour gérer vos lecteurs soit écrit par TONY TEBBY. La base de ce toolkit est identique pour tous les controleurs sauf quelques ajouts. Par exemple, sur l’interface CUMANA nous avons un TOOLKIT limité tandis que sur le SANDY SUPER-Q-BOARD, le TOOLKIT II est présent en entier.
Ce TOOLKIT offre plusieurs commandes assez spéciales mais qui ne sont pas très expliquées en général dans le manuel accompagnant le controleur. Dans cet article nous allons examiné les plus intéressantes de celles-ci.
FLP_OPT
La première commande est FLP_OPT, elle renseigne le QL sur le genre de lecteur de disquettes que nous avons. La syntaxe de FLP_OPT est la suivante:
FLP_OPT niveau_de_sécurité,temps_d'attente,nombre_de_tracks
Le niveau_de_sécurité détermine la manière que le QL vérifie avant l’écriture sur une disquette si celle-ci est la toujours la même, qu’elle n’a pas était remplacée par une autre. Car si c’est le cas, une disquette peut être rendu facilement illisible si les disquettes sont remplacés sans que le QL s’en rendre compte.
Il y a 3 niveaux de sécurité numérotés de 1 à 3, 3 étant le niveau par défaut. En abaissant le niveau de sécurité, nous accélérons un peu les opérations de lecture/écriture mais nous courons le risque de “boussillez” une disquette en changeant celles-ci entre des opérations d’écriture. Ce paramètre devrait toujours rester à 3 pour notre sécurité et surtout pour celle de nos fichiers.
Le temps_d’accès représente le temps que le QL doit attendre avant d’écrire sur une disquette, ce temps étant nécessaire pour permettre à la disquette d’obtenir un vitesse de rotation suffisante (environ 300 tours par minute pour les 5.25″, 600 tours par minute pour les 3.5″) ceci est fait pour préserver l’intégrité des données.
Le temps_d’accès est spécifié en unité de 20 millisecondes. La valeur par défaut est 30 soit .6 seconde. Cette valeur est plus que suffisante et peut être diminuée sans problème. Une valeur de 13 (260 millisecondes) est adéquate pour la plupart de lecteurs 3.5″ moderne. Si vous avez des problèmes avec de vieux lecteurs, essayez un valeur de 60 (1.2 secondes), la fiabilité de ceux-çi devraient augmentée. Il est à noter qu’une valeur trop élevée fera que le lecteur arretera par lui-même avant même d’effectuer l’opération de lecture/écriture!
Sur les premiers secteurs d’une disquette formatée, l’information concernant le nombre de tracks présents est inscrite. Mais lors du formatage, le QL n’a pas de moyen de savoir si notre lecteur est un 40 tracks (720 secteurs) ou bien un 80 tracks (1440 secteurs). C’est avec la commande FLP_OPT que nous pouvons en l’informer. Si l’on fait FORMAT FLP1_, sans avoir utilisé FLP_OPT auparavant, le QL formatera jusqu’à la 55ième track, si tout est OK, alors il assumera un lecteur 80 tracks, si il y a un problème alors il assumera un lecteur de 40 tracks. Donc on peut raccourcir le temps de formatage on disant au départ que nous avons un lecteur 40 tracks et qu’il n’est pas nécessaire d’aller jusqu’à la 55ième track pour le vérifier. En plus de sauver du temps, nous ménageons notre lecteur 40 tracks car il n’est pas fait pour aller jusqu’à la 55ième. Il est à noter que nous pouvons spécifier le nombre de tracks que nous voulons, comme 37 ou 74 tracks par exemple!
Dans notre fichier BOOT, une utilisation typique de FLP_OPT serait
FLP_OPT 3,15,40
3 étant le niveau de sécurité, 15 étant le temps d’attente, 40 étant le nombre de tracks.
FORMAT
Il est possible de formater une disquette sur un seul coté même si nous avons un lecteur double coté. La procedure est très simple, nous mettons un astérisque comme 11ième caractère au nom que l’on donne à la disquette. Par exemple, FORMAT “FLP1_QL_DOC7890*”, nous donne une disquette au nom de “QL_DOC7890” avec 2 fois moins de capacité!
DIRECT I/O
QDOS offre une possibilité assez unique dans le fait qu’il permet de traiter une disquette et son contenu comme étant un fichier unique, ceci permet de lire et écrire des disquettes de FORMAT étranger au QL, par exemple le PROGRAMME #1 permet d’examiner le contenu d’un disquette MS-DOS secteur par secteur, on peut également examiner une disquette au format QL si le coeur nous en dit.
Pour traiter la disquette comme étant un seul gros fichier, nous l’ouvrons à partir de QDOS en l’appelant “FLPx_*dyz”, où “x” est le numéro du lecteur, “d” sert d’identification,”y” indique la capacité de chaque secteur et “z” indique la densité.
“y” peut prendre plusieurs valeurs différentes.
y = 0, secteurs de 128 octets y = 1, secteurs de 256 octets y = 2, secteurs de 512 octets y = 3, secteurs de 1024 octets
“z” peut prendre une des valeurs suivantes.
z = "s" pour Simple Densité z = "d" pour Double Densité
Par exemple, si on a une disquette dans le lecteur “FLP1_” on peut ouvrir le fichier-disquette avec la commande:
OPEN #3,"flp1_*d2d"
si il s’agit d’une disquette Double Densité ayant des secteurs de 512 octets. Chaque secteur de la disquette devient un élément du fichier.
Il y a 4 commandes très utiles pour la lecture et l’écriture de ce genre de fichier. Elles ont pour noms GET, BGET, PUT, BPUT.
BGET et BPUT
BGET est utilisé pour la lecture et BPUT est pour l’écriture d’un ou d’une série d’octets. On peut penser que BGET est l’équivalant de PEEK et BPUT est l’équivalent de POKE.
La syntaxe de BGET est BGET #canal[pointeur](octet), où “pointeur” est la position dans le fichier et “octet” est la variable qui va contenir l’octet lu.
La syntaxe de BPUT est BPUT #canal[pointeur](octet), où “pointeur” est la position dans le fichier et “octet” est la valeur que l’on veut écrire.
GET et PUT
La syntaxe des ces commandes est similaire à celle de BGET et BPUT. La différence est la suivante.
BGET et BPUT sont utilisés pour des octets.
GET et PUT sont utilisés pour tout type de variable.
Par exemple, BPUT #344,64 écrit l’octet 64 à la position 44 dans le fichier ouvert par le canal #3.
PUT #344,”test”,5.3 écrit le STRING “test” et le nombre en virgule flottante 5.3 à partir de la position 44 dans le fichier ouvert par le canal #3.
Le programme #2, DISKCOPY_BAS, est un exemple d’utilisation de GET et PUT. Ce programme fait une copie exacte de flp1_ dans flp2_. Si la disquette contient beaucoup de petits fichiers alors cette méthode est beaucoup plus rapide que de copier fichier par fichier. Les 2 disquettes doivent avoir une capacité identique, il n’est pas possible de copier une disquette 40 tracks sur une 80 tracks en utilisant DISKCOPY_BAS, si on le fait la “80 tracks” sera considérée comme une 40 tracks par la suite…
En premier lieu, le programme demande si il s’agit de disquette 80 ou 40 tracks, ensuite on met la disquette SOURCE-ORIGINALE dans FLP1_ et la disquette DESTINATION dans FLP2_, cette dernière doit être formatée au préalable.
Il y a 2 versions à ce programme, la première, quoique plus longue, est plus rapide d’exécution. La deuxième est plus “élégante” mais démontre que l’utilisation de boucles “sophistiquées” ralentie considérablement l’exécution d’un programme.
Si vos lecteurs sont “SIMPLE FACE” alors omettez les lignes 460-480 et 550-570.
10 REMark msdisk2_bas
20 :
100 OPEN#5,scr_364x250a10x0:BORDER#5,1,7:CLS#5
110 OPEN#6,scr_124x250a375x0:BORDER#6,1,2:CLS#6
120 CLOSE #3
130 OPEN#3,'FLP1_*D1D'
140 TRACKS=40
150 :
160 FOR TRACK=0 TO TRACKS-1
170 X=65536*TRACK
180 GETTRACK
190 END FOR TRACK
200 :
205 :
210 DEFine PROCedure GETTRACK
215 FOR secteur=1 TO 9, 128+1 TO 128+9
220 GET #3X+secteur,A$:T
225 END FOR secteur
410 END DEFine
420 :
430 :
440 DEFine PROCedure T
460 PRINT#5:PRINT#6
470 PAPER#5,2:INK#5,0
480 PRINT#5,TRACK;'/';secteur:PRINT#6
490 PAPER#5,0:INK#5,7
530 F$=A$
550 PRINT#5,HEX$(CODE(A$(1)),8);
551 IF CODE(A$(1))>32 AND CODE(A$(1))<128
552 PRINT#6,A$(1);
553 ELSE
554 PRINT#6,'.';
555 END IF
557 :
560 FOR I=2 TO LEN(F$)
570 IF I+1>LEN(F$):EXIT I
590 PRINT#5,' ';HEX$(CODE(A$(I)),8);
600 :
610 IF CODE(A$(I))>32 AND CODE(A$(I))<128
620 PRINT#6,A$(I);
630 ELSE
640 PRINT#6,'.';
650 END IF
660 :
670 IF INKEY$=='x'
675 BEEP 100,1
680 REPeat attend
690 IF INKEY$<>'':EXIT attend
700 END REPeat attend
710 IF INKEY$=='q':CLOSE#3:PRINT ' TERMINE!!!!!!':STOP
735 END IF
742 :
750 END FOR I
760 END DEFine
100 REMark DISKCOPY_BAS
110 REMark original -> FLP1_
120 REMark disquette formatée -> FLP2_
130 REMark
140 REMark version rapide (120-5 secondes)
150 :
160 CLS:PRINT 'Sélectionnez le type de disquette ?'
170 PRINT '[1] 40 Tracks [2] 80 Tracks'
180 REPeat loop
185 a$=INKEY$(-1)
190 IF a$='1':tracks=40:BEEP 10,10:EXIT loop
200 IF a$='2':tracks=80:BEEP 10,10:EXIT loop
205 BEEP 100,10
210 END REPeat loop
212 :
215 REPeat copie
220 PRINT 'Copie de disquette'!tracks!'Tracks'
230 PRINT
240 PRINT 'Disquette ORIGINALE dans FLP1_'
250 PRINT 'Disquette FORMATéE dans FLP2_'
260 PRINT 'Pressez une touche...'
270 PAUSE
280 :
290 OPEN#3,'flp1_*d2d'
300 OPEN#4,'flp2_*d2d'
310 :
320 temps=DATE
330 FOR track=0 TO tracks-1
340 x=65536*track
350 getrack : putrack
360 AT 8,0:PRINT "Track"!track!"copiée OK"
370 END FOR track
380 :
390 PRINT "Copie terminée!":CLOSE#3:CLOSE#4
400 PRINT DATE-temps!"secondes"
405 INPUT "Une autre copie (o/n)?";a$
407 IF a$=='n':EXIT copie:ELSE CLS
408 END REPeat copie
409 PRINT "Terminé...":STOP
410 :
420 DEFine PROCedure getrack
430 GET#3x+1,a$:GET#3x+4,b$:GET#3x+7,c$
440 GET#3x+2,d$:GET#3x+5,e$:GET#3x+8,f$
450 GET#3x+3,g$:GET#3x+6,h$:GET#3x+9,i$
460 GET#3x+257,j$:GET#3x+260,k$:GET#3x+263,l$
470 GET#3x+258,m$:GET#3x+261,n$:GET#3x+264,o$
480 GET#3x+259,p$:GET#3x+262,q$:GET#3x+265,r$
490 END DEFine
500 :
510 DEFine PROCedure putrack
520 PUT#4x+1,a$:PUT#4x+4,b$:PUT#4x+7,c$
530 PUT#4x+2,d$:PUT#4x+5,e$:PUT#4x+8,f$
540 PUT#4x+3,g$:PUT#4x+6,h$:PUT#4x+9,i$
550 PUT#4x+257,j$:PUT#4x+260,k$:PUT#4x+263,l$
560 PUT#4x+258,m$:PUT#4x+261,n$:PUT#4x+264,o$
570 PUT#4x+259,p$:PUT#4x+262,q$:PUT#4x+265,o$
580 END DEFine
100 REMark DISKCOPY2_BAS
110 REMark original -> FLP1_
120 REMark disquette formatée -> FLP2_
130 REMark
140 REMark version élégante mais lente
Ajoutez la ligne suivante:
305 DIM secteur$(18,512)
Remplacez les 2 procédures par celles-ci
420 DEFine PROCedure getrack
LOCal i,sect
sect=1
FOR i=1 TO 9,257 TO 265:GET#3x+i,secteur$(sect):sect=sect+1
END DEFine
510 DEFine PROCedure putrack
LOCal i,sect
sect=1
FOR i=1 TO 9,257 TO 265:PUT#4x+i,secteur$(sect):sect=sect+1
END DEFine
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.