diff options
author | Ludovic Pouzenc <lpouzenc@gmail.com> | 2013-09-15 12:11:06 +0200 |
---|---|---|
committer | Ludovic Pouzenc <lpouzenc@gmail.com> | 2013-09-15 12:11:06 +0200 |
commit | ec8f2c4dff2a6fb2751d7d301416ee1c30979dd2 (patch) | |
tree | 7e943975eadd857b213cac3370145669542aa91a | |
parent | 5b504426f4548ef8a5035284637dae45f9796dec (diff) | |
download | mplemmings-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-- | .gitignore | 2 | ||||
-rw-r--r-- | reverse-engineering/dosbox_snif/main_validate_code.c | 64 |
2 files changed, 61 insertions, 5 deletions
@@ -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; } |