Google
 

Trailing-Edge - PDP-10 Archives - BB-F492Z-DD_1986 - 10,7/703mon/d60ser.mac
There are 4 other files named d60ser.mac in the archive. Click here to see a list.
TITLE D60SER -- UUO AND INTERRUPT SERVICE FOR THE DL11 AND DTE-20 DN60 SERIES - V026
SUBTTL	ED FORTMILLER/EGF and JOHN SAUTER/JBS  10 SEP 85

	SEARCH	F,S
	$RELOC
	$HIGH




;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
;  OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
.CPYRT<1976,1986>
;COPYRIGHT (C) 1976,1977,1978,1979,1980,1982,1984,1986
;BY DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;ALL RIGHTS RESERVED.


;
XP	V60SER,026			;VERSION NUMBER

ENTRY	D60SER
D60SER:

;DEFINE THE DN60 FUNCTION CODES
;
	F6.RD==:1			;READ DATA
	F6.WD==:2			;WRITE DATA
	F6.RDS==:3			;READ DEVICE STATUS
	F6.WDC==:4			;WRITE DEVICE STATUS
	F6.RLS==:5			;READ LINE STATUS
	F6.WLC==:6			;WRITE LINE COMMAND
	F6.R6S==:7			;READ DN60 STATUS
	F6.W6C==:^D8			;WRITE DN60 COMMAND

	F6.QMX==:^D8			;LARGEST FUNCTION ALLOWED IN
					; .QUE11 FUNCTION

	F6.EXM==:^D9			;EXAMINE PDP11 MEMORY
	F6.DEP==:^D10			;DEPOSIT INTO PDP11 MEMORY
	F6.MAX==:^D10			;LARGEST FUNCTION CODE

;BIT DEFINITIONS IN THE (LH) OF DLXCEU

;DEFINE A BIT THAT GETS SET IN THE (LH) OF DLXCEU TO
; INDICATE THAT THE .C11UQ FUNCTION IS THE ONE BEING DONE
;
	D6.Q11==:1			;.C11QU FUNCTION IN PROGRESS

;DEFINE A BIT WHICH WHEN SET IN THE (LH) OF DLXCEU INDICATES
; THAT THE JOB WAS LOCKED BEFORE ISSUING THE CAL11. UUO. THIS
; BIT WILL NOT BE SET FOR EXM/DEP AS WE DON'T SET NSHF OR NSWP
; IN THIS CASE.
;
	D6.ALK==:2			;SET IF JOB LOCKED PRIOR TO
					; DOING .C11QU
;D60TMO	ROUTINE TO SEE IF THE CALL11 HAS TIMED OUT
;CALL	W := POINTER TO BASE TABLE
;RETURN	CPOPJ				;NOT TIMED OUT YET
;	CPOPJ1				;TIMED OUT, D60WAK HAS BEEN CALLED.

D60TMO::SKIPN	T2,DLXTIM##(W)		;SEE IF TIMING (NON 0)
	POPJ	P,			;NOT TIMING
	SKIPE	T1,DLXCEU##(W)		;CAL11. UUO BEING USED?
	CAMLE	T2,UPTIME##		;SEE IF WE TIMED OUT?
	POPJ	P,			;NOT TIMED OUT YET
	SETZM	DLXTIM##(W)		;CLEAR OUT TIME
	PUSHJ	P,D60WAK		;GET THE JOB OUT OF EW AND EXIT
	RETSKP				;SIGNAL A TIME-OUT HAS HAPPENED
;HERE TO FINISH THE SETUP WHEN THE PDP11 IS FIRST
; RECOGNIZED AS BEING A PDP11.
;
; CALL:	JRST	D60SUP			;W POINTS TO THE BASE TABLE
;
D60SUP::SETZM	DLXCEU##(W)		;CLEAR CAL11. USERS JOB NUMBER
	MOVE	T1,[XWD MC11FN,C11FTB]
	MOVEM	T1,DLXCAL##(W)		;CAL11. POINTER
	PUSH	P,J			;PRESERVE J
	MOVE	J,DLXFEK##(W)		;GET THE FEK ADDRESS
	JUMPE	J,JPOPJ##		;IF NO FEK, MUST BE A KS-10
	MOVSI	T1,FK.ONL		;GET THE ONLINE BIT
	IORB	T1,FEKBLK(J)		; AND MARK THE FEK AS ONLINE
	HRRM	W,FEKUNI(J)		;STORE THE ADDRESS OF THE BASE TABLE
	JRST	JPOPJ##			; AND RETURN
