Google
 

Trailing-Edge - PDP-10 Archives - bb-k345a-sb - lnm.mac
There are 5 other files named lnm.mac in the archive. Click here to see a list.
	TITLE	LNM - TYPE CURRENT LOG NAMES FOR JOBS
;		---------------------------------------------------
;
	SEARCH	MACTEN,UUOSYM	; SEARCH STANDARD CUSP PARAMETERS
	SALL			; CLEAN UP THE LISTING
;

	 ; REGISTER DEFINITIONS
	 ;
F=	0			; SOME FLAGS
C=	1			; FOR CHARACTERS
M=	2			; JOB NUMBER MAXIMUM
T1=	3			; T TYPE REGISTERS
T2=	T1+1
T3=	T2+1
Q1=	T3+1			; Q TYPE REGISTERS
Q2=	Q1+1
Q3=	Q2+1
P1=11
P2=12
P==	17			; THE STACK POINTER

	 ; MORE DEFINITIONS
	 ;
F.EOL==	1B35			; ON IF SAW END-OF-LINE
F.NOP==	1B34			; ON IF SUPPRESSING OPERATOR JOBS


SWP==2000
JLOG==	4			; JOB LOGGED IN STATUS BIT

STKSIZ==^D20			; OUR STACK SIZE

X.EOL==1B<.CHLFD>!1B<.CHESC>!1B<.CHFFD>!1B<.CHBEL>!1B<.CHVTB>
				; END OF LINE CHARACTERS

;DEF'NS FOR PAGE. 
UPTPAG==376
UPT==376000
SPYPAG==377
SPY==377000
LNMPAG==375
LNM==375000
	 ; HERE WE GO!
	 ;
WHO::	JFCL			; ALLOW CCL ENTRY
	MOVE	[27,,113]
	GETTAB			;FIND RELATIVE LOC ON .UPLNM
	  MOVEI	774		;PRE 332 LOAD
	ADDI	376000		; +UPMP LOC
	MOVEM	LNMLOC
	MOVE	P,[IOWD STKSIZ,STACK]	; INITIALIZE A STACK POINTER
	CLEAR	F,		; CLEAR THE FLAGS
	MOVE	T1,[POINT 7,TTYBUF]	; INITIALIZE TTY BUFFER
	MOVEM	T1,TTYPTR	; POINTER AND...
	MOVEI	T1,^D80		; THE COUNT
	MOVEM	T1,TTYCNT
	 ;
	PJOB	T1,		; GET THIS JOB NUMBER
	MOVEM	T1,MYJOB	; SAVE IT FOR DOT REFERENCE
	 ;
	MOVX	M,%CNSJN	; GET THE NUMBER OF...
	GETTAB	M,		; JOBS ALLOWED ON THE SYSTEM
	JRST	BADERR		; OOPS!
	HRRE	M,M		; ISOLATE JOB COUNT AND EXTEND SIGN
	JUMPLE	M,DONE		; FOR VERY SMALL SYSTEMS!
	SUBI	M,1		; DECR. COUNT TO EXCLUDE NULL JOB...
	 ;
	MOVX	T1,%CNPTY	; GET THE PTY...
	GETTAB	T1,		; OFFSET
	JRST	BADERR		; SHOULD NOT HAPPEN
	HLRZM	T1,PTYOFF	; SAVE OFFSET
	 ;
	MOVX	Q1,%CNLNM	; GET THE NUMBER...
	GETTAB	Q1,		; OF JOBS LOGGED IN
	JRST	BADERR		; SHOULD NOT HAPPEN
	PUSHJ	P,DPRNT		; PRINT IN DECIMAL
	 ;
	MOVEI	Q1,[ASCIZ/ jobs in use out of /]
	PUSHJ	P,PSTRG		; PRINT MESSAGE
	HRRZ	Q1,M		; TELL HOW MANY THERE ARE
	PUSHJ	P,DPRNT		; ...
	 ;
	MOVNS	M		; GET NEGATIVE MAX NUMBER OF JOBS
	HRLS	M		; PUT IN LH
	HRRI	M,1		; NOW WE HAVE -M,,1
	TXO	F,F.NOP		; WE DON'T WANT OPERATOR JOBS
	MOVEI	Q1,[ASCIZ/.
Job   Who        Program Line      PPN
/]
	PUSHJ	P,PSTRG		; FINISH FIRST MESSAGE & PRINT HEADER
	 ;
LOOP2:	HRRZ	T1,M		; NEXT JOB NUMBER TO T1
	PUSHJ	P,PWHO		; PRINT THIS WHO LINE
	AOBJN	M,LOOP2		; LOOP TILL DONE

	 ; HERE WHEN DONE
	 ;
DONE:	PUSHJ	P,FORCE		; DUMP THE TTY BUFFER
	HRROI	T1,.GTSTS
	GETTAB	T1,
	SETO	T1,
	TLNN	T1,JLOG		; IS THIS JOB LOGGED IN?
	JRST	DONE1		; NOPE--NEED TO EXIT WITH LOGOUT
	MONRT.			; YES--EXIT QUIETLY
	JRST	WHO		; DO IT AGAIN IT CONT IS TYPED
	 ;
DONE1:	OUTSTR	[ASCIZ/
.KJOB
./]
	SETZM	.JBREN##	; CAN'T REEENTER ANYMORE
	LOGOUT			; EXIT

	 ; HERE FOR ERRORS
	 ;
BADERR:	MOVEI	Q1,[ASCIZ/
? Unexpected error
/]				; BAD ERROR
	JRST	ERR1		; MERGE BELOW
ERROR:	MOVEI	C,"?"		; START MESSAGE
	PUSHJ	P,PCHAR
	MOVEI	C,0		; MAKE A STRING OUT OF INPUT...
	IDPB	C,LINPTR	;  WE USED SO FAR
	MOVEI	Q1,LINBUF	; POINT TO THAT STRING
	PUSHJ	P,PSTRG		; OUTPUT IT
	MOVEI	Q1,[BYTE(7)"?",15,12]	; GET REST AND MERGE
	 ;
ERR1:	PUSHJ	P,PSTRG		; PUBLISH THE SURPRISE
	CLEAR	Q2,		; MAKE SURE JACCT IS CLEAR
	SETNAM	Q2,		; BY CLEARING THE NAME
	JRST	DONE		; FINISH UP
	SUBTTL	SUBROUTINE TO PRINT WHO LINE
;		----------------------------

;  WHO -- ROUTINE TO PRINT A LINE OF WHO INFORMATION.  CALLING 
;  SEQUENCE IS
;
;	MOVE	T1,JOB#
;	PUSHJ	P,PWHO
;	RETURN
;
;  OPERATOR JOBS ARE SUPPRESSED IF F.NOP IS ON.
;
PWHO:	HRLZ	Q1,T1		; JOB# IN LH OF Q1 FOR GETTAB
	HRRI	Q1,.GTSTS	; JOB STATUS TABLE
	GETTAB	Q1,		; SUCK IN TABLE ENTRY
	JRST	BADERR		; YIPE!
	 ;
	TLNN	Q1,SWP
	TLNN	Q1,JLOG		; IS JOB LOGGED IN ?
	POPJ	P,		; NOPE, JUST RETURN
	CAMN	T1,MYJOB
	POPJ	P,
	 ;
	HRLZ	T2,T1		; JOB # IN T2 AND...
	HRRI	T2,.GTPPN	; TABLE # FOR PPN'S
	GETTAB	T2,		; GET-UM
	JRST	BADERR		; WHY ME?
	 ;
	HRLZ	Q1,T1
	HRRI	Q1,.GTUPM
	GETTAB	Q1,
	  JRST	BADERR
	HRRZS	Q1
	JUMPE	Q1,CPOPJ
	HRLM	Q1,UPTBLK+1
	MOVE	T3,[11,,DELUPT]
	PAGE.	T3,
	  JFCL
	MOVE	T3,[11,,UPTBLK]
	PAGE.	T3,200000
	  HALT
	SKIPN	P1,@LNMLOC
	POPJ	P,
PWHO1:	MOVE	Q1,T1		; START WITH THE JOB NUMBER
	MOVE	C,[2,," "]	; PAD WITH SPACES
	PUSHJ	P,DPRNT		; PRINT THE JOB NUMBER
	 ;
	PUSHJ	P,PSPAC		; SEPARATE WITH A SPACE
	PUSHJ	P,PSPAC		; AND ANOTHER ONE
	 ;
	HRLZ	Q1,T1		; AGAIN WE SET..
	HRRI	Q1,.GTNM1	; UP Q1 FOR GETTAB
	GETTAB	Q1,		; GET FIRST PART OF USER'S NAME
	JRST	BADERR		; GAK!
	PUSHJ	P,SPRNT		; PRINT IT
	 ;
	HRLZ	Q1,T1		; THE SAME OLD...
	HRRI	Q1,.GTNM2	; STUFF FOR THE...
	GETTAB	Q1,		; SECOND PART OF THE NAME
	JRST	BADERR		; GAK! (AGAIN)
	PUSHJ	P,SPRNT		; PRINT
	 ;
	PUSHJ	P,PSPAC		; ANOTHER SPACE
	 ;
	HRLZ	Q1,T1		; GET JOB NUMBER AGAIN
	HRRI	Q1,.GTPRG	; GETTAB FOR PROGRAM NAME
	GETTAB	Q1,		; GET NAME OF PROGRAM HE'S RUNNING
	 JRST	BADERR		; OOPS
	PUSHJ	P,SPRNT		; PRINT IT
	 ;
	PUSHJ	P,PSPAC		; PRINT A SPACE
	PUSHJ	P,PSPAC		; AND ANOTHER
	 ;
	MOVE	Q1,T1		; JOB NUMBER TO Q1...
	TRMNO.	Q1,		; AND GET THE TERMINAL NUMBER
	JRST	TDET		; MUST BE DETACHED JOB
	GETLCH	Q1		; GET LINE CHARACTERISTICS
	TXNE	Q1,GL.CTY	; IS IT THE CTY?
	JRST	TCTY		; YES!
	MOVE	C,[4,," "]	; NO--ASSUME A TTY
	TXNN	Q1,GL.ITY	; IS THIS A PTY?
	JRST	PWHO2		; NOPE--WE WERE RIGHT
	 ;
	ANDI	Q1,777		; YES--CLEAN UP AND
	SUB	Q1,PTYOFF	;  MAKE A PTY NUMBER
	CAIGE	Q1,100		; PAD THE...
	PUSHJ	P,PCHAR		; PTY NUMBER...
	CAIGE	Q1,10		; JUST A...
	PUSHJ	P,PCHAR		; LITTLE BIT
	MOVEI	C,"P"		; GET A "P"
	PUSHJ	P,PCHAR		; PRINT IT
	CLEAR	C,		; NO MORE PADDING
	JRST	PWHO2		; GO PRINT PTY NUMBER
	 ;
TDET:	MOVEI	Q1,[ASCIZ/ DET/]; HERE IF JOB IS DETACHED
	SKIPA
TCTY:	MOVEI	Q1,[ASCIZ/ CTY/]; HERE IF JOB IS AT THE CTY
	PUSHJ	P,PSTRG		; PRINT INDICATOR
	JRST	PWHO3		; MERGE BELOW

PWHO2:	ANDI	Q1,777		; INSURE CLEAN TERMINAL NUMBER
	PUSHJ	P,OPRNT		; TERMINAL # IS OCTAL
PWHO3:	PUSHJ	P,PSPAC		; SPIT OUT A BLANK
	 ;
	HLRZ	Q1,T2		; PROJECT NUMBER TO Q1
	MOVE	C,[6,," "]	; PAD WITH SPACES
	PUSHJ	P,OPRNT		; PRINT IT IN OCTAL
	MOVEI	C,","		; SEPARATE WITH...
	PUSHJ	P,PCHAR		;  A COMMA
	HRRZ	Q1,T2		; DITTO FOR PROGRAMMER NUMBER
	CLEAR	C,		; NO PADDING
	PUSHJ	P,OPRNT		; ...
	 ;
	MOVE	T3,[11,,DELLNM]
	PAGE.	T3,
	  JFCL
	MOVE	T3,P1
	PUSHJ	P,VRT2PH
	HRLM	T3,LNMBLK+1
	MOVE	T3,[11,,LNMBLK]
	PAGE.	T3,200000
	  HALT
	ANDI	P1,777
	ADDI	P1,LNM
	PUSHJ	P,PCRLF
PWHO4:	SKIPN	P2,(P1)
	POPJ	P,
	MOVE	T3,P2
	PUSHJ	P,VRT2PH
	HRLM	T3,FUNBLK+1
	MOVE	T3,[11,,DELSPY]
	PAGE.	T3,
	  JFCL
	MOVE	T3,[11,,FUNBLK]
	PAGE.	T3,200000
	  HALT
	MOVE	T3,P2
	ANDI	P2,777
	ADDI	P2,SPY
	SKIPGE	T3
	SKIPA	C,[5,," "]
	MOVE	C,[6,," "]
	PUSHJ	P,PRPAD
	  JFCL
	MOVEI	C,"*"
	SKIPGE	T3
	PUSHJ	P,PCHAR
	MOVE	Q1,(P2)
	CAMN	Q1,[-1]
	MOVE	Q1,[SIXBIT /LIB*/]
	PUSHJ	P,SPRNT
	MOVEI	Q1,[ASCIZ /:=/]
	PUSHJ	P,PSTRG
PWHO5:	MOVE	Q2,1(P2)
	PUSHJ	P,LPRNT
	MOVEI	Q1,[ASCIZ /:[/]
	PUSHJ	P,PSTRG
	SETO	C,
	HLRZ	Q1,2(P2)
	PUSHJ	P,OPRNT
	MOVEI	C,","
	PUSHJ	P,PCHAR
	HRRZ	Q1,2(P2)
	SETO	C,
	PUSHJ	P,OPRNT
	ADDI	P2,3
PWHO6:	SKIPN	Q2,(P2)
	JRST	PWHO7
	MOVEI	C,","
	PUSHJ	P,PCHAR
	PUSHJ	P,LPRNT
	AOJA	P2,PWHO6
PWHO7:	MOVEI	C,"]"
	PUSHJ	P,PCHAR
	SKIPN	1(P2)
	JRST	PWHO8
	MOVEI	C,","
	PUSHJ	P,PCHAR
	JRST	PWHO5
PWHO8:	PUSHJ	P,PCRLF
	AOJA	P1,PWHO4
PCRLF:	MOVEI	Q1,[BYTE(7)15,12]; FINALLY, CRLF...
	PJRST	PSTRG		; OUTPUT IT AND RETURN
VRT2PH:	HRRZS	T3
	LSH	T3,-11
	ADDI	T3,440
	ROT	T3,-1
	TLZE	T3,400000
	TLOA	T3,001500
	TLO	T3,221500
	ADDI	T3,UPT
	LDB	T3,T3
	POPJ	P,
	SUBTTL	OUTPUT ROUTINES
;		---------------

;  DPRNT -- PRINT DECIMAL NUMBER WITH LEFT PADDING.
;  OPRNT -- PRINT OCTAL NUMBER WITH LEFT PADDING.
;  CALLING SEQUENCE FOR THE ABOVE IS:
;
;	MOVE	Q1,NUMBER
;	MOVE	C,[FIELD SIZE,,PAD CHARACTER]
;	PUSHJ	P,-PRNT
;	RETURN
;
OPRNT:	SKIPA	Q3,[^D8]	; OCTAL
DPRNT:	MOVEI	Q3,^D10		; DECIMAL
PRNT1:	SUB	C,[1,,0]	; DECREMENT FIELD WIDTH
	IDIV	Q1,Q3		; DIVIDE BY PROPER BASE
	HRLM	Q2,(P)		; STASH REMAINDER
	SKIPN	Q1		; DONE YET ?
	PUSHJ	P,PRPAD		; YES--PRINT PADDING AND SKIP
	PUSHJ	P,PRNT1		; NO, CONTINUE RECURSIVELY
	HLRZ	C,0(P)		; RETRIEVE A CHARACTER
	ADDI	C,"0"		; CONVERT TO ASCII
	PJRST	PCHAR		; OUTPUT IT AND UNWIND

;  PRPAD -- PRINT PADDING CHARACTER.  CALLING SEQUENCE IS
;
;	MOVE	C,[NUMBER OF CHARACTERS,,PAD CHARACTER]
;	PUSHJ	P,PRPAD
;	NEVER RETURNS HERE
;	ALWAYS GIVES SKIP RETURN
;
PRPAD:	HLRE	Q1,C		; GET NUMBER OF CHARACTERS
	SOJL	Q1,CPOPJ1	; QUIT WHEN DONE
	PUSHJ	P,PCHAR		; PRINT CHARACTER
	JRST	.-2		; CONTINUE
CPOPJ1:	AOS	(P)		; SET TO GIVE SKIP RETURN
	POPJ	P,		; RETURN

;  SPRNT -- PRINTS THE 6 SIXBIT CHARACTERS IN Q1.  CALLING
;  SEQUENCE IS
;
;	MOVE	Q1,WORD OF SIXBIT
;	PUSHJ	P,SPRNT
;	RETURN
;
SPRNT:	MOVEI	Q3,6		; THERE ARE 6 CHARACTERS
SPRNT1:	ROTC	Q1,6		; ROTATE A SIXBIT CHAR TO Q2
	ANDI	Q2,77		; CLEAN IT UP
	MOVEI	C," "(Q2)	; CONVERT TO ASCII AND PUT IN C
;	CAIL	C,"A"		; FOLD TO LOWER CASE OF COURSE!
;	CAILE	C,"Z"
;	 SKIPA			; DAMN IT
;	ADDI	C,40		; MAKE IT PRETTY
	PUSHJ	P,PCHAR		; OUTPUT IT
	SOJG	Q3,SPRNT1	; CONTINUE FOR 6 CHARACTERS
	POPJ	P,		; RETURN

LPRNT:	SETZ	Q1,
	LSHC	Q1,6
	SKIPN	C,Q1
	POPJ	P,
	ADDI	C," "
	PUSHJ	P,PCHAR
	JRST	LPRNT

;  PSTRG -- PRINT AN ASCIZ STRING.  CALLING SEQUENCE IS
;
;	MOVEI	Q1,ADDR OF STRING
;	PUSHJ	P,PSTRG
;	RETURN
;
;  USES C.
;
PSTRG:	HRLI	Q1,(POINT 7)	; MAKE A BYTE POINTER
PSTRG1:	ILDB	C,Q1		; GET A CHARACTER
	JUMPE	C,CPOPJ		; RETURN IF DONE
	PUSHJ	P,PCHAR		; OTHERWISE OUTPUT IT
	JRST	PSTRG1		; AND CONTINUE

;  PSPAC -- PRINT A SPACE.  CALLING SEQUENCE IS
;
;	PUSHJ	P,PSPAC
;	RETURN
;
PSPAC:	MOVEI	C," "		; GET A SPACE
;	PJRST	PCHAR		; FALL INTO PCHAR

;  PCHAR -- PRINT A CHARACTER.  CALLING SEQUENCE IS
;
;	MOVE	C,CHARACTER
;	PUSHJ	P,PCHAR
;	RETURN
;
;  PRESERVES ALL AC'S.
;
PCHAR:	SOSG	TTYCNT		; DECREMENT AND TEST COUNT
	PUSHJ	P,FORCE		; DUMP BUFFER
	IDPB	C,TTYPTR	; STASH CHARACTER
	POPJ	P,		; RETURN

;  FORCE -- DUMP TTY BUFFER.  CALLING SEQUENCE IS
;
;	PUSHJ	P,FORCE
;	RETURN
;
;  PRESERVES ALL AC'S.
;
FORCE:	PUSH	P,C		; SAVE C
	MOVEI	C,0		; GET A ZERO CHARACTER
	IDPB	C,TTYPTR	; DEPOSIT IT
	OUTSTR	TTYBUF		; DUMP STRING
	MOVE	C,[POINT 7,TTYBUF]	; GET NEW POINTER
	MOVEM	C,TTYPTR	; INSERT IT
	MOVEI	C,^D80		; GET NEW COUNT...
	MOVEM	C,TTYCNT	; AND INSERT IT
	POP	P,C		; RESTORE C
CPOPJ:	POPJ	P,		; RETURN
	SUBTTL	INPUT ROUTINES
;		--------------

;  GETLIN -- READ A LINE OF INPUT INTO THE LINE BUFFER AND SET UP LINPTR
;  AND LINCNT.  GETS EVERYTHING UP TO A VERTICAL MOTION CHARACTER.
;  CALLING SEQUENCE IS
;
;	PUSHJ	P,GETLIN
;
GETLIN:	MOVE	Q1,[POINT 7,LINBUF]	; SET UP POINTER
	MOVEM	Q1,LINPTR
	CLEARM	LINCNT		; CLEAR COUNT
	 ;
GETLN1:	INCHWL	C		; GET A CHARACTER
	IDPB	C,Q1		; STUFF IT INTO LINE BUFFER
	AOS	LINCNT		; BUMP COUNT
	PUSHJ	P,CHKTR1	; CHECK FOR TERMINATOR
	POPJ	P,		; GOT ONE!
	JRST	GETLN1		; KEEP TRYING

;  GETSIX -- INPUT NEXT SIXBIT IDENTIFIER OR NUMBER.  CALLING
;  SEQUENCE IS
;
;	PUSHJ	P,GETSIX
;	RETURN--Q1 CONTAINS SIXBIT ID AND BREAK CHAR. IS IN C
;
GETSIX:	MOVE	Q3,[POINT 6,Q1]	; SET UP FOR CONSTRUCTING ID
	SETZ	Q1,
	 ;
	PUSHJ	P,GTNBLK	; GET FIRST NONBLANK CHARCTER
	CAIA			; CHARACTER IN C ON FIRST PASS
GTSX1:	PUSHJ	P,GETCHR	; GET A CHARACTER
	MOVE	Q2,[042360,,001400]	; LOAD BREAK TABLE
	LSH	Q2,(C)		; CHECK FOR A BREAK
	JUMPL	Q2,CPOPJ	; RETURN NOW IF A BREAK
	 ;
	MOVE	Q2,C		; COPY CHARACTER
	CAIGE	Q2,140		; CONVERT TO SIXBIT
	SUBI	Q2,40
	TRZ	Q2,777700
	 ;
	CAIL	Q2,'0'		; SKIP IF TOO SMALL
	CAILE	Q2,'Z'		; IF IN PERMITTED RANGE
	POPJ	P,		; RETURN NOW
	CAILE	Q2,'9'		; SKIP IF A NUMBER
	CAIL	Q2,'A'
	SKIPA
	POPJ	P,		; NOT ALPHANUMERIC
	 ;
	TRNN	Q1,77		; DO WE ALREADY HAVE 6?
	IDPB	Q2,Q3		; NOPE--STASH CHARACTER
	JRST	GTSX1		; LOOP FOR MORE

;  GTNBLK -- GET NEXT NONBLANK CHARACTER.
;  GNBLK1 -- GET NEXT NONBLANK CHARACTER ASSUMING FIRST CHARACTER IS
;  IN C.  CALLING SEQUENCE IS
;
;	PUSHJ	P,GTNBLK OR GNBLK1
;	RETURN--C CONTAINS CHARACTER
;
GTNBLK:	PUSHJ	P,GETCHR	; GET A CHARACTER
GNBLK1:	CAIE	C,.CHTAB	; TABS AND...
	CAIN	C," "		; BLANKS ARE IGNORED
	JRST	GTNBLK
	POPJ	P,

;  GETCHR -- GET A CHARACTER FROM THE LINE BUFFER.  CALLING SEQUENCE IS
;
;	PUSHJ	P,GETCHR
;	RETURN--C CONTAINS CHARACTER
;
;  IGNORES CARRAIGE RETURN.
;
GETCHR:	SOSGE	LINCNT		; DECREMENT COUNT AND TEST
	SKIPA	C,[.CHLFD]	; END OF LINE, KEEP RETURNING LINE FEEDS
	ILDB	C,LINPTR	; GET A CHARACTER FROM LINE BUFFER
	CAIN	C,.CHCRT	; CARRIAGE RETURN?
	JRST	GETCHR		; YES--IGNORE IT
	POPJ	P,		; NO--RETURN

;  CHKTRM -- CHECK FOR A TERMINATOR, A END OF LINE CHARACTER OR A SEMI-
;  COLON.  CHKTR1 OMITS THE SEMICOLON.  CALLING SEQUENCE IS
;
;	MOVE	C,CHARACTER
;	PUSHJ	P,CHKTRM OR CHKTR1
;	RETURN--C CONTAINS A TERMINATOR
;	SKIP RETURN--C DOES NOT CONTAIN A TERMINATOR
;
;  PRESERVES ALL AC'S.
;
CHKTRM:	CAIN	C,";"		; SEMICOLON?
	POPJ	P,		; YES
CHKTR1:	PUSH	P,Q1		; SAVE A REGISTER
	MOVX	Q1,X.EOL	; GET END OF LINE BITS
	LSH	Q1,(C)		; SHIFT TO SIGN BIT
	SKIPL	Q1		; IF ONE, WE GOT ONE
	AOS	-1(P)		; NOPE, BUMP RETURN POINT
	POP	P,Q1		; RESTORE Q1
	POPJ	P,		; RETURN
	SUBTTL	DATA
;		----

UPTBLK:	1
	UPTPAG
FUNBLK:	1
	SPYPAG
LNMBLK:	1
	LNMPAG
DELLNM:	1
	SETZ	LNMPAG
DELSPY:	1
	SETZ	SPYPAG
DELUPT:	1
	SETZ	UPTPAG
LNMLOC:	BLOCK	1
MYJOB:	BLOCK	1		; JOB NUMBER
PTYOFF:	BLOCK	1		; PTY OFFSET
STACK:	BLOCK	STKSIZ		; THE STACK
TTYPTR:	BLOCK	1		; TTY BUFFER POINTER
TTYCNT:	BLOCK	1		; CHARACTER COUNT
TTYBUF:	BLOCK	^D80/5+1	; THE TTY BUFFER
LINCNT:	BLOCK	1		; THE INPUT COUNT
LINPTR:	BLOCK	1		; INPUT LINE POINTER
LINBUF:	BLOCK	^D140/5+1	; INPUT LINE BUFFER

	END	WHO