Index du Forum
IDENTIFICATION SERVEUR : 10.0.97.65 - CLIENT : 54.167.157.241

 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 

Thunderchopper (ActionSoft Corp, 1987)

 
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
qkumba



Inscrit le: 29 Jan 2012
Messages: 165

MessagePosté le: Mer 11 Jan 2017, 20:59    Sujet du message: Thunderchopper (ActionSoft Corp, 1987) Répondre en citant

This game is a helicopter simulation with missions to destroy targets or rescue people.

We start with a very simple 4-and-4 loader.

Code:
0801                 LDA     #$00
0803                 STA     $41
0805                 LDA     #$04
0807                 STA     $42
0809                 LDA     #$00
080B                 STA     $9B
080D                 LDA     #$1C
080F                 STA     $9C
0811                 LDY     #$FF
0813                 LDA     $C08C,X
0816                 BPL     $0813
0818                 EOR     #$92
081A                 BNE     $0813
081C                 LDA     $C08C,X
081F                 BPL     $081C
0821                 CMP     #$94
0823                 BNE     $0818
0825                 LDA     $C08C,X
0828                 BPL     $0825
082A                 CMP     #$EC
082C                 BNE     $0818
082E                 BEQ     $0841
0830                 SEC
0831                 ROL
0832                 STA     $40
0834                 LDA     $C08C,X
0837                 BPL     $0834
0839                 AND     $40
083B                 STA     ($9B),Y
083D                 EOR     $41
083F                 STA     $41
0841                 LDA     $C08C,X
0844                 BPL     $0841
0846                 INY
0847                 BNE     $0830
0849                 INC     $9C
084B                 DEC     $42
084D                 BNE     $0830
084F                 SEC
0850                 ROL
0851                 STA     $40
0853                 LDA     $C08C,X
0856                 BPL     $0853
0858                 AND     $40
085A                 EOR     $41
085C                 BNE     $0813
085E                 JMP     $1D00


One sector of 768 bytes with prologue of 92 94 EC.

Code:
1D00                 STX     $1E08
1D03                 LDX     #$00
1D05                 LDA     #$A0
1D07                 STA     $800,X
1D0A                 STA     $900,X
1D0D                 STA     $A00,X
1D10                 STA     $B00,X
1D13                 INX
1D14                 BNE     $1D07
1D16                 LDA     $C082
1D19                 LDA     $FBB3
1D1C                 CMP     #$06
1D1E                 BNE     $1D21
1D20                 DEX
1D21                 LDY     #$17
1D23                 LDA     $1D7B,Y
1D26                 JSR     $1D6A
1D29                 STA     $0808,Y
1D2C                 LDA     $1D93,Y
1D2F                 JSR     $1D6A
1D32                 STA     $0908,Y
1D35                 DEY
1D36                 BPL     $1D23
1D38                 LDA     $C055


Display the text message. The text is converted to uppercase on the Apple II+.

Code:
1D3B                 LDA     #$00
1D3D                 STA     $1E00
1D40                 JSR     $1EAD
...
1EAD                 CLC
1EAE                 LDA     $1E00
1EB1                 AND     #$01
1EB3                 ADC     $1E08
1EB6                 TAX
1EB7                 LDA     $C08A,X
1EBA                 JSR     $1FA8


Select drive 1, turn on the drive and wait for spin-up.

