Shoot ... Again
n°18Par Dominique Pessan
Classé sixième, par nos amis britanniques, dans le top ten des meilleurs jeux d'arcades sur Oric, MANIC MINER méritait bien son bâton de maréchal ( oui, je sais Monsieur Spock, de joie ! Bâton de joie!)
L'état des lieux.
Ma version du jeu, n'est visiblement pas une version originale... ( bon...) . Un seul bloc entre #500 et #A000 constitue le jeu. Mais plusieurs modules ont été "rassemblés" car les espaces libres ne manquent pas . Si votre version est constituée de plusieurs modules, vous adapterez facilement ce qui suit.
La gestion du clavier, originale, encore une fois, est située en $773 et est appelée deux fois dans le jeu. Une première fois en $6C7 pour gérer les pauses et une seconde fois en $705 pour tout le reste.
La gestion du clavier.
Ce qui est original, c'est le nombre de touches qu'il est possible d'utiliser pour chaque action. Voyez plutôt :
Gauche: Q,E,T,U,O,[ Droite : W,R,Y,I,P,],® ¯
Saut : Z,W,C,V,BN,M,<,>,? Pause : A,S,D,F,G
Music : H,J,K,L,:,' et return.
Sur un clavier QWERTY, on remarque tout de suite la logique " en lignes" de ces choix. Seulement la logique des touches n'est pas celle de la matrice lignes / colonnes utilisée pour la lecture du clavier et il va falloir retrouver nos petits.
Voici le listing commenté de cette routine.
0773 A2 09 LDX #$09 0775 A9 00 LDA #$00 Initialise $76, $77, $78, $79, 0777 95 76 STA $76,X $7A, $7B, $7C, $7D, $7E, $7F 0779 CA DEX à zéro. 077A 10 FB BPL $0777 077C A9 08 LDA #$08 Init. le compteur de colonnes 077E 85 06 STA $06 à huit. 0780 A9 00 LDA #$00 Init le compteur de touches, 0782 85 0E STA $0E à zéro. 0784 A2 7F LDX #$7F Première colonne testée 0786 A0 07 LDY #$07 Compteur de lignes. 0788 86 07 STX $07 Sauve "numéro" de colonne 078A A9 0E LDA #$0E N° de registre I/O du 8912 078C 20 4C 07 JSR $074C SP qui écrit le contenu de X dans le registre du 8912 dont le n° est dans A 078F 8C 00 03 STY $0300 Ecrit le n° de ligne sur le port B 0792 AD 00 03 LDA $0300 Teste si touche enfoncée par 0795 29 08 AND #$08 lecture du bit 3 de ORB
0797 85 0C STA $0C Le résultat est sauvé en $C 0799 AD 00 03 LDA $0300 puis on refait le test ,le résultat 079C 29 08 AND #$08 doit être identique 079E C5 0C CMP $0C sinon on recommence... 07A0 D0 F0 BNE $0792 ( je sais pas à quoi ça sert ...) 07A2 29 08 AND #$08 On reteste le bit 3 ( Ouf ! ) 07A4 F0 13 BEQ $07B9 Si on n'a pas appuyé 07A6 A6 0E LDX $0E Si oui, X contient l'index touches 07A8 BD C9 07 LDA $07C9,X et on va lire une valeur 07AB C9 09 CMP #$09 spécifique à chaque touches 07AD 90 05 BCC $07B4 dans une table. Si cette valeur 07AF 85 7F STA $7F est inférieure à 9 on va en 7B4 07B1 4C B9 07 JMP $07B9 Sinon on saute. 07B4 AA TAX La valeur devient Index 07B5 A9 FF LDA #$F On charge A avec #FF 07B7 95 76 STA $76,X Une des cases entre$76 et $7F ( fonction de X, donc de la touche) est mise à FF. 07B9 A6 07 LDX $07 Récupère le n° de colonne 07BB E6 0E INC $0E Incréménte le pteur de touches 07BD 88 DEY Décrémente le pteur de lignes 07BE 10 C8 BPL $0788 S'il reste des lignes, on boucle 07C0 8A TXA Sinon, on change de colonne 07C1 38 SEC en décalant d'un bit vers la 07C2 6A ROR la droite le bit à zéro du motif 07C3 AA TAX adressant une colonne 07C4 C6 06 DEC $06 Décrémente le ptr de colonnes 07C6 D0 BE BNE $0786 Tant qu'il reste des colonnes 07C8 60 RTS Quand y'en a plus ...

