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




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 dmablock:byte absolute $ff43;
    biospb :byte absolute $212f;     { Belegt aber 8 Byte      }
    biospb2:byte absolute $2131;
    biospb6:byte absolute $2135;
BEGIN
   JMPTABLEPOINTER:=addr(READPOINTER);
      cmdtab:=densi;
      track:=cylindernr;
      sektsize:=byps;
      gapll:=gpl;
      dtl:=255;
      dmablock:=$04;
      dmaadr:=8704;
      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/biospb6/             { SHLD   BIOSPB+6         }
             $3e/$1e/                 { MVI    A,30             }
             $32/biospb/              { STA    BIOSPB           }
             $3e/$02/                 { MVI    A,2              }
             $32/biospb2/             { 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(20,12,60,'FEHLERHAFTER DISKZUGRIFF');
                end
       else begin  { Kein Disk-Read Error --> VERIFY }
     base:=0;
     repeat
        cnt:=0;wrong:=false;
        repeat
         if not(mem[8704+base+cnt]=fillerbyte) then begin
      feldaendern(20,13,50,'VERGLEICH FEHLER AUF  KOPF    SPUR      SEKTOR ');
                                               wrong:=true;
                                               verify:=false;
                                               str(headfdc:1,k);
                                               str(cylindernr:3,sp);
                                               str(i:3,se);
                                               feldaendern(47,13,1,k);
                                               feldaendern(56,13,3,sp);
                                               feldaendern(68,13,3,se);
                                   feldaendern(20,14,50,'BESTAETIGEN');
                                               read(kbd,ein);
                                               if ord(upcase(ein))=13
                                                  then noverify:=true
                                                  else
                                                    feldaendern(20,14,50,' ');
                                            end;
         cnt:=cnt+1;
        until ((wrong)or(cnt>byps));
        base:=base+byps-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:=(wandel(formdat[aktformnr].bps));
   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;

function verifiziere :boolean;
var von,bis,i,j:integer;
    cynr:dreizahl;
begin
   noverify:=false;
   verifiziere:=true;
   with formdat[aktformnr] do
      begin
         if formseit='V ' then begin von:=0; bis:=0; end
            else if formseit='R ' then begin von:=1; bis:=1; end
                               else begin von:=0; bis:=1; end;
         for i:=0 to (wandel(spuranz)-1) do
          if not(noverify) then
            begin
               cylindernr:=i; seek(i);
               str(cylindernr:3,cynr);
               feldaendern(29,10,3,cynr);
               for j:=von to bis do
                 if not(noverify) then
                  begin
                     headfdc:=j;
                     if j=1 then begin
                                 if wandel(idkopf2)=0 then head:=$02
                                                      else head:=$01;
                                 feldaendern(46,10,1,'1');
                                 end
                            else begin
                                 if wandel(idkopf1)=0 then head:=$00
                                                      else head:=$03;
                                 feldaendern(46,10,1,'0');
                                 end;
                       if not(verify) then begin
                                        verifiziere:=false;
                                      end;
                    end;
                 end;
    end; { end WITH }
   recalibrate;
end;


procedure seitform;
var found,precab,von,bis,k,i,j:integer;
    wert:byte;
    cynr:dreizahl;
begin
   recalibrate;
   with formdat[aktformnr] do
      begin
         precab:=wandel(wrprab);
         if sddd='SD' then densi:=0
                      else densi:=64;
         if formseit='V ' then begin von:=0;bis:=0;end
            else if formseit='R ' then begin von:=1;bis:=1;end
                               else begin von:=0;bis:=1;end;
         for i:=0 to (wandel(spuranz)-1) do
            begin
               if precab=i then
                     begin
                      for k:=0 to 7 do if wrprcomp=mmwrcmp[mm,k] then found:=k;
                              case found of
                               0  : wert:=0;
                               1  : wert:=1;
                               2  : wert:=2;
                               3  : wert:=3;
                              4,5 : wert:=4;
                              6,7 : wert:=6;
                              end ;
                      sendprecomp(wert);
                      write(^G);
                     end;
               cylindernr:=i;
               seek(i);
               str(cylindernr:3,cynr);
               feldaendern(29,10,3,cynr);
               spcdnondma;
               for j:=von to bis do
                  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:=wandel(idkopf2);
                                 feldaendern(46,10,1,'1');
                                 end
                            else begin
                                 inline($3a/UNIT/         { LDA  UNIT }
                                        $0e/$0b/          { MVI  C,0bh}
                                        $a1/              { ANA  C    }
                                        $32/UNIT          { STA  UNIT }
                                        );
                                 headid:=wandel(idkopf1);
                                 feldaendern(46,10,1,'0');
                                 end;
                     fat;
                  end;
               end;
   end;
   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);
  with formdat[aktformnr] do
  begin
   clearworkspace;abbruch:=false;ok:=true;verifizieren:=true;
   if ((wandel(idkopf1)<>0)or(wandel(idkopf2)<>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(20,8,40,'LAUFWERK.-NR [A..D] : ');
             read(kbd,ein);ein:=upcase(ein);write(ein);
           until ((ord(ein)>64)and(ord(ein)<69));
           feldaendern(20,9,0,'SICHER ? (J\N) :');
           read(kbd,sein);sein:=upcase(sein);write(sein);
           if sein='J' then begin
                       case ein of
                       'A'  : unit:=0;
                       'B'  : unit:=1;
                       'C'  : unit:=2;
                       'D'  : unit:=3;
                       end;
                       formondrive:=unit+1;
                       gencomdat;
                       testwriteprot;
                    if not(abbruch) then
                      begin
                       feldaendern(20,10,50,'SPUR-NR :       KOPF-NR : ');
                       seitform;
                       feldaendern(20,11,50,'VERGLEICH ? (J\N) : ');
                       read(kbd,ein);ein:=upcase(ein);write(ein);
                       if ein='J' then verifizieren:=true
                                  else verifizieren:=false;
                       if verifizieren then
                       begin ok:=verifiziere;
                       if ok then feldaendern(20,13,50,'VERGLEICH OK')
                             else begin
                             feldaendern(20,13,50,'VERGLEICH FEHLERHAFT');
                             feldaendern(20,14,50,'BESTAETIGEN');
                                     read(kbd,sein);
                                  end;
                       end;
                    end;
                 end
         end; { Ende Formatieren nach Test der Monitor-version }
       end; { Ende WITH-Statement }

      { 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(77,2,2,formdat[aktformnr].nummer);
   formdefstep(0);
end;