Code:
1EBD                 LDA     $1E07
1EC0                 BNE     $1ECB
1EC2                 JSR     $1EEF
...
1EEF                 LDX     $1E08
1EF2                 LDY     #$00
1EF4                 STY     $AF
1EF6                 STY     $B0
1EF8                 DEY
1EF9                 BMI     $1F13
1EFB                 LDY     #$50
1EFD                 LDA     $C080,X
1F00                 TYA
1F01                 AND     #$03
1F03                 ASL
1F04                 ORA     $1E08
1F07                 TAX
1F08                 LDA     $C081,X
1F0B                 LDA     #$56
1F0D                 JSR     $1F79
1F10                 DEY
1F11                 BPL     $1EFD
1F13                 LDA     #$00
1F15                 STA     $41
1F17                 LDA     #$07
1F19                 STA     $42
1F1B                 LDA     #$00
1F1D                 STA     $9B
1F1F                 LDA     #$1F
1F21                 STA     $9C
1F23                 LDA     $C08C,X
1F26                 BPL     $1F23
1F28                 EOR     #$92
1F2A                 BEQ     $1F36
1F2C                 DEC     $AF
1F2E                 BNE     $1F23
1F30                 DEC     $B0
1F32                 BNE     $1F23
1F34                 BEQ     $1EFB
1F36                 LDA     $C08C,X
1F39                 BPL     $1F36
1F3B                 CMP     #$94
1F3D                 BNE     $1F28
1F3F                 LDA     $C08C,X
1F42                 BPL     $1F3F
1F44                 CMP     #$EA
1F46                 BNE     $1F28
1F48                 BEQ     $1F5B
1F4A                 SEC
1F4B                 ROL
1F4C                 STA     $40
1F4E                 LDA     $C08C,X
1F51                 BPL     $1F4E
1F53                 AND     $40
1F55                 STA     ($9B),Y
1F57                 EOR     $41
1F59                 STA     $41
1F5B                 LDA     $C08C,X
1F5E                 BPL     $1F5B
1F60                 INY
1F61                 BNE     $1F4A
1F63                 INC     $9C
1F65                 DEC     $42
1F67                 BNE     $1F4A
1F69                 SEC
1F6A                 ROL
1F6B                 STA     $40
1F6D                 LDA     $C08C,X
1F70                 BPL     $1F6D
1F72                 AND     $40
1F74                 EOR     $41
1F76                 BNE     $1F23
1F78                 RTS


Another 4-and-4 loader, one sector of 1536 bytes with prologue of 92 94 EA.
We're still in simple protection, but we're not done yet.

Code:
1D45                 LDA     #$00
1D47                 STA     $1E03
1D4A                 LDA     #$BC
1D4C                 STA     $1E04
1D4F                 LDA     $1DF2
1D52                 LDX     $1DF3
1D55                 STA     $1E01
1D58                 STX     $1E02
1D5B                 JSR     $2015
...
2015                 JSR     $204F
...
204F                 JSR     $1FDC ;select track
2052                 BCS     $207A
2054                 JSR     $233A ;seek track
2057                 LDA     $1E09
205A                 BNE     $2073
205C                 LDA     #$02
205E                 STA     $40
2060                 JSR     $2154
...
2154                 JSR     $215D
...
215D                 JSR     $23AD
...
23AD                 LDA     $1E0B ;phase
23B0                 LSR
23B1                 TAX
23B2                 LDA     $1E55,X
23B5                 STA     $1E0D
23B8                 LDX     $1E08
23BB                 RTS


That routine fetches from a table the third byte of the prologue to check.
So each track has a different prologue.

Code:
2160                 LDA     $C08D,X
2163                 LDA     $C08E,X
2166                 BMI     $216D
2168                 LDA     #$FF
216A                 STA     $1E0E


Check for write-protect, and set a flag if not protected.

Code:
216D                 LDA     #$03
216F                 LDY     $1E0E
2172                 BEQ     $2176
2174                 LDA     #$00
2176                 STA     $2153


Set retry count based on write-protected or not.
If write-protected, use more tries, if not write-protected, only one try.

Code:
2179                 JSR     $23AD
217C                 LDY     #$20
217E                 STY     $41
2180                 INY
2181                 BNE     $218A
2183                 INC     $41
2185                 BNE     $218A
2187                 JMP     $2282
218A                 LDA     $C08C,X
218D                 BPL     $218A
218F                 CMP     #$92
2191                 BNE     $2180
2193                 NOP
2194                 LDA     $C08C,X
2197                 BPL     $2194
2199                 CMP     #$94
219B                 BNE     $218F
219D                 LDY     #$00
219F                 LDA     $C08C,X
21A2                 BPL     $219F
21A4                 CMP     $1E0D
21A7                 BNE     $218F


Check for prologue that was set earlier, 92 94 xx.

