Voici le source de la routine d'�criture de la zone de donn�es en DOS 3.3, elle se trouve � l'adresse $B82A. Il s'agit d'�crire :
les marqueurs (markers) $D5 $AA $AD,
puis les 342 nibbles,
puis le checksum,
puis les marqueurs finaux $DE $AA $EB et enfin un dernier $FF (enfin ... pas tout � fait, on le verra plus loin).




Nous avons vu comment le buffer de donn�es (une PAGE de 256 octets) �tait transform� en deux buffers NBUF1 et NBUF2 pour obtenir les 342 valeurs de la forme 00xx.xxxx dans la routine de PRENIBBILIZATION

TRES IMPORTANT : L'�criture de ces 342 valeurs n'est pas une �vidence biblique.

1. Les buffers sont enregistr�s dans un ordre pr�cis : NBUF2 puis NBUF1.
2. Les valeurs prises dans les buffers sont prises dans l'ordre DECROISSANT POUR NBUF2 et CROISSANT pour NBUF1.
3. Ce ne sont pas ces valeurs qui sont translat�es en nibble mais le r�sultat d'une op�ration EOR entre chaque valeur et celle qui la pr�c�de. Dans le cas de la premi�re valeur l'EOR se fait sur elle-m�me.

Le d�tail des op�rations EOR est d�crite dans la rubrique EORING DES VALEURS afin de bien comprendre la r�elle sym�trie entre �criture et lecture.

Le d�tail du fonctionnement des tables est d�crit dans la rubrique TABLES DE TRANSLATION DES NIBBLES.

Plus fort : PRODOS �crit des secteurs absolument identiques � ceux du DOS 3.3 mais avec des routines totalement diff�rentes mais surtout beaucoup plus rapides... voir la rubrique LA METHODE PRODOS






LA ROUTINE D'ECRITURE

WRIT16













WSYNC













WDATA1
L1









WDATA2




















WEXIT




WNIBL9
WNIBL7

WNIBBLE
SEC
STY SLOTABS
LDA $C08D,X
LDA $C08E,X
BMI WEXIT
LDA NBUF2
STA WTEMP
LDA #$FF
STA $C08F,X
ORA $C08C,X
PHA
PLA
NOP
LDA #$04
PHA
PLA
JSR WNIBL7
DEY
BNE WSYNC
LDA #$D5
JSR WNIBL9
LDA #$AA
JSR WNIBL9
LDA #$AD
JSR WNIBL9
TYA
LDY #$56
BNE L1
LDA NBUF2,Y
EOR NBUF2-1,Y
TAX
LDA NIBL,X
LDX SLOTZ
STA $C08D,X
LDA $C08C,X
DEY
BNE WDATA1
LDA WTEMP
NOP
EOR NBUF1,Y
TAX
LDA NIBL,X
LDX SLOTABS
STA $C08D,X
LDA $C08C,X
LDA NBUF1,Y
INY
BNE WDATA2
TAX
LDA NIBL,X
LDX SLOTZ
JSR WNIBBLE
LDA #$DE
JSR WNIBL9
LDA #$AA
JSR WNIBL9
LDA #$EB
JSR WNIBL9
LDA #$FF
JSR WNIBL9
LDA $C08E,X
LDA $C08C,X
RTS


CLC
PHA
PLA
LDA $C08D,X
ORA $C08C,X
RTS


; anticipe une erreur de Write Protect
; sauve le n� de slot l'adresse $678
; TEST WRITE PROTECT

