home *** CD-ROM | disk | FTP | other *** search
- ; Subroutine.: DISKSTAT.A86
- ; Author.....: Kelly Mc Tiernan
- ; Date.......: 1983
- ; Notice.....: Copyright 1983, Kelly Mc Tiernan, All Rights Reserved
- ; Notes......: CP/M 86 DISK DRIVE STATUS ROUTINE
- ;
- ;
- ORG 0DE00H ; TOP OF DBASE
- ;
- ;
- BDOS EQU 0E0H ; BDOS CALL = INTERUPT 224
- GETALV EQU 1BH ; GET ALLOCATION VECTOR ADDRESS
- GETDPB EQU 1FH ; GET DISK PARAMETER BLOCK ADDRESS
- BSHOFF EQU 02H ; OFFSET , DPB , TO BSH (BLOCK SIZE)
- DSMOFF EQU 05H ; DPB TO DSM (MAXIMUM BLOCK NUMBER)
- SELDSK EQU 0EH ; SELECT DISK FUNCTION NUMBER
- GETDSK EQU 19H ; GET CURRENT DISK FUNCTION
- DSKBYT EQU 01H ; OFFSET TO DISK SELECTOR BYTE (MEMVAR)
- ;
- START: PUSH ES ; SAVE SEGMENT REGISTERS
- PUSH DS ;
- PUSH BX ; SAVE MEMVAR ADDRESS
- MOV CL,GETDSK ; GET CURRENT DISK NUMBER
- INT BDOS ;
- MOV BYTE PTR SAVDSK,AL ; SAVE IT FOR RETURN ROUTINE
- POP BX ; RESTORE POINTER
- PUSH BX ; BUT KEEP IT ON STACK
- MOV DL,DSKBYT[BX] ; GET SELECTED DISK BYTE
- SUB DL,41H ; CONVERT LETTER TO NUMBER
- CMP DL,10H ; LEGITIMATE DISK SELECTOR
- JA KEEPDR ; KEEP DEFAULT IF NOT LEGAL
- MOV CL,SELDSK ; SELECT DISK FUNCTION
- INT BDOS ;
- KEEPDR: MOV CL,GETDPB ; LET'S GET DPB ADDRESS
- INT BDOS ; GO FETCH IT
- MOV SI,ES:BSHOFF[BX] ; GET BSH FOR VECTOR
- ; CALCULATION
- AND SI,00FFH ; CLEAR HIGH BYTE (JUST JUNK)
- SUB SI,03 ; SET UP VECTOR
- SHL SI,1 ; MULTIPLY BY 2 TO VECTOR
- ; INTO TABLE
- MOV AX,ES:DSMOFF[BX] ; GET DSM FOR LATER USE
- MOV BX,OFFSET BLKTBL ; GET BASE ADDRESS OF LOOKUP
- ; TABLE
- ADD SI,BX ; CALCULATE VECTOR
- PUSH DS ; GET DESTINATION SEGMENT
- POP ES ;
- MOV DI,OFFSET BLKSIZ ; GET DESTINATION ADDRESS
- CLD ; CLEAR DIRECTION FLAG
- ; (MOVE DOWN)
- MOVSW ; MOVE BLOCKSIZE FROM TABLE
- MOV CL,03H ; COUNT FOR SHIFT AX = AX/8
- SHR AX,CL ; ALV LENGTH = DSM / 8 + 1 + 1
- ; (FOR OUR COUNT)
- ADD AX,02 ;è STOSW ; SAVE ALV LENGTH (DI UPDATED
- ; BY MOVSW)
- MOV CL,GETALV ; NOW GET ALV ADDRESS
- INT BDOS ;
- MOV CX,WORD PTR ALVLNG ; GET BACK ALV LENGTH FOR
- ; COUNTER
- DEC BX ; PREP FOR COUNTER ROUTINE
- MOV AX,0000H ; ZERO THIS, IT'S OUR BIT
- ; COUNTER
- PUSH CX ; SET UP FOR ENTRY TO COUNTR
- COUNTR: POP CX ; GET BACK COUNT OF BYTES
- CNT0: INC BX ; NEXT (OR FIRST) BYTE
- DEC CX ; COUNT BYTES
- JCXZ DNECNT ; EXIT ON ALL BYTES ALV
- ; PROCESSED
- CMP ES:BYTE PTR[BX],0FFH ; CHECK FOR 8 BLOCKS FULL
- JNZ INCNTR ; IF NOT THEN COUNT 0'S
- ; (FREE BLOCKS)
- JMP CNT0 ; DO NEXT BYTE
- INCNTR: PUSH CX ; SAVE OUTSIDE LOOP COUNTER
- MOV CX,100H ; FOR TESTING BITS AND COUNTER
- CNT1: SHR CX,1 ; FOR BIT TO TEST
- JZ COUNTR ; SHR=0 THEN ALL BITS TESTED
- TEST ES:[BX],CX ; TEST BIT FOR SET
- JNZ CNT1 ; NOT A 0 BIT, DON'T COUNT
- INC AX ; AX IS OUR BIT COUNTER
- JMP CNT1 ; DO NEXT BIT
- DNECNT: SUB AX,02H ; 4 BLOCK ERROR ON IBM PC
- MOV CX,WORD PTR BLKSIZ ; GET BACK BLOCK SIZE
- MUL CX ; CALCULATE SPACE LEFT
- MOV SI,OFFSET CONTBL ; GET SUB TABLE FOR HTA
- ; DECIMAL CONV.
- PUSH DS ; SET UP ES FOR MOVE
- POP ES ; (HTA = HEX TO ASCII)
- POP BX ; GET BACK MEMVAR ADDRESS
- PUSH BX ; LEAVE A COPY ON STACK (TO
- ; RESTORE)
- MOV DI,BX ; GET IT TO DESTINATION
- ; REGISTER
- INC DI ; POINT TO FIRST BYTE
- MOV BX,AX ; GET LOW WORD OUT OF AX
- ; ( NEEDED )
- MOV CX,09H ; TOTAL ANSWER BYTES TO
- ; CALCULATE
- ANSWER: MOV AL,00 ; 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 ; PUTBACK AND DO NEXT
- ; SIGNIFICANT DIGIT IF >
- IN├ A╠ ╗ OTHERWIS┼ COUN╘ FO╥
- ; SIGNIFICANT DIGIT
- DEC SI ; POINT BACK TO LOW WORD
- DEC SI ;è JMP ANS0 ; AND DO AGAIN
- NXTBYT: DEC SI ; POINT TO LOW WORD
- DEC SI ;
- ADD BX,[SI] ; PUT BACK
- INC SI ; HIGH WORD
- INC SI ;
- ADC DX,[SI] ; PUT IT BACK
- ADD AL,30H ; CONVERT TO ASCII
- STOSB ; PLACE INTO ANSWER
- INC SI ; POINT TO NEXT SIGNIFICANT
- ; DIGIT SUB IN TABLE
- INC SI ;
- LOOP ANSWER ; EXIT ON DONE
- DONE: MOV AL,BL ; GET LAST BYTE
- ADD AL,30H ; CONVERT TO ASCII
- STOSB ; AND SAVE IT
- MOV DL,BYTE PTR SAVDSK ; GET BACK CURRENT DRIVE
- MOV CL,SELDSK ; SELECT DISK FUNCTION
- INT BDOS ;
- POP BX ; RESTORE POINTER
- POP DS ; RESTORE SEGMENTS
- POP ES ;
- RET ; RETURN TO DBASE
- ;
- BLKTBL DB 00H,04H,00H,08H,00H,10H,00H,20H,00H,40H
- BLKSIZ RW 1
- ALVLNG RW 1
- SAVDSK RB 1
- ;
- 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