CODE SEGMENT
ASSUME DS:CODE,CS:CODE,ES:CODE,SS:CODE
.386
ORG 100h
START:
mov ah,9
mov dx,offset OP_MSG
int 21h ;プロンプト表示
mov ah,01
int 21h ;1文字入力
and al,01Fh ;↓ドライブ番号に変換
cmp al,1
jae short GETINFO
cmp al,1Ah
jbe short GETINFO
mov al,0 ;↑ここまで
GETINFO:
mov ah,36h
mov dl,al
int 21h ;情報の取得
cmp ax,-1
jnz DISPINFO
mov al,0
jmp short GETINFO ;無効なドライブならカレントドライブ
DISPINFO:
push ax
push dx
mov ah,9
mov dx,offset MSG1
int 21h ;メッセージ表示
pop dx
pop ax
xchg cx,dx
pusha
xor eax,eax
xor ebx,ebx
xor ecx,ecx
xor edx,edx
popa ;EAX = 1クラスタあたりのセクタ数
;EBX = 使用可能なクラスタ数
;ECX = 1セクタあたりのバイト数
;EDX = 1ドライブあたりのクラスタ数
mul edx ;EDX:EAX = 1クラスタあたりのバイト数
push eax
mul ecx ;EDX:EAX = ドライブの全容量
call DISP ;前容量表示
pop eax
mul ebx ;EDX:EAX = 空き容量
push eax
mov ah,9
mov dx,offset MSG2
int 21h ;メッセージ表示
pop eax
call DISP ;空き容量表示
mov ax,4C00h
int 21h
DISP: ;↓EAXを10進数で表示するルーチン
mov ecx,10
xor edx,edx
div ecx
push edx
or eax,eax
jz DISPE
call DISP
DISPE:
pop edx
add dl,'0'
mov ah,2
int 21h
ret
OP_MSG db 'Input drive : $'
MSG1 db 0Dh,0Ah,'Total Space : $'
MSG2 db 0Dh,0Ah,' Free Space : $'
BUFF db 64,?,64 dup(?)
ENDS
END START
; 一部のコンパイラでは、
;CODE ENDS
; END START
;と記述しなければいけないようです
|