SUBTTL	CAL11. UUO

;COME HERE ON CAL11. UUO FROM COMDEV.

;CALLING SEQUENCE IS:
;	MOVE	AC,[XWD LENGTH,BLOCK]
;	CAL11.	AC,
;	  ERROR RETURN
;	OK RETURN

;BLOCK:	EXP	FUNCTION CODE
;	ARGUMENT (1) ...
;

;ENTER FROM COMDEV WITH DL10 BASE IN W, LENGTH OF BLOCK IN T3.

;COMDEV DOES THE DISPATCH BASED ON THE FOLLOWING TABLE.  THE
;  HIGH ORDER BIT, IF SET, INDICATES THAT THE USER MUST HAVE
;  THE "POKE" PRIV.


C11FTB::XWD	400000,DEP11		;(0) DEPOSIT TO -11
	XWD	400000,EXAM11		;(1) EXAMINE THE -11
	XWD	400000,QUE11		;(2) PERFORM A DN60 FUNCTION
	XWD	0,NAME11		;(3) RETURN NAME OF PGM IN 11
	XWD	0,DOWN11		;(4) IS PORT UP OR DOWN?
	XWD	400000,CPOPJ##		;(5) SEND
	XWD	400000,CPOPJ##		;(6) RECEIVE
	XWD	0,TYP11			;(7) TYPE
MC11FN==:.-C11FTB			;LENGTH OF TABLE

; VALUES OF BITS IN DLXSWD:

D60.DP==:1			;DEPOSIT
D60.EX==:2			;EXAMINE
D60.ER==:4			;ADDRESS ERROR

SUBTTL	CAL11. UUO ERROR CODES

COMMENT	\

	CODE	MEANING
	----	-------

	1	Caller does not have POKE privledges
	2	The function is undefined on this type of front end
	3	Invalid DL10 port number
	4	CAL11. facility in use, try again later
	5	No answer from the front end after 1-2 seconds
	6	Queue entry too short  (DC76 only)
	7	Not enough arguments
	10	Examine/Deposit address was invalid (more than 16
		bits or the front end flagged it as invalid), or
		the deposit data was more than 16 bits
	11	In QUE11, Illegal function code,
		Address check, Illegal byte size, Byte offset is
		outside the buffer or the buffer is too large
		 (requires more than 16 DL10 byte pointers)
	12	DTESER couldn't get any free core
	13	DTE - reload bit set or primary protocol is
		not running.
	14	DTE - there never will be enough EVM

\
;SUBROUTINE TO EXAMINE OR DEPOSIT PDP11 MEMORY
;
; CALL:	MOVE	T3,+LENGTH
;	MOVEI	W,ADDRESS OF THE BASE TABLE
;
DEP11:	SOJLE	T3,ECOD7##		;MUST HAVE 2 ARGS (ADDR & DATA)
	PUSHJ	P,GET1WD		;GET THE ADDRESS TO DEPOSIT INTO
	MOVE	T3,T1		
	PUSHJ	P,GET1WD		;GET THE WORD TO DEPOSIT
	SKIPL	T4,T1			;MAKE SURE DEPOSIT DATA IS
	CAILE	T4,177777		; IN THE RANGE OF 0-177777
	PJRST	ECOD10##		;**ERROR-10** BECAUSE DEPOSIT
					; DATA TO LARGE.
	HRLI	T4,-1			;FLAG ITS A DEPOSIT
	MOVEI	T1,D60.DP		;DEPOSIT FUNCTION
	JRST	DEPEXM			;NOW GO ATTEMPT TO DO THE DEPOSIT

