// A L T O E X E C U T I V E // SetTime.bcpl // Copyright Xerox Corporation 1979 // last edited by R. Johnsson, May 14, 1980 10:41 AM get "AltoDefs.d" get "sysdefs.d" get "streams.d" get "altofilesys.d" get "Time.d" get "ComStruct.bcpl" external [ WRITEUDT; FINDMONTH ] static [ char ] structure NTime: [ time word 2 zone: [ sign bit 1 hour bit 7 minute bit 8 ] beginDST word endDST word ] manifest lNTime = size NTime/16 structure EDB: // Ethernet Device Block [ status word interruptBit word inputFinishCount word collisionMagic word inputCount word inputPointer word outputCount word outputPointer word hostNumber word ] manifest [ edb = #600; output = 1; input = 2; reset = 3 ] structure Pup: [ eDest bit 8 eSource bit 8 eWord2 word pupLength word transportControl bit 8 pupType bit 8 pupID1 word pupID2 word destNet bit 8 destHost bit 8 destSocket1 word destSocket2 word sourceNet bit 8 sourceHost bit 8 sourceSocket1 word sourceSocket2 word // data xSum word // checksum ] manifest lPup = size Pup/16 //---------------------------------------------------------------------------- let SetTime(ISTREAM,DSTREAM; numargs na) be //---------------------------------------------------------------------------- [ if na ls 2 then DSTREAM = 0 if (StartIO(0)Ź) eq #377 % (DSTREAM ne 0 & IsSwitch($M)) then [ if (StartIO(0)Ź) eq #377 then SetNetNumber(0) ManualSetTime(DSTREAM) return ] unless NetworkSetTime(DSTREAM) do [ SetNetNumber(0); ManualSetTime(DSTREAM) ] ] //---------------------------------------------------------------------------- and IsSwitch(sw) = valof //---------------------------------------------------------------------------- [ if userParamsVec>>UPE.type eq globalSwitches then [ for i = 1 to userParamsVec>>UPE.length do if (userParamsVec!i & #137) eq sw then resultis true ] resultis false ] //---------------------------------------------------------------------------- and NetworkSetTime(DSTREAM) = valof //---------------------------------------------------------------------------- [ manifest inputCount = lPup+20 let request = vec lPup let answer = vec lPup+20 edb>>EDB.interruptBit = 0 let host = StartIO(reset) & 377b Zero(edb,size EDB/16) edb>>EDB.inputPointer = answer edb>>EDB.inputCount = inputCount edb>>EDB.outputPointer = request edb>>EDB.outputCount = 13 edb>>EDB.hostNumber = host Zero(request, lPup) request>>Pup.eSource = host request>>Pup.eWord2 = #1000 request>>Pup.pupLength = 22 request>>Pup.pupType = #206 // Alto time request (new standard) request>>Pup.destSocket2 = 4 request>>Pup.sourceHost = host request>>Pup.xSum = -1 for i = 1 to 3 do [ edb>>EDB.status = 0 edb>>EDB.collisionMagic = 0 request>>Pup.sourceSocket2 = realTimeClock!0 request>>Pup.pupID1 = realTimeClock!0 lshift 1 StartIO(output) let start = realTimeClock!0 [ if (edb>>EDB.status & #377) ne 0 then [ if (edb>>EDB.status & #177400) eq 0 & answer>>Pup.eWord2 eq #1000 & answer>>Pup.pupType eq #207 & // Alto time reply answer>>Pup.destHost eq host & edb>>EDB.inputFinishCount le inputCount - (lPup + lNTime) & answer>>Pup.pupLength ge 32 & answer>>Pup.destSocket2 eq request>>Pup.sourceSocket2 & answer>>Pup.pupID1 eq request>>Pup.pupID1 then [ let ltp = vec 1 ltp!0, ltp!1 = 0, 0 let nTime = lv answer>>Pup.xSum ltp>>LTP.sign = nTime>>NTime.zone.sign ltp>>LTP.zoneH = nTime>>NTime.zone.hour ltp>>LTP.zoneM = nTime>>NTime.zone.minute ltp>>LTP.beginDST = nTime>>NTime.beginDST ltp>>LTP.endDST = nTime>>NTime.endDST InstallTime(lv nTime>>NTime.time, ltp, DSTREAM eq 0) SetNetNumber(answer>>Pup.destNet) resultis true ] edb>>EDB.status = 0 StartIO(input) ] if realTimeClock!0-start > 13 then break ] repeat StartIO(reset) ] resultis false ] //---------------------------------------------------------------------------- and InstallTime(ptv, ltp, quiet) be //---------------------------------------------------------------------------- [ MoveBlock(timeParams, ltp, 2) SetCalendar(ptv) ShouldSetTime = false if quiet then return let s = OpenFile("Sys.Boot", ksTypeReadWrite, wordItem, verLatest, fpSysBoot) test s ne 0 ifso [ SetFilePos(s, 0, #775 lshift 1) Puts(s, timeParams!0) Puts(s, timeParams!1) Closes(s) ] ifnot WRITE("Unable to install time parameters in Sys.Boot.*n") WRITE("Date and time set to ") WRITEUDT(USERSTR, 0, true) WRITE($*n) ] //---------------------------------------------------------------------------- and ManualSetTime(DSTREAM) be //---------------------------------------------------------------------------- [ if DSTREAM eq 0 then return let ltp = vec 2 MoveBlock(ltp, timeParams, 2) let utv = vec lenUTV Zero(utv, lenUTV) let ptv = vec 2 let s = vec size QS/16 INITQ(s) let preload = vec size QS/16 INITQ(preload) [ EMPTYOUTQ(s) unless EDITCHARS(s, preload, "Enter date and time, e.g. *"4-Jul-76 15:00*": ") do [ WRITE($*n); return ] WRITE($*n) utv>>UTV.day = GetNumber(s) if char ne $- loop let name = vec 10 name!0 = 0 [ char = GETQF(s) unless (char ge $A & char le $Z) % (char ge $a & char le $z) break name>>STRING.length = name>>STRING.length + 1 name>>STRING.char↑(name>>STRING.length) = char ] repeat if char ne $- loop utv>>UTV.month = FINDMONTH(name) if utv>>UTV.month ls 0 loop utv>>UTV.year = GetNumber(s) if char ne $*s loop if utv>>UTV.year ls 1900 then utv>>UTV.year = utv>>UTV.year + 1900 utv>>UTV.hour = GetNumber(s) if char ne $: loop utv>>UTV.minute = GetNumber(s) if char eq $: then utv>>UTV.second = GetNumber(s) if char ne $*n loop if PACKDT(utv, ptv) ne 0 loop break ] repeat if timeParams!0 eq 0 % timeParams!1 eq 0 % IsSwitch($Z) then [ Zero(ltp, 2) EMPTYOUTQ(s) unless EDITCHARS(s, preload, "Enter local time zone (Eastern, Central, Mountain, Pacific, or*n + (west of Greenwich) or - (east) followed by *"hours:minutes*"): ") do [ WRITE($*n); return ] WRITE($*n) char = GETQF(s) switchon char into [ case $E: case $e: [ ltp>>LTP.zoneH = 5; endcase ] case $C: case $c: [ ltp>>LTP.zoneH = 6; endcase ] case $M: case $m: [ ltp>>LTP.zoneH = 7; endcase ] case $P: case $p: [ ltp>>LTP.zoneH = 8; endcase ] case $-: ltp>>LTP.sign = 1 case $+: [ let n = GetNumber(s) if n ls 0 % n gr 13 loop ltp>>LTP.zoneH = n if char eq $: then [ n = GetNumber(s) if n ls 0 % n gr 59 loop ltp>>LTP.zoneM = n ] if char ne $*n loop endcase ] default: loop ] ltp>>LTP.beginDST, ltp>>LTP.endDST = 121, 305 MoveBlock(timeParams, ltp, 2) PACKDT(utv, ptv) break ] repeat EMPTYOUTQ(s) InstallTime(ptv, ltp, false) ] //---------------------------------------------------------------------------- and GetNumber(s) = valof //---------------------------------------------------------------------------- [ let n = 0 let gotNumber = false [ char = GETQF(s) unless char ge $0 & char le $9 break n = 10*n + char-$0 gotNumber = true ] repeat unless gotNumber do char = 0 resultis n ]