[Thomson] Contrôleur CS91-280 pour 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

Répondre
Daniel
Messages : 10829
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

[Thomson] Contrôleur CS91-280 pour carte SD

Message par Daniel » 05 août 2013 18:44

Ce nouveau fil de discussion dans les développements actuels est créé pour ne pas polluer la section bricolage par les aspects logiciel du projet. On réservera le bricolage à l'aspect matériel : construction du module SDMOTO, transformation du contrôleur nanoréseau. Le développement du driver en assembleur 6809 sera discuté ici.
Rappel : Le contrôleur CS91-280 associé au module SDMOTO émule une disquette Thomson avec un fichier sur carte SD.
C'est un contrôleur nanoréseau dont on a modifié uniquement le contenu de l'eprom. Le coût des composants nécessaires pour fabriquer l'ensemble contrôleur + interface SDMOTO est inférieur à 5 euros. Le système est plus rapide qu'une vraie disquette en lecture, un peu plus lent en écriture. Tous les fichiers .fd du site dcmoto fonctionnent avec ce contrôleur.

Image

La version 2013.08.05 du soft est la première entièrement opérationnelle, après correction d'un petit bug d'écriture secteur. Et pour commencer, comme promis, j'ai fait quelques tests de performances :

Code : Tout sélectionner

========================================================
Test du contrôleur CS 91-280 version 2013.08.05 sur MO6
Temps comparés entre le CS91280 et le CD90351
========================================================

Fonction              CS91280  CD90351   
--------------------  -------  -------
Charger MACH3            0:44     0:58
Charger SPACE RACER      0:19     0:25
Charger TURBO CUP        1:10     1:13
BACKUP0TO1               5:19     3:45
DSKINI0                  3:26     0:35


On remarque d'abord une meilleure performance en lecture par rapport à un lecteur de disquette. C'était prévu, et les 20% de gain sont un argument de plus en faveur de cette solution. Il est évident que tous les jeux seront chargés plus rapidement qu'avec une disquette. Par rapport aux temps actuels, de petites améliorations sont encore possibles, mais il ne faut pas attendre de miracle.

Le revers de la médaille est une mauvaise performance en écriture, visible à la ligne BACKUP0TO1. La carte SD met un temps assez long pour écrire, par son principe même : tout comme une eprom, il faut l'effacer d'abord, l'écrire ensuite. Le nombre d'octets impactés par l'écriture d'un secteur de disquette est considérable (plusieurs milliers), et il y a un délai minimum à respecter entre deux écritures. Dans la première version du driver, je n'avais pas mis de temporisation, et seul un secteur sur deux était écrit. J'ai corrigé par une attente de 4096 tops d'horloge, ce qui divise par deux la vitesse d'écriture. Je pense qu'en affinant ce délai on peut gagner beaucoup, mais on n'ira jamais aussi vite qu'en lecture.

Le formatage par DSKINI n'est pas significatif : le lecteur de disquette écrit piste par piste, alors que le logiciel actuel écrit la carte SD secteur par secteur (pour mettre les octets des secteurs à $E5). Au lieu de ce formatage complet, on peut faire un formatage rapide (initialiser uniquement la piste 20) et alors le formatage sera 80 fois plus rapide : 2,6 secondes. On peut aussi utiliser une commande d'écriture multi-secteurs pour le formatage complet, elle sera beaucoup plus rapide.

Pour ces tests de performances, j'ai transféré 3 fichiers .fd sur disquette d'une part, sur carte SD d'autre part. Le temps de transfert des 3 jeux sur disquette est d'environ un quart d'heure, le temps de transfert des mêmes jeux sur carte SD est d'environ 1 seconde. Et avec une fiabilité sans faille. Je suis convaincu de la supériorité de la carte SD, et j'espère vous convaincre aussi :wink:
Modifié en dernier par Daniel le 06 août 2013 09:27, modifié 2 fois.
Daniel
L'obstacle augmente mon ardeur.

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

