- Added read/write handlers for the "natural" hook-ups of an AY-8910 chip

- Modified a couple of drivers to use the new handlers
- Added crystals for NYNY and Red Alert
This commit is contained in:
Zsolt Vasvari 2008-01-22 01:19:59 +00:00
parent b6a82f1762
commit 1a17348787
5 changed files with 160 additions and 24 deletions

View File

@ -61,10 +61,12 @@ enum
XTAL_10_595MHz = 10595000, /* Mad Alien */
XTAL_11MHz = 11000000, /* Mario I8039 sound */
XTAL_11_0592MHz = 11059200, /* Lethal Justice */
XTAL_11_2MHz = 11200000, /* New York, New York */
XTAL_11_289MHz = 11289000, /* Vanguard */
XTAL_12MHz = 12000000,
XTAL_12_096MHz = 12096000, /* Some early 80's Atari games */
XTAL_12_288MHz = 12288000, /* Sega Model 3 digital audio board */
XTAL_12_5MHz = 12500000, /* Red Alert audio board */
XTAL_13_3MHz = 13300000, /* BMC bowling */
XTAL_13_33056MHz = 13330560, /* Taito L */
XTAL_13_4MHz = 13400000, /* TNK3, Ikari Warriors h/w */

View File

@ -240,6 +240,54 @@ static void _AYWriteReg(struct AY8910 *PSG, int r, int v)
/* AY8910 interface */
static UINT8 ay8910_r(int which, offs_t offset)
{
UINT8 ret;
struct AY8910 *PSG = sndti_token(SOUND_AY8910, which);
if (offset & 0x01)
ret = ay8910_read_ym(PSG);
else
/* return whatever the chip returns for a write
when BC1 = 0 and BDIR = 0 */
ret = 0x00;
return ret;
}
READ8_HANDLER( AY8910_0_r ) { return ay8910_r(0, offset); }
READ8_HANDLER( AY8910_1_r ) { return ay8910_r(1, offset); }
READ8_HANDLER( AY8910_2_r ) { return ay8910_r(2, offset); }
READ8_HANDLER( AY8910_3_r ) { return ay8910_r(3, offset); }
READ8_HANDLER( AY8910_4_r ) { return ay8910_r(4, offset); }
READ16_HANDLER( AY8910_0_lsb_r ) { return ay8910_r(0, offset); }
READ16_HANDLER( AY8910_1_lsb_r ) { return ay8910_r(1, offset); }
READ16_HANDLER( AY8910_2_lsb_r ) { return ay8910_r(2, offset); }
READ16_HANDLER( AY8910_3_lsb_r ) { return ay8910_r(3, offset); }
READ16_HANDLER( AY8910_4_lsb_r ) { return ay8910_r(4, offset); }
READ16_HANDLER( AY8910_0_msb_r ) { return ay8910_r(0, offset) << 8; }
READ16_HANDLER( AY8910_1_msb_r ) { return ay8910_r(1, offset) << 8; }
READ16_HANDLER( AY8910_2_msb_r ) { return ay8910_r(2, offset) << 8; }
READ16_HANDLER( AY8910_3_msb_r ) { return ay8910_r(3, offset) << 8; }
READ16_HANDLER( AY8910_4_msb_r ) { return ay8910_r(4, offset) << 8; }
READ8_HANDLER( AY8910_0_inv_a0_r ) { return ay8910_r(0, offset ^ 1); }
READ8_HANDLER( AY8910_1_inv_a0_r ) { return ay8910_r(1, offset ^ 1); }
READ8_HANDLER( AY8910_2_inv_a0_r ) { return ay8910_r(2, offset ^ 1); }
READ8_HANDLER( AY8910_3_inv_a0_r ) { return ay8910_r(3, offset ^ 1); }
READ8_HANDLER( AY8910_4_inv_a0_r ) { return ay8910_r(4, offset ^ 1); }
READ16_HANDLER( AY8910_0_lsb_inv_a0_r ) { return ay8910_r(0, offset ^ 1); }
READ16_HANDLER( AY8910_1_lsb_inv_a0_r ) { return ay8910_r(1, offset ^ 1); }
READ16_HANDLER( AY8910_2_lsb_inv_a0_r ) { return ay8910_r(2, offset ^ 1); }
READ16_HANDLER( AY8910_3_lsb_inv_a0_r ) { return ay8910_r(3, offset ^ 1); }
READ16_HANDLER( AY8910_4_lsb_inv_a0_r ) { return ay8910_r(4, offset ^ 1); }
READ16_HANDLER( AY8910_0_msb_inv_a0_r ) { return ay8910_r(0, offset ^ 1) << 8; }
READ16_HANDLER( AY8910_1_msb_inv_a0_r ) { return ay8910_r(1, offset ^ 1) << 8; }
READ16_HANDLER( AY8910_2_msb_inv_a0_r ) { return ay8910_r(2, offset ^ 1) << 8; }
READ16_HANDLER( AY8910_3_msb_inv_a0_r ) { return ay8910_r(3, offset ^ 1) << 8; }
READ16_HANDLER( AY8910_4_msb_inv_a0_r ) { return ay8910_r(4, offset ^ 1) << 8; }
READ8_HANDLER( AY8910_read_port_0_r ) { return ay8910_read_ym(sndti_token(SOUND_AY8910, 0)); }
READ8_HANDLER( AY8910_read_port_1_r ) { return ay8910_read_ym(sndti_token(SOUND_AY8910, 1)); }
READ8_HANDLER( AY8910_read_port_2_r ) { return ay8910_read_ym(sndti_token(SOUND_AY8910, 2)); }
@ -256,6 +304,38 @@ READ16_HANDLER( AY8910_read_port_2_msb_r ) { return ay8910_read_ym(sndti_token(S
READ16_HANDLER( AY8910_read_port_3_msb_r ) { return ay8910_read_ym(sndti_token(SOUND_AY8910, 3)) << 8; }
READ16_HANDLER( AY8910_read_port_4_msb_r ) { return ay8910_read_ym(sndti_token(SOUND_AY8910, 4)) << 8; }
WRITE8_HANDLER( AY8910_0_w ) { ay8910_write_ym(sndti_token(SOUND_AY8910, 0), offset & 1, data); }
WRITE8_HANDLER( AY8910_1_w ) { ay8910_write_ym(sndti_token(SOUND_AY8910, 1), offset & 1, data); }
WRITE8_HANDLER( AY8910_2_w ) { ay8910_write_ym(sndti_token(SOUND_AY8910, 2), offset & 1, data); }
WRITE8_HANDLER( AY8910_3_w ) { ay8910_write_ym(sndti_token(SOUND_AY8910, 3), offset & 1, data); }
WRITE8_HANDLER( AY8910_4_w ) { ay8910_write_ym(sndti_token(SOUND_AY8910, 4), offset & 1, data); }
WRITE16_HANDLER( AY8910_0_lsb_w ) { if (ACCESSING_LSB) ay8910_write_ym(sndti_token(SOUND_AY8910, 0), offset & 1, data & 0xff); }
WRITE16_HANDLER( AY8910_1_lsb_w ) { if (ACCESSING_LSB) ay8910_write_ym(sndti_token(SOUND_AY8910, 1), offset & 1, data & 0xff); }
WRITE16_HANDLER( AY8910_2_lsb_w ) { if (ACCESSING_LSB) ay8910_write_ym(sndti_token(SOUND_AY8910, 2), offset & 1, data & 0xff); }
WRITE16_HANDLER( AY8910_3_lsb_w ) { if (ACCESSING_LSB) ay8910_write_ym(sndti_token(SOUND_AY8910, 3), offset & 1, data & 0xff); }
WRITE16_HANDLER( AY8910_4_lsb_w ) { if (ACCESSING_LSB) ay8910_write_ym(sndti_token(SOUND_AY8910, 4), offset & 1, data & 0xff); }
WRITE16_HANDLER( AY8910_0_msb_w ) { if (ACCESSING_MSB) ay8910_write_ym(sndti_token(SOUND_AY8910, 0), offset & 1, data >> 8); }
WRITE16_HANDLER( AY8910_1_msb_w ) { if (ACCESSING_MSB) ay8910_write_ym(sndti_token(SOUND_AY8910, 0), offset & 1, data >> 8); }
WRITE16_HANDLER( AY8910_2_msb_w ) { if (ACCESSING_MSB) ay8910_write_ym(sndti_token(SOUND_AY8910, 0), offset & 1, data >> 8); }
WRITE16_HANDLER( AY8910_3_msb_w ) { if (ACCESSING_MSB) ay8910_write_ym(sndti_token(SOUND_AY8910, 0), offset & 1, data >> 8); }
WRITE16_HANDLER( AY8910_4_msb_w ) { if (ACCESSING_MSB) ay8910_write_ym(sndti_token(SOUND_AY8910, 0), offset & 1, data >> 8); }
WRITE8_HANDLER( AY8910_0_inv_a0_w ) { ay8910_write_ym(sndti_token(SOUND_AY8910, 0), (offset & 1) ^ 1, data); }
WRITE8_HANDLER( AY8910_1_inv_a0_w ) { ay8910_write_ym(sndti_token(SOUND_AY8910, 1), (offset & 1) ^ 1, data); }
WRITE8_HANDLER( AY8910_2_inv_a0_w ) { ay8910_write_ym(sndti_token(SOUND_AY8910, 2), (offset & 1) ^ 1, data); }
WRITE8_HANDLER( AY8910_3_inv_a0_w ) { ay8910_write_ym(sndti_token(SOUND_AY8910, 3), (offset & 1) ^ 1, data); }
WRITE8_HANDLER( AY8910_4_inv_a0_w ) { ay8910_write_ym(sndti_token(SOUND_AY8910, 4), (offset & 1) ^ 1, data); }
WRITE16_HANDLER( AY8910_0_lsb_inv_a0_w ) { if (ACCESSING_LSB) ay8910_write_ym(sndti_token(SOUND_AY8910, 0), (offset & 1) ^ 1, data & 0xff); }
WRITE16_HANDLER( AY8910_1_lsb_inv_a0_w ) { if (ACCESSING_LSB) ay8910_write_ym(sndti_token(SOUND_AY8910, 1), (offset & 1) ^ 1, data & 0xff); }
WRITE16_HANDLER( AY8910_2_lsb_inv_a0_w ) { if (ACCESSING_LSB) ay8910_write_ym(sndti_token(SOUND_AY8910, 2), (offset & 1) ^ 1, data & 0xff); }
WRITE16_HANDLER( AY8910_3_lsb_inv_a0_w ) { if (ACCESSING_LSB) ay8910_write_ym(sndti_token(SOUND_AY8910, 3), (offset & 1) ^ 1, data & 0xff); }
WRITE16_HANDLER( AY8910_4_lsb_inv_a0_w ) { if (ACCESSING_LSB) ay8910_write_ym(sndti_token(SOUND_AY8910, 4), (offset & 1) ^ 1, data & 0xff); }
WRITE16_HANDLER( AY8910_0_msb_inv_a0_w ) { if (ACCESSING_MSB) ay8910_write_ym(sndti_token(SOUND_AY8910, 0), (offset & 1) ^ 1, data >> 8); }
WRITE16_HANDLER( AY8910_1_msb_inv_a0_w ) { if (ACCESSING_MSB) ay8910_write_ym(sndti_token(SOUND_AY8910, 0), (offset & 1) ^ 1, data >> 8); }
WRITE16_HANDLER( AY8910_2_msb_inv_a0_w ) { if (ACCESSING_MSB) ay8910_write_ym(sndti_token(SOUND_AY8910, 0), (offset & 1) ^ 1, data >> 8); }
WRITE16_HANDLER( AY8910_3_msb_inv_a0_w ) { if (ACCESSING_MSB) ay8910_write_ym(sndti_token(SOUND_AY8910, 0), (offset & 1) ^ 1, data >> 8); }
WRITE16_HANDLER( AY8910_4_msb_inv_a0_w ) { if (ACCESSING_MSB) ay8910_write_ym(sndti_token(SOUND_AY8910, 0), (offset & 1) ^ 1, data >> 8); }
WRITE8_HANDLER( AY8910_control_port_0_w ) { ay8910_write_ym(sndti_token(SOUND_AY8910, 0),0,data); }
WRITE8_HANDLER( AY8910_control_port_1_w ) { ay8910_write_ym(sndti_token(SOUND_AY8910, 1),0,data); }
WRITE8_HANDLER( AY8910_control_port_2_w ) { ay8910_write_ym(sndti_token(SOUND_AY8910, 2),0,data); }

View File

@ -27,6 +27,38 @@ struct AY8910interface
void AY8910_set_volume(int chip,int channel,int volume);
READ8_HANDLER( AY8910_0_r );
READ8_HANDLER( AY8910_1_r );
READ8_HANDLER( AY8910_2_r );
READ8_HANDLER( AY8910_3_r );
READ8_HANDLER( AY8910_4_r );
READ16_HANDLER( AY8910_0_lsb_r );
READ16_HANDLER( AY8910_1_lsb_r );
READ16_HANDLER( AY8910_2_lsb_r );
READ16_HANDLER( AY8910_3_lsb_r );
READ16_HANDLER( AY8910_4_lsb_r );
READ16_HANDLER( AY8910_0_msb_r );
READ16_HANDLER( AY8910_1_msb_r );
READ16_HANDLER( AY8910_2_msb_r );
READ16_HANDLER( AY8910_3_msb_r );
READ16_HANDLER( AY8910_4_msb_r );
READ8_HANDLER( AY8910_0_inv_a0_r );
READ8_HANDLER( AY8910_1_inv_a0_r );
READ8_HANDLER( AY8910_2_inv_a0_r );
READ8_HANDLER( AY8910_3_inv_a0_r );
READ8_HANDLER( AY8910_4_inv_a0_r );
READ16_HANDLER( AY8910_0_lsb_inv_a0_r );
READ16_HANDLER( AY8910_1_lsb_inv_a0_r );
READ16_HANDLER( AY8910_2_lsb_inv_a0_r );
READ16_HANDLER( AY8910_3_lsb_inv_a0_r );
READ16_HANDLER( AY8910_4_lsb_inv_a0_r );
READ16_HANDLER( AY8910_0_msb_inv_a0_r );
READ16_HANDLER( AY8910_1_msb_inv_a0_r );
READ16_HANDLER( AY8910_2_msb_inv_a0_r );
READ16_HANDLER( AY8910_3_msb_inv_a0_r );
READ16_HANDLER( AY8910_4_msb_inv_a0_r );
READ8_HANDLER( AY8910_read_port_0_r );
READ8_HANDLER( AY8910_read_port_1_r );
READ8_HANDLER( AY8910_read_port_2_r );
@ -43,6 +75,38 @@ READ16_HANDLER( AY8910_read_port_2_msb_r );
READ16_HANDLER( AY8910_read_port_3_msb_r );
READ16_HANDLER( AY8910_read_port_4_msb_r );
WRITE8_HANDLER( AY8910_0_w );
WRITE8_HANDLER( AY8910_1_w );
WRITE8_HANDLER( AY8910_2_w );
WRITE8_HANDLER( AY8910_3_w );
WRITE8_HANDLER( AY8910_4_w );
WRITE16_HANDLER( AY8910_0_lsb_w );
WRITE16_HANDLER( AY8910_1_lsb_w );
WRITE16_HANDLER( AY8910_2_lsb_w );
WRITE16_HANDLER( AY8910_3_lsb_w );
WRITE16_HANDLER( AY8910_4_lsb_w );
WRITE16_HANDLER( AY8910_0_msb_w );
WRITE16_HANDLER( AY8910_1_msb_w );
WRITE16_HANDLER( AY8910_2_msb_w );
WRITE16_HANDLER( AY8910_3_msb_w );
WRITE16_HANDLER( AY8910_4_msb_w );
WRITE8_HANDLER( AY8910_0_inv_a0_w );
WRITE8_HANDLER( AY8910_1_inv_a0_w );
WRITE8_HANDLER( AY8910_2_inv_a0_w );
WRITE8_HANDLER( AY8910_3_inv_a0_w );
WRITE8_HANDLER( AY8910_4_inv_a0_w );
WRITE16_HANDLER( AY8910_0_lsb_inv_a0_w );
WRITE16_HANDLER( AY8910_1_lsb_inv_a0_w );
WRITE16_HANDLER( AY8910_2_lsb_inv_a0_w );
WRITE16_HANDLER( AY8910_3_lsb_inv_a0_w );
WRITE16_HANDLER( AY8910_4_lsb_inv_a0_w );
WRITE16_HANDLER( AY8910_0_msb_inv_a0_w );
WRITE16_HANDLER( AY8910_1_msb_inv_a0_w );
WRITE16_HANDLER( AY8910_2_msb_inv_a0_w );
WRITE16_HANDLER( AY8910_3_msb_inv_a0_w );
WRITE16_HANDLER( AY8910_4_msb_inv_a0_w );
WRITE8_HANDLER( AY8910_control_port_0_w );
WRITE8_HANDLER( AY8910_control_port_1_w );
WRITE8_HANDLER( AY8910_control_port_2_w );
@ -75,6 +139,7 @@ WRITE16_HANDLER( AY8910_write_port_2_msb_w );
WRITE16_HANDLER( AY8910_write_port_3_msb_w );
WRITE16_HANDLER( AY8910_write_port_4_msb_w );
/*********** An interface for SSG of YM2203 ***********/
void *ay8910_start_ym(sound_type chip_type, int sndindex, int clock, int streams,

View File

@ -73,12 +73,12 @@
#define MAIN_CPU_MASTER_CLOCK (11200000)
#define MAIN_CPU_MASTER_CLOCK (XTAL_11_2MHz)
#define PIXEL_CLOCK (MAIN_CPU_MASTER_CLOCK / 2)
#define CRTC_CLOCK (MAIN_CPU_MASTER_CLOCK / 16)
#define AUDIO_1_MASTER_CLOCK (4000000)
#define AUDIO_1_MASTER_CLOCK (XTAL_4MHz)
#define AUDIO_CPU_1_CLOCK (AUDIO_1_MASTER_CLOCK)
#define AUDIO_2_MASTER_CLOCK (4000000)
#define AUDIO_2_MASTER_CLOCK (XTAL_4MHz)
#define AUDIO_CPU_2_CLOCK (AUDIO_2_MASTER_CLOCK)
@ -537,10 +537,8 @@ static ADDRESS_MAP_START( nyny_audio_1_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0080, 0x0fff) AM_NOP
AM_RANGE(0x1000, 0x1000) AM_MIRROR(0x0fff) AM_READWRITE(soundlatch_r, audio_1_answer_w)
AM_RANGE(0x2000, 0x2000) AM_MIRROR(0x0fff) AM_READ(input_port_4_r)
AM_RANGE(0x3000, 0x3000) AM_MIRROR(0x0ffc) AM_READWRITE(AY8910_read_port_0_r, AY8910_write_port_0_w)
AM_RANGE(0x3001, 0x3001) AM_MIRROR(0x0ffc) AM_WRITE(AY8910_control_port_0_w)
AM_RANGE(0x3002, 0x3002) AM_MIRROR(0x0ffc) AM_READWRITE(AY8910_read_port_1_r, AY8910_write_port_1_w)
AM_RANGE(0x3003, 0x3003) AM_MIRROR(0x0ffc) AM_WRITE(AY8910_control_port_1_w)
AM_RANGE(0x3000, 0x3001) AM_MIRROR(0x0ffc) AM_READWRITE(AY8910_0_inv_a0_r, AY8910_0_inv_a0_w)
AM_RANGE(0x3002, 0x3003) AM_MIRROR(0x0ffc) AM_READWRITE(AY8910_1_inv_a0_r, AY8910_1_inv_a0_w)
AM_RANGE(0x4000, 0x4fff) AM_NOP
AM_RANGE(0x5000, 0x57ff) AM_MIRROR(0x0800) AM_ROM
AM_RANGE(0x6000, 0x67ff) AM_MIRROR(0x0800) AM_ROM
@ -553,8 +551,7 @@ static ADDRESS_MAP_START( nyny_audio_2_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x007f) AM_RAM /* internal RAM */
AM_RANGE(0x0080, 0x0fff) AM_NOP
AM_RANGE(0x1000, 0x1000) AM_MIRROR(0x0fff) AM_READ(soundlatch2_r)
AM_RANGE(0x2000, 0x2000) AM_MIRROR(0x0ffe) AM_READWRITE(AY8910_read_port_2_r, AY8910_write_port_2_w)
AM_RANGE(0x2001, 0x2001) AM_MIRROR(0x0ffe) AM_WRITE(AY8910_control_port_2_w)
AM_RANGE(0x2000, 0x2001) AM_MIRROR(0x0ffe) AM_READWRITE(AY8910_2_inv_a0_r, AY8910_2_inv_a0_w)
AM_RANGE(0x3000, 0x6fff) AM_NOP
AM_RANGE(0x7000, 0x77ff) AM_MIRROR(0x0800) AM_ROM
ADDRESS_MAP_END

View File

@ -199,23 +199,15 @@ static ADDRESS_MAP_START( thief_writemem, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0xe0c0, 0xe0c0) AM_WRITE(thief_context_bank_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( readport, ADDRESS_SPACE_IO, 8 )
ADDRESS_MAP_FLAGS( AMEF_ABITS(8) )
AM_RANGE(0x31, 0x31) AM_READ(thief_io_r) // 8255
AM_RANGE(0x41, 0x41) AM_READ(AY8910_read_port_0_r)
AM_RANGE(0x43, 0x43) AM_READ(AY8910_read_port_1_r)
ADDRESS_MAP_END
static ADDRESS_MAP_START( writeport, ADDRESS_SPACE_IO, 8 )
static ADDRESS_MAP_START( io_map, ADDRESS_SPACE_IO, 8 )
ADDRESS_MAP_FLAGS( AMEF_ABITS(8) )
AM_RANGE(0x00, 0x00) AM_WRITE(MWA8_NOP) /* watchdog */
AM_RANGE(0x10, 0x10) AM_WRITE(thief_video_control_w)
AM_RANGE(0x30, 0x30) AM_WRITE(thief_input_select_w) // 8255
AM_RANGE(0x31, 0x31) AM_READ(thief_io_r) // 8255
AM_RANGE(0x33, 0x33) AM_WRITE(tape_control_w)
AM_RANGE(0x40, 0x40) AM_WRITE(AY8910_control_port_0_w)
AM_RANGE(0x41, 0x41) AM_WRITE(AY8910_write_port_0_w)
AM_RANGE(0x42, 0x42) AM_WRITE(AY8910_control_port_1_w)
AM_RANGE(0x43, 0x43) AM_WRITE(AY8910_write_port_1_w)
AM_RANGE(0x40, 0x41) AM_READWRITE(AY8910_0_r, AY8910_0_w)
AM_RANGE(0x42, 0x43) AM_READWRITE(AY8910_1_r, AY8910_1_w)
AM_RANGE(0x50, 0x50) AM_WRITE(thief_color_plane_w)
AM_RANGE(0x60, 0x6f) AM_WRITE(thief_vtcsel_w)
AM_RANGE(0x70, 0x7f) AM_WRITE(thief_color_map_w)
@ -470,7 +462,7 @@ static MACHINE_DRIVER_START( sharkatt )
/* basic machine hardware */
MDRV_CPU_ADD(Z80, 4000000) /* 4 MHz? */
MDRV_CPU_PROGRAM_MAP(sharkatt_readmem,sharkatt_writemem)
MDRV_CPU_IO_MAP(readport,writeport)
MDRV_CPU_IO_MAP(io_map,0)
MDRV_CPU_VBLANK_INT(thief_interrupt,1)
MDRV_SCREEN_REFRESH_RATE(60)
@ -506,7 +498,7 @@ static MACHINE_DRIVER_START( thief )
/* basic machine hardware */
MDRV_CPU_ADD(Z80, 4000000) /* 4 MHz? */
MDRV_CPU_PROGRAM_MAP(thief_readmem,thief_writemem)
MDRV_CPU_IO_MAP(readport,writeport)
MDRV_CPU_IO_MAP(io_map,0)
MDRV_CPU_VBLANK_INT(thief_interrupt,1)
MDRV_SCREEN_REFRESH_RATE(60)
@ -542,7 +534,7 @@ static MACHINE_DRIVER_START( natodef )
/* basic machine hardware */
MDRV_CPU_ADD(Z80, 4000000) /* 4 MHz? */
MDRV_CPU_PROGRAM_MAP(thief_readmem,thief_writemem)
MDRV_CPU_IO_MAP(readport,writeport)
MDRV_CPU_IO_MAP(io_map,0)
MDRV_CPU_VBLANK_INT(thief_interrupt,1)
MDRV_SCREEN_REFRESH_RATE(60)