2013-07-24 2 views
10

現在Sega Saturnで開発中です。シンプルでポータブルなmallocライブラリ

コンソールにはいくつかの専用チップがあります。それらのうちのいくつかは専用のRAMおよび/またはVRAMを有する。たとえば、メインRAMを2つの異なる1MBゾーンに分割する方法があります。

私は私が異なるRAMゾーンを宣言して、それらのゾーン内mallocまたはfreeに私を許可することができます、一般的なポータブル、および小型mallocライブラリを探しています。

例として、vdp2グラフィックチップがあります。これは、スクリーンモード8bのカラーパレット用の専用VRAMゾーンを有する。

ここでは、すべてのゲームグラフィックのために機能する古典的な方法とプリロードパレット、 を使用できますが、現在のグラフィックスで実際に使用されているパレットだけを読み込むのはなぜですか?

ここでは、色(パレットエントリ)を割り当てて解放するシステムが必要ですが、最大パレットサイズである255色以上を割り当てようとすると失敗します。

基本的に、私は彼らにいくつかの動的なメモリゾーンとのalloc /自由を宣言することができるようにしたい:

u32 palRam = defineMallocZone(COLOR_PALETTE,COLOR_PALETTE_SIZE); 
u32 m68kRam = defineMallocZone(M68KVRAM,M68KVRAMSIZE); 
u32 highRam = defineMallocZone(HIGHRAM,1024*1024); 

u16* my64colors = (u16*)magicMalloc(palRam,64*sizeof(u16)); 

土星に付属のツールチェーンの主なmallocが外に働いていませんでしたボックスには、私はすぐにこのたわごとを書いた:

#define mallocSizeK 512 
#define mallocSizeB mallocSizeK*1024 

void * mymalloc(u32 n) 
{ static u8 m[mallocSizeB]; 
    static u32 c=0; 
    if(!n) return (void*)&c; 
    while(n%4) n++; 
    u32 nn = c+n; 
    if(nn > mallocSizeB) return 0; 
    u8 * p = &m[c]; c = nn; memset(p,0,n); 
    return (void*)p; 
} 

それは私の現在のテストのために大丈夫ですが、それはそれは本当に自由を必要とする(、長期的には問題ありません。しかし、これは私が欲しいものではありません!全体=))

要約すると、上で概説したようにメモリゾーンを処理するには、最小限で基本的でシンプルなコードが必要です。今のところ、メモリ管理アルゴリズムは効率的である必要はなく、ただ動作させるだけです。あるいは、私は自分自身を実装しようとすることができる古典的で単純なメモリ管理アルゴリズムへのリンクを私に送ることができますか?

編集> [OK]を私はそれを自分自身を行って、here is a gist

非常に進化したが、このテストで正常に動作しない:

u32* b1 = bnew(M68KVRAM,512); 
void*mtest[500]; u32 allocSize = 8; 
u32 n = 0, nb=0, total=0; 

while(n<500){ 
    u32 sz = rand()%(allocSize*1024); 
    void *a = bmalloc(b1,sz); 
    if(!a) break; 
    memset(a,1,sz); 
    mtest[n++] = a; 
    total += sz; 
}; 

nb = n; printlr("allocated %u/512 kb in %u 0~%uk blocs",total>>10,nb,allocSize); 

printl("free them all .. "); 
u32 freertn = 0; for(n=0;n<nb;n++) freertn |= (u32)bfree(b1,mtest[n]); 
if(freertn) printlr("fail"); else printlr("ok"); 

*mtest = bmalloc(b1,512*1024); 
if(*mtest) memset(*mtest,200,512*1024); 
printlr("final 512k allocation return : 0x%x",*mtest); 
+0

あなたが求めているものを伝えるのは難しいです。あなたはmallocライブラリを探していますか? mallocの例?あなたのmallocと一緒に自由に行くことができますか?これを編集し、簡潔な質問を1つ入れてください。 – jwiscarson

答えて

2

基本的には、次の2つのメモリ管理ルーチンを必要とする:で、その内部の作業を保存する一つRAMの1つの部分は別のもの(この場合はVRAM)を管理し、もう1つは通常のmallocルーチンです。 VRAMの場合は、16色のカラーパレットまたは256色のパレットを扱う必要がありますか?単一のサイズの場合は、「Unit Allocator」タイプのアルゴリズムがうまくいくでしょう。

メインRAMには、リンクリスト形式のアルゴリズムで十分でしょう。ここではAn implementationが実行されますが、ほんの少しの足で作業すれば、インターネット上にたくさんの実装を見つけることができます。

私は16年に土星で自分を見ていないので、これはあなたのために読んで、編集する楽しいものだった:)

+0

はい、パレットはスプライト間の色の共有と固定サイズのメモリをサポートする必要があるため、専用のコードが必要になりますが、RAMを再計算せずにこのシステムに64または96色しか使用したくないので、オフセットし、それをダイナミックにするだけです。私は土星が得るすべての種類のパレットモードをサポートしたいと思います、各vdp2の背景は独自のカラーモード、解像度、パレットを得ることができますが、それは単なるユースケースです。あなたがリンクしている実装はシンプルですが、私は+1して、私自身の無料の実装を試してみましょう:編集のためのthx、まだ私は英語ではありません^^ – r043v

+0

あなたはちょうど上のあなたのポイントを持っています:)私はちょうど他の、非コンソールの人々は少し良く理解する。 –