162 lines
5.4 KiB
NASM
162 lines
5.4 KiB
NASM
|
; Goes thru 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
|
||
|
|
||
|
.model tiny
|
||
|
.286
|
||
|
|
||
|
DRIVEXISTS 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
|
||
|
|
||
|
.code
|
||
|
org 100h
|
||
|
|
||
|
start: mov ah,19h
|
||
|
int 21h ; get start drive
|
||
|
mov [curdrive],al
|
||
|
|
||
|
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],DRIVEXISTS
|
||
|
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],DRIVEXISTS
|
||
|
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
|
||
|
|
||
|
mov ah,0eh
|
||
|
mov dl,[curdrive]
|
||
|
int 21h ; reset start drive
|
||
|
|
||
|
mov cl,'A' ; output all existing drives
|
||
|
mov di,offset drives
|
||
|
mov ah,9
|
||
|
drvdumploop: cmp byte ptr [di],DRIVEXISTS
|
||
|
jne nextdrvdump
|
||
|
mov al,cl
|
||
|
int 29h
|
||
|
xor dh,dh
|
||
|
mov dl,byte ptr [di+1]
|
||
|
shl dx,4
|
||
|
add dx,offset removablemsg
|
||
|
int 21h
|
||
|
xor dh,dh
|
||
|
mov dl,byte ptr [di+2]
|
||
|
shl dx,3
|
||
|
add dx,offset localmsg
|
||
|
int 21h
|
||
|
xor dh,dh
|
||
|
mov dl,byte ptr [di+3]
|
||
|
shl dx,3
|
||
|
add dx,offset typemsg
|
||
|
int 21h
|
||
|
mov dx,offset crlf
|
||
|
int 21h
|
||
|
|
||
|
nextdrvdump: add di,4
|
||
|
inc cl
|
||
|
cmp cl,'Z'
|
||
|
jbe drvdumploop
|
||
|
|
||
|
ret
|
||
|
|
||
|
curdrive db 0
|
||
|
drives db 26 dup(0,1,0,1)
|
||
|
; default to not exist, fixed, local, hard drive
|
||
|
crlf db 10,13,'$'
|
||
|
removablemsg db ': Removable $'
|
||
|
db ': Fixed $'
|
||
|
localmsg db 'Local $'
|
||
|
db 'Remote $'
|
||
|
db 'Shared $'
|
||
|
typemsg db 'Floppy $'
|
||
|
db 'Hard $'
|
||
|
db 'RAM $'
|
||
|
db 'Subst $'
|
||
|
db 'CD-ROM $'
|
||
|
|
||
|
end start
|