summaryrefslogtreecommitdiffstats
path: root/sw/z80/kernel/memory.c
diff options
context:
space:
mode:
Diffstat (limited to 'sw/z80/kernel/memory.c')
-rw-r--r--sw/z80/kernel/memory.c32
1 files changed, 26 insertions, 6 deletions
diff --git a/sw/z80/kernel/memory.c b/sw/z80/kernel/memory.c
index bcda3c3..cda62ca 100644
--- a/sw/z80/kernel/memory.c
+++ b/sw/z80/kernel/memory.c
@@ -1,13 +1,13 @@
#include "memory.h"
-struct page pages_table[PAGES_MAX_COUNT];
+static struct page pages_table[PAGES_MAX_COUNT];
int mmu_write_table(void)
{
int i;
for (i = 0; i < PAGES_MAX_COUNT; i++) {
- if (pages_table[i].used) {
+ if (pages_table[i].pid != 0) {
// write to mmu table
}
}
@@ -15,18 +15,37 @@ int mmu_write_table(void)
return 0;
}
+int page_new(void)
+{
+ int i, addr, used;
+ for (addr = ADDR_PAGE_FIRST; addr < ADDR_PAGE_LAST; addr += PAGE_SIZE) {
+ used = 0;
+
+ for (i = 0; i < PAGES_MAX_COUNT; i++) {
+ if (page_map[i].addr == addr) {
+ used = 1;
+ break;
+ }
+ }
+
+ if (!used)
+ return i;
+ }
+
+ return -1;
+}
+
int page_map(int page, int pid, uint16_t addr)
{
if (page >= PAGES_MAX_COUNT)
return -1;
- if (pages_table[page].used)
+ if (pages_table[page].pid != 0)
return -2;
pages_table[page].addr = addr;
pages_table[page].pid = pid;
- pages_table[page].used = 1;
return 0;
}
@@ -35,10 +54,11 @@ int page_unmap(int page)
if (page >= PAGES_MAX_COUNT)
return -1;
- if (pages_table[page].used == 0)
+ if (pages_table[page].pid == 0)
return -2;
- pages_table[page].used = 0;
+ pages_table[page].pid = 0;
+ pages_table[page].addr = 0;
return 0;
}