📄 doublebuffering.c
字号:
int Offset_t, int Size_t){ unsigned short reg_front = memw[0x3000080]; unsigned short reg_rear; unsigned short next_front = (reg_front+1)%2048; memw[0x03800000 + reg_front*64 + 0x00]= mode; //0x4708; memw[0x03800000 + reg_front*64 + 0x02]=ScrX1; //200; //128; //32; //DstX1 memw[0x03800000 + reg_front*64 + 0x04]=ScrY1; //; //128; //32; //DstY1 memw[0x03800000 + reg_front*64 + 0x06]=ScrX2; //128*5+; //DstX2 memw[0x03800000 + reg_front*64 + 0x08]=ScrY2; //; //DstY2 memw[0x03800000 + reg_front*64 + 0x0a]= (Tx1 <<9)& 0x0ffff; //0; //256; //SrcX memw[0x03800000 + reg_front*64 + 0x0c]= (Tx1 >>7)& 0x1f;//(Tx1 >>16)& 0x1f; //SrcX memw[0x03800000 + reg_front*64 + 0x0e]= (Ty1 <<9)& 0x0ffff;//0; //256; //SrcY memw[0x03800000 + reg_front*64 + 0x10]= (Ty1 >>7)& 0x1f;//(Ty1>>16)&0x1f;//0; //SrcY memw[0x03800000 + reg_front*64 + 0x12]=A & 0x0ffff;//512; //A memw[0x03800000 + reg_front*64 + 0x14]=(A>>16)&0x1f;;//0; //A memw[0x03800000 + reg_front*64 + 0x16]=B & 0x0ffff; //B memw[0x03800000 + reg_front*64 + 0x18]=(B>>16)&0x1f;//0; //B memw[0x03800000 + reg_front*64 + 0x1a]=C & 0x0ffff; //C memw[0x03800000 + reg_front*64 + 0x1c]=(C>>16)&0x1f;//0; //C memw[0x03800000 + reg_front*64 + 0x1e]=D & 0x0ffff; //D memw[0x03800000 + reg_front*64 + 0x20]=(D>>16)&0x1f;//0; //D memw[0x03800000 + reg_front*64 + 0x22]=SrcAlphaColor & 0x0FFFF; memw[0x03800000 + reg_front*64 + 0x24]=((SrcBlendFunc &0x3F)<<8)|((SrcAlphaColor &0x0FF0000)>>16); memw[0x03800000 + reg_front*64 + 0x26]=DestAlphaColor & 0x0FFFF; memw[0x03800000 + reg_front*64 + 0x28]=((DestBlendFunc &0x3F)<<8)|((DestAlphaColor &0x0FF0000)>>16);// memw[0x03800000 + reg_front*64 + 0x2a]=ShageColor & 0x0ffff;// memw[0x03800000 + reg_front*64 + 0x2c]=(ShadeColor & 0x0ff0000)>>16; memw[0x03800000 + reg_front*64 + 0x34]= Offset_t >>7; //(0x48000>>7);//bit map offset memw[0x03800000 + reg_front*64 + 0x38]= Size_t; //0x00a4; // command queue while( 1 ) { reg_rear = memw[0x03000082]; if( next_front != reg_rear ) break; } // front pointer memw[0x3000080] = next_front;}////////////////////////////////////////////////////////////////////////////////void Write_Packet_com(int mode, int ScrX1, int ScrY1, int ScrX2, int ScrY2, int Tx1, int Ty1, int A, int B, int C, int D, int Transparency_Color_RGB, int Offset_t, int Size_t){ unsigned short reg_front = memw[0x3000080]; unsigned short reg_rear; unsigned short next_front = (reg_front+1)%2048; memw[0x03800000 + reg_front*64 + 0x00]= mode; //0x4708; memw[0x03800000 + reg_front*64 + 0x02]=ScrX1; //200; //128; //32; //DstX1 memw[0x03800000 + reg_front*64 + 0x04]=ScrY1; //; //128; //32; //DstY1 memw[0x03800000 + reg_front*64 + 0x06]=ScrX2; //128*5+; //DstX2 memw[0x03800000 + reg_front*64 + 0x08]=ScrY2; //; //DstY2 memw[0x03800000 + reg_front*64 + 0x0a]= (Tx1 <<9)& 0x0ffff; //0; //256; //SrcX memw[0x03800000 + reg_front*64 + 0x0c]= (Tx1 >>7)& 0x1f;//(Tx1 >>16)& 0x1f; //SrcX memw[0x03800000 + reg_front*64 + 0x0e]= (Ty1 <<9)& 0x0ffff;//0; //256; //SrcY memw[0x03800000 + reg_front*64 + 0x10]= (Ty1 >>7)& 0x1f;//(Ty1>>16)&0x1f;//0; //SrcY memw[0x03800000 + reg_front*64 + 0x12]=A & 0x0ffff;//512; //A memw[0x03800000 + reg_front*64 + 0x14]=(A>>16)&0x1f;;//0; //A memw[0x03800000 + reg_front*64 + 0x16]=B & 0x0ffff; //B memw[0x03800000 + reg_front*64 + 0x18]=(B>>16)&0x1f;//0; //B memw[0x03800000 + reg_front*64 + 0x1a]=C & 0x0ffff; //C memw[0x03800000 + reg_front*64 + 0x1c]=(C>>16)&0x1f;//0; //C memw[0x03800000 + reg_front*64 + 0x1e]=D & 0x0ffff; //D memw[0x03800000 + reg_front*64 + 0x20]=(D>>16)&0x1f;//0; //D memw[0x03800000 + reg_front*64 + 0x2e]=Transparency_Color_RGB&0x0fcf8; //0x0fc00; //transparency memw[0x03800000 + reg_front*64 + 0x30]=(Transparency_Color_RGB>>16)&0x0f8;//0x00; memw[0x03800000 + reg_front*64 + 0x34]= Offset_t >>7; //(0x48000>>7);//bit map offset memw[0x03800000 + reg_front*64 + 0x38]= Size_t; //0x00a4; // command queue while( 1 ) { reg_rear = memw[0x03000082]; if( next_front != reg_rear ) break; } // front pointer memw[0x3000080] = next_front;}////////////////////////////////////////////////////////////////////////////////void Write_Packet_rotate(int mode, int ScrX1, int ScrY1, int ScrX2, int ScrY2, int Tx1, int Ty1, int A, int B, int C, int D, int Transparency_Color_RGB, int Offset_t, int Size_t){ unsigned short reg_front = memw[0x3000080]; unsigned short reg_rear; unsigned short next_front = (reg_front+1)%2048; memw[0x03800000 + reg_front*64 + 0x00]= mode; //0x4708; memw[0x03800000 + reg_front*64 + 0x02]=ScrX1; //200; //128; //32; //DstX1 memw[0x03800000 + reg_front*64 + 0x04]=ScrY1; //; //128; //32; //DstY1 memw[0x03800000 + reg_front*64 + 0x06]=ScrX2; //128*5+; //DstX2 memw[0x03800000 + reg_front*64 + 0x08]=ScrY2; //; //DstY2 memw[0x03800000 + reg_front*64 + 0x0a]= Tx1 & 0x0ffff; //0; //256; //SrcX memw[0x03800000 + reg_front*64 + 0x0c]= (Tx1 >>16)& 0x1f;//(Tx1 >>16)& 0x1f; //SrcX memw[0x03800000 + reg_front*64 + 0x0e]= Ty1 & 0x0ffff;//0; //256; //SrcY memw[0x03800000 + reg_front*64 + 0x10]= (Ty1>>16)&0x1f;//(Ty1>>16)&0x1f;//0; //SrcY memw[0x03800000 + reg_front*64 + 0x12]=A & 0x0ffff;//512; //A memw[0x03800000 + reg_front*64 + 0x14]=(A>>16)&0x1f;;//0; //A memw[0x03800000 + reg_front*64 + 0x16]=B & 0x0ffff; //B memw[0x03800000 + reg_front*64 + 0x18]=(B>>16)&0x1f;//0; //B memw[0x03800000 + reg_front*64 + 0x1a]=C & 0x0ffff; //C memw[0x03800000 + reg_front*64 + 0x1c]=(C>>16)&0x1f;//0; //C memw[0x03800000 + reg_front*64 + 0x1e]=D & 0x0ffff; //D memw[0x03800000 + reg_front*64 + 0x20]=(D>>16)&0x1f;//0; //D memw[0x03800000 + reg_front*64 + 0x2e]=Transparency_Color_RGB&0x0fcf8; //0x0fc00; //transparency memw[0x03800000 + reg_front*64 + 0x30]=(Transparency_Color_RGB>>16)&0x0f8;//0x00; memw[0x03800000 + reg_front*64 + 0x34]= Offset_t >>7; //(0x48000>>7);//bit map offset memw[0x03800000 + reg_front*64 + 0x38]= Size_t; //0x00a4; // command queue while( 1 ) { reg_rear = memw[0x03000082]; if( next_front != reg_rear ) break; } // front pointer memw[0x3000080] = next_front;}void Display_BMP_1(void)//0x00a4:128*128,0x009b:64*64;0x009c:128*64,0x00b7:1024*512,0xb6:512*512,0xad:256*256,//128*256:0x0ac,256*512:0x0b5{ //new copy bmp16 from flash to texture://void Copyb16_from_flash_to_texture(word *begin_flash, word *begin_texture, // int columns, int lines, int columns_apply(2^n), int lines_apply(2^n)) Copy_all_pic_to_Tmem();// Draw_my_pic(unsigned short dispmode, int x, int y, My_Pic *p_mypic, // unsigned int Trans_color);// Draw_my_pic(COMM_MODE, &Gnd, 0); //ground pic// Draw_my_pic(TRANS_MODE, &mouse, 0xffffff); //mouse// Draw_my_pic(COMM_MODE, &girl, 0); //girl Draw_my_pic(COMM_MODE, &_pic_[0], 0);//button1 //Write_Packet_com(0x4708,300,400,357,441,0,0,512,0,0,(512),0,\ // 0x50000+0x0f0000+0x1300+0x9600, 0x9b); Flip_zy(); Draw_my_pic(COMM_MODE, &_pic_[1], 0);//button2 Flip_zy();}void New_move1(void){ int i=0; int j=100; int key_num=-1;//key number when mouse changes,-1:no key pressed int Key_Num=-1;//Key Number when key presses,-1:no key pressed unsigned int time_ofkey=0;//time when key pressed,0:no key unsigned int time_last=0;//time used for 1 sec timer char has_change=0; //if has change,no matter what change, process graphic char bank_switch =0;//1 char not_pressed =1;//key not pressed char total_time =35;//total bet time 35s
char Game_start =0;//1:start, 0:not start
short Corn_money =0;//inserted corn
short lunpan_num=0; int blend_rate[11] = {0,20,40,60,80,100,80,60,40,20}; Copy_all_pic_to_Tmem();//if total PIC size <4M or 6M// Draw_my_pic(unsigned short dispmode,My_Pic *p_mypic,unsigned int Trans_color);// Draw_my_pic(COMM_MODE, &Gnd, 0); //ground pic PushCommand( WritePacket_Clear ); //clear screen Flip_zy();// Draw_my_pic(COMM_MODE, &Gnd, 0); //ground pic PushCommand( WritePacket_Clear ); //clear screen Flip_zy(); while(j) { if((_TIMER_VAR - time_last)>=1)//every 0.1s { has_change =1; time_last = _TIMER_VAR; } if(has_change) { //every time when has_change should do bank switch PushCommand( WritePacket_Clear ); //clear screen Draw_my_pic(COMM_MODE, &_pic_[0], 0); //ground pic//Draw_my_pic(unsigned short dispmode,My_Pic *p_mypic,unsigned int Trans_color);// Draw_my_pic_blend(BLEND_MODE, &_pic_[1], blend_rate[i]); Draw_my_pic_rotate(0x4728,&_pic_[1]); rotate_angle +=0.2;// Draw_my_pic(COMM_MODE, &girl, 0); delay(4); // try different 3,10,20.. Flip_zy(); has_change =0;//end of this change }//end of if }//end of while}void dgFlashLatch( U8 flash ){ _LATCH_ADDR = ((U16)flash)*2;}void error_trap(U8 error_num){ Error_Num = error_num;#ifdef _ADDTEST_//output some message by UART0#endif while(1);}/////////////////////////////////////////////////////// main and cache/////////////////////////////////////////////////////#define __CACHE_INVALIDATE_SET(VALUE) asm( "CACHE_INVALIDATE_SET: "); asm( "push %R0"); asm( "ldi %0 , %%R0" : : "i" (VALUE) ); asm( "mvtc 0 , %CR5"); asm( "pop %R0"); #define __CACHE_INVALIDATE_CHECK() asm( "CACHE_INVALIDATE_CHECK:"); asm( "mvfc 0 , %CR6"); asm( "and %R0, 0x00100000, %R0"); asm( "jnz CACHE_INVALIDATE_CHECK"); #define __CACHE_MODE_SET(VALUE) asm( "CACHE_MODE_SET: "); asm( "push %R0"); asm( "ldi %0 , %%R0" : : "i" (VALUE) ); asm( "mvtc 0 , %CR3"); asm( "pop %R0");#define __CACHE_ACTIVE_SET(VALUE) asm( "CACHE_ACTIVE_SET: "); asm( "push %R0"); asm( "ldi %0 , %%R0" : : "i" (VALUE) ); asm( "mvtc 0 , %CR7"); asm( "pop %R0"); /**************************************************/// CACHE MASTER COMMAND REGISTER/**************************************************/# define __CACHE_UNIT_DISABLE ( 0 << 11 )# define __CACHE_UNIT_ENABLE ( 1 << 11 )# define __CACHE_UNIT_NORMAL ( 0 << 0 )# define __CACHE_UNIT_DELAY ( 1 << 0 )/**************************************************/// CACHE INVALIDATE REGISTER/**************************************************/# define __CACHE_INVALIDATE_DISABLE ( 0 << 0 )# define __CACHE_INVALIDATE_ENABLE ( 1 << 0 ) /**************************************************/// CACHE INVALIDATE REGISTER/**************************************************/# define __CACHE_WRITE_THROUGH ( 0 << 6 )# define __CACHE_WRITE_BACK ( 1 << 6 )int main( void ){ int j,i; U8 flash; flash = 0; dgFlashLatch(flash); asm("CACHE_CONFIGURATION_SET:");__CACHE_INVALIDATE_SET(__CACHE_INVALIDATE_ENABLE)__CACHE_INVALIDATE_CHECK()__CACHE_MODE_SET(__CACHE_WRITE_BACK)//__CACHE_MODE_SET(__CACHE_WRITE_THROUGH)__CACHE_ACTIVE_SET(__CACHE_UNIT_ENABLE | // __CACHE_UNIT_NORMAL ) // process read_hit & miss at one cpuclk __CACHE_UNIT_DELAY ) // process read_hit & miss at two cpuclk // FMEM/TMEM - memory controller reset VR0_memory_controller_reset(); // set screen mode 640*480 CRT_320x240_noninterlace(); // Rendering engine reset InitRenderingEngine_zy(); // select Render target => back-buffer // for double buffering... *(volatile unsigned short*)(0x300008c) = 0x0006; // dither mode : disable,render target : back-buffer if( SndInit() == vgFALSE ) { error_trap(9);;//error } vgSndSetPlayFrequency( 100000000.f, 44100.f); //86000000.f 44100.f ); vgSndPlaySound(); VR0SndInitMemory( SOUND_MEMORY_BANK_MUSIC, 0x03e00000, 2*1024*1024); VR0SndInitMemory( SOUND_MEMORY_BANK_WAV , 0x03e00000, 2*1024*1024);/* if(vgSndSetWav(fm_easy,0x091000,22050.f, 50, 0x41, &wav )== vgFALSE)//16bit back ground music error_trap(10); if(vgSndSetWav(chat ,0x5e00, 11025.f, 127, 0x40, &wav1 )== vgFALSE)//16bit back ground music error_trap(11); if(vgSndSetWav(ding ,0x9dbe, 22050.f, 127, 0x40, &wav2)== vgFALSE)//16bit back ground music error_trap(13); if(vgSndPlayWav( &wav )== vgFALSE) error_trap(20);*/ /* if(vgSndPlayWav( &wav1 )== vgFALSE) //chat snd error_trap(21); if(vgSndPlayWav( &wav2 )== vgFALSE) //ding snd error_trap(22);*/ init_all_pic_address(); init_struct();//initial all My_pic struct// init_key_range(); UartConfig1(); timer_int_enable(); // open timer1 interrupt test while(1) {// Display_BMP_1(); //used for disp every pic for test New_move1(); delay(3000); } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -