.TITLE	WITS
/
/  28 FEB 78 (007; PDH)	MODIFY FOR USE WITH MODIFIED TTY HANDLER NOW
/			AVAILABLE IN MULTIACCESS.  THIS EDIT ALSO REMOVES
/			ALL CONDITIONALS FOR XVM/RSX V1A, MEANING THAT
/			FROM THIS EDIT, 'WITS' WILL BE AVAILABLE ONLY
/			AS A TDV FUNCTION TASK WITH MULTIACCESS.
/   8 NOV 77 (006; PDH) IGNORE NULLS AND DELETES; FIX ERROR IN CLOSE
/   4 NOV 77 (005; PDH) DON'T CLOSE UNOPENED FILE
/   4 NOV 77 (004; PDH) TIDY UP LISTING; FIX BUG NEAR 'GET2'
/   4 NOV 77 (003; PDH) ADD FILE RETRIEVAL CAPABILITY
/   3 NOV 77 (002; PDH) TRY TO PLAY SOME GAMES WITH THE SYSTEM
/   2 NOV 77 (001; PDH) ADD 'HELLO' MESSAGE
/   1 NOV 77 - PAUL HENDERSON
/
/  CREATE A PROGRAM WHICH WILL COMMUNICATE WITH THE IBM 360/75, USING
/  THE PDP-15 AS A BUFFERED TERMINAL.  THIS IS BASED, IN PART, ON A
/  PREVIOUS PROGRAM OF THE SAME NAME.
/     THIS PROGRAM INSPECTS THE TTY STATUS WORD TO ENSURE THAT	/(007)
/  THE DEVICE WHICH COMMUNICATES WITH THE OTHER COMPUTER SYSTEM	/(007)
/  IS A FULL DUPLEX TERMINAL WITH LOCAL COPY.  THIS CONDITION	/(007)
/  IS NECESSARY TO PREVENT MASS CONFUSION BY THE CC70.  THE	/(007)
/  FULL DUPLEX STATUS BIT IS SET EXTERNALLY (IDEALLY BY THE	/(007)
/  MCR 'DTC' TASK), SO THIS TASK RUNS IN USER MODE AS A TDV	/(007)
/  FUNCTION TASK						/(007)
/
BUFSIZE=70		/ SIZE OF 'SAVE' ASCII LINE BUFFER	/(003)
WRKSIZE=BUFSIZE-2/2*5	/ SIZE OF IMAGE BUFFER FOR 'SAVE'	/(003)
X10=10								/(003)
TTWD0P=202		/POINTER TO TTY STATUS WORD TABLE	/(002)
/
TTB.PR=020000		/ STATUS WORD 'DEVICE HAS PRINTER'	/(002)
TTB.LC=10		/ FULL DUPLEX TERMINAL HAS LOCAL COPY	/(007)
			/  (DO NOT ECHO KEYBOARD INPUT)		/(007)
/
	.EJECT							/(004)
	.DEC
MCR=3		/ TO ANNOUNCE ERROR MESSAGES
TT=4		/ KEYBOARD TERMINAL (TT4, NORMALLY)		/(007)
BD=23		/ TT3, COMMUNICATES WITH 360/75			/(007)
DK=7		/ NORMALLY PUNCH, BUT COULD BE DISK		/(007)
	.OCT
IDX=ISZ
/
	.GLOBL	.IOERR
	.GLOBL	PACK,UNPACK,FILENM				/(003)
/
WITS	CAL	XFRCMD		/ NECESSARY FOR TDV FUNCTION	/(007)
	CAL	WAITFR		/ NO ERROR CHECKING		/(007)
	CAL	HINFT		/ VALIDATE BOTH 'TT' & 'BD' DEVICES
	JMS	CK4TTY
	CAL	WRCRLF		/ START TTY AT LEFT MARGIN	/(003)
	CAL	HINFB
	JMS	CK4TTY
	LAC	EV						/(002)
	LRSS	6		/ EXTRACT UNIT NUMBER		/(002)
	AND	(77						/(002)
	DAC	UNIT						/(002)
	CAL	ATTACH		/ MAKE SURE WE 'OWN' THE BD	/(003)
	JMS	WTFOR						/(003)
	LAC	(IMAGE
	DAC	IBUFP		/ INITIALIZE BUFFER POINTER
	AAC	2
	DAC	CBUFP
	LAW	-1
	DAC	S.FLAG		/ SET 'SHOW' FLAG FOR 1ST CHARACTER
	DAC	CLFLAG		/ SET 'FILE NOT OPEN' FLAG	/(005)
	LAC	(TTWD0P						/(007)
	JMS	LOOKUP		/ GET POINTER TO STATUS TABLE	/(007)
	TAD	UNIT		/ ADD OFFSET FOR TTY UNIT NO.	/(007)
	JMS	LOOKUP		/ GET STATUS TABLE ENTRY	/(007)
	AND	(TTB.LC		/ VERIFY THAT 'BD' 		/(007)
	SZA							/(007)
	JMP	BDOK		/ HAS LOCAL COPY		/(007)
	CAL	WNO.LC		/ 'BD' DEVICE DOES NOT INDICATE	/(007)
	JMS	WTFOR		/ LOCAL COPY			/(007)
	CAL	(10		/ THIS IS A DISASTER!!		/(007)
/
BDOK	CAL	WHELLO		/ ANNOUNCE OURSELVES		/(007)
	JMS	WTFOR						/(001)
	.EJECT							/(004)
TTLOOP	DZM	TTLINE+2	/ START WITH VIRGIN LINE	/(003)
	CAL	RDTT		/ READ LINE FROM USER
	JMS	WTFOR
	LAW	777760
	AND	TTLINE+2	/ SEE IF WE HAVE A		/(003)
	SAD	DOTDOT		/ LOCAL COMMAND			/(003)
	JMP	COMAND		/ LOOKS LIKE IT!		/(003)
	CAL	WRBD		/ SEND LINE TO 360
	JMS	WTFOR
	CAL	READBD		/ WHEN KEYBOARD INPUT IS FINISHED,
				/ BEGIN EXPECTING INPUT FROM 360.
/
BDLOOP	JMS	RDBD
	SAD	(23
	JMP	DC3		/ 'UNLOCK' THE KEYBOARD
	JMS	SHOW
JSV	JMP	BDLOOP		/ CHANGED TO 'JMS SAVE' FOR	/(003)
JBDL	JMP	BDLOOP		/ DURATION OF '..GET' COMMAND	/(003)
/
DC3	CLA
	JMS	SHOW
	JMS	SHOW		/ MAKE SURE LAST CHARACTER IS DISPLAYED
	JMP	TTLOOP
/
	.EJECT							/(004)
/
/  A LOCAL COMMAND HAS BEEN DISCOVERED.  SORT IT OUT AND TAKE	/(003)
/  APPROPRIATE ACTION.					/(003)
/
COMAND	LAC	TTLINE+2	/ BEGIN THE VALIDATION		/(003)
	SAD	..GET						/(003)
	SKP							/(003)
	JMP	CKGCL						/(003)
	LAC	TTLINE+3					/(003)
	SAD	..GET+1						/(003)
	JMP	GET		/ LOCAL COMMAND IS '..GET'	/(003)
/
CKGCL	LAC	TTLINE+2					/(003)
	SAD	..GCL						/(003)
	SKP							/(003)
	JMP	CKEXIT						/(003)
	LAC	TTLINE+3					/(003)
	SAD	..GCL+1						/(003)
	JMP	GCLOSE		/ LOCAL COMMAND IS '..GCL'	/(003)
/
CKEXIT	LAC	TTLINE+2					/(003)
	SAD	..EXI						/(003)
	SKP							/(003)
	JMP	INVALC						/(003)
	LAC	TTLINE+3					/(003)
	SAD	..EXI+1						/(003)
	JMP	EXIT		/ LOCAL COMMAND IS '..EXI'	/(003)
/
INVALC	CAL	WRINVC		/ '*** INVALID LOCAL COMMAND'	/(003)
	JMS	WTFOR						/(003)
	JMP	TTLOOP		/ RETURN TO MAIN LOOP		/(003)
/
	.EJECT							/(004)
/  '..EXI(T)' LOCAL COMMAND EXITS THE TASK			/(003)
/
EXIT	ISZ	CLFLAG		/ SKIPS IF FILE NOT OPEN	/(005)
	CAL	CLOSDK		/ CLOSE POSSIBLY OPEN DISK FILE	/(003)
	JMS	WTFOR						/(003)
	CAL	(10		/ THEN EXIT			/(003)
/
/  '..GET' LOCAL COMMAND PUTS ALL CHARACTERS RECEIVED FROM	/(003)
/  IBM 360 INTO SPECIFIED DISK FILE (OR DIRECTLY ON PUNCH)	/(003)
/
GET	LAC	(TTLINE+2					/(003)
	DAC	G.UNP+1		/ POINTERS FOR UNPACK		/(003)
	LAC	(WORK
	DAC	G.UNP+2
	DAC*	(X10
	DAC	SVPNT		/ POINTER TO IMAGE WORK BUFFER	/(003)
G.UNP	JMS*	UNPACK						/(003)
	0; 0							/(003)
	SMA							/(003)
	JMP	G.UNP						/(003)
/
GET1	LAC*	X10		/ FLUSH COMMAND TO FIRST SPACE	/(003)
	SAD	(40						/(003)
	JMP	GET2						/(003)
	SAD	(15		/ MAY NOT HAVE SPECIFIED NAME	/(003)
	SKP
	SAD	(175						/(003)
	SKP							/(003)
	JMP	GET1						/(003)
	LAC	DFNAME						/(003)
	DAC	ENTER+3						/(003)
	DZM	DFNAME+4	/ ESTABLISH DEFAULT NAME	/(003)
	JMP	GETSRC						/(003)
/
	.EJECT							/(004)
GET2	LAC*	X10		/ NOW FLUSH THE SPACES		/(003)
	SAD	(40						/(003)
	JMP	GET2						/(003)
	LAC*	(X10		/ GET ADDRESS OF FILE NAME	/(003)
	DAC	G.PCK+1		/ PUT IT WHERE 'PACK' EXPECTS	/(003)
	LAC	(TTLINE		/ PACK FILE NAME BACK UP IN	/(004)
	DAC	G.PCK+2		/ THE LINE BUFFER		/(004)
G.PCK	JMS*	PACK						/(004)
	0; 0							/(004)
	SMA							/(004)
	JMP	G.PCK						/(004)
	JMS*	FILENM						/(003)
	TTLINE;	ENTER+3						/(004)
	LAC	ENTER+5						/(003)
	SNA							/(003)
GETSRC	LAC	SRC		/ DEFAULT EXTENSION IS 'SRC'	/(003)
	DAC	ENTER+5						/(003)
	CAL	ENTER		/ OPEN OUTPUT FILE		/(003)
	LAC	(WRBUF		/ INITIALIZE BUFFER POINTER	/(003)
	DAC	WRBUFP						/(003)
	LAC	(JMS SAVE	/ ENABLE 'SAVE'			/(003)
	DAC	JSV						/(003)
	JMS	WTFOR		/ VALIDATE EV			/(003)
	DZM	CLFLAG		/ INDICATE FILE NOW OPEN	/(005)
	JMP	TTLOOP						/(003)
/
	.EJECT							/(004)
/  SUBROUTINE TO SAVE CHARACTERS FROM IBM 360 IN FILE (OR ON PP)/(003)
/
SAVE	XX							/(003)
	DAC*	SVPNT		/ STORE CHARACTER IN WORK BUFFER/(003)
	IDX	SVPNT						/(003)
	SAD	(15		/ END OF LINE?			/(003)
	SKP							/(003)
	JMP*	SAVE		/ NOT YET.  RETURN		/(003)
/
	LAC	(WORK						/(003)
	DAC	S.PCK+1		/ INITIALIZE POINTERS FOR 'PACK'/(003)
	DAC	SVPNT		/ AND FOR NEXT BUFFER		/(003)
	LAC	WRBUFP		/ GET LINE BUFFER POINTER	/(003)
	DAC	S.WRITE+4	/ SET UP CPB			/(003)
	AAC	2		/ STEP PAST HEADERS		/(003)
	DAC	S.PCK+2						/(003)
S.PCK	JMS*	PACK		/ PACK UP THE LINE		/(003)
	0; 0							/(003)
	SMA							/(003)
	JMP	S.PCK						/(003)
	LAC	WRBUFP						/(003)
	TCA							/(003)
	TAD	S.PCK+2		/ CALCULATE LINE LENGTH		/(003)
	ALSS	10		/ CONVERT TO WORD PAIRS		/(003)
	AAC	2		/ INDICATE ASCII MODE		/(003)
	DAC*	WRBUFP		/ INSERT IN HEADER LOCATION	/(003)
	CAL	S.WRITE		/ OUTPUT THE LINE		/(003)
	LAC	WRBUFP						/(003)
	AAC	BUFSIZE		/ MOVE TO NEXT BUFFER		/(003)
	SAD	(EWRBF		/ END OF BUFFER BLOCK?		/(003)
	LAC	(WRBUF		/ YES.  RESET TO BEGINNING AGAIN/(003)
	DAC	WRBUFP						/(003)
	JMP*	SAVE						/(003)
/
	.EJECT							/(004)
/  '..GCL(OSE)' CLOSES THE 'SAVE' FILE				/(003)
/
GCLOSE	ISZ	CLFLAG		/ DON'T CLOSE UNOPENED FILE	/(005)
	.TITLE	.SIXPK
/
/  23 JUN 78 - PAUL HENDERSON
/
/  THIS ROUTINE CONSTRUCTS A .SIXBT FILE NAME AND EXTENSION AS
/  CHARACTERS ARE SUPPLIED, ONE CHARACTER PER CALL.  THE CONVENTION
/  USED IS THAT CHARACTERS ARE PACKED, THREE PER WORD, IN THE
/  FILE NAME AND EXTENSION.  ALL NON-SPACE CHARACTERS AFTER A
/  SPACE GO IN THE EXTENSION, EVEN IF THE FILE NAME IS NOT
/  COMPLETELY FILLED, OR IF THERE HAVE BEEN MORE THAN SIX
/  CHARACTERS.  ALL CHARACTERS AFTER THE NINTH (IF NO SPACE)
/  OR AFTER THE THIRD EXTENSION CHARACTER ARE IGNORED, AS ARE
/  ALL CHARACTERS INCLUDING AND AFTER A LINE TERMINATOR.
/     THE ROUTINE MUST BE INITIALIZED BY A CALL TO 'SIX.IN',
/  WHICH ALSO ZEROS THE 3-WORD FILE NAME BUFFER.
/
/  CALLING SEQUENCES:
/
/ 1) TO INITIALIZE -
/
/	LAC	(ADDRESS OF 3-WORD FILE NAME BUFFER
/	JMS*	SIX.IN
/	(RETURN)
/
/ 2) TO PACK CHARACTERS -
/
/	LAC	CHARACTER
/	JMS*	.SIXPK
/	(RETURN)
/
X10=10
SET=ISZ			/ SET A FLAG NON-ZERO
	.GLOBL	SIX.IN
/
SIX.IN	XX
	DAC	KPNT		/ KEEP ORIGINAL POINTER
	DAC	WPNT		/ WORKING POINTER GETS ALTERED
	DAC*	(X10
	DZM*	WPNT
	DZM*	X10		/ ZERO THE 3-WORD BLOCK
	DZM*	X10
	LAC	(FIRSTC
	DAC	SWING		/ SET UP THE BRANCH ADDRESSES
	LAC	(FNAME2
	DAC	SELECT
	DZM	TERMIN		/ CLEAR 'LINE TERMINATOR FOUND'
	JMP*	SIX.IN
/
KPNT;WPNT;TERMIN 1
	.EJECT
	.GLOBL	.SIXPK
/
.SIXPK	XX
	AND	(177		/ ENSURE WE HAVE ONLY 7 BITS
	SAD	(15		/ IF (CARRIAGE RETURN
	SKP
	SAD	(175		/ 	OR ALT MODE)
	JMP	CRALT		/    IGNORE ALL CHARACTERS UNTIL
				/    AFTER NEXT 'SIX.IN';
	SAD	(40		/ ELSEIF (SPACE)
	JMP	EXT		/    CHARACTERS GO IN EXTENSION
	AAC	-140
	SMA			/ IF (LOWER CASE)
	AAC	-40		/    CONVERT TO UPPER CASE
	AAC	140
	AND	(77		/ CHOP TO 6 BITS
	JMP*	SWING		/ THEN PROCESS CHARACTERS IN TURN
/\
SWING	OVRFLOW			/ IGNORE CHARACTERS UNLESS SET UP
	JMP*	.SIXPK
/
CRALT	SET	TERMIN		/ SET 'LINE TERMINATOR FOUND' FLAG
	JMP	OVRFLOW		/ THEN IGNORE CHARACTERS
/
NXT	JMS	SWING		/ ESTABLISH CORRECT BRANCH ADDRESS
/
FIRSTC	ALSS	14
	DAC*	WPNT		/ STORE FIRST CHARACTER
	JMS	SWING
/
	ALSS	6
	XOR*	WPNT		/ INCLUDE WITH 1ST CHAR
	DAC*	WPNT		/ AND STORE FIRST 2 CHARACTERS
	JMS	SWING
/
	XOR*	WPNT
	DAC*	WPNT		/ WORD NOW FULL.
	JMP*	SELECT		/ SELECT NEXT STAGE IN PROCESSING
/
	.EJECT
SELECT	OVRFLOW			/ IGNORE IF NOT SET UP
	JMP	NXT		/ SET UP WORD PACKER FOR
				/ ANOTHER 3 CHARACTERS
FNAME2	LAC	KPNT
	IAC			/ POINT TO SECOND WORD OF BLOCK
	DAC	WPNT
	JMS	SELECT
/
EXT	LAC	TERMIN		/ MUST CHECK BECAUSE A SPACE AFTER
	SZA			/ A LINE TERMINATOR COULD WREAK HAVOC
	JMP	OVRFLOW
	LAC	KPNT
	AAC	2
	DAC	WPNT		/ SELECT 3RD WORD (EXTENSION)
	JMS	SELECT
/
OVRFLOW	JMS	SWING		/ RETURN WITHOUT PROCESSING
	JMP	OVRFLOW		/ OVERFLOW CHARACTERS
	.END