
	globl ob_dostate,ob_undostate,ob_isstate
	globl ob_doflag,ob_undoflag,ob_isflag
	globl ob_xywh
	globl ob_get_text,ob_set_text
	globl ob_draw_dialog,ob_undraw_dialog

	globl rc_equal,rc_copy,rc_intersect,rc_inside,rc_grect_to_array,rc_array_to_grect
	globl _center,_typetest,_dial

	globl form_center,form_dial
	globl objc_draw

	globl vq_gdos

G_TEXT		= 21
G_BOXTEXT	= 22
G_USERDEF	= 24
G_BUTTON	= 26
G_STRING	= 28
G_FTEXT 	= 29
G_FBOXTEXT	= 30
G_TITLE 	= 32

G_XTEXT     = ($0600|G_USERDEF)


g_x 		= 0
g_y 		= 2
g_w 		= 4
g_h 		= 6

xmin1		= -16
ymin1		= -14
xmin2		= -12
ymin2		= -10
xmax1		= -8
ymax1		= -6
xmax2		= -4
ymax2		= -2

			TEXT

MODULE vq_gdos
			pea		(a2)
			moveq.l	#-2,d0
			trap	#2
			addq.l	#2,d0
			move.l	(sp)+,a2
			rts
ENDMOD

MODULE ob_dostate
			mulu.w	#24,d0
			or.w	d1,10(a0,d0.l)
			rts
ENDMOD

MODULE ob_undostate
			not.w	d1
			mulu.w	#24,d0
			and.w	d1,10(a0,d0.l)
			rts
ENDMOD

MODULE ob_isstate
			mulu.w	#24,d0
			move.w	d1,d2
			and.w	10(a0,d0.l),d1
			cmp.w	d1,d2
			beq.b	flag_set

			moveq.l #0,d0
			rts

flag_set:	moveq.l #1,d0
			rts
ENDMOD

MODULE ob_doflag
			mulu.w	#24,d0
			or.w	d1,8(a0,d0.l)
			rts
ENDMOD

MODULE ob_undoflag
			not.w	d1
			mulu.w	#24,d0
			and.w	d1,8(a0,d0.l)
			rts
ENDMOD

MODULE ob_isflag
			mulu.w	#24,d0
			move.w	d1,d2
			and.w	8(a0,d0.l),d1
			cmp.w	d1,d2
			beq.b	state_set

			moveq.l #0,d0
			rts

state_set:	moveq.l #1,d0
			rts
ENDMOD

MODULE ob_xywh
			mulu.w	#24,d0
			move.l	16(a0,d0.l),(a1)+
			move.l	20(a0,d0.l),(a1)
			rts
ENDMOD

MODULE ob_get_text
			jsr 	_typetest

			move.l	(a0),a0
			tst.w	d1
			beq.b	no_init

			clr.b	(a0)
no_init:	rts
ENDMOD

MODULE ob_set_text
			jsr 	_typetest
			move.l	a1,(a0)
			rts
ENDMOD

MODULE _typetest
			mulu.w	#24,d0
			add.l	d0,a0
			move.w	6(a0),d2

			cmp.b	#G_TEXT,d2
			beq.b	text
			cmp.b	#G_FTEXT,d2
			beq.b	text
			cmp.b	#G_BOXTEXT,d2
			beq.b	text
			cmp.b	#G_FBOXTEXT,d2
			beq.b	text

			cmp.b	#G_STRING,d2
			beq.b	string
			cmp.b	#G_BUTTON,d2
			beq.b	string
			cmp.b	#G_TITLE,d2
			beq.b	string

			and.w	#$3fff,d2	; ~(G_MODAL|G_UNMODAL)
			cmp.w	#G_XTEXT,d2
			beq.b	userdef

			sub.l	a0,a0
			addq.l	#4,sp
			rts

text:		move.l	12(a0),a0
			rts

string: 	lea.l	12(a0),a0
			rts

userdef:	move.l	12(a0),a0
			move.l	4(a0),a0
			rts
ENDMOD


MODULE ob_draw_dialog
			link	a6,#-16
			jsr 	_center
			clr.w	-2(a6)
			bsr 	_dial
			move.w	-4(a6),d0
			or.w	-6(a6),d0
			or.w	-8(a6),d0
			or.w	8(a6),d0
			beq.b	no_grow

			move.w	#1,-2(a6)
			jsr 	_dial

no_grow:	lea.l	-16(a6),a1
			move.l	(a1)+,-(sp)
			move.w	(a1)+,-(sp)
			move.w	(a1),d2
			moveq.l #127,d1
			moveq.l #0,d0
			jsr 	objc_draw
			addq.l	#6,sp
			unlk	a6
			rts
ENDMOD

MODULE ob_undraw_dialog
			link	a6,#-16
			jsr 	_center
			move.w	-4(a6),d0
			or.w	-6(a6),d0
			or.w	-8(a6),d0
			or.w	8(a6),d0
			beq.b	no_shrink

			move.w	#2,-2(a6)
			jsr 	_dial

no_shrink:	move.w	#3,-2(a6)
			jsr 	_dial
			unlk	a6
			rts
ENDMOD