Re: [Thomson] Contrôleur CS91-280 pour carte SD

Message par __sam__ » 05 août 2013 21:06

A la louche cela fait combien de ko/s en lecture (et en écriture) ?
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 : 10829
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Contrôleur CS91-280 pour carte SD

Message par Daniel » 05 août 2013 21:40

En gros 3 Ko/s en lecture et 1,5 Ko/s en écriture. En optimisant, on ne gagnera pas beaucoup en lecture, mais on doit pouvoir atteindre 2 Ko/s en écriture. A comparer aux 5,5 Ko/s de mes démonstrations de musique et de vidéo. Il est clair que les 256 octets des secteurs au format Thomson font chuter les performances, mais ça reste plus rapide en lecture que le vrai lecteur de disquette.

Si vous voulez tester la première version opérationnelle de l'eprom du contrôleur elle est ici :
http://dcmoto.free.fr/bricolage/cs91-28 ... 130805.zip

Je nettoie un peu les sources avant de les publier.
Daniel
L'obstacle augmente mon ardeur.

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

Re: [Thomson] Contrôleur CS91-280 pour carte SD

Message par __sam__ » 06 août 2013 00:34

L'écriture 2x plus lente que l'écriture n'est pas gênante je pense car on écrit finalement assez peu de choses sur D7. En revanche, le fait de devoir envoyer 256*8 top d'horloge ralenti quand même pas mal le débit de lecture. De l'odre de 50% par rapport aux 5.5ko/sec déjà obtenus, ce qui est surprenant vu qu'on ne reconstruit pas les octets. Il n'y a vraiment rien à tenter de ce coté?
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 : 10829
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Contrôleur CS91-280 pour carte SD

Message par Daniel » 06 août 2013 08:22

La commande BACKUP du Basic DOS n'est pas aussi optimisée que les accès directs dans les démos. Et surtout, les démos utilisent la commande "Read multiple sectors" permettant de lire toute la carte SD en séquentiel avec une seule commande. Le contrôleur CS91-280 est obligé d'utiliser des commandes de lecture simple (une commande par secteur), du fait de la structure des disquettes Thomson.
Pour l'envoi des tops d'horloge, je ne suis pas un spécialiste de l'optimisation, je te laisse essayer :wink:

Code : Tout sélectionner

*------------------------------------------------------
* ENVOI DE TOPS HORLOGE (nombre de tops dans reg A)
*------------------------------------------------------
CLOCK
  LDB   #$7F          set bit 5 et bit 6        (2)
  STB   <$CC          clock high, di high       (4)
  LDB   #$5F          clear bit 5               (2)
  STB   <$CC          clock low, di high        (4)
  DECA                                          (2)
  BNE   CLOCK                                   (3)
  RTS                                           (5)  
D'un autre côté, je travaille sur l'amélioration de l'écriture. Je vais remplacer le temps d'attente fixe par un test de la réponse busy de la carte SD, pour envoyer la commande suivante au plus tôt. Normalement il devrait y avoir un gain important (seulement en écriture).
Modifié en dernier par Daniel le 06 août 2013 08:39, modifié 1 fois.
Daniel
L'obstacle augmente mon ardeur.

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

Re: [Thomson] Contrôleur CS91-280 pour carte SD

Message par __sam__ » 06 août 2013 08:34

Oui je crois qu'on peut optimiser la boucle "CLOCK", mais avant, je me demande ce que contient A à l'entrée ? Peut il contenir n'importe quelle valeur ou est-ce des multiples de 8 (par exemple 0) pour sortir des tops calés sur des octets?
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 : 10829
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Contrôleur CS91-280 pour carte SD

Message par Daniel » 06 août 2013 08:44

Le registre A peut contenir n'importe quelle valeur. Pour envoyer 256 octets j'appelle CLOCK avec 0 dans A dans une boucle de 8. Il est vrai qu'on pourrait supprimer cette boucle de 8 en créant une routine "CLOCK8" envoyant A * 8 tops.

