Index du Forum

 FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres   Groupes d'utilisateursGroupes d'utilisateurs   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

Brimstone (Synapse Software, 1985)

Poster un nouveau sujet   Répondre au sujet     Index du Forum -> PROTECTION MALEFIQUE
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message

Inscrit le: 29 Jan 2012
Messages: 176

MessagePosté le: Sam 02 Jan 2016, 20:50    Sujet du message: Brimstone (Synapse Software, 1985) Répondre en citant

Brimstone is a text adventure, where you play the part of a knight who must collect five magic words which will help to defeat the villain.
The game is much more difficult than the protection. ;-)

When the game is started, it asks for a word from the manual. This is normally trivial to defeat, but this time, the check is implemented in the p-code of the game.
The interpreter looks like this:

209F    JSR     $3D99
20A2    LDY     #$00
20A4    LDA     ($88),Y
20A6    LSR
20A7    LSR
20A8    STA     $30AF ;save secondary opcode
20AB    LDA     ($88),Y
20AD    AND     #$03
20AF    STA     $209D ;save primary opcode
20B2    JSR     $0E97
20B5    LDA     ($88),Y
20B7    AND     #$80
20B9    LSR
20BA    LSR
20BB    LSR
20BC    LSR
20BD    ORA     $209D
20C0    STA     $209D
20C3    LDA     ($88),Y
20C5    AND     #$08
20C7    LSR
20C8    ORA     $209D
20CB    STA     $209D
20CE    LDA     ($88),Y
20D0    AND     #$77
20D2    STA     $209E
20D5    JSR     $0E97
20D8    LDY     $209D
20DB    LDA     $2463,Y
20DE    STA     $90
20E0    BNE     $20E5
20E2    JMP     $21A6
20E5    LDY     #$00
20E7    LDX     #$00
20E9    LDA     ($88),Y
20EB    STA     $43FC,X
20EE    JSR     $0E97
20F1    INX
20F2    CPX     $90
20F4    BNE     $20E9
20F6    LSR     $90
20F8    LDY     #$00
20FA    LDA     $209E
20FD    AND     $2477,Y
2100    BNE     $2105
2102    JMP     $2174
2174    LDA     $2473,Y
2177    AND     $209E
217A    BEQ     $219E
217C    TYA
217D    PHA
217E    ASL     A
217F    TAX
2180    LDA     $43FC,X
2183    CLC
2184    ADC     #$7D
2186    STA     $92
2188    LDA     $43FD,X
218B    ADC     #$47
218D    STA     $93
218F    LDY     #$00
2191    LDA     ($92),Y
2193    STA     $43FC,X
2196    INY
2197    LDA     ($92),Y
2199    STA     $43FD,X
219C    PLA
219D    TAY
219E    INY
219F    CPY     $90 ;copy parameters for opcode
21A1    BCS     $21A6
21A3    JMP     $20FA
21A6    LDA     $209D
21A9    ASL
21AA    TAY
21AB    LDA     $2443,Y ;primary opcode table
21AE    STA     $90
21B0    LDA     $2444,Y
21B3    STA     $91
21B5    LDA     #$21
21B7    PHA
21B8    LDA     #$BD ;resume address is $21BE
21BA    PHA
21BB    JMP     ($0090) ;dispatcher
21BE    LDA     $30AF
21C1    ASL
21C2    TAY
21C3    LDA     $2850,Y
21C6    STA     $90
21C8    LDA     $2851,Y
21CB    STA     $91
21CD    LDA     #$20
21CF    PHA
21D0    LDA     #$9E
21D2    PHA
21D3    JMP     ($0090)

The opcodes are stored two per byte, 2 bits each. There are two tables for handlers, because they do the same thing but then branch to different places.

After performing a long side-by-side comparison to step through the code, we eventually find this sequence:

0C 00 D4 41

When we step over this one, the code branches to quite different addresses, depending on if the answer is correct or not.

Since the low two bits are zero, we are interested in upper ones, so the second table. That table looks like this:

2850    .WORD $247B
2852    .WORD $2503
2854    .WORD $2531
2856    .WORD $2558

The top two bits have the value 3, so we check the last entry.

2558    LDA     $484B
255B    ORA     $484C
255E    BEQ     $2531
2560    RTS

Ah, checking the result of an earlier comparison. We want the branch to be taken always, but we can't change the handler because it would affect everything.

Instead, we need to change the opcode to use an unconditional branch instead, to $2531. And how nice - the previous entry in the table is exactly that address, so we change the opcode from $0C to $08, and it does what we need.

Still, the game complains about the wrong word. There is another check later. It looks like this:

0C 00 4C 43

and requires the same change. Then the game works.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet     Index du Forum -> PROTECTION MALEFIQUE Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum

Powered by phpBB © 2001, 2005 phpBB Group
Traduction par :