SST


Version initiale:  20/02/2008.
Dernière mise à jour: 29/11/2008.

NOTE: I don't have enough time to answer your questions about this project...

Il s'agit ici d'un projet personnel.

En début d'année 2008, une personne m'avait poussé à livrer mon travail (incomplet) en l'état en m'affirmant par mail que pour le bien de la communauté comp.sys.apple2 plusieurs programmeurs allaient être recrutés (entendre payés) pour s'atteler à la tache d'un SST complet/débogué afin de le coupler avec un clone en cours de réalisation de la carte E.D.D.: ils ne pouvaient pas se permettre d'attendre que j'avance seul dans mon coin sur ce projet ni de partir de rien (comme je l'avais fait moi). Il était donc très urgent que je donne ce sur quoi j'avais planché: "Can't wait to see what you come up with, and I'm sure I am not alone in this".
A l'heure où j'écris ces lignes (7 novembre 2008), tout cela n'a servi à rien et aucun autre projet utilise SST. J'ai juste vu un prototype de la carte clonée (ce qui a déjà existé de par le passé) et le projet semble sur une voie de garage depuis plusieurs mois.
Bref, comme bien souvent malheureusement, c'était du vent...
Aussi je reprends là où j'en étais et à mon rythme, c'est à dire quand j'en ai envie et sans m'embarrasser à répondre à des sollicitations extérieures sur le sujet.

Sommaire


Lien Contenu
Voir 01) Introduction.
Voir 02) Documentation originale de SST.
Voir 03) Complément documentation.
Voir 04) Pourquoi produire un code source propre de SST?
Voir 05) Comment générer un exécutable du projet?
Voir 06) Quoi de neuf?
Voir 07) Carte mémoire.
Voir 08) Les patchs de Saltine.
Voir 09) Points d'entrée des sous-programmes.
Voir 10) Différences entre ma version de SST et celle de Saltine.
Voir 11) Format des faces en 16 secteurs créées par SST.
Voir 12) La création d'un .nib..
Voir 13) Appendice: le schéma de protection de EDD.
Voir 14) Appendice: Différence entre EDD et EDD+.
Voir 15) Appendice: Code manquant.


COME BACK TO: THE DOTNIB PROJECT.


hr SST


01) Introduction.


Quelques mots pour vous présenter le programme SST...


A L'ORIGINE, UN COPIEUR PERFORMANT...

Il y avait un paradoxe rigolo dans le domaine des logiciels Apple II commercialisés pendant les années 80: sur les étagères des vendeurs de softwares, on trouvait des programmes divers et variés (jeux, utilitaires, ..), la plupart protégés contre la copie par leurs éditeurs respectifs, et une sous-catégorie de logiciels utilitaires particuliers (édités par d'autres sociétés) qui, quant à eux, permettaient d'en faire des duplicatas!
Une bien étrange cohabitation donc!!

Un de ces copieurs, extrèmement évolué, se nommait E.D.D. 4 (Essential Data Duplicator).
E.D.D. permettait de cloner une disquette 5,25 pouces grâce à des routines complexes et un paramétrage étendu.
Comme c'était souvent le cas, la connaissance du type de protection utilisé sur l'original permettait de choisir les paramètres de copie adaptés et donc de réaliser un duplicata dans les meilleures conditions. Pour ceux n'y connaissant rien, l'éditeur publiait à fréquence régulière une liste actualisée des paramètres à utiliser pour dupliquer les derniers logiciels sortis, ce qui mettait le copieur à la portée de presque tout le monde ("presque" dans la mesure où l'utilisateur n'avait pas à régler la vitesse de son drive, process simple mais pouvant rebuter les réfractaires du tournevis ou ceux ayant peur de perdre la garantie de leur lecteur de disquettes).
Lorsqu'un utilisateur employait correctement le copieur, il obtenait une version également exécutable du logiciel d'origine. Si l'original était plombé, le duplicata l'était également - l'objectif du copieur n'étant pas d'oter la protection. (Tout au plus, E.D.D. pouvait changer quelques informations par la biais de certains paramètres: les options de type "Replace" de Pre-Analyze et Pre-Write).
Au final, à une face de la disquette d'origine correspondait une face de la disquette nouvellement créée. 


... MODIFIE EN CHANGEUR DE FORMAT POUR FACILITER LA DIFFUSION DE SOFTS PROTEGES...

SST, qui signifie " Saltine's Super Transcopy ", est une version modifiée de E.D.D. 4.8 pour un usage particulier qui n'est pas celui prévu à l'origine.
Saltine (l'auteur du patch) est le pseudonyme d'un ancien pirate/cracker informatique nord américain.
Il a effectué des modifications sur sa version de E.D.D. sans l'agrément de l'éditeur et a renommé le résultat SST. Ne soyez donc pas surpris quand je parle des routines E.D.D. alors que le sujet est SST.

L'objectif recherché n'était pas la duplication directe à l'identique du logiciel mais d'avoir un moyen pratique pour se passer entre pirates le logiciel sous un format plus facilement manipulable. Je m'explique!
Si un de ses amis ou un de ses contacts achetaient un logiciel fraichement sorti sur les étals des revendeurs (avec une protection non identifiée), comment un pirate pouvait-il le déplomber si l'acheteur habitait à des centaines de kilomètres de là (question d'autant plus vraie dans ce pays immense que sont les USA )? Il y avait toujours la solution d'un envoi postal mais cela supposait que l'acheteur l'expédie par ce biais et en soit donc privé d'usage pendant la phase de déplombage.
Or cétait l'époque des systèmes de bulletins électroniques 'pirates' (BBS) et une diffusion 'rapide' de l'information se faisait par le biais des modems.
Il fallait donc pouvoir se repasser le logiciel à cracker avec ce moyen de communication.

SST entrait alors en jeu: il permettait de faire passer une disquette au format incopiable vers un support facilement duplicable. Le pied puisque sous cette nouvelle forme, l'acheteur pouvait simplement la compresser et l'uploader vers un BBS pour le rendre disponible à toute la faune de pirates qui étaient alors libres de la downloader, décompacter l'image, et reconstituer sur support magnétique le programme dans sa forme originelle toujours à l'aide de SST en opérant en sens inverse (quand ça marchait!).
Puis ensuite "travailler" au corps le soft reconstitué pour faire sauter sa protection et de le transposer au format 16 secteurs par piste (le format standard).
Voilà pour le principe de base.

A l'origine, SST a donc été conçu pour faciliter un acte de piratage. Mais aujourd'hui se pencher sur ce logiciel a plus une optique de conservation du patrimoine informatique passé qu'autre chose.

Pour rentrer un peu plus dans le détail technique, la modification effectuée par Saltine sur E.D.D. 4.8 consiste à ne plus écrire les nibbles lus (depuis la disquette d'origine) sur la disquette cible (=la copie) de la même façon mais à les sauvegarder dans leur intégralité en temps que données sur une disquette au format classique "16 secteurs par piste". C'est à dire que toutes les informations qui définissent le découpage logique de la disquette d'origine (ce qu'on appelle le soft-sectoring, à savoir les markers début/fin des champs adresses & datas, les informations du volume/piste/secteur/checksum, les gaps, ...) sont également écrites comme datas sur la disquette cible.
Ceci revient à créer une image binaire de la disquette dans son intégralité (tout au moins ce qu'a lu SST sur l'original avec les routines d'E.D.D.).

L'inconvénient de ce type d'opération, c'est qu'il faut 2 faces 'standards' pour sauvegarder le contenu d'une face de la disquette d'origine (car la disquette cible doit stocker le soft sectoring normal de la disquette 16 secteurs/piste dans les champs "adresses" ainsi que les informations du soft sectoring de la disquette d'origine dans les champs "datas" en plus des datas normales lues. La conséquence en est qu'une face ainsi dispatchée n'est pas exécutable dans sa nouvelle forme.
Le "Transcopy" du nom de SST signifie une "copie transformée".

                                                                  ___ 
                                                                 |===|
                              ___                                | O |
                             |===|           SST                 |_^_|
1 face protégée:             | O |  ==========================>             2 faces non protégées
                             |_^_|                                ___
                                                                 |===|
                                                                 | O |
                                                                 |_^_|

- soft sectoring NON standard                                    - soft sectoring standard: 16 secteurs/piste
- champs datas pouvant avoir un encodage NON standard            - champs datas avec encodage standard: 6-2
- champs datas contenant un programme et/ou des données          - champs datas contenant le soft sectoring non
                                                                   standard de la disquette protégée ainsi qu'un
                                                                   programme et/ou des données ET le paramètrage EDD
- Programme exécutable mais non copiable                         - Programme NON exécutable mais diffusable


L'opération inverse de reconstitution du soft d'origine exécutable ne fonctionnait pas toujours impeccablement et il arrivait que le programme ne bootait pas correctement (ça dépendait de la protection). En effet, SST ne prend pas en compte toutes les subtilités d'E.D.D., comme la synchronisation des pistes, les nibbles count, les formats mélangés avec des pistes entières, des 1/2 pistes ou des 1/4 de pistes (et donc toutes les joyeusetés comme le spiraling, le track arcing, etc...) car SST est prévu pour fonctionner en utilisant des valeurs par défaut d'E.D.D. qui n'incluent pas ces subtilités.
Et au final une disquette reconstituée (avec le même nombre de faces que l'original) peut très bien être identifiée par le programme une fois lancé comme étant une version pirate (et planter plus ou moins rapidement après le boot).


... PUIS POUR CREER DES IMAGES DISK UTILISABLES AVEC UN EMULATEUR.

L'usage courant de SST n'est pas (ou plus) cette diffusion via BBS mais la création d'images disque.
En effet, à partir des 2 faces constituées, il est possible de créer un fichier .nib utilisables avec des émulateurs d'Apple II.
Bien entendu toutes les limitations citées ci-dessus sont toujours d'actualité pour les .nib constitués, ce qui limite l'intérêt de SST pour un bon nombre de programmes protégés mais c'est à ce jour le plus utilisé parmi les rares outils disponibles pour créer des images disque sous la forme de nibbles.
Le schéma simplifié est le suivant:

                         ___
                        |===|
                        | O |                               ____
                        |_^_|              SST             |0101|
2 faces non protégées:         ==========================> |1010|  1 fichier .NIB pouvant inclure certaines              
                         ___            CiderPress         |0101|  protections
                        |===|             etc...           |____|
                        | O |
                        |_^_|


L'objectif de cette page web est de décortiquer SST (et donc E.D.D 4.8 par la même occasion).
Ceci afin d'en avoir une version propre avec son source complet, ce que n'avait pas fait Saltine...

A l'époque où je l'avais contacté, il m'avait encouragé dans cette voie:

"I'D LOVE TO SEE YOU CONTINUE THE WORK"    SALTINE


Retour au sommaire 

hr SST


02) Documentation originale de SST.


Il s'agit ici de la documentation d'origine livrée avec SST et écrite par Saltine.



                               How to use

                               S    S    T

                         Saltine's Super Transcopy

*** Introduction ***

      Back in the good old days when the Apple computer thrived, there
 existed various groups of individuals who's existance revolved
 around the removal of copy protection from Apple software.  These groups,
 while they had the same goal, were very competative.  They attempted to
 remove the protection from a piece of software as fast as possible, so
 they could "release" it to the Pirate world.  The groups were composed of
 various individuals that each possessed a certain talent; one might be
 skilled in creating title graphics while another in removal of protection,
 and still another in distributing the "cracked" software.  Once a "ware"
 was released, the first thing that needed to be done was to get it to the
 "cracker" to remove the protection.  Since the "ware" was protected from
 copying, it could not be sent via modem, so it had to be sent via
 snail-mail.  This program was the result of an attempt to allow the user
 to send protected software via modem.

*** What is it? ***

      SST is a modification of a popular copy program for the Apple line
 of computers.  The copy program allows the user to duplicate almost any
 Apple // disk.  It occurred to me that this program has to store the image
 of a track in memory before it can write it to the copy of the disk.  I
 obtained a copy of the source code from the manufacturer for $20.  Using
 that, I modified the program so that instead of copying a disk, it reads
 a track, and then dumps the track image to a normal DOS 3.3 formatted
 floppy.  This of course took more space than the original track, resulting
 in two DOS 3.3 disk sides for each protected disk side.  The advantage,
 of course, was that these DOS 3.3 formatted disks could be sent via the modem.
 Once somebody received these disks over the modem, SST could be used once
 again; this time to read the track image into memory and write the
 protected track back to a disk.

 Yeah, but I'm using an emulator!  Emulators can't use protected disks!

 WRONG!  If the DOS 3.3 disks described above are transferred to an emulator,
 and that emulator supports nibble images, SST can create a "protected"
 disk image!  Of course, it won't be very protected any more as you can
 copy the resulting disk image just like any other file.

Transfering Disks:

*TO* Apple //

 To use SST, you first have to transfer SST to a REAL
 apple disk.  Here is a suggestion on how to do that.

 What you need:  Apple // with a terminal program (AE works fine)
                 Null Modem Cable
                 DOS 3.3 formatted 5 1/4 bootable disk
                 Amiga, Mac, PC, with a terminal program
                 This archive
                 Patience

 1)  Use a terminal program to transfer SST and CopyII
     to the dos 3.3 formatted disk.

 2)  If you are using an Amiga also transfer DDD to the Apple disk
 
 3)  That's it!

 NOTE: You can skip the above steps if you have the ability to transfer
 disk images directly to the Apple //.  Transfer the SST.dsk image included
 in this archive to an Apple // disk.