; Erreur la disquette est prot�g�e contre l'�criture
; Charge en A le 1er nibble du buffer auxiliaire NBUF2
; sauvegarde le pour calcul ult�rieur $BC00 EOR $BB00
; la valeur des nibbles de synchronisation sera $FF.
; 5 cycles - Enclenche l'�criture
; 4 cycles - Shift
; 3 cycles juste pour timing
; 4 cycles juste pour timing
; 2 cycles juste pour timing
; 2 cycles - Nombre de nibbles de synchronisation (5)
; 3 cycles juste pour timing
; 4 cycles juste pour timing
; 6 cycles + 7 cycles VOIR NOTE 1 ci -dessous
; 2 cycles
; 3 cycles si on boucle et 2 cycles si on continue
; 2 cycles
; 6 cycles + 9 cycles VOIR NOTE 2 ci-dessous
; VOIR NOTE 2 ci-dessous

; VOIR NOTE 2 ci-dessous

; Y=0 donc A =0
; initialise la borne sup�rieure de l'index pour NBUF2
; 3 cycles : LE BRANCHEMENT SE FAIT TOUJOURS !
; <--- boucle d'�criture de NBUF2 sur le disque
; <-
; <-
; <-
; <-
; <-
; <-
; <-
; <--- boucle d'�criture de NBUF2 sur le disque
; valeur de $BC00 en page 0 (cf. d�but de routine)
; juste pour le timing des 32 cycles
; <--- boucle d'�criture de NBUF1 sur le disque
; <-
; <-
; <-
; <-
; <-
; <-
; <-
; <--- boucle d'�criture de NBUF1 sur le disque
; checksum



; marqueurs finaux $DE AA EB












; 2 cycles juste pour timing et enlever l'erreur
; 3 cycles juste pour timing
; 4 cycles juste pour timing
; 5 cycles Chargement DATA REGISTER
; 4 cycles Shift DATA REGISTER
; 6 cycles
NOTES EXPLICATIVES DETAILLANT LE CODE EN DEROULE
NOTE 1 : ECRITURE DES $FF DE SYNCHRONISATION
Ecriture du premier $FF de synchronisation

Voici le code qui se d�roule pour cette �criture... comptons les cycles











WNIBL7
STA $C08F,X
ORA $C08C,X
PHA
PLA
NOP
LDA #$04
PHA
PLA
JSR WNIBL7


PHA
PLA
; 5 cycles - Enclenche l'�criture
; 4 cycles - Shift
; 3 cycles juste pour timing
; 4 cycles juste pour timing
; 2 cycles juste pour timing
; 2 cycles - Nombre de nibbles de synchronisation (5)
; 3 cycles juste pour timing
; 4 cycles juste pour timing
; 6 cycles


; 3 cycles juste pour timing
; 4 cycles juste pour timing
-- TOTAL 40 CYCLES -------------
ECRITURE DES $FF DE SYNCHRONISATION DANS LA BOUCLE

Voici le code qui se d�roule pour cette �criture... comptons les cycles en repartant de la suite de WNIBL7 (qui correspond en fait WNIBBLE).
WNIBBLE






WSYNC



WNIBL7
LDA $C08D,X
ORA $C08C,X
RTS

DEY
BNE WSYNC

PHA
PLA
JSR WNIBL7

PHA
PLA
; 5 cycles Chargement DATA REGISTER
; 4 cycles Shift DATA REGISTER
; 6 cycles

; 2 cycles
; 3 cycles car on boucle

; 3 cycles juste pour timing
; 4 cycles juste pour timing
; 6 cycles

; 3 cycles juste pour timing
; 4 cycles juste pour timing
-- TOTAL 40 CYCLES -------------
ECRITURE DU DERNIER $FF DE SYNCHRONISATION : IL SORT DE LA BOUCLE

Voici le code qui se d�roule pour cette �criture, il faut bien comprendre qu'encore une fois nous comptons les cycles en repartant de la suite de WNIBL7 (qui correspond en fait WNIBBLE).
WNIBBLE








WNIBL9
LDA $C08D,X
ORA $C08C,X
RTS

DEY
BNE WSYNC
LDA #$D5
JSR WNIBL9

CLC
PHA
PLA
; 5 cycles Chargement DATA REGISTER
; 4 cycles Shift DATA REGISTER
; 6 cycles

