.xlist
STDIN		equ	0	;
STDOUT		equ	1	;
STDERR		equ	2	;

CR		equ	0dh
LF		equ	0ah
TAB		equ	09h
ESCP		equ	1bh
EOT		equ	'$'
EOF		equ	1ah

PSP_SEL		equ	04h
TBIOS_SEL	equ	0110h
VRAM1_SEL	equ	120h
VRAM2_SEL	equ	128h

FALSE		equ	0
TRUE		equ	(not FALSE)
.list
;
doscall	macro	func
ifnb	<func>
if	func ge 100h
	mov	ax,func
else
	mov	ah,func
endif
endif
	int	21h
	endm
;
G_work_size	equ	15300h
EGB	equ	fword ptr fs:[20h]
;
graphic_work	dd	?
;
M_work_size	equ	4096d
MUS	equ	fword ptr fs:[40h]
MSN	equ	fword ptr fs:[48h]
;
mause_work	dd	?
;
file_msg	dw	28
locate_y	dw	80
		dw	14
file_put	db	12 dup (0)
		db	1  dup (0)
file_type1	db	1  dup (0)
		db	0
;
file_msdos	db	21 dup (0)
file_inf	db	0
file_time	dw	0
file_date	dw	0
file_size	db	4  dup (0)
file_name	db	12 dup (0)
		db	0
;
file_space	db	12 dup (0)
		db	0
;
pass_msg	dw	24
		dw	24
file_pass_s	dw	09
file_pass	db	24 dup (0)
		db	0
;
NextPrmOffset	dd	?
;
wait_msg	dw	0
		dw	16
		dw	2
		db	'<>'
		db	0
;
err_msg0	dw	0
		dw	32
		dw	15
          	db	'ﾄﾞﾗｲﾌﾞ番号が無効です｡'
;
err_msg1	dw	0
		dw	48
		dw	15
          	db	'パスが無効です｡'
;
err_msg2	dw	0
		dw	64
		dw	11
          	db	'一致しない｡'
;
mause_y		dw	80
mause_x		dw	80
;
;=======< FILE display テスト プログラム >========
start:
	mov	ax,0004h		; コマンドライン領域のセレクタの設定
	mov	fs,ax			;
	mov	esi,81h			;  esi=コマンド領域のポインタ
	mov	edi,offset file_pass	;  edx=表示領域のポインタ
	movzx	ecx,byte ptr fs:[esi-1]	;  ecx=コマンド文字数
	mov	byte ptr fs:[esi+ecx],0	;  コマンド領域の最後に区切り文字セット
	mov	ds:[file_pass_s],cx	;  文字数セット
cmdprm:
	lods	byte ptr fs:[esi]	;  al=コマンド領域から一文字取り出す
	cmp	al,' '			;  空白なら読み飛ばす
	je	cmdprm			;
	cmp	al,TAB			;  TABなら読み飛ばす
	je	cmdprm			;
	stosb				;  表示領域=al
	cmp	al,0			;  終了ならMAINへ
	je	main			;
	jmp	short cmdprm		;
;
main:
	mov	ax,0110h		; BIOS領域のセレクタの設定
	mov	fs,ax			;
;
	sub	esp,G_work_size		; スタックにEGB用作業領域の確保
	mov	graphic_work,esp	;
	mov	edi,esp			; EGBの初期化 
	mov	ecx,G_work_size		;
	mov	ah,00h			;
	call	EGB			;
;
	mov	ah,01h			; 640*480 256色 モードにする
	mov	al,00h			;
	mov	edx,12d			;
	call	EGB			;
;
	mov	ah,05h			; 書き込みページを0にする
	mov	al,00h			;
	call	EGB			;
;
	mov	ah,06h			; 表示ページを0にする
	mov	al,00h			;
	mov	edx,00000001h		;
	call	EGB			;
;
	mov	ah,08h			; 前景色設定
	mov	al,00h			;
	mov	edx,00ffffffh		;
	call	EGB			;
