Titre FBoot ProDOS Chip Select


Dernière mise à jour: Jeudi 27/07/2006.

1) Présentation

Chip Select était un pirate informatique très connu au début des années 80.
Sa spécialité consistait à cracker des logiciels commerciaux, c'est à dire à oter les protections qui empêchaient de copier facilement ces programmes.
Il ne faut pas oublier qu'un logiciel non protégé à l'époque se copiait à la vitesse grand V et un éditeur ne verrouillant pas un de ses produits avait toutes les chances de ne pas faire de chiffre d'affaire du tout...

Sa renommée était telle qu'il fut même cité dans un livre consacré aux techniques de plombage à l'usage des auteurs & éditeurs qui voulaient introduire sur le marché une réalisation non duplicables. En effet dans ce livre, les ennemis du copyright sont désignés car il est normal de connaître les personnes susceptibles de causer du tord au business.
Je parle du bouquin « Systèmes d'Exploitation et Systèmes de Protection sur Apple II » de Jean-Pierre Lagrange. Ce pirate est dépeint comme étant un adversaire coriace dont la technicité éprouvée constitue un danger pour tous les logiciels originaux passant entre ses mains.
Je cite la page 388 : «  Les actifs : j'aurais dû dire l'actif car à part CHIP SELECT (pardon au reste de la bande A.B.C) je ne vois personne de digne à mettre actuellement ici. Si vous examinez attentivement ses crackings actuels, vous reconnaîtrez qu'ils sont très bien faits (mieux qu'au début et c'est normal) ».

Voila pour la présentation de notre homme dans ses oeuvres obscures.
Mais il n'a pas fait que du cracking. Ou disons plutôt que ses activités underground tournant autour du mécanisme du lecteur de disquettes lui ont permis de bien maitriser cet aspect et d'ouvrir son champ d'application à autre chose que la recherche de routines de protection.

2) Le FBoot ProDOS

C'est ainsi qu'il mis en circulation un programme permettant de démarrer très rapidement une disquette (au contenu organisé au format ProDOS) en proposant une sélection des programmes trouvés dans son catalogue (au niveau root).

Ce programme est appelé dans le jargon Apple II un « Fast Boot ».
Comme à l'époque la plupart des utilisateurs n'avaient pas de disque dur (je sais ça parait curieux aujourd'hui où tout le monde en est équipé avec des tonnes de giga octets) mais uniquement des lecteurs de disquettes au format 5,25 pouces, il était plus qu'intéressant d'avoir un outil permettant de ne pas trop « subir » les temps d'attente au démarrage d'une disquette. Le Fast Boot ProDOS en version 2.0A est bien évidemment beaucoup plus rapide que le boot classique de ce système d'exploitation.

Son software démarre une vieille version de ProDOS (la 1.1.1) mais il est à mon avis intéressant d'avoir ce témoignage d'un autre temps à disposition sous forme de disque image pour émulateur (ne serait-ce que pour se souvenir qu'il a été repompé ensuite par un éditeur pour être utilisé dans des logiciels commerciaux (jeux) et pour faire le lien avec l'interview de Tsunoo de Troll & Co).

Je me suis donc lancé dans la création d'un .DSK avec les outils classiques à disposition (ADT, DSK2FILE ou encore ASIMOV).

Mais horreur, en lançant le programme via les émulateurs que j'utilise le plus fréquemment, à savoir Applewin et Apple Oasis, le programme plante au tout début sur le logo de Chip Select (dont il affiche 2 lignes de travers en tout et pour tout avant de partir en vrille).
Arghhh ! ! ! !
Pourtant ma disquette d'origine est en parfaite santé. Elle n'a aucun mauvais secteur, boote et passe très bien sur un vrai Apple IIe.
Par ailleurs, le programme de création de disque image utilisé (DSK2FILE) n'a signalé aucune erreur. Il a donc fait son boulot tout à fait normalement.

La première chose à faire quand ce type de désagrément survient (outre le fait de maudire les aléats de l'informatique et d'aller siffler une bière pour se remettre du coup psychologique reçu), est de procéder au schéma inverse.
J'entends par schéma inverse, reconstituer une disquette physique à partir du disque image et controler qu'elle fonctionne parfaitement comme son original.
J'ai donc procédé à cette opération et à la fin j'ai rebooté ma disquette « toute neuve » reconstituée pour voir comment se comportait le bébé.
Autant dire que tout l'étage de mon immeuble m'a entendu gueuler quand le programme s'est lamentablement planté exactement au même endroit qu'avec Applewin!!

Si on récapitule ces informations :


Comment cela est-il possible, me direz-vous ?

Et bien je vais vous expliquer le pourquoi du comment un peu plus bas, soyez un peu patient !

Dans l'immédiat, il y a une chose à faire : booter l'outil SST (Saltine's Super Transcopy) pour créer un disque image spécial .NIB contenant plus finement les données de la disquette 5" 1/4 d'origine.
D'ordinaire, ce programme est plutôt destiné aux softs avec certaines particularités comme l'usage d'un numéro de volume DOS 3.3 non standard dans les champs adresse ou une quelconque protection légère à base de changement de markers. Mais ici (et c'est d'ailleurs la rêgle quand un .DSK merdoit avec un émulateur), ça ne mange pas de pain de faire ce test (il faut juste avoir 2 drives disponibles sur le vrai apple II et Ciderpress sur PC pour recoller les 2 bouts, cet outil étant plus simple que d'utiliser SST avec un émulateur pour faire la même chose de l'autre côté).

Le résultat de l'opération, c'est que le programme de fast boot fonctionne parfaitement avec les émulateurs quand il a été transformé en .NIB!
Vous trouverez d'ailleurs sur cette page le fichier en téléchargement pour avoir une version exacte du boulot de CHIP SELECT.
C'est un point important car ceci veut dire qu'il y a quelque chose sur la disquette d'origine en plus (sous forme de nibble) et/ou qu'un usage particulier non standard est fait en douce provoquant le disfonctionnement.
Si cela avait été un programme commercial, on aurait pu avoir le réflexe de dire qu'il y avait un nibble count sous roche (quoi que si une copie Locksmith Fast Backup marche, ça ne peut pas être ça!) mais pour un soft qui est censé être free, c'est louche et il faut écarter cette hypothèse.


Bon, on a fait le test du .NIB, mais on ne va pas s'arrêter en aussi bon chemin...

3) Le problème du codage

Pour comprendre la nature du problème, il faut boot tracer sur un vrai apple II le programme pour capter ce qu'il fait.
J'ai donc désassemblé le boot 1 du soft (c'était suffisant pour piger le couac) et en ai fait un source complet que vous trouverez à la fois en version output assemblée (et commentée en détail) sur cette page ainsi qu'un disk image avec toujours le source pour Merlin pro 2.48 (Dos).
Qu'est-ce que ça nous apprend d'avoir fait ça ?

Tout d'abord que Chip Select était parano au possible !
En effet, il y a en tout et pour tout une dizaine d'octets correspondant à du code intelligible (compréhensible directement par le monitor) sur sa disquette dans le secteur 0 de la piste 0. Le reste est codé pour écarter les fouineurs!!
Et qu'est-ce qu'il fait dans ces quelques octets?
Et bien il procède à un décodage du reste du boot1 via un EOR #$60 pour placer son code... dans le buffer clavier, histoire qu'il disparaisse si l'utilisateur a la mauvaise idée de vouloir interrompre l'exécution normale pour zieuter un peu ce qui se passe dans la mémoire de la machine !

Ce boot 1, une fois analysé, nous informe de 3 points essentiels (je vous laisse lire le source commenté en annexe qui est fort instructif) :


Voila pour le boot 1.

Maintenant voyons pourquoi ça coince quand on transforme cette piste dans un .DSK. D'ailleurs on peut généraliser ce problème à d'autres softs utilisant un principe similaire (je pense à certains Froggy Software) ou à plein d'autres softs de l'underground ayant repris ce fast boot juste un peu modifié ou dans sa version loader de softs DOS 3.3 (pack de programmes de copies, etc...)


