SDMOTO - Memento pour le développement de programmes de démonstration

Auteur : Daniel Coulom - Site internet : Emulateur DCMOTO - Dernière mise à jour le 28 décembre 2014

sdmoto

previous Retour à la page Bricolage

Généralités


Spécifications simplifiées de la carte SD. Cliquez sur l'image pour charger le document au format DjVu :

sd specifications

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.


Initialisation de la carte SD


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).


Lancement d'une commande pour la carte SD


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.


Format de l'adresse du bloc pour les commandes de lecture et d'écriture


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

Lecture des données retournées par la commande


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.


Utilisation de l'émulateur dcmoto


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.


Complément d'information


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 : system-cfg

previous Retour à la page Bricolage