*FROM* Apple //

 There are three major ways of transfering Apple disks:

 1)  The Amiga computer with an A1020 5.25 drive and the disk conversion
     program provided with the Apple2000 emulator.
les nibbles count
 2)  A serial link between a real Apple ][ and another computer.  This
     requires special software on both sides.

 3)  Compress the disk using Dalton's Disk Disintegrator (DDD), transfer
     it via a telecom program to an Amiga, load it into Apple 2000,
     save it with a .dsk extension.

 If you need more info on transfering disks, refer to the Apple FAQ.

*** Using SST ***
 
 O.K. Now that you have SST on an Apple Dos 3.3 formatted disk:

 0)   Make sure any "Quick disk" options are disabled on the emulator
 1)   Format an Apple floppy on both sides.  (INIT HELLO)
 2)   Put the Dos 3.3 disk with SST on it in drive 1
      BRUN SST
 3)   Select '1' for 'Pirate a Disk'
 4)   Select '2' for 'Pack Disk'
 5)   Use all of the Default settings
 6)   Place copy protected disk in drive 1
        (You can use one drive, but will have to swap disks when prompted)
 7)   Place Formatted floppy in drive 2
 8)   Select all defaults - when the message 'Insert BOTH disks and press
      RETURN' is presented, press RETURN.  At track 17 you will be prompted
      to flip the data disk (in drive 2) over - do it!

 9)   When the copying is done, transfer both sides of the data disk to
      disk images using one of methods described earlier in this text.
      Call the front of the disk FRONT.DSK and the back BACK.DSK

 10)  Load the disk image for SST into disk 1 of the emulator.
 11)  Copy the blank.nib image to an appropriate name (e.g. game.nib)
 12)  Load the game.nib image into disk 2 of the emulator.

 (Steps 13 - 18 are necessary due to a bug in SST which fails to move the
  disk arm back to track 0 on drive 2)

 13)  Reboot the emulator
 14)  Select 'E' for Copy II+ 5.0 from the boot menu (CAPS LOCK MUST BE ON!)
 15)  Go to Sector Editor
 16)  Select Disk B
 17)  Type the letter 'R' to read a sector
 18)  Type '0' for the Track and '0' for the sector pressing ENTER after each.
 19)  Reboot the emulator

 20)  Choose 'B' for EDD/SST from the boot menu (CAPS LOCK MUST BE ON!)
 21)  Choose 'Pirate a Disk'
 22)  Choose '3' to unpack a disk
 23)  Choose '1' for packed parms
      (You may choose '2' for your parms, but you need to know what you
       are doing!  If you want to nibble count the track, choose the
       manual nibble count option when it is presented.  This will not
       work right now because the emulators do not have any way of changing
       individual track lengths on the fly.  This means that any disks that
       need precise track lengths will not work until the new standard is
       implemented)

 24)  Use all default options
      (You can unpack only certain tracks if you desire)
 25)  When the message 'Insert BOTH disks, then press RETURN' appears,
      insert the FRONT.DSK image in drive 1 and press RETURN
 26)  When the message 'Turn DATA disk over and press RETURN' appears,
      insert the BACK.DSK image in drive 1 and press RETURN
 27)  When process is finished, I would either close the emulator down
      or put another image in drive 2 to make sure the .nib file gets
      closed properly.
 28)  Insert the new .nib file in drive 1 of the emulator and reboot it
      to see if it works.

That's it! Easy huh? :^)

                                Saltine


Retour au sommaire 

hr SST


03) Complément documentation.



Quelques informations complémentaires sur la disquette SST d'origine...
En effet la doc de Saltine a l'avantage d'être synthétique mais il manque des explications qui peuvent être utiles.


LANCEMENT DE SST

Pour lancer SST, il suffit d'exécuter la commande DOS: BRUN SST (si vous avez booté depuis une disquette différente) ou de choisir le programme SST (=option B) dans la liste proposée (si vous avez booté la disquette d'origine):

Start SST


LES NOUVEAUTES INTRODUITES PAR SST AU NIVEAU DES MENUS

Quand on compare les écrans de E.D.D. et SST, on s'aperçoit vite que Saltine a effectué des modifications de menus.

*** 1. PIRATE A DISK ***

L'option "PIRATE A DISK" de SST remplace l'option "BACK UP A DISK" d'E.D.D. Mais cette dernière n'a pas disparue comme on va le voir plus bas.

EDD 4.2 screen
SST screen
EDD 4.2 Main Menu
SST Main Menu

Si on choisit l'option "PIRATE A DISK" dans SST, on obtient un sous-menu:

SST screen
SST: Pirate a disk

Rôle de ces 3 options:

1) COPY => Il s'agit de l'ancienne option d'E.D.D.  " 1) Back up a disk " qui a rétrogradé dans ce sous-menu.
Normalement cette option ne s'utilise que sur un Apple II réel pour dupliquer une disquette physique incluant (de préférence!) une protection. Pour une disquette non protégée, il y a beaucoup plus rapide que E.D.D. (par exemple Locksmith Fast Copy, ...)


2) PACK => Cette option est à employer sur un Apple II réel pour transformer une face de disquette protégée en 2 faces de disquettes 16 secteurs par piste.
Par défaut les caractéristiques de la lecture seront les suivantes:

SST screen
Pack: Get parms screen (default values)

Il y a un point important qui n'est pas expliqué dans la doc.
Saltine se contente de dire qu'il faut laisser les caractéristiques de copie par défaut.

--> Mais ce n'est pas nécessairement souhaitable pour toutes les protections!!!

Comme je l'ai déjà dit, SST est basé sur E.D.D. Or E.D.D. pour travailler utilise plusieurs buffers internes de paramètres dont 3 très importants:
a) $B100-$B1FF : PreWrite Buffer
b) $B200-$B2FF : Program Variables
c) $B300-$B3FF : Parameter Buffer
Quand SST parle de "parms", il est question de ces 3 buffers.

E.D.D. traite les pistes choisies (au niveau de 'Start Track' et 'End Track') les unes après les autres à l'aide de ces paramètres.
En gardant les caractéristiques de copie par défaut, toutes les pistes (de la 0 à la 34) seront exploitées avec le même paramétrage.

Il est important de rappeler que ces paramètres sont modifiables par l'utilisateur pour réaliser au mieux le traitement.

En fait, rien n'empêche un utilisateur de traiter les 35 pistes d'un soft protégé en plusieurs fois. Par exemple lancer l'option Pack pour une 1ère phase de la piste 0 à la piste 12 avec un certain paramétrage puis relancer l'option Pack pour une seconde phase de la piste 13 à la piste 34 avec un autre paramétrage.
On peut même si on le souhaite lancer l'option Pack 35 fois: pour chacune des pistes de la face protégée avec à chaque fois un paramétrage différent.
Une explication toute simple est qu'une protection peut se trouver que sur certaines pistes seulement par exemple...
La conséquence de cette souplesse de SST, c'est que pour s'y retrouver s'il devait faire l'opération dans le sens inverse (Unpack), il est obligé de stocker ces paramètrages directement sur la disquette cible (16 secteurs par piste) sous forme de 3 secteurs de plus (pour l'espace $B100-$B3FF) et ce pour chaque piste de la disquette d'origine traitée.


3) UNPACK => L'option Unpack s'emploie dans 2 cas de figure: quand on veut recréer une face de disquette physique protégée sur un Apple II réel à partir de 2 faces constituées avec l'option Pack OU quand on utilise un émulateur pour créer un fichier .NIB à partir de 2 fichiers .DSK.
Cette option affiche un sous menu supplémentaire:

SST screen
SST: Unpack

J'ai parlé de la sauvegarde de l'espace $B100 à $B3FF pour l'option Pack. Ce qu'il faut savoir, c'est que l'option Unpack va charger pour chaque piste à reconstituer le paramétrage interne (les 3 pages de l'espace $B100 à $B3FF) sauvegardé sur la disquette 16 secteurs par piste (c'est à dire le paramétrage qu'il y avait en mémoire au moment du pack).
Si vous avez modifié ce paramétrage après le Pack et que vous choisissez "Packed parms" pour faire un Unpack, tous vos changements vont être perdus et ce sera l'ancien paramétrage rechargé depuis la disquette 16 secteurs/piste qui sera utilisé!
En choisissant l'option "your parms", SST va mettre de côté les caractéristiques de flags "Nibble Count" et "Synchronized Track" (saisi sur l'écran suivant) ainsi que l'espace mémoire $B300-$B3FF (parameter buffer) UNIQUEMENT et les restaurer après le chargement des 3 secteurs (qui a écrasé l'espace $B100-$B3FF) . Vous aurez ainsi préservé UNE PARTIE de votre paramétrage actuel et c'est avec ces informations que la recombinaison aura lieu.

