comparison debug.c @ 1923:23394a890508

Added implementation of printing PC in 68K debugger
author Michael Pavone <pavone@retrodev.com>
date Mon, 13 Apr 2020 18:14:22 -0700
parents 4a811fd1fb6f
children 374a5ae694e8 495569c1dc61
comparison
equal deleted inserted replaced
1922:4a811fd1fb6f 1923:23394a890508
103 uint32_t m68k_read_long(uint32_t address, m68k_context *context) 103 uint32_t m68k_read_long(uint32_t address, m68k_context *context)
104 { 104 {
105 return m68k_read_word(address, context) << 16 | m68k_read_word(address + 2, context); 105 return m68k_read_word(address, context) << 16 | m68k_read_word(address + 2, context);
106 } 106 }
107 107
108 void debugger_print(m68k_context *context, char format_char, char *param) 108 void debugger_print(m68k_context *context, char format_char, char *param, uint32_t address)
109 { 109 {
110 uint32_t value; 110 uint32_t value;
111 char format[8]; 111 char format[8];
112 strcpy(format, "%s: %d\n"); 112 strcpy(format, "%s: %d\n");
113 switch (format_char) 113 switch (format_char)
150 value = context->current_cycle; 150 value = context->current_cycle;
151 } else if(param[0] == 'f') { 151 } else if(param[0] == 'f') {
152 genesis_context *gen = context->system; 152 genesis_context *gen = context->system;
153 value = gen->vdp->frame; 153 value = gen->vdp->frame;
154 } else if (param[0] == 'p' && param[1] == 'c') { 154 } else if (param[0] == 'p' && param[1] == 'c') {
155 value = 0; //TODO PC value here; 155 value = address;
156 } else if ((param[0] == '0' && param[1] == 'x') || param[0] == '$') { 156 } else if ((param[0] == '0' && param[1] == 'x') || param[0] == '$') {
157 char *after; 157 char *after;
158 uint32_t p_addr = strtol(param+(param[0] == '0' ? 2 : 1), &after, 16); 158 uint32_t p_addr = strtol(param+(param[0] == '0' ? 2 : 1), &after, 16);
159 if (after[0] == '.' && after[1] == 'l') { 159 if (after[0] == '.' && after[1] == 'l') {
160 value = m68k_read_long(p_addr, context); 160 value = m68k_read_long(p_addr, context);
691 param = find_param(input_buf); 691 param = find_param(input_buf);
692 if (!param) { 692 if (!param) {
693 fputs("display command requires a parameter\n", stderr); 693 fputs("display command requires a parameter\n", stderr);
694 break; 694 break;
695 } 695 }
696 debugger_print(context, format_char, param); 696 debugger_print(context, format_char, param, address);
697 add_display(&displays, &disp_index, format_char, param); 697 add_display(&displays, &disp_index, format_char, param);
698 } else { 698 } else {
699 param = find_param(input_buf); 699 param = find_param(input_buf);
700 if (!param) { 700 if (!param) {
701 fputs("d command requires a parameter\n", stderr); 701 fputs("d command requires a parameter\n", stderr);
722 format_char = input_buf[i+1]; 722 format_char = input_buf[i+1];
723 break; 723 break;
724 } 724 }
725 } 725 }
726 param = find_param(input_buf); 726 param = find_param(input_buf);
727 if (!param) { 727 if (param) {
728 debugger_print(context, format_char, param, address);
729 } else {
728 m68k_disasm(&inst, input_buf); 730 m68k_disasm(&inst, input_buf);
729 printf("%X: %s\n", address, input_buf); 731 printf("%X: %s\n", address, input_buf);
730 break; 732 }
731 } 733
732 debugger_print(context, format_char, param);
733 break; 734 break;
734 case 'n': 735 case 'n':
735 if (inst.op == M68K_RTS) { 736 if (inst.op == M68K_RTS) {
736 after = m68k_read_long(context->aregs[7], context); 737 after = m68k_read_long(context->aregs[7], context);
737 } else if (inst.op == M68K_RTE || inst.op == M68K_RTR) { 738 } else if (inst.op == M68K_RTE || inst.op == M68K_RTR) {
1052 } 1053 }
1053 } else { 1054 } else {
1054 remove_breakpoint(context, address); 1055 remove_breakpoint(context, address);
1055 } 1056 }
1056 for (disp_def * cur = displays; cur; cur = cur->next) { 1057 for (disp_def * cur = displays; cur; cur = cur->next) {
1057 debugger_print(context, cur->format_char, cur->param); 1058 debugger_print(context, cur->format_char, cur->param, address);
1058 } 1059 }
1059 m68k_disasm(&inst, input_buf); 1060 m68k_disasm(&inst, input_buf);
1060 printf("%X: %s\n", address, input_buf); 1061 printf("%X: %s\n", address, input_buf);
1061 #ifdef _WIN32 1062 #ifdef _WIN32
1062 #define prompt 1 1063 #define prompt 1