Amstrad Plus Index du Forum

Amstrad Plus
Découverte de la gamme Old et Plus des Cpc d'Amstrad.

 FAQFAQ   RechercherRechercher   MembresMembres   GroupesGroupes   S’enregistrerS’enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

Structure des Pistes d'une disquette

 
Poster un nouveau sujet   Répondre au sujet    Amstrad Plus Index du Forum -> Bienvenue sur ce forum -> Programmation
Sujet précédent :: Sujet suivant  
Auteur Message
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 2 237

MessagePosté le: Jeu 4 Fév - 00:49 (2016)    Sujet du message: Structure des Pistes d'une disquette Répondre en citant

J'ai récupéré cet article sur le forum de demoniak pour vous en faire partager la substantielle moelle.... Appréciez!!!
J'espère que cela ne te dérangera pas...

Demoniak a écrit:
Pour coder un émulateur, il faut approfondir tous les circuits intégrés de la machine pour les émuler au mieux.
Je me suis penché sur le µpd765a de Nec, le controleur du lecteur de disquette, pour savoir comment l'émuler au mieux.
Ce circuit est cadencé à une fréquence de 4Mhz. Cela est important, car pratiquement tous les temps donnés sur les documents constructeurs sont valables pour une fréquence de 8Mhz. Sur cpc, il faut donc multiplier tous les temps par deux.
Ce qui m'intéressait principalement, c'était la lecture/écriture des secteurs sur une piste, et le temps d'accès de ces fonctions. Pour cela, il faut bien comprendre comment cela fonctionne...
Le cpc lit/écrit des données sur disquette via le contrôleur par le mode appelé MFM. Ce mode permet d'envoyer des octets bit par bit depuis/vers le support physique de la disquette. 
La documentation nous indique qu'à 4Mhz et en mode MFM, les données sont envoyées à 500khz, soit une impulsion toute les 2µs (Période=1/Fréquence). 
En MFM, 1 bit est enregistré par une suite de deux impulsions cadencée à la fréquence donnée. Donc, pour envoyer un octet, il nous faut 16 impulsions. Ce qui nous donne 32µs par octets.
Sachant que le disque tourne à la vitesse constante de 300 tours/minutes, soit 5 tours par secondes, cela nous donne 0,2 secondes pour un tour, soit 200000µs.
En divisant 200000 par 32, on obtient 6250, qui est le nombre maximal d'octets que peut contenir une piste.

Mais comment sont organisés les octets sur une piste ? 
Heureusement, la documentation du µPD765 nous donne le schéma suivant:

- GAP 4a : 80 octets à #4E
- Sync : 12 octets à #00

Ces 92 premiers octets se retrouvent lorsque le disque est en face du "trou" d'index, soit au tout début de la piste.

- IAM : 3 octets à #C2 + 1 octet à #FC
- GAP 1 : 50 octets à #4E

Puis, pour chaque secteurs :
- Sync : 12 octets à #00
- IDAM : 3 octets à #A1 + 1 octet à #FE
- C (identification secteur 'C' = 1 octet)
- H (identification secteur 'H' = 1 octet)
- R (identification secteur 'R' = 1 octet)
- N (identification secteur 'N' = 1 octet)
- Crc (2 octets)
- GAP 2 (22 octets à #4E)
- Sync : 12 octets à #00
- DATA AM : 3 octets à #A1 + 1 octet à #FB ou #F8
- Les n données du secteurs (512 octets pour un secteur 'standard')
- Crc (2 octets)
- GAP #3 (x octets, dépend du formatage)

Pour finir, en fin de piste, on a le GAP 4B, qui sert à "remplir" le reste de la piste, pour arriver au total de 6250 octets.

Avec le schéma classique de l'amsdos, 9 secteurs de 512 octets et GAP3=#4E (78), on voit que l'on a, pour une piste :

80+12+4+50 octets en début de piste = 146
(12+4+4+2+22+12+4+512+2+78)*9 = (62+512+78)*9 = 5868
reste pour le GAP 4B (fin de piste) = 6250-5868-146 = 236 octets

Avec un Gap#3 à #24 (36), on arrive à mettre 10 secteurs par piste, en effet :
toujours nos 146 octets en début de piste,
on a maintenant 610 octets par secteurs, soit 6100 octets pour 10 secteurs
reste : 6250-6100-146 = 4 octets











_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Dernière édition par Ast le Jeu 4 Fév - 14:49 (2016); édité 1 fois
Revenir en haut
Publicité






MessagePosté le: Jeu 4 Fév - 00:49 (2016)    Sujet du message: Publicité

PublicitéSupprimer les publicités ?
Revenir en haut
Demoniak


Hors ligne

Inscrit le: 10 Sep 2015
Messages: 24
Localisation: Dunkerque

MessagePosté le: Jeu 4 Fév - 07:41 (2016)    Sujet du message: Structure des Pistes d'une disquette Répondre en citant

Pas de soucis ;-)

