comparison segacd.c @ 2426:cde4ea2b4929

Clear DSR in certain gate array writes. Fixes issue in Penn & Teller's Smoke and Mirrors
author Michael Pavone <pavone@retrodev.com>
date Thu, 25 Jan 2024 21:54:04 -0800
parents 03e6ac327ba0
children 8b948cf23557
comparison
equal deleted inserted replaced
2425:794ba17f0716 2426:cde4ea2b4929
854 } 854 }
855 calculate_target_cycle(m68k); 855 calculate_target_cycle(m68k);
856 } 856 }
857 cd->gate_array[GA_CDC_DMA_ADDR] = 0; 857 cd->gate_array[GA_CDC_DMA_ADDR] = 0;
858 cd->cdc_dst_low = 0; 858 cd->cdc_dst_low = 0;
859 //TODO: Confirm if DSR is cleared here on hardware
860 cd->gate_array[GA_CDC_CTRL] &= ~BIT_DSR;
859 break; 861 break;
860 } 862 }
861 case GA_CDC_REG_DATA: 863 case GA_CDC_REG_DATA:
862 cdd_run(cd, m68k->current_cycle); 864 cdd_run(cd, m68k->current_cycle);
863 printf("CDC write %X: %X @ %u\n", cd->cdc.ar, value, m68k->current_cycle); 865 printf("CDC write %X: %X @ %u\n", cd->cdc.ar, value, m68k->current_cycle);
866 if (cd->cdc.ar == 6) {
867 cd->cdc_dst_low = 0;
868 //TODO: Confirm if DSR is cleared here on hardware
869 cd->gate_array[GA_CDC_CTRL] &= ~BIT_DSR;
870 }
864 lc8951_reg_write(&cd->cdc, value); 871 lc8951_reg_write(&cd->cdc, value);
865 calculate_target_cycle(m68k); 872 calculate_target_cycle(m68k);
866 break; 873 break;
867 case GA_CDC_HOST_DATA: 874 case GA_CDC_HOST_DATA:
868 //writes to this register have the same side effects as reads 875 //writes to this register have the same side effects as reads
870 break; 877 break;
871 case GA_CDC_DMA_ADDR: 878 case GA_CDC_DMA_ADDR:
872 cdd_run(cd, m68k->current_cycle); 879 cdd_run(cd, m68k->current_cycle);
873 cd->gate_array[reg] = value; 880 cd->gate_array[reg] = value;
874 cd->cdc_dst_low = 0; 881 cd->cdc_dst_low = 0;
882 //TODO: Confirm if DSR is cleared here on hardware
883 cd->gate_array[GA_CDC_CTRL] &= ~BIT_DSR;
875 break; 884 break;
876 case GA_STOP_WATCH: 885 case GA_STOP_WATCH:
877 //docs say you should only write zero to reset 886 //docs say you should only write zero to reset
878 //mcd-verificator comments suggest any value will reset 887 //mcd-verificator comments suggest any value will reset
879 timers_run(cd, m68k->current_cycle); 888 timers_run(cd, m68k->current_cycle);