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 :