; -*-MIDAS-*- BY PHIL BUDNE@DEC -- INPUT A LINE AND ECHO.. TITLE ECHO .DECSAVE IFN .OSMIDAS-SIXBIT/TWENEX/, .FATAL TWENEX ONLY !! ECHO==.FVERS ;SAVE FILE GENERATION A==1 B==2 C==3 D==4 E==5 P==17 ;PDL POINTER PDLL==20 BUFL==20 CALL=PUSHJ P, RET=POPJ P, BEGIN: RESET MOVE P, [-PDLL,,PDL-1] CALL INIT ;INIT RANDOM LOCATIONS CALL DORESC ;SUCK UP INPUT LINE JRST QUIT ; SIGH ; DISPOSE UNTIL AFTER FIRST WHITE CHARACTER CLOP: CALL GETC JRST QUIT CAIE A, 40 CAIN A, ^I JRST PLOP JRST CLOP ECH: PBOUT ; PROCESS LOOP PLOP: CALL GETC JRST QUIT CAIN A, "% JRST FIND CAIE A, "' CAIN A, "" CALL .LIT JRST PLOP ; GOT A %, NOW DISPATCH ON NEXT CHAR FIND: CALL GETC JRST QUIT MOVE C, A ;MAKE A COPY CAIL C, "a CAILE C, "z TRNA SUBI C, "a-"A ;UPPER-CASE-IFY MOVSI B, -CHRL FLOP: CAME C, CHRTAB(B) AOBJN B, FLOP JUMPGE B, ECH ;NO ACTION FOUND, JUST ECHO XCT INSTAB(B) ;GOT IT!! JRST PLOP ;KEEP PROCESSING QUIT: MOVEI A, .PRIOU MOVE B, OLDMOD SFMOD HALTF JRST BEGIN DEFINE ACTIONS ACT "%, PBOUT ;ECHO % ACT "?, CALL .HELP ;GIVE THIS LIST ACT "^, CALL .CTL ;XLATE TO CTL CHAR ACT "', CALL .LIT ;ECHO STRING ACT "", CALL .LIT ;ECHO STRING ACT "A, CALL .DAY ;DATE W/ DOW ACT "D, CALL .DATE ;DATE ACT "J, CALL .JOB ;JOB NUMBER ACT "N, CALL .NEWL ;NEW LINE ACT "P, CALL .POM ;PHASE OF MOON ACT "T, CALL .TIME ;TIME ACT "U, CALL .UPTIME ;SYSTEM UP TIME ACT "Y, CALL .TTY ;TYPE TTY NUMBER ACT "Z, CALL .ZONE ;TIME WITH ZONE ACT "1, CALL .L1 ; 1 MIN LOAD AV ACT "2, CALL .L2 ; 5 MIN LOAD AV ACT "3, CALL .L3 ;15 MIN LOAD AV TERMIN DEFINE ACT CHR, INST CHR TERMIN CHRTAB: ACTIONS CHRL==.-CHRTAB DEFINE ACT CHR, INST INST TERMIN INSTAB: ACTIONS GETC: ILDB A, BP ;LOAD NEXT CHARACTER FROM BUFFER JUMPN A, RSKP ;NON-NULL; SKIP RET ;THE PARTYS OVER.. DORESC: SETZ A, ;READ FUNCTION RSCAN ;YANK BACK COMMAND R: RET ;SIGH JUMPE A, R ;EMPTY MOVE B, [440700,,BUF] ;INITIAL BYTE PTR MOVEM B, BP ;SAVE FOR GETC MOVE C, A ;GET CHAR COUNT MOVE D, A ;SAVE REAL COUNT CAILE C, BUFL*5-1 ;LARGER THAN BUFFER? MOVEI C, BUFL*5-1 ;YES, TRUNCATE ; B/ BP ; C/ CHARS LEFT IN BUFFER ; D/ CHARS LEFT IN RSCAN RLOP: PBIN ; INPUT A CHAR SOSL C ; ROOM IN BUFFER? IDPB A, B ; YES, SAVE SOJG D, RLOP ;UNTIL RSCAN EMPTY ; IF C < 0 TRUNCATION OCCURED SETZ A, ;TERMINATE WITH ^@ IDPB A, B RSKP: AOS (P) ; RET INIT: GJINF ;BASIC JOB INFO MOVEM A, UNO ;LOGIN NAME MOVEM B, DIRNO ;CONNECTED DIR (NOT USED) MOVEM C, JNO ;JOB NO MOVEM D, TNO ;TERM NO MOVEI A, .PRIOU RFMOD MOVEM B, OLDMOD RFMOD ; get current terminal mode TRZ B,TT%DAM SFMOD RET .TTY: SKIPG B, TNO ;POSITIVE? JRST [ HRROI A, [ASCIZ .DET.] ;NO PSOUT ;IS DETACHED RET ] MOVEI A, .PRIOU ;OUTPUT TO TTY MOVEI C, 10 ;OCTAL NOUT ;NUMBER TRN RET .JOB: MOVEI A, .PRIOU MOVE B, JNO MOVEI C, 10. NOUT TRN RET .UPTIME: TIME ;PICK UP SYSTEM UP-TIME IDIV A, B ;TURN INTO SECS MOVE B, A ;GET INTO MORE CONVENIENT PLACE MOVEI A, .PRIOU IDIVI B, 3600. ;NOW, GET HOURS PUSH P, C ;SAVE REMAINDER MOVEI C, 10. ;DECIMAL FORMAT NOUT ;HOURS INTO STRING TRN MOVEI B, ": ;FORMAT NICELY BOUT POP P, B ;GET BACK REMAINDER AFTER HOUR CALCULATION IDIVI B, 60. ;GET MINUTES PUSH P, C ;SAVE SECONDS (REMAINDER) MOVE C, [NO%LFL\NO%ZRO\<2,,0>\5+5] ;2 COLS, LEADING 0's NOUT ;MINUTES TRN MOVEI B, ": ;FORMAT NICELY BOUT POP P, B ;GET BACK SECONDS NOUT ;OUTPUT IT TRN RET SUBTTL TYPE POSSIBLE ACTIONS - HELP .HELP: HRROI A, [ASCIZ 'ECHO.'] PSOUT MOVEI A, .PRIOU MOVEI B, ECHO ;FILE VERSION MOVEI C, 10. ;OUTPUT DECIMAL NOUT TRN CALL .NEWL HRROI A, [ASCIZ .Type one of the following; .] PSOUT MOVSI B, -CHRL+1 ;ALL BUT THE LAST HLOP: MOVE A, CHRTAB(B) ;FETCH A CHAR PBOUT ;TYPE IT HRROI A, [ASCIZ ., .] ; PSOUT AOBJN B, HLOP ;LOOP MOVE A, CHRTAB+CHRL-1 ;TYPE THE LAST ONE PBOUT ; JRST .NEWL SUBTTL NEWLINE - NEWL .NEWL: HRROI A, [.BYTE 7 ? ^M ? ^J] PSOUT RET SUBTTL LOAD AVS - L1, L2, L3 .L1: MOVE A, [14,,.SYSTA] JRST FLOAD .L2: MOVE A, [15,,.SYSTA] JRST FLOAD .L3: MOVE A, [16,,.SYSTA] FLOAD: GETAB ERJMP R MOVE C, [FL%ONE\FL%PNT\20200] MOVE B, A MOVEI A, .PRIOU FLOUT TRN RET SUBTTL CONTROLIFY - CTL .CTL: CALL GETC JRST QUIT ANDI A, 37 PBOUT RET SUBTTL LITTERALY OUTPUT - LIT .LIT: MOVE D, A ;SAVE DELIM LLOP:: CALL GETC JRST QUIT CAMN A, D ;END? JRST R PBOUT JRST LLOP SUBTTL TIME OUTPUT - ZONE, DAY, TIME, DATE .ZONE: MOVSI C, (OT%NDA\OT%12H\OT%TMZ) ;NO DATE, AM/PM, ZONE JRST ODT ;FULL DOW, MONTH, YEAR, NO TIME, USE SPACES AND COMMAS .DAY: MOVSI C, (OT%DAY\OT%FDY\OT%FMN\OT%4YR\OT%DAM\OT%SPA\OT%NTM) JRST ODT .TIME: SKIPA C, [OT%NDA] ;IGNORE DATE .DATE: MOVSI C, (OT%NTM) ;IGNORE TIME ODT: MOVEI A, .PRIOU ;TO TTY SETO B, ;NOW ODTIM ERJMP .+1 RET SUBTTL POM -- STOLEN FROM ITS TECO .POM: GTAD SUB A, SYNOFS ;OFFSET TO NEAREST NEW MOON TO DAY 0 IDIV A, SYNP ;DIVIDE INTO QUARTER PERIODS ANDI A, 3 ;GET PERIOD HRROI A, PHSNMS(A) PSOUT ;TYPE ITS NAME MULI B, 24.*60.*60. ;CONVERT TO SECONDS LSH C, 1 ;FLUSH DUPLICATE SIGN BIT LSHC B, 17. ;GET ONE WORD PRODUCT MOVEI E, TDHMST TDHMS1: IDIVI B, @(E) JUMPE B, TDHMS2 HRLM C, (P) CALL [AOJA E, TDHMS1] ;INCREMENT AND RECURSE HLRZ C, (P) TDHMS2: MOVE B, C MOVEI A, .PRIOU MOVEI C, 10. NOUT JFCL HLLZ B, (E) HRROI A, B PSOUT SOJ E, POPJ P, PHSNMS: ASCII /NM+/ ASCII /FQ+/ ASCII /FM+/ ASCII /LQ+/ TDHMST: ASCII /S./+60. ASCII /M./+60. ASCII /H./+24. ASCII /D./+<,-1> SYNP: <29.53059&<777,,-1>>_-6 ;LENGTH OF QUARTER IN GTAD UNITS SYNOFS: 22,,253553 ;18 DAYS AND A BIT SUBTTL IMPURE STORAGE PDL: BLOCK PDLL ;PUSH DOWN LISP BP: BLOCK 1 ;BP INTO BUF BUF: BLOCK BUFL ;RESCAN BUFFER UNO: BLOCK 1 ;USER NUMBER DIRNO: BLOCK 1 ;CONNECTED DIR JNO: BLOCK 1 ;JOB NUMBER TNO: BLOCK 1 ;TTY NUMBER OLDMOD: BLOCK 1 ;TTY MODE WORD JUNK: END BEGIN