;blta.asm (Long Fullpath BLT All for all DOS ver0.41k 2012-01-08 )
INCLUDE STDIO.H
CODE SEGMENT BYTE
ASSUME CS:CODE, DS:CODE, ES:CODE, SS:CODE
org 80h
argc db ? ;引数のサイズ 0-127bytes
argv db 127 dup (?)
org 100h
;-----------------------------------------------------------------
START:
mov bx,80h ;↓引数をASCIIZにする
add bl,[bx] ;引数のサイズ取得
inc bx
cmp bx,83h ;★ 引数が無い時
jb normal ;★
mov [bx],byte ptr 0 ;引数終わりの0Dhをnullに
mov bx, offset argv ;↓第一引数の処理
SWCHR: add bx,1
cmp byte ptr [bx],'/'
je SWCHR
cmp byte ptr [bx],'-'
je SWCHR
cmp byte ptr [bx],'D'
je OP_D
cmp byte ptr [bx],'d'
je OP_D
cmp byte ptr [bx],'P'
je OP_P
cmp byte ptr [bx],'p'
je OP_P
cmp byte ptr [bx],'F'
je OP_F
cmp byte ptr [bx],'f'
je OP_F
cmp byte ptr [bx],'?'
je USAGE
cmp byte ptr [bx],'H'
je USAGE
cmp byte ptr [bx],'h'
je USAGE
cmp byte ptr [bx],' ' ;スペースなら第二引数の先頭
jb OPERR ;
jne USAGE ;それ以外の文字ならHELP
sp2: add bx,1
cmp byte ptr [bx],' ' ;
jb OPERR ;
je sp2
mov FILE2,word ptr bx
jmp normal
OP_D: mov OPT_D,1 ; ""
jmp SWCHR
OP_P: mov OPT_P,1 ; full Pass
jmp SWCHR
OP_F: mov OPT_F,1 ; Filename opt2
jmp SWCHR
OPERR: cmp OPT_F,0 ; 引数が無い
je normal
USAGE: print help_usage
newline
retms
;-----------------------------------------------------------------
;get current disk
normal:
mov ah,19h
int 21h ;-> disk num in AL
add al,'A' ;num2char
mov BUFF_DP, byte ptr al
;get current directory (LFN) ----
mov dl,0
mov ax,7147h
mov si,offset BUFF_FP ;BUFF_DP+3
int 21h
cmp ax,7100h
jne win
mov ah,47h
mov al,byte ptr BUFF_DP
add al,1 ;AL num different! A=0 (19h) & A=1 (47h)
mov dl,al
mov si,offset BUFF_FP ;BUFF_DP+3
int 21h
jmp dos
win:
mov OPT_W,1
;check & flag set ----
dos:
cmp BUFF_DP[3],0
je FIND1
mov FLAG, byte ptr 1 ;if root 0 not root 1(=add '\')
;findfirst ----
FIND1: mov ax,714eh
mov dx,offset FILE1 ;'*.*'
cmp OPT_F,0
je FI0
mov word ptr dx,FILE2 ;opt2
FI0: call SET ;set cx, si, di
cmp OPT_W,0
jne FI1
mov ah,4eh
FI1: int 21h
jc BYE ;not found?
mov HAND, word ptr ax ;save handle num
call print_fn ;print drive+dir
;findnext ----
FINDN: mov bx,HAND
mov ax,714fh
call SET
cmp OPT_W,0
jne FN1
mov ah,4fh
FN1: int 21h
jc BYEBYE
call print_fn
jmp FINDN
ERR: print ERR_MSG1 ;not win32
retms
BYE: print ERR_MSG2 ;file not found
BYEBYE:
mov bx,HAND ;HANDLE CLOSE
mov ax,71a1h
int 21h
retms
; --- subroutines ---
SET: mov cx,28h ;directory, volume 除く
mov si,1
mov di,offset BUFF_F
ret
; --- print1 subroutines ---
PRI: cmp [bx],byte ptr 0
je FIN
putchar [bx]
inc bx
jmp PRI
FIN: ret
; --- print filename ---
print_fn:
cmp OPT_D,0 ;print drive+dir
je B0
putchar '"'
B0: cmp OPT_P,0
je B1
mov bx,offset BUFF_DP
call PRI
cmp FLAG,0
je B1
putchar '\'
B1: mov bx,offset BUFF_F+2ch
call PRI
cmp OPT_D,0
je B2
putchar '"'
B2: newline
ret
OPT_W db 0 ;DOS 0 win 1
OPT_P db 0 ;full Path flag
OPT_F db 0 ;Filename opt2 flag
OPT_D db 0 ;double quote flag
FLAG db 0 ;if root 0 not root 1(=add '\')
HAND dw ? ;handle
FILE1 db '*.*',0
FILE2 dw 0 ;opt2 filename
BUFF_DP db ?,':\'
BUFF_FP db 300 dup (0)
BUFF_F db 320 dup (0)
ERR_MSG1 db 'Run on Windows','$'
ERR_MSG2 db 'File Not Found','$'
help_usage db 'BLTA.COM file lister for all DOS Ver0.41k',CR,LF
db ' usage BLTA opt filename',CR,LF
db ' opt D or d Double quote',CR,LF
db ' opt P or p full Path',CR,LF
db ' opt F or f File name opt',CR,LF
db ' opt H or h or ? Help usage',CR,LF
db '$'
pend