From 1c9d9a7bdd9c0382bd56b27afc02975b0e10841d Mon Sep 17 00:00:00 2001 From: Quinn Dunki Date: Tue, 16 Sep 2014 18:01:08 -0700 Subject: [PATCH] - Added support for string arguments within struct parameter lists - Added string block allocator and copier - Added AppleSoft API for creating checkboxes and buttons - Fixed bug with view constructors not correctly selecting the view after creation --- applesoft.s | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++-- gui.s | 2 +- guidemo.dsk | Bin 143360 -> 143360 bytes memory.s | 18 ++++++++++++ utility.s | 63 ++++++++++++++++++++++++++++++++++++++- views.s | 21 +++++++++---- 6 files changed, 177 insertions(+), 10 deletions(-) diff --git a/applesoft.s b/applesoft.s index b35add0..4906717 100644 --- a/applesoft.s +++ b/applesoft.s @@ -14,7 +14,8 @@ WG_AMPVECTOR = $03f5 CHRGET = $00b1 ; Advances text point and gets character in A CHRGOT = $00b7 ; Returns character at text pointer in A SYNCHR = $dec0 ; Validates current character is what's in A -TXTPTR = $00b8 ; (and $b9) ; Current location in BASIC listing +TXTPTRL = $00b8 ; Current location in BASIC listing (LSB) +TXTPTRH = $00b9 ; Current location in BASIC listing (MSB) ERROR = $d412 ; Reports error in X CHKCOM = $debe ; Validates current character is a ',', then gets it GETBYT = $e6f8 ; Gets an integer at text pointer, stores in X @@ -206,12 +207,17 @@ WGAmpersandStructArgument: jsr SYNCHR ; Expect opening parenthesis WGAmpersandStructArguments_loop: + jsr CHRGOT + cmp #'"' ; Check for string pointer + beq WGAmpersandStructArguments_string + jsr GETBYT txa ply sta WGAmpersandCommandBuffer,y phy +WGAmpersandStructArguments_nextParam: jsr CHRGOT cmp #')' ; All done! beq WGAmpersandStructArguments_cleanup @@ -228,8 +234,37 @@ WGAmpersandStructArguments_fail: jsr ERROR bra WGAmpersandStructArguments_done +WGAmpersandStructArguments_string: + jsr CHRGET ; Consume opening quote + lda TXTPTRL ; Allocate for, and copy the string at TXTPTR + sta PARAM0 + lda TXTPTRH + sta PARAM1 + lda #'"' ; Specify quote as our terminator + jsr WGStoreStr + + ply ; Store returned string pointer in our struct + lda PARAM1 + sta WGAmpersandCommandBuffer,y + iny + lda PARAM0 + sta WGAmpersandCommandBuffer,y + iny + phy + +WGAmpersandStructArguments_stringLoop: + jsr CHRGET ; Consume the rest of the string + beq WGAmpersandStructArguments_stringLoopDone + cmp #'"' ; Check for closing quote + beq WGAmpersandStructArguments_stringLoopDone + bra WGAmpersandStructArguments_stringLoop + +WGAmpersandStructArguments_stringLoopDone: + jsr CHRGET ; Consume closing quote + bra WGAmpersandStructArguments_nextParam + WGAmpersandStructArguments_cleanup: - jsr CHRGET ; Consume closing parenthesis + jsr CHRGET ; Consume closing parenthesis WGAmpersandStructArguments_done: ply @@ -341,6 +376,39 @@ WGAmpersand_WINDOW: rts +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; WGAmpersand_CHECKBOX +; Create a checkbox +; &CHECKBOX(id,x,y) +WGAmpersand_CHECKBOX: + jsr WGAmpersandStructArgument + jsr WGCreateCheckbox + jsr WGPaintView + jsr WGBottomCursor + + rts + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; WGAmpersand_BUTTON +; Create a button +; &BUTTON(id,x,y,width,"title") +WGAmpersand_BUTTON: + jsr WGAmpersandStructArgument + jsr WGCreateButton + + lda WGAmpersandCommandBuffer+4 + sta PARAM0 + lda WGAmpersandCommandBuffer+5 + sta PARAM1 + jsr WGViewSetTitle + + jsr WGPaintView + jsr WGBottomCursor + + rts + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; WGBottomCursor @@ -379,6 +447,11 @@ WGAmpersandCommandBufferEnd: ; Jump table for ampersand commands. ; Each row is 16 bytes (14 for name, 2 for address) +; +; Note the strange byte values amidst some strings- this is because +; all text is tokenized before we receive it, so reserved words may +; be compressed +; WGAmpersandCommandTable: .byte $97,0,0,0,0,0,0,0,0,0,0,0,0,0 ; HOME @@ -390,6 +463,12 @@ WGAmpersandCommandTable: .byte "WINDOW",0,0,0,0,0,0,0,0 .addr WGAmpersand_WINDOW +.byte "CHECKBOX",0,0,0,0,0,0 +.addr WGAmpersand_CHECKBOX + +.byte "BUT",$c1,"N",0,0,0,0,0,0,0,0,0 ; BUTTON +.addr WGAmpersand_BUTTON + WGAmpersandCommandTableEnd: diff --git a/gui.s b/gui.s index bcea203..b14c465 100644 --- a/gui.s +++ b/gui.s @@ -21,7 +21,7 @@ main: jsr WGInit jsr WG80 - ;rts + rts ;jmp tortureTestPrint ;jmp tortureTestRects diff --git a/guidemo.dsk b/guidemo.dsk index 13c72c999e993034ff72f6349b068d9a39e536c9..da2469136bd3e1cfc91340dd569934f114535e1e 100644 GIT binary patch delta 3407 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 prpVRFuUy{unqjP5o_e$ScOz2WG_STRINGS + sta PARAM0 + lda #0 + adc #