Bon, ça marche
En fait j'avais mal calculé de tête mes adresses pour le BUFFER secteur, les FATs et le(s) FCB.
Du coup, il y a un endroit où ça se chevauchait : erreur de débutant.
J'en ai profité pour reprendre le code de Préhisto issu de paragraphe pour la lecture "rapide" en séquentiel pour lire à la place de l'extramoniteur.
Et tout fonctionne nickel.
L'init de l'extramoniteur et du DOS
Code:
INIT_EXTRA_MONITEUR
* init à froid
LDB #EXT_INIT_COLD
JSR EXTRAMONITEUR
* init DOS
DOS_BUFFER EQU $6600 * adresse du buffer de 256 octets pour la lecture des secteurs. On décide $6600
DOS_FAT EQU DOS_BUFFER+$0100 * adresse pour les FATs (5x166) = 830 octets = $033E. plage $6600 -> $693E
DOS_FCB EQU DOS_FAT+$033E * adresse pour indisquer 281 octets suivant pour le stockage de FCB (File Control Bloc) * 1 seul fichier ouvert
LDX #DOS_BUFFER
STX $6197 * register pour indiquer l'adresse du buffer
LDX #DOS_FAT
STX $6199 * register pour indiquer l'adresse de stockage des 5 FATs
LDY #$01 * on utilise seulement la première face de la première disquette
LDA #$01 * un seul fichier ouvert
LDX #DOS_FCB
LDB #2 * call FCBINI
JSR EXTRAMONITEUR
RTS
je passe sur l'ouverture de fichier, etc.
Le parcours du fichier et son affichage (avec le système de boucles de LWASM avec "!" (début et fin de boucle) "<" (boucler) et ">" (sortir de la boucle).
Code:
BYTE_PACKET EQU 8 * affichage des octets par paquet de 8 à l'écran puis retour à la ligne
LDB #5
JSR EXTRAMONITEUR * on lit le premier octet (le premier secteur du fichier) avec l'extramoniteur
LDB #BYTE_PACKET
!
LDA $6178 * ? EOF ?
BNE > * si pas egal à 0, on sort
LDA $6196 * sinon on lit l'octet
JSR PRINT_HEXA * on l'affiche
PCHAR #$20 * on ajoute un espace à l'écran
JSR READ_BYTE * on avance dans le buffer qui charge automatiquement les secteurs suivants
DECB * pour produire un retour
BNE < * à la ligne
JSR CR_LF * tous les
LDB #BYTE_PACKET * #BYTE_PACKET = 8
BRA <
!
et enfin la lecture octet par octes, directement dans le buffer comme indiqué par le post de préhisto, avec le chargement délégué à l'extramoniteur quand on arrive en fin de data du buffer.
Code:
FCBPTR EQU DOS_FCB * pointeur vers le FCB du dernier fichier ouvert
READ_BYTE
PSHS X,B
LDX #FCBPTR+$10 * Pointeur sur le FCB courant (+$10)
LDB $07,X * Si pas de donnée à lire dans le secteur ?
BNE EXIT * fin de la lecture
LDB $08,X * Si la fin du secteur
DECB * est atteinte,
BEQ READ_NEXT_SECTOR * charge un nouveau secteur
STB $08,X * Sauve le décompteur de données
LDB -$0B,X * Récupère l'offset sur la donnée courante
INC -$0B,X * Incrémente l'offset sur la donnée courante
ABX * Calcule le pointeur sur la donnée courante
LDB $0B,X * Lit la donnée courante
STB $6196 * On la met dans le registre adhoc
PULS B,X,PC * On sort (RTS)
READ_NEXT_SECTOR
LDB #$05 * Lit la donnée suivante (le secteur
JSR EXTRAMONITEUR * suivant, en fait) par l'ExtraMoniteur
LDB $6178 * Si pas de secteur chargé,
BNE EXIT * fin de la lecture
PULS B,X,PC * On sort (RTS)
EXIT
* NO DATA
LDB #$FF * END_OF_FILE Flag
STB $6178 * Register for END_OF_FILE
PULS B,X,PC
Donc tout fonctionne, je peux continuer :-) Merci pour ton aide, Sam.