Trailing-Edge
-
PDP-10 Archives
-
BB-J724A-SM_1980
-
sources/hdte20.p11
There is 1 other file named hdte20.p11 in the archive. Click here to see a list.
;
.SBTTL DTE20 - DRIVE A PDP-10 THROUGH A DTE20
;
; THIS MODULE REPLACES THE DL10 MODULE IN THE DN60 FRONT-END
; PROGRAM TO USE THE DTE20 ON A 2040 CONFIGURATION RATHER
; THAN THE DTE10 ON THE 1090 OR THE DL10 ON A 1070.
;
; NOTE THAT THE DTE10 AND DTE20 ARE THE SAME HARDWARE; THE
; DIFFERENCE LIES IN THE PDP-10 SOFTWARE BEHIND THEM.
; THE DTE10 IS DRIVEN BY D60SER/D6SINT, WHICH INTERFACE
; TO THE TOPS-10 DTESER MODULE FOR THE DN60. THE DTE20 IS
; DRIVEN BY THE TOPS-20 MODULE FESRV WHICH INTERFACES TO
; DTESRV. FESRV WAS ENHANCED FOR THE DN60 PROJECT, BUT
; IT IS NOT SPECIAL-PURPOSE AS D60SER/D6SINT IS.
;
;
.REPT 0
COPYRIGHT (c) 1980, 1979
DIGITAL EQUIPMENT CORPORATION, maynard, mass.
THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE
INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER
COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY
TRANSFERRED.
THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
CORPORATION.
DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
.ENDR
;
.SBTTL DTE20 DRIVER
;
;THIS SECTION CONTAINS THE DTE20 DRIVER AND THE QUEUED PROTOCOL
;INTERFACE CONFORMING TO THE RSX-20F SPECIFICATIONS FOR
;COMMUNICATION BETWEEN THE PDP-11 AND DECSYSTEM-20.
;
; AT THE FRONT ARE SUBROUTINES CALLED FOR INTERRUPT,
; INITIALIZATION, ONCE-A-CLOCK-TICK PROCESSING AND
; ONCE-A-SECOND PROCESSING. AFTER THESE IS THE TASK.
;
; COPYRIGHT, 1979, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS 01754
;
;
;
; REVISION HISTORY
;
; 3(001) BS UNSUSPEND DEVICE WHEN LESS THAN 2 MESSAGES QUEUED TO DTE TASK
;
; 3(002) BS PREVENT ENABLING OF LINE GREATER THAN WHAT FE IS SET UP FOR
;
; 3(003) BS ADD LINE COMMAND TO SET LINE SIGNATURE
;
; 3(004) BS INCLUDE LINE FLAGS IN DEVICE STATUS
;
; 3(005) BS DO NOT CLEAR ACTIVITY BIT ON EOF NEW INPUT PERMISSION REQUESTED
;
; 3(006) BS CLEAR DEVICE ACTIVE BIT WHEN ABORT COMPLETE ACKED
;
; 3(007) BS ADD SECOND BYTE OF LINE FLAGS TO LINE STATUS
; ADD LINE SIGNATURE TO DEVICE STATUS
;
; 3(010) BS GIVE REJECT FOR DEVICE STATUS ON DISABLED LINE
;
; 3(011) BS REJECT DEVICE COMMAND ON DISABLED LINE
;
; 3(012) BS REJECT WRITE DATA COMMAND ON DISABLED LINE
;
; 3(013) BS DO NOT DELETE LCB TO PREVENT KMC11 CONFUSION
;
; 3(014) BS GIVE REJECTS FOR INCORRECT DEVICE NUMBERS HASP/3780/2780
;
; 3(015) BS CLEAN UP LINE BLOCK STATISTICS WHEN LINE IS DISABLED
;
; 4(016) BS PREVENT DTE INTERRUPT ROUTINE AND DRIVER FROM LOSING MESSAGES
;
; 4(017) BS MODIFY TGHA CODE TO HANDLE CHANGE 4(016)
;
; 4(020) BS ADD SOME MORE DEBUG CODE
;
; 4(021) BS IMPROVE PERFORMANCE OF DT.INT
;
; 4(022) BS CHANGE OFFSET INTO COMMUNICATIONS REGION FOR TGHA
;
; 4(023) BS RAISE PRIORITY OF DLDRVR TASK
;
; 4(024) BS LOCK OUT DTE20 INTERRUPTS DURING ONCE A SECOND SUBROUTINE
;
; 4(025) BS CHANGE READ LINE STATUS TO TRANSFER CORRECT NUMBER OF BYTES
;
; 4(026) BS CORRECT LINE COMMAND ONE TO FIND PROPER OFFSET FOR BSC TASK
;
; 4(027) BS CORRECT OFFSET TO MESSAGE POINTERS FOR HASP
;
; 4(030) BS LOWER PRIORITY OF DTE TASK TO PREVENT RECEIVER OVERRUNS
;
;
VDTE20=030
;
;
VEDIT=VEDIT+VDTE20
;
;
;
;
.SBTTL DTE20 INTERRUPT
;
; THE FOLLOWING SERVICES THE BASIC DTE20 INTERRUPTS BY TURNING
; BITS OFF IN THE TCB OF THE DRIVERS TASK; THE ACTUAL PROCESSING
; IS DONE BY THE TASKS SCHEDULED AS A RESULT OF INDICATION OF
; ARRIVAL OF HARDWARE INTERRUPTS
; THE LEVEL FOR THE INTERRUPTS IS 6
;
;
DT.INT: MOV R0,-(SP) ;SAVE R0
MOV R1,-(SP) ;SAVE R1
MOV R2,-(SP) ;SAVE R2
CLR DBLFLG ;CLEAR DOORBELL FLAG 4(016)
MOV DTEBAD,R1 ;GET THE BASE ADR OF REGS
11$: MOV TE.STW(R1),R0 ;LOOK AT THE STATUS WORD TO FIGURE OUT
; WHY WE ARE HERE.
BIT #TS.ETD!TS.XNT!TS.XEE,R0 ;EXIT ONLY IF ALL INTP BITS ARE OFF
BEQ 18$ ;ALL CLEAR,FREE TO LEAVE
TRACE TRCTEN,R0 ;TRACE STATUS
MOV R0,DLSSAV ;SAVE FOR ERROR TRACE
BIT #TS.XER!TS.MPE!TS.EPE!TS.EET,R0 ;ANY ERROR BITS SET?
BNE 19$ ;YES,FATAL ERROR
MOV TCDLDR,R2 ;POINT R2 TO DTE20 TASK
BIT #TS.ETD,R0 ;IS 11 DONE SET?
BEQ 12$ ;NO
INC DTIEDN ;COUNT ELEVEN DONE INTPS
MOV #TS.ENT,TE.STW(R1) ;CLEAR INTP CONDITION
TRACE TRCTEN,DTIEDN ;ON ELEVEN DONE COUNT
12$: TST DTIEDN ;ANY PENDING INTERRUPTS?
BEQ 13$ ;NO
BIT #EBTEDN,(R2) ;IS IT WAITING FOR TO11DONE
BEQ 13$ ;NO
BIC #EBTEDN!EBWAIT,(R2) ;MAYBE,UNWAIT IT
;
;
; HERE TEST FOR TO TEN DONE INTERRUPT
;
13$: BIT #TS.XNT,R0 ;TEN DONE INTP?
BEQ 14$ ;NO,CHECK FOR OTHERS
INC DTIXDN ;COUNT TEN DONE INTERRUPTS
MOV #TS.XTS,TE.STW(R1) ;CLEAR INTP CONDITION
TRACE TRCTEN,DTIXDN ;ON TEN DONE COUNT
14$: TST DTIXDN ;ANY TO-TEN DONE PENDING INTPS?
BEQ 15$ ;NO
BIT #EBTXDN,(R2) ;IS IT WAITING FOR TO10DONE?
BEQ 15$ ;NO
BIC #EBTXDN!EBWAIT,(R2) ;YES,UNWAIT IT
15$: BIT #TS.XEE,R0 ;DID-10 REQUEST -11 INTERRUPT?
BEQ 16$ ;NO
INC DTIDBL ;COUNTS # OF OUTSTANDING
; DOORBELL INTERRUPTS
MOV #1, DBLFLG ;SET THE DOORBELL FLAG 4(016)
MOV #TS.EIS,TE.STW(R1) ;CLEAR INTERRUPT CONDITION
TRACE TRCTEN,DTIDBL ;TRACE DOORBELL COUNT
16$: TST DTIDBL ;ANY PENDING DOORBELLS?
BEQ 17$ ;NO
BIT #EBTENI,(R2) ;YES,IS IT WAITING FOR DOORBELL INTP
BEQ 17$ ;NO,CHECK FOR OTHER CONDITIONS
;4(021) BIC #EBTENI!EBWAIT,(R2) ;MAYBE,UNWAIT IT
;
; RESTORE ALL THE REGS USED AND COMPLETE THE INTERRUPT
;
17$:
BR 11$ ;SEE IF ALL INTP CONDITIONS TAKEN CARE OF
;
;
;
18$: ;WHEN ALL CLEAR COME HERE
TST DBLFLG ;DID WE GET A DOORBELL ? 4(016)
BEQ 21$ ;NO, EXIT 4(021)
CLR DBLFLG ;YES, CLEAR THE DOORBELL FLAG 4(016)
JSR PC, DVLECK ;CHECK FOR TGHA AND VALID EXAM
TST TGFLAG ;IS TGHA RUNNING ?
BEQ 20$ ;NO, COUNT AS REGULAR DOORBELL
DEC DTIDBL ;YES, CANCEL THIS DOORBELL
BR 21$ ;EXIT WITHOUT WAKING DTE TASK 4(021)
20$:
TST DTIDBL ;ANY PENDING DOORBELLS?
BEQ 22$ ;NO
BIT #EBTENI,(R2) ;YES,IS IT WAITING FOR DOORBELL INTP
BEQ 22$ ;NO,CHECK FOR OTHER CONDITIONS
BIC #EBTENI!EBWAIT,(R2);WAITING FOR DOORBELL, WAKE DTE TASK 4(021)
22$:
JSR PC, DVWAKE ;WAKE THE DTE DRIVER IF WAITING FOR TGHA 4(017)
21$: ;NEW LABEL 4(021)
MOV (SP)+,R2 ;RESTORE R2
MOV (SP)+,R1 ;RESTORE R1
MOV (SP)+,R0 ;RESTORE R0
RTI ;EXIT THE INTERRUPT
;
; HERE IF THE DTE20 HAS AN ERROR
;
19$: STOPCD DL10 ;DTE20 ERROR.
;
DBLFLG: .WORD 0 ;DOORBELL FLAG 4(016)
;
; ROUTINE CALLED AT STARTUP TO INITIALIZE THE DTE SOFTWARE INTERFACE
; (THE HARDWARE NEEDS NO INITIALIZATION). IT WAITS FOR THE -10 TO EXIT
; PRIMARY PROTOCOL BECAUSE THERE IS NO PRESENT MECHANISM FOR RESTARTING
; THE QUEUED PROTOCOL. IT MUST BE RESTARTED BECAUSE OTHERWISE WE WOULD
; NOT KNOW WHAT STATE WE WERE IN WHEN WE GOT RESTARTED AND THEREFORE
; CANNOT CONTINUE USING THE PRESENT INCARNATION.
;
INITDL: ;INITIALIZE THE COMM AREA'S
CLR TGFLAG ;CLEAR TGHA RUNNING FLAG
MOV DTEBAD,R0 ;GET DTE REGS BASE ADR
MOV #50,R2 ;NO OF TRIES
TST DLACKF ;OUT OF PRIMARY PROTOCOL?
BEQ 14$ ;YES
MOV #TS.RST,TE.DG2(R0) ;RESET DTE20
11$: CLR TE.XA1(R0) ;TRY TO EXAMINE START OF COMM AREA
CLR TE.XA2(R0) ;TO SEE IF QUEUED PROTOCOL IS RUNNING
MOV #3000,DTEDTO ;TIME OUT FOR DEP/EXAM
12$: BIT #TS.XDN,TE.STW(R0) ;EXAMINE DONE?
BNE 13$ ;YES
DEC DTEDTO ;DECREMENT TIME COUNT
BNE 12$ ;LOOP IF TIMER NOT EXPIRED
BR 14$ ;EXAMINE FAILED,MUST BE OUT OF PRIMARY PROTOCOL
;
13$: BIT #TS.EPE,TE.STW(R0) ;ANY PARITY ERROR?
BNE 21$ ;YES,GO TO STOP CODE
TST TE.XW2(R0) ;DO WE WAIT FOR PRIM PROTO TO GO AWAY?
BEQ 14$ ;IT IS OUT OF PRIMARY PROTOCOL
DEC R2 ;DONE WITH ALL TRIES
BNE 11$ ;NO,LOOP
RTS PC ;GIVE UP AFTER ALL THE TRIES
;
;
; HERE WE ARE OUT OF PRIMARY PROTOCOL, SAFE TO RESTART
;
14$: CLR DLACKF ;INDICATE OUT OF PRIMARY PROTOCOL
MOV #TS.EEX,TE.STW(R0) ;RING -10'S DOORBELL
;
;NOW TRY TO GET BACK INTO PRIMARY PROTOCOL AGAIN
;
15$: CLR TE.XA1(R0) ;TRY TO EXAMINE COMM AREA
CLR TE.XA2(R0)
MOV #3000,DTEDTO ;TIMEOUT FOR EXAMINE
16$: BIT #TS.XDN,TE.STW(R0) ;EXAMINE DONE?
BNE 17$ ;YES
DEC DTEDTO ;NO, TIMEOUT YET?
BNE 16$ ;NO, LOOP TILL TIME EXPIRES
RTS PC ;GIVE UP
;
;
17$: TST TE.XW2(R0) ;IN PRIMARY PROTOCOL?
BEQ 18$ ;NO
TST TE.XW3(R0) ;YES,IS VALID EXAMINE ON?
BNE 19$ ;YES,VALID EXAMINE IS ON
18$: RTS PC ;GIVE UP AFTER ALL THE TRIES
;
19$: MOV #-1,DLACKF ;IN PRIMARY PROTOCOL
CLR DLGONE ;INDICATE TEN IS UP
CLR TGFLAG ;CLEAR TGHA RUNNING FLAG
MOV #10,R1 ;NO OF TRIES
20$: JSR PC,DSPDLS ;CHECK FOR TEN TO BE REALLY UP
TST DLGONE ;IS TEN STILL UP?
BNE 18$ ;NO
SOB R1,20$ ;TRY AGAIN
CLR DTIDBL ;CLEAR INTERRUPT COUNTERS
CLR DTIXDN ;FOR TO-TEN DONE
CLR DTIEDN ;TO-ELEVEN DONE
CLR DT10AK ;PERMIT TO ACK TO TEN
CLR DTPTCT ;COUNT OF PUNTED MESSAGES
.IIF NE,DEBUG,BIS #TRCTEN,TRCBTS ;TRACE -10 INTERACTIONS TO DEBUG EXAMINE/DEPOSIT
JSR PC,DLINDB ;SETUP AND INIT THE DATA BASES
BCS 21$ ;INITIALIZATION ERROR
RTS PC ;ALL DONE INITIALIZING,EXIT
21$: STOPCD DTA20 ;DTE20 INITIALIZATION ERROR
;
;
; ROUTINE TO REQUEST -10 TO RELOAD US. DONE SO BY SETTING THE RELOAD
; FLAG IN OUR STATUS WORD IN THE COMM AREA.
;
DLSTCS: MOV DLGONE,R1 ;ARE WE TALKING TO -10?
INC R1 ;IF DLGONE -1,10 IS DOWN
BEQ 12$ ;NO, FORGET IT
.IF NE,DEBUG
MOV DTEBAD,R0 ;GET BASE ADR OF DTE REGS
MOV #20,R2 ;NO OF DTE20 REGISTERS TO SAVE
MOV #DTESAV,R1 ;POINT TO AREA TO BE SAVED
11$: MOV (R0)+,(R1)+ ;SAVE THE REGISTER
SOB R2,11$ ;LOOP IF NOT DONE SAVING ALL 20 REGS
.ENDC ;NE,DEBUG
;
;NOW WE CAN CHANGE STATUS AROUND
;
BIS #DLLD11,DTSTT ;SET RELOAD REQUEST FLAG
MOV DTEPCA,R3 ;GET ADDRESS OF COMM AREA DATA BLOCK
MOV DTEBAD,R0 ;SETUP DTE BASE ADR
MOV #DLSTAT-DLPIN,R2 ;INDICATE THAT -11 IS FINISHED
ADD DTDMYN(R3),R2 ;POINT TO STATUS WORD
MOV #TS.DEP,TE.XA1(R0) ;INDICATE WRITE
MOV DTSTT,TE.XW1(R0) ;SET UP TO DEPOSIT
MOV DTSTT+2,TE.XW2(R0) ;
MOV DTSTT+4,TE.XW3(R0) ;
MOV R2,TE.XA2(R0) ;START XFER
MOV #TS.EEX,TE.STW(R0) ;TELL -10 ABOUT CATASTROPHE
12$: RTS PC ;-10 SHOULD RELOAD US IMMEDIATELY
;
.SBTTL DTE20 ONCE-A-TICK
;
; SUBROUTINE TO CHECK ON THE DTE20 ONCE A JIFFIE
;
DSPDLT: CLC ;FLAG SUCCESS
RTS PC ;RETURN
;
.SBTTL DTE20 ONCE-A-SECOND
;
; ONCE-A-SECOND SUBROUTINE FOR DTE20 THINGS
;
DSPDLS:
MFPS -(SP) ;SAVE OLD PSW 4(024)
MTPS #BR3 ;LOCK OUT DTE20 INTERRUPTS 4(030)
; MOV R1,-(SP) ;SAVE R1
; MOV R0,-(SP) ;SAVE R0
MOV DTEBAD,R0 ;BASE ADR OF REGS
CLR TE.XA1(R0) ;LOOK AT HEADER WORD TO FIND
CLR TE.XA2(R0) ;IF -10 IS DEAD
JSR PC,DLWEDN ;IS TEN TALKING TO US?
BCS 11$ ;-10 IS DOWN
; TST TE.XW2(R0) ;GET PROCESSOR #
; BEQ 11$ ;NOT IN PRIMARY PROTOCOL YET
TST TE.XW3(R0) ;CHECK FOR VALID EXAMINE?
; BNE 13$ ;-10 IS UP
BNE 18$ ;-10 IS UP, WAKE DL DRIVER TASK
TST TGFLAG ;-10 MAY BE DOWN, CHECK FOR TGHA
BNE 10$ ;YES, TGHA HAS BEEN RUNNING
CLR TGCNT ;NO, INITIALIZE THE 5 SECOND WAIT
MOV #1, TGFLAG ;SET TGHA RUNNING FLAG
10$: INC TGCNT ;ADD 1 TO # OF SECONDS WAITING
CMP TGCNT, #7 ;HAS TIME ELAPSED ?
BGE 11$ ;YES, -10 IS REALLY DEAD
BR 13$ ;NO, UPDATE COUNTERS AND CONTINUE WAITING
;
; HERE WHEN THE PDP-10 HAS GONE DOWN.
;
11$: MOV #TS.DEI,TE.STW(R0) ;DONT LISTEN TO TEN
MOV #-1,DLGONE ;TELL THE WORLD DTE20 DOWN
CLR JIFCLK ;MAKE SURE LOOP CATCHER DOES'NT GO
CLR DLGNTM ;CLEAR TIME SINCE DTE20 GONE
12$:
MTPS (SP)+ ;RESTORE OLD PSW 4(024)
SEC ;SET CARRY FOR FAILURE
; BR 14$ ;RETURN
RTS PC ;RETURN
13$: INCB DTKPLV ;INCREMENT KEEP ALIVE CTR
MOV DTEBAD,R0 ;PREPARE TO DEPOSIT
MOV DTKPLV,TE.XW3(R0) ;THE COUNT TO -20
MOV #TS.DEP,TE.XA1(R0);SET DEPOSIT FLAG
MOV #DLPW1,TE.XA2(R0) ;START XFER
JSR PC,DLWEDN ;WAIT FOR EXAM/DEP
;14$: MOV (SP)+,R0 ;RESTORE REGS
; MOV (SP)+,R1
MTPS (SP)+ ;RESTORE OLD PSW 4(024)
15$: RTS PC ;RETURN
;
;
; HERE TO WAKE DL DRIVER TASK AFTER TGHA HAS RUN
18$:
TST TE.XW2(R0) ;GET PROCESSOR #
BEQ 11$ ;NOT IN PRIMARY PROTOCOL
;THE -10 LIED TO US
BR 13$ ;UPDATE COUNTERS AND CONTINUE 4(017)
DVWAKE:
CLR TGFLAG ;CLEAR TGHA RUNNING FLAG
MOV R0, -(SP) ;SAVE R0
MOV TCDLDR, R0 ;POINT TO DL DRIVER TASK
BIT #EBVALE, (R0) ;ARE WE WAITING FOR VALID EXAMINE ? 4(016)
BEQ 19$ ;NO, CONTINUE 4(016)
;YES, WAKE THE DTE TASK UP 4(016)
BIC #EBVALE!EBWAIT, (R0) ;NOT WAITING FOR VALID EXAMINE
19$: ;NEW LABEL 4(016)
MOV (SP)+, R0 ;RESTORE R0
RTS PC ;RETURN 4(017)
;4(017) BR 13$ ;UPDATE COUNTERS AND CONTINUE
; HERE TO CHECK FOR DISABLED LINES
;
DLCKDL: CLR R1 ;START WITH LINE ZERO
11$: ASL R1 ;LINE # * 2
MOV DQLCB(R1),R0 ;POINT TO LCB
BEQ 12$ ;NONE THERE
BIT #LS.ENB,(R0) ;LINE DISABLED?
BNE 12$ ;NO.
BIT #LF.ABC,LB.FGS(R0) ;YES, CHECK IF ABORT COMPLETE
BEQ 12$ ;NOT YET
MOV R0,R4 ;LCB PTR IN R4
MOV LB.TC1(R4),R0 ;POINT TO BSC TCB
;3(013) BEQ 13$ ;ERROR, BSC TCB MISSING
BEQ 12$ ;;++BS-BSC TCB ALREADY DELETED 3(013)
MOV R1,-(SP) ;SAVE LINE # * 2
MOV TCBP1,R3 ;POINT TO START OF CHAIN
JSR PC,DLRLTC ;RELEASE THE BSC TCB
MOV R3,TCBP1 ;UPADTE THE BSC CHAIN PTR
CLR LB.TC1(R4) ;;++BS-CLEAR THE POINTER TO BSC TCB 3(013)
;3(013) MOV R4,R0 ;POINT TO LCB
;3(013) JSR PC,FRESTG ;FREE THE LCB ALSO
MOV (SP)+,R1 ;GET BACK THE LINE # * 2
;3(013) CLR DQLCB(R1) ;CLEAR LCB POINTER
JSR PC, HSSAVR ;;++BS-SAVE THE REGISTERS 3(015)
MOV DQLCB(R1), R2 ;;++BS-POINT R2 TO LCB 3(015)
MOV R2, R3 ;;++BS-POINT R3 TO LCB 3(015)
ADD #LB.ST1, R2 ;;++BS-POINT TO START OF LINE STATISTICS 3(015)
ADD #LB.ST2-2, R3 ;;++BS-DO ALL EXCEPT LINE DRIVER TYPE 3(015)
14$: CLR (R2)+ ;;++BS-CLEAR AN ENTRY 3(015)
CMP R2, R3 ;;++BS-HAVE WE REACHED THE END ? 3(015)
BNE 14$ ;;++BS-NO 3(015)
JSR PC, HSRESR ;;++BS-YES, ALL DONE, RESTORE REGISTERS 3(015)
12$: ASR R1 ;LINE # BACK
INC R1 ;FOR NEXT LINE
CMP R1,#NLINES ;IF LINE CONFIGURED
BLO 11$ ;LOOP FOR NEXT LINE
RTS PC ;RETURN
;
;3(013) 13$: STOPCD DTM ;TCB MISSING
;
.SBTTL DLINDB -- TURN THE DTE20 ON
; AND SETUP PROCESSOR COMMUNICATION DATA BASE
;
; THIS ROUTINE WILL SET UP THE TABLES NECESSARY TO
; INITIALIZE THE COMMUNICATIONS BETWEEN THE PDP-10
; AND THE PDP-11.
;
; CALL: JSR PC,DLINDB
;
; ON RETURN:
; C = 0: R0 = 1 TO INDICATE SUCCESS
; C = 1: ERROR
;
; NOTE THAT THIS ROUTINE USES R5 IN A NON-STANDARD WAY.
; THIS IS BECAUSE IT WAS TAKEN FROM THE DN87S CODE AND
; WE WOULD PREFER NOT TO HAVE TO RE-WRITE IT TO MAKE IT
; CONFORM TO THE DN60 CODING CONVENTIONS.
;
DLINDB: MOV R5,-(SP)
CLR -(SP)
CLR -(SP)
MOV DTEBAD,R0 ;FIND THE COMMON DTE20
CLR R1 ;SET UP TO FIND PROCESSOR NUMBER
CLR R2 ;START TRANSFER OF ABS WORD 0 OF EPT (MY PROCESSOR NUMBER
MOV #DTXTM3,R3 ;SET UP ADDRESS TO STORE WORDS
CLR R4
JSR PC,DLSWED ;WAIT FOR EXAMINE/DEPOSIT
BCS 11$ ;E BOX STOP
MOV @R3,R4 ;YES --FIND OFFSET TO MY R/W AREA
MOVB @#DTXTM2+1,R2 ;FIND THE PROCESSOR NUMBER
; PROCESSOR NUMBER TO LOW ORDER BITS
BIC #177760,R2 ;MASK OFF JUNK(0.-15. LEGAL)
MOV R2,DLMYPN ;SAVE PROCESSOR NUMBER
INC R2 ;FIND COMMUNICATIONS VIRTUAL 2
MOV R2,DLCMBS ;SAVE BASE OF COMMUNICATIONS AREA
ADD R4,R2 ;ADD OFFSET TO BASE OF COMM AREA
MOV R2,DLDPOF ;SET CORRECT OFFSETT
JSR PC,DLSWED ;WAIT FOR TRANSFER
11$: BCS DLINDR ;
12$: MOV @#DTXTM2,R5 ;PICK UP THE NUMBER OF 8 TM BLOCKS
BIC #177770,R5 ;FIND THE NUMBER OF 8 WORD BLOCKS IN MY AREA
SUB #2,R5 ;ACCOUNT FOR MY GENERAL SECTION
MOV R2,2(SP)
;
; CONTINUED ON THE NEXT PAGE
;
;
; CONTINUATION OF DLINDB
;
MOV R5,0(SP) ;SAVE COUNT OF BLOCKS
DLIND1: ADD #DLPIN,2(SP) ;LOOK AT A COMMUNICATIONS AREA TO ANOTHER PROCESSOR
MOV 2(SP),R2
CLR R4
JSR PC,DLSWED ;WAIT FOR TRANSFER
11$: BCS DLINDR ; E BOX STOPPED
MOV @R3,R4 ;FIND @ROCESSOR NUMBER
MOV #DTPIDT,R5 ;SET INITIAL POINTER
BIC #177770,R4 ;MASK OFF JUNK
BEQ 13$ ;YES -- CONTINUE
12$: ADD #5*2,R5 ;NO -- LOOK AT NEXT ENTRY
SOB R4,12$ ;TRY UNTIL ALL DONE
13$: MOV @#DTXTM2,R4 ;FIND NUMBER OF 8 WORD BLOCS
BIC #177770,R4 ;MASK OFF POSSIBLE GARBAGE
SUB R4,@SP ;UPDATE COUNT OF BLOCKS
CLR @R5 ;SET UP TO CLEAR TABLE IF NO DTE
MOV @#DTXTM1,R4 ;PICK UP DTE NUMBER
BIT #4,R4 ;DTE HERE?
BEQ 15$ ;NO -- DON'T ENTER IN TABLE
SWAB R4 ;MAKE MOD 40 (8)
ROR R4
ROR R4
ROR R4
BIC #177637,R4 ;MASKOFF JUNK
ADD #174400,R4 ;POINT TO FIRST BLOCK OF DTE'S
CMP R4,DTEBAD ;PRIMARY DTE?
BNE 14$ ;NO -- DON'T SET TABLE POINTER
MOV R5,DTEPCA ;SAVE TABLE OFFSET
14$: MOV R4,@R5 ;SET DTE ADDRESS IN TABLE
MOV #37777,@R4 ;SET UP DELAY COUNTER
MOV #TS.EEE,TE.STW(R4) ;YES -- ENABLE INTERRUPT ON IT
15$: MOV R2,DTEMYN(R5) ;SET THE ADDRESS OF EXAMINE MY AREA FOR N
;
; CONTINUED ON NEXT PAGE
;
;
; CONTINUATION OF DLINDR.
; MAKE ADDRESS OF THE ADDRESS OF DEPOSIT MY AREA FOR N
MOV R2,DTDMYN(R5) ;STORE IT
SUB DLDPOF,DTDMYN(R5) ;RESTORE SUBRESS FOR EXAMINE OF THIS BLOCK
ADD #DLPCA-DLPIN,R2 ;READ POINTER TO HIS COMM AREA
CLR R4
JSR PC,DLSWED ;WAIT FOR EXAMINE/DEPOSIT
16$: BCS DLINDR ;E BOX STOPPED
MOV @R3,R2 ;FIND THE EXAMINE ADDRESS
ADD DLCMBS,R2 ;ADD OFFSET TO COMMON AREA
MOV R2,DTEHSG(R5) ;SET DTEHSG ADDRESS IN TABLE
ADD #DLPIN,R2 ;POINT TO HIS FIRST TABLE FOR OTHER PROCESSORS
17$: CLR R4
JSR PC,DLSWED ;WAIT FOR EXAMINE/DEPOSIT
18$: BCS DLINDR
CMPB DLMYPN,@R3 ;SAME PROCESSOR NUMBER?
BEQ 19$ ;YES -- FOUND MY ENTRY
MOV @#DTXTM2,R4 ;NO -- FIND NEXT ENTRY IN LIST
BIC #177770,R4 ;IT IS IN 8 WORD INCREMENTS
;;++KR-FIX FOR TOPS-20 MONITOR PROBLEM
BNE 20$ ;;++KR-NON ZERO IS GOOD
INC R4 ;;++KR-MAKE IT NON ZERO
20$:
;;++KR-END FIX
ASL R4 ;SO IT MUST BE SHIFTED LEFT 3 BITS
ASL R4 ;
ASL R4 ;
ADD R4,R2 ;READ NEXT BLOCK
BR 17$ ;AND TRY AGAIN
;
19$: MOV R2,DTEHSM(R5) ;STORE DTEHSM ADDRESS
MOV @SP,R5 ;DONE ALL BLOCKS??
BHI DLIND1 ;NO -- TRY NEXT BLOCK
CLR DTQCNT ;RESET PROTOCOL COUNTERS
CLR DTQSTA ;INIT STATE MECHANISM, CLEAR CARRY
DLINDR: MOV (SP)+,R5 ;RESTORE STACK
MOV (SP)+,R5
MOV (SP)+,R5
RTS PC
;
.SBTTL DLSWED -- INTERNAL SUBROUTINE START AND WAIT FOR EX/DEP
;
; THIS SUBROUTINE STARTS A DEPOSIT/EXAMINE SEQUENCE AND WAITS FOR
; ITS COMPLETION. IT CHECKS TO SEE IF THE BOOTSTRAP
; PROTOCOL IS NECESSARY BY CHECKING THE EXAMINE VALID BIT
; AFTER EVERY EXAMINE/DEPOSIT. IT IS NOT NECESSARY TO
; CHECK MORE THAN ANY ONE RANDOM EXAMINE VAILD BIT
; BECAUSE IF ONE IS 0 THEN THE PROCESSOR HAS
; TO REVERT TO THE BOOTSTRAP PROTOCOL.
;
; CALL: JSR PC,DLSWED
;
; R0 -- ADDRESS OF DTE20
; R1 -- HIGH ORDER EXAMINE/DEPOSIT ADDRESS WORD (FOR TE.XA1)
; R2 -- LOW ORDER EXAMINE/DEPOSIT ADDRESS WORD (FOR TE.XA2)
; R3 -- ADDRESS TO XFER 3 WORD BLOCK TO OR FROM
;
; ON RETURN:
;
; C = 0: SUCCESS, NO REGISTERS ALTERED.
; C = 1: ERROR.
;
DLSWED: MOV R3,-(SP) ;SAVE REGISTERS
BIT #TS.DEP,R1 ;CHECK FOR DEPOSIT
BNE 12$ ;YES -- GO TO DEPOSIT PART OF SUB
MOV R1,TE.XA1(R0) ;SET UP ADDRESS OF XFER IN DTE
MOV R2,TE.XA2(R0) ;START XFER
JSR PC,DLWEDN ;WAIT FOR EXAMINE/DEPOSIT
BCS 14$ ;COMPLAIN ABOUT E BOX STOPPED
MOV TE.XW3(R0),(R3)+ ;STORE THE WORD XFERED
MOV TE.XW2(R0),(R3)+
MOV TE.XW1(R0),(R3)+
11$: TST R4 ;PRIV EXAMINE/DEP?
BNE 14$ ;YES -- DON'T DO CHECKS
CLR TE.XA1(R0) ;SEE IF WE CAN READ ANYTHING
CLR TE.XA2(R0) ;START TRANSFER
JSR PC,DLWEDN ;WAIT FOR XFER
BCS 14$ ;E BOX STOPPED
TST TE.XW3(R0) ;VALID?
BNE 14$ ;YES -- PROCEED
BR 13$ ; NO - JUST SET CARRY AND RETURN
;
;
; HERE TO DO AN EXAMINE.
;
12$: MOV (R3)+,TE.XW3(R0) ;TRANSFER TO 10
MOV (R3)+,TE.XW2(R0) ;SET UP WORD IN DTE
MOV (R3)+,TE.XW1(R0)
MOV R1,TE.XA1(R0) ;SET HIGH ORDER ADDRESS
MOV R2,TE.XA2(R0)
JSR PC,DLWEDN ;WAIT FOR EXAMINE/DEPOSIT
BCC 11$ ;GO TO COMMON EXAMINE VALID BIT CHECK
;
; HERE IF THE 'EXAMINE VALID' BIT IS OFF. GIVE AN ERROR RETURN.
;
13$:
.IF NE,DEBUG
STOPCD DBG ;-10 STOPPED UNEXPECTEDLY
.ENDC
SEC
14$: MOV (SP)+,R3 ;RESTORE R3
RTS PC ;RETURN TO CALLER
;
.SBTTL DLWEDN -- INTERNAL SUBROUTINE WAIT FOR EXAMINE/DEPOSIT
;
; THIS SUBROUTINE WAITS FOR EXAMINE/DEPOSIT TRANSFERS AND
; CHECKS TO SEE THAT E BOX HAS NOT STOPPED.
;
; CALL: JSR PC,DLWEDN
;
; R0 -- ADDRESS OF DTE20
;
; ON RETURN:
; C = 0: SUCCESS
; C = 1: ERROR
;
DLWEDN: MOV #3000,DTEDTO ;SET UP TIMEOUT FOR TS.XDNE
11$: BIT #TS.XDN,TE.STW(R0) ;WAIT FOR TRANSFER TO COMPLETE
BNE 12$ ;DONE
DEC DTEDTO ;TIMEOUT?
BNE 11$ ;NO -- CONTINUE WAITING
SEC ;YES, ERROR.
RTS PC ;RETURN.
;
; HERE WHEN THE TRANSFER IS COMPLETE.
;
12$: BIT #TS.EPE,TE.STW(R0) ;CHECK FOR E BUS PARITY ERROR
BNE 13$ ;WE HAVE E-BUS PARITY
CLC ;CLEAR CC-C
RTS PC ;RETURN TO CALLER
;
; WE HAVE AN E-BUS PARITY ERROR. CALL THIS A FATAL ERROR.
;
13$: STOPCD DTE20 ;E-BUS PARITY ERROR
;
;
.SBTTL DTE20 TASK
;
; THIS TASK INTERFACES TO THE PDP-10 THROUGH THE DTE20
;
DLDRVR: ;DRIVER INTERFACE FOR DTE20
MFPS -(SP) ;SAVE PSW 4(023)
MTPS #BR3 ;LOCK OUT DTE INTERRUPTS 4(030)
11$: ;CHK FOR TGHA AND VALID EXAMINE
TST TGFLAG ;IS TGHA RUNNING
BNE 20$ ;YES, PUT TASK BACK TO SLEEP
18$: MOV #EBTENI!EBTXDN!EBTEDN!EBWAIT,(R5) ;SET UP FOR WAIT
MOV #JIFSEC,TCTIM(R5) ;TIME LIMIT FOR WAITING
12$: TST DTIEDN ;ANY TO-ELEVEN DONE INTP?
BEQ 13$ ;NONE
JSR PC,DLELDN ;YES,GO PROCESS TO ELEVEN DONE
BCS 16$ ;FAILURE
BR 11$ ;SUCCESS, LOOK FOR MORE INTERRUPTS
;
13$: TST DTIXDN ;ANY TO TEN DONE INTERRUPTS
BEQ 14$ ;NONE
TST DTIEDN ;HAS ANY 11-DONE SNEAKED IN?
BNE 12$ ;YES,IT HAS
JSR PC,DLTXDN ;NO,THEN PROCESS TO TEN DONE
BCS 16$ ;FAILURE RETURN
BR 11$ ;LOOK FOR MORE
;
14$: TST DTIDBL ;ANY DOORBELL INTERRUPTS?
BEQ 15$ ;NONE
TST DTIXDN ;ANY TO-TEN DONE SNEAKED IN?
BNE 12$ ;YES,START OVER
TST DTIEDN ;ANY TO-11 DONE SNEAKED IN?
BNE 12$ ;YES,START OVER
JSR PC,DLDRBL ;NO,THEN PROCESS DOORBELL
BCS 16$ ;FAILED
BR 11$ ;SUCCESS, LOOK FOR MORE WORK
;
15$:
MTPS (SP)+ ;RESTORE OLD PSW 4(023)
JSR PC,WAIT ;WAIT FOR AN INTERRUPT
BR DLDRVR ;
;4(023) BR 11$ ;LOOK FOR WORK TO DO
;
; HERE ON FATAL PROTOCOL ERROR OR 10 CRASHED
;
16$:
.IF NE,DEBUG ;4(020)
BIT #TRCTER,TRCHLT ;STOP ON PDP-10 ERROR?
BEQ 17$ ;NO.
STOPCD TER ;YES, PDP-10 ERROR
17$:
.ENDC ;.IF NE,DEBUG 4(020)
;
TST TGFLAG ;IS TGHA RUNNING?
BNE 20$ ;YES, PUT TASK TO SLEEP
19$:
MTPS (SP)+ ;RESTORE OLD PSW 4(023)
JSR PC, DTCERR ;DTE ERROR, DISABLE ALL LINES
JMP DLDRVR ;WAIT FOR ANOTHER COMMAND
;HERE TO PUT TASK TO SLEEP BECAUSE OF TGHA
20$: BIS #EBTENI!EBTXDN!EBTEDN!EBVALE!EBTIME!EBWAIT,(R5) ;WAITING FOR VALID EXAMINE
MOV #JIFSEC,TCTIM(R5) ;TIME LIMIT FOR WAITING
MTPS (SP)+ ;RESTORE OLD PSW 4(023)
JSR PC, WAIT ;WAIT FOR VALID EXAMINE AND/OR TGHA TO FINISH
JMP DLDRVR ;CHECK CONDITIONS AGAIN 4(023)
;4(023) JMP 11$ ;CHECK CONDITIONS AGAIN
;
; SUBROUTINE TO CHECK FOR VALID EXAMINE BEFORE EXECUTING
; A FUNCTION. THIS IS TO HANDLE TGHA PROTOCOL PAUSE.
DVLECK:
MOV R0, -(SP) ;SAVE R0
MOV R1, -(SP) ;SAVE R1
MOV R2, -(SP) ;SAVE R2
MOV R3, -(SP) ;SAVE R3
MOV DTEBAD,R0 ;GET BASE ADR OF DTE REGS
MOV DTEPCA,R3 ;SETUP COMMUN ADR
CLR TE.XA1(R0) ;READ STATUS WORD
MOV #DLSTAT-DLPIN,R2 ;FIND THE ADDRESS OF HIS DLSTAT-TO ME
ADD DTEHSM(R3),R2
MOV R2,TE.XA2(R0) ;READ THAT STATUS WORD
JSR PC,DLWEDN ;WAIT FOR EXAMINE
BCS 1$ ;IGNORE INTERRUPT IF NOT STARTED
TST TE.XW1(R0) ;VALID EXAMINE ? 4(022)
;4(022) TST TE.XW3(R0) ;VALID EXAMINE ?
BNE 2$ ;YES
1$: CLR TGCNT ;NO, SET UP 5 SECOND WAIT
MOV #1,TGFLAG ;NO, SET TGHA PROGRAM FLAG
BR 3$ ;EXIT
2$: CLR TGFLAG ;CLEAR TGHA PROGRAM FLAG
3$: MOV (SP)+, R3 ;RESTORE R3
MOV (SP)+, R2 ;RESTORE R2
MOV (SP)+, R1 ;RESTORE R1
MOV (SP)+, R0 ;RESTORE R0
RTS PC ;RETURN
TGFLAG: .WORD 0 ;FLAG TO INDICATE TGHA IS RUNNING
TGCNT: .WORD 0 ;5 SECOND COUNTER TO WAIT FOR TGHA
;
;THIS ROUTINE HAS BEEN REMOVED
;ITS FUNCTIONS ARE PERFORMED ELSEWHERE
;; HERE ON PDP-10 PROTOCOL ERROR.
;; ABORT ALL STREAMS AND DISABLE ALL LINES.
;;
; CLR R3 ;START WITH LINE NUMBER 0
;18$: MOV DQLCB(R3),R0 ;GET LCB POINTER
; BEQ 19$ ;NONE.
; BIC #LS.ENB,(R0) ;DISABLE THE LINE
; MOV LB.TC1(R0),R1 ;POINT TO BSC TASK
; BIS #TCOAB!TCIAB,TCFG2(R1) ;SIGNAL ABORT
; CMP #TTHASP,LB.DVT(R0) ;HASP LINE?
; BEQ 21$ ;YES.
; MOV LB.TCD(R0),R1 ;POINT TO XLATE TASK
; BIS #TCOAB!TCIAB,TCFG2(R1) ;SIGNAL ABORT
;19$: ADD #2,R3 ;NEXT LINE NUMBER * 2
; CMP #<NLINES*2>,R3 ;DONE ALL THE LINES?
; BNE 18$ ;NO, DO THE REST.
; BR DLDRVR ;YES, GO WAIT FOR ANOTHER COMMAND
;;
;; HERE TO ABORT ALL DEVICES ON HASP-LINE
;;
;21$: MOV LB.NTC(R0),R2 ;GET # OF TCBS FOR HASP LINE
; BNE 22$ ;IF IT HAS'NT BEEN SET, MAKE IT 5
; MOV #5,R2 ;THATS MAX # OF TCBS HASP LINE
;22$: MOV R0,R1 ;GET LCB PTR
;23$: ASL R2 ;DEVICE NUMBER * 2
; ADD R2,R1 ;ADD DEVICE #
; ASR R2 ;GET ORIGINAL DEV #
; MOV LB.TCD(R1),R1 ;POINT TO XLATE TCB OF DEVICE
; BEQ 24$ ;NO TCB FOR THE DEVICE
; BIS #TCOAB!TCIAB,TCFG2(R1) ;SIGNAL ABORT
;24$: SOB R2,23$ ;DO FOR ALL DEVICES ON HASP LINE
; BR 19$ ;GO TO NEXT LINE
;;
;
; SUBROUTINE TO CALL A SUBROUTINE BASED ON AN INDEX.
; THIS IS USED AS A DISPATCHER.
;
; R0 = POINTER TO DISPATCH TABLE. THE FIRST ENTRY IS
; THE MAX INDEX, THE REMAINDER BEING POINTERS
; TO SUBROUTINES.
; R1 = INDEX, 0 BASED.
;
; RETURNS WITH C SET IF THE INDEX IS OUT OF RANGE OR IF THE
; TABLE ENTRY SELECTED CONTAINS A ZERO. OTHERWISE RETURNS
; WITH C AS SPECIFIED BY THE SUBROUTINE.
;
DLDISP: TRACE TRCTEN,R1 ;TRACE DISPATCH PROCESS
CMP R1,(R0)+ ;IS INDEX IN RANGE?
BHI 11$ ;NO, FATAL ERROR.
ASL R1 ;YES, COMPUTE INDEX*2
ADD R1,R0 ;COMPUTE PLACE IN THE TABLE
MOV (R0),R1 ;PICK UP SUBROUTINE POINTER
BEQ 11$ ;0 = ERROR
JSR PC,(R1) ;NON-ZERO, CALL THE SUBROUTINE
RTS PC ;RETURN TO CALLER.
;
; HERE IF THE INDEX IS OUT OF RANGE OR IF THE SUBROUTINE POINTER
; IS ZERO.
;
;11$: SEC ;FLAG ERROR
; RTS PC ;RETURN.
11$: ;HERE TO FLAG ERROR
; SEC ;FLAG ERROR--THIS MAY BE NECCESSARY
.IF NE,DEBUG
STOPCD TER ;TEN ERROR IN ARGUMENTS
.ENDC ;.IF NE DEBUG
RTS PC ;RETURN.
;
;
;
; THE FOLLOWING COMMENTS DESCRIBE THE STATES FOR THE STATE-DRIVEN
; DTE PROCESSOR. THERE ARE TWO, LOOSELY COUPLED STATE
; MACHINES.
;
; ABBREVIATIONS USED IN THE DESCRIPTION BELOW ARE AS FOLLOWS:
;
; FEH - FRONT-END HEADER. THIS IS A DIRECT MESSAGE THAT
; DESCRIBES THE INDIRECT DATA THAT FOLLOWS AS "STRING DATA".
;
; EH - ED HEADER. THIS IS AN INDIRECT MESSAGE THAT DESCRIBES THE
; FOLLOWING INDIRECT MESSAGE (IF ANY) AS "WRITE DATA",
; "WRITE LINE COMMAND", "READ DATA", ETC.
;
; ED - ED DATA. THIS IS THE INDIRECT MESSAGE DESCRIBED BY
; THE EH MESSAGE ABOVE.
;
; ACK - ACKNOWLEDGE. THIS MESSAGE ACKNOWLEDGES RECEIPT AND
; PROCESSING OF THE LAST INDIRECT MESSAGE.
;
; A PROPER SEQUENCE CONSISTS OF FEH, EH OR FEH, EH, FEH, ED.
; WHERE RELAVENT, AN FEH IS REFERED TO AS "FEH FOR EH" OR
; "FEH FOR ED" BASED ON THE MESSAGE THAT FOLLOWS THE FEH.
;
; EACH MESSAGE IS PRECEEDED BY A DOORBELL.
;
; BEFORE AN FEH MAY BE SENT THE PREVIOUS FEH AND ITS FOLLOWING
; EH OR ED MUST BE ACKNOWLEDGED. THIS IS A SIMPLIFICATION OF
; THE TOPS-20 RULE.
;
; A COMPLETE TRANSACTION IS ALWAYS INITIATED BY THE -20
; WITH AN FEH FOLLOWED BY AN EH. DEPENDING ON THE
; CONTENTS OF THE EH, IT MAY BE FOLLOWED BY FEH, ED.
; THE PDP-11 REPLIES WITH FEH, EH AND, DEPENDING ON THE
; CONTENTS OF THE FIRST EH, MAY FOLLOW THIS BY
; FEH, ED. EXAMINE AND DEPOSIT DO NOT USE ED IN
; EITHER DIRECTION. NO FUNCTIONS USES ED IN BOTH
; DIRECTIONS.
;
; BELOW THE DESCRIPTION OF EACH STATE IS A BRIEF DESCRIPTION OF
; THE ACTION TAKEN WHEN THE APPROPRIATE EVENT OCCURS.
;
;
; STATE MACHINE "A" IS DRIVEN BY 11-DONE INTERRUPTS AND BY DOORBELLS.
;
;
; 0: WAITING FOR INITIAL DOORBELL. 11-DONE IS INVALID.
; READ FEH FOR EH.
;
; 2: WAITING FOR FEH FOR EH. DOORBELL IS INVALID.
; IF DEVICE IS WRONG, GO TO STATE 34.
; IF ALLOCATION MESSAGE, GO TO STATE 34.
; OTHERWISE, READ EH.
;
; 4: WAITING FOR DOORBELL FOR EH. 11-DONE IS INVALID.
; READ EH.
;
; 6: WAITING FOR EH. DOORBELL IS INVALID.
; IF FLAG DT10AK INDICATES THAT ED IS TO COME, THEN
; SEND ACK ONLY. SET MACHINE B FROM STATE 0 TO 2.
; IF DT10AK INDICATES THAT THERE IS NO ED, GO TO
; STATE 20, ELSE GO TO STATE 10.
;
; 10: WAITING FOR DOORBELL FOR FEH FOR ED. 11-DONE IS INVALID.
; READ FEH FOR ED.
;
; 12: WAITING FOR FEH FOR ED. DOORBELL IS INVALID.
; GO TO STATE 14.
;
; 14: WAITING FOR DOORBELL FOR ED. 11-DONE IS INVALID.
; READ ED.
;
; 16: WAITING FOR ED. DOORBELL IS INVALID.
; IF MACHINE "B" IS AT STATE 4, SEND ACK+FEH AND
; SET MACHINE "B" TO STATE 10, THEN GO TO STATE 22.
; IF MACHINE "B" IS NOT AT STATE 4, GO TO STATE 20.
;
; 20: WAITING FOR ACK OF EH TO COMPLETE. (I.E., FOR MACHINE "B"
; TO GO FROM STATE 2 TO STATE 6 OR 10.) NEITHER 11-DONE
; NOR DOORBELL ARE VALID.
;
;
; 22: WAITING FOR DOORBELL FOR ACK FOR EH. 11-DONE IS INVALID.
; READ ACK FOR EH.
;
; 24: WAITING FOR ACK FOR EH. DOORBELL IS INVALID.
; IF THE EH INDICATES THAT NO ED WILL BE RETURNED,
; AND MACHINE "B" IS IN STATE 14, SET BOTH STATES TO ZERO.
; IF MACHINE "B" IS NOT IN STATE 14,
; GO TO STATE 32.
; IF THE EH INDICATES THAT AN ED WILL BE RETURNED,
; AND MACHINE "B" IS IN STATE 14,
; SEND FEH FOR ED, SET MACHINE "B" TO STATE 16
; AND GO TO STATE 26.
; IF MACHINE "B" IS NOT IN STATE 14, JUST GO TO STATE 26.
;
; 26: WAITING FOR DOORBELL FOR ACK FOR ED. 11-DONE IS INVALID.
; READ ACK FOR ED.
;
; 30: WAITING FOR ACK FOR ED. DOORBELL IS INVALID.
; IF MACHINE "B" IS IN STATE 22, SET
; THE STATES OF BOTH MACHINES TO 0.
; IF MACHINE "B" IS NOT IN STATE 22, GO TO STATE 32.
;
; 32: GOT FINAL ACK. 11-DONE AND DOORBELL ARE INVALID.
;
; 34: IGNORING 11-DONE.
; IF WE GET AN 11-DONE, IGNORE IT.
; IF WE GET A DOORBELL, TREAT IT THE SAME AS FOR STATE 0.
;
;
; STATE MACHINE "B" IS DRIVEN BY 10-DONE.
;
; 0: IDLE. 10-DONE IS INVALID.
;
; 2: WAITING FOR COMPLETION OF ACK (OR ACK+FEH) FOR EH.
; IF MACHINE "A" IS NOT IN STATE 20, JUST GO TO STATE 4.
; IF MACHINE "A" IS IN STATE 20, SET IT TO STATE 22.
; IF DT10AK INDICATES THAT AN ED WILL FOLLOW IT,
; SEND AN ACK + FEH (MACHINE "A" HAS ALREADY PROCESSED THE ED
; OR IT WOULD NOT BE IN STATE 20) AND GO TO STATE 10.
; IF DT10AK INDICATES THAT AN ED WILL NOT FOLLOW IT,
; SEND EH TO-TEN FOR SENDING RESULTS BACK.
; AND THEN GO TO STATE 10 TO WAIT FOR EH COMPLETION.
;
; 4: GOT COMPLETION OF ACK FOR EH. 10-DONE IS INVALID.
;
; 6: WAITING FOR COMPLETION OF ACK FOR ED.
; SEND FEH FOR EH.
;
; 10: WAITING FOR COMPLETION OF FEH FOR EH.
; SEND EH.
;
; 12: WAITING FOR COMPLETION OF EH.
; IF MACHINE "A" IS IN STATE 26 THEN
; SEND FEH FOR ED AND GO TO STATE 16.
; IF MACHINE "A" IS NOT IN STATE 26 THEN
; GO TO STATE 14.
;
; 14: WAITING FOR ACK FOR EH. 10-DONE IS INVALID.
;
; 16: WAITING FOR COMPLETION OF FEH FOR ED.
; SEND ED.
;
; 20: WAITING FOR COMPLETION OF ED.
; IF MACHINE "A" IS IN STATE 32 THEN SET BOTH STATES
; TO 0, OTHERWISE GO TO STATE 22.
;
; 22: WAITING FOR ACK FOR ED. 10-DONE IS INVALID.
;
.SBTTL TO-TEN DONE INTERRUPT PROCESSING FOR DTE20
;
; THIS ROUTINE DECIDES WHAT TO DO WHEN A TO-TEN DONE INTERRUPT
; IS RECOGNIZED. IT IMPLEMENTS MACHINE "B" DESCRIBED ABOVE.
;
DLTXDN: TRACE TRCTEN,DTQSTA ;TRACE FOR TEN STATE
MOV DTEBAD,R0 ;GET BASE ADR OF DTE REGS
MOV DTEPCA,R3 ;SETUP COMMUNICATION BASE ADR
DEC DTIXDN ;DECREMENT INTP COUNT
MOVB DT10ST,R1 ;FIND WHAT STATE THE TEN IS
JSR PC,@11$(R1) ;THEN CALL APPROPRIATE ROUTINE
;TO PROCESS TO-TEN DONE INTERRUPT
CLC ;SUCCESSFUL
RTS PC ;RETURN
;
; TO TEN DONE SUBROUTINE CALL TABLE
;
11$: .WORD DTXDED ;IDLE STATE
.WORD DTXS02 ;WAITING FOR COMPLETION OF ACK FOR EH
.WORD DTXDED ;GOT COMPLETION OF ACK FOR EH
.WORD DTXDED ;THIS IS CURRENTLY UNUSED STATE.
.WORD DTXS10 ;WAITING FOR COMPLETION OF
;ACK + FEH FOR EH
.WORD DTXS12 ;WAITING FOR COMPLETION OF EH
.WORD DTXDED ;WAITING FOR ACK FOR EH
.WORD DTXS16 ;WAITING FOR COMPLETION OF FEH FOR ED
.WORD DTXS20 ;WAITING FOR COMPLETION OF ED
.WORD DTXDED ;WAITING FOR ACK FOR ED
;
DTXDED: STOPCD DTC20 ;GOOFY TEN DONE INTERRUPTS
;
;
; HERE ON 10-DONE IN STATE 2. THE ACK FOR EH IS COMPLETE (WRITES)
; OR WHEN ACK + FEH ARE COMPLETED FOR A READ OPERATION.
;
DTXS02: CMPB #20,DT11ST ;IS THE OTHER MACHINE WAITING FOR US?
BEQ 11$ ;YES.
MOVB #4,DT10ST ;NO, WE MUST WAIT FOR IT.
RTS PC ;RETURN UNTIL IT IS READY.
;
11$: MOVB #22,DT11ST ;UNWAIT THE OTHER MACHINE
TST DT10AK ;DOES MACHINE "A" WANT ANOTHER ACK (FOR ED)?
BEQ DTXS10 ;NO.
JSR PC,DTSACK ;YES, SEND AN ACK
MOVB #10,DT10ST ;WAIT FOR IT TO COMPLETE
RTS PC ;RETURN UNTIL IT IS DONE.
;
; HERE WHEN ACK + FEH FOR EH ARE COMPLETE.
; SEND THE EH.
;
DTXS10: MOVB DT10UC(R5),R2 ;AMOUNT OF DATA TO BE SENT NOW
CLRB DT10UC(R5) ;NO DATA TO FOLLOW THIS
SWAB DT10DF(R5) ;SWAP BYTES TO CORRECT DIRECTION IN TEN
SWAB DT10AD(R5) ;SWAP DIRECTION OF ADR
SWAB DT10DT(R5) ;EXAMINE DATA OR AMT OF XFER
MOV R5,R1 ;BUILD POINTER TO SECOND PART
ADD #DT10DF,R1 ; OF HEADER TO TEN
JSR PC,DTXISD ;SEND INDIRECT DATA TO TEN
MOVB #12,DT10ST ;WAITING FOR EH TO COMPLETE
RTS PC ;RETURN
;
;
; HERE WHEN THE EH IS COMPLETE. WAIT FOR MACHINE "A"
; IF NECESSARY. OTHERWISE SEND FEH FOR ED. IF THERE IS NO
; ED TO BE RETURNED THEN MACHINE "A" WILL NOT BE IN STATE 26.
;
DTXS12: CMPB #26,DT11ST ;IS THE OTHER MACHINE WAITING?
BEQ 11$ ;YES, SEND FEH FOR ED.
MOVB #14,DT10ST ;NO, WAIT FOR IT.
RTS PC ;RETURN.
;
11$: MOVB DT10DT+1(R5),DT10UC(R5) ;BYTE COUNT TO FOLLOW
;REMEMBER DT10DT WAS SWAPPED EARLIER
MOV R5,R1 ;BUILD POINTER TO HEADER
ADD #DT10HD,R1 ;IN TCB AREA
MOV #12,R2 ;NO OF BYTES TO XFER
JSR PC,DTXMSD ;SEND AS DIRECT HEADER
MOVB #16,DT10ST ;WAIT FOR FEH FOR ED TO COMPLETE
RTS PC ;RETURN
;
; HERE WHEN THE FEH FOR ED IS COMPLETE. NOW SEND ED.
;
DTXS16: MOVB DT10UC(R5),R2 ;AMOUNT OF DATA TO XFER NOW
BIC #^C<377>,R2 ;ONLY 8 BITS PERMITTED IN COUNT
CLRB DT10UC(R5) ;NO DATA TO FOLLOW AFTER THIS
MOV DTXADR(R5),R1 ;R1 PONTS TO DATA TO-TEN
JSR PC,DTXISD ;SEND DATA INDIRECT
MOVB #20,DT10ST ;WAIT FOR DATA TO COMPLETE
RTS PC ;RETURN
;
; HERE WHEN THE ED MESSAGE IS COMPLETE. BE SURE ITS ACK HAS BEEN PROCESSED
; (WAIT FOR IT IF NECESSARY).
;
DTXS20: CMPB #32,DT11ST ;IS OTHER MACHINE WAITING FOR US?
BEQ 11$ ;YES, MUST BE ALL DONE.
MOVB #22,DT10ST ;NO, WE ARE WAITING FOR IT.
RTS PC ;RETURN.
;
11$: JSR PC,DTCLRS ;CLEAR STATE OF DTE
RTS PC ;RETURN.
;
; SUBROUTINE TO CLEAR THE STATE OF THE DTE
;
DTCLRS: CLRB DT10ST ;SET TO IDLE STATE
CLRB DT11ST ;OTHER MACHINE, TOO.
CLR DTXADR(R5) ;INITIALIZE PTR TO IND DATA
BIC #DLTHIP!DLTHBM,DTSTT+2 ;CLEAR INDIRECT IN PROGRESS
.IIF NE,DEBUG,CLR DTO10Q(R5) ;DONE WITH SENDING HEADER
CLR DT10FN(R5) ;ALL DONE WITH THIS OPERATION
CLR DT10AK ;NO EXTRA ACK NEEDED
RTS PC ;RETURN
;
;
; SUBROUTINE TO START AN INDIRECT DATA TRANSFER TO - TEN
;
; R1 = POINTER TO THE DATA TO BE SENT TO TEN
; R2 = AMOUNT OF DATA TO BE TRANSFERRED
; (MUST NOT BE LARGER THAN 255)
;
DTXISD: ;START INDIRECT DATA XFER TO-TEN
MOV R1,TE.XAD(R0) ;SET THE TO TEN ADDRESS
.IF NE,DEBUG
MOV R1,DTXTAS(R5) ;SAVE TO TEN ADR
MOV R2,DTXTSZ(R5) ;SAVE SIZE OF XFER
.ENDC
CLR TE.XW1(R0) ;DEPOSIT THE WORD COUNT
CLR TE.XW2(R0)
.IF NE,DEBUG
BIT #^C<377>,R2 ;MORE THAN 8 BITS?
BEQ 11$ ;NO.
STOPCD DBG ;PROTOCOL CAN'T HANDLE THIS
11$:
.ENDC ;.IF NE,DEBUG
MOV R2,TE.XW3(R0)
MOV #DLXFSZ-DLPIN,R1 ;DEPOSIT THE SIZE IN 10 MEMORY
ADD DTDMYN(R3),R1 ;GET OFFSET
MOV #TS.DEP,TE.XA1(R0) ;SET DEPOSIT
MOV R1,TE.XA2(R0) ;START XFER
JSR PC,DLWEDN ;WAIT FOR DEPOSIT
BCS 12$ ;CANNOT
BIS #DLTHIP,DTSTT+2 ;SAY WE'RE DOING INDIRECT
MOV #TS.TBM,TE.DG3(R0) ;AND TELL HARDWARE THAT WE'RE DOING
; IT IN BYTE MODE
MOV DTSTT,TE.XW1(R0);SET IN 10 MEMORY
MOV DTSTT+2,TE.XW2(R0)
MOV DTSTT+4,TE.XW3(R0)
ADD #DLSTAT-DLXFSZ,TE.XA2(R0) ;DEPOSIT IN 10 MEMORY
JSR PC,DLWEDN ;WAIT FOR DEPOSIT
BCS 12$ ;CANNOT
MOV #TS.EEX,TE.STW(R0) ;RING TENS DOORBELL
RTS PC ;RETURN
;
;
; HERE IF EXAMINE OR DEPOSIT FAILED
;
12$: STOPCD TER ;UNABLE TO TALK TO THE 10
;
;
; THIS SUBROUTINE HAS TWO ENTRY POINTS . DTSACK TO SEND
; AN ACK + FEH TO THE TEN AND DTSAK FOR SENDING THE
; ACK ALONE TO THE TEN TO ACKNOWLEDGE RECEIPT OF DATA.
;
DTSACK: MOV #24,R2 ;SEND ACK + FEH TOGETHER
BR DTSAC ;SET UP ACK HEADER
DTSAK: MOV #12,R2 ;SEND ONLY THE ACK TO-TEN
DTSAC:
MOV #12,DTAKHD(R5) ;LENGTH OF HEADER
MOV #DTFSAK,DTAKFN(R5) ;ACK FUNCTION
MOV #DLDPFE,DTAKDV(R5) ;FE DEVICE
CLR DTAKUC(R5) ;CLEAR BEFORE PUTTING FE#
MOVB DT11UC+1(R5),DTAKUC(R5) ;FE# RIGHT JUSTIFIED
MOV R5,R1 ;GET TCB ADR
ADD #DTAKHD,R1 ;POINT TO "ACK" BLOCK HEADER
JSR PC,DTXMSD ;SEND ACK TO TEN
RTS PC ;RETURN
;
.SBTTL TO-ELEVEN DONE INTERRUPT PROCESSING
;
; THIS ROUTINE DECIDES WHAT TO DO WHEN A TO-11 DONE
; INTERRUPT IS RECOGNIZED. IT IMPLEMENTS PART OF MACHINE "A"
; DESCRIBED ABOVE.
;
DLELDN: TRACE TRCTEN,DTQSTA ;ON ELEVEN DONE STATE
MOV DTEBAD,R0 ;GET DTE REGS ADR
MOV DTEPCA,R3 ;PROCESSOR COMM AREA IN R3
DEC DTIEDN ;DECREMENT COUNT OF UNPROCESSED INTERRUPTS
MOVB DT11ST,R1 ;GET PRESENT TO-ELEVEN STATE
JSR PC,@11$(R1) ;CALL APPROPRIATE ROUTINE
RTS PC ;RETURN
;
11$: .WORD DTDED ;IDLE
.WORD DTIS02 ;WAITING FOR FEH FOR EH
.WORD DTDED ;WAITING FOR DOORBELL FOR EH
.WORD DTIS06 ;WAITING FOR EH
.WORD DTDED ;WAITING FOR DOORBELL FOR FEH FOR EH
.WORD DTIS12 ;WAITING FOR FEH FOR ED
.WORD DTDED ;WAITING FOR DOORBELL FOR ED
.WORD DTIS16 ;WAITING FOR ED
.WORD DTDED ;WAITING FOR ACK OF EH TO COMPLETE
.WORD DTDED ;WAITING FOR DOORBELL FOR ACK FOR EH
.WORD DTIS24 ;WAITING FOR ACK FOR EH
.WORD DTDED ;WAITING FOR DOORBELL FOR ACK FOR ED
.WORD DTIS30 ;WAITING FOR ACK FOR ED
.WORD DTDED ;GOT FINAL ACK
.WORD DTIS34 ;IGNORING 11-DONE
;
DTDED: STOPCD DTG20 ;PROTOCOL BROKEN
;
;
; HERE WHEN FIRST PART OF HEADER IS IN. A CHECK IS MADE FOR FE
; DEVICE AND IF DEVICE IS INDEED AN FE THEN WE EXPECT A SECOND
; PART OF HEADER TO FOLLOW; OTHERWISE JUST IGNORE THE HEADER.
;
DTIS02: SWAB DT11HD(R5) ;SWAP BYTES TO CORRECT DIRECTION
SWAB DT11FN(R5) ;THE PROTOCOL FUNCTION
SWAB DT11DV(R5) ;PROTOCOL DEVICE
SWAB DT11UC(R5) ;FE#,,COUNT OF BYTES TO FOLLOW
CMP #DLDPFE,DT11DV(R5) ;IS THIS HEADER FOR FE DEVICE?
BNE 11$ ;NO,IGNORE THE IRRELEVANT DEVICES
TST DT11FN(R5) ;IS IT INDIRECT DATA
BMI 12$ ;YES,MUST BE STRING DATA
11$: MOVB #34,DT11ST ;STATE TO IGNORE 11-DONES.
RTS PC ;RETURN
;
12$: CMPB #DTFSTR,DT11FN(R5) ;BETTER BE STRING DATA FUNCTION
BNE 11$ ;THROW AWAY OTHER FUNCTIONS
MOVB #4,DT11ST ;EXPECT SECOND PART OF HEADER
RTS PC ;RETURN
;
;
; HERE WHEN THE EH IS IN. ACKNOWLEDGE IT AND CONSIDER IT.
;
DTIS06: SWAB DT11DF(R5) ;THE DN60 FUNCTION CODE
SWAB DT11AD(R5) ;ADDRESS FOR EXAMINE / DEPOSIT
SWAB DT11DT(R5) ;DATA FOR DEPOSIT
TST DT11FN(R5) ;ALL DATA MUST BE INDIRECT
BPL 11$ ;ITS NOT,PUNISH HIM
CMPB #DTFSTR,DT11FN(R5) ;IS IT DN60 FUNCTION?
BNE 11$ ;CANT HANDLE OTHER THAN DN60 FUNCTIONS
CMP #DLDPFE,DT11DV(R5) ;LEGAL DEVICE?
BEQ 12$ ;YES, ALL O.K
;
11$: STOPCD DTH20 ;NO, PROTOCOL BROKEN,ILLEGAL DEVICE
; OR ILLEGAL FUNCTION
;
12$: CLR TCXFR(R5) ;CLEAR BYTE COUNT FOR TO-TEN STATUS BUFFER
CLR DT11GW(R5) ;CLEAR SHORT OF CHUNK FLAG
CLR DLMBCT(R5) ;INITIALIZE MESSAGE BYTE COUNT
CLR DLMCTL(R5) ;AND MESSAGE COUNT LEFT
MOVB DT11DF(R5),R1 ;GET DN60 FUNCTION-USED AS INDEX
MOV #15$,R0 ;POINT TO DISPATCH TABLE
JSR PC,DLDISP ;DISPATCH
BCS 14$ ;FATAL ERROR
MOVB #2,DT10ST ;ARRANGE TO UNDERSTAND WHEN ACK COMPLETES
TST DT10AK ;IS THERE AN ED TO COME?
BNE 13$ ;YES.
JSR PC,DTSACK ;NO,SEND ACK + FEH TO-TEN
MOVB #20,DT11ST ;AND, WAIT FOR ACK TO COMPLETE
RTS PC ;RETURN.
;
13$: JSR PC,DTSAK ;SEND ACK ALONE TO-TEN
MOVB #10,DT11ST ;WAIT FOR DOORBELL FOR THE FEH FOR THE ED
RTS PC ;RETURN
;
14$:
;14$: JSR PC,DTCERR ;FATAL ERROR
SEC ;FATAL ERROR
RTS PC ;RETURN
;
;
; TABLE FOR PDP-10 INITIATED OPERATIONS
;
15$: .WORD <<16$-15$>/2>-2 ;MAXIMUM INDEX
.WORD 0 ;FUNCTION ZERO INVALID
.WORD DLTRDT ;1=READ DATA INTO THE PDP-10
.WORD DLTWDT ;2=WRITE DATA FROM THE PDP-10
.WORD DLTRDS ;3=READ DEVICE STATUS
.WORD DLTWDC ;4=WRITE DEVICE COMMAND
.WORD DLTRLS ;5=READ LINE STATUS
.WORD DLTWLC ;6=WRITE LINE COMMAND
.WORD DLTRES ;7=READ DN60 STATUS
.WORD DLTWEC ;8=WRITE DN60 COMMAND
.WORD DLTEXM ;9=EXAMINE 11 LOCATION
.WORD DLTDEP ;10=DEPOSIT IN 11 LOCATION
;
16$: ;END OF TABLE
;
;
; HERE WHEN WE RECEIVE THE FEH FOR THE ED. NOW WE NEED THE ED.
;
DTIS12: SWAB DT11HD(R5) ;SWAP BYTES TO CORRECT DIRECTION
SWAB DT11FN(R5) ;PROTOCOL FUNCTION
SWAB DT11DV(R5) ;PROTOCOL DEVICE CODE
SWAB DT11UC(R5) ;UNIT AND BYTE COUNT
MOVB #14,DT11ST ;WAIT FOR ANOTHER DOORBELL
RTS PC ;RETURN.
;
; HERE WHEN THE ED HAS ARRIVED. PROCESS IT.
;
DTIS16:
.IF NE,DEBUG
CMPB #2,DT11DF(R5) ;DOING A WRITE OF DATA?
BNE 11$ ;NO.
TST @DT11AS(R5) ;TEST FOR ZERO WORD
BNE 11$ ;NON ZERO, IT IS OK.
.IF NE,PADBUG
BR 11$ ;DON'T STOP, HE TRANSMITS ZERO'S
.ENDC ;IF NE, PADBUG
STOPCD DBG ;THIS IS PROBABLY AN ERROR
11$:
.ENDC ;.IF NE,DEBUG
TST DT11GW(R5) ;OPERATION DELAYED OR REJECTED??
BNE 19$ ;YES
CMPB #2,DT11DF(R5) ;IS IT A WRITE?
BEQ 16$ ;YES
CMPB #4,DT11DF(R5) ;WAS IT DATA FOR DEVICE STATUS?
BNE 12$ ;NO
JSR PC,DLTWD1 ;YES,SETUP DEVICE STATUS
BCS 15$ ;FATAL ERROR
BR 19$ ;UPDATE STATE
;
12$: CMPB #6,DT11DF(R5) ;IS IT FOR WRITE LINE STATUS?
BNE 13$ ;NO
JSR PC,DLTWL1 ;YES,SETUP LINE STATUS
BCS 15$ ;FATAL ERROR
BR 19$ ;UPDATE STATE AND RETURN
;
13$: CMPB #10,DT11DF(R5) ;NO,IS IT WRITE DN60 STATUS
BNE 14$ ;NO,
JSR PC,DLTWS1 ;YES,SETUP DN60 STATUS
BCS 15$ ;FATAL ERROR
BR 19$ ;UPDATE STATE AND RETURN
;
14$: STOPCD DTB20 ;GOOFY ELEVEN DONE INTP
;
15$:
;15$: JSR PC,DTCERR ;COMMON ERROR RETURN
SEC ;COMMON ERROR RETURN
RTS PC ;RETURN
;
;
; HERE IT HAS TO BE A PLAIN SIMPLE WRITE TO - ELEVEN DATA
;
16$: MOV R0,R2 ;SAVE DTE ADDRESS
JSR PC,DLTEDN ;SETUP CHUNKS TO RECEIVE DATAIN
TST DT11GW(R5) ;SHORT OF CHUNKS??
BNE 21$ ;YES
TST R0 ;ANYTHING LEFT TO TRANSFER?
BEQ 18$ ;NOTHING LEFT TO XFER
17$: JSR PC,DTSTRT ;MORE TO RECEIVE, START IT
RTS PC
;
; HERE WHEN WE APPEAR TO HAVE RUN OUT OF DATA TO TRANSFER.
;
18$: TST DLMCTL(R5) ;ANY MORE TO XFER?
BGT 14$ ;BETTER NOT BE!!!
MOVB #1,DT10DF+1(R5) ;SUCCESS CODE TO TEN
19$: JSR PC,DTCMRT ;SET UP INFO TO RETURN TO THE 10
CMPB #4,DT10ST ;IS OTHER MACHINE WAITING FOR US?
BEQ 20$ ;YES, SEND ACK AND ADVANCE IT.
MOVB #20,DT11ST ;NO, WAIT FOR IT.
RTS PC ;RETURN.
;
; HERE IF THE OTHER STATE MACHINE IS WAITING FOR US.
;
20$: JSR PC,DTSACK ;SEND ACK FOR ED
MOVB #10,DT10ST ;ARRANGE TO UNDERSTAND THAT ACK
MOVB #22,DT11ST ;WAIT FOR DOORBELL FOR ACK FOR EH
RTS PC ;RETURN.
;
; HERE IF WE ARE SHORT OF CHUNKS.
;
21$: MOV #1,R0 ;TRANSFER ONE DUMMY WORD
MOV R5,R1 ;IN THE TCB
ADD #DT11GW,R1 ;AT THIS LOCATION
BR 17$ ;AND INTERRUPT BOTH PROCESSORS
;
;
; HERE WHEN WE SHOULD HAVE GOTTEN AN ACK FOR THE EH.
;
DTIS24: SWAB DT11HD(R5) ;SWAP BYTES TO CORRECT DIRECTION
SWAB DT11FN(R5) ;PROTOCOL FUNCTION
SWAB DT11DV(R5) ;PROTOCOL DEVICE CODE
SWAB DT11UC(R5) ;BE SURE THEY'RE ALL SWAPPED
CMPB #DTFSAK,DT11FN(R5) ;IS IT REALLY AN ACK?
BEQ 11$ ;YES.
STOPCD TER ;NO, SOMETHING HAS GONE WRONG.
;
11$: TST DTXADR(R5) ;WILL AN ED BE RETURNED?
BNE 13$ ;YES.
CMPB #14,DT10ST ;NO, IS OTHER MACHINE WAITING?
BNE 12$ ;NO.
JSR PC,DTCLRS ;YES, CLEAR OUT STATE
RTS PC ;ALL DONE.
;
; HERE WHEN OTHER SIDE IS NOT WAITING.
;
12$: MOVB #32,DT11ST ;WE MUST WAIT FOR IT
RTS PC ;RETURN.
;
; HERE WHEN AN ED WILL BE RETURNED
;
13$: CMPB #14,DT10ST ;IS THE OTHER MACHINE WAITING?
BEQ 14$ ;YES.
MOVB #26,DT11ST ;NO, WAIT FOR IT.
RTS PC ;RETURN.
;
; HERE WHEN THE OTHER SIDE IS WAITING FOR US TO START THE ED
;
14$: MOVB DT10DT+1(R5),DT10UC(R5) ;ED BYTE COUNT TO FOLLOW
MOV R5,R1 ;BUILD POINTER TO HEADER
ADD #DT10HD,R1 ; IN TCB AREA
MOV #12,R2 ;NO. OF BYTES TO XFER TO TEN
JSR PC,DTXMSD ;SEND AS DIRECT HEADER
MOVB #16,DT10ST ;ARRANGE TO UNDERSTAND WHEN TO-10 DONE COMES UP
MOVB #26,DT11ST ;WAIT FOR ACK OF ED
RTS PC ;RETURN.
;
;
; HERE WHEN WE EXPECT AN ACK FOR ED
;
DTIS30: SWAB DT11HD(R5) ;SWAP BYTES TO CORRECT DIRECTION
SWAB DT11FN(R5) ;PROTOCOL FUNCTION
SWAB DT11DV(R5) ;PROTOCOL DEVICE CODE
SWAB DT11UC(R5) ;BE SURE THEY'RE ALL SWAPPED
CMPB #DTFSAK,DT11FN(R5) ;IS IT REALLY AN ACK?
BEQ 11$ ;YES.
STOPCD TER ;NO, SOMETHING HAS GONE WRONG.
;
11$: CMPB #22,DT10ST ;IS THE OTHER SIDE WAITING?
BNE 12$ ;NO, WAIT FOR IT.
JSR PC,DTCLRS ;YES, CLEAR STATE.
RTS PC ;RETURN.
;
; HERE WHEN THE OTHER SIDE IS NOW WAITING. WAIT FOR IT.
;
12$: MOVB #32,DT11ST ;GOT FINAL ACK
RTS PC ;RETURN.
;
; HERE WHEN WE ARE IGNORING 11-DONE INTERRUPTS
;
DTIS34: INC DTPTCT ;COUNT TIMES 11-DONE IGNORED
RTS PC ;RETURN, LEAVING STATE AS IS.
;
.SBTTL DOORBELL INTERRUPT PROCESSING FOR DTE20
;
; THIS IS THE REST OF MACHINE "A".
;
DLDRBL: TRACE TRCTEN,DTQSTA ;ON THE ELEVEN DONE STATE
DEC DTIDBL ;DECREMENT DOORBELL INTP COUNT
MOV DTEBAD,R0 ;GET BASE ADR OF DTE REGS
MOV DTEPCA,R3 ;SETUP COMMUN ADR
CLR TE.XA1(R0) ;READ STATUS WORD
MOV #DLSTAT-DLPIN,R2 ;FIND THE ADDRESS OF HIS DLSTAT-TO ME
ADD DTEHSM(R3),R2
MOV R2,TE.XA2(R0) ;READ THAT STATUS WORD
JSR PC,DLWEDN ;WAIT FOR EXAMINE
BCS 13$ ;IGNORE INTERRUPT IF NOT STARTED
MOV TE.XW1(R0),TCSTFX(R5) ;SAVE STATUS
MOV TE.XW2(R0),TCSTFX+2(R5)
MOV TE.XW3(R0),TCSTFX+4(R5)
TST TCSTFX(R5) ;VALID EXAMINE?
BEQ 13$ ;IGNORE WHEN NOT IN PRIMARY PROTOCOL
11$: BIT #DLTHIP,TCSTFX+2(R5) ;INDIRECT IN PROGRESS
BNE 12$ ;YES, DONT CHECK COUNTS
CMPB TCSTFX+4(R5),DT10QC ;IS THIS THE CORRECT COUNT
BEQ 13$ ;YES -- CONTINUE PROCESSING
12$: MOVB DT11ST,R1 ;GET STATE OF THIS "MACHINE"
JSR PC,@14$(R1) ;CALL APPROPRIATE ROUTINE
13$: RTS PC ;RETURN.
;
; DISPATCH TABLE FOR DOORBELL INTERRUPTS, BASED ON STATE OF MACHINE "A"
;
14$: .WORD DTIS00 ;WAITING FOR INITIAL DOORBELL
.WORD 15$ ;WAITING FOR FEH FOR EH
.WORD DTIS04 ;WAITING FOR DOORBELL FOR EH
.WORD 15$ ;WAITING FOR EH
.WORD DTIS10 ;WAITING FOR DOORBELL FOR FEH FOR ED
.WORD 15$ ;WAITING FOR FEH FOR ED
.WORD DTIS14 ;WAITING FOR DOORBELL FOR ED
.WORD 15$ ;WAITING FOR ED
.WORD 15$ ;WAITING FOR ACK OF EH TO COMPLETE
.WORD DTIS22 ;WAITING FOR DOORBELL FOR ACK FOR EH
.WORD 15$ ;WAITING FOR ACK FOR EH
.WORD DTIS26 ;WAITING FOR DOORBELL FOR ACK FOR ED
.WORD 15$ ;WAITING FOR ACK FOR ED
.WORD 15$ ;GOT FINAL ACK
.WORD 16$ ;IGNORING 11-DONE
;
; HERE ON DOORBELL IN INVALID STATE
;
15$: STOPCD DTD20 ;ERROR
;
;
; HERE ON DOORBELL WHEN IGNORING 11-DONE
;
16$: JSR PC,DTCLRS ;CLEAR STATE
; JMP DTIS00 ;TREAT AS INITIAL DOORBELL
;
; HERE ON DOORBELL INITIALLY
;
DTIS00: MOV R5,R1 ;BUILD POINTER TO WHERE HEADER
ADD #DT11HD,R1 ; MUST BE SAVED
JSR PC,DTHDST ;START TRANSFER OF HEADER
MOVB #2,DT11ST ;UNDERSTAND THE RESULTING 11-DONE
RTS PC ;RETURN.
;
; HERE WHEN WE ARE WAITING FOR DOORBELL FOR FEH FOR EH
;
DTIS04: JSR PC,DTINDH ;GET SECOND PART OF HEADER
MOVB #6,DT11ST ;UNDERSTAND RESULTING 11-DONE
RTS PC ;RETURN.
;
; HERE WHEN WE ARE WAITING FOR DOORBELL FOR FEH FOR ED
;
DTIS10: MOV R5,R1 ;BUILD POINTER TO WHERE HEADER
ADD #DT11HD,R1 ; SHOULD GO
JSR PC,DTHDST ;GET FEH FOR ED IN
MOVB #12,DT11ST ;UNDERSTAND RESULTING 11-DONE INTERRUPT
RTS PC ;RETURN.
;
; HERE WHEN WE ARE WAITING FOR DOORBELL FOR ED.
;
DTIS14: JSR PC,DTINST ;SET UP TO READ REAL DATA (FINALLY!)
MOVB #16,DT11ST ;UNDERSTAND RESULTING 11-DONE
RTS PC ;RETURN.
;
; HERE WHEN WE ARE WAITING FOR DOORBELL FOR ACK FOR EH.
;
DTIS22: MOV R5,R1 ;BUILD POINTER TO WHERE HEADER
ADD #DT11HD,R1 ; SHOULD GO
JSR PC,DTHDST ;GET ACK IN
MOVB #24,DT11ST ;UNDERSTAND RESULTING 11-DONE
RTS PC ;RETURN.
;
; HERE WHEN WE ARE WAITING FOR DOORBELL FOR ACK FOR ED.
;
DTIS26: MOV R5,R1 ;BUILD POINTER TO WHERE HEADER
ADD #DT11HD,R1 ; SHOULD GO
JSR PC,DTHDST ;GET ACK IN
MOVB #30,DT11ST ;UPDATE THE STATE
RTS PC ;RETURN.
;
.SBTTL QUEUED PROTOCOL INTERFACE FOR DTE20
;
; CALLED TO START THE TRANSFER OF A DIRECT TO-11 MESSAGE.
;
; R1 = ADDRESS OF PLACE TO PUT THE HEADER
;
DTHDST: BIT #DLTHIP,TCSTFX+2(R5) ;IS THE MESSAGE DIRECT?
BEQ 11$ ;YES.
STOPCD TER ;NO, TEN MADE AN ERROR.
;
11$: BIS #DLTOIT,DTSTT+2 ;SET QUEUE IN PROGRESS
INCB DT10QC ;INDICATE Q UPDATED
CMPB TCSTFX+4(R5),DT10QC ;COUNT CORRECT?
BEQ 12$ ;YES -- PROCEED
STOPCD DTF20 ;COUNT INCORRECT ERROR
;
12$: MOV #TS.DEP,TE.XA1(R0) ;SET UP TO DEPOSIT
MOV DTSTT,TE.XW1(R0) ;THE STATUS
MOV DTSTT+2,TE.XW2(R0) ;IN MY AREA TO HIM
MOV DTSTT+4,TE.XW3(R0) ;TO TELL QUE IN PROGRESS
MOV #DLSTAT-DLPIN,R2 ;GET STATUS WORD OFFSET
ADD DTDMYN(R3),R2 ;IN COMM AREA
MOV R2,TE.XA2(R0) ;START THE DEPOSIT
JSR PC,DLWEDN ;WAIT FOR DEPOSIT
BCS 14$ ;ERROR
MOV #DLXFSZ-DLPIN,R2 ;FIND THE QUEUE SIZE
ADD DTEHSM(R3),R2 ;EXAMINE HIS FOR ME
CLR TE.XA1(R0) ;CLEAR DEPOSIT BIT
MOV R2,TE.XA2(R0) ;DO THE EXAMINE FOR SIZE
MOV R0,R2 ;SAVE BASE ADR OF DTE20
JSR PC,DLWEDN ;WAIT FOR EXAMINE/DEPOSIT
BCS 14$ ;EXAMINE FAILED
MOV TE.XW3(R0),DTEQSZ(R5) ;SET UP Q SIZE
;THIS AUTOMATICALLY SETS UP DTEQSZ
MOV DTEQSZ(R5),R0 ;NO OF BYTES TO XFER FOR HEADER
13$: MOV R0,DLMCTL(R5) ;NO OF BYTES LEFT TO XFER
JSR PC,DTSTRT ;START TRANSFER
RTS PC ;RETURN TO CALLER
;
; HERE IF EXAMINE OR DEPOSIT FAILS
;
14$: STOPCD TER ;SOMETHING FAILED
;
;
; HERE ON DOORBELL WHEN WE ARE EXPECTING THE EH. READ IT
; INTO THE SECOND PART OF THE HEADER AREA OF THE TCB.
;
DTINDH: BIS #DLTOIT,DTSTT+2 ;TELL -10 WE SHOULD BE MOVING DATA
ADD #DLXFSZ-DLSTAT,TE.XA2(R0) ;READ THE STATUS WORD
JSR PC,DLWEDN ;WAIT FOR EXAMINE
BCS 11$ ;CANNOT
MOV R0,R2 ;WE NEED R0
MOV TE.XW3(R2),R0 ;GET MESSAGE LENGTH
MOV R0,DTEQSZ(R5) ;SAVE LENGTH OF MESSAGE
MOV R0,DLMCTL(R5) ;SETUP MESSAGE COUNT LEFT TO XFER
CMP R0,#6 ;SECOND PART OF HEADER MUST NOT BE GREATER THAN
; SIX BYTES
BHI 12$ ;SOMETHING VERY WRONG WITH DDT60 OR D60SPD (OR D60SPL?)
MOV R5,R1 ;POINT TO WHERE SECONDARY HEADER MUST GO
ADD #DT11DF,R1 ; IN THE TCB AREA
JSR PC,DTSTRT ;START THE TRANSFER
JMP DTSTIP ;SET STATUS AND RETURN
;
; HERE IF WE CANNOT EXAMINE THE -10'S MEMORY
;
11$: STOPCD TER ;PERHAPS IT HAS FAILED
;
; HERE IF THE LENGTH IS MORE THAN 6 BYTES
;
12$: STOPCD TER ;ERROR IN DEC-20 USER PROGRAM
;
;
; HERE ON PDP-10 PROTOCOL ERROR.
; ABORT ALL STREAMS AND DISABLE ALL LINES.
;
DTCERR: ;ERROR RETURN FOR SET DEV AND LINE
.IF NE,DEBUG
BIT #TRCTER,TRCHLT ;STOP ON PDP-10 ERRORS?
BEQ 11$ ;NO.
STOPCD TER ;YES, PDP-10 ERROR
11$:
.ENDC ;.IF NE,DEBUG
CLR R3 ;START WITH LINE NUMBER 0
12$: MOV DQLCB(R3),R0 ;GET LCB POINTER
BEQ 13$ ;NONE.
BIS #LF.DIS,LB.FGS(R0) ;DTE DISABLED THE LINE
MOV LB.TC1(R0),R1 ;POINT TO BSC TASK
CMP #TTHASP,LB.DVT(R0) ;HASP LINE?
BEQ 21$ ;YES.
BIS #TCOAB!TCIAB,TCFG2(R1) ;SIGNAL ABORT
MOV LB.TCD(R0),R1 ;POINT TO XLATE TASK
BIS #TCOAB!TCIAB,TCFG2(R1) ;SIGNAL ABORT
13$: ADD #2,R3 ;NEXT LINE NUMBER * 2
CMP #<NLINES*2>,R3 ;DONE ALL THE LINES?
BNE 12$ ;NO, DO THE REST.
SEC ;SIGNAL FAILURE
RTS PC ;RETURN
;
;
; HERE TO ABORT ALL DEVICES ON HASP-LINE
;
21$: BIT #LF.ENC,LB.FGS(R0) ;LINE ENABLE COMPLETE?
BEQ 13$ ;NO, CHECK NEXT LINE
MOV LB.NTC(R0),R2 ;GET # OF TCBS FOR HASP LINE
BNE 22$ ;IF IT HAS'NT BEEN SET, MAKE IT 5
MOV #5,R2 ;THATS MAX # OF TCBS HASP LINE
22$: MOV R0,R1 ;GET LCB PTR
ASL R2 ;DEV NO * 2
ADD R2,R1 ;ADD DEVICE #
ASR R2 ;GET BACK DEV NO
MOV LB.TCD(R1),R1 ;POINT TO XLATE TCB OF DEVICE
BEQ 24$ ;NO TCB FOR THE DEVICE
BIS #TCOAB!TCIAB,TCFG2(R1) ;SIGNAL ABORT
24$: SOB R2,22$ ;DO FOR ALL DEVICES ON HASP LINE
BR 13$ ;GO TO NEXT LINE
;
;
; CALLED WHEN THE DOORBELL REQUESTING THE START OF THE INDIRECT
; DATA RINGS. DLEDBL IS NOTIFIED AND RETURNS WHERE THE DATA SHOULD BE
; SENT. NOTE THAT IT NEED NOT ALLOCATE SPACE FOR THE ENTIRE MESSAGE.
;
DTINST: BIS #DLTOIT,DTSTT+2 ;TELL -10 WE SHOULD BE XFERRING DATA
ADD #DLXFSZ-DLSTAT,TE.XA2(R0) ;READ THE STATUS WORD
JSR PC,DLWEDN ;WAIT FOR EXAMINE
BCS 13$
MOV R0,R2 ;WE NEED R0
MOV TE.XW3(R2),R0 ;GET MESSAGE LENGTH
MOV R0,DTEQSZ(R5) ;SAVE LENGTH OF MESSAGE
MOV R0,DLMBCT(R5) ;SAVE MESSAGE BYTE COUNT
MOV R0,DLMCTL(R5) ;SETUP MESSAGE COUNT LEFT TO XFER
TST DT11GW(R5) ;OPERATION DELAYED BY XLATE?
BNE 11$ ;YES,TRANSFER ONLY DUMMY WORD
JSR PC,DLEDBL ;TELL DN64 INTERFACE THE GOOD NEWS
BCS 14$ ;FATAL ERROR
TST DT11GW(R5) ;SHORT OF CHUNKS?
BEQ 12$ ;NO,LOOKS O.K
11$: MOV #1,R0 ;YES,THEN TRANSFER ONE DUMMY WORD
MOV R5,R1 ;GET TCB ADR
ADD #DT11GW,R1 ;AT THIS LOCATION
12$: JSR PC,DTSTRT ;START UP THE TRANSFER
BR DTSTIP ;STORE STATUS WORD IN COMM
;REGION AND DISMISS INTERRUPT
;
13$: RTS PC
;
14$: STOPCD TER ;ERROR FROM DLEDBL
;
;
; SERVICE ROUTINES FOR INTERRUPT CODE
;
DTIPDN: BIC #DLTOIT,DTSTT+2 ;CLEAR PROCESSING QUEUE STATUS
DTSTIP: MOV DTEBAD,R0 ;MAKE SURE THIS IS SETUP
MOV #DLSTAT-DLPIN,R2 ;YES -- BETTER INDICATE THAT 11 IS FINISHED
ADD DTDMYN(R3),R2 ;POINT TO STATUS WORD
MOV #TS.DEP,TE.XA1(R0) ;INDICATE WRITE
MOV DTSTT,TE.XW1(R0) ;SET UP TO DEPOSIT
MOV DTSTT+2,TE.XW2(R0)
MOV DTSTT+4,TE.XW3(R0)
MOV R2,TE.XA2(R0) ;START XFER
JSR PC,DLWEDN ;WAIT FOR DEPOSIT
11$: RTS PC ;RETURN TO TOELDN OR DBLRNG
;
;
; ROUTINE TO START A TO-11 BYTE MODE TRANSFER.
;
; CALL:
;
; R0/ # OF BYTES TO TRANSFER
; R1/ WHERE TO START DATA
;
DTSTRT: MOV R0,DT11QP(R5) ;SAVE AMOUNT TO BE XFERED
TST DT11GW(R5) ;NO CHUNK FLAG SET?
BNE 11$ ;YES,BYPASS MANIPULATING COUNT
SUB R0,DLMCTL(R5) ;COUNT LEFT FOR NEXT XFER
ADD R0,TCXFR(R5) ;TOTAL AMOUNT OF DATA WRITTEN FOR XLATE
11$: NEG R0 ;MAKE COUNT NEGITIVE
BIC #170000,R0 ;MASK OFF COUNT
RORB R0 ;!!!WARNING THIS ASSUMES C BIT IS SET BY NEG R0!!!!^^
BIT #DLTHBM,TCSTFX+2(R5) ;WORD MODE?
BNE 12$ ;YES -- DON'T SET BYTE FLAG
ROLB R0 ;!!^^SEE ABOVE -- RESTORE TO BYTE COUNT!!
BIS #TS.EBM,R0 ;SET BYTE MODE
TST DT11GW(R5) ;DUMMY WORD XFER??
BNE 13$ ;YES,INTERRUPT BOTH
12$: TST DLMCTL(R5) ;WILL THIS FINISH MESSAGE?
BGT 14$ ;NO, DON'T INTERRUPT -10
13$: BIS #TS.IFB,R0 ;SET INTERRUPT BOTH
14$: MOV R1,TE.EAD(R2) ;AND START XFER
MOV R0,TE.EBC(R2) ;SET BYTE COUNT
.IF NE,DEBUG
MOV R1,DT11AS(R5)
MOV R0,DT11BS(R5)
.ENDC
RTS PC
;
; ROUTINE CALLED WHEN QPR DOORBELL FINDS IT HAS DATA FOR -11
;
; CALL:
; R0/ # OF BYTES IN MESSAGE
; RETURN:
; IF C SET, ERROR. OTHERWISE...
;
; R0/ # OF BYTES TO XFER
; R1/ ADDRESS OF WHERE TO PUT DATA
;
DLEDBL: TST DT11FN(R5) ;MUST COME FROM INDIRECT DATA
BPL 15$ ;TROUBLE,DATA NOT INDIRECT
MOV R0,DLMBCT(R5) ;SAVE QPR MESSAGE COUNT
BEQ 14$ ;IF ZERO MSG COUNT,THEN NOTHING TO DO
CMPB #2,DT11DF(R5) ;IS IT A WRITE FUNCTION?
BNE 13$ ;NO,FOR STATUS WRITES SETUP AREA
CLR R0 ;INITIALLY NO CHUNKS TO QUE
;
; THE FOLLOWING CODE GETS A CHUNK AND SETS UP R3 TO DATA
;
11$: JSR PC,DLNWCK ;GET A CHUNK
BCS 16$ ;SHORT ON CHUNKS
MOV R0,DLCMSG(R5) ;SAVE ADR OF CURRENT MESSAGE
MOV DLMBCT(R5),R0 ;GET MESSAGE BYTE COUNT
CMP #CHDATL,R0 ;DOES IT FIT IN ONE CHUNK?
BHIS 12$ ;YES,SET UP RO AND R1
MOV #CHDATL,R0 ;NO,THEN XFER A CHUNK FULL
12$: MOV DLCMSG(R5),R1 ;CURRENT CHUNK POINTER
MOV R0,CHLEN(R1) ;SETUP THE LENGTH OF DATA IN CHUNK
MOV R3,R1 ;R1 POINTS TO WHERE DATA GOES
BR 14$ ;WIN RETURN.
;
13$: MOV #DTTTSB,R1 ;POINT TO AREA WHERE STATUS MUST GO
MOV R1,DT11Q(R5) ;JUST IN CASE WE NEED IT
CMP DLMBCT(R5),#DTSBLN ;MUST NOT OVERFLOW OUR BUFFER
BGT 15$ ;THROW HIM OUT FOR GIVING TOO MUCH
;
; HERE FOR SUCCESS RETURN.
;
14$: CLC ;CLEAR C BIT
RTS PC ;RETURN.
;
; HERE ON FAILURE RETURN.
;
15$: SEC ;SET C BIT
RTS PC ;RETURN.
;
;
; IF WE ARE SHORT ON CHUNKS WE LAND HERE!!!
;
16$: MOV TCXLT(R5),R1 ;POINT TO XLATE TASK
BIT #TCOAB,TCFG2(R1);HAS STEAM BEEN ABORTED?
BEQ DLSDLY ;NO,INDICATE "DELAYED"
;
DLSERR: MOVB #3,DT10DF+1(R5) ;OPERATION REJECTED
MOV #-1,DT11GW(R5) ;SET FLAG TO INDICATE ERROR OR DELAYED
CLC ;NOT A FATAL ERROR
RTS PC ;RETURN
;
DLSDLY: MOVB #2,DT10DF+1(R5) ;OPERATION DELAYED
MOV #-1,DT11GW(R5) ;FLAG OPERATION DELAYED
CLC ;NOT A FATAL ERROR
RTS PC ;RETURN
;
;
; ROUTINE CALLED FROM TO-11 DONE ROUTINE TO ADD NEW CHUNK
; OR PROCESS END OF FRAGMENT
;
; CALL - NO REGISTERS NEEDED
; ON RETURN:
; R0/ LENGTH OF NEXT FRAGMENT TO TRANSFER
; R1/ ADDRESS TO STORE DATA
; PS/ Z BIT SET IF EVERYTHING IN
;
DLTEDN: MOV DLMCTL(R5),R0 ;CHECK IF ANY THING LEFT TO XFER
BGT 11$ ;FOR +VE COUNT,SETUP CHUNK ADR
;
; IF THE COUNT IS -VE OR ZERO, THEN APPEND THE LAST CHUNK DONE
; TO THE MESSAGE FOR XLATE TASK
;
MOV TCXLT(R5),R1 ;POINT TO THE XLATE TASK
MOV DLCMSG(R5),R0 ;POINT TO CHUNK TO BE QUED
JSR PC,QUECHK ;SEND IT THE CHUNK
CLR DLCMSG(R5) ;INITIALIZE MESSAGE PTR
CLR R0 ;INDICATE NOTHING LEFT TO XFER
RTS PC ;RETURN
;
11$: MOV DLCMSG(R5),R0 ;POINT TO LAST FILLED CHUNK
JSR PC,DLNWCK ;GIVE CHUNK TO XLATE AND GET NEW
BCS DLSDLY ;SHORT ON CHUNKS
MOV R0,DLCMSG(R5) ;SAVE PTR TO CHUNK TO BE FILLED
MOV #CHDATL,R0 ;CAN WE XFER A CHUNK FULL
CMP DLMCTL(R5),R0 ;COUNT LEFT LESS THAN CHUNK FULL?
BGT 12$ ;NO, TRANSFER IT ALL.
MOV DLMCTL(R5),R0 ;YES, AMOUNT LEFT TO XFER FOR NEXT TIME
12$: MOV DLCMSG(R5),R1 ;GET CURRENT CHUNK PTR
MOV R0,CHLEN(R1) ;SETUP THE LENGTH OF DATA
MOV R3,R1 ;R1 POINTS TO WHERE THE DATA GOES
CLC ;CLEAR C
RTS PC ;RETURN
;
;
; DTXMSD -- SUBROUTINE TO START A DIRECT TO TEN TRANSFER
;
; R1 = ADDRESS OF PACKET TO BE SENT TO - TEN
; R2 = COUNT OF BYTES GOING TO THE TEN
;
; ALWAYS RETURNS WITH C CLEAR.
;
DTXMSD: MOV R1,-(SP) ;SAVE REGISTERS
MOV R0,-(SP) ;
MOV DTEBAD,R0 ;SET UP ADDRESS OF DTE20
CLR TE.XW1(R0)
CLR TE.XW2(R0)
.IIF NE,DEBUG,MOV R2,DTXTSZ(R5)
MOV R2,TE.XW3(R0) ;SET THE QUEUE SIZE IN MY AREA TO HIM
MOV R1,TE.XAD(R0) ;SET UP THE TO 10 ADDRESS
MOV #1,TE.DG3(R0) ;SET BYTE MODE
.IIF NE,DEBUG,MOV R1,DTXTAS(R5)
MOV DTEPCA,R1 ;FIND THE CORRECT DTE
MOV DTDMYN(R1),R1 ;FIND THE OFFSET INTO MY AREA
ADD #DLXFSZ-DLPIN,R1 ; FIND Q SIZE
MOV #TS.DEP,TE.XA1(R0) ;SET UP TO DO DEPOSIT
MOV R1,TE.XA2(R0)
JSR PC,DLWEDN
INCB DT11QC ;INCREMENT THE COUNT
MOV DTSTT,TE.XW1(R0)
MOV DTSTT+2,TE.XW2(R0)
MOV DTSTT+4,TE.XW3(R0)
ADD #DLSTAT-DLXFSZ,TE.XA2(R0)
JSR PC,DLWEDN ;EXAMINE/DEPOSIT
MOV #TS.EEX,TE.STW(R0) ;RING UP THE 10
MOV (SP)+,R0
MOV (SP)+,R1 ;RESTORE REGISTERS
CLC ;INDICATE SUCCESS (ALWAYS)
RTS PC ;RETURN
;
;
; THE FOLLOWING SUBROUTINE SETS UP HEADER FOR SENDING MESSAGES TO
; THE TEN
;
DTSHDR: MOV #12,DT10HD(R5) ;LENGTH OF HEADER IS 12
MOV DT11DV(R5),DT10DV(R5) ;SETUP THE DEVICE CODE
MOV DT11FN(R5),DT10FN(R5) ;FUNCTION CODE
MOVB DT11DF(R5),DT10DF(R5) ;DN60 FUNCTION CODE
MOV DT11AD(R5),DT10AD(R5) ;THE ADDRESS OR LINE #
MOVB DT11UC+1(R5),DT10UC+1(R5) ;SETUP FE#
MOVB #6,DT10UC(R5) ;SET UP NO OF BYTES FOR NEXT XFER
RTS PC
;
; THE FOLLOWING ENTRY POINTS ARE SENDING MESSAGES TO THE TEN
; THE FOLLOWING ROUTINES ARE FOR SENDING O.K, DELAYED OR
; ERROR RETURN TO THE TEN IN RESPONSE TO THE OPERATIONS
; INVOKED BY THE TEN
;
DTDSOK: MOVB #1,DT10DF+1(R5) ;SET SUCCESS CODE FOR 10
;
DTCMRT: JSR PC,DTSHDR ;SETUP THE HEADER
JSR PC,DTIPDN ;SET STATUS FOR INDIRECT DONE
MOV DLMBCT(R5),R1 ;MESSAGE COUNT
SUB DLMCTL(R5),R1 ;SUBTACT BYTE COUNT LEFT
MOV R1,DT10DT(R5) ;TO GET # OF BYTES XFERRED
RTS PC ;RETURN PEACEFULLY
;
;
; SUBROUTINE TO GET A BYTE OF DATA FROM THE PDP-10 THROUGH
; THE INDIRECT PORTION OF THE MESSAGE.
;
; R2 = POINTER TO CURRENT BYTE OF MESSAGE
; R4 = REMAINING COUNT IN THIS MESSAGE
;
; ON RETURN:
;
; C SET -- END OF DATA
; C CLEAR -- R1 = NEXT CHARACTER
;
DLGBYT: TST R4 ;ANY BYTES LEFT IN THIS POINTER?
BEQ 12$ ;NO, TRY NEXT PAIR
11$: DEC R4 ;YES, COUNT DOWN BYTE COUNTER
MOVB (R2)+,R1 ;PICK UP BYTE
INC TCXFR(R5) ;COUNT A BYTE TRANSFERED
CLC ;SUCCESS RETURN
RTS PC
;
; HERE IF THE COUNT IS DEPLETED.
;
12$:
SEC ;0 COUNT = EOF
RTS PC ;GIVE EOF RETURN.
;
;
; SUBROUTINE TO PUT A BYTE OF DATA INTO PDP-10 MEMORY
; BY APPENDING TO THE INDIRECT MESSAGE BEING BUILT.
;
; THIS SUBROUTINE MAY BE CALLED ONLY FROM DTE20 SUBROUTINES.
;
; R1 = BYTE TO STORE
; R2 = POINTER TO THE INDIRECT MESSAGE
; R4 = REMAINING COUNT IN THIS MESSAGE
;
; ON RETURN:
;
; C SET -- THERE IS NO ROOM FOR ANY MORE BYTES
; C CLEAR -- THERE IS ROOM FOR ANOTHER BYTE
;
DLPBYT: MOVB R1,(R2)+ ;STORE BYTE IN PDP-10 MEMORY
INC TCXFR(R5) ;COUNT A BYTE TRANSFERED
DEC R4 ;ANY ROOM LEFT IN THIS BYTE POINTER?
BEQ 12$ ;NO, CHECK FOR ANOTHER.
11$: CLC ;YES, INDICATE MORE ROOM
RTS PC ;RETURN.
;
; HERE WHEN THE COUNT RUNS OUT
;
12$: SEC ;NO MORE ROOM
RTS PC ;RETURN.
;
;
; SUBROUTINE TO PUT A WORD OF DATA INTO PDP-10 MEMORY,
; LOW BYTE FIRST.
;
; R1 = WORD TO STORE
; R2 = POINTER TO INDIRECT MESSAGE BEING BUILT
; R4 = REMAINING COUNT IN THIS MESSAGE
;
; ON RETURN:
;
; C SET -- THERE IS NO ROOM FOR ANY MORE BYTES
; (POSSIBLY HIGH BYTE WAS NOT STORED)
; C CLEAR -- THERE IS ROOM FOR ANOTHER BYTE
;
DLPWRD: JSR PC,DLPBYT ;STORE LOW BYTE IN PDP-10 MEMORY
BCS 11$ ;NO MORE ROOM
SWAB R1 ;GET HIGH BYTE
JSR PC,DLPBYT ;STORE HIGH BYTE
11$: RTS PC ;RETURN.
;
;
; SUBROUTINE TO COPY A STRING OF WORDS OUT THROUGH THE DTE20
;
; R0 = POINTER TO FIRST WORD
; R2 = POINTER TO INDIRECT MESSAGE BEING BUILT
; R3 = POINTER TO LAST WORD + 2
; R4 = REMAINING COUNT IN THE INDIRECT MESSAGE
;
; ON RETURN:
;
; C SET -- NO MORE ROOM FOR MORE BYTES
; (POSSIBLY NOT ALL OF THIS STRING WAS STORED)
; C CLEAR -- ROOM FOR MORE BYTES
;
DLPSTR: MOV (R0)+,R1 ;GET WORD TO STORE
JSR PC,DLPWRD ;STORE IT
BCS 11$ ;NO MORE ROOM
CMP R0,R3 ;DONE ALL WORDS YET?
BNE DLPSTR ;NO, DO ANOTHER.
CLC ;YES, ALL DONE.
11$: RTS PC ;RETURN.
;
.SBTTL DN60 FUNCTIONS INITIATED BY TEN
;
; DLTEXM SUBROUTINE TO DO THE EXAMINE FUNCTION
; DLTDEP SUBROUTINE TO DO THE DEPOSIT FUNCTION
;
DLTEXM:
DLTDEP: ;SAME ENTRY FOR DEPOSIT FUNCTION
JSR PC,DTSHDR ;SET UP HEADER FOR TO-10 MSG
MOV R5,R1 ;BUILD POINTER TO HEADER IN TCB
ADD #DT10HD,R1 ;POINT TO HEADER TO BE SENT TO TEN
.IIF NE,DEBUG,MOV R1,DTO10Q(R5) ;SAVE IT FOR REF
MOV NXMGO,-(SP) ;SAVE PREV NXMGO ADDRESS
MOV #14$,NXMGO ;SET CURRENT NXM PROCESSING ADR
CMPB DT11DF(R5),#12 ;IS IT A DEPOSIT FUNCTION?
BEQ 13$ ;YES,GO DO DEPOSIT
MOV @DT11AD(R5),DT10DT(R5) ;EXAMINE LOCATION PUT DATA IN 10 SIDE
11$: MOV (SP)+,NXMGO ;RESTORE XMGO
MOVB #1,DT10DF+1(R5) ;SET RESULT CODE =1;SUCCESS
12$:
CLR DTXADR(R5) ;NO DATA FOR IND XFER
RTS PC ;RETURN
;
13$: MOV DT11DT(R5),@DT11AD(R5) ;DEPOSIT THE DATA
BR 11$ ;SEND RESULT TO TEN
;
14$: MOV (SP)+,NXMGO ;RESTORE NXMGO
MOVB #3,DT10DF+1(R5) ;BAD ADR ;REJECT CODE
BR 12$
;
;
; DLTRES-SUBROUTINE TO PERFORM THE " READ DN60 STATUS "
;
DLTRES: JSR PC,DTSHDR ;SET UP THE HEADER FOR SENDING TO-TEN
MOV DT11DT(R5),DT10DT(R5) ;SET COUNT TO BE SENT TO TEN
BEQ 11$ ;ZERO COUNT UNREASONABLE
MOV DT11DT(R5),R4 ;COUNT OF BYTES IN STATUS
MOV #DTTTSB,R2 ;POINT TO STATUS BLOCK
MOV R2,DTXADR(R5) ;ADR OF INDIRECT DATA SET
MOV #D60ST1,R0 ;POIN TO THE FIRST WORD OF STATUS
MOV #D60ST2+2,R3 ;POINT TO LAST WORD+2
JSR PC,DLPSTR ;MOVE A WORDS IN BUFFER
MOV TCXFR(R5),DT10DT(R5) ;NO OF BYTES TO XFER
BIS #B15,DT10FN(R5) ;INDICATE INDIRECT DATA
MOVB #1,DT10DF+1(R5) ;SUCCESS CODE TO TEN
CLC ;SUCCESS ALWAYS
RTS PC ;RETURN
;
; HERE IF WE GET A ZERO COUNT ON 'READ DN60 STATUS'.
; THIS IS UNREASONABLE.
;
11$:
STOPCD TER ;ZERO LENGTH INVALID
;
;
; SUBROUTINE TO PERFORM THE "READ DATA" FUNCTION.
; MESSAGE QUE IS EXAMINED FOR A MESSAGE FROM THAT LINE
; AND IF ONE IS FOUND IT BECOMES CURRENT MESSAGE. THE
; USER MAY ASK FOR A MAXIMUM OF ONE CHUNK ONLY,HOWEVER
; IF ASKED FOR MORE THAN CHUNK HAS CURRENTLY, HE GETS
; WHATS LEFT IN THE CURRENT CHUNK.
;
DLTRDT: JSR PC,DTSHDR ;SETUP HEADER FOR TEN XFER
MOV DT11DT(R5),DT10DT(R5) ;LENGTH OF INDIRECT DATA
BEQ 23$ ;ZERO LENGTH UNREASONABLE
MOVB DT11AD+1(R5),R0 ;GET LINE NUMBER
CMP R0,NDQ11S ;IS IT REASONABLE?
BHIS 23$ ;NO.
ASL R0 ;LINE NUMBER * 2
MOV DQLCB(R0),R4 ;POINT TO LCB
BEQ 23$ ;IT HAS NOT BEEN CREATED
BIT #LS.ENB,(R4) ;IS IT ENABLED?
BEQ 23$ ;NO, LOSE.
MOV R4,TCLCB(R5) ;AND REMEMBER LCB POINTER
MOVB DT11AD(R5),R1 ;GET DEVICE #
BIC #177770,R1 ;EXTRACT DEVICE # FROM RCB
;3(014).IF NE,DEBUG
;3(014) BNE 10$ ;TO TRACK -10 SCREW UPS
;3(014) CMP #TTHASP,LB.DVT(R4) ;CHECK DEV FOR HASP
;3(014) BNE 10$ ;
;3(014) STOPCD TER ;TEN ERROR
;3(014) 10$:
;3(014).ENDC ;.IF NE,DEBUG
JSR PC, DLMCHK ;;++BS- CHECK FOR LEGAL DEVICE NUMBER 3(014)
BCS 23$ ;;++BS- BAD DEVICE NUMBER, REJECT 3(014)
ASL R1 ;DEVICE * 2
MOV R1,R2 ;KEEP DEVICE # FOR LATER
ADD R4,R1 ;ADD DEVICE #
MOV LB.TCD(R1),TCXLT(R5) ; GET XLATE TASK POINTER
11$: JSR PC,DLGTCM ;GET CURRENT OR NEW MESSAGE
BCS 22$ ;NO MESSAGE FOR THIS DEVICE
12$: MOV MSGLCH(R0),R1 ;GET POINTER TO THE CHUNK
13$: MOV R1,R3 ;BUILD PONTER TO DATA
BEQ 21$ ;END OF MESSAGE FOUND
MOV (R3)+,DLPMST(R5) ;SAVE POINTER TO NEXT CHUNK
MOV (R3)+,R2 ;GET COUNT, POINT TO DATA
;
;
; THE FOLLOWING IS THE REGISTER ALLOCATION:
;
; R0 = POINTS TO THE CURRENT MESSAGE BEING PROCESSED
; R1 = POINTS TO CURRENT CHUNK
; R2 = AMOUNT OF BYTES IN THIS CHUNK
; R3 = POINTS TO DATA IN CURRENT CHUNK
; R5 = POINTER TO DTE20 DRIVER TCB
; MSGLCH(R0) = CURRENT CHUNK TO BE SENT
; MSGPTR(R0) = CURRENT BYTE TO BE SENT
;
14$: TST R2 ;ANY BYTES LEFT IN THIS CHUNK?
BEQ 20$ ;NO, LOOK FOR ANOTHER.
ADD R3,R2 ;POINT TO END OF THE CHUNK
CMP MSGPTR(R0),R2 ;DOES CHAR PTR LIE IN THIS RANGE
BLOS 15$ ;YES,IT DOES
STOPCD TER ;ERROR,CHAR PTR OUT OF RANGE
;
15$: MOV MSGPTR(R0),DTXADR(R5) ;SET UP INDIRECT DATA ADR
SUB MSGPTR(R0),R2 ;THIS IS MAX DATA WE HAVE IN CHUNK
CMP DT11DT(R5),R2 ;IS IT LESS THAN ASKED FOR?
BLT 19$ ;YES
MOV R2,DT10DT(R5) ;NO,GIVE HIM WHAT WE HAVE
MOV DLPMST(R5),R1 ;GET ADR OF NEXT CHUNK IN MESSAGE
MOV R1,MSGLCH(R0) ;SAVE IN MESSAGE HEADER
ADD #CHDAT,R1 ;BUILD DATA POINTER
MOV R1,MSGPTR(R0) ;SAVE NEW DATA POINTER
16$: BIS #B15,DT10FN(R5) ;SET INDIRECT FLAG
17$: MOVB #1,DT10DF+1(R5) ;SUCCESS CODE
18$: CLC ;NO FATAL ERRORS
RTS PC ;RETURN
;
19$: MOV DT11DT(R5),DT10DT(R5) ;SET AMOUNT TO BE XFERRED
ADD DT11DT(R5),MSGPTR(R0) ;UPDATE CHAR PTR
BR 16$ ;SEND TO TEN
;
;
; HERE WHEN THE CHUNK RUNS OUT. GO ON TO THE NEXT CHUNK.
;
20$: MOV DLPMST(R5),R1 ;POINT TO NEXT CHUNK
BNE 13$ ;PROCESS IT, IF ANY.
;
; HERE ON END OF MESSAGE
;
21$: ;R0 DOES POINT TO MESSAGE
MOV TCIDLE,R1 ;POINT TO IDLE TASK
JSR PC,QUEMSG ;SEND IT THE MSG TO FREE
CLR DT10DT(R5) ;ZERO BYTES SENT TO TEN
CMP #TTHASP,LB.DVT(R4) ;HASP LINE?
BNE 33$ ;NO.
CLR @TCPDM(R5) ;CLEAR DEVICE MESSAGE PTR
BR 11$ ;JOIN THE MAIN LOOP
33$:
MOV LB.LNU(R4),R1 ;GET LINE NUMBER
ASL R1 ;LINE NUMBER * 2
ADD R5,R1 ;POINT INTO TCB
CLR TCCMSG(R1) ;WE HAVE NO CURRENT MESSAGE
BR 11$ ;FIND NEXT MESSAGE AND SENT TO TEN
;
;
; HERE IF THERE IS NO MESSAGE FOR THAT LINE
;
22$: CLR DT10DT(R5) ;NO INDIRECT DATA TO SEND
MOV TCXLT(R5),R1 ;POINT TO XLATE TASK
BIT #TCIAB!TCIEC,TCFG2(R1) ;EOF OR ABORT?
BEQ 24$ ;NO. "DELAYED" RETURN.
23$: MOVB #3,DT10DF+1(R5) ;YES, GIVE "REJECT" RETURN
BIT #TCIAB, TCFG2(R1) ;;++BS- ABORT ? 3(005)
BNE 36$ ;;++BS- YES, CLEAR THE ACTIVE BIT 3(005)
BIT #TCIPR, TCFG2(R1) ;;++BS- INPUT PERMISSION REQUESTED ? 3(005)
BNE 18$ ;;++BS- YES, DO NOT CLEAR THE ACTIVE BIT 3(005)
;;++BS- NO, CLEAR THE ACTIVE BIT 3(005)
36$: ;;++BS-NEW LABEL 3(005)
JSR PC, DLRCAB ;CLEAR THE DEVICE ACTIVE BIT
BR 18$ ;SEND REJECT TO TEN
;
24$: MOVB #2,DT10DF+1(R5) ;INDICATE "DELAYED"
JSR PC, DLRCAB ;CLEAR DEVICE ACTIVE BIT
25$: BR 18$ ;SEND IT TO TEN
;;++BS-CODE TO CLEAR THE DEVICE ACTIVE BIT
DLRCAB: JSR PC, HSSAVR ;SAVE THE REGISTERS
MOVB DT11AD+1(R5), R0 ;GET LINE NUMBER
BIC #177770, R0 ;CLEAR JUNK
MOVB DT11AD(R5),R1 ;GET DEVICE NUMBER
BIC #177400, R1 ;CLEAR JUNK
TST R1 ;CHECK FOR ZERO DEVICE NUMBER
BNE 35$ ;NON ZERO, CONTINUE
MOV TCLCB(R5), R2 ;POINT TO LCB
BIT #LF.SIM, LB.FGS(R2) ;SIMULATION ?
BNE 34$ ;YES
MOV #3, R1 ;NO, SUPPORT, MUST BE CDR
BR 35$ ;CLEAR DEVICE ACTIVE BIT
34$: MOV #4, R1 ;SIMULATION, MUST BE LPT
35$: JSR PC, HSAMPC ;CLEAR DEVICE ACTIVE BIT
JSR PC, HSRESR ;RESTORE THE REGISTERS
RTS PC ;RETURN
;;++BS-END OF CODE TO CLEAR THE DEVICE ACTIVE BIT
;
; THIS SUBROUTINE LOOKS FOR A CURRENT MESSAGE AND IF
; NONE IS FOUND, GETS OLDEST MESSAGE WITH THE ID.
;
DLGTCM: MOV TCLCB(R5),R4 ;POINT TO LCB
MOV LB.LNU(R4),R1 ;GET LINE NUMBER
ASL R1 ;LINE NUMBER * 2
ADD R5,R1 ;POINT INTO TCB
CMP #TTHASP,LB.DVT(R4) ;HASP LINE?
BEQ 11$ ;YES
MOV TCCMSG(R1),R0 ;IS THERE A CURRENT MESSAGE?
BNE 16$ ;YES, CONTINUE WITH IT.
BR 13$ ;GO GET MESSAGE FOR THE LINE
11$: MOV TCCMSG(R1),R1 ;GET PTR TO DEV MSG
BNE 12$ ;THERE'S ONE
STOPCD HSB ;NONE EXISTS
;
12$: ADD R2,R1 ;GET DEVICE MSG PTR
MOV R1,TCPDM(R5) ;SAVE PTR TO DEV MSG
MOV (R1),R0 ;ANY DEVICE MESSAGE?
BNE 17$ ;YES.
MOV TCXLT(R5),R0 ;POINT TO DEVICE'S TCB
MOV TCCTP(R0),R1 ;GET THE RCB
MOV LB.LNU(R4),R0 ;GET LINE #
SWAB R0 ;PUT IN LEFT BYTE
ADD R0,R1 ;MAKE I.D. FOR THE MESSAGE
JSR PC,DEQMID ;GET OLDEST MSG WITH THAT ID
BCS 16$ ;THERE IS NONE.
;;++BS-CODE TO UNSUSPEND A DEVICE IF LESS THAN 2 MESSAGES QUEUED
MOV R3, -(SP) ;;++BS-SAVE R3
MOV TCXLT(R5), R3 ;;++BS-POINT TO XLATE TASK
DEC TCIMC(R3) ;;++BS-DECREMENT COUNT OF INPUT MESSAGES
CMP TCIMC(R3), #2 ;;++BS-LESS THAN 2 ?
BGE 31$ ;;++BS-NO, CONTINUE
MOV R1, -(SP) ;;++BS-YES, SAVE R1
MOV TCCTP(R3), R1 ;;++BS-GET DEVICE TYPE
BIC #177770, R1 ;;++BS-GET DEVICE NUMBER
JSR PC, HSUNSP ;;++BS-UNSUSPEND THE DEVICE
;;++BS-TCLCB(R5) POINTS TO XLATE LCB
MOV (SP)+, R1 ;;++BS-RESTORE R1
31$: MOV (SP)+, R3 ;;++BS-RESTORE R3
;;++BS-END OF CODE TO UNSUSPEND A DEVICE IF LESS THAN 2 MESSAGES QUEUED
MOV R0,@TCPDM(R5) ;SAVE DEVICE MSG PTR
17$: CLC ;SUCCESSFUL
RTS PC ;RETURN
;
13$: MOV LB.LNU(R4),R1 ;GET LINE # (I.D. FOR 2780/3780)
JSR PC,DEQMID ;GET MESSAGE FOR THE I.D.
BCS 16$ ;NO MESSAGE FOR THIS I.D.
MOV LB.LNU(R4),R1 ;GET LINE NUMBER
ASL R1 ;LINE NUMBER * 2
ADD R5,R1 ;POINT INTO TCB
MOV R0,TCCMSG(R1) ;REMEMBER CURRENT MESSAGE
CLC ;SUCCESS
16$: RTS PC ;EXIT
;
;
;
; SUBROUTINE TO PERFORM THE "WRITE DATA" FUNCTION. DATA IS
; FETCHED THROUGH THE DTE20 AND PLACED IN CHUNKS. THE CHUNKS
; ARE SENT TO THE XLATE TASK FOR TRANSLATION AND SUBSEQUENT
; QUEUEING TO THE DQ11.
;
; ON RETURN:
;
; C IS SET IF THE DTE20 FAILS OR THERE IS SOME INCONSISTENCY
; IN THE PDP-10 INFORMATION. OTHERWISE, R0 = RESULT CODE.
;
DLTWDT: TST DT11FN(R5) ;BETTER BE INDIRECT FUNCTION
BMI 11$ ;YES,CHECK FOR LINE ETC.
STOPCD DTI20 ;DATA NOT INDIRECT
;
11$: MOVB DT11AD+1(R5),R0 ;GET LINE NO
CMP R0,NDQ11S ;IS IT REASONABLE?
BHIS 14$ ;NO, PARM ERROR.
ASL R0 ;LINE NUMBER * 2
MOV DQLCB(R0),R4 ;POINT TO LCB
BEQ 14$ ;NOT INITIALIZED
BIT #LS.ENB,(R4) ;IS THE LINE ENABLED?
BEQ 14$ ;NO.
MOVB DT11AD(R5),R1 ;GET RCB OR DEVICE #
BIC #177770,R1 ;EXTRACT DEVICE # FROM RCB
;3(014).IF NE,DEBUG
;3(014) BNE 10$ ;
;3(014) CMP #TTHASP,LB.DVT(R4) ;CHECK FOR HASP
;3(014) BNE 10$ ;ONLY
;3(014) STOPCD TER ;TEN ERROR
;3(014) 10$:
;3(014).ENDC
JSR PC, DLMCHK ;;++BS- CHECK FOR LEGAL DEVICE NUMBER 3(014)
BCS 14$ ;;++BS- BAD DEVICE NUMBER, REJECT 3(014)
ASL R1 ;DEVICE * 2
ADD R4,R1 ;ADD DEVICE #
MOV LB.TCD(R1),R0 ;POINT TO XLATE TASK
MOV R0,TCXLT(R5) ;REMEMBER TCB OF XLATE TASK
MOV #-1,DT10AK ;NOTE THAT WE EXPECT ED DATA
TST TCCHK1(R0) ;INPUT WAITING FOR XLATE TASK??
BNE 12$ ;YES, WAKE UP PDP-10 WAIT A WHILE
;;;++BS-CODE TO SET DEVICE ACTIVE BIT FOR OUTPUT
; JSR PC, HSSAVR ;SAVR THE REGISTERS
; MOVB DT11AD+1(R5), R0 ;GET LINE NUMBER
; BIC #177770, R0 ;CLEAR JUNK
; MOVB DT11AD(R5), R1 ;GET DEVICE NUMBER-RCB
; BIC #177400, R1 ;CLEAR JUNK
; TST R1 ;CHECK FOR ZERO DEVICE NUMBER
; BNE 35$ ;NON ZERO, CONTINUE
; MOV TCLCB(R5), R2 ;POINT TO LCB
; BIT #LF.SIM, LB.FGS(R2) ;SIMULATION ?
; BNE 34$ ;YES
; MOV #4, R1 ;NO, SUPPORT, MUST BE LPT
; BR 35$ ;SET DEVICE ACTIVE BIT
;34$: MOV #3, R1 ;SIMULATION, MUST BE CDR
;35$: JSR PC, HSACMP ;SET THE DEVICE ACTIVE BIT
; JSR PC, HSRESR ;RESTORE THE REGISTERS
;;;++BS-END OF CODE TO SET THE DEVICE ACTIVE BIT
CLC ;INDICATE SUCCESSFUL RETURN
RTS PC ;RETURN
;
;
;;++BS-CODE TO CLEAR DEVICE ACTIVE BIT
12$:
JSR PC, HSSAVR ;SAVE THE REGISTERS
MOVB DT11AD+1(R5), R0 ;GET LINE NUMBER
BIC #177770, R0 ;CLEAR JUNK
MOVB DT11AD(R5), R1 ;GET DEVICE NUMBER-RCB
BIC #177400, R1 ;CLEAR JUNK
TST R1 ;CHECK FOR ZERO DEVICE NUMBER
BNE 37$ ;NON ZERO, CONTINUE
MOV TCLCB(R5), R2 ;POINT TO LCB
BIT #LF.SIM, LB.FGS(R2) ;SIMULATION ?
BNE 36$ ;YES
MOV #4, R1 ;NO, SUPPORT, MUST BE LPT
BR 37$ ;CLEAR DEVICE ACTIVE BIT
36$: MOV #3, R1 ;SIMULATION, MUST BE CDR
37$: JSR PC, HSAMPC ;CLEAR THE DEVICE ACTIVE BIT
JSR PC, HSRESR ;RESTORE THE REGISTERS
;;++BS-END OF CODE TO CLEAR THE DEVICE ACTIVE BIT
MOV TCXLT(R5),R1 ;POINT TO XLATE TASK
BIT #TCOAB,TCFG2(R1) ;HAS STREAM BEEN ABORTED?
BEQ 13$ ;NO,INDICATE DELAYED OPERATION
JMP DLSERR ;OPERATION REJECTED
;
13$: JMP DLSDLY ;OPERATION DELAYED
;
14$:
MOV #-1,DT10AK ;;++BS-NOTE THAT WE EXPECT ED DATA 3(012)
JMP DLSERR ;;++BS-REJECT THE REQUEST 3(012)
;3(012) SEC ;FATAL ERROR
;3(012) RTS PC ;RETURN
;
;
; SUBROUTINE TO PERFORM THE "READ DEVICE STATUS" FUNCTION.
; THE STATUS MESSAGE IS ASSEMBLED IN A BUFFER AND SENT TO-TEN
; AS INDIRECT DATA. NO EXCEPTIONAL CONDITIONS ARE POSSIBLE.
;
DLTRDS: JSR PC,DTSHDR ;SETUP HEADER FOR TEN XFER
TST DT11DT(R5) ;ASKING FOR ZERO?
BEQ 13$ ;YES, THROW HIM OFF.
MOVB DT11AD+1(R5),R0 ;GET LINE NO
CMP R0,NDQ11S ;IS IT REASONABLE?
BHIS 13$ ;NO, ERROR.
ASL R0 ;LINE NUMBER * 2
MOV DQLCB(R0),R4 ;POINT TO SPECIFIED LCB
BEQ 13$ ;NOT INITIALIZED.
BIT #LS.ENB,(R4) ;IS THE LINE ENABLED?
BEQ 13$ ;NO.
MOVB DT11AD(R5),R1 ;GET RCB OR DEVICE #
BIC #177770,R1 ;EXTRACT DEVICE # FROM RCB
;3(014).IF NE,DEBUG
;3(014) BNE 10$ ;TRACK 10 ERRORS
;3(014) CMP #TTHASP,LB.DVT(R4) ;CHECK HASP DEV #
;3(014) BNE 10$ ;ONLY
;3(014) STOPCD TER ;
;3(014) 10$:
;3(014).ENDC
JSR PC, DLMCHK ;;++BS-CHECK FOR LEGAL DEVICE NUMBER 3(014)
BCS 13$ ;;++BS-BAD DEVICE NUMBER, REJECT 3(014)
;
;
;
ASL R1 ;DEV NO * 2
ADD R4,R1 ;ADD DEVICE # TO
MOV LB.TCD(R1),TCXLT(R5) ; POINT TO XLATE TASK
MOV R4,TCLCB(R5) ;SAVE LCB IN CASE WE NEED IT LATER
MOV #DTTTSB,R2 ;POINT TO THE STATUS BLOCK
MOV R2,DTXADR(R5) ;SAVE IT FOR TO-TEN XFER
MOV DT11DT(R5),R4 ;SET COUNT PROVIDED BY TEN
MOV TCXLT(R5),R0 ;POINT TO XLATE TASK
MOVB TCDVT(R0),R1 ;GET DEVICE TYPE
JSR PC,DLPBYT ;SEND TO PDP-10
BCS 13$ ;MUST BE MORE ROOM
MOV TCCTP(R0),R1 ;GET COMPONENT TYPE
JSR PC,DLPBYT ;SEND TO PDP-10
BCS 13$ ;MUST BE MORE ROOM
MOV TCPGC(R0),R1 ;GET PAGE COUNT REGISTER
JSR PC,DLPWRD ;SEND TO PDP-10
; BCS 11$ ;NO MORE ROOM
BCS 13$ ;;++BS-NO MORE ROOM 3(004)
MOV TCFG1(R0),R1 ;GET FLAGS WORD 1
JSR PC,DLPWRD ;SEND TO PDP-10
BCS 13$ ;MUST BE MORE ROOM
MOV TCFG2(R0),R1 ;GET FLAGS WORD 2
JSR PC,DLPWRD ;SEND TO PDP-10
BCS 13$ ;MUST BE MORE ROOM
MOV TCRSZ(R0),R1 ;GET RECORD SIZE FOR THE DEVICE
JSR PC,DLPWRD ;SEND TO PDP-10
; BCS 11$ ;NO MORE ROOM
BCS 13$ ;;++BS-NO MORE ROOM 3(004)
MOV TCLCB(R5), R1 ;;++BS-POINT TO LCB 3(004)
MOV LB.FGS(R1), R1 ;;++BS-GET THE LINE FLAGS 3(004)
JSR PC, DLPWRD ;;++BS-SEND TO PDP-10 3(004)
BCS 13$ ;;++BS-ERROR, NO MORE ROOM 3(007)
MOV TCLCB(R5), R1 ;;++BS-POINT TO LCB 3(007)
MOV LB.SIG(R1), R1 ;;++BS-GET THE LINE SIGNATURE 3(007)
JSR PC, DLPWRD ;;++BS-SEND TO PDP-10 3(007)
BCS 11$ ;;++BS-SEND THE INDIRECT MESSAGE 3(004)
;
; CONTINUED ON NEXT PAGE
;
;
;
; HERE WHEN THE INDIRECT MESSAGE HAS BEEN BUILT.
;
11$: BIS #B15,DT10FN(R5) ;INDICATE INDIRECT DATA FOLLOWS
MOVB #1,DT10DF+1(R5) ;SEND SUCCESS CODE
MOV TCXFR(R5),DT10DT(R5) ;SETUP INDIRECT DATA LENGTH
CLC ;INDICATE SUCCESS
12$: RTS PC ;RETURN
;
; HERE IF THERE IS ANY ERROR
;
13$:
CLR DT10DT(R5) ;;++BS-ZERO DATA LENGTH 3(010)
BIS #B15, DT10FN(R5) ;;++BS-NO INDIRECT DATA 3(010)
;3(010) SEC ;FATAL ERROR
JSR PC, DLRJRQ ;;++BS-REJECT THE REQUEST 3(010)
RTS PC ;RETURN
;
;
; SUBROUTINE TO PERFORM THE "WRITE DEVICE COMMAND" FUNCTION.
; THE FIRST BYTE OF THE DATA IS THE FUNCTION CODE, IF OTHER
; DATA IS NEEDED IT FOLLOWS THE FUNCTION CODE.
;
; ON RETURN:
;
; C SET -- DTE20 FAILURE OR BADLY FORMED COMMAND
; C CLEAR -- R0 = 1 TO MEAN "SUCCESS", 2 TO MEAN "DELAYED"
;
DLTWDC: TST DT11FN(R5) ;BETTER BE INDIRECT DATA
BMI 11$ ;YES,IT IS
STOPCD DTI20 ;DATA NOT INDIRECT ERROR
;
11$: MOVB DT11AD+1(R5),R0 ;GET LINE NUMBER
CMP R0,NDQ11S ;IN RANGE?
BHIS 12$ ;NO, ERROR.
ASL R0 ;YES, LINE NUMBER*2
MOV DQLCB(R0),R0 ;PICK UP LCB POINTER
BEQ 12$ ;NONE IS ERROR
BIT #LS.ENB,(R0) ;IS THE LINE ENABLED?
BEQ 12$ ;NO.
MOV R0, R4 ;;++BS-POINT R4 TO LCB 3(014)
MOVB DT11AD(R5),R1 ;GET RCB OR DEVICE #
BIC #177770,R1 ;EXTRACT DEVICE # FROM RCB
;3(014).IF NE,DEBUG
;3(014) BNE 10$ ;TRACK 10 ERRORS
;3(014) CMP #TTHASP,LB.DVT(R0) ;HASP DEV
;3(014) BNE 10$ ;ONLY
;3(014) STOPCD TER
;3(014) 10$:
;3(014).ENDC
JSR PC, DLMCHK ;;++BS-CHECK FOR LEGAL DEVICE NUMBER 3(014)
BCS 12$ ;;++BS-BAD DEVICE NUMBER, REJECT 3(014)
ASL R1 ;DEVICE * 2
ADD R0,R1 ;ADD DEVICE #
MOV LB.TCD(R1),TCXLT(R5) ;POINT TO XLATE TASK
13$: ;;++BS-NEW LABEL 3(011)
MOV #-1,DT10AK ;NOTE THAT WE EXPECT ED DATA
CLC ;INDICATE SUCCESS
RTS PC ;RETURN
;
12$:
CLR TCXLT(R5) ;;++BS-NO XLATE TASK FOR ERROR 3(011)
BR 13$ ;;++BS-REJECT HIS REQUEST ON ED DATA 3(011)
;3(011) SEC ;FATAL ERROR
;3(011) RTS PC ;RETURN
;
;
;
DLTWD1: MOV DT11Q(R5),R2 ;POINT TO WHERE STATUS IS
MOV DT11DT(R5),R4 ;COUNT OF BYTES RECEIVED
JSR PC,DLGBYT ;GET COMMAND CODE BYTE INTO R1
BCS 11$ ;NONE, ERROR.
TST TCXLT(R5) ;;++BS-IS THERE A XLATE TASK ? 3(011)
BEQ 14$ ;;++BS-NO, REJECT THE REQUEST 3(011)
;;++BS-YES, CONTINUE 3(011)
MOV #12$,R0 ;POINT TO DISPATCH TABLE
MOVB #1,DT10DF+1(R5) ;SUCCESS CODE
JSR PC,DLDISP ;DISPATCH TO HANDLER
11$: RTS PC ;RETURN
;
;
;
14$: JSR PC, DLRJRQ ;;++BS-REJECT THE REQUEST 3(011)
BR 11$ ;;++BS-CONTINUE 3(011)
;
;
;
; DISPATCH TABLE
;
12$: .WORD <<13$-12$>/2>-2 ;MAX TABLE INDEX
.WORD 0 ;0 = INVALID
.WORD DLTD01 ;1 = SET CHARACTERISTICS
.WORD 0 ;2 = RESERVED
.WORD DLTD03 ;3 = DUMP OUTPUT [1(627)]
.WORD DLTD04 ;4 = CLEAR "INPUT PERMISSION WAS REQUESTED"
.WORD 0 ;5 = RESERVED
.WORD DLTD06 ;6 = INTERPRET CC ON INPUT
.WORD DLTD07 ;7 = DONT
.WORD DLTD08 ;8 = INTERPRET CC ON OUTPUT
.WORD DLTD09 ;9 = DONT
.WORD 0 ; RESERVED
.WORD 0 ; RESERVED
.WORD DLTD12 ;12 = DO COMPONENT SELECTION
.WORD DLTD13 ;13 = DONT
.WORD DLTD14 ;14 = ENABLE PAGE COUNTER
.WORD DLTD15 ;15 = DISABLE IT
.WORD 0 ;16 = RESERVED
.WORD DLTD17 ;17 = DO SPACE COMPRESSION
.WORD DLTD18 ;18 = DONT
.WORD DLTD19 ;19 = USE OLD BSC PROTOCOL
.WORD DLTD20 ;20 = DONT
.WORD DLTD21 ;21 = REQUEST OUTPUT PERMISSION
.WORD DLTD22 ;22 = GRANT INPUT PERMISSION
.WORD DLTD23 ;23 = SIGNAL OUTPUT EOF
.WORD DLTD24 ;24 = CLEAR OUTPUT EOF COMPLETE
.WORD DLTD25 ;25 = SIGNAL OUTPUT ABORT
.WORD DLTD26 ;26 = CLEAR OUTPUT ABORT COMPLETE
.WORD DLTD27 ;27 = CLEAR INPUT EOF COMPLETE
.WORD DLTD28 ;28 = SIGNAL INPUT ABORT
.WORD DLTD29 ;29 = CLEAR INPUT ABORT COMPLETE
.WORD DLTD30 ;30 = SUSPEND DEVICE (HASP)
.WORD DLTD31 ;31 = UNSUSPEND DEVICE (HASP)
.WORD DLTD32 ;32 = SET DEVICE RECORD SIZE
13$:
;
;
; SUBROUTINE TO PERFORM THE "READ LINE STATUS" FUNCTION.
; IF THE LINE IS NOT INITIALIZED, GIVE A 0-LENGTH REPLY
;
DLTRLS: JSR PC,DTSHDR ;SETUP HEADER FOR TO-TEN XFER
MOV DT11DT(R5),DT10DT(R5) ;SET LENGTH OF IDIRECT DATA
BEQ 14$ ;ZERO LENGTH UNREASONABLE
MOVB DT11AD+1(R5),R0 ;GET LINE NO
MOV R1,-(SP) ;;++BS-SAVE R1
MOVB NDQ11S, R1 ;;++BS-GET NUMBER OF DQ11S
DEC R1 ;;++BS-CONVERT TO LINE NUMBER
CMPB R1, R0 ;;++BS-EXCEED MAX NUMBER ?
BGE 31$ ;;++BS-NO, CONTINUE
MOV (SP)+, R1 ;;++BS-YES, RESTORE R1
BR 32$ ;;++BS-REJECT THE REQUEST
; CMP R0,NDQ11S ;IS IT REASONABLE?
; BHIS 14$ ;NO, ERROR.
31$: MOV (SP)+, R1 ;;++BS-RESTORE R1
ASL R0 ;LINE NUMBER * 2
MOV DQLCB(R0),R4 ;POINT TO SPECIFIED LCB
BEQ 11$ ;NOT INITIALIZED.
BIT #LS.ENB,(R4) ;IS THE LINE ENABLED?
BEQ 11$ ;NO.
MOV R4,TCLCB(R5) ;SAVE LCB IN CASE WE NEED IT LATER
MOV DT11DT(R5),R4 ;SET UP COUNT FOR DLPBYT
MOV #DTTTSB,R2 ;POINT TO THE STATUS BLOCK
MOV R2,DTXADR(R5) ;SAVE ADR OF INDIRECT DATA
MOV TCLCB(R5),R0 ;POINT TO LCB
MOVB LB.DVT(R0),R1 ;GET TERMINAL TYPE
JSR PC,DLPBYT ;STORE IN USER'S BUFFER
BCS 14$ ;ERROR IF NO MORE ROOM
;3(007) MOVB LB.FGS(R0),R1 ;GET LINE FLAGS
;3(007) JSR PC,DLPBYT ;STORE IN USER'S BUFFER
MOV LB.FGS(R0), R1 ;;++BS-GET LINE FLAGS 3(007)
JSR PC, DLPWRD ;;++BS-SEND TO PDP-10 3(007)
BCS 14$ ;ERROR IF NO MORE ROOM
MOV #B0,R1 ;INDICATE LINE IS ENABLED
BIT #LF.TSP,LB.FGS(R0) ;OUTPUT TRANSPARENT?
BEQ 21$ ;NO.
BIS #B3,R1 ;HOPE NOBODY ELSE USES BIT 3
21$: JSR PC,DQMDMS ;SET DTR AND DSR INTO R1
JSR PC,DLPBYT ;STORE STATUS BYTE IN USER'S BUFFER
;
; CONTINUED ON NEXT PAGE
;
;
; INCLUDE BSC STATISTICS IN LINE STATUS
;
BCS 14$ ;ERROR IF NO ROOM
;3(007) CLR R1 ;SEND RESERVE BYTE ALSO [[RELEASE 4]]
;3(007) JSR PC,DLPBYT ;IN USERS BUFFER
;3(007) BCS 14$ ;ERROR IF NO ROOM
MOV TCLCB(R5),R0 ;POINT R0 TO LCB
MOV #LB.ST2,R3 ;COMPUTE ADDRESS OF LAST WORD + 2 4(025)
;4(025) MOV #LB.ST2+2,R3 ;COMPUTE ADDRESS OF LAST WORD + 2
ADD R0,R3
ADD #LB.ST1,R0 ;COMPUTE ADDRESS OF FIRST WORD
JSR PC,DLPSTR ;SEND LOTS OF WORDS
11$: MOV TCXFR(R5),DT10DT(R5) ;SETUP INDIRECT DATA LENGTH
BEQ 12$ ;DONT SET INDIRECT FOR ZERO LENGTH
BIS #B15,DT10FN(R5) ;INDICATE INDIRECT DATA TO FOLLOW
12$: ;JUST SEND THE DIRECT HEADER
MOVB #1,DT10DF+1(R5) ;SEND SUCCESS CODE = 1
CLC ;INDICATE SUCCESS
13$: RTS PC ;RETURN
;
; HERE ON A PROTOCOL ERROR
;
14$: SEC ;FATAL ERROR
RTS PC ;RETURN
;
;
; HERE WITH INCORRECT LINE NUMBER
;
32$: MOV TCXFR(R5), DT10DT(R5) ;;++BS-SET UP INDIRECT DATA LENGTH
BEQ 33$ ;;++BS-DON'T SET INDIRECT FOR ZERO LENGTH
BIS #B15, DT10FN(R5);;++BS-INDICATE INDIRECT DATA TO FOLLOW
33$: ;;++BS-JUST SEND THE DIRECT HEADER
JSR PC, DLRJRQ ;;++BS-REJECT THE REQUEST
RTS PC ;;++BS-RETURN
;
;
; SUBROUTINE TO PERFORM THE "WRITE LINE COMMAND" FUNCTION.
; THE FIRST BYTE OF THE DATA IS THE FUNCTION CODE, IF OTHER
; DATA IS NEEDED IT FOLLOWS THE FUNCTION CODE.
;
; ON RETURN:
;
; C SET -- DTE20 FAILURE OR BADLY FORMED COMMAND
; C CLEAR -- R0 = 1 TO MEAN "SUCCESS", 2 TO MEAN "DELAYED"
;
DLTWLC: TST DT11FN(R5) ;BETTER BE INDIRECT DATA!!
BMI 11$ ;YES,IT IS
STOPCD DTI20 ;DATA NOT INDIRECT ERROR
;
11$:
MOVB DT11AD+1(R5),R0 ;GET LINE NUMBER
CMP R0,NDQ11S ;IN RANGE?
; BHIS 12$ ;NO, ERROR.
MOV #-1,DT10AK ;NOTE THAT WE EXPECT ED DATA
CLC ;INDICATE SUCCESS
RTS PC ;RETURN
;
12$: SEC ;FATAL ERROR
RTS PC ;RETURN
;
;
; COME HERE WHEN THE INDIRECT DATA HAS ARRIVED.
;
DLTWL1: MOV DT11Q(R5),R2 ;POINT TO WHERE STATUS IS KEPT
MOV DT11DT(R5),R4 ;SETUP THE COUNT
JSR PC,DLGBYT ;GET COMMAND CODE BYTE
BCS 11$ ;NONE, ERROR.
MOV #12$,R0 ;POINT TO DISPATCH TABLE
MOVB #1,DT10DF+1(R5) ;SET SUCCESS CODE
JSR PC,DLDISP ;DISPATCH TO HANDLER
11$: RTS PC ;RETURN
;
; DISPATCH TABLE
;
12$: .WORD <<13$-12$>/2>-2 ;MAX TABLE INDEX
.WORD 0 ;0 = INVALID
.WORD DLTL01 ;1 = ENABLE
.WORD DLTL02 ;2 = SET DTR
.WORD DLTL03 ;3 = ABORT AND HANG UP
.WORD DLTL04 ;4 = DISABLE
.WORD DLTL05 ;5 = SET CTS DELAY
.WORD DLTL06 ;6 = SET LENGTH OF SILO WARNING AREA
.WORD DLTL07 ;7 = SET OUTPUT IN TRANSPARENT MODE
.WORD DLTL08 ;8 = SET OUTPUT IN NON-TRANSPARENT MODE
.WORD DLTL09 ;9 = SET TRANSMISSION BLOCK LENGTH
.WORD DLTL10 ;10= SET RECORDS PER MESSAGE
.WORD DLTL11 ;11= SET LINE SIGNATURE (;;++BS-)
13$:
;
;
;
; SUBROUTINE TO PERFORM THE "WRITE DN60 COMMAND" FUNCTION.
; THE FIRST BYTE OF THE DATA IS THE FUNCTION CODE, IF OTHER
; DATA IS NEEDED IT FOLLOWS THE FUNCTION CODE.
;
; ON RETURN:
;
; C SET -- DTE20 FAILURE OR BADLY FORMED COMMAND
; C CLEAR -- R0 = 1 TO MEAN "SUCCESS", 2 TO MEAN "DELAYED"
;
DLTWEC:
TST DT11FN(R5) ;MUST BE INDIRECT
BMI 11$ ;YES,IT IS
STOPCD DTI20 ;DATA NOT INDIRECT
;
11$: MOV #-1,DT10AK ;NOTE THAT WE EXPECT ED DATA
CLC ;INDICATE SUCCESS
RTS PC ;RETURN
;
;
; COME HERE WHEN THE INDIRECT DATA ARRIVES.
;
DLTWS1: MOV DT11Q(R5),R2 ;POINT TO STATUS
MOV DT11DT(R5),R4 ;SETUP COUNT
JSR PC,DLGBYT ;GET COMMAND CODE BYTE
BCS 11$ ;NONE, ERROR.
MOV #12$,R0 ;POINT TO DISPATCH TABLE
MOVB #1,DT10DF+1(R5) ;SET SUCCESS CODE
JSR PC,DLDISP ;DISPATCH TO HANDLER
11$: RTS PC ;RETURN
;
; DISPATCH TABLE
;
12$: .WORD <<13$-12$>/2>-2 ;MAX TABLE INDEX
.WORD 0 ;0 = INVALID
; .WORD DLTE01 ;1 = ???
13$:
;
;
; SUBROUTINE FOR LINE COMMAND 1: ENABLE THE LINE
;
DLTL01: CLR NWLFLG ;;++BS- ASSUME THIS IS A NEW LINE
MOVB DT11AD+1(R5),R0 ;GET LINE NUMBER
MOV R1,-(SP) ;;++BS-SAVE R1
MOVB NDQ11S, R1 ;;++BS-GET NUMBER OF DQ11S
DEC R1 ;;++BS-CONVERT TO LINE NUMBER
CMPB R1, R0 ;;++BS-EXCEED MAX NUMBER ?
BGE 29$ ;;++BS-NO, CONTINUE
MOV (SP)+, R1 ;;++BS-YES, RESTORE R1
JMP 24$ ;;++BS-YES, REJECT REQUEST, NOT FATAL
29$: MOV (SP)+, R1 ;;++BS-RESTORE R1
ASL R0 ;LINE NUMBER * 2
TST DQLCB(R0) ;ALREADY A LINE CONTROL BLOCK?
BNE 11$ ;YES.
ASR R0 ;NO, PUT LINE NUMBER IN R0
JSR PC,DLENLN ;BUILD AN LCB
BCS 18$ ;OUT OF CORE
MOV #1, NWLFLG ;;++BS- INDICATE THIS IS A NEW LINE
11$: MOVB DT11AD+1(R5),R0 ;GET LINE NUMBER
ASL R0 ;LINE NUMBER * 2
MOV DQLCB(R0),R0 ;POINT R0 TO LCB
BIT #LS.ENB,(R0) ;IS THE LINE ENABLED?
BNE 17$ ;YES, CAN'T ENABLE IT AGAIN.
;3(013) BIT #LF.DIP!LF.ABC,LB.FGS(R0) ;DISABLE IN PROGRESS?
BIT #LF.DIP, LB.FGS(R0) ;;++BS-DISABLE IN PROGRESS ? 3(013)
BNE 18$ ;YES, GIVE DELAYED RETURN
;
;;++BS- THIS CODE DELETES THE BSC TASK AFTER THE LINE IS DISABLED
TST NWLFLG ;IS THIS A NEW LINE ?
BNE 25$ ;YES, THERE WAS NO BSC TASK
BIT #LF.DAC, LB.FGS(R0) ;NO, DID BSC DISABLE THE LINE ?
BEQ 18$ ;NO, GIVE DELAYED RETURN
JSR PC, HSSAVR ;YES, SAVE THE REGISTERS
MOV R0, R4 ;PUT POINTER TO LCB IN R4
MOV LB.TC1(R4), R0 ;GET POINTER TO BSC TASK
BEQ 26$ ;NO BSC, EXIT
MOV TCBP1, R3 ;R3 MUST POINT TO START OF CHAIN
JSR PC, DLRLTC ;RELEASE TCB AND UNLINK FROM CHAIN
MOV R3, TCBP1 ;UPDATE START OF CHAIN OF TCBS
CLR LB.TC1(R4) ;CLEAR BSC TCB POINTER
26$: ;CLEAN UP LCB
MOV #NDHASP, R2 ;GET NUMBER OF XLATE TCBS
27$: MOV R4, R1 ;POINT TO LCB 4(026)
;4(026) MOV R0, R1 ;POINT TO LCB
CLC ;CLEAR FOR ROTATE
ASL R2 ;MAKE EVEN FOR WORD OFFSET
ADD R2, R1 ;OFFSET INTO LCB
CLC ;CLEAR FOR ROTATE
ASR R2 ;GET BACK # OF XLATE TCBS
CLR LB.TC1(R1) ;CLEAR XLATE TCB POINTER IN LCB
SOB R2, 27$ ;CLEAR THE REST OF THE XLATE POINTERS
JSR PC, HSRESR ;RESTORE THE REGISTERS
25$:
;;++BS- END OF CODE THAT DELETES THE BSC TASK AFTER THE LINE IS DISABLED
;
;
MOV R0,TCLCB(R5) ;REMEMBER LCB
JSR PC,DLGBYT ;GET DEVICE TYPE
BCS 17$ ;NONE SPECIFIED
MOV R1,LB.DVT(R0) ;STORE DEVICE TYPE
JSR PC,DLGBYT ;GET CHARACTERISTICS
BCS 17$ ;NOT SPECIFIED
MOV R1,LB.FGS(R0) ;STORE CHARACTERISTICS
BIT #LF.PRI,R1 ;PRIMARY?
BNE 12$ ;YES.
MOV #3*JIFSEC,LB.EQW(R0) ;NO, MAKE SECONDARY
;12$: JSR PC,DLBTCB ;BUILD TCB'S FOR XLATE TASKS
12$:
.IF EQ, XLOPHP ;CHECK IF HASP PRESENT
CMP #TTHASP,LB.DVT(R0) ;IS THIS A HASP LINE?
BNE 20$ ;NO, CONTINUE
BR 19$ ;YES, BUT HASP NOT PRESENT- ERROR
20$:
.ENDC ;.IF EQ, XLOPHP
JSR PC,DLBTCB ;BUILD TCB'S FOR XLATE TASKS
BCS 18$ ;OUT OF STORAGE
MOV LB.TC1(R0),R1 ;POINT TO BSC TASK
BNE 13$ ;MAKE SURE BSC TCB EXISTS
STOPCD HSC ;TRAP OTHERWISE
13$:
CLR TCST2(R1) ;BE SURE IT IS INITIALIZED
CLR TCFG1(R1) ; SO THERE IS NO PROBLEMS WITH
CLR TCFG2(R1) ; ANY EARLIER ABORTS
BIS #LS.ENB,(R0) ;ENABLE THE LINE
CLR R2 ;INITIALIZE OFFSET IN TABLE
MOV LB.LNU(R0),R1 ;NO, INITIALIZE CURRENT MSG PTR
ASL R1 ;FOR WORD BOUNDARY PTR
CMP #TTHASP,LB.DVT(R0) ;HASP LINE?
BEQ 14$ ;YES.
ADD R5,R1 ;POINT TO CURRENT MSG FOR LINE
CLR TCCMSG(R1) ;CLEAR IT
BR 16$ ;AND EXIT
;
;
; HERE FOR HASP LINE, SET DEVICE MSG PTR
;
14$: JSR PC,DLGDTA ;GET DEVICE TABLE ADDRESS
ADD R5,R2 ;R2 IS RETURNED WITH OFFSET
ADD R5,R1 ;POINT TO PLACE TO SAVE
MOV R2,TCCMSG(R1) ;SAVE PTR TO DEVICE MESSAGES
MOV #5,R1 ;INITIALIZE ALL DEVICE MSG PTRS
15$: CLR (R2) ;CLEAR MSG PTR
ADD #2,R2 ;INCREMENT PTR FOR NEXT MSG
SOB R1,15$ ;COVER ALL DEVICE MSG PTRS
16$:
BIS #LF.ENC,LB.FGS(R0) ;ENABLE COMPLETE
BIC #LF.DAC,LB.FGS(R0) ;CLEAR DISABLE COMPLETE
21$: CLC ; NOT FATAL ERROR
RTS PC ; AND RETURN.
;
; HERE ON UNREASONABLE ERROR.
;
17$: SEC ;INDICATE FATAL ERROR
RTS PC ;RETURN.
;
; HERE IF SHORT ON STORAGE
;
18$: MOVB #2,DT10DF+1(R5) ;INDICATE OPERATION DELAYED
CLC ;BUT NOT UTTER FAILURE
RTS PC ;RETURN.
;
;HERE IF REQUESTED A LINE WE DO NOT HAVE
;
24$: JSR PC, DLRJRQ ;;++BS-REJECT THE REQUEST
RTS PC ;;++BS-RETURN
.IF EQ, XLOPHP ;NO HASP BUT HASP LINE INDICATED-ERROR
; HERE IF HASP REQUEST AND NO HASP SUPPORT
19$: MOVB #3, DT10DF+1(R5) ;INDICATE REQUEST REJECTED
BIS #LF.DAC, LB.FGS(R0) ;INDCATE LINE HAS BEEN DISABLED BY BSC TASK
BR 21$ ;NO HASP SUPPORT- RETURN
.ENDC ;.IF EQ, XLOPHP
NWLFLG: .WORD 0 ;FLAG TO INDICATE A NEW LCB WAS BUILT
;
;
; SUBROUTINE TO GET DEVICE TABLE OFFSET FOR MESSAGES
;
DLGDTA:
MOV R1,-(SP) ;SAVE LINE # * 2
ASR R1 ;GET LINE # BACK
TST R1 ;LOOP FOR NON-ZERO LINE
BEQ 12$ ;SKIP FOR LINE ZERO
11$: ADD #2*NDHASP,R2 ;GO OVER ONE LINE TABLE FOR DEVICES 4(027)
;4(027) MOV #2*NDHASP,R2 ;GO OVER ONE LINE TABLE FOR DEVICES
SOB R1,11$ ;GET OFFSET FOR THE LINE
12$: ADD #TCDMSG,R2 ;COMPLETE OFFSET IN R2
MOV (SP)+,R1 ;RESTORE LINE # * 2
RTS PC ;AND RETURN
;
;
; SUBROUTINE TO BUILD THE LINE CONTROL BLOCK AND THE
; TASK CONTROL BLOCKS NEEDED FOR EACH DQ11 LINE.
;
; R0 = LINE NUMBER
;
; ON RETURN:
;
; C CLEAR: LCB ALLOCATED
;
; C SET: OUT OF STORAGE
;
DLENLN: MOV R0,-(SP) ;SAVE LINE NUMBER
MOV #LB.SIZ,R0 ;LENGTH OF A LCB
JSR PC,GETSTG ;GET SPACE FOR A LCB
BCC 11$ ;BRANCH IF ENOUGH SPACE
MOV (SP)+,R0 ;OUT OF SPACE--GET LINE NUMBER
SEC ;FLAG FAILURE
RTS PC ; AND RETURN, NO LCB CREATED.
;
; HERE IF THERE IS ENOUGH STORAGE FOR THE LCB
;
11$: MOV (SP)+,R1 ;GET LINE NUMBER
ASL R1 ;LINE NUMBER * 2
MOV R0,DQLCB(R1) ;STORE POINTER TO LCB
MOV DQCSR(R1),LB.SLA(R0) ;STORE CSR ADDRESS
MOV DQVEC(R1),LB.SLV(R0) ;STORE VECTOR ADDRESS
ASR R1 ;GET LINE NUMBER * 1
MOV R1,LB.LNU(R0) ;STORE LINE NUMBER
MOV #1*JIFSEC,LB.EQW(R0) ;TIME BETWEEN SENDING ENQ'S
MOV #3,LB.EQN(R0) ;NUMBER OF ENQ'S TO SEND BEFORE
; ASSUMING LINE IS DOWN.
MOV #MDMXSD,LB.MDS(R0) ;LENGTH OF SILO WARNING AREA FOR KMC11
MOV #DQTYPE,LB.TYP(R0) ;LINE DRIVER TYPE
CLR LB.FGS(R0) ;CLEAR LINE FLAGS
RTS PC ;RETURN AFTER BULDING LCB
;
;
;THIS SUBROUTINE BUILDS TCB FOR THE BSC AND XLATE TASKS.
; IN 3780/2780 WE NEED ONLY ONE TCB FOR XLATE TASK
; WHILE FOR HASP-MULTILEAVING WE NEED 5 TCB'S IN SIMULATE
; AND 4 TCB'S IN SUPPORT MODE OF OPERATION
;
DLBTCB: MOV R0,-(SP) ;SAVE POINTER TO LCB
MOV R0,R4 ;LCB POINTER IN R4
MOV LB.TC1(R0),R0 ;POINT TO BSC TCB
BNE 17$ ;ITS ALREADY SET UP
JSR PC,GETTCB ;GET A TASK CONTROL BLOCK
bcc 7$ ;got the tcb
jmp dlenlo ;out of storage
7$: MOV #DQDRVR,TCPC(R0) ;STORE INITIAL ADDRESS
BIS #BR3,TCPS(R0) ;SET PRIORITY LEVEL TO 3
MOV (SP),R4 ;GET POINTER TO LCB
MOV R4,TCLCB(R0) ;STORE LCB POINTER
MOV R0,LB.TC1(R4) ;STORE BSC TASK POINTER
MOV TCBP1,R1 ;GET HIGHEST-PRIORITY TCBS
MOV R0,TCBP1 ;PUT THIS TCB ON THE LIST
MOV R1,TCHAIN(R0) ; ...
17$: CLR R2 ;CLEAR DEVICE # INITIALLY
CMP #TTHASP,LB.DVT(R4) ;HASP LINE?
BEQ 11$ ;YES.
MOV #1,LB.NTC(R4) ;NO, SET UP FOR 1 TCB FOR 2780/3780
JSR PC,GETTCB ;GET A TASK CONTROL BLOCK
BCS dlenlo ;NO ROOM.
MOV #XLATE,TCPC(R0) ;STORE START ADR OF TASK
CLR TCDEV(R0) ;DEVICE IS 0 FOR 2780/3780
BR 13$ ;GO PAST HASP SETTINGS
11$: MOV #4,LB.NTC(R4) ;SET UP # OF TCB'S FOR HASP DEVICES
BIT #LF.SIM,LB.FGS(R4) ;IN SIMULATE MODE?
BEQ 12$ ;NO.
INC LB.NTC(R4) ;5 TCB FOR SIMULATE MODE
12$: INC R2 ;MAKE R2 DEVICE #
JSR PC,GETTCB ;GET TCB FOR XLATE TASK
BCS dlenlo ;NO ROOM
.IF NE, XLOPHP ;HASP PRESENT
MOV #XLHASP,TCPC(R0) ;SET UP START ADR OF TASK
.ENDC ;.IF NE, XLOPHP
MOV R2,TCDEV(R0) ;AND DEVICE # IN THE TCB
CLR TCFG1(R0) ;CLEAR FLAGS TO AVOID
CLR TCFG2(R0) ;PROBLEMS LATER
13$: BIS #BR1,TCPS(R0) ;SET PRIORITY LEVEL TO 1
MOV R4,TCLCB(R0) ;STORE LCB POINTER
MOV R4,R1 ;PRESERVE LCB PTR IN R4
ASL R2 ;DEVICE # * 2 FOR WORD PTR
ADD R2,R1 ;ADD DEVICE # TO GET XLATE TCB ADR
ASR R2 ;RESTORE R2 BACK TO DEVICE #
MOV R0,LB.TCD(R1) ;STORE COMP. POINTER
MOV TCBP3,R1 ;GET LOW-PRIORITY TCBS
MOV R0,TCBP3 ;PUT THIS TCB ON THE LIST
MOV R1,TCHAIN(R0) ; ...
;
; continued on next page
;
;
; here to get storage for line buffer for each device
;
MOV #150.,R0 ;LENGTH OF LINE BUFFER
JSR PC,GETSTG ;GET STORAGE FOR IT
BCS dlenlo ;OUT OF STORAGE
MOV TCBP3,R1 ;GET POINTER TO XLATE TCB
MOV R0,TCBFP(R1) ;STORE POINTER TO LINE BUFFER
MOV #150.,TCBFC(R1) ;STORE LENGTH OF LINE BUFFER
;
CMP #TTHASP,LB.DVT(R4) ;HASP LINE?
bne 14$ ;all done for 2780/3780
CMP LB.NTC(R4),R2 ;DONE WITH ALL DEVICES XLATE TCB'S
BNE 12$ ;NO
jsr pc,dlsiom ;set device in input/output mode
14$: MOV LB.SLV(R4),R1 ;GET VECTOR ADDRESS
MOV #BR7,R0 ;GET INITIAL PS
ADD LB.LNU(R4),R0 ;ADD LINE NUMBER
.IIF NE,FTRACE,BIS TRCFLG,R0 ;ADD TRACE BIT IF REQUESTED
MOV #DQAINT,(R1)+ ;STORE PC FOR INTERRUPT A
MOV R0,(R1)+ ;STORE PS FOR INTERRUPT A
MOV #DQBINT,(R1)+ ;STORE PC FOR INTERRUPT B
MOV R0,(R1)+ ;STORE PS FOR INTERRUPT B
MOV (SP)+,R0 ;RESTORE LCB POINTER IN R0
CLC ;CLEAR C TO FLAG SUCCESS
RTS PC ; AND RETURN.
;
;
; HERE IF WE RUN OUT OF STORAGE GETTING A TCB.
;
DLENLO: MOV (SP),R4 ;GET LCB POINTER
JSR PC,DLRTCB ;RELEASE ALL STORAGE FOR TCB AND LCB
MOV (SP)+,R0 ;GET LCB POINTER
SEC ;SET C AS A FLAG
RTS PC ; AND RETURN.
;
;
; THIS SUBROUTINE SETS A FLAG TO INDICATE WHETHER THE DEVICE
; IS DOING INPUT OR OUTPUT. FLAG IS USED BY XLATE TASKS.
;
DLSIOM: MOV R4,R1 ;PRESERVE R4
BIT #LF.SIM,LB.FGS(R4) ;SIMULATE MODE?
BEQ 11$ ;NO, MUST BE SUPPORT
ADD #2,R1 ;DEVICE 1 IS CONSOLE INPUT TO IBM
MOV LB.TCD(R1),R0 ;GET XLATE TCB PTR
BIS #TCIOM,TCFG1(R0) ;MARK AS INPUT DEVICE
JSR PC,DLFRBF ;DONT NEED BUFFER FOR INPUT
ADD #2,R1 ;BYPASS CONSOLE OUT
11$: ADD #4,R1 ;FOR CONSOLE INPUT (SUP), LPT (SIM)
MOV LB.TCD(R1),R0 ;GET XLATE TCB PTR
BIS #TCIOM,TCFG1(R0) ;FLAG INPUT DEVICE
JSR PC,DLFRBF ;FREE THE LINE BUFFER
ADD #2,R1 ;FOR PUNCH DEVICE
MOV LB.TCD(R1),R0 ;GET PTR TO XLATE TCB
BIS #TCIOM,TCFG1(R0) ;FLAG AS INPUT DEVICE
JSR PC,DLFRBF ;FREE THE INPUT LINE BUFFER
RTS PC ;AND RETURN
;
; THIS SUBROUTINE FREES THE LINE BUFFER STORAGE AND
; CLEARS THE POINTER IN THE XLATE TCB'S.
;
DLFRBF: MOV R0,-(SP) ;SAVE R0
MOV TCBFP(R0),R0 ;GET BUFFER POINTER
BEQ 11$ ;ITS ALREADY FREED
JSR PC,FRESTG ;FREE THE STORAGE
11$: MOV (SP)+,R0 ;RESTORE R0
CLR TCBFP(R0) ;CLEAR POINTER IN TCB
RTS PC ;RETURN
;
;
; SUBROUTINE TO RELEASE BSC AND XLATE TCBS
; NEEDS LCB POINTER IN R4 ON ENTRY
; R4 IS PRESERVED, R0, R2 ARE DESTROYED
;
DLRTCB: MOV LB.TC1(R4),R0 ;GET PTR TO BSC TASK
BEQ DLXTCB ;NO BSC, LOOK FOR XLATE TCB'S
MOV TCBP1,R3 ;R3 MUST POINT TO START OF CHAIN
JSR PC,DLRLTC ;RELEASE TCB AND UNLINK FROM CHAIN
MOV R3,TCBP1 ;UPDATE START OF CHAIN OF TCBS
CLR LB.TC1(R4) ;CLEAR BSC TCB POINTER
DLXTCB: MOV LB.NTC(R4),R2 ;GET # OF TCBS FOR XLATE
BEQ 16$ ;JUST IN CASE ITS ZERO
CMP #1,R2 ;2780/3780 MODE
BNE 11$ ;NO.
CLR R1 ;FOR 2780/3780 MODE
BR 12$ ;BYPASS HASP DEVICE LOGIC
11$: MOV R2,R1 ;START WITH HIGHEST DEVICE #
ASL R1 ;DEVICE # MUTLIPLIED BY 2
12$: ADD R4,R1 ;GET TCB PTR TO DEVICE'S
MOV LB.TCD(R1),R0 ;XLATE TASK
BEQ 15$ ;NONE FOR THIS, CHECK NEXT DEVICE
JSR PC,DLFRBF ;RELAESE LINE BUFFER
MOV R0,-(SP) ;SAVE XLATE TCB PTR
MOV TCSBF(R0),R0 ;ANY COMPRESSED BUFFER TO RELEASE?
BEQ 14$ ;NO.
JSR PC,FRESTG ;YES, RELEASE IT
14$: MOV (SP)+,R0 ;RESTORE XLATE PTR
CLR LB.TCD(R1) ;CLEAR POINTER TO TCB
MOV TCBP3,R3 ;POINT TO START OF TCB CHAIN
JSR PC,DLRLTC ;RELEASE AND UNLINK TCB FOR XLATE
MOV R3,TCBP3 ;UPDATE POINTER TO START OF TCB CHAIN
15$: SOB R2,11$ ;DO FOR ALL DEVICE XLATE TCB'S
CLR LB.TCD(R4) ;CLEAR ANY PREV XLATE POINTER
;
16$: CLC ;INDICATE SUCCESS
RTS PC ;RETURN
;
CLC ;INDICATE SUCCESS
RTS PC ;RETURN
;
;
;
; THIS SUBROUTINE FREES THE TCB WHOSE ADDRESS IS IN R0 AND
; UNLINKS THE TCB FROM THE CHAIN WHOSE START IS POINTED TO
; BY R3. R3 IS RETURNED WITH UPDATED POINTER TO START OF CHAIN.
; R1 IS DESTROYED BY THIS ROUTINE. R0 AND R2 ARE PRESERVED.
;
DLRLTC: MOV R2,-(SP) ;SAVE R2
CMP R3,R0 ;IS IT FIRST TCB OF CHAIN?
BNE 13$ ;NO, HUNT THRU THE CHAIN
MOV TCHAIN(R0),R3 ;YES, UPDATE POINTER TO START OF CHAIN
11$: JSR PC,FRETCB ;FREE THE TCB
12$: MOV (SP)+,R2 ;RESTORE R2
CLC ;INDICATE SUCCESS
RTS PC ;RETURN
;
13$: MOV R3,R1 ;MAKE FIRST TCB THE PREVIOUS ONE
14$: MOV TCHAIN(R1),R2 ;POINT TO NEXT TCB IN CHAIN
BEQ 16$ ;TCB MISSING FROM QUE
CMP R0,R2 ;MATCH OUR TCB?
BEQ 15$ ;YES.
MOV R2,R1 ;MAKE CURRENT THE PREV ONE
BR 14$ ;HUNT TILL MATCH
;
15$: MOV TCHAIN(R2),TCHAIN(R1) ;UNLINK TCB FROM CHAIN
BR 11$ ;FREE THE TCB AND EXIT
;
; HERE IF TCB IS FOUND MISSING FROM THE QUE
;
16$: STOPCD DTM ;TCB MISSING
;
;
; SUBROUTINE TO DO LINE COMMAND 02: SET DTR
;
DLTL02: MOVB DT11AD+1(R5),R0 ;GET LINE NUMBER
ASL R0 ;LINE NUMBER * 2
MOV DQLCB(R0),R0 ;GET LCB
BEQ 11$ ;SHOULD BE THERE
BIT #LS.ENB,(R0) ;IS THE LINE ENABLED?
BEQ 11$ ;NO. CAN'T SET DTR.
JSR PC,DQDTR1 ;SET DATA TERMINAL READY
CLC ;NOT FATAL ERROR
RTS PC ;RETURN.
;
; HERE IF NO LCB OR NOT ENABLED
;
11$: ;SEC ;INDICATE FATAL ERROR
JSR PC, DLRJRQ ;;++BS-REJECT THE REQUEST
RTS PC ;RETURN.
;
; SUBROUTINE TO DO LINE COMMAND 03: CLEAR DTR
;
DLTL03: MOVB DT11AD+1(R5),R0 ;GET LINE NUMBER
ASL R0 ;LINE NUMBER * 2
MOV DQLCB(R0),R0 ;GET LCB
BEQ 11$ ;SHOULD BE THERE
BIT #LS.ENB,(R0) ;IS THE LINE ENABLED?
BEQ 11$ ;NO, CAN'T CLEAR DTR.
JSR PC,DQDTR0 ;CLEAR DATA TERMINAL READY [1(665)]
CLC ;NOT FATAL ERROR
RTS PC ;RETURN.
;
; HERE IF NO LCB OR NOT ENABLED.
;
11$: ;SEC ;INDICATE FATAL ERROR
JSR PC, DLRJRQ ;;++BS-REJECT THE REQUEST
RTS PC ;RETURN.
;
; SUBROUTINE TO DO LINE COMMAND 04: DISABLE
;
DLTL04: MOVB DT11AD+1(R5),R0 ;GET LINE NUMBER
MOV R1, -(SP) ;;++BS-SAVE R1
MOVB NDQ11S, R1 ;;++BS-GET NUMBER OF DQ11S
DEC R1 ;;++BS-CONVERT TO LINE NUMBER
CMPB R1, R0 ;;++BS-EXCEED MAX NUMBER ?
BLT 11$ ;;++BS-YES, IGNORE
ASL R0 ;LINE NUMBER * 2
MOV DQLCB(R0),R0 ;GET LCB POINTER
BEQ 11$ ;DOESN'T MATTER IF NOT THERE
; BIC #LS.ENB,(R0) ;THERE, DISABLE IT.
; MOV R0,R4 ;POINT R4 TO LCB
; JSR PC,DLRTCB ;RELEASE BSC AND XLATE TCB'S
BIT #LS.ENB,(R0) ;WAS LINE ENABLED?
BEQ 11$ ;NO.
BIC #LS.ENB,(R0) ;THERE, DISABLE IT.
11$: MOV (SP)+, R1 ;;++BS-RESTORE R1
CLC ;NO FATAL ERROR
RTS PC ;RETURN.
;
;
; SUBROUTINE TO DO LINE COMMAND 05: SET CTS DELAY
;
DLTL05: MOVB DT11AD+1(R5),R0 ;GET LINE NUMBER
ASL R0 ;LINE NUMBER * 2
MOV DQLCB(R0),R0 ;GET LCB POINTER
BEQ 11$ ;SHOULD BE THERE
BIT #LS.ENB,(R0) ;IS THE LINE ENABLED?
BEQ 11$ ;NO, CAN'T SET CTS DELAY
JSR PC,DLGBYT ;GET LOW BITS OF CTS DELAY
BCS 11$ ;NOT SPECIFIED
MOVB R1,LB.CSD(R0) ;STORE LOW BITS
JSR PC,DLGBYT ;GET HIGH BITS
BCS 11$ ;NOT SPECIFIED
MOVB R1,LB.CSD+1(R0) ;STORE HIGH BITS
CLC ;NO FATAL ERROR
RTS PC ;RETURN.
;
; HERE IF THE LINE IS NOT ENABLED OR IF THE ARGUMENT IS
; NOT COMPLETELY SPECIFIED.
;
11$: ;SEC ;INDICATE ERROR
JSR PC, DLRJRQ ;;++BS-REJECT THE REQUEST
RTS PC ;RETURN.
;
; SUBROUTINE TO DO LINE COMMAND 06: SET LENGTH OF SILO WARNING AREA
; (THIS IS ONLY EFFECTIVE IF THE LINE DRIVER INCLUDES A KMC11)
;
DLTL06: MOVB DT11AD+1(R5),R0 ;GET LINE NUMBER
ASL R0 ;LINE NUMBER * 2
MOV DQLCB(R0),R0 ;GET LCB POINTER
BEQ 11$ ;NONE, ERROR.
BIT #LS.ENB,(R0) ;IS THE LINE ENABLED?
BEQ 11$ ;NO, ERROR.
JSR PC,DLGBYT ;GET LOW BITS OF LENGTH OF SILO WARNING AREA
BCS 11$ ;NOT SPECIFIED, ERROR.
MOVB R1,LB.MDS(R0) ;STORE LOW BITS
JSR PC,DLGBYT ;GET HIGH BITS
BCS 11$ ;NOT SPECIFIED, ERROR
MOVB R1,LB.MDS+1(R0) ;STORE HIGH BITS
CLR LB.MDU(R0) ;CLEAR MAX DEPTH USED
CLC ;NO FATAL ERROR
RTS PC ;RETURN.
;
; HERE IF THE LINE IS NOT ENABLED OR IF THE ARGUMENT
; IS OMITTED OR NOT COMPLETELY SPECIFIED.
;
11$: ;SEC ;FLAG AN ERROR
JSR PC, DLRJRQ ;;++BS-REJECT THE REQUEST
RTS PC ;RETURN.
;
;
;
; SUBROUTINE TO DO LINE COMMAND 07: SET OUTPUT IN TRANSPARENCY
; THIS APPLIES ONLY TO HASP-MULTILEAVING LINES
;
DLTL07: MOVB DT11AD+1(R5),R0 ;GET THE LINE NUMBER
ASL R0 ;LINE NUMBER * 2
MOV DQLCB(R0),R0 ;GET LCB POINTER
BEQ 11$ ;NONE, ERROR.
BIT #LS.ENB,(R0) ;IS THE LINE ENABLED?
BEQ 11$ ;NO, ERROR.
BIS #LF.TSP,LB.FGS(R0) ;SET FLAG IN LINE CONTROL BLOCK
MOV LB.TC1(R0),R1 ;GET POINTER TO BSC TCB
BIS #TCTSP,TCFG1(R1) ;SET TRASPARENT FLAG FOR BSC
CLC ;NO FATAL ERROR
RTS PC ;RETURN
;
; HERE IF THE LINE IS NOT ENABLED OR IF THE ARGUMENT
; IS OMITTED OR NOT COMPLETELY SPECIFIED.
;
11$: ;SEC ;FLAG AN ERROR
JSR PC, DLRJRQ ;;++BS-REJECT THE REQUEST
RTS PC ;RETURN.
;
; SUBROUTINE TO DO LINE COMMAND 08: SET OUTPUT IN NON-TRANSPARENCY
; THIS APPLIES ONLY TO HASP-MULTILEAVING LINES
;
DLTL08: MOVB DT11AD+1(R5),R0 ;GET THE LINE NUMBER
ASL R0 ;LINE NUMBER * 2
MOV DQLCB(R0),R0 ;GET LCB POINTER
BEQ 11$ ;NONE, ERROR.
BIT #LS.ENB,(R0) ;IS THE LINE ENABLED?
BEQ 11$ ;NO, ERROR.
BIC #LF.TSP,LB.FGS(R0) ;SET FLAG IN LINE CONTROL BLOCK
MOV LB.TC1(R0),R1 ;POINT TO BSC TCB
BIC #TCTSP,TCFG1(R1) ;CLEAR TRANSPARENCY FOR BSC TO LOOK AT
CLC ;NO FATAL ERROR
RTS PC ;RETURN
;
; HERE IF THE LINE IS NOT ENABLED OR IF THE ARGUMENT
; IS OMITTED OR NOT COMPLETELY SPECIFIED.
;
11$: ;SEC ;FLAG AN ERROR
JSR PC, DLRJRQ ;;++BS-REJECT THE REQUEST
RTS PC ;RETURN.
;
;
; SUBROUTINE TO SET TRANSMISSION BLOCK SIZE
;
DLTL09: MOVB DT11AD+1(R5),R0 ;GET THE LINE NUMBER
ASL R0 ;LINE NUMBER * 2
MOV DQLCB(R0),R0 ;POINT TO THE LCB
BEQ 11$ ;NONE THERE, ERROR
BIT #LS.ENB,(R0) ;IS THE LINE ENABLED?
BEQ 11$ ;NO, ERROR
JSR PC,DLGBYT ;GET LOW ORDER BYTE OF BLOCK SIZE
BCS 11$ ;NOT SPECIFIED, ERROR
MOVB R1,LB.MBL(R0) ;STORE LOW BITS
JSR PC,DLGBYT ;GET HIGH ORDER BITS
BCS 11$ ;NOT SPECIFIED, ERROR
MOVB R1,LB.MBL+1(R0) ;STORE HIGH BITS
CLC ;INDICATE SUCCESS
RTS PC ;RETURN
;
11$: ;SEC ;INDICATE FAILURE
JSR PC, DLRJRQ ;;++BS-REJECT THE REQUEST
RTS PC ;AND RETURN
;
; SUBROUTINE TO SET RECORDS PER MESSAGE FOR TRANSMISSION BLOCK
;
DLTL10: MOVB DT11AD+1(R5),R0 ;GET LINE NUMBER
ASL R0 ;LINE NUMBER * 2
MOV DQLCB(R0),R0 ;POINT TO THE LCB
BEQ 11$ ;NONE THERE, ERROR
BIT #LS.ENB,(R0) ;IS THE LINE ENABLED?
BEQ 11$ ;NO, ERROR
JSR PC,DLGBYT ;GET LOW ORDER BYTE OF # OF RECORDS
BCS 11$ ;NOT SPECIFIED, ERROR
MOVB R1,LB.MLR(R0) ;STORE LOW BITS
JSR PC,DLGBYT ;GET HIGH ORDER BITS
BCS 11$ ;NOT SPECIFIED, ERROR
MOVB R1,LB.MLR+1(R0) ;STORE HIGH BITS
CLC ;INDICATE SUCCESS
RTS PC ;RETURN
;
11$: ;SEC ;INDICATE FAILURE
JSR PC, DLRJRQ ;;++BS-REJECT THE REQUEST
RTS PC ;AND RETURN
;
;
;
; SUBROUTINE TO SET LINE SIGNATURE (;;++BS-)
DLTL11: MOVB DT11AD+1(R5),R0 ;GET LINE NUMBER
ASL R0 ;LINE NUMBER * 2
MOV DQLCB(R0),R0 ;GET LCB POINTER
BEQ 11$ ;NONE, ERROR.
BIT #LS.ENB,(R0) ;IS THE LINE ENABLED?
BEQ 11$ ;NO, ERROR.
JSR PC,DLGBYT ;GET LOW BITS OF LENGTH OF SILO WARNING AREA
BCS 11$ ;NOT SPECIFIED, ERROR.
MOVB R1,LB.SIG(R0) ;STORE LOW BITS
JSR PC,DLGBYT ;GET HIGH BITS
BCS 11$ ;NOT SPECIFIED, ERROR
MOVB R1,LB.SIG+1(R0) ;STORE HIGH BITS
CLC ;NO FATAL ERROR
RTS PC ;RETURN.
;
; HERE IF THE LINE IS NOT ENABLED OR IF THE ARGUMENT
; IS OMITTED OR NOT COMPLETELY SPECIFIED.
;
11$: ;SEC ;FLAG AN ERROR
JSR PC, DLRJRQ ;;++BS-REJECT THE REQUEST
RTS PC ;RETURN.
;
; EACH SUBROUTINE OF THE FORM DLTDXX WHERE XX IS A DECIMAL NUMBER
; PERFORMS THE DEVICE COMMAND NUMBER XX.
;
; SUBROUTINE TO DO DEVICE COMMAND 01: SET CHARACTERISTICS
;
DLTD01: JSR PC,DLGBYT ;GET DEVICE TYPE
BCS 11$ ;NONE SPECIFIED
MOV TCXLT(R5),R0 ;POINT TO XLATE TCB
MOV R1,TCDVT(R0) ;STORE DEVICE TYPE
JMP DLTDOK ;SUCCESS.
;
11$: RTS PC ;ERROR RETURN.
;
;THE SUBROUTINE HAS BEEN NO OPTED. THIS IS NOW A LINE COMMAND FUNCTION
; SUBROUTINE TO DO DEVICE COMMAND 02: SET MAX LOGICAL RECORDS PER BLOCK
;
;DLTD02: JSR PC,DLGBYT ;GET LOW BYTE OF NUMBER
; BCS 11$ ;NOT SPECIFIED, ERROR
; MOV TCXLT(R5),R0 ;POINT TO XLATE TASK
;; MOVB R1,TCMLR(R0) ;STORE LOW BYTE OF NUMBER
; MOV R3, -(SP) ;SAVE R3
; MOV TCLCB(R5), R3 ;GET LCB POINTER
; MOVB R1,LB.MLR(R3) ;STORE LOW BYTE OF NUMBER
; MOV (SP)+,R3 ;RESTORE R3
; JSR PC,DLGBYT ;GET HIGH BYTE
; BCS 11$ ;NOT SPECIFIED, ERROR.
;; MOVB R1,TCMLR+1(R0) ;STORE LOW BYTE
; MOV R3, -(SP) ;SAVE R3
; MOV TCLCB(R5),R3 ;GET LCB POINTER
; MOVB R1,LB.MLR+1(R3) ;STORE HIGH BYTE OF NUMBER
; MOV (SP)+,R3 ;RESTORE R3
; JMP DLTDOK ;INDICATE SUCCESS
;
;11$: RTS PC ;ERROR RETURN.
;
; SUBROUTINE TO DO DEVICE COMMAND 03: DUMP OUTPUT [1(627)]
;
DLTD03: MOV TCXLT(R5),R0 ;POINT TO XLATE TASK [1(627)]
BIS #TCDMP,TCFG1(R0) ;SET "DUMP OUTPUT" [1(627)]
JMP DLTDOK ;INDICATE SUCCESS [1(627)]
;
; SUBROUTINE TO DO DEVICE COMMAND 04: CLEAR "INPUT PERMISSION WAS REQUESTED"
;
DLTD04: MOV TCXLT(R5),R0 ;POINT TO XLATE TASK [2(770)]
BIC #TCIWR,TCFG2(R0) ;CLEAR "INPUT PERMISSION WAS REQUESTED" [2(770)]
JMP DLTDOK ;INDICATE SUCCESS [2(770)]
;
; NOTE THAT COMMAND 05 IS RESERVED.
;
; SUBROUTINE TO DO DEVICE COMMAND 06: SET "INTERPRET CC ON INPUT"
;
DLTD06: MOV TCXLT(R5),R0 ;POINT TO XLATE TASK
BIS #TCPRI,TCFG1(R0) ;SET "CC ON INPUT"
JMP DLTDOK ;INDICATE SUCCESS
;
;
; SUBROUTINE TO DO DEVICE COMMAND 07: NO INTERPRET CC ON INPUT
;
DLTD07: MOV TCXLT(R5),R0 ;POINT TO XLATE TASK
BIC #TCPRI,TCFG1(R0) ;CLEAR "CC ON INPUT"
JMP DLTDOK ;INDICATE SUCCESS
;
; SUBROUTINE TO DO DEVICE COMMAND 08: INTERPRET CC ON OUTPUT
;
DLTD08: MOV TCXLT(R5),R0 ;POINT TO XLATE TASK
BIS #TCPRO,TCFG1(R0) ;SET "CC ON OUTPUT"
JMP DLTDOK ;INDICATE SUCCESS
;
; SUBROUTINE TO DO DEVICE COMMAND 09: NO CC ON OUTPUT
;
DLTD09: MOV TCXLT(R5),R0 ;POINT TO XLATE TASK
BIC #TCPRO,TCFG1(R0) ;CLEAR "CC ON OUTPUT"
JMP DLTDOK ;INDICATE SUCCESS
;
; SUBROUTINE TO DO DEVICE COMMAND 12: DO COMPONENT SELECTION
; THIS IS USED BY HASP-MULTILEAVING ONLY
;
DLTD12: MOV TCXLT(R5),R0 ;POINT TO XLATE TASK
BIS #TCCMP,TCFG1(R0) ;INDICATE "COMPONENT SELECTION"
JSR PC,DLGBYT ;GET COMPONENT CODE
BCS 11$ ;NONE SPECIFIED
MOVB R1,TCCTP(R0) ;STORE COMPONENT CODE
JMP DLTDOK ;INDICATE SUCCESS.
;
11$: RTS PC ;ERROR RETURN.
;
; SUBROUTINE TO DO DEVICE COMMAND 13: NO COMPONENT SELECTION
;
DLTD13: MOV TCXLT(R5),R0 ;POINT TO XLATE TASK
BIC #TCCMP,TCFG1(R0) ;INDICATE NO COMPONENT SELECTION
JMP DLTDOK ;INDICATE SUCCESS
;
;
; SUBROUTINE TO DO DEVICE COMMAND 14: SET PRINTER PAGE COUNTER
; (NOT YET COMPLETELY IMPLEMENTED IN XLATE)
;
DLTD14: MOV TCXLT(R5),R0 ;POINT TO XLATE TASK
BIS #TCPCE,TCFG1(R0) ;TURN ON PAGE COUNTER
BIC #TCPCO,TCFG1(R0) ; AND TURN OFF INTERRUPT FLAG
JSR PC,DLGBYT ;GET LOW BYTE OF PAGE COUNTER
BCS 11$ ;NOT SUPPLIED
MOVB R1,TCPGC(R0) ;STORE LOW BYTE OF PAGE COUNTER
JSR PC,DLGBYT ;GET HIGH BYTE OF PAGE COUNTER
BCS 11$ ;NOT SUPPLIED
MOVB R1,TCPGC+1(R0) ;STORE HIGH BYTE OF PAGE COUNTER
JMP DLTDOK ;INDICATE SUCCESS
;
11$: RTS PC ;ERROR RETURN.
;
; SUBROUTINE TO DO DEVICE COMMAND 15: NO PRINTER PAGE COUNTING
;
DLTD15: MOV TCXLT(R5),R0 ;GET POINTER TO XLATE TASK
BIC #TCPCE!TCPCO,TCFG1(R0) ;CLEAR PAGE COUNTER BITS
JMP DLTDOK ;INDICATE SUCCESS
;
; SUBROUTINE TO DO DEVICE COMMAND 16: SET BLOCK SIZE
;
;THIS SUBROUTINE HAS BEEN NO OPTED
;DLTD16: JSR PC,DLGBYT ;GET LOW BYTE OF SIZE
; BCS 11$ ;NONE SPECIFIED
; MOV TCXLT(R5),R0 ;POINT TO XLATE TCB
;; MOVB R1,TCMBL(R0) ;STORE LOW BYTE OF MAX BLOCK LENGTH
; MOV R3, -(SP) ;SAVE R3
; MOV TCLCB(R5),R3 ;GET LCB POINTER
; MOVB R1, LB.MBL(R3) ;STORE LOW BYTE OF MAX BLOCK LENGTH
; MOV (SP)+,R3 ;RESTORE R3
; JSR PC,DLGBYT ;GET HIGH BYTE
; BCS 11$ ;NONE SPECIFIED
;; MOVB R1,TCMBL+1(R0) ;STORE HIGH BYTE
; MOV R3, -(SP) ;SAVE R3
; MOV TCLCB(R5),R3 ;GET LCB POINTER
; MOVB R1,LB.MBL+1(R3) ;STORE HIGH BYTE OF MAX BLOCK LENGTH
; MOV (SP)+, R3 ;RESTORE R3
; JMP DLTDOK ;INDICATE SUCCESS
;;
;11$: RTS PC ;ERROR RETURN.
;;
; SUBROUTINE TO DO DEVICE COMMAND 17: DO SPACE COMPRESSION
;
DLTD17: MOV TCXLT(R5),R0 ;POINT R0 TO XLATE TASK
BIS #TCCPS,TCFG1(R0) ;INDICATE DO COMPRESSION
JMP DLTDOK ;INDICATE SUCCESS
;
; SUBROUTINE TO DO DEVICE COMMAND 18: DON'T DO SPACE COMPRESSION
;
DLTD18: MOV TCXLT(R5),R0 ;POINT TO XLATE TASK
BIC #TCCPS,TCFG1(R0) ;INDICATE DONT DO COMPRESSION
JMP DLTDOK ;INDICATE SUCCESS
;
;
; SUBROUTINE TO DO DEVICE COMMAND 19: USE OLD BSC PROTOCOL
;
DLTD19: MOV TCXLT(R5),R0 ;POINT TO XLATE TASK
BIS #TCOBS,TCFG1(R0) ;INDICATE USE OLD BSC
; MOV TCLCB(R5),R0 ;POINT TO LCB
MOV TCLCB(R0), R0 ;;++BS-POINT TO LCB
MOV LB.TC1(R0),R0 ;POINT TO BSC TASK
BIS #TCOBS,TCFG1(R0) ;TELL BSC TASK TO USE OLD BSC
JMP DLTDOK ;INDICATE SUCCESS
;
; SUBROUTINE TO DO DEVICE COMMAND 20: DONT USE OLD BSC
;
DLTD20: MOV TCXLT(R5),R0 ;POINT TO XLATE TASK
BIC #TCOBS,TCFG1(R0) ;NO OLD BSC PROTOCOL
; MOV TCLCB(R5),R0 ;POINT TO LCB
MOV TCLCB(R0), R0 ;;++BS-POINT TO LCB
MOV LB.TC1(R0),R0 ;POINT TO BSC TASK
BIC #TCOBS,TCFG1(R0) ;TELL BSC TASK NOT TO USE OLD BSC PROTOCOL
JMP DLTDOK ;INDICATE SUCCESS
;
; SUBROUTINE TO DO DEVICE COMMAND 21: REQUEST OUTPUT PERMISSION
;
DLTD21: MOV TCXLT(R5),R0 ;POINT TO XLATE TASK
BIT #TCIPR,TCFG2(R0) ;INPUT PERMISSION REQUESTED?
BNE 11$ ;YES, THIS IS A NO-OP.
BIS #TCOPR,TCFG2(R0) ;NO, FLAG OUTPUT PERMISSION REQUESTED
; MOV TCLCB(R5),R0 ;POINT TO LCB
MOV TCLCB(R0), R0 ;;++BS-POINT TO LCB
CMP #TTHASP,LB.DVT(R0) ;HASP LINE?
bne 11$ ;no
MOV LB.TC1(R0),R0 ;POINT TO BSC TASK
BIS #TCOPR,TCFG2(R0) ;TELL BSC TASK THERE IS OUTPUT TO DO
11$: JMP DLTWOK ;WAKE XLATE AND GIVE OK RETURN.
;
; SUBROUTINE TO DO DEVICE COMMAND 22: GRANT INPUT PERMISSION
;
DLTD22: MOV TCXLT(R5),R0 ;POINT TO XLATE TASK
BIT #TCIPR,TCFG2(R0) ;HAS INPUT PERMISSION BEEN REQUESTED?
BEQ 11$ ;NO, THIS IS A NO-OP.
BIS #TCIPG,TCFG2(R0) ;YES, FLAG INPUT PERMISSION GRANTED
11$: JMP DLTWOK ;WAKE XLATE AND GIVE OK RETURN.
;
; SUBROUTINE TO DO DEVICE COMMAND 23: SIGNAL OUTPUT EOF
;
DLTD23: MOV TCXLT(R5),R0 ;POINT TO XLATE TASK
BIS #TCOEF,TCFG2(R0) ;FLAG END-OF-FILE ON OUTPUT
JMP DLTWOK ;WAKE XLATE AND GIVE OK RETURN.
;
; SUBROUTINE TO DO DEVICE COMMAND 24: CLEAR OUTPUT EOF COMPLETE
;
DLTD24: MOV TCXLT(R5),R0 ;POINT TO XLATE TASK
BIC #TCOEF!TCOEC,TCFG2(R0) ;CLEAR OUTPUT EOF FLAGS
JMP DLTWOK ;WAKE XLATE AND GIVE OK RETURN.
;
;
; SUBROUTINE TO DO DEVICE COMMAND 25: SIGNAL OUTPUT ABORT
;
;DLTD25: MOV TCLCB(R5),R0 ;POINT TO LCB
; MOV LB.TC1(R0),R0 ;POINT TO BSC TASK
DLTD25: MOV TCXLT(R5), R0 ;;++BS-POINT TO XLATE TASK
MOV TCLCB(R0), R0 ;;++BS-POINT TO LCB
CMP #TTHASP,LB.DVT(R0) ;HASP LINE?
BEQ 11$ ;YES, INDICATE ABORT TO DEVICE
MOV LB.TC1(R0), R0 ;;++BS-POINT TO BSC TASK
BIS #TCOAB,TCFG2(R0) ;SIGNAL ABORT TO BSC TASK
11$: MOV TCXLT(R5),R0 ;POINT TO XLATE TASK
BIS #TCOAB,TCFG2(R0) ;SIGNAL ABORT TO XLATE TASK
JMP DLTWOK ;AWAKEN XLATE AND GIVE OK RETURN.
;
; SUBROUTINE TO DO DEVICE COMMAND 26: CLEAR OUTPUT ABORT COMPLETE
;
DLTD26: MOV TCXLT(R5),R0 ;POINT TO XLATE TASK
BIC #TCOAB!TCOAC,TCFG2(R0) ;CLEAR ABORT BITS
JSR PC, HCLAOA ;;++BS-CLEAR ACTIVE BIT 3(006)
JMP DLTWOK ;AWAKEN XLATE AND GIVE OK RETURN.
;
; SUBROUTINE TO DO DEVICE COMMAND 27: CLEAR INPUT EOF COMPLETE
;
DLTD27: MOV TCXLT(R5),R0 ;POINT TO XLATE TASK
BIC #TCIEC,TCFG2(R0) ;CLEAR INPUT EOF COMPLETE
JMP DLTWOK ;WAKE XLATE AND GIVE OK RETURN.
;
; SUBROUTINE TO DO DEVICE COMMAND 28: SIGNAL INPUT ABORT
;
;DLTD28: MOV TCLCB(R5),R0 ;POINT TO LCB
; MOV LB.TC1(R0),R0 ;POINT TO BSC TASK
DLTD28: MOV TCXLT(R5), R0 ;;++BS-POINT TO XLATE TASK
MOV TCLCB(R0), R0 ;;++BS-POINT TO LCB
CMP #TTHASP,LB.DVT(R0) ;HASP LINE?
BEQ 11$ ;YES, INDICATE ABORT TO DEVICE
MOV LB.TC1(R0), R0 ;;++BS-POINT TO BSC TASK
BIS #TCIAB,TCFG2(R0) ;SIGNAL ABORT
11$: MOV TCXLT(R5),R0 ;POINT TO XLATE TASK
BIS #TCIAB,TCFG2(R0) ;SIGNAL ABORT
JSR PC,DLDRAI ;DRAIN INPUT QUEUE
JMP DLTWOK ;WAKE XLATE AND GIVE OK RETURN.
;
; SUBROUTINE TO DO DEVICE COMMAND 29: CLEAR INPUT ABORT COMPLETE
;
DLTD29: MOV TCXLT(R5),R0 ;POINT TO XLATE TASK
BIC #TCIAB!TCIAC,TCFG2(R0) ;CLEAR ABORT BITS
JSR PC, HCLAIA ;;++BS-CLEAR THE ACTIVE BIT 3(006)
JSR PC,DLDRAI ;BE SURE THE QUEUE IS DRAINED
JMP DLTWOK ;WAKE XLATE AND GIVE OK RETURN.
;
;
; SUBROUTINE TO DO DEVICE COMMAND 30: SUSPEND DEVICE
; HAS MEANING FOR HASP ONLY
;
DLTD30: MOV TCXLT(R5),R0 ;GET XLATE TASK POINTER
BIS #TCDSP,TCFG2(R0) ;MARK DEVICE SUSPENDED
; BIT #TCIOM,TCFG1(R1) ;INPUT DEVICE?
BIT #TCIOM,TCFG1(R0) ;;++BS-INPUT DEVICE ?
BEQ 11$ ;NO, EXIT
MOV TCDEV(R0),R1 ;GET DEV #
; MOV TCLCB(R5),R0 ;POINT TO LCB
MOV TCLCB(R0), R0 ;;++BS-POINT TO LCB
MOV LB.TC1(R0),R0 ;POINT TO BSC TCB
ASL R1 ;DEV # * 2
MOV SUSTBL(R1),R1 ;GET SUSPEND BIT FOR DEVICE
BIC R1,TCTFCS(R0) ;R0 STILL POINTS TO BSC
;THIS INDICATION GOES TO REMOTE
11$:
BR DLTWOK ;ALWAYS OK RETURN
;
; THIS SUBROUTINE TO DO DEVICE COMMAND 31: UNSUSPEND DEVICE
;
DLTD31: MOV TCXLT(R5),R0 ;POINT TO DEVICE'S XLATE TCB
BIC #TCDSP,TCFG2(R0) ;MARK DEVICE UNSUSPENDED
; BIT #TCIOM,TCFG1(R1) ;INPUT DEVICE?
BIT #TCIOM,TCFG1(R0) ;;++BS-INPUT DEVICE ?
BEQ 11$ ;NO, EXIT
MOV TCDEV(R0),R1 ;GET DEV #
; MOV TCLCB(R5),R0 ;POINT TO LCB
MOV TCLCB(R0), R0 ;;++BS-POINT TO LCB
MOV LB.TC1(R0),R0 ;POINT TO BSC TCB
ASL R1 ;DEV # * 2
MOV SUSTBL(R1),R1 ;GET SUSPEND BIT FOR DEVICE
BIS R1,TCTFCS(R0) ;R0 STILL POINTS TO BSC
;THIS INDICATION GOES TO REMOTE
11$:
BR DLTWOK ;ALWAYS SUCCESS
;
; SUBROTINE TO DO DEVICE COMMAND 32: SET DEVICE RECORD SIZE
;
DLTD32: JSR PC,DLGBYT ;GET LOW BYTE OF SIZE
BCS 11$ ;NOT SPECIFIED, ERROR
MOV TCXLT(R5),R0 ;POINT TO XLATE TASK
MOVB R1,TCRSZ(R0) ;STORE LOW BYTE OF SIZE
JSR PC,DLGBYT ;GET HIGH BYTE
BCS 11$ ;NOT SPECIFIED, ERROR
MOVB R1,TCRSZ+1(R0) ;STORE HIGH BYTE
JMP DLTDOK ;INDICATE SUCCESS
;
11$: RTS PC ;ERROR RETURN
;
;
; SUBROUTINE TO DRAIN THE INPUT QUEUE ON AN ABORT.
;
DLDRAI:
;11$: MOV TCLCB(R5),R4 ;POINT TO LCB
11$: MOV TCXLT(R5), R4 ;;++BS-POINT TO XLATE TASK
MOV TCLCB(R4), R4 ;;++BS-POINT TO LCB
MOV LB.LNU(R4),R1 ;GET LINE NUMBER
CMP #TTHASP,LB.DVT(R4) ;HASP LINE?
BNE 12$ ;NO, USE LINE NO AS I.D.
SWAB R1 ;PUT LINE # IN LEFT BYTE
ADD TCCTP(R0),R1 ;MAKE I.D. FOR HASP DEVICE
12$: JSR PC,DEQMID ;GET MESSAGE FROM THIS LINE
BCS 13$ ;NO MORE, ALL DONE.
MOV TCIDLE,R1 ;POINT TO "IDLE" TASK
JSR PC,QUEMSG ;SEND IT THE MESSAGE
BR 11$ ;GET THE REST
;
; HERE WHEN THERE ARE NO MORE MESSAGES FROM THIS LINE
;
13$: RTS PC ;RETURN.
;
; HERE TO WAKE THE XLATE TASK AND GIVE OK RETURN.
;
DLTWOK: MOV TCXLT(R5),R0 ;POINT TO XLATE TASK
BIT #EBINTR,(R0) ;WAITING FOR US?
BEQ DLTDOK ;NO.
BIC #EBINTR!EBWAIT,(R0) ;MAYBE, WAKE IT.
;
; HERE TO SUCCESSFULLY RETURN FROM A DEVICE COMMAND SUBROUTINE
;
DLTDOK: ;SUCCESS RETURN
CLC ;NO FATAL ERROR
RTS PC ;RETURN.
;
;
; SUBROUTINE TO SEND THE CURRENT CHUNK TO THE XLATE TASK AND
; OBTAIN A NEW ONE.
;
; R0 POINTS TO THE OLD CHUNK, OR CONTAINS 0 IF THERE IS
; NO OLD CHUNK.
; TCXLT(R5) POINTS TO THE TRANSLATION TASK TO BE SENT THE CHUNK.
;
; ON RETURN:
;
; C SET: OUTPUT ABORTED OR SHORT OF CHUNKS.
; C CLEAR:
;
; R0 POINTS TO NEW CHUNK
; R3 POINTS TO DATA PORTION OF NEW CHUNK
; R1 DESTROYED
;
DLNWCK: MOV R2,-(SP) ;PRESERVE R2
TST R0 ;ANY OLD CHUNK?
BEQ 11$ ;NO.
MOV TCXLT(R5),R1 ;YES, POINT TO XLATE TASK
JSR PC,QUECHK ;SEND IT THE OLD CHUNK
11$: MOV TCXLT(R5),R1 ;POINT TO XLATE TASK
BIT #TCOAB,TCFG2(R1) ;HAS BSC STREAM ABORTED?
BNE 12$ ;YES.
CMP CHFREC,#CHLTEN ;NO, HAVE WE ENOUGH FREE CHUNKS?
BLE 12$ ;NO.
MOV TCLCB(R1),R0 ;YES, POINT TO LCB (R4 MAY BE IN USE)
CMP #TTHASP,LB.DVT(R0) ;HASP LINE?
BNE 13$ ;NO
CMP TCMSC(R1),#MSGXML ;ALREADY ENOUGH MESSAGES TO XMIT
BGT 12$ ;YES, WAIT BEFORE DOING ANY MORE
BR 14$ ;JOIN MAIN PATH
13$: CMP LB.MSC(R0),#MSGXML ;ALREADY ENOUGH MSGS TO XMIT?
BGT 12$ ;YES, WAIT BEFORE DOING ANY MORE.
14$: CMP TCXFR(R5),#DLWLMT ;HAVE WE PROCESSED ENOUGH BYTES?
BGE 12$ ;YES, WAIT UNTIL TRANSLATED.
MOV CHLST,R0 ;NO, GET LAST CHUNK ON FREE LIST.
JSR PC,GETCHK ;GET ANOTHER CHUNK FOR PDP-10 DATA
BCS 12$ ;SHORT ON CHUNKS
;
; HERE WHEN WE HAVE GOTTEN THE CHUNK.
;
MOV R0,R3 ;BUILD POINTER TO DATA SPACE
ADD #CHDAT,R3
MOV (SP)+,R2 ;RESTORE R2
CLC ;SIGNAL SUCCESS
RTS PC ;RETURN.
;
; HERE IF THE STREAM HAS BEEN ABORTED OR WE ARE SHORT OF CHUNKS.
;
12$: MOV (SP)+,R2 ;RESTORE R2
SEC ;SIGNAL FAILURE
RTS PC ;RETURN.
;
;
;SUBROUTINE TO SET UP A REJECT TO THE PDP-10
;
;
;
DLRJRQ: MOVB #3, DT10DF+1(R5) ;;++BS-INDICATE COMMAND REJECTED
CLC ;;++BS-NOT A FATAL ERROR
RTS PC ;;++BS-RETURN
;
;
;
;
;;++BS-3(014) THIS SUBROUTINE CHECKS IF A DEVICE NUMBER IS LEGITIMATE
;;++BS-3(014) FOR THE MODE OF THE LINE. THE DEVICE NUMBER MUST BE ZERO
;;++BS-3(014) FOR 3780/2780. THE DEVICE NUMBER MUST BE BETWEEN ONE AND
;;++BS-3(014) FIVE, INCLUSIVE, FOR HASP. THIS ROUTINE ALSO SAVES THE
;;++BS-3(014) ADDRESS OF THE LAST CALL THAT HAD THE A DEVICE NUMBER.
;
;
; ON ENTRY:
;
; R1 = DEVICE NUMBER
;
; R4 = POINTER TO THE LINE CONTROL BLOCK
;
;
; ON RETURN:
;
; C-BIT CLEAR IMPLIES DEVICE NUMBER OK FOR MODE
;
; C-BIT SET IMPLIES DEVICE NUMBER ILLEGITIMATE FOR MODE
;
;
DLMCHK:
BIC #177770, R1 ;EXTRACT THE DEVICE NUMBER
BEQ 1$ ;IF ZERO, BETTER BE 3780/2780
BIT #LF.SIM, LB.FGS(R4) ;ARE WE DOING SIMULATION ?
BNE 4$ ;YES, UP TO DEVICE # 5 ALLOWED
CMP R1, #4 ;NO, SUPPORT, ONLY DEVICE # 4 ALLOWED
BGT 2$ ;ERROR, > THAN 4 FOR HASP SIMULATION
BR 5$ ;NOW MAKE SURE LINE IS IN HASP MODE
4$: CMP R1, #5 ;GREATER THAN 5 ?
BGT 2$ ;YES, ERROR, NUMBER TO BIG FOR HASP
5$: CMP #TTHASP, LB.DVT(R4) ;NO, HASP MODE ?
BNE 2$ ;NO, ERROR, ITS 3780/2780
BR 3$ ;YES, DEVICE NUMBER IS GOOD
1$: CMP #TTHASP, LB.DVT(R4) ;HASP MODE ?
BNE 3$ ;NO, 3780/2780, ZERO IS GOOD
2$: MOV (SP), DLIMPC ;SAVE THE ADDRESS OF THE CALLER
SEC ;TELL CALLER HE HAD A BAD DEVICE NUMBER
RTS PC ;RETURN TO CALLER
3$: CLC ;TELL CALLER HIS DEVICE NUMBER IS GOOD
RTS PC ;RETURN TO CALLER
DLIMPC: .WORD 0 ;PC OF LAST CALL WITH BAD DEVICE NUMBER
;;++BS-3(014) END OF DLMCHK
;
;
;
;