From e72c6dfad556991becbd7d9548c6512a50fe2691 Mon Sep 17 00:00:00 2001
From: kolaente <k@knt.li>
Date: Sat, 20 Jun 2020 13:56:29 +0200
Subject: [PATCH] Add drive

---
 hal/paging.go | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/hal/paging.go b/hal/paging.go
index ce38223..acc7ed6 100644
--- a/hal/paging.go
+++ b/hal/paging.go
@@ -7,6 +7,7 @@ var defaultRegister uint16 = 0
 type Page struct {
 	Referenced      bool
 	RegisterAddress *uint16
+	Address         Address
 }
 
 // PageTable uses key as page number
@@ -18,6 +19,9 @@ type MMU struct {
 	PageTable   *PageTable
 	LoadedPages []*Page
 	Registers   []float64 // 4k registers
+
+	// pseudo hard drive which holds all pages
+	drive map[Address][]float64
 }
 
 func (address Address) PageNumber() uint16 {
@@ -45,13 +49,14 @@ func (table PageTable) Find(address Address) {
 	}
 }
 
+//
 func (mmu *MMU) Load(page *Page) {
 	if len(mmu.LoadedPages) >= 4 {
 		for index, loadedPage := range mmu.LoadedPages {
 			if loadedPage.Referenced {
 				continue
 			}
-			loadedPage.RegisterAddress = nil
+			mmu.movePageToDrive(loadedPage)
 			mmu.LoadedPages = append(mmu.LoadedPages[:index], mmu.LoadedPages[index+1:]...)
 			break
 		}
@@ -80,3 +85,12 @@ func (mmu *MMU) findEmptyRegisterAddress() *uint16 {
 
 	return &defaultRegister
 }
+
+func (mmu *MMU) movePageToDrive(page *Page) {
+
+	for i := 0; i < PageSize-1; i++ {
+		mmu.drive[page.Address][i] = mmu.Registers[i+int(*page.RegisterAddress)*PageSize]
+	}
+
+	page.RegisterAddress = nil
+}