*--------------------------------------------------------------------
* デバイスドライバー常駐チェック関数２
*--------------------------------------------------------------------

	.include	iocscall.mac
	.xref		GetNulPoint

	.text

* int DevCheck2(unchar *sdev,unchar *devname)
* sdev : 隠しデバイス名
* devname : 実際のデバイス名を格納するエリア
* devname=NULLなら格納しない
*--------------------------------------------------------------------

	.xdef	_DevCheck2
_DevCheck2:
* 指定のデバイスドライバが存在するかどうかを調べる（キャラクターデバイス専用）
* 4(sp) <- 調べる隠しデバイス名
*          $00で終わる文字列でも８文字のデバイス名そのものでもどちらでも良い
* 8(sp) <- 本来のデバイス名を格納するワークエリア
*	   [8+1]以上を確保すること
*	   NULLの時は格納しない。
* リターン値
*	d0.l:存在しているかどうか	a0:デバイスヘッダーアドレス
*	 = $00 ... 存在していない	 不変
*	 = $ff ... 存在している		 見つけたデバイスドライバーのヘッダーアドレス
	movem.l	4(sp),d0/d1
	movem.l	d7/a1-a5,-(sp)
	move.l	d0,a2		* 隠しデバイス名
	move.l	d1,a5		* 本来のデバイス名格納エリア
	*
	* 比較するデバイス名の長さを得る -> 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
@@:	*
	sub.l	a1,a1		* a1.l=0
	IOCS	_B_SUPER	* super visor mode
	move.l	d0,-(sp)
	*
	bsr	GetNulPoint	* -> a1(NUL)
	*
@@:	lea	22(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は不変
	move.b	d7,(a5)		* デバイス名なし($00)
	bra.s	@f
	*
FoundDev:			* 見つかった
	move.l	a1,a0		* デバイスヘッダーアドレス
	st.b	d7		* 見つかった
	* 本来のデバイス名を転送する
	cmp.l	#0,a5
	beq	@f		* NULL指定なら転送しない
	*
	lea	14(a0),a4	* デバイス名
	moveq.l	#8-1,d2		* -1 dbra
3:	move.b	(a4)+,d1
	cmp.b	#' ',d1		* ' 'の直前まで
	beq	2f
	move.b	d1,(a5)+
	dbra	d2,3b		* または８バイトまで
2:	clr.b	(a5)		* EOS
	*
@@:	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-a5
	rts

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