504 lines
18 KiB
C
504 lines
18 KiB
C
/*
|
|
Hatari - clocks_timings.c
|
|
|
|
This file is distributed under the GNU General Public License, version 2
|
|
or at your option any later version. Read the file gpl.txt for details.
|
|
|
|
Clocks Timings for the hardware components in each supported machine type,
|
|
as well as functions taking into account the exact length of a VBL to
|
|
precisely emulate video/audio parts (number of VBL per sec, number of
|
|
audio samples per VBL, ...)
|
|
|
|
The video freq is not exactly 50 or 60 Hz because the number of cpu cycles
|
|
per second is not a multiple of the number of cpu cycles per VBL.
|
|
This can cause synchronisation errors between audio and video effects
|
|
when both components use different clocks (eg in STE where audio DMA clock
|
|
is not the same as the cpu clock).
|
|
|
|
To get the best results, it's recommanded to set RoundVBLPerSec=false.
|
|
|
|
Note that if you do so, the number of VBL won't be exactly 50 or 60 per sec
|
|
but 50.05 or 60.04 ; if this does not work with your display, set RoundVBLPerSec=true
|
|
to get an integer number of VBL per sec (but this should not be needed).
|
|
|
|
|
|
|
|
ST :
|
|
MCLK = 32 MHz
|
|
SHIFTER IN = 32 MHz OUT = 16 MHz
|
|
MMU IN = 16 MHz OUT = 8 MHz, 4 MHz
|
|
GLUE IN = 8 MHz OUT = 2 MHz, 500 kHz
|
|
BUS = 8 MHz
|
|
|
|
CPU 68000 IN = 8 MHz
|
|
DMA IN = 8 MHz
|
|
MFP 68901 IN = 4 MHz, 2.4576 MHz (external clock)
|
|
FDC WD1772 IN = 8 MHz
|
|
BLITTER IN = 8 MHz
|
|
YM2149 IN = 2 MHz
|
|
ACIA MC6850 IN = 500 kHz
|
|
IKBD HD6301 IN = 1 MHZ (local clock)
|
|
|
|
|
|
STE :
|
|
MCLK = 32 MHz
|
|
EXT OSC = 8 MHZ OUT = 8 MHz (SCLK), 2 MHz (CLK2)
|
|
GST SHIFTER IN = 32 MHz, 8 MHz (external clock SCLK) OUT = 16 MHz, 8 MHz (FCLK=SCLK)
|
|
GST MCU IN = 16 MHz OUT = 8 MHz (CLK8), 4 MHz (CLK4), 500 kHz (KHZ500)
|
|
BUS = 8 MHz
|
|
|
|
CPU 68000 IN = 8 MHz (CLK8)
|
|
DMA IN = 8 MHz (CLK8)
|
|
DMA AUDIO IN = 8 MHz (SCLK)
|
|
MFP 68901 IN = 4 MHz (CLK4), 2.4576 MHz (external clock)
|
|
FDC WD1772 IN = 8 MHz (SCLK)
|
|
BLITTER IN = 8 MHz (CLK8)
|
|
YM2149 IN = 2 MHz (CLK2)
|
|
ACIA MC6850 IN = 500 kHz (KHZ500)
|
|
IKBD HD6301 IN = 1 MHZ (local clock)
|
|
|
|
|
|
MEGA STE :
|
|
MCLK = 32 MHz
|
|
SCLK = 8 MHz
|
|
GST SHIFTER IN = 32 MHz, 8 MHz (external clock SCLK) OUT = 16 MHz (CLK16), 8 MHz (FCLK=SCLK)
|
|
GST MCU IN = 16 MHz (CLK16) OUT = 8 MHz (CLK8), 4 MHz (CLK4), 500 kHz (KHZ500)
|
|
BUS = 8 MHz
|
|
|
|
CPU 68000 IN = 16 MHz (CLK16)
|
|
FPU 68881 IN = 16 MHz (CLK16)
|
|
DMA IN = 8 MHz (CLK8)
|
|
DMA AUDIO IN = 8 MHz (SCLK)
|
|
MFP 68901 IN = 4 MHz (CLK4), 2.4576 MHz (external clock)
|
|
FDC WD1772 IN = 8 MHz (SCLK)
|
|
BLITTER IN = 8 MHz (CLK8)
|
|
YM2149 IN = 2 MHz (CLK2 = SCLK / 4)
|
|
ACIA MC6850 IN = 500 kHz (KHZ500)
|
|
IKBD HD6301 IN = 1 MHZ (local clock)
|
|
|
|
|
|
TT :
|
|
MCLK = 32 MHz (CLK32)
|
|
TT VIDEO IN = 32 MHz (CLK32) OUT = 16 MHz (CLK16), 4 MHz (CLK4), 2 MHz (CLK2)
|
|
GST MCU IN = 16 MHz (CLK16A), 2 MHz (CLK2) OUT = 8 MHz (CLK8), 8 MHz (FCCLK), 1 MHz (CLKE), 500 kHz (CLKX5)
|
|
BUS = 16 MHz
|
|
|
|
CPU 68030 IN = 32 MHz (CLK32)
|
|
FPU 68882 IN = 32 MHz (CLK32)
|
|
DMA IN = 8 MHz (CLK8)
|
|
SND SHIFTER IN = 16 MHz (CLK16F), 2 MHz (CLK2) OUT = ? MHz (FCLK)
|
|
MFP 68901 IN = 4 MHz (CLK4), 2.4576 MHz (external clock) NOTE : TT has 2 MFPs 68901
|
|
FDC WD1772 IN = 8 MHz (FCCLK)
|
|
BLITTER NOT AVAILABLE
|
|
YM2149 IN = 2 MHz (CLK2)
|
|
ACIA MC6850 IN = 500 kHz (CLKX5)
|
|
IKBD HD6301 IN = 1 MHZ (local clock)
|
|
|
|
|
|
FALCON :
|
|
MCLK = 32 MHz (CLK32)
|
|
VIDEL IN = 32 MHz (VID32MHZ), 25 MHz (25K)
|
|
COMBEL IN = 32 MHz (CLK32) OUT = 4 MHz (CLK4), 500 kHz (KHZ500)
|
|
BUS = 16 MHz
|
|
|
|
CPU 68030 IN = 16 MHz (CPUCLKB)
|
|
FPU 68882 IN = 16 MHz (CPUCLKA)
|
|
DMA IN = 8 MHz (CLK8)
|
|
CODEC IN = 25 MHz (25K)
|
|
MFP 68901 IN = 4 MHz (CLK4), 2.4576 MHz (external clock)
|
|
FDC AJAX IN = 16 MHz (FCCLK)
|
|
BLITTER IN = 16 MHz
|
|
YM3439 IN = 2 MHz (CLK2)
|
|
ACIA MC6850 IN = 500 kHz (KHZ500)
|
|
IKBD HD6301 IN = 1 MHZ (local clock)
|
|
|
|
DSP 56001 IN = 32 MHz (DSP_32M)
|
|
|
|
*/
|
|
|
|
|
|
const char ClocksTimings_fileid[] = "Hatari clocks_timings.c : " __DATE__ " " __TIME__;
|
|
|
|
#include <SDL.h>
|
|
#include <SDL_endian.h>
|
|
|
|
#include "main.h"
|
|
#include "configuration.h"
|
|
#include "log.h"
|
|
#include "clocks_timings.h"
|
|
|
|
|
|
|
|
/* The possible master frequencies used in the different machines */
|
|
/* depending on PAL/NTSC version. */
|
|
|
|
#define ATARI_STF_PAL_MCLK 32084988 /* CPU_Freq = 8.021247 MHz */
|
|
#define ATARI_STF_NTSC_MCLK 32042400 /* CPU_Freq = 8.010600 MHz */
|
|
#define ATARI_STF_CYCLES_PER_VBL_PAL 160256 /* 512 cycles * 313 lines */
|
|
#define ATARI_STF_CYCLES_PER_VBL_NTSC 133604 /* 508 cycles * 263 lines */
|
|
#define ATARI_STF_CYCLES_PER_VBL_HI 112224 /* 224 cycles * 501 lines */
|
|
|
|
#define ATARI_STE_PAL_MCLK 32084988 /* CPU_Freq = 8.021247 MHz */
|
|
#define ATARI_STE_NTSC_MCLK 32215905 /* CPU_Freq = 8.05397625 MHz */
|
|
#define ATARI_STE_EXT_OSC 8010613 /* OSC U303 */
|
|
#define ATARI_STE_CYCLES_PER_VBL_PAL 160256 /* 512 cycles * 313 lines */
|
|
#define ATARI_STE_CYCLES_PER_VBL_NTSC 133604 /* 508 cycles * 263 lines */
|
|
#define ATARI_STE_CYCLES_PER_VBL_HI 112224 /* 224 cycles * 501 lines */
|
|
|
|
#define ATARI_MEGA_STE_PAL_MCLK 32084988 /* CPU_Freq = 16.042494 MHz */
|
|
#define ATARI_MEGA_STE_NTSC_MCLK 32215905 /* CPU_Freq = 16.1079525 MHz */
|
|
#define ATARI_MEGA_STE_EXT_OSC 16021226 /* OSC U408 */
|
|
|
|
#define ATARI_TT_PAL_MCLK 32084988 /* CPU_Freq = 32.084988 MHz */
|
|
#define ATARI_TT_NTSC_MCLK 32215905 /* CPU_Freq = 32.215905 MHz */
|
|
|
|
#define ATARI_FALCON_PAL_MCLK 32084988 /* CPU_Freq = 16.042494 MHz */
|
|
#define ATARI_FALCON_NTSC_MCLK 32215905 /* CPU_Freq = 16.1079525 MHz */
|
|
#define ATARI_FALCON_25M_CLK 25175000
|
|
|
|
#define ATARI_MFP_XTAL 2457600 /* external clock for the MFP */
|
|
#define ATARI_IKBD_CLK 1000000 /* clock of the HD6301 ikbd cpu */
|
|
|
|
|
|
|
|
CLOCKS_STRUCT MachineClocks;
|
|
|
|
|
|
bool RoundVBLPerSec = false; /* if false, don't round number of VBL to 50/60 Hz */
|
|
/* but compute the exact value based on cpu/video clocks */
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/**
|
|
* Initialize all the clocks informations related to a specific machine type.
|
|
* We consider the machine is running with PAL clocks.
|
|
*/
|
|
|
|
void ClocksTimings_InitMachine ( MACHINETYPE MachineType )
|
|
{
|
|
memset ( (void *)&MachineClocks , 0 , sizeof ( MachineClocks ) );
|
|
|
|
if ( MachineType == MACHINE_ST )
|
|
{
|
|
int CLK16, CLK8, CLK4, CLK2, CLK500;
|
|
|
|
MachineClocks.MCLK_Freq = ATARI_STF_PAL_MCLK; /* 32.084988 MHz */
|
|
|
|
MachineClocks.SHIFTER_Freq = MachineClocks.MCLK_Freq; /* 32 MHz */
|
|
CLK16 = MachineClocks.SHIFTER_Freq / 2;
|
|
|
|
MachineClocks.MMU_Freq = CLK16; /* 16 MHz */
|
|
CLK8 = MachineClocks.MMU_Freq / 2;
|
|
CLK4 = MachineClocks.MMU_Freq / 4;
|
|
|
|
MachineClocks.GLUE_Freq = CLK8; /* 8 MHz */
|
|
CLK2 = MachineClocks.GLUE_Freq / 4;
|
|
CLK500 = MachineClocks.GLUE_Freq / 16;
|
|
|
|
MachineClocks.BUS_Freq = CLK8; /* 8 MHz */
|
|
|
|
MachineClocks.CPU_Freq = CLK8; /* 8 MHz */
|
|
MachineClocks.DMA_Freq = CLK8; /* 8 MHz */
|
|
MachineClocks.MFP_Freq = CLK4; /* 4 MHz */
|
|
MachineClocks.MFP_Timer_Freq = ATARI_MFP_XTAL; /* 2.4576 MHz (XTAL)*/
|
|
MachineClocks.FDC_Freq = CLK8; /* 8 MHz */
|
|
MachineClocks.BLITTER_Freq = CLK8; /* 8 MHz */
|
|
MachineClocks.YM_Freq = CLK2; /* 2 MHz */;
|
|
MachineClocks.ACIA_Freq = CLK500; /* 500 kHz */
|
|
MachineClocks.IKBD_Freq = ATARI_IKBD_CLK; /* 1 MHz */
|
|
}
|
|
|
|
else if ( MachineType == MACHINE_STE )
|
|
{
|
|
int SCLK, CLK16, CLK8, CLK4, CLK2, KHZ500;
|
|
//int FCLK; /* not used (audio filters) */
|
|
|
|
MachineClocks.MCLK_Freq = ATARI_STE_PAL_MCLK; /* 32.084988 MHz */
|
|
SCLK = ATARI_STE_EXT_OSC; /* 8.010613 MHz (SCLK) */
|
|
CLK2 = SCLK / 4;
|
|
|
|
MachineClocks.SHIFTER_Freq = MachineClocks.MCLK_Freq; /* 32 MHz */
|
|
CLK16 = MachineClocks.SHIFTER_Freq / 2;
|
|
//FCLK = SCLK;
|
|
|
|
MachineClocks.MCU_Freq = CLK16; /* 16 MHz */
|
|
CLK8 = MachineClocks.MCU_Freq / 2;
|
|
CLK4 = MachineClocks.MCU_Freq / 4;
|
|
KHZ500 = MachineClocks.MCU_Freq / 32;
|
|
|
|
MachineClocks.BUS_Freq = CLK8; /* 8 MHz (CLK8) */
|
|
|
|
MachineClocks.CPU_Freq = CLK8; /* 8 MHz (CLK8) */
|
|
MachineClocks.DMA_Freq = CLK8; /* 8 MHz (CLK8) */
|
|
MachineClocks.DMA_Audio_Freq = SCLK; /* 8 MHz (SCLK) */
|
|
MachineClocks.MFP_Freq = CLK4; /* 4 MHz (CLK4) */
|
|
MachineClocks.MFP_Timer_Freq = ATARI_MFP_XTAL; /* 2.4576 MHz (XTAL)*/
|
|
MachineClocks.FDC_Freq = SCLK; /* 8 MHz (SCLK) */
|
|
MachineClocks.BLITTER_Freq = CLK8; /* 8 MHz (CLK8) */
|
|
MachineClocks.YM_Freq = CLK2; /* 2 MHz (CLK2) */
|
|
MachineClocks.ACIA_Freq = KHZ500; /* 500 kHz (KHZ500) */
|
|
MachineClocks.IKBD_Freq = ATARI_IKBD_CLK; /* 1 MHz */
|
|
}
|
|
|
|
else if ( MachineType == MACHINE_MEGA_STE )
|
|
{
|
|
int SCLK, CLK16, CLK8, CLK4, CLK2, KHZ500;
|
|
//int FCLK; /* not used (audio filters) */
|
|
|
|
MachineClocks.MCLK_Freq = ATARI_MEGA_STE_PAL_MCLK; /* 32.084988 MHz */
|
|
SCLK = ATARI_MEGA_STE_EXT_OSC / 2; /* 16.021226 MHz / 2 = 8.010613 MHz */
|
|
CLK2 = SCLK / 4;
|
|
|
|
MachineClocks.SHIFTER_Freq = MachineClocks.MCLK_Freq; /* 32 MHz */
|
|
CLK16 = MachineClocks.SHIFTER_Freq / 2;
|
|
//FCLK = SCLK;
|
|
|
|
MachineClocks.MCU_Freq = CLK16; /* 16 MHz (CLK16) */
|
|
CLK8 = MachineClocks.MCU_Freq / 2;
|
|
CLK4 = MachineClocks.MCU_Freq / 4;
|
|
KHZ500 = MachineClocks.MCU_Freq / 32;
|
|
|
|
MachineClocks.BUS_Freq = CLK8; /* 8 MHz (CLK8) */
|
|
|
|
MachineClocks.CPU_Freq = CLK16; /* 16 MHz (CLK16) */
|
|
MachineClocks.FPU_Freq = CLK16; /* 16 MHz (CLK16) */
|
|
MachineClocks.DMA_Freq = CLK8; /* 8 MHz (CLK8) */
|
|
MachineClocks.DMA_Audio_Freq = SCLK; /* 8 MHz (SCLK) */
|
|
MachineClocks.MFP_Freq = CLK4; /* 4 MHz (CLK4) */
|
|
MachineClocks.MFP_Timer_Freq = ATARI_MFP_XTAL; /* 2.4576 MHz (XTAL)*/
|
|
MachineClocks.FDC_Freq = SCLK; /* 8 MHz (SCLK) */
|
|
MachineClocks.BLITTER_Freq = CLK8; /* 8 MHz (CLK8) */
|
|
MachineClocks.YM_Freq = CLK2; /* 2 MHz (CLK2) */
|
|
MachineClocks.ACIA_Freq = KHZ500; /* 500 kHz (KHZ500) */
|
|
MachineClocks.IKBD_Freq = ATARI_IKBD_CLK; /* 1 MHz */
|
|
}
|
|
|
|
else if ( MachineType == MACHINE_TT )
|
|
{
|
|
int CLK32, CLK16, CLK8, FCCLK, CLK4, CLK2, CLKX5;
|
|
|
|
MachineClocks.MCLK_Freq = ATARI_TT_PAL_MCLK; /* 32.084988 MHz */
|
|
CLK32 = MachineClocks.MCLK_Freq;
|
|
|
|
MachineClocks.TTVIDEO_Freq = MachineClocks.MCLK_Freq; /* 32 MHz */
|
|
CLK16 = MachineClocks.TTVIDEO_Freq / 2;
|
|
CLK4 = MachineClocks.TTVIDEO_Freq / 8;
|
|
CLK2 = MachineClocks.TTVIDEO_Freq / 16;
|
|
|
|
MachineClocks.MCU_Freq = CLK16; /* 16 MHz (CLK16A) */
|
|
CLK8 = MachineClocks.MCU_Freq / 2;
|
|
FCCLK = MachineClocks.MCU_Freq / 2;
|
|
CLKX5 = MachineClocks.MCU_Freq / 32;
|
|
|
|
MachineClocks.BUS_Freq = CLK16; /* 16 MHz (CLK16) */
|
|
|
|
MachineClocks.CPU_Freq = CLK32; /* 32 MHz (CLK32) */
|
|
MachineClocks.FPU_Freq = CLK32; /* 32 MHz (CLK32) */
|
|
MachineClocks.DMA_Freq = CLK8; /* 8 MHz (CLK8) */
|
|
MachineClocks.DMA_Audio_Freq = CLK16; /* 16 MHz (CLK16) SND SHIFTER */
|
|
MachineClocks.MFP_Freq = CLK4; /* 4 MHz (CLK4) */
|
|
MachineClocks.MFP_Timer_Freq = ATARI_MFP_XTAL; /* 2.4576 MHz (XTAL)*/
|
|
MachineClocks.FDC_Freq = FCCLK; /* 8 MHz (FCCLK) */
|
|
MachineClocks.BLITTER_Freq = 0; /* No blitter in TT */
|
|
MachineClocks.YM_Freq = CLK2; /* 2 MHz (CLK2) */
|
|
MachineClocks.ACIA_Freq = CLKX5; /* 500 kHz (CLKX5) */
|
|
MachineClocks.IKBD_Freq = ATARI_IKBD_CLK; /* 1 MHz */
|
|
}
|
|
|
|
else if ( MachineType == MACHINE_FALCON )
|
|
{
|
|
/* TODO : need more docs for Falcon's clocks */
|
|
int CLK32, CLK25, CLK16, FCCLK, CLK4, CLK2, KHZ500;
|
|
|
|
MachineClocks.MCLK_Freq = ATARI_FALCON_PAL_MCLK; /* 32.084988 MHz */
|
|
CLK32 = MachineClocks.MCLK_Freq;
|
|
CLK25 = ATARI_FALCON_25M_CLK;
|
|
CLK16 = CLK32 / 2;
|
|
CLK2 = CLK32 / 16;
|
|
FCCLK = CLK16;
|
|
|
|
MachineClocks.VIDEL_Freq = CLK32; /* 32 MHz */
|
|
|
|
MachineClocks.COMBEL_Freq = CLK32; /* 16 MHz (CLK16A) */
|
|
CLK4 = MachineClocks.COMBEL_Freq / 8;
|
|
KHZ500 = MachineClocks.COMBEL_Freq / 64;
|
|
|
|
MachineClocks.BUS_Freq = CLK16; /* 16 MHz (CPUCLK16A) */
|
|
MachineClocks.CPU_Freq = CLK16; /* 16 MHz (CPUCLK16B) */
|
|
MachineClocks.FPU_Freq = CLK16; /* 16 MHz (CLK32) */
|
|
MachineClocks.DSP_Freq = CLK32; /* 32 MHz */
|
|
MachineClocks.DMA_Freq = CLK16; /* 16 MHz (CLK16) ? */
|
|
MachineClocks.CODEC_Freq = CLK25; /* 25 MHz (CLK25) */
|
|
MachineClocks.MFP_Freq = CLK4; /* 4 MHz (CLK4) */
|
|
MachineClocks.MFP_Timer_Freq = ATARI_MFP_XTAL; /* 2.4576 MHz (XTAL)*/
|
|
MachineClocks.FDC_Freq = FCCLK; /* 16 MHz (FCCLK) ? */
|
|
MachineClocks.BLITTER_Freq = CLK16; /* 16 MHz */
|
|
MachineClocks.YM_Freq = CLK2; /* 2 MHz (CLK2) */
|
|
MachineClocks.ACIA_Freq = KHZ500; /* 500 kHz (KHZ500) */
|
|
MachineClocks.IKBD_Freq = ATARI_IKBD_CLK; /* 1 MHz */
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------------------*/
|
|
/**
|
|
* Return the number of VBL per second, depending on the video settings and the cpu freq.
|
|
* This value is only known for STF/STE running at 50, 60 or 71 Hz.
|
|
* For the other machines, we return CPU_Freq / ScreenRefreshRate
|
|
*/
|
|
|
|
Uint32 ClocksTimings_GetCyclesPerVBL ( MACHINETYPE MachineType , int ScreenRefreshRate )
|
|
{
|
|
Uint32 CyclesPerVBL;
|
|
|
|
|
|
CyclesPerVBL = MachineClocks.CPU_Freq / ScreenRefreshRate; /* default value */
|
|
|
|
/* STF and STE have the same numbers of cycles per VBL */
|
|
if ( ( MachineType == MACHINE_ST ) || ( MachineType == MACHINE_STE ) )
|
|
{
|
|
if ( ScreenRefreshRate == 50 )
|
|
CyclesPerVBL = ATARI_STF_CYCLES_PER_VBL_PAL;
|
|
else if ( ScreenRefreshRate == 60 )
|
|
CyclesPerVBL = ATARI_STF_CYCLES_PER_VBL_NTSC;
|
|
else if ( ScreenRefreshRate == 71 )
|
|
CyclesPerVBL = ATARI_STF_CYCLES_PER_VBL_HI;
|
|
else
|
|
CyclesPerVBL = MachineClocks.CPU_Freq / ScreenRefreshRate; /* should not happen */
|
|
}
|
|
|
|
/* For machines where cpu freq can be changed, we don't know the number of cycles per VBL */
|
|
/* -> TODO, for now comment code to keep the default value from above */
|
|
//else if ( ( MachineType == MACHINE_MEGA_STE ) || ( MachineType == MACHINE_TT ) || ( MachineType == MACHINE_FALCON ) )
|
|
// CyclesPerVBL = MachineClocks.CPU_Freq / ScreenRefreshRate;
|
|
|
|
|
|
return CyclesPerVBL;
|
|
}
|
|
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------------------*/
|
|
/**
|
|
* Return the number of VBL per second, depending on the video settings and the cpu freq.
|
|
* Since the cpu freq is not an exact multiple of the number of cycles per VBL, the real
|
|
* value slightly differs from the usual 50/60 Hz.
|
|
* Precise values are needed in STE mode to synchronize cpu and dma sound (as they both use
|
|
* 2 different clocks).
|
|
* example for STF/STE :
|
|
* PAL STF/STE video PAL : 50.053 VBL/sec
|
|
* PAL STF/STE video NTSC : 60.037 VBL/sec
|
|
* NTSC STF/STE video PAL : 49.986 VBL/sec
|
|
* NTSC STF/STE video NTSC : 59.958 VBL/sec
|
|
*
|
|
* The returned number of VBL per sec is << 24 (=CLOCKS_TIMINGS_SHIFT_VBL) to simulate floating point using Uint32.
|
|
*/
|
|
|
|
Uint32 ClocksTimings_GetVBLPerSec ( MACHINETYPE MachineType , int ScreenRefreshRate )
|
|
{
|
|
Uint32 VBLPerSec; /* Upper 8 bits are for int part, 24 lower bits for float part */
|
|
|
|
|
|
VBLPerSec = ScreenRefreshRate << CLOCKS_TIMINGS_SHIFT_VBL; /* default rounded value */
|
|
|
|
if ( RoundVBLPerSec == false )
|
|
{
|
|
/* STF and STE have the same numbers of cycles per VBL */
|
|
if ( ( MachineType == MACHINE_ST ) || ( MachineType == MACHINE_STE ) )
|
|
VBLPerSec = ( (Sint64)MachineClocks.CPU_Freq << CLOCKS_TIMINGS_SHIFT_VBL ) / ClocksTimings_GetCyclesPerVBL ( MachineType , ScreenRefreshRate );
|
|
|
|
/* For machines where cpu freq can be changed, we don't know the number of cycles per VBL */
|
|
/* -> TODO, for now comment code to keep the default value from above */
|
|
//else if ( ( MachineType == MACHINE_MEGA_STE ) || ( MachineType == MACHINE_TT ) || ( MachineType == MACHINE_FALCON ) )
|
|
// VBLPerSec = ScreenRefreshRate << CLOCKS_TIMINGS_SHIFT_VBL;
|
|
}
|
|
|
|
|
|
return VBLPerSec;
|
|
}
|
|
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------------------*/
|
|
/**
|
|
* Return the length in microsec of a VBL (opposite function of ClocksTimings_GetVBLPerSec)
|
|
* We use precise values only in STF/STE mode, else we use 1000000 / ScreenRefreshRate.
|
|
* example for STF/STE :
|
|
* PAL STF/STE video PAL : 19979 micro sec (instead of 20000 for 50 Hz)
|
|
* PAL STF/STE video NTSC : 16656 micro sec (instead of 16667 for 60 Hz)
|
|
*/
|
|
|
|
Uint32 ClocksTimings_GetVBLDuration_micro ( MACHINETYPE MachineType , int ScreenRefreshRate )
|
|
{
|
|
Uint32 VBLDuration_micro;
|
|
|
|
|
|
VBLDuration_micro = (Uint32) (1000000.0 / ScreenRefreshRate + 0.5); /* default rounded value, round to closest integer */
|
|
|
|
if ( RoundVBLPerSec == false )
|
|
{
|
|
/* STF and STE have the same numbers of cycles per VBL */
|
|
if ( ( MachineType == MACHINE_ST ) || ( MachineType == MACHINE_STE ) )
|
|
VBLDuration_micro = (Uint32) (1000000.0 * ClocksTimings_GetCyclesPerVBL ( MachineType , ScreenRefreshRate ) / MachineClocks.CPU_Freq + 0.5);
|
|
|
|
/* For machines where cpu freq can be changed, we don't know the number of cycles per VBL */
|
|
/* -> TODO, for now comment code to keep the default value from above */
|
|
//else if ( ( MachineType == MACHINE_MEGA_STE ) || ( MachineType == MACHINE_TT ) || ( MachineType == MACHINE_FALCON ) )
|
|
// VBLDuration_micro = (Uint32) (1000000.0 / ScreenRefreshRate + 0.5);
|
|
}
|
|
|
|
|
|
return VBLDuration_micro;
|
|
}
|
|
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------------------*/
|
|
/**
|
|
* Return the number of samples needed to emulate the sound that was produced during one VBL.
|
|
* This depends on the chosen audio output frequency, as well as the VBL's duration,
|
|
*
|
|
* We use precise values only in STF/STE mode, else we use AudioFreq/ScreenRefreshRate.
|
|
*
|
|
* The returned number of samples per VBL is << 28 to simulate maximum precision using
|
|
* 64 bits integers (lower 28 bits are for the floating point part).
|
|
* example for STF/STE with emulation's audio freq = 44100 :
|
|
* PAL STF/STE video PAL : 881.07 samples per VBL (instead of 882 for 50 Hz)
|
|
* 44053.56 samples for 50 VBLs (instead of 44100 for 1 sec at 50 Hz)
|
|
*/
|
|
|
|
Sint64 ClocksTimings_GetSamplesPerVBL ( MACHINETYPE MachineType , int ScreenRefreshRate , int AudioFreq )
|
|
{
|
|
Sint64 SamplesPerVBL;
|
|
|
|
|
|
SamplesPerVBL = ( ((Sint64)AudioFreq) << 28 ) / ScreenRefreshRate; /* default value */
|
|
|
|
if ( RoundVBLPerSec == false )
|
|
{
|
|
/* STF and STE have the same numbers of cycles per VBL */
|
|
if ( ( MachineType == MACHINE_ST ) || ( MachineType == MACHINE_STE ) )
|
|
SamplesPerVBL = ( ((Sint64)AudioFreq * ClocksTimings_GetCyclesPerVBL ( MachineType , ScreenRefreshRate ) ) << 28 ) / MachineClocks.CPU_Freq;
|
|
|
|
/* For machines where cpu freq can be changed, we don't know the number of cycles per VBL */
|
|
/* -> TODO, for now comment code to keep the default value from above */
|
|
//else if ( ( MachineType == MACHINE_MEGA_STE ) || ( MachineType == MACHINE_TT ) || ( MachineType == MACHINE_FALCON ) )
|
|
// SamplesPerVBL = ( ((Sint64)AudioFreq) << 28 ) / ScreenRefreshRate;
|
|
}
|
|
|
|
|
|
return SamplesPerVBL;
|
|
}
|
|
|
|
|