Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-03 - decus/20-0078/comp/o2.mac
There are 2 other files named o2.mac in the archive. Click here to see a list.
	SALL


;AUTHOR:		 ELISABETH $LUND
;VERSION:		 4 [2,43,106,271]
;PURPOSE:		 HANDLE I/O TRANSMISSIONS
;CONTENTS:		
;SUBROUTINES:		 O2IS, O2IV,O2DF, O2AF, O2CF


	SEARCH SIMMC2,SIMMAC
	CTITLE O2
	DEFINE	IOER(F)=<
		L	X1,[ASCIZ/F/]
	>
	MACINIT


	EXTERN YDCSTP,YBHIC1,YBHDF1,YMAXID,YO2STS
	EXTERN	YELIC1
	EXTERN YBHIC2,YQREL,YTENT,YNOREL,YLXIAC,YFXCH,YFXTAB,YDCSTO
				edit(43)
	EXTERN	YO2CIQ		;[43] CURRENT IQ BUFFER POINTER
	EXTERN	YO2IQB		;LOCAL BUFFER INTERNAL REQUEST NO 1
	EXTERN	YO2IQI		;INDEX YO2IQB OR YO2ITB[43]
	EXTERN	YO2LAS		; SAVES TENTATIVE FIXUP DEFINITION
	EXTERN	YO2LIT		;NUMBER OF LITERALS FOLLOWING SYMBOL IN IC1
	EXTERN	YO2FIX		;0/1 NO OUTPUT/OUTPUT OF OLD REQUEST
	IFN	QDEBUG,<
	EXTERN	YO2NOR		;RELOC COUNTERS SIXBIT CODE FOR DEBUG EDIT
	>
	EXTERN	O2IC2P		;[43] OUTPUTS PARTLY FILLED CODE STREAM BUFFERS
	EXTERN	O2IC2Z		;[43] ZEROES THE REST OF THE IC2 BUFFER
	EXTERN	O2IC2		; OUTPUTS BUFFER TO IC2
	EXTERN	YO2ITB		;[43] LOCAL BUFFER INTERNAL REQUESTS NO 2
IFN	QDEBUG,<EXTERN	O2DB1, O2DB2, O2DB3, O2DB4>
	EXTERN	O2ERO,O2ERL,O2ERU,O2ERR,O2ERI
	EXTERN	M2CO
	INTERN  O2IS, O2IV, O2DF, O2AF, O2CF, O2DFOU, O2DFTE



	TWOSEG
	RELOC	400000
	SUBTTLE O2D1
;PURPOSE:		 READ A SECTION OF THE FILE DF1 INTO DECLARATION STACK
;ENTRY:			 O2D1
;NORMAL EXIT:		RETURN
;ERROR EXIT:		
IO.EOF=1B22




	X=0
	DEFINE SYMBTAB (A,B,C,DUM)
	<REPEAT  B-X-1,<Z>
	X==B
	IFB <C>,<0>
	IFNB <C>,<C>>



REPEAT	0,<O2D1:
	SAVE <X2,X3,X4,X5>
	LI	 X5,0 		;COUNT OF DECLARED ZQU
	L	X3,YDCSTP	;STACKPOINTER
	HRL	X3,X3
	SUB	X3,YDCSTO
	MOVSS	X3,X3
	EXEC	 O2DTYPE	;GET POINTER TO RECORD IN X4
	ASSERT<WHEN (X4,ZQU) 	;FIRST RECORD MUST NOT BE ZQU
	RFAIL ZQU NOT EXP IN O2D1
	>
IF	WHENNOT	(X4,ZHE)		;SKIP NEXT INSTR IF ZHE
	GOTO	FALSE
THEN	EXEC	O2DPUSH,<[ZHE%S]> 	;READ ZHERECORD INTO STACK
ELSE 	EXEC	O2DPUSH,<[ZHB%S]>	;READ RECORD ZHB INTO STACK
FI
O2DL:	EXEC	O2DTYPE		;GET POINTER TO RECORD IN X4
	WHENNOT	(X4,ZQU)		;SKIP NEXT INSTR IF ZQU
	GOTO	O2DL3
	EXEC	O2DPUSH,<[ZQU%S]>	;READ RECORD INTO STACK
IF	IFEQF	(X4,ZQUKND,QCLASS)	;SKIP NEXT INSTR IF NOT CLASS
	GOTO	FALSE
THEN  IFNEQF	(X4,ZQUKND,QPROCEDURE)
	GOTO	O2DL		;JUMP IF PROCEDURE
	IFEQF	(X4,ZQUTYP,QLABEL)
	GOTO	O2DL
