home *** CD-ROM | disk | FTP | other *** search
- (*------------------------------------------------------------*)
- (* FDFORMAT.PAS *)
- (* Copyright (c) 1988, Christoph H. Hochstätter *)
- (* Compiled in Turbo-Pascal 5.5 *)
- (* Should Compile in Turbo-Pascal 5.0 also *)
- (* Last Update: 03-Sept-1989 *)
- (*------------------------------------------------------------*)
-
- {$A+,B-,D+,E+,F-,I-,L+,N-,O-,R-,S-,V-,M 8192,0,0}
- PROGRAM FDFormat;
-
- USES Dos, BaseConv;
-
- {$DEFINE German} {Change this to German or English}
- CONST
- {$IFDEF German}
- Text01 = 'Fehler ';
- Text02 = '(A)bbrechen (W)iederholen (I)gnorieren ? ';
- T3 = 'W';
- Text04 = 'Kein gültiges Laufwerk.';
- Text05 = 'SUBST/ASSIGN/Netzwerk-Laufwerk.';
- Text06 = 'Kein Floppy-Laufwerk.';
- Text07 = 'Völlig unbekannte Laufwerksart';
- Text08 = 'Ich formatiere Laufwerk ';
- Text09 = ' Seite(n), ';
- Text10 = ' Spuren, ';
- Text11 = ' Sektoren/Spur, ';
- Text12 = ' Basisverzeichniseinträge, ';
- Text13 = ' Sektor(en)/Cluster, Sektoren-Versatz: ';
- Text14 = 'Kopf: ';
- Text15 = ', Zylinder: ';
- Text17 = 'Formatierfehler im Systembereich: Programm abgebrochen.';
- Text18 = 'Mehr als ';
- Text19 = ' Sektoren nicht lesbar. Programm abgebrochen.';
- Text20 = ' als schlecht markiert';
- Text21 = 'Format-Identifizierung: ';
- Text22 = 'Gesamtsektoren auf der Diskette: ';
- Text23 = 'Sektoren pro Spur: ';
- Text24 = 'Schreib-/Leseköpfe: ';
- Text25 = 'Bytes pro Sektor: ';
- Text26 = 'Versteckte Sektoren: ';
- Text27 = 'Boot-Sektoren: ';
- Text28 = 'Anzahl der FAT''s: ';
- Text29 = 'Sektoren pro FAT: ';
- Text30 = 'Cluster auf Diskette: ';
- Text31 = ' Bytes Gesamtkapazität';
- Text32 = ' Bytes in schlechten Sektoren';
- Text33 = ' Bytes auf der Diskette verfügbar';
- Text34 = 'Dieses Laufwerk kann nicht formatiert werden.';
- Text35 = 'Laufwerk ist physisch ';
- Text36 = 'BIOS Umschaltung 40/80 Spuren: ';
- Text37 = 'nach XT-Standard';
- Text38 = 'nach EPSON QX-16 Standard';
- Text39 = 'nach AT-Standard';
- Text40 = 'wird nicht unterstützt';
- Text41 = 'Syntax Error beim Aufruf.';
- Text42 = 'Format ist: FDFORMAT drive: [Optionen]';
- Text43 = ' Beispiel: FDFORMAT a: t41 h2 s10 C1 D112';
- Text44 = 'Parameter Bedeutung Voreinstellung';
- Text45 = 'drive: Laufwerk, das formatiert werden soll ----';
- Text46 = 'Tnn Anzahl der Spuren je Seite 40/80 je nach Laufwerk';
- Text47 = 'Hnn Anzahl der Seiten 2';
- Text48 = 'Nnn Anzahl der Sektoren je Spur 9/15/18 je nach Laufwerk';
- Text49 = 'Cn Anzahl der Sektoren je Cluster 1 bei HD, 2 bei DD';
- Text50 = 'Dnnn Anzahl der Basisverzeichniseinträge 224 bei HD, 112 bei DD';
- Text51 = 'Inn Interleave-Faktor 1';
- Text52 = 'Fnnn Format festlegen';
- Text53 = 'R Formatierung nicht verifizieren';
- Text69 = 'Bnnn Diskettentypbyte festlegen je nach Format';
- Text70 = 'Gnnn GAP-Länge festlegen je nach Format';
- Text71 = 'Lesen Sie die READ.ME Datei für weitere Optionen';
- Text54 = 'Dieses Programm benötigt mindestens DOS 3.20.';
- Text55 = 'FDFORMAT -- Formatieren von Disketten mit erhöhter Kapazität';
- Text56 = 'Copyright (c) 03.09.1989, Christoph H. Hochstätter, Ver 1.50';
- Text57 = 'Sie können nur 1 oder 2 Seiten nehmen.';
- Text58 = 'Sie sollten schon mindestens eine Spur formatieren.';
- Text59 = 'Interleave muß von 1-';
- Text60 = ' sein.';
- Text61 = 'WARNUNG! DOS verwaltet bei Disketten nur 1 oder 2 Sektoren/Cluster';
- Text62 = 'WARNUNG! Zu viele Spuren. Das kann Ihr Laufwerk beschädigen';
- Text63 = 'WARNUNG! DOS verwaltet bei Disketten maximal 240 Basisverzeichniseinträge';
- Text64 = 'Neue Diskette in Laufwerk ';
- Text65 = ': einlegen';
- Text66 = 'Anschließend ENTER drücken (ESC=Abbruch)';
- Text67 = 'Übertragungsrate: ';
- Text68 = ', GAP-Länge: ';
- Text72 = 'EIN';
- Text73 = 'AUS';
- Text74 = 'Bitte Diskettennamen eingeben (max. 11 Zeichen): ';
- Text75 = 'Fehler beim Erstellen des Namens.';
- Text76 = 'Syntax-Fehler in der Datei FDFORMAT.CFG.';
- Text77 = 'Lesefehler in der Datei FDFORMAT.CFG.';
- Text78 = ', Sektoren: ';
- Error01 = 'Falsches Disketten-Steuer-Kommando';
- Error02 = 'Formatierung nicht gefunden';
- Error03 = 'Diskette ist schreibgeschützt';
- Error04 = 'Sektor nicht gefunden';
- Error06 = 'Unerlaubter Diskettenwechsel';
- Error08 = 'DMA-Baustein übergelaufen';
- Error09 = 'Mehr als 64 kByte im DMA Baustein';
- Error0c = 'Format nicht kompatibel mit Datenübertragungsrate';
- Error10 = 'Zyklische Redundanzprüfung fehlerhaft';
- Error20 = 'Diskettenadapter fehlerhaft';
- Error40 = 'Laufwerkskopf konnte nicht positioniert werden';
- Error80 = 'Keine Diskette im Laufwerk oder falsch eingelegt';
- Errorxx = 'Fehlerursache unbekannt';
- {$ELSE}
- Text01 = 'Error ';
- Text02 = '(A)bort (R)etry (I)gnore ? ';
- T3 = 'R';
- Text04 = 'No valid drive.';
- Text05 = 'SUBST/ASSIGN/Network-Drive.';
- Text06 = 'Not a floppy drive.';
- Text07 = 'Unknown drive type.';
- Text08 = 'Formatting drive ';
- Text09 = ' Head(s), ';
- Text10 = ' Tracks, ';
- Text11 = ' Sectors/track, ';
- Text12 = ' Root Directory Entries, ';
- Text13 = ' Sector(s)/Cluster, Sector-Shift: ';
- Text14 = 'Head: ';
- Text15 = ', Cylinder: ';
- Text17 = 'Format error in system area: Program aborted.';
- Text18 = 'More than ';
- Text19 = ' sectors unreadable. Program aborted.';
- Text20 = ' marked as bad';
- Text21 = 'OEM-Entry: ';
- Text22 = 'Total sectors on disk: ';
- Text23 = 'Sectors per track: ';
- Text24 = 'Heads: ';
- Text25 = 'Bytes per sector: ';
- Text26 = 'Hidden sectors: ';
- Text27 = 'Boot-sectors: ';
- Text28 = 'Number of FATs: ';
- Text29 = 'Sectors per FAT: ';
- Text30 = 'Total clusters on disk: ';
- Text31 = ' total bytes on disk';
- Text32 = ' bytes in bad sectors';
- Text33 = ' bytes available';
- Text34 = 'This drive cannot be formatted.';
- Text35 = 'Drive is physical ';
- Text36 = 'BIOS double-step support: ';
- Text37 = 'XT-like';
- Text38 = 'EPSON QX-16 like';
- Text39 = 'AT-like';
- Text40 = 'Not available or unknown';
- Text41 = 'Syntax Error.';
- Text42 = 'Usage is: FDFORMAT drive: [options]';
- Text43 = ' Example: FDFORMAT a: t41 h2 s10 C1 D112';
- Text44 = 'Option Meaning Default';
- Text45 = 'drive: drive to be formatted none';
- Text46 = 'Tnn Number of tracks 40/80 depends on drive';
- Text47 = 'Hnn Number of heads 2';
- Text48 = 'Nnn Number of sectors per track 9/15/18 depends on drive';
- Text49 = 'Cn Number of sectors per cluster 1 for HD, 2 for DD';
- Text50 = 'Dnnn Number of root directory entries 224 for HD, 112 for DDD';
- Text51 = 'Inn Interleave 1';
- Text52 = 'F specify Diskette format';
- Text53 = 'R Skip verifying';
- Text69 = 'Bnnn Force a specified Format-Descriptor depends on format';
- Text70 = 'Gnnn Use specified GAP-Length depends on format';
- Text71 = 'See the READ.ME file for other options';
- Text54 = 'This program requires DOS 3.2 or higher.';
- Text55 = 'FDFORMAT - Disk Formatter for High Capacity Disks - Ver 1.50';
- Text56 = 'Copyright (c) 03-Sep-1989, Christoph H. Hochstätter, Germany';
- Text57 = 'Heads must be 1 or 2.';
- Text58 = 'At least one track should be formatted.';
- Text59 = 'Interleave must be from 1 to ';
- Text60 = '.';
- Text61 = 'WARNING! DOS supports only 1 or 2 sectors per cluster.';
- Text62 = 'WARNING! That many tracks could cause damage to your drive.';
- Text63 = 'WARNING! DOS supports a maximum of 240 root directory entries.';
- Text64 = 'Insert new Diskette in drive ';
- Text65 = ':';
- Text66 = 'Press ENTER when ready (ESC=QUIT)';
- Text67 = 'Data Transfer Rate: ';
- Text68 = ', GAP-Length: ';
- Text72 = 'ON';
- Text73 = 'OFF';
- Text74 = 'Enter Volume Name (max. 11 characters): ';
- Text75 = 'Error creating volume label.';
- Text76 = 'Syntax Error in FDFORMAT.CFG.';
- Text77 = 'Error reading FDFORMAT.CFG.';
- Text78 = ', Sectors: ';
- Error01 = 'Illegal Command. Bug in FDFORMAT';
- Error02 = 'Address mark not found';
- Error03 = 'Disk is write protected';
- Error04 = 'Sector not found';
- Error06 = 'Illegal disk change';
- Error08 = 'DMA overrun';
- Error09 = 'DMA accross 64 kB boundary';
- Error0c = 'Format not compatible with data transfer rate';
- Error10 = 'CRC error';
- Error20 = 'controller/adapter error';
- Error40 = 'seek error';
- Error80 = 'No disk in drive';
- Errorxx = 'Unknown error';
- {$ENDIF}
-
- CONST
- MaxForm = 20;
-
- TYPE
- TableTyp = ARRAY[1..25] OF RECORD
- t, h, s, f: BYTE;
- END;
-
- ParaTyp = ARRAY[ 0.. 10] OF BYTE;
- BootTyp = ARRAY[30..511] OF BYTE;
-
- BttTyp = ARRAY[ 1.. 20] OF RECORD
- Head: BYTE;
- Track: BYTE;
- END;
- FTabTyp = ARRAY[ 1..MaxForm] OF RECORD
- Fmt: WORD;
- Trk: BYTE;
- Sec: BYTE;
- Hds: BYTE;
- END;
-
- BPBTyp = RECORD
- Jmp: ARRAY[1..3] OF BYTE; {Die ersten drei Bytes für JUMP}
- OEM: ARRAY[1..8] OF CHAR; {OEM-Eintrag}
- BpS: WORD; {Bytes pro Sektor}
- Spc: BYTE; {Sektoren pro Cluster}
- Res: WORD; {BOOT-Sektoren}
- FAT: BYTE; {Anzahl der FAT's}
- RDE: WORD; {Basisverzeichniseinträge}
- Sec: WORD; {Gesamtsektoren der Diskette}
- MDs: BYTE; {Media-Deskriptor}
- SpF: WORD; {Sektoren pro FAT}
- SpT: WORD; {Sektoren pro Spur}
- Hds: WORD; {Seiten}
- SHH: WORD; {Versteckte Sektoren}
- Boot_Code: BootTyp; {Puffer für BOOT-Code}
- END;
-
- VAR
- Regs: Registers; {Prozessor-Register}
- Track: BYTE; {Aktuelle Spur}
- Head: BYTE; {Aktuelle Seite}
- Table: TableTyp; {Formatierungs-Tabelle}
- Table2: ARRAY[1..25] OF BYTE; {Interleave-Tabelle}
- x: WORD; {Hilfsvariable}
- Buffer: ARRAY[0..18432] OF BYTE; {Puffer für eingelesene Sektoren}
- Old1E: Pointer; {Alter Zeiger auf die Parameterliste}
- New1E: ^ParaTyp; {Neuer Zeiger auf die Parameterliste}
- Old13: Pointer; {Alter Zeiger auf Interrupt 13}
- Old58: Pointer; {Alter Zeiger auf Hilfsinterrupt 58}
- BPB: BPBTyp; {Boot-Sektor mit BIOS-Parameterblock}
- CHX: CHAR; {Hilfsvariable}
- Lw: BYTE; {Ausgewähltes Laufwerk}
- Hds,Sec: WORD; {Anzahl der Seiten, Sektoren}
- Trk: WORD; {Anzahl der Spuren}
- HD, LWHd: BOOLEAN; {High-Density Flags}
- LWTrk: BYTE; {maximale Spuren des Laufwerks}
- LWSec: BYTE; {maximale Sektoren des Laufwerks}
- Para: ARRAY[1..50] OF STRING[20]; {Parameter von der Kommandozeile}
- RDE: BYTE; {Basisverzeichniseinträge}
- Spc: BYTE; {Sektoren pro Cluster}
- i: BYTE; {Hilfsvariablen}
- j,n: INTEGER; {Hilfsvariable}
- Again: BOOLEAN; {Flag, ob INT 13 nochmal kommen muß}
- BTTCount: WORD; {Anzahl der schlechten Spuren}
- BTT: BttTyp; {Tabelle der schlechten Spuren}
- Offset: WORD; {Relative Position im FAT}
- Mask: WORD; {Maske für schlechten Cluster}
- Bytes: LONGINT; {Bytes Gesamtkapazität}
- Bad: LONGINT; {Bytes in schlechten Sektoren}
- At80: BOOLEAN; {TRUE, wenn 80/40 Spur nach AT-BIOS}
- NoVerify: BOOLEAN; {TRUE, wenn Verify nicht verlangt wurde}
- DiskId: BYTE; {Disketten-Format-Beschreibung für AT-BIOS}
- Il: BYTE; {Interleave-Faktor}
- GpL: BYTE; {GAP-Länge}
- ShiftT: BYTE; {Sektor-Shifting für Spuren}
- ShiftH: BYTE; {Sektor-Shifting für Köpfe}
- ModelByte: BYTE ABSOLUTE $F000:$FFFE; {XT/AT/386}
- ForceType: BYTE; {Erzwungener DiskID}
- ForceMedia: BYTE; {Erzwungener Media-Deskriptor}
- DosDrive: BYTE; {DOS-Laufwerks-Identifizierer}
- PCount: BYTE; {Anzahl der Parameter}
- Found: BOOLEAN; {Format gefunden}
- Sys: BOOLEAN; {System initialisieren}
- LwTab: ARRAY[0..3] OF BYTE ABSOLUTE $40:$90; {Tabelle der Laufwerke}
- DLabel: STRING[15]; {Disketten-Label}
- SetLabel: BOOLEAN; {Label setzen}
- Batch: BOOLEAN; {Ohne Tastatur-Abfrage}
- CfgAt80: BOOLEAN; {TRUE, wenn Laufwerk für AT konfiguriert}
- CfgPC80: BOOLEAN; {TRUE, wenn Laufwerk für XT konfiguriert}
- CfgDrive: BYTE; {Laufwerksart aus Konfiguration}
- BIOS: BOOLEAN; {TRUE, wenn nur BIOS-Aufrufe}
- PC80: BYTE; {Maske, für 80 Spur nach XT-BIOS}
- PC40: BYTE; {Maske, für 80 Spur nach XT-BIOS}
- V720: BYTE; {Media-Typ für 720 kByte}
- V360: BYTE; {Media-Typ für 360 kByte}
- V12: BYTE; {Media-Typ für 1.2 MByte}
- V144: BYTE; {Media-Typ für 1.44 MByte}
-
- CONST
- Para17: ParaTyp = ($DF,$02,$25,$02,17,$02,$FF,$23,$F6,$0F,$08);
- Para18a: ParaTyp = ($DF,$02,$25,$02,18,$02,$FF,$02,$F6,$0F,$08);
- Para18: ParaTyp = ($DF,$02,$25,$02,18,$02,$FF,$6C,$F6,$0F,$08);
- Para10: ParaTyp = ($DF,$02,$25,$02,10,$02,$FF,$2E,$F6,$0F,$08); {GPL 26-36}
- Para11: ParaTyp = ($DF,$02,$25,$02,11,$02,$FF,$02,$F6,$0F,$08);
- Para15: ParaTyp = ($DF,$02,$25,$02,15,$02,$FF,$54,$F6,$0F,$08);
- Para09: ParaTyp = ($DF,$02,$25,$02,09,$02,$FF,$50,$F6,$0F,$08);
- Para08: ParaTyp = ($DF,$02,$25,$02,08,$02,$FF,$58,$F6,$0F,$08);
- Para20: ParaTyp = ($DF,$02,$25,$02,20,$02,$FF,$2A,$F6,$0F,$08); {GPL 17-33}
- Para21: ParaTyp = ($DF,$02,$25,$02,21,$02,$FF,$0C,$F6,$0F,$08);
- Para22: ParaTyp = ($DF,$02,$25,$02,22,$02,$FF,$01,$F6,$0F,$08);
-
- FTab: FTabTyp = ((Fmt: 160; Trk: 40; Sec: 8; Hds: 1), {Requires 180 kByte Drive}
- (Fmt: 180; Trk: 40; Sec: 9; Hds: 1), {Requires 180 kByte Drive}
- (Fmt: 200; Trk: 40; Sec: 10; Hds: 1), {Requires 180 kByte Drive}
- (Fmt: 205; Trk: 41; Sec: 10; Hds: 1), {Requires 180 kByte Drive}
- (Fmt: 320; Trk: 40; Sec: 8; Hds: 2), {Requires 360 kByte Drive}
- (Fmt: 360; Trk: 40; Sec: 9; Hds: 2), {Requires 360 kByte Drive}
- (Fmt: 400; Trk: 40; Sec: 10; Hds: 2), {Requires 360 kByte Drive}
- (Fmt: 410; Trk: 41; Sec: 10; Hds: 2), {Requires 360 kByte Drive}
- (Fmt: 720; Trk: 80; Sec: 9; Hds: 2), {Requires 720 kByte Drive}
- (Fmt: 800; Trk: 80; Sec: 10; Hds: 2), {Requires 720 kByte Drive}
- (Fmt: 820; Trk: 82; Sec: 10; Hds: 2), {Requires 720 kByte Drive}
- (Fmt: 120; Trk: 80; Sec: 15; Hds: 2), {Requires 1.2 MByte Drive}
- (Fmt: 12; Trk: 80; Sec: 15; Hds: 2), {Requires 1.2 MByte Drive}
- (Fmt: 144; Trk: 80; Sec: 18; Hds: 2), {Requires 1.2 MByte Drive}
- (Fmt: 14; Trk: 80; Sec: 18; Hds: 2), {Requires 1.2 MByte Drive}
- (Fmt: 148; Trk: 82; Sec: 18; Hds: 2), {Requires 1.2 MByte Drive}
- (Fmt: 16; Trk: 80; Sec: 20; Hds: 2), {Requires 1.4 MByte Drive}
- (Fmt: 164; Trk: 82; Sec: 20; Hds: 2), {Requires 1.4 MByte Drive}
- (Fmt: 168; Trk: 80; Sec: 21; Hds: 2), {Requires 1.4 MByte Drive}
- (Fmt: 172; Trk: 82; Sec: 21; Hds: 2)); {Requires 1.4 MByte Drive}
-
- GetPhys: ARRAY[0..14] OF BYTE =(
- $1E, { PUSH DS }
- $B8,$40,$00, { MOV AX,40H }
- $8E,$D8, { MOV DS,AX }
- $88,$16,$41,$00, { MOV [41H],DL }
- $1F, { POP DS }
- $B8,$01,$01, { MOV AX,101H }
- $CF); { IRET }
-
- Help58: ARRAY[0..3] OF BYTE =(
-
- $CD,$25, { INT 25H }
- $59, { POP CX }
- $CF); { IRET }
-
- Boot: BootTyp=(
- {$IFDEF German}
- $00,$00,
- $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
- $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
- $00,$00,$8C,$C8,$3D,$00,$7C,$74,$08,$BE,$82,$02,$E8,$6A,$00,$CD,
- $20,$FA,$33,$C0,$8E,$D0,$BC,$00,$7C,$B8,$B0,$07,$50,$50,$1F,$07,
- $BE,$00,$01,$BF,$00,$03,$B9,$00,$01,$F3,$A5,$B8,$D0,$07,$50,$50,
- $50,$1F,$07,$B8,$78,$01,$50,$CB,$FB,$BE,$C9,$01,$E8,$3A,$00,$B8,
- $01,$02,$B9,$01,$00,$BA,$80,$00,$33,$DB,$53,$07,$BB,$00,$7C,$06,
- $53,$CD,$13,$72,$0A,$26,$81,$3E,$FE,$7D,$55,$AA,$75,$01,$CB,$BE,
- $0F,$02,$E8,$14,$00,$B4,$01,$CD,$16,$74,$06,$32,$E4,$CD,$16,$EB,
- $F4,$32,$E4,$CD,$16,$33,$D2,$CD,$19,$8A,$04,$0A,$C0,$75,$01,$C3,
- $56,$B4,$0E,$CD,$10,$5E,$46,$EB,$F0,$46,$44,$46,$4F,$52,$4D,$41,
- $54,$20,$56,$65,$72,$73,$69,$6F,$6E,$20,$31,$2E,$35,$0A,$0D,$4B,
- $65,$69,$6E,$65,$20,$53,$79,$73,$74,$65,$6D,$64,$69,$73,$6B,$65,
- $74,$74,$65,$2E,$20,$53,$74,$61,$72,$74,$65,$6E,$20,$76,$6F,$6E,
- $20,$46,$65,$73,$74,$70,$6C,$61,$74,$74,$65,$2E,$0A,$0D,$00,$4B,
- $61,$6E,$6E,$20,$6E,$69,$63,$68,$74,$20,$76,$6F,$6E,$20,$64,$65,
- $72,$20,$46,$65,$73,$74,$70,$6C,$61,$74,$74,$65,$20,$73,$74,$61,
- $72,$74,$65,$6E,$2E,$0A,$0D,$53,$79,$73,$74,$65,$6D,$2D,$44,$69,
- $73,$6B,$65,$74,$74,$65,$20,$69,$6E,$20,$4C,$61,$75,$66,$77,$65,
- $72,$6B,$20,$41,$3A,$20,$65,$69,$6E,$6C,$65,$67,$65,$6E,$0A,$0D,
- $41,$6E,$73,$63,$68,$6C,$69,$65,$E1,$65,$6E,$64,$20,$65,$69,$6E,
- $65,$20,$54,$61,$73,$74,$65,$20,$64,$72,$81,$63,$6B,$65,$6E,$0A,
- $0D,$00,$44,$69,$65,$73,$65,$20,$44,$61,$74,$65,$69,$20,$6E,$69,
- $63,$68,$74,$20,$61,$75,$73,$66,$81,$68,$72,$65,$6E,$2E,$07,$0A,
- $0D,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
- $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
- $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
- $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
- $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
- $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$55,$AA);
- {$ELSE}
- $00,$00,
- $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
- $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
- $00,$00,$8C,$C8,$3D,$00,$7C,$74,$08,$BE,$4A,$02,$E8,$6A,$00,$CD,
- $20,$FA,$33,$C0,$8E,$D0,$BC,$00,$7C,$B8,$B0,$07,$50,$50,$1F,$07,
- $BE,$00,$01,$BF,$00,$03,$B9,$00,$01,$F3,$A5,$B8,$D0,$07,$50,$50,
- $50,$1F,$07,$B8,$78,$01,$50,$CB,$FB,$BE,$C9,$01,$E8,$3A,$00,$B8,
- $01,$02,$B9,$01,$00,$BA,$80,$00,$33,$DB,$53,$07,$BB,$00,$7C,$06,
- $53,$CD,$13,$72,$0A,$26,$81,$3E,$FE,$7D,$55,$AA,$75,$01,$CB,$BE,
- $07,$02,$E8,$14,$00,$B4,$01,$CD,$16,$74,$06,$32,$E4,$CD,$16,$EB,
- $F4,$32,$E4,$CD,$16,$33,$D2,$CD,$19,$8A,$04,$0A,$C0,$75,$01,$C3,
- $56,$B4,$0E,$CD,$10,$5E,$46,$EB,$F0,$46,$44,$46,$4F,$52,$4D,$41,
- $54,$20,$56,$65,$72,$73,$69,$6F,$6E,$20,$31,$2E,$35,$0A,$0D,$4E,
- $6F,$20,$53,$79,$73,$74,$65,$6D,$64,$69,$73,$6B,$2E,$20,$42,$6F,
- $6F,$74,$69,$6E,$67,$20,$66,$72,$6F,$6D,$20,$68,$61,$72,$64,$64,
- $69,$73,$6B,$2E,$0A,$0D,$00,$43,$61,$6E,$6E,$6F,$74,$20,$6C,$6F,
- $61,$64,$20,$66,$72,$6F,$6D,$20,$68,$61,$72,$64,$64,$69,$73,$6B,
- $2E,$0A,$0D,$49,$6E,$73,$65,$72,$74,$20,$53,$79,$73,$74,$65,$6D,
- $64,$69,$73,$6B,$20,$61,$6E,$64,$20,$70,$72,$65,$73,$73,$20,$61,
- $6E,$79,$20,$6B,$65,$79,$2E,$0A,$0D,$00,$44,$6F,$20,$6E,$6F,$74,
- $20,$65,$78,$65,$63,$75,$74,$65,$20,$74,$68,$69,$73,$20,$43,$4F,
- $4D,$2D,$46,$69,$6C,$65,$2E,$0A,$0D,$00,$00,$00,$00,$00,$00,$00,
- $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
- $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
- $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
- $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
- $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
- $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
- $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
- $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
- $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$55,$AA);
- {$ENDIF}
-
- FUNCTION ReadKey:CHAR;
- VAR r: Registers;
- BEGIN
- WITH r DO BEGIN
- AH := 7;
- Intr($21, r);
- IF AL IN [3, 27] THEN BEGIN
- WriteLn;
- Halt(4);
- END;
- ReadKey := Chr(AL);
- END;
- END;
-
- PROCEDURE ConfigError;
- BEGIN
- WriteLn;
- WriteLn(Text76);
- Halt(16);
- END;
-
- PROCEDURE GetValue(x,y:STRING;VAR VALUE:BYTE);
- VAR
- i, k: BYTE;
- j : INTEGER;
- BEGIN
- y := ' ' + y + '=';
- i := Pos(y, x);
- IF i <> 0 THEN BEGIN
- i := i + Length(y);
- WHILE x[i] = ' ' DO Inc(i);
- IF i > Length(x) THEN ConfigError;
- k := i;
- WHILE x[k] <> ' ' DO Inc(k);
- IF x[i] <> '$' THEN BEGIN
- Val(Copy(x, i, k - i), VALUE, j);
- IF j <> 0 THEN ConfigError;
- END ELSE BEGIN
- VALUE := DezH(Copy(x, i + 1, k - i - 1));
- IF BaseError <> 0 THEN ConfigError;
- END;
- END;
- END;
-
- PROCEDURE CfgRead;
- VAR f: TEXT;
- x: STRING;
- i: BYTE;
- BEGIN
- CfgAt80 := FALSE;
- CfgPC80 := FALSE;
- CfgDrive := 255;
- BIOS := FALSE;
- PC80 := 0;
- PC40 := 0;
- V720 := 0;
- V360 := 0;
- V12 := 0;
- V144 := 0;
- x := FSearch('FDFORMAT.CFG', GetEnv('PATH'));
- IF x <> '' THEN BEGIN
- Assign(f, x);
- {$I-} Reset(f); {$I+}
- IF IOResult = 0 THEN BEGIN
- WHILE NOT EoF(f) DO BEGIN
- ReadLn(f, x);
- x := x + ' ';
- FOR i:=1 TO Length(x) DO x[i]:=UpCase(x[i]);
- IF Copy(x, 1, 2) = Para[1] THEN BEGIN
- IF Pos(' BIOS ', x) <> 0 THEN BIOS := TRUE;
- IF Pos(' AT ', x) <> 0 THEN CfgAt80 := TRUE;
- GetValue(x, 'F', CfgDrive);
- IF NOT(CfgDrive IN [0, 1, 2, 7, 255]) THEN ConfigError;
- IF Pos(' XT ', x) <> 0 THEN CfgPC80 := TRUE;
- GetValue(x, '40', PC40);
- GetValue(x, '80', PC80);
- GetValue(x, '360', V360);
- GetValue(x, '720', V720);
- GetValue(x, '1.2', V12);
- GetValue(x, '1.44', V144);
- GetValue(x, 'X', ShiftH);
- GetValue(x, 'Y', ShiftT);
- END;
- IF CfgAt80 AND CfgPC80 THEN ConfigError;
- END;
- {$I-} Close(f); {$I+}
- END ELSE BEGIN
- WriteLn;
- WriteLn(Text77);
- Halt(8);
- END;
- END;
- END;
-
- PROCEDURE Int13Error;
- BEGIN
- WriteLn;
- CASE Regs.AH OF
- $01: Write(Error01);
- $02: Write(Error02);
- $03: Write(Error03);
- $04: Write(Error04);
- $06: Write(Error06);
- $08: Write(Error08);
- $09: Write(Error09);
- $0C: Write(Error0c);
- $10: Write(Error10);
- $20: Write(Error20);
- $40: Write(Error40);
- $80: Write(Error80);
- ELSE Write(Errorxx);
- END;
- WriteLn('.');
- END;
-
- PROCEDURE Int13;
- VAR
- AXS: WORD;
- CHX: CHAR;
- er : BOOLEAN;
- BEGIN
- Again := FALSE;
- WITH Regs DO BEGIN
- AXS := AX;
- REPEAT
- AX := AXS;
- IF AH = 5 THEN SetIntVec($1E, New1E);
- IF Trk > 43 THEN DL := DL OR PC80 ELSE DL := DL OR PC40;
- IF NOT(BIOS) THEN LwTab[DL] := DiskId;
- Intr($13, Regs);
- SetIntVec($1E, Old1E);
- er := AH > 1;
- UNTIL AH <> 6;
- IF er THEN BEGIN
- WriteLn;
- WriteLn(Text01, AH, ' ',
- Text14, DH,
- Text15, CH,
- Text78, CL,
- '-', CL + Lo(AXS) - 1);
- Int13Error;
- WriteLn(Text02);
- REPEAT
- CHX := UpCase(ReadKey);
- CASE CHX OF
- 'A': Halt(4);
- 'I': er := FALSE;
- T3 : BEGIN er := FALSE; Again := TRUE; END;
- END;
- UNTIL CHX IN ['A', 'I', T3];
- END;
- AX := AXS;
- END;
- END;
-
- PROCEDURE Parse;
- VAR j: BYTE;
- ArgStr: STRING[80];
- BEGIN
- ArgStr := '';
- FOR j := 1 TO 50 DO Para[j] := '';
- FOR j := 1 TO ParamCount DO ArgStr := ArgStr + ' ' + ParamStr(j);
- FOR j := 1 TO Length(ArgStr) DO ArgStr[j] := UpCase(ArgStr[j]);
- PCount := 0;
- FOR j := 1 TO Length(ArgStr) DO BEGIN
- CASE ArgStr[j] OF
- ' ', '-', '/': Inc(PCount);
- ELSE IF (NOT(ArgStr[j] IN [':', '.'])) OR (PCount = 1) THEN
- Para[PCount] := Para[PCount] + ArgStr[j];
- END;
- END;
- END;
-
-
- PROCEDURE GetPhysical(VAR Lw: BYTE);
- BEGIN
- WITH Regs DO BEGIN
- GetIntVec($58, Old58);
- GetIntVec($13, Old13);
- SetIntVec($58, @Help58);
- SetIntVec($13, @GetPhys);
- AL := Lw; CX := 1; DX := 0;
- DS := Seg(Buffer); BX := Ofs(Buffer);
- Intr($58, Regs);
- SetIntVec($58, Old58);
- SetIntVec($13, Old13);
- Lw := Mem[$40:$41];
- END;
- END;
-
- PROCEDURE DriveTyp(VAR Lw: BYTE; VAR HD: BOOLEAN; VAR Trk, Sec: BYTE);
- BEGIN
- WITH Regs DO BEGIN
- AX := $4409; BL := Lw + 1; BH := 0;
- Intr($21, Regs);
- IF (FCarry AND Flags) <> 0 THEN BEGIN
- WriteLn(Text04);
- Trk := 0;
- Exit;
- END;
- IF (DX AND $9200) <> 0 THEN BEGIN
- WriteLn(Text05);
- Trk := 0;
- Exit;
- END;
- AX := $440F; BL := Lw + 1; BH := 0;
- Intr($21, Regs);
- IF (FCarry AND Flags) <> 0 THEN BEGIN
- WriteLn(Text04);
- Trk := 0;
- Exit;
- END;
- AX := $440D; CX := $860; BL := Lw + 1;
- BH := 0; DX := Ofs(Buffer); DS := Seg(Buffer);
- Intr($21, Regs);
- DosDrive := Buffer[1];
- IF CfgDrive <> 255 THEN
- DosDrive := CfgDrive;
- CASE DosDrive OF
- 0: BEGIN Trk := 39; Sec := 9; HD := FALSE; END;
- 1: BEGIN Trk := 79; Sec := 15; HD := TRUE ; END;
- 2: BEGIN Trk := 79; Sec := 9; HD := FALSE; END;
- 7: BEGIN Trk := 79; Sec := 18; HD := TRUE ; END;
- ELSE BEGIN
- WriteLn(Text06);
- Trk := 0;
- Exit;
- END
- END;
- GetPhysical(Lw);
- Lw := Lw AND $9F;
- IF NOT(Lw IN [0..3]) THEN BEGIN
- WriteLn(Text07);
- Trk := 0;
- Exit;
- END;
- IF CfgAt80 THEN
- At80 := CfgAt80
- ELSE
- At80 := (ModelByte = $F8) OR (ModelByte = $FC);
- END;
- END;
-
- PROCEDURE ATSetDrive(Lw: BYTE; Trk, Sec, Disk2, Disk, SetUp: BYTE);
- BEGIN
- WITH Regs DO BEGIN
- DH := Lw; AH := $18; CH := Trk; CL := Sec;
- Intr($13, Regs);
- IF AH > 1 THEN BEGIN
- AH := $17; AL := SetUp; DL := Lw;
- Intr($13, Regs);
- END;
- IF ForceType <> 0 THEN BEGIN
- LwTab[Lw] := ForceType;
- BIOS := FALSE;
- END ELSE IF Disk2 <> 0 THEN BEGIN
- BIOS := FALSE;
- LwTab[Lw] := Disk2;
- END ELSE IF NOT(BIOS) THEN LwTab[Lw] := Disk;
- DiskId := LwTab[Lw];
- END;
- END;
-
- PROCEDURE SectorAbsolute(Sector: WORD; VAR Hds, Trk, Sec: BYTE);
- VAR
- h: WORD;
- BEGIN
- Sec := (Sector MOD BPB.SpT) + 1;
- h := Sector DIV BPB.SpT;
- Trk := h DIV BPB.Hds;
- Hds := h MOD BPB.Hds;
- END;
-
- FUNCTION SectorLogical(Hds, Trk, Sec: BYTE): WORD;
- BEGIN
- SectorLogical := Trk * BPB.Hds * BPB.SpT + Hds * BPB.SpT + Sec - 1;
- END;
-
- FUNCTION Cluster(Sector: WORD): WORD;
- BEGIN
- Cluster := ((Sector - (BPB.RDE SHR 4)
- - (BPB.SpF SHL 1) - 1)
- DIV WORD(BPB.Spc)) + 2;
- END;
-
- PROCEDURE ClusterOffset(Cluster: WORD; VAR Offset, Mask: WORD);
- BEGIN
- Offset := Cluster * 3 SHR 1;
- IF Cluster AND 1 = 0 THEN Mask := $FF7 ELSE Mask := $FF70;
- END;
-
- PROCEDURE Format;
- VAR
- i: BYTE;
- BEGIN
- IF RDE AND 15 <> 0 THEN Inc(RDE, 16);
- RDE := RDE SHR 4;
- IF (Spc = 2) AND (RDE AND 1 = 0) THEN Inc(RDE);
- BPB.RDE := RDE SHL 4;
- CASE Sec OF
- 0..8: New1E := @Para08;
- 9: New1E := @Para09;
- 10: New1E := @Para10;
- 11: New1E := @Para11;
- 12..15: New1E := @Para15;
- 17: New1E := @Para17;
- 18: IF LWSec > 17 THEN
- New1E := @Para18
- ELSE
- New1E := @Para18a;
- 19..20: New1E := @Para20;
- 21: New1E := @Para21;
- 22..255:New1E := @Para22;
- END;
- IF GpL <> 0 THEN New1E^[7] := GpL ELSE GpL := New1E^[7];
- WriteLn;
- Write(Text08, Chr(Lw + $41), ': ');
- IF HD THEN WriteLn('High-Density') ELSE WriteLn('Double-Density');
- WriteLn(Hds, Text09, Trk, Text10, Sec, Text11, 'Interleave: ', Il, Text68, GpL);
- WriteLn(BPB.RDE, Text12, Spc, Text13, ShiftT, ':', ShiftH);
- BTTCount := 0;
- WITH Regs DO BEGIN
- FOR i := 1 TO 25 DO BEGIN
- Table[i].f := 2;
- Table2[i]:=0;
- END;
- i := 1;
- n := 1;
- REPEAT
- REPEAT
- WHILE Table2[n] <> 0 DO Inc(n);
- IF n > Sec THEN n := 1;
- UNTIL Table2[n] = 0;
- Table2[n] := i;
- n := n + Il;
- Inc(i);
- UNTIL i > Sec;
- AX := 0;
- BX := 0;
- DL := Lw;
- IF At80 THEN BEGIN
- IF (Trk > 43) AND (Sec > 11) AND (Sec < 16) THEN ATSetDrive(Lw, 79, LWSec, V12, $14, 5);
- IF (Trk > 43) AND (Sec > 11) AND (Sec > 15) THEN ATSetDrive(Lw, 79, LWSec, V144, $14, 5);
- IF (DosDrive IN [0, 1]) AND (Trk > 43) AND (Sec < 12) THEN ATSetDrive(Lw, 79, 9, V720, $53, 4);
- IF (DosDrive IN [2, 7]) AND (Trk > 43) AND (Sec < 12) THEN ATSetDrive(Lw, 79, 9, V720, $97, 4);
- IF (Trk < 44) AND (Sec > 11) THEN ATSetDrive(Lw, 39, LWSec, 0, $34, 3);
- IF (DosDrive IN [2, 7]) AND (Trk < 44) AND (Sec < 12) THEN ATSetDrive(Lw, 39, 9, V360, $B7, 2);
- IF (DosDrive IN [0, 1]) AND (Trk < 44) AND (Sec < 12) THEN ATSetDrive(Lw, 39, 9, V360, $73, 2);
- END;
- IF At80 AND NOT(BIOS) THEN BEGIN
- Write(Text67);
- CASE (DiskId AND $C0) OF
- $00: Write('500');
- $40: Write('300');
- $80: Write('250');
- $C0: Write('???');
- END;
- Write(' kBaud, Double-Stepping: ');
- IF (DiskId AND 32) = 0 THEN
- Write(Text73, ', ')
- ELSE
- Write(Text72, ', ');
- END;
- BPB.Jmp[1] := $EB;
- BPB.Jmp[2] := $40;
- BPB.Jmp[3] := 144;
- BPB.SpT := Sec;
- BPB.Hds := Hds;
- BPB.SHH := 0;
- BPB.BpS := 512;
- BPB.Spc := Spc;
- BPB.Res := 1;
- BPB.FAT := 2;
- BPB.Sec := Sec * BPB.Hds * Trk;
- BPB.Boot_Code := Boot;
- IF ForceMedia = 0 THEN BEGIN
- CASE BPB.Spc OF
- 1: IF (Trk > 44) AND (BPB.SpT IN [12..17]) THEN
- BPB.MDs := $F9
- ELSE
- BPB.MDs := $F0;
- 2: IF Trk IN [1..43] THEN BPB.MDs := $FD ELSE BPB.MDs := $F9;
- ELSE BPB.MDs := $F8;
- END;
- END
- ELSE BPB.MDs := ForceMedia;
- BPB.SpF := Trunc(BPB.Sec * 1.5 / 512 / BPB.Spc) + 1;
- WriteLn('Media-Byte: ', HexF(BPB.MDs, 2)); WriteLn;
- DL := Lw;
- AX := 0;
- REPEAT Int13 UNTIL NOT Again;
- n := 0;
- FillChar(Buffer, SizeOf(Buffer), #0);
- FOR Track := Trk - 1 DOWNTO 0 DO BEGIN
- IF Track <> Trk-1 THEN n := n + ShiftT;
- FOR Head := Hds - 1 DOWNTO 0 DO BEGIN
- IF Head <> Hds - 1 THEN n := n + ShiftH;
- n := n MOD Sec;
- FOR i := 1 TO Sec DO
- Table[i].s := Table2[(i + n - 1) MOD Sec + 1];
- Write(Text14, Head, Text15, Track);
- x := SectorLogical(Head, Track, 1);
- x := Cluster(x);
- FOR i := 1 TO Sec DO BEGIN
- Table[i].t := Track;
- Table[i].h := Head;
- END;
- REPEAT
- AH := 5;
- AL := Sec;
- DL := Lw;
- DH := Head;
- CH := Track;
- CL := 1;
- ES := Seg(Table);
- BX := Ofs(Table);
- Write(' F '#8#8#8);
- Mem[$40:$41] := 0;
- Int13;
- Write(#8,'V '); Write(#13);
- IF NOT(Again OR NoVerify) OR (Track < 3) THEN BEGIN
- AH := 3;
- AL := Sec;
- DL := Lw;
- DH := Head;
- CH := Track;
- CL := 1;
- ES := Seg(Buffer);
- BX := Ofs(Buffer);
- Int13;
- END;
- UNTIL NOT Again;
- IF (FCarry AND Flags) <> 0 THEN BEGIN
- IF (x < 2) OR (x > 10000) THEN BEGIN
- WriteLn(Text17);
- Halt(2);
- END;
- Inc(BTTCount);
- IF BTTCount>20 THEN BEGIN
- WriteLn(Text18, 20 * Sec, Text19);
- Halt(2);
- END;
- BTT[BTTCount].Track := Track;
- BTT[BTTCount].Head := Head;
- WriteLn(Text14, Head, Text15, Track, Text20, #10#13);
- END;
- END;
- END;
- END;
- END;
-
- PROCEDURE WriteBootSect;
- BEGIN
- WITH Regs DO BEGIN
- WriteLn;
- BPB.OEM:='(C)DMV91';
- WriteLn;
- WriteLn(Text21, BPB.OEM); WriteLn(Text22, BPB.Sec);
- WriteLn(Text23, BPB.SpT); WriteLn(Text24, BPB.Hds);
- WriteLn(Text25, BPB.BpS); WriteLn(Text26, BPB.SHH);
- WriteLn(Text27, BPB.Res); WriteLn(Text28, BPB.FAT);
- WriteLn(Text29, BPB.SpF); WriteLn(Text30, Cluster(BPB.Sec) - 2);
- DH := 0;
- DL := Lw;
- CH := 0;
- CL := 1;
- AL := 1;
- AH := 3;
- ES := Seg(BPB);
- BX := Ofs(BPB);
- REPEAT Int13 UNTIL NOT Again;
- FillChar(Buffer[3], 18430, #0);
- Buffer[0] := BPB.MDs;
- Buffer[1] := $FF;
- Buffer[2] := $FF;
- Bad := 0;
- FOR i := 1 TO BTTCount DO
- FOR j := 1 TO Sec DO BEGIN
- x := SectorLogical(BTT[i].Head, BTT[i].Track, j);
- x := Cluster(x);
- ClusterOffset(x, Offset, Mask);
- IF Buffer[Offset] AND Lo(Mask) = 0 THEN Inc(Bad, BPB.Spc * 512);
- Buffer[Offset] := Buffer[Offset] OR Lo(Mask);
- Buffer[Offset + 1] := Buffer[Offset + 1] OR Hi(Mask);
- END;
- ES := Seg(Buffer);
- BX := Ofs(Buffer);
- Inc(CL);
- AL := BPB.SpF;
- REPEAT Int13 UNTIL NOT Again;
- SectorAbsolute(BPB.SpF + 1, DH, CH, CL);
- AH := 3;
- DL := Lw;
- IF BPB.SpF + CL > Sec + 1 THEN AL := Sec - CL + 1;
- REPEAT Int13 UNTIL NOT Again;
- IF BPB.SpF + CL > Sec + 1 THEN BEGIN
- BX := BX + AL * 512;
- AL := BPB.SpF - AL;
- Inc(DH);
- CL := 1;
- REPEAT Int13 UNTIL NOT Again;
- END;
- Bytes := LONGINT(Cluster(BPB.Sec) - 2) * 512 * LONGINT(BPB.Spc);
- WriteLn;
- WriteLn(Bytes: 9, Text31);
- IF Bad <> 0 THEN WriteLn(Bad: 9, Text32);
- WriteLn(Bytes - Bad: 9, Text33);
- WriteLn;
- END;
- END;
-
- PROCEDURE WriteSys; (* Das kann man auch anders machen !!! *)
- VAR
- ComSpec: STRING[40];
- BEGIN
- ComSpec := GetEnv('COMSPEC');
- Exec(ComSpec, '/C SYS ' + Chr(Lw + $41) + ':');
- Exec(ComSpec,'/C COPY '+ ComSpec + ' ' + Chr(Lw + $41) + ':\ > NUL');
- END;
-
- PROCEDURE WriteLabel(x: STRING);
- VAR i: BYTE;
- BEGIN
- WITH Regs DO BEGIN
- IF x = '' THEN BEGIN
- REPEAT
- Write(Text74);
- ReadLn(x);
- UNTIL Length(x) < 12;
- END;
- IF x <> '' THEN BEGIN
- IF Length(x)>8 THEN Insert('.',x,9);
- x := Chr(Lw + $41) + ':\' + x;
- x[Length(x) + 1] := #0;
- CX := 8;
- DS := Seg(x);
- DX := Ofs(x) + 1;
- AH := $3C;
- MsDos(Regs);
- IF (FCarry AND Flags) <> 0 THEN BEGIN
- WriteLn(Text75);
- Exit;
- END;
- BX := AX;
- AH := $3E;
- MsDos(Regs);
- IF (FCarry AND Flags) <> 0 THEN BEGIN
- WriteLn(Text75);
- Halt(32);
- END;
- END;
- END;
- END;
-
- PROCEDURE DrivePrt;
- BEGIN
- WriteLn;
- IF LWTrk = 0 THEN BEGIN
- WriteLn(Text34);
- Exit;
- END;
- Write(Text35, Chr(Lw + $41));
- IF LWHd THEN
- Write(': High-Density, ')
- ELSE
- Write(': Double-Density, ');
- WriteLn(LWTrk + 1, Text10, LWSec, Text11);
- Write(Text36);
- IF PC80 = $20 THEN WriteLn(Text37);
- IF PC80 = $40 THEN WriteLn(Text38);
- IF At80 THEN WriteLn(Text39);
- IF NOT(At80) AND (PC80=0) THEN WriteLn(Text40);
- WriteLn;
- END;
-
- PROCEDURE SyntaxError;
- BEGIN
- WriteLn;
- WriteLn(Text41);
- WriteLn;
- WriteLn(Text42);
- WriteLn(Text43);
- WriteLn;
- WriteLn(Text44);
- WriteLn;
- WriteLn(Text45);
- WriteLn(Text46);
- WriteLn(Text47);
- WriteLn(Text48);
- WriteLn(Text49);
- WriteLn(Text50);
- WriteLn(Text51);
- WriteLn(Text52);
- WriteLn(Text53);
- WriteLn(Text69);
- WriteLn(Text70);
- WriteLn;
- WriteLn(Text71);
- Halt(1);
- END;
-
- PROCEDURE CheckDos;
- VAR Version: WORD;
- BEGIN
- Version := Swap(DosVersion);
- IF Version < $314 THEN BEGIN
- WriteLn(Text54);
- Halt(128);
- END;
- END;
-
- BEGIN (* Main *)
- WriteLn;
- WriteLn(Text55);
- WriteLn(Text56);
- CheckDos;
- GetIntVec($1E, Old1E);
- New1E := Old1E;
- Parse;
- NoVerify := FALSE;
- IF (Length(Para[1]) <> 2) OR (Para[1, 2] <> ':') THEN SyntaxError;
- Lw:=Ord(UpCase(Para[1, 1])) - $41;
- ShiftT := 0;
- ShiftH := 0;
- CfgRead;
- DriveTyp(Lw, LWHd, LWTrk, LWSec);
- DrivePrt;
- IF (LWTrk = 0) AND (Para[1] <> '') THEN Halt(1);
- RDE := 0;
- Il := 0;
- Spc := 0;
- GpL := 0;
- SetLabel := FALSE;
- Sys := FALSE;
- ForceType := 0;
- ForceMedia := 0;
- Batch := FALSE;
- Trk := LWTrk + 1;
- Sec := LWSec;
- Hds := 2;
- FOR i := 2 TO PCount DO
- IF Para[i] <> '' THEN BEGIN
- CHX := Para[i, 1];
- IF UpCase(CHX) = 'V' THEN BEGIN
- DLabel := '';
- SetLabel := TRUE;
- DLabel := Copy(Para[i], 2, 11);
- END ELSE IF Length(Para[i]) = 1 THEN BEGIN
- CASE UpCase(CHX) OF
- 'P': BEGIN END;
- 'R': NoVerify := TRUE;
- 'O': BEGIN
- Trk := 80;
- Sec := 9;
- RDE := 144;
- END;
- '4': BEGIN
- Trk := 40;
- Sec := 9;
- END;
- '1': BEGIN
- Hds := 1;
- END;
- '8': BEGIN
- Sec := 8;
- END;
- 'S': BEGIN
- Sys := TRUE;
- END;
- 'K': BEGIN
- Batch := TRUE;
- END;
- ELSE SyntaxError;
- END;
- END ELSE BEGIN
- IF Para[i, 2]= '$' THEN BEGIN
- n := DezH(Copy(Para[i], 3, 255));
- j := BaseError
- END ELSE Val(Copy(Para[i], 2, 255), n, j);
- IF j <> 0 THEN SyntaxError;
- CASE UpCase(Para[i, 1]) OF
- 'T': Trk := n;
- 'H': Hds := n;
- 'N': Sec := n;
- 'S': Sec := n;
- 'M': ForceMedia := n;
- 'D': RDE := n;
- 'C': Spc := n;
- 'I': Il := n;
- 'G': GpL := n;
- 'X': ShiftH := n;
- 'Y': ShiftT := n;
- 'B': ForceType := n;
- 'F': BEGIN
- Found := FALSE;
- FOR j := 1 TO MaxForm DO
- IF NOT(Found) AND (n = FTab[j].Fmt) THEN BEGIN
- Trk := FTab[j].Trk;
- Sec := FTab[j].Sec;
- Hds := FTab[j].Hds;
- Found := TRUE;
- END;
- IF NOT(Found) THEN SyntaxError;
- END;
- ELSE SyntaxError;
- END;
- END;
- END;
- IF Sec > 11 THEN HD := TRUE ELSE HD := FALSE;
- IF RDE = 0 THEN
- CASE HD OF
- TRUE: RDE := 224;
- FALSE: RDE := 112;
- END;
- IF Spc = 0 THEN
- CASE HD OF
- TRUE: Spc := 1;
- FALSE: Spc := 2;
- END;
- IF Il = 0 THEN
- IF Sec - LWSec IN [3..8] THEN Il := 2 ELSE Il := 1;
- IF NOT (Hds IN [1..2]) THEN BEGIN
- WriteLn(Text57);
- Halt(1);
- END;
- IF Trk < 1 THEN BEGIN
- WriteLn(Text58);
- Halt(1);
- END;
- IF Il >= Pred(Sec) THEN BEGIN
- WriteLn(Text59, Pred(Sec), Text60);
- Halt(1);
- END;
- IF NOT(Spc IN [1..2]) THEN
- WriteLn(Text61);
- IF SHORTINT(Trk - LWTrk) > 4 THEN
- WriteLn(Text62);
- IF RDE > 240 THEN
- WriteLn(Text63);
- IF NOT(Batch) THEN BEGIN
- WriteLn;
- WriteLn(Text64, Chr(Lw + $41),Text65);
- WriteLn(Text66);
- CHX := ReadKey;
- END;
- Format;
- WriteBootSect;
- IF Sys THEN WriteSys;
- IF SetLabel THEN WriteLabel(DLabel);
- END. (* Main *)
-
- (*------------------------------------------------------------*)