*********************************************************
*                                                       *
*       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