home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol291 / free.inc < prev    next >
Encoding:
Text File  |  1986-12-22  |  3.5 KB  |  72 lines

  1. function FreeSpace(Drive: char): integer;
  2. { This function finds and reads the bit map for the selected
  3.   disk, and returns the space remaining in K.  Drive is in the
  4.   range A..P, and must be legal for your system.
  5.   If the Drive passed is not in A..P  then current drive is used. }
  6.  
  7.   const
  8.     Current_Drive = 25;
  9.     Set_Drive     = 14;
  10.  
  11.   var
  12.     HomeDrive, blkshf : byte;
  13.     blkmax, free : integer;
  14.  
  15.   begin
  16.     HomeDrive := BDOS(Current_Drive); {get the present disk #}
  17.     if Drive in ['A'..'P'] then
  18.       BDOS(Set_Drive,ord(Drive)-$41);  {drive must be in 0..15}
  19.     INLINE (
  20.        $0E/$1F/       {        LD      C,CURDPB    ;Request DPB}
  21.        $CD/$05/$00/   {        CALL    BDOS}
  22.        $23/           {        INC     HL}
  23.        $23/           {        INC     HL}
  24.        $7E/           {        LD      A,(HL)      ;Get block shift}
  25.        $32/BLKSHF/    {        LD      (BLKSHF),A}
  26.        $23/           {        INC     HL          ;Bump to block max}
  27.        $23/           {        INC     HL}
  28.        $23/           {        INC     HL}
  29.        $5E/           {        LD      E,(HL)      ;Get max block #}
  30.        $23/           {        INC     HL}
  31.        $56/           {        LD      D,(HL)}
  32.        $EB/           {        EX      DE,HL}
  33.        $22/BLKMAX/    {        LD      (BLKMAX),HL ;Save it}
  34.        $0E/$1B/       {        LD      C,GALLOC    ;Get address of allocation vector}
  35.        $CD/$05/$00/   {        CALL    BDOS}
  36.        $EB/           {        EX      DE,HL}
  37.        $2A/BLKMAX/    {        LD      HL,(BLKMAX) ;Get its length}
  38.        $23/           {        INC     HL}
  39.        $01/$00/$00/   {        LD      BC,0        ;Init block count to 0}
  40.        $D5/           {GSPBYT: PUSH    DE          ;Save alloc address}
  41.        $1A/           {        LD      A,(DE)}
  42.        $1E/$08/       {        LD      E,8         ;Set to process 8 blocks}
  43.        $17/           {GSPLUP: RLA                 ;Test bit}
  44.        $38/$01/       {        JR      C,NOTFRE}
  45.        $03/           {        INC     BC}
  46.        $57/           {NOTFRE: LD      D,A         ;Save bits}
  47.        $2B/           {        DEC     HL          ;Count down blocks}
  48.        $7D/           {        LD      A,L}
  49.        $B4/           {        OR      H}
  50.        $28/$08/       {        JR      Z,ENDALC    ;Quit if out of blocks}
  51.        $7A/           {        LD      A,D         ;Restore bits}
  52.        $1D/           {        DEC     E           ;Count down 8 bits}
  53.        $20/$F2/       {        JR      NZ,GSPLUP           ;Do another bit}
  54.        $D1/           {        POP     DE          ;Bump to next byte..}
  55.        $13/           {        INC     DE          ;..of alloc. vector}
  56.        $18/$EA/       {        JR      GSPBYT      ;Process it}
  57.        $D1/           {ENDALC: POP     DE          ;Clear allocation vector pointer from stack}
  58.        $69/           {        LD      L,C         ;Copy blocks to hl}
  59.        $60/           {        LD      H,B}
  60.        $3A/BLKSHF/    {        LD      A,(BLKSHF)  ;Get block shift factor}
  61.        $D6/$03/       {        SUB     3           ;Convert from sectors to K}
  62.        $28/$04/       {        JR      Z,SAVFRE    ;Skip shifts if 1K blocks - return free in HL}
  63.        $29/           {FREKLP: ADD     HL,HL       ;Multiply blocks by K/BLK}
  64.        $3D/           {        DEC     A}
  65.        $20/$FC/       {        JR      NZ,FREKLP}
  66.        $22/FREE/      {SAVFRE: LD      (Free),HL   ;Save the free space for later}
  67.        $00);
  68.     BDOS(Set_Drive, HomeDrive);  {reselect original disk}
  69.     FreeSpace := free;
  70.   end;
  71.  
  72.