NEW
  AUTO 3,1
				.LIST OFF
				.OP	65C02
				.OR	$2000
				.TF lib/libgui
*--------------------------------------
				.INB inc/macros.i
				.INB inc/a2osx.i
				.INB inc/kernel.i
				.INB inc/gfx.i
				.INB inc/libgui.i
*--------------------------------------
WND.MAX			.EQ 64
MENU.MAX		.EQ 4
MENU.LMargin	.EQ 7
MENU.RMargin	.EQ 8
*--------------------------------------
				.MA SWAP16
				lda ]1
				ldx ]2
				stx ]1
				sta ]2
				lda ]1+1
				ldx ]2+1
				stx ]1+1
				sta ]2+1
				.EM

				.MA NOT16
				sec
				lda #0
				sbc ]1
				sta ]1
				lda #0
				sbc ]1+1
				sta ]1+1
				.EM

				.MA SCMPAX
				sec
				sbc ]1
				txa
				sbc ]1+1
				bvc :1
				eor #$80
:1				.EQ *
				.EM

				.MA SCMPYA
				cpy ]1
				sbc ]1+1
				bvc :1
				eor #$80
:1				.EQ *
				.EM

				.MA STYAIFGTR
				tax
				>SCMPYA ]1
				bmi :1

				sty ]1
				stx ]1+1
:1				.EQ *
				.EM

				.MA STYAIFLWR
				tax
				>SCMPYA ]1
				bpl :1

				sty ]1
				stx ]1+1
:1				.EQ *
				.EM
*--------------------------------------
				.DUMMY
				.OR ZPLIB
ZPCBPtr			.BS 2
ZPObjPtr		.BS 2
ZPWNDPtr		.BS 2
ZPMENUPtr		.BS 2

ZPBMPtr			.BS 2
ZPRECTPtr		.BS 2
ZPPtr1			.BS 2

DX				.BS 2
DY				.BS 2
IE				.BS 2
INE				.BS 2

D				.BS 2
Counter			.BS 2

CLIP.Line.P1	.BS 1
CLIP.Line.P2	.BS 1
IY				.BS 1

hCBBuf			.BS 1
ZPCBBufPtr		.BS 2

				.ED
*--------------------------------------
*			File Header (16 Bytes)
*--------------------------------------
CS.START		cld
				jmp (.1,x)
				.DA #$61				6502,Level 1 (65c02)
				.DA #1					BIN Layout Version 1
				.DA 0
				.DA CS.END-CS.START
				.DA 0
				.DA 0
				.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1				.DA LIB.LOAD
				.DA LIB.UNLOAD
				.DA SetCursor
				.DA SetCursorPos
				.DA HideCursor
				.DA ShowCursor
				.DA UpdateCursor
				.DA MOU.ReadMouse
				.DA DrawLine
				.DA OBJ.SetProp
				.DA OBJ.GetProp
				.DA WND.New
				.DA WND.Destroy
				.DA WND.Show
				.DA WND.Paint
L.WND.fPaint	.DA WND.fPaint
*--------------------------------------
L.DEVNAME.GFX	.DA DEVNAME.GFX
L.DEVNAME.MOUSE	.DA DEVNAME.MOUSE
L.SYSX7			.DA SYSX7
L.SYSX7B		.DA SYSX7B
L.IOCTL			.DA IOCTL
L.DCB.GFX		.DA DCB.GFX
L.MouseClamp	.DA MouseClamp
L.MouseData		.DA MouseData
L.CB.PTR		.DA CB.PTR
L.CB.Cache		.DA CB.Cache
L.OBJ.Cache		.DA OBJ.Cache
L.WND.Screen	.DA WND.Screen
L.WND.Desktop	.DA WND.Desktop
L.WND.SysBar	.DA WND.SysBar
L.WND.SysBar.2osX	.DA WND.SysBar.2osX
L.WND.SysBar.Clk	.DA WND.SysBar.Clk
L.RECT.SysBut	.DA RECT.SysBut
L.RECT.SysWNDs	.DA RECT.SysWNDs
L.RECT.SysClk	.DA RECT.SysClk
L.MENU.Sys		.DA MENU.Sys
L.MENU.Sys.Programs	.DA MENU.Sys.Programs
L.MENU.Sys.Settings	.DA MENU.Sys.Settings
*--------------------------------------
L.BMs			.EQ *-2
L.BM.Apple		.DA BM.Apple
L.BM.Close		.DA BM.Close
L.BM.Max		.DA BM.Max
L.BM.Min		.DA BM.Min
L.BM.Left		.DA BM.Left
L.BM.Right		.DA BM.Right
L.BM.Up			.DA BM.Up
L.BM.Down		.DA BM.Down
*--------------------------------------
L.CUR.SaveBuf	.DA CUR.SaveBuf
L.Cursors		.DA CUR.Arrow
				.DA CUR.Move
				.DA CUR.ResizeX
				.DA CUR.ResizeY
				.DA CUR.ResizeXY1
				.DA CUR.ResizeXY2
				.DA CUR.Cross
				.DA CUR.Text
				.DA CUR.Wait1
				.DA CUR.Wait2
				.DA CUR.Wait3
				.DA CUR.Wait4
				.DA CUR.Wait5
				.DA CUR.Wait6
J.Clip			.DA CLIP.Point			SETPIXEL
				.DA CLIP.Point			GETPIXEL
				.DA CLIP.HLine			HLINE
				.DA CLIP.VLine			VLINE
				.DA CLIP.Rect			FILLRECT
				.DA CLIP.BitBlt			BITBLT
				.DA CLIP.Rect			GETRECTBUFSIZE
				.DA CLIP.Text			DRAWTEXT
				.DA CLIP.Text			GETTEXTSIZE
				.DA CLIP.Line			DRAWLINE
				.DA CLIP.BitBlt			DRAWTEXT2
				.DA 0
*--------------------------------------
LIB.LOAD		lda LibCount
				bne .8

				jsr MOU.Init
*				bcs .9

				jsr WND.Init
				bcs .9

				jsr FON.Init
				bcs .9

				lda hDevMouse
				beq .1

				jsr MOU.Setup

.1				jsr WND.Setup

				lda #CUR.T.ARROW
				jsr SetCursor
				jsr ShowCursor

				inc LibCount

.8				clc
.9				rts
*--------------------------------------
LIB.UNLOAD		dec LibCount
				bne .8

				jsr MOU.Quit

.8				clc
				rts
*--------------------------------------
CB.InitCacheA	sta CB.Cache+S.CB.CMD
*--------------------------------------
CB.ClearCache	ldx #S.CB-1 
				
.1				stz CB.Cache,x
				dex
				bne .1
				
				rts
*--------------------------------------
CB.GetInCache	>STYA .1+1

				ldx #S.CB-1

.1				lda $ffff,x				SELF MODIFIED
				sta CB.Cache,x
				dex
				bpl .1

				rts
*--------------------------------------
GetCBBuf		clc

				ldx hCBBuf
				bne .9

				>LDYAI 512
				>SYSCALL2 GetMem
				bcs .9
				
				stx hCBBuf
				>STYA ZPCBPtr
				>STYA ZPCBBufPtr

.9				rts
*--------------------------------------
PutCBCache2CBBuf
				lda CB.Cache
				lsr
				tax
				ldy CB.CmdLen-1,x
				
				ldx #0

.1				lda CB.Cache,x
				sta (ZPCBBufPtr)
				inc ZPCBBufPtr
				bne .2

				inc ZPCBBufPtr+1

.2				inx
				dey
				bpl .1

				rts
*--------------------------------------
GFXWrite.CB		>PUSHB WND.Screen+S.OBJ.hPARENT
				>PUSHBI IOCTL.WRITE
				>PUSHW L.CB.Cache
				>SYSCALL2 IOCTL
				rts
*--------------------------------------
OBJ.GetInCache	>STYA .1+1

				ldx #S.OBJ-1

.1				lda $ffff,x				SELF MODIFIED
				sta OBJ.Cache,x
				dex
				bpl .1

				rts
*--------------------------------------
OBJ.SetX2Y2		>STYA ZPPtr1

				ldy #S.OBJ.W
				lda (ZPPtr1),y
				clc
				sbc #0
				pha
				iny
				lda (ZPPtr1),y
				sbc #0
				tax

				pla
				clc
				ldy #S.OBJ.X1
				adc (ZPPtr1),y
				pha
				txa
				iny
				adc (ZPPtr1),y
				ldy #S.OBJ.X2+1
				sta (ZPPtr1),y
				dey
				pla
				sta (ZPPtr1),y

				ldy #S.OBJ.H
				lda (ZPPtr1),y
				clc
				sbc #0
				pha
				iny
				lda (ZPPtr1),y
				sbc #0
				tax

				pla
				clc
				ldy #S.OBJ.Y1
				adc (ZPPtr1),y
				pha
				txa
				iny
				adc (ZPPtr1),y
				ldy #S.OBJ.Y2+1
				sta (ZPPtr1),y
				dey
				pla
				sta (ZPPtr1),y

				rts
*--------------------------------------
				.INB usr/src/lib/libgui.s.bm
				.INB usr/src/lib/libgui.s.but
				.INB usr/src/lib/libgui.s.clip
				.INB usr/src/lib/libgui.s.cur
				.INB usr/src/lib/libgui.s.draw
				.INB usr/src/lib/libgui.s.fon
				.INB usr/src/lib/libgui.s.mbar
				.INB usr/src/lib/libgui.s.menu
				.INB usr/src/lib/libgui.s.mou
				.INB usr/src/lib/libgui.s.obj
				.INB usr/src/lib/libgui.s.pat
				.INB usr/src/lib/libgui.s.sysbar
				.INB usr/src/lib/libgui.s.text
				.INB usr/src/lib/libgui.s.wnd
*--------------------------------------
CS.END
*--------------------------------------
				.INB usr/src/lib/libgui.g.bm
				.INB usr/src/lib/libgui.g.cur
				.INB usr/src/lib/libgui.g.fon
*--------------------------------------
DEVNAME.GFX		.AZ "/dev/gfx"
DEVNAME.MOUSE	.AZ "/dev/mou1"
*--------------------------------------
SYSX7			.AZ "${ROOT}sbin/sysx7"
SYSX7B			.AZ "${ROOT}sbin/sysx7b"
*--------------------------------------
LibCount		.BS 1
hDevMouse		.BS 1
*--------------------------------------
CB.CmdLen		.DA #S.CB.Y1+1			SETPIXEL
				.DA #S.CB.Y1+1			GETPIXEL
				.DA #S.CB.Y2+1			HLINE
				.DA #S.CB.Y2+1			VLINE
				.DA #S.CB.Y2+1			FILLRECT
				.DA #S.CB.DstPtr+1		BITBLT
				.DA #S.CB.DstPtr+1		GETRECTBUFSIZE
				.DA #S.CB.TxtPtr+1		DRAWTEXT
				.DA #S.CB.TxtPtr+1		GETTEXTSIZE
				.DA #S.CB.Y2+1			DRAWLINE
				.DA #S.CB.TxtPtr+1		DRAWTEXT2
*--------------------------------------
PAT.Buf			.BS 1					S.BM.F
				.DA #1					S.BM.RowBytes
				.DA 8					S.BM.W
				.DA 8					S.BM.H
				.DA 0					S.BM.MASK.OFS
				.BS 8					(data)
*--------------------------------------
IOCTL			.BS S.IOCTL
DCB.GFX			.BS S.DCB.GFX
*--------------------------------------
MouseClamp		.BS 8
MouseData		.BS S.MOUSE
*--------------------------------------
CB.PTR			.DA #S.CB.CMD.BITBLT
				.BS 1					S.CB.OP
				.DA #S.CB.M.MONO
				.DA #0
				.BS S.CB-4
*--------------------------------------
CB.Cache		.BS S.CB
OBJ.Cache		.BS S.OBJ
*--------------------------------------
MENU.Stack.Top	.BS 1
MENU.Stack		.BS MENU.MAX
*--------------------------------------
WND.hWND		.BS 1
WND.Stack.Idx	.BS 1
WND.Stack.Top	.BS 1
WND.Stack		.BS WND.MAX
*--------------------------------------
WND.Screen		.DA #S.OBJ.T.WND
				.BS S.WND-1
*--------------------------------------
WND.Desktop		.DA #S.OBJ.T.WND
				.BS S.WND-1
*--------------------------------------
WND.SysBar		.DA #S.OBJ.T.WND
				.BS S.WND-1
WND.SysBar.2osX	.AZ	"2osX"
WND.SysBar.Clk	.AZ	"00:00"
WND.SysBar.bSysBut	.BS 1
*--------------------------------------
RECT.SysBut		.BS S.RECT
*--------------------------------------
RECT.SysWNDs	.BS S.RECT
*--------------------------------------
RECT.SysClk		.BS S.RECT
*--------------------------------------
hSysMenu		.BS 1
MENU.Sys
.1				.DA #.2-*				next
				.DA #S.MITEM.F.ITEM		F
				.DA #0					S
				.DA #2					ID
				.DA BM.ID.APPLE			pICON
				.DA #S.MITEM.KEYMOD.CTRL+S.MITEM.KEYMOD.OA+S.MITEM.KEYMOD.CA
				.DA #'A'
				.DA #.11-.1
				.AZ "About..."
.11				.AS "Ctrl-"
				.DA #1,#'-',#2,#'-',#'A',#0
				
.2				.DA #.3-*				next
				.DA #S.MITEM.F.SEP
				
.3				.DA #.4-*				next
				.DA #S.MITEM.F.SUBMENU	F
				.DA #0					S
				.DA #4					ID
				.DA 0					pICON
				.DA 0					pMENU
				.DA #0					KEYSTR
				.AZ "Programs"

.4				.DA #.5-*				next
				.DA #S.MITEM.F.SUBMENU	F
				.DA #0					S
				.DA #6					ID
				.DA 0					pICON
				.DA 0					pMENU
				.DA #0					KEYSTR
				.AZ "Settings"

.5				.DA #.6-*				next
				.DA #S.MITEM.F.SEP
				
.6				.DA #.7-*				next
				.DA #S.MITEM.F.ITEM		F
				.DA #0					S
				.DA #8					ID
				.DA 0					pICON
				.DA #0
				.DA #0
				.DA #0					KEYSTR
				.AZ "Search..."			
				
.7				.DA #.8-*				next
				.DA #S.MITEM.F.ITEM		F
				.DA #0					S
				.DA #10					ID
				.DA 0					pICON
				.DA #S.MITEM.KEYMOD.CTRL+S.MITEM.KEYMOD.OA
				.DA #'R'
				.DA #.77-.7
				.AZ "Run..."			
.77				.AZ "Ctrl-R"
.8				.DA #0
*--------------------------------------
MENU.Sys.Programs
.1				.DA #.2-*				next
				.DA #S.MITEM.F.ITEM		F
				.DA #0					S
				.DA #42					ID
				.DA BM.ID.APPLE			pICON
				.DA #0
				.DA #0
				.DA #0					KEYSTR
				.AZ "GUITest1"			

.2				.DA #.3-*				next
				.DA #S.MITEM.F.ITEM		F
				.DA #0					S
				.DA #44					ID
				.DA BM.ID.APPLE			pICON
				.DA #0
				.DA #0
				.DA #0					KEYSTR
				.AZ "GUITest2"			

.3				.DA #0
*--------------------------------------
MENU.Sys.Settings
.1				.DA #.2-*				next
				.DA #S.MITEM.F.ITEM		F
				.DA #0					S
				.DA #62					ID
				.DA 0					pICON
				.DA #0
				.DA #0
				.DA #0					KEYSTR
				.AZ "Colors..."			

.2				.DA #.3-*				next
				.DA #S.MITEM.F.ITEM		F
				.DA #0					S
				.DA #64					ID
				.DA 0					pICON
				.DA #0
				.DA #0
				.DA #0					KEYSTR
				.AZ "SubItem2..."			

.3				.DA #0
*--------------------------------------
PREFS.BESTVIEWEDX	.DA #$FC
PREFS.bSYSBARTOP	.DA #0
PREFS.MBARXMARGIN	.DA #5
PREFS.MENUCOLOR		.DA #C.WHITE
PREFS.SYSBARCOLOR	.DA #C.WHITE
PREFS.BORDERCOLOR	.DA #C.BLACK
PREFS.TBARCOLORA	.DA #C16.D.BLUE
PREFS.TBARCOLORI	.DA #C16.L.BLUE
PREFS.MBARCOLOR		.DA #C.WHITE
PREFS.SBARCOLOR		.DA #C.WHITE
PREFS.DESKTOPCOLOR	.DA #C16.D.BLUE
*--------------------------------------
MAN
SAVE usr/src/lib/libgui.s
ASM