Pour cela un bref rappel du format standard ProDOS (l'outil utilisé étant DSK2FILE version ProDOS):


************************************** < DEBUT RAPPEL > **************************************

Notre outil de création de disques image ne fait que lire la disquette physique, mais il est important de savoir aussi comment sont écrites normalement les informations sur celle-ci (quand elles sont écrites en standard par ProDOS). C'est pourquoi je parle d'abord de cela (à part l'algorithme, le procédé utilisé par la RWTS du DOS 3.3 est identique).

ECRITURE SUR LA DISQUETTE

Le principe de la sauvegarde est de stocker sur la disquette la mémoire de l'apple II par tranche de 256 octets, chaque tranche étant appelée page (pour la ram) et secteur (pour la disquette).

Les esprits critiques me rétorqueront que sous ProDOS l'unité de stockage de base sur disk est le bloc de 512 octets. Sachez qu'il ne s'agit que d'une surcouche pratique (diverses raisons dont une plus grande rapidité) - car en tout état de cause au niveau de la disquette, on a bien toujours la séparation en 2 secteurs de 256 octets chacun (les marquages physiques des secteurs ayant été mis en place une bonne fois pour toute lors de la phase de formattage de la disquette).

En ram, l'unité de base est l'octet. Chaque case mémoire est dans cette unité et peut prendre 256 valeurs possible ($00 à $FF).

1 octet en ram = 8 bits significatifs.
1 page de ram = 256 octets * 8 bits = 2048 bits significatifs.

Sur la disquette, l'unité de base est le nibble. Il s'agit là aussi d'un octet (8 bits) mais avec des particularités, à savoir que seuls 6 bits PEUVENT être significatifs, c'est à dire utilisables pour représenter quelque chose. Ceci est dû à des contraintes physiques (lire la partie sur les nibbles dans le dossier sur le Disk II).
Avec 6 bits, on ne peut avoir que 64 valeurs différentes et celles acceptées ne sont pas séquentielles (elles appartiennent à une liste de valeurs répondant à des caractéristiques spécifiques liées aux contraintes du drive).
1 secteur de disquette = 342 nibbles disponibles pour les données (pour le format standard de 16 secteurs par piste). La capacité de stockage dans un secteur est donc de 342 nibbles * 6 bits = 2052 bits significatifs MAXIMUM, le tout en utilisant un codage optimum.

On peut donc faire tenir une page de ram dans un secteur de la disquette mais en tout état de cause, il n'y a pas le rapport 1 : 1 entre l'unité de base de la mémoire (octet ram) et l'unité de base de la disquette (nibble).

Puisque l'on ne peut pas stocker directement sur la disquette le contenu d'une case mémoire, il faut se ramener à l'unité la plus petite, à savoir le nibble. Il faut transformer l'octet de la ram avec un codage pour le ramener à ce qui est possible pour le drive. Quelque soit la technique utilisée, le procédé travaille avec la plus petite unité, à savoir le bit.


Il n'y a qu'un seul moyen pour faire rentrer la page de ram dans le secteur, c'est la méthode de codage dite 6-2.
Les autres méthodes (4-4 et 5-3) prennent plus de place.

Ces 2 chiffres correspondent à la façon dont on découpe un octet pour le faire rentrer dans plusieurs nibbles.
Pour la méthode 6-2, on traite les 256 octets de ram par « lots » de 3 octets en même temps lors de l'encodage (pré-nibblizing).
Pour chaque octet de ram du lot, on met un pack de 6 bits dans un nibble et on met de côté le pack de 2 bits restant. Les 3 * 2 bits restant sont associés pour former un 4ème nibble. On stocke 3 octets de ram dans 4 nibbles sur la disquette.
On final, les 342 nibbles du secteur sont formés de 4 parties :
86 nibbles composés de packs de 2 bits regroupés.
86+86+84 (=256) nibbles composés de packs de 6 bits.

En numérotant les nibbles, on a ceci :

partie\Numéro nibble
   1 : $000, $001, $002, ..., $053, $054, $055. (86 nibbles, packs de 2 bits regroupés)
   2 : $056, $057, $058, ..., $0A9, $0AA, $0AB. (86 nibbles, packs de 6 bits)
   3 : $0AC, $0AD, $0AE, ..., $0FF, $100, $101. (86 nibbles, packs de 6 bits)
   4 : $102, $103, $104, ..., $155.             (84 nibbles, packs de 6 bits)


La particularité que l'on ne trouve écrite nulle part (il faut examiner un source du ProDOS pour le savoir), c'est que lors du traitement de création des nibbles $054 et $055 (c'est à dire les 2 derniers nibbles composés de regroupent de packs de 2 bits), ProDOS met n'importe quoi (ce qu'il trouve) à la place des bits "libres" (rappel: on peut stocker 2052 bits dans le secteur alors qu'on en a besoin que de 2048 pour la page de ram).
En effet, lors de la phase de pré-nibblizing, il traite avec un même indice les 3 buffers de travail de 86, 86 et 84 octets de ram. Il lit donc les 2 octets qui suivent le dernier buffer de travail de 84 octets.


LECTURE DE LA DISQUETTE

Pour l'opération de lecture d'un secteur, DSK2FILE version ProDOS utilise le Disk II Device Driver (DIIDD).
Le DIIDD lit les nibbles dans l'ordre.
D'abord la 1ère partie = les 86 nibbles de complément (packs de 2 bits) qu'il stocke. -> =1ère boucle de lecture.
Puis les 3 autres parties (il y a 1 boucle de lecture par partie).
Il effectue la phase de post-nibblizing  juste après la lecture de chaque nibble pour les parties 2, 3 et 4. (Le DIIDD traite partie par partie avec un indice correspondant vraiment au nombre de bytes à reconstituer: 86/86/84).
Pour chaque nibble des parties 2, 3 et 4, le DIIDD reconstitue l'octet de ram correspondant en reprenant les 2 bits qui manquent.

Exemple pour reformer quelques octets de ram :

1ère boucle (partie 1):
Lecture nibble $000 à $055.

2nde boucle (partie 2):
Lecture nibble $056 (6 bits) et complète avec le pack de 2 bits du nibble $000 associé -> octet $00 de la page ram.
Lecture nibble $057 (6 bits) et complète avec le pack de 2 bits du nibble $001 associé -> octet $01 de la page ram.
Lecture nibble $058 (6 bits) et complète avec le pack de 2 bits du nibble $002 associé -> octet $02 de la page ram.
Lecture nibble $059 (6 bits) et complète avec le pack de 2 bits du nibble $000 associé -> octet $03 de la page ram.
Lecture nibble $05A (6 bits) et complète avec le pack de 2 bits du nibble $001 associé -> octet $04 de la page ram.
Lecture nibble $05B (6 bits) et complète avec le pack de 2 bits du nibble $002 associé -> octet $05 de la page ram.
etc...
Lecture nibble $0AA (6 bits) et complète avec le pack de 2 bits du nibble $054 associé -> octet $54 de la page ram.
Lecture nibble $0AB (6 bits) et complète avec le pack de 2 bits du nibble $055 associé -> octet $55 de la page ram.

3ème boucle (partie 3):
Lecture nibble $0AC (6 bits) et complète avec le pack de 2 bits du nibble $000 associé -> octet $56 de la page ram.
Lecture nibble $0AD (6 bits) et complète avec le pack de 2 bits du nibble $001 associé -> octet $57 de la page ram.
Lecture nibble $0AE (6 bits) et complète avec le pack de 2 bits du nibble $002 associé -> octet $58 de la page ram.
etc...
Lecture nibble $100 (6 bits) et complète avec le pack de 2 bits du nibble $054 associé -> octet $AA de la page ram.
Lecture nibble $101 (6 bits) et complète avec le pack de 2 bits du nibble $055 associé -> octet $AB de la page ram.

4ème boucle (partie 4):
Lecture nibble $102 (6 bits) et complète avec le pack de 2 bits du nibble $000 associé -> octet $AC de la page ram.
Lecture nibble $103 (6 bits) et complète avec le pack de 2 bits du nibble $001 associé -> octet $AD de la page ram.
Lecture nibble $104 (6 bits) et complète avec le pack de 2 bits du nibble $002 associé -> octet $AE de la page ram.
etc...
Lecture nibble $154 (6 bits) et complète avec le pack de 2 bits du nibble $052 associé -> octet $FE de la page ram.
Lecture nibble $155 (6 bits) et complète avec le pack de 2 bits du nibble $053 associé -> octet $FF de la page ram.


Il est important de noter que les packs de 2 bits merdiques des nibbles $054 et $055 ne sont pas utilisés (un pack dans le $054 et un pack dans le $055).

La phase de reconstruction des octets de ram avec des nibbles codés en 6-2 est gourmande en temps.
A noter que j'ai simplifié à l'extrème mais c'est l'idée générale pour vous faire comprendre le principe. La routine qui fait ça s'occupe aussi du controle du checksum, fait l'inversion des bits des packs de 2 bits, la translation entre les valeurs possibles des nibbles et les octets.



En utilisant 6 bits significatifs, cette méthode est optimum, mais rien ne nous empêche d'en utiliser moins.
Par exemple pour la méthode 4-4, chaque nibble sert à stocker 4 bits d'un octet de la ram. Chaque case mémoire se trouve donc répartie sur 2 nibbles consécutifs.
Les nibbles $000 et $001 permettent le stockage de l'octet $00 de ram.
Les nibbles $002 et $003 permettent le stockage de l'octet $01 de ram.
Etc...
Les nibbles $154 et $155 permettent le stockage de l'octet $AA de ram.
Les autres octets de la page de ram ($AB à $FF) sont stockés sur un autre secteur. Avec cette méthode, il faut 2048 / 4 = 512 nibbles soit presque 1,5 secteurs pour une page de ram.

La phase de reconstruction des octets en ram avec des nibbles codés en 4-4 est rapide mais couteuse en place.

Voilà pour les rappels. Pour plus de détail, vous pouvez vous référer par exemple au livre Beneath Apple ProDOS  de Don Worth et Pieter Lechner (Quality Software), appendix C sur le nibblizing.

************************************** < FIN RAPPEL > **************************************

Maintenant voyons quelles sont les conséquences de cela sur le Fast Boot de Chip Select.
Sur la piste 1, il a codé son fboot avec une méthode pseudo 4-4, à raison de 2 nibbles pour reconstituer un octet. Tous les nibbles jouent un role dans ce codage (c'est à dire que même s'il n'y a que 4 bits significatifs, la valeur complête du nibble est importante).
Le programme de création de disque image lui s'attend à trouver un codage 6-2 et ignore donc allègrement certains bits des nibbles $054 et $055.
De ce fait, lors du passage disquette -> ram, il y a au moins un 1 octet par secteur de massacré lors de la reconstruction (perte de donnée définitive). Il s'agit de l'octet $2A de chaque série de $AB octets.

Dans le schéma suivant, j'ai présenté les 2 méthodes de codage 6-2 et 4-4 sur le même document. On voit bien que pour la 1ère partie du codage 6-2, ce sont les 2 nibbles de fin ($054 et $055) qui vont causer le flingage des datas.


Détail Nibbles


4) Compléments Fboot ProDOS

Avoir une version en .NIB qui marche c'est bien, mais moi personnellement je ne suis pas fan de ce format. Je préfère le classique .DSK ne contenant que les octets de données avec les secteurs purgés de leur « enveloppe » d'identification.
Aussi je me suis amusé à en faire une version bis utilisant ce format.
A la place du boot 1 de la mort de feu Chip Select, j'ai mis un classique (et habituel maintenant pour ceux qui me lisent régulièrement !) Accolad-Boot qui charge la piste 1 (tout en gardant la signature texte codée de Chip Select). Le Fboot lui-même est en clair -vrai codage 6-2- (il n'y a plus aucun EOR dans le code) et il est donc hackable à volonté au sector editor ;-)).
Sur un vrai Apple II, la différence de vitesse est minime au boot (je dirais même imperceptible) car de toute façon le vrai gain de vitesse, c'est le fboot lui-même (et pas le boot 1) qui en est la cause (lorsqu'il charge le ProDOS, la présentation, le programme sélectionné)...

