Mercurial > repos > blastem
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 |