現在セガサターンで開発中です。
コンソールにはいくつかの専用チップがあります。独自の専用 RAM や VRAM を持つものもあります。例として、メイン RAM を 2 つの異なる 1MB ゾーンに分割する方法があります。
私は、さまざまな RAM ゾーンを宣言し、それらのゾーンへのアクセスまたはゾーン内でのmalloc
使用を許可する、汎用的で移植可能な小さなライブラリを探しています。malloc
free
例として、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);