comparison segacd.c @ 2129:4c9e447aa25b

Pause word RAM DMA while word RAM is switched to main CPU
author Michael Pavone <pavone@retrodev.com>
date Sun, 13 Mar 2022 11:49:07 -0700
parents b0dcf5c9f353
children d90d92ce5cab
comparison
equal deleted inserted replaced
2128:b0dcf5c9f353 2129:4c9e447aa25b
918 dma_addr &= (1 << 17) - 1; 918 dma_addr &= (1 << 17) - 1;
919 cd->m68k->mem_pointers[1][dma_addr >> 1] = cd->gate_array[GA_CDC_HOST_DATA]; 919 cd->m68k->mem_pointers[1][dma_addr >> 1] = cd->gate_array[GA_CDC_HOST_DATA];
920 m68k_invalidate_code_range(cd->m68k, 0x0C0000 + dma_addr - 1, 0x0C0000 + dma_addr + 1); 920 m68k_invalidate_code_range(cd->m68k, 0x0C0000 + dma_addr - 1, 0x0C0000 + dma_addr + 1);
921 } else { 921 } else {
922 //2M mode, check if Sub CPU has access 922 //2M mode, check if Sub CPU has access
923 if (!(cd->gate_array[GA_MEM_MODE] & BIT_RET)) { 923 if (cd->main_has_word2m) {
924 return 0;
925 } else {
924 cd_graphics_run(cd, cd->cdc.cycle); 926 cd_graphics_run(cd, cd->cdc.cycle);
925 dma_addr &= (1 << 18) - 1; 927 dma_addr &= (1 << 18) - 1;
926 cd->word_ram[dma_addr >> 1] = cd->gate_array[GA_CDC_HOST_DATA]; 928 cd->word_ram[dma_addr >> 1] = cd->gate_array[GA_CDC_HOST_DATA];
927 m68k_invalidate_code_range(cd->m68k, 0x080000 + dma_addr, 0x080000 + dma_addr + 1); 929 m68k_invalidate_code_range(cd->m68k, 0x080000 + dma_addr, 0x080000 + dma_addr + 1);
928 } 930 }
1193 m68k->mem_pointers[cd->memptr_start_index + 1] = NULL; 1195 m68k->mem_pointers[cd->memptr_start_index + 1] = NULL;
1194 m68k->mem_pointers[cd->memptr_start_index + 2] = NULL; 1196 m68k->mem_pointers[cd->memptr_start_index + 2] = NULL;
1195 cd->m68k->mem_pointers[0] = cd->word_ram; 1197 cd->m68k->mem_pointers[0] = cd->word_ram;
1196 cd->gate_array[reg] &= ~BIT_RET; 1198 cd->gate_array[reg] &= ~BIT_RET;
1197 cd->main_has_word2m = 0; 1199 cd->main_has_word2m = 0;
1200
1201 uint16_t dst = cd->gate_array[GA_CDC_CTRL] >> 8 & 0x7;
1202 if (dst == DST_WORD_RAM) {
1203 lc8951_resume_transfer(&cd->cdc, cd->cdc.cycle);
1204 }
1198 1205
1199 m68k_invalidate_code_range(m68k, cd->base + 0x200000, cd->base + 0x240000); 1206 m68k_invalidate_code_range(m68k, cd->base + 0x200000, cd->base + 0x240000);
1200 m68k_invalidate_code_range(cd->m68k, 0x080000, 0x0C0000); 1207 m68k_invalidate_code_range(cd->m68k, 0x080000, 0x0C0000);
1201 } 1208 }
1202 } 1209 }