Google
 

Trailing-Edge - PDP-10 Archives - bb-k345a-sb - lined.mac
There are 6 other files named lined.mac in the archive. Click here to see a list.
TITLE	LINED	VERSION 13B	
SUBTTL	LINE EDITOR FOR DISK FILES		LARRY WADE/WJM/PMH/CAM



;COPYRIGHT (C) 1974,1978,1979 BY
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
;ONLY  IN  ACCORDANCE  WITH  THE  TERMS  OF  SUCH LICENSE AND WITH THE
;INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS SOFTWARE OR ANY  OTHER
;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON.  NO TITLE TO AND OWNERSHIP OF THE  SOFTWARE  IS  HEREBY
;TRANSFERRED.
;
;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT  NOTICE
;AND  SHOULD  NOT  BE  CONSTRUED  AS A COMMITMENT BY DIGITAL EQUIPMENT
;CORPORATION.
;
;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY  OF  ITS
;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.

EDIT==22
VERSION==XWD 1302,EDIT

;COPYRIGHT 1970,1971,1974, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.



;DEFAULT DEFINITIONS FOR ASSEMBLY SWITCHES
;THESE YIELD A REENTRANT LINED WITH CCL & TMPCOR UUO CAPABILITY

IFNDEF PURE,<PURE==1>
IFNDEF CCLSW,<CCLSW==1>
IFNDEF TEMP,<TEMP==1>

;FOR ANY OTHER VERSION ASSEMBLE AS FOLLOWS:
;.R MACRO
;*LINED_TTY:,DSK:LINED.MAC
;PURE=0				((IF NON-REENTRANT LINED WANTED))
;CCLSW=0			((IF CCL NOT WANTED))
;TEMP=0				((IF TMPCOR UUO NOT AVAILABLE))
;^Z
;^Z



LOC	137
	VERSION
RELOC	0

IFN PURE,<
	TWOSEG
RELOC	400000
	>
