2013-07-24 6 views
10

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

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

Antwort

2

Grundsätzlich benötigen Sie zwei Speicherverwaltungsroutinen: Eine, die ihre internen Arbeits speichert in ein Teil des RAM, während ein anderer (in diesem Fall VRAM) verwaltet wird, und der andere könnte irgendeine normale malloc-Routine sein. Benötigen Sie für VRAM 16 und 256 Farbpaletten oder nur 256? Wenn eine einzelne Größe, dann würde ein "Unit Allocator" -Algorithmus Ihnen gut passen.

Für Ihren Haupt-RAM wäre wahrscheinlich ein Algorithmus mit verketteten Listen ausreichend. An implementation ist hier gemacht, aber mit ein wenig Beinarbeit, finden Sie viele, viele Implementierungen im Internet.

Ich habe nicht an dem Saturn selbst in 16 Jahren sehe, so war dies eine tolle Sache, zu lesen und zu bearbeiten für Sie :)

+0

Ja, Palette ist kein großartiges Beispiel, da sie Farben zwischen Sprites teilen und Speicher mit fester Größe erhalten muss, also wird ein dedizierter Code benötigt, aber ich möchte nur 64 oder 96 Farben diesem System geben, ohne seinen Ram neu zu berechnen Offset und lass es einfach dynamisch sein. Ich möchte Unterstützung alle Art von Palette Modus der Saturn bekommen, jeder vdp2 Hintergrund kann seine eigenen Farbmodus, Auflösung und Palette, aber es ist nur ein möglicher Anwendungsfall, warum ich ein generisches System benötigen. Implementierungen, die du verknüpfst, sind einfach, ich +1 für es und versuche, mein eigenes freies zu implementieren :) thx für redigieren, dennoch bin ich nicht Englisch ^^ – r043v

+0

Sie haben Ihren Punkt über gerade fein :) Ich räumte gerade ein wenig für anderes auf , Nicht-Konsolen Menschen ein bisschen besser zu verstehen. –