Ich entwickle derzeit auf dem Sega Saturn.einfache und tragbare Malloc-Bibliothek
Die Konsole verfügt über mehrere dedizierte Chips; einige davon haben ihren eigenen dedizierten RAM und/oder VRAM. Ein Beispiel wäre, wie das Haupt-RAM in zwei verschiedene 1MB-Zonen aufgeteilt wird.
Ich suche eine generische, tragbare und kleine malloc
Bibliothek, die mir erlauben, verschiedene RAM Zonen zu erklären und mich dann zu malloc
oder free
innerhalb dieser Zonen zu ermöglichen.
Ein Beispiel wäre der Grafikchip vdp2. Es hat eine dedizierte VRAM-Zone für die Farbpalette des Bildschirmmodus 8b.
Hier könnte ich eine klassische Methode und Preload-Paletten, die für alle Spiele-Grafiken, funktionierte, aber warum nicht nur Paletten, die tatsächlich von meinen aktuellen Grafiken verwendet werden, laden?
Hier brauche ich ein System zum Zuweisen und Freigeben von Farben (Paletteneinträge), aber ich möchte, dass es fehlschlägt, wenn der Benutzer versucht, mehr als 255 Farben zuzuordnen - da dies die maximale Palettengröße ist.
Grundsätzlich möchte ich ein paar dynamische Speicherzonen und Alloc/frei in sie in der Lage zu erklären:
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));
Der Haupt malloc
der Werkzeugkette, die mit dem Saturn kam nicht aus gearbeitet die Box, so schrieb ich schnell diese Scheiße:
#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;
}
es ist in Ordnung für meine aktuellen Tests, aber es wird auf lange Sicht nicht in Ordnung sein, (es ist wirklich eine kostenlose brauchen aber das ist nicht das, was ich will! insgesamt =))
Um zusammenzufassen, brauche ich ein minimalistisches, einfaches und einfaches Stück Code, um Speicherzonen wie oben beschrieben zu behandeln. Für den Moment muss der Speichermanagement-Algorithmus nicht effizient sein, ich möchte nur, dass es funktioniert. Oder können Sie mir einen Link zu einem klassischen und einfachen Speicherverwaltungsalgorithmus senden, den ich selbst implementieren kann?
bearbeiten> ok ich es selbst getan, here is a gist
nicht sehr entwickelt, aber die Arbeit mit diesem Test fein:
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);
Es ist schwer zu sagen, was Sie fordern. Sind Sie auf der Suche nach Malloc-Bibliotheken? malloc Beispiele? ein kostenloses mit Ihrem Malloc gehen? Bitte bearbeiten Sie dies und fügen Sie eine kurze Frage ein. – jwiscarson