Demandes d'évolution de FASTDSK

Date création: 29/04/2009.
Dernière mise à jour: 04/05/2009.

Cette page fait suite aux derniers échanges que j'ai eu avec mon ami Thierry (aka Thry2).
Elle regroupe toutes les demandes d'évolution ou les bogues constatés depuis la première version (voire même avant pour certaines fonctions qui n'avaient pas pu être implémentées à temps).

Je prendrais en charge ces évolutions dès la fin du projet VFAT Explorer.
Il n'y a pas vraiment d'ordre de priorité si ce n'est pas nécessité du bon fonctionnement sur IIGS et la possibilité d'interrompre le process en cours de route.



*** DEBUT ***

1) Mode "Infinite Read"

DemandeurDeckard
Détail du changement:

Il arrive des fois que sur une disquette "instable" un secteur est lu correctement (=checksum valide) qu'à la dernière tentative. Dans ce cas là, vous êtes content.
Mais cela veut dire qu'il doit aussi arriver des fois où FASTDSK abandonne alors que le secteur à problème aurait pu être enfin lu à la tentative suivante.
S'il s'agit pour vous d'une disquette importante, il est clair que vous souhaitez absolument que FASTDSK lise autant de fois que nécessaire, l'objectif le plus important ici n'étant pas la rapidité mais l'absolue nécessité de récupérer toutes les données.

Il faut donc introduire un nouveau paramètre dans la configuration qui s'appellera "INFINITE READ MODE" (par defaut cette option sera à "N").
En activant ce paramètre (valeur à "Y"), FASTDSK relira en boucle la piste jusqu'à ce que le résultat soit okay.
Il ne sera possible de mettre cette valeur à "Y" que si le paramètre "USE CHECKSUM" est à "Y" (pour rester cohérent...)

Un secteur définitivement mort, cela arrive malheureusement. Et si la malchance s'abat sur vous, FASTDSK ne doit pas resté bloqué sur cette piste. Vous aurez donc la possibilité de forcer le passage à la piste suivante en appuyant sur la touche RETURN. En pressant cette touche, vous demandez à FASTDSK de ne pas insister et il ne gardera de la piste que ce qu'il a pu lire. Il passera alors à la piste suivante s'il y en a encore à traiter.
 

2) Option "Quarter Track"

DemandeurDeckard
Détail du changement:

Même avec l'option "INFINITE READ MODE", la récupération des données peut échouer si la disquette est dans un sale état.
Plutôt que de la jeter tout de suite à la poubelle, il y a encore une possibilité, qui même si elle ne garantie pas le résultat mérite tout de même d'être essayée.
Comme le signalait déja JPL dans cette log de 2004, il est possible de tirer profit des caractéristiques de la tête de lecture/écriture du drive.
Par exemple imaginons que sur une disquette la piste $05 ne puisse pas être lue correctement, il faut savoir que quand elle a été écrite, l'information a aussi été enregistrée sur + ou - 0,25 piste. L'idée est donc d'aller voir soit sur la piste $04.75 soit sur la piste $05.25 s'il y a quelque chose à prendre.

Il faut rajouter une nouvelle option dans le paramétrage: "USE QUARTER TRACK" avec les valeurs possibles "N" (non), "-" (quart de piste précédent) ou "+" (quart de piste suivant).
L'idée est donc au début du process de faire ce décalage et de lire le restant de la disquette avec un pas normal de 1.

Pour "N", on lira normalement $00, $01, $02, $03, .., $21, $22
Pour "-", on lira: $00, $00.75, $01.75, $02.75, ..., $20.75, $21.75
Pour "+", on lira: $00.25, $01.25, $02.25, $03.25, ..., $21.25, $22 (ou $22.25)

Pour vous rafraîchir la mémoire sur les 1/4 de pistes, ci-joint un article de la revue Computist:

Quarter Track
Quarter Track
Quarter Track


3) Interruption du processus pendant son exécution

Demandeur: Thry2
Détail du changement:

