misc/isHFS.s
;========================================================================================
;  isHFS.s
;  Copyright (C) 2003-2024 Makoto Kamada
;
;  This file is part of the XEiJ (X68000 Emulator in Java).
;  You can use, modify and redistribute the XEiJ if the conditions are met.
;  Read the XEiJ License for more details.
;  https://stdkmd.net/xeij/
;========================================================================================

;----------------------------------------------------------------
;
;	isHFS.x
;		カレントドライブまたは指定されたドライブがHFSか調べます。
;
;	最終更新
;		2024-08-08
;
;	作り方
;		has060 -i include -o isHFS.o -w isHFS.s
;		lk -o isHFS.x isHFS.o
;
;	使い方
;		>isHFS [ドライブ名]
;		A: … Z:
;		a: … z:
;			ドライブ名
;		@:
;			カレントドライブ
;		省略時はカレントドライブ
;
;	終了コード
;		0	HFSではない
;		1	HFS
;
;----------------------------------------------------------------

	.include	doscall.mac
	.include	iocscall.mac

;ドライブがHFSか調べる
;<(sp).l:ドライブ番号。0=カレント,1=A:,…,26=Z:
;>d0.l:0=HFSではない,1=HFS
_isHFS::
	move.l	a1,-(sp)
	lea.l	-94(sp),sp		;DPBテーブルの領域を確保する
;DPBテーブルを取り出す
	move.l	sp,-(sp)		;DPBテーブルのアドレス
	move.w	4+94+4+4+2(sp),-(sp)	;ドライブ番号。0=カレント,1=A:,…,26=Z:
	DOS	_GETDPB
	addq.l	#6,sp
	tst.l	d0
	bmi	10f			;取り出せなかった
;デバイスドライバへ進む
	lea.l	18(sp),a1		;デバイスドライバのアドレスのアドレス
	IOCS	_B_LPEEK
	movea.l	d0,a1			;デバイスドライバのアドレス
;デバイス名を確認する
	lea.l	14(a1),a1		;デバイス名のアドレス
	IOCS	_B_LPEEK
	cmp.l	#$01_000000+'XEI',d0
	bne	10f			;違う
	IOCS	_B_LPEEK
	cmp.l	#'JHFS',d0
	bne	10f			;違う
;結果を返す
	moveq.l	#1,d0			;HFS
	bra	20f

10:	moveq.l	#0,d0			;HFSではない
20:	lea.l	94(sp),sp
	movea.l	(sp)+,a1
	rts

;開始位置
start:
;空白を読み飛ばす
	addq.l	#1,a2			;a2=コマンドライン
	moveq.l	#0,d0
10:	move.b	(a2)+,d0
	beq	20f			;引数がない。カレントドライブを調べる
	cmpi.b	#' ',d0
	beq	10b			;空白を読み飛ばす
	cmpi.b	#9,d0
	beq	10b			;空白を読み飛ばす
;ドライブ名を読み取る
	cmp.b	#'@',d0
	beq	20f			;@:。カレントドライブを調べる
	and.b	#$DF,d0			;大文字化する
	sub.b	#'A',d0			;'A',…,'Z'を0=A:,…,25=Z:にする
	blo	50f			;文法エラー。使用法を表示して終了する
	cmp.b	#'Z'-'A',d0
	bhi	50f			;文法エラー。使用法を表示して終了する
	move.l	d0,d1			;d1=ドライブ番号。0=A:,…,25=Z:
	bra	30f			;ドライブがHFSか調べる

;カレントドライブを調べる
20:	DOS	_CURDRV			;カレントドライブを取り出す
	move.l	d0,d1			;d1=ドライブ番号。0=A:,…,25=Z:
;ドライブがHFSか調べる
30:	addq.b	#1,d1			;d1=ドライブ番号。1=A:,…,26=Z:
	move.l	d1,-(sp)
	bsr	_isHFS			;ドライブがHFSか調べる
	addq.l	#4,sp
;結果を表示して終了コードで返す
	move.w	d0,-(sp)		;0=HFSではない,1=HFS
	lea.l	no(pc),a0		;:はHFSではありません
	beq	40f
	lea.l	yes(pc),a0		;:はHFSです
40:	pea.l	drive(pc)		;ドライブ
	DOS	_PRINT
	moveq.l	#'A'-1,d0
	add.b	d1,d0			;ドライブ名。'A',…,'Z'
	move.w	d0,(sp)
	DOS	_PUTCHAR
	move.l	a0,(sp)			;:はHFSではありません/:はHFSです
	DOS	_PRINT
	addq.l	#4,sp
	DOS	_EXIT2

;使用法を表示して終了する
50:	pea.l	usage(pc)		;使用法
	DOS	_PRINT
	move.w	#-1,(sp)
	DOS	_EXIT2

usage:	.dc.b	'isHFS.x',13,10
	.dc.b	'  ドライブがHFSか調べます',13,10
	.dc.b	'  使用法: isHFS [ドライブ名]',13,10
	.dc.b	'  終了コード: 0=HFSではない 1=HFS',13,10,0
drive:	.dc.b	'ドライブ',0
no:	.dc.b	':はHFSではありません',13,10,0
yes:	.dc.b	':はHFSです',13,10,0

	.end	start