File: VISTC.PG of Tape: Sources/Other/new-21-vista-page8
(Source file text) 

	FILE	VISTC - VISTA EDITOR
	TITLE	VERSION 01.21 -- REVISION LEVEL HISTORY
/
/
	TITLE	DEVICE HANDLER REGION
/
	FREE	0		NO FREE SPACE FROM NOW ON
	ORG	06600		START OF INPUT DEVICE HANDLER AREA
/
IDEVH	QUT	%*,06600	INPUT DEVICE HANDLER
/
/	COME HERE FOR INITIALIZATION
/	SAVE HIGHEST MEMORY FIELD (NOT USED IN VERSIONS 01.04 AND LATER,
/	BUT WE LEAVE THIS CODE IN FOR FUTURE ENHANCEMENTS WITH 12K+ MEMORY
/	FOR SUCH FUTURE FEATURES AS THE HIGH SPEED BLOCK POSITION COMMAND)
/
	AFIELD	%*
INIT0	DCA	FLAG		SAVE FLAG SETTING FOR ENTRY
	TAD	$07777		MEMORY COMMAND IN EFFECT?
	AND	=070		ISOLATE MEMORY BITS
	SZA			SKIP IF NOT
	JMP	2F		USE EXPLICIT MEMORY TOP
	JMS	CORE		CALL MEMORY ROUTINE
	JMP	INCONT		OFF TO CHECK FOR SIZE NOW
/
2H	TAD	=06211		SET CDF TO FIELD 1 AS HIGHEST FIELD
	DCA	MAXF		SET AS CDF TO HIGHEST FIELD
INCONT	TAD	FLAG		REGET CHAIN/NO-CHAIN FLAG
	JMPX	INIT		CONTINUE NOW WITH INITIALIZATION
/
	AFIELD	BUF
	EJECT
/
/	THIS IS THE STANDARD OS/8 ROUTINE FOR DETERMINING CORE SIZE
/
CORE	SUB
	CAL
COR0	CDF	0
	TAD	CORSIZ		GET FIELD TO TEST
	RTL			...
	RAL			...
	AND	COR70		MASK USEFUL BITS
	TAD	COREX		...
	DCA	*+1		...
COR1	CDF	0		THIS IS FIELD TO TEST
	TADI	CORLOC		SAVE CURRENT CONTENTS
COR2	NOP			PROTECTION FOR PDP-8
	DCA	COR1		...
	TAD	COR2		USE NOP AS PATTERN TO STORE FOR TEST
	DCAI	CORLOC		STORE INTO MEMORY
COR70	DC	070		NOP FOR PDP-8
	TADI	CORLOC		TRY TO READ IT BACK
CORX	DC	07400		NOP for PDP-8
	TAD	CORX		GUARD AGAINST 'WRAP-AROUND'
	TAD	CORV		...
	SZA CLA			SKIP IF FIELD EXISTS
	JMP	COREX		NON-EXISTENT FIELD EXIT
	TAD	COR1		RESTORE CONTENTS WE DESTROYED
	DCAI	CORLOC		...
	INC	CORSIZ		TRY NEXT HIGHER FIELD
/
	JMP	COR0		LOOP FOR NEXT
/
COREX	CDF	0		RETURN CDF 0
	LDI	-1
	TAD	CORSIZ		GET NUMBER OF LAST EXISTING FIELD
	CLL RAL			SHIFT TO CDF POSITION (AC 6-8)
	RTL			...
	TAD	=06201		BUILD CDF INSTRUCTION
	DCA	MAXF		SAVE CDF TO HIGHEST EXISTING FIELD
	RET	CORE		ALL DONE HERE
/
CORLOC	DC	CORX		ADDRESS TO TEST IN EACH FIELD
CORV	DC	01400		7000+7400+1400=0
CORSIZ	DC	1		CURRENT FIELD TO TEST
	TITLE	HEURISTICS PROCESSING
	ORG	07200
/
/	NOTE:	HEURISTICS ROUTINE MAY BE OVERLAYED BY A DEVICE
/		HANDLER. IF THIS IS SO, THEN THE /H OPTION IS
/		SHUT OFF AND THIS FEATURE IS NOT AVAILABLE
/
	ROOM	4
ODEVH	JMS	ROWCK		SKIP IF NOT AT END OF LINE
	JMP	*+2		<1> AT END OF LINE: CONTINUE
	JMP	CHARD		<2> NOT AT END OF LINE: IGNORE HEURISTICS
/
/	ARE WE IN A COMMENT FIELD? NOTHING HAPPENS IF SO
/
	LDI	-1		-1 SO WE DON'T FIND THE CURRENT CHAR
	ROOM	4
	JMS 	TCMNT		ARE WE IN A COMMENT FIELD?
	JMP	CHARD		<1> YES: SO NOTHING SPECIAL HAPPENS
/
/	<2> NO: IS THE CURRENT CHARACTER THE COMMENT FIELD DELIMITER?
/
	TAD	THISC		REGET CURRENT CHARACTER
	TAD	MCMNT		COMPARE WITH SELECTED COMMENT FIELD DELIMITER
	SZA CLA			SKIP IF COMMENT FIELD DELIMITER
	JMP	HEURA		ELSE OFF FOR OTHER TESTS.
/
/	HERE WE HAVE THE COMMENT FIELD DELIMITER. IF THE DELIMITER IS
/	IN COLUMN 8 (START OF OPERATOR FIELD), WE HAVE A FULL COMMENT
/	LINE, SO ERASE THE CHARACTER, AND PUT IT IN COLUMN 0 FOLLOWED
/	BY A SPACE, AND SET THE COMMENT FLAG SWITCH TO ALLOW UPPER/LOWER
/	CASE TO BE USED.
/
	JMS	LEFTC		MOVE CURSOR TO THE LEFT
	TAD	COL		GET NEW COLUMN POSITION
	JMS	PLEN		SET LENGTH OF CURRENT ROW
/
	TAD	=X:BKSP		DO BACKSPACE FUNCTION ON TERMINAL
	JMSI	EXTER		...
/
	TAD	COL		GET CURRENT COLUMN
	TAD	=-8		IN COLUMNS 0-8?
	SPA SNA CLA		SKIP IF NOT
	JMP	SEMI6		YES: HANDLE THIS
/
/	HERE WE HAVE THE COMMENT FIELD DELIMITER IN PAST COLUMN 8.
/	THEREFORE WE WANT TO TAB OUT TO COLUMN 32 IF WE ARE NOT YET PAST
/	COLUMN 32.
/
SEMI3	TAD	COL		GET CURRENT COLUMN
	TAD	=-32		PAST COLUMN 32 YET?
	SMA CLA			SKIP IF NOT
	JMP	SEMI4		YES: SO DONE HERE
/
	JMS	RTAB		NO: SO DO A TAB RIGHT FUNCTION
	JMP	SEMI3		AND TRY AGAIN
/
/	COME HERE TO SET UP AN ENTIRE COMMENT LINE ON THE SCREEN.
/
SEMI6	DCA	COL		MARK NOW IN COLUMN 0 (START OF LINE)
	JMSI	EXTER		RE-POSITION CURSOR ON THE SCREEN
	JMS	TRUNCLN		TRUNCATE LINE AT THAT COLUMN
/
/	COME HERE WHEN WE HAVE PASSED THE 32 COLUMN POSITION
/
SEMI4	TAD	THISC		GET CURRENT CHARACTER (DELIMITER)
	JMS	DISCHR		DISPLAY CHARACTER/STORE INTO MEMORY
/
	TAD	=' 		FOLLOW WITH BLANK (IMPROVES READABILITY)
	JMS	DISCHR		...
	JMP	CHARD		RETURN NOW TO MAIN IDLE LOOP
	EJECT
/
/	HERE WE ARE NOT IN A COMMENT FIELD AND WE DO NOT HAVE THE COMMENT
/	CHARACTER. FINAL CHECK IS TO SEE IF WE ARE BETWEEN COLUMNS
/	8 AND 15 AND IF WE HAVE JUST GOT A CHARACTER WHICH MARKS THE
/	END OF THE LABEL FIELD. IF SO, WE WANT TO JUMP COLUMNS 8-15 INTO
/	COLUMN 0-7 AND THEN TAB OVER TO COLUMN 8.
/
HEURA	LDI	-1		(ADJUST FOR PRE-INCREMENT)
	TAD	COL		GET CURRENT COLUMN POSITION
	AND	=07770		TEST COLUMN POSITIONS
	TAD	=-010		IN COLUMN 8-15?
	SZA CLA			SKIP IF SO
	JMP	CHARD		NO: SO DONE HERE
/
	TAD	THISC		REGET CURRENT CHARACTER
	TAD	MTAG		IS THIS THE CHAR WHICH MARKS A LABEL?
	SZA CLA			SKIP IF SO
	JMP	IDLP		NO: SO NOTHING TO DO
/
/ HERE WE HAVE A LABEL. STORE A PAD CHARACTER OVER THE TAB WHICH
/ WE PUT AT THE START OF THE LINE, THEN REFORMAT THE LINE WHICH
/ WILL COMPLETELY ELIMINATE THE TAB.
/
	TADI	ROW		GET CURRENT ROW POINTER
	DCA	TXR1		SET POINTER JUST BEFORE COLUMN 0
	LDI	PAD		GET A PAD CODE
	DCAI	TXR1		STORE PAD CODE OVER TAB
	DCA	COL		RESET COLUMN TO ZERO
	DCA	INSF		MUST REMOVE INSERT MODE FOR 'REDOLN'
	JMS	REDOLN		REFORMAT THE LINE TO KILL THE TAB
	JMP	TABR		TAB NOW OVER TO COLUMN 8.
	EJECT
/
/ SUBROUTINE TO TEST WHETHER THE CURRENT CURSOR POSITION IS TO THE LEFT
/ OR TO THE RIGHT OF THE COMMENT CHARACTER (IF ANY). THIS IS USED BY
/ THE HEURISTICS ROUTINES TO SEE WHETHER WE ARE IN A COMMENT FIELD OR
/ NOT. AC CAN HAVE VALUE OF 1 ON ENTRY TO SKIP COMPARISON OF CURRENT
/ CHARACTER. IF IN COMMAND MODE, THIS IS TREATED THE SAME AS BEING
/ TO THE RIGHT OF THE COMMENT DELIMITER
/
/ 	CALLING SEQUENCE:
/
/ 		ROOM	4
/ 		JMS	TCMNT		CALL ROUTINE
/ 		<RETURN>		<1> IN COMMENT FIELD
/ 		<RETURN>		<2> NOT IN COMMENT FIELD
/
	ROOM	20		MUST BE ON SAME PAGE
TCMNT	DC	0		RETURN ADDRESS
	TAD	COL		GET CURRENT COLUMN POSITION
	CMA			NEGATE, AND SET
	DCA	CNTR		AS LOOP COUNTER
	TAD	CMND		GET COMMAND MODE FLAG
	SZA CLA			ARE WE IN COMMAND MODE?
	JMPI	TCMNT		YES: TREAT AS IF IN COMMENT FIELD
	TADI	ROW		SET POINTER TO START OF ROW
	DCA	TXR1		...
	JMP	2F		START AT BOTTOM (IN CASE NULL ROW)
/
/ LOOP HERE TESTING EACH CHARACTER ON THE ROW TO SEE IF WE HAVE
/ THE COMMENT DELIMITER
/
1H	TADI	TXR1		/ NEXT CHARACTER FROM ROW
	TAD	MCMNT		/ COMPARE WITH MINUS COMMENT CHAR
	SNA CLA			/ DO WE HAVE A MATCH?
	JMPI	TCMNT		/ YES: SO TAKE FIRST RETURN
/
2H	ISZ	CNTR		/ NO: MORE CHARS ON THIS ROW?
	JMP	1B		/ YES: SO HANDLE THEM NOW
	ISZ	TCMNT		/ NO: SO TAKE SECOND RETURN TO CALLER
	JMPI	TCMNT		/ ALL DONE HERE
	TITLE	CASE INVERSION
/
/	HERE TO HANDLE THE KEY WHICH CAUSES THE CASE OF THE CURRENT
/	WORD TO BE INVERTED ON A CHARACTER BY CHARACTER BASIS
/
/	IF ANY CHARACTER WAS ORIGINALLY UPPER CASE, IT IS NOW CHANGED
/	TO LOWER CASE. OTHERWISE, A LOWER CASE IS CHANGED TO UPPER CASE
/	NOTE THAT THE INVERSION OPERATION PROCEEDS FROM THE CURRENT CURSOR
/	POSITION TO THE END OF THE CURRENT WORD.
/
CASE	DCA	INSF		REMOVE INSERT CHARACTER MODE IN CASE SET
/
/	LOOP BACK HERE TO EXAMINE THE NEXT CHARACTER IN THE WORD
/
1H	JMSI	TESTWD		GET CHARACTER AND TEST IT
	SNL CLA			SKIP IF NOT AT END OF WORD
	JMP	WRIGHT		END OF WORD: END WITH WORD RIGHT NOW
/
	TADI	CHARP		REGET THE CHAR (CHARP SET BY TESTWD
	AND	=040.XO.-1	IF LOWER CASE, WE CHANGED TO UPPER CASE NOW
	TAD	=-'Z-1		CHECK FOR ALPHA CHARACTER
	CLL			...
	TAD	='Z-'A+1	...
	SNL CLA			SKIP IF ALPHABETIC CHARACTER
	JMP	2F		NOT ALPHA: JUST ECHO CHAR TO MOVE CURSOR
/
/	HERE WE HAVE AN ALPHA CHARACTER, SO INVERT THE CASE.
/
	JMS	FLAGLN		FLAG MODIFICATION TO CURRENT LINE
	TADI	CHARP		REGET CHARACTER UNDER THE CURSOR
	AND	=040		ISOLATE THE CASE BIT
	SZA CLA			SKIP IF BIT WAS CLEAR ORIGINALLY
	TAD	=-040-040	WAS ON: SO TURN IT OFF
	TAD	=040		WAS OFF, SO TURN IT BACK ON
/
2H	TADI	CHARP		REGET CHARACTER UNDER THE CURSOR
	JMS	DISCHR		MOVE ONTO SCREEN NOW
	JMP	1B		BACK FOR NEXT CHARACTER NOW
	TITLE	TAB LEFT
/
/	HERE FOR THE TAB LEFT FUNCTION WHICH MOVES THE CURSOR
/	TO THE PRIOR TAB STOP, OR IF THERE WAS NO TAB STOP,
/	TO THE BEGINNING OF THE CURRENT LINE.
/
TABL	JMS	LEFTC		MOVE THE CURSOR TO THE LEFT
	TAD	COL		GET CURRENT COLUMN POSITION
	AND	=7		TAB STOPS EVERY 8 POSITIONS
	SNA CLA			SKIP IF NOT AT A TAB STOP
	JMPI	PSETX		RETURN NOW IF AT TAB STOP
	JMP	TABL		ELSE MOVE CURSOR LEFT AND TRY AGAIN
	TITLE	HIGH SPEED CLOSE ROUTINE
/
/	HERE FOR THE HIGH SPEED CLOSE. THE ALGORITHM IS IDENTICAL TO
/	THAT IN THE ICE EDITOR: WE BLOCK ALIGN THE INPUT BUFFER BY
/	READING CHARACTERS UNTIL A BLOCK BOUNDARY. THEN WE BLOCK ALIGN
/	THE OUTPUT FILE BY PADDING IT WITH ASCII NULLS (WHICH ALL OS/8
/	ROUTINES, ALMOST WITHOUT EXCEPTION IGNORE). WE THEN COPY OVER
/	THE REMAINDER OF THE FILE 15 BLOCKS AT A TIME IN IMAGE MODE.
/
/	NOTE:	THIS FUNCTION IS NOT AVAILABLE IF THE FOURTH HANDLER
/		PAGE IS REQUIRED FOR AN I/O DRIVER (IN THAT CASE WE
/		ALWAYS DO THE SLOW /P TYPE CLOSE)
/
/	READ CHARACTERS AND PUT THEM AWAY UNTIL WE FIND THAT 'RBE'
/	IS ABOUT TO BE CALLED.
/
/ IF ORIGIN IS BELOW 7400, ORIGIN TO 7400 PAGE NOW (FAST CLOSE IS
/ REMOVED IF THAT PAGE IS NEEDED FOR A HANDLER)
/
	AIF	(*.XO.04000).GE.(07400.XO.04000),.OK
	ORG	07400		ORIGIN TO 7400 PAGE NOW
.OK	ANOP
/
FASTCL	TAD	BOF		GET THE BOTTOM OF FILE FLAG
	SZA CLA			HAS END OF FILE BEEN FOUND YET?
	JMP	1F		YES: SO SUPPLY THE EOF CODE NOW
/
	TAD	BESW		ABOUT TO READ FIRST BYTE?
	SNA			SKIP IF NOT
	TAD	BEPTR		YES: WHERE IS BUFFER POINTER?
	TAD	=-(BBUFE+1)	PAST END OF BUFFER?
	SNA CLA			ARE WE ABOUT TO CALL 'RBE'?
	JMP	2F		YES: SO THE INPUT BUFFER IS ALIGNED NOW
	JMS	GETBE		NO: GET FROM BELOW SCREEN BUFFER
	JMS	PUTAB		...
	JMP	FASTCL		LOOP FOR NEXT CHARACTER
/
/	LOOP HERE STORING ASCII NULL CODES UNTIL THE 'PUTBE' ROUTINE
/	HAS JUST WRITTEN OUT THE BLOCK
/
1H	TAD	=EOF-NULL	ON EOF FOUND, MUST SUPPLY EOF CODE FIRST
2H	TAD	=NULL		STORE ASCII NULL
	DCA	TEMP		SAVE FOR A MOMENT
	DCAX	WAB+0		SET FLAG: 'WAB' NOT CALLED YET
	TAD	TEMP		REGET THE CHAR (NULL OR EOF CODE)
	JMS	PUTAB		PUT INTO THE ABOVE SCREEN BUFFER
	TADX	WAB		GET SUBROUTINE ENTRY POINT
	SNA CLA			HAS THE BLOCK BEEN WRITTEN YET?
	JMP	2B		NO: SO WAIT FOR IT
	EJECT
/
/	BOTH BUFFERS ARE NOW ALIGNED TO A BLOCK BOUNDARY. COPY THE
/	REMAINING BLOCKS NOW UP TO 15 BLOCKS AT A TIME USING ALL OF
/	FIELD 1 FROM 10000-17377 AS A LARGE BUFFER.
/
/	FIRST CHECK: ANY MORE BLOCKS TO READ IN THE FORWARD DIRECTION
/	FROM THE END OF THE TEMPORARY FILE?
/
5H	TAD	TFBVBLK		TEMPORARY FILE, BACKWARDS VIRTUAL BLOCK #
	TAD	TFMLEN		COMPARE WITH MINUS FILE LENGTH
	SNA			ANY BLOCKS TO READ HERE?
	JMP	6F		NO: TRY AND READ FROM ORIGINAL INPUT FILE
	CMA IAC			CONVERT TO POSITIVE BLOCK COUNT
	DCA	TEMP		SAVE IN CASE < 15 BLOCKS
	TAD	TFSBLK		GET STARTING BLOCK
	TAD	TFBVBLK		PLUS VIRTUAL BLOCK
	DCA	TEMP1		SET ARGUMENT
	TAD	ODEV		SET TO READ FROM TEMPORARY FILE
	JMS	COPYBLK		OFF TO READ 15 BLOCKS AND THEN WRITE THEM
	TAD	TFBVBLK		UPDATE VIRTUAL BLOCK NUMBER
	DCA	TFBVBLK		...
	JMP	5B		LOOP BACK NOW FOR NEXT SET OF BLOCKS
/
/	TRY AND READ SOME BLOCKS FROM THE FORWARD DIRECTION FROM THE
/	INPUT FILE (IF ANY).
/
6H	TAD	IFVBLK		GET INPUT FILE VIRTUAL BLOCK
	TAD	IFMLEN		SUBTRACT OUT FILE LENGTH
	SNA			ANY BLOCKS LEFT IN INPUT FILE?
	JMP	7F		NO: SO ALL DONE HERE
	CMA IAC			MAKE THE REMAINING BLOCK COUNT POSITIVE
	DCA	TEMP		SAVE BLOCKS TO READ
	TAD	IFSBLK		GET INPUT FILE STARTING BLOCK
	TAD	IFVBLK		PLUS INPUT FILE VIRTUAL BLOCK
	DCA	TEMP1		SAVE BLOCK TO BE READ
	TAD	IDEV		WHERE TO READ BLOCKS FROM
	JMS	COPYBLK		READ/WRITE THOSE BLOCKS
	TAD	IFVBLK		UPDATE INPUT FILE VIRTUAL BLOCK
	DCA	IFVBLK		BY COUNT OF BLOCKS READ
	JMP	6B		LOOP BACK NOW
/
7H	JMPX	ICLOSE		OFF TO CLOSE OUT THE FILE NOW
	EJECT
/
/	SUBROUTINE TO COPY A GROUP OF BLOCKS FROM EITHER THE TEMPORARY
/	FILE OR THE INPUT FILE, AND THEN COPY THEM TO THE OUTPUT FILE
/
/	ENTRY CONDITIONS:
/
/		AC	ADDRESS OF I/O ROUTINE TO CALL
/		TEMP	NUMBER OF BLOCKS TO READ (POSSIBLY > 15)
/		TEMP1	STARTING BLOCK + VIRTUAL BLOCK
/
/	EXIT CONDITIONS
/
/		TEMP	NUMBER OF BLOCKS ACTUALLY READ AND COPIED
/
COPYBLK	DC	0		RETURN ADDRESS
	DCA	TEMP2		SAVE ENTRY POINT TO DEVICE HANDLER
	TAD	TEMP		REGET COUNT OF BLOCKS
	TAD	=-15		ARE THERE MORE THAN 15 BLOCKS LEFT?
	SPA SNA CLA		SKIP IF SO
	JMP	*+3		NO: SO CONTINUE
/
	TAD	=15		YES: SO JUST READ 15 BLOCKS
	DCA	TEMP		...
/
	TAD	TEMP		GET BLOCK COUNT
	CLL RTR			MOVE TO AC 1-5
	RTR			...
	RTR			...
	TAD	=1.LS.3		READ INTO FIELD 1
	CDF	%*		ADJUST FIELD NOW FOR STORING ARGUMENTS
	DCA	1F		STORE OS/8 FUNCTION WORD
	TAD	TEMP1		GET BLOCK START+VIRTUAL BLOCK
	DCA	2F		STORE BLOCK NUMBER
/
/	ALSO COME BACK HERE TO REPEAT OPERATION AFTER ERROR
/
	ROOM	14
0H	JMSI	TEMP2		CALL DEVICE HANDLER
1H	DC	0		OS/8 FUNCTION WORD
	DC	0		STARTING AT LOCATION ZERO
2H	DC	0		BLOCK NUMBER
	SMA CLA			<1> FATAL I/O ERROR?
	JMP	3F		<2> NO, OR OK, CONTINUE
	JMS	IOER		HANDLE I/O ERROR
	JMP	3F		<1> IGNORE THE ERROR
	JMP	0B		<2> TRY OPERATION OVER AGAIN
	EJECT
/
/	HERE ON END OF SUCCESSFUL READ. WRITE OUT THAT NUMBER
/	OF BLOCKS TO OUTPUT FILE.
/
3H	LDI	04000		TURN THE WRITE BIT ON
	TAD	1B		ADD IN OS/8 FUNCTION WORD
	DCA	5F		STORE FUNCTION WORD
	STL CMA			-1 IN AC AND SET LINK FOR 12-BIT COMPARE
	TAD	TFFVBLK		GET TEMPORARY FILE FORWARD VIRTUAL BLOCK
	TAD	TEMP		ADD IN NUMBER OF BLOCKS WE WILL WRITE
	TAD	TFMLEN		COMPARE WITH MINUS FILE LENGTH
	CDF	BUF		RESET IN CASE 'OFULL' IS CALLED
	SZL CLA			SKIP IF WE HAVE ROOM HERE
	JMP	OFULL		NO ROOM IN TEMPORARY FILE
/
	TAD	TFFVBLK		VIRTUAL BLOCK AGAIN
	TAD	TFSBLK		PLUS STARTING BLOCK NUMBER
	CDF	%*		TO THIS FIELD NOW
	DCA	6F		STORE INTO CALLING SEQUENCE
/
	TAD	ODEV		GET OUTPUT DEVICE ADDRESS
	SNA CLA			DO WE HAVE AN OUTPUT DEVICE?
	JMP	7F		NO: SO BY-PASS THE I/O OPERATION
	ROOM	12
4H	JMSI	ODEV		WRITE OUT THE BLOCK BUFFER NOW
5H	DC	0		OS/8 FUNCTION WORD
	DC	0		BUFFER ADDRESS AT 0
6H	DC	0		OS/8 BLOCK NUMBER TO WRITE FROM
	SMA CLA			<1> SKIP IF FATAL ERROR
	JMP	7F		<2> OK, OR NON-FATAL ERROR
	JMS	IOER		HANDLE  ERROR CONDITION
	JMP	7F		<1> IGNORE ERROR
	JMP	4B		<2> TRY AND REPEAT I/O OPERATION
/
7H	CDF	BUF		RESET MEMORY FIELD
	TAD	TFFVBLK		UPDATE VIRTUAL BLOCK NUMBER
	TAD	TEMP		BY NUMBER OF BLOCKS WRITTEN
	DCA	TFFVBLK		...
	TAD	TEMP		REGET COUNT OF BLOCKS READ/WRITTEN
	JMPI	COPYBLK		ALL DONE HERE
/
	DSEC
	ORG	07600		SHOULD NOT BE UP TO HERE
	TITLE	FIELD 1 AND INITIALIZATION CODE
/
	FIELD	1
/
BSBUF	QUT	%*,*		BLOCK SAVE BUFFER
BSBUFE	QUT	%*,BSBUF+0377	LAST WORD IN BUFFER
/
	ORG	BSBUFE+1
ABUF	QUT	%*,*		ABOVE SCREEN BUFFER
ABUFE	QUT	%*,ABUF+0377	LAST WORD ADDRESS INSIDE BUFFER
	TITLE	PROCESS FILE VERSION NUMBER
/
	ISEC	0		PAGING BACK ON AGAIN
	FREE	DEBUG		IF AVAILABLE: FREE UP SPACE HERE
/
/	HERE FOR THE LAST PHASE OF THE INITIALIZATION CIRCUIT. AT
/	THIS POINT, THE ABOVE SCREEN BUFFER IS STILL SAFE SINCE WE
/	NOT GOING TO ROLL ANYTHING INTO IT.
/
/	JOB HERE IS TO HANDLE THE FIRST SCREEN LOAD OF THE FILE AND
/	PROCESS THE VERSION FIELD IF PRESENT.
/
VERPRO	CDF	%ROWTAB		GET ADDRESS OF ROW 1 IN ROW TABLE
	LDI	1		...
	TADI	=ROWTAB		...
	CDF	BUF		BACK TO BUFFER FIELD NOW
	DCA	TEMP		STORE POINTER TO ROW 1
	TADI	TEMP		GET POINTER NOW TO ROW
	DCA	TEMP		...
/
/	SEARCH LINE 1 NOW FOR THE WORD 'VERSION'
/
	TAD	TEMP		COPY POINTER TO THE LINE
	DCA	TXR1		...
	TADI	TEMP		GET LENGTH OF CURRENT LINE
	SPA			IF ROW UNESTABLISHED, NOTHING TO DO
	JMP	9F		OK, WE PROBABLY HAVE A BLANK SCREEN
	AND	=LMASK		ISOLATE THE LENGTH FIELD
	TAD	TEMP		ADD TO ADDRESS OF LENGTH/STATUS WORD
	IAC			+1 TO POINT PAST LAST CHAR ON LINE
	DCA	TEMP		STORE POINTER
	DCAI	TEMP		NOW PUT SENTINEL THERE OF ZERO
/
/	LOOP HERE SEARCHING FOR THE WORD 'VERSION'.
/
1H	TAD	=VERS-1		SET POINTER TO WORD
	DCA	TXR2		...
	TAD	=-7		MATCH ON 7 LETTERS
	DCA	CNTR		...
/
/	LOOP BACK HERE AS LONG AS WE ARE MATCHING ON THE WORD 'VERSION'
/
2H	TADI	TXR1		NEXT CHARACTER FROM LINE
	SNA			ARE WE AT THE SENTINEL?
	JMP	9F		YES: 'VERSION' NOT PRESENT HERE
	AND	=040.XO.-1	NO: STRIP OFF LOWER CASE ALPHA BIT
	CMA IAC			NEGATE AND COMPARE WITH NEXT CHAR
	TADI	TXR2		FROM WORD WE ARE LOOKING FOR
	SZA CLA			SKIP IF WE HAVE A MATCH
	JMP	1B		NO MATCH: RESET POINTER
	ISZ	CNTR		FULL MATCH?
	JMP	2B		NO: KEEP TRYING THEN
/
/	HERE WE HAVE A PERFECT MATCH ON THE WORD 'VERSION'. SCAN AHEAD NOW
/	FOR A VERSION NUMBER OF THE FORM 00.00 AND THEN INCREMENT IT.
/
/	FIND THE FIRST DIGIT OF THE VERSION NUMBER
/
5H	TADI	TXR1		NEXT CHARACTER FROM ROW
	SNA			SENTINEL ON ROW?
	JMP	9F		YES: WE DO NOT HAVE A VALID VERSION # THEN
	TAD	=-'9-1		CHECK FOR DECIMAL DIGIT
	CLL			...
	TAD	='9-'0+1	...
	SNL CLA			DECIMAL DIGIT HERE?
	JMP	5B		NO: KEEP LOOKING FOR IT
/
	LDI	-1		SAVE POSITION-1 OF FIRST DIGIT
	TAD	TXR1		...
	DCA	TXR2		...
	EJECT
/
/	DO NOT INCREMENT VERSION NUMBER NOW IF /V OPTION SET
/
VFLAG	JMP	3F		## NOP ## IF /V OPTION SELECTED
	JMP	7F		IF /V, WE EXECUTE THIS JUMP
/
3H	TADI	TXR1		NEXT CHARACTER FROM LINE
	SNA			IF ZERO, SOMETHING WRONG
	JMP	9F		NOT A VALID VERSION FIELD
	TAD	=-'.		PERIOD FOUND?
	SZA CLA			SKIP IF SO
	JMP	3B		NO: WAIT FOR IT
/
	LDI	3		POINT JUST PAST FOURTH DIGIT OF VERSION #
	TAD	TXR1		COPY POINTER NOW TO NON-INDEXING REGISTER
	DCA	TEMP		...
/
/	LOOP HERE INCREMENTING THE DIGITS IN DECIMAL
/
4H	LDI	-1		DECREMENT THE POINTER
	TAD	TEMP		...
	DCA	TEMP		...
	TADI	TEMP		GET THAT DIGIT
	TAD	=-'.		IS THIS THE PERIOD?
	SNA			SKIP IF NOT
	JMP	4B		SKIP BACK OVER PERIOD IF SO
/
	TAD	='.+1		RESTORE CHARACTER, INCREMENT CODE BY 1
	DCAI	TEMP		STORE IT BACK
	TADI	TEMP		REGET THAT CODE
	TAD	=-('9+1)	GONE TOO FAR?
	SZA CLA			SKIP IF SO
	JMP	7F		ELSE ALL DONE HERE
/
	TAD	='0		YES: SO RESET THIS DIGIT BACK TO 0
	DCAI	TEMP		...
	JMP	4B		LOOP BACK TO INCREMENT PRIOR DIGIT
	EJECT
/
/	HERE WHEN WE ARE ALL DONE.
/	PUT NEW VERSION NUMBER INTO THE STATUS MESSAGE
/
7H	LDI	-3		TWO 1/2 PASSES THROUGH LOOP BELOW
	DCA	CNTR		...
	TAD	=STVER-1	SET POINTER TO WHERE VERSION # GOES
	DCA	TXR1		...
	TAD	TXR2		SAVE POSITION OF WHERE VERSION # IS
	DCA	TEMP		...
/
/	LOOP HERE COPYING OVER VERSION #
/
8H	TADI	TXR2		NEXT DIGIT
	CLL RTL			MOVE TO LH OF AC
	RTL			...
	RTL			...
	ISZ	CNTR		END OF LOOP?
	JMP	*+4		NO: CONTINUE
/
	TAD	=' -0201	YES: INSERT BLANK AT END
	DCAI	TXR1		STORE FINAL PAIR OF CHARACTERS
	JMP	6F		DONE HERE
/
	TADI	TXR2		MERGE IN SECOND DIGIT
	TAD	=-0201		REMOVE BOTH MARK BITS TO CONVERT TO 6-BIT
	DCAI	TXR1		AND STORE INTO THE MESSAGE
	JMP	8B		LOOP BACK NOW
/
/	NOW COPY OVER THE CURRENT VERSION NUMBER IN 8-BIT ASCII INTO
/	'AVERS' WHERE IT CAN BE USED BY THE 'FLAGLN' ROUTINE
/
6H	TAD	TEMP		RESET POINTER TO CURRENT VERSION NUMBER
	DCA	TXR2		...
	TAD	=AVERS-1	SET POINTER TO WHERE IT WILL BE PUT
	DCA	TXR1		...
	TAD	=-5		SET TO MOVE FIVE CHARACTERS
	DCA	CNTR		...
	CDF	%MCMNT		TO FIELD OF COMMENT FLAG
	TADI	=MCMNT		GET MINUS COMMENT CHARACTER
	CDF	BUF		TO MAIN BUFFER FIELD
	CMA IAC			MAKE IT A POSITIVE ASCII CHARACTER
	DCAI	TXR1		STORE THAT AWAY
/
/	LOOP HERE COPYING THE VERSION NUMBER OVER
/
	TADI	TXR2		CHAR FROM NEW VERSION NUMBER
	DCAI	TXR1		COPY INTO 'AVERS' AREA
	ISZ	CNTR		MORE CHARS TO COPY?
	JMP	*-3		YES: BACK TO DO THEM
	JMP	0F		ALL DONE NOW
/
/	COME HERE IF THERE WAS NO VERSION NUMBER.
/
9H	CLA			AC NON-ZERO IF UNESTABLISHED ROW
	DCAX	AUDIT		IN CASE THIS FLAG SET, CLEAR IT NOW
/
/	EXIT NOW TO RESTORE SCREEN WITH NEW VERSION NUMBER SHOWING
/
0H	TADI	=$07605		GET DEVICE FOR INPUT FILE
	SNA CLA			SKIP IF WE THERE WAS AN INPUT FILE
	JMP	1F		NO INPUT FILE: HANDLE THIS
	JMPX	DOSCRN		ELSE ALL DONE HERE
1H	JMPX	ASMCHK		OFF TO CHECK FOR HEURISTICS MODE (COL 8)WING
/
VERS	DC	'V,'E,'R,'S,'I,'O,'N
/
	DSEC			PAGING BACK OFF NOW
	ORG	ABUFE+1
BBUF	QUT	%*,*		BELOW SCREEN BUFFER
BBUFE	QUT	%*,BBUF+0377	LAST WORD ADDRESS INSIDE BUFFER
	ORG	BBUFE+1
	TITLE	MISCELLANEOUS ROUTINES
	ISEC	0		PAGING BACK ON AGAIN
/
/	TEMPORARY STORAGE FOR CELLS AND LITERALS (WE DON'T WANT ANY LITERALS
/	OR PAGING LINKS IN THIS SECTION OF CODE).
P7	DC	7		LITERAL
ARZER	DC	"<0		...
P0700	DC	0700		...
M10	DC	-10		...
P10	DC	10		...
DBLZER	DC	"00		...
TWOBL	DC	"  		...
M100	DC	-100		...
PLUSB	DC	"+ 		...
SPZERO	DC	" 0		...
P1777	DC	01777		...
ONEAT	DC	"1@		...
P99	DC	"99		...
PASCHR	DC	ASCHR		POINTER
PASCHR1	DC	ASCHR+1		...
PTEMP	DC	TEMP		POINTER TO 'TEMP' IN FIELD ZERO
BT1	DC	0		STORAGE
BINCTR	DC	0		...
/
/	SUBROUTINE TO SET UP THE ASCII, OCTAL CHARACTER CODE IN THE
/	STATUS LINE MESSAGE.
/
	CIF	0		BACK TO FIELD 0 FOR EXIT
DOASCI	SUB			ENTRY AND RETURN ADDRESS
	DCA	BT1		SAVE FOR A MOMENT
	TAD	BT1		AND REGET IT
	CLL RTR			SHIFT DOWN HIGH OCTAL DIGIT
	RTR			...
	RTR			...
	AND	P7		ISOLATE OCTAL DIGIT
	TAD	ARZER		MAKE IT ASCII
	DCAI	PASCHR		STORE INTO MESSAGE
/
	TAD	BT1		REGET THE CHARACTER
	RTL			SHIFT SECOND DIGIT TO LEFT HALF OF AC
	RAL			...
	AND	P0700		ISOLATE THE LEFT HALF OF THE AC
	DCA	BINCTR		AND SAVE THAT
	TAD	BT1		REGET THE CHARACTER
	AND	P7		ISOLATE THE THIRD DIGIT
	TAD	BINCTR		MERGE SECOND BINARY DIGIT IN LEFT HALF OF AC
	TAD	DBLZER		MAKE IT AN ASCII ZERO
	DCAI	PASCHR1		AND STORE THAT IT INTO THE MESSAGE
	JMP	DOASCI-2	RETURN NOW: ALL DONE
/
/	ROUTINE TO CONVERT A BINARY NUMBER IN THE AC IN THE RANGE 0-99 TO
/	TWO 6-BIT ASCII DIGITS IN THE AC.
/	CELL 'TEMP' IN FIELD 0 IS RETURNED WITH TWO BLANKS IF THE NUMBER WAS
/	IN THE RANGE 0-99, OR WITH A PLUS AND A BLANK IF GREATER
/	THAN 99.
/
	CDF	BUF		RESTORE MAIN DATA FIELD
	CIF	0		RETURNING INSTRUCTION FIELD
BINASC	SUB	40
	CDF	0		TO FIELD OF 'TEMP' IN FIELD 0
	SPA			IF NEGATIVE NUMBER,
	CLA			MAKE IT ZERO
	DCA	BT1		SAVE THE NUMBER FOR A MOMENT
	TAD	TWOBL		ASSUME NUMBER IN RANGE 0-99 TO START
	DCAI	PTEMP		...
	CLL			LINK = 0 FOR 12-BIT UNSIGNED TEST
	TAD	BT1		GET THE NUMBER
	TAD	M100		COMPARE WITH HIGHEST VALUE FOR THIS ROUTINE
	SNL CLA			SKIP IF > 100
	JMP	0F		< 100, SO OK HERE
/
/	NUMBER TOO LARGE, JUST RETURN 99 AND + IN TEMP
/
	TAD	PLUSB		RETURN PLUS AND BLANK IN TEMP
	DCAI	PTEMP		...
	TAD	P99		AND RETURN 99 IN THE AC
	JMP	BINASC-3	ALL DONE HERE
/
0H	TAD	SPZERO		INITIALIZE COUNTER TO 00 ASCII
/
/	LOOP HERE DOING DIVIDE
/
1H	DCA	BINCTR		UPDATE THE COUNTER
	TAD	BT1		REGET THE NUMBER AGAIN
	TAD	M10		DIVIDE THE NUMBER BY 10 TO GET THE HIGH DIGIT
	SPA			GONE TOO FAR YET?
	JMP	2F		YES: JUMP OUT OF THIS LOOP
/
	DCA	BT1		NO: SAVE THE RESULT
	TAD	BINCTR		INCREMENT HIGH DIGIT
	AND	P1777		TRIM OFF HIGH ASCII DIGIT BITS
	TAD	ONEAT		INCREMENT DIGIT (CHANGES BLANK TO DIGIT TOO!)
	JMP	1B		LOOP BACK NOW
/
2H	TAD	P10		RESTORE THE DIGIT
	TAD	BINCTR		DIGITS ARE NOW CORRECT
	JMP	BINASC-3	ALL DONE HERE
/
	DSEC			PAGING OFF NOW
	TITLE	COMMAND DISPATCH TABLE
/
/	THIS IS THE DISPATCH TABLE BASED UPON CODES SENT THROUGH BY
/	THE INTERPRETER ROUTINES.
/
DISTAB	DC	IGNORE		100
	DC	IGNORE		101
	DC	IGNORE		102
	DC	IGNORE		103
	DC	IGNORE		104
	DC	IGNORE		105
	DC	IGNORE		106
	DC	IGNORE		107
	DC	IGNORE		110
	DC	IGNORE		111
	DC	IGNORE		112
	DC	IGNORE		113
	DC	IGNORE		114
	DC	IGNORE		115
	DC	IGNORE		116
	DC	IGNORE		117
	DC	IGNORE		120
	DC	IGNORE		121
	DC	IGNORE		122
	DC	IGNORE		123
	DC	CSTART		124	CURSOR TO START OF ROW
NOCASE	DC	CASE		125	INVERT CASE (NEEDS 7200 PAGE)
	DC	TRUNCF		126	TRUNCATE FILE WITH CURRENT PAGE
	DC	TRANSP		127	TRANSPARENT CHAR ENTRY
	DC	BKDEL		130	BACKSPACE DELETE
	DC	TABR		131	TAB RIGHT
	DC	INSTOG		132	INSERT CHAR ON/OFF
	DC	DELWD		133	DELETE WORD
	DC	RETURN		134	RETURN CODE
	DC	DLETLN		135	DELETE LINE
	DC	XEDIT		136	EXIT FROM EDIT MODE
	DC	QUIT		137	QUIT TO OS/8 MONITOR
	DC	CEOL		140	CURSOR TO END OF LINE
	DC	RSTEP		141	REPLACE STEP
	DC	RCONT		142	REPLACE CONTINUOUS
	DC	SEARCH		143	SEARCH MODE
	DC	CAPTOG		144	CAPS LOCK TOGGLE
	DC	AWAY		145	AWAY POSITION
	DC	BOFC		146	MOVE TO LAST PAGE
	DC	TOFC		147	MOVE TO FIRST PAGE
	DC	HOME		150	HOME CURSOR
	DC	NEWCMD		151	ENTER/LEAVE COMMAND MODE
	DC	PAGEDN		152	PAGE DOWN
	DC	PAGEUP		153	PAGE UP
	DC	SCRLDN		154	SCROLL DOWN
	DC	SCRLUP		155	SCROLL UP
	DC	ROWINS		156	INSERT LINE
	DC	PUTDN		157	PUT DOWN SAVED LINES
	DC	PICKUP		160	PICKUP MARKED LINES
	DC	UNMKROW		161	UNMARK ROW
	DC	MKROW		162	MARK ROW
	DC	DISMOD		163	DISPLAY MODIFIED LINES
	DC	DOSCRN		164	RESTORE SCREEN
	DC	DELSCR		165	DELETE SCREEN
	DC	CNEXTL		166	CURSOR TO NEXT LINE
	DC	WRIGHT		167	WORD CURSOR RIGHT
	DC	WLEFT		170	WORD CURSOR LEFT
NOTABL	DC	TABL		171	TAB LEFT (NEEDS 7200 PAGE)
	DC	INSBLK		172	INSERT BLOCK
	DC	DELEWD		173	DELETE TO END OF WORD
	DC	CRIGHT		174	CURSOR RIGHT
	DC	CLEFT		175	CURSOR LEFT
	DC	CDOWN		176	CURSOR DOWN
	DC	CUP		177	CURSOR UP
/
/	COMMAND DISPATCH TABLE
/
CTABLE	DC	-'C,C:CMND	CLOSE BLOCK SAVE FILE
	DC	-'L,L:CMND	LOOKUP BLOCK SAVE FILE
	DC	-'M,M:CMND	MARK ALL LINES SCROLLED OFF SCREEN
	DC	-'R,R:CMND	REPLACEMENT STRING
	DC	-'S,S:CMND	STRING SEARCH
	DC	-'W,W:CMND	WORD SEARCH
	DC	0		TABLE SENTINEL
/
/	SENTINEL ON COMMAND TABLE IS ALSO PRE-SENTINEL ON SAVE BUFFER
/
SAVBUF	QUT	%*,*		SAVE BUFFER
	ORG	SAVBUF+LMASK	SHOULD PROVIDE PLENTY OF ROOM
	DC	0		SENTINEL ON SAVE BUFFER
/
/	SEARCH/REPLACEMENT STRINGS
/
SSTRING	AS	LMASK/2		(SEARCH STRING BELOW JUST IN CASE A PROBLEM)
RSTRING	AS	LMASK/2		REPLACEMENT STRING
/
AVERS	AS	6		SAVE AREA FOR VERSION NUMBER + SENTINEL
/
KBUF	DC	1		NON-ZERO VALUE FOR INITIAL ENTRY AND FLUSH
	AS	19		KEYBOARD INPUT BUFFER
	DC	-1		SENTINEL ON BUFFER
/
/	TEXT/ERROR MESSAGES.
/
BSMSG	TEXT	"^PICKUP/PUTDOWN ERROR\"
CLMSG	TEXT	/^CLOSING FILE...\/
HEADER	AS	12,"  			24 BLANKS
STATUS	TEXT	/NONAME.XX-/
STVER	TEXT	/00.00     /
BLOCKS	TEXT	/14  EXTRA BLOCKS    /
ASCHR	TEXT	/<NNN>\/
REPMSG	TEXT	/^NUMBER OF REPLACEMENTS MADE: /
REPCOUNT TEXT	/NN  \/
/
/
/
/
/
/		END OF FIELD 1 FIXED STORAGE. REMAINDER IS DYNAMIC
/
DYNMEM	QUT	%*,*		START OF DYNAMIC MEMORY
/
/ ARGUMENT LIST FOR TIME-SHARE SYSTEMS. BREAK ON ALL CHARACTERS, ONLY
/ ALLOW INTERPRETATION OF CONTROL/V AND DOUBLE CONTROL/C
/
ARGLIST	DC      0204		KSTAT: ALLOW ^C AND ^V
	DC      04000		BREAK: BREAK ON ALL CHARACTERS
	DC      07600		CONTROL/ C RESTART ADDRESS
	DC      07600		CONTROL/ P RESTART ADDRESS (NOT USED)
	TITLE	DIRECT ENTRY FROM OS/8
/
/	COME HERE FROM OS/8 WITH THE AC:
/
/		0	IF WE WERE CHAINED TO BY CCL
/		1	IF CALLED DIRECTLY WITH 'RUN' COMMAND
/
	AIF	(DYNMEM.XO.04000).GE.(02000.XO.04000),.OK
	ORG	02000		DYNMEM BELOW 2000 SO ORG ABOVE IT NOW
.OK	ANOP
	ISEC	0		PAGING BACK ON AGAIN NOW
/
INIT	CDF	%*		ENSURE CURRENT FIELD IS SET
	SNA CLA			SKIP IF WE DO NEED TO CALL DECODER
	JMP	0F		DECODER ALREADY CALLED BY CCL: CONTINUE
VISTAGO	JMS	NRUSR,5,"*@	CALL COMMAND DECODER IN SPECIAL MODE
/
/ HANDLE CONDITION OF RUNNING UNDER A TIME-SHARE SYSTEM. IN THAT CASE,
/ WE ISSUE FUNCTION CALLS TO INDICATE THAT ALL CHARACTERS SHOULD BE
/ PASSED ALONG TO VISTA. CODE BELOW WILL SUPPORT ETOS/MULTOS SYSTEMS.
/
0H	DSI	06107		SKIP IF RUNNING UNDER TIME-SHARE SYSTEM
	JMP	1F		NOT RUNNING UNDER TIME-SHARE: CONTINU
	TAD     =ARGLIST	GET ADDRESS OF ARGUMENT LIST
	DI      06047		CALL TIME-SHARE MONITOR
	CLA			IN CASE 6047 NOT UNDER TIME-SHARE
/
1H	TAD	=EOF		MARK BLOCK SAVE BUFFER AS EMPTY
	DCAI	=BSBUF		...(IF PICKUP, EOF FOUND RIGHT AWAY)
	TAD	$07605		IF NO INPUT FILES, SET END-OF-FILE FLAG
	SZA CLA			SKIP IF NO INPUT FILE
	JMP	8F		WE HAVE AN INPUT FILE: CONTINUE NOW
/
	LDI	1		SET FLAG (NO INPUT FILES)
	DCAX	BOF		MARK AT BOTTOM OF FILE
	TAD	=EOF		MARK INPUT BUFFER EMPTY SINCE THERE IS
	DCAI	=BBUF		NO INPUT FILE PRESENT
	TAD	=BBUF		RESET BUFFER POINTER TO FIND 'EOF'
	DCAX	BEPTR		CODE RIGHT AWAY
/
/	HERE WHEN CHAINED TO DIRECTLY OR WHEN WE HAVE FINISHED SETTING
/	UP THE COMMAND DECODER TABLES
/
8H	CDF	%*		RESET CURRENT FIELD ('CORE' RETURNED HERE)
	IOT	4,6		FORCE SERIAL LINE UNIT FLAG UP
	TAD	=VERSION	OUTPUT VERSION NUMBER
	JMS	XPRINT		AND COPYRIGHT NOTICE
	TAD	$07605		GET FIRST CHARS OF NAME OF INPUT FILE
	SNA			DO WE HAVE AN INPUT FILE?
	TAD	$07600		NO: DO WE HAVE AN OUTPUT FILE?
	SNA CLA			SKIP IF EITHER PRESENT
	JMP	HELP		NEITHER: OFF TO GIVE HELP MESSAGE
/
/ TEST FOR /C OPTION: ALLOW LOWER CASE CHARACTERS TO THE LEFT
/ OF THE COMMENT DELIMITER (ONLY SIGNIFICANT WHEN /H OPTION IS ALSO
/ CHOSEN.
/
	TAD	$07643		/ GET WORD WITH /C BIT
	CLL RTL			/ SHIFT /C BIT TO AC0
	SMA CLA			/ SKIP IF /C OPTION WAS SELECTED
	JMP	2F		/ NOT SELECTED: CONTINUE
	TAD	=07200		/ SELECTED: STORE 'CLA' INSTRUCTION
	DCAX	SLASHC		/ TO ALWAYS AVOID CALL TO 'FOLD' ROUTINE8
/
/	CHECK FOR /P OPTION: USE THE SLOW CLOSE
/
2H	TAD	$07644		GET WORD WITH /P BIT
	AND	=0400		ISOLATE THE /P BIT
	SNA CLA			WAS /P BIT SET?
	JMP	9F		NO: SO CONTINUE
/
	TAD	=07000		YES: REMOVE JUMP TO FAST CLOSE ROUTINE
	DCAX	SLASHP		...
/
/	CHECK FOR /W OPTION: WORDWRAP MODE MEANS WE SUPPLY CR/LF WHENEVER
/	A LINE IS BROKEN BECAUSE IT EXCEEDS THE COLUMN WIDTH OF THE SCREEN.
/
9H	TAD	$07644		GET WORD WITH /W BIT
	CLL RTR			SHIFT /W BIT TO LINK
	SNL CLA			SKIP IF SET
	JMP	0F		NOT SET: CONTINUE
	DCAX	WFLAG		CLEAR FLAG
/
/	NOW CHECK FOR /F OPTION: STRIP ALL FORM FEEDS IN INPUT FILE
/
0H	TAD	$07643		GET WORD WITH /F BIT
	AND	=0100		ISOLATE THE /F BIT
	SNA CLA			WAS /F OPTION SPECIFIED?
	JMP	3F		NO, SO CONTINUE NOW
/
/	HERE WHEN THE /F OPTION WAS SPECIFIED.
/
	TAD	=-FF		SET FORM FEED CODE IN FLAG WORD
	DCAX	FFLAG		...
/
/	CHECK FOR /V OPTION: DO NOT CHANGE THE VERSION NUMBER
/
3H	LDI	4		SET TO ISOLATE THE /V BIT
	AND	$07644		...
	SNA CLA			SKIP IF /V OPTION IS SET
	JMP	0F		ELSE CONTINUE NOW
/
	TAD	=07000		SET 'NOP' INSTRUCTION TO INHIBIT VERSION
	DCA	VFLAG		NUMBER FROM BEING PROCESSED
/
/
/	USE OUTPUT FILE EXTENSION TO SEE IF CORRECTION FLAGS WANTED
/	FORCE CORRECTION FLAGS FOR PAGE8 AND HIBOL SOURCE PROGRAMS
/	(ALWAYS WANTED).
/
0H	TAD	$07600+4	EXTENSION LOCATION
	SNA			SKIP IF THERE IS AN EXTENSION
	TAD	$07605+4	IF NOT, USE THE INPUT FILE EXTENSION
	TAD	=-"PG		'PG' FOR PAGE8 SOURCE
	SZA			SKIP IF SO
	TAD	="PG-"HB	OR 'HB' FOR HIBOL
	SNA CLA			SKIP IF SOMETHING ELSE
	TAD	=0400		SET FLAG FOR PAGE8 AND HIBOL
	DCAX	MODF		OR CLEAR THE FLAG IF SOME OTHER EXTENSION
/
/	CHECK /H FLAG FOR ASSEMBLY/COMPILER ENTRY HEURISTICS
/
	TAD	$07643		WORD WITH /H OPTION BIT
	AND	=020		ISOLATE THE /H BIT
	DCAX	ASEMH		SET FLAG ON IF /H SET
/
/	CHECK /M FLAG: INVERT THE SETTING OF THE 'MODF' FLAG. I.E. POST
/	CORRECTION FLAGS FOR ALL EXTENSIONS OTHER THAN 'PG' AND 'HB',
/	CLEAR FLAGS FOR 'PG' AND 'HB'.
/
	TAD	$07644		GET WORD WITH THE /M BIT
	SMA CLA			SKIP IF SET
	JMP	6F		NOT SET: CONTINUE
/
	TADX	MODF		GET THE FLAG
	TAD	=0400		SET THE BIT ON
	AND	=0400		TURN IF OFF IF IT WAS ALREADY SET
	DCAX	MODF		AND STORE IT BACK
/
/	CHECK FOR AUDIT TRAIL WITH /A OPTION
/
6H	TAD	$07643		GET WORD WITH /A BIT
	SMA CLA			IS THE /A OPTION SET?
	JMP	1F		NO: SO CONTINUE
/
	TAD	=0400		SET THE FLAG ON NOW
	DCAX	AUDIT		...
/
/	CHECK FOR /Z OPTION: IGNORE ALL END OF FILE CONDITIONS
/	(I.E. LIKE ""SUPER TECO''
/
1H	TAD	$07645		GET WORD WITH /Z BIT
	CLL RAL			SHIFT /Z BIT TO AC 0
	SMA CLA			SKIP IF SET
	JMP	2F		NOT SET
	TAD	=07000		REMOVE END FILE CHECK
	DCAX	EOFCK		...
	TAD	=07000		REMOVE END FILE CHECK
	DCAX	SLASHZ		...
/
2H	JMS	NRUSR,8		LOCK USR IN CORE FOR INITIALIZATION
	ALIGN			(AVOID ANY INDIRECT ADDRESSING PROBLEMS)
/
/	NOW CHECK, DO WE HAVE AN OUTPUT FILE ?
/
	TAD	$07600+1	NAME WILL BE ZERO IF NO OUTPUT FILE
	SZA CLA			SKIP IF NO OUTPUT FILE HERE
	JMP	6F		OK, WE HAVE AN OUTPUT FILE HERE
	TAD	=07600		SET POINTER TO OUTPUT FILE
	DCA	BX1
	TAD	=07605		SET POINTER TO FIRST INPUT FILE
	DCA	BX2
	TAD	=-5		SET TO MOVE 5 WORDS OVER
	DCA	BCNTR
/
/	CHECK FOR DEVICE AND NO NAME, IF SO, ONLY MOVE THE NAME OVER
/
	TAD	$07600		CHECK FOR PRESENCE OF OUTPUT FILE NOW
	SZA CLA			SKIP IF NO OUTPUT DEVICE
	JMP	5F		OK, LEAVE THE DEVICE NUMBERS ALONE
/
3H	TADI	BX2		COPY WORD FROM INPUT FILE TO OUTPUT FILE
/
/	NOW CHECK FOR ILLEGAL '*' IN FILENAME
/	(SINCE WE CALLED DECODER IN SPECIAL MODE)
/
	TAD	=-"@*		CHECK FOR ILLEGAL STAR
	SNA CLA			SKIP IF NOT
	JMP	NO:OPEN		'*' FOUND - SIGNAL ERROR
	TADI	BX2		REGET AGAIN
	AND	=07700		ISOLATE THE LEFT BYTE
	TAD	=-"*@		TEST LEFT BYTE FOR ILLEGAL '*'
	SNA CLA			SKIP IF NOT
	JMP	NO:OPEN		'*' FOUND - SIGNAL ERROR
	TADI	BX2		REGET THE WORD
	DCAI	BX1		...
5H	INC	BX2		STEP BOTH POINTERS NOW
	INC	BX1		...
	ISZ	BCNTR		LOOP TILL ALL WORDS MOVED
	JMP	3B		...
	JMP	6F		CONTINUE NOW
/
/	TEMPORARY STORAGE
/
BX1	DC	0
BX2	DC	0
BCNTR	DC	0
	EJECT
/
/	NOW MOVE THE FILENAME AND EXTENSION INTO THE FILE STATUS WORD.
/
6H	TAD	$07601		FIRST 2 CHARS OF FILENAME
	DCA	STATUS		...
	TAD	$07602		2ND PAIR
	DCA	STATUS+1	...
	TAD	$07603		3RD PAIR
	DCA	STATUS+2	...
/
	TAD	$07604		EXTENSION
	RTR			SHIFT TO LOW END
	RTR			...
	RTR			...
	DCA	TEMP		SAVE FOR A MOMENT
	TAD	TEMP		REGET IT
	AND	=077		TRIM OFF HIGH HALF
	TAD	=".@		PUT PERIOD IN HIGH HALF
	DCA	STATUS+3	STORE AWAY
	TAD	TEMP		REGET SHIFTED EXTENSION
	RAR			NOW HAS 2ND CHAR IN HIGH HALF
	AND	=07700		TRIM OFF LOW BITS
	TAD	="@-		PUT HYPHEN IN LOW HALF
	DCA	STATUS+4	AND STORE IT AWAY
	TAD	=IDEVH		RESET DEVICE HANDLER TOP ADDRESS
	DCA	SDEV		...
/
/	RUN THROUGH ALL FIVE WORDS NOW FROM STATUS UP TO STATUS+4. IF
/	THERE IS AN ASCII NULL (WILL BE @ IN 6-BIT CODE) CHANGE IT
/	TO A BLANK.
/
	TAD	=-5		FIVE WORDS TO CHECK
	DCA	BCNTR		...
	TAD	=STATUS		POINTER TO FILENAME
	DCA	BX1		...
/
7H	TADI	BX1		NEXT PAIR
	AND	=07700		IS LEFT HALF NULL?
	SNA CLA			SKIP IF NOT
	LDI	" @		YES: CHANGE TO BLANK
	TADI	BX1		MERGE IN OLD WORD
	DCAI	BX1		...
	TADI	BX1		REGET
	AND	=077		AND CHECK THE RIGHT HALF
	SNA CLA			SKIP IF NOT NULL
	TAD	="@ 		CHANGE RIGHT TO BLANK
	TADI	BX1		MERGE IN OLD WORD
	DCAI	BX1		...
	INC	BX1		STEP POINTER
	ISZ	BCNTR		TEST LOOP COUNTER
	JMP	7B		LOOP BACK FOR NEXT PAIR
	JMP	LOOKUP		OFF NOW TO LOOK UP THE INPUT FILES
/
/	COME HERE TO ISSUE HELP MESSAGE
/
HELP	TAD	=06031		ALLOW KEYBOARD ABORT
	DCA	BABORT		...
	TAD	=HELPMSG	GET THE MAIN HELP MESSAGE
	JMS	XPRINT		PRINT OUT THE ENTIRE MESSAGE
	JMPX	QUIT		AND QUIT NOW
	ALIGN
	TITLE	INPUT FILE LOOKUP
/
/	CELLS FOR THIS PAGE
/
SDEV	DC	IDEVH		KEEPS TRACK OF WHERE HANDLERS LOADED
BTEMP	DC	0
BTEMP2	DC	0
/
/	HERE TO PERFORM OUR OWN LOOKUP ON THE INPUT FILE
/	THIS IS DONE SO THAT WE CAN HANDLE FILES LARGER THAN 256 BLOCKS
/	WITH THE SPECIAL FILE CLOSE FEATURE
/
LOOKUP	TAD	$07605		LOAD THE DEVICE NUMBER
	SNA			DID WE HAVE AN INPUT FILE?
	JMP	5F		NO: SO SKIP AHEAD
	ROOM	7
	JMS	USR,1		FETCH DEVICE HANDLER
2H	DC	IDEVH		...
	JMP	*+2		<1> CAN'T LOAD THIS HANDLER
	JMP	3F		<2> LOADED ALL RIGHT HERE
/
/	IF HANDLER LOAD FAILED, CHECK TO SEE IF WE WERE TRYING TO
/	LOAD A 2-PAGE HANDLER.
/
	TAD	2B		GET STATUS WORD
	CLL RAR			SHIFT 2-PAGE BIT TO LINK
	SZL CLA			SKIP IF TRYING A 1-PAGE HANDLER
	JMP	NODEV		ERROR: CANNOT LOAD HANDLER
	INC	2B		INDICATE 2-PAGE HANDLER ALLOWED HERE
	TAD	SDEV		UPDATE HANDLER ADDRESS
	TAD	=0200		...
	DCA	SDEV		...
	JMP	LOOKUP		TRY AND DO THE LOOKUP AGAIN NOW
/
/	HERE WHEN HANDLER LOAD WAS SUCCESSFUL
/
3H	TAD	2B		GET ENTRY POINT
	DCAX	IDEV		STORE FOR USE BY I/O ROUTINES
	TAD	SDEV		IF ENTRY POINT ON SYSTEM PAGE, LEAVE
	TAD	=-07600		ADDRESS ALONE (ALSO HANDLES ETOS/MULTOS ETC.)
	SPA CLA			SKIP IF WE ARE USING 7600 PAGE FOR HANDLER
	TAD	=0200		IF NOT, UPDATE ADDRESS NOW
	TAD	SDEV		...
	DCA	SDEV		...
/
	TAD	$07605		REGET THE DEVICE NUMBER
	CDF	%*
	ROOM	7
	JMS	USR,2		DO LOOKUP ON INPUT FILE
4H	DC	07606		FILENAME--CHANGED TO STARTING BLOCK
	DC	0		CHANGED TO MINUS LENGTH
	JMP	NO:FILE		<1> FILE NOT FOUND
	TAD	4B		<2> GET THE STARTING BLOCK OF THE FILE
	CDF	%IFSBLK		POINT AT INPUT FILE
	DCAI	=IFSBLK		STORE IT
	CDF	%*		RETURN DATA BANK
	TAD	=07606		RESET POINTER IN CASE LOOPING BACK
	DCA	4B		...
	TAD	4B+1		LOAD THE MINUS FILE LENGTH
	CDF	%IFMLEN		...
	DCAI	=IFMLEN		STORE MINUS LENGTH
	CDF	%*		RESET DATA FIELD
/
/	COMPUTE TOTAL FREE BLOCKS ON DEVICE
/	SO USER KNOWS AHEAD OF TIME IF ALL IS WELL
/
/	FIRST FETCH DEVICE HANDLER FOR OUTPUT FILE
/
5H	TAD	$07600+4	GET OUTPUT EXTENSION
	DCA	EXTEN		SAVE IT NOW
	TAD	="TM		SET EXTENSION FOR ENTER FUNCTION
	CDF	1
	DCA	$07600+4	...
	TAD	SDEV		SET DEVICE HANDLER POINTER
	DCA	7F		...
2H	TAD	$07600		GET DEVICE NUMBER
	ROOM	7
	JMS	USR,1		CALL USER SERVICE ROUTINE
7H	DC	0	
	JMP	*+2		<1> CAN'T LOAD HANDLER HERE
	JMP	8F		<2> HANDLER LOADED ALL RIGHT
/
	TAD	7B		GET LOAD ADDRESS
	CLL RAR			SHIFT 2-PAGE BIT TO LINK
	SZL CLA			SKIP IF ON FIRST PASS THROUGH HERE
	JMP	NODEV		DEFINITELY CANNOT LOAD HANDLER HERE
	INC	7B		SET 2-PAGE HANDLER BIT
	TAD	SDEV		UPDATE HANDLER ADDRESS
	TAD	=0200		...
	DCA	SDEV		...
	JMP	2B		LOOP BACK TO REPEAT OPERATION NOW
/
/	HERE WHEN HANDLER LOADED SUCCESSFULLY
/
8H	TAD	$07644		GET DECODER WORD WITH /O BIT
	CLL RTL			SHIFT /O BIT TO AC 0
	SPA CLA			WAS THE /O OPTION SELECTED?
	JMP	OKCONT		YES: SO NO OUTPUT DEVICE
	TAD	7B		GET ENTRY POINT
	DCAX	ODEV		AND STORE THAT
/
	TAD	SDEV		GET DEVICE HANDLER ENTRY POINT
	AND	=07600		ISOLATE THE PAGE ADDRESS
	TAD	=-IDEVH		WAS OUTPUT HANDLER CO-RESIDENT
	SNA CLA			WITH THE INPUT HANDLER?
	JMP	0F		YES: SO 7200-7577 IS STILL INTACT
/
	TAD	SDEV		GET ENTRY POINT
	TAD	=-07600		LOADED INTO 7600 PAGE?
	SPA CLA			SKIP IF SO
	TAD	=0200		ELSE UPDATE HANDLER PAGE ADDRESS
	TAD	SDEV		...
	DCA	SDEV		...
/
/	IF THE OUTPUT FILE IS ON SYS (OUTPUT DEVICE HANDLER ENTRY POINT IS
/	7607), THEN WE MUST PREVENT THE PIKUP ROUTINE FROM TRYING TO WRITE
/	TO THE SYSTEM DEVICE (ESPECIALLY A PROBLEM IF A DEVICE OTHER THAN
/	SYS REFERS TO SYS - SUCH AS DSK).
/
0H	TAD	7B		GET DEVICE HANDLER ENTRY POINT
	TAD	=-07607		IS SYS THE OUTPUT DEVICE?
	SNA CLA			SKIP IF NOT
	JMP	8F		YES: SO LEAVE PICKUP ROUTINE IN MEMORY
	TAD	=07325		NO: SO ALLOW PICKUP ROUTINE TO USE SYS:
	DCAX	OPFILE		...(7325 IS 'LDI 3' FOR CALL TO 'USR')
/
/	NOW ENTER THE OUTPUT FILE
/
8H	TAD	=07600+1	RESET ADDRESS OF FILE NAME
	DCA	9F		...
	TAD	$O'7600'	GET DEVICE NUMBER
	ROOM	7
	JMS	USR,3		DO THE ENTER ON THE OUTPUT FILE
9H	DC	07600+1		ADDRESS OF FILE ENTRY NAME
6H	DC	0
	JMP	NO:OPEN		<1> CAN'T OPEN THE OUTPUT FILE HERE
/
/	IF USER SPECIFIED OUTPUT FILE SIZE WITH [XXX] OPTION, USE THAT
/	FIGURE INSTEAD (PREVENTS THRASHING WHEN THERE IS A LARGE EMPTY
/	HOLE ON A DECTAPE SYSTEM)
/
	TAD	$07600		<2> GET LENGTH/DEVICE NUMBER
	AND	=07760		DID USER SPECIFY A LENGTH?
	CLL RTR			...
	CLL RTR			...
	CMA IAC			AND NEGATE IT
	SNA			SKIP IF SO
	TAD	6B		ELSE GET THE MINUS LENGTH OF THE FILE
	DCAX	TFMLEN		AND SAVE IT
	TAD	9B		GET THE STARTING BLOCK
	DCAX	TFSBLK		AND STORE THAT
	TADX	TFMLEN		GET MINUS BLOCK LENGTH
	CMA IAC			MAKE IT A POSITIVE NUMBER
	DCAX	TFBVBLK		SET AS BACKWARDS VIRTUAL BLOCK NUMBER
/
	TADX	TFMLEN		REGET AVAILABLE LENGTH
	SNA			IF ZERO, NOT A DIRECTORY DEVICE
	JMP	OKCONT		NOT A DIRECTORY DEVICE
	CLL CMA			ASSUME NO /P (ALLOCATE EXTRA BLOCK THEN)
	TAD	=2		ADD TWO BLOCKS FOR THE 'FUDGE FACTOR'
	DCA	BTEMP		SAVE FOR A MOMENT
/
/	IF /P OPTION IS SET, WE NEED NOT ALLOW FOR 1 EXTRA BLOCK ON THE
/	HIGH SPEED CLOSE.
/
	TAD	$07644		DECODE SWITCH WITH /P OPTION
	AND	=0400		ISOLATE THE /P BIT
	SZA CLA			SKIP IF /P NOT SET
	INC	BTEMP		/P SET -- WE DON'T NEED THE EXTRA BLOCK THEN
	TADX	IFMLEN		GET THE MINUS LENGTH OF THE INPUT FILE
	SNA			SKIP IF WE HAVE AN INPUT FILE
	JMP	1F		NO INPUT FILE -- DON'T SUBTRACT HERE THEN
	TAD	BTEMP		COMPARE WITH # OF BLOCKS AVAILABLE
	SNL			SKIP IF WE HAVE ROOM
	JMP	TIGHT		DEFINITELY TOO TIGHT
	DCA	BTEMP		SAVE NUMBER OF EXTRA BLOCKS
/
1H	TAD	BTEMP
	CLL			FOR UNSIGNED COMPARE
	TAD	=-10		LESS THAN TEN BLOCKS AVAILABLE?
	SZL CLA			SKIP IF SO
	JMP	OKCONT		10 BLOCKS OR MORE: CONTINUE
/
/	HERE WE HAVE LESS THAN 10 BLOCKS FOR THE FILE
/
	TAD	=0207		RING BELL
	JMS	BTYPE		TO GET ATTENTION
	TAD	=FREEBY		PRINT '<10 EXTRA BLOCKS'
	JMS	XPRINT		...
/
/	NOW DELAY HERE FOR ABOUT 2 SECONDS SO THE USER SEES THE MESSAGE
/
	DCA	BTEMP		INSIDE COUNTER
	TAD	=-100		OUTSIDE COUNTER
	DCA	BTEMP2		...
	IOT	3,2		CLEAR KEYBOARD FLAG
/
4H	ISZ	BTEMP		INSIDE COUNTER COUNTS DOWN
	JMP	4B		...
	IOS	3,1		KEYBOARD STRUCK?
	JMP	*+2		NO:
	JMP	OKCONT		YES: SO GET OUT OF THE LOOP
	ISZ	BTEMP2		OUTSIDE COUNTER
	JMP	4B		LOOP BACK
/
/	CONTINUE HERE NOW
/
OKCONT	IOT	3,2		CLEAR KEYBOARD FLAG IN CASE SET
	TAD	SDEV		GET TOP FREE PAGE ABOVE HANDLERS
	TAD	=-FASTCL	COMPARE WITH 'FASTCL' ADDRESS
	SPA SNA CLA		DID WE OVERWRITE HIGH SPEED CLOSE?
	JMP	2F		NO: SO CONTINUE NOW
	TAD	=07000		YES: SO REMOVE HIGH SPEED CLOSE
	DCAX	SLASHP		...
/
2H	TAD	SDEV		REGET TOP FREE PAGE
	TAD	=-ODEVH		DID WE OVERWRITE THE /H FEATURE?
	SPA SNA CLA		SKIP IF SO
	JMP	3F		ELSE CONTINUE
	DCAX	ASEMH		YES: SO REMOVE /H FLAG
	JMS	USR,9		SWAP DISPATCH TABLE BACK INTO MEMORY
	TAD	=IGNORE		MARK THAT CASE INVERSION IS UNAVAILABLE
	DCA	NOCASE		...
	TAD	=IGNORE		MARK THAT TAB LEFT IS UNAVAILABLE
	DCA	NOTABL		...
	JMS	NRUSR,8		GET 'USR' BACK INTO MEMORY AGAIN
/
3H	TAD	=CR		AND DO A CR/LF
	JMS	BTYPE
	TAD	=LF
	JMS	BTYPE
	TITLE	SELECT VIDEO CHARACTERISTICS MODULE
/
/	NOW SELECT THE VIDEO CHARACTERISTICS MODULE FOR THIS EDIT. DEFAULT
/	MODULE IS 'VCM0' HOWEVER, WE CAN SELECT MODULES 1-9 WITH
/	A SIMPLE / FOLLOWED BY THE NUMBER.
/
	TAD	=VCM		RESET POINTER TO FILENAME
	DCA	4F		...
	TAD	="M0		RESET NUMBER IN CASE LOOPING BACK HERE
	DCA	VCM+1		...
	TAD	$07645		GET OPTION WORD WITH DIGITS
	AND	=0777		ISOLATE BITS 1-9
	SNA			SELECT OTHER THAN DEFAULT MODULE?
	JMP	3F		NO: USE DEFAULT
/
/	LOCATE DESIRED MODULE NUMBER BY FINDING THE FIRST BIT THAT IS SET
/
	CLL RTL			SHIFT DIGIT 1 BIT NOW TO AC1
/
/	LOOP HERE LOOKING FOR THE FIRST BIT SET.
/
2H	INC	VCM+1		STEP DIGIT IN FILE NAME
	CLL RAL			SHIFT NEXT BIT UP
	SMA			SKIP WHEN WE HAVE FOUND THE BIT
	JMP	2B		STILL LOOKING FOR IT
/
/	NOW LOOK UP THE VCM FILE ON THE SYSTEM DEVICE AND READ IN
/	3 OS/8 RECORDS (1 1/2 BLOCKS INTO LOCATION 6000-6577 IN FIELD 0
/
3H	LDI	1		SYSTEM DEVICE (AC WAS NON-0 ON MERGE HERE)
	ROOM	8
	JMS	USR,2		FILE LOOKUP
4H	DC	VCM		ADDRESS OF VCM NAME
	DC	0		DUMMY ARGUMENT
	JMP	NO:VCM		<1> ERROR: VCM FILE NOT FOUND
	TAD	4B		<2> OK: GET THE STARTING BLOCK
	IAC			SKIP OVER THE OS/8 LOADING BLOCK
	DCA	5F		STORE FOR I/O CALL
/
	ROOM	10
	CIF	0		HANDLER IN FIELD 0
	JMS	$07607		CALL SYSTEM DEVICE HANDLER TO
	DC	3.LS.6		READ 3 RECORDS
	DC	KIO		TO KEYBOARD I/O ADDRESS
5H	DC	0		FROM STARTING BLOCK OF FILE
	JMP	NO:VCM		<1> I/O ERROR CANNOT READ VCM FILE
/
/	<2> FILE READ OK. SET UP PARAMS TAKEN FROM START OF VCM FILE AND
/	MOVE THEM ONTO PAGE ZERO WHERE THEY CAN BE CONVENIENTLY BE HANDLED
/
	CDF	0		TO FIELD 0
	TADI	=VMCMNT		MINUS COMMENT CHARACTER
	DCAI	=MCMNT		...
	TADI	=VMTAG		MINUS TAG CHARACTER
	DCAI	=MTAG		...
	TADI	=VROWS		# OF ROWS ON VIDEO SCREEN
	DCAI	=ROWSIZ		SET ROW SIZE
	TADI	=VCOLS		# OF COLUMNS ON VIDEO SCREEN
	DCAI	=COLSIZ		...
	TADI	=VAUCOL		GET AUDIT TRAIL COLUMN
	DCAI	=AUCOL		...
	TAD	=-8		SET ROW COUNTDOWN COUNTER
	TADI	=COLSIZ		TO 8 COLS LESS THAN DOUBLE ROW SIZE
	CLL CMA IAC RAL		NEGATE AND MULTIPLY BY TWO
	DCAI	=RFCTR		SET COUNTER
	TADI	=RFCTR		ALSO SET AS CONSTANT FOR RESTORATION
	DCAI	=RFMAX		OF 'RFCTR'
/
/	HANDLE ROW STATUS WORD AND STATUS BITS.
/
/	BIT 0		0	NO XON/XOFF
/			1	HANDLE XON/XOFF
/
/	BIT 1		0	NO CONTROL/O CHECK
/			1	CONTROL/O INVERTS SCREEN BLANKING
/
	TADI	=VSTAT		GET STATUS BIT
	SPA CLA			SKIP IF NO XON/XOFF CHECKING
	JMP	*+3		ELSE CONTINUE (ALL SET UP)
/
	TAD	=07000		SET 'NOP' INSTRUCTION TO AVOID
	DCAI	=XONCK		XON/XOFF CHECKING
/
	TADI	=VSTAT		GET STATUS WORD AGAIN
	CLL RAL			SHIFT CONTROL/O BIT TO AC 0
	SPA CLA			SKIP IF NO CONTROL/O CHECKING
	JMP	*+3		ELSE CONTINUE (ALREADY SET UP)
/
	TAD	=07000		'NOP' INSTRUCTION AVOIDS
	DCAI	=CTLOCK		THE CHECK FOR CONTROL/O
	TITLE	ESTABLISH ROW TABLE AND SCREEN MEMORY
/
/	NOW SETUP ROW TABLE BASED UPON PARAMS FROM THE VCM FILE
/
	TADI	=COLSIZ		GET THE COLUMN SIZE
	DCA	TEMP1		MOVE TO PAGE 0 IN THIS FIELD
	TADI	=ROWSIZ		GET NUMBER OF ROWS ON SCREEN
	DCA	TEMP2		...
	CDF	%*		RESET CURRENT FIELD NOW
/
/	DO QUICK CHECK ON VALIDITY OF ROWS AND COLUMNS, IF THIS HAS
/	BEEN MESSED UP, VISTA MIGHT CRASH WITHOUT CLEAR INDICATION
/	OF WHAT WAS WRONG.
/
	TAD	TEMP1		GET COLUMN COUNT
	TAD	=-200-1		ANYWHERE BETWEEN 10 AND 200 IS ACCEPTABLE
	CLL			...
	TAD	=200-10+1	...
	SNL CLA			VALID RANGE?
	JMP	NO:VCM		NO: TREAT AS BAD VCM FILE THEN
/
	TAD	TEMP2		GET COUNT OF ROWS ALLOWED ON SCREEN
	TAD	=-100-1		ANYWHERE BETWEEN 2 AND 100 IS ACCEPTABLE
	CLL			...
	TAD	=100-2+1	...
	SNL CLA			VALID RANGE?
	JMP	NO:VCM		NO: TREAT AS BAD VCM FILE THEN
/
/	CALCULATE SCREEN SIZE BASED UPON THESE PARAMETERS.
/
	TAD	TEMP2		GET ROW COUNT
	CMA IAC			NEGATE AND SET AS
	DCA	CNTR		LOOP COUNTER
	CLL
/
/	MULTIPLY COLUMN SIZE BY ROW COUNT TO GET SIZE OF SCREEN MEMORY
/	MUST CHECK FOR MEMORY OVERFLOW TOO. NOTE THAT AN EXTRA WORD IS NEEDED
/	FOR A SENTINEL (SOME ROUTINES FOR EFFICIENCY STORE A SENTINEL AT THE
/	END OF THE ROW RATHER THAN USING THE ROW COUNT)
/
1H	TAD	TEMP1		COLUMN SIZE
	TAD	=2		+1 FOR LENGTH/STATUS, +1 FOR SENTINEL
	SZL			OVERFLOW?
	JMP	9F		YES: CLEAR SCREEN AND THEN ISSUE BAD VCM MSG
	ISZ	CNTR		MORE ROWS TO MULTIPLY BY?
	JMP	1B		YES: SO BACK TO DO THAT
/
/	SCREEN SIZE IS NOW IN THE AC.
/
	TAD	=DYNMEM		ADD IN STARTING ADDRESS OF MEMORY
	SZL			DID WE OVERFLOW HERE?
	JMP	9F		YES: ISSUE BAD VCM MESSAGE
	CDF	0		TO FIELD 0
	DCA	TEMP		SAVE FOR A MOMENT
	TAD	TEMP		SHOULD ALSO BE BELOW 7400 IN FIELD 1
	TADI	=ROWSIZ		ADD IN SIZE OF ROW TABLE
	TAD	=-07400+2	IN ORDER NOT TO HIT CLOSE ROUTINES
	SZL CLA			SKIP IF ALL RIGHT HERE
	JMP	NO:VCM		TOO HIGH
	TAD	TEMP		REGET ADDRESS
	IAC			+1 TO ACCOUNT FOR DUMMY ROW AT END
	DCAI	=ROWTAB		MARK AS FIRST ADDRESS OF ROW TABLE
/
	TADI	=ROWTAB		ESTABLISH START OF ROW TABLE
	DCAI	=ROW		...
	TADI	=ROW		SET 'TXTROW' IN CASE 'PICKUP' CALLED WITH
	DCAI	=TXTROW		NO MARKED ROWS (VALID ROW PTR NEEDED THERE)
/
	TADI	=ROWSIZ		...
	TAD	TEMP		+ STARTING ADDRESS OF TABLE-1
	DCAI	=LASTROW	IS ADDRESS OF LAST ROW IN ROW TABLE
	EJECT
/
/	NOW ESTABLISH THE ROW TABLE WITH ALL THE ROW ADDRESSES AND
/	ALL THE STATUS WORDS FOR EACH ROW MARKED AS UNESTABLISHED.
/
	TADI	=ROWSIZ		GET NUMBER OF ROWS IN ROW TABLE
	CMA			NEGATE AND SET
	DCA	CNTR		AS A LOOP COUNTER (INCLUDE DUMMY ROW)
	TAD	=DYNMEM		STARTING ADDRESS OF ROWS IN MEMORY
	DCA	TEMP		...
	LDI	-1		SET POINTER TO FIRST SLOT IN ROW TABLE
	TADI	=ROWTAB		...
	DCA	TXR1		...
	CDF	BUF		TO ROW TABLE FIELD NOW
/
/	LOOP HERE ESTABLISHING EACH ROW IN THE ROW TABLE
/
2H	TAD	TEMP		STARTING ADDRESS OF NEXT ROW
	DCAI	TXR1		STUFF INTO ROW TABLE SLOT
	LDI	2		ALLOCATE FOR LENGTH/STATUS AND SENTINEL
	TAD	TEMP		UP ADDRESS NOW TO ADDRESS OF NEXT ROW
	TAD	TEMP1		+ COLUMN SIZE
	DCA	TEMP		...
	ISZ	CNTR		MORE ROWS TO SET UP?
	JMP	2B		YES: SO BACK TO SET THEM NOW
/
/	SET UP THE NUMBER OF BLOCKS IN THE SCREEN IN 'BLOCKCT' TO
/	STATUS LINE BLOCK COUNT.
/
	TADI	=ROWSIZ		GET NUMBER OF ROWS
	CLL CMA IAC RAL		TIMES 2 AND NEGATE
	TADI	=ROWTAB		SUBTRACT FROM END OF ROW TABLE
	TAD	=-DYNMEM	NOW CALCULATE SIZE OF SCREEN BUFFER
/
/	LOOP HERE TO DIVIDE NUMBER OF CHARS ON SCREEN BY 384 WHICH
/	INDICATES THE MAXIMUM NUMBER OF OS/8 BLOCKS NEEDED TO HOLD
/	THAT NUMBER OF CHARACTERS.
/
3H	CLL			FOR 12-BIT COMPARE
	TAD	=-384		NUMBER OF WORDS IN OS/8 BLOCK
	INCX	BLOCKCT		COUNT NUMBER OF BLOCKS
	SZL			GONE TOO FAR YET?
	JMP	3B		NO: CONTINUE WITH DIVIDE
	CLA			YES: REMOVE GARBAGE FROM AC
	EJECT
	JMS	USR,9		RELEASE USR NOW
	JMPX	STARTUP		OFF TO READ IN FIRST PART OF FILE
/
9H	CLA			CLEAR AC
	JMP	NO:VCM		THEN ISSUE BAD VCM MESSAGE
/
/	COME HERE WHEN THE INPUT FILE WAS NOT FOUND
/
NO:FILE	TAD	=MFILE		THERE WAS NO FILE HERE
	JMS	XPRINT		...
/
/	HERE TO RETURN DIRECTLY TO MONITOR
/
QIT	JMPX	QUIT		ALL DONE HERE
/
/	HERE IF WE CAN'T LOAD THE DEVICE HANDLER
/
NODEV	TAD	=CANTLD-OPENF	CAN'T LOAD DEVICE HANDLER
NO:OPEN	TAD	=OPENF-NOVCM	CAN'T OPEN OUTPUT FILE
NO:VCM	TAD	=NOVCM		CAN'T FIND 'VCM' FILE
	JMS	XPRINT		...
	JMP	QIT		QUIT NOW
/
/	HERE IF THERE IS NOT ENOUGH ROOM FOR THE OUTPUT FILE
/
TIGHT	CLA			REMOVE GARBAGE FROM AC ON ENTRY
	TAD	=0207		RING BELL ON CONSOLE A COUPLE OF TIMES
	JMS	BTYPE
	TAD	=0207		...
	JMS	BTYPE
	TAD	=TIGHT2		TELL USER, NOT ENOUGH SPACE
	JMS	XPRINT		...
/
	TAD	=CONWAY		ASK USER IF THEY WISH TO CONTINUE
	JMS	XPRINT		...
	JMS	XREAD		READ REPLY FROM CONSOLE
	AND	=040.XO.-1	REMOVE UPPER/LOWER CASE BIT
	TAD	=-'Y		'YES' REPLY HERE?
	SNA CLA			SKIP IF NOT
	JMP	OKCONT		ELSE LET USER CONTINUE IF HE WANTS TO
	JMP	QIT		OK: QUIT NOW
	ALIGN			ENSURE NO PAGING PROBLEMS HERE
	TITLE	READ KEYBOARD AND PRINT STRING ROUTINE
/
/	HERE TO READ FROM THE KEYBOARD
/
XREAD	SUB
	IOT	3,2		ENSURE FLAG CLEAR ON ENTRY
	IOS	3,1		WAIT FOR KEYBOARD FLAG TO COME UP
	JMP	*-1		...
	IOT	3,6		READ RESPONSE
	AND	=0177		TRIM PARITY BIT
	TAD	=0200		NORMALIZE TO THE ON POSITION
	DCA	XTEMP		SAVE CHARACTER
	TAD	XTEMP		REGET THE CHARACTER
	JMS	BTYPE		OUTPUT TO THE CONSOLE
	TAD	XTEMP		REGET THE CHARACTER NOW
	RET	XREAD		RETURN CHARACTER IN THE AC
	TITLE	PRINT STRING ROUTINE
/
/	SUBROUTINE TO OUTPUT PACKED 6-BIT CHARACTER STRING. CHARACTER
/	POINTER IN AC. UP-ARROW CHARACTER INDICATES WE WISH TO PERFORM
/	A CR/LF.
/
XPRINT	SUB
	DCA	XTEMP		SAVE POINTER TO THE SCREEN
/
/	LOOP HERE TO GET THE NEXT PAIR OF CHARACTERS
/
1H	TADI	XTEMP		GET NEXT WORD
	RTR			SHIFT LEFT BYTE TO RIGHT HALF OF AC
	RTR			...
	RTR			...
	JMS	XPR2		OUTPUT RIGHT HALF OF AC
	TADI	XTEMP		GET WORD AGAIN
	JMS	XPR2		OUTPUT RIGHT HALF OF AC
	INC	XTEMP		STEP POINTER TO NEXT PAIR OF CHARACTERS
	JMP	1B		LOOP BACK FOR THEM NOW
/
/	HERE TO OUTPUT THE RIGHT HALF OF THE AC AS A FULL 8-BIT CODE
/	CHECK ALSO FOR UP-ARROW WHICH CAUSES A CLEAR SCREEN FUNCTION
/	TO BE EXECUTED
/
XPR2	SUB
	AND	=077		TRIM OFF HIGH PART OF AC
	SNA			SKIP IF REAL CODE
	RET	XPR2		IGNORE BINARY ZERO
	TAD	=-"@^		UP-ARROW CODE?
	SNA			SKIP IF NOT
	JMP	3F		YES: HANDLE THIS
/
	TAD	="@^-"@\	BACKSLASH: FOR END OF MESSAGE?
	SNA			SKIP IF NOT
	RET	XPRINT		YES: RETURN DIRECTLY FROM 'XPRINT'
/
	TAD	="@\-040	RESTORE AND TEST FOR 0-37 VS. 40-77 CODE
	SPA			SKIP IF IN RANGE 40-77
	TAD	=0100		1-37 RANGE: ADD IN 7TH BIT
	TAD	=0240		BUILD FULL CODE NOW
2H	JMS	BTYPE		OUTPUT THE CHARACTER
	RET	XPR2		DONE HERE
/
/	HERE ON UP-ARROW CODE
/
3H	TAD	=CR		DO CR FIRST
	JMS	BTYPE		...
	TAD	=LF		LOOP BACK NOW FOR LINE FEED
	JMP	2B		SEND THAT NOW
/
XTEMP	DC	0		TEMPORARY SAVE FOR POINTER
/
/	OUTPUT CHARACTER IN AC TO CONSOLE TERMINAL
/
BTYPE	SUB
	IOS	4,1		WAIT FOR SERIAL LINE UNIT TRANSMITTER FLAG
	JMP	*-1		...
	IOT	4,6		OUTPUT CHARACTER
	CLA			REMOVE FROM AC
BABORT	DSI	07000		KEYBOARD FLAG UP? (HELP MESSAGE ONLY)
	RET	BTYPE		NO: ALL DONE HERE
	JMPX	QUIT		YES: QUIT NOW (INTERRUPT MESSAGE PRINTING)
	TITLE	INITIALIZATION MESSAGES
/
	DSEC
/
	MACRO			THIS MACRO INHIBITS OBJECT LISTING
	.TEXT	<ARG>
:A	SET	*		; TARGET FOR LISTING CALL
	NOLIST			; SHUT OFF OBJECT LISTING
<> TEXT ]<ARG>]			; LIST OBJECT CODE OFF
	LIST			; LISTING BACK ON AGAIN NOW
	MEND
/
MFILE	.TEXT	<INPUT FILE NOT FOUND^\>
OPENF	.TEXT	<CAN'T OPEN OUTPUT FILE^\>
VERSION	.TEXT	<VISTA--01.09......COPYRIGHT (C), 1980^>
	.TEXT	<DEWAR INFORMATION SYSTEMS CORPORATION^^\>
CANTLD	.TEXT	<CAN'T LOAD HANDLER^\>
TIGHT2	.TEXT	<NOT ENOUGH ROOM FOR WHOLE INPUT FILE!!^\>
FREEBY	.TEXT	<LESS THAN 10 BLOCKS FOR FILE EXPANSION!^\>
CONWAY	.TEXT	<^CONTINUE ANYWAY? (Y/N): \>
NOVCM	.TEXT	<VIDEO CHARACTERISTICS FILE BAD/MISSING!^\>
/
VCM	TEXT	/VCM0@@SV/		NAME OF VCM FILE
	TITLE	MAIN HELP MESSAGE
/
HELPMSG .TEXT	<^^RUN-TIME OPTIONS:^>
	.TEXT	<	/A	AUDIT TRAIL OF CHANGES WITH VERSION #'S^>
	.TEXT	<	/B	INHIBIT AUTOMATIC FILE BACKUP ON CLOSE^>
	.TEXT	<	/C	ALLOW LOWER CASE CHARS BEFORE COMMENT^>
	.TEXT	<	/F	STRIP FORM FEEDS ON INPUT^>
	.TEXT	<	/H	ASSEMBLER/COMPILER HEURISTICS ON ENTRY^>
	.TEXT	<	/M	FLAG MODIFIED LINES WITH CONTROL/A^>
	.TEXT	<	/O	EDIT WITH NO OUTPUT^>
	.TEXT	<	/P	USE SLOW, BUT OPTIMAL PACKING ON FILE CLOSE^>
	.TEXT	<	/V	DON'T INCREMENT VERSION NUMBER^>
	.TEXT	<	/W	WORDWRAP LINES WIDER THAN SCREEN^>
	.TEXT	<	/Z	SKIP OVER & IGNORE END OF FILE^^>
	.TEXT	<	/1-9	SELECT ALTERNATE VCM FILE #1-9^>
	.TEXT	<VISTA COMMANDS^^>
	.TEXT	<C	CLOSE BLOCK SAVE BUFFER AS 'PIKUPX' ON SYS:^>
	.TEXT	<LA	LOOK UP FILE 'PIKUPA' ON SYS: FOR PICKUP^>
	.TEXT	<M	MARK ALL ROWS SCROLLED OFF THE SCREEN^>
	.TEXT	<R	REPLACE SEARCH STRINGS WITH FOLLOWING STRING^>
	.TEXT	<S	SEARCH FOR STRING THAT FOLLOWS^>
	.TEXT	<W	SEARCH FOR WORD THAT FOLLOWS^>
	.TEXT	<^IF MORE THAN 2 PDP-8 PAGES ARE NEEDED FOR HANDLER SPACE>
	.TEXT	<^/H OPTION, INVERT CASE AND TAB LEFT FUNCTIONS ARE NOT>
	.TEXT	<^AVAILABLE. IF ALL 4 HANDLER PAGES ARE NEEDED>
	.TEXT	<^/P OPTION IS FORCED>
	.TEXT	<^\>		MAIN SENTINEL ON MESSAGE
	TITLE	DIRECTORY CLEANUP AFTER FILE CLOSURE
/
/	HERE TO CLOSE OUT THE OUTPUT FILE. OUTPUT FILE IS CLOSED WITH
/	EXTENSION OF .TM. ANY OLD BACKUP IS DELETED. OLD FILE IS
/	CHANGED TO .BK AND NEW FILE IS THEN CHANGED TO PROPER
/	EXTENSION
/	ON /B OPTION, WE JUST CLOSE OUT THE FILE WITH THE ORIGINAL EXTENSION
/
	ORG	07400		END OF FIELD 1
/
/	MESSAGES AND EXTEN ARE PLACED HERE BECAUSE FAST CLOSE
/	OVERWRITES 10000-17377.
/
WTEMP	DC	0		TEMPORARY STORAGE FOR THIS PAGE
WTEMP2	DC	0		...
EXTEN	DC	0		SAVE CELL FOR EXTENSION
NOCLOSE TEXT	/^FILE CLOSE ERROR\/
IOMSG	TEXT	"^I/O ERROR! RETRY? \"
TFULL	TEXT	/^DEVICE FULL\/
/
	ISEC	0		PAGING BACK ON AGAIN
/
ICLOSE	CDF	0		TO GET AT VIRTUAL BLOCK
	TADI	=TFFVBLK	THIS IS THE ACTUAL LENGTH OF THE FILE
	CDF	%*		RESET CURRENT FIELD NOW
	DCA	2F		STORE FINAL OUTPUT VIRTUAL BLOCK COUNT
	JMS	NRUSR,8		LOCK USR IN CORE FOR CLOSE OPERATIONS
/
/				WITH USR LOCKED INTO MEMORY,
/	### CAUTION ###		WE MUST BE VERY CAREFUL ABOUT
/				USING PAGE ZERO CELLS.
/
	TAD	$07600		REGET DEVICE NUMBER

	JMS	USR,4		CLOSE OUT THE OUTPUT FILE
	DC	07601		POINTS TO OUTPUT FILE NAME
2H	DC	0		BLOCK COUNT STORED HERE
	JMP	FAILCL		<1> CLOSE FAILED
/
/	<2> OK: IF THERE IS A .BK FILE WITH THE SAME NAME, DELETE IT NOW
/
	TAD	$07643		LOAD DECODER SWITCH
	CLL RAL			SHIFT /B BIT TO AC 0
	SMA CLA			SKIP IF /B SET
	JMP	*+3		NOT SET: LOOK UP .BK FILE
	TADI	=EXTEN		SET TO DELETE ORIGINAL IF /B SET
	SKP
	TAD	="BK		SAVE .BK EXTENSION
	DCA	$07600+4	EXTENSION POSITION FOR OUTPUT FILE
	TAD	$07600		GET DEV NUMBER
	ROOM	7
	JMS	USR,2,07600+1,0 LOOK UP THE FILE NOW
	JMP	7F		<1> NO FILE HERE WITH .BK EXTENSION
	TAD	$07600		<2> FOUND: DELETE ANY OLD .BK VERSION NOW
	ROOM	7
	JMS	USR,4,07600+1,0
	JMP	FAILCL		<1> CLOSE ERROR ON DELETE
	EJECT
/
/	<2> OK: NOW LOOK TO SEE IF ANY ORIGINAL FILE WITH THIS NAME
/
7H	TADI	=EXTEN		THE SAVED EXTENSION
	DCA	$07600+4	MOVE IT INTO NAME
	TAD	$07600		GET DEV #
	ROOM	7
	JMS	USR,2,07600+1,0 DO FILE LOOKUP
	JMP	3F		<1> NO ORIGINAL FILE WITH THAT NAME
	TAD	="BK		<2> YES: CHANGE IT'S NAME NOW TO .BK
	JMS	WRDCT		WRITE OUT DIRECTORY NOW
/
/	NOW LOOK UP THE FILE WE JUST CLOSED OUT AND CHANGE IT FROM .TM
/	TO THE ORIGINAL EXTENSION
/
3H	TAD	="TM		RESET FILE EXTENSION
	DCA	$07600+4
	TAD	$07600		GET DEV #
	ROOM	7
	JMS	USR,2,07600+1,0	LOOK UP OUTPUT FILE
	JMP	FAILCL		<1> ERROR: FILE DISAPPEARED??!
	TADI	=EXTEN		<2> OK: GET THE ORIGINAL EXTENSION
	JMS	WRDCT		WRITE OUT THE DIRECTORY NOW
	JMPX	QUIT		AND RETURN TO OS/8 VIA 'QUIT'
/
/	HERE ON ERROR OF TRYING TO CLOSE OUT THE FILE
/
FAILCL	JMPX	CLFAIL		BACK TO FIELD 0 TO ISSUE ERROR MESSAGE
	EJECT
/
/	SUBROUTINE TO CHANGE THE EXTENSION OF THE LAST FILE LOOKED UP
/	IN THE USR ROUTINES. EXTENSION VALUE SHOULD BE IN AC
/
WRDCT	SUB
	DCA	WTEMP2		SAVE NEW EXTENSION
	LDI	-1
	TADI	=$01404		MINUS # OF INFORMATION WORDS
	TADI	=$017		+ POINTER TO LENGTH WORD
	DCA	WTEMP		NOW POINTS AT FILE EXTENSION
	TAD	WTEMP2		SET NEW EXTENSION
	DCAI	WTEMP		...
	TADI	=$051		GET ADDR OF DEV HANDLER
	DCA	WTEMP		SAVE THAT
	TADI	=$7		GET SEGMENT NUMBER HERE
	AND	=7		ISOLATE SEGMENT
	DCA	1F		STORE ARGUMENT
	ROOM	9
DWRITE	CIF	0		HANDLER IN FIELD 0
	JMSI	WTEMP		WRITE OUT THIS DIRECTORY NOW
	DC	04210		1 BLOCK, WRITE, BANK 1
	DC	01400		LOCATION OF DIRECTORY
1H	DC	070		BLOCK HERE (70 IN CASE BUG !)
	SMA CLA			<1> SKIP IF FATAL I/O ERROR
	RET	WRDCT		<2> ALL OK: RETURN NOW
	JMPX	WFAIL		I/O ERRORS ON DIRECTORY! BETTER RETRY!
/
	ORG	07600		END OF CODE IN FIELD 1