diff --git a/dfhack/include/DFTypes.h b/dfhack/include/DFTypes.h index f9d19c0dc..2afd1f4f5 100644 --- a/dfhack/include/DFTypes.h +++ b/dfhack/include/DFTypes.h @@ -31,41 +31,6 @@ distribution. namespace DFHack { -template -struct junk_fill -{ - uint8_t data[SIZE]; - /* - void Dump() - { - cout< +struct junk_fill +{ + uint8_t data[SIZE]; +}; + enum EFFECT_TYPE { EFF_MIASMA=0, @@ -88,6 +60,7 @@ enum EFFECT_TYPE EFF_BOILING, // uses matgloss EFF_OCEANWAVE }; + struct t_effect_df40d //size 40 { uint16_t type; diff --git a/examples/miscutils.h b/examples/miscutils.h new file mode 100644 index 000000000..b1cf49fcb --- /dev/null +++ b/examples/miscutils.h @@ -0,0 +1,137 @@ +#ifndef DF_MISCUTILS +#define DF_MISCUTILS +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; + +void DumpObjStr0Vector (const char * name, DFHack::Process *p, uint32_t addr) +{ + cout << "----==== " << name << " ====----" << endl; + DFHack::DfVector vect(p,addr,4); + for(int i = 0; i < vect.getSize();i++) + { + uint32_t addr = *(uint32_t *) vect[i]; + cout << p->readSTLString(addr) << endl; + } + cout << endl; +} +void DumpObjVtables (const char * name, DFHack::Process *p, uint32_t addr) +{ + cout << "----==== " << name << " ====----" << endl; + DFHack::DfVector vect(p,addr,4); + for(int i = 0; i < vect.getSize();i++) + { + uint32_t addr = *(uint32_t *) vect[i]; + uint32_t vptr = p->readDWord(addr); + cout << p->readClassName(vptr) << endl; + } + cout << endl; +} +void DumpDWordVector (const char * name, DFHack::Process *p, uint32_t addr) +{ + cout << "----==== " << name << " ====----" << endl; + DFHack::DfVector vect(p,addr,4); + for(int i = 0; i < vect.getSize();i++) + { + uint32_t number = *(uint32_t *) vect[i]; + cout << number << endl; + } + cout << endl; +} + +/* +address = absolute address of dump start +length = length in lines. 1 line = 16 bytes +*/ +void hexdump (DFHack::API& DF, uint32_t address, uint32_t length) +{ + char *buf = new char[length * 16]; + + DF.ReadRaw(address, length * 16, (uint8_t *) buf); + for (int i = 0; i < length; i++) + { + // leading offset + cout << "0x" << hex << setw(8) << address + i*16 << "| "; + // groups + for(int j = 0; j < 4; j++) + { + // bytes + for(int k = 0; k < 4; k++) + { + int idx = i * 16 + j * 4 + k; + + cout << hex << setw(2) << int(static_cast(buf[idx])) << " "; + } + cout << " "; + } + cout << endl; + } + delete buf; +} + +void interleave_hex (DFHack::API& DF, vector < uint32_t > & addresses, uint32_t length) +{ + vector bufs; + + for(int counter = 0; counter < addresses.size(); counter ++) + { + char * buf = new char[length * 16]; + DF.ReadRaw(addresses[counter], length * 16, (uint8_t *) buf); + bufs.push_back(buf); + } + cout << setfill('0'); + + // output a header + cout << "line offset "; + for (int obj = 0; obj < addresses.size(); obj++) + { + cout << "0x" << hex << setw(9) << addresses[obj] << " "; + } + cout << endl; + + for(int offs = 0 ; offs < length * 16; offs += 4) + { + if((!(offs % 16)) && offs != 0) + { + cout << endl; + } + cout << setfill(' '); + cout << dec << setw(4) << offs/4 << " "; + cout << setfill('0'); + cout << "0x" << hex << setw(4) << offs << " "; + for (int object = 0; object < bufs.size(); object++) + { + // bytes + for(int k = 0; k < 4; k++) + { + uint8_t data = bufs[object][offs + k]; + cout << hex << setw(2) << int(static_cast(data)) << " "; + } + cout << " "; + } + cout << endl; + } + for(int counter = 0; counter < addresses.size(); counter ++) + { + delete bufs[counter]; + } +} + +template +void print_bits ( T val, std::ostream& out ) +{ + T n_bits = sizeof ( val ) * CHAR_BIT; + + for ( unsigned i = 0; i < n_bits; ++i ) { + out<< !!( val & 1 ) << " "; + val >>= 1; + } +} + +#endif \ No newline at end of file diff --git a/output/Memory.xml b/output/Memory.xml index f7c49b8df..ce5b5a675 100644 --- a/output/Memory.xml +++ b/output/Memory.xml @@ -3026,6 +3026,8 @@ map_data_1b60_offset 0x1B9c
0x016AFE58
+