La démo Elvis Live, modifiée pour forcer l'octet densité à zéro, fonctionne.
Code : Tout sélectionner
;------------------------------------------------------
; Ecriture de la FAT
;------------------------------------------------------
ECRFA
LDX <DK_FAT ; adresse de la FAT
BSR INVFA ; inversion de la FAT
LDA #$02
STA <DK_SEC ; secteur 2
LDB #$14
CLRA
STD <DK_TRK ; piste 20
STX <DK_BUF ; adresse du buffer secteur
BSR ECRSE ; ecriture secteur
BLO FINTR9 ; erreur ecriture
CLR <DKWF0 ; indicateur cloture fichier
FINTR9
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
Ce n'est pas encore fini (ni gagné), car de nombreuses routines du scratch dos lisent et modifie la FAT. Il faut les contrôler une à une pour s'assurer qu'elles fonctionnent encore avec les deux moitiés de la FAT inversées. J'ai bon espoir, car l'accès semble utiliser des adresses du style B,Y ou B,X, il n'y a peut-être rien à changer. Sauf que le nombre de blocs semble limité à 80, comme avec les disquettes 40 pistes, alors qu'il devrait être limité à 160 pour les disquettes à 80 pistes. C'est un autre bug que je n'avais pas vu, preuve que le scratch dos est rarement utilisé. Peut-être quelques fois en lecture et jamais en écriture, sinon ces anomalies auraient été découvertes plus tôt.
Exemples :
Code : Tout sélectionner
;------------------------------------------------------
; ALLOB = allocation d'un bloc
;------------------------------------------------------
ALLOB
LDB <DK_BLK ; numero de bloc
CMPB #$50
BHI ALLOB3
ALLOB1
TSTB
ALLOB2
BEQ ALLOB4
LDA B,Y
CMPA #$ff
BEQ ALLOB8
DECB
CMPB #$50
BLS ALLOB1
ALLOB3
ADDB #$02
CMPB #$A1
BRA ALLOB2
ALLOB4
LDB #$50
ALLOB5
LDA #$05
CMPB #$A0
LBHI RETERR
LDA B,Y
CMPA #$ff
BEQ ALLOB8
PSHS B
SUBB #$50
NEGB
ADDB #$50
LDA B,Y
CMPA #$ff
BEQ ALLOB6
PULS B
INCB
BRA ALLOB5
ALLOB6
LEAS $01,S
ALLOB8
CLR B,Y
DECB
STB <DKWF9 ; numero de bloc alloue
ALLOB9
CLRA
RTS
Code : Tout sélectionner
;------------------------------------------------------
; RECUP = liberation d'un bloc
;------------------------------------------------------
RECUP
LDA $0d,Y
STA <DK_BLK ; numero de bloc
CLR ,Y
LBSR ECRSE
BLO ALLOD5
LDY <DK_FAT ; adresse de la FAT
LDB <DK_BLK ; numero de bloc
RECUP1
INCB
LDA B,Y
CLR B,Y
DEC B,Y
TFR A,B
CMPA #$c0
BLO RECUP1
BRA ALLOB9