Lorsqu’une disquette en cours de traitement est en mauvais état, le drive n'arrive pas à la lire correctement et l'écran se remplit de caractères '*' signalant les problèmes. Avec les relectures successives, le traitement complet prend du temps et il n'est pas prévu de pouvoir l'interrompre. L'utilisateur est donc obligé d'attente que la face complète soit traitée.
L'idée est de pouvoir interrompre à tout moment le processus quand l'utilisateur le souhaite (par exemple s'il estime que la disquette est trop pourrie pour en tirer quoi que ce soit, si l'utilisateur ne veut pas créer un .DSK s'il y a ne serait ce qu'un secteur en erreur, ...)

Le modification consiste à prendre en compte la touche ESC pendant le traitement et à remettre la situation initiale, ce qui n'est pas toujours à faire de la même façon. En effet, en fonction du paramétrage, de la machine (128k ou 256k), du moment où l'interruption est demandée, il peut être nécessaire de:

- supprimer la partie du .DSK déja créée.
- décrémenter le numéro du disk ou de la face si l'option "USE STD NAME" est activée.

En plus cette interruption n'écrirait rien dans la log (si l'option "TRACE LOG" est à "Y") et à la création suivante, il se serait pas nécessaire de faire le contrôle sur la disponibilité de l'espace disque cible.

Pour ce faire, il faut que le programme tienne à jour une valeur (un octet) qui donnera le statut atteint à chaque phase et en cas de ESC le programme annulera les étapes précédentes pour revenir au point de départ.


4) Information du numéro de volume

DemandeurDeckard
Détail du changement:

Le champ adresse de chaque secteur contient une information de volume qui a été fixé au moment du formattage.
Ce numéro est normalement toujours le même pour une face donnée et il peut être utilisé par un soft multi-faces pour identifier quelle est la face courante dans un drive.
Afin qu'une trace de cette information soit conservée, il faut l'enregistrer dans le fichier de log.
Comme cela quand on passe ses .DSK sur un PC ou un MAC, on peut facilement les transformer en .NIB avec dsk2nib si le volume n'est pas standard.


5) Bogues sur Apple IIGS

Demandeur: Thry2
Détail du changement:

Dans la documentation, il est indiqué que FASTDSK fonctionne avec les machines 8 bits.
Mais sur un GS, il y a plusieurs problèmes révélés par Thry2 après des tests réalisés sur le GS rom 03 (donné par JPL) complété des éléments suivants: Ram 6Mo / RamFAST 3.01e + Disque Dur / Zip 10MHz / DuoDisk.

Les constats:

- Seulement 128K reconnu, donc la lecture ne se fait pas en une seule passe.
- Les .DSK créés ne fonctionnent pas sur Applewin!

Note de Deckard: je n'ai pas de GS sous la main actuellement mais j'ai fait des tests avec KEGS32 (pleine vitesse et 1Mhz) et j'ai comparé les .DSK produits avec l'original.
Même chose avec Sweet16 sur Mac.

A chaque fois le Fast Compare de Sam indique que pour chaque secteur du .DSK les octets de la fin du secteur (d'un indice variable - souvent $AC/$B3/$B4 - à $FF) ne correspondent pas!

Thry2 a aussi fait de nouveaux tests en parallèle sur des vrais GS avec des configs variables (modes FAST/NORMAL, ROM 01/03, Ram carte mère/GS Ram Plus 6 mb, accélération Zip GSX/sans) avec les faces 1 de Muryden 1 et Max A Gaz Greatest Hits. Le constat est le même. Avec en plus selon les configs des différences entre les .DSK générés toujours au niveau de quelques octets en fin de secteurs pour les pistes $00 à $0F (c'est à dire la 1ère passe sur GS) et la plupart du temps uniquement pour le 1er disk traité à chaque config (face "Front").


Il est très curieux que le programme fonctionne sur IIe mais pas sur GS.

J'ai fait quelques recherches sur internet et ai trouvé une page qui se rapproche du problème.
Il s'agit d'un numéro de la série des newsletters Apple Assembly Line écrite par Bob Sander-Cederlof.
La référence du numéro en question est: volume 7 issue 10.
L'article s'intitule "Another ProDOS-8 Bug in the IIgs" et parle d'une altération des octets de chaque fin de page d'un fichier écrit par ProDOS depuis l'application S-C Macro Assembler (S-C Software Corporation).

Quelques extraits:

... The code at fault is the (ProDOS) subroutine which transfers bytes of data from the caller's data buffer into the file buffer...
... It turns out ProDOS was only indirectly at fault. Both the old and the new versions of ProDOS-8 show the same failure, but it is due to the 65816 processor rather than any changes to the ProDOS code...
... Both versions of ProDOS worked correctly on the //e, and both failed on the IIgs...

Pour en avoir le coeur net, j'ai fait le test d'interrompre FASTDSK par reset après la lecture de quelques pistes et ai regardé en mémoire le contenu des pages chargées.
DAMNED!!!!
Les données en mémoire ne sont pas bonnes, ce qui écarte le cas de Bob où c'est au moment de l'écriture que les données sont altérées!
Pourtant  FASTDSK ne signale pas d'erreur de checksum, ce qui devrait être le cas s'il y avait un problème de timing dans la routine critique (du point de vue des cycles) RDSECDTA.S (par exemple pour le traitement du "top third buffer" qui produit les octets de $AC à $FF): le checksum final de chaque secteur est correct sur toutes les pistes!! 

Peut-être que le problème est dû à l'usage de la page 0 que le programme utilise pour de nombreuses informations.
Il me faut faire d'autres tests pour cibler le problème. Si déjà je savais s'il y a un débugger embarqué dans les émulateurs GS comme c'est le cas pour l'émulo 8 bits Applewin, ça me permettrait d'aller plus vite dans mes recherches en comparant le process sur un émulateur 8 bits et un 16 bits.
Tiens au fait, je me rappelle que la routine de lecture a été reprise dans ADT Pro. Il faudrait que je regarde si ça passe sur GS et le cas échéant comparer pour voir ce qui a été modifié...

A SUIVRE...

Mise à jour du 04/05/2009: bon j'ai trouvé. Il s'agit d'un disfonctionnement dû au processeur 65816 qui agit différemment du 6502/65c02 en cas de débordement de bank mémoire (et ce même en mode émulation). La routine RDSECDTA.S utilise un buffer NBUF2 en page 0 (de $AA à $FF) et pour le top third buffer (morceau du secteur lu), il y a une instruction LDX $FFFE,Y (correspondant à NBUF2-$AC) avec Y[$AC,$FF].
Sur IIe, la lecture correspondante se fait en page 0 de la mémoire principale (bank 0) et sur IIGS, en page 0 de la mémoire auxliaire (bank 1).
La solution a consisté à remplacer l'instruction par un LDX $FE,Y.
A noter par ailleurs que Merlin 8 n'est pas cool. Il a une option spéciale pour forcer l'adressage absolu (en mettant un caractère ":" après l'opcode) car en théorie c'est l'adressage en page zéro qui est par défaut. Seulement dans mon source, il refuse de faire un adressage en page zéro quand il évalue NBUF2-$AC...
Le programme est corrigé avec les indications de David Empson et j'attends les ultimes tests de Thry2 pour diffusion.


6) Problématique de la gestion du clavier

Demandeur: Thry2
Détail du changement:

FASTDSK fait un clear keyboard avant chaque saisie de touche et c'est génant quand on cherche à anticiper la prochaine touche à enfoncer.
Par exemple, quand le programme vérifie la taille dispo sur le volume stockant les .DSK, il met un certain un temps. Si l'utilisateur appuie sur "espace" pendant qu’il vérifie la taille dispo de façon à ce que la création du .DSK se lance de suite après sa vérif, ca n’est pas pris en compte. Il faut retaper et c’est une perte de temps !!!! (C’est la meme chose pour le lancement du processus ou en fin de processus)...
Avec Locksmith FDB et 2 drives : l'utilisateur lance la copie en appuyant 2 fois sur espace: le programme lit l’original ; une fois la lecture de l’original achevée, il lance la copie, l'utilisateur en profite pour changer l’original par la disquette suivante puis il ré appuie sur espace; ce qui fait qu’une fois que le copieur a finit d’écrire la copie, il relance la lecture de l’original et ainsi de suite : il n’y a pas de temps mort !!!

Note de Deckard: il y a effectivement la séquence LDA #0,  STA $C000 et BIT STROBE en début de routine WAITKEY.S, ce qui annule la saisie.
Il ne faudrait pas que FASTDSK le fasse pendant ce cycle de process. Uniquement pour le reste.


7) Modification de la table de translation

DemandeurJPL et Deckard
Détail du changement:

JPL a rencontré un problème en effectant un changement de markers mais je n'ai pas plus de détail.
Parallèlement à cela, certains softs ont des protections basées sur la modification de la table de translation des nibbles valides (64 nibbles de $96 à $FF) en octets contenant 6 bits significatifs (format XXXXXX00). Ce qui fait qu'avec une table normale, les informations ne sont pas décodées comme il faudrait et les octets restitués n'ont aucun sens.

Il faut donc ajouter un paramétrage donnant accès à cette liste de translation pour modifier l'ordre à sa guise.

Il y a un cours de dépombage de Godfather qui parle de cela: le numéro 17.


8) Saisie manuelle du nom d'un .DSK