Que vous choisissiez 1 ou 2, vous aurez à choisir la piste de début, la piste de fin et le pas de piste pour votre traitement.

SST screen
Unpack Get parms screen (default values)


*** 8. CLEAR TRACK DATA ***

Revenons au niveau du menu principal de SST.
On constate que le libellé de l'option 8 a changé comme l'atteste ces copies d'écrans:

EDD screen
SST screen
EDD: Clear Error Codes
SST: Clear Track Data

Au lieu d'avoir "Clear error codes" on a "Clear track data".
Mais en fait rien n'a été modifié au niveau programme. Cette option sert toujours à effacer (entre autres) les statuts du traitement précédant en haut de l'écran (c'est à dire les lignes qui indiquent si une erreur a été rencontrée sur une piste entière, un 1/4 de piste, une 1/2 piste, 3/4 piste ou si tout s'est bien passé). Le programme se contente de spécifier qu'au prochain ménage écran il faudra commencer à l'ordonnée écran 0 au lieu de 8 (donc en ne préservant pas l'en-tête "track informations".

Peut-être que Saltine trouvait ça plus parlant... mais moi je trouve que ça porte à confusion car je croyais que c'était le buffer de stockage de la dernière piste lue qui était mis à zéro. A moins qu'il ai oublié de faire cette modification!
Donc rien de neuf ici.


*** 9. INITIALIZE A DISK ***

EDD screen
SST screen
EDD: Quit
SST: Initialize a Disk

L'option 9 de E.D.D. qui permettait de quitter le programme a été remplacée par une option de formattage (probablement pour faciliter la préparation des disquettes au format 16 secteurs par piste que l'on utilise pour Pack).
Ci-dessous les 2 écrans qui s'affichent quand on choisit cette fonction de formattage:

SST Screen
SST Screen
SST Init A Disk screen #1
SST Init A Disk screen #2

Il ne reste plus qu'à faire un reset ou un reboot à chaud pour sortir du programme!


A PROPOS DE LA NUMEROTATION DES PISTES

Ici je vais vous parler de E.D.D.
Ce copieur supporte les pistes dites entières, les 1/4 de pistes, les 1/2 pistes et les 3/4 de pistes.
Il a donc un 'pas' toléré de 0,25.
Le programme étant écrit en assembleur, il ne s'amuse à pas gérer des décimales pour 0,25 / 0,5 / 0,75.
Pour plus de facilité, les numéros de pistes entières sont des multiples de 4 en interne.

Illustration.
Représentation du pas (step en anglais) de 0,25:

|---|---|---|---|---|---|---|---|...   ...|---|---|---|---|---|---|---|---|     Genuine disk
00              01              02        21              22              (23)  Track numbers (hex)
   .25 .50 .75     .25 .50 .75               .25 .50 .75     .25 .50 .75        Steps


Et valeurs de 'pistes' utilisées en interne par E.D.D.:.

*---|---|---|---*---|---|---|---*...   ...*---|---|---|---*---|---|---|---*     EDD (internal use)
00  01  02  03  04  05  06  07  08        84  85  86  87  88  89  8A  8B  (8C)  Track numbers

this is true for the following variables in the program variable storage buffer ($B200-$B2FF):
STARTRK $B288 (genuine track * 4)
ENDTRK  $B289 (genuine track * 4)
TRACK   $B28B (genuine track * 4)

STEP    $B28A [=$04 if the user entered step = 1]


PRECISION SUR LES CARACTERISTIQUES DE COPIE PAR DEFAUT

Saltine spécifie que pour utiliser SST il faut laisser les caractéristiques de copie par défaut, à savoir un pas de 1.

On peut se poser la question suivante: est-il possible de prendre en compte des informations stockées sur des pistes non entières (0,25 / 0,5 / 0,75), donc en ayant un pas inférieur à 1 ou en commençant par une piste 'non entière'?

Par exemple, il serait intéressant qu'à partir d'une face d'un original on puisse créer n faces en "16 secteurs par piste" afin de récupérer le plus d'informations possibles (par exemple en fixant comme paramétrage de la 1ère copie "la 1ère piste lue est une demi piste et continuer avec un pas de 1 pour lire toutes les 1/2 pistes" et un paramétrage normal pour la 2nde copie pour récupérer le contenu de toutes les pistes 'entières') puis de mixer manuellement les n faces générées pour avoir quelque chose de plus précis.

=> Malheureusement, ça ne peut pas fonctionner!!! SNIF!!!

Tout ça parce que SST utilise la notion de piste de la disquette d'origine pour calculer la piste sur laquelle il doit écrire (en 16 secteurs/piste).
Il prend comme on l'a vu juste au dessus le numéro de piste interne multiple de 4 et fait un LSR pour diviser par 2 la valeur de piste de la disquette protégée.
Par exemple si le numéro de piste interne est 8 (track 2), on obtient 8/2 = 4. Il écrira la piste protégée actuellement en mémoire sur la disquette 16 secteurs/piste à partir de la piste 4 (jusqu'à 5).

Donc en plus des protections par synchronisation des pistes, par nibble count: (cf point 23 de la doc), tout ce qui a attrait aux 1/4 & 1/2 & 3/4 de pistes ainsi qu'aux mélanges des genres (spiraling, track arcing, ...) ne peut pas être reproduit. SST n'est pas une solution miracle en l'état!!!.


Retour au sommaire 

hr SST


04) Pourquoi produire un code source propre de SST?


Dans l'introduction, j'ai spécifié l'objectif mais je ne l'ai pas expliqué.

Avoir un source propre et complet de SST sera le point de départ pour d'autres projets: entre autres, la mise au point d'un programme permettant de constituer des .nib directement sur une unité ProDOS plutôt que de passer par 2 faces transitoires et aussi plus tard de créer un nouveau format qui permettra d'exploiter toutes les caractéristiques de E.D.D. (nibble count, synchronisation des pistes, 1/4 pistes, 1/2 pistes, 3/4 pistes).

Quelques messages en anglais issus du forum comp.sys.apple2 signalant la nécessité actuelle de ventiler une face protégée vers 2 faces 16 secteurs/piste sur support physique 'floppy disk' et le besoin de simplification:

Messages from comp.sys.apple2 (apr 2004) about SST:

**********

Andy McFadden wrote:

...
> Each disk side turns into two, which are then transferred
> like any other unprotected disk (e.g. with ADT over a serial
> cable, or if you have the hardware, with ShrinkIt and
> AppleTalk).
> The two images are then recombined by running SST in an
> emulator or <shameless plug> with CiderPress.

> It's a slow and somewhat painful process...
...

**********

Rubywand wrote:

...
> Unfortunately, Saltine's Super Transcopy (SST) was designed to
> transfer copy-protected disks using just 5.25" media.
> It was not designed to create .nib files you could store on
> 800k diskettes or hard disk. So, creating a .nib with SST
> involves a transfer and combining process such as described by Andy.
...

**********

Ed Eastman wrote:

...
> SST is a cool program... Essentially it uses the EDD source code
> to read a track and analyse it to find start and arbitrarily
> end it at a fixed length.

> There is no reason that someone couldn't write a Q&D program
> to do that without the transfer stage.
...

Note de Deckard: Q&D = quick and dirty


Retour au sommaire 

hr SST


05) Comment générer un exécutable du projet?


L'objectif est ici de voir comment construire un binaire exécutable à partir des différents sources qui constituent SST.
C'est ultra simple!
Il vous faut juste l'assembleur MERLIN-8 de Glen Bredon en version ProDOS.
Personnellement j'utilise la version 2.58 mais une autre devrait aussi faire l'affaire.
Vous devez également récupérer l'image disk .hdv fournie un peu plus bas dans cette page.
Elle contient les sources sous ProDOS.
Le nom de volume est /DOTNIB.SST.

Tout d'abord assemblez les différents sources se trouvant dans le répertoire /DOTNIB.SST/SRC/ à l'exception de:
EDD.PAGE0.S
EDD.ROM.S
EDD.KEYS.S

Pour cela, chargez un source après l'autre, tapez ASM à chaque fois puis NEW quand le message "--End assembly" s'affiche.
Chaque constituante binaire sera écrite automatiquement dans le répertoire /DOTNIB.SST/SRC/OBJ/DECKARD/ car en fin de chaque source se trouve la directive SAV OBJ/DECKARD/<objet>

Quand c'est fait, bootez l'image disk .hdv et tapez:

PREFIX SRC/OBJ/DECKARD
-SST.BUILDER

Pour info, SST.BUILDER est un fichier TXT de type EXEC qui va charger les constituantes et écrire dans le répertoire SRC/OBJ/DECKARD le programme final  SST.DECKARD

Une fois que c'est fait, il ne reste plus qu'à transférer SST.DECKARD sur une disquette sous DOS 3.3 et l'exécuter.
Je vous rappelle que le programme n'a pas été écrit pour fonctionner sous ProDOS car il écrase une partie de ce derrnier.
Si vous l'exécutez quand même, vous devrez rebooter un ProDOS après.

Si vous êtes curieux, vous aurez constaté qu'il existe un répertoire SRC/OBJ/SALTINE et un répertoire SRC/OBJ/EDD.4.9.
Le 1er contient les constituantes du SST d'origine (uniquement les binaires) et le 2nd une constituante qui manquait (également le binaire).
J'ai comparé ces binaires avec ceux de ma version SST.DECKARD pour vérifier que tout était ok.


Retour au sommaire 

hr SST


06) Quoi de neuf?


Les informations sont présentées ici de la plus récente à la plus ancienne.

Version
========
20081128

- refonte en profondeur de cette page (tout en français avec plus de détails)


Version (non diffusée)
========
20080716

- Commentaires de EDD.B000.B4FF
- Création de SST.BUILDER
- Mise à jour de cette page (cartes coloriées pour une meilleure lisibilité, suppression références COMPSYSA2)


// Arrêt temporaire dû à la naissance de mon fils Paul (20080415)


Version
========
20080218

- Transfert du code original de DOS vers ProDoS
- Utilisation de Sourceror pour produire un 1er jet du code source
- Normalisation des labels en référence croisée entre tous les modules
- Cartographie mémoire
- Cartographie des échanges mémoire (swaps)
- Cartographie du contenu des faces en 16 sectors/piste créées par SST
- Compréhension et rédaction des commentaires des sources spécifiques SST pour:
  SST.CONTROLER
  SST.RELOCATOR
  SST.SUBS
  SST.RWTS
- Synchronisation PDF EDD/sources (étiquettes, commentaires, ...) pour les modules:
  EDD.TEXT
  EDD.CHECKMEM
  EDD.HGR2PRT (extrait de EDD 4.9)
  EDD.PAGE0
  EDD.ROM
- En cours également:
  EDD.B000.B4FF
- Création de cette page html.
- Ajout de quelques commentaires dans:
  EDD.MAIN
  EDD.OPT2.OPT1
  EDD.DRIVE


