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