Google
 

Trailing-Edge - PDP-10 Archives - decuslib10-04 - 43,50343/tpmodl.mac
There is 1 other file named tpmodl.mac in the archive. Click here to see a list.
TITLE  TRANSACTION PROCESSOR  (MULTI TTY VERSION)
SUBTTL GEORGE H. NEWTON /DEC INFORMATION SERVICES/24-MAY-73/ VERSION 009A


;
;	NOTES TO THE MODIFIER OF THIS CODE
;
;	AC5 (5)  =  INDEX FOR TTYTBL
;
;	AC7 (7)  =  NUMBER OF ENTRIES BETWEEN CURRENT AC5
;		    AND END-OF-TABLE (TTYTBL)
;
;
	ENTRY	TP
;
;	SAVE THE AC'S
;

TP:	MOVEM	17,SAVE17	;SAVE AC17 (ADDRESS OF PC WORD)
	MOVE	17,[XWD 0,SAVEAC]	;SET UP FOR BLOCK TRANSFER
	BLT	17,SAVEAC+17	;SAVE THE AC'S
	MOVE	17,SAVE17	;RESTORE AC17 (PUSH-DOWN POINTER)
	SETOM	TALKED		;TELL SLEEPER THAT WE 'TALKED' TO COBOL PROGRAM
	AOS	TSTOT		;ADD 1 TO TOTAL NUMBER OF TRANSACTION SETS
	

;
;	FIRST TIME THINGS/SWITCH
;

ONCE:	JRST	ONCEA		;THIS IS ALTERED TO ALTGO: AFTER FIRST TIME


;	LOCK IN CORE ROUTINE / PERFORMED AFTER FIRST SLAVE


LOCKIT:	0			;SAVE RETURN PC HERE
	MOVE	16,[XWD 3,3]	;DO     LOCK HI-SEG (LH)
				;DO     LOCK LO-SEG
				;      IN CONTIGUOUS CORE
				;      WITH NO MAPPING
	LOCK	16,		;TRY THE LOCK - - - - - 
	JRST	.+2		;JUMP OVER GOOD RETURN
	JRST	LOCKOK		;LOCK WORKED - JUMP OVER ERROR CODE
	OUTSTR	[ASCIZ/
* * LOCK ATTEMPT FAILED * * ERROR CODE (/]
	MOVE	11,16		;MOVE ERROR CODE TO AC11
	PUSHJ	17,OCTPNT	;GO TYPE ERROR CODE
	OUTSTR	[ASCIZ/)
/]
	HRRZI	1,0		;SET AC1 TO 0
	CAME	16,1		;SKIP - ERROR CODE = 0
	JRST	LOCK1		;JUMP TO CHECK NEXT ERROR CODE
	OUTSTR	[ASCIZ/
    ( 0 = LOCK UUO NOT SUPPORTED BY THIS MONITOR )
/]
	JRST	LOCKA		;JUMP TO FINAL LOCK ERROR
	
LOCK1:	HRRZI	1,1		;SET AC1 TO 1
	CAME	16,1		;SKIP - ERROR CODE = 1
	JRST	LOCK2		;JUMP TO CKECK NEXT ERROR CODE
	OUTSTR	[ASCIZ/
    ( 1 = LOCK PRIVILEGE NOT IN ACCT.SYS FOR THIS [P,PN])
/]
	JRST	LOCKA		;JUMP TO FINAL LOCK ERROR

LOCK2:	OUTSTR [ASCIZ /
    ( 2 OR 3 = NOT ENOUGH CORE TO LOCK THIS JOB)
    ( 4,5,6 = LOCK MODE ERROR FOR THIS PROCESSOR)
/]

	
LOCKA:	OUTSTR	[ASCIZ /
    (JOB IS PROCEEDING  UNLOCKED!!!)

/]
	JRST	LOCKXX		;JUMP OVER LOCK-OK MESSAGE

LOCKOK:	OUTSTR	[ASCIZ/

* * JOB RUNNING  LOCKED  IN CORE * *

/]
LOCKXX:	OUTSTR	[ASCIZ/

/]
	HRRZI	1,1		;SET AC1 TO 1
	CALLI	1,71		;SET HPQ1
	OUTSTR	[ASCIZ/!!FAILED!! /]
	OUTSTR	[ASCIZ/HPQ 1

/]
	JRST	@LOCKIT		;RETURN


PAGE
;
;	THIS CODE IS PROCESSED ONLY ONCE, TO DETERMINE
;	THE LOCATION OF THE COBOL PROGRAM DISPATCHER, 
;	MESSAGE AREA, GO TO DEPENDING ON, MORE-TO-COME,
;	NUMBER OF LINES, CONTROL-C-DISPATCHER, AND
;	LOGICAL TTY NUMBER.
;
;	THIS CODE DETERMINES WHICH VERSION COBOL COMPILER
;	THE COBOL PROGRAM WAS COMPILED WITH, WHICH TELLS
;	IT HOW TO PROCESS THE ENTER MACRO ARGUMENTS.
;

ONCEA:	MOVE	1,[XWD 0,ALTGO]		;SET ADDRESS OF ALTGO:  IN RH AC1
	HRRM	1,ONCE			;ALTER   ONCE:   TO JRST TO ALTGO:

	HRRZ	1,SAVE17		;SET UP PC @ MOVE
	HRRZ	2,@1			;MOVE ENTRY PC+1 TO AC1
	HRRZM	2,ENTRPC		;STORE ENTRY PC+1

	MOVE	1,400005		;MOVE FILE-NAME OF HI-SEG TO AC1 (IN SIXBIT)
	CAMN	1,[SIXBIT/LIBOL5/]	;SKIP IF HI-SEG NOT LIBOL5
	JRST	LIBOL5			;GO PROCESS 'LIBOL5' ARGUMENTS
	CAMN	1,[SIXBIT/LIBOLQ/]	;SKIP IF HI-SEG NOT LIBOLQ (LIBOL5)
	JRST	LIBOL5			;GO PROCESS 'LIBOL5' ARGUMENTS
	CAMN	1,[SIXBIT/LIBOL6/]	;SKIP IF HI-SEG NOT 'LIBOL6'
	JRST	LIBOL6			;GO PROCESS 'LIBOL6' (LIBOL6 OR GREATER)
					;   TYPE ARGUMENTS

	OUTSTR	[ASCIZ"
?(ERROR FROM T/P)  YOUR COBOL PROGRAM IS CALLING FOR UNFAMILIAR 'LIBOL'
	SUGGEST YOU EXAMINE LOC.400005 IN HI-SEG FOR LIBOL NAME (SIXBIT)"]

	HALT			;SORRY BUT I MUST DIE!!!!!!!
PAGE
;
;	PROCESS  LIBOL5  ENTER MACRO   FOR THE FOLLOWING
;
;
;	TTYADR = ADDRESS OF LOGICAL TTY # IN COBOL PROGRAM (I-O-TTY)
;	GOTOAD = ADDRESS OF 1ST GO TO DEPENDING ON
;	ALTADD = ADDRESS OF (DISPATCHER) IN COBOL PROGRAM
;	CNTRLC = ADDRESS OF WHERE TO GO ON ^C (CONTROL-C)
;	TYPPTR = ADDRESS OF LINE 1 IN TTYI-O AREA (OUT-LINE)
;	LNSADR = ADDRESS OF NUMBER OF LINES TO BE TYPED (LINES-OUT)
;	MTCADR = ADDRESS OF (MORE-TO-COME) SWITCH
;

LIBOL5:	MOVE	16,ENTRPC	;MOVE ENTRPC TO AC16
	ADDI	16,2		;ADD 2 TO ENTRY PC+1
	HRRZ	15,@16		;MOVE TTY ADDRESS TO AC15
	HRRZM	15,TTYADR	;MOVE TTY ADDRESS TO TTYADR

	ADDI	16,^D11		;ADD 11 TO ENTRY PC+1+2
	HRRZM	16,GOTOAD	;SAVE ADDRESS OF 1ST GO TO DEPENDING ON - - 

	MOVE	16,ENTRPC	;MOVE ENTRY PC+1 TO AC16
	SUBI	16,5		;SUBTRACT 5 FROM AC16
OPLOOP:	HRRM	16,.+1		;JAM ADDRESS ON NEXT INSTRUCTION
	HLRZ	1,.		;LOAD OPCODE TO RH AC1
	CAMN	1,JRSTID	;SKIP - IF OPCODE IS NOT = JRST @
	JRST	OPOK		;OPCODE OK - - - - - - 
	SUBI	16,1		;BACK-UP LOOKING FOR JRST @
	JRST	OPLOOP		;TRY AGAIN

OPOK:	HRRM	16,.+1		;JAM ADDRESS ON NEXT INSTRUCTION
	HRRZ	1,.		;MOVE ALTERED ADDRESS TO AC1
	HRRZM	1,ALTADD	;SAVE ADDRESS OF ALTERED GO TO (DISPATCHER)

OPOK1:	SUBI	16,1		;SUBTRACT 1 FROM AC1
	HRRM	16,.+1		;JAM ADDRESS ON NEXT INSTRUCTION
	HLRZ	1,.		;LOAD OP-CODE ETC.  LH AC1
	CAMN	1,JRSTXX	;SKIP- IF OP-CODE NOT = 'JRST'
	JRST	OPOK2		;OP-CODE IS 'JRST'  -  JUMP TO OPOK2:
	JRST	OPOK1		;BACK-UP LOOKING FOR 'JRST'

OPOK2:	HRRM	16,.+1		;JAM ADDRESS ON NEXT INSTRUCTION
	HRRZ	1,.		;MOVE JRST ADDRESS TO RH AC1
	HRRZM	1,CNTRLC	;SAVE ADDRESS OF CONTROL-C-DISPATCHER


	MOVE	1,ENTRPC	;MOVE ENTRY PC+1 TO AC1
	ADDI	1,1		;ADD 1 TO AC1
	HRRM	1,.+1		;SET UP NEXT INSTRUCTION FOR @ MOVE
	HRRZ	2,@.		;MOVE START ADDRESS OF DISPLAY TO AC2
	HRRZM	2,TYPPTR	;SAVE ADDRESS OF TTY I-O AREA

	MOVE	1,ENTRPC	;MOVE ENTRPC TO AC1
	MOVE	2,(1)		;MOVE ADDRESS OF # LINES TO AC2
	HRRZM	2,LNSADR	;SAVE ADDRESS OF # LINES

	SUBI	2,1		;CALCULATE ADDRESS OF MORE-TO-COME
	HRRZM	2,MTCADR	;SAVE ADDRESS OF MORE-TO-COME SWITCH
	OUTSTR 	[ASCIZ/
 (LIBOL5 IS THE HI-SEG)
/]
	JRST	ITTY 		;GO SET-UP TTY TABLES
PAGE
;
;	PROCESS  'ENTER MACRO ARGUMENTS'  IN   (LIBOL6 OR LATER)  FORMAT
;

LIBOL6:	HRRZ	1,(16)		;GET ADDRESS OF # LINES OUT (LINES-OUT)
	MOVEM	1,LNSADR	;SAVE   LNSADR:

	SUBI	1,1		;BACK-UP 1 WORD FOR (MOORE-TO-COME)
	MOVEM	1,MTCADR	;SAVE   MTCADR:

	ADDI	16,1		;BUMP ARG POINTER BY 1
	HRRZ	1,(16)		;GET ADDRESS OF OUT-STRING BYTE POINTER
	HRRZ	1,(1)		;GET ADDRESS OF (OUT-STRING) FROM (RH)OF BYTE POINTER
	MOVEM	1,TYPPTR	;SAVE   TYPPTR:

	ADDI	16,1		;BUMP ARG POINTER BY 1
	HRRZ	1,(16)		;GET ADDRESS OF (I-O-TTY)
	MOVEM	1,TTYADR	;SAVE   TTYADR:

	MOVE	1,ENTRPC	;MOVE ENTRY PC+1 TO AC1
	ADDI	1,^D10		;BUMP AC1 TO POINT TO 1ST GO TO DEPENDING ON
	MOVEM	1,GOTOAD	;SAVE   GOTOAD:

	MOVE	1,ENTRPC	;MOVE ENTRY  PC+1 TO AC1
	SUBI	1,^D6		;GO BACK  LOOKING FOR  'JRST @'
BOL6LP:	HLRZ	2,(1)		;MOVE (LH) TO AC2
	CAMN	2,JRSTID	;SKIP - IF OPCODE NOT = 'JRST @'
	JRST	BOL6A		;OPCODE  OK - - - - - 
	SUBI	1,1		;BACK-UP 1 MORE - - - 
	JRST	BOL6LP		;LOOP

BOL6A:	HRRZ	2,(1)		;GET ADDRESS OF (DISPATCHER)
	MOVEM	2,ALTADD	;SAVE   ASTADD:

BOL6B:	SUBI	1,1		;BACK-UP 1 MORE
	HLRZ	2,(1)		;MOVE (LH) TO AC2
	CAMN	2,JRSTXX	;SKIP IF OPCODE NOT = 'JRST'
	JRST	BOL6C		;OPCODE IS OK - - - JUMP
	JRST	BOL6B		;LOOP

BOL6C:	HRRZ	2,(1)		;GET ADDRESS OF (CONTROL-C-DISPATCHER)
	MOVEM	2,CNTRLC	;SAVE   CNTRLC:

	OUTSTR	[ASCIZ/
 (LIBOL6 IS THE HI-SEG)
/]


	JRST	ITTY		;GO SET-UP TTY TABLES
PAGE
;
;	INITIALIZE (TTYTBL)  TTY RING TABLE
;

ITTY:	MOVE	1,TYPPTR	;MOVE TYPPTR TO AC1
	HRRM	1,POINT4	;MOVE ADDRESS OF TTY I-O AREA
				;(OUT-STRING) TO ITS BYTE POINTER

	MOVEI	7,MAXTTY	;MOVE MAXIMUM NUMBER OF TTY'S 
				;TO BE HANDLED BY TP TO AC1
	HRRZI	2,1		;MOVE 1 TO AC2 (LOGICAL TTY #)
	MOVE	3,SIXTTY	;MOVE -TTY   - TO AC3 (SIXBIT)
	SETZ	5,		;SET AC5 TO ZERO
	HRRZ	4,PTYTBL	;MOVE BYTE POINTER TO TTYTBL TO AC4
	ADDI	4,TFIXSZ	;OFFSET BYTE POINTER BY TTYTBL FIXED AREA

ITTYA:	ADDI	2,1		;ADD 1 TO (LOGICAL TTY#)
	HRLZM	2,TTYTBL(5)	;MOVE LOGICAL TTY # TO - LH
				;ZERO # OF TRANSACTIONS- RH
	MOVEM	3,TTYTBL+1(5)	;MOVE -TTY   - TO TABLE (SIXBIT)
	SETZM	TTYTBL+2(5)	;ZERO    FLAGS      - LH
				;ZERO PHYSICAL TTY# - RH
	SETZM	TTYTBL+3(5)	;ZERO TTY BEGINNING TIME (JIFFIES)
	SETZM	TTYTBL+5(5)	;ZERO BYTES LEFT TO BE TYPE FROM TP BUFFER
	HRRM	4,PTYTBL	;JAM OFFSET TTYTBL TTY BUFFER ADDRESS
				;ON BYTE POINTER
	MOVE	6,PTYTBL	;MOVE BYTE POINTER TO AC6
	MOVEM	6,TTYTBL+4(5)	;INITIALIZE TTYTBL BYTE POINTER
	MOVEM	6,TTYTBL+6(5)	;INITIALIZE TTYTBL BYTE POINTER
	ADDI	4,TABSIZ	;BUMP ADDRESS TO TP BUFFER FOR NEXT TTY IN TABLE
	ADDI	5,TABSIZ	;SET INDEX UP BY TABSIZ WORDS
	SUBI	7,1		;SUBTRACT 1 FROM NUMBER OF TTYS
	JUMPG	7,ITTYA		;LOOP - UNTIL TABLE INITALIZED - - - -

;
;	ESTABLISH THE NUMBER OF TTYS ON THE SYSTEM
;

	MOVE	1,[XWD 22,11]	;SET AC1 FOR GETTAB (INDEX 33 OF TABLE 11)
	GETTAB	1,		;GET TABLE 11  ENTRY 33
				;AC1  LH = - TOTAL NUMBER OF TTY LINES
				;     RH = BEGINNING OF LINE TABLE
	JRST	ERR1		;GETTAB DIED/ GO COMPLAIN - - 
	HLRZ	2,1
	SUBI	2,2
	MOVEM	2,SYSTTY	;SAVE NUMBER OF TTYS ON SYSTEM
	MOVE 2,SYSTTY
	SUBI 2,2
	MOVEM	2,SYSTTY

;
;	IDENTIFY SYSTEM/TP/APPLICATION ON MASTER TTY (NOT USERS TTY)
;

	OUTSTR	[ASCIZ/

/]
	MOVE	1,[XWD 0,11]	;SET FOR GETTAB
	GETTAB	1,		;GET WORD 1 OF SYSTEM ID
	JRST	ERR5		;FAILED/REPORT IT
	MOVEM	1,SYSID		;MOVE WORD 1 OF ID TO SYSID
	MOVE 	1,[XWD 1,11]	;SET FOR GETTAB
	GETTAB	1,		;GET WORD 2 OF SYSTEM ID
	JRST	ERR5		;FAILED/REPORT IT
	MOVEM	1,SYSID+1	;MOVE WORD 2 OF ID TO SYSID
	MOVE	1,[XWD 2,11]	;SET FOR GETTAB
	GETTAB	1,		;GET WORD 3 OF SYSTEM ID
	JRST	ERR5		;FAILED/REPORT IT
	MOVEM	1,SYSID+2	;MOVE WORD 3 OF ID TO SYSID
	MOVE	1,[XWD 3,11]	;SET FOR GETTAB
	GETTAB	1,		;GET WORD 4 OF SYSTEM ID
	JRST	ERR5		;FAILED/REPORT IT
	MOVEM	1,SYSID+3	;MOVE WORD 4 OF ID TO SYSID
	MOVE	1,[XWD 4,11]	;SET FOR GETTAB
	GETTAB	1,		;GET WORD 5 OF SYSTEM ID
	JRST	ERR5		;FAILED/REPORT IT
	MOVEM	1,SYSID+4	;MOVE WORD 5 OF ID TO SYSID
	OUTSTR	SYSID		;TYPE SYSTEMS ID
	OUTSTR	@CRLF		;TYPE <CR><LF>
	OUTSTR	[ASCIZ/"BEGIN TRANSACTION PROCESSOR V009A 
FOR   MIKE & NICK  @ /]
	JSR	TIMER		;GO GET THE TIME
	JSR	TYTIME		;GO TYPE TIME
	OUTSTR	[ASCIZ/
PAGE CODE - (.SET TTY PAGE /]
	MOVE	11,TPID		;MOVE PAGE ID TO AC11
	PUSHJ	17,DECPNT	;CONVERT PAGE COUNT TO DECIMAL & TYPE
	OUTSTR	[ASCIZ/)

/]



;
;	GO FIND FIRST TTY TO START FOR THE DAY
;

A1:	HRRZI	16,^D5		;SET SLEEP INTERVAL TO 5 SECONDS
A:	JSR	GETTTY		;GO TRY TO ADD TTY TO POOL
;	OUTSTR	[ASCIZ/ZZZZZ/]	;LET EM KNOW YOUR SLEEPING!!!!!!
	CALL	16,[SIXBIT/SLEEP/] ; SLEEP FOR AC1 SECONDS
	CALL	15,[SIXBIT/TIMER/] ;GET CURRENT TIME (JIFFIES)
	MOVEM	15,HLDTIM	;SAVE TIME
	TTCALL	2,1		;INPUT CHAR FROM MASTER TTY TO AC1
	JRST	.+2		;MASTER HAS NOTHING / PROCEED
	JSR	PROMST		;GOT A CHARACTER / GO PROCESS IT
	JRST	A		;GO BACK & LOOK AGAIN !!!!

;
;	NOTE: WHEN TTY IS FOUND, GETTTY GOES TO RESTAC
;	      AFTER ENTERING NEW TTY IN TTYTBL
;

;
;	ALTER COBOL 'GO TO DEPENDING ON - - - '
;

ALTGO:	HRRZ	4,@ALTADD	;SET AC4 WITH ALTERED GO TO - - - 
	HRRZ	2,@TTYADR	;MOVE TTY#(LOGICAL) TO RH AC2
	HRRZ	5,GOTOAD	;MOVE GO TO ADDRESS TO AC5
	HRRM	5,.+1		;SET UP NEXT ADDRESS
	HRRM	4,.(2)		;MOVE ALTERED ADDRESS (AC4) TO
				;GO TO DEPENDING ON (AC3)
				;INDEXED BY LOGICAL TTY # (AC2)

;
;	FIND USERS TTY IN TTYTBL
;

	MOVEI	7,MAXTTY	;MOVE TTY TABLE SIZE TO AC7
	SETZ	5,		;ZERO AC5 (INDEX)
	
DL:	HLRZ	4,TTYTBL(5)	;MOVE LOGICAL TTY# FROM TTYTBL
	CAMN	2,4		;SKIP - IF LOGICAL TTY NOT = TABLE
	JRST	DLAA		;JUMP - FOUND LOGICAL TTY IN TTYTBL
	ADDI	5,TABSIZ	;BUMP INDEX TO NEXT ENTRY(TABSIZ WORDS/ENTRY)
	SUBI	7,1		;SUBTRACT 1 FROM ENTRIES LEFT IN TABLE
	JUMPG	7,DL		;LOOP - UNTIL HIT / TABLE EXHAUSTED
				;- - - - F A T A L - - - -
				;TABLE EXHAUSTED / DID SOMEONE CHANGE
				;THE LOGICAL TTY# IN COBOL PROGRAM??
	OUTSTR	CRLF
	OUTSTR [ASCIZ/? F A T A L -- CONFUSION ON LOGICAL TTYS/]
	OUTSTR [ASCIZ/    TRANSACTION PROCESSOR/]
	OUTSTR	CRLF

	HALT			;SORRY - - I MUST DIE - -
PAGE

;	IF USER HAS SET MORE-TO-COME TO 'Y'
;	    MARK HIS NO-ACCEPT BIT IN USER FLAG HALF-WORD
;

DLAA:	HRRZ	2,MTCADR	;MOVE ADDRESS OF MORE-TO-COME
	HRRM	2,.+1		;JAM ADDRESS ON NEXT INSTRUCTION
	HLRZ	1,.		;MOVE LH SWITCH TO RH AC1
	CAIE	1,544000	;SKIP - IF  SWITCH = 'Y'
	JRST	DLA		;JUMP - SWITCH NOT SET
	HRRM	2,.+1		;CLEAR SWITCH
	SETZM	,.		;  IN COBOL PROGRAM
	HLLZ	1,TTYTBL+2(5)	;MOVE TTYTBL FLAG HALF-WORD TO AC1 LH
	TLO	1,200000	;TURN ON 'NO-ACCEPT THIS TIME' BIT
	HLLM	1,TTYTBL+2(5)	;  SWITCH IN TTYTBL 

;
;	CHECK TO SEE IF THIS IS LAST MESSAGE FOR TTY 
;	(IF SO, CLEAN HIS TTYTBL ENTRY/GIVE ENDING MESSAGE)
;	(RESET HIS PAGE CODE AND UNSLAVE HIM)
;

DLA:	MOVE	6,@TYPPTR	;MOVE FIRST WORD OF RETURNED MESSAGE TO AC6
	CAME	6,STOPIT	;SKIP - IF MESSAGE = !STOP
	JRST	DLB		;CONTINUE - 
;
;	CHECK FOR  'ECHON (ECHO ON)  & 'ECHOF' (ECHO OFF)
;

	MOVE	6,TYPPTR	;MOVE ADDRESS OF WORD 1 COBOL AREA
	ADDI	6,1		;LOOK AT WORD #2 OF RETURN MESSAGE
	MOVE	1,@6		;PUT WORD #2 IN AC1
	CAMN	1,ECHOFF	;SKIP IF  NOT  ECHOF  (ECHO OFF)
	JRST	OFECHO		;GO TO CHANGE ECHO STATUS TO 'OFF'
	CAMN	1,ECHON		;SKIP IF  NOT  ECHON  (ECHO ON)
	JRST	ONECHO		;GO TO CHANGE ECHO STATUS (ECHO ON)
	CAIN	1,[SIXBIT/!ALL!/]	;IS WORD #" =  !ALL!
	JRST	KILALL		;YES - GO KILL ALL SLAVES!!!!!
	JRST	GOODBY		;HE MUST WANT TO GO AWAY
				; - GO SAY  GOOD BYE !!!!!
PAGE
;
;	TURN  USERS SLAVED TERMINAL 'ECHO'   (ON-OFF)
;

ONECHO:	SETZM	ECHO2		;SET ECHO ON BITS (ZERO IN BIT 35)
	JRST	CHGECH		;GO ALTER ECHO STATUS
OFECHO:	SETOM	ECHO2		;SET ECHO OFF BITS (ONE IN BIT 35)
CHGECH:	HRRZ	1,TTYTBL+2(5)	;MOVE PHYSICAL TTY#
	MOVEM	1,ECHO1		;TO  ECHO+1 (FOR SET TTY ECHO)
	MOVE	1,[XWD 3,ECHO]	;SET AC1 FOR CALLI (TRMOP.)
	CALLI	1,116		;CHANGE HIS ECHO STATUS
	JFCL			;NO-OP ERROR RETURN
	JRST	NXTTY		;GO LOOK FOR NEXT TTY:


;
;	THE PROGRAM HAS REQUESTED THAT I KILL ALL SLAVES
;

KILALL:	OUTSTR	[ASCIZ/

ALL SLAVES ARE BEING KILLED PER REQUEST OF PROGRAM

Y/]
	JRST	PK2		;GO TO ROUTINE TO KILL ALL SLAVES
				;
				;WHEN DONE IT WILL RETURN TO COBOL
				;PROGRAM VIA LOGICAL TTY #1
PAGE
;
;	THIS IS WHERE WE SAY GOOD BY TO USER TERMINAL
;

GOODBY:	HRRZ	1,TTYTBL+2(5)	;MOVE PHYSICAL TTY#
	MOVEM	1,DESLAV+1	;TO DESLAVE (FOR UUO)
	HRRZI	1,1		;MOVE 1 TO AC1
	MOVEM	1,UNSLAV	;SET UNSLAVE SWITCH FOR OUTTTY:

;	WRITE ENDING TTY MESSAGES ON MASTER TERMINAL

	OUTSTR	[ASCIZ/
TTY #/]
	HRRZ	11,TTYTBL+2(5)	;MOVE PHYSICAL TTY# TO AC11
	SUBI	11,200000	;SUBTRACT 200000 FROM TTY#
	PUSHJ	17,OCTPNT	;TYPE TTY# IN OCTAL
	OUTSTR	[ASCIZ/ ENDED @ /]
	JSR	TIMER		;GO GET THE TIME
	MOVE	11,14		;PLACE HOURS IN AC11
	PUSHJ	17,DECPNT	;GO TYPE HOURS (AFTER CONVERTING TO DECIMAL)
	OUTSTR	@COLON		;TYPE COLON (:)
	MOVE	11,15		;PLACE MINUTES IN AC11
	CAMG	11,NINE		;SKIP - IF MORE THAN 9 MINUTES
	OUTSTR	@ZERO		;TYPE LEADING ZERO FOR MINUTES
	PUSHJ	17,DECPNT	;GO TYPE MINUTES (AFTER CONVERTING TO DECIMAL)
	OUTSTR	[ASCIZ/
CONNECT TIME WAS /]
	JSR	CONTIM		;GO CALCULATE & TYPE CONNECT TIME

;	CHECK IF BEEING 'FLUSHED' DUE TO PASSWORD ERRORS!!!!!

	MOVE	6,TYPPTR	;MOVE ADDRESS ON WORD 1 COBOL AREA
	ADDI	6,1		;ADD 1, SO ADDRESS POINTS TO WORD 2 (AC6)
	MOVE	1,@6		;MOVE WORD 2 OF COBOL I-O AREA TO AC1
	CAMN	1,BADPW		;SKIP - IF NOT BAD PASSWORD TERMINATION
	OUTSTR	[ASCIZ/
**** USER TERMINATED DUE TO PASSWORD ERRORS ****
/]

	OUTSTR	[ASCIZ/
USER HAD /]
	HRRZ	11,TTYTBL(5)	;MOVE # OF TRANSACTION SETS TO AC11
	PUSHJ	17,DECPNT	;CONVERT TO DECIMAL & TYPE
	OUTSTR	[ASCIZ/ TRANSACTION SETS

/]
	SOS	TTYS		;SUBTRACT 1 FROM # OF SLAVE TTYS
	JSR	STATUS		;GO TYPE T/P VOLUME STATUS ON MASTER TTY
	JSR	NAMCHG		;CHANGE NAME TO REFLECT # SLAVES
	JSR	OUTTTY		;GO TYPE HIS FINAL MESSAGE
				;AND UNSLAVE HIM - - - - 

;	CLEAN TTYTBL FOR THE TTY WE JUST REMOVED

	HRRZI	1,		;ZERO AC1
	HRRM	1,TTYTBL(5)	;ZERO NUMBER OF TRANSACTION SETS
	HRRM	1,TTYTBL+1(5)	;ZERO ### OF SIXBIT (TTY###)
	MOVEM	1,TTYTBL+2(5)	;ZERO FLAGS & PHYSICAL TTY#
	MOVEM	1,TTYTBL+3(5)	;ZERO START TIME
	SETZM	TTYTBL+5(5)	;ZERO BYTES TO BE TYPED FROM TP BUFFER
	MOVE	2,TTYTBL+4(5)	;INITIALIZE BYTE POINTER TO
	MOVEM	2,TTYTBL+6(5)	;TP BUFFER
JAMIT:	SKIPN	TTYS		;SKIP - IF WE STILL HAVE SLAVES LEFT
				;NOTE: THIS INSTRUCTION IS OVERLAYED
				;      AT WRAP-UP TIME IN PK2:

	JRST	A1		;WE HAVE NO SLAVES LEFT!!!!
				;GO BACK & FIND SOME

	JRST	NXTTY		;GO FIND NEXT TTY IN TTYTBL WITH MESSAGE
				;OR MORE TO TYPE OUT FROM TTYTBL BUFFER



;
;	WRITE RETURNED MESSAGE(S) ON USERS TERMINAL
;

DLB:	JSR	OUTTTY		;GO MOVE FROM COBOL BUFFER & WRITE
	AOS	TTYTBL(5)	;ADD 1 TO # OF MESSAGES FOR THIS TTY
				;IT WILL TAKE 262,145 MESSAGES FROM
				;A SINGLE TTY BEFORE IT WILL OVERFLOW
				;INTO THE LOGICAL TTY#
	CALL	16,[SIXBIT/TIMER/] ;PLACE CURRENT (JIFFIES) IN AC16
	MOVEM	16,LINTIM	;SAVE TIME LAST LINE TYPED TO USER
PAGE
;
;	NOW WE LOOK FOR NEXT TTY WITH INPUT / OR TTY'S WITH MORE OUTPUT
;

NXTTY:	ADDI	5,TABSIZ	;BUMP INDEX TO NEXT ENTRY(TABSIZ WORDS/ENTRY)
	SUBI	7,1		;SUBTRACT 1 FROM ENTRIES LEFT IN TABLE
	JUMPG	7,SCAN		;JUMP- IF NOT AT END OF TABLE

;	RESET TO BEGINNING OF TABLE & SLEEP IF GOING TOO FAST!!!!!
;
;		CHECK FOR 'NEW' SLAVES EVERY SLVCHK: JIFFIES
;		FOR THE FIRST INITIM: JIFFIES ,  THEN  CHECK FOR
;		NEW SLAVES EVERY SLVCK1: JIFFIES


	SETZ	5,		;ZERO INDEX
	MOVEI	7,MAXTTY	;INITIALIZE AC7 TO TTYTBL SIZE

SLAV1:	JRST	.+1		;ALTERED TO SLAV2: AFTER INITIM: JIFFIES
	CALL	16,[SIXBIT/TIMER/] ;GET CURRENT TIME (JIFFIES)
	SUB	16,HLDTIM	;SUBTRACT 'FIRST SLAVE' TIME
	CAMG	16,INITIM	;SKIP - IF MORE THAN INITIM: JIFFIES
	JRST	SLAV2		;STILL IN 'QUICK SLAVE' MODE -JUMP-
	MOVE	1,SLVCK1	;JAM SLVCK1: TIME
	MOVEM	1,SLVCHK	;ON  SLVCHK:
	MOVE	1,[XWD 0,SLAV2] ;ALTER SLAV1: TO
	HRRM	1,SLAV1		;PROCEED TO SLAV2:

SLAV2:	CALL	16,[SIXBIT/TIMER/] ;GET CURRENT TIME (JIFFIES)
	SUB	16,LSTSLV	;SUBTRACT TIME SLAVES LAST LOOKED FOR
	CAML	16,SLVCHK	;SKIP - IF LESS THAN SLVCHK: JIFFIES
				;SINCE LAST GETTTY:
	JSR	GETTTY		;TRY TO FIND 'NEW' SLAVES
	TTCALL	2,1		;INPUT CHAR FROM MASTER TTY TO AC1
	JRST	.+2		;MASTER HAS NOTHING / PROCEED
	JSR	PROMST		;GO PROCESS CHAR FROM MASTER

	SKIPN	TALKED		;SKIP - IF ACTIVITY SINCE LAST TABLE LOOP
	JRST	SLEEP1		;GO TO SLEEP
	SETZM	TALKED		;TURN OFF 'TALKED' SWITCH
	SETZM	SLEEPCT		;ZERO SLEEP COUNTER
	JRST	SCAN		;GO SCAN FOR ACTIVE TTY


SLEEP1:	AOS	SLEEPCT		;ADD 1 TO SLEEP COUNTER
	HRRZI	1,^D360		;SET AC1 TO 360  1/6 SECONDS (60 SEC)	
	CAMG	1,SLEEPCT	;SKIP - IF LESS THAN ^D60 SECONDS 
	JRST	SLEEP2		;GO TAKE LONGER SLEEPS!!!!!!!
HIBER:	HRRZI	1,^D165		;SET HIBERNATE TIME
				;FOR 165 MS  (10 JIFFIES)
	CALL	1,[SIXBIT/HIBER/]  ;HIBERNATE FOR 1/6 SECOND
	JRST	HIBNG		;GO TO HIBERNATE N/G !!!!!
	JRST	SCAN		;GO SCAN FOR ACTIVE TTY


HIBNG:	JRST	.+1		;JUMP TO NEXT INSTRUCTION
	MOVEI	1,HIBNG1	;MOVE ADDRESS OF HIBNG1: TO AC1
	HRRM	1,HIBNG		;JAM HIBNG: TO JRST HIBNG1
	OUTSTR	[ASCIZ/%HIBERNATE FAILED- - (WILL SUBSTITUTE SLEEP)
/]
	MOVEI	1,^D100		;SET HBFAIL TO  ^D100
	MOVE	1,HBFAIL	

HIBNG1:	MOVEI	1,1		;MOVE 1  SECOND TO SLEEP TIME
	CALLI	1,31		; SLEEP FOR AC1   SECONDS
	SOSE	HBFAIL		;SUBTRACT 1 FROM HBFAIL -SKIP IF ZERO
	JRST	SCAN		;GO   SCAN FOR ACTIVE TTY
	OUTSTR	[ASCIZ/% 100 HIBERNATE FAILURES
/]
	MOVEI	1,^D1000	;SET HBFAIL TO 1000 THIS TIME
	MOVE	1,HBFAIL	;
	JRST	SCAN		;GO SCAN FOR TTY ACTIVITY


SLEEP2:	HRRZI	1,^D1		;SET SLEEP FOR 1 SECONDS
	CALL	1,[SIXBIT/SLEEP/]  ;SLEEP FOR AC1 SECONDS
	JRST	SCAN		;GO SCAN FOR ACTIVE TTY

;	SCAN TABLE LOOKING FOR 'ACTIVE' TTYS - - - -

SCAN:	HRRZ	1,TTYTBL+2(5)	;MOVE PHYSICAL TTY NUMBER TO AC1
	JUMPE	1,NXTTY		;GO TRY NEXT ENTRY IN TABLE
				;(THIS ONE IS EMPTY)
	SKIPG	TTYTBL+5(5)	;SKIP - IF TP BUFFER HAS CHARACTERS TO BE TYPED
	JRST	SCAN1		;NOTHING TO BE TYPE FROM TTYS TP BUFFER
				;GO SEE IF HE HAS INPUT - - -
	MOVEM	1,EMPBF1	;HE HAS SOMETHING TO TYPE / SEE IF HIS TTY
	MOVE	2,[XWD 2,EMPBF] ;OUTPUT BUFFER IS EMPTY (SO WE CAN FILL IT!)
	CALLI	2,116		;SKIP - IF TTY BUFFER -NOT- EMPTY
	JRST	.+2		;JUMP OVER NEXT
	JRST	NXTTY		;TTY BUFFER NOT EMPTY / GO LOOK AT NEXT TTY
	SETOM	GETP		;SET 1 WORD FLAG TO TELL OUTTTY: THAT
				;WE WANT TO FILL TTY RING BUFFER FROM TP BUFFER
	JSR	OUTTTY		;GO FILL & WRITE
	JRST	NXTTY		;GO LOOK @ NEXT TTY

;	CHECK TO SEE IF COBOL PROGRAM WANTS THIS TTY
;	TO RETURN WITH  NO-MESSAGE

SCAN1:	HLLZ	2,TTYTBL+2(5)	;MOVE FLAG HALF-WORD TO AC1
	TLZN	2,200000	;SKIP - IF 'NO-RETURN'
	JRST	SCAN2		;GO LOOK TO SEE IF HE HAS INPUT
	HLLM	2,TTYTBL+2(5)	;REPLACE FLAGS WITH BIT CLEARED
	HLRZ	2,TTYTBL(5)	;JAM LOGICAL TTY #
	MOVEM	2,@TTYADR	;  INTO  I-O-TTY
	JRST	RESTAC		;GO TO  RETURN TO  COBOL

SCAN2:	SETZM	TTYTBL+5(5)	;ZERO BYTE COUNTER SO WE START WITH CLEAN ONE
	SUBI	1,200000	;REMOVE 200000 FOR TTCALL 6 (BUG)
	TTCALL	6,1		;GET LINE INFO ON TTY
	TLNN	1,100		;TEST TO SEE IF LINE HAS BEEN TYPED
				;SKIP - IF LINE HAS BEEN TYPED!!
	JRST	NXTTY		;LINE NOT READY / GO LOOK AT NEXT TTY IN TABLE
	JRST	INPUT		;TTY HAS LINE READY / GO GET IT


;
;	GET INPUT FROM USERS TTY
;

INPUT:	MOVE	1,TTYTBL+1(5)	;MOVE SIXBIT TTY NAME
	MOVEM	1,OPNTTY+1	;TO CHANNEL INFO
	OPEN	14,OPNTTY	;OPEN TTY ON CHANNEL 14
	JRST	ERR6		;OPEN FAILED / GO TELL 'EM
	MOVE	1,[XWD SAIBUF,IBUF] ;SET UP BLT
	BLT	1,IBUF+2	;INITIALIZE INPUT BUFFER HEADER
	IN	14,		;READ INTO BUFFER
	JRST	.+2		;JUMP OVER ERROR RETURN
	OUTSTR	[ASCIZ/
??INPUT ERROR FROM TTY (THIS IS TP)
/]
	SETZ	3,		;ZERO AC3 (^C FOUND SWITCH)
	MOVE	1,POINT4	;MOVE COBOL I-O
	MOVEM	1,POINT3	;AREA POINTER
	HRRZI	2,^D72		;COBOL I-O AREA COUNTER
INPLOP:	ILDB	1,IBUF+1	;GET BYTE FROM RING BUFFER
	CAIL	1,40		;SKIP IDPB -  IF CHARACTER LESS THAN SPACE
				;THIS REMOVES TAB,CR,LF,FF,BELL ESC, ETC.
				;OCTAL 00 - 37 ARE REMOVED /
				;NOTHING IS SUBSTITUTED
	JRST	INPLOK		;GREATER THAN 37 (GO PASS CHARACTER)

	CAIN	1,11		;HORIZONTAL TAB <TAB>
	JRST	INPLOK		;<TAB> IS OK   (GO PASS IT ON!!)

	CAIN	1,15		;CARRIAGE RETURN  <CR>
	JRST	INPLOK		;<CR> IS OK   (GO PASS IT ON!!)

;    PLACE CODE HERE TO PASS ON ANY MORE SPECIAL CHARACTERS!!!!

	CAIN	1,3		;CONTROL-C  (^C)
	ADDI	3,1		;SET  ^C  SWITCH UP BY 1
	JRST	INPLK1		;  DROP CHARACTER

INPLOK:	IDPB	1,POINT3	;PUT IT IN COBOL AREA
INPLK1:	AOS	CHRIN		;ADD 1 TO # CHARACTERS TYPED IN
	SOSE	IBUF+2		;DECREMENT RING BUFFER BYTE COUNTER
				;SKIP - WHEN EMPTY
	SOJN	2,INPLOP	;LOOP IF COBOL NOT FULL - - 
	RELEASE	14,		;BREAK CHANNEL/DEVICE BOND

;	JAM LOGICAL TTY# IN COBOL PROGRAM

	HLRZ	1,TTYTBL(5)	;MOVE LOGICAL TTY# TO AC1
	MOVEM	1,@TTYADR	;THEN JAM IN COBOL PROGRAM

;	CHECK FOR  ^C  & PROCESS IF ANY IN INPUT STRING

	JUMPE	3,NOUPC		;JUMP TO NO CONTROL-C FOUND
	HRRZ	4,CNTRLC	;MOVE ADDRESS IN CONTROL-C-DISPATCH TO AC4
	HRRZ	2,GOTOAD	;MOVE ADDRESS OF FIRST  GO TO DEPENDING ON TO AC2
	HRRM	2,.+1		;SET UP NEXT ADDRESS
	HRRM	4,.(1)		;MOVE ^C DISPATCH ADDRESS TO GO TO DEPENDING ON
				;TABLE (INDEXED BY LOGICAL TTY#  AC1)

	MOVE	1,POINT4	;SET UPP COBOL AREA BYTE POINTER
	MOVEI	2,40		;MOVE ASCII SPACE TO AC2
	MOVEI	3,^D75		;SET COUNTER TO 75 BYTES
INLOOP:	IDPB	2,1		;DEPOSIT  SPACE
	SOJN	3,INLOOP	;LOOP 'TIL DONE

NOUPC:	JRST	RESTAC		;GO TO RETURN TO COBOL



;
;	RESTORE AC'S
;

RESTAC:	MOVE	17,[XWD SAVEAC,0]	;SET UP FOR BLT
	BLT	17,17		;RESTORE THE AC'S
	MOVE 	17,SAVE17	;RESTORE AC17
	POPJ	17,		;RETURN TO COBOL PROGRAM

;
;	TELL MASTER TTY ABOUT NEW SLAVE TTY IN POOL
;

MSGENT:	0			;SAVE RETURN PC HERE!
	OUTSTR	@CRLF		;TYPE <CR><LF>
	OUTSTR	MESS1			;TTY #
	HRRZ	11,TTYTBL+2(5)	;MOVE PHYSICAL TTY # TO AC11
	SUBI	11,200000	;SUBTRACT 200000 FROM TTY #
	PUSHJ	17,OCTPNT	;TYPE TTY # IN OCTAL
	MOVE	1,OCTHLD	;SAVE SIXBIT
	MOVEM	1,SBITTY	;TTY NUMBER
	OUTSTR	[ASCIZ/ STARTED @ /]
	JSR	TIMER		;GO GET CURRENT TIME
	MOVE	11,14		;PLACE HOURS IN AC11
	PUSHJ	17,DECPNT
	OUTSTR	@COLON		;TYPE COLON
	MOVE	11,15		;PLACE MINUTES IN AC11
	CAMG	11,NINE		;SKIP - IF MORE THAN 9 MINUTES
	OUTSTR	@ZERO		;TYPE LEADING ZERO FOR MINUTES
	PUSHJ	17,DECPNT
	OUTSTR	@CRLF		;TYPE <CR><LF>
	JRST	@MSGENT		;RETURN


;
;	GET THE TIME OF DAY	    AC14 = HOURS (OCTAL)
;				    AC15 = MINUTES (OCTAL)
;				    AC16 = JIFFIES (OCTAL)
;

TIMER:	0			;SAVE RETURN PC HERE!
	CALL	16,[SIXBIT/TIMER/] ;PLACE CURRENT TIME 
				;IN JIFFIES IN AC16
				;24 HRS = 5,184,000 JIFFIES (23 BITS)
	MOVE	14,16		;MOVE TIME TO AC14
	IDIVI	14,^D3600	;CONVERT TIME TO MINUTES
	IDIVI	14,^D60		;CONVERT TIME TO HOURS  AC14
				;     REMAINDER MINUTES AC15
	JRST	@TIMER		;RETURN
PAGE

;
;	LOOK FOR TTYS ON SYSTEM / WITH OUR PAGE CALL
;

GETTTY:	0			;SAVE RETURN PC HERE!

	CALL	16,[SIXBIT/TIMER/] ;GET CURRENT TIME IN (JIFFIES)
	MOVEM	16,LSTSLV	;SAVE THE TIME
	MOVE	4,SYSTTY	;SET UP UNIVERSAL I/O INDEX
	ADDI	4,200000	;WITH NUMBER OF TTYS ON SYSTEM + 200000

GA:	HRRZI	3,1023		;SET UP FUNCTION CODE (PAGE SIZE)
	MOVE	2,[XWD 2,3]	;SET AC2 FOR CALLI (TRMOP.)
	CALLI	2,116		;GET TTY PAGE SIZE
	JRST	ERR2		;CALLI FAILED / TELL THE WORLD!!
	CAME	2,TPID		;SKIP IF TTY IS FOR THIS TP
	JRST	GB		;GO LOOK @ NEXT TTY /  NOT OUR PAGE
	JRST	CKTBL		;TTY IS FOR OUR PAGE - - -
				;GO SEE IF WE ALREADY HAVE HIM
				;IN OUR TTYTBL - - - - - - -

GB:	SUBI	4,1		;SUBTRACT 1 FROM TTY NUMBER
	CAIL	4,200000 	;SKIP IF TTY LESS THAN  0 (200000)
	JRST	GA		;GO CHECK NEXT TTY
	SETO	1,		;SET AC1 TO ONES (DID NOT FIND NEW TTY)
	JRST	@GETTTY		;RETURN

GC:	CAMN	1,BADTTY	;SKIP - IF THIS IS -NOT- THE LAST
				;     - TTY WE TOLD OPR: TO CLEAR PAGE
	JRST	GB		;GO LOOK AT NEXT TTY
	MOVEM	1,BADTTY	;SAVE THIS TTY NUMBER FOR NEXT TIME
	OUTSTR	[ASCIZ/
"OPR- PLEASE TELL TTY/]
	MOVE	11,4		;MOVE TTY# TO AC11
	SUBI	11,200000	;REMOVE OFFSET
	PUSHJ	17,OCTPNT	;GO CONVERT & TYPE
	OUTSTR	[ASCIZ/ TO LOG OUT OR CLEAR  (.SET TTY PAGE 63)
/]
	JRST	GB		;GO LOOK AT NEXT TTY

;
;	GOT ONE / CHECK TO SEE IF WE ALREADY HAVE HIM !!
;

CKTBL:	MOVEI	7,MAXTTY	;SET TABLE ENTRIES COUNT-DOWN
	SETZ	5,		;ZERO AC5 (INDEX)
CKTBA:	HRRZ	6,TTYTBL+2(5)	;MOVE PHYSICAL TTY # (+200000) TO AC6
	CAMN	4,6		;SKIP - IF TTY NOT HERE IN TTYTBL
	JRST	GB		;EQUAL - WE ALREADY HAVE HIM/
				;GO LOOK FOR ANOTHER POTENTIAL SLAVE - - - -
	ADDI	5,TABSIZ	;BUMP INDEX TO NEXT ENTRY (TABSIZ WORDS/ENTRY)
	SUBI	7,1		;SUBTRACT 1 FROM # TTYS IN TABLE
	JUMPG	7,CKTBA		;LOOP - UNTIL HIT/TABLE EXHAUSTED

;
;	WE HAVE A 'NEW'  TTY - - FIND 'HOLE' IN TABLE FOR HIM - -
;				IF HE IS NOT ATTACHED TO LOGGED-IN JOB
;

	MOVE	11,4		;MOVE TTY# TO AC11
	SUBI	11,200000	;REMOVE OFFSET
	SETOM	NOTYPE		;SET SWITCH TO 'NO-TYPE'
	PUSHJ	17,OCTPNT	;GO CONVERT TTY# TO SIXBIT
	SETZM	NOTYPE		;TURN OFF 'NO-TYPE' SWITCH
	MOVE	1,[SIXBIT/TTY   /]	;MOVE SIXBIT 'TTY   ' TO LH AC1
	HLR	1,OCTHLD	;MOVE SIXBIT TTY # TO RH AC1
	MOVEM	1,OPNTTY+1	;MOVE SIXBIT TTY NAME TO COMMAND LIST
	OPEN	14,OPNTTY	;TRY TO GET TTY### ON CH14
	JRST	GC		;OPEN FAILED - - TTY LOGGED IN??? 
				;TELL OPR & GO LOOK
				;AT NEXT TTY

	MOVEI	7,MAXTTY	;SET COUNT-DOWN (# ENTRIES IN TABLE)
	SETZ	5,		;ZERO AC5 (INDEX)
	
TBLA:	HRRZ	6,TTYTBL+2(5)	;MOVE PHYSICAL TTY# (+200000) TO AC6
	JUMPE	6,TBLB		;IF TTYTBL(WORD 3) = ZERO, WE HAVE HOLE
	ADDI	5,TABSIZ	;BUMP INDEX TO NEXT ENTRY(TABSIZ WORDS/ENTRY)
	SUBI	7,1		;SUBTRACT 1 FROM #TTYS IN TABLE
	JUMPG	7,TBLA		;LOOP - UNTIL  HOLE

	OUTSTR	@CRLF
	OUTSTR	[ASCIZ/ NOTE: TTY TABLE FULL - TELL SYSTEMS PERSON/]
	OUTSTR	@CRLF
	OUTSTR	@CRLF
	OUTSTR	[ASCIZ/"OPR: PLEASE  .SEND TTY:/]
	MOVE	11,4		;MOVE TTY# TO AC11
	SUBI	11,200000	;REMOVE OFFSET
	PUSHJ	17,OCTPNT	;GO TYPE OCTAL TTY#
	OUTSTR	[ASCIZ/:ON-LINE ENTRY FULL (PLEASE .SET TTY PAGE 63) AND TRY LATER
/]

	JRST	@GETTTY		;RETURN


;	WE HAVE A 'HOLE' - - - - - TABLE HIM - - - - - - -

TBLB:	MOVEM	4,TTYTBL+2(5)	;MOVE TTY# (+200000) TO TTYTBL
				;THIS ALSO CLEARS FLAGS!!!!
	HLRZ	3,TTYTBL(5)	;MOVE LOGICAL TTY# TO AC3
	MOVEM	3,@TTYADR	;JAM LOGICAL TTY# FOR COBOL TABLE ROLLING
	JSR	MSGENT		;TELL CONTROL TTY ABOUT NEW TTY

;
;	MAKE HIM A SLAVE   =   (.SET TTY SLAVE)
;
;	(AC4 CONTAINS TTY# + 200000)
;

	MOVEM	4,SETSL1	;MOVE TTY#+200000 TO SET SLAVE 
	MOVE	2,[XWD 3,SETSLV] ;SET AC2 FOR CALLI (TRMOP.)
	CALLI	2,116		;SLAVE THE TTY!!!!!!
	JRST	ERR2		;CALLI FAILED / COMPLAIN - - - 



;
;	TURN HIS GAG OFF  = (.SET TTY NO GAG)
;

	MOVEM	4,SETGG1	;MOVE TTY#+200000 TO SET NO GAG
	MOVE	2,[XWD 3,SETGAG] ;SET AC2 FOR CALLI (TRMOP.)
	CALLI	2,116		;SET HIS GAG BIT TO 'NO GAG'
	JRST	ERR2		;CALLI FAILED / COMPLAIN - - -

;
;	PRETEND HE HAS NO TABS	(.SET TTY NO TABS)
;

	MOVEM	4,NOTAB1	;MOVE TTY# + 200000 TO ARGS
	MOVE	2,[XWD 3,NOTAB]	;SET AC2 FOR CALLI (TRMOP.)
	CALLI	2,116		;SET HIS TAB SWITCH TO  'NO TABS'
	JRST	ERR2		;IF IT FAILS (WHICH IT DID) COMPLAIN



;	TELL MASTER TTY HOW MANY USERS WE NOW HAVE

	AOS	TTYS		;ADD 1 TO # OF SLAVE TTYS
	JSR	NAMCHG		;CHANGE NAME TO REFLECT # SLAVES

;	CLEAR HIS INPUT BUFFER (MONITOR LEAVES 'LINE-TYPED' BIT ON
;			       (FROM  .SET TTY SLAVE              )

;	HRRZI	3,3		;SET UP FUNCTION CODE (CLEAR TTY INPUT BUFFER)
;	MOVE	2,[XWD 2,3]	;SET AC2 FOR CALLI 116 (TRMOP.)
;	CALLI	2,116		;CLEAR HIS INPUT BUFFER
;	JRST	.+1		;ERROR RETURN (SO WHAT!!!!)
	HLR	1,SBITTY	;MOVE PHYSICAL TTY NAME
	HRRM	1,TTYTBL+1(5)	;TO TTYTBL
	MOVEM	16,TTYTBL+3(5)	;MOVE START-TIME (JIFFIES) TO TTYTBL
	JRST	RESTAC		;GO RESTORE ACS &  RETURN TO COBOL
				;WITH NEWLY FOUND TTY!!!!!!

PAGE

;	PROCESS REQUEST FROM MASTER TTY

PROMST:	0			;SAVE RETURN PC HERE
	TTCALL	11,0		;CLEAR INPUT BUFFER / LIKE (^U)
	CAMN	1,K		;SKIP - IF CHAR NO = 'K'
	JRST	PROKIL		;GO PROCESS KILL COMMAND
	CAMN	1,S		;SKIP - CHAR NOT = 'S'
	JRST	PROSLV		;GO PROCESS SLAVE LIST
	CAMN	1,H		;SKIP - IF CHAR NOT = 'H'
	JRST	HELP		;GO PROCESS HELP
	CAMN	1,POUND		;SKIP - IF CHAR NOT = '#'
	JRST	SLVCNT		;GO TYPE SLAVE-COUNT
	OUTSTR	[ASCIZ/ ?WHAT?     TRY   H   FOR HELP
/]
	
PROCNT:	OUTSTR	[ASCIZ"

T/P FOR   ON-LINE ORDER ENTRY   RUNNING

"]
	JRST	@PROMST		;RETURN

PAGE

;	PROCESS KILL-SLAVES  GRACEFULLY

PROKIL:	OUTSTR	[ASCIZ/ILL SLAVES & JOB
/]
PKA:	OUTSTR	[ASCIZ/
CONFIRM (Y-N) :/]
	TTCALL	0,1		;GET ANSWER INTO AC1
				;(WAIT IF NECESSARY)
	TTCALL	11,0		;CLEAR INPUT BUFFER LIKE (CTL U)
	CAME	1,N		;SKIP - IF 'N'
	JRST	PK1		;GO TO TEST FOR 'Y'
	OUTSTR	[ASCIZ/O
/]
	JRST	PROCNT		;RETURN

PK1:	CAMN	1,Y		;SKIP - IF NOT = 'Y'
	JRST	PK2		;GO PROCESS 'Y'
	OUTSTR	[ASCIZ/??

/]
	JRST	PKA		;INVALID CONFIRM: / GO TRY AGAIN

PK2:	OUTSTR	[ASCIZ/ES  BEGIN UNSLAVING TTYS

/]
	MOVE	1,JMPPK3	;MOVE JRST PK3A TO AC1
	MOVEM	1,JAMIT		;MOVE JRST PK3A TO JAMIT:
	SETZ	5,		;ZERO AC5
	MOVEI	7,MAXTTY	;MAX # TABLE ENTRIES

PK3:	MOVE	1,TTYTBL+2(5)	;PHYSICAL TTY# (+200000) TO AC1
	JUMPN	1,PK4		;GO UNSLAVE THIS GUY - - - - 
PK3A:	ADDI	5,TABSIZ	;BUMP INDEX TO NEXT ENTRY (TABSIZ WORDS/ENTRY)
	SUBI	7,1		;DECREMENT # TABLE ENTRIES LEFT
	JUMPG	7,PK3		;GO LOOK @ NEXT TABLE ENTRY
	OUTSTR	[ASCIZ/

ALL TTY'S UNSLAVED : RETURNING TO COBOL PROGRAM
/]
	MOVE	1,EXIT		;MOVE EXIT UUO TO AC1
	MOVEM	1,TP		;JAM EXIT ON TP:
	HRRZI	1,1		;JAM LOGICAL TTY#1
	MOVEM	1,@TTYADR	;IN COBOL PROGRAM / THIS TRIPS WRAP-UP ROUTINES
	JRST	RESTAC		;GO RETURN TO COBOL PROGRAM

EXIT:	CALLI	1,12		;EXIT UUO / WILL BE JAMMED ON TP:
				;@ CLOSE OF T/P
JMPPK3:	JRST	PK3A		;JUMP TO PK3A: / WILL BE JAMMED ON JAMIT:

PK4:	MOVE	1,STOPIT	;JAM USERS MESSAGE AREA
	MOVEM	1,@TYPPTR	;TO FORCE UNSLAVE
	JRST	DLA		;GO UNSLAVE TTY
				;RETURN WILL BE FROM JAMIT:
				;TO PK3: (JAMIT: WAS ALTERED IN PK2:)
PAGE

;	PROCESS SLAVE LIST

PROSLV:	OUTSTR	[ASCIZ"LAVE LIST (T/P PAGE "]
	MOVE	11,TPID		;MOVE TP PAGE TO AC11
	PUSHJ	17,DECPNT	;CONVERT TO DECIMAL & TYPE
	OUTSTR	[ASCIZ/)  @ /]
	JSR	TIMER		;GO GET CURRENT TIME
	JSR	TYTIME		;GO TYPE TIME (HH:MM)
				; (HH) IN AC14
				; (MM) IN AC15
	OUTSTR	[ASCIZ/

TTY #  CONN.  T.S.

/]
	SETZ	5,		;ZERO AC5
	MOVEI	7,MAXTTY	;MAX # TABLE ENTRIES
	SETZM	GOTANY		;CLEAR GOTANY: SWITCH

PS1:	HRRZ	1,TTYTBL+2(5)	;PHYSICAL TTY #(+200000) TO AC1
	JUMPN	1,PS3		;GOT ONE - GO TYPE HIM

PS2:	ADDI	5,TABSIZ	;BUMP INDEX TO NEXT ENTRY (TABSIZ WORDS/ENTRY)
	SUBI	7,1		;DECREMENT # TABLE ENTRIES LEFT
	JUMPG	7,PS1		;GO LOOK @ NEXT TABLE ENTRY
	SKIPN	GOTANY		;ALL DONE / SKIP IF SLAVES
	OUTSTR	[ASCIZ/* * NO SLAVES * *
/]
	SETZ	5,		;ZERO AC5
	MOVEI	7,MAXTTY	;MAX # TABLE ENTRIES
	JRST	PROCNT		;RETURN

PS3:	SUBI	1,200000	;SUBTRACT 200000 FROM TTY#
	OUTSTR	[ASCIZ/TTY/]
	MOVE	11,1		;MOVE OCTAL TTY# TO AC11
	PUSHJ	17,OCTPNT	;GO TYPE OCTAL
	OUTSTR	[ASCIZ/	/]
	JSR	CONTIM		;GO CALCULATE & TYPE CONNECT TIME
	OUTSTR	[ASCIZ/  /]
	HRRZ	11,TTYTBL(5)	;MOVE # TRANSACTION SETS TO AC11
	PUSHJ	17,DECPNT	;CONVERT TO DECIMAL & TYPE
	OUTSTR	@CRLF		;TYPE <CR><LF>
	SETOM	GOTANY		;SET 'WE HAVE SLAVES' SWITCH
	JRST	PS2		;GO LOOK @ NEXT TABLE ENTRY

PAGE

;	# SLAVES  (TYPE OUT ON MASTER TTY)

SLVCNT:	OUTSTR	[ASCIZ/ SLAVES CONNECTED = /]
	MOVE	11,TTYS		;MOVE # OF CONNECTED SLAVES TO AC11
	PUSHJ	17,DECPNT	;CONVERT TO DECIMAL & TYPE
	OUTSTR	@CRLF		;TYPE <CR><LF>
	JRST	PROCNT		;RETURN
PAGE

;	H E L P   THE MASTER TTY OPERATOR


HELP:	OUTSTR	[ASCIZ" E L P

ALL TTY COMMANDS TO T/P ARE SINGLE CHARACTERS WITH NO <CR>
"]
	OUTSTR [ASCIZ"

# -  # SLAVE TTYS RUNNING UNDER THIS T/P
H -  HELP (THIS TEXT)"]
	OUTSTR	[ASCIZ"
K -  KILL ALL SLAVES & JOB (REQUIRES CONFIRM:)"]
	OUTSTR	[ASCIZ"
S -  SLAVE LIST (TTY#, CONNECT TIME,TRANSACTION SETS)

END HELP
"]
	JRST	PROCNT		;RETURN

PAGE

;	TYPE TIME   HH:MM    ON MASTER TTY
;
;		(HH) AC14    (MM) AC15


TYTIME:	0			;SAVE RETURN PC HERE
	MOVE	11,14		;MOVE HOURS TO AC11
	CAMG	11,NINE		;SKIP - IF MORE THAN 9 HOURS
	OUTSTR	@ZERO		;TYPE LEADING ZERO FOR HOURS
	PUSHJ	17,DECPNT	;CONVERT TO DECIMAL & TYPE
	OUTSTR	@COLON		;TYPE COLON
	MOVE	11,15		;MOVE MINUTES TO AC11
	CAMG	11,NINE		;SKIP - IF MORE THAN 9 MINUTES
	OUTSTR	@ZERO		;TYPE LEADING ZERO FOR MINUTES
	PUSHJ	17,DECPNT	;CONVERT TO DECIMAL & TYPE
	JRST	@TYTIME		;RETURN


;	CALCULATE & TYPE SLAVES CONNECT TIME
;
;	AC5 MUST BE SET TO TTYTBL ENTRY FOR TTY
;
;	CURRENT TIME MUST BE IN AC16 (JIFFIES)


CONTIM:	0			;SAVE RETURN PC HERE
	MOVE	15,TTYTBL+3(5)	;MOVE START TIME (JIFFIES) FROM TTYTBL
	MOVE	14,16		;MOVE CURR TIME TO AC14 FOR DIVIDE 2 WORD RESULT
	SUB	14,15		;SUBTRACT START TIME FROM STOP TIME
	IDIVI	14,^D3600	;CONVERT JIFFIES TO MINUTES
	IDIVI	14,^D60		;CONVERT MINUTES TO HOURS  AC14
				;       REMAINDER MINUTES  AC15
	JSR	TYTIME		;GO TYPE TIME
	JRST	@CONTIM		;RETURN
PAGE
;
;	OUTPUT MESSAGE ON USERS TERMINAL (CHANNEL 14)
;

OUTTTY:	0			;SAVE RETURN PC HERE!
	SKIPE	GETP		;SKIP IF NOT GETTING FROM TP BUFFER
	JRST	OPNIT		;JUMP TO OPEN
	HRRZ	6,@LNSADR	;MOVE NUMBER OF LINES TO TYPE TO AC6
	JUMPN	6,OPNIT		;JUMP IF LINES NOT = ZERO
	SKIPN	UNSLAV		;SKIP - IF WE WANT TO UNSLAVE
	JRST 	OUTTYB		;JUMP OVER WRITE ROUTINE IF 0 LINES & NO UNSLAVE
OPNIT:	MOVE	1,TTYTBL+1(5)	;MOVE (SIXBIT) TTY NAME TO
	MOVEM	1,OPNTTY+1	;OPEN COMMAND LIST
	OPEN	14,OPNTTY	;OPEN TTY ON CHANNEL 14
	JRST	ERR3		;OPEN FAILED/GO TELL THE WORLD
BUFBLD:	JRST	.+1		;THIS IS ALTERED TO RESETO:
	MOVE	1,[XWD 0,RESETO]	;MOVE ADDRESS OF RESETO TO RH AC1
	HRRM	1,BUFBLD	;ALTER BUFBLD: TO PROCEED TO RESETO:
	INBUF	14,1		;SETUP 1 INPUT  BUFFER ON CH14
	OUTBUF	14,1		;SETUP 1 OUTPUT BUFFER ON CH14
	MOVE	1,[XWD OBUF,SAOBUF] ;SET UP BLT
	BLT	1,SAOBUF+2	;SAVE OBUF BUFFER RING HEADER
	MOVE	1,[XWD IBUF,SAIBUF] ;SET UP BLT
	BLT	1,SAIBUF+2	;SAVE IBUF BUFFER RING HEADER
	JSR	LOCKIT		;GO LOCK JOB IN CORE


RESETO:	MOVE	1,[XWD SAOBUF,OBUF] ;SET UP BLT
	BLT	1,OBUF+2	;RESET OBUF RING HEADER
	OUT	14,		;OUTPUT ON CHANNEL 14
	JRST	.+2		;OK- JUMP OVER FAILURE - - - 
	JRST	ERR4		;SORRY OUTPUT FAILED/ SNIFF!

;	CHECK TO SEE IF WE ARE GOING TO FILL TTY RING BUFFER
;	FROM TP BUFFER

	SKIPN	GETP		;SKIP - -IF WE WANT TO FILLTTY RING
				;BUFFER FROM TP BUFFER
	JRST	CKUNSL		;JUMP TO CHECK FOR UNSLAVE
	
TPLOOP:	ILDB	2,TTYTBL+6(5)	;GET BYTE FROM TP TABLE
	IDPB	2,OBUF+1	;PUT BYTE IN TTY RING BUFFER
	SOSN	OBUF+2		;DECREMENT RING BUFFER BYTE COUNTER
				;SKIP - WHEN NOT FULL -
	JRST	TPLOP1		;TTY RING BUFFER FULL - - GO WRITE
	SOSLE	TTYTBL+5(5)	;DECREMENT TP BUFFER BYTE COUNTER
				;SKIP - WHEN TP BUFFER EMPTY
	JRST	TPLOOP		;LOOP
TPLOPA:	MOVE	1,TTYTBL+4(5)	;RESET EXTRACT BYTE POINTER SINCE
	MOVEM	1,TTYTBL+6(5)	;BUFFER IS NOW EMPTY
	JRST	TPLOP2		;TP BUFFER EMPTY - GO WRITE(AFTER SWITCH CLEAR)
TPLOP1:	SOSG	TTYTBL+5(5)	;DECREMENT TP BUFFER BYTE COUNTER
				;SKIP - IF 'GREATER THAN'  ZERO
	JRST	TPLOPA		;GO RESET EXTRACT BYTE POINTER
TPLOP2:	SETZM	GETP		;CLEAR SWITCH (MOVE FROM TP SWITCH)
	SETOM	TALKED		;TELL SLEEPER THAT WE DID SOMETHING
	SKIPL	TTYTBL+5(5)	;SKIP IF BYTE COUNTER LESS THAN ZERO
	JRST	TPLOP3		;GO OVER ERROR ROUTINE
	SETZM	TTYTBL+5(5)	;ZERO THE DAMN THING/ TELL OPERATOR
	OUTSTR	[ASCIZ/
  BYTE COUNTER HAS GONE NEGATIVE FOR  TTY/]
	MOVE	11,TTYTBL+2(5)	;MOVE TTY NUMBER TO AC11
	SUBI	11,200000	;REMOVE TRMOP OFF-SET
	PUSHJ	17,OCTPNT	;GO TYPE IT IN OCTAL
	OUTSTR	[ASCIZ/  @  /]
	JSR	TIMER		;GO GET CURRENT TIME
	JSR	TYTIME		;GO TYPE TIME ON MASTER TTTY
	OUTSTR	[ASCIZ/

/]
TPLOP3:	JRST	OTD		;GO WRITE - - - - - - - -

;	CHECK FOR UNSLAVE REQUEST / BUILD FINAL USER MESSAGE ON UNSLAVE

CKUNSL:	SKIPN	UNSLAV		;SKIP - IF WE WANT TO UNSLAVE TTY
	JRST	OTA1		;LEAVE HIM SLAVED/NOT FINAL MESSAGE
	MOVE	1,POINT4	;MOVE POINTER FOR COBOL TTY I-O AREA TO AC1
	MOVEM	1,POINT3	;THEN TO POINT3
	MOVE	1,FINPT		;POINTER TO FINAL
	MOVEM	1,FINPNT	;USER MESSAGE
	HRRZI	4,^D30		;SET AC4 TO ^D30
OTL:	ILDB	3,FINPNT	;LOAD CHARACTER FROM FINAL MESSAGE
	IDPB	3,POINT3	;DEPOSIT CHARACTER IN COBOL I-O AREA
	SOJN	4,OTL		;SUBTRACT 1 FROM AC4
				;JUMP IF = 0
				;JUMP BACK IF NOT DONE
	HRRZI	6,1		;SET # LINES TO 1


;	MOVE FROM COBOL OCCURS 'N' TIMES  PIC X(75) ASCII
;	TO OUTPUT TTY RING BUFFER
;	THEN TO TP BUFFER WHEN TTY RING FULL
;	WHEN TP BUFFER FULL THROW AWAY ALL OTHER CHARACTERS
;	NOTIFY -  MASTER TTY OF LOST CHARACTERS
;

OTA1:	MOVE	13,TTYTBL+4(5)	;MOVE TP BUFFER BYTE POINTER TO AC13
	SETZ	14,		;ZERO BYTE COUNTER FOR TP BUFFER
	SETO	15,		;SET AC15 TO ONES INDICATING TTY RING BUFFER 
				;HAS ROOM LEFT
	SETO	16,		;SET AC16 TO ONES INDICATION TP BUFFER
				;HAS ROOM LEFT

;	LOOK FOR RIGHT MOST NON-SPACE IN COBOL I-O AREA

	HRRZI	4,40		;MOVE ASCII SPACE TO AC4 (RJ)
	MOVE	1,POINT4	;INITIALIZE BYTE POINTER
	MOVEM	1,POINT3	;FOR COBOL TTY I-O AREA
	MOVE 	10,1		;INITIALIZE BEGIN BUFFER POINTER AC10
	HRRZI	2,^D74		;INITIALIZE AC2 FOR COBOL I-O AREA SIZE
	MOVE	11,POINT3	;HOLD BYTE POINTER (BEGINNING OF BUFFER)
	
OTA:	ILDB	3,POINT3	;ILDB TO AC3 USING BYTE POINTER CBL I-O AREA
	CAME	3,4		;SKIP - IF CHAR = SPACE
	MOVE	10,POINT3	;SAVE BYTE POINTER IF NOT = SPACE
	SOJN	2,OTA		;DECREMENT CHARACTER COUNTER
				;IF NOT = 0  LOOP TO OTA:

	ILDB	3,POINT3	;MOVE CARRIAGE POSITION CHARACTER
				;FROM POS75 TO AC3


;	MOVE FROM COBOL I-O AREA TO TTY OUTPUT RING / TP BUFFER

OTB:	CAMN	10,11		;SKIP - IF WE HAVE NOT MOVED LAST CHAR FROM THIS LINE
	JRST	NXTLIN		;GO GET NEXT LINE
	ILDB	2,11		;GET NEXT BYTE FROM COBOL I-O AREA
	JSR	ADDCHR		;GO PUT CHAR IN TTY/TP BUFFER
	JRST	OTB		;LOOP

NXTLIN:	CAIN	3,40		;SKIP IF CTL CHAR NOT = SPACE	
	JRST	CRLFD		;GO TYPE <CR><LF>
	CAIN	3,116		;SKIP IF CTL CHAR NOT = 'N'
	JRST	NXTLNE		;GIVE NO CTL CHARACTERS
	CAIN	3,103		;SKIP IF CTL CHAR NOT = 'C'
	JRST	CR		;GO TYPE  <CR>
	OUTSTR	[ASCIZ/
% TP HAS UNRECOGNIZABLE CHARACTER  (/]
	OUTCHR	3		;PLACE HIS CHAR HERE
	OUTSTR	[ASCIZ/)   IN POS.75 
FOR RETURN MESSAGE LINE CONTROL WILL GIVE USR <CR><LF>
/]
	JRST	CRLFD		;GO TYPE  <CR><LF>


CRLFD:	HRRZI	2,15		;MOVE <CR> (OCTAL 15) 
	JSR	ADDCHR		;GO ADD <CR>
	HRRZI	2,12		;MOVE <LF> (OCTAL 12)
	JSR	ADDCHR		;GO ADD <LF>
	JRST	NXTLNE		;GO GET NEXT LINE FROM COBOL


CR:	HRRZI	2,15		;MOVE <CR> (OCTAL 15) TO AC2
	JSR	ADDCHR		;GO ADD <CR>
	JRST	NXTLNE		;GO GET NEXT LINE FROM COBOL

NXTLNE:	SOSN	6		;DECREMENT LINE COUNTER/
				;SKIP - IF NOT DONE
	JRST	OTD		;DONE  GO WRAP-UP
	MOVE	10,POINT3	;INITIALIZE
	MOVE	11,POINT3	;	POINTERS
	HRRZI	2,^D74		;	  AND BYTE COUNTER
	JRST	OTA		;GO LOOK FOR RIGHT MOST NON-SPACE


;	ADD CHARACTER TO OUTPUT RING BUFFER OR TP BUFFER

ADDCHR:	0			;STORE RETURN HERE
	AOS	CHROUT		;ADD 1 TO # CHARACTERS TYPED OUT
	JUMPE	16,TPBUF	;JUMP TO FILL TP BUFFER WHEN RING BUFFER FULL
	IDPB	2,OBUF+1	;DEPOSIT BYTE IN TTY RING BUFFER
	SOSE	OBUF+2		;DECREMENT RING BUFFER BYTE COUNTER
				;SKIP - WHEN   ZERO
	JRST	@ADDCHR		;RETURN
	SETZ	16,		;SET AC16 TO ZERO
				;THIS SAYS THAT TTY RING BUFFER FULL
	JRST	@ADDCHR		;RETURN

TPBUF:	JUMPE	15,@ADDCHR	;RETURN IF TP BUFFER FULL
	IDPB	2,13		;DEPOSIT BYTE IN TP BUFFER
	AOS	14		;ADD 1 TO TP BYTE COUNTER
	MOVEM	14,TTYTBL+5(5)	;MOVE BYTE COUNT TO TTYTBL
	CAIE	14,TBUFSZ	;SKIP - IF BUFFER FULL - - - - - 
	JRST	@ADDCHR		;RETURN
	SETZ	15,		;SET AC15 TO ZERO
	OUTSTR	[ASCIZ/TP MESS.TRUNCATED
/]
	JRST	@ADDCHR		;RETURN



OTD:	SETZ	2,		;ZERO (NULL) AC2
	MOVE	1,OBUF+1	;MOVE BYTE POINTER TO AC1
	IDPB	2,1		;PLACE 4 ASCII
	IDPB	2,1		;NULLS AT
	IDPB	2,1		;END OF
	IDPB	2,1		;BUFFER (TTY RING BUFFER)

	OUT	14,		;OUTPUT THE LINE
	JRST	.+2		;JUMP OVER ERROR
	JRST	ERR4		;OUTPUT FAILED/ COMPLAIN!
	SKIPN	UNSLAV		;SKIP - IF WE WANT TO UNSLAVE TTY
	JRST	OUTTYA		;LEAVE HIM SLAVED -


;
;	RESET HIS PAGE TO 63  =  (.SET TTY PAGE 63)
;

	MOVE	1,TTYTBL+2(5)	;MOVE PHYSICAL TTY#+200000 TO AC1
	MOVEM	1,SETPG1	;MOVE AC1 TO SET PAGE LIST
	MOVE	2,[XWD 3,SETPAG] ;SET AC2 FOR CALLI (TRMOP.)
	CALLI	2,116		;SET HIS PAGE COUNT TO 63
	OUTSTR [ASCIZ/
NOTE: CALLI FAILED IN PAGE RESET OF UNSLAVE
/]

;	UNSLAVE USERS TTY HERE - - - - - - - - - - 

	SETZM	UNSLAV		;CLEAR UNSLAVE SWITCH
	MOVE	1,[XWD 3,DESLAV];SET UP FOR UNSLAVE
	CALLI	1,116		;TRY THE -UNSLAVE-
	JRST	.+2		;UNSLAVE FAILED
	JRST	.+1		;UNSLAVE WORKED


;	THIS SECOND 'UNSLAVE' ROUTINE WITH THE ^C IS TO FAKE OUT MONITOR BUG
;	WHEN THE BUG IS FIXED THIS ROUTINE WILL STILL WORK - -

	CLOSE	14,0		;CLOSE TO FAKE OUT UNSLAVE BUG
	HRRZI	1,3		;MOVE <^C> (OCTAL 003) TO AC1
	IDPB	1,OBUF+1	;MOVE <^C> TO OUTPUT BUFFER
	SOS	OBUF+2		;DECREMENT BYTE COUNTER
	OUT	14,		;WRITE THE <^C>
	JRST	.+2		;WRITE OK
	JRST	.+1		;WRITE FAILED
	MOVE	1,[XWD 3,DESLAV];TRY THE UNSLAVE AGAIN
	CALLI	1,116		;-UNSLAVE-
	JRST	.+2		;UNSLAVE (SECOND TIME FOR MONITOR GLITCH!!) -FAILED-
	JRST	.+1		;SECOND UNSLAVE -OK-
OUTTYA:	RELEAS	14,		;BREAK CHANNEL/DEVICE BOND

;	SPACE OUT COBOL I-O AREA FOR NEXT MESSAGE FROM TTY (1 RECORD ONLY)

OUTTYB:	MOVE	1,POINT4	;SET UP COBOL AREA
	MOVEM	1,POINT3	;BYTE POINTER
	MOVEI	1,40		;MAKE AC1  ASCII SPACE (040)
	MOVEI	2,^D75		;SET COUNTER TO ^D75
OTZ:	IDPB	1,POINT3	;DEPOSIT SPACE
	SOJN	2,OTZ		;LOOP 'TIL ALL 75 CHAR SPACES

	JRST	@OUTTTY		;RETURN

OPNTTY:	1			;ASCII LINE  MODE FOR TTY
	SIXBIT /      /		;DEVICE TO BE OPENED
	XWD OBUF,IBUF		;ESTABLISH ADDRESSES FOR BUFFER HEADERS

OBUF:	BLOCK 3		;SPACE FOR OUTPUT BUFFER HEADER
IBUF:	BLOCK 3		;SPACE FOR INPUT  BUFFER HEADER

SAOBUF:	BLOCK 3		;SAVE AREA FOR OBUF HEADER
SAIBUF:	BLOCK 3		;SAVE AREA FOR IBUF HEADER

PAGE

;
;	ROUTINES TO CONVERT & TYPE ON TTY
;		 OF CONTROLLING JOB AN OCTAL NUMBER EITHER IN
;		 OCTAL OR DECIMAL (STRIPPING LEADING ZEROES)
;
;	THE OCTAL NUMBER MUST BE IN AC11
;
;	TO CALL:    PUSHJ  17,DECPNT   ;FOR DECIMAL CONVERT/TYPE
;		    PUSHJ  17,OCTPNT   ;FOR OCTAL TYPE
;



DECPNT:	MOVE	1,POINT2	;SET UP
	MOVEM	1,POINT1	;BYTE POINTER
	MOVE	1,SPACES	;MOVE SIXBIT SPACES TO
	MOVEM	1,OCTHLD	;WORD 1 OF OCTHLD
	IDIVI	11,12		;12 OCTAL = 10 DECIMAL
	PUSH	17,12		;SAVE REMAINDER
	SKIPE	11		;ALL DIGITS FORMED?
	PUSHJ	17,DECPNT	;NO- COMPUTE NEXT ONE
DECPN1:	POP	17,11		;YES-TAKE OUT IN OPPOSITE ORDER
	ADDI	11,20		;CONVERT TO SIXBIT
	IDPB	11,POINT1	;HOLD SIXBIT BYTE IN OCTHLD
	ADDI	11,40		;CONVERT FROM SIXBIT TO ASCII
	SKIPN	NOTYPE		;SKP - 'NO-TYPE'  SWITCH SET
	OUTCHR	11		;TYPE OUT CHARACTER
	POPJ	17,		;JUMP TO DECPN1 OR RETURN

OCTPNT:	MOVE	1,POINT2	;SET UP
	MOVEM	1,POINT1	;BYTE POINTER
	MOVE	1,SPACES	;MOVE SIXBIT SPACES TO
	MOVEM	1,OCTHLD	;WORD 1 OF OCTHLD
	IDIVI	11,10		;10 OCTAL = 10 OCTAL
	PUSH	17,12		;SAVE REMAINDER
	SKIPE	11		;ALL DIGITS FORMED
	PUSHJ	17,OCTPNT+4	;NO- COMPUTE NEXT ONE
OCTPN1:	POP	17,11		;YES-TAKE OUT IN OPPOSITE ORDER
	ADDI	11,20		;CONVERT TO SIXBIT
	IDPB	11,POINT1	;HOLD SIXBIT BYTE IN OCTHLD
	ADDI	11,40		;CONVERT TO ASCII
	SKIPN	NOTYPE		;SKIP - IF 'NO-TYPE' SWITCH SET
	OUTCHR	11		;TYPE OUT CHARACTER
	POPJ	17,		;JUMP TO OCTPN1 OR RETURN
PAGE
;
;	CHANGE THE PROGRAM NAME FOR SYSTAT  ETC.
;
;	TO REFLECT THE NUMBER OF SLAVES IN (RH)
;
;

NAMCHG:	0			;SAVE RETURN PC
	MOVE	11,TTYS		;MOVE # OF SLAVES TTYS TO AC11
	SETOM	NOTYPE		;SET NO TYPE SWITCH (WHILE CONVERTING)
	PUSHJ	17,DECPNT	;GO CONVERT TO DECIMAL
	HLRZ	1,OCTHLD	;MOVE SIXBIT # SLAVES
	HRRM	1,JOBNAM	;TO (RH) OF  JOB NAME
	MOVE	1,JOBNAM	;MOVE JOBNAM TO AC1
	CALLI	1,43		;GO CHANGE PROGRAM NAME
	SETZM	NOTYPE		;CLEAR  'NOTYPE'  SWITCH
	JRST	@NAMCHG		;RETURN

PAGE

;
;	ROUTINE TO TYPE ON MASTER TTY T/P VOLUME STATUS
;

STATUS:	0			;SAVE RETURN PC
	OUTSTR	[ASCIZ/#SLV= /]
	MOVE	11,TTYS		;MOVE # TTYS SLAVED TO AC11
	PUSHJ	17,DECPNT	;CONVERT TO DECIMAL & TYPE ON MASTER TTY
	OUTSTR	[ASCIZ/ ; #TS= /]
	MOVE	11,TSTOT	;MOVE # TRANSACTION SETS TO AC11
	PUSHJ	17,DECPNT	;CONVERT TO DECIMAL & TYPE ON MASTER TTY
	OUTSTR	[ASCIZ/ ; #CHR-IN= /]
	MOVE	11,CHRIN	;MOVE # CHARACTERS TYPED IN BY ALL TERMINALS
				;(NOT COUNTING MASTER TTY)  TO AC11
	PUSHJ	17,DECPNT	;CONVERT OT DECIMAL & TYPE ON MASTER TTY
	OUTSTR	[ASCIZ/ ; #CHR-OUT= /]
	MOVE	11,CHROUT	;MOVE # CHARACTERS TYPED OUT BY ALL TERMINALS
				;(NOT COUNTING MASTER TTY)  TO AC11
	PUSHJ	17,DECPNT	;CONVERT TO DECIMAL & TYPE ON MASTER TTY
	OUTSTR	[ASCIZ/ 
/]
	JRST	@STATUS		;RETURN

PAGE
;
;	ERROR MESSAGES
;

;	ERR1    GETTAB FAILED IN ESTABLISH THE NUMBER OF TTYS ON SYSTEM

ERR1:	OUTSTR	@CRLF		;TYPE <CR><LF>
	OUTSTR	[ASCIZ/? ERR1- GETTAB FAILED/]
	OUTSTR	@CRLF		;TYPE <CR><LF>
	HALT

;	ERR2	CALLI FAILED IN GETTTY ROUTINE (FIND SLAVED TTY)

ERR2:	OUTSTR	[ASCIZ/
? ERR2- CALLI FAILED IN GETTTY:
   OPERATOR: CHECK SYS:ACCT.SYS PRIV. WORD IF 5.06 OR LATER MONITOR
/]
	HALT

ERR3:	OUTSTR	[ASCIZ/
 ?ERR3- OPEN FAILED IN OUTTTY
/]
	JRST	@OUTTTY		;TRY NEXT GUY

ERR4:	OUTSTR	[ASCIZ/
 ERR4- OUTPUT FAILED IN OUTTTY
/]
	JRST 	@OUTTTY		;TRY NEXT GUY

ERR5:	OUTSTR	[ASCIZ/
? ERR5- GETTAB FAILED IN SYSTEM-ID
/]
	HALT

ERR6:	OUTSTR	[ASCIZ /
 ERR6- OPEN FAILED IN  INPUT:
/]
	JRST	NXTTY	;GO LOOK AT NEXT TTY


SAVE17:	BLOCK 1
SAVEAC:	BLOCK 20

TYPPTR:	BLOCK 1			;ADDRESS OF TTY I-O MESSAGE AREA

ENTRPC:	BLOCK 1			;HOLD ENTRY PC+1 (THIS ALSO IS ADDRESS OF NUMBER 
				;OF LINES TO TYPE)
TTYADR:	BLOCK 1			;ADDRESS OF LOGICAL TTY#
GOTOAD: BLOCK 1			;ADDRESS OF 1ST GO TO DEPENDING ON
ALTADD: BLOCK 1			;ADDRESS OF ALTERED GO TO - - (DISPATCHER)
MTCADR:	BLOCK 1		;ADDRESS OF MORE-TO-COME
				;SWITCH (COBOL PROGRAM WANTS T/P
				;        TO RETURN WITHOUT A MESSAGE)
LNSADR:	BLOCK 1			;ADDRESS OF NUMBER OF LINES RETURNED BY COBOL PROGRAM
CNTRLC:	BLOCK 1			;ADDRESS OF ^C DISPATCH IN COBOL PROGRAM
				;(CONTROL-C-DISPATCH)

LINTIM:	BLOCK 1			;TIME LAST LINE WAS TYPED TO USER (JIFFIES)

LSTSLV:	BLOCK 1			;TIME SLAVES LAST CHECKED FOR

HBFAIL:	BLOCK 1			;COUNTER FOR HIBERNATE FAILURES

HLDTIM: BLOCK 1			;TIME 'FIRST' SLAVE FOUND

SYSTTY: BLOCK 1			;TOTAL NUMBER OF TTYS ON SYSTEM (OCTAL)


;
;	TOTALS FOR ALL T/P
;

TSTOT:	XWD 0,0		;TOTAL # OF TRANSACTION SETS
CHRIN:	XWD 0,0		;TOTAL # CHARACTERS TYPED IN BY ALL TERMINALS
			;(NOT COUNTING MASTER TTY)
CHROUT:	XWD 0,0		;TOTAL # CHARACTERS TYPED OUT BY ALL TERMINALS
			;(NOT COUNTING MASTER TTY)
TTYS:	XWD 0,0		;NUMBER OF SLAVE TTYS CONNECTED
				;TO THIS JOB

JOBNAM:	SIXBIT/TGN   /		;NAME OF PROGRAM (RH- GETS # SLAVES)


;**************************************************************

DLYSLP:	XWD 0,454		;DELAY SLEEP UNTIL AFTER (300 JIFFIES)

INITIM: XWD 0,^D108000		;INITIAL TIME FOR 'QUICK' CKECKS FOR
				;SLAVES (30 MINUTES) / TIME DOES
				;NOT START UNTIL AFTER FIRST SLAVE FOUND

SLVCHK: XWD 0,^D180		;CHECK FOR NEW SLAVES EVERY 3 SECONDS
				;(180 JIFFIES)

SLVCK1: XWD 0,^D1800		;THIS IS JAMMED ON SLVCHK: AFTER
				;INITIM: JIFFIES AFTER FIRST SLAVE
				;FOUND

				;OF NO TTY ACTIVITY

MAXTTY=^D5		;MAXIMUM NUMBER OF TTYS FOR T/P

TABSIZ=^D125		;SIZE (IN WORDS) OF EACH ENTRY IN TTYTBL
TFIXSZ=^D7		;SIZE (IN WORDS) OF 'FIXED' TTY STUFF
TBUFSZ=<<TABSIZ - TFIXSZ>* 5>  	;SIZE (IN BYTES) OF TTY BUFFER SPACE

TTYTBL:	BLOCK TABSIZ * MAXTTY		;TTY TABLE
				;WORD 1 LH = LOGICAL TTY# (OCTAL STARTING WITH 2)
				;WORD 1 RH = NUMBER OF TRANSACTION SETS
				;WORD 2    = PHYSICAL TTY NAME (SIXBIT)
				;WORD 3 LH = FLAGS
				;     BIT 0  = DATA PHONE
				;     BIT 1  = NO 'ACCEPT' THIS TIME
				;  BITS 2-17   FREE
				;WORD 3 RH = PHYSICAL TTY # +200000
				;WORD 4    = BEGINNING TIME FOR TTY (JIFFIES)
				;WORD 5    = BYTE POINTER TO THIS TTY BUFFER
				;WORD 6    = BYTES LEFT TO BE TYPED FROM THIS BUFFER
				;WORD 7    = BYTE POINTER TO EXTRACT FROM THIS BUFFER
				;WORDS 8 THRU TABSIZ = TTY OUTPUT BUFFER SPACE


;**************************************************************

PAGE
SYSID:	BLOCK 5			;THIS WILL GET INITIALIZED WITH SYSTEM-ID IN ONCE:

NINE:	XWD 0,11		;DECIMAL NINE
POUND:	XWD 0,43		;ASCII '#'
H:	XWD 0,110		;ASCII 'H'
K:	XWD 0,113		;ASCII 'K'
N:	XWD 0,116		;ASCII 'N'
S:	XWD 0,123		;ASCII 'S'
Y:	XWD 0,131		;ASCII 'Y'


JRSTID:	XWD 0,254020		;LH OF JRST @
JRSTXX: XWD 0,254000		;LH OF JRST


;**************************************************



STOPIT:	ASCII/!STOP/		;THIS TELLS ME THAT TTY IS DONE

ECHON:	ASCII/ECHON/		;THIS TELLS ME USER WANTS HIS
				;ECHO STATUS 'ON'

ECHOFF:	ASCII/ECHOF/		;THIS TELLS ME USER WANTS HIS
				;ECHO STATUS 'OFF' (NO ECHO)

BADPW:  ASCII/BADPW/		;THIS TELLS ME USER BEING FLUSHED
				;DUE TO BAD PASSWORDS - - - - 
				;ACCORDING TO COBOL PROGRAM

TPID:	XWD 0,^D44		;THIS IS THE TP ID (44 DECIMAL
				;THE TERMINAL USER TYPES
				; (.SET TTY PAGE 10 <CR>)
				;THIS FEATURE ALLOWS MULTIPLE
				;TP'S TO BE ON THE SYSTEM @ ONE TIME

;********************************************************

SPACES: SIXBIT/      /		;1 WORD OF SIXBIT SPACES
ZERO:	[ASCII/0/]
SPACE:	[ASCIZ/ /]
COLON:	[ASCII/:/]
CRLF:	[ASCII/
/]
MESS1:	ASCIZ/TTY #/

SIXTTY:	SIXBIT/TTY   /
NOTYPE:	XWD 0,0			;NO-TYPE SWITCH FOR OCTAL CONVERT
				;ROUTINE  OCTPNT:
BADTTY:	BLOCK 1			;SIXBIT NAME OF LAST TTY OPR: WAS REQUSETED TO UNSLAVE
UNSLAV:	XWD 0,0			;UNSLAVE SWITCH / IF = 1, UNSLAVE TTY
TALKED:	XWD 0,0			;HAVE I TALKED TO TTY THIS LOOP
GOTANY:	BLOCK 1			;SWITCH FOR PROSLV: (SLAVES)
GETP:	XWD 0,0			;1 WORD SWITCH
				;(WHEN ONES, IT TELLS OUTTTY:
				; TO FILL RING BUFFER FROM TP BUFFER)

SLEEPCT:	XWD 0,0		;SLEEP COUNTER

FINMES:	ASCIZ/
END    MIKE & NICK
.                                 /



;****
PTYTBL:	POINT 7,TTYTBL		;BYTE POINTER FOR TTYTBL INITIALIZATION
;****

;****
POINT1:	BLOCK 1			;POINTER FOR DEPOSIT BYTE GETS MOVED HERE
POINT2:	POINT 6,OCTHLD		;POINTER FOR DEPOSIT BYTE
OCTHLD:	BLOCK 2			;HOLD SIXBIT EQUIVALENT OF OCTAL NUMBER
SBITTY:	BLOCK 1			;HOLD SIXBIT TTY # (OCTAL) LEFT JUSTIFIED
;****

;****
POINT3:	BLOCK 1			;POINTER FOR TTY I-O AREA (COBOL)
POINT4:	POINT 7,.		;MASTER POINTER HERE (FOR COBOL TTY I-O AREA)
				;RH - OF POINTER JAMMED IN ONCE:
				;WITH ADDRESS OF COBOL MESSAGE AREA
;****

;****
FINPNT:	BLOCK 1			;POINTER TO
FINPT:	POINT 7,FINMES		;FINAL USER MESSAGE
;****

PAGE
;****
SETSLV:	XWD 0,2004	;COMMAND
SETSL1:	XWD 0,0		;   ARGUMENTS FOR
SETSL2: XWD 0,1		;      .SET TTY SLAVE
;****

;****
DESLAV:	XWD 0,2004		;COMMAND
DESLA1: XWD 0,0			;   ARGUMENTS FOR
DESLA2: XWD 0,0			;      .SET TTY NO SLAVE
;****

;****
SETPAG:	XWD 0,2023		;COMMAND
SETPG1:	XWD 0,0			;   ARGUMENTS FOR
SETPG2:	XWD 0,^D63		;     .SET TTY PAGE 63
;****

;****
SETGAG:	XWD 0,2013		;COMMAND
SETGG1:	XWD 0,0			;   ARGUMENTS FOR
SETGG2:	XWD 0,1			;      .SET TTY NO GAG
;****


;****
NOTAB:	XWD 0,1005		;COMMAND
NOTAB1:	XWD 0,0			;  ARGUMENTS FOR
NOTAB2:	XWD 0,0			;    .SET TTY NO TABS
;****

;****
ECHO:	XWD 0,2007		;COMMAND
ECHO1:	XWD 0,0		;  ARGUMENTS FOR  .SET TTY PAGE
ECHO2:	XWD 0,0			;   ECHO2 BIT 35 = 1 FOR NO-ECHO
;****



;****
EMPBF:	XWD 0,2			;COMMAND ARGUMENTS FOR
EMPBF1:	XWD 0,0			; TRMOP (2 = SKIP IF OUTPUT BUFFER NOT EMPTY)
;****

LIT
END