A noter : la taille actuelle du code du contrôleur CS91-280 est $512 octets. Sachant qu'on dispose au maximum de $7C0 octets, il reste beaucoup de place pour dérouler les boucles.
Daniel
L'obstacle augmente mon ardeur.

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

Re: [Thomson] Contrôleur CS91-280 pour carte SD

Message par __sam__ » 06 août 2013 09:28

Dans le contexte, y a t-il d'autres registres dispo ? (x,y,u)
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 : 10829
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Contrôleur CS91-280 pour carte SD

Message par Daniel » 06 août 2013 09:36

La routine CLOCK est utilisée dans plusieurs autres routines. Pour certains appels les registres U,X,Y ne sont pas disponibles, par contre pour le complément du secteur à 512 octets, en lecture comme en écriture, ils sont utilisables. Il faudrait faire une routine spéciale pour ce cas.
Daniel
L'obstacle augmente mon ardeur.

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

Re: [Thomson] Contrôleur CS91-280 pour carte SD

Message par Daniel » 06 août 2013 14:46

Aussitôt dit, aussitôt fait : j'ai écrit une routine CLOCK pour envoyer 8 tops d'horloge. Finalement je n'ai plus besoin de l'autre, je n'envoie jamais moins de 8 tops. Il y a aussi quelques aménagement pour remplacer des branchements longs par des branchements courts.

Code : Tout sélectionner

*------------------------------------------------------
* ENVOI DE TOPS HORLOGE (8 fois reg A)
*------------------------------------------------------
CLOCK
  PSHS  A
  LDD   #$7F5F
CLOCK1
  STA   <$CC          clock high, di high
  STB   <$CC          clock low, di high 
  STA   <$CC          clock high, di high
  STB   <$CC          clock low, di high 
  STA   <$CC          clock high, di high
  STB   <$CC          clock low, di high 
  STA   <$CC          clock high, di high
  STB   <$CC          clock low, di high 
  STA   <$CC          clock high, di high
  STB   <$CC          clock low, di high 
  STA   <$CC          clock high, di high
  STB   <$CC          clock low, di high 
  STA   <$CC          clock high, di high
  STB   <$CC          clock low, di high 
  STA   <$CC          clock high, di high
  STB   <$CC          clock low, di high 
  DEC   ,S
  BNE   CLOCK1                            
  PULS  A,PC                                      
La temporisation entre les WRITE secteurs a été supprimée et remplacée par un test du statut "BUSY" de la carte. Le gain est énorme, le BACKUP est maintenant plus rapide avec la carte SD qu'avec la vraie disquette :D

J'ai laissé le formatage complet. Le formatage rapide durerait moins de 2 secondes, mais on ne formate pas souvent alors je ne sais pas si c'est vraiment utile.

Voici le résultat, j'en suis très satisfait (mais __sam__ trouvera encore plein de cycles à gagner :wink: )

Code : Tout sélectionner

========================================================
Temps comparés entre le CD90-351 et le CS91-280 sur MO6
========================================================

                                CS91-280  CS91-280 
Fonction              CD90-351  20130805  20130806  
--------------------  --------  --------  --------  
Charger MACH3            0:58      0:44      0:40  
Charger SPACE RACER      0:25      0:19      0:17  
Charger TURBO CUP        1:13      1:10      1:04        
BACKUP0TO1               3:45      5:19      3:43  
DSKINI0                  0:35      3:26      2:11        
Daniel
L'obstacle augmente mon ardeur.

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

Re: [Thomson] Contrôleur CS91-280 pour carte SD

Message par __sam__ » 06 août 2013 15:45

Oui voilà. Je pensais au STA/STB ce qui fait gagner les 4 cycles du LDB par top. Cette version donne "en moyenne": (4+4)*8+7+3 = 74 cycles pour 8 tops d'horloge, donc les 256 octets sont lus en sensiblement 19ms. En soit un bit ne prend pas beaucoup (8 cycles), mais il faut en lire 2048, ce qui amène forcément de l'ordre de la 8*2046 = 16ms.