;
	mov	ah,08h			; 背景色設定
	mov	al,01h			;
	mov	edx,00000fffh		;
	call	EGB			;
;
	mov	ah,17h			; 文字間隔設
	mov	dx,0001h		;
	call	EGB			;
;
	mov	ah,19h			; 文字の字体設定
	mov	dx,0001h		;
	call	EGB			;
;
	mov	ax,0a09h		; 描画モードの設定
	call	EGB			;
;
	mov	ah,20h			; 画面クリア
	call	EGB			;
;
	mov	esi,offset pass_msg	; パラメタの表示
	mov	edi,graphic_work	;
	mov	ah,60h			;
	call	EGB			;
;
;=======< 先頭のファイル検索 >========
	mov	edx,offset file_msdos
	doscall	1ah
;
	mov	edx,offset file_pass	; 最初に一致するファイル名の検索
	mov	ecx,0000ffffh		;
	doscall	4eh			;
;
	cmp	ax,02d
	je	short err1
	cmp	ax,18d
	je	short err2
;
	mov	esi,offset file_msg
	jmp	short msgput1
err1:
	mov	esi,offset err_msg1
	jmp	short msgput1
err2:
	mov	esi,offset err_msg2
msgput1:
	mov	edi,graphic_work
	mov	ah,60h
	call	EGB
;
;=======< ファイルが無くなる迄ファイル検索 >========
dirstart:
	mov	edx,offset file_pass	; 次に一致するファイル名の検索
	doscall	4fh			;
;
	cmp	ax,18d			; 終了判定
	je	dirend			;
;
	mov	esi,offset file_name	; ファイル名表示領域に複写
	mov	edi,offset file_put	;  esi=ファイル名格納場所
	mov	ecx,12d			;  edi=ファイル名表示領域
	cld				;  ecx=文字数
	inc	ecx			;
	rep	movsb			;
;
	mov	esi,offset file_space	; ファイル名格納領域を初期化
	mov	edi,offset file_name	;  esi=ファイル名初期値
	mov	ecx,12d			;  edi=ファイル名格納
	cld				;  ecx=文字数
	inc	ecx			;
	rep	movsb			;
;
	mov	ds:[file_type1],' '	;
;
	mov	ah,file_inf		; ファイル属性設定
	and	ah,10h			;
	cmp	ah,10h			;  
	jne	short setnt1		;
	mov	ds:[file_type1],'d'	;
setnt1:
;
dirput:
	mov	esi,offset file_msg	; ファイル名表示
	mov	edi,graphic_work	;
	mov	ah,60h			;
	call	EGB			;
	mov	ax,16d			;
	add	ds:[locate_y],ax	;
	mov	ax,400d			;
	cmp	ds:[locate_y],ax	;
	je	short ly		;
	jmp	dirstart		;
ly:	mov	ax,80d			;
	mov	ds:[locate_y],ax	;
	mov	ax,100d			;
	add	ds:[file_msg],136d	;
	jmp	dirstart
;
dirend:
	sub	esp,M_work_size		; スタックに作業領域を獲得する。
	mov	mause_work,esp		;
	mov	edi,esp			;
	mov	ecx,M_work_size		;
	mov	ah,00h			; マウスの初期化を行う
	call	MUS			;
;  
	mov	ah,0dh			; マウスの表示画面の設定
	mov	al,0d			;   表示ページ0
	mov	edx,12d			;   画面モード12
	call	MUS			;
;  
	mov	ah,02h			; マウスの表示
	mov	al,1d			;
	call	MUS			;
;
msta:
	call	MSN			; マウスの状態監視
;  
	mov	ah,03h			; マウスの状態取り込み  
	call	MUS			;
;
	mov	esi,offset wait_msg
	mov	edi,graphic_work
	mov	ah,60h
	call	EGB
;
	cmp	ch,00h			; マウスボタンが押されたか  
	je	short msta		;
;
	mov	ah,01h			; マウス動作終了
	call	MUS			;
;
;
;=======< MS-DOSに戻る >========
	doscall	4c00h
        ret
;
.stack	20000h * 4
;
	end	start
