CODINGFDC ★ À LA DÉCOUVERTE DU FDC – ÉPISODE 5 ★

A la découverte du FDC épisode 5 (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.

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

Roudoudou

★ ANNÉE: 2021
★ AUTEUR: Roudoudou

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » A la découverte du FDC épisode 2 (Roudoudou)
» Coding » A la découverte du FDC épisode 3 (Roudoudou)
» Coding Src's » Digitalised Sample Loader (Roudoudou)
» Coding » A la découverte du FDC épisode 1 (Roudoudou)
» Coding Src's » Roudoudou FDC Library
» Coding » A la découverte du FDC épisode 4 (Roudoudou)
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 311 millisecondes et consultée 78 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.