// SwatVM.bcpl - virtual memory // Copyright Xerox Corporation 1980, 1982 // Last modified March 24, 1982 4:09 PM by Boggs get "Swat.decl" get "Altodefs.d" external [ // outgoing procedures VMSpace; VMFetch; VMStore; VMSwap; VMCache; VMPrint // incoming procedures CreateKVM; CreateNVM; ReportFail; StopSpy SymReset; DelAllBreaks; ResidentSwapIn; StackSwapIn PutTemplate; Wss; ReadString; StringCompare Allocate; Free; Zero; SetBlock; MoveBlock; Noop // outgoing statics vm // incoming statics sysZone ] static vm //---------------------------------------------------------------------------- structure CVM: // Core Virtual Memory //---------------------------------------------------------------------------- [ @VM userBank0 word // user's bank reg for task 0 ] manifest lenCVM = size CVM/16 //---------------------------------------------------------------------------- let VMSpace() be // ↑Z command //---------------------------------------------------------------------------- [ let string = ReadString("Target address space: "); if string eq 0 return let newVM = nil test StringCompare(string, "Bank0") eq 0 % StringCompare(string, "Bank1") eq 0 % StringCompare(string, "Bank2") eq 0 % StringCompare(string, "Bank3") eq 0 ifso newVM = CreateCVM(string) ifnot test string>>String.char↑1 eq $[ ifso newVM = CreateNVM(string) ifnot newVM = CreateKVM(string) StopSpy() DelAllBreaks() SymReset() (vm>>VM.destroy)(vm) vm = newVM StackSwapIn() ResidentSwapIn() ] //---------------------------------------------------------------------------- and VMFetch(addr) = (vm>>VM.fetch)(vm, addr) //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- and VMStore(addr, val) be (vm>>VM.store)(vm, addr, val) //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- and VMSwap() be (vm>>VM.swap)(vm) //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- and VMCache(action) be (vm>>VM.cache)(vm, action) //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- and VMPrint(stream, verbose) be //---------------------------------------------------------------------------- [ PutTemplate(stream, "Address space: $S", vm>>VM.name) if verbose then (vm>>VM.print)(vm, stream) ] //---------------------------------------------------------------------------- and CreateCVM(string) = valof //---------------------------------------------------------------------------- [ let bank = selecton string>>String.char↑(string>>String.length) into [ case $0: 0 case $1: 1 case $2: 2 case $3: 3 default: -1 ] if bank eq -1 then ReportFail(" ??") let machineType = (table [ 61014b; 1401b ])()<<VERS.eng if bank ne 0 then unless machineType eq 3 % machineType eq 5 do ReportFail("This machine does not have extended memory") let cvm = Allocate(sysZone, lenCVM) SetBlock(cvm, Noop, lenVM) cvm>>VM.destroy = CVMDestroy cvm>>VM.name = string cvm>>VM.type = vmTypeCore test bank eq 0 ifso [ cvm>>VM.fetch = Bank0Fetch cvm>>VM.store = Bank0Store ] ifnot [ cvm>>VM.fetch = XMFetch cvm>>VM.store = XMStore cvm>>CVM.userBank0 = bankRegs!0 bankRegs!0 = bank ] MoveBlock(cursorBitMap, table [ 100000b; 140000b; 160000b; 170000b; 174000b; 176000b; 177000b; 170000b; 154000b; 114000b; 006000b; 006000b; 003000b; 003000b; 001400b; 001400b ], 16) resultis cvm ] //---------------------------------------------------------------------------- and Bank0Fetch(cvm, addr) = @addr //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- and Bank0Store(cvm, addr, val) be @addr = val //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- and XMFetch(cvm, addr) = (table [ 61025b; 1401b ])(nil, addr) //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- and XMStore(cvm, addr, val) be (table [ 61026b; 1401b ])(val, addr) //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- and CVMDestroy(cvm) be //---------------------------------------------------------------------------- [ bankRegs!0 = cvm>>CVM.userBank0 Free(sysZone, cvm>>CVM.name) Free(sysZone, cvm) ]