J'ai fait une routine de menu rapide juste pour te montrer que c'est pas forcément plus lent et gros de faire qu'avec du texte plutôt qu'avec des sprites (enfin après tu fais comme tu veux
) :
Code source + binaire :
http://www.mirari.fr/dJ5d
.nolist
#define TI83
#include "ti83.inc"
.list
.org $9327
start:
bcall _runIndicOff
ld hl,menu_str
ld (menu_title),hl
ld a,3
ld (menu_nb_options),a
ld hl,menu_opt1_str
ld (menu_option1),hl
ld hl,new_game
ld (menu_option1_goto),hl
ld hl,menu_opt2_str
ld (menu_option2),hl
ld hl,load_game
ld (menu_option2_goto),hl
ld hl,menu_opt3_str
ld (menu_option3),hl
ld hl,exit
ld (menu_option3_goto),hl
jr menu
new_game:
bcall _clrlcdfull
ld hl,menu_opt1_str
bjump _puts
load_game:
bcall _clrlcdfull
ld hl,menu_opt2_str
bjump _puts
exit:
bcall _clrlcdfull
ld hl,menu_opt3_str
bjump _puts
menu_str:
.db $f1,$f1,$f1,"Super Menu",$f1,$f1,$f1,0
menu_opt1_str:
.db " Nouveau ",0
menu_opt2_str:
.db " Charger ",0
menu_opt3_str:
.db " Quitter ",0
;------------Routine------------
menu:
bcall _clrlcdfull
xor a
ld (menu_cur_pos),a
menu2:
bcall _homeup
set textInverse,(IY+textFlags)
menu_title = $+1
ld hl,0
bcall _puts
res textInverse,(IY+textFlags)
bcall _homeup
bcall _newline
bcall _newline
menu_nb_options = $+1
ld b,0
ld hl,menu_option1
menu_loop:
push bc
ld a,(curcol)
or a
bcallnz _newline
ld a,(menu_nb_options)
sub b
ld b,a
menu_cur_pos = $+1
ld a,0
cp b
call z,menu_inverse_cur
call nz,menu_reset_cur
push hl
bcall _ldHLind
bcall _puts
pop hl
inc hl
inc hl
inc hl
inc hl
pop bc
djnz menu_loop
menu_getkey_loop:
ld a,$fe
out (1),a
in a,(1)
bit 0,a
jr z,menu_inc_cur
bit 3,a
jr z,menu_dec_cur
ld a,$bf
out (1),a
in a,(1)
bit 5,a
jr z,menu_valid
jr menu_getkey_loop
menu_inc_cur:
ld a,(menu_nb_options)
dec a
ld b,a
ld hl,menu_cur_pos
ld a,(hl)
cp b
jr z,menu_getkey_loop
inc (hl)
bcall _lcd_busy
jr menu2
menu_dec_cur:
ld hl,menu_cur_pos
ld a,(hl)
or a
jr z,menu_getkey_loop
dec (hl)
bcall _lcd_busy
jr menu2
menu_valid:
res textInverse,(IY+textFlags)
ld hl,menu_option1+2
ld d,0
ld e,4
ld a,(menu_cur_pos)
inc a
ld b,a
menu_valid_loop:
add hl,de
djnz menu_valid_loop
or a
sbc hl,de
bcall _ldHLind
jp (hl)
menu_inverse_cur:
set textInverse,(IY+textFlags)
ret
menu_reset_cur:
res textInverse,(IY+textFlags)
ret
menu_option1:\ .dw 0\menu_option1_goto:\ .dw 0
menu_option2:\ .dw 0\menu_option2_goto:\ .dw 0
menu_option3:\ .dw 0\menu_option3_goto:\ .dw 0
menu_option4:\ .dw 0\menu_option4_goto:\ .dw 0
menu_option5:\ .dw 0\menu_option5_goto:\ .dw 0
menu_option6:\ .dw 0\menu_option6_goto:\ .dw 0
.end
C'est pas forcément très compliqué, en fait la routine prend en "paramètres" les textes du titre et des options ainsi que les adresses des labels liés à celles-ci et se charge de tout gérer (déplacements, getkey en
direct input...).
Autrement la routine
_ldHLind est absolument à connaitre pour comprendre le code, et pour le reste n'hésite pas à poser des questions si c'est pas assez explicite.