⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ppu_control.c

📁 SPG290 上SD卡读取写入程序源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************
 *
 *     The information contained herein is the exclusive property of
 *   Sunplus Technology Co. And shall not be distributed, reproduced,
 *   or disclosed in whole in part without prior written permission.
 *
 *         (C) COPYRIGHT 2005   SUNPLUS TECHNOLOGY CO.
 *                        ALL RIGHTS RESERVED
 *
 * The entire notice above must be reproduced on all authorized copies.
 *
 *****************************************************************************/

/******************************************************************************
 *  Filename:   	PPU_Control.c
 *  Author:     	Robin.xjliu  (eMail: xjliu@sunplus.com)
 *  Tel:        	00885-028-87848688-5884
 *  Date:       	2005-11-16
 *  Description:	other register about PPU control lib
 *  Reference:
 *  Version history:
 *-----------------------------------------------------------------------------
 *	Version   YYYY-MM-DD-INDEX   Modified By         Description
 *	1.0.0     2005-11-16          xjliu               Create
 *	1.0.1	  2006-02-07		  xjliu				  Modify
 *
 *****************************************************************************/
#include "Include/PPU_Control.h"
#include "Include/Tve_Control.h"
#include "Include/GPIO_Joystick.h"

U32	old_game_time, game_time;

//PPU_Effect
U16 nHMovementCnt = 0;

//PPU_Sprite
bool			g_bShowSpriteFlag;
U16				g_nUsed_Cell_Count;
SPRITE			SPRITE_TABLE[SPRITE_NUM_MAX];				//Sprite control table
LISTHEAD		SPRITE_FREE_LIST;							//Free sprite list
LISTHEAD		SPRITE_PRI_LIST[SPRITE_PRI_MAX/2];			//Sprite Priority List

//PPU_Palette
bool	g_bInitPaletteFlag;

//PPU_Texture
S16			g_aTextPos_X[3];
S16			g_aTextPos_Y[3];
bool		g_bTextScrollFlag;
ANITEXTHEAD	*pAniTextHead;
ANI_TEXT	*pAniText[3];

const S32 CellSize[]={
	8, 16, 32, 64,
}; 

extern const U32 Sp_Palette[];
extern const U32 Sp_BackupPalette[];
extern bool	g_bScoreColor;
extern bool	g_bCompleteColor;
extern bool	g_bMenuColor;
extern bool g_bHMovementFlag;

/**
 * InitPPU - initialize PPU control register
 */
void InitPPU(void)
{
	//set ppu mode
// 	*P_TV_CONTROL 	= TVEN | TVRGB2YUV | (TVLPF1 & (~TVVGA));	// CIF Mode	
//	*P_PPU_CONTROL 	= PPUEN & (~PPU_VGA);						// CIF
//	*P_TV_CONTROL 	|= TVVGA;			// VGA Mode
//	*P_PPU_CONTROL	|= PPU_VGA;			// VGA

	//set PPU and TV control
	*P_TV_CONTROL = TVEN | TVRGB2YUV | TVLPF1;
	*P_PPU_CONTROL = PPUEN;
	
	//Initialize Palette
	g_bInitPaletteFlag = true;

    //Initialize Text
    //if( pAniTextHead->textnum != 0 )
    {
    	PPU_InitTexture();
    }

	//Initialize Sprite
	PPU_InitSprite();
}

/**
 * PPU_Service - access PPU's register in every intermit.
 * **Note**	on IRQ53 write Sprite register, palette, Text move
 */
void PPU_Service(void)
{
	game_time++;
	
	//write sprite register
	if(g_bShowSpriteFlag)
	{
		PPU_PaintSprite();
	}

	//scroll texture
	/*if(g_bTextScrollFlag)
	{
		g_bTextScrollFlag = false;
		PPU_ScrollScreen(&g_aPNTPtrFlag);
	}*/
	
	//initialize palette
	if(g_bInitPaletteFlag)
	{
	    PPU_BG_InitPalette( (U32 *)BG_PAL_ADDR );
//		PPU_SP_InitPalette( (U32 *)(&Sp_Palette) );
		g_bInitPaletteFlag = false;
	}
	
	//PPU_TxHCompress(0, 0, 512, 0x80, NULL);
}

/**
 * WaitBlanking - Wait Vertical blanking.
 */
void WaitBlanking(void)
{
	while(old_game_time == game_time);		//	Game_time ++ In IRQ.asm
	old_game_time = game_time;
}