EXAM11:	JUMPLE	T3,ECOD7##		;MUST HAVE AN ARG.
	PUSHJ	P,GET1WD		;GET THE ADDRESS TO EXAMINE
	MOVE	T3,T1
	SETZ	T4,			;ZERO THE DATA WORD AND FLAG EXAMINE
	MOVEI	T1,D60.EX		;EXAMINE FUNCTION

DEPEXM:	SKIPL	T3			;SEE IF ADDRESS IS IN THE
	CAILE	T3,177777		; RANGE OF 0-177777
	PJRST	ECOD10##		;**ERROR-10** BECAUSE OF ILLEGAL ADDRESS
	JSP	T2,CHKCEU		;SEE IF ANYONE USING CAL11
					; **ERROR-4** IF SO
	MOVEI	P1,D6F.ED		;GET THE EXAMINE/DEPOSIT FUNCTION
	JRST	@DLXCEV##(W)		; AND LET THE DRIVER DO THE REST

;SUBROUTINE TO RETURN THE TYPE OF PDP11
;
TYP11:	MOVE	T1,DLXTYP##(W)		;GET TYPE CODE FOR DN60
	PJRST	STOTC1##		;RETURN DN60 TYPE
;REMOVE ENTIRE GETADR ROUTINE 	;[EDIT 023]
;HERE TO GET AN EXAMINE/DEPOSIT ADDRESS
;
; CALL:	JSP	T4,GETADR		;T3 CONTAINS THE LENGTH
;	RETURN				;UNLESS LENGTH TOO SHORT, THEN
;					; GIVE ERROR-7 TO THE USER. ON
;					; NON ERROR RETURN:
;					;  AC (W) IS SAVED ON THE PDL
;					;  AC (T3) CONTAINS THE ADDRESS
;
GETADR:	SOJL	T3,ECOD7##		;**ERROR-7** IF NOT ENOUGH ARGS
	PUSH	P,W			;SAVE AC (W)
	PUSHJ	P,GETWD1##		;GET THE ADDRESS TO EXAMINE/DEPOSIT
	MOVE	T3,T1			;COPY ADDRESS HERE
	JRST	(T4)			;RETURN TO THE CALLER

;HERE TO PERFORM .C11QU (2) FUNCTION
;
; CALL:	MOVE	T3,+LENGTH
;	MOVEI	W,ADDRESS OF THE BASE TABLE
;
QUE11:	SUBI	T3,5			;SEE IF ENOUGH ARGS SUPPLIED
	PJUMPL	T3,ECOD7##		;**ERROR-7** BECAUSE NOT ENOUGH ARGS
	JSP	T2,CHKCEU		;SEE IF ANYONE USING THE CAL11. UUO
					; **ERROR-4** IF SO
	PUSHJ	P,GET1WD		;GET  LINE NUMBER,,DEVICE NUMBER
	MOVE	P2,T1			;SAVE LINE NUMBER,,DEVICE NUMBER
	PUSHJ	P,GET1WD		;GET  NUMBER OF BYTES,,FUNCTION CODE
	HRRZ	P4,T1			;REMEMBER THE FUNCTION CODE
	CAIL	P4,1			;RANGE CHECK THE FUNCTION
	CAILE	P4,F6.QMX		; FOR A RANGE OF 1-10.
	PJRST	ECOD11##		;**ERROR-11**  ILLEGAL FUNCTION CODE
	HLL	P4,T1			;REMEMBER TOTAL NUMBER OF BYTES
	MOVSS	P4			;FUNCTION CODE,,NUMBER OF BYTES
	PUSHJ	P,GET1WD		;GET  LENGTH OF BUFFER,,BUFFER ADDRESS
	MOVE	P3,T1			;REMEMBER LENGTH,,BUFFER ADDRESS
	PUSHJ	P,ADRCHK		;ADDRESS CHECK THE BUFFER
	PJRST	ECOD11##		;**ERROR-11** BECAUSE OF ADDRESS CHECK
	HLRZ	T4,P3			;GET THE LENGTH OF THE BUFFER
	ANDI	P3,-1			;LEAVE ONLY THE BUFFER ADDRESS
	PUSHJ	P,GET1WD		;GET  NUMBER OF BYTES PER WORD(12 BITS),
					; POSITION OF FIRST BYTE (24 BITS)
	MOVE	F,T1			;GET THE POSITION IN HERE
	TLZ	F,777700		;KEEP ONLY POSITION OF THE FIRST BYTE
	LSH	T1,-^D24		;KEEP ONLY THE NUMBER OF BYTES PER WORD
