Au départ j'ai recopié le contrôleur CD90-640, en passant le nombre de pistes de 40 à 80 et en supprimant la simple densité.
Dernièrement j'ai fait une modification pour inverser les deux moitiés de FAT en RAM, et j'ai simplifié la routine d'allocation d'un bloc.
En comparant avec les routines du TO8 on devrait trouver des différences et peut-être la cause du plantage.
C'est probablement subtil, car "La Marque Jaune" se charge correctement depuis l'inversion de la FAT.
Les Dieux de la Glisse doivent avoir une autre particularité.
Code : Tout sélectionner
;------------------------------------------------------
; SCRATCH DOS
;------------------------------------------------------
SCRDOS
FCC "SCRATCH "
FCC "DOS"
;------------------------------------------------------
; FINTR = cloture d'ecriture
;------------------------------------------------------
FINTR
LDB <DK_MOD ; code operation logique
CMPB #$02
BEQ ECRFA ; ecriture de la FAT
DEC <DK_MOD ; code operation logique
BSR RECFI ; ouverture fichier
BCS ECRFA9 ; erreur d'ouverture
TSTB
BEQ FINTR1
LBSR RECUP ; effacement d'un fichier
BCS ECRFA9 ; erreur d'effacement
FINTR1
INC <DK_MOD ; code operation logique
BSR RECFI ; ouverture d'un fichier
BCS ECRFA9 ; erreur d'ouverture
LDB #$0a ; boucle pour 11 octets
LDX <DK_NAM ; pointeur sur nom+ext fichier
FINTR2
LDA B,X ; octet du nom+extension
STA B,Y ; copie dans le repertoire
DECB ; decremente indice
BGE FINTR2 ; octet suivant
BSR ECRSE ; ecriture secteur
BCS ECRFA9 ; erreur d'ecriture
;------------------------------------------------------
; Ecriture de la FAT
;------------------------------------------------------
ECRFA
LDX <DK_FAT ; adresse de la FAT
BSR INVFA ; inversion de la FAT
LDA #$02 ; n° secteur de la FAT (sect 2)
STA <DK_SEC ; stocke le numero de secteur
LDB #$14 ; piste de la FAT (piste 20)
CLRA ; poids fort du numero de piste
STD <DK_TRK ; stocke le numero de piste
STX <DK_BUF ; adresse du buffer secteur
BSR ECRSE ; ecriture secteur
BCS ECRFA9 ; erreur ecriture
CLR <DK_MOD ; indicateur cloture fichier
ECRFA9
RTS
;------------------------------------------------------
; LECFA = Chargement de la FAT
;------------------------------------------------------
LECFA
LDX <DK_FAT ; adresse de la FAT
STX <DK_BUF ; adresse du buffer secteur
LDA #$02 ; numero secteur a lire
BSR LSEC20 ; lecture secteur piste 20
LEAX 128,X ; ajout de $80
STX <DK_FAT ; stocker le nouveau pointeur
;------------------------------------------------------
; INVFA = Inversion des deux moities de la FAT
; En entree X pointe au milieu du buffer de la FAT
; En sortie X pointe sur le buffer de la FAT
;------------------------------------------------------
INVFA
LDY #$80 ; nombre de boucles
INVFA1
LDA -128,X ; octet premiere moitie
LDB ,X ; octet deuxieme moitie
STB -128,X ; 2ere moitie dans 1ere
STA ,X+ ; 1ere moitie dans 2eme
LEAY -1,Y ; decrementation compteur
BNE INVFA1 ; nouvelle boucle
LEAX -$0100,X ; X pointe sur le buffer de la FAT
RTS ; retour
;------------------------------------------------------
; Sortie en erreur
;------------------------------------------------------
RETERR
STA <DK_ERR ; code erreur
COMA ; set carry
COMA ; restaure valeur de A
RTS
;------------------------------------------------------
; Chargement 1er secteur catalogue
;------------------------------------------------------
LDIR0
LDA #$03 ; numero de secteur catalogue
LDX <DK_CAT ; pointeur sur buffer
STX <DK_BUF ; adresse buffer
;------------------------------------------------------
; Chargement secteur piste 20
;------------------------------------------------------
LSEC20
STA <DK_SEC ; numero de secteur
LDB #$14 ; piste 20
CLRA ; zero dans poids fort
STD <DK_TRK ; numero de piste
LDA #$02 ; code operation lecture secteur
BRA SECTIO ; operation sur secteur
;------------------------------------------------------
; ECRSE = Ecriture d'un secteur
;------------------------------------------------------
ECRSE
LDA #$08 ; code operation ecriture secteur
;------------------------------------------------------
; Operation sur secteur (code operation dans A)
;------------------------------------------------------
SECTIO
STA <DK_OPC ; code operation
LDY <DK_CAT ; pointeur sur buffer
LBSR OPTABL ; execution fonction standard
LDA #$03 ; A=$03
RTS
;------------------------------------------------------
; RECFI = Ouverture d'un fichier
;------------------------------------------------------
RECFI
BSR LDIR0 ; charge 1er secteur catalogue
RECFI1
BCS RETERR ; sort si erreur
LDX #$0008 ; compteur de noms dans X
LDY <DK_CAT ; pointeur sur buffer
RECFI2
LDU <DK_NAM ; pointeur sur nom de fichier
LDB <DK_MOD ; code operation logique
CMPB #$03
BNE RECFI3
LEAU SCRDOS,PCR ; adresse du nom de fichier
RECFI3
CLRB
RECFI4
CMPB #$0b
BCC RECFI8
LDA B,Y ; octet de la FAT
CMPA #$ff
BEQ RECFI7
INCB
CMPA ,U+
BEQ RECFI4
LEAY $20,Y ; adresse fichier suivant
LEAX -$01,X ; decrementation indice
BNE RECFI2 ; lecture entree suivante
INC <DK_SEC ; secteur suivant
LDA <DK_SEC ; A = n° secteur
CMPA #$10 ; comparaison a 16
BHI RECFI7 ; superieur a 16
LBSR OPTABL ; lecture secteur
LDA #$03 ; erreur I/O
BRA RECFI1 ; secteur suivant
RECFI7
CLRB ; raz n° secteur
BRA RECFI9 ; sortie
RECFI8
LDB $0b,Y ; type de fichier (catalogue)
CMPB <DK_TYP ; type de fichier
BNE RECFI7
LDB $0c,Y ; flag de fichier (catalogue)
CMPB <DK_FLG ; flag de fichier
BNE RECFI7
LDB <DK_SEC ; numero de secteur
LDA $0d,Y ; numero de bloc (catalogue)
STA <DK_BLK ; numero de bloc
CLR <DK_SCT ; numero de secteur
LDX $0e,Y ; taille dernier secteur (catalogue)
STX <DK_TDS ; nbre d'octets du dernier secteur du fichier
STY <DK_PSB ; numero du premier secteur du bloc
RECFI9
STB <DK_IFA ; numero de bloc alloue
CLRA
RTS
;------------------------------------------------------
; ALLOD = allocation d'un fichier
;------------------------------------------------------
ALLOD
LDY <DK_FAT ; adresse de la FAT
; BSR ALLOB4 ; test place libre version CD90-640
BSR ALLOB ; test place libre version carte SD
ALLOD1
BCS RECFI1 ; erreur plus de place
STB <DK_BLK ; numero de bloc
LBSR LDIR0 ; charge debut directory
ALLOD2
BCS ALLOD1 ; sortie en erreur
LDY <DK_CAT ; pointeur sur buffer
LDX #$0008 ; compteur de noms dans X
ALLOD3
LDB ,Y ; premier octet du nom
BEQ ALLOD6 ; $00=fichier efface --> OK
LDA #$05
CMPB #$ff ; test fin de repertoire
BEQ ALLOD6 ; $FF=fin de repertoire --> OK
LEAY $20,Y ; entree suivante dans le repertoire
LEAX -$01,X ; decrementation compteur
BNE ALLOD3 ; traitement entree suivante
INC <DK_SEC ; secteur suivant du repertoire
LDA <DK_SEC ; A=numero de secteur
CMPA #$10 ; test 16
BHI ALLOD4 ; plus de place dans le repertoire
LBSR OPTABL ; charge le secteur suivant
LDA #$03 ; code erreur 3
BRA ALLOD2 ; sortie en erreur
ALLOD4
LDA #$05 ; code "disque plein"
ALLOD5
BRA ALLOD1 ; sort avec erreur
ALLOD6
LDX <DK_NAM ; pointeur sur nom de fichier
LDB <DK_MOD ; code operation logique
CMPB #$03
BNE ALLOD7
LEAX SCRDOS,PCR ; adresse nom de fichier
ALLOD7
LDB #$0a ; pour 11 octets (nom+extension)
ALLOD8
LDA B,X ; recopie le nom et l'extension
STA B,Y ; dans le catalogue
DECB ; decrementation compteur
BGE ALLOD8 ; caractere suivant
LDA <DK_TYP ; type de fichier
STA $0b,Y ; stocke en 12e position
LDA <DK_FLG ; flag de fichier
LDB <DK_BLK ; numero de bloc
STD $0c,Y ; stocke en 13e position
LBRA ECRSE ; ecriture du repertoire
;------------------------------------------------------
; ALLOB = allocation d'un bloc (version carte SD)
; Remarque : la FAT commence par un octet $00
; Il y a un décalage de 1 entre le numero de bloc
; et son indice dans la FAT (bloc 0 = indice 1)
;------------------------------------------------------
ALLOB
LDD #$FF00 ; A=255 B=0
ALLOB1
INCB ; bloc suivant
CMPA B,Y ; bloc B libre ?
BEQ ALLOB2 ; oui ==> trouvé
CMPB #$A0 ; test dernier bloc
BNE ALLOB1 ; bloc suivant
LDA #$05 ; erreur pas de d'entrée trouvées
LBRA RETERR ; sortie en erreur
ALLOB2
CLR B,Y ; on marque le bloc comme occupé
DECB ; mise a jour du
STB <DK_IFA ; numero de bloc alloue
ALLOB9
CLRA
RTS
;------------------------------------------------------
; RECUP = effacement d'un fichier
;------------------------------------------------------
RECUP
LDA $0D,Y ; numero du 1er bloc a liberer
STA <DK_BLK ; numero de bloc
CLR ,Y ; raz 1er caractere du nom de fichier
LBSR ECRSE ; ecriture du repertoire
BCS ALLOD5 ; erreur d'ecriture
LDY <DK_FAT ; adresse de la FAT
LDB <DK_BLK ; numero de bloc
RECUP1
INCB ; bloc+1
LDA B,Y ; A = octet de la FAT
CLR B,Y ; octet FAT = $00
DEC B,Y ; octet FAT = $FF (bloc libre)
TFR A,B ; B = ancien octet de la FAT
CMPA #$c0 ; bloc de fin du fichier ?
BCS RECUP1 ; sinon bloc suivant
BRA ALLOB9 ; retour
;------------------------------------------------------
; MAJCL = Mise a jour cluster
;------------------------------------------------------
MAJCL
LDB <DK_BLK ; numero du bloc
CLRA ; A=0
LSRB ; divise par 2 (carry = b0)
STD <DK_PBC ; numero piste (carry inchange)
INCA ; A=1 (carry inchange)
STA <DK_SCT ; secteur=1 (carry inchange)
BCC MAJCL9 ; branchement si n° de bloc pair
LDA #$09 ; secteur=9 pour les blocs impairs
MAJCL9
STA <DK_PSB ; numero du premier secteur du bloc
RTS