home *** CD-ROM | disk | FTP | other *** search
- PROGRAM DiskIo;
-
- {
- | Purpose : Allow direct disk reads and writes via BIOS INTs
- | Author : David A. Peterson
- | Created : 6 Dec 1985
- | Mods : < Listed most recent first >
- }
-
- CONST
- Null = #00;
- ReadDisk = $13; { Absolute disk read via BIOS INTerrupt }
- WriteDisk = $13; { Absolute disk write via BIOS INTerrupt }
- BufferSize = 32767; { Number of bytes for disk buffer use }
- DriveA = 0;
- DriveB = 1;
- DriveC = 2;
- DriveD = 3;
-
- TYPE
- DiskBuffer = ARRAY [0 .. 0] OF Byte;
- _String = String[80];
- Registers =
- RECORD
- Ax, Bx, Cx, Dx, Bp, Si, Di, Ds, Es, Flags : Integer
- END;
-
- VAR
- DiskBuf : ^DiskBuffer;
- Regs : Registers;
- Count : Integer;
-
- FUNCTION Bit ( Check, Num : Integer ) : Byte;
-
- VAR
- Test : Integer;
-
- BEGIN { Bit }
- Test := 1 SHL Num;
- Bit := Ord ( (Check AND Test) > 0)
- END; { Bit }
-
- FUNCTION DiskRead ( Drive, Head, Track, Sector, Number : Integer ) : Byte;
-
- BEGIN { DiskRead }
- IF Number = 0 THEN
- BEGIN
- WriteLn;
- WriteLn ('No data to transfer')
- END
- ELSE IF Number > 255 THEN
- BEGIN
- WriteLn;
- WriteLn ('Too many sectors to read - ', Number)
- END;
- WITH Regs DO
- BEGIN
- Ax := Number + 2 * 256;
- Dx := Drive + Head * 256;
- Cx := Sector + Track * 256;
- Es := Seg (DiskBuf);
- Bx := Ofs (DiskBuf)
- END;
- Intr (ReadDisk, Regs);
- IF Bit (Regs.Flags, 0) = 1 THEN
- Write (' Error ')
- ELSE
- BEGIN
- FOR Count := 0 TO 15 DO
- Write (Bit (Regs.Flags, Count) );
- Write (' ')
- END;
- DiskRead := Regs.Ax DIV 256
- END; { DiskRead }
-
- FUNCTION DiskWrite ( Drive, Head, Track, Sector, Number : Integer ) : Byte;
-
- BEGIN { DiskWrite }
- IF Number = 0 THEN
- BEGIN
- WriteLn;
- WriteLn ('No data to transfer')
- END
- ELSE IF Number > 255 THEN
- BEGIN
- WriteLn;
- WriteLn ('Too many sectors to write - ', Number)
- END;
- WITH Regs DO
- BEGIN
- Ax := Number + 3 * 256;
- Dx := Drive + Head * 256;
- Cx := Sector + Track * 256;
- Es := Seg (DiskBuf);
- Bx := Ofs (DiskBuf)
- END;
- Intr (WriteDisk, Regs);
- IF Bit (Regs.Flags, 0) = 1 THEN
- Write (' Error ')
- ELSE
- BEGIN
- FOR Count := 0 TO 15 DO
- Write (Bit (Regs.Flags, Count) );
- Write (' ')
- END;
- DiskWrite := Regs.Ax DIV 256
- END; { DiskWrite }
-
- FUNCTION ErrorStr ( ErrorNum : Byte ) : _String;
-
- BEGIN { ErrorStr }
- CASE ErrorNum OF
- $00 : ErrorStr := 'Ok';
- $01 : ErrorStr := 'Bad command';
- $02 : ErrorStr := 'Address mark not found';
- $03 : ErrorStr := 'Write protected disk';
- $04 : ErrorStr := 'Requested sector not found';
- $08 : ErrorStr := 'DMA overrun';
- $09 : ErrorStr := 'Attempt to cross 64K boundary';
- $10 : ErrorStr := 'Bad CRC on disk read';
- $20 : ErrorStr := 'NEC controller has failed';
- $40 : ErrorStr := 'Bad seek';
- $80 : ErrorStr := 'Drive timed out'
- ELSE
- BEGIN
- Write (ErrorNum, ' ');
- ErrorStr := 'Unknown error'
- END
- END
- END; { ErrorStr }
-
- BEGIN { DiskIo }
- New (DiskBuf);
- GetMem (DiskBuf, BufferSize);
- WriteLn;
- WriteLn ('Disk read ', ErrorStr (DiskRead (DriveB, 0, 0, 1, 1) ) )
- END { DiskIo }.