//PPU_Texture
/**
 * ClearTextRegister - clear text1 ~ text3 register value
 */
void ClearTextRegister(void)
{
	U8	i;
	for( i = 0 ; i < 7 ; i++ )
	{
		*(P_PPU_TX1_X + i ) = 0;
		*(P_PPU_TX2_X + i ) = 0;
		*(P_PPU_TX3_X + i ) = 0;				
	}			
}

/**
 * PPU_InitStructure - Initialize File Structure.
 */
void PPU_InitStructure(void)
{
    pAniTextHead	= (ANITEXTHEAD*)TEXT_HEADER_ADDR;
    pAniText[0] 	= (ANI_TEXT*)(TEXT_HEADER_ADDR + sizeof(ANITEXTHEAD));
    pAniText[1] 	= (ANI_TEXT*)(TEXT_HEADER_ADDR + sizeof(ANITEXTHEAD) + sizeof(ANI_TEXT));
    pAniText[2] 	= (ANI_TEXT*)(TEXT_HEADER_ADDR + sizeof(ANITEXTHEAD) + sizeof(ANI_TEXT) + sizeof(ANI_TEXT));    
}

#ifdef TFTLCD_EN
//add by Robin.Lau for support Scene Director TFTLCD_Enable Setting.
void PPU_InitTFT(void)
{
	if ( NULL != (pAniTextHead->nTFT_Info & 0x0008) )
	{//TFT enable
		MIU_CTRL_REG_SET(0xa0d00000,0xa0e00000,0xa0e00000);//only for PPU to LCD
		switch((pAniTextHead->nTFT_Info & 0x0007))
		{
		case 0x0001://2.36" TFT
			switch( ((pAniText[TEXT1]->bType & 0x30) >> 4) )
			{
			case DISPLAY_QVGA:
			case DISPLAY_VGA2CIF:
				InitTFTLcd(AUO_236, S_RGBDM, QVGA_Data,NO_SCL ,NO_SCL , 0);
				break;
			case DISPLAY_VGA:
				InitTFTLcd(AUO_236, S_RGBDM, VGA_Data,VER_SCLDN ,HOR_SCLDN , 0);
				break;
			case DISPLAY_HVGA:
				InitTFTLcd(AUO_236, S_RGBDM, HVGA_Data,NO_SCL ,HOR_SCLDN , 0);
				break;
			}
			break;
		case 0x0002://2.5" TFT
			switch( ((pAniText[TEXT1]->bType & 0x30) >> 4) )
			{
			case DISPLAY_QVGA:
			case DISPLAY_VGA2CIF:
				InitTFTLcd(AUO_25, S_RGBDM, QVGA_Data,NO_SCL ,NO_SCL , 0);
				break;
			case DISPLAY_VGA:
				InitTFTLcd(AUO_25, S_RGBDM, VGA_Data,VER_SCLDN ,HOR_SCLDN , 0);
				break;
			case DISPLAY_HVGA:
				InitTFTLcd(AUO_25, S_RGBDM, HVGA_Data,NO_SCL ,HOR_SCLDN , 0);
				break;
			}
			break;
		case 0x0004://3.5" TFT
			switch( ((pAniText[TEXT1]->bType & 0x30) >> 4) )
			{
			case DISPLAY_QVGA:
			case DISPLAY_VGA2CIF:
				InitTFTLcd(AUO_36, S_RGBDM, QVGA_Data,NO_SCL ,NO_SCL , 0);
				break;
			case DISPLAY_VGA:
				InitTFTLcd(AUO_36, S_RGBDM, VGA_Data,VER_SCLDN ,HOR_SCLDN , 0);
				break;
			case DISPLAY_HVGA:
				InitTFTLcd(AUO_36, S_RGBDM, HVGA_Data,NO_SCL ,HOR_SCLDN , 0);
				break;
			}
			break;
		default:
			break;
		}
	}
}
#endif	//TFTLCD_EN

/**
 * PPU_InitTexture - Initialize Texture.
 */
bool PPU_InitTexture(void)
{
	//initial setting for driver
	PPU_InitStructure();

#ifdef TFTLCD_EN	
	//initialize TFT
	PPU_InitTFT();
#endif	//TFTLCD_EN

	//Initialize Text1
	switch( pAniText[TEXT1]->bType & 0xf )
	{
		case CHAR_MODE:
			PPU_InitCharacterText( pAniText[TEXT1], TEXT1);
			break;
		case BITMAP_MODE:
		case HICOLOR_32K:
		case HICOLOR_64K:
			PPU_InitBitmapText( pAniText[TEXT1], TEXT1 );
			break;
	}

	//Initialize Text2
	if( pAniTextHead->textnum < 2 )
		return false;
	switch( pAniText[TEXT2]->bType & 0xf )
	{
		case CHAR_MODE:
			PPU_InitCharacterText( pAniText[TEXT2], TEXT2);
			break;
		case BITMAP_MODE:
		case HICOLOR_32K:
		case HICOLOR_64K:
			PPU_InitBitmapText( pAniText[TEXT2], TEXT2 );
			break;
	}
	
	//Initialize Text3
	if( pAniTextHead->textnum < 3 )//add by xjliu for sensor
		return false;
	switch( pAniText[TEXT3]->bType & 0xf)
	{
		case CHAR_MODE:
			PPU_InitCharacterText( pAniText[TEXT3], TEXT3);
			break;
		case BITMAP_MODE:
		case HICOLOR_32K:
		case HICOLOR_64K:
			PPU_InitBitmapText( pAniText[TEXT3], TEXT3 );
			break;
	}
	return true;	
}

/**
 * PPU_InitCharacterText - Initialize Texture with character mode.
 * @ptrAniText: point to texture information
 * @nText: Select Text layer for Text1/Text2/Text3
 */
void PPU_InitCharacterText(ANI_TEXT *ptrAniText,U32 nTEXT)
{
    U32	    i,j;
	U32 	TextPixel, TextIndex;
	U16 	*port1, *port2;
    S32	    cxSize,cySize;
    S32	    TotalXSize, TotalYSize;
    S32     x, y;
	U16		nPntBufXSize,nPntBufYSize;
  	
	//add by xjliu for set resolution 2006-02-10
	switch( ((ptrAniText->bType & 0x30) >> 4) )
	{
	case DISPLAY_QVGA:
		*P_TV_CONTROL = ((*P_TV_CONTROL) & 0xFFF3);
		*P_PPU_CONTROL = ((*P_PPU_CONTROL) & 0xFFFC);
		nPntBufXSize = 512;
		nPntBufYSize = 256;
		break;
	case DISPLAY_VGA:
		*P_TV_CONTROL = ((*P_TV_CONTROL) & 0xFFF3) | TVVGA;
		*P_PPU_CONTROL = ((*P_PPU_CONTROL) & 0xFFFC) | PPU_VGA;
		nPntBufXSize = 1024;
		nPntBufYSize = 512;
		break;
	case DISPLAY_HVGA:
		*P_TV_CONTROL = ((*P_TV_CONTROL) & 0xFFF3) | TVHVGA;
		*P_PPU_CONTROL = ((*P_PPU_CONTROL) & 0xFFFC) | PPU_HVGA;
		nPntBufXSize = 1024;
		nPntBufYSize = 256;
		break;
	case DISPLAY_VGA2CIF:
		*P_TV_CONTROL = ((*P_TV_CONTROL) & 0xFFF3) | TVVGA2CIF;
		*P_PPU_CONTROL = ((*P_PPU_CONTROL) & 0xFFFC) | PPU_VGA2CIF;
		nPntBufXSize = 512;
		nPntBufYSize = 256;
		break;
	}

    if( ptrAniText->cxSize != 0x40 )
    	cxSize	= (ptrAniText->cxSize/0x10)<<4;
    else	
    	cxSize 	= 0x3<<4;

    if( ptrAniText->cySize != 0x40 )
    	cySize 	= (ptrAniText->cySize/0x10)<<6;
    else	
    	cySize 	= 0x3<<6;

	TotalXSize	= CellSize[cxSize>>4];	//Cell HSize(Pixels)
	TotalYSize 	= CellSize[cySize>>6];	//Cell VSize(Pixels)
	
	port1 		= (U16*)(TEXT1_PNT_BUFF_ADDR + 0x8000 * nTEXT);
	port2 		= (U16*)(TEXT1_PNT_ADDR + 0x8000 * nTEXT);
	TextPixel 	= TEXT1_PGT_ADDR + 0x100000 * nTEXT;
	TextIndex   = TEXT1_PNT_BUFF_ADDR + 0x8000 * nTEXT;
	
	/*for(i=0; i<ptrAniText->ySize; i++)
	{
		for(j=0; j<ptrAniText->xSize; j++)
			*(port1+j+i*1024/TotalXSize) = *(port2 + j + i*ptrAniText->xSize);					
		for(j=0; j<1024/TotalXSize-ptrAniText->xSize; j++)
			*(port1+j+i*1024/TotalXSize+ptrAniText->xSize) = 0;
	}*/
	//modify by xjliu for different display mode
	for(i=0; i<ptrAniText->ySize; i++)
	{
		for(j=0; j<ptrAniText->xSize; j++)
			*(port1+j+i*nPntBufXSize/TotalXSize) = *(port2 + j + i*ptrAniText->xSize);					
		for(j=ptrAniText->xSize; j<nPntBufXSize/TotalXSize; j++)
			*(port1+j+i*nPntBufXSize/TotalXSize) = 0;
	}
	
    x = TotalXSize*ptrAniText->xSize;		//Texture HSize (pixels)
    y = TotalYSize*ptrAniText->ySize;		//Texture VSize (pixels)		
    i = ptrAniText->layer;
	PPU_CharacterShow(
		nTEXT, 
		x, y, 
		(U32*)TextPixel, 
		(U32*)TextIndex, 
		ptrAniText->ColorBit, 
		cxSize, cySize, 
		ptrAniText->bank, 
		ptrAniText->layer);
}

//====================================================================================================
// Show Texture for Character Mode
// void CharacterShow(S32 nTextLayer, S32 nXSize, S32 nYSize, U32 *pPatAddr, U32 *pIndexAddr, S32 nColorMode, S32 nCellXSize, S32 nCellYSize, S32 nPaletteBank, S32 nDepth)
// Input parameters:	
//			S32 nTextLayer: Select Text layer for Text1/Text2/Text3
//						define TEXT1 		0x00000000
//						define TEXT2 		0x00000001
//						define TEXT3 		0x00000002
//			S32 nXSize:	Texture Size for horizontal value
//			S32 nYSize:	Texture Size for vertical value
//			U32 *pPatAdr:	The Texture data address
//			U32 *pIndexAddr:The Texture index data address
//			S32 nColorMode:	Text Color Mode
//						define TX_Color4       0x00000002
//						define TX_Color16      0x00000004
//						define TX_Color64      0x00000006
//						define TX_Color256     0x00000008
//			S32 nCellXSize:	Character Size for Horizontal value
//						define TXHSize8		0x00000000
//						define TXHSize16	0x00000010
//						define TXHSize32	0x00000020
//						define TXHSize64	0x00000030
//			S32 nCellYSize:	Character Size for Vertical value
//						define TXVSize8		0x00000000
//						define TXVSize16	0x00000040
//						define TXVSize32	0x00000080
//						define TXVSize64	0x000000C0
//			S32 nPaletteBank:	Palette Bank for 0~31
//			S32 nDepth:	Text Depth Layer 
//						define TXDepth0		0x00000000	
//						define TXDepth1		0x00002000	
//						define TXDepth2		0x00004000	
//						define TXDepth3		0x00006000	
// Returns: none
//====================================================================================================
void PPU_CharacterShow
(
 U32 nTextLayer, 
 U32 nXSize, U32 nYSize, 
 U32 *pPatAddr, 
 U32 *pIndexAddr, 
 U32 nColorMode, 
 U32 nCellXSize, U32 nCellYSize, 
 U32 nPaletteBank, 
 U32 nDepth
)
{
	U32 *index, *addr, *attr, *x, *y, *control;
	
	x 		= P_PPU_TX1_X 			+ nTextLayer * 7;
	y 		= P_PPU_TX1_Y 			+ nTextLayer * 7;	
	attr 	= P_PPU_TX1_Attribute 	+ nTextLayer * 7;
	control = P_PPU_TX1_Control 	+ nTextLayer * 7;
	index 	= P_PPU_TX1_N_PTR 		+ nTextLayer * 7;
	addr 	= P_PPU_TX1_START_ADR1 	+ nTextLayer * 3;
	
	//set Texture's x & y position
	*x	= 0;
	*y	= 0;

	//set Texture's attribute
	if(nColorMode>=TX_Color64)
		nColorMode = (nColorMode>>2) + 1;	
	else
		nColorMode = nColorMode>>2;		
	*attr = nColorMode | nCellXSize | nCellYSize | (nPaletteBank<<8) | (nDepth<<13);	

	//set Char Number Pointer start address(PNT)
	*index = (U32)pIndexAddr;

	//Setup PPU Text Buffer(0 ~ 2) Start Address(PGT)
	*addr 		= (U32)pPatAddr;
	*(addr + 1) = (U32)pPatAddr;
	*(addr + 2) = (U32)pPatAddr;

	//set Texture's control register
	*control = TXEN | TXREGMODE;//TXEN|
}

/**
 * PPU_InitBitmapText - Initialize Texture with bitmap mode.
 * @ptrAniText: point to texture information
 * @nText: Select Text layer for Text1/Text2/Text3
 */
void PPU_InitBitmapText(ANI_TEXT *ptrAniText,S32 eTEXT )
{
	U32	TextPixel, TextIndex;
	//add by xjliu for set resolution 2006-02-10
	switch( ((ptrAniText->bType & 0x30) >> 4) )
	{
	case DISPLAY_QVGA:
		*P_TV_CONTROL = ((*P_TV_CONTROL) & 0xFFF3);
		*P_PPU_CONTROL = ((*P_PPU_CONTROL) & 0xFFFC);
		break;
	case DISPLAY_VGA:
		*P_TV_CONTROL = ((*P_TV_CONTROL) & 0xFFF3) | TVVGA;
		*P_PPU_CONTROL = ((*P_PPU_CONTROL) & 0xFFFC) | PPU_VGA;
		break;
	case DISPLAY_HVGA:
		*P_TV_CONTROL = ((*P_TV_CONTROL) & 0xFFF3) | TVHVGA;
		*P_PPU_CONTROL = ((*P_PPU_CONTROL) & 0xFFFC) | PPU_HVGA;
		break;
	case DISPLAY_VGA2CIF:
		*P_TV_CONTROL = ((*P_TV_CONTROL) & 0xFFF3) | TVVGA2CIF;
		*P_PPU_CONTROL = ((*P_PPU_CONTROL) & 0xFFFC) | PPU_VGA2CIF;
		break;
	}

    if( (ptrAniText->bType&0xf) == 2)  	// high color 32768
		ptrAniText->ColorBit = TX_Color32768;
	if( (ptrAniText->bType&0xf) == 3)	// high color 65536		
	    ptrAniText->ColorBit = TX_Color65536;
	    
	TextPixel = TEXT1_PGT_ADDR + 0x100000 * eTEXT;
	TextIndex = TEXT1_PNT_ADDR + 0x8000 * eTEXT;		
	
  	PPU_BitmapShow(eTEXT, ptrAniText->xSize, ptrAniText->ySize, ptrAniText->ColorBit, (ptrAniText->bank<<8), (ptrAniText->layer<<13), (U32 *)TextPixel, (U32 *)TextIndex);
}

//====================================================================================================
// Show Texture for Bitmap Mode
// BitmapShow(S32 nTextLayer, S32 nXSize, S32 nYSize, S32 nColorMode, S32 nBank, S32 nDepthLayer, U32 *pPatAddr, U32 *pIndexAddr);
// Input parameters:	
//			S32 nTextLayer: Select Text layer for Text1/Text2/Text3
//						define TEXT1 		0x00000000
//						define TEXT2 		0x00000001
//						define TEXT3 		0x00000002
//			S32 nXSize:	Texture Size for horizontal value
//			S32 nYSize:	Texture Size for vertical value
//			S32 nColorMode:	Text Color Mode
//						define TX_Color4       0x00000002
//						define TX_Color16      0x00000004
//						define TX_Color64      0x00000006
//						define TX_Color256     0x00000008
//						define TX_Color32768   0x00000010
//						define TX_Color65536	0x00000020
//			S32 nBank:	Palette Bank for 0~31
//			S32 nDepthLayer:	Text Depth Layer 
//						define TXDepth0		0x00000000	
//						define TXDepth1		0x00002000	
//						define TXDepth2		0x00004000	
//						define TXDepth3		0x00006000	
//			U32 *pPatAdr:	The Texture data address
//			U32 *pIndexAddr:The Texture index data address
// Returns: none
//====================================================================================================
void PPU_BitmapShow
(U32 nTextLayer, 
 U32 nXSize, U32 nYSize, 
 U32 nColorMode, 
 U32 nBank, 
 U32 nDepthLayer, 
 U32 *pPatAddr, 
 U32 *pIndexAddr
)
{
	U32 i, *port;	
	U32 *index, *addr, *x, *y, *attr, *control;
	
	addr 		= P_PPU_TX1_START_ADR1 	+ nTextLayer * 3;
	index 		= P_PPU_TX1_N_PTR 		+ nTextLayer * 7;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -