;  mag2.asm 91.03.27
;  copyright(c)1991 K.Kurosaki 

                .386p

code            segment    dword public ER use32 'CODE'
                assume     cs:CODE,ds:CODE

mag             proc    near

		mov	ebp,esp
		mov	ebx,[ebp+4]	; 第一パラメータ BASE ADDRESS

		mov	eax,[ebp+8]	; 第二パラメータ
		cmp	eax,200
;		ja	mag02		; 200より大

		cmp	eax,0		; =0
;		jne	mag04
mag02:
		mov	eax,1		; 範囲外は1
mag04:
		mov	scr_line,eax	; 1回分のスクロール
	
		mov	ax,[ebx+8]	; x2
		shr	ax,3
		mov	dx,[ebx+4]	; x1	
		shr	dx,3
		sub	ax,dx
		inc	ax
		mov	xloop,ax	; X繰り返し

		mov	ax,[ebx+10]	; y2
		sub	ax,[ebx+6]	; y1
		inc	ax
		mov	ycnt,ax		; y繰り返し
	
		xor	eax,eax
		xor	ecx,ecx
		mov	cx,[ebx+4]	
		and	cx,0fff8h
		shr	cx,1		; X1/2
		mov	ax,[ebx+6]
		shl	eax,9		; Y1*512
		add	eax,ecx
		mov	edi,eax		; VRAMスタートアドレス
		push	edi

		mov	edx,[ebx+24]	; ピクセルのオフセット
		add	edx,ebx
		mov	ecx,[ebx+28]	; ピクセルのサイズ
mag10:
		mov	al,[edx]
		mov	ah,al		; 上位下位ニブルの交換
		shl	al,4
		shr	ah,4
		or	al,ah
		mov	[edx],al
		inc	edx
		loop	mag10

		mov	edi,offset f_start ; F()領域のクリア
		mov	ecx,640/4
		xor	eax,eax
		cld
	rep	stosd

		mov	ecx,[ebx+16]	; フラグB
		add	ecx,ebx

		mov	esi,[ebx+24]	; ピクセル
		add	esi,ebx

		mov	eax,[ebx+12]	; フラグA
		add	eax,ebx
		mov	ebx,eax	

		mov	ax,104h
		mov	es,ax		; VRAMのセレクタ

		pop	edi

		xor	eax,eax		; eaxの上位は0
		mov	ah,[ebx]	; フラグＡ	
		inc	ebx
		mov	bcnt,8
mag20:
		cmp	edi,400*512	; ４００ラインかいた？
		jb	mag22		; まだ

;		call	vrammov

		push	ds
		push	esi
		push	ecx

		mov	cx,104h
		mov	ds,cx

		if	0
		mov	esi,scr_line
		shl	esi,9
		mov	edi,0
		mov	ecx,400
		sub	ecx,scr_line
		shl	ecx,7
		else
		mov	esi,1 ; scr_line
		shl	esi,9
		mov	edi,0
		mov	ecx,(400-1)*512/4
		endif
		cld
	rep	movsd		

		pop	ecx
		pop	esi
		pop	ds

		mov	edi,400		; 
		sub	edi,scr_line
		shl	edi,9
mag22:
		push	word ptr xloop
		pop	word ptr xcnt	; Ｘの繰り返し数

		mov	edx,offset f_start ; F()
		push	edi
mag30:
		mov	al,[edx]	; Ｆ（）からもってきて
		shl	ah,1		; フラグＡを１ビットみて
		jnc	mag32		; ０だった

		xor	al,[ecx]	; フラグＢ	
		mov	[edx],al
		inc	ecx
mag32:
		inc	edx		; Ｆ（）
		dec	word ptr bcnt		
		jne	mag34

		mov	ah,[ebx]	; フラグＡ	
		inc	ebx
		mov	bcnt,8
mag34:
		push	eax
		shr	al,4		; 上位ニブル
		call	pix
		pop	eax

		push	eax
		call	pix		; 下位ニブル
		pop	eax

		dec	word ptr xcnt
		jne	mag30

		pop	edi
		add	edi,512

		dec	word ptr ycnt
		jne	mag20

		ret

mag		endp

pix		proc	near
	
		and	al,0fh
		je	pix10		; フラグ=0
		
		xor	ah,ah
		shl	ax,2		; テーブル参照のため
		mov	eax,vpos[eax]	; ＶＲＡＭの相対値
		mov	ax,es:[edi][eax] ; ＶＲＡＭの値
		stosw			; ＶＲＡＭへ
		ret
pix10:
		movsw			; ピクセルからＶＲＡＭへ
		ret

pix		endp

vpos		dd	0	; 0
		dd	-2	; 1
		dd	-4	; 2
		dd	-8	; 3
		dd	-512	; 4
		dd	-514	; 5
		dd	-1024	; 6
		dd	-1026	; 7
		dd	-1028	; 8
		dd	-2048	; 9
		dd	-2050	; 10
		dd	-2052	; 11
		dd	-4096	; 12
		dd	-4098	; 13
		dd	-4100	; 14
		dd	-8192	; 15

xloop		dw	?
xcnt		dw	?
ycnt		dw	?
bcnt		dw	?

scr_line	dd	?

f_start		db	?

CODE            ends
                end
