+// (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);
+}
+