CPC-POWER : CPC-SOFTS - CPCArchives 
Options de Recherche :
 
 
 

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.

 

 

* THE UNTOUCHABLES

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.

 

 

 

* Double Dragon

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 game

Voilà 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é)

 

 

 

* CORSARIOS

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
 
 

CPC-POWER/CPCArchives, projet maintenu par Fredouille.
Programmation par Kukulcan © 2007-2017 tous droits réservés.
Reproduction sans autorisation interdite. Tous les titres utilisées appartiennent à leurs propriétaires respectifs.