03.07.2013 Views

Magazine Pom's : la collection

Magazine Pom's : la collection

Magazine Pom's : la collection

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!