FI	IFEQF	(X4,ZQUMOD,QDECLARED)	;IF NOT DECLARED SKIP  NEXT INSTR
	ADDI	X5,1		;UPDATE COUNTER
	GOTO	O2DL
O2DL3:	JUMPE	X5,O2DEND	
	SUBI	X5,1
	ASSERT <
	WHEN	(X4,ZHE)	;ZHERECORD NOT ALLOWED
	RFAIL ZHERECORD IN MIDDLE OF SEGMENT>
	EXEC	O2DPUSH,<[ZHB%S]>
	GOTO	O2DL
O2DEND:	ADDI	X3,1				;NO STACKPOINTER
	HRRM	X3,YDCSTP
	SETZM	(X3)	; THIS STOPS THE SCAN IN CARL
	RETURN
O2DPUSH:	PROC <A>	;ROUTINE TO READ RECORD FROM DF1
	HRRZ	X3,X3	; RESET PDL COUNTER
	CAML	X3,YDCSTO
	EXEC	M2CO
	L	X2,A		;INTO DECLARATION STACK
	LI X1,0
O2DL5:
LOOP	SOSGE	YBHDF1+2		;SKIP NEXT INSTR IF MORE WORD IN BUFFER
	GOTO	O2DIN1		
AS	ILDB	X0,YBHDF1+1	;GET WORD
	PUSH	X3,X0	;PUSHDOWN IN DECLSTACK
	SOJG	X2,TRUE	;JUMP IF MORE WORDS IN RECORD
SA	RETURN
	EPROC
O2DIN1:	IN	QCHDF1,
	GOTO	O2DL5		;CORRECT RETURN
	GETSTS	QCHDF1,YO2STS
O2DINERR:
	FATAL	6,ERROR ON INPUT FROM DF1
O2DTYPE:
	IF  SKIPE	YBHDF1+2
	  GOTO FALSE
	THEN
	  IN 	QCHDF1,
	  GOTO FALSE
	GETSTS	QCHDF1,YO2STS
	LI	IO.EOF
	TDNN	YO2STS
	GOTO	O2DINERR
	LI	X4,[0]
	RETURN
	FI
	ASSERT<SKIPL	@YBHDF1
		RFAIL	BUFFER SYNC ERROR O2D1
	>
  L X4,YBHDF1+1
	AOS	X4
	  RETURN	>
	SUBTTLE	O2IS



;PURPOSE:		 READ A SYMBOL FROM IC1 TO REG XCUR
;ENTRY:			 O2IS
;NORMAL EXIT:		 RETURN
;ERROREXIT:		

;OUTPUT ARGUMENT: REG XCUR CONTAINING CURRENT SYNBOL


O2IS:
	SOSGE	YBHIC1+2 	;Countdown of words in buffer
	EXEC	O2IC		;Next buffer when exhausted
	ILDB	XCUR,YBHIC1+1	;GET SYMBOL
	ASSERT <
	SKIPE	YO2LIT		;Should not be reading a literal
	 RFAIL 	(CALL ON O2IS WHEN O2IV EXPECTED)
	IF	;Identifier
		CAMG	XCUR,YMAXID
		CAIGE	XCUR,QLOWID
		GOTO	FALSE
	THEN
		RETURN
	FI
	IF
		CAIGE	XCUR,400000
		GOTO	FALSE
	THEN
		LI	X1,2
		ST	X1,YO2LIT
		RETURN
	FI
	CAILE	XCUR,SYMBL5
	 RFAIL	(INVALID SYMBOL IN IC1)
	L	X1,O2ST(XCUR)	;GET NUMBER OF LITERALS
	ST	X1,YO2LIT
>
	RETURN
	ASSERT	<
O2ST:	SYMB	(2,1,SYMBTAB)>		;GENERATE LIST



;O2IC GETS A NEW BUFFER FROM IC1, BUFFERHEADER IS UPDATED
;TO MAKE IT POSSIBLE TO READ ONLY HALFWORDS


	O2IC:
		ASSERT<	SKIPN	YELIC1
			RFAIL	READING PAST EOF IN IC1
			>
		IF	IN	QCHIC1,
			GOTO	TRUE
			GOTO	FALSE
	THEN
		SOS	YBHIC1+2
		RETURN
	ELSE
		GETSTS	QCHIC1,YO2STS
		IOER	IC1
		EXEC	O2ERI
	FI
	SUBTTLE	O2IV


;PURPOSE:		 READ A VALUE FROM IC1
;ENTRY:			  O2IV
;NORMAL EXIT:		 RETURN
;ERROR EXIT:		
;OUTPUT ARGUMENT:	 REG X0 CONTAINING VALUE FROM IC1

O2IV:
	SOSGE	YBHIC1+2		;IF MORE WORDS IN BUFFER SKIP NEXT INSTR
	EXEC	O2IC
	ILDB	X0,YBHIC1+1	;GET VALUE
	ASSERT <
	SOSGE	YO2LIT 		;SKIP NEXT INSTR IF LITERAL ALLOWED
	RFAIL (TOO MANY CALLS ON O2IV AFTER O2IS)>
	RETURN
	SUBTTL O2DF


;PURPOSE:		 DEFINE CODE ADDRESS OF A PROGRAM COORDINATE
;OUTPUT FIXUP TO IC2
;ENTRY:			 O2DF
;NORMAL EXIT:		 RETURN
;ERROR EXIT:		 
;INPUT ARG:		 X1 CONTAINING INDEX FIXUPTABLE ZFX
;			YQREL CONTAINS RELOCATION FOR FIXUP OR ZERO (GLOBAL REQUEST)

O2DF:

	PROC
	SAVE	<X1,X2,X5,X6,X3,X4>
	SETZM	YLXIAC
	ADD	X1,YFXTAB
	L	X3,X1
	L	X5,(X3)
	ASSERT<	; CHECK FIXUP STATUS
		LF	,ZFXTYP(X1)
		CAIN	QA
		RFAIL	UNUSED FIXUP DEFINED
		CAIN	QE1
		RFAIL	FIXUP ALREADY DEFINED
		CAIN	QF
		RFAIL	FXTYP QF IN O2DF
	>
	IF	SKIPN	X1,YQREL
		GOTO	FALSE
	THEN	L	X6,YNOREL(X1)
		HRL	X6,X1
	ELSE
		L	X6,X3
		SUB	X6,YFXTAB
	FI
	LI	QE1
	SF	,ZFXTYP(,X6)
	SKIPE	YTENT	; NO REDEFINITION IF ZERO
	 HRRO	X3,X3
	LOOP
		EXCH	X5,YO2LAS
		EXCH	X6,YO2LAS+1
		EXCH	X3,YO2FIX
		SETZM	YTENT
		IF	JUMPE	X3,FALSE
		THEN
			ST	X6,(X3)
			L	X1,X3
			L	X3,YO2IQI
			TLZ	X5,777000
			TLZ	X6,777000
			EXEC	O2DFOUT
		FI
	AS	SETZ	X3,
		SKIPLE	YO2FIX
		GOTO	TRUE
	SA
	RETURN
	EPROC

O2DFOUT:	PROC; STORE CONTENTS OF X5-X6 IN BUFFER YO2IQB OR YO2ITB, UPDATE YO2IQI
	SKIPN	X5
	RETURN		; DO NOT OUTPUT IF CHAIN IS ZERO

				edit(43)
	L	X4,YO2CIQ	;[43] CURRENT IQ BUFFER START TO X4

					edit(106)
	IF	CAIGE	X3,QBUFS-5	;[106] OUTPUT ONLY DOUBLE WORDS
		GOTO	FALSE
	THEN
	IF	HLRZ	X1,(X4)	;[43]
		CAIE	X1,10
		GOTO	FALSE
	THEN	;BLOCK TYPE 10 WITH COUNT IN SECOND WORD
		HRRZ	X1,(X4)	;[43]
		ST	X1,1(X4)	;[43]	; SET COUNT

			edit(43)
			;[43] START
		IF	;FIRST IQ BUFFER FULL?
			CAIE	X4,YO2IQB
			GOTO	FALSE
		THEN	;CHANGE CURRENT IQ BUFF TO SECOND (YO2ITB)
			LI	X4,YO2ITB
		ELSE	;OUTPUT PARTLY FILLED CODE STREAM BUFFERS
			;ZERO THE REST OF THE IC2 BUFFER
			;OUTPUT THE 2 IQ BUFFERS
			;SET CURRENT IQ BUF TO YO2IQB

			EXEC	O2IC2P
			EXEC	O2IC2Z
			LI	X1,YO2IQB
			EXEC	O2IC2
			LI	X1,YO2ITB
			EXEC	O2IC2
			LI	X4,YO2IQB
		FI
		ST	X4,YO2CIQ

			;[43] END
		LI	X3,2	; FIRST USED WORD FOR TYPE 10
	ELSE	; TYPE 2 BLOCK
		LI	X1,YO2IQB
		EXEC	O2IC2
		LI	X3,1	; FIRST USED WORD FOR TYPE 2 BLOCK
	FI
	HLLZS	(X4)	;[43]

	ST	X3,YO2IQI


	IFN	QDEBUG,<
		SETZ	X1,
	>
	FI
				edit(43)
	ADD	X3,X4		;[43]
	STD	X5,(X3)		;[43]
	LI	X3,2
	ADDM	X3,YO2IQI
	ADDM	X3,(X4)	;[43]


	IFN	QDEBUG,<

		;EDIT THE DEBUG OUTPUT IF SO2D1 IS SET

	IF
		IFOFF	SO2D1
		GOTO	FALSE
	THEN
		EXEC	O2DB1,<<[020000,,]>>	;NEW LINE
		SUB	X1,YFXTAB
		HRL	X1,X1
		EXEC	O2DB3,<<[610000,,'IQ ']>,X1>	;'IQ ', FIXUP INDEX
		LF	X1,ZFXCOD(,X5)
		HLR	X0,YO2NOR(X1)
		HLR	X1,X5
		HRLI	X1,116000		;116000,,X5(L)
		HRL	X0,X5			;X5(R),,'REL CODE'
		EXEC	O2DB4,<X1,X0>
			EXEC	O2DB1,<<[020000,,]>>	;NEW LINE
		EXEC	O2DB2,<<[600000,,]>>	;HTAB
		HLR	X1,X6
		HLR	X0,YO2NOR(X1)
		HRLI	X1,116000		;116000,,X6(L)
		HRL	X0,X6			;X6(R),,'REL CODE'
		EXEC	O2DB4,<X1,X0>
	FI
	>				;END OF  IFN QDEBUG,

	RETURN		;[43]

	EPROC
	SUBTTL	O2AF


