;<TENEX-132>TENDMP.10X;6    10-AUG-73 13:11:20	EDIT BY CLEMENTS
;<TENEX-132>TENDMP.10X;5    10-AUG-73 13:03:12	EDIT BY CLEMENTS
;<TENEX-132>TENDMP.10X;4    19-JUL-73 18:27:37	EDIT BY CLEMENTS
;<TENEX-132>TENDMP.10X;3     7-JUL-73 18:37:15	EDIT BY CLEMENTS
TITLE TENDMP - FOR THE TENEX BOOTSTRAP PROCESS - R CLEMENTS 2 JUL 73
;"THESE BOOTS WERE MADE FOR WALKIN'." - N.S.

;AC'S

F=0	;FLAGS
A=1	;GENERAL AC'S
B=2	; ..
C=3	; ..
X=4	;MEMORY ADDRESS COUNTER
W=5	;WORD RETURNED BY RWORD OR SIXBRD
NAME=6	;NAME OF FILE BEING SEARCHED FOR
EXT=7	;EXTENSION OF FILE BEING SEARCHED FOR
Q=10	;COUNTER TO STEP THROUGH BUFFER OF 200 DATA WORDS
N=12	;NUMBER ASSEMBLER IN TYPEIN, COUNTER IN SEARCH,RDBLK,WRBLK
M=13	;MEMORY AOBJN POINTER FOR READING THE DATA TO CORE
FN=14	;FILE NUMBER, 1 TO NFILES
BP=15	;POINTER TO CURRENT DIR BYTE (ALSO SIXBIT INPUT)
LBN=16	;TAPE BLOCK NUMBER TO READ
P=17	;STACK POINTER

PDLL==20	;STACK LENGTH

OPDEF PJRST [JRST]

INTERN BGTEND,LWTEND,ENDTND,TENDMP
BGTEND:
PHASE 377000
LWTEND:

;I/O DEVICE PARAMETERS

DTC==320			;DEVICE CODE FOR DTA CONTROL
DTS==324			;DEVICE CODE FOR DTA STATUS
O.NOP==0			;OPCODES FOR THE DTA CONTROL CONO
O.SRCH==200			;SEARCH
O.READ==300			;READ
O.WRIT==700			;WRITE
C.STOP==400000			;CONO BITS
C.FWD==200000			;GO FORWARD
C.REV==100000			;GO REVERSE
C.NDEL==040000			;NO DELAY AFTER CONO
C.SEL==020000			;SELECT A UNIT
C.DSEL==010000			;DESELECT CURRENT UNIT
S.DAT==1			;DATA DONE FLAG
S.INT==2			;INT REQ FLAG
S.END==020000			;END ZONE HIT
S.JOBD==100000			;JOB DONE FLAG
S.ERR==653300			;ERRORS TO GIVE UP ON.

;FLAGS, LEFT HALF OF F

L.REV==400000			;TAPE MOVING IN REVERSE. SIGN BIT REQ?
L.REVA==40			;ALLOCATION PASS IS GOING IN REVERSE
L.TURN==100			;ALLOCATION PASS HAD TO TURN AROUND

;FLAGS, RIGHT HALF OF F

R.WEOF==2			;ON WHILE WRITING JRST WORD(S) IN LAST BLK
R.DIRI==4			;DIRECTORY IN CORE IS VALID

;SYSTEM PARAMETERS WHICH MUST AGREE WITH TIMESHARING SYSTEM

DIRBLK==144			;WHERE DIRECTORY IS ON TAPE
D.BYT==0			;WORD OF BYTES IN DIRECTORY
D.NAM==123			;FIRST NAME IN DIRECTORY
D.EXT==151			;START OF EXTENSIONS IN DIR
NFILES==26			;HOW MANY FILES FIT IN DIR
MAXBLK==1101			;LAST BLOCK ON THE TAPE
BLKFAC==2			;BLOCKING FACTOR - WRITE ONE OF N BLKS
;START HERE

TENDMP:	0			;CALLED BY JSR FROM SWPMON
GO:	MOVEI F,0		;CLEAR ALL FLAGS
	MOVE P,PDP		;INITIAL STACK POINTER
	PUSHJ P,RDDIR		;GET TAPE DIRECTORY
LOAD:	MOVSI FN,-NFILES	;SEARCH TO SEE IF ONLY ONE SAV FILE ON DT
	MOVEI A,0		;WHERE NAME WILL GO IF FOUND
RUN5:	HLRZ EXT,HBUF+D.EXT(FN)	;CHECK AN EXTENSION
	MOVE NAME,HBUF+D.NAM(FN) ;AND FILE NAME
	CAIN EXT,(SIXBIT /SWP/)	;IS IT THE .SWP FILE?
	CAME NAME,SYSTEM	;REAL NAME OF FILE ('TENEX')
RUN4:	AOBJN FN,RUN5		;LOOP THRU COUNTING ALL FILES
	MOVEI FN,1(FN)		;FROM AOBJN CTR TO FILE NUMBER
	MOVEI LBN,1		;HAVE TO FIND A BLOCK OF FILE
	MOVE BP,BYTPTR		;LOOK THRU DIRECTORY
RUNL:	ILDB N,BP		;GET A BYTE
	CAIN N,0(FN)		;BELONG TO THIS FILE?
	JRST RUN1		;YES.
	CAIL LBN,MAXBLK		;LOOKED TOO FAR?
	 PUSHJ P,ERROR		;YES. NO BLKS IN FILE!
	AOJA LBN,RUNL		;LOOK FURTHER
RUN1:	PUSHJ P,RDDAT1		;READ THE DATA BLOCK TO FIND FBN
	LDB A,[POINT 10,DBUF+0,27]	;FIRST BLOCK OF FILE
	HRLM A,DBUF+0		;PUT IT IN LINK SLOT TO BE READ NEXT
RFILE:	SETZB Q,40		;CLEAR CORE BEFORE READING FILE
				;AND INITIALLY NO WORDS IN DATA BUFFER
RFILL1:	PUSHJ P,RWORD		;READ A POINTER OR JRST WORD
	SKIPL M,W		;WHICH IS IT?
	JRST STARTQ		;TRANSFER WORD
RFILL2:	PUSHJ P,RWORD		;READ A WORD OF DATA
	MOVEM W,1(M)		;STORE IT IN CORE
	AOBJN M,RFILL2		;COUNT THE CORE POINTER.
	JRST RFILL1		;IT RAN OUT. GET ANOTHER.
STARTQ:	CONO DTC,C.STOP		;STOP THE TAPE
	JRST @TENDMP		;RETURN TO SWPMON.

;SUBROUTINE TO READ A DATA WORD FROM THE FILE.

RWORD1:	MOVE Q,DBUFP		;PREPARE TO COUNT DATA WORDS
RWORD:	JUMPGE Q,RWNXTB		;NEED ANOTHER BLOCK?
	MOVE W,0(Q)		;NO. GET A WORD.
	AOBJN Q,.+1		;COUNT IT.
	POPJ P,0		;RETURN FROM RWORD
RWNXTB:	PUSHJ P,RDDATA		;NO. READ NEXT DATA BLOCK, IF ANY
	JRST RWORD1		;READ FROM THIS BLOCK

;SUBROUTINE TO READ NEXT BLOCK OF DATA INTO DBUF

RDDATA:	HLRZ LBN,DBUF+0		;LINK
	JUMPE LBN,ERROR		;JUMP IF END OF FILE
RDDAT1:	MOVEI A,DBUF		;SELECT DATA BUFFER
RDBLK:	PUSHJ P,PROCBK		;PROCESS A BLOCK
	 CONO DTC,O.READ	;ARGS TO PROCBK
	 DATAI DTC,0(A)		; TO CAUSE IT TO READ THE BLOCK
	POPJ P,0		;SUCCESS. RETURN

RDDIR:	TRNE F,R.DIRI		;IS THE DIRECTORY IN CORE OK?
	POPJ P,0		;YES. DONT READ IT AGAIN
	MOVEI A,HBUF		;MUST READ. WHERE TO PUT IT.
	MOVEI LBN,DIRBLK	;BLOCK ON TAPE TO READ
	PUSHJ P,RDBLK		;READ IT
	CONO DTC,C.STOP		;STOP TAPE IN CASE OF /F COMMAND
	TRO F,R.DIRI		;HAVE A GOOD DIRECTORY IN CORE NOW
	POPJ P,0		;RETURN FROM RDDIR
PROCBK:	PUSHJ P,SEARCH		;ROUTINE TO READ OR WRITE A BLOCK OF TAPE
				; FIRST FIND THE BLOCK (EITHER DIRECTION)
	MOVEI N,200		;NUMBER OF WORDS IN A BLOCK
	TLNE F,L.REV		;WHICH WAY WE GOING?
	ADDI A,177		;BACKWARDS. WRITE FROM TOP OF CORE DOWN
	XCT @0(P)		;CONO WRITE OR READ
	AOS 0(P)		;COUNT ON TO DATAI OR DATAO
PROCLP:	CONSZ DTS,S.ERR!S.END	;TROUBLE?
	PUSHJ P,ERROR		;YES. QUIT
	CONSO DTS,S.DAT		;WANT DATA MOVED YET?
	JRST PROCLP		;NO. WAIT SOME MORE.
	XCT @0(P)		;YES. DATAI OR DATAO TO/FROM BUFFER
	ADDI A,1		;COUNT BUFFER POINTER
	TLNE F,L.REV		;GOING BACKWARDS?
	SUBI A,2		;YES. THEN COUNT POINTER BACKWARDS TOO
	SOJG N,PROCLP		;TRANSFERRED WHOLE BLOCK?
	CONO DTS,1		;YES. TELL IT TO DO CHECKSUMMING AND QUIT
	CONSO DTS,S.JOBD	;DONE?
	JRST .-1		;NOT YET. WAIT.
	JRST CPOPJ1		;YES. RETURN AFTER THE DATAI/O ARGUMENT

SEARCH:	MOVEI C,0		;DRIVE ZERO
	CONSZ DTC,C.FWD!C.REV	;TAPE GOING AT THE MOMENT?
	JRST SRCHC		;YES.
	TRO C,C.FWD!C.DSEL	;NO. MAKE IT GO FORWARD
	TLZ F,L.REV		;AND GET THE FLAG TO SAY THAT
SRCHC:	CONO DTC,O.SRCH!C.SEL(C) ;MAKE IT SEARCH
SRCHW:	CONSZ DTS,S.END		;AT END ZONE?
	JRST SRCHTA		;YES. TURN AROUND.
	CONSZ DTS,S.ERR		;ANY ERRORS?
	 PUSHJ P,ERROR		;YES. QUIT.
	CONSO DTS,S.DAT		;BLOCK NUMBER FOUND?
	JRST SRCHW		;NO. WAIT FOR IT
	DATAI DTC,N		;YES. SEE WHAT BLOCK WE ARE AT
	ANDI N,7777		;JUST FOR SAFETY, MASK JUNK OUT
	SUBI N,0(LBN)		;GET THE DISTANCE TO GO
	JUMPE N,CPOPJ		;IF FOUND, RETURN WITH TAPE ROLLING INTO DESIRED BLK
	TLNE F,L.REV		;NOT THERE. WHICH WAY WE GOING?
	MOVNS N			;BACKWARDS. NEGATE.
	JUMPL N,SEARCH		;IF SHOULD KEEP GOING, ITS MINUS.
SRCHTA:	CONO DTC,C.FWD!C.REV	;MUST TURN AROUND (END ZONE OR PASSED)
	TLC F,L.REV		;COMPLEMENT DIRECTION FLAG
	JRST SEARCH		;SEARCH SOME MORE

CPOPJ1:	AOS 0(P)		;SUCCESSFUL RETURN
CPOPJ:	POPJ P,0		;RETURN.

;TTY I/O SUBRS

ERROR:	MOVEI C,207		;MAKE A BELL, EVEN PARITY
	PUSHJ P,TYO		;TYPE IT OUT
	JRST 4,GO			;AND RESTART.

CRLF:	MOVEI C,215		;CR, EVEN
	PUSHJ P,TYO		;TYPE IT.
	MOVEI C,12		;LF, EVEN
TYO:	DATAO TTY,C		;SEND OUT CHAR
	CONSZ TTY,20		;WAIT FOR IDLE
	JRST .-1		; ..
	POPJ P,0		;DONE.
;CONSTANTS AND TEMPS.

SYSTEM:	SIXBIT /TENEX /		;DEFAULT FILENAME
DBUFP:	XWD -177,DBUF+1		;POINTER TO DATA BLOCK
BYTPTR:	POINT 5,HBUF+D.BYT	;POINTER TO BYTES IN DIRECTORY

LIT

PDP:	XWD -PDLL,PDL-1		;STACK POINTER

;CORE ALLOCATION
ZZZ==.
DEFINE U(Z)<
	UU(Z,1)>		;ONE WORD ALLOCATION
DEFINE UU(Z,N)<
Z=ZZZ
ZZZ==ZZZ+N
>

UU(HBUF,200)			;DIRECTORY OF DTA
UU(DBUF,200)			;DATA BUFFER
UU(PDL,PDLL)
	DEPHASE
ENDTND:	END
