Cours de déplombage 18.2



Ecran
Ecran
Ecran


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.
----------------------------------------------------------------------


Floppy
DOS 3.3
Download Cours GDF 18.2 rev 1.00 (gzipped)


Sommaire


Lien Article
Voir Introduction.
Voir Cours 18.2 revision 1.00.
Voir Les programmes de ce disk.
Voir Informations cours.

hr cours GDF

Introduction.


===============================================================================
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
===============================================================================


Retour sommaire

hr cours GDF

Cours 18.2 revision 1.00.


===============================================================================
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
===============================================================================


Retour sommaire

hr cours GDF

Les programmes de ce disk.


===============================================================================
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.

===============================================================================


Retour sommaire

hr cours GDF

Informations 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 !!


Retour sommaire