;	
;	GENERAL-
;	LINED IS A DERVIATIVE OF
;	DREDIT (DRUM EDITOR) WHICH WAS WRITTEN BY WILLIAM MEIR OF APPLIED
;	LOGIC CORPORATION AND EXISTS AS PART OF THE DECUS LIBRARY.
;	LINED'S COMMAND STRUCTURE IS SIMILIAR TO DEC'S "EDITOR"
;	BUT WORKS WITH FILES WHICH RESIDE ON THE DISK INSTEAD OF
;	ON DEC TAPE.
;	
;	
;	
;	PURPOSE-
;	
;	THIS MEMO WILL DESCRIBE THE CAPABILITIES AND RESTRICTIONS OF 
;	LINED AND OUTLINE THE CHANGES NECESSARY TO MAKE LINED A PART 
;	OF DEC'S SOFTWARE.
;	
;	A MAJOR FEATURE OF LINED IS THE ABILITY TO
;	REFERENCE ANY LINE AT ANY TIME, WITHOUT FIRST HAVING TO
;	CLOSE AND THEN REOPEN THE FILE.
;	
;	COMMAND STRUCTURE-
;
;	IN THE FOLLOWING DESCRIPTION, A POINT (.) OR DOT REFERS TO THE
;	LAST LINE WHICH WAS TYPED, THE LAST LINE DELETED, OR THE LAST
;	LINE INSERTED.
;	
;	1. TO OPEN AN EXISTING FILE FOR EDITING.
;	
;		S<FILENAME.EXT><CR>
;	
;	2. TO CREATE A NEW FILE.
;	
;		S<FILENAME.EXT><ALTMODE>
;	
;	3.TO INSERT TEXT
;	
;		I
;		I N1
;		I N1,N2		INSERT THE TEXT WHICH FOLLOWS AT LINE
;				N1 AND ASSIGN SEQUENCE NUMBERS IN
;				INCREMENTS OF N2 FOR EACH LINE AFTER THE
;				FIRST. IF LINE N1 EXISTS IT WILL BE
;				REPLACED. IF N1 IS NULL A VALUE OF 10 IS
;				ASSUMED. N1 MAY BE SPECIFIED AS A POINT (.).
;				IF N2 IS NULL EITHER A VALUE OF 10
;				IS ASSUMED OR THE VALUE LAST SPECIFIED IN
;				AN INSERT COMMAND IS USED.
;				AN ALTMODE IS TYPED TO RETURN TO LINED
;				COMMAND LEVEL.
;	
;	4. TO PRINT TEXT.
;	
;		P N1
;		P N1,N2		PRINT LINE N1 OR LINES N1 THROUGH N2
;				N1 MAY BE SPECIFIED AS A POINT (.).
;				N2 MAY ALSO BE SPECIFIED AS A POINT AS
;				LONG AS N1<N2.
;				AN ALTMODE WILL CAUSE THE NEXT LINE
;				TO BE TYPED.
;	
;	5. TO DELETE TEXT
;	
;		D N1
;		D N1,N2		DELETE LINE N1 OR LINES N1 THROUGH N2
;				N1 MAY BE SPECIFIED AS A POINT (.)
;				UNLESS AN INSERT WAS JUST PERFORMED.
;				N2 MAY ALSO BE SPECIFIED AS A POINT AS
;				LONG AS N1<N2.
;	
;	6. TO CLOSE A FILE
;	
;		E<CR>
;	
;	RESTRICTIONS-
;	
;	1.	WHEN IN INSERTION MODE, THE ALTMODE RETURNS TO LINED 
;		COMMAND LEVEL. IF THE ALTMODE IS ALSO USED TO TERMINATE
;		A LINE OF TEXT TO BE INSERTED, THE LINE OF TEXT IS 
;		IGNORED.
;	
;	2.	LINED ASSUMES ALL BLOCKS ON THE DISK FILE HAVE AN
;		INTEGRAL NUMBER OF LINES. TO GUARANTEE THIS THE USER
;		SHOULD USE THE "A" SWITCH (LINE BLOCKING) WITH PIP TO PUT A FILE ON
;		THE DISK.
;	
;	3.	LINED AND TECO ARE INCOMPATIBLE AND THE SAME  FILE
;		SHOULD NOT BE EDITED BY BOTH UNLESS SEQUENCE
;		NUMBERS ARE EITHER ADDED OR DELETED.
;
;	4.	LINE NUMBER 0 IS ILLEGAL.
;	
;	
;	ERROR HANDLING-
;	
;	WHEN AN ERROR IS DETECTED, A MEANINGFUL MESSAGE IS TYPED.
;	IF IT IS AN I/O ERROR, WE EXIT. OTHERWISE WE
;	RETURN TO COMMAND LEVEL.
;	
;	NOTE: THE OLD *ILR* AND *ILS* MESSAGES HAVE BEEN REMOVED.
;		INSTEAD OF THEM LINED WORKS AS FOLLOWS:
;		IF INSERTION AT A GIVEN LINE NUMBER WILL CAUSE
;		REPLACEMENT OF AN EXISTING LINE, THE LINE# IS
;		FOLLOWED BY A SINGLE TIC (').
;		IF THE INSERTION LINE# INCREMENT IS SUCH THAT
;		INSERTION AT A GIVEN LINE WILL CAUSE AN EXISTING
;		LINE TO BE SKIPPED, THE LINE NUMBER IS
;		FOLLOWED BY A DOUBLE TIC ("). SEE EXAMPLE 4.
;		(THIS CHANGE EFFECTIVE AS OF V.010)
;	
;	CONCISE COMMAND LANGUAGE INTERFACE-
;	
;	THE CCL COMMANDS "CREATE" AND "EDIT" WILL BE USED TO ACCESS
;	LINED. THE "CREATE" COMMAND WILL EFFECTIVELY GENERATE THE SEQUENCE
;	
;		R LINED
;		S<FILENAME><ALTMODE>
;	
;	THE "EDIT" COMMAND WILL EFFECTIVELY GENERATE THE SEQUENCE
;	
;		R LINED
;		S<FILENAME><CR>
;	
;	THE CCL CUSP WILL GENERATE A TEMPORARY DISK FILE WITH THE NAME
;	
;		###EDT.TMP
;	
;	IN ORDER TO PASS THE ABOVE COMMANDS.
;	
;	
;	
;	EXAMPLE-1
;	
;		.R PIP<CR>
;		*DSK:(ASX)_DTA0:FILE.ONE<CR>
;		*^C
;		.R LINED <CR>
;		*SFILE.ONE<CR>
;		*P10,30<CR>
;		00010	THIS IS THE FIRST LINE
;		00020	THIS IS THE SECOND LINE
;		00030	THIS IS THE THIRD LINE
;		*I20<CR>
;		00020'	THIS IS THE NEW LINE
;		*D30<CR>
;		*P10,30<CR>
;		00010	THIS IS THE FIRST LINE
;		00020	THIS IS THE NEW LINE
;		*E<CR>
;		*^C
;		.
;	
;	EXAMPLE-2
;	
;		.CREATE PROGRAM
;		*I<CR>
;		00010	THE PROGRAM IS
;		00020	INSERTED HERE
;		00030
;		  .
;		  .
;		  .
;		  .
;		000XX	<ALTMODE>
;		*E<CR>
;		*^C
;		.
;	
;	
;	EXAMPLE-3
;			VALID FORMS OF THE INSERT COMMAND
;
;		I
;		I10
;		I10,2
;		I.
;		I,1
;		I.,1
;
;
;	EXAMPLE-4	NEW INDICATION OF REPLACEMENT & SKIPPING
;
;		*SFOO<ALT>
;		*I10
;		00010	A
;		00020	B
;		00030	C
;		00040	D
;		00050	<ALT>
;		*I20,5
;		00020'	BB
;		00025	XX
;		00030'	CC
;		00035	<ALT>
;		*I30,20
;		00030'	CCC
;		00050"	EEE
;		00070	<ALT>
;		*
;
;	IMPLEMENTATION-
;	
;	EACH LINE OF TEXT IS STORED IN THE WORKING BUFFER WITH A LINE
;	HEADER WHICH HAS TWO ITEMS.  IN THE LEFT HALF IS THE SEQUENCE
;	NUMBER IN BINARY AND IN THE RIGHT HALF IS THE NUMBER OF WORDS
;	(INCLUDING THE LINE HEADER) WHICH ARE NEEDED TO STORE THE 
;	LINE OF TEXT.  THUS TO FIND THE NEXT LINE OF TEXT IT IS JUST
;	NECESSARY TO TAKE THE ADDRESS OF THE CURRENT LINE HEADER AND
;	ADD THE WORD COUNT.
;	
;	SEVERAL POINTER WORDS ARE USED TO KEEP TRACK OF THE LINES IN
;	THE WORKING BUFFER.  WRTLST CONTAINS THE SEQUENCE NUMBER OF THE
;	LAST LINE WHICH WAS JUST PASSED THROUGH THE WORKING BUFFER.
;	SEQLST CONTAINS THE HIGHEST SEQUENCE NUMBER OF THE HIGHEST
;	LINE IN THE BUFFER.  SN CONTAINS THE SEQUENCE NUMBER OF THE LINE
;	CURRENTLY BEING HANDLED IN A COMMAND.
;	
;	WHEN THE PROGRAM DISCOVERS THAT SN IS GREATER THAN WRTLST IT
;	KNOWS THAT THE LINE BEING SOUGHT HAS ALREADY PASSED THROUGH
;	THE WORKING BUFFER AND IS NOT DIRECTLY ACCESSIBLE SINCE THERE
;	IS NO WAY TO READ A FILE BACKWARDS.  CONSEQUENTLY, IT IS NEC-
;	ESSARY TO CLOSE THE FILE AND THEN REOPEN IT.  THIS PROCESS OF
;	GOING AROUND FROM WHERE WE ARE, TO THE END OF THE FILE, TO
;	THE BEGINNING OF THE FILE AND FINALLY TO THE LINE BEING SOUGHT
;	IS DONE.
;	
;	TO CLOSE THE FILE IT IS NECESSARY TO PASS ALL REMAINING TEXT
;	THROUGH THE WORKING BUFFER AND TO THE TEMPORARY OUTPUT FILE
;	(CALLED ###LIN.TMP).  THIS IS DONE BY GIVING THE SUBROUTINE
;	FNDLIN (FIND A LINE WHOSE SEQUENCE NUMBER IS IN SN) THE 
;	HIGHEST POSSIBLE SEQUENCE NUMBER, 99999.  NEXT THE ORIGINAL 
;	FILE IS RENAMED TO ###TMP.TMP, THE TEMPORARY OUTPUT FILE
;	IS RENAMED TO THE ORIGINAL FILE NAME, AND THE ###TMP.TMP FILE
;	IS DELETED.  THEN WE GIVE FNDLIN THE SEQUENCE NUMBER CURRENTLY
;	BEING LOOKED FOR AND THE PROGRAM CONTINUES WITH THE ORIGINAL
;	COMMAND.
; AC DEFINITIONS

FF=0	; FLAGS
CH=1	; ASCII CHARACTER
SN=2	; SEQUENCE NUMBER
P=3	; PDL POINTER
TAC=4	; TEMPORARY AC'S
TAC1=5	;
LP=6	; ADDR OF CURRENT LINE
N1=7	; ARGS FOR COMMANDS
N2=10	;
NUM=11	; FOR NUMBER CONVERSION
AC1=12	; SCRATCH
AC2=13	;    "
AC3=14	;    "
AC4=15	;    "
OC=16	;
PS=17	;PREVIOUS SEQUENCE NUMBER

; MORE DEFINITIONS
	ALTMOD==33	;DEFINITION OF AN ALTMODE
	ETTY==0
	EICHL==1	;EDIT DEVICE CHANNELS
	EOCHL==2
	EMDE==10	;EDIT DEVICE MODE
	CCLC==3		;CCL DSK CHANNEL
	PJOB==30	;CALLI ARGUMENTS
	TMPCOR==44
	RESET==0
	EXIT==12

;RH FLAGS (SET AND CLEARED DURING CMD EXECUTION)
	NARG==1		;1=TWO ARGS SEEN
	ER==2		;TRYING AGAIN ON ERROR
	TFLG==10	;AN EXISTING LINE HAS BEEN REPLACED ONCE ALREADY
	DARG==20	;USED IN DCOM
	FILFLG==40	;
	IFLG==100	;INSERTION CMD IN PROGRESS
	ILRFLG==200	;INSERT LINE FOUND
	ILSFLG==400	;INSERT SKIPS EXISTING LINE
	EOL==1000	;END-OF-LINE SEEN

;LH FLAGS (CLEARED ONLY BY E COMMAND)
	FILACT==1	;DENOTES ACTIVE FILE
	NFILE==2	;0=NEW FILE ONLY
	ROUND==4	;=1 IF IN THE PROCESS OF GOING AROUND TO THE
			;BEGINNING OF THE FILE
	NDFIL==10	;END OF INPUT FILE OR NO INPUT FILE IF =0
	CCLF==100	;=1 IF ENTERED VIA CCL
;  INITIALIZATION

START:
IFN CCLSW,<
	TLZA	FF,CCLF
	TLO	FF,CCLF
	>
CSETUP:
IFN PURE,<
	MOVSI	TAC,ENDP	;IF REENTRANT, SET FIRST
	HLLM	TAC,.JBSA##		;FREE LOC. IN LOW SEG.
	>
	CALLI	RESET		;INITIALIZE 
	MOVE	TAC,.JBFF##	;ASSIGN CORE FOR DATA
	ADDI	TAC,2000
	CALLI	TAC,11
	JRST	NOCORE
	SETZM	DATA		;CLR DATA SEGMENT
	MOVE	TAC,[XWD DATA,DATA+1]
	BLT	TAC,ENDP-1
	MOVE	TAC,[JRST ERROR2]	;INIT DATA SEG. CONSTANTS
	MOVEM	TAC,ERROR1
	MOVE	TAC,[MOVEI TAC,DOFIL1]
	MOVEM	TAC,FILL1
	MOVE	TAC,[HRRZI TAC,DOFIL2]
	MOVEM	TAC,FILL2
	MOVE	TAC,[MOVE AC1,(AC2)]
	MOVEM	TAC,MOV1
	MOVE	TAC,[MOVEM AC1,(AC2)]
	MOVEM	TAC,MOV2
	MOVE	TAC,[MOVEM AC3,(AC2)]
	MOVEM	TAC,M2
	MOVE	TAC,[MOVE AC4,(AC2)]
	MOVEM	TAC,M1
	MOVE	TAC,[HRLI AC1,(LP)]
	MOVEM	TAC,DCM1
	MOVE	TAC,[SKIPE AC1,(TAC)]
	MOVEM	TAC,LNCNT1
	MOVE	TAC,[BLT AC1,(TAC)]
	MOVEM	TAC,OUTLN1
IFN CCLSW,<
	MOVE	TAC,[JRST CCLHR2]
	MOVEM	TAC,CCLHR3
IFN TEMP,<
	MOVSI	TAC,SIXBIT/   EDT/
	MOVEM	TAC,TMPFIL
	MOVSI	TAC,777600	;XWD -200,0
	MOVEM	TAC,TMPFIL+1
	>>
	MOVEI	TAC,SIXBIT/   TMP/
	HRRZM	TAC,ZDIRC
	HRLZM	TAC,ZDIRC+1
	HRLZM	TAC,ODIRC+1
IFN CCLSW,<
	HRLZM	TAC,CCLDIR+1
	MOVEI	TAC,SIXBIT/   EDT/
	HRRZM	TAC,CCLDIR
	>
	MOVEI	TAC,SIXBIT/   LIN/
	HRRZM	TAC,ODIRC
	MOVEI	TAC,SIXBIT/   BAK/
	HRLZM	TAC,ZILCH+1
	MOVEI	TAC,3		;GET PPN AND STORE IN DIRECTORYS
	CALLI	AC1,PJOB
CCLHR1:	IDIVI	AC1,12
	ADDI	AC2,"0"-40
	LSHC	AC2,-6
	SOJG	TAC,CCLHR1
IFN CCLSW,<
	HLLM	AC3,CCLDIR
	>
	HLLM	AC3,ODIRC
	HLLM	AC3,ZDIRC
	HRRI	COMCLR
	HRRM	.JBREN##	;SET UP ALTERNATE ENTRY POINT
	TRZ	FF,ER
CSET9:	INIT	ETTY,0
	SIXBIT	/TTY/
	XWD	TYOBF,TYIBF
	JRST	NOTTY
TIBUF:	INBUF	ETTY,1
TOBUF:	OUTBUF	ETTY,1
	MOVE	TAC,.JBFF
	MOVEM	TAC,SVJBFF
	SETZM	SN
IFN CCLSW,<
	AND	FF,[XWD CCLF,0]
	TLNE 	FF,CCLF
	JSR	CCLHRE
	>

COMCLR:	MOVE	P,[XWD -PDSIZ1,PDL-1]	;CLEAR PDL LIST

COMRET:	PUSH	P,.		; FOR RETURN (NEVER "JRST" HERE)
	TRZ	FF,777777	;CLEAR FLAGS
IFN CCLSW,<
	TLNN	FF,CCLF
	>
	PUSHJ	P,ASKOUT

;NOW FALL INTO DISPATCH ROUTINE
; DISPATCH ROUTINE

COMRT1:	PUSHJ	P,GETCH1
	CAIN	CH,15
	JRST	GETCHR
	CAIE	CH,"S"
	CAIN	CH,"E"
	JRST	ARWCOM
	TLNN	FF,FILACT	;ACTIVE FILE ?
	JSR	NFO,ERROR	;NO
	CAIN	CH,ALTMOD	;CHECK FOR ALTMODE
	JRST	SPLPRT		;ALMODE SEEN
	MOVE	AC4,CH
	PUSHJ	P,GETARG
	CAIN	AC4,"I"
	JRST	ICOM
	CAIN	AC4,"D"
	JRST	DCOM
	CAIN	AC4,"P"
	JRST	PCOM
	JSR	ILC,ERROR

SPLPRT:	AOJG	SN,PDCOM	;PRINT THE NEXT LINE
	JRST	COMCLR		;ZERO SN

;TELETYPE INITIALIZATION ERROR

NOTTY:	TRON	FF,ER		;TRIED TWICE?
	JRST	CSET9		;NO, TRY AGAIN
	TTCALL	3,EMTTY		;YES, DIAGNOSTIC
	CALLI	EXIT		;NO TTY IS FATAL

EMTTY:	ASCIZ	/
?CANNOT INIT TTY/
; ROUTINE TO PICK UP ARGS FROM COMMAND
;  RETURNED IN N1,N2 (N2=0 FOR 1 ARG)
;  SPACES IGNORED

GETARG:	SETZB	N2,NUM
	MOVEI	TAC,5		; COUNT
GTARG2:	PUSHJ	P,GETCHR	; GET INPUT CHAR.
	CAIG	CH,"9"		; NUMBER?
	CAIGE	CH,"0"
	JRST	GTARG3		; NO
	PUSHJ	P,NCHCON	; YES - CONVERT
	SOJGE	TAC,GTARG2	; AGAIN
	JSR	ILC,ERROR	; NO
GTARG3:	CAIN	CH,40		; SPACE?
	JRST	GTARG2		; YES
	CAIE	CH,"."
	JRST	.+3
	MOVE	NUM,SN
	PUSHJ	P,GETCHR
	TRNE	FF,NARG		; 2ND TIME?
	SKIPA	N2,NUM		; YES
	MOVE	N1,NUM		; NO
	CAIN	CH,15		; CR
	JRST	GETCHR		; YES - DISCARD LF+RETURN
	CAIN	CH,ALTMOD	;CHECK FOR ALTMODE
	POPJ	P,
	CAIN	CH,","		; TWO ARGS?
	TROE	FF,NARG		; YES - ALLOWABLE?
	JSR	ILC,ERROR	; NO OR BAD CHAR
	JRST	GETARG		; YES

CON033:	MOVEI	CH,33		;MAKE IT STANDARD
	POPJ	P,		;RETURN
; INSERT COMMAND

; (N1=SN WANTED)
; (N2=STEP SIZE)

ICOM:	SKIPE	N2		;NEW STEP SIZE?
	MOVEM	N2,STPSIZ	;YES
	SKIPN	SN,N1		;GET SEQ# IF SPECIFIED
	PUSHJ	P,SET10		;ASSUME SN OF 10 IF NONE SPECIFIED
	PUSHJ	P,LPSET		;SET LINE PTR & PREV. SEQ#
ICOM1:	MOVEI	TAC1,AC4	; GET ASCII SEQ.#
	PUSHJ	P,RDXA		; CONVERT TO ASCII
	PUSHJ	P,FNDLIN	; FIND LOCATION OF LINE
	JRST	ICOM2		; NOT FOUND
	TRO	FF,ILRFLG	;SET REPLACEMENT FLAG
	TRO	FF,TFLG		;SET "EXISTING" FLAG
ICOM2:	TRON	FF,IFLG
	JRST	.+3
	CAME	PS,AC3
	TRO	FF,ILSFLG	;INSERT HAS SKIPPED A LINE
	AOS	TYOBF1
	MOVEM	AC4,@TYOBF1	; SEQ # TO TYO BUFFER
	MOVEI	CH,42		;TYPE " IF SKIPPING A LINE
	TRZE	FF,ILSFLG
	PUSHJ	P,PUTCHR
	MOVEI	CH,"'"		;TYPE ' IF REPLACING A LINE
	TRZE	FF,ILRFLG
	PUSHJ	P,PUTCHR
	MOVEI	CH,11		; TAB
	PUSHJ	P,P1CHR		; OUTPUT BUFFER
	PUSHJ	P,TYGTLN	; READ IN LINE
	JRST	IFIX		;SPECIAL HANDLING FOR .
	CAILE	SN,^D99999	;GOING OVER LINE 99999?
	JSR	WRP,ERROR	;YES
	CAMLE	SN,SEQLST	;UPDATE SEQLST ?
	MOVEM 	SN,SEQLST	;YES
	TRZE	FF,TFLG		;GOOD RETURN
	PUSHJ	P,DCOM2		; DELETE EXISTING LINE
	AOS	TAC,AC3		; NEW WD COUNT (+1 FOR HEADER)
	CAMLE	TAC,FREWDS	; ROOM?
	PUSHJ	P,ICOM3		; NO
	HRRM	LP,MOV1
	HRRZ	AC1,LP
	ADD	AC1,AC3
	HRRM	AC1,MOV2
	HRRZ	AC2,PNTR
	SUBI	AC2,(LP)
DOMOV1:	XCT	MOV1		;MOVE AC1,(AC2)
DOMOV2:	XCT	MOV2		;MOVEM AC1,(AC2)
	SOJGE	AC2,DOMOV1
	ADDM	AC3,PNTR
	MOVN	TAC,AC3		; UPDATE POINTERS
	ADDM	TAC,FREWDS	; NEW FREE WD NUMBER
	HRL	AC3,SN		;HEADER WORD
	MOVSI	AC4,44000	;TAB
	MOVSI	AC2,(TAC)	;COUNT
	HRRM	LP,M2		;"TO"
	HRRZ	TAC1,TYIBF1	;"FROM"
	HRRM	TAC1,M1
	JRST	DOM2
DOM1:	XCT	M1		;MOVE AC4,(AC2)
	LSHC	AC3,^D28	;4 CHARS
	LSH	AC3,1		;CLEAR BIT 35
DOM2:	XCT	M2		;MOVEM AC3,(AC2)
	LSHC	AC3,^D7
	SOSL	@TYIBF1		;CHECK "REAL" COUNT
	AOBJN	AC2,DOM1
	AOBJN	AC2,DOM1+1	;(IF LAST WORD HAS FIVE CHARS)
	MOVE	AC3,SN		;SAVE PREVIOUS SN
	ADD	SN,STPSIZ	; NEXT LINE
	MOVE	N1,SN		;FOR RDXA
	JRST	ICOM1
ICOM3:	PUSHJ	P,FNLN2A	;OUTPUT AND DELETE
	JRST	FNDLIN		;FIND LOC AGAIN

IFIX:	CAME	N2,SN		;ALLOWS FOR POSSIBILITY OF GIVING AN I
				;COMMAND BUT NOT GIVING ANY DATA
	SUB	SN,STPSIZ
	JRST	CARRET

; SET UP FOR LINE 00010

SET10:	MOVEI	SN,12		;SEQUENCE # = 10
	MOVEI	N1,12		;SAVE COPY FOR FIRST LINE # TYPEOUT
	MOVEI	AC4,"10"
	POPJ	P,
; ROUTINE TO DELETE A LINE (OR LINES)
; FROM TEXT BUFFER
;	N1    ADR  OF FIRST LINE TO DELETE
;	N2    ADR  OF LAST LINE TO DELETE

DCOM:	SKIPE	AC4,N2		;TEST AND SAVE
	CAMGE	N1,N2		;LEGAL ?
	SKIPN	SN,N1		;YES,SET FOR FNDLIN
	JSR	ILC,ERROR
	PUSHJ	P,LPSET		;SET UP LP AND PS
	PUSHJ	P,FNDLIN	;SEARCH (PS CONTAINS SN OF PREVIOUS LINE UPON RETURN)
	JSR	NLN,ERROR
	JUMPE	AC4,DCOM5
	MOVE	SN,AC4
	MOVE	AC4,LP
	HRL	AC4,PS		;SAVE SN OF PREVIOUS LINE
	PUSHJ	P,FDL1A		;FIND 2ND LINE(WON'T ADVANCE PAGE)
	SKIPA			;NOT FOUND
	JRST	DCOM1		;FOUND
	CAMLE	SN,SEQLST	;IN BUFFER?
	JRST	DCOM3		;NO DELETE ALL REST OF BUFFER
	SETZ	TAC,		;YES TEMOVE EXTRANEOUS
;NOW FALL INTO DCOM1
; BASIC ROUTINE TO REMOVE A LINE FROM
; TEXT BUFFER
;  GIVEN:  ADR OF LINE TO REMOVE
;	; # WORDS TO CLEAR
;	C(TAC)=WORD COUNT
;	C(LP)=ADR OF LINE

;AC1 CONTAINS SN OF LINE BEING DELETED

DCOM1:	CAMN	SN,SEQLST
	HLRM	AC4,SEQLST
	ADDI	TAC,(LP)
	SUBI	TAC,(AC4)
	MOVEI	LP,(AC4)
DCOM2:	HRRM	TAC,DCM1	; FROM=TO+WD COUNT
DODCM1:	XCT	DCM1		;HRLI AC1,(LP)
	HRR	AC1,LP		; TO
	HRRZ	AC2,PNTR
	SUBI	AC2,(TAC)	; LAST DEST 
	BLT	AC1,(AC2)	; MOVE
	HRRM	AC2,PNTR
	ADDM	TAC,FREWDS
	POPJ	P,		;RETURN
DCOM3:	HLRM	AC4,SEQLST
	HRRZ	AC1,PNTR	;REST. FIRST FREE
	SUBI	AC1,(AC4)
	HRRM	AC4,PNTR
	SETZM	(AC4)
	ADDM	AC1,FREWDS
DCOM4:	CAMGE	SN,NUM
	JRST	FNLN1A
	PUSHJ	P,MVLIN1
	TLNE	FF,NDFIL
	PUSHJ	P,GETLIN	;LOOK FOR LINE WE WANT
	POPJ 	P,		;NO MORE
	JRST	DCOM4

DCOM5:	CAMN	SN,SEQLST	;LAST SN OF BUFFER ?
	MOVEM	PS,SEQLST
	JRST	DCOM2

; ROUTINE TO PRINT LINES
; WILL ONLY PRINT ONE LINE AT A TIME

PCOM:	SKIPN	SN,N1
	MOVEI	SN,12		;ASSUME 10 IF NONE SPECIFIED
	SKIPN	AC4,N2
	JRST	PCOM11
	CAMLE	N1,N2
	JSR	ILC,ERROR
PCOM11:	PUSHJ	P,LPSET
	PUSHJ	P,FNDLIN	;FIND IT
	JRST	PCOM2		;NOT FOUND
PCOM1:	PUSHJ	P,FNDLIN
	MOVE	SN,AC1
	HLRZ	A,(LP)		;GET SEQ NUM
	JUMPE	A,ENDTTY
	JUMPE	AC4,PCOMC1	;DON'T CHK FOR SINGLE LINES
	CAILE	A,(AC4)		;DON'T TYPE BEYOND (N2)
	JRST	ENDTTY
PCOMC1:	MOVEI	TAC,5
	CAML	TAC,TYOBF2
	PUSHJ	P,ENDTTY	;OUTPUT BUFFER
	MOVE	TAC1,TYOBF1
	PUSHJ	P,RDX1		;CONVERT & OUTPUT
	MOVEM	TAC1,TYOBF1	;FIX UP HDR POINTER
	MOVNI	TAC,5
	ADDM	TAC,TYOBF2
	HRRI	TAC1,1(LP)
	HRLI	TAC1,440700	;FORM BP
	ILDB	CH,TAC1
	PUSHJ	P,PUTCHR
	CAIG	CH,14
	CAIG	CH,11
	JRST	.-4
	CAML	SN,AC4
	JRST	ENDTTY
	AOJA	SN,PCOM1

PDCOM:	SETZI	AC4,
	TLNN	FF,NFILE	;CREATING?
	CAILE	SN,1		;AND NOTHING IN YET?
	JRST	PCOM1		;NO, PROCEED
	JRST	CARRET		;YES, NOTHING TO DO

PCOM2:	HLRZ	SN,(LP)		;START AT NEXT LINE ABOVE (N1)
	JUMPN	SN,PCOM1	;THERE ISN'T ANY
	JSR	NLN,ERROR
; BUFFER STRUCTURE
; TEXT IS STORED LINE BY LINE IN A SEQUENTIAL MANNER
; THE CONTENTS OF THE FIRST WORD OF LINE ARE AS FOLLOWS:
;   C(LH)= SEQUENCE NUM (BIN)
;   C(RH)= NUMBER OF WORDS
;     IN LINE (INCLUDING HDR WORD)
;		C(HEADER)=0 INDICATES END OF BUFFER

; LINE SEARCH ROUTINE
; GIVEN
;    ADR OF BEG. OF SEARCH IN LP
;    SEQ.NUMBER SOUGHT IN SN

; RETURN
;    A) FOUND: VIA A JRST CPOPJ1
;        LP CONTAINS ADR OF LINE
;        TAC CONTAINS WORD COUNT OF LINE
;        SN CONTAINS SEQ. NUM.

;    B) NOT FOUND - VIA A POPJ,
;       AS ABOVE EXCEPT LP CONTAINS  ADR OF THE FIRST LINE WITH
;       A SEQUENCE NUMBER HIGHER  THAN THE ONE SOUGHT

; A GENERAL ROUTINE TO 
; FIND A LINE AT ITS APPROXIMATE LOCATION
; UPON RETURN:
;	LP CONTAINS LOCATION
;	TAC CONTAINS WORD COUNT

; CALLED WITH SEQ. NUM. IN SN

FDL1A:	TRO	FF,FILFLG
FNDLIN:	PUSHJ	P,QKCHEK	;CHECK LIMITS
	TLNN	FF,NDFIL	;VIRGIN FILE ??
	JRST	LNSRCH		;FIND EXACT LOC.
				;AND RETURN
FNDLN1:	PUSHJ	P,GETLIN	;GET WD COUNT
	JRST 	LNSRCH
FNLN1A:	CAMLE	TAC,FREWDS	;ROOM?
	PUSHJ	P,FNDLN2	;NO - OUTPUT
FNDLNA:	HRL	AC1,TAC1	;FROM
	HRR	AC1,PNTR
	PUSHJ	P,MOVLIN	;MOVE IT
	HRRM	TAC1,PNTR
	SETZM	(TAC1)
	MOVN	AC1,TAC
	ADDM	AC1,FREWDS
	MOVEM	NUM,SEQLST
	CAMG	SN,NUM		;THE ONE WE WANT?
	JRST	LSCHLP		;YES
	JRST	FNDLN1		;NO
; HERE WE OUTPUT AN ARBITRARY # OF
; LINES & THEN DELETE THEM

FNDLN2:	TRZE	FF,FILFLG
	JRST	TPOPJ
FNLN2A:	SETZI	AC2,		;ZERO AC2
	PUSH	P,TAC1		;SAVE COUNT
	PUSH	P,TAC		;SAVE ADR
	HLRZ	TAC1,PNTR
FNDLN3:	PUSHJ	P,OUTLIN
	ADD	AC2,TAC
	ADD	TAC1,TAC
	CAML	AC2,(P)		;BIG ENOUGH HOLE ?
	CAMGE	AC2,OUTWRD	;OUTPUT ENOUGH?
	JRST	FNDLN3		;NO
	MOVE	TAC,AC2		;YES - FOR DCOM
	HLRZ	LP,PNTR
	PUSHJ	P,DCOM2		;DELETE OUTPUT
	POP	P,TAC
TPOPJ:	POP	P,TAC1
	POPJ	P,

;	LP - ADR OF LINE
;	SN - NUMBER WANTED
; C(RH)	TAC - WD COUNT
;	AC1 - SCRATCH - CONTAINS NEW SEQ.# ON RETURN

LSCHLP:	PUSHJ	P,LPSET
LNSRCH:	SKIPN	TAC,(LP)	;GET & CHECK
	POPJ	P,		;"VIRGIN" FILE RETURN
	HLRZ	AC1,TAC		;SEQ.#
	CAMN	SN,AC1		;CHECK IT
	AOSA	(P)		;FOUND
	CAMG	SN,AC1
	JRST	CLRTAC
	ADDI	LP,(TAC)	;UPDATE
	HRRZ	PS,AC1
	JRST	LNSRCH		;AROUND AGAIN
CLRTAC:	HRRZS	TAC
	POPJ	P,
; QUICK CHECK ROUTINE TO DETERMINE WHETHER A LINE WITH SN
;	 LIES WITHIN THE BUFFER.

;	POPJ	P,		;PAST END
;	JRST	CPOPJ1		;O.K.
; ALSO AN EXIT FOR BEFORE BUFFER
; CALL WITH SN SET

QKCHEK:	CAMG	SN,WRTLST	;LAST WRITTEN
	PUSHJ	P,GORND
	CAMG	SN,SEQLST	;PAST END
CPOPJ1:	AOS	(P)		;O.K.
CPOPJ:	POPJ	P,		;RETURN

; SET LINE POINTER & PREVIOUS SEQUENCE #

LPSET:	MOVE	PS,SEQLST	;INIT PREV SEQ# = HIGHEST IN CURRENT BUFFER
	HLRZ	LP,PNTR		;INIT CUR LINE PTR = FIRST FREE LOC IN BUFR
	POPJ	P,


GORND:	TRNN	FF,FILFLG
	JRST	.+3
	POP	P,CH
	JRST	CPOPJ
	PUSH	P,SN
	PUSH	P,AC4
	MOVEM	P,PSAVE
	TLO	FF,ROUND
	PUSHJ	P,CLOSE0
GORND1:	MOVE	P,PSAVE
	MOVEI	CH,015
	PUSHJ	P,ARWOLD
	TLZ	FF,ROUND
	PUSHJ	P,LPSET
	POP	P,AC4
	POP	P,SN
	POPJ	P,
; TELETYPE I/O ROUTINES

; BASIC TTY INPUT
; (NON-CCL VERSION)
; ENTER AT GETCHR TO READ CHARS FROM NORMAL LINES
; ENTER AT GETCH1 TO READ A CHAR FROM AN UNTERMINATED LINE

IFE CCLSW,<
GETCHR:	SOSGE	TYIBF2		;INPUT WHEN BUF CTR GOES .LT. 0
GETCH1:	INPUT	ETTY,0
	ILDB	CH,TYIBF1	;GET A 7-BIT CHAR FROM BUF
	JUMPE	CH,GETCHR	;IGNORE NULL CHARS
	POPJ	P,
	>

; BASIC TTY INPUT
; (CCL VERSION)
; ENTER AT GETCHR TO READ CHARS FROM NORMAL LINES
; ENTER AT GETCH1 TO READ A CHAR FROM AN UNTERMINED LINE

IFN CCLSW,<
GETCHR:	TLNE	FF,CCLF		;NORMAL OR CCL MODE?
	JRST	CCLCHR		;READ CCLBF
	JRST	TTYCHR		;READ TYIBF

GETCH1:	TLNE	FF,CCLF
	JRST	CCLCHR
	JRST	TTYCH1		;READ CHAR FROM UNFINISHED LINE

; READ TYIBF

TTYCHR:	SOSGE	TYIBF2		;INPUT WHEN BUF CTR GOES .LT. 0
TTYCH1:	INPUT	ETTY,
	ILDB	CH,TYIBF1	;GET 7-BIT CHAR FROM BUF
	JUMPE	CH,TTYCHR	;IGNORE NULL CHARS
	CAIN	CH,032		;IGNORE ^Z
	JRST	TTYCHR
TTYCH2:	CAIE	CH,176		;CHANGE OLD ALTMODES TO NEW FORM
	CAIN	CH,175
	MOVEI	CH,033
	CAIL	CH,140		;CONVERT LOWER CASE TO UPPER
	TRZ	CH,040
	POPJ	P,
; READ CCLBF

CCLCHR:	SOSGE	CCLBF2		;INPUT WHEN BUF CTR GOES .LT. 0
CCLCH1:	PUSHJ	P,[IFN TEMP,<
		SKIPE TMPFLG	;IS TMPCOR UUO IN PROGRESS?
		CALLI 12	;YES, EXIT
		>
		IN CCLC,	;INPUT ON CCL CHANNEL
		POPJ P,		;NORMAL RET
		JSR CCL,ERROR]	;ERROR RET
	ILDB	CH,CCLBF1	;GET 7-BIT CHAR FROM BUF
	JUMPE	CH,CCLCHR	;IGNORE  NULL CHARS
	CAIN	CH,032		;IGNORE ^Z
	JRST	CCLCHR
	JRST	TTYCH2		;FINISH CLEAN-UP AND RETURN
	>


; READ LINE ON TTY & CHECK TERMINATING CHARACTER
; CALL:	PUSHJ P,TYGTLN
;	ALTMODE RETURN
;	NORMAL RETURN

TYGTLN:	INPUT	ETTY,0		;GET LINE
	TRZ	FF,EOL		;CLR EOL FLAG
	MOVE    AC1,TYIBF1	;AIM BYTE PTR AT LINE HEADER
	ADD	AC1,(AC1)	;ADD WORD CT FOR THE LINE
	SOS	AC1		;ADJUST PTR TO LAST WORD OF THE LINE
TYG1:	ILDB	CH,AC1		;GET A 7-BIT CHAR FROM LAST WORD
	CAIN	CH,33
	POPJ	P,
	CAIE	CH,175		;IF ALTMODE, SET TO 033 & RET VIA POPJ
	CAIN	CH,176
	JRST	CON033
	CAIG	CH,14		;EOL SEEN?
	CAIG	CH,11
	SKIPA			;NOT YET
	TRO	FF,EOL		;YES
	TLNE	AC1,700000	;WATCH FOR END OF WORD
	JRST	TYG1		;NOT YET, TRY NEXT CHAR
	TRZN	FF,EOL		;END-OF-LINE SEEN?
	JSR	LTL,ERROR	;NO, LINE TOO LONG
	MOVE	AC3,@TYIBF1	;GET WD COUNT FOR THE LINE
	CAIG	CH,14
	CAIG	CH,11
	JRST	CPOPJ1		;INCREMENT RET PTR & POPJ
	AOJA	AC3,CPOPJ1	;EXCEPT IF LAST CHAR IS LF, VT, FF ALSO INCR WD CT
; BASIC TTY OUTPUT

PUTCHR:	SOSG	TYOBF2		;OUTPUT WHEN BUF CTR GOES TO 0
PUTCH1:	OUTPUT	ETTY,0
	SKIPE	CH		;AVOID NULL OUTPUT
	IDPB	CH,TYOBF1	;STORE NEW 7-BIT CHAR IN BUF
	POPJ	P,

; SINGLE CHARACTER TTY OUTPUT

ASKOUT:	MOVEI	CH,"*"		;TYPE ASTERISK
P1CHR:	PUSHJ	P,PUTCHR	;SENT CH TO TYOBF
ENDTTY:	OUTPUT	ETTY,0		;FORCE OUTPUT
	POPJ	P,

; TTY MESSAGE OUTPUT
;CALL	PUSHJ	P,MESSAG
;	ASCIZ	/MESSAGE/
;	RETURN

MESSAG:	MOVSI	TAC,(POINT 7,0)	;INIT BYTE PTR WITHOUT ADDR
	HRR	TAC,(P)		;NOW THE ADDRESS
MESS2:	ILDB	CH,TAC		;GET CHAR.
	JUMPE	CH,MESSGO	;QUIT AT THE 0
	PUSHJ	P,PUTCHR	;PRINT
	JRST	MESS2		;GET NEXT
MESSGO:	AOS	TAC		;FIX UP PDL FOR PROPER RETURN
	HRRM	TAC,(P)
	POPJ	P,
ARWCOM:	TLZE	FF,FILACT
	JRST	CLOSE0
	SETZM	IFILNM
	SETZM	IFILXT
	PUSHJ	P,FILNAM
	SKIPN	IFILNM
	JSR	ILC,ERROR
	MOVE	TAC1,IFILNM
	MOVEM	TAC1,ZILCH
	CAIN	CH,"."
	PUSHJ	P,FILEXT
	TLZ	FF,NFILE!NDFIL
ARWOLD:	PUSHJ	P,SETUP
	CAIN	CH,ALTMOD
	JRST	INITO
TRZFFE:	TRZ	FF,ER
	HLRZ	TAC,IDIRC+1	;CHECK EXTENSION
	CAIN	TAC,(SIXBIT /BAK/)
	JSR	BAK,ERROR	;CAN'T EDIT .BAK FILE
	INIT	EICHL,EMDE
	SIXBIT	/DSK/
	EXP	EDIBF
	PUSHJ	P,UNA		;NO DISK???
	TLO	FF,NFILE!NDFIL
	LOOKUP	EICHL,IDIRC
	JSR	NCF,ERROR
	LDB	TAC,[POINT 9,IDIRC+2,8]	;GET PROTECTION OF INPUT FILE
	MOVEM	TAC,PROTEC
	INBUF	EICHL,2
INITO:	TRZ	FF,ER
	INIT	EOCHL,EMDE
	SIXBIT	/DSK/
	XWD	EDOBF,0
	PUSHJ	P,UNA		;NO DISK
	TLNN	FF,NFILE
	PUSHJ	P,[	LOOKUP EOCHL,IDIRC
			POPJ P,
			JSR FAU,ERROR]
	TRZ	FF,ER
	ENTER	EOCHL,ODIRC
	PUSHJ	P,UNA		;CANT ENTER???
EOBUF:	OUTBUF	EOCHL,2
	PUSHJ	P,EWRITE	;SET UP HEADER
	TLO	FF,FILACT
DOFIL1:	XCT	FILL1		;MOVEI TAC,.
	MOVEM	TAC,FREWDS
DOFIL2:	XCT	FILL2		;HRRZI TAC,.
	HRRZM	TAC,PNTR
	HRLS	PNTR
	SETZM	(TAC)
	MOVEI	TAC,12
	TLNN	FF,ROUND
	MOVEM	TAC,STPSIZ
	SETZM	WRTLST
	SETZM	SEQLST
	TLNE	FF,NFILE
	POPJ	P,
CARRET:	PUSHJ	P,MESSAG
	ASCIZ	/
/
	JRST	ENDTTY

;DISK INITIALIZATION OR ENTER ERROR

UNA:	TRON	FF,ER		;TRIED TWICE?
	JRST	UNA2		;NO
	PUSHJ	P,MESSAG	;YES, DIAGNOSTIC
	ASCIZ	/
?CANNOT ACCESS DISK/
	JRST	EREXIT		;FATAL CONDITION

;UUO ERROR RETRY ROUTINE
;ASSUMES TRZ FF,ER PRECEDES THE UUO
;IT SHOULD ANYWAY BECAUSE AN EARLIER
;UUO MAY SUCCEED ON THE SECOND TRY

UNA2:	MOVNI	TAC,3		;TO TRY AGAIN BACK UP RETURN POINTER
	ADDM	TAC,(P)
	SETZ	TAC1,
	MOVE	TAC,@(P)	;LOOK FOR THE TRZ FF,ER
	CAMN	TAC,TRZFFE	;IF NO, WE WERE ON AN INIT
	MOVEI	TAC1,2		;YES, WE WERE ON A LOOKUP OR RENAME
	SUBI	TAC1,1		;MOVE POINTER TO THE ACTUAL UUO
	ADDM	TAC1,(P)	;-1 IN CASE OF INIT, +1 IN CASE OF LOOKUP
	POPJ	P,
CLOSE0:	SKIPN	IFILNM
	JSR	ILC,ERROR
	MOVEI	SN,^D10		;FIND SOMETHING
	PUSHJ	P,LPSET
	MOVEI	SN,^D99999
	PUSHJ	P,FNDLIN
	HRRZ	TAC,FILL1
	PUSHJ	P,FNLN2A
CLOSE1:	RELEASE	EICHL,0
	RELEASE	EOCHL,0
	TRZ	FF,ER
	INIT	EICHL,0
	SIXBIT	/DSK/
	0
	PUSHJ	P,ERA1		;CANT
	LOOKUP	EICHL,IDIRC
	JRST	CLOSE2
	CLOSE	EICHL,0
	MOVE	TAC,PROTEC	;KEEP SAME PROT. ON TMP.TMP
	DPB	TAC,[POINT 9,ZDIRC+2,8]
	LDB	TAC,[POINT 23,IDIRC+2,35]
	DPB	TAC,[POINT 23,ZDIRC+2,35]	;SAVE CREATION DATE
	LDB	TAC,[POINT 3,IDIRC+1,20]	;GET HIGH PART OF DATE
	DPB	TAC,[POINT 3,ZDIRC+1,20]	;AND SAVE IT
	TRZ	FF,ER
	RENAME	EICHL,ZDIRC
	PUSHJ	P,ERA1		;CANT
CLOSE2:	TRZ	FF,ER
	INIT	EOCHL,0
	SIXBIT	/DSK/
	0
	PUSHJ	P,ERA2		;CANT
	TRZ	FF,ER
	LOOKUP	EOCHL,ODIRC
	PUSHJ	P,ERA2		;CANT
	CLOSE	EOCHL,0
	LDB	TAC,[POINT 9,ODIRC+2,8]	;STD PROT FOR NEW FOO IF CREATING
	TLNE	FF,NFILE	;SKIP IF CREATING
	MOVE	TAC,PROTEC	;NEW FOO GETS SAME PROTECTION AS OLD FOO
	DPB	TAC,[POINT 9,IDIRC+2,8]	; OR STANDARD IF NO INPUT FILE
	LDB	TAC,[POINT 23,ODIRC+2,35]
	DPB	TAC,[POINT 23,IDIRC+2,35]	;SAVE CREATION DATE
	LDB	TAC,[POINT 3,ODIRC+1,20]	;GET HIGH PART OF DATE
	DPB	TAC,[POINT 3,IDIRC+1,20]	;AND SAVE IT
	TRZ	FF,ER
	RENAME	EOCHL,IDIRC
	PUSHJ	P,ERA2		;CANT
	TRZ	FF,ER
	INIT	EICHL,0
	SIXBIT	/DSK/
	0
	PUSHJ	P,ERA3		;CANT
	LOOKUP	EICHL,ZILCH
	JRST	CLOSE3
	CLOSE	EICHL,0
	TRZ	FF,ER
	RENAME	EICHL,DELDIR	;THIS AVOIDS A RENAME ERROR WITH .BAK
	PUSHJ	P,ERA3		;CANT
CLOSE3:	TRZ	FF,ER
	INIT	EICHL,0
	SIXBIT	/DSK/
	0
	PUSHJ	P,ERA3		;CANT
	LOOKUP	EICHL,ZDIRC
	JRST	NOIFIL
	CLOSE	EICHL,0
	MOVE	TAC,PROTEC	;FOO.BAK GETS SAME PROTECTION AS FOO
	DPB	TAC,[POINT 9,ZILCH+2,8]
	LDB	TAC,[POINT 23,ZDIRC+2,35]
	DPB	TAC,[POINT 23,ZILCH+2,35]
	LDB	TAC,[POINT 3,ZDIRC+1,20]	;GET HIGH PART OF DATE
	DPB	TAC,[POINT 3,ZILCH+1,20]	;AND SAVE IT
	TRZ	FF,ER
	RENAME	EICHL,ZILCH
	PUSHJ	P,ERA3		;CANT
NOIFIL:	RELEASE	EICHL,0
	RELEASE	EOCHL,0
	TLNE	FF,ROUND
	JRST	GORND1
	SETZM	IFILNM
	SETZM	IFILXT
	JRST	COMCLR
;ERROR IN RENAME PROCESS

ERA1:	MOVE	AC1,[POINT 6,IDIRC]
	JRST	ERA4
ERA2:	MOVE	AC1,[POINT 6,ZDIRC]
ERA4:	MOVE	AC2,[POINT 6,ODIRC]
	JRST	ERA
ERA3:	MOVE	AC1,[POINT 6,ZDIRC]
	MOVE	AC2,[POINT 6,IDIRC]
ERA:	TRON	FF,ER		;TRIED TWICE?
	JRST	UNA2		;NO, TRY AGAIN
	PUSHJ	P,MESSAG	;YES, PRINT DIAGNOSTIC
	ASCIZ	/
?ERROR IN RENAME PROCESS.
INPUT FILE CLOSED WITH NAME /
	PUSHJ	P,MES61		;INPUT FILE NAME
	PUSHJ	P,MESSAG
	ASCIZ	/
OUTPUT FILE CLOSED WITH NAME /
	PUSHJ	P,MES62		;OUTPUT FILE NAME
	JRST	EREXIT

;6-BIT FILNAM.EXT PRINTOUT

MES62:	MOVE	AC1,AC2		;SWITCH TO OUTPUT FILE NAME POINTER
MES61:	MOVEI	TAC,11		;NAME CHAR. CTR
MES60:	ILDB	CH,AC1
	ADDI	CH,40		;CHANGE 6-BIT TO ASCII
	PUSHJ	P,PUTCHR
	CAIN	TAC,4
	PUSHJ	P,DOTOUT
	SOJN	TAC,MES60
	POPJ	P,
DOTOUT:	MOVEI	CH,"."
	JRST	PUTCHR
; A ROUTINE TO RETURN A DESCRIPTOR. RETURNS WITH
; FIRST NON LEGAL CHAR IN AC CH. NAME (IN SIXBIT) WILL
; BE IN AC TAC UPON RETURN.

FILNAM:	SKIPA	TAC1,[POINT 6,IFILNM]
FILEXT:	MOVE	TAC1,[POINT 6,IFILXT]
	JRST	SXNAM2
SXNAM1:	SUBI	CH,40
	TLNE	TAC1,770000	;FULL ?
	IDPB	CH,TAC1		;STASH
SXNAM2:	PUSHJ	P,GETCHR	;GET
	CAIN	CH," "		;SPACE ?
	JRST	.-2
	CAIL	CH,60
	CAILE	CH,"Z"
	POPJ	P,
	CAILE	CH,"9"
	CAIL	CH,101
	JRST	SXNAM1
	POPJ	P,

	
; ROUTINE TO MOVE LINE, FIX UP COUNT & POINTER (OF HEADER)
;    C(TAC1) = (FROM) TO
;    C(TAC)   = WD COUNT

MOVLIN:	MOVE	TAC1,TAC
	ADDI	TAC1,(AC1)
	BLT	AC1,-1(TAC1)
MVLIN1:	MOVN	N1,TAC
	ADDM	N1,EDIBF2
	ADDM	TAC,EDIBF1
	POPJ	P,

;GETLIN ROUTINE

GETLIN:	HRRZ	TAC1,EDIBF1
	SKIPLE	N1,EDIBF2
	SKIPN	(TAC1)
	JRST	EDREAD
LNCNT:	MOVEI	TAC,1
	HRRM	TAC1,LNCNT1
DOLNCT:	XCT	LNCNT1		;SKIPE AC1,(TAC)
	TRNE	AC1,1
	JRST	.+2
	AOJA	TAC,.-3
	CAMLE	TAC,N1
	MOVE	TAC,N1
	PUSHJ	P,NUMCON
	HRRM	TAC,(TAC1)
	JRST	CPOPJ1

EDREAD:	INPUT	EICHL,0
	AOS	EDIBF1
	STATO	EICHL,760000
	JRST	GETLIN
	STATZ	EICHL,20000
	JRST	EOF
	TLZ	FF,FILACT
	JRST	INERR		;INPUT ERROR
EOF:	TLZ	FF,NDFIL
	POPJ	P,		;"NO MORE" RETURN

INERR:	PUSHJ	P,MESSAG
	ASCIZ	/
?IN/
	JRST	PUTERR
OUTERR:	PUSHJ	P,MESSAG
	ASCIZ	/
?OUT/
PUTERR:	PUSHJ	P,MESSAG
	ASCIZ	/PUT ERROR.
INCOMPLETE OUTPUT FILE CLOSED WITH NAME /
	MOVE	AC1,[POINT 6,ODIRC]	;FILE NAME
	PUSHJ	P,MES61
EREXIT:	PUSHJ	P,ENDTTY	;QUIT & LET USER DECIDE WHAT TO DO
	RELEAS	EOCHL,0
	RELEAS	EICHL,0
	CALLI	EXIT
; OUTPUT
; GIVEN
; ADR OF LINE IN TAC1
; ACTION
; GET WORD COUNT
; CONVERT SEQ.# TO ASCII


OUTLIN:	SKIPN	(TAC1)		;END OF BUFFER
	JRST 	CLOSE1		;YES (END OF FILE)
	HRRZ	TAC, (TAC1)	; GET COUNT
	CAMLE	TAC,OC		; ROOM?
	PUSHJ	P,EWRITE	; NO
	SUB	OC,TAC		; UPDATE COUNT
	HLRZ	A,(TAC1)	; SEQ. NUM.
	MOVEM	A,WRTLST
	PUSHJ	P,RDX		; CONVERT SEQ #  TO ASCII
	HRL	AC1,TAC1	; FROM
	HRR	AC1,EDOBF1	; TO
	HRRM	AC1,OUTLN1	; END
	AOS	AC1
DOUTL1:	XCT	OUTLN1		;BLT AC1,(TAC)
	ADDM	TAC,EDOBF1	; NEW LCN
	POPJ	P,
EWRITE:	OUTPUT	EOCHL,0
	STATZ	EOCHL,740000
	JRST	OUTERR		;OUTPUT ERROR
	HRRZ	OC,EDOBF2
	POPJ	P,

; ASCII CHAR TO BIN NUMBER CONVERSION ROUTINE (NUMBER IS DECIMAL)
;	PUSHJ	P,NUMCON
; WHERE
;	CH - CONTAINS CHAR. TO BE CONV.
;	NUM - CONTAINS BIN NUM. UPON RETURN

NCHCON:	IMULI	NUM,12		; DECIMAL
	ADDI	NUM,-60(CH)
	POPJ	P,

; TO CONVERT 5 CHAR 7 BIT ASCII
; TO A BINARY NUMBER
NUMCON:	SETZI	NUM,
	HRLI	TAC1,440700
	ILDB	CH,TAC1
	PUSHJ	P,NCHCON
	TLNE	TAC1,700000	; FINISHED
	JRST	NUMCON+2	; NO
	HRLM	NUM, (TAC1)	; YES
	POPJ	P,		; RETURN
; SUBROUTINE TO INITIALIZE PROGRAM

SETUP:	MOVE	TAC1,SVJBFF
	MOVEM	TAC1,.JBFF
	MOVE	AC3,.JBREL##
	MOVEI	AC2,407*2
	ADD	TAC1,AC2
	HRRM	TAC1,FILL2	;FIRST FREE LOC
	SUB	AC3,TAC1
	HRRM	AC3,FILL1	;# FREE WORDS
	IDIVI	AC3,^D10
	MOVEM	AC3,OUTWRD
IFE CCLSW,<
	POPJ	P,
	>
IFN CCLSW,<
	TLNE	FF,ROUND
	POPJ	P,
	TLZN	FF,CCLF
	POPJ	P,
	SETZM	CCLDIR
IFN TEMP,<
	SKIPE	TMPFLG		;IS A TMPCOR UUO IN PROGRESS
	POPJ	P,		;YES, DON'T TRY A RENAME
	>
	RENAME	CCLC,CCLDIR
	JSR	CCL,ERROR
	POPJ	P,

CCLHR2:
IFN TEMP,<
	HRRZ	TAC,.JBFF	;READ DATA INTO A BUFFER AT .JBFF
	HRRM	TAC,TMPFIL+1	;STORE IN TMPCOR READ BLOCK
	HRLI	TAC,440700	;DUMMY UP BYTE POINTER
	MOVEM	TAC,CCLBF1	;IN BUFFER HEADER
	SOS	TMPFIL+1	;GET PROPER IOWD FORMAT
	MOVE	TAC,[XWD 2,TMPFIL]
	CALLI	TAC,TMPCOR	;READ AND DELETE EDT FILE FROM CORE
	JRST	TMPEND		;FILE NOT FOUND, TRY DISK
	ADD	TAC,.JBFF	;CALCULATE END OF BUFFER
	MOVEM	TAC,SVJBFF	;SAVE NEW .JBFF
	SUB	TAC,.JBFF
	IMULI	TAC,5		;CALCULATE CHARACTER COUNT
	MOVEM	TAC,CCLBF2	;FINISH DUMMYING HEADER
	SETOM	TMPFLG		;MARK THAT A TMPCOR UUO WAS USED
	JRST	@CCLHRE		;RETURN

TMPEND:	>
	INIT	CCLC,0
	SIXBIT/DSK/
	XWD	0,CCLBF
	JSR	CCL,ERROR
	SETZM	CCLDIR+3
	LOOKUP	CCLC,CCLDIR
	JSR	CCL,ERROR
	MOVE	TAC,.JBFF
	MOVEM	TAC,SVJBFF
	INBUF	CCLC,1
	JRST	@CCLHRE
	>
; BIN TO BCD CONVERSION ROUTINE
; ADAPTED FROM ANY RADIX PRINT IN MANUAL F-64PX  (8/64)

; A CALL TO THIS ROUTINE WILL CONVERT A BINARY SEQ. 
; NUMBER TO A  5 CHAR ASCII WORD WITH HEADING ZEROS

; CALL
;	PUSHJ	P,RDX
; WHERE TAC1 CONTAINS ADR FOR RESULT
; A CONTAINS BINARY # TO BE CONVERTED

A=N1
A1=A+1

RDX:	SETOM	(TAC1)		; SET SN BIT
RDXA:	HRLI	TAC1,440700	; FORM POINTER
RDX1:	MOVEI	AC1,5		; 5 DIGITS
RADIX:	IDIVI	A,12		; RADIX IS DECIMAL
	HRLM	A1,(P)		; SAVE REMAINDER
	SOSE	AC1		; FINISHED
	PUSHJ	P,RADIX		; NO
	HLRZ	A,(P)
	ADDI	A,60		; FORM ASCII
	IDPB	A,TAC1		; DEPOSIT IN WORD
	POPJ	P,		; RETURN SOMEPLACE

; ERROR ROUTINE
; DECIPHERS ERROR # AND PRINTS  MESSAGE

ERROR2:	TLZ	FF,CCLF		;CLEAR CCL FLAG SO LOOPING DOES NOT OCCUR
	SOS	ERROR
	LDB	TAC,EPNT1	; GET ERR #
	MOVE	TAC,EMT(TAC)
ERROR4:	ILDB	CH,TAC		; GET CHAR
	JUMPE	CH,ERROR3
	PUSHJ	P,PUTCHR	; TO BUFFER
	JRST	ERROR4
ERROR3:	PUSHJ	P,ENDTTY	; OUTPUT WORD
	JRST	COMCLR		; NEXT COMMAND

EPNT1:	POINT	4,@ERROR,12

NOCORE:	TTCALL	3,NOCOR
	CALLI	EXIT

NOCOR:	ASCIZ	/
?NO CORE AVAILABLE FOR DATA SEGMENT/
;ERROR MESSAGE NUMBERS

NFO==0
ILC==1
NLN==2
CCL==3
NCF==4
FAU==5
WRP==6
LTL==7
BAK==10

;ERROR MESSAGE ADDRESS TABLE

EMT:	POINT	7,EMNFO
	POINT	7,EMILC
	POINT	7,EMNLN
	POINT	7,EMCCL
	POINT	7,EMNCF
	POINT	7,EMFAU
	POINT	7,EMWRP
	POINT	7,EMLTL
	POINT	7,EMBAK

;ERROR MESSAGES

EMNFO:	ASCIZ	/?FILE NOT SPECIFIED
/
EMILC:	ASCIZ	/?ILLEGAL COMMAND
/
EMNLN:	ASCIZ	/?LINE REFERENCED DOES NOT EXIST
/
EMCCL:	ASCIZ	/?SYSTEM ERROR READING COMMAND FILE
/
EMNCF:	ASCIZ	/?INPUT FILE NOT FOUND
/
EMFAU:	ASCIZ	/
?FILE NAME ALREADY IN USE
/
EMWRP:	ASCIZ	/?CANNOT INSERT ABOVE LINE 99999
/
EMLTL:	ASCIZ	/?LINE TOO LONG
/
EMBAK:	ASCIZ	/?CANNOT EDIT BACKUP FILE
/

	LIT
PATCH:
IFN PURE,<RELOC>

DATA:
; I/O DATA
; MACRO TO SET UP HEADERS ETC.

DEFINE AREA (A,N)
<SEQ (A,N,0123456789)
>
DEFINE SEQ (A,N,NUM,%K)
<%K=0
IRPC	NUM,
<IFG	N-%K,
<IFE	%K,
<	A:	BLOCK 1
>
IFN	%K,
<	A'NUM:	BLOCK 1
>>
%K=%K+1
>
>

AREA	(TYIBF,3)
AREA	(EDOBF,3)
AREA	(EDIBF,3)
REPEAT 0,<
AREA	(EDRCO,4)
AREA	(EDRCI,4)
>
AREA	(TYOBF,3)

; STORAGE

ERROR:	BLOCK	1		; FOR JSR AC,ADR
ERROR1:	BLOCK	1		;JRST ERROR2
FILL1:	BLOCK	1
FILL2:	BLOCK	2
MOV1:	BLOCK	1
MOV2:	BLOCK	1
M1:	BLOCK	1
M2:	BLOCK	1
DCM1:	BLOCK	1
LNCNT1:	BLOCK	1
OUTLN1:	BLOCK	1
IFN CCLSW,<
CCLHRE:	BLOCK 1
CCLHR3:	BLOCK	1
IFN TEMP,<
TMPFIL:	BLOCK 1		;SIXBIT /EDT/
	BLOCK	1		;XWD -200,0
TMPFLG:	BLOCK	1
	>>
PSAVE:	BLOCK	1
FREWDS:	BLOCK	1		; NUMBER OF FREE WDS
PNTR:	BLOCK	1		;LH-FIRST FREE
			;RH-ADDR OF LAST HEADER
WRTLST:	BLOCK	1		; SN LAST WRITTEN
STPSIZ:	BLOCK	1		; STEP SIZE FOR INSERT
SVJBFF:	BLOCK	1		; STORAGE
PROTEC:	BLOCK	1		;SAVE PROTECTION FOR OUTPUT FILE
OUTWRD:	BLOCK	1
SEQLST:	BLOCK	1		;LAST SN IN CURRENT PAGE BUFFER

IFILNM:
IDIRC:	BLOCK	1
IFILXT:	BLOCK	3

OFILNM:
ODIRC:	BLOCK	1		;SIXBIT	/###LIN/
	BLOCK	1		;SIXBIT	/TMP/
	BLOCK	2


PDSIZ=^D25
PDSIZ1=PDSIZ+1
PDL:	BLOCK	PDSIZ


IFN CCLSW,<
	AREA	(CCLBF,3)	


CCLDIR:	BLOCK	1		;SIXBIT/###EDT/
	BLOCK	1		;SIXBIT/TMP/
	BLOCK	2
	>
ZDIRC:	BLOCK	1		;SIXBIT	/###TMP/
	BLOCK	1		;SIXBIT	/TMP/
	BLOCK	2
ZILCH:	BLOCK	1
	BLOCK	1		;SIXBIT /BAK/
	BLOCK	2

DELDIR:	BLOCK	4

DSKST:	BLOCK	1000		;FORCE INTO 2K
ENDP: END START