[hatari-devel] Falcon (bad)Patch but sound quality increased a lot

Laurent Sallafranque laurent.sallafranque at free.fr
Thu Jan 13 22:54:50 CET 2011


Nicolas, Do you plane to upload my DSP patch or do you want me to do it ?

Regards

Laurent


Le 11/01/2011 23:07, Nicolas Pomarède a écrit :
> Le 11/01/2011 22:16, Laurent Sallafranque a écrit :
>> Hello,
>>
>> I've generated a bad patch for Falcon DSP.
>>
>> With this patch, sound quality is really so much better with some demos.
>> I've tested with EKO_System, Illusion demo, R U Experienced.
>>
>> It's what I thought. I need a precise 60 cycles clock for the SSI
>> tranfers (DSP <-> Crossbar).
>>
>> I've called DSP_Run inbetween each 68030 instruction cycles computing.
>> With this, instead of having a 100 cycles instruction (1 big call to
>> crossbar and DSP), it generates more intermediate calls.
>> My timers keep OK and sound is nice.
>>
>> I'm still sure that the 68030 as a clock for the Falcon is not good
>> enough (cycles are too long).
>>
>> Cycles ARE important in falcon emulation too (look at my previous patch,
>> DSP timings change let some demos run).
>> FalcAmp and Crown of creation complain about "bad timings", ...
>>
>> Any suggestion here ?
>>
>> Regards
>>
>> Laurent
>>
>
>
> Hello,
>
> yes, it's sure that you should call DSP_Run as frequently as possible, 
> each time M68000_AddCycles (or equivalent) is called, else you will 
> miss more cycles when calling the DSP emulation.
>
> In the current m68k_run, the main cause of possible "error" is that 
> DSP_Run is not called each time we process an interrupt.
>
> In the 3 patches you propose, I think the 1st one is not necessary. In 
> case SPCFLAG_EXTRA_CYCLES is set, we will add most of the time 4 
> cyles, so calling DSP_Run again just after 4 cycles might be counter 
> productive.
>
> I think the 2 patches before "#if 0" can be kept and the original last 
> call to DSP_Run should be changed from :
>
>
>         if (regs.spcflags) {
>             if (do_specialties ())
>                 return;
>         }
>
>         /* Run DSP 56k code if necessary */
>         if (bDspEnabled) {
>             DSP_Run( Cycles_GetCounter(CYCLES_COUNTER_CPU) );
>         }
>
> to
>         if (regs.spcflags) {
>             if (do_specialties ())
>                 return;
>
>             /* Run DSP 56k code if necessary */
>             if (bDspEnabled) {
>                 DSP_Run( Cycles_GetCounter(CYCLES_COUNTER_CPU) );
>             }
>         }
>
> -> No need to call DSP_Run again if M68000_AddCycles was not called by 
> do_specialties, because the cpu cycle counter would be the same since 
> the latest call to DSP_Run.
>
> In the end, there would be 3 calls to DSP_Run : 1 would be made every 
> time, the 2 others only when there's an exception.
>
> Could you try this ? If that's OK I can commit a patch to do this 
> (this would not really impact emulator's performance)
>
>
> Of course, the final stage of this to get perfect emulation is to do 
> the same as WinUae in its most precise mode : each cpu instruction is 
> split into 4 cycles and all components (blitter, copper, dma sound, 
> ...) are called every 4 cycles to see if they need "to work" -> really 
> more cpu intensive.
>
>
> Nicolas
>
>
>
>>
>>
>> diff -r 1ea504dede73 src/uae-cpu/newcpu.c
>> --- a/src/uae-cpu/newcpu.c Tue Jan 11 21:08:35 2011 +0100
>> +++ b/src/uae-cpu/newcpu.c Tue Jan 11 22:09:16 2011 +0100
>> @@ -1737,6 +1737,13 @@
>> Cycles_SetCounter(CYCLES_COUNTER_CPU, 0); /* to measure the total number
>> of cycles spent in the cpu */
>>
>> M68000_AddCyclesWithPairing(cycles);
>> +
>> + /* Run DSP 56k code if necessary */
>> + if (bDspEnabled) {
>> + DSP_Run( Cycles_GetCounter(CYCLES_COUNTER_CPU) );
>> + Cycles_SetCounter(CYCLES_COUNTER_CPU, 0); /* to measure the total
>> number of cycles spent in the cpu */
>> + }
>> +
>> if (regs.spcflags & SPCFLAG_EXTRA_CYCLES) {
>> /* Add some extra cycles to simulate a wait state */
>> unset_special(SPCFLAG_EXTRA_CYCLES);
>> @@ -1744,6 +1751,12 @@
>> nWaitStateCycles = 0;
>> }
>>
>> + /* Run DSP 56k code if necessary */
>> + if (bDspEnabled) {
>> + DSP_Run( Cycles_GetCounter(CYCLES_COUNTER_CPU) );
>> + Cycles_SetCounter(CYCLES_COUNTER_CPU, 0); /* to measure the total
>> number of cycles spent in the cpu */
>> + }
>> +
>> #if 0
>> while (PendingInterruptCount <= 0 && PendingInterruptFunction)
>> CALL_VAR(PendingInterruptFunction);
>> @@ -1757,6 +1770,12 @@
>> {
>> CALL_VAR(PendingInterruptFunction); /* call the interrupt handler */
>> do_specialties_interrupt(false); /* test if there's an mfp/video
>> interrupt and add non pending jitter */
>> +
>> + /* Run DSP 56k code if necessary */
>> + if (bDspEnabled) {
>> + DSP_Run( Cycles_GetCounter(CYCLES_COUNTER_CPU) );
>> + Cycles_SetCounter(CYCLES_COUNTER_CPU, 0); /* to measure the total
>> number of cycles spent in the cpu */
>> + }
>> #if 0
>> if ( regs.spcflags & ( SPCFLAG_MFP | SPCFLAG_INT ) ) { /* only check
>> mfp/video interrupts */
>> if (do_specialties ()) /* check if this latest int has higher 
>> priority */
>>
>> _______________________________________________
>> hatari-devel mailing list
>> hatari-devel at lists.berlios.de
>> https://lists.berlios.de/mailman/listinfo/hatari-devel
>
> _______________________________________________
> hatari-devel mailing list
> hatari-devel at lists.berlios.de
> https://lists.berlios.de/mailman/listinfo/hatari-devel
>
>




More information about the hatari-devel mailing list