A FAIRE:

Remplacement attentif des labels générés automatiquement par SOURCEROR par ceux de la version E.D.D. officielle (le PDF dispo) pour les sources suivants:

EDD.MAIN
EDD.OPT2.OPT1
EDD.OPT4.OPT5
EDD.OPT3.OPT7
EDD.ANALYZE
EDD.CONTROL
EDD.DRIVE

Attention: E.D.D. 4.2 et SST (E.D.D. 4.8) ont du code différent et un remplacement "bête et méchant" d'un label SOURCEROR par un du PDF n'est pas toujours possible.


800k
ProDOS
Download SST Source code - release 20081128

File: DotNIB_SST.hdv
Disk: ProDOS /DOTNIB.SST (800KB)
 Name                             Type Auxtyp Modified         Format   Length
------------------------------------------------------------------------------
 PRODOS                           SYS  $0000  21-Oct-08 00:07  ProDOS    17128
 RAM.DRV.SYSTEM                   SYS  $2000  26-May-92 21:27  ProDOS     1209
 BASIC.SYSTEM                     SYS  $2000  13-Feb-92 01:00  ProDOS    10240
 SRC                              DIR  $0000  28-Nov-08 15:04  ProDOS     1024
 SRC:EDD.ANALYZE.S                TXT  $0000  19-Jun-08 18:30  ProDOS     9751
 SRC:EDD.TEXT.S                   TXT  $0000  19-Jun-08 18:28  ProDOS     8120
 SRC:EDD.CONTROL.S                TXT  $0000  19-Jun-08 18:29  ProDOS     6740
 SRC:EDD.B000.B4FF.S              TXT  $0000  27-Jun-08 19:41  ProDOS    12558
 SRC:EDD.DRIVE.S                  TXT  $0000  19-Jun-08 18:30  ProDOS    16039
 SRC:EDD.MAIN.S                   TXT  $0000  16-Jul-08 22:45  ProDOS    19603
 SRC:EDD.OPT2.OPT1.S              TXT  $0000  19-Jun-08 18:32  ProDOS     8796
 SRC:SST.RWTS.S                   TXT  $0000  19-Jun-08 18:32  ProDOS    17903
 SRC:EDD.OPT3.OPT7.S              TXT  $0000  19-Jun-08 18:33  ProDOS     6071
 SRC:EDD.OPT4.OPT5.S              TXT  $0000  19-Jun-08 18:33  ProDOS     3306
 SRC:SST.CONTROLER.S              TXT  $0000  19-Jun-08 18:34  ProDOS     4786
 SRC:SST.SUBS.S                   TXT  $0000  19-Jun-08 18:35  ProDOS    19836
 SRC:OBJ                          DIR  $0000  25-Nov-08 17:13  ProDOS      512
 SRC:OBJ:SALTINE                  DIR  $0000  18-Feb-08 00:46  ProDOS     1024
 SRC:OBJ:SALTINE:SST              BIN  $0B00  [No Date]        ProDOS    21760
 SRC:OBJ:SALTINE:SST.CONTROLER    BIN  $B500  17-Feb-08 15:39  ProDOS      512
 SRC:OBJ:SALTINE:EDD.TEXT         BIN  $3000  [No Date]        ProDOS     4096
 SRC:OBJ:SALTINE:SST.SUBS         BIN  $1D00  [No Date]        ProDOS     1792
 SRC:OBJ:SALTINE:SST.RWTS         BIN  $B700  [No Date]        ProDOS     2304
 SRC:OBJ:SALTINE:EDD.MAIN         BIN  $0C00  [No Date]        ProDOS     3014
 SRC:OBJ:SALTINE:EDD.OPT2.OPT1    BIN  $17C6  18-Feb-08 00:21  ProDOS     1338
 SRC:OBJ:SALTINE:EDD.OPT4.OPT5    BIN  $1D00  18-Feb-08 00:31  ProDOS      512
 SRC:OBJ:SALTINE:EDD.B000.BFFF    BIN  $B000  [No Date]        ProDOS     4096
 SRC:OBJ:SALTINE:EDD.DRIVE        BIN  $4700  [No Date]        ProDOS     2304
 SRC:OBJ:SALTINE:EDD.B000.B4FF    BIN  $B000  [No Date]        ProDOS     1280
 SRC:OBJ:SALTINE:EDD.OPT3.OPT7    BIN  $2100  18-Feb-08 00:36  ProDOS     1280
 SRC:OBJ:SALTINE:EDD.ANALYZE      BIN  $2600  18-Feb-08 00:46  ProDOS     1562
 SRC:OBJ:SALTINE:EDD.CONTROL      BIN  $2C1A  [No Date]        ProDOS      998
 SRC:OBJ:SALTINE:EDD.CHECKMEM     BIN  $1F00  [No Date]        ProDOS      512
 SRC:OBJ:SALTINE:SST.RELOCATOR    BIN  $0B00  17-Feb-08 15:52  ProDOS      256
 SRC:OBJ:DECKARD                  DIR  $0000  25-Nov-08 17:13  ProDOS     1024
 SRC:OBJ:DECKARD:SST.CONTROLER    BIN  $B500  25-Nov-08 17:06  ProDOS      512
 SRC:OBJ:DECKARD:EDD.TEXT         BIN  $3000  25-Nov-08 17:04  ProDOS     4096
 SRC:OBJ:DECKARD:SST.SUBS         BIN  $1D00  25-Nov-08 17:06  ProDOS     1792
 SRC:OBJ:DECKARD:EDD.MAIN         BIN  $0C00  25-Nov-08 17:05  ProDOS     3014
 SRC:OBJ:DECKARD:EDD.OPT2.OPT1    BIN  $17C6  25-Nov-08 17:05  ProDOS     1338
 SRC:OBJ:DECKARD:EDD.OPT4.OPT5    BIN  $1D00  25-Nov-08 17:06  ProDOS      512
 SRC:OBJ:DECKARD:EDD.B000.B4FF    BIN  $B000  25-Nov-08 17:04  ProDOS     1280
 SRC:OBJ:DECKARD:EDD.DRIVE        BIN  $B700  25-Nov-08 17:05  ProDOS     2304
 SRC:OBJ:DECKARD:EDD.OPT3.OPT7    BIN  $2100  25-Nov-08 17:05  ProDOS     1280
 SRC:OBJ:DECKARD:EDD.ANALYZE      BIN  $2600  25-Nov-08 17:02  ProDOS     1562
 SRC:OBJ:DECKARD:EDD.CONTROL      BIN  $2C1A  25-Nov-08 17:04  ProDOS      998
 SRC:OBJ:DECKARD:SST.RWTS         BIN  $B700  25-Nov-08 17:05  ProDOS     2304
 SRC:OBJ:DECKARD:EDD.CHECKMEM     BIN  $1F00  25-Nov-08 17:06  ProDOS      512
 SRC:OBJ:DECKARD:SST.RELOCATOR    BIN  $0B00  25-Nov-08 17:06  ProDOS      256
 SRC:OBJ:DECKARD:EDD.HGR2PRT      BIN  $0800  25-Nov-08 17:06  ProDOS      768
 SRC:OBJ:DECKARD:SST.BUILDER      TXT  $0000  [No Date]        ProDOS      406
 SRC:OBJ:DECKARD:SST.DECKARD      BIN  $0B00  25-Nov-08 17:13  ProDOS    22528
 SRC:OBJ:EDD.4.9                  DIR  $0000  01-Feb-08 13:59  ProDOS      512
 SRC:OBJ:EDD.4.9:EDD.HGR2PRT      BIN  $0800  [No Date]        ProDOS      768
 SRC:EDD.CHECKMEM.S               TXT  $0000  19-Jun-08 18:35  ProDOS    11214
 SRC:EDD.HGR2PRT.S                TXT  $0000  19-Jun-08 18:37  ProDOS     3691
 SRC:SST.RELOCATOR.S              TXT  $0000  19-Jun-08 18:37  ProDOS     1581
 SRC:TMP                          DIR  $0000  28-Nov-08 15:04  ProDOS      512
 SRC:EDD.PAGE0.S                  TXT  $0000  19-Jun-08 18:38  ProDOS      988
 SRC:EDD.ROM.S                    TXT  $0000  19-Jun-08 18:38  ProDOS     1144
 SRC:EDD.KEYS.S                   TXT  $0000  16-Jul-08 16:00  ProDOS      552
------------------------------------------------------------------------------

NOTE: SST is a DOS 3.3 program and is not compatible with ProDOS because both programs use the bank 2 memory
I put this source code under ProDOS... ONLY because I wanted to work with a 800k .HDV (and Applewin or Apple Oasis)


Retour au sommaire 

07) Carte mémoire.


*****************************
* MEMORY MAP OF EDD 4.8/SST *
*  ==> BEFORE RELOCATOR <== *
*****************************

SST $0B00-$62FF (L$5800=22528)

              RELOCATED
BLOAD ADDR      (Y/N)     FILENAME       LEN HEX/DEC    DESCRIPTION
===========   =========   =============  =============  ===========================================
$0B00-$0BFF :     N     : SST.RELOCATOR  (L$0100/0256)  Relocator
$0C00-$17C5 :     N     : EDD.MAIN       (L$0BC6/3014)  Main EDD routines
$17C6-$1CFF :     N     : EDD.OPT2.OPT1  (L$053A/1338)  Change parameters + back up a disk options
$1D00-$1EFF :     N     : EDD.OPT4.OPT5  (L$0200/0512)  Scan disk + certify & erase disk options
$1F00-$20FF :     N     : EDD.CHECKMEM   (L$0200/0512)  Memory protection scheme
$2100-$25FF :     N     : EDD.OPT3.OPT7  (L$0500/1280)  Drive speed + drive examine options
$2600-$2C19 :     N     : EDD.ANALYZE    (L$061A/1562)  Analyze a disk module
$2C1A-$2FFF :     N     : EDD.CONTROL    (L$03E6/0998)  Control module
$3000-$3FFF :     N     : EDD.TEXT       (L$1000/4096)  Text tables & addresses
$4000-$44FF :     Y     : EDD.B000.B4FF  (L$0500/1280)  EDD buffers
$4500-$46FF :     Y     : SST.CONTROLER  (L$0200/0512)  SST controller
$4700-$4FFF :     Y     : EDD.DRIVE      (L$0900/2304)  Disk drive routines
$5000-$58FF :     Y     : SST.RWTS       (L$0900/2304)  RWTS for SST
$5900-$5FFF :     Y     : SST.SUBS       (L$0700/1792)  Subroutines for SST
$6000-$62FF :     Y     : EDD.HGR2PRT    (L$0300/0768)  Write 16 lines on the bottom of HGR2 screen


*****************************
* MEMORY MAP OF EDD 4.8/SST *
* ===> AFTER RELOCATOR <=== *
*****************************

Note:
The code is never executed in the storage location (alt bank & bank 2).
It must be in main memory. So a swap is required between storage
location address and exec address before running it.

                                       STORAGE
