32,16 → 32,16 |
|
FILE(Memory); |
|
#define MAX_PARTITION 50 /* Max available partition */ |
#define MAX_PARTITION 50 /* Max available partition */ |
|
static struct { |
BYTE used; |
BYTE used; |
#ifdef __WC16__ |
BYTE __huge *addr; |
BYTE __huge *addr; |
#else |
BYTE *addr; |
BYTE *addr; |
#endif |
DWORD size; |
DWORD size; |
} mem_table[MAX_PARTITION]; |
|
void ll_mem_init(void *base, DWORD size) |
50,8 → 50,7 |
mem_table[0].used = 1; |
mem_table[0].addr = base; |
mem_table[0].size = size; |
for (i = 1; i < MAX_PARTITION; i++) |
mem_table[i].used = 0; |
for (i = 1; i < MAX_PARTITION; i++) mem_table[i].used = 0; |
} |
|
void *ll_alloc(DWORD s) |
61,31 → 60,28 |
|
while (i < MAX_PARTITION && p == NULL) { |
if (mem_table[i].used && (mem_table[i].size >= s)) |
p = mem_table[i].addr; |
else |
i++; |
p = mem_table[i].addr; |
else i++; |
} |
if (p != NULL) { |
if (mem_table[i].size > s) { |
mem_table[i].size -= s; |
mem_table[i].addr += s; |
} else |
mem_table[i].used = FALSE; |
} |
else mem_table[i].used = FALSE; |
} |
return (p); |
return(p); |
} |
|
WORD ll_free(void *p, DWORD s) |
WORD ll_free(void *p,DWORD s) |
{ |
register int i = 1; |
unsigned i1 = 0, i2 = 0; |
|
while (i < MAX_PARTITION && ((i1 == 0) || (i2 == 0))) { |
while (i < MAX_PARTITION && ((i1 == 0) || (i2 == 0)) ) { |
if (mem_table[i].used) { |
if (mem_table[i].addr + mem_table[i].size == p) |
i1 = i; |
if (mem_table[i].addr == (BYTE *) (p) + s) |
i2 = i; |
if (mem_table[i].addr + mem_table[i].size == p) i1 = i; |
if (mem_table[i].addr == (BYTE *)(p) + s) i2 = i; |
} |
i++; |
} |
92,22 → 88,21 |
if (i1 != 0 && i2 != 0) { |
mem_table[i1].size += mem_table[i2].size + s; |
mem_table[i2].used = FALSE; |
} else if (i1 == 0 && i2 != 0) { |
} |
else if (i1 == 0 && i2 != 0) { |
mem_table[i2].addr = p; |
mem_table[i2].size += s; |
} else if (i1 != 0 && i2 == 0) |
mem_table[i1].size += s; |
} |
else if (i1 != 0 && i2 == 0) mem_table[i1].size += s; |
else { |
i = 0; |
while (i < MAX_PARTITION && (mem_table[i].used == TRUE)) |
i++; |
if (i == MAX_PARTITION) |
return (FALSE); |
while (i < MAX_PARTITION && (mem_table[i].used == TRUE)) i++; |
if (i == MAX_PARTITION) return(FALSE); |
mem_table[i].addr = p; |
mem_table[i].size = s; |
mem_table[i].used = TRUE; |
} |
return (TRUE); |
return(TRUE); |
} |
|
void ll_mem_dump(void) |
114,8 → 109,6 |
{ |
register int i; |
for (i = 0; i < MAX_PARTITION; i++) { |
if (mem_table[i].used) |
message("Entry : [%d] Addr : %p Size : %ld\n", i, |
mem_table[i].addr, mem_table[i].size); |
if (mem_table[i].used) message("Entry : [%d] Addr : %p Size : %ld\n",i,mem_table[i].addr,mem_table[i].size); |
} |
} |