home *** CD-ROM | disk | FTP | other *** search
/ Software Du Jour / SoftwareDuJour.iso / BUSINESS / DBASE / DBAPG.ARC / DISKSTAT.A86 < prev    next >
Encoding:
Text File  |  1984-08-06  |  7.5 KB  |  157 lines

  1. ; Subroutine.: DISKSTAT.A86
  2. ; Author.....: Kelly Mc Tiernan
  3. ; Date.......: 1983
  4. ; Notice.....: Copyright 1983, Kelly Mc Tiernan, All Rights Reserved
  5. ; Notes......: CP/M 86 DISK DRIVE STATUS ROUTINE
  6. ;
  7. ;
  8.         ORG     0DE00H             ; TOP OF DBASE
  9. ;
  10. ;
  11. BDOS    EQU     0E0H     ; BDOS CALL = INTERUPT 224
  12. GETALV  EQU     1BH      ; GET ALLOCATION VECTOR ADDRESS
  13. GETDPB  EQU     1FH      ; GET DISK PARAMETER BLOCK ADDRESS
  14. BSHOFF  EQU     02H      ; OFFSET , DPB , TO BSH (BLOCK SIZE)
  15. DSMOFF  EQU     05H      ; DPB TO DSM (MAXIMUM BLOCK NUMBER)
  16. SELDSK  EQU     0EH      ; SELECT DISK FUNCTION NUMBER
  17. GETDSK  EQU     19H      ; GET CURRENT DISK FUNCTION
  18. DSKBYT  EQU     01H      ; OFFSET TO DISK SELECTOR BYTE (MEMVAR)
  19. ;
  20. START:  PUSH    ES                 ; SAVE SEGMENT REGISTERS
  21.         PUSH    DS                 ;
  22.         PUSH    BX                 ; SAVE MEMVAR ADDRESS
  23.         MOV     CL,GETDSK          ; GET CURRENT DISK NUMBER
  24.         INT     BDOS               ;
  25.         MOV     BYTE PTR SAVDSK,AL ; SAVE IT FOR RETURN ROUTINE
  26.         POP     BX                 ; RESTORE POINTER
  27.         PUSH    BX                 ; BUT KEEP IT ON STACK
  28.         MOV     DL,DSKBYT[BX]      ; GET SELECTED DISK BYTE
  29.         SUB     DL,41H             ; CONVERT LETTER TO NUMBER
  30.         CMP     DL,10H             ; LEGITIMATE DISK SELECTOR
  31.         JA      KEEPDR             ; KEEP DEFAULT IF NOT LEGAL
  32.         MOV     CL,SELDSK          ; SELECT DISK FUNCTION
  33.         INT     BDOS               ;
  34. KEEPDR: MOV     CL,GETDPB          ; LET'S GET DPB ADDRESS 
  35.         INT     BDOS               ; GO FETCH IT
  36.         MOV     SI,ES:BSHOFF[BX]   ; GET BSH FOR VECTOR 
  37.                                    ; CALCULATION
  38.         AND     SI,00FFH           ; CLEAR HIGH BYTE (JUST JUNK)
  39.         SUB     SI,03              ; SET UP VECTOR
  40.         SHL     SI,1               ; MULTIPLY BY 2 TO VECTOR 
  41.                                    ; INTO TABLE
  42.         MOV     AX,ES:DSMOFF[BX]   ; GET DSM FOR LATER USE
  43.         MOV     BX,OFFSET BLKTBL   ; GET BASE ADDRESS OF LOOKUP 
  44.                                    ; TABLE
  45.         ADD     SI,BX              ; CALCULATE VECTOR
  46.         PUSH    DS                 ; GET DESTINATION SEGMENT
  47.         POP     ES                 ;
  48.         MOV     DI,OFFSET BLKSIZ   ; GET DESTINATION ADDRESS
  49.         CLD                        ; CLEAR DIRECTION FLAG 
  50.                                    ; (MOVE DOWN)
  51.         MOVSW                      ; MOVE BLOCKSIZE FROM TABLE
  52.         MOV     CL,03H             ; COUNT FOR SHIFT AX = AX/8
  53.         SHR     AX,CL              ; ALV LENGTH = DSM / 8 + 1 + 1
  54.                                    ; (FOR OUR COUNT)
  55.         ADD     AX,02              ;
  56. è        STOSW                      ; SAVE ALV LENGTH (DI UPDATED
  57.                                    ; BY MOVSW)
  58.         MOV     CL,GETALV          ; NOW GET ALV ADDRESS
  59.         INT     BDOS               ;
  60.         MOV     CX,WORD PTR ALVLNG ; GET BACK ALV LENGTH FOR 
  61.                                    ; COUNTER
  62.         DEC     BX                 ; PREP FOR COUNTER ROUTINE
  63.         MOV     AX,0000H           ; ZERO THIS, IT'S OUR BIT 
  64.                                    ; COUNTER
  65.         PUSH    CX                 ; SET UP FOR ENTRY TO COUNTR
  66. COUNTR: POP     CX                 ; GET BACK COUNT OF BYTES
  67. CNT0:   INC     BX                 ; NEXT (OR FIRST) BYTE
  68.         DEC     CX                 ; COUNT BYTES
  69.         JCXZ    DNECNT             ; EXIT ON ALL BYTES ALV 
  70.                                    ; PROCESSED
  71.         CMP     ES:BYTE PTR[BX],0FFH ; CHECK FOR 8 BLOCKS FULL
  72.         JNZ     INCNTR             ; IF NOT THEN COUNT 0'S 
  73.                                    ; (FREE BLOCKS)
  74.         JMP     CNT0               ; DO NEXT BYTE
  75. INCNTR: PUSH    CX                 ; SAVE OUTSIDE LOOP COUNTER
  76.         MOV     CX,100H            ; FOR TESTING BITS AND COUNTER
  77. CNT1:   SHR     CX,1               ; FOR BIT TO TEST
  78.         JZ      COUNTR             ; SHR=0 THEN ALL BITS TESTED
  79.         TEST    ES:[BX],CX         ; TEST BIT FOR SET
  80.         JNZ     CNT1               ; NOT A 0 BIT, DON'T COUNT
  81.         INC     AX                 ; AX IS OUR BIT COUNTER
  82.         JMP     CNT1               ; DO NEXT BIT
  83. DNECNT: SUB     AX,02H             ; 4 BLOCK ERROR ON IBM PC
  84.         MOV     CX,WORD PTR BLKSIZ ; GET BACK BLOCK SIZE
  85.         MUL     CX                 ; CALCULATE SPACE LEFT
  86.         MOV     SI,OFFSET CONTBL   ; GET SUB TABLE FOR HTA 
  87.                                    ; DECIMAL CONV.
  88.         PUSH    DS                 ; SET UP ES FOR MOVE
  89.         POP     ES                 ; (HTA = HEX TO ASCII)
  90.         POP     BX                 ; GET BACK MEMVAR ADDRESS
  91.         PUSH    BX                 ; LEAVE A COPY ON STACK (TO 
  92.                                    ; RESTORE)
  93.         MOV     DI,BX              ; GET IT TO DESTINATION 
  94.                                    ; REGISTER
  95.         INC     DI                 ; POINT TO FIRST BYTE
  96.         MOV     BX,AX              ; GET LOW WORD OUT OF AX 
  97.                                    ; ( NEEDED )
  98.         MOV     CX,09H             ; TOTAL ANSWER BYTES TO 
  99.                                    ; CALCULATE
  100. ANSWER: MOV     AL,00              ; ZERO SIG DIGIT COUNTER
  101. ANS0:   SUB     BX,[SI]            ; SUBTRACT LOW WORD
  102.         INC     SI                 ; POINT TO HIGH WORD
  103.         INC     SI                 ;
  104.         SBB     DX,[SI]            ; SUBTRACT HIGH WORD
  105.         JB      NXTBYT             ; PUTBACK AND DO NEXT 
  106.                                    ; SIGNIFICANT DIGIT IF >
  107.         IN├     A╠                 ╗ OTHERWIS┼ COUN╘ FO╥ 
  108.                                    ; SIGNIFICANT DIGIT
  109.         DEC     SI                 ; POINT BACK TO LOW WORD
  110.         DEC     SI                 ;
  111. è        JMP     ANS0               ; AND DO AGAIN
  112. NXTBYT: DEC     SI                 ; POINT TO LOW WORD
  113.         DEC     SI                 ;
  114.         ADD     BX,[SI]            ; PUT BACK
  115.         INC     SI                 ; HIGH WORD
  116.         INC     SI                 ;
  117.         ADC     DX,[SI]            ; PUT IT BACK
  118.         ADD     AL,30H             ; CONVERT TO ASCII
  119.         STOSB                      ; PLACE INTO ANSWER
  120.         INC     SI                 ; POINT TO NEXT SIGNIFICANT
  121.                                    ; DIGIT SUB IN TABLE
  122.         INC     SI                 ;
  123.         LOOP    ANSWER             ; EXIT ON DONE
  124. DONE:   MOV     AL,BL              ; GET LAST BYTE
  125.         ADD     AL,30H             ; CONVERT TO ASCII
  126.         STOSB                      ; AND SAVE IT
  127.         MOV     DL,BYTE PTR SAVDSK ; GET BACK CURRENT DRIVE
  128.         MOV     CL,SELDSK          ; SELECT DISK FUNCTION
  129.         INT     BDOS               ;
  130.         POP     BX                 ; RESTORE POINTER
  131.         POP     DS                 ; RESTORE SEGMENTS
  132.         POP     ES                 ;
  133.         RET                        ; RETURN TO DBASE
  134. ;
  135. BLKTBL  DB      00H,04H,00H,08H,00H,10H,00H,20H,00H,40H
  136. BLKSIZ  RW      1
  137. ALVLNG  RW      1
  138. SAVDSK  RB      1
  139. ;
  140. CONTBL  DW      0CA00H
  141.         DW      0369AH
  142.         DW      0E100H
  143.         DW      005F5H
  144.         DW      09680H
  145.         DW      00098H
  146.         DW      04240H
  147.         DW      0000FH
  148.         DW      086A0H
  149.         DW      00001H
  150.         DW      02710H
  151.         DW      00000H
  152.         DW      003E8H
  153.         DW      00000H
  154.         DW      00064H
  155.         DW      00000H
  156.         DW      0000AH
  157.         DW      00000H
  158. END
  159.