DELIVERANCE (c) 21st Century Entertainment

DELIVERANCE (c) 21st Century
Entertainment

Nécessite :

1. un AMiGA ou WINUAE (Configuration: 2Mo de CHIP!!!)
2. une ACTION REPLAY III (ou l?image de la ROM)
3. le jeu Original ou les images CAPS (2 disquettes)
4. un Assembleur (ASM-One / Trash-M One / Seka ou similaire)


eh oui, de retour pour un autre tutoriel MFM … Deliverance est
un jeu sur 2 disques avec un format de piste spécial de $18A0 octets sur
chaque piste.
la table de correspondance de fichier qui contient toutes les informations à
propos des positions des fichiers sur ces disquettes est stockée directement dans
le bootblock à l?offset $200.


pour regarder vite fait la table de fichier lisons la première piste du disque 1
en utilisant notre Action Replay bien-aimée…


Tapez: rt 0 1 50000 et faites entrée…
Après que la piste ai été chargée, faites comme montré dans l?image ci dessous pour
voir le dump en hexa de la table de fichier!



comme ça on peut voir que les positions de fichier sont stockées
comme des positions d?octets normales.


par exemple le premier fichier commence depuis la position disque $18A0 et finit à
la position $A44C,
le second fichier commence en $A44C
(la fin du premier fichier bien sûr) et finit en $C5CF et ainsi de
suite… le dernier fichier se termine en $1EB7A4 qui représente une valeur de
plus de 2 Mo ce qui veut dire que les deux disquettes de jeu sont complètement
remplies!

bon comment j?ai su où se trouvait la table de fichier sur le disque?! jetons
un oeil dans le bootcode qui commence en $5000C.


Tapez: d $5000C
et tapez entrée… faites défiler quelques lignes jusqu?à ce que vous voyez
ceci:



la première partie du bootblock vérifie si vous avez au moins 1 Mo
de ram installé sur votre ordinateur (non montré sur l?image), autrement le bootcode
bouclera sans fin.


mais si vous êtes l?heureux propriétaire d?une extension mémoire dépassant les 512
ko, le jeu allouera $1200
octets de mémoire pour le reste de la piste 0 ($400 octets du bootblock,
$1200
octets d?autre code = $1600
octets de la longueur d?une piste DOS normale) et puis lire ces $1200 octets en
utilisant le trackdisk device.


vous pouvez voir l?appel AllocMem() en $50076
et l?appel  DoIO() pour lire les $1200
octets en $50098!!!
enfin en $5009C
il copie la table de fichier depuis la position du boot $200 jusqu?en
mémoire haute.


si vous regardez de plus près à l?adresse $5007A juste après l?appel AllocMem()
vous reconnaîtrez que le  résultat de cette appel, qui est en fait
l?adresse des $1200
octets du bloc mémoire, est poussé sur la pile! en $500AC, après que
la table de fichier ai été copiée, l?instruction RTS qui suit amène la
dernière adresse depuis la pile et continue l?execution à cette position. donc
en fait c?est notre JMP vers le bloc mémoire alloué!!

donc la partie importante de la piste 0 commencera surement à l?offset $400. désassemblons
cet endroit en utilisant d $50400,
suivi d?entrée…



bon ça a l?air très familier tout ça hein?! un numéro de fichier
est donné en D0, l?adresse de chargement en A0 et puis une routine
est appelée qui charge surement le numéro de fichier spécifié dans son
emplacement mémoire.

comme je l?ai découvert, le numéro de fichier #3 est une
sorte de code de jeu principal qui inclut également un autre chargeur de piste
qui marche de la même façon que celui-ci.

pour continuer le désassemblage du code où le "JMP $8(A4)"
en $5044A
nous emmènera alors, on va écraser cette instruction avec une boucle de
branchement. donc si on boote le jeu le programme s?arrêtera à cet endroit  comme
ça on peut trouver ou pointe a4+8


Insérez l?instruction branche et écrivez la piste 0 modifiée sur la
disquette de jeu comme montré ci dessous sur l?image:



IMPORTANT:
si vous utilisez une autre configuration mémoire que 2 Mo de CHIP les adresses
qui sont montrées à partir de maintenant diffèreront!!!

Réinitialisez votre machine maintenant et laissez le jeu booter jusqu?à ce que
notre boucle de branchement soit lancée … vous remarquerez ceci si vraiment
rien ne se passe! ;D

maintenant activez votre Action Replay à nouveau et jettez un oeil
sur les registres en utilisant r et entrée…


Si la configuration mémoire ci dessus est celle utilisée alors A4 pointera
vers l?adresse $86800,
ainsi notre saut continuera vers le code en $86808 !!!

désassemblons le code avec d $86808 suivi d?entrée…

Vous devrez aller descendre quelques pages plus bas jusqu?à ce que
vous voyez enfin ce code:



On peut voir les fichiers #6, #0 et #5 qui sont chargés en
utilisant un chargeur de piste à l?adresse $8D334.
Maintenant pour choper le contenu des disquettes on va regarder ce que fait le
chargeur de pistes… désassemblons le code du chargeur de pistes avec d $8D334.



maintenant on va se servir de ce chargeur de pistes pour choper
toutes les données des disques.


On va mettre un breakpoint de suite en $8D352
comme ça l?AR s?active avant que le chargeur de piste soit appelé…
puis on va changer les paramètres du chargeur et avant de continuer l?exécution
on va mettre un autre Breakpoint en $8D356,
l?instruction juste après le retour du chargeur de piste. ainsi on est prévenu
quand le chargeur de piste a terminé et on peut choper les pistes avant que le
jeu les décompresse!


On ne sauvera aucun fichier sur disquette cette fois et on va même pas coder
une nouvelle image de disquette aujourd?hui… 😉 on va choper les pistes et
les écrires directement depuis la mémoire sur nos disquettes fraîchement
formatées!


comme je l?ai dis quelques lignes avant, les deux disquettes de jeu sont
complètement remplies avec des données donc on devra utiliser une troisième
disquette pour faire tenir toutes les données du jeu sur notre déplombage. maintenant
réfléchissons à la façon dont on va répartir les données sur ces trois disques….
revenez à la table de fichier, j?ai décidé de diviser les données comme suit:


DISK 1 $000000$0B7976
DISK 2 $0B7976
$182E7E
DISK 3 $182E7E
$1EB7A4



ainsi pour notre nouveau chargeur on va d?abord vérifier que la
position des fichiers sur disque est par ex. plus petite que $B7976 parce que si
c?est vrai, le fichier appartient à la disquette 1. est-ce que la position de
fichier est plus petite que $182E7E,
le fichier appartient à la disquette 2. autrement c?est sur le disque 3 ! 😉


Bon d?accordddd, commençons à créer la disquette déplombée #1.


on peut pas sortir de l?AR avec x de suite pasqu?on est bloqué dans
notre boucle. pour continuer dans le code du jeu on doit sauter à l?adresse stockée
en a4 + 8!
étant donné que A4 pointe vers $86800
on va quitter l?AR en faisant g $86808
suivi d?entrée…


maintenant le jeu commence à lire les pistes (ce qui se fait dans la foulée)
entrez dans l?AR à nouveau pour mettre notre breakpoint obligatoire comme ceci…
bs $8D352
suivi par entrée…


sortez de l?AR à nouveau et attendez jusqu?à ce que l?AR s?affiche… si cela
se produit, regardons les regs pour voir que le chargeur de pistes veut faire…
hum… charger 🙂 …



on sait grâce au code désassemblé du chargeur de piste, que D1
pointe vers le début du fichier sur la disquette. comme on peut le voir le jeu
veut charger le fichier #0 de suite pasqu?il commence en $18A0 !!! on n?a
pas besoin de toucher cette valeur alors, le Fichier #0 est la bonne
position de départ pour la mise en oeuvre de notre rippe!


la valeur stockée en D0 est la taille du fichier, $8BAC dans le cas
de notre fichier #0. maintenant étant donné que l?on veut ripper plus
que simplement le fichier #0, on va changer la valeur en D0 de
manière à ce que le chargeur de piste lise tout les octets que l?on veut
stocker sur notre disquette déplombée #1 ($B7976 bytes).

pour faire en sorte que le chargeur lise tout depuis $18A0$B7976 on définit
la valeur en D0 en $B7976$18A0 (toutes les
étapes sont montrées dans l?image ci-dessous) !!! enfin on va changer l?adresse
de chargement du fichier (stocké en A0) en $918A0


maintenant vous pouvez vous demander, mais pourquoi putain charger les données
en $918A0
et pas en $90000
?!??

comme on le sait, le fichier #0 commence sur la disquette
de jeu à la position $18A0.
je vais donc sauver les pistes sur notre disquette déplombée à partir de $90000 plus tard
pour être sûr que le fichier #0 a aussi la bonne position de départ sur
notre disquette déplombée!


donc… si vous changez les regs comme décrit vous pouvez enfin définir le breakpoint
à l?adresse juste après le renvoi du chargeur de piste avec bs $8D356, suivi par
entrée…


quittez l?AR maintenant et attendez que le chargeur de piste ait fini le boulot…
vous serez prévenu par l?activation de l?aR! 😉



maintenant que le chargement de piste est terminé vous pouvez
vérifier que tout s?est bien déroulé en examinant la mémoire à l?adresse $918A0 à
l?identique de l?image ci-dessus.


Après ça je continue en lisant la piste 0 en $90000 de manière
à ce qu?on ait un dump complet de la disquette de jeu 1 allant de $0$B7976 en mémoire!


maintenant avant de sauver ça sur notre disquette déplombée #1 on va devoir
écraser notre boucle de branchement que l?on a mise sur la disquette originale pasqu?on
ne veut pas que notre déplombage boucle ! 😉 faites comme c?est montré dans
l?image dessous et enfin…


Insérez une disquette déplombée formatée #1 dans le lecteur df0: et
sauvez tout ça en faisant:

wt 0 !134 90000


on sauve 134 pistes parce que… !134 * !5632 (taille de
piste dos) = !754688 ($B8400)
… ainsi c?est ok pour notre plage allant de $0$B7976 !


maintenant la création des disquettes déplombées #2 et #3 est même
encore plus facile… revenez dans la partie de ce tutorial où on boote la
disquette de jeu originale #1 et suivez à nouveau toutes les étapes de manière
à ce que votre AR s?active juste avant que le chargeur de piste soit appelé…
pour créer la disquette déplombée #2, changez les paramètres de chargement
comme ceci:



quittez l?AR et si le chargement de piste est terminé, sauvez les
pistes sur la seconde disquette déplombée comme ceci:
wt 0 !148 90000 suivi d?entrée …
pour créer la disquette déplombée #3, changez les  paramètres de
chargement comme ceci:



sortez de l?AR et si le chargement de piste est terminé, sauvez
les pistes sur notre troisième disquette déplombée comme ceci:
wt 0 !77 90000 suivi d?entrée …


On est enfin arrivés au moment ou les disquettes originales ne
sont plus nécessaires!!!


maintenant la seule chose qui reste à faire, c?est d?insérer notre
propre chargeur de piste qui gère les pistes dos normales. pour faire ça, réinitialisez
votre machine et bootez votre assembleur favori, en espérant que ce soit ASM-One.
;D


pour rendre la chose plus simple pour vous, j?ai inclus le code source tout
entier dans l?archive .zip avec le binaire du chargement de piste.


Donc… réservez quelques kilo-octets de Memchip et lisez le source (en
utilisant la commande r) fourni avec ce tutorial. appuyez sur *ESC* pour
basculer en mode editeur, vous devriez vous quelque chose comme ceci: 😉



maintenant voilà ce que je fais dans le source:
avant que l?on lance ce code source on va lire la première piste de notre
disquette déplombée manuellement en mémoire au label piste0:

après que l?on puisse exécuter le code qui ne fait qu?écraser le
premier chargeur de piste du jeu avec notre nouveau chargeur à partir du label Nouveauchargeur:
au label Nouveauchargeurfin:


maintenant ce chargeur vérifie lui-même si le jeu veut charger le fichier #4.
si c?est le cas, le code principal du jeu inclut le second chargeur de piste (stocké
dans le fichier #3) se trouve déjà décompressé en mémoire. puis notre
chargeur se copie lui-même en mémoire en $7FC00,
une région mémoire qui n?est pas utilisée par le jeu et met un JMP $7FC00 sur la
première instruction de la deuxième routine de chargement de piste. comme ça on
a pas besoin de toucher le second chargeur compressé sur la disquette.

le code source avec les commentaires est ci-dessous:


LEA Nouveauchargeur(PC),A0 ; pas d?explications ici, copie
simplement le nouveau chargeur!
LEA piste0+$566,A1
MOVE.L #(Nouveauchargeurfin-Nouveauchargeur)-1,D0
REmPLACEchargeur:
MOVE.B (A0)+,(A1)+
DBF D0,REmPLACEchargeur
RTS

; si notre nouveau chargeur est appelé par le jeu, ces valeurs
sont stockées dans les registres ci-après:
; D0 = Longueur du fichier
; D1 = position en octet sur le(s) Disquette(s)
; A0 = adresse de chargement de fichier
; A1 = tampon MFM

Nouveauchargeur:
MOVEM.L D0-A6,-(A7) ; Sauve les registres sur la pile
LEA $DFF000,A6
; base des Customchips en A6
MOVE.L A1,A2 ; notre chargeur de pistes a besoin d?une adresse MFM en A2
CMP.L #$313,D0
; Fichier #4 à charger (le fichier #4 a une longueur de $313 octets)
BNE.B NO ; pas encore…
LEA Nouveauchargeur(PC),A3 ; autrement copiez le chargeur en $7FC00, Ptr vers Nouveauchargeur
en A3
LEA $7FC00,A5
; Pointeur vers $7FC00
en A5
MOVE.L #(Nouveauchargeurfin-Nouveauchargeur)-1,D7 ; taille de notre chargeur en
octets
COPierchargeur:
MOVE.B (A3)+,(A5)+ ; Copier le chargeur
DBF D7,COPierchargeur
MOVE.W #$4EF9,$7082(A4) ; Place le "JMP
$7FC00"

MOVE.L #$7FC00,$7084(A4) ; … dans le
code du second chargeur de piste

NumerO:
LEA etatdisque(PC),A5 ; le numéro du disque actuel dans le lecteur est stocké
ici (1/2/3)
CMP.L #$B7976,D1
; position de fichier sur le disque ci- dessous $B7976 ?
BLT.B DISque1 ; ouais, le fichier est sur le disque #1 !
CMP.L #$182E7E,D1
; position de fichier sur le disque ci-dessous $182E7E ?
BLT.B DISque2 ; ouais, le fichier est sur le disque #2 !

DISque3: ; autrement il est sur le disque #3 ! 😉
CMP.B #3,(A5) ; Disque 3 inséré ?
BEQ.B DISque3IN ; ouais, on continue…
MOVE.W #$00F,D7
; autrement met le code de couleur *bleu* en d7
BSR.W FLASHe ; l?écran Flashe et attend le clic de souris!
MOVE.B #3,(A5) ; le Disque #3 est dans le lecteur, sauver l?état
DISque3IN:
SUB.L #$182E7E,D1
; Fichier en $182E7E
démarre en $0
sur le disque 3… soustrait la valeur!
BRA.W lecture ; lire le fichier!!!

; pas d?explications supplémentaires pour la gestion du disque 1 et
2, tous pareil que pour le disque 3 …

DISque2:
CMP.B #2,(A5)
BEQ.B DISque2IN
MOVE.W #$0F0,D7
BSR.W FLASHe

DISque2IN:
MOVE.B #2,(A5)
SUB.L #$B7976,D1
BRA.W lecture

DISque1:
CMP.B #1,(A5)
BEQ.B lecture
MOVE.W #$F00,D7
BSR.W FLASHe
MOVE.B #1,(A5)

lecture:
DIVS.W #$1600,D1
; obtenir le n? de piste où démarre le fichier actuel
SWAP D1 ; Swapper d1 pour obtenir le reste de notre division …
MOVE.W D1,D2 ; … lequel est la position en octet sur la piste!
EXT.L D2 ; élargir d2 en un mot long
CLR.W D1 ; effacer la valeur restante en d1
SWAP D1 ; Swapper encore d1 pour avoir encore le numérodepiste.l

BSR.B chargeurpiste ; saut vers le chargeur de piste
MOVEM.L (A7)+,D0-A6 ; Restaurer les registres
RTS ; retour au code du jeu

FLASHe:
MOVE.W D7,$180(A6)
BTST #6,$BFE001
BNE.B FLASHe
RTS

etatdisque:
DC.B 1,0

chargeurpiste:
INCBIN "chargeur^piste.BIN" ; notre chargeur de piste!! 😉
Nouveauchargeurfin:

piste0:
BLK.B $1600,0
; espace pour une piste dos!


Maintenant faites comme dans l?image ci-dessous…
Assemblez le tout en faisant a, insérez votre disquette déplombée #1 et lisez
la piste 0 en utilisant rt
enfin exécutez le source en utilisant
et écrivez
la piste 0 avec wt !!!



maintenant que notre déplombage est terminé, réinitialisez votre amiga
et faites une partie….

Ce jeu déchire (pas)! ;D



salutations spéciales à Musashi9 pour avoir mis en ligne  le (presque)
meilleur site web dans le monde entier et bien sûr à ROB.

Alpha One ?2005!

 

0

Publication author

offline 2 weeks

mus@shi9

0
Comments: 1160Publics: 2780Registration: 06-03-2017

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
Authorization
*
*

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Registration
*
*
*

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Password generation

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

0
Would love your thoughts, please comment.x
()
x