mirror of
https://github.com/PDP-10/stacken.git
synced 2026-03-01 01:19:17 +00:00
710 lines
27 KiB
Plaintext
710 lines
27 KiB
Plaintext
TITLE D6SINT -- UUO AND INTERRUPT SERVICE FOR THE DTE-20 DN60 SERIES - V036
|
||
SUBTTL ED FORTMILLER/EGF 09 FEB 88
|
||
|
||
SEARCH F,S,DTEPRM
|
||
$RELOC
|
||
$HIGH
|
||
|
||
|
||
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED
|
||
; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
|
||
;
|
||
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION
|
||
; 1976,1977,1978,1979,1980,1982,1984,1986,1988.
|
||
;ALL RIGHTS RESERVED.
|
||
|
||
.CPYRT<1976,1988>
|
||
|
||
XP V6SINT,036 ;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,FEKDLX(J) ;PICK UP BASE TABLE ADDRESS
|
||
JUMPE W,CPOPJ## ;RETURN IF NONE
|
||
SKIPL FEKBLK(J) ;IS THIS FEK ONLINE?
|
||
POPJ P, ;NO, DON'T BOTHER ME
|
||
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
|
||
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
|
||
MOVE T1,[PUSHJ P,D6SDSP] ;PROPER FEKDSP WORD
|
||
CAMN T1,FEKDSP(J) ;IS IT SET?
|
||
POPJ P, ;YES, DONE HERE
|
||
PUSHJ P,SAVT## ;NO, SAVE REMAINING TEAS
|
||
MOVEI T2,DD.IBM ;LINE-USER FOR DN60
|
||
PUSH P,F ;SAVE DTESER'S PET AC
|
||
MOVE F,FEKETD(J) ;POINT TO THE ETD
|
||
PUSHJ P,DFKSET## ;HAVE DTESER DO SOME SETUP FOR US
|
||
MOVEI T1,FF.UP ;THIS FEK IS UP IF WE'RE USING IT
|
||
XCT FEKDSP(J) ;SO DO IT
|
||
JRST FPOPJ## ;DONE
|
||
|
||
;HERE FROM DTESER TO SET-LINE-USER TO DN60
|
||
;CALL WITH T2 HAVING DD.IBM, F HAVING ETD, T1 HAVING BASE TABLE, AND T3
|
||
; HAVING FEK ADDRESS
|
||
|
||
D6SUSR::PUSHJ P,SAVJW## ;SAVE J & W
|
||
MOVE W,T1 ;PUT BASE POINTER WHERE IT BELONGS
|
||
MOVE J,T3 ;AND FEK POINTER WHERE IT GOES
|
||
MOVE T4,[PUSHJ P,D6SDSP] ;PROPER FEKDSP WORD
|
||
MOVEM T4,FEKDSP(J) ;SET IT
|
||
MOVE T4,[JRST D6SCEV(P1)] ;GET OUR CAL11. VECTOR
|
||
MOVEM T4,DLXCEV##(W) ;SET THAT UP
|
||
MOVEM T2,ETDUSR(F) ;SET LINE-USER TYPE
|
||
MOVE T4,DFKNAM##(T2) ;LINE-USER NAME
|
||
MOVEM T4,DLXNMT##(W) ;SET THAT
|
||
MOVEI T4,.C1D60 ;OUR CAL11. TYPE
|
||
MOVEM T4,DLXTYP##(W) ;SET THAT AS WELL
|
||
MOVE T4,[XWD MC11FN##,C11FTB##] ;CAL11. POINTER
|
||
MOVEM T4,DLXCAL##(W) ;SET FOR CAL11. UUO DISPATCH
|
||
PUSH P,T2 ;PRESERVE T2 ACROSS CALL
|
||
MOVEI T1,FF.ONC ;ONCE-ONLY CALL
|
||
XCT FEKDSP(J) ;WHY DO I BOTHER?
|
||
JRST T2POPJ## ;RETURN WITH T2 INTACT
|
||
|
||
;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
|
||
MOVSI T1,(D6.FLG) ;MASK OF ALL FLAGS
|
||
ANDCAM T1,FEKUNI(J) ;CLEAR THEM OUT
|
||
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
|
||
;
|
||
IFIW CPOPJ## ;(-1) LOST TO-10 INDIRECT MESSAGE
|
||
D6SDDS::DTEFNC ;(??) GENERATE DUMMY TABLE ENTRIES
|
||
DTEFNC (D6D,D6SDAT) ;(32) DN60 DATA
|
||
$HIGH
|
||
|
||
$LIT
|
||
|
||
D6SEND::END
|