[A86] Re: Inverse selecting.


[Prev][Next][Index][Thread]

[A86] Re: Inverse selecting.



Advanced programmers write their own code. Others use this routine. (there's 
an example) If only the ACZ was still with us today ;o(

;===========================================================
; DoMenu -- Bar menu routine
; Clears the screen and displays a table driven bar menu
;  
;      A       CCCC   ZZZZZ
;     A A     C          ZZ
;    AAAAA    C        ZZ
;   A     A    CCCC   ZZZZZ
;
;   Welcom fellow coder to the routines of the ACZ...
; Assembly Coders Zenith is a new group that will further TI
; assembly programming on all platforms.  This is the first
; released routine from one of their up comming games and it
; will not be the last.  Be ready for us, here we come...
; CLEM, Dux Gregis, Dave Scheltema, David Phillips, and Jbrett.
;
;
; Coded by: 
:         David Phillips <electrum@tfs.net> aka Electrum
;         David Scheltema <scheltem@aaps.k12.mi.us> aka zoomBlock
;
; input: HL = menu table
; output: chosen table address jumped to
;
; example table:
;  .db 2                ; num entries
;  .dw "My menu",0      ; title text (at the top)
;  .dw "First thing",0  ; text for each entry
;  .dw "Second one",0   ; ...
;  .dw Option1          ; pointers (labels) to jump
;  .dw Option2          ; to for each entry in menu
;
; Note: routine must be jumped to!
;===========================================================
DoMenu:
 push hl                    ; _clrLCD destroys hl
 call _clrLCD               ; clears the screen
 pop hl                     ; now restore it
 ld c,(hl)                  ; get number of entries
 inc hl                     ; move to menu title text
 ld de,$0001                ; draw at top, one char right
 ld (_penCol),de            ; set the small font coords
 call _vputs                ; print the title text
 push hl                    ; save pointer
 ld hl,$fc00                ; point to video ram
 call DoMenuInv             ; invert the top line
 pop hl                     ; restore our pointer
 ld b,c                     ; load num entries for loop
 ld de,$0729                ; start printing at middle of second line
DoMenuDTL:
 ld (_penCol),de            ; set the font coords
 call _vputs                ; print the menu text
 ld a,d                     ; get the vertical coord
 add a,7                    ; move to next line
 ld d,a                     ; save new coord
 djnz DoMenuDTL             ; draw all the text
 push hl                    ; save pointer
 ld b,1                     ; start menu at first entry
 call DoMenuInvBar          ; invert it
DoMenuL:
 push bc                    ; save entries and current entry
 call _getky                ; same as GET_KEY
 pop bc                     ; restore it
 cp K_UP                    ; did they press up?
 jr z,DoMenuUp              ; move menu bar up
 cp K_DOWN                  ; or was it down?
 jr z,DoMenuDown            ; then move the bar down
 cp K_SECOND                ; did they hit 2nd?
 jr z,DoMenuSelect          ; then they want it
 cp K_ENTER                 ; some people like enter
 jr z,DoMenuSelect          ; so check it too
 jr DoMenuL                 ; they're just sitting there, loop again
DoMenuUp:
 call DoMenuInvBar          ; invert current selection back to normal
 dec b                      ; move up
 jr nz,DoMenuBar            ; if it's zero, we're at the top
 ld b,c                     ; so move to the bottom
 jr DoMenuBar               ; handle menu bar
DoMenuDown:
 call DoMenuInvBar          ; same as up, go back to normal text
 ld a,c                     ; get current entry for check
 cp b                       ; at the bottom?
 jr z,DoMenuDownT           ; the move to the top
 inc b                      ; move down
 jr DoMenuBar               ; handle menu bar
DoMenuDownT:
 ld b,1                     ; move to the top
DoMenuBar:
 call DoMenuInvBar          ; invert the new selection
 jr DoMenuL                 ; now it's time to loop
DoMenuInvBar:
 push hl                    ; save pointer
 push bc                    ; save position and entries
 ld h,b                     ; get position
 ld l,112                   ; there are 7 lines of 16 bytes each (7*16 = 112)
 call MUL_HL                ; do the multiply
 ld de,$fc00                ; we need to add to video memory
 add hl,de                  ; do the add
 call DoMenuInv             ; invert the line
 pop bc                     ; restore position and entries
 pop hl                     ; restore pointer
 ret                        ; done inverting
DoMenuInv:
 ld b,7*16                  ; each row is 16 bytes wide and text is 7 rows 
high
DoMenuIL:
 ld a,(hl)                  ; get the byte
 cpl                        ; NOT the byte--flips all the bits
 ld (hl),a                  ; save the new byte
 inc hl                     ; next byte
 djnz DoMenuIL              ; loop for all bytes
 ret                        ; we're done with the invert loop
DoMenuSelect:
 pop hl                     ; restore the pointer
 ld d,0                     ; clear upper byte
 ld e,b                     ; load lower byte with current selection
 dec e                      ; decrease, starting at 0 instead of 1
 sla e                      ; multiply by 2, pointers are 16-bit (2 bytes)
 add hl,de                  ; add to get correct address in the jump table
 ld a,(hl)                  ; get lower byte of pointer
 inc hl                     ; next byte
 ld h,(hl)                  ; get upper byte of pointer
 ld l,a                     ; complete pointer with lower byte
 jp (hl)                    ; jump to the address from the table--hl, not (hl

       

Josh Gentry
"Real programmers code in pen during math class."
http://www.freewebz.com/jdgentry







Follow-Ups: