Disk : Gdf18_2.dsk
"-" files are DELETED files | "*" files are LOCKED files
----------------------------------------------------------------------
*B A$0BFA (003066) L$0BCC (003020) 013 FAST COMPARE
T A$0000 (000000) L$2600 (009728) 038 T.FAST COMPARE
B A$0800 (002048) L$00FB (000251) 002 FIX MODELE
B A$0901 (002305) L$0286 (000646) 004 FIX MODELE IMMORTEL.S
B A$0901 (002305) L$0742 (001858) 009 FIX MODELE VIES+IMM.S
B A$0901 (002305) L$0491 (001169) 006 FIX MODELE VIES.S
B A$0901 (002305) L$0524 (001316) 007 FIX MODELE.S
A A$0000 (000000) L$0BA7 (002983) 014 HELLO
T A$0000 (000000) L$A400 (041984) 164 T.COURS 18.2 REVISION 1.00
T A$0000 (000000) L$0F00 (003840) 015 T.INFORMATIONS COURS
T A$0000 (000000) L$0D00 (003328) 013
T.INTRODUCTION
T A$0000 (000000) L$0400 (001024) 004 T.LES PROGRAMMES DE CE DISK
T A$0000 (000000) L$2B00 (011008) 043 T.REPONSE QUESTIONNAIRE
SACHA
B A$0901 (002305) L$283F (010303) 042 FAST COMPARE 1.20.S
B A$0C00 (003072) L$06A0 (001696) 008 FAST COMPARE 1.20
B A$0901 (002305) L$0531 (001329) 007 FIX PAPERBOY.S
B A$1A00 (006656) L$00FC (000252) 003 FIX PAPERBOY
This catalog contains 17 files. 0 were DELETED.
----------------------------------------------------------------------
DOS 3.3 |
Download Cours GDF 18.2 rev 1.00 (gzipped) |
Lien | Article |
Introduction. | |
Cours 18.2 revision 1.00. | |
Les programmes de ce disk. | |
Informations cours. |
===============================================================================
COURS 18.2 / FIXEZ VOUS LA
VIE
Godfather et The Jokersoft
===============================================================================
Révision
1.00
Update : 07 Mai 1988
Salut et salut,
Voici le menu du second cours sur les fixs tel que je le
présentait avant
réalisation, dans le cours 18.. et sur ce disk, le cours 18.2 en
lui meme.
Vous n'avez qu'à lire et comparer.. tout y est ! (et meme plus!)
Alors bonne chance !
JEUX D'AVENTURE, JEUX DE
ROLES.. (Théorie)
-----------------------------------------------------------------------
1. Fixs jeux d'aventure -
parties sauvegardées
2. Fixs jeux de
role - personnages sauvegardés
3. Fixs jeux d'aventure - le
vocabulaire du jeu, les messages du jeu
UTILITAIRES DISK
-----------------------------------------------------------------------
4. Programmes de copie
(piste de début/fin, secteur, Headers..etc)
ACTIONS AUTOMATIQUES
-----------------------------------------------------------------------
5. Tir automatique..etc
LE TEMPS DE JEU
-----------------------------------------------------------------------
6. Captain goodnight, Miss
pacman (qd vs etes bleus!) etc.. top chrono!
LES RECORDS
-----------------------------------------------------------------------
7. Modifiez le tableau des
records à black magic, captain goodnight.etc
LES COULEURS, LA VITESSE,
LES TRAJECTOIRES..et autres parametres
-----------------------------------------------------------------------
8. Tous les fixs inutiles
mais "beaux" expliqués ici !
FIXS INTEGRES
(Théorie)
-----------------------------------------------------------------------
9. Fixs
intégrés niv_2 - Demande le nombre de vies au
début du jeu
10. Fixs
intégrés niv_1 - Taper une touche pour augmenter
les vies..!
PARTIE PRATIQUE : OUTILS
-----------------------------------------------------------------------
11. Disk_compare, et
Fast_compare (Sam-1985)
12.
Rwts
(cours 3)
13.
Sread/Swrite
(cours 7)
LES PROGRAMMES "FIXS" ET
LEURS SOURCES
-----------------------------------------------------------------------
14. Fix modele
1
(Godfather)
15. Fix modele
2
(Captain crack)
16. Fix modele
3
(The ACS - aucun source!)
Salutations digitales, Godfather
===============================================================================
===============================================================================
COURS 18.2 : FIXEZ VOUS LA VIE (suite et fin, 1er
fichier)
Godfather
===============================================================================
Laissez moi en premier lieu remercier The Jokersoft qui a vraiment fait
beaucoup d'efforts pour essayer de m'aider dans la réalisation
de ces deux
cours 18 et 18.2 sur le domaine des fixs.
Deux choses très très interessantes dans ce cours, le
tout début et la fin.
La tout début parce qu'on y parle de fixs jeux d'aventure et
player disk, et
la fin parce qu'on y parle de fixs intégrés. entre temps,
je bouche le trou
avec pleins d'idées de recherches de fixs dans tous les sens.
Bonne chance !
============================================== Salutations digitales,
Godfather
Je commence par le début de mon menu :
JEUX D'AVENTURE, JEUX DE
ROLES.. (Théorie)
-----------------------------------------------------------------------
1. Fixs jeux d'aventure -
parties sauvegardées
2. Fixs jeux de
role - personnages sauvegardés
3. Fixs jeux d'aventure -
vocabulaire
===============================================================================
1. FIXS JEUX D'AVENTURE , PARTIES SAUVEGARDEES / 2. FIXS JEUX DE ROLE,
PLAYERS.
===============================================================================
Que peut on fixer dans un jeu d'aventure..si ce n'est les sauvegardes
du jeu ?
Dans la majorité des jeux d'aventure ou de role, les parties
sont sauvegardées
à la demande du joueur sur un disk donné, selon un format
très clair, et
rarement flexible. La sauvegarde se fera soit en accès direct
(comme pour les
softs froggy par exemple) ou en fichier catalog (selon le systeme
d'exploitation).
Fixer une partie sauvegardée, ca peut permettre de modifier
l'inventaire du
personnage par exemple, pour lui donner tous les atouts
désiré, ou encore
permettre de modifier le level , ( l'image ) , où se trouvait le
joueur au
moment de la sauvegarde.. on peut ainsi voir toutes les images du
jeu..etc.
Fixer un jeu de role, ca peut permettre de rajouter à un de ses
personnages
des points de vie à volonté..etc.. bref, de tout modifier
dans les statuts
de vos personnages.
On va prendre un exemple concret. On suppose que les données
relatives à
la partie 1 (sur x parties sauvegardables d'un jeu d'aventure ou encore
sur les x personnages sauvegardés dans votre ultima
préféré..) tiennent sur
un seul secteur (on va se faciliter la vie, mais ca revient au meme de
toutes façons que ce soit sur un ou x secteurs..) qui soit sur
la face
"player disk" du jeu, en piste $22 secteur $00.
Toute la ruse de ce début de cours est de trouver une technique
permettant de
savoir justement quel est le secteur qui contient les octets relatifs au
données que l'on veut modifier.. certes , vous savez ici que
c'est la $22 00,
mais comment le retrouver en partant de zero ?..
Le principe est étonnant par sa simplicité !..
Jouez avec votre personnage, et sauvegardez le joueur ou la partie. on
suppose
ici que le parametre que vous cherchez est la force du personnage qui
est,
au moment de cette sauvegarde, de 09. Ensuite, faites un copie de ce
player
disk, bootez le jeu, rechargez votre personnage et perdez (ou gagnez)
de la
force. on suppose qu'elle soit maintenant passée à 08.
Sauvegardez aussitot
la partie ou le player sur cette copie de la première player
disk.
Vous venez de creer ainsi deux player disks ayant pour seule et unique
différence (en théorie) votre partie sauvegardée,
qui ne se différencient
que par quelques octets (ou un seul octet) à savoir l'octet ou
les octets
représentant la force du joueur concerné. comprendo ?
Tout ce qu'il reste à faire à ce stade là, c'est
une bete comparaison entre
les deux disquettes player.. et vous obtiendrez le secteur
différent entre
ces deux versions, et sur ce secteur, le ou les octets que vous
cherchez :
la force du personnage.. ou le level de votre jeu d'aventure, ou..etc..
Pour comparer ces deux disquettes bien sur, il vous faut un
COMPARE.PRG..
Je vous l'offre, il est sur ce disk : c'est le FAST COMPARE de SAM,
programme inédit et incroyablement utile dans ce domaine de fixs
!!
Faites ]BRUN FAST COMPARE, vous comprendrez aussitot ce que je veux
dire!
Si cette méthode de fixs vous plait, reportez vous au fichier
"les complements
de ce cours", j'y parle un peu du "compare.disk" de the gog's.C'est
giga aussi!
On aurait pu aussi bien utiliser pour ce type de comparaison, l'option
compare
disks du locksmith 6.0. Il suffit de le booter et de taper "U" au menu
pal
(pour "16 sector utilities"), puis "C" (pour Compare). Donnez ensuite le
nombre de drives disponibles (ce que ne demande pas le compare de sam).
Le programme compare les deux disquettes et vous donne la track sector
map
de la disquette en indiquant par des "C" sur la seconde disquette les
pistes
et secteurs qui diffèrent. Notez les soigneusement et reportez
vous à ces
secteurs avec un editeur de secteurs quelconque.
L'avantage du fast compare est, outre sa vitesse due à la
routine fast boot
galactique du fast boot de sam, que l'on peut (les touches sont
indiquées)
acceder directement au secteur, et voir en inverse, non pas seulement
les
secteurs différents, mais quels octets sont différents
entre les deux disks
comparés. giga, non ?
Ce genre de fixs, surtout sur un jeu de role, est très
interessant car on peut
arriver à un endroit auquel on n'aurait autrement pu acceder
qu'en quelques
centaines d'heures. chaque Ultima se vante d'offrir 200 ou 300 heures
de jeu
avant de trouver la solution. Pour Ultima 5, il faut 600 heures
(approx' de
Origin Systems). A raison d'une demi-heure par jour, ca nous ferait
quelques
3 ans et 4 mois pour l'achever sans accrocs majeurs.. le temps que le
6,7,8
soient publié... m'enfin....
===============================================================================
3. FIXS JEUX D'AVENTURE / LE VOCABULAIRE , LES MESSAGES DU JEU
===============================================================================
Le vocabulaire d'un jeu d'aventure est toujours dans sa doc.. mais
rarement
au boot d'une copie pirate, n'est ce pas ? cette technique va donc vous
permettre de récuperer la liste du vocabulaire d'un jeu
d'aventure, ss pb..
D'autre part, meme en supposant que vous ayez la doc et l'original, vous
voudriez bien en savoir immediatement plus sur la fin du jeu.. et les
messages texte que vous n'avez pas encore vu passer pourraient vous en
apprendre beaucoup, vous ne croyez pas.. cette technique va donc vous
permettre
d'en savoir plus sur la suite de votre périple aventureux..
Tant qu'à tricher, autant bien tricher.. non?
Le vocabulaire, meme s'il est codé sur le disk comme pour
certains froggy,
est rarement codé en mémoire.. il est presque toujours
sous forme ASCII en ram.
Pour le récupérer, rien de plus simple. Voici la marche
à suivre :
- interrompre le programme après le chargement
- faire afficher et défiler à l'écran le contenu
de le ram, et comme le texte
est bien quelque part, il finira bien par apparaitre à
l'écran.
Pour interrompre le programme, je vous fait confiance avec toutes les
armes
géniales que je vous aient données dans les
précédents cours (dont "break"),
bien que vous puissiez tout simplement passer par un pomme-ctrl-reset,
doublé
d'un simple ctrl-reset. ca altere un peu la ram, mais si peu !
Pour faire afficher et défiler à l'écran le
contenu de la ram, par contre,
c'est un peu plus complexe. il vous faut passer en moniteur ( CALL -
151 )
et executer le programme suivant :
0300- A2
00
LDX #$00 ;
0302- BD 00
08 LDA
$0800,X ; on prend toutes les adr.ram
0305- 20 ED
FD JSR
$FDED ; et on en affiche le contenu
0308-
E8
INX
;
0309- D0
F7
BNE $0302 ;
030B- EE 04
03 INC
$0304 ; on increment le LDA,X
030E- AD 04
03 LDA
$0304 ;
0311- C9
C0
CMP #$C0 ; Maximum ram
affichée $C000
0313- D0
E8
BNE $0300 ;
Essayez de comprendre cette routine, ca peut etre utile.
Si vous ne voyez pas le vocabulaire défiler à
l'écran avec cette méthode là,
pensez qu'il peut se trouver en carte language ou 80col.. et agissez en
conséquence (moveaux, etc..expliquée dans divers autres
cours, cours de
mise en catalog, etc..). mais c'est un cas bien trop rare pour que je
persiste ici.. je passe à la suite..
Pour arreter le défilement du texte, pensez à Ctrl-S.. ca
marche bien!
===============================================================================
La suite!, la suite!, la suite!..
UTILITAIRES DISK
-----------------------------------------------------------------------
4. Programmes de copie
(piste de début/fin, secteur, Headers..etc)
===============================================================================
4. PROGRAMMES DE COPIE , MODIFICATIONS DIVERSES
===============================================================================
Meme technique que pour les nombres de vies. (cours 18).
Ce n'est pas vraiment - très - interessant. m'enfin..
Vous pouvez ainsi rechercher la piste de départ : A9
00 LDA #$00
la piste d'arrivée : C9
23 CMP #$23
Eventuellement meme chercher le secteur de fin : A9 0F ou C9
0F LDA,CMP #$0F
le drive de départ : A9 01
le drive d'arrivée : A9 02
On peut aussi rechercher les headers :
Reading marks :
- Data mark : D5AAAD
DEAA O
- Address mark : D5AA96 DEAA O
Writing marks :
- Data mark : D5AAAD
DEAA EBFF
- Address mark : D5AA96 DEAA
EBFF AA
Ce qui peut etre interessant, c'est de rajouter une piste (copieur $23
pistes
ou nibble editor $23 pistes). Un exemple d'utilité à ce
genre de fixs sur des
copieurs.. je voulais faire une copie potable d'original de ultima5.. la
protection, vous le savez consiste à ajouter $11 au
numéro de chaque secteur du
disk original. Le disk muncher 8.00 ne permettait guere la copie, car il
trouvait des numéros de secteurs trop grands. J'ai simplement
enlevé un
CMP #$0F (ou CMP #$10 je ne sais plus) qui correspond à la
comparaison du
numéro de secteur lu avec le numéro max', et
remplacé par un CMP #$12. (+$11)
et là, j'ai pu copier potablement mon original!, ce qu'aucun
copieur ne
me permettait de faire. (d'ailleurs je crois avoir laissé ce
Disk Muncher
Ultima5, dans le cours 17.2 sur cette nouvelle superbe protection
O.Systems).
Ceci pour l'anecdote, messieurs.
===============================================================================
Garcon!! la suite...
ACTIONS AUTOMATIQUES
-----------------------------------------------------------------------
5. Tir automatique..etc
===============================================================================
5. TIR AUTOMATIQUE (JEUX D'ACTION)
===============================================================================
Avant tout, un petit rappel sur les adresses du joystick.
Adresses
Identification Explications
-------------------------------------------------------------------------------
$C061
PB0
Etat du bouton 0 (bit7) et de la pomme ouverte
$C062
PB1
Etat du bouton 1 (bit7) et de la pomme fermée
$C063
PB2
Etat du bouton 2 (bit7) et de la pomme fermée
$C064
PADDL0
Etat de sortie du monostable manette 0. (bit7)
$C065
PADDL1
Idem pour la manette 1
$C066
PADDL2
Idem pour l'entrée analogique n.2
$C067
PADDL3
Idem pour l'entrée analogique n.3
$C068
Meme effet que $C060..
$C06F
Meme effet que $C067 ($C068-C06F)
$C070
PTRIG
RaZ pour débuter la lecture des manettes.
Premièrement, il faut vraiment avoir une grande utilité
pour appliquer cette
technique. Secundo, il faut que le jeu comporte des tirs infinis.
Tertio, il
faut l'appliquer sur des jeux bestiaux, de stype space invaders. et
quatrio,
il faut que les tirs continu ne ralentissent pas trop le jeu..
Mis a part ca, on peut y aller.. ouf!.. je vous lache la technique dans
les
pattes. let's go folks !...
Reperez quel bouton sert pour le tir.
Si c'est le premier bouton, recherchez des "61 C0" (pour $C061).
Si c'est le second bouton, recherchez des "62 C0" (pour $C062).
Puis decouvrez lequel des "61 ou 62 C0" que vous trouverez est le bon.
(vous avez le droit à autant d'essais que vous le souhaiterez si
vous gardez
toujours une copie impec de l'original de coté.. alors courage!).
Ensuite, vous vous attaquerez aux "branch"...et plus
particulièrement aux BMI.
(ben oui, faut en connaitre un minimum à ce niveau là,
mais rassurez vous le
minimum est vraiment minime. Pour ceux qui savent pas, BMI est une
instruction
de l'assembleur 6502 de votre Apple, qui compare la valeur contenue
dans le
registre A avec 0, et si A est négatif, alors le BMI - qui , je
ne vous le
cache pas , veut dire Branch on MInus - est executé et vous
branche à un
bout du programme. si A est positif, le BMI ne branche nulle part et le
prg
continue normalement après ce BMI.. comprendo ?.. pour plus de
détails, referez
vous à un bouquin.. mais il n'y a rien de plus à savoir
pour faire ce genre de
fixs). Recherchez un BMI après le LDA $C061 ou $C062 (en hexa
BMI = $30), et
remplacez le par un BPL (l'inverse de BMI) soit en hexa BPL = $10.
C'est à dire que le branchement à la routine de tir se
fera à chaque fois que
vous ne presserez pas le bouton.. comprendo ?..
Si ma foi vous trouviez un BPL après le LDA Joystick, il
faudrait cette fois
l'inverser de meme en le remplacant par un BMI. rien de plus simple.
(changez 30 en 10, ou 10 en 30 hexa).
Souvent un changement unique est à faire.
Cette methode de recherche et de modification n'est pas infaillible
puisqu'elle
ne marche par exemple pas pour les jeux demandant l'appui d'un bouton
à chaque
tir. m'enfin on s'en fout bien, hein! à notre age...
===============================================================================
LE TEMPS DE JEU
-----------------------------------------------------------------------
6. Captain goodnight, Miss
pacman (qd vs etes bleus!) etc.. top chrono!
===============================================================================
6. LE TEMPS DE JEU, LES HEURES, LES CHRONOS...etc
===============================================================================
Pour certains jeux, le but est d'accomplir une tache en un certain
temps,
ou bien on a un avantage pendant un certain temps..etc..
Bref, un horloge ne demande qu'à etre fixée. Une horloge
est souvent programmée
(voir Articfox par exemple) en heures et en secondes. Si une horloge
est 09.00;
Recherchez la séquence suivante :
LDA $09 STA (casemem1) LDA $00 STA (casemem2). soit A9 09 --- A9
00 --- .
Généralement, les deux cases mémoires (adresses)
diffèrent d'un octet, ce qui
nous arrange en cas de nombreuses possibilités. Le but du jeu
est bien sur de
bloquer cette horloge. Recherchez la séquence suivante :
INC (casemem2)
Dans le cas où le STA (casemem2) fut un STA $xx, soit un 85 xx,
il faut
chercher un INC sous la forme INC $xx, soit un E6 xx.
Dans le cas où le STA (casemem2) fut un STA $xxyy, soit un 8D yy
xx, il faut
chercher un INC sous la forme INC $xxyy, soit un EE yy xx.
Une fois trouvé, il suffit de l'annuler par des NOP (No
Operation = $EA)
Dans le cas d'une horloge compte à rebours, il faut rechercher
un :
DEC (casemem2)
Dans le cas où le STA (casemem2) fut un STA $xx, soit un 85 xx,
il faut
chercher un DEC sous la forme DEC $xx, soit un C6 xx.
Dans le cas où le STA (casemem2) fut un STA $xxyy, soit un 8D yy
xx, il faut
chercher un DEC sous la forme DEC $xxyy, soit un CE yy xx.
Une fois trouvé, il suffit de l'annuler par des NOP. (EA EA, ou
EA EA EA).
Vous pouvez bloquer les heures plutot que les minutes, ca fait plus
vivant..
Vous faites comme cela vous chante, c'est votre disquette, c'est votre
ordinateur, c'est votre vie.. c'est comme vous voulez..
===============================================================================
LES RECORDS
-----------------------------------------------------------------------
7. Modifiez le tableau des
records à black magic, captain goodnight.etc
===============================================================================
7. LES RECORDS SAUVEGARDES SUR LE DISK
===============================================================================
Je vais vous proposer ici trois methodes de recherche de table de
high-scores.
1) Recherche au scanner d'octet (voir cours 8)
----------------------------------------------
Il suffit de rechercher le nom d'un des joueurs de la table, avec -
sinon le
copy II+ 5.x qui cherchera en mode ascii normale - le scan disk eor.
Comme ca,
si les noms sont en inverse, en flash, ou codés uniformement, le
programme
vous indiquera tout de suite sur quel secteur se trouve les high-scores.
2) Recherche par comparaison (voir ci-dessus, jeux d'aventure)
--------------------------------------------------------------
La technique de recherche des records sauvegardé par un jeu sur
un disk est ,
ma foi , la meme que la technique de recherche d'une partie
sauvegardée..
Toujours le meme principe , et toujours le meme utilitaire fast compare
pour
comparer un disk avec un certain record , et un disk sans record par
exemple.
En général les noms des joueurs sont en ascii et souvent
meme le score est en
ascii bete et méchant. Pour certain jdr et jeux d'action il y a
un octet de
checksum mais c'est bien rare.. a ce niveau là, il suffit de
trouver en
étudiant divers disks à records divers le "comment est
calculé le checksum",
de trouver la vérif de cette valeur ou bien encore d'abandonner
ce fix qui ne
sera en fait utile qu'à votre orgueil de joueur. n'est ce pas ?
3) En changeant de disks avant l'écriture
-----------------------------------------
A supposer que le programme ne teste pas le disk sur lequel il ecrit les
records, et à supposer qu'ils soient écrit en format 3.3
normal, il suffit de
mettre un disk vierge formatté dans le drive avant
l'écriture des records.
Ensuite, passez avec un programme comme dark 2, sur ce disk et vous
verrez
tous les secteurs vides (indiqués par dark 2 avec un "à")
sauf ceux où se
trouvent la fameuse table des records recherchée. n'est ce pas ?
===============================================================================
LES COULEURS, LA VITESSE,
LES TRAJECTOIRES..et autres parametres
-----------------------------------------------------------------------
8. Tous les fixs inutiles
mais "beaux" expliqués ici !
===============================================================================
8. LES COULEURS
===============================================================================
Il est difficile de parler de vitesse ou de trajectoire car ca varie
forcement
d'un jeu à l'autre... rappelez vous juste que bien souvent tous
les paramètres
important d'un jeu bien programmé se regroupent dans une petite
zone ram,
dans un flot d'adresses consécutives. ca, ca peut vous aider !
Parlons plutot du probleme des couleurs..
Quoi de plus marrant d'avoir un pacman vert sur fond rouge ou bleu ?
Non, je plaisante.. il n'y a malheureusement pas de technique
particulière
pour changer les couleurs. tout dépend de la programmation
initiale.
Dans vos recherches de LDA #$1, #$2, #$3... (ex : snake byte) on peut
tomber
au hasard sur ces differents paramètres.
Laissez moi juste vous donner les codes asm des diverses couleurs,
ca peut servir.
_________________________________
!
!
! HCOLOR COULEUR MASQUE EXTERNE !
!
!
! 0 NOIR1
$00 (000) !
! 1 VERT
$2A (042) !
! 2 MAGENTA
$55 (085) !
! 3 BLANC
$7F (127) !
! 4 NOIR2
$80 (128) !
! 5 ROUGE
$AA (170) !
! 6 BLEU
$D5 (213) !
! 7 BLANC2
$FF (255) !
!_________________________________!
===============================================================================
Voici enfin venu le moment tant attendu , on va parler fix
intégré..
Vous savez, ce truc que vous mettez au début d'un programme qui
vous permet
aussi de bien montrer qui est l'auteur de cette bidouille.. et de bien
mettre
votre pseudo en evidence. que ce soit sur un programe en catalog, ou
sur un
disk en une face.. allons-y , plongeons nous dans le domaine du fix
intégré..
FIXS INTEGRES
(Théorie)
-----------------------------------------------------------------------
9. Fixs
intégrés niv_2 - Demande le nombre de vies au
début du jeu
10. Fixs
intégrés niv_1 - Taper une touche pour augmenter
les vies..!
Nous entrons dans un domaine où un minimum de connaissances
quant à un
assembleur et au language machine, deviennent necessaire.
===============================================================================
9. FIXS INTEGRES NIVEAU 2 : DEMANDE LE NOMBRE DE VIES AU DEBUT DU JEU
===============================================================================
Il y a plusieurs types de fixs de niveau 2, le but étant
toujours le meme :
incruster au début du jeu concerné un programme qui
demande au joueur le nombre
de vies désiré pour la partie qui va suivre, s'il veut
etre immortel.. etc...
Il faut d'abord avoir bien clair sur papier la ou les adresses à
modifier
correspondant au premier paramètre à modifier, par
exemple le nombre de vies.
Ensuite, avoir également - eventuellement - les adresses
à nopper pour ou
pour ne pas etre immortel.. etc.. bref, :
Avoir tous les fixs à faire sur papier...avant de les adapter
aux sources qui
suivent de fixs modeles. Listez les avec merlin pro, tout est
commenté, il
suffit de mettre les lda, sta et autres nop au bon endroit.. comprendo ?
Je vous l'avait dit, il faut savoir ici manier un minimum l'assembleur
et MPro.
Après avoir modifié le source (rien de plus simple avec
merlin pro editor),
il suffira de l'assembler à la bonne adresse. Ici se
présentent deux cas :
a. On travaille sur un
programme en catalog (dos ou prodos)
-----------------------------------------------------------
Il suffit d'assembler le
programme de manière à pouvoir le coller
avant (ou juste
après) le programme concerné, en catalog, et de
faire executer ce "fix" en
premier lieu. (JMP fix dés le début du
programme). A la fin du
source du fix, n'oubliez pas de mettre un
JMP Soft. (adresse de
départ du fichier initial).
Ensuite, sauvez l'ensemble
Fix+Soft et brunnez le tout.
Un exemple précis.
Supposez un jeu du nom de AGAGA.
Le copy II+ 5.x vous montre,
quand vous utilisez l'option CATALOG /
FILE LENGHTS, que le
programme commence en A$6000 et fait L$3F29.
Si le programme AGAGA est
bien chargé en $6000, un JMP $6000 le lance
donc aussi efficacement
qu'un BRUN AGAGA le fait, nous sommes d'accord.
Le but du jeu est
d'introduire, de rajouter, un programme en assembleur
à savoir notre FIX
(dont le source s'appelle FIX.S,
écrit sous merlin
pro) dans ce fichier du nom de AGAGA. On supposera
que ce fix occupe presque 4
pages (une page = $FF octets). On va donc
reloger le source (en
modifiant le ORG$ et en l'assemblant en tapant
ASM sous l'éditeur
assembleur) en $6000 - ($FF * 4) soit en $5C00.
Le fix se chargera de
modifier les bonnes adresses pour les vies et
l'immortalité par
exemple, mais sur le meme exemple de ce source que je
vous confie, vous pourrez y
rajouter toutes les questions et
modifications d'adresses que
vous voudrez - nous sommes d'accord.
Rappelez vous aussi que la
"sortie" du fix doit etre fait par un JMP au
programme, soit ici un JMP
$6000 puisque c'est l'adresse qui permet de
lance le programme du nom de
AGAGA, après chargement et modification
par ce fix (qui commence
à bien s'intégrer, ma foi).
Assemblez donc le fix
adapté à votre programmme en $5C00 et sauvez
l'objet sous le nom
FIX.AGAGA par exemple (A$5C00,L$03xx).
Ensuite, pour regrouper les
deux programmes , il suffira de faire ,
dans cet exemple, les
commandes dos suivantes :
]BLOAD FIX.AGAGA,A$5C00 ,
]BLOAD AGAGA,A$6000 puis enfin, une fois
les deux bouts du programme
définitif en mémoire, il faudra sauver le
tout en un seul fichier
brunable commencant par le fix. Le probleme
est de savoir quelle
longueur indiquer pour cette sauvegarde.
La solution est simple.
AGAGA faisait L$3F29 dans cet exemple, et
notre fix commence 4 pages
avant le programme ce qui ralonge la
longueur de ce fichier de 4
fois $FF octets, soit de $400 octets.
On doit donc sauver le
fichier final en A$5C00 et L($3F29+$400) soit :
]BSAVE
AGAGA.FIXED,A$5C00,L$4329.
Essayez aussitot
après un ]BRUN AGAGA.FIXED et vous verrez apparaitre,
et pourrez profiter de votre
premier fix intégré...sous dos.
Le principe de la réalisation de fixs intégrés est
donc simple :
- programmer le programme de "fix" posant les questions, et l'adapter au
programme à fixer selon deux paramètres qui sont
les adresses à modifier,
l'adresse par laquelle il faut sortir pour acceder à ce
programme fixer,
et l'adresse à laquelle il faut loger ce programme pour
qu'il ne recouvre
aucunement le programme à fixer. Il faut aller dans de la
ram libre.
- permettre à ce programme de se charger, si possible en meme
temps que le
programme à fixer, et changer le jmp au programme par un
jmp au fix, qui
se termine lui meme par un jmp au programme.
b. On travaille sur un
programme en une face (accès direct)
-----------------------------------------------------------
Selon le bloader
utilisé pour le chargement en accès direct de ce
programme en une face, et
selon la ram que ce chargement prendra,
il sera plus ou moins simple
de charger le fix en meme temps que le
programme pour modifier
directement le programme chargé en mémoire.
Si l'on est sous boot 3.3,
ou sous le fameux epyx boot, ou encore sous
fast boot (sam, chip,
eoa..etc) qui sont des "milieux" que l'on
connait bien (dumoins je
l'espère grace à mes cours sur ces sujets
très importants), il
suffira de modifier le bloader à une étape ou à
une autre du chargement pour
charger fix+programme et utiliser
exactement le meme principe
que pour ce qui est d'un programme ss dos.
Maintenant, si le boot est
completement barbare, il va falloir
utiliser le accolade boot
1.00, à savoir le godfather's products #11.
Ce programme nous sert tout
le temps et partout..
Pour integrer un copieur
(cours 19), pour une présentation (cours 5,12)
ou encore maintenant pour
intégrer un fix (cours 18.2) à un programme
en une face. C'est donc un
très bon investissement à faire, si vous ne
l'avez pas
déjà fait... et vous allez comprendre pourquoi.
Le principe est simple. Ce
acco'boot nous permet d'imposer le
chargement d'un programme au
boot du soft en une face qui nous
pré-occupe, à
savoir le fix. Le probleme est que le programme à fixer
n'est pas encore
chargé et donc, les adresses des paramètres à fixer
ne correspondre pour
l'instant à rien sinon à des adresses mémoire
quelconques.
La ruse est la suivante. On
supposera que le nombre de vies
s'initialise par un LDA
#$03. (Load Accumulator with value 03).
Au lieu de faire un STA
$5201 si le 03 en question correspondant aux
vies se charge à
cette adresse, cette adresse ne correspondant à rien
puisque le programme reste
encore à charger, il suffira de faire un
STA $FF par exemple, dans le
fix, et de remplacer le LDA #$03 par un
LDA $FF (Load Accumulator
with address $FF). Vous comprenez ?
$FF sera donc une adresse de
transfert contenant temporairement le
nombre de vies. C'est une
sorte de relai entre le fix et le programme.
Si l'on faisait directemen
un STA $5201 pour notre exemple, il faut se
rendre compte que le
chargement du programme effacerait $5201 et
le fix n'aurait donc aucun
effet sur le programme.
Il faut donc utiliser par
exemple une valeur de la page $00.
Laissez moi continuer dans
mon exemple avec ces adresses prises au
hasard en supposant que
l'adresse de stockage du nombre de vies
soit $57F8. On aurait donc
en $5200 ceci : LDA #$03 STA $57F8.
Si l'on suppose enfin que la
page0 n'est pas libre pour une raison
x ou y, on peut supposer
mettre dans une page libre autre que la P.Zéro
une petite routine LDA
#valeur STA $5201 (adresse du nombre de vies
dans cet exemple) suivie
d'un RTS, et mettre à l'endroit du
LDA #$03 STA $57F8, soit en
$5200, un JSR à cette routine qui restera
chargée après
le chargement du programme (voir ci dessous).
On peut penser terminer
cette routine par un RTS mais pour plus de
sécurité, les
programmeurs préfèreront recopier cette routine en $5200
et sauter enfin
définitivement en $5200. Il faut alors ne pas mettre
en $5200 un JSR à
cette routine, mais plutot un JMP.
Et là, le fix ne peut
etre mieux intégré à votre programme en une face.
Pour trouver une page
où mettre un routine qui ne s'efface pas après
la fin du chargement du
programme à fixer, il sufit de vider la mémoire
avant le boot (*0800:EA,
*0801<0800.BFFF, *C600G) puis d'interrrompre
le programme après
chargement (pomme ctrl-reset, puis ctrl-reset -
puisqu'on a rien à
récuperer de bien important) et de rechercher les
zones ram où il reste
encore des EA EA EA EA... (il est peut etre
préférable
d'ailleurs de faire ca avec une valeur vraiment prise au
hasard.. 22,33,...anyone!
car EA correspondant à l'instruction asm
NOP (No Operation) il se
peut que le programme en charge une série,
par un hasard rare mais
possible).
Les zones où il
reste, après le chargement du soft , des octets de
ce qu'il y avait avant le
chargement sont donc des zones où rien ne
se charge , donc libres pour
toutes les routines à conserver pour
après le chargement.
Rien de plus logique !
Voilà, je viens de vous avouer tout ce que vous attendiez (ou
presque, car il
en reste à venir). Sautez donc vite maintenant sur votre merlin
pro et sur
les fichiers sources en catalog sur ce disk.
===============================================================================
10. FIXS INTEGRES NIVEAU 1 : TAPEZ SUR UNE TOUCHE PENDANT LE JEU POUR
TRICHER !
===============================================================================
Le principe est simple. Vous avez un jeu dans lequel taper Ctrl-R par
exemple
execute la routine "Restart" c'est à dire vous renvoie au
début du jeu.
Vous "R"ecommencer le jeu au tout début. Vous avez un jeu dans
lequel taper
Ctrl-S par exemple execute la routine "Sound toggle" c'est à
dire une fois
allume la musique (on), et l'autre fois l'arrete (off). C'est un toggle
on/off.
Vous avez un jeu où taper Ctrl-F rajoute une frite dans un
cornet.. ou que
sais-je encore.
Il est très fréquent que des jeux d'action
(principalement) aient une série
de touches qui soient utilisables tout au long du jeu (et que
généralement les
pirates ne connaissent pas, n'ayant aucune doc du soft! car pas
d'original..).
Un Lode Runner admet un Ctrl-S, Ctrl-R..et bien d'autres touches encore.
Le principe du "fix soudé" (trademark godfather, tout comme pour
les deux
techniques précédents de fix intégré.. j'en
revendique en effet la paternité!),
est donc de rajouter une touche miracle qui , par exemple , augmente le
nombre
de vies au cours du jeu à tout moment , tout comme ctrl-R permet
d'arreter le
jeu à tout moment.
Pour trouver où brancher la routine qui incrémente le
nombre de vies (on peut
penser à bien d'autres routines pour bien d'autres fixs tel un
toggle Ctrl-I
pour mortel/immortel, ou que sais-je encore..), il suffit de rechercher
un
test du clavier et juste après une recherche de la touche Ctrl-R
soit en
l'occurence un CMP #$93 (C9 93). Le test clavier se fait pas LDA $C000,
il faudra donc commencer par une recherche d'octets de C9 93 ou de 00 C0
qui devra etre suivie par C9 93 (si ctrl-R existe bel et bien dans ce
jeu).
Il suffit alors de detourner comme précédemment dans une
place ram libre où
nous chargerons au préalable les routines de fix du jeu (INC
Adresse des
vies..etc), et de détourner un LDA $C000 à notre routine,
en la faisant
commencer par un identique LDA $C000 puis CMP #$(valeur du ctrl-V pour
vies
par exemple) et BEQ (routine d'increment des vies), puis en la faisant
continuer par un saut au premier compare (compare du jeu original) qui
suivaient le $C000 que l'on a sucré pour glisser notre JMP..
comprendo ?
Pour vous aider à comprendre et à réaliser ce
genre de fix, voici d'abord
la liste des codes hexa clavier des divers caractères de
controle :
Dec Hex
Caractère
Dec Hex Caractère
-------------------------
-------------------------
00 $00
Ctrl-à
14 $0E Ctrl-N
01 $01
Ctrl-A
15 $0F Ctrl-O
02 $02
Ctrl-B
16 $10 Ctrl-P
03 $03
Ctrl-C
17 $11 Ctrl-Q
04 $04
Ctrl-D
18 $12 Ctrl-R
05 $05
Ctrl-E
19 $13 Ctrl-S
06 $06
Ctrl-F
20 $14 Ctrl-T
07 $07
Ctrl-G
21 $15 Ctrl-U
08 $08
Ctrl-H
22 $16 Ctrl-V
09 $09
Ctrl-I
23 $17 Ctrl-W
10 $0A
Ctrl-J
24 $18 Ctrl-X
11 $0B
Ctrl-K
25 $19 Ctrl-Y
12 $0C
Ctrl-L
26 $1A Ctrl-Z
13 $0D
Ctrl-M
27 $1B Escape
enfin voici le moyen classique de programmer un tel test clavier.
Le test clavier se fait en comparant avec la valeur se trouvant en face
du
caractère à tester auquel il faut rajouter #$80. Un
Compare à la touche ctrl-R
se ferait donc ainsi :
LDA
$C000 ; test touche pressée
CMP
#$92 ; compare à Ctrl-R
BEQ
CTRL_R ; oui. on va à la routine
voulue par la pression de ^R
SUITE
...
; non. ctrl-R n'a pas été préssé..le soft
continue.
CTRL-R
...
; oui. ctrl-R a été préssé..retour au
début du soft.
Pour integrer un fix soudé à cette routine, à
supposer que la page $60 soit
libre (soit la zone ram $6000-60FF environ), il suffit de retrouver la
routine
ci-dessus sur le disk, et de remplacer le LDA $C000 par un JMP $6000, et
de mettre en $6000 la routine suivante :
$6000 - LDA $C000 ; test touche
préssée
CMP
#$92 ; compare à
Ctrl-R pour "recommencer"
BEQ
CTRL_R ; oui. va à "recommencer"
CMP
#$96 ; compare à
Ctrl-V pour "une vie en plus"
BEQ
CTRL_V ; oui. va à "une vie en
plus"
CMP
#$8D ; compare à
Ctrl-M pour "un missile en plus"
BEQ
CTRL_M ; oui. va à "un missile en
plus"
CTRL_R JMP CTRL-R ; saut à
l'adresse de la routine qui s'execute pour
; Ctrl-R indiquée par le programme de test de ctrl-R
; initial (BEQ).
CTRL_M INC $//// ;
incrément de l'adresse qui contient le nombre de
BEQ
ZERO_M ; est il revenu à 0 par
$FF+1, oui alors rectifie!
JMP
SUITE ; missiles pendant le jeu, et
retour au programme.
ZERO_M LDA #$01 ; on
remet le nombre de missiles à 1 et non 0.
STA
$//// ; (pour revenir à un
jeu "raisonnable" mais pour eviter
JMP
SUITE ; de perdre alors que l'on
veut tricher).
CTRL_V INC $//// ; increment
de l'adresse qui contient le nombre de
BEQ
ZERO_V ; est il revenu à 0 par
$FF+1, oui alors rectifie!
JMP
SUITE ; vies pendant le jeu, et
retour au programme.
ZERO_V LDA #$01 ;
STA
$//// ; (adresse du nombre de vies)
JMP
SUITE ;
Avec tout ce baggage derrière vous, du courage et quelques
notions d'assembleur
vous devriez pourvoir arriver jusqu'à la réalisation de
tels fixs top niveau
si vous savez bien utiliser les programmes du cours 8, de recherche ram
et disk
d'octets, dans tous les sens, codé ou non, etc..
===============================================================================
UN AUTRE TYPE DE FIX : FIX EN BASIC ECRIVANT SUR LE DISK PAR LA RWTS 3.3
===============================================================================
Un autre type de fix, souvent utilisé dans le domaine du jeu de
role ou
encore dans le domaine du jeu d'aventure, est celui du fix en basic
écrivant
directement sur le disk. bien sur il faut que le programme à
fixer soit
en une face, et ne puisse pas se "déplacer" sur le disk
concerné. On ne
fera jamais un fix à accès direct pour un programme en
catalog, mais on
peut parfois y penser pour des fixs intégré si on
n'arrive pas à localiser
une adresse non-effacée par le chargement du soft par exemple ,
ou par gout.
On a trouvé par exemple que le roster de bards tale
numéro x était en piste
$22 00 et que la force du personnage s'y trouvait à l'octet $23.
Pourquoi pas?
Il suffit de faire un programme tel que j'en parlais dans le cours 3 sur
la rwts, demandant en basic d'introduire la bonne face, qui lise le
secteur
en question et eventuellement un autre secteur pour verifier que l'on
va bien
ecrire sur le bon disk et sur la bonne face, qui affiche ensuite la
valeur
actuelle de l'octet $23 du secteur chargé ( on chargera par
exemple le secteur
en $6000 et on affichera le contenu de l'adresse $6023 ( si l'on
programme en
basic, il faudra convertir ce programme en décimal à
l'aide d'une machine,
d'un Apple IIgs ou encore de l'utilitaire du cours 7 par exemple ) )
comme
étant la force actuelle. Ensuite, on demandera (input) la
nouvelle force à
mettre pour ce personnage (ou nombre de vies ou autre, ce que vous
voudrez..)
et on poke la nouvelle valeur (entre 000 et 255 bien sur puisque l'on
parle
hexa sur un seul octet dans la plupart des cas de fixs) à la
bonne adresse
soit ici en $6023, avant de réécrire le secteur ainsi
modifié à sa place.
Lorsque le programme principal, le jeu, accedera à ce secteur,
le paramètre
que vous vouliez modifier, se chargera déjà
modifié (au lieu que vous le
modifiez à chaque utilisation du programme manuellement
directement en ram ).
Pour plus de détails, reportez vous au cours 3 sur la rwts, et
pour plus
d'aide à la réalisation de ce genre de fixs, reportez
vous au cours 1 où en
sont donné des exemples en catalog, au cours 3 pour la rwts, et
au cours 7
pour les autres aides de programmation dont je viens de parler.
Bonne chance dans cet autre domaine de fix !
===============================================================================
Enfin, pour clore ce beau cours, je parlerais rapidement des outils et
des
programmes de ce disk.
PARTIE PRATIQUE : OUTILS
-----------------------------------------------------------------------
11. Disk_compare, et
Fast_compare (Sam-1985)
12.
Rwts
(cours 3)
13.
Sread/Swrite
(cours 7)
Le disk compare est en catalog sur ce disk (fast compare) et toutes les
explications necessaires à son utilisation sont dans ce cours
meme.
Toutes les explications necessaires relatives à la rwts 3.3 sont
contenues dans
le cours 3 à ce sujet. Toutes les explications necessaires
à la super routine
Sread/Swrite sont dans le cours rubrique à brac numéro 7.
LES PROGRAMMES "FIXS" ET
LEURS SOURCES
-----------------------------------------------------------------------
14. Fix modele
1
(Godfather)
15. Fix modele
2
(Captain crack)
16. Fix modele
3
(The ACS - aucun source)
Sautez vite sur votre merlin pro, tous ces programmes sont en catalog
sur ce
disk, programmé par un peu tout le monde, un peu tous les
fixeurs fous...
dont j'espère que vous allez maintenant faire activement partie.
Amicalement, Godfather
===============================================================================
===============================================================================
LES PROGRAMMES DE CE
DISK
Godfather
===============================================================================
Révision
1.00
Update : 07 Mai 1988
1. FAST COMPARE (c) SAM
=======================
Le source original de ce programme se trouve aussi sur ce disk. et
toutes
les explications sur le "comment il peut servir à fixer un jeu",
dans le cours.
===============================================================================
INFORMATIONS CONCERNANT LES COURS
-------------------------------------------------
Fichier mis à jour ce 7 Mai 88!
===============================================================================
3 NOUVEAUX COURS : COURS 11.2, COURS 17.2, COURS 19
-------------------------------------------------------------------------------
11.2 : TOUT sur les nouvelles techniques de mise en catalog. Un cours
rempli de
programmes inédits
automatisant au maximum le boulot !.. tant que vous
n'aurez pas lu et vu ce que
contient ce cours, vous ne pourrez pas
dire maitriser l'art complexe de
la mise en catalog, qui que vous soyez!
Avec le cours 11, ca forme la
bible de la mise en catalog !
17.2 : TOUT sur la nouvelle protection d'origin systems,
employée sur Ultima5,
qui est l'original de ce nouveau
cours, et que l'on a beaucoup de
chances de revoir bientot sur leur
nouveaux softs, dont Space Rogue et
Homecourt ( Basketball ). Leur
protection est très originale...
mais je n'en dis pas plus!
19 : TOUT sur les 18 secteurs de BR0DERBUND, et sur leur
DOS 18s.
Comment faire un copieur
paramétré spécialement pour leurs nouveaux
softs ? Comment controler la
routine read/write/format 18 secteurs ?
Comment se faire l'enregistrement
magnetique avec les drives Apple ?
Autant de questions qui trouveront
un réponse dans ce nouveau cours !
===============================================================================
DEUX NOUVEAUX GODFATHER'S PRODUCTS (11,12) : ACCO'BOOT 1.00 + SHORT
R/W/F
-------------------------------------------------------------------------------
GP11 : Pour s'incruster sur un boot (signature, fix integré,
etc..), rien de
plus géant que ce boot
inédit style Tom E.Hawk boot!.. le programme
est accompagné d'un fichier
explicatif très complet, sur le mode
d'emploi technique, et toutes les
applications que l'on peut en faire..
De plus, ici, un concours vous
sera proposé. 1er prix : 2 cours gratuits
GP12 : La plus courte des routines disk, et à la fois la plus
paramétrable..
C'est la short read/write/format
routine !..
LES NOUVEAUX COURS EN PROJET :
===============================================================================
COURS 18.2 REVISION 1.00 : FIXEZ VOUS LA VIE 2
COURS 20 REVISION 1.00 : PROTECTION ELECTRONIC ARTS
1980-1987 (MCODE)
COURS 20.2 REVISION 1.00 : PROTECTION ELECTRONIC ARTS 1988
(Originaux disponibles : Legacy of the Ancients, Chuck Yeager's Advanced
Flight Trainer, Wasteland, Death Lord...)
Et en plus : COURS 01 REVISION 4.10
(Update 25/02/88)
COURS 02 REVISION 1.2D (Update 02/02/88)
COURS 03 REVISION 2.51 (Update 06/03/88)
COURS 10.2 REVISION 1.20 (Update 01/05/88)
COURS 12 REVISION 1.70 (Update 02/02/88)
Déjà disponibles !
-------------------------------------------------------------------------------
Et je le rappelle : toutes les révisions de cours sont gratuites
!! 1.2D
(Update 02/02/88)
COURS 03 REVISION 2.51 (Update 06/03/88)
COURS 10.2 REVISION 1.20 (Update 01/05/88)
COURS 12 REVISION 1.70 (Update 02/02/88)
Déjà disponibles !
-------------------------------------------------------------------------------
Et je le rappelle : toutes les révisions de cours sont gratuites
!!