Add drive

master
kolaente 5 years ago
parent c970c99ade
commit e72c6dfad5
Signed by: kolaente
GPG Key ID: F40E70337AB24C9B
  1. 16
      hal/paging.go

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

Loading…
Cancel
Save