Je ne vois pas trop où l'on peut gagner logiciellement, sauf à utiliser X ou Y pour décompter, mais on gagne 7-(4+1) = 2 cycles pour 8 tops. Ca ne changera pas grand chose au final. C'est vraiment le volume (2048) qui coute du temps. Pour aller plus vite, il faudrait pouvoir générer 2048 oscillation sur un port de sortie en très peu de cycles. Je ne vois pas trop. La fréquence à atteindre est haute: c'est plus du hard que du soft à ce niveau là

Il n'y a pas moyen de lire des 1/2 secteurs ? D'après cette doc j'ai vu une info READ_BL_PARTIAL / WRITE_BL_PARTIAL mais je ne sais pas trop si cela a le moindre sens ou si cela s'applique.
1.5.10.4. Memory Array Partitioning
Memory partitioning in SPI mode is equivalent to SD Bus mode. All read and write commands are byte addressable
with the limitations given in Section 1.5.9.5.

1.5.9.5. Memory Array Partitioning
The basic unit of data transfer to/from the SD Card is one byte. All data transfer operations which require a block
size always define block lengths as integer multiples of bytes. Some special functions need other partition
granularity. Figure 1-2 shows the Memory Array Partitioning.
For block-oriented commands, the following definition is used:
• Block—The unit that is related to the block-oriented read and write commands. Its size is the number
of bytes that are transferred when one block command is sent by the host. The size of a block is either
programmable
or fixed. The information about allowed block sizes and the programmability is stored
in the CSD.
Et ici ils ont l'air de programmer la taille des blocs avec

Code : Tout sélectionner

#define SETBLOCKLEN 16 //CMD16
#define BLOCKLEN_512 512
#define CRC_ON_OFF 59 //CMD59
#define WRITE_SINGLE_BLOCK 24 //CMD24
#define READ_SINGLE_BLOCK 17 //CMD17

	OpenSPI(SPI_FOSC_4, MODE_11, SMPMID);//Increase clock speed
	sendCmd(CRC_ON_OFF,0x0);  //Turn off CRC if possible
	sendCmd(SETBLOCKLEN, BLOCKLEN_512);//Set block length 512
ce qui laisse supposer qu'on peut accéder à des blocs de longueur programmée.

[EDIT] en googleant sur "CMD16", j'ai l'impression que pour la lecture on puisse lire des blocs de 1 à 512 octets alignés sur les secteurs physiques de la cartes et donc accélérer les transferts d'un facteur x2. Pour l'écriture en revanche 512 semble ce que tout le monde utilise. C'est chiant d'avoir besoin de reprogrammer la taille des blocs entre lecture et écriture. Mais le doute persiste sur les 512 en écriture, car il n'est pas facile de trouver des infos fiables: entre les blogs qui disent que les secteurs font toujours 512 (parce que c'est 512!), d'autres qui disent qu'ils font au minimum 512, d'autres que c'est le maxi. Tous les blogs y vont de leur interprétation :? J'ai trouvé un source qui semble avoir des infos cohérentes (et qui marche):

Code : Tout sélectionner

#define		CMD16		0x50		/*Select a block length (in bytes) for all following block commands (Read:between 1-512 and Write:only 512)*/
#define		CMD17		0x51		/*Reads a block of the size selected by the SET_BLOCKLEN command, the start address and block length must be set so that the data transferred will not cross a physical block boundry*/
#define		CMD24		0x58		/*Writes a block of the size selected by CMD16, the start address must be alligned on a sector boundry, the block length is always 512 bytes*/
Mais même sans ces 1/2 secteurs, les perfs sont bonnes :D
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 : 10829
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Contrôleur CS91-280 pour carte SD

Message par Daniel » 06 août 2013 17:32

Il est possible de modifier la longueur du bloc, je crois, pour les cartes SD < 2Go. Par contre, avec les SDHC la taille de 512 octets est imposée, on ne peut pas la modifier. Pour ne pas être contraint d'utiliser de vieilles cartes (qui ne sont pratiquement plus fabriquées), je ne veux pas diminuer la taille du bloc.

La solution pour aller plus vite serait d'utiliser le mode de transmission "SD" à la place du mode "SPI". Tous les bidouilleurs utilisent le SPI parce qu'il est simple. Au contraire le mode SD est plus complexe, mais on a 4 lignes de données et on transmet 4 bits au lieu d'un à chaque top d'horloge. C'est un projet d'une difficulté bien supérieure, je n'ai pas le courage de m'y lancer mais je serais le plus grand supporter de l'audacieux (inconscient ?) qui voudra relever le défi.

Pour les démonstrations, rien n'oblige à utiliser le format des disquettes Thomson. On peut faire de la lecture séquentielle multi-blocs, sans aucune perte de temps, et atteindre plus de 5Ko/s.

Pour aller encore plus vite il y a d'autres solutions en dehors des cartes SD, je les étudie aussi, je ne sais pas si ça débouchera sur une solution viable. Les tests sont encourageants mais des difficultés matérielles subsistent.

Mais ne soyons pas trop gourmands : la solution CS91-280 dans l'état actuel est déjà plus rapide, plus fiable, plus silencieuse, moins encombrante, plus légère, plus pratique et beaucoup moins chère que la disquette. Il ne faut pas en demander trop :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] Contrôleur CS91-280 pour carte SD

Message par __sam__ » 06 août 2013 19:40

donc c'est SDHC qui force le 512 (mini je suppose) c'est dommage de ne pouvoir demander moins :cry: Mais bon, en l'état la vitesse est très similaire à celle du vrai matériel. Tu as raison, c'est déjà bien.
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)

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

Re: [Thomson] Contrôleur CS91-280 pour carte SD

Message par 6502man » 07 août 2013 14:50

Félicitations pour ce travail exceptionnel :D

J'ai très peu de temps en ce moment, donc je suit de très loin les divers post mais ce sujet m'intéresse au plus haut point :wink:
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.

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

Re: [Thomson] Contrôleur CS91-280 pour carte SD

Message par Daniel » 07 août 2013 19:02

Aujourd'hui programmation de la sélection du fichier .sd par les switches du contrôleur CS91-280 : possibilité de sélectionner 4 faces de disquettes parmi 128 (32 sélections différentes). C'est 41 943 040 octets accessibles, pour un Thomson ce n'est pas mal.

On pourra aussi changer de disquette par programmation (un simple poke dans un vecteur système), dans ce cas le nombre de sélections n'est pas limité, les auteurs de jeux ou de démos auront une mémoire de masse infinie ou presque (32 Go).

J'ai fait aussi un peu d'optimisation en copiant la lecture d'un octet dans la boucle de lecture d'un secteur, pareil pour l'écriture. C'est 256 BSR + RTS gagnés pour chaque secteur lu ou écrit, ce n'est pas énorme mais on voit la différence dans les tests de performance ci-dessous :

Code : Tout sélectionner

============================================================
Temps comparés entre le CD90-351 et le CS91-280 sur MO6
============================================================

                                CS91-280  CS91-280  CS91-280 
Fonction              CD90-351  20130805  20130806  20130807  
--------------------  --------  --------  --------  --------  
Charger MACH3            0:58      0:44      0:40      0:35  
Charger SPACE RACER      0:25      0:19      0:17      0:16  
Charger TURBO CUP        1:13      1:10      1:04      1:02              
BACKUP0TO1               3:45      5:19      3:43      3:36  
DSKINI0                  0:35      3:26      2:11      2:07
        
Il ne faut pas espérer aller beaucoup plus vite, on approche de l'asymptote. Notez que MACH3 se charge en 35 secondes avec le contrôleur CS91-280, contre 58 secondes avec la vraie disquette. C'est un gain non négligeable :D
Daniel
L'obstacle augmente mon ardeur.

Répondre