我目前正在开发Sega土星.
控制台有几个专用芯片; 其中一些有自己的专用RAM和/或VRAM.一个例子是主RAM如何分成两个不同的1MB区域.
我正在寻找一个通用的,可移植的,小型的malloc库,它允许我声明不同的RAM区域,然后允许我进入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));
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
对我目前的测试来说没问题,但从长远来看它不会很好,(它确实需要一个免费的!但这不是我想要的整体=))
总而言之,我需要一个简约,基本和简单的代码来处理内存区域,如上所述.目前,内存管理算法不需要高效,我只是想让它工作.或者你可以给我发一个经典而简单的内存管理算法的链接,我可以尝试自己实现吗?
编辑>好吧我自己做了,这是一个要点
不是很进化,但在这个测试中工作正常:
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);
Run Code Online (Sandbox Code Playgroud)
基本上,您需要两个内存管理例程:一个将其内部工作存储在 RAM 的一部分中,同时管理另一部分(在本例中为 VRAM),另一个可以是任何正常的 malloc 例程。对于 VRAM,您需要它来处理 16 和 256 调色板还是只处理 256?如果单一大小,那么“单位分配器”类型的算法就很适合您。
对于您的主 RAM,链表样式的算法可能就足够了。 这里已经完成了一个实现,但是只需一点点跑腿工作,您就可以在互联网上找到很多很多实现。
我已经 16 年没有亲眼看过土星了,所以阅读和编辑这篇文章对您来说是一件有趣的事情:)