Revenir en haut
roudoudou


En ligne

Inscrit le: 14 Juil 2016
Messages: 242
Localisation: LYON

MessagePosté le: Mer 19 Oct - 13:43 (2016)    Sujet du message: Structure des Pistes d'une disquette Répondre en citant

On pourrait préciser que le CRC est une variante de CRC-CCITT
Initialisation à 0xFFFF, polynome à 0x1021 
j'ai trouvé un code C sur ce site http://srecord.sourceforge.net/crc16-ccitt.html
(ne pas faire attention au fait qu'ils l'appellent "mauvais" CRC, c'est une variante c'est tout)


void update_bad_crc(unsigned short ch) 

    /* based on code found at 
    http://www.programmingparadise.com/utility/crc.html 
    */
    unsigned short i, xor_flag;
    /* 
    Why are they shifting this byte left by 8 bits?? 
    How do the low bits of the poly ever see it? 
    */ 
    ch<<=8;
    for(i=0; i<8; i++) 
    { 
        if ((bad_crc ^ ch) & 0x8000) 
        { 
            xor_flag = 1; 
        } 
        else 
        { 
            xor_flag = 0; 
        } 
        bad_crc = bad_crc << 1; 
        if (xor_flag) 
        { 
            bad_crc = bad_crc ^ poly; 
        } 
        ch = ch << 1; 
    } 
}


Autre chose, si on lit la disquette en bits plutôt qu'en octets, on s'aperçoit que le codage MFM n'est pas respecté sur les octets de synchro, c'est d'ailleurs UNIQUEMENT grâce à ce défaut volontaire que le FDC sait qu'il est bien sur des octets de synchro et pas des données sectorielles. Sinon, on se doute qu'il sera facile de faire un secteur taille 6 qui simule la structure d'une piste+secteurs+données


J'ai pas encore testé mais si on fait ça, on est censé avoir une piste "vide" sauf...    en lecture multi-tête le FDC est bugué et devrait se faire berner. Cette technique a été utilisée sur Atari pour un jeu (Monkey Island?) ce qui lui permettait de stocker avec un système propriétaire un maximum de données sur une piste.


Quand j'aurais accès à un vrai CPC qui a un lecteur de disquette opérationnel (et pas un Gotek ou assimilé) je ferai des tests complémentaires à ça.


Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 2 237

MessagePosté le: Mer 19 Oct - 14:14 (2016)    Sujet du message: Structure des Pistes d'une disquette Répondre en citant

J'ai rien capté à la première partie... Si tu veux tu pourras faire des tests sur mon cpc+ à la Micro Alchimie car mon lecteur de disquette fonctionne... Je prendrais une disquette de test (3p et 3p 1/2), ça pourrait être marrant ^_^ en plus de mon gotek !

Quand je dis marrant, je pense surtout aux timings qui différent un peu d'un fdc cpc old/cpc plus.
roudoudou a écrit:
On pourrait préciser que le CRC est une variante de CRC-CCITT
Initialisation à 0xFFFF, polynome à 0x1021 
j'ai trouvé un code C sur ce site http://srecord.sourceforge.net/crc16-ccitt.html
(ne pas faire attention au fait qu'ils l'appellent "mauvais" CRC, c'est une variante c'est tout)


void update_bad_crc(unsigned short ch) 

    /* based on code found at 
    http://www.programmingparadise.com/utility/crc.html 
    */
    unsigned short i, xor_flag;
    /* 
    Why are they shifting this byte left by 8 bits?? 
    How do the low bits of the poly ever see it? 
    */ 
    ch<<=8;
    for(i=0; i<8; i++) 
    { 
        if ((bad_crc ^ ch) & 0x8000) 
        { 
            xor_flag = 1; 
        } 
        else 
        { 
            xor_flag = 0; 
        } 
        bad_crc = bad_crc << 1; 
        if (xor_flag) 
        { 
            bad_crc = bad_crc ^ poly; 
        } 
        ch = ch << 1; 
    } 
}


