home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* FORM720.PAS *)
- (* formatiert in AT-Laufwerken in AT-kompatiblen *)
- (* Rechnern normale Disketten auf 720 KByte *)
- (* (C) 1989 Jochen Loewer & toolbox *)
- (* ------------------------------------------------------ *)
-
- PROGRAM Form720;
-
- {$M 10000,0,0} (* Begrenzung,da DOS.Exec verwendet wird *)
-
-
- USES DOS,CRT;
-
- TYPE Str100 = String[100];
- Str80 = String[80];
-
- VAR
- prog : Str80;
- Int13Save : POINTER;
- Bootflag : BOOLEAN;
- SecBuf : ARRAY [0..511] OF BYTE;
- drivenr : INTEGER;
- rwerror : INTEGER;
-
-
- { NextPath kopiert in single nächste durch ';' separierte }
- { Pfadangabe aus list beginnend ab Position pos }
-
- FUNCTION NextPath (VAR list :Str100;
- VAR pos :INTEGER;
- VAR single:Str80 ) : BOOLEAN;
- VAR len : INTEGER;
- stay : BOOLEAN;
- BEGIN
- single := '';
- len := Length(list);
- IF pos >= len THEN
- NextPath := FALSE
- ELSE BEGIN
- stay := TRUE;
- WHILE (pos < len) AND stay DO BEGIN
- inc(pos);
- IF list[pos] <> ';' THEN
- single := single+list[pos]
- ELSE stay := FALSE;
- END;
- NextPath := TRUE;
- END;
- END;
-
- { IfThere testet, ob FILE name in dem Verzeichnis path }
- { vorhanden ist. }
-
- FUNCTION IfThere (VAR path : Str80; name : Str80): BOOLEAN;
- VAR f : FILE;
- BEGIN
- IF path = '' THEN
- path := name
- ELSE path := path + '\' + name;
- assign(f,path);
- {$I-}
- Reset(f);
- {$I+}
- IF IOResult = 0 THEN BEGIN
- Close(f);
- IfThere := TRUE;
- END
- ELSE IfThere := FALSE;
- END;
-
- { LookUp sucht das FILE name im aktuellen Verzeichnis und }
- { und in den Verzeichnissen, die in der DOS-Variablen PATH }
- { angegeben sind. outpath enthält bei Erfolg zusammen- }
- { gesetzt den Pfad und den Filenamen }
-
- FUNCTION LookUp (VAR outpath : Str80; name : Str80):BOOLEAN;
- VAR pathlinks : Str100;
- pathscan : INTEGER;
- BEGIN
- outpath := '';
- IF IfThere(outpath,name) THEN
- LookUp := TRUE
- ELSE BEGIN
- pathlinks := GetEnv('PATH');
- pathscan := 0;
- WHILE NextPath(pathlinks,pathscan,outpath) DO
- IF IfThere(outpath,name) THEN BEGIN
- LookUp := TRUE;
- EXIT;
- END;
- LookUp := FALSE;
- END;
- END;
-
- { GetAllDisks gibt Anzahl der installierten logischen }
- { Laufwerke zurück. }
-
- FUNCTION GetAllDisks : INTEGER;
- VAR drive : INTEGER;
- r : Registers;
- BEGIN
- r.ax := $1900;
- MSDOS(r);
- drive := r.al;
- r.ax := $0E00;
- r.dl := drive;
- MSDOS(r);
- GetAllDisks := r.al;
- END;
-
- { NewInt13 wird vor normale INT 13-Biosroutine gesetzt }
- { immer die richtige Datenübertragungsrate von 300 Bits }
- { pro Sekunde bei 360 u/min (AT-Laufwerk) }
-
- {$F+,S-,R-}
- PROCEDURE NewInt13(f,cs,ip,ax,bx,cx,dx,si,di,ds,es,bp:WORD);
- INTERRUPT;
- BEGIN
- mem[$0040:$0090] := $54; (* 300 bits/sec 360 u/min *)
- mem[$0040:$0091] := $54;
- port[$0070] := $10;
- port[$0071] := $44;
- INLINE($a1/int13save+2/$87/$46/$10/$8b/$1e/int13save/
- $87/$5e/$0e/$5d/$07/$1f/$5f/$5e/$5a/$59/$cb );
- END;
- {$F-}
-
- { CheckBoot überprüft ob originaler Bootsektorheader von }
- { von DOS 3.2/3.3 vorliegt oder ob schon ein Bootpatch }
- { durchgeführt wurde. }
-
- FUNCTION CheckBoot : BOOLEAN;
- BEGIN
- (*** Absolute Disk Read Bootsector ***)
- INLINE( $50/$53/$51/$52/$06/$1e/$55/$57/$56/$a0/drivenr/
- $b9/$01/$00/$ba/$00/$00/$bb/SecBuf/$cd/$25/
- $83/$c4/$02/$b8/rwerror/$5e/$5f/$5d/$1f/$07/$5a/
- $59/$5b/$58);
- IF (SecBuf[$00]=$EB) AND
- (SecBuf[$01]=$34) AND
- (SecBuf[$02]=$90) AND
- (SecBuf[$4A]=$BF) AND
- (SecBuf[$4B]=$2B) AND
- (SecBuf[$60]=$06) AND
- (SecBuf[$61]=$1F) AND
- (SecBuf[$1FE]=$55) AND
- (SecBuf[$1FF]=$AA) THEN
- CheckBoot := TRUE
- ELSE CheckBoot := FALSE;
- IF (SecBuf[$00]=$EB) AND
- (SecBuf[$01]=$34) AND
- (SecBuf[$02]=$90) AND
- (SecBuf[$4A]=$50) AND
- (SecBuf[$4B]=$1e) AND
- (SecBuf[$60]=$06) AND
- (SecBuf[$61]=$1F) AND
- (SecBuf[$58]=$eb) AND
- (SecBuf[$59]=$06) AND
- (SecBuf[$1FE]=$55) AND
- (SecBuf[$1FF]=$AA) THEN
- writeln(chr(186),
- '============== DISKETTE schon gepatcht ===============',
- chr(186));
- END;
-
-
- { DoPatch fügt den Patch-Assemblercode an die Anfangs- }
- { routine im Bootsektor }
-
- PROCEDURE DoPatch;
- VAR r : REGISTERS;
- BEGIN
- SecBuf[$2B]:=$DF; SecBuf[$2C]:=$02; SecBuf[$2D]:=$25;
- SecBuf[$2E]:=$02; SecBuf[$2F]:=$12; SecBuf[$30]:=$2A;
- SecBuf[$31]:=$FF; SecBuf[$32]:=$50; SecBuf[$33]:=$f6;
- SecBuf[$34]:=$01; SecBuf[$35]:=$04;
- SecBuf[$4A]:=$50; SecBuf[$4B]:=$1E; SecBuf[$4C]:=$B8;
- SecBuf[$4D]:=$40; SecBuf[$4E]:=$00; SecBuf[$4F]:=$8E;
- SecBuf[$50]:=$D8; SecBuf[$51]:=$B0; SecBuf[$52]:=$54;
- SecBuf[$53]:=$A2; SecBuf[$54]:=$90; SecBuf[$55]:=$00;
- SecBuf[$56]:=$1F; SecBuf[$57]:=$58;
- SecBuf[$58]:=$EB;
- SecBuf[$59]:=$06;
-
- { Absolute Disk write Bootsector }
- INLINE( $50/$53/$51/$52/$06/$1e/$55/$57/$56/$a0/drivenr/
- $b9/$01/$00/$ba/$00/$00/$bb/SecBuf/$cd/$26/
- $83/$c4/$02/$b8/rwerror/$5e/$5f/$5d/$1f/$07/$5a/
- $59/$5b/$58);
- END;
-
-
- { Einige Hilfsroutinen für das Bildschirm-Layout }
-
- PROCEDURE leave;
- VAR i : INTEGER;
- BEGIN
- window(1,1,80,25);
- GotoXY(1,8);
- FOR i:= 1 TO 70 DO Write(chr(177));
- GotoXY(1,9);
- FOR i:=1 TO 1280 DO Write(' ');
- GotoXY(1,9);
- writeln('FORM720: Abbruch');
- halt;
- END;
-
- PROCEDURE INV;
- BEGIN
- TextColor(0);
- TextBackground(7);
- END;
-
- PROCEDURE NORM;
- BEGIN
- TextColor(7);
- TextBackground(0);
- END;
-
- PROCEDURE g(sel,y : INTEGER);
- BEGIN
- GotoXY(3,y+2);
- IF sel = y THEN INV ELSE NORM;
- END;
-
- PROCEDURE wrgrc(s : Str80);
- VAR i : INTEGER;
- len : INTEGER;
- BEGIN
- len := Length(s);
- i := 1;
- WHILE i<=len DO BEGIN
- CASE s[i] OF
- '!' : write(chr(219));
- '-' : write(chr(223));
- else write(s[i]);
- END;
- i := i +1;
- END;
- END;
-
-
- PROCEDURE help(sel : INTEGER);
- VAR s,t : Str80;
- i : INTEGER;
- BEGIN
- NORM;
- s:=''; t:='';
- CASE sel OF
- 1: BEGIN
- s:='Im AT : mit Installation DEVICE=DRIVE720.SYS /D:x';
- t:='###### 720-kB-Disk in Standard-AT-Laufwerk';
- END;
- 3: BEGIN
- s:='Im AT : normales High-Density-Format ';
- t:=' (360 u/min 500 kBit/sec) ';
- END;
- 2: BEGIN
- s:='Im AT : 360 kB AT-Laufwerk mit Double-Step';
- t:=' (360 u/min 300 kBit/sec) 40 Tracks ';
- END;
- 4: BEGIN
- s:='Im AT/PS2 : High Density 3.5 Zoll => 1.44 MB ';
- t:=' (300 u/min 500 kBit/sec)';
- END;
- 5: BEGIN
- s:='Im AT/PS2 : High Density 3.5 Zoll => 720 kB';
- t:=' (300 u/min 250 kBit/sec)';
- END;
- 6: BEGIN
- s:='Im PC/AT/PS2 : einfaches 80-Track-Drive';
- t:=' (300 u/min 250 kBit/sec)';
- END;
- 7: BEGIN
- s:='Im PC (AT) : einfaches 40-Track-Drive';
- t:=' (300 u/min 250 bKit/sec)';
- END;
- END;
- GotoXY(2,13); FOR i := 16 to 75 DO write(' ');
- GotoXY(2,14); FOR i := 16 to 75 DO write(' ');
- GotoXY(2,13); write(s);
- GotoXY(2,14); write(t);
- END;
-
-
- { BootPatch erledigt komfortabel den Bootpatchvorgang }
-
- PROCEDURE BootPatch;
- VAR ch : CHAR;
- DoAgain : BOOLEAN;
- i : INTEGER;
- BEGIN
- writeln;
- REPEAT
- writeln;
- write(chr(201));
- FOR i:=1 TO 11 DO write(chr(205));
- write(' Boot-Patch ');
- FOR i:=1 TO 31 DO write(chr(205));
- writeln(chr(187));
- write(chr(186));
- FOR i:=1 TO 54 DO write(' ');
- writeln(chr(186));
- write(chr(186));
- write(
- ' Legen Sie Diskette (720kByte FORM720-Format) ein,bei '
- );
- writeln(chr(186));
- write(chr(186));
- write(
- ' der der Bootsektor-Patch durchgeführt werden soll. '
- );
- writeln(chr(186));
- write(chr(186));
- write(' ... Taste ... zum Start');
- writeln(' ',chr(186));
- ch := Readkey;
- IF ch = #27 THEN exit;
- IF ch = #0 THEN ch := readkey;
- IF CheckBoot THEN BEGIN
- DoPatch;
- END ELSE BEGIN
- write(chr(186));
- write(' !! Patch nur möglich, wenn Bootsektor von');
- writeln(' ',chr(186));
- write(chr(186));
- write(' MSDOS-3.2 oder MSDOS-3.3');
- writeln(' ',chr(186));
- END;
- DoAgain := FALSE;
- write(chr(200));
- FOR i:=1 TO 6 DO write(chr(205));
- write(' eine weitere Diskette patchen ? (J/N): ');
- FOR i:=1 TO 8 DO write(chr(205)); writeln(chr(188));
- ch := readkey;
- IF (ch='J') OR (ch='j') THEN DoAgain := TRUE;
- IF ch = #0 THEN ch := readkey;
- UNTIL NOT DoAgain;
- END;
-
-
- PROCEDURE Menu(VAR command : Str80; VAR bpatch : BOOLEAN);
- VAR i : INTEGER;
- maxdisks : INTEGER;
- goon : BOOLEAN;
- s : INTEGER;
- ch : CHAR;
- BEGIN
- GotoXY(1,10);
- FOR i:=0 TO 1199 DO Write(chr(177));
- window(8,8,40,10);
- ClrScr;
- GotoXY(3,2);
- write(' Formatieren auf Laufwerk :');
- window(40,12,49,22);
- ClrScr;
- maxdisks := GetAllDisks;
- IF maxdisks > 9 THEN
- maxdisks:=9;
- s := 0;
- goon := TRUE;
-
- { Laufwerk selektieren }
-
- WHILE goon DO BEGIN
- FOR i := 0 TO maxdisks-1 DO BEGIN
- GotoXY(3,2+i);
- IF i=s THEN INV ELSE NORM;
- write(' ',chr(i+65),': ');
- NORM;
- END;
- ch := readkey;
- CASE ch OF
- #27 : leave;
- #13 : goon := FALSE;
- '8' : IF s > 0 THEN dec(s);
- '2' : IF s < MaxDisks-1 THEN inc(s);
- #00 : BEGIN
- ch := readkey;
- CASE ch OF
- #72 : IF s > 0 THEN dec(s);
- #80 : IF s < MaxDisks-1 THEN inc(s);
- END;
- END;
- END;
- END;
- command := ' x: ';
- command[2] := chr(65+s);
- drivenr := s;
- window(1,1,80,25);
- GotoXY(1,8);
- FOR i:=0 TO 1199 DO write(chr(177));
- window(10,12,42,18);
- ClrScr;
- GotoXY(3,2); write('Bootbare Diskette : ');
- s := 0;
- goon := TRUE;
-
- { Systemdiskette }
-
- WHILE goon DO BEGIN
- IF s = 0 THEN BEGIN
- Gotoxy(10,5);
- INV; write(' Nein ');
- NORM; write('/ Bootbar '); END
- ELSE BEGIN
- Gotoxy(10,5);
- NORM; write(' Nein / ');
- INV; write(' Bootbar ');
- NORM;
- END;
- ch := readkey;
- IF ch = #27 THEN leave;
- IF ch = #0 THEN ch := readkey;
- IF ch = #13 THEN goon := FALSE
- ELSE s := (s+1) MOD 2;
- END;
- Bootflag := FALSE;
- IF s=1 THEN BEGIN
- bootflag := TRUE;
- command := command + '/S ';
- END;
- window(1,1,80,25);
- GotoXY(1,8);
- FOR i:=0 TO 1199 DO write(chr(177));
- window(3,12,12,14);
- ClrScr;
- GotoXY(2,2);
- write('Format :');
- window(16,9,77,22);
- ClrScr;
- GotoXY(1,12);
- FOR i := 16 TO 77 DO write('─');
- s := 0;
- goon := TRUE;
-
- { Format-Type }
-
- WHILE goon DO BEGIN
-
- g(s,0);write(' -- Kein Parameter (für z.B. HARDDISKs) ');
- write('------------------ ');
- g(s,1);write('*FORM-720 80 Tr ------Step 9 Sec 2 Head');
- write(' spez AT-Laufwerk ');
- g(s,2);write(' 360 kB - 40 Tr DoubleStep 9 Sec 2 Head');
- write(' F:1 AT-Laufwerk ');
- g(s,3);write(' 1.2 MB - 80 Tr ------Step 15 Sec 2 Head');
- write(' F:1 AT-Laufwerk ');
- g(s,4);write(' 1.44 M - 80 Tr ------Step 18 Sec 2 Head');
- write(' F:7 High 3.5 ');
- g(s,5);write(' 720 kB - 80 Tr ------Step 9 Sec 2 Head');
- write(' F:7 High 3.5 ');
- g(s,6);write(' 720 kB - 80 Tr ------Step 9 Sec 2 Head');
- write(' F:2 80-Tr/3.5 low');
- g(s,7);write(' 360 kB - 40 Tr ------Step 9 Sec 2 Head');
- write(' F:0 40-Tr-Drive ');
- help(s);
- ch := readkey;
- CASE ch OF
- #27 : leave;
- #13 : goon := FALSE;
- '8' : IF s > 0 THEN dec(s);
- '2' : IF s < 7 THEN inc(s);
- #00 : BEGIN
- ch := readkey;
- CASE ch OF
- #72 : IF s > 0 THEN dec(s);
- #80 : IF s < 7 THEN inc(s);
- END;
- END;
- END;
- END;
-
- bpatch := FALSE;
- CASE s OF
- 0: command := command + '';
- 1: bpatch := TRUE;
- 2: command := command + '/4 ';
- 3: command := command + '';
- 4: command := command + '';
- 5: command := command + '/T:80 /N:9 ';
- 6: command := command + '/T:80 /N:9 ';
- 7: command := command + '';
- END;
- END;
-
-
- PROCEDURE DoIt;
- VAR
- i : INTEGER;
- command : Str80;
- patch : BOOLEAN;
- save : INTEGER;
- biosalt : INTEGER;
- BEGIN
- NORM;
- ClrScr;
- FOR i:=0 TO 719 DO Write(chr(177));
- GotoXY(3,2);
- FOR i:=0 TO 64 DO write(' ');
- GotoXY(3,3);
- wrgrc(' !--- !---! !--- !-!-! ---! ---! !--! ');
- write(' Copyright (c) 1989 ');
- Gotoxy(3,4);
- wrgrc(' !-- ! ! ! ! ! ! --- ! !--- ! ! ');
- write(' J. Loewer & toolbox ');
- GotoXY(3,5);
- wrgrc(' - ----- - - - - - ---- ---- ');
- write(' 720 KB-Driver V1.2 ');
- GotoXY(3,6);
- FOR i:=0 TO 64 DO write(' ');
- GotoXY(1,10);
- menu(command,patch);
- window(1,1,80,25);
- GotoXY(1,9);
- FOR i:=1 TO 1280 DO Write(' ');
- GotoXY(1,9);
- writeln;
-
- IF patch THEN BEGIN
- IF bootflag THEN BEGIN
- write(chr(219));
- writeln(' Nach Formatiervorgang muß pro Diskette ');
- write(chr(219));
- writeln(' ein BootPatch durchgeführt werden ! ');
- writeln;
- END;
-
- port[$70] := $10; Delay(2);
- save := port[$71]; Delay(2);
- port[$70] := $10; Delay(2);
- port[$71] := $44;
- biosalt := memw[$0040:$0090];
- GetIntVec($13,Int13Save);
- SetIntVec($13,@NewInt13);
- END;
- Exec(prog,Command);
- IF patch THEN BEGIN
- SetIntVec($13,Int13Save);
- memw[$0040:$0090] := biosalt;
- port[$70] := $10; Delay(2);
- port[$71] := save;
- IF Bootflag THEN BootPatch;
- END;
- writeln;
- IF DosExitCode = 0 THEN
- writeln('FORM720: normal beendet')
- ELSE writeln('FORM720: Vorgang abgebrochen');
- HALT;
- END;
-
-
- BEGIN
-
- IF LookUp(prog,'FORMAT.COM') THEN DoIt;
-
- Writeln('FORM720 abgebrochen. FORMAT.COM nicht gefunden');
-
- END.
-
- (* ------------------------------------------------------ *)
- (* Ende von FORM720.PAS *)