NEW AUTO 3,1 *-------------------------------------- * NewMenu(pMENU, x, y) *-------------------------------------- MENU.New >PULLW DY >PULLW DX >PULLYA MENU.New.I >STYA ZPPtr1 MENU definition >STYA ZPObjPtr for pass #2 ldx MENU.Stack.Cnt cpx #MENU.MAX beq .90 jsr MENU.GetSize >SYSCALL2 GetMem bcs .99 >STYA ZPMENUPtr txa hMenu ldx MENU.Stack.Cnt sta MENU.Stack,x lda #S.OBJ.T.MENU sta (ZPMENUPtr) S.OBJ.T lda #0 ldy #S.MENU.Items-1 .1 sta (ZPMENUPtr),y dey bne .1 ldx #3 ldy #S.OBJ.X1+3 .2 lda DX,x sta (ZPMENUPtr),y dey dex bpl .2 >LDYA ZPObjPtr >STYA ZPPtr1 MENU definition jsr MENU.GetData ldx MENU.Stack.Cnt lda MENU.Stack,x >SYSCALL2 GetMemPtr >STYA ZPMENUPtr 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 * ZPMENUPtr = DstBuf *-------------------------------------- MENU.GetData lda ZPMENUPtr clc adc #S.MENU.Items sta ZPMENUPtr bcc .1 inc ZPMENUPtr+1 .1 lda (ZPPtr1) sta (ZPMENUPtr) beq .8 cmp #S.MITEM.T.SEP bne .2 inc ZPPtr1 skip 1 byte bne .5 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 (ZPMENUPtr),y ldy #2 lda (ZPPtr1),y tax iny lda (ZPPtr1),y ldy #S.MITEM.KEYMOD+1 sta (ZPMENUPtr),y dey KEY txa sta (ZPMENUPtr),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 (ZPMENUPtr),y dey txa sta (ZPMENUPtr),y lda #3 skip 3 bytes .4 jsr SkipAPtr1 ldy #1 lda (ZPPtr1),y ldy #S.MITEM.pICON+1 sta (ZPMENUPtr),y dey lda (ZPPtr1) sta (ZPMENUPtr),y lda #2 skip pICON jsr SkipAPtr1 ldy #S.MITEM.pTEXT lda ZPPtr1 sta (ZPMENUPtr),y iny lda ZPPtr1+1 sta (ZPMENUPtr),y jsr SkipStrZPtr1 skip "TEXT\0" ldy #S.MITEM.S lda #0 sta (ZPMENUPtr),y .5 lda ZPMENUPtr clc adc #S.MITEM sta ZPMENUPtr bcc .1 inc ZPMENUPtr+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 stz INE+1 lda #2 2px Borders sta DY Menu H stz DY+1 jsr MENU.GetMItems .1 lda (ZPPtr1) beq .3 cmp #S.MITEM.T.SEP beq .2 jsr MENU.GetMItemW .2 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 ldy #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 jmp OBJ.SetX2Y2 *-------------------------------------- MENU.GetMItemW 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 beq .8 ldx hSYSFON jsr FON.GetTextSize ldx CB.Cache+S.CB.SrcW cmp INE lda CB.Cache+S.CB.SrcW+1 sbc INE+1 bcc .8 stx INE set Max Mod-key W lda CB.Cache+S.CB.SrcW+1 sta INE+1 .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.GetDXDY stz D stz D+1 ldy #S.OBJ.X2 lda DX X1 clc adc (ZPMENUPtr),y sta IE IE = X2 iny lda DX+1 adc (ZPMENUPtr),y sta IE+1 jsr MENU.GetMItems .1 lda (ZPPtr1) beq .4 cmp #S.MITEM.T.SEP beq .2 lda DY Y1 clc adc SYSFON.Hp2 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 was selected before... jsr MENU.DrawMItemBuf bcs .9 .2 jsr MENU.NextMItemDY bra .1 *-------------------------------------- .3 ldy #S.MITEM.S lda (ZPPtr1),y bmi .5 already selected, nothing to do eor #S.MITEM.S.SELECTED sta (ZPPtr1),y jsr MENU.DrawMItemBuf bcs .9 .30 ldx MENU.Stack.Idx inx cpx MENU.Stack.Cnt beq .31 jsr MENU.Destroy bra .30 .31 lda (ZPPtr1) cmp #S.MITEM.T.SUBMENU bne .2 ldy #S.MITEM.pMENU lda (ZPPtr1),y sta D iny lda (ZPPtr1),y sta D+1 lda DY sta Counter lda DY+1 sta Counter+1 bra .2 *-------------------------------------- .8 clc .9 rts *-------------------------------------- .4 >LDYA L.WND.Screen jsr CB.FlushBufToYA lda D ora D+1 beq .5 >PUSHW D pMENU ldy #S.OBJ.X2+1 lda (ZPMENUPtr),y >PUSHA dey lda (ZPMENUPtr),y >PUSHA >PUSHW Counter jsr MENU.New bcs .9 jmp MENU.Draw *-------------------------------------- .5 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 *-------------------------------------- * DrawMenu(hMENU) *-------------------------------------- MENU.Draw >SYSCALL2 GetMemPtr >STYA ZPMENUPtr jsr MENU.Save bcs .9 jsr CB.GetBuf bcs .9 >LDYA ZPMENUPtr ldx #0 jsr OBJ.DrawBorders jsr MENU.GetDXDY jsr MENU.GetMItems .1 lda (ZPPtr1) beq .8 jsr MENU.DrawMItem jsr MENU.NextMItemDY bra .1 .8 >LDYA L.WND.Screen jmp CB.FlushBufToYA .9 rts *-------------------------------------- MENU.DrawMItemBuf jsr CB.GetBuf bcs .9 jsr MENU.DrawMItem bcs .9 >LDYA L.WND.Screen jmp CB.FlushBufToYA .9 rts *-------------------------------------- MENU.DrawMItem jsr MENU.ResetX1Y1X2 lda (ZPPtr1) cmp #S.MITEM.T.SEP bne MENU.DrawMItem1 jsr CB.BorderLineH jmp CB.Cache2CBBuf *-------------------------------------- MENU.DrawMItem1 jsr MENU.IsSelected lda PREFS.MenuColor bcc .15 eor #$ff .15 jsr CB.FillRectMonoA lda CB.Cache+S.CB.Y1 sec adc SYSFON.H sta CB.Cache+S.CB.Y2 lda CB.Cache+S.CB.Y1+1 adc #0 sta CB.Cache+S.CB.Y2+1 jsr CB.Cache2CBBuf *-------------------------------------- inc CB.Cache+S.CB.Y1 Y1:1px margin bne .12 inc CB.Cache+S.CB.Y1+1 .12 lda CB.Cache+S.CB.X1 clc adc #MENU.LMargin TODO : Checked sta CB.Cache+S.CB.X1 bcc .11 inc CB.Cache+S.CB.X1+1 .11 jsr MENU.GetIcon beq .2 jsr DRAW.yaBM .2 lda CB.Cache+S.CB.X1 clc ldy #S.MENU.iW adc (ZPMENUPtr),y sta CB.Cache+S.CB.X1 bcc .21 inc CB.Cache+S.CB.X1+1 .21 jsr MENU.IsSelected jsr MENU.GetText ldx hSYSFON jsr DRAW.YAText lda CB.Cache+S.CB.X1 sec ldy #S.MENU.tW adc (ZPMENUPtr),y sta CB.Cache+S.CB.X1 lda CB.Cache+S.CB.X1+1 iny adc (ZPMENUPtr),y sta CB.Cache+S.CB.X1+1 lda (ZPPtr1) cmp #S.MITEM.T.ITEM bne .3 jsr MENU.IsSelected jsr MENU.GetKeyString C untouched beq .3 ldx hSYSFON jsr DRAW.YAText .3 lda (ZPPtr1) cmp #S.MITEM.T.SUBMENU bne .8 lda CB.Cache+S.CB.X1 sec ldy #S.MENU.kW adc (ZPMENUPtr),y sta CB.Cache+S.CB.X1 lda CB.Cache+S.CB.X1+1 iny adc (ZPMENUPtr),y sta CB.Cache+S.CB.X1+1 ldx #BM.ID.RIGHT jmp DRAW.xBM .8 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 ldy #S.MITEM.S lda (ZPPtr1),y asl 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 NZ rts *-------------------------------------- .4 pha .5 lda KEYMOD.S,y sta TEXTBUF,x beq .6 inx iny bra .5 .6 pla .9 rts *-------------------------------------- MENU.Save jsr PTR.Disable 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 jmp PTR.Enable .9 rts *-------------------------------------- MENU.GetDXDY ldy #S.OBJ.X1 lda (ZPMENUPtr),y clc adc #1 sta DX iny lda (ZPMENUPtr),y adc #0 sta DX+1 ldy #S.OBJ.Y1 lda (ZPMENUPtr),y clc adc #1 sta DY iny lda (ZPMENUPtr),y adc #0 sta DY+1 rts *-------------------------------------- MENU.ResetX1Y1X2 ldy #S.OBJ.X1 lda (ZPMENUPtr),y clc adc #1 sta CB.Cache+S.CB.X1 iny lda (ZPMENUPtr),y adc #0 sta CB.Cache+S.CB.X1+1 lda DY sta CB.Cache+S.CB.Y1 lda DY+1 sta CB.Cache+S.CB.Y1+1 ldy #S.OBJ.X2 lda (ZPMENUPtr),y sec sbc #1 sta CB.Cache+S.CB.X2 iny lda (ZPMENUPtr),y sbc #0 sta CB.Cache+S.CB.X2+1 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 *-------------------------------------- MENU.DestroyAll sec .HS 90 BCC MENU.Destroy clc ldx MENU.Stack.Cnt beq .8 php jsr PTR.Disable 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 ZPObjPtr ldy #S.OBJ.X1 ldx #0 .3 lda (ZPObjPtr),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 (ZPObjPtr),y sta CB.Cache+S.CB.SrcW,x iny inx cpx #4 W,H bne .4 ldy #S.MENU.hSAVEBUF lda (ZPObjPtr),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 Destroy all ? dec MENU.Stack.Cnt bcc .7 no bne .2 .7 jmp PTR.Enable .8 clc rts *-------------------------------------- MAN SAVE usr/src/lib/libgui.s.menu LOAD usr/src/lib/libgui.s ASM