par 1
...etc
pousser2nd:
.db 0
Voici une petite explication du code: ld hl,pousser2nd
cp k2nd ;si on a poussé 2nd
jr z,_2nd
ld (hl),0 ;si nous sommes ici, c'est qu'on ne pousse pas 2nd
...
_2nd:
ld a,(hl) ;retrouver le valeur de "pousser2nd"
or a ;or a = cp 0 (on pourrait aussi écrire "and a"), mais plus vite et plus petit.
ret nz ;si pousser2nd n'est pas 0 (c'est á dire, s'il est 1), nous n'avançons pas, nous quittons.
inc (hl) ;si on avance, il faut accroître pousser2nd
Ce que nous faisons: premièrement il faut voir si on a poussé 2nd. Si oui, nous allons à _2nd. Là, nous voyons si on a déjà poussé 2nd avec le variable pousser2nd. Si son valeur n'est pas 0, on l'a déjà poussé et ne l'a pas encore laissé, alors, nous ret (où jr/jp, ce que tu voudras).
ld hl,_2nd
cp k2nd ;si on a poussé 2nd
jr z,_2nd
ld (hl),0 ;$00 = nop
...
_2nd:
nop
ld (hl),$C9 ;je crois que C9 = ret. Quand on arrive ici, nous mettons $C9 (le valeur hex de "ret") au octet préalable.
...etc
Ici, quand on pousse 2nd, nous changeons le nop à ret (c'est "code automodifiable"). La prochaine fois qu'on y va, on ne pourra entrer à cause du "ret". C'est seulement quand on l'aura laissé qu'on pourra y accéder de nouveau, car alors on changera le ret pour un nop ($00, ce n'est qu'un petit délai).