MODULE _center
			move.w	d2,-8(a6)
			move.w	d1,-6(a6)
			move.w	d0,-4(a6)
			pea 	(a0)
			lea.l	-10(a6),a1
			pea 	-16(a6)
			pea 	-14(a6)
			pea 	-12(a6)
			jsr 	form_center
			lea.l	12(sp),sp
			move.l	(sp)+,a0
			rts
ENDMOD

MODULE _dial
			pea 	(a0)
			lea.l	-16(a6),a1
			move.l	(a1)+,-(sp)
			move.l	(a1),-(sp)
			move.w	8(a6),-(sp)
			move.w	-8(a6),-(sp)
			move.w	-6(a6),d2
			move.w	-4(a6),d1
			move.w	-2(a6),d0
			jsr 	form_dial
			lea.l	12(sp),sp
			move.l	(sp)+,a0
			rts
ENDMOD

MODULE rc_equal
			cmpm.l	(a0)+,(a1)+
			bne.b	notequal

			cmpm.l	(a0)+,(a1)+
			beq 	equal

notequal:	moveq.l #0,d0
			rts

equal:		moveq.l #1,d0
			rts
ENDMOD

MODULE rc_copy
			move.l	(a0)+,(a1)+
			move.l	(a0),(a1)
			moveq.l	#0,d0
			rts
ENDMOD

MODULE rc_intersect
			link	a6,#-16
			move.w	g_y(a0),d0
			cmp.w	g_y(a1),d0
			bge.b	skip

			move.l	g_x(a0),xmin1(a6)

			move.w	g_x(a0),d0
			add.w	g_w(a0),d0
			move.w	d0,xmax1(a6)

			move.w	g_y(a0),d0
			add.w	g_h(a0),d0
			move.w	d0,ymax1(a6)
			
			move.l	g_x(a1),xmin2(a6)

			move.w	g_x(a1),d0
			add.w	g_w(a1),d0
			move.w	d0,xmax2(a6)

			move.w	g_y(a1),d0
			add.w	g_h(a1),d0
			move.w	d0,ymax2(a6)
			bra.b	skp

skip:		move.l	g_x(a0),xmin2(a6)

			move.w	g_x(a0),d0
			add.w	g_w(a0),d0
			move.w	d0,xmax2(a6)

			move.w	g_y(a0),d0
			add.w	g_h(a0),d0
			move.w	d0,ymax2(a6)

			move.l	g_x(a1),xmin1(a6)

			move.w	g_x(a1),d0
			add.w	g_w(a1),d0
			move.w	d0,xmax1(a6)

			move.w	g_y(a1),d0
			add.w	g_h(a1),d0
			move.w	d0,ymax1(a6)

skp:		move.w	ymin2(a6),d0
			cmp.w	ymax1(a6),d0
			bge.b	ret

			move.w	xmin1(a6),d0
			cmp.w	xmax2(a6),d0
			bge.b	ret

			move.w	xmin2(a6),d0
			cmp.w	xmax1(a6),d0
			bge.b	ret

			move.w	xmin1(a6),d0
			move.w	xmin2(a6),d1
			cmp.w	d1,d0
			bge.b	(*)+4

			move.w	d1,d0
			move.w	d0,g_x(a1)
			
			move.w	ymin1(a6),d0
			move.w	ymin2(a6),d1
			cmp.w	d1,d0
			bge.b	(*)+4
			
			move.w	d1,d0
			move.w	d0,g_y(a1)
			
			move.w	xmax1(a6),d0
			move.w	xmax2(a6),d1
			cmp.w	d1,d0
			blt.b	(*)+4
			
			move.w	d1,d0
			move.w	d0,g_w(a1)
			
			move.w	ymax1(a6),d0
			move.w	ymax2(a6),d1
			cmp.w	d1,d0
			blt.b	(*)+4

			move.w	d1,d0
			move.w	d0,g_h(a1)

			move.w	g_x(a1),d0
			sub.w	d0,g_w(a1)
			move.w	g_y(a1),d0
			sub.w	d0,g_h(a1)
			
			moveq.l	#1,d0
			unlk	a6
			rts

ret:		moveq.l	#0,d0
			unlk	a6
			rts
ENDMOD

MODULE rc_inside
			move.w	(a0)+,d2
			cmp.w	d2,d0
			blt.b	outside

			add.w	2(a0),d2
			cmp.w	d2,d0
			bge.b	outside

			move.w	(a0)+,d2
			cmp.w	d2,d1
			blt.b	outside

			add.w	2(a0),d2
			cmp.w	d2,d1
			bge.b	outside

			moveq.l #1,d0
			rts

outside:	moveq.l #0,d0
			rts
ENDMOD

MODULE rc_grect_to_array
			move.l	(a0)+,d0
			move.l	d0,(a1)+

			swap	d0
			add.w	(a0)+,d0
			subq.w	#1,d0
			move.w	d0,(a1)+

			swap	d0
			add.w	(a0),d0
			subq.w	#1,d0
			move.w	d0,(a1)

			rts
ENDMOD

MODULE rc_array_to_grect
			move.l	(a0)+,d0
			move.l	d0,(a1)+

			swap	d0
			sub.w	(a0)+,d0
			neg.w	d0
			addq.w	#1,d0
			move.w	d0,(a1)+

			swap	d0
			sub.w	(a0),d0
			neg.w	d0
			addq.w	#1,d0
			move.w	d0,(a1)

			rts
ENDMOD
