$CPU 8086 ' make compatible with XT systems $LIB ALL OFF ' turn off all PowerBASIC libraries $ERROR ALL OFF ' turn off all PowerBASIC error checking $OPTIMIZE SIZE ' optimize for smaller code $COMPILE UNIT ' COMPILE TO A UNIT (.PBU) '$COMPILE EXE ' COMPILE TO A UNIT (.PBU) DEFINT A-Z ' Required for all numeric functions, forces PB to not ' include floating point in UNIT (makes it smaller) '/*------------------------------------------------------------------*/ $CODE SEG "MLIB2" '/*------------------------------------------------------------------*/ FUNCTION CURRENTDRIVE() PUBLIC AS STRING LOCAL TMP$, TMPSEG??, TMPPTR??, STARTDRIVE?, TESTDRIVE? TMP$ = STRING$(26, 32) TMPSEG?? = STRSEG(TMP$) TMPPTR?? = STRPTR(TMP$) ASM PUSH AX ASM PUSH CX ASM PUSH DX ASM PUSH ES ASM PUSH DI ASM MOV AH, &H19 ;' GET CURRENT DRIVE ASM INT &H21 ASM MOV STARTDRIVE?, AL ;' SAVE AS ORIGINAL DRIVE ASM POP DI ASM POP ES ASM POP DX ASM POP CX ASM POP AX T = 65 + STARTDRIVE? FUNCTION = CHR$(T) END FUNCTION '/*------------------------------------------------------------------*/ FUNCTION GETDRIVELIST() PUBLIC AS STRING LOCAL TMP$, TMPSEG??, TMPPTR??, STARTDRIVE?, TESTDRIVE? TMP$ = STRING$(26, 32) TMPSEG?? = STRSEG(TMP$) TMPPTR?? = STRPTR(TMP$) ASM PUSH AX ASM PUSH CX ASM PUSH DX ASM PUSH ES ASM PUSH DI ASM MOV AH, &H19 ;' GET CURRENT DRIVE ASM INT &H21 ASM MOV STARTDRIVE?, AL ;' SAVE AS ORIGINAL DRIVE ASM MOV DL, AL ;' "CHANGE" TO CURRENT DRIVE SO AS TO LOAD ASM MOV AH, &H0E ;' DOS'S LAST DRIVE VALUE INTO AL ASM INT &H21 ASM XOR CX, CX ASM MOV CL, AL ;' MAXIMUM NUMBER OF DRIVES TO TEST=LAST DRIVE ASM MOV ES, TMPSEG?? ASM MOV DI, TMPPTR?? ;' NOW ES:DI -> TMP$ ASM XOR DX, DX ;' START TRYING WITH 0 (DRIVE A:) ASM CLD ;' BE SURE TO WORK FORWARD TRYADRIVE: ASM MOV DL, TESTDRIVE? ASM MOV AH, &H0E ;' ATTEMPT TO CHANGE TO NEW DRIVE IN DL ASM INT &H21 ASM MOV AH, &H19 ;' CHECK SUCCESS BY GETTING CURRENT DRIVE INTO AL ASM INT &H21 ASM CMP AL, TESTDRIVE? ;' WAS CHANGE GOOD? ASM JB SKIPPER1 ;' IF NO DODRIVELETTER: ASM ADD AL, 65 ;' IF YES, FIGURE ASCII OF DRIVE RETURNED ("A"=65) ASM STOSB ;' LOAD BYTE TO TMP$ SKIPPER1: ASM INC TESTDRIVE? ;' NEXT DRIVE TO TRY ASM LOOP TRYADRIVE ASM MOV AH, &H0E ;' RETURN TO ORIGINAL DRIVE ASM MOV DL, STARTDRIVE? ASM INT &H21 EXITVDRIVES: ASM POP DI ASM POP ES ASM POP DX ASM POP CX ASM POP AX FUNCTION = RTRIM$(TMP$) END FUNCTION '/*------------------------------------------------------------------*/ FUNCTION ISDRIVE(OPT$) PUBLIC AS INTEGER T$ = GETDRIVELIST IF INSTR(1,T$,OPT$) > 0 THEN FUNCTION = 1 ELSE FUNCTION = 0 END FUNCTION '/*------------------------------------------------------------------*/ ' $INCLUDE "C:\CODE\MLIB\MLIB.INC" ' CLS ' PRINT DRIVELIST ' PRINT ISDRIVE("A") ' PRINT ISDRIVE("B") ' PRINT ISDRIVE("C") ' PRINT ISDRIVE("D") ' PRINT ISDRIVE("E") ' PRINT ISDRIVE("F") ' PRINT ISDRIVE("Z") ' PRINT CURRENTDRIVE ' Y$ = GETKEY '/*------------------------------------------------------------------*/