home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2000 May
/
Chip_2000-05_cd2.bin
/
dosutils
/
gtar109
/
diskapi.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-01-14
|
5KB
|
240 lines
/* DISKAPI.C
*
* Autor: Kai Uwe Rommel
* Datum: Thu 28-Dec-1989
* Stand: Tue 7-Aug-1990
*
* Compiler: MS C ab 5.10
* System: PC/MS-DOS ab 3.20
*
* Direct disk access library for OS/2 protected mode and MS-DOS.
*
* - API simulation for MS-DOS.
*/
#include <dos.h>
#include "diskacc.h"
#define RETRIES 3
#define DSTEP(x) (* (char far *) (0x00400090L + (x)))
#define INC(ptr, x) (ptr = (PVOID) ((PBYTE) ptr + x * 512))
#ifdef DOSBUG
static int dosbug;
#endif
extern int diskint(int service, int drive, int head, int track,
int sector, int nsects, PBYTE buffer);
static int test_sector(int drive, int side, int track, int sector)
{
return (diskint(4, drive, side, track, sector, 1, NULL) == 0);
}
INT APIENTRY DskOpen(USHORT drive, PUSHORT sides,
PUSHORT tracks, PUSHORT sectors)
{
int cnt, erg;
if ( drive > 1 )
return -1;
diskint(0, drive, 0, 0, 0, 0, NULL);
for ( cnt = 0; cnt < 3; cnt++ )
if ( erg = test_sector(drive, 0, 0, 1) )
break;
if ( ! erg )
return -1;
for ( cnt = 8; cnt <= 10; cnt ++ )
if ( test_sector(drive, 0, 0, cnt) )
*sectors = cnt;
else
break;
if ( *sectors == 10 )
for ( cnt = 15; cnt <= 20; cnt ++ )
if ( test_sector(drive, 0, 0, cnt) )
*sectors = cnt;
else
break;
*sides = test_sector(drive, 1, 0, 1) ? 2 : 1;
if ( DSTEP(drive) & 0x20 )
if ( !test_sector(drive, 0, 1, 1) )
{
DSTEP(drive) &= ~0x20;
if ( !test_sector(drive, 0, 1, 1) )
return -1;
}
*tracks = (DSTEP(drive) & 0x20) ? 40 : 80;
#ifdef DOSBUG
if ( *sectors > 9 )
dosbug = diskint(4, drive, 1, 0, 9, 2, NULL);
else
dosbug = 0;
#endif
return drive + 1;
}
VOID APIENTRY DskClose(USHORT handle)
{
if ( (handle < 1) || (2 < handle) )
return;
diskint(0, handle - 1, 0, 0, 0, 0, NULL);
}
static int dmaborder(PVOID buf, USHORT nsects)
{
unsigned long lo, hi;
lo = ((long) FP_SEG(buf) << 4) + (long) FP_OFF(buf);
hi = lo + nsects * 512L - 1;
if ( (lo & 0xFFFF0000) == (hi & 0xFFFF0000) )
return -1;
return (int) (((hi & 0xFFFF0000) - lo) / 512L);
}
int diskint3r(int f, int drive, int head, int track,
int sector, int nsects, PBYTE buf)
{
int cnt, rc;
for ( cnt = 0; cnt < RETRIES; cnt++ )
{
#ifdef DOSBUG
if ( dosbug && (sector < 10) && (sector + nsects > 10) )
{ /* what an ugly bug in several DOS versions ... */
rc = diskint(f, drive, head, track, sector, 10 - sector, buf);
rc += diskint(f, drive, head, track, 10, sector + nsects - 10,
buf + (10 - sector) * 512);
}
else
#endif
rc = diskint(f, drive, head, track, sector, nsects, buf);
if ( rc == 0 )
return 0;
else
diskint(0, drive, 0, 0, 0, 0, NULL);
}
return -1;
}
INT APIENTRY DskRead(USHORT handle, USHORT side, USHORT track,
USHORT sector, USHORT nsects, PVOID buf)
{
char buffer[1024], *ptr;
int dma, cnt;
if ( (handle < 1) || (2 < handle) )
return -1;
if ( (dma = dmaborder(buf, nsects)) == -1 )
{
if ( diskint3r(2, handle - 1, side, track, sector, nsects, buf) )
return -1;
}
else
{
ptr = (dmaborder(buffer, 1) == -1) ? buffer : buffer + 512;
if ( dma > 0 )
{
if ( diskint3r(2, handle - 1, side, track, sector, dma, buf) )
return -1;
INC(buf, dma);
sector += dma;
nsects -= dma;
}
if ( diskint3r(2, handle - 1, side, track, sector, 1, ptr) )
return -1;
for ( cnt = 0; cnt < 512; cnt++ )
((PBYTE) buf)[cnt] = ptr[cnt];
INC(buf, 1);
sector++;
nsects--;
if ( nsects > 0 )
if ( diskint3r(2, handle - 1, side, track, sector, nsects, buf) )
return -1;
}
return 0;
}
INT APIENTRY DskWrite(USHORT handle, USHORT side, USHORT track,
USHORT sector, USHORT nsects, PVOID buf)
{
char buffer[1024], *ptr;
int dma, cnt;
if ( (handle < 1) || (2 < handle) )
return -1;
if ( (dma = dmaborder(buf, nsects)) == -1 )
{
if ( diskint3r(3, handle - 1, side, track, sector, nsects, buf) )
return -1;
}
else
{
ptr = (dmaborder(buffer, 1) == -1) ? buffer : buffer + 512;
if ( dma > 0 )
{
if ( diskint3r(3, handle - 1, side, track, sector, dma, buf) )
return -1;
INC(buf, dma);
sector += dma;
nsects -= dma;
}
for ( cnt = 0; cnt < 512; cnt++ )
ptr[cnt] = ((PBYTE) buf)[cnt];
if ( diskint3r(3, handle - 1, side, track, sector, 1, ptr) )
return -1;
INC(buf, 1);
sector++;
nsects--;
if ( nsects > 0 )
if ( diskint3r(3, handle - 1, side, track, sector, nsects, buf) )
return -1;
}
return 0;
}
/* Ende DISKAPI.C */