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 +}