MSX関連
スーパーピンクソックス3について

ビット単位でデータを取得しています
※以下、C++プログラムです
int GBit( int L , int& DL , BYTE*& pD )//戻値:データ 引数:取得ビット数.データの残り(ビット数).データアドレス
{
	static int D;//データ(保持)
	int R = 0;//戻値

	while( L-- )
	{
		if( DL-- == 0 )
		{
			D = *pD++;
			DL = 7;
		}
		R = R *2 +((D >> 7) &1);
		D <<= 1;
	}
	return( R );
}
pD   圧縮されたデータのアドレス
pWdata 展開されたデータのアドレス
{
	int X = pD[0x14] *8;
	int Y = *(WORD*)&pD[0x15];
	pD += 0x19 +0x30;

	BYTE* pW = pWdata;//書込アドレス
	int DL = 0;//データの残り(初期化)
	int F = 0;
	while( pW - pWdata < X * Y /2 )
	{
		if( F == 0 ) F = X /2;
		if( GBit( 1 , DL , pD ) )
		{
			int S = GBit( 1 , DL , pD );
			int L = 1;
			int T = 0;
			for( int i=0 ; i<16 ; i++ )
			{
				if( GBit( 1 , DL , pD ) == 0 ) break;
				L <<= 1;
				T++;
			}
			L += GBit( T , DL , pD );
			if( L > 256 ) L = 256;
			T = pW[-1];
			if( S ) for( int m=0 ; m < L ; m++ ) pW[m] = pW[m - X/2];
			else for( int m=0 ; m < L ; m++ ) pW[m] = T;
			pW += L;
			F -= L;
		}
		else
		{
			while( true )
			{
				*pW++ = GBit( 8 , DL , pD );
				if( --F == 0 ) break;
				if( !GBit( 1 , DL , pD ) ) break;
			}
		}
	}
}
パレットは、0x19から48バイトあります(G・R・Bの順で8bit表現)
PS-3-3
0x12c00-0x17dff (0x5200)

PS-B-10
0x3b400-0x3efff (0x3c00)

PS-B-3
0x43800-0x477ff (0x4000)

PS-B-4
0x56c00-0x59dff (0x3200)

PS-B-5
0x68800-0x6cdff (0x4600)

PS-B-6
0x6d000-0x6fdff (0x2e00)

PS-B-7
0x70000-0x73dff (0x3e00)
※拡張子は".GTM"です



戻る

ツリー表示
トップページへ