Trailing-Edge
-
PDP-10 Archives
-
tops10_703_distr_bb-x140b-sb
-
10,7/703mon/d6sint.mac
There are 4 other files named d6sint.mac in the archive. Click here to see a list.
TITLE D6SINT -- UUO AND INTERRUPT SERVICE FOR THE DTE-20 DN60 SERIES - V031
SUBTTL ED FORTMILLER/EGF 10 SEP 85
SEARCH F,S,DTEPRM
$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 V6SINT,031 ;VERSION NUMBER
ENTRY D6SINT
D6SINT:
;THESE BITS ARE USED IN THE (LH) OF FEKUNI
;
D6.OUT==1B0 ;EXPECTING A TO-11 DONE INTERRUPT
D6.INP==1B1 ;EXPECTING A TO-10 DOORBELL INTERRUPT
D6.TTD==1B2 ;EXPECTING A TO-10 DONE INTERRUPT
D6.IND==1B3 ;RECEIVED THE TO-10 DONE INTERRUPT
D6.FLG==17B4 ;MASK OF ALL BITS
SUBTTL FORMAT OF DATA MESSAGES BETWEEN 10 AND 11
REPEAT 0,<
25 May 77
Edit 7
DAS60 Write Functions
To perform the DAS60 functions 2, 4, 6, and 8 using the DTE the 10 will send a
direct message followed by the data in the indirect message.
!-------------------------------------------------------------------------!
! MSG COUNT IN BYTES ! PROTOCOL FUNCT CODE (.EMD6D) ! !
!-------------------------------------------------------------------------!
! PROTOCOL DEV CODE (.EMD60) ! SPARE WORD ! !
!-------------------------------------------------------------------------!
! 0 !DAS60 FUN CODE ! DAS60 LINE # ! DAS60 DEV # ! !
!-------------------------------------------------------------------------!
! LENGTH (MSB) ! LENGTH (LSB) ! ! ! !
!-------------------------------------------------------------------------!
MSG COUNT IN BYTES The number of bytes in this message
header = 14.
PROTOCOL FUNCT CODE .EMD6D DAS60 data
PROTOCOL DEV CODE .EMD60
SPARE WORD Not used
0 Not used
DAS60 FUNCTION CODE 2, 4, 6, or 8
DAS60 LINE NUMBER Line number from the CAL11. blk
DAS60 DEVICE NUMBER Device number from the CAL11. blk
LENGTH Length of the data in bytes in the
indirect message. The maximum length
will be 4095 bytes.
The 11 should respond with the following direct message.
!-------------------------------------------------------------------------!
! MSG COUNT IN BYTES ! PROTOCOL FUNCT CODE (.EMD6D) ! !
!-------------------------------------------------------------------------!
! PROTOCOL DEV CODE (.EMD60) ! SPARE WORD ! !
!-------------------------------------------------------------------------!
! RESULT CODE !DAS60 FUN CODE ! DAS60 LINE # ! DAS60 DEV # ! !
!-------------------------------------------------------------------------!
! LENGTH (MSB) ! LENGTH (LSB) ! ! ! !
!-------------------------------------------------------------------------!
MSG COUNT IN BYTES The number of bytes in this message
header = 14.
PROTOCOL FUNCT CODE .EMD6D DAS60 data
PROTOCOL DEV CODE .EMD60
SPARE WORD Not used
DAS60 RESULT CODE 1, 2, or 3
DAS60 FUNCTION CODE 2, 4, 6, or 8
DAS60 LINE NUMBER Line number giving result code for
DAS60 DEVICE NUMBER Device number giving result code for
LENGTH Number of data bytes the 11 absorbed
from the indirect portion
DAS60 Read Functions
To perform the DAS60 functions 1,3,5, or 7 using the DTE the 10 will request
data by using a direct message.
!-------------------------------------------------------------------------!
! MSG COUNT IN BYTES ! PROTOCOL FUNCT CODE (.EMD6D) ! !
!-------------------------------------------------------------------------!
! PROTOCOL DEV CODE (.EMD60) ! SPARE WORD ! !
!-------------------------------------------------------------------------!
! 0 !DAS60 FUN CODE ! DAS60 LINE # ! DAS60 DEV # ! !
!-------------------------------------------------------------------------!
! LENGTH (MSB) ! LENGTH (LSB) ! ! ! !
!-------------------------------------------------------------------------!
MSG COUNT IN BYTES The number of bytes in this message
header = 14.
PROTOCOL FUNCT CODE .EMD6D DAS60 data
PROTOCOL DEV CODE .EMD60
SPARE WORD Not used
0 Not used
DAS60 FUNCTION CODE 2, 4, 6, or 8
DAS60 LINE NUMBER Line number from the CAL11. blk
DAS60 DEVICE NUMBER Device number from the CAL11. blk
LENGTH Length of the data in bytes in the
indirect message. The maximum length
will be 4095 bytes.
The 11 should respond with a direct message and the data should follow in the
indirect message.
!-------------------------------------------------------------------------!
! MSG COUNT IN BYTES ! PROTOCOL FUNCT CODE (.EMD6D) ! !
!-------------------------------------------------------------------------!
! PROTOCOL DEV CODE (.EMD60) ! SPARE WORD ! !
!-------------------------------------------------------------------------!
! RESULT CODE !DAS60 FUN CODE ! DAS60 LINE # ! DAS60 DEV # ! !
!-------------------------------------------------------------------------!
! LENGTH (MSB) ! LENGTH (LSB) ! ! ! !
!-------------------------------------------------------------------------!
MSG COUNT IN BYTES The number of bytes in this message
header = 14.
PROTOCOL FUNCT CODE .EMD6D DAS60 data
PROTOCOL DEV CODE .EMD60
SPARE WORD Not used
DAS60 RESULT CODE 1, 2, or 3
DAS60 FUNCTION CODE 1, 3, 5, or 7
DAS60 LINE NUMBER Line number giving result and data for
DAS60 DEVICE NUMBER Device number giving result and data for
LENGTH Length of the data in bytes in the
indirect message
Deposit Function
To perform the deposit function (DAS60 function code 10) the 10 will send the
following direct message:
!-------------------------------------------------------------------------!
! MSG COUNT IN BYTES ! PROTOCOL FUNCT CODE (.EMD6D) ! !
!-------------------------------------------------------------------------!
! PROTOCOL DEV CODE (.EMD60) ! SPARE WORD ! !
!-------------------------------------------------------------------------!
! 0 !DAS60 FUN CODE ! ADR (MSB) ! ADR (LSB) ! !
!-------------------------------------------------------------------------!
! DATA (MSB) ! DATA (LSB) ! ! ! !
!-------------------------------------------------------------------------!
MSG COUNT IN BYTES The number of bytes in this message
header = 14.
PROTOCOL FUNCT CODE .EMD6D DAS60 data
PROTOCOL DEV CODE .EMD60
SPARE WORD Not used
0 Not used
DAS60 FUNCTION CODE 10
ADR Address to deposit the data into
DATA Data to be deposited into ADR
The 11 should respond with the result code:
!-------------------------------------------------------------------------!
! MSG COUNT IN BYTES ! PROTOCOL FUNCT CODE (.EMD6D) ! !
!-------------------------------------------------------------------------!
! PROTOCOL DEV CODE (.EMD60) ! SPARE WORD ! !
!-------------------------------------------------------------------------!
! RESULT CODE !DAS60 FUN CODE ! ! ! !
!-------------------------------------------------------------------------!
MSG COUNT IN BYTES The number of bytes in this message
header = 10.
PROTOCOL FUNCT CODE .EMD6D DAS60 data
PROTOCOL DEV CODE .EMD60
SPARE WORD Not used
DAS60 RESULT CODE 1, 2, or 3
DAS60 FUNCTION CODE 10
Examine Function
To perform the examine function (DAS60 function code 9) the 10 will send a
direct message containing the address to be examined:
!-------------------------------------------------------------------------!
! MSG COUNT IN BYTES ! PROTOCOL FUNCT CODE (.EMD6D) ! !
!-------------------------------------------------------------------------!
! PROTOCOL DEV CODE (.EMD60) ! SPARE WORD ! !
!-------------------------------------------------------------------------!
! 0 !DAS60 FUN CODE ! ADR (MSB) ! ADR (LSB) ! !
!-------------------------------------------------------------------------!
MSG COUNT IN BYTES The number of bytes in this message
header = 12.
PROTOCOL FUNCT CODE .EMD6D DAS60 data
PROTOCOL DEV CODE .EMD60
SPARE WORD Not used
0 Not used
DAS60 FUNCTION CODE 9
ADR Address to examine
The 11 then should respond with the data:
!-------------------------------------------------------------------------!
! MSG COUNT IN BYTES ! PROTOCOL FUNCT CODE (.EMD6D) ! !
!-------------------------------------------------------------------------!
! PROTOCOL DEV CODE (.EMD60) ! SPARE WORD ! !
!-------------------------------------------------------------------------!
! RESULT CODE !DAS60 FUN CODE ! ADR (MSB) ! ADR (LSB) ! !
!-------------------------------------------------------------------------!
! DATA (MSB) ! DATA (LSB) ! ! ! !
!-------------------------------------------------------------------------!
MSG COUNT IN BYTES The number of bytes in this message
header = 14.
PROTOCOL FUNCT CODE .EMD6D DAS60 data
PROTOCOL DEV CODE .EMD60
SPARE WORD Not used
DAS60 RESULT CODE 1, 2, or 3
DAS60 FUNCTION CODE 9
ADR Address examined
DATA The data in ADR
>;END REPEAT 0
;D6SDSP ROUTINE CALLED BY NETSER THAT DISPATCHES TO THE PROPER FEK FUNCTION
;CALL T1 := FUNCTION CODE
; J := FEK ADDRESS
;RETURN CPOPJ
D6SDSP::CAIL T1,FF.ONC ;RANGE CHECK THE FUNCTION
CAILE T1,FF.CPW ; CODE AND STOP IF BAD
STOPCD CPOPJ,DEBUG,WFC,;++ BAD FUNCTION CODE TO FEK
JRST @.+1(T1) ;DISPATCH TO APPRIOATE ROUTINE
IFIW CPOPJ## ;ONCE ONLY CODE
IFIW D6SSEC ;ONCE/SECOND CODE
IFIW CPOPJ## ;SET UP A READ REQUEST
IFIW CPOPJ## ;SET UP A WRITE REQUEST
IFIW CPOPJ## ;CRASH THE FEK (CPU WENT DOWN?)
IFIW D6SDWN ;EXIT PRIMARY PROTOCOL
IFIW D6SUP ;START PRIMARY PROTOCOL
IFIW CPOPJ## ;WE DON'T CARE ABOUT STATION CONTROL
IFIW CPOPJ## ;SYSTEM SLEEP. WHAT SHOULD I DO?
IFIW CPOPJ## ;SYSTEM WAKE. WHAT SHOULD I DO?
;THE CALL11 ENTRY VECTOR
;CALL PUSHJ P,@DLXCEV(W) ;P1 := FUNCTION CODE, W := BASE TABLE ADDRESS
D6SCEV::JRST D6SUD ;UP/DOWN INDICATION
JRST D6SQU ;QUEUE11 FUNCTION
JRST D6SED ;EXAMINE/DEPOSIT FUNCTION
D6SSEC: HRRZ W,FEKUNI(J) ;PICK UP BASE TABLE ADDRESS
JUMPE W,CPOPJ## ;RETURN IF NONE
PUSHJ P,D60TMO## ;SEE IF A JOB HAS TIMED OUT
POPJ P, ;IF NO ONE TIMED OUT, RETURN
PUSH P,F ;SAVE F AND
PUSH P,P1 ; P1
PUSHJ P,RTNEVM ;GIVE BACK EVM IF WE HAVE ANY
MOVE F,DLXWIN##(W) ;XWD CPU,DTE
PUSHJ P,GTETDS## ;POINT F AT DTE CONTROL BLOCK
PUSHJ P,DTECLR## ;CLEANUP QUEUES IF ANY
POP P,P1 ;RESTORE P1
JRST FPOPJ## ; RESTORE F AND RETURN
;D6SUP ROUTINE CALLED WHEN DTE ENTERS PRIMARY PROTOCOL
;CALL P1 := XWD CPU,DTE
;RETURN CPOPJ
D6SUP: PUSHJ P,SETWJ ;POINT W TO BASE TABLE AND J TO FEK
PJRST D60SUP## ;USE COMMON CODE FOR THE SETUP
;D6SDWN ROUTINE CALLED WHEN THE DTE EXITS PRIMARY PROTOCOL
;CALL P1 := XWD CPU,DTE
;RETURN CPOPJ
D6SDWN: PUSHJ P,SETWJ ;POINT W TO BASE TABLE AND J TO FEK
SKIPE T1,DLXCEU##(W) ;IS THERE A CAL11. USER?
PUSHJ P,D60WAK## ;YES, GO GET HIM OUT OF EVENT WAIT
HLLZS FEKUNI(J) ;NO MORE ONCE A SECOND CODE
MOVSI T1,FK.ONL ;ON-LINE BIT
ANDCAM T1,FEKBLK(J) ;CLEAR IT
PJRST RTNEVM ;IF ANY EVM GIVE IT BACK
; AND RETURN TO DTESER
;HERE TO EXAMINE OR DEPOSIT PDP11 MEMORY VIA THE DTE
;
; CALL: JRST D6SED ;J CONTAINS JOB NUMBER
; ;T1 FUNCTION CODE
; ;T3 ADDRESS
; ;T4 DATA TO DEPOSIT
; ;W POINTS TO THE BASE TABLE
;
D6SED: HRRZM J,DLXCEU##(W) ;STORE OUR JOB NUMBER AND INDICATE
; EXM/DEP BY 0 IN THE (LH)
SETZM DLXEVM##(W) ;WE DON'T USE EVM
MOVE T1,[EXP F6.DEP## ;MAKE A DN60 FUNCTION CODE
EXP F6.EXM##]-1(T1) ; OUT OF THE CAL11. CODE
SETZ P2, ;DIRECT MESSAGE TO PDP11
PUSHJ P,DTEQ ;SEND THE DEP/EXM REQ TO THE 11
JRST NFCPPD ;ERROR
PJUMPE T2,ECOD5## ;**ERROR-5** BECAUSE OF TIMEOUT
; (TIMEOUT IS 0 RESULT CODE)
CAIE P2,1 ;SEE IF GOOD RESULT CODE
PJRST ECOD10## ;**ERROR-10** BECAUSE OF ILLEGAL ADDRESS
CAIN P2,F6.DEP ;WAS IT DEPOSIT?
PJRST CPOPJ1## ;YES, GIVE SKIP RETURN
MOVE T1,P4 ;COPY EXAMINE DATA
PJRST STOTC1## ;GIVE USER THE DATA HE REQUESTED
;HERE IF ON ERROR RETURN FROM THE CALL TO DTEQ
;
NFCPPD: PJUMPE T1,ECOD12## ;**ERROR-12** BECAUSE DTESER COULDN'T
; GET ANY FREE CORE.
PJRST ECOD13## ;**ERROR-13** BECAUSE RELOAD BIT SET
; OR PRIMARY PROTOCOL NOT RUNNING.
;HERE TO PERFORM THE DTE PORTION OF THE .C11QU FUNCTION
;
;AC CONTENTS AT THIS TIME
;
; T1 FIRST ADDRESS IN THE BUFFER TO BE USED
; T2 POSITIVE COMPUTED WORD COUNT
; T3 N/A, WILL NOW BECOME A SCRATCH REGISTER
; T4 LENGTH, WILL NOW BECOME A SCRATCH REGISTER
; P2 LINE NUMBER,,DEVICE NUMBER
; P3 0,,START OF BUFFER, WILL NOW BE A SCRATCH
; REGISTER.
; P4 FUNCTION CODE,,NUMBER OF BYTES
; F POSITION OF FIRST BYTE
; J JOB NUMBER, WILL NOW CONTAIN INDEX POINTER TO WINDOW
; S BYTE SIZE (THE NUMBER OF BYTES PER WORD)
; U REMAINDER FROM (BYTE POSITION)/(BYTE SIZE)
; W POINTER TO BASE TABLE
;
D6SQU: HRRZ T3,P4 ;GET NUMBER OF BYTES
CAILE T3,^D4095 ;IS IT REASONABLE?
PJRST ECOD11## ;**ERROR-11** BECAUSE OF TOO MANY
; BYTES IN REQUEST.
MOVE T3,T2 ;NUMBER OF WORDS OF DATA
EXCH T1,T3 ;T1 = NUMBER OF WORDS
; T3 = USER VIRTUAL ADDRESS OF DATA
SUBM T3,P3 ;DIFFERENCE BETWEEN BUFFER AND
; START OF DATA NOW IN P3
TLO J,D6.Q11## ;FLAG DOING .C11QU FUNCTION
MOVEM J,DLXCEU##(W) ;MAKE THE CAL11. UUO BUSY
PUSHJ P,GTEVBF## ;MAP USER BUFFER INTO EVM FOR DTE
; (ONLY START WHERE HIS REAL
; DATA STARTS - NOT THE BEGINNING
; OF THE BUFFER)
JRST [SETZM DLXCEU##(W) ;FREE UP THE CAL11 UUO
PJRST ECOD14##] ;**ERROR-14** BECAUSE
; THERE NEVER WILL BE EVOUGH EVM.
HRLZM T1,DLXEVM##(W) ;SAVE EV PAGE # AND # OF EXEC PAGES
HRRM T3,DLXEVM##(W) ;SAVE THE EXEC VIRTUAL ADDRESS
SUB T3,P3 ;POINT TO BEGINNING OF BUFFER SO
; ADJBP WILL POINT TO CORRECT
; DATA. THE ADDRESS IN T3 MAY
; NOT BE MAPPED INTO EVM BUT AFTER
; ADJUSTING THE BYTE POINTER WE
; HAD BETTER BE POINTING INTO EVM.
TLO J,D6.ALK## ;GUESS ALREADY LOCKED
MOVSI T1,NSHF!NSWP ;LOCK BITS
TDNE T1,JBTSTS##(J) ;ALREADY LOCKED?
IORM J,DLXCEU##(W) ;YES, SET D6.ALK SO LATER
; WE DON'T UNLOCK HIM
IORM T1,JBTSTS##(J) ;LOCK THE JOB (EVEN IF ALREADY LOCKED)
MOVE T1,S ;CAN'T INDEX OFF OF S
HLL T3,[POINT 8, ;4 .EQ. 8 BIT BYTES
POINT 7, ;5 .EQ. 7 BIT BYTES
POINT 6,]-4(T1) ;6 .EQ. 6 BIT BYTES
HLRZ T1,P4 ;GET DN60 FUNCTION CODE FOR CALL TO DTEQ
HRRZ P3,P4 ;GET COUNT OF BYTES FOR CALL TO DTEQ
MOVE T4,P3 ;DITTO
ADJBP F,T3 ;BYTE POINTER TO FIRST BYTE OF
; USER DATA
MOVE P4,F ;COPY POINTER HERE
TRNE T1,1 ;SEE IF WRITING
DMOVEM P3,DLXICI##(W) ;READING, SAVE COUNT AND POINTER
HRRZ T3,P2 ;GET DEVICE NUMBER
ANDI T3,377 ;KEEP ONLY DEVICE NUMBER BITS
LSH P2,-^D10 ;POSITION THE LINE NUMBER
ANDI P2,377*400 ;KEEP ONLY THE 8 BITS OF LINE NUMBER
IORI T3,(P2) ;INCLUDE THE LINE NUMBER
SETZ P2, ;ASSUME READING
TRNN T1,1 ;SEE IF WE GUESSED RIGHT
MOVEI P2,EM.IND ;NO, WRITING SO ITS INDIRECT
PUSHJ P,DTEQ ;SEND A MESSAGE TO THE PDP11
PJRST NFCPPD ;NO FREE CORE OR PRIMARY
; PROTOCOL IS DOWN.
PJUMPE P2,ECOD5## ;**ERROR-5** BECAUSE OF TIMEOUT
HRRZ T1,P2 ;GET THE RESULT CODE
HRL T1,P4 ; AND THE NUMBER OF BYTES
PUSHJ P,PUTWD1## ;NOW GIVE USER THE LENGTH,,RESULT CODE
PJRST CPOPJ1## ;GIVE SKIP RETURN
;HERE TO TELL THE STATUS OF THE PDP11 ON THE DTE
;
; CALL: JRST D6SUD ;W POINTS TO THE BASE TABLE
;
D6SUD: MOVSI T1,FK.ONL ;SEE IF ON-LINE BIT SET
TDNE T1,@DLXFEK##(W) ;TEST IT
AOS (P) ;UP
POPJ P, ;RETURN
;ROUTINE TO POINT W AT THE DL10 BASE TABLE
; AND J AT THE FEK.
;
; CALL: PUSHJ P,SETWJ ;P1 XWD CPU,DTE
; RETURN ;ALWAYS
;
SETWJ: HLRZ T1,P1 ;GET THE CPU #
;%%% ANDI T1,7 ;MASK OUT THE SIGN BIT
LSH T1,2 ;CPU NUMBER *4
HRRZ W,P1 ;GET THE DTE #
ADD W,T1 ;GET THE INDEX
MOVE W,DTEBAS##(W) ;POINT TO THE BASE TABLE
MOVE J,DLXFEK##(W) ;POINT TO THE FEK
POPJ P, ;RETURN TO THE CALLER
;ROUTINE TO RETURN EVM IF WE HAVE ANY
;
; CALL: PUSHJ P,RTNEVM ;W POINTS TO THE BASE TABLE
; RETURN ;ALWAYS
;
RTNEVM: HLRZ T1,DLXEVM##(W) ;GET (9) EXEC VIRTUAL PAGE # (9)
; NUMBER OF EXEC PAGES
PJUMPE T1,CPOPJ## ;IF ZERO, THEN NO EVM.
HRRZ T2,DLXEVM##(W) ;GET EXEC VIRTUAL ADDRESS
ANDI T1,777 ;KEEP THE NUMBER OF PAGES
SETZM DLXEVM##(W) ;CLEAR OUR EVM LOCATION
PUSH P,F ;SAVE F
SETZ F, ;MAKE SURE THIS IS 0 OR WE
; WILL GET INTO TROUBLE IN
; "RTEVM" IN KLSER.
PUSHJ P,GIVEVM## ;NOW GIVE UP THE EVM
PJRST FPOPJ## ;RESTORE F AND RETURN TO CALLER
;THIS ROUTINE IS USED TO QUEUE A MESSAGE TO THE DTE
;
; CALL: PUSHJ P,DTEQ ;T1 = DN60 FUNCTION CODE
; ;T3 = SHOULD CONTAIN THE 2nd 16 BITS
; ;T4 = SHOULD CONTAIN THE 3rd 16 BITS
; ;W = POINTS TO THE BASE TABLE
; ;P2 = 0 OR THE INDIRECT BIT (.EMIND)
; ;P3 = CONTAINS INDIRECT COUNT OR 0
; ;P4 = CONTAINS INDIRECT POINTER OR 0
; ERROR RETURN ;IF DTESER COULDN'T GET FREE CORE
; ; T1 = -1 IF PRIMARY PROTOCOL DOWN
; ; OR THE RELOAD BIT IS SET.
; ; T1 = 0 IF DTESER COULDN'T GET
; ; FREE CORE.
; OK RETURN ;IF PDP11 TOOK OUR MESSAGE AND
; ; GAVE US A RESULT CODE.
; ;P1 = DN60 FUNCTION CODE
; ;P2 = RESULT CODE
; ;P3 = 2nd 16 BITS
; ;P4 = 3rd 16 BITS
; ;W = POINTS TO THE BASE TABLE
; ;J = POINTS TO THE FEK
; EITHER RETURN ;DLXCEU IS 0 AND JOB IS UNLOCKED
; ; IF WE LOCKED HIM
;
DTEQ: MOVE J,DLXFEK##(W) ;MAKE J POINT TO THE FEK
MOVE F,[POINT 16,DLXODA##(W)] ;POINT TO DIRECT DATA BLOCK
IDPB T1,F ;PUT IN THE DN60 FUNCTION CODE
IDPB T3,F ;PUT IN THE 2nd 16 BITS
IDPB T4,F ;PUT IN THE 3rd 16 BITS
MOVE T1,NUMBYT(T1) ;GET NUMBER OF BYTES EXPECTING BACK,,
; NUMBER OF BYTES SENDING.
HRRZM T1,DLXOCN##(W) ;STORE BYTES SENDING
HLLZM T1,DLXICN##(W) ;STORE BYTES EXPECTED
SETZM DLXIDA##(W) ;CLEAR INPUT DATA BLOCK
SETZM DLXIDA##+1(W) ; DITTO
MOVSI T1,(D6.FLG) ;GET MASK OF ALL BITS
ANDCAM T1,FEKUNI(J) ;CLEAR OUT
MOVSI T1,(D6.OUT) ;FLAG DOING OUPUT
IORM T1,FEKUNI(J) ;PUT THE FLAG WHERE TO-11 DONE WILL FIND IT
HRLZI S,T11DON ;THE POST ADDRESS FOR DTESER
HRRI S,DLXOCN##(W) ;POINT TO THE DIRECT COUNT
SKIPN P2 ;SEE IF INDIRECT
SETZB P3,P4 ;NO, ITS DIRECT
IOR P2,[XWD .EMD60,.EMD6D] ;PROTOCOL DEVICE CODE,PROTOCOL FUNCTION CODE
MOVE P1,DLXWIN##(W) ;GET XWD CPU,DTE
MOVEI T1,2 ;NUMBER OF SECONDS TILL WE TIME OUT
PUSHJ P,D60TIM## ;PUT TIME IN THE BASE TABLE WHEN
; TIME OUT AT.
S0PSHJ DTEQUE## ;CALL DTESER TO QUEUE OUR MESSAGE
JRST [PUSH P,T1 ;SAVE T1 ERROR CODE FROM DTEQUE
PUSHJ P,SETWJ ;POINT TO BASE TABLE AND FEK
HRRZS FEKUNI(J) ;CLEAR OUT FLAGS
PUSHJ P,D60LKC## ;CHECK IF TO UNLOCK
PUSHJ P,D60UNL## ;YES, UNLOCK HIM
; (J NOW CONTAINS JOB #)
SETZM DLXCEU##(W) ;FREE UP THE CAL11 UUO
SETZM DLXTIM##(W) ;NO MORE ONCE A SECOND CALL
PUSHJ P,RTNEVM ;FREE UP THE EVM (IF ANY)
PJRST TPOPJ## ] ;RESTORE T1 AND
; RETURN ERROR CODE.
PUSHJ P,D60EVW## ;GO WAIT TILL PDP11 TAKES OUR
; MESSAGE AND REPLIES WITH THE
; RESULT CODE.
PUSHJ P,SETWJ ;POINT TO BASE TABLE AND FEK
LDB P2,[POINT 8,DLXIDA##(W),7] ;GET RESULT CODE
LDB P1,[POINT 8,DLXIDA##(W),15] ;GET FUNCTION CODE
LDB P3,[POINT 16,DLXIDA##(W),31] ;GET THE 2nd 16 BITS
LDB P4,[POINT 16,DLXIDA##+1(W),15] ;GET THE 3rd 16 BITS
SETZM DLXCEU##(W) ;FREE UP THE CAL11. UUO
PUSHJ P,RTNEVM ;GIVE BACK EVM IF WE HAVE ANY
PJRST CPOPJ1## ;GIVE OK RETURN
;THIS TABLE CONTAINS IN THE (LH) THE NUMBER OF BYTES EXPECTED IN
; THE MESSAGE HEADER FROM THE PDP11, AND IN THE (RH) THE NUMBER
; OF DIRECT BYTES TO BE SENT TO THE PDP11.
;
NUMBYT: 0 ;0 - ILLEGAL FUNCTION
XWD 6,6 ;1 - READ FUNCTION
XWD 6,6 ;2 - WRITE FUNCTION
XWD 6,6 ;3 - READ FUNCTION
XWD 6,6 ;4 - WRITE FUNCTION
XWD 6,6 ;5 - READ FUNCTION
XWD 6,6 ;6 - WRITE FUNCTION
XWD 6,6 ;7 - READ FUNCTION
XWD 6,6 ;8 - WRITE FUNCTION
XWD 6,4 ;9 - EXAMINE FUNCTION
XWD 2,6 ;10 - DEPOSIT FUNCTION
.NMBYT==.-NUMBYT ;LENGTH OF THIS TABLE NUMBYT
;THIS ROUTINE IS CALLED FROM DTESER AFTER
; A T0-10 DONE INTERRUPT
;
; CALL: PUSHJ P,D6SDAT ;U CONTAINS BYTES IN DIRECT
; ; MESSAGE-.EMHBL
; ;IF INDIRECT P3 CONTAINS NUMBER
; ; OF BYTES COMING IN INDIRECT MESSAGE
; ;P2 CONTAINS DEVICE CODE,,FUNCTIN CODE
; ;P4 CONTAINS POINTER TO DATA IN
; ; THE DIRECT MESSAGE
; ;P1 CONTAINS THE DTE NUMBER
;
D6SDAT: PUSHJ P,SETWJ ;POINT W TO THE BASE TABLE
; AND J TO THE FEK.
SKIPN DLXCEU##(W) ;SEE IF THERES A USER
PJRST EATMSG## ;EATUP THE MESSAGE
HLRZ T1,DLXICN##(W) ;GET AMOUNT 11 SHOULD HAVE GIVEN
CAME T1,U ;SEE IF THATS REALLY TRUE
STOPCD CPOPJ##,DEBUG,DN60DD, ;++PDP11 TRIED TO GIVE US TO MUCH
; DIRECT DATA.
;??PROBABLY SHOULD KILL THE PDP11
MOVEM U,DLXICN##(W) ;PUT COUNT OF THE NUMBER OF DIRECT
; 8 BIT BYTES FOLLOWING THE HEADER
MOVE T4,P4 ;POINT TO THE DIRECT BYTES FOLLOWING
; THE MESSAGE HEADER
LSH U,-1 ;CONVERT NUMBER OF 8 BIT BYTES
; INTO 16 BIT BYTES.
MOVE T3,[POINT 16,DLXIDA##(W)] ;PLACE WHERE TO PUT THE DIRECT BYTES
D6SDA2: PUSHJ P,GX2BYT## ;GET A 16 BIT BYTE INTO T1
IDPB T1,T3 ;PUT IT IN THE BASE TABLE
SOJG U,D6SDA2 ;GOT ALL OF THEM YET?
TRNN P2,EM.IND ;DOING INDIRECT DATA?
JRST D6SEVW ;ITS DIRECT
CAMLE P3,DLXICI##(W) ;SEE IF PDP11 IS TRYING TO OVER
; STUFF US WITH DATA.
STOPCD CPOPJ##,DEBUG,DN60ID, ;++PDP11 IS TRYING TO GIVE
; US TOO MUCH INDIRECT DATA.
MOVSI S,T10DON ;WHERE TO GO ON TO10 DONE INTERRUPT
MOVE P4,DLXIBP##(W) ;GET THE BYTE POINTER
MOVSI T1,(D6.TTD) ;EXPECTING A TO10 DONE INTERRUPT
IORM T1,FEKUNI(J) ;WHERE WE'LL FIND THAT BIT
POPJ P, ;RETURN TO DTESER
;HERE TO GET OUT OF EVENT WAIT SO AT UUO LEVEL
; WE CAN GIVE THE JOB HIS RESULT CODE.
;
D6SEVW: MOVSI T1,(D6.IND) ;BIT FOR INPUT DONE
IORM T1,FEKUNI(J) ;WHERE UUO LEVEL WILL FIND THE BIT
PJRST D60WAK## ;GET JOB OUT OF EVENT WAIT
;HERE ON THE T0-10 DONE INTERRUPT FROM DTESER
; AFTER RECEIPT OF THE INDIRECT MESSAGE.
;
T10DON: PUSHJ P,SETWJ ;POINT W TO THE BASE TABLE
; AND J TO THE FEK.
MOVSI T1,(D6.TTD) ;SEE IF EXPECTING A TO-10
TDNN T1,FEKUNI(J) ; INTERRUPT
STOPCD CPOPJ##,DEBUG,DN60DI, ;++NOT EXPECTING A TO-10 DONE INT
;??PROBABLY SHOULD KILL THE PDP11
ANDCAM T1,FEKUNI(J) ;CLEAR EXPECTING TO-10 DONE INT
JRST D6SEVW ;GET OUT OF EVENT WAIT
;HERE ON A TO-11 DONE INTERRUPT FROM DTESER
;
T11DON: POPJ P, ;NOW RETURN TO DTESER
;TO-10 DISPATCH TABLE
;
CPOPJ## ;(-1) LOST TO-10 INDIRECT MESSAGE
D6SDDS::EATMSG## ;(0)
EATMSG## ;(1)
EATMSG## ;(2)
EATMSG## ;(3)
EATMSG## ;(4)
EATMSG## ;(5)
EATMSG## ;(6)
EATMSG## ;(7)
EATMSG## ;(10)
EATMSG## ;(11)
EATMSG## ;(12)
EATMSG## ;(13)
EATMSG## ;(14)
EATMSG## ;(15)
EATMSG## ;(16)
EATMSG## ;(17)
EATMSG## ;(20)
EATMSG## ;(21)
EATMSG## ;(22)
EATMSG## ;(23)
EATMSG## ;(24)
EATMSG## ;(25)
EATMSG## ;(26)
EATMSG## ;([D)
EATMSG## ;(30)
EATMSG## ;(31)
D6SDAT ;(32) DN60 DATA
$HIGH
$LIT
D6SEND::END