home *** CD-ROM | disk | FTP | other *** search
- *********************************************************
- * *
- * REPORT REMAINING DISK SPACE ROUTINE *
- * *
- * A LINKABLE MODULE IN THE MICROSOFT *
- * RELOCATION FORMAT *
- * *
- * 1981, Software Tools *
- * P.O. Box 80 *
- * Newport Beach *
- * NSW, 2106 *
- * AUSTRALIA *
- * *
- * Written by: Bill Bolton *
- * *
- * Date: 26/Jan/1981 *
- * *
- * Version: 1.2 (Initial Release) *
- * *
- * ------------------------------------------- *
- * *
- * INPUT PARAMETERS: *
- * *
- * 1st. passed in HL = Address of variable for *
- * returned value *
- * *
- * 2nd. passed in DE = Address of drive identifier.*
- * Addressed contents must be *
- * the binary value of an *
- * ASCII character A to P *
- * (uppercase only). No *
- * range checking is done *
- * by this module. *
- * *
- * RETURNED VALUE: *
- * *
- * 1st. passed by writing value of remaining *
- * no. of Kbytes on disk into *
- * address of variable passed as *
- * input parameter 1. Value *
- * is returned as an unsigned *
- * 16 bit binary number, low *
- * byte first. *
- * *
- * ERROR CONDITIONS: *
- * *
- * No error conditions are *
- * explicitly reported by *
- * this module, BDOS will *
- * report an error if the *
- * drive identifier is *
- * invalid or out of bounds. *
- * *
- * ------------------------------------------ *
- * *
- * Assembler: RMAC.ASM (Digital Research) *
- * *
- * Support: MACRO3.LIB (Software Tools) *
- * *
- *********************************************************
-
- PUBLIC MAP ;GLOBAL LABLE
-
- MACLIB MACRO3 ;USEFUL MACRO LIBRARY
-
- CSEG ;RELOCATABLE MODEULE
-
- MAP:
- SHLD VALUE ;SAVE POINTER TO RETURN VARIABLE
- LXI H,0 ;SET UP STACK FOR THIS MODULE
- DAD SP
- SHLD OLDSTAK
- LXI SP,STACK
- LDAX D ;A <---- DRIVE IDENT
- SUI 41H ;REMOVE ASCII OFFSET
- MOV E,A ;E <---- DRIVE IDENT
- DISKIO LOGIN ;LOG IN SELECTED DRIVE
- DISKIO ?ALLOC ;GET POINTER TO ALLOCATION MAP
- MOV H,B
- MOV L,A ;HL <--- POINTER TO MAP
- SHLD IPOINT ;SAVE IT
- LXI H,0
- SHLD G ;ZERO COUNT OF UNUSED GROUPS
- XRA A
- DISKIO ?DPB ;GET DISK PARAMETER BLOCK
- ;HL POINTS TO BIOS DPB ON RETURN
- LXI D,2 ;OFFSET TO BSH
- DAD D ;HL <---- POINTER TO BSH
- MOV A,M ;A <---- BSH
- STA BSH ;SAVE BSH FOR LATER SIZE CALC
- INX D ;DE <---- OFFSET FROM BSH TO DSM
- DAD D ;HL <---- POINTER TO DSM
- CONTENTS ;HL <---- DSM VALUE
- INX H
- SHLD MAP$COUNT ;SAVE FOR BLOCKS+1
- LHLD IPOINT ;POINTER TO DISK ALLOCATION MAP
- MAP3:
- MVI B,8 ;BITS PER WORD
- MOV A,M ;GET A BYTE FROM ALLOC MAP
- MAP4:
- RAL ;BLOCK ALLOCATED
- SAVE B,D,H,PSW
- JC MAP6 ;YES
- LHLD G ;NO, HL <---- UNUSED GROUPS
- INX H ;ADD 1
- SHLD G ;STORE IT BACK
- MAP6:
- RESTORE PSW,H,D,B
- SAVE PSW,H ;SAVE BIT MAP BYTE
- LHLD MAP$COUNT ;GET BLOCKS REMAINING
- DCX H
- SHLD MAP$COUNT ;SAVE NEW BLOCKS LEFT
- DJZ FINISHED ;QUIT IF DONE
- MOV A,B ;BIT COUNT
- CPI 1 ;LAST BIT OF BYTE?
- JZ BITS ;YES
- DCR B
- RESTORE H,PSW
- JMP MAP4
- ;
- BITS:
- RESTORE H
- INX H ;BUMP POINTER TO NEXT BYTE
- RESTORE PSW
- JMP MAP3
- ;
- ;
- FINISHED:
- RESTORE PSW
- LHLD G ;HL <---- NO OF UNUSED BLOCKS
- LDA BSH ;GET BLOCK SHIFT FACTOR
- DCR A ;MINIMUM VALUE OF BSH
- DCR A ; IS 3, FOR 1K BLOCKS
- MULTIPLY:
- DCR A ;FINISHED LOOP?
- JZ EXIT ;YES
- DAD H ;NO, MULTIPLY BY 2
- JMP MULTIPLY ;TEST FOR EXIT
- ;
- EXIT:
- XCHG ;DE <---- NO OF UNUSED KBYTES
- LHLD VALUE ;HL <---- POINTER TO RETURN VARIABLE
- MOV M,D ;SAVE HI BYTE
- INX H
- MOV M,E
- LHLD OLDSTAK ;RESTORE CALLER'S STACK
- SPHL
- RET
- ;
- ; DATA STORAGE
- ;
- DSEG
- ;
- VALUE:
- DW 0 ;ADDRESS OF VARIABLE FOR RETURNED VALUE
- G:
- DW 0 ;NUMBER OF UNUSED BLOCKS
- IPOINT:
- DW 0 ;POINTER TO ALLOCATION MAP BYTE
- MAP$COUNT:
- DW 0 ;NUMBER OF BLOCKS REMAINING
- BSH:
- DB 0 ;BLOCK SHIFT FACTOR
- OLDSTAK:
- DS 2 ;CALLER'S STACK POINTER
- SPACE:
- DS 14 ;STACK
- STACK:
- DS 2 ;STACK TOP
- ;
- END
-