ARTICLES
12 / 31 |
Protection Gaps
DETAILS TECHNIQUES :
Avant toute chose, il faut savoir que si vous formattez une disquette avec votre Amstrad CPC, la taille des pistes ne peuvent dépasser 6250 octets (Il faut tenir compte des octets de GAP et des octets d'identification).
Le controleur du lecteur de disquette est le µpd765a de Nec.
Ce circuit est cadencé à une fréquence d'environ 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.
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µs 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) Numéro de piste
- H (identification secteur 'H' = 1 octet) Numéro de la tête
- R (identification secteur 'R' = 1 octet) ID du secteur
- N (identification secteur 'N' = 1 octet) Taille du secteur
- CRC (2 octets) Checksum - Calcul d'intégrité
- GAP 2 (22 octets à #4E)
- Synchronisation : 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) Checksum - Calcul d'intégrité
- 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
La formule pour calculer la clef Gap : (6250 -146 -(nombre_secteurs*(taille_secteur+62)))/nombre_secteurs
Tout ceci pour vous montrer que la protection GAPS est en fait des octets écrit entre 2 secteurs.
Le soucis c'est que le CPC écrit toujours la même valeur (&4E) et qu'il nous est impossible sur CPC de pouvoir changer les valeurs dans le GAPS.
SPECIFICITES :
La protection Gaps consiste a écrire des valeurs spécifiques (autre que &4E que nous avons vu au dessus) dans la zone de séparation entre deux secteurs consécutifs (aussi appelé zone inter-secteur) et de vérifier en lecture que nous retrouvons les bonnes valeurs.
Le FDC de l'amstrad CPC est capable de lire ses informations non uniforme dans la zone des GAPS.
Il y a (au moins) deux sortes de protection hard qui utilisent le GAP3 :
A) Il y a les protections qui cherchent des valeurs spéciales inscrites dans la zone GAP3 (disques pas gravés par un CPC, ni même un FDC765).
L'écriture des informations GAPS non uniforme a été réalisée sur ordinateur Oric étant donnée l'impossibilité matérielle de l'Amstrad CPC de réaliser une telle opération.
Exemple : "Chicago 90 (F) (1989) [Original] (GAPS).dsk"
A noté que nous avons des Gap2 en pistes 0 à 2 incluses contenant le mot STARTER. Certes, là protection ne les tests pas, mais l'information est tout de même présente.
La portion de code qui nous intéresse :
ORG #8011
1E 00 ......... LD E,&00
16 27 ......... LD D,&27 ;Track 39
CD 63 C7 ...... CALL &C763
01 7E FB ...... LD BC,&FB7E ;Port of Data
3E 42 ......... LD A,&42 ;Code instruction read track : %01000010
CD 5C C9 ...... CALL &C95C
3E 00 ......... LD A,&00
CD 5C C9 ...... CALL &C95C
3E 27 ......... LD A,&27 ;Track 39
CD 5C C9 ...... CALL &C95C
ORG #806A
01 7E FB ...... LD BC,&FB7E ;Port of Data
11 07 02 ...... LD DE,&0207 ;length reading ? why no information writing in &8089 ?
21 89 80 ...... LD HL,&8089 ;key gaps &F7 writing in &8089
80 73 ......... JR &807F
7A ............ LD A,D
B3 ............ OR E
28 06 ......... JR Z,&807F
0C ............ INC C
ED 78 ......... IN A,(C)
77 ............ (HL),A
0D ............ DEC C
1B ............ DEC DE
ED 78 ......... IN A,(C) ;value read
F2 7F 80 ...... JP P,&807F
E6 20 ......... AND &20
20 ED ......... JR NZ,&8075
C9 ............ RET
ORG #804F
;Test protection
21 89 80 ...... LD HL,&8089
3E F7 ......... LD A,&F7
BE ............ CP (HL) ;compare if the value in &8089 = &F7 ?
.loop
20 FE ......... JR NZ, .loop ;not correct, infinity loop
GAPS, Track 39, Sector #41
000000: 8F D3 F7 F7 F7 F7 F7 F7 F7 F7 F7 F7 F7 F7 F7 F7
000010: F7 F7 F7 F7 F7 F7 F7 F7 F7 F7 F7 F7 F7 F7 F7 F7
000020: F7 F7 F7 F7
B) Il y a les protections qui cherchent à mesurer des zones GAP3 de tailles variables (écrites par un CPC)
Exemple : E.X.I.T.
EDITEURS L'AYANT UTILISES SUR CPC :
Loriciels / UBI Softs / Infogrames / Ere Informatique / Softhawk...
Listing des programmes utilisant cette protection
NIVEAU DE PROTECTION :
Impossibilité matérielle de recopie sur un CPC.
Article rédigés par : Kukulcan, Brice RIVE, Maxit, Demoniak
Article créé le : | Jeudi 30 Aout 2012 à 11 h 24 |
Dernière mise à jour le : | Mardi 08 Janvier 2019 à 15 h 29 |