Tôi hiện đang phát triển trên Sega Saturn.thư viện malloc đơn giản và di động
Bàn điều khiển có một số chip chuyên dụng; một số trong số đó có RAM riêng và/hoặc VRAM. Một ví dụ sẽ là làm thế nào RAM chính được chia thành hai khu vực 1MB khác nhau.
Tôi đang tìm thư viện chung, di động và nhỏ malloc
cho phép tôi khai báo các vùng RAM khác nhau và sau đó cho phép tôi malloc
hoặc free
trong các khu vực đó.
Ví dụ sẽ là chip đồ họa vdp2. Nó có vùng VRAM chuyên dụng cho bảng màu của chế độ màn hình 8b.
Ở đây, tôi có thể sử dụng phương pháp cổ điển và bảng màu tải trước hoạt động cho tất cả đồ họa trò chơi, nhưng tại sao không chỉ tải bảng màu thực sự đang sử dụng đồ họa hiện tại của tôi?
Ở đây tôi cần một hệ thống để phân bổ và miễn phí màu (mục nhập bảng), nhưng tôi muốn nó thất bại nếu người dùng cố gắng phân bổ hơn 255 màu - vì đây là kích thước bảng tối đa.
Về cơ bản, tôi muốn để có thể khai báo một vài động khu bộ nhớ và alloc/miễn phí vào chúng:
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));
Các chính malloc
của công cụ chuỗi đi kèm với Saturn đã không làm việc ra khỏi hộp, vì vậy tôi đã nhanh chóng viết bài này:
#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;
}
Đó là ok cho các thử nghiệm hiện tại của tôi, nhưng sẽ không ổn trong thời gian dài (Nó thực sự cần miễn phí! Nhưng đây không phải là điều tôi muốn tổng thể =))
Để tóm tắt, tôi cần một đoạn mã đơn giản, cơ bản và đơn giản để xử lý các vùng bộ nhớ như được nêu ở trên. Bây giờ, thuật toán quản lý bộ nhớ không cần hiệu quả, tôi chỉ muốn nó hoạt động. Hoặc có thể bạn gửi cho tôi một liên kết đến một thuật toán quản lý bộ nhớ cổ điển và đơn giản mà tôi có thể tự mình thực hiện?
chỉnh sửa> ok tôi thực hiện nó bản thân mình, here is a gist
không phải là rất phát triển nhưng hoạt động tốt với thử nghiệm này:
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);
Thật khó để nói những gì bạn đang yêu cầu. Bạn đang tìm kiếm thư viện malloc? ví dụ malloc? một tự do để đi cùng với malloc của bạn? Vui lòng chỉnh sửa và bao gồm một câu hỏi ngắn gọn. – jwiscarson