PROTOCOLE DE COMMUNICATION DU PROFILE

Le PROFILE est connecté à l'UC par :
  un bus de données (D0-D7)
une ligne de commande (CMD)
une entrée CRES "controller reset"
une sortie BSY (busy =occupé")
et diverses autres lignes
MISE EN ROUTE
Quand le PROFILE est mis sous tension, son CPU attend 18 secondes pour que le disque soit à la vitesse de fonctionnement, ensuite il lit séquentiellement chaque bloc du disque dur en utilisant les routines Read, Write, Verify et Spare avec un compteur de nombre d'essais initialisé à 105 (53 pour les réparations). Pendant cette opération la led clignote 2 fois par seconde. Nomalement le scan prend environ 1 minute s'il n'y a pas de problèmes. Au delà evidement c'est que le contrôleur essaye de faire des réparations...

Là vous venez de comprendre le "pourquoi allumer le PROFILE d'abord" !!!
COMMANDES
Le PROFILE standard ne dispose que de trois commandes : READ, WRITE, WRITE/VERIFY

C'est l'ordinateur qui initialise les séquences de commande en positionant la ligne CMD à HIGH. Le Z8 est quant à lui dans une boucle infinie d'attente du passage à HIGH de la ligne CMD. S'il est dans cette boucle 1,5 seconde (hormis pour le handshake d'une opération d'écriture ou d'écriture/vérification) le Z8 déplace les têtes de lecture sur la zone de parking (piste 155) et arrête le moteur pas à pas.

Les octets de commande sont les suivants :


Maintenant vous venez de comprendre pourquoi le formattage de bas niveau est IMPOSSIBLE sans un Z8 avec une ROM spéciale disposant de la commande FORMAT, ainsi que le logiciel non moins spécial, qu'APPLE a diffusé quasiment en mode confidentiel paranoiaque ! Par corollaire vous comprennez aussi que tous les zozos qui prétendent avoir réussi un formattage de bas niveau sans cette modification, au mieux confondent formattage logique et formattage physique et au pire racontent n'importe quoi pour se rendre intéressants...


Le PROFILE interpréte CMD HIGH comme une demande de l'ordinateur de lui dire ce que le PROFILE veut faire. Quand le PROFILE attend une commande il envoit 01 sur le bus de données et indique que sa réponse est faite en passant la ligne BSY à HIGH. Il attend ensuite que la ligne CMD passe à LOW, dès que cela se produit, le PROFILE lit la donnée qui est sur le bus.

Si c'est $55 alors il exécute l'action suivante et fait savoir à l'ordinateur ce qu'il fait en passant la ligne BSY à LOW.
	Prochaine action du PROFILE			Réponse du PROFILE
	
	Attend une commande				01
	
	Lit un bloc					02
	
	Recevoir les données à écrire			03
	
	Recevoir les données à écrire			04
	et à vérifier
	
	Est en train de faire une écriture
	ou une écriture/vérification sur 			06
	le disque
Si ce n'est pas $55 il positionne le bit de status NAK, fait un reset de lui-même puis attend une commande.

Le PROFILE utilise uniquement les octets dont il a besoin pour chaque commande. Les octets supplémentaires sont ignorés.

Les numéros de blocs valides vont de 000000 à 0025FF inclus.
Avec le numéro de bloc à FFFFFE cela fera lire ou écrire le buffer de RAM du PROFILE.
Avec le numéro de bloc FFFFFF cela lira la table de réparation du PROFILE.

TRAITEMENT DES ERREURS
Le RETRY COUNT de la commande LECTURE correspond au nombre de fois que le PROFILE doit lire le bloc s'il rencontre une erreur CRC ou un TIME OUT (notons que 0 est valide.. mais peut être pas génial)

Quand il rencontre une erreur CRC ou un TIME OUT le PROFILE sauvegarde les données qu'il lit la première fois avec succès MAIS recommencera à lire le bloc AUTANT DE FOIS que cela lui a été spécifié par le paramètre RETRY COUNT. S'il ne réussit pas a relire le bloc au cours de ces tentatives supplémentaires, il essayera de relire le bloc par 90 nouvelles tentatives (attention un TIME OUT consomme 9 tentatives car cela correpond au nombre de rotations effectuées avant que le TIME OUT soit déclaré). Dans le cas ou il ne réussit pas à lire le bloc, il déclare ce bloc dans la table des blocs défectueux, positionne le bit d'erreur ad hoc, positionne le bus pour que l'ordinateur puisse récupérer le résultat et met la ligne BSY a LOW pour indiquer que l'opération est terminée.

Si la table des blocs défectueux est pleine (100 entrées) le PROFILE indiquera cette erreur.

Si pendant les essais définis par RETRY COUNT le nombre d'erreurs est inférieur au paramètre SPARING THRESHOLD le PROFILE positionne les 4 octets à la valeur ad hoc, positionne le bus pour l'ordinateur et passe BSY à LOW.

Si le nombre d'erreurs est supérieur ou égal au nombre spécifié par SPARING THRESHOLD le PROFILE lance la routine READ/WRITE/SPARING qui essaye d'abord d'écrire les données sur le disque.

Si cela ne fonctionne pas à cause d'un problème de positionnement ou parce que la table des blocs défectueux est pleine, il indique l'échec de l'opération, positionne le bus pour l'ordinateur et passe BSY à LOW.

Si cela ne marche pas à cause d'un TIME OUT ou si la lecture est mauvaise après une écriture alors le PROFILE ressaye la routine R/W une fois de plus, et si cela ne fonctionne toujours pas alors il essaye la routine WRITE/VERIFY/SPARE en utilisant un secteur de secours du disque. Si cela réussit le PROFILE retire le bloc de la table des blocs défectueux s'il y était et le place dans la table des secteurs de secours.

NOTA :
La seule différence entre une opération WRITE/VERIFY et une opération WRITE est que l'opération WRITE ne fait pas d'essais après un TIME OUT et ne relit pas le bloc après l'avoir écrit. Cependant le PROFILE change une opération WRITE en WRITE/VERIFY si le bloc qui a été écrit est dans la table des blocs défectueux.

CARACTERISTIQUES
Le PROFILE a 9728 blocs répartis sur 152 cyclindres et 4 faces avec 16 blocs par piste. Les blocs sont alloués séquentiellement dans l'ordre suivant :

Piste 0       tête 0     bloc 0, 1, 2, 3...14, 15.
Piste 0       tête 1     bloc 0, 1, 2, 3...14, 15.

jusqu'à

Piste 152     tête 3     bloc 0, 1, 2, 3...14, 15.

La piste 77 est reservée pour 32 secteurs de secours et la table des secteurs de secours qui comprend des informations spécifique sur le matériel et la table des blocs défectuex.

Là vous venez de comprendre tout le drame du PROFILE : avec plus de 32 secteurs à réparer il est hors service! il faudrait pouvoir sauvegarder les données (faisable si on n'arrête pas la machine à ce moment précis) et refaire un formattage de bas niveau !

L'interleaving est 5:1 pour la lecture, 21:1 pour l'écriture et 37:1 pour la vérification. Il y a 30 ms d'attente avant la première écriture à faire si on change de piste. La rotation est de 3600 tours/ minute

LECTURE /ECRITURE
Quand l'ordinateur demande une lecture ou écriture au PROFILE, ce dernier translate le numéro de bloc en piste/tête/secteur. Il vérifie ensuite si le bloc est dansla table des secteurs de secours et repositionne alors les valeurs piste/tête/secteur en conséquence.

Si le bloc en cours et le dernier bloc lu ou écrit sont sur la même piste et la même tête le Z8 sort de la routine de déplacement de bras (SEEK).

Si le bloc est sur la même piste mais avec une tête différente, le Z8 attend 750 micro-secondes et sort de la routine SEEK sinon il attend 24 ms pour la mise en route du moteur pas à pas et essaye jusqu'à 64 fois de lire 3 secteurs consécutifs sur le disque. S'il rencontre une erreur de type mauvaise tête ou mauvaise piste, il lance la routine SEEK. Si le Z8 n'est pas capable de lire 3 secteurs consécutofs à cause d'un TIME OUT (tête non trouvée en 26ms) ou d'une erreur CRC, il ressaye entièrement la routine SEEK 2 fois après avoir avoir envoyé la tête sur la piste la plus intérieure et être revenu sur la piste demandée. Si le Z8 ne peut pas lire 3 secteurs consécutifs, il déclare une erreur de positionnement.

Après une lecture ou écriture le Z8 fournit à l'odinateur 4 octets de status de l'opération qui sont placés dans le buffer juste AVANT les données lues ou écrites.


STATUS 1
Bit
Signification
0
si = 1 : Echec de l'opération
1
NON UTILISE
2
si = 1 : TIME OUT, impossible de trouver la tête de lecture après 9 révolutions
3
si = 1 : CRC ERROR(pendant une opération READ ou VERIFY de WRITE/VERIFY
4
si = 1 : SEEK ERROR impossible de lire 3 secteurs consécutifs après 3 essais
5
si = 1 : les données de l'ordinateur ne sont plus disponibles car le PROFILE a mis sa table de secours à jour
6
si = 1 : R/W/V échoue parce que plus de 532 octets de données ont été envoyés ou parce que la tablede secours ne peut pas être lue.
7
si = 1 : Le PROFILE a reçu autre chose que $55 à sa dernière réponse

STATUS 2
Bit
Signification
0
NON UTILISE
1
si = 1 : Déplacement sur une mauvaise piste
2
si = 1 : A exécuter un SPARE
3
si = 1 : PROFILE incapable de lire le status secteur
4
si = 1 : Table des blocs défectues saturées (+ de 100 blocs sont donc abîmés)
5
NON UTILISE
6
si = 1 : Table des secteurs de secours saturées (32 maximum autorisés)
7
si = 1 : SEEK ERROR impossible de lire 3 entêtes de secteurs consécutifs sur la piste

STATUS 3
Bit
Signification
0
si = 1 : Positionné par le driver de l'OS; PARITY ERROR
1
si = 1 : Positionné par le driver de l'OS; PROFILE donne une mauvaise réponse
2
si = 1 : Positionné par le driver de l'OS; PROFILE était en RESET
3
NON UTILISE
4
NON UTILISE
5
si = 1 : Positionné par le driver de l'OS; non cohérence du bloc ID en fin de secteur
6
si = 1 : numéro de bloc invalide
7
si = 1 : le PROFILE a eté mis en RESET

STATUS 4
Bit
Signification
0
Nombre d'erreurs rencontrées
à
après la relecture d'un bloc
7
suite à n'importe quelle erreur de lecture initiale

TABLE DE SECOURS
Comme déjà dit la lecture du bloc FFFFFF demande au PROFILE de lire la table de secours.

Les 13 premiers octets sont consitué par le nom du device PROFILE + 6 espaces

Les 3 octets suivants sont alloués comme numéro de device et fixé à 00 00 00.

Les 2 suivants sont utilisés pour le numéro de version du programme, en principe 03 90 mais ce peut être aussi 03 92 - 03 96 ou 03 97(voir plus bas)

Les 3 suivants correspondent au nombre de blocs disponibles MSB en tête, en principe 00 26 00.

Les 2 suivants donnent la taille de chaque blocs à savoir 02 14 (532 en décimal)

Les 2 suivants donnent le nombre de secteurs de secours disponibles à savoir 20 (32 en décimal)

Ensuite vous avez le nombre de secteurs de secours alloués. Une fois alloués un secteurs NE PEUT PLUS ETRE DESALLOUES hormis par un formattage. Puis vous avez le nombre de mauvais blocs actuellement identifiés dans la table des blocs défectueux.

POur terminer les numéros des blocs de secours et des blocs défectueux sont listés (3 octets par numéro de bloc) avec comme délimiteur FF FF FF entre ces numéros et la table de tous les blocs défectueux.

VERSIONS DU PROGRAMME DE LA CARTE CONTROLEUR
La version initiale du controleur est la 3.90 elle a été changée en 3.92 avec une modification mineure sur le temps de 1.5 ms de pas à pas du moteur qui a été divisé par 2.

La 3.96 apporte des améliorations non négligeables.

1. Au lieu de passer en mode WRITE/VERIFY§SPARING si le nombre d'erreurs rencontrées lors de la lecture d'un secteur est supérieur au paramètre fixé en par SPARING THRESHOLD, le Z8 réécrit le bloc et le relit 100 fois. Si le taux d'erreur est supérieur à 30% alors le bloc est réparé. Ce taux de 30% est utilisé chaque fois qu'un échec est rencontré lors des opérations WRITE/VERIFY.

2. Un bloc est réparé si on a été capable de relire 3 secteurs consécutifs mais avec une erreur de TIME OUT car cela signifie que l'on n'a pas été fichu de trouver la tête correcte

Ces modifications ont permis de réduire le temps de scan initial.

La version 3.96 est utilisée si sur le controleur le jumper P6 est coupé

En version 3.97 la modification concerne le temps d'attente pour déplacer les têtes de la zone des données du disque qui est de 3.28 secondes au lieu de 1.5 seconde .