J'avais commencé à l'époque à mettre le Fast Boot ProDOS sous forme de source Merlin. C'est sur le disque image de sources. Il s'assemble sans problème mais je n'ai pas fini la partie des commentaires. Je ne désespère pas de m'y atteler un de ces 4 quand j'aurai un peu de temps libre pour ça, histoire de faire une adaptation pour un ProDOS 2.0.3 par exemple !)
Mais je le mets dedans en l'état pour le moment...

5) Conclusion

POUR NE PAS PRENDRE DE RISQUE, TRANSFORMEZ VOS DISQUETTES PHYSIQUES EN DISQUES IMAGE AU FORMAT .DSK, .DO, .PO AVEC LES LOGICIELS STANDARDS CLASSIQUES DISPONIBLES SUR INTERNET QUE SI LES DONNEES DE VOS DISQUETTES SONT STOCKEES DESSUS AVEC LE FORMAT 6-2. (Vous ne trouverez jamais cette information dans les documentations des émulateurs!!!!)

En effet les programmes standards de création de disques image qui vont lire les nibbles de données sur votre disquette physique s'attendent à les trouver codées en 6-2 (car ils utilisent un DOS normal).
Si ce n'est pas le cas, vous vous exposez à une reconstruction erronnées en mémoire des données -et par extension sur le disque image aussi.
Si vous ne respectez pas cette règle, la plupart des octets reconstruits par le programme de création de disques image auront les bits mélangés (ce n'est pas génant car l'émulateur remettra les nibbles en place) et le plus important, c'est que quelques uns seront définitivement altérés (perte d'informations par rapport aux données originelles).