Autre chose, si on lit la disquette en bits plutôt qu'en octets, on s'aperçoit que le codage MFM n'est pas respecté sur les octets de synchro, c'est d'ailleurs UNIQUEMENT grâce à ce défaut volontaire que le FDC sait qu'il est bien sur des octets de synchro et pas des données sectorielles. Sinon, on se doute qu'il sera facile de faire un secteur taille 6 qui simule la structure d'une piste+secteurs+données


J'ai pas encore testé mais si on fait ça, on est censé avoir une piste "vide" sauf...    en lecture multi-tête le FDC est bugué et devrait se faire berner. Cette technique a été utilisée sur Atari pour un jeu (Monkey Island?) ce qui lui permettait de stocker avec un système propriétaire un maximum de données sur une piste.


Quand j'aurais accès à un vrai CPC qui a un lecteur de disquette opérationnel (et pas un Gotek ou assimilé) je ferai des tests complémentaires à ça.


_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
roudoudou


En ligne

Inscrit le: 14 Juil 2016
Messages: 242
Localisation: LYON

MessagePosté le: Mer 19 Oct - 14:30 (2016)    Sujet du message: Structure des Pistes d'une disquette Répondre en citant

Super!
Je prépare du code ce soir ou demain pour les tests!
J'ai pas grand chose à terminer, juste le ReadID et la fonction de ReadTrack un peu particulière


Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 2 237

MessagePosté le: Mer 19 Oct - 14:40 (2016)    Sujet du message: Structure des Pistes d'une disquette Répondre en citant

Il faut que j'amène des disquettes ?

Edit : essai de convertir ton source sous dams, ce sera plus maniable si tu as besoin de modif en direct live...
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
roudoudou


En ligne

Inscrit le: 14 Juil 2016
Messages: 242
Localisation: LYON

MessagePosté le: Mer 19 Oct - 20:55 (2016)    Sujet du message: Structure des Pistes d'une disquette Répondre en citant

Si t'as des disquettes vierges, oui, ça peut être rigolo Smile

Revenir en haut
roudoudou


En ligne

Inscrit le: 14 Juil 2016
Messages: 242
Localisation: LYON

MessagePosté le: Mar 25 Oct - 13:34 (2016)    Sujet du message: Structure des Pistes d'une disquette Répondre en citant

Bon ben bilan du meeting
On arrive à écrire des trucs rigolos sur une disquette mais on n'arrive pas à les relire avec un CPC car le FDC n'est pas aussi bugué que celui du ST
Dommage...


Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 2 237

MessagePosté le: Mar 25 Oct - 14:02 (2016)    Sujet du message: Structure des Pistes d'une disquette Répondre en citant

Oui, une déception certes... Mais voyons le bon côté des choses, on y a passé du bon temps...
Mort de Rire
Ca aurait été vraiment cool ce format "invisible data".
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
roudoudou


En ligne

Inscrit le: 14 Juil 2016
Messages: 242
Localisation: LYON

MessagePosté le: Mar 25 Oct - 14:07 (2016)    Sujet du message: Structure des Pistes d'une disquette Répondre en citant

Ah ça on s'est bien marré  Mr. Green

Revenir en haut
Ast
Administrateur

Hors ligne

Inscrit le: 05 Sep 2014
Messages: 2 237

MessagePosté le: Mar 25 Oct - 14:17 (2016)    Sujet du message: Structure des Pistes d'une disquette Répondre en citant

J'arrive pas à retrouver les sources de ton loader+sample... Si tu as 5 minutes, ce serait sympa de le poster ici...
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
roudoudou


En ligne

Inscrit le: 14 Juil 2016
Messages: 242
Localisation: LYON

MessagePosté le: Mar 25 Oct - 20:13 (2016)    Sujet du message: Structure des Pistes d'une disquette Répondre en citant

les sources sont là http://www.cpcwiki.eu/forum/programming/new-generation-of-musical-loader/

Revenir en haut
Contenu Sponsorisé






MessagePosté le: Aujourd’hui à 07:56 (2017)    Sujet du message: Structure des Pistes d'une disquette

Revenir en haut
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Amstrad Plus Index du Forum -> Bienvenue sur ce forum -> Programmation Toutes les heures sont au format GMT + 2 Heures
Page 1 sur 1

 
Sauter vers:  

Index | Panneau d’administration | Creer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com