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