RELOCATED                              LOCATION
ADDR         EXEC ADDR    BLOAD ADDR   ADDR (SWAP)          FILENAME       LEN     DESCRIPTION
===========  ===========  ===========  ==================  =============  ======== ======================================
$0800-$0AFF  $0800-$0AFF  $6000-$62FF  <no swap>           EDD.HGR2PRT    (L$0300) Write 16 lines (bottom of HGR2)
$0B00-$0BFF  $0B00-$0BFF  $0B00-$0BFF  <no swap>           SST.RELOCATOR  (L$0100) Relocator
$0C00-$17C5  $0C00-$17C5  $0C00-$17C5  <no swap>           EDD.MAIN       (L$0BC6) Main EDD routines
$17C6-$1CFF  $17C6-$1CFF  $17C6-$1CFF  <no swap>           EDD.OPT2.OPT1  (L$053A) Change params + back up a disk options
$1D00-$1EFF  $1D00-$1EFF  $1D00-$1EFF  $E000-$E1FF alt bk  EDD.OPT4.OPT5  (L$0200) Scan disk + certify/erase disk options
$1F00-$20FF  $1F00-$20FF  $1F00-$20FF  $E200-$E3FF alt bk  EDD.CHECKMEM   (L$0200) Memory protection scheme
$2100-$25FF  $2100-$25FF  $2100-$25FF  $E400-$E8FF alt bk  EDD.OPT3.OPT7  (L$0500) Drive speed + drive examine options
***********  $2500-$25FF  ***********  ******************  *************  (L$0100) Backup of EDD params buff (unpack)
$2600-$2C19  $2600-$2C19  $2600-$2C19  $E900-$EF19 alt bk  EDD.ANALYZE    (L$061A) Analyze a disk module
$2C1A-$2FFF  $2C1A-$2FFF  $2C1A-$2FFF  $EF1A-$F2FF alt bk  EDD.CONTROL    (L$03E6) Control module
$3000-$3FFF  <datas>      $3000-$3FFF  $F300-$F4FF alt bk  EDD.TEXT       (L$1000) Text tables & addresses
$4000-$77FF  <datas>      ***********  <no swap>           *************  (L$3800) Raw disk byte buffer
$7800-$AFFF  <datas>      ***********  <no swap>           *************  (L$3800) Track buffer & Timing bit buffer
$B000-$B0FF  <datas>      $4000-$40FF  <no swap>           EDD.B000.B4FF  (L$0100) EDD Preanalyze buffer
$B100-$B1FF  <datas>      $4100-$41FF  <no swap>           EDD.B000.B4FF  (L$0100) EDD Prewrite buffer
$B200-$B2FF  <datas>      $4200-$42FF  <no swap>           EDD.B000.B4FF  (L$0100) EDD Program variables storage buffer
$B300-$B3FF  <datas>      $4300-$43FF  <no swap>           EDD.B000.B4FF  (L$0100) EDD Parameter buffer
$B400-$B4FF  <datas>      $4400-$44FF  <no swap>           EDD.B000.B4FF  (L$0100) EDD Parameter buffer (reserved)
$B500-$B6FF  $B500-$B6FF  $4500-$46FF  <no swap>           SST.CONTROLER  (L$0200) SST controller
$B700-$BFFF  $B700-$BFFF  $4700-$4FFF  $D700-$DFFF bank 2  EDD.DRIVE      (L$0900) Disk drive routines
$D700-$DFFF  $B700-$BFFF  $5000-$58FF  $D700-$DFFF bank 2  SST.RWTS       (L$0900) RWTS for SST
$E000-$E6FF  $1D00-$23FF  $5900-$5FFF  $E000-$E6FF alt bk  SST.SUBS       (L$0700) Subroutines for SST


*****************************
* MEMORY MAP OF EDD 4.8/SST *
*   ===> SWAP EDD/SST <===  *
*****************************

Swap functions use the CTL_XCH1 sub-function (SST.CONTROLER source code)

Function: CTL_MOVE (SST.CONTROLER source code)
========

$1D00-$31FF (main memory)    <=>    $E000-$F4FF (alt bank)

EDD                                 SST
             
$1D00-$1EFF : EDD.OPT4.OPT5         $E000-$E6FF : SST.SUBS
$1F00-$20FF : EDD.CHECKMEM          $E700-$F4FF : <<Not used>>
$2100-$25FF : EDD.OPT3.OPT7
$2600-$2C19 : EDD.ANALYZE
$2C1A-$2FFF : EDD.CONTROL
$3000-$31FF : EDD.TEXT (part)
             
SST                                 EDD

$1D00-$23FF : SST.SUBS              $E000-$E1FF : EDD.OPT4.OPT5
$2400-$31FF : <<Not used>>          $E200-$E3FF : EDD.CHECKMEM
                                    $E400-$E8FF : EDD.OPT3.OPT7
                                    $E900-$EF19 : EDD.ANALYZE
                                    $EF1A-$F2FF : EDD.CONTROL
                                    $F300-$F4FF : EDD.TEXT (part)


Function: SBS_XCHANGE (SST.SUBS source code)
========

$B700-$BFFF (main memory)    <=>    $D700-$DFFF (bank 2)

EDD                                 SST

$B700-$BFFF : EDD.DRIVE             $D700-$DFFF : SST.RWTS

SST                                 EDD

$B700-$BFFF : SST.RWTS              $D700-$DFFF : EDD.DRIVE


Retour au sommaire 

hr SST


08) Les patchs de Saltine.


Liste des routines ajoutées par Saltine pour réaliser les fichiers .NIB.

SST controller - listing : Click HERE!
SST controller - assembly : Click HERE!

SST sub-routines - listing : Click HERE!
SST sub-routines - assembly : Click HERE!

SST RWTS - listing : Click HERE!
SST RWTS - assembly : Click HERE!

Compléments pour les adresses:

EDD page 0 - listing : Click HERE!

EDD rom - listing : Click HERE!


Retour au sommaire 

hr SST


09) Points d'entrée des sous-programmes.


*****************************
* TABLE OF ADDRESSES FOR    *
* EDD/SST COMMANDS          *
*****************************

      ORG $16B9
                ; Opt Command
LTDDO DA  $B500 ;  1  CTL_PIRATEDSK (SST:pirate a disk) was COPYDISK with EDD
      DA  $17C6 ;  2  CHNGPARM
      DA  $2103 ;  3  DRVSPEED
      DA  $1D03 ;  4  SCANDISK
      DA  $1D00 ;  5  CERTDISK
      DA  $0CAF ;  6  CHNGSLTS
      DA  $2100 ;  7  DRVEXAM
      DA  $0CA7 ;  8  CLRERRCD
      DA  $B50D ;  9  CTL_INITDSK (SST:initialize a disk) was EDDQUIT with EDD
      DA  $0CE2 ;     QUITEDD     NOT USED (opt 9 is no more the quit option)
      DA  $0C6B ;     E2          NOT USED (opt 9 is no more the quit option)


Retour au sommaire 

hr SST


10) Différences entre ma version de SST et celle de Saltine.


Si vous faites des modifications, pensez à faire la comparaison entre la version Saltine et la version Deckard.
Il est probable que l'outil choisi (surtout pas Copy II+!) commence à afficher les différences à partir d'un offset correspondant au début du programme et non pas à partir de son adresse de début. J'ai donc rajouté cet offset ici pour plus de lisibilité.

  OFFSET      BLOAD ADDR    AFTER RELOC   FILENAME       DECKARD/SALTINE COMPARAISON
===========   ===========   ===========   =============  =======================================================
$0022-$0047 : $0B22-$0B47 : $0B22-$0B47 : SST.RELOCATOR  DECKARD : Relocate EDD.HGR2PRT+get computer infos for CHECKMEM
                                                          SALTINE: End of relocator
$0048-$00FF : $0B48-$0BFF : $0B48-$0BFF : SST.RELOCATOR  DECKARD : Filled with $00
                                                          SALTINE: <unused> Filled with different values
$0120-$0131 : $0C20-$0C31 : $0C20-$0C31 : EDD.MAIN       DECKARD : Filled with $00
                                                          SALTINE: <unused> Dead routines
$10C9-$10D2 : $1BC9-$1BD2 : $1BC9-$1BD2 : EDD.OPT2.OPT1  DECKARD : Filled with $00
                                                          SALTINE: <unused> Dead routines
$10FE-$11FF : $1BFE-$1CFF : $1BFE-$1CFF : EDD.OPT2.OPT1  DECKARD : Filled with $00
                                                          SALTINE: <unused> TXT result of compilation process
$1380-$13FF : $1E80-$1EFF : $1E80-$1EFF : EDD.OPT4.OPT5  DECKARD : Filled with $00
                                                          SALTINE: <unused> TXT result of compilation process
$1400-$1594 : $1F00-$2094 : $1F00-$2094 : EDD.CHECKMEM   DECKARD : Correct bytes before exec BOOT 2
                                                          SALTINE: Altered bytes after first exec
$1595-$15FF : $2095-$20FF : $2095-$20FF : EDD.CHECKMEM   DECKARD : Filled with $00
                                                          SALTINE: <unused> TXT result of compilation process
$1980-$1AFF : $2480-$25FF : $2480-$25FF : EDD.OPT3.OPT7  DECKARD : Filled with $00
                                                          SALTINE: <unused> TXT result of compilation process
$20DF-$2119 : $2BDF-$2C19 : $2BDF-$2C19 : EDD.ANALYZE    DECKARD : Filled with $00
                                                          SALTINE: <unused> TXT result of compilation process
$3471-$34FF : $3F71-$3FFF : $3F71-$3FFF : EDD.TEXT       DECKARD : Filled with $00
                                                          SALTINE: <unused> Filled with different values
$3900-$39FF : $4400-$44FF : $B400-$B4FF : EDD.B000.B4FF  DECKARD : Filled with $00
                                                          SALTINE: <unused> Filled with different values (D5AA96...)
$3A6C-$3A7B : $456C-$457B : $B56C-$B57B : SST.CONTROLER  DECKARD : Filled with $00
                                                          SALTINE: Filled with old values (last run)
$3A7C-$3BFF : $457C-$46FF : $B57C-$B6FF : SST.CONTROLER  DECKARD : Filled with $00
                                                          SALTINE: <unused> Filled with different values
$44E4-$44FF : $4FE4-$4FFF : $BFE4-$BFFF : EDD.DRIVE      DECKARD : Filled with $00
                                                          SALTINE: <unused> Filled with different values
$4869-$4894 : $5369-$5394 : $DA69-$DA94 : SST.RWTS (bk2) DECKARD : Filled with $00
                                                          SALTINE: <unused> DOS Routine
$4900-$4A55 : $5400-$5555 : $DB00-$DC55 : SST.RWTS (bk2) DECKARD : Filled with $00
                                                          SALTINE: NBUF1 and NBUF2 after last run
$4DDF-$4DFF : $58DF-$58FF : $DFDF-$DFFF : SST.RWTS (bk2) DECKARD : Filled with $00
                                                          SALTINE: <unused> DOS Routine
