;================================================
;= タイトル：ＣＯＮＳＯＬＥ＋＋　　　 ver 2.0	=
;=         programed by Ｋ.OKAMOTO :copy free   =
;================================================
;
;;参考文献:富士通ＦＭＲシリーズ　徹底解析マニュアル　：ＢＮＮ
;
	;
CODE	SEGMENT
	ASSUME	CS:CODE,DS:CODE		;;タイニーモデル
	;
F_NO	EQU	00H
F_LEFT	EQU	01H
F_RIGHT	EQU	02H
F_TYPE	EQU	04H
	;
	;
MOUSE	PROC	FAR		;;マウス割り込みルーチン
	;
	MOV	CS:BUTTON,CH	;;現在押されているボタン
	;
	MOV	CL,3		;;水平位置
	SHR	BX,CL
	INC	BX
	MOV	CS:CUR_X,BL
	;
	MOV	CL,4		;;垂直位置
	SHR	DX,CL
	INC	DX
	MOV	CS:CUR_Y,DL
	;
	CMP	AX,0002H	;;左ボタン押してる
	JNE	TRG1
	CALL	HIT
	JMP	E_MOU
TRG1:	;
	CMP	AX,0008H	;;右ボタン押してる
	JNE	TRG2
	CALL	DIR
	JMP	E_MOU
TRG2:	;
	;
E_MOU:	RET
MOUSE	ENDP
	;
	;
HIT	PROC			;;左クリックルーチン
	;
	MOV	AX,CS			;DS=CS
	MOV	DS,AX
	;
	CMP	BYTE PTR DRV_F,F_RIGHT	;;右ドライブシフトがあった
	JNE	HIT1
	;
	TEST	BYTE PTR BUTTON,F_RIGHT	;;右ボタンを押しっぱなしか？
	JZ	HIT1
	;
	CALL	DRVR		;;右ドライブシフト
	;
	JMP	E_HIT		;;おしまい
	;
HIT1:	CMP	CUR_X,1		;;左端をクリックしたか？
	JNE	HEAD
	;
	CALL	GET_CH		;;半角か？
	TEST	BH,01H
	JNZ	HEAD
	;
	MOV	DRV,BL		;;ドライブ名保存
	;
	INC	CUR_X
	;
	CALL	GET_CH		;;ドライブ名か？
	DEC	CUR_X
	CMP	BX,003EH	;;'>'
	JNE	HEAD
	;
	MOV	BYTE PTR DRV_F,F_LEFT
	;
	CALL	DRVL		;;左ドライブシフト
	;
	JMP	E_HIT
	;
	;
HEAD:	CALL	GET_CH
	CMP	BX,0020H	;;スペース
	JNE	HEAD1
	JMP	E_HIT
	;
HEAD1:	CMP	BX,003EH	;;'>'
	JNE	HEAD2
	JMP	E_HIT
	;
HEAD2:	CMP	CUR_X,1		;;この文字列の先頭を探す
	JE	F_NAME
	DEC	CUR_X
	CALL	GET_CH
	CMP	BX,0020H
	JE	H_LOOK
	CMP	BX,003EH	;;'>'
	JNE	HEAD2
	JMP	E_HIT
	;
H_LOOK:	INC	CUR_X
	;
F_NAME:	MOV	AL,CUR_X
	;
	AND	AL,0FH		;;DIR /W で表示されたディレクトリを指すか？
	CMP	AL,01H
	JE	FIL_N
	;
	JMP	E_HIT
	;
	;
	;;ファイル名か？（文字列の構造）
	;
FIL_N:	MOV	CX,0		;;文字数
	MOV	DI,OFFSET F_BUFF
	;
FIL_N1:	CALL	GET_CH		;;ファイル名の文字の有る部分
	MOV	[DI],BX		;;xxxx____.xxx
	;			;;^^^^
	;
	INC	CX
	INC	CUR_X
	INC	DI
	INC	DI
	;
	CMP	BX,0020H	;;スペースを見つけた
	JZ	FIL_N2
	;
	CMP	CX,9		;;９文字つづくファイル名は無い
	JZ	E_HIT
	;
	JMP	FIL_N1
	;
