comparison segacd.c @ 2068:f573f2c31bc9 segacd

Dump PROG RAM to file for debugging
author Michael Pavone <pavone@retrodev.com>
date Sun, 30 Jan 2022 11:58:34 -0800
parents a61a8a87410c
children 8e51c0c3f2e3
comparison
equal deleted inserted replaced
2067:f22e04b69272 2068:f573f2c31bc9
415 if (cd->gate_array[GA_CDC_CTRL] & BIT_DSR) { 415 if (cd->gate_array[GA_CDC_CTRL] & BIT_DSR) {
416 cd->gate_array[GA_CDC_CTRL] &= ~BIT_DSR; 416 cd->gate_array[GA_CDC_CTRL] &= ~BIT_DSR;
417 lc8951_resume_transfer(&cd->cdc, cd->cdc.cycle); 417 lc8951_resume_transfer(&cd->cdc, cd->cdc.cycle);
418 } 418 }
419 calculate_target_cycle(cd->m68k); 419 calculate_target_cycle(cd->m68k);
420 420
421 } 421 }
422 return cd->gate_array[reg]; 422 return cd->gate_array[reg];
423 } 423 }
424 case GA_STOP_WATCH: 424 case GA_STOP_WATCH:
425 case GA_TIMER: 425 case GA_TIMER:
686 } 686 }
687 } else { 687 } else {
688 cd->gate_array[GA_CDC_HOST_DATA] &= 0xFF00; 688 cd->gate_array[GA_CDC_HOST_DATA] &= 0xFF00;
689 cd->gate_array[GA_CDC_HOST_DATA] |= value; 689 cd->gate_array[GA_CDC_HOST_DATA] |= value;
690 } 690 }
691 691
692 uint32_t dma_addr = cd->gate_array[GA_CDC_DMA_ADDR] << 3; 692 uint32_t dma_addr = cd->gate_array[GA_CDC_DMA_ADDR] << 3;
693 dma_addr |= cd->cdc_dst_low; 693 dma_addr |= cd->cdc_dst_low;
694 switch (dest) 694 switch (dest)
695 { 695 {
696 case DST_MAIN_CPU: 696 case DST_MAIN_CPU:
882 882
883 static uint8_t main_gate_read8(uint32_t address, void *vcontext) 883 static uint8_t main_gate_read8(uint32_t address, void *vcontext)
884 { 884 {
885 uint16_t val = main_gate_read16(address & 0xFE, vcontext); 885 uint16_t val = main_gate_read16(address & 0xFE, vcontext);
886 return address & 1 ? val : val >> 8; 886 return address & 1 ? val : val >> 8;
887 }
888
889 static void dump_prog_ram(segacd_context *cd)
890 {
891 static int dump_count;
892 char fname[256];
893 sprintf(fname, "prog_ram_%d.bin", dump_count++);
894 FILE *f = fopen(fname, "wb");
895 if (f) {
896 uint32_t last = 256*1024-1;
897 for(; last > 0; --last)
898 {
899 if (cd->prog_ram[last]) {
900 break;
901 }
902 }
903 for (uint32_t i = 0; i <= last; i++)
904 {
905 uint8_t pair[2];
906 pair[0] = cd->prog_ram[i] >> 8;
907 pair[1] = cd->prog_ram[i];
908 fwrite(pair, 1, sizeof(pair), f);
909 }
910
911 fclose(f);
912 }
887 } 913 }
888 914
889 static void *main_gate_write16(uint32_t address, void *vcontext, uint16_t value) 915 static void *main_gate_write16(uint32_t address, void *vcontext, uint16_t value)
890 { 916 {
891 m68k_context *m68k = vcontext; 917 m68k_context *m68k = vcontext;
918 } 944 }
919 } else if (old_access) { 945 } else if (old_access) {
920 m68k->mem_pointers[cd->memptr_start_index] = NULL; 946 m68k->mem_pointers[cd->memptr_start_index] = NULL;
921 m68k_invalidate_code_range(m68k, cd->base + 0x220000, cd->base + 0x240000); 947 m68k_invalidate_code_range(m68k, cd->base + 0x220000, cd->base + 0x240000);
922 m68k_invalidate_code_range(cd->m68k, bank * 0x20000, (bank + 1) * 0x20000); 948 m68k_invalidate_code_range(cd->m68k, bank * 0x20000, (bank + 1) * 0x20000);
949 if (!new_access) {
950 dump_prog_ram(cd);
951 }
923 } 952 }
924 break; 953 break;
925 } 954 }
926 case GA_MEM_MODE: { 955 case GA_MEM_MODE: {
927 uint16_t changed = cd->gate_array[reg] ^ value; 956 uint16_t changed = cd->gate_array[reg] ^ value;