Voila j'ai un code assez abominable qui doit être optimisé.

Si vous avez des idées, je vais déjà commencer par un peu l'optimiser de mon côté.
Y a pas mal de choses qui sont facilement optimisables smile
"code horrible"

; Init le menu
MENU_INIT:

; Remettre le booleen a vrai
ld a, 1
ld (menu_run), a

; Mettre une valeur de base pour la duree
ld a, 3
ld (duree_level), a

; De base pas de decalage
ld a, 0
ld (bool_decalage), a

ld a, 16
ld (modulo_liste), a

; Ecrire les vputs dans le buffer (pas de clignotement)
set textWrite, (iy + sGrFlags)
ret

; Afficher le menu
MENU_PRINT:

; Effacer l'ecran
call BUFCLR
call FASTCOPY

; Par défaut il y aura des murs sauf si on force le contraire
call MUR_INIT

; Afficher le focus
call FOCUS_INIT

; Afficher les cases
call CASE_PRINT

; Afficher les labels "easy" "medium" "hard"
call DIFFICULTY_PRINT

; Afficher le label "press clear to quit"
call HOWTO_QUIT_PRINT

mp_loop:
call MENU_SCAN_KEY
call MENU_SCAN_ENTER

ld a, (menu_run)
or a

jp nz, mp_loop

call MENU_IS_SELECTED

call BUFCLR
call FASTCOPY

; Lorsqu'on sort du menu, remettre le flag à son état normal
res textWrite, (iy + sGrFlags)

ret




; Executé lorsque l'on selectionne un level
MENU_IS_SELECTED:

ld a, (ycoord)
sub 10
jp z, mis_easy
sub 19
jp z, mis_medium
sub 19
jp z, mis_hard

mis_easy:
ld a, (xcoord)
sub 40
jp z, mis_level1
sub 8
jp z, mis_level2
sub 8
jp z, mis_level3
sub 8
jp z, mis_level4
sub 8
jp z, mis_level5
sub 8
jp z, mis_level6


mis_level1:
ld hl, level1
jp mis_fin
mis_level2:
ld hl, level2
jp mis_fin
mis_level3:
ld hl, level3
jp mis_fin
mis_level4:
ld hl, level4
jp mis_fin
mis_level5:
ld hl, level5
jp mis_fin
mis_level6:
ld hl, level6
jp mis_fin

mis_medium:
ld a, (xcoord)
sub 40
jp z, mis_level7
sub 8
jp z, mis_level8
sub 8
jp z, mis_level9
sub 8
jp z, mis_level10
sub 8
jp z, mis_level11
sub 8
jp z, mis_level12


mis_level7:
ld hl, level7
jp mis_fin
mis_level8:
ld hl, level8
jp mis_fin
mis_level9:
ld hl, level9
jp mis_fin
mis_level10:
ld hl, level10
jp mis_fin
mis_level11:
ld hl, level11
jp mis_fin
mis_level12:
ld hl, level12
jp mis_fin

mis_hard:
ld a, 1
ld (bool_decalage), a
ld a, 20
ld (duree_level), a

call MUR_DEL ; On vire les mur au bord pour les decalage c'est vraiment trop hard
ld a, (xcoord)
sub 40
jp z, mis_level13
sub 8
jp z, mis_level14
sub 8
jp z, mis_level15
sub 8
jp z, mis_level16
sub 8
jp z, mis_level17
sub 8
jp z, mis_level18



mis_level13:
call MUR_INIT
ld a, 0
ld (bool_decalage), a
ld a, 16
ld (modulo_liste), a
ld a, 3
ld (duree_level), a
ld hl, level13
jp mis_fin

mis_level14:
ld a, 1
ld (bool_decalage), a
ld hl, level14
jp mis_fin
mis_level15:
ld a, 1
ld (bool_decalage), a
ld hl, level15
jp mis_fin
mis_level16:
call MUR_DEL
ld a, 1
ld (bool_decalage), a
ld hl, level16
jp mis_fin
mis_level17:
ld a, 1
ld (bool_decalage), a
ld hl, level17
jp mis_fin
mis_level18:
call MUR_INIT
ld a, 0
ld (bool_decalage), a
ld a, 218
ld (modulo_liste), a
ld a, 1
ld (duree_level), a
ld hl, level1
jp mis_fin

mis_fin:

ld (pointeur_sur_liste), hl

ret


; Si on fait un decalage, mettre bool_decalage a 1
bool_decalage:
.db 0

; Affichage de la difficulté
DIFFICULTY_PRINT:
; afficher "easy"
ld a,3
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a, 10
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,easy ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

; afficher "medium"
ld a,3
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,29
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,medium ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

; afficher "hard"
ld a,3
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,48
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,hard ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ret

; Affichage du label "press clear to quit"
HOWTO_QUIT_PRINT:
; afficher "clear to quit"
ld a,56
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a, 1
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,clear_to_quit ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ret


clear_to_quit:
.db "exit = clear",0

; Afficher les cases
CASE_PRINT:
ld b, 3
ld de, 10

cp_categorie:
push bc

ld b, 6 ; 6 niveaux par categorie
ld a, 40
cp_easy:
push bc
push af
push de
ld hl, case
call DRWSPR
pop de
pop af
add a,8
pop bc
djnz cp_easy

ld a, e
add a, 19
ld e, a
pop bc
djnz cp_categorie

call FASTCOPY
call NUM_PRINT

ret

; Afficher les numéros de level dans les cases
NUM_PRINT:

ld a,43
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,11
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,un ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,51
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,11
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,deux ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,59
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,11
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,trois ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,67
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,11
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,quatre ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,75
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,11
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,cinq ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,83
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,11
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,six ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts


; medium
ld a,43
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,30
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,un ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,51
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,30
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,deux ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,59
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,30
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,trois ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,67
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,30
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,quatre ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,75
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,30
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,cinq ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,83
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,30
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,six ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

; hard
ld a,43
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,49
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,un ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts


ld a,51
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,49
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,deux ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,59
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,49
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,trois ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,67
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,49
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,quatre ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,75
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,49
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,cinq ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,83
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,49
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,six ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ret

;; Scan key using direct input
MENU_SCAN_KEY:
ld a,$FF ; Before any action, reset the keyport
out (1),a ; ...by sending to the port 1 the value 255 (FF
ld a,$FE ; select the keyboard group to scan (here the arrow keys)
out (1),a ; ...by sending to the keyboard port (1) the value FE.
in a,(1) ; Get the port value, which says wich keys was pressed
cp 254 ;\
jp z,msk_bot ;|
cp 253 ;| Look for the key which was pressed and jump to the correct label.
jp z,msk_left ;|
cp 251 ;|
jp z,msk_right ;|
cp 247 ;|
jp z,msk_top ;/

jp msk_finloop

; Callback depending on key pressed
msk_top:
ld a,(ycoord)
sub 19
ld (ycoord),a
jp msk_print
msk_bot:
ld a,(ycoord)
add a,19
ld (ycoord),a
jp msk_print

msk_right:
ld a,(xcoord)
add a,8
ld (xcoord),a
jp msk_print
msk_left:
ld a,(xcoord)
sub 8
ld (xcoord),a
jp msk_print

; Passe ici seulement si key press
msk_print:
ld a,(xcoord)
ld e,(ycoord)
call MENU_PROTECT_ARENA

call FOCUS_PRINT

msk_finloop:

ret

; Lorsqu'on presse enter
MENU_SCAN_ENTER:
ld a,$FF ; Before any action, reset the keyport
out (1),a ; ...by sending to the port 1 the value 255 (FF
ld a,$FD ; select the keyboard group to scan (here the arrow keys)
out (1),a ; ...by sending to the keyboard port (1) the value FE.
in a,(1) ; Get the port value, which says wich keys was pressed
cp 254 ;\
jp z, mse_pressed ;|
cp 191 ;\
jp z, mse_clear_pressed ;|

jp mse_finloop

mse_pressed:
ld a, 0
ld (menu_run), a
jp mse_finloop

mse_clear_pressed:
pop af
pop af
jp fin_jeu

mse_finloop:

ret

; Savoir si on presse enter
menu_run:
.db 1



; On affiche le curseur
FOCUS_PRINT:

; effacer la tout le sprite (on l'affichera un pixel plus loin apres)
ld a,(oldxcoord)
ld de,(oldycoord)
ld d,0
ld hl, focus
call CLRSPR

; afficher nouveau sprite
ld hl,(xcoord)
ld de,(ycoord)
ld (oldxcoord),hl
ld (oldycoord),de
ld a,l
ld hl, focus
call DRWSPR
call FASTCOPY
call CASE_PRINT
call DIFFICULTY_PRINT
call HOWTO_QUIT_PRINT

ret

; Init the start position of the focus
FOCUS_INIT:

; start at (16, 16)
ld a, 40
ld (xcoord), a
ld (oldxcoord), a
ld a, 10
ld (ycoord), a
ld (oldycoord), a

; print the focus
call FOCUS_PRINT

ret


; Cette routine permet d'eviter qu'on sorte de l'arene
MENU_PROTECT_ARENA:

ld a,(xcoord)
cp 40
jp m, mpa_hors_arene
cp 81
jp p, mpa_hors_arene
ld a,(ycoord)
cp 10
jp m, mpa_hors_arene
cp 50
jp p, mpa_hors_arene

jp place_valide

mpa_hors_arene:
; Ici on restaure l'ancien placement (pour eviter la sortie d'arene)
ld a, (oldxcoord)
ld (xcoord), a
ld a, (oldycoord)
ld (ycoord), a

mpa_place_valide:

ret



; Une routine pour convertir entier vers texte serait mieux smile
un:
.db "1", 0

deux:
.db "2", 0

trois:
.db "3", 0

quatre:
.db "4", 0

cinq:
.db "5", 0

six:
.db "6", 0

easy:
.db "easy ",$05, 0

medium:
.db "medium ",$05, 0

hard:
.db "hard ",$05, 0


; Srpite du focus (utilise OR routines)
focus:
.db 00000000b
.db 00000000b
.db 00000000b
.db 00000000b
.db 01000000b
.db 01100000b
.db 01100000b
.db 00000000b

; Les cases
case:
.db 11111111b
.db 10000001b
.db 10000001b
.db 10000001b
.db 10000001b
.db 10000001b
.db 10000001b .db 11111111b
Quelques optimisations :

Ce code :
"menu_is_selected"
; Executé lorsque l'on selectionne un level
MENU_IS_SELECTED:

ld a, (ycoord)
sub 10
jp z, mis_easy
sub 19
jp z, mis_medium
sub 19
jp z, mis_hard

mis_easy:
ld a, (xcoord)
sub 40
jp z, mis_level1
sub 8
jp z, mis_level2
sub 8
jp z, mis_level3
sub 8
jp z, mis_level4
sub 8
jp z, mis_level5
sub 8
jp z, mis_level6


mis_level1:
ld hl, level1
jp mis_fin
mis_level2:
ld hl, level2
jp mis_fin
mis_level3:
ld hl, level3
jp mis_fin
mis_level4:
ld hl, level4
jp mis_fin
mis_level5:
ld hl, level5
jp mis_fin
mis_level6:
ld hl, level6
jp mis_fin

mis_medium:
ld a, (xcoord)
sub 40
jp z, mis_level7
sub 8
jp z, mis_level8
sub 8
jp z, mis_level9
sub 8
jp z, mis_level10
sub 8
jp z, mis_level11
sub 8
jp z, mis_level12


mis_level7:
ld hl, level7
jp mis_fin
mis_level8:
ld hl, level8
jp mis_fin
mis_level9:
ld hl, level9
jp mis_fin
mis_level10:
ld hl, level10
jp mis_fin
mis_level11:
ld hl, level11
jp mis_fin
mis_level12:
ld hl, level12
jp mis_fin

mis_hard:
ld a, 1
ld (bool_decalage), a
ld a, 20
ld (duree_level), a

call MUR_DEL ; On vire les mur au bord pour les decalage c'est vraiment trop hard
ld a, (xcoord)
sub 40
jp z, mis_level13
sub 8
jp z, mis_level14
sub 8
jp z, mis_level15
sub 8
jp z, mis_level16
sub 8
jp z, mis_level17
sub 8
jp z, mis_level18



mis_level13:
call MUR_INIT
ld a, 0
ld (bool_decalage), a
ld a, 16
ld (modulo_liste), a
ld a, 3
ld (duree_level), a
ld hl, level13
jp mis_fin

mis_level14:
ld a, 1
ld (bool_decalage), a
ld hl, level14
jp mis_fin
mis_level15:
ld a, 1
ld (bool_decalage), a
ld hl, level15
jp mis_fin
mis_level16:
call MUR_DEL
ld a, 1
ld (bool_decalage), a
ld hl, level16
jp mis_fin
mis_level17:
ld a, 1
ld (bool_decalage), a
ld hl, level17
jp mis_fin
mis_level18:
call MUR_INIT
ld a, 0
ld (bool_decalage), a
ld a, 218
ld (modulo_liste), a
ld a, 1
ld (duree_level), a
ld hl, level1
jp mis_fin

mis_fin:

ld (pointeur_sur_liste), hl
ret


Devient :
"menu_is_selected_optimise"
; Executé lorsque l'on selectionne un level
MENU_IS_SELECTED:

ld a, (ycoord)
sub 10
jp z, mis_easy
sub 19
jp z, mis_medium
sub 19
jp z, mis_hard

ld b, 3

mis_easy:
ld hl, level1
ld a, (xcoord)
sub 32
ld b, 6
mis_loop0:
sub 8
jp z, mis_fin
ld de, 16
add hl, de
djnz mis_loop0

mis_medium:
ld hl, level7
ld a, (xcoord)
sub 32
ld b, 6
mis_loop1:
sub 8
jp z, mis_fin
ld de, 18
add hl, de
djnz mis_loop1

mis_hard:
ld a, 1
ld (bool_decalage), a
ld a, 20
ld (duree_level), a

call MUR_DEL ; On vire les mur au bord pour les decalage c'est vraiment trop hard
ld a, (xcoord)
sub 40
jp z, mis_level13
sub 8
jp z, mis_level14
sub 8
jp z, mis_level15
sub 8
jp z, mis_level16
sub 8
jp z, mis_level17
sub 8
jp z, mis_level18


mis_level13:
call MUR_INIT
ld a, 0
ld (bool_decalage), a
ld a, 16
ld (modulo_liste), a
ld a, 3
ld (duree_level), a
ld hl, level13
jp mis_fin

mis_level14:
ld a, 1
ld (bool_decalage), a
ld hl, level14
jp mis_fin
mis_level15:
ld a, 1
ld (bool_decalage), a
ld hl, level15
jp mis_fin
mis_level16:
call MUR_DEL
ld a, 1
ld (bool_decalage), a
ld hl, level16
jp mis_fin
mis_level17:
ld a, 1
ld (bool_decalage), a
ld hl, level17
jp mis_fin
mis_level18:
call MUR_INIT
ld a, 0
ld (bool_decalage), a
ld a, 218
ld (modulo_liste), a
ld a, 1
ld (duree_level), a
ld hl, level1
jp mis_fin

mis_fin:

ld (pointeur_sur_liste), hl
ret



Et aussi :
"num_print"

; Afficher les numéros de level dans les cases
NUM_PRINT:

ld a,43
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,11
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,un ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,51
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,11
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,deux ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,59
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,11
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,trois ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,67
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,11
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,quatre ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,75
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,11
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,cinq ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,83
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,11
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,six ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts


; medium
ld a,43
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,30
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,un ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,51
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,30
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,deux ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,59
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,30
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,trois ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,67
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,30
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,quatre ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,75
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,30
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,cinq ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,83
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,30
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,six ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

; hard
ld a,43
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,49
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,un ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts


ld a,51
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,49
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,deux ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,59
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,49
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,trois ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,67
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,49
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,quatre ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,75
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,49
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,cinq ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ld a,83
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,49
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,six ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

ret


Devient:
"num_print_optimise"
; Afficher les numéros de level dans les cases
NUM_PRINT:

ld a,43
push af
ld b, 6
ld hl, num
ld (hl), 31h

np_boucle:
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,11
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,num ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

pop af
add a, 8
push af
ld hl, num ; changer le numero
inc (hl)
djnz np_boucle
pop af


ld a,43
push af
ld b, 6
ld hl, num
ld (hl), 31h

np_boucle2:
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,30
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,num ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

pop af
add a, 8
push af
ld hl, num ; changer le numero
inc (hl)
djnz np_boucle2
pop af


ld a,43
push af
ld b, 6
ld hl, num
ld (hl), 31h


np_boucle3:
ld (pencol),a ;charge la valeur de la ligne de texte sur l'écran
ld a,49
ld (penrow),a ;charge la valeur de la colone de texte.
ld hl,num ;charge l'adresse du texte dans hl
call _vputs ;appelle la rom call puts

pop af
add a, 8
push af
ld hl, num ; changer le numero
inc (hl)
djnz np_boucle3
pop af

ret


Ah! Je n'avais pas vu ce fil! Je vais voir ce que je peux faire grin

Je vois tout ce code-ci:
mis_easy:
ld a, (xcoord)
sub 40
jp z, mis_level1
sub 8
jp z, mis_level2
sub 8
jp z, mis_level3
sub 8
jp z, mis_level4
sub 8
jp z, mis_level5
sub 8
jp z, mis_level6
;...
;etc.
Comment arranges-tu les niveaux ? Chaque niveau as de differentes tailles ? Si c'est comme ça, tu peux faire une table:
MENU_IS_SELECTED:
    ld hl,level_table
    ld a,(ycoord)
    ld c,-1
    inc c
    sub 19
    jr nc,$-3   ;si pas de carry, sauter au inc c
    ld b,0      ;bc=0-2, c'est-à-dire, easy (0), medium (1), hard (2)
    ld a,c
    add a,a     ;x2
    add a,c     ;x3
    add a,a     ;x6
    ld c,a      ;bc = 0,6,12
    add hl,bc   ;contient l'addresse du premier niveau de la difficulté choisie
    ld a, (xcoord)
    ld c,-1
    sub 32
    inc c
    sub 8
    jr nz,$-3
    sla c       ;c x 2: bc=0-10, 0=1,2=2,4=3,6=4,8=5,10=6. chaque addresse est deux octets
    add hl,bc   ;maintenant nous savons où nous voulons aller.
;on peut faire:
    ld a,(hl)
    inc hl
    ld h,(hl)
    ld l,a      ;ld hl,(hl)
    jp mis_fin  ;ou ld (pointeur_sur_liste), hl
;ou peut-être
    ld de,pointer_sur_liste
    ldi
    ldi
    ret

level_table:
.dw level1  ;0 - easy
.dw level2
.dw level3
.dw level4
.dw level5
.dw level6
.dw level7  ;6 - medium
.dw level8
.dw level9
.dw level10
.dw level11
.dw level12
.dw level13 ;12 - hard
.dw level14
.dw level15
.dw level16
.dw level17
.dw level18

C'est plus facile si les niveaux ont tous la même taille smile