; tpset(int plane,int x,int y,int mode)
; _tpset(int plane,int x,int y,int mode)
; テキスト画面pset
; mode:0=reset , 1=set
; _tpsetはTEXT-VRAMをアクセスするので、あらかじめSuper Visor modeにしておくこと

	.include	defines.mac

	.xdef	_tpset
_tpset:
	move.l	sp,a2
	SUPERMODE			* SuperVisor mode
	move.l	d0,-(sp)		* save user mode stack pointer
	bsr	TPX
	move.l	(sp)+,a1
	USERMODE			* to user mode
	rts
;
;
	.xdef	__tpset
__tpset:
	move.l	sp,a2
TPX:
	* calc dot point
	move.w	8+2(a2),d1	* x
	cmp.w	#1024-1,d1	* x=0〜1023 : clipping
	bhi	TP3
	move.w	d1,d2		* 0〜1023なので.wでいい
	and.b	#%111,d1	* x%8 = 1byte内での余りドット
	moveq.l	#7,d0
	sub.b	d1,d0		* DOT0=BIT7
	
	* calc adrs-base
	move.l	12(a2),d1	* y (ここは.lのままにする：上位16bitクリアのため）
	cmp.l	#1024-1,d1	* y=0〜1023 : clipping
	bhi	TP3
	lsl.l	#7,d1		* y*128
	move.l	d1,a0
	lsr.w	#3,d2		* x/8
	add.w	d2,a0
	
	* calc adrs-plane
	move.w	4+2(a2),d1	* plane（高速化のため.w読みだししている）
	add.w	d1,d1
	add.w	d1,d1		* *4
	lea	ptable(pc),a1
	add.l	(d1.w,a1),a0
	
	* mode別処理
	tst.b	16+3(a2)	* 高速化のため.l比較をしていない
	beq	TP2
	bset.b	d0,(a0)		* set mode
	rts
TP2:
	bclr.b	d0,(a0)		* reset mode
TP3:
	rts

ptable:	.dc.l	TPLANE0,TPLANE1,TPLANE2,TPLANE3

	.end