FIL_N2:	DEC	CX
	DEC	CUR_X
	DEC	DI
	DEC	DI
	;
FIL_S:	MOV	WORD PTR [DI],0	;;終わりの記号
	;
FIL_S1:	CALL	GET_CH		;;ファイル名の文字の無い部分
	;			;;xxxx____.xxx
	;			;;    ^^^^^
	INC	CUR_X
	INC	CX
	;
	CMP	BX,0020H	;;スペースでなければならない
	JNE	E_HIT
	;
	CMP	CX,9		;;もう拡張子？
	JNE	FIL_S1
	;
	;
FIL_E:	MOV	DI,OFFSET E_BUFF
	MOV	CX,3
	;
FIL_E1:	CALL	GET_CH		;;拡張子の有る部分
	MOV	[DI],BX		;;xxxx____.xxx
	;			;;         ^^^
	INC	CUR_X
	INC	DI
	INC	DI
	;
	LOOP	FIL_E1		;;黙ってコピー
	;
	MOV	WORD PTR [DI],0	;;終わりの記号
	;
	;CALL	DEBUG		;;得ることの出来たファイル名の表示
	;
	MOV	DRV_F,F_NO	;;ドライブシフトなし
	;
	CALL	E_JOB		;;拡張子ごとの処理をする
	;
	MOV	WORD PTR [DI],000DH
	INC	CX
	;
	MOV	WORD PTR [DI+2],0000H
	;
	CALL	JIS_CNV		;バッファのＪＩＳ漢字をシフトＪＩＳにする。
	;
	;CALL	DEBUG2		;;ＫＥＹバッファに送るはずの文字列を表示
	;
	MOV	AX,0B01H
	MOV	DI,OFFSET KBUFF
	INT	90H
	;
E_HIT:	RET
HIT	ENDP
	;
	;
E_JOB	PROC
	MOV	SI,OFFSET E_BUFF	;拡張子を調べる
	MOV	AX,[SI]
	INC	SI
	INC	SI
	CMP	AL,'E'		;EXE/EXP
	JE	K_EXE
	CMP	AL,'C'		;COM
	JE	K_COM
	CMP	AL,'B'		;BAT
	JE	K_BAT
	CMP	AL,' '		;' '
	JE	K_CD
	;
	JMP	J_TYPE		;;その他：TYPE 処理
	;
K_EXE:	CMP	BYTE PTR [SI],'X'
	JNE	J_TYPE
	INC	SI
	INC	SI
	;
	CMP	BYTE PTR [SI],'E'
	JE	J_EXE		;実行処理
	;
	CMP	BYTE PTR [SI],'P'
	JE	J_EXP		;RUN386実行処理
	;
	JMP	J_TYPE		;TYPE 処理
	;
	;
K_COM:	CMP	BYTE PTR [SI],'O'
	JNE	J_TYPE
	INC	SI
	INC	SI
	;
	CMP	BYTE PTR [SI],'M'
	JE	J_EXE		;実行処理
	;
	JMP	J_TYPE		;TYPE 処理
	;
K_BAT:	CMP	BYTE PTR [SI],'A'
	JNE	J_TYPE
	INC	SI
	INC	SI
	;
	CMP	BYTE PTR [SI],'T'
	JE	J_EXE		;実行処理
	;
	JMP	J_TYPE		;TYPE 処理
	;
K_CD:	CMP	BYTE PTR [SI],' '
	JNE	J_TYPE
	INC	SI
	INC	SI
	;
	CMP	BYTE PTR [SI],' '
	JE	J_CD		;ディレクトリ変更処理
	;
	JMP	J_TYPE		;TYPE 処理
	;
	;
	;
J_EXE:	MOV	SI,OFFSET F_BUFF
	MOV	DI,OFFSET KBUFF
	MOV	CX,0
	;
	CALL	S_COPY
	;
	JMP	JOB_E
	;
	;