$539F-$5466 : $5E9F-$5F66 : $E59F-$E666 : SST.SUBS       DECKARD : Filled with $00
                                                          SALTINE: <unused> Dead routines
$5467-$54FF : $5F67-$5FFF : $E667-$E6FF : SST.SUBS       DECKARD : Filled with $00
                                                          SALTINE: <unused> TXT result of compilation process
$5500-$57FF : $6000-$62FF : $0800-$0AFF : EDD.HGR2PRT    DECKARD : Correct code added
                                                          SALTINE: Missing code (=crash!!!)


Retour au sommaire 

hr SST


11) Format des faces en 16 secteurs créées par SST.


Quelques précisions sur le mécanisme de transformation d'une face protégée en 2 faces au format 16 secteurs/piste:

                                                                  ___ 
                                                                 |===|
                              ___                                | O |
                             |===|           SST                 |_^_|
1 face protégée:             | O |  ==========================>             2 faces non protégées
                             |_^_|                                ___
                                                                 |===|
                                                                 | O |
                                                                 |_^_|


- SST lit une piste protégée                                     - SST écrit la piste protégée chargée en mémoire
                                                                   sur 2 pistes adjacentes d'une face non protégée
                                                                   (sauf la piste $11 protégée qui est ventilée sur la 
                                                                   piste $22 de la 1ère face 16 secteurs/piste et
                                                                   la piste $00 de la 2nde face 16 secteurs/piste)
- SST stocke en mémoire la piste lue dans un buffer de $1C00     - SST écrit le buffer de $1C00 de long dans 28 secteurs
  octets de long                                                   de 256 octets d'une face 16 secteurs/piste. Il reste
                                                                   4 secteurs de libre car 2 pistes de 16 secteurs = 32
                                                                   secteurs. SST sauvegarde aussi 3 secteurs contenant
                                                                   les paramètres de EDD en mémoire. Le 4ème secteur
                                                                   peut servir dans le cadre de la prise en compte d'une
                                                                   éventuelle piste $23 protégée


PISTES PROTEGEES $00 A $22

Afin de faciliter la compréhension du stockage des pistes de l'original protégé sur les 2 faces en 16 secteurs par piste, j'ai préféré faire une présentation 'à plat'.
Chaque face a un cadre en bleu qui représente les pistes (horizontal) et les secteurs (vertical).
La notation des pistes est faite en décimal (noté DC) et en hexadécimal (HX).
Les secteurs sont quant à eux noté de 00 à 0F (en hexa donc).
E.D.D. utilise un buffer de $1C00 octets de long pour stocker en mémoire la piste lue (espace $7800-$93FF).

Le stockage des pistes protégées $00 à $22 s'effectue de manière "verticale", dans le sens croissant des pistes (des supports 16 secteurs/piste) et dans le sens décroissant des secteurs.
Une illustration pour suivre la logique d'écriture sur les 2 faces 16 secteurs/piste:


Face 1:

