Dernière mise à jour: lundi 03/12/2007.
Introduction
Mon projet FASTDSK de
création rapide de
disques images avance
bien, même si c’est de façon
irrégulière.
J’ai fini une version beta 256k permettant de
créer un disk
image .DSK en une seule passe plus rapidement que DSK2FILE
(idem pour
la version 128k en 2 passes qui fonctionne aussi). J’ai
comparé
le résultat de 2 .DSK produits par ces outils à
partir du
même disk d’origine et le contenu est identique.
L’interface est
quant à elle aussi achevée et les 2
fonctionnalités originales (nom automatique et fichier log
résultat) sont aussi opérationnelles.
J’ai fait la programmation à partir de
l’émulateur Apple
Oasis en utilisant pour le moment que le format .DSK pour
le
disk lu
que je souhaite transformer en disque image. De ce fait, je
n’ai pas
encore été confronté au cas des disks
physiques
contenant des problèmes de
démagnétisation, de bad
checksums ou encore des originaux plombés avec des formats
exotiques (de toute façon, je dis clairement que mon outil
ne
travaille qu'avec des disquettes 16 secteurs mais des personnes
pourraient être tentées de faire le test, aussi je
dois
prévoir une gestion propre des anomalies).
Pour avancer dans les tests de ces cas de figure (tout en restant sous
émulateur), je vais
devoir utiliser non plus des .DSK en entrée mais des
fichiers au format .NIB que j’aurai modifié pour
créer
artificiellement des anomalies.
Je vais dans cette page web vous parler du format .NIB pour expliquer
ce qu’il est possible de faire (dans le cadre
d'une duplication basique avec Locksmith
Fast Copy
et aussi avec FASTDSK)
et aborder le
programme Nibbles
Away ][ qui permet de travailler les nibbles bruts
d’une
disquette (au niveau d'une piste complête) sur un vrai Apple
II.
Je précise "un vrai Apple II" car suivant les
émulateurs,
la fonction
d'écriture d'un .NIB est plus ou moins bien
supportées.
C'est pour cela que je préfère utiliser un
éditeur
hexa (sur ma machine linux) pour opérer les changements dans
les
.NIB.
Nibbles Away ][ me permettra
de faire la
même chose sur mon Apple
IIe.
Le format .NIB
Comme vous le savez déjà, le format le plus
répandu pour les disks images Apple II est le .DSK.
Il ne contient que les données des secteurs, c'est
à dire
35 pistes de 16 secteurs avec chacun 256 octets.
La taille de ce format est donc de 35*16*256 = 143360 octets.
Pour la plupart des usages, c'est suffisant car le DOS
utilisé
est standard et c'est l'émulateur qui fait un
supplément
de travail pour ramener ce format .DSK à quelque chose plus
proche de la réalité afin que les programmes en
langage
machine émulé accédant au drive via
les jeux de
softswitchs et les instructions habituelles de type LDA $C08C,X etc...
se déroulent sans accroc (émulation du controleur
du
lecteur de disquettes).
Prenons par exemple l'émulateur Applewin
dont le source est
ouvert.
Ce qu'il faut savoir, c'est que cet émulateur travaille au
niveau de la piste.
Prenons le cas où j'ai mis un .DSK dans le lecteur 1 de
l'émulateur et ai booté Applewin.
A chaque fois qu'il rencontre un jeu d'instructions LM faisant
déplacer la tête de lecture, il sauvegarde la
piste en
cours (s'il y a eu des changements) et charge la piste suivante. Cette
nouvelle piste n'est pas conservée dans son état
actuel
(portion de datas du .DSK) mais elle est transformée en
nibbles
via une
routine appelée NibblizeTrack (le source la contenant
s'appelle
aw_image.cpp).
Applewin construit de A
à Z une structure
proche du contenu
réel d'une disquette physique.
Il rajoute les champs adresse (markers + infos adresses en codage 4-4),
les gaps, les champs datas (markers + checksum) et transforme les
octets du .DSK en nibbles codés selon la méthode
6-2.
D'ailleurs il est à noter que c'est lors de cette phase de
rajout du champ adresse qu'il
assigne lui même la valeur du volume à 254, ce qui
déplait fortement à certains programmes
gérant une
autre valeur (l'idéal aurait été de
mettre un
paramètre externe pour laisser cette liberté
à
l'utilisateur).
Voila le bout de code en question où il fait cette
transposition
(langage C++). C'est une suite d'instructions qui alimentent son buffer
avec la structure nibblizée. Il commence par 48 nibbles de
gap
et traite ensuite les 16 secteurs qui se trouvent
séparés
à chaque fois par 27 autres nibbles de gap:
//===========================================================================
DWORD NibblizeTrack (LPBYTE trackimagebuffer, BOOL dosorder, int track)
{
ZeroMemory(workbuffer+4096,4096);
LPBYTE imageptr = trackimagebuffer;
BYTE sector = 0;
// WRITE GAP ONE, WHICH CONTAINS 48 SELF-SYNC BYTES
int loop;
for (loop = 0; loop < 48; loop++)
*(imageptr++) = 0xFF;
while (sector < 16) {
// WRITE THE ADDRESS FIELD, WHICH
CONTAINS:
// - PROLOGUE
(D5AA96)
// - VOLUME NUMBER
("4 AND 4" ENCODED)
// - TRACK NUMBER
("4 AND 4" ENCODED)
// - SECTOR NUMBER
("4 AND 4" ENCODED)
// - CHECKSUM ("4
AND 4" ENCODED)
// - EPILOGUE
(DEAAEB)
*(imageptr++) = 0xD5;
*(imageptr++) = 0xAA;
*(imageptr++) = 0x96;
*(imageptr++) = 0xFF; <- volume
254 (1er octet
4-4)
*(imageptr++) = 0xFE; <- volume
254 (2nd octet
4-4)
#define CODE44A(a) ((((a) >> 1) & 0x55) | 0xAA)
#define CODE44B(a) (((a) & 0x55) | 0xAA)
*(imageptr++) = CODE44A((BYTE)track);
*(imageptr++) = CODE44B((BYTE)track);
*(imageptr++) = CODE44A(sector);
*(imageptr++) = CODE44B(sector);
*(imageptr++) = CODE44A(0xFE ^
((BYTE)track) ^
sector);
*(imageptr++) = CODE44B(0xFE ^
((BYTE)track) ^
sector);
#undef CODE44A
#undef CODE44B
*(imageptr++) = 0xDE;
*(imageptr++) = 0xAA;
*(imageptr++) = 0xEB;
// WRITE GAP TWO, WHICH CONTAINS SIX
SELF-SYNC BYTES
for (loop = 0; loop < 6; loop++)
*(imageptr++) = 0xFF;
// WRITE THE DATA FIELD, WHICH CONTAINS:
// - PROLOGUE
(D5AAAD)
// - 343 6-BIT BYTES
OF NIBBLIZED DATA,
INCLUDING A 6-BIT CHECKSUM
// - EPILOGUE
(DEAAEB)
*(imageptr++) = 0xD5;
*(imageptr++) = 0xAA;
*(imageptr++) = 0xAD;
CopyMemory(imageptr,Code62(sectornumber[dosorder][sector]),343);
imageptr += 343;
*(imageptr++) = 0xDE;
*(imageptr++) = 0xAA;
*(imageptr++) = 0xEB;
// WRITE GAP THREE, WHICH CONTAINS 27
SELF-SYNC BYTES
for (loop = 0; loop < 27; loop++)
*(imageptr++) = 0xFF;
sector++;
}
return imageptr-trackimagebuffer;
}
Cette manipulation permet au final de gagner de la place en
s'épargnant la sauvegarde des informations toujours
identiques
et en ne gardant que les informations différentes d'un .DSK
à un autre, à savoir le contenu des secteurs de
données.
Mais il est des cas de figure où cette reconstruction pose
des
problèmes car elle ne donne pas une image exacte de ce que
contenait la véritable disquette.
C'est pour celà qu'en plus du format .DSK, il y a un autre
format (.NIB) qui prend plus de place certes mais permet de conserver
certaines des informations perdues par le .DSK. (A la base, le format
.DSK considère que le contenu de la disquette est au format
d'un
DOS standard).
Le .NIB permet de gérer ces disquettes au format non
standardisé.
Le .DSK est rangé bien proprement. Les secteurs se suivent
dans
l'ordre et tout est pour le mieux dans le meilleur des mondes.
Dans la pratique, sur un vrai Apple II, quand la tête de
lecture
commence à
lire une piste concentrique, elle peut tomber n'importe où.
Par
exemple sur le secteur $0D.
De la même façon, le format .NIB n'impose pas
d'ordre des
secteurs.
Il se contente en effet de définir pour chaque piste une
taille
identique
de 6656 octets, soit $1A00 en hexa.
Après on met ce qu'on veut dans chacun de ces espaces
représentant une piste.
Le .NIB est donc une succession d'espaces fixes de 6656 octets de long.
Cette définition de taille fixe sert surtout à ne
pas
rendre trop compliquée l'exploitation du .NIB en
l'organisant un
minimum (découpage piste).
Comme un .NIB contient lui aussi 35 pistes et a donc 35*6656 = 232960
octets,
soit une taille de 62,5% plus importante que le .DSK.
Note: si un jour vous rencontrez un .NIB de 266240 octets, il s'agit
d'une
image de 40 pistes.
Chacun de ces espace contient un nombre variable d'informations significatives.
En effet sur une vrai disquette, il n'y a pas sur chaque piste le
même nombre de nibbles.
Comme dans le .NIB on gère un espace fixe par piste, cela
signifie que l'espace est rempli de nibbles bidons pour
compléter (ex: des $FF).
Maintenant concernant le contenu de chacun de ces espaces (pistes),
pour les disquettes non standards: il n'y a pas vraiment de
rêgles. Chaque programme gérant les
entrées/sorties
sur sa disquette retrouve ses petits selon la manière dont
les
informations sont codifiées.
Sur un .NIB pas trop bidouillé, on a quelque chose de
similaire
à cela pour
chaque
secteur dans un espace de piste:
- des nibbles de synchro (généralement
$FF).
- 14 nibbles pour le champ adresse (3 pour le prologue, 2
pour le
volume, 2 pour la piste, 2 pour le secteur, 2 pour le checksum, 3 pour
l'épilogue). Pour l'épilogue, il arrive que le
3ème octet ($EB) saute
des fois.
- 5 nibbles (ou plus) de synchro
(généralement $FF).
- 349 nibbles pour le champ data (3 pour le prologue, 342
pour les
datas, 1 pour le checksum, 3 pour l'épilogue).
Le nombre de gaps peuvent varier tout en conservant certains minimas
propres à assurer un bon fonctionnement sur un vrai Apple II.
Si votre .NIB est un 18 secteurs, alors vous aurez une toute autre
structure.
On rentre ici dans du cas par cas qu'il n'est pas question de traiter
ici.
Concernant les gaps:
Un émulateur n'a pas vocation à remplacer des
éléments électromagnétiques
complexes d'un
lecteur de disquettes.
Il y a donc au moins une notion qui disparait dans un .NIB par rapport
à une vraie disquette: il n'y a pas de self synchro dans ce
format de fichier. Je ne parle ici que des extra-bits car on trouve
bien des nibbles de gap.
Vous ne trouverez pas les séquences de 10
bits 1111111100 écrits en 40 cycles assurant cette
fonctionnalité sur un vrai drive. On ne trouve dans le .NIB
que
des séquences de 8 bits à 1 ($FF).
Un .NIB est un fichier et les octets sont bien définis
(il n'y a pas le soucis de la tête de lecture qui peut
commencer
à
lire sur un bit qui n'est pas le 1er d'un octet).
A noter une autre différence aussi par rapport à
une
vraie disquette: il n'y a pas de synchro entre les pistes (à
ma
connaissance).
Si vous avez créé un .NIB qui ne fonctionne pas,
gardez
toujours en mémoire que le soucis n'est pas
forcément
lié au format proprement dit mais peut-être aussi
dû
à l'émulateur lui-même. Il est donc
prudent
d'essayer un .NIB sur plusieurs émulateurs avant de le
déclarer HS. Si vous avez le temps, boote tracez-le!
Dès
fois il suffit de changer pas grand chose pour le rendre
opérationnel (idem pour les .DSK).
Sachez aussi que malgré ses avantages sur le .DSK, le format
.NIB
n'est pas la panacée.
A plusieurs reprises, des personnes dans les forums de discussion ont
voulu lancer un nouveau format de nibbles (avec une taille variable des
pistes + une organisation du disk + taille max piste > $1A00 +
commentaires + etc..., une
finesse allant qu'au 1/4 de piste *quarter track*, etc... ) et remanier
l'outil SST
(évoqué plus loin)
mais à ce jour
aucun n'a vu le jour.
A noter aussi que le format .2MG (surtout en vogue sur les
émulateurs d'Apple IIGS) permet de faire des choses sympas
mais
ce format n'est pas souvent supportés sur les
émulateurs
d'Apple II ou alors l'émulation est très
incomplète pour les particularités qui justement
font son
intérêt.
Un remarque évidente mais comme chacun le sait,
"ça va
sans dire, mais ça va mieux en le disant":
Il ne sert pas à grand chose d'utiliser des outils
dédiés à la gestion des nibbles (ex: Nibbles
Away ][) avec un
émulateur sur un .DSK. Car d'une part le format est sans
surprise
et d'autre part si vous faites un changement sur autre chose que les
datas du champ de données, il ne restera pas trace de cette
modification si vous sauvegardez puis rechargez la piste (ces
informations n'existant pas dans le format .DSK et étant
reconstruites "on the fly").
Création et modification d'un .NIB
Pour créer un .NIB sur un Apple II, prenez de
préférence l'outil Saltine's
Super Transcopy (programmé par Bob Colbert
- aka le pirate nord américain Saltine
-
à partir de la
routine disk d'EDD 4). Il a
fait ses preuves.
Je crois me souvenir qu'à la base, ce programme avait
été créé pour permettre aux
crackers de
transformer un original plombé en données
facilement
échangeables par BBS...
Pour chaque face de disquette physique 5,25", vous obtiendrez 2 .DSK
que vous reconstruirez ensuite soit à partir de votre
émulateur soit avec des outils comme CiderPress.
Il peut néanmoins surgir des problèmes.
Par exemple si votre original a été
écrit avec un
drive lent et contient beaucoup de nibbles
(exemple Trinity d'Infocom).
Il peut arriver qu'en créant un .NIB, SST
affiche la
lettre "L" dans
l'état d'avancement.
Cela signifie qu'il a rencontré le
problème: il y a
trop d'informations sur la piste et il a du la tronquer.
Le "L" signifie "piste Longue": SST
n'a pas pu
stocker la piste dans
l'espace de ses $1A00 octets.
Attention, ceci n'est pas forcément génant: si
les
données perdues n'avaient pas de signification propre (gaps
ou
déchêts).
Il est possible de créer un .NIB directement à
partir
d'un émulateur.
Mettez un .DSK dans le 1er lecteur, une copie d'un .NIB existant dans
le 2nd lecteur et lancer un copieur!
Essayez aussi de créer un .NIB rempli de $FF et formattez-le
à partir d'un outil émulé.
Voici les modifications de .NIB que je vous propose d'aborder ici:
1) Modification
d'un header
de champ adresse
Je me propose de changer un prologue D5 AA 96 en D5 AA 97 par exemple
sur le secteur physique $09 de la piste $06.
Les informations de cette piste commence à partir de $06 *
$1A00
= $9C00.
Le secteur physique $09 est codé en 4-4 par les valeurs AE
AB.
Ce secteur physique correspond au secteur logique $03. Comme Locksmith
Fast Copy et FASTDSK
n'utilise que la
notion de secteur logique, si
j'altère ce secteur physique $09, je verrai l'effet sur le
secteur logique $03.
Modification sur le .NIB:
Résultat de la copie avec Locksmith
Fast Copy
et de la
création du .DSK avec FASTDSK:
le
secteur est bien
indiqué en erreur.
A noter que sur les Fast Boot normaux (SAM,
...)
l'anomalie sur un
header de champ adresse n'est pas gérée et le
disk II lit
en continu (boucle sans fin) la piste dans l'attente de ce secteur.
J'ai utilisé la rêgle de gestion suivante: si je
lis
successivement 32 champs adresses de secteurs qui ont
déjà été traités
alors je
considère que les secteurs non encore traités ne
peuvent
pas l'être et je les déclare en anomalie.
2) Modification
d'un header
de champ data
Je me propose de changer un prologue D5 AA AD en AA AA AD par exemple
sur le secteur physique $04 de la piste $01.
Les informations de cette piste commence à partir de $01 *
$1A00
= $1A00.
Le secteur physique $04 est codé en 4-4 par les valeurs AA
AE.
Ce secteur physique correspond au secteur logique $0D. Comme Locksmith
Fast Copy et FASTDSK
n'utilise que la
notion de secteur logique, si
j'altère ce secteur physique $04, je verrai l'effet sur le
secteur
logique $0D.
Modification sur le .NIB:
Résultat de la copie avec Locksmith
Fast Copy
et de la
création du .DSK avec FASTDSK:
le
secteur est bien
indiqué en erreur.
3) Modification
des trailers
de champs
Exemple d'un .NIB avec des trailers de champs modifiés:
Le pack de copieurs The Black Power From
T[[
(qui bien entendu se copie
uniquement sur un vrai Apple II avec des softs ne vérifiant
pas
les trailers comme
Disk Muncher).
Sa particularité:
>>Champ Adresse:
Prologue: D5 AA 96
Epilogue: DF AA F5 (au lieu de DE AA EB)
>>Champ donnée:
Prologue: D5 AA AD
Epilogue: DE AA AC (au lieu de DE AA EB)
Avec Locksmith Fast Copy,
cela ne passe pas et
on obtient l'erreur
totale:
Ceci n'est pas un problème pour FASTDSK
car il ne contrôle
pas les trailers du champ adresse et ne vérifie en fait que
le
1er nibble du trailer du champ datas (DE) tout comme ProDOS.
Donc la création d'un
.DSK pour cette disquette passe sans problème.
Maintenant si le fast boot dessus lui contrôle ces trailers,
c'est encore autre chose...
4) Altération
du 1er
nibble des trailers du champ data
Test sur le secteur physique $00 de la piste $22.
Les informations pour cette piste commencent en $22 * $1A00 = $37400.
Secteur physique $00 = secteur logique $00 codé en 4-4 par
les
valeurs AA AA.
Je remplace le nibble DE par DD:
Résultat de la copie avec Locksmith
Fast Copy
et de la
création du .DSK avec FASTDSK:
le
secteur est bien
indiqué en erreur:
5) Un secteur
HS à
cause d'un bad checksum
Il suffit avec un éditeur hex de modifier l'octet du
checksum
dans un champ de données.
J'ai modifié le secteur physique $0F de la piste $11.
La piste débute en $11 * $1A00 = $1BA00.
Le secteur physique $0F = secteur logique $0F aussi.
Son codage en 4-4 est AF AF.
Il y avait comme valeur de checksum $96 sur ce secteur et j'ai mis un
$FF à la place:
Résultat de la copie avec Locksmith
Fast Copy
et de la
création du .DSK avec FASTDSK:
le
secteur est bien
indiqué en erreur.
Le contenu du secteur avec un mauvais checksum est rempli de
zéro.
Subtilité avec FASTDSK:
il est possible
dans la configuration de
préciser que l'on ignore les erreurs de checksum.
Lors de son traitement, FASTDSK
va quand
même mentionné
qu'il a trouvé une erreur (le caractère C en
vidéo
inversée) mais vous constatez que le status de la piste
indique
qu'il n'y a pas d'erreur. Par ailleurs, le contenu du secteur du .DSK
est bien celui que j'ai laissé intact dans le .NIB.
6) Diskette non
formattée (.NIB vide)
Voici un exemple qui illustre 2 cas de figures: une piste non
formattée ou une piste pour laquelle il n'est pas possible
de
détecter un header champ adresse D5 AA 96 après
la
lecture d'un nombre fixe (et important) de nibbles.
Pour cela, j'ai modifié un .NIB en remplissant sa piste $1B
de
valeurs $96.
La piste commence en $1B * $1A00 = $2BE00 et se termine en ($1C *
$1A00) -1 = $2D7FF.
Résultat de la copie avec Locksmith
Fast Copy
et de la
création du .DSK avec FASTDSK:
la piste
est bien signalée
en erreur.
7) Disquette
protégée (ex: Trinity)
La disquette boote parfaitement:
Mais le contenu est incopiable du fait
du format interne particulier des pistes. Ici copies en cours en erreur
et résultat avec FASTDSK:
Regardez par exemple ici la tête du champ de datas d'un mega
"secteur" de la face 2:
Maintenant que j'ai fait le tour de ce que je pouvais tester avec les
émulateurs, il va falloir tester grandeur nature sur un vrai
Apple IIe!!
A suivre...
Sommaire Annexe
Lien
|
Contenu
|
|
Nibbles Away. |
|
Nibble News vol 1, issue #1 (08/1982). |
|
Nibble News vol 1, issue #2 (09/1982). |
|
Nibble News vol 1, issue #3 (10/1982). |
|
Nibble News vol 1, issue #4 (11/1982). |
|
Nibble News vol 1, issue #5 (12/1982). |
|
Nibble News vol 2, issue #1 (01/1983). |
|
Nibble News Vol 3, issue 6 (1985). |
|
Nibble News Vol 4, issue 2 (1985). |
|
Nibble Parms. |
|
Ressources Nibbles Away III
et son langage NADOL. |
|
Quelques tables utiles en annexe. |
Note: J'ai récupéré auprès
de mon vendeur
US préféré d'autres numéros
de Nibble News.
Je les scannerai à réception. FAIT LE 05/12/2006.
D'ici là je n'ai
qu'une photo à vous proposer!
Ce sont les références suivantes:
Vol 1 #3 (Oct 1982)
Vol 1 #4 (Nov 1982)
Vol 1 #5 (Dec 1982)
Vol 2 #1 (Jan 1983)
Nibbles Away.
L'univers des bit copiers sur Apple II ne fut pas de tout repos...
Le logiciel Nibbles Away,
bien qu'ayant
évolué dans le
temps, a eut du mal à se faire une place à
coté de
son grand concurrent Locksmith
de Omega Microware, Inc (qui
fut ensuite
racheté par Alpha Logic
Business Systems
quand Omega mis la clef
sous la porte).
Il suffit de comparer l'espace publicitaire de ces 2 produits pour
avoir un ordre d'idée.
Presque rien pour Nibbles Away
et des placards
partout dans tous les
magazines à partir de 1981 (environ) pour Locksmith.
Mais comme je l'aime bien, j'ai décidé d'en
parler un
peu, ce qui n'est pas un mal compte tenu de la pauvreté des
informations que l'on peut trouver sur internet à son sujet.
Je
précise néanmoins que j'en ai bavé
(passé
du temps) pour réunir matière à faire
ces quelques
lignes!!!
Au final, j'ai tout de même pu mettre la main sur des pubs
indirectes:
celles d'un revendeur, Micro-Ware Dist.
Inc.,
avec son personnage
signé Mr Hoppy clamant bien fort à qui veut
l'entendre "I
made a copy with NIBBLES AWAY II". (N'oublions pas qu'à
cette
époque pour toucher le jackpot il fallait que le programme
soit
capable de copier des softs comme le 1er tableur du marché -
Visicalc - qui
faisait un
véritable tabac).
Le nom de Nibbles Away
figurait aussi de temps
en temps sur des listes de
logiciels vendus par correspondance (destinées aux
pirates???)
mais je n'ai à ce jour pas
vu un seul encart publicitaire de l'éditeur proprement dit.
Bref, c'est dans le registre "plus que discret".
D'ailleurs, cette discretion va jusqu'à omettre sur
l'écran du programme le nom de l'éditeur et celui
de son
auteur!!!!
Démarche pour la moins curieuse...
Je vais rectifier ici cet "oubli" impardonnable!
La société éditrice est COMPUTER :
Applications,
Inc .
L'auteur des Nibbles Away
est
l'américain Randy Ubillos.
Si ce nom vous dit quelque chose, c'est normal!
Plus tard, Randy Ubillos
s'est illustré
avec les logiciels
suivants: ][ in a Mac (un
émulateur
d'Apple II pour mac 68k
copyrigthé de 1985 à 1987 toujours chez COMPUTER
:
Applications, Inc), et surtout il est connu pour Adobe
Premier et Final
Cut Pro!!
Bref, ce n'est pas un monsieur tout le monde qui a fait un soft de
déplombage et a disparu de la circulation du jour au
lendemain
;-))
Dans sa jeunesse, Randy Ubillos
s'est fortement
intéressé
à la protection des logiciels, comme l'atteste cet article
de
Craig Crossman
intitulé "Copy Protection
II" (paru dans le
magazine Nibble Vol 2,
numéro 6 de 1981).
On y voit en effet la remarque suivante:
A noter qu'il est rigolo de voir qu'en 1981, la protection en piste $23
était déjà
évoquée (pour y loger la
VTOC et le catalog déplacé)... et que la
relecture
laissait à désirer avec un joli copier/coller qui
traine!
Un rapide tour d'horizon:
Nibbles Away, 1er du nom,
n'était qu'un
bit copier. Il proposait
juste de modifier le paramétrage (slot, drive,
1ère et
dernière piste, et d'autres comme les demi-pistes ou encore
une
copie synchronisée -pistes??-) puis enchaînait
tout de
suite avec la phase de duplication.
Il n'y a que sur cet opus que j'ai pu voir une
légère
référence au nom de la
société: le logo CA
de COMPUTER : Applications, Inc.
Incontestablement, c'est l'opus ][ de ce logiciel qui est le plus connu.
Sur tous les packs de copieurs que l'on peut glaner sur les disquettes
du passé, c'est toujours le ][ que l'on retrouve, avec un
numéro de version sur 2 caractères
composés d'une
lettre et d'un chiffre.
J'ai retrouvé les versions de Nibbles
Away ][
A1, B1 et C3.
La C3 est celle qui est considérée comme la
dernière de l'opus ][ (dans l'Underground
français tout
au moins).
J'ai rassemblé ces versions sur un disk image quand elles
étaient en catalog.
Sinon la version B1 se trouve sur le pack de copieurs du
déplombeur (probablement américian): The
Jerk. Ce pack
(le seul que je possède de lui) est le: " The
Jerk's Favorite
Copiers V5 ".
La version C3 récupérée est celle du
pirate
français Kristo
(groupe Ze
Enfoiré) acceptant $23 pistes
(au lieu des habituelles $22 tracks).
Le second opus apporte des nouveautés sympas comme l'examen
d'une piste complète (track/bit editor) et un panel d'outils
d'audit (sector editor, ...).
Le soft était accompagné d'une documentation sous
forme
de manuel utilisateur. Son titre: Instruction
manual
for Nibbles
Away ][ avec la date: 1981.
|
DOS 3.3
|
Download Nibbles Away 1 & ][
(gzipped)
|
|
Jerk's boot
|
Download The Jerk's Favorite Copiers
V5 (gzipped)
|
Deux reviews parues dans la presse américaine:
Ce que l'on sait rarement (du fait d'une distribution confidentielle),
c'est que COMPUTER : Applications, Inc.
a
édité une
lettre régulière sur Nibbles
Away
intitulée:
Nibble News. D'ailleurs il
faut noter qu'Omega Microware, Inc.
a fait
exactement la même chose pour ses produits de
déplombage -
euh pardon d'aide à la copie dans le cadre d'un backup
personnel
conformément à la législation :-)))) -
à
savoir une newsletter dédiée à Inspector,
Watson
et Locksmith.
Cette newsletter de Nibbles Away
comportait des
articles sur le soft
(généralités, aide à
l'usage) et surtout,
pour continuer à tenir le client par les bretelles, une
liste
réactualisée des paramètres
à utiliser pour
copier les derniers logiciels sortis sur le marché...
Vous trouverez les scans complets des 2 premiers numéros sur
cette page, bande de petits chanceux!!!!
Je ne sais pas grand chose de l'opus III. D'ailleurs je recherche des
informations à son sujet et une copie du soft.
J'ai bien vu indiqué " Nibbles
Away III
" sur des listes de
revendeurs encore en 1986 mais c'est de l'introuvable dans mes stocks.
Je connais au moins une personne qui a des infos dessus, toujours le
même crack, j'ai nommé Jean-Pierre.
Note du 03/12/2007: J'ai eu une proposition de Jonno Downes
(que je remercie au passage) mais j'ai fini par
récupérer un original de mon
côté. Je vous fais cadeau de ce soft
extrèmement rare sous sa forme complète!!!
Bref, ce qu'il faut savoir sur cette version, c'est qu'elle
intègre un langage de programmation!!! Si si...
même qu'il
s'appelait le NADOL (pour Nibbles
Away Disk Optimized Language). Randy
Ubillos avait eut l'idée d'associer ses
routines de bas
niveau
avec un langage plus évolué pour le rendre plus
accessible. Voir sur cette page une doc trouvée sur internet
et
signée par Mr. Wiz
(probablement un
sympatique homme du
département de la Justice voulait apporter sa pierre
à
l'édifice de la sauvegarde personnelle...)
Je me demande si finalement il y a de celà 2 ans je n'avais
pas
vu une pub sur ce NADOL dans
un magazine...
Mais c'est aux oubliettes car si mes souvenirs sont bons, j'avais du
scanner ça pour mon dossier des outils des pirates, dossier
qui
a été enterré suite à la
mort vicieuse et
inattendue de ma cartouche Zip de backup alors que je venais juste de
lancer un reformattage de mon disque dur pour un upgrade d'O/S. Quelle
saloperie de malchance quand j'y repense... tout ce boulot perdu :-(((
Doc tapée récupérée sur le
freeware de
l'Underground
intitulé: Archives 3.
J'aurai préféré une version en anglais
car la
traduction tapée par un non connaisseur (ou alors
fatigué) a introduit pas mal d'erreurs. J'ai
corrigé des
trucs mais il y a surement encore des coquilles.
Je n'ai pas pu mettre la main sur un original. Quelqu'un a
ça en
stock????
----------------------------------------
>> file control < > track association
<<
----------------------------------------
fait le: 15 avril
1985 à PAU
NOTICE
DE NIBBLES AWAY
II
* 0.0 TABLE DES
MATIERES
-
1.0 NIBBLES AWAY II
-
2.0 COPIER
-
3.0 MODIFIER
-
4.0 TRACK / BIT EDITEUR
-
5.0 TRACK / SECTEUR EDITEUR
-
6.0 DIAGNOSTIQUES
-
7.0 FILER
-
8.0 CE QU'IL FAUT CONNAITRE
==============================
1.0 NIBBLES AWAY
1.1 Editeur de piste
comprenant :
1)
Possibilité de modifier
les datas en mémoire, et de les sauver.
2)
Possibilité de sortir
ces datas sur imprimante.
3) Option
"search" permettant de
rechercher une certaine chaine.
4)
Possibilité d'analyser
des datas sous le mode éditeur.
1.2 Editeur piste /
secteur :
1) Permet
de lire / editer /
écrire n'importe quel secteur DOS 3.2 ou DOS 3.3.
2)
Possibilité de lister un
secteur en langage assembleur.
1.3 Disk dianostics :
Cette option
permet de déterminer la vitesse du lecteur de disquette, de
vérifier
l'état de
surface des disquettes, et d'initialiser ces dernières.
1.4 File manager :
1) Sauver
sur disquette certains
paramètres
2) Option
"auto-load" permettant
de charger des données nécessaires à
la copie.
1.5 Modification des
paramétres :
S.C.P.L.M. (Sans
Commentaire Pour Le Moment)
1.6 Pourquoi Nibbles
Away II
Ce programme de
copie a été conçu pour
protéger votre
investissement "software".
De même
vous pourrez déplomber tous les logiciels vendus dans le
commerce.
Nibbles Away II
comporte de nombreuses techniques que l'on ne retrouve pas dans des
programmes
similaires, et
ses routines on été écrites dans un
souci
d'efficacité maximale tout en restant
transparentes
pour un utilisateur courant.
2.0 COPIER
2.1 Nibbles Away
(option "N")
En choisissant
"NIBBLES AWAY", une liste d'option est alors affichée avec
les
valeurs prises
par defaut si
vous n'en spécifiez pas d'autre lors de la question "CHANGE
DEFAUT VALUES".
Une reponse
affirmative est indiquée par "Y", une frappe sur la touche
"return" prenant la
lettre "N" par
defaut.
2.1.1 Les
paramètres
- Disk Drive
Slot : C'est le slot ou doivent etre branchés les deux
drives
servant à faire la copie.
L'utilisation d'un seul lecteur est possible.
- Source Drive :
Drive dans le quel est placée la disquette à
copier.
- Destination
Drive : C'est l'autre
- Starting Track
: C'est la première piste à copier, on peut
specifier une
demi-piste.(ex: 02.5)
- Ending Track :
C'est la dernière piste à copier.
- Track
Increment : Normalement, la valeur est de 1, elle peut etre
changée en ce que l'on veut.
Par exemple, un incrément de 1.5 et Starting Track de 00
copiera
les pistes
00, 1.5, 03, 4.5, etc...
- Data Mover :
Si cette option est selectionnée, elle permet à
NIBBLES
AWAY II de ne pas analyser
les datas rencontrées, mais de les copier directement. Cette
option est rarement utilisée
et peut occasionner des tentatives
répétées avant
de parvenir à copier une piste.
L'usage de cette option supprime les questions suivantes puisqu'elle ne
permet plus
d'utiliser les autres options.
-
Synchronisation : Cette option permet de synchroniser les pistes
copiées selon le même schema que
l'original sur la piste 00, c'est à dire que les datas
seront
fidèlement recopiées
mais dans un certain ordre. Une tentative de copier une disquette
synchronisée
sans l'usage de cette option ne produira pas forcemment d'erreurs lors
de la copie,
mais la disquette cible pourra ne pas booter.
- Erase
Destination Track : Permet d'effacer les pistes qui vont être
copiées sur la disquette cible
avant leur écriture. Surtout utile en combinaison avec
l'option
suivante si
la disquette cible n'est pas vierge.
- Auto Half
Tracks : Force NIBBLES AWAY à lire et écrire par
pas de
0.5. Utile si on ignore sur quelles
pistes se trouvent les datas à copier.
- Reduced Error
CHK : Diminue le nombre de re-essais auquel se livre NIBBLES AWAY lors
d'une tentative
de copie. Gagne du temps, mais certaines pistes se copient seulement
apres 3 ou 4 essais.
2.1.2 Lors
de la copie
Ce que vous voyez sur l'ecran :
(quelque chose du genre de ceci)
----------------------------------
READING
TRACK = 21.5
TRACK HLF TRACK HLF
TRACK HLF
------ --- ------ --- ------ ---
00-Y00
0C-YOO 18-Y00
01-Y00
0D-Y00 19-N50 Y00
02-Y00
0E-Y00
1A- Y00
03-Y00
0F-Y00
1B- N50
04-Y00
10-Y00 1C-N50 Y00
05-N50
11-Y00
1D- N50
06- Y50
12-Y00
1E-N50 Y00
07- N50
13-Y00
1F- Y00
08-Y00
14-Y00
20- Y00
09-Y00
15-Y00 21-
0A-Y00
16-Y00 22-
0B-Y00 17-Y00
----------------------------------
L'operation en
cours est affichée en haut de l'écran.
La piste
traitée est indiquée juste en dessous.
Les pistes
copiées avec succès sont indiquées
avec un Y en
mode inverse, la lettre N indique que
la piste n'a pu
être copiée, mais ne vous
désespérez pas
trop vite car cela peut être simplement dû
au fait qu'elle
ne comporte pas de data.
Les demi-pistes
sont indiquées sous les colonnes HLF.
Les chiffres
après les lettres N et Y indiquent le nombre d'erreurs.
Le premier
chiffre indique les erreurs de lecture, le deuxième les
erreurs
d'écriture.
En cours
d'exécution de NIBBLES AWAY, certaines touches vous
permettent
de reprendre le controle :
< ESC >
Arrête toutes opérations en cours.
<
G > Passe en mode graphique, permet de visualiser avec
un peu
d'habitude les pistes vides ou pleines.
<
T > Repasse en mode text.
<SPACE>
Permet "oublier" la piste en cours de copie et de passer à
la
piste suivante selon l'incrément choisi.
3.0
MODIFIER
Pour
accéder à ce sous-programme, appuyer sur la
touche "M"
depuis le Master Menu, vous verrez apparaitre ceci :
--------------------------
PARAMETER SET MODIFICATION
B - BACKUP
C - CONTROL
F - FILTER
E - ERASE
S - SYNC ADD
G - GLOBAL
ENTER SET TO MODIFY ->
--------------------------
BACKUP : Une pression sur "B"
vous permet de
changer les paramètres de copie.
La question "USE ADDRESS MARK ->" apparait et vous autorise
à
changer les bytes de début
de champ. Une réponse affirmative "Y" vous permet d'inscrire
une
nouvelle adresse (généralement
indiqués sur la feuille de paramètre fournie avec
NIBBLES
AWAY). Par la suite, une réponse négative
à cette question refixera la valeur originale. Une question
similaire apparait ensuite concernant
"INSERT MARK", la marche à suivre est la même. Ces
opérations sont expliquées plus loin dans ce
mode d'emploi.
Exemple :
------------------------
BACKUP PARAMETERS
USE ADDRESS MARK ->
USE INSERT MARK ->
OVERIDE NIBBLE FILTER ->
OVERIDE GLITCH DETECT ->
USE NIBBLE COUNTER ->
OVERIDE SYNC CONVERT ->
OVERIDE STANDARDIZER ->
------------------------
On peut utiliser la
flèche "<-"
à tout moment pour revenir en arrière.
Après avoir
répondu à
toutes les questions, on retourne au menu de modification de
paramètres.
Les 5 questions ci-contre
permettent de mettre
en fonction les options correspondantes décrites plus loin.
Une pression sur la touche "Q"
retourne au
menu de modification des paramètres.
CONTROL : Depuis le "MODIFIER
MENU", une
pression sur "C" vous donnera accès au controle de
modification
de paramètres (controle parameter modifier). Une liste de
paramètres et leur valeurs apparaitront
alors à l'écran avec de petites
flèches à
coté des chiffres.
Placez ces flèches face au paramètre que vous
voulez
modifier et appuyez sur la barre d'espace
pour voir apparaitre la question "ENTER NEW VALUE ->".
Tapez la nouvelle valeur du paramètre.
Puis tapez <return>.
Plusieurs paramètres peuvent être
changés de cette
façon.
Une pression sur la touche... "Q" ramène au "Modifier Menu".
Exemple :
--------------------------------
CONTROL PARAMETERS
FIND MAX ->0C<- DATA
LIM 65
DEL BYTE
30 DATA
MIN 13
GAPBYTE1
FE DATA
MAX 1D
GAPBYTE2
00 SYNC
SIZ 09
RDERR MX
05 FIX
AMNT 08
WRERR MX
07 FIX
VALU 7F
SYERR MX
05 PAGE
LEN 42
GAP SIZE
0C LF
VALUE 0A
FALSE LO
0A SHIFT
N+ 00
FALSE HI
1B SHIFT
N- 08
GAP HIGH
48 OFFSET
+ 00
TOLERANC
00 OFFSET
- 00
--------------------------------
Note Deckard: sur la version C3, il y a aussi "TRK CHOP" et "MATCH NM".
Les flèches sont
deplacées avec
les flèches du clavier, ce qui parait logique.
Une pression sur la barre
d'espace vous
demande d'inscrire une nouvelle valeur à valider avec
<return>.
FILTER : Depuis le "Modifier
Menu" , une
pression sur "F" affichera dans le bas de l'écran
le "Nibble Filter" actuel. Les touches "<-" et "->" sont
utilisables pour déplacer les flèches
sur l'écran à travers les différentes
valeurs
indiquées.
Les touches "I","J","K","M" également et selon leurs
fonctions
usuelles.
Une pression sur la barre d'espace occasionnera la commutation de la
valeur choisie en mode
inverse / Normal. Cette valeur sera alors filtrée et
séparée des autres datas que
NIBBLES AWAY ecrira sur la disquette "cible". C'est à dire
qu'elle ne sera pas écrite; cela
permet donc à l'utilisateur d'éliminer les bytes
qui ne
lui reviennent pas.
Une pression sur les touches "1","2","3" activera les filtres
"STANDARD","DOS 3.3 et DOS 3.2
respectivement. Les valeurs qui apparaissent en mode Inverse avec
chacune de ces options
sont celles qui ne peuvent pas etre considérées
valides.
Le filtre "STANDARD" est pris par défaut par NIBBLES AWAY et
ne
prend pas en considération
les valeurs incompatibles avec les drives de l'Apple. User des autres
filtres avec précaution
car ils peuvent tout aussi bien filtrer des datas correctes.
Une pression sur "Q"... et on revient au "Modifier Menu".
ERASE : depuis le "Modifier
Menu", une
pression sur "E" vous fera accéder à l'option
"Erase
Buffer".
Ce dernier est une collection de 128 bytes qui seront les derniers
à être inscrits sur une disquette
lors d'un processus d'effacement.
Les flèches sont déplacées comme pour
le "Nibble
Filter" et une pression sur la barre d'espacement
vous demandera la nouvelle valeur à placer à cet
endroit
dans le buffer.
Une valeur de moins de $80 sera représentée en
Inverse
additionné de $80 et représentera le
byte à incrire sur le disque à ceci
près que ces
valeurs en Inverse seront inscrites comme bytes de
synchro (sync-bytes).
Touchez la lettre "Q" pour changer et sortir de l'option.
SYNC ADD : exemple :
-------------------------------
SYNC ADD PARAMETRES
>80< 90 A0 B0 C0
D0 E0 F0
81 91 A1 B1
C1 D1 E1 F1
82 92 A2 B2
C2 D2 E2 F2
83 93 A3 B3
C3 D3 E3 F3
84 94 A4 B4
C4 D4 E4 F4
85 95 A5 B5
C5 D5 E5 F5
86 96 A6 B6
C6 D6 E6 F6
87 97 A7 B7
C7 D7 E7 F7
88 98 A8 B8
C8 D8 E8 F8
89 99 A9 B9
C9 D9 E9 F9
8A 9A AA BA
CA DA EA FA
8B 9B AB BB
CB DB EB FB
8C 9C AC BC
CC DC EC FC
8D 9D AD BD
CD DD ED FD
8E 9E AE BE
CE DE EE FE
8F 9F AF BF
CF DF EF FF
-------------------------------
Pression sur "S" depuis le
"Modifier Menu"
pour arriver ici.
Les valeurs en Inverse se
seront converties en
sync à chaque fois qu'elles apparaitront.
Les flèches bougent
comme d'habitude et
la barre d'espace permet d'alterner entre mode Inverse
et Normal. A l'origine, aucune
valeur
n'apparait Inversée.
GLOBAL : Depuis le "Modifier
Menu", une
pression sur la touche "G" vous donnera accés au
"Modificateur
Global".
Le programme vous demandera un numéro de bytes; il indiquera
la
valeur actuelle de ce dernier et vous
demandera la nouvelle valeur à lui assigner. Une pression
sur
"Return" gardera la valeur d'origine
(CF INFRA). Et bien sur, pression sur "Q" vous ramène au
menu.
Note importante : Tous les
changements
apportés aux paramètres resteront actifs
jusqu'à
ce que NIBBLES AWAY
soit rebooté. Si vous voulez sauver les valeurs que vous
avez
changées, utilisez l'option
"Save" du "Filer", vous pourrez ensuite les retrouver avec l'option
"Load".
LES PARAMETRES :
NOM VALEUR DEFAUT
-------- -------------
FIND MAX
$0C
Ce byte indique le nombre
minimun de bytes qui doivent etre justes
pour verifier la validité des datas.
DEL BYTE
$30
Ce byte controle la
durée utilisée par les drives en cherchant de
piste en piste. Plus le chiffre sera petit, moins la durée
sera
longue.
GAPBYTE1
$FE
Le plus petit Gap-Byte
rencontré.
GAPBYTE2
$00
Le "
grand "
" "
" , +1.
RDERR MX
$05
Le plus grand nombre
d'erreur de lecture autorisées avant de passer à
la piste suivante.
WRERR MX
$07
Pareil avec les erreurs
d'ecritures.
SYERR MX
$05
Pareil avec les erreurs
de synchro.
GAP SIZE
$0C
Le nombre minimum de
bytes nécessaires pour reconnaitre un gap.
FALSE LO
$0A
Nombre de bytes
placé avant pour détecter un "Gap faut".
FALSE HI
$1B
Nombre de bytes
placé avant pour détecter la fin d'un "Gap faut".
GAP HIGH
$4B
Le byte haut de la plus
haute adresse ou chercher un Gap.
DATA LIN
$65
Le byte haut de la limite
effective du buffer de lecture.
DATA MIN
$13
Nombre minimum de pages
en avant ou chercher un Gap.
DATA MAX
$1D
Nombre maximum de pages
en avant ou chercher un Gap.
TOLERANC
$00
Nombre maximum de bytes
qui peuvent ne pas etre similaires à ceux de "Nibble Count".
SINC SIZ
$09
Indiquer la longueur des
bytes de syncro écrits sur le disque par increment de 1.
Seules les valeur $09 et $0A sont prises en considération.
FIX AMNT
$08
Nombre de gapbytes qui
sont convertis en synchro à chaque Gap.
FIX VALU
$7F
Valeur de synchro
utilisée pour remplacer le Gapbyte de conversion synchro.
PAGE LEN
$42
Longueur de page
utilisée dans le Track / Bit Editor durant un dump de la
memoire.
LF VALUE
$0A
Montée d'une ligne
durant un dump de la memoire.
Mettre cette valeur à $00 si votre imprimante produit un
double
espace.
PRT SLOT
$01
Numéro du slot de
l'imprimante.
MATCH NM
$03
Le nombre de fois qu'un
Nibble Count doit atteindre pour etre valide.
SHIFT N+
$00
Voir appendice sur le
Nibble Count.
SHIFT N-
$08
Idem.
OFFSET + $00
OFFSET - $00
4.0 TRACK
/ BIT EDITOR
Ce sous-programme permet de
déterminer
les valeurs des paramètres decrits dans le chapitre 3.0
et relatifs aux
méthodes de copie de
certaines disquettes protégées tres vicieusement.
Il procure surtout
à l'utilisateur la
possibilité de lire / éditer / écrire
ces valeurs
sur une disquette.
Pour entrer dans le Track /
Bit Editor depuis
le "Master Menu", pressez la touche "T".
Le drive #1 se mettra
à tourner et
cherchera la piste 00, l'écran affichera alors 256 bytes de
mémoire
avec leurs adresses
respectives
indiquées sur la gauche.
Les touches "<-" et
"->" vous
permetteront alors d'afficher la mémoire par pas de 256
bytes,
ceci de $2000 à $7FFF.
Deux lignes apparaitront
au-dessus de l'aire
d'affichage des datas.
Entre ces lignes on trouvera
les informations
actuelles sur le Track / Bit Editor;
sur la gauche de l'ecran, le
mot PTR
apparaitra suivi d'un nombre à quatre chiffres, qui est
l'adresse mémoire
dont se servira NIBBLES AWAY
comme
début lors d'un ordre d'écriture (l'adresse de
fin est
$8000).
Au centre, le mot ADDR sera
suivi par un
nombre à quatre chiffres représentant la position
actuelle du
curseur dans le buffer de
lecture /
écriture. A droite, le numéro de piste.
Voici la liste des commandes
disponibles dans
le Track / Bit Editor :
I,J,K,M...Déplacement du curseur.
<-,->.....Saut de toute une page.
A chaque déplacement, ADDR est
réactualisé avec la
position courante.
R.........Lecture de la piste actuelle (numéro
derrière
TRK) et stockage dans le buffer.
W.........Ecriture dans le buffer, adresse de debut PTR &
adresse
de fin $8000.
Ecriture sur la
disquette après avoir répondu "Y" à la
question
"Verify"
<SPACE>...Entrée dans le mode EDIT.
Commandes:
0-9,A-F...Inscrit une valeur hexadécimale dans la
fenètre
d'édition au-dessus de la ligne status.
<RETURN>..Ecrit la valeur affichée
à la
fenètre d'édition dans le buffer à la
position du
curseur,
et quitte le mode EDIT.
<-,->.....Déplace le curseur en avant et en
arrière
dans le buffer.
<SPACE>...Bouge le curseur en avant, mais
écrit d'abord la
valeur affichée dans la fenètre
d'édition.
;..........Augmente d'une demi piste.
-..........Diminue d'une demi piste.
T..........Permet d'entrer directement un numéro de piste.
P..........Permet de changer la valeur PTR.
A..........Entrée dans le mode ADD.
Les bytes
à Insérer peuvent être tapés
dans la
fenêtre d'édition.
"Return"
entre la nouvelle valeur et quitte cette option ou "Space" entre la
nouvelle valeur et
déplace le curseur sur la case suivante.
D..........Efface le byte placé sous le curseur (et
décalage).
G..........Affiche "GO TO ->" et demande l'adresse où
envoyer
le curseur qui doit être comprise entre
$2000 et
$7FFF. Une pression sur "P" placera le curseur sur la valeur PTR, une
pression sur
"B","E"
l'enverra au debut ou à la fin du buffer.
H..........Alterne le plus haut bit de la valeur du curseur (passage en
vidéo-inversé).
Z..........Active les routines d'analyse, place les datas
analysées à la fin du buffer et fixe à
PTR
l'adresse
de début des datas. Les erreurs d'analyse Apparaissent
eventuellement.
Q..........Retourne au menu principal (ou ctrl-C).
S..........Permet de rechercher une chaine de bytes,
indiquée
par groupes de 2 chiffres hexadécimaux (D5 AA 96,
par
exemple). Une pression sur "S" garde la
précédente
chaine. Si une chaine n'est pas trouvée,
un bruit
intervient et le curseur ne bouge pas. En cas de succès, le
curseur se positionne sur la
chaine en
question.
O..........Permet d'imprimer sur papier tout ou une partie du buffer.
Indiquez les adresses de début et de fin,
le titre
et pressez une touche pour commencer. Appuyer sur "Q" pour stopper
l'impression.
Exemple
d'impression :
---------------------------------------
TRACK EDITOR
---------------------------------------
PTR=2000
ADDR=2000
TRK=00
---------------------------------------
PRINT FUNCTION
STARTING ADDRESS ->2000
ENDING
ADDRESS ->8000
TITLE ->ANY TITLE MAY GO HERE
POSITION PRINTER AT TOP OF PAGE
THEN PRESS ANY KEY
TO START
---------------------------------------
Exemples de pistes
editées :
---------------------------------------
TRACK EDITOR
---------------------------------------
PTR= 6734
ADDR=4643
TRK=00
---------------------------------------
4600-D7EDF6BE B5AEBBAC BDDDEBAE BBACB9FE
4610-CDEAAC9E D6E7EDF7 F7BECFF9 DEADE99E
4620-DFEBDCDA DDECFDD3 B3FDEAD3 FDFAB2BE
4630-FF9AB5B9 D9FFA7F3 FFBE9ABC 9ADFF7F7
4640-DAFAE9DB DEAAEBEB FFFFFFFF FFFFFFFF
4650-FFFFFFFF FFFFFFFF FFFFFFD5 AA96FFFE
4660-AAAAAFAF FAFBDEAA E6DFCFDF E7F9FEFF
4670-FFD5AAAD E6E6F9F2 9BFCF4DA DAEDFFFD
4680-E9F6E7E9 B297EAD3 CDADB2BE CBEDD7BD
4690-9AD9F4BC B6AFBA9D BEFCE6DA B3F3EDEB
46A0-CFF7EEB3 FDE9BEFD ABF9B59B F9BB9FFC
46B0-CD9AD9D9 EFBFA7DF F7DDDDD7 F39EFAEF
46C0-FFFFA7F7 EED7FAEB FCE7D6E7 96F2D39F
46D0-BBFCB7FA B2AEE796 EFB5BCF4 ABCFFFFA
46E0-F59AF3D9 BDE69BFD 97FC7DD9 D3FEAFDE
46F0-E5E6B2AE DFBBFDE7 E5BEDECE BEEEFAF3
----------------------------------------
Disquette DOS 3.3 standard
19 $FF utilisés comme gapbytes.
Adresse de début D5 AA 96
Début de datas D5 AA AD
----------------------------------------
TRACK EDITOR
----------------------------------------
PTR=6846
ADDR=4016
TRK=01.5
----------------------------------------
4000-9F9FAEFB EEF4DDF2 979BEDF3 9E96CE9F
4010-BFBAD7EF F7F7FAD4 D7FEFBBF B7FDD3FB
4020-BBBCAEDE D5EAD6F3 FDEEDDF4 979EEDE5
4030-BECDE7D7 AE9BFFED DDF4979E EDFADFFD
4040-9796AF9B FBFFDDF4 979EEDE5 BECB9797
4050-AE9BFAFE DDF4979E EDEEDFCD 97F6AF9E
4060-FEFFB9F6 EBBE9F9D F5F29A97 EDEF9BBE
4070-9F97B5FB FFFBDDEE 9DA6F2F2 96F6A6FF
4080-BEDDCDFF FADDF4F7 9EEDEFB6 DEAAEBF1
4090-D7DFAAAA AAAAAAAA AAAAAAAA AAAAAAAA
40A0-AAAAAAAA D5AB96FF FEAFAAAE ABFEFFDE
40B0-ADEBFDFA A9ABAAAA AAAAAAD5 AAAEBFFF
40C0-B6EFBDED FFFBF7B7 DBFAFBF7 B5BBBBF5
40D0-BBBEFDFF F7D7ADE2 EFEFBDAD DFF7A8CF
40E0-FCCBEFF5 B2F5BEB5 BED697B2 D6D7DBAD
40F0-EBB78FDE FFF9BAD4 DFDDBDFE FAFBFFGF
----------------------------------------
Disquette utilisant des $AA dans les gaps comme protection.
Adresse de début changée en D5 AB 96
Début de
datas
D5 AA AE
----------------------------------------
TRACK EDITOR
----------------------------------------
PTR=6987
ADDR=7700
TRK=03
----------------------------------------
7700-AAAAAAAA AAAAAAAA AAAAAAAA AFFBFFFF
7710-FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
7720-FFFFFDFC E1BFE7FF FFFFFFFF FFFFFFFF
7730-FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
7740-FFFFFFFF FFFFFFF3 F4E7F6FF FFFFFFFF
7750-FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
7760-FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
7770-FFFFFFFF FFFFFFFF FFFFFFFF FFE7F9FE
7780-FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
7790-FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
77A0-FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
77B0-FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
77C0-FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
77D0-FFFFFFFF FFFFFFFF FFFFFFDD ADDAAAFA
77E0-AAFAAAFA EAFAEAFA EAFEEAFE EAFAEAFA
77F0-EAFAEAFA AAFAAAFA AAFAAAFA AAFAAAFA
----------------------------------------
Disquette protégée n'utilisant pas de second gap.
Gap vraiment long.
Ne pas utiliser FALSE LO &FALSE HI.
Gap seul avant adresse début DD AD DA
----------------------------------------
TRACK EDITOR
----------------------------------------
PTR=6763
ADDR=5250
TRK=1F.5
----------------------------------------
5200-FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
5210-FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
5220-FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
5230-FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
5240-FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
5250-FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
5260-FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
5270-FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
5280-FFFFFFFF FFFFFFFF FFFFFFFF FFD5AAB5
5290-FFFEABAB AEAEFAFB DEAAEBFF FFFFFFFF
52A0-FFFFFFFF FFFFFFFF FFDSAAAD ABABABAE
52B0-BDDEEAAF AFBDBBBE B7BAAEA7 BDFBF5BA
52C0-EBBFDAFE FEFEFFDB F5EEBDDB AEF7DDBB
52D0-EFBEABBE EEEDDBB7 ABABABAB ABABABAF
52E0-EADDBED7 DAD6BEDB ABB6FEDF B5ADB6DA
52F0-BBEAAEBA BEB5BBBD BDBBB5FA EEEAEEAD
----------------------------------------
Disquette DOS 3.2
Gap important
Adresse de début D5 AA B5
Deuxième gap
Début de datas D5 AA AD
Notes de Deckard:
- la touche crtl-R permet de faire comme la touche R mais en affichant
les sync-bytes en
vidéo-inversé. On voit ainsi les zones
de synchro
du 1er coup d'oeil.
A noter qu'avec ma version d'Applewin sous wine, cette
option
provoque un bug: la disparition d'un nibble sur 2!!!
Par exemple, l'écran affiche D5 96 au lieu de D5
AA 96!!!
- L'option O peut s'utiliser avec Apple Oasis de manière
à faire des pseudo-impressions dans le presse papier.
- Il y a aussi les touches:
C = count
5.0 TRACK
/ SECTOR EDITOR
On peut accéder
à cette option
depuis le Master Menu en tapant sur la lettre "S".
Elle permet à
l'utilisateur de lire /
éditer / écrire n'importe quel secteur d'une
disquette
DOS 3.2 ou DOS 3.3. Les datas
peuvent etre
affichées en code hexadécimal ou ASCII.
Le checksum utilisé
par les routines
internes de lecture / écriture peut ne pas être
utilisé pour
permettre de lire /
écrire des
disquettes n'utilisant pas de checksum standard.
Ce qui apparait sur votre
écran sous le
Track / Sector Editor. Voici une liste des commandes disponibles.
I,J,K,M...Déplacement du curseur.
<-,->.....Déplacement du curseur D/G
A.........Permet d'afficher à l'ecran soit des codes hexa,
soit
ASCII, alternativement.
R.........Lecture du secteur indiqué.
W.........Ecriture du secteur indiqué.
T.........Indication d'un numéro de piste particulier.
S.........Idem pour un numéro de secteur.
O.........Accéde à la liste d'option suivante :
S....Augmente le
numéro du slot.
D....Alterne le
numéro du drive.
F....Alterne le
format du disque (13/16 secteurs par piste).
C....Active ou
non le Checksum. Permet de lire une disquette dont les bytes de fin de
secteur ont été modifiés.
Attention : Si le Checksum est activé, les secteur ECRITS
utiliseront des bytes de fin standards.
<RETURN>.......Quitte ces options.
L.........Appelle la fonction désassembleur. Les datas
seront
affichées en language assembleur 6502.
La touche
"Return" termine cette fonction.
B.........Cette touche permet d'utiliser 8 buffers
différents.
Ces buffers sont numérotés de 0 à 7.
Si des datas
sont lues dans un buffer, les autres ne bougent pas. Très
utile
pour déplacer des
secteurs d'une
place à une autre.
<SPACE>...Entre dans le mode EDIT :
0-9,A-F...Pour
inscrire une valeur hexadécimale dans la fenètre
d'édition.
<SPACE>...Ecrit les valeurs indiquées
à la position
du curseur, et déplace le curseur d'un cran.
<-,->.....Déplacement du curseur à
gauche et
à droite.
<RETURN>..Quitte le mode EDIT.
+.........Augmente le numéro secteur. Refaire R
après.
-.........Diminue
"
" . Refaire R
après.
Q.........Retourne au menu principal.
Exemple :
----------------------------------------
SECTOR EDITOR
----------------------------------------
TRK=00
SEC=01
----------------------------------------
00- 8EE9B78E F7B7A901 8DF8B78D EAB7ADE0
10- B78DE1B7 A9028DEC B7A9048D EDB7ACE7
20- B7888CF1 B7A9018D F4B78A4A 4A4A4AAA
30- A9009DF8 049D7804 2093B7A2 FF9A8EEB
40- B74CC8BF 2089FE4C 849DADE7 B738EDF1
50- B78DE1B7 ADE7B78D F1B7CEF1 B7A9028D
60- ECB7A904 8DEDB7A9 028DF4B7 2093B7AD
70- E7B78DFE B6186909 8DF1B7A9 0ASDE1B7
80- 38E9018D FFB68DED B72093B7 60000000
90- 000000AD E5B7ACE4 B720B5B7 ACEDB788
A0- 1007A00F EAEACEEC B78CEDB7 CEF1B7CE
B0- E1B7D0D7 60087820 00BDB003 28186028
C0- 3860ADBC B58DF1B7 A9008DF0 B7ADF9B5
D0- 49FF8DEB B760A900 A89142C8 D0FB6000
E0- 1B020A1B E8B700B6 016002FE 0001FBB7
F0- 00B70000 0202FE60 02000000 01EFD800
----------------------------------------
DOS 3.3 Slave diskette.
Le curseur est en mode inverse.
Les valeurs peuvent être éditées et
écrites
sur la disquette.
----------------------------------------
SECTOR EDITOR
----------------------------------------
TRK=00
DISASSEMBLE
SEC=01
----------------------------------------
0000- 8E E9
B7
STX $B7E9
0003- 8E F7
B7
STX $B7F7
0006- A9
01
LDA #$01
0008- 8D F8
B7
STA $B7F8
000B- 8D EA
B7
STA $B7EA
000E- AD E0
B7
LDA $B7E0
0011- 8D E1
B7
STA $B7E1
0014- A9
02
LDA #$02
0016- 8D EC
B7
STA $B7EC
0019- A9
04
LDA #$04
001B- 8D ED
B7
STA $B7ED
001E- AC E7
B7
LDY $B7E7
0021-
88
DEY
0022- 8C F1
B7
STY $B7F1
0025- A9
01
LDA #$01
0027- 8D F4
B7
STA $B7F4
----------------------------------------
Le même secteur que précédemment
désassemblé avec l'option "L".
Les premiers $28 bytes de ci-dessus en language assembleur 6502.
Note de Deckard: Sur la version C3, il y a aussi l'option D : Disk Skan
pour faire une recherche
de chaine sur tout le disk ou un morceau en fonction du
paramétrage sélectionné.
Le programme affiche alors les références
trouvées
sous la forme TT/SS.BB (TT=track, SS=sector, BB=byte).
H=recherche hexa, A=recherche alpha, L=recherche mnemonic.
6.0
DIANOSTIQUES
Après avoir
sélectionné
le Disk Dianostics depuis le Master Menu, voici ce qui apparait :
----------------------------------------
DISK
DIANOSTICS
S - SPEED
TEST
M - MEDIA
VERIFY
D -
DEGAUSS DISK
ENTRER SELECTION
->
----------------------------------------
Une pression sur "S" vous permet de verifier la vitesse de votre drive.
Attention, toutes les données qui pourraient être
sur la
disquette servant au test
seront effacées. Le petit dessin ci-dessous est suffisamment
explicite pour se passer
de commentaires, cependant n'importe quelle valeur entre -5 et +5 est
normale.
La vitesse peut également varier un petit peu.
----------------------------------------
DISK SPEED TEST
(SLOW)
(FAST)
O
<---!----!----!----!----!----!----!--->
!
-------
>-0002<
-------
PRESS
<ESC> TO EXIT
----------------------------------------
L'option "D"
dégauss Disk permet
d'effacer complétement un disque. Un bruit retentit
à la
fin l'opération.
L'option "M" Média
Vérify
indique si la disqette testée est exempte d'erreurs de
surface.
7.0 FILER
Depuis le Master Menu, taper
sur la touche "F"
pour accéder au Filer et faire apparaitre le menu suivant :
-----------------------------------------
FILER MENU
L - LOAD PARAMETER FILE
S - SAVE PARAMETER FILE
D - DELETE PARAMETER FILE
I - INITIALIZE DISKETTE
X - EXECUTE EXEC FILE
----------------------------------------
Le filer a deux fonctions
précises :
La première est de
permettre à
l'utilisateur de sauver sur une disquette certains
paramètres
nécessaire
à la copie de
programmes donnés. Ainsi lors de copies
ultérieures (on
n'est jamais
trop prudent...), les
paramètres seront
chargés automatiquement et l'utilisateur n'aura pas
à
les retaper laborieusement.
La deuxième est la
fonction "Auto-Load"
qui permet de charger automatiquement les données fournies
sur la disquette originale de
NIBBLES AWAY
nécessaires à la copie d'une foule de programmes.
Ainsi, si la copie d'une
disquette contenant
des datas sur les pistes 00-04 et 5.5-9.5 nécessite
le changement de 5
paramètres, la
fonction "Auto-Load" s'occupera de tout ça automatiquement
et
l'utilisateur aura plus
qu'à se tourner
les pouces. Toutes ces fonctions automatiques s'afficheront
à l' ecran de la
même
manière que si elles étaient tapées
manuellement.
Pour charger des
paramètres depuis le
"Filer Menu", tapez "L".
NIBBLES AWAY affichera les
noms des programmes
dont il connait les paramètres.
Vous pourrez choisir avec les
touches "<-"
et "->" et validez votre entrée avec "Return" selon
le
processus connu.
Note : Les
paramètres chargés et
sauvés concernent BACKUP, CONTROL, FILER, ERASE BUFFER et
SYNC
ADD.
Ceux ayant rapport avec le
GLOBAL Modifier
doivent etre ré-entrés à chaque fois.
Avant de sauver certains
paramètres, il
vous faut initialiser une disquette depuis NIBBLES AWAY
avec l'option "I" du filer
Menu. Les noms que
vous donnerez à vos listes de paramètres ne
pourront
excéder
28 caractères.
ATTENTION : Si vous effacez
une liste de
paramètres depuis NIBBLES AWAY, elle ne pourra pas etre
récupérée.
8.0 CE
QU'IL FAUT CONNAITRE
8.1 Quelques "trucs"
simples
Si un disque refuse de se
laisser facilement
copier, la première chose à faire est de regarder
sur
quelles pistes se produisent
des erreurs. Si
le nombre de ces dernières est important, l'option
"Auto-Half
Track"
peut etre utilisée.
Si le disque original est
protégé par synchronisation, la copie ne bootera
pas,
mais la tête de lecture
du drive fera de violents et
bruyants
mouvements d'avant en arrière.
L'option "Syncro" peut donner
de bons
résultats dans de tels cas.
Il est en
général
nécessaire de recopier la piste 00 à la fin de la
procédure de copie.
Si le résultat
n'est pas toujours celui
escompté, il faut entrer dans le Track / Bit Editor et
rechercher les adresses de
debut de secteurs.
Si on peut les repérer, il faut ensuite les inscrire dans
le Backup
Modifier.
8.2 Avis aux
utilisateurs avertis
Voici tout d'abord quelques
explications sur
la manière dont sont conservées les informations
sur une
disquette:
Au début de chaque
secteur, on trouve
des bytes de synchro qui sont normalement des FF, mais cela
à pu
être
changé (par exemple
en FE). On doit
ensuite trouver le marker du secteur qui permet de le reconnaitre, et
les datas proprement dites.
Ces datas sont
parfois codées de telle manière qu'elles ne
peuvent etre
écrites.
Après les datas, il
y a des bytes de
fin puis on recommence avec les bytes de synchro.
Les sections de bytes de
synchro sont
appelées gap, et les bytes qui les composent les gapbytes.
Ils sont en
général facilement
reconnaissables car ils sont par groupe de 10 ou 15.
NIBBLES AWAY est
conçu pour reconnaitre
les gapbytes composés de FF ou de FE. Si ces gapbytes sont
d'une
autre sorte, vous devez en
informer NIBBLES
AWAY. Les paramètres Gapbyte 1 et Gapbyte 2 doivent alors
être
saisis de manière
à avoir:
Gapbyte 1 = la valeur la plus
petite des
Gapbytes rencontrés
Gapbyte 2 = la valeur la plus
grande des
Gapbytes rencontrés.
Si l'échelle de ces
valeurs est trop
importante, NIBBLES AWAY peut prendre des datas pour des Gapbytes.
Par exemple si une disquette
utilise des
gapbytes AA, le gapbyte 1 devra etre fixe à AA et le gapbyte
2
à AB.
NIBBLES AWAY peut aussi
directement chercher
le marker de début de secteur (exemple : D5 AA 96) qui peut
lui-même etre
indiqué dans le
Backup Modifier. Cette méthode est plus fiable que la
précédente et se
révèle
indispensable si les
Gapbytes sont différents tout au long de la disquette.
Les markers de secteur doivent
normalement
avoir une longueur minimum de $OC bytes, et s'ils sont moins longs,
cela doit etre
indiqué dans Find Max.
La valeur minima de Find Max est $03 bytes.
Pour constituer un Gap, il
faut normalement au
moins $0F bytes, mais cela peut etre plus (dans le cas d'un
DOS 3.2 par exemple) ou moins
pour certaines
disquettes protégées. Ce ne sera cependant jamais
moins
que $0C
bytes par suite de limitations
techniques dues
aux drives Apple. Nibbles Away recherche des Gapbytes
d'au moins $0C de longueur
mais on peut
spécifier moins par l'intermédiaire du Gap Size.
Les Gapbytes peuvent etre
différents
tout au long de la disquette et Nibbles Away utilise une routine interne
qui détecte cette
anomalie dans la
plupart des cas. Elle peut être modifiée si on le
désire avec
False Hi et False Loo,
où False Lo est
le nombre de bits que Nibbles Away recherchera pour
déterminer
si un Gapbyte existe et False
Hi le nombre de
bits où il déterminera qu'il n'y a pas de
Gapbytes.
Cette fonction peut etre
supprimée dans
le cas d'interférences avec les autres en
répondant "N"
à la
question "OVERIDE GLITCH
DETECT" dans le
backup Modifier.
Rappelez vous lorsque vous
êtes dans le
Track/Bit Editor qu'il doit TOUJOURS y avoir au moins une piste
ne contenant pas de datas
entre deux pistes en
contenant.
Les valeurs prises par
défaut pour Data
Min et Data Max sont respectivement $13 et $1D, ce qui signifie
qu'une piste est reconnue
valide par Nibbles
Away si elle a une longueur minimum de $1300 bytes et
maximum de $1D00 bytes. Ces
valeurs
conviennent pour la majorité des cas.
La longueur des bytes de
synchro est
déterminée par Sync Size. Si ce
paramètre est fixe
à 9, 9 bytes de
synchro seront
écrits dans les Gaps et
ailleurs, toute autre valeur fixera ce paramètre
à 10.
Le paramètre Fix
Amnt controle le
nombre de Gapbytes placés avant le marker du secteur qui
devront
être
convertis en synchro. Si on
répond "Y"
à la question "OVERIDE SYNC CONVERT", ils ne seront pas
convertis
en synchro.
Le paramètre Fix
Valu controle en quoi
les Gaps sont convertis quand le synchro est ajouté.
Si on répond "Y"
à la question
"OVERIDE STANDARDIZER", les valeurs contenues dans les Gaps seront
utilisées comme
synchros sans autre
forme de procès. Les bits qui seront ou non convertis en
synchro
peuvent etre choisis avec
l'option "H" du
Track/Bit Editor.
Certains schémas de
protection
utilisent la méthode dite du "bit-insert" qui est difficile
à détecter.
Cela signifie qu'un byte de
synchro est
inséré au milieu de bytes normaux.
L'option "USE INSERT MARK" a
été
prévue dans cette perspective.
L'endroit où sera
inséré
ce byte de synchro peut etre déterminé
manuellement avec
Offset + et Offset -.
Retour sommaire
Nibble News vol 1, issue #1 (08/1982).
Retour sommaire
Nibble News vol 1, issue #2 (09/1982).
Retour sommaire
Nibble News vol 1, issue #3 (10/1982).
Retour sommaire
Nibble News vol 1, issue #4 (11/1982).
Retour sommaire
Nibble News vol 1, issue #5 (12/1982).
Retour sommaire
Nibble News vol 2, issue #1 (01/1983).
Retour sommaire
Nibble News Vol 3, issue 6 (1985).
Retour sommaire
Nibble News Vol 4, issue 2 (1985).
Retour sommaire
Nibble Parms.
Retour sommaire
Nibbles Away III et son langage NADOL.
|
Bootable
|
Download Nadol Master Disk version
1.00
(gzipped)
|
|
Not bootable
|
Download Nadol Library for Nadol 1.00
(gzipped)
|
|
Bootable
|
Download Nadol Master Disk version
1.26C
(gzipped)
|
|
Not bootable
|
Download Nadol Library for Nadol
1.26C
(gzipped)
|
|
Format A5 (5 MBytes)
|
Download Nadol User's Manual
|
Doc trouvée sur internet:
**************************************
*
*
*
NIBBLES AWAY
III
*
*
*
*
Complete
Documentation
*
*
by
*
*
Mr.
Wiz
*
*
*
**************************************
Nibbles Away III utilizes a
unique programming
language called NADOL, the
Nibbles Away Disk Optimized Language. This program can be
modified by the user
at will. This allows NAIII to remain current, no matter what
new
developments
in copy-protection take place. An added benefit is that users
can
create their
own programs under this powerful language. A few examples
would
be programs
which can convert DOS 3.3 files to CP/M, or one which could display a
color
disk map of files on a disk. NADOL is used in much the same
way
as Applesoft,
so, if you can program in Applesoft, you should feel comfortable with
NADOL.
All of the screens, menus and
prompts you will
use with NAIII were created
with the NADOL language.
Using NADOL
-----------
NADOL is an interactive
language that can have
2 distinct modes. The
first is "immediate" mode where commands are executed as they are typed
in.
The second is "deferred" mode, where a series of commands is typed in
and
executed later. From the Main Menu prompt choose the NADOL
option. This will
display a period (.), which is the prompt for the NADOL immediate
mode. Try
this command:
PRINT "HELLO" <return>
The word HELLO is printed on the screen. Numeric expressions
work
in the same
manner, such as:
PRINT 5*4
<return> which will print 20 on the screen.
Some commands require
variables be passed to
their parameters. The
variables must first be defined. In this example, the
following
sequence of
commands will read in and display data from sector 5 on track 4:
DEFINE INTEGER TRACK,SECTOR,COUNT,ERR
TRACK=4
SECTOR=5
COUNT=1
RSECT(RBUF,TRACK,0,SECTOR,COUNT,6,1,ERR)
DISPLAY(RBUF,256)
The DEFINE statement creates the four variables which are needed to
pass to the
RSECT routine. Then the track and sector numbers are assigned
to
the variables
with the "=" operator. The variable COUNT is set to 1 since
only
one sector is
to be read. The RSECT procedure is called to perform the
actual
read
operation. Then the DISPLAY procedure is called to show the
data
which was
just read in. The predefined variable RBUF is a section of
memory
normally
used for raw data reads, but it can be used for any other
purpose. In this
case, we used it for a temporary storage buffer for the data that was
read and
displayed.
At any time NADOL is waiting
for a response
(with the blinking cursor),
the CTRL-P key will print the contents of the screen to the
printer. The
predefined variable PRTSLOT (printer slot) is set to 1 but may be
changed with
the configuration menu.
Integer variables can range
from -32767 to
+32768. For some operations,
byte variables are desirable. They range from 0 to
255.
Integers occupy 2
bytes in memory, bytes occupy 1 byte.
NADOL also allows the use of
arrays or
groupings of variables. They are
referred to by the same name, with the "subscript" distinguishing
them. Below
is an example of how to create and use an integer array:
DEFINE INTEGER[10] MINE
MINE[0]=1
MINE[4]=5
PRINT MINE[0]+MINE[4]
This would print 6, since the 2 values would be added together. Note
that on
the Apple II and II+ the right bracket can be entered with shift-M and
the left
bracket with shift-N from NADOL.
All data managed by NADOL is
stored in either
integers or bytes or
arrays. Many times it is desired to store text data in a
program. NADOL has
provisions for handling this. Text is stored in byte arrays
in a
special
format. The text starts at element 0, with each additional
character in the
next sequential location. The last element should be zero
indicating the end
of the text string.
Normally when an array
variable is specified
in a PRINT statement, the
value of the first element is displayed. In order to print
the
text contained
in a byte array, an exclamation point should be placed in front of its
name in
the PRINT statement:
DEFINE BYTE[30] STRING
STRING[0]="H"
STRING[1]="I"
STRING[2]=0
PRINT !STRING
Would print HI on the screen.
NADOL uses a number of
built-in mathematical
expressions including
addition (+), subtraction (-), multiplication (*), and division (/); as
well as
logical operators, <>, <=, =>, =,
etc. The order of
precedence means that the
expression:
5*6+3*4
will result in 42. NADOL first evaluates the 2
multiplcations,
since they have
highest precedence, then the addition will be performed.
Parentheses may also
be used in mathematical operations. Logical operators
include:
AND, OR, XOR.
The comparison will return a 1 or 0 depending on the result of the
logical
operation.
The ASCII value of a character
can be used in
an expression or
comparison. This is accomplished by enclosing the ASCII
character
in double
quotes ("), such that "A" would result in the hexadecimal value 65
being used.
The Editor
----------
NADOL's built-in editor allows
scanning of a
program as well as insertion
and deletion of lines or characters. The editor can handle
lines
up to 250
characters in length and supports horizontal scrolling to allow long
lines to
be displayed. The standard editor uses the 40-column display
but
versions are
included to support many 80-column displays.
If no program is in memory,
the cursor will be
at the top of the screen
with [END OF PROGRAM] displayed. This shows that there are no
lines of program
currently stored.
The editor is invoked by
typing EDIT at the
'.' prompt. This will display
the current program and place the cursor at the top of the
screen. The
commands of the editor and their descriptions follow:
left arrow Move cursor left one space
right arrow Move cursor right one space
ctrl-A Selects Add
mode. All
subsequent characters will be
inserted into the current line.
ctrl-B Move to
Beginning of line.
ctrl-C Page downwards.
ctrl-D Delete
character to right of
cursor.
ctrl-E Cursor up one
page.
ctrl-F Restores
previous contents of
line. Undo any changes.
ctrl-I Tab to next
tab stop. Tab
stops are set every 2 characters.
ctrl-L Insert a new
Line at cursor
position.
ctrl-N Moves to End
of line.
ctrl-Q Quit editor
and return to NADOL.
ctrl-R Scroll page
upwards.
ctrl-W Move cursor
upwards.
ctrl-X Move cursor
downwards.
ctrl-Y Deletes the
line which the cursor
currently occupies.
ctrl-Z Scroll
downwards.
NADOL
-----
NADOL is a structured language
borrowing from
Pascal, Basic, and C.
Programs are arranged as one statement per line. Branching is
allowed to
another part of the program. Programs are entered using the
Editor function
and executed with the RUN command.
There are 4 options that NADOL
can use
depending upon the program line
contents:
1. Statement - "PRINT (5*6)/3"
2. Assignment - "I=5"
3. Procedure call - "DISPLAY($800,40)"
4. Flow control - IF/ELSE/ENDIF, GOTO, WHILE/ENDWHILE, etc.
Entering the following sample program:
DEFINE INTEGER ME
ME=0
WHILE ME<5
PRINT ME
ME=ME+1
ENDWHILE
PRINT "DONE"
and running it with RUN would procduce:
0
1
2
3
4
5
DONE
The WHILE/ENDWHILE lines are called a block. As long as the
contents of the
block remain true, the program will stay within the block. In
the
above
example, when ME became greater than 5, the program jumped out of the
block.
Multiple blocks, or nesting of blocks, are allowed with 8 blocks deep
being the
maximum.
Several sample programs are
contained on the
disk. Try running them and
changing them to see how the editor and NADOL work together.
Procedures and Functions
------------------------
NADOL has 2 different ways to
create
subroutines in a program. Procedures
perform a set of instructions and return to the main program.
Functions pass
back a value to the main program.
A sample of a Procedure
follows:
DEFINE INTEGER J
PROCEDURE TIMESTWO
J=J*2
ENDPROC
J=8
PRINT J
TIMESTWO
PRINT J
When RUN the results 8 and 16 would be printed.
Functions operate in much the
same way as
Procedures, except they act as
expressions rather than statements. Example:
DEFINE INTEGER J
FUNCTION OURS
%1 = %1 + 1
RESULT = %1 * %1
ENDFUNC
PRINT OURS(7)
J=OURS(6)
PRINT J
As shown, a function is used on the right side of an equate, and
returns a
value.
NADOL Built-In Statements
-------------------------
The following layout will help explain each statement:
NAME
TYPE
---------------------------------------
Purpose
Syntax (optional fields in parentheses)
AUXMOVE
Procedure
To move data to or from auxiliary memory in a IIe or IIc.
AUXMOVE(apple addr,aux addr,length,direction)
BEEP
Procedure
Sounds a tone.
BEEP(tone,time) range 0-255
CALL
Procedure
Executes a machine-language subroutine.
CALL(address,accumulator,X-reg,Y-reg,status)
CATALOG
Statement
Display the catalog of a data disk and free space remaining.
CATALOG
CLEAR
Statement
Clears all variables.
CLEAR
CLREOL
Statement
Clears all text to right of cursor.
CLREOL
CLREOP
Statement
Clears all text to right of cursor to end of current page.
CLREOP
COLOR=
Statement
Sets the color used in lo-res graphics.
COLOR=expression (0-15)
CONVERT
Procedure
Convert a byte array containing ASCII text into an array of
hex or
decimal values.
CONVERT(source,destina,type,size,count1,count2)
COPY
Procedure
Copies a block of data from one location to another.
COPY(source,destina,length)
DEFINE
Statement
Allocates space for one or more variables.
(DEFINE) type (n) name (,name)..
DELAY
Statement
Pauses for a specific amount of time.
DELAY(expression) in milliseconds
DELETE
Command
Removes a file from work disk.
DELETE filename
DISASM
Statement
Displays a disassembled listing of machine code.
DISASM(start,label,lines,offset)
DISPLAY
Procedure
Displays a block of data in hex.
DISPLAY(start,length)
EDIT
Command
Invokes the built-in program editor.
EDIT
FILL
Procedure
Fills a section of memory with a value.
FILL(start,length,value)
FIND
Procedure
Finds a specified pattern with the ability to ignore bit 7 and
perform wildcard matching.
FIND(start,length1,pattern,length2,7 flag,wild flag,offset)
FLASH
Statement
Sets flash mode for printed characters.
FLASH
FILTER
Procedure
Copies data into a write buffer, passing it through a
'filter' to
remove unwanted values.
FILTER(start,length,table,number)
FORMAT
Procedure
Formats a range of tracks.
FORMAT(first,last,volume,interleave,nsect,slot,drive,error)
interleave=name of byte array containing numbers for sectors
on
tracks
to be formatted
FREE
Function
Returns the amount of space available for programs and data.
variable=FREE(x) where x is a dummy expression, usually 0.
GOTO
Statement
Transfers program execution to another location.
GOTO labelname
GOTOXY
Procedure
Moves cursor to a new location on screen.
GOTOXY(x,y)
HCOLOR
Procedure
Sets color for high-res plotting.
HCOLOR=expression (0-7)
HEXPACK
Statement
Reads HEX data into byte array, with optional checksum.
HEXPACK name WITH "text" (,checksum)
HIRES
Statement
Initializes hi-res graphics mode.
HIRES
HLINE
Procedure
Draws a line on lo-res screen.
HLINE(x1,y1,x2)
HOME
Statement
Clears screen and places cursor in upper left corner.
HOME
HPLOT
Statement
Plots points or draws lines on hi-res screen.
HPLOT(x,y) (TO x,y)...
HSCRN
Function
Returns value of a dot on hi-res screen.
variable=SCRN(x,y)
IF, ELSE, and ENDIF
Statement
Alters program flow based on a condition.
IF expression
.
(statement executed on true)
(ELSE)
.
(statement executmd on false)
.
ENDIF
IN#
Statement
Takes program input from a peripheral slot.
IN#expresion (1-7)
INIT
Command
Formats a blank disk for storage.
INIT name
INPUT
Procedure
Reads ASCII data from keyboard into a byte array.
INPUT(name,max,count) where max is maximum
characters
allowed, and
count is name of variable.
INVERSE
Statement
Sets inverse mode for all printed characters.
INVERSE
LABEL
Statement
Sets a location which can be branched to with a GOTO
statement.
LABEL name
LCMOVE
Procedure
Moves data to or from the language card.
LCMOVE(mem address,lc address,length,,direction)
where if direction=0 then from LC, if 1 then to LC
LENGTH
Function
Returns the length of the text in a byte aray.
variable=LENGTH(name)
LIST
Command
Displays the current program.
LIST
LOAD
Command
Loads a file from current workdisk.
LOAD filename (AT address)
LORES
Statement
Initializes lo-res graphics.
LORES
LSCRN
Function
Returns the color of a point on screen.
variable=LSCRN(x,y)
MAKE
Procedure
Creates a filter in the specified array.
MAKE(address,length,start,num zeroes,bit length)
MASK
Procedure
Sets and clears bits in range of memory.
MASK(start,length,or value, and value)
NEW
COMMAND
Erases current program and clears variable space.
NEW
NOT
Function
Returns the logical inverse of a value.
variable=NOT(expression)
NORMAL
Statement
Returns text display to normal characters.
NORMAL
PACK
Procedure
Places a text string into a byte array.
PACK name WITH "text"
PDL
Function
Reads a game paddle.
variable=PDL(expression)
PLOT
Procedure
Plots a dot on lo-res screen.
PLOT(x,y)
PR#
Command
Sends all text output to perpherial slot.
PR#expression (1-7)
PRBLOCK
Procedure
Displays a section of memory in a variety of formats.
PRBLOCK(start,length,label,digits,format,count1,count2,space)
where:
length=# of bytes to display
label=first # to show on left margin of screen
digits=# of digits to show of label above (0-4).
format-0=ASCII, 1=HEX, 2=HEX with bytes <$80 in
inverse.
count1=# of bytes displayed per line.
count2=# of bytes displayed per grouping on line.
space=# of bytes displayed between groupings on a line.
PRINT
Procedure
To display data on screen.
PRINT (expression)(,)(;)(expresion)(,)(;)...
PRINTBYTE
Statement
Prints 8 bit hex values.
PRINTBYTE(expression)(,)(;)...
PRINTHEX
Statement
Print 16 bit hex values.
PRINTHEX(expression)(,)(;)...
PROCEDURE
Statement
Defines a user subroutine.
PROCEDURE name
RECAL
Procedure
Moves read/write disk head to track 0.
RECAL(slot,drive)
RENAME
Command
Changes name of disk file.
RENAME oldname,newname
READ
Function
Reads a character from keyboard.
variable=READ(expression)
RBLOCK
Procedure
Reads 1 or more blocks from a ProDOS format disk.
RBLOCK(address,block,count,slot,drive,error)
RESULT
Statement
Evaluates expression to be returned as the result of a user
defined
function.
RESULT=expression
RSECT
Procedure
Reads 1 or more sectors from a disk.
RSECT(address,track,half,sector,count,slot,drive,error)
RTRACK
Procedure
Reads raw data from a specified track into the read buffer.
RTRACK(address,track,half,slot,drive)
RSYNC
Procedure
Functionally identical to RTRACK, except that a reference
mark on
track 0 is checked before reading.
WSYNC
Procedure
Functionally identical to RTRACK, except a reference mark on
track 0
is checked before writing.
WTRACK
Procedure
Writes a section of raw data to a disk from write buffer.
WTRACK(sync size,pre fill,track,half,slot,drive,error)
where pre fill=# of sync bytes to write prior to data.
RUN
Command
Begins the execution of a user program.
RUN
SAVE
Command
Stores programs or data on disk.
SAVE filename (AT address,length)
SETFORMAT
Procedure
Selects the format, address header, data header, and
interleave
for
RSECT, WSECT and FORMAT procedures.
SETFORMAT(type,address header,data header,interleave)
SIZEOF
Function
Determines size of a NADOL disk file.
variable=SIZEOF(filename)
STOP
Statement
Terminates a program.
STOP
TEXT
Statement
Switches off graphics mode and return to full screen text.
TEXT
VLINE
Procedure
Draws a vertical line on lo-res screen.
VLINE(x1,y1,y2)
WBLOCK
Procedure
Writes 1 or more blocks to a PorDOS disk.
WBLOCK(address,block,count,slot,drive,error)
WHILE/ENDWHILE
Statement
Causes a section of a program to be executed repeatedly until
a
condition is met.
WHILE expression
.
.
(executable statement)
.
.
ENDWHILE
WORKDRIVE
Statement
Defines drive for file operations.
WORKDRIVE(slot,drive)
WSECT
Procedure
Writes 1 or more sectors to a disk.
WSECT(address,track,half,sector,count,slot,drive,error)
Predefined Variables
--------------------
These are predefined and always avaliable for the user in immediate
mode.
MEMORY
Byte Array
An array which encompasses the entire Apple memory range.
MEMORY[0] is
memory location $0. MEMORY[4000] is memory location $4000.
BREAK
Byte
Controls operation of Ctrl-C. If set to 0 then
Ctrl-C will
halt a
program. If set to 1, will not halt and reset will cause
current
program to start executing from beginning.
ERROR
Byte
Contains number of any error that occurred. 0=no errors.
PRTSLOT
Byte
Slot number of printer interface card.
MACHID
Byte
Indicates type of Apple used, set during boot:
0=Apple II 1=Apple
II+
2=AppleIIe 3=Apple
IIc
HASLC
Byte
Indicates presence of 16K RAM card in slot 0.
HASAUX
Byte
Indicates presence of additional 64K memory in IIe or IIc.
RBUF
Byte Array
Read buffer used for raw nibble reads. $3FFF in
length.
WBUF
Byte Array
Write buffer used for raw data writing. $29FF in length.
ADDR16
Byte Array
Contains normal address mark for 16-sector disks (D5 AA 96 DE
AA
EB)
DATA16
Byte Array
Contains normal data mark for 16-sector disks (D5 AA AD DE AA
EB)
ADDR13
Byte Array
Contains normal address mark for 13-sector disk (D5 AA B5 DE
AA
EB)
DATA13
Byte Array
Contains normal data mark for 13-sector disk (D5 AA AD DE AA
EB)
FORM16
Byte Array
Contains the numbers for the sectors on a normally interleaved
16-sector disk. (00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E
0F)
FORM13
Byte Array
Contains the numbers for the sectors on a normally interleaved
13-sector disk. (00 0A 07 04 01 0B 08 05 02 0C 09 06 03)
WNDLEFT
Byte
Value of left margin of screen, normally 0.
WNDWIDTH
Byte
Value of width of screen, normally 40.
WNDTOP
Byte
Value of upper line of screen, normally 0.
WNDBOT
Byte
Value of bottom line of screen, normally 23.
Nibbles Away III
Docs Part 2
by
Mr. Wiz
Using Nibbles Away III Copier
-----------------------------
Option #1 from the Main Menu
enters the Bit
Copier. A menu if presented
to allow toggling or changing items. They are
self-explanatory. At any time,
pressing Ctrl-P will cause the screen to be sent to your printer VIA
whatever
slot you have specified in the Configuration section (default=slot 1).
During the copy process,
several keys can be
pressed to invoke special
functions. They are:
Q - Abort current copy process
S - Skip to next track
G - Enable hi-res graphics display mode
T - Disable hi-res graphics, back to text screen
Included in NAIII is a Fast
Sector Copy
program to copy standard DOS 3.3,
Pascal, and CP/M disks. If you have an Apple IIe or IIc with
additional
memory, then the additional memory will be used to speed up the copy
process.
Track Editor
------------
This option is used to view
raw data present
on any track. Several
options are available to allow the data to be scanned or modified, and
then
written back to disk.
When first selected, this
function will
display several hundered bytes of
information from the start of the read buffer. A blinking
cursor
will appear
in the upper left corner of the data. In the upper right
corner
is the track
number.
Different keys invoke
different
functions. They are:
arrows - Move cursor in appropriate direction.
I - Move cursor up 1 line.
J - Move cursor left 1 byte.
K - Move cursor right 1 byte.
M - Move cursor down 1 line.
> - Move cursor down 1
page.
< - Move cursor up 1
page.
+ - Increment track number.
- - Decrement track number.
T - Asks for a new track
number to be entered.
O - Shows Options page for
different
slot/drive.
F - Asks for HEX string to
Find. The
cursor will move to that
location if found.
C - Shows count of the number
of bytes to next
occurence of bytes
at cursor location.
P - Shows print menu.
S - Sets the 'Track Start'
value to the cursor
location.
E - Sets the 'Track End' value
to the current
location.
M - Moves the currently marked
track into the
write buffer.
/ - Toggles between read and
write buffers.
G - Prompts for new location
for cursor.
R - Reads current track into
buffer.
W - Writes data in write
buffer to disk.
Q - Quit track editor.
SPACE - Enters modify mode. Once entered:
Typing HEX
values will change value of byte.
Space Bar
will move to next value.
RETURN
will accept current value.
Arrows
move cursor.
ESC will
abort modify function.
Data which has its high bit clear will be written as SYNC bytes, and
will
display as inverse on screen.
Sector Editor
-------------
Option #4 will invoke the
Sector Editor.
DOS 3.2, DOS 3.3, Pascal, and
CP/M disks can be viewed and modified. A disassembly of the
data
may be
presented.
The following keys will
perform certain
functions:
arrows - Move cursor in appropriate direction.
I - Move cursor up 1 line.
J - Move cursor left 1 byte.
K - Move cursor right 1 byte.
M - Move cursor down 1 line.
+ - Increment sector number
- - Decrement sector number.
> - Increment track
number.
< - Decrement track
number.
/ - Toggle between HEX and
ASCII display.
SPACE - Enter modify mode:
HEX digits
are accepted on HEX side, space moves to next
value.
ASCII
characters may be entered directly on ASCII side.
Arrows
move cursor.
RETURN
accepts current value.
ESC aborts
modify mode.
R - Read current
sector.
W - Write current
sector.
D - Disassemble data
in buffer from
cursor. RETURN to abort.
T - Prompt for new
track number.
S - Prompt for new
sector number.
F - Selects Find
mode.
1 - Prompt
for start track.
2 - Prompt
for starting sector.
3 - Prompt
for end track.
4 - Prompt
for ending sector.
5 - Toggle
HEX/ASCII searching.
6 -
Switches search direction between ascending and
descending.
7 - Prompt
for search string (32 characters maximum)
RETURN to start search.
Q to abort search.
O -
Display Options screen.
Q - Quit
sector editor.
NADOL Error Messages
--------------------
1 - Syntax error
2 - ()Mismatch error
3 - Parameter count error
4 - Stack overflow error
5 - Duplicate variable error
6 - Duplicate Proc/Func error
7 - Symbol table full error
8 - Undefined symbol error
9 - Unexpected end of file error
11 - Value range error
13 - Nested label error
14 - Subscript error
15 - No begin error
16 - Wrong type of parameter error
17 - Read only error
19 - Immediate only error
20 - No language card error
21 - No auxiliary memory error
22 - IF/ENDIF mismatch error
23 - WHILE/ENDWHILE mismatch error
24 - Program too large error
25 - I/O error
26 - Disk full error
28 - File not found error
29 - No Applesoft error
NADOL Memory Map
---------------------------------------------------------------------$FFFF
Monitor
$F800
---------------------------------------------------------------------$F7FF
.
Applesoft
.
.
---------------------------------------------------------------------$D000
System
I/O
$C000
---------------------------------------------------------------------$BFFF
.
.
NADOL Program
Code
.
.
.
---------------------------------------------------------------------$8000
Read Buffer
---------------------------------------------------------------------$4000
Write Buffer
---------------------------------------------------------------------$2700
User Program
---------------------------------------------------------------------
.
Data for Variables
---------------------------------------------------------------------
.
Free Space
---------------------------------------------------------------------
Symbol Table
---------------------------------------------------------------------$0C00
NADOL Workspace
---------------------------------------------------------------------$0800
Zero page, Stack and Screen
---------------------------------------------------------------------$0000
Retour sommaire
Quelques tables utiles.
Quand on commence à inspecter les nibbles, il devient urgent
d'avoir sous le coude une liste des $23 valeurs de piste et des $10
valeurs de secteur possibles en représentation avec la
méthode 4-4.
Trk / Sect / 2* 4-4 bytes (hexa)
$00 / $00 : AA AA
$01 / $01 : AA AB
$02 / $02 : AB AA
$03 / $03 : AB AB
$04 / $04 : AA AE
$05 / $05 : AA AF
$06 / $06 : AB AE
$07 / $07 : AB AF
$08 / $08 : AE AA
$09 / $09 : AE AB
$0A / $0A : AF AA
$0B / $0B : AF AB
$0C / $0C : AE AE
$0D / $0D : AE AF
$0E / $0E : AF AE
$0F / $0F : AF AF
$10
: AA BA
$11
: AA AB
$12
: AB BA
$13
: AB BB
$14
: AA BE
$15
: AA BF
$16
: AB BE
$17
: AB BF
$18
: AE BA
$19
: AE BB
$1A
: AF BA
$1B
: AF BB
$1C
: AE BE
$1D
: AE BF
$1E
: AF BE
$1F
: AF BF
$20
: BA AA
$21
: BA AB
$22
: BB AA
Table passage valeur $00-$3F -> nibble
DOS: $BA29.$BA68
$00 : 96 $10 : B4 $20 : D6 $30 : ED
$01 : 97 $11 : B5 $21 : D7 $31 : EE
$02 : 9A $12 : B6 $22 : D9 $32 : EF
$03 : 9B $13 : B7 $23 : DA $33 : F2
$04 : 9D $14 : B9 $24 : DB $34 : F3
$05 : 9E $15 : BA $25 : DC $35 : F4
$06 : 9F $16 : BB $26 : DD $36 : F5
$07 : A6 $17 : BC $27 : DE $37 : F6
$08 : A7 $18 : BD $28 : DF $38 : F7
$09 : AB $19 : BE $29 : E5 $39 : F9
$0A : AC $1A : BF $2A : E6 $3A : FA
$0B : AD $1B : CB $2B : E7 $3B : FB
$0C : AE $1C : CD $2C : E9 $3C : FC
$0D : AF $1D : CE $2D : EA $3D : FD
$0E : B2 $1E : CF $2E : EB $3E : FE
$0F : B3 $1F : D3 $2F : EC $3F : FF
Table passage nibble -> valeur $00-$3F
DOS: $BA96.$BAFF
4 *==============================*
5
*
*
6 *
Denibblizing table
#1 *
7 * Nibble
to 6-bits
byte *
8
* translation
table *
9
*
(00XXXXXX)
*
10
*
*
11 *===============================
12
13 * Translate a valid nibble to 6-bits byte
00XXXXXX.
14 *
15 * 1 nibble: value from $96 to $FF (=$6A=106 disk
bytes)
but
16
*
only
$40=64 disk bytes are valids. They have to
17
*
respect
the rules:
18
*
- bit 7
(high bit) on
19
*
- at
least 2 adjacent bits set excluding bit 7
20
*
- not a
reserved byte ($AA, $D5)
21
*
- no more
than 2 consecutive zero bits
22 * 6 bits are required to have $40 values.
23
24
DECTBL
25
26
*
Index
<== disk byte
27
*
%00XXXXXX
28
BA96:
00
29
DFB %00000000 ; $00 <== $96
BA97:
01
30
DFB %00000001 ; $01 <== $97
BA98:
00
31
DFB
0
; <== $98 invalid
BA99:
00
32
DFB
0
; <== $99 invalid
BA9A:
02
33
DFB %00000010 ; $02 <== $9A
BA9B:
03
34
DFB %00000011 ; $03 <== $9B
BA9C:
00
35
DFB
0
; <== $9C invalid
BA9D:
04
36
DFB %00000100 ; $04 <== $9D
BA9E:
05
37
DFB %00000101 ; $05 <== $9E
BA9F:
06
38
DFB %00000110 ; $06 <== $9F
BAA0:
00
39
DFB
0
; <== $A0 invalid
BAA1:
00
40
DFB
0
; <== $A1 invalid
BAA2:
00
41
DFB
0
; <== $A2 invalid
BAA3:
00
42
DFB
0
; <== $A3 invalid
BAA4:
00
43
DFB
0
; <== $A4 invalid
BAA5:
00
44
DFB
0
; <== $A5 invalid
BAA6:
07
45
DFB %00000111 ; $07 <== $A6
BAA7:
08
46
DFB %00001000 ; $08 <== $A7
BAA8:
00
47
DFB
0
; <== $A8 invalid
BAA9:
00
48
DFB
0
; <== $A9 invalid
BAAA:
00
49
DFB
0
; <== $AA invalid
BAAB:
09
50
DFB %00001001 ; $09 <== $AB
BAAC:
0A
51
DFB %00001010 ; $0A <== $AC
BAAD:
0B
52
DFB %00001011 ; $0B <== $AD
BAAE:
0C
53
DFB %00001100 ; $0C <== $AE
BAAF:
0D
54
DFB %00001101 ; $0D <== $AF
BAB0:
00
55
DFB
0
; <== $B0 invalid
BAB1:
00
56
DFB
0
; <== $B1 invalid
BAB2:
0E
57
DFB %00001110 ; $0E <== $B2
BAB3:
0F
58
DFB %00001111 ; $0F <== $B3
BAB4:
10
59
DFB %00010000 ; $10 <== $B4
BAB5:
11
60
DFB %00010001 ; $11 <== $B5
BAB6:
12
61
DFB %00010010 ; $12 <== $B6
BAB7:
13
62
DFB %00010011 ; $13 <== $B7
BAB8:
00
63
DFB
0
; <== $B8 invalid
BAB9:
14
64
DFB %00010100 ; $14 <== $B9
BABA:
15
65
DFB %00010101 ; $15 <== $BA
BABB:
16
66
DFB %00010110 ; $16 <== $BB
BABC:
17
67
DFB %00010111 ; $17 <== $BC
BABD:
18
68
DFB %00011000 ; $18 <== $BD
BABE:
19
69
DFB %00011001 ; $19 <== $BE
BABF:
1A
70
DFB %00011010 ; $1A <== $BF
BAC0:
00
71
DFB
0
; <== $C0 invalid
BAC1:
00
72
DFB
0
; <== $C1 invalid
BAC2:
00
73
DFB
0
; <== $C2 invalid
BAC3:
00
74
DFB
0
; <== $C3 invalid
BAC4:
00
75
DFB
0
; <== $C4 invalid
BAC5:
00
76
DFB
0
; <== $C5 invalid
BAC6:
00
77
DFB
0
; <== $C6 invalid
BAC7:
00
78
DFB
0
; <== $C7 invalid
BAC8:
00
79
DFB
0
; <== $C8 invalid
BAC9:
00
80
DFB
0
; <== $C9 invalid
BACA:
00
81
DFB
0
; <== $CA invalid
BACB:
1B
82
DFB %00011011 ; $1B <== $CB
BACC:
00
83
DFB
0
; <== $CC invalid
BACD:
1C
84
DFB %00011100 ; $1C <== $CD
BACE:
1D
85
DFB %00011101 ; $1D <== $CE
BACF:
1E
86
DFB %00011110 ; $1E <== $CF
BAD0:
00
87
DFB
0
; <== $D0 invalid
BAD1:
00
88
DFB
0
; <== $D1 invalid
BAD2:
00
89
DFB
0
; <== $D2 invalid
BAD3:
1F
90
DFB %00011111 ; $1F <== $D3
BAD4:
00
91
DFB
0
; <== $D4 invalid
BAD5:
00
92
DFB
0
; <== $D5 invalid
BAD6:
20
93
DFB %00100000 ; $20 <== $D6
BAD7:
21
94
DFB %00100001 ; $21 <== $D7
BAD8:
00
95
DFB
0
; <== $D8 invalid
BAD9:
22
96
DFB %00100010 ; $22 <== $D9
BADA:
23
97
DFB %00100011 ; $23 <== $DA
BADB:
24
98
DFB %00100100 ; $24 <== $DB
BADC:
25
99
DFB %00100101 ; $25 <== $DC
BADD:
26
100
DFB %00100110 ; $26 <== $DD
BADE:
27
101
DFB %00100111 ; $27 <== $DE
BADF:
28
102
DFB %00101000 ; $28 <== $DF
BAE0:
00
103
DFB
0
; <== $E0 invalid
BAE1:
00
104
DFB
0
; <== $E1 invalid
BAE2:
00
105
DFB
0
; <== $E2 invalid
BAE3:
00
106
DFB
0
; <== $E3 invalid
BAE4:
00
107
DFB
0
; <== $E4 invalid
BAE5:
29
108
DFB %00101001 ; $29 <== $E5
BAE6:
2A
109
DFB %00101010 ; $2A <== $E6
BAE7:
2B
110
DFB %00101011 ; $2B <== $E7
BAE8:
00
111
DFB
0
; <== $E8 invalid
BAE9:
2C
112
DFB %00101100 ; $2C <== $E9
BAEA:
2D
113
DFB %00101101 ; $2D <== $EA
BAEB:
2E
114
DFB %00101110 ; $2E <== $EB
BAEC:
2F
115
DFB %00101111 ; $2F <== $EC
BAED:
30
116
DFB %00110000 ; $30 <== $ED
BAEE:
31
117
DFB %00110001 ; $31 <== $EE
BAEF:
32
118
DFB %00110010 ; $32 <== $EF
BAF0:
00
119
DFB
0
; <== $F0 invalid
BAF1:
00
120
DFB
0
; <== $F1 invalid
BAF2:
33
121
DFB %00110011 ; $33 <== $F2
BAF3:
34
122
DFB %00110100 ; $34 <== $F3
BAF4:
35
123
DFB %00110101 ; $35 <== $F4
BAF5:
36
124
DFB %00110110 ; $36 <== $F5
BAF6:
37
125
DFB %00110111 ; $37 <== $F6
BAF7:
38
126
DFB %00111000 ; $38 <== $F7
BAF8:
00
127
DFB
0
; <== $F8 invalid
BAF9:
39
128
DFB %00111001 ; $39 <== $F9
BAFA:
3A
129
DFB %00111010 ; $3A <== $FA
BAFB:
3B
130
DFB %00111011 ; $3B <== $FB
BAFC:
3C
131
DFB %00111100 ; $3C <== $FC
BAFD:
3D
132
DFB %00111101 ; $3D <== $FD
BAFE:
3E
133
DFB %00111110 ; $3E <== $FE
BAFF:
3F
134
DFB %00111111 ; $3F <== $FF
Conversion Hexa / binaire
$00 : %00000000 $40 : %01000000
$80 :
%10000000 $C0 : %11000000
$01 : %00000001 $41 : %01000001 $81 :
%10000001
$C1 : %11000001
$02 : %00000010 $42 : %01000010 $82 :
%10000010
$C2 : %11000010
$03 : %00000011 $43 : %01000011 $83 :
%10000011
$C3 : %11000011
$04 : %00000100 $44 : %01000100 $84 :
%10000100
$C4 : %11000100
$05 : %00000101 $45 : %01000101 $85 :
%10000101
$C5 : %11000101
$06 : %00000110 $46 : %01000110 $86 :
%10000110
$C6 : %11000110
$07 : %00000111 $47 : %01000111 $87 :
%10000111
$C7 : %11000111
$08 : %00001000 $48 : %01001000 $88 :
%10001000
$C8 : %11001000
$09 : %00001001 $49 : %01001001 $89 :
%10001001
$C9 : %11001001
$0A : %00001010 $4A : %01001010 $8A :
%10001010
$CA : %11001010
$0B : %00001011 $4B : %01001011 $8B :
%10001011
$CB : %11001011
$0C : %00001100 $4C : %01001100 $8C :
%10001100
$CC : %11001100
$0D : %00001101 $4D : %01001101 $8D :
%10001101
$CD : %11001101
$0E : %00001110 $4E : %01001110 $8E :
%10001110
$CE : %11001110
$0F : %00001111 $4F : %01001111 $8F :
%10001111
$CF : %11001111
$10 : %00010000 $50 : %01010000 $90 :
%10010000
$D0 : %11010000
$11 : %00010001 $51 : %01010001 $91 :
%10010001
$D1 : %11010001
$12 : %00010010 $52 : %01010010 $92 :
%10010010
$D2 : %11010010
$13 : %00010011 $53 : %01010011 $93 :
%10010011
$D3 : %11010011
$14 : %00010100 $54 : %01010100 $94 :
%10010100
$D4 : %11010100
$15 : %00010101 $55 : %01010101 $95 :
%10010101
$D5 : %11010101
$16 : %00010110 $56 : %01010110 $96 :
%10010110
$D6 : %11010110
$17 : %00010111 $57 : %01010111 $97 :
%10010111
$D7 : %11010111
$18 : %00011000 $58 : %01011000 $98 :
%10011000
$D8 : %11011000
$19 : %00011001 $59 : %01011001 $99 :
%10011001
$D9 : %11011001
$1A : %00011010 $5A : %01011010 $9A :
%10011010
$DA : %11011010
$1B : %00011011 $5B : %01011011 $9B :
%10011011
$DB : %11011011
$1C : %00011100 $5C : %01011100 $9C :
%10011100
$DC : %11011100
$1D : %00011101 $5D : %01011101 $9D :
%10011101
$DD : %11011101
$1E : %00011110 $5E : %01011110 $9E :
%10011110
$DE : %11011110
$1F : %00011111 $5F : %01011111 $9F :
%10011111
$DF : %11011111
$20 : %00100000 $60 : %01100000 $A0 :
%10100000
$E0 : %11100000
$21 : %00100001 $61 : %01100001 $A1 :
%10100001
$E1 : %11100001
$22 : %00100010 $62 : %01100010 $A2 :
%10100010
$E2 : %11100010
$23 : %00100011 $63 : %01100011 $A3 :
%10100011
$E3 : %11100011
$24 : %00100100 $64 : %01100100 $A4 :
%10100100
$E4 : %11100100
$25 : %00100101 $65 : %01100101 $A5 :
%10100101
$E5 : %11100101
$26 : %00100110 $66 : %01100110 $A6 :
%10100110
$E6 : %11100110
$27 : %00100111 $67 : %01100111 $A7 :
%10100111
$E7 : %11100111
$28 : %00101000 $68 : %01101000 $A8 :
%10101000
$E8 : %11101000
$29 : %00101001 $69 : %01101001 $A9 :
%10101001
$E9 : %11101001
$2A : %00101010 $6A : %01101010 $AA :
%10101010
$EA : %11101010
$2B : %00101011 $6B : %01101011 $AB :
%10101011
$EB : %11101011
$2C : %00101100 $6C : %01101100 $AC :
%10101100
$EC : %11101100
$2D : %00101101 $6D : %01101101 $AD :
%10101101
$ED : %11101101
$2E : %00101110 $6E : %01101110 $AE :
%10101110
$EE : %11101110
$2F : %00101111 $6F : %01101111 $AF :
%10101111
$EF : %11101111
$30 : %00110000 $70 : %01110000 $B0 :
%10110000
$F0 : %11110000
$31 : %00110001 $71 : %01110001 $B1 :
%10110001
$F1 : %11110001
$32 : %00110010 $72 : %01110010 $B2 :
%10110010
$F2 : %11110010
$33 : %00110011 $73 : %01110011 $B3 :
%10110011
$F3 : %11110011
$34 : %00110100 $74 : %01110100 $B4 :
%10110100
$F4 : %11110100
$35 : %00110101 $75 : %01110101 $B5 :
%10110101
$F5 : %11110101
$36 : %00110110 $76 : %01110110 $B6 :
%10110110
$F6 : %11110110
$37 : %00110111 $77 : %01110111 $B7 :
%10110111
$F7 : %11110111
$38 : %00111000 $78 : %01111000 $B8 :
%10111000
$F8 : %11111000
$39 : %00111001 $79 : %01111001 $B9 :
%10111001
$F9 : %11111001
$3A : %00111010 $7A : %01111010 $BA :
%10111010
$FA : %11111010
$3B : %00111011 $7B : %01111011 $BB :
%10111011
$FB : %11111011
$3C : %00111100 $7C : %01111100 $BC :
%10111100
$FC : %11111100
$3D : %00111101 $7D : %01111101 $BD :
%10111101
$FD : %11111101
$3E : %00111110 $7E : %01111110 $BE :
%10111110
$FE : %11111110
$3F : %00111111 $7F : %01111111 $BF :
%10111111
$FF : %11111111
Retour sommaire