
; Storm C Compiler
; Work2:Mesa3/Mesa-3.0/src/scissor.c
	mc68030
	mc68881
	XREF	_gl_error
	XREF	_CC

	SECTION "_gl_Scissor:0",CODE


;void gl_Scissor( GLcontext *ctx,
	XDEF	_gl_Scissor
_gl_Scissor
	movem.l	d2-d4,-(a7)
	move.l	$20(a7),d0
	move.l	$1C(a7),d1
	move.l	$18(a7),d3
	move.l	$14(a7),d4
	move.l	$10(a7),a0
L17
;   if (width<0 || height<0) 
	tst.l	d1
	bmi.b	L19
L18
	tst.l	d0
	bpl.b	L20
L19
;      gl_error( ctx, GL_INVALID_VALUE, "glScissor" );
	move.l	#L15,-(a7)
	pea	$501.w
	move.l	a0,-(a7)
	jsr	_gl_error
	add.w	#$C,a7
	movem.l	(a7)+,d2-d4
	rts
L20
;   if (INSIDE_BEGIN_END(ctx)) 
	move.l	a0,a1
	add.l	#$E968,a1
	move.l	(a1),d2
	cmp.l	#$1A00,d2
	beq.b	L22
L21
;      gl_error( ctx, GL_INVALID_OPERATION, "glBegin" );
	move.l	#L16,-(a7)
	pea	$502.w
	move.l	a0,-(a7)
	jsr	_gl_error
	add.w	#$C,a7
	movem.l	(a7)+,d2-d4
	rts
L22
;   if (x!=ctx->Scissor.X || y!=ctx->Scissor.Y || 
	move.l	a0,a1
	add.l	#$DE92,a1
	cmp.l	2(a1),d4
	bne.b	L26
L23
	move.l	a0,a1
	add.l	#$DE92,a1
	cmp.l	6(a1),d3
	bne.b	L26
L24
	move.l	a0,a1
	add.l	#$DE92,a1
	cmp.l	$A(a1),d1
	bne.b	L26
L25
	move.l	a0,a1
	add.l	#$DE92,a1
	cmp.l	$E(a1),d0
	beq.b	L27
L26
;      ctx->Scissor.X = x;
	move.l	a0,a1
	add.l	#$DE94,a1
	move.l	d4,(a1)
;      ctx->Scissor.Y = y;
	move.l	a0,a1
	add.l	#$DE98,a1
	move.l	d3,(a1)
;      ctx->Scissor.Width = width;
	move.l	a0,a1
	add.l	#$DE9C,a1
	move.l	d1,(a1)
;      ctx->Scissor.Height = height;
	move.l	a0,a1
	add.l	#$DEA0,a1
	move.l	d0,(a1)
;      ctx->NewState |= NEW_ALL;
	move.l	a0,a1
	add.l	#$E960,a1
	move.l	(a1),d0
	or.l	#$FF,d0
	add.l	#$E960,a0
	move.l	d0,(a0)
L27
	movem.l	(a7)+,d2-d4
	rts

L16
	dc.b	'glBegin',0
L15
	dc.b	'glScissor',0

	SECTION "_gl_scissor_span:0",CODE

	rts

;GLint gl_scissor_span( GLcontext *ctx,
	XDEF	_gl_scissor_span
_gl_scissor_span
	movem.l	d2-d6/a2,-(a7)
	movem.l	$24(a7),d1/d2/a1
	move.l	$20(a7),d5
	move.l	$1C(a7),a0
L28
;   if (y<ctx->Buffer->Ymin || y>ctx->Buffer->Ymax
	move.l	$8FC(a0),a2
	cmp.l	$2C(a2),d2
	blt.b	L32
L29
	move.l	$8FC(a0),a2
	cmp.l	$30(a2),d2
	bgt.b	L32
L30
	move.l	$8FC(a0),a2
	cmp.l	$28(a2),d1
	bgt.b	L32
L31
	move.l	d1,d0
	add.l	d5,d0
	subq.l	#1,d0
	move.l	$8FC(a0),a2
	cmp.l	$24(a2),d0
	bge.b	L33
L32
	moveq	#0,d0
	movem.l	(a7)+,d2-d6/a2
	rts
L33
;      GLint xMin = ctx->Buffer->Xmin;
	move.l	$8FC(a0),a2
	move.l	$24(a2),d4
;      GLint xMax = ctx->Buffer->Xmax;
	move.l	$8FC(a0),a0
	move.l	$28(a0),d3
;      for (i=0;
	moveq	#0,d0
	bra.b	L35
L34
;         mask[i] = 0;
	clr.b	0(a1,d0.l)
	addq.l	#1,d0
L35
	move.l	d1,d2
	add.l	d0,d2
	cmp.l	d4,d2
	blt.b	L34
L36
;      for (i=(GLint)n-1;
	move.l	d5,d0
	subq.l	#1,d0
	bra.b	L38
L37
;         mask[i] = 0;
	clr.b	0(a1,d0.l)
	subq.l	#1,d0
L38
	move.l	d1,d2
	add.l	d0,d2
	cmp.l	d3,d2
	bgt.b	L37
L39
	moveq	#1,d0
	movem.l	(a7)+,d2-d6/a2
	rts

	SECTION "_gl_scissor_pixels:0",CODE


;GLuint gl_scissor_pixels( GLcontext *ctx,
	XDEF	_gl_scissor_pixels
_gl_scissor_pixels
L44	EQU	-$14
	link	a5,#L44
	movem.l	d2-d7/a2-a4,-(a7)
	move.l	$8(a5),a0
	move.l	$14(a5),a1
	move.l	$10(a5),a2
	move.l	$18(a5),a4
L40
;   GLint xmin = ctx->Buffer->Xmin;
	move.l	$8FC(a0),a3
	move.l	$24(a3),d7
;   GLint xmax = ctx->Buffer->Xmax;
	move.l	$8FC(a0),a3
	move.l	$28(a3),d5
;   GLint ymin = ctx->Buffer->Ymin;
	move.l	$8FC(a0),a3
	move.l	$2C(a3),d4
;   GLint ymax = ctx->Buffer->Ymax;
	move.l	$8FC(a0),a0
	move.l	$30(a0),d3
;   for (i=0;
	moveq	#0,d1
	bra.b	L42
L41
;      mask[i] &= (x[i]>=xmin) & (x[i]<=xmax) & (y[i]>=ymin) & 
	move.l	0(a2,d1.l*4),d0
	cmp.l	d7,d0
	sge	d0
	and.l	#1,d0
	move.l	0(a2,d1.l*4),d2
	cmp.l	d5,d2
	sle	d2
	and.l	#1,d2
	and.l	d2,d0
	move.l	0(a1,d1.l*4),d2
	cmp.l	d4,d2
	sge	d2
	and.l	#1,d2
	and.l	d2,d0
	move.l	0(a1,d1.l*4),d2
	cmp.l	d3,d2
	sle	d2
	and.l	#1,d2
	and.l	d2,d0
	move.b	d0,d2
	lea	0(a4,d1.l),a0
	and.b	d2,(a0)
	addq.l	#1,d1
L42
	cmp.l	$C(a5),d1
	blo.b	L41
L43
	moveq	#1,d0
	movem.l	(a7)+,d2-d7/a2-a4
	unlk	a5
	rts

	END