;%%%	MOVEI	S,4			;ASSUME MIN NUMBER OF BYTES PER
;%%%					; WORD FOR A DTE
;%%%	SKIPL	P1			;BUT ARE WE TALKING TO A DTE?
	MOVEI	S,3			;NO SET MIN NUMBER OF BYTES PER
					; WORD FOR A DL10
	CAML	T1,S			;RANGE CHECK BYTE SIZE
	CAILE	T1,6			; FOR A RANGE OF (3-6 FOR A DL10)
					; AND (4-6 FOR A DTE)
	PJRST	ECOD11##		;**ERROR-11** ILLEGAL BYTE SIZE
	MOVE	S,T1			; AND REMEMBER IT.
;
;TO COMPUTE THE FIRST ADDRESS USING IN THE BUFFER
;
;	(BYTE POSITION)/(BYTE SIZE)+(BUFFER ADDRESS)
;	AC(U) IS USED TO REMEMBER THE REMAINDER FROM
;	 (BYTE POSITION)/(BYTE SIZE) FOR LATER USE
;
	MOVE	T1,F			;GET BYTE POSITION
	IDIV	T1,S			;(BYTE POSITION)/(BYTE SIZE)
	MOVE	U,T2			;REMEMBER THE REMAINDER
	ADD	T1,P3			;PRESTO, THE FIRST ADDRESS
;
;TO COMPUTE THE LAST ADDRESS USED IN THE BUFFER
;
;	(((BYTE POSITION)+(NUMBER OF BYTES)-1)/(BYTE SIZE))+(BUFFER ADDRESS)
;
	MOVE	T2,F			;GET POSITION OF THE FIRST BYTE
	ADDI	T2,-1(P4)		;ADD IN THE NUMBER OF BYTES - 1
	IDIV	T2,S			;NOW DIVIDE BY THE BYTE SIZE
	ADD	T2,P3			;ADD THE BUFFER ADDRESS AND
					; PRESTO THE LAST ADDRESS USED.
	MOVE	T3,P3			;GET THE BUFFER ADDRESS
	ADDI	T3,-1(T4)		; AND ADD THE LENGTH-1
	CAMLE	T2,T3			;SEE IF COMPUTED BUFFER
					; IS WITHIN THE REAL BUFFER
	PJRST	ECOD11##		;**ERROR-11** BECAUSE OF ADDRESS CHECK
;
;TO COMPUTE THE WORD COUNT
;
;	(LAST ADDRESS)-(FIRST ADDRESS)+1
;
	SUBI	T2,-1(T1)		;COMPUTE LENGTH OF BUFFER WHICH
					; WE'LL REFER TO AS  "WORD COUNT"
	MOVEI	P1,D6F.QU		;GET THE QUEUE11 FUNCTION CODE
	JRST	@DLXCEV##(W)		; AND LET THE DRIVER TO THE REST
;COME HERE TO RETURN THE NAME OF THE PDP-11 PROGRAM.
; IN THE CASE OF A PDP11 ON A DL10 THE NAME RETURNED
; WILL BE THE NAME THE PDP11 GAVE US BUT ON A DTE
; THE NAME WILL BE RETURNED FROM THE BASE TABLE.
;
; CALL:	PUSHJ	P,NAME11		;W POINTS TO THE BASE TABLE
;
NAME11:	MOVE	T1,DLXNMT##(W)		;PICK UP NAME
	PJRST	STOTC1##		;SKIP RETURN, GIVING  NAME


;COME HERE TO TELL THE STATUS OF THE PDP-11 PROGRAM.
; RETURN A 1 TO THE USER IF THE PDP11 IS UP
; OR 0 IF ITS DOWN.
;					;W POINTS TO THE BASE TABLE

