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

ARTICLES

17 / 21

UBI SOFT : Protection sur E.X.I.T.

Voir la fiche du jeu E.X.I.T

 

Comprends 2 protections : une protection software et une protection matérielle qui mesure la taille du gap3 de la piste 0.

 

Brice RIVE, l'auteur du jeu E.X.I.T. nous a déssamblé le code et a rajouté quelques explications pour que nous puissions comprendre le principe de cette protection qui cause tant de soucis sur les émulateurs (sauf sur CPC++, émulateur CPC créé par Brice RIVE).

 

A noter que pour la protection fonctionne correctement, il faut que la l'émulation du READTRACK soit correcte.

 

Le header du loader:

00001200-> 00 55 42 49 20 20 20 20 20 42 41 53 00 00 00 00   .UBI     BAS....  
00001210-> 00 00 02 00 00 00 40 00 62 03 26 43 00 00 00 00   ......@.b.&C....

-> Load address 4000
-> Exec address 4326


Protection soft :

Commence en 4326 et finit par un jump en E000

4326 DI

4327 LD   BC,7F0F
432A LD   A,54
432C OUT  C,(C) [Ga]
432E OUT  A,(C) [Ga]
4330 DEC  C
4331 JP   P,432C

4334 LD   HL,4341
4337 LD   DE,F6F6
433A LD   BC,0040
433D PUSH DE
433E LDIR
4340 RET

F6F6 DI
F6F7 LD   SP,F6C0
F6FA LD   HL,0000
F6FD LD   DE,436B
F700 PUSH DE
F701 LD   A,04
F703 LD   R,A
F705 LD   A,R
F707 XOR  (HL)
F708 LD   (HL),A
F709 INC  HL
F70A JP   NC,F705
...
F70A JP   NC,F705
F705 LD   A,R
F707 XOR  (HL)
F708 LD   (HL),A
F709 INC  HL
F70A JP   NC,F705

F705 RET

4311 LD   BC,7FC0
4314 OUT  C,(C) [Ga]
4316 LD   SP,BFFE
4319 LD   HL,429D
431C LD   DE,D000
431F LD   BC,0074
4322 PUSH DE
4323 LDIR
4325 RET

D000 LD   IX,4000
D004 LD   HL,3E80
D007 LD   DE,C000
D00A LD   C,50
D00C CALL D049
    D049 LD   A,(IX+00)
    D04C RET
D00F CALL D04D
    D04D XOR  iX
    D04F XOR  Ix
    D051 XOR  L
    D052 XOR  H
    D053 INC  IX
    D055 RET
D012 LD   (0038),HL
D015 LD   B,A
D016 RLA
D017 JR   NC,D036

D02E LD   A,H
D02F OR   L
D030 JP   NZ,D00C
D033 JP   E000      -> Fin de la protection soft

D036 CALL D049
    D049 LD   A,(IX+00)
    D04C RET
D039 CALL D04D
    D04D XOR  iX
    D04F XOR  Ix
    D051 XOR  L
    D052 XOR  H
    D053 INC  IX
    D055 RET
D03C LD   (DE),A
D03D INC  DE
D03E DEC  HL
D03F PUSH AF
D040 CALL D056
D043 POP  AF
D044 DJNZ D03C
D046 JP   D02E
    D056 LD   A,E
    D057 CP   C
    D058 RET  NZ
    D059 PUSH HL
    D05A LD   HL,07B0
    D05D ADD  HL,DE
    D05E EX   DE,HL
    D05F POP  HL
    D060 LD   A,D
    D061 CP   7B
    D063 RET  NC
    D064 PUSH HL
    D065 LD   HL,0050
    D068 ADD  HL,DE
    D069 EX   DE,HL
    D06A POP  HL
    D06B LD   A,C0
    D06D OR   D
    D06E LD   D,A
    D06F LD   A,50
    D071 ADD  C
    D072 LD   C,A
    D073 RET


 

Protection hard

E000 DI
E001 CALL E023          ; read 400 bytes off of track 0 and store them in 4000
E004 LD   HL,4202       ; First gap byte (after 2-byte CRC)
E007 LD   BC,00FF       ; count until a 00 or a FF
E00A LD   E,FF
E00C LD   A,(HL)
E00D INC  HL
E00E INC  E
E00F CP   C
E010 JR   Z,E015
E012 CP   B
E013 JR   NZ,E00C
E015 LD   A,E
E016 AND  FE
E018 CP   72            ; did we count &72 gap bytes (&4E)
E01A JP   Z,E0CA        ; Good!!!
E01D LD   BC,7F89
E020 OUT  C,(C) [Ga]
E022 RST  0 [RESET] ; BOOM!!!!

Here's the intersector data at 4200:
00000000-> 7C 09 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E   |.NNNNNNNNNNNNNN  
 00000010-> 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E   NNNNNNNNNNNNNNNN
 00000020-> 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E   NNNNNNNNNNNNNNNN
 00000030-> 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E   NNNNNNNNNNNNNNNN
 00000040-> 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E   NNNNNNNNNNNNNNNN
 00000050-> 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E   NNNNNNNNNNNNNNNN
 00000060-> 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E   NNNNNNNNNNNNNNNN
 00000070-> 4E 4E 4E 4E 00 00 00 00 00 00 00 00 00 00 00 00   NNNN............
 00000080-> 1A 1A 1A FE 00 00 C2 02 45 AC 4E 4E 4E 4E 4E 4E   ........E.NNNNNN
 00000090-> 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E 4E   NNNNNNNNNNNNNNNN
 000000A0-> 00 00 00 00 00 00 00 00 00 00 00 00 1A 1A 1A FB   ................
 000000B0-> 00 38 06 1F 01 08 01 0B 15 06 14 15 00 00 00 00   .8..............
 000000C0-> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
 000000D0-> 00 58 06 1F 01 07 01 0B 15 06 14 15 00 00 00 00   .X..............
 000000E0-> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
 000000F0-> 00 39 06 1F 01 06 01 0B 15 06 14 15 00 00 00 00   .9..............

The key is that the Gap#3 on track 0 is 0x72 instead of 0x42

; read 400 bytes off of track 0 and store them in 4000
E023 LD   BC,FA7E
E026 PUSH BC
E027 LD   A,01
E029 OUT  A,(C) [FDC motor]
E02B LD   HL,E0B4    ; 02 4A 00 - ReadID
E02E CALL E06C       ; -> 00 00 00 00 00 C6 02
E031 LD   A,(BE4C)
E034 BIT  3,A        ; Drive not ready?
E036 JR   NZ,E02B
E038 LD   HL,E0B9    ; 02 07 00 - Recalibrate
E03B CALL E06C         ; execute FDC command
E03E LD   HL,E0B7    ; 01 08 - SenseInt
E041 CALL E06C       ; execute FDC command
E044 LD   A,(BE4C)   ; ST3
E047 BIT  5,A        ; Seek End ?
E049 JR   Z,E03E
E04B LD   HL,E0BC    ; 03 0F 00 00 - Find Track
E04E CALL E06C       ; execute FDC command
E051 LD   HL,E0B7    ; 01 08 - SenseInt
E054 CALL E06C       ; execute FDC command
E057 LD   A,(BE4C)   ; ST3
E05A BIT  5,A        ; Seek End?
E05C JR   Z,E051
E05E LD   HL,E0C0    ; 09 42 00 00 00 FF FF FF FF FF - Read track
E061 LD   DE,4000
E064 CALL E06F      ; execute FDC command -> 4000
E067 POP  BC
E068 XOR  A
E069 OUT  A,(C) [FDC motor]
E06B RET

; execute FDC command (data in BE4C, up to 0400 bytes)
E06C LD   DE,BE4C
; execute FDC command at HL, data to DE, up to 0400 bytes
E06F LD   B,(HL)
E070 INC  HL
E071 PUSH BC
E072 LD   A,(HL)
E073 INC  HL
E074 CALL E096 ; write byte to FDC
E077 POP  BC
E078 DJNZ E071
E07A LD   BC,FB7E
E07D LD   HL,0400
E080 IN   A,(C) [FDC Status]
E082 BIT  4,A
E084 RET  Z
E085 CP   C0
E087 JR   C,E080
E089 INC  C
E08A IN   A,(C) [FDC Data]
E08C LD   (DE),A
E08D INC  DE
E08E DEC  C
E08F DEC  L
E090 JR   NZ,E080
E092 DEC  H
E093 JR   NZ,E080
E095 RET

; write byte to FDC
E096 PUSH AF
E097 PUSH AF
E098 LD   BC,FB7E
E09B IN   A,(C) [FDC Status]
E09D ADD  A
E09E JR   NC,E09B
E0A0 ADD  A
E0A1 JR   NC,E0A6
E0A6 POP  AF
E0A7 INC  C
E0A8 OUT  A,(C) [FDC Data]
E0AA DEC  C
E0AB LD   A,0A
E0AD DEC  A
E0AE JR   NZ,E0AD
E0B0 POP  AF
E0B1 RET

 

Article créé le : Dimanche 19 Janvier 2014 à 15 h 58
Dernière mise à jour le : Dimanche 19 Janvier 2014 à 16 h 29
 
 

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.