Code:
21A9                 JSR     $2284
21AC                 STA     $2600,Y
21AF                 JSR     $2284
21B2                 STA     $2700,Y
21B5                 JSR     $2284
21B8                 STA     $2800,Y
21BB                 JSR     $2284
21BE                 STA     $2900,Y
21C1                 JSR     $2284
21C4                 STA     $2A00,Y
21C7                 JSR     $2284
21CA                 STA     $2B00,Y
21CD                 JSR     $2284
21D0                 STA     $2C00,Y
21D3                 JSR     $2284
21D6                 STA     $2D00,Y
21D9                 JSR     $2284
21DC                 STA     $2E00,Y
21DF                 JSR     $2284
21E2                 STA     $2F00,Y
21E5                 JSR     $2284
21E8                 STA     $3000,Y
21EB                 JSR     $2284
21EE                 STA     $3100,Y
21F1                 JSR     $2284
21F4                 STA     $3200,Y
21F7                 JSR     $2284
21FA                 STA     $3300,Y
21FD                 JSR     $2284
2200                 STA     $3400,Y
2203                 JSR     $2284
2206                 STA     $3500,Y
2209                 JSR     $2284
220C                 STA     $3600,Y
220F                 JSR     $2284
2212                 STA     $3700,Y
2215                 JSR     $2284
2218                 STA     $3800,Y
221B                 JSR     $2284
221E                 STA     $3900,Y
2221                 JSR     $2284
2224                 STA     $3A00,Y
2227                 INY
2228                 BEQ     $222D
222A                 JMP     $21A9
222D                 JSR     $2284
2230                 STA     $3B00,Y
2233                 INY
2234                 BNE     $222D
2236                 JSR     $2284
2239                 STA     $3C00,Y
223C                 INY
223D                 BNE     $2236
223F                 JSR     $2284
2242                 STA     $3D00,Y
2245                 INY
2246                 BNE     $223F
2248                 JSR     $2284
224B                 STA     $3E00,Y
224E                 ORA     ($FF,X)
2250                 INY
2251                 BNE     $2248
2253                 JSR     $2284
2256                 STA     $3F00,Y
2259                 ORA     ($FF,X)
225B                 INY
225C                 BPL     $2253


Read the nibbles from the track and scatter them across a buffer.
Each byte goes to a different page - byte 0 goes to page 0, byte 1 goes to page 1, byte 2 goes to page 2, ... so sectors are not sequential.
The routine reads $1980 bytes into memory. We need to use the read routine in order to dump the disk. We can't read the sectors directly.

Code:
225E                 LDA     $3B5A
2261                 EOR     #$94
2263                 EOR     $3B5B
2266                 EOR     #$92
2268                 EOR     $3B5C
226B                 EOR     $1E0D
226E                 BNE     $2282


Verify checksum.

Code:
2270                 JSR     $2100
...
2100                 LDA     #$00
2102                 STA     $9F
2104                 LDA     #$3E
2106                 STA     $A0
2108                 LDY     #$00
210A                 STY     $A1
210C                 STY     $A2
210E                 LDA     ($9F),Y
2110                 CMP     #$FF
2112                 BEQ     $2127
2114                 CMP     #$92
2116                 BEQ     $212F
2118                 LDA     #$00
211A                 STA     $A1
211C                 STA     $A2
211E                 INY
211F                 BNE     $210E
2121                 INC     $A0
2123                 BNE     $210E
2125                 BEQ     $212F
2127                 INC     $A1
2129                 BNE     $212D
212B                 INC     $A2
212D                 BNE     $211E
212F                 LDX     $1E0B
2132                 SEC
2133                 LDA     $A1
2135                 SBC     $1E0F,X
2138                 STA     $A1
213A                 LDA     $A2
213C                 SBC     $1E10,X
213F                 TAX
2140                 BEQ     $2147
2142                 INX
2143                 BNE     $214D
2145                 LDA     #$FF
2147                 EOR     $A1
2149                 CMP     #$05
214B                 BCC     $2152
214D                 LDA     #$FF
214F                 STA     $1E0E
2152                 RTS


Here we go, the real protection. This routine scans the buffer full of nibbles, starting near the end, to find the #$92 from the prologue.
That value will occur when the track wraps around during the read. If the original track was full of timing bits to stretch out the space, a copy will discard the timing bits and fill with sync bytes instead.
That will cause the track to exceed $1980 bytes in length before the wrap-around occurs, and then the #$92 won't be seen. Instead, the game will read random memory until it finds one.
That might include reading card space, which can cause disk or video corruption or crashes.
If the #$92 is seen, then the routine looks in a table of track lengths, to compare the found distance with the expected distance.

So to defeat this protection, we need a 6-and-2 loader which is fine because there is plenty of room. For this routine, we just set the success flag and return.
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 : phpBB-fr.com