DOWN11:	MOVEI	P1,D6F.UD		;FUNCTION IS UP/DOWN
	PUSHJ	P,@DLXCEV##(W)		;CALL THE DRIVER SPECIFIC CODE
	TDZA	T1,T1			;PDP-11 IS DOWN
	MOVEI	T1,1			;UP.
	PJRST	STOTC1##		;SKIP RETURN.
;THIS ROUTINE IS CALLED TO PUT A JOB INTO
; THE EVENT WAIT STATE.
;
; CALL:	PUSHJ	P,EVWAIT		;W POINTS TO THE BASE TABLE
;	RETURN				;ALWAYS
;
D60EVW::PUSH	P,M			;SAVE "M"
	JRST	D60EV2			;SEE IF A MSG CAME UNEXPECTEDLY
D60EV1:	MOVEI	T1,EV.D60		;THE EVENT WAIT CODE FOR THE DN60
	MOVE	J,.CPJOB##		;GET THE JOB NUMBER
	PUSHJ	P,FSLEEP##		;PUT JOB INTO EVENT WAIT
D60EV2:	SKIPE	DLXTIM##(W)		;SEE IF A DN60 WAKE
	  JRST	D60EV1			;NO, IT WAS SOME OTHER CLOWN
					; SO GO WAIT SOME MORE.
IFE FTKS10,<				;KS FREES IT BY ITSELF
	SETZM	DLXCEU##(W)		;FREE UP THE CAL11. UUO
>
	PJRST	MPOPJ##			;RESTORE "M" AND RETURN TO
					; THE CALLER

;THIS ROUTINE IS CALLED TO GET A DN60 JOB OUT OF
; EVENT WAIT
;
; CALL:	PUSHJ	P,D60WAK		;T1 CONTANS JOB NUMBER
;					;W POINTS TO THE BASE TABLE
;	RETURN				;WITH DLXTIM = 0
;
D60WAK::PUSH	P,J			;SAVE J
	SETZM	DLXTIM##(W)		;FLAG WE GOT THE JOB OUT OF EW
	PUSHJ	P,D60LKC		;SEE IF WE ARE TO UNLOCK HIM
					; ALSO RETURNS JOB NUMBER IN T1
	  PUSHJ	P,D60ULJ		;YES, WE LOCKED HIM SO UNLOCK HIM
	POP	P,J			;RESTORE J
	PJRST	EWAKE##			;GO GET HIM OUT OF EW

;THIS ROUTINE IS CALLED TO PUT THE TIME IN
; THE BASE TABLE THAT THE JOB TIMES OUT AT.
;
; CALL:	PUSHJ	P,SETTIM		;T1 CONTAINS NUMBER OF SECONDS
;					;W  POINTS TO THE BASE TABLE
;	RETURN				;ALWAYS
;
D60TIM::IMULI	T1,JIFSEC##		;CONVERT TO JIFFYS
	ADD	T1,UPTIME##		;ADDING THIS MAKES THE TIME
					; THAT WE TIME-OUT AT.
	MOVEM	T1,DLXTIM##(W)		;SAVE SO ONCE-A-SECOND CODE
					; WILL KNOW THE TIME-OUT TIME
	POPJ	P,			;RETURN TO CALLER
;SUBROUTINE TO GET 1 WORD FROM THE USERS BLOCK
;
; CALL:	PUSHJ	P,GET1WD		;
;	RETURN				;T1 HAS THE WORD
;
GET1WD:	PUSH	P,W			;MUST PRESERVE AC(W)
	PUSHJ	P,GETWD1##		;GET A WORD FROM USER BLOCK
	PJRST	WPOPJ##			;RESTORE AC(W)
					; AND RETURN WITH WORD IN AC(T1)

