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              ;è        STOSW                      ; SAVE ALV LENGTH (DI UPDATED
  56.                                    ; BY MOVSW)
  57.         MOV     CL,GETALV          ; NOW GET ALV ADDRESS
  58.         INT     BDOS               ;
  59.         MOV     CX,WORD PTR ALVLNG ; GET BACK ALV LENGTH FOR 
  60.                                    ; COUNTER
  61.         DEC     BX                 ; PREP FOR COUNTER ROUTINE
  62.         MOV     AX,0000H           ; ZERO THIS, IT'S OUR BIT 
  63.                                    ; COUNTER
  64.         PUSH    CX                 ; SET UP FOR ENTRY TO COUNTR
  65. COUNTR: POP     CX                 ; GET BACK COUNT OF BYTES
  66. CNT0:   INC     BX                 ; NEXT (OR FIRST) BYTE
  67.         DEC     CX                 ; COUNT BYTES
  68.         JCXZ    DNECNT             ; EXIT ON ALL BYTES ALV 
  69.                                    ; PROCESSED
  70.         CMP     ES:BYTE PTR[BX],0FFH ; CHECK FOR 8 BLOCKS FULL
  71.         JNZ     INCNTR             ; IF NOT THEN COUNT 0'S 
  72.                                    ; (FREE BLOCKS)
  73.         JMP     CNT0               ; DO NEXT BYTE
  74. INCNTR: PUSH    CX                 ; SAVE OUTSIDE LOOP COUNTER
  75.         MOV     CX,100H            ; FOR TESTING BITS AND COUNTER
  76. CNT1:   SHR     CX,1               ; FOR BIT TO TEST
  77.         JZ      COUNTR             ; SHR=0 THEN ALL BITS TESTED
  78.         TEST    ES:[BX],CX         ; TEST BIT FOR SET
  79.         JNZ     CNT1               ; NOT A 0 BIT, DON'T COUNT
  80.         INC     AX                 ; AX IS OUR BIT COUNTER
  81.         JMP     CNT1               ; DO NEXT BIT
  82. DNECNT: SUB     AX,02H             ; 4 BLOCK ERROR ON IBM PC
  83.         MOV     CX,WORD PTR BLKSIZ ; GET BACK BLOCK SIZE
  84.         MUL     CX                 ; CALCULATE SPACE LEFT
  85.         MOV     SI,OFFSET CONTBL   ; GET SUB TABLE FOR HTA 
  86.                                    ; DECIMAL CONV.
  87.         PUSH    DS                 ; SET UP ES FOR MOVE
  88.         POP     ES                 ; (HTA = HEX TO ASCII)
  89.         POP     BX                 ; GET BACK MEMVAR ADDRESS
  90.         PUSH    BX                 ; LEAVE A COPY ON STACK (TO 
  91.                                    ; RESTORE)
  92.         MOV     DI,BX              ; GET IT TO DESTINATION 
  93.                                    ; REGISTER
  94.         INC     DI                 ; POINT TO FIRST BYTE
  95.         MOV     BX,AX              ; GET LOW WORD OUT OF AX 
  96.                                    ; ( NEEDED )
  97.         MOV     CX,09H             ; TOTAL ANSWER BYTES TO 
  98.                                    ; CALCULATE
  99. ANSWER: MOV     AL,00              ; ZERO SIG DIGIT COUNTER
  100. ANS0:   SUB     BX,[SI]            ; SUBTRACT LOW WORD
  101.         INC     SI                 ; POINT TO HIGH WORD
  102.         INC     SI                 ;
  103.         SBB     DX,[SI]            ; SUBTRACT HIGH WORD
  104.         JB      NXTBYT             ; PUTBACK AND DO NEXT 
  105.                                    ; SIGNIFICANT DIGIT IF >
  106.         IN├     A╠                 ╗ OTHERWIS┼ COUN╘ FO╥ 
  107.                                    ; SIGNIFICANT DIGIT
  108.         DEC     SI                 ; POINT BACK TO LOW WORD
  109.         DEC     SI                 ;è        JMP     ANS0               ; AND DO AGAIN
  110. NXTBYT: DEC     SI                 ; POINT TO LOW WORD
  111.         DEC     SI                 ;
  112.         ADD     BX,[SI]            ; PUT BACK
  113.         INC     SI                 ; HIGH WORD
  114.         INC     SI                 ;
  115.         ADC     DX,[SI]            ; PUT IT BACK
  116.         ADD     AL,30H             ; CONVERT TO ASCII
  117.         STOSB                      ; PLACE INTO ANSWER
  118.         INC     SI                 ; POINT TO NEXT SIGNIFICANT
  119.                                    ; DIGIT SUB IN TABLE
  120.         INC     SI                 ;
  121.         LOOP    ANSWER             ; EXIT ON DONE
  122. DONE:   MOV     AL,BL              ; GET LAST BYTE
  123.         ADD     AL,30H             ; CONVERT TO ASCII
  124.         STOSB                      ; AND SAVE IT
  125.         MOV     DL,BYTE PTR SAVDSK ; GET BACK CURRENT DRIVE
  126.         MOV     CL,SELDSK          ; SELECT DISK FUNCTION
  127.         INT     BDOS               ;
  128.         POP     BX                 ; RESTORE POINTER
  129.         POP     DS                 ; RESTORE SEGMENTS
  130.         POP     ES                 ;
  131.         RET                        ; RETURN TO DBASE
  132. ;
  133. BLKTBL  DB      00H,04H,00H,08H,00H,10H,00H,20H,00H,40H
  134. BLKSIZ  RW      1
  135. ALVLNG  RW      1
  136. SAVDSK  RB      1
  137. ;
  138. CONTBL  DW      0CA00H
  139.         DW      0369AH
  140.         DW      0E100H
  141.         DW      005F5H
  142.         DW      09680H
  143.         DW      00098H
  144.         DW      04240H
  145.         DW      0000FH
  146.         DW      086A0H
  147.         DW      00001H
  148.         DW      02710H
  149.         DW      00000H
  150.         DW      003E8H
  151.         DW      00000H
  152.         DW      00064H
  153.         DW      00000H
  154.         DW      0000AH
  155.         DW      00000H
  156. END
  157.