À la découverte du FDC – Épisode 5

par roudoudou.

Erratum de l’article 4 : La tolérance du FDC en lecture est de 12%, voir correction dans l’article pour plus de détails.

L’instruction Lire Piste (ReadTrack)

Mythique, légendaire, l’instruction Lire Piste est pourtant d’une inutilité incompréhensible sur CPC. Seuls des détournements de finalité permettent de donner à cette instruction ses lettres de noblesse. Pire, c’est vraiment l’une des plus mal documentées, à un point tel que les programmeurs de l’époque ont bricolé sans vraiment comprendre tous les tenants et aboutissants.

Différence notable entre la documentation du FDC original de Nec et les autres, cette instruction ne s’appelle pas Lire Piste mais Lecture de Diagnostique. Pour le reste, on est toujours sur du copié-collé entre les documentations, les paramètres de la fonction ressemblent à s’y méprendre à une lecture secteur classique. Mais d’ailleurs, quelle pourrait être la différence entre ces deux fonctions puisque la commande de lecture secteur sait déjà lire des secteurs en ligne ?

L’instruction Lire Piste présente la particularité de lire les données (et uniquement les données) depuis le premier secteur de la piste, jusqu’à… …ah ben on ne sait pas trop. La documentation parle bien de fin de piste mais tout ceci reste bien mystérieux.

Documentation de cochon !

Cette instruction présente la particularité d’avoir été la moins bien documentée. Un exemple avec le tableau de la séquence d’exécution de la commande.

Extrait de la documentation UMC, la description est classique et identique (hors remarques) à la lecture

Bien que la commande requiert des informations sur le secteur (dont l’ID), les données seront bien lues à partir du premier secteur physique rencontré depuis le trou d’index et ce, quel que soit son ID. Ensuite, quels que soient les ID des secteurs qui suivent, ils seront lus (dans les limites des paramètres de GAP). Enfin, petite particularité et pas des moindres, si la taille de secteur spécifiée est différente de la taille réelle des secteurs, vous lirez la quantité de données correspondant à la taille de secteur de la commande (et encore, pas toujours, avec les secteurs de taille 0, vous ne lirez que 80 octets dans tous les cas, wtf!) ! Mais pouvoir lire plus loin que les données d’un secteur présentera surtout l’intérêt de pouvoir lire les GAP (par exemple).

Finalement le descriptif détaillé de la commande Lire Piste lâche le morceau, la valeur EOT est un nombre de secteurs à lire. La valeur utilisable va de 0 à 255 avec 0 pour lire 256 secteurs. La commande peut lire jusqu’à 8 Mo d’affilée quand on la paramètre mal, attention !

De nombreuses personnes se sont faites avoir en créant des protections basées sur cette commande. Ainsi, au lieu de mentionner un compteur, certains ont demandé un ID secteur de fin (au hasard #C1 ou #C2). Notre bon FDC ne rechigne pas à la tâche et tente ainsi de lire pas loin de 200 secteurs d’affilée.

Bien entendu le FDC ne rendra pas la main avant d’avoir lu ces 193 secteurs. Si on ajoute des paramètres de saut de GAP hasardeux (encore une fois #C0 ou plus), il faut donc patienter plusieurs secondes le temps qu’il fasse tous les tours nécessaires. C’est la raison pour laquelle la protection GAP du jeu A 320 semble figer le CPC pour ces interminables secondes, avant de continuer le chargement du jeu.

En effet, avec de tels paramètres, on lit 1024 octets puis on saute le secteur suivant avant de retomber sur un entête lisible.

séquence envoyée au FDC : #42,#00,#28,#00,#C1,#03,#C1,#C0,#FF
compteur de répétition => #C1
longueur de GAP à ignorer => #C0

; routine dédiée au test de GAP
di
ld bc,#FB7E ; port I/O du FDC
ld de,#0207 ; on lira le secteur + CRC + 5 octets de GAP
ld hl,#7B05 ; adresse où sera sauvegardé l'octet de GAP
jr wait_ready
reloop
ld a,d
or e
jr z,wait_ready ; une fois que DE est à zéro on ne lit plus
inc c
in a,(c)
ld (hl),a ; on écrit toujours au même endroit la valeur
dec c
dec de
wait_ready
in a,(c)
jp p,wait_ready
and #20
jr nz,reloop
ret

Le hack le plus simple consiste à remplacer la lecture DATA par l'écriture de la valeur de l'octet de GAP

Le registre de statut 1

Concernant l’information ND du registre de statut 1, j’ai eu beau m’acharner, le résultat renvoyé est toujours 1 ce qui peut correspondre à la logique d’utilisation de la commande Lire Piste dans le sens où l’information d’ID du premier secteur n’est pas prise en compte.

Mon attention finit par se porter sur le bit 6 de ST1. Les trois documentations de nos 3 FDC mentionnent toutes que ce bit est inutilisé et toujours à zéro, ce qui n’est visiblement pas le cas en pratique. On observe assez rapidement que ce bit est mis à 1 quand la commande Lire Piste est paramétrée avec une taille de secteurs différente de ce qui sera lu. On pourrait réécrire ainsi :

(during Read Track command)
D6                0 : requested size match     1 : requested size does not match

Le FDC sait gérer des secteurs gigantesques !

Comme je vous le disais en début d’article, l’intérêt de cette commande est qu’on peut lui demander de lire une taille arbitraire de secteurs quel que soit la taille de ces derniers sur le support physique. En jouant avec le paramètre de taille, voici les longueurs que le FDC peut lire :

0     |    80 octets
1     |   256 octets
2     |   512 octets
3     |  1024 octets
4     |  2048 octets
5     |  4096 octets
6     |  8192 octets
7     | 16384 octets
8-255 | 32768 octets

Cette particularité ne sera pas d’une utilité folle même si certains pourront trouver intéressant de faire une lecture brute de plusieurs tours de piste à des fins d’analyse ou archivage ! Par exemple pour permettre à ceux qui ne veulent pas envoyer leurs originaux de quand même faire un backup intégral sans matériel spécial.

Voilà, c’est fini

Ainsi s’achève cette série de 5 articles sur le FDC. Nous aurons survolé une bonne partie des fonctionnalités du FDC. Pas toutes, mais les plus utiles et utilisées. À l’instar de la fin de l’article 4 je vous invite à me contacter dans les bonnes crèmeries pour d’éventuelles questions complémentaires ou éclaircissements. Vos questions et les réponses qui en découlent serviront à réaliser une nouvelle documentation FDC. Pensez aux générations futures :p

EOF