summaryrefslogtreecommitdiff
path: root/reverse-engineering/dosbox_snif/main_validate_code.c
diff options
context:
space:
mode:
Diffstat (limited to 'reverse-engineering/dosbox_snif/main_validate_code.c')
-rw-r--r--reverse-engineering/dosbox_snif/main_validate_code.c136
1 files changed, 91 insertions, 45 deletions
diff --git a/reverse-engineering/dosbox_snif/main_validate_code.c b/reverse-engineering/dosbox_snif/main_validate_code.c
index 22ce62d..afb32ae 100644
--- a/reverse-engineering/dosbox_snif/main_validate_code.c
+++ b/reverse-engineering/dosbox_snif/main_validate_code.c
@@ -4,24 +4,92 @@
#include "rsp_lemm.h"
#include "utils.h"
-#include <string.h> /* memset() */
-#include <stdio.h> /* printf() */
+#include <string.h> /* memset(), memcmp() */
+#include <stdio.h> /* snprintf(), printf() */
+#include <stdlib.h> /* free() */
+#include <stddef.h> /* offsetof() */
+//#include <unistd.h> /* sleep() */
+
+int game_data_diff(struct game_data *g1, struct game_data *g2, char diff[], size_t difflen) {
+ int i, start, end, lemm, lemmcount, off;
+ uint8_t *g1_raw = (uint8_t *)g1;
+ uint8_t *g2_raw = (uint8_t *)g2;
+
+
+ start=offsetof(struct game_data, lemm_count_to_process);
+ end=offsetof(struct game_data, lemmings);
+ for (i=start; i<end; i++) {
+ if ( g1_raw[i] != g2_raw[i] ) {
+ snprintf(diff, difflen, "game_data[0x%02X] : %02hhX / %02hhX", i, g1_raw[i], g2_raw[i]);
+ return 1;
+ }
+ }
+
+ lemmcount = imin(g1->lemm_level_count, (sizeof(g1->lemmings) / sizeof(struct _lemm_data)));
+// printf("lemmcount:%i\n", lemmcount);
+
+ for (lemm=0; lemm < lemmcount; lemm++ ) {
+ start=offsetof(struct game_data, lemmings) + lemm * sizeof(struct _lemm_data);
+// printf("lemmings[%i] : [0x%0X]\n", lemm, start);
+
+ for (off=0; off<sizeof(struct _lemm_data); off++) {
+ i=start+off;
+ if ( g1_raw[i] != g2_raw[i] ) {
+ snprintf(diff, difflen, "lemmings[%i][0x%02X] : %02hhX / %02hhX", lemm, off, g1_raw[i], g2_raw[i]);
+ return 1;
+ }
+
+ }
+
+ }
-inline int imin(int a, int b) {
- if ( a < b ) return a;
- return b;
+ if ( memcmp(g1,g2,sizeof(struct game_data)) != 0 ) {
+ snprintf(diff, difflen, "Unknown");
+ return 1;
+ }
+
+ return 0;
}
-int main(int argc, char *argv[]) {
- int rv, i, end=0, byte, loops;
- struct rsp_state rsp;
- char ds_si[10], command[16], hex_byte[3];
- unsigned int addr, size, offset;
+void _mem_dump(struct rsp_state *rsp, struct game_data *g) {
unsigned int bs=0x100; /* RSP memdump block size */
- struct game_data g_before, g_after, g_simulated, *g;
+ unsigned int i, addr, size, offset, byte;
+ char command[16], hex_byte[3];
hex_byte[2]='\0';
+ for (offset=0 ; offset < sizeof(struct game_data) ; offset += bs) {
+ size = imin(bs,sizeof(struct game_data)-offset);
+ addr = (0xb55 << 4) + offset;
+ snprintf(command, 15, "m%06x,0x%x", addr, size);
+ //printf("-> %s\n", command);
+ rsp_query(rsp, command);
+ if ( rsp_decode(rsp) != size*2) {
+ printf("%06x : Bug\n", addr);
+ break;
+ }
+
+ //printf("%06x : %s\n", addr, rsp->decoded);
+ for (i=0;i<size;i++) {
+ memcpy(hex_byte, rsp->decoded+(i*2), 2);
+ if ( sscanf(hex_byte, "%x", &byte) != 1 ) {
+ printf("Bug decode\n");
+ break;
+ }
+ ((char *)g)[offset+i] = byte;
+ //printf("((char *)&g)[0x%02x] = 0x%02x\n", offset+i, byte);
+ }
+ }
+ //printf("\n");
+}
+
+int main(int argc, char *argv[]) {
+ int rv, end=0, loops;
+ char ds_si[10];
+ struct rsp_state rsp;
+ char msg_diff[256];
+ struct game_data g_before, g_after, g_simulated;
+
rv=rsp_lemm_init(&rsp, ds_si);
if ( rv != 0 ) {
@@ -43,53 +111,31 @@ int main(int argc, char *argv[]) {
printf("Bug 03\n");
continue;
}
- rsp_recv_full(&rsp);
+ //rsp_recv_full(&rsp);
if ( rsp_check_and_clear(&rsp, "S05") != 0 ) {
printf("Bug 04\n");
continue;
}
rsp_query(&rsp, "p8"); // Read $eip
- if ( rsp_check_and_clear(&rsp, "c4380000") ) {
- g = &g_before;
- } else {
- g = &g_after;
- }
-
- //printf("sizeof(struct game_data) == %i\n", sizeof(struct game_data) );
-
- 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);
- //printf("-> %s\n", command);
- rsp_query(&rsp, command);
- if ( rsp_decode(&rsp) != size*2) {
- printf("%06x : Bug\n", addr);
- break;
- }
- //printf("%06x : %s\n", addr, rsp.decoded);
- for (i=0;i<size;i++) {
- memcpy(hex_byte, rsp.decoded+(i*2), 2);
- if ( sscanf(hex_byte, "%x", &byte) != 1 ) {
- printf("Bug decode\n");
- break;
- }
- ((char *)g)[offset+i] = byte;
- //printf("((char *)&g)[0x%02x] = 0x%02x\n", offset+i, byte);
- }
- }
- //printf("\n");
+ //printf("DEBUG : rsp->response_bom+1 : %s\n", rsp.response_bom + 1);
+ if ( rsp_check_and_clear(&rsp, "c4380000") == 0 ) {
+ // Beginning of move_lemmings()
+ _mem_dump(&rsp,&g_before);
- if ( g == &g_before ) {
// Exec simulation
memcpy(&g_simulated,&g_before,sizeof(struct game_data));
move_lemmings(&g_simulated);
} else {
+ // End of move_lemmings()
+ _mem_dump(&rsp,&g_after);
+
// Compare simulation results and orignal code results
- if ( game_data_diff(&g_simulated, &g_after) != 0 ) {
- (void) scanf("%s");
+ if ( game_data_diff(&g_after, &g_simulated, msg_diff, sizeof(msg_diff)) != 0 ) {
+ printf("Diff found : %s\n", msg_diff);
+ //(void) scanf("nothing");
+ //sleep(1);
}
}