home *** CD-ROM | disk | FTP | other *** search
/ Software Du Jour / SoftwareDuJour.iso / BUSINESS / DBASE / DBAPG.ARC / DOS-STAT.A86 < prev    next >
Encoding:
Text File  |  1984-06-27  |  3.0 KB  |  111 lines

  1. ; Subroutine.: DOS-STAT.A86
  2. ; Author.....: Kelly Mc Tiernan
  3. ; Date.......: 01/23/84
  4. ; Notice.....: Copyright 1984, All Rights Reserved.
  5. ; Notes......: MS-DOS 2.0x disk drive status routine
  6. ;
  7. ;
  8.     ORG    0DE00H        ; TOP OF DBASE.COM
  9. ;
  10. DOS    EQU    21H        ; MS DOS FUNCTION CALL
  11. CURDSK    EQU    19H        ; GET CURRENT DISK FUNCTION
  12. SELDSK    EQU    0EH        ; SELECT DISK FUNCTION
  13. DSKBYT    EQU    01H        ; OFFSET TO DISK SELECTOR BYTE
  14. ;
  15. START:    PUSH    ES        ; SAVE EXTRA SEGMENT
  16.     PUSH    BX        ; SAVE VAR POINTER
  17.     MOV    DL,DSKBYT[BX]    ; GET DISK SELECTOR BYTE
  18.     SUB    DL,40H        ; CONVERT TO HEX 01,02 ..
  19.     CMP    DL,11H        ; CHECK FOR LEGAL DRIVE SPEC.
  20.     JBE    DSKOK        ; SKIP NEXT, = SET TO DEFAULT
  21.                 ; DRIVE
  22.     MOV    DL,00H        ; SET DRIVE SPEC. TO DEFAULT 
  23. DSKOK:    MOV    AH,36H        ; GET DISK FREE SPACE FUNCTION
  24.     INT    DOS        ; CALL DOS TO GET IT
  25.     CMP    AX,0FFFFH    ; MEANS ILLEGAL DRIVE
  26.     JZ    ERROR        ; QUIT HERE ON ERROR
  27.     MOV    SI,0000H    ; ZERO OUT OUR TEMP REG. (32 
  28.                 ; BIT *)
  29.     MUL    CX        ; AVAIL. CLUSTERS * SECTORS /
  30.                 ; CLUSTER
  31.     MOV    CX,0000H    ; ZERO OUT FOR LATTER USE
  32.     XCHG    DX,SI        ; SAVE CARRY OVER = HIGH WORD
  33.                 ; 1ST MUL
  34.     MUL    BX        ; LOW WORD * BYTES PER CLUSTER
  35.     XCHG    DX,CX        ; SAVE CARRY OVER, THIS MUL,
  36.                 ; IN CX
  37.     XCHG    AX,SI        ; GET BACK HIGH WORD
  38.     MUL    BX        ; HIGH WORD * BYTES PER CLUSTER
  39.     ADD    CX,AX        ; ADD CARRY OVER FROM LAST MUL
  40.     XCHG    DX,CX        ; PUT HIGH WORD IN DX ( NORMAL
  41.                 ; PLACE )
  42.     XCHG    AX,SI        ; LOW WORD IN PROPER PLACE
  43.     OR    CX,CX        ; CHECK FOR OVERFLOW ( IF CX<>0 )
  44.     JNZ    ERROR        ; EXIT TO ERROR IF NUMBER TO
  45.                 ; LARGE
  46.     MOV    SI,OFFSET CONTBL; GET SUB TABLE FOR HEX TO ASCII
  47.                 ; CONV.
  48.     PUSH    DS        ; MAKE ES=DS JUST IN CASE
  49.     POP    ES        ; 
  50.     POP    DI        ; OLD BX POINTER INTO DI
  51.     PUSH    DI        ; SAVE COPY ON STACK
  52.     INC    DI        ; POINT TO FIRST BYTE OF STRING
  53.     MOV    BX,AX        ; GET LOW WORD OUT OF AX, WE NEED
  54.                 ; IT
  55.     MOV    CX,09H        ; TOTAL ANSWER BYTES TO CALCULATE
  56. ANSWER:    MOV    AL,30H        ; ZERO SIG DIGIT COUNTER
  57. ANS0:    SUB    BX,[SI]        ; SUBTRACT LOW WORD
  58.     INC    SI        ; POINT TO HIGH WORD
  59.     INC    SI        ;
  60.     SBB    DX,[SI]        ; SUBTRACT HIGH WORD
  61.     JB    NXTBYT        ; PUT BACK AND DO NEXT SIG
  62.                 ; DIGIT IF >
  63.     INC    AL        ; OTHERWISE COUNT IT AND DO
  64.                 ; NEXT ONE
  65.     DEC    SI        ; POINT BACK TO LOW WORD
  66.     DEC    SI        ;
  67.     JMP    ANS0        ; DO AGAIN, UNTIL SUB>NUMBER
  68. NXTBYT: DEC    SI        ; POINT TO LOW WORD
  69.     DEC    SI        ;
  70.     ADD    BX,[SI]        ; PUT BACK
  71.     INC    SI        ; POINT TO HIGH WORD
  72.     INC    SI        ;
  73.     ADC    DX,[SI]        ; AND PUT BACK
  74.     STOSB            ; PLACE BYTE INTO ANSWER
  75.     INC    SI        ; POINT TO NEXT CONTBL NUMBER
  76.     INC    SI        ;
  77.     LOOP    ANSWER        ; DO NEXT BYTE AND EXIT ON DONE
  78. DONE:    MOV    AL,BL        ; GET LAST BYTE
  79.     ADD    AL,30H        ; CONVERT TO ASCII
  80.     STOSB            ; PLACE IT IN ANSWER STRING
  81.     POP    BX        ; RESTORE REGISTERS
  82.     POP    ES        ; 
  83.     RET            ; RETURN TO DBASE
  84. ERROR:    POP    BX        ; GET BACK VAR POINTER
  85.     MOV    BYTE PTR DSKBYT[BX],'E'
  86.                 ; E IS ERROR CODE
  87.                 ;
  88.     POP    ES        ; RESTORE ES
  89.     RET            ; AND RETURN TO DBASE
  90. ;
  91. ;
  92. CONTBL    DW    0CA00H
  93.     DW    0369AH
  94.     DW    0E100H
  95.     DW    005F5H
  96.     DW    09680H
  97.     DW    00098H
  98.     DW    04240H
  99.     DW    0000FH
  100.     DW    086A0H
  101.     DW    00001H
  102.     DW    02710H
  103.     DW    00000H
  104.     DW    003E8H
  105.     DW    00000H
  106.     DW    00064H
  107.     DW    00000H
  108.     DW    0000AH
  109.     DW    00000H
  110. END
  111.