; 2 cycles
; 2 cycles car ON NE BOUCLE PAS
; 2 cycles
; 6 cycles

; 2 cycles juste pour timing
; 3 cycles juste pour timing
; 4 cycles juste pour timing
-- TOTAL 36 CYCLES ------------- Sacr� DOS 3.3, toujours pas fichu d'�crire 40 cycles ici... mais ce n'est pas un r�el probl�me car nous sommes synchronis�s avec 4 $FF. Ne perdons pas de vue que nous avons d�cod� le champ adresse et qu'en bonne logique le programme 6502 a admis qu'il fallait lire les donn�es. La synchronisation est donc largement ais�e � obtenir.
Pendant cette routine A est charg� avec $D5 de fa�on � ce que cette valeur soit pr�te � �tre plac�e dans le DATA REGISTER d�s le d�but de routine suivante.
NOTE 2 : ECRITURE DU CHAMP $D5 $AA $AD
ECRITURE DU MARKER $D5

Voici le code qui se d�roule pour cette �criture, il faut bien comprendre qu'encore une fois nous comptons les cycles en repartant de la suite de WNIBL9 (qui est d'ailleurs commun � NIBL7 et correspond en fait WNIBBLE).
WNIBBLE






WNIBL9
LDA $C08D,X
ORA $C08C,X
RTS

LDA #$AA
JSR WNIBL9

CLC
PHA
PLA
; 5 cycles Chargement DATA REGISTER
; 4 cycles Shift DATA REGISTER
; 6 cycles

; 2 cycles
; 6 cycles

; 2 cycles juste pour timing
; 3 cycles juste pour timing
; 4 cycles juste pour timing
-- TOTAL 32 CYCLES -------------
Pendant cette routine A est charg� avec $AA de fa�on � ce que cette valeur soit pr�te � �tre plac�e dans le DATA REGISTER d�s le d�but de routine suivante.
ECRITURE DU MARKER $AA

Voici le code qui se d�roule pour cette �criture, il est absolument identique � celui d�roul� pour $D5.
WNIBBLE






WNIBL9
LDA $C08D,X
ORA $C08C,X
RTS

LDA #$AD
JSR WNIBL9

CLC
PHA
PLA
; 5 cycles Chargement DATA REGISTER
; 4 cycles Shift DATA REGISTER
; 6 cycles

; 2 cycles
; 6 cycles

; 2 cycles juste pour timing
; 3 cycles juste pour timing
; 4 cycles juste pour timing
-- TOTAL 32 CYCLES -------------
Pendant cette routine A est charg� avec $AD de fa�on � ce que cette valeur soit pr�te � �tre plac�e dans le DATA REGISTER d�s le d�but de routine suivante.
ECRITURE DU MARKER $AD

Voici le code qui se d�roule pour cette �criture.
WNIBBLE







L1
LDA $C08D,X
ORA $C08C,X
RTS

TYA
LDY #$56
BNE L1

EOR NBUF2-1,Y
TAX
LDA NIBL,X
LDX SLOTZ
; 5 cycles Chargement DATA REGISTER
; 4 cycles Shift DATA REGISTER
; 6 cycles

; 2 cycles
; 2 cycles
; 3 cycles car le branchement se fait OBLIGATOIREMENT

