Retourner à la liste des fichiers
* NRDOS.MO5 version 3.5
* FILES.ASM (Gestion de fichiers)
************************************************************************************************************
* FOPENR
* Ouvre un fichier en lecture
************************************************************************************************************
FOPENR SET *
LDA #OUVFL ; Consigne OUVFL
STA CSGNTA,PCR
LBSR XCNSGN ; Exécute la consigne
BNE ONEND
LDA CRXT0,PCR
STA FNHNDL,PCR ; Récupère le descripteur de fichier
LDA #FBFSIZ ; et initialise les variables de gestion du buffer
STA BUFPOS,PCR
LDD #0
STD FP242,PCR ; Position dans le fichier sur 24 bits
STA FP240,PCR
STA FRERR,PCR
LDA #$FF
STA FOFLG,PCR
ONEND RTS
FNHNDL FCB 0 ; Descripteur de fichier
FOFLG FCB 0 ; Flag de fichier ouvert
BUFPOS FCB FBFSIZ ; Position courante dans le buffer de lecture de fichier
FP242 FCB 0 ; Position courante dans le fichier (24 bits)
FP241 FCB 0
FP240 FCB 0
BREAD FCB 0 ; Nombre d'octets effectivement lus
FRERR FCB 0 ; Résultat de la lecture (erreur ou EOF)
FBUFFR RMB FBFSIZ,0 ; Buffer de lecture de fichier
************************************************************************************************************
* FCLOSE
* Ferme le fichier courant
************************************************************************************************************
FCLOSE SET *
TST FOFLG,PCR
BEQ FCEND
LDA #0
STA CSGDST,PCR
LDA #SYSFIC
STA CSGNTR,PCR
LDA FNHNDL
STA CSGNDK,PCR
LDA #FERFI ; Consigne FERFI
STA CSGNTA,PCR
LEAX CNSGN,PCR
JSR RESEAU ; Exécute la consigne
CLR FOFLG,PCR
LDA #$FF
STA FNHNDL,PCR
FCEND RTS
************************************************************************************************************
* FGETCH
* Lit un caractère depuis un fichier en ignorant les LF
************************************************************************************************************
FGETCH SET *
TST FOFLG,PCR
BNE FGREAD
RTS
FGREAD BSR FREAD ; Lit un octet brut
CMPB #LF ; Ignore les LF
BEQ FGREAD
RTS
************************************************************************************************************
* FREAD
* Remplit le buffer de lecture de fichier et renvoie un caractère
************************************************************************************************************
FREAD SET *
PSHS CC,A,DP,X,Y,U
FRNXTB LDA BUFPOS,PCR
BMI FRFILE ; Faut-il chercher la suite ?
LEAX FBUFFR,PCR ; Non, on lit un caractère dans le buffer
LDB A,X
INCA
STA BUFPOS,PCR
BMI FRFULL ; On est déjà au bout ?
CMPA BREAD,PCR
BCC FRSTOP ; On est déjà au bout ?
FRFULL CMPB #EOF
LBNE FREND
FRSTOP BSR FCLOSE
LDB #EOF
LBRA FREND
FRFILE LDB FRERR,PCR
BEQ FRFTCH ; Pas d'erreur ?
LDB #EOF
LBRA FREND
FRFTCH LDA #0 ; Central
STA CSGDST,PCR
LDA #SYSFIC
STA CSGNTR,PCR
LDA FNHNDL
STA CSGNDK,PCR
LDD FP242,PCR
STD CSGNFN,PCR
LDA FP240,PCR
STA CSGSZ0,PCR
LEAX FBUFFR,PCR
STX CSGNAD,PCR
LDD #FBFSIZ
STD CSGNSZ,PCR
CLRA
STA CSGNPG,PCR
LDA #LIRFI ; Consigne LIRFI
STA CSGNTA,PCR
LEAX CNSGN,PCR
JSR RESEAU ; Exécute la consigne et lit FBFSIZ (128) octets depuis le fichier
LDB CRERR,PCR
BEQ FRUPOS
CMPB #EFINF ; Code d'erreur de Fin de fichier
BEQ FRUPOS
LBSR FCLOSE ; Fermeture automatique
LDB #EOF
BRA FREND
FRUPOS STB FRERR,PCR ; Mise à jour des pointeurs
CLR BUFPOS,PCR
LDD CRXT0,PCR
STB BREAD,PCR
LDD FP241,PCR
ADDD CRXT0,PCR
STD FP241,PCR
LBCC FRNXTB
INC FP242,PCR
LBRA FRNXTB
FREND PULS PC,U,Y,X,DP,A,CC