;	私製ライブラリ・グラフィック篇
;	(c) MATSUUCHI Ryosuke in Dec,1992
;
;	gpset.asm
;
;	1992. 6.13(Sat)
;	1992. 7. 9(Thu)
;	1992.12.28(Sun)

		public	gpset,_gpset
		extrn	_gwrtreg:near
		extrn	__SetVramSeg:near, __AddVramBase_ebx:near
		
		include	grplib.inc
		
		assume	cs:cseg, ds:dseg


dseg segment dword 'DATA'
dseg ends


cseg segment dword 'CODE'

;---------------------------------------------------------------
;	_gpset : 点の描画
;		in  EAX,EBX : 座標
;		    ECX     : 色
;		    EDX     : 演算指定(0=PSET 4=XOR)
;
;	void gpset(int x, int y, int col, int mode)
;---------------------------------------------------------------



		align	4

_gpset		proc
		pushad
		mov	esi,[_nowscrmod]	;esi に画面モードを入れる
		cmp	si,2
		jle	#end
		cmp	si,4
		jg	#1
		call	gpset_16
		jmp	#end
#1:		cmp	si,8
		jg	#2
		call	gpset_32_1
		jmp	#end
#2:		cmp	si,11
		jg	#3
		call	gpset_32_2
		jmp	#end
#3:		cmp	si,14
		jg	#4
		call	gpset_256
		jmp	#end
#4:		cmp	si,18
		jg	#end
		call	gpset_32_3
#end:		popad
		ret
_gpset		endp



gpset		proc
		push	ebx
		pushfd
		mov	eax,[esp+8+4]		;eax に x 座標を入れる
		mov	ebx,[esp+8+8]		;ebx に y 座標を入れる
		mov	ecx,[esp+8+12]		;ecx に色を入れる
		mov	edx,[esp+8+16]		;edx に演算指定を入れる
		call	_gpset
		popfd
		pop	ebx
		ret
gpset		endp



		align	4


;● PSET のサブルーチン（16色PSET）
;----------------------------------------------------------------------------


gpset_16	proc
		mov	esi,eax			;edi にマスクパターンを入れる
		mov	edi,1111b
		and	esi,7
		lea	esi,[esi*4]
		or	esi,esi
		jz	#1
		xchg	ecx,esi			;マスクパターンをシフト
		shl	edi,cl			;ついでにカラーコードも
		shl	esi,cl			;シフトする｡
		xchg	ecx,esi
		and	ecx,edi
#1:		shr	eax,1			;ebx にアドレスを入れる
		and	eax,0fffffffch
		lea	ebx,[ebx*8]
		lea	ebx,[ebx*8]
		lea	ebx,[ebx*8+eax]
		call	__AddVramBase_ebx
		push	es			;es を保存
		call	__SetVramSeg		;es ←書き込みページのセレクタ
		mov	eax,es:[ebx]		;eax に VRAMの内容を入れる
		or	edx,edx			;edx(演算指定)により分岐
		jnz	#3
		not	edi			;PSET演算
		and	eax,edi
		or	eax,ecx
		jmp	#4
#3:		cmp	edx,4
		jnz	#5
		xor	eax,ecx			;XOR演算
		jmp	#4
#5:		cmp	edx,6
		jnz	#4
		or	ecx,ecx			;MATTE（０透過）演算
		jz	#6
		not	edi
		and	eax,edi
		or	eax,ecx
#4:		mov	es:[ebx],eax		;eax の値を VRAM に書き込む
#6:		;
		pop	es			;es を復帰
		ret
gpset_16	endp


;● PSET のサブルーチン（３万色PSET [512*256ピクセルモード]）
;----------------------------------------------------------------------------


gpset_32_1	proc
		lea	ebx,[ebx*8]		;ebx に ebx*512+eax*2 を
		lea	ebx,[ebx*8]		;入れる(VRAM アドレス)
		lea	ebx,[ebx*4+eax]
		lea	ebx,[ebx*2]
		call	gpset32sub
		ret
gpset_32_1	endp



gpset_32_2	proc
		lea	ebx,[ebx*8]		;ebx に ebx*1024+eax*2 を
		lea	ebx,[ebx*8]		;入れる(VRAM アドレス)
		lea	ebx,[ebx*8+eax]
		lea	ebx,[ebx*2]
		call	gpset32sub
		ret
gpset_32_2	endp


;● PSET のサブルーチン（256色PSET）
;----------------------------------------------------------------------------


gpset_256	proc
		;★まだ作ってないよーん
		push	ds
		mov	ax,10ch
		mov	ds,ax
		mov	dword ptr ds:[0],0ffffffffh
		pop	ds
		ret
gpset_256	endp


;● PSET のサブルーチン（３万色PSET [512*512ピクセルモード]）
;----------------------------------------------------------------------------


gpset_32_3	proc
		lea	ebx,[ebx*8]		;ebx に ebx*1024+eax*2 を
		lea	ebx,[ebx*8]		;入れる(VRAM アドレス)
		lea	ebx,[ebx*8+eax]
		lea	ebx,[ebx*2]
		call	gpset32sub
		ret
		;;★まだつくってないよーん
		;push	ds
		;mov	ax,10ch
		;mov	ds,ax
		;mov	word ptr ds:[0],07fffh
		;pop	ds
		;ret
gpset_32_3	endp


;● ３万色PSET のサブルーチン
;	ebx にオフセット、edx に演算指定、ecx にカラーコードが
;	設定されていることを前提に、
;	ベースオフセット加算、セレクタ設定、VRAM への書き込みを行う。
;------------------------------------------------------------------------

gpset32sub	proc
		;  in  ebx:画面内アドレス
		call	__AddVramBase_ebx
		push	es			;es 保存
		call	__SetVramSeg		;es ← 書き込みページのセレクタ
		or	edx,edx			;edx(演算指定) により分岐
		jnz	#2
		mov	es:[ebx],cx		;演算 PSET
		jmp	#3
#2:		cmp	edx,4
		jnz	#4
		xor	es:[ebx],cx		;演算 XOR
		jmp	#3
#4:		cmp	edx,6
		jnz	#3
		or	cx,cx			;演算 MATTE (0透過)
		jz	#5
		mov	es:[ebx],cx
#5:		;
#3:		pop	es			;es 復帰
		ret
gpset32sub	endp



cseg ends

end
