home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ZSYS / SIMTEL20 / SYSLIB / SLIB1.LBR / SDIR03.Z80 < prev    next >
Text File  |  2000-06-30  |  2KB  |  83 lines

  1. ;
  2. ; SYSLIB Module Name:  SDIR03
  3. ; Author:  Richard Conn
  4. ; Part of SYSLIB3 SDIR Series
  5. ; SYSLIB Version Number:  3.6
  6. ; Module Version Number:  1.5
  7.  
  8.     public    dfree
  9.  
  10.     MACLIB    SDIRHDR.LIB
  11.  
  12. ;*
  13. ;*  COMPUTE AMOUNT OF FREE SPACE LEFT ON DISK
  14. ;*    ON EXIT, DE=AMOUNT OF FREE SPACE ON DISK IN K
  15. ;*    THE DPARAMS ROUTINE MUST BE CALLED BEFORE THIS ROUTINE IS USED
  16. ;*
  17. DFREE:
  18.     PUSH    BC    ; SAVE REGS
  19.     PUSH    HL
  20.     PUSH    AF
  21.     LD    C,27    ; GET ADDRESS OF ALLOCATION VECTOR
  22.     CALL    BDOS
  23.     EX    DE,HL
  24.     LD    HL,(BLKMAX)    ; GET LENGTH OF ALLOCATION VECTOR
  25.     LD    BC,0    ; INIT BLOCK COUNT TO 0
  26.  
  27. ;*
  28. ;*  BC IS ACCUMULATOR FOR SPACE
  29. ;*
  30. FREE1:
  31.     PUSH    DE    ; SAVE ALLOC ADDRESS
  32.     LD    A,(DE)    ; GET BIT PATTERN OF ALLOCATION BYTE
  33.     LD    E,8    ; SET TO PROCESS 8 BLOCKS
  34. FREE2:
  35.     RLA        ; ROTATE ALLOCATED BLOCK BIT INTO CARRY FLAG
  36.     JP    C,FREE3    ; IF SET (BIT=1), BLOCK IS ALLOCATED
  37.     INC    BC    ; IF NOT SET, BLOCK IS NOT ALLOCATED, SO INCREMENT
  38.             ;   FREE BLOCK COUNT
  39. FREE3:
  40.     LD    D,A    ; SAVE REMAINING ALLOCATION BITS IN D
  41.     DEC    HL    ; COUNT DOWN NUMBER OF BLOCKS ON DISK
  42.     LD    A,L
  43.     OR    H
  44.     JP    Z,FREE4    ; DONE IF NO MORE BLOCKS LEFT
  45.     LD    A,D    ; A=CURRENT ALLOCATION BIT PATTERN
  46.     DEC    E    ; HAVE ALL 8 BITS BEEN EXAMINED?
  47.     JP    NZ,FREE2    ; CONTINUE IF NOT
  48.     POP    DE    ; GET POINTER TO ALLOCATION VECTOR
  49.     INC    DE    ; POINT TO NEXT ALLOCATION BYTE
  50.     JP    FREE1    ; CONTINUE BY PROCESSING NEXT ALLOCATION BYTE
  51.  
  52. ;*
  53. ;*  BC = TOTAL AMOUNT OF FREE SPACE IN TERMS OF BLOCKS
  54. ;*
  55. FREE4:
  56.     POP    DE    ; CLEAR DE FROM STACK
  57.     LD    L,C    ; HL=BC=NUMBER OF FREE BLOCKS
  58.     LD    H,B
  59.     LD    A,(BLKSHF)    ; GET BLOCK SHIFT FACTOR
  60.     SUB    3    ; CONVERT NUMBER OF BLOCKS TO K
  61.     JP    Z,FREE6    ; DONE IF SINGLE DENSITY (1K PER BLOCK)
  62.  
  63. ;*
  64. ;*  WE ARE AT A MORE ADVANCED DENSITY LEVEL; MULTIPLY THE NUMBER OF BLOCKS
  65. ;*    BY THE SIZE OF A BLOCK IN K
  66. ;*
  67. FREE5:
  68.     ADD    HL,HL    ; 2, 4, 8, 16, ETC K/BLK, SO BLOCK SHIFT FACTOR
  69.     DEC    A    ;   IS A POWER-OF-TWO MULTIPLE
  70.     JP    NZ,FREE5
  71.  
  72. ;*
  73. ;*  AT THIS POINT, HL=AMOUNT OF FREE SPACE ON DISK IN K
  74. ;*
  75. FREE6:
  76.     EX    DE,HL    ; DE=ANSWER
  77.     POP    AF    ; RESTORE REGS
  78.     POP    HL
  79.     POP    BC
  80.     RET
  81.  
  82.     END
  83.