--- /dev/null
+\r
+#include "core.h"\r
+\r
+Memory SystemMemory;\r
+\r
+void Initialise_MemoryBlock(IO_MemoryControl *mainctrl)\r
+{\r
+ SystemMemory.addr = 0;\r
+ SystemMemory.size = 0;\r
+ SystemMemory.next = 0;\r
+ SystemMemory.ctrl = mainctrl;\r
+ SystemMemory.description[0] = 0x00;\r
+ return;\r
+}\r
+\r
+void *MemoryBlock_Allocate_System(uint size)\r
+{\r
+ Memory *block = MemoryControl_Allocate(SystemMemory.ctrl, sizeof(Memory));\r
+ uint *retaddr;\r
+\r
+ retaddr = &size;\r
+\r
+ if(block == 0){\r
+ Emergency_Out("[0x%08X]SysMemAlloc0 Failed.(%dBytes)", *(retaddr - 1), size);\r
+ debug("[0x%08X]SysMemAlloc0 Failed.(%dBytes)", *(retaddr - 1), size);\r
+ for(;;){\r
+ IO_HLT();\r
+ }\r
+ }\r
+\r
+ block->addr = MemoryControl_Allocate(SystemMemory.ctrl, size);\r
+\r
+ if(block->addr == 0){\r
+ Emergency_Out("[0x%08X]SysMemAlloc1 Failed.(%dBytes)", *(retaddr - 1), size);\r
+ debug("[0x%08X]SysmMemAlloc1 Failed.(%dBytes)", *(retaddr - 1), size);\r
+ for(;;){\r
+ IO_HLT();\r
+ }\r
+ }\r
+\r
+ block->size = size;\r
+ block->next = SystemMemory.next;\r
+ SystemMemory.next = block;\r
+ SystemMemory.size++;\r
+ block->ctrl = SystemMemory.ctrl;\r
+ block->description[0] = 0x00;\r
+ return block->addr;\r
+}\r
+\r
+void *MemoryBlock_Allocate_User(uint size, IO_MemoryControl *ctrl)\r
+{\r
+ Memory *block = MemoryControl_Allocate(SystemMemory.ctrl, sizeof(Memory));\r
+ uint *retaddr;\r
+\r
+ retaddr = &size;\r
+\r
+ if(block == 0){\r
+ Emergency_Out("[0x%08X]UsrMemAlloc0 Failed.(%dBytes)", *(retaddr - 1), size);\r
+ debug("[0x%08X]UsrMemAlloc0 Failed.(%dBytes)", *(retaddr - 1), size);\r
+ for(;;){\r
+ IO_HLT();\r
+ }\r
+ }\r
+\r
+ block->addr = MemoryControl_Allocate(ctrl, size);\r
+\r
+ if(block->addr == 0){\r
+ Emergency_Out("[0x%08X]UsrMemAlloc1 Failed.(%dBytes)", *(retaddr - 1), size);\r
+ debug("[0x%08X]UsrMemAlloc1 Failed.(%dBytes)", *(retaddr - 1), size);\r
+ for(;;){\r
+ IO_HLT();\r
+ }\r
+ }\r
+\r
+ block->size = (size + 7) & ~7;\r
+ block->next = SystemMemory.next;\r
+ SystemMemory.next = block;\r
+ SystemMemory.size++;\r
+ block->ctrl = ctrl;\r
+ block->description[0] = 0x00;\r
+ return block->addr;\r
+}\r
+\r
+Memory *MemoryBlock_Verify(void *addr)\r
+{\r
+ Memory *next;\r
+\r
+ for(next = &SystemMemory; next->next != 0; next = next->next){\r
+ if(next->next->addr == addr){\r
+ return next->next;\r
+ }\r
+ }\r
+ return 0;\r
+}\r
+\r
+int MemoryBlock_Write_Description(void *addr, const uchar *description)\r
+{\r
+ uint i;\r
+ Memory *block;\r
+\r
+ block = MemoryBlock_Verify(addr);\r
+\r
+ if(block){\r
+ for(i = 0; i < (MEMORY_DESCRIPTION_LENGTH - 1); i++){\r
+ if(description[i] == 0x00){\r
+ break;\r
+ }\r
+ block->description[i] = description[i];\r
+ }\r
+ block->description[i] = 0x00;\r
+ return i;\r
+ }\r
+ return -1;\r
+}\r
+\r
+int MemoryBlock_Free(void *addr)\r
+{\r
+ Memory *next, *block;\r
+\r
+ if(addr == 0){\r
+ return -1;\r
+ }\r
+\r
+ for(next = &SystemMemory; next->next != 0; next = next->next){\r
+ if(next->next->addr == addr){\r
+ block = next->next;\r
+ next->next = block->next;\r
+ if(MemoryControl_Free(block->ctrl, block->addr, block->size) != 0){\r
+ return -2;\r
+ }\r
+ if(MemoryControl_Free(SystemMemory.ctrl, block, sizeof(Memory)) != 0){\r
+ return -3;\r
+ }\r
+ SystemMemory.size--;\r
+ return 0;\r
+ }\r
+ }\r
+ return -1;\r
+}\r