*--------------------------------------------------------------------
* デバイス存在チェック関数
*--------------------------------------------------------------------
* この関数では厳密にデバイスドライバの存在は識別出来ないので注意。

	.include	iocscall.mac

	.text
	.even
	.xref	GetNulPoint

*--------------------------------------------------------------------

	.xdef	_DevCheck
_DevCheck:
* 指定のデバイスドライバが存在するかどうかを調べる（キャラクターデバイス専用）
* 4(sp) <- 調べるデバイス名
*          $00で終わる文字列でも８文字のデバイス名そのものでもどちらでも良い
* リターン値
*	d0.l:存在しているかどうか	a0:デバイスヘッダーアドレス
*	 = $00 ... 存在していない	 不変
*	 = $ff ... 存在している		 見つけたデバイスドライバーのヘッダーアドレス
	move.l	4(sp),d0
	movem.l	d7/a1-a4,-(sp)
	move.l	d0,a2
	*
	* 比較するデバイス名の長さを得る -> d7.w
	move.l	a2,a1
	moveq.l	#-1,d7		* 名前比較のdbraのため
@@:	move.b	(a1)+,d0
	beq	@f
	cmp.b	#' ',d0
	beq	@f
	addq.w	#1,d7
	cmp.w	#8-1,d7
	bcs	@b
@@:	*
	clr.l	a1
	IOCS	_B_SUPER	* super visor mode
	move.l	d0,-(sp)
	*
	bsr	GetNulPoint	* -> a1(NUL)
	*
@@:	lea	14(a1),a3	* デバイス名
	move.l	a2,a4
	move.w	d7,d0
1:	cmp.b	(a4)+,(a3)+
	dbne	d0,1b
	beq	FoundDev	* 一致
NextDev:			* 不一致
	move.l	(a1),a1		* 次へ
	cmp.l	#-1,a1
	bne	@b
	* 見つからなかった
	moveq.l	#0,d7		* a0は不変
	bra.s	@f
	*
FoundDev:			* 見つかった
	move.l	a1,a0		* デバイスヘッダーアドレス
	st.b	d7		* 見つかった
@@:	*
	move.l	(sp)+,d0
	bmi	@f		* 元からsuper visorであった
	move.l	d0,a1
	IOCS	_B_SUPER	* user mode
@@:	*
	moveq.l	#0,d0		* for .b = .l
	move.b	d7,d0
	movem.l	(sp)+,d7/a1-a4
	rts

*--------------------------------------------------------------------
	.end