Si vous pensez avoir sauvegardé le contenu d'une disquette d'une mort certaine (dû à l'age) en créant un disk image .DSK et en  vous disant que de toute façon si ça ne marche pas avec un émulateur, il suffit (quand vous aurez le temps) soit de modifier  l'émulateur soit de changer le programme émulé (routine de controle du drive), il y a une certaine probabilité pour que vous ayez tout faux. Il y a le risque que votre disk image proprement dit soit incorrect (des octets différents de l'original) et dans ce cas de figure, votre disquette est belle et bien perdue à jamais.
A BON ENTENDEUR!!!!


Pour le reste (4-4 ou 5-3), utilisez systématiquement des .NIB. Ce n'est qu'avec ce format que vous pouvez être sûr que la routine de gestion du drive de votre programme émulé relira correctement les nibbles (sans omission).
Le fait d'écrire des variantes de ces programmes de création de disques image avec une routine de lecture de la disquette physique dotée d'un décodage adapté au 4-4 ou au 5-3 n'est pas suffisant car après, tout dépend comment l'émulateur fait le lien entre des instructions de lecture du drive du programme émulé (qui travaille au niveau nibble) et les octets stockés dans le disque image... S'il retransforme les octets du .DSK, .DO ou .PO en nibbles 6-2, vous allez droit au crash. Avec un .NIB, les données du disque image restent toujours sous forme de nibbles.

Il n'y a hélas pas de solution miracle pour savoir si les données de votre disquette sont en 6-2 ou pas si vous n'en êtes pas l'auteur (comme on l'a vu, le fait que la disquette se duplique sans soucis avec Locksmith Fast Backup n'est en rien un indicateur; idem pour un traitement sans erreur de votre programme de création de disks image).
Soit vous le savez car vous maîtrisez vos données, soit il faut analyser la routine de lecture utilisée pour les exploiter...
Bons désassemblages ! ! !



Quand vous avez un problème de disk image qui ne fonctionne pas avec un émulateur, rechercher en 1er une explication avec votre vrai apple II car si ça se trouve votre .DSK ne correspond pas à 100% à votre disquette physique.

Moralité, faites du propre (6-2), ne soyez pas parano et ne perdez pas de place sur votre disquette avec ces conneries pour un gain de temps misérable.

C'est quand même navrant de voir de chouettes outils finir à la poubelle pour cause d'emploi de formats non standards. Pour la petite histoire, j'ai encore de la récup à faire (donc du temps perdu pour autre chose) pour l'outil d'identification / capture / manipulation de sprites Anstrom 2.3 et ses OP PLUS, signés 'El Mathos' (oui, le mec de Sergent Claude puis du FTA sur GS mais lors de sa période IIe antérieure - on touche à de l'historique là!!) le tout distribué par Dany Sector. Le programme en lui-même, c'est du tout bon mais beuurrk il a collé un format « grosse merde » non copiable au Locksmith en plus (uniquement au Disk Muncher - donc avec des trailers à la noix ou je ne sais quelle branlette intellectuelle matheusienne). Dire que j'ai encore à me faire ch... pour un programme underground qui était vendu 60 francs (allez je déconne, ça m'amuse de fouiner dans ces vieilleries ;-). Rien que l'intro me plait bien avec son magicien et son scroll informatif...)
Le pire, c'est qu'il avait fait des démos de son soft (il en mentionne 2).
Je n'en ai qu'une seule : une animation de Rescue Raiders avec des sprites complètement refaits et bien délirants (l'hélicoptère qui ressemble à une sorte de saucisse sans ses pales, un véhicule terrestre transformé en pac-mac, des parachutistes en forme de croix de cimetière, ...)
Et ces animations sont aussi « plombées » !!! La rescue Raiders peut quand même s'exécuter sur émulateur en .NIB mais pour le programme Anstrom 2.3, alors là basta -ça plante!
GRRRR !  y-a des bytes dans la gueule qui se perdent hé hé hé...

6) Dernière minute:

Arghhhh de nouveau!!!

Quand on lance le Locksmith depuis le .NIB ou depuis le .DSK sous émulateur, cette version patchée par Chip Select se plante! Pourtant ma version Accolad-Boot fonctionne sur un vrai IIe et j'ai essayé le process disquette -> .DSK -> disquette.
Résultat: le Locksmith tourne impeccable.

Il y a donc encore un problème, mais là je mise plutôt sur une incompatibilité car le plantage est différent selon qu'on utilise Applewin ou Apple Oasis.

Encore un truc tordu planqué quelque part :-((
Je remets la recherche de ce problème à plus tard. Mon objectif était d'avoir ce Fboot dispo.
A noter que le Copy II+ lui semble tourner sans soucis et le BASIC.SYSTEM marche bien aussi.
Faire tourner des bit copiers sur émulateur n'a pas de sens aussi pour les autres, je ne sais pas.


Ecran Fboot ProDOS
Ecran Fboot ProDOS
Ecran Fboot ProDOS
Ecran Fboot ProDOS
Ecran Fboot ProDOS
Ecran Fboot ProDOS
Ecran Fboot ProDOS
Ecran Fboot ProDOS
Ecran Fboot ProDOS
Ecran Fboot ProDOS


Floppy
Fboot + ProDOS
Download FBoot ProDOS .NIB (gzipped)
Floppy
Fboot + ProDOS
Download FBoot ProDOS .DSK (gzipped)
Floppy
DOS 3.3
Download FBoot ProDOS sources (gzipped)

Disk : Fboot_Prodos_Chip_Select_Sources.dsk
"-" files are DELETED files | "*" files are LOCKED files
----------------------------------------------------------------------
 A A$0000 (000000) L$0003 (000003) 002 HELLO                        
 B A$0800 (002048) L$0100 (000256) 003 BOOT1.ORIGINAL               
 T A$0000 (000000) L$2400 (009216) 036 T.BOOT1.APRES.EOR            
 B A$0800 (002048) L$0100 (000256) 003 BOOT1.APRES.EOR              
 B A$8000 (032768) L$103E (004158) 018 READ.ME.ORIGINAL             
 B A$1000 (004096) L$0050 (000080) 002 READ.ME.DECODE               
 B A$8000 (032768) L$103E (004158) 018 READ.ME.HACK.BRUNABLE        
 B A$1000 (004096) L$1000 (004096) 018 BOOT2.ORIGINAL               
 B A$1000 (004096) L$1000 (004096) 018 BOOT2.APPLEWIN               
 B A$B000 (045056) L$1000 (004096) 018 BOOT2                        
 T A$0000 (000000) L$3D00 (015616) 061 T.BOOT2                      

This catalog contains 11 files. 0 were DELETED.
----------------------------------------------------------------------



7) Sommaire Annexes


Lien Contenu
Voir Source Boot 1.
Voir Message de Chip Select avec l'historique des Fast Boots.
Voir Doc du Fast Boot ProDOS.


hr Fboot ProDOS


Source Boot 1.



:asm
                1   
                2                  ORG    $0800
                3   
                4    ********************************
                5    *                              *
                6    *   BOOT 1 FBOOT PRODOS 2.0    *
                7    *        CHIP SELECT           *
                8    *     Source by Deckard        *
                9    *                              *
                10   ********************************
                11  
                12   NB_SECT       EQU    $00       ; nbr de secteurs à charger
                13   CPT           EQU    $01       ; compteur couple nibble datas
                14   INDICE_WT     EQU    $03       ; indice écriture
                15   ADR_LOAD      EQU    $26       ; et $27 : pointeur adresse implantation
                16   SECTOR        EQU    $3D       ; secteur à charger
                17  
                18   IN            EQU    $0200     ; buffer clavier!
                19   BOOT2         EQU    $B000     ; lancement fboot
                20  
                21   HC08C         EQU    $C08C     ; remplit le latch (indexation slot16)
                22   HC0E0         EQU    $C0E0     ; $C080,60 -> motor phase 0 off
                23   HC0E2         EQU    $C0E2     ; $C082,60 -> motor phase 1 off
                24   HC0E3         EQU    $C0E3     ; $C083,60 -> motor phase 1 on
                25   HC0E5         EQU    $C0E5     ; $C085,60 -> motor phase 2 on
                26   HC0EC         EQU    $C0EC     ; $C08C,60 : remplit le latch slot 6
                27   HOME          EQU    $FC58     ; efface écran
                28   WAIT          EQU    $FCA8     ; tempo
                29  
                30   *-------------------------------
                31  
                32   BOOT1                          ; Y=0
0800: 01        33                 DFB    1         ; 1 secteur à charger
                34  
0801: B9 00 08  35   :1            LDA    BOOT1,Y   ; recopie le code du boot1 -> buffer clavier!
0804: 49 60     36                 EOR    #$60      ; après déprotection EOR
0806: 99 00 02  37                 STA    IN,Y     
0809: 88        38                 DEY             
080A: D0 F5     39                 BNE    :1        ; recopie toute la page
080C: 4C 0F 02  40                 JMP    BOOT1_GO  ; lance la suite sur le buffer clavier
                41  
                42   *-------------------------------
                43  
                44   * Tout le programme qui suit est normalement codé par
                45   * un EOR #$60. Le programme est difficilement modifiable,
                46   * mais en rusant on peut s'en sortir. En effet, comme
                47   * protection mémoire, Chip Select a utilisé le propre
                48   * code du boot1 comme référence pour le décodage des
                49   * nibbles. Il y a ainsi 64 octets de ce boot 1 qui sont
                50   * intouchables! Il s'agit des octets dont les indices
                51   * dans cette page sont compris entre $96 et $FF (enfin
                52   * pas tous mais une bonne partie).
                53   * Au moindre de ces octets changé, le décodage des nibbles
                54   * sera inexact.
                55   * Bien entendu les passages importants comme le décodage des
                56   * nibbles font parties de ces octets intouchables!!
                57  
                58                 ORG    $020F     ; on est dans le buffer clavier normalement
                59                                  ; au moment de l'exec
                60   BOOT1_GO                      
020F: EE F3 03  61                 INC    $03F3     ; reset provoque reboot
0212: EE F0 03  62                 INC    $03F0     ; crash BRK
                63  
0215: E0 60     64                 CPX    #$60      ; doit booter depuis slot 6
0217: D0 FE     65   H0817         BNE    H0817     ; sinon, boucle sans fin
                66  
0219: 20 A6 02  67                 JSR    H02A6     ; signature + passage piste 1
                68  
021C: A9 00     69                 LDA    #0       
021E: 85 03     70                 STA    INDICE_WT ; on commencera avec Y=0
0220: A9 B0     71                 LDA    #>BOOT2  
0222: 85 27     72                 STA    ADR_LOAD+1
0224: A9 10     73                 LDA    #$10     
0226: 85 00     74                 STA    NB_SECT   ; nbr de secteurs à charger
                75  
0228: A9 FF     76                 LDA    #$FF     
022A: 85 3D     77                 STA    SECTOR    ; secteur à charger
                78                                  ; +1 -> commence par secteur 0
                79  
                80   ********************************
                81   * Traitement d'un secteur
                82   ********************************
                83  
022C: E6 3D     84   H082C         INC    SECTOR   
022E: A9 AB     85                 LDA    #$AB      ; repositionne compteur couple nibbles
0230: 85 01     86                 STA    CPT      
0232: C6 00     87                 DEC    NB_SECT   ; un secteur de moins à charger
0234: F0 6D     88                 BEQ    H08A3     ; si 0, le compte est bon -> boot 2
                89  
                90   *-------------------------------
                91   * Recherche markers secteur
                92   *-------------------------------
                93  
0236: A2 60     94                 LDX    #$60      ; slot*16
0238: 18        95   H0838         CLC              ; c=0 -> on commence par la phase adresse
                96  
0239: 08        97   H0839         PHP              ; mémorise phase
                98  
023A: BD 8C C0  99   H083A         LDA    HC08C,X   ; lecture nibble
023D: 10 FB     100                BPL    H083A    
                101 
023F: 49 D5     102  H083F         EOR    #$D5      ; 1er marker
0241: D0 F7     103                BNE    H083A    
                104 
0243: BD 8C C0  105  H0843         LDA    HC08C,X   ; lecture nibble
0246: 10 FB     106                BPL    H0843    
                107 
0248: C9 AA     108                CMP    #$AA      ; 2nd marker
024A: D0 F3     109                BNE    H083F    
                110 
024C: EA        111                NOP             
024D: BD 8C C0  112  H084D         LDA    HC08C,X   ; lecture nibble
0250: 10 FB     113                BPL    H084D    
                114 
0252: C9 96     115                CMP    #$96      ; 3eme marker (test marker adresse par défaut)
0254: F0 09     116                BEQ    H085F     ; ok marker D5AA96 found (champ adresses)
                117 
0256: 28        118                PLP              ; récupère phase
0257: 90 DF     119                BCC    H0838     ; si on était en phase adresse et que le 3eme
                120                                 ; marker n'est pas le bon, on recommence la
                121                                 ; recherche à partir du 1er marker adresse
                122 
0259: 49 AD     123                EOR    #$AD      ; phase data -> check dernier marker
025B: F0 25     124                BEQ    H0882     ; ok marker D5AAAD found (champ datas)
                125 
                126                                 ; bad!
025D: D0 D9     127                BNE    H0838     ; recommence tout depuis phase champ adresse
                128 
                129  *-------------------------------
                130  * Analyse champ adresse
                131  *-------------------------------
                132 
                133  * On a trouvé les markers adresse. On analyse la suite.
                134  * D5AA96
                135  * XX XX -> volume           codage 4x4 (2 nibbles)
                136  * XX XX -> track            codage 4x4 (2 nibbles)
                137  * XX XX -> secteur physique codage 4x4 (2 nibbles)
                138  * XX XX -> checksum         codage 4x4 (2 nibbles)
                139  * D5AAAD
                140 
025F: A0 03     141  H085F         LDY    #$03      ; skip volume et track
0261: 85 40     142  H0861         STA    $40       ; sauve dernier octet reconstruit lu
                143 
0263: BD 8C C0  144  H0863         LDA    HC08C,X   ; 1A1B1C1D
0266: 10 FB     145                BPL    H0863    
                146 
0268: 2A        147                ROL              ; 1er nibble octet en 4x4
0269: 85 3C     148                STA    $3C       ; A1B1C1D1
                149 
026B: BD 8C C0  150  H086B         LDA    HC08C,X   ; 1E1F1G1H
026E: 10 FB     151                BPL    H086B    
                152 
0270: 25 3C     153                AND    $3C       ; 2nd nibble octet en 4x4
                154                                 ; = AEBFCGDH (octet reconstruit)
0272: 88        155                DEY             
0273: D0 EC     156                BNE    H0861    
                157                                 ; après lecture 2 nibbles du secteur
0275: 28        158                PLP              ; dépile état (en retard) avant phase data
0276: C5 3D     159                CMP    SECTOR    ; est-ce le bon secteur?
0278: D0 BE     160  H0878         BNE    H0838     ; non, passe à un autre secteur
                161 
027A: A5 40     162                LDA    $40       ; dernier octet reconstitué=track
027C: C9 01     163                CMP    #$01      ; le code du fboot doit se trouver en piste 1
027E: D0 B8     164                BNE    H0838     ; pas la piste 1 -> anormal, recommence!
                165 
0280: B0 B7     166                BCS    H0839     ; toujours. Signale passage à phase data (c=1)
                167 
                168  *-------------------------------
                169  * Analyse champ data
                170  *-------------------------------
                171 
                172  * Dans un secteur normal de datas, il y a $156 (=342) nibbles
                173  * plus un checksum. Le codage est en 6x2 et au final, on
                174  * récupère 256 octets.
                175  * Ici on en utilise 2*$AB=$156, c'est à dire le meme chiffre
                176  * mais le codage est trafiqué (2 nibbles pour un octet mais ce
                177  * n'est pas du 4x4). L'objectif de Chip Select était d'une part
                178  * de faire une protection mémoire (son fast boot n'est pas
                179  * lisible directement avec un éditeur de secteurs) mais aussi
                180  * en terme de rapidité, on grignote quelques parcelles de
                181  * temps en s'épargnant un denibblizing 6x2 forcément plus lent.
                182  * Par contre, il y a une perte de place sur la piste 1:
                183  * on ne récupère que $AB (=171) octets par secteur.
                184  * En chargeant 16 secteurs, on récupère 16*171=2736=$AB0 octets.
                185  * La mèmoire correspondante est: $B000-$BAAF
                186 
0282: A4 03     187  H0882         LDY    INDICE_WT ; reprend indice où on l'avait laissé
                188 
                189  * Lecture de 2 * $AB nibbles
                190 
0284: AE EC C0  191  H0884         LDX    HC0EC     ; lecture 1er nibble (=offset)
0287: 10 FB     192                BPL    H0884    
                193 
0289: BD 00 02  194                LDA    IN,X      ; transco avec les octets du programme
028C: AE EC C0  195  H088C         LDX    HC0EC     ; lecture 2nd nibble (=offset)
028F: 10 FB     196                BPL    H088C    
                197 
0291: 1D 00 02  198                ORA    IN,X      ; mixage octet (toujours avec code programme)
0294: 91 26     199                STA    (ADR_LOAD),Y ; sauvegarde octet
                200                                 ; //nibble $96 = $C8
0296: C8        201                INY             
                202                                 ; //nibble $97 = $D0
0297: D0 02     203                BNE    H089B     ; pas encore fin de page
                204                                 ; //nibble $9A = $27
0299: E6 27     205                INC    ADR_LOAD+1 ; adr implantation high +1
                206 
                207                                 ; //nibble $9B = $C6
029B: C6 01     208  H089B         DEC    CPT       ; compteur-1
                209                                 ; //nibble $9D = $D0
                210                                 ; //nibble $9E = $E5
029D: D0 E5     211                BNE    H0884     ; pas encore 2*$AB nibbles
                212                                 ; //nibble $9F = $84
029F: 84 03     213                STY    INDICE_WT ; sauve indice Y pour reprise prochain secteur
02A1: F0 89     214                BEQ    H082C     ; toujours
                215 
02A3: 4C 00 B0  216  H08A3         JMP    BOOT2     ; lance boot 2
                217 
                218  *-------------------------------
                219  * Signature texte <ABC> + trck 1
                220  *-------------------------------
                221 
                222  * Déplacement tete de lecture sur la piste 1
                223  * La tete était actuellement en piste 0.
                224 
                225                                 ; //nibble $A6 = $8D
                226                                 ; //nibble $A7 = $E0
02A6: 8D E0 C0  227  H02A6         STA    $C0E0     ; phase 0 off (slot 6)
                228                                 ; //nibble $AB = $C0
02A9: 8D E3 C0  229                STA    $C0E3     ; phase 1 on
                230                                 ; //nibble $AC = $A9
                231                                 ; //nibble $AD = $30
02AC: A9 30     232                LDA    #$30      ; délai
                233                                 ; //nibble $AE = $20
                234                                 ; //nibble $AF = $A8
02AE: 20 A8 FC  235                JSR    WAIT     
                236                                 ; //nibble $B2 = $E2
                237                                 ; //nibble $B3 = $C0
02B1: 8D E2 C0  238                STA    $C0E2     ; phase 1 off
                239                                 ; //nibble $B4 = $8D
                240                                 ; //nibble $B5 = $E5
                241                                 ; //nibble $B6 = $C0
02B4: 8D E5 C0  242                STA    $C0E5     ; phase 2 on
                243 
                244  * Signature codée <ABC> en inverse
                245 
                246                                 ; //nibble $B7 = $20
                247                                 ; //nibble $B9 = $FC
02B7: 20 58 FC  248                JSR    HOME     
                249                                 ; //nibble $BA = $A0
                250                                 ; //nibble $BB = $05
02BA: A0 05     251                LDY    #$05      ; indice de 1 à 5
                252                                 ; //nibble $BC = $18
02BC: 18        253  H08BC         CLC             
                254                                 ; //nibble $BD = $98
02BD: 98        255  H08BD         TYA              ; utilise l'indice comme valeur d'ajout
                256                                 ; //nibble $BE = $79
                257                                 ; //nibble $BF = $DF
02BE: 79 DF 02  258                ADC    H02E0-1,Y ; à la signature elle meme
02C1: 99 B9 05  259                STA    $05B9,Y   ; directement sur l'écran 40 colonnes
02C4: 88        260                DEY             
02C5: D0 F5     261                BNE    H08BC    
02C7: 60        262                RTS             
                263 
                264  *-------------------------------
                265 
02C8: 00 00 00  266                DS     3,0       ; not used
                267 
02CB: 00        268  H02CB         HEX    00        ; nibble $CB = $00
                269 
02CC: 00        270                HEX    00        ; not used
                271 
02CD: 00        272  H02CD         HEX    00        ; nibble $CD = $00
02CE: 00        273  H02CE         HEX    00        ; nibble $CE = $00
02CF: 00        274  H02CF         HEX    00        ; nibble $CF = $00
                275 
02D0: 00 00 00  276                DS     3,0       ; not used
                277 
02D3: 00        278  H02D3         HEX    00        ; nibble $D3 = $00
                279 
02D4: 00 00     280                DS     2,0       ; not used
                281 
                282  * Liste "pratique" de nibbles car ils représentent
                283  * toutes les possibilités pour les 4 derniers bits
                284  * de l'octet à reconstituer.
                285 
02D6: 00        286  H02D6         HEX    00        ; nibble $D6
02D7: 01        287  H02D7         HEX    01        ; nibble $D7
                288 
02D8: D8        289                HEX    D8        ; not used
                290 
02D9: 02        291  H02D9         HEX    02        ; nibble $D9
02DA: 03        292  H02DA         HEX    03        ; nibble $DA
02DB: 04        293  H02DB         HEX    04        ; nibble $DB
02DC: 05        294  H02DC         HEX    05        ; nibble $DC
02DD: 06        295  H02DD         HEX    06        ; nibble $DD
02DE: 07        296  H02DE         HEX    07        ; nibble $DE
02DF: 08        297  H02DF         HEX    08        ; nibble $DF
                298 
                299  *-------------------------------
                300 
02E0: 3B FF FF  301  H02E0         HEX    3BFFFFFF39 ; signature <ABC> codée
02E3: FF 39
                302 
                303  *-------------------------------
                304 
02E5: 09        305  H02E5         HEX    09        ; nibble $E5
02E6: 0A        306  H02E6         HEX    0A        ; nibble $E6
02E7: 0B        307  H02E7         HEX    0B        ; nibble $E7
                308 
02E8: 11        309                HEX    11        ; not used
                310 
02E9: 0C        311  H02E9         HEX    0C        ; nibble $E9
02EA: 0D        312  H02EA         HEX    0D        ; nibble $EA
02EB: 0E        313  H02EB         HEX    0E        ; nibble $EB
02EC: 0F        314  H02EC         HEX    0F        ; nibble $EC
                315 
                316  * Liste "pratique" de nibbles car ils représentent
                317  * toutes les possibilités pour les 4 premiers bits
                318  * de l'octet à reconstituer.
                319 
02ED: 00        320  H02ED         HEX    00        ; nibble $ED
02EE: 10        321  H02EE         HEX    10        ; nibble $EE
02EF: 20        322  H02EF         HEX    20        ; nibble $EF
                323 
02F0: C4 D9     324                HEX    C4D9      ; not used
                325 
02F2: 30        326  H02F2         HEX    30        ; nibble $F2
02F3: 40        327  H02F3         HEX    40        ; nibble $F3
02F4: 50        328  H02F4         HEX    50        ; nibble $F4
02F5: 60        329  H02F5         HEX    60        ; nibble $F5
02F6: 70        330  H02F6         HEX    70        ; nibble $F6
02F7: 80        331  H02F7         HEX    80        ; nibble $F7
                332 
02F8: F8        333                HEX    F8        ; not used
                334 
02F9: 90        335  H02F9         HEX    90        ; nibble $F9
02FA: A0        336  H02FA         HEX    A0        ; nibble $FA
02FB: B0        337  H02FB         HEX    B0        ; nibble $FB
02FC: C0        338  H02FC         HEX    C0        ; nibble $FC
02FD: D0        339  H02FD         HEX    D0        ; nibble $FD
02FE: E0        340  H02FE         HEX    E0        ; nibble $FE
02FF: F0        341  H02FF         HEX    F0        ; nibble $FF
                342 
                343                SAV    BOOT1.APRES.EOR

Object saved as BOOT1.APRES.EOR,A$0800,L$0100



--End assembly, 256 bytes, Errors: 0


Symbol table - alphabetical order:

   ADR_LOAD     =$26        BOOT1        =$0800      BOOT1_GO     =$020F      BOOT2        =$B000
   CPT          =$01        H02A6        =$02A6   ?  H02CB        =$02CB   ?  H02CD        =$02CD
?  H02CE        =$02CE   ?  H02CF        =$02CF   ?  H02D3        =$02D3   ?  H02D6        =$02D6
?  H02D7        =$02D7   ?  H02D9        =$02D9   ?  H02DA        =$02DA   ?  H02DB        =$02DB
?  H02DC        =$02DC   ?  H02DD        =$02DD   ?  H02DE        =$02DE   ?  H02DF        =$02DF
   H02E0        =$02E0   ?  H02E5        =$02E5   ?  H02E6        =$02E6   ?  H02E7        =$02E7
?  H02E9        =$02E9   ?  H02EA        =$02EA   ?  H02EB        =$02EB   ?  H02EC        =$02EC
?  H02ED        =$02ED   ?  H02EE        =$02EE   ?  H02EF        =$02EF   ?  H02F2        =$02F2
?  H02F3        =$02F3   ?  H02F4        =$02F4   ?  H02F5        =$02F5   ?  H02F6        =$02F6
?  H02F7        =$02F7   ?  H02F9        =$02F9   ?  H02FA        =$02FA   ?  H02FB        =$02FB
?  H02FC        =$02FC   ?  H02FD        =$02FD   ?  H02FE        =$02FE   ?  H02FF        =$02FF
   H0817        =$0217      H082C        =$022C      H0838        =$0238      H0839        =$0239
   H083A        =$023A      H083F        =$023F      H0843        =$0243      H084D        =$024D
   H085F        =$025F      H0861        =$0261      H0863        =$0263      H086B        =$026B
?  H0878        =$0278      H0882        =$0282      H0884        =$0284      H088C        =$028C
   H089B        =$029B      H08A3        =$02A3      H08BC        =$02BC   ?  H08BD        =$02BD
   HC08C        =$C08C   ?  HC0E0        =$C0E0   ?  HC0E2        =$C0E2   ?  HC0E3        =$C0E3
?  HC0E5        =$C0E5      HC0EC        =$C0EC      HOME         =$FC58      IN           =$0200
   INDICE_WT    =$03        NB_SECT      =$00        SECTOR       =$3D        WAIT         =$FCA8



Symbol table - numerical order:

   NB_SECT      =$00        CPT          =$01        INDICE_WT    =$03        ADR_LOAD     =$26
   SECTOR       =$3D        IN           =$0200      BOOT1_GO     =$020F      H0817        =$0217
   H082C        =$022C      H0838        =$0238      H0839        =$0239      H083A        =$023A
   H083F        =$023F      H0843        =$0243      H084D        =$024D      H085F        =$025F
   H0861        =$0261      H0863        =$0263      H086B        =$026B   ?  H0878        =$0278
   H0882        =$0282      H0884        =$0284      H088C        =$028C      H089B        =$029B
   H08A3        =$02A3      H02A6        =$02A6      H08BC        =$02BC   ?  H08BD        =$02BD
?  H02CB        =$02CB   ?  H02CD        =$02CD   ?  H02CE        =$02CE   ?  H02CF        =$02CF
?  H02D3        =$02D3   ?  H02D6        =$02D6   ?  H02D7        =$02D7   ?  H02D9        =$02D9
?  H02DA        =$02DA   ?  H02DB        =$02DB   ?  H02DC        =$02DC   ?  H02DD        =$02DD
?  H02DE        =$02DE   ?  H02DF        =$02DF      H02E0        =$02E0   ?  H02E5        =$02E5
?  H02E6        =$02E6   ?  H02E7        =$02E7   ?  H02E9        =$02E9   ?  H02EA        =$02EA
?  H02EB        =$02EB   ?  H02EC        =$02EC   ?  H02ED        =$02ED   ?  H02EE        =$02EE
?  H02EF        =$02EF   ?  H02F2        =$02F2   ?  H02F3        =$02F3   ?  H02F4        =$02F4
?  H02F5        =$02F5   ?  H02F6        =$02F6   ?  H02F7        =$02F7   ?  H02F9        =$02F9
?  H02FA        =$02FA   ?  H02FB        =$02FB   ?  H02FC        =$02FC   ?  H02FD        =$02FD
?  H02FE        =$02FE   ?  H02FF        =$02FF      BOOT1        =$0800      BOOT2        =$B000
   HC08C        =$C08C   ?  HC0E0        =$C0E0   ?  HC0E2        =$C0E2   ?  HC0E3        =$C0E3
?  HC0E5        =$C0E5      HC0EC        =$C0EC      HOME         =$FC58      WAIT         =$FCA8


Retour sommaire

hr Fboot ProDOS


Message Chip Select et historique des Fast Boots.


Le programme affichant le message s'appelle "-READ ME".
Il utilise des caractères interdits par ProDOS.
Paranoïa oblige, bien entendu les informations du programme ont été modifiées directement dans le catalog ProDOS (bloc 2) pour miner le travail de récupération ou d'altération de son texte.
J'ai du shunter tout ça pour récupérer le message au propre ;-)

Le texte de READ.ME est codé par un EOR évolutif à partir d'une valeur qui n'est présente que lorsque le programme est lancé depuis le menu du FBOOT (à savoir avec la valeur $80 à l'adresse $05).
Après exécution le programme fait un CALL $0000 et retourne ainsi dans la gestion du catalog du FBOOT de Chip Select.

le programme débute en $8000 et a une longueur de $103E.
Les datas du texte sont à partir de $8059.
En catalogue sur la disquette de source, il y a la version d'origine et une version sans le codage avec le texte en clair.
Cette version peut être lancée directement avec la commande BRUN.
J'ai aussi viré le bruitage, le défilement est plus rapide et ininterrompu..
Le texte est prévu pour s'afficher sur un écran en mode 40 colonnes.

----------------------------------------

D'ABORD QUELQUES MESSAGES PERSONNELS


UN GRAND BONJOUR A


- CTHULHU,
- YOG-SOTHOTH,
- DAGON ...
  ET TOUS LES AUTRES MEMBRES DU CMS

- DOM,CHRIS ... DE COPYART

- NUMERO 6

- LOT & TMM

- MISTER Z ET MERLIN

- ALDO RESET

- JPL ET MICMAC
  SANS OUBLIER CE CHER SOFTMAN

- LE COCHONOU CRACK BAND

- TEUTON HEROIQUE

- THE COPIRATE

- CAPTAIN SHOCK

- CLING CLANG CLUNG

- EM FROM US-IMPORT

- BILL

- BERNARD, LAURENT,HERVE..
- SERGE, DENIS, MICHAEL
- PATRICK,

- BRUNO,JEAN,JEAN-FRANCOIS,FRANCK
- MARC,JD BUG,TBK,HUGO,CONCOMBRE..
- FRANCOISE, AGATHE, VERONIQUE
- SABINE, JACQUELINE,CATHY...

- LE GUIOCHON FAN CLUB

- ET BIEN SUR TOUS LES MEMBRES DE
           -= A B C =-

 *** ERIC IRQ    ***
 *** THE WILDMAN ***


UN GRAND BONJOUR A TOUS..



----------------------------------------



ET MAINTENANT LES CHOSES SERIEUSES !!

 J'AI ENTENDU DIRE PAR UN DENOMME
GODFATHER QUE JE N'AURAI POINT FAIT DE
FAST-BOOT. SOIT, VU QU'IL DONNE
L'IMPRESSION D'AVOIR PRIS LE FILM EN
ROUTE VOICI POUR SA GOUVERNE UNE PETITE
RETROSPECTIVE DES FAST-BOOT

 D'ABORD L'ORIGINE DE CETTE ROUTINE DE
CHARGEMENT RAPIDE :
ELLE VIENT EN GRANDE PARTIE DE PASCAL
ET A ETE RECUPEREE PAR ELECTRONIC ART
POUR SES JEUX .
DE MEME ON LA RETROUVE SOUS UNE FORME
DIFFERENTE DANS LE DRIVER DISK II PRODOS

 JE N'AI RIEN INVENTE JE LE RECONNAIS
BIEN VOLONTIERS AYANT JUSTE MODIFIE
CETTE ROUTINE POUR LA FAIRE CONVENIR
A MES BESOINS.
(MAINTENANT ELLE NE RESSEMBLE PLUS
TELLEMENT A LA ROUTINE D'ORIGINE)

 VU QUE L'ON PARLE DE FBOOT IL EST
INTERESSANT DE REMARQUER QUE LA
DENOMINATION FBOOT OU FAST-BOOT A ETE
TROUVEE PAR ERIC ET MOI EN ANALOGIE AU
SPEEDY BOOT DE MICMAC & THE SOFTMAN
(REGARDEZ LA PRESENTATION DES DEUX )
EN EFFET C'EST LA VUE DU SPEEDY BOOT QUI
NOUS A DONNE L'ENVIE DE FAIRE NOTRE
PROPRE COMPILATION DE COPIEURS A
CHARGEMENT RAPIDE. LE PREMIER ESSAI NE
FUT PAS TERRIBLE.UTILISANT LA RWTS IL
N'AVAIT DE FBOOT QUE LE NOM.
PUIS ERIC A MIS LA MAIN SUR LA ROUTINE
DE CHARGEMENT DE GO ONE ON ONE.
ROUTINE QUI MODIFIEE ET AMELIOREE
EST AU CENTRE DE TOUS MES FBOOTS, DE
CETTE REVELATION EST APPARU
COURANT 84 MON PREMIER FBOOT (TM)
LE COPY DISK BCB, CONJOINTEMENT AVEC
CELUI D'ERIC : COPYDISK DCA.

 POUR EN REVENIR A LA PARTIE HISTORIQUE

LE PREMIER FAST-BOOT (A MA CONNAISSANCE)
EST LE SPEEDY-BOOT DE MICMAC AND THE
SOFTMAN EN 1983
ARRIVE DERRIERE LE 1ER FBOOT TEXTE DE
LUKE SKYWALKER (EN 84).

 C'EST SEULEMENT EN 84 QUE MON 1ER FBOOT
APPARAIT
 CE FBOOT TRES CARACTERISTIQUE AU NON
ARRET DU DRIVE A ETE LE PLUS POMPE
JE L'AI RETROUVE PRESQUE NON MODIFIE
(L'ARRET DU DRIVE EN PLUS...) SOUS
LA DENOMINATION TSUNOO FROM TROLL & CO
ZORRO FBOOT.....
DE MEME M JL LEBRETON LA OBLIGEAMMENT
UTILISE POUR CERTAINS DE SES JEUX ...
(MEME LES POMMES DE TERRE ....
 LE MUR DE BERLIN...
LA FEMME QUI NE SUPPORTAIT)
EN LAISSANT MEME LA ROUTINE DE CHECKSUM
DE LA PAGE GRAPHIQUE
TOUJOURS VERS LA MEME EPOQUE
UN DENOMME FREDERIC MUTTER EN A PUBLIE
UN DUMP HEXA DANS HEBDOGICIEL SOUS LE
NOM DE FBOOT MAKER. A QUAND LA PERSONNE
LEUR ENVOYANT UN DUMP HEXA DU LOCKSMITH
M'ENFIN ? BON JE M'EGARE ...


 QUELQUES MOIS PLUS TARD JE SORS UN
NOUVEAU FBOOT SOUS LE NOM DE COPY DISK
ABC.

 85 - SORTIE DE L'HYPERQUICK LOADER DE
TROLL & CO LARGEMENT POMPE SUR LE
FBOOT DE LUKE SKYWALKER
VERS LA MEME EPOQUE LE SPEEDY
BOOT EST PUBLIE PAR P GUIOCHON SOUS LE
NOM DE GOLD-QQCHOSE DANS GOLDEN
ET UN POMPEUR UN...


 D'AILLEURS EN PARLANT DE POMPEUR DANS
L'HYPER QUICK LOADER DU 17 JUIN 85
ON A DROIT AUX AVEUX COMPLETS DE TSUNOO


 85 C'EST AUSSI LA SORTIE DE MON FBOOT
CONTENANT LE COPY II+ 5.0 ET UN DOS
COMME QUOI...


 BON J'ARRIVE A LA FIN DE MON PETIT
RAPPEL AVEC MON DERNIER FBOOT EN DATE :
LE FBOOT 2.0

LE SEUL FBOOT PRODOS (POUR L'INSTANT)
UTILISANT DES FICHIERS PRODOS NORMAUX
ET FONCTIONNANT AVEC DEUX DRIVES

LE PIED QUOI !



MAINTENANT GODFATHER SI TU N'AS PAS
COMPRIS C'EST QUE TU ES REELLEMENT
BOUCHE.

SALUT A TOUS.
-------------- > CHIP SELECT A.B.C.



PS: LISEZ DONC LE FICHIER DOC..
    AVANT DE RALER.!!

BAISEZ UNE MOUCHE POUR POURSUIVRE


Retour sommaire

hr Fboot ProDOS


Doc du Fast Boot ProDOS.



         FBOOT 2.0 REVISION A COPYRIGHT CHIP SELECT

                    ------------------
                    ! DOC PROVISOIRE !
                    ------------------


]1 RAJOUT DE PROGRAMMES .

     Pour ce faire utiliser tout simplement le filer Prodos ou bien le
     copy II+ 6.X;
     Tous fichier binaire prodos est rajoutable au Fboot et apparaitra
     au catalogue s'il est verrouillé

]2 CREATION D'UNE DISQUETTE FBOOT .

     - Copiez cette disquette avec le locksmith (fast backup),
     - Deletez le disk avec le copy 2+
     - Editez le bloc 6 (Bit map) et marquez occupé les blocs
       0 à 15 ( deux premiers octets à zéro )
     - Modifiez la page de boot si nécéssaire
     - Installez les nouveaux fichiers avec un filer.

]3 COMMANDES DU FBOOT .

     ^S   : Son On/Off
     ^B   : Sortie sous basic (sans le basic.system)
     ESC  : Equivalent du quit prodos si prodos est chargé
     Fleches droite gauche
          : sélectionne le drive et lit son catalogue
     Lettres entre crochets
          : Run le programme

]4 ORGANISATION PHYSIQUE .

     Bloc 0  : Secteur de boot
     Bloc 1
     Bloc 2  : Catalogue ProDOS
       à  4
     Bloc 6  : Bit map
     Bloc 7  : page texte de boot et paramettres
     Piste 1 : Image du Fboot ( Bloc 8 à 15 )

     Description des blocs 1 et 7

     Représente une page texte
     Block 1 $400-$5FF
           7 $600-$7FF

     la premiere et la derniere ligne de cette page sont affichées sur
     le catalogue à leur place respective.
     le reste de la page est affichée à la place du catalogue suivant
     les options.

     Options
     $478 : numéro de piste à éviter $FF aucune piste
            ex $11 pour éviter le catalogue Dos.
     $479 : $FF : Lors du boot lance le premier programme verrouillé du
                  catalogue.
            $00 ne le lance pas.
     $47A : $00 ne lance rien.
            code de la touche du programme à charger au
            boot si ascii negatif run sinon load
            $C1 run A
            $41 load A.
     $47B : $FF affiche la page texte se trouvant
                Bloc 1 et 7, à la place du catalogue.
            $00 ne l'affiche pas affiche le catalogue.

            Nota : le fait d'appuyer sur une fleche
            réaffiche le catalogue.
     $47C : $FF supprime les animations (et le bruit)
            $00 met les animations.


]5 AMELIORATIONS FUTURES .

     - Reconnaissance et chargement correcte des programmes basics.
     - Acces au fboot à partir du basic via l'ampersand.
     - Acces aux sous-catalogues.
     - Reconnaissance de l'Uni disk et de la Ram-work.
     - Mise en place d'une routine de sauvegarde rapide.
     - Mise en place dans le code Quit.
et pourquoi pas
     - reconnaissance de la souris.

Bon fast Boot à tous .!!!!


              CHIP SELECT

from the Association of Broadcasting Crackers 1986.


NOTA :

Si vous voulez charger automatiquement le prodos au boot il faut que
le fichier FBOOT.SYSTEM soit le premier fichier system de la disquette.

Signalez moi toutes bugs dans ma Bal sur HG (6115)
nom: chipselect

Petite remarque :
    Utilisation commerciale INTERDITE sans mon autorisation.
Ceci est particulierement valable pour M Lebreton & Co.


Retour sommaire