T$00 S$0F : begin of track buffer (protected track # $00)
T$00 S$0E
...
T$00 S$01
T$00 S$00
T$01 S$0F
...
T$01 S$04 : end of track buffer   (protected track # $00)
T$01 S$03 : extra sector #1
T$01 S$02 : extra sector #2
T$01 S$01 : extra sector #3
T$02 S$0F : begin of track buffer (protected track # $01)
...
T$03 S$04 : end of track buffer   (protected track # $01)
T$03 S$03 : extra sector #1
T$03 S$02 : extra sector #2
T$03 S$01 : extra sector #3
...
T$22 S$0F : begin of track buffer (protected track # $11)
...
T$22 S$00

Face 2:

T$00 S$0F
...
T$00 S$04 : end of track buffer   (protected track # $11)
T$00 S$03 : extra sector #1
T$00 S$02 : extra sector #2
T$00 S$01 : extra sector #3
T$01 S$0F : begin of track buffer (protected track # $12)
...
T$21 S$0F : begin of track buffer (protected track # $22)
T$21 S$0E
...
T$22 S$04 : end of track buffer
T$22 S$03 : extra sector #1
T$22 S$02 : extra sector #2
T$22 S$01 : extra sector #3

Explication des extra sectors: pour chaque piste protégée lue depuis l'original, SST sauvegarde les 3 buffers de paramétrage E.D.D. sur 3 secteurs de la face 16 secteurs/piste. Nous verrons plus loin à quoi correspond le secteur XX .
J'ai utilisé des couleurs alternées (violet et vert) pour distinguer les pistes adjacentes.
A l'intérieur du cadre, les chiffres de $00 à $22 représentent les pistes protégées correspondantes.

Extra sector B1 = Copy of the PreWrite buffer ($B100-$B1FF)
Extra sector B2 = Copy of the Program Variables buffer ($B200-$B2FF)
Extra sector B3 = Copy of the Parameter buffer ($B300-$B3FF)
XX = Not Used

Face 1 (pistes protégées $00 à $11):

----------------------------------------------------------------------------------------------------------------
|DC|00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|DC|
----------------------------------------------------------------------------------------------------------------
|HX|00|01|02|03|04|05|06|07|08|09|0A|0B|0C|0D|0E|0F|10|11|12|13|14|15|16|17|18|19|1A|1B|1C|1D|1E|1F|20|21|22|HX|
---**********************************************************************************************************---
|00*00|XX|01|XX|02|XX|03|XX|04|XX|05|XX|06|XX|07|XX|08|XX|09|XX|0A|XX|0B|XX|0C|XX|0D|XX|0E|XX|0F|XX|10|XX|11*00|
---*--------------------------------------------------------------------------------------------------------*---
|01*00|B3|01|B3|02|B3|03|B3|04|B3|05|B3|06|B3|07|B3|08|B3|09|B3|0A|B3|0B|B3|0C|B3|0D|B3|0E|B3|0F|B3|10|B3|11*01|
---*--------------------------------------------------------------------------------------------------------*---
|02*00|B2|01|B2|02|B2|03|B2|04|B2|05|B2|06|B2|07|B2|08|B2|09|B2|0A|B2|0B|B2|0C|B2|0D|B2|0E|B2|0F|B2|10|B2|11*02|
---*--------------------------------------------------------------------------------------------------------*---
|03*00|B1|01|B1|02|B1|03|B1|04|B1|05|B1|06|B1|07|B1|08|B1|09|B1|0A|B1|0B|B1|0C|B1|0D|B1|0E|B1|0F|B1|10|B1|11*03|
---*--------------------------------------------------------------------------------------------------------*---
|04*00|00|01|01|02|02|03|03|04|04|05|05|06|06|07|07|08|08|09|09|0A|0A|0B|0B|0C|0C|0D|0D|0E|0E|0F|0F|10|10|11*04|
---*--------------------------------------------------------------------------------------------------------*---
|05*00|00|01|01|02|02|03|03|04|04|05|05|06|06|07|07|08|08|09|09|0A|0A|0B|0B|0C|0C|0D|0D|0E|0E|0F|0F|10|10|11*05|
---*--------------------------------------------------------------------------------------------------------*---
|06*00|00|01|01|02|02|03|03|04|04|05|05|06|06|07|07|08|08|09|09|0A|0A|0B|0B|0C|0C|0D|0D|0E|0E|0F|0F|10|10|11*06|
---*--------------------------------------------------------------------------------------------------------*---
|07*00|00|01|01|02|02|03|03|04|04|05|05|06|06|07|07|08|08|09|09|0A|0A|0B|0B|0C|0C|0D|0D|0E|0E|0F|0F|10|10|11*07|
---*--------------------------------------------------------------------------------------------------------*---
|08*00|00|01|01|02|02|03|03|04|04|05|05|06|06|07|07|08|08|09|09|0A|0A|0B|0B|0C|0C|0D|0D|0E|0E|0F|0F|10|10|11*08|
---*--------------------------------------------------------------------------------------------------------*---
|09*00|00|01|01|02|02|03|03|04|04|05|05|06|06|07|07|08|08|09|09|0A|0A|0B|0B|0C|0C|0D|0D|0E|0E|0F|0F|10|10|11*09|
---*--------------------------------------------------------------------------------------------------------*---
|0A*00|00|01|01|02|02|03|03|04|04|05|05|06|06|07|07|08|08|09|09|0A|0A|0B|0B|0C|0C|0D|0D|0E|0E|0F|0F|10|10|11*0A|
---*--------------------------------------------------------------------------------------------------------*---
|0B*00|00|01|01|02|02|03|03|04|04|05|05|06|06|07|07|08|08|09|09|0A|0A|0B|0B|0C|0C|0D|0D|0E|0E|0F|0F|10|10|11*0B|
---*--------------------------------------------------------------------------------------------------------*---
|0C*00|00|01|01|02|02|03|03|04|04|05|05|06|06|07|07|08|08|09|09|0A|0A|0B|0B|0C|0C|0D|0D|0E|0E|0F|0F|10|10|11*0C|
---*--------------------------------------------------------------------------------------------------------*---
|0D*00|00|01|01|02|02|03|03|04|04|05|05|06|06|07|07|08|08|09|09|0A|0A|0B|0B|0C|0C|0D|0D|0E|0E|0F|0F|10|10|11*0D|
---*--------------------------------------------------------------------------------------------------------*---
|0E*00|00|01|01|02|02|03|03|04|04|05|05|06|06|07|07|08|08|09|09|0A|0A|0B|0B|0C|0C|0D|0D|0E|0E|0F|0F|10|10|11*0E|
---*--------------------------------------------------------------------------------------------------------*---
|0F*00|00|01|01|02|02|03|03|04|04|05|05|06|06|07|07|08|08|09|09|0A|0A|0B|0B|0C|0C|0D|0D|0E|0E|0F|0F|10|10|11*0F|
---**********************************************************************************************************---
|HX|00|01|02|03|04|05|06|07|08|09|0A|0B|0C|0D|0E|0F|10|11|12|13|14|15|16|17|18|19|1A|1B|1C|1D|1E|1F|20|21|22|HX|
----------------------------------------------------------------------------------------------------------------
|DC|00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|DC|
----------------------------------------------------------------------------------------------------------------

Face 2 (pistes protégées $11 à $22):

----------------------------------------------------------------------------------------------------------------
|DC|00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|DC|
----------------------------------------------------------------------------------------------------------------
|HX|00|01|02|03|04|05|06|07|08|09|0A|0B|0C|0D|0E|0F|10|11|12|13|14|15|16|17|18|19|1A|1B|1C|1D|1E|1F|20|21|22|HX|
---**********************************************************************************************************---
|00*XX|12|XX|13|XX|14|XX|15|XX|16|XX|17|XX|18|XX|19|XX|1A|XX|1B|XX|1C|XX|1D|XX|1E|XX|1F|XX|20|XX|21|XX|22|XX*00|
---*--------------------------------------------------------------------------------------------------------*---
|01*B3|12|B3|13|B3|14|B3|15|B3|16|B3|17|B3|18|B3|19|B3|1A|B3|1B|B3|1C|B3|1D|B3|1E|B3|1F|B3|20|B3|21|B3|22|B3*01|
---*--------------------------------------------------------------------------------------------------------*---
|02*B2|12|B2|13|B2|14|B2|15|B2|16|B2|17|B2|18|B2|19|B2|1A|B2|1B|B2|1C|B2|1D|B2|1E|B2|1F|B2|20|B2|21|B2|22|B2*02|
---*--------------------------------------------------------------------------------------------------------*---
|03*B1|12|B1|13|B1|14|B1|15|B1|16|B1|17|B1|18|B1|19|B1|1A|B1|1B|B1|1C|B1|1D|B1|1E|B1|1F|B1|20|B1|21|B1|22|B1*03|
---*--------------------------------------------------------------------------------------------------------*---
|04*11|12|12|13|13|14|14|15|15|16|16|17|17|18|18|19|19|1A|1A|1B|1B|1C|1C|1D|1D|1E|1E|1F|1F|20|20|21|21|22|22*04|
---*--------------------------------------------------------------------------------------------------------*---
|05*11|12|12|13|13|14|14|15|15|16|16|17|17|18|18|19|19|1A|1A|1B|1B|1C|1C|1D|1D|1E|1E|1F|1F|20|20|21|21|22|22*05|
---*--------------------------------------------------------------------------------------------------------*---
|06*11|12|12|13|13|14|14|15|15|16|16|17|17|18|18|19|19|1A|1A|1B|1B|1C|1C|1D|1D|1E|1E|1F|1F|20|20|21|21|22|22*06|
---*--------------------------------------------------------------------------------------------------------*---
|07*11|12|12|13|13|14|14|15|15|16|16|17|17|18|18|19|19|1A|1A|1B|1B|1C|1C|1D|1D|1E|1E|1F|1F|20|20|21|21|22|22*07|
---*--------------------------------------------------------------------------------------------------------*---
|08*11|12|12|13|13|14|14|15|15|16|16|17|17|18|18|19|19|1A|1A|1B|1B|1C|1C|1D|1D|1E|1E|1F|1F|20|20|21|21|22|22*08|
---*--------------------------------------------------------------------------------------------------------*---
|09*11|12|12|13|13|14|14|15|15|16|16|17|17|18|18|19|19|1A|1A|1B|1B|1C|1C|1D|1D|1E|1E|1F|1F|20|20|21|21|22|22*09|
---*--------------------------------------------------------------------------------------------------------*---
|0A*11|12|12|13|13|14|14|15|15|16|16|17|17|18|18|19|19|1A|1A|1B|1B|1C|1C|1D|1D|1E|1E|1F|1F|20|20|21|21|22|22*0A|
---*--------------------------------------------------------------------------------------------------------*---
|0B*11|12|12|13|13|14|14|15|15|16|16|17|17|18|18|19|19|1A|1A|1B|1B|1C|1C|1D|1D|1E|1E|1F|1F|20|20|21|21|22|22*0B|
---*--------------------------------------------------------------------------------------------------------*---
|0C*11|12|12|13|13|14|14|15|15|16|16|17|17|18|18|19|19|1A|1A|1B|1B|1C|1C|1D|1D|1E|1E|1F|1F|20|20|21|21|22|22*0C|
---*--------------------------------------------------------------------------------------------------------*---
|0D*11|12|12|13|13|14|14|15|15|16|16|17|17|18|18|19|19|1A|1A|1B|1B|1C|1C|1D|1D|1E|1E|1F|1F|20|20|21|21|22|22*0D|
---*--------------------------------------------------------------------------------------------------------*---
|0E*11|12|12|13|13|14|14|15|15|16|16|17|17|18|18|19|19|1A|1A|1B|1B|1C|1C|1D|1D|1E|1E|1F|1F|20|20|21|21|22|22*0E|
---*--------------------------------------------------------------------------------------------------------*---
|0F*11|12|12|13|13|14|14|15|15|16|16|17|17|18|18|19|19|1A|1A|1B|1B|1C|1C|1D|1D|1E|1E|1F|1F|20|20|21|21|22|22*0F|
---**********************************************************************************************************---
|HX|00|01|02|03|04|05|06|07|08|09|0A|0B|0C|0D|0E|0F|10|11|12|13|14|15|16|17|18|19|1A|1B|1C|1D|1E|1F|20|21|22|HX|
----------------------------------------------------------------------------------------------------------------
|DC|00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|DC|
----------------------------------------------------------------------------------------------------------------


La même chose mais cette fois à l'intérieur du cadre, au lieu de mettre le numéro des pistes protégées, j'ai mis la référence de chaque page mémoire du buffer (par exemple $78 en secteur $0F correspond à l'espace $7800-$78FF).

Face 1 (pistes protégées $00 à $11):

----------------------------------------------------------------------------------------------------------------
|DC|00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|DC|
----------------------------------------------------------------------------------------------------------------
|HX|00|01|02|03|04|05|06|07|08|09|0A|0B|0C|0D|0E|0F|10|11|12|13|14|15|16|17|18|19|1A|1B|1C|1D|1E|1F|20|21|22|HX|
---**********************************************************************************************************---
|00*87|XX|87|XX|87|XX|87|XX|87|XX|87|XX|87|XX|87|XX|87|XX|87|XX|87|XX|87|XX|87|XX|87|XX|87|XX|87|XX|87|XX|87*00|
---*--------------------------------------------------------------------------------------------------------*---
|01*86|B3|86|B3|86|B3|86|B3|86|B3|86|B3|86|B3|86|B3|86|B3|86|B3|86|B3|86|B3|86|B3|86|B3|86|B3|86|B3|86|B3|86*01|
---*--------------------------------------------------------------------------------------------------------*---
|02*85|B2|85|B2|85|B2|85|B2|85|B2|85|B2|85|B2|85|B2|85|B2|85|B2|85|B2|85|B2|85|B2|85|B2|85|B2|85|B2|85|B2|85*02|
---*--------------------------------------------------------------------------------------------------------*---
|03*84|B1|84|B1|84|B1|84|B1|84|B1|84|B1|84|B1|84|B1|84|B1|84|B1|84|B1|84|B1|84|B1|84|B1|84|B1|84|B1|84|B1|84*03|
---*--------------------------------------------------------------------------------------------------------*---
|04*83|93|83|93|83|93|83|93|83|93|83|93|83|93|83|93|83|93|83|93|83|93|83|93|83|93|83|93|83|93|83|93|83|93|83*04|
---*--------------------------------------------------------------------------------------------------------*---
|05*82|92|82|92|82|92|82|92|82|92|82|92|82|92|82|92|82|92|82|92|82|92|82|92|82|92|82|92|82|92|82|92|82|92|82*05|
---*--------------------------------------------------------------------------------------------------------*---
|06*81|91|81|91|81|91|81|91|81|91|81|91|81|91|81|91|81|91|81|91|81|91|81|91|81|91|81|91|81|91|81|91|81|91|81*06|
---*--------------------------------------------------------------------------------------------------------*---
|07*80|90|80|90|80|90|80|90|80|90|80|90|80|90|80|90|80|90|80|90|80|90|80|90|80|90|80|90|80|90|80|90|80|90|80*07|
---*--------------------------------------------------------------------------------------------------------*---
|08*7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F*08|
---*--------------------------------------------------------------------------------------------------------*---
|09*7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E*09|
---*--------------------------------------------------------------------------------------------------------*---
|0A*7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D*0A|
---*--------------------------------------------------------------------------------------------------------*---
|0B*7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C*0B|
---*--------------------------------------------------------------------------------------------------------*---
|0C*7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B*0C|
---*--------------------------------------------------------------------------------------------------------*---
|0D*7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A*0D|
---*--------------------------------------------------------------------------------------------------------*---
|0E*79|89|79|89|79|89|79|89|79|89|79|89|79|89|79|89|79|89|79|89|79|89|79|89|79|89|79|89|79|89|79|89|79|89|79*0E|
---*--------------------------------------------------------------------------------------------------------*---
|0F*78|88|78|88|78|88|78|88|78|88|78|88|78|88|78|88|78|88|78|88|78|88|78|88|78|88|78|88|78|88|78|88|78|88|78*0F|
---**********************************************************************************************************---
|HX|00|01|02|03|04|05|06|07|08|09|0A|0B|0C|0D|0E|0F|10|11|12|13|14|15|16|17|18|19|1A|1B|1C|1D|1E|1F|20|21|22|HX|
----------------------------------------------------------------------------------------------------------------
|DC|00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|DC|
----------------------------------------------------------------------------------------------------------------

Face 2 (pistes protégées $11 à $22):

----------------------------------------------------------------------------------------------------------------
|DC|00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|DC|
----------------------------------------------------------------------------------------------------------------
|HX|00|01|02|03|04|05|06|07|08|09|0A|0B|0C|0D|0E|0F|10|11|12|13|14|15|16|17|18|19|1A|1B|1C|1D|1E|1F|20|21|22|HX|
---**********************************************************************************************************---
|00*XX|87|XX|87|XX|87|XX|87|XX|87|XX|87|XX|87|XX|87|XX|87|XX|87|XX|87|XX|87|XX|87|XX|87|XX|87|XX|87|XX|87|XX*00|
---*--------------------------------------------------------------------------------------------------------*---
|01*B3|86|B3|86|B3|86|B3|86|B3|86|B3|86|B3|86|B3|86|B3|86|B3|86|B3|86|B3|86|B3|86|B3|86|B3|86|B3|86|B3|86|B3*01|
---*--------------------------------------------------------------------------------------------------------*---
|02*B2|85|B2|85|B2|85|B2|85|B2|85|B2|85|B2|85|B2|85|B2|85|B2|85|B2|85|B2|85|B2|85|B2|85|B2|85|B2|85|B2|85|B2*02|
---*--------------------------------------------------------------------------------------------------------*---
|03*B1|84|B1|84|B1|84|B1|84|B1|84|B1|84|B1|84|B1|84|B1|84|B1|84|B1|84|B1|84|B1|84|B1|84|B1|84|B1|84|B1|84|B1*03|
---*--------------------------------------------------------------------------------------------------------*---
|04*93|83|93|83|93|83|93|83|93|83|93|83|93|83|93|83|93|83|93|83|93|83|93|83|93|83|93|83|93|83|93|83|93|83|93*04|
---*--------------------------------------------------------------------------------------------------------*---
|05*92|82|92|82|92|82|92|82|92|82|92|82|92|82|92|82|92|82|92|82|92|82|92|82|92|82|92|82|92|82|92|82|92|82|92*05|
---*--------------------------------------------------------------------------------------------------------*---
|06*91|81|91|81|91|81|91|81|91|81|91|81|91|81|91|81|91|81|91|81|91|81|91|81|91|81|91|81|91|81|91|81|91|81|91*06|
---*--------------------------------------------------------------------------------------------------------*---
|07*90|80|90|80|90|80|90|80|90|80|90|80|90|80|90|80|90|80|90|80|90|80|90|80|90|80|90|80|90|80|90|80|90|80|90*07|
---*--------------------------------------------------------------------------------------------------------*---
|08*8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F|7F|8F*08|
---*--------------------------------------------------------------------------------------------------------*---
|09*8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E|7E|8E*09|
---*--------------------------------------------------------------------------------------------------------*---
|0A*8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D|7D|8D*0A|
---*--------------------------------------------------------------------------------------------------------*---
|0B*8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C|7C|8C*0B|
---*--------------------------------------------------------------------------------------------------------*---
|0C*8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B|7B|8B*0C|
---*--------------------------------------------------------------------------------------------------------*---
|0D*8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A|7A|8A*0D|
---*--------------------------------------------------------------------------------------------------------*---
|0E*89|79|89|79|89|79|89|79|89|79|89|79|89|79|89|79|89|79|89|79|89|79|89|79|89|79|89|79|89|79|89|79|89|79|89*0E|
---*--------------------------------------------------------------------------------------------------------*---
|0F*88|78|88|78|88|78|88|78|88|78|88|78|88|78|88|78|88|78|88|78|88|78|88|78|88|78|88|78|88|78|88|78|88|78|88*0F|
---**********************************************************************************************************---
|HX|00|01|02|03|04|05|06|07|08|09|0A|0B|0C|0D|0E|0F|10|11|12|13|14|15|16|17|18|19|1A|1B|1C|1D|1E|1F|20|21|22|HX|
----------------------------------------------------------------------------------------------------------------
|DC|00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|DC|
----------------------------------------------------------------------------------------------------------------

PISTE PROTEGEE $23

Comme nous le voyons il reste des "trous" (marqués XX) sur chaque face en 16 secteurs/piste: un secteur de libre toutes les 2 pistes sur chaque face après avoir fait le traitement des pistes protégées $00 à $22.
Soit un total de 35 secteurs à chaque fois situé en secteur $00.
Ca a donné une idée à Saltine: pourquoi ne pas permettre de sauvegarder une piste supplémentaire ($23 par exemple) mais cette fois en faisant un stockage sous forme "horizontale". Bien entendu, cette possibilité n'est pas indiquée dans la doc!!!
Pour en savoir plus, regardez la routine SBS_TRK35 dans le source SST.SUBS.

Pour la piste protégée $23, le programme va écrire sur les supports 16 secteurs/piste dans l'ordre croissant des pistes toujours sur le secteur $00.
Illustration:

Face 1:

T$01 S$00 : begin of track buffer (protected track # $23)
T$03 S$00
T$05 S$00
...
T$21 S$00


Face 2:

T$00 S$00
T$02 S$00
T$04 S$00
...
T$14 S$00 : end of track buffer
T$16 S$00 : extra sector #1 -> B1 = Copy of the PreWrite buffer ($B100-$B1FF)
T$18 S$00 : extra sector #2 -> B2 = Copy of the Program Variables buffer ($B200-$B2FF)
T$1A S$00 : extra sector #3 -> B3 = Copy of the Parameter buffer ($B300-$B3FF)

ZZ = not used (at all)


En mettant à l'intérieur du cadre le numéro de la piste protégée:

Face 1 (piste protégée $23):

----------------------------------------------------------------------------------------------------------------
|DC|00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|DC|
----------------------------------------------------------------------------------------------------------------
|HX|00|01|02|03|04|05|06|07|08|09|0A|0B|0C|0D|0E|0F|10|11|12|13|14|15|16|17|18|19|1A|1B|1C|1D|1E|1F|20|21|22|HX|
---**********************************************************************************************************---
|00*  |23|  |23|  |23|  |23|  |23|  |23|  |23|  |23|  |23|  |23|  |23|  |23|  |23|  |23|  |23|  |23|  |23|  *00|
---*--------------------------------------------------------------------------------------------------------*---


Face 2 (piste protégée $23):

----------------------------------------------------------------------------------------------------------------
|DC|00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|DC|
----------------------------------------------------------------------------------------------------------------
|HX|00|01|02|03|04|05|06|07|08|09|0A|0B|0C|0D|0E|0F|10|11|12|13|14|15|16|17|18|19|1A|1B|1C|1D|1E|1F|20|21|22|HX|
---**********************************************************************************************************---
|00*23|  |23|  |23|  |23|  |23|  |23|  |23|  |23|  |23|  |23|  |23|  |B1|  |B2|  |B3|  |ZZ|  |ZZ|  |ZZ|  |ZZ*00|
---*--------------------------------------------------------------------------------------------------------*---

La même chose mais en mettant cette fois la référence de chaque page du buffer contenant la piste protégée:

Face 1 (piste protégée $23):

----------------------------------------------------------------------------------------------------------------
|DC|00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|DC|
----------------------------------------------------------------------------------------------------------------
|HX|00|01|02|03|04|05|06|07|08|09|0A|0B|0C|0D|0E|0F|10|11|12|13|14|15|16|17|18|19|1A|1B|1C|1D|1E|1F|20|21|22|HX|
---**********************************************************************************************************---
|00*  |78|  |79|  |7A|  |7B|  |7C|  |7D|  |7E|  |7F|  |80|  |81|  |82|  |83|  |84|  |85|  |86|  |87|  |88|  *00|
---*--------------------------------------------------------------------------------------------------------*---


Face 2 (piste protégée $23):

----------------------------------------------------------------------------------------------------------------
|DC|00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|DC|
----------------------------------------------------------------------------------------------------------------
|HX|00|01|02|03|04|05|06|07|08|09|0A|0B|0C|0D|0E|0F|10|11|12|13|14|15|16|17|18|19|1A|1B|1C|1D|1E|1F|20|21|22|HX|
---**********************************************************************************************************---
|00*89|  |8A|  |8B|  |8C|  |8D|  |8E|  |8F|  |90|  |91|  |92|  |93|  |B1|  |B2|  |B3|  |ZZ|  |ZZ|  |ZZ|  |ZZ*00|
---*--------------------------------------------------------------------------------------------------------*---


Retour au sommaire 

hr SST


12) La création d'un .nib.



Quelques rappels techniques:

Taille de chacune des pistes d'un fichier .NIB = $1A00 bytes (6656 bytes), soit l'équivalent de 26 secteurs d'une disquette 16 secteurs/piste.
Taille totale d'un fichier .NIB: $23 tracks * $1A00 bytes = $38E00 (232960).

E.D.D. utilise un buffer de piste de $1C00 octets (soit l'équivalent de 28 secteurs d'une disquette 16 secteurs/piste), c'est à dire un buffer plus long que ce qui est nécessaire pour créer une piste dans un .NIB (Le détail du découpage des 2 faces en 16 secteurs par piste a été étudié plus haut).
Ce qui veut dire que quand SST ajoute une piste dans le .NIB à partir du buffer de E.D.D., il n'utilise pas $1C00-$1A00=$200 octets qui sont alors perdus.
Il n'y a alors pas intérêt à ce que des données valides se trouvent dans cette zone équivalente en taille aux données de 2 secteurs!!!

                         ___
                        |===|
                        | O |                               ____
                        |_^_|              SST             |0101|
2 faces non protégées:         ==========================> |1010|  1 fichier .NIB               
                         ___            CiderPress         |0101|
                        |===|             etc...           |____|
                        | O |
                        |_^_|

- 28 secteurs de 256 octets stockant un buffer de          - $1A00 octets pour stocker une piste et donc $200 octets
  $1C00 octets correspondant à une piste protégée            perdus par rapport au buffer d'origine


Retour au sommaire 

hr SST


13) Appendice: le schéma de protection de EDD.


The EDD 4.2 crack by JPL: Click HERE!

The PDF of EDD IV isn't complete. A routine is missing: CHECKMEM.
And this is normal because it is a part of the protection scheme of the program!! (anti-wildcard copy => EDD is a single-load application).

My commented source code (for $1F00-$20FF):
Listing : Click HERE!
Assembly : Click HERE!
Thread (HackZApple - french) : Click HERE!


Retour au sommaire 

hr SST


14) Appendice: Différence entre EDD et EDD+.


Quand on lit les publicités d'Utilico Microware, on comprend qu'il existe 2 versions de leur produit:

- une version de E.D.D. qui tourne sur une configuration Apple II standard
- une version de E.D.D. appelée E.D.D. + qui ne tourne qu'avec la carte vendue en supplément.

Et bien en fait, c'est un gros pipeau car le programme est exactement le même dans les 2 cas de figure à 1 octet prêt (qui permet de choisir la version classique ou la PLUS).
Si vous avez récupéré une version de E.D.D.+ et que vous voulez la faire tourner sur une config standard, voici un message que j'avais laissé sur comp.sys.apple2 pour que ça marche (bien entendu vous n'avez pas accès aux caractéristiques propres à la carte - donc le "vrai" mode bit-copy hardware n'est pas activé):


TIPS: How to run the "EDD 4.9 PLUS" program without the EDD+ card:


Boot a DOS 3.3 disk.
Insert the "EDD 4.9 PLUS" floppy (downloaded from the Dave Touvell's website)
in your disk drive 1.


Type:


BLOAD EDD V4.9 (load the configured EDD+ version)
POKE 25290,0   (change EDDVRSN flag before relocate the code)
CALL 3069      (run EDD in standard mode)


You'll NOT have this error message anymore when using the "back up a disk"
option:


"Either the EDD PLUS CARD is not located in slot#x, or the PLUS CARD is not
connected to the original disk drive controller located in slot#6".


About the flag:


EDDVRSN  $B2CA: $00 => EDD 4 version (use standard bitcopy subroutines)
EDDVRSN  $B2CA: $01 => EDD 4 PLUS version (use plus card  bitcopy subroutines)


For SST, EDDVRSN = $00.


Retour au sommaire 

hr SST


15) Appendice: Code manquant.


L'objectif de Saltine était de détourner une fonctionnalité de E.D.D. pour ses besoins propres et il n'avait pas besoin des autres options proposées par le programme.
Concrêtement, les options 3 (Check Drive Speed), 4 (Scan Disk), 5 (Certify and Erase Disk) et 7 (Examine Disk Drive) n'ont pas d'utilité immédiate pour un utilisateur de base qui veut se créer des .nib. Enfin, pour quelqu'un qui ne cherche pas à aller plus loin que ce qui est mentionné dans la doc de base.

C'est pour cela que Saltine n'a pas été très attentif au bon fonctionnement des autres points de menu.
Quand j'ai essayé l'option 4 (Scan Disk), je me suis aperçu que la version de SST diffusée partout se plantait.
En effet en créant le binaire final (qui se reloge ensuite en mémoire un peu partout), Saltine a "oublié" un morceau du code du programme de Scan Disk et SST exécute le code qui résidait là avant son lancement; avec pour conséquence un plantage immédiat dans le cas le plus simple.

J'ai résolu le problème en récupérant la partie manquante dans E.D.D. 4.9.
La routine en question contient une partie programme ($0A80-$0AFF) et une partie de datas ($0800-$0A7F).
Le code enclenche le mode graphique HGR2 et affiche les numéros de pistes en bas de l'écran.

La version SST.DECKARD fonctionne quant à elle...


Retour au sommaire