cleaned up draw selection. sigh.. undraw needs it now

This commit is contained in:
Dagen Brock 2015-09-17 01:43:47 -05:00
parent 9a71cb289e
commit 8a1489c4c1
1 changed files with 469 additions and 378 deletions

View File

@ -1,5 +1,10 @@
*** MENU LIBRARY
sizeof_ItemStruct = #6
*MyItem hex 19,07 ;x,y positions
* db MenuOption_List ;type of input (see Menu_Types)
* db 11 ;max size in bytes
* da MyItemOptions ;params definition & storage
** MENU USES ZP $F0-$F1 as ptr to MenuDefs
Menu_InitMenu sta $F0
@ -63,21 +68,21 @@ Menu_DrawOptions
:nextMenuItem
lda _menuOptionPtr
clc
adc #6 ; len of "struct"
adc #sizeof_ItemStruct ;len of "struct"
sta _menuOptionPtr
bra :drawOption
:menuDone
rts
Menu_DrawOptionHex iny
lda ($F0),y ; get len
lda ($F0),y ;get len
sta _menuHexIdx
iny
lda ($F0),y ; get da
sta $F2 ; storez
lda ($F0),y ;get da
sta $F2 ;storez
iny
lda ($F0),y ; get da
sta $F3 ; storez
lda ($F0),y ;get da
sta $F3 ;storez
ldy #0
:prloop lda ($F2),y
jsr PRBYTE
@ -97,18 +102,18 @@ Menu_DrawOptionAction iny
jsr PrintString
rts
Menu_DrawOptionList iny ; point to da
Menu_DrawOptionList iny ;point to da
iny
lda ($F0),y
sta $F2
iny
lda ($F0),y
sta $F3 ; now ($2) points to item list structure
sta $F3 ;now ($2) points to item list structure
ldy #0
lda ($F2),y ; selected index
lda ($F2),y ;selected index
asl
inc
inc ; add 2 to reach table of addresses
inc ;add 2 to reach table of addresses
tay
lda ($F2),y
pha
@ -122,53 +127,53 @@ Menu_DrawOptionList iny ; point to da
_menuHexIdx dw 0
_menuOptionPtr dw 00
Menu_UndrawSelected
Menu_UndrawSelectedAll
stz _stash
:undrawLoop ldy _stash ; struct ptr
:undrawLoop ldy _stash ;struct ptr
lda ($F0),y
beq :stop
dec ; x-- (left bracket)
dec ;x-- (left bracket)
sta _menuSelectedX1
iny
lda ($F0),y
sta _menuSelectedY
iny
lda ($F0),y
cmp MenuOption_Char
bne :notChar
iny
:isChar iny ;char, so find the width parameter
lda ($F0),y
inc ;doit
inc ;add 1
clc
adc _menuSelectedX1
adc _menuSelectedX1 ;add the left bracket starting point
tax
bra :rightBracket
bra :rightBracket ;go draw brackets starting with right
:notChar cmp #1
:notChar cmp MenuOption_Hex
bne :notHex
iny
:isHex iny ;hex, so find the width parameter
lda ($F0),y
asl
inc ;doit
asl ;and multiply by 2 because a byte takes 2 chars on screen
inc ;add 1
clc
adc _menuSelectedX1
adc _menuSelectedX1 ;add the left bracket starting point
tax
bra :rightBracket
bra :rightBracket ;go draw brackets starting with right
:notHex cmp #2
:notHex cmp MenuOption_Action
bne :notAction
iny
:isAction iny ;action, so find the max width parameter
lda ($F0),y
inc
inc ;add 1
clc
adc _menuSelectedX1
adc _menuSelectedX1 ;add the left bracket starting point
tax
bra :rightBracket
bra :rightBracket ;go draw brackets starting with right
:notAction
cmp #3
:notAction cmp MenuOption_List
bne :wtf
iny
lda ($F0),y
@ -178,91 +183,6 @@ Menu_UndrawSelected
adc _menuSelectedX1
tax
bra :rightBracket
:wtf
:rightBracket
ldy _menuSelectedY
jsr GoXY
lda #" "
jsr COUT
:leftBracket ldx _menuSelectedX1
ldy _menuSelectedY
jsr GoXY
lda #" "
jsr COUT
lda _stash
clc
adc #6
sta _stash
bra :undrawLoop
:stop
rts
Menu_DrawSelected
lda #0
ldx Menu_ItemSelected
:check beq :foundIdx
clc
adc #6 ; "struct" size
dex
bra :check
:foundIdx tay
lda ($F0),y
dec ; x-- (left bracket)
sta _menuSelectedX1
iny
lda ($F0),y
sta _menuSelectedY
iny
lda ($F0),y
bne :notChar
iny
lda ($F0),y
inc ;doit
clc
adc _menuSelectedX1
tax
bra :rightBracket
:notChar cmp #1
bne :notHex
iny
lda ($F0),y
asl
inc ;doit
clc
adc _menuSelectedX1
tax
bra :rightBracket
:notHex cmp #2
bne :notAction
iny
lda ($F0),y
inc
clc
adc _menuSelectedX1
tax
bra :rightBracket
:notAction
cmp #3
bne :wtf
iny
lda ($F0),y
inc
clc
adc _menuSelectedX1
tax
bra :rightBracket
:wtf
:rightBracket
@ -275,25 +195,197 @@ Menu_DrawSelected
jsr GoXY
lda #"["
jsr COUT
lda _stash
clc
adc #sizeof_ItemStruct
sta _stash
bra :undrawLoop
:stop
rts
* max 256 byte struct table unless i go 16 bit
Menu_GetSelectedStructPtr lda #0
ldx Menu_ItemSelected
:check beq :foundIdx
clc
adc #sizeof_ItemStruct ;"struct" size
dex
bra :check
:foundIdx rts
** RETURN THE SCREEN WIDTH FOR VARIOUS INPUT TYPES
* X= ItemType A= SizeInBytes
Menu_GetItemScreenWidth
cpx MenuOption_Char
bne :notChar
rts ;size already correct for char
:notChar cpx MenuOption_Hex
bne :notHex
asl ;*2 for printing 2 char per byte
rts
:notHex cpx MenuOption_Bin
bne :notBin
asl ; logic for binary is a little more detailed
asl ; because i add spacing for readability
asl ;*8 for byte
inc ; add a space so "0000 0000"
cmp #9
bne :bigger
rts
:bigger inc
inc ; add 2 more spaces.
rts
:notBin cpx MenuOption_Int
bne :notInt
rts ;input width... internally maxint = FFFF
:notInt cpx MenuOption_Action
bne :notAction
rts ;should be defined in param from string length
:notAction cpx MenuOption_List
bne :notList
rts ;should be defined in param from string length
:notList cpx MenuOption_Bool
bne :notBool
rts ;hmm.. undefined? @TODO!!!
:notBool
:wtf
rts
Menu_HighlightSelected
jsr Menu_GetSelectedStructPtr ;get ptr to selected item
tay
lda ($F0),y ;start parsing the struct with x value
dec ;move left 1 space
sta _menuLBracketX
iny
lda ($F0),y ;next param, y value
sta _menuSelectedY
iny
lda ($F0),y ;next param, type
tax
iny
lda ($F0),y ;next param, size (bytes)
jsr Menu_GetItemScreenWidth ;get the real width
inc ;add 1
clc
adc _menuLBracketX ;add the left bracket position
sta _menuRBracketX ;and we should be in the right place
jsr Menu_DrawBrackets
rts
Menu_DrawBrackets ldx _menuRBracketX
ldy _menuSelectedY
jsr GoXY
lda #">"
jsr COUT
ldx _menuLBracketX
ldy _menuSelectedY
jsr GoXY
lda #"<"
jsr COUT
rts
_menuLBracketX db 0
_menuRBracketX db 0
Menu_DrawSelected jmp Menu_HighlightSelected ; TESTING!!!
lda #0
ldx Menu_ItemSelected
:check beq :foundIdx
clc
adc #sizeof_ItemStruct ;"struct" size
dex
bra :check
:foundIdx tay
lda ($F0),y
dec ;x-- (left bracket)
sta _menuSelectedX1
iny
lda ($F0),y
sta _menuSelectedY
iny
lda ($F0),y
bne :notChar
iny
lda ($F0),y
inc ;doit
clc
adc _menuSelectedX1
tax
bra :rightBracket
:notChar cmp #1
bne :notHex
iny
lda ($F0),y
asl
inc ;doit
clc
adc _menuSelectedX1
tax
bra :rightBracket
:notHex cmp #2
bne :notAction
iny
lda ($F0),y
inc
clc
adc _menuSelectedX1
tax
bra :rightBracket
:notAction
cmp #3
bne :wtf
iny
lda ($F0),y
inc
clc
adc _menuSelectedX1
tax
bra :rightBracket
:wtf
:rightBracket
ldy _menuSelectedY
jsr GoXY
lda #">"
jsr COUT
:leftBracket ldx _menuSelectedX1
ldy _menuSelectedY
jsr GoXY
lda #"<"
jsr COUT
rts
_menuSelectedX1 db 0 ; no x2 cuz we be addin' dat offset
_menuSelectedX1 db 0 ;no x2 cuz we be addin' dat offset
_menuSelectedY db 0
* THESE ARE ALL OF THE MENU INPUT TYPES
Menu_Types
Menu_TypeTable da Menu_TypeChar,Menu_TypeHex,Menu_TypeAction,Menu_TypeList,Menu_TypeBool,Menu_TypeBin,Menu_TypeInt
MenuOption_Char equ #0
MenuOption_Hex equ #1
MenuOption_Bin equ #5
MenuOption_Int equ #6
MenuOption_Action equ #2
MenuOption_List equ #3
MenuOption_Bool equ #4
Menu_TypeTable da Menu_TypeChar,Menu_TypeHex,Menu_TypeAction,Menu_TypeList,Menu_TypeBool
* $0 = ptr->MenuDefs
Menu_HandleSelection
lda #0
ldx Menu_ItemSelected ; odd choice to load again, but preps flags (z) how i likes it
:check beq :foundIdx ; <- a=struct offset
ldx Menu_ItemSelected ;odd choice to load again, but preps flags (z) how i likes it
:check beq :foundIdx ;<- a=struct offset
clc
adc #6 ; "struct" size
adc #sizeof_ItemStruct ;"struct" size
dex
bra :check
@ -309,6 +401,8 @@ Menu_HandleSelection
Menu_TypeChar rts
Menu_TypeBool rts
Menu_TypeBin rts
Menu_TypeInt rts
Menu_TypeHex pha
tay
@ -336,7 +430,7 @@ Menu_TypeHex pha
jsr GetHex
rts
Menu_TypeAction iny ; skip len byte
Menu_TypeAction iny ;skip len byte
iny
lda ($F0),y
sta :ACTION+1
@ -349,7 +443,7 @@ Menu_TypeAction iny ; skip len byte
sta :ACTION+1
bcs :copy
dec :ACTION+2
:copy ldx #0 ; this is all so bad
:copy ldx #0 ;this is all so bad
:ACTION lda $ffff,x
sta :JSR+1,x
inx
@ -387,7 +481,7 @@ GetHex sta _gethex_maxlen
:notNum cmp #"a"
bcc :notLower
sec
sbc #$20 ; ToUpper
sbc #$20 ;ToUpper
:notLower cmp #"A"
bcc :badChar
cmp #"F"+1
@ -450,6 +544,3 @@ HexCharForByte
:alpha clc
adc #"A"
rts