28 septembre 2024

Identification du lecteur de disquette en cours d’utilisation

Par Claire CheshireCat

De nombreux programmes n’aiment pas le lecteur B de notre Amstrad CPC. Vous démarrez un logiciel sur le lecteur externe de votre machine et après quelques secondes le lecteur A démarre : Le programme que vous venez de charger essaye de lire des données sur votre drive interne. Autant dire que le jeu ou la démo ne trouvera pas son bonheur avant longtemps.

S’il existe une bidouille simple pour que le lecteur B soit identifié comme un lecteur A (et ainsi contourner le problème), on peut aussi le faire de manière logicielle. Si vous voulez que vos programmes soient un peu plus polis avec leurs utilisateurs, ils conviendrait qu’ils déterminent eux-mêmes quel lecteur de disquette est actuellement utilisé. Quelques lignes de code assembleur de rien du tout pour rendre votre programme bullet-proof !

L’Amsdos conserve en mémoire le numéro du lecteur en cours. Il suffit donc de piocher l’info au bon endroit. Et c’est en #BE7D que ça se passe : Vous trouverez là bas un nombre 16 bits indiquant l’adresse de l’octet où se trouve l’information. Un peu acrobatique, mais j’imagine que les concepteurs de l’Asmdos avaient une bonne raison de faire ça. L’octet qu’on pêchera à l’adresse en question vous indiquera si l’Asmdos est en train d’utiliser le lecteur A (L’octet sera alors égal à zéro), ou B (1 dans ce cas).

En guise d’illustration, voici une petite macro SJASM+ qui fera le travail nécessaire :

Plaintext
;=========================
; Indique le drive en cours au niveau de l'Amsdos
;-------------------------
; Entrée : Rien
; Sortie : A=0 si on est sur le lecteur A
;          A=1 si on est sur le drive B
;=========================
    macro amsdos_get_drive
        push hl
        ld   hl,(#BE7D)
        ld   a,(hl)
        and 1
        pop hl
    endm

A partir de maintenant, vous n’avez plus d’excuse si vos programmes ne savent pas s’accommoder du lecteur B ! J’en profite pour remercier Candy à qui j’ai volé cette technique simple et très efficace.