NEW AUTO 3,1 *-------------------------------------- * NewMenu(pMENU, x, y) *-------------------------------------- MENU.New >PULLW DY >PULLW DX >PULLYA >STYA ZPPtr1 MENU definition >STYA ZPMENUPtr for pass #2 ldy MENU.Stack.Cnt cpy #MENU.MAX beq .90 jsr MENU.GetSize >SYSCALL2 GetMem bcs .99 >STYA ZPObjPtr txa hMenu ldx MENU.Stack.Cnt sta MENU.Stack,x lda #S.OBJ.T.MENU sta (ZPObjPtr) S.OBJ.T lda #0 ldy #S.MENU.Items-1 .1 sta (ZPObjPtr),y dey bne .1 >LDYA ZPMENUPtr >STYA ZPPtr1 jsr MENU.GetData ldx #3 ldy #S.OBJ.X1+3 .2 lda DX,x sta (ZPObjPtr),y dey dex bpl .2 jsr MENU.SetMenuSizePos ldx MENU.Stack.Cnt lda MENU.Stack,x inc MENU.Stack.Cnt clc rts .90 lda #E.OOH sec .99 MENU.New.RTS rts *-------------------------------------- * ZPPtr1 = defintion *-------------------------------------- MENU.GetSize lda #S.MENU.Items+1 Ending\0 sta Counter stz Counter+1 .1 lda (ZPPtr1) beq .8 lda #S.MITEM clc adc Counter sta Counter bcc .2 inc Counter+1 .2 lda (ZPPtr1) cmp #S.MITEM.T.SEP bne .3 inc ZPPtr1 bne .1 inc ZPPtr1+1 bra .1 .3 cmp #S.MITEM.T.ITEM bne .4 lda #6 T+ID+KEMOD+KEY+pICON+"TEXT" bra .5 .4 lda #5 T+pMENU+pICON+"TEXT" .5 jsr SkipAPtr1 jsr SkipStrZPtr1 skip "TEXT\0" bra .1 .8 >LDYA Counter rts *-------------------------------------- * ZPPtr1 = defintion * ZPObjPtr = DstBuf *-------------------------------------- MENU.GetData lda #S.MENU.Items clc adc ZPObjPtr sta ZPObjPtr bcc .1 inc ZPObjPtr+1 .1 lda (ZPPtr1) sta (ZPObjPtr) beq .8 ldy #S.MITEM.S lda #0 sta (ZPObjPtr),y lda (ZPPtr1) cmp #S.MITEM.T.SEP bne .2 inc ZPPtr1 skip 1 byte bne .1 inc ZPPtr1+1 bra .5 *-------------------------------------- .2 cmp #S.MITEM.T.ITEM bne .3 ldy #1 T+ID+KEMOD+KEY+pICON+"text" lda (ZPPtr1),y ldy #S.MITEM.ID sta (ZPObjPtr),y ldy #2 lda (ZPPtr1),y tax iny lda (ZPPtr1),y ldy #S.MITEM.KEYMOD+1 sta (ZPObjPtr),y dey KEY txa sta (ZPObjPtr),y lda #4 bra .4 skip 4 bytes *-------------------------------------- .3 ldy #1 skip T+pMENU+pICON+"text" lda (ZPPtr1),y tax iny lda (ZPPtr1),y ldy #S.MITEM.pMENU+1 sta (ZPObjPtr),y dey txa sta (ZPObjPtr),y lda #3 skip 3 bytes .4 jsr SkipAPtr1 ldy #1 lda (ZPPtr1),y ldy #S.MITEM.pICON+1 sta (ZPObjPtr),y dey lda (ZPPtr1) sta (ZPObjPtr),y lda #2 skip pICON jsr SkipAPtr1 .5 ldy #S.MITEM.pTEXT lda ZPPtr1 sta (ZPObjPtr),y iny lda ZPPtr1+1 sta (ZPObjPtr),y jsr SkipStrZPtr1 skip "TEXT\0" .7 lda ZPObjPtr clc adc #S.MITEM sta ZPObjPtr bcc .1 inc ZPObjPtr+1 bra .1 .8 clc rts *-------------------------------------- MENU.SetMenuSizePos stz IY Icon Margin W stz IE Max Text W stz IE+1 stz INE Max Mod-Key W lda #2 2px Borders sta DY Menu H stz DY+1 jsr MENU.GetMItems .1 lda (ZPPtr1) beq .3 jsr MENU.GetMItemW jsr MENU.NextMItemDY bra .1 .3 lda #2+MENU.LMargin+MENU.RMargin 2px Borders+5 LMARGIN (Checked) +5 RMARGIN (SubMenu) clc adc IY Icon W sta DX stz DX+1 lda DX sec 1px sep adc IE Max Text W sta DX lda DX+1 adc IE+1 sta DX+1 lda DX sec 1px sep adc INE Max Mod-Key W sta DX bcc .4 inc DX+1 .4 ldy #S.OBJ.W sta (ZPMENUPtr),y iny lda DX+1 sta (ZPMENUPtr),y iny #S.OBJ.H lda DY sta (ZPMENUPtr),y iny lda DY+1 sta (ZPMENUPtr),y ldy #S.MENU.iW lda IY sta (ZPMENUPtr),y iny #S.MENU.tW lda IE sta (ZPMENUPtr),y iny lda IE+1 sta (ZPMENUPtr),y iny #S.MENU.kW lda INE sta (ZPMENUPtr),y iny lda INE+1 sta (ZPMENUPtr),y ldy #S.OBJ.Y1 lda DY clc adc (ZPMENUPtr),y tax iny lda DY+1 adc (ZPMENUPtr),y cpx WND.Screen+S.OBJ.H sbc WND.Screen+S.OBJ.H+1 bcc .5 ldy #S.OBJ.Y1 lda (ZPMENUPtr),y * sec sbc DY sta (ZPMENUPtr),y iny lda (ZPMENUPtr),y sbc DY+1 sta (ZPMENUPtr),y .5 >LDYA ZPMENUPtr jsr OBJ.SetX2Y2 rts *-------------------------------------- MENU.GetMItemW lda (ZPPtr1) cmp #S.MITEM.T.SEP beq .8 ldy #S.MITEM.pICON lda (ZPPtr1),y iny ora (ZPPtr1),y beq .1 lda #17 Reserve space for Icon W + 1px SEP sta IY .1 jsr MENU.GetText ldx hSYSFON jsr FON.GetTextSize ldx CB.Cache+S.CB.SrcW cpx IE lda CB.Cache+S.CB.SrcW+1 sbc IE+1 bcc .2 stx IE Set Max text W lda CB.Cache+S.CB.SrcW+1 sta IE+1 .2 jsr MENU.GetKeyString bcs .8 ldx hSYSFON jsr FON.GetTextSize lda CB.Cache+S.CB.SrcW cmp INE bcc .8 sta INE set Max Mod-key W .8 rts *-------------------------------------- * hMENU8, ItemID8, Prop8, Value16 *-------------------------------------- MENU.SetMItemProp ldy #4 hMENU lda (pStack),y >SYSCALL2 GetMemPtr >STYA ZPMENUPtr ldy #3 ID8 lda (pStack),y tax jsr MENU.FindMItemByID bcs .9 ldy #2 Prop8 lda (pStack),y tay >PULLA Value16 sta (ZPPtr1),y iny >PULLA sta (ZPPtr1),y * clc .8 >POP 3 .9 rts *-------------------------------------- MENU.FindMItemByID jsr MENU.GetMItems .1 lda (ZPPtr1) beq .9 cmp #S.MITEM.T.SEP beq .7 txa ldy #S.MITEM.ID cmp (ZPPtr1),y beq .8 .7 jsr MENU.NextMItem bra .1 .8 clc rts .9 sec rts *-------------------------------------- MENU.Enter jsr MENU.GetDXWIE X1,W,X2 jsr MENU.GetDY Y1 jsr MENU.GetMItems .1 lda (ZPPtr1) beq .4 lda (ZPPtr1) cmp #S.MITEM.T.SEP beq .2 lda DY Y1 sec adc SYSFON.H sta INE INE = Y2 lda DY+1 adc #0 sta INE+1 >LDYAI DX X1,X2,Y1,Y2 jsr MOU.InRectYA bcc .3 ldy #S.MITEM.S lda (ZPPtr1),y bpl .2 eor #S.MITEM.S.SELECTED sta (ZPPtr1),y jsr CB.GetBuf bcs .9 jsr MENU.DrawMItem .2 jsr MENU.NextMItemDY bra .1 .3 ldy #S.MITEM.S lda (ZPPtr1),y bmi .8 already selected, nothing to do eor #S.MITEM.S.SELECTED sta (ZPPtr1),y jsr CB.GetBuf bcs .9 jsr MENU.DrawMItem lda (ZPPtr1) cmp #S.MITEM.T.SUBMENU bne .1 >LDYA L.WND.Screen jsr DrawCBBufToYA * jsr MENU.NewSubMenu * bcs .9 bra .1 .4 >LDYA L.WND.Screen jmp DrawCBBufToYA lda MSG+S.MSG.S bit #S.MSG.S.CLK beq .8 lda #S.MSG.T.ID sta MSG+S.MSG.T ldy #S.MITEM.ID lda (ZPPtr1),y sta MSG+S.MSG.ID jmp MENU.DestroyAll .8 clc .9 rts *-------------------------------------- MENU.NewSubMenu lda DX clc adc Counter W sta DX lda DX+1 adc Counter+1 sta DX+1 ldy #S.MITEM.pMENU+1 lda (ZPPtr1),y >PUSHA dey lda (ZPPtr1),y >PUSHA >PUSHW DX X1 >PUSHW DY Y1 jsr MENU.New bcs .9 pha hMENU jsr MENU.Draw plx bcs .9 txa .9 rts *-------------------------------------- * DrawMenu(hMENU) *-------------------------------------- MENU.Draw >SYSCALL2 GetMemPtr >STYA ZPMENUPtr jsr MENU.Save bcs .9 jsr CB.GetBuf bcs .9 jsr MENU.DrawBorders jsr MENU.GetDXWIE jsr MENU.GetDY jsr MENU.GetMItems .6 lda (ZPPtr1) beq .8 jsr MENU.DrawMItem jsr MENU.NextMItemDY bra .6 .8 >LDYA L.WND.Screen jmp DrawCBBufToYA .9 rts *-------------------------------------- MENU.DrawBorders lda #S.CB.CMD.HLINE jsr CB.InitCacheA lda #S.CB.OP.SET sta CB.Cache+S.CB.OP lda #S.CB.M.MONO sta CB.Cache+S.CB.M lda PREFS.BORDERCOLOR sta CB.Cache+S.CB.COLOR ldy #S.OBJ.X2+1 ldx #5 .1 lda (ZPMENUPtr),y sta CB.Cache+S.CB.X1,x dey dex bpl .1 lda CB.Cache+S.CB.Y1 sta CB.Cache+S.CB.Y2 lda CB.Cache+S.CB.Y1+1 sta CB.Cache+S.CB.Y2+1 top X1,Y1,X2,Y1 jsr CB.Cache2CBBuf ldy #S.OBJ.Y2 lda (ZPMENUPtr),y sta CB.Cache+S.CB.Y1 sta CB.Cache+S.CB.Y2 iny lda (ZPMENUPtr),y sta CB.Cache+S.CB.Y1+1 sta CB.Cache+S.CB.Y2+1 bottom X1,Y2,X2,Y2 jsr CB.Cache2CBBuf lda #S.CB.CMD.VLINE sta CB.Cache+S.CB.CMD ldy #S.OBJ.Y1 lda (ZPMENUPtr),y sta CB.Cache+S.CB.Y1 iny lda (ZPMENUPtr),y sta CB.Cache+S.CB.Y1+1 lda CB.Cache+S.CB.X1 sta CB.Cache+S.CB.X2 lda CB.Cache+S.CB.X1+1 sta CB.Cache+S.CB.X2+1 left X1,Y1,X1,Y2 jsr CB.Cache2CBBuf ldy #S.OBJ.X2 lda (ZPMENUPtr),y sta CB.Cache+S.CB.X1 sta CB.Cache+S.CB.X2 iny lda (ZPMENUPtr),y sta CB.Cache+S.CB.X1+1 sta CB.Cache+S.CB.X2+1 right X2,Y1,X2,Y2 jmp CB.Cache2CBBuf *-------------------------------------- MENU.DrawMItem lda (ZPPtr1) cmp #S.MITEM.T.SEP bne MENU.DrawMItem1 lda #S.CB.CMD.HLINE jsr CB.InitCacheA lda #S.CB.OP.SET sta CB.Cache+S.CB.OP lda #S.CB.M.MONO sta CB.Cache+S.CB.M lda PREFS.BORDERCOLOR sta CB.Cache+S.CB.COLOR ldx #3 .1 lda DX,x sta CB.Cache+S.CB.X1,x dex bpl .1 lda DX clc adc Counter sta CB.Cache+S.CB.X2 lda DX+1 adc Counter+1 sta CB.Cache+S.CB.X2+1 jmp CB.Cache2CBBuf *-------------------------------------- MENU.DrawMItem1 lda #S.CB.CMD.FILLRECT jsr CB.InitCacheA lda #S.CB.OP.SET sta CB.Cache+S.CB.OP lda #S.CB.M.MONO sta CB.Cache+S.CB.M ldx PREFS.MENUCOLOR jsr MENU.IsSelected bcc .15 txa eor #C.WHITE tax .15 stx CB.Cache+S.CB.COLOR ldx #3 .10 lda DX,x sta CB.Cache+S.CB.X1,x dex bpl .10 lda DX clc adc Counter sta CB.Cache+S.CB.X2 lda DX+1 adc Counter+1 sta CB.Cache+S.CB.X2+1 lda DY sec adc SYSFON.H sta CB.Cache+S.CB.Y2 lda DY+1 adc #0 sta CB.Cache+S.CB.Y2+1 jsr CB.Cache2CBBuf inc DY bne .12 inc DY+1 .12 lda DX clc adc #MENU.LMargin TODO : Checked sta DX bcc .11 sta DX+1 .11 jsr MENU.GetIcon beq .2 jsr DRAW.yaBMAtDXDY .2 lda DX clc ldy #S.MENU.iW adc (ZPMENUPtr),y sta DX bcc .21 inc DX+1 .21 jsr MENU.GetText jsr MENU.IsSelected ldx hSYSFON jsr DRAW.YATextAtDXDY lda DX sec ldy #S.MENU.tW adc (ZPMENUPtr),y sta DX lda DX+1 iny adc (ZPMENUPtr),y sta DX+1 jsr MENU.GetKeyString bcs .3 jsr MENU.IsSelected ldx hSYSFON jsr DRAW.YATextAtDXDY .3 lda (ZPPtr1) cmp #S.MITEM.T.SUBMENU bne .8 lda DX sec ldy #S.MENU.kW adc (ZPMENUPtr),y sta DX lda DX+1 iny adc (ZPMENUPtr),y sta DX+1 ldx #BM.ID.RIGHT jsr DRAW.xBMAtDXDY .8 lda DY bne .80 dec DY+1 .80 dec DY clc rts *-------------------------------------- MENU.GetIcon ldy #S.MITEM.pICON+1 lda (ZPPtr1),y bne .1 dey lda (ZPPtr1),y beq .8 tax ldy L.BMs,x lda L.BMs+1,x NON ZERO .8 rts .1 pha dey lda (ZPPtr1),y tay pla NON ZERO rts *-------------------------------------- MENU.IsSelected phy pha ldy #S.MITEM.S lda (ZPPtr1),y asl .9 pla ply rts *-------------------------------------- MENU.GetText ldy #S.MITEM.pTEXT lda (ZPPtr1),y pha iny lda (ZPPtr1),y ply rts *-------------------------------------- * ZPPtr1 = pMITEM *-------------------------------------- MENU.GetKeyString ldy #S.MITEM.KEY lda (ZPPtr1),y dey S.MITEM.KEYMOD ora (ZPPtr1),y beq .9 ldx #0 lda (ZPPtr1),y beq .3 bit #KEYMOD.CTRL beq .1 ldy #KEYMOD.S.CTRL jsr .4 .1 bit #KEYMOD.OA beq .2 ldy #KEYMOD.S.OA jsr .4 .2 bit #KEYMOD.CA beq .3 ldy #KEYMOD.S.CA jsr .4 .3 ldy #S.MITEM.KEY lda (ZPPtr1),y sta TEXTBUF,x stz TEXTBUF+1,x >LDYA L.TEXTBUF clc rts *-------------------------------------- .4 pha .5 lda KEYMOD.S,y sta TEXTBUF,x beq .6 inx iny bra .5 .6 pla rts .9 sec rts *-------------------------------------- MENU.Save lda #S.CB.CMD.GETRECTBUFSIZE jsr CB.InitCacheA ldy #S.OBJ.X1 ldx #0 .1 lda (ZPMENUPtr),y sta CB.Cache+S.CB.X1,x iny inx cpx #8 X1,Y1,X2,Y2 bne .1 jsr CB.GFXWrite >SYSCALL2 NewStkObj bcs .9 stx CB.Cache+S.CB.DstPtr txa ldy #S.MENU.hSAVEBUF sta (ZPMENUPtr),y lda #S.CB.CMD.BITBLT sta CB.Cache+S.CB.CMD lda #S.CB.OP.SAVE sta CB.Cache+S.CB.OP ldy #S.OBJ.W ldx #0 .2 lda (ZPMENUPtr),y sta CB.Cache+S.CB.SrcW,x iny inx cpx #4 W,H bne .2 jsr CB.GFXWrite clc .9 rts *-------------------------------------- MENU.DestroyAll sec .HS 90 BCC MENU.Destroy clc ldx MENU.Stack.Cnt beq .8 php bit PTR.bVisible bpl .1 jsr PTR.Hide.I .1 jsr CB.ClearCache lda #S.CB.CMD.BITBLT jsr CB.InitCacheA lda #S.CB.OP.RESTORE sta CB.Cache+S.CB.OP plp .2 php ldx MENU.Stack.Cnt lda MENU.Stack-1,x >SYSCALL2 GetMemPtr >STYA ZPMENUPtr ldy #S.OBJ.X1 ldx #0 .3 lda (ZPMENUPtr),y sta CB.Cache+S.CB.X1,x iny inx cpx #8 X1,Y1,X2,Y2 bne .3 ldy #S.OBJ.W ldx #0 .4 lda (ZPMENUPtr),y sta CB.Cache+S.CB.SrcW,x iny inx cpx #4 W,H bne .4 ldy #S.MENU.hSAVEBUF lda (ZPMENUPtr),y sta CB.Cache+S.CB.DstPtr jsr CB.GFXWrite lda CB.Cache+S.CB.DstPtr >SYSCALL2 FreeStkObj ldx MENU.Stack.Cnt lda MENU.Stack-1,x >SYSCALL2 FreeMem plp dec MENU.Stack.Cnt bcc .7 bne .2 .7 bit PTR.bVisible bpl .8 jmp PTR.Show.I .8 clc rts *-------------------------------------- MENU.GetDXWIE ldy #S.OBJ.X1 lda (ZPMENUPtr),y clc adc #1 sta DX iny lda (ZPMENUPtr),y adc #0 sta DX+1 ldy #S.OBJ.W lda (ZPMENUPtr),y sec sbc #3 2Px border + correction from W sta Counter iny lda (ZPMENUPtr),y sbc #0 sta Counter+1 lda Counter W clc adc DX sta IE IE = X2 lda Counter+1 adc DX+1 sta IE+1 rts *-------------------------------------- MENU.GetDY ldy #S.OBJ.Y1 lda (ZPMENUPtr),y clc adc #1 sta DY iny lda (ZPMENUPtr),y adc #0 sta DY+1 rts *-------------------------------------- MENU.FindSelected >LDYA ZPPtr1 >STYA D jsr MENU.GetMItems .1 lda (ZPPtr1) beq .9 cmp #S.MITEM.T.SEP beq .2 ldy #S.MITEM.S lda (ZPPtr1),y bmi .8 .2 jsr MENU.NextMItem bra .1 .8 clc rts .9 >LDYA D >STYA ZPPtr1 sec rts *-------------------------------------- MENU.GetMItems lda ZPMENUPtr clc adc #S.MENU.Items sta ZPPtr1 lda ZPMENUPtr+1 adc /S.MENU.Items sta ZPPtr1+1 rts *-------------------------------------- MENU.NextMItemDY lda (ZPPtr1) sec eor #S.MITEM.T.SEP beq .1 lda SYSFON.Hp2 clc .1 adc DY sta DY bcc MENU.NextMItem inc DY+1 MENU.NextMItem lda #S.MITEM jmp SkipAPtr1 *-------------------------------------- MAN SAVE usr/src/lib/libgui.s.menu LOAD usr/src/lib/libgui.s ASM