Voici la table en $7C9.
07C9 3D 01 00 01 85 02 03 33
07D1 04 03 01 01 5C 32 00 02
07D9 86 03 7F 00 FF 02 05 31
07E1 07 FF 08 07 FF 06 FF FF
07E9 02 00 01 00 2D 34 03 02
07F1 30 03 00 02 84 02 01 35
07F9 83 80 01 02 39 36 00 02
0801 38 01 00 02 82 02 81 37
Chaque ligne de cette table peut-être considérée comme une colonne de la matrice clavier et chaque colonnes comme une ligne ( vous suivez ?) Le tout en partant par la fin ( En haut à gauche ,soit 3D c'est l'intersection de la 7è ligne et de la 7è colonne). Prenons l'exemple des 1, on les trouve :
| Premier 1: | à l'intersection 7è col. / 6è ligne soit W |
| 2è : | " 7ècol./ 4è ligne soit ® |
| 3è : | " 6è col. / 5è ligne soit ] |
| 4è : | " 6è col. / 4è ligne soit ¯ |
| 5è : | " 3è col. / 5è ligne soit P |
| 6è : | " 2è col. / 1è ligne soit R |
| 7è : | " 1è col. / 5è ligne soit I |
| 8è : | " 0è col. / 6è ligne soit Y |
On reconnait l'ensemble des touches de déplacement à droite, pour lesquelles X sera donc égal à 1 . On en conclu que c'est $76,X soit $77 qui sera mis à FF si on veut aller à droite. De même:
| Gauche | X=0 | $76 = #$FF |
| Droite | X=1 | $77 = #$FF |
| Saut | X=2 | $78 = #$FF |
| Pause | X=3 | $79 = #$FF |
| Esc | X=5 | $7B = #$FF |
| Ctrl | X=6 | $7C = #$FF |
| Shift | X=7 | $7D = #$FF |
| Funct | X=8 | $7E = #$FF |
( Vous pouvez vous amuser à retrouver les touches pour X=2 par exemple...)
Nous avons maintenant les valeurs à intégrer à notre routine de lecture de la manette de jeu.
La méthode utilisée.
Comme d'habitude, maintenant, nous allons détourner les deux appels la gestion du clavier, vers notre gestion de la manette de jeu. De manière à être totalement "transparente" pour le reste du jeu, notre routine commence par initialiser la zone des $76 à $ 7F à 0. Vient ensuite, la classique lecture de la position du JS . La table va nous donner l'indice X ( équivalent à la routine clavier ). La suite est un peu nouvelle, on renseigne les cases $76 à 7F en fonction de la position du JS puis on appelle la routine de gestion clavier, en sautant l'initialisation ( $76 - $7F ), avant de retourner au jeu, qui n' y a vu que du feu!
Voici le listing .
3200 A2 09 LDX #$09 Remplace l'initialisation 3202 A9 00 LDA #$00 de cette zone qui aurait 3204 95 76 STA $76,X due être réalisée par le jeu 3206 CA DEX en $773 3207 10 FB BPL $3204 3209 AD 01 03 LDA $0301 320C 48 PHA 320D AD 03 03 LDA $0303 3210 48 PHA 3211 A9 C0 LDA #$C0 3213 8D 03 03 STA $0303 3216 A9 40 LDA #$40 3218 8D 01 03 STA $0301 321B AD 01 03 LDA $0301 321E A8 TAY 321F 29 20 AND #$20 3221 AA TAX Gestion classique du JS 3222 98 TYA 3223 4A LSR 3224 29 0C AND #$0C 3226 8D 2E 32 STA $322E 3229 98 TYA 322A 29 03 AND #$03 322C 18 CLC 322D 69 04 ADC #$04 322F A8 TAY 3230 B9 60 32 LDA $3260,Y 3233 8D 5E 32 STA $325E 3236 8E 5F 32 STX $325F 3239 A0 FF LDY #$FF Valeur à écrire 323B AE 5E 32 LDX $325E Charg X avec déplacement 323E C9 09 CMP #$09 Si aucune action, la table contient 09 3240 F0 02 BEQ $3244 Y'avait 9, donc on saute 3242 94 76 STY $76,X Pas 9, donc valeur pour X et cases adéquates à #$FF 3244 AD 5F 32 LDA $325F Pour test saut 3247 D0 04 BNE $324D Si pas 0, on n'a pas sauté 3249 A2 02 LDX #$02 Si 0, X=2 et 324B 94 76 STY $76,X $78 = #$FF 324D 68 PLA 324E 8D 03 03 STA $0303 3251 68 PLA Récupère l'état du port A 3252 8D 01 03 STA $0301 3255 20 7C 07 JSR $077C Appel gestion clavier, hors 3258 60 RTS initialisation et retour3260 09 09 09 09 09 01 00 09 3268 09 01 00 03 09 01 00 09
La marche à suivre.

1 - Entrez le listing suivant:
10A=#3200:F=#3270:L=100:REPEAT:FOR A=A TO A+15:READ C$
20K=VAL("#"+C$):S=S+K+65536*(S+K>65535):IF A<=F THEN POKE A,K
30NEXT:READ D$:IF S=VAL("#"+D$) THEN L=L+5: UNTILA>F:END
40PING:PRINT"Erreur ligne";L
100DATA A2,09,A9,00,95,76,CA,10,FB,AD,01,03,48,AD,03,03,05E0
105DATA 48,A9,C0,8D,03,03,A9,40,8D,01,03,AD,01,03,A8,29,0B20
110DATA 20,AA,98,4A,29,0C,8D,2E,32,98,29,03,18,69,04,A8,0FDF
115DATA B9,60,32,8D,5E,32,8E,5F,32,A0,FF,AE,5E,32,C9,09,1715
120DATA F0,02,94,76,AD,5F,32,D0,04,A2,02,94,76,68,8D,03,1DC9
125DATA 03,68,8D,01,03,20,7C,07,60,55,55,55,55,55,55,55,221B
130DATA 09,09,09,09,09,01,00,09,09,01,00,03,09,01,00,09,2272
135DATA 55,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,22C7
2 - RUN
3 - SAVE"JSMANIC",A#3200,E#3270
4 - MANICMNR,N
5 - JSMANIC
6 - DOKE#6C8,#3200
7 - DOKE#706,#3200
8 - SAVEU"MANICMNR",A#500,E#A000,T#5FD
Nota : N'oubliez pas de couper la musique... ( touche J ).
