MenuSystem:					;Handles Menu System
						;A0=MenuHeadInfo
						;D0out=Routine selected
	movem.l	d1-d7/a0-a5,-(a7)
	move.l	$05c(a6),-(a7)
	move.l	a0,$1d0(a6)
	move.w	#$ffff,$1c8(a6)
	move.w	#$ffff,$1ca(a6)
	clr.l	$1cc(a6)
	bsr	RememberMarked
	bsr	ShowMenuHeader
MenuSystem1:
	jsr	_ReadKeyboard(a6)
	tst.b	d0
	beq.s	MenuSystem2
	cmp.b	#$9b,d0
	beq	MenuSystem7
	cmp.b	#$1b,d0
	bne	MenuSystem8
	bsr	RevMenuHeadItem
	move.l	$1d0(a6),a0
	move.l	8(a0),a0
	move.w	$1c8(a6),d0
	bmi	MenuSystemError
	mulu	#$000c,d0
	add.w	d0,a0
	move.l	4(a0),a0
	bsr	RemoveMenu
	move.w	#$ffff,$1c8(a6)
	move.w	#$ffff,$1ca(a6)
	clr.l	$1cc(a6)
	move.l	#$00010000,d0
	bsr	WriteMousePosition
	bra	MenuSystem1
MenuSystem2:
	bsr	ReadMousePosition
	move.l	d0,d1
	swap	d1
	tst.w	d1
	bne	MenuSystem5
	move.l	$1d0(a6),a0
	move.l	4(a0),a0
	addq.l	#1,a0
	moveq	#$ffffffff,d1
MenuSystem3:
	addq.l	#1,d1
	cmp.b	(a0)+,d0
	bhi.s	MenuSystem3
	bsr	RevMenuSubItem
	move.w	#$ffff,$1ca(a6)
	clr.l	$1cc(a6)
	cmp.w	$1c8(a6),d1
	beq	MenuSystem1
	bsr	RevMenuHeadItem
	move.l	$1d0(a6),a0
	move.l	8(a0),a0
	move.w	$1c8(a6),d0
	bmi	MenuSystem4
	mulu	#$000c,d0
	add.w	d0,a0
	move.l	4(a0),a0
	bsr	RemoveMenu
MenuSystem4:	
	move.w	d1,$1c8(a6)
	bsr	RevMenuHeadItem
	move.l	$1d0(a6),a0
	move.l	8(a0),a0
	move.w	$1c8(a6),d0
	mulu	#$000c,d0
	add.w	d0,a0
	move.l	4(a0),a0
	bsr	ShowMenu
	bra	MenuSystem1
MenuSystem5:
	move.w	$1c8(a6),d0
	bmi	MenuSystem1
	move.l	$1d0(a6),a0
	move.l	8(a0),a0			;MenuHead2
	mulu	#$000c,d0
	add.w	d0,a0
	move.l	(a0)+,a2			;MenuInfo
	move.l	(a0)+,a1			;MenuText
	bsr	ReadMousePosition
	cmp.b	(a1),d0
	bls	MenuSystem6
	cmp.b	2(a1),d0
	bhi	MenuSystem6
	beq	MenuSystem6
	swap	d0
	cmp.b	1(a1),d0
	bls	MenuSystem6
	cmp.b	3(a1),d0
	bhi	MenuSystem6
	beq	MenuSystem6
	sub.b	1(a1),d0
	subq.b	#1,d0
	and.w	#$00ff,d0
	cmp.w	$1ca(a6),d0
	beq	MenuSystem1
	move.l	d0,d1
	mulu	#$0004,d0
	adda.w	d0,a2
	cmp.l	#-1,(a2)
	beq	MenuSystem6
	move.l	(a2),$1cc(a6)
	bsr	RevMenuSubItem
	move.w	d1,$1ca(a6)
	bsr	RevMenuSubItem
	bra	MenuSystem1
MenuSystem6:
	bsr	RevMenuSubItem
	move.w	#$ffff,$1ca(a6)
	clr.l	$1cc(a6)
	bra	MenuSystem1
MenuSystem7:
	move.l	$1c4(a6),a0
	bsr	ReadCSIPar
	cmp.b	#$01,d0
	bne	MenuSystemError
	move.l	4(a0),d0
	cmp.b	#43,d0			;Right MOBUT Released
	beq	MenuSystem1
	cmp.b	#45,d0			;Right ALT Released
	beq	MenuSystem1
	cmp.b	#41,d0			;Right MOBUT Pressed
	beq	MenuSystemExit
	bra	MenuSystemError
MenuSystem8:
	and.w	#$005f,d0
	move.w	$1c8(a6),d1
	bpl	MenuSystem10
	move.l	$1d0(a6),a0
	move.l	$0c(a0),a0
MenuSystem9:
	move.b	(a0)+,d1
	beq	MenuSystemError
	move.b	(a0)+,d2
	move.b	(a0)+,d3
	cmp.b	d1,d0
	bne	MenuSystem9
	moveq	#$00,d0
	move.b	d3,d0
	swap	d0
	move.b	d2,d0
	bsr	WriteMousePosition
	bra	MenuSystem1
MenuSystem10:
	move.l	$1d0(a6),a0
	move.l	8(a0),a0
	mulu	#$000c,d1
	add.w	d1,a0
	move.l	(a0)+,a2
	move.l	(a0)+,a1
	move.l	(a0),a0
MenuSystem11:
	move.b	(a0)+,d1
	beq	MenuSystemError
	move.b	(a0)+,d2
	move.b	(a0)+,d3
	cmp.b	d1,d0
	bne	MenuSystem11
	bsr	RevMenuSubItem
	moveq	#$00,d0
	move.b	d3,d0
	swap	d0
	move.b	d2,d0
	bsr	WriteMousePosition
	move.b	d3,d0
	sub.b	1(a1),d0
	subq.b	#1,d0
	and.w	#$00ff,d0
	move.w	d0,$1ca(a6)
	mulu	#$0004,d0
	adda.w	d0,a2
	move.l	(a2),$1cc(a6)
	bsr	RevMenuSubItem
	bra	MenuSystemExit
MenuSystemError:
	clr.l	$1cc(a6)
MenuSystemExit:
	bsr	RestoreScreen
	bsr	RestoreAllMarked
	move.l	$1cc(a6),d0
	move.l	(a7)+,$05c(a6)
	movem.l	(a7)+,d1-d7/a0-a5
	rts

ShowMenuHeader:					;Shows the Menu Header
						;A0=MenuHeadText
	move.l	a0,-(a7)
	move.l	$05c(a6),-(a7)
	move.b	$074(a6),-(a7)
	move.w	#$0000,$05c(a6)
	move.w	#$0000,$05e(a6)
	move.b	#$ff,$074(a6)			;Inverse
	move.l	$1d0(a6),a0			;Menu Head Info
	move.l	(a0),a0
	bsr	WriteBitmapString
	move.b	#$00,$074(a6)			;No Inverse
	move.b	(a7)+,$074(a6)
	move.l	(a7)+,$05c(a6)
	move.l	(a7)+,a0
	rts

RevMenuHeadItem:			;Reverses Menu Head Item
	movem.l	d0-d1/a0,-(a7)
	move.l	$05c(a6),-(a7)
	move.w	$1c8(a6),d0
	bmi.s	RevMenuHeadItem1	;No Item Selected
	move.w	#$0000,$05c(a6)
	move.l	$1d0(a6),a0
	move.l	4(a0),a0		;MenuHead1
	add.w	d0,a0
	moveq	#$00,d0
	moveq	#$00,d1
	move.b	(a0)+,d0
	move.b	(a0),d1
	subq.w	#1,d1
	bsr	ReverseMenuLine
RevMenuHeadItem1:
	move.l	(a7)+,$05c(a6)
	movem.l	(a7)+,d0-d1/a0
	rts

