?? ppu_control.c
字號:
/******************************************************************************
*
* 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 + -