Orion_ a développé "Petit FatFS pour SDMOTO" : http://forum.system-cfg.com/viewtopic.php?f=25&t=5679
Son programme affiche la liste des fichiers sur la carte et permet de sélectionner une image de disquette et de la monter.
Dans sa version MO6 le programme fonctionne, mais il reste encore quelques bugs à corriger.
En version TO, Orion_ a développé sans l'ordinateur, et sans bien le connaître. Le programme affiche un peu n'importe quoi et ne fonctionne pas. Et la mise au point semble abandonnée depuis plusieurs semaines.
J'ai décidé de démarrer un nouveau projet, en partant sur un développement nouveau, purement assembleur Thomson, sans utiliser Petit FatFS, pour accéder au répertoire de la carte SD, le lister, déterminer l'adresse physique des fichiers et sélectionner l'image de disquette à monter. Les premiers résultats sont encourageants et montrent la faisabilité : L'objectif est maintenant d'intégrer le code dans l'EPROM du contrôleur CS91-280. Il pourrait ainsi booter sur la disquette de démarrage en la recherchant dans le répertoire. Il suffit de convenir d'un nom particulier, par exemple BOOT.SD. Cette disquette serait montée automatiquement à la mise sous tension. La détermination de l'adresse avec bootaddress et l'inscription de l'adresse avec un éditeur hexadécimal dans le deuxième secteur de la carte seraient ainsi supprimées.
De plus, dans cette disquette BOOT.SD, il y aurait un programme de menu, pouvant être éventuellement lancé par AUTO.BAT. Il afficherait la liste des disquettes de la carte, pour permettre un changement de disquette très facile. Il ne serait même pas nécessaire de connaître les adresses physiques.
Il faudra du temps pour mettre tout ça au point, mais j'ai bon espoir...
Code : Tout sélectionner
/**************************************************\
* S D D I R *
* (c) 2014 - Daniel Coulom *
* http://dcmoto.free.fr/ *
* http://forum.system-cfg.com/ *
*--------------------------------------------------*
* Ce code est distribue gratuitement dans l'espoir *
* qu'il sera utile, mais sans aucune garantie et *
* sans engager la responsabilité de l'auteur. *
* Vous pouvez l' utiliser, le modifier et le *
* diffuser librement, en conservant cette licence *
* et les références de l'auteur dans toutes les *
* copies. L'exploitation commerciale est interdite.*
\**************************************************/
* Ce programme fournit les fonctions nécessaires
* pour lister la directory de la carte SD
* - lecture du premier secteur de la directory
* - lecture du secteur suivant de la directory
* Le buffer de lecture d'un secteur est en $9C00
/**************************************************\
* Version 2014.11.29 *
\**************************************************/
* Historique
* 2014.11.29 premiere version operationnelle
ORG $9E00
BRA SUITE lecture secteur suivant directory
BRA MASTER lecture premier secteur directory
*------------------------------------------------------
* Initialisations en fonction de l'ordinateur
*------------------------------------------------------
INIT
ORCC #$50 desactive les interruptions
LDA #$E7 valeur initialisation DP pour TO
LDB >$6092 type de carte
STB SDHC type de carte
LDX #$1F40 adresse pour test RAM ou ROM
LDB ,X lecture adresse X
COM ,X tente de modifier adresse X
CMPB ,X test modification adresse X
BEQ INIT1 pas de difference -> TO
COM ,X retablissement adresse X
LDA #$A7 valeur initialisation DP pour MO
LDB >$2092 type de carte
STB SDHC type de carte
INIT1
TFR A,DP initialisation DP
*------------------------------------------------------
* CONFIGURATION PIA 6821 POUR ACCES A LA CARTE SD
*------------------------------------------------------
LDA <$CE lecture registre de controle A
ANDA #$FB raz bit 2
STA <$CE selection DDRA
LDB #$60 set bits 5 et 6
STB <$CC bits MOSI et CLOCK en sortie
ORA #$04 set b2
STA <$CE selection PA
LDB #$40 set bit 6
STB <$CC keep the DIN high
RTS
*------------------------------------------------------
* LECTURE DU SECTEUR SUIVANT DE LA DIRECTORY
*------------------------------------------------------
SUITE
PSHS U,Y,X,DP,B,A,CC sauvegarde registres Basic
BSR INIT
TST SDHC type de carte 0=SD 1=SDHC
BNE SUITE1 carte SDHC
LDD CMD17+2 adresse secteur
ADDD #$02 secteur suivant
STD CMD17+2 stockage adresse pour CMD17
BRA SUITE2
SUITE1
LDD CMD17+3 LBA secteur
ADDD #$01 LBA secteur suivant
STD CMD17+3 stockage LBA pour CMD17
SUITE2
BSR LOAD Lecture du secteur
BRA RETOUR Retour au Basic
*------------------------------------------------------
* LECTURE DU MBR (MASTER BOOT RECORD)
*------------------------------------------------------
MASTER
PSHS U,Y,X,DP,B,A,CC sauvegarde registres Basic
BSR INIT
BSR LOAD Lecture du secteur en 00000000
LDD #$55AA Signature secteur
CMPD $9DFE Test signature
BNE ERREUR Signature incorrecte
LSL $9CBE Boot indicator
BNE BOOT1 Pas de MBR, donc boot record
LDA $9CC7 LBA partition pds fort ex: $xx
LDB $9CC6 LBA pertition pds faible ex: $xx
STD CMD17+3 stockage pour la commande 17
*------------------------------------------------------
* LECTURE DU BOOT SECTOR
*------------------------------------------------------
BSR LOAD Lecture du secteur
LDD #$55AA Signature secteur
CMPD $9DFE Test signature
BNE ERREUR Signature incorrecte
BOOT1
LDA $9C0F Blocs reserves pds fort ex: $00
LDB $9C0E Blocs reserves pds faible ex: $04
STD CMD17+3 stockage pour la commande 17
LDA $9C17 Fat size pds fort ex: $00
LDB $9C16 Fat size pds faible ex: $F2
DEC $9C10 Nombre de FAT ex: $02
BEQ BOOT2 Une seule FAT
ASLB FAT size multiplie par 2 ex: $E4
ROLA FAT size multiplie par 2 ex: $01
BOOT2
ADDD CMD17+3 ajout du nombre de blocs reserves
TST SDHC type de carte 0=SD 1=SDHC
BNE BOOT3 carte SDHC
ASLB LBA multiplie par 2
ROLA LBA multiplie par 2
STD CMD17+2 LBA multiplie par $100
CLRB
STB CMD17+4 octet de poids faible a zero
BRA DIR
BOOT3
STD CMD17+3 stockage pour la commande 17
*------------------------------------------------------
* LECTURE DU PREMIER SECTEUR DE LA DIRECTORY
*------------------------------------------------------
DIR
BSR LOAD Lecture du secteur
BRA RETOUR Retour au Basic
*------------------------------------------------------
* ERREUR DE STRUCTURE DE LA CARTE
*------------------------------------------------------
ERREUR
LDY MESSAGE Adresse du message d'erreur
LDX #$9C00 Adresse du secteur charge
ERR1
LDA ,Y+ Caractere du message
STA ,X+ Stockage dans le buffer
BNE ERR1 Caractere suivant
*------------------------------------------------------
* RETOUR AU BASIC
*------------------------------------------------------
RETOUR
PULS CC,A,B,DP,X,Y,U,PC
*------------------------------------------------------
* LECTURE D'UN BLOC EN $9C00
*------------------------------------------------------
LOAD
LEAU CMD17,PCR adresse commande CMD17
BSR EXCMD execution commande
LOAD1
BSR RBYTE lecture d'un octet
CMPA #$FE comparaison avec $FE
BNE LOAD1 attente debut secteur
LDX #$9C00 adresse de chargement
LOAD2
BSR RBYTE lecture d'un octet
STA ,X+ stockage dans le buffer
CMPX #$9E00 test fin de chargement
BNE LOAD2 nouvelle lecture
BSR RBYTE lecture CRC1
BSR RBYTE lecture CRC2
RTS
*------------------------------------------------------
* ATTENTE CARTE PRETE PUIS EXECUTION D'UNE COMMANDE
*------------------------------------------------------
EXCMD
BSR RBYTE lecture d'un octet
INCA ajout de 1 ($FF --> $00)
BNE EXCMD attente carte prete
*------------------------------------------------------
* EXECUTION D'UNE COMMANDE POUR LA CARTE SD
* Le registre B n'est pas preserve.
* le code retour est dans le registre A
*------------------------------------------------------
EXCMD0
LDX #$0006 nombre d'octets de commande
EXCMD2
LDA ,U+ chargement octet de commande
BSR WBYTE ecriture de l'octet
LEAX -1,X decrementation compteur
BNE EXCMD2 il reste des octets a envoyer
EXCMD3
BSR ALIGN lecture d'un octet aligne
CMPA ,U+ test code de retour
BEQ EXCMD4 code bon
COMA carry set en erreur
RTS retour
EXCMD4
CLRA clear carry
RTS retour
*------------------------------------------------------
* LECTURE D'UN OCTET AVEC ALIGNEMENT SUR BIT 0 (SDMOTO)
* Le registre B n'est pas préservé
* Valeur de l'octet dans le registre A en sortie
* Optimisation transfert b7 avec CMPB par Daniel
* Pas de timeout pour optimisation taille du code
*------------------------------------------------------
ALIGN
LDB #$7F Valeur pour test bit 7
STB <$CC clock high, di high
CMPB <$CC PA b7 (bit lu) -> carry
LDB #$5F clear bit 5
STB <$CC clock low, di high
BCS ALIGN si bit 1, continuer a lire
LDA #$FC sinon stocker bit 0
BRA RBYTE1 lire les 7 autres bits
*------------------------------------------------------
* LECTURE D'UN OCTET (SDMOTO)
* 2 + 8 * 21 + 5 = 175 cycles
* Le registre B n'est pas préservé
* Valeur de l'octet dans le registre A en sortie
* Optimisation du compteur de boucle par Samuel
* Optimisation transfert b7 avec CMPB par Daniel
*------------------------------------------------------
RBYTE
LDA #$FE b0 marqueur fin de boucle (2)
RBYTE1
LDB #$7F Valeur pour test bit 7 (2)
STB <$CC clock high, di high (4)
CMPB <$CC PA b7 (bit lu) -> carry (4)
LDB #$5F clear bit 5 (2)
STB <$CC clock low, di high (4)
ROLA C (bit lu) -> b0 reg A (2)
BCS RBYTE1 suite de la boucle (3)
RTS retour (octet dans A) (5)
*------------------------------------------------------
* ECRITURE D'UN OCTET POUR SDMOTO
* Le registre B n'est pas préservé
* Valeur de l'octet dans le registre A en entree
*------------------------------------------------------
WBYTE
LDB #$08 compteur de boucles = 8
PSHS B empilage compteur de boucles
WBYTE1
ASLA b7 reg A -> carry
RORB carry -> b7 reg B
LSRB b7 reg B -> b6 reg B
STB <$CC envoi bit vers DI
ORB #$20 set bit 5
STB <$CC clock high
ANDB #$DF clear bit 5
STB <$CC clock low
DEC ,S decremente compteur boucles
BNE WBYTE1 nouvelle boucle
ORB #$40 set bit 6
STB <$CC keep the DIN high
PULS B,PC retour
*------------------------------------------------------
* TYPE DE CARTE 0=SD 1=SDHC
*------------------------------------------------------
SDHC
FCB $00 type de carte determine par INIT
*------------------------------------------------------
* FONCTIONS D'ACCES A LA CARTE SD
*------------------------------------------------------
CMD17
FCB $51 read single block
FDB $0000 adresse bloc (poids fort)
FDB $0000 adresse bloc (poids faible)
FCB $00 checksum non testee
FCB $00 code retour attendu
*------------------------------------------------------
* MESSAGE D'ERREUR
*------------------------------------------------------
MESSAGE
FCC "Structure inconnue"
FCB $00
END