{ ========================================================================= }
{ !                   ** FORMATIER-PROGRAMM **                            ! }
{ !                                                                       ! }
{ !  Version 2.3                                                          ! }
{ !  Fuer PROF-180 ,CONITEC-Darmstadt. Von Manfred Oheimer .              ! }
{ !  Letzte Aenderung : 18.02.87                                          ! }
{ ========================================================================= }


function aufhoeren :boolean;
var ein:char;
begin
   read(kbd,ein);
   feldaendern(20,22,50,'Abbrechen ? (J/N) : ');
   read(kbd,ein);ein:=upcase(ein);
   if ein='J' then aufhoeren:=true
              else aufhoeren:=false;
   feldaendern(20,22,50,'');
end;


function verify :boolean;
var
    i,j,base,cnt,endsekt,l :integer;
    k,sp,se    :zeile;
    anzbytps,maxbereich,anzsektmax : integer;
    wrong      :boolean;

procedure vmax7k(wievielsekt:integer);
var bytepersektor,beginofdata,nrbytes,ergebnis:integer;
    dmablock:byte absolute $ff43;
    biospb :bcblock;
BEGIN
   JMPTABLEPOINTER:=addr(READPOINTER);
      bytepersektor:=GET_DECIMAL_SECTORSIZE(AKTFNR);
      cmdtab:=densi;
      track:=cylindernr;
      sektsize:=byps;
      gapll:=gpl;
      dtl:=255;
      dmablock:=$04;
      dmaadr:=ADDR(verifybuffer);
      inline($3e/$ff/$32/dermsg); { Unterdruecke Diskfehler-Meldung }
      { epromon }
      inline($f5/$c5/$d5/$e5/$dd/$e5/$fd/$e5/    { PUSH ALL        }
                                     { CALL READ                   }
             $08/                     { EXAF    anfang bioscall }
             $d9/                     { EXX                     }
             $2a/JMPTABLEPOINTER/     { LD     HL,(JMPTABLEPTR) }
             $22/biospb+6/             { SHLD   BIOSPB+6         }
             $3e/$1e/                 { MVI    A,30             }
             $32/biospb/              { STA    BIOSPB           }
             $3e/$02/                 { MVI    A,2              }
             $32/biospb+2/             { STA    BIOSPB+2         }
             $0e/$32/                 { MVI    C,50             }
             $11/biospb/              { LXI    D,BIOSPB         }
             $cd/$05/$00/             { CALL   BDOS             }
             $d9/                     { EXX                     }
             $08/                     { EXAF   ende bioscall    }
             $32/rwstat/             { CALL READ & rette R/W-Fehler}
             $fd/$e1/$dd/$e1/$e1/$d1/$c1/$f1);    { POP ALL        }
      inline($3e/$00/$32/dermsg); { schalte Diskfehler-Meldung an  }
      { Disk-Read Error ? }
      if rwstat<>$00 then
                begin  noverify:=true;
                       verify:=false;
                       feldaendern(6,14,60,'Fehlerhafter Diskzugriff mit ERROR-CODE :');
                       writeln(rwstat);
                end
       else begin  { Kein Disk-Read Error --> VERIFY }
        base:=0;
        repeat
           cnt:=0;wrong:=false;
           repeat
            if not(mem[ADDR(verifybuffer)+base+cnt]=fillerbyte) then begin
                                               wrong:=true;
                                               verify:=false;
                                               str(headfdc:1,k);
                                               str(cylindernr:3,sp);
{                                               str(i:3,se);              }
                                               feldaendern(30,13,1,k);
                                               feldaendern(45,13,3,sp);
{                                               feldaendern(68,13,3,se);}
                                   feldaendern(6,14,50,'Fehlerhaftes Format');
                                   feldaendern(6,15,50,'Bitte Bestaetigen');
                                               read(kbd,ein);
                                               if ord(upcase(ein))=13
                                                  then noverify:=true
                                                  else
                                                    feldaendern(1,15,50,' ');
                                            end;
            cnt:=cnt+1;
           until ((wrong)or(cnt>bytepersektor));
           base:=base+bytepersektor-1;i:=i+1;
        until ((noverify)or(i>wievielsekt));
     end; { Ende von IF NO DISK-ERROR }
end;  { Ende vmax7k }


