From 25e24282b373d3d27610ecb06e6f1384e367693a Mon Sep 17 00:00:00 2001 From: Quinn Dunki Date: Fri, 5 Sep 2014 20:32:16 -0700 Subject: [PATCH] - Added view selection and focus states - Added some API for focus selection - Fixed a bug in selected view table lookup - View creation now selects new view - Refactored and fixed bugs in checkbox rendering - Checkboxes can now be toggled - Basic API for view actions - Convenience routine for painting all views --- gui.s | 99 ++++++++++++++++++++++++------ guidemo.dsk | Bin 143360 -> 143360 bytes macros.s | 20 +++--- memory.s | 4 ++ views.s | 173 +++++++++++++++++++++++++++++++++++++++++++++------- 5 files changed, 245 insertions(+), 51 deletions(-) diff --git a/gui.s b/gui.s index 1c54f59..a015bde 100644 --- a/gui.s +++ b/gui.s @@ -19,7 +19,8 @@ ; Main main: - jsr begin80cols + jsr WGInit + jsr WG80 ;jmp tortureTestPrint ;jmp tortureTestRects @@ -29,18 +30,39 @@ main: sta PARAM0 lda #>testView sta PARAM1 + jsr WGCreateView + + lda #testCheck + sta PARAM1 + jsr WGCreateCheckbox + + lda #testButton1 + sta PARAM1 jsr WGCreateButton - lda #0 - jsr WGSelectView - - lda #testTitle + lda #>testTitle1 sta PARAM1 jsr WGViewSetTitle - - jsr WGPaintView + + lda #testButton2 + sta PARAM1 + jsr WGCreateButton + + lda #testTitle2 + sta PARAM1 + jsr WGViewSetTitle + + jsr WGViewPaintAll ; ldx #5 ; ldy #0 @@ -103,18 +125,50 @@ main: ; jmp tortureTestRects -loop: -; lda #'Q' + $80 -; jsr COUT - jmp loop +keyLoop: + lda KBD + bpl keyLoop + sta KBDSTRB + + and #%01111111 + cmp #9 + beq keyLoop_focusNext + cmp #13 + beq keyLoop_toggle + cmp #32 + beq keyLoop_toggle + + jmp keyLoop + +keyLoop_focusNext: + jsr WGViewFocusNext + jmp keyLoop + +keyLoop_toggle: + jsr WGViewFocusAction + jmp keyLoop + rts ; This seems to work for returning to BASIC.SYSTEM, but I don't think it's right ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; begin80cols +; WGInit +; Initialization. Should be called once at app startup +WGInit: + pha + + lda #0 + sta WG_FOCUSVIEW + + pla + rts + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; WG80 ; Enables 80 column mode (and enhanced video firmware) -begin80cols: +WG80: lda #$a0 jsr $c300 SETSWITCH TEXTON @@ -158,16 +212,25 @@ read80ColSwitch_40: testView: -; .byte "0007033e13207e" ; 0, 7,3,62,19,126,126 -; .byte "00230a" - .byte "00230a0f" + .byte "0007033e133e7e" ; 0, 7,3,62,19,62,126 + +testCheck: + .byte "011004" + +testButton1: + .byte "02230a0f" + +testButton2: + .byte "03230d0f" testStr: ; .byte "This is a test of the emergency broadcast system.",0; If this had been a real emergency, you would be dead now.",0 ; 107 chars .byte "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ !",34,"#$%&'()*+,-./0123456789:;<=>?`abcdefghijklmno",0 testStr2: .byte "pqrstuvwxyz{|}~",$ff,0 -testTitle: +testTitle1: .byte "Okay",0 +testTitle2: + .byte "Cancel",0 diff --git a/guidemo.dsk b/guidemo.dsk index f6a4ab77cdda456ae7382c35ac38cf9613a7faa6..c9d5fbd5ac0a826723d29b9b88e21079b1f3737c 100644 GIT binary patch delta 2152 zcmZ`)Z){Ul6u+-!{Wt118QPXXuEv>FMZ2wLOYPQw>)va33QL%NApR-QnP+4qnwSU% z`Ur`c$YZbvX47q1=9j+dgOPoZk<9Fqv@=U4ejp)AAjDVwfpw@-u1QP_>MBC^pB1P>z>S6Cz*9yKsYjH!hL0!*0si9&?d zMd{_R@xb+@hz&kWD&pC((KGE&m?Y=&GP)-=Jj|OR(WZow_@X7|Pb@F1(hKe--#T{n z>+~kC#u%-AjMn=x_FN9bZwUnaAp!f7EOE~YYOSD}*n^_dcs7`MB!nY+2x@bc;U)bD zcH&`CYUACdj+9a}{&AGG?9ONO#nhPg#7l>Igy;sn}fCgy6nmEn_{UC9uqR%+8 zqP~(VuL#G5F=2)rr~ZoTLIR2w`bKX-x{a8#Vj3-~U>A5misUE^4-e~`_ZWeozVmJm z$h|OJGKp18;(B};MhihwsXw8j5Ek#z=F=m-5`e;C&sBF23ZUJ z;LVKpgBAfJjI{`x>qH_Ot2O$kV6398T|!$7mNCw_DO>hI-h=^~i(8}yG)r&~L+ZvE z#&(%Y%|gZpK(mtZJ&YVA`eZkp2*JaAyR`1=JO_cfQ~GTzjj7YzM9@4$SQucOEbL*F z(7H%c_7IFa*?HGPaEj4)19l2(1k^Gd5$S`$~Nr5fstt8|9k@sK$ug02N&ts4r^ z&tpY@pMaAda;_U5T|J;Qj6JopRB4!qKq(=CQbs%;qe=;jEIK_%^B?@!9wJ3hz-H^o*D@qD!e2U2{SUj(1QDDmbW3C}S zRhHf?LHwcV5Sh8nxEw7bU^QxOBp)jFU$7Ln*(EH%oKba@HaO2ypU`1h(Ared(JL?&GRE~s2^vX^KgkLxCv6~CZ}8APeq=1l8azUwkb;^jt3X#m5~>fz(}*wJlSY!jw-KA_Pd*- gxW9C*be&=`pR*GEN}cDXHX4p?od0g)JjY4@0C=h*8~^|S delta 1831 zcma)7T}&HC5Z=E0r@pVDxE#sP(v$qbw9g1 zGvCa7Gkd2zvntQ5i@9co3FnzVx8@fVA@n=)l)qk3M5gmE7F$ti0ir9q&C^MEBmZd6 zsna~S!fW$t4$?%`g19dmG{pVXs2!m@m+8)*joe=iqJt;*Zb|IdeDw>i`o($AQVw^I z&x4`bQIsx7?r@oPR8$>kc|as@51;wQWMXD-A3AK)EvP*gU6@~A-W7X?ubSpu|uy7TA5W@b+(mEjy99n!>UmdJJKY<(8>iZU(ihSf=tP+v5U3@&xKuF8=t(y zA~#hO=bFg5hk=tcw~m+Z6{w^6v|22~FI^z}v(fEQO?b z$#dU_zv{#uAt2~o*!dbIo{o@B_hDJaQ95ieQN1`*A!^e*Gc`IWr00VSAb(!SfRH9+ z%uNde`^0%6$q+}=;sbFQ;)sl!c38C=4-E|&!Sp5rgZ=8wUaa=xp_EF`u1cQ~%^Q>! z#I*{XU(h6jzYP{G7I4jVTVA~7!*LN2f8az_M)Cl50d%9r+hV*~R<))lxoCEVOYkHX zICW;fUCIoKM6FXcYTBY~yyPw63rJG!!WvS2SnZ^=BuilkGD+5RNXrEKQKpld7>))7 z&q0v^44xu`)KTOH20ze%x*e^W5;?2pM7dHC`3xscP-QQs${iRsoXT33RSuLQ2Q{U@zz_5+ZjE7k8)&F3h_@2Ryl}H(3NzBYb#30>^|TsD)do*JhM# z?n%AI&7%E8|8@zQ_ParRpGA*-kbY3cae8x8{N77ai8*M;a3ZGoWIN7h$m1H5w$n^> zwukd?GteMRu+;zGcq#NGtY-dSkb6$k#HA`2@L}cSfUR8?L%J+NeU%U4l*D@cc;pW_ zP_b^jcnHMZIHY%D5Ce63C0eaXG%w{ON^=#cM>N@&R9hAkT&x!-3YF)XegL8$$Dohn zp{-6#J@nzkFTct-@v~7DvA7=aeq8m8WI6qc$ysys0B{t52{ZZTyHmW7;#qRT5Hi`$ zTuGFjX|a~HOr1P_u1>wWqFWKmxVr`xHhyH63{OyR15q?!|6f zy92>@Ttn?nl-zPMYX$1Hl^Fz0_rM_rC}wIwo=+aW27L#;mT@TNi0*}gi>R$p!;IRe$LJlR=b80BxhgvX5l diff --git a/macros.s b/macros.s index 3600c34..9097464 100644 --- a/macros.s +++ b/macros.s @@ -106,11 +106,6 @@ .macro LDY_ACTIVEVIEW lda WG_ACTIVEVIEW ; Find our new view record - and #%00001111 - asl - asl - asl - asl asl asl asl @@ -121,11 +116,6 @@ .macro LDX_ACTIVEVIEW lda WG_ACTIVEVIEW ; Find our new view record - and #%00001111 - asl - asl - asl - asl asl asl asl @@ -134,6 +124,16 @@ .endmacro +.macro LDY_FOCUSVIEW + lda WG_FOCUSVIEW ; Find our new view record + asl + asl + asl + asl ; Records are 16 bytes wide + tay +.endmacro + + .macro VBL_SYNC ; Synchronize with vertical blanking lda #$80 macroWaitVBLToFinish: diff --git a/memory.s b/memory.s index 2255164..838d437 100644 --- a/memory.s +++ b/memory.s @@ -39,6 +39,7 @@ VIEW_STYLE_BUTTON = $03 COUT = $fded BASCALC = $fbc1 PRBYTE = $fdda +RDKEY = $fd0c ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -57,6 +58,9 @@ WG_LOCALCURSORY: WG_ACTIVEVIEW: .byte 0 +WG_FOCUSVIEW: +.byte 0 + WG_VIEWCLIP: ; X0,Y0,X1,Y1. Edges of current window, in view space, right span .byte 0,0,0,0,0 diff --git a/views.s b/views.s index 92e720d..99519ff 100644 --- a/views.s +++ b/views.s @@ -10,7 +10,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; WGCreateView -; Creates a new view +; Creates and selects a new view ; PARAM0: Pointer to ASCII configuration string (LSB) ; PARAM1: Pointer to ASCII configuration string (MSB) ; @@ -32,6 +32,7 @@ WGCreateView: pha and #%00001111 ; Find our new view record + jsr WGSelectView asl asl asl @@ -104,10 +105,11 @@ WGCreateCheckbox: jsr scanHex8 and #%00001111 ; Find our new view record + jsr WGSelectView asl asl asl - asl ; Records are 8 bytes wide + asl ; Records are 16 bytes wide tax jsr scanHex8 @@ -173,10 +175,11 @@ WGCreateButton: jsr scanHex8 and #%00001111 ; Find our new view record + jsr WGSelectView asl asl asl - asl ; Records are 8 bytes wide + asl ; Records are 16 bytes wide tax jsr scanHex8 @@ -241,6 +244,7 @@ WGPaintView: SAVE_ZPS LDY_ACTIVEVIEW + lda WG_VIEWRECORDS+4,y ; Cache style information sta SCRATCH0 @@ -263,24 +267,7 @@ WGPaintView: bra WGPaintView_done WGPaintView_check: - lda WG_VIEWRECORDS+9,y ; Render checkbox state - beq WGPaintView_done - - lda WG_VIEWRECORDS+0,y - sta WG_CURSORX - lda WG_VIEWRECORDS+1,y - sta WG_CURSORY - lda WG_VIEWRECORDS+9,y - and #$80 - bne WGPaintView_checkSelected - lda #'D' - bra WGPaintView_checkPlot - -WGPaintView_checkSelected: - lda #'E' - -WGPaintView_checkPlot: - jsr WGPlot + jsr paintCheck bra WGPaintView_done WGPaintView_button: @@ -293,6 +280,48 @@ WGPaintView_done: rts +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; paintCheck +; Paints the contents of a checkbox +; Y: Index into view records of checkbox to paint +; Side effects: Clobbers A, S0 +paintCheck: + lda WG_VIEWRECORDS+0,y ; Position cursor + sta WG_CURSORX + lda WG_VIEWRECORDS+1,y + sta WG_CURSORY + + lda WG_VIEWRECORDS+9,y ; Determine our visual state + and #$80 + bne paintCheck_selected + + lda WG_VIEWRECORDS+9,y + and #$01 + beq paintCheck_unselectedUnchecked + + lda #'D' + bra paintCheck_plot + +paintCheck_unselectedUnchecked: + lda #' '+$80 + bra paintCheck_plot + +paintCheck_selected: + lda WG_VIEWRECORDS+9,y + and #$01 + beq paintCheck_selectedUnchecked + + lda #'E' + bra paintCheck_plot + +paintCheck_selectedUnchecked: + lda #' ' + +paintCheck_plot: ; Paint our state + jsr WGPlot + rts + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; paintButton ; Paints the contents of a button @@ -442,8 +471,8 @@ WGEraseViewContents_done: ; A: ID ; WGSelectView: - SAVE_AXY sta WG_ACTIVEVIEW + pha ; Initialize cursor to local origin lda #0 @@ -453,7 +482,78 @@ WGSelectView: jsr cacheClipPlanes ; View changed, so clipping cache is stale WGSelectView_done: - RESTORE_AXY + pla + rts + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; WGViewFocusNext +; Shifts focus to the next view +; Side effects: Changes selected view, repaints some views +; +WGViewFocusNext: + SAVE_AY + + LDY_FOCUSVIEW ; Unfocus current view + lda WG_VIEWRECORDS+9,y + and #%01111111 + sta WG_VIEWRECORDS+9,y + + lda WG_FOCUSVIEW + jsr WGSelectView + jsr WGPaintView + + inc WG_FOCUSVIEW ; Increment and wrap + LDY_FOCUSVIEW + lda WG_VIEWRECORDS+2,y + bne WGViewFocusNext_focus + lda #0 + sta WG_FOCUSVIEW + +WGViewFocusNext_focus: + lda WG_FOCUSVIEW + jsr WGSelectView + + lda WG_VIEWRECORDS+9,y + ora #%10000000 + sta WG_VIEWRECORDS+9,y + + jsr WGPaintView + + RESTORE_AY + rts + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; WGViewFocusAction +; Performs the action of the focused view +; Side effects: Changes selected view, Repaints some views +; +WGViewFocusAction: + SAVE_AY + + LDY_FOCUSVIEW + lda WG_VIEWRECORDS+4,y ; What kind of view is it? + + cmp #VIEW_STYLE_CHECK + beq WGViewFocusAction_toggleCheckbox + cmp #VIEW_STYLE_BUTTON + beq WGViewFocusAction_buttonClick + + bra WGViewFocusAction_done + +WGViewFocusAction_toggleCheckbox: + lda WG_VIEWRECORDS+9,y + eor #%00000001 + sta WG_VIEWRECORDS+9,y + lda WG_FOCUSVIEW + jsr WGSelectView + jsr WGPaintView + +WGViewFocusAction_buttonClick: + +WGViewFocusAction_done: + RESTORE_AY rts @@ -587,6 +687,33 @@ WGScrollY_done: +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; WGViewPaintAll +; Repaints all views +; Side effects: Changes selected view +; +WGViewPaintAll: + SAVE_AXY + + ldx #0 + +WGViewPaintAll_loop: + txa + jsr WGSelectView + + LDY_ACTIVEVIEW + lda WG_VIEWRECORDS+2,y ; Last view? + beq WGViewPaintAll_done + + jsr WGPaintView + inx + bra WGViewPaintAll_loop + +WGViewPaintAll_done: + RESTORE_AXY + rts + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; cacheClipPlanes ; Internal routine to cache the clipping planes for the view