;  getdir2.asm 91.03.13
;  copyright(c)1991 K.Kurosaki 

                .386p
;inter		=	0		; コンパイラのときはコメントに	

param           struc
                dd        ?        ; eip
p1              dd        ?        ; p1		機能番号(値)
p2              dd        ?        ; p2		ファイルパス(アドレス)
p3              dd        ?        ; p3		ファイル属性(値)
p4              dd        ?        ; p4		格納文字列個数(アドレス)
p5              dd        ?        ; p5		格納文字列(アドレス)
param           ends

code            segment    dword public ER use32 'CODE'
                assume     cs:CODE

getdir          proc    near

                mov     ebp,esp

		cmp	word ptr [ebp].p1,2	; 機能番号
		ja	err05			; 機能番号エラー

		xor	ecx,ecx
		mov	ebx,[ebp].p2		; ファイルパス 	
		mov     cx,[ebx+4]
                cmp	cx,0			; 文字列長が0
                je      err07

		mov	ebx,[ebx]		; 文字列の先頭へ
		cmp	word ptr [ebp].p1,2
		je	getdir40		; カレントディスク,ディレクトリ
getdir06:
		cmp	byte ptr [ebx],0
		je      getdir08		; 最後は0のはず

		inc	ebx
		loop	getdir06	 

		jmp	err07			; 最後が0じゃなかった
getdir08:
		mov	edx,offset dta
		mov	ah,1ah			; DTAのセット
		int	21h

		cmp	word ptr [ebp].p1,0	; 機能番号
		je	getdir12		; 個数カウントのみ
	
		mov	ebx,[ebp].p4
		mov	ecx,[ebx]		; 格納ファイル数
		cmp	ecx,0
		je	err07			; 領域不足

		push	ecx
		mov	ebx,[ebp].p5		; 格納文字列アドレス
		mov	ax,2020h		; スペースで埋める
getdir10:	
		mov	edi,[ebx]		; アドレス
		mov	dx,[ebx+4]		; 長さ
		cmp	ebx,24
		jb	err08			; 24文字未満はエラー

		push	ecx
		mov	ecx,12			; 2バイト×12回
		rep	stosw
		pop	ecx

		ifdef   inter
		add	ebx,6			;  次の位置へ(インタプリタ)
		else
		add	ebx,14			;  次の位置へ(コンパイラ)
		endif
		loop	getdir10

		pop	ecx
getdir12:
		push	ecx
		mov	ebx,[ebp].p2
                mov     edx,[ebx]       	; サーチするファイルパス
		mov	ecx,[ebp].p3		; ファイル属性		
                mov     ah,4eh
                int     21h             	; 最初のサーチ
                pop     ecx
                jc      errx10          	; ファイルなし

		cmp	word ptr [ebp].p1,0
		je	getdir30		; カウントのみ

                mov     ebx,[ebp].p5		; 格納先配列開始アドレス
                call    infsave			; ファイル情報の格納
		jc	err01			; ファイル形式がおかしい
getdir20:
		ifdef	inter	
		add	ebx,6			; 次の配列位置へ(インタプリタ)
		else
		add	ebx,14			; 次の配列位置へ(コンパイラ)
		endif

		push    ecx		
                push	ebx
                mov     ah,4fh          	; 次のサーチ
                int     21h
		pop     ebx
                pop     ecx
                jc      err00			; 合うファイルがもうない

		dec	ecx
		je	err07			; 格納場所がなくなった
		
                call    infsave
		jc	err01

                jmp     getdir20

getdir30:
		xor	ecx,ecx			; ファイル個数カウンタ
getdir32:
		inc	ecx
		push	ecx
                mov     ah,4fh          	; 次のサーチ
                int     21h
                pop     ecx
                jnc     getdir32		; 合うファイルがもうない

		mov	ebx,[ebp].p4
		mov	[ebx],ecx		; ファイル個数

		mov	eax,0			; 全ファイルサーチ
                ret
getdir40:
		cmp	ecx,64+3
		jb	err07			; 格納文字列の長さが足りない

		push	ebx
		mov	ah,19h			; カレントディスクの獲得
		int	21h
		pop	ebx

		add	al,'A'
		mov	[ebx],al		; アスキーに直して
		mov	ax,'\:'			 
		mov	[ebx+1],ax
		add	ebx,3			

		mov	esi,ebx			; デェレクトリの格納先
		xor	dx,dx			; カレントドライブ指定
		mov	ah,47h
		int	21h						
		jc	err04			; エラーがあるはずないけど
		
err00:
		mov	eax,0			; 正常終了
		jmp	errx20

err01:
		mov	eax,1			; ファイル名領域不良	
		jmp	errx20

errx10:
		mov	dx,ax
		mov	eax,2			; 対象ファイル無し
		cmp	dx,12h
		je	errx12

		mov	eax,3			; ファイルパス無効
		cmp	dx,2h
		je	errx12
err04:
		mov	eax,4			; 未知のファンクションエラー
errx12:
		ret
err05:
                mov	eax,5			; 機能番号異常
                ret
err06:
                mov	eax,6			; ファイルパス指定異常
                ret
err07:
                mov	eax,7			; 領域不足
errx20:
		mov	ebx,[ebp].p4
		mov	edx,[ebx]
		sub	edx,ecx
		inc	edx
		mov	[ebx],edx		; ファイル個数

                ret
err08:
		mov	eax,8			; 文字列長不足
		ret

getdir          endp

infsave		proc	near

		push	ecx	

                mov     esi,offset dta+15h     	; PSPのオフセット

		mov     edi,[ebx]

                mov     al,[esi]	     	; 属性 
                mov     [edi],al

                mov     ax,[esi+1] 	  	; 時刻 
		mov	dx,ax
       		rol	ax,4
                and	ax,1fh
                mov     [edi+1],al		; 時

		mov	ax,dx
		shr	ax,5
		and	ax,3fh
          	mov	[edi+2],al		; 分

		shl	dx,1
		and	dx,3fh
		mov	[edi+3],dl		; 秒	

                mov     ax,[esi+3] 	  	; 日時 
		mov	dx,ax
       		rol	ax,7
                and	ax,7fh
                mov     [edi+4],al		; 年

		mov	ax,dx
       		shr	ax,5
                and	ax,0fh
                mov     [edi+5],al		; 月

		and	dx,1fh
                mov     [edi+6],dl		; 日
		
		mov	al,[esi+5]		; ファイルサイズ
		mov	[edi+10],al
		mov	al,[esi+6]
		mov	[edi+9],al
		mov	al,[esi+7]
		mov	[edi+8],al
		mov	al,[esi+8]
		mov	[edi+7],al

		mov	esi,offset dta+1eh	; ファイル名

		add	edi,11
		mov	ecx,13
infsave10:
		mov	al,[esi]
		inc	esi
		cmp	al,0
		je	infsave20		; 最後は0のはず

		mov	[edi],al
		inc	edi

		loop	infsave10

		pop	ecx
		stc				; 最後に0が来なかった
		ret
infsave20:
		pop	ecx
		clc				; 正常終了
                ret

infsave		endp

dta		db	256 dup(?)

CODE            ends
                end