begin
   verify:=true;
   maxbereich:=7168;
   anzbytps:=GET_DECIMAL_SECTORSIZE(AKTFNR);
   anzsektmax:=maxbereich div anzbytps;
   if anzsektmax>=spt then
     begin                { ganze Spur passt ins Ram }
        sektor:=erstsnr;
        eot:=erstsnr+spt+1;
        sectcnt:=spt;
        i:=1;
        endsekt:=spt;
        vmax7k(endsekt);
     end  { Ende von Passt ganz ins Ram }

   else   { Spur passt nicht ganz ins Ram }
      begin  l:=1;
        repeat
           if l=1 then
             begin
                sektor:=erstsnr;
                eot:=erstsnr+anzsektmax+1;
                sectcnt:=anzsektmax;
                i:=1;
                endsekt:=anzsektmax;
                vmax7k(endsekt);
             end
          else
             begin
                sektor:=anzsektmax+erstsnr;
                eot:=erstsnr+spt+1;
                sectcnt:=spt-anzsektmax;
                i:=anzsektmax+1;
                endsekt:=spt;
                vmax7k(endsekt);
             end;
          l:=l+1;
        until ((noverify)or(l>2));
     end;


   { Verify einer Spur fertig }

end;

procedure verspur(j:integer);
begin
   if not(noverify) then
      begin
         headfdc:=j;
         if j=1 then begin
             if GET_HEADID(AKTFNR,1)=0 then head:=$02
                                       else head:=$01;
             feldaendern(30,13,1,'1');
             end
           else begin
             if GET_HEADID(AKTFNR,0)=0 then head:=$00
                                       else head:=$03;
             feldaendern(30,13,1,'0');
             end;

    end;
end;




function verifiziere :boolean;
var von,bis,i,j:integer;
    cynr:dreizahl;
    ein:char;
begin
   noverify:=false;
   verifiziere:=true;
   if GET_TRACK_METH(AKTFNR)<>0 then
       begin   { TV <> 0 }
         case GET_SS_DS(AKTFNR) of
          0 : begin von:=0;bis:=0 end;
          1 : begin von:=1;bis:=1 end;
          2 : begin von:=0;bis:=1 end;
         end;
         for i:=0 to (GET_SPURANZ(AKTFNR)-1) do
          if not(noverify) then
            begin
               if keypressed then begin
                                    if aufhoeren then noverify:=true;
                                  end;
               cylindernr:=i; bbfseek(i);
               str(cylindernr:3,cynr);
               feldaendern(45,13,3,cynr);
               for j:=von to bis do begin
                   verspur(j);
                   if not(verify) then verifiziere:=false;
                end;
            end;
        end
      else { TV = 0 }
        begin
           case GET_SS_DS(AKTFNR) of
            0 : begin
                   for i:=0 to (GET_SPURANZ(AKTFNR)-1) do
                      if not(noverify) then
                         begin
                            if keypressed then
                                           begin
                                              if aufhoeren then  noverify:=true;
                                            end;
                            cylindernr:=i; bbfseek(i);
                            str(cylindernr:3,cynr);
                            feldaendern(45,13,3,cynr);
                            spt:=GET_SANZ_1_SEIT(AKTFNR);
                            verspur(0);
                            if not(verify) then verifiziere:=false;
                          end;
                end;  { end-of-TV=0 , SS-Vorderseite }
            1 : begin
                   for i:=0 to (GET_SPURANZ(AKTFNR)-1) do
                      if not(noverify) then
                         begin
                            if keypressed then
                                            begin
                                              if aufhoeren then noverify:=true;
                                            end;
                            cylindernr:=i; bbfseek(i);
                            str(cylindernr:3,cynr);
                            feldaendern(45,13,3,cynr);
                            spt:=GET_SANZ_2_SEIT(AKTFNR);
                            erstsnr:=GET_1_NR_2_SEIT(AKTFNR);
                            verspur(1);
                            if not(verify) then verifiziere:=false;
                          end;
                end;  { end-of-TV=0 , SS-Rueckseite  }
            2 : begin
                   for i:=0 to (GET_SPURANZ(AKTFNR)-1) do
                      if not(noverify) then
                         begin
                            if keypressed then
                                             begin
                                                if aufhoeren then noverify:=true;
                                             end;
                            cylindernr:=i; bbfseek(i);
                            str(cylindernr:3,cynr);
                            feldaendern(45,13,3,cynr);
                            spt:=GET_SANZ_1_SEIT(AKTFNR);
                            erstsnr:=GET_NR_1_SEKT(AKTFNR);
                            for j:=0 to 1 do begin
                                verspur(j);
                                if not(verify) then verifiziere:=false;
                                erstsnr:=GET_1_NR_2_SEIT(AKTFNR);
                                spt:=GET_SANZ_2_SEIT(AKTFNR);
                              end;
                          end;
                end;  { end-of-TV=0 , DS }
           end; { end-of-case }
        end; { end-of-TV=0 }
   recalibrate;
end;





procedure spurform(j:integer);
begin
   headfdc:=j;
   if j=1 then begin
      inline($3a/UNIT/         { LDA  UNIT }
      $0e/$04/                 { MVI  C,04h}
      $b1/                     { ORA  C    }
      $32/UNIT                 { STA  UNIT }
                                             );
      headid:=GET_HEADID(AKTFNR,1);
      feldaendern(30,9,1,'1');
     end
    else begin
      inline($3a/UNIT/         { LDA  UNIT }
      $0e/$0b/                 { MVI  C,0bh}
      $a1/                     { ANA  C    }
      $32/UNIT                 { STA  UNIT }
                                             );
      headid:=GET_HEADID(AKTFNR,0);
      feldaendern(30,9,1,'0');
     end;
   fat;
end;


procedure seitform;
var precab,von,bis,k,i,j:integer;
    wert:byte;
    cynr:dreizahl;
    fertig:boolean;
begin
   fertig:=false;
   recalibrate;
         precab:=GET_WRPRECOMP_SPUR(AKTFNR);
         if not(GET_DENSITY(AKTFNR)) then densi:=0
                                     else densi:=64;
         if GET_TRACK_METH(AKTFNR)<>0 then begin

{ Trackverfahren <> 0 }

            gencomdat;
            case GET_SS_DS(AKTFNR) of
            0 : begin von:=0;bis:=0;end;
            1 : begin von:=1;bis:=1;end;
            2 : begin von:=0;bis:=1;end;
            end;
            for i:=0 to (GET_SPURANZ(AKTFNR)-1) do
               begin
                  if keypressed then fertig:=aufhoeren;
                  if not(fertig) then
                  begin
                     if precab=i then
                        begin
                         wert:=GET_WRPRECOMP(AKTFNR);
                         sendprecomp(wert);
                         write(^G);
                        end;
                     cylindernr:=i;
                     bbfseek(i);
                     str(cylindernr:3,cynr);
                     feldaendern(45,9,3,cynr);
                     spcdnondma;
                     for j:=von to bis do spurform(j);
                  end; { end-of-keypressed }
               end;
            end
         else

{ Trackverfahren=0 }

            begin
               case GET_SS_DS(AKTFNR) of
                0 : begin gencomdat;
                          for i:=0 to (GET_SPURANZ(AKTFNR)-1) do
                             begin
                  if keypressed then fertig:=aufhoeren;
                  if not(fertig) then
                               begin
                               if precab=i then
                                  begin
                                    wert:=GET_WRPRECOMP(AKTFNR);
                                    sendprecomp(wert);
                                    write(^G);
                                  end;
                               cylindernr:=i;
                               bbfseek(i);
                               str(cylindernr:3,cynr);
                               feldaendern(45,9,3,cynr);
                               SET_BIDTABLE(AKTFNR,1);
                               spcdnondma;
                               spurform(0);
                              end; { end-of-keypressed }
                             end;
                    end;
                1 : begin gencomdat;
                          for i:=0 to (GET_SPURANZ(AKTFNR)-1) do
                             begin
                  if keypressed then fertig:=aufhoeren;
                  if not(fertig) then
                               begin
                               if precab=i then
                                  begin
                                    wert:=GET_WRPRECOMP(AKTFNR);
                                    sendprecomp(wert);
                                    write(^G);
                                  end;
                               cylindernr:=i;
                               bbfseek(i);
                               str(cylindernr:3,cynr);
                               feldaendern(45,9,3,cynr);
                               SET_BIDTABLE(AKTFNR,2);
                               spcdnondma;
                               spurform(1);
                              end; { end-of-keypressed }
                             end;
                    end;
                2 : begin
                       gencomdat;
                       for i:=0 to (GET_SPURANZ(AKTFNR)-1) do
                             begin
                  if keypressed then fertig:=aufhoeren;
                  if not(fertig) then
                               begin
                               if precab=i then
                                  begin
                                    wert:=GET_WRPRECOMP(AKTFNR);
                                    sendprecomp(wert);
                                    write(^G);
                                  end;
                               cylindernr:=i;
                               bbfseek(i);
                               str(cylindernr:3,cynr);
                               feldaendern(45,9,3,cynr);
                               spt:=GET_SANZ_1_SEIT(AKTFNR);
                               SET_BIDTABLE(AKTFNR,1);
                               spcdnondma;
                               for j:=0 to 1 do begin
                                   spurform(j);
                                   SET_BIDTABLE(AKTFNR,2);
                                   spt:=GET_SANZ_2_SEIT(AKTFNR);
                                 end;
                                end; { end-of-keypressed }
                           end; { end-of-for }
                    end; { end-of-case : 2 }
               end; { end-of-case }
            end;  { end-of-else. bzw. Trackverf.=0 }
   recalibrate;
end;

