|
|
|
|
![](../THEMAS/M3/XDISK5A.PNG) |
La pr�nibbilization est l'op�ration qui consiste � transformer une page de 256 octets de donn�es (de $00 � $FF)
en valeurs de la forme 00xx.xxxx. Sachant que nous avons 256 octets il y a donc 256 * 8 = 2048 bits en tout � classer.
Donc si je dois avoir des octets de la forme 00xx.xxxx, avec mes 2048 bits je devrais avoir 2048/6 = 341 octets pour
les ranger et il me restera 2 bits � placer. En fait il me faudra donc 342 octets (341+1) pour r�aliser la chose.
Techniquement pour ce faire on pr�voit donc deux buffers de destination NBUF1 et NBUF2 qui recevront les valeurs
issues de la transformation.
NBUF1 recevra 6 bits sur 8 (les bits 7 � 2)
NBUF2 recevra 2 bits sur 8 (les bits 1 et 0).
La taille de ces buffers sera donc de 256 pour NBUF1 (une plage de $00 � $FF) et de 342-256 = 86 (une plage de $00 � $55) pour NBUF2.
V�rifions :
NBUF1 pourra stocker 256 * 6 = 1536 bits
NBUF2 pourra stocker 86 * 6 = 516 bits
soit bien un total de 2052 bits
Petit d�tail technique : sur 342 octets dont j'utilise 6 bits cela me fait 2052 bits or nous venons de voir que 2048
seulement sont � placer ! mais en fait pour la programmation c'est PARFAIT.
En DOS 3.3 le buffer NBUF1 est en m�moire de$BB00 � $BBFF et NBUF2 de $BC00 � $BC56
|
Voici le source de la routine de pr�nibbilization qui se trouve
en $B800 pour le DOS 3.3 |
PRENIBB
PRENIBB1
PRENIBB2
|
LDX #$00
LDY #$02
DEY
LDA (BUF),Y
LSR
ROL NBUF2,X
LSR
ROL NBUF2,X
STA NBUF1,Y
INX
CPX #$56
BCC PRENIBB1
LDX #$00
TYA
BNE PRENIBB1
LDX #$55
LDA NBUF2,X
AND #$3F
STA NBUF2,X
DEX
BPL PRENIBB2
RTS
|
; On initialise les index
; Etrange non un Y � 2 ? voir remarque NOTA 1 ci-dessous
; Prend l'octet � transformer
; Passe le bit 0 de l'octet de donn�e en retenue(Carry)
; Passe le de C � NBUF2
; Passe le bit 1 de l'octet de donn�e en retenue(Carry)
; Passe le de C � NBUF2
; Replace l'octet transform� de l'accumulateur en NBUF1
; On fait la boucle de X=0 � X=$55 compris
; R�initialise X
; Voir la remarque en NOTA 1 ci-dessous
; Routine pour forcer les bits 7 et 6 de NBUF2 � 0
; Masque binaire 0011.1111
; Pour faire aussi la valeur 0 de l'index...
|
NOTA 1 : La boucle avec Y initialis� � 2 ! |
Ceci para�t toujours bien �trange mais en examinant attentivement ce qui se passe on comprend mieux le pourquoi.
Nous avons vu que NBUF2 doit avoir la place pour 86 octets (plage de $00 � $55) de la forme 00xx.xxxx or
sachant que ce buffer contient 3 groupe de 2 bits par octets, cela signifie qu'il pourrait recevoir de quoi
coder 86 * 3 = 258 octets.
En initialisant Y � 2 nous ne faisons rien d'autre que de permettre d'avoir une boucle facile � contr�ler
par un classique test sur Y � 0 sans avoir une routine tr�s compliqu�e, et ce en traitant 258 octets
au lieu de 256, car 258 est un parfait multiple de 86 (3*86=258).
Sachant que la routine PRENIBB1 commence par un DEY, Y sera donc � 1 et la valeur prise dans BUF sera celle
de l'octet1, au passage suivant on va traiter l'octet 0 puis l'octet FF etc...
Quand X sera � $56 le programme va d�rouler le test sur Y QUI NE SERA PAS A 0 au premier et
deuxi�me passage (puisqu'il d�cr�mente de $FF vers $00). Par contre au troisi�me passage Y sera � 0 et la
pr�nibbilization sera finie pour cette partie. C'est lors de ce troisi�me passage que les octets n�1 et n�0
du buffer de donn�es sont trait�s (dans cet ordre) une seconde fois. Les bits 0 et 1 se retrouvent � une autre
position dans NBUF2 mais les bits 7 � 2 sont r��crits une seconde fois � la place dans NBUF1.
Notez bien que quand Y sera test� � 0 en bas de routine, le traitement de l'octet index� 0 de NBUF
aura bien d�j� �t� r�alis� !
Le sch�ma ci-dessus montre comment sont remplis les buffers.
Voici par ailleurs une explication plus claire que vous devez � JM Boutillon, dont j'admire la patience et la perspicacit� pour la relecture de ces chapitres ... alors merci qui ?
|
BUF&NBUF1
!
Y
(BUF),$01
(BUF),$00
(BUF),$FF
...
(BUF),$AC
(BUF),$AB
(BUF),$AA
...
(BUF),$56
(BUF),$55
(BUF),$54
...
(BUF),$01
(BUF),$00
|
NBUF2
!
X
$00
$01
$02
...
($55
$00
$01
...
$55
$00
$01
...
$54
$55
|
<== 1ere boucle de 86 octets
<== 2nde boucle de 86 octets
<== 3eme boucle de 86 octets
|
Pour vous convaincre de la r�alit� de cette dispositon, vous pouvez toujours �crire un petit programme qui lance
routine de pr�nibbilization d'un buffer de donn�es que vous aurez pr�alablement initialis� avec vos donn�es.
Ainsi vous allez sous le moniteur (CALL-151) et pouvez par exemple :
Videz la page $1000 � $10FF
* 1000:0
* 1001<1000.1100M
Entrez les donn�es � nibbilizer en $1000
* 1000: FD FE
Tapez en $2000 (c'est un exemple d'adresse) le code du programme de test
* 2000: A9 00 85 3E A9 10 85 3F 20 00 B8 60
ce qui correspond au programme donn� plus bas et que vous lancez par la commande
* 2000G
ensuite vous examinez les valeurs dans les buffers NBUF1 de $BB00 � $BBFF et NBUF2 de $BC00 � BC56
|
|
PROGTEST |
LDA #$00
STA $3E
LDA #$10
STA $3F
JSR $B800
RTS |
; adresse basse du buffer des donn�es
; adresse haute du buffer des donn�es
; active la pr�nibbilization
; revient au moniteur
|
|
|
|