9

現在セガサターンで開発中です。

コンソールにはいくつかの専用チップがあります。独自の専用 RAM や VRAM を持つものもあります。例として、メイン RAM を 2 つの異なる 1MB ゾーンに分割する方法があります。

私は、さまざまな RAM ゾーンを宣言し、それらのゾーンへのアクセスまたはゾーン内でのmalloc使用を許可する、汎用的で移植可能な小さなライブラリを探しています。mallocfree

例として、vdp2 グラフィック チップがあります。画面モード 8b のカラー パレット専用の VRAM ゾーンがあります。

ここでは、従来の方法を使用して、すべてのゲーム グラフィックで機能するパレットをプリロードできますが、現在のグラフィックで実際に使用されているパレットだけをロードしないのはなぜでしょうか?

ここでは、色 (パレット エントリ) を割り当てて解放するためのシステムが必要ですが、ユーザーが 255 色を超える色を割り当てようとすると失敗することを望みます (これは最大パレット サイズであるため)。

基本的に、いくつかの動的メモリ ゾーンを宣言し、それらに割り当て/解放できるようにしたいと考えています。

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));

Saturn に付属していた主要な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;
}

私の現在のテストでは問題ありませんが、長期的にはうまくいきません.

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

編集>わかりました、私は自分でやった、ここに要点があります

あまり進化していませんが、このテストでは問題なく動作します:

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);
4

1 に答える 1

2

基本的に、2 つのメモリ管理ルーチンが必要です。1 つは内部作業を RAM の一部に格納し、別の部分 (この場合は VRAM) を管理し、もう 1 つは通常の malloc ルーチンです。VRAM の場合、16 色と 256 色の両方のカラー パレットを処理する必要がありますか? それとも 256 色だけを処理する必要がありますか? 単一のサイズの場合は、「ユニット アロケーター」タイプのアルゴリズムが適しています。

メイン RAM については、リンク リスト スタイルのアルゴリズムで十分でしょう。 実装はここで行われますが、ほんの少しの作業で、インターネット上で非常に多くの実装を見つけることができます。

私は土星を16年間見ていないので、これを読んで編集するのは楽しいものでした:)

于 2013-07-24T18:41:15.053 に答える