Imported slu/mmu/interrupt/register code from WIP memtester program into C template.
[pdp11-modern-c] / pdp11 / pdp11_mmu.c
diff --git a/pdp11/pdp11_mmu.c b/pdp11/pdp11_mmu.c
new file mode 100644 (file)
index 0000000..32d5d27
--- /dev/null
@@ -0,0 +1,53 @@
+// (c) 2020 Aaron Taylor <ataylor at subgeniuskitty dot com>
+// See License.txt file for copyright and license details.
+
+#include <stdint.h>
+#include "pdp11_register.h"
+#include "pdp11_slu.h"
+
+void
+init_mmu(void)
+{
+
+    /*
+     * First populate the relocation registers, all zero since we want an
+     * identity mapping, except the highest page that we remap to the physical MMIO
+     * range.
+     */
+    SET(KISAR0,PAR_PAF,0000000);
+    SET(KISAR1,PAR_PAF,0000000);
+    SET(KISAR2,PAR_PAF,0000000);
+    SET(KISAR3,PAR_PAF,0000000);
+    SET(KISAR4,PAR_PAF,0000000);
+    SET(KISAR5,PAR_PAF,0000000);
+    SET(KISAR6,PAR_PAF,0000000);
+    SET(KISAR7,PAR_PAF,0177600);
+
+    /*
+     * Now populate the page descriptor registers. See EK-KDJ1B-UG page 1-19
+     * for details of each field.
+     */
+    uint16_t data = 0;
+    SET(data,PDR_BYPASCACHE,0);
+    SET(data,PDR_PAGELEN,0177);
+    SET(data,PDR_PAGEWRITEN,0);
+    SET(data,PDR_EXPANDDIR,0);
+    SET(data,PDR_ACCESSCTRL,03);
+
+    KISDR0 = data;
+    KISDR1 = data;
+    KISDR2 = data;
+    KISDR3 = data;
+    KISDR4 = data;
+    KISDR5 = data;
+    KISDR6 = data;
+    KISDR7 = data;
+
+    /*
+     * Enable the MMU with a 22-bit mapping.
+     */
+    SET(MMR3,MMR3_KRNSPLTID,0);
+    SET(MMR3,MMR3_EN_22BIT,1);
+    SET(MMR0,MMR0_EN_MMU,1);
+}
+