Mercurial > repos > blastem
comparison debug.c @ 2173:894c7873a2b1
Consume all expressions in debugger print command
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 06 Aug 2022 15:22:30 -0700 |
parents | a00773a336d8 |
children | eff7bedfc838 |
comparison
equal
deleted
inserted
replaced
2172:a00773a336d8 | 2173:894c7873a2b1 |
---|---|
866 .resolve = resolve_genesis, | 866 .resolve = resolve_genesis, |
867 .read_mem = read_genesis, | 867 .read_mem = read_genesis, |
868 .system = context->system | 868 .system = context->system |
869 }; | 869 }; |
870 char *after; | 870 char *after; |
871 expr *e = parse_expression(param, &after); | 871 uint8_t at_least_one = 0; |
872 if (e) { | 872 while (*param && *param != '\n') |
873 if (!eval_expr(&c, e, &value)) { | 873 { |
874 fprintf(stderr, "Failed to eval %s\n", param); | 874 at_least_one = 1; |
875 } | 875 expr *e = parse_expression(param, &after); |
876 free_expr(e); | 876 if (e) { |
877 } else { | 877 if (!eval_expr(&c, e, &value)) { |
878 fprintf(stderr, "Failed to parse %s\n", param); | 878 fprintf(stderr, "Failed to eval %s\n", param); |
879 } | 879 } |
880 /* | 880 free_expr(e); |
881 if (param[0] == 'd' && param[1] >= '0' && param[1] <= '7') { | |
882 value = context->dregs[param[1]-'0']; | |
883 if (param[2] == '.') { | |
884 if (param[3] == 'w') { | |
885 value &= 0xFFFF; | |
886 } else if (param[3] == 'b') { | |
887 value &= 0xFF; | |
888 } | |
889 } | |
890 } else if (param[0] == 'a' && param[1] >= '0' && param[1] <= '7') { | |
891 value = context->aregs[param[1]-'0']; | |
892 if (param[2] == '.') { | |
893 if (param[3] == 'w') { | |
894 value &= 0xFFFF; | |
895 } else if (param[3] == 'b') { | |
896 value &= 0xFF; | |
897 } | |
898 } | |
899 } else if (param[0] == 's' && param[1] == 'r') { | |
900 value = (context->status << 8); | |
901 for (int flag = 0; flag < 5; flag++) { | |
902 value |= context->flags[flag] << (4-flag); | |
903 } | |
904 } else if(param[0] == 'c') { | |
905 value = context->current_cycle; | |
906 } else if(param[0] == 'f') { | |
907 genesis_context *gen = context->system; | |
908 value = gen->vdp->frame; | |
909 } else if (param[0] == 'p' && param[1] == 'c') { | |
910 value = address; | |
911 } else if ((param[0] == '0' && param[1] == 'x') || param[0] == '$') { | |
912 char *after; | |
913 uint32_t p_addr = strtol(param+(param[0] == '0' ? 2 : 1), &after, 16); | |
914 if (after[0] == '.' && after[1] == 'l') { | |
915 value = m68k_read_long(p_addr, context); | |
916 } else if (after[0] == '.' && after[1] == 'b') { | |
917 value = m68k_read_byte(p_addr, context); | |
918 } else { | 881 } else { |
919 value = m68k_read_word(p_addr, context); | 882 fprintf(stderr, "Failed to parse %s\n", param); |
920 } | 883 } |
921 } else if(param[0] == '(' && (param[1] == 'a' || param[1] == 'd') && param[2] >= '0' && param[2] <= '7' && param[3] == ')') { | 884 char *tmp_param = malloc(after-param+1); |
922 uint8_t reg = param[2] - '0'; | 885 memcpy(tmp_param, param, after-param); |
923 uint32_t p_addr = param[1] == 'a' ? context->aregs[reg] : context->dregs[reg]; | 886 tmp_param[after-param] = 0; |
924 if (param[4] == '.' && param[5] == 'l') { | 887 param = after; |
925 value = m68k_read_long(p_addr, context); | 888 if (format_char == 's') { |
926 } else if (param[4] == '.' && param[5] == 'b') { | 889 char tmp[128]; |
927 value = m68k_read_byte(p_addr, context); | 890 int i; |
891 for (i = 0; i < sizeof(tmp)-1; i++, value++) | |
892 { | |
893 char c = m68k_read_byte(value, context); | |
894 if (c < 0x20 || c > 0x7F) { | |
895 break; | |
896 } | |
897 tmp[i] = c; | |
898 } | |
899 tmp[i] = 0; | |
900 printf(format, tmp_param, tmp); | |
928 } else { | 901 } else { |
929 value = m68k_read_word(p_addr, context); | 902 printf(format, tmp_param, value); |
930 } | 903 } |
931 } else { | 904 free(tmp_param); |
932 fprintf(stderr, "Unrecognized parameter to p: %s\n", param); | 905 while (*param && isblank(*param) && *param != '\n') |
933 return; | |
934 }*/ | |
935 if (format_char == 's') { | |
936 char tmp[128]; | |
937 int i; | |
938 for (i = 0; i < sizeof(tmp)-1; i++, value++) | |
939 { | 906 { |
940 char c = m68k_read_byte(value, context); | 907 ++param; |
941 if (c < 0x20 || c > 0x7F) { | 908 } |
942 break; | 909 } |
943 } | 910 if (!at_least_one) { |
944 tmp[i] = c; | 911 fprintf(stderr, "Missing argument to print/%c\n", format_char); |
945 } | |
946 tmp[i] = 0; | |
947 printf(format, param, tmp); | |
948 } else { | |
949 printf(format, param, value); | |
950 } | 912 } |
951 } | 913 } |
952 | 914 |
953 #ifndef NO_Z80 | 915 #ifndef NO_Z80 |
954 | 916 |