home *** CD-ROM | disk | FTP | other *** search
- ; Subroutine.: DOS-STAT.A86
- ; Author.....: Kelly Mc Tiernan
- ; Date.......: 01/23/84
- ; Notice.....: Copyright 1984, All Rights Reserved.
- ; Notes......: MS-DOS 2.0x disk drive status routine
- ;
- ;
- ORG 0DE00H ; TOP OF DBASE.COM
- ;
- DOS EQU 21H ; MS DOS FUNCTION CALL
- CURDSK EQU 19H ; GET CURRENT DISK FUNCTION
- SELDSK EQU 0EH ; SELECT DISK FUNCTION
- DSKBYT EQU 01H ; OFFSET TO DISK SELECTOR BYTE
- ;
- START: PUSH ES ; SAVE EXTRA SEGMENT
- PUSH BX ; SAVE VAR POINTER
- MOV DL,DSKBYT[BX] ; GET DISK SELECTOR BYTE
- SUB DL,40H ; CONVERT TO HEX 01,02 ..
- CMP DL,11H ; CHECK FOR LEGAL DRIVE SPEC.
- JBE DSKOK ; SKIP NEXT, = SET TO DEFAULT
- ; DRIVE
- MOV DL,00H ; SET DRIVE SPEC. TO DEFAULT
- DSKOK: MOV AH,36H ; GET DISK FREE SPACE FUNCTION
- INT DOS ; CALL DOS TO GET IT
- CMP AX,0FFFFH ; MEANS ILLEGAL DRIVE
- JZ ERROR ; QUIT HERE ON ERROR
- MOV SI,0000H ; ZERO OUT OUR TEMP REG. (32
- ; BIT *)
- MUL CX ; AVAIL. CLUSTERS * SECTORS /
- ; CLUSTER
- MOV CX,0000H ; ZERO OUT FOR LATTER USE
- XCHG DX,SI ; SAVE CARRY OVER = HIGH WORD
- ; 1ST MUL
- MUL BX ; LOW WORD * BYTES PER CLUSTER
- XCHG DX,CX ; SAVE CARRY OVER, THIS MUL,
- ; IN CX
- XCHG AX,SI ; GET BACK HIGH WORD
- MUL BX ; HIGH WORD * BYTES PER CLUSTER
- ADD CX,AX ; ADD CARRY OVER FROM LAST MUL
- XCHG DX,CX ; PUT HIGH WORD IN DX ( NORMAL
- ; PLACE )
- XCHG AX,SI ; LOW WORD IN PROPER PLACE
- OR CX,CX ; CHECK FOR OVERFLOW ( IF CX<>0 )
- JNZ ERROR ; EXIT TO ERROR IF NUMBER TO
- ; LARGE
- MOV SI,OFFSET CONTBL; GET SUB TABLE FOR HEX TO ASCII
- ; CONV.
- PUSH DS ; MAKE ES=DS JUST IN CASE
- POP ES ;
- POP DI ; OLD BX POINTER INTO DI
- PUSH DI ; SAVE COPY ON STACK
- INC DI ; POINT TO FIRST BYTE OF STRING
- MOV BX,AX ; GET LOW WORD OUT OF AX, WE NEED
- ; IT
- MOV CX,09H ; TOTAL ANSWER BYTES TO CALCULATE
- ANSWER: MOV AL,30H ; ZERO SIG DIGIT COUNTER
- ANS0: SUB BX,[SI] ; SUBTRACT LOW WORD
- INC SI ; POINT TO HIGH WORD
- INC SI ;
- SBB DX,[SI] ; SUBTRACT HIGH WORD
- JB NXTBYT ; PUT BACK AND DO NEXT SIG
- ; DIGIT IF >
- INC AL ; OTHERWISE COUNT IT AND DO
- ; NEXT ONE
- DEC SI ; POINT BACK TO LOW WORD
- DEC SI ;
- JMP ANS0 ; DO AGAIN, UNTIL SUB>NUMBER
- NXTBYT: DEC SI ; POINT TO LOW WORD
- DEC SI ;
- ADD BX,[SI] ; PUT BACK
- INC SI ; POINT TO HIGH WORD
- INC SI ;
- ADC DX,[SI] ; AND PUT BACK
- STOSB ; PLACE BYTE INTO ANSWER
- INC SI ; POINT TO NEXT CONTBL NUMBER
- INC SI ;
- LOOP ANSWER ; DO NEXT BYTE AND EXIT ON DONE
- DONE: MOV AL,BL ; GET LAST BYTE
- ADD AL,30H ; CONVERT TO ASCII
- STOSB ; PLACE IT IN ANSWER STRING
- POP BX ; RESTORE REGISTERS
- POP ES ;
- RET ; RETURN TO DBASE
- ERROR: POP BX ; GET BACK VAR POINTER
- MOV BYTE PTR DSKBYT[BX],'E'
- ; E IS ERROR CODE
- ;
- POP ES ; RESTORE ES
- RET ; AND RETURN TO DBASE
- ;
- ;
- CONTBL DW 0CA00H
- DW 0369AH
- DW 0E100H
- DW 005F5H
- DW 09680H
- DW 00098H
- DW 04240H
- DW 0000FH
- DW 086A0H
- DW 00001H
- DW 02710H
- DW 00000H
- DW 003E8H
- DW 00000H
- DW 00064H
- DW 00000H
- DW 0000AH
- DW 00000H
- END