NEW AUTO 3,1 *-------------------------------------- MENU.MBarInit >STYA ZPMENUPtr >STYA ZPPtr1 ldy #S.MBAR.S lda (ZPPtr1),y bmi .80 stz DX stz DX+1 .1 lda (ZPPtr1) beq .8 lda #S.MBAR.TEXT clc adc ZPPtr1 tay lda ZPPtr1+1 adc #0 ldx hSYSFONB jsr FON.GetTextSize ldy #S.MBAR.X1 lda DX sta (ZPPtr1),y iny lda DX+1 sta (ZPPtr1),y iny #S.MBAR.XT lda DX clc adc PREFS.MBARXMARGIN sta DX sta (ZPPtr1),y iny lda DX+1 adc #0 sta DX+1 sta (ZPPtr1),y lda DX clc adc CB.CACHE+S.CB.SrcW sta DX lda DX+1 adc CB.CACHE+S.CB.SrcW+1 sta DX+1 iny #S.MBAR.X2 lda DX clc adc PREFS.MBARXMARGIN sta DX sta (ZPPtr1),y iny lda DX+1 adc #0 sta DX+1 sta (ZPPtr1),y lda (ZPPtr1) clc adc ZPPtr1 sta ZPPtr1 bcc .1 inc ZPPtr1+1 bra .1 .8 lda #$80 ldy #S.MBAR.S sta (ZPMENUPtr),y .80 clc rts *-------------------------------------- * MENU.New(int X, int Y, *MITEM mitems) *-------------------------------------- MENU.New >LDYAI S.MENU >SYSCALL2 getmem bcs .9 >STYA ZPMENUPtr lda #S.OBJ.T.MENU sta (ZPMENUPtr) S.OBJ.T lda #0 ldy #S.MENU-1 .1 sta (ZPMENUPtr),y dey bne .1 >PULLA ldy #S.MENU.MITEMS sta (ZPMENUPtr),y >PULLA iny sta (ZPMENUPtr),y >PULLA ldy #S.OBJ.Y1 sta (ZPMENUPtr),y >PULLA iny sta (ZPMENUPtr),y >PULLA ldy #S.OBJ.X1 sta (ZPMENUPtr),y >PULLA iny sta (ZPMENUPtr),y txa hMenu * clc rts .9 >POP 6 MENU.New.RTS rts *-------------------------------------- * ---------------------------------------------- * |Icon ChkMrk "Menu Item" KEYMOD1-KEYMOD2-KEY>| * ---------------------------------------------- MENU.Show >SYSCALL2 GetMemPtr >STYA ZPMENUPtr jsr GetCBBuf bcs MENU.New.RTS ldy #S.MENU.MITEMS lda (ZPMENUPtr),y sta ZPPtr1 iny lda (ZPMENUPtr),y sta ZPPtr1+1 stz DX stz DX+1 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 .1 lda (ZPPtr1) beq .3 jsr MENU.Show.GetW lda DY clc adc SYSFON.H sta DY bcc .2 inc DY+1 .2 lda (ZPPtr1) clc adc ZPPtr1 sta ZPPtr1 bcc .1 inc ZPPtr1+1 bra .1 .3 lda #12 2px Borders+5 LMARGIN (Checked) +5 RMARGIN (SubMenu) clc adc IY sta DX bcc .30 inc DX+1 .30 lda DX sec 1px sep adc IE Text W sta DX lda DX+1 adc IE+1 sta DX+1 lda DX sec 1px sep adc INE 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 tax iny lda DY+1 sta (ZPMENUPtr),y pha txa ldy #S.OBJ.Y1 clc adc (ZPMENUPtr),y tax pla iny 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 jsr MENU.Show.Borders ldy #S.MENU.MITEMS lda (ZPMENUPtr),y sta ZPPtr1 iny lda (ZPMENUPtr),y sta ZPPtr1+1 ldy #S.OBJ.Y1 lda (ZPMENUPtr),y clc adc #1 sta DY iny lda (ZPMENUPtr),y adc #0 sta DY+1 .6 lda (ZPPtr1) beq .8 jsr MENU.Show.Item lda DY clc adc SYSFON.H sta DY bcc .7 inc DY+1 .7 lda (ZPPtr1) clc adc ZPPtr1 sta ZPPtr1 bcc .6 inc ZPPtr1+1 bra .6 .8 >LDYA L.WND.Screen jmp DrawCBPtrToYA1 MENU.Show.RTS rts *-------------------------------------- MENU.Show.GetW ldy #S.MITEM.F lda (ZPPtr1),y cmp #S.MITEM.F.SEP beq MENU.Show.RTS 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 >LDYA L.KEYSTRING ldx hSYSFON jsr FON.GetTextSize lda CB.Cache+S.CB.SrcW cmp INE bcc .8 sta INE set Max Mod-key W .8 rts *-------------------------------------- MENU.Show.Borders lda #S.CB.CMD.FILLRECT jsr PutA2CBBuf lda #S.CB.OP.SET jsr PutA2CBBuf lda #S.CB.M.MONO jsr PutA2CBBuf lda PREFS.MENUCOLOR jsr PutA2CBBuf ldy #S.OBJ.X1 jsr MENU.Show.Borders.Y ldy #S.OBJ.Y1 jsr MENU.Show.Borders.Y ldy #S.OBJ.X2 jsr MENU.Show.Borders.Y ldy #S.OBJ.Y2 jsr MENU.Show.Borders.Y lda #S.CB.CMD.HLINE TOP jsr MENU.Show.Borders.H ldy #S.OBJ.X1 jsr MENU.Show.Borders.Y ldy #S.OBJ.Y1 jsr MENU.Show.Borders.Y ldy #S.OBJ.X2 jsr MENU.Show.Borders.Y ldy #S.OBJ.Y1 jsr MENU.Show.Borders.Y lda #S.CB.CMD.VLINE LEFT jsr MENU.Show.Borders.H ldy #S.OBJ.X1 jsr MENU.Show.Borders.Y ldy #S.OBJ.Y1 jsr MENU.Show.Borders.Y ldy #S.OBJ.X1 jsr MENU.Show.Borders.Y ldy #S.OBJ.Y2 jsr MENU.Show.Borders.Y lda #S.CB.CMD.VLINE RIGHT jsr MENU.Show.Borders.H ldy #S.OBJ.X2 jsr MENU.Show.Borders.Y ldy #S.OBJ.Y1 jsr MENU.Show.Borders.Y ldy #S.OBJ.X2 jsr MENU.Show.Borders.Y ldy #S.OBJ.Y2 jsr MENU.Show.Borders.Y lda #S.CB.CMD.HLINE BOTTOM jsr MENU.Show.Borders.H ldy #S.OBJ.X1 jsr MENU.Show.Borders.Y ldy #S.OBJ.Y2 jsr MENU.Show.Borders.Y ldy #S.OBJ.X2 jsr MENU.Show.Borders.Y ldy #S.OBJ.Y2 jmp MENU.Show.Borders.Y MENU.Show.Borders.H jsr PutA2CBBuf lda #S.CB.OP.SET jsr PutA2CBBuf lda #S.CB.M.MONO jsr PutA2CBBuf lda PREFS.BORDERCOLOR jmp PutA2CBBuf MENU.Show.Borders.Y lda (ZPMENUPtr),y jsr PutA2CBBuf iny lda (ZPMENUPtr),y jmp PutA2CBBuf *-------------------------------------- MENU.Show.Item ldy #S.MITEM.F lda (ZPPtr1),y cmp #S.MITEM.F.SEP bne .1 lda #S.CB.CMD.HLINE jsr PutA2CBBuf lda #S.CB.OP.SET jsr PutA2CBBuf lda #S.CB.M.MONO jsr PutA2CBBuf lda PREFS.BORDERCOLOR jsr PutA2CBBuf ldy #S.OBJ.X1 jsr MENU.Show.Borders.Y lda SYSFON.H lsr clc adc DY jsr PutA2CBBuf lda DY+1 adc #0 jsr PutA2CBBuf ldy #S.OBJ.X2 jsr MENU.Show.Borders.Y ldy #S.OBJ.Y1 jmp MENU.Show.Borders.Y *-------------------------------------- .1 ldy #S.OBJ.X1 lda (ZPMENUPtr),y sec +1px Border adc #5 TODO : Checked sta DX iny lda (ZPMENUPtr),y adc #0 sta DX+1 jsr MENU.GetIcon beq .2 jsr DRAW.YABMAtDXDY .2 lda DX clc adc IY Icon reserved W sta DX lda DX+1 adc #0 sta DX+1 jsr MENU.GetText ldx hSYSFON jsr DRAW.YATextAtDXDY jsr MENU.GetKeyString beq .3 lda DX sec adc IE sta DX lda DX+1 adc IE+1 sta DX+1 >LDYA L.KEYSTRING ldx hSYSFON jsr DRAW.YATextAtDXDY .3 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.GetText lda #S.MITEM.TEXT clc adc ZPPtr1 tay lda ZPPtr1+1 adc #0 rts *-------------------------------------- MENU.GetKeyString ldx #0 ldy #S.MITEM.KEYMOD lda (ZPPtr1),y beq .6 bit #S.MITEM.KEYMOD.CTRL beq .4 .3 lda KEY.Ctrl,x sta KEYSTRING,x inx cpx #6 bne .3 lda (ZPPtr1),y .4 bit #S.MITEM.KEYMOD.OA beq .5 lda #1 sta KEYSTRING,x inx lda #'-' sta KEYSTRING,x inx lda (ZPPtr1),y .5 bit #S.MITEM.KEYMOD.CA beq .6 lda #2 sta KEYSTRING,x inx lda #'-' sta KEYSTRING,x inx .6 iny lda (ZPPtr1),y beq .7 sta KEYSTRING,x inx .7 stz KEYSTRING,x txa rts *-------------------------------------- MENU.Destroy clc rts *-------------------------------------- MAN SAVE usr/src/lib/libgui.s.menu LOAD usr/src/lib/libgui.s ASM