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