summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLudovic Pouzenc <lpouzenc@gmail.com>2013-09-07 13:02:00 +0200
committerLudovic Pouzenc <lpouzenc@gmail.com>2013-09-07 13:02:00 +0200
commit282edee739b22152ecbe57eb41a8644276b20eaa (patch)
tree9460aa3cf462242afb44739e26b46cddd19981bf /src
parentc5fea717cde9012c08372cc6987043bc316a736b (diff)
downloadmplemmings-282edee739b22152ecbe57eb41a8644276b20eaa.tar.gz
mplemmings-282edee739b22152ecbe57eb41a8644276b20eaa.tar.bz2
mplemmings-282edee739b22152ecbe57eb41a8644276b20eaa.zip
Ajout du prog de dump du debut de segment de data (pour identification vars) + disasm
Diffstat (limited to 'src')
-rw-r--r--src/dosbox_snif/dos_lemm.h55
-rw-r--r--src/dosbox_snif/main_dump_delta.c2
-rw-r--r--src/dosbox_snif/main_dump_ds0.c61
3 files changed, 101 insertions, 17 deletions
diff --git a/src/dosbox_snif/dos_lemm.h b/src/dosbox_snif/dos_lemm.h
index 2935f8d..4766011 100644
--- a/src/dosbox_snif/dos_lemm.h
+++ b/src/dosbox_snif/dos_lemm.h
@@ -1,24 +1,46 @@
#ifndef _DOS_LEMM_H
#define _DOS_LEMM_H
+uint8 lemm_count_to_process; // [0x39]
+uint8 lemm_spawned_count; // [0x40]
+
+uint8 lemm_out_count; // [0x42]
+
+uint8 lemm_level_count; // [0x44]
+uint8 next_spawn_ticks; // [0x45]
+uint8 spawn_rate_ticks; // [0x46]
+
+
+struct _avail_skils {
+ /* ds:si == 0b5b:0067 */
+ uint8 sk_climber, sk_climber2, sk_climber_tag; // [0x67]
+ uint8 sk_floater, sk_floater2, sk_floater_tag; // [0x6a]
+ uint8 sk_bomber, sk_bomber2, sk_bomber_tag; // [0x6d]
+ uint8 sk_blocker, sk_blocker2, sk_blocker_tag; // [0x70]
+ uint8 sk_builder, sk_builder2, sk_builder_tag; // [0x73]
+ uint8 sk_basher, sk_basher2, sk_basher_tag; // [0x76]
+ uint8 sk_miner, sk_miner2, sk_miner_tag; // [0x79]
+ uint8 sk_digger, sk_digger2, sk_digger_tag; // [0x7c]
+};
+
struct _state {
- uint8_t s_splatting:1; //0X1
- uint8_t s_exploding:1; //0X2 combinable
- uint8_t s_falling:1; //0X4
- uint8_t s_ascending:1; //0X8
+ uint8_t s_splatting:1; //0x01
+ uint8_t s_exploding:1; //0x02 combinable
+ uint8_t s_falling:1; //0x04
+ uint8_t s_ascending:1; //0x08
uint8_t s_digging:1; //0x10
uint8_t s_climbing:1; //0x20
uint8_t s_climb_ending:1; //0X40
uint8_t s_building:1; //0X80
- uint8_t s_blocking:1; //0X1
- uint8_t s_bashing:1; //0X2
- uint8_t s_floating:1; //0X4
- uint8_t s_mining:1; //0X8
+ uint8_t s_blocking:1; //0x01
+ uint8_t s_bashing:1; //0x02
+ uint8_t s_floating:1; //0x04
+ uint8_t s_mining:1; //0x08
uint8_t s_drawning:1; //0x10
uint8_t s_ending:1; //0x20
uint8_t s_dying:1; //0X40
- uint8_t s_exploding2:1; //0X80 when exploding too ?
+ uint8_t s_exploding2:1; //0X80
} __attribute__ ((__packed__));
union state {
@@ -28,12 +50,12 @@ union state {
struct _flags1 {
uint8_t cap_climber:1; // 0x1
- uint8_t bit_1:1;
- uint8_t bit_2:1;
- uint8_t bit_3:1;
- uint8_t bit_4:1;
- uint8_t bit_5:1;
- uint8_t bit_6:1;
+ uint8_t unused_bit_1:1;
+ uint8_t unused_bit_2:1;
+ uint8_t unused_bit_3:1;
+ uint8_t unused_bit_4:1;
+ uint8_t unused_bit_5:1;
+ uint8_t unused_bit_6:1;
uint8_t walk_pause_for_shruggling:1; // 0X80
} __attribute__ ((__packed__));
@@ -43,6 +65,7 @@ union flags1 {
};
struct _lemm_data {
+ /* First lemm is at ds:si == 0b55:0085 */
uint16_t x_effective; //0x0 - 0x1
uint16_t y_effective; //0x2 - 0x3
int16_t x_spr_offset; //0x4 - 0x5
@@ -79,7 +102,7 @@ enum draw_hint {
enum state_bit {
s_splatting=0, s_exploding, s_falling, s_ascending, s_digging, s_climbing, s_climb_ending, s_building,
- s_blocking, s_bashing, s_floating, s_mining, s_drawning, s_ending, s_b7, s_exploding2
+ s_blocking, s_bashing, s_floating, s_mining, s_drawning, s_ending, s_dying, s_exploding2
};
#endif /*_DOS_LEMM_H*/
diff --git a/src/dosbox_snif/main_dump_delta.c b/src/dosbox_snif/main_dump_delta.c
index baaaa0d..8db3671 100644
--- a/src/dosbox_snif/main_dump_delta.c
+++ b/src/dosbox_snif/main_dump_delta.c
@@ -41,7 +41,7 @@ int main(int argc, char *argv[]) {
strcpy(state_str[s_mining],"s_mining");
strcpy(state_str[s_drawning],"s_drawning");
strcpy(state_str[s_ending],"s_ending");
- strcpy(state_str[s_b7],"s_b7");
+ strcpy(state_str[s_dying],"s_dying");
strcpy(state_str[s_exploding2],"s_exploding2");
rv=rsp_lemm_init(&rsp, ds_si);
diff --git a/src/dosbox_snif/main_dump_ds0.c b/src/dosbox_snif/main_dump_ds0.c
new file mode 100644
index 0000000..e54589d
--- /dev/null
+++ b/src/dosbox_snif/main_dump_ds0.c
@@ -0,0 +1,61 @@
+#include "rsp.h"
+#include "rsp_lemm.h"
+#include "utils.h"
+
+#include <string.h> /* memset() */
+#include <stdio.h> /* printf() */
+
+int main(int argc, char *argv[]) {
+ int rv, i, end=0;
+ struct rsp_state rsp;
+ char ds_si[10], command[16];
+ unsigned int addr, ds_offset;
+
+ 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");
+
+ // For the beginning of the ds segment
+ ds_offset=0;
+ /* For this chunk of code :
+ 000052A3 83E307 and bx,byte +0x7 bx = 0x5660 + lemm.x_effective % 8;
+ 000052A6 81C36056 add bx,0x5660 //
+ 000052AA 8A27 mov ah,[bx] ah = [bx];
+ */
+ ds_offset = 0x5660;
+ /* For understanding pixel collision tests at 00005280
+ di = lemm.y_effective - 16;
+ if ( di >= 0 ) di=0; //WTF ???
+ di *= (LEVEL_WIDTH/8);
+ di += 0x6d60 + lemm.x_effective / 8;
+ */
+ ds_offset = 0x6d60;
+
+ ds_offset = 0x3f;
+ for (i=0;i<8;i++) {
+ addr = (0xb55 << 4) + ds_offset + (i * 0x20);
+ snprintf(command, 15, "m%06x,0x20", addr );
+ rsp_query(&rsp, command);
+ if ( rsp_decode(&rsp) != 0x20 *2) {
+ printf("%06x : Bug\n", addr);
+ } else {
+ printf("%06x : %s\n", addr, rsp.decoded);
+ }
+ }
+ printf("\n");
+ }
+
+
+ rsp_quit(&rsp);
+ return 0;
+}
+
+