22Fermer24
chickendudeLe 10/06/2011 à 19:32
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).