;PURPOSE:		 UNCHAIN A FIXUP TYPE A
;ENTRY	:		 O2AF
;INPUT ARG:		 -
;NORMAL EXIT:		 RETURN
;ERROR EXIT: -
;OUTPUT ARGUMENTS:	 X0 is fixup index

O2AF:	PROC
	SAVE	<X2,X3>

	L	X1,YFXCH		;START OF CHAIN OF AVAILABLE FIXUPS
	IF	;[271] No more free fixups available
		edit(271)
		JUMPG	X1,FALSE
	THEN	;Error
		FATAL	3,Too complicated program structure
	FI
	L	X2,(X1)
	SETZM	(X1)
ASSERT <
	SKIPN	YFXCH
	RFAIL	NO MORE FIXUPS AVAILABLE IN O2AF
	SKIPG	YFXCH
	RFAIL NO FIXUP TO UNCHAIN
	LDB	X3,[$ZFXTYP (X1)]
	CAIE	X3,QA
	RFAIL WRONG TYPE OF FIXUP IN ZFX TO UNCHAIN>
	LI	X3,QB
	DPB	X3,[$ZFXTYP (X1)]
	HRRM	X2,YFXCH
	L	X0,X1
	SUB	X0,YFXTAB
	RETURN
	EPROC
	SUBTTLE O2CF


;PURPOSE:		 MAKE A FIXUP AVAILABLE FOR REALLOCATION BY O2AF
;ENTRY:			 O2CF
;INPUT:			 REG X1 CONTAINING FIXUP INDEX TO ZFX
;NORMAL EXIT:		 RETURN


O2CF:
	ADD	X1,YFXTAB
	IFN	QDEBUG,<LI	QA
		SF	,ZFXTYP(X1)
	>
	L 	X0,YFXCH
	ST	X1,YFXCH
	HRRZM	X0,(X1)
	RETURN
	SUBTTL	O2DFTE	[2]

	edit(2)


	COMMENT;

	PURPOSE:	OUTPUT TENTATIVE FIXUP IF PREVIOUSLY DEFINED
			BUT NOT YET OUTPUT

	ENTRY:		O2DFTE

	INPUT ARG:	YO2FIX	 = -1 ,,FIXUP INDEX + YFXTAB
			YO2LAS	 = RCODE,,ADDRESS
			YO2LAS+1 = RCODE,,VALUE

	NORMAL EXIT:	RETURN

	CALL FORMAT:	EXEC	O2DFTE

	;


		;[2]  NEW ROUTINE
O2DFTE:	PROC
	IF
		SKIPL	X1,YO2FIX
		GOTO	FALSE
	THEN
		;A TENTATIVE FIXUP REMAINS IN YO2LAS AND YO2LAS+1
		STACK	X3
		L	X3,YO2IQI
		EXCH	X5,YO2LAS
		EXCH	X6,YO2LAS+1
		ST	X6,(X1)
		TLZ	X5,777000
		TLZ	X6,777000
		EXEC	O2DFOUT
		SETZB	X5,X6
		EXCH	X5,YO2LAS
		EXCH	X6,YO2LAS+1
		SETZM	YO2FIX
		UNSTK	X3
	FI
	RETURN
	EPROC
	SUBTTL	LITERALS
	LIT
	RELOC
	VAR
	
	END