On m'a fait une demande spécifique pour supprimer les 'cracktro'. J'ai pensé qu'il serait intérrésant de partager les MODs. Pas de gros tuto en perspective, on essaye d'aller à l'essenciel. à faire avec un simple Amiga 500 avec ou sans extention mémoire plus une Action Replay MKIII (de préference). Le tout est bien sûr possible sous WinUae ou autre émulateur avec les bon fichiers (adf, kickstart, image rom de la MKIII) Bon bidouillage Une demande spécifique ? Envoyé un mail. Gi@ntsMagic Pockets Switchblade II Jumping Jack'Son North & South Torvak the Warrior Shadow of the Beast Apprentice Rick Dangerous II Turrican Lemmings
Test du jeu : Mini trackload et affichage d'un message de crack.Magic Pockets v1.00 (1991-09-18)(Renegade)[cr SR].adfCRC32:BEF526E1RT 0 1 20000 ; Lecture de la 1er Track du disk vers la zone mémoire $20000D 20000+C ; D comme disassemble, commande récurente dans ces mini-tuto. ; Elle ne sera pas forcément indiqué dans ces tutos.2000C MOVEA.L 4.S,A6 20010 MOVE.W #2,1C(A1) ; Trackdisk.device en lecture20016 MOVE.L #40000,28(A1) ; Adr. mémoire de dest = $400002001E MOVE.L #1600,24(A1) ; $1600 de Data chargée donc, 1 Track sous l'AR20026 MOVE.L #1600,2C(A1) ; à partir de 1a 1er track2002E JSR -1C8(A6) ; Execution du trackload20032 MOVEM.L D0-D7/A0-A6,(A7) ; Sauvegarde des registres20036 JSR 40000 ; Execution du code trackloadé2003C MOVE.W #100,DFF096 ; Conf DMACON20044 MOVEM.L A7+,D0-D7/A0-A6 ; On restore les valeurs des registres... Bon, plus simple, il n'y a pas. On bypass tout simplement l'execution du code trackloadé.A 20036 ^20036 NOP ^20038 NOP ^2003A NOP BOOTCHK 20000 WT 0 1 20000
Switchblade II (1991)(Gremlin)[cr CPY].adfCRC32:79746312RT 0 1 20000 D 20000+C ; Assez rapidement on isole l'execution du mini-boot (pas besoin de grande explication)A 2017C ^2017C BRA 20180 ; On saute le mini-boot (affichage du texte 'THE COMPANY' sur fond bleu) On continu en cherchant le fond d'écran bleu, on cherche logiquement DFF180, trés vite on arrive en :204A2 MOVE.L A0,DFF180 A 204A2 ^204A2 NOP ; On desactive le 'fader' d'écran bleu^204A4 NOP ^204A6 NOP On peut voir un joli trackload20186 MOVE.W #2,1C(A1) ; Trackdisk.device en lecture2018C MOVE.L #1800,24(A1) ; $1800 de Data chargée donc, 2 Tracks sous l'AR20194 MOVE.L #40000,28(A1) ; Adr. mémoire de dest = $400002019C MOVE.L #400,2C(A1) ; à partir de 1a 1er track, du 1er bloc.201A4 JSR -1C8(A6) ; Execution du trackload... 201EA JSR 40000 ; Execution du code trackloadé... 201F6 JMP 70000 ; Chargement du jeu Une fois le TrackLoad effectué, on analyse le code en 70000... 70142 JSR 60000 70148 MOVE.L #70272,70296 ; Début de la musique... On en profite pour virer la musique du début car, sur le jeu original, cette musique apparait au chargement de l'intro/animation du début du jeu. Intro/animation plus présente sur ce crack (manque de place?), donc, inutile de garder la musique ? Modification du bootsecteur en consequence :A 201F6 ^201F6 MOVE.L #4E714E71,$70148 ; Patch pour ne pas avoir la ziq de l'intro originale.^20200 MOVE.L #4E714E71,$7014C ;^2020A MOVE.L #4E714E71,$70150 ;^20214 JMP 70000 *Bien sûr, si on veux garder la musique, on ne met que je JMP 70000BOOTCHK 20000 ; Calcul du checksum pour le bootsecteurWT 0 1 20000 ; Ecrire de la track
Jumping Jack'Son (1990)(Infogrames)[cr MAD].adfCRC32:4ECB20DCCD S ; Nous sommes ici en presence d'un format AmigaDos standardLM startup-sequence, 20000 ; On charge et on regarde la startup-sequenceDEL startup-sequence ; Bon... facile, on enleve l'execution du fichier M.A.D qui est l'exec de la cracktro* ; On supprime le fichier sur la disquetteSM startup-sequence, 20006 2005F ; et on sauve le tout sans l'execution de ce fichier.* ; *(présent donc au début du fichier startup-sequence)
North & South (1989)(Infogrames)(M5)[cr CP].adfCRC32:C4DE7E53RT 0 1 20000 Apres un appel au Trackdisk.device, est executé un joli JSR vers l'adresse de chargement du Trackload.... 20020 MOVE.L #50000,28(A1) ; Adr de destination mémoire20028 MOVEA.L 4.S,(A6) ; Trackdisk.device en mode lecture2002C JSR -1C8(A6) ; TrackLoad de la cracktro... 20038 JSR 50000 ; Execution du code Trackloadé (la cracktro donc) Il suffit donc de desactiver cet appel:A 20038 ^20038 NOP ^2003A NOP ^2003C NOP BOOTCHK 20000 WT 0 1 20000
Test du jeu : Plusieurs trackload en cascade et lancement de la cracktro.Torvak the Warrior (1990)(Core)(Disk 1 of 2)[cr HZ].adfCRC32:4FD6FCE6RT 0 1 20000 ... 2000C BRA 20012 20012 .... 2001E BRA 20028 -> 20028 MOVE.W #0,DFF18 ; Background en noir20030 MOVEA.L #4,A6 ; On recharge l'exec base au cas ou. (sert à rien au boot, mais bon...)20036 MOVE.L #78000,28(A1) ; Adr. mémoire de dest = $780002003E MOVE.L #1000,24(A1) ; $1000 donné chargée donc, 1 Track sous l'AR20046 MOVE.L #400,2C(A1) ; à partir de 1a 1er track, du 1er bloc2004E MOVE.W #2,1C(A1) ; Trackdisk.device en lecture20054 JSR -1C8(A6) ; Execution du trackload... 2006E JMP 780000 ; Execution du code Trackloadé On pause une dead-loop en 2006E, on re-calcul le checksum, et on re-écrie le boot.A 2006E ^2006E BRA 2006E BOOTHK 20000 WT 0 1 20000 On reboot, on entre dans l'AR et on regarde en $7800078000 MOVE.W #8210,DFF096 ; Conf DMACON... 78020 BSR 7802A 78024 JMP 7000 On pause un BreakPoint en 78024 et on saute au code en 78000BS 78024 G 78000 Le trackLoad continu et se termine, puis l'on atteint notre BeakPoint On retourne au codeX Aucun trackload visible mais execution de la cracktro On peut donc en déduire que :78020 BSR 7802A ; Chargement de la cracktro78024 JMP 7000 ; Sous routine d'execution de la cracktro D'ailleurs, on regarde de plus prêt :D 7000 7000 JSR 12300 ; Execution de la cracktro (faite le test avec un BS, vous verrez)7006 BRA 7024 ; Execution du chargement du jeu. Il faut donc supprimer ce JSR 1230 par des NOP Mais la réel question c'est... ou t'é kilai ? :=))) Bon, méthode brutale, on va charger les données de la disquette et chercher, tout simplement. Déjà on note l'OpcodeD 7000 4E B9 00 01 23 00 60 1C 00 00 00 02 4E B9 00 01 23 00 = JSR 12300 60 1C = BRA 7024 Le reste on s'en fiche mais ca nous permet d'être sur de bien tomber sur la sequence hexa. On charge, on cherche. Je part du principe que l'on a un A500 sans extension donc 512 Ko de libre Mais... il y a le systeme et les zones à eviter donc on va y aller molo avec 384 Ko de donnée a charger. Une track AmigaDos a une taille de $1600 = !5632 Elle contient 11 secteurs (tjrs sur une disquette AmigaDOS) Sans oublier qu'il y a deux faces et 80 pistes. Donc, juste pour info, cela nous donnes : !5632*2*80=901 120 Octet soit diviser par 1024 : 880Ko par disquette de donnée. Rappel de base : 1Ko = 1024 Octets o_O' Donc, revenons à nos moutons. 384*1024=393216 Octets 393216/5632=69 track, aller, on arrondi à 70 Let's GoRT 0 !70 10000 F 4E B9 00 01 23 00 60 1C 00 00 00 02, 10000 ; On cherche notre sequence hexa Rien ! suivantRT !70 !70 10000 Bingo ! trouvé en 2D400 Mais on à chargé à l'adr $10000 Donc $2D400-$10000=$1D400 : $1D400=119808 119808/5632=21,27 Et on a deja fait 70 Tracks donc 70+21=91 DoncRT !91 1 10000 F 4E B9 00 01 23 00 60 1C 00 00 00 02, 10000 Trouvé. (logique) en 10600A 10600 ^10600 NOP ^10602 NOP ^10604 NOP Reste plus qu'a re-écrire le tout tjs au même endroitWT !91 1 10000 Et voila :) PS : Penser à desactiver la Dead-Loop dans le Bootsecteur préalablement mis. Sinon ça marchera forcément moins bien :)
Test du jeu : 1er Trackload suivi d'une phase de décompression et lancement de la cracktroShadow of the Beast (1989)(Psygnosis)(Disk 1 of 2)[cr Band][t +2 Band].adfCRC32:F0AE521CRT 0 1 20000 2000C MOVE.W #2,1C(A1) ; Trackdisk.device mode lecture20012 MOVE.L #60000,28(A1) ; Adr. mémoire de dest = $600002001A MOVE.L #F800,24(A1) ; $F800 donné chargée donc, 12 Tracks sous l'AR20022 MOVE.L #BF200,2C(A1) ; à partir de la position disk BF200 $BF200=782848 782848/5632=139 139/2=69.5 ((Piste lue = 69))2002A MOVEA.L 4.S,A6 ;2002E JSR -1C8(A6) ; Début du Trackload20032 MOVEM.L D0-D6/A0-A6,-(A7) ; typique début de code, on sauvegarde les registres20036 BSR 20100 ; On saute un petit peu plus loin dans le code.2003A NOP 2003C MOVEM.L (A7)+,D0-D6/A0-A6 ; On restore les valeurs des registres20040 MOVE.W #2,1C(A1) ; Second Trackload avec des valeurs différentes20046 MOVE.L #68000,28(A1) ; voir quelques lignes au dessus pour comprendre le fonctionement de celui-ci2004E MOVE.L #2C00,2C(A1) ;20056 MOVE.L #1400,24(A1 ) ;2005E MOVEA.L 4.S,A6 20062 JSR -1C8(A6) ; Début du second TrackLoad... 20090 JMP 7FA50 ==================================== 20096 ; (Vide)... 20100 JSR 60020 ; Saut dans le code préalablement trackloadé (voir plus haut), aka : #routine_decomp20106 CLR.W DFF180 2010C CLR.W DFF182 20112 CLR.W DFF184 20118 LEA 7FA00,A0 ; Adr Source2011E LEA 67F00,A1 ; Adr Destination20124 MOVE.W #10,D0 ; Compteur $11*LongWor=$4420128 MOVE.L (A0),(A1)+ ; ==> Boucle de copie2012A DBF D0,20128 ; <== On boucle2012E RTS ==================================== On pose une Dead-Loop à la place du BSR après le trackload Le 1er BSR etant visiblement une boucle de copie.A 20036 ^20036 BRA 20036 BOOTCHK 20000 WT 0 1 20000 D 60020 60020 MOVEQ #0,D7 60022 LEA 60108(PC),A0 60026 LEA DFF180,A5 ; Intéressant car c'est l'adr du fond d'écran (Color00), utilisé par les barres de décompression... 6007C MOVE.W D7,(A5) ; Decomp barre de couleur 1er phase ; 3A 87 44 FC 00 10 E2 90 4E 75 ; à remplacer par un NOP ; 4E 71 44 FC 00 10 E2 90 4E 75... 600FA MOVE.W D0,(A5) ; 3A 80 10 C0 B3 CA 6D E2 4E F9 ; à remplacer par un NOP ; 4E 71 10 C0 B3 CA 6D E2 4E F960100 BLT 600E4 ; <-- Phase de décompression60102 JMP 30000 ; Execution du code décompressé. ; 4E F9 00 03 00 00 78 2A E1 FC 1E 03 06 Ae 07 80 ; Il faudra donc remplacer ce JMP vers notre patch. On pause un BreakPoint en 60102 et on saute en 60020BS 60102 G 60020 Une fois la décompression fini, notre BreakPoint est atteint, on entre automatiquement dans l'AR On regarde en 3000030000 ... 30336 CMPI.L #6,43600 ; Test souris <-- a supprimer30340 BEQ 3040A ; GoTo test_souris_qui_bouge?========================================================= 3040A CMPI.L #1,43604 ; Test souris qui bouge ?30414 BNE 30304 ; pas d'appuie, on boucle --> sinon, on continue à derouler le code de fin de CrackTro pour finir en30500 RTS --> retour en 165E (apres le JSR #routine_decomp)307D5 307D2 LEA 30DC0,A0 ; ça y ressemble.307F5 307F2 LEA 30DC0,A0 ; aussi309F9 309F9 LEA 30DC0,A0 ; et encore aussi :) Au premier abord il parrait simple de 'sauter' les tests souris et laisser le code de la cracktro s'executer. MAIS, on entends furtivement la musique de la cracktro se lancé... Après plusieurs tests et études du code décompacté, le tout semble assez imbriqué. Petit rappel, on cherche à bypasser RAPIDEMENT la cracktro. On on ne vas pas se lancer dans une desactivation une par une des sous-routine de celle-ci. On va faire simple... La musique lancée est, à coup sur, un MODule, on va se servir de l'AR pour chercher où se trouve celui-ci en mémoire.TRACKER Module trouvé : Address 31100 : Slong located in memory : 30DC0 On cherche l'endroit où le code utilise cette adresse :FA 30DC0 On regarde en 307D2 (logiquement car c'est le 1er appel)D 307D2 307D2 LEA 30DC0,A0 ; Adr. du MODule en mémoire307D8 ADDA.L #3B8,A0 ; On saute le header ? du MODule307DE MOVEQ #7F,D0 ; Variable/Compteur de la boucle de copie a venir307E0 MOVEQ #0,D0 307E2 MOVE.L D1,D2 ; ==>307E4 SUBQ.W #1,D0 ; On décrémente notre Compteur en D0307E6 MOVE.B (A0)+,D1 ;307E8 CMP.B D2,D1 ; Check si boucle fini307EA BGT 307E2 ; <== Boucle si pas fini On peut faire simple (crade mais simple). Il suffit de changee le pointeur vers une zone potentielement vide, on change la taille à copier à Zero (double ceinture) Ce qui nous donnes logiquement.307D2 LEA 30DC0,A0 ; l'adresse du module en mémoire. ; 41 F9 00 03 0D C0 D1 FC 00 00 03 B8 70 7F ; a changer par LEA 0,A0 ; 41 F9 00 00 00 00 D1 FC 00 00 03 B8 70 7F307DE MOVEQ #7F,D0 ; la longuer du module à copier ; 70 7F 72 00 24 01 53 40 12 18 B2 02 6E ; à changer par MOVEQ #0,D0 ; 70 00 72 00 24 01 53 40 12 18 B2 02 6E Voila, plus de module à jouer, plus de son du coup :) Ce qui nous donnes pour notre Patch :MOVE.B #60,30340 ; Remplace le BEQ par un BRA du 1er Test souris pour sauter directement au second test sourisMOVE.L #4E714E71,30414 ; Supprime le test de detection 'move_ mousse', pour 'sauter' directement à la fin du code.MOVE.L #00000000,307D4 ; On supprime l'adresse du MODule mis en A0MOVE.B #0,307DF ; On supprime la longueur du MODule mis en D0JMP 30000 ; On saute à l'execution du code décompacté Il faut creer ce code en $1688 (bonne adresse qui est libre pour A500 et A500 avec extension) Ce qui nous donnerait en Opcode13FC00600003034023FC4E714E710003041423FC00000000000307D413FC0000000307DF4EF900030000 On va déja s'attaque en DUR à nos 3 modifications. - Barres de couleur de décompression - Barres de couleur de décompression - Saut à modifier après décomp pour sauter en $1688 Tout ça se trouve dans le code Trackloadé donc, petit rappel (voir plus haut)20022 MOVE.L #BF200,2C(A1) ; à partir de la position disk BF200 $BF200=782848 782848/5632=139 139/2=69.5 ((Piste lue = 69) Sous l'AR on fonctionne en TRACK (de 0 à 160 pour info), et non en terme Piste (0 à 80) Donc on va charger la Track 139 et vue que c'est au début du code (voir plus haut), on ve va finalement chargé qu'une Piste.RT !139 1 20000 ; Desactivation barre couleur decomp #1F 44 FC 00 10 E2 90 4E 75 >2007E A 2007E-2 ^2007C NOP ;Desactivation barre couleur decomp #2F 10 C0 B3 CA 6D E2 4E F9 >200FA A 200FC-2 ^200FA NOP ; Modification du jump vers notre code mémoire en $1688F 4E F9 00 03 00 00 78 2A E1 FC 1E 03 ... >20102 M 20102 ^20102 4E F9 00 00 16 88 ... On re-écrie le tout.WT !139 1 20000 Pour finir, on revient à notre Patch. Patch à placer dans le Bootsecteur AVANT le BSR 20100 On recharge le Bootsecteur et on déplace le code d'origineRT 0 1 20000 TRANS 2003A 20130 30000 A 20036 ^20036 MOVE.L #13FC0060,1688 ^20040 MOVE.L #00030340,168C ^2004A MOVE.L #23FC4E71,1690 ^20054 MOVE.L #4E710003,1694 ^2005E MOVE.L #041423FC,1698 ^20068 MOVE.L #00000000,169C ^20072 MOVE.L #000307D4,16A0 ^2007C MOVE.L #13FC0000,16A4 ^20086 MOVE.L #000307DF,16A8 ^20090 MOVE.L #4EF90003,16AC ^2009A MOVE.W #0000,16B0 ^200A2 BSR 20100 Et on recopie le tout à la suiteTRANS 30000 3005C 200A4 TRANS 300C6 300F6 20100 ; et comme on a de la place entre, autant laisse le code en 20100 en 20100 :)BOOTCHK 20000 WT 0 1 20000
Test du jeu : Après un rapide chargement, la cracktro est decompacté et lancé.Apprentice (1990)(Rainbow Arts)[cr SR - Valhalla][h Decay][t +1 SR - Valhalla].adfCRC32:A586093ERT 0 1 20000 20000C MOVE.W #2,1C(A1) ; Trackdisk.device en lecture20012 MOVE.L #30000,28(A1) ; Adr. mémoire de dest = 300002001A MOVE.L #400,2C(A1) ; à partir de 1a 1er track, du 1er bloc20022 MOVE.L #1800,24(A1) ; $1800 donné chargée donc, 2 Tracks sous l'AR2002A JSR -1C8(A6) 2002E JMP 30000 On pose une Dead-Loop pour travailler en direct :A 2002E 2002E BRA 2002E BOOTCHK 20000 WT 0 1 20000 On reboot, on entre dans l'AR, on regarde en 30000 Execution d'un trap #0 pour boucle de copie.################################# 3002C MOVEQ #76,D0 ; Taille de la boucle (76+1) = 77.. 3002E MOVE.L (A3)+,(A4)+ ; Boucle de copie en long word, donc $77 * 4 = $1DC bytes à copier... 30030 DBF D0,3002E ; On boucle.################################# On regarde globalement le reste du code qui est visiblement un code de decompression. En 30212 cela ne ressemble plus à du code. //Zone de donnée 'compressé' de 30212 à 3174C Sur le code de décompression beaucoup de JMP (A4), (A5), (A6) et un seul en (A0)301F2 JUMP (A0) Test avec BreakPoint en 301F2 (ou deadLoop). C'est bien le jump effectuée en fin de decompression qui sautera en A0 à savoir 2E000 Il faudra à coup sur changer celui-ci vers notre patch. Soucis, le JMP(A0) est codé sur 2 octets, nous il nous en faudra à coup sur 6, donc 4 de plus il faut donc déjà dans un premier temps, décaller tout le code de 4 bytes. On part de la fin bien sûr, donc dabord les 'DATA'TRANS 30212 3174C 40000 ; On déplace vers une zone tampon en 40000TRANS 40000 4153A 30216 ; Et on replace au même endroit mais +4 (donc 30212+4=30216) Maintenant les deux derniers routines.TRANS 301F4 30212 40000 TRANS 40000 4001E 301F8 'Time to modify the' JMP(A0) $1688 est une bonne adresse, il y a souvant rien.A 301F2 ^301F2 JMP 1688 ; Sautera à la fin de la décompression en $1688, notre futur patch. Dans le code executé au début du $3000, en TRAP 0, on peu voir à la fin de ce cette partie un :3007E JMP (A4) et juste au dessus3006E LEA 301F4(PC),A4 Ce jump ne fonctionnera pas vue que l'on a tout déplacer de 4 bytes, il faut donc le changer.A 3006E ^3006E LEA 301F8(PC),A4 ; on a fait plus 4 donc on fait aussi +4 ici Ainsi celui qui pointe sur les deux routines à la fin du code principal, juste avant le début des DATA *Toutes ces appels se trouve avec la commande FAA 3018A ^3018A LEA 30216(PC),A5 ; Même logique que précédement, donc +4 Sans oublier d'ajouter +4 aux donne copié au début du code en 30000A 3002C 3002C MOVEQ #77,D0 ; Comme la boucle de copie fonctionne en LongWord (voir plus haut) ; il faut ajouter +1 et pas +4, donc 76+1=77 On supprimer les barres de couleurs (rechercher DFF180 on tombe sur A3, on regarde ce qui modifie A3 et on tombe rapidement sur)30208 MOVE.W D3,(A3) à changer par un NOPA 30208 ^30208 NOP On recharge le bootRT 0 2 20000 Et on écrase par notre code modifié.TRANS 30000 31750 20400 Extra Info : Analyse du code decompressé (pose d'un BS à la fin de la décompression 301F2) Rappel : Saute en (A0) = 2E0002E000 BRA 2E00A --> 2E00A MOVEM.L D1-D7/A0-A6,-(A7) ; Typique début de code, on sauve les regitres dans la pile..... 2E020 MOVE.L #2E6C8,DFF080 ; Ras à l'écran2E02A MOVE.W #85D0,96(A5) ; Ras à l'écran2E030 MOVE.W #20,96(A5) ; Début affichage CrackTro <-- A changer vers un bra fin de Cracktro 'pour l'instant pas encore trouver)2E036 ... ; Début code copper and co de la cracktro... ; La cracktro attends que l'on appuie sur un des boutons de la souris, donc test de BFE001 à coup sur. Facile à trouver :) ; Bingo quelques lignes plus loin.2E05C BTST #6,BFE001 ; Test bouton gauche appuyé ?2E064 BNE 2E036 ; Nop, on boucle sur la routine de la cracktro2E066 CLR.L 24.S ; C'est partie pour le chargement du jeu, on doit donc sauter à cette adresse. On doit donc changer le code en 2E030 par un BRA 2E066 Ce qui nous donne comme pacth en 16881688 MOVE.L #60340000,30(A0) ; A0 car à ce moment la il pointe vers le début du code décompacté (voir plus haut) et notre saut à modifier est en (A0)+30 = 2E0301690 JMP (A0) ; On remet le saut d'origine En Opcode ca nous donnes :21 7C 60 34 00 00 00 30 4E D0 On code ça dans notre bootsecteur :A 2002E ^2002E MOVE.L #217C6034,1688 ; OPCODE d'un MOVE.L #60340000,30(A0)^20038 MOVE.L #30,168C ; Début OPCODE d'un JMP (A0)^20042 MOVE.L #4ED00000,1690 ; Fin OPCODE d'un JMP (A0)^2004C JMP 30000 ; On retourne au code décompacté avec l'OPCODE d'origineBOOTCHK 20000 WT 0 2 20000
Test du jeu : Après un rapide chargement, la cracktro est decompacté et lancé.Rick Dangerous II (1990)(Micro Style)[cr PDX][t +7 SSP]CRC32:4BD19492RT 0 1 20000 ; Lecture de la 1er Track du disk vers la zone mémoire $20000;====================== 2000C MOVE.L 20078(PC), DFF080 ;20014 CLR.W DFF088 ; ho le joli code de fader.... 20074 BRA 20080 ; Hop, on saute en 20080 tiens donc;====================== 20080 BRA 20174 ; et hop encore un saut vers 20174 qui nous amène vers un trackload;====================== 20174 MOVE.W #2,1C(A1) ; TrackLoad information2017A MOVE.L #30000,28(A1) ;20182 MOVE.L #70C00,2C(A1) ;2018A MOVE.L #7E00,24(A1) ;20192 JSR -1C8(A6) ; On lance le trackload2019A JSR 30000 ; Et on saute dans le code tracklodé (logiquement la cracktro)201A0 MOVEM.L (A7)+,D0-D7/A0-A6 ; Cht'i travail avec la pile201A4 ... bla bla bla 201BC BRA 20088 ; Lancement de la partie decomp du jeu ?;====================== Bon... plus simple c'est difficile. On va desactiver le JSR en 2019AA 2019A A 2019A ^2019A NOP ^2019C NOP ^2019E NOP ^201A0 [ENTER] BOOTCHK 20000 WT 0 1 20000 Un chtit reboot et c'est plié.
Test du jeu : Après un rapide chargement, la cracktro est lancé puis une second trackload et le jeu est lancé.Turrican (1990)(Rainbow Arts)[cr VF][t +9 Supplex](Disk 1 of 2)CRC32:471FEEFCRT 0 1 20000 D 20000+c 2000C MOVE.W #2,1C(A1) 20012 MOVE.L #60000,28(A1) ; Adr. mémoire de dest = $600002001A MOVE.L #8400,24(A1) ; $8400 de Data chargée, donc 6 Tracks de $1600 de longueur initial20022 MOVE.L #58000,2C(A1) ; Position raw_disk, 64eme track (donc 32 piste)2002A MOVEA.L 4.S,A6 2002E JSR -1C8(A6) ; 1er Trackload20032 JSR 60000 20038 MOVE.W #2,1C(A1) 2003E MOVE.L #60000,28(A1) ; Adr. mémoire de dest = $6000020046 MOVE.L #17E00,24(A1) ; 17E00 de Data chargée, soit environ 100 Ko2004E MOVE.L #2C00,2C(A1) ; Position raw_disk20056 MOVEA.L 4.S,A6 2005A JSR -1C8(A6) ; Second Trackload2005E MOVE.L #4EF90007,60104 ; Patch d'un JMP20068 MOVE.W #C4A0,60108 ; patch again ?20070 LEA 60000,A0 ;20076 MOVE.L A0,80 ;2007C TRAP #0 ; Et on lance le tout en 60000 Desactiver le JSR en 20032, hélas, ne fonctionne pas. Le jeu se lancera bien mais rapidement on aura un joli Guru. La crackTro doit definir/patcher certaines choses à coup sur. On va donc patcher celle-ci pour se lancer de suite sans attendre l'appui sur la souris. On reboot sur la disquette et sous la cracktro, on entre dans l'ARD 6041E <- On arrive quelque part dans cette zone mémoire..... 6043C RTS ;====================BS 6043C X Très vitre notre BreakPoint est atteint, on saute à la prochaine instuction.ST 600B0 BSR 607DA 600B4 BTST #0,D0 600B8 BEQ 600AC 600BA BTST #1,D0 600BE BEQ 600CC ... 600EA RTE ;===================== On pose nos breakpoints et on test pour voir qui est appelé et pourquoi.BS 600AC <- Atteint sans rien faire en 1erBS 607DA <- Atteint sans rien faire en 2ndBS 600CC <- Atteint quand on click sur 'Start Game' Ok, simple, on va patcher tout ça.RT !64 6 60000 ; On charge cracktro vers la meme zone memoire original.A 600AC ^600AC BRA 600CC ; Et on saute direct à la fin du code de la cracktro trouvé au dessus.^600AE NOP ^600B0 [ENTER] On re-ecrie le tout sur le disque et hop, c'est dans la poche.WT !64 6 60000
Test du jeu : Trackload suivi d'une phase de décompression + lancement de la cracktro pour ensuite trackload encore et lancer le jeu.Lemmings (1990)(Psygnosis)[cr SKR](Disk 1 of 2).adfCRC32:074BC441RT 0 1 20000 D 20000+C 2000C BSR 200B0 ; On saute en 200B0 pour le lancement de la cracktro20010 NOP 20012 MOVEA.L #70000,A5 20018 MOVE.W #2,1C(A1) 2001E MOVE.L A5,28(A1) 20022 MOVE.L #CA000,2C(A1) 2002A MOVE.L #1200,24(A1) 20032 JSR -1C8(A6) ; Lancement du second TrackLoad,le jeu sans doute. ...D 200B0 ... ;============================== ; SousRoutine de trackload de la cracktro200B0 MOVEA.L 4.S,A6 200B4 MOVE.L #70000,28(A1) ; Adr. mémoire de dest = $70000200BC MOVE.W #2,1C(A1) ; Trackdisk.device en lecture200C2 MOVE.L #CC000,2C(A1) ; Source Position disk = 94em track (piste 74 donc)200CA MOVE.L #3A00,24(A1) ; Taille à charger $3A00200D2 MOVE.L A1,-(A7) ; Une petite sauvegarde de (A1)200D4 JSR -1C8(A6) ; on lance le trackload200D8 JSR 70008 ; Lancement du code trackload (crackro compressé)200DE MOVEA.L (A7)+,A1 ; on remet tout bien200E0 MOVEA.L 4.S,A6 ;200E4 RTS ; Et on retourne en 20010 pour le second trackload (le jeu);============================== A 200D8 ^200D8 NOP ^200DA NOP ^200DC NOP ^200D8 [ENTER] BOOTCHK 20000 WT 0 1 20000 15/09/2022