Spécifications simplifiées de la carte SD. Cliquez sur l'image pour charger le document au format DjVu :
Ce document contient, en particulier, la description de toutes les commandes acceptées par la carte SD.
Notez que le projet SDMOTO initialise la carte en mode SPI, seules les commandes prévues pour ce mode sont utilisables.
En cas d'utilisation du contrôleur CS91-280 la carte est toujours initialisée,
sauf si elle a été insérée à chaud après le démarrage de l'ordinateur.
Le plus souvent, une nouvelle initialisation n'est pas nécessaire.
L'octet $6098 (TO) ou $2098 (MO) contient $55 si la carte a été initialisée.
Sinon il faut exécuter le programme SDINIT : sdinit
/**************************************************\ * S D I N I T * * (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 fait partie du projet SDMOTO * Il initialise la carte SD ou SDHC pour les * ordinateurs MO ou TO * * Il n'y a pas de traitement d'erreur pour garder * le programme aussi court que possible. Quand la * carte ne peut pas etre initialisee l'ordinateur * reste bloque. * * Utilisation du 2eme port joystick * Port A ($E7CC) * PA5 en sortie --> SD Clock SCK DB9 pin 2 * PA6 en sortie --> SD Data IN MOSI DB9 pin 3 * PA7 en entree <-- SD Data OUT MISO DB9 pin 4 *
Le programme SDINIT met la valeur $55 dans l'octet $6098 (TO) ou $2098 (MO).
Il détermine le type de carte (0=SD, 1=SDHC) et le stocke en $6092 (TO) ou $2092 (MO).
Si l'initialisation est réalisée par le contrôleur CS91-280, ces deux octets sont mis à jour
de la même manière. De plus, l'adresse du premier bloc de l'image de disquette montée
automatiquement au démarrage est stockée en $608E-$6091 (TO) ou $208E-$2091 (MO).
La commande est définie par un bloc de données contenant le code de la commande (1 octet), les paramètres (4 octets), la checksum (1 octet), le code retour attendu (1 octet). En dehors des deux premières commandes d'initialisation de la carte, la checksum n'est pas testée et la valeur donnée est indifférente. Ci-dessous quelques exemples de commandes :
*------------------------------------------------------ * COMMANDES CARTE SD *------------------------------------------------------ CMD0 FCB $40 go idle state FDB $0000 FDB $0000 FCB $95 checksum obligatoire FCB $01 code retour attendu *------------------------------------------------------ CMD8 FCB $48 send interface condition FDB $0000 FDB $01AA FCB $87 checksum obligatoire FCB $00 code retour attendu *------------------------------------------------------ CMD55 FCB $77 application command FDB $0000 FDB $0000 FCB $FF checksum non testee FCB $00 code retour attendu *------------------------------------------------------ AC41 FCB $69 activate card initialization FDB $4000 FDB $0000 FCB $FF checksum non testee FCB $00 code retour attendu *------------------------------------------------------ CMD58 FCB $7A read OCR FDB $0000 FDB $0000 FCB $FF checksum non testee FCB $00 code retour attendu *------------------------------------------------------
Pour lancer la commande, utiliser la procédure EXCMD du contrôleur CS91-280.
- Initialiser le registre DP à $A7 pour les ordinateurs MO et $E7 pour les ordinateurs TO.
- Initialiser le PIA 6821 des manettes avec les bits 5 et 6 du port A en sortie et tous les autres en entrée.
- Initialiser le bloc de données de la commande.
- Initialiser le registre U avec l'adresse du bloc de données.
- Appeler EXCMD en $E028 (TO) ou $A028 (MO).
Au retour, le registre A et le bit CARRY sont à zéro si la commande s'est exécutée
normalement, et différents de zéro si une erreur a été détectée.
L'adresse à fournir pour les commandes de lecture et d'écriture d'un bloc ou de blocs multiples est donnée sur quatre octets, avec l'octet de poids fort en tête (MSB). Elle est différente selon le type de carte :
- Numéro de l'octet pour les SD
- Numéro du bloc pour les SDHC
Bloc est strictement synonyme de secteur, la taille du bloc est fixe (512 octets), les blocs et les octets sont numérotés à partir de zéro.
Dans tous les programmes, il faut obligatoirement tester le type de carte (déterminé par la procédure d'initialisation) pour calculer l'adresse. Par exemple, pour passer au bloc suivant, il faut ajouter 1 pour une carte SDHC et $200 pour une SD.
Exemple de lancement de la commande CMD18 :
*------------------------------------------------------ * Initialisation PIA pour SDMOTO *------------------------------------------------------ LDA #$E7 valeur d'initialisation DP TFR A,DP initialisation DP 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 *------------------------------------------------------ * Lancement de la commande CMD18 *------------------------------------------------------ * Calculer ici l'adresse physique des donnees * en fonction de SD_LB0 (adresse physique de * l'image de disquette actuellement montee) * et de SD_TYP (type de carte SD ou SDHC) * Mettre l'adresse en CMD18+1 sur quatre octets LDU #CMD18 adresse commande CMD18 JSR $E028 EXCMD = execution commande ...... ...... *------------------------------------------------------ * FONCTIONS D'ACCES A LA CARTE SD *------------------------------------------------------ CMD18 FCB $52 read multiple block FDB $0000 adresse bloc (poids fort) FDB $0000 adresse bloc (poids faible) FCB $00 checksum non testee FCB $00 code retour attendu END
Pour lire les données retournées par la commande, utiliser la fonction RBYTE de lecture d'un octet. L'exemple ci-dessous lit les 16 premiers blocs de données retournés par la commande CMD18 et les transfère en mémoire vidéo :
*------------------------------------------------------ * Lecture en mémoire vidéo *------------------------------------------------------ DISPLAY LDU #$4000 adresse memoire video LDY #$0010 nombre de blocs a lire DISPL1 LBSR RBYTE lecture d'un octet CMPA #$FE test debut de bloc BNE DISPL1 attente debut de bloc LDX #$0200 nombre d'octets a lire DISPL2 LBSR RBYTE lecture d'un octet STA ,U+ affichage LEAX -1,X decrementation compteur BNE DISPL2 lecture octet suivant LBSR RBYTE lecture CRC1 LBSR RBYTE lecture CRC2 LEAY -1,Y decrementation compteur BNE DISPL1 lecture bloc suivant BRA SUITE suite du programme... *------------------------------------------------------ * LECTURE D'UN OCTET (SDMOTO) = 28 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) END
Il est indispensable de se référer aux spécifications officielles pour savoir traiter les informations retournées. Par exemple, pour la commande CMD18, il faut lire jusqu'à réception de l'octet $FE de début de bloc, puis lire les 512 octets du bloc, puis les deux octets de CRC, et recommencer la même procédure pour le bloc suivant.
Pour émuler le module SDMOTO avec le contrôleur CS91-280, utilisez de préférence une version de
dcmoto de décembre 2014 ou plus récente. Dans les options cochez le contrôleur CS91-280. Dans la
boîte de dialogue Supports amovibles, cochez la case Interface SDMOTO et chargez un fichier .sd
L'émulation de la carte SD dans dcmoto est très simplifiée. En fait on n'accède pas à une image
de carte SD, mais seulement à un fichier .sd de la carte. Ce fichier est chargé en mémoire.
Il est mis à jour sur le support d'origine s'il est déchargé et à la fermeture de l'émulateur.
Pour simuler la carte SD, dcmoto ajoute automatiquement deux secteurs avant le fichier .sd.
Le premier simule le secteur de boot de la carte, le deuxième simule un répertoire et contient
une entrée BOOT.SD. L'adresse physique du fichier .sd est toujours $00000400 et le type de carte
est toujours 0 (SD).
Seules les commandes utilisées pour l'initialisation et pour la lecture/écriture de blocs
sont émulées, les autres commandes peuvent produire des résultats imprévisibles.
Les informations contenues dans ce document sont données dans l'espoir d'être utiles,
mais sans aucune garantie d'aucune sorte. Si vous constatez des imprécisions ou des erreurs,
faites en part à l'auteur pour qu'il puisse apporter les améliorations nécessaires.
Pour des explications supplémentaires ou une aide au développement de nouvelles applications,
utilisez le forum system-cfg :
© 2014 - Daniel Coulom