;SUBROUTINE TO CHECK IF THE CAL11. UUO IS IN USE
;
; CALL:	JSP	T2,CHKCEU		;
;	RETURN				;IF NOT IN USE, IF IN
;					; USE GIVE **ERROR-4**
;
CHKCEU:	HRRZ	S,DLXCEU##(W)		;GET JOB NUMBER FROM BASE TABLE
	CAMN	J,S			;IS THIS THE USER WHO IS WAITING?
	  SETZM	DLXCEU##(W)		;YES, MUST HAVE USED ^C
	SKIPE	DLXCEU##(W)		;SEE IF ANY USER WAITING
	  PJRST	ECOD4##			;**ERROR-4** BECAUSE UUO IS BEING USED
	PJRST	(T2)			;RETURN TO THE CALLER

;SUBROUTINE TO UNLOCK THE JOB
;
; CALL:	PUSHJ	P,D60ULJ		;WITH JOB NUMBER IN T1
; CALL:	PUSHJ	P,D60UNL		;IF JOB NUMBER UNKNOWN (UUO LEVEL)
;	RETURN				;T1 PRESERVED, J CONTAINS JOB NUMBER
;
D60ULJ::SKIPA	J,T1			;GET JOB NUMBER FROM T1
D60UNL::MOVE	J,.CPJOB##		;GET THE JOB NUMBER
	PUSH	P,T1			;SAVE THIS
	MOVSI	T1,NSHF!NSWP		;THE LOCK BITS
	ANDCAM	T1,JBTSTS##(J)		;CLEAR THE JOB
	PJRST	TPOPJ##			;RESTORE T1 AND RETURN

;SUBROUTINE TO DETERMINE IF THE JOB IS TO BE UNLOCKED
; BEFORE RETURNING THE TO USER
;
; CALL:	PUSHJ	P,D60LKC		;W POINTS TO THE BASE TABLE
;	  RETURN			;IF NEED TO UNLOCK AND T1 CONTAINS JOB NUMBER
;	RETURN				;IF NOT TO UNLOCK JOB AND T1
;					; CONTAINS JOB NUMBER
;
D60LKC::MOVE	T1,DLXCEU##(W)		;GET BITS,,JOB NUMBER
	TLZN	T1,D6.Q11		;QUE11 FUNCTION?
	  PJRST	CPOPJ1##		;NO, EXM/DEP
	TLZN	T1,D6.ALK		;YES, WAS HE LOCKED BEFORE CAL11. ?
	  POPJ	P,			;NO, WE MUST UNLOCK HIM
	PJRST	CPOPJ1##		;YES, DON'T UNLOCK HIM
;SUBROUTINE TO VERIFY THAT THE REQUIRED PAGES ARE
;  VALID AND IN CORE.  IF VM IF THE PAGE(S) ARE NOT IN
;  CORE ATTEMPT TO BRING THEM IN.
;
; CALL:	PUSHJ	P,ADRCHK		;P3 CONTAINS  XWD LENGTH,START ADDRESS
;	RETURN				;IF ANY ADDRESS ERRORS
;	RETURN				;IF BUFFER IS IN CORE
;
ADRCHK:	HRRZ	T1,P3			;LOW ADDRESS OF BUFFER
	HLRZ	T2,P3			;THE LENGTH OF THE BUFFER
	ADDI	T2,-1(P3)		;LAST ADDRESS OF THE BUFFER
	PUSH	P,T2			;SAVE THE LAST ADDRESS
ADRC1:	PUSHJ	P,IADRCK##		;MAKE SURE VALID ADDRESS
	  PJRST	T2POPJ##		;BAD ADDR, CLEAN PDL, NON-SKIP RETURN
	  PJRST	UUOFLT##		;PAGE FAULT - CALL THE PFH
	ADDI	T1,PAGSIZ##		;GO TO THE NEXT PAGE
	CAMGE	T1,(P)			; BEYOND THE END OF OUR BUFFER
	JRST	ADRC1			;NO, CHECK THIS PAGE
	POP	P,T1			;GET THE LAST ADDRESS OF THE BUFFER
	PUSHJ	P,IADRCK##		;CHECK THE LAST ADDRESS
	  POPJ	P,			;BAD ADDRESS
	  PJRST	UUOFLT##		;PAGE FAULT - CALL THE PFH
	JRST	CPOPJ1##		;SUCCESS
	$HIGH

	$LIT

D60END::END