130 lines
4.3 KiB
NASM
130 lines
4.3 KiB
NASM
|
; Goes through drives A-Z and determines if they:
|
||
|
; 1) Exist
|
||
|
; 2) Are removable or fixed
|
||
|
; 3) Are local, remote, or shared
|
||
|
; 4) Are a floppy, hard, RAM, subst, or CD-ROM drive
|
||
|
;
|
||
|
; Callable from C as: void Drives_Exist(void);
|
||
|
|
||
|
.model small
|
||
|
.286
|
||
|
|
||
|
DRIVEEXIST EQU 1
|
||
|
|
||
|
REMOVEDRV EQU 0
|
||
|
FIXEDDRV EQU 1
|
||
|
|
||
|
LOCALDRV EQU 0
|
||
|
REMOTEDRV EQU 1
|
||
|
SHAREDRV EQU 2
|
||
|
|
||
|
FLOPPY EQU 0
|
||
|
HARD EQU 1
|
||
|
RAM EQU 2
|
||
|
SUBST EQU 3
|
||
|
CDROM EQU 4
|
||
|
|
||
|
.data
|
||
|
PUBLIC _drives
|
||
|
_drives db 26 dup(0,1,0,1)
|
||
|
; default to not exist, fixed, local, hard drive
|
||
|
|
||
|
.code
|
||
|
|
||
|
PUBLIC _Drives_Exist
|
||
|
_Drives_Exist PROC NEAR
|
||
|
pusha
|
||
|
push es
|
||
|
|
||
|
mov ah,19h
|
||
|
int 21h ; get start drive
|
||
|
push ax ; save start drive
|
||
|
|
||
|
mov ax,40h
|
||
|
mov es,ax
|
||
|
mov bh,es:[10h] ; 40:10h is # of floppies-1
|
||
|
shr bh,6
|
||
|
inc bh ; # of actual floppy drives
|
||
|
mov bl,1
|
||
|
mov di,offset _drives
|
||
|
nextchkfloppy: mov ax,4409h ; check if drive exists
|
||
|
int 21h
|
||
|
jc nextsetfloppy
|
||
|
test dh,10000000b ; check if SUBST drive
|
||
|
jz chkfloppy
|
||
|
dec bh ; dec actual drive count
|
||
|
mov byte ptr [di+3],SUBST
|
||
|
setfloppyexist: mov byte ptr [di],DRIVEEXIST
|
||
|
jmp nextsetfloppy
|
||
|
chkfloppy: dec bh ; dec actual drive count
|
||
|
js nextsetfloppy
|
||
|
mov byte ptr [di+1],REMOVEDRV
|
||
|
mov byte ptr [di+3],FLOPPY
|
||
|
jmp setfloppyexist
|
||
|
nextsetfloppy: add di,4
|
||
|
inc bl
|
||
|
cmp bl,2 ; if B then jump back
|
||
|
je nextchkfloppy
|
||
|
|
||
|
mov ch,24 ; loop 24 times (drives C - Z)
|
||
|
mov cl,3 ; start at C:
|
||
|
drivechkloop: mov ax,4409h ; check if drive exists
|
||
|
mov bl,cl ; set drive letter
|
||
|
int 21h ; 0 = default, 1 = A:, etc.
|
||
|
jc nextsetdrv
|
||
|
mov byte ptr [di],DRIVEEXIST
|
||
|
mov ax,4408h ; check if removable
|
||
|
int 21h
|
||
|
mov byte ptr [di+1],al ; set REMOVABLE or FIXED
|
||
|
mov bx,dx
|
||
|
mov dl,dh
|
||
|
shr dl,7
|
||
|
and dh,00010000b
|
||
|
shr dh,4
|
||
|
mov byte ptr [di+2],dh ; set REMOTE or LOCAL
|
||
|
or dl,dl ; if not SUBST, then jump
|
||
|
jz chkremote
|
||
|
mov byte ptr [di+3],SUBST
|
||
|
jmp nextsetdrv
|
||
|
|
||
|
chkremote: cmp dh,REMOTEDRV ; if REMOTE, then check for CD ROM
|
||
|
je chkcdrom
|
||
|
|
||
|
test bh,00000010b ; sharable?
|
||
|
jz drivenoshare
|
||
|
mov byte ptr [di+2],SHAREDRV
|
||
|
drivenoshare: test bl,00000010b ; RAM drive?
|
||
|
jnz nextsetdrv
|
||
|
mov byte ptr [di+3],RAM
|
||
|
jmp nextsetdrv
|
||
|
|
||
|
chkcdrom: push cx
|
||
|
mov ax,1500h
|
||
|
xor bx,bx
|
||
|
int 2fh
|
||
|
pop cx
|
||
|
or bx,bx ; MSCDEX driver found?
|
||
|
jz nextsetdrv ; if not, jump to next drive setup
|
||
|
mov ax,150bh
|
||
|
dec cl ; 0=A:, etc.
|
||
|
int 2fh
|
||
|
inc cl
|
||
|
or ax,ax
|
||
|
jz nextsetdrv ; drive supported by MSCDEX?
|
||
|
mov byte ptr [di+3],CDROM
|
||
|
|
||
|
nextsetdrv: add di,4
|
||
|
inc cl
|
||
|
dec ch
|
||
|
jnz drivechkloop
|
||
|
|
||
|
pop dx
|
||
|
mov ah,0eh
|
||
|
int 21h ; reset start drive
|
||
|
|
||
|
pop es
|
||
|
popa
|
||
|
ret
|
||
|
_Drives_Exist ENDP
|
||
|
|
||
|
END
|