RevMenuSubItem:				;Reverses Menu Sub Item
	movem.l	d0-d1/a0,-(a7)
	move.l	$05c(a6),-(a7)
	move.w	$1c8(a6),d0
	bmi	RevMenuSubItem1
	move.l	$1d0(a6),a0
	move.l	8(a0),a0		;MenuHead2
	mulu	#$000c,d0
	add.w	d0,a0
	move.l	4(a0),a0
	move.w	$1ca(a6),d0
	bmi	RevMenuSubItem1
	moveq	#$00,d1
	move.b	1(a0),d1
	add.w	d1,d0
	addq.w	#1,d0
	move.w	d0,$05c(a6)
	moveq	#$00,d0
	moveq	#$00,d1
	move.b	(a0),d0
	move.b	2(a0),d1
	addq.w	#1,d0
	subq.w	#1,d1
	bsr	ReverseMenuLine
RevMenuSubItem1:
	move.l	(a7)+,$05c(a6)
	movem.l	(a7)+,d0-d1/a0
	rts

ReverseMenuLine:			;Reverses a line
					;D0/D1=x1/x2
	movem.l	d0-d2/a0,-(a7)
	move.w	d0,d2
	bsr	CalcYAddr
	move.l	$178(a6),a0
	add.w	d2,a0
ReverseMenuLine1:
	eor.b	#$ff,(a0)
	eor.b	#$ff,$0050(a0)
	eor.b	#$ff,$00a0(a0)
	eor.b	#$ff,$00f0(a0)
	eor.b	#$ff,$0140(a0)
	eor.b	#$ff,$0190(a0)
	eor.b	#$ff,$01e0(a0)
	eor.b	#$ff,$0230(a0)
	addq.l	#1,a0
	addq.w	#1,d2
	cmp.w	d1,d2
	bls.s	ReverseMenuLine1
	movem.l	(a7)+,d0-d2/a0
	rts

DrawMenuSelBox:				;Draws a select box on bitmap.
					;D0/D1=x1/y1 , D2/D3=x2/y2
	movem.l	d0-d5/a0-a2,-(a7)
	move.l	$05c(a6),-(a7)		;X & Y on stack
	move.w	d1,d5
	lea	DrawMenuSelBoxData(pc),a2
	bra	DrawMenuBigBox1

DrawMenuBigBox:				;Draws a cleared box on bitmap.
					;D0/D1=x1/y1 , D2/D3=x2/y2
	movem.l	d0-d5/a0-a2,-(a7)
	move.l	$05c(a6),-(a7)		;X & Y on stack
	move.w	d1,d5
	lea	DrawMenuBigBoxData(pc),a2
DrawMenuBigBox1:
	move.l	a2,a1
	move.w	d0,d4
	cmp.w	d5,d1
	beq.s	DrawMenuBigBox2
	lea	$0018(a1),a1
	cmp.w	d5,d3
	bhi.s	DrawMenuBigBox2
	lea	$0018(a1),a1
DrawMenuBigBox2:
	move.w	d5,$05c(a6)		;Y
	move.w	d4,$05e(a6)		;X
	bsr	CalcYAddr
	move.l	$178(a6),a0		;Bitmap
	adda.w	d4,a0
	move.b	(a1)+,(a0)
	move.b	(a1)+,$0050(a0)
	move.b	(a1)+,$00a0(a0)
	move.b	(a1)+,$00f0(a0)
	move.b	(a1)+,$0140(a0)
	move.b	(a1)+,$0190(a0)
	move.b	(a1)+,$01e0(a0)
	move.b	(a1)+,$0230(a0)
	addq.w	#1,d4
	addq.l	#1,a0
DrawMenuBigBox3:
	cmp.w	d4,d2
	bls.s	DrawMenuBigBox4
	move.b	(a1)+,(a0)
	move.b	(a1)+,$0050(a0)
	move.b	(a1)+,$00a0(a0)
	move.b	(a1)+,$00f0(a0)
	move.b	(a1)+,$0140(a0)
	move.b	(a1)+,$0190(a0)
	move.b	(a1)+,$01e0(a0)
	move.b	(a1)+,$0230(a0)
	subq.l	#8,a1
	addq.w	#1,d4
	addq.l	#1,a0	
	bra.s	DrawMenuBigBox3
