Mercurial > repos > blastem
comparison segacd.c @ 2080:bafb757e1cd2
Implement CD audio
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 02 Feb 2022 01:10:07 -0800 |
parents | c69e42444f96 |
children | cfd53c94fffb |
comparison
equal
deleted
inserted
replaced
2079:5a2b759f6b2d | 2080:bafb757e1cd2 |
---|---|
75 | 75 |
76 //GA_CDC_CTRL | 76 //GA_CDC_CTRL |
77 #define BIT_EDT 0x8000 | 77 #define BIT_EDT 0x8000 |
78 #define BIT_DSR 0x4000 | 78 #define BIT_DSR 0x4000 |
79 | 79 |
80 //GA_CDD_CTRL | |
81 #define BIT_MUTE 0x0100 | |
82 | |
80 enum { | 83 enum { |
81 DST_MAIN_CPU = 2, | 84 DST_MAIN_CPU = 2, |
82 DST_SUB_CPU, | 85 DST_SUB_CPU, |
83 DST_PCM_RAM, | 86 DST_PCM_RAM, |
84 DST_PROG_RAM, | 87 DST_PROG_RAM, |
304 } | 307 } |
305 } | 308 } |
306 | 309 |
307 static void cdd_run(segacd_context *cd, uint32_t cycle) | 310 static void cdd_run(segacd_context *cd, uint32_t cycle) |
308 { | 311 { |
309 cdd_mcu_run(&cd->cdd, cycle, cd->gate_array + GA_CDD_CTRL, &cd->cdc); | 312 cdd_mcu_run(&cd->cdd, cycle, cd->gate_array + GA_CDD_CTRL, &cd->cdc, &cd->fader); |
310 lc8951_run(&cd->cdc, cycle); | 313 lc8951_run(&cd->cdc, cycle); |
311 } | 314 } |
312 | 315 |
313 static uint32_t next_timer_int(segacd_context *cd) | 316 static uint32_t next_timer_int(segacd_context *cd) |
314 { | 317 { |
592 break; | 595 break; |
593 case GA_INT_MASK: | 596 case GA_INT_MASK: |
594 cd->gate_array[reg] = value & (BIT_MASK_IEN6|BIT_MASK_IEN5|BIT_MASK_IEN4|BIT_MASK_IEN3|BIT_MASK_IEN2|BIT_MASK_IEN1); | 597 cd->gate_array[reg] = value & (BIT_MASK_IEN6|BIT_MASK_IEN5|BIT_MASK_IEN4|BIT_MASK_IEN3|BIT_MASK_IEN2|BIT_MASK_IEN1); |
595 calculate_target_cycle(m68k); | 598 calculate_target_cycle(m68k); |
596 break; | 599 break; |
600 case GA_CDD_FADER: | |
601 cdd_run(cd, m68k->current_cycle); | |
602 value &= 0x7FFF; | |
603 cdd_fader_attenuation_write(&cd->fader, value); | |
604 cd->gate_array[reg] &= 0x8000; | |
605 cd->gate_array[reg] |= value; | |
606 break; | |
597 case GA_CDD_CTRL: { | 607 case GA_CDD_CTRL: { |
598 cdd_run(cd, m68k->current_cycle); | 608 cdd_run(cd, m68k->current_cycle); |
599 uint16_t changed = cd->gate_array[reg] ^ value; | 609 uint16_t changed = cd->gate_array[reg] ^ value; |
600 if (changed & BIT_HOCK) { | 610 if (changed & BIT_HOCK) { |
601 cd->gate_array[reg] &= ~BIT_HOCK; | 611 cd->gate_array[reg] &= ~BIT_HOCK; |
602 cd->gate_array[reg] |= value & BIT_HOCK; | 612 cd->gate_array[reg] |= value & BIT_HOCK; |
603 if (value & BIT_HOCK) { | 613 if (value & BIT_HOCK) { |
604 cdd_hock_enabled(&cd->cdd); | 614 cdd_hock_enabled(&cd->cdd); |
605 } else { | 615 } else { |
606 cdd_hock_disabled(&cd->cdd); | 616 cdd_hock_disabled(&cd->cdd); |
617 cd->gate_array[reg] |= BIT_MUTE; | |
607 } | 618 } |
608 calculate_target_cycle(m68k); | 619 calculate_target_cycle(m68k); |
609 } | 620 } |
610 break; | 621 break; |
611 } | 622 } |
800 | 811 |
801 static m68k_context *sync_components(m68k_context * context, uint32_t address) | 812 static m68k_context *sync_components(m68k_context * context, uint32_t address) |
802 { | 813 { |
803 segacd_context *cd = context->system; | 814 segacd_context *cd = context->system; |
804 scd_peripherals_run(cd, context->current_cycle); | 815 scd_peripherals_run(cd, context->current_cycle); |
816 if (context->int_ack) { | |
817 printf("int ack %d\n", context->int_ack); | |
818 } | |
805 switch (context->int_ack) | 819 switch (context->int_ack) |
806 { | 820 { |
807 case 1: | 821 case 1: |
808 cd->graphics_int_cycle = CYCLE_NEVER; | 822 cd->graphics_int_cycle = CYCLE_NEVER; |
809 break; | 823 break; |
1151 cd->busack = 1; | 1165 cd->busack = 1; |
1152 cd->need_reset = 1; | 1166 cd->need_reset = 1; |
1153 cd->reset = 1; //active low, so reset is not active on start | 1167 cd->reset = 1; //active low, so reset is not active on start |
1154 cd->memptr_start_index = 0; | 1168 cd->memptr_start_index = 0; |
1155 cd->gate_array[1] = 1; | 1169 cd->gate_array[1] = 1; |
1156 cd->gate_array[0x1B] = 0x100; | 1170 cd->gate_array[GA_CDD_CTRL] = BIT_MUTE; //Data/mute flag is set on start |
1157 lc8951_init(&cd->cdc, handle_cdc_byte, cd); | 1171 lc8951_init(&cd->cdc, handle_cdc_byte, cd); |
1158 if (media->chain && media->type != MEDIA_CDROM) { | 1172 if (media->chain && media->type != MEDIA_CDROM) { |
1159 media = media->chain; | 1173 media = media->chain; |
1160 } | 1174 } |
1161 cdd_mcu_init(&cd->cdd, media); | 1175 cdd_mcu_init(&cd->cdd, media); |
1162 cd_graphics_init(cd); | 1176 cd_graphics_init(cd); |
1177 cdd_fader_init(&cd->fader); | |
1163 | 1178 |
1164 return cd; | 1179 return cd; |
1165 } | 1180 } |
1166 | 1181 |
1167 memmap_chunk *segacd_main_cpu_map(segacd_context *cd, uint8_t cart_boot, uint32_t *num_chunks) | 1182 memmap_chunk *segacd_main_cpu_map(segacd_context *cd, uint8_t cart_boot, uint32_t *num_chunks) |