perm filename IMPINT.MAC[IP,NET] blob sn#702345 filedate 1983-03-11 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00013 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	TITLE IMPINT	HARDWARE/SOFTWARE INTERFACE	V 1515/515
C00005 00003	LOCAL REVISION HISTORY
C00007 00004		ENTRY IMPINT  IMPINT
C00009 00005	DOCUMENTATION
C00012 00006		EXTERNAL ROUTINES:
C00015 00007	PARAMETERS  IMP POWER DOWN10 SICK DEAD ENDIN EMPTY FULL CSICK DOWN10 OUTSTP OUTEND GOTEND MPEENB MPPENB MPIENB ALLENB MPISET MPESET MPPSET IMP TYHB RFNHB TEST IMPERR IDONE IEND ODONE NREADY IEPIA IDPIA ODPIA TEST STRIN I32 O32 CLRST CLRWT STROUT FINO IEPIEN IDPIEN ODPIEN PIA ISTART IFLUSH SICK FULL ENDIN EMPTY OUTEND
C00022 00008		SUBTTL INTERRUPT CODE  MPIINT MPIIN1 ONEWRD MPIIN2 IGNORE
C00026 00009	MPE INTERRUPT SERVICE  --  END-OF-MESSAGE  MPEINT END2 END3
C00029 00010	MPP INTERRUPT SERVICE -- OUTPUT TO IMP  MPPINT DONE NONE
C00032 00011	SUBROUTINES  IMPOUT IMPOU1 IMPOU2
C00035 00012	CODE TO CHECK HARDWARE HEALTH  IMPCHK
C00037 00013	INITIALIZE DEVICES  IMPDWN IMPIOF IMPION BLKIPT INPON DUMMY BLKOPT OUTACT
C00039 ENDMK
C⊗;
TITLE IMPINT	HARDWARE/SOFTWARE INTERFACE	V 1515/515
SUBTTL SUNDBERG/RLS/EAT --	22-APR-73
	SEARCH	F,S		;MACRO V50
	$RELOC
	$LOW
	XP VIMPNT,516	;5.06 VERSION = 1000+5.04 VERSION

;JJW revised March '83 for WAITS IP/TCP.

;Code marked NOWAITS is TOPS-10 code not used in WAITS.  Code marked IFWAITS or
;IFE FTF2 is new WAITS code.  Code marked IFN FTF2 but not IFWAITS is used in
;TOPS-10 and F2 WAITS.
;LOCAL REVISION HISTORY

;[96bit]	7-Jul-80, Jim McCool
;	Modules effected: S, COMDEV, I, IMPINT, IMPSER, NETCON
;	Edit type: Enhancement
;	Add the CMU modifications to the ARPAnet code to support
;	96 bit leaders in the HOST-IMP protocol


;END OF LOCAL REVISION HISTORY

	ENTRY IMPINT ;⊗ IMPINT
IMPINT::


;     BECAUSE OF ASSEBLY-TIME ERROR IN COMMON (MACRO BUG), ALL MPO...
;     VALUES AND LABELS HAVE BEEN CHANGED TO MPP...		DK/FEB 75



COMMENT \
	INPUT INTERRUPT CHANNEL MUST BE HIGHER PRIORITY THAN
END-OF-MESSAGE CHANNEL
\

IFWAITS<
;The above warning is not heeded: in COMMON.MAC all IMP interrupts are
;assigned to the same channel.  We'll do the same in WAITS, with the channel
;number defined in CACDAT.

MPI==IMPCHN##
MPE==IMPCHN##
MPP==IMPCHN##
>;IFWAITS
SUBTTL DOCUMENTATION

COMMENT \

	INTERNAL ROUTINES:

IMPDWN--	TURNS THE HARDWARE OFF AND SETS PDP10 DOWN BIT

IMPIOF--	TURNS OFF INPUT

IMPION--	TURNS ON INPUT

IMPCHK--	CHECKS THE STATUS OF THE HARDWARE.  THE RETURN ADDRESS
		DEPENDS ON THE STATUS.  NO SKIP MEANS THAT THE IMP
		IS DEAD.  ONE SKIP MEANS THAT IT WAS DEAD BUT IS
		APPARENTLY OK NOW.  A DOUBLE SKIP MEANS THAT THE
		PDP-10 IS QUESTIONABLE.  A TRIPLE SKIP MEANS THAT ALL
		IS OK.

IMPOUT--	ROUTINE TO START UP THE OUTPUT SECTION.  T1 MUST
		CONTAIN AN IOWD POINTER TO AN OUTPUT MESSAGE.  RETURNS
		IMMEDIATELY IF THE HARDWARE IS BUSY AND THE MESSAGE
		CANNOT BE TRANSMITTED.  THE SKIP RETURN IS TAKEN
		IF THE MESSAGE IS BEING TRANSMITTED.
	EXTERNAL ROUTINES:

IMPEOM--	CALLED WHEN END-OF-MESSAGE HAS BEEN TRANSMITTED.
		IF THERE IS NO MORE OUTPUT, RETURN WITH A POPJ P,.
		IF ANOTHER MESSAGE IS TO BE TRANSMITTED, PLACE THE IOWD
		POINTER IN T1 AND TAKE THE SKIP RETURN.

IMPOND--	CALLED UPON A RUNOUT OF THE BLKO POINTER.  TO APPEND
		MORE OUTPUT, RETURN A NEW IOWD POINTER IN T1.  OTHER-
		WISE, DO NOT ALTER T1.

IMPIN--		CALLED ON THE FIRST WORD OF AN INCOMING MULTIWORD
		MESSAGE.  T1 CONTAINS THE FIRST WORD.  RETURN WITH
		A POPJ P, AND T1 LOADED AS FOLLOWS:
		IF THE ENTIRE MESSAGE IS TO BE INPUT, T1 SHOULD
			CONTAIN A LEGAL IOWD POINTER.
		IF THE MESSAGE IS TO BE IGNORED, T1 SHOULD CONTAIN
			ANY POSITIVE NUMBER.
		IF IT IS DESIRED THAT IMPIN(OR IMPONE, BELOW) BE
			CALLED ON THE NEXT INPUT WORD, T1 SHOULD
			BE ZEROED.

IMPEIM--	CALLED WHEN AN END-OF-MESSAGE HAS BEEN RECEIVED.  T1
		CONTAINS THE CURRENT BLKI POINTER.
		RETURNS NON-SKIP ALWAYS.

IMPIND--	CALLED WHEN A SUPPLIED INPUT IOWD POINTER RUNS OUT.
		THE OLD POINTER(EXPIRED) IS IN T1 (SEE IMPEIM).  RETURN WITH
		A POPJ P, WITH T1 LOADED AS IN IMPIN, ABOVE.
\
SUBTTL PARAMETERS ;⊗ IMP POWER DOWN10 SICK DEAD ENDIN EMPTY FULL CSICK DOWN10 OUTSTP OUTEND GOTEND MPEENB MPPENB MPIENB ALLENB MPISET MPESET MPPSET IMP TYHB RFNHB TEST IMPERR IDONE IEND ODONE NREADY IEPIA IDPIA ODPIA TEST STRIN I32 O32 CLRST CLRWT STROUT FINO IEPIEN IDPIEN ODPIEN PIA ISTART IFLUSH SICK FULL ENDIN EMPTY OUTEND

;HARDWARE DEFINITIONS

IFN FTF2,<
;It so happens that the F2 interface for WAITS is the same as the TOPS-10
;standard, except for the names of the CONI and CONO bits.

IMP==	   550	;IMP DEVICE NUMBER

;CONI BITS
POWER==	200000	;IMP INTERFACE TURNED ON
DOWN10==100000	;PDP-10 WAS DOWN
SICK==   40000	;IMP WAS DOWN
DEAD==   20000	;IMP CURRENTLY DOWN
ENDIN==:  4000	;EOM RECEIVED
EMPTY==:   200	;OUTPUT BUFFER EMPTY
FULL==:	    10	;INPUT BUFFER FULL

;CONO BITS
CSICK== 200000	;CLEAR SICK FLAG
DOWN10==100000	;PDP-10 IS UNHEALTHY
OUTSTP== 40000	;CLEAR EMPTY FLAG
OUTEND== 20000	;SEND EOM
GOTEND== 10000	;ACKNOWLEDGE INPUT EOM
MPEENB==  4000	;ENABLE PI FIELD FOR ENDIN INTERRUPT
MPPENB==   200	;ENABLE PI FIELD FOR OUTPUT INTERRUPT
MPIENB==    10	;ENABLE PI FIELD FOR INPUT INTERRUPT

MPEPIA==  3400	;Endin PI channel bits
MPPPIA==   160	;Output PI channel bits
MPIPIA==     7	;Input PI channel bits
>;IFN FTF2

IFE FTF2,<
;For the SU-AI interface, we first define an old set of names, and then
;define the equivalent TOPS-10 names.

IMP==	400			; Device number

; CONI bits

TYHB==	400000	; There's Your Host Bit
RFNHB==	200000	; Ready For Next Host Bit
TEST==	100000	; Interface is in test mode
IMPERR==040000	; IMP error (the READY line has gone down)
IDONE== 020000	; Input done
IEND==	010000	; Input end (end of message)
ODONE== 004000	; Output done
NREADY==002000	; IMP not ready if ¬TEST (actually ¬TEST∧¬READY)
IEPIA==	000700	; input end PI channel
IDPIA==	000070	; input done PI channel
ODPIA==	000007	; output done PI channel

; CONO bits

TEST==	100000	; Enter test mode.  In test mode the output side is
		; tied to the input side of the interface, and READY
		; is brought down
STRIN==	040000	; Start input, sets stop, clears IEND.
		; Stop means enable wait.  Wait happens after the
		; last bit has come in (if enabled by "stop") to
		; allow the programmer to change data modes before
		; the first bit of the next word comes in
I32==	020000	; Set 32. bit input mode if IDPIEN set
O32==	010000	; Set 32. bit output mode if ODPIEN set
CLRST==	004000	; Clear stop
CLRWT==	002000	; Clear wait
STROUT==000200	; Start output
FINO==	000100	; Finish output (last bit has been sent)
IEPIEN==000040	; Enable change of IEPIA
IDPIEN==000020	; Enable change of input byte size and IDPIA, clear
		; IMPERR
ODPIEN==000010	; Enable change of output byte size and ODPIA
PIA==	000007	; PI channel (see IEPIEN, IDPIEN, ODPIEN)

ISTART==STRIN!CLRWT!IEPIEN!IDPIEN!IMPCHN
IFLUSH==TEST!IEPIEN!IDPIEN!ODPIEN	;stop the IMP, turn off PIAs

SICK==	IMPERR	;Equivalents
FULL==:	IDONE
ENDIN==:IEND
EMPTY==:ODONE
MPIPIA==IDPIA
MPEPIA==IEPIA
MPPPIA==ODPIA
OUTEND==FINO
IFE FTIMP32,<
MPIENB==IDPIEN			;Sets 36-bit input
MPPENB==ODPIEN			;Sets 36-bit output
>;IFE FTIMP32
IFN FTIMP32,<
MPIENB==IDPIEN!I32
MPPENB==ODPIEN!O32
>;IFN FTIMP32
MPEENB==IEPIEN
>;IFE FTF2

ALLENB==MPIENB+MPPENB+MPEENB

MPISET==MPIENB+MPIPI##		;SETS THE INPUT CHANNEL
MPESET==MPEENB+MPEPI##		;SETS E-O-M CHANNEL
MPPSET==MPPENB+MPPPI##		;OUTPUT CHANNEL

;MACRO TO DISMISS INTERRUPTS IN VARIOUS WAYS

DEFINE JMPENB(CH) <
	  JEN	@CH'CHL##
>
	SUBTTL INTERRUPT CODE ;⊗ MPIINT MPIIN1 ONEWRD MPIIN2 IGNORE

;MPI INTERRUPT SERVICE --  INPUT FROM IMP


NOWAITS<
MPIINT::CONSO	IMP,FULL	;IMP INPUT?
	JRST	.-1
>;NOWAITS
IFWAITS<
MPIINT::CONSO IMP,MPIPIA	;Any input channel?
	 JRST IMPETS##		;Nope, not IMP input interrupt
>;IFWAITS
MPIIN1:	SKIPL	BLKIPT		;GOOD BLKI?
	JRST	ONEWRD		;NO
	BLKI	IMP,BLKIPT	;READ
	SKIPA
	JMPENB	(MPI)		;DISMISS
	JSR	MPISAV##	;COUNTED OUT
	MOVE	T1,BLKIPT
	CONSZ	IMP,ENDIN	;WAS IT THE LAST ANYWAY?
	JRST	END2		;YES
	PUSHJ	P,IMPIND##	;NO.  TELL OF RUNOUT
	JRST	MPIIN2		;STORE NEW POINTER AND RESUME INPUT

;EITHER FIRST INPUT OR THROWING AWAY DATA
ONEWRD:
	conso	imp,endin	;[96bit] EOM already on? (1 word long)
	SKIPE	BLKIPT		;FIRST?
	JRST	IGNORE		;NO
;[96bit] no one word messages.
;[96bit]CONSZ	IMP,ENDIN	;EOM SEEN?  (MUST TEST BEFORE DATAI)
;[96bit]JRST	ONEIN		;YES
	JSR	MPISAV##
	DATAI	IMP,T1		;GET LEADER
	PUSHJ	P,IMPIN##	;EXCHANGE FOR BLKI POINTER
MPIIN2:	MOVEM	T1,BLKIPT
;[96bit] nobody ever uses this information.
;[96bit]SETZM	OVERFL		;CLEAR OVERFLOW COUNTER
;[96bit]SKIPLE	T1		;DISCARDING NEXT INPUT?
;[96bit]AOS	OVERFL		;YES, START COUNT
	POPJ	P,

IGNORE:	DATAI	IMP,DUMMY	;THROW AWAY OVERFLOW DATA
	JMPENB	(MPI)		;DISMISS
;MPE INTERRUPT SERVICE  --  END-OF-MESSAGE ;⊗ MPEINT END2 END3

NOWAITS<
MPEINT::CONSO	IMP,ENDIN	;IMP END OF INPUT?
	JRST	.-1
>;NOWAITS
IFWAITS<
MPEINT::CONSO	IMP,MPEPIA	;Any input-end channel?
	 JRST	IMPOTS##	;Nope, not an input-end interrupt
>;IFWAITS
	CONSZ	IMP,FULL	;YES, DID INPUT FLAG COME UP JUST NOW?
	JRST	MPIIN1		;YES, HANDLE IT FIRST
	JSR	MPESAV##
;[96bit]SKIPL	T1,BLKIPT	;UNDERFLOW?
;[96bit]HRL	T1,OVERFL	;NO.  PERHAPS OVERFLOW
	skipge	t1,blkipt	;[96bit] load t1, skip if ingoring input
END2:	PUSHJ	P,IMPEIM##	;TELL IMP SERVICE
	SETZM	BLKIPT		;READY FOR NEXT INPUT MESSAGE
;[96bit]SETZM	OVERFL
END3:
IFN FTF2,<
	CONO	IMP,GOTEND	;RESUME INPUT
>;IFN FTF2
	POPJ	P,

;[96bit] imp-host messages no longer fit in one word: handle
;	 like buffered input.
;ONEIN:	DATAI	IMP,T1		;GET LEADER
;[96bit]PUSHJ	P,IMPONE##	;SEND MESSAGE TO IMPSER
;[96bit]JRST	END3
;MPP INTERRUPT SERVICE -- OUTPUT TO IMP ;⊗ MPPINT DONE NONE

NOWAITS<
MPPINT::CONSO	IMP,EMPTY	;IMP OUTPUT?
	JRST	.-1
>;NOWAITS
IFWAITS<
MPPINT::CONSO	IMP,MPPPIA	;Any channel?
	 JRST IMPCTS##		; nope, can't be interrupting
>;IFWAITS
	SKIPL	BLKOPT		;LEGIT IOWD?
	JRST	DONE		;NO
	BLKO	IMP,BLKOPT	;YES
	JRST	.+2		;BLKO RUNOUT
	JMPENB	(MPP)		;DISMISS
	JSR	MPPSAV##
	MOVE	T1,BLKOPT
	PUSHJ	P,IMPOND##	;RETURN ANOTHER BLKO POINTER
	MOVEM	T1,BLKOPT
	POPJ	P,		;DISMISS INTERRUPT

DONE:	SKIPG	BLKOPT		;CLEARED?
	JRST	NONE		;YES
	JSR	MPPSAV##	;NO
	CONO	IMP,OUTEND	;SEND EOM
	PUSHJ	P,IMPEOM##	;TELL IMP SERVICE
	  SETZ	T1,		;QUEUES ARE EMPTY
	MOVEM	T1,BLKOPT
	POPJ	P,		;DISMISS

NONE:	SETZM	OUTACT		;SET INACTIVE
IFN FTF2,<
	CONO	IMP,OUTSTP	;STOP HARDWARE
>;IFN FTF2
	JMPENB	(MPP)		;DISMISS


;LEGAL FLAG STATES:

;BLKOPT:	 -,	 +,	 0,	 0
;OUTACT:	-1,	-1,	-1,	 0
;STATE NUMBER:	 1,	 2,	 3,	 4 

;	1.	NORMAL TRANSMISSION IN PROGRESS.  OUTPUT REQUESTS
;		MUST BE QUEUED.
;	2.	OUTPUT BLOCK DONE.  EOM ON NEXT INTERRUPT.  OUTPUT
;		REQUESTS MUST BE QUEUED.
;	3.	STOPPING.  QUEUES WERE EMPTY.  OUTPUT REQUEST MAY
;		BE DEPOSITED DIRECTLY IN BLKOPT.
;	4.	INACTIVE.  HARDWARE MUST BE RESTARTED ON OUTPUT
;		REQUESTS.
SUBTTL SUBROUTINES ;⊗ IMPOUT IMPOU1 IMPOU2

;HERE TO OUTPUT A BLOCK TO THE IMP
;INTERRUPTS MUST BE DISABLED
;CALL:
;	MOVE T1,[IOWD LENGTH,ADDRESS]
;	PUSHJ P,IMPOUT
;	RETURN HERE IF MUST QUEUE
;	HERE IF OUTPUT STARTED

IMPOUT::consz	pi,impbts##	;(debug) are the IMPs enabled?
	 stopcd	.+1,DEBUG,IDE	;(debug) imps dangerously enabled.
	SKIPE	BLKOPT		; ALREADY OUTPUTTING?
	POPJ	P,		;YES.
	JUMPGE	T1,CPOPJ1##	;PRETEND OK IF NOTHING THERE
	SKIPE	OUTACT		;ACTIVE?
	JRST	IMPOU2		;YES, JUST STORE NEW BLKOPT
	SETOM	OUTACT		;FLAG ACTIVE
	blko	imp,t1		;[96bit] output the first word
	  jrst	cpopj1		;[96bit] should never be here, ever.
IMPOU1:	CONO	IMP,MPPSET	;ENABLE OUTPUT HARDWARE
IMPOU2:	MOVEM	T1,BLKOPT	;STORE NEW IOWD
	JRST	CPOPJ1		;SKIP RETURN
;CODE TO CHECK HARDWARE HEALTH ;⊗ IMPCHK

;CALL:
;	PUSHJ	P,IMPCHK
;	  ERROR RETURN	...  IMP OR INTERFACE DOWN
;	  ERROR RETURN	...  IMP OR INTERFACE WAS DOWN
;	OK RETURN

IMPCHK::
NOWAITS<
	MOVEI	T4,EMPTY	;ENABLE OUTPUT FLAG TEST
	HRRM	T4,MPPINT
>;NOWAITS
	CONO	IMP,MPPSET	;MAKE SURE OUTPUT ON
	SKIPE	INPON		;WANT INPUT OPEN?
	PUSHJ	P,IMPION	;YES, MAKE SURE TURNED ON
IFN FTF2,<
	CONSO	IMP,POWER	;POWER DOWN?
	POPJ	P,		;YES
>;IFN FTF2
	CONSO	IMP,SICK	;INTERFACE ERROR?
	JRST	CPOPJ2##	;NO, DOUBLE SKIP
IFN FTF2,<
	CONSZ	IMP,DEAD	;IS IT STILL DOWN?
>;IFN FTF2
	POPJ	P,		;YES
IFN FTF2,<
	CONO	IMP,CSICK	;CLEAR FAULT
	JRST	CPOPJ1		;AND TAKE SINGLE SKIP
>;IFN FTF2
;INITIALIZE DEVICES ;⊗ IMPDWN IMPIOF IMPION BLKIPT INPON DUMMY BLKOPT OUTACT

;SUBROUTINE TO TURN THE HARDWARE OFF
IMPDWN::
IFE FTF2,<
	CONO	IMP,IFLUSH
>;IFE FTF2
IFN FTF2,<
	CONO	IMP,DOWN10+ALLENB;TURN OFF HARDWARE
>;IFN FTF2
NOWAITS<
	HLLZS	MPPINT		;DISABLE OUTPUT FLAG TEST IN SKIP CHAIN
>;NOWAITS
	SETZM	OUTACT
	SETZM	BLKIPT
	SETZM	BLKOPT

;HERE TO TURN OFF INPUT
IMPIOF::SETZM	INPON		;TURN OFF INPUT ACTIVE FLAG
	CONO	IMP,MPIENB!MPEENB	;TURN OFF INPUT
NOWAITS<
	HLLZS	MPIINT		;DISABLE INPUT FLAG TESTS
	HLLZS	MPEINT
>;NOWAITS
	POPJ	P,

;HERE TO TURN INPUT ON
IMPION::SETOM	INPON		;TURN ON FLAG FOR CLOCK
NOWAITS<
	push	p,t1		; save a scratch
	MOVEI	t1,FULL		;ENABLE INTERRUPT FLAG TESTS
	HRRM	t1,MPIINT
	MOVEI	t1,ENDIN
	HRRM	t1,MPEINT
	pop	p,t1		; restore scratch reg.
>;NOWAITS
	CONO	IMP,MPISET	;TURN ON INPUT
	CONO	IMP,MPESET
	POPJ	P,


	$LIT
	$LOW

;STORAGE

BLKIPT:	0		;BLKI POINTER
INPON:	0		;-1 IF INPUT SHOULD BE ACTIVE
DUMMY:	0		;PLACE TO PUT DISCARDED INPUT DATA

BLKOPT:	0		;BLKO POINTER
OUTACT:	0		;-1 IF OUTPUT IS ACTIVE

	END