DrawMenuBigBox4:
	addq.l	#8,a1
	move.b	(a1)+,(a0)
	move.b	(a1)+,$0050(a0)
	move.b	(a1)+,$00a0(a0)
	move.b	(a1)+,$00f0(a0)
	move.b	(a1)+,$0140(a0)
	move.b	(a1)+,$0190(a0)
	move.b	(a1)+,$01e0(a0)
	move.b	(a1)+,$0230(a0)
	addq.w	#1,d5
	cmp.w	d3,d5
	bls	DrawMenuBigBox1
	move.l	(a7)+,$05c(a6)
	movem.l	(a7)+,d0-d5/a0-a2
	rts

DrawMenuBigBoxData:
	dc.b	$00,$00,$00,$3f,$30,$30,$30,$30
	dc.b	$00,$00,$00,$ff,$00,$00,$00,$00
	dc.b	$00,$00,$00,$fc,$0c,$0c,$0c,$0c
	dc.b	$30,$30,$30,$30,$30,$30,$30,$30
	dc.b	$00,$00,$00,$00,$00,$00,$00,$00
	dc.b	$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
	dc.b	$30,$30,$30,$30,$3f,$00,$00,$00
	dc.b	$00,$00,$00,$00,$ff,$00,$00,$00
	dc.b	$0c,$0c,$0c,$0c,$fc,$00,$00,$00
	
DrawMenuSelBoxData:
	dc.b	$00,$00,$7f,$60,$67,$66,$66,$66
	dc.b	$00,$00,$ff,$00,$ff,$00,$00,$00
	dc.b	$00,$00,$fe,$06,$e6,$66,$66,$66
	dc.b	$66,$66,$66,$66,$66,$66,$66,$66
	dc.b	$00,$00,$00,$00,$00,$00,$00,$00
	dc.b	$66,$66,$66,$66,$66,$66,$66,$66
	dc.b	$66,$66,$66,$67,$60,$7f,$00,$00
	dc.b	$00,$00,$00,$ff,$00,$ff,$00,$00
	dc.b	$66,$66,$66,$e6,$06,$fe,$00,$00
	
DrawMenuLineData:
	dc.b	$30,$30,$30,$3f,$30,$30,$30,$30
	dc.b	$00,$00,$00,$ff,$00,$00,$00,$00
	dc.b	$0c,$0c,$0c,$fc,$0c,$0c,$0c,$0c

DrawMenuLine:				;Draws a line on bitmap.
					;D0/D1=x1/x2
	movem.l	d0-d5/a0-a2,-(a7)
	move.l	$05c(a6),-(a7)		;X & Y on stack
	lea	DrawMenuLineData(pc),a1
	move.w	d0,d4
	move.w	d1,d2
	moveq	#$00,d3
	move.w	$05c(a6),d3
	move.l	d3,d5
	bra	DrawMenuBigBox2

ShowMenu:				;Shows a menu window
					;A0=EditorMenuText
	movem.l	d0-d5/a0,-(a7)
	move.l	$05c(a6),-(a7)
	clr.l	d0
	clr.l	d1
	clr.l	d2
	clr.l	d3
	move.b	(a0)+,d0		;x1
	move.b	(a0)+,d1		;y1
	move.b	(a0)+,d2		;x2
	move.b	(a0)+,d3		;y2
	move.w	d0,d4
	move.w	d1,d5
	bsr	DrawMenuBigBox
ShowMenu1:
	addq.w	#1,d5
	cmp.w	d5,d3
	bls.s	ShowMenu3
	tst.b	(a0)
	beq.s	ShowMenu3
	move.w	d5,$05c(a6)		;Y
	move.w	d4,d0
	addq.w	#1,d0
	move.w	d0,$05e(a6)		;X
	move.b	(a0),d0
	cmp.b	#$ff,d0
	bne.s	ShowMenu2
	addq.l	#1,a0
	move.w	d4,d0
	move.w	d2,d1
	bsr	DrawMenuLine
	bra.s	ShowMenu1
ShowMenu2:
	bsr	WriteBitmapString
	move.l	d0,a0
	bra.s	ShowMenu1
ShowMenu3:
	move.l	(a7)+,$05c(a6)
	movem.l	(a7)+,d0-d5/a0
	rts

RemoveMenu:					;Removes a menu window
						;A0=EditorMenuText
	movem.l	d0-d7/a0-a4,-(a7)
	move.l	$05c(a6),-(a7)
	moveq	#$00,d4
	moveq	#$00,d5
	moveq	#$00,d6
	moveq	#$00,d7
	move.b	(a0)+,d4		;x1
	move.b	(a0)+,d5		;y1
	move.b	(a0)+,d6		;x2
	move.b	(a0)+,d7		;y2
	movem.l	d4-d7,-(a7)
	move.l	$010(a6),a3
	move.l	$00c(a6),a4
RemoveMenu1:
	move.w	d5,$05c(a6)
	bsr	CalcYAddr
	move.l	$178(a6),a1		;Bitmap
	add.w	d4,a1
	move.l	$17c(a6),a2		;Charmap
	add.w	d4,a2
	move.w	d4,d3
RemoveMenu2:
	move.b	(a2)+,d0
	moveq	#$00,d1
	moveq	#$00,d2
	move.b	d0,d1
	bpl.s	RemoveMenu3
	sub.b	#$0020,d1
	bmi.s	RemoveMenu4
	moveq	#-1,d2
	add.b	#$0040,d1
	bra.s	RemoveMenu4
RemoveMenu3:
	sub.b	#$0020,d1
	bpl.s	RemoveMenu4
	moveq	#-1,d2
	add.b	#$0040,d1
RemoveMenu4:
	add.w	d1,d1
	add.w	d1,d1
	move.w	00(a3,d1.w),d1
	lsr.w	#3,d1
	lea	0(a4,d1.w),a0
	tst.b	d2
	beq.s	RemoveMenu5
	move.b	$00c0(a0),d0
	eor.b	d2,d0
	move.b	d0,$0050(a1)
	move.b	$0180(a0),d0
	eor.b	d2,d0
	move.b	d0,$00a0(a1)
	move.b	$0240(a0),d0
	eor.b	d2,d0
	move.b	d0,$00f0(a1)
	move.b	$0300(a0),d0
	eor.b	d2,d0
	move.b	d0,$0140(a1)
	move.b	$03c0(a0),d0
	eor.b	d2,d0
	move.b	d0,$0190(a1)
	move.b	$0480(a0),d0
	eor.b	d2,d0
	move.b	d0,$01e0(a1)
	move.b	$0540(a0),d0
	eor.b	d2,d0
	move.b	d0,$0230(a1)
	move.b	(a0),d0
	eor.b	d2,d0
	move.b	d0,(a1)+
	bra.s	RemoveMenu6
RemoveMenu5:
	move.b	$00c0(a0),$0050(a1)
	move.b	$0180(a0),$00a0(a1)
	move.b	$0240(a0),$00f0(a1)
	move.b	$0300(a0),$0140(a1)
	move.b	$03c0(a0),$0190(a1)
	move.b	$0480(a0),$01e0(a1)
	move.b	$0540(a0),$0230(a1)
	move.b	(a0),(a1)+
RemoveMenu6:
	addq.w	#1,d3
	cmp.w	d6,d3
	bls	RemoveMenu2
	addq.w	#1,d5
	cmp.w	d7,d5
	bls	RemoveMenu1
	movem.l	(a7)+,d0-d3
	bsr	RestoreMarked
	move.l	(a7)+,$05c(a6)
	movem.l	(a7)+,d0-d7/a0-a4
	rts

