我目前正在世嘉土星上开发。
控制台有几个专用芯片;其中一些有自己的专用 RAM 和/或 VRAM。一个例子是如何将主 RAM 分成两个不同的 1MB 区域。
我正在寻找一个通用的、可移植的、小型的malloc
库,它允许我声明不同的 RAM 区域,然后允许我进入这些区域malloc
或free
在这些区域内。
vdp2 图形芯片就是一个例子。它有一个专用的 VRAM 区域,用于屏幕模式 8b 的调色板。
在这里,我可以使用经典方法并预加载适用于所有游戏图形的调色板,但为什么不只加载当前图形实际使用的调色板呢?
在这里,我需要一个系统来分配和释放颜色(调色板条目),但如果用户尝试分配超过 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);