home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / jsage / znode3 / z3sys / rcpspace.lbr / RCPSPACE.AQM / RCPSPACE.AZM
Encoding:
Text File  |  1993-06-08  |  5.0 KB  |  229 lines

  1. ; SPACE routine for Z-systems RCP. 3-24-86 by Carson Wilson
  2. ; This routine is written as a complete program for demonstration and
  3. ; testing purposes. 
  4. ;
  5. ; It is written in in the Z80 instruction set, and is compatible with
  6. ; public domain ZASM.COM or Z80MR.COM.
  7. ; To insert the SPACE procedure into your RCP, follow instructions marked with
  8. ; '*' below.
  9. ;
  10. ; * omit the next 3 lines for RCP: ---------
  11. bdos    equ    5
  12. fcb1    equ    5ch
  13.     org    100h
  14. ;
  15. ctab1:
  16. ; * remove ';'s and insert the following 2 lines at the beginning of 
  17. ;   "ctab1" in RCP:
  18. ;    db    'S   '        ; get disk space on current drive
  19. ;    dw    space        ; C. Wilson
  20. ;
  21. ; * insert the following 153 lines at the beginning of the list of routines
  22. ;   in your RCP.    -----------------
  23. ;
  24. ;SPACE shows space remaining on logged drive
  25. ; * remove semicolons from next 2 lines:
  26. ;crSPACE:            ; used to call SPACE after other subroutines
  27. ;    call    crlf        ; (e.g., CP, ERA) 
  28. SPACE:    
  29. getdsk:    call    print
  30.     db    'Space on',(' '+80h)
  31.  
  32.     ld    a,(fcb1)
  33.     cp    0        ; drive explicitly selected?
  34.     jr    nz,skip        ; yes
  35.  
  36.     ld    c,25
  37.     call    bdos        ; get current disk
  38.     jr    skip2
  39.  
  40. skip:    sub    1        ; subtract 1 from A
  41. skip2:    ld    e,a
  42.  
  43.      add    a,65
  44.     call    conout
  45.  
  46.     ld    c,14        ; select disk
  47.     call    bdos        ; not needed if no drive selected, but smallest
  48.                 ; possible code size this way.
  49.     call    print
  50.     db    ':',(' '+80h)
  51. ;
  52. ;*  THIS ROUTINE EXTRACTS DISK PARAMETER INFORMATION FROM THE DPB AND
  53. ;*    STORES THIS INFORMATION IN:
  54. ;*    BLKSHF    <-- BLOCK SHIFT FACTOR (1 BYTE)
  55. ;*    BLKMAX    <-- MAX NUMBER OF BLOCKS ON DISK (2 BYTES)
  56. ;*
  57. DPARAMS:
  58. ;*
  59. ;*  VERSION 2.x OR MP/M
  60. ;*
  61.     LD    C,31        ; 2.x OR MP/M...REQUEST DPB
  62.     CALL    BDOS
  63.     INC    HL
  64.     INC    HL
  65.     LD    A,(HL)        ; GET BLOCK SHIFT
  66.     LD    (BLKSHF),A    ; BLOCK SHIFT FACTOR
  67.     INC    HL        ; GET BLOCK MASK
  68.     INC    HL
  69.     INC    HL
  70.     LD    E,(HL)        ; GET MAX BLOCK NUMBER
  71.     INC    HL
  72.     LD    D,(HL)
  73.     EX    DE,HL
  74.     INC    HL        ; ADD 1 FOR MAX NUMBER OF BLOCKS
  75.     LD    (BLKMAX),HL    ; MAXIMUM NUMBER OF BLOCKS
  76. ;*
  77. ;*  PARAMETERS EXTRACTED
  78. ;*  COMPUTE AMOUNT OF FREE SPACE LEFT ON DISK
  79. ;*    THE DPARAMS ROUTINE MUST BE CALLED BEFORE THIS ROUTINE IS USED
  80. ;*
  81. DFREE:
  82.     LD    C,27    ; GET ADDRESS OF ALLOCATION VECTOR
  83.     CALL    BDOS
  84.     EX    DE,HL
  85.     LD    HL,(BLKMAX)    ; GET LENGTH OF ALLOCATION VECTOR
  86.     LD    BC,0    ; INIT BLOCK COUNT TO 0
  87. ;*
  88. ;*  BC IS ACCUMULATOR FOR SPACE
  89. ;*
  90. FREE1:
  91.     PUSH    DE    ; SAVE ALLOC ADDRESS
  92.     LD    A,(DE)    ; GET BIT PATTERN OF ALLOCATION BYTE
  93.     LD    E,8    ; SET TO PROCESS 8 BLOCKS
  94. FREE2:
  95.     RLA        ; ROTATE ALLOCATED BLOCK BIT INTO CARRY FLAG
  96.     jr    C,FREE3    ; IF SET (BIT=1), BLOCK IS ALLOCATED
  97.     INC    BC    ; IF NOT SET, BLOCK IS NOT ALLOCATED, SO INCREMENT
  98.             ;   FREE BLOCK COUNT
  99. FREE3:
  100.     LD    D,A    ; SAVE REMAINING ALLOCATION BITS IN D
  101.     DEC    HL    ; COUNT DOWN NUMBER OF BLOCKS ON DISK
  102.     LD    A,L
  103.     OR    H
  104.     jr    Z,FREE4    ; DONE IF NO MORE BLOCKS LEFT
  105.     LD    A,D    ; A=CURRENT ALLOCATION BIT PATTERN
  106.     DEC    E    ; HAVE ALL 8 BITS BEEN EXAMINED?
  107.     jr    NZ,FREE2    ; CONTINUE IF NOT
  108.     POP    DE    ; GET POINTER TO ALLOCATION VECTOR
  109.     INC    DE    ; POINT TO NEXT ALLOCATION BYTE
  110.     jr    FREE1    ; CONTINUE BY PROCESSING NEXT ALLOCATION BYTE
  111. ;*
  112. ;*  BC = TOTAL AMOUNT OF FREE SPACE IN TERMS OF BLOCKS
  113. ;*
  114. FREE4:
  115.     POP    DE    ; CLEAR DE FROM STACK
  116.     LD    L,C    ; HL=BC=NUMBER OF FREE BLOCKS
  117.     LD    H,B
  118.     LD    A,(BLKSHF)    ; GET BLOCK SHIFT FACTOR
  119.     SUB    3    ; CONVERT NUMBER OF BLOCKS TO K
  120.     jr    Z,FREE6    ; DONE IF SINGLE DENSITY (1K PER BLOCK)
  121.  
  122. ;*
  123. ;*  WE ARE AT A MORE ADVANCED DENSITY LEVEL; MULTIPLY THE NUMBER OF BLOCKS
  124. ;*    BY THE SIZE OF A BLOCK IN K
  125. ;*
  126. FREE5:
  127.     ADD    HL,HL    ; 2, 4, 8, 16, ETC K/BLK, SO BLOCK SHIFT FACTOR
  128.     DEC    A    ;   IS A POWER-OF-TWO MULTIPLE
  129.     JR    NZ,FREE5
  130. ;*
  131. ;*  AT THIS POINT, HL=AMOUNT OF FREE SPACE ON DISK IN K
  132. ;*
  133. FREE6:
  134. ;
  135. DECOUT:            ; output free space in decimal
  136.     ld    b,0
  137.     ld    de,-10000    
  138.     call    subtr    
  139.     ld    de,-1000
  140.     call    subtr
  141.     ld    de,-100
  142.     call    subtr
  143.     ld    de,-10
  144.     call    subtr
  145.     ld    a,l
  146.     add    a,'0'        ; ASCII bias
  147.     call    conout
  148.     ld    a,'k'
  149.     call    conout
  150.     ret            ; final return from SPACE routine
  151. ;
  152. subtr:    ld    c,'0'-1
  153. subt2:    inc    c
  154.     add    hl,de
  155.     jr    c,subt2
  156.     or    a
  157.     sbc    hl,de
  158.     ld    a,c
  159.     cp    '1'
  160.     jr    nc,nzero
  161.     ld    a,b
  162.     or    a
  163.     ld    a,c
  164.     ret    z
  165.     call    conout
  166.     ret
  167. ;        
  168. nzero:    ld    b,0ffh
  169.     call    conout
  170.     ret
  171. ;
  172. blkshf:    db    0
  173. blkmax:    dw    0
  174. ;
  175. ; * RCP IMPLANT ENDS HERE --------------------------    
  176. ;   CRLF, CONOUT, AND PRINT should already be implemented in your RCP, so
  177. ;   omit these procedures from implant.
  178.  
  179. crlf:    call    print
  180.     db    0dh,(0ah+80h)
  181.     ret
  182. ;
  183. ;  Console Output Routine
  184. ;
  185. conout:
  186.     push    hl        ; save regs
  187.     push    de
  188.     push    bc
  189.     push    af
  190.     and    7fh        ; mask MSB
  191.     ld    e,a        ; char in E
  192.     ld    c,2        ; output
  193.     call    bdos
  194.     pop    af        ; get regs
  195.     pop    bc
  196.     pop    de
  197.     pop    hl
  198.     ret
  199. ;
  200. ;  Print String (terminated in 0 or MSB Set) at Return Address
  201. ;
  202. print:
  203.     ex    (sp),hl        ; get address
  204.     call    print1
  205.     ex    (sp),hl        ; put address
  206.     ret
  207. ;
  208. ;  Print String (terminated in 0 or MSB Set) pted to by HL
  209. ;
  210. print1:
  211.     ld    a,(hl)        ; done?
  212.     inc    hl        ; pt to next
  213.     or    a        ; 0 terminator
  214.     ret    z
  215.     call    conout        ; print char
  216.     ret    m        ; MSB terminator
  217.     jr    print1
  218. ;
  219.  
  220. ; * omit this end statement for RCP, of course. 
  221.     end
  222.     call    conout        ; print char
  223.     ret    m        ; MSB terminator
  224.     jr    print1
  225. ;
  226.  
  227. ; * omit this end statement