2013-07-24 17 views
10

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); 
+0

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

risposta

2

Fondamentalmente, è necessario due routine di gestione della memoria: Uno che memorizza il suo funzionamento interno una parte della RAM mentre ne gestisce un'altra (in questo caso, VRAM) e l'altra potrebbe essere una normale routine malloc. Per VRAM, ti serve per gestire sia le palette di colori 16 e 256 che solo 256? Se una singola dimensione, allora un algoritmo di tipo "Unit Allocator" ti andrebbe bene.

Per la RAM principale, un algoritmo in stile elenco collegato sarebbe probabilmente sufficiente. An implementation è fatto qui, ma con solo un po 'di lavoro alle gambe, è possibile trovare MOLTE, MOLTE implementazioni su Internet.

Non ho guardato il Saturn me stesso in 16 anni, quindi questo è stato una cosa divertente da leggere e modificare per voi :)

+0

sì, la tavolozza non è un ottimo esempio in quanto deve supportare la condivisione dei colori tra gli sprite e ottenere una memoria di dimensione fissa, quindi sarà richiesto un codice dedicato, ma voglio essere in grado di fornire solo 64 o 96 colori a questo sistema senza ricalcolare la ram offset e lascia che sia dinamico. Voglio supportare tutti i tipi di modalità tavolozza ottenendo saturn, ogni sfondo vdp2 può ottenere la sua modalità colore, risoluzione e tavolozza, ma è solo un possibile caso d'uso, perché ho bisogno di un sistema generico. Le implementazioni che hai collegato sono semplici, io ne faccio +1 e provo a implementare il mio :) :) per la modifica, eppure non sono inglese ^^ – r043v

+0

Hai capito bene il punto :) Ho appena ripulito un po 'per altre , le persone non consolari a capire un po 'meglio. –

Problemi correlati