summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Pouzenc <lpouzenc@gmail.com>2013-09-15 12:11:06 +0200
committerLudovic Pouzenc <lpouzenc@gmail.com>2013-09-15 12:11:06 +0200
commitec8f2c4dff2a6fb2751d7d301416ee1c30979dd2 (patch)
tree7e943975eadd857b213cac3370145669542aa91a
parent5b504426f4548ef8a5035284637dae45f9796dec (diff)
downloadmplemmings-ec8f2c4dff2a6fb2751d7d301416ee1c30979dd2.tar.gz
mplemmings-ec8f2c4dff2a6fb2751d7d301416ee1c30979dd2.tar.bz2
mplemmings-ec8f2c4dff2a6fb2751d7d301416ee1c30979dd2.zip
Implementation d'une partie du main pour comparer l'algo original avec
un autre.
-rw-r--r--.gitignore2
-rw-r--r--reverse-engineering/dosbox_snif/main_validate_code.c64
2 files changed, 61 insertions, 5 deletions
diff --git a/.gitignore b/.gitignore
index 742a6cb..fcaf2b3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -27,7 +27,7 @@ stamp-h1
/reverse-engineering/dosbox_snif/dump
/reverse-engineering/dosbox_snif/dump_delta
/reverse-engineering/dosbox_snif/dump_ds0
-/reverse-engineering/dosbox_snif/validate_codeœ
+/reverse-engineering/dosbox_snif/validate_code
/reverse-engineering/dosbox_snif/int16todec
/reverse-engineering/dosbox_snif/poke
diff --git a/reverse-engineering/dosbox_snif/main_validate_code.c b/reverse-engineering/dosbox_snif/main_validate_code.c
index a016a54..931acfe 100644
--- a/reverse-engineering/dosbox_snif/main_validate_code.c
+++ b/reverse-engineering/dosbox_snif/main_validate_code.c
@@ -1,12 +1,68 @@
#include "dos_lemm.h"
+#include "rsp.h"
+#include "rsp_lemm.h"
+#include "utils.h"
+
+#include <string.h> /* memset() */
+#include <stdio.h> /* printf() */
+
+inline int imin(int a, int b) {
+ if ( a < b ) return a;
+ return b;
+}
+
+int main(int argc, char *argv[]) {
+ int rv, i, end=0, byte;
+ struct rsp_state rsp;
+ char ds_si[10], command[16], hex_byte[3];
+ unsigned int addr, bs, size, offset;
-int main() {
struct game_data g;
struct _lemm_data *lemm;
- lemm = g.lemmings;
- lemm->draw_hint = hint_walking;
+ hex_byte[2]='\0';
+
+ rv=rsp_lemm_init(&rsp, ds_si);
+ if ( rv != 0 ) {
+ printf("Error rsp_lemm_init() returns %i\n", rv);
+ return 1;
+ }
+
+ while (!end) {
+ rsp_query(&rsp, "c"); // Continue
+ if ( rsp.replied != 1 ) printf("Bug 03\n");
+ rsp_recv_full(&rsp);
+ if ( rsp_check_and_clear(&rsp, "S05") != 0 ) printf("Bug 04\n");
+
+ // From the beginning of the ds segment
+ bs = 0x20;
+ for (offset=0 ; offset < sizeof(struct game_data) ; offset += size) {
+ size = imin(bs,sizeof(struct game_data)-offset);
+ addr = (0xb55 << 4) + offset;
+ snprintf(command, 15, "m%06x,0x%x", addr, size);
+ rsp_query(&rsp, command);
+ if ( rsp_decode(&rsp) != bs*2) {
+ printf("%06x : Bug\n", addr);
+ } else {
+ printf("%06x : %s\n", addr, rsp.decoded);
+ }
+
+ for (i=0;i<bs;i++) {
+ memcpy(hex_byte, rsp.decoded+(i*2), 2);
+ if ( sscanf(hex_byte, "%x", &byte) != 1 ) {
+ printf("Bug decode\n");
+ } else {
+ ((char *)&g)[offset+i] = byte;
+ }
+ }
+ }
+ printf("\n");
+
+ lemm = g.lemmings;
+ printf("lemm->draw_hint == %x\n", lemm->draw_hint);
+ }
- return lemm->draw_hint;
+ rsp_quit(&rsp);
+ return 0;
}