; 5 cycles : 4 cycles + 1 pour changement de page !!!
; 2 cycles juste pour timing
; 4 cycles
; 3 cycles (c'est un chargement en page 0)
-- TOTAL 36 CYCLES -------------
D�cid�ment ce DOS �crit bizarrement mais c'est correct et en fait la routine est optimale pour la suite.
Pendant cette routine A est charg� avec la premi�re valeur de NBUF2 de fa�on � ce que cette valeur soit pr�te � �tre plac�e dans le DATA REGISTER d�s le d�but de routine suivante.

NOTA TRES IMPORTANT : Remarquez avec attention que c'est ici que d�marre le calcul du checksum et que le premier EOR se fait entre A=0 et la valeur de NBUF2 qui est bien la derni�re car l'index Y=$56 et on prend cette derni�re valeur en se basant sur l'adresse NBUF2-1 ... ce qui au passage ajoute un cycle car on change de page.

Pour plus de d�tails sur les op�rations EOR voir la rubrique LE CALCUL D'EOR et pour l'utilisation des tables de translataion voir la rubrique TABLES DE TRANSLATION
NOTE 3 : ECRITURE DES 342 NIBBLES
Le secteur �crit sur la disquette contient d'abord NBUF2 puis NBUF1.
ECRITURE DE NBUF2
NBUF2 est le petit buffer auxiliaire de $56 octets dans lequel on a plac� les bits 0 et 1 des octets de donn�es du buffer. principal sous la forme 00xx.xxxx. Cette op�ration �tait r�alis�e par la PRENIBBILIZATION






WDATA1


STA $C08D,X
LDA $C08C,X
DEY
BNE WDATA1

LDA NBUF2,Y
EOR NBUF2-1,Y
TAX
LDA NIBL,X
LDX SLOTZ
; 5 cycles Chargement DATA REGISTER
; 4 cycles Shift DATA REGISTER
; 2 cycles Y avait �t� initialis� � $56 limite de NBUF2
; 3 cycles Le branchement se fait toujours pour l'instant

; 4 cycles
; 5 cycles : 4 cycles + 1 pour changement de page !!!
; 2 cycles
; 4 cycles
; 3 cycles (c'est un chargement en page 0)
-- TOTAL 32 CYCLES -------------
NOTA TRES IMPORTANT : Remarquez maintenant que ce qui sert de valeur d'index pour aller chercher le nibble dans la table de translation est le r�sultat d'un EOR entre deux valeurs successives du buffer.

Par ailleurs faites attention ici le code est pr�sent� en d�roul� pour faciliter le comptage des cycles et qu'il boucle plusieurs fois sur lui m�me mais que la sortie se fait effectivement sur le teste BNE qui malheureusement se trouve au beau milieu du d�roul�...
ECRITURE DU DERNIER ELEMENT DE NBUF2
Il s'agit du cas ou Y = 0, le branchement sur WDATA1 ne se fait donc plus.









STA $C08D,X
LDA $C08C,X
DEY
BNE WDATA1
LDA WTEMP
NOP
EOR NBUF1,Y
TAX
LDA NIBL,X
LDX SLOTABS
; 5 cycles Chargement DATA REGISTER
; 4 cycles Shift DATA REGISTER
; 2 cycles Y avait �t� initialis� � $56 limite de NBUF2
; 2 cycles le branchement vient de s'arr�ter
; 3 cycles chargement � partir de la page 0 (valeur de $BC00)
; 2 cycles juste pour le timing
; 4 cycles (m�me page)
; 2 cycles
; 4 cycles
; 4 cycles (adresse $678)
-- TOTAL 32 CYCLES -------------
NOTA TRES IMPORTANT : Admirez la grande astuce qui a consist� � sauvegarder la valeur de $BC00 en page z�ro tout en d�but de routine d'�criture (juste apr�s le test de write protect) et de le reprendre ici pour faciliter le timing.
ECRITURE DE NBUF1
NBUF1 est le buffer auxiliaire de $100 octets dans lequel on a plac� les bits 7 � 2 des octets de donn�es du buffer. principal sous la forme 00xx.xxxx. Cette op�ration �tait r�alis�e par la PRENIBBILIZATION







WDATA2

STA $C08D,X
LDA $C08C,X
LDA NBUF1,Y
INY
BNE WDATA2

EOR NBUF1,Y
TAX
LDA NIBL,X
LDX SLOTABS
; 5 cycles Chargement DATA REGISTER
; 4 cycles Shift DATA REGISTER
; 4 cycles
; 2 cycles (Y ira maintenant jusqu'� $FF puis $00 pour la fin de test)
; 3 cycles car LE BRANCHEMENT SE FAIT

; 4 cycles (m�me page)
; 2 cycles
; 4 cycles
; 4 cycles (adresse $678)
-- TOTAL 32 CYCLES -------------
ECRITURE DU DERNIER ELEMENT DE NBUF1
Il s'agit du cas ou Y = 0, le branchement sur WDATA2 ne se fait donc plus.









STA $C08D,X
LDA $C08C,X
LDA NBUF1,Y
INY
BNE WDATA2
TAX
LDA NIBL,X
LDX SLOTZ
JSR WNIBBLE

; 5 cycles Chargement DATA REGISTER
; 4 cycles Shift DATA REGISTER
; 4 cycles
; 2 cycles
; 2 cycles le branchement vient de s'arr�ter
; 2 cycles
; 4 cycles
; 3 cycles (chargement en page 0)
; 6 cycles
-- TOTAL 32 CYCLES -------------
Pendant cette routine A est charg� avec le checksum.
NOTE 4 : ECRITURE DU CHECKSUM







WNIBL9
STA $C08D,X
ORA $C08C,X
RTS

LDA #$DE
JSR WNIBL9

CLC
PHA
PLA
; 5 cycles Chargement DATA REGISTER
; 4 cycles Shift DATA REGISTER
; 6 cycles

; 2 cycles
; 6 cycles

; 2 cycles
; 3 cycles
; 4 cycles
-- TOTAL 32 CYCLES -------------
Pendant cette routine A est charg� avec le premier close marker : $DE.
NOTE 5 : ECRITURE DES MARQUEURS DE FIN
ECRITURE DE $DE








WNIBL9
STA $C08D,X
ORA $C08C,X
RTS

LDA #$DE
JSR WNIBL9

CLC
PHA
PLA
; 5 cycles Chargement DATA REGISTER
; 4 cycles Shift DATA REGISTER
; 6 cycles

; 2 cycles
; 6 cycles

; 2 cycles
; 3 cycles
; 4 cycles
-- TOTAL 32 CYCLES -------------
Pendant cette routine A est charg� avec le second close marker : $AA.
ECRITURE DE $AA








WNIBL9
STA $C08D,X
ORA $C08C,X
RTS

LDA #$EB
JSR WNIBL9

CLC
PHA
PLA
; 5 cycles Chargement DATA REGISTER
; 4 cycles Shift DATA REGISTER
; 6 cycles

; 2 cycles
; 6 cycles

; 2 cycles
; 3 cycles
; 4 cycles
-- TOTAL 32 CYCLES -------------
Pendant cette routine A est charg� avec le dernier close marker : $EB.
ECRITURE DE $EB








WNIBL9
STA $C08D,X
ORA $C08C,X
RTS

LDA #$EB
JSR WNIBL9

CLC
PHA
PLA
; 5 cycles Chargement DATA REGISTER
; 4 cycles Shift DATA REGISTER
; 6 cycles

; 2 cycles
; 6 cycles

; 2 cycles
; 3 cycles
; 4 cycles
-- TOTAL 32 CYCLES -------------
Pendant cette routine A est charg� avec $FF.
ECRITURE D'UN $FF TERMINAL (enfin presque...)






STA $C08D,X
ORA $C08C,X
RTS

LDA C08E,X
LDA C08C,X
RTS
; 5 cycles Chargement DATA REGISTER
; 4 cycles Shift DATA REGISTER
; 6 cycles

; Arr�t de l'�criture
-- TOTAL 15 CYCLES !!! -------------
L� encore on constate que ce $FF n'est pas �crit en 32 cycles, mais cela n'a aucune importance car il n'est pas test� en relecture. Etonnant ce DOS 3.3 !?.