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