home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 9 Archive / 09-Archive.zip / PAX20.ZIP / DISKAPI.C < prev    next >
C/C++ Source or Header  |  1990-11-12  |  4KB  |  193 lines

  1. /* DISKAPI.C
  2.  *
  3.  * Autor:    Kai Uwe Rommel
  4.  * Datum:    Thu 28-Dec-1989
  5.  * Stand:    Sun 14-Jan-1990
  6.  *
  7.  * Compiler: MS C ab 5.00
  8.  * System:   PC/MS-DOS ab 3.20
  9.  *
  10.  */
  11.  
  12. #include <dos.h>
  13.  
  14. #include "diskacc.h"
  15.  
  16.  
  17. #define DSTEP(x)       (* (char far *) (0x00400090L + (x)))
  18. #define INC(ptr, x)    (ptr = (PVOID) ((PBYTE) ptr + x * 512))
  19.  
  20. extern int diskint(int service, int drive, int head, int track,
  21.                    int sector, int nsects, void far *buffer);
  22.  
  23.  
  24. static int test_sector(int drive, int side, int track, int sector)
  25. {
  26.   return (diskint(4, drive, side, track, sector, 1, NULL) == 1);
  27. }
  28.  
  29.  
  30. INT APIENTRY DskOpen(USHORT drive, PUSHORT sides,
  31.                      PUSHORT tracks, PUSHORT sectors)
  32. {
  33.   int cnt, erg;
  34.  
  35.   if ( drive > 1 )
  36.     return -1;
  37.  
  38.   diskint(0, drive, 0, 0, 0, 0, NULL);
  39.  
  40.   for ( cnt = 0; cnt < 3; cnt++ )
  41.     if ( erg = test_sector(drive, 0, 0, 1) )
  42.       break;
  43.  
  44.   if ( ! erg )
  45.     return -1;
  46.  
  47.   for ( cnt = 8; cnt <= 10; cnt ++ )
  48.     if ( test_sector(drive, 0, 0, cnt) )
  49.       *sectors = cnt;
  50.     else
  51.       break;
  52.  
  53.   if ( *sectors == 10 )
  54.     for ( cnt = 15; cnt <= 20; cnt ++ )
  55.       if ( test_sector(drive, 0, 0, cnt) )
  56.         *sectors = cnt;
  57.       else
  58.         break;
  59.  
  60.   *sides = test_sector(drive, 1, 0, 1) ? 2 : 1;
  61.  
  62.   if ( DSTEP(drive) & 0x20 )
  63.     if ( !test_sector(drive, 0, 1, 1) )
  64.     {
  65.        DSTEP(drive) &= ~0x20;
  66.  
  67.        if ( !test_sector(drive, 0, 1, 1) )
  68.           return -1;
  69.     }
  70.  
  71.   *tracks = (DSTEP(drive) & 0x20) ? 40 : 80;
  72.  
  73.   return drive + 1;
  74. }
  75.  
  76.  
  77. VOID APIENTRY DskClose(USHORT handle)
  78. {
  79.   if ( (handle < 1) || (2 < handle) )
  80.     return;
  81.  
  82.   diskint(0, handle - 1, 0, 0, 0, 0, NULL);
  83. }
  84.  
  85.  
  86. static int dmaborder(PVOID buf, USHORT nsects)
  87. {
  88.   unsigned long lo, hi;
  89.  
  90.   lo = ((long) FP_SEG(buf) << 4) + (long) FP_OFF(buf);
  91.   hi = lo + nsects * 512L - 1;
  92.  
  93.   if ( (lo & 0xFFFF0000) == (hi & 0xFFFF0000) )
  94.     return -1;
  95.  
  96.   return (int) (((hi & 0xFFFF0000) - lo) / 512L);
  97. }
  98.  
  99.  
  100. INT APIENTRY DskRead(USHORT handle, USHORT side, USHORT  track,
  101.                      USHORT sector, USHORT nsects, PVOID buf)
  102. {
  103.   char buffer[1024], *ptr;
  104.   int dma, cnt;
  105.  
  106.   if ( (handle < 1) || (2 < handle) )
  107.     return -1;
  108.  
  109.   if ( (dma = dmaborder(buf, nsects)) == -1 )
  110.   {
  111.     if ( diskint(2, handle - 1, side, track, sector, nsects, buf) != nsects )
  112.       return -1;
  113.   }
  114.   else
  115.   {
  116.     ptr = (dmaborder(buffer, 1) == -1) ? buffer : buffer + 512;
  117.  
  118.     if ( dma > 0 )
  119.     {
  120.       if ( diskint(2, handle - 1, side, track, sector, dma, buf) != dma )
  121.         return -1;
  122.  
  123.       INC(buf, dma);
  124.       sector += dma;
  125.       nsects -= dma;
  126.     }
  127.  
  128.     if ( diskint(2, handle - 1, side, track, sector, 1, ptr) != 1 )
  129.       return -1;
  130.  
  131.     for ( cnt = 0; cnt < 512; cnt++ )
  132.       ((PBYTE) buf)[cnt] = ptr[cnt];
  133.  
  134.     INC(buf, 1);
  135.     sector++;
  136.     nsects--;
  137.  
  138.     if ( diskint(2, handle - 1, side, track, sector, nsects, buf) != nsects )
  139.       return -1;
  140.   }
  141.  
  142.   return 0;
  143. }
  144.  
  145.  
  146. INT APIENTRY DskWrite(USHORT handle, USHORT side, USHORT  track,
  147.                       USHORT sector, USHORT nsects, PVOID buf)
  148. {
  149.   char buffer[1024], *ptr;
  150.   int dma, cnt;
  151.  
  152.   if ( (handle < 1) || (2 < handle) )
  153.     return -1;
  154.  
  155.   if ( (dma = dmaborder(buf, nsects)) == -1 )
  156.   {
  157.     if ( diskint(3, handle - 1, side, track, sector, nsects, buf) != nsects )
  158.       return -1;
  159.   }
  160.   else
  161.   {
  162.     ptr = (dmaborder(buffer, 1) == -1) ? buffer : buffer + 512;
  163.  
  164.     if ( dma > 0 )
  165.     {
  166.       if ( diskint(3, handle - 1, side, track, sector, dma, buf) != dma )
  167.         return -1;
  168.  
  169.       INC(buf, dma);
  170.       sector += dma;
  171.       nsects -= dma;
  172.     }
  173.  
  174.     for ( cnt = 0; cnt < 512; cnt++ )
  175.       ptr[cnt] = ((PBYTE) buf)[cnt];
  176.  
  177.     if ( diskint(3, handle - 1, side, track, sector, 1, ptr) != 1 )
  178.       return -1;
  179.  
  180.     INC(buf, 1);
  181.     sector++;
  182.     nsects--;
  183.  
  184.     if ( diskint(3, handle - 1, side, track, sector, nsects, buf) != nsects )
  185.       return -1;
  186.   }
  187.  
  188.   return 0;
  189. }
  190.  
  191.  
  192. /* Ende DISKAPI.C */
  193.