[Back to DRIVES SWAG index] [Back to Main SWAG index] [Original]
{ Updated DRIVES.SWG on October 13, 1993 }
{ This give all the info on a bootable drive }
{ it replaces the EXIST-DD in DRIVES.SWG which DID NOT work }
{ updated by GDAVIS 10/13/93 }
Uses
Crt,Dos;
Type
bootrecptr = ^bootRecord;
bootRecord = Record
nj : Array[0..2] of Byte; {offset 0 Near jump code }
oem : Array[0..7] of Byte; { 3 OEM name and ver }
Bytesec : Word; { 11 Bytes/Sector }
sectclus : Byte; { 13 Sectors/cluster }
ressect : Word; { 14 Reserved sectors }
fattables: Byte; { 16 FAT tables }
direntrys: Word; { 17 Directory entries}
logsec : Word; { 19 Logical sectors }
MDS : Byte; { 21 Media descriptor }
FatSects : Word; { 22 FAT sectors }
Secstrak : Word; { 24 Sectors/track }
NumHeads : Word; { 26 Number of heads }
HidnSecs : Word; { 28 Hidden sectors }
bootcode : Array[0..415] of Byte; { 30 boot code }
partcode : Array[0..15] of Byte; { 446 partition info }
bootcode2: Array[0..49] of Byte; { 462 rest of boot code}
end;
Var
boot : bootRecord; { the boot Record Variable }
FUNCTION DiskRead (Drive : CHAR; SSect, NSect : WORD; VAR Buffer) : WORD;
{ Read absolute disk sectors }
VAR
kbuff : ARRAY [0..$1f] OF BYTE; {Read Ralf Brown's interrupt listing}
kPtr : POINTER; {Int 25h - ES:[BP+1E] may change }
bufPtr : POINTER;
BEGIN
kPtr := @kbuff;
BufPtr := @buffer;
Asm
push es
push bp
push di
les di, kPtr { move past first 31 bytes }
mov al, drive { Gets the passed parameter. }
AND al, 1fh { Cvt from ASCII to drive num }
DEC al { Adjust because A: is drive 0 }
mov cx, nsect { number of sectors to read }
mov dx, ssect { starting at sector.. }
push ds
lds bx, bufptr { Get the address of the buffer }
mov bp, di
push si
INT 25h { Do the drive read. }
pop si { Remove the flags int 25h leaves on stack}
pop si
pop ds
pop di
pop bp
pop es
jc @1
mov @result, 0 { No errors, so set Function to zero }
jmp @Escape
@1 :
mov @result, ax
@Escape :
END;
END;
Procedure bootlook(Drive : Char);
Var
ReadResult : WORD;
I : Integer;
begin
{ Get diskette info }
ReadResult := DiskRead(Drive,0,1,boot);
if ReadResult <> 0 then
begin
{ Error code here , there are LOTS of them.. see a good DOS book
most common will be :
2 = Drive NOT ready
7 = unknown media .. not a boot disk
8 = sector not found .. not a boot disk }
Writeln(LO(ReadResult));
end
else
begin
WITH Boot DO
BEGIN
{ I'll just print a few of the possible items }
Write('OEM : ');
FOR I := 0 TO 7 DO WRITE(CHR(OEM[i]));
Writeln;
WriteLn('Dir Entrys : ',DirEntrys : 4);
WriteLn('Fat Tables : ',FatTables : 4);
WriteLn('Num Heads : ',NumHeads : 4);
WriteLn('Secs p/Trk : ',SecsTrak : 4);
WriteLn('Hidden Secs : ',HidnSecs : 4);
END;
end;
end; { Procedure bootlook }
BEGIN
ClrScr;
BootLook('B'); { if drive isn't bootable, you'll get an error (7) }
Readkey; { try it, this is a safe procedure }
END.
[Back to DRIVES SWAG index] [Back to Main SWAG index] [Original]