 |
Ca Peut Cervir ! |
(oui, y'a une faute mais sinon ca ne
faisait pas "CPC"...) |
 |
Augmenter le nombre de
vies dans les jeux grace a DISCOLOGY.
Je suppose que beaucoup se souviennent avoir
parcouru les secteurs des disquettes de leurs jeux favoris avec l'editeur
de Discology afin d'y modifier des chaines de caracteres precis. Ces
"bidouilles" delivrees par les magazines visaient souvent a augmenter le
nombre de vies ou encore annuler leur decrementation. Nous etions ainsi
invites a rechercher et modifier des codes hexadecimaux, sans toujours
trop savoir a quoi cela correspondait reellement, tant que le resultat
escompte etait bien la.
Je vous propose donc
un petit tuto rapide qui vous permettra de realiser vos propres
bidouilles, et surtout de les comprendre, pour ainsi commencer vos parties
avec la quantite de vies que vous souhaitez (jusqu'a 255) !
Mais avant de nous
lancer corps et ame dans les manipulations d'octets, je vous propose une
petite explication qui, je l'espere, les rendra plus limpides et claires
que de l'eau de roches :
Imaginons un jeu dans
lequel vous possedez au depart 5 vies. Prenons, par exemple, le jeu "Light
Force" dont c'est le cas. Le nombre 5 est logiquement stocke dans une case
memoire a l'initialisation de la partie. Pour pouvoir la modifier, il nous
faut donc localiser dans le programme cette fameuse case memoire.
Juste pour information, voici ce que cela
pourrait donner en assembleur pour un jeu a cinq vies :
LD A,5 3E 05 (on met le nombre 5 dans
le registre A)
LD (4FC7),A 32 C7 4F (on met le
registre A dans une case memoire - ici 4FC7)
La case memoire depend
bien sur du bon vouloir du programmeur et vous ne pouvez pas la deviner.
Mais vous connaissez toutefois desormais les trois premiers octets qui
sont 3E 05 32. Et c'est juste ce que
nous devons savoir pour realiser nos bidouilles sur la plupart des jeux
CPC ! En effet, il suffira ainsi de changer le "05"
par n'importe quel nombre (de 00 a FF car nous sommes en Base 16) pour
obtenir de 0 a 255 vies !
Allez, passons a la
pratique !
Pour cela, il faut :
1) Charger Discology
dans le CPC et selectionner son editeur.
Remplacer la disquette (ou le
DSK en emulation) de Discology par celle du jeu que l'on souhaite
bidouiller.
2) Dans le
menu "Mode", selectionner "Edition Fichier"
3) Choisir le
fichier qui constitue le programme principal du jeu (souvent un .BIN de
bonne taille)
4) Dans le
menu "Fonctions", selectionner "Rechercher"
5) Appuyer
sur "H" pour "Hexa"
6) Saisir la
chaine de caracteres "3E,xx,32" (dans notre exemple avec Light Force, "xx"
est agale a 05. On cherchera donc 3E,05,32)
7) Une fois
la chaine de caractere trouvee par Discology, remplacer xx (ici 05) par ce
que vous souhaitez (par exemple "FF" pour obtenir le maximum, soit 255).
8) Ce n'est
pas obligatoire, mais a cet instant vous pouvez desassemblez le secteur
(menu "Afficher" puis "Desassembler ecran"). Si le listing qui s'affiche
laisse apparaitre beaucoup d'instructions du type "LD (XXXX),A" c'est que
vous avez des chances d'etre tombe sur les bonnes initialisations.
9)
Sauvegarder la modification en selectionnant "Ecrire"
Et voila !
Il ne vous reste plus qu'a tester votre ouvrage
de petit hacker en herbe en lançant le jeu.
Prenez la precaution de realiser ces
modifications sur une copie de votre jeu. En effet, il pourrait y avoir
plusieurs chaine 3E,xx,32 dans son programme et il n'est pas certain que
vous ayez la chance de modifier la bonne du premier coup ! Cela pourrait
alors conduire a un plantage du jeu.
Comprendre la structure
d'une entete de fichier sur DISCOLOGY.
Analysons l'implantation des fichiers
Amstrad CPC sur une disquette 3".
Nous allons, pour cela, nous
munir de l'Editeur de secteurs de Discology et nous rendre sur une zone de
la disquette qui contient le "Header" (ou "l'entete") d'un programme.
Le "header" d'un programme est en quelque sorte son amorce.
En
effet, les fichiers (sauf ASCII) sont sauves sur la disquette avec une
zone de 128 octets en en-tete. Cette zone permet d'obtenir certains
renseignements sur le fichier.
Voici comment elle se decompose :
- Le premier octet est le Numero de User, mais ce numero est
en fait assujetti a celui deja present dans le catalogue. Pour resumer, il
ne sert pas a grand chose (on peut d'ailleurs le modifier a volonte sans
que cela ne change quoi que ce soit).
- Ensuite, nous avons le nom
du fichier qui est constituee de 11 octets (8 octets pour le nom, 3 pour
l'extension).
- Les 6 octets suivants sont toujours a zero.
- Le 19eme octets indique quant a lui le type de fichier ("00" pour le
BASIC, "01" pour le BASIC protege et "02" pour le binaire).
-
Continuons avec 2 octets nuls tout de suite suivis par l'adresse
d'ecriture du fichier. Car lorsque le CPC charge un programme en memoire,
il faut bien qu'il sache a quelle adresse il doit etre place. C'est donc
sur les 22 et 23eme octets que l'on trouvera cette adresse disposee dans
le sens poids faible/poids fort, c'est-a-dire que pour un programme BASIC,
dont l'adresse de chargement est &170 les deux octets contiendront : 70
01.
- Le 24eme octet n'a pas de signification connue (ce qui est le
cas de la majorite des octets du Header).
- Les 25 et 26eme octets
renferment la longueur du fichier suivie de l'adresse de lancement sur
deux octets egalement. Cette adresse de lancement est nulle pour les
fichiers en BASIC (comme dans notre exemple) puisque l'adresse est
toujours constante (&170). En fait on trouve une valeur uniquement pour
les fichiers binaires sauves avec une adresse de lancement.
- Les
octets les plus importants se trouvent en position 68 et 69, ils
contiennent le "Checksum", a savoir la somme de controle des 67 octets
precedents. Cette somme de contrôle permet de faire la difference entre
les fichiers ASCII et les autres types de fichiers. En effet lors de
l'ouverture d'un fichier l'ordinateur recupere la somme de controle et la
compare a la somme des 67 octets precedents. Si l'on a affaire a un
fichier ASCII, Il est tres peu probable que les 2 octets reserves au
controle contiennent la somme des autres octets.
Et voila, vous
savez a present decrypter une entete de fichier sous Discology ! Bonne
chasse aux Header !
Taille et poids des fichiers.
Abordons la taille des fichiers en
Kilo-Octet.
Le petit tableau ci-dessous nous permet de connaitre
rapidement la fourchette exacte pour le poids de vos fichiers (de 1 a 42 Ko).
Par exemple, un fichier de 10 Ko correspond a une taille comprise
entre &02381 et &02780.
Aussi, si vous sauvegardez un fichier d'une
longueur de &4000, vous trouverez que cela correspond a un poids de 17 Ko sur
la disquette (puisque &4000 est compris entre &03F81 et &04380).
Et
c'est la que j'en viens a une petite astuce permettant de gagner un precieux
petit Kilo octet...
En effet, une taille de &4000 (soit 17Ko) c'est
pile-poil celle d'un ecran non compresse sur Amstrad. Mais si l'on reduit
cette taille a &03F80, on passe a 16 Ko !
"Mais l'ecran ne sera pas
complet !", me direz-vous... et vous aurez raison. Sauf qu'il faut savoir que
cette toute petite reduction n'affectera que la toute derniere ligne de base
horizontale de l'ecran. Il suffira donc de ne rien dessiner sur cette ligne et
ainsi exploiter 199 pixels verticalement (au lieu des 200 disponibles dans les
resolutions originales du CPC) pour que cela passe totalement inapercu !
Les mysterieux caracteres de controle de l'Amstrad CPC.
Lorsque l'on consulte le manuel de l'utilisateur
de l'Amstrad CPC pour connaitre son jeu de caracteres, on s'apercoit que ce
dernier ne debute qu'a partir de 32, comme le montre l'illustration ci-dessous
:
Ainsi, conformement a cette table de caracteres, un PRINT
CHR$(32) sous BASIC affiche un caractere vide, un PRINT CHR$(33) affiche un
point d'exclamation, un PRINT CHR$(34) affiche un guillemet, un PRINT CHR$(35)
affiche un diese, un PRINT CHR$(36) affiche un dollar, etc... jusqu'a PRINT
CHR$(255) qui affiche une double fleche.
Mais alors, quelles sont les
possibilites insoupconnees des 31 caracteres precedents ?!?!?
Et bien
Claude Le Moullec nous les devoilait dans le premier numero du magazine
MICROMAG !
Voici :
0 : sans effet. Toutefois, mis a la suite d'un
autre caractere de contrôle, il assure le retour a la normale.
1 : s'il
precede un autre caractere de controle; affichage de la representation
graphique de ce caractere. A donc le meme effet que CTRL + lettre. Pour s'en
convaincre, faire :
FOR H=0 TO 31 :PRINT CHR$(1)CHR$(H);:NEXT A la suite de
certains caracteres, il etablit un mode specifique :
CHR$(22)+CHR$(1) mode
transparent
CHR$(22)+CHR$(0) retour au mode normal
2 : eteint le
curseur. Mais celui-ci se rallume apres chaque message READY : PRINT
CHR$(2):INPUT "VOTRE NOM";NM$
3 : rallume le curseur.
4 :
etablit un mode quand il est suivi du parametre adequat. PRINT CHR$(4)+"0"
fait passer en mode 0. D'un interet limite.
5 : suivi d'un code ASCII,
affiche ledit code a la position du curseur graphique. Agit un peu comme la
fonction TAG mais pour un seul caractere. Exemple : ORIGIN 100,100:PRINT
CHR$(5)+CHR$(56) ou CLS:ORIGIN100,100:A$ ="BONJOUR":PRINT CHR $(5)+A$
(etonnant!)
6 : retablit l'affichage texte. En opposition a CHR$(21).
7 : fait retentir un "Beep !" depuis le haut-parleur du CPC.
8, 9,
10 et 11 : deplacement du curseur dans les quatre directions. Nombreuses
possibilites (voir leçon n°2). Autre debouche : vous avez a l'aide de quatre
caracteres redefinis, dessine un petit personnage en mode 1. Pour l'afficher,
il existe cette solution : LOCATE 1,1 PRINT CHR$ (240)+CHR$(241):LOCATE
1,2:PRINTCHR$(242) + CHR$(243) ou celle qui consiste tout d'abord a
transformer votre personnage en une variable du type
MAN$=CHR$(240)+CHR$(241)+CHR$(8)+CHR$(8)+CHR$(10)+CHR$(242)+CHR$(243)
Puis
a l'afficher tout simplement par LOCATE1,1:PRINTMAN$ De prime abord un
tantinet laborieuse, cette mise en œuvre facilite grandement la gestion dans
le cas d'affichages ulterieurs repetitifs.
12 : meme effet que CLS mais
avec la possibilite de s'inclure dans une variable A$ = CHR$(12) +
"AM-MAG":PRINT A$
13 : meme effet que ENTER, retour a gauche de la
ligne. En souvenir du temps ou les ordinateurs ne travaillaient qu'avec des
imprimantes.
14 : etablit le PAPER lorsqu'il est suivi d'un parametre
(voir "CHR$(4)").
15 : idem mais pour le PEN.
16 : permet
a'effacer le caractere se trouvant sous le curseur.
17 : efface la
portion de ligne situee a gauche du curseur.
18 : idem, mais a droite.
19 : efface toute la partie de l'ecran se trouvant au dessus du curseur.
20 : idem, mais pour la partie en dessous du curseur.
21 : stoppe
affichage texte. En relation avec CHR$(6).
22 : avec CHR$(1), active le
mode transparent.
23 : avec 1, 2 et 3, active differents modes
graphiques.
24 : permet d'obtenir l'inversion video. L'importance des
possibilites offertes par l'utilisation des caracteres de controle 22, 23 et
24 necessitera une lecon entiere. Deplacer un personnage sans effacer le
decor? Ne revez plus, c'est pour le mois prochain.
25 : meme effet que
la commande SYMBOL, quand il est suivi des parametres.
26 : idem, mais
pour la commande Window.
27 : inutilise pour l'ecran mais bien connu
des possesseurs d'imprimante, ce caractere de controle, associe a d'autres,
permet d'obtenir les differents styles d'ecriture qu'offre toute imprimante
digne de ce nom.
PRINT #8,CHR$(27)+CHR$(15)+CHR$(1)
Cette commande
etablira l'ecriture en mini de votre imprimante.
28 : suivi des
parametres necessaires; remplace la commande INK.
29 : idem pour la
commande BORDER.
30 : ramene le curseur dans le coin haut a gauche de
l'ecran.
31 : avec les parametres; meme effet qu'un LOCATE.
Pour
resumer, chaque caractere de controle est une instruction supplementaire tres
utile pour la gestion de l'ecran. A chacun correspond un caractere graphique
qui s'obtient par appui simultane sur CTRL + lettre. Amusez-vous a les
afficher un a un sur l'ecran : cette serie de signes cabalistiques s'avere des
plus interessantes. Le CHR$(7) est sans conteste le plus connu et le plus
usite. Il correspond au fameux BEEP sonore. La syntaxe en est : PRINT CHR$(7)
Le meme resultat s'obtient par la representation graphique de CTRL + G mise
entre guillemets. De plus, CHR$(7) necessite la frappe de sept touches contre
trois seulement dans l'autre cas. La logique voudrait donc que nous utilisions
la deuxieme solution. Desole pour les partisans du moindre effort, mais cette
solution est a eviter, car aucune imprimante n'est capable de transcrire ces
fameux caracteres graphiques. En effet, utilisant pour son propre pilotage des
caracteres de controle, l'imprimante les recevra comme des ordres lui etant
adresses et non comme des signes a transcrire. Dans le meilleur des cas, les
caracteres de controle n'apparaitront tout simplement pas sur le texte. Mais
helas, tres souvent, c'est le plantage de l'imprimante qui vous attend. Bien
sur, si votre logiciel n'est diffuse que sur support magnetique (disc ou K7)
rien ne vous empeche de les utiliser.
Ressusciter les fichiers effaces sur une disquette.
S'il y a bien une chose que j'adorais faire a l'epoque
lorsque je ramenais de nouvelles disquettes Amstrad CPC a la maison, c'etait
fouiller leurs entrailles a la recherche d'eventuels fichiers, ou meme de
jeux, qui auraient ete effaces.
Imaginez-vous, tel un Indiana Jones
numerique, explorant les mysterieux octets d'un disque magnetique et tombant,
au hasard des meandres du catalogue, sur les vestiges d'un fichier cache,
efface, supprime et oublie... Qui pourrait alors resister a la tentation de
l'exhumer afin de decouvrir de quoi il s'agit ?
Decouvrons ensemble la
methode pour y parvenir avec Discology.
Et croyez bien que cela tient
reellement du jeu d'enfant !
Allez, c'est parti avec un exemple
concret...
1) Sur le catalogue de la disquette ci-dessous (auquel on
accede sous Basic avec la commande CAT), on peut voir qu'il y a 29 fichiers au
total stockes sur la disquette :
2) Si l'on charge cette meme disquette dans l'editeur de
secteurs de Discology et que l'on se balade un peu sur sa piste 00, on tombe
sur son catalogue physique. C'est ici que l'on peut retrouver les 29 fichiers
qui sont stockes sur la disquette (et qui se sont affiches avec la commande
CAT sous BASIC)... mais aussi ceux qui l'ont eventuellement peuple avant
d'etre effaces !
Dans notre exemple, on voit bien qu'un fichier "FINDME.BAS"
apparait ici alors qu'il ne s'etait pas affiche avec la commande CAT sous
BASIC !
Et si l'on s'attarde au premier octet qui precede son nom, on peut
voir un "E5", tandis que pour tous les
autres fichiers on peut lire "00"...
Vous l'avez compris : "E5" indique a l'Amstrad que le fichier qui suit a ete
efface, qu'il ne doit plus remonter lors d'un CAT et qu'il peut desormais etre
ecrase par de nouvelles donnees.
3) Eh bien il suffit de changer cet "E5"
par un "00" pour ressusciter le fichier !
4) Une fois la modification sauvegardee, un CAT sous BASIC
fait effectivement desormais remonter le fichier "FINDME.BAS"
! Il ne reste plus qu'a le charger, voire meme l'executer !
Alors il faut savoir que la limite de cette manipulation
tient aux nombres de sauvegardes qui ont eventuellement ete faites ensuite sur
la disquette apres l'effacement du fichier...
En effet, lorsqu'un fichier
est efface, il libere physiquement la place qu'il occupait sur la disquette.
Tant qu'aucun autre fichier n'est ensuite sauvegarde sur la disquette, les
donnees du fichier efface restent intacts. Mais si de nouveaux fichiers sont
sauvegardes sur la disquette, le risque que les donnees de ceux-ci viennent
ecraser celles du fichier efface est tres fort. Et dans ce cas, son integrite
sera helas corrompu. Alors il sera toujours possible de ressusciter le fichier
avec la manip que je vous ai explique, mais il sera altere (listing incomplet
pour les fichiers BASIC, images avec plus ou moins d'artefacts, etc...)
Ceci dit, avec cette methode j'ai pu exhumer a l'epoque un bon paquet
d'images creees sous OCP Art Studio ou encore des listings BASIC de jeux
saisis par des utilisateurs.
Alors a vos Pistes 00 !
PS : A
noter qu'il est egalement possible de realiser cette meme manip, de maniere
tres conviviale sous Windows, avec le logiciel "ManageDSK".
Ecrire un programme en BASIC sans Amstrad.
Voici un petit Tuto qui pourrait donner corps a
vos idees creatives...
Ce Tuto s’adresse a tous ceux qui n'ont plus
d'Amstrad CPC mais qui ont un jour ressenti l’envie de creer un petit
programme en BASIC en vue de l'emuler via un DSK... mais qui se sont
finalement ravises devant l’apparente difficulte de la tache et, surtout, le
manque d'information sur la methode a adopter.
Alors je vous rassure
tout de suite, avec les bons outils, l'operation est en realite tres simple et
se boucle en quelques clics. Il existe bien evidemment d'autres methodes, mais
celle-ci a, a mes yeux, l'avantage de permettre de profiter de la convivialite
de la saisie sous Windows.
Allez, c’est parti !
Avant tout,
munissez-vous des 2 logiciels pour Windows suivants (cliquer pour tetecharger)
: CPC Token
et
ManageDSK
A) SAISI DU
PROGRAMME BASIC
Ouvrez le Bloc-notes de Windows
1) Saisissez vos lignes
en BASIC Amstrad
2) Sauvez votre fichier (par exemple en "PROG.TXT")
B) CONVERSION DU FICHIER
.TXT EN FICHIER .BAS
Executez CPC Token
1) Cliquez sur le bouton en
forme de petit dossier jaune en haut a gauche et pointez sur votre fichier
TXT.
2) Cliquez sur le bouton bleu "Create AMSDOS Basic Files (BAS / BIN)"
3) Cliquez sur "Compil Input text".
C) INTEGRATION DU FICHIER
.BAS DANS UN FICHIER .DSK
Executez ManageDSK
1) Cliquer sur le bouton
"Creer DSK"
2) Cliquez sur le bouton "Ajouter fichier(s)"
3) Pointez sur
le fichier .BAS precedemment cree
4) Cliquer sur le bouton "Sauver DSK"
Et voila !
Vous disposez desormais d'un fichier fraichement cree et
baptise "Disquette_Vide.DSK" contenant votre programme BASIC pret a etre
execute sur n'importe quel emulateur ! J
Alors a vos clavier : vous n'avez
plus d'excuse pour ne pas programmer sur CPC !
Economiser de precieux Octets dans un programme BASIC.
Voici une astuce simple, rapide et indolore qui vous
permettra de reduire la taille de vos programmes BASIC en un clin d'oeil et
preserver ainsi de precieux Ko de RAM !
La subtilite consiste a
supprimer les espaces inutiles dans les lignes de code BASIC du programme.
Et, par chance, il existe une commande, sous forme de POKE, qui realise
l'operation automatiquement et instantanément.
Cette commande, c'est :
POKE 44032,1
Il suffit donc de
saisir cette commande apres la saisie d'une ou plusieurs lignes de programme
BASIC pour qu'elle opere.
Par exemple, dans le programme BASIC de 21 Ko
ci-dessous, il a ete possible d'economiser 2 Ko :