J_CD:	MOV	SI,OFFSET S_CD
	;
	JMP	J_EXP0
	;
J_EXP:	MOV	SI,OFFSET S_386
	;
J_EXP0:	MOV	DI,OFFSET KBUFF
	MOV	CX,0
	;
	CALL	S_COPY
	;
	MOV	SI,OFFSET F_BUFF
	;
	CALL	S_COPY
	;
	JMP	JOB_E
	;
	;
J_TYPE:	MOV	SI,OFFSET S_TYPE
	MOV	DI,OFFSET KBUFF
	MOV	CX,0
	;
	CALL	S_COPY
	;
	MOV	SI,OFFSET F_BUFF
	;
	CALL	S_COPY
	;
	MOV	WORD PTR [DI],002EH
	INC	DI
	INC	DI
	INC	CX
	;
	MOV	SI,OFFSET E_BUFF
	;
	CALL	S_COPY
	;
	MOV	BYTE PTR DRV_F,F_TYPE	;ＴＹＰＥしたよフラグ
	;
	JMP	JOB_E
	;
	;
JOB_E:	RET
	;
E_JOB	ENDP
	;
	;
S_COPY	PROC			;MACRO
	;	JMP	S_CO_E	;DEBUG
S_COP:	MOV	AX,[SI]
	MOV	[DI],AX
	INC	CX
	INC	SI
	INC	SI
	INC	DI
	INC	DI
	;
	CMP	AX,0
	JNZ	S_COP
	;
	DEC	CX
	DEC	SI
	DEC	SI
	DEC	DI
	DEC	DI
	;
S_CO_E:	RET
	;
S_COPY	ENDP
	;
	;
JIS_CNV	PROC	;バッファのＪＩＳ漢字をシフトＪＩＳにする。
	;
	MOV	SI,OFFSET KBUFF
JIS_1:	MOV	AX,[SI]
	;
	CMP	AX,0	;おしまい
	JE	JIS_E
	;
	TEST	AH,01H	;半角
	JZ	JIS_2
	;
	MOV	DH,AL	;漢字変換
	;
	MOV	AX,[SI+2]
	;
	CMP	AX,0	;おしまい
	JZ	JIS_E
	;
	MOV	DL,AL	;漢字変換
	;
	MOV	AH,00H	;漢字変換 "JIS" TO "SHIFT JIS"
	INT	0AFH
	;
	MOV	AH,0
	MOV	AL,DH
	MOV	[SI],AX		;漢字変換
	MOV	AL,DL
	MOV	[SI+2],AX	;漢字変換
	;
	INC	SI
	INC	SI
	;
JIS_2:	INC	SI
	INC	SI
	;
	JMP	JIS_1
	;
JIS_E:	RET	
	;
JIS_CNV	ENDP
	;
	;
DIR	PROC				;"DIR /W"する 
	;
	MOV	AX,CS			;DS=CS
	MOV	DS,AX
	;
	TEST	BYTE PTR BUTTON,F_LEFT	;;左ボタンを押しっぱなしか？
	JZ	DIR1
	;
	CMP	BYTE PTR DRV_F,F_LEFT	;;左ドライブシフトがあった
	JNE	DIR0
	;
	CALL	DRVL		;;左ドライブシフト
	;
	JMP	E_DIR
	;
DIR0:	CMP	BYTE PTR DRV_F,F_TYPE	;ＴＹＰＥしたよフラグ
	JNE	DIR1
	;
	CALL	CTL_C		;;  [CTRL]+C 処理
	;
	JMP	E_DIR
	;
DIR1:	CMP	CUR_X,1		;;左端をクリックしたか？
	JNE	NR_DRV
	;
	CALL	GET_CH		;;半角か？
	TEST	BH,01
	JNZ	NR_DRV
	;
	MOV	DRV,BL		;;ドライブ名保存
	;
	INC	CUR_X
	;
	CALL	GET_CH		;;半角か？
	DEC	CUR_X
	CMP	BX,003EH	;;'>'
	JNE	NR_DRV
	;
	MOV	BYTE PTR DRV_F,F_RIGHT
	;
	CALL	DRVR		;;右ドライブシフト
	;
	JMP	E_DIR
	;
