X-Git-Url: http://git.subgeniuskitty.com/pdp11-modern-c/.git/blobdiff_plain/846f4d60e4994a39decd6c27463411f53965fc60..202004d54803c861f7fbaa9169eaad750c63f7cf:/pdp11/pdp11_mmu.c diff --git a/pdp11/pdp11_mmu.c b/pdp11/pdp11_mmu.c new file mode 100644 index 0000000..32d5d27 --- /dev/null +++ b/pdp11/pdp11_mmu.c @@ -0,0 +1,53 @@ +// (c) 2020 Aaron Taylor +// See License.txt file for copyright and license details. + +#include +#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); +} +