Mercurial > repos > blastem
comparison debug.c @ 2500:d44fe974fb85
Get blastem compiling with new 68K core
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 30 Apr 2024 22:32:08 -0700 |
parents | d74d3998482c |
children | 927083238a39 |
comparison
equal
deleted
inserted
replaced
2499:d74d3998482c | 2500:d44fe974fb85 |
---|---|
1628 static debug_val m68k_sr_get(debug_var *var) | 1628 static debug_val m68k_sr_get(debug_var *var) |
1629 { | 1629 { |
1630 m68k_context *context = var->ptr; | 1630 m68k_context *context = var->ptr; |
1631 debug_val ret; | 1631 debug_val ret; |
1632 ret.v.u32 = context->status << 8; | 1632 ret.v.u32 = context->status << 8; |
1633 #ifdef NEW_CORE | |
1634 //TODO: implement me | |
1635 #else | |
1633 for (int flag = 0; flag < 5; flag++) | 1636 for (int flag = 0; flag < 5; flag++) |
1634 { | 1637 { |
1635 ret.v.u32 |= context->flags[flag] << (4-flag); | 1638 ret.v.u32 |= context->flags[flag] << (4-flag); |
1636 } | 1639 } |
1640 #endif | |
1637 ret.type = DBG_VAL_U32; | 1641 ret.type = DBG_VAL_U32; |
1638 return ret; | 1642 return ret; |
1639 } | 1643 } |
1640 | 1644 |
1641 static void m68k_sr_set(debug_var *var, debug_val val) | 1645 static void m68k_sr_set(debug_var *var, debug_val val) |
1645 if (!debug_cast_int(val, &ival)) { | 1649 if (!debug_cast_int(val, &ival)) { |
1646 fprintf(stderr, "M68K register sr can only be set to an integer\n"); | 1650 fprintf(stderr, "M68K register sr can only be set to an integer\n"); |
1647 return; | 1651 return; |
1648 } | 1652 } |
1649 context->status = ival >> 8; | 1653 context->status = ival >> 8; |
1654 #ifdef NEW_CORE | |
1655 //TODO: implement me | |
1656 #else | |
1650 for (int flag = 0; flag < 5; flag++) { | 1657 for (int flag = 0; flag < 5; flag++) { |
1651 context->flags[flag] = (ival & (1 << (4 - flag))) != 0; | 1658 context->flags[flag] = (ival & (1 << (4 - flag))) != 0; |
1652 } | 1659 } |
1660 #endif | |
1653 } | 1661 } |
1654 | 1662 |
1655 static debug_val m68k_cycle_get(debug_var *var) | 1663 static debug_val m68k_cycle_get(debug_var *var) |
1656 { | 1664 { |
1657 m68k_context *context = var->ptr; | 1665 m68k_context *context = var->ptr; |
3740 } | 3748 } |
3741 | 3749 |
3742 static uint8_t cmd_backtrace_m68k(debug_root *root, parsed_command *cmd) | 3750 static uint8_t cmd_backtrace_m68k(debug_root *root, parsed_command *cmd) |
3743 { | 3751 { |
3744 m68k_context *context = root->cpu_context; | 3752 m68k_context *context = root->cpu_context; |
3753 #ifdef NEW_CORE | |
3754 //TODO: implement me | |
3755 #else | |
3745 uint32_t stack = context->aregs[7]; | 3756 uint32_t stack = context->aregs[7]; |
3746 uint8_t non_adr_count = 0; | 3757 uint8_t non_adr_count = 0; |
3747 do { | 3758 do { |
3748 uint32_t bt_address = m68k_instruction_fetch(stack, context); | 3759 uint32_t bt_address = m68k_instruction_fetch(stack, context); |
3749 bt_address = get_instruction_start(context->opts, bt_address - 2); | 3760 bt_address = get_instruction_start(context->opts, bt_address - 2); |
3760 stack += 2; | 3771 stack += 2; |
3761 non_adr_count++; | 3772 non_adr_count++; |
3762 } | 3773 } |
3763 //TODO: Make sure we don't wander into an invalid memory region | 3774 //TODO: Make sure we don't wander into an invalid memory region |
3764 } while (stack && non_adr_count < 6); | 3775 } while (stack && non_adr_count < 6); |
3776 #endif | |
3765 return 1; | 3777 return 1; |
3766 } | 3778 } |
3767 | 3779 |
3768 static uint8_t cmd_disassemble_m68k(debug_root *root, parsed_command *cmd) | 3780 static uint8_t cmd_disassemble_m68k(debug_root *root, parsed_command *cmd) |
3769 { | 3781 { |
3773 if (!debug_cast_int(cmd->args[0].value, &address)) { | 3785 if (!debug_cast_int(cmd->args[0].value, &address)) { |
3774 fprintf(stderr, "Argument to disassemble must be an integer if provided\n"); | 3786 fprintf(stderr, "Argument to disassemble must be an integer if provided\n"); |
3775 return 1; | 3787 return 1; |
3776 } | 3788 } |
3777 } | 3789 } |
3790 #ifndef NEW_CORE | |
3778 char disasm_buf[1024]; | 3791 char disasm_buf[1024]; |
3779 m68kinst inst; | 3792 m68kinst inst; |
3780 do { | 3793 do { |
3781 label_def *def = find_label(root->disasm, address); | 3794 label_def *def = find_label(root->disasm, address); |
3782 if (def) { | 3795 if (def) { |
3788 | 3801 |
3789 address = m68k_decode(m68k_instruction_fetch, context, &inst, address); | 3802 address = m68k_decode(m68k_instruction_fetch, context, &inst, address); |
3790 m68k_disasm_labels(&inst, disasm_buf, root->disasm); | 3803 m68k_disasm_labels(&inst, disasm_buf, root->disasm); |
3791 printf("\t%s\n", disasm_buf); | 3804 printf("\t%s\n", disasm_buf); |
3792 } while(!m68k_is_terminal(&inst)); | 3805 } while(!m68k_is_terminal(&inst)); |
3806 #endif | |
3793 return 1; | 3807 return 1; |
3794 } | 3808 } |
3795 | 3809 |
3796 static uint8_t cmd_vdp_sprites(debug_root *root, parsed_command *cmd) | 3810 static uint8_t cmd_vdp_sprites(debug_root *root, parsed_command *cmd) |
3797 { | 3811 { |
4370 }; | 4384 }; |
4371 | 4385 |
4372 #define NUM_SCD_SUB (sizeof(scd_main_commands)/sizeof(*scd_main_commands)) | 4386 #define NUM_SCD_SUB (sizeof(scd_main_commands)/sizeof(*scd_main_commands)) |
4373 | 4387 |
4374 #ifndef NO_Z80 | 4388 #ifndef NO_Z80 |
4389 #ifndef NEW_CORE | |
4375 | 4390 |
4376 static uint8_t cmd_delete_z80(debug_root *root, parsed_command *cmd) | 4391 static uint8_t cmd_delete_z80(debug_root *root, parsed_command *cmd) |
4377 { | 4392 { |
4378 uint32_t index; | 4393 uint32_t index; |
4379 if (!debug_cast_int(cmd->args[0].value, &index)) { | 4394 if (!debug_cast_int(cmd->args[0].value, &index)) { |
4589 address += after - pc; | 4604 address += after - pc; |
4590 printf("\t%s\n", disasm_buf); | 4605 printf("\t%s\n", disasm_buf); |
4591 } while(!z80_is_terminal(&inst)); | 4606 } while(!z80_is_terminal(&inst)); |
4592 return 1; | 4607 return 1; |
4593 } | 4608 } |
4609 #endif //NEW_CORE | |
4594 | 4610 |
4595 static uint8_t cmd_gen_m68k(debug_root *root, parsed_command *cmd) | 4611 static uint8_t cmd_gen_m68k(debug_root *root, parsed_command *cmd) |
4596 { | 4612 { |
4597 char *param = cmd->raw; | 4613 char *param = cmd->raw; |
4598 while (param && *param && isblank(*param)) | 4614 while (param && *param && isblank(*param)) |
4635 vdp_print_reg_explain(sms->vdp); | 4651 vdp_print_reg_explain(sms->vdp); |
4636 return 1; | 4652 return 1; |
4637 } | 4653 } |
4638 | 4654 |
4639 command_def z80_commands[] = { | 4655 command_def z80_commands[] = { |
4656 #ifndef NEW_CORE | |
4640 { | 4657 { |
4641 .names = (const char *[]){ | 4658 .names = (const char *[]){ |
4642 "breakpoint", "b", NULL | 4659 "breakpoint", "b", NULL |
4643 }, | 4660 }, |
4644 .usage = "breakpoint ADDRESSS", | 4661 .usage = "breakpoint ADDRESSS", |
4725 .desc = "Disassemble code starting at ADDRESS if provided or the current address if not", | 4742 .desc = "Disassemble code starting at ADDRESS if provided or the current address if not", |
4726 .impl = cmd_disassemble_z80, | 4743 .impl = cmd_disassemble_z80, |
4727 .min_args = 0, | 4744 .min_args = 0, |
4728 .max_args = 1 | 4745 .max_args = 1 |
4729 } | 4746 } |
4747 #endif //NEW_CORE | |
4730 }; | 4748 }; |
4731 | 4749 |
4732 #define NUM_Z80 (sizeof(z80_commands)/sizeof(*z80_commands)) | 4750 #define NUM_Z80 (sizeof(z80_commands)/sizeof(*z80_commands)) |
4733 | 4751 |
4734 command_def gen_z80_commands[] = { | 4752 command_def gen_z80_commands[] = { |
4872 } | 4890 } |
4873 return root; | 4891 return root; |
4874 } | 4892 } |
4875 | 4893 |
4876 #ifndef NO_Z80 | 4894 #ifndef NO_Z80 |
4895 #ifdef NEW_CORE | |
4896 #define Z80_OPTS opts | |
4897 #else | |
4898 #define Z80_OPTS options | |
4899 #endif | |
4877 | 4900 |
4878 static uint8_t read_z80(debug_root *root, uint32_t *out, char size) | 4901 static uint8_t read_z80(debug_root *root, uint32_t *out, char size) |
4879 { | 4902 { |
4880 z80_context *context = root->cpu_context; | 4903 z80_context *context = root->cpu_context; |
4881 uint32_t address = *out; | 4904 uint32_t address = *out; |
4882 *out = read_byte(address, (void **)context->mem_pointers, &context->options->gen, context); | 4905 *out = read_byte(address, (void **)context->mem_pointers, &context->Z80_OPTS->gen, context); |
4883 if (size == 'w') { | 4906 if (size == 'w') { |
4884 *out |= read_byte(address + 1, (void **)context->mem_pointers, &context->options->gen, context) << 8; | 4907 *out |= read_byte(address + 1, (void **)context->mem_pointers, &context->Z80_OPTS->gen, context) << 8; |
4885 } | 4908 } |
4886 return 1; | 4909 return 1; |
4887 } | 4910 } |
4888 | 4911 |
4889 static uint8_t write_z80(debug_root *root, uint32_t address, uint32_t value, char size) | 4912 static uint8_t write_z80(debug_root *root, uint32_t address, uint32_t value, char size) |
4890 { | 4913 { |
4891 z80_context *context = root->cpu_context; | 4914 z80_context *context = root->cpu_context; |
4892 write_byte(address, value, (void **)context->mem_pointers, &context->options->gen, context); | 4915 write_byte(address, value, (void **)context->mem_pointers, &context->Z80_OPTS->gen, context); |
4893 if (size == 'w') { | 4916 if (size == 'w') { |
4894 write_byte(address + 1, value >> 8, (void **)context->mem_pointers, &context->options->gen, context); | 4917 write_byte(address + 1, value >> 8, (void **)context->mem_pointers, &context->Z80_OPTS->gen, context); |
4895 } | 4918 } |
4896 return 1; | 4919 return 1; |
4897 } | 4920 } |
4898 | 4921 |
4922 #ifndef NEW_CORE | |
4899 static debug_val z80_reg8_get(debug_var *var) | 4923 static debug_val z80_reg8_get(debug_var *var) |
4900 { | 4924 { |
4901 z80_context *context = var->ptr; | 4925 z80_context *context = var->ptr; |
4902 return debug_int(context->regs[var->val.v.u32]); | 4926 return debug_int(context->regs[var->val.v.u32]); |
4903 } | 4927 } |
5210 var->ptr = root->cpu_context; | 5234 var->ptr = root->cpu_context; |
5211 var->get = z80_pc_get; | 5235 var->get = z80_pc_get; |
5212 root->variables = tern_insert_ptr(root->variables, "pc", var); | 5236 root->variables = tern_insert_ptr(root->variables, "pc", var); |
5213 root->variables = tern_insert_ptr(root->variables, "PC", var); | 5237 root->variables = tern_insert_ptr(root->variables, "PC", var); |
5214 } | 5238 } |
5239 #endif //NEW_CORE | |
5215 | 5240 |
5216 static uint32_t z80_chunk_end(debug_root *root, uint32_t start_address) | 5241 static uint32_t z80_chunk_end(debug_root *root, uint32_t start_address) |
5217 { | 5242 { |
5218 z80_context *z80 = root->cpu_context; | 5243 z80_context *z80 = root->cpu_context; |
5219 memmap_chunk const *chunk = find_map_chunk(start_address, &z80->options->gen, 0, NULL); | 5244 memmap_chunk const *chunk = find_map_chunk(start_address, &z80->Z80_OPTS->gen, 0, NULL); |
5220 if (!chunk) { | 5245 if (!chunk) { |
5221 return start_address; | 5246 return start_address; |
5222 } | 5247 } |
5223 if (chunk->mask == z80->options->gen.address_mask) { | 5248 if (chunk->mask == z80->Z80_OPTS->gen.address_mask) { |
5224 return chunk->end; | 5249 return chunk->end; |
5225 } | 5250 } |
5226 return (start_address & ~chunk->mask) + chunk->mask + 1; | 5251 return (start_address & ~chunk->mask) + chunk->mask + 1; |
5227 } | 5252 } |
5228 | 5253 |
5230 { | 5255 { |
5231 debug_root *root = find_root(context); | 5256 debug_root *root = find_root(context); |
5232 if (root && !root->commands) { | 5257 if (root && !root->commands) { |
5233 add_commands(root, common_commands, NUM_COMMON); | 5258 add_commands(root, common_commands, NUM_COMMON); |
5234 add_commands(root, z80_commands, NUM_Z80); | 5259 add_commands(root, z80_commands, NUM_Z80); |
5260 #ifndef NEW_CORE | |
5235 z80_names(root); | 5261 z80_names(root); |
5262 #endif | |
5236 genesis_context *gen; | 5263 genesis_context *gen; |
5237 sms_context *sms; | 5264 sms_context *sms; |
5238 coleco_context *coleco; | 5265 coleco_context *coleco; |
5239 debug_var *var; | 5266 debug_var *var; |
5240 //TODO: populate names | 5267 //TODO: populate names |
5313 return context; | 5340 return context; |
5314 } | 5341 } |
5315 } else { | 5342 } else { |
5316 zremove_breakpoint(context, address); | 5343 zremove_breakpoint(context, address); |
5317 } | 5344 } |
5345 #ifndef NEW_CORE | |
5318 if (context->wp_hit) { | 5346 if (context->wp_hit) { |
5319 context->wp_hit = 0; | 5347 context->wp_hit = 0; |
5320 this_bp = find_breakpoint(&root->breakpoints, context->wp_hit_address, BP_TYPE_CPU_WATCH); | 5348 this_bp = find_breakpoint(&root->breakpoints, context->wp_hit_address, BP_TYPE_CPU_WATCH); |
5321 if (*this_bp) { | 5349 if (*this_bp) { |
5322 if ((*this_bp)->condition) { | 5350 if ((*this_bp)->condition) { |
5346 fflush(stdout); | 5374 fflush(stdout); |
5347 return context; | 5375 return context; |
5348 } | 5376 } |
5349 } | 5377 } |
5350 } | 5378 } |
5379 #endif | |
5351 uint8_t * pc = get_native_pointer(address, (void **)context->mem_pointers, &context->Z80_OPTS->gen); | 5380 uint8_t * pc = get_native_pointer(address, (void **)context->mem_pointers, &context->Z80_OPTS->gen); |
5352 if (!pc) { | 5381 if (!pc) { |
5353 fatal_error("Failed to get native pointer on entering Z80 debugger at address %X\n", address); | 5382 fatal_error("Failed to get native pointer on entering Z80 debugger at address %X\n", address); |
5354 } | 5383 } |
5355 uint8_t * after_pc = z80_decode(pc, &inst); | 5384 uint8_t * after_pc = z80_decode(pc, &inst); |
5380 char input_buf[1024]; | 5409 char input_buf[1024]; |
5381 m68kinst inst; | 5410 m68kinst inst; |
5382 | 5411 |
5383 init_terminal(); | 5412 init_terminal(); |
5384 | 5413 |
5414 #ifndef NEW_CORE | |
5385 context->opts->sync_components(context, 0); | 5415 context->opts->sync_components(context, 0); |
5416 #endif | |
5386 debug_root *root = find_m68k_root(context); | 5417 debug_root *root = find_m68k_root(context); |
5387 if (!root) { | 5418 if (!root) { |
5388 return; | 5419 return; |
5389 } | 5420 } |
5390 //probably not necessary, but let's play it safe | 5421 //probably not necessary, but let's play it safe |
5467 } | 5498 } |
5468 if (context->system == current_system) { | 5499 if (context->system == current_system) { |
5469 genesis_context *gen = context->system; | 5500 genesis_context *gen = context->system; |
5470 vdp_force_update_framebuffer(gen->vdp); | 5501 vdp_force_update_framebuffer(gen->vdp); |
5471 } | 5502 } |
5503 #ifndef NEW_CORE | |
5472 uint32_t after = m68k_decode(m68k_instruction_fetch, context, &inst, address); | 5504 uint32_t after = m68k_decode(m68k_instruction_fetch, context, &inst, address); |
5473 root->after = after; | 5505 root->after = after; |
5474 root->inst = &inst; | 5506 root->inst = &inst; |
5507 #endif | |
5475 for (disp_def * cur = root->displays; cur; cur = cur->next) { | 5508 for (disp_def * cur = root->displays; cur; cur = cur->next) { |
5476 char format_str[8]; | 5509 char format_str[8]; |
5477 make_format_str(format_str, cur->format); | 5510 make_format_str(format_str, cur->format); |
5478 for (int i = 0; i < cur->num_args; i++) | 5511 for (int i = 0; i < cur->num_args; i++) |
5479 { | 5512 { |