mirror of
https://github.com/PDP-10/stacken.git
synced 2026-02-28 17:09:15 +00:00
759 lines
26 KiB
Plaintext
759 lines
26 KiB
Plaintext
TITLE TTDINT - DRIVER FOR DTE20 TELETYPES V077
|
||
SUBTTL A. WILSON/WRS/CDO 23-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 VTTDNT,077
|
||
|
||
;NOTE:
|
||
; IF ANY CHANGES ARE MADE TO DTEPRM THAT THIS MODULE MUST HAVE, UPDATE
|
||
; THE FOLLOWING SYMBOL TO THE VERSION OF DTEPRM THAT MUST BE USED
|
||
PRMMIN==71
|
||
; THIS WAY, ASSEMBLING THIS MODULE WITH WRONG VERSION OF DTEPRM FOR SOME REASON
|
||
; (LIKE FORGETTING TO ASSEMBLE IT) WILL CAUSE ASSEMBLY TO TERMINATE.
|
||
; THIS SCHEME DOES NOT CAUSE EXTRA EDITING, SINCE ONLY FILES
|
||
; WHICH NEED THE CHANGES NEED PRMMIN TO BE UPDATED. MODULES
|
||
; THAT DO NOT NEED A NEW VERSION OF DTEPRM NEED NOT DEMAND IT.
|
||
|
||
IFL VDTPRM-PRMMIN,<PRINTX ?PLEASE USE LATEST VERSION OF DTEPRM
|
||
PASS2
|
||
END>
|
||
|
||
|
||
|
||
SALL
|
||
ENTRY TTDINT
|
||
|
||
TTDINT::
|
||
|
||
|
||
;BITS IN LEFT HALF OF .CP20F
|
||
|
||
F20ADS==(1B0) ;TOLD -20F ITS OK TO ANSWER DATASETS
|
||
F20LPP==:(1B1) ;LOST PRIMARY PROTOCOL (SET BE DTESER)
|
||
F20SDT==:(1B2) ;TELL FRONT-END OF DATE/TIME CHANGE (SET BY DTESER)
|
||
SUBTTL MACROS AND STRINGS
|
||
|
||
DEFINE $8BIT(SIZE,TEXT),<
|
||
SIZE==<COUNT==<C%0==<C%1==<C%2==<C%3==0>>>>>
|
||
IRPC (TEXT)<
|
||
CHAR==<ASCII\TEXT\>_-^D29
|
||
STOBYT(\COUNT,CHAR)
|
||
COUNT==COUNT+1
|
||
SIZE==SIZE+1
|
||
IFE COUNT-4,<
|
||
BYTE (8) C%0,C%1,C%2,C%3
|
||
COUNT==<C%0==<C%1==<C%2==<C%3==0>>>>
|
||
>
|
||
>
|
||
IFN COUNT,<BYTE (8) C%0,C%1,C%2,C%3>
|
||
>
|
||
|
||
DEFINE STOBYT(BYTE,CHAR),<C%'BYTE==CHAR>
|
||
|
||
|
||
|
||
;STRING TO SEND TO ALL TERMINALS AFTER SWITCHING FROM PRIMARY PROTOCOL TO
|
||
; SECONDARY AND BACK AGAIN. -20F SAID "%DECSYSTEM-10 NOT RUNNING"
|
||
|
||
CONMSG: $8BIT CONSIZ,<
|
||
[DECsystem-10 Continued]
|
||
>
|
||
SUBTTL DISPATCH TABLES
|
||
|
||
IFIW CPOPJ## ;(-1) LOST TO-10 INDIRECT MESSAGE
|
||
CT0DSP::DTEFNC ;(??) GENERATE DUMMY TABLE ENTRIES
|
||
DTEFNC (LNC,CTYLND) ;(07) TAKE LINE, CHARACTER
|
||
DTEFNC (ACK,CTYACK) ;(17) ACK
|
||
|
||
|
||
IFIW CPOPJ## ;(-1) LOST TO-10 INDIRECT MESSAGE
|
||
DLSDSP::DTEFNC ;(??) GENERATE DUMMY TABLE ENTRIES
|
||
DTEFNC (LNC,DLSLND) ;(04) TAKE LINE, CHARACTER
|
||
DTEFNC (DSC,TTDDWA) ;(15) DATASET WAS ANSWERED
|
||
DTEFNC (HUD,TTDDHU) ;(16) DATASET HUNG UP
|
||
DTEFNC (ACK,DLSACK) ;(17) ACK
|
||
DTEFNC (HLS,TTDHLS) ;(22) HERE ARE LINE SPEEDS
|
||
DTEFNC (AKA,DLSAAL) ;(25) ACK ALL
|
||
;DISPATCH FOR SCNSER COMMUNICATION WITH TTDINT
|
||
|
||
CTYDSP:: ;USE SAME DISPATCH TABLE FOR THE CTYS
|
||
TTDDSP::PJRST SPCTYO## ;SECONDARY PROTOCOL XMIT INTERRUPT
|
||
PJRST TTDDSC ;GO TO DATASET CONTROL ROUTINE
|
||
PJRST TTDSEC ;GO TO ONCE-A-SECOND ROUTINE
|
||
POPJ P, ;NO INITIALIZATION ROUTINE
|
||
PJRST SETCHP## ;MARK H/W PARAMETERS TO COME BACK THROUGH TTDSCN
|
||
PJRST TTDLPC ;HANDLE LINE PARAMETER CHANGE CALL (.TOEAB)
|
||
POPJ P, ;RETURN ON SET ELEMENT NUMBER CALL
|
||
PJRST TTDREM ;HANDLE REMOTE CALL (^O)
|
||
PJRST CPOPJ1## ;ALWAYS SAY ON-LINE
|
||
|
||
;HERE ON REMOTE CALL FROM SCNSER ISR DISPATCH
|
||
|
||
TTDREM: CAIE T3,IRRSCG ;ONLY CARE ABOUT ^O STRUCK
|
||
POPJ P, ;WASN'T, RETURN
|
||
MOVSI T1,LTLCTO## ;GET ^O STRUCK FLAG FOR -20F
|
||
IORM T1,LDBTTD##(U) ;STORE IN LDB
|
||
PJRST SETCHP## ;AND LET ONCE-A-TIC CODE SEE IT
|
||
|
||
;HERE ON LINE PARAMETER CHANGE FORM SCNSER ISR DISPATCH
|
||
|
||
TTDLPC: MOVE T1,T3 ;COPY PARAMETER WORD
|
||
LSH T3,-8 ;ISOLATE FUNCTION CODE
|
||
CAIE T3,LPCABR ;AUTOBAUD REQUEST (.TOEAB)?
|
||
POPJ P, ;NO--RETURN
|
||
MOVEI T1,LTRABR## ;YES--GET LOCAL AUTOBAUD FLAG
|
||
IORM T1,LDBTTD##(U) ;REMEMBER FOR TTDSCN
|
||
PJRST SETCHP## ;AND DEFER TO TTDSCN
|
||
|
||
;HERE FROM DTESER WHEN DTELDR RESTARTS PRIMARY PROTOCOL ON THE MASTER
|
||
|
||
TTDRLD::SE1ENT ;ENTER SECTION 1
|
||
PUSHJ P,SAVE3## ;SAVE P1-P3
|
||
HRRZS .CP20F## ;CLEAR -20F FLAGS
|
||
PUSH P,U ;SAVE U
|
||
SETZ P1, ;START WITH DLS #0
|
||
MOVE P2,.CPSPF## ;GET SECONDARY PROTOCOL FLAGS
|
||
TRNN P2,DF.8BA ;IF 8-BIT CAPABLE,
|
||
TDZA P2,P2 ;THEN CLEAR 7-BIT FLAG,
|
||
MOVEI P2,1 ;ELSE SET IT
|
||
SETZ P3, ;A HANDY ZERO TO CLEAR LDP8BT IF NEEDED
|
||
TTDRL1: MOVE U,P1 ;COPY DLS LINE NUMBER
|
||
PUSHJ P,DLSMON ;CONVERT TO -10 LINE NUMBER
|
||
JRST UPOPJ## ;ALL DONE
|
||
MOVE U,LINTAB##(U) ;GET LDB ADDRESS
|
||
TRNN U,-1 ;SETUP YET?
|
||
JRST TTDRL2 ;NOPE
|
||
SETZM LDBTTD##(U) ;CLEAR FLAGS
|
||
DPB P2,LDP7BT## ;SET/CLEAR 7-BIT RESTRICTION AS INDICATED
|
||
SKIPE P2 ;IF IT'S NOW DUMB,
|
||
DPB P3,LDP8BT## ;THEN IT'S 7-BIT AGAIN
|
||
PUSHJ P,SETCHP## ;NEED TO RE-SEND LINE SPEEDS
|
||
TTDRL2: AOJA P1,TTDRL1 ;STEP TO NEXT DLS
|
||
|
||
;HERE FROM DTESER FOR DTE. UUO FUNCTION 21
|
||
;T1=CPU,,DTE (ALREADY VERRIFIED AND WE ARE ON RIGHT CPU)
|
||
|
||
TTDDLN::HLRZ T2,T1 ;GET CPU NUMBER
|
||
TRNN T1,-1 ;WANT CFE
|
||
JRST TTDDL1 ;YES, GET KLINIK,,CTY
|
||
ADD T1,TTDOFS##(T2) ;CONVERT DTE# TO 10 LINE #
|
||
MOVEI T1,.UXTRM(T1) ;CONVERT TO A UDX
|
||
PJRST STOTC1## ;GIVE GOOD RETURN
|
||
TTDDL1: HRRZ T1,.CPCTN## ;GET CTY # ON THIS CPU
|
||
HRL T1,TTDOFS##(T2) ;GET KLINIK (=LOWEST ENTRY)
|
||
TDO T1,[.UXTRM,,.UXTRM] ;CONVERT BOTH
|
||
PJRST STOTC1## ;GIVE GOOD RETURN
|
||
SUBTTL ONCE A TICK CODE FOR TTDINT
|
||
|
||
;TTDSTO IS CALLED ONCE-PER-TICK ON EACH CPU TO DE-QUEUE OUTPUT
|
||
|
||
TTDSTO::HRRZ T1,.CP20F## ;NUMBER OF CHARACTERS STILL IN BUFFER
|
||
JUMPN T1,CPOPJ## ;STILL ACTIVE, WAIT FOR POSTING
|
||
PJRST TTDSCN ;GO START UP OUTPUT IF ANY WAITING
|
||
|
||
|
||
;HERE FROM DTESER ON POST CALL FOR STRING OUTPUT
|
||
|
||
TTDPST: SE1ENT ;ENTER SECTION 1
|
||
HRRZ U,S ;GET SAVED VALUE OF U (LINE NUMBER)
|
||
MOVE U,LINTAB##(U) ;LDB ADDRESS
|
||
MOVEI T2,TTDTIM## ;IRMA-LIKE VALUE FOR LTLACK
|
||
DPB T2,LDPTDT## ;SET TIMER LIMIT
|
||
MOVSI T1,LTLACK## ;WAITING FOR ACK FLAG
|
||
IORM T1,LDBTTD##(U) ;MARK THE LINE
|
||
HLLZS .CP20F## ;START STRING CHAR COUNT AT ZERO
|
||
;; PJRST TTDSCN ;SCAN FOR A BUSY LINE
|
||
;ROUTINE TO FIND AN ACTIVE LINE AND START OUTPUT ON IT.
|
||
|
||
TTDSCN: SE1ENT ;ENTER SECTION 1
|
||
MOVEI T1,.CPCTQ## ;GET QUEUE HEADER
|
||
PUSHJ P,TOTAKE## ;FIND NEXT ACTIVE LINE
|
||
POPJ P, ;NONE LEFT, RETURN
|
||
PUSHJ P,SKPMPP## ;PRIMARY PROTOCOL?
|
||
JRST TTDSC4 ;IF SECONDARY
|
||
MOVEI T1,L1RCHP## ;CHANGE HARDWARE PARAMETERS REQUEST BIT
|
||
TDNE T1,LDBBYT##(U) ;WAITING TO CHANGE?
|
||
JRST TTDCHP ;CHANGE IF NECESSARY
|
||
MOVSI T1,LTLACK## ;WAITING FOR ACK
|
||
TDNN T1,LDBTTD##(U) ;IS IT WAITING
|
||
SKIPL LDBDCH##(U) ;OR IS THIS LINE IDLE?
|
||
JRST TTDSCN ;CANNOT OUTPUT, TRY FOR ANOTHER LINE
|
||
PUSH P,P1 ;SAVE P1
|
||
MOVE P1,[POINT 8,.CP20B##] ;GET POINTER TO STRING AREA
|
||
TTDSC1: PUSHJ P,XMTCHR## ;GET A CHARACTER TO SEND
|
||
JRST TTDSC2 ;LINE IS IDLE
|
||
IDPB T3,P1 ;STORE CHARACTER IN BUFFER
|
||
AOS T1,.CP20F## ;ADVANCE COUNT
|
||
TLZ T1,-1 ;CLEAR FLAG BITS
|
||
CAIL T1,TTDMOS## ;HAVE AS MANY CHARS AS WE WANT?
|
||
JRST TTDSC3 ;YES, SEND WHAT WE'VE GOT
|
||
JRST TTDSC1 ;TRY FOR ANOTHER CHARACTER
|
||
TTDSC2: HRRZ T1,.CP20F## ;ANY CHARACTERS FOUND THIS PASS
|
||
JUMPE T1,[POP P,P1 ;NO, RESTORE P1
|
||
JRST TTDSCN] ;AND LOOK FOR ANOTHER LINE
|
||
TTDSC3: POP P,P1 ;RESTORE
|
||
PUSHJ P,SAVE4## ;SAVE P1-P4
|
||
PUSHJ P,STDTQ ;SET UP DTEQUE ARGUMENTS
|
||
HRRI P2,EM.IND+.EMSTR ;OUTPUT INDIRECT STRING TO DLS
|
||
HRR P3,.CP20F## ;SET P3 TO DLS LINE #,,COUNT
|
||
MOVE P4,[POINT 8,.CP20B##] ;POINT TO INDIRECT STRING
|
||
LDB S,LDPLNO## ;REMEMBER LINE NUMBER
|
||
HRLI S,TTDPST ;POST ADDRESS
|
||
S0PSHJ DTEQUE## ;QUEUE THE REQUEST
|
||
HLLZS .CP20F## ;FAILED, UNBLOCK CODE
|
||
POPJ P, ;RETURN
|
||
|
||
;HERE IF RUNNING SECONDARY PROTOCOL
|
||
|
||
TTDSC4: LDB T1,LDPLNO## ;GET LINE NUMBER
|
||
HRRZ T2,.CPCTN## ;GET CTY ON THIS CPU
|
||
CAIE T1,(T2) ;THIS IT
|
||
JRST TTDSC5 ;NO, IGNORE DATA
|
||
SKIPGE LDBDCH##(U) ;LINE IDLE?
|
||
PUSHJ P,XMTCHR## ;YES, GET CHARACTER FOR OUTPUT
|
||
POPJ P, ;IDLE, RETURN
|
||
PUSHJ P,CLRIRM## ;CLEAR LOST ACK FLAG
|
||
PJRST SPCTYO## ;AND TYPE OUT ON CTY
|
||
TTDSC5: SKIPGE LDBDCH##(U) ;LINE IDLE
|
||
PUSHJ P,XMTCHR## ;YES, GET A CHARACTER
|
||
POPJ P, ;ALL DONE
|
||
JRST .-2 ;THROW IT AWAY
|
||
SUBTTL ROUTINE TO CHANGE HARDWARE PARAMETERS
|
||
|
||
;ENTRY TTDCHP IS USED WHEN SCANNING THE 'START OUTPUT' QUEUE.
|
||
;IT CLEARS THE L1RCHP BIT IN LDBBYT BEFORE SENDING THE CHP MESSAGE.
|
||
;ARGS: T1/BIT TO CLEAR, SETUP BY MOVEI T1,L1RCHP
|
||
; U/LDB ADDRESS
|
||
; PUSHJ P,TTDCHP
|
||
; RETURN HERE
|
||
|
||
TTDCHP: PUSHJ P,SAVE4## ;SAVE P1-P4
|
||
ANDCAM T1,LDBBYT##(U) ;CLEAR CHP REQUEST BIT
|
||
MOVSI T1,LTLCTO## ;CONTROL-O STRUCK
|
||
TDNE T1,LDBTTD##(U) ;WAS IT
|
||
PUSHJ P,TTDCTO ;YES, TELL -20F
|
||
MOVSI T1,LTLXFF## ;SEND XOFF STATUS BIT
|
||
TDNN T1,LDBTTD##(U) ;DO WE WANT TO?
|
||
JRST TTDCH2 ;NO, SKIP THE CHECKS
|
||
ANDCAM T1,LDBTTD##(U) ;YES, CLEAR THE BIT
|
||
MOVSI T2,LOLSTP## ;CONTROL-S STRUCK
|
||
MOVSI T1,LTLXOF## ;GET TTD XOF BIT
|
||
TDNN T2,LDBOST##(U) ;WAS IT ^S
|
||
JRST TTDCH1 ;NO, NOT ^S
|
||
TDNN T1,LDBTTD##(U) ;YES, DID WE KNOW THAT?
|
||
PUSHJ P,TTDXOF ;SEND XOF MESSAGE FOR LINE
|
||
JRST TTDCH2 ;NOW SET SPEEDS
|
||
TTDCH1: TDNE T1,LDBTTD##(U) ;NOT ^S DID WE THINK IT WAS?
|
||
PUSHJ P,TTDXON ;SEND XON MESSAGE FOR LINE
|
||
TTDCH2: PUSHJ P,TTDSSP ;SEND SPEEDS
|
||
MOVSI T2,LPLXNF## ;TERMINAL PAGE SET
|
||
MOVSI T1,LTLAXF## ;AUTO XOFF ENABLE SET
|
||
TDNN T2,LDBPAG##(U) ;ARE WE IN PAGE MODE?
|
||
JRST TTDC2A ;NO
|
||
TDNN T1,LDBTTD##(U) ;HAS IT BEEN SET YET?
|
||
PUSHJ P,TTDAXF ;NO, GO DO IT
|
||
JRST TTDCH3 ;
|
||
TTDC2A: TDNE T1,LDBTTD##(U) ;HAS IT BEEN CLEARED YET?
|
||
PUSHJ P,TTDAXF ;NO, DO SO NOW
|
||
TTDCH3: MOVEI T1,LTR8BE## ;STATE WE LAST SENT
|
||
MOVSI T2,LAL8BT## ;AND CURRENT SCNSER STATE
|
||
TDNN T2,LDBATR##(U) ;ARE WE IN 8-BIT MODE?
|
||
JRST TTDC3A ;NO
|
||
TDNN T1,LDBTTD##(U) ;YES DID WE KNOW THAT?
|
||
PUSHJ P,TTD8BT ;SEND 8BIT MESSAGE FOR LINE
|
||
JRST TTDCH4 ;
|
||
TTDC3A: TDNE T1,LDBTTD##(U) ;HAS IT BEEN CLEARED YET?
|
||
PUSHJ P,TTD8BT ;NO, DO SO NOW
|
||
TTDCH4: PJRST TOPOKE## ;LOOK AT MORE (AND THIS) NEXT TICK
|
||
SUBTTL SET LINE SPEEDS
|
||
|
||
;HERE TO SET SPEEDS FOR RSX-20F FRONT-END LINE
|
||
;ARGS: U/LDB ADDRESS
|
||
;CALL: SAVE P1-P4
|
||
; PUSHJ P,TTDSSP
|
||
; RETURN HERE
|
||
;WILL NOT SEND SPEEDS TO -20F IF THEY DIDN'T CHANGE FROM LAST TIME. IF A LINE
|
||
; GETS CONFUSED, MUST SET TO ANOTHER SPEED AND THEN BACK TO DESIRED ONE.
|
||
|
||
TTDSSP: MOVE T3,[POINT ^D16,.CP20B##] ;POINT TO PLACE IN CDB
|
||
SETO T4, ;INDICATE BOTH CHANGED
|
||
SETCM T1,LDBDCH##(U) ;COMPLEMENT DATASET BIT
|
||
HLL T1,LDBTTD##(U) ;GET REMOTE FOR -20F
|
||
MOVE T2,LDBTTD##(U) ;GET OTHER -20F BITS
|
||
TRNN T2,LTRABR## ;MUST SEND IF DECLARING FOR AUTOBAUD
|
||
TDNN T1,[LTLRBS##,,LDRDSD##] ;ALREADY TOLD -20F
|
||
TRZ T4,-1 ;NO, MUST SEND SPEED
|
||
LDB T1,LDPRSP## ;GET CODE FOR LINE TRANSMIT SPEED
|
||
LDB T2,[POINT 4,LDBTTD##(U),3] ;REMEMBERED SPEED
|
||
CAIN T1,(T2) ;DID SPEED CHANGE
|
||
AOSA T4 ;NO, COUNT NUMBER THAT DIDN'T
|
||
DPB T1,[POINT 4,LDBTTD##(U),3] ;REMEMBERED SPEED
|
||
MOVE T1,LSPTAB##(T1) ;CONVERT TO BAUD
|
||
IDPB T1,T3 ;BUILD THE SPEED MESSAGE
|
||
LDB T1,LDPTSP## ;GET CODE FOR LINE RECEIVE SPEED
|
||
LDB T2,[POINT 4,LDBTTD##(U),7] ;REMEMBERED SPEED
|
||
CAIN T1,(T2) ;DID THIS ONE CHANGE
|
||
AOJG T4,CPOPJ## ;RETURN IF NEITHER CHANGED
|
||
DPB T1,[POINT 4,LDBTTD##(U),7] ;REMEMBERED SPEED
|
||
MOVE T1,LSPTAB##(T1) ;CONVERT TO BAUD
|
||
IDPB T1,T3 ;BUILD THE SPEED MESSAGE
|
||
MOVEI T2,1 ;ASSUME ONE STOP BIT
|
||
CAIG T1,^D110 ;LESS THAN OR EQUAL TO 110 BAUD?
|
||
MOVEI T2,2 ;YES, SO USE TWO STOP BITS
|
||
MOVE T1,LDBDCH##(U) ;GET LINE CHARACTERISTICS WORD
|
||
TRNE T1,LDRDSD## ;DATASET LINE?
|
||
JRST [MOVSI T1,LTLRBS##;YES, GET "REMOTE BIT SENT" BIT
|
||
TDNE T1,LDBTTD##(U);REMOTE BIT ALREADY SENT?
|
||
JRST .+1 ;YES, BACK TO MAIN CODE
|
||
IORM T1,LDBTTD##(U);NO, MARK IT SENT AS OF NOW
|
||
TRO T2,140000;SET REMOTE BIT AND AUTO BAUD
|
||
JRST .+1] ;BACK TO MAIN CODE
|
||
MOVEI T1,LTRABR## ;BIT FOR -20F AUTOBAUD
|
||
TDNE T1,LDBTTD##(U) ;WANT TO TELL -20F ABOUT .TOEAB?
|
||
JRST [ANDCAM T1,LDBTTD##(U) ;YES, CLEAR BIT FOR NEXT TIME
|
||
TRO T2,40000 ;SET AUTOBAUD BIT
|
||
JRST .+1] ;BACK TO MAIN CODE
|
||
IDPB T2,T3 ;STORE ARGUMENT
|
||
PUSHJ P,STDTQ ;SET UP DTEQUE ARGUMENTS
|
||
HRRI P2,EM.16B+EM.IND+.EMHLS ;SET DLS LINE SPEEDS
|
||
HRRI P3,6 ;SIX BYTES OF ARGUMENT
|
||
MOVE P4,[POINT ^D16,.CP20B##] ;POINT TO SPEED MESSAGE
|
||
HLLOS .CP20F## ;MARK BUFFER IN USE
|
||
MOVSI S,TTDSS1 ;POST ADDRESS
|
||
S0PSHJ DTEQUE## ;QUEUE THE REQUEST
|
||
TTDSS1: HLLZS .CP20F## ;FAILED (OR DONE)
|
||
POPJ P, ;RETURN
|
||
|
||
;NOTE: THE NONSENSE WITH THE LTLRBS BIT IN THE CODE ABOVE IS NECESSITATED
|
||
;BY A QUIRK OF THE RSX-20F FRONT-END. THE REMOTE BIT IN A LINE-SPEED
|
||
;MESSAGE SHOULD BE SENT ONLY ONCE; IF IT'S SENT AGAIN AFTER A USER HAS
|
||
;DIALED-IN, IT CAUSES THE DATASET TO BE DISCONNECTED.
|
||
SUBTTL XOFF/AUTO-XOFF/XON/CONTROL-O PROCESSING
|
||
|
||
;ROUTINE TO SEND AUTO-XOFF/XOFF/XON/CNTRL-O FOR ^S/^Q/^O ON AN RSX-20F LINE
|
||
;ARGS: U/LDB ADDRESS
|
||
; T1/BIT TO SET/CLEAR IN LDBTTD
|
||
;CALL: SAVE P1-P4
|
||
; PUSHJ P,TTDXXX WHERE XXX IS AXF, XOF, XON, CTO, OR 8BT
|
||
; RETURN HERE
|
||
|
||
TTDAXF: MOVEI P2,.EMAXF ;ENABLE/DISABLE AUTO XOFF FUNCTION
|
||
PUSHJ P,STDTQ ;SET UP DTEQUE ARGUMENTS
|
||
MOVSI T2,LPLXNF## ;GET TERMINAL PAGE BIT
|
||
TDNE T2,LDBPAG##(U) ;IS IT SET?
|
||
JRST TTDAX1 ;YES
|
||
TRZ P3,-1 ;NO, CLEAR AUTO-XOFF
|
||
ANDCAM T1,LDBTTD##(U) ;AND SHOW IT AS CLEAR
|
||
JRST TTDXO2 ;GO QUEUE IT
|
||
TTDAX1: HRRI P3,1 ;ENABLE AUTO-XOFF
|
||
IORM T1,LDBTTD##(U) ;AND SHOW IT AS SET
|
||
JRST TTDXO2 ;GO QUEUE IT
|
||
|
||
TTD8BT: XORB T1,LDBTTD##(U) ;CHANGE THE BIT
|
||
MOVEI P2,.EM8BE ;8-BIT ENABLE
|
||
TRNN T1,LTR8BE## ;UNLESS WE JUST CLEARED IT,
|
||
MOVEI P2,.EM8BD ;THEN IT'S 8-BIT DISABLE
|
||
JRST TTDXO1 ;TRY TO TELL THE FE
|
||
|
||
TTDXOF: MOVEI P2,.EMXOF ;XOF FOR DLS
|
||
IORM T1,LDBTTD##(U) ;SET REQUESTED BIT
|
||
JRST TTDXO1 ;GO SET UP DTESER ARGUMENTS
|
||
TTDCTO: SKIPA P2,[.EMFLO] ;FLUSH OUTPUT FOR DLS LINE
|
||
TTDXON: MOVEI P2,.EMXON ;XON FOR DLS
|
||
ANDCAM T1,LDBTTD##(U) ;CLEAR REQUESTED BIT
|
||
|
||
TTDXO1: PUSHJ P,STDTQ ;SET UP DTEQUE ARGUMENTS
|
||
TTDXO2: S0PSHJ DTEQUE## ;QUEUE THE REQUEST
|
||
JFCL ;FAILED, IGNORE IT
|
||
POPJ P, ;RETURN
|
||
|
||
SUBTTL DATASET CONTROL
|
||
|
||
;SUBROUTINE TO EXERCISE CONTROL OVER A DATASET
|
||
;ARGS: U/DSCTAB INDEX
|
||
; T3/TRANSACTION CODE
|
||
;CALL: PUSHJ P,TTDDSC
|
||
; RETURN HERE
|
||
|
||
TTDDSC: CAIN T3,DSTON## ;WANT TO TURN DATASET ON?
|
||
PJRST TTDCND ;YES
|
||
CAIN T3,DSTOFF## ;WANT TO TURN IT OFF?
|
||
PJRST TTDHUD ;YES, TELL RSX-20F TO HANG UP DATASET
|
||
CAIN T3,DSTREQ## ;WANT TO KNOW STATUS?
|
||
MOVEI T3,DSTNAC## ;YES, TELL SYSINI NOT TO TAKE ACTION
|
||
POPJ P, ;RETURN
|
||
|
||
TTDHUD: PUSHJ P,SAVE4## ;SAVE P1-P4
|
||
HRRZ P3,DSCTAB##(U) ;GET MONITOR LINE NUMBER
|
||
PUSHJ P,STDT1 ;SET UP DTEQUE ARGUMENTS
|
||
HRRI P2,.EMHUD ;HANG UP DATASET FOR DLS LINE
|
||
S0PSHJ DTEQUE## ;QUEUE THE REQUEST
|
||
JFCL ;FAILED, JUST IGNORE
|
||
POPJ P, ;RETURN
|
||
TTDCND: PUSHJ P,SAVE4## ;SAVE P1-P4
|
||
HRRZ P3,DSCTAB##(U) ;GET MONITOR LINE NUMBER
|
||
PUSHJ P,STDT1 ;SET UP DTEQUE ARGUMENTS
|
||
HRRI P2,.EMDSC ;CONNECT DATASET
|
||
S0PSHJ DTEQUE## ;QUEUE THE REQUEST
|
||
JFCL ;FAILED, JUST IGNORE
|
||
POPJ P, ;RETURN
|
||
SUBTTL TAKE LINE SPEEDS FROM FRONT-END
|
||
|
||
;HERE FROM DTESER WHEN RSX-20F SENDS LINE SPEEDS
|
||
|
||
TTDILS: TDZA S,S ;HERE ON COMPLETION OF INDIRECT TRANSFER
|
||
TTDHLS: MOVSI S,TTDILS ;HERE ON START OF MESSAGE
|
||
PUSHJ P,CHKP1 ;CHECK P1 FROM DTESER
|
||
PJRST EATMSG## ;FAILED, IGNORE THIS MESSAGE
|
||
HLRZ U,P3 ;GET DLS LINE NUMBER
|
||
PUSHJ P,DLSMON ;CONVERT TO MONITOR LINE NUMBER IN U
|
||
PJRST EATMSG## ;OUT OF RANGE, IGNORE THIS MESSAGE
|
||
MOVE U,LINTAB##(U) ;GET LDB ADDRESS
|
||
MOVE P4,[POINT ^D16,.CP20S##] ;WHERE TO PUT INDIRECT DATA
|
||
JUMPE S,TTDIL1 ;BRANCH IF HAVE INDIRECT DATA
|
||
MOVEI P3,6 ;WE WANT 6 8-BIT BYTES
|
||
POPJ P, ;RETURN
|
||
|
||
TTDIL1: ILDB T1,P4 ;GET LINE TRANSMIT SPEED IN BAUD
|
||
PUSHJ P,FNDSPD ;SET T1 TO CODED SPEED VALUE
|
||
SE1ENT ;ENTER SECTION 1
|
||
JUMPE T1,TTDIL2 ;IGNORE IF -20F DOESN'T KNOW
|
||
DPB T1,LDPRSP## ;SAVE IN LDB
|
||
DPB T1,[POINT 4,LDBTTD##(U),3] ;REMEMBERED SPEED
|
||
ILDB T1,P4 ;GET LINE RECEIVE SPEED IN BAUD
|
||
PUSHJ P,FNDSPD ;SET T1 TO CODED SPEED VALUE
|
||
DPB T1,LDPTSP## ;SAVE IN LDB
|
||
DPB T1,[POINT 4,LDBTTD##(U),7] ;REMEMBERED SPEED
|
||
TTDIL2: SETZB P3,P4 ;TELL DTESER WE'RE DONE
|
||
MOVSI T1,LTLAXF## ;IF -20F TOLD US THE SPEEDS
|
||
ANDCAM T1,LDBTTD##(U) ;IT ALSO CLEARED AUTO-XOFF ENABLE
|
||
IFN FTNET,<
|
||
SKIPGE LDBREM##(U) ;IF A VTM HOSTED AWAY,
|
||
PUSHJ P,VTMSPD## ;TELL NETVTM THE NEW SPEED
|
||
> ;END IFN FTNET
|
||
PJRST SETCHP## ;EXIT, WILL SEND ENABLE AUTO-XOFF AT TTDCHP
|
||
|
||
;ROUTINE TO FIND CODED VALUE OF LINE SPEED IN BAUD
|
||
;ARGS: T1/SPEED IN BAUD
|
||
;CALL: PUSHJ P,FNDSPD
|
||
; RETURN HERE, CODED VALUE IN T1
|
||
|
||
FNDSPD: MOVSI T2,-LSPLEN## ;MAKE AOBJN POINTER
|
||
CAME T1,LSPTAB##(T2) ;IS THIS THE SPEED?
|
||
AOBJN T2,.-1 ;NO, TRY NEXT ONE
|
||
SKIPL T2 ;MAYBE, POINTER STILL VALID?
|
||
MOVEI T2,0 ;NO, INVALID SPEED, BUT SAY 0
|
||
HRRZ T1,T2 ;PUT CODE IN T1
|
||
POPJ P,
|
||
SUBTTL HANDLE DATASET(S) ANSWERED
|
||
|
||
;HERE FROM DTESER WHEN A DATASET WAS ANSWERED BY RSX-20F
|
||
|
||
TTDDWA: PUSHJ P,CHKP1 ;CHECK P1 FROM DTESER
|
||
PJRST EATMSG## ;COULDN'T, IGNORE THIS MESSAGE
|
||
TTDDW1: SUBI P3,2 ;ACCOUNT FOR TWO BYTES/ARGUMENT
|
||
JUMPL P3,CPOPJ## ;RETURN WHEN COUNT EXHAUSTED
|
||
ILDB U,P4 ;GET DLS LINE NUMBER
|
||
|
||
;ZERO THE LINE'S SPEED BYTES SO THAT INITIA WON'T GET A MISTAKEN NOTION AS TO
|
||
;WHAT THIS LINE'S SPEED IS. RSX20F SHOULD BE COMING ALONG SOON TO TELL US WHAT
|
||
;THE SPEED REALLY IS. THIS IS WORKING ON THE ASSUMPTION THAT ALL RSX20F
|
||
;DIALUPS ARE ALSO AUTOBAUD DETECT LINES, WHICH IS CURRENTLY THE CASE. SHOULD
|
||
;THIS EVER CHANGE ...
|
||
|
||
PUSHJ P,DLSMON ;CONVERT TO MONITOR LINE NUMBER IN U
|
||
PJRST EATMSG## ;OUT OF RANGE, IGNORE THIS MESSAGE
|
||
MOVE U,LINTAB##(U) ;GET LDB ADDRESS
|
||
SE1ENT ;ENTER SECTION 1
|
||
SETZ T1, ;GET LINE SPEED BYTE FOR ZERO
|
||
DPB T1,LDPSPD## ;CLEAR SPEEDS IN LDB
|
||
DPB T1,[POINT 4+4,LDBTTD##(U),7] ;BOTH SPEEDS, BOTH PLACES
|
||
MOVSI T1,LTLACK##!LTLTIM## ;MAKE SURE WE AREN'T WAITING
|
||
ANDCAM T1,LDBTTD##(U) ; FOR AN ACK ON THIS LINE
|
||
LDB U,P4 ;GET THE DLS LINE NUMBER AGAIN
|
||
IBP P4 ;MOVE PAST UNUSED BYTE
|
||
PUSHJ P,TTDCDD ;CONVERT DLS LINE # TO DSCTAB INDEX
|
||
JRST TTDDW1 ;OUT OF RANGE, LOOP FOR NEXT ARGUMENT
|
||
MOVEI T3,DSTRNG## ;GET CODE FOR PHONE RANG
|
||
PUSHJ P,DSCREC## ;CALL SCNSER
|
||
MOVEI T3,DSTON## ;RSX-20F ALREADY HAS DATASET ON
|
||
PUSHJ P,DSCREC## ;TELL SCNSER
|
||
JRST TTDDW1 ;LOOP FOR NEXT ARGUMENT
|
||
|
||
|
||
SUBTTL HANDLE DATASET(S) HUNG UP
|
||
|
||
;HERE FROM DTESER ON DATASET(S) HUNG UP
|
||
|
||
TTDDHU: PUSHJ P,CHKP1 ;CHECK P1 FROM DTESER
|
||
PJRST EATMSG## ;COULDN'T, IGNORE THIS MESSAGE
|
||
TTDDH1: SUBI P3,2 ;ACCOUNT FOR TWO BYTES/ARGUMENT
|
||
JUMPL P3,CPOPJ## ;RETURN IF COUNT EXHAUSTED
|
||
ILDB U,P4 ;GET DLS LINE NUMBER
|
||
IBP P4 ;MOVE PAST UNUSED BYTE
|
||
PUSHJ P,TTDCDD ;CONVERT DLS LINE # TO DSCTAB INDEX
|
||
JRST TTDDH1 ;OUT OF RANGE, LOOP FOR NEXT ARGUMENT
|
||
MOVEI T3,DSTOFF## ;GET CODE FOR DATASET OFF
|
||
PUSHJ P,DSCREC## ;TELL SCNSER
|
||
JRST TTDDH1 ;LOOP FOR NEXT ARGUMENT
|
||
SUBTTL RECEIVE LINE DATA FROM RSX-20F
|
||
|
||
;HERE TO HANDLE CHARACTER DATA FOR DLS LINES
|
||
;THIS ROUTINE PROCESSES "MULTIPLEXED" INPUT (DATA,LINE,DATA,LINE,...)
|
||
|
||
DLSLND: PUSHJ P,CHKP1 ;CHECK P1 FROM DTESER
|
||
PJRST EATMSG## ;COULDN'T, IGNORE THIS MESSAGE
|
||
DLSLN1: SUBI P3,2 ;DECREMENT COUNT BY 2
|
||
JUMPL P3,CPOPJ## ;RETURN IF DONE
|
||
ILDB T3,P4 ;GET DATA
|
||
ILDB U,P4 ;GET DLS LINE NUMBER
|
||
PUSHJ P,DLSMON ;CONVERT TO MONITOR LINE NUMBER IN U
|
||
JRST DLSLN1 ;OUT OF RANGE, LOOP FOR NEXT ARGUMENT
|
||
PUSHJ P,GIVLND ;GIVE CHARACTER TO SCNSER
|
||
JRST DLSLN1 ;LOOP FOR MORE
|
||
|
||
|
||
|
||
;HERE TO HANDLE CHARACTER DATA FOR CTY
|
||
|
||
CTYLND: PUSHJ P,CHKP1 ;CHECK P1 FROM DTESER
|
||
PJRST EATMSG## ;COULDN'T, IGNORE THIS MESSAGE
|
||
HRRZ U,.CPCTN## ;GET CTY LINE NUMBER
|
||
CTYLN1: SUBI P3,2 ;ACCOUNT FOR TWO BYTES/ARGUMENT
|
||
JUMPL P3,CPOPJ## ;RETURN IF COUNT EXHAUSTED
|
||
ILDB T3,P4 ;GET DATA
|
||
IBP P4 ;FIX UP POINTER
|
||
PUSHJ P,GIVLND ;GIVE CHARACTER TO SCNSER
|
||
JRST CTYLN1 ;LOOP FOR ANY MORE
|
||
|
||
|
||
|
||
;HERE TO HAND THE CHARACTER TO SCNSER, CHECK TO XOFF HANDLED BY -20F
|
||
|
||
GIVLND: SE1ENT ;ENTER SECTION 1
|
||
MOVE U,LINTAB##(U) ;GET LDB ADDRESS
|
||
ANDI T3,CK.CHR ;KEEP ONLY CHARACTER
|
||
MOVE T1,T3 ;COPY THE CHARACTER
|
||
SKIPL LDBATR##(U) ;EIGHT-BIT TERMINAL?
|
||
ANDI T1,CK.CH7 ;NO, KEEP ONLY ASCII PART
|
||
CAIE T1,"S"-100 ;INCOMING XOFF
|
||
CAIN T1,"Q"-100 ;OR XON
|
||
CAIA ;YES, DO SOME CHECKING
|
||
PJRST RECPTY## ;NO, GIVE IT TO SCNSER
|
||
MOVSI T2,LTLAXF## ;HAVE WE ENABLED AUTO-XOFF YET
|
||
TDNN T2,LDBTTD##(U) ;DON'T SAY -20F STOPPED IF IT DIDN'T
|
||
JRST GIVLN1 ;
|
||
MOVSI T2,LTLXOF## ;BIT SAYING WE TOLD -20F TO STOP OUTPUT
|
||
CAIN T1,"S"-100 ;XOFF?
|
||
IORM T2,LDBTTD##(U) ;MARK SINCE IT DID IT ITSELF
|
||
CAIN T1,"Q"-100 ;XON?
|
||
ANDCAM T2,LDBTTD##(U) ;CLEAR SINCE IT DID IT ITSELF
|
||
PUSHJ P,SETCHP## ;COME BACK AND CHECK IF XOFF/XON IS A DATA CHAR
|
||
GIVLN1: PJRST RECPTY## ;NOW GIVE THE XOFF/XON TO SCNSER
|
||
SUBTTL PROCESS NORMAL ACK MESSAGE FOR TERMINALS
|
||
|
||
;HERE TO PROCESS ACK MESSAGE FOR DLS LINES
|
||
|
||
DLSACK: PUSHJ P,CHKP1 ;CHECK P1 FROM DTESER
|
||
PJRST EATMSG## ;COULDN'T, IGNORE THIS MESSAGE
|
||
DLSAC1: SUBI P3,2 ;DECREMENT COUNT BY 2
|
||
JUMPL P3,CPOPJ## ;RETURN WHEN COUNT EXHAUSTED
|
||
ILDB U,P4 ;GET DLS LINE NUMBER
|
||
IBP P4 ;MOVE PAST UNUSED BYTE
|
||
PUSHJ P,DLSMON ;GET MONITOR LINE NUMBER IN U
|
||
JRST DLSAC1 ;OUT OF RANGE, LOOP FOR NEXT ARGUMENT
|
||
PUSHJ P,PRCACK ;ACK THE LINE
|
||
JRST DLSAC1 ;LOOP FOR NEXT ARGUMENT
|
||
|
||
|
||
|
||
;HERE FROM DTESER ON ACK MESSAGE FOR CTY
|
||
|
||
CTYACK: PUSHJ P,CHKP1 ;CHECK P1 FROM DTESER
|
||
PJRST EATMSG## ;COULDN'T, IGNORE THIS MESSAGE
|
||
CTYAC1: SUBI P3,2 ;ACCOUNT FOR TWO BYTES/ARGUMENT
|
||
JUMPL P3,CPOPJ## ;RETURN WHEN COUNT EXHAUSTED
|
||
ILDB T1,P4 ;GET DLS LINE NUMBER
|
||
IBP P4 ;MOVE PAST UNUSED BYTE
|
||
HLRZ U,.CPCTN## ;GET CTY DLS LINE NUMBER
|
||
CAME T1,U ;IS THIS IT?
|
||
JRST CTYAC1 ;NO, LOOP FOR NEXT ARGUMENT
|
||
HRRZ U,.CPCTN## ;GET -10 LINE NUMBER
|
||
PRCACK: SE1ENT ;ENTER SECTION 1
|
||
MOVE U,LINTAB##(U) ;GET LDB ADDRESS
|
||
MOVSI T1,LTLACK##!LTLTIM## ;WAITING FOR ACK
|
||
ANDCAM T1,LDBTTD##(U) ;NOT ANYMORE
|
||
PJRST TOREQ## ;GET LINE STARTED AGAIN
|
||
SUBTTL ACK ALL PROCESSING FOR RSX-20F TERMINALS
|
||
|
||
;HERE TO HANDLE ACK ALL MESSAGE FOR DLS LINES
|
||
|
||
DLSAAL: SE1ENT ;ENTER SECTION 1
|
||
PUSHJ P,CHKP1 ;CHECK P1 FROM DTESER
|
||
PJRST EATMSG## ;COULDN'T, IGNORE THIS MESSAGE
|
||
PUSHJ P,SAVE3## ;SAVE DTESER'S ACS
|
||
MOVE P1,.CPCPN## ;GET CPU NUMBER
|
||
MOVE P2,TTDOFS##(P1) ;GET STARTING LINE NUMBER FOR TTD GROUP
|
||
MOVSI P3,LTLACK##!LTLTIM## ;WAITING FOR ACK
|
||
DLSAA1: CAML P2,TTDLOM##(P1) ;STILL IN THIS TTD GROUP?
|
||
PJRST DLSAA2 ;NO, ACK CTY AND RETURN
|
||
MOVE U,LINTAB##(P2) ;YES, GET LDB ADDRESS
|
||
ANDCAM P3,LDBTTD##(U) ;SIGNAL LINE ACK'ED
|
||
PUSHJ P,TOREQ## ;KICK THE LINE
|
||
AOJA P2,DLSAA1 ;LOOP FOR NEXT LINE
|
||
DLSAA2: HRRZ U,.CPCTN## ;GET CTY LINE NUMBER
|
||
MOVE U,LINTAB##(U) ;GET LDB ADDRESS
|
||
ANDCAM P3,LDBTTD##(U) ;SIGNAL LINE ACK'ED
|
||
PJRST TOREQ## ;EXIT, GIVING THE LINE A KICK
|
||
SUBTTL ONCE A SECOND ROUTINES
|
||
|
||
;HERE ONCE A SECOND (CALLED THROUGH ISRCHK DISPATCH)
|
||
|
||
TTDSEC: PUSHJ P,SKPMPP## ;RUNNING PRIMARY PROTOCOL
|
||
POPJ P, ;NO, WAIT UNTIL WE ARE
|
||
PUSHJ P,SAVE4## ;SAVE NOW IN CASE WE NEED THEM
|
||
MOVSI T2,F20LPP ;DID WE SWITCH PROTOCOL AND BACK AGAIN
|
||
TDNN T2,.CP20F## ; SET BY SVPPC
|
||
JRST TTDSE1 ;NO, GO CHECK OUT DATASETS
|
||
ANDCAM T2,.CP20F## ;YES, CLEAR BIT
|
||
HRLZ P1,.CPCPN## ;GET CPU,,0 FOR DTEQUE
|
||
MOVEI P2,EM.IND+.EMSNA ;THIS IS A SEND ALL
|
||
MOVEI P3,CONSIZ ;SIZE OF CONTINUED MESSAGE
|
||
MOVE P4,[POINT 8,CONMSG] ;POINT TO THE MESSAGE
|
||
SETZ S, ;NO POST ADDRESS
|
||
SKIPL DEBUGF## ;DON'T BOTHER IF DEBUGGING
|
||
S0PSHJ DTEQUE## ;TELL TERMINAL USERS WE ARE NOT "NOT RUNNING"
|
||
JFCL ;IGNORE ERRORS HERE
|
||
TTDSE1: MOVSI P1,F20SDT ;DOES DTESER WANT US TO TELL
|
||
TDNE P1,.CP20F## ;THE FRONT-END ABOUT A DATE TIME CHANGE?
|
||
PUSHJ P,DTEDTM## ;YES, DO SO
|
||
ANDCAM P1,.CP20F## ;AND CLEAR THE FLAG
|
||
MOVEI T1,ST.NRL ;GET BIT FOR NO REMOTE LOGINS
|
||
MOVSI T2,F20ADS ;ANSWER DATASET FLAG
|
||
TDNE T1,STATES## ;REMOTE LOGINS ALLOWED?
|
||
JRST [TDNN T2,.CP20F## ;IS -20F ANSWERING DATASETS
|
||
JRST TTDSE3 ;NO, DO NEXT THING IN SECOND CODE
|
||
ANDCAM T2,.CP20F## ;CLEAR FLAG THAT WE TOLD -20F ITS OK
|
||
JRST TTDSE2] ;AND TELL IT TO STOP ANSWERING
|
||
TDNE T2,.CP20F## ;IS -20F ANSWERING DATASETS
|
||
JRST TTDSE3 ;YES, GO ON TO NEXT THING
|
||
IORM T2,.CP20F## ;MARK THAT WE TOLD IT TO ANSWER
|
||
TDZA P3,P3 ;ZERO MEANS ENABLE TO ANSWER DATASETS
|
||
TTDSE2: MOVEI P3,1 ;NON-ZERO MEANS DON'T ANSWER DATASETS
|
||
HRLZ P1,.CPCPN## ;GET CPU,,0 FOR DTEQUE
|
||
MOVE P2,[.EMDH1,,.EMEDR];ENABLE/DISABLE DATASETS FOR DH11 LINES
|
||
SETZB P4,S ;NO BYTE POINTER OR POST ROUTINE
|
||
S0PSHJ DTEQUE## ;QUEUE THE REQUEST
|
||
JFCL ;IGNORE ANY FAILURE
|
||
TTDSE3: POPJ P, ;DONE WITH ONCE-A-SECOND CODE FOR NOW
|
||
|
||
;HERE ONCE A SECOND (CALLED FROM SCNSEC)
|
||
|
||
TTDSIN::MOVSI T2,LTLACK## ;GET BIT IMPLYING HUNG CHECKING IS DESIRED
|
||
TDNN T2,LDBTTD##(U) ;IS IT ON?
|
||
POPJ P, ;NO, NOTHING TO DO HERE
|
||
LDB T2,LDPTDT## ;YES, GET CURRENT TIMEOUT VALUE
|
||
SOJLE T2,TTDSI1 ;GO IF EXPIRED
|
||
DPB T2,LDPTDT## ;STORE UPDATED VALUE IF NOT
|
||
POPJ P, ;DONE FOR THIS SECOND
|
||
TTDSI1: JUMPL T2,CPOPJ## ;LTLACK MUST HAVE CLEARED WHILE WE WERE LOOKING
|
||
MOVSI T2,LTLACK##!LTLTIM## ;GET BITS TO CLEAR
|
||
ANDCAM T2,LDBTTD##(U) ;ALLOW THE LINE TO GO AGAIN
|
||
PUSH P,T1 ;PRESERVE LDBDCH
|
||
PUSHJ P,TOPOKE## ;KICK THE LINE
|
||
JRST TPOPJ## ;RETURN HAPPY
|
||
SUBTTL COMMON SUBROUTINES FOR TTDINT
|
||
|
||
;ROUTINE TO CHECK P1 AS SUPPLIED BY DTESER FOR VALID -20F DTE
|
||
;ARGS: P1/CPU,,DTE (FROM DTESER)
|
||
;CALL: PUSHJ P,CHKP1
|
||
; RETURN HERE IF NOT A -20F FRONT END
|
||
; RETURN HERE IF IT IS
|
||
|
||
CHKP1: HRLZ T1,.CPCPN## ;GET THIS CPU,,0
|
||
CAMN T1,P1 ;THIS IT
|
||
AOS (P) ;YES, OK TO PROCEED
|
||
POPJ P, ;NO, IGNORE CALL
|
||
|
||
|
||
;ROUTINE TO SET UP FOR CALL TO DTEQUE FOR DLS LINE FUNCTIONS
|
||
;ARGS: U/LDB ADDRESS (ENTER AT STDT1 IF P3 IS ALREADY THE LINE NUMBER)
|
||
;CALL: PUSHJ P,STDTQ
|
||
; ALWAYS RETURNS HERE WITH
|
||
; P1/CPU # ,, DTE #
|
||
; P2/.EMDLS ,, <UNCHANGED>
|
||
; P3/DLS # ,, 0
|
||
; P4/ 0
|
||
; S/ 0
|
||
|
||
STDTQ: LDB P3,LDPLNO## ;GET -10 LINE NUMBER
|
||
STDT1: MOVE P1,.CPCTN## ;GET DLS,,-10 LINE NUMBERS FOR CTY ON THIS CPU
|
||
CAIE P3,(P1) ;IS THIS THE CTY
|
||
JRST STDT2 ;NO, WORK HARDER
|
||
HLLZ P3,P1 ;GET DLS # ,, 0
|
||
JRST STDT3 ;FINISH UP AND RETURN
|
||
STDT2: MOVE P4,.CPCPN## ;GET CPU NUMBER
|
||
SUB P3,TTDOFS##(P4) ;CONVERT TO A DLS LINE ON THIS CPU
|
||
HLRZS P1 ;ISOLATE CTY LINE NUMBER
|
||
CAIL P3,(P1) ;LINE BELOW THE CTY
|
||
AOS P3 ;NO, ACCOUNT FOR THE HOLE
|
||
HRLZS P3 ;POSITION THE ANSWER
|
||
STDT3: HRLZ P1,.CPCPN## ;GET CPU,,0 FOR DTEQUE
|
||
HRLI P2,.EMDLS ;SET LH P2 = DLS FUNCTION
|
||
SETZB P4,S ;CLEAR BYTE POINTER AND POST ADDRESS
|
||
POPJ P, ;AND RETURN
|
||
;ROUTINE TO CONVERT DLS LINE # TO DSCTAB INDEX AND RANGE CHECK
|
||
;ARGS: U/DLS LINE NUMBER
|
||
;CALL: PUSHJ P,TTDCDD
|
||
; RETURN HERE IF OUT OF RANGE OR CTY ( NOT IN DSCTAB )
|
||
; RETURN HERE IF VALID, DSCTAB INDEX IN U
|
||
|
||
TTDCDD: PUSHJ P,DLSMON ;FIRST, CONVERT TO -10 LINE NUMBER
|
||
POPJ P, ;OUT OF RANGE
|
||
PUSH P,T1 ;SAVE T1
|
||
HRRZ T1,.CPCTN## ;GET CTY FOR THIS CPU
|
||
CAIN T1,(U) ;THIS IT
|
||
JRST TPOPJ## ;YES, CTY'S ARE NOT IN DSCTAB, OUT OF RANGE
|
||
MOVEI U,TTDDSO##(U) ;ADJUST FOR DSCTAB
|
||
JRST TPOPJ1## ;AND RETURN
|
||
|
||
|
||
|
||
;ROUTINE TO CONVERT DLS LINE NUMBER TO MONITOR LINE NUMBER AND RANGE CHECK
|
||
;ARGS: U/DLS LINE NUMBER
|
||
;CALL: PUSHJ P,DLSMON
|
||
; RETURN HERE IF LINE NUMBER OUT OF RANGE
|
||
; RETURN HERE, MONITOR LINE NUMBER IN U
|
||
|
||
DLSMON: PUSH P,T1 ;SAVE ALL
|
||
MOVS T1,.CPCTN## ;GET -10 LINE NUMBER,,DLS LINE NUMBER
|
||
CAIN U,(T1) ;IS THIS CTY ON THIS CPU
|
||
JRST DLSMN1 ;YES
|
||
CAIL U,(T1) ;IS THIS LINE BELOW CTY#
|
||
SOS U ;NO, COMPENSATE FOR HOLE
|
||
MOVE T1,.CPCPN## ;GET CPU WE ARE ON
|
||
ADD U,TTDOFS##(T1) ;ADD TO START OF LINES ON THIS CPU
|
||
CAMGE U,TTDLOM##(T1) ;IN RANGE?
|
||
AOS -1(P) ;YES, GIVE GOOD RETURN
|
||
JRST TPOPJ## ;RESTORE T1 AND RETURN
|
||
DLSMN1: HLRZ U,T1 ;GET CTY LINE NUMBER
|
||
JRST TPOPJ1## ;AND TAKE GOOD RETURN
|
||
|
||
|
||
END
|
||
|