ARTICLES
30 / 32 |
CHEAT MODE et CLAVIER
J'avais déjà commencé a vous parler des Interférences du Clavier CPC par rapport au cheat mode dans un article précédent.
J'ai repris le tableau de Markus, réorganisé les informations pour coller au plus près de ce que nous allons avoir besoin et j'y ai rajouté quelques informations supplémentaires (numéro de la touche en héxadécimal et Joystick 1).
Voici le résultat :
|
Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
Ligne 0 &40 |
f. &07 |
ENTER &06 |
f3 &05 |
f6 &04 |
f9 &03 |
↓ Curseur Bas &02 |
→ Curseur Droite &01 |
↑ Curseur Haut &00 |
Ligne 1 &41 |
f0 &0F |
f2 &0E |
f1 &0D |
f5 &0C |
f8 &0B |
f7 &0A |
COPY &09 |
← Curseur Gauche &08 |
Ligne 2 &42 |
CTRL &17 |
` Anti-Slash &16 |
SHIFT &15 |
f4 &14 |
} ] &13 |
RETURN &12 |
{ [ &11 |
CLR &10 |
Ligne 3 &43 |
> . &1F |
? / &1E |
* : &1D |
+ ; &1C |
P &1B |
| @ &1A |
= - &19 |
£ † &18 |
Ligne 4 &44 |
< , &27 |
M &26 |
K &25 |
L &24 |
I &23 |
O &22 |
) 9 &21 |
_ 0 &20 |
Ligne 5 &45 |
ESPACE &2F |
N &2E |
J &2D |
H &2C |
Y &2B |
U &2A |
' 7 &29 |
( 8 &28 |
Ligne 6 &46 |
V &37 |
B &36 |
Joy 1 Fire 1 F &35 |
Joy 1 Fire 2 G &34 |
Joy 1 Droite T &33 |
Joy 1 Gauche R &32 |
Joy 1 Bas % 5 &31 |
Joy 1 Haut & 6 &30 |
Ligne 7 &47 |
X &3F |
C &3E |
D &3D |
S &3C |
W &3B |
E &3A |
# 3 &39 |
$ 4 &38 |
Ligne 8 &48 |
Z &47 |
CAPSLOCK &46 |
A &45 |
TAB &44 |
Q &43 |
ESC &42 |
" 2 &41 |
! 1 &40 |
Ligne 9 &49 |
DEL &4F |
Joy 0 Fire 1 &4D |
Joy 0 Fire 2 &4C |
Joy 0 Droite &4B |
Joy 0 Gauche &4A |
Joy 0 Bas &49 |
Joy 0 haut &48 |
A noter que les numéro de ligne vont bien de 0 à 9, par contre, quand on envoie vers le PSG via le PIO, l'octet qu'on écrit est compris entre &40 et &49 parce qu'il faut mettre le bit 6 du port C du PIO à 1 pour que la PSG lise la valeur (via les pins BDIR/BC1).
Maintenant nous allons utiliser ses informations.
Sous émulateur (Sauf avec CPC++), il est impossible a l'heure actuelle d'arriver a activer le cheat mode du jeu "The Untouchables", ce qui est assez frustrant en soit (je tiens a remercier monsieur Johnny OLSEN pour son poke).
Je rappelle le cheat mode :
* CHEAT MODE (Passer le niveau) :
Faire au minimum 2 points pour pouvoir rentrer dans les High-Scores, saisir comme nom "HUMPHREY BOGART" puis appuyer sur la touche ENTER
Lors du retour au menu principal vous verrez le message suivant en haut a gauche "TEST MODE:ACTIVE"
Pendant le jeu enfoncer simultanément les touches suivante du pavé numérique : "3+6+9+.+curseur_droit" (Ne fonctionne que sur un vrai CPC)
Donc nous devons enfoncer simultanément les touches f3, f6, f9, f., curseur droit
|
Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | |
Ligne 0 | f. &07 |
ENTER &06 |
f3 &05 |
f6 &04 |
f9 &03 |
↓ Curseur Bas &02 |
→ Curseur Droite &01 |
↑ Curseur Haut &00 |
|
Valeurs | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | &X10111010 = &BA |
Vous constatez dans le tableau au dessus, que je n'ai gardé que la ligne 0, car toutes les touches qui nous intéresses y sont présente. Chaque colonnes correspond a bit, et une fois les bits assemblé nous aurons une valeur en BINAIRE.
La lecture des valeurs pour la ligne 0, nous donne en BINAIRE &X10111010, ce qui donne en ASSEMBLEUR &BA
Le programmeur fait un CALL &C77A pour scanner les touches et stocker les valeurs à partir de &FFF6
#1A1A CD 35 8F call &8F35 ;vérifier l'activation des touches
#1A1D CA 9E 1B jp Z,&1B9E ;si la vérif est bonne, NIVEAU SUIVANT
;Test si les touches f., f3, f6, f9 et curseur droit sont enfoncées
#8F35 3A F6 FF ld A,(&FFF6)
#8F38 E6 BA and &BA ;//c'est notre &BA que nous pourrons changer
#8F3A C9 ret
;Routine pour le SCANKEYS
#C77A 11 F6 FF ld DE,&FFF6 ;//adresse de stockage pour la 1ère ligne
#C77D 01 0E F4 ld BC,&F40E ;//Initialisation
#C780 ED 49 out (C),C
#C782 06 F6 ld B,&F6 ;//Lecture du 8255 port C
#C784 ED 78 in A,(C)
#C786 E6 30 and &30
#C788 4F ld C,A
#C789 F6 C0 or &C0
#C78B ED 79 out (C),A
#C78D ED 49 out (C),C
#C78F 04 inc B
#C790 3E 92 ld A,&92
#C792 ED 79 out (C),A
#C794 C5 push BC
#C795 CB F1 set 6,C
#C797 06 F6 ld B,&F6
#C799 ED 49 out (C),C
#C79B 06 F4 ld B,&F4
#C79D ED 78 in A,(C)
#C79F 12 ld (DE),A
#C7A0 0C inc C
#C7A1 1C inc E
#C7A2 C2 97 C7 jp NZ,&C797
#C7A5 C1 pop BC
#C7A6 3E 82 ld A,&82
#C7A8 ED 79 out (C),A
#C7AA 05 dec B
#C7AB ED 49 out (C),C
#C7AD C9 ret
#C7AE 2B dec HL
#C7AF 7C ld A;H
#C7B0 B5 or L
#C7B1 20 FB jr NZ,&C7AE
#C7B3 C9 ret
Maintenant il est facile de modifier la façon de passer au niveau suivant.
Nous allons choisir la touche f9.
|
Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | |
Ligne 0 | f. &07 |
ENTER &06 |
f3 &05 |
f6 &04 |
f9 &03 |
↓ Curseur Bas &02 |
→ Curseur Droite &01 |
↑ Curseur Haut &00 |
|
Valeurs | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | &X00001000 = &08 |
Donc maintenant soit vous modifiez votre original en cherchant la chaine 3A F6 FF E6 BA C9 et vous la remplacé par 3A F6 FF E6 08 C9 soit vous faîtes un petit poke &8F39, &08, a vous de voir.
Ici nous avons affaire au système de phrase a saisir pendant la pause du jeu pour activer le CHEAT MODE (un grand merci a monsieur Brice RIVE pour les explications).
Je rappelle le cheat mode pour Double Dragon :
* CHEAT MODE :
Mettre le jeu en pause (DEL) puis taper le mot "RUN LIKE HELL", vous sortirez de la pause automatiquement.
* Changer de personnage :
Le fait de taper plusieurs fois le cheat mode permet d'avoir dans l'ordre :
Vies infinies, gros costaud, Ennemie avec pistolet (Le boss final), Personnage normal
#1437 LD IY,&A7B0 ; Cheat string pointer
#143B CALL &3578 ; Get KBD key pressed
#143E OR A
#143F JR Z,&143B ; Wait for a keypress
; Check for end of Pause by DEL key
#1441 LD B,A ; KBD Column
#1442 CP &80 ; Column 7 ?
#1444 JR NZ,&144C
#1446 LD A,C ; KBD row
#1447 CP &09 ; Row 9 ?
#1449 JR Z,&1489 ; 9/7 = DEL Key -> End of Pause
#144B LD A,B ; Column
; Check for cheat code
#144C CP (IY+&01) ; Compare KBD column
#144F JR NZ,&1437
#1451 LD A,C
#1452 CP (IY+&00) ; Compare KBD row
#1455 JR NZ,&1437 ; Not the right key -> reset the string pointer
#1457 CALL &3578 ; Get KBD key
#145A OR A
#145B JR NZ,&1457
#145D INC IY ; Increment cheat string pointer
#145F INC IY
#1461 LD A,(IY+&00) ; End of cheat string?
#1464 OR A
#1465 JR NZ,&143B ; No -> Continue scanning
; Cheat mode activated
#1467 LD A,(&1497)
#146A INC A
#146B AND &03
#146D LD (&1497),A
#1470 LD HL,&2B9C
#1473 JR Z,&1481
#1475 DEC A
#1476 JR Z,&1481
#1481 LD (&2B6E),HL
#1484 LD (&2B70),HL
#1487 JR &1429 ; Resume gameVoilà les routines qui scannent le clavier.
Le clavier du CPC est connecté au PSG qui, lui même est connecté au PIO.
; Get KBD key
#3578 CALL &13FF ; Read KBD State
#357B LD HL,&008B
#357E LD C,&00
#3580 LD B,&0B
#3582 LD A,(HL)
#3583 OR A
#3584 RET NZ
#3585 INC HL
#3586 INC C
#3587 DJNZ &3582
#3589 RET
; Read KBD State
#13FF LD IX,&008B ; Buffer to store the keymap
#1403 LD BC,&0B00 ; Read 10 lines
#1406 LD H,C
#1407 PUSH BC
#1408 CALL &0B5E ; Read KBD Line
#140B POP BC
#140C LD (IX+&00),A
#140F INC IX
#1411 INC C
#1412 DJNZ &1406
#1414 RET
; Read KBD Line
#0B5E DI
#0B5F LD BC,&F40E
#0B62 OUT C,(C) ; [PIO A] PSG -> Select Reg14
#0B64 LD BC,&F600
#0B67 LD A,&C0
#0B69 OUT A,(C) ; [PIO C] Strobe PSG (latch Addr)
#0B6B OUT C,(C) ; [PIO C] Strobe PSG
#0B6D INC B
#0B6E LD A,&92
#0B70 OUT A,(C) ; [PIO Ctrl] A-In B-In C-Out
#0B72 PUSH BC
#0B73 DEC B
#0B74 LD A,H
#0B75 OR &40
#0B77 OUT A,(C) ; [PIO C] Strobe PSG Read: H->Reg14
#0B79 LD B,&F4
#0B7B IN A,(C) ; [PIO A] Read Kbd line
#0B7D LD H,A
#0B7E POP BC
#0B7F LD A,&82
#0B81 OUT A,(C) ; [PIO Ctrl] A-Out B-In C-Out
#0B83 DEC B
#0B84 OUT C,(C) ; ; [PIO C]
#0B86 LD A,H
#0B87 CPL
#0B88 EI
#0B89 RET
La cheat-string est stockée en numéro de ligne / bit de colonne:
#A7B0
&06 &04 -> R
&05 &04 -> U
&05 &40 -> N
&05 &80 -> ' '
&04 &10 -> L
&04 &08 -> I
&04 &20 -> K
&07 &04 -> E
&05 &80 -> ' '
&05 &10 -> H
&07 &04 -> E
&04 &10 -> L
&04 &10 -> L
00
Au départ, je n'ai pas compris l'histoire du numéro de ligne / bit de colonne. En fait Richard APLIN a été vraiment malin, car sa phrase secréte est complétement invisible via les éditeurs de secteurs.
|
Bit 7 (&80) | Bit 6 (&40) | Bit 5 (&20) | Bit 4 (&10) | Bit 3 (&08) | Bit 2 (&04) | Bit 1 (&02) | Bit 0 (&01) |
Ligne 4 | < , &27 |
M &26 |
K &25 |
L &24 |
I &23 |
O &22 |
) 9 &21 |
_ 0 &20 |
Ligne 5 | ESPACE &2F |
N &2E |
J &2D |
H &2C |
Y &2B |
U &2A |
' 7 &29 |
( 8 &28 |
Ligne 6 | V &37 |
B &36 |
Joy 1 Fire 1 F &35 |
Joy 1 Fire 2 G &34 |
Joy 1 Droite T &33 |
Joy 1 Gauche R &32 |
Joy 1 Bas % 5 &31 |
Joy 1 Haut & 6 &30 |
&06 &04 -> R
Le &06 c'est le numéro de ligne, pas de soucis.
Le &04 en fait doit se lire : &X00000100 qui donnera &04 (Bit 2 activé)
&05 &40 -> N
Le &06 c'est le numéro de ligne, pas de soucis.
Le &40 en fait doit se lire : &X01000000 qui donnera &40 (Bit 6 activé)
&04 &10 -> L
Le &04 c'est le numéro de ligne, pas de soucis.
Le &40 en fait doit se lire : &X00010000 qui donnera &10 (Bit 4 activé)
Je rappelle le cheat mode pour Corsarios phase 1 :
* CHEAT MODE (Récupérer de l'énergie lorsqu'un adversaire nous touche) :
Enfoncer simultanément E+V
Nous allons essayer de simplifier l'activation du cheat mode (qui est déjà bien simple soit dit en passant).
Dans ce jeu, le programmeur a choisit de tester chaque touche indépendemment en utilisant la valeur de la touche.
On se référe au tableau créé au début de l'article et nous obtenons les valeurs suivantes :
E = touche &3A
V = touche &37
#141E 3E 3A ld A,&3A ;la touche "E"
#1420 CD AF 0F call &0FAF ;verification
#1423 C8 ret Z ;touche non appuyé on quitte
#1424 3E 37 ld A,&37 ;la touche "V"
#1426 CD AF 0F call &0FAF ;verification
#1429 C8 ret Z ;touche non appuyé on quitte
#142A 3E 63 ld A,&63
#142C 32 62 7E ld (&7E62),A ;poke &7E62,&63 (Energie a 99)
#142F C9 ret
On peut donc remplacer l'activation par la touche E ou V, il suffit de donner la même valeur de touche a tester 2 fois (je sais, je sais, on aurai aussi pu supprimer le C8 en #1423 et dans ce cas là, uniquement la touche "V" sera utile, il n'y a jamais une seule solution)
On remarquera que la routine de test des touches dans le jeu est similaire dans la conception a celle présenté dans le jeu "The Untouchables" (une bonne piste pour chercher dans d'autres jeux).
Article rédigé par Kukulcan avec l'aide de Brice RIVE et Johnny OLSEN
Article créé le : | Mardi 17 Décembre 2013 à 15 h 10 |
Dernière mise à jour le : | Mardi 24 Décembre 2013 à 22 h 01 |