Shoot ... Again n°17

Par Dominique Pessan


Mister WIMPY a vraiment beaucoup de mal à s'en sortir avec son lapin dévoreur de légume . Donnons lui un coup de main en adaptant le jeu au Joy-stick!


Etat des lieux.


La cuisine de Mr Wimpy se trouve en mémoire entre #2DF9 et #87C3. La routine de gestion du clavier est située en # 517F . Elle est appelée de trois points différents du logiciel, qui sont: #3A8D, #48E1 et #520D. Le registre X est défini avant chaque appel.

Listing commenté de cette routine.

517F 48                   Sauve A sur le pile
5180 98       TYA 
5181 48       PHA         Sauve Y sur la pile
5182 8A       TXA         Charge A avec X
5183 29 07    AND #$07    Calcule un numéro

5185 09 B8 ORA #$B8 de ligne de la matrice 5187 8D 00 03 STA $0300 clavier, l'écrit sur ORB 518A 8A TXA Récupère X 518B 4A LSR Trois décalages

518C 4A       LSR         à droite.
518D 4A       LSR 
518E A8       TAY         Transf. ds Y comme index
518F B9 6C 4D LDA $4D6C,Y Charge N° colonne matrice
5192 20 67 51 JSR $5167   Ecrit ce n° ds port I/O du 8912 
		    (SP non décrit ici )
5195 68       PLA
5196 A8       TAY         Récupère Y 
5197 68       PLA         Récupère A
5198 85 27    STA $27     Provisoirement en $27
519A A9 08    LDA #$08    Teste PB3, = 1 si appuis
519C 2C 00 03 BIT $0300   = 0 sinon
519F 08       PHP         Sauve P ( donc Z )
51A0 A5 27    LDA $27     Récupère A
51A2 28       PLP         Récupère Z( test appuis)
51A3 60       RTS         Fin de sous programme.

Ci dessous, le tableau de calcul des numéros de lignes de la matrice clavier et de l'index Y ,de chargement du numéro de colonne.


Appel   X     X           AND#$07   ORA #$B8  lignes  3x LSR     Y      colonnes   Touches 
depuis  hexa  en binaire  0000 0111 1011 1000 b2b1b0  sur X      déci.

$3A8D 0C 0000 1100 0000 0100 1011 1100 4 0000 0001 1 FD < , > $520D 14 0001 0100 0000 0100 1011 1100 4 0000 0010 2 FB < . > 2E 0010 1110 0000 0110 1011 1110 6 0000 0101 5 DF < A > 2A 0010 1010 0000 0010 1011 1010 2 0000 0101 5 DF < Z > $48E3 22& 0010 0010 0000 0010 1011 1010 2 0000 0100 4 EF < Ctrl >

Les "numéros" de colonnes sont lus dans la table située en $4D6C suivante, indexée par Y.

4D6C: FE FD FB F7 EF DF BF 7F Par exemple, si Y = 4 , LDA$4D6C,Y charge bien A avec EF ( le premier élément a pour indice 0 ).

Au retour de ce sous programme, la routine en $3A8D, teste le bit Z du registre d'état par un BEQ puis positionne les bits de l'accumulateur par une série de OU logiques.

Appuis sur < , > : bit 3 à 1 / Appuis sur < . > : bit 2 à 1

Appuis sur < A > : bit 1 à 1 / Appuis sur < Z > : bit 0 à 1

La routine en $520D, fait de même, avec les bits de la case mémoire $92.

La routine en $48E3, teste simplement l'appuis sur < Ctrl > ( Pepper gun ) par BEQ.


La méthode utilisée.


La modification va consister simplement, à détourner les appels de la routine $517F vers notre lecture du JS en $87D0 . Nous y ferons un appel à $517F avant le retour de manière à conserver sans modification la gestion du clavier. Il faudra néanmoins sauter le STA$ 92 en $521B. De même, chaque appel de la gestion clavier étant légèrement différent, nous avons trois points d'entrée à notre routine.

Point 1: $87D0, la routine elle même, gère $92.

Point 2: $ 8815, pour la gestion du tir.


8815 JSR$87D0      Appel routine principale
8818 LDA$882F      Charge case tir
881B CMP#$00       Test si tir ( 0 si tir )
881D PHP	       Sauve résultat du test ( Z)
881E LDA$27        Récupère A, placé là par $5198
8820 PLP           Récupère Z pour le BEQ qui attend
8821 RTS           au retour du SP

Point 3 : $8822, pour la gestion de A .


8822 JSR$87D0      Appel routine principale
8825 PHP           Sauve test appuis touche de $517F
8226 LDA$92        Positionne les bits de A, idem à $92
8828 PLP           Récupère test clavier
8829 RTS           Retour au jeu

Comme pour Ratsplat, les valeurs de la table de lecture de la position du JS sont données par le jeu. Les valeurs intermédiaires ( droite et haut par exemple) ont été calculées par OU logique.

Je ne donne pas le listing désassemblé de la routine principale, elle est très semblable à celle donnée la dernière fois.


La marche à suivre.


1 - Entrez le listing suivant.

10A=#87D0:F=#8840:L=100:REPEAT:FOR A=A TO A+15:READ C$
20 K=VAL("#"+C$):S=S+K+65536*(S+K>65535):IF A<=F THEN POKE A,K
30 NEXT:READ D$:IF S=VAL("#"+D$) THEN L=L+5:UNTIL A>F:END
40 PING:PRINT"Erreur ligne";L
100 DATA 48,98,48,8A,48,AD,01,03,48,AD,03,03,48,A9,C0,8D,05E4
105 DATA 03,03,A9,40,8D,01,03,AD,01,03,A8,29,20,AA,98,4A,0A92
110 DATA 29,0C,8D,FA,87,98,29,03,18,69,04,A8,B9,30,88,85,10BC
115 DATA 92,8E,2F,88,68,8D,03,03,68,8D,01,03,68,AA,68,A8,16A9
120 DATA 68,20,7F,51,60,20,D0,87,AD,2F,88,C9,00,08,A5,27,1CD9
125 DATA 28,60,20,D0,87,08,A5,92,28,60,00,00,00,00,00,00,209F
130 DATA 00,00,00,00,00,06,0A,02,00,05,09,01,00,04,08,00,20CC
135 DATA 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,20CC

2 - RUN
3 - WIMPY,N
4 - Modifier le programme original comme suit.

original         devient      par 

3A8D LDA#$00 LDA#$00 3A8F LDX#$2A LDX#$2A 3A91 JSR$517F JSR$8822 DOKE#3A92,#8822 48E1 LDX#$22 LDX#$22 48E3 JSR$517F JSR$8815 DOKE#48E4,#8815 48E6 BEQ$48F2 5210 LDX#$0C LDX#$0C 5212 LDA#$00 LDA#$00 5214 JSR$517F JSR$87D0 DOKE#5215,#87D0 5217 BEQ$521B BEQ$521D POKE#5218,#04

5 - SAVEU"WIMPY",A#2DF9,E#8840,AUTO


Télécharger  MISTER WIMPY ! Download

la page baton de joie   joystick page