Daniel a écrit :En lecture, si le secteur est impair les 256 premiers octets du bloc sont lus et stockés dans le buffer, les 256 suivants sont lus (c'est obligatoire) et ignorés. Si le secteur est pair, c'est l'inverse.
Ah ok. C'est bien alors, ca reste compatible avec le format FD standard. Je suppose que pour ignorer les 256 octets tu fais une boucle de 256 fois la lecture d'un octet. Que donnerait en terme de vitesse une boucle faisant simplement basculer l'horloge 256*8 fois sans vraiment construire l'octet lu? On s'épargnerait les décalages et la lecture du port etc. Le code se réduirait à
Code : Tout sélectionner
LDX #addr_du_port
LDA ,X
ORA #<BIT à 1>
LDB ,X
ANDB #<BIT à 0>
LDY #256*8/<nb_unroll>
LOOP
STA ,X
STB ,X
... unroll ...
STA ,X
STB ,X
LEAY -1,Y
BNE LOOP
Ainsi le saut des 256 octets pourrait se faire à une vitesse bien plus rapide que la lecture à proprement parler. Cela pourrait notablement accélérer les temps d'accès au bon coté du secteur SD. (10 cycles 6809 pour changer l'horloge... donc 20480cycles=20ms pour sauter les 256 octets au lieu de 256/(5ko/sec*1024)=50ms à la louche).
Maintenant j'aborde l'écriture, et là ça coince car il faut impérativement un buffer de 512 octets, et il n'est pas prévu par le DOS. Je ne sais pas encore comment je vais m'en sortir. C'est gênant de modifier le DOS, car si on décale des adresses certains programmes ne fonctionneront plus. Je ne sais pas trop comment l'éviter.
J'ai quelques idées sur le sujet.
- On swap une zone de 512 octets (contigus pour la simplicité) de la mémoire thomson le temps de faire une écriture.
Détail: lors d'une opération d'écriture: tu commences par écrire dans un secteur spécial de la carte SD le contenu de la zone mémoire $9000-$91FF (plage arbitraire, mais à choisir hors du buffer d'I/O et hors de la pile. Les 256 octets au dessus de la valeur du registre S au point d'entrée de la routine moniteur sont peut être une excellente idée?). Puis tu remplies la zone $9000-91FF avec les 512 octets du secteur de la carte SD à modifier. Tu recopies alors le buffer d'I/O de 256 octets dans la bonne moitié de $9000-$91FF, puis tu écris les 512 octets sur la carte. Enfin tu termines en restorant les valeurs précédentes de la zone $9000-$91FF sauvées dans la zone spéciale de la carte SD.
Donc pour écrire 256 octets on doit: 1) écrire 512, 2) lire 512 3) remplir 256, 4) écrire 512 5) lire 512. Donc 1Ko à lire et 1Ko à écrire. Vitesse 1/4 de celle de la lecture. C'est pas si gênant car les écritures sont en principe rares.
- Il y a déjà le buffer de 256 octets à écrire, reste donc à trouver 256 octets pour sauver la demi-moitié non modifiée. En toute logique, pour faire des écritures sur disk, il faut avoir en mémoire la FAT (dont l'adresse est renseignée en $60ED). On peut, le temps de l'écriture écraser le contenu du buffer FAT par la 1/2 moitié de secteur non modifié. A la fin de l'écriture on recharge la FAT depuis le disk.
Donc, ici pour écrire 256 octets on doit 1) lire 512 2) écrire 512 3) lire 512. 1Ko lus et 0.5 écrits. C'est à peine mieux que le 1). De plus cette technique ne marche pas si la FAT a été modifiée en mémoire, ou si l'on écrit la FAT elle même, ou si l'on a affaire à un programme qui écrit une D7 comme un sauvage sans utiliser la FAT (routine de copie de disk par exemple). Donc pas génial. On oublie cette idée.
- Les 256 octets n'ont pas besoin d'être contigus ni même d'avoir leur données préservées. La zone de $C0 en fin de mémoire écran fournit déjà 192 octets. Il faut trouver 64 octets de libres dans le système. Or la zone $608B-$60CC de la pile système fait 66 octets. Donc sur le principe, ici on a rien besoin de charger depuis le disk car on a trouvé 256 octets (non contigus) libres dans la mémoire.
Mais il y a quelques réserves: il faut que le bas de la zone écran soit vraiment libre (très probable), et que la zone de la pile système soit elle aussi libre. Or ce dernier point ne va pas de soi quand on utilise le gestionnaire de fichiers du menu TO8 par exemple.
- En fait on a pas besoin d'utiliser la zone de la pile système, ni même l'ensemble des 192 octets de la fin de mémoire vidéo, car avec la mémoire forme/fond et sous réserve qu'on est pas sur un TO7 qui n'utilise que 6bits en RAM-couleur, on a en réalité 2*192 octets en fin de mémoire video. Dans ce cas on peut couper la poire en deux, et écrire 128 octets en RAMA, 128 en RAMB et hop, on a trouvé notre buffer de 256 manquant.
Bon, ce ne sont que des idées, qui permettent de lancer la réflexion.
Je pense que la plus fiable est la solution 1) car elle ne suppose pas grand chose de l'occupation mémoire du thomson. Elle peut même être compatible TO/MO si on trouve une zone à swapper commune entre les deux types de machine. Elle a juste le défaut d'être un peu lente, mais les écritures sont rares. Si on ne veut pas risquer d'hypothèse c'est une option intéressante.
La 4) utilisera un code un peu plus compliqué pour lire/écrire la moitié de secteur non modifié, mais il sera probablement le plus rapide. Par contre il faut être certain que les 256 octets de RAM video sont bien libres et peuvent être écrasés. Il me semble que certains octets après $5F40 sont utilisés par le menu du TO8 pour sauvegarder la palette ou la date.. mais je ne sais pas à quelles adresse. Une inspection avec DCMOTO de cette zone mémoire initialisée avec des valeurs connues devrait pouvoir trouver une zone de 128 octets non touchés en RAMA ou RAMB et fournir ainsi le buffer qui manque.
4) puis 1) voila mon tiercé (!)
sam.
___
(!) l'option 2) est non-partante. Et la 3) est supplantée par la 4) qui suppose moins de choses.