begin

    { PUSH CMDTAB,DMAADR,SECTCNT }

   inline($21/cmdtab/               { LXI    H,cmdtab    }
          $11/scmdtab/              { LXI    D,scmdtab   }
          $01/$08/$00/              { LXI    B,0008h     }
          $ed/$b0                   { OUTP   B0,c        });
   ssectcnt:=sectcnt;
   sdmaadr:=dmaadr;
   pointofbioscall:=addr(bioscall);
   clearworkspace;abbruch:=false;ok:=true;verifizieren:=true;
   if ((GET_HEADID(AKTFNR,0)<>0)or(GET_HEADID(AKTFNR,1)<>1))
                                                then headinvers:=true
                                                else headinvers:=false;
   if (headinvers and noheadinv) then begin gotoxy(3,11);
       write('Parameter ID-KOPF1 <>0 oder ID-KOPF2 <>1 geht nur bei Monitor');
       write(' Vers.>1.5');
       end { Ende Monitor Vers.<1.5 und Versuch Headinvers }
       else { Formatiere da alles ok }
          begin
           repeat
             write(^G);
             feldaendern(6,6,60,'Es soll  auf  Laufwerk.-nr   [A..D]  : ');
             feldaendern(47,6,1,' Formatiert werden ??');
             feldaendern(45,6,1,'');
             read(kbd,ein);ein:=upcase(ein);write(ein);
           until ((ord(ein)>64)and(ord(ein)<69));
           feldaendern(6,7,40,'Sicher ?    (J/N)                    : ');
           read(kbd,sein);sein:=upcase(sein);write(sein);
           JMPTABLEPOINTER:=addr(DRIVETRANSPTER);
           if sein='J' then begin
                 { epromon }
                 inline($f5/$c5/$d5/$e5/$dd/$e5/$fd/$e5/    { PUSH ALL     }
                        $3a/ein/$3d/             { LDA  ein/DCR A          }
                        $08/                     { EXAF    anfang bioscall }
                        $d9/                     { EXX                     }
                        $2a/JMPTABLEPOINTER/     { LD     HL,(JMPTABLEPTR) }
                        $22/biospb+6/             { SHLD   BIOSPB+6         }
                        $3e/$1e/                 { MVI    A,30             }
                        $32/biospb/              { STA    BIOSPB           }
                        $3e/$02/                 { MVI    A,2              }
                        $32/biospb+2/             { STA    BIOSPB+2         }
                        $0e/$32/                 { MVI    C,50             }
                        $11/biospb/              { LXI    D,BIOSPB         }
                        $cd/$05/$00/             { CALL   BDOS             }
                        $d9/                     { EXX                     }
                        $08/                     { EXAF   ende bioscall    }
                        $32/unit/             { CALL DRIVETRANS merke phys.LW }
                        $fd/$e1/$dd/$e1/$e1/$d1/$c1/$f1);    { POP ALL        }
                       formondrive:=unit+1;
                       testwriteprot;
                    if not(abbruch) then
                      begin
                       feldaendern(6,9,60,'Es wird auf ');
                  feldaendern(19,9,0,' Kopf-nr :     Spur-nr  :     Formatiert');
                       seitform;
                       feldaendern(6,11,60,'Soll ein Vergleich erfolgen');
                       feldaendern(34,11,0,' ? (J/N) : ');
                       read(kbd,ein);ein:=upcase(ein);write(ein);
                       if ein='J' then verifizieren:=true
                                  else verifizieren:=false;
                       if verifizieren then
                       begin
                       feldaendern(6,13,60,'Vergleich auf Kopf-nr :     Spur-nr  :');
                       ok:=verifiziere;
                       if ok then feldaendern(6,15,50,'Vergleich OK')
                             else begin
                             feldaendern(6,15,50,'Vergleich Fehlerhaft');
                   feldaendern(6,16,50,'Bitte durch Tastendruck bestaetigen');
                                     read(kbd,sein);
                                  end;
                       end;
                    end;
                 end
         end; { Ende Formatieren nach Test der Monitor-version }

      { reset cmdtab,dmaadr,sectcnt }

      inline($21/scmdtab/                { LXI     H,scmdtab   }
             $11/cmdtab/                 { LXI     D,cmdtab    }
             $01/$08/$00/                { LXI     B,0008h     }
             $ed/$b0                     { OUTP    B0,c        });
      dmaadr:=sdmaadr;
      sectcnt:=ssectcnt;
   hbild;
   aktseitanf:=aktseitanf-16;
   clearworkspace;
   neuseit;
   feldaendern(56,2,19,formdat[AKTFNR].fname);
   feldaendern(50,2,3,formdat[AKTFNR].nummer);
   feldaendern(76,2,4,formdat[AKTFNR].lawegu);
   formdefstep(0);
end;



