 FORMATAGE DE DISQUETTE

   Ici commencent les choses s{rieuses . On aura avantage @ conserver sous la
 main la section th{orie de SOS1 .

            Rappel de th{orie SOS1 . S{rie d'octets @ transmettre 

                                 PHASE COMMANDE

          Octet commande : &4D Pour multitrack OFF et double densit{ .
                                Octet Drive Head
                              Longueur de secteur
                          Nombre de secteurs par piste
                                GAP de formatage
                              Octet de remplissage

        Les octets de cette phase doivent e^tre rigoureusement coh{rents

    Les octets Commande , Drive-Head ,  remplissage  ont {t{ d{crits dans SOS1
 et il n'y a rien @ ajouter .


 L'OCTET LONGUEUR DE SECTEUR

    Sur CPC  ,  Ce  dernier  peut  varier  de  0  @  5  .  Le  nombre d'octets
 disponibles sur un secteur se calcule comme suit :

 0 :               = 128 octets
 1 :  128*2        = 256 octets
 2 :  128*2*2      = 512 octets
 3 :  128*2*2*2    =1024 octets
 4 :  128*2*2*2*2  =2048 octets
 5 :  128 *2*2*2*2 =4096 octets

    La valeur de cet octet fixe d{finitivement la longueur REELLE  de tous les
 secteurs de la piste MEME SI L'ON  MET  UNE VALEUR DIFFERENTE DANS LE PASSAGE
 DES IDS .

 L'OCTET NOMBRE DE SECTEURS PAR PISTE

    Le nombre d'octets disponibles sur une  piste  {tant invariable , c'est la
 taille des secteurs et la longueur du GAP qui d{finissent ce dernier .

 L'OCTET GAP DE FORMATAGE

    Un GAP (De formatage ou autre)  est  une  suite  d'octet jouant le ro^le de
 'cale' . Le disque tourne  en  effet  en  permanence  lors  des op{rations de
 lecture - {criture . Le  FDC @  parfois  besoin  de  temps pour effectuer des
 calculs internes (IDAM CRC Etc..) et , pendant ce temps il interrompt de lui-
 me^me la commande en cours . Le ro^le  des octets  GAPS est de donner au FDC le
 temps d'effectuer ces  op{rations  sans  pour autant  'manger'  des octets de
 donn{es . Une zone GAP est consid{r{e comme vide  par le FDC . Sur un lecteur
 de disquette usag{ ,un GAP de formatage trop petit peut provoquer des erreurs
 de lecture - {criture . Le FDC  donne  toujours  la valeur &4E comme octet de
 remplissage pour le GAP . Cette valeur  de  &4E  ne  peut e^tre modifi{e . Les
 exemples donn{s fonctionnent en DOUBLE DENSITE .

      En fonction de la taille des secteurs et du GAP on aura au maximum:

      Nombre de secteurs - Taille de secteur - Longueur maximale du GAP -

               32                  0    (128)           &4      4
               19                  1    (256)           &C     12
               10                  2    (512)          &3A     58
                5                  3   (1024)          &D2    210
                2                  4   (2048)          &FF    255
                1                  5   (4096)          &FF    255

                CES VALEURS NE PEUVENT ETRE REVISEES A LA HAUSE

    Il est bien sur possible de diminuer  le nombre de secteurs et d'augmenter
 la longueur du GAP .
    NOTE : Une petite diff{rence de  vitesse  de  rotation entre 2 drives peut
 modifier l{g}rement la longueur des gaps donn{s dans ce tableau .

 PHASE EXECUTION : ID Piste
                   ID  Head
              ID  num{ro secteur
             ID  longueur secteur
 On peut {ventuellement envoyer absolument n'importe quoi !!!

 LES 3 TYPES DE FORMATAGE

                          1 / Le formatage r{gulier .
                2 / Le formatage r{gulier @ secteurs entrelac{s.
                         3 / Le formatage irr{gulier .
 
 1 / FORMAT REGULIER: Ce type de format permet une lecture - {criture ais{e et
 tout @ fait conforme aux instructions courantes du FDC .

      Les IDS Doivent correspondre @ la r{alit{ du formatage , @ savoir :

     ID  PISTE   : Num{ro de la piste en cours de formatage .
     ID  HEAD    : Num{ro de te^te donn{ dans l'octet Drive-Head .
     IDS SECTEUR : Ce dernier  doit  e^tre  r{guli}rement  incr{ment{ de 1 pour
 chaque secteur  format{ .  EXEMPLE  C1,C2,C3,C4,C5,C6,C7,C8,C9  (Lisible  par
 AMSDOS) ou 12,13,14,15,16,17,18,19,20 qui revient au  m{me mais est illisible
 par AMSDOS .
     ID LONGUEUR : Longueur donn{e dans l'octet longueur de secteur .

     Dans ce type de formatage  ,  on  pourra  lire ou  {crire la totalit{ des
 secteurs de la piste en une seule op{ration .

  EXEMPLE : Initialiser sur secteur C1
          !--> Lire secteur
          !    Incr{menter secteur de 1
          !----Continuer tant qu'il y-@ des secteurs a lire .

     Ce type de format pr{sente un  inconv{nient  de  taille  !  Le FDC lit le
 secteur C1 puis on lui demande de lire  le  C2  , h{las , pendant ce temps le
 disque a tourn{ et le secteur  C2 est  d{pass{  . Il faudra donc attendre une
 r{volution compl}te pour lire C2 et  ainsi  de  suite  ... Soit 1 rotation du
 disque par secteur @ lire . La m{thode 2 r{sout cet inconv{nient .
;
;2 / FORMAT REGULIER ET ENTRELACE :
;
     Dans ce type les IDS secteurs sont envoy{s dans l'ordre suivant :

                           C1,C6,C2,C7,C3,C8,C4,C9,C5

     Dans ce cas , la boucle  d{crite  pr{c{dement lira C1,C2,C3,C4,C5 sur une
 me^me r{volution de disquette car les secteurs C6,C7,C8,C9 '{pongent' le temps
 d'{x{cution du programme et permettent (si  la  boucle est assez rapide) , de
 lire le secteur C2 avant qu'il ne soit d{pass{  . Au second tour de disque ce
 sont C1,C2,C3,C4,C5 qui  servent  de cale  et  C6,C7,C8,C9  qui  sont lus (ou
 {crits) . Soit 2 tours de disque au lieu de 9
 
     NOTE : Le programme FDC orient{ vers  des formatages particuliers , il ne
 pr{voit pas l'entrelacement des secteurs .
;
 3 / FORMAT IRREGULIER :
;
     Ce type de  format  est  destin{  @  rendre  fou  furieux  toute personne
 cherchant @ comprendre ce que  vous  avez  bien  pu  faire  @  cette %$!!" de
 disquette ! Bien que l'ensemble des utilitaires de copie recopient @ peu pr}s
 n'importe quoi , il reste 2 exceptions .
 
     Les pistes  {crites  avec l'instruction  'Ecrire  piste  d'un  FDC'  plus
 puissant que celui du CPC . Ceci sort du cadre de SOS PROGRAMMEURS .
     Un certain type de formatage rendu  possible  par la version du programme
 FDC sur cette disquette  qui plante  tout  y-compris lui-me^me ! (Explications
 plus loin) ...
     Et peut-e^tre d'autres types de  formatage  que  vous d{couvrirez par vous
 me^me en utilisant ce programme .
;
     Exemple de formatage irr{guliers :
;
     Param}tres format : Taille REELLE secteur 2 sur piste 1 Tete 0;
     IDS : PISTE - HEAD - NUMERO TAILLE
            12      1      #EF     3
            12      0      #D0     8
            12     45       00     1
            12      0      #34     2   Etc ...
    De quoi activer un maximum de flags d'erreurs du FDC ...
 
    Et comment liriez vous les donn{es  d'une  piste @ 9 secteurs portant tous
 le me^me num{ro ?
    Exemple : C1,C1,C1,C1,C1,C1,C1,C1,C1 
    Ne vous torturez pas les m{ninges , toutes les r{ponses suivent . Etudions
 pluto^t les routines de formatage .

; - ROUTINE DE FORMATAGE REGULIER -

 FORMREG CALL MENUFOR    ;Initialisation des donn{es format
         LD HL,QUATRID   ;Adresse du 1er des 4IDS @ transmettre
         LD A,(PISTSEL)  ;On ne triche pas ici ! La piste @ mettre dans L'ID
         LD (HL),A       ;doit e^tre la piste en cours de formatage
         INC HL          ;Pointer ID suivant
         LD A,(HEAD)     ;Y mettre num{ro de te^te (0 ou 1)
         RRC A           ;Et amener comme BIT 2
         RRC A
         LD (HL),A       ;Ranger Head comme 2}me ID
         INC HL
         LD A,(PREMSEC)  ;1er secteur donn{ par MENUFOR
         LD (HL),A       ;Comme 3}me ID
         INC HL
         LD A,(LENSEC)   ;Et taille secteur donn{e par MENUFOR comme 4}me
         LD (HL),A
         CALL TSTNBSE    ;V{rifier que nombre de secteurs >0 et <33
         JR NC,FORMREG   ;Si nombre de secteurs = 0 ou >33 recommencer
;
         LD B,A          ;Nombre secteur dans B
         LD C,0          ;C sert de compteur de lignes pour l'affichage
         CALL FENIDE     ;Ouvrir 1}re fene^tre ID
         CALL INV        ;Passer en vid{o inverse
         LD IX,IDOUTDA   ;INCPTID laisse IX pointer sur zone IDOUTA si drive
         CALL INCPTID    ;A selectionn{ ou mettra sur IDOUTB si B s{lectionn{
         PUSH BC         ;et met HL=IX (PUSH IX - POP HL)
;
 BCLFIDS PUSH BC
         LD DE,QUATRID   ;Pointer 1er IDS @ transmettre
         LD B,4          ;4 @ afficher
         CALL SPACE      ;Afficher espace
;
 BCLF1   LD A,(DE)       ;Afficher les 4 IDS dans la fene^tre
         LD (HL),A       ;Tout en les rangeant dans la zone IDOUT(A ou B)
         CALL PRTHEX1
         INC DE
         INC HL
         DJNZ BCLF1
;
         LD IY,QUATRID+2 ;ID Num{ro de secteur en cours
         INC (IY+0)      ;+1 = num{ro de secteur suivant 
         POP BC          ;Nombre de secteur dans B
;
         INC C           ;1 Ligne de plus
         LD A,C
         CP 16           ;Si 16 lignes sortie la fene^tre en cours est pleine
         CALL  Z,FENIDE1 ;Ouvrir la seconde pour poursuivre l'affichage
         DJNZ BCLFIDS    ;Recommencer autant de fois que NBSEC
;
         CALL INV        ;Restaurer vid{o normale
         CALL FEN1       ;Ouvrir fene^tre pour affichage normal
         LD HL,#1417     ;Initialiser position affichage r{sultat
         LD (POSCUR),HL
;
         LD A,(IX+0)     ;Num{ro de la 1}re piste @ formater dans A
         POP BC          ;NBSEC
         JP BCLFORM      ;Aller formater
;
;- ROUTINE DE FORMATAGE IRREGULIER -
;
 FORMIRR CALL MENUFOR    ;Initialiser les param}tres
         CALL FENIDE     ;Ouvrir fene^tre affichage IDS
         LD IX,IDOUTDA
         CALL INCPTID    ;Pointer s{rie ID selon drive
;
         PUSH HL         ;HL=IX
         LD B,32         ;Maxi 32 secteurs
         LD A,(PISTSEL)
         LD C,A          ;Pr{server la 1}re piste @ formater dans C
         LD A,(HEAD)
         RRC A
         RRC A
         LD E,A          ;Et la te^te dans E
;
 BCLINID LD (HL),C    ;Conformer ID piste
         INC HL
         LD (HL),E    ;Et tete
         INC HL
         INC HL
         INC HL
         DJNZ BCLINID ;Sur 32 secteurs maximum
;
         POP HL      ;HL=IDOUT (A ou B)
         PUSH HL
;
         LD DE,4     ;Pour 4 IDS
         LD A,(NBSEC)
         LD B,A      ;Nombre de secteurs donn{s dans MENUFOR
 FIXFF   ADD HL,DE   ;Avancer le pointeur de 4 * NBSEC
         DJNZ FIXFF
;
         LD B,4
 FIXFF1  LD (HL),#FF ;Pour Mettre la marque de fin de s{rie IDS
         INC HL
         DJNZ FIXFF1
;
;Ici la s{rie d'IDS est initialis{e comme suit :
;- IDS PISTE = 1}re piste @ formater
;- IDS HEAD  = Te^te s{lectionn{e pour le formatage
;- IDS Num{ro de secteurs = Ceux donn{s lors d'un pr{c{dent formatage ou
;analyse . A z{ro si initialisation .
;- IDS Longueur secteurs = Comme num{ros de secteurs
;
         POP HL      ;HL=IX=IDOUT (A ou B)
;
 CHGFEN2 XOR A         ;Edition - Modification de la s{rie d'IDS
;
 CHGFEN1 LD (FLAG),A    ;FLAG Changement de fene^tre @ 0
         LD (ADDEPID),HL;M{morisation pointeur d'{dition
         CALL INV       ;Passer en vid{o inverse
         LD B,16        ;16 lignes maxi , au del@ on change de fene^tre
         LD C,0         ;C=Compteur lignes pour changer de fene^tre
;
 BCL1    PUSH BC
         CALL SPACE
;
         LD B,4     ;Afficher la 1}re s{rie de 16 IDS @ {diter
 BCL2    LD A,(HL)
         CALL PRTHEX1
         INC HL
         DJNZ BCL2
;
         POP BC
         DJNZ BCL1
;
         CALL INV   ;Restaurer vid{o normale
         XOR A
;
 TROPBAS LD DE,(ADDEPID);Pointeur dans DE
         LD B,16        ;16 Lignes maxi
         LD C,4         ;4 IDS
         LD HL,#0202    ;Locate X,Y 1er ID @ {diter
;
 TSTFIRR LD (POSCUR),HL ;M{moriser position en cours
         CALL AFLOCDE   ;Positionner et afficher valeur hexa de DE
;
         CALL #BB06     ;Attendre touche
;
         PUSH AF        ;Pr{server code touche
         CALL AFLOCDEI  ;Pos. et afficher EN INVERSE valeur hexa de DE
         POP AF
;
         CP 13
         JP Z,FINFIRR   ;ENTER = Fin {dition , aller formater
         CP #F1
         JR Z,DECCUR    ;Reculer d'un ID 
         CP #F0
         JR Z,INCCUR    ;Avancer d'un ID
;
         CALL INCNUM1   ;INC - DEC octet point{ de 1 ou 10 selon touche
;
         CP #E0         ;Si COPY on change de groupe de 16 IDS
         JR NZ,TSTFIRR  ;Sinon retester
;
 CHGFEN  LD A,(FLAG)    ;0 = s{rie de 1 @ 16 , 1 = s{rie de 17 @ 32
         OR A
         JR NZ,FENID2
;
         CALL FENIDE1   ;Ouvrir fene^tre 2
         PUSH IX        ;R{initialiser pointeur en d{but de s{rie
         POP DE
         LD HL,64
         ADD HL,DE      ;Et pointer 1er octet seconde s{rie (4*16=64)
         LD A,1
         JR CHGFEN1     ;FLAG mis , recommencer
;
 FENID2  CALL FENIDE    ;Ouvrir fene^tre 1
         PUSH IX        ;Remettre pointeur ID au d{but
         POP HL
         JR CHGFEN2     ;Recommencer
;       
 DECCUR  DEC C          ;Avancer d'un ID
         JR Z,TSTBDO    ;Si fin de ligne tester
;
         LD HL,(POSCUR)
         INC H          ;Espace
         INC H          ;+ 2 caract}res pour code Hexa
         INC H
 EXIBAS  INC DE         ;Pointer ID suivant
         JR TSTFIRR     ;Fini
;
 TSTBDO  LD C,4         ;Retour d{but de ligne
         DEC B          ;On sort en bas de la fene^tre ?
         JR Z,TROPBAS   ;OUI ! On recommence en haut @ gauche
         LD HL,(POSCUR) ;NON
         LD H,2         ;D{but de ligne
         INC L          ;Descendre d'une ligne
         JR EXIBAS
;
 INCCUR  INC C          ;Reculer d'un ID
         LD A,C
         CP 5           ;Changement de ligne ?
         JR Z,TSTB16    ;OUI tester sortie de fene^tre
;
         LD HL,(POSCUR)
         DEC H
         DEC H
         DEC H
 EXIHAU  DEC DE
 TSTFIR1 JR TSTFIRR
;
 TSTB16  LD C,1
         INC B
         LD A,B
         CP 17         ;On sort en haut ?
         JR Z,TROPHAU  ;OUI ! Recaler
;
         LD HL,(POSCUR);NON
         LD H,#B       ;X le plus @ droite
         DEC L         ;Monter d'une ligne
         JR EXIHAU
;
 TROPHAU LD HL,63  ;Recaler pointeur ID
         ADD HL,DE
         EX DE,HL
         LD HL,#B11;Position coin bas droit
         LD B,1    ;RAZ compte ligne
         JR TSTFIR1
;
 FINFIRR PUSH IX   ;Fin d'{dition 
         POP HL    ;D{but zone IDOUT dans HL
;
         LD B,0    ;B est incr{ment{ de 1 tant que la marque de fin de
 COUNTIR LD A,#FF  ;s{rie d'IDS (#FF) n'est pas trouv{e . On obtient
         INC HL    ;Ainsi le nombre de secteurs @ formater 
         INC HL
         INC HL
         CP (HL)
         JR Z,NOCOUNT
         INC B
         INC HL
         JR COUNTIR
;
 NOCOUNT LD A,B      ;Nombre de secteurs dans A
         OR A
         JP Z,FORMIRR;0 Secteur d{fendu !
;
         LD (NBSEC),A;Ranger nombre de secteurs
         CALL FEN1   ;Restaurer fene^tre principale
         LD A,(IX+0) ;ID PISTE
;

; - ROUTINE DE FORMATAGE PROPREMENT DITE -

     Les routines FORMREG et FORMIRR  n'ont  pour  ro^le que d'initialiser de 2
 mani}res diff{rentes les donn{es @  transmettre  au FDC . BCLFORM effectue le
 formatage proprement dit .

     L'algorythme g{n{ral est le suivant :
     1 - Se placer sur la piste @ formater
     2 - Envoyer l'octet de commande suivi de ses 5 param}tres
     3 - Ecrire autant de fois 4 IDS qu'il y-a de secteurs d{clar{s
     4 - Recommencer avec une autre piste s'il y-@ lieu
     5 - Revenir sur la 1}re piste  format{e  et  lire  les IDS pour voir si le
 formatage a r{ussi .

     On notera que la boucle BCLCHID rend  identique  tous  les IDS de piste ,
 ceci interdit @ FORMIRR la possibilit{ d'avoir des IDS piste tous diff{rents.
 (Cela serait possible avec une autre structure de programme mais ne servirait
 pas @ grand chose) .
;
 BCLFORM PUSH IX
         POP HL   ;IDS dans HL
         PUSH HL
 BCLCHID LD (HL),A;Tous IDS piste identiques
         INC HL
         INC HL
         INC HL
         INC HL
         DJNZ BCLCHID
         POP HL
;
         PUSH BC
         CALL GOPIST1 ;Se placer sur PISTSEL
         POP BC       ;NBSEC
         JR NC,ERPFORM;Pas pu trouver la piste , annulation .
;
         CALL FORMATE ;Routine de formatage (Dans section ROUTINES FDC)
;
         PUSH AF
         CALL AFFRES1 ;Afficher octets r{sultat
         POP AF
         JR NC,ERRFORM;Pas pu formater (En principe impossible)
;
 PASERR  CALL INCPIST ;Piste suivante si possible
         JR NZ,BCLFORM;NZ = Possible
;
 FINFORM LD A,41       ;Restaurer valeur de temporisation modifi{e
         LD (WAITPIS),A;par INCPIST
         LD A,(PREMPIS);Revenir sur la premi}re piste format{e
         LD (PISTSEL),A
         CALL GOPIST1
         JR NC,ERPFORM ;Pas pu trouver piste (Ne devrait jamais arriver)
         CALL VERIID   ;Lire les IDS afin de tester la r{ussite du formatage
;
 FINLIID CALL FEN1     ;Restaurer fene^tre principale
 RECAL   CALL CALIBRE  ;Retour en piste 0
         JR NC,RECAL
         XOR A
         LD (PISTSEL),A;PISTSEL = 0
         CALL INCPTPIS ;Pointer - Ranger - Afficher Piste drive select.
;
 DRPARA  LD HL,DPA     ;Initialiser DPA (Sera utilis{ dans le num{ro 3)
         LD BC,5
         LD A,(DRSELEC)
         OR A
         JR Z,DRIVA
         ADD HL,BC
 DRIVA   EX DE,HL
         LD HL,LENSEC
         LDIR
         SCF
         RET
;
 ERPFORM LD BC,TMISS ;Erreurs format
         JR PRTERR
;
 ERRFORM LD BC,TPROT
         LD A,(ET1)
         BIT 1,A
         JR Z,PASERR
;
 PRTERR  LD HL,TRATE
         CALL PRTLOC2
         PUSH BC
         POP HL
         CALL PRT
         LD A,41
         LD (WAITPIS),A
         LD B,4
         LD HL,QUATRID
         CALL RAZHLFF
         XOR A
         RET
;
 TSTNBSE LD A,(NBSEC);Tester nombre secteurs
         OR A
         SCF
         RET Z
         CP 33
         RET
;
 INCPIST PUSH HL
         LD A,(WAITMUL);Modif.Temp.
         LD (WAITPIS),A
         LD HL,DERPIST
         LD A,(PISTSEL)
         CP (HL)     ;P.Max.
         JR Z,PASINC
 OKPIST  INC A
         LD (PISTSEL),A
         CALL INCPTPIS
 PASINC  POP HL
         RET
;       
 TFORM1  DEFB 31,15,24," Formatage"," "+#80
 TRATE   DEFB 24,"  ERREUR  : ",7,24+#80
;
;- CPM DATA -
;
 FCPM    LD A,#41
         JR INIFORM
 FDAT    LD A,#C1
 INIFORM LD (PREMSEC),A
         LD HL,#0902
         LD DE,#E552
         LD (LENSEC),HL
         LD (GAPFORM),DE
         LD A,9  
         LD (NBSEC),A
;
;- Menu for. -
;
 MENUFOR LD HL,TFORM1 ;Aff.Commande
         CALL PRT
         CALL FENFORM ;Fenetre menu format
         LD HL,TINPIST
         CALL PRT
         LD HL,TFORMAT
         CALL PRT
         CALL FENIN   ;Fenetre valeurs
 REMODI  LD DE,PISTSEL
         LD B,7
         CALL MODIVAL
         CP 3
         JR Z,FCPM
         CP 4
         JR Z,FDAT
         CP 13
         JR NZ,REMODI
         CALL FEN2   ;Eff.Menu
;
;- Verif.Valid pist. -
;
 VERIPIS LD A,(PISTMAX)
         LD B,A
         LD A,(DERPIST)
         CP B          ;Fin > Maxi ?
         JP NC,BADPIST
         LD B,A
         LD A,(PISTSEL)
         LD (PREMPIS),A
         INC B
         CP B          ;Deb.>Fin ?
         JP C,FEN1
 BADPIST POP IY        ;-1 Adr.Ret.Menu
 OKVERIF JP FEN1
;
 SELEPIS CALL PRT
 SELEPI1 CALL FENPIS
         LD HL,TINPIST
         CALL PRT
         CALL FENIN2
 REMODI1 LD DE,PISTSEL
         LD B,2
         CALL MODIVAL
         CP 13
         JR NZ,REMODI1
         CALL FEN2     ;Eff.Menu
         JR VERIPIS    ;Menu si erreur
;
 INCPTID LD A,(DRSELEC)
         OR A
         JR Z,NONINID
         PUSH BC
         LD BC,240    
         ADD IX,BC     ;Pointer IDS Drive B
         POP BC
 NONINID PUSH IX
         POP HL
         RET
;
 RAZIDS  LD B,255
 RAZHLFF PUSH HL
 BCLRAZ  LD (HL),#FF
         INC HL
         DJNZ BCLRAZ
         POP HL
         RET
;
 MODIVAL CALL TROISNB
         PUSH DE    ;Afficher valeurs a modifier
         PUSH BC
 BCLINF1 LD A,(DE)
         CALL DEUCONI
         INC DE
         DJNZ BCLINF1
         POP BC
         POP DE
         LD HL,#0101
         LD (POSCUR),HL;Position 1-1
 TSTVAL  CALL PRLOCDE  ;Afficher (DE) normal
         CALL #BB18
         PUSH AF
         CALL PRLOCDEI ;Afficher (DE) inverse
         POP AF
         CALL INCNUMS
         CP 32         ;Code controle=fini
         JR NC,TSTVAL
         PUSH AF
         CALL CINQNB
         POP AF
         RET
;
;- Choix et modif. D'une valeur -
;
 INCNUMS CP #F0
         JR Z,NBUP
         CP #F1
         JR Z,NBDOWN
;
 INCNUM1 CP 242
         JR Z,DECNB
         CP 246
         JR Z,DECNB1
         CP 243
         JR Z,INCNB
         CP 247
         JR Z,INCNB1
         RET
;
 DECNB   LD A,(DE);-1
         DEC A
 LOADDE  LD (DE),A
         LD A,#FF ;Pas revenir avec <32
         RET
 DECNB1  LD A,(DE);-10
         SUB 10
         JR LOADDE
 INCNB   LD A,(DE);+1
         INC A
         JR LOADDE
 INCNB1  LD A,(DE);+10
         ADD A,10
         JR LOADDE
;
 NBUP    LD A,(POSCUR)
         DEC A
         JR Z,ENBAS   ;Ligne<1
 DECDE   DEC DE
 NBFIN   LD (POSCUR),A
         LD A,#FF ;Pas revenir avec <32
         RET
;
 NBDOWN  LD A,(POSCUR)
         CP B
         JR Z,ENHAUT  ;Ligne>Nb.Paras
 INCDE   INC DE
         INC A
         JR NBFIN
;
 ENBAS   LD A,B       ;Nb.Paras
         LD (POSCUR),A;=Ligne bas
         EX DE,HL
         LD D,0
         LD E,A
         ADD HL,DE ;Pointer le dernier
         DEC HL
 FINEXTR EX DE,HL
         LD A,#FF  ;Pas revenir avec<32
         RET
;
 ENHAUT  LD A,1
         LD (POSCUR),A
         LD A,B    ;Nombre d'octets
         EX DE,HL
         LD D,0
         LD E,A
         AND A
         SBC HL,DE ;Repointer le 1er
         INC HL   
         JR FINEXTR
;
 COMPCO1 LD A,(COMMAN2);**
         LD B,A
 COMPCOM LD A,(FLAGDEN)
         LD C,A
         LD A,B        ;B=Octet commande
         AND C
         LD C,A        ;+Densite
         LD A,(FLAGMT)
         OR C          ;+Multitrack
         LD (COMMAND),A
         RET
;
         FIN DE SECTION : SUITE LOGIQUE : SELECTION " SUB.ROUT.FORMAT "
