Le LOGIC STATE SEQUENCER (LSS) appelé aussi SEQUENCER est l'une des pièces maitresse du système de lecture et d'écriture des disquettes. C'est la compréhension parfaite de son fonctionnement qui permet la compréhension parfaite des systèmes de protection et leur reconstitution. Le LSS contient un code particulier que nous allons examiner. Ce code se trouve sur la PROM P6 de la carte contrôleur. Il est normalement INACCESSIBLE mais...



L'astuce consiste à remplacer la P5 par une P6... donc cette fois c'est accessible par le très classique Cx00 avec X =N° de slot. Il y a cependant une difficulté de taille : Le brochage est différent, donc c'est inexploitable! Arghhh !!! Heureusement dans "UNDERSTANDING APPLE II" Jim Sather (encore lui!) a realisé un programme BASIC pour remettre ce code en ordre. Ne vous fatiguez pas il est dans cette rubrique et d'autres qui seront indiquées plus loin.
La compréhension du LSS est assez loin de l'évidence biblique que nous avons parfois rencontrée... ne désespérons pas pour autant on va y arriver mais préparez les aspirines, le papier et les crayons.

Si ce n'est pas facile à comprendre, dites vous qu'à expliquer ce n'est pas de la tarte non plus !

ARCHITECTURE DU LOGIC STATE SEQUENCER (LSS)...
Le LSS a pour finalités :
de définir les nibbles sur la disquette à partir des pulses reçus du sytème de détection MC3470.
d'écrire les nibbles en faisant faire des inversions de signal
de déterminer si la disquette est protégée en écriture (et ça lui sert d'initialisateur)

Le LSS communique avec le programme 6502 par l'intermédiaire du DATA REGISTER qui est le registre à travers lequel transitent les valeurs lues ou écrites. IL faut savoir que le LSS fonctionne 2 fois plus vite que le 6502 c'est à dire à 2 Mhz, ce qui n'est pas innocent évidement. Les deux schémas suivant vous expliquent le fonctionnement global du LSS.





IMPORTANT : On appelle QA le bit 7 du data register (c'est à dire le bit le plus significatif aussi écrit MSB=most signifiant bit en anglais). Quand on veut parler de son contenu, on utilise aussi QA pour désigner la valeur 1. Pour la différencier, on appelle QA' la situation où le bit 7 = 0.

UN CODE PARTICULIER...
Le code de la PROM P6 est composé de 256 octets. Ce n'est pas un code au sens où on l'entend en 6502 en ce sens que chaque octet code à la fois le numéro de séquence suivante et l'opération à faire. La partie gauche correspond au numéro de la prochaine séquence à exécuter, la partie de droite correspond à l'opération à effectuer.


Les opérations sont :

code 0 (0000) CLR
code 8 (1000) NOP
code 9 (1001) SL0
code D (1101) SL1
code A (1010) SR
code B (1011) LD



Efface le DATA REGISTER
Ne rien faire (le plus utilisé)
Shift un 0 dans le DATA REGISTER
Shift un 1 dans le DATA REGISTER
Lit le signal WRITE PROTECT
Charge le DATA REGISTER avec la donnée présente sur le bus de données (DATA BUS)
Les mnémoniques des codes controles ont une signification proche de celle des codes utilisés par les assembleurs à savoir:

            SLx
            SR
            CLR
            NOP
            LD
"SHIFT LEFT" (la valeur x c'est-à-dire 0 ou 1)
"SHIFT RIGHT" (toujours la valeur 1 en fait)
"CLEAR"
"NO OPERATION"
"LOAD"

Exemples :

E0 signifie : Effacer le DATA REGISTER et allez en séquence E
68 signifie : Ne rien faire et allez en séquence 6
A8 signifie : Ne rien faire et allez en séquence A
2D signifie : Place un 1 dans le DATA REGISTER et allez en séquence 2
59 signifie : Place un 0 dans le DATA REGISTER et allez en séquence 5

TRES IMPORTANT :

La PROM P6 (tout comme la PROM P5) existe en DEUX VERSIONS TOTALEMENT DIFFERENTES :

la version 13 secteurs (la plus ancienne utilisée de 1977 à 1980).
la version 16 secteurs (la plus récente et que l'on trouve pratiquement à coup sûr sur toutes les machines car elle a été installée dès août 1980 sur les APPLE II. Les anciennes PROM pouvaient alors être remplacées par les nouvelles PROM très aisément mais c'était surtout indispensable pour pouvoir utiliser les nouveaux programmes écrit sous DOS 3.3 ou non, mais avec un secteur 0 de la piste 0 respectant les critères du format des 16 secteurs et décrit plus bas.)

Les codes de base utilisés sont les mêmes dans les deux versions. Par contre la programmation est différente. Par la suite nous allons examiner la PROM P6 16 secteurs car il y a très peu de chances que vous rencontriez une PROM P6 13 secteurs et de toute façon les principes de fonctionnement sont très proches. Je détaillerai la PROM P6 13 secteurs plus tard...

Les identifiants des PROM sont les suivants



ATTENTION : La PROM P5 13 SECTEURS ne pourra pas lire correctement les disquettes formattées en 16 secteurs mais PAR CONTRE la PROM P6 16 SECTEURS sait lire PARFAITEMENT les disquettes formattées en 13 secteurs, et ce, malgré une modification de timing sur la carte analogique des drives spécifiquement pour lire les disquettes en 16 secteurs (il s'agit de la résistance R21 transformée en potentiomètre)


Si les disquettes 13 secteurs ne bootent pas sur un contrôleur de disquette qui a les PROM 16 SECTEURS ce n'est lié QU'A LA SEULE PROM P5 et non la PROM P6 !!!! Quelle que soit la version de la PROM P5 (13 ou 16 secteurs) il faut en fait comprendre que la PROM concernée doit pouvoir lire au moins le secteur 0 de la piste 0 selon un codage et des marqueurs de champs précis à savoir :

Pour la PROM P5 associée à la P6 13 SECTEURS :

        codage 5.3
        marqueurs du champ adresse D5 AA B5 et DE AA EB
        marqueurs du champ de données D5 AA AD et DE AA EB.


Pour la PROM P5 associée à la P6 16 SECTEURS :
        codage 6.2
        marqueurs du champ adresse D5 AA 96 et DE AA EB
        marqueurs du champ de données D5 AA AD et DE AA EB.


La PROM P5 contient du code 6502 et non un code spécifique comme celui de la P6. Il sera détaillé dans la partie relative au BOOTSTRAP
UN CODE EN 16 SEQUENCES
Les 256 octets de la PROM sont organisés pour être utilisés en continu à travers une suite de 16 séquences. Cela s'apparente à une machine à états. Gros malins que vous êtes vous avez compris que s'il y a 16 séquences et que si chaque octet se suffit à lui-même, il va y en avoir trop !

Eh bien non, car il y a 16 groupes de 16 séquences de 1 octet soit 256 donc la totalité...

Il y a deux grands groupes : READ et WRITE
A l'intérieur de chacun de ces groupes, le SEQUENCER exécute les séquences à partir de la première qui est numérotée 0. L'horloge du LSS permet de changer de séquence en fonction du code de la séquence en cours MAIS EGALEMENT en fonction des évenements reçus ET PRESENTS on exécute le code de la séquence de la colonne qui correspond bien à la réunion de ces évenements que sont :
PULSE / NO PULSE
QA' (bit 7 à 0) / QA (bit 7 à 1)
SHIFT / LOAD

Exemple
je suis en séquence numéro B du mode READ, si les évenements sont :
        Etre en mode SHIFT
        Le bit 7 est à 0
        Je n'ai pas reçu de pulse
alors j'exécute le code 59 qui signifie "fait un SHIFT LEFT de 0 et passe en séquence 5"

Pour la même séquence numéro B du mode READ, si les évenements sont :
        Etre en mode SHIFT
        Le bit 7 est à 0
        je reçois un pulse
alors j'exécute le code D9 qui signifie "fait un SHIFT LEFT de 0 et passe en séquence D"


Cela signifie que si un évenement arrive à un moment donné sur une séquence donnée, le code exécuté est celui qui correspond aux dits évenements : on se balance donc en permanence d'une colonne à une autre selon ceux-ci.

Quand aucun évenement n'intervient on reste dans la même colonne. ATTENTION à l'évenement PULSE, dès que l'horloge du séquencer fait passer à la séquence suivente, le PULSE a disparu on passera donc en NO PULSE. Tout cela sera revu en détail plus loin





HACKING CORNER
En examinant les codes du tableau ci-dessus on peut constater un certain nombre de choses intéressantes :

1. Lorsque l'on est en mode écriture (WRITE) les tableaux PULSE et NO PULSE sont strictement identiques... pourquoi ? Eh bien de toute façon quand on écrit sur la disquette le LSS reçoit effectivement des pulses (cf. brochage du dessin précédant) ce qui est tout à fait normal mais ceux ci-doivent être ignorés car on est en train d'écrire et on se fiche eperduement de ce qui pouvait être écrit auparavant donc cela explique le pourquoi des deux tableaux identiques. Bien évidement le déroulement du code se passe tantôt sur l'un tantôt sur l'autre mais les opérations sont absolument identiques.

2. Toujours en mode écriture on notera la parfaite symétrie des opérations LOAD et SHIFT qui impose l'écriture en 32 cycles d'un nibble de 8 bits. Nous verrons dans le mode détaillé du fonctionnement de ces séquences ce qui se passe dès lors que l'on dépasse ce nombre de cycles... l'introduction d'extrabits à 0. Mais on verra aussi ce qui se passe si l'on ne respecte pas ce timing de 32 cycles (4 cycles par bit)

3. L'opération READ/LOAD (les 4 colonnes en bas à droite) correspond au test WRITE PROTECT. Quelle que soit la séquence dans laquelle on entre ou quel que soit le temps que l'on mette pour lire le DATA REGISTER, ce dernier est immédiatement positionné à la valeur ad hoc... puisque le test est un BMI donc sur le bit 7...

Maintenant si vous êtes arrivés jusqu'ici c'est excellent, nous allons essayer de continuer sans les aspirines. Avant de lire la suite, n'ayez pas de complexes si cela ne paraît pas simple, cela ne l'est pas même si j'ai vraiment essayé de faire didactique. Donc... lisez et relisez en essayant de comprendre, en cas d'insommies pendant plusieurs jours n'hésitez pas à envoyer un mail via la rubrique "contact".

DETAIL DU FONCTIONNEMENT POUR L'OPERATION "READ"

DETAIL DU FONCTIONNEMENT POUR L'OPERATION "WRITE"