Demandeur: Thry2 & Deckard
Détail du changement:

Lorsque le nom du .DSK cible doit être saisi manuellement (en mode "USE STD NAME" = 'N'), l'extension .DSK doit être rajoutée automatiquement.
Ce n'est pas à l'utilisateur de saisir ce suffixe.
La taille de saisie du nom doit de ce fait être limitée à 11 caractères (au lien de 15 actuellement).

Par défaut, il faut préafficher le nom précédemment utilisé (s'il y en a un). Ceci est utile quand par exemple on est en train de créer des .DSK pour un soft qui tient sur plus d'une face. Il suffit juste de rajouter de quoi identifier la face en question.

En complément au point précédent, à n'importe quel moment lors de la saisie du nom, en tapent CTRL-X, le nom en cours est ré-initialisé. Par exemple si le soft qui fait plusieurs faces a été passé, le pré-affichage est toujours actif et comme on veut passer au soft suivant qui n'a rien à voir, avec cette touche on nettoie vite fait le masque de saisie.


9) Identification des faces

Demandeur: Thry2
Détail du changement:

La méthode la plus rapide pour la création de .DSK est d'utiliser l'option "USE STD NAME" (valeur = "Y").
On génère ainsi une série d'images disques avec des noms formattés.
Pour bien faire les choses, quand on passe ces .DSK sur une machine moderne (PC ou MAC), il faut modifier le nom afin d'y intégrer le contenu réel.
Par exemple si FASTDSK a généré une image DG00132F.DSK pour le jeu Sammy Lightfoot, l'idéal est de le renommer DG00132F_Sammy_Lightfoot.DSK sur sa bécane récente pour avoir à la fois la référence et le contenu (afin de faciliter les recherches par la suite avec spotlight par exemple).

Pour générer les noms formattés, FASTDSK utilise actuellement les lettres 'F' (pour Front) et 'B' (pour Back) afin d'identifier les 2 faces d'une disquette.
Or quand on transfert tous les .DSK créés sur l'Apple II vers un PC ou un MAC, l'OS moderne les trie la plupart du temps sur le nom en ordre croissant.
Ce qui fait que les faces back se retrouve avant les faces front (le caractère 'B' se trouvant avant le caractère 'F'), ce qui n'est pas pratique.
Afin d'avoir un tri plus propre, les lettres à utiliser sont 'A' (face 1) et 'B' (face 2).


10) Précision sur la ligne de statut des pistes

Demandeur: Thry2
Détail du changement:

L'affichage de l'évolution de la création du .DSK ressemble beaucoup au Locksmith Fast Disk Backup (FDB).
A quelques détails d'affichage près, notamment sur la ligne de statut des pistes.
Avec FDB, la statut de track indique "," ou ";" quand il a fallu lire plusieurs fois un ou plusieurs secteurs d'une piste.
Mais la doc de la version 6.0 (pour FDB et pour l'option Verify) ne donne pas de précision sur les règles de gestion: si c'est à partir du nombre de lectures, du nombre de secteurs, etc...
Il serait intéressant d'avoir des statuts intermédaires entre "." et "*" dans FASTDSK pour les utilisateurs qui ne regardent que la synthèse des pistes ou qui ne considèrent un .DSK comme bon que si tout a été lu du 1er coup.

Note de Deckard: ce qu'il faut savoir, c'est que le checksum d'une manière générale ne garantie pas un 100% d'exactitude. Il arrive que 2 erreurs combinées donnent au final un checksum bon. Par exemple si tu passes 2 fois 1 disquette un peu foireuse mais pour laquelle la copie a été donnée comme bonne (après x essais), si tu les compares avec Fast Compare de Sam, tu peux avoir des écarts. Par exemple des $80 sur un secteur d'un .DSK et des $00 dans le même secteur de l'autre .DSK.


11) Précision du détail d'une erreur sur secteur

Demandeur: Deckard
Détail du changement:

Dans la routine de traitement d'un secteur, plusieurs anomalies peuvent survenir mais pour une erreur "fatale", FASTDSK se contente d'indiquer une erreur générique avec la lettre "*".
Afin de se rapprocher de Locksmith FDB, il faudrait donner le détail suivant:
- erreur champ addresse: mettre "A" au lieu de "*".
- erreur champ data: mettre "D" au lieu de "*".


12) Bogue numéro de drive

Demandeur: Thry2
Détail du changement:

Dans la configuration, il est possible de choisir le drive 2 pour le slot 6.
Mais au moment où on veut créer un .DSK, quand on appuie sur la touche "G" (Go), le programme demande d'insérer la disquette dans le drive 1 (message "INSERT DISK IN S6 D1".
A part ce bogue d'affichage, le drive 2 est bien pris en compte et c'est avec lui que se fait la lecture.
C'est juste un problème d'affichage.


13) Reset du fichier de configuration

Demandeur: Thry2
Détail du changement:

Cette nouvelle option doit permettre de remettre les valeurs par défaut.

 
14) Génération du fichier de configuration

Demandeur: Thry2
Détail du changement:

Quand le fichier de configuration FASTDSK.CONF est absent, le lanceur system doit en créer un avec les valeurs par défaut plutôt que de s'arrêter.


15) Cohérence de l'option "USE STD NAME"

Demandeur: Thry2
Détail du changement:

Quand l'utilisateur choisit "N" pour cette option, il ne faut plus que soit accessible le détail du format du nom (dans les zones dessous).
La flèche "DOWN" (bas) doit alors passer directement au champ de saisie "TRACE LOG".


16) Cohérence de touche

Demandeur: Thry2
Détail du changement:

Plutôt que d'utiliser la touche "G" (Go) pour lancer le process depuis le menu principal, utilisation de la touche espace.
Il suffira de faire 2 fois "espace" pour créer un .DSK.


17) Affichage CTRL-F en décimal

Demandeur: Thry2
Détail du changement:

L'option d'affichage du nombre de blocks libres restant sur le volume accueillant les .DSK est en hexa (message de la forme: FREE=$XXXX/$YYYY).
Ces valeurs seraient plus lisibles en mode décimal.


18) Documentation sur la disquette

Demandeur: Thry2
Détail du changement:

Comme il y a de la place sur la disquette (ou le .DSK), pourquoi ne pas inclure la doc française dessus (celle du site) au format .txt, comme le fait par exemple le soft Shrinkit ?


19) ré-écriture du programme avec des Overlays

DemandeurDeckard
Détail du changement:

Toutes les modifications et ajouts demandés vont grossir la taille du binaire.
Et je ne pense pas que tout tienne en mémoire principale.
Il faut donc retailler le programme et faire des modules indépendants (Overlays) qui seront chargés depuis la mémoire auxiliaire (selon les besoins) dans la même zone de mémoire principale. Par exemple la partie permettant de modifier la configuration n'est pas indispensable au process proprement dit et ne sera "monter" en ram princ que si l'utilisateur appuie sur la touche "C" (changement de configuration).

*** FIN ***