Attualmente sto sviluppando sul Sega Saturn.libreria malloc semplice e portatile
La console ha diversi chip dedicati; alcuni dei quali hanno la propria RAM dedicata e/o VRAM. Un esempio potrebbe essere la suddivisione della RAM principale in due diverse zone da 1 MB.
sto cercando per un generico, portatile, e una piccola malloc
libreria che mi permetterà di dichiarare diverse zone di RAM e poi mi permetto di malloc
o free
all'interno di queste zone.
Un esempio potrebbe essere il chip grafico vdp2. Ha una zona VRAM dedicata per la tavolozza dei colori della modalità schermo 8b.
Qui, potrei usare un metodo classico e palette di precaricamento che funzionavano per tutta la grafica di gioco, ma perché non caricare solo le palette effettivamente utilizzate dalla mia grafica attuale?
Qui ho bisogno di un sistema per allocare e liberare colori (voci di palette), ma vorrei che fallisse se l'utente tenta di allocare più di 255 colori - poiché questa è la dimensione massima della tavolozza.
Fondamentalmente, voglio essere in grado di dichiarare alcune dinamica zone di memoria e alloc/libero in loro:
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));
Il principale malloc
dello strumento della catena che è venuto con il Saturn non ha funzionato fuori la scatola, così ho scritto in fretta questa merda:
#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;
}
E 'ok per il mio test in corso, ma non andrà bene nel lungo periodo, (E' davvero bisogno di un libero ma non è questo quello che voglio! overall =))
Per riassumere, ho bisogno di una parte di codice minimalista, semplice e semplice per gestire le zone di memoria come descritto sopra. Per ora, l'algoritmo di gestione della memoria non deve essere efficiente, voglio solo che funzioni. O forse mi puoi inviare un link ad un classico e semplice algoritmo di gestione della memoria che posso provare a implementare da solo?
Modifica> ok ho fatto io, here is a gist
non molto evoluta, ma funzionano bene con questo test:
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);
E 'difficile dire quello che stai chiedendo. Stai cercando librerie malloc? esempi malloc? un libero di andare con il tuo malloc? Si prega di modificare questo e includere una domanda concisa. – jwiscarson