В настоящее время я развиваюсь на Сега Сатурне.
Консоль имеет несколько выделенных фишек; некоторые из которых имеют собственную выделенную RAM и/или VRAM. Примером может служить то, как основная ОЗУ разбивается на две разные зоны 1 МБ.
Я ищу универсальную, портативную и небольшую библиотеку 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));
Основной 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;
}
Это нормально для моих текущих тестов, но в конечном итоге это будет не так, (это действительно нужно бесплатно! Но это не то, что я хочу в целом =))
Подводя итог, мне нужен минималистический, простой и простой фрагмент кода для обработки зон памяти, как описано выше. На данный момент алгоритм управления памятью не должен быть эффективным, я просто хочу, чтобы он работал. Или, может быть, вы можете отправить мне ссылку на классический и простой алгоритм управления памятью, который я могу попытаться реализовать самостоятельно?
edit > ОК, я сделал это сам, вот суть
не очень развит, но отлично работает с этим тестом:
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);