--- mon/src/mon_cmd.cpp 1999/10/25 08:04:47 1.4 +++ mon/src/mon_cmd.cpp 2002/07/17 10:00:54 1.11 @@ -1,7 +1,7 @@ /* - * mon_cmd.cpp - mon standard commands + * mon_cmd.cpp - cxmon standard commands * - * mon (C) 1997-1999 Christian Bauer, Marc Hellwig + * cxmon (C) 1997-2002 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 @@ -24,11 +24,11 @@ #include "mon.h" #include "mon_cmd.h" -#include "mon_ppc.h" -#include "mon_68k.h" -#include "mon_x86.h" -#include "mon_6502.h" -#include "mon_8080.h" +#include "mon_disass.h" + +#ifndef VERSION +#define VERSION "2" +#endif /* @@ -40,7 +40,7 @@ * true: OK, false: Error */ -static bool range_args(uint32 *adr, uint32 *end_adr, uint32 def_range) +static bool range_args(uintptr *adr, uintptr *end_adr, uint32 def_range) { *adr = mon_dot_address; *end_adr = mon_dot_address + def_range; @@ -67,9 +67,9 @@ static bool range_args(uint32 *adr, uint * byte_string = (expression | STRING) {COMMA (expression | STRING)} END */ -static bool byte_string(uint8 *s, uint32 &len) +static bool byte_string(uint8 *s, uintptr &len) { - uint32 value; + uintptr value; len = 0; goto start; @@ -118,7 +118,7 @@ static inline uint8 char2print(uint8 c) void version(void) { - fprintf(monout, "mon V%d.%d\n", MON_VERSION_MAJOR, MON_VERSION_MINOR); + fprintf(monout, "mon V" VERSION "\n"); } @@ -161,7 +161,7 @@ void redir_output(void) void print_expr(void) { - uint32 val; + uintptr val; if (!mon_expression(&val)) return; @@ -213,7 +213,7 @@ void shell_command(void) void memory_dump(void) { - uint32 adr, end_adr; + uintptr adr, end_adr; uint8 mem[MEMDUMP_BPL + 1]; mem[MEMDUMP_BPL] = 0; @@ -222,7 +222,7 @@ void memory_dump(void) return; while (adr <= end_adr && !mon_aborted()) { - fprintf(monout, "%08x:", mon_use_real_mem ? adr: adr % mon_mem_size); + fprintf(monout, "%0*lx:", 2 * sizeof(adr), mon_use_real_mem ? adr: adr % mon_mem_size); for (int i=0; i>=1, i++) + str[i] = (b & m) ? '*' : '.'; + fprintf(monout, " '%s'\n", str); + adr++; + } + + mon_dot_address = adr; +} + + +/* * Disassemble * d [start [end]] * d65 [start [end]] * d68 [start [end]] * d80 [start [end]] * d86 [start [end]] + * d8086 [start [end]] */ enum CPUType { CPU_PPC, CPU_6502, CPU_680x0, - CPU_8080, - CPU_80x86 + CPU_Z80, + CPU_80x86_32, + CPU_80x86_16 }; static void disassemble(CPUType type) { - uint32 adr, end_adr; + uintptr adr, end_adr; if (!range_args(&adr, &end_adr, 16 * 4 - 1)) // 16 lines unless end address specified return; @@ -309,37 +339,29 @@ static void disassemble(CPUType type) case CPU_680x0: while (adr <= end_adr && !mon_aborted()) { - uint16 buf[8]; - buf[0] = mon_read_half(adr); - buf[1] = mon_read_half(adr + 2); - buf[2] = mon_read_half(adr + 4); - buf[3] = mon_read_half(adr + 6); - buf[4] = mon_read_half(adr + 8); - buf[5] = mon_read_half(adr + 10); - buf[6] = mon_read_half(adr + 12); - buf[7] = mon_read_half(adr + 14); fprintf(monout, "%08x: ", mon_use_real_mem ? adr : adr % mon_mem_size); - adr += disass_68k(monout, mon_use_real_mem ? adr : adr % mon_mem_size, buf); + adr += disass_68k(monout, mon_use_real_mem ? adr : adr % mon_mem_size); } break; - case CPU_8080: + case CPU_Z80: while (adr <= end_adr && !mon_aborted()) { - uint8 op = mon_read_byte(adr); - uint8 lo = mon_read_byte(adr + 1); - uint8 hi = mon_read_byte(adr + 2); fprintf(monout, "%08x: ", mon_use_real_mem ? adr : adr % mon_mem_size); - adr += disass_8080(monout, mon_use_real_mem ? adr : adr % mon_mem_size, op, lo, hi); + adr += disass_z80(monout, mon_use_real_mem ? adr : adr % mon_mem_size); } break; - case CPU_80x86: + case CPU_80x86_32: while (adr <= end_adr && !mon_aborted()) { - uint8 buf[16]; - for (int i=0; i<16; i++) - buf[i] = mon_read_byte(adr + i); fprintf(monout, "%08x: ", mon_use_real_mem ? adr : adr % mon_mem_size); - adr += disass_x86(monout, mon_use_real_mem ? adr : adr % mon_mem_size, buf); + adr += disass_x86(monout, mon_use_real_mem ? adr : adr % mon_mem_size, false); + } + break; + + case CPU_80x86_16: + while (adr <= end_adr && !mon_aborted()) { + fprintf(monout, "%08x: ", mon_use_real_mem ? adr : adr % mon_mem_size); + adr += disass_x86(monout, mon_use_real_mem ? adr : adr % mon_mem_size, true); } break; } @@ -362,14 +384,19 @@ void disassemble_680x0(void) disassemble(CPU_680x0); } -void disassemble_8080(void) +void disassemble_z80(void) +{ + disassemble(CPU_Z80); +} + +void disassemble_80x86_32(void) { - disassemble(CPU_8080); + disassemble(CPU_80x86_32); } -void disassemble_80x86(void) +void disassemble_80x86_16(void) { - disassemble(CPU_80x86); + disassemble(CPU_80x86_16); } @@ -380,7 +407,7 @@ void disassemble_80x86(void) void modify(void) { - uint32 adr, len, src_adr = 0; + uintptr adr, len, src_adr = 0; uint8 str[256]; if (!mon_expression(&adr)) @@ -402,7 +429,7 @@ void modify(void) void fill(void) { - uint32 adr, end_adr, len, src_adr = 0; + uintptr adr, end_adr, len, src_adr = 0; uint8 str[256]; if (!mon_expression(&adr)) @@ -424,7 +451,7 @@ void fill(void) void transfer(void) { - uint32 adr, end_adr, dest; + uintptr adr, end_adr, dest; int num; if (!mon_expression(&adr)) @@ -458,7 +485,7 @@ void transfer(void) void compare(void) { - uint32 adr, end_adr, dest; + uintptr adr, end_adr, dest; int num = 0; if (!mon_expression(&adr)) @@ -495,7 +522,7 @@ void compare(void) void hunt(void) { - uint32 adr, end_adr, len; + uintptr adr, end_adr, len; uint8 str[256]; int num = 0; @@ -537,7 +564,7 @@ void hunt(void) void load_data(void) { - uint32 start_adr; + uintptr start_adr; FILE *file; int fc; @@ -560,7 +587,7 @@ void load_data(void) if (!(file = fopen(mon_string, "rb"))) mon_error("Unable to open file"); else { - uint32 adr = start_adr; + uintptr adr = start_adr; while ((fc = fgetc(file)) != EOF) mon_write_byte(adr++, fc); @@ -579,7 +606,7 @@ void load_data(void) void save_data(void) { - uint32 start_adr, size; + uintptr start_adr, size; FILE *file; if (!mon_expression(&start_adr)) @@ -603,7 +630,7 @@ void save_data(void) if (!(file = fopen(mon_string, "wb"))) mon_error("Unable to create file"); else { - uint32 adr = start_adr, end_adr = start_adr + size - 1; + uintptr adr = start_adr, end_adr = start_adr + size - 1; while (adr <= end_adr) fputc(mon_read_byte(adr++), file);