CODINGAMSLIVE ★ AMSLIVE n°06 - HAPPY DRIVERS : LES RSX AMSDOS ★

AMSLIVE n°06 - Rsx AmsdosCoding Amslive

L'accès disque est une opération des plus importantes. Cette série d'articles ambitionne d'en améliorer la fiabilité, la rapidité. Nous verrons comment se servir des routines de la ROM, détourner les messages d'erreur, personnaliser votre gestion de lecture/écriture tout en restant compatible AMSDOS (dame, il faut bien penser aux formats spéciaux, au futur disque dur...).

Attaquons par les RSX AMSDOS. Pas |A, |B, |CPM, | REN ... que vous connaissez déjà, mais les RSX 1 à 9. On ne peut pas y accéder à partir du BASIC, car celui-ci n'accepte pas les noms contenant des caractères spéciaux ou formés comme ici d'un chiffre. Alors que les routines système permettent de manipuler des noms avec espaces, minuscules...

L'opération se déroule en 2 temps : recherche de la RSX, et son appel !

LE  VECTEUR  BCD4

La recherche se fait une fois pour toute pour chaque RSX. Le vecteur BCD4 (KL-FIND-COMMAND) s'en charge pour peu que HL contienne l'adresse du nom de la RSX. Attention à bien entrer ce nom : cpm par exemple ne sera pas trouvé. Si le BASIC convertissait automatiquement en majuscules, ce n'est pas le cas de BCD4 qui cherche strictement la même chaîne.
Notez qu'il faut ajouter &80 au dernier caractère, le bit 7 ainsi mis à 1 fait office de témoin de fin de chaine.

Au retour, AF, BC et DE sont modifiés. Si une RSX a été trouvé, CARRY est vrai, C contient le numéro de ROM et HL l'adresse de la routine. Sinon CARRY

est faux, soit parce que le nom esi incorrectement entré dans votre source, soit parce que la ROM n'est pas initialisée (ceci fera l'objet d'un prochain article). Le programmeur consciencieux prévoira un message d'erreur en cas d'échec.

QUELLE ADRESSE !

Ca y est, C et HL contiennent les informations nécessaires à l'appel de la routine. Le vecteur &1B (KL-FAR-PCHL) lit justement ces registres pour déterminer où sauter. On peut donc l'utiliseï immédiatement après BCD4. Cependant, il n'est pas indiqué si on veut réutiliser la commande plus tard. De plus, certaines routines attendent des paramètres dans HL ou C justement.

On va donc stocker ces valeurs ; la RSX sera appelée par le vecteur &18 (KL-FAR) qui doit être suivi de l'adresse à laquelle sont placés, dans l'ordre, l'adresse de la routine et le numéro de ROM correspondant.

VECTEURS &  RSX, MEME COMBAT

Une fois connues, pourquoi ne pas entrer directement dans un source les adresses des différentes RSX ? Sacrebleu, parce que si ces adresses ne risquent pas de changer du jour au lendemain sur votre CPC, elles peuvent changer d'un CPC à l'autre. Celles de la ROM DISC des CPC+ sont par exemple décalées par rapport aux CPC classiques. Alors que les noms restent constants.
D'une manière générale, il ne faut jamais sauter directement en ROM.

RAPIDE  DESCRIPTIF

Passons   en    revue    ces    RSX mystères.

1   : Autorise ou interdit les messages d'erreurs physiques (ceux qui demandent Retry, Ignore or Cancel ?).

Conditions d'entrée : Si A est nul, autorise. Dans tous les autres cas, interdit. Conditions de sortie : A contient l'ancienne valeur, HL est modifié.

2  : Modifie les paramètres de drive.

CE : HL pointe sur une table de 9 octets qui
contient les valeurs :
Délai après MOTOR ON (2 octets)
Délai avant MOTOR OFF (2 octets)
Délai lors du formatage d'une piste (1 octet)
Délai pour changement de piste (2 octets)
HEAD UNLOAD TIME (1 octet)
HEADLOADTIMEO octet) CS : A contient le dernier octet de la table (c'est franchement inutile de savoir ça, non ?). F, BC, DE, HL modifiés.

3  : Définit les paramètres de format.

CE : E contient le numéro du lecteur (0 pour A, 1 pour B). Les bits 7 et 6 de A déterminent le format.
00  : Format IBM
01  : Format SYSTEM 11 : Format DATA
CS : AF, BC, DE, HL modifiés. DPB mis à jour !

4  : Lit secteur.

CE : Les bits 0 et 1 de E déterminent le numéro du lecteur (seul le bit 0 importe sur CPC), le bit 2 de E la tête à utiliser, D la piste, C le "nom" du secteur (son numéro + décalage format), HL l'adresse du buffer de #200 octets.
CS : Si opération ok, CARRY est mis, A est nul, HL est sauvegardé.
Sinon, CARRY est faux, A contient le numéro de l'erreur, HL pointe sur la zone de statut. BC, DE modifiés dans tous les cas.

5  : Ecrit secteur. CE : Idem 4

CS : Idem 4

6  : Formate une piste.

CE : DE comme pour 4. HL pointe sur les IDentificateurs secteurs (n * 4 fois octets numéro piste, numéro tête, numéro secteur taille secteur). Certains octets du DPB sont lus.
CS : Idem 4

7  : Recherche piste. CE : DE comme pour 4.

CS : Mêmes indicateurs que pour 4 suivant la réussite du déplacement de la tête.

8  : Teste lecteur.

CE : A contient le numéro du lecteur.
CS : HL pointe BE4B. (HL) contient le nombre d'octets mis à jour de la phase résultat. Ces octets sont stockés à partir de BE4C justement. Si lecteur prêt, CARRY vrai et A contient le registre d'état 0 du FDC. Sinon, CARRY est faux.

9  : Nombre d'essais.

CE : A contient le nombre de tentatives à effectuer en  cas d'erreur  lors  de  la recherche   de   piste.   La   valeur  nulle correspond à 256.
CS : A contient l'ancienne valeur.

Et voilou, n'hésitez pas à faire pleins d'essais, c'est sans aucun risque (sauf celui de vous tromper en insérant votre disquette préférée à la place de la disquette de travail. Mais bon, on vous a conseillé cent fois de faire des copies de sauvegarde).

Les exemples dans le numéro 7 ... , AMSLIVE n°6

★ ANNÉE: ???
★ AUTEUR: MADRAM

Page précédente : AMSLIVE n°05 - Multiplication de Solutions

CPCrulez[Content Management System] v8.7-desktop/cache
Page créée en 152 millisecondes et consultée 1796 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.