******************************************************
* 中抜き文字
******************************************************
*	a1.l	font buffer(必ず偶数アドレスから始まること)
*	d2.w	ylines-1
*　一旦ワークエリア内に中間フォント作ってそれを転送する
******************************************************
	.if	0
	.text
	.include	defines.mac
FNTTEST	macro	size,code,wx,wy,x,call
	lea	work(pc),a1
	move.l	#size.shl.16+code,d1
	IOCS	_FNTGET
	lea	work+4(pc),a1
	move.w	#wy,d2
	move.w	#wx,d1
	bsr	call
	lea	work(pc),a1
	move.w	#x*8,d1
	move.w	#430,d2
	IOCS	_TEXTPUT
	endm

	* 8*16
	FNTTEST	8,'R',8,15,0,naka0
	* 12*24
	FNTTEST	12,'R',12,23,4,naka1
	* 16*16
	FNTTEST	8,'Ｒ',16,15,8,naka1
	* 24*24
	FNTTEST	12,'中',24,23,16,naka2
	FNTTEST	12,'−',24,23,32,naka2
	FNTTEST	12,'Ｉ',24,23,48,naka2
	clr.w	-(sp)
	DOS	_EXIT2

work:	.ds.w	2
	.ds.b	3*24
fontwork:
	.ds.b	4*24		* 高速化のためlongword単位で処理するから
	.even
	.else
	.xref	fontwork	* フォント加工ワークエリア（外部）
	.endif
******************************************************

	.text

LRHI8	macro			* 左右強調(8dot)
	move.b	(a1),d0
	move.b	d0,d1
	lsr.b	#1,d0		* >>1
	add.b	d1,d1		* <<1
	or.b	d1,d0
	or.b	(a1)+,d0
	endm

	.xdef	naka0
naka0:				* x=8
	move.l	a1,a0		* save font adrs
	* 中間フォントをワークエリアに作成する（縦横強調フォント）
	lea	fontwork,a2	* ワークエリア:(pc)では届かないことがある
	subq.w	#2,d2		* 最初と最後のラインは特別処理するから
	* 第１ライン処理
	LRHI8
	move.b	d0,(a2)+
	move.b	d0,(a2)		* 次のラインにも書き込む
na01:	* 第２ラインから最終ライン−１まで
	LRHI8
	or.b	d0,-1(a2)	* 前のラインにもORする
	or.b	d0,(a2)+	* そのラインにORする
	move.b	d0,(a2)		* 次のラインにも書き込む
	dbra	d2,na01
	* 最終ライン
	LRHI8
	or.b	d0,-1(a2)	* 前のラインにもORする
	or.b	d0,(a2)
	*
	* ワークエリアからバッファー(a0)へ転送
	lea	fontwork,a2	* ワークエリアアドレス
	moveq.l	#16/4-1,d0
na02:	move.l	(a2)+,d1
	eor.l	d1,(a0)+
	dbra	d0,na02
	rts

******************************************************

LRHI16	macro			* 左右強調(16dot)
	move.w	(a1),d0
	move.w	d0,d1
	lsr.w	#1,d0		* >>1
	add.w	d1,d1		* <<1
	or.w	d1,d0
	or.w	(a1)+,d0
	endm

	.xdef	naka1
naka1:				* x=12*24/16*16
	move.l	a1,a0		* save font adrs
	move.l	d2,-(sp)
	* 中間フォントをワークエリアに作成する（縦横強調フォント）
	lea	fontwork,a2	* ワークエリア:(pc)では届かないことがある
	subq.w	#2,d2		* 最初と最後のラインは特別処理するから
	* 第１ライン処理
	LRHI16
	move.w	d0,(a2)+	* そのラインに書き込む
	move.w	d0,(a2)		* 次のラインにも書き込む
na11:	* 第２ラインから最終ライン−１まで
	LRHI16
	or.w	d0,-2(a2)	* 前のラインにもORする
	or.w	d0,(a2)+	* そのラインにORする
	move.w	d0,(a2)		* 次のラインにも書き込む
	dbra	d2,na11
	* 最終ライン
	LRHI16
	or.w	d0,-2(a2)	* 前のラインにもORする
	or.w	d0,(a2)		* このラインにORする
	*
	* ワークエリアからバッファー(a0)へ転送
	move.l	(sp)+,d2
	lsr.w	#1,d2		* ２ライン単位で処理するから
	lea	fontwork,a2	* ワークエリアアドレス
na12:	move.l	(a2)+,d0
	eor.l	d0,(a0)+
	dbra	d2,na12
	rts

******************************************************

	.xdef	naka2

LRHI240	macro	ffirst		* 左右強調(24dot) : line 0
	move.l	(a1),d0
	addq.w	#2,a1
	move.l	d0,d1
	move.l	d0,d3
	lsr.l	#1,d0		* >>1
	add.l	d1,d1		* <<1
	or.l	d1,d0
	or.l	d3,d0
	*
	.if 	ffirst==1
	move.l	d0,(a2)+	* そのラインに書き込む
	.else
	or.l	d0,(a2)+	* そのラインにORする
	.endif
	lsr.l	#8,d0
	move.l	d0,(a2)		* 次のラインにも書き込む
	.if 	ffirst==0
	or.l	d0,-8(a2)	* 前のラインにもORする
	.endif
	endm

LRHI241	macro	fend		* 左右強調(24dot) : line 1
	move.l	(a1)+,d0
	and.l	#$00ff_ffff,d0	* シフトによって不要ビットが入ってこないように
	move.l	d0,d1
	move.l	d0,d3
	lsr.l	#1,d0		* >>1
	add.l	d1,d1		* <<1
	or.l	d1,d0
	or.l	d3,d0
	*
	or.l	d0,(a2)+	* そのラインにORする
	lsl.l	#8,d0
	or.l	d0,-8(a2)	* 前のラインにもORする
	.if	fend==0
	move.l	d0,(a2)		* 次のラインにも書き込む
	.endif
	endm

naka2:				* x=24
	move.l	d3,-(sp)	* push d3
	move.l	a1,a0		* save font adrs
	*
	* 中間フォントをワークエリアに作成する（縦横強調フォント）
	lea	fontwork,a2	* ワークエリア:(pc)では届かないことがある
	subq.w	#2,d2		* 最初と最後のラインは特別処理するから
	lsr.w	#1,d2		* ２ライン単位で処理するから
	LRHI240	1		* 最初
na21:	LRHI241	0		* line 1
	LRHI240	0		* line 0
	dbra	d2,na21
	LRHI241	1		* 最終ライン
	*
	* ワークエリアからバッファー(a0)へ転送
	lea	fontwork,a2	* ワークエリアアドレス
	moveq.l	#24/2-1,d1	* ２ライン単位処理
na22:	* line 0
	move.w	(a2)+,d0
	eor.w	d0,(a0)+
	move.b	(a2)+,d0
	eor.b	d0,(a0)+
	addq.w	#1,a2
	* line 1
	move.w	(a2)+,d0
	eor.b	d0,(a0)+
	move.w	(a2)+,d0
	eor.w	d0,(a0)+
	dbra	d1,na22
	move.l	(sp)+,d3	* pop d3
	rts

******************************************************
* この中抜き文字の作成結果で気づいたのだが、フォントはDynaBookの方が
* Ｘ６８より一回り小さいらしい。このため、縦横強調を欠ける中抜きでも
* フォントが欠けることが少なく、きれいな中抜き文字が出来る。
* Ｘ６８ではフォントの欠けが結構出てくる。
* どちらがいいとは一概に言えないが。
******************************************************
	.end
