From d2b755f760ecc8474cc84a2e7d9c006d2fb1ddc0 Mon Sep 17 00:00:00 2001 From: Eric Swenson Date: Sun, 18 Dec 2016 13:57:34 -0800 Subject: [PATCH] Added TIME. Resolves #106. --- README.md | 1 + build/build.tcl | 4 + src/sysen2/time.27 | 707 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 712 insertions(+) create mode 100644 src/sysen2/time.27 diff --git a/README.md b/README.md index 649938be..718e0fb3 100644 --- a/README.md +++ b/README.md @@ -193,6 +193,7 @@ A list of [known ITS machines](doc/machines.md). - TECO, editor. - TELNET, Telnet client. - TELSER, Telnet/Supdup server. + - TIME, displays date/time/uptime and other info. - TIMOON, displays the time and phase of the moon. - TMPKIL, clean out old files in .TEMP.;. - TTLOC, Advertises physical location of logged in users. diff --git a/build/build.tcl b/build/build.tcl index 6b623bbe..bd8be729 100644 --- a/build/build.tcl +++ b/build/build.tcl @@ -597,6 +597,10 @@ respond "*" ":link sys;ts m,sys;ts mail\r" respond "*" ":link sys2;ts featur,sys;ts qmail\r" respond "*" ":link .info.;mail info,.info.;qmail info\r" +# TIME +respond "*" ":midas sys1;ts time_sysen2;time\r" +expect ":KILL" + # lisp respond "*" ":link l;fasdfs 1,lisp;.fasl defs\r" respond "*" ":link lisp;grind fasl,lisp;gfile fasl\r" diff --git a/src/sysen2/time.27 b/src/sysen2/time.27 new file mode 100644 index 00000000..ab46a502 --- /dev/null +++ b/src/sysen2/time.27 @@ -0,0 +1,707 @@ +TITLE TIME -- P. D. LEBLING (PDL) + +.MLLIT=1 + +A=1 +B=2 +C=3 +D=4 +E=5 +F=6 +G=7 + +MODE=10 +PDTIM=11 ; number seconds since start of year +RYEAR=12 ; various info about this year +RTIME=13 +RDATE=14 +RDTIM=15 ; how long system has been up +DIETI=16 ; when system will go down + +P=17 + +; mode bits + +%TIDE==1 +%POM==2 + +TYOC==2 + +DEFINE SECS D,H,M,S + >>>>> +TERMIN + +SPD== ; 24.*60.*60. + +PDL: BLOCK 40 + +RECORD: SETZ + SIXBIT/OPEN/ + [.UII,,17] + [SIXBIT/SYS/] + [SIXBIT/RECORD/] + SETZ [SIXBIT/TIME/] + +GETREC: SETZ + 'RFDATE + MOVEI 17 + SETZM A + +SETREC: SETZ + 'SFDATE + MOVEI 17 + SETZ A + +; val 1 The creation date of the file: +; 4.7-4.1 Year (mod 100.). +; 3.9-3.6 Month (January = 1). +; 3.5-3.1 Day of month. +; 2.9-1.1 Time of creation, in half-seconds +; after midnight. + +COMMND: BLOCK 10. + +START: MOVE P,[-40,,PDL] + .OPEN TYOC,[SIXBIT / !TTYXXXXXXYYYYYY/] + .VALUE + + .BREAK 12,[5,,COMMND] + SETZ MODE, + SKIPN COMMND ; none there? + JRST GATHER +; for the moment, any jcl means print all crap... + TLO MODE,%TIDE+%POM + +; gather ye rosebuds +GATHER: .RDATI RTIME, + .RLPDT PDTIM, ; also RYEAR into RYEAR + TLNE RYEAR,400000 ; if not leap year, after 2/28, back up a day + SUBI PDTIM,SPD + TLNE RYEAR,200000 ; if leap year, feb. has 29. days + AOS FEBRUA + TLNE RYEAR,100000 ; if daylight savings in effect, back up an hour + SUBI PDTIM,3600. + .CALL RDSYST + .VALUE + +; time + OASC [ASCIZ /The time is /] + +; hh:mm:ss + LDB A,[301400,,RTIME] + ROT A,-12. + OSIX A + OASCI ": + LDB A,[141400,,RTIME] + ROT A,-12. + OSIX A + OASCI ": + LDB A,[001400,,RTIME] + ROT A,-12. + OSIX A + +ifn 1,[ + ;; hack configured timezone + tlnn ryear,10000 ;TZ known? + jrst tz5 ;No, assume 5 = EST + ldb a,[230400,,ryear] ;Get absolute TZ + tlne ryear,4000 ;Negative? + movns a + skipa +tz5: movei a,5 + push p,b + hlrz b,tznam(a) ;Assume standard + tlne ryear,100000 ;DST? + hrrz b,tznam(a) ;Yes + skipe (b) + oasc [asciz / /] + oasc (b) + pop p,b + oascr [asciz /./] +] +.else [ +; est or edt? + MOVEI A,[ASCIZ / EDT./] + TLNN RYEAR,100000 + MOVEI A,[ASCIZ / EST./] + OASCR (A) +] + +; date + OASC [ASCIZ /Today is /] + +; day of week + LDB A,[320300,,RYEAR] + OASC @WEEK(A) + OASC [ASCIZ /day, the /] + +; day of month + LDB A,[001400,,RDATE] + CAIG A,(SIXBIT / 09/) + ANDI A,77 + MOVE B,A + ROT A,-6 + TRNE A,77 + JRST .-2 + OSIX A + MOVE A,B + ANDI A,17 ; units digit + ANDI B,1700 ; tens digit + CAIN B,100 + MOVEI A,0 + CAIL A,4 + MOVEI A,0 + OASC @SUFFIX(A) + +; month + OASC [ASCIZ / of /] + LDB B,[141400,,RDATE] + ANDI B,1700 + LSH B,-6 + IMULI B,10. + LDB A,[141400,,RDATE] + ANDI A,17 + ADD A,B + OASC @MONTHS-1(A) + +; year + OASC [ASCIZ /, /] + HRRZ A,RYEAR + ODEC A + OASCR [ASCIZ /./] + +; phase of the moon + TLNE MODE,%TIDE + PUSHJ P,POM ; phase of the moon + +; next and previous high tide in Boston Harbor + TLNE MODE,%POM + PUSHJ P,TIDE ; tides + +; uptime + OSIX SYSTEM + OASC [ASCIZ / ITS /] + OSIX SYSVER + OASC [ASCIZ / has run for /] + +; days, hours, minutes, seconds + MOVE A,RDTIM + PUSHJ P,PTIME + OASCR [ASCIZ /./] + +; see if record-breaking uptime +CHKREC: .CALL RECORD + JRST NOREC + .CALL GETREC + JRST NOREC + TLNE A,177000 + JRST NOREC ;SYSTEM DOESN'T STAY UP FOR YEARS ON END +;; LDB B,[220500,,A] ;GET NUMBER OF DAYS +;; BV: use more bits here (certainly we stay up more than 63 days) + ldb b,[221100,,a] ; Get up to 1023 days + IMULI B, + ADDI B,(A) ;B := PREVIOUS RECORD IN HALF SEC + IMULI B,15. ;CONVERT TO JIFFIES + CAML B,RDTIM + JRST OLDREC + MOVE A,RDTIM ;NEW RECORD! STORE ON DISK + IDIVI A,15. + IDIVI A, + HRLZ A,A ;DAYS IN LH + HRR A,B ;1/2 SECONDS IN RH + .CALL SETREC + JFCL + .CLOSE 17, + OASC [ASCIZ/Surpassing all previous /] + OSIX SYSTEM + OASCR [ASCIZ/ records for uptime!/] + JRST NOREC + +OLDREC: MOVE A,B + MOVE B,RDTIM + ADD B,[30.*3600.*30.] ;WITHIN 30 HOURS OF RECORD? + CAMG B,A + JRST NOREC + OASC [ASCIZ/Approaching the previous /] + OSIX SYSTEM + OASC [ASCIZ/ record of /] + PUSHJ P,PTIME + OASCR [ASCIZ/./] +NOREC: + +; sys down time + CAMN DIETI,[-1] + JRST CHKDBG ; not dying + CAMN DIETI,[-2] + JRST DEAD + OASC [ASCIZ /The system will go down in /] + +; days, etc. + MOVE A,DIETI + PUSHJ P,PTIME +CONTIN: OASCR [ASCIZ /./] + JRST CHKDBG + +DEAD: OASCR [ASCIZ /The system is down./] + +; being debugged? +CHKDBG: SKIPN DBGSW + JRST QUIT + OASCR [ASCIZ /The system is being debugged./] + +; exit +QUIT: .BREAK 16,140000 + + +PMONDA: PUSH P,A + PUSH P,B + ADDI A,1 +PMONIN: MOVSI B,-12. +PMONLP: CAMG A,MONLNG(B) + JRST PMOND1 + SUB A,MONLNG(B) + AOBJN B,PMONLP + JRST PMONIN +PMOND1: HRRZS B + OASC @MONTHS(B) + OASCI " + ODEC A + POP P,B + POP P,A + POPJ P, + +PDATE: PUSH P,A + PUSH P,B +; TLNE RYEAR,400000 ; if not leap year, after 2/28, back up a day +; ADDI A,SPD + TLNE RYEAR,100000 ; if daylight savings in effect, back up an hour + ADDI A,3600. + IDIVI A,SPD + PUSHJ P,PMONDA + OASC [ASCIZ ", "] + MOVE A,B + IDIVI A,3600. + ODEC A + MOVE A,B + IDIVI A,60. + OASCI ": + ODEC 2,A + MOVE A,B + OASCI ": + ODEC 2,A + POP P,B + POP P,A + POPJ P, + +PTIME: PUSH P,A + PUSH P,B + PUSH P,C + + CAIG A,15. + JRST PEPSI + ADDI A,15. + + SETZ C, + IDIV A,[30.*60.*60.*24.] + JUMPE A,PHOURS + ODEC A + MOVE C,A + OASC [ASCIZ / day/] + CAIE C,1 + OASCI "s + +PHOURS: MOVE A,B + IDIVI A,30.*60.*60. ; HOURS IN A + JUMPE A,PMINUT + JUMPE C,PHOUR1 + OASC [ASCIZ /, /] +PHOUR1: ODEC A + MOVE C,A + OASC [ASCIZ / hour/] + CAIE C,1 + OASCI "s + +PMINUT: MOVE A,B + IDIVI A,30.*60. ; MINS IN A+1 + JUMPE A,PSECON + JUMPE C,PMINU1 + OASC [ASCIZ /, /] +PMINU1: ODEC A + MOVE C,A + OASC [ASCIZ / minute/] + CAIE C,1 + OASCI "s + +PSECON: MOVE A,B + IDIVI A,30. ; SEC IN A+2 + JUMPE A,PTIMEX + JUMPE C,PSECO1 + OASC [ASCIZ /, /] +PSECO1: ODEC A + MOVE C,A + OASC [ASCIZ / second/] + CAIE C,1 + OASCI "s + JRST PTIMEX + +PEPSI: OASC [ASCIZ /a VERY short time/] + +PTIMEX: POP P,C + POP P,B + POP P,A + POPJ P, + +; days of week +WEEK: [ASCIZ /Sun/] + [ASCIZ /Mon/] + [ASCIZ /Tues/] + [ASCIZ /Wednes/] + [ASCIZ /Thurs/] + [ASCIZ /Fri/] + [ASCIZ /Satur/] + +; month table +MONTHS: [ASCIZ /January/] + [ASCIZ /February/] + [ASCIZ /March/] + [ASCIZ /April/] + [ASCIZ /May/] + [ASCIZ /June/] + [ASCIZ /July/] + [ASCIZ /August/] + [ASCIZ /September/] + [ASCIZ /October/] + [ASCIZ /November/] + [ASCIZ /December/] + +MONLNG: 31. +FEBRUA: 28. + 31. ? 30. ? 31. ? 30. ? 31. ? 31. ? 30. ? 31. ? 30. ? 31. + +; number suffixes +SUFFIX: [ASCIZ /th/] + [ASCIZ /st/] + [ASCIZ /nd/] + [ASCIZ /rd/] + +DEFINE TZONE STD,DST + [ASCIZ /STD/],,[ASCIZ /DST/] +TERMIN + repeat 12.-2,TZONE ;Dunno -3..-12 + tzone EET,EEST ;-2 + tzone CET,CEST ;-1 +tznam: TZONE GMT,BST ; 0 How to ask for British Summer Time?? + TZONE ; 1 + TZONE ; 2 + TZONE ; 3 (NST = Newfoundland is -0330) + TZONE AST,ADT ; 4 Atlantic + TZONE EST,EDT ; 5 Eastern + TZONE CST,CDT ; 6 Central + TZONE MST,MDT ; 7 Mountain + TZONE PST,PDT ; 8 Pacific + TZONE YST,YDT ; 9 Yukon + TZONE HST,HDT ; 10 Alaska-Hawaii + TZONE BST,BDT ; 11 Bering + REPEAT 24.-11.,TZONE ; 12-24 unspecified + + +; type out the phase of the moon + +POM: OASC [ASCIZ "The Moon is "] + PUSHJ P,GNDS0 ; get number of days since 1/1/0000 + MULI A,SPD ; convert to seconds in a and aa + JFCL 17,.+1 ; clear flags for following + ADD B,PDTIM ; # seconds since beginning of year + ADD B,SYNOFS ; moon doesn't quite believe in the gregorian calendar + JFCL 4,[AOJA A,.+1] ; cry1 + ASHC A,2 ; convert to quarter seconds + DIV A,SYNP ; divide by number of seconds in a period to get + ; number of quarters since then + ASH B,-2 ; convert remainder to seconds (# seconds into this + ; quarter) + EXCH B,A + IMULI A,30. ; expressed in 1/30ths of a second + PUSHJ P,PTIME + + ANDI B,3 ; get quarter in B + OASCR @PHASES(B) + POPJ P, + +PHASES: [ASCIZ " past new."] + [ASCIZ " beyond its first quarter."] + [ASCIZ " past full."] + [ASCIZ " into its last quarter."] + +SYNP: SECS 29.,12.,44.,3 + ; lunar month expressed in seconds (29d 12h 44m 2.7s) +SYNOFS: SECS 7.,23.,54.,42. + ; offset of lunar period in seconds (7d 23h 54m 42s) + ; (Basically, phase of the moon is reckoned from something + ; like 12/23 in 1 BC.) + +; type out the of the next high tide + +TIDE: PUSH P,A + PUSH P,B + MOVE A,PDTIM ; seconds so far this year + SUB A,TIDOFS ; first high tide this year was... + ASH A,1 ; convert to half seconds + IDIV A,TIDEP ; divide by number of seconds in a period to get + ; number of halves since then + IMUL A,TIDEP + MOVE B,A + ADD B,TIDEP + ASH A,-1 + ADD A,TIDOFS + OASC [ASCIZ /Last high tide: /] + PUSHJ P,PDATE + OASCR [0] + OASC [ASCIZ /Next high tide: /] + MOVE A,B + ASH A,-1 + ADD A,TIDOFS + PUSHJ P,PDATE + OASCR [0] + POP P,B + POP P,A + POPJ P, + +TIDTAB: MOVE B,TIDOFS + SETZ C, +TIDLUP: OALIGN 3,C + OHPOS 8. + MOVE A,B + PUSHJ P,PDATE + OASCR [0] + ADD B,TIDEP + AOJA C,TIDLUP + + +TIDEP: SECS 0,24.,49.,50. + ; time between successive high tides +TIDOFS: SECS 0,10.,38.,30. + ; offset of first high tide of 1976. + +; get number of days since 1/1/0000 (as of 1/1/current year) in a + +GNDS0: PUSH P,B + PUSH P,C + HRRZ C,RYEAR ; get year + MOVEI A,-1(C) ; also get year-1 in a + IMULI C,365. ; first approximation + IDIVI A,4 + ADD C,A ; add number of years divisible by 4 + IDIVI A,25. + SUB C,A ; subtract number of years divisible by 100 + IDIVI A,4 + ADD A,C ; add crud already calculated to number of years divisible + AOS A + POP P,C + POP P,B + POPJ P, ; by 400 + +; call block for .call /sstatu/ + +RDSYST: SETZ + 'SSTATU + MOVEM DIETI ; time til system down + MOVEM DBGSW' ; debug mode? + MOVEM ; users + MOVEM ; parerr+cornxm + MOVEM RDTIM ; time system up + MOVEM SYSTEM' ; sixbit /system-name/ + SETZM SYSVER' ; sixbit /system-version/ + + +; ================================================================ +; uuo handler (typeout uuos) +; ================================================================ + +ZZZ==. + LOC 40 + 0 + JSR UUOH + LOC ZZZ +UUOCT==0 +UUOTAB: JRST ILUUO + IRPS X,,[DEC BPTR OCT CTLP ASCC SIX ASC ASCI ASCR SIXS HPOS ALIGN SIGN] + UUOCT==UUOCT+1 + O!X=UUOCT_27. + JRST UO!X + TERMIN + +IFG UUOCT-37, PRINTC /---TOO MANY UUO'S---/ + +UUOMAX==.-UUOTAB + + +UUOD: 0 ; contents of UUO eff addr. +UUOE: 0 ; UUO effad. + +UUOH: 0 + PUSH P,A + PUSH P,B + PUSH P,C + PUSH P,D + MOVEI @40 ; get eff addr. of uuo + MOVEM UUOE + MOVE @0 + MOVEM UUOD ; contents of eff adr + MOVE B,UUOE ; eff adr + LDB A,[270400,,40] ; get uuo ac, + LDB C,[330600,,40] ; op code + CAIL C,UUOMAX + MOVEI C,0 ; grt=>illegal + JRST @UUOTAB(C) ; go to proper rout + +UUORET: POP P,D + POP P,C + POP P,B + POP P,A ; restore ac's + JRST 2,@UUOH + +ILUUO: .VALUE [ASCIZ /:ILLEGAL UUO/] + +UOBPTR: MOVEI C,0 + MOVE B,UUOD + JRST UOASC1 + +UOASCR: SKIPA C,[^M] ; cr for end of type +UOASC: MOVEI C,0 ; no cr + HRLI B,440700 ; make ascii pointer +UOASC1: ILDB A,B ; get char + JUMPE A,.+3 ; finish? + PUSHJ P,IOTA + JRST .-3 ; and get another + SKIPE A,C ; get saved cr? + PUSHJ P,IOTA + JRST UUORET + +UOASCC: HRLI B,440700 ; make ascii pointer +UOAS1C: ILDB A,B ; get char + CAIN A,^C + JRST UUORET + PUSHJ P,IOTA + JRST UOAS1C ; and get another + +UOCTLP: MOVEI A,^P + PUSHJ P,IOTA1 + +UOASCI: MOVE A,B ; prt ascii immediate + PUSHJ P,IOTA + JRST UUORET + +UOSIX: MOVE B,UUOD +USXOOP: JUMPE B,UUORET + LDB A,[360600,,B] + ADDI A,40 + PUSHJ P,IOTA + LSH B,6 + JRST USXOOP + +UOSIXS: MOVE A,[440600,,UUOD] +USLOOP: ILDB C,A + ADDI C,40 + PUSHJ P,IOTC + TLNE A,770000 + JRST USLOOP + JRST UUORET + +UOHPOS: SUB B,HPOS + SKIPG B + MOVEI B,1 ; always at least one space +UOHPO1: MOVEI A,40 + PUSHJ P,IOTA + SOJG B,UOHPO1 + JRST UUORET + +POWER: 0 ? 1 ? 10. ? 100. ? 1000. ? 10000. ? 100000. ? 1000000. + +UOSIGN: MOVM D,UUOD + ANDI A,7 + MOVE A,POWER-1(A) + MOVEI C,40 +UOSIG1: CAMLE A,D + PUSHJ P,IOTC + IDIVI A,10. + CAIE A,1 + JRST UOSIG1 + MOVEI A,"+ + SKIPGE UUOD + MOVEI A,"- + SKIPN UUOD + MOVEI A," + PUSHJ P,IOTA + SETZ A, + JRST UODEC + +UOALIG: MOVE D,UUOD + ANDI A,7 + MOVE A,POWER(A) + MOVEI C,40 +UOALI1: CAMLE A,D + PUSHJ P,IOTC + IDIVI A,10. + CAIE A,1 + JRST UOALI1 + SETZ A, + +UODEC: SKIPA C,[10.] ; get base for decimal +UOOCT: MOVEI C,8. ; octal base + MOVE B,UUOD ; get actual word to prt + JRST .+3 ; join code +UODECI: SKIPA C,[10.] ; decimal +UOOCTI: MOVEI C,8. + MOVEM C,BASE' + SKIPN A + HRREI A,-1 ; a=digit count + PUSHJ P,UONUM ; print numbr + JRST UUORET + +UONUM: IDIV B,BASE + HRLM C,(P) ; save digit + SOJE A,UONUM1 ; done if 0 + SKIPG A ; + => more + SKIPE B ; - => b=0 => done + PUSHJ P,UONUM ; else more +UONUM1: HLRZ C,(P) ; retreive digits + ADDI C,"0 ; make to ascii + CAILE C,"9 ; is it good dig + ADDI C,"A-"9-1 ; make hex digit + PUSHJ P,IOTC + POPJ P, ; ret + +IOTC: PUSH P,A + MOVE A,C + PUSHJ P,IOTA + POP P,A + POPJ P, + +HPOS: 0 ; line pos + +IOTA: CAIN A,^P + JRST [.IOT TYOC,["^] + ADDI A,100 + JRST IOTA1] + CAIN A,^J + POPJ P, +IOTA1: .IOT TYOC,A + CAIE A,^M + JRST IOTTAB + SKIPE SCRFLG' + .IOT TYOC,[^J] + SETZM HPOS + POPJ P, +; update line pos +IOTTAB: CAIN A,^I + JRST [MOVE A,HPOS + ADDI A,10 + ANDI A,7770 + MOVEM A,HPOS + POPJ P,] + AOS HPOS + POPJ P, + + END START + + \ No newline at end of file