| |||
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 : 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 !?. | |||
|
|||
|