; -*-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)			;<SKIP>
	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 ., .]	; <COMMA> <SPACE>
	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