NR_DRV:	;
	MOV	AX,0B01H
	MOV	CX,8
	MOV	DI,OFFSET DIRBUFF
	INT	90H
	;
	MOV	DRV_F,F_NO	;;ドライブシフトなし
	;
E_DIR:	RET
	;
DIR	ENDP
	;
	;
	;
DRVL	PROC
	MOV	AL,DRV
	DEC	AL
	CMP	AL,'A'-1
	JNE	DRVL1
	MOV	AL,'Q'
DRVL1:	;
	MOV	DRV,AL
	MOV	AX,0B01H
	MOV	CX,3
	MOV	DI,OFFSET DRV
	INT	90H
	;
	RET
	;
DRVL	ENDP
	;
	;
DRVR	PROC
	MOV	AL,DRV
	INC	AL
	CMP	AL,'Q'+1
	JNE	DRVR1
	MOV	AL,'A'
DRVR1:	;
	MOV	DRV,AL
	MOV	AX,0B01H
	MOV	CX,3
	MOV	DI,OFFSET DRV
	INT	90H
	;
	RET
	;
DRVR	ENDP
	;
	;
CTL_C	PROC
	;
	MOV	AX,0B01H
	MOV	CX,1
	MOV	DI,OFFSET CTRL_C
	INT	90H
	;
	RET
	;
CTL_C	ENDP
	;
	;
	;
GET_CH	PROC
	MOV	DH,CUR_Y	;;１文字取り出しサブルーチン
	MOV	DL,CUR_X	;;DL=桁位置 DH=行位置
	;
	MOV	AH,14H
	INT	91H
	;
	mov	ax,bx
	MOV	CH_TY,BH	;;bit0=0:半角 1:全角 bit1=0:1byte 1:2byte
	MOV	CH_JIS,BL	;;文字コード
	;
	RET
GET_CH	ENDP
	;
	;
;
;;ここしばらくはデバックに使ったルーチン達です。
;
;DEBUG	PROC
;	;debug		;;ファイル名格納バッファの内容を表示する｡
;	;
;	MOV	AH,1DH
;	MOV	AL,'_'
;	INT	91H
;	;
;	MOV	SI,OFFSET F_BUFF
;D_FIL:	MOV	AX,[SI]
;	INC	SI
;	INC	SI
;	CMP	AX,0
;	JE	D_EXT
;	MOV	AH,1DH
;	INT	91H
;	JMP	D_FIL
;	;
;D_EXT:	MOV	AH,1DH
;	MOV	AL,'.'
;	INT	91H
;	;
;	MOV	SI,OFFSET E_BUFF
;D_EXT1:	MOV	AX,[SI]
;	INC	SI
;	INC	SI
;	CMP	AX,0
;	JE	D_END
;	MOV	AH,1DH
;	INT	91H
;	JMP	D_EXT1
;D_END:	;
;	RET
;	;
;DEBUG	ENDP
;	;
;DEBUG2	PROC
;	;debug		;;ＫＥＹバッファの内容を表示する。
;	;
;	;MOV	AH,1DH
;	;MOV	AL,'['
;	;INT	91H
;	;
;	MOV	SI,OFFSET KBUFF
;D_KEY:	MOV	AX,[SI]
;	INC	SI
;	INC	SI
;	CMP	AX,0
;	JE	D_KEY1
;	MOV	AH,1DH
;	INT	91H
;	JMP	D_KEY
;	;
;D_KEY1:	;MOV	AH,1DH
;	;MOV	AL,']'
;	;INT	91H
;	;
;	RET
;	;
;DEBUG2	ENDP
;	;
;	;
;DEBUG3	PROC
;	;debug		;;ＡＸの内容を表示する。
;	;
;;************************************
;;** print hex$(ax) (no bleak regs) **
;;************************************
;;
;p_hex:	push	ax
;	push	cx
;	;
;	push	ax
;;
;	mov	cl,8
;	ror	ax,cl
;;
;	call	dis			;joui keta
;;
;	pop	ax
;	call	dis			;kai keta
;;	
;	pop	cx
;	pop	ax
;	;
;	mov	al,' '
;	mov	ah,1dh
;	int	91h
;;
;	jmp	p_hex_e
;	;
;dis:	push	ax
;;
;	mov	cl,4
;	ror	al,cl
;;
;	call	dis1			;joui keta
;;
;	pop	ax
;	call	dis1			;kai keta
;;
;	ret
;;
;dis1:	and	al,0fh			;low data
;	cmp	al,10
;	jae	dis2
;	or	al,30h
;	jmp	dis3
;dis2:	sub	al,10
;	add	al,41h
;;
;dis3:	mov	ah,1dh
;	int	91h
;;
;	ret
;;
;p_hex_e:ret
;	;
;DEBUG3	ENDP
;	;
;	;
	;
CUR_X	DB	?
CUR_Y	DB	?
CH_TY	DB	?
CH_JIS	DB	?
	;
BUTTON	DB	0	;;BIT0=左ボタンＯＮ　　 BIT1=右ボタンＯＮ
DRV_F	DB	0	;;BIT0=左ドライブシフト BIT1=右ドライブシフト
	;
F_BUFF	DW	20H DUP (?)
E_BUFF	DW	10H DUP (?)
KBUFF	DW	40H DUP (?)
	;
	;
DRV	DB	?,00H,':',00H,0DH,00H
	;
DIRBUFF	DB	' ',00H,'D',00H,'I',00H,'R',00H,' ',00H,'/',00H,'W',00H,0DH,00H
S_TYPE	DB	'T',00H,'Y',00H,'P',00H,'E',00H,' ',00H,00H,00H
S_386	DB	'R',00H,'U',00H,'N',00H
	DB	'3',00H,'8',00H,'6',00H,' ',00H,00H,00H
S_EXP	DB	'.',00H,'E',00H,'X',00H,'P',00H,00H,00H
S_CD	DB	'C',00H,'D',00H,' ',00H,00H,00H
CTRL_C	DB	03H,00H
	;
	DB	100H DUP (?)	;＜これがないと暴走する？魚田さん教えて下さい｡
	;
	;
LOADER	PROC	;;ここ以降は常駐するとき捨てられる
	;
	MOV	AX,CS			;DS=CS
	MOV	DS,AX
	;
	MOV	AH,00H		;;マウス動作開始
	INT	99H
	;
	MOV	AX,0200H	;;マウスカーソル表示
	INT	99H
	;
	MOV	AH,0CH		;;マウスカーソルのスピードを上げる
	MOV	DH,04H		;;水平
	MOV	DL,04H		;;垂直
	INT	99H
	;
	MOV	DX,OFFSET MSG	;;タイトル表示
	MOV	AH,09H
	INT	21H
	;
	MOV	AX,CS
	MOV	DS,AX
	;
	MOV	AH,0BH		;;マウス割り込みルーチンの定義
	MOV	DX,000AH
	MOV	DI,OFFSET MOUSE
	INT	99H
	;
	MOV	DX,OFFSET LOADER	;;常駐終了
	SHR	DX,1
	SHR	DX,1
	SHR	DX,1
	SHR	DX,1
	INC	DX
	MOV	AX,3100H
	INT	21H
	;
MSG	DB	01BH,'[0m','☆'
	DB	01BH,'[1m',' ＣＯＮＳＯＬＥ＋＋　 ver 2.0 '
	DB	01BH,'[0m','☆'
	DB	0DH,0AH
	DB	01BH,'[31m',' Ｋ',01BH,'[0m','.OKAMOTO 1990  <<COPY FREE>>'
	DB	0DH,0AH
	DB	01BH,'[0m','　常駐しま～す｡'
	DB	0DH,0AH,'$'
	;
LOADER	ENDP
	;
CODE	ENDS
	END	LOADER
