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