	TITLE	CREEP -- TOPS-20 HELP FOR CRAWL.PAS
	SUBTTL	PHIL BUDNE@DEC/LCG
	SEARCH	MONSYM

TMRCHN==0

T1==1
T2==2
T3==3
T4==4
T5==5

P==17

JFN:	BLOCK	1
TEMP:	BLOCK	10
TEMP2:	BLOCK	2
INSINR:	BLOCK	1
OUTCNT:	BLOCK	1		;COUNT OF TIMEOUTS

GETLOCAL::
	SETZM	OUTCNT

	MOVE	T4,T2		;SAVE RESULT POINTER
	MOVEI	T1,.NDGLN	;GET FUNCTION
	MOVEI	T2,T3		;POINT TO BLOCK
	HRROI	T3,TEMP
	NODE

	MOVEI	T1,6		;NODE LENGTH
	MOVE	T3,[POINT 7,TEMP] ;GET SOURCE
	TLNE	T4,-1		;SECTION?
	 TLOA	T4,610000	; YES, GET OWG
	  HRLI	T4,(POINT 7,)	;MAKE DEST BP

GL.1:	ILDB	T2,T3		;GET A BYTE
	JUMPE	T2,GL.2		;NULL?
	IDPB	T2,T4		;NO, COPY
	SOJG	T1,GL.1		;KEEP GOING
	POPJ	P,		;WAS FULL 6 CHARACTERS

GL.2:	MOVEI	T2," "		;GET A SPACE
GL.3:	IDPB	T2,T4		;STORE IT
	SOJG	T1,GL.3		;FILL THE REST
	POPJ	P,

OPENCON::
	DMOVEM	T2,TEMP2	;SAVE NODE NAME
	HRROI	T1,TEMP		;GET BUFFER
	HRROI	T2,[ASCIZ 'DCN:']
	SETZ	T3,
	SOUT
	MOVE	T4,[POINT 7,TEMP2]
	MOVEI	T5,6
OP.1:	ILDB	T2,T4		;GET NEXT BYTE
	CAIN	T2," "		;SPACE IS TERMINATOR
	 JRST	OP.2
	IDPB	T2,T1
	SOJG	T5,OP.1
OP.2:	HRROI	T2,[ASCIZ '-19;BDATA:003000000']
	SOUT
	IDPB	T3,T1

	MOVSI	T1,(GJ%SHT)
	HRROI	T2,TEMP
	GTJFN
	 ERJMP	RETZER
	MOVEM	T1,JFN
	MOVE	T2,[8B5+OF%RD+OF%WR]
	OPENF
	 ERJMP	RETREL

	TIME
	MOVE	T4,T1		;SAVE UPTIME
	ADDI	T4,^D<60*1000>	;WAIT FOR ONE MIN
OP.3:	MOVE	T1,JFN
	MOVEI	T2,.MORLS
	MTOPR
	 ERJMP	RETCLZ
	TLNE	T3,(MO%CON)	;CONNECTED?
	 JRST	OP.4
	TLNE	T3,(MO%ABT)	;ABORTED?
	 JRST	RETCLZ
	TIME
	CAML	T1,T4		;TIME UP?
	 JRST	RETCLZ		; YES
	MOVEI	T1,^D1000	;NO, GET A SECOND
	DISMS			;SLEEP
	JRST	OP.3		;LOOP

OP.4:	SETZM	INSINR		;CLEAR IO FLAG
	MOVEI	T2,TMRCHN
	MOVEI	T3,1		;LEVEL
	HRLZ	T4,16		;??
	HRRI	T4,TMRINT	;HANDLR
	PUSHJ	P,PSIDEF##	;LIBRARY ROUTINE

	MOVEI	T2,TMRCHN
	PUSHJ	P,PSIENABLE##

RETONE:	MOVEI	T1,1
	JRST	RETVAL

RETCLZ:	MOVE	T1,JFN
	CLOSF
	 JFCL
	JRST	RETZER

RETREL:	MOVE	T1,JFN
	RLJFN
	 JFCL
RETZER:	SETZ	T1,
RETVAL:	MOVEM	T1,1(P)
	POPJ	P,

CLOSECON::
	MOVE	T1,JFN
	TLO	T1,(CZ%ABT)
	CLOSF
	 JFCL
	POPJ	P,


PUTDATA::
	EXCH	T2,T3		;EXCHANGE COUNT,BUFFER
	MOVE	T1,JFN
	TLNE	T2,-1		;SECTION?
	 TLOA	T2,540000	; YES, GET OWG
	  HRLI	T2,(POINT 8,)
	SOUTR	
	 ERJMP	RETZER
	JRST	RETONE

TMRENA:	MOVE	T1,[.FHSLF,,.TIMEL]
	MOVEI	T2,^D<60*1000>	;TIME OUT IN ONE MINUTE
	MOVEI	T3,TMRCHN
	TIMER
	 ERJMP	.+1
	POPJ	P,

GETDATA::
	DMOVE	T4,T2		;SAVE ARGS (COUNT,DEST)

	PUSHJ	17,TMRENA
	MOVE	T2,T5		;GET DEST
	TLNE	T2,-1		;SECTION?
	 TLOA	T2,540000	; YES, GET OWG
	  HRLI	T2,(POINT 8,)	;  MAKE BP
	MOVE	T1,JFN		;GET FILE
	MOVN	T3,T4		;GET COUNT
	SETOM	INSINR		;DOING I/O
	SINR
	 ERJMP	RETZER		;RETURN ZERO
	SETZM	INSINR		;I/O DONE
	MOVE	T1,T3		;GET REMAINING COUNT
	ADD	T1,T4		;GET COUNT OF BYTES READ

	PUSH	P,T1		;SAVE BYTE COUNT
	MOVE	T1,[.FHSLF,,.TIMAL]
	TIMER			;CANCEL INTERRUPT
	 ERJMP	.+1
	POP	P,T1

	JRST	RETVAL

TMRINT:	SKIPN	INSINR		;STUCK IN SINR?
	 POPJ	P,		; NOPE
	AOS	OUTCNT
	HRROI	T1,[ASCIZ 'TIMEOUT']
	ESOUT
	XMOVEI	T1,RETZER
	MOVEM	T1,1(T5)
	POPJ	P,

	END
