/***************************************************************************** aho3.c 黒PSを贅沢に使うプログラム3 超アホメモリカードチェックプログラム 1997. 1.12 多少の仕様変更 *****************************************************************************/ #include #include #include #include #include #include #include #include "util.h" #include "padcon.h" /* aho2 */ #include "memcard.h" /* aho3 */ /***************************************************************************** *****************************************************************************/ MEMORY_CARD cardhead[15]; /* メモリカードデータファイルヘッダ */ struct DIRENTRY carddir[15]; /* ディレクトリエントリ */ static char *DevName[]={ "bu00:", "bu10:" }; /* デバイス名 */ static long chan = 1; /* 差し口が右の場合、1 */ #define PIH 320 /* よこぉ */ #define PIV 240 /* たてぇ */ /* オーダリングテーブル(OT)の定義 */ #define OT_LENGTH 1 GsOT WorldOT[2]; GsOT_TAG OTTags[2][1<name ); j = 0; #if 0 while( 1 ){ if( ( fd = open( name, O_RDONLY ) ) < 0 ){ printf( "cannot open file[%s]!\n", name ); return -1; } /* 128 bytes ずつでないと読込めない(?) */ lseek( fd, 128*j, SEEK_SET ); if( read( fd, (void*)(buf+128*j), 128 ) < 128 ){ close( fd ); return -2; } if( j >= 3 ){; close( fd ); break; } close( fd ); j++; } #else if( ( fd = open( name, O_RDONLY ) ) < 0 ){ printf( "cannot open file[%s]!\n", name ); return -1; } /* 128 bytes ずつでないと読込めない(?) */ lseek( fd, 0, SEEK_SET ); if( read( fd, (void*)(buf), 128*4 ) < 128*4 ){ close( fd ); return -2; } close( fd ); #endif memcd->Magic[0] = buf[0]; memcd->Magic[1] = buf[1]; memcd->Type = buf[2]; memcd->BlockEntry = buf[3]; _memcpy( (char*)memcd->Title, (char*)&buf[4], 64 ); _memcpy( (char*)memcd->reserve, (char*)&buf[4+64], 28 ); _memcpy( (char*)memcd->Clut, (char*)&buf[4+64+28], 32 ); _memcpy( (char*)memcd->Icon[0], (char*)&buf[128*1], 128 ); _memcpy( (char*)memcd->Icon[1], (char*)&buf[128*2], 128 ); _memcpy( (char*)memcd->Icon[2], (char*)&buf[128*3], 128 ); printf( "*" ); } printf( "\n" ); return 1; } /***************************************************************************** メモリカードから読みこんだアイコンデータの描画 引数:n アイコンデータの総数(要はファイル総数) memcd メモリデータの格納先(これを使って書く) *****************************************************************************/ void DrawIcon( int n, MEMORY_CARD *memcd ) { RECT rect; GsSPRITE sp[15][3]; /* アイコン用スプライト */ int spflag[15]; /* アイコンのタイプフラグ */ long padd; /* お決まりのパッド用 */ int activeBuff; /* アクティブなバッファへのポインタ */ int i, j; for( i = 0; i < n; i++, memcd++ ){ spflag[i] = memcd->Type - 0x10; rect.x = 0; rect.y = 480+i; rect.w = 16; rect.h = 1; LoadImage( &rect, (u_long*)(memcd->Clut) ); DrawSync( 0 ); // for( j = 0; j < n; j++ ){ for( j = 0; j < spflag[i]; j++ ){ rect.x = 640 + 64*j; /* ちょっと無駄だけどいいか */ rect.y = 16*i; rect.w = 16/4; rect.h = 16; LoadImage( &rect, (u_long*)(memcd->Icon[j]) ); DrawSync( 0 ); sp[i][j].attribute = 0 << 24; sp[i][j].x = 50+20*(i%10); sp[i][j].y = 50+20*(i/10); sp[i][j].w = 16; sp[i][j].h = 16; sp[i][j].tpage = GetTPage( 0, 0, 640+64*j, (16*i)%256 ); sp[i][j].u = 0; sp[i][j].v = (16*i)%256; sp[i][j].cx = 0; sp[i][j].cy = 480+i; sp[i][j].r = 128; sp[i][j].g = 128; sp[i][j].b = 128; sp[i][j].mx = 8; sp[i][j].my = 8; sp[i][j].scalex = 4096; sp[i][j].scaley = 4096; sp[i][j].rotate = 0; } } j = 0; while( 1 ){ activeBuff = GsGetActiveBuff(); GsSetWorkBase( (PACKET *)GpuPacketArea[activeBuff] ); GsClearOt( 0, 0, &WorldOT[activeBuff] ); /* SPRITE を OT へ登録 */ for( i = 0; i < n; i++ ){ /* 1秒でアニメーションさせる */ // GsSortSprite( &sp[i][j/20], &WorldOT[activeBuff], 0 ); #if 0 if( spflag[i] == 1 ){ GsSortSprite( &sp[i][0], &WorldOT[activeBuff], 0 ); } if( spflag[i] == 2 ){ GsSortSprite( &sp[i][j/30], &WorldOT[activeBuff], 0 ); } if( spflag[i] == 3 ){ GsSortSprite( &sp[i][j/20], &WorldOT[activeBuff], 0 ); } #endif GsSortSprite( &sp[i][j*spflag[i]/60], &WorldOT[activeBuff], 0 ); } padd = PadRead( 0 ); DrawSync( 0 ); VSync( 0 ); /* Vsyncを待つ */ GsSwapDispBuff(); GsSortClear( 0, 0, 0, &WorldOT[activeBuff] ); /* クリアしてから */ GsDrawOt( &WorldOT[activeBuff] ); /* 描画する */ if( isPADRdown( padd ) ){ /* Xで抜ける */ DrawSync( 0 ); break; } j++; if( j >= 60 ){ j = 0; } } } /***************************************************************************** メモリカードから読みこんだファイル情報を格納する 引 数:cd メモリカードのファイル情報の格納先 戻り値:ファイル総数 *****************************************************************************/ int ListMemCard( struct DIRENTRY *cd ) { int i; int n; char name[32]; struct DIRENTRY *d; if( TestCard( chan ) != 1 ) return 0; d = cd; strcpy( name, DevName[chan] ); strcat( name, "*" ); for( i = 0; i < 15; i++, cd++ ){ if( i == 0 ){ if( firstfile( name, cd ) == NULL ){ break; } } else{ if( nextfile( cd ) == NULL ){ break; } } } n = i; for( i = 0; i < n; i++, d++ ){ printf( "carddir[%d]:%s\n", i, d->name ); } return n; } void main( void ) { long ret; long padd; long addr; int n; padd = 0; addr = 0; n = 0; SystemInit(); while( 1 ){ padd = PadRead( 0 ); ret = TestCard( chan ); printf( "ret = %ld\r", ret ); if( isPADRright( padd ) ){ /* ○ボタンで読みこんで表示 */ n = ListMemCard( carddir ); printf( "data %d\n", n ); LoadMemCard( n, carddir, cardhead ); DrawIcon( n, cardhead ); } if( isPADselect( padd ) && isPADstart( padd ) ){ break; } } DrawSync( 0 ); PadStop(); }