mm init, newptr

This commit is contained in:
Kelvin Sherlock 2013-02-07 22:49:20 -05:00
parent 47b97b04fe
commit c8da211026
4 changed files with 93 additions and 6 deletions

View File

@ -9,3 +9,4 @@ add_definitions(-I ${CMAKE_SOURCE_DIR}/)
add_executable(mpw loader.cpp)
target_link_libraries(mpw CPU_LIB)
target_link_libraries(mpw TOOLBOX_LIB)
target_link_libraries(mpw MPLITE_LIB)

View File

@ -14,6 +14,8 @@
#include <cpu/fmem.h>
#include <toolbox/toolbox.h>
#include <toolbox/mm.h>
#include <mplite/mplite.h>
uint8_t *Memory;
uint32_t HighWater = 0x10000;
@ -467,7 +469,7 @@ int main(int argc, char **argv)
cpuSetALineExceptionFunc(ToolBox::dispatch);
memorySetMemory(Memory, MemorySize);
MM::Init(Memory, MemorySize, HighWater);
for (unsigned i = 0; i < 10000; ++i)
{

View File

@ -5,17 +5,74 @@
#include <cpu/fmem.h>
#include <string>
#include <deque>
#include <vector>
#include <map>
#include <mplite/mplite.h>
namespace
{
mplite_t pool;
uint8_t *Memory;
uint32_t MemorySize;
// queue of free Handles
std::deque<uint32_t> HandleQueue;
// map of ptr -> size
std::map<uint32_t, uint32_t> PtrMap;
// map of handle -> size [? just use Ptr map?]
std::map<uint32_t, uint32_t> HandleMap;
bool alloc_handle_block()
{
const unsigned HandleCount = 128;
uint8_t *block = (uint8_t *)mplite_malloc(&pool,
sizeof(uint32_t) * HandleCount);
if (!block) return false;
uint32_t hh = block - Memory;
uint32_t end = hh + 128 * sizeof(uint32_t);
for ( ; hh < end; hh += sizeof(uint32_t))
{
HandleQueue.push_back(hh);
}
return true;
}
}
namespace MM
{
bool Init(uint8_t *memory, uint32_t memorySize, uint32_t reserved)
{
int ok;
Memory = memory;
MemorySize = memorySize;
ok = mplite_init(&pool,
memory + reserved,
memorySize - reserved,
32,
NULL);
if (ok != MPLITE_OK) return false;
// allocate a handle block...
if (!alloc_handle_block()) return false;
return true;
}
uint16_t NewPtr(uint16_t trap)
{
/* on entry:
@ -32,8 +89,33 @@ namespace MM
fprintf(stderr, "%04x NewPtr(%08x)\n", trap, size);
cpuSetAReg(0, 0);
return memFullErr;
// todo -- separate pools for sys vs non-sys?
// todo -- NewPtr(0) -- null or empty ptr?
if (size == 0)
{
cpuSetAReg(0, 0);
return 0;
}
uint8_t *ptr = NULL;
ptr = (uint8_t *)mplite_malloc(&pool, size);
if (!ptr)
{
cpuSetAReg(0, 0);
return memFullErr;
}
if (clear)
{
std::memset(ptr, 0, size);
}
uint32_t mcptr = ptr - Memory;
PtrMap.emplace(std::make_pair(mcptr, size));
cpuSetAReg(0, mcptr);
return 0;
}

View File

@ -1,5 +1,5 @@
#ifndef __mpw_rm_h__
#define __mpw_rm_h__
#ifndef __mpw_mm_h__
#define __mpw_mm_h__
#include <cstdint>
@ -8,7 +8,9 @@ namespace MM
enum
{
memFullErr = -108
}
};
bool Init(uint8_t *memory, uint32_t memorySize, uint32_t reserved);
uint16_t NewPtr(uint16_t trap);
}