comparison debug.c @ 2174:eff7bedfc838

Restore ability to print PC in debugger. Make 68K register names case insensitive. Add usp and ssp registers
author Michael Pavone <pavone@retrodev.com>
date Sat, 06 Aug 2022 15:35:10 -0700
parents 894c7873a2b1
children 8c28c5466d70
comparison
equal deleted inserted replaced
2173:894c7873a2b1 2174:eff7bedfc838
632 632
633 struct debug_context { 633 struct debug_context {
634 resolver resolve; 634 resolver resolve;
635 reader read_mem; 635 reader read_mem;
636 void *system; 636 void *system;
637 uint32_t address;
637 }; 638 };
638 639
639 uint8_t eval_expr(debug_context *context, expr *e, uint32_t *out) 640 uint8_t eval_expr(debug_context *context, expr *e, uint32_t *out)
640 { 641 {
641 uint32_t right; 642 uint32_t right;
806 { 807 {
807 genesis_context *gen = context->system; 808 genesis_context *gen = context->system;
808 return read_m68k(gen->m68k, out, size); 809 return read_m68k(gen->m68k, out, size);
809 } 810 }
810 811
811 static uint8_t resolve_m68k(m68k_context *context, const char *name, uint32_t *out) 812 static uint8_t resolve_m68k(debug_context *debug, m68k_context *context, const char *name, uint32_t *out)
812 { 813 {
813 if (name[0] == 'd' && name[1] >= '0' && name[1] <= '7') { 814 if ((name[0] == 'd' || name[0] == 'D') && name[1] >= '0' && name[1] <= '7' && !name[2]) {
814 *out = context->dregs[name[1]-'0']; 815 *out = context->dregs[name[1]-'0'];
815 } else if (name[0] == 'a' && name[1] >= '0' && name[1] <= '7') { 816 } else if ((name[0] == 'a' || name[0] == 'A') && name[1] >= '0' && name[1] <= '7' && !name[2]) {
816 *out = context->aregs[name[1]-'0']; 817 *out = context->aregs[name[1]-'0'];
817 } else if (name[0] == 's' && name[1] == 'r') { 818 } else if (!strcasecmp(name, "sr")) {
818 *out = context->status << 8; 819 *out = context->status << 8;
819 for (int flag = 0; flag < 5; flag++) { 820 for (int flag = 0; flag < 5; flag++) {
820 *out |= context->flags[flag] << (4-flag); 821 *out |= context->flags[flag] << (4-flag);
821 } 822 }
822 } else if(name[0] == 'c') { 823 } else if(!strcasecmp(name, "cycle")) {
823 *out = context->current_cycle; 824 *out = context->current_cycle;
824 } else if (name[0] == 'p' && name[1] == 'c') { 825 } else if (!strcasecmp(name, "pc")) {
825 //FIXME 826 *out = debug->address;
826 //*out = address; 827 } else if (!strcasecmp(name, "usp")) {
828 *out = context->status & 0x20 ? context->aregs[8] : context->aregs[7];
829 } else if (!strcasecmp(name, "ssp")) {
830 *out = context->status & 0x20 ? context->aregs[7] : context->aregs[8];
827 } else { 831 } else {
828 return 0; 832 return 0;
829 } 833 }
830 return 1; 834 return 1;
831 } 835 }
832 836
833 static uint8_t resolve_genesis(debug_context *context, const char *name, uint32_t *out) 837 static uint8_t resolve_genesis(debug_context *context, const char *name, uint32_t *out)
834 { 838 {
835 genesis_context *gen = context->system; 839 genesis_context *gen = context->system;
836 if (resolve_m68k(gen->m68k, name, out)) { 840 if (resolve_m68k(context, gen->m68k, name, out)) {
837 return 1; 841 return 1;
838 } 842 }
839 if (!strcmp(name, "f") || !strcmp(name, "frame")) { 843 if (!strcmp(name, "f") || !strcmp(name, "frame")) {
840 *out = gen->vdp->frame; 844 *out = gen->vdp->frame;
841 return 1; 845 return 1;
863 fprintf(stderr, "Unrecognized format character: %c\n", format_char); 867 fprintf(stderr, "Unrecognized format character: %c\n", format_char);
864 } 868 }
865 debug_context c = { 869 debug_context c = {
866 .resolve = resolve_genesis, 870 .resolve = resolve_genesis,
867 .read_mem = read_genesis, 871 .read_mem = read_genesis,
868 .system = context->system 872 .system = context->system,
873 .address = address
869 }; 874 };
870 char *after; 875 char *after;
871 uint8_t at_least_one = 0; 876 uint8_t at_least_one = 0;
872 while (*param && *param != '\n') 877 while (*param && *param != '\n')
873 { 878 {