Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Gestion de fichiers avec RWTS<br />
Ce n'est un secret pour personne : le<br />
005 de ]' Apple Il n'est pas des plus<br />
rapides, notamment lorsqu'il lui faut<br />
gérer des fichiers de données. Partant<br />
de cette constatation, certains<br />
ont conçu, réalisé et commercialisé<br />
des systèmes DOS complets, destinés<br />
à remp<strong>la</strong>cer ou re<strong>la</strong>yer le système<br />
standard.<br />
Cet article ne se propose pas de<br />
vous donner un tel système (un numéro<br />
spécial de Parn's n'y suffirait<br />
pas, sans parler des heures de travail<br />
que ce<strong>la</strong> supposerait. ..). En fait, il<br />
s'inscrit dans le prolongement des articles<br />
déjà publiés sur le thème des<br />
fichiers, poUf, illustrer cette fois une<br />
méthode de gestion de table d'index<br />
par programme assembleur et ]'accê$<br />
"direct" aux disquettes par RwrS.<br />
Le système s'applique à <strong>la</strong> gestion<br />
d'un gros fichier de données (p<strong>la</strong>cé<br />
dans le drive 2) qui se suffit à lui<br />
même (fichier d'adresses pour mai-<br />
6ng, par exemple), ou qui inter-agit<br />
avec d'autres fichiers plus petits<br />
(p0cé$ sur une disquette en drive 1),<br />
gérés quant à eux par le DOS standam.<br />
L'imp<strong>la</strong>ntation en mmolre des routines,<br />
tables et buffers est conçue pour<br />
48K de mmoire centrale (<strong>la</strong> sectorisation<br />
est celle du DOS 3.3).<br />
La table d'index<br />
Rappelons qu'un lment de <strong>la</strong> table<br />
d'index se compose d'une cl, qui<br />
identiBe chaque enregistrement du fi·<br />
chier de données, et de l'adresse de<br />
cet enregistrement sur <strong>la</strong> disquette.<br />
L'adresse est code en deux octets,<br />
mais nous y reviendrons plus en détail<br />
ultérieurement.<br />
La table est gérée par un programme<br />
en assembleur et se prsente sous <strong>la</strong><br />
forme d'un tableau en mmoire centrale,<br />
ou plus exactement d'une succession<br />
de blocs de 256 octets chacun.<br />
Pour simplifier les choses (qui<br />
ne seront donc pas optimales ... ),<br />
l'adresse de début du premier de ces<br />
blocs doit être un multiple de 256.<br />
Soit PO cette adresse en dcimal<br />
(pour le BASIC), elle se compose en<br />
hexadcimal d'un octet haut<br />
(HB=P0/256) et d'un octet bas toujours<br />
égal à O.<br />
Si Le est <strong>la</strong> longueur de <strong>la</strong> cl, non<br />
compris les deux octets de l'adresse-<br />
<strong>Pom's</strong> n° 9<br />
disquette, on peut mettre Ne clés<br />
dans un bloc de 256 octets, avec<br />
NC=INTI256ILC21.<br />
Dans un bloc donn, l'octet bas de<br />
l'adresse du premier caractère de <strong>la</strong><br />
dernIère clé que J'on peut y stocker<br />
est OO=(NC-1)*(LC+2) ; l'octet<br />
haut de cette adresse correspond à<br />
HB pour le premier bloc, HB+ 1<br />
pour le second ...<br />
Dans les deux premiers octets avant<br />
PO, on stocke le nombre d'éléments<br />
qui se trouvent dans <strong>la</strong> table, soit<br />
NZ= PEEKlPO-21.256+ PEEKlPO-ll<br />
L'adresse du premier caractère de <strong>la</strong><br />
dernière clé de <strong>la</strong> table peut se calculer<br />
de <strong>la</strong> façon suivante (HM=octet<br />
haut et LM=octet bas) :<br />
NB=nombre de blocs utilisés pour<br />
stocker les NZ clés=INT{NZlNC)<br />
• Si NZNC*NB :<br />
HM=HB+NB<br />
LM=((NZ -NB.NCI-II'ILC+ 21<br />
• Si NZ=NC*NB :<br />
HM=HB+NB-1<br />
LM=OO<br />
Pour <strong>la</strong> suite, baptisons AMAX=<br />
HM*256+LM cette adresse.<br />
Principe de recherche<br />
dans <strong>la</strong> table<br />
Une fois entre <strong>la</strong> cl recherchée (au<br />
c<strong>la</strong>vier, ou à partir d'un autre fichier),<br />
on <strong>la</strong> stocke dans une zone de travail<br />
commençant en $311. Ensuite, on <strong>la</strong><br />
compare à <strong>la</strong> dernière clé de chacun<br />
des blocs utilisés, jusqu'à ce qu'on<br />
trouve, si possible, celui dans lequel<br />
elle pourrait se situer (le premier<br />
pour lequel elle est inférieure ou<br />
égale à <strong>la</strong> dernière cl stockée). On<br />
explore alors ce bloc à partir de <strong>la</strong><br />
première clé qu'il contient, pour voir<br />
si <strong>la</strong> clé recherchée s'y trouve. Dans<br />
tous les cas, <strong>la</strong> routine mettra en $IF<br />
le résultat de sa recherche (0 si <strong>la</strong> clé<br />
n'existe pas et 1 dans le cas<br />
contraire) et rangera dans $IC et<br />
$10 l'adresse, virtuelle ou réelle, de<br />
<strong>la</strong> c1 recherche dans <strong>la</strong> table.<br />
Cette méthode suppose que les cls<br />
soient c<strong>la</strong>ssées dans l'ordre alphanumérique.<br />
Ainsi, une autre partie de <strong>la</strong><br />
routine assure le déca<strong>la</strong>ge de <strong>la</strong><br />
table, en cas de création d'une nou·<br />
velle dé dont l'adresse virtuelle est<br />
inférieure ou égale à AMAX (en<br />
d'autres tennes, lorsque <strong>la</strong> nouvelle<br />
Gérard Michel<br />
dé ne vient pas en extrême fin de <strong>la</strong><br />
table).<br />
De même, en cas d'annu<strong>la</strong>tion d'une<br />
dé qui ne serait pas <strong>la</strong> dernière de <strong>la</strong><br />
table, une troisième sous· routine as·<br />
sure le déca<strong>la</strong>ge "vers le bas" et<br />
l'krasement de <strong>la</strong> clé concernée.<br />
Remarques pratiques<br />
Le programme BASIC listé ci·après<br />
donne un exemple d'utilisation pour<br />
une table comportant 500 dés de 9<br />
caractères. L'adresse PO est calculée<br />
comme suit:<br />
- NC=INTl256llll=23<br />
- Il faut donc 22 blocs pour contenir<br />
les 500 dés, soit 5632 octets, plus<br />
deux pour stocker NZ, arrondissons à<br />
5640 octets.<br />
- Le dernier buffer de <strong>la</strong> gestion du<br />
fichier (voir plus lOin) commençant à<br />
35207, on a HB=INT({35207-5640)1<br />
256)=115, et PO=115_256=29440.<br />
L'Initialisation de cette table (avant<br />
tout traitement) se fait donc par :<br />
POKE 29438,0,POKE 29439,0,<br />
BSAVE TABLE A2943B,L5640,Dl<br />
(on <strong>la</strong> p<strong>la</strong>ce sur <strong>la</strong> même disquette<br />
que les programmes, en Dl J.<br />
Le chargement de <strong>la</strong> table en mé·<br />
moire à partir des programmes se<br />
fera ensuite par BLOAD.<br />
Le fait de disposer d'une table utilisable<br />
sous fonne d'un tableau gérable<br />
en assembleur présente de nombreux<br />
avantages :<br />
· BLOAD el BSAVE sont beaucoup<br />
plus rapides que <strong>la</strong> lecture ou l'écri·<br />
ture d'un Bchier TEXT dans lequel<br />
seraient stockées les clés.<br />
- En mémoire centrale, vous n'avez<br />
plus à créer un tableau de variables<br />
alphanumériques pour stocker les<br />
clés. Vous économisez ainsi :<br />
• 3 octets par élément de <strong>la</strong> table<br />
(liés au traitement des tableaux<br />
par BASIC)<br />
• les problèmes de "garbage" liés à<br />
<strong>la</strong> gestion d'un grand tableau dont<br />
les valeurs changent souvent, lors<br />
des déca<strong>la</strong>ges de <strong>la</strong> table notammenl<br />
- Si votre programme est interrompu<br />
(par RESET par exemple) vous pou·<br />
vez toujours sauver votre table par<br />
47