[Thomson] Lecture du répertoire d'une carte SD

Cette catégorie traite de développements récents pour nos vieilles machines, applications, jeux ou démos... Amis programmeurs, c'est ici que vous pourrez enfin devenir célèbres!

Modérateurs : Carl, Papy.G, fneck

Daniel
Messages : 10827
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

[Thomson] Lecture du répertoire d'une carte SD

Message par Daniel » 30 nov. 2014 13:12

La simulation de disquette sur carte SD avec le contrôleur CS81-280 nécessite de connaître l'adresse physique des images de disquettes. Le programme bootaddress.exe permet de la déterminer dans Windows, mais il serait encore plus pratique de pouvoir la retrouver avec l'ordinateur Thomson.

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é :
sddir_01.jpg
sddir_01.jpg (28.47 Kio) Vu 1686 fois
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
Daniel
L'obstacle augmente mon ardeur.

Avatar du membre
6502man
Messages : 9118
Enregistré le : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [Thomson] Lecture du répertoire d'une carte SD

Message par 6502man » 30 nov. 2014 22:36

C'est une excellente idée Daniel :D

Ca devrait permettre de rentre l'interface pratiquement PLUG'N PLAY :wink:
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.

petitjd
Messages : 1817
Enregistré le : 23 oct. 2007 11:50

Re: [Thomson] Lecture du répertoire d'une carte SD

Message par petitjd » 30 nov. 2014 22:41

C'est bon ca!
PetitJD
Tortue Jeulin: www.tortue-jeulin.com
Nanoreseau: www.nanoreseau.net
Proteus III: www.proteus-international.fr

__sam__
Messages : 4174
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson] Lecture du répertoire d'une carte SD

Message par __sam__ » 30 nov. 2014 23:02

Heureusement que tu as un programmateur d'eeprom. Ca va être quelle version à présent ? la 3eme, la 4e ?

En tout cas, c'est une super chouette idée, et je suis content que l'eeprom contienne suffisamment de place pour avoir cet utilitaire en plus des routines disk. Est-ce que tu prévois un équivalent sur D7/K7 pour ceux qui ont une ancienne version de la rom?
Samuel.
A500 Vampire V2+, A1200(030@50mhz/fpu/64mb/cf 8go),
GVP530 (MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8. New Teo 1.8.4 8)

Daniel
Messages : 10827
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Lecture du répertoire d'une carte SD

Message par Daniel » 01 déc. 2014 12:04

Changer le contenu de l'EPROM n'est pas un problème, au pire si tu n'as pas le programmateur ça coûte les frais de port aller-retour.

J'espère pouvoir faire tenir dans l'EPROM le code de recherche du fichier BOOT.SD et le montage automatique de cette image de disquette. En FAT16 ça doit le faire, en FAT32 c'est un peu plus compliqué. J'ai un peu de marge : pour gagner du temps la boucle de lecture d'un octet est "déroulée". En l'enroulant à nouveau on gagne de la place avec une dégradation minime des temps de lecture.

Le menu d'affichage du répertoire et le choix d'une image de disquette à monter ne seront pas dans le contrôleur, c'est sûr. Ce n'est d'ailleurs pas nécessaire, car le contrôleur charge automatiquement la disquette BOOT, il suffit de mettre le menu sur cette disquette et de l'appeler éventuellement par l'AUTO.BAT.

Mais ne nous excitons pas trop maintenant, c'est un peu tôt au point où j'en suis : tout reste à faire :wink:
Daniel
L'obstacle augmente mon ardeur.

__sam__
Messages : 4174
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson] Lecture du répertoire d'une carte SD

Message par __sam__ » 01 déc. 2014 12:56

Daniel a écrit :Mais ne nous excitons pas trop maintenant, c'est un peu tôt au point où j'en suis : tout reste à faire :wink:
Oui.. d'ailleurs perso je dois attendre autour du 24/12 pour recevoir de quoi monter mon interface SDMoto :roll: (noel noel!!!)
Le hic est que je ne serais peut-être pas chez moi à ce moment là, et donc ce sera à la rentrée que je pourrais jouer les jedi au sabr^w fer à souder :wink: Donc patience pour ma part... A la limite si je devais t'envoyer l'eprom, et si je voyais que je n'y arrivais pas avec la soudure, et s'il t'en restait (ca fait plein de "si", mais autour de noel il y a souvent "sisi" à la TV :P ), je te prendrais bien aussi l'une des jolies interfaces proto que tu as faites :) Mais c'est pas pour tout de suite tout ca non plus...
Samuel.
A500 Vampire V2+, A1200(030@50mhz/fpu/64mb/cf 8go),
GVP530 (MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8. New Teo 1.8.4 8)

Daniel
Messages : 10827
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Lecture du répertoire d'une carte SD

Message par Daniel » 01 déc. 2014 13:07

:idea: Il y a aussi le Père Noël. Si tu m'envoies ton adresse par mail (pas par MP) je peux lui transférer le message.
Je sais qu'il a préparé plein de prototypes pour Noël et qu'il n'arrive pas à s'en débarrasser, alors avec un peu de chance...

[Edit]
Ce message est sérieux, ce n'est pas une plaisanterie, n'hésite pas à envoyer ton adresse...
Daniel
L'obstacle augmente mon ardeur.

Daniel
Messages : 10827
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Lecture du répertoire d'une carte SD

Message par Daniel » 04 déc. 2014 10:23

Je reviens au sujet initial, ou plus exactement à son application pour monter automatiquement la disquette de démarrage à la mise sous tension de l'ordinateur. On recherche l'image de la disquette de démarrage dans le répertoire de la carte SD.
Ce fichier aura un nom imposé : BOOT.SD
Quand il est trouvé, on obtient le numéro de cluster du fichier par rapport au boot sector de la partition. A partir de là il faut calculer le LBA dans la carte.

On dispose d'une zone de travail en RAM de 256 octets en $9E00, de 4 octets en SD_LB0 et d'un octet en SD_TYP.
Les données sont au départ :
- SD_TYP = type de carte (0=SD, 1=SDHC)
- SD_LB0 = N (nombre de secteurs par cluster sur 1 octet)
- SD_LB0+2 = LBA0 (numéro de secteur du boot sector de la partition sur 2 octets)
- Registre D = CLUSTER (numéro de cluster du fichier)

Il faut calculer :
LBA = LBA0 + N * CLUSTER (sur 3 octets)
Si SD_TYP = 1, stocker LBA en SD_LB0+1 sur 3 octets et mettre à zéro SD_LB0
Si SD_TYP = 0, stocker LBA * 2 en SD_LB0 sur 3 octets et mettre à zéro SD_LB0+3

Depuis ce matin j'essaye de coder ce petit calcul, mais je ne suis pas très doué pour ce genre d'exercice. Toute aide sera la bienvenue.
Daniel
L'obstacle augmente mon ardeur.

Daniel
Messages : 10827
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Lecture du répertoire d'une carte SD

Message par Daniel » 04 déc. 2014 16:14

Cet après-midi j'ai fait tourner la nouvelle EPROM du contrôleur CS91-280 en émulation. En FAT16 tout fonctionne, y compris la recherche du fichier BOOT.SD dans le répertoire de la carte SD et la récupération du numéro de cluster. Encore une vingtaine de lignes de code pour le calcul du LBA, je programme une EPROM de test, et ça va marcher sur la vraie machine :D

Après je ferai la même chose en FAT32. C'est plus difficile car les clusters du répertoire principal ne sont pas contigus. Il reste encore 281 octets disponibles dans l'EPROM, il ne faudra pas perdre trop de place.
Daniel
L'obstacle augmente mon ardeur.

__sam__
Messages : 4174
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson] Lecture du répertoire d'une carte SD

Message par __sam__ » 04 déc. 2014 17:59

Daniel a écrit :Cet après-midi j'ai fait tourner la nouvelle EPROM du contrôleur CS91-280 en émulation. En FAT16 tout fonctionne, y compris la recherche du fichier BOOT.SD dans le répertoire de la carte SD et la récupération du numéro de cluster. Encore une vingtaine de lignes de code pour le calcul du LBA, je programme une EPROM de test, et ça va marcher sur la vraie machine :D
Trop cool! FAT16 limite à des cartes SD de combien de Mo ?
Après je ferai la même chose en FAT32. C'est plus difficile car les clusters du répertoire principal ne sont pas contigus. Il reste encore 281 octets disponibles dans l'EPROM, il ne faudra pas perdre trop de place.
Oulà ca va être chaud. Mais il y aura peut-être moyen d'optimiser en taille...
Samuel.
A500 Vampire V2+, A1200(030@50mhz/fpu/64mb/cf 8go),
GVP530 (MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8. New Teo 1.8.4 8)

Daniel
Messages : 10827
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Lecture du répertoire d'une carte SD

Message par Daniel » 04 déc. 2014 18:59

__sam__ a écrit :Trop cool! FAT16 limite à des cartes SD de combien de Mo ?
De mémoire je crois que c'est 4Go. La taille en soi n'est pas un problème, car avec 128 Mo on peut mettre presque toute la logithèque Thomson. Sauf qu'aujourd'hui on ne ne fabrique plus de cartes si petites, bientôt on n'en trouvera plus à moins de 8 Go.

On pourrait éventuellement créer une partition de moins de 4Go et formater en FAT16, mais c'est un peu compliqué pour l'utilisateur moyen. La reconnaissance du format FAT32 me semble incontournable.

Il y a un moyen d'éviter le parcours de la chaîne des clusters si on crée le fichier BOOT.SD en début de répertoire. Par exemple si je formate la carte, je copie le fichier BOOT.SD, il est en première position dans le répertoire. Plus tard je peux le modifier et le copier à nouveau, comme il garde le même nom et la même taille il reste à la même place. On peut alors se contenter de le chercher dans le premier cluster du répertoire principal, c'est une très grosse simplification. Dans un premier temps c'est ce que je vais faire...

Bon, le problème maintenant est de programmer le calcul du LBA. Ce serait plus facile avec des registres 32 bits :wink:
Daniel
L'obstacle augmente mon ardeur.

__sam__
Messages : 4174
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson] Lecture du répertoire d'une carte SD

Message par __sam__ » 04 déc. 2014 19:53

Daniel a écrit :Bon, le problème maintenant est de programmer le calcul du LBA. Ce serait plus facile avec des registres 32 bits :wink:
Un coup de main ? Quelle est la formule ?
Samuel.
A500 Vampire V2+, A1200(030@50mhz/fpu/64mb/cf 8go),
GVP530 (MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8. New Teo 1.8.4 8)

Daniel
Messages : 10827
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Lecture du répertoire d'une carte SD

Message par Daniel » 04 déc. 2014 20:30

Daniel a écrit :On dispose d'une zone de travail en RAM de 256 octets en $9E00, de 4 octets en SD_LB0 et d'un octet en SD_TYP.
Les données sont au départ :
- SD_TYP = type de carte (0=SD, 1=SDHC)
- SD_LB0 = N (nombre de secteurs par cluster sur 1 octet)
- SD_LB0+2 = LBA0 (numéro de secteur du boot sector de la partition sur 2 octets)
- Registre D = CLUSTER (numéro de cluster du fichier)

Il faut calculer :
LBA = LBA0 + N * CLUSTER (sur 3 octets)
Si SD_TYP = 1, stocker LBA en SD_LB0+1 sur 3 octets et mettre à zéro SD_LB0
Si SD_TYP = 0, stocker LBA * 2 en SD_LB0 sur 3 octets et mettre à zéro SD_LB0+3
Daniel
L'obstacle augmente mon ardeur.

__sam__
Messages : 4174
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson] Lecture du répertoire d'une carte SD

Message par __sam__ » 04 déc. 2014 21:47

Daniel a écrit :il faut calculer :
LBA = LBA0 + N * CLUSTER (sur 3 octets)
Notons:

Code : Tout sélectionner

LBA0      =    XX YY 
N*CLUSTER = UU VV 00 (UU VV = N*A)
          + 00 ZZ TT (ZZ TT = N*B)
LBA       = (UU+carry2) (VV+XX+ZZ+carry1) (TT+YY)
                    /|\    |          /|\    |
                     |_____|           |_____|

:?: on s'occupe de UU VV + 00 XX en 1er, puis on y ajoute 00 ZZ TT avec toutes les propagations de retenues qui s'imposent. Cela donne (1er jet)

Code : Tout sélectionner

    STB  ,-S        ; sauve lsb(CLUSTER)
    LDB  N
    MUL             ; D = msb(CLUSTER)*N = UU VV
    ADDB SD_LB0+2   
    ADCA #0         ; D = UU (VV+XX). Nota: Si SD_LB0+1 contient déjà 0, ADDD SD_LB0+1 suffit.
    STD  SD_LB0+1   ; sauvé en SD_LB0+1
    LDB  N
    LDA  ,S+
    MUL             ; D = lsb(CLUSTER)*N = ZZ TT
    ADDD SD_LB0+2   ; D = (VV+XX+ZZ+carry1) (TT+YY)
    STD  SD_LB0+2   ; (VV+XX+ZZ+carry1) (TT+YY) placé en LB0+2
    LDB  SD_LB0+1   ; B=UU
    ADCB #0         ; B=UU+carry2
    CLRA            ; A=0
    STD  SD_LB0     ; SD_LB0 = 00 (UU+carry2) (VV+XX+ZZ+carry1) (TT+YY)
Si SD_TYP = 1, stocker LBA en SD_LB0+1 sur 3 octets et mettre à zéro SD_LB0

Code : Tout sélectionner

    TST  SD_TYP
    BNE   FIN       ; ben oui  tout est déjà fait
Si SD_TYP = 0, stocker LBA * 2 en SD_LB0 sur 3 octets et mettre à zéro SD_LB0+3

Code : Tout sélectionner

; recopie + decalage
    STB  ,-S      ; sauvegarde UU+carry2
    LDD  SD_LB0+2 ; D=(VV+XX+ZZ+carry1) (TT+YY)
    LSLB
    ROLA          ; D*2
    STD  SD_LB0+1 ; sauvé en SD_LB0+1
    LDB  ,S+      ; UU+carry2
    ROLB          ; (UU+carry2)*2 + "carry de D*2"
    STB  SD_LB0   ; sauvé en SD_B0
    CLR  SD_LB0+3 ; 0 au bon endroit
FIN:
Samuel.
A500 Vampire V2+, A1200(030@50mhz/fpu/64mb/cf 8go),
GVP530 (MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8. New Teo 1.8.4 8)

Daniel
Messages : 10827
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Lecture du répertoire d'une carte SD

Message par Daniel » 05 déc. 2014 08:45

Je vais l'avouer maintenant : je suis paresseux et en fait je n'avais pas trop cherché, j'attendais vos propositions.
Merci beaucoup, __sam__, c'est exactement ce que je voulais. A première lecture le calcul semble excellent, je vais faire quelques tests en émulation avant de graver l'EEPROM.

Pour les essais sur les vraies machines j'utilise maintenant une EEPROM Atmel AT28C64B, car l'effacement est beaucoup plus rapide par rapport aux EPROM 27C64. Je garde les 27C64 ou 27C128 pour les versions finales, uniquement pour une question de coût.
Daniel
L'obstacle augmente mon ardeur.

Répondre