; ワイルドカード文字列比較
; wildの文字列（ワイルドカード使用可）とwordの文字列を比較する
; ワイルドカードは'?'と'*'の２つ。また、word中に'?''*'が存在してはいけない
; このルーチンは２バイト文字には対応していない
; リターン値：０＝不一致、１＝一致

	.xdef	_cpwild
_cpwild:
; int cpwild(unchar *wild,unchar *word)
	move.l	4(sp),a0	; wild
	move.l	8(sp),a1	; word
	movem.l	d3-d4,-(sp)
	bsr	cpwild_sub
	movem.l	(sp)+,d3-d4
	rts

; 比較メインルーチン
; cpwild.c版と比較してね。
; a0=wild , a1=word , d0=pc , d1=c , d2=pp , d3=pw , iiはなし
; で、ほとんどそのまま機械語化しているから（ちょっとだけ違う）

cpwild_sub:
	clr.w	d2
	clr.w	d3
loop1:	move.b	(a0,d2.w),d0
loop11:	cmp.b	#'?',d0
	bne	awild
	; wild card '?'
	move.b	(a1,d3.w),d1
	beq	return0
next:	addq.w	#1,d2
	addq.w	#1,d3
	bra	loop1
return0: ; 不一致
	moveq.l	#0,d0
	rts

awild:	cmp.b	#'*',d0
	beq	awild2
	; normal1 character
	move.b	(a1,d3.w),d1
	cmp.b	d1,d0
	bne	return0
	tst.b	d1
	bne	next
return1: ; 一致
	moveq.l	#1,d0
	rts

awild2:	; wild card '*'
loop2:
	addq.w	#1,d2
	move.b	(a0,d2.w),d0
	beq	return1
	cmp.b	#'*',d0
	beq	loop2
	cmp.b	#'?',d0
	beq	loop2
loop3:	move.w	d4,d3
loop4:
	move.b	(a0,d2.w),d0
	move.b	(a1,d3.w),d1
	beq	return_pc0
	addq.w	#1,d2
	addq.w	#1,d3
	cmp.b	d0,d1
	beq	loop4
	tst.b	d0
	beq	return0
	exg	d3,d4
	addq.w	#1,d3
	cmp.b	#'*',d0
	beq	out3
	cmp.b	#'?',d0
	bne	loop3
out3:
	move.w	d3,d4
	subq.w	#2,d3
	subq.w	#1,d2
	bra	loop11

return_pc0:
	tst.b	d0
	beq	return1
	bra	return0

	.end
