home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol073 / map.asm < prev    next >
Assembly Source File  |  1984-04-29  |  4KB  |  172 lines

  1. *********************************************************
  2. *                            *
  3. *    REPORT REMAINING DISK SPACE ROUTINE        *
  4. *                            *
  5. *    A LINKABLE MODULE IN THE MICROSOFT        *
  6. *    RELOCATION FORMAT                *
  7. *                            *
  8. *    1981,      Software Tools            *
  9. *          P.O. Box 80                *
  10. *          Newport Beach                *
  11. *          NSW, 2106                *
  12. *          AUSTRALIA                *
  13. *                            *
  14. *    Written by:    Bill Bolton            *
  15. *                            *
  16. *    Date:        26/Jan/1981            *
  17. *                            *
  18. *    Version:    1.2    (Initial Release)    *
  19. *                            *
  20. *    -------------------------------------------    *
  21. *                            *
  22. *    INPUT PARAMETERS:                *
  23. *                            *
  24. *    1st. passed in HL = Address of variable for    *
  25. *                returned value        *
  26. *                            *
  27. *    2nd. passed in DE = Address of drive identifier.*
  28. *                Addressed contents must be    *
  29. *                the    binary value of an    *
  30. *                ASCII character A to P    *
  31. *                (uppercase only). No    *
  32. *                range checking is done    *
  33. *                by this module.        *    
  34. *                            *
  35. *    RETURNED VALUE:                    *
  36. *                            *
  37. *    1st. passed by writing value of remaining    *
  38. *            no. of Kbytes on disk into        *
  39. *            address of variable passed as    *
  40. *            input parameter 1. Value        *
  41. *            is returned as an unsigned        *
  42. *            16 bit binary number, low        *
  43. *            byte first.                *
  44. *                            *
  45. *    ERROR CONDITIONS:                *
  46. *                            *
  47. *                No error conditions are    *
  48. *                explicitly reported by    *
  49. *                this module, BDOS will    *
  50. *                report an error if the    *
  51. *                drive identifier is        *
  52. *                invalid or out of bounds.    *
  53. *                            *
  54. *    ------------------------------------------    *
  55. *                            *
  56. *    Assembler:    RMAC.ASM (Digital Research)    *
  57. *                            *
  58. *    Support:    MACRO3.LIB (Software Tools)    *
  59. *                            *
  60. *********************************************************        
  61.  
  62. PUBLIC    MAP            ;GLOBAL LABLE
  63.  
  64.     MACLIB    MACRO3        ;USEFUL MACRO LIBRARY
  65.  
  66.     CSEG            ;RELOCATABLE MODEULE
  67.  
  68. MAP:
  69.     SHLD    VALUE        ;SAVE POINTER TO RETURN VARIABLE
  70.     LXI    H,0        ;SET UP STACK FOR THIS MODULE
  71.     DAD    SP
  72.     SHLD    OLDSTAK
  73.     LXI    SP,STACK
  74.     LDAX    D        ;A <---- DRIVE IDENT
  75.     SUI    41H        ;REMOVE ASCII OFFSET
  76.     MOV    E,A        ;E <---- DRIVE IDENT
  77.     DISKIO    LOGIN        ;LOG IN SELECTED DRIVE
  78.     DISKIO    ?ALLOC        ;GET POINTER TO ALLOCATION MAP
  79.     MOV    H,B
  80.     MOV    L,A        ;HL <--- POINTER TO MAP
  81.     SHLD    IPOINT        ;SAVE IT
  82.     LXI    H,0
  83.     SHLD    G        ;ZERO COUNT OF UNUSED GROUPS
  84.     XRA    A
  85.     DISKIO    ?DPB        ;GET DISK PARAMETER BLOCK
  86.                      ;HL POINTS TO BIOS DPB ON RETURN
  87.     LXI    D,2        ;OFFSET TO BSH
  88.     DAD    D        ;HL <---- POINTER TO BSH
  89.     MOV    A,M        ;A <---- BSH
  90.     STA    BSH        ;SAVE BSH FOR LATER SIZE CALC
  91.     INX    D        ;DE <---- OFFSET FROM BSH TO DSM
  92.     DAD    D        ;HL <---- POINTER TO DSM
  93.     CONTENTS        ;HL <---- DSM VALUE
  94.     INX    H
  95.     SHLD    MAP$COUNT    ;SAVE FOR BLOCKS+1
  96.     LHLD    IPOINT        ;POINTER TO DISK ALLOCATION MAP
  97. MAP3:
  98.     MVI    B,8        ;BITS PER WORD
  99.     MOV    A,M        ;GET A BYTE FROM ALLOC MAP
  100. MAP4:
  101.     RAL            ;BLOCK ALLOCATED
  102.     SAVE    B,D,H,PSW
  103.     JC    MAP6        ;YES
  104.     LHLD    G        ;NO, HL <---- UNUSED GROUPS
  105.     INX    H        ;ADD 1
  106.     SHLD    G        ;STORE IT BACK
  107. MAP6:
  108.     RESTORE    PSW,H,D,B
  109.     SAVE    PSW,H        ;SAVE BIT MAP BYTE
  110.     LHLD    MAP$COUNT    ;GET BLOCKS REMAINING
  111.     DCX    H        
  112.     SHLD    MAP$COUNT    ;SAVE NEW BLOCKS LEFT
  113.     DJZ    FINISHED    ;QUIT IF DONE
  114.     MOV    A,B        ;BIT COUNT
  115.     CPI    1        ;LAST BIT OF BYTE?
  116.     JZ    BITS        ;YES
  117.     DCR    B
  118.     RESTORE H,PSW
  119.     JMP    MAP4
  120. ;
  121. BITS:
  122.     RESTORE H
  123.     INX    H        ;BUMP POINTER TO NEXT BYTE        
  124.     RESTORE PSW
  125.     JMP    MAP3
  126. ;
  127. ;
  128. FINISHED:
  129.     RESTORE PSW
  130.     LHLD    G        ;HL <---- NO OF UNUSED BLOCKS
  131.     LDA    BSH        ;GET BLOCK SHIFT FACTOR
  132.     DCR    A        ;MINIMUM VALUE OF BSH
  133.     DCR    A        ; IS 3, FOR 1K BLOCKS
  134. MULTIPLY:
  135.     DCR    A        ;FINISHED LOOP?
  136.     JZ    EXIT        ;YES
  137.     DAD    H        ;NO, MULTIPLY BY 2
  138.     JMP    MULTIPLY    ;TEST FOR EXIT
  139. ;
  140. EXIT:
  141.     XCHG            ;DE <---- NO OF UNUSED KBYTES
  142.     LHLD    VALUE        ;HL <---- POINTER TO RETURN VARIABLE
  143.     MOV    M,D        ;SAVE HI BYTE
  144.     INX    H
  145.     MOV    M,E 
  146.     LHLD    OLDSTAK        ;RESTORE CALLER'S STACK
  147.     SPHL
  148.     RET
  149. ;
  150. ;    DATA STORAGE
  151. ;
  152.     DSEG
  153. ;
  154. VALUE:
  155.     DW    0        ;ADDRESS OF VARIABLE FOR RETURNED VALUE
  156. G:
  157.     DW    0        ;NUMBER OF UNUSED BLOCKS
  158. IPOINT:
  159.     DW    0        ;POINTER TO ALLOCATION MAP BYTE
  160. MAP$COUNT:
  161.     DW    0        ;NUMBER OF BLOCKS REMAINING
  162. BSH:
  163.     DB    0        ;BLOCK SHIFT FACTOR
  164. OLDSTAK:
  165.     DS    2        ;CALLER'S STACK POINTER
  166. SPACE:
  167.     DS    14        ;STACK
  168. STACK:
  169.     DS    2        ;STACK TOP
  170. ;
  171.     END
  172.