--- mon/src/mon_cmd.cpp 2003/09/27 20:33:06 1.15 +++ mon/src/mon_cmd.cpp 2007/06/07 09:51:56 1.20 @@ -1,7 +1,7 @@ /* * mon_cmd.cpp - cxmon standard commands * - * cxmon (C) 1997-2003 Christian Bauer, Marc Hellwig + * cxmon (C) 1997-2004 Christian Bauer, Marc Hellwig * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -67,10 +67,12 @@ static bool range_args(uintptr *adr, uin * byte_string = (expression | STRING) {COMMA (expression | STRING)} END */ -static bool byte_string(uint8 *s, uintptr &len) +static bool byte_string(uint8 *&str, uintptr &len) { uintptr value; + static const int GRANULARITY = 16; // must be a power of 2 + str = NULL; len = 0; goto start; @@ -80,21 +82,27 @@ static bool byte_string(uint8 *s, uintpt start: if (mon_token == T_STRING) { - uint8 *p = (uint8 *)mon_string; - while ((*s++ = *p++) != 0) ; - s--; - len += strlen(mon_string); + unsigned n = strlen(mon_string); + str = (uint8 *)realloc(str, (len + n - 1 + GRANULARITY) & ~(GRANULARITY - 1)); + memcpy(str + len, mon_string, n); + len += n; mon_get_token(); } else if (mon_expression(&value)) { - *s++ = value; + str = (uint8 *)realloc(str, (len + GRANULARITY) & ~(GRANULARITY - 1)); + str[len] = value; len++; - } else + } else { + if (str) + free(str); return false; + } - } else if (mon_token == T_END) + } else if (mon_token == T_END) { return true; - else { + } else { mon_error("',' expected"); + if (str) + free(str); return false; } } @@ -118,7 +126,7 @@ static inline uint8 char2print(uint8 c) void version(void) { - fprintf(monout, "mon V" VERSION "\n"); + fprintf(monout, "cxmon V" VERSION "\n"); } @@ -222,7 +230,7 @@ void memory_dump(void) return; while (adr <= end_adr && !mon_aborted()) { - fprintf(monout, "%0*lx:", 2 * sizeof(adr), mon_use_real_mem ? adr: adr % mon_mem_size); + fprintf(monout, "%0*lx:", int(2 * sizeof(adr)), mon_use_real_mem ? adr: adr % mon_mem_size); for (int i=0; i>=1, i++) str[i] = (b & m) ? '*' : '.'; @@ -308,7 +316,9 @@ enum CPUType { CPU_Z80, CPU_80x86_32, CPU_80x86_16, - CPU_x86_64 + CPU_x86_64, + CPU_MIPS, + CPU_MIPS_LITTLE, }; static void disassemble(CPUType type) @@ -322,7 +332,7 @@ static void disassemble(CPUType type) case CPU_PPC: while (adr <= end_adr && !mon_aborted()) { uint32 w = mon_read_word(adr); - fprintf(monout, "%0*lx: %08x\t", 2 * sizeof(adr), mon_use_real_mem ? adr : adr % mon_mem_size, w); + fprintf(monout, "%0*lx: %08x\t", int(2 * sizeof(adr)), mon_use_real_mem ? adr : adr % mon_mem_size, w); disass_ppc(monout, mon_use_real_mem ? adr : adr % mon_mem_size, w); adr += 4; } @@ -333,42 +343,50 @@ static void disassemble(CPUType type) uint8 op = mon_read_byte(adr); uint8 lo = mon_read_byte(adr + 1); uint8 hi = mon_read_byte(adr + 2); - fprintf(monout, "%0*lx: ", 2 * sizeof(adr), mon_use_real_mem ? adr : adr % mon_mem_size); + fprintf(monout, "%0*lx: ", int(2 * sizeof(adr)), mon_use_real_mem ? adr : adr % mon_mem_size); adr += disass_6502(monout, mon_use_real_mem ? adr : adr % mon_mem_size, op, lo, hi); } break; case CPU_680x0: while (adr <= end_adr && !mon_aborted()) { - fprintf(monout, "%0*lx: ", 2 * sizeof(adr), mon_use_real_mem ? adr : adr % mon_mem_size); + fprintf(monout, "%0*lx: ", int(2 * sizeof(adr)), mon_use_real_mem ? adr : adr % mon_mem_size); adr += disass_68k(monout, mon_use_real_mem ? adr : adr % mon_mem_size); } break; case CPU_Z80: while (adr <= end_adr && !mon_aborted()) { - fprintf(monout, "%0*lx: ", 2 * sizeof(adr), mon_use_real_mem ? adr : adr % mon_mem_size); + fprintf(monout, "%0*lx: ", int(2 * sizeof(adr)), mon_use_real_mem ? adr : adr % mon_mem_size); adr += disass_z80(monout, mon_use_real_mem ? adr : adr % mon_mem_size); } break; + case CPU_MIPS: + case CPU_MIPS_LITTLE: + while (adr <= end_adr && !mon_aborted()) { + fprintf(monout, "%0*lx: ", int(2 * sizeof(adr)), mon_use_real_mem ? adr : adr % mon_mem_size); + adr += disass_mips(monout, mon_use_real_mem ? adr : adr % mon_mem_size, type == CPU_MIPS_LITTLE); + } + break; + case CPU_x86_64: while (adr <= end_adr && !mon_aborted()) { - fprintf(monout, "%0*lx: ", 2 * sizeof(adr), mon_use_real_mem ? adr : adr % mon_mem_size); + fprintf(monout, "%0*lx: ", int(2 * sizeof(adr)), mon_use_real_mem ? adr : adr % mon_mem_size); adr += disass_x86(monout, mon_use_real_mem ? adr : adr % mon_mem_size, 64); } break; case CPU_80x86_32: while (adr <= end_adr && !mon_aborted()) { - fprintf(monout, "%0*lx: ", 2 * sizeof(adr), mon_use_real_mem ? adr : adr % mon_mem_size); + fprintf(monout, "%0*lx: ", int(2 * sizeof(adr)), mon_use_real_mem ? adr : adr % mon_mem_size); adr += disass_x86(monout, mon_use_real_mem ? adr : adr % mon_mem_size, 32); } break; case CPU_80x86_16: while (adr <= end_adr && !mon_aborted()) { - fprintf(monout, "%0*lx: ", 2 * sizeof(adr), mon_use_real_mem ? adr : adr % mon_mem_size); + fprintf(monout, "%0*lx: ", int(2 * sizeof(adr)), mon_use_real_mem ? adr : adr % mon_mem_size); adr += disass_x86(monout, mon_use_real_mem ? adr : adr % mon_mem_size, 16); } } @@ -411,6 +429,16 @@ void disassemble_x86_64(void) disassemble(CPU_x86_64); } +void disassemble_mips(void) +{ + disassemble(CPU_MIPS); +} + +void disassemble_mipsel(void) +{ + disassemble(CPU_MIPS_LITTLE); +} + /* * Modify memory @@ -420,7 +448,7 @@ void disassemble_x86_64(void) void modify(void) { uintptr adr, len, src_adr = 0; - uint8 str[256]; + uint8 *str; if (!mon_expression(&adr)) return; @@ -429,8 +457,9 @@ void modify(void) while (src_adr < len) mon_write_byte(adr++, str[src_adr++]); - mon_dot_address = adr; + + free(str); } @@ -442,7 +471,7 @@ void modify(void) void fill(void) { uintptr adr, end_adr, len, src_adr = 0; - uint8 str[256]; + uint8 *str; if (!mon_expression(&adr)) return; @@ -453,6 +482,8 @@ void fill(void) while (adr <= end_adr) mon_write_byte(adr++, str[src_adr++ % len]); + + free(str); } @@ -513,7 +544,7 @@ void compare(void) while (adr <= end_adr && !mon_aborted()) { if (mon_read_byte(adr) != mon_read_byte(dest)) { - fprintf(monout, "%0*lx ", 2 * sizeof(adr), mon_use_real_mem ? adr : adr % mon_mem_size); + fprintf(monout, "%0*lx ", int(2 * sizeof(adr)), mon_use_real_mem ? adr : adr % mon_mem_size); num++; if (!(num & 7)) fputc('\n', monout); @@ -535,7 +566,7 @@ void compare(void) void hunt(void) { uintptr adr, end_adr, len; - uint8 str[256]; + uint8 *str; int num = 0; if (!mon_expression(&adr)) @@ -553,7 +584,7 @@ void hunt(void) break; if (i == len) { - fprintf(monout, "%0*lx ", 2 * sizeof(adr), mon_use_real_mem ? adr : adr % mon_mem_size); + fprintf(monout, "%0*lx ", int(2 * sizeof(adr)), mon_use_real_mem ? adr : adr % mon_mem_size); num++; if (num == 1) mon_dot_address = adr; @@ -563,6 +594,8 @@ void hunt(void) adr++; } + free(str); + if (num & 7) fputc('\n', monout); fprintf(monout, "Found %d occurrences\n", num); @@ -605,7 +638,7 @@ void load_data(void) mon_write_byte(adr++, fc); fclose(file); - fprintf(monerr, "%08x bytes read from %0*lx to %0*lx\n", adr - start_adr, 2 * sizeof(adr), mon_use_real_mem ? start_adr : start_adr % mon_mem_size, 2 * sizeof(adr), mon_use_real_mem ? adr-1 : (adr-1) % mon_mem_size); + fprintf(monerr, "%08x bytes read from %0*lx to %0*lx\n", adr - start_adr, int(2 * sizeof(adr)), mon_use_real_mem ? start_adr : start_adr % mon_mem_size, int(2 * sizeof(adr)), mon_use_real_mem ? adr-1 : (adr-1) % mon_mem_size); mon_dot_address = adr; } } @@ -648,6 +681,6 @@ void save_data(void) fputc(mon_read_byte(adr++), file); fclose(file); - fprintf(monerr, "%08x bytes written from %0*lx to %0*lx\n", size, 2 * sizeof(adr), mon_use_real_mem ? start_adr : start_adr % mon_mem_size, 2 * sizeof(adr), mon_use_real_mem ? end_adr : end_adr % mon_mem_size); + fprintf(monerr, "%08x bytes written from %0*lx to %0*lx\n", size, int(2 * sizeof(adr)), mon_use_real_mem ? start_adr : start_adr % mon_mem_size, int(2 * sizeof(adr)), mon_use_real_mem ? end_adr : end_adr % mon_mem_size); } }