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,455 +1,546 @@
*** MENU LIBRARY *** 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 USES ZP $F0-$F1 as ptr to MenuDefs
Menu_InitMenu sta $F0 Menu_InitMenu sta $F0
stx $F1 stx $F1
rts rts
Menu_PrevItem dec Menu_ItemSelected Menu_PrevItem dec Menu_ItemSelected
bpl :noflip bpl :noflip
lda #MainMenuItems lda #MainMenuItems
dec dec
sta Menu_ItemSelected sta Menu_ItemSelected
:noflip rts :noflip rts
Menu_NextItem inc Menu_ItemSelected Menu_NextItem inc Menu_ItemSelected
lda Menu_ItemSelected lda Menu_ItemSelected
cmp #MainMenuItems cmp #MainMenuItems
bcc :noflip bcc :noflip
lda #0 lda #0
sta Menu_ItemSelected sta Menu_ItemSelected
:noflip rts :noflip rts
Menu_DrawOptions Menu_DrawOptions
stz _menuOptionPtr stz _menuOptionPtr
:drawOption :drawOption
ldy _menuOptionPtr ldy _menuOptionPtr
lda ($F0),y lda ($F0),y
beq :menuDone beq :menuDone
tax tax
iny iny
lda ($F0),y lda ($F0),y
tay tay
jsr GoXY jsr GoXY
ldy _menuOptionPtr ldy _menuOptionPtr
iny iny
iny iny
lda ($F0),y lda ($F0),y
beq :charItem beq :charItem
cmp #1 cmp #1
beq :hexItem beq :hexItem
cmp #2 cmp #2
beq :jsrItem beq :jsrItem
cmp #3 cmp #3
beq :listItem beq :listItem
cmp #4 cmp #4
beq :boolItem beq :boolItem
:charItem :charItem
:boolItem :boolItem
:hexItem jsr Menu_DrawOptionHex :hexItem jsr Menu_DrawOptionHex
bra :nextMenuItem bra :nextMenuItem
:listItem jsr Menu_DrawOptionList :listItem jsr Menu_DrawOptionList
bra :nextMenuItem bra :nextMenuItem
:jsrItem jsr Menu_DrawOptionAction :jsrItem jsr Menu_DrawOptionAction
bra :nextMenuItem bra :nextMenuItem
:nextMenuItem :nextMenuItem
lda _menuOptionPtr lda _menuOptionPtr
clc clc
adc #6 ; len of "struct" adc #sizeof_ItemStruct ;len of "struct"
sta _menuOptionPtr sta _menuOptionPtr
bra :drawOption bra :drawOption
:menuDone :menuDone
rts rts
Menu_DrawOptionHex iny Menu_DrawOptionHex iny
lda ($F0),y ; get len lda ($F0),y ;get len
sta _menuHexIdx sta _menuHexIdx
iny iny
lda ($F0),y ; get da lda ($F0),y ;get da
sta $F2 ; storez sta $F2 ;storez
iny iny
lda ($F0),y ; get da lda ($F0),y ;get da
sta $F3 ; storez sta $F3 ;storez
ldy #0 ldy #0
:prloop lda ($F2),y :prloop lda ($F2),y
jsr PRBYTE jsr PRBYTE
iny iny
cpy _menuHexIdx cpy _menuHexIdx
bne :prloop bne :prloop
rts rts
Menu_DrawOptionAction iny Menu_DrawOptionAction iny
iny iny
lda ($F0),y lda ($F0),y
tax tax
iny iny
lda ($F0),y lda ($F0),y
tay tay
txa txa
jsr PrintString jsr PrintString
rts rts
Menu_DrawOptionList iny ; point to da Menu_DrawOptionList iny ;point to da
iny iny
lda ($F0),y lda ($F0),y
sta $F2 sta $F2
iny iny
lda ($F0),y lda ($F0),y
sta $F3 ; now ($2) points to item list structure sta $F3 ;now ($2) points to item list structure
ldy #0 ldy #0
lda ($F2),y ; selected index lda ($F2),y ;selected index
asl asl
inc inc
inc ; add 2 to reach table of addresses inc ;add 2 to reach table of addresses
tay tay
lda ($F2),y lda ($F2),y
pha pha
iny iny
lda ($F2),y lda ($F2),y
tay tay
pla pla
jsr PrintString jsr PrintString
rts rts
_menuHexIdx dw 0 _menuHexIdx dw 0
_menuOptionPtr dw 00 _menuOptionPtr dw 00
Menu_UndrawSelected Menu_UndrawSelectedAll
stz _stash stz _stash
:undrawLoop ldy _stash ; struct ptr :undrawLoop ldy _stash ;struct ptr
lda ($F0),y lda ($F0),y
beq :stop beq :stop
dec ; x-- (left bracket) dec ;x-- (left bracket)
sta _menuSelectedX1 sta _menuSelectedX1
iny iny
lda ($F0),y lda ($F0),y
sta _menuSelectedY sta _menuSelectedY
iny iny
lda ($F0),y lda ($F0),y
bne :notChar cmp MenuOption_Char
iny bne :notChar
lda ($F0),y :isChar iny ;char, so find the width parameter
inc ;doit lda ($F0),y
clc inc ;add 1
adc _menuSelectedX1 clc
tax adc _menuSelectedX1 ;add the left bracket starting point
bra :rightBracket tax
bra :rightBracket ;go draw brackets starting with right
:notChar cmp #1 :notChar cmp MenuOption_Hex
bne :notHex bne :notHex
iny :isHex iny ;hex, so find the width parameter
lda ($F0),y lda ($F0),y
asl asl ;and multiply by 2 because a byte takes 2 chars on screen
inc ;doit inc ;add 1
clc clc
adc _menuSelectedX1 adc _menuSelectedX1 ;add the left bracket starting point
tax tax
bra :rightBracket bra :rightBracket ;go draw brackets starting with right
:notHex cmp #2
bne :notAction
iny
lda ($F0),y
inc
clc
adc _menuSelectedX1
tax
bra :rightBracket
:notAction :notHex cmp MenuOption_Action
cmp #3 bne :notAction
bne :wtf :isAction iny ;action, so find the max width parameter
iny lda ($F0),y
lda ($F0),y inc ;add 1
clc
adc _menuSelectedX1 ;add the left bracket starting point
tax
bra :rightBracket ;go draw brackets starting with right
inc
clc
adc _menuSelectedX1
tax
bra :rightBracket
:notAction cmp MenuOption_List
bne :wtf
iny
lda ($F0),y
inc
clc
adc _menuSelectedX1
tax
bra :rightBracket
:wtf :wtf
:rightBracket :rightBracket
ldy _menuSelectedY ldy _menuSelectedY
jsr GoXY jsr GoXY
lda #" " lda #"]"
jsr COUT jsr COUT
:leftBracket ldx _menuSelectedX1 :leftBracket ldx _menuSelectedX1
ldy _menuSelectedY ldy _menuSelectedY
jsr GoXY jsr GoXY
lda #" " lda #"["
jsr COUT jsr COUT
lda _stash lda _stash
clc clc
adc #6 adc #sizeof_ItemStruct
sta _stash sta _stash
bra :undrawLoop bra :undrawLoop
:stop :stop
rts 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_DrawSelected Menu_HighlightSelected
lda #0 jsr Menu_GetSelectedStructPtr ;get ptr to selected item
ldx Menu_ItemSelected
:check beq :foundIdx
clc
adc #6 ; "struct" size
dex
bra :check
:foundIdx tay tay
lda ($F0),y lda ($F0),y ;start parsing the struct with x value
dec ; x-- (left bracket) dec ;move left 1 space
sta _menuSelectedX1 sta _menuLBracketX
iny iny
lda ($F0),y lda ($F0),y ;next param, y value
sta _menuSelectedY sta _menuSelectedY
iny iny
lda ($F0),y lda ($F0),y ;next param, type
bne :notChar tax
iny iny
lda ($F0),y lda ($F0),y ;next param, size (bytes)
inc ;doit jsr Menu_GetItemScreenWidth ;get the real width
clc inc ;add 1
adc _menuSelectedX1 clc
tax adc _menuLBracketX ;add the left bracket position
bra :rightBracket sta _menuRBracketX ;and we should be in the right place
jsr Menu_DrawBrackets
rts
:notChar cmp #1 Menu_DrawBrackets ldx _menuRBracketX
bne :notHex ldy _menuSelectedY
iny jsr GoXY
lda ($F0),y lda #">"
asl jsr COUT
inc ;doit ldx _menuLBracketX
clc ldy _menuSelectedY
adc _menuSelectedX1 jsr GoXY
tax lda #"<"
bra :rightBracket jsr COUT
rts
_menuLBracketX db 0
_menuRBracketX db 0
:notHex cmp #2 Menu_DrawSelected jmp Menu_HighlightSelected ; TESTING!!!
bne :notAction lda #0
iny ldx Menu_ItemSelected
lda ($F0),y :check beq :foundIdx
clc
adc #sizeof_ItemStruct ;"struct" size
dex
bra :check
inc :foundIdx tay
clc lda ($F0),y
adc _menuSelectedX1 dec ;x-- (left bracket)
tax sta _menuSelectedX1
bra :rightBracket 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 :notAction
cmp #3 cmp #3
bne :wtf bne :wtf
iny iny
lda ($F0),y lda ($F0),y
inc inc
clc clc
adc _menuSelectedX1 adc _menuSelectedX1
tax tax
bra :rightBracket bra :rightBracket
:wtf :wtf
:rightBracket :rightBracket
ldy _menuSelectedY ldy _menuSelectedY
jsr GoXY jsr GoXY
lda #"]" lda #">"
jsr COUT jsr COUT
:leftBracket ldx _menuSelectedX1 :leftBracket ldx _menuSelectedX1
ldy _menuSelectedY ldy _menuSelectedY
jsr GoXY jsr GoXY
lda #"[" lda #"<"
jsr COUT jsr COUT
rts 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 _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
MenuOption_Char equ #0
MenuOption_Hex equ #1
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 * $0 = ptr->MenuDefs
Menu_HandleSelection Menu_HandleSelection
lda #0 lda #0
ldx Menu_ItemSelected ; odd choice to load again, but preps flags (z) how i likes it ldx Menu_ItemSelected ;odd choice to load again, but preps flags (z) how i likes it
:check beq :foundIdx ; <- a=struct offset :check beq :foundIdx ;<- a=struct offset
clc clc
adc #6 ; "struct" size adc #sizeof_ItemStruct ;"struct" size
dex dex
bra :check bra :check
:foundIdx pha :foundIdx pha
tay tay
iny ;\ iny ;\
iny ; \ iny ; \
lda ($F0),y ; > get MenuOption_Type, set up for jmp table lda ($F0),y ; > get MenuOption_Type, set up for jmp table
asl ; / asl ; /
tax ;/ tax ;/
pla pla
jmp (Menu_TypeTable,x) jmp (Menu_TypeTable,x)
Menu_TypeChar rts Menu_TypeChar rts
Menu_TypeBool rts Menu_TypeBool rts
Menu_TypeBin rts
Menu_TypeInt rts
Menu_TypeHex pha Menu_TypeHex pha
tay tay
lda ($F0),y lda ($F0),y
tax tax
iny iny
lda ($F0),y lda ($F0),y
tay tay
jsr GoXY jsr GoXY
pla pla
clc clc
adc #3 ; ->memory size adc #3 ; ->memory size
tay tay
lda ($F0),y lda ($F0),y
asl ;*2 asl ;*2
pha pha
iny iny
lda ($F0),y lda ($F0),y
pha pha
iny iny
lda ($F0),y lda ($F0),y
tay tay
plx plx
pla pla
jsr GetHex jsr GetHex
rts rts
Menu_TypeAction iny ; skip len byte Menu_TypeAction iny ;skip len byte
iny iny
lda ($F0),y lda ($F0),y
sta :ACTION+1 sta :ACTION+1
iny iny
lda ($F0),y lda ($F0),y
sta :ACTION+2 sta :ACTION+2
lda :ACTION+1 lda :ACTION+1
sec sec
sbc #2 sbc #2
sta :ACTION+1 sta :ACTION+1
bcs :copy bcs :copy
dec :ACTION+2 dec :ACTION+2
:copy ldx #0 ; this is all so bad :copy ldx #0 ;this is all so bad
:ACTION lda $ffff,x :ACTION lda $ffff,x
sta :JSR+1,x sta :JSR+1,x
inx inx
cpx #2 cpx #2
bcc :ACTION bcc :ACTION
:JSR jsr $ffff :JSR jsr $ffff
rts rts
* Selecting from a List * Selecting from a List
* look for key * look for key
* update cursor * update cursor
* if up then prev item \_ draw menu options * if up then prev item \_ draw menu options
* if down then next item / * if down then next item /
* if enter, done - when it gets back to menu loop, we should handle special logic there * if enter, done - when it gets back to menu loop, we should handle special logic there
Menu_TypeList Menu_TypeList
rts rts
*** INPUT LIBRARY FOR MENU *** INPUT LIBRARY FOR MENU
* Pass desired length in A * Pass desired length in A
GetHex sta _gethex_maxlen GetHex sta _gethex_maxlen
stx _gethex_resultptr stx _gethex_resultptr
sty _gethex_resultptr+1 sty _gethex_resultptr+1
stz _gethex_current stz _gethex_current
:input jsr RDKEY :input jsr RDKEY
cmp #$9B ;esc = abort cmp #$9B ;esc = abort
bne :notesc bne :notesc
rts rts
:notesc cmp #"9"+1 :notesc cmp #"9"+1
bcs :notNum ;bge > 9 bcs :notNum ;bge > 9
cmp #"0" cmp #"0"
bcc :badChar ; bcc :badChar ;
sec sec
sbc #"0" sbc #"0"
bra :storeInput bra :storeInput
:notNum cmp #"a" :notNum cmp #"a"
bcc :notLower bcc :notLower
sec sec
sbc #$20 ; ToUpper sbc #$20 ;ToUpper
:notLower cmp #"A" :notLower cmp #"A"
bcc :badChar bcc :badChar
cmp #"F"+1 cmp #"F"+1
bcs :badChar bcs :badChar
:gotHex :gotHex
sec sec
sbc #"A"-10 sbc #"A"-10
:storeInput :storeInput
pha pha
jsr PRHEX jsr PRHEX
pla pla
ldy _gethex_current ldy _gethex_current
sta _gethex_buffer,y sta _gethex_buffer,y
iny iny
cpy #_gethex_internalmax cpy #_gethex_internalmax
bge :internalmax bge :internalmax
cpy _gethex_maxlen cpy _gethex_maxlen
bge :passedmax bge :passedmax
sty _gethex_current sty _gethex_current
bra :input bra :input
:internalmax :internalmax
:passedmax :passedmax
lda _gethex_resultptr lda _gethex_resultptr
sta $0 sta $0
lda _gethex_resultptr+1 lda _gethex_resultptr+1
sta $1 sta $1
ldx #0 ldx #0
ldy #0 ldy #0
:copyBuffer lda _gethex_buffer,x :copyBuffer lda _gethex_buffer,x
asl ; move to upper nibble asl ; move to upper nibble
asl asl
asl asl
asl asl
sta ($0),y ; store sta ($0),y ; store
inx inx
lda _gethex_buffer,x lda _gethex_buffer,x
ora ($0),y ora ($0),y
sta ($0),y sta ($0),y
iny iny
inx inx
cpx _gethex_maxlen cpx _gethex_maxlen
bcc :copyBuffer bcc :copyBuffer
rts rts
:badChar bra :input :badChar bra :input
_gethex_internalmax equ 8 _gethex_internalmax equ 8
_gethex_resultptr da 0000 _gethex_resultptr da 0000
_gethex_maxlen db 1 _gethex_maxlen db 1
_gethex_current db 0 _gethex_current db 0
_gethex_buffer ds _gethex_internalmax _gethex_buffer ds _gethex_internalmax
PrHexChar jsr HexCharForByte PrHexChar jsr HexCharForByte
HexCharForByte HexCharForByte
cmp #9 cmp #9
bcs :alpha bcs :alpha
:number clc :number clc
adc #"0" adc #"0"
rts rts
:alpha clc :alpha clc
adc #"A" adc #"A"
rts rts