Lisez bien la FAQ. Pour poster un message ou poser une question, vous devez être enregistré. Vous n'êtes pas obligé d'être connecté pour lire les messages et voir les contenus.
Nous espérons que vous trouverez vos réponses ici, et n'hésitez pas à participer.
Bonne visite !
Sur ces forums, il est possible d'aborder n'importe quels sujets, de façon sérieuse ou pas !
Afin de préserver son harmonie et éviter les débordements, nous avons établi un ensemble de règles très simples que nous vous demandons de respecter.
1) Les thèmes suivants ne doivent jamais être abordés: La politique, La religion, La haine raciale, La pédophilie. Faites appel à votre bon sens pour éviter tout autre sujet susceptible de provoquer une polémique trop violente.
2) Ce forum est destiné à l'Abandonware (jeux a l'abandon) et le jeu vidéo. Les discussions ou liens vers un contenu illégal (piratage, désinformation, complotisme...), ou vers des contenus adultes, financiers, religieux... seront systématiquement effacés.
3) Ne publiez pas d'images dans vos messages qui pourraient choquer les autres visiteurs (rappel, le public peut être très jeune).
4) Lorsque vous lancez un sujet, veillez à ce qu'il soit dans le forum approprié (ne faites pas par exemple une requête dans le forum Discussion générale / Le bar des amis).
5) Il est souhaitable de ne pas faire dévier un sujet, ne serait-ce que par respect pour celui ou celle qui a lancé la discussion.
6) Avant de poser une question d'ordre (technique, requêtes...), assurez-vous qu'elle n'ait pas déjà été posé via la recherche.
6) Nous détestons le SPAM et le Flood ! Évitez donc de poster des messages inutiles et de façon répétée.
7) Peace and Love ! Les forums sont un endroit de détente, amusez-vous, ne vous prenez pas la tête inutilement en public.
8) Les administrateurs et modérateurs sont présents pour s'assurer que les règles et les personnes soient respectées. Leurs décisions sont elles-mêmes à respecter.
9) Ce forum n'est pas un téléphone portable ! Un forum est un lieu où on prend le temps, donc évitez le langage "texto/SMS". De plus, vos messages ne sont pas limités à 160 caractères, alors s'il vous plait, écrivez correctement ! Clairement, on ne va pas vous tomber dessus pour un "s" oublié ou pour un accord incorrect, mais pas de "g chrché c je pandan dé mwa"! Copiez-collez votre message dans Word pour profiter du correcteur orthographique, au besoin.
Ces règles sont très importantes, merci de les respecter ! En cas de non-respect, vous pourrez recevoir un avertissement, ou en fonction de la faute, être banni temporairement, voir définitivement du forum.
Merci à vous et bonnes discussions
Entre deux séances de télétravail j'ai commencé à décompiler (autrement dire "traduire" le fichier vers un langage de haut niveau) l'exécutable de "meurtres en série" de cobrasoft... Version MS-DOS.
En regardant le code machine on voit assez vite qu'il s'agit d'un programme originalement en langage C, mais j'ai eu beaucoup de mal à deviner quel était le compilateur utilisé à l'époque: les plus connus étaient ceux de Borland et Microsoft, mais dans ce cas il s'agissait d'autre chose.
Et puis grâce à Google et à ce site web https://www.aztecmuseum.ca/, j'ai trouvé enfin ma réponse : Aztec C, de Manx Software System.
J'ai pu même retrouver la bonne version du compilateur, ce qui m'a permis d'avancer pas mal. Alors d'ici une ou deux semaines je pense pouvoir recréer un code source compilable. Techniquement, rien de formidable: des fonctions en C (k&r, ça peut surprendre au début) et quelques routine en assembleur.
par contre la routine de "delay" utilise la fonction timer du dos, qui, comme chacun sait, n'est pas implémentée sous dosbox. Ça pourrait toujours intéresser quelqu'un de corriger ça. Karamoon? ;-)
karamoon cool. ben quand c'est fini, je poste les infos ici.
petite remarque generale: quelqu'un a deja remarque que la fonte du jeu "Meurtres en serie" et celle de "Le maitre des ames" etaient ... ressemblantes ?
Ce sont apparemment les mêmes. On retrouve aussi cette police de caractères dans Sorcery/Sorcery+.
(On peut trouver son équivalent TrueType sous le nom "American Uncial".)
Dernière modification par GT400, 27 mars 2020, 14h57.
As the mist clears, the eerie image of a forest forms in front of you. To the east, a vast plain extends towards the horizon. Westward howewer, in the thick of the forest, a thousand pairs of eyes pierce the mist, glaring despondently back at you.
Ce sont apparemment les mêmes. On retrouve aussi cette police de caractères dans Sorcery/Sorcery+.
(On peut trouver son équivalent TrueType sous le nom "American Uncial".)
Bien vu pour Sorcery ...
Ceci etant dit, le travail de decompilation est termine. Je vais peut-etre uploader le tout sur mon github mais j'ai envie de compiler l'autre EXE (celui pour editer les portraits des personnages) d'abord ... enfin si je trouve le temps.
Je vais donc poster le tout ici pour commencer.
En premier, un petit batch file qui permet de creer l'exe (vous devez changer quelques chemins pour adapter a votre config):
DOIT.BAT
Code:
SET CROOT=\TOOLS\AZ8634B
SET CLIB=%CROOT%\LIB\
SET OLDPATH=%PATH%
SET INCLUDE=%CROOT%\INCLUDE
SET PATH=%CROOT%\BIN;%PATH%
CC -E300 SERCQ.C
AS MUSIC.ASM
CC DEMO.C
LN SERCQ.O MUSIC.O DEMO.O C.LIB G.LIB
SET PATH=%OLDPATH%
SET OLDPATH=
Ensuite, un fichier include:
SERCQ.H
Code:
#ifndef __SERCQ_H__
#define __SERCQ_H__
#define SPEED_FOOT 0
#define SPEED_BIKE 1
#define SPEED_ROAD 2
#define SPEED_SEA 3
/*0A4A*/extern int MUSIC_flag;
/*1A50*/extern void *PBuffer1;
/*1A60,1A62*/extern int Map_x,Map_y;
/*1A64*/extern int Speed;
/*1A66,1A68*/extern int Clock_H,Clock_M;
/*1A90*/extern unsigned char TmpString[];
#endif
Attendez, il y a encore trois fichiers ... j'esperes que ca va passer
Et enfin un dernier fichier en C, demo et questionnaire de fin de jeu:
DEMO.C
Code:
#include <ctype.h>
#include "sercq.h"
/*3674*/Explanation()
{
ClrConsole();
SetTextColor(2);
PutString(/*0AE4*/" PROGRAMME DE TEST\n\n\n");
SetTextColor(3);
PutString(/*0B03*/" Ce programme ne vous indiquera jamais ");
PutString(/*0B2C*/"la solution compl}te mais il vous permet");
PutString(/*0B55*/"de tester un certain nombre de points ");
PutString(/*0B7E*/"particuliers.\n");
PutString(/*0B8D*/" Pour consid{rer que vous avez fini le ");
PutString(/*0BB6*/"jeu, il faut avoir vu tous les personna-");
PutString(/*0BDF*/"ges, tous leurs t{moignages quand ils en");
PutString(/*0C08*/"ont plusieurs, et d{couvert l'emplace- ");
PutString(/*0C31*/"ment de chaque indice.\n");
PutString(/*0C49*/" Les r{ponses au questionnaire doivent ");
PutString(/*0C72*/"~tre donn{es selon un format sp{cial :\n");
PutString(/*0C9A*/"- toujours en majuscule\n");
PutString(/*0CB3*/"- personne : son pr{nom puis son nom\n");
PutString(/*0CD9*/"- heure : chiffre puis H sans espace\n");
PutString(/*0CFF*/"- indice : son num{ro seul\n");
PutString(/*0D1B*/"- liste : mots ou noms s{par{s par /\n");
PutString(/*0D41*/" sans espace\n");
PutString(/*0D50*/"- Coordonn{es : s{par{es par un .\n\n\n");
}
/*3726*/Contest()
{
SetTextColor(3);
PutString(/*0D75*/"Un concours sera organis{...\n");
PutString(/*0D93*/"1er Prix : Un week-end @ Sark !\n");
PutString(/*0DB4*/"Tenez-vous inform{ en consultant notre\n");
PutString(/*0DDC*/"serveur t{l{matique (Voir notice).\n\n");
PutString(/*0E01*/"Pour relancer le test tapez T, sinon\n");
PutString(/*0E27*/"sur n'importe quelle autre touche.");
}
/*3765*/AskQuestion(_str, _checksum)
char *_str;
int _checksum;
{
int i;
i = 0;
SetTextColor(1);
/*-- display question --*/
PutString(_str);
/*-- read answer --*/
_str = (char *)TmpString;
/*-- --*/
GetString(_str);
/*-- compute answer's checksum --*/
while(*_str)
i += *_str ++;
/*-- verify checksum --*/
if(i == _checksum)
PutString(/*0E4A*/"\nREPONSE VRAIE\n\n\n");
else
PutString(/*0E5C*/"\nREPONSE FAUSSE\n\n\n");
}
/*37BC*/Questionnaire()
{
AskQuestion(/*0E6F*/"A quelle heure Backlinder est-il mort ? ", 0x7F);
AskQuestion(/*0E9F*/"Qui a vol{ le v{lo du pasteur ? ", 0x334);
AskQuestion(/*0EC0*/"Ou trouve-t-on un pendu ? ", 0x101);
AskQuestion(/*0EDB*/"Combien de morts, au total ? ", 0x38);
AskQuestion(/*0EF9*/"Qui meurt @ 17H45 ? ", 0xA91);
AskQuestion(/*0F0E*/"A qui se rapporte l'indice 8 ? ", 0x428);
AskQuestion(/*0F2E*/"En quoi est {crit l'indice 6 ? ", 0x189);
AskQuestion(/*0F4E*/"A quelle heure Gwendal quitte-il son domicile ? ", 0x10E);
AskQuestion(/*0F82*/"Coordonn{es de la cabane de Johnny ? ", 0x15A);
AskQuestion(/*0FA8*/"Quelle indice dans la malle ? ", 0x33);
AskQuestion(/*0FC7*/"Quel indice chez Macomber ? ", 0x63);
AskQuestion(/*0FE4*/"Qui vous appelle au t{l{phone ? ", 0x40F);
AskQuestion(/*1005*/"Que vous dit le fantome ? ", 0x1BF);
AskQuestion(/*1020*/"Combien d'indices changent de place ? ", 0x32);
AskQuestion(/*1047*/"Dickson meurt @ quelle heure ? ", 0x110);
AskQuestion(/*1067*/"Coordonn{es du tuba ? ", 0x12F);
AskQuestion(/*107E*/"Qui a tu{ Backlinder ? ", 0x334);
AskQuestion(/*1096*/"Ou a {t{ pris l'indice 1 ? ", 0x131);
AskQuestion(/*10B2*/"A quel indice se rapporte l'indice 22 ? ", 0x37);
AskQuestion(/*10E0*/"Que lit-on sur l'autre morceau du parchemin ? ", 0x991);
AskQuestion(/*1115*/"Quid ? ", 0x129);
AskQuestion(/*111D*/"Coordonn{es du Tr{sor ? ", 0x104);
}
/*38F7*/Ending()
{
int bp_02;
int key;
Window(0, 0, 39, 24, 3);
do {
Explanation();
Questionnaire();
Contest();
while((bp_02 = GetKey_0(&key)) != 1);
}while(key == 'T' || key == 't');
}
#asm
PUBLIC Sound_1_ ;393F
Sound_1_:
MOV BX,100h
IN AL,61h
AND AL,NOT 3 ;FC
MOV DX,BX
C_3948:
XOR AL,2
OUT 61h,AL
MOV CX,DX
C_394E:
LOOP C_394E
DEC BX
JNZ C_3948
RET
#endasm
#asm
PUBLIC Sound_2_ ;3954
Sound_2_:
PUSH BP
MOV BP,SP
MOV DX,[bp+04]
MOV BX,[bp+06]
IN AL,61h
AND AL,NOT 3
C_3961:
XOR AL,2
OUT 61h,AL
MOV CX,DX
C_3967:
LOOP C_3967
DEC BX
JNZ C_3961
POP BP
RET
#endasm
/*----------------------------------------*/
/*
/*----------------------------------------*/
C_396E(_str, _col, _row, _color)
unsigned char *_str;
int _col;
int _row;
int _color;
{
unsigned char ch;
while(*_str)
{
SetCursorPosition(_col ++, _row);
ch = *_str ++;
if(isalpha(ch))
ch = ch | 0x80;
WriteCharacter(ch, _color);
}
}
/*39C2*/Prologue()
{
int row;
row = 3;
C_396E(/*1136*/" PROLOGUE", 2, row ++, 2);
row += 3;
C_396E(/*114B*/"UN MEURTRE A ETE COMMIS A SERCQ !", 2, row ++, 3);
C_396E(/*116D*/"CONNAISSANT VOTRE REPUTATION DE ", 2, row ++, 3);
C_396E(/*118E*/"FIN LIMIER, ON A FAIT APPEL A VOUS.", 2, row ++, 3);
row ++;
C_396E(/*11B2*/"IL EST ONZE HEURES. DANS QUELQUES", 2, row ++, 3);
C_396E(/*11D4*/"MINUTES VOUS SEREZ SUR L'ILE,", 2, row ++, 3);
C_396E(/*11F2*/"L'AFFAIRE NE FAIT QUE COMMENCER !", 2, row ++, 3);
row ++;
C_396E(/*1214*/"MAIS VOTRE PLANNING EST CHARGE...", 2, row ++, 3);
C_396E(/*1236*/"UNE AUTRE ENIGME VOUS ATTEND EN", 2, row ++, 3);
C_396E(/*1256*/"ITALIE. LE BATEAU PART A DIX-NEUF", 2, row ++, 3);
C_396E(/*1278*/"HEURES. TOUT DEVRA ETRE ELUCIDE.", 2, row ++, 3);
row += 2;
C_396E(/*1299*/" BONNE CHANCE !", 2, row ++, 3);
}
/*3B0B*/Credits() {
int row;
row = 2;
C_396E(/*12B7*/" MEURTRES EN SERIE", 2, row ++, 2);
C_396E(/*12D1*/" _______________ ", 2, row ++, 2);
row += 3;
C_396E(/*12EB*/"REALISATION : BERTRAND BROCARD", 2, row ++, 3);
row ++;
C_396E(/*130D*/"GRAPHISMES : CHRISTIAN DESCOMBES", 2, row ++, 3);
row ++;
C_396E(/*1332*/"MUSIQUE : CHARLES CALLET", 2, row ++, 3);
C_396E(/*1352*/" JEAN-JACQUES MAHE", 2, row ++, 3);
row ++;
C_396E(/*1375*/"PROGRAMMATION : GILLES BERTIN", 2, row ++, 3);
row ++;
C_396E(/*1394*/"CONSEILS EN 'C': ROLAND MORLA", 2, row ++, 3);
row += 3;
C_396E(/*13B2*/"MEURTRES EN SERIE EST UN PRODUIT", 2, row ++, 1);
C_396E(/*13D4*/" 'HITECH PRODUCTIONS' ", 2, row ++, 1);
C_396E(/*13F6*/" EDITE PAR 'COBRA SOFT' SUR ", 2, row ++, 1);
C_396E(/*1418*/"PC - ATARI ST - THOMSON - AMSTRAD", 2, row ++, 1);
}
/*3C5A*/DemoDelay(_count)
int _count;
{
int bp_02;
int key;
Delay(_count);
bp_02 = GetKey(&key);
if(bp_02 != 9)
GameExit();
}
/*3C7E*/DemoPlaces(_placeId, _count)
int _placeId;
int _count;
{
int i;
ClrConsole();
SetCursorPos(0, 1);
PutString(/*143A*/"\n");
C_0721(/*143C*/"QUELQUES PAYSAGES CARACTERISTIQUES", 1);
PutString(/*145F*/"\n\n");
C_0721(/*1462*/" DE L'ILE DE SERCQ", 1);
for(i = 0; i < _count; i ++)
{
C_1C1B(_placeId + i, PBuffer1);/*load "dessind7.0xx" in buffer?*/
C_1C95(PBuffer1);/*render "dessind7.0xx" data*/
DemoDelay(14);
}
}
/*3CF4*/DemoCharacters(_charaId, _count)
int _charaId;
int _count;
{
int i;
ClrConsole();
SetCursorPos(1, 1);
PutString(/*147C*/"\n\n");
C_0721(/*147F*/" QUELQUES PERSONNAGES DU JEU", 1);
for(i = 0; i < _count; i ++)
{
Portrait(_charaId + i, 3, 0);
DemoDelay(10);
}
Portrait(0x23, 3, 0);
}
/*3D61*/DemoTime(_count)
int _count;
{
int i;
_count = _count / 2;
ClrConsole();
SetCursorPos(0, 1);
PutString(/*149E*/"\n");
C_0721(/*14A0*/"DANS 'MEURTRES EN SERIE'", 1);
PutString(/*14B9*/"\n\n");
C_0721(/*14BC*/"LE TEMPS AUSSI A SON IMPORTANCE...", 1);
for(i = 0; i < _count; i ++)
{
PlusOneMinute();
DemoDelay(2);
PlusOneMinute();
Delay(1);
}
}
/*14DF*/int DemoMode = 0;
/*3DDB*/DemoMovement()
{
int bp_02;
ClrConsole();
SetCursorPos(0 ,1);
PutString(/*14E1*/"\n");
C_0721(/*14E3*/"COMME SUR L'ILE DE SERCQ, VOUS", 1);
PutString(/*1502*/"\n\n");
C_0721(/*1505*/"POUVEZ VOUS DEPLACER ", 1);
SetCursorPos(21, 3);
PutString(/*151B*/" ");
SetCursorPos(21, 3);
switch(DemoMode)
{
case 0:
Speed = SPEED_ROAD;
Map_x = 78; Map_y = 21;
C_0721(/*1528*/"A PIED");
PutIcon(Map_x, Map_y, Speed, 0);
while(Map_x != 82 || Map_y != 83)
{
bp_02 = MapMove(4);
DemoDelay(2);
}
break;
case 1:
Speed = SPEED_BIKE;
C_0721(/*152F*/"EN VELO");
PutIcon(Map_x, Map_y, Speed, 0);
while(Map_x != 63 || Map_y != 141)
{
bp_02 = MapMove(4);
DemoDelay(2);
}
break;
case 2:
Speed = SPEED_SEA;
Map_x = 126; Map_y = 30;
C_0721(/*1537*/"EN BATEAU");
PutIcon(Map_x, Map_y, Speed, 0);
while(Map_y != 3)
{
bp_02 = MapMove(7);
DemoDelay(2);
}
while(Map_x != 79 || Map_y != 3)
{
bp_02 = MapMove(6);
DemoDelay(2);
}
break;
}
RestoreIcon(Map_x, Map_y);
if(DemoMode ++ == 2)
DemoMode = 0;
}
/*3F98*/Demo()
{
GraphMode();
Prologue();
Delay(40);
GraphMode();
InitGameScreen();
Portrait(0x23, 3, 0);
Clock_H = 11; Clock_M = 55;
ClockFace(Clock_H, Clock_M);
Clock_H = 11; Clock_M = 0;
ClockFace(Clock_H, Clock_M);
while(1)
{
MUSIC_start();
/*-- --*/
DemoPlaces(0x00, 8);
DemoCharacters(0x00, 9);
DemoTime(120);
DemoPlaces(0x08, 8);
DemoCharacters(0x09, 9);
DemoMovement();
/*-- --*/
DemoPlaces(0x10, 8);
DemoCharacters(0x12, 9);
DemoTime(120);
DemoPlaces(0x18, 8);
DemoCharacters(0x1b, 9);
DemoMovement();
/*-- --*/
MUSIC_stop();
}
}
char __1541 = 0;/*padding*/
Voila voila. Techniquement, ca ne va pas chercher tres loin. Il y a quand meme des appels aux fonctions Bios et Dos a travers les interruptions 0x10 et 0x21. Acces direct a la ram video. Et puis quelques fonctions en assembleur (surtout pour ce qui est bruitages et musique)
Il faut telecharger la version 3.4b du compilateur Aztec, qu'on trouve sur le lien que j'ai deja donne.
Si tout va bien, l'executable genere est identique a l'octet pres a l'original.
Hello, j'ai tout bien récupéré et ça compile nickel.. sous XP.
Bref, j'ai dû monter ma machine virtuelle de développement retro et tout marche bien.
Par contre je ne pense pas qu'il y ait de problème avec la fonction Delay, le problème avec les autres jeux (Hurlements par exemple) était qu'ils voulaient modifier directement l'heure du Dos (et donc du système hôte sous DosBox).
Mais là, pas de soucis on ne fait que lire le nombre de 1/100 de secondes écoulés.
J'y ai un peu joué et je n'ai rien vu de particulier, mais dites-moi si vous voyez un bug.
Dernière modification par karamoon, 01 avril 2020, 18h34.
Sous XP? Je n'aurais pas cru que ça marche. De mon côté j'ai fait sous dosbox.
pour le delay, je me suis un peu avancé alors? Je croyais que la fonction de lecture de l'horloge aussi n'était pas implémentée sous dosbox. Le jeu me paraissait un peu trop rapide aussi. Bon ben tant pis. Je suis quand même content que quelqu'un d'autre ait réussi le build. Merci.
J'ai un peu changé la méthode d'affichage de la conversation, car le texte défilait trop vite et on ne pouvait pas voir le début.
J'ai remplacé la pseudo tempo par l'attente d'une touche quand la zone de texte est remplie.
Voici le jeu mis à jour,
j'ai également ajouté la possibilité de changer la palette (par une question au démarrage) pour avoir une version un peu plus ressemblante à la version CPC.
Voila, j'ai termine de decompile DIGIT.EXE.
J'ai tout telecharge sur mon github: https://github.com/ergonomy-joe/SERCQ
J'y ai meme integre le patch de karamoon . (pas celui des couleurs parce que je pense qu'il faut ajouter un exe pour ca)
Pour les "autres" je compte bien les uploader aussi un jour ou l'autre, mais j'ai toujours l'impression qu'il me reste a truc a faire dessus avant de le publier, et puis a force de laisser courir... et puis un autre truc qui m'embete, c'est que, par exemple, pour le code source turbo pascal, les caracteres accentues sont encodes avec un vieux code (copde page 437, ou 850 je sais plus) et que Firefox ne gere plus du tout. Ca veut dire que pour afficher correctement le code, il faudrait le telecharger et l'ouvrir dans un outil adapte. Ca me parait pas top top.
Nous collectons des données personnelles sur notre site, à travers l'utilisation des cookies ainsi que d'autres technologies, pour vous fournir nos services, des publicités personnalisées et pour analyser le trafic. Nous pouvons être amené à partager certaines informations avec les partenaires publicitaires et d'analyse. Pour plus de détails, veuillez consulter la politique de confidentialité.
En cliquant sur « J'accepte » ci-dessous, vous acceptez notre politique de confidentialité ainsi que la collecte de données personnelles et l'utilisation de cookies comme décrit. Vous reconnaissez aussi que ce forum peut être hébergé en dehors de votre pays de résidence et que vous consentez à la collecte, le stockage et l'utilisation de vos données dans le pays où ce forum est hébergé.
Commentaire