void run_demo(packet_t *packet) { int context = 0; vertex_t v0; color_t c0; color_t c1; texbuffer_t texbuf; clutbuffer_t clut; lod_t lod; packet_t *packets[2]; packet_t *current; packets[0] = packet_init(10000,PACKET_NORMAL); packets[1] = packet_init(10000,PACKET_NORMAL); // Use linear filtering for good scaling results lod.calculation = LOD_USE_K; lod.max_level = 0; lod.mag_filter = LOD_MAG_LINEAR; lod.min_filter = LOD_MIN_LINEAR; lod.l = 0; lod.k = 0; texbuf.width = 512; texbuf.psm = GS_PSM_4; texbuf.address = myaddress; texbuf.info.width = draw_log2(512); texbuf.info.height = draw_log2(256); texbuf.info.components = TEXTURE_COMPONENTS_RGBA; texbuf.info.function = TEXTURE_FUNCTION_MODULATE; clut.storage_mode = CLUT_STORAGE_MODE1; clut.start = 0; clut.psm = GS_PSM_32; clut.load_method = CLUT_LOAD; clut.address = clutaddress; v0.x = 320.0f; v0.y = 240.0f; v0.z = 4; c0.r = 0xFF; c0.g = 0xFF; c0.b = 0xFF; c0.a = 0x80; c0.q = 1.0f; c1.r = 0xFF; c1.g = 0x00; c1.b = 0x00; c1.a = 0x40; c1.q = 1.0f; // UTF-8 unsigned char str0[] = { 0x61, 0x62, 0xC2, 0xA9, 0x78, 0xC2, 0xA5, 0xC2, 0xB2, '\0'}; // Shift-JIS unsigned char str1[] = {0x81, 0xBC, 0x93, 0xF1, 0x93, 0xF1, 0x93, 0xF1, 0x81, 0x69, 0x81, 0x40, 0x81, 0x4F, 0x83, 0xD6, 0x81, 0x4F, 0x81, 0x6A, 0x93, 0xF1, 0x81, 0xBD, 0x0D, '\0' }; qword_t *q = packet->data; while(1) { current = packets[context]; q = current->data; q = draw_clear(q,0,0,0,640.0f,448.0f,0x40,0x40,0x40); q = draw_texture_sampling(q,0,&lod); q = draw_texturebuffer(q,0,&texbuf,&clut); impress.scale = 3.0f; q = fontx_print_sjis(q,0,str1,CENTER_ALIGN,&v0,&c0,&krom_u,&krom_k); q = fontstudio_print_string(q,0,str0,CENTER_ALIGN,&v0,&c1,&impress); q = draw_finish(q); dma_wait_fast(); dma_channel_send_normal(DMA_CHANNEL_GIF,current->data, q - current->data, 0,0); draw_wait_finish(); context ^= 1; graph_wait_vsync(); } free(packets[0]); free(packets[1]); }
/* data (anything). */ static void* InitCB ( void* apParam, MPEGSequenceInfo* apInfo ) { int lDataSize = apInfo -> m_Width * apInfo -> m_Height * 4; char* retVal = ( char* )malloc ( lDataSize ); InitCBParam* lpParam = ( InitCBParam* )apParam; int lMBW = ( apInfo -> m_Width ) >> 4; int lMBH = ( apInfo -> m_Height ) >> 4; int lTBW = ( apInfo -> m_Width + 63 ) >> 6; int lTW = draw_log2 ( apInfo -> m_Width ); int lTH = draw_log2 ( apInfo -> m_Height ); int lX, lY; char* lpImg; QWORD* q; lpParam -> m_TexAddr >>= 6; lpParam -> m_pData = lpImg = retVal; lpParam -> m_pInfo = apInfo; SyncDCache ( retVal, retVal + lDataSize ); /* This initializes picture transfer packet. */ /* Decoded picture is a sequence of 16x16 pixels */ /* 'subpictures' (macroblocks) and DMA controller */ /* will transfer them all at once using source */ /* chain transfer mode. */ packet_allocate(&lpParam -> m_XFerPck,(10 + 12 * lMBW * lMBH )>>1,0,0); q = lpParam-> m_XFerPck.data; DMATAG_CNT(q, 3, 0, 0, 0); q++; PACK_GIFTAG(q,GIF_SET_TAG( 2, 0, 0, 0, 0, 1 ),GIF_REG_AD); q++; PACK_GIFTAG(q,GS_SET_TRXREG( 16, 16 ), GS_REG_TRXREG); q++; PACK_GIFTAG(q,GS_SET_BITBLTBUF( 0, 0, 0, lpParam -> m_TexAddr, lTBW, GS_PSM_32 ), GS_REG_BITBLTBUF); q++; for ( lY = 0; lY < apInfo -> m_Height; lY += 16 ) { for ( lX = 0; lX < apInfo -> m_Width; lX += 16, lpImg += 1024 ) { DMATAG_CNT(q, 4, 0, 0, 0 ); q++; PACK_GIFTAG(q,GIF_SET_TAG( 2, 0, 0, 0, 0, 1 ), GIF_REG_AD ); q++; PACK_GIFTAG(q,GS_SET_TRXPOS( 0, 0, lX, lY, 0 ), GS_REG_TRXPOS ); q++; PACK_GIFTAG(q,GS_SET_TRXDIR( 0 ), GS_REG_TRXDIR ); q++; PACK_GIFTAG(q,GIF_SET_TAG( 64, 1, 0, 0, 2, 0),0); q++; DMATAG_REF(q, 64, ( unsigned )lpImg, 0, 0, 0); q++; } /* end for */ } /* end for */ //DMATAG_END(q,0,0,0,0); //q++; lpParam-> m_XFerPck.qwc = q - lpParam-> m_XFerPck.data; /* This initializes picture drawing packet. Just textrured sprite */ /* that occupies the whole screen (no aspect ratio is taken into */ /* account for simplicity. */ packet_allocate(&lpParam -> m_DrawPck,7,0,0); q = lpParam -> m_DrawPck.data; PACK_GIFTAG(q, GIF_SET_TAG( 6, 1, 0, 0, 0, 1 ), GIF_REG_AD ); q++; PACK_GIFTAG(q, GS_SET_TEX0( lpParam -> m_TexAddr, lTBW, GS_PSM_32, lTW, lTH, 1, 1, 0, 0, 0, 0, 0 ), GS_REG_TEX0_1 ); q++; PACK_GIFTAG(q, GS_SET_PRIM( 6, 0, 1, 0, 0, 0, 1, 0, 0 ), GS_REG_PRIM ); q++; PACK_GIFTAG(q, GS_SET_UV( 0, 0 ), GS_REG_UV ); q++; PACK_GIFTAG(q, GS_SET_XYZ( 0, 0, 0 ), GS_REG_XYZ2 ); q++; PACK_GIFTAG(q, GS_SET_UV( apInfo -> m_Width << 4, apInfo -> m_Height << 4 ), GS_REG_UV ); q++; PACK_GIFTAG(q, GS_SET_XYZ( 640 << 4, 512 << 4, 0 ), GS_REG_XYZ2 ); q++; lpParam -> m_DrawPck.qwc = q - lpParam -> m_DrawPck.data; return retVal; } /* end InitCB */