Mercurial > repos > blastem
comparison segacd.c @ 2081:cfd53c94fffb
Initial stab at RF5C164 emulation
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 03 Feb 2022 23:15:42 -0800 |
parents | bafb757e1cd2 |
children | 372625dd9590 |
comparison
equal
deleted
inserted
replaced
2080:bafb757e1cd2 | 2081:cfd53c94fffb |
---|---|
260 return vcontext; | 260 return vcontext; |
261 } | 261 } |
262 | 262 |
263 static uint8_t pcm_read8(uint32_t address, void *vcontext) | 263 static uint8_t pcm_read8(uint32_t address, void *vcontext) |
264 { | 264 { |
265 return 0; | 265 m68k_context *m68k = vcontext; |
266 segacd_context *cd = m68k->system; | |
267 if (address & 1) { | |
268 rf5c164_run(&cd->pcm, m68k->current_cycle); | |
269 return rf5c164_read(&cd->pcm, address >> 1); | |
270 } else { | |
271 return 0xFF; | |
272 } | |
266 } | 273 } |
267 | 274 |
268 static uint16_t pcm_read16(uint32_t address, void *vcontext) | 275 static uint16_t pcm_read16(uint32_t address, void *vcontext) |
269 { | 276 { |
270 return 0xFF00 | pcm_read8(address+1, vcontext); | 277 return 0xFF00 | pcm_read8(address+1, vcontext); |
271 } | 278 } |
272 | 279 |
273 static void *pcm_write8(uint32_t address, void *vcontext, uint8_t value) | 280 static void *pcm_write8(uint32_t address, void *vcontext, uint8_t value) |
274 { | 281 { |
282 m68k_context *m68k = vcontext; | |
283 segacd_context *cd = m68k->system; | |
284 if (address & 1) { | |
285 rf5c164_run(&cd->pcm, m68k->current_cycle); | |
286 rf5c164_write(&cd->pcm, address >> 1, value); | |
287 } | |
275 return vcontext; | 288 return vcontext; |
276 } | 289 } |
277 | 290 |
278 static void *pcm_write16(uint32_t address, void *vcontext, uint16_t value) | 291 static void *pcm_write16(uint32_t address, void *vcontext, uint16_t value) |
279 { | 292 { |
758 cd->gate_array[GA_CDC_CTRL] |= BIT_DSR; | 771 cd->gate_array[GA_CDC_CTRL] |= BIT_DSR; |
759 printf("DSR set at %u, (transfer_end %u, dbcl %X, dbch %X)\n", cd->cdc.cycle, cd->cdc.transfer_end, cd->cdc.regs[2], cd->cdc.regs[3]); | 772 printf("DSR set at %u, (transfer_end %u, dbcl %X, dbch %X)\n", cd->cdc.cycle, cd->cdc.transfer_end, cd->cdc.regs[2], cd->cdc.regs[3]); |
760 break; | 773 break; |
761 case DST_PCM_RAM: | 774 case DST_PCM_RAM: |
762 dma_addr &= (1 << 13) - 1; | 775 dma_addr &= (1 << 13) - 1; |
763 //TODO: write to currently visible 8K bank of PCM RAM I guess? | 776 rf5c164_write(&cd->pcm, 0x1000 | (dma_addr >> 1), value); |
764 dma_addr += 2; | 777 dma_addr += 2; |
765 cd->cdc_dst_low = dma_addr & 7; | 778 cd->cdc_dst_low = dma_addr & 7; |
766 cd->gate_array[GA_CDC_DMA_ADDR] = dma_addr >> 3; | 779 cd->gate_array[GA_CDC_DMA_ADDR] = dma_addr >> 3; |
767 break; | 780 break; |
768 case DST_PROG_RAM: | 781 case DST_PROG_RAM: |
805 static void scd_peripherals_run(segacd_context *cd, uint32_t cycle) | 818 static void scd_peripherals_run(segacd_context *cd, uint32_t cycle) |
806 { | 819 { |
807 timers_run(cd, cycle); | 820 timers_run(cd, cycle); |
808 cdd_run(cd, cycle); | 821 cdd_run(cd, cycle); |
809 cd_graphics_run(cd, cycle); | 822 cd_graphics_run(cd, cycle); |
823 rf5c164_run(&cd->pcm, cycle); | |
810 } | 824 } |
811 | 825 |
812 static m68k_context *sync_components(m68k_context * context, uint32_t address) | 826 static m68k_context *sync_components(m68k_context * context, uint32_t address) |
813 { | 827 { |
814 segacd_context *cd = context->system; | 828 segacd_context *cd = context->system; |
888 cd->graphics_int_cycle -= deduction; | 902 cd->graphics_int_cycle -= deduction; |
889 } else { | 903 } else { |
890 cd->graphics_int_cycle = 0; | 904 cd->graphics_int_cycle = 0; |
891 } | 905 } |
892 } | 906 } |
907 cd->pcm.cycle -= deduction; | |
893 } | 908 } |
894 | 909 |
895 static uint16_t main_gate_read16(uint32_t address, void *vcontext) | 910 static uint16_t main_gate_read16(uint32_t address, void *vcontext) |
896 { | 911 { |
897 m68k_context *m68k = vcontext; | 912 m68k_context *m68k = vcontext; |
1173 media = media->chain; | 1188 media = media->chain; |
1174 } | 1189 } |
1175 cdd_mcu_init(&cd->cdd, media); | 1190 cdd_mcu_init(&cd->cdd, media); |
1176 cd_graphics_init(cd); | 1191 cd_graphics_init(cd); |
1177 cdd_fader_init(&cd->fader); | 1192 cdd_fader_init(&cd->fader); |
1178 | 1193 rf5c164_init(&cd->pcm, SCD_MCLKS, 4); |
1179 return cd; | 1194 return cd; |
1180 } | 1195 } |
1181 | 1196 |
1182 memmap_chunk *segacd_main_cpu_map(segacd_context *cd, uint8_t cart_boot, uint32_t *num_chunks) | 1197 memmap_chunk *segacd_main_cpu_map(segacd_context *cd, uint8_t cart_boot, uint32_t *num_chunks) |
1183 { | 1198 { |