PVOL1BACKUP D%B1111001001 1Pe _vߋt& dR 5@V$d zt|xx| ҁr& 6L~7L e7x~~E҈C2S. p5^ Z#<%{b) ***THIS VOLUME DOES NOT CONTAIN A HARDWARE BOOTABLE SYSTEM ***  w 4  ť ť 0B < Aaw  ' UD$BA  &( U BQ b Е*  & & PHDR1RSX11MPBL58 00010001000100 00000 00000 000000DECFILE11A PPHDR2U0414404144 M 00 PPRSX11MPBL58RSX11MPBL58R#8<T77$: MOV I.XDBF(R2),U.TDIP(R4) ;SAVE APR BIAS OF USER'S BUFFER> MOV I.XDBF+2(R2),U.TDIP+2(R4) ;SAVE VIRTUAL ADDRESS OF BUFFER- CLR U.TDIF(R4) ;NO DEFAULT BUFFERS ALLOCATEDR( BIC #S1.IBF,(R5) ;DO NON-BUFFERED INPUT; ,; PROCESS AN IO.RTT (TF.RTT) REQUEST, IF ANY;M79$: MOV (SP)+,R1 ;RESTORE R1R80$:; BIT #TF.RTT,I.XMOD(R2) ;READ W/TERMINATOR TABLE SPECIFIED?F1 BEQ PKTDSP ;IF EQ, NO...SKIP TO DISPATCH PACKET H MOV I.XTTB(R2),I.PRM+10(R3) ;COPY 1.ST ADDRESS DOUBLE WORD OF NEW TABLEJ MOV I.XTTB+2(R2),I.PRM+16(R3) ;COPY 2.ND ADDRESS DOUBLE WORD OF NEW TABLE( MOV I.XTTL(R2),R0 ;COPY LENGTH OF TABLE" CMP R0,#32. ;IS IT OVER 32 BYTES BHI 92$ ;YES, SET TO 32. BR 100$ ;JOIN COMMON CODEU .ENDC ;T$$EIO90$:7 CMP R1,#IO.RTT/400 ;IS THIS A READ W/TERMINATOR TABLE?+ BEQ 92$ ;IF EQ YES91$:& BR PKTDSP ;DISPATCH ON FUNCTION CODE92$:$ MOV #32.,R0 ;COPY A 32. BYTE TABLE100$:I MOV R0,-(SP) CALL ALTB ;ALLOCATE A TABLE; MOV (SP)+,R0S8105$: BCS 900$ ;IF CS, ALLOCATION FAILED...RETURN ERROR1 MOV R2,U.TRTT(R4) ;SAVE TERMINATOR TABLE ADDRESSV110$:(* MOV I.PRM+10(R3),KISAR6 ;MAP USER'S TABLE4 MOVB @I.PRM+16(R3),-(SP) ;RETRIEVE AN ENTRY FROM IT* MOV $DALED,KISAR6 ;RESTORE DRIVER MAPPING0 MOVB (SP)+,(R2)+ ;COPY ENTRY TO ALLOCATED TABLE& INC I.PRM+16(R3) ;POINT TO NEXT ENTRY SOB R0,110$ ;LOOP TIL DONE( MOV U.TRTT(R4),R0 ;FORM REMAINING COUNT ADD #32.,R0 ;... SUB R2,R0 ;... BEQ PKTDSP ;ALL DONE IF ZERO115$:M CLRB (R2)+ ;ZERO REST OF TABLE SOB R0,115$ ;... .&; BR PKTDSP ;FALL THROUGH TO "PKTDSP".PAGEA> .SBTTL PKTDSP - DISPATCH ON FUNCTION CODE TO INITIATE REQUEST;B;+;; **-PKTDSP - DISPATCH ON FUNCTION CODE TO INITIATE REQUESTA;-;APKTDSP:R- ASL R1 ;CONVERT FUNCTION CODE TO WORD INDEX  .IF DF T$$ACD< MOV #UA.ALL,U.AFLG-U.TSTA(R5) ;SET DEFAULT PROCESSING FLAGS7 MOV U.ACB-U.TSTA(R5),R0 ;GET ACD CONTROL BLOCK ADDRESS2$ BEQ 120$ ;IF EQ, NONE THERE...SKIP MOV R1,R2 ;COPY FUNCTION CODEC1 CMPB R2,#30. ;FUNCTION CODE IN FIRST MASK WORD?. BLOS 117$ ;Y - JUMPR7 TST (R0)+ ;BUMP ACB POINTER TO CHECK SECOND MASK WORDN# SUB #32.,R2 ;REDUCE FUNCTION CODE+G117$: BIT $BTMSK(R2),A.MAS(R0) ;IS THE ACD INTERESTED IN THIS FUNCTION?K BEQ 120$ ;IF EQ, NO...SKIP3 MOV #A.DEQU,R0 ;SET I/O PACKET DEQUEUE ENTRY POINTA CALL $SWACD ;CALL THE ACDE7 BIT #UA.ALL,U.AFLG-U.TSTA(R5) ;ALLOW THIS I/O REQUEST? $ BNE 120$ ;IF NE, YES...CONTINUE ON= MOV U.ACB-U.TSTA(R5),R0 ;GET ACD CONTROL BLOCK ADDRESS AGAIN 7 MOV A.IOS(R0),R0 ;GET I/O ERROR CODE TO RETURN TO TASK  BR 910$ ;FINISH I/O 120$:C .ENDC ;T$$ACD .IF DF T$$OVL7 MOV PPDSP-2(R1),R1 ;GET ADDRESS TO WHICH TO DISPATCH )# ASL R1 ;CONVERT TO A REAL ADDRESST, BCS 130$ ;AND SEE IF ROUTINE IS IN OVERLAY" CALL MPEXT ;MAP AND CALL ROUTINE BR 140$ ;N130$:L$ CALL (R1) ;IT'S NOT IN THE OVERLAY140$:- .IFF ;T$$OVL ( CALL @PPDSP-2(R1) ;DO OR START FUNCTION .ENDC ;T$$OVL2 JMP GRQPKT ;LOOP TO DEQUEUE ANYTHING ELSE WE CAN; 0; ERROR HANDLING FOR REQUEST INITIATION ROUTINE.;T900$:BA MOV #IE.NOD&377,R0 ;RETURN ERROR FOR INSUFFICIENT DYNAMIC MEMORY910$:D .IF DF T$$EIO' CMP R1,#IO.EIO/400 ;IS THIS AN IO.EIO?O9 BNE 990$ ;IF NE, NO...JUST FINISH OFF PACKET WITH ERROR ! MOV R0,-(SP) ;SAVE RETURN STATUSA$ MOV R5,R0 ;GET COPY OF UCB POINTER> ADD #U.TIXL-U.TSTA,R0 ;MAKE POINTER TO U.TIXL (IOPX LISTHEAD)980$:D5 MOV R0,R1 ;CURRENT IOPX POINTER BECOMES BACKPOINTERP ASSUME I.XLNK,0! MOV (R1),R0 ;POINT TO NEXT IOPXO@ CMP I.XIOP(R0),R3 ;DOES THIS IOPX BELONG TO CURRENT I/O PACKET?+ BNE 980$ ;IF NE,NO...LOOP TILL WE FIND ITM ASSUME I.XLNK,0% MOV (R0),(R1) ;REMOVE IOPX FROM LISTI# MOV R3,-(SP) ;SAVE POINTER TO IOPX,! MOV #I.XLEN,R1 ;GET SIZE OF IOPXR CALL $DEACB ;DEALLOCATE IOPX( MOV (SP)+,R3 ;RESTORE POINTER FOR IOFIN9 MOV U.TDIF(R4),R2 ;GET DEFAULT INPUT BUFFER LIST POINTERL% CALL DELT00-{DATADATADATADATADATADATADATADATADATADATAB ;DEALLOCATE THEM, IF ANYI! MOV (SP)+,R0 ;RESTORE ERROR CODEA990$:. K .ENDC ;T$$EIO$ CALL IOFIN ;FINISH THE I/O REQUEST% JMP GRQPKT ;TRY FOR ANOTHER REQUESTI .DSABL LSBE.PAGE; .SBTTL TTINI SUBROUTINESD@ .SBTTL . GRQAC - $GSPKT ACCEPTANCE ROUTINE FOR GET RQST (FPGRQ);M;+O; **-GRQAC - $GSPKT ACCEPTANCE ROUTINE FOR GETTING A NEW REQUEST PACKET (FPGRQ) ;-;CGRQAC:> CMP I.UCB(R1),G$$SPA(SP) ;IS THIS PACKET FOR THE CURRENT UCB? SEC ;ASSUME ERROR) BNE 10$ ;IF NE, NO...ASSUMPTION CORRECTT ASSUME S2.IRQ,S1.IBYP ASSUME S2.ORQ,S1.OBYD9 BITB I.PRM+7(R1),U.TSTA(R5) ;CAN WE PROCESS THIS PACKET?I3 BNE 20$ ;IF NE, NO...SKIP TO CHECK FOR SCAN ABORTK; IF TERMINAL IS IN TERMINAL MANAGEMENT MODE AND THE REQUEST IS AN INTERNALPH; I/O REQUEST, REJECT THIS PACKET. THIS IS A BIT OF A HACK. WHEN TIME J; PERMITS, WE COULD USE EVENT PACKETS TO TELL THE NET TO STOP SENDING I/O.;R .IF DF T$$SCA & R$$IICC> BIT #S5.TMM,U.TST5(R5) ;IS TERMINAL IN TERM. MANAGEMENT MODE?! BEQ 5$ ;IF NOT, SO FAR, SO GOOD26 BIT #1,I.IOSB+4(R1) ;IF TMM, IS IT ALSO INTERNAL I/O?( BNE 10$ ;REJECT.. SEC STILL FROM ABOVE5$:2 .ENDC ;T$$SCA & R$$IICC .IF DF T$$BTW ASSUME S3.FDX,200< TSTB U.TSTA+4(R5) ;IS THIS A FULL DUPLEX LINE? (CLEAR CC-C)* BMI 10$ ;IF MI, YES...ACCEPT THIS PACKET1 BIT #S1.IBY!S1.OBY,U.TSTA(R5) ;IS ANYTHING BUSY? * BEQ 10$ ;IF EQ, NO...ACCEPT THIS REQUEST;/J; THE LINE IS NOT IN FULL DUPLEX MODE, AND EITHER INPUT OR OUTPUT IS BUSY.M; IN THIS CASE, THE ONLY PACKET WE CAN ACCEPT IS IO.WBT. IO.WBT PACKETS HAVE)K; PRIORITY 251., AND ALL OTHERS HAVE LOWER PRIORITY. IF THIS PACKET IS NOTN; AN IO.WBT, WE KNOW THAT THERE ARE NO IO.WBT'S FURTHER DOWN THE QUEUE EITHER,; SO WE ABORT THE SCAN.U;D= CMPB I.PRI(R1),#251. ;IS THIS AN IO.WBT? (CLEAR CC-C IF YES)A% BNE 30$ ;IF NE, NO...ABORT THE SCANS;Y;NK; DON'T BEGIN AN IO.WBT FUNCTION IF A READ IS ACTIVE THAT SPECIFIED TF.XOF.NJ; THIS IS NECESSARY TO PREVENT A COLLISION BETWEEN THE IO.WBT DATA AND THE; XOF CHARACTER OUTPUT. ;I7 BIT #S1.USI,U.TSTA(R5) ;UNSOLICITED INPUT IN PROGRESS?H BNE 10$ ;Y - ACCEPT IO.WBT .IF DF T$$SPL MOV U.TAPR(R5),KDSAR5 ;MAP UCBX MOV #120000,R2 ;POINT TO UCBX .IFF ;T$$SPLOB MOV U.TUX(R5),R2 ;GET UCBX (THERE MUST BE ONE SINCE LINE IS BUSY) .ENDC ;T$$SPL: TSTB U.TISV(R2) ; CHECK IF ^R AFTER IO.WBT IS IN PROGRESS* BNE 30$ ; YES DO NOT TAKE ANOTHER IO.WBT& MOV @R2,R2 ;GET CURRENT INPUT PACKET BEQ 10$ ;NONE - ACCEPT IO.WBTT: BIT #TF.XOF,I.FCN(R2) ;READ IS ACTIVE - TF.XOF SPECIFIED?8 BNE 30$ ;Y - REJECT IO.WBT AND STOP SCAN AT THIS POINT; $; ACCEPT THE CURRENT REQUEST PACKET.;M .IFF ;T$$BTWA/ CLC ;RETURN WITH CC-C CLEAR TO ACCEPT PACKETF .ENDC ;T$$BTW10$: RETURN ;ALL DONEE;SF; IF PACKET REQUIRES BOTH INPUT AND OUTPUT TO BE FREE, ABORT THE SCAN.>; OTHERWISE JUST REJECT THE PACKET BY RETURNING WITH CC-C SET.;N ASSUME S2.ORQ,100 ASSUME S2.IRQ,20020$:> CMPB I.PRM+7(R1),#S1.IBY!S1.OBY ;ARE BOTH INPUT AND OUTPUT.... ; ...REQUIRED TO BE FREE FOR THIS REQUEST?6 BLO 10$ ;IF LO, NO...RETURN TO REJECT THIS PACKET..., ; ...CC-C WAS SET BY COMPARE INSTRUCTION;$N; WE FOUND A PACKET THAT REQUIRES BOTH INPUT AND OUTPUT TO BE FREE. ABORT THEJ; SCAN SO THE PACKET WILL GET A CHANCE TO BE DEQUEUED ONCE ALL REQUESTS IN; FRONT OF IT ARE DONE.;T30$: ADD #G$$SPA,SP ;FLUSH STACK% MOV (SP)+,R5 ;RESTORE POINTER TO UCBO* CLR (SP) ;DON'T CHANGE FLAGS IN U.TSTA+23 JMP NOPKDQ ;FINISH AS THOUGH NO PACKET TO DEQUEUE.PAGE.@ .SBTTL . KILAC - $GSPKT ACCEPTANCE ROUTINE FOR KILL I/O (QPKIL); ;+3; **-KILAC - KILL I/O ACCEPTANCE ROUTINE FOR $GSPKTE;SJ; "$GSPKT" CALLS THIS ROUTINE WITH AN I/O PACKET TO BE CHECKED AGAINST THE; KILL I/O ACCEPTANCE CRITERIA:AD; 1. THE I/O PACKET UCB ADDRESS MUST MATCH THE I/O KILL REQUEST UCB.D; 2. THE I/O PACKET TCB ADDRESS MUST MATCH THE I/O KILL REQUEST TCB.D; 3. IF THE I/O KILL SUBFUNCTION WAS TF.WLB, THE I/O PACKET FUNCTION,; CODE MUST BE "IO.EIO!TF.WLB" OR "IO.WLB".D; 4. IF 005{UP D%B11110010THE I/O KILL SUBFUNCTION WAS TF.RLB, THE I/O PACKET FUNCTIONA; CODE MUST BE "IO.EIO!TF.RLB", "IO.RLB", "IO.RPR", OR "IO.RTT".S; S ; INPUTS:3; R1 => I/O REQUEST PACKET TO BE ACCEPTED/REJECTED.A(; G$$SPA(SP) => UCB OF PACKETS TO ACCEPT'; G$$SPA+2 => I/O KILL REQUEST PACKETM;H ; OUTPUTS: '; CC-C = 0 IF PACKET IS TO BE ACCEPTEDR'; = 1 IF PACKET IS TO BE REJECTED;.; REGISTERS MODIFIED: R2, R3;-;, .IF DF R$$IICKILAC:> CMP I.UCB(R1),G$$SPA(SP) ;IS THIS PACKET FOR THE CORRECT UCB?& BNE 30$ ;IF NE, NO...DON'T ACCEPT IT: MOV G$$SPA+2(SP),R3 ;GET POINTER TO KILLER REQUEST PACKET5 CMP I.TCB(R1),I.TCB(R3) ;PACKET FOR THE CORRECT TCB?S& BNE 30$ ;IF NE, NO...DON'T ACCEPT IT6 MOVB I.FCN(R3),R3 ;GET KILLER PACKET SUBFUNCTION CODE2 MOVB I.FCN+1(R1),R2 ;GET PACKET SUBFUNCTION CODE  .IF DF T$$EIO= CMPB #IO.EIO/400,R2 ;IS THIS PACKET AN EXTENDED I/O REQUEST?G BNE 5$ ;IF NOT, BRC;WARNING: THIS ASSUMES THAT IO.RLB/400,TF.RLB AND IO.WLB/400,TF.RLBH> MOVB I.FCN(R1),R2 ;GET NON-EXTENDED I/O REQUEST FUNCTION CODE5$: .ENDC ;T$$EIO6 CMPB #IO.RPR/400,R2 ;IS THIS AN OLD-FASHIONED IO.RPR? BEQ 10$ ;IF EQ, YES...SKIP7 CMPB #IO.RTT/400,R2 ;IS THIS AN OLD-FASHIONED IO.RTT?. BNE 20$ ;IF NE, NO...SKIP 10$:5 MOVB #TF.RLB,R2 ;MAKE THESE LOOK LIKE STRAIGHT READSN20$:1 CLC ;ASSUME WE ARE GOING TO ACCEPT THIS PACKET , BITB R3,R2 ;IS THIS A PACKET TO BE KILLED?! BNE 40$ ;IF NE, YES...ACCEPT ITT30$: SEC ;DON'T ACCEPT THIS PACKET40$: RETURN ;ALL DONE; .ENDC ;R$$IIC.PAGET1 .SBTTL I/O REQUEST PRE-QUEUE PROCESSING ROUTINES.+ .SBTTL . QPKIL - INTERNAL I/O KILL REQUEST;Q;+/; **-QPKIL - INTERNAL I/O KILL REQUEST (IO.KIL)H;AI; THIS ROUTINE PROCESSES AN I/O REQUEST WITH A FUNCTION CODE OF ZERO. AN,K; I/O PACKET WILL ONLY HAVE THIS FUNCTION CODE IF IT IS AN INTERNAL (SYSTEMOK; STATE) I/O REQUEST. IT PERFORMS FUNCTIONS SIMILAR TO THE DRIVER'S CANCEL J; I/O ENTRY POINT "TTCAN". HOWEVER, IF CAN BE SPECIFIED THAT ONLY READ ORI; ONLY WRITE REQUESTS ARE TO BE CANCELLED. THIS IS DONE WITH THE REQUEST L; MODIFIERS "TF.WLB" AND "TF.RLB". A "$GSPKT" ACCEPTANCE ROUTINE IS USED TON; FIND ALL SPECIFIED REQUESTS IN THE SCB QUEUE. AN I/O KILL REQUEST IS ALWAYSN; PROCESSED AND COMPLETED IMMEDIATELY, SO IT IS NEVER PLACED IN THE SCB QUEUE.; ; INPUTS:; R3 => I/O KILL REQUEST PACKETT; R4 => SCB FOR THE TERMINAL; R5 => UCB FOR THE TERMINAL; I.FCN = TF.WLB OR TF.RLB 7; I.TCB => TCB OF TASK WHOSE REQUESTS ARE TO BE ABORTED;N ; OUTPUTS:E7; SPECIFIED I/O REQUESTS ARE ABORTED WITH STATUS IE.ABO;O"; REGISTERS MODIFIED: R0, R1, R2;-;A .IF DF R$$IICQPKIL:: .IF DF M$$PRO/ BIT S.URM(R4),@$CPURM ;ALREADY ON CORRECT CPU?I BNE 5$ ;IF NE YES, CONTINUEE7; CONVERT PARAMETER LIST PART OF I/O PACKET INTO A FORK ; BLOCK FOR INTERPROCESSOR FORK.( ADD #I.PRM+12,R3 ;POINT TO KISAR5 FIELD) MOV KINAR5,(R3) ;INSERT DRIVER I MAPPINGT$ MOV R4,-(R3) ;SAVE R4 IN FORK BLOCK7 MOV S.URM(R4),-10(R3) ;SET URM OF DEVICE IN FORK BLOCK . MOV R3,R4 ;POINT R4 AT FORK BLOCK FOR $FORK1$ CALL $FORK1 ;SWITCH TO CORRECT CPU7 SUB #I.PRM+4,R3 ;POINT BACK TO BEGINNING OF FORK BLOCK  CALL MAPD ;RE-MAP DRIVER5$:; .ENDC ; DF M$$PRO* MOV R3,-(SP) ;SAVE REQUEST PACKET POINTER' MOV R5,-(SP) ;SAVE CURRENT UCB POINTERA. ;**NOTE: THESE ARE SAVED FOR INSPECTION...) ; ...IN THE $GSPKT ACCEPTANCE ROUTINEK7 MOV I.TCB(R3),R1 ;GET TCB OF TASK TO KILL REQUESTS FOR < MOV I.FCN(R3),R3 ;GET FUNCTION CODE OF THINGS TO KILL IN R3= CALL TTCN1 ;CANCEL SELECTIVE I/O (DEPENDS ON TF.WLB/TF.RLB)C10$:" MOV (SP),R5 ;RESTORE UCB ADDRESS1 MOV #KILAC,R2 ;SET POINTER TO ACCEPTANCE ROUTINE CALL $GSPKT ;GET A PACKET$, BCS 20$ ;IF CS, NO MORE PACKETS...ALL DONE1 MOV R1,R3 ;COPY KILLED PACKET ADDRESS FOR IOFINN2 MOV #IE.ABO&377,R0 ;SET REQUEST COMPLETION STATUS( CALL IOFIN ;FINISH OFF THE I/O REQUEST! BR 10$ ;LOOK FOR ANOTHER PACKETT20$: TST (SP)+ ;CLEAN STACK: MOV (SP)+,R3 ;GET BACK ADDRESS OF I/O KILL REQUEST PACKET(00={DATADATADATADATADATADATADATADATADATADATA MOV #IS.SUC&377,R0 ;SUCCESSFUL I/O KILL JMP IOFIN ;FINISH I/O KILL .ENDC ;R$$IIC.PAGEU9 .SBTTL . BUFFER ADDRESS CHECKING AND RELOCATION ROUTINESN;;+2; **-CKBFR - ADDRESS CHECK BUFFER FOR READ ACCESSE; **-CKBFRW - ADDRESS CHECK BUFFER FOR READ ACCESS AND WORD ALIGNMENT8; **-CKBFB - ADDRESS CHECK BUFFER FOR READ/WRITE ACCESS;II; THESE ROUTINES PERFORM THE DESCRIBED ADDRESS CHECKING ON A USER BUFFER.T;( ; INPUTS:%; R0 => USER BUFFER (VIRTUAL ADDRESS) ; R1 = LENGTH OF USER BUFFERV;S ; OUTPUTS:S*; CC-C = 0 IF ADDRESS CHECK WAS SUCCESSFUL"; CC-C = 1 IF ADDRESS CHECK FAILED4; R0 = ERROR CODE FOR ADDRESS CHECK FAILURE REASON:.; "IE.SPC" IF SPECIFIED BUFFER LENGTH IS ZEROB; "IE.SPC" IF BUFFER NOT WORD ALIGNED OR EXEC ADDRESS CHECK FAILS6; "IE.BAD" IF BUFFER SIZE IS GREATER THAN 8128. BYTES-; R1 = BIAS OF RELOCATED USER BUFFER ADDRESSO5; R2 = DISPLACEMENT OF RELOCATED USER BUFFER ADDRESS(; ; REGISTERS MODIFIED: R0;-;U .IF DF A$$CHK .ENABL LSBSCKBFRW:V. BIT #1,R0 ;DOES BUFFER START ON ODD ADDRESS?4 BNE 910$ ;IF NE, YES...RETURN INVALID BUFFER ERRORCKBFR::O .IF DF R$$MPL5 MOV #$CKBFR,-(SP) ;SET UP CALL FOR READ-ACCESS CHECKE BR 10$ ;SKIP TO COMMON CODEF .IFTF ;R$$MPLCKBFB::A .IFT ;R$$MPLS6 MOV #$CKBFB,-(SP) ;SET UP CALL FOR WRITE-ACCESS CHECK10$: .IFTF ;R$$MPL TST R1 ;IS BUFFER SIZE VALID?P3 BEQ 900$ ;IF EQ, NO...RETURN INVALID BUFFER ERRORG6 CMP R1,#20000-100 ;IS BUFFER BIGGER THAN 8128. BYTES?5 BHI 920$ ;IF HI, YES...RETURN BAD BUFFER SIZE ERROR .IFT ;R$$MPL0 .IF DF X$$HDR; MOV (SP),-(SP) ;DUPLICATE MAPPING ROUTINE ADDRESS ON STACK#, MOV KISAR6,2(SP) ;SAVE CURRENT EXEC MAPPING+ MOV $SAHDB,KISAR6 ;MAP CURRENT TASK HEADER; .IFTF ;X$$HDR3 CALL @(SP)+ ;CALL REQUESTED ADDRESS CHECK ROUTINEO .IFT ;X$$HDRE+ MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGE .ENDC ;X$$HDR .IFF ;R$$MPLN) CALL $ACHKB ;DO NORMAL ADDRESS CHECKING0 .ENDC ;R$$MPL+ BCS 910$ ;IF CS, IT FAILED...RETURN ERRORS .IFF ;A$$CHKFCKBRW:CKBFR::.CKBFB::P .IFTF ;A$$CHK9 CALL $RELOC ;RELOCATE ADDRESS AND CONVERT TO DOUBLEWORDT RETURN ;ALL DONEP .IFT ;A$$CHKX900$:G6 .IIF DF R$$MPL, TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS910$:A MOV #IE.SPC&377,R0 ;SET COMPLETION ERROR CODE FOR INVALID BUFFERD BR 990$ ;SKIPK920$:R6 .IIF DF R$$MPL, TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS; MOV #IE.BAD&377,R0 ;SET COMPLETION ERROR CODE FOR BAD SIZEM990$:B SEC ;RETURN WITH ERROR FLAG RETURN ;ALL DONEA .DSABL LSB: .ENDC ;A$$CHK.PAGEF? .SBTTL . TSTRQ - CHECK I/O REQUEST QUEUE FOR PACKET TO DEQUEUEL;R;+$; SUBROUTINE TSTRQ - TEST I/O QUEUE.;; INPUT:; R5 POINTER TO U.TSTA;; ; OUTPUT:R:; IF THERE IS (POTENTIALLY) A PACKET IN THE I/O QUEUE THAT; CAN BE PROCESSED:L>; RETURN TO CALLER WITH R3 = MASK OF BITS TO CLEAR IN U.TSTA+2 ; IF NO PACKET COULD BE DEQUEUED;V ; IF NOT:7; RETURN TO CALLER'S CALLER.;R; REGISTERS ALTERED: R3 ;-;NTSTRQ::O- MOV (R5),R3 ;GET FIRST TERMINAL STATUS WORD COM R3 ;INVERT ITGA BIC #^C,R3 ;CLEAR ALL TO SEE WHAT CAN BE DEQUEUEDL/ BIS #S2.SRQ,R3 ;OR WITH "SPECIAL REQUEST" FLAG: BIT R3,2(R5) ;IS ANYTHING IN QUEUE THAT CAN BE PROCESSED?6 BEQ 10$ ;IF EQ, NO...POP OUR WAY OUT OF THIS ROUTINEA BIT #S2.BRQ,2(R5) ;IS THERE A "BREAKTHROUGH WRITE" IN THE QUEUE?R4 BNE 20$ ;IF NE, YES...IT CAN POSSIBLY BE PROCESSED ASSUME S3.FDX,200) TSTB 4(R5) ;USER ON A FULL DUPLEX LINE? 4 BMI 20$ ;IF MI, YES...IT CAN POSSIBLY BE PROCESSED7 BIT #S1.IBY!S1.OBY,(R5) ;IS ANYTHING BUSY ON THE LINE?Y2 BEQ 20$ ;IF EQ, NO...RETURN TO PROCESS A REQUEST10$:; TST (SP)+ ;POP RETURN ADDRESS SO WE WON'T PROCESS REQUESTI20$: RETURN ;ALL DONEC.PAGEQ .PSECT MAP5.6" .SBTTL . WRITE REQUEST PROCESSING% .SBTTL . QPWSB - WRITE SPECIAL DATAU;W;+(; **-QPWSD - WRITE SPECIAL DATA (IO.WSD);-;P .IF DF B$$MAPQPWSD::M9 BIC #^C,I.FCN(R3) ;CLEAR DISALLOWED BITS( BIS #TF.WAL,I.FCN00E{UP D%B11110010(R3) ;SET REQUIRED BIT< CMP #T.RSDN,I.PRM+10(R3) ;IS THE DATA TYPE SPECIFIER LEGAL?% BHIS QPWLB1 ;IF HIS, YES...CONTINUEO6 BR EQPBAD ;ELSE, RETURN REQUEST WITH BAD PARAMENTERS .ENDC ;B$$MAP& .SBTTL . QPWLB - WRITE LOGICAL BLOCK;;+*; **-QPWLB - NORMAL WRITE REQUEST (IO.WLB);-;SQPWLB::B .IF DF T$$CUP@ MOV I.PRM+6(R3),I.PRM+10(R3) ;SAVE VFC/CURSOR-CONTROL FOR LATER .ENDC ;T$$CUPQPWLB1:P7 MOV #S2.ORQ,R4 ;A WRITE MUST BLOCK IF OUTPUT IS ACTIVEW .IF DF T$$BTW> BITB #TF.WBT,I.FCN(R3) ;IS THIS A BREAKTHROUGH WRITE REQUEST?: BEQ CKBFLN ;IF EQ, NO...CHECK BUFFER LENGTH AND QUEUE IT .IF DF M$$MUP( MOV I.TCB(R3),R0 ;GET ISSUEING TASK TCB; BIT #T3.PRV!T3.CLI,T.ST3(R0) ;IS TASK PRIVILEGED OR A CLI?K' BNE 10$ ;IF NE, YES...DO BREAKTHROUGHS, CMP T.UCB(R0),R5 ;IS THE IO.WBT TO OWN TI:?$ BNE EQPPRI ;IF NOT, DON'T ALLOW IT10$: .ENDC ;M$$MUP6 MOVB #251.,I.PRI(R3) ;CHANGE REQUEST TO PRIORITY 251.= BIS #TF.CCO,I.FCN(R3) ;BREAKTHROUGH IMPLIES CANCEL CONTROL-O D MOV #S2.ORQ!S2.BRQ,R4 ;FLAG BREAKTHROUGH REQUEST AND WAIT FOR WRITE .ENDC ;T$$BTW6 BR CKBFLN ;CHECK BUFFER LENGTH AND QUEUE THE REQUEST.PAGE ! .SBTTL . READ REQUEST PROCESSINGV$ .SBTTL . QPRSD - READ SPECIAL DATA;A;+/; **-QPRSD - READ SPECIAL DATA REQUEST (IO.RSD)P;-;R .IF DF B$$MAPQPRSD:: 8 BIC #^C,I.FCN(R3) ;CLEAR DISALLOWED BITS4 BIS #,I.FCN(R3) ;FORCE REQUIRED BITS4 TST I.PRM+10(R3) ;IS THE DATA TYPE SPECIFIER LEGAL?1 BEQ EQPBAD ;ZERO IS NOT ALLOWED, BAD PARAMETERSL< CMP #T.RSDN,I.PRM+10(R3) ;IS THE DATA TYPE SPECIFIER LEGAL?< BHIS CKBFLN ;IF HIS, YES...FINISH CHECKS AND QUEUE REQUEST BR EQPBAD ;BAD PARAMETERSO .ENDC ;B$$MAP$ .SBTTL . QPRPR - READ AFTER PROMPT;Q;+/; **-QPRPR - READ AFTER PROMPT REQUEST (IO.RPR).;-;$ .ENABL LSB: .IF DF T$$RPRQPRPR::.: MOV I.PRM+10(R3),R0 ;GET VIRTUAL ADDRESS OF PROMPT BUFFER, MOV I.PRM+12(R3),R1 ;GET PROMPT BUFFER SIZEC MOV #S2.IRQ!S2.ORQ,R4 ;PROMPT MUST BLOCK IF INPUT OR OUTPUT ACTIVEB: CALL CKBFR ;CHECK READ ACCESS AND RELOCATE PROMPT BUFFER9 BCC 10$ ;IF CC, OK...GO STORE ADDRESS AND QUEUE REQUESTS: BR IOFIN ;CHECK FAILED...COMPLETE REQUEST WITH THE ERROR .ENDC ;T$$RPR- .SBTTL . QPRTT - READ WITH TERMINATOR TABLE-;A;+8; **-QPRTT - READ WITH TERMINATOR TABLE REQUEST (IO.RTT);-;RQPRTT::P? MOV #S2.IRQ,R4 ;READ W/TERMINATORS MUST BLOCK IF INPUT ACTIVE F; BIT #TF.PTT,I.FCN(R3) ;WANT TO USE PREVIOUSLY SPECIFIED TERM. TABLE?;; BNE CKBFLN ;IF NE, YES...DON'T BOTHER CHECKING PARAMETER 5 MOV I.PRM+10(R3),R0 ;GET ADDRESS OF TERMINATOR TABLEC4 MOV #32.,R1 ;LENGTH OF TABLE IS FIXED AT 32. BYTES; CALL CKBFRW ;CHECK READ ACCESS AND RELOCATE TABLE ADDRESSR8 BCS IOFIN ;IF CS, CHECK FAILED...RETURN WITH THE ERROR10$:< MOV R1,I.PRM+10(R3) ;SAVE FIRST WORD OF ADDRESS DOUBLE WORD= MOV R2,I.PRM+16(R3) ;SAVE SECOND WORD OF ADDRESS DOUBLE WORDN6 BR CKBFLN ;CHECK BUFFER LENGTH AND QUEUE THE REQUEST .DSABL LSBE% .SBTTL . QPRLB - READ LOGICAL BLOCK.;O;+); **-QPRLB - NORMAL READ REQUEST (IO.RLB)3;-;EQPRLB:: 6 MOV #S2.IRQ,R4 ;NORMAL READ MUST WAIT FOR ACTIVE READ6 BR CKBFLN ;CHECK BUFFER LENGTH AND QUEUE THE REQUEST.PAGEC .SBTTL . ERROR HANDLING;N,; EQPPRI - RETURN PRIVILEGE VIOLATION ERROR.;0EQPPRI:R; MOV #IE.PRI&377,R0 ;SET ERROR CODE FOR PRIVILEGE VIOLATIONR; BR IOFIN ;FINISH I/O REQUEST (NO NEED TO RESTORE MAPPING) ;F+; EQPBAD - RETURN ERROR FOR BAD PARAMETERS.T;EQPBAD::: MOV #IE.BAD&377,R0 ;SET ERROR FOR BAD PARAMETER SPECIFIED .IF DF A$$CHK5 BR EQPFIN ;FINISH REQUEST (REMAP DRIVER ON THE WAY)R; @; EQPSPC - RETURN ERROR BECAUSE OF INVALID BUFFER SPECIFICATION.;QEQPSPC:R? MOV #IE.SPC&377,R0 ;SET ERROR FOR ILLEGAL BUFFER SPECIFICATIONR8; BR EQPFIN ;RETURN THE ERROR (REMAP DRIVER ON THE WAY) .ENDC ;A$$CHKEQPFIN:: .IF DF T$$EIO* MOV $DALED,KISAR6 ;RESTORE DRIVER MAPPING .ENDC ;T$$EIOIOFIN::T# CLR R1 ;CLEAR SECOND WORD OF IOSBQ$ CALLR $IOFIN ;FINISH IO AND RETURN.PAGED00M{DATADATADATADATADATADATADATADATADATADATA, .SBTTL . CKBFLN - FINAL BUFFER LENGTH CHECK;F=; CKBFLN - CHECK THAT BUFFER LENGTH IS WITHIN (1,8K-64) BYTESR;RCKBFLN:E .IF DF A$$CHK3 MOV I.PRM+4(R3),R1 ;GET LENGTH OF TRANSFER REQUEST 4 BEQ EQPSPC ;IF EQ, RETURN ZERO BUFFER LENGTH ERROR6 CMP R1,#20000-100 ;IS BUFFER BIGGER THAN 8128. BYTES?5 BHI EQPBAD ;IF HI, BUFFER IS TOO BIG...RETURN ERROR, .ENDC ;A$$CHK< .SBTTL QUEUE - PLACE I/O REQUEST PACKET INTO TERMINAL QUEUE;W?; R4 NOW CONTAINS FLAGS TO BE USED BY THE ACCEPTANCE ROUTINE FOT>; GETTING PACKETS FROM THE QUEUE VIA $GSPKT. SAVE THE FLAGS IN; I.PRM+7 OF THE I/O PACKET.;4QUEUE::; ADD #U.TSTA,R5 ;POINT UCB POINTER TO THE FIRST STATUS WORDN .IF DF T$$ACD6 MOV #UA.ALL,U.AFLG-U.TSTA(R5) ;SET DEFAULT PROCESSING! MOV U.ACB-U.TSTA(R5),R0 ;GET ACBI BEQ 10$ ;THERE IS NONE - JUMPA' MOVB I.FCN+1(R3),R1 ;GET FUNCTION CODEO! ASL R1 ;CONVERT TO A WORD INDEXU1 CMPB R1,#30. ;FUNCTION CODE IN FIRST MASK WORD?W BLOS 5$ ;Y - JUMPL7 TST (R0)+ ;BUMP ACB POINTER TO CHECK SECOND MASK WORDA# SUB #32.,R1 ;REDUCE FUNCTION CODE E5$: BIT $BTMSK(R1),A.MAS(R0) ;IS THE ACD INTERESTED IN THIS FUNCTION?R BEQ 10$ ;N - JUMPT> MOV #A.ACCE,R0 ;Y - SET TO I/O REQUEST ACCEPTANCE ENTRY POINT CALL $SWACD ;CALL ACD 7 BIT #UA.ALL,U.AFLG-U.TSTA(R5) ;ALLOW THIS I/O REQUEST?  BNE 10$ ;Y - JUMPA* SUB #U.TSTA,R5 ;POINT TO BEGINNING OF UCB MOV U.ACB(R5),R0 ;GET ACB7 MOV A.IOS(R0),R0 ;GET I/O ERROR CODE TO RETURN TO TASKW BR IOFIN ;FINISH I/O10$: .ENDC ;T$$ACD. ASSUME ,0. MOVB R4,I.PRM+7(R3) ;SAVE FLAGS IN I/O PACKET% BNE 20$ ;PACKET CANNOT BE PROCESSEDI ;IMMEDIATELY - JUMPT .IF DF T$$GTS!T$$GMCT< CMPB #IO.HNG/256.,I.FCN+1(R3) ;IS THIS HANGUP OR GET CHAR.?& BEQ 15$ ;IF EQ, IT'S A HANG - BRANCH .IF DF T$$OVL0 MOV #PPSPC1,R1 ;GET ADDRESS OF ROUTINE IN TTEXT" CALLR MPEXT ;MAP IT AND CALL IT .IFF ;T$$OVLS# CALLR PPSPC1 ;PROCESS IMMEDIATELYO .ENDC ;T$$OVL15$: .ENDC ;T$$GTS!T$$GMC; .IF DF T$$OVL/ MOV #PPHNG,R1 ;GET ADDRESS OF ROUTINE IN TTEXTP" CALLR MPEXT ;MAP IT AND CALL IT .IFF ;T$$OVL " CALLR PPHNG ;PROCESS IMMEDIATELY .ENDC ;T$$OVL20$:C BICB #S2.SRQ!S2.BRQ,I.PRM+7(R3) ;CLEAR SRQ AND BRQ FLAGS IN PACKETR0 MOV U.SCB-U.TSTA(R5),R0 ;GET I/O QUEUE LISTHEAD MOV R3,R1 ;GET PACKET POINTERT CALL $QINSP ;INSERT PACKET; BIT #S2.SRQ,R4 ;SPECIAL FUNCTION (IO.ATT, IO.DET, IO.SMC)?R BEQ 30$ ;N - JUMPE) MOV #S2.SRQ,R4 ;Y - CLEAR ALL OTHER BITS$30$:- BISB R4,2(R5) ;SET FLAGS TO INDICATE WHAT WE  ;PUT IN THE QUEUET' ;NOTE - MUST BE DONE A F T E R WE ;PUT PACKET IN THE QUEUE!! .IF DF M$$PRO# MOV #FR.GRQ,R3 ;COME BACK AT FPGRQS# CALL SWCPU ;SWITCH TO CORRECT CPUN;R9; IF WE FALL THRU HERE, WE ARE ALREADY ON THE CORRECT CPU ;T .ENDC ;M$$PRO' CALL SETDSI ;DISABLE INPUT PROCESSING , FRKBIT BIS,#FR.GRQ ;POST "GET REQUEST" FORK. RETURN ;LET SETDSI DISPATCH IT. THAT'S WHAT ;IT GETS PAID FOR..PAGEB. .SBTTL . QPATT/QPDET - ATTACH/DETACH REQUESTS;H;+-; **-QPATT - ATTACH TERMINAL REQUEST (IO.ATT) -; **-QPDET - DETACH TERMINAL REQUEST (IO.DET)E;!K; ENTRY POINT "QPATT" PERFORMS UNSOLICITED INPUT AST ADDRESS ADJUSTMENT FORTM; SUPERVISOR MODE LIBRARIES (IF SUPPORTED) AND THEN FALLS THROUGH TO "QPDET".PL; FROM QPDET, CONTROL IS TRANSFERRED TO THE PACKET QUEUEING ROUTINE WITH THEB; DEQUEUE BLOCKING FLAGS SET TO CHECK FOR ACTIVE INPUT AND OUTPUT.;I ; INPUTS:,; R3 => I/O PACKET FOR ATTACH/DETACH REQUEST; R5 => UCB FOR THE TERMINAL;U ; OUTPUTS:; R3 => I/O PACKET TO BE QUEUEDE&; R4 = REQUEST DEQUEUE BLOCKING FLAGS;R"; REGISTERS MODIFIED: R0, R1, R2;-; QPATT::U .IF DF S$$LIB: BITB #TF.AST,I.FCN(R3) ;ATTACH FOR UNSOLICITED INPUT AST? BEQ QPDET ;IF EQ NO 0 MOV I.PRM(R3),R2 ;GET ALL CHARACTER AST ADDRESS) CALL $CALTA ;ADJUST FOR SUPER/USER MODEH" MOV R2,I.PRM(R3) ;AND PUT IT BACK. MOV I.PRM+4(R3),R2 ;GET CONTROL C AST ADDRESS) CALL $CALTA ;ADJUST FOR SUPER/USER MODER$ MOV R2,I.PRM+4(R3) ;AND P00U{UP D%B11110010UT IT BACK .ENDC ;S$$LIBQPDET:: B MOV #S2.IRQ!S2.ORQ!S2.SRQ,R4 ;BLOCK REQUEST IF EITHER INPUT OR...3 ; ...OUTPUT ACTIVE AND MARK AS SPECIAL FUNCTION% JMP QUEUE ;QUEUE UP THE REQUEST NOW3.PAGEC$ .SBTTL . QPSPC - "SPECIAL" REQUESTS; ;+=; **-QPSPC - HANDLE "SPECIAL" REQUESTS (IO.GTS/SF.GMC/SF.SMC) ;LG; THIS ROUTINE CHECKS PARAMETERS FOR THE "GET TERMINAL SUPPORT" AND THEVJ; "GET/SET MULTIPLE CHARACTERISTICS" FUNCTIONS. THE USER BUFFER FOR THESEI; REQUESTS MUST BE WORD-ALIGNED. THE IO.GTS AND SF.GMC FUNCTIONS WILL BE:L; PASSED TO "QUEUE" WITH NO DEQUEUE BLOCKING FLAGS SET. THIS ALLOWS THEM TOJ; BE PROCESSED SYNCHRONOUSLY (NEVER QUEUED). AN SF.SMC FUNCTION MUST WAITG; FOR ACTIVE INPUT AND OUTPUT REQUESTS TO FINISH BEFORE BEING DEQUEUED.S;- ; INPUTS:"; R3 => I/O PACKET FOR THE REQUEST; R5 => UCB FOR THE TERMINAL;A ; OUTPUTS:E; R3 => I/O PACKET TO BE QUEUED&; R4 = REQUEST DEQUEUE BLOCKING FLAGS;O"; REGISTERS MODIFIED: R0, R1, R2;-;M .IF DF T$$GTS!T$$GMC!T$$SMCQPSPC::  .IF DF R$$IIC * BIT #1,I.IOSB+4(R3) ;IS THIS INTERNAL I/O BNE 5$ ;IF NE YESS .ENDC ; R$$IICE) MOV I.PRM(R3),R0 ;GET ADDRESS OF BUFFER # MOV I.PRM+2(R3),R1 ;AND ITS LENGTHT0 MOV R1,I.PRM+4(R3) ;PUSH LENGHT DOWN ONE FIELD$ MOV #CKBFB,R2 ;ASSUME A WRITE CHECK5$:R .IF DF T$$GTS!T$$GMCC7 CLR R4 ;ASSUME REQUEST IS IO.GTS OR SF.GMC - IF SO... 3 ; ...IT IS PROCESSED SYNCHRONOUSLY (NOT QUEUED)O .ENDC ;T$$GTS!T$$GMC  .IF DF T$$GTSE CMP I.FCN(R3),#IO.GTS ;IO.GTS? ;GET TERMINAL DRIVER SUPPORT REQUEST?# .IF DF T$$GMC!T$$SMCN. BEQ 20$ ;IF EQ, YES...CHECK BUFFER ALIGNMENT .IFF ;T$$GMC!T$$SMC7 BNE EQPIFC ;IF NE, NO...RETURN ILLEGAL FUNCTION ERRORT .ENDC ;T$$GMC!T$$SMC; .ENDC ;T$$GTS .IF DF T$$GMC= CMP I.FCN(R3),#SF.GMC ;GET MULTIPLE CHARACTERISTICS REQUEST?R .IF DF T$$SMC. BEQ 20$ ;IF EQ, YES...CHECK BUFFER ALIGNMENT .IFF ;T$$SMCO7 BNE EQPIFC ;IF NE, NO...RETURN ILLEGAL FUNCTION ERROR$ .ENDC ;T$$SMC .ENDC ;T$$GMC .IF DF T$$SMC= CMP I.FCN(R3),#SF.SMC ;SET MULTIPLE CHARACTERISTICS REQUEST?I7 BNE EQPIFC ;IF NE, NO...RETURN ILLEGAL FUNCTION ERRORC) MOV I.TCB(R3),R2 ;GET ISSUING TASK'S TCBL, CMP T.UCB(R2),R5 ;IS THIS TERMINAL HIS TI:?( BEQ 10$ ;IF EQ, YES...REQUEST IS LEGAL/ BIT #T3.PRV,T.ST3(R2) ;IS THE TASK PRIVILEGED?Q BNE 10$ ;IF NE YES, OK5 JMP EQPPRI ;IF EQ, NO...CAN'T ALLOW USER TO DO THISF10$:C MOV #S2.IRQ!S2.ORQ!S2.SRQ,R4 ;SF.SMC MUST BLOCK IF INPUT OR OUTPUT.4 ; ...IS ACTIVE. ALSO FLAG AS "SPECIAL" FUNCTION& MOV #CKBFRW,R2 ;SET UP FOR READ CHECK .ENDC ;T$$SMC20$: .IF DF R$$IIC .* BIT #1,I.IOSB+4(R3) ;IS THIS INTERNAL I/O BNE 27$ ;IF NE YES .ENDC ; R$$IICU1 CALL (R2) ;ADDRESS CHECK BUFFER AND RELOCATE ITQ BCC 25$ ;IF CC, NO ERROR6 JMP IOFIN ;IF ERROR, FINISH UP WITH ERROR CODE IN R0-25$: MOV R1,I.PRM(R3) ;PUT BIAS IN I/O PACKETL' MOV R2,I.PRM+2(R3) ; AND DISPLACEMENTS27$: .IF DF A$$CHK* MOV I.PRM+2(R3),-(SP) ;GET BUFFER ADDRESS0 BIS I.PRM+4(R3),(SP) ;"OR" IN THE BUFFER LENGTH5 ROR (SP)+ ;IS EITHER THE ADDRESS OR THE LENGTH ODD?:/ BCC 30$ ;IF CC, BUFFER IS WORD-ALIGNED...SKIPI6 JMP EQPSPC ;RETURN ERROR FOR BUFFER NOT WORD-ALIGNED30$: .ENDC ;A$$CHK JMP QUEUE ;QUEUE REQUEST .ENDC ;T$$GTS!T$$GMC!T$$SMC;IM; EQPIFC - RETURN AN ERROR DUE TO ILLEGAL FUNCTION CODE OR INVALID MODIFIERS.B; # .IF DF T$$GTS!T$$GMC!T$$SMC!T$$EIOAEQPIFC::D MOV #IE.IFC&377,R0 ;SET ERROR FOR ILLEGAL FUNCTION CODE OR MODIFIER; JMP EQPFIN ;FINISH OFF THE REQUEST (RESTORE MAPPING ALSO)P# .ENDC ;T$$GTS!T$$GMC!T$$SMC!T$$EIOH.PAGEB .PSECT MAP5 .SBTTL . QPHNG - HANGUP REQUEST;E;+$; **-QPHNG - HANGUP REQUEST (IO.HNG);NH; THIS ROUTINE CHECKS AN IO.HNG REQUEST. A NON-PRIVILEGED TASK CAN HANGK; UP ONLY ITS "TI:" LINE. PRIVILEGED TASKS CAN HANG UP ANY LINE. A HANGUP L; REQUEST, LIKE AN IO.WBT OR GET CHARACTERISTICS, BREAKS THROUGH THE QUEUE. ;M ; INPUTS:"; R3 => I/O PACKET FOR THE REQUEST; R5 => UCB FOR THE TERMIN00]{{b{TADATADATADATADATADATADATADATADATAAL;; ; OUTPUTS:E; R3 => I/O PACKET TO BE QUEUED&; R4 = REQUEST DEQUEUE BLOCKING FLAGS;P; REGISTERS MODIFIED: R0;-;NQPHNG::P" CALL PREQUE ;SET UP FOR QUEUEING" CLR R4 ;IO.HNG WAITS FOR NOTHING JMP QUEUE ;QUEUE THE REQUEST .IF DF T$$LTH< .SBTTL . QPORG - INITIATE A CONNECTION TO A TERMINAL SERVER; ;+'; **-QPORG - ORIGINATE REQUEST (IO.ORG)B;R*; THIS ROUTINE CHECKS AN IO.ORG REQUEST. ; ; INPUTS:"; R3 => I/O PACKET FOR THE REQUEST; R5 => UCB FOR THE TERMINAL;L ; OUTPUTS:U; R3 => I/O PACKET TO BE QUEUEDE&; R4 = REQUEST DEQUEUE BLOCKING FLAGS;S; REGISTERS MODIFIED: R0;-;-QPORG::N" CALL PREQUE ;SET UP FOR QUEUEING> MOV #S2.IRQ!S2.ORQ,R4 ;ORIGINATE MUST WAIT FOR READ AND WRITE JMP QUEUE ;QUEUE THE REQUEST .ENDC ;T$$LTHPREQUE:N) MOV I.TCB(R3),R0 ;GET ISSUING TASK'S TCBQ, CMP T.UCB(R0),R5 ;IS THIS TERMINAL HIS TI:?* BEQ J2QUE ;IF EQ, YES...ALLOW THE HANGUP/ BIT #T3.PRV,T.ST3(R0) ;IS THE TASK PRIVILEGED?5: BEQ J2EQPR ;IF EQ, NO...RETURN PRIVILEGE VIOLATION ERRORJ2QUE: .IF DF M$$PRO" MOV U.SCB(R5),R4 ;GET SCB ADDRESS/ BIT S.URM(R4),@$CPURM ;ALREADY ON CORRECT CPU?L' BEQ 5$ ;IF EQ NO, FORK TO CORRECT CPUI .IFTF ; DF M$$PRO RETURN  .IFT ; DF M$$PROJ=; CONVERT PARAMETER LIST PART OF I/O PACKET INTO A FORK BLOCKI>; (AND THE RETURN ADDRESS) FOR INTERPROCESSOR FORK. SINCE THIS@; IS A SUBROUTINE, WE MUST REMEMBER CALLER ADDRESS IN FORK BLOCK*; OR THE INTERPROCESSOR FORK DOES NOTHING.;;5$: ADD #I.PRM+14,R3 ;POINT PAST KISAR5 FIELD IN FORK BLOCK2( MOV (SP)+,(R3) ;REMEMBER RETURN ADDRESS: MOV KINAR5,-(R3) ;INSERT DRIVER I MAPPING IN KISAR5 FIELD# CLR -(R3) ;CLEAR R4 IN FORK BLOCKO7 MOV S.URM(R4),-10(R3) ;SET URM OF DEVICE IN FORK BLOCKF. MOV R3,R4 ;POINT R4 AT FORK BLOCK FOR $FORK1$ CALL $FORK1 ;SWITCH TO CORRECT CPU7 SUB #I.PRM+4,R3 ;POINT BACK TO BEGINNING OF FORK BLOCKS CALL MAPD ;RE-MAP DRIVER/ JMP @I.PRM+14(R3) ;DISPATCH TO ORIGINAL CALLERR .ENDC ; DF M$$PROJ2EQPR:$) TST (SP)+ ;POP RETURN ADDRESS OFF STACK . JMP EQPPRI ;RETURN PRIVILEGE VIOLATION ERROR .END MOV KINAR5,-(R3) ;INSERT DRIVER I MAPPING IN KISAR5 FIELD# CLR -(R3) ;CLEAR R4 IN FORK BLOCKO7 MOV S.URM(R4),-10(R3) ;SET URM OF DEVICE IN FORK BLOCKF. MOV R3,R4 ;POINT R4 AT FORK BLOCK FOR $FORK1$ CALL $FORK1 ;SWITCH TO CORRECT CPU7 SUB #I.PRM+4,R3 ;POINT BACK TO BEGINNING OF FORK BLOCKS CALL MAPD ;RE-MAP DRIVER/ JMP @I.PRM+14(R3) ;DISPATCH TO ORIGINAL CALLERR .ENDC ; DF M$$PROJ2EQPR:$) TST (SP)+ ;POP R .TITLE TTJZ .IDENT /05.02/O;T6; COPYRIGHT (c) 1983 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;-<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;Y;M; 27-JAN-78 PETER WANNHEDEN ;O; PREVIOUSLY MODIFIED BY:N;T; P. WANNHEDEN ; C. F. SPITZR; D. R. DONCHIND;B; MODIFICATIONS:;I; D. R. DONCHIN 14-SEP-83 05.01E ; DD179 -- ADD HOSTSYNC SUPPORT; ; S. C. ADAMS 23-APR-84 05.02!8; SA170 -- CHANGE S4.HPC TO S5.HPC AND S1.CTS TO S2.CTS; ; ;+2; COMMON ROUTINES FOR DJ-11 AND DZ-11 CONTROLLERS.;-;; H .IF DF D$$J11!D$$Z11D D .MCALL UCBDF$, SCBDF$;D UCBDF$ ;DEFINE UCB SYMBOLSE SCBDF$ ;DEFINE SCB SYMBOLS. .PSECT MAP5;7;E;+; YJSTAX/YZSTAX - START OUTPUT.F; ; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; U.TOP+2 BUFFER ADDRESSI; U.TOC BYTE COUNT ; S1.CTO 0 ;-;C;P .ENABL LSB.; YJSTAX::PYZSTAX::BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;ANY HIGH PRIORITY CHARACTERS TO OUTPUT?3 BNE YZRESX ;;;Y - DO IT REGARDLESS OF XOFF STATUS ASSUME S2.CTS,100000( TST 2(R5) ;;;OUTPUT STOPPED BY CTRL-S? BMI 10$ ;;;Y - IGNORE ;B;E;+ ; YJRESX/YZRESX - RESUME OUTPUT.;C; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S2.CTS 0 ;-;D;RYJRESX:::YZRESX::BIS $BTMSK(R2),4(R3) ;;;ENABLE TRANSMIT INTERRUPTS% ;;;THE FIRST INTERRUPT WILL START. ;;;(OR RESUME) OUTPUT.10$: RETURN ;;;.00{e{i{ D%B11110010;5;T;+A; JZOUT - COMMON OUTPUT INTERRUPT PROCESSING FOR DJ-11 AND DZ-11. ;I; INPUT:-; 2(SP) POINTER TO CONTROLLER REGISTER (BYTE)T5; THAT CONTAINS INTERRUPTING LINE NUMBER IN BITS 0-3-; R3 CSR ADDRESS; R4 KRB ADDRESS (RSX-11M+)O"; R4 ADDRESS OF UCB LIST (RSX-11M); ; OUTPUT:R9; FIRST, ALL LINES THAT REQUIRE OUTPUT WORK ARE SERVICED.J=; NEXT, IF ANY LINE REQUIRES INPUT WORK, THE SILO IS EMPTIED.P>; IF AT THAT TIME OUTPUT WORK IS AGAIN REQUIRED (THERE WILL BE6; IF THERE WAS ANY INPUT THAT REQUIRES ECHO), THE LOOP'; LOOKING FOR OUTPUT WORK IS REENTERED.D@; ON RETURN, ALL OUTPUT AND INPUT WORK THAT CAN BE DONE IS DONE.;T; REGISTERS ALTERED: R2,R5;-;E;M6JZOUT:: MOVB @2(SP),R5 ;;;GET INTERRUPTING LINE NUMBER6 CALL MUXUCB ;;;CHECK LINE NUMBER AND GET UCB ADDRESS1 MOV $BTMSK(R2),R2 ;;;GET BITMASK FOR XMIT ENABLER BCS 30$ ;;;BAD LINE - JUMP  .IF DF R$$MPL ,! MOV R4,-(SP) ;;;SAVE KRB POINTERT6 CALL OUTISR ;;;DO COMMON OUTPUT INTERRUPT PROCESSING$ MOV (SP)+,R4 ;;;RESTORE KRB POINTER# MOV @R4,R3 ;;;RESTORE CSR POINTERR S .IFF ;R$$MPL  R MOV R3,-(SP) ;;;SAVE CSR ) MOV R4,-(SP) ;;;SAVE ADDRESS OF UCB LISTT6 CALL OUTISR ;;;DO COMMON OUTPUT INTERRUPT PROCESSING, MOV (SP)+,R4 ;;;RESTORE ADDRESS OF UCB LIST$ MOV (SP)+,R3 ;;;RESTORE CSR ADDRESS  .ENDC ;R$$MPL ;20$: TST @R3 ;;;XMIT READY? BMI JZOUT ;;;Y - LOOP ;PA; NO MORE LINES REQUIRE OUTPUT WORK. SEE IF ANY INPUT WORK TO DO. ;I* MOV 2(R3),R5 ;;;GET A CHARACTER FROM SILO BPL 10$ ;;;NONE - EXIT- CALL MUXIN1 ;;;OK - PROCESS INPUT CHARACTERE& ;;;MUXIN1 RETURNS TO OUR CALLER IF ;;;NO OUTPUT WORK TO DO & BR JZOUT ;;;OUTPUT WORK TO DO - LOOP; >; OUTPUT INTERRUPT OCCURRED ON A LINE THAT WE DON'T RECOGNIZE.:; I DON'T KNOW HOW IT GOT HERE BUT LET'S TRY TO PREVENT IT; FROM HAPPENING AGAIN.;:.30$: BIC R2,4(R3) ;;;DISABLE XMIT ON THAT LINE BR 20$ ;;;; .DSABL LSB  P .ENDC ;D$$J11!D$$Z11U O;T;O .END MOV 2(R3),R5 ;;;GET A CHARACTER FROM SILO BPL 10$ ;;;NONE .TITLE TTLH .IDENT /03.0/;; Authors: BEN LEVIN 14-JUN-84; Tony Lekas;; X02.04 4-Feb-85 GDS%; Raise priority before calling TTSET;; X02.05 5-Feb-85 GDS); Raise priority before calling FORK also;; X02.06 7-Feb-85 GDS;; Create new routine for fork calls - use S.KRB+22 for flag9; to call new entry in TTSET called TTSET1 which will put3; the terminal driver fork block on the fork queue.;; X02.07 7-Feb-85 GDS; Make fork routine work!!!; No longer need S.KRB+22;I; X02.08 8-Feb-85 GDS/!; Raise priority for call to ODON4; ; X02.09 20-Feb-85 GDS5; Raise priority before calling ICHAR1,MANS, and MHUP; ; X02.10 27-Feb-85 GDS+; Must save R4 and R5 before calling TTSET1.?; Don't stop taking input into type ahead buffer after receive +; stopped stateo;l; X02.11 16-Apr-85 GDSC; Don't bother to check S2.CTS before filling slots. Servers shouldeC; be using credits to control data flow, and we don't always see anl"; XON. This will cause us to hang!*; (S2.CTS will be cleared at LHSTOX entry);4D; Allow optional parameter of terminal number requested to be passedA; on start session. A value of zero means next available terminal ; may be assigned.;g; X02.12 19-Apr-85G; Change LHLPAR routine to not create a Data_b slot if nothing is being; changed ( R1 =0)/; Reduce size of LHLPAR routine and remove BPT.r;i; X02.13 22-Apr-85E; Include fix to $LHOUT routine to check for Data_B slots in transmits; list. ;.; X02.14 19-FEB-86 EMcI; Easiest fix for LAT/CTERM bug. Instead of toggling TT's online/offlinemH; when we're using them toggle the US.DSB bit (enable read/write). ThisD; way we'll get our IO.HNG when a user DIS SESS ALL from the server.;2; X02.15 21-MAR-86 EMc.; Do not return error on CON ONLINE for units.;i; X02.16 21-MAR-86 EMc(; Set US.DSB bit at CON ONL entry point.;o!; X02.17 18-MAR-86 S. R. Cloutier &; Add error codes for LAT V5.1 SupportC; Fix unit select algorithim in $LHSTS to look for00m{b{TADATADATADATADATADATADATADATADATA unit # correctly ?; Add code to return proper error code if error occurs on startf;n ; X02.18 1-APR-86 S. R. Cloutier;; Do not allow start session if NCT has terminal attached. u;O ; X02.19 8-MAY-86 S. R. Cloutier8; Reset terminal on disconnect, if application termional;o!; X02.20 19-JUN-86 S. R. Cloutier0:; Streamline calling sequence to LAT process in initiating+; connection from LAT application terminal.d;r9; Add $LHGTD entry point for starting output to Implicit m-; connections for Lat Application Terminals.. ;e!; X02.21 23-JUN-86 S. R. Cloutiero:; Add LHDET routine called from TTATT upon DET function to8; check if terminal session (application only) should be; disconnected upon detach. ;u; X02.22 25-JUN-86 Dale Donchine:; fix PRNTO to calculate available buffer space correctly!; Fix CLEAN to clear UL.NOD ;q!; X02.23 26-JUN-86 S. R. Cloutier;; Use high 4 bits of U.CREN as Link Status extension, sinceD"; credits can only be 4 bits long.;l; ; X02.24 7-JUL-86 S. R. Cloutier; ?; Make changes to support LE.HIP (Hangup in progress) Sub-state 8; to prevent loss of data during IO.HNG operations, with*; data still to be sent to terminal server;!; X02.25 23-JUL-86 S. R. Cloutier ;.+; Change PRNTO to do nothing if U.TOC is 0.l;a!; X02.26 31-JUL-86 S. R. Cloutier!; >; Add more Process Request codes for lat application terminals;!; X02.27 31-JUL-86 S. R. Cloutier ;t6; Add $LHTMO - Implicit connection timed out or error.;l ; X02.28 1-AUG-86 S. R. Cloutier;r+; Fix $LHSTP to not corrupt location 0 !!!!p; ; X02.29 4-AUG-86 S. R. Cloutier;sD; Change HLMTIM to call LAT process to mark a session for disconnect; during H.I.P. State0; Make LTPRC entry point global.; ; X0230 20-NOV-86 K. L. Noel.; A; KLN026 -- Make sure LAT lines which are still logged in are note ; given away;f ; X0231 1-APR-87 S. R. Cloutier;0C; SRC -- Add code to start LAT output on a LAT Application Terminaln8; if output is Non-task in nature (such as a FLF or ^Z);r"; X0232 18-MAY-87 S. R. Cloutier;0A; SRC -- do not start session in $LHSTS if terminal is a reservedo; LAT Application Terminale;o>; Don't hang up terminal on 2nd IO.HNG, let lat process finish; output or time out.  -; V3.0 8-MAR-89 SCA496 ,; Change signed branch in FNDUCB to unsigned;g;i7; Controller-Dependent routine for LH Device (LAT HOST)u;rF; LH devices are considered to be remote terminals, connected through F; the LAT-multiplexer and are always setup in the data base as remote ; terminals.;.; LH port data base structure:F; LH port belongs to a 'TT' device and has its own DCB (Generic device; name is 'TT')./; LH port data base has one contigious SCB/KRB.s@; LH controller has a CTB, linked to CTB list ($CTLST) and has a2; generic controller name (L.NAM) 'LH' (LAT host).;o; Calls:; From port to process:e0; The SCB/KRB block will contain two words with8; LAT process bias/virtual address. $MPPRO routine will; map and call it.s; From process to port:s9; The first address in the driver dispatch table for the:; LH controller will be used by LCP to set up the calling#; information for the LAT process.r;a .IF DF T$$LTH;o; UCB Extentions for LH devices ; -----------------------------) ; Status/control information; U.LINS ; Link status2; U.CREN ; Transmit credits counter (low 4 bits)3 ; Link Status Extension (High 4 bits of U.CREN)e# ; Server/circuit identificationn; U.SRVN ; Server number; U.SESN ; Session numberT ; Parametrs on receive datas; U.RSBB ; Receive slot bias(; U.RBHA ; Receive slot header virtual!; U.RSDV ; Receive data virtualo# ; XMT intermediate buffer chain !; U.TRLH ; XMT listhead address-); U.TRSC ; XMT remained bytes in buffern%; U.SLSZ ; Maximum slot size on XMTt ; Virtual circuit CCBr#; U.CCBA ; CCB address (low core)S; &; Link Status Word U.LINS word in UCB; ----------------;#########################;modify UCBDF for these #00u{i{ D%B11110010; UL.TRS=1 ; 1-XMT stopped, 0-Notn# ; >255 Char. for slot. Hold it.e&; UL.TDA=2 ; 1-XMT data avail, 0-Not% ; Data in XMT queue (set by port)i, UL.XON=4 ; 1-Notify the process of an XON) ; 0-Notify the process of output dataC'; UL.RDA=10 ; 1-RCV data avail, 0-NotZ% ; Data in RCV queue (set by proc)i/ UL.NTO=20 ; 1-Non task output pending, o-Not 4 UL.NOD=40 ; 1-ODONE call defered because too much ; data was buffered, 0 - Not%; UL.RSS=100 ; 1-RCV stopped, 0-NotL% ; RCV stopped by TTDRV on receive  ; if no resources available%; UL.LEN=200 ; 1-Link enable, 0-Not % ; toggled by start/stop link call;.4; Link Statue Extension bits (High 4 bits of U.CREN);t!;LE.HIP=20 ; hangup in progressR) ; set if LHMTIM is called by terminala& ; driver before all available data ; has been sent to server., ; subsequent I/O will not complete until, ; data has been sent, and bit is cleared ;t&;LE.TDC=40 ; Transmit data completed' ; Bit set during .HIP when the data  ; has all been transmitted. ;L&;LE.CIP=100 ; Connection in progress- ; Bit set when a connection to a terminalS* ; server is pending. Set after output3 ; has been attempted to a Lat Application Term,f/ ; but no connection has been established tor- ; the terminal server associated with ther ; terminal.q ;O5LE.ORG=200 ; Bit set by $LHSTS if connection result % ; of IO.ORG (Explicit connection)T ; ;a;m ; Error Codesi ; -----------IE; NOTE: Do not change there codes without checking LAT process module >; LATPRT. Some of there codes are common to both, and are not;; globaly defined. Adding a code will not cause a problem. ER$SUC=0 ; Sucess #ER$MLE=-1 ; Maximum links exeededc"ER$IDN=-2 ; Incorrect identifyer#ER$SYN=-3 ; Synchronization errorw&ER$UDC=-4 ; Undefined operation code(ER$NDR=-5 ; No data ready for transmit%ER$LND=-6 ; LH data base not loadedn#ER$NRR=-7 ; No receive data readye#ER$OVR=-10 ; Data overrun occuredaER$SIU=-11 ; Service In Useg ER$PNU=-12 ; Port Name Unknown"ER$SNO=-13 ; Service Not offered;a&; Process-to-Port Call Operation Codes&; ------------------------------------PR$STS=0 ; Start sessionPR$RCV=2 ; ReceivePR$XMT=4 ; TransmitoPR$DSC=6 ; Stop session 1PR$GTD=10 ; Get transmit data for app. terminal ;PR$TMO=12 ; Connect request timed out in implicit connectL;-!; Port-to-Process Operation CodesN!; -------------------------------R)PO$DSC=0 ; Stop session ("BYE" by task)-(;PO$FLO=2 ; Flow control status change;PO$HST=2 ; Host sync toggledr#;PO$TST=4 ; Terminal sync toggeldrPO$XON=6 ; XON+;PO$XOF=10 ; XOFF (possible data overrun)PO$ABO=12 ; Abort outputPO$OUT=14 ; Start output,PO$MSD==16 ; Mark a session for disconnect<PO$CNT=20 ; initiate implicit connection from terminal ser-PO$ORG==22 ; ininate connection from IO.ORGcPO$GQD==24 ; Get QUEUE depth)PO$MAP==26 ; Set/Get Mapping parameters-;; LAT Message Header Offsets; --------------------------SL$SID=1 ; Slot identSL$SBC=2 ; Slot byte countSL$TYP=3 ; Slot typeSL$SDS=4 ; Slot data start;; Buffer type codesp; -----------------4BF$NOR=0 ; Normal data. Includes non task output."BF$RPR=1 ; IO.RPR Prompt string.&BF$FLO=2 ; Flow control information.; "; Maximum number of queued buffers"; --------------------------------;cMAXBUF=4;;;+++;E# .MCALL DCBDF$,UCBDF$,CTBDF$,SCBDF$g .MCALL UCBDF$,CCBDF$  DCBDF$ ; Define DCB UCBDF$ ,,TTDEF ; Define UCBS CTBDF$ ; Define CTB SCBDF$ ; Define SCB CCBDF$ ; Define CCB .PSECT MAP6; ;; $LHGTD - Get transmit data from task, and start output. A; this is called by LAT process upon terminal server establishingII; connection to Lat Application Terminal during an IMPLICIT connection.uC; Completion of I/O is delayed until connection is established andA; must be re-started..;C!; Inputs: R5 - pointer to U.T00}{b{TADATADATADATADATADATADATADATADATASTA.;L$$LHGTD::MOV R1,R5 ; Point to U.TSTA CALL MUCBX ; Map the UCBXn TST U.TCO(R4) ; Task output?4 BNE LHSTAX ; if so, fall through to start output." TSTB U.TOC(R4) ; Non-Task output?% BNE LHSTAX ; if NE, yes - go do it.- RETURN ; Else return - could be bad call.. ;v;e#; LHSTAX - Start Output Entry Pointp;c; Input:?; Registers R2-R5 are standard for controller-dependent routinea; ; R2 - Phisical unit number * 2n$; (only if multiplexers in system); ); R3 - CSR address (unused for LH device)1; R4 - UCBX addressA; R5 - Pointer to U.TSTA;n;T;ULHSTAX::2 CLRB U.TOTI(R4) ; LAT process deals with timers MOV R1,-(SP) ; Save R1O MOV R2,-(SP) ; Save R2B;L: BIT #S6.LAT,U.TST6-U.TSTA(R5) ; Lat Application Terminal?( BEQ 7$ ; if EQ - no, normal output../ BITB #UL.LEN,U.LINS-U.TSTA(R5) ; link Enabled?r$ BNE 7$ ; If NE - Yes, continue..;dI; here, we have output, but no link is enabled on an application terminalrD; We must call the LAT process, and try to establish the connection.; = BISB #LE.CIP,U.CREN-U.TSTA(R5) ; Show connection in progress = BISB #US.DSB,U.STS-U.TSTA(R5) ; Toggle read/write so no more " ; I/O is possible to this TT" ; until connection completes' MOV #PO$CNT,R3 ; show connect reason;# CALL LTPRC ; call LAT process..U# MOV (SP)+,R2 ; Restore Registersd MOV (SP)+,R1 ; And- RETURN ; Return7$: ;h ; Buffer chain in U.TFOB" ; Check high priority output6 BIT #S5.HPC,U.TST5-U.TSTA(R5) ; High priority output? BEQ OUTPUT ; Branch if not$ ; XON or XOF bits set. Let lat& ; know and exit (no odone call!)0 BIT #S5.XOF,U.TST5-U.TSTA(R5) ; Output an XOFF? BEQ 10$ ; Branch if not 3 BIC #S5.XOF,U.TST5-U.TSTA(R5) ; Yes-clear XOFF bitt5 BISB #UL.RSS,U.LINS-U.TSTA(R5) ; RCV-STOPPED on linkP BR IODON ; All done for nowV;P; Not XOFF, must be XON ; 210$: BIC #S5.XON,U.TST5-U.TSTA(R5) ; Clear XON bit5 BICB #UL.RSS,U.LINS-U.TSTA(R5) ; RCV-STOPPED cleared-5 BISB #UL.XON,U.LINS-U.TSTA(R5) ; Set reason for forka$ BR DOFORK ; Jump to call process.OUTPUT: ; Continue normal priority output8 BICB #UL.XON,U.LINS-U.TSTA(R5) ; Settup reason for fork TST U.TCO(R4) ; Task output?5& BNE 5$ ; If NE yes - go process it( CALL PRNTO ; Process non task output BR DOFORK ; And exit5$:A8 MOV U.TRLH-U.TSTA(R5),R1 ; R1-XMT buffers chain starts- BEQ 30$ ; Branch if there is no XMT chainB)10$: TST (R1) ; There is an XMT chain-  BEQ 20$ ; Find end of  MOV (R1),R1 ; XMTs BR 10$ ; Chain820$: MOV U.TFOB(R4),(R1) ; Link new chain to XMT chain& BR 50$ ; And go to stamp new chainD30$: MOV U.TFOB(R4),U.TRLH-U.TSTA(R5) ; No XMT chain-create it (link! ; new buffers to xmt chain)r" ; Stamp all new chain with 0 ; In the left byte of then$ ; Second word-don't deallocate ; this buffer in LHOUT750$: MOV U.TFOB(R4),R1 ; R1-first buffer in new chain:0 MOV #BF$RPR,R3 ; Assume that this is a prompt> BIT #S5.RPO,U.TST5-U.TSTA(R5) ; Is prompt output in progress? BNE 60$ ; If NE yes - go on  ASSUME BF$NOR,0" CLR R3 ; This is normal output) CLR U.TFOB(R4) ; Take the buffers from  ; the class driver*60$: MOVB R3,3(R1) ; Set the buffer type TST (R1) ; Last buffer?h+ BEQ 100$ ; If 0-YES, chain done, branch ( MOV (R1),R1 ; If not-get next buffer BR 60$ ; And repeate&100$: CLR U.TOP(R4) ; First buffer=0$ CLR U.TOC(R4) ; Remaining bytes=04 BISB #UL.TDA,U.LINS-U.TSTA(R5) ; Set XMT-DATA-AVAILDOFORK:t# CALL PRIFRK ; Do priority fork f!IODON: MOV (SP)+,R2 ; Registers MOV (SP)+,R1 ; Andr% MTPS #TTPRI ; Raise to priority 5e' SAVNR ; Save and restore R4 and R5) CALL TTSET1 ; Go put TT fork block one ; fork queue if needed MTPS #0 ; Back to zero RETURN, a; ?; Called by terminal driver on IO.KILL. All data in XMT buffersa:; will be lost. LAT processor will be called to cancel all*; pending transmit and receive operations.00{i{ D%B11110010; LHABOX::% CALL CLEAN ; Clean up the buffersF& MOV #PO$ABO,R3 ; Param-abort output! CALL LTPRC ; Call LAT processR RETURNr;M ;P4; Terminal driver calls to do a time-out processing.?; This entry point will be called on IO.HNG or "BYE" command to -; disconnect link and logoff remote terminal. ;oB; If and transmit data is still outstanding, the session is markedD; for hangup (HIP) in the status extension. The LAT process is thenD; called to mark the session block disconnect in progress (DIP), theD; IO.HNG or IO.DET I/O packet is saved and a return is executed back.; to PPHNG in TTATT, which calls this routine.B; The terminal is disabled from receiving any new data I/O packets; (US.DSB set).i;wE; Once all the transmit data has been sent to the server, the sessionoD; block is cleaned up, the session is disonnected, and the IO.HNG or%; IO.DET is finished ($IOFIN called).I; C; If this routine is called a 2nd time, for any reason, the sessione!; is unconditionaly disconnected.s;D;,; INPUTS: IF DF T$$OVL; R5 - U.TSTA of terminalr;r); 6(SP) = IRP Address of IO.HNG or IO.DETi; 4(SP) = Return PC in PPHNG; 2(SP) = KINAR5 or TTATTe; (SP) = Return PC in MPROT;; .IF NDF T$$OVL; R5 - U.TSTA of terminal ;a); 2(SP) = IRP Address of IO.HNG or IO.DET; (SP) = Return PC in TTATT;nLHMTIM::? BITB #UL.TDA,U.LINS-U.TSTA(R5) ; is there transmit data avail?' BEQ 5$ ; if EQ - no, hang up line..e5 BITB #LE.HIP,U.CREN-U.TSTA(R5) ; Hangup In progress?c% BNE 5$ ; if NE - yes, hang it up!O9 BISB #LE.HIP,U.CREN-U.TSTA(R5) ; show hangup in progressf2 BISB #US.DSB,U.STS-U.TSTA(R5) ; Toggle read/write .IF DF T$$OVL% MOV 6(SP),R0 ; Recover IRP address! CLR 6(SP) ; Clear IRP addresst .IFF ;T$$OVL % MOV 2(SP),R0 ; Recover IRP address ! CLR 2(SP) ; Clear IRP addressT .ENDC ;T$$OVL2 MOV #PO$MSD,R3 ; Function - Mark SES disconnect( CALL LTPRC ; Call LAT process direct% TST R0 ; Did LAT take I/O packet?p) BEQ 20$ ; if EQ, yes - Let LAT try toa" ; send remaining data before ; hanging up linep .IF DF T$$OVL% MOV R0,6(SP) ; Recover IRP addressi .IFF ;T$$OVLO% MOV R0,2(SP) ; Recover IRP addresss .ENDC ;T$$OVL: BICB #LE.HIP,U.CREN-U.TSTA(R5) ; Clear Hangup in Progress;o45$: MOV #PO$DSC,R3 ; Function code-disconnect line7$: MOV R1,-(SP) ; Save R12 BICB #17,U.CREN-U.TSTA(R5) ; Clear credits field( CALL LTPRC ; Call LAT process direct) MOV R5,R1 ; R1-UCB address for $LHSTP * CALL $LHSTP ; Stop line-will call MHUP ; And clear the line? BIT #S6.LAT,U.TST6-U.TSTA(R5) ; Is this a Lat Application TermR! BEQ 10$ ; if not, just returnV# MOV #-1,R3 ; Set up R3 for call" CALL LHST1 ; Reset terminal...&10$: MOV (SP)+,R1 ; Restore register 20$: RETURNP;,E; Line parameters have changed. Only flow control change informationCD; is processed for now. A buffer will be allocated and the info put; in it.;iLHLPAR:: MOV R1,-(SP)U* BEQ 40$ ; If EQ, Nothing being changed MOV R0,-(SP)l MOV R2,-(SP) & CALL ALTB ; Allocate T$$BFL buffer- BCS 30$ ; If CS, No buffer - report errorB! ; Link word cleared in ALTBM$ MOVB #BF$FLO,3(R2) ; Set the type, MOVB R1,4(R2) ; Fill in the control flags+ MOV U.SCB-U.TSTA(R5),R0 ; Get SCB address,7 MOVB S.KRB+6(R0),2(R2) ; Fill in the Data_b slot sizeg/ MOV R5,R0 ; Compute address of buffer chaini ADD #U.TRLH-U.TSTA,R0 ; ...t10$:+ TST (R0) ; Any link? (Also clear carry) ' BEQ 20$ ; If EQ, End of chain found,* MOV (R0),R0 ; Get next buffer in chain) BR 10$ ; Loop till end of chain found 20$:" MOV R2,(R0) ; New end of chain30$:# MOV (SP)+,R2 ; Restore registerse MOV (SP)+,R0 ; ...R40$: MOV (SP)+,R1 ; ...a RETURN ; Return;07; If CON ONL set the write disabled bit and let it rip.t>; If CON OFF return an error so nobody can muck with our TT's.;hLHUONL::: BISB #US.DSB,U.STS-U.TSTA(R5) ; disable read/writes on TT RETURNrLHUOFF::4 MOVB 00{b{TADATADATADATADATADATADATADATADATA#IE.DNR,$SCERR ; Return error code in $SCERR RETURN LHSTOX::= BIC #S2.CTS,-U.TSTA(R5) ; We can't be XOFFed from M ; a serverLHCOFF::LHCONL::LHCPUP::LHUPUP::LHPWUP::LHRESX:: RETURN ; And exit :PRIFRK:P MOV R4,-(SP) ; Save R4 ) MOV #FR.LAT,R3 ; LAT fork mask bit setd% MTPS #TTPRI ; Raise to priority 5O- CALL FORK ; Queue fork block (R4 altered)T MTPS #0 ; Back to zero MOV (SP)+,R4 ; Restore R4 RETURNr s; M; Data message received from server. Each UCB contains bias/virtual address RI; of a slot header for that link. The slot header contains the slot datar ; size byte.;eL; Look through UCB chain and send to TTDRV all slots where the "receive data; available" bit is set. M;RG; If a slot is done, then the data counter in the slot header will be 0TO; and the C.STS word in the CCB (number of slots in buffer) will be decrementedM; by 1. ;aF; If "RCV-STOPPED" state is set (TTDRV back-offed with XOFF because ofF; resources allocation failure) data will not be copied from the slot.+; Check RSV-STOPPED on entry and after eachr>; return from ttdrv when outputting a character (ICHAR1 call).G; In this case data slot counter will contain number of characters lefttE; in slot, and U.RSDV will contain address (virtual) of the next byteh+; to output. C.STS will not be decremented. ; ; Note:fH; UL.RDA bit is set by lat process only for lines, that have information"; available for current operation.; ; Input:; None ; Output:a ; R3-status: 0-success, <0-error; R1,R2-Destroyed; Other registers - preservedd; Usage:%; R5 - U.TSTA address of current UCB ; R2 - LH'S DCB address.; $LHINP:: CLR R3 ; Assume successt CLR R2 ; First entry in DCB &10$: CALL FNDUCB ; Find next LH UCB TST R5 ; Next UCB found? BNE 20$ ; Branch if yese ; No more UCBS RETURN ; And exit(20$: ; R5-next (first) UCB'S U.TSTA. BITB #UL.LEN,U.LINS-U.TSTA(R5) ; Link enable? BEQ 10$ ; No-get next UCBt9 BITB #UL.RDA,U.LINS-U.TSTA(R5) ; Receive data available?  BEQ 10$ ; No-get next UCB ;gC; The following code can be used when the LAT architecture providesF; a way to send the XOFF charcter to stop the server from sending moreF; data. Meanwhile, the LAT Process tests this bit, and will not extendE; any more credits to the server until it is cleared. Note - there isn?; still room in the typeahead buffer for a few more characters!,;I<; BITB #UL.RSS,U.LINS-U.TSTA(R5) ; RCV-STOPPED on that link?; BEQ 25$ ; No-copy slot5; BR 10$ ; And get next UCB'25$: ; UCB found-prepare copy slotl" MOV R2,-(SP) ; Save DCB address6 MOV U.RBHA-U.TSTA(R5),R1 ; R1-slot header V.A. start2 ADD #SL$SBC,R1 ; R1-slot size byte virtual addr& MOV R1,R4 ; Save it (needed later)+ MOV #-1,R2 ; R2<0 (get char. operation) - CALL GCHR ; Returns R2-slot size on right  CLR R0 ; Prepeare R0 BISB R2,R0 ; R0-slot sizee5 MOV U.RSDV-U.TSTA(R5),R1 ; R1-slot data virt. startD(30$: ; Loop-move slot char. in loop+ MOV #-1,R2 ; R2<0 (get char. operation) + CALL GCHR ; Get character (R2 on right) MOV R0,-(SP) ; Save registers MOV R1,-(SP) ;- MOV R4,-(SP) ;a% MTPS #TTPRI ; Raise to priority 5t- CALL ICHAR1 ; Move char. from R2 to TTDRV  MTPS #0 ; Back to zero# MOV (SP)+,R4 ; Restore registers  MOV (SP)+,R1 ;  MOV (SP)+,R0 ;R$ INC R1 ; Point to next character; BITB #UL.RSS,U.LINS-U.TSTA(R5) ; RCV-STOPPED on that link?t BNE 40$ ; Yes-process it$ SOB R0,30$ ; Copy all characters/35$: MOV U.CCBA-U.TSTA(R5),R2 ; R2-CCB addresse( CLR U.CCBA-U.TSTA(R5) ; Show slot done* DEC C.STS(R2) ; Decrement slots counter> BICB #UL.RDA,U.LINS-U.TSTA(R5) ; Clear receive data available;1I; When the entire slot has been processed do not update the slot counter.RE; This is not necessary and it allows the LAT process to use one slotR(; for multiple start session slots.;,! BR 50$ ; Slot done-process itt 40$: ; Slot done or00{i{ D%B11110010 stopped' DEC R0 ; Was not decremented by SOBs) BEQ 35$ ; Branch if it is really doned7 MOV R1,U.RSDV-U.TSTA(R5) ; Store current data virtualS. MOV R4,R1 ; Restore slot data counter addr# MOV R0,R2 ; R2>=0-put operationa* CALL GCHR ; Put counter in slot header)50$: MOV (SP)+,R2 ; Restore DCB addresst" CLR R3 ; Return status-success BR 10$ ; Get next UCBu o;#########################;update comments;.<; The port scans the UCB chain to find the corresponding UCB=; (session/server IDS) and fills the output buffer. The scan3%; starts from the specified UCB (R1).M;RB; After filling each slot the credits counter is decremented by 1.A; If the credits counter is 0, no information will be transferreda0; to the output buffer for this particular link.;VC; Operation fills the output buffer according to next set of rules:s<; - Go through all UCBs and fill all slots for UCBs with the; UL.TDA bit set;5; - Stop when there is no more room in output buffer;g@; - If there is room in the buffer after the path through all of?; the UCBs has been made and there is XMT-STOPPED links starta-; again if there are any credits available;.E; - the message is filled until the message maximum length is reached ,; or until all of the data has been moved.;V; Input:D; R1 - UCB address to start scanning or 0 (start from the beginning); R2 - Server number"; R4 - Address of CCB, containing:; Buffer bias C.BUFt5; Buffer virtual addr C.BUF+2 -After message headerf,; Buffer length C.CNT -Without MSG header.; Maximum slot length to fill out is in U.SLSZ;i ; Output:E(; R1 - UCB address were scan was stopped; R2 - Server numberK; R3 - Status: 0-success, >0-number of links in XMT-STOPPED state, <0-errorr"; R4 - Address of CCB, containing:; Buffer bias C.BUF-4; Virtual end of data C.BUF+2 (next available byte); Remaining in buffer C.CNT; 4; ; Note:,A; U.TRSC, U.TRSA and UL.TDA are cleared when all of the XMT chain2I; has been copied into the output buffer and all XMT buffers deallocated.a;u; Note:n#; Register 1 is used as a bit mask:u?; - Bit 1 is set if R1, provided on call from LAT processu8; contained address of the UCB in the middle of the UCB8; chain or terminal driver call LHSTAX from ODONE call.9; In that case we need to repeate loop once more.(A; - Bit 2 is set if any of the links has a transmit credit. ;e;$LHOUT:: MOV R1,-(SP) ; Save R1e MOV R2,-(SP) ; Save R22( CLR R3 ; Prepare XMT stopped counter% CLR R2 ; Start from the beginning / CALL FNDUCB ; Ret. DCB (R2) & 1-st UCB (R5) . CMP R1,R5 ; LAT calls with 1-st UCB in R1? BNE 1$ ; Branch if not" CLR R1 ; Yes-clear R1 bit mask) BR 15$ ; And go to process first UCB S%1$: ; Not 1-st UCB in R1 on call $ TST R1 ; LAT calls with 0 in R1?, BEQ 15$ ; Yes-start proc. First UCB (R5)& ; R1 not EQL 1-st UCB, and not 0# ; -LAT calls with UCB in the R ; Middle of the UCB chain * MOV R1,R5 ; In R5-UCB address to start' MOV #1,R1 ; Set repetition bit mask ! BR 15$ ; And process that UCB%2$: ; Look through all UCB chainn CLR R2 ; Start from firstt CLR R1 ; Clear bit maski 5$: ; Continue through UCBs" CALL FNDUCB ; Next (first) UCB TST R5 ; All UCBs done? ) BNE 15$ ; No-continue processing UCBS  ; All UCBs processed- BIT #1,R1 ; Do we have request to repeat? ) BNE 2$ ; Yes-start from the beginningd ; And clear all mask ; At least once we already ; Processed all UCBs) TST R3 ; Any links have been stopped?a" BEQ 10$ ; No-all done, get out ; There are stopped linkso& BIT #2,R1 ; Any link has a credit?* BNE 2$ ; Yes-repeat from the beginning ; No-get out*10$: ; All done-went through all UCBS# ; No XMT stopped links, or no " ; More credits, or buffer is ; Full-returne MOV (SP)+,R2 ; Restore;- MOV R5,R1 ; UCB address were scan stoppeda TST (SP)+ 00{b{TADATADATADATADATADATADATADATADATA ; Registersa RETURN ; And exit315$: BITB #UL.LEN,U.LINS-U.TSTA(R5) ; Link enabled?n BEQ 5$ ; No-get next linkl1 CMP (SP),U.SRVN-U.TSTA(R5) ; Requested circuit? BNE 5$ ; Not-get next link914$: BITB #LE.HIP,U.CREN-U.TSTA(R5) ; hangup in progress?o$ BEQ 114$ ; IF eq - normal output< BITB #UL.TDA!UL.NTO,U.LINS-U.TSTA(R5) ; XMT data available?) BNE 114$ ; if NE, something availabler= BISB #LE.TDC,U.CREN-U.TSTA(R5) ; Set Transmit data completed  BR 16$ ; Format STOP slot ; :114$: BITB #UL.TDA,U.LINS-U.TSTA(R5) ; XMT data available?* BNE 16$ ; If set -check next condition ; UL.TDA not set5 BITB #UL.NTO,U.LINS-U.TSTA(R5) ; Did we have stalled; ; non task output?+ BEQ 5$ ; No UL.TDA & no UL.NTO-next UCBr ; Yes, we did, we did!0 CALL PRNTO ; Try to put it into output queue= BITB #UL.TDA,U.LINS-U.TSTA(R5) ; Now is there any to output?v BEQ 5$ ; If EQ no - next UCB ASSUME S2.CTS,100000o16$:;N; The following lines of code have been commented out because the architectureJ; doesn't allow flow control between server and host with characters, but M; instead uses credits to control the flow of data. Therefore, if we have the &; the credits, we will send the data. ;L.; TST -U.TSTA(R5) ; XOFFED by user?; BMI 5$ ; Yes-get next link ;p4; Of course there is a buffer! (Used for debug only)3; TST C.BUF+2(R4) ; Check if output buffer addr 0; BEQ 5$ ; Yes-get next link:" ; Test for available credits& ; Should always be the last test) MOVB U.CREN-U.TSTA(R5),R0 ; Get creditse BIC #177760,R0 ; * $ TSTB R0 ; any credits available? BLE 5$ ; No-get next link . BIS #2,R1 ; Set bit mask-credits available ; UCB found (R5); . BIT #1,C.BUF+2(R4) ; Slot on even boundary? BEQ 18$ ; Branch if yesp! INC C.BUF+2(R4) ; Make it evens/ DEC C.CNT(R4) ; Decrement I/O buffer counterf18$:6 BITB #UL.TDA,U.LINS-U.TSTA(R5) ; Transmit data avail?& BNE 119$ ; if NE, yes - go get it! ; Else must be completionV ; of .HIP57 CMP C.CNT(R4),#SL$SDS ; I/O buff avail > slot header?  BHI 19$ ; Branch if yesE7 BISB #UL.TRS,U.LINS-U.TSTA(R5) ; Set transmitt stoppedc BR 10$ ; and exit ;C>19$: BICB #LE.HIP,U.CREN-U.TSTA(R5) ; Clear hangup in progress, BICB #17,U.CREN-U.TSTA(R5) ; Clear credits MOV R3,-(SP) ; Save R3C MOV R2,-(SP) ; Save R2O2 SUB #SL$SDS,C.CNT(R4) ; Subtract out slot header/ MOV C.BUF+2(R4),R2 ; Get slot header addressE5 ADD #SL$SDS,C.BUF+2(R4) ; Point at next avail. byte - MOV #321,R3 ; Slot type, reason code DIAGu( CALL FILSH ; Fill in the slot header MOV (SP)+,R2 ; Restore R2 MOV (SP)+,R3 ; Restore R3 BR 5$ ; Go do next UCB e)119$: ; Copy XMT chain in I/O buffer " MOV R2,-(SP) ; Save DCB address/ MOV R3,-(SP) ; Save R3 (XMT-STOPPED counter)P( CLR -(SP) ; Initialize the slot type# ; to zero which is for Data_ao0 MOV C.BUF+2(R4),-(SP) ; Save start of the slot9 MOV U.TRLH-U.TSTA(R5),R2 ; R2-first buffer in XMT chainv! ; U.TRSC=0 if new XMT chaint, TST U.TRSC-U.TSTA(R5) ; All new XMT chain? BNE 20$ ; No-branch( ; Yes, new chain? MOVB 2(R2),U.TRSC-U.TSTA(R5) ; U.TRSC-bytes in first XMT buff$;20$: CMP C.CNT(R4),#SL$SDS ; I/O buff avail > slot header?e BHI 25$ ; Branch if yes " ; I/O buff avail=15$: BIT #S6.LAT,U.TST6-U.TSTA(R5) ; Is this Lat App Terminal? BEQ 20$ ; If no, just branch/ BIT #40000,R1 ; Is this solicited connectioni+ BEQ 5$ ; If EQ - no, don't give this TT 320$: BITB #UL.LEN,U.LINS-U.TSTA(R5) ; Link enabled? BNE 5$ ; Get next if enabled; BIT #1,U.CCBA-U.TSTA(R5) ; Reserved Application Terminal?N% BNE 5$ ; if NE, yes - Check next.U1 BIT #F4.NCT,$FMASK+6 ; Does system have NCT...?E, BEQ 30$ ; If no, don't check for NCT att TST $NCTPT+4 ; Is NCT active?* BEQ 30$ ; If not, no need to check ATT= CMP U.ATT-U.TSTA(R5),$NCTPT+4 ; Does NCT have this unit att?,+ BEQ 5$ ; If EQ yes, try for another TT:  ;Q@30$: BIT #U2.LOG,U.CW2-U.TSTA(R5) ; Is terminal still logged in? BEQ 5$ ; If eq, yes  .IF DF T$$SPL) TST U.TAPR-U.TSTA(R5) ; UCBX allocated? & BEQ 5$ ; If EQ this one is no good .ENDC ;DF T$$SPLU$ ; Found disabled/requested UCB2 MOV (SP),U.SRVN-U.TSTA(R5) ; Store server number CLR R3 ; Return successNLLHST1: BICB #US.OFL!US.PDF,U.ST2-U.TSTA(R5) ; Set unit online and clear priv9 BICB #US.DSB!US.CRW,U.STS-U.TSTA(R5) ; Toggle read/writeQ, CLRB U.LINS-U.TSTA(R5) ; clear link status1 CLR U.TRSC-U.TSTA(R5) ; Clear XMT queue counterd. CLRB U.CREN-U.TSTA(R5) ; Clear credits field# TST R3 ; New session (R3 Clear)c) BNE 5$ ; if NE, no - don't set IO.ORGo BIT #10000,R1 00{i{ D%B11110010 ; IO.ORG? BEQ 5$ ; if EQ, no= BISB #LE.ORG,U.CREN-U.TSTA(R5) ; Set bit in status extensionr65$: MOVB U.SESN-U.TSTA(R5),R1 ; Return session number! ; And link status extensionn9 BIC #S2.CTS,-U.TSTA(R5) ; Make sure not XOFFedo0 BISB #U2.RMT,U.CW2-U.TSTA(R5) ; Set line remote, BIC #100000,6(R5) ; No autobaud detection: BIT #S6.LAT,U.TST6-U.TSTA(R5) ; Lat Application Terminal?# BEQ 10$ ; if EQ - no, call MANSC& CLR U.TST5-U.TSTA(R5) ; Reset U.TST5, CLRB U.TMTI-U.TSTA(R5) ; Clear modem timer& BR 20$ ; Continue in common code..; )10$: MTPS #TTPRI ; Raise to priority 5O( CALL MANS ; Answer the call-sets all% ; Characteristics & line enableo MTPS #0 ; Back to zero;S$20$: TST R3 ; Called from LHMTIM?' BNE RET1 ; if NE - yes, just returne3 BISB #UL.LEN,U.LINS-U.TSTA(R5) ; Show link enabled#"SEXIT: MOV (SP)+,R2 ; Restore R2 RET1: RETURN B;1%; **-$LHTMO - A solicit has timed outT;-E; This routine is called by LAT Process when a solicit has timed out.rF; Any outstanding I/O is killed, and the current I/O is completed with>; Error status in R3 returned in the IOSB of the issuing task.; ; INPUT: R1 - U.TSTA of terminal; R2 - Error code;o; OUTPUT: R1 - Unchanged!; R3 - 0 If success, <0 if error ;-; Other registers preserved.;,9$LHTMO::BIT #S6.LAT,U.TST6-U.TSTA(R1) ; Is this a L.A.T.?  BEQ ERR1 ; If not, error! MOV R0,-(SP) ; Save R0i MOV R2,R0 ; Move error codeu! SWAB R0 ; Get code to hi bytea' BISB #IE.DNR,R0 ; Get DNR to lo byten& BR STP ; Finish I/O, clean up, etc;p;e;; The LAT process calls this entry point to stop a session.i2; In R1 is the UCB address of the session to stop.; ; Input:; R1 - UCB address ; Output:; R1 - Unchanged ; R3 - 0 if success, <0 if error; R5 - modified;; Other registers preservedT;($LHSTP::/ BITB #UL.LEN,U.LINS-U.TSTA(R1) ; Line enabled?M BNE STP1 ; Branch if Yes&ERR1: MOV #ER$SYN,R3 ; Synchr. error RETURN ; And return;S;ISTP1: MOV R0,-(SP) ; Save R00 MOV #IE.DNR&377,R0 ; Return DNR error to task% ; Save reg. destroyed by LHMHUPt"STP: MOV R1,R5 ; R5-UCB address MOV R1,-(SP) ; Save R1  MOV R2,-(SP) ; Save R21 MOV R4,-(SP) ; Save R4 MOV R0,-(SP) ; Save statusu% CALL MUCBX ; Map UCBX buffer (R4) CALL CLEAN ; Cleanup buffers2 BISB #US.DSB,U.STS-U.TSTA(R5) ; Toggle read/write0 CLRB U.LINS-U.TSTA(R5) ; Clear all link states MOV (SP)+,R0 ; Restore status% MTPS #TTPRI ; Raise to priority 5 1 CALL LHMHUP ; Kill all I/Os and hang the linen ; Clobbers R0,R1,R2,R3 MTPS #0 ; Back to zero CLR R3 ; Return successa MOV (SP)+,R4 ; Restorea MOV (SP)+,R2 ; Registerse MOV (SP)+,R1 ;  MOV (SP)+,R0 ;R RETURN  aH; --* LHDET - Check to see if Lat Application Terminal session should be; disconnected. U;S;.=; A session is disconnected if the original connection to theC=; application terminal at the terminal server was an implicitT<; connection. Lat Process is mapped and called to check the; status in the circuit block.;e; Called by TTATTP;0!; Inputs: R5 - U.TSTA of terminalt; *; Outputs: CS if terminal is to be hung up; CC if not.;rBLHDET:: BITB #LE.ORG,U.CREN-U.TSTA(R5) ; Session result of IO.ORG?) BNE 10$ ; if NE yes, don't hang up TTl5 BITB #LE.HIP,U.CREN-U.TSTA(R5) ; Hangup in progress?s) BNE 10$ ; if NE, yes - don't hang up.i& SEC ; show terminal to be hung up 10$: RETURNr ; ; Common Subroutines;n; FNDUCB-find next LH UCBd7; Returns LH port first UCB and next/first UCB address.; Input:#; R2-DCB address (0 if first entry)f!; R5-Current UCB's U.TSTA addressr ; Output: ; R2=0 on input:,; R2-DCB address (0 if no LH CTB/DCB found); R5-First UCB's U.TSTA%; Carry set if no LH'S CTB/DCB foundt; R2=DCB on input:; R2-UnchangedT,; R5-Next UCB's address (0 if no more UCBs);NFNDUCB:d TST R2 ; First entry?s BNE 30$ ; Branch if not0% MOV $CTLST,R2 ; First CTB in chains&1000{b{TADATADATADATADATADATADATADATADATA$: CMP L.NAM(R2),#"LH ; TT device? BEQ 20$ ; BR if yes  MOV (R2),R2 ; Next CTB n# BNE 10$ ; If NE, Check next onet SEC ; CTB not found) RETURN ; Return with no LH data base:(20$: MOV L.DCB(R2),R2 ; R2-DCB address* MOV D.UCB(R2),R5 ; R5-First UCB address ADD #U.TSTA,R5 ; R5-U.TSTAD CLC ; CTB found" RETURN ; R2-DCB, R5-First UCB=30$: CMPB U.SESN-U.TSTA(R5),D.UNIT+1(R2) ; Current unit-last?E BLO 40$ ; BR if not( CLR R5 ; No more units (return R5=0) BR 50$ ; And exit '40$: ADD D.UCBL(R2),R5 ; R5-Next unitM50$: RETURN ; And exit;1/; MOVSB - Move source buffer into output buffert; Input:; R0 - Number of bytes to copy; R5 - UCB address, were:R#; U.TRLH-U.TSTA - Source addressR+; U.TRSC-U.TSTA - Number of bytes leftR+; Send word in U.TRLH buffer-buffer sizeR6; R4 - CCB address, containing output buffer bias/virt3; Output buffer should be biased through APR6. ; Output:I; C.BUF+2(R4) Modified - points to the first free byte in the output buffD;; C.CNT(R4) Modified - remaining bytes in the output buffer; ; Note: B; Algorithm works for I/D space and non-I/D space systems. KISARi,9; found for source buffer mapping always maps data space.A;S; All registers preservedS;.MOVSB: MOV R0,-(SP) ; Save R0S MOV R1,-(SP) ; Save R1u MOV R2,-(SP) ; Save R2e MOV R3,-(SP) ; Save R3r MOV R4,-(SP) ; Save R4u0 SUB R0,C.CNT(R4) ; C.CNT-Avail. in I/O buffer5 MOV U.TRLH-U.TSTA(R5),R2 ; R2-Source buffer addressi CLR R1 ; Settup for BISB/ BISB 2(R2),R1 ; R1-Number of bytes in buffer( ADD #4,R2 ; R2-Bytes start in buffer ADD R1,R2 ; R2-End of buffer6 SUB U.TRSC-U.TSTA(R5),R2 ; R2-Current byte in buffer! MOV R2,R1 ; R1-Source addresss% ; Make R2 APR5 biased for BLXIOe, BIC #160000,R2 ; Clear APR number in R2* BIS #120000,R2 ; Make R2 APR-5 biased ; Set in R1 bias for BLXIO& ASH #-12.,R1 ; R1-Real APR number*2" ; ASH may be used here (EIS)! ; -we are using M-PLUS onlyS' BIC #177761,R1 ; Clear all junk bitsb' MOV KISAR0(R1),R1 ; R1-Buffer bias2) MOV C.BUF(R4),R3 ; R3-Destination biasd. MOV C.BUF+2(R4),R4 ; R4-Destination address CALL $BLXIO ; Move data  ; R0-Changed ; R2-Last source byte+1  ; R4-Last output byte+1  ; R1,R3-Preserved MOV R4,R1 ; Store R4# MOV (SP)+,R4 ; Restore CCB in R4 6 MOV R1,C.BUF+2(R4) ; New current V.A. in outp. buff MOV (SP)+,R3 ; Restore R3 MOV (SP)+,R2 ; Restore R2 MOV (SP)+,R1 ; Restore R1 MOV (SP)+,R0 ; Restore R0 RETURN1; 2; MUCBX - Map UCBX buffer on call from LAT process;i; Note:A; Need that only if UCBX is being used on calls from LAT process. ;e; Input: ; R5 - U.TSTAg; ; Output:L; None;bMUCBX: .IF DF T$$SPL ; I/D space systemsR* MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ; Map UCBX+ MOV #120000,R4 ; R4-Virtual UCBX addressU .IFF ;T$$SPLu ; Non I/D space systems($ MOV U.TUX-U.TSTA(R5),R4 ; Get UCBX .ENDC ;T$$SPL RETURN  ;t"; PRNTO - Process non task output.;R8; Allocate buffers and move the output into the buffers ,; updating U.TOC and U.TOP+2 in the process.; =; Link these buffers to the end of the U.TRLH chain with the T?; buffer type set to zero. (Not prompt or flow control info.) ; <; If enough buffers cannot be allocated exit with U.TOC and =; U.TOP+2 settup for the remainder. Else U.TOC will be zero. ; 1; If any buffers were added to U.TRLH set UL.TDA. ;e; Input:; R5-UCB address;TPRNTO: MOV R0,-(SP) ;c MOV R1,-(SP) ; Save MOV R2,-(SP) ; Registers  MOV R3,-(SP) ;  MOV R4,-(SP) ;g( CALL MUCBX ; Returns UCBX addr in R4# TSTB U.TOC(R4) ; anything to do?T" BEQ 70$ ; if EQ, just return..45$: MOV U.TRLH-U.TSTA(R5),R1 ; R1-XMT buffers chain) BEQ 30$ ; Branch if there is no chainx$10$: TST (R1) ; There is a chain- BEQ 20$ ; Find end of " MOV (R1),R1 ; Terminal buffers BR 10$ ; Chain" ; R1-add00{i{ D%B11110010r of the last buffer:20$: CMPB #BF$FLO,3(R1) ; Is this a Flow control buffer?+ BEQ 30$ ; If EQ yes - Don't put in dataR+ CMPB #T$$BFL-4,2(R1) ; Is this one full?B% BEQ 30$ ; If EQ yes - get new one.,25$: MOV R1,R2 ; Settup register for call# CALL 200$ ; Move the charactersT BR 50$ ; Check if done*30$: CALL ALTB ; Allocate T$$BFL buffer& BCS 60$ ; Branch if alloc. failure$ ; Buffer allocated, R2=address$ ; Build dest. buff from source- CLR (R2) ; Clear last buffer link pointer ASSUME BF$NOR,0$ CLR 2(R2) ; Clear count and type# CALL 200$ ; Move the charactersu% TST R1 ; Is there a U.TRLH chain?s BNE 45$ ; Yes-branch4 MOV R2,U.TRLH-U.TSTA(R5) ; No-new buffer-first one BR 50$ ; And out$45$: ; R1 points to last buffer- MOV R2,(R1) ; Link buffer to U.TRLH chain -50$: TSTB U.TOC(R4) ; Did we do it all yet?h BNE 5$ ; If NE no - Go onf BR 70$ ; All dones960$: BISB #UL.NTO,U.LINS-U.TSTA(R5) ; Note waiting outputl70$: MOV (SP)+,R4 ; RestoreM MOV (SP)+,R3 ;R MOV (SP)+,R2 ; Registers MOV (SP)+,R1 ;e MOV (SP)+,R0 ;T RETURN ; And exit;H.; Move the data and update counts and pointers;U; R2 - Buffer addressf;f200$: MOV R2,-(SP) ; Save R2 CLR -(SP) ; Prepare for BISB* BISB 2(R2),(SP) ; Get current in buffer* MOV (SP),-(SP) ; Duplicate top of stack% MOV #T$$BFL-4,R0 ; Get buffer sizeo/ SUB (SP),R0 ; get remaining space in buffer.! CLR R3 ; Prepare for the BISBu& BISB U.TOC(R4),R3 ; R3-string count CMPB R3,R0 ; Will it fit? ' BHI 230$ ; If HI no - Do one bufferP MOV R3,R0 ; Move all of it*230$: SUB R0,R3 ; Compute the remaining# MOVB R3,U.TOC(R4) ; And store itf) ADD R0,(SP) ; Add in these characters-1 MOVB (SP)+,2(R2) ; Move byte counter in buffert6 MOV U.TOP+2(R4),R3 ; R3-source buffer start address) ADD R0,U.TOP+2(R4) ; Update the sourcez, ADD #4,R2 ; Data start address in buffer1 ADD (SP)+,R2 ; Address in buffer for this data.5242$: MOVB (R3)+,(R2)+ ; Move byte from echo buffert SOB R0,242$ ; Move all bytes ; Destination buffer built7 BISB #UL.TDA,U.LINS-U.TSTA(R5) ; Data is now available MOV (SP)+,R2 ; Restore R2 RETURNA R;S0; CLEAN - Cleanup after an abort or stop session; 9; Deallocate all buffers other than prompt buffers. Clears7; transmit data available flag. An IO.RPR buffer chaine:; will be the last thing in the list except for a possible8; DATA_B buffer which will be deallocated along with the; IO.RPR chain later.v;yCLEAN: MOV R1,-(SP) ; Save R1$ MOV R2,-(SP) ; Save R2 - MOV U.TRLH-U.TSTA(R5),R2 ; Get the listheadS" BEQ 30$ ; Branch if no buffers+10$: CMPB #BF$RPR,3(R2) ; Is this IO.RPR?* BEQ 30$ ; If EQ yes - Don't deallocate' MOV (R2),-(SP) ; Get the next bufferh" CALL DETB ; Delete this buffer% MOV (SP)+,R2 ; Get the next bufferb' BNE 10$ ; And go on if there is one ;30$: BICB #UL.TDA!UL.NOD,U.LINS-U.TSTA(R5) ; Clear the flag ) CLR U.TRLH-U.TSTA(R5) ; Clear XMT queuel- CLR U.TRSC-U.TSTA(R5) ; Clear queue counterM MOV (SP)+,R2 MOV (SP)+,R1U RETURN ; And all done l .PSECT MAP5;$B; FILSH - Fill in slot header session number and slot length bytes;; Input:; R2 - Slot header address; R3 - Slot type1; C.BUF+2(R4) - Next available byte in I/O buffere; U.SESN - Slot number;R ; Output:h; Bytes filled in slot headern;oFILSH: MOV R1,-(SP) ; Save R1.. MOV C.BUF+2(R4),R1 ; R1-Next available byte. SUB R2,R1 ; R1-Filled bytes in slot (+HDR)/ SUB #SL$SDS,R1 ; Filled bytes without header(# MOV @#KISAR6,-(SP) ; Save APR6 . MOV C.BUF(R4),@#KISAR6 ; Map output buffer3 MOVB R1,SL$SBC(R2) ; Fill slot counter in headert9 MOVB U.SESN-U.TSTA(R5),SL$SID(R2) ; Fill slot identifyery- MOVB R3,SL$TYP(R2) ; Fill in the slot typeb) MOV (SP)+,@#KISAR6 ; Restore mappingt MOV (SP)+,R1 ; Restore R1 RETURN;:4; GCHR - Get/Put character from/into unmapped buffer;N; Input:; U.RSBB - Buffe00{b{TADATADATADATADATADATADATADATADATAr bias; R1 - Byte virtual addressD; R2-B(; <0 - Get character from buffer to R2*; >=0 - Put character from R2 into buffer;V"; Output for R2<0 - low byte in R2;rGCHR: $ MOV @#KISAR6,-(SP) ; Save APR 64 MOV U.RSBB-U.TSTA(R5),@#KISAR6 ; Map input buffer TST R2 ; Test R2 BGE 10$ ; Branch if >=0  CLR R2 ; Prepare R2@' BISB (R1),R2 ; Move character in R2R BR 20$ ; DoneR-10$: MOVB R2,(R1) ; Move character from R2n20$:. MOV (SP)+,@#KISAR6 ; Restore APR6 mapping RETURN-; &; Call to LAT process: (APR 5 always).;a9; Call to LAT process is being made using $MPPRO routine. :; Bias of the LAT process is stored in S.KRB+2 of the scb.=; Virtual address of LAT is stored in the S.KRB+4 of the SCB.@;S+FPLAT:: ; This entry included in FRKTB ; Table in TTDAT moduleC; ); Call from fork process comes here with:h; R4-UCBX address; R5-UCB address:;V MOV R3,-(SP) ; Save R3e1 BITB #UL.XON,U.LINS-U.TSTA(R5) ; Called for XON?  BEQ 10$ ; If EQ no - go on) MOV #PO$XON,R3 ; Set the function code  BR CALLT ; Call LAT process 10$: MOV R0,-(SP) ; Save R0o: BITB #UL.NTO,U.LINS-U.TSTA(R5) ; Non task output pending?* BNE 40$ ; If NE yes - Don't call ODONE> BIT #S5.RPO,U.TST5-U.TSTA(R5) ; Is prompt output in progress?' BNE 40$ ; If NE yes - No ODONE calll;oN; Find out how many data buffers we have. If it is too many don't call ODONE.;R CLR R0 ; Init the countU/ MOV U.TRLH-U.TSTA(R5),R3 ; Get start of list 1$ BEQ 30$ ; Branch if no more list!20$: INC R0 ; Update the count % MOV (R3),R3 ; Get the next bufferR$ BNE 20$ ; Branch if there is one!30$: CMP R0,#MAXBUF ; Too many?e BLOS 35$ ; If LOS no - Go on4 BISB #UL.NOD,U.LINS-U.TSTA(R5) ; Note no ODONE call! BR 40$ ; And call LAT process$"35$: BIC #S1.DSI,(R5) ; Clear it% MTPS #TTPRI ; Raise to priority 5e$ CALL ODONE ; Process the request MTPS #0 ; Back to zero6 BIS #S1.DSI,(R5) ; Reset S1.DSI for other processes40$: MOV (SP)+,R0n) MOV #PO$OUT,R3 ; Set the function code  BR CALLT ; Call LAT process ;e=; Direct call if priority message has to go out. In this caseM; LAT should not call $LHOUT. ; Input parametrs:; R3-Operation code;S; R5-UCB addressn;DLTPRC:: MOV R3,-(SP) ; Save R3rCALLT: MOV R4,-(SP) ; Save R4 * MOV U.SCB-U.TSTA(R5),R4 ; R4-SCB address MOV S.KRB+2(R4),-(SP) ; Bias! MOV S.KRB+4(R4),-(SP) ; Virtual , CALL $MPPRO ; Maps and calls LAT process ; Restores SPM MOV (SP)+,R4 ; Restore R4 MOV (SP)+,R3 ; Restore R3 RETURN ; And exit; 7; The LAT process calls LAT port at common entry point I; with the function code in R3.l;L"$LHDEV:: ; LH port entry point$ CLR R4 ; Always controller zero! MTPS #TTPRI ; Raise to PR5, TTSET$ LH ; Map APR6 for termianl driver MTPS #0 ; Back to zero( CALL LHDEV6 ; Go into the Map6 psect MTPS #TTPRI ; Raise againt RETURN ; Exit through TTSET .PSECT MAP6"LHDEV6: CLR R2 ; No DCB address* CALL FNDUCB ; Go get first UCB address+ MOV U.SCB-U.TSTA(R5),R5 ; Get SCB addressc- MOV S.KRB+10(R5),R1 ; Get input parametersi MOV S.KRB+12(R5),R2 ; ... MOV S.KRB+14(R5),R3 ; ... MOV S.KRB+16(R5),R4 ; ...% MOV R5,-(SP) ; Save address of SCBs" CALL @LHDSP(R3) ; Call function% MOV (SP)+,R0 ; Restore SCB addresst3 MOV R1,S.KRB+10(R0) ; Return function parametersP MOV R2,S.KRB+12(R0) ; ....T MOV R3,S.KRB+14(R0) ; ... MOV R4,S.KRB+16(R0) ; ... MOV R5,S.KRB+20(R0) ; ... RETURN  o .ENDC ;T$$LTH e .ENDV U.SCB-U.TSTA(R5),R5 ; Get SCB addressc- MOV S.KRB+10(R5),R1 ; Get input parametersi MOV S.KRB+12(R5),R2 ; ... MOV S.KRB+14(R5),R3 ; ... MOV S.KRB+16(R5),R4 ; ...% MOV R5,-(SP) ; Save address of SCBs" CALL @LHDSP(R3) ; Call function% MOV (SP)+,R0 ; Restore SCB addresst3 MOV R1,S.KRB+10(R0) ; Return function parametersP MOV R2,S.KRB+12(R0) ; ....T MOV R3,S.KRB+14(R0) ; ... MOV R4,S.KRB+16(R0) ; .00{i{ D%B11110010.NLIST .IDENT /06.01/T); TTMAC - ASSEMBLY PREFIX FILE FOR TTDRV.R7; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.J;L; 13-FEB-78 PETER WANNHEDENE;.; PREVIOUSLY MODIFIED BY: ;W; P. WANNHEDEN ; C. F. SPITZ ; D. R. DONCHING ; S. ADAMS ; B. MCCARTHYO ; R. PHILPOTTI;O%; MODIFIED FOR RSX-11M-PLUS V4.0 BY:D;;O; L. KOGAN 20-FEB-87:; LK720 -- SUPPORT DIRECT TRANSFER FOR "PURE" IO.WAL ONLY;O;T;K; ; S. C. ADAMS 2-APR-87;; SA470 - - THIS SPACE IS INTENTIONALLY LEFT BLANK TO MAKEN+; LINES MATCH UP TO LINES IN M-PLUS TTMACR"; FOR EASE OF FUTURE MAINTENANCE;T;E;P .MCALL UCBDF$, TTSYM$;3$ UCBDF$ ,,TTDEF ;DEFINE UCB OFFSETS TTSYM$ ;DEFINE TC.XXX SYMBOLS;N; ; ASSEMBLY PARAMETERSO;I3T$$BFL= 76 ;TYPEAHEAD BUFFER LENGTH - ALSO LENGTH  ;OF THE UCB EXTENSIONV5M$$ANS= 30. ;SECONDS TO WAIT FOR CARRIER AFTER RINGP7M$$CAR= 2 ;SECONDS TO WAIT FOR LOST CARRIER TO RETURN 4M$$DIS= 2 ;SECONDS TO WAIT FOR DISCONNECT TO OCCUR .IF DF R$$PRO+; USE PRIORITY 7 ON THE PRO SERIES HARDWAREM,; ALL DEVICES INTERRUPT AT THE SAME PRIORITYTTPRI= 340 ;PRIORITY 7 .IFF ;R$$PROUTTPRI= 240 ;PRIORITY 5 .ENDC ;R$$PRO1M$$CRI= M$$CRB-4 ;NUMBER OF BYTES OF INFORMATIONO ;IN CLI COMMAND BUFFER!T$$CTX= 0 ;^X FLUSHES TYPEAHEAD .OPTIME= 15. ;DEFAULT OUTPUT TIMEOUT INTERVAL;A/.IIF DF T$$BTW,T$$CTR=0 ;T$$BTW FORCES T$$CTRTO.IIF DF P$$GEN!T$$OVL,D$$Z11=0 ;DZ11 SUPPORT FOR PREGENNED OR RSX11MPL SYSTEMSO4.IIF DF P$$GEN,D$$LMD=0 ;INCLUDE DL11 MODEM SUPPORT4.IIF DF P$$GEN,D$$ZMD=0 ;INCLUDE DZ11 MODEM SUPPORT:.IIF DF P$$GEN!T$$OVL,D$$V11=0 ;INCLUDE DHU/DHV11 SUPPORT9.IIF DF P$$GEN,D$$VMD=0 ;INCLUDE DHU/DHV11 MODEM SUPPORTB;.IIF DF D$$M11!D$$ZMD!D$$LMD!D$$VMD,T$$MOD=0 ;MODEM SUPPORTFA.IIF DF D$$H11!D$$J11!D$$Z11!D$$V11,T$$MUX=0 ;MULTIPLEXER SUPPORTU3.IIF DF R$$MPL,R$$EIS=0 ;RSX-11M-PLUS EIS SUPPORT$..IIF DF M$$EIS,R$$EIS=0 ;RSX-11M EIS SUPPORTF.IIF DF P$$OOL&T$$COM,T$$SPL=0 ;USE SECONDARY POOL FOR UCBX AND TABUFG.IIF DF R$$MPL&P$$OOL,T$$SPC=0 ;USE SECONDARY POOL CLI COMMAND BUFFERS1N.IIF NDF R$$PRO,.IIF DF R$$MPL,T$$SER=0 ;SERIAL COMMAND PROCESSING (CLI TABUF)I.IIF DF A$$CLI, .IIF DF M$$CLI, .ERROR ;ILLEGAL COMBINATION OF PARAMETERSM5XLOPNT= 10. ;SEND XON WHEN 10 CHARS. LEFT IN TABUF1J.IIF NDF T$$SPL,XHIPNT=T$$BFL-4-10. ;SEND XOFF 10 CHARS. BEFORE TABUF FULL6.IIF DF T$$SPL,XHIPNT=10. ;SAME FOR I/D-SPACE SYSTEMS5.IIF DF T$$SPL,T$$DMA=0 ;IO.WAL FROM A TASK BUFFER  ;FOR I/D-SPACE SYSTEMSA+.IIF DF T$$LTH,T$$MOD=0 ;IF LAT THEN MODEME .IF DF T$$OVLH.IIF NDF T$$SPL,T$$ONI=0 ;DEFINE THIS SYMBOL FOR OVERLAID/NON-I/D DRIVER .ENDC ;T$$OVL0 .IF DF T$$TSA ;IF SYSGEN HAS DEFINED T$$TSA...*T$$OOB=0 ;OUT-OF-BAND CHARACTER HANDLING)T$$ICS=0 ;INPUT COUNT STATE RECOGNITIONI)T$$SCA=0 ;SWITCH CHARACTER RECOGNITION F! ;AND TERMINAL MANAGEMENT MODED*T$$MHU=0 ;MODEM HANG-UP NOTIFICATION AST?; GENERATE ERRORS IF ALL SUPPORT NEEDED FOR TSA IS NOT INCLUDED;2.IIF NDF R$$IIC, .ERROR ;INTERNAL I/O COMPLETION$.IIF NDF A$$TRP, .ERROR ;AST SUPPORT5.IIF NDF T$$SMC, .ERROR ;SET MULTIPLE CHARACTERISTICSO5.IIF NDF T$$GMC, .ERROR ;GET MULTIPLE CHARACTERISTICSY%.IIF NDF T$$EIO, .ERROR ;EXTENDED I/O  .ENDC ;T$$TSAE; GENERATE ERRORS IF FUNCTIONALITY REQUIRING AST SUPPORT IS REQUESTEDW&; BUT AST SUPPORT IS NOT IN THE SYSTEM .IF NDF A$$TRPM. .IIF DF T$$CCA, .ERROR ;UNSOLICITED INPUT AST1 .IIF DF T$$SCA, .ERROR ;SWITCH CHARACTER SUPPORTS- .IIF DF T$$MHU, .ERROR ;MODEM HANG-UP NOTIFYT .ENDC ;A$$TRPL; GENERATE ERRORS IF FUNCTIONALITY REQUIRING INTERNAL I/O COMPLETION SUPPORT); IS REQUESTED BUT R$$IIC IS NOT DEFINED.G .IF NDF R$$IICE1 .IIF DF T$$ICS, .ERROR ;INPUT COUNT STATE CHANGE., .IIF DF T$$OOB, .ERROR ;OUT-OF-BAND SUPPORT .ENDC ;R$$IIC O .MACRO FRKBIT INS,VAL .IF DF M$$PRO* CACHE$ SAVE ;NOW WANT NON-CACHED VALUES .IFTF ; DF M$$PRO+ 'INS' 'VAL',U.TFRQ-U.TSTA(R5) ;DO WHATEVERC .IFT ; DF M$$PRO) CACHE$ UNSAVE ;SET CACHE BACK AS IT WA00{b{TADATADATADATADATADATADATADATADATAST .ENDC ; DF M$$PRO .ENDM FRKBIT ;N;O .MACRO TTSET$ TYPER JSR R2,TTSETI S O .IF DF R$$MPL B R .WORD 'TYPE'CTBPD  .IFFN R .WORD 'TYPE'UCB $ .ENDC .ENDM TTSET$A;C G .IF NDF R$$MPLO .;O#; DEFINE CONTROLLER TYPES (RSX-11M)I;TTTDL=0ATTTDZ=2TTTTDH=4TTTDJ=6 TTTDM=10 ;DM11-BBATTTDV=14 T;N C .ENDC ;NDF R$$MPL D;$;O-; DEFINE CHARACTERS WITH SPECIAL SIGNIFICANCEC; CH.BSL= 134$'CH.AES=37 ;ALTERNATE ESCAPE CHARACTERS#CH.RBR=175 ;RIGHT BRACE (ALTMODE)NCH.TLD=176 ;TILDE (ALTMODE)TCH.LCA=141 ;LOWERCASE ACH.LCZ=172 ;LOWERCASE Z CH.BSP= 10 CH.CR= 15 CH.CTC= 3 CH.CTO= 17 CH.CTQ= 21 CH.CTR= 22 CH.CTS= 23 CH.CTU= 25 CH.CTX= 30 CH.CTZ= 32 CH.DOL= '$ CH.ESC= 33 CH.FF= 141 CH.HT= 11T CH.LF= 12D CH.NUL= 0= CH.ONE= '1 CH.PLU= '+ CH.RUB= 177D CH.SP= 40N CH.VT= 13C CH.ZER= '0;D;$A; DEFINE LEGAL READ/WRITE MODIFIER COMBINATIONS BASED ON SELECTED3; TERMINAL DRIVER SUPPORT:;P0; TF.LGW :== LEGAL WRITE-LOGICAL-BLOCK MODIFIERS/; TF.LGR :== LEGAL READ-LOGICAL-BLOCK MODIFIERSO8; TF.LER :== LEGAL EXTENDED-READ-LOGICAL-BLOCK MODIFIERS;TF.LGW = TF.WAL!TF.CCO!TF.WIRQ' .IIF DF T$$BTW, TF.LGW = TF.LGW!TF.WBTH' .IIF DF T$$CUP, TF.LGW = TF.LGW!TF.RCU +TF.LGR = TF.RST!TF.RAL!TF.RNE!TF.XOF!TF.TMO 9TF.LER = TF.LGR!TF.RLU!TF.RTT!TF.RPT!TF.RNF!TF.TNE!TF.RDI=. .IIF DF T$$RPR, TF.LER = TF.LER!TF.RPR!TF.BIN' .IIF DF T$$ESC, TF.LER = TF.LER!TF.RES3; ;M(; DEFINE OFFSETS IN UCB EXTENSION (UCBX);W .ASECTC.= 00U.TCI: .BLKW 1 ;IF SOLICITED INPUT IN PROGRESS:. ; POINTER TO CURRENT INPUT REQUEST PACKET& ;IF UNSOLICITED INPUT IN PROGRESS:- ; POINTER TO SECOND WORD IN FIRST BUFFER  ;IF INPUT IDLE:  ; 0/U.TIP: .BLKW 2 ;IF BUFFERED INPUT IN PROGRESS:L- ; FIRST WORD = POINTER TO CURRENT BUFFERT) ; SECOND WORD = POINTER TO NEXT BYTE  ; IN CURRENT BUFFER' ;IF NON-BUFFERED INPUT IN PROGRESS: / ; FIRST WORD = KISAR6 BIAS FOR TASK BUFFERX/ ; SECOND WORD = VIRTUAL ADDRESS IN KISAR61# ; OF NEXT BYTE IN TASK BUFFER 8U.TIC: .BLKW 1 ;REMAINING BYTES IN CURRENT INPUT BUFFER0U.TTIC: .BLKW 1 ;TOTAL REMAINING BYTES TO INPUT ;(EXCLUDING CURRENT BUFFER) :U.TFIB: .BLKW 1 ;POINTER TO FIRST INPUT BUFFER (ONLY WITH ;BUFFERED INPUT),U.TCO: .BLKW 1 ;IF TASK OUTPUT IN PROGRESS:/ ; POINTER TO CURRENT OUTPUT REQUEST PACKETU) ;IF ECHO IN PROGRESS, OR OUTPUT IDLE:  ; 0>U.TOP: .BLKW 2 ;FIRST WORD = POINTER TO CURRENT OUTPUT BUFFER* ;SECOND WORD = POINTER TO NEXT BYTE IN ;CURRENT OUTPUT BUFFER9U.TOC: .BLKW 1 ;REMAINING BYTES IN CURRENT OUTPUT BUFFERR1U.TTOC: .BLKW 1 ;TOTAL REMAINING BYTES TO OUTPUT ;(EXCLUDING CURRENT BUFFER)0U.TFOB: .BLKW 1 ;POINTER TO FIRST OUTPUT BUFFER0U.TFPB: .BLKW 1 ;FIRST PROMPT BUFFER FOR IO.RPR&U.TISV: .BLKB 1 ;INPUT STATE VARIABLE7U.TIHP: .BLKB 1 ;INITIAL HORIZONTAL POSITION FOR INPUTG .IF NDF T$$SPLEU.TECB: ;ECHO BUFFER2 .ENDC .BLKB 1)U.TVFC: .BLKB 1 ;VERTICAL FORMAT CONTROLDU.TITI: .BLKB 1 ;INPUT TIMER U.TOTI: .BLKB 1 ;OUTPUT TIMER+U.TSHP: .BLKB 1 ;SAVED HORIZONTAL POSITIONF)U.TSVP: .BLKB 1 ;SAVED VERTICAL POSITIONE;O+U.TRTT: .BLKW 1 ;SPECIAL TERMINATORS TABLE. .IF DF T$$EIO:U.TDIP: .BLKW 2 ;POINTERS TO CURRENT DEFAULT INPUT BUFFER=U.TDIC: .BLKW 2 ;COUNT OF REMAINING DEFAULT INPUT CHARACTERSP7U.TDIF: .BLKW 1 ;POINTER TO FIRST DEFAULT INPUT BUFFERF .ENDC ;T$$EIO/U.TTID: .BLKB 1 ;TERMINAL ID DEFINED ON IO.ATTC .IF DF B$$MAP>U.TDYP: .BLKB 1 ;OFFSET IN UCB EXTENSION FOR DATA TYPE (BYTE) .ENDC ;B$$MAP .EVEN&U.TAST: .BLKW 1 ;POINTER TO AST BLOCK ;0 IF NO AST SET UPT .IF DF T$$SCA?U.TSCA: .BLKW 1 ;POINTER TO SWITCH CHARACTER AST CONTROL BLOCK. .ENDC ;T$$SCAE .IF DF T$$MHUL2U.TMHA: .BLKW 1 ;POINTER TO MODEM HANG-UP NOTIFY  ;AST CONTROL BLOCK .ENDC ;T$$MHUO .IF DF T$$ICSU6U.TICA: .BLKW 1 ;POINTER TO TEP FOR INPUT COUNT STATE .ENDC ; T$$ICSI .IF DF T$$OOB000{{ D%B11110010U.TOBA: .BLKW 1 ;POINTER TO TEP FOR OUT-OF-BAND .ENDC ; T$$OOB .IF DF T$$SPL9U.TTBF: ;TYPEAHEAD BUFFER FOLLOWS UCBX FOR 2NDARY POOLS .ENDC ;T$$SPL(T$$UXL= . ;DEFINE UCB EXTENSION LENGTH .PSECTS;O;O,; DEFINE BITS IN FORK REQUEST BYTE (U.TFRQ).5; FORK REQUESTS ARE PROCESSED IN ASCENDING BIT ORDER.FA; NOTE - INPUT DONE (FR.IRD) MUST BE PROCESSED BEFORE OUTPUT DONEU@; (FR.ORD) FOR THE SIMULATED CTRL-R FOLLOWING AN IO.WBT TO WORK.; SEE NOTE IN MODULE TTRW.;OFR.IRD= 1 ;INPUT DONEOFR.ORD= 2 ;OUTPUT DONE'FR.SUI= 4 ;START OF UNSOLICITED INPUTSX= 4 T .IF DF T$$CCA&A$$TRPR LX= X*2/FR.AST= X ;CHARACTER THAT CAUSES AST RECEIVED   .ENDC ;T$$CCA&A$$TRPE H .IF DF M$$PRO X= X*20FR.TIM= X ;TIME-OUT (ON MULTI-CPU SYSTEM ONLY) E .ENDC ;M$$PRO N .IF DF T$$SPCX= X*2$FR.KIL= X ;SEND KILL PACKET TO CLI .ENDC ;T$$SPC .IF DF T$$OOB)X= X*22FR.OOB= X ;SEND TSA EVENT PACKET FOR OUT-OF-BAND ;CHARACTER R .ENDC ;T$$OOB  .IF DF T$$ICSX= X*27FR.ICS= X ;SEND TSA EVENT PACKET FOR TABUF GOING FROM40 ;ZERO TO NON-ZERO (INPUT COUNT STATE CHANGE) .ENDC ;T$$ICSA .IF DF T$$SCAE,X= X*2 ;SEND AST TO TASK ASKING FOR SWITCH$FR.SCA= X ; CHARACTER NOTIFICATION .ENDC ;T$$SCATX= X*2FR.GRQ= X ;GET REQUEST PACKET$ .IF DF T$$LTHX= X*2%FR.LAT= X ;MAP AND CALL LAT PROCESS$ .ENDC ;T$$LTHX= X*24FR.PFP= X ;PROCESS CHAR. IN U.TECB (U.TECO) AT END, ;OF FORK PROCESSING. NOTE - THIS MUST BE% ;THE HIGHEST USED BIT IN U.TFRQ!! ;N;S=; DEFINE CONTROLLER DEPENDENT ROUTINE DISPATCH TABLE OFFSETS.PF; REGISTER R2 IS SET TO THE REQUIRED OFFSET BEFORE THE CTRD ROUTINE ISD; CALLED TO TRANSFER CONTROL TO THE APPROPRIATE CONTROLLER DEPENDENT=; MODULE. THESE VALUES ARE AFFECTED BY GET/SET PARAMETER ANDEI; RECONFIGURATION CONDITIONAL CODE, WHICH MAKES IT EASIER TO CONTEND WITHCI; AND DEFINE THE SYMBOLS HERE THAN TO PROVIDE THE PROPER CONDITIONAL CODE &; WHEREVER THE CTRD ROUTINE IS CALLED.;CT.STA= 0 ;START OUTPUTNCT.ABO= 2 ;ABORT OUTPUTECT.RES= 4 ;RESUME OUTPUTCT.STP= 6 ;STOP OUTPUTX= 6 .IF NDF R$$CON X= X+2CT.PWR= X ;POWER-UPR .IFTF ;NDF R$$CONX= X+2CT.TIM= X ;MODEM TIME-OUT  .IFF ;NDF R$$CONX= X+2 CT.CPW= X ;CONTROLLER POWER-UPX= X+2CT.UPW= X ;UNIT POWER-UPX= X+2CT.CON= X ;CONTROLLER ONLINEX= X+2CT.COF= X ;CONTROLLER OFFLINERX= X+2CT.UON= X ;UNIT ONLINEX= X+2CT.UOF= X ;UNIT OFFLINEN .ENDC ;NDF R$$CON* .IF DF T$$GMC!T$$SMC!D$$M11!D$$ZMD!D$$VMDX= X+2$CT.PRM= X ;GET/SET LINE PARAMETERS* .ENDC ;T$$GMC!T$$SMC!D$$M11!D$$ZMD!D$$VMD.LISTWER-UPR .IFTF ;NDF R$$CONX= X+2CT.TIM= X ;MODEM TIME-OUT  .IFF ;NDF R$$CONX= X+2 CT.CPW= X ;CONTROLLER POWER-UPX= X+2CT.UPW= X ;UNIT POWER-UPX= X+2CT.CON= X ;CONTROLLER ONLINEX= X+2CT.COF= X ;CONTROLLER OFFLINERX= X+2CT.UON= X ;UNIT ONLINEX= X+2CT.UOF= X ;UNIT OFFLINEN .TITLE TTMIS  .IDENT /04.01/t;a;; COPYRIGHT (c) 1983,1985 BY DIGITAL EQUIPMENT CORPORATION.d; ALL RIGHTS RESERVED.;$<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;i;b; 23-JAN-78 PETER WANNHEDENS; ; PREVIOUSLY MODIFIED BY:E;r ; C. F. SPITZl; D. R. DONCHINM;S; MODIFICATIONS:;S; S. C. ADAMS 18-MAY-85 04.01 ; SA381 -- MOVE TO MAP5.6; ;S;+0; COMMON MULTIPLEXER INTERRUPT SERVICE ROUTINES.,; USED BY FOLLOWING CONTROLLERS: DH, DJ, DZ.;-; ;  3 .IF DF T$$MUX U .MCALL UCBDF$,SCBDF$   .IF DF R$$MPL $ .MCALL KRBDF$ S KRBDF$ ;DEFINE KRB SYMBOLSM B .ENDC ;R$$MPL  UCBDF$ ;DEFINE UCB SYMBOLSM SCBDF$ ;DEFINE SCB SYMBOLS3 .PSECT MAP5.6 .IF DF D$$H11!D$$J11!D$$Z11;E;r;+4; MUXINP - INPUT INTERRUPT SERVICE FOR MULTIPLEXERS.;; INPUT:; R3 CSR ADDRESS; R4 KRB ADDRESS (RSX-11M+)6"; R4 ADDRESS OF UCB LIST (RSX-11M);R; ALTERNATE ENTRY - MU00{{TADATADATADATADATADATADATADATADATAXIN1.D; ; INPUT:; R3 CSR ADDRESS; R4 KRB ADDRESS (RSX-11M+)D"; R4 ADDRESS OF UCB LIST (RSX-11M)!; R5 CHARACTER + STATUS FROM SILOR'; CC-N 1 IF R5 CONTAINS VALID CHARACTER;; OUTPUT FROM BOTH:U0; SILO EMPTIED. IF TRANSMIT READY IS SET IN CSR,6; A RETURN TO CALLER IS MADE WITH R3 AND R4 UNCHANGED.+; ELSE A RETURN TO CALLER'S CALLER IS MADE.T;R; REGISTERS ALTERED: R2,R5;-;:; !MUXIN1::MOV R5,-(SP) ;;;SAVE CHARS( SWAB R5 ;;;GET LINE NUMBER IN LOW BYTE CALL MUXUCB ;;;GET UCB IN R5' MOV (SP)+,R2 ;;;RETRIEVE CHAR + STATUS4+ BCS MUXINP ;;;BAD LINE - IGNORE CHARACTER  T .IF DF R$$MPL A& MOV R4,-(SP) ;;;OK - SAVE KRB ADDRESS0 CALL ICHAR1 ;;;DO COMMON INPUT INTERRUPT PROC.$ MOV (SP)+,R4 ;;;RESTORE KRB ADDRESS# MOV @R4,R3 ;;;RESTORE CSR ADDRESSR  .IFFT MOV R3,-(SP) ;;;SAVE CSR& MOV R4,-(SP) ;;;SAVE ADDR OF UCB LIST0 CALL ICHAR1 ;;;DO COMMON INPUT INTERRUPT PROC.) MOV (SP)+,R4 ;;;RESTORE ADDR OF UCB LISTG MOV (SP)+,R3 ;;;RESTORE CSR  .ENDC ;R$$MPL I4MUXINP::MOV 2(R3),R5 ;;;GET NEXT CHARACTER FROM SILO BMI MUXIN1 ;;;OK - JUMP ;R;; SILO IS NOW EMPTY. SEE IF CONTROLLER IS READY TO TRANSMITB;D TST @R3 ;;;XMIT RDY SET? BMI 10$ ;;;Y - RETURN.* TST (SP)+ ;;;N - POP 1.ST RETURN ADDRESS10$: RETURN ;;;RETURND .ENDC ;D$$H11!D$$J11!D$$Z11;;;A;+$; MUXUCB - GET UCB FROM LINE NUMBER.;T; INPUT:; R4 KRB ADDRESS (RSX-11M+)R"; R4 ADDRESS OF UCB LIST (RSX-11M); R5 LINE NUMBER IN BITS 0-3; ; OUTPUT:C; R2 LINE NUMBER * 2&; R5 POINTER TO U.TSTA (IF VALID LINE); CC-C 0 IF VALID LINE; 1 IF INVALID LINE;R; REGISTERS ALTERED: R2,R5;-;O;R-MUXUCB::BIC #^C17,R5 ;;;CLEAR IRRELEVANT BITSD E .IF DF R$$MPL - MOV R5,R2 ;;;COPY LINE NUMBER1$ ASL R2 ;;;MAKE INDEX FOR UCB TABLE" CMPB K.HPU(R4),R5 ;;;LINE IN USE?# BLO 10$ ;;;N - EXIT WITH CC-C SETF MOV R4,R5 ;;;GET KRB ADDRESS+ ADD K.OFF(R4),R5 ;;;ADD OFFSET TO UCB LIST - ADD R2,R5 ;;;ADD LINE NUMBER * 2 - YIELDING3 ;;;POINTER TO UCB POINTERB MOV @R5,R5 ;;;GET UCB POINTERF1 ADD #U.TSTA,R5 ;;;POINT TO U.TSTA AND CLEAR CC-CI10$: RETURN ;;;RETURNL E .IFF ;R$$MPLO R ASL R5 ;;;GET UNIT NUMBER * 2R MOV R5,R2 ;;;SAVE IT ADD R4,R5 ;;;GET UCB POINTER MOV (R5),R5 ;;;POINT TO UCBA BEQ 10$ ;;;LINE NOT IN USE1 ADD #U.TSTA,R5 ;;;POINT TO U.TSTA AND CLEAR CC-C  RETURN ;;;RETURNR 510$: SEC ;;;SET CC-C RETURN ;;;RETURND F .ENDC ;R$$MPL A .ENDC ;T$$MUX N;U;R .ENDYIELDING3 ;;;POINTER TO UCB POINTERB MOV @R5,R .TITLE TTMODY .IDENT /06.07/T;D;; COPYRIGHT (c) 1986,1987 BY DIGITAL EQUIPMENT CORPORATION.U; ALL RIGHTS RESERVED.;D<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;;B; 26-FEB-78 PETER WANNHEDEN5;P; PREVIOUSLY MODIFIED BY:S;L; P. WANNHEDEN ; C. F. SPITZD; D. R. DONCHINL ; S. ADAMS;E; MODIFICATIONS:;T;C; L. KOGAN 02-NOV-85 06.017; LK701 -- FIX THE PROBLEM WITH DISABLING REMOTE LINESJ0; WHEN "CARRIER DETECT" IS SET BEFORE "RING" ; SIGNALE;P; L. KOGAN 02-NOV-85 06.028; LK702 -- FIX THE PROBLEM WITH DISABLING REMOTE LINES /; WHEN CTS IS DROPPED FOR ABOUT 1/2 SEC AND D; THEN REASSERTED;C; S. ADAMS 16-JUNE-86 06.037*; SA461 -- ON MODEM ANSWER CLEAR PASSTHRU;Y; S. R. CLOUTIER 8-AUG-86 06.04P:; SRC -- ADD LHMHUP ENTRY POINT TO MHUP - CALLED BY TTLH0; DURING A STOP SESSION OR TIMEOUT. STATUS IS; SUPPLIED IN R0 BEFORE CALL;I0; CHANGE MHUP TO SUPPLY STATUS TO KILLO1 IN R0; ; L. KOGAN 09-JAN-1987 06.05<; LK719 -- QUEUE AST ROUTINE AFTER HARDWARE DISCONNECT WHEN;; "MODEM HANG-UP AST" CHARACTERICTIC IS ENABLED (S3.MHE)R;O; T. Schoeller 6-FEB-87 06.06S<; TMS054 -- CORRECT SRC TO GET RID OF STATUS BEFORE RETURN.;S; T. Schoeller 7-MAR-87 06.07 <; TMS055 -- Force R5 back to U.TSTA in USECDL!USECDH!USECDZ;U; ;L;B .PSECT MAP5.6;S;+!; TTMOD - MODEM SUPPORT ROUTINES. "; CONTAINS THE FOLLOWING ROUTINES:;N00{{ D%B11110010(; MODISR MODEM INTERRUPT SERVICE ROUTINE'; HLMTIM SUBROUTINE TO SERVICE TIME-OUT9,; MANS SUBROUTINE TO ANSWER A CALL ON A LINE#; MHUP SUBROUTINE TO HANG UP A LINEA;-;I;S A .IF DF T$$MOD .ENABL LSBr F;+H; MODISR - INTERRUPT SERVICE ROUTINE FOR DATASET STATUS CHANGE INTERRUPT9; ON DM11-BB, DL11-E OR DHV11, OR FROM DZ11 POLL SEQUENCEk; ; INPUT:;; R4 BIT 15: 1 IF INTERFACE SUPPORTS "DATASET READY" SIGNAL+-; BIT 14: 1 IF DATASET SHOWS "DATASET READY"S*; BIT 7: 1 IF RING HAS OCCURRED (DM11-BB)!; 1 IF LINE IS RINGING (DL11-E)M0; 1 RING INTEGRATED OVER THREE SAMPLES (DHV11),; BIT 6: 1 IF DATASET SHOWS "CLEAR TO SEND"); BIT 5: 1 IF DATASET SHOWS "CARRIER ON"D; R5 POINTER TO U.TSTA; ; OUTPUT:O%; 1. IF LINE IS NOT REMOTE, DROP DTR.T5; 2. IF LINE IS DISABLED AND NOT WAITING FOR CARRIER:H:; 2.1 IF BIT 1 OF $TTPRM IS 0, AND NO RING SEEN, DROP DTR.D; 2.2 IF BIT 1 OF $TTPRM IS 0, AND RING SEEN, SET A TIMER FOR M$$ANS?; SECONDS AND RAISE DTR. (ANSWER A CALL AND WAIT FOR CARRIER.)19; 2.3 IF BIT 1 OF $TTPRM IS 1, AND DSR IS OFF, NO ACTION.AB; 2.4 IF BIT 1 OF $TTPRM IS 1, AND DSR AND CARRIER AND CTS ARE ON,,; ENTER SUBROUTINE MANS TO ANSWER THE CALL.C; 2.5 IF BIT 1 OF $TTPRM IS 1, DSR IS NOT AVAILABLE AND CARRIER ANDE ; CTS ARE BOTH ON, SAME AS 2.4.C; 2.6 IF BIT 1 OF $TTPRM IS 1, DSR IS NOT AVAILABLE AND CARRIER AND,"; CTS ARE NOT BOTH ON, NO ACTION.D; 2.7 IF BIT 1 OF $TTPRM IS 1, AND DSR IS ON BUT CARRIER AND CTS ARE>; NOT BOTH ON, SET A TIMER FOR M$$ANS SECONDS. (ANSWER A CALL; AND WAIT FOR CARRIER.)A1; 3. IF LINE IS DISABLED AND WAITING FOR CARRIER:M; (RING FLAG IS IGNORED)A3; 3.1 IF DSR IS OFF, DROP DTR AND HANG UP THE LINE.E=; 3.2 IF CARRIER AND CTS ARE ON, CLEAR WAITING FLAG AND ENTER =; SUBROUTINE "MANS". (CARRIER APPEARED WITHIN WAITING PERIODO"; M$$ANS AFTER ANSWERING A CALL.)*; 3.3 IF CARRIER OR CTS IS OFF, NO ACTION.4; 4. IF LINE IS ENABLED AND NOT WAITING FOR CARRIER:3; 4.1 IF DSR IS OFF, DROP DTR AND HANG UP THE LINE. 0; 4.2 IF CARRIER AND CTS ARE BOTH ON, NO ACTION.E; 4.3 IF BIT 0 OF $TTPRM IS 0, AND CARRIER OR CTS IS OFF, SET A TIMERIC; FOR M$$CAR SECONDS AND SET WAITING FLAG. (CARRIER LOST, WAIT FORI; IT TO RETURN.)IF; 4.4 IF BIT 0 OF $TTPRM IS 1, AND CARRIER OR CTS IS OFF, DROP DTR AND; HANG UP THE LINE.0; 5. IF LINE IS ENABLED AND WAITING FOR CARRIER:4; (NOTE - THIS IS THE STATE THE LINE SHOULD STAY IN3; UNTIL A BYE COMMAND HAS BEEN SUCCESSFULLY QUEUED.4; AFTER HAVING FAILED EARLIER AS RESULT OF HANG-UP.3; IN THIS STATE, DTR SHOULD BE OFF SO THAT CARRIERF6; WILL NEVER BE SEEN - CASE 5.4 SHOULD NEVER HAPPEN.)2; 5.1 IF RING SEEN, DROP DTR AND HANG UP THE LINE.3; 5.2 IF DSR IS OFF, DROP DTR AND HANG UP THE LINE.F>; 5.3 IF CARRIER OR CTS IS OFF, NO ACTION. (LINE STILL WITHOUT(; CARRIER, WAIT FOR CARRIER TO RETURN.)9; 5.4 IF CARRIER AND CTS ARE BOTH ON, CLEAR WAITING FLAG.T5; (LINE RETURNED TO NORMAL CONDITION AFTER TEMPORARY ; LOSS OF CARRIER.);A; IN EITHER CASE:E ; CC-V 0 E"; CC-C 0 IF A CALL WAS ANSWERED; 1 NO ACTION ; 1,; CC-C 0 CALLER SHOULD ENABLE DTR AND RTS'; 1 CALLER SHOULD DISABLE DTR AND RTS ;P; REGISTERS ALTERED: R2,R4;-;F;R4MODISR::BIT #U2.RMT,U.CW2-U.TSTA(R5) ;;;REMOTE LINE? BEQ 47$ ;;;N - IGNORET COMB R4 ;;;INVERT FLAGS + ROLB R4 ;;;GET INVERTED RING FLAG IN CC-C 2 MOVB U.STS-U.TSTA(R5),R2 ;;;GET DSB AND CRW FLAGS- BIC #^C,R2 ;;;CLEAR JUNK BITSE ASSUME US.DSB,2 ASSUME US.CRW,49 JMP @MDSP(R2) ;;;DISPATCH ACCORDING TO DSB AND CRW FLAGSN;R/; CASE 2 - DISABLED AND NOT WAITING FOR CARRIERO; 0MODI2:: BIT #2,$TTPRM ;;;ENABLE DTR BEFORE RING? BNE 3$ ;;;Y - JUMP& BCS 30$ ;;;RING NOT SEEN - NO ACTION? MOVB #M$$ANS+1,U.TMTI-U.TSTA(R5) ;;;SET TIMER = M$$ANS SECONDSI7 BISB #US.CRW,U.STS-U.TSTA(R5) ;;;SET CARRIER-WAIT FLAGR/ SEV ;;;SET CC-V (CC-C IS CLEAR) TO RAISE DTR  RETURNB3$: ROL R4 ;;;CHECK DSR FLAGS5 BVS 25$ ;;;DSR OFF - NO ACTION (BUT LEAVE DTR HIGH)M= BIT #600,R4 ;;;DSR ON (OR N/A) - HOW ABOUT CARRIER AND CTS? 700{{TADATADATADATADATADATADATADATADATA BEQ MANS ;;;CARRIER AND CTS BOTH ON - ANSWER THE CALLE- BCC 30$ ;;;DSR IS NOT AVAILABLE - NO ACTIONO( TST R4 ;;;DSR IS AVAILABLE - IS IT ON? BEQ 30$ ;;;N - JUMPCB5$: MOVB #M$$ANS+1,U.TMTI-U.TSTA(R5) ;;;SET TIMER = M$$ANS SECONDS# BR 20$ ;;;GO AND WAIT FOR CARRIER;; +; CASE 3 - DISABLED AND WAITING FOR CARRIERI;L"MODI3:: ROL R4 ;;;CHECK DSR FLAGS- BVS 45$ ;;;DSR WENT AWAY - HANG UP THE LINE-; BIT #600,R4 ;;;DSR ON (OR N/A) - CARRIER AND CTS BOTH ON?  BNE 30$ ;;;N - JUMPR BR MANS ;;;ANSWER CALL;R.; CASE 4 - ENABLED AND NOT WAITING FOR CARRIER;;"MODI4:: ROL R4 ;;;CHECK DSR FLAGS- BVS 45$ ;;;DSR WENT AWAY - HANG UP THE LINE3/ BIT #600,R4 ;;;CARRIER AND CTS STILL BOTH ON?A BEQ 30$ ;;;Y - JUMPA= BIT #1,$TTPRM ;;;DROP LINE IMMEDIATELY UPON LOSS OF CARRIER?- BNE 45$ ;;;Y - JUMPOA MOVB #M$$CAR+1,U.TMTI-U.TSTA(R5) ;;;SET TIMER FOR M$$CAR SECONDSR BR 20$ ;;;GO AND SET WAIT FLAG;#*; CASE 5 - ENABLED AND WAITING FOR CARRIER;TMODI5:: BCC 45$ ;;;RING - JUMPB ROL R4 ;;;CHECK DSR FLAGS - BVS 45$ ;;;DSR WENT AWAY - HANG UP THE LINE; SEC ;;;SET CC-C) BIT #600,R4 ;;;CARRIER AND CTS BOTH ON?Y BNE 40$ ;;;N - JUMPB( BIT #1,$TTPRM ;;;DROP LINE IMMEDIATELY?& BNE 40$ ;;;NO - RETURN TO THE CALLER( BR 50$ ;;;BOTH ON - CLEAR WAITING FLAG ;;;AND EXIT WITH CC-C = 1M610$: MOVB #1,U.TMTI-U.TSTA(R5) ;;;SET TIMER = 1 SECOND;20$: BISB #US.CRW,U.STS-U.TSTA(R5) ;;;SET CARRIER-WAIT FLAG525$: CLV ;;;SHOW NO ACTION#30$: SEC ;;;SHOW NO CALL ANSWEREDJ 40$: RETURN ;;'; COME HERE TO HANG UP LINE IMMEDIATELYW;-445$: CALL 10$ ;;;START TIMER, SET CARRIER-WAIT FLAG@47$: .WORD SEC!SEV ;;;SET CC-V AND CC-C TO DROP DTR UPON RETURN RETURNP N;M;I;+"; SUBROUTINE MANS - ANSWER A CALL.;L; INPUT:; R5 POINTER TO U.TSTA;N ; OUTPUT: =; UCB IS INITIALIZED. DISABLE AND CARRIER-WAIT FLAGS CLEARED.E#; CC-C 0 TO INDICATE CALL ANSWERED.,;T; REGISTERS ALTERED: NONE-;-;A;MANS:: .IF DF USECDL!USECDH!USECDZ .IFTF ;USECDL!USECDH!USECDZ. BIS #S2.FLF,2(R5) ;;;INITIALIZE STATUS WORD 2 CLC ;;;AND CLEAR CC-C .IFFI' TST (R5)+ ;;;POINT TO 2ND STATUS WORDS: BIC #S2.WRA!S2.WRB!S2.CR,(R5)+ ;;;INITIALIZE STATUS WORDS& BIC #S3.FDX!S3.8BC!S3.RAL!S3.PTH,(R5)+ ;;;CLEAR FULL DUPLEX, 8 BIT CHARACTERS,S% ;;;READ-ALL, NO-ECHO AND PASSTHRUD BIS #S3.ACR,(R5)+ ;;;SET ACRC' BIC #^C,(R5) ;;;R SUB #6,R5 ;;;POINT TO U.TSTA' CLR U.TST5-U.TSTA(R5) ;;;CLEAR U.TST5UA BIC #U2.CRT!U2.HLD!U2.L3S!U2.VT5!U2.ESC,U.CW2-U.TSTA(R5) ; DD168;( ;;;INITIALIZE CHARACTERISTICS WORD 2+ BIC #U3.UPC,U.CW3-U.TSTA(R5) ;;;AND WORD 3T( MOV #72.,U.CW4-U.TSTA(R5) ;;;AND WORD 47 CLRB U.TTYP-U.TSTA(R5) ;;;SET TERMINAL TYPE TO UNKNOWN! .ENDC , .IF DF R$$MPL!A$$CLI / BIC #UM.CLI,U.MUP-U.TSTA(R5) ;;;SET MCR AS CLIO .ENDC .IF DF M$$CLI 5/ MOV #$MCRPT,U.CLI-U.TSTA(R5) ;;;SET MCR AS CLI(  .ENDC # .IF DF T$$SERA BIC #UM.SER!UM.CMD,U.MUP-U.TSTA(R5) ;;;RESET SERIAL COMMAND MODE. .ENDC .IF DF D$$M11!D$$ZMD!D$$VMD ASSUME S4.ABD,100000Z2 TST 6(R5) ;;;AUTO-BAUD DETECT SET FOR THIS LINE?- BPL 50$ ;;;IF NOT,DON'T START ABD DETECTION;B BIS #S5.ABP,U.TST5-U.TSTA(R5) ;;;Y - INITIATE AUTO-BAUD DETECTION; MOV #S.4800,U.CW4-U.TSTA(R5) ;;;SET INITIAL AUTOBAUD SPEEDU .ENDC ;D$$M11!D$$ZMD!D$$VMD>50$: CLRB U.TMTI-U.TSTA(R5) ;;;STOP MODEM TIMER AND CLEAR CC-C)60$: BICB #US.DSB!US.CRW,U.STS-U.TSTA(R5)R) ;;;ENABLE LINE AND CLEAR WAITING FLAG;# RETURN ;;;RETURN WITH CC-V CLEAR . .DSABL LSBD M $;+5; HLMTIM - TIME-OUT ON DM11-BB, DL11-E, DHV11 OR DZ11D;C; INPUT:; R5 POINTER TO U.TSTA; ; OUTPUT:T; IF CARRIER-WAIT FLAG = 0:AD; IF LINE IS LOCAL, RETURN TO CALLER WITH Z-BIT SET, WHICH INDICATES&; THAT DTR AND RTS SHOULD BE DROPPED.G; IF LINE IS REMOTE, RETURN TO CALLER WITH Z-BIT CLEAR, WHICH INDICATES;'; THAT DTR AND RTS SHOULD BE ASSERTED.C;U; ELSE:C8; CALLER CALLED AS COROUTINE WITH INTERRUPTS LOCKED OUT.3; ON RETURN FROM CALLER, THE FOLLOWING IS EXPECTED:S; ; R500|{ D%B11110010 UNCHANGED; DTR AND RTS DROPPED.;-;B;L>HLMTIM::BITB #US.CRW,U.STS-U.TSTA(R5) ;;;ARE WE STILL WAITING? BNE 20$ ;;;Y - JUMPR. BIT #2,$TTPRM ;;;DON'T ASSERT DTR UNTIL RING?4 BEQ 10$ ;;;Y - JUMP (LEAVING CC-Z SET TO DROP DTR)0 BIT #U2.RMT,U.CW2-U.TSTA(R5) ;;;IS LINE REMOTE?710$: RETURN ;;;RETURN TO CALLER WITH Z-BIT INDICATION :20$: SEZ ;;;SET Z-BIT TO TELL CALLER TO DROP DTR AND RTS+ CALL @(SP)+ ;;;CALL CALLER AS A COROUTINE5 CALL @(SP)+ ;;;ALLOW INTERRUPTS (RETURN TO LOCKI IS " ;;;ASSUMED TO BE ON THE STACK)= MOVB #M$$DIS+1,U.TMTI-U.TSTA(R5) ;SET TIMER = M$$DIS SECONDSW- BITB #US.DSB,U.STS-U.TSTA(R5) ;LINE ENABLED?# BEQ MHUP ;Y - HANG UP THE LINE2 BICB #US.CRW,U.STS-U.TSTA(R5) ;CLEAR WAITING FLAG RETURN T;2;T;+; SUBROUTINE MHUP - HANG UP.%; MAY ONLY BE CALLED AT SYSTEM STATE!I;Z; INPUT:; R5 POINTER TO U.TSTA8; US.DSB 0 TO PREVENT THAT A RING IS ANSWERED BEFORE THE; TERMINAL IS LOGGED OFFN0; LINE PHYSICALLY HUNG UP (DTR AND RTS DROPPED).;I ; OUTPUT:;&; IF ANY I/O WAS ACTIVE, IT IS KILLED.5; IF TERMINAL WAS LOGGED ON, A BYE COMMAND IS QUEUED.B%; IF BYE COMMAND SUCCESSFULLY QUEUED:L; US.DSB 1 (LINE DISABLED) ; US.CRW 0 (NOT WAITING)T; ELSE:R; US.DSB 0 (LINE ENABLED); US.CRW 1 (WAITING) ;R#; REGISTERS ALTERED: R0,R1,R2,R3,R4 ;-;A;Y5MHUP:: MOV #IE.DNR&377,R0 ;SET DEFAULT STATUS, IE.DNRS!LHMHUP::MOV R0,-(SP) ;SAVE STATUSSB BISB #US.CRW,U.STS-U.TSTA(R5) ;ASSUME FAILURE TO SEND BYE COMMAND+ ;THIS ALSO PREVENTS PROCESSING OF INPUT  ;INTERRUPTST .IF DF T$$SPLE MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;MAP UCBX JUST IN CASE (IT MAY NOT BED4 ;MAPPED IF WE COME HERE FOR POWER UP PROCESSING) .ENDC ;T$$SPL& CALL I1CTXL ;FLUSH TYPE-AHEAD BUFFER4 BIC #S5.ABP,U.TST5-U.TSTA(R5) ;RESET AUTO-BAUD MODE .IF DF T$$SPL, MOV #120000,R4 ;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPLS" MOV U.TUX-U.TSTA(R5),R4 ;GET UCBX BEQ 10$ ;NONE - JUMP .ENDC ;T$$SPL' ASSUME U.TITI&1,0 ;U.TITI MUST BE EVENE ASSUME U.TOTI,U.TITI+1 . CLR U.TITI(R4) ;CLEAR INPUT AND OUTPUT TIMERS, MOV (SP),R0 ;GET STATUS TO RETURN TO TASK . CALL KILLI1 ;KILL INPUT (IF ANY IN PROGRESS), MOV (SP),R0 ;GET STATUS TO RETURN TO TASK / CALL KILLO1 ;KILL OUTPUT (IF ANY IN PROGRESS)P ;WITH STATUS IE.DNR 010$: TST (SP)+ ;GET RID OF STATUS OFF THE STACK S .IF DF M$$MUP O2 BIT #U2.LOG,U.CW2-U.TSTA(R5) ;TERMINAL LOGGED ON? BNE 20$ ;N - JUMP  .IF DF T$$SPC# CLR R1 ;SET STATUS TO REQUEST BYEI MOV R5,R2 ;SET UCB ADDRESS SUB #U.TSTA,R2 ;U" CALL $QCNTP ;QUEUE A BYE COMMAND .IFF ;T$$SPC0. MOV #M$$CRB,R1 ;GET CLI COMMAND BUFFER LENGTH( CALL $ALOCB ;ALLOCATE A CLI CMD BUFFER BCS 40$ ;FAILED - EXIT MOV R0,R1 ;COPY BUFFER POINTER TST (R0)+ ;SKIP OVER LINK WORD MOV R5,R2 ; SUB #U.TSTA,R2 ;GET UCB ADDRESS! MOV R2,(R0)+ ;INSERT UCB ADDRESSP% MOV #"BY,(R0)+ ;INSERT "BYE" COMMANDR MOV #'E!,(R0)+N" CALL $QMCR ;QUEUE COMMAND TO MCR .ENDC ;T$$SPC U .ENDC ;M$$MUP 2?; THE LINE MAY HAVE BECOME NON-REMOTE. IF SO, LEAVE IT ENABLED.E;M/20$: BIT #U2.RMT,U.CW2-U.TSTA(R5) ;REMOTE LINE?I BEQ 30$ ;N - JUMPH .IF DF T$$MHU/ BIT #S3.MHE,4(R5) ;IS CHARACTERISTIC ENABLED? BEQ 25$ ;BR IF NOF .IF DF T$$SPL! MOV #120000,R4 ;POINT TO UCBX. 2 .IFF ;T$$SPLA' MOV U.TUX-U.TSTA(R5),R4 ;POINT TO UCBX  .ENDC ;T$$SPL# MOV U.TMHA(R4),R1 ;GET ACB ADDRESSV .IF DF T$$OVL MOV #QUEAEN,-(SP) CALL MPROT ;QUE AST TO TASK; .IFF ;T$$OVLC) CALL QUEAEN ;QUEUE AST TO ATTACHED TASKR .ENDC ;T$$OVL .ENDC ;T$$MHU25$:+ BISB #US.DSB,U.STS-U.TSTA(R5) ;Y - DISABLE;30$: BICB #US.CRW,U.STS-U.TSTA(R5) ;CLEAR CARRIER-WAIT FLAG 40$: RETURN ;C A .ENDC ;T$$MOD B;F;F .ENDF DF T$$SPL! MOV #120000,R4 ;POINT TO UCBX. 2 .IFF ;T$$SPLA' MOV U.TUX-U.TSTA(R5),R4 ;POINT TO UCBX  .ENDC ;T$$SPL# MOV U.TMHA(R4),R1 ;GET ACB ADDRESSV .IF DF T$$OVL MOV #QUEAEN,-(SP) CALL MPROT ;QUE AST TO TASK; .IFF ;T$$OVLC) CALL QUEAEN ;QUEUE AST TO ATTA00 |{TADATADATADATADATADATADATADATADATA .TITLE TTODNA .IDENT /06.01/N;6; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;G<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;I;R; 30-JAN-78 PETER WANNHEDENC; ; PREVIOUSLY MODIFIED BY:C;; P. WANNHEDEN; D. R. DONCHINE ; T. LEKAS ; S. ADAMS;L;A; MODIFIED BY:;; L. KOGAN 06-JUN-85 05.06*; LK608 -- FIX ^R PROCESSING AFTER IO.WBT;2; L. KOGAN 02-NOV-85 06.015; LK705 -- MAKE 11M AND 11M+ TTDRV MODULES IDENTICAL ;7 .PSECT MAP5.6; ;+!; ODONE - OUTPUT DONE PROCESSING.G; ; INPUT:; R5 POINTER TO U.TSTA;C ; OUTPUT:Y&; THE DATABASE IS UPDATED AS REQUIRED.,; ANOTHER OUTPUT OPERATION MAY BE INITIATED.;N; REGISTERS ALTERED: R2,R3,R4V;-;M;F .ENABL LSB;..SBTTL ODONE - OUTPUT DONE; EODONE:: BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT INTERRUPT UNEXPECTED?0+ ;;;(COULD HAPPEN FOR EXAMPLE IF WE COMEW! ;;;HERE WHEN ABORTING OUTPUT) BNE 40$ ;;;Y - JUMPD ASSUME US.OIU,1. INCB U.STS-U.TSTA(R5) ;;;NOW IT IS UNEXPECTED10$: ;;;REFERENCE LABEL .IF DF T$$SPL5 MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;;;MAP UCBX AND TABUF . MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPL.$ MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX1 BEQ 40$ ;;;NONE - JUMP (THIS CAN ONLY HAPPEN IFO( ;;;WE COME HERE TO DO A SPECIAL ECHO ;;;SUCH AS BELL) .IFTF ;T$$SPL& CLRB U.TOTI(R4) ;;;CLEAR OUTPUT TIMER$ TST U.TCO(R4) ;;;DOING TASK OUTPUT? BNE 20$ ;;;Y - JUMP* BIT #S2.BEL,2(R5) ;;;BELL ECHO REQUESTED? BNE BELL1 ;;;Y - JUMP:. ASSUME S1.OBY,100 ;S1.OBY MUST BE IN LOW BYTE$ BICB #S1.OBY,@R5 ;;;SET OUTPUT FREE ASSUME S1.IBY,200 BPL CFGRQ ;;;INPUT FREE - JUMP< TSTB U.TISV(R4) ;;; CHECK IF IN THE MIDDLE OF ^R PROCESSING2 BNE LK1 ;;; YES GOTO FINISH ECHOING INPUT BUFFER. BIT #S1.DSI,@R5 ;;;INPUT PROCESSING DISABLED? BNE 40$ ;;;Y - JUMP.5LK1: CALL ECHD1 ;;;INPUT BUSY - ENTER INPUT ROUTINES ;;;FALL THRU TO "NXTIC"O.PAGE>.SBTTL NXTIC - GET NEXT INPUT CHARACTER FROM TYPE-AHEAD BUFFER;;+:; NXTIC - GET NEXT INPUT CHARACTER FROM TYPE-AHEAD BUFFER.; ; INPUT:; R5 POINTER TO U.TSTA; ; OUTPUT:M<; IF A CHARACTER CAN BE OBTAINED FROM THE TYPE-AHEAD BUFFER,8; AND THE CHARACTER CAN BE PROCESSED, IT IS REMOVED FROM7; THE TYPE-AHEAD BUFFER AND ICHAR2 IS CALLED TO PROCESS5; THE CHARACTER.;D?; IF THERE IS CURRENTLY AN IO.RSD OUTSTANDING GET THE CHARACTER-(; FROM THE APPROPRIATE TYPEAHEAD BUFFER.;N; ELSE A RETURN IS EXECUTED.;-;X;NNXTIC::C .IF DF B$$MAP2 ASSUME B$$MAP,1 ;;;THERE CAN ONLY BE ONE TERMINAL% ;;;THAT SUPPORTS IO.RSD CURRENTLY . CALL RSDPRC ;;;CAN WE PROCESS A SPECIAL DATA ;;;CHARACTER IF ANY? BCC 12$ ;;;Y - GO PROCESS IT .ENDC ;B$$MAP* CALL GCTAB ;;;GET A CHARACTER FROM TABUF4 BCS 15$ ;;;IF CS, NONE THERE...CHECK INPUT TIMEOUT" CALL IPROC ;;;CAN WE PROCESS IT? BCS 40$ ;;;N - RETURN / CALL RCTAB ;;;Y - REMOVE CHARACTER FROM TABUFB&11$: CALL ICHAR2 ;;;PROCESS CHARACTER BR NXTIC ;;;LOOP .IF DF B$$MAP;=; R4 CONTAINS THE I/O PACKET ADDRESS OF AN IO.RSD FROM RSDPRC ;P-12$: MOV I.PRM+10(R4),R2 ;;;GET THE DATA TYPE ASL R2 ;;;MAKE IT A WORD INDEX8 MOV T.RSDT(R2),R2 ;;;GET THE ADDRESS OF THE APPROPRIATE ;;;TYPEAHEAD BUFFER;; >; GET THE CHARACTER, IF ANY, FROM THE SPECIAL TYPEAHEAD BUFFER;T% INC R2 ;;;POINT TO RETRIEVE POINTER? TSTB 1(R2) ;;;BUFFER EMPTY?L9 BEQ 40$ ;;;Y - NO MORE CHARACTERS, TRY NORMAL TYPEAHEADA& MOVB (R2),R3 ;;;GET RETRIEVE POINTER+ INCB (R2) ;;;UPDATE THE RETRIEVAL POINTERH CMPB (R2),2(R2) ;;;WRAP-AROUND? BNE 13$ ;;;N - JUMP:3 CLRB (R2) ;;;Y - RESET POINTER TO START OF BUFFER;*13$: DECB 1(R2) ;;;DECREMENT ACTIVE COUNT ADD #3,R2 ;;;POINT TO THE DATA2 ADD R2,R3 ;;;POINT TO NEXT CHARACTER TO RETRIEVE CLR R2 ;;;PREPARE FOR BISB3 BISB (R3),R2 ;;;PUT THE CHARACTER IN THE LOW BYTE $ BR 11$ ;;;GO PROCESS THE CHARACTER .ENDC ;B$$MAP; K; THERE IS NOTHING IN THE TYPEAHEAD BU00|{ D%B11110010FFER. SEE IF WE NEED TO TIME-OUT THER; INPUT REQUEST.;T15$:= BIT #S5.ITI,U.TST5-U.TSTA(R5) ;;;IMMEDIATE TIMEOUT ON INPUT? ! BEQ 40$ ;;;IF EQ, NO...ALL DONES .IF DF T$$SPL# MOV #120000,R4 ;;;SET UCBX POINTERM .IFF ;T$$SPL, MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX POINTER BEQ 40$ ;;;IF EQ, NONE...EXITE .ENDC ;T$$SPL ASSUME U.TCI,0S6 TST (R4) ;;;IS THERE A CURRENT INPUT REQUEST PACKET? BEQ 40$ ;;;IF EQ, NO...GIVE UP) TST @(R4) ;;;IS THERE ALREADY A STATUS?  BNE 40$ ;;;BR IF YES. MOV #IS.TMO,@(R4)+ ;;;SET A COMPLETION STATUS6 CALLR IDONE ;;;COMPLETE INPUT REQUEST WITH A TIMEOUT.PAGE D.SBTTL CFGRQ - CONDITIONALLY FORK TO GET A REQUEST PACKET FROM QUEUE;#;+@; CFGRQ - CONDITIONALLY FORK TO GET A REQUEST PACKET FROM QUEUE.;,; INPUT:; R5 POINTER TO U.TSTA;I ; OUTPUT:.>; IF THERE IS A PACKET IN THE QUEUE THAT MAY BE PROCESSED NOW,3; A FORK REQUEST IS QUEUED TO GET A REQUEST PACKET. ;-;.;V%CFGRQ:: CALL TSTRQ ;;;TEST I/O QUEUE / ;;;RETURN IF NOTHING WORTH FORKING IN QUEUER* MOV #FR.GRQ,R3 ;;;FORK/GET REQUEST PACKET BR 30$ ;;;;UD20$: MOV #FR.ORD,R3 ;;;FORK/OUTPUT REQUEST DONE (AT LEAST PARTIALLY)&30$: CALLR FORK ;;;QUEUE FORK REQUEST; ;R.SBTTL BELL - OUTPUT A BELL ;E;+; BELL - OUTPUT A BELL.;N; INPUT:; R5 POINTER TO U.TSTA;U ; OUTPUT:F6; IF ECHO IS SUPPRESSED, IMMEDIATE RETURN (NO ACTION).3; ELSE A BELL IS OUTPUT IF POSSIBLE, OR FLAGGED FORT; OUTPUT AT FIRST OPPORTUNITY.; ; REGISTERS ALTERED: R2,R3,R4R;-;T;G(BELLL:: CALL LOCKI ;LOCK OUT INTERRUPTS*BELL:: BIT #S1.RNE,@R5 ;;;ECHO SUPPRESSED? BNE 40$ ;;;Y - RETURNF;/;P6; IF TRANSMITTER IS FREE, THE SPECIAL ECHO IS STARTED.3; IF TRANSMITTER IS BUSY, THE FLAG IS SET IN U.TSTAB1; TO FORCE THE SPECIAL ECHO AT FIRST OPPORTUNITY.:; ;P BIS #S2.BEL,2(R5) ;;;SET CR? BIT #S1.DSI!S1.OBY,@R5 ;;;OUTPUT BUSY OR FORK PROCESSING BUSY?E BEQ 10$ ;;;NEITHER - DO IT NOW;GM; A SPECIAL ECHO MAY BE DELAYED BECAUSE FORK PROCESSING IS BUSY (S1.DSI SET).-;T40$: RETURN ;;;Y - WAITL; .DSABL LSBS;E;:+BELL1: BIC #S2.BEL,2(R5) ;;;CLEAR BELL FLAG$& MOV #ASBELL,R3 ;;;POINT TO BELL CHAR./ BR ECHCHR ;;;GO AND OUTPUT A SINGLE CHARACTERA;I;R.PAGEY4.SBTTL ECHSTR, ECHCHR - ECHO A STRING OR A CHARACTER; ;+; ECHSTR - ECHO A STRING.;S; INPUT:; R2 STRING LENGTH; R3 POINTER TO THE STRING; R4 POINTER TO UCBX; R5 POINTER TO U.TSTA;I; ALTERNATE ENTRY - ECHCHR:; SAME AS ECHSTR, BUT PRESETS R2 TO 1 TO ECHO 1 CHARACTER.; ALTERNATE ENTRY - ECHRLR?; SAME AS ECHCHR, BUT LOCKS OUT INTERRUPTS BEFORE THE OPERATIONR&; AND ALLOWS INTERRUPTS BEFORE RETURN.;P; REGISTERS ALTERED: R2,R3,R4 ;-;N;U(ECHRL:: CALL LOCKI ;LOCK OUT INTERRUPTS'ECHCHR::MOV #1,R2 ;;;STRING LENGTH = 1A .IF DF T$$ACD, BR ECHSTR ;;;SET UP UCBX FOR BUFFERED ECHO=MECHO:: BIC #S2.OBF,2(R5) ;;;INDICATE NON-BUFFERED MULTI-ECHOX. CLR U.TFOB(R4) ;;;SET EMPTY MULTI-ECHO BUFFER$ ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+2) BR ECHSET ;;;SET UP UCBX FOR MULTI-ECHO ;ECHSTR::BIS #S2.OBF,2(R5) ;;;SET UP UCBX FOR NON-MULTI-ECHOF ADD #U.TOP,R4 ;;;POINT TO U.TOP .IFF 'ECHSTR::ADD #U.TOP,R4 ;;;POINT TO U.TOP, .IFTF! CLR (R4)+ ;;;U.TOP <-- 0 (ECHO)U2ECHSET: MOV R3,(R4)+ ;;;U.TOP+2 <-- BUFFER ADDRESS ASSUME U.TOC,U.TOP+4$ MOV R2,@R4 ;;;U.TOC <-- BYTE COUNT! BR STARTX ;;;START TRANSMISSION;;D;T;+*; STARTX - START TRANSMISSION OF A BUFFER.;E; INPUT:; R5 POINTER TO U.TSTA; U.TOP+2 BUFFER ADDRESS; U.TOC BYTE COUNT; 5; CALLS CONTROLLER-DEPENDENT ROUTINE TO START OUTPUT.U+; NOTE - MUST BE CALLED ON DEVICE PRIORITY!;;NC; ALTERNATE ENTRY: STAXL - START TRANSMISSION OF A LIST OF BUFFERS..;F; INPUT:; R4 POINTER TO UCBX; R5 POINTER TO UCB3'; U.TFOB POINTER TO FIRST OUTPUT BUFFERS8; EACH BUFFER CONTAINS A LINK TO THE NEXT BUFFER IN THE1; FIRST WORD, AND BYTE COUNT IN THE SECOND WORD.T;X; REGISTERS ALTERED: R2,R3,R4E;-;;N-STAXL:: MOV U.TFOB(R4),R2 ;;;GET FIRST BUFFERA ADD #U.TOP,R4 ;;;POINT TO U.TOP% CALL UPUB ;;;SET00|z|TADATADATADATADATADATADATADATADATA UP UCBX FOR OUTPUTT .IFTT. BIS #S2.OBF,2(R5) ;;;INDICATE BUFFERED OUTPUT .ENDC*STARTX::BIS #S1.OBY,@R5 ;;;SET OUTPUT BUSY ASSUME US.OIU,17 DECB U.STS-U.TSTA(R5) ;;;SET OUTPUT INTERRUPT EXPECTED . .IFT ;T$$SPL . MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPLF$ MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX .ENDC ;T$$SPL2 MOVB OPTIMR,U.TOTI(R4) ;;;INITIALIZE OUTPUT TIMER ASSUME CT.STA,0( CLR R2 ;;;SET INDEX FOR "START OUTPUT"1 CALLR CTRD ;;;CALL CONTROLLER DEPENDENT ROUTINER;T;T .ENDFTT. BIS #S2.OBF,2(R5) ;;;INDICATE BUFFERED OUTPUT .ENDC*STARTX::BIS #S1.OBY,@R5 ;;;SET OUTPUT BUSY ASSUME US.OIU,17 DECB U.STS-U.TSTA(R5) ;;;SET OUTPUT INTERRUPT EXPECTED . .IFT ;T$$SPL . MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPLF$ MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX .ENDC ;T$$SPL2 MOVB OPTIMR,U.TOTI(R4) ;;;INITIALIZE OUTPUT TIMER ASSUME CT.STA,0( CLR R2 ;;;SET INDEX FOR "START OUTPUT"1 CALLR CTRD ;;;CALL CONTROLLER DEPEND .TITLE TTOISF .IDENT /05.04/;; 6; COPYRIGHT (c) 1983 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;T<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ;M; 23-JAN-78 PETER WANNHEDENR;O; PREVIOUSLY MODIFIED BY:C;R; P. WANNHEDEN; D. R. DONCHIN ; T. LEKAS;-; MODIFICATIONS:; ; D. R. DONCHIN 05-JUN-83 05.01,; DD173 -- FIX MINOR PROBLEMS IN DHV11 CODE;N; D. R. DONCHIN 14-SEP-83 05.02U ; DD179 -- ADD HOSTSYNC SUPPORT; ; S. C. ADAMS 23-APR-84 05.03A4; SA170 -- CHANGE S4.XOF,XON,HPC TO S5. XOF,XON,HPC.; CHANGE S1.CTS TO S2.CTS. AND CHANGE S1.OBF;Y; S. C. ADAMS 21-MAY-84 05.04C(; SA195 -- ELIMINATE REDUNDANT BIT TEST .PSECT MAP5; 2; PROFESSIONAL 300 SERIES PRINTER PORT DEFINITIONS; .PDBUF = 173400 ;RECEIVER DATA BUFFER REGISTERPSTS = 173402 ;STATUS REGISTERCPMODE = 173404 ;MODE REGISTER!PCMND = 173406 ;COMMAND REGISTER;:; PROFESSIONAL 300 SERIES INTERRUPT CONTROLLER DEFINITIONS;O4ICCSR = 173202 ;INTERRUPT CONTROLLER 0 CSR REGISTER5PRINTR = 5 ;PRINTER RECEIVER INTERRUPT REQUEST LEVELT8PXINTR = 6 ;PRINTER TRANSMITTER INTERRUPT REQUEST LEVEL*CLSIMR = 50 ;CLEAR SINGLE IMR BIT COMMAND)STSIRR = 130 ;SET SINGLE IRR BIT COMMAND3(STSIMR = 70 ;SET SINGLE IMR BIT COMMAND; ;7;+*; COMMON OUTPUT INTERRUPT SERVICE ROUTINE.1; USED BY FOLLOWING CONTROLLER TYPES: DJ, DL, DZ.T;; INPUT: ; R2 BITMASK FOR TRANSMIT ENABLE; R3 CSR ADDRESS; R5 POINTER TO U.TSTA;F ; OUTPUT:O,; NEXT CHARACTER IS OUTPUT, IF THERE IS ONE.:; IF NECESSARY, A SWITCH IS MADE TO THE NEXT OUTPUT BUFFER"; (ONLY IF DOING BUFFERED OUTPUT).5; IF NO MORE CHARACTERS TO OUTPUT, ODONE IS CALLED TOI!; PERFORM OUTPUT-DONE PROCESSING.S;L; REGISTERS ALTERED: R2,R3,R4 ;-;I;E .MCALL HWDDF$,UCBDF$7;+* HWDDF$ ;DEFINE HARDWARE RELATED SYMBOLS UCBDF$ ;DEFINE UCB SYMBOLSR .ENABL LSB  .IF DF D$$J11!D$$L11!D$$Z11;T;SOUTISR:: .IF DF R$$CON* BITB #US.OFL,U.ST2-U.TSTA(R5) ;;;OFFLINE? BNE 110$ ;;;Y - IGNORE .ENDC;/; DETERMINE IF AN XOFF OR XON SHOULD BE OUTPUT.U;UK BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;ANY HIGH PRIORITY OUTPUT REQUEST PENDING?O BEQ 7$ ;;;N - JUMP1 BIT #S5.XOF,U.TST5-U.TSTA(R5) ;;;OUTPUT AN XOFF?L BEQ 5$ ;;;N - JUMP;; OUTPUT AN XOFF.U;F6 BIC #S5.XOF,U.TST5-U.TSTA(R5) ;;;Y - RESET INDICATION$ MOVB ASXOFF,6(R3) ;;;OUTPUT AN XOFF5 RETURN ;;;CONTINUE NORMAL OUTPUT AT NEXT INTERRUPT:;O; THE HIGH PRIORITY OUTPUT IS NOT FOR XOFF, MUST BE THEN FOR XON, SO OUTPUT IT.G;E95$: BIC #S5.XON,U.TST5-U.TSTA(R5) ;;;RESET XON INDICATIONU" MOVB ASXON,6(R3) ;;;OUTPUT AN XON RETURN;A7$: BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT INTERRUPT UNEXPECTED?B BNE 110$ ;;;Y - IGNORE;;; HANDLE XOFF FROM TERMINAL.;  ASSUME S2.CTS,100000 ( TST 2(R5) ;;;OUTPUT STOPPED BY CTRL-S? BMI 110$ ;;;Y - IGNOREM; ; GET NEXT CHARACTER TO OUTPUT.R;R MOV R2,-(SP) ;;;SAVE R2 .IF DF T$$SPL+ MOV U.TAPR-U.TSTA(R5),@#K00z%|{ D%B11110010DSAR5 ;;;MAP UCBX . MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPL.- MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCB EXTENSIONS .ENDC ;T$$SPL N ADD #U.TOC,R4 ;;;POINT TO U.TOC-10$: DEC @R4 ;;;DECREMENT BYTE COUNT (U.TOC)B BPL 20$ ;;;MORE TO DO - JUMP0 CLR @R4 ;;;THIS BUFFER EXHAUSTED - CLEAR U.TOC TST -(R4) ;;;POINT TO U.TOP+2P6 CALL NXTOB ;;;GET NEXT OUTPUT BUFFER IF THERE IS ONE1 BNE 10$ ;;;DO IT ALL OVER AGAIN WITH NEW BUFFER  BR 100$ ;;;ALL DONE - JUMP20$: TST (SP)+ ;;;CLEAN STACK B .IF DF T$$ACD & BIT #S2.OBF,2(R5) ;;;BUFFERED OUTPUT? BNE 90$ ;;;Y - JUMPU .IF DF D$$H11!D$$V11X< CALL MOUT ;;;GENERATE THE PROPER OUTPUT FOR THE NEXT CHAR./ MOVB R2,6(R3) ;;;OUTPUT THE RETURNED CHARACTER RETURN ;;;R .ENDC ;D$$H11!D$$V11  .ENDC ;T$$ACD .ENDC ;D$$J11!D$$L11!D$$Z11 .IF DF T$$ACD;A; WE ARE HERE TO PERFORM AN ECHO BY FIRST EXPANDING THE CHARACTER;=; AND THEN OUTPUTTING ITS GENERATED ECHO (CALLED MULTI-ECHO). ;P'MOUT:: MOV R3,-(SP) ;;;SAVE CSR ADDRESSF9 MOV U.TFOB-U.TOC(R4),R2 ;;;GET MULTI-ECHO BUFFER ADDRESSE0 BNE 60$ ;;;IT POINTS TO SOME CHARACTERS - JUMP8 MOV -(R4),R2 ;;;GET ADDRESS OF NEXT CHARACTER TO EXPAND INC @R4 ;;;UPDATE POINTERE& MOV -2(R4),@#KISAR6 ;;;MAP THE BUFFER* MOVB (R2),R2 ;;;GET THE CHARACTER ITSELF( MOV $DALED,@#KISAR6 ;;;REMAP THE DRIVER; CALL EXPCHR ;;;EXPAND CHARACTER TO GENERATE PROPER OUTPUTN) BNE 30$ ;;;EXPANSION IS A STRING - JUMP MOV (SP)+,R3 ;;;GET CSR ADDRESS .IF NDF D$$H11&D$$V11, MOVB R2,6(R3) ;;;OUTPUT CHARACTER AS ITSELF .IFTF ;NDF D$$H11&D$$V11R$ RETURN ;;;WAIT FOR NEXT INTERRUPT<30$: BCS 40$ ;;;GENERATE A MULTI-ECHO SEQUENCE - SAVE CHAR?: CMP (R4)+,(R4)+ ;;;N - POINT TO MULTI-ECHO BUFFER POINTER7 BR 50$ ;;;SET UP MULTI-ECHO BUFFER POINTER AND LENGTH ?40$: DEC (R4)+ ;;;NEED CHAR. AGAIN - BACK UP POINTER (U.TOP+2);) INC (R4)+ ;;;AND UPDATE COUNTER (U.TOC)N ASSUME ,U.TTOC?50$: MOV R2,(R4)+ ;;;INSERT MULTI-ECHO SEQUENCE LENGTH (U.TTOC)D; MOV R3,@R4 ;;;INSERT MULTI-ECHO SEQUENCE ADDRESS (U.TFOB)' MOV R3,R2 ;;;PUT ADDRESS WHERE NEEDED 9 BR 70$ ;;;OUTPUT FIRST CHARACTER FROM MULTI-ECHO BUFFERT ASSUME ,U.TFOB960$: INC (R4)+ ;;;DON'T CHANGE COUNT IF DOING MULTI-ECHOT: TST (R4)+ ;;;POINT TO MULTI-ECHO BUFFER ADDRESS (U.TFOB)(70$: MOV (SP)+,R3 ;;;RESTORE CSR ADDRESS .IFF ;NDF D$$H11&D$$V116 MOVB (R2),R2 ;;;GET CHARACTER FROM MULTI-ECHO BUFFER .IFT ;NDF D$$H11&D$$V11; MOVB (R2),6(R3) ;;;OUTPUT CHARACTER FROM MULTI-ECHO BUFFER; .ENDC ;NDF D$$H11&D$$V11D INC @R4 ;;;POINT TO NEXT ONE; DEC -(R4) ;;;SHOW ONE LESS CHARACTER IN MULTI-ECHO BUFFERO BNE 80$ ;;;MORE TO DO - JUMP9 CLR 2(R4) ;;;ALL DONE - CLEAR MULTI-ECHO BUFFER POINTERI80$: RETURN ;;;T 4 .ENDC ;T$$ACD .IF DF D$$J11!D$$L11!D$$Z11 90$: ;;;REFERENCE LABEL .IF DF R$$PRO ASSUME H2.BRG,100000- TST $HFMSK+2 ;;;IS THIS A PRO BRIDGE SYSTEM?  BMI 95$ ;;;IF NE YES& MOVB @-(R4),PDBUF ;;;OUTPUT CHARACTER BR 97$ ;;;AND CONTINUE .IFTF ;R$$PRO*95$: MOVB @-(R4),6(R3) ;;;OUTPUT CHARACTER .IFT ;R$$PROR97$: ;;;REFERENCE LABEL .ENDC ;R$$PRO INC @R4 ;;;UPDATE POINTER  RETURN ;;;RETURNA;D100$: MOV @SP,R2 ;;;RESTORE R2N3 MOV #ODONE,@SP ;;;DO OUTPUT DONE PROCESSING BEFORED ;;;INTERRUPT IS DISMISSED:7110$: BIC R2,4(R3) ;;;DISABLE TRANSMISSION ON THIS LINEG .IF DF R$$PRO; D; FOR THE PROFESSIONAL 300 SERIES MACHINES BOTH METHODS OF EFFECTINGE; THE INTERRUPT ENABLE BITS ARE LEFT IN PLACE SO THAT THE SYSTEM WILLC; WORK ON BOTH THE REAL HARDWARE AND THE BRIDGE SYSTEM. THE BRIDGE:D; SYSTEM CONSISTS OF AN 11/23-PLUS SYSTEM WITH AN INTERFACE ON IT TO; THE CTI BUS.;T?; ON THE REAL HARDWARE THE BIC R2... IS IGNORED. ON THE BRIDGE ?; SYSTEM THE FOLLOWING INSTRUCTION IS IGNORED BECAUSE IT WRITES1; INTO THE BOOT ROMI;L> MOV #STSIMR!PXINTR,ICCSR ;;;DISABLE TRANSMISSION ON THIS LINE ;;;FOR THE PRINTER PORT .ENDC ;R$$PRO RETURN ;;;R  .ENDC ;D$$J11!D$$L11!D$$Z11 T 00z-|.|TADATADATADATADATADATADATADATADATA .DSABL LSBM;L; .ENDON BOTH THE REAL HARDWARE AND THE BRIDGE SYSTEM. THE BRIDGE:D; SYSTEM CONSISTS OF AN 11/23-PLUS SYSTEM WITH AN INTERFACE ON IT TO; THE CTI BUS.;T?; ON THE REAL HARDWARE THE BIC R2... IS IGNORED. ON THE BRIDGE ?; SYSTEM THE FOLLOWING INSTRUCTION IS IGNORED BECAUSE IT WRITES1; INTO THE BOOT ROMI;L> MOV #STSIMR!PXINTR,ICCSR ;;;DISABLE TRANSMISSION ON THIS LINE ;;;FOR THE PRINTER PORT .ENDC ;R$$PRO RETURN ;;;R  .ENDC ;D$$J11!D$$L11!D$$Z11 T .TITLE TTRW .IDENT /09.0/;;6; COPYRIGHT (c) 1988 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;;; 25-JAN-78 PETER WANNHEDEN;; PREVIOUSLY MODIFIED BY:;; P. WANNHEDEN; D. R. DONCHIN ; T. LEKAS ; S. C. ADAMS; R. S. PHILPOTT;; MODIFICATION HISTORY:;; M.W. ZAHAREE 27-SEP-88 9.0C; MWZ006 -- DON'T DEALLOCATE INPUT BUFFER WHEN IO.RPR NOT BUFFERED.0;/; S.C. ADAMS 19-NOV-87 8.0<; SA477 -- DEALLOCATE INPUT BUFFER ON ABORTED READ W/ PROMPT;+; ****** T T R W ******D;DF; THIS MODULE CONTAINS THE ROUTINES TO STARTUP AND COMPLETE A READ ORN; WRITE REQUEST THAT HAS BEEN DEQUEUED FOR A TERMINAL. BOTH TYPES OF REQUESTSI; HAVE THREE PARTS. THE FIRST STEP DOES PRE-PROCESSING OF THE PARAMETERSK; CONTAINED IN THE I/O PACKET NECESSARY TO PROCEED TO THE SECOND STEP. THE8I; SECOND STEP SETS UP BUFFER POINTERS, ETC. FOR THE NEXT PART OF THE DATA0K; TRANSFER. THIS STEP IS REPEATED UNTIL THE TRANSFER FULLY COMPLETES. THEEK; FINAL STEP CLEANS UP AND PASSES THE I/O REQUEST BACK TO THE SYSTEM WITH A H; COMPLETION STATUS. NOTE THAT BOTH SOLICITED AND UNSOLICITED INPUT ARE ; HANDLED BY THE INPUT ROUTINES.;-;O& .SBTTL .MCALLS AND SYMBOL DEFINITIONS .MCALL TTSYM$ TTSYM$ ;DEFINE TF.XXX SYMBOLS .IF DF T$$SPC!T$$CCA!T$$EIO .MCALL PKTDF$3 PKTDF$ ;DEFINE CLI COMMAND BUFFER HEADER OFFSETSP% ;AND ACB OFFSETS AND IOPX OFFSETSD .ENDC ;T$$SPC!T$$CCA!T$$EIO .PSECT MAP5.6.PAGEE2 .SBTTL PPEIO - EXTENDED READ/WRITE PRE-PROCESSING;S;+@; **-PPEIO - PRE-PROCESSING FOR EXTENDED READ AND WRITE (IO.EIO);EG; THIS ROUTINE DOES THE SETUP NECESSARY TO START UP AN EXTENDED READ ORU0; WRITE REQUEST. THE FOLLOWING STEPS ARE TAKEN:?; 1. LOCATE THE I/O PACKET EXTENSION (IOPX) ASSOCIATED WITH THED9; IO.EIO REQUEST'S I/O PACKET. THE IOPX IS REMOVED FROM ; THE IOPX LIST.HB; 2. MOVE THE I/O FUNCTION MODIFIERS FROM THE IOPX TO THE FUNCTION;; CODE FIELD IN THE CURRENT I/O PACKET. THE FUNCTION CODE ;; IS FLAGGED AS AN IO.EIO REQUEST BY SETTING THE HIGH BIT.P?; 3. ALL PARAMETERS THAT WERE EARLIER SAVED IN THE IOPX ARE NOWE8; TRANSFERRED TO THE I/O PACKET FOR THE IO.EIO REQUEST.; 4. THE IOPX IS DEALLOCATED.N>; 5. DISPATCH TO THE ROUTINE FOR HANDLING THE SPECIFIC TYPE OF; I/O REQUEST.H;K; *** NOTE *** AT PRESENT, THIS ROUTINE ASSUMES THAT THE ONLY REQUEST THATHD; WILL GET PASSED TO IT IS AN EXTENDED READ REQUEST (IO.EIO!TF.RLB).D; ANY IO.EIO!TF.WLB OPERATION IS EXPECTED TO HAVE BEEN MAPPED INTO A=; NORMAL IO.WLB REQUEST PRIOR TO BEING QUEUED (WITH NO IOPX).P;M ; INPUTS:#; R3 => CURRENT I/O REQUEST PACKETE; R4 => UCBX FOR THE TERMINAL#; R5 => U.TSTA OF THE TERMINAL UCBIH; U.TRTT(R4) => TERMINATOR TABLE FOR THE READ, IF ANY (SET UP BY FPGRQ).; I.LNK(R3) = 0 ;Q ; OUTPUTS: ; IOPX IS DEALLOCATEDTE; CURRENT I/O PACKET IS SET UP FOR PROCESSING BY "PPRLB" OR "PPRPR1".O; "; REGISTERS MODIFIED: R0, R1, R2;-;. .IF DF T$$EIO ASSUME I.XLNK,0 ASSUME I.XLNK+2,I.XIOP  ASSUME I.XIOP+2,I.XTCBE ASSUME I.XTCB+2,I.XMODE ASSUME I.XMOD+4,I.XRBF  ASSUME I.XRBF+4,I.XRBLT ASSUME I.XRBL+2,I.XTMO4 ASSUME I.XTMO+2,I.XPBFL ASSUME I.XPBF+4,I.XPBLT ASSUME I.XPBL+2,I.XPBV)PPEIO::T$ MOV R5,R0 ;GET COPY OF UCB POINTER> ADD #U.TIXL-U.TSTA,R0 ;MAKE POINTER TO U.TIXL (IOPX LISTHEAD)10$:0 MOV R0,R1 ;MAKE THIS THE PREVIOUS IOPX POINTER< MOV (R1),R0 ;LOCATE THE NEXT005|{ D%B11110010 IOPX (MUST BE HERE SOMEWHERE)A CMP I.XIOP(R0),R3 ;DOES THIS IOPX BELONG TO THE CURRENT REQUEST?O+ BNE 10$ ;IF NE, NO...LOOP TILL WE FIND IT23 MOV (R0),(R1) ;REMOVE THIS IOPX FROM THE WAIT LISTI< ADD #I.XMOD,R0 ;POINT PAST LINK, I/O PACKET AND TCB OFFSETS= MOV (R0)+,I.FCN(R3) ;STORE REQUESTED MODIFIERS IN I/O PACKETV+ TST (R0)+ ;SKIP OVER UNUSED MODIFIER WORDUC BIS #S6.EIO,U.TST6-U.TSTA(R5) ;INDICATE REQUEST IS (WAS) AN IO.EIOK$ MOV R3,R1 ;COPY I/O PACKET ADDRESS6 ADD #I.PRM,R1 ;MAKE A POINTER INTO THE PARAMETER LIST> MOV (R0)+,(R1)+ ;COPY 1.ST ADDRESS DOUBLE WORD OF DATA BUFFER> MOV (R0)+,(R1)+ ;COPY 2.ND ADDRESS DOUBLE WORD OF DATA BUFFER) MOV (R0)+,(R1)+ ;COPY DATA BUFFER LENGTH+ MOV (R0)+,(R1)+ ;COPY TIMEOUT FOR THE READT20$:@ MOV (R0)+,(R1)+ ;COPY 1.ST ADDRESS DOUBLE WORD OF PROMPT BUFFER@ MOV (R0)+,(R1)+ ;COPY 2.ND ADDRESS DOUBLE WORD OF PROMPT BUFFER+ MOV (R0)+,(R1)+ ;COPY PROMPT BUFFER LENGTHW MOV (R0),(R1) ;COPY PROMPT VFC, SUB #I.XPBV,R0 ;POINT BACK TO START OF IOPX MOV R3,-(SP) ;SAVE R3! MOV #I.XLEN,R1 ;GET SIZE OF IOPXR CALL $DEACB ;DEALLOCATE IOPX MOV (SP)+,R3 ;RESTORE R3  .IF DF T$$RPR9 BIT #TF.RPR,I.FCN(R3) ;DID USER REQUEST A READ W/PROMPT?2 BEQ PPRLB1 ;IF EQ, NO...PROCESS AS A NORMAL READ5 JMP PPRPR1 ;GO PROCESS THE PROMPT PART AS AN OUTPUTO .IFF ;T$$RPR( .IF DF B$$MAP- BR PPRLB1 ;PROCESS AS A NORMAL READ REQUEST0 .ENDC ;B$$MAP .ENDC ;T$$RPR .ENDC ;T$$EIO.PAGEM$ .SBTTL INPUT REQUEST PRE-PROCESSING4 .SBTTL . PPRSD - READ-SPECIAL-DATA REQUEST (IO.RSD); ;+:; **-PPRSD - PRE-PROCESSING FOR READ-SPECIAL-DATA (IO.RSD);; **-PPRLB - PRE-PROCESSING FOR READ-LOGICAL-BLOCK (IO.RLB)I;SG; THIS ROUTINE DOES THE SETUP NECESSARY TO START UP AN IO.RSD OR IO.RLBA4; REQUEST. ANY OF THE FOLLOWING STEPS MAY BE TAKEN:@; 1. FOR ENTRY AT "PPRSD", THE HIGH BYTE OF THE FUNCTION CODE IS9; CLEARED, SINCE IT MAY BE NECESSARY TO STORE OTHER READ$ ; MODIFIERS FOR LATER CHECKING.E; 2. FOR ENTRY AT "PPRLB", THE UNSOLICITED INPUT AST CONTROL BLOCK IST:; UNLOCKED IN CASE IT IS LOCKED DUE TO A NOTIFICATION AST<; HAVING BEEN SENT (TF.NOT MODIFIER ON THE ATTACH REQUEST).?; 3. THE I/O REQUEST PACKET BECOMES THE CURRENT REQUEST PACKET.EB; 4. THE MODIFIERS FROM THE READ REQUEST ARE COMBINED WITH CERTAIN<; TERMINAL CHARACTERISTICS TO DEFINE WHAT THE MODIFIERS FOR=; THE CURRENT READ WILL BE. FOR EXAMPLE, IF THE TERMINAL ISS=; SET TO "NOECHO" MODE, THE READ MODIFIER TF.RNE WILL BE SET.:; REGARDLESS OF WHETHER THE USER SPECIFIED IT IN THE QIO.7; THE RESULTING MODIFIERS ARE SAVED IN THE I/O PACKET.A5; 5. THE TIMEOUT REQUEST MODIFIER/VALUE IS PROCESSED.T>; 6. THE APPROPRIATE STATUS BITS ARE ESTABLISHED TO MARK INPUT(; BUSY AND INITIALIZE INPUT PROCESSING.;; 7. A REQUEST FOR "LEADING LINEFEED" IS MADE IF NECESSARY.CF; 8. CONTROL IS PASSED TO THE ROUTINES TO START BUFFERED OR UNBUFFERED!; INPUT, WHICHEVER IS NECESSARY.;S ; INPUTS:"; R3 => CURRENT I/O REQUEST PACKET; R4 => UCBX FOR THE TERMINALE"; R5 => U.TSTA OF THE TERMINAL UCB2; I.LNK(R3) = 0 IF THE REQUEST IS IO.RLB OR IO.RSD@; = 1 IF THIS IS THE READ PART OF A READ AFTER PROMPT REQUEST*; (THE PROMPT OUTPUT HAS BEEN COMPLETED) ; OUTPUTS:IA; R2 => FIRST INPUT BUFFER (IF BUFFERED INPUT IS TO BE STARTED)"$; (R4) => CURRENT I/O REQUEST PACKET0; UCB STATUS AND UCBX INITIALIZED TO START INPUT;U"; REGISTERS MODIFIED: R0, R1, R2;-;S .IF DF B$$MAPPPRSD::; CLRB I.FCN+1(R3) ;CLEAR OUT HIGH BYTE OF THE FUNCTION CODEI" BR RLB1 ;CONTINUE IN COMMON CODE .ENDC ;B$$MAP5 .SBTTL . PPRLB - READ-LOGICAL-BLOCK REQUEST (IO.RLB)IPPRLB::P .IF DF T$$EIOE BIC #S6.EIO,U.TST6-U.TSTA(R5) ;INDICATE THAT THIS IS NOT EXTENDED IOI .ENDC ;T$$EIO+ CLRB I.FCN+1(R3) ;CLEAR FLAGS IN HIGH BYTEDPPRLB1:= .IF DF T$$CCAC MOV U.TAST(R4),R0 ;GET UNSOLICITED INPUT AST BLOCK IF THERE IS ONEG! BEQ RLB1 ;IF EQ, NOT ONE...SKIPA BICB #AF.LCK,A.PRM+5(R0) ;UNLOCK THE AST BLOCK IN CASE IT WAS...E ; ...LOCKED DUE TO TF.NOT1 .ENDC ;T$00=|.|TADATADATADATADATADATADATADATADATA$CCARLB1:: BIC #S5.ITI,U.TST5-U.TSTA(R5) ;INDICATE THAT THIS IS NOT  ;IMMEDIATE TIMEOUT ASSUME U.TCI,0. MOV R3,(R4)+ ;SAVE THE CURRENT PACKET ADDRESS;IM; SET UP THE FULL READ MODIFIERS FOR THE CURRENT READ REQUEST. THIS INVOLVESBI; TAKING THE MODIFIERS SPECIFIED WITH THE READ AND "OR'ING" THEM WITH THENK; PERMANENT CHARACTERISTICS FLAGS. NOTE THAT THE MODIFIERS MAY EXTEND INTOAA; THE HIGH BYTE OF I.FCN IF CONTROL WAS PASSED HERE FROM "PPEIO"..K; NOTE: IF THERE IS EVER A READ MODIFIER WITH THE SAME BIT VALUE AS S1.TSY.J; AND S3.TSY, THIS HERE ROB PHILPOTT MEMORIAL BIT SETTING CODE WILL BREAK!; ASSUME TF.RAL,S3.RALH ASSUME TF.RNE,S3.NECS ASSUME TF.RPT,S3.PTH  ASSUME TF.RES,S3.RESC? MOV I.FCN(R3),R0 ;GET ALL READ MODIFIERS (COULD BE FROM PPEIO)I- BIC #4,R0 ;CLEAR MODIFIERS THAT WON'T MAP 9 MOV 4(R5),R1 ;GET THE CURRENT INPUT CHARACTERISTICS BITSA> BIC #^C,R1 ;CLEAN THEM UP9 BIS R1,R0 ;"OR" IN PERM CHARACTERISTICS WITH TEMP FLAGSE< MOV R0,I.FCN(R3) ;SAVE THE COMPLETE FLAGS IN THE I/O PACKET; ; SET UP RST AND RSP;T5 BIT #TF.RST, R0 ;DOING OLD-STYLE READ W/ SPEC. TERM?M BEQ 5$ ;BR IF NO< BIS #S1.RSP!S1.RNF!S1.TNE,R0 ;FORCE SPEC PROC AND NO FILTER5$:A1 BIT #TF.RTT,R0 ;NEW-STYLE READ WITH TERM. TABLE?, BEQ 10$ ;BR IF NOS4 BIS #S1.RST,R0 ;SAY WE'RE USING SPECIAL TERMINATORS10$: .IF DF T$$EIO MOV R0,R1 ;GET FUNCTION CODE ASSUME TF.RDI,S6.RDI  ASSUME TF.RLU,S6.RLUN4 BIC #^C,R1 ;ISOLATE RDI AND RLU BITS9 BIS R1,U.TST6-U.TSTA(R5) ;AND PLOP THEM INTO STATUS WORDR .ENDC ;T$$EIO;R'; SET UP TTSYNC AND PASTHRU AS FOLLOWS:ME; 1. OLD STYLE "TF.RAL" AND "SET /RPA (S3.RAL)" MAP INTO PASTHRU MODEC; WITH TTSYNC DISABLED.E; 2. NEW STYLE "TF.RPT" AND "PASTHRU MODE" ARE INDEPENDENT OF TTSYNC.BA; 3. IF TTSYNC IS DISABLED, TF.RPT IS EQUIVALENT TO OLD "TF.RAL". ;E ASSUME S3.RAL,S1.PTHF ASSUME S3.TSY,S1.TSY 1 BIT #TF.RAL,R0 ;WAS EITHER TF.RAL OR S3.RAL SET?T5 BEQ 20$ ;IF EQ, NO...SKIP TO CHECK FOR PASTHRU MODES: BIC #S1.TSY,(R5) ;CLEAR TTSYNC FOR OLD READ-PASS-ALL MODE8 BIC #S1.TSY,R0 ;CLEAR TTSYNC FOR OLD READ-PASS-ALL MODE5 BR 30$ ;SKIP TO FORCE PASTHRU MODE ON THE READ ALSOP20$:1 BIT #TF.RPT,R0 ;WAS EITHER TF.RPT OR S3.PTH SET?F9 BEQ 40$ ;IF EQ, NO...SKIP TO FINISH MODIFIER PROCESSINGI30$:9 BIS #S1.PTH,R0 ;BOTH TF.RPT AND TF.RAL USE PASSTHRU MODEA;MJ; ESTABLISH THE TIMEOUT VALUE TO BE USED FOR THIS READ REQUEST. NOTE THATL; NORMAL READS MULTIPLY THE TIMEOUT VALUE BY TEN. "IO.EIO" TAKE THE TIMEOUTJ; VALUE AS SPECIFIED. A ZERO TIMEOUT ON A NORMAL READ WILL TIME OUT WHICHL; IS A CHANGE FROM THE OLD BEHAVIOR. A ZERO TIMEOUT TIMES OUT IMMEDIATELY, E; RETURNING DATA THAT IS CURRENTLY IN THE TYPE-AHEAD BUFFER (IF ANY).F;B40$:. CLR R1 ;ASSUME ZERO-LENGTH TIMEOUT SPECIFIED ASSUME TF.TMO,2004 TSTB R0 ;IS USER REQUESTING A TIMEOUT ON THE READ?* BPL 70$ ;IF PL, NO...SKIP TIMEOUT CHECKS6 MOVB I.PRM+6(R3),R1 ;GET USER SPECIFIED TIMEOUT VALUE# BNE 45$ ;IF NE, NOT ZERO TIMEOUT D BIS #S5.ITI,U.TST5-U.TSTA(R5) ;INDICATE IMMEDIATE TIMEOUT IS NEEDED% BR 70$ ;AND VALUE IS READY TO STASHR45$: .IF DF T$$EIO; BIT #S6.EIO,U.TST6-U.TSTA(R5) ;WAS/IS THIS AN EXTENDED IO?S* BNE 70$ ;IF SO, INTERPRET VALUE DIRECTLY  .ENDC ;T$$EIO;S?; MULTIPLY THE SPECIFIED TIMEOUT VALUE BY TEN FOR NORMAL READS. ; 2 CMPB R1,#<377/10.> ;EXCEED MAXIMUM TIMEOUT VALUE? BLOS 50$ ;IF LOS, NO4 MOV #377,R1 ;SET MAXIMUM TIMEOUT LENGTH IN SECONDS BR 70$ ;USE THIS TIMEOUT VALUE50$: .IF DF R$$EIS% MUL #10.,R1 ;ADJUST TO UNITS OF TENT .IFF ;R$$EIS ASL R1 ;MULTIPLY BY TWOT" MOV R1,-(SP) ;SAVE PARTIAL RESULT ASL R1 ;MAKE IT X 4A ASL R1 ;MAKE IT X 8T% ADD (SP)+,R1 ;(X 8) + (X 2) = (X 10)  .ENDC ;R$$EIS70$:- MOVB R1,U.TITI-U.TIP(R4) ;SAVE TIMEOUT VALUET@ MOVB R1,I.PRM+6(R3) ;SAVE TIMEOUT VALUE IN I/O PACKET FOR LATER;I=; TURN NECESSARY MODIFIERS INTO INPUT STATUS FLAGS IN U.TSTA.T;X ASSUME TF.RST,S1.RSTS ASSUME S3.NEC,S1.RN00E|{ D%B11110010EH ASSUME S3.RES,S1.RES ASSUME TF.RNF,S1.RNF# ASSUME TF.TNE,S1.TNESD BIC #^C,R04 ;CLEAR UNDESIRED STATUS BITS FROM READ MODIFIERS3 BIS R0,(R5) ;ESTABLISH NEW INPUT PROCESSING FLAGS ( BIC #S2.CTO,2(R5) ;READ CLEARS ^O STATE8 MOVB #TF.RLB,I.FCN+1(R3) ;REMEMBER THAT THIS WAS A READ;T8; DETERMINE WHETHER OR NOT TO OUTPUT A LEADING LINEFEED.;D. BIT #S1.RNE,(R5)+ ;IS INPUT ECHOING REQUIRED? BNE 80$ ;IF NE, NO...SKIPM ASSUME S3.FDX,2002 TSTB 2(R5) ;IS THE LINE SET TO FULL DUPLEX MODE?, BMI 80$ ;IF MI, NO...SKIP LEADING LINEFEED, BIT #S2.FLF,(R5) ;NEED TO FORCE A LINEFEED?. BEQ 80$ ;IF EQ, NO...DON'T OUTPUT ONE - SKIP= MOV #PRLF,-(SP) ;OUTPUT LEADING LF WHEN WE EXIT THIS ROUTINE#80$: .IF DF T$$EIO" BIS #S1.IBY,-(R5) ;SET INPUT BUSY ASSUME S6.RDI,100000 0 TST U.TST6-U.TSTA(R5) ;DEFAULT INPUT SPECIFIED?8 BMI 90$ ;IF NE YES, BUFFER STATUS HAS ALREADY BEEN SET' BIS #S1.IBF,@R5 ;ASSUME BUFFERED INPUTM .IFF ;T$$EIO2C BIS #S1.IBY!S1.IBF,-(R5) ;SET INPUT BUSY AND ASSUME BUFFERED INPUTI .ENDC ;T$$EIO90$:B MOVB U.TCHP-U.TSTA(R5),U.TIHP-2(R4) ;SAVE INITIAL CURSOR POSITION .IF DF T$$RPR6 TST (R3) ;HAVE WE JUST FINISHED OUTPUTTING A PROMPT? BEQ RDBCHK ;IF EQ, NO...SKIP- CLR (R3) ;RESET THE COMPLETION STATUS FIELD< TST I.PRM+16(R3) ;DID THE PROMPT SUCCESSFULLY INITIALIZE... ; ...INTERMEDIATE BUFFERING?1 BEQ UNBI ;IF EQ, NO...GO AND DO UNBUFFERED READ5= MOV U.TFIB-U.TIP(R4),R2 ;ELSE, GET THE FIRST INPUT BUFFER...B- ; ...WHICH WAS ALLOCATED BEFORE PROMPTINGU BR BUFRD ;DO BUFFERED READ .ENDC ;T$$RPR.PAGEI% .SBTTL INPUT REQUEST BUFFER HANDLING? .SBTTL . RDBCHK - DETERMINE NEED FOR BUFFERED/UNBUFFERED INPUTA;OI; RDBCHK - DETERMINE THE TYPE OF INPUT BUFFERING TO BE USED ON THIS READ.U;IRDBCHK:T, CALL $TSTBF ;SHOULD WE DO A BUFFERED READ?, BCS UNBI ;IF CS, NO...DO AN UNBUFFERED ONE .IF DF T$$EIO ASSUME S6.RDI,100000R3 TST U.TST6-U.TSTA(R5) ;READING WITH DEFAULT INPUT?U. BPL 10$ ;IF EQ NO, NEED TO ALLOCATE A BUFFERB MOV U.TDIF-U.TIP(R4),R2 ;USE DEFAULT INPUT BUFFERS FOR INPUT DATA) BNE 20$ ;IF NE HAVE A BUFFER WE CAN USE, BR UNBI ;ELSE NOT ENOUGH BUFFERS AVAILABLE .ENDC ;T$$EIO10$:/ CALL ALTB ;GET A BUFFER FOR THE BUFFERED READ 3 BCS UNBI ;IF CS, FAILED...MUST DO UNBUFFERED READ 20$:& MOV R2,-(SP) ;SAVE THE BUFFER ADDRESS0 CALL $INIBF ;INITIALIZE INTERMEDIATE BUFFERING* MOV (SP)+,R2 ;RETRIEVE THE BUFFER ADDRESS .DSABL LSB- .SBTTL . BUFRD - SET UP TO DO BUFFERED INPUTA;C$; BUFRD - SET UP FOR BUFFERED INPUT.;SBUFRD:& ADD #U.TTIC-U.TIP,R4 ;POINT TO U.TTIC MOV R4,R1 ;COPY POINTERA1 MOV I.PRM+4(R3),(R1)+ ;SET UP MAXIMUM BYTE COUNTE ASSUME U.TFIB,U.TTIC+2:;C.; BUFRD1 - LINK CURRENT BUFFER TO PREVIOUS ONE;SBUFRD1:F* MOV R2,(R1) ;LINK FIRST BUFFER TO U.TFIB' .SBTTL . NXTIB - GET NEXT INPUT BUFFERC; ;+"; **-NXTIB - GET NEXT INPUT BUFFER;G; *** NOTE *** THIS ROUTINE IS ALSO CALLED AT DEVICE PRIORITY FROM THEU'; INPUT DONE INTERRUPT SERVICE ROUTINE. ;R ; INPUTS:; R2 => NEW INPUT BUFFER#; R4 => U.TTIC OF THE TERMINAL UCBX &; U.TTIC = TOTAL REMAINING BYTE COUNT;P ; OUTPUTS:+"; R4 => U.TIC OF THE TERMINAL UCBX!; NEW BUFFER LINKED TO OLD BUFFERL=; SECOND WORD OF NEW BUFFER SET UP WITH LOGICAL BUFFER LENGTH /; U.TIP, U.TIP+2, U.TIC, AND U.TTIC ARE UPDATED 8; CC-Z = 0 IF THE INPUT BYTE COUNT IS NOT YET EXHAUSTED; = 1 OTHERWISEO;*"; REGISTERS MODIFIED: R2, R3, R4;-;RNXTIB::O3 TST (R2)+ ;POINT TO SECOND WORD OF THE NEW BUFFER5 MOV #T$$BFL-4,(R2) ;SET LOGICAL LENGTH OF THE BUFFER + SUB (R2),(R4) ;ADJUST U.TTIC APPROPRIATELYN1 BPL 10$ ;IF PL, THERE IS MORE ROOM STILL...SKIPE; ADD (R4),(R2) ;WENT BELOW ZERO - ADJUST LOG. BUFFER LENGTHW CLR (R4) ;U.TTIC <-- 0 ASSUME U.TIP,U.TTIC-610$:" CMP -(R4),-(R4) ;POINT TO U.TIP+2A CMP -(R4),-(R2) ;POINT R4 TO U.TIP AND R2 TO START OF THE BUFFERD.PAGE , .SBTTL GENERAL INPUT/OUTPUT BUFFER HANDLING8 .SBTTL . UPUB - UPD00M|.|TADATADATADATADATADATADATADATADATAATE UCBX PARAMETERS FOR BUFFERED I/O;R;+C; **-UPUB - UPDATE PARAMETERS IN UCBX FOR BUFFERED INPUT OR OUTPUT.E;-; THIS ROUTINE IS CALLED IN THREE SITUATIONS:B!; 1. AT PRIORITY 0 TO START INPUTS'; 2. AT DEVICE PRIORITY TO START OUTPUTZB; 3. AT DEVICE PRIORITY FROM THE OUTPUT OR INPUT INTERRUPT SERVICEA; ROUTINE TO SWITCH FROM THE CURRENT PARTIAL BUFFER TO THE NEXT.);R ; INPUTS: ; R2 => INPUT OR OUTPUT BUFFER@; R4 => U.TIP (INPUT) OR U.TOP (OUTPUT) OF THE TERMINAL'S UCBX; 2(R2) = LOGICAL BUFFER LENGTHR;O ; OUTPUTS:O; R2 => SECOND WORD OF BUFFERR(; R4 => U.TIC/U.TOC OF THE TERMINAL UCBXG; U.TIP, U.TIP+2, U.TIC (OR U.TOP, U.TOP+2, U.TOC) ARE UPDATED FOR NEXTY; PARTIAL TRANSFER.'; CC-Z = 0 IF THERE IS MORE WORK TO DO ; = 1 OTHERWISER;T; REGISTERS MODIFIED: R2, R4;-; UPUB::1 MOV R2,(R4)+ ;U.TIP+0/U.TOP+0 <-- BUFFER ADDRESSE1 CMP (R2)+,(R2)+ ;SKIP OVER LINK AND LENGTH WORDSF: MOV R2,(R4)+ ;U.TIP+2/U.TOP+2 <-- START OF DATA IN BUFFER4 MOV -(R2),(R4) ;U.TIC/U.TOC <-- BYTE COUNT FOR THIS ;(POSSIBLY PARTIAL) TRANSFER RETURN4- .SBTTL . UNBI - ESTABLISH NON-BUFFERED INPUTT;2; UNBI - DO NON-BUFFERED INPUT.);EUNBI:D$ CLR I.PRM+16(R3) ;USE $IOFIN AT END( BIC #S1.IBF,(R5) ;SHOW UNBUFFERED INPUT ASSUME U.TIP, 3 .SBTTL . UPUNB - UPDATE UCB FOR NON-BUFFERED INPUTR; ;+/; **-UPUNB - UPDATE UCB FOR NON-BUFFERED INPUT.+;K ; INPUTS:"; R3 => CURRENT I/O REQUEST PACKET"; R4 => U.TIP OF THE TERMINAL UCBX;F ; OUTPUTS:)#; R4 => U.TTIC OF THE TERMINAL UCBX >; U.TIP, U.TIP+2, U.TIC, U.TTIC UPDATED FOR NON-BUFFERED INPUT;-; REGISTERS MODIFIED: R3, R4;-;NUPUNB::O- ADD #I.PRM,R3 ;POINT TO PARAMETERS IN PACKET3? MOV (R3)+,(R4)+ ;U.TIP+0 <-- BUFFER ADDRESS (ADRS DOUBLE WORD)A> MOV (R3)+,(R4)+ ;U.TIP+2 <-- 2.ND HALF OF ADDRESS DOUBLE WORD ASSUME U.TIC, & MOV (R3)+,(R4)+ ;U.TIC <-- BYTE COUNT ASSUME U.TTIC, CLR (R4) ;U.TTIC <-- 0 RETURN ;ALL DONE .PAGEI .SBTTL INPUT REQUEST COMPLETION1 .SBTTL . FPIRD - INPUT REQUEST DONE FORK PROCESS.;,;+-; **-FPIRD - INPUT REQUEST DONE FORK PROCESS.S;S8; THIS ROUTINE IS ENTERED FROM THE FORK DISPATCHER WHEN::; 1. AN END OF LINE WAS DETECTED (OR A HARD RECEIVE ERROR)#; 2. AN INTERMEDIATE BUFFER IS FULLV@; 3. THE USER TASK BUFFER IS FULL (NON-BUFFERED SOLICITED INPUT);.F; AFTER INITIALIZING, THIS ROUTINE DISPATCHES TO PROCESS COMPLETION OF(; EITHER SOLICITED OR UNSOLICITED INPUT.; ; INPUTS:; R4 => UCBX OF THE TERMINAL"; R5 => U.TSTA OF THE TERMINAL UCB; ; OUTPUTS: NONE.;S&; REGISTERS MODIFIED: R0, R1, R2, R3;-;KFPIRD::S ASSUME U.TCI,0I) MOV (R4)+,R3 ;GET CURRENT REQUEST PACKET: ASSUME U.TIP,U.TCI+2A5 MOV (R4)+,R1 ;GET CURRENT BUFFER (IF BUFFERED INPUT)A ASSUME U.TIC,U.TIP+4. TST (R4)+ ;POINT TO U.TIC  ASSUME U.TTIC,U.TIC+24 ADD (R4)+,(R4) ;ADD U.TIC TO U.TTIC TO GET TOTAL... ; ...REMAINING BYTES TO READ; BEQ IRQDON ;IF EQ, THE BUFFER IS FULL...COMPLETE THE READ - TST (R3) ;HAS A COMPLETION STATUS BEEN SET?M, BNE IRQDON ;IF NE, YES...COMPLETE THE READ;SK; HERE WE ARE DOING BUFFERED INPUT AND THE CURRENT BUFFER IS FULL. WE WILL L; TRY TO ALLOCATE ANOTHER BUFFER AND CONTINUE THE READ. NOTE THAT THE INPUTI; ISR HAS ALREADY CHECKED WHETHER THERE IS ANOTHER BUFFER ALLOCATED (THISTG; COULD BE THE CASE IF THE OPERATOR DID RUBOUT OR CTRL-U). IF THERE IS 7; ANOTHER BUFFER ALLOCATED ALREADY, WE DON'T COME HERE.O;;% CALL ALTB ;GET ANOTHER INPUT BUFFERE9 BCC BUFRD1 ;IF CC, LINK TO PREVIOUS BUFFER AND CONTINUEE& MOV #IE.NOD,(R3) ;SET AN ERROR STATUS ASSUME S1.USI,100000N+ TST (R5) ;ARE WE DOING UNSOLICITED INPUT?L BPL IRQDON ;IF PL, NO...SKIP;T?; UNSOLICITED INPUT REQUIRES ANOTHER BUFFER, WHICH WE FAILED TO C; ALLOCATE. THE STATUS "IE.NOD" WILL FORCE A ^U TO FLUSH THE INPUT.O; ( JMP USIDON ;COMPLETE UNSOLICITED INPUT;LG; SOLICITED INPUT REQUIRES ANOTHER BUFFER, WHICH WE FAILED TO ALLOCATE.E8; WE WILL RETURN PARTIAL INPUT WITH THE STATUS "IE.NOD".;;.PAGEN1 .SBTTL . IRQDON00U|{ D%B11110010 - AN INPUT REQUEST HAS COMPLETED3;S"; IRQDON - INPUT REQUEST COMPLETED;0IRQDON:( .IF DF T$$ACD! MOV U.ACB-U.TSTA(R5),R2 ;GET ACBF+ BEQ 30$ ;TERMINAL DOESN'T HAVE ONE - JUMPR. CLR U.AFLG-U.TSTA(R5) ;SET DEFAULT PROCESSING0 MOV (R3),A.IOS(R2) ;SET INPUT COMPLETION STATUS1 MOV #A.INPU,R0 ;SET INPUT COMPLETION ENTRY POINTI CALL $SWACD ;CALL ACDU= MOV A.IOS(R2),(R3) ;SET POSSIBLY DIFFERENT INPUT STATUS CODEW8 BIT #UA.TRA,U.AFLG-U.TSTA(R5) ;TRANSFER CHARACTERS NOW? BEQ 30$ ;IF EQ, NO...SKIP 10$:! MOV U.ACB-U.TSTA(R5),R0 ;GET ACBN- ADD #A.SMAP,R0 ;POINT TO TRANSFER PARAMETERSF/ BIT #S1.IBF,(R5) ;ARE WE DOING BUFFERED INPUT? BEQ 20$ ;IF EQ, NO...SKIPA& MOV R1,R2 ;COPY INPUT BUFFER ADDRESS1 CMP (R2)+,(R2)+ ;POINT PAST LINK AND COUNT WORDSP& MOV R5,(R2)+ ;SAVE R5 IN INPUT BUFFER' MOV R3,(R2)+ ;ALSO SAVE PACKET ADDRESSS3 MOV (R0)+,(R2)+ ;SAVE ACD BUFFER APR BIAS (A.SMAP)I7 MOV (R0)+,(R2)+ ;SAVE ACD BUFFER DISPLACEMENT (A.SBUF)). MOV I.PRM+16(R3),(R2)+ ;SAVE TASK PCB ADDRESS6 MOV I.PRM(R3),(R2)+ ;SAVE TASK BUFFER APR BIAS OFFSET/ MOV (R0),(R2) ;SAVE ACD BUFFER LENGTH (A.SLEN)#2 BR 30$ ;TRANSFER WILL OCCUR WHEN $FINBF CALLS US20$: MOV R4,-(SP) ;SAVE R4/ MOV (R0)+,R1 ;GET ACD BUFFER APR BIAS (A.SMAP);3 MOV (R0)+,R2 ;GET ACD BUFFER DISPLACEMENT (A.SBUF) * SUB #20000,R2 ;CONVERT TO AN APR5 ADDRESS- MOV (R0),R0 ;GET ACD BUFFER LENGTH (A.SLEN)F2 MOV U.TIP-U.TTIC(R4),R3 ;GET TASK BUFFER APR BIAS< MOV U.TIP+2-U.TTIC(R4),-(SP) ;SAVE TASK BUFFER DISPLACEMENT= ADD R0,U.TIP+2-U.TTIC(R4) ;UPDATE DISPLACEMENT FOR NEXT TIME + MOV (SP)+,R4 ;GET TASK BUFFER DISPLACEMENTH6 CALL $BLXIO ;TRANSFER FROM ACD BUFFER TO TASK BUFFER MOV (SP)+,R4 ;RESTORE R4 $ MOV U.TCI-U.TTIC(R4),R3 ;RESTORE R3. CLR U.AFLG-U.TSTA(R5) ;SET DEFAULT PROCESSING4 MOV #A.CALL,R0 ;SET TRANSFER COMPLETION ENTRY POINT, CALL $SWACD ;CALL ACD TO DEALLOCATE BUFFER@ BIT #UA.CAL,U.AFLG-U.TSTA(R5) ;ACD HAVE ANOTHER BUFFER TO COPY?% BNE 10$ ;IF NE, YES...LOOP TO DO ITV; BIS #UA.TRA,U.AFLG-U.TSTA(R5) ;SET FLAG FOR CHECKING LATERE30$: .ENDC ;T$$ACD* CLRB U.TITI-U.TTIC(R4) ;CLEAR INPUT TIMER/ BIT #S1.IBF,(R5) ;ARE WE DOING BUFFERED INPUT?T: BEQ SOLIDN ;IF EQ, NO...MUST BE SOLICITED INPUT, SO SKIP0 MOV (R1),R2 ;GET NEXT BUFFER (IF THERE IS ONE). CALL DELTB ;DEALLOCATE ALL REMAINING BUFFERS' CLR (R1) ;THIS IS NOW THE LAST BUFFER  ASSUME S1.USI,100000R+ TST (R5) ;ARE WE DOING UNSOLICITED INPUT?O-; BMI USIDON ;IF MI, YES...SKIP TO FINISH ITO1 BPL SOLIDN ;IF PL, NO...PROCESS SOLICITED INPUTL, JMP USIDON ;IF MI, YES...SKIP TO FINISH IT.PAGER- .SBTTL . SOLIDN - SOLICITED INPUT COMPLETION1;F$; SOLIDN - SOLICITED INPUT COMPLETED;Q ; INPUTS:"; R3 => CURRENT I/O REQUEST PACKET#; R4 => U.TTIC OF THE TERMINAL UCBXR"; R5 => U.TSTA OF THE TERMINAL UCB;OSOLIDN:R& CALL IRESEL ;RESET INPUT STATE FLAGS- BIC #S1.IBY,(R5) ;INDICATE INPUT IS NOW IDLET< BIC #S5.ITI,U.TST5-U.TSTA(R5) ;CLEAR IMMEDIATE TIMEOUT FLAG3 CLR U.TCI-U.TTIC(R4) ;CLEAR PACKET POINTER (U.TCI).; MOV U.TRTT-U.TTIC(R4),R2 ;GET THE TERMINATOR TABLE ADDRESSF BEQ 10$ ;IF EQ, NONE...SKIPI, CALL DETB ;DEALLOCATE THE TERMINATOR TABLE6 CLR U.TRTT-U.TTIC(R4) ;CLEAR TERMINATOR TABLE ADDRESS10$: .IF DF T$$RPR1 MOV U.TFPB-U.TTIC(R4),R2 ;GET PROMPT BUFFER LISTA BEQ 20$ ;IF EQ, NONE...SKIPN+ CALL DELTB ;DEALLOCATE ALL PROMPT BUFFERSB% CLR U.TFPB-U.TTIC(R4) ;CLEAR POINTERI20$: .ENDC ;T$$RPR+ MOV I.PRM+4(R3),R1 ;GET MAXIMUM BYTE COUNTR2 SUB (R4)+,R1 ;SUBTRACT REMAINING BYTES TO READ...% ; ...YIELDING BYTES ACTUALLY READA. TST (R3) ;COMPLETION STATUS ALREADY PRESENT?2 BNE 30$ ;IF NE, YES...SKIP TO COMPLETE THE INPUT- INC (R3) ;BUFFER FULL - SET STATUS = IS.SUCD .IF DF T$$ESC7 BIT #S1.ESC,(R5) ;IN THE MIDDLE OF AN ESCAPE SEQUENCE?L* BEQ 30$ ;IF EQ, NO...ALL IS OKAY SO SKIP> MOV #IE.PES&377,(R3) ;SET ERROR FOR "PARTIAL ESCAPE SEQUENCE"2 BIC #S1.ESC,(R5) ;GET OUT OF ESCAPE SEQUENCE MODE3 CLRB U.TISV-U.TFIB(R4) ;CLEAR INPUT STATE VARIABLEB .ENDC ;T$$ESC30$: .IF DF T$$EIO;D@; IF00]|.|TADATADATADATADATADATADATADATADATA THIS WAS AN IO.EIO AND THERE ARE MORE CHARACTERS IN THE TAB8; AND THE SYSTEM SUPPORTS ICS, REQUEST ICS NOTIFICATION.;I; BIT #S6.EIO,U.TST6-U.TSTA(R5) ;WAS/IS THIS AN EXTENDED IO?C BEQ 50$ ;IF NOT NO ICS .IF DF T$$ICS/ MOV R3,-(SP) ;SAVE REGISTER DESTROYED BY GCTABY3 CALL GCTAB ;ANY CHARACTERS SITTING IN TYPE-AHEAD?  MOV (SP)+,R3 ;RESTORE REGISTER  BCS 40$ ;IF CS, NO - SKIPO- FRKBIT BIS,#FR.ICS ;REQUEST ICS NOTIFICATIONR .ENDC ;T$$ICS=40$: BIC #S6.EIO!S6.RLU!S6.RDI,U.TST6-U.TSTA(R5);;CLEAR FLAGS 50$: .ENDC ;T$$EIO/ BIT #S1.IBF,(R5) ;ARE WE DOING BUFFERED INPUT?E BEQ 70$ ;IF EQ, NO...SKIPT ASSUME U.TFIB,U.TTIC+2). MOV (R4),R4 ;GET FIRST INPUT BUFFER (U.TFIB)8 MOV R4,I.PRM+12(R3) ;STORE POINTER IN PACKET FOR $FINBF .IF DF T$$SPL7 MOV KISAR6,I.PRM+14(R3) ;STORE MAPPING INFO FOR $FINBF< SUB #200,I.PRM+14(R3) ;$FINBF EXPECTS MAPPING THROUGH APR 5 .IFF ;T$$SPL,7 MOV KISAR5,I.PRM+14(R3) ;STORE MAPPING INFO FOR $FINBF: .IFTF ;T$$SPL60$:; MOV (R4)+,R2 ;GET LINK TO NEXT BUFFER, POINT TO BYTE COUNTT- MOV #T$$BFL,(R4) ;SET TOTAL LENGTH OF BUFFERB MOV R2,R4 ;GET NEXT BUFFER" BNE 60$ ;IF NE, FOUND ONE...LOOP70$:6 BIT #TF.XOF,I.FCN(R3) ;SEND XOFF AT INPUT COMPLETION? BEQ 80$ ;IF EQ, NO...SKIPF ASSUME S3.FDX,200) TSTB 4(R5) ;IS THIS A FULL DUPLEX LINE?N8 BMI 80$ ;IF MI, YES...TRANSMIT MAY BE BUSY SO SKIP XOF MOV R3,-(SP) ;SAVE R3( MOV #ASXOFF,R3 ;POINT TO XOFF CHARACTER .IFT ;T$$SPLO, MOV #120000,R4 ;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPLO" MOV U.TUX-U.TSTA(R5),R4 ;GET UCBX .ENDC ;T$$SPL4 CALL ECHRL ;"ECHO" XOFF WITH INTERRUPTS LOCKED OUT MOV (SP)+,R3 ;RESTORE R3N80$: .IF DF T$$ACD! MOV U.ACB-U.TSTA(R5),R2 ;GET ACBM2 BEQ 90$ ;IF EQ, TERMINAL DOESN'T HAVE ONE...SKIP3 BIT #UA.TRA,U.AFLG-U.TSTA(R5) ;DOING TRANSFER NOW?B BEQ 90$ ;IF EQ, NO...SKIPT1 MOV A.IOS+2(R2),R1 ;GET TRANSFER LENGTH FROM ACBM) BIT #S1.IBF,(R5) ;DOING A BUFFERED READ?. BEQ 90$ ;IF EQ, NO...SKIPR@ INC I.PRM+12(R3) ;SET BUFFER ADDRESS ODD FOR NON-STD $FINBF USE90$: .ENDC ;T$$ACD0 CALLR DONE ;COMPLETE THE CURRENT INPUT REQUEST .PSECT MAP5.PAGEP( .SBTTL . NXTOB - GET NEXT OUTPUT BUFFER;M;+$; **-NXTOB - GET NEXT OUTPUT BUFFER.;II; *** NOTE *** THIS ROUTINE IS CALLED AT DEVICE PRIORITY FROM THE OUTPUTN; INTERRUPT SERVICE ROUTINEI;. ; INPUTS:$; R4 => U.TOP+2 OF THE TERMINAL UCBX"; R5 => U.TSTA OF THE TERMINAL UCB;G ; OUTPUTS:E+; IF THERE IS ANOTHER OUTPUT BUFFER LINKED:M ; CC-Z = 0"; R4 => U.TOC OF THE TERMINAL UCBX/; U.TOP, U.TOP+2, U.TOC UPDATED FOR NEXT BUFFERO;E; IF NOTHING MORE TO OUTPUT: ; CC-Z = 1"; R4 => U.TOP OF THE TERMINAL UCBX;E; REGISTERS MODIFIED: R2, R4;-;-NXTOB::  .IF DF T$$ACD3 BIT #S2.OBF,2(R5) ;;;ARE WE DOING BUFFERED OUTPUT?R- BEQ 10$ ;;;IF EQ, NO...RETURN WITH CC-Z = 1N .ENDC ;T$$ACD4 MOV -(R4),R2 ;;;GET START OF CURRENT BUFFER (U.TOP)9 BEQ 10$ ;;;IF EQ, THIS WAS AN ECHO...EXIT WITH CC-Z = 1 ) MOV (R2),R2 ;;;GET START OF NEXT BUFFER / BEQ 10$ ;;;IF EQ, NONE...RETURN WITH CC-Z = 1O8 MOVB OPTIMR,U.TOTI-U.TOP(R4) ;;;SET UP THE OUTPUT TIMER# JMP UPUB ;;;GO AND UPDATE THE UCBT10$:! RETURN ;;;RETURN WITH CC-Z = 1 2 .SBTTL . USIDON - UNSOLICITED INPUT HAS COMPLETED;2'; USIDON - UNSOLICITED INPUT COMPLETED.B;1E; THIS ROUTINE WILL ALLOCATE A CLI COMMAND BUFFER IN THE SYSTEM POOL.)H; THE INPUT BUFFERS ARE THEN COPIED INTO THE CLI BUFFER AND IT IS QUEUEDG; TO THE CLI TASK. IF CONTINUATION LINES ARE TO FOLLOW (LAST CHARACTER4; OF THIS BUFFER IS A HYPHEN), SIMULATE A CONTRTL-C.;P ; INPUTS:&; SECOND WORD OF FIRST RECEIVE BUFFER: ; <0 - ERRORA; 0 - BUFFER FULL; IS.SUC - SUCCESST; IS.TMO - TIME-OUT; >IS.TMO - CTRL-U COMPLETEDD;PUSIDON:M5 MOV #M$$CRB-4+1,-(SP) ;GET MAX LENGTH OF CLI COMMAND1 ;PLUS 1 FOR TERMINATOR0 SUB (R4)+,(SP) ;GET NUMBER OF BYTES READ PLUS 1 CMP (R3),#IS.TMO ;TIME-OUT? BEQ 50$ ;Y - JUMPN CMPB (R3)+,#IS.SUC ;TEST STATUS BLO 50$ ;BUFFER FULL - JUMPF BLT 40$ ;E00e|{ D%B11110010RROR - JUMP " BGT 30$ ;CTRL-U COMPLETED - JUMP ;ELSE SUCCESS!* TST $MCRPT ;IS MCR DISPATCHER INSTALLED?+ BEQ 50$ ;IF NOT THEN ECHO ^U TO TELL USER  .IF DF T$$SPCA BIC #UM.KIL,U.MUP-U.TSTA(R5) ;RESET CLI CONTINUATION LINE STATUS .ENDC ;T$$SPC .IF DF T$$SER; MOV #CC.TTD,-(SP) ;ASSUME NEED TO SET CC.TTD IN CLI PACKETP8 TSTB U.TFPB-U.TFIB(R4) ;HERE BECAUSE USER TYPED CTRL-C? BEQ 10$ ;N - JUMP-; BIT #UM.CMD,U.MUP-U.TSTA(R5) ;COMMAND ALREADY IN PROGRESS?U# BEQ 10$ ;N - NOTHING UNUSUAL THEN6 CLR (SP) ;DON'T SET CC.TTD SO THAT COMPLETION OF THE. ;COMMAND WE ARE ABOUT TO SEND WON'T AFFECT) ;THE SERIAL PROCESSING ALREADY IN USE10$:4 MOV (SP)+,U.TFPB-U.TFIB(R4) ;GET ZERO OR CC.TTD BIT< BIC #UM.CMD,U.MUP-U.TSTA(R5) ;RESET COMMAND IN PROGRESS BIT5 BIT #UM.SER,U.MUP-U.TSTA(R5) ;CLI TYPEAHEAD ENABLED?P BEQ 20$ ;N - JUMPU= BIS #UM.CMD,U.MUP-U.TSTA(R5) ;Y - SHOW A COMMAND IS UNDERWAY-20$: .ENDC ;T$$SER0 CMP (SP),#1 ;ONE BYTE READ? (MUST BE A RETURN) BNE 100$ ;N - JUMP .IF DF T$$SPC. MOV #CC.PRM,R1 ;SET PROMPT REQUEST STATUS BIT4 BIS U.TFPB-U.TFIB(R4),R1 ;OR IN POSSIBLE CC.TTD BIT MOV R5,R2 ;GET UCB ADDRESS SUB #U.TSTA,R2 ;T. CALL $QCNTP ;QUEUE PROMPT REQUEST TO THE CLI .IFF ;T$$SPC(3 MOV #4,R1 ;Y - ONLY ALLOCATE 4 BYTES FROM THE DSRU CALL $ALOCB ;P BCS 50$ ;FAILED - JUMP MOV R0,R1 ;SAVE ADDRESSU TST (R0)+ ;SKIP PAST LINK WORD! MOV R5,(R0) ;INSERT UCB ADDRESSS8 SUB #U.TSTA-1,(R0) ;+1 TO INDICATE A SPECIAL MCR PACKET- BR 140$ ;QUEUE THIS SHORT PACKET TO THE CLIC .IFTF ;T$$SPC30$: BR 200$ ;BRANCH AIDS40$: BR 210$ ; 50$: JMP 220$ 100$:B .IFT ;T$$SPC " MOV (SP),R1 ;GET CHARACTER COUNT5 ADD #C.CTXT+77,R1 ;ROUND UP TO NEXT 32 WORD BOUNDARY < ASH #-6,R1 ;COMPUTE NUMBER OF SECONDARY POOL BLOCKS NEEDED" CALL $ALSEC ;ALLOCATE CLI BUFFER BCS 220$ ;FAILURE - JUMP! MOVB (R3),-(SP) ;SAVE TERMINATORL .IF NDF T$$SPLR2 MOV U.TFPB-U.TFIB(R4),-(SP) ;SAVE CLI STATUS WORD .IFTF ;NDF T$$SPL MOV R0,KISAR6 ;MAP CLI BUFFER MOV #140002,R2 ;POINT TO IT1 MOV $MCRPT,(R2)+ ;SET CLI DISPATCHER TCB ADDRESS$ MOV R5,(R2) ;SET UCB ADDRESS SUB #U.TSTA,(R2)+ ; .IFT ;NDF T$$SPLR$ MOV 4(SP),(R2) ;SET CHARACTER COUNT .IFF ;NDF T$$SPL $ MOV 2(SP),(R2) ;SET CHARACTER COUNT .IFTF ;NDF T$$SPL DEC (R2)+ ;LESS TERMINATOR .IFT ;NDF T$$SPLL MOV (SP)+,(R2)+ ;SET STATUS BIT .IFF ;NDF T$$SPLF, MOV U.TFPB-U.TFIB(R4),(R2)+ ;SET STATUS BIT .ENDC ;NDF T$$SPL' CLR (R2)+ ;CLEAR TEXT STARTING OFFSETU$ MOVB (SP)+,(R2)+ ;INSERT TERMINATOR8 MOVB R1,(R2)+ ;SET NUMBER OF SECONDARY POOL BLOCKS USED MOV $DALED,KISAR6 ;REMAP DRIVER( MOV (R4),R1 ;GET FIRST BUFFER (U.TFIB) MOV R4,-(SP) ;SAVE UCBX POINTER MOV R2,R4 ;CHANGE HANDS2" MOV 2(SP),R2 ;GET CHARACTER COUNT MOV R5,-(SP) ;SAVE UCB POINTERL .IFF ;T$$SPC' MOV #M$$CRB,R1 ;GET SIZE OF CLI BUFFER " CALL $ALOCB ;ALLOCATE CLI BUFFER BCS 220$ ;FAILURE - JUMP: MOVB (R3),@U.TIP+2-U.TFIB(R4) ;STORE TERMINATOR IN BUFFER2 MOV (SP),R2 ;GET TOTAL NUMBER OF CHARACTERS READ ;PLUS TERMINATOR. MOV R0,-(SP) ;SAVE CLI COMMAND BUFFER ADDRESS TST (R0)+ ;SKIP LINK WORDR! MOV R5,(R0) ;INSERT UCB ADDRESSU SUB #U.TSTA,(R0)+ ;( MOV (R4),R1 ;GET FIRST BUFFER (U.TFIB) .IFTF ;T$$SPC110$:A* MOV (R1)+,-(SP) ;SAVE LINK TO NEXT BUFFER TST (R1)+ ;SKIP SECOND WORD$4 MOV #T$$BFL-4,R3 ;GET MAX NUMBER OF BYTES IN BUFFER CMP R3,R2 ;TOO MANY? BLE 120$ ;N - JUMP MOV R2,R3 ;Y - ADJUSTR120$:R, SUB R3,R2 ;GET NUMBER OF BYTES STILL TO GO130$:E .IFT ;T$$SPCE5 MOVB (R1)+,R5 ;GET NEXT CHARACTER FROM DRIVER BUFFER  MOV R0,KISAR6 ;MAP CLI BUFFER+ MOVB R5,(R4)+ ;PUT CHARACTER IN CLI BUFFERS' MOV $DALED,KISAR6 ;REMAP DRIVER BUFFERG .IFF ;T$$SPCU' MOVB (R1)+,(R0)+ ;COPY INTO CLI BUFFER1 .IFTF ;T$$SPC DEC R3 ;DECREMENT BYTE COUNT( BGT 130$ ;IF GT, LOOP FOR MORE TO COPY MOV (SP)+,R1 ;GET NEXT BUFFER BNE 110$ ;THERE IS ONE - LOOP .IFT ;T$$SPC3 MOV R0,KISAR6 ;MAP CLI BUFFER9 MOVB #CH.CR00m|.|TADATADATADATADATADATADATADATADATA,-(R4) ;DELIMIT BUFFER WITH A CARRIAGE RETURNE, MOVB -(R4),4(SP) ;SAVE LAST INPUT CHARACTER# MOV $DALED,KISAR6 ;REMAP DATASPACE " MOV (SP)+,R5 ;RESTORE UCB POINTER# MOV (SP)+,R4 ;RESTORE UCBX POINTER;6 MOV R0,R1 ;GET SECONDARY POOL COMMAND BUFFER ADDRESS' CALL $QCPKT ;QUEUE CLI COMMAND BUFFERS .IFF ;T$$SPCE% MOV (SP)+,R1 ;GET CLI COMMAND BUFFERO0 MOVB -2(R0),(SP) ;N - SAVE LAST INPUT CHARACTER140$:1' CALL $QMCRL ;QUEUE CLI COMMAND BUFFERP .ENDC ;T$$SPC .IF DF R$$MPL, CMPB (SP),#'- ;WAS LAST CHARACTER A HYPHEN? .IF DF A$$CLI BNE 205$ ;N - JUMP( MOV U.MUP-U.TSTA(R5),R2 ;GET CLI OFFSET+ BIC #^C,R2 ;SEPARATE OUT CLI INDEXT- MOV $CPTBL(R2),R2 ;POINT TO CLI PARSER BLOCKR5 BIT #CP.SGL,C.PSTS(R2) ;CONTINUATION LINES ACCEPTED?  .ENDC ;A$$CLI2 BEQ 300$ ;Y - CONTINUATION LINES TO FOLLOW, JUMP BR 205$ .IFTF ;R$$MPL200$:( .IFT ;R$$MPLA9 TST U.TFPB-U.TFIB(R4) ;ARE WE DOING A CONTINUATION LINE?B BPL 205$ ;PL - NO -BRANCH.@ FRKBIT BIS,#FR.KIL ;AN ERROR OCCURED, SO KILL THE CONTIN. LINE.205$:$ .ENDC ;R$$MPL TST (SP)+ ;CLEAN STACK& CALL IRESEL ;RESET INPUT STATE FLAGS< BIC #S1.USI!S1.IBY,(R5) ;CLEAR ADDITIONAL INPUT STATE FLAGS; CLR U.TFPB-U.TFIB(R4) ;CLEAN UP TEMPORARY VARIABLE WE USED 6 FRKBIT BIS,#FR.GRQ ;TRY TO GET ANOTHER REQUEST PACKET3 CLR U.TCI-U.TFIB(R4) ;CLEAR PACKET POINTER (U.TCI)% MOV (R4),R2 ;GET FIRST INPUT BUFFER.6 CALLR DELTB ;DEALLOCATE ALL INPUT BUFFERS AND RETURN;L3; ERROR DURING UNSOLICITED INPUT. THESE ERRORS ARE:,+; 1. FAILURE TO ALLOCATE CLI COMMAND BUFFER; ; 2. TIME-OUT(#; 3. BUFFER FULL WITH NO TERMINATORS$; IN EITHER CASE, SIMULATE A CTRL-U.;,210$:L0 CMPB -(R3),#IE.EOF ;END-OF-FILE (CTRL-Z TYPED)?1 BEQ 200$ ;Y - DON'T ECHO ^U (^Z ALREADY ECHOED)K220$:, BIT #S1.OBY,(R5) ;OUTPUT BUSY?S6 BNE 200$ ;Y - WE CANNOT BEGIN OUTPUT OF A ^U BECAUSE) ;OUTPUT IS ALREADY BUSY. WE CAN'T DOF ;ANYTHING BUT GIVE UPC230$: ( MOVB #CH.CTU,(SP) ;GET CTRL-U CHARACTER" ;(OVERWRITE OLD WORD ON STACK)1 BR 310$ ;REQUEST POST-FORK PROCESSING OF CTRL-U;.; CLI CONTINUATION EXPECTEDW; 300$:IA MOVB #CH.CTC,(SP) ;GET CTRL-C CHARACTER (OVER OLD WORD ON STACK)3 .IF DF T$$SPC; MOV #100000,U.TFPB-U.TFIB(R4) ;SET CLI CONTINUATION PROMPT  .ENDC ;T$$SPC310$: ;REFERENCE LABELY .IF DF T$$SER? BIC #UM.CMD,U.MUP-U.TSTA(R5) ;SHOW NO CLI COMMANDS IN PROGRESSS .ENDC ;T$$SER .IF DF T$$MOD% BITB #US.DSB!US.CRW,U.STS-U.TSTA(R5) * ;LINE DISABLED OR WAITING FOR CARRIER? BNE 200$ ;Y - JUMP .ENDC ;T$$MOD .IF DF T$$SPL; MOVB (SP)+,U.TECO-U.TSTA(R5) ;LOAD CHARACTER FOR POST-FORKS .IFF ;T$$SPLA; MOVB (SP)+,U.TECB-U.TFIB(R4) ;LOAD CHARACTER FOR POST-FORK0 .ENDC ;T$$SPL ;PROCESSING IN ECHO BUFFER@ FRKBIT BIS,# ;TRY TO GET ANOTHER PACKET (FR.GRQ)& ;REQUEST POST-FORK PROCESSING' ;TRY TO GET ANOTHER PACKET (FR.GRQ)* ;REQUEST POST-FORK PROCESSING (FR.PFP) RETURN ;RETURN .PAGEI% .SBTTL OUTPUT REQUEST PRE-PROCESSING0, .SBTTL . PPWLB - WRITE-SPECIAL-DATA REQUEST;L;+; **-PPWSD - WRITE SPECIAL DATAA4; **-PPRPR - WRITE THE PROMPT OF A READ-AFTER-PROMPT ; **-PPWLB - WRITE-LOGICAL-BLOCK;E ; INPUTS:; R3 I/O PACKET ADDRESS ; I.LNK = 0; R4 UCBX ADDRESS; R5 POINTER TO U.TSTA;>;R .ENABL LSBH .IF DF B$$MAPPPWSD:: 5 BIC #TF.RCU!TF.WBT,I.FCN(R3) ;CLEAR DISALLOWED BITST> MOVB I.PRM+10(R3),U.TDYP(R4) ;STORE THE DATA TYPE (4TH PARM)A CLR I.PRM+10(R3) ;NO VFC OR CURSOR POSITIONING ALLOWED (FOR CUP)06 CLR I.PRM+6(R3) ;NO VFC OR CURSOR POSITIONING ALLOWED BR WLB1 ;DO THE OUTPUT .ENDC ;B$$MAP5 .SBTTL . PPRPR - WRITE PROMPT OF A READ-AFTER-PROMPTW .IF DF T$$RPRPPRPR::P? CLRB I.FCN+1(R3) ;WIPE OUT HIGH BYTE FOR LATER CHECKS IN PPRLB MOV R3,R2 ;COPY PACKET POINTER$ ADD #I.PRM+16,R2 ;POINT TO I.PRM+166 MOV (R2),-(SP) ;SAVE 2.ND WORD OF ADDRESS DOUBLE WORD5 MOV -(R2),2(R2) ;MOVE VFC/CURSOR-CONTROL TO I.PRM+16H- MOV -(R2),2(R2) ;MOVE BYTE COUNT TO I.PRM+14I2 MOV (SP)+,(00u|{ D%B11110010R2) ;MOVE 2.ND WORD OF ADW TO I.PRM+12PPRPR1:R2 INC (R3) ;SET STATUS NON-ZERO TO INDICATE IO.RPR ;(FOR EASIER CHECKING)5 CLR U.TFOB(R4) ;CLEAR POINTER TO FIRST OUTPUT BUFFER$ .IF DF B$$MAP, CLRB U.TDYP(R4) ;INDICATE DATA TYPE 0, TEXT .ENDC ;B$$MAP BR WLB2 ;BYPASS TF.CCO CHECK .ENDC ;T$$RPR- .SBTTL . PPWLB - WRITE-LOGICAL-BLOCK REQUESTR;F; PPWLB - WRITE LOGICAL BLOCK);RPPWLB::V .IF DF T$$CUP6 MOV I.PRM+10(R3),I.PRM+6(R3) ;MOVE VFC TO RIGHT PLACE .ENDC ;T$$CUP .IF DF B$$MAP, CLRB U.TDYP(R4) ;INDICATE DATA TYPE 0, TEXTWLB1:R .ENDC ;B$$MAP& BIT #TF.CCO,I.FCN(R3) ;CANCEL CTRL-O? BEQ WLB3 ;N - JUMPWLB2:U BIC #S2.CTO,2(R5) ;Y - DO ITWLB3:.- BIT #S2.CTO,2(R5) ;OUTPUT STOPPED BY CTRL-O?;+ ;(CAN ONLY HAPPEN IF TERM. IS ATTACHED). BNE 10$ ;Y - FINISH DIRECTLY, CALL ALTB ;ALLOCATE AN INTERMEDIATE BUFFER BCC 30$ ;IF CC, GOT ONE...SKIP .IF DF T$$EIO: MOV U.TDIF(R4),R2 ;GET FIRST DEFAULT INPUT BUFFER, IF ANY. CALL DELTB ;DEALLOCATE DEFAULT INPUT BUFFERS CLR U.TDIF(R4) ;CLEAR POINTER .ENDC ;T$$EIO0 MOV #IE.NOD&377,R0 ;ERROR - NO BUFFER AVAILABLE BR 20$ ;SKIP10$: MOV #IS.SUC,R0 ;SUCCESS20$:& JMP IOFIN ;FINISH THE OUTPUT REQUEST30$:+ MOV R3,U.TCO(R4) ;U.TCO <-- PACKET ADDRESSE+ MOVB I.FCN(R3),R0 ;GET IO SUBFUNCTION CODES .IF DF T$$RPR TST (R3) ;PROMPT FOR IO.RPR? BEQ 40$ ;N - JUMPC ASSUME TF.WAL,TF.BIN*4D& ASL R0 ;SHIFT SUBF. CODE LEFT 2 BITS ASL R0  .IF DF T$$CUP ASSUME TF.RCU,S2.RCUA4 BIC #TF.RCU,R0 ;CAN'T DO CURSOR RESTORE WITH IO.RPR .ENDC ;T$$CUP! BIS #S1.IBY,(R5) ;SET INPUT BUSYU4 ADD #10,R3 ;ADVANCE PACKET POINTER SO OFFSET I.PRM( ;FROM R3 POINTS AT PROMPT PARAMETERS7 MOV R2,U.TFPB(R4) ;SAVE POINTER TO FIRST PROMPT BUFFERD .ENDC ;T$$RPR40$: ASSUME S2.WAL,TF.WALD ASSUME S2.RCU,TF.RCU BIC #^C,R0+ ;CLEAR ALL BUT WAL AND RCU SUBFUNCTIONSI# TST (R5)+ ;POINT TO STATUS WORD 2 0 BIC #S2.WAL!S2.PCU!S2.RCU,(R5) ;CLEAR OLD FLAGS$ BIS R0,(R5) ;OR INTO STATUS WORD 2 MOV R4,R1 ADD #U.TOC,R1 ;POINT TO U.TOC CLR (R1)+ ;CLEAR U.TOC ASSUME U.TTOC,U.TOC+23 MOV I.PRM+4(R3),(R1)+ ;U.TTOC <-- TOTAL BYTE COUNTO ASSUME U.TFOB,U.TTOC+2A& MOV R2,(R1) ;LINK BUFFER TO LISTHEAD; ,; INTERPRET AND SAVE VERTICAL FORMAT CONTROL;A' BIC #S2.CR,(R5) ;ASSUME NO TRAILING CRC .IF DF T$$CUP- TSTB I.PRM+7(R3) ;CURSOR POSITION SPECIFIED?U BEQ 50$ ;N - JUMP 9 MOV I.PRM+6(R3),U.TOC(R4) ;Y - SAVE CURSOR POS. IN U.TOCC BIS #S2.PCU,(R5) ;SET FLAG BR 80$ ;50$: .ENDC ;T$$CUP2 MOV #VFCRT,R0 ;POINT TO RECOGNITION TABLE FOR VFC60$: TSTB (R0)+ ;END OF TABLE?P BMI 70$ ;Y - JUMPC CMPB -1(R0),I.PRM+6(R3) ;MATCH? BNE 60$ ;N - LOOPR70$:( SUB #CHRT+1,R0 ;GET INDEX IN CHRD TABLE ASL R0 ;MAKE WORD INDEXC3 MOVB CHRD(R0),U.TVFC(R4) ;STORE ENCODED VFC IN UCB$ ;(SEE MODULE "TTDAT" FOR CODING) ASSUME ,0I0 BISB CHRD+1(R0),1(R5) ;SAVE CR FLAG IN U.TSTA+280$:# TST -(R5) ;POINT TO STATUS WORD 1# .IF DF T$$RPR* MOV U.TCO(R4),R0 ;GET REAL PACKET POINTER8 MOV SP,I.PRM+16(R0) ;ASSUME WE CAN BUFFER ALL OUTPUT IN& ;ONE LIST - MAKE I.PRM+16 NON-ZERO .IFF ;T$$RPR18 MOV SP,I.PRM+16(R3) ;ASSUME WE CAN BUFFER ALL OUTPUT IN& ;ONE LIST - MAKE I.PRM+16 NON-ZERO .ENDC ;T$$RPR .DSABL LSBD.PAGET& .SBTTL OUTPUT REQUEST BUFFER HANDLING& .SBTTL . WRITE1 - FILL OUTPUT BUFFERS;S;+3; **-WRITE1 - FILL OUTPUT BUFFERS WITH OUTPUT DATA.S;2 ; INPUTS:'; U.TFOB POINTER TO FIRST OUTPUT BUFFERD; R3 POINTER TO PACKET; (ADVANCED 4 WORDS IF IO.RPR)M; R4 POINTER TO UCBX; R5 POINTER TO U.TSTA$; U.TCHP CURRENT HORIZONTAL POSITION"; U.TCVP CURRENT VERTICAL POSITION(; U.TVFC ENCODED VERTICAL FORMAT CONTROL;-; WRITE1:O .IF DF T$$RPR ASSUME U.TCHP&1,0 ASSUME U.TCVP,U.TCHP+1D> MOV U.TCHP-U.TSTA(R5),-(SP) ;SAVE CURRENT HOR. AND VERT. POS. .ENDC .IF DF T$$CUP7; SAVE CURRENT HORIZONTAL AND VERTICAL POSITION IN CASE2; CURSOR RESTORE IS REQUESTED.;I ASSUME U.00}|.|TADATADATADATADATADATADATADATADATATSHP&1,0 ASSUME U.TSVP,U.TSHP+1  .IF DF T$$RPR MOV (SP),U.TSHP(R4) .IFF ;T$$RPRP! MOV U.TCHP-U.TSTA(R5),U.TSHP(R4)R .ENDC ;T$$RPR' MOV #EXPC3,EXPCP ;SET POINTER TO EXPC3C .IFTF ;T$$CUP ; TO; CHECK IF 'PURE' IO.WAL. IF IT IS 'PURE', MEANING NO VFC, CURSOR POSITIONING, HL; ETC. TRANSFER IS DONE DIRECTLY FROM A TASK BUFFER, OTHERWISE TRANSFER IS .; DONE THROUGH INTERMEDIATE TTDRV BUFFERS ; S  .IF DF T$$DMA & BIT #S2.WAL,2(R5) ;DOING IO.WAL?  BEQ 5$ ;NO 7 BIT #S5.DMA,U.TST5-U.TSTA(R5) ;CHECK FOR DMA DEVICE (' BEQ 5$ ;NO. SETUP INTERNAL BUFFERS C5 BIT #S1.IBY,(R5) ;CHECK IF IO.RPR!TF.BIN IN PROGERSS # BNE 5$ ;YES. SETUP REGULAR OUTPUTW  .IF DF T$$CUP 9 BIT #S2.PCU!S2.RCU!S2.CR,2(R5) ;CURSOR POS. REQUESTED? U W .IFF ;DF T$$CUP T0 BIT #S2.CR,2(R5) ;CARRIAGE RETURN AT THE END? D .IFTF ;DF T$$CUP ' BNE 5$ ;YES. SETUP INTERNAL BUFFERS ; .ENDC ;DF T$$CUP T R" TSTB U.TVFC(R4) ;CHECK FOR VFC & BNE 5$ ;YES. SETUP INTERNAL BUFFERS  MOV U.TCO(R4),R3 ; + MOV R1,-(SP) ;SAVE R1. $TSTBF WILL KILL ITT% CALL $TSTBF ;CHECK IF TASK IS FIXED - BCC 3$ ;NOT FIXED - USE INTERMEDIATE BUFFER!3 .IF LT T$$BFL-12 ;CHECK IF BUFFER HAS ENOUGH SPACEF .ERROR .ENDC ; ,&;SETUP TRANSFER FROM A TASK BUFFER ; . % MOV U.TFOB(R4),R2 ;GET BUFFER ADDR .$ MOV I.PRM(R3),R1 ;GET TASK BUFFER  CLR R0 ;  ASHC #6,R0 ;GET PHYS. ADDR V$ CLR (R2)+ ;CLEAR LINK WORD FOR WAL# TST (R2)+ ;STEP TO NEXT OFFSET T( MOV U.TTOC(R4),(R2)+ ;SETUP COUNTER ! MOV R0,(R2)+ ;GET HIGH 6 BITS E- MOV I.PRM+2(R3),(R2) ;GET VIRTUAL ADDRESS ' BIC #160000,(R2) ;CONVERT TO OFFSET  ADD R1,(R2) ;GET LOW ADDR F ADC -(R2) ;ADJUST HIGH BITS 2 CLR U.TTOC(R4) ;CLEAR TOTAL BYTE COUNTER IN UCBX 0 MOV (SP)+,R1 ;RESTORE R1 (SAVED BEFORE $TSTBF) ; BIC #S2.FLF,2(R5) ;;CLEAR FORCE-LF FLAG (LF IS FORCED ONLY ! ;ON ECHO, NOT ON TASK OUTPUT)V: BIS #S5.DWA,U.TST5-U.TSTA(R5); SET DMA IO.WAL IN PROGRESS JMP 80$ ;GO ON U3$: MOV (SP)+,R1 ;RESTORE R15$:M  .ENDC ;T$$DMA M R T* MOV U.TFOB(R4),R0 ;GET FIRST BUFFER IN R0+ MOV #SETOBF,-(SP) ;FIRST SET UP NEW BUFFERD .IFT ;T$$CUP)* BIT #S2.PCU,2(R5) ;CURSOR POS. REQUESTED? BEQ 10$ ;N - JUMPN- MOV U.TOC(R4),R2 ;Y - GET CURSOR COORDINATES  SUB #401,R2 ;ADJUST TO BASE 0E4 MOV #CPOS,EXPCP ;SET POINTER TO CURSOR POS. ROUTINE CALL @(SP)+ ;CALL COROUTINEA+ MOV #EXPC3,EXPCP ;RESTORE POINTER TO EXPC3S BIC #S2.PCU,2(R5) ;CLEAR FLAG BR 40$ ; .ENDC ;T$$CUP; .; CHECK IF ANY LEADING LF'S SHOULD BE INSERTED; 10$:# TSTB U.TVFC(R4) ;GET VFC CHARACTER0% BEQ 40$ ;NO LEADING LF OR FF - JUMPB .IF DF T$$RPR&T$$EIO9 BIT #S6.EIO,U.TST6-U.TSTA(R5) ;WAS THIS AN EXTENDED I/O?J BEQ 15$ ;BR IF NOT* MOV U.TCO(R4),R2 ;GET SAVED OUTPUT PACKET TST (R2) ;IS THIS IO.RPR BEQ 15$ ;IF EQ, NO6 TSTB U.TCHP-U.TSTA(R5) ;AT LEFT (OTHER RIGHT) MARGIN?" BNE 40$ ;IF NE NO, JUMP AND PRAY15$: .ENDC ; DF T$$RPR&T$$EIOL& MOVB U.TVFC(R4),R2 ;GET VFC CHARACTER BPL 30$ ;FF - JUMP20$:! MOVB #CH.LF,R2 ;ONE OR MORE LF'S30$: CALL @(SP)+ ;INSERTR INCB U.TVFC(R4) ;ANY MORE LF'S? BEQ 35$ ;N - JUMPD BMI 20$ ;Y - LOOPB' CLRB U.TVFC(R4) ;JUST DID A FF - CLEAR ;E$; INSERT CHARACTERS FROM TASK BUFFER;T35$: .IF DF T$$RPR&T$$EIOA9 BIT #S6.EIO,U.TST6-U.TSTA(R5) ;WAS THIS AN EXTENDED I/O?  BEQ 40$ ;BR IF NOT* MOV U.TCO(R4),R2 ;GET SAVED OUTPUT PACKET TST (R2) ;IS THIS IO.RPR BEQ 40$ ;IF EQ, NO. BIS #S2.ELF,2(R5) ;SET THE EAT-A-LINEFEED BIT .ENDC ; DF T$$RPR&T$$EIOV40$: ;REFERENCE LABEL .IF DF T$$ACD6 TST U.ACB-U.TSTA(R5) ;DOES THIS TERMINAL HAVE AN ACD? BEQ 48$ ;N - JUMP$? BIT #UA.TRN,U.AFLG-U.TSTA(R5) ;IN THE MIDDLE OF A TRANSLATION?E2 BNE 44$ ;Y - CONTINUE FROM POINT OF INTERRUP00|{ D%B11110010TION= TST U.TTOC(R4) ;HAVE WE ALREADY BEEN THROUGH THIS CODE PATH?E( BEQ 60$ ;Y - JUST OUTPUT A TRAILING CR242$: CLR U.AFLG-U.TSTA(R5) ;SET DEFAULT PROCESSING MOV R0,-(SP) ;SAVE R0= MOV #A.TRAN,R0 ;SET OUTPUT CHARACTER TRANSLATION ENTRY POINTN CALL $SWACD ;CALL ACD MOV (SP)+,R0 ;RESTORE R0E BIT #UA.TRN,U.AFLG-U.TSTA(R5) ;DOES ACD WANT TO PERFORM TRANSLATION?? BEQ 48$ ;N - JUMP$@ CLR U.TTOC(R4) ;ACD WILL DETERMINE NUMBER OF CHARACTERS OUTPUT %44$: MOV U.ACB-U.TSTA(R5),R2 ;GET ACB ? ADD #A.SMAP,R2 ;POINT TO SYSTEM STATE BUFFER PARAMETERS OFFSETC/46$: MOV (R2)+,KISAR6 ;MAP BUFFER PASSED BY ACD * MOVB @(R2)+,R2 ;GET CHARACTER FROM BUFFER* MOV $DALED,KISAR6 ;RESTORE DRIVER MAPPING1 CALL @(SP)+ ;INSERT CHARACTER INTO TTDRV BUFFERN! MOV U.ACB-U.TSTA(R5),R2 ;GET ACB(7 ADD #A.SMAP+2,R2 ;POINT TO SYSTEM STATE BUFFER ADDRESSS INC (R2)+ ;UPDATE POINTERI DEC @R2 ;DECREMENT COUNT4 BEQ 42$ ;ZERO - CALL ACD TO GET NEXT BUFFER IF ANY5 CMP -(R2),-(R2) ;BACKUP TO BUFFER ADDRESS DOUBLEWORDD/ BR 46$ ;LOOP TO GET AND INSERT NEXT CHARACTERE .ENDC ;T$$ACD:48$: TST U.TTOC(R4) ;ANY MORE CHARACTERS FROM TASK BUFFER?) ;(THERE WON'T BE IF WE COME HERE FROM6% ;"FPORD" TO OUTPUT A TRAILING CR)  BEQ 60$ ;N - JUMPO*50$: MOV I.PRM(R3),KISAR6 ;MAP TASK BUFFER) MOVB @I.PRM+2(R3),R2 ;GET NEXT CHARACTERS* MOV $DALED,KISAR6 ;RESTORE DRIVER MAPPING CALL @(SP)+ ;INSERT CHARACTER/ INC I.PRM+2(R3) ;UPDATE POINTER IN TASK BUFFERA+ DEC U.TTOC(R4) ;DECREMENT TOTAL BYTE COUNTS BNE 50$ ;MORE TO DO - LOOP;E,; CHECK IF TRAILING CARRIAGE RETURN REQUIRED;(60$: BIT #S2.CR,2(R5) ;INSERT CR AT END? BEQ 70$ ;N - JUMP  MOVB #CH.CR,R2 ;Y - DO IT CALL @(SP)+ ;"( BIC #S2.CR,2(R5) ;CLEAR CR AND ELF FLAG70$: .IF DF T$$CUP- BIT #S2.RCU,2(R5) ;CURSOR RESTORE REQUESTED?R BEQ 80$ ;N - JUMPC- MOV U.TSHP(R4),R2 ;Y - GET SAVED CURSOR POS.I4 MOV #CPOS,EXPCP ;SET POINTER TO CURSOR POS. ROUTINE CALL @(SP)+ ;CALL COROUTINEA+ MOV #EXPC3,EXPCP ;RESTORE POINTER TO EXPC3S BIC #S2.RCU,2(R5) ;CLEAR FLAG .ENDC ;T$$CUP80$:) MOV -(R1),R2 ;GET POINTER TO NEXT BUFFER,# BEQ 90$ ;NO UNUSED BUFFERS - JUMPN2 CLR (R1) ;END THE LIST WITH THE LAST USED BUFFER5 CLZ ;CLEAR CC-Z TO TELL DELTB TO DEALLOCATE A LIST.+ CALL DELTB ;DEALLOCATE THE UNUSED BUFFERSS90$: .IF DF T$$RPR. MOV U.TCO(R4),R3 ;RESTORE REAL PACKET POINTER .IFTF ;T$$RPR7 TST I.PRM+16(R3) ;DID WE MANAGE TO BUFFER ALL THE DATAP ;IN ONE BUFFER LIST? BEQ WRITE2 ;N - JUMP3 CALL $TSTBF ;Y - TEST IF TASK CAN BE CHECKPOINTED. BCS CLR16 ;N - JUMPM .IFT ;T$$RPRP TST (R3) ;IS THIS AN IO.RPR? BEQ 100$ ;N - JUMP .IF DF T$$EIO ASSUME S6.RDI,100000T3 TST U.TST6-U.TSTA(R5) ;READING WITH DEFAULT INPUT?O+ BPL 95$ ;IF EQ NO, MUST ALLOCATE A BUFFERUD MOV U.TDIF(R4),U.TFIB(R4) ;USE DEFAULT INPUT BUFFERS FOR INPUT DATA/ BNE 100$ ;IF NE THERE ARE SOME BUFFERS TO USE1- BR CLR16 ;ELSE NOT ENOUGH AVAILABLE BUFFERS  .ENDC ;T$$EIO,95$: CALL ALTB ;ALLOCATE FIRST INPUT BUFFER BCS CLR16 ;FAILED - JUMP, MOV R2,U.TFIB(R4) ;OK - SAVE BUFFER POINTER .IFTF ;T$$RPR100$:I0 CALL $INIBF ;INITIALIZE INTERMEDIATE BUFFERING BR WRITE2 ;START OUTPUTTCLR16:$ CLR I.PRM+16(R3) ;USE $IOFIN AT END2 .SBTTL . WRITE2 - START OUTPUT OF THE BUFFER LIST;U*; WRITE2 - START OUTPUT OF THE BUFFER LIST; WRITE2: .IFT ;T$$RPR; TST (R3) ;IO.RPR?F BEQ 10$ ;N - JUMP1= BIS #S5.RPO,U.TST5-U.TSTA(R5) ;SET PROMPT OUTPUT IN PROGRESS: CLR (R3) ;INITIALIZE STATUSU!10$: CMP (SP)+,(SP)+ ;CLEAN STACKU .IFF ;T$$RPRB TST (SP)+ ;CLEAN STACK .ENDC ;T$$RPR. MOV #STAXL,-(SP) ;START OUTPUT OF BUFFER LIST JMP LOCKI ; .PAGEA@ .SBTTL . PRLF - OUTPUT LEADING LF FOR SOLICITED INPUT IF NEEDED; =; PRLF - OUTPUT LEADING LF FOR SOLICITED INPUT AT LEFT MARGINO;UPRLF:E .IF DF T$$SPL, MOV #120000,R4 ;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPL-" MOV U.TUX-U.TSTA(R5),R4 ;GET UCBX .ENDC ;T$$SPL5 CALL EXCR1 ;EXPAND A CARRIAGE RETURN (YIELDING LF!)( M00|.|TADATADATADATADATADATADATADATADATAOV #ECHSTR,-(SP) ;OUTPUT LF JMP LOCKI.PAGEP= .SBTTL . INSERT - INSERT (EXPANSION OF) CHARACTER IN BUFFER.O;U;+P; INSERT - INSERT (THE EXPANSION OF) ONE CHARACTER IN THE CURRENT OUTPUT BUFFER.;L ; INPUTS:%; R0 CURRENT POINTER IN OUTPUT BUFFER 4; R1 POINTER TO SECOND WORD IN CURRENT OUTPUT BUFFER; R2 CHARACTER TO INSERT; R4 POINTER TO UCBX; R5 POINTER TO U.TSTA;$ ; OUTPUT:VD; 1. IF (THE EXPANSION OF) THE CHARACTER FITS IN THE CURRENT BUFFER,@; OR IF IT DOES NOT BUT ANOTHER BUFFER IS SUCCESSFULLY ALLOCATED9; AND LINKED TO THE OLD BUFFER, THE CHARACTER IS INSERTEDI4; AND THE CALLER IS CALLED BACK AS A COROUTINE WITH: ; R0 UPDATED-; R1 POINTER TO SECOND WORD IN CURRENT BUFFERE; (MAY BE A NEW BUFFER); R2 DESTROYED; R3-R5 UNCHANGED 5; THE CALLER MAY NOW LOAD ANOTHER CHARACTER IN R2 AND22; HAVE IT INSERTED BY A "CALL @(SP)+" INSTRUCTION.;R>; 2. ELSE, IF THIS IS THE PROMPT FOR AN IO.RPR, THE HORIZONTAL3; AND VERTICAL POSITION AND THE WRAP-AROUND CONTEXT 2; IS RESTORED, AND THE ERROR IE.NOD IS RETURNED TO"; THE TASK. (NO RETURN TO CALLER).; >; 3. ELSE, OUTPUT IS STARTED WITH THE CURRENT LIST OF BUFFERS.; (NO RETURN TO CALLER).;-; .ENABL LSBNINSERT:B MOV R3,-(SP) ;SAVE R310$: CLR -(SP) ;CLEAR FLAGR MOV R2,-(SP) ;SAVE CHARACTERN ASSUME U.TCHP&1,0 ASSUME U.TCVP,U.TCHP+1I3 MOV U.TCHP-U.TSTA(R5),-(SP) ;SAVE CURRENT POSITIONE* MOV 2(R5),-(SP) ;SAVE WRAP-AROUND CONTEXT& ;(IF EXPANDED STRING DOES NOT FIT): BIC #S2.FLF,2(R5) ;CLEAR FORCE-LF FLAG (LF IS FORCED ONLY! ;ON ECHO, NOT ON TASK OUTPUT)  .IF DF T$$CUP2 CALL @EXPCP ;EXPAND CHAR. OR CURSOR POS. COMMAND .IFF ;T$$CUP  CALL EXPC3 ;EXPAND CHARACTER .ENDC ;T$$CUP5 BVC 15$ ;IF V IS SET, THIS CHAR. IS TO BE DISCARDEDR ASL 6(SP) ;CLEAR SAVED CARRY BR 40$ ;GO TO RESTORE STACK.15$:, BEQ 30$ ;SINGLE CHARACTER EXPANSION - JUMP ROL 6(SP) ;SAVE CC-C' ADD R2,(R1) ;UPDATE BUFFER BYTE COUNT % CMP (R1),#T$$BFL-4 ;DOES STRING FIT?C BHI 50$ ;N - JUMP 20$:* MOVB (R3)+,(R0)+ ;COPY STRING INTO BUFFER SOB R2,20$ ;LOOP BR 40$ 30$:7 CMP (R1),#T$$BFL-4 ;ROOM FOR ONE MORE CHAR. IN BUFFER? BHIS 60$ ;N - JUMP$ MOVB R2,(R0)+ ;Y - INSERT CHARACTER INC (R1) ;UPDATE BYTE COUNTT40$:< CMP (SP)+,(SP)+ ;POP SAVED POSITION AND WRAP-AROUND CONTEXT MOV (SP)+,R2 ;RESTORE CHARACTER; ROR (SP)+ ;NEED TO CALL EXPCHR AGAIN WITH THIS CHARACTER?S BCS 10$ ;Y - LOOP) MOV (SP)+,R3 ;N - RESTORE R3C CALL @(SP)+ ;CALL CALLER BACKT BR INSERT ;DO IT AGAIN;:-; CHARACTER EXPANSION DOES NOT FIT IN BUFFER.SF; RESTORE CURRENT HORIZONTAL AND VERTICAL POSITION AND STATE VARIABLE.;A50$:( SUB R2,(R1) ;RESTORE BUFFER BYTE COUNT;+I; RESTORE PREVIOUS WRAP AND POSITION CONTEXT. *** NOTE *** MOST BITS OFPI; U.TSTA+2 ARE MODIFIED ONLY AT SYSTEM STATE OR DURING CHARACTER ECHOING.AH; ECHOING CAN NOT INTERRUPT US HERE BECAUSE INPUT PROCESSING IS DISABLEDH; BY S1.DSI. HOWEVER, A FEW BITS ARE MODIFIED DURING INPUT PRIOR TO THEH; S1.DSI CHECK (^O, ^S, TABUF FULL). THE STATE OF THES BITS MUST NOT BE(; DISTURBED WHEN RESTORING WRAP CONTEXT.;V60$:C BIC #S2.BEL!S2.CTO!S2.CTS,(SP) ;CLEAR BITS WE DON'T WANT TO AFFECTED BIC #^C,2(R5) ;WIPE OUT BITS WE WANT TO RESET' BIS (SP)+,2(R5) ;RESTORE STATUS WORD 2D ASSUME U.TCHP&1,0 ASSUME U.TCVP,U.TCHP+1E6 MOV (SP)+,U.TCHP-U.TSTA(R5) ;RESTORE CURRENT POSITION;R ; ALLOCATE ANOTHER OUTPUT BUFFER;O) MOV -(R1),R2 ;GET POINTER TO NEXT BUFFER 4 BNE 70$ ;THERE IS A FREE BUFFER IN THE LIST - JUMP$ CALL ALTB ;ALLOCATE ANOTHER BUFFER70$:/ MOV R2,R0 ;GET BUFFER ADDRESS (IF WE GOT ONE)2 MOV (SP)+,R2 ;RESTORE CHARACTER/ MOV R2,(SP)+ ;POP FLAG WORD (DON'T TOUCH CC-C)O MOV (SP)+,R3 ;RESTORE R3T .IF DF T$$RPR BCS 80$ ;FAILED - JUMP .IFF ;T$$RPR( BCS CLR16 ;FAILED - CLEAR I.PRM+16 AND ;START OUTPUTH .ENDC ;T$$RPR% MOV R0,(R1) ;LINK NEW BUFFER TO OLDH2 .SBTTL . SETOBF - INITIALIZE OUTPUT BUFFER HEADERSETOBF: ! TST (R0)+ ;POINT TO SECOND WORD  MOV R0,R1 ;SAVE POIN00|{ D%B11110010TER IN R1A, CLR (R0)+ ;INITIALIZE BYTE COUNT AND POINT ;TO START OF DATA AREA# BR INSERT ;START USING NEW BUFFERR;M; FAILED TO ALLOCATE BUFFERO;  .IF DF T$$RPR80$:* MOV U.TCO(R4),R3 ;GET REAL PACKET POINTER TST (R3) ;IO.RPR?% BEQ CLR16 ;N - START PARTIAL OUTPUT  ;AFTER CLEARING I.PRM+16 TST (SP)+ ;POP RETURN ADDRESSV ASSUME U.TCHP&1,0 ASSUME U.TCVP,U.TCHP+1 6 MOV (SP)+,U.TCHP-U.TSTA(R5) ;RESTORE CURRENT POSITION- BIC #S2.WRA,2(R5) ;CLEAR WRAP-AROUND CONTEXTS; MOV #IE.NOD&377,(R3) ;GET STATUS FOR "NO BUFFER AVAILABLE"I CLR I.PRM+16(R3) ;USE $IOFIN+ ;FALL THRU TO "FPORD" TO FINISH REQUESTA .ENDC ;T$$RPR .DSABL LSBF.PAGER! .SBTTL OUTPUT REQUEST COMPLETIONR% .SBTTL . FPORD - OUTPUT REQUEST DONE;B;+; FPORD - OUTPUT REQUEST DONE.; 5; COME HERE WHEN ALL OUTPUT BUFFERS HAVE BEEN OUTPUT.R2; TRANSFER MAY OR MAY NOT BE COMPLETED - IF IT IS,5; STATUS IS STORED IN THE LINK WORD OF THE IO PACKET.;C8; THIS ROUTINE IS ENTERED FROM THE FORK DISPATCHER WITH:; R4 UCBX ADDRESS ; R5 POINTER TO U.TSTA;-;RFPORD::(! MOV U.TCO(R4),R3 ;GET I/O PACKET  TST (R3) ;STATUS PRESENT? BNE ORQDON ;Y - JUMP TST U.TTOC(R4) ;ALL DONE? BNE 10$ ;N - MORE TO DO, JUMP 1 ;NOTE - THIS CANNOT HAPPEN WHEN DOING IO.RPR!P( BIT #S2.CR,2(R5) ;TRAILING CR REQUIRED? BEQ 20$ ;IF EQ, NO...SKIPP10$: MOV R4,R1 ;POINT TO UCBX- ADD #U.TFOB,R1 ;POINT TO FIRST OUTPUT BUFFERH JMP WRITE1 ;BRANCH AID20$: INC (R3) ;SET STATUS = IS.SUCT. .SBTTL . ORQDON - OUTPUT REQUEST HAS FINISHED;I; OUTPUT DONE.;ORQDON::/ CLR U.TCO(R4) ;CLEAR POINTER TO PACKET TO SHOW # ;NOT DOING TASK OUTPUT ANY MORE " BIC #S1.OBY,(R5) ;SET OUTPUT FREE .IF DF T$$RPR? BIT #S5.RPO,U.TST5-U.TSTA(R5) ;WAS THIS PROMPT OF RPR REQUEST?T BEQ 20$ ;N - JUMPN? BIC #S5.RPO,U.TST5-U.TSTA(R5) ;CLEAR PROMPT OUTPUT IN PROGRESSP# TSTB (R3) ;HAVE AN ERROR ALREADY?T BMI 10$ ;Y - JUMPH2 FRKBIT BIS,#FR.GRQ ;TRY ANOTHER PACKET WHEN INPUT/ ;HAS BEEN STARTED (LINE MAY BE FULL DUPLEX)S JMP PPRLB1 ;NOW DO THE READN* ;(LEAVE LINK WORD NON-ZERO TO INDICATE ;DOING IO.RPR)10$:! BIC #S1.IBY,(R5) ;SET INPUT FREE% CLR U.TFPB(R4) ;CLEAR BUFFER POINTER6 TST I.PRM+16(R3) ;INTERMEDIATE BUFFERING INITIALIZED?2 BEQ 15$ ;IF EQ- NO, NO NEED TO DEALLOCATE BUFFER, MOV U.TFIB(R4),R2 ;GET INPUT BUFFER POINTER$ CALL DETB ;DEALLOCATE INPUT BUFFER15$: .IF DF T$$EIO: MOV U.TDIF(R4),R2 ;GET FIRST DEFAULT INPUT BUFFER, IF ANY. CALL DELTB ;DEALLOCATE DEFAULT INPUT BUFFERS CLR U.TDIF(R4) ;CLEAR POINTER) MOV U.TRTT(R4),R2 ;ANY TERMINATOR TABLE?T BEQ 16$ ;BRANCH IF NOT CALL DETB ;DEALLOCATE IT* CLR U.TRTT(R4) ;AND CLEAR OUT THE POINTER16$: .ENDC ;T$$EIO .ENDC ;T$$RPR20$: .IF DF T$$ACD6 TST U.ACB-U.TSTA(R5) ;DOES THIS TERMINAL HAVE AN ACD? BEQ 30$ ;N - JUMP 2 MOV #A.OUTP,R0 ;SET OUTPUT COMPLETION ENTRY POINT CALL $SWACD ;CALL ACDE .ENDC ;T$$ACD30$:+ MOV U.TFOB(R4),R2 ;GET FIRST OUTPUT BUFFER $ CALL DELTB ;DEALLOCATE ALL BUFFERS2 MOV I.PRM+4(R3),R1 ;GET NUMBER OF BYTES REQUESTED# SUB U.TTOC(R4),R1 ;SUBTRACT U.TTOC ;A@; IF A REQUEST IS ABORTED (BY TIME-OUT OR IO.KIL), WE RETURN THE>; NUMBER OF BYTES TRANSFERRED, INCLUDING THE CURRENT (PARTIAL)=; BUFFER. THERE IS NO WAY WE CAN FIND OUT HOW MANY BYTES FROMA>; THE TASK'S BUFFER CORRESPOND TO THE NUMBER OF EXPANDED BYTES'; THAT WE SENT FROM THE CURRENT BUFFER.C;  ASSUME TF.WIR,2002 TSTB I.FCN(R3) ;DOES USER WANT INPUT REDISPLAYED? .IF DF T$$BTW BMI 40$ ;IF MI, YES...DO ITP* CMPB I.PRI(R3),#251. ;WAS THIS AN IO.WBT? BNE 70$ ;N - JUMPU ASSUME S3.FDX,200 TSTB 4(R5) ;FULL DUPLEX LINE?E BMI 70$ ;Y - JUMPE40$: .IFF ;T$$BTWY4 BPL 70$ ;IF PL, NO...JUST FINISH THE INPUT REQUEST .ENDC ;T$$BTW ASSUME S1.IBY,200 TSTB (R5) ;INPUT BUSY? BPL 70$ ;N - JUMPD; =; WE JUST FINISHED AN IO.WBT THAT BROKE THROUGH AN INPUT ON AU>; NON-FULL-DUPLEX LINE. FAKE A CTRL-R TO REDISPLAY THE CURRENT ; INPUT LINE.E;C; THERE CANNOT BE A FORK REQUE00||TADATADATADATADATADATADATADATADATAST PENDING FOR INPUT DONE (OR PARTIAL2C; INPUT DONE) SINCE INPUT FORK REQUESTS ARE PROCESSED BEFORE OUTPUTT; FORK REQUESTS.;E .IF DF T$$SPL@ MOVB #CH.CTR,U.TECO-U.TSTA(R5) ;PUT CTRL-R CHAR. IN ECHO BUFFER .IFF ;T$$SPLR9 MOVB #CH.CTR,U.TECB(R4) ;PUT CTRL-R CHAR. IN ECHO BUFFERI .ENDC ;T$$SPL1 FRKBIT BIS,#FR.PFP ;REQUEST POST-FORK PROCESSINGR .IF DF T$$ESC;UC; IF WE ARE IN THE MIDDLE OF AN ESCAPE SEQUENCE, WE MUST RUB IT OUTN=; SINCE THE ESCAPE SEQUENCE AND CTRL-R ROUTINES SHARE U.TISV.P5; FURTHERMORE, CTRL-R DOES NOT WORK IF S1.ESC IS SET.Q;T& BIT #S1.ESC,(R5) ;IN ESCAPE SEQUENCE? BEQ 70$ ;N - JUMPD MOV R3,-(SP) ;SAVE R3- CALL RUBESC ;Y - RUBOUT THE ESCAPE SEQUENCEF MOV (SP)+,R3 ;RESTORE R3  .ENDC ;T$$ESC70$:? CLR I.PRM+12(R3) ;TELL $FINBF NO BUFFERS TO COPY OR DEALLOCATE.; ; FALL THRU TO "DONE"E;N.PAGE* .SBTTL DONE - GENERAL I/O DONE PROCESSING; ;+&; DONE - DO I/O COMPLETION PROCESSING.;I; INPUT:; R1 IOSB WORD 2; R3 POINTER TO PACKET; I.LNK = IOSB WORD 1; R5 POINTER TO U.TSTA#; I.PRM+16 0 IF $IOFIN TO BE USED, ; NON-0 IF $QUEBF TO BE USED;- ; OUTPUT:V; I/O REQUEST FINISHED.L;U#; REGISTERS ALTERED: R0,R1,R2,R3,R4F;-;VDONE::7 FRKBIT BIS,#FR.GRQ ;TIME TO TRY TO GET ANOTHER PACKET  MOV (R3),R0 ;GET IOSB WORD 1 TST I.PRM+16(R3) ;USE $QUEBF? BEQ 10$ ;N - JUMP CALLR $QUEBF ;FINISH IOO10$: CALLR $IOFIN ;FINISH IO- .ENDOMPLETION PROCESSING.;I; INPUT:; R1 IOSB WORD 2; R3 POINT .TITLE TTSUBX .IDENT /07.00/C;R6; COPYRIGHT (c) 1988 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;R;; 02-FEB-78 PETER WANNHEDENP;T; PREVIOUSLY MODIFIED BY:H; ; P. WANNHEDEN; D. R. DONCHIN ; T. LEKAS ; R. PHILPOTTC ; S. ADAMS ; L. KOGAN;M; MODIFICATIONS:;B;S$; MODIFIED FOR RSX-11M-PLUS V4.1 BY:;U;.; L. KOGAN 18-SEP-87 06.02;.0; LK728 -- DO NOT SET UCBX POINTER IN UCB UNTIL&; INITIALIZATION IS COMPLETED; ;  .MCALL PKTDF$,EVNDF$S PKTDF$  EVNDF$H .PSECT MAP6;A;+9; TTSUBR - MISCELLANEOUS SUBROUTINES FOR TERMINAL DRIVER.F;-;I;S..SBTTL ALUCBX - ALLOCATE A UCB EXTENSION BLOCK;V;++; ALUCBX - ALLOCATE A UCB EXTENSION (UCBX). ;C; INPUT:; R5 POINTER TO U.TSTA;. ; OUTPUT:.(; IF SUCCESS, OR IF UCBX ALREADY EXISTS:; CC-C 0; R4 POINTER TO UCBX; U.TUX POINTS TO UCBX/; UCBX INITIALIZED (ONLY IF UCBX WAS ALLOCATED)N; ; IF FAILURE: ; CC-C 1;I; REGISTERS ALTERED: R0,R2,R4;-;C .IF NDF T$$SPL;F .ENABL LSB;. ASSUME U.TUX,U.TSTA-2.ALUCBX::MOV -(R5),R4 ;IS THERE ALREADY A UCBX? CLC ;ASSUME YES! BNE 10$ ;Y - EXIT WITH CC-C = 0N" CALL ALTB ;N - ALLOCATE A BUFFER& BCS 10$ ;FAILED - EXIT WITH CC-C = 1 MOV R2,R4 ;SAVE POINTER;; INITIALIZE A FEW CELLS;I ASSUME U.TCI,0I" ;U.TCI ALREADY CLEARED BY ALTB) CLR U.TCO(R2) ;NO CURRENT OUTPUT REQUESTD+ CLRB U.TISV(R2) ;INITIALIZE STATE VARIABLEU ASSUME U.TITI&1,0 ASSUME U.TOTI,U.TITI+12. CLR U.TITI(R2) ;CLEAR INPUT AND OUTPUT TIMERS> CLR U.TFPB(R2) ;CLEAR PROMPT BUF ADDRS/UNSOLICITED INPUT FLAG* CLR U.TRTT(R2) ;ASSUME NOT A RTT FUNCTION .IF DF T$$EIO9 CLR U.TDIF(R2) ;CLEAR FIRST DEFAULT INPUT BUFFER POINTERI .ENDC ;T$$EIO* .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB7 ADD #U.TAST,R2 ;POINT TO UNSOLICITED INPUT ACB ADDRESSC-X = U.TAST ;SYMBOL NEEDED FOR ASSUME MACROSU .IF DF T$$CCA4 CLR (R2)+ ;CLEAR ACB POINTER FOR UNSOLICITED INPUT X = X + 2  .ENDC ;T$$CCA .IF DF T$$SCA ASSUME U.TSCA,X X = X + 2C/ CLR (R2)+ ;CLEAR SWITCH CHARACTER ACB POINTER  .ENDC ;T$$SCA .IF DF T$$MHU ASSUME U.TMHA,X X = X + 2$ + CLR (R2)+ ;CLEAR MODEM HANGUP ACB POINTERT .ENDC ;T$$MHU .IF DF T$$ICS ASSUME U.TICA,X X = X + 2U& CLR (R2)+ ;CLEAR ICS ACB/TEP POINTER .ENDC ;T$$ICS .IF DF T$$OOB ASSUME U.TOBA,X X = X + 2 % CLR (R2) ;CL00|{ D%B11110010EAR OOB ACB/TEP POINTERR .ENDC ;T$$OOB* .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB MOV R4,(R5) ;SET UCBX POINTER ;EXIT WITH CC-C = 0 010$: MOV (R5)+,R4 ;RESTORE R5 AND GET UCBX IN R4! ;(OR 0 IF COMING FROM DEUCBX)M20$: RETURN ;RETURN; ; 0.SBTTL DEUCBX - DEALLOCATE A UCB EXTENSION BLOCK;;+'; DEUCBX - DEALLOCATE UCBX IF POSSIBLE. ;I; INPUT:; R5 POINTER TO U.TSTA;I ; OUTPUT:P7; IF LINE IS IDLE (BOTH INPUT AND OUTPUT), NOT ATTACHEDO); AND THERE ARE NO FORK REQUESTS PENDING,/,; THE UCBX (IF THERE IS ONE) IS DEALLOCATED.;T; REGISTERS ALTERED: R0,R2,R4M;-;R; (DEUCBX::MOV @R5,-(SP) ;GET STATUS WORD 15 BIC #^C,@SP ;CLEAR ALL BUT INPUT AND  ;OUTPUT BUSY FLAGS7 BIS U.TFRQ-U.TSTA(R5),@SP ;OR WITH FORK REQUEST FLAGS 3 BIS U.ATT-U.TSTA(R5),(SP)+ ;OR WITH ATTACH POINTERD! BNE 20$ ;IF NE DON'T DEALLOCATE  .IF DF T$$IDO. TST $MCRPT ;IS THE MCR DISPATCHER INSTALLED?/ BEQ 20$ ;IF EQ NO - DON'T DEALLOCATE THE UCBX  .ENDC ;T$$IDO MOV -(R5),R2 ;GET UCBXF BEQ 10$ ;NONE - EXIT CLR (R5)+ ;OK - CLEAR POINTERR ;FALL THRU TO "DETB";: .DSABL LSB  .IFTF ;NDF T$$SPL;C#.SBTTL DEALLOCATE A TERMINAL BUFFERP;A;+$; DETB - DEALLOCATE TERMINAL BUFFER.;S; INPUT:; R2 BUFFER ADDRESSS;L ; OUTPUT:U6; BUFFER DEALLOCATED TO TT-DRIVER POOL OR SYSTEM POOL.;I; REGISTERS ALTERED: R0,R2;-;$;O)DETB:: CMP R2,#120000 ;IN TT-DRIVER POOL?T BLO 10$ ;N - JUMP 4 MOV FREEB,@R2 ;Y - ADD TO FRONT OF FREE BUFFER LIST MOV R2,FREEB  RETURNF10$: MOV R1,-(SP) ;SAVE R1,R3( MOV R3,-(SP)A MOV R2,R0 ;GET BUFFER ADDRESST MOV #T$$BFL,R1 ;GET LENGTHF( CALL $DEACB ;DEALLOCATE TO SYSTEM POOL MOV (SP)+,R3 ;RESTORE REG'S MOV (SP)+,R1E RETURNF .PSECT MAP5* .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB.PAGEA9 .SBTTL . DQACB - AST CONTROL BLOCK WAS DEQUEUED BY SYSXT ;E;+1; **-DQACB - AST CONTROL BLOCK DEQUEUE PROCESSINGI; D; THIS SUBROUTINE IS CALLED WHEN SYSXT DEQUEUES AN AST CONTROL BLOCKK; THAT HAS A.CBL=0 AND THE DOUBLEWORD ADDRESS OF THIS ROUTINE IN A.KSR5 ANDRJ; A.DQSR. IF THIS ACB GOT MARKED FOR DELETE WHILE IT WAS IN THE AST QUEUEH; (AF.MDE SET), DEALLOCATE THE BLOCK NOW. OTHERWISE CLEAR THE FLAG THAT3; INDICATES THE BLOCK IS IN THE AST QUEUE (AF.QUE).A;$M; IF THE ACB IS FOR UNSOLICITED INPUT AST'S AND THE ACB IS NOT LOCKED (AF.LCKUJ; SET DUE TO TF.NOT CONSIDERATIONS), ATTEMPT TO GET ANOTHER CHARACTER FROM9; THE TYPEAHEAD BUFFER, WHICH WILL REQUEUE THE AST BLOCK.N;L ; INPUTS:; R0 => LINK WORD IN AST BLOCK;D; OUTPUTS: NONE.;N ; REGISTERS MODIFIED: R1,R3,R5;-;MDQACB:: ! CALL MAPD ;MAP DRIVER DATA AREAE' MOVB A.PRM+5(R0),R1 ;GET THE ACB FLAGSW ASSUME AF.MDE,200& BPL 3$ ;IF PL, NOT MARKED FOR DELETE MOV R0,-(SP) ;SAVE R0 JMP DEACB1 ;GO TO DEALLOCATE3$:N: BICB #AF.QUE,A.PRM+5(R0) ;CLEAR FLAG SAYING WE ARE QUEUED .IF DF T$$OOB$ BIT #AF.OOB,R1 ;IS THIS AN OOB AST? BEQ 5$ ;BR IF NO F9 TSTB A.PRM+24(R0) ;ANYTHING IN THE OOB TYPE AHEAD BUFFER0 BEQ 10$ ;IF NOT, WE'RE DONE. MOV #FR.OOB,R3 ;STILL MORE CHARACTERS WAITING9 MTPS #TTPRI ;DISABLE INTERUPTS WHILE CHANGING FORK LISTE% CALL FORK ;;;SO SET UP FORK REQUESTG MTPS #0 ;RE-ENABLE INTERPUTS BR 7$5$:N .ENDC ;T$$OOB+ BIT #TF.AST,R1 ;IS THIS ACB FOR AN IO.ATA? ) BEQ 10$ ;IF EQ, NO...NOTHING ELSE TO DO0# BIT #AF.LCK,R1 ;IS THE ACB LOCKED?5 BNE 10$ ;IF NE, YES...DON'T CHECK MORE UNSOL. INPUT* MOV A.PRM+2(R0),R5 ;GET POINTER TO U.TSTA7$:G .IF DF M$$PRO1 CLR R3 ;IF A SWITCH TO ANOTHER CPU TAKES PLACE,R* ;NO SPECIAL FORK PROCESSING ROUTINE IS* ;REQUIRED - JUST GET ANOTHER CHARACTER ;FROM THE TYPE-AHEAD BUFFERE# CALL SWCPU ;SWITCH TO CORRECT CPUB;I9; IF WE FALL THRU HERE, WE ARE ALREADY ON THE CORRECT CPU ;  .ENDC ;M$$PRO' CALL SETDSI ;DISABLE INPUT PROCESSING 10$:1 RETURN ;SIMULATE RETURN FROM A FORK PROCESSINGI. ;ROUTINE IN ORDER TO GET ANOTHER CHARACTER ;FROM THE TYPE-AHEAD BUFFER.* .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$IC00||TADATADATADATADATADATADATADATADATAS!T$$OOB;C;O;+@; DELTB0 - DRIVER ENTRY POINT TO DEALLOCATE INTERMEDIATE BUFFERS(; FOR INPUT REQUEST. CALLED FROM $FINBF.;; INPUT:"; R0 POINTER TO FIRST INPUT BUFFER;-;H; !DELTB0::CALL MAPD ;MAP DATA AREA  .IF DF T$$ACD$ BIT #1,R0 ;DO BUFFER TRANSFER NOW? BEQ 10$ ;N - JUMP & MOV R0,-(SP) ;Y - SAVE BUFFER ADDRESS2 CALL UBTRA ;CALL ROUTINE TO PERFORM THE TRANSFER% MOV (SP)+,R0 ;RESTORE BUFFER POINTERR DEC R0 ;MAKE EVENA .ENDC ;T$$ACD!10$: MOV R0,R2 ;GET FIRST BUFFERO% CALLR DELTB1 ;"FALL THRU" TO DELTB1R;O; ;.SBTTL DELTB - DEALLOCATE A LINKED LIST OF TERMINAL BUFFERSE;R;+0; DELTB - DEALLOCATE A LIST OF TERMINAL BUFFERS.;F; INPUT:*; R2 ADDRESS OF FIRST BUFFER IN LIST, OR 0!; CC-Z 0 IF R2 POINTS TO A BUFFERU;R ; OUTPUT:O@; BUFFER POINTED TO BY R2 AND ALL FOLLOWING BUFFERS DEALLOCATED.;L; REGISTERS ALTERED: R0,R2;-;H;R .PSECT MAP6 DELTB1:: E! MOV @R2,-(SP) ;SAVE LINK TO NEXTE# CALL DETB ;DEALLOCATE THIS BUFFER2 MOV (SP)+,R2 ;GET NEXT BUFFER(DELTB:: BNE DELTB1 ;THERE IS ONE - LOOP RETURN- A.PAGE 5 .SBTTL . IRESET - RESET INPUT STATE PROCESSING FLAGSE5; AND IRESEL (SAME AS IRESET BUT FIRST CALLS LOCKI)2;D;+%; **-IRESET - RESET INPUT STATE FLAGS0; I; THIS ROUTINE RESETS THE FLAGS IN U.TSTA THAT AFFECT THE INPUT PRE-INPUTOJ; AND INPUT PROCESSES OF THE TERMINAL DRIVER. ALL FLAGS ARE FIRST CLEAREDI; AND NEW SETTINGS ARE DERIVED FOR CERTAIN ONES FROM THE CURRENT STATE OF I; THE TERMINAL CHARACTERISTICS (U.TSTA+4). NOTE THAT THIS ROUTINE MAY BE1K; CALLED FROM EITHER INTERRUPT STATE WHEN A TERMINATOR IS SEEN OR FROM FORKS); LEVEL WHEN COMPLETING AN INPUT REQUEST.E; ; INPUTS:#; R5 => U.TSTA OF THE TERMINAL UCBE; ; OUTPUTS:T;; U.TSTA FLAGS SET ACCORDING TO CHARACTERISTICS IN U.TSTA+4T;F; REGISTERS MODIFIED: NONE. ;-;RIRESEL:: CALL LOCKI ;LOCK OUT INTERUPTSIRESET::B BIC #S1.TNE!S1.RST!S1.PTH!S1.RNE!S1.TSY!S1.RES!S1.RNF!S1.RSP,(R5) ;;CLEAR UNWANTED FLAGS. MOV 4(R5),-(SP) ;;GET CURRENT CHARACTERISTICS< BIC #^C,(SP) ;;CLEAR EXTRANEOUS FLAGS ASSUME S3.RAL,S1.PTHM ASSUME S3.NEC,S1.RNEM ASSUME S3.TSY,S1.TSYT6 BIT #S3.RAL,(SP) ;;IS TERMINAL IN READ-PASS-ALL MODE? BEQ 10$ ;;IF EQ, NO...SKIPB BIC #S1.TSY,(SP) ;;READ-PASS-ALL FORCES NO TTSYNC (S1.PTH IS SET)10$:2 BIT #S3.PTH,4(R5) ;;IS TERMINAL IN PASSTHRU MODE? BEQ 20$ ;;IF EQ, NO...SKIP2 BIS #S1.PTH,(SP) ;;SET PASSTHRU MODE IN THE FLAGS20$:. BIS (SP)+,(R5) ;;UPDATE THE INPUT STATE FLAGS RETURN ;;ALL DONE .PAGE6 .SBTTL . LOCKI/LOCKR - LOCK OUT INTERRUPTS AND RETURN;;+; LOCKI - LOCK OUT INTERRUPTS.,; THIS IS A COROUTINE THAT WORKS AS FOLLOWS:*; 1. RAISE PRIORITY TO LOCK OUT INTERRUPTS/; 2. CALL CALLER (OR CALL ROUTINE WHOSE ADDRESS ; IS ON TOP OF STACK); 3. DROP PRIORITY ; 4. RETURNT;-;H)LOCKI:: MTPS #TTPRI ;LOCK OUT INTERRUPTSQ CALL @(SP)+ ;;;CALL COROUTINE1$LOCKR:: MTPS #0 ;;;ALLOW INTERRUPTS RETURN ;RETURNP9; ERRORS IN GET/SET SPEED, PARITY OPTIONS OR FLOW CONTROL;A*YJLPAR:: ;DJ11, DL11 DON'T HAVE SETTABLEYLLPAR:: ;LINE PARAMETERSK0YCLPAR:: ;NEITHER DOES THE PRO VIDEO INTERFACE1 TST R1 ;WAS THIS A NOTIFICATION OF FLOW CONTROL ;CHANGE?) BEQ 10$ ;IF EQ NO - GO REPORT THE ERRORS3 RETURN ;Else just return. The port doesn't need. ;to be notified.10$: .IF DF D$$H11!D$$Z11!D$$V11 .IF DF T$$OVL( TST (SP)+ ;POP RETURN ADDRESS IN MPROT" MOV (SP)+,KINAR5 ;RESTORE MAPPING7 CMP (SP)+,(SP)+ ;POP RETURN ADDRESSES OF THIS AND THAT .IFF ;T$$OVL TST (SP)+ ;POP RETURN ADDRESSL .ENDC ;T$$OVL MOV (SP)+,R3 ;RESTORE R3  TST (SP)+ ;POP RETURN ADDRESST% MOV (SP)+,R1 ;RESTORE BUFFER POINTER  DEC R1 ;AND BACK IT UP/ CMP (SP)+,(SP)+ ;RETURNS FROM SPDPRM AND MCXSP  .ENDC ;D$$H11!D$$Z11!D$$V110 CALLR ERCNSC ;CONTROLLER SPEED IS NOT SETTABLE.PAGE!* .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB8 .SBTTL . DEACB/DEACB1 - DEALLOCATE AN AST CONTROL BLOCK;;+,; **-DEACB - DEALLOCATE AN AST00|{ D%B11110010 CONTROL BLOCK;A>; THIS ROUTINE IS CALLED WHEN AN AST CONTROL BLOCK NEEDS TO BED; DEALLOCATED OR A TSA EVENT PACKET NEEDS TO BE PASSED TO IT'S OWNERE; FOR DEALLOCATION PROCESSING. AN ACB IS DISTINGUISHED FROM A TEP BYK; OFFSETS A.CBL/E.VSIZ. AN ACB HAS A ZERO IN THIS WORD; A TEP IS NON-ZERO.VJ; IF THE PACKET IS A TEP, IT IS MARKED FOR DELETE AND QUEUED TO THE OWNER.H; IF IT IS AN ACB, IT IS MARKED FOR DELETE AND A CHECK IS MADE TO SEE IFJ; IT IS IN A TASK'S AST QUEUE (AF.QUE SET). IF SO, IT WILL BE DEALLOCATEDJ; WHEN IT IS DEQUEUED LATER ON (WITH A CALL TO DQACB). OTHERWISE THE SIZE/; OF THE ACB IS OBTAINED AND IT IS DEALLOCATED. ;S ; INPUTS:; FOR ENTRY AT DEACB:@; (R4) => UCBX LOCATION HOLDING ADDRESS OF ACB/TEP TO DEALLOCATE/; R5 => UCB FOR THE TERMINAL IF PACKET IS A TEPO;; FOR ENTRY AT DEACB1:TF; R0 => THREAD WORD OF THE ACB (STRUCTURE HAS NEGATIVE OFFSETS) OR TEP;R; OUTPUTS: NONE.;E@; REGISTERS MODIFIED: R2 MAY BE DESTROYED BY THE OWNER ROUTINE;-; .ENABL LSBADEACB:: MOV R0,-(SP) ;SAVE R0 MOV (R4),R0 ;GET THE ACB/TEP BEQ 30$ ;IF EQ, NONE...RETURNI( CLR (R4) ;INDICATE IT HAS BEEN DELETED .IF DF T$$TSA ASSUME A.CBL,E.VSIZ- TST A.CBL(R0) ;IS THIS AN AST CONTROL BLOCK? % BEQ 10$ ;IF EQ, YES...DEALLOCATE ITL MOV R3,-(SP) ;SAVE REGISTER MOV R1,-(SP) ;SAVE REGISTER* MOV R0,R3 ;COPY TEP ADDRESS FOR QUEUEING- BISB #EF.MDE,E.VFLG(R3) ;MARK TEP FOR DELETEE3 CALL QUETEP ;PASS TEP TO NETWORK FOR DEALLOCATIONO BR 20$ ;SKIP TO FINISH UP 10$: .ENDC ;T$$TSA2 BISB #AF.MDE,A.PRM+5(R0) ;MARK THE ACB FOR DELETE9 BITB #AF.QUE,A.PRM+5(R0) ;IS ACB CURRENTLY IN AST QUEUE?E2 BNE 30$ ;IF NE, YES...WAIT FOR IT TO BE DEQUEUED;T%; HERE TO ACTUALLY DEALLOCATE AN ACB.O; DEACB1::& MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS MOV R1,-(SP) ;SAVE REGISTER+ MOVB A.PRM+4(R0),R1 ;GET LENGTH OF THE ACBD- CMP -(R0),-(R0) ;BACK UP TO START OF THE ACBA# CALL $DEACB ;DEALLOCATE THE BLOCKS20$: MOV (SP)+,R1 ;RESTORE REGISTER % MOV (SP)+,R3 ;RESTORE PACKET ADDRESS;30$: MOV (SP)+,R0 ;RESTORE R00 RETURN ;ALL DONEE .DSABL LSB.* .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB;+@; **-MPROT- MAP AND CALL SPECIFIED ROUTINE WITHIN THE ROOT (MAINA; APR5 MAPPING) OF THE TERMINAL DRIVER, RESTORE PREVIOUS MAPPINGK; AND RETURN TO CALLER;S ; INPUTS:R;M.; 2(SP) = ADDRESS OF APR5 ROUTINE TO BE CALLED1; (SP) = ADDRESS OF TO WHICH TO RETURN WHEN DONED;B ; OUTPUTS:;H; NONE.;:; ALL REGISTERS ARE PRESERVED.;-9 .IF DF T$$OVL ;IF SYSTEM CONTAINS MEMORY-OVERLAID TTDRV MPROT::0+ MOV 2(SP),-(SP) ;DUPLICATE ADDRESS TO CALLN7 MOV 2(SP),4(SP) ;PUT RETURN ADDRESS WHERE IT SHOULD BET' MOV KINAR5,2(SP) ;SAVE CURRENT MAPPINGH* MOV ROTMAP,KINAR5 ;MAP MAIN ROOT OF TTDRV CALL @(SP)+ ;AND CALL ROUTINEN" MOV (SP)+,KINAR5 ;RESTORE MAPPING RETURN ;RETURN TO CALLER ;+F; **-MPEXT- MAP AND CALL SPECIFIED ROUTINE WITHIN THE OVERLAY (TTEXT),/; RESTORE PREVIOUS MAPPING AND RETURN TO CALLERT; ; INPUTS:E;+; R1 = ADDRESS OF APR5 ROUTINE TO BE CALLEDY;E ; OUTPUTS:;; NONE.;V; ALL REGISTERS ARE PRESERVED.;-MPEXT::2' MOV KINAR5,-(SP) ;SAVE CURRENT MAPPINGH* MOV EXTMAP,KINAR5 ;MAP MAIN ROOT OF TTDRV CALL (R1) ;AND CALL ROUTINE " MOV (SP)+,KINAR5 ;RESTORE MAPPING RETURN ;RETURN TO CALLERK;+#; **-TRANSFERS TO AND FROM THE ROOTO;L; TRANSFER FROM TTINI TO QPEIOQPETRA::% MOV EXTMAP,KINAR5 ;MAP THE EXTENSION CALLR QPEIO1 ;JMP TO QPEIO1R;R; TRANSFER FROM QPEIO1 TO QPWLBQPWTRA:: MOV ROTMAP,KINAR5 ;MAP THE ROOT CALLR QPWLB ;JMP TO QPWLB;; TRANSFER FROM TTATT TO QUEUEQUETRA:: MOV ROTMAP,KINAR5 ;MAP THE ROOT CALLR QUEUE ;JMP TO QUEUE5 .ENDC ;T$$OVL;V;C(.SBTTL ALTB - ALLOCATE A TERMINAL BUFFER;R;+"; ALTB - ALLOCATE TERMINAL BUFFER.;L; INPUT:; NONE;S ; OUTPUT: ; IF SUCCESS:; CC-C 00; R2 POINTER TO BUFFER WITH LENGTH T$$BFL BYTES.; FIRST WORD CLEARED.; ; IF FAILURE:;; CC-C 1;R; REGISTERS ALTERED: R0,R2;-;L;*ALTB:: MOV FRE00||TADATADATADATADATADATADATADATADATAEB,R2 ;GET FIRST FREE BUFFER BEQ 20$ ;NONE - JUMP) MOV @R2,FREEB ;POINT TO NEXT FREE BUFFER10$: CLR @R2 ;CLEAR LINK WORD RETURNO20$: MOV R1,-(SP) ;SAVE R1# MOV #T$$BFL,R1 ;SET DESIRED LENGTHT& CALL $ALOCB ;ALLOCATE IN SYSTEM POOL MOV (SP)+,R1 ;RESTORE R1M MOV R0,R2 ;GET BUFFER IN R2O BCC 10$ ;OK - JUMP% RETURN ;ELSE RETURN WITH CARRY SET .PAGEW .IFT ;NDF T$$SPLEE.SBTTL CKTAB - CHECK FOR TYPE-AHEAD BUFFER ALLOCATION OR DEALLOCATION ;E;+=; CKTAB - CHECK WHETHER TYPE-AHEAD BUFFER SHOULD BE ALLOCATED; OR DEALLOCATED.U;; INPUT:; R5 POINTER TO U.TSTA;; S3.TAB 0 DEALLOCATE TYPE-AHEAD BUFFER IF ONE IS ALLOCATEDR); (LOSING ALL CHARACTERS STORED IN IT)R4; 1 ALLOCATE TYPE-AHEAD BUFFER IF NONE IS ALLOCATED.; (LOSING SINGLE CHARACTER IF THERE IS ONE);N; REGISTERS ALTERED: R0,R2;-; ;E(CKTAB:: CALL LOCKI ;LOCK OUT INTERRUPTS2 MOV U.TTAB-U.TSTA(R5),R2 ;;;GET TYPE-AHEAD BUFFER BEQ 10$ ;;;NONE - JUMP' BIT #1,R2 ;;;SINGLE-CHARACTER BUFFER?E BNE 10$ ;;;Y - JUMPU;B; TYPE-AHEAD BUFFER EXISTS;U( BIT #S3.TAB,4(R5) ;;;DEALLOCATE BUFFER? BNE 20$ ;;;N - JUMPE CALL DETB ;;;Y - DO IT1 CLR U.TTAB-U.TSTA(R5) ;;;SHOW NO BUFFER ANY MORER BR 20$ ;;;;Y"; TYPE-AHEAD BUFFER DOES NOT EXIST; *10$: BIT #S3.TAB,4(R5) ;;;ALLOCATE BUFFER? BEQ 20$ ;;;N - JUMPE CALL ALTB ;;;Y - DO IT BCS 20$ ;;;FAILED - JUMP3 MOV R2,U.TTAB-U.TSTA(R5) ;;;SAVE POINTER TO BUFFER CLR (R2)+ ;;;INITIALIZE HEADER MOV #*400,@R2 ;;;;U ; ALL DONE;$020$: RETURN ;;;RETURN VIA COROUTINE THAT DROPS ;;;PRIORITYR .ENDC ;NDF T$$SPL.PAGE2*.SBTTL EXPCHR - EXPAND AN OUTPUT CHARACTER;R;+A; EXPCHR - THIS MODULE CONTAINS THE ROUTINES TO EXPAND CHARACTERSE%; INTO STRINGS ON OUTPUT AS REQUIRED.B;#>; THESE ROUTINES ARE CALLED BOTH AT SYSTEM STATE (WHEN SETTING:; UP A WRITE REQUEST) AND FROM THE INPUT INTERRUPT SERVICE;; ROUTINE (TO GENERATE AN ECHO). THEREFORE, THE MODULE MUSTI; BE REENTRANT.V;-;F;>; EXPAND A CHARACTER;O;+; EXPCHR - EXPAND A CHARACTER.;O; INPUT:; R2 CHARACTER; R5 POINTER TO U.TSTA$; U.TCHP CURRENT HORIZONTAL POSITION"; U.TCVP CURRENT VERTICAL POSITION7; S2.FLF 1 IF LINE FEED MUST BE OUTPUT BEFORE NEXT ECHOT-; S2.ELF 1 IF A LINE-FEED SHOULD BE DISCARDED#; ; OUTPUT:N); IF THE EXPANSION IS A SINGLE CHARACTER:T ; CC-Z 1A; R2 UNCHANGEDN; IF THE EXPANSION IS A STRING:E ; CC-Z 0 ; R2 LENGTH OF EXPANDED STRING ; R3 POINTER TO EXPANDED STRING4; IF CHARACTER SHOULD BE KEPT AND PRESENTED AGAIN ON2; NEXT CALL TO EXPCHR (ONLY RELEVANT IF CC-Z = 0): ; CC-C 1R-; IF CHARACTER SHOULD NOT BE PRESENTED AGAIN:N ; CC-C 0C9; IF THE CHARACTER IS A LINE-FEED AND SHOULD BE DISCARDEDU ; CC-V 1 ; R2 UNCHANGEDE ; ALWAYS:I:; U.TCHP UPDATED TO POSITION AFTER STRING HAS BEEN OUTPUT:; U.TCVP UPDATED TO POSITION AFTER STRING HAS BEEN OUTPUT-; S2.FLF 1 IF A CARRIAGE RETURN WAS RETURNED ; 0 ELSEO5; S2.ELF 0 IF THE V-BIT GETS SET OR IF THE CHARACTER (; WAS ANY ONE EXCEPT CR ,ESC,BSP OR FF;I; REGISTERS ALTERED: R2,R3;L>; THE PROPER WAY TO USE EXPCHR IS TO FIRST SAVE THE CHARACTER,>; THEN CALL EXPCHR, THEN OUTPUT THE STRING DESCRIBED BY R2,R3.<; IF CC-C WAS SET ON RETURN FROM EXPCHR, ON THE NEXT CALL TO>; EXPCHR THE SAME CHARACTER MUST BE PRESENTED IN R2, OTHERWISE; THE NEXT CHARACTER. ;-;T; .ENABL LSBH;B0EXCR1:: MOVB #CH.CR,R2 ;EXPAND A CARRIAGE RETURN BR EXPCHR ;E;O*EXPC3:: BIT #S2.WAL,2(R5) ;WRITE PASS ALL? BEQ EXPCHR ;N - JUMP SEZ ;Y - EXIT WITH CC-Z = 1 RETURN ;R;L6EXPCHR::CLR -(SP) ;INITIALIZE FLAG TO 0 TO EXIT WITH: ; CC-C = 0 (DON'T KEEP CHAR) ; CC-Z = 1 (OUTPUT CHAR)6 MOVB U.TCHP-U.TSTA(R5),@SP ;GET CURRENT HOR. POSITION TST (R5)+ ;POINT TO U.TSTA+2* MOVB @R5,R3 ;GET CONTEXT FOR WRAP-AROUND* BIC #^C,R3 ;CLEAR IRRELEVANT BITS ASSUME S2.WRA,6 JMP @OSDSP(R3) ;DISPATCHH;,;;.; DEFAULT CASE - NO SPECIAL THINGS IN PROGRESS;:+EXPC0:: BIT #S2.FLF,@R5 ;FORCE A LINE FEED?P BNE 40$ ;Y - JUMP  CMPB R2,#CH.ESC ;00|{ D%B11110010ESCAPE?R BEQ EXESC ;Y - JUMP:! CMPB R2,#CH.CR ;CARRIAGE RETURN? 0 BHI EXDEF ;N - HIGHER, CAN'T BE IN RECOGNITION$ ;TABLE - JUMP TO DEFAULT ROUTINE# BEQ EXCRJ ;CARRIAGE RETURN - JUMPI9 MOV #EXCRT,R3 ;POINT TO START OF CHAR. RECOGNITION TABLEN ;FALL THRU TO "CHRDSP";S;R!; DISPATCH ACCORDING TO CHARACTERM;2;++; CHRDSP - DISPATCH ACCORDING TO CHARACTER.A; ; INPUT:; R2 CHARACTER); R3 START OF CHARACTER RECOGNITION TABLER;A ; OUTPUT:P:; JUMPS TO CHARACTER PROCESSING ROUTINE WITH R2 UNCHANGED.;-;-;M"CHRDSP::TSTB (R3)+ ;END OF TABLE? BEQ 30$ ;Y - JUMPH CMPB R2,-1(R3) ;MATCH?I BNE CHRDSP ;N - LOOP)30$: SUB #CHRT+1,R3 ;GET OFFSET FROM CHRTE ASL R3 ;MAKE WORD INDEX3 JMP @CHRD(R3) ;JUMP TO ROUTINET.PAGEL;; ; EXPAND ESCAPER;" ASSUME U.TCVP,IHEXESC: CLR U.TCHP-(R5) ;CLEAR HORIZONTAL AND VERTICAL POSITION# JMP 180$ ;OUTPUT THE ESCAPE AS IST; ; FORCE LINE FEEDO;A240$: CMPB R2,#CH.LF ;IS THE CHARACTER A LINE FEED? BEQ EXLF ;Y - JUMP" BR 50$ ;N - NEED CHARACTER AGAIN; "; DO THE LINE FEED FOR WRAP-AROUND;C8EXPC1:: ADD #S2.WRB,@R5 ;NEXT TIME GO TO EXPC2 TO DO THE ;CHARACTER ITSELFR BR 50$ ;;R;;0; EXPAND FORM FEED AND VERTICAL TAB IF NECESSARY;PEXVT::.EXFF:: BIT #S4.HFF,4(R5) ;SIMULATE FORM FEEDS? BNE 110$ ;N - JUMP;-550$: COMB 1(SP) ;WE NEED CHARACTER AGAIN, EXIT WITH: ; CC-C = 1 (KEEP CHAR) ; CC-Z = 0 (OUTPUT STRING);A;0; EXPAND LINE FEED;H+EXLF:: BIC #S2.FLF,@R5 ;CLEAR FORCE-LF FLAGP' BIT #S2.ELF,@R5 ;SHOULD WE EAT THE LF? BEQ 55$ ;BR IF NOR. BIC #S2.ELF,@R5 ;NEXT SHOULD NOT BE DISCARDED@ CMP -(R5),(SP)+ ;POINT TO U.TSTA AND POP THE FLAG OFF THE STACK SEV ;SET STATUS BIT RETURN 55$: MOV #ASLF,R3 ;POINT TO LF BIS #400,@SP ;EXIT WITH:I ; CC-C = ? (NO CHANGE) ; CC-Z = 0 (OUTPUT STRING)9 INCB U.TCVP-(R5) ;UPDATE CURRENT VERTICAL POS.E3 CALL 190$ ;RESET POSITION IF CROSSED A PAGE LIMITX* BHIS 60$ ;BRANCH IF CROSSED A PAGE LIMIT CMPB R2,#CH.FF ;FORMFEED? BEQ 90$ ;Y - JUMP  BR 70$ ;N - JUMP+60$: CMPB R2,#CH.FF ;IS THE CHARACTER A FF?  BEQ 80$ ;Y - JUMPP"70$: CMPB R2,#CH.VT ;IS THIS A VT? BNE 120$ ;N - JUMP; BITB #7,U.TCVP-(R5) ;ARE WE AT A VERT. TAB STOP?I BNE 90$ ;N - JUMPS980$: BIC #140000,@SP ;Y - DON'T WANT CHAR AGAIN EXIT WITH( ; CC-C = 0 (DON'T KEEP)< ; CC-Z = 0 (OUTPUT STRING)* ; CC-N = 0 (INSURE CC-V = 0 AFTER ROL)+90$: BIT #U2.CRT,U.CW2-(R5) ;CRT?  BEQ 120$ ;N - JUMP1 MOV #4,R2 ;Y - ECHO 4 LF'S IN PLACE OF FF OR VTB+ SUB R2,R3 ;POINT TO FIRST OF 4 LINE FEEDS + BIT #S4.VFL,4(R5) ;VERTICAL FILL REQUIRED?C BEQ 100$ ;N - JUMP0 MOV #<1+NLFF>*4,R2 ;Y - ECHO 4 LF'S PLUS FILLER, SUB R2,R3 ;POINT TO START OF OUTPUT STRING@100$: MOVB U.TCVP-(R5),-(SP) ;UPDATE VERTICAL POSITION4 ADD #3,@SP ;(ADD 3 SINCE 1 LF WAS ALREADY COUNTED)@ MOVB (SP)+,U.TCVP-(R5) ;MUCH PAIN FOR ADD TO ODD ADRS5 CALL 190$ ;CORRECT POSITION IF CROSSED A PAGE LIMIT;" BIC #140000,@SP ;DON'T KEEP CHAR 5110$: BR 180$ ;FILL CHARACTERS ALREADY ACCOUNTED FORF,120$: MOV #1,R2 ;ASSUME NO FILLERS REQUIRED+ BIT #S4.VFL,4(R5) ;VERTICAL FILL REQUIRED?1 BEQ 180$ ;N - JUMP0 ADD #NLFF,R2 ;Y - ADD NUMBER OF FILL CHARACTERS/ BR 180$ ;DON'T CHANGE HOR. POS. OR BYTE COUNT-;);P; EXPAND BACKSPACE;"EXBSP:: TSTB @SP ;AT LEFT MARGIN?- BEQ 180$ ;Y - EXIT (DON'T CHANGE HOR. POS.)( DECB @SP ;N - BACKSPACED BR 170$ ;EXIT$;CEXCRJ: BR EXCR ;BRANCH AIDP; ;ID; CR AND LF FOR WRAP-AROUND HAVE BEEN DONE. DO THE CHARACTER ITSELF.;; NOTE - THE CHARACTER MUST BE EITHER A HORIZONTAL TAB OR A 9; "NORMAL" CHARACTER, SINCE ONLY THOSE CAUSE WRAP-AROUND.Q;02EXPC2:: BIC #S2.WRA,@R5 ;CLEAR WRAP-AROUND CONTEXT CMPB R2,#CH.HT ;HORIZONTAL TAB? BNE EXDEF ;N - JUMPN;;; EXPAND HORIZONTAL TAB;X(EXHT:: MOV @SP,R3 ;GET CURRENT HOR.POS.& BIC #S2.ELF,@R5 ;CLEAR DISCARD LF BIT- BIS #7,@SP ;POINT JUST BEFORE NEXT TAB STOPC. BIT #S4.HHT,4(R5) ;HARDWARE HOR. TAB PRESENT? BNE00||TADATADATADATADATADATADATADATADATA 130$ ;Y - JUMP" MOV R3,R2 ;GET CURRENT HOR. POS., SUB @SP,R2 ;GET NUMBER OF SPACES NECESSARY ;NEGATED AND OFF BY 1A NEG R2 ;MAKE POSITIVET INC R2 ;ADJUST MOV #ASHT,R3 ;POINT TO HTAB- BIS #400,@SP ;OUTPUT IS A STRING, EXIT WITH:H ; CC-C 0 (DON'T KEEP CHAR.)N ; CC-Z 0 (OUTPUT STRING) BR 130$ ;CHECK FOR WRAP-AROUND;;; ; EXPAND NORMAL CHARACTERE;@EXDEF:: & BIC #S2.ELF,@R5 ;CLEAR DISCARD LF BIT% BIT #140,R2 ;NON-SPACING CHARACTER?R BEQ 180$ ;Y - EXIT> BIT #U3.UPC,U.CW3-(R5) ;TERMINAL SUPPORT LOWERCASE? BEQ 130$ ;Y - JUMP4 ;NOTE THAT LOWER TO UPPER CASE CONVERSION IS NOT4 ;PERFORMED HERE FOR THE GR CHARACTER SET SINCE A4 ;TERMINAL CAPABLE OF DISPLAYING 8-BIT CHARACTERS( ;WILL NEVER GET PAST THE CHECK ABOVE* CMPB R2,#141 ;CHARACTER NEED CONVERTING? BLO 130$ ;N - JUMP CMPB R2,#172 ;SECOND CHECK BHI 130$ ;N - JUMP- BICB #40,R2 ;CONVERT LOWERCASE TO UPPERCASET5130$: CMPB @SP,U.CW4-(R5) ;AT RIGHT MARGIN?T BLO 160$ ;N - JUMP& BIT #S3.ACR,2(R5) ;AUTO CR-LF WANTED? BEQ 160$ ;N - JUMP. COMB 1(SP) ;NEED CHARACTER AGAIN, EXIT WITH: ; CC-C = 1 (KEEP CHAR) ; CC-Z = 0 (OUTPUT STRING): ADD #S2.WRB,@R5 ;SET STATE VARIABLE TO COME BACK AT EXPC1 ;TO DO THE LINE FEED ;FIRST DO A CARRIAGE RETURNR;E;E; EXPAND A CARRIAGE RETURN; EXCR:: BIS #400,@SP ;EXIT WITH:K ; CC-C = ? (NO CHANGE) ; CC-Z = 0 (OUTPUT STRING) ASSUME S4.HFL,7) MOVB 4(R5),R2 ;GET HOR. FILL REQUIREMENTG& BIC #^C,R2 ;CLEAR OTHER BITS CMP R2,#7 ;FILL FOR LA30S? BNE 150$ ;N - JUMP' MOVB @SP,R2 ;Y - GET CURRENT HOR.POS.T .IF DF R$$EIS ASH #-3,R2 ;DIVIDE BY 8( .IFFR ASR R2 ;DIVIDE BY 8E ASR R2A ASR R2  .ENDC! CMP R2,#9. ;WITHIN TABLE RANGE?  BLOS 140$ ;Y - JUMPR& MOV #9.,R2 ;N - SET TO HIGHEST VALUE2140$: MOVB HORFT(R2),R2 ;GET FILL COUNT FROM TABLE150$: MOV #ASCR,R3 ;POINT TO CR(, MOVB #-1,@SP ;INITIALIZE CURRENT HOR. POS." ;BOTH BYTE COUNT AND HOR. POS. ;WILL BE INCREMENTED ON EXIT/ BIS #S2.FLF,@R5 ;FORCE A LINEFEED ON NEXT ECHOU INC R2 ;INCR. BYTE COUNT;E;H!160$: INCB @SP ;UPDATE HOR. POS.#=170$: MOVB @SP,U.TCHP-(R5) ;STORE UPDATED HOR. POS.R!180$: TST -(R5) ;POINT TO U.TSTA9 CLRB @SP ;CLEAR LOW BYTE) ROL (SP)+ ;GET FLAGS TO GENERATE PROPER  ;CONDITION CODES RETURN ;R;R6190$: CMPB U.TCVP-(R5),U.TLPP-(R5) ;CROSSED A PAGE LIMIT? BLO 200$ ;N - RETURN+ CLRB U.TCVP-(R5) ;Y - RESET TO 0L' BIT #U2.CRT,U.CW2-(R5) ;CRT?5 BEQ 200$ ;N - RETURN1 MOVB U.TLPP-(R5),U.TCVP-(R5)  ;Y - CRT'S SCROLL, NOT ROLL$8 DECB U.TCVP-(R5) ;CURSOR STAYS ON BOTTOM LINE 200$: RETURN; .DSABL LSBT;9;C  .IF DF T$$CUP E.PAGE(=.SBTTL CPOS - SUBROUTINE TO EXPAND CURSOR POSITIONING COMMANDT; ;+@; CPOS - EXPAND CURSOR COORDINATES TO CURSOR POSITIONING COMMAND!; SUITABLE FOR THE TERMINAL TYPE.;; ; INPUT:,; R2 LOW BYTE: COLUMN NUMBER (STARTING AT 1)); HIGH BYTE: LINE NUMBER (STARTING AT 1)Q; R5 POINTER TO U.TSTA;. ; OUTPUT:A); R2 LENGTH OF CURSOR POSITIONING COMMANDT*; R3 POINTER TO CURSOR POSITIONING COMMAND; CC-C 0; CC-Z 0;B; REGISTERS ALTERED: R2,R3;-;B;SCPOS::;0; USE U.TTYP TO DETERMINE HOW TO EXPAND COMMAND.;I- MOVB U.TTYP-U.TSTA(R5),R3 ;GET TERMINAL TYPE+" BEQ CPOS0 ;NOT RECOGNIZED - JUMP CMP R3,#TTPHI ;RECOGNIZED?D BHI CPOS0 ;N - JUMPR: MOVB TTYP1-1(R3),R3 ;Y - GET CURSOR POS. TYPE IN BITS 6-7 .IF DF R$$EIS ASH #-5,R3 ;GET IT IN BITS 1-2 .IFFP ASL R3 ;SHIFT INTO BITS 9-10 ASL R3 ; ASL R3 ; SWAB R3 ;GET IT IN BITS 1-2R .ENDC# BIC #^C6,R3 ;CLEAR ALL OTHER BITS05 BEQ CPOS0 ;NO CURSOR POSITIONING IMPLEMENTED - JUMP( MOV R2,-(SP) ;SAVE ORIGINAL COORDINATES' BIC #100000,R2 ;CLEAR SCREEN CLEAR BIT;2 MOV R2,U.TCHP-U.TSTA(R5) ;SET NEW CURSOR POSITION& JMP @CPOST-2(R3) ;JUMP VIA JUMP TABLE .ENABL LSBR;V-; TYPE 0 - CURSOR POSITIONING NOT IMPLEMENTEDI;6)CPOS0: CLR00|{ D%B11110010 R2 ;EXPAND INTO A SINGLE NULLT) RETURN ;RETURN WITH CC-C = 0, CC-Z = 1N;B; TYPE 1 - VT05 ;3CPOS1:: ADD #401*40,R2 ;BIAS BOTH COORDINATES BY 40 MOVB R2,CP1+20 ;STORE X COORD.B& SWAB R2 ;GET Y COORD. AND CLEAR CC-C MOVB R2,CP1+13 ;STORE Y COORD.P MOV #7,R2 ;STRING LENGTH = 7" MOV #CP1+12,R3 ;POINTER TO STRING$ TST (SP)+ ;CLEAR SCREEN REQUESTED? CLZ ;(LEAVE CC-Z CLEAR) BPL 10$ ;N - RETURNT3 SUB #12,R3 ;POINT TO CLEAR SCREEN ESCAPE SEQUENCEN0 ADD #12,R2 ;ADD THAT TO CURSOR POSITION OUTPUT10$: RETURN ;RETURNT; ; TYPE 2 - VT52 AND VT50H-; ;CPOS2:: SWAB R2 ;GET COLUMN IN HIGH BYTE, LINE IN LOW BYTET, ADD #401*40,R2 ;BIAS BOTH COORDINATES BY 40+ MOV #CP2+6,R3 ;POINT TO COMMAND STRING + 2C MOV R2,@R3 ;STORE COORDINATESD4 TST -(R3) ;POINT TO START OF STRING AND CLEAR CC-C MOV #4,R2 ;LENGTH = 4P$ TST (SP)+ ;CLEAR SCREEN REQUESTED? CLZ ;(LEAVE CC-Z CLEAR) BPL 10$ ;N - RETURN26 SUB #4,R3 ;Y - POINT TO CLEAR SCREEN ESCAPE SEQUENCE BR 20$ ;FINISH IT OFFS;O; TYPE 3 - VT100; !CPOS3:: MOV R0,-(SP) ;SAVE R0, R1  MOV R1,-(SP) ;:' MOV #CP3A,R3 ;POINT AT FINAL CHARACTER $ CALL 30$ ;EXPAND X-COORD. TO ASCII! MOVB #';,-(R3) ;INSERT DELIMITER3 SWAB R2 ;GET Y-COORD.  CALL 30$ ;EXPAND ITR MOV (SP)+,R1 ;RESTORE R0, R1I MOV (SP)+,R0 ;R3 MOVB #'[,-(R3) ;INSERT CONTROL SEQUENCE INTRODUCERP$ MOVB #CH.ESC,-(R3) ; .. (BACKWARDS) MOV #CP3A+1,R2 ;6 SUB R3,R2 ;GET STRING LENGTH AND CLEAR CC-C AND CC-Z( TST (SP)+ ;WAS CLEAR SCREEN REQUESTED? CLZ ;(LEAVE CC-Z CLEAR) BPL 10$ ;N - RETURNS MOVB #'J,-(R3) ;INSERT...3 MOVB #'2,-(R3) ;...CLEAR SCREEN ESCAPE SEQUENCE...L) MOVB #'[,-(R3) ;...INTO OUTPUT STRING...,! MOVB #CH.ESC,-(R3) ;...BACKWARDS 320$: ADD #4,R2 ;ADD THAT TO CURSOR POSITION OUTPUT  RETURN ;RETURNM30$: CLR R1 ; BISB R2,R1 ;GET NUMERIC VALUEE INC R1 ;ADJUST TO BASE 1 .IF DF R$$EIS'40$: CLR R0 ;CLEAR HIGH ORDER DIVIDEND  DIV #10.,R0 ;DIVIDE BY 10C .IFF ;R$$EIST40$: MOV R1,R0 ;GET DIVIDENDE MOV #10.,R1 ;GET DIVISOR CALL $DIV ;DIVIDE BY 10 .ENDC ;R$$EIS) BIS #'0,R1 ;BIAS REMAINDER BY ASCII /0/C MOVB R1,-(R3) ;STORE IN STRING  MOV R0,R1 ;GET QUOTIENT! BNE 40$ ;NON-ZERO - DO IT AGAIN RETURN ;RETURND A .ENDC ;T$$CUP N .DSABL LSBT.PAGER,.SBTTL UBTRA - BUFFERED ACD TRANSFER ROUTINE; ;+@; UBTRA - TRANSFER BUFFERS FROM THE ACD TO A TASK AT $FINBF TIME;A; INPUT:5; R0 ADDRESS OF BUFFER CONTAINING TRANSFER PARAMETERS$;T ; OUTPUT:VC; THE CHARACTERS DESCRIBED BY THE BUFFER PARAMETERS ARE TRANSFERREDD;; FROM THE ACD TO THE TASK. THE ACD IS THEN CALLED BACK TO A; DEALLOCATE ITS BUFFER AND POSSIBLY TO REQUEST ANOTHER TRANSFER.I;; REGISTERS ALTERED: ALL;-;I; .IF DF T$$ACD(UBTRA:: ADD #3,R0 ;POINT PAST LINK WORD MOV (R0)+,R5 ;GET UCB ADDRESS% MOV (R0)+,R3 ;GET I/O PACKET ADDRESSN1 MOV I.PRM+2(R3),R4 ;GET TASK BUFFER DISPLACEMENT10$: MOV R3,-(SP) ;SAVE R3/ MOV (R0)+,R1 ;GET ACD BUFFER APR BIAS (A.SMAP)U3 MOV (R0)+,R2 ;GET ACD BUFFER DISPLACEMENT (A.SBUF)M* SUB #20000,R2 ;CONVERT TO AN APR5 MAPPING# MOV (R0)+,R3 ;GET TASK PCB ADDRESST$ MOV P.REL(R3),R3 ;GET TASK APR BIAS+ ADD (R0)+,R3 ;COMPUTE TASK BUFFER APR BIAST/20$: MOV (R0),R0 ;GET TRANSFER LENGTH (A.SLEN)# CALL $BLXIO ;PERFORM THE TRANSFERO3 MOV R3,R1 ;SAVE R3 IN CASE ACD CONTINUES TRANSFERT) MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESSG. CLR U.AFLG-U.TSTA(R5) ;SET DEFAULT PROCESSING2 MOV #A.CALL,R0 ;SET TRANSFER CALLBACK ENTRY POINT CALL $SWACD ;CALL ACDT+ BIT #UA.CAL,U.AFLG-U.TSTA(R5) ;MORE TO GO?0 BEQ 30$ ;N - JUMPP* MOV R3,-(SP) ;Y - SAVE I/O PACKET ADDRESS) MOV R1,R3 ;RESTORE TASK BUFFER APR BIAS! MOV U.ACB-U.TSTA(R5),R0 ;GET ACBA/ ADD #A.SMAP,R0 ;POINT TO ACD BUFFER PARAMETERS(& MOV (R0)+,R1 ;GET ACD BUFFER APR BIAS* MOV (R0)+,R2 ;GET ACD BUFFER DISPLACEMENT* SUB #20000,R2 ;CONVERT TO AN APR5 MAPPING BR 20$ ;DO THE TRANSFERL 30$: RETURN; .ENDC ;T$$ACD .END#A.CALL,R0 ;SET TRANSFER CALLBACK ENTRY POINT CALL $SWACD ;CALL ACDT+ BIT #UA.CAL00||TADATADATADATADATADATADATADATADATA .TITLE TTTBLS .IDENT /06.01/3;R6; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;L;R; 08-MAY-78 PETER WANNHEDEN.; ; PREVIOUSLY MODIFIED BY: ;R ; C. F. SPITZ+; D. R. DONCHINI ; T. LEKAS; S. C. ADAMS ;S; MODIFICATIONS:;T; S. C. ADAMS 3-JAN-86 6.00F5; SA452 -- ADD SUPPORT FOR USER-WRITTEN PORT DRIVER (;+ ; K. L. FELDMANN 26-MAR-86 06.01?; KLF009 -- TEST FOR CONTROLLER ERROR BEFORE DEALLOCATING UCBXR;O .PSECT MAP5;S;+1; THIS MODULE CONTAINS THE DRIVER DISPATCH TABLE.E?; IN A SYSTEM THAT SUPPORTS KERNEL DATA SPACE, THIS MODULE MUSTF'; BE BUILT INTO THE TASK IMAGE "TTDRV". B; THIS IS IN CONTRAST TO ALL OTHER DRIVER DATA, WHICH IS CONTAINEDA; IN THE MODULE "TTDAT" AND IS BUILT INTO THE TASK IMAGE "TTCOM".;-; ;M; DRIVER DISPATCH TABLE2;  .IF DF B$$MAP; .IIF NDF,T$$SPC,.ERROR ;ASSUME THAT THERE IS NO SECONDARY1( ;POOL BUFFERS FOR BITMAP SYSTEMS.' ;FOR NOW THERE IS NO SUPPORT FORA ;I/D SPACE BITMAP SYSTEMS0 .WORD R$OUTD ;OUTPUT COMPLETION ROUTINE FOR CT" .WORD G$IN ;INPUT ROUTINE FOR CT .ENDC ;B$$MAP .IF DF T$$SPC7 .WORD NXTCMD ;ROUTINE TO PROCESS THE NEXT CLI COMMANDA .ENDC ;T$$SPC- .WORD DELTB0 ;ROUTINE TO DEALLOCATE BUFFERS '$TTTBL::.WORD TTINI ;REQUEST INITIATORR .WORD TTCAN ;CANCEL I/OD< .WORD $NLTMO ;TIME-OUT - USE SPECIAL NULL TIME-OUT ROUTINE .IF DF R$$CON% .WORD TTPWFL ;POWERFAIL ENTRY POINT , .WORD TTKRB ;KRB STATUS CHANGE ENTRY POINT, .WORD TTUCB ;UCB STATUS CHANGE ENTRY POINT .IFFT .WORD TTPWUP ;POWER-UP .IF DF B$$MAP3 .WORD FORVMR,FORVMR ;VMR REQUIRES THAT THESE WORDSN# ;BE HERE AND THAT THEY POINT TOL! ;TO AN ADDRESS IN THE DRIVER.O! ;THIS IS BECAUSE VMR DOES NOTU ;BELIEVE IN M-PLUS SYSTEMS$ ;WITHOUT RECONFIGURATION SUPPORT .ENDC ;B$$MAP .ENDC U .IF DF R$$MPL E, .IIF DF B$$MAP .IRP X,+ .IIF NDF B$$MAP .IRP X,A .IF IDN X,LH  .IF DF T$$LTH .ASCII /LH/ .WORD $LHDEV .WORD 0LHCTBP::.WORD 0; .ENDC ; T$$LTH  .ENDC ; IDN X,LH, .IF IDN X,USR .IF DF T$$USP .ASCII /US/ .WORD $USINPY .WORD $USOUT  .WORD 0USCTBP::.WORD 0R .ENDC ; T$$USPC .ENDC ; IDN X,US .IF DIF X,LH- .IF DIF X,US  .IF DF D$$'X'11 .ASCII /Y'X'/ .IF IDN X,M .WORD $DM11B. .IFFM .WORD $Y'X'INPB .WORD $Y'X'OUT, .ENDC .WORD 0 .IF IDN X,M .IF NDF T$$COMLYMCP1:: .ENDC ;NDF T$$COM .ENDC ;IDN X,MIY'X'CTBP::.WORD 0 . .ENDC .ENDC ; DIF X,US. .ENDC ; DIF X,LH .ENDR$TTTBE::.WORD 0 ;END OF TABLE;U; . .IF DF T$$COM $); POINTER TO PCB FOR COMMON BLOCK "TTCOM"W; ($TTCOM::.BLKW 1 ;TO BE FILLED IN BY VMR- ;CLEARED BY DRIVER INITIALIZATION ROUTINE  ' .ENDC ;T$$COM X .IFF ;R$$MPL .5$NLTMO::CLR S$$SPC+2(SP) ;FORCE $SCDVT ON TO NEXT DCB'6 INCB S.CTM(R4) ;RESET TIMEOUT COUNT FOR THE NEXT TIME RETURN ;P  .ENDC ;R$$MPL C .IF DF R$$CON7TTPWFL::MOV KINAR6,-(SP) ;SAVE KERNEL INSTRUCTION APR 6U# BCC 20$ ;BRANCH ON UNIT POWERFAIL5 MOV #CT.CPW,R4 ;GET CONTROLLER POWERFAIL OFFSET CODEC. BR TTDSP ;GO TO COMMON CONTROLLER DISPATCHER420$: ADD #U.TSTA,R5 ;POINT TO UCB STATUS TRIPLE-WORD .IF DF T$$ACD6 TST U.ACB-U.TSTA(R5) ;DOES THIS TERMINAL HAVE AN ACD? BEQ 30$ ;N - JUMPO* MOV #A.POWE,R0 ;SET POWERFAIL ENTRY POINT CALL $SWACD ;CALL ACDS .ENDC ;T$$ACD330$: MOV #CT.UPW,R2 ;GET UNIT POWERFAIL OFFSET CODE( BR TTCRD ;GO TO UNIT DEPENDENT ROUTINE7TTKRB:: MOV KINAR6,-(SP) ;SAVE KERNEL INSTRUCTION APR 6 ' BCS 20$ ;BRANCH IF CONTROLLER OFFLINEE .IF DF T$$COM# TST $TTCOM ;GET TTCOM PCB ADDRESSL% BEQ 10$ ;ALREADY INITIALIZED - JUMPI .IFF ;T$$COMT TST $DALED ;GET KISAR6 MAPPING% BNE 10$ ;ALREADY INITIALIZED - JUMPA .ENDC ;T$$COM MOV R2,-(SP) ;SAVE R2# CALL 00|{ D%B11110010TTINIT ;INITIALIZE THE WORLDL MOV (SP)+,R2 ;RESTORE R2N610$: MOV #CT.CON,R4 ;GET CONTROLLER ONLINE OFFSET CODE. BR TTDSP ;GO TO COMMON CONTROLLER DISPATCHER720$: MOV #CT.COF,R4 ;GET CONTROLLER OFFLINE OFFSET CODE . BR TTDSP ;GO TO COMMON CONTROLLER DISPATCHER7TTUCB:: MOV KINAR6,-(SP) ;SAVE KERNEL INSTRUCTION APR 6- BCS 10$ ;BRANCH IF WANT TO SET UNIT OFFLINE / ADD #U.TSTA,R5 ;POINT TO UCB STATUS TRIPLEWORDE CALL MAPD ;MAP DATA AREA .IF DF T$$SPL+ CALL ALUCBX ;ALLOCATE A UCBX FOR THIS UCB - BCS TTRET1 ;RETURN WITH CC-C SET IF FAILURER .IFF ;T$$SPLC5 CALL CKTAB ;ALLOCATE TYPE-AHEAD BUFFER IF NECESSARYT .IFTF ;T$$SPL .IF DF T$$MOD% BICB #US.CRW!US.DSB,U.STS-U.TSTA(R5)F ;ASSUME LOCAL LINE .ENDC2 MOV #CT.UON,R2 ;SET ROUTINE INDEX FOR UNIT ONLINE3 BR TTCRD ;GO TO UNIT DEPENDENT ROUTINE DISPATCHERW:10$: CLRB U.TMTI(R5) ;PREVENT MODEM TIMEOUT FROM OCCURRING$ ADD #U.TSTA,R5 ;ADVANCE UCB POINTER3 MOV #CT.UOF,R2 ;SET ROUTINE INDEX FOR UNIT OFFLINEX, MOV KISAR6,-(SP) ;SAVE CURRNT APR 6 MAPPING! CALL MAPD ;MAP DRIVER DATA AREA( CALL CTRD ;CALL UNIT DEPENDENT ROUTINE .IFT ;T$$SPL8 TSTB $SCERR ;CHECK FOR ERROR IN UNIT DEPENDENT ROUTINE1 BMI TTRET ;IF MI, ERROR - DON'T DEALLOCATE UCBX, CALL DEUCBX ;DEALLOCATE THE UCBX AND TABUF .IFTF ;T$$SPL% BR TTRET ;GO TO COMMON RETURN CODE3TTDSP: MOV KISAR6,-(SP) ;SAVE CURRENT APR 6 MAPPINGI! CALL MAPD ;MAP DRIVER DATA AREAI MOV @R2,R3 ;GET CSR ' MOVB K.PRM(R2),R1 ;GET CONTROLLER TYPEV, ADD CTBL(R1),R4 ;GET DISPATCH TABLE POINTER0 CALL @(R4)+ ;CALL CONTROLLER DEPENDENT ROUTINE$ BR TTRET ;GO TO COMMON RETURN CODE3TTCRD: MOV KISAR6,-(SP) ;SAVE CURRENT APR 6 MAPPINGR! CALL MAPD ;MAP DRIVER DATA AREA ( CALL CTRD ;CALL UNIT DEPENDENT ROUTINE4TTRET: MOV (SP)+,KISAR6 ;RESTORE ENTRY APR 6 MAPPING:TTRET1: MOV (SP)+,KINAR6 ;RESTORE KERNEL INSTRUCTION APR 6 RETURNR .IFT ;T$$SPLI .ENABL LSBM;D;+;AG; ALUCBX - ALLOCATE A UCB EXTENSION (UCBX) AND TYPEAHEAD BUFFER (TABUF)V6; STUCBX - SET UP A UCB EXTENSION AND TYPEAHEAD BUFFER;+; INPUT:>; R0 APR BIAS OF 1ST SECONDARY POOL BLOCK (IF ENTRY AT STUCBX); R5 POINTER TO U.TSTA; ; OUTPUT:N ; IF SUCCESS:R; CC-C 0I; UCBX AND CONTIGUOUS TABUF ALLOCATED FROM SECONDARY POOL AND INITIALIZED:;V ; IF FAILURE:R; CC-C 1H; IE.ALC RETURNED IN $SCERR TO INDICATE FAILURE TO BRING TERMINAL ONLINE;;-;R>ALUCBX: CALL 20$ ;GET NUMBER OF SECONDARY POOL NODES REQUIRED5 CALL $ALSEC ;ALLOCATE THEM FOR USE BY THIS TERMINALV' BCS 10$ ;BRANCH ON ALLOCATION FAILUREYGSTUCBX::MOV R0,U.TAPR-U.TSTA(R5) ;THESE NODES BECOME THE UCBX AND TABUFI( MOV R0,@#KDSAR5 ;MAP THE UCBX AND TABUF* MOV #120000,R4 ;SET THEIR VIRTUAL ADDRESS ASSUME U.TCI,0U# CLR @R4 ;NO CURRENT INPUT REQUESTO) CLR U.TCO(R4) ;NO CURRENT OUTPUT REQUESTC+ CLRB U.TISV(R4) ;INITIALIZE STATE VARIABLE  ASSUME U.TITI&1,0 ASSUME U.TOTI,U.TITI+1. CLR U.TITI(R4) ;CLEAR INPUT AND OUTPUT TIMERS> CLR U.TFPB(R4) ;CLEAR PROMPT BUF ADDRS/UNSOLICITED INPUT FLAG$ CLR U.TRTT(R4) ;NO TERMINATOR TABLE .IF DF T$$EIO9 CLR U.TDIF(R4) ;CLEAR FIRST DEFAULT INPUT BUFFER POINTERA .ENDC ;T$$EIO;;* .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB7 ADD #U.TAST,R4 ;POINT TO UNSOLICITED INPUT ACB ADDRESSN-X = U.TAST ;SYMBOL NEEDED FOR ASSUME MACROST .IF DF T$$CCA4 CLR (R4)+ ;CLEAR ACB POINTER FOR UNSOLICITED INPUT X = X + 2M .ENDC ;T$$CCA .IF DF T$$SCA ASSUME U.TSCA,X X = X + 2/ CLR (R4)+ ;CLEAR SWITCH CHARACTER ACB POINTERE .ENDC ;T$$SCA .IF DF T$$MHU ASSUME U.TMHA,X X = X + 2O + CLR (R4)+ ;CLEAR MODEM HANGUP ACB POINTERF .ENDC ;T$$MHU .IF DF T$$ICS ASSUME U.TICA,X X = X + 2U& CLR (R4)+ ;CLEAR ICS ACB/TEP POINTER .ENDC ;T$$ICS .IF DF T$$OOB ASSUME U.TOBA,X X = X + 2 & CLR (R4)+ ;CLEAR OOB ACB/TEP POINTER .ENDC ;T$$OOB* .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB ASSUME U.TTBF,X CLR (R4)+ ;INITIALIZE HEADER0 CLRB (R4)+ ;RESET ACTIVE COUNT AND CLEAR CARRY/ MOVB U.TBSZ-U.TSTA(R5),(R00||TADATADATADATADATADATADATADATADATA4) ;SET SIZE OF TABUF RETURN.310$: MOVB #IE.ALC,$SCERR ;INDICATE CAUSE OF FAILUREU RETURN ;RETURN WITH CARRY SET;.;+;$(; DEUCBX - DEALLOCATE THE UCBX AND TABUF;4; INPUT:; R5 POINTER TO U.TSTA;N ; OUTPUT:0; UCB EXTENSION AND TYPEAHEAD BUFFER DEALLOCATED;-;4?DEUCBX::MOV U.TAPR-U.TSTA(R5),R0 ;GET ADDRESS OF UCBX AND TABUFA% CLR U.TAPR-U.TSTA(R5) ;CLEAR POINTER 2 CALL 20$ ;GET THE NUMBER OF BLOCKS TO DEALLOCATE8 CALLR $DESEC ;DEALLOCATE THE UCBX AND TABUF AND RETURN;(G; CALCULATE THE NUMBER OF SECONDARY POOL BLOCKS REQUIRED TO CONTAIN THEEJ; UCB EXTENSION AND A TYPEAHEAD BUFFER WHOSE SIZE IS KEPT IN OFFSET U.TBSZ;A*20$: CLR R1 ;PREVENT UNWANTED SIGN EXTENDE BISB U.TBSZ-U.TSTA(R5),R1 ;GET THE SIZE OF THE TABUF LESS ITS HEADERF> ADD #T$$UXL+4+77,R1 ;INCLUDE TABUF HEADER, UCBX, AND ROUND UP; ASH #-6,R1 ;CONVERT TO NUMBER OF SEC POOL BLOCKS REQUIREDE# RETURN ;RETURN WITH RESULT IN R1C .DSABL LSBE .ENDC ;T$$SPL .ENDC ;R$$CON .IF DF T$$SER;;+;A'; NXTCMD - PROCESS THE NEXT CLI COMMANDK;E; INPUT:; R0 UCB ADDRESS;X ; OUTPUT: C; THE COMMAND IN PROGRESS BIT (UM.CMD) IS CLEARED AND AN ATTEMPT ISRC; MADE TO PROCESS CHARACTERS FROM THE TYPEAHEAD BUFFER. FOR MULTI- B; PROCESSOR SYSTEMS, IF WE ARE NOT ON THE CORRECT CPU, FORK TO GETE; THERE WITH A NULL FORK REQUEST, SINCE AFTER FORK PROCESSING WE WILLP<; TRY TO PROCESS CHARACTERS FROM THE TYPEAHEAD BUFFER ANYWAY;-; "NXTCMD: CALL MAPD ;MAP THE DRIVER SAVNR ;SAVE R4 AND R5 MOV R0,R5 ;GET THE UCB ADDRESS ADD #U.TSTA,R5 ;POINT TO U.TSTA< BIC #UM.CMD,U.MUP-U.TSTA(R5) ;ENABLE CLI COMMAND PROCESSING .IF DF M$$PRO CLR R3 ;SET NULL FORK REQUESTR3 CALL SWCPU ;SWITCH TO THE CORRECT CPU (NO RETURN)I- ;OR FALL THRU IF ALREADY ON THE RIGHT CPUO .ENDC ;M$$PRO! CALL LOCKI ;LOCK OUT INTERRUPTST8 CALLR SERPRO ;;;SERIALLY PROCESS CHARACTERS FROM TABUF .ENDC ;T$$SER .IF DF B$$MAP!R$$PRO-)NXTCMD:: ;THIS SHOULD NOT BE CALLED FORV ;P/OS SYSTEMS5.FORVMR: CRASH ;THIS NEEDS TO BE HERE FOR VMR! ;THIS IS BECAUSE VMR DOES NOTU ;BELIEVE IN M-PLUS SYSTEMS$ ;WITHOUT RECONFIGURATION SUPPORT .ENDC ;B$$MAP!R$$PROU;;L .END ;SWITCH TO THE CORRECT CPU (NO RETURN)I- ;OR FALL THRU IF ALREADY ON THE RIGHT CPUO .ENDC ;M$$PRO! CALL LOCKI ;LOCK OUT INTERRUPTST8 CALLR SERPRO ;;;SERIALLY PROCESS CHARACTERS FROM TABUF .ENDC ;T$$SER .IF DF B$$MAP!R$$PRO-)NXTCMD:: ;THIS SHOULD NOT BE CALLED FORV ;P/OS SYSTEMS5.FORVMR: .TITLE TTUS .IDENT /01.00/;6; COPYRIGHT (c) 1986 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;;; 7-NOV-85 STEPHANIE ADAMS;; MODIFICATIONS:;;+/; STUB PORT DRIVER FOR USER-WRITTEN PORT DRIVER;E; THIS MODULE PROVIDES THE INTERFACE BETWEEN TTDRV AND A USER-WRITTEN; PORT DRIVER:;B; 1. IN THE CONTROLLER ON-LINE CODE, INITIALIZE CELLS IN THE USER 7; PORT TO CONTAIN ADDRESSES OF TTDRV'S ENTRY POINTS.;M; 2. IN THE INPUT AND OUTPUT SERVICE ROUTINES, PERFORM GENERAL TTDRV SERVICES; ?; 3. CALL THE APPROPRIATE ROUTINE IN THE PORT DRIVER VIA $MPPRO; ;- .IF DF T$$USP  .MCALL KRBDF$  .MCALL HWDDF$,UCBDF$,PRTDF$# HWDDF$ ;DEFINE HARDWARE SYMBOLS UCBDF$ ;DEFINE UCB SYMBOLS$ PRTDF$ ;DEFINE USER PORT OFFSETS KRBDF$ ;DEFINE KRB SYMBOLS3.IIF NDF R$$MPL, .ERROR ;SUPPORTED ONLY ON M-PLUSB.IIF NDF R$$CON, .ERROR ;SOME OF THE OFFSETS THAT FOLLOW REQUIRE/ ;THIS TO BE A SYSTEM WITH RECONFIGURATION.; ; LOCAL DATA; .PSECT MAP5 .PAGE .SBTTL RESUME OUTPUT;+; USRESX - RESUME OUTPUT.;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-USRESX::* MOV #P.RRES+120000,R0 ;SET UP USER OFFSET. CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .SBTTL ABORT OUTPUT;+; USABOX - ABORT OUTPUT.;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTR00|{ D%B11110010OLLER-DEPENDENT ROUTINE. ; U.TOC 0 ; U.TTOC 0;-USABOX::+ MOV #P.RABO+120000,R0 ;SET UP USER ADDRESS. CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .SBTTL STOP OUTPUT;+!; USSTOX - STOP (SUSPEND) OUTPUT.;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S1.CTS 1;-USSTOX::+ MOV #P.RSTO+120000,R0 ;SET UP USER ADDRESS. CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .SBTTL POWER UP;+; USPWUP - POWER-UP.;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-USCPUP::+ MOV #P.RCPU+120000,R0 ;SET UP USER ADDRESS. CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .PAGE .SBTTL CONTROLLER ON-LINE;+; USCONL - CONTROLER ON-LINE;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; R0 AND R1 ARE DESTROYED;-USCONL::1 MOV KISAR6,-(SP) ;SAVE THE CURRENT APR6 MAPPING# MOV K.OWN(R2),R5 ;GET UCB ADDRESS# MOV U.DCB(R5),R1 ;GET DCB ADDRESS# MOV D.PCB(R1),R1 ;GET PCB ADDRESS; MOV P.REL(R1),KISAR6 ;MAP TO USER TO PLUG IN OUR ADDRESSES% MOV #140000,R0 ;SET UP USER ADDRESS3 ADD @#140000+P.ROFF,R0 ;ADD OFFSET TO TTDRV TABLE2 TST P.TTII(R0) ;HAS IT ALREADY BEEN INITIALIZED? BNE 10$ ;BR IF INIT. ALREADY;!; FILL IN TT: DRIVER ENTRY POINTS;( MOV #ICHAR1,P.TTII(R0) ;INPUT INTERRUPT( MOV #ODONE,P.TTOI(R0) ;OUTPUT INTERRUPT2 MOV #FP000,P.TTFP(R0) ;FORK PROCESSING SUBROUTINE/10$: MOV (SP)+,KISAR6 ;AND RESTORE OUR MAPPING3 MOV #P.RCON+120000,R0 ;GET USER OFFSET FOR ON-LINE CALLR MAPUSR ;AND CALL USER .PAGE .SBTTL UNIT ON-LINE;+; USUONL - UNIT ON-LINE;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-USUONL::+ MOV #P.RUON+120000,R0 ;SET UP USER ADDRESS- CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .SBTTL UNIT POWER-UP;+; USUPUP - UNIT POWER-UP.;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; R0 AND R1 ARE DESTROYED;-USUPUP::+ MOV #P.RUPU+120000,R0 ;SET UP USER ADDRESS- CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .SBTTL MODEM TIMER;+; USMTIM - MODEM TIMER.;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-USMTIM::+ MOV #P.RMTI+120000,R0 ;SET UP USER ADDRESS- CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .PAGE .SBTTL CONTROLLER OFF-LINE;+; USCOFF - CONTROLLER OFF-LINE;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; R0 AND R1 ARE DESTROYED;-USCOFF::1 MOV KISAR6,-(SP) ;SAVE THE CURRENT APR6 MAPPING# MOV K.OWN(R2),R5 ;GET UCB ADDRESS# MOV U.DCB(R5),R1 ;GET DCB ADDRESS# MOV D.PCB(R1),R1 ;GET PCB ADDRESS; MOV P.REL(R1),KISAR6 ;MAP TO USER TO PLUG IN OUR ADDRESSES% MOV #140000,R0 ;SET UP USER ADDRESS3 ADD @#140000+P.ROFF,R0 ;ADD OFFSET TO TTDRV TABLE( CLR (R0) ;INDICATE CONTROLLER HAS NOT ;BEEN INITIALIZED' MOV (SP)+,KISAR6 ;RESTORE OUT MAPPING+ MOV #P.RCOF+120000,R0 ;SET UP USER ADDRESS. CALLR MAPUSR ;AND CALL ROUTINE TO CALL USER .PAGE .SBTTL UNIT OFF-LINE;+; USUOFF - UNIT OFF-LINE;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-USUOFF::+ MOV #P.RUOF+120000,R0 ;SET UP USER ADDRESS- CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .PAGE( .SBTTL INPUT INTERRUPT SERVICE ROUTINE;+"; INPUT INTERRUPT SERVICE ROUTINE.;-$USINP::'; TTSET$ US ;;;SAVE R2, R3 AND SET UP: ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS%; MOV K.OWN(R4),R5 ;;;GET UCB ADDRESS CALL MAPD + CALLR ICHAR1 ;;;DO COMMON INPUT CHARACTER ;;;PROCESSING AND RETURN .PAGE) .SBTTL OUTPUT INTERRUPT SERVICE ROUTINE;+"; OUTPUT INTERRUPT SERVICE ROUTINE;- $USOUT::'; TTSET$ US ;;;SAVE R2, R3 AND SET UP: ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS$ MOV K.OWN(R4),R5 ;;;GET UCB ADDRESS .PAGE .SBTTL START OUTPUT;+; USSTAX - START OUTPUT.;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-USSTAX::* MOV #P.RSTA+120000,R0 ;;;00|}TADATADATADATADATADATADATADATADATAGET USER ADDRESS, CALLR MAPUS1 ;;;AND GO TO THE USER ROUTINE8; CALLR OUTISR ;;;DO COMMON OUTPUT INTERRUPT PROCESSING .SBTTL CHANGE LINE PARAMETERS;+!; USLPAR - CHANGE LINE PARAMETERS;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-USLPAR::* MOV #P.RLPA+120000,R0 ;;;GET USER ADDRESS-; CALLR MAPUS1 ;;;AND GO TO THE USER ROUTINE .PAGE .SBTTL LOCAL SUBROUTINES;; LOCAL SUBROUTINES; .PAGE;+/; MAPUSR - MAP TO AND CALL THE USER SUBROUTINE.;F; INPUT: R0 - OFFSET IN THE USER'S CODE OF THE ROUTINE TO BE CALLED; R5 - UCB ADDRESS;; R1 IS DESTROYED?; DATA APR5 IS DESTROYED FOR THE USER ROUTINE BY $MPPRO BUT%; RESTORED LATER FOR TTDRV'S USE.;-MAPUS1:, SUB #U.TSTA,R5 ;ADJUST BACK TO START OF UCBMAPUSR:" MOV U.DCB(R5),R1 ;GET DCB ADDRESS" MOV D.PCB(R1),R1 ;GET PCB ADDRESS9 MOV P.REL(R1),-(SP) ;GET APR BIAS FOR USER'S APPLICATION. MOV R0,-(SP) ;SET UP VIRTUAL ADDRESS FOR USER6 CALL $MPPRO ;USE EXEC ROUTINE TO MAP IT AND CALL IT RETURN ;BACK TO CALLER .ENDC ;T$$USP  .END UCB ADDRESS;; R1 IS DESTROYED?; DATA APR5 IS DESTROYED FOR THE USER ROUTINE BY $MPPRO BUT%; RESTORED LATER FOR TTDRV'S USE.;-MAPUS1:, SUB #U.TSTA,R5 ;ADJUST BACK TO START OF UCBMAPUSR:" MOV U.DCB(R5),R1 ;GET DCB ADDRESS" MOV D.PCB(R1),R1 ;GET PCB ADDRESS9 MOV P.REL(R1),-(SP) ;GET APR BIAS FOR USER'S APPLICATION. MOV R0,-(SP) ;SET UP VIRTUAL ADDRESS FOR USER6 CALL $MPPRO ; .TITLE TTYH .IDENT /06.03/.;C@; COPYRIGHT (c) 1983,1986,1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;A<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;C; ; 27-JAN-78 PETER WANNHEDENU;X; PREVIOUSLY MODIFIED BY:B;; P. WANNHEDEN ; C. F. SPITZ(; D. R. DONCHIND ; R. PHILPOTTD ; S. ADAMS ; L. KOGAN;S; MODIFICATIONS:; ; ; L. KOGAN 02-NOV-85 06.01:; LK703 -- DO NOT DISABLE REMOTE LINE WHEN DTR IS DROPPED;3; L. KOGAN 18-JUN-86 6.0232; LK710 -- INCLUDE 7-BIT CHARACTER LENGTH SUPPORT;H ; TODD SCHOELLER 27-Nov-86 06.03=; TMS047 -- SET TIMER TO EXPIRE IN THE UCB EXTENSION INDEXEDI; OFF OF THE CORRECT R4.;C;I;S;+*; CONTROLLER-DEPENDENT ROUTINES FOR DH-11.;-;S;M F .IF DF D$$H11 W H .MCALL UCBDF$ ( UCBDF$ ;DEFINE UCB SYMBOLST  .IF DF R$$MPL G .MCALL KRBDF$ I KRBDF$ ;DEFINE KRB SYMBOLS- 0 .IFF ;R$$MPL- O .MCALL SCBDF$  SCBDF$ ;DEFINE SCB SYMBOLS  K .ENDC ;R$$MPL 3 .PSECT MAP5;L; ; EQUATED SYMBOLSG;S; DH-11 REGISTER DEFINITIONS;oSCR = 0 ;SYSTEM CONTROL REG.M"NRC = 2 ;NEXT RECEIVED CHAR. REG.LPR = 4 ;LINE PARAMETER REG.TCAR = 6 ;CURRENT ADDRESS REG.BCR = 10 ;BYTE COUNT REG.BAR = 12 ;BUFFER ACTIVE REG.$;1;W;+; YHSTAX - START OUTPUT.5; NOTE - NON-BUFFERED OUTPUT CURRENTLY NOT SUPPORTED.C; ; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; U.TOP+2 BUFFER POINTERD; U.TOC BYTE COUNTK;. ; OUTPUT:L; OUTPUT STARTED.; U.TOP+2 UNCHANGED; U.TOC UNCHANGED;T; REGISTERS ALTERED: R4 ;-;T;C .ENABL LSB; YHSTAX::A BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;HIGH PRIORITY OUTPUT REQUESTED?R5 BEQ 5$ ;;;N - POSSIBLY BEGIN NORMAL PRIORITY OUTPUT = BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT ALREADY IN PROGRESS?O: BEQ 60$ ;;;Y - DO HIGH PRIORITY OUTPUT AT NEXT INTERRUPTE BIS #S5.HPO,U.TST5-U.TSTA(R5);;;SHOW BUSY DOING HIGH PRIORITY OUTPUT.4 ;;;IN CASE A NORMAL PRIORITY REQUEST COMES ALONG&STAXH: CALL SELLIN ;;;SELECT THE LINE1 BIT #S5.XOF,U.TST5-U.TSTA(R5) ;;;OUTPUT AN XOFF?E BEQ 3$ ;;;N - JUMP6 BIC #S5.XOF,U.TST5-U.TSTA(R5) ;;;Y - RESET INDICATION .IF DF T$$SPL1 MOV #YVXOFF-20000,CAR(R3) ;;;POINT TO DMA BUFFERR .IFF ;T$$SPLU+ MOV #YVXOFF,CAR(R3) ;;;POINT TO DMA BUFFERR .IFTF ;T$$SPL BR 4$ ;;;JOIN COMMON CODERL3$: BIC #S5.XON,U.TST5-U.TSTA(R5) ;;;NOT XOFF, MUST BE XON, RESET INDICATION .IFT ;T$$SPLT* MOV #00}{ D%B11110010YVXON-20000,CAR(R3) ;;;OUTPUT AN XON .IFF ;T$$SPLX% MOV #YVXON,CAR(R3) ;;;OUTPUT AN XON# .ENDC ;T$$SPL.4$: MOV #-1,BCR(R3) ;;;SET TO OUTPUT ONE CHAR.; BR YHRESX ;;;INITIATE THE OUTPUT REGARDLESS OF XOFF STATEFN5$: BIT #S5.HPO,U.TST5-U.TSTA(R5) ;;;HIGH PRIORITY OUTPUT REQUEST IN PROGRESS?: BNE 60$ ;;;Y - DO NORMAL PRIORITY OUTPUT AT NEXT INTRPT.STAXN: ;;;REFERENCE LABEL .IF DF T$$ACD, BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT? BNE 10$ ;;;Y - JUMP ADD #U.TOC,R4 ;;;POINT TO U.TOC8STAXM: MOV R2,-(SP) ;;;SAVE R2 DESTROYED BY MOUT ROUTINE+ CALL MOUT ;;;GET NEXT CHARACTER TO OUTPUTS9 MOVB R2,U.ADMA-U.TSTA(R5) ;;;PUT CHARACTER IN DMA BUFFERH MOV (SP)+,R2 ;;;RESTORE R2R CALL SELLIN ;;;SELECT LINE& MOV R5,CAR(R3) ;;;POINT TO DMA BUFFER ADD #U.ADMA-U.TSTA,CAR(R3) ;;;?( MOV #-1,BCR(R3) ;;;OUTPUT ONE CHARACTER BR 50$ ;;;INITIATE THE OUTPUTR .ENDC ;T$$ACD(10$: ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+2 CALL SELLIN ;;;SELECT LINESTAX1:  .IF DF T$$SPL1 MOV (R4),CAR(R3) ;;;SET BUFFER ADDRESS (U.TOP+2)S% CMP (R4)+,#120000 ;;;IN SYSTEM POOL?G- BLO 20$ ;;;Y - UMR MAPPING IS CORRECT, JUMP.@ SUB #20000,CAR(R3) ;;;FORCE BUFFER ADDRESS TO MAP THROUGH UMR 520$: ;;;REFERENCE LABEL .IFF ;T$$SPLA .IF DF M$$EXT 2 MOV (R4)+,CAR(R3) ;;;SET BUFFER ADDRESS (U.TOP+2) R .IFF ;M$$EXTE A. MOV (R4)+,-(SP) ;;;GET VIRTUAL BUFFER ADDRESS# CMP @SP,#120000 ;;;IN SYSTEM POOL?;6 BLO 40$ ;;;Y - VIRTUAL ADDRESS = PHYS. ADDRESS, JUMP= ADD RELC+2,@SP ;;;ADD RELOCATION CONSTANT TO VIRTUAL ADDRESSU MOV RELC,-(SP) ;;;# BCC 30$ ;;;NO CARRY - JUMP) ADD #20,@SP ;;;ADD CARRY TO HIGH 2 BITS.) BIC #^C<60>,@SP ;;;NORMALIZE HIGH 2 BITSS930$: BISB (SP)+,@R3 ;;;LOAD 2 HIGH BITS OF 18-BIT ADDRESS "40$: MOV (SP)+,CAR(R3) ;;;LOAD CAR 4 .ENDC ;M$$EXT U .ENDC ;T$$SPL ASSUME U.TOC,1 MOV @R4,BCR(R3) ;;;SET BYTE COUNT (U.TOC) IN BCR NEG BCR(R3) ;;;NEGATE IT ASSUME S2.CTS,100000Y,50$: TST 2(R5) ;;;OUTPUT STOPPED BY CTRL-S?' BMI 60$ ;;;IF SO, DON'T RESUME OUTPUT ;T; ;+; YHRESX - RESUME OUTPUT.;C; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S2.CTS 0P;-;M;ZFYHRESX::BIS $BTMSK(R2),BAR(R3) ;;;SET BIT IN BAR TO START TRANSMISSION  .IF NDF D$$M11R )YHMTIM::  .ENDC ;D$$M11 60$: RETURN ;;;;A .DSABL LSBU;P;;+; YHABOX - ABORT OUTPUT.;U; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;:; REGISTERS ALTERED: R3P;-;C;-)YHABOX::CALL YHSTOX ;;;STOP TRANSMISSION  CALL SELLIN ;;;SELECT LINE! CLR BCR(R3) ;;;CLEAR BYTE COUNTR7 CLR BCR(R3) ;;;DO IT AGAIN - CONTROLLER MAY HAVE BEENC) ;;;DOING A READ-MODIFY-WRITE CYCLE ONB. ;;;THE BYTE COUNT REGISTER WHEN WE CLEARED ;;;IT FIRST TIME RETURN ;;;;.;C;+; YHSTOX - STOP OUTPUT.;;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S2.CTS 1R;-;A;FGYHSTOX::BIC $BTMSK(R2),BAR(R3) ;;;CLEAR BIT IN BAR TO STOP TRANSMISSION- RETURN ;;;Y;O;; T .ENABL LSBO  .IF DF T$$GMC!T$$SMC!D$$M11 R;+#; YHLPAR - GET/SET LINE PARAMETERS.R; ; INPUT:; R0 BIT 15: 0 = SET SPEED; 1 = GET SPEEDA); BIT 13: 1 = SET 7-BIT CHARACTER LENGTHT4; BIT 12: 1 = CHECK IF 7-BIT CHARACTER IS SUPPORTED;; BIT 11: 1 = SET SPEED SELECTED BY AUTO-BAUD DETECT LOGIC ); BIT 10: 1 = SET DEVICE DEPENDENT SPEEDR!; (USED FOR SETTING PARITY) "; BIT 9: 1 = GET/SET ANSWER SPEED#; BIT 8: 0 = GET/SET RECEIVE SPEEDP; 1 = GET/SET TRANSMIT SPEED; IF SET SPEED:/; BITS 0-7: NEW SPEED PARAMETER (S.XXX SYMBOL);H&; R1 Flow control status change flags.;U(; BIT 0: 1 = Enable input flow control.); BIT 1: 1 = Disable input flow control.R); BIT 2: 1 = Enable output flow control.R*; BIT 3: 1 = Disable output flow control.;L; BITS 4-15: Reserved;O<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;O ; OUTPUT:A; IF GET SPEED REQUESTED:E ; R4 POINTER TO DH11 SPEED TABLE; CC-C 0;P; IF SET SPEED REQUESTED:M; CC-C 0 IF 00 }}TADATADATADATADATADATADATADATADATAOK; 1 IF ILLEGAL SPEED SPECIFIEDD;RJ; NOTE THAT THIS ROUTINE CAN BE EXECUTED AT BOTH SYSTEM STATE (IN RESPONSEN; TO A SF.GMC OR SF.SMC QIO) AND FROM THE INPUT INTERRUPT SERVICE ROUTINE (FOR; AUTO-BAUD DETECT).;t;-;w;n;lYHLPAR::) TST R1 ;Called for flow control change?B BEQ 5$ ;If EQ no - go on.I RETURN ;Not processed for DH.5$:E .IF DF T$$GMC ! T$$SMCP0 BIT #20000,R0 ;CHECK IF WE VALIDATE 7-BIT CHAR. BEQ 7$ ;NO RETURN07$: BIT #10000,R0 ;CHECK SET 7-BITC BEQ 8$ ;NO. SET SPEED-PARITY0 BR SETLN1 ;SET 7-BIT AND OTHER LINE PARAMETERS8$:D .ENDC ;T$$GMC ! T$$SMCE. BIT #4000,R0 ;SET SPEED FOR AUTO-BAUD DETECT? BEQ 20$ ;N - JUMPC& BIT #2000,R0 ;DEVICE DEPENDENT SPEED? BNE 10$ ;Y - JUMPP! BIC #177400,R0 ;CLEAR UPPER BYTEo4 MOVB SPDH-1(R0),R0 ;GET DEVICE DEPENDENT SPEED BITS-10$: BIC #^C<17>,R0 ;CLEAR ALL BUT SPEED BITS! MOV R0,R2 ;GET A COPY0 H .IF DF R$$EIS8 ASH #4,R2 ;SHIFT SPEED BITS TO TRANSMIT SPEED POSITION .IFF ;R$$EISC: CALL SHIFT4 ;SHIFT SPEED BITS TO TRANSMIT SPEED POSITION .ENDC ;R$$EIS& BIS R0,R2 ;ADD IN RECEIVE SPEED BITS4 MOVB R2,U.CW3-U.TSTA(R5) ;SET NEW SPEED IN DATABASE3 BR SETLN1 ;SET PARITY AND NEW SPEED IN CONTROLLER20$: ;REFERENCE LABEL .IF DF T$$GMC&T$$SMCR T! MOV R0,R4 ;SAVE INPUT PARAMETER & SWAB R4 ;PUT FLAGS IN LOW ORDER BYTE BPL 30$ ;SET SPEED - JUMP V .ENDC T .IF DF T$$GMC D( MOV #SPDH,R4 ;POINT TO DH11 SPEED TABLE RETURN ;RETURN WITH CC-C = 0F R .ENDC ;T$$GMC F .IF DF T$$SMC!D$$M11O A .IF NDF T$$GMCI! MOV R0,R4 ;SAVE INPUT PARAMETERA( SWAB R4 ;PUT FLAGS IN LOWER ORDER BYTE .ENDC ;NDF T$$GMC I'30$: BIC #177400,R0 ;CLEAR R0 HIGH BYTEE# MOVB SPDH-1(R0),R2 ;GET SPEED BITSR SEC ;ASSUME ERROR' BMI 40$ ;NOT A SUPPORTED SPEED - JUMP  ASRB R4 ;SET ANSWER SPEED? BEQ 50$ ;N - JUMP .IF DF D$$M11- BICB #17,U.CW3+1-U.TSTA(R5) ;CLEAR OLD VALUEM1 BISB R2,U.CW3+1-U.TSTA(R5) ;SET NEW ANSWER SPEEDR CLC ;SHOW SUCCESS .IFF ;D$$M11C5 SEC ;ATTEMPT TO SET ANSWER SPEED W/O MODEM SUPPORTV .ENDC ;D$$M11 40$: RETURNS; $50$: BCS 60$ ;TRANSMIT SPEED - JUMP3 BICB #17,U.CW3-U.TSTA(R5) ;CLEAR OLD RECEIVE SPEED  BR 70$ ;JUMP TO SET NEW SPEEDG960$: BICB #360,U.CW3-U.TSTA(R5) ;CLEAR OLD TRANSMIT SPEEDO .IF DF R$$EIS0 ASH #4,R2 ;SHIFT SPEED BITS TO PROPER POSITION .IFF ;R$$EIS12 CALL SHIFT4 ;SHIFT SPEED BITS TO PROPER POSITION .ENDC ;R$$EIS,70$: BISB R2,U.CW3-U.TSTA(R5) ;SET NEW SPEED BR 100$ ;GO AND LOAD INTO LPR; E .ENDC ;T$$SMC!D$$M11   .IF DF D$$M11&R$$CONCYMLPAR::RETURN .ENDC .ENDC ;T$$GMC!T$$SMC!D$$M11 U;;+; YHPWUP - POWER-UP.;L; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; U.STS SET UP FOR LOCAL LINE: ; US.CRW 0 ; US.DSB 0E;-;A;# .IF DF R$$CONYHCONL:: .IF DF M$$EXT* MOV #UMR5S,R0 ;GET ADDRESS OF SAVED UMR 5$ MOV #UBMPR+<5*4>,R1 ;POINT AT UMR 5 MOV (R0)+,(R1)+ ;SET UP UMR 5 MOV (R0)+,(R1)+ ; .IF NDF T$$SPLD MOV (R0)+,(R1)+ ;SET UP UMR 6 MOV (R0)+,(R1)+ ; .ENDC ;NDF T$$SPL .ENDC ;M$$EXTYHCPUP:: .IFF$#YHPWUP::TST R2 ;IS THIS LINE ZERO?R BNE 80$ ;N - JUMP  .IFTF- MOV #4000,@R3 ;CLEAR SILO, UARTS, CONTROLLER" MOV #20100,@R3 ;ENABLE INTERRUPTS .IFT RETURNEYHUONL::YHUPUP:: .ENDC ;R$$CON80$: ;REFERENCE LABEL # .IF DF D$$M11 S+ BIT #U2.RMT,U.CW2-U.TSTA(R5) ;REMOTE LINE?  BEQ 100$ ;N - JUMP4 BIC #S5.ABP,U.TST5-U.TSTA(R5) ;RESET AUTO-BAUD MODE .IF NDF R$$MPL(! MOV U.SCB-U.TSTA(R5),R0 ;GET SCB;2 TST S.DMCS(R0) ;IS THERE REMOTE SUPPORT FOR LINE? BNE 90$ ;Y - JUMP:1 BIC #U2.RMT,U.CW2-U.TSTA(R5) ;N - SET LINE LOCAL) BR 100$ ;FORGET THAT IT WAS EVER REMOTET90$: ;REFERENCE LABEL .IFTF ;NDF R$$MPL< BISB #US.CRW,U.STS-U.TSTA(R5) ;SET WAITING FOR CARRIER FLAG .IFT ;NDF R$$MPLL MOV R3,-(SP) ;SAVE DH11 CSR+ CALL YHMTIM ;ENABLE INTERRUPTS ON DM11-BBB MOV (SP)+,R3 ;RESTORE DH11 CSRU .ENDC ;NDF R$$MPL .IF DF R$00}{ D%B11110010$CON! MOV U.SCB-U.TSTA(R5),R0 ;GET SCBT MOV S.KRB(R0),R0 ;GET DH11 KRB0( MOVB K.CON(R0),R0 ;GET CONTROLLER INDEX. ADD YMCP1,R0 ;POINT TO POINTER TO DM11-BB KRB MOV @R0,R0 ;GET DM11-BB KRB 8 MOVB U.UNIT-U.TSTA(R5),R1 ;GET UNIT NUMBER OF THIS LINE1 ASL R1 ;CONVERT FROM BYTE OFFSET TO WORD OFFSETA9 BIS $BTMSK(R1),K.PRM-2(R0) ;SET ENABLE BIT FOR THIS LINE1 BIT #KS.OFL,K.STS(R0) ;IS DM CONTROLLER OFFLINE?  BNE 100$ ;Y - JUMP MOV R3,-(SP) ;SAVE YH CSR MOV @R0,R3 ;GET YM CSR. CALL YHMTMA ;LET DM KNOW ABOUT THIS LINE NOW MOV (SP)+,R3 ;RESTORE YH CSRG .ENDC ;R$$CON . .ENDC ;&100$: CALL LOCKI ;LOCK OUT INTERRUPTS>SETLN1: MOV U.CW3-U.TSTA(R5),R2 ;GET NEW SPEED AND PARITY BITS'SETLIN: CALL SELLIN ;;;SELECT THE LINE # SWAB R2 ;;;PUT IN HIGH ORDER BYTEB$ ROR R2 ;;;SHIFT TO PROPER POSITION ROR R2 ;;;, BIC #140017,R2 ;;;CLEAR EXTRANEOUS NONSENSE3 BIT #30000,R2 ;;;TRANSMIT SPEED 110 BAUD OR LOWER?; BNE 110$ ;;;N - JUMP$ BIS #4,R2 ;;;Y - SET TWO STOP BITS0110$: BIS #3,R2 ;;;SET FOR EIGHT BIT CHARACTERS8 BIT #S5.CLN,U.TST5-U.TSTA(R5) ;;;CHECK 7-BIT CHARACTERS BEQ 115$ ;;;NO LEAVE IT 8-BITU BIC #1,R2 ;;;SET 7-BIT0115$: MOV R2,LPR(R3) ;;;LOAD NEW LINE PARAMETERS;L7; WHEN RETURNING VIA COROUTINE "LOCKI", CC-C IS CLEARED ;H RETURN ;RETURNR ; .DSABL LSBO .IF DF R$$CONYHCOFF::! CALL LOCKI ;LOCK OUT INTERRUPTSO/ MOV #4000,@R3 ;;;CLEAR SILO, UARTS, CONTROLLER  RETURN;YHUOFF::! CALL LOCKI ;LOCK OUT INTERRUPTSS CALL SELLIN ;;;SELECT THE LINE. CLR LPR(R3) ;;;SET TO 0 BAUD TO DISABLE LINE RETURN ;;;DROP PRIORITY .ENDC ;R$$CON;5;;;+"; INPUT INTERRUPT SERVICE ROUTINE.;-;;$ .ENABL LSBR;; O .IF DF R$$MPL E-$YHINP::TTSET$ YH ;;;SAVE R2, R3 AND SET UP:" ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS .IFF ;R$$MPL  C+$DHINP::TTSET$ DH ;;;SAVE R2,R3 AND SET UPU ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST  .ENDC ;R$$MPL , CALL MUXINP ;;;DO COMMON MULTIPLEXER INPUT ;;;CHARACTER PROCESSINGL3 ;;;MUXINP DISMISSES INTERRUPT IF NO OUTPUT WORK;* BR 10$ ;;;XMIT READY - GO DO OUTPUT WORK;;N;+#; OUTPUT INTERRUPT SERVICE ROUTINE.$;-;B;S  .IF DF R$$MPL M-$YHOUT::TTSET$ YH ;;;SAVE R2, R3 AND SET UP:E ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS E .IFF ;R$$MPLR P+$DHOUT::TTSET$ DH ;;;SAVE R2,R3 AND SET UPS ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST I .ENDC ;R$$MPL M<10$: BIC #100077,@R3 ;;;CLEAR TRANSMIT DONE, UNIT NUMBER AND$ ;;;2 HIGH BITS OF UNIBUS ADDRESS! MOV R4,-(SP) ;;;SAVE KRB ADDRESS; B .IF DF R$$MPL Y+ ADD K.OFF(R4),R4 ;;;GET START OF UCB TABLET U .ENDC ;R$$MPL $)20$: MOV (R4)+,R5 ;;;GET NEXT UCB ADDRESST' BEQ 80$ ;;;JUMP IF LINE IS NOT IN USE CMP R5,#-1 ;;;END OF LIST? BEQ 90$ ;;;Y - JUMPE . .IF DF R$$CON D# BITB #US.OFL,U.ST2(R5) ;;;OFFLINE?T BNE 80$ ;;;Y - JUMP  .ENDC ;R$$CON MOV R4,-(SP) ;;;SAVE R4 MOV R3,-(SP) ;;;SAVE CSR@ .IF DF T$$SPL$ MOV U.TAPR(R5),@#KDSAR5 ;;;MAP UCBX. MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX" ADD #U.TSTA,R5 ;;;POINT TO U.TSTA .IFF ;T$$SPL  ASSUME U.TSTA,( ADD #U.TUX,R5 ;;;POINT TO UCBX POINTER MOV (R5)+,R4 ;;;GET UCBX .ENDC ;T$$SPL BIT #2000,@R3 ;;;NXM BIT SET? BEQ 30$ ;;;N - JUMP9 BIS #400,@R3 ;;;Y - CLEAR IT$6 MOVB #1,U.TOTI(R4) ;;;SET TIMER TO EXPIRE IN 1 SECOND BR 60$ ;;;GO ON TO NEXT LINE:30$: TST BCR(R3) ;;;HAS THIS LINE COMPLETED TRANSMISSION? BNE 60$ ;;;N - JUMPVK BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;ANY HIGH PRIORITY OUTPUT REQUEST PENDING?C BEQ 35$ ;;;N - JUMPP- MOVB U.UNIT-U.TSTA(R5),R2 ;;;GET UNIT NUMBERS ASL R2 ;;; .. TIMES 2,* CALL STAXH ;;;START HIGH PRIORITY OUTPUT3 BR 60$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETEDXB35$: BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT INTERRUPT UNEXPECTED? BNE 45$ ;;;Y - JUMPSG BIT #S5.HPO,U.TST5-U.TSTA(R5) ;;;JUST STARTING NORMAL PRIORITY OUTPUT?B3 BEQ 37$ ;;;N - COMPLETE INTERRUPTED OUTPUT STREAMEJ BIC #S5.HPO,U.TST5-U.TSTA(R5) ;;;START NO00}}TADATADATADATADATADATADATADATADATARMAL (NOT HIGH) PRIORITY REQUEST- MOVB U.UNIT-U.TSTA(R5),R2 ;;;GET UNIT NUMBERM ASL R2 ;;; .. TIMES 2;= CALL STAXN ;;;BEGIN OUTPUT DELAYED BY HIGH PRIORITY REQUESTT3 BR 60$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETEDR37$: .IF DF T$$ACD, BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT? BNE 40$ ;;;Y - JUMPE ADD #U.TOC,R4 ;;;POINT TO U.TOC% DEC @R4 ;;;ANYTHING LEFT TO OUTPUT?L BEQ 50$ ;;;N - JUMPQ- CALL STAXM ;;;Y - INITIATE ANOTHER TRANSFERE3 BR 60$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETED  .ENDC ;T$$ACD(40$: ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+26 CALL NXTOB ;;;GET NEXT OUTPUT BUFFER IF THERE IS ONE BEQ 50$ ;;;N - JUMPH;I5; WE GOT ANOTHER OUTPUT BUFFER - START OUTPUTTING IT.A;O TST -(R4) ;;;POINT TO U.TOP+2D MOV (SP)+,R3 ;;;GET CSR- MOVB U.UNIT-U.TSTA(R5),R2 ;;;GET UNIT NUMBER ASL R2 ;;; .. TIMES 2O CALL STAX1 ;;;START OUTPUT BR 70$ ;;;I45$: BIC #S5.HPO,U.TST5-U.TSTA(R5) ;;;NO HIGH PRIORITY OUTPUT IN PROGRESS3 BR 60$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETED;.-50$: CALL ODONE ;;;DO OUTPUT DONE PROCESSINGO(60$: MOV (SP)+,R3 ;;;RESTORE CSR POINTER70$: MOV (SP)+,R4 ;;;RESTORE R4 980$: BICB #60,@R3 ;;;CLEAR 2 HIGH BITS OF UNIBUS ADDRESST( ;;;TO AVOID OVERFLOW INTO BIT 6 WHEN ;;;INCREMENTING LINE NUMBERR# INCB @R3 ;;;INCREMENT LINE NUMBERN BR 20$ ;;;GO TRY NEXT LINE; 7; ALL LINES SCANNED. SEE IF ANY LINE COMPLETED TRANSMIT#; "BEHIND" US IN THE SCAN LOOP.G;R(90$: MOV (SP)+,R4 ;;;RESTORE KRB ADDRESS) ;;; OR ADDRESS OF UCB LIST (RSX-11M) TST @R3 ;;;XMIT RDY SET?% BMI 10$ ;;;Y - DO IT ALL OVER AGAIN;;S5; ALL OUTPUT WORK DONE. SEE IF ANY INPUT WORK NEEDED.:;C, MOV NRC(R3),R5 ;;;GET A CHARACTER FROM SILO BPL 100$ ;;;NONE - EXITL+ CALL MUXIN1 ;;;PROCESS AS INPUT INTERRUPTN$ BR 10$ ;;;OUTPUT WORK TO DO - JUMP3 ;;;MUXIN1 DISMISSES INTERRUPT IF NO OUTPUT WORK ;N;.;E;  .IF NDF R$$EIST;IH; SUBROUTINE TO SHIFT R2 4 BIT POSITIONS TO THE LEFT FOR NON-EIS SYSTEMS;DSHIFT4: ASL R2 ;SHIFT ONCEU ASL R2 ;TWICE ASL R2 ;THRICE ASL R2 ;LAST TIME  RETURN  .ENDC ;NDF R$$EIS;L$; SUBROUTINE TO SELECT LINE ON DH11.; ;D:SELLIN: BICB #77,@R3 ;;;CLEAR LINE NUMBER AND 2 HIGH BITS ;;;OF 18-BIT ADDRESS* BISB U.UNIT-U.TSTA(R5),@R3 ;;;SELECT LINE100$: RETURN ;;;; .DSABL LSB  .IF DF D$$M11  .IF DF R$$CONYMCONL::YMCPUP:: CALL LOCKI ;RAISE OUR PRIORITY# BIC #1040,@R3 ;;;STOP DM11-BB SCANO"10$: BIT #20,@R3 ;;;SCAN STOPPED? BNE 10$ ;;;N - WAITI# CLR R0 ;;;INITIALLY SET TO LINE 0;20$: MOV R0,@R3 ;;;SELECT LINET" ASL R0 ;;;CONVERT TO WORD OFFSET: BIT $BTMSK(R0),K.PRM-2(R2) ;;;SHOULD WE ENABLE THIS LINE? BEQ 30$ ;;;N - JUMPB4 BIS #7,2(R3) ;;;Y - ASSERT DTR, RTS AND LINE ENABLE30$: ASR R0 ;;;RESTORE COUNTI" INC R0 ;;;INCREMENT TO NEXT LINE% CMP R0,#15 ;;;GONE THRU EVERY LINE?$ BLE 20$ ;;;N - LOOPP+ BIS #140,@R3 ;;;ENABLE SCAN AND INTERRUPTS0' RETURN ;;;RETURN WILL LOWER PRIORITY0YMCOFF::! CALL LOCKI ;LOCK OUT INTERRUPTSI- BIC #1140,@R3 ;;;DISABLE SCAN AND INTERRUPTSVYMSTAX::YMABOX::YMRESX::YMSTOX::YMMTIM::YMUPUP::YMUONL::YMUOFF:: RETURN ;;;O .ENDC ;R$$CON;+); DM11-BB DATASET STATUS CHANGE INTERRUPTY;-;R;T R .IF DF R$$MPL -$DM11B::TTSET$ YM ;;;SAVE R2, R3 AND SET UP:R ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS E .IFF ;R$$MPL; -+$DM11B::TTSET$ DM ;;;SAVE R2,R3 AND SET UPR ;;; R3 = DH11 CSRT# ;;; R4 = ADDRESS OF DH UCB LISTC! MOV -4(R4),R3 ;;;GET DM11-BB CSRB # .ENDC ;R$$MPL 1 BIC #240,@R3 ;;;CLEAR DONE FLAG AND DISABLE SCAN, MOV (R3)+,R5 ;;;GET LINE NUMBER IN BITS 0-3& CALL MUXUCB ;;;GET POINTER TO U.TSTA BCS 10$ ;;;UNKNOWN LINE - JUMP MOV @R3,R4 ;;;GET MODEM STATUS5 CALL MODISR ;;;DO COMMON MODEM INTERRUPT PROCESSINGE, BVC 10$ ;;;NO SPECIAL ACTION NEEDED - JUMP BCS 5$ ;;;DROP DTR - JUMPP/ BIS #7,@R3 ;;;ASSERT DTR, RTS AND LINE ENABLEU BIS #40,-(R3) ;;;REENABLE SCAN; RETURND'5$: BIC #6,@R3 ;;;DEASSERT DTR AND RTSE#10$: BIS #40,-(R00%}*} D%B111100103) ;;;REENABLE SCAN $ BCS 30$ ;;;NO CALL ANSWERED - JUMP# MOV U.SCB-U.TSTA(R5),R3 ;;;GET SCBL  .IF DF R$$MPL ( MOV @S.KRB(R3),R3 ;;;GET DH CSR ADDRESS 1 .IFF ;R$$MPLL ' MOV S.CSR(R3),R3 ;;;GET DH CSR ADDRESS L .ENDC ;R$$MPL M/ MOVB U.CW3+1-U.TSTA(R5),R2 ;;;GET ANSWER SPEEDP- BICB #^C<17>,R2 ;;;CLEAR ALL BUT SPEED FIELDR? MOVB R2,U.CW3-U.TSTA(R5) ;;;SAVE NEW RECEIVE SPEED IN DATABASE# .IF DF R$$EIS0 ASH #4,R2 ;;;SET TRANSMIT SPEED = ANSWER SPEED .IFF ;R$$EISS2 CALL SHIFT4 ;;;SET TRANSMIT SPEED = ANSWER SPEED .ENDC ;R$$EIS@ BISB R2,U.CW3-U.TSTA(R5) ;;;SAVE NEW TRANSMIT SPEED IN DATABASE9 MOV U.CW3-U.TSTA(R5),R2 ;;;GET NEW SPEED AND PARITY BITSV ASSUME S4.ABD,100000 . TST 6(R5) ;;;AUTO-BAUD SPEED DETECT ENABLED?# BPL 20$ ;;;IF NOT, DON'T SET BAUDP* MOV #314,R2 ;;;Y - SET LINE TO 4800 BAUD'20$: JMP SETLIN ;;;SET LINE PARAMETERSE;E"30$: RETURN ;;;DISMISS INTERRUPT;E;;+; YHMTIM - MODEM TIME-OUTP;-;N;R E .IF DF R$$MPL S(YHMTIM::MOV U.SCB-U.TSTA(R5),R3 ;GET SCB MOV S.KRB(R3),R3 ;GET DH11 KRB( MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX. ADD YMCP1,R3 ;POINT TO POINTER TO DM11-BB KRB MOV @(R3)+,R3 ;GET DM11-BB CSRV A .IFF ;R$$MPL0 (YHMTIM::MOV U.SCB-U.TSTA(R5),R3 ;GET SCB# MOV S.DMCS(R3),R3 ;GET DM11-BB CSRT U .ENDC ;R$$MPL ;YHMTMA:L CALL LOCKI ;DISABLE INTERRUPTS BIC #1040,@R3 ;;;STOP SCAN"10$: BIT #20,@R3 ;;;SCAN STOPPED? BNE 10$ ;;;N - WAITM" BIC #17,@R3 ;;;CLEAR LINE NUMBER; 0; NOTE - CANNOT USE BYTE INSTRUCTIONS ON DM11-BB;- MOVB U.UNIT-U.TSTA(R5),R4 ;;;GET LINE NUMBER3 BIS R4,(R3)+ ;;;SELECT LINE4 CALL HLMTIM ;;;DO COMMON MODEM TIME-OUT PROCESSING/ BEQ 20$ ;;;IF EQ Z-BIT SET - DROP DTR AND RTS/ BIS #7,@R3 ;;;ASSERT DTR, RTS AND LINE ENABLED BR 30$ ;;;ENABLE SCANS-20$: BIC #17,@R3 ;;;DROP DTR, RTS, SEC. XMITK INC @R3 ;;;SET LINE ENABLE130$: BIS #140,-(R3) ;;;ENABLE SCAN AND INTERRUPTST" RETURN ;;;RETURN FROM COROUTINE 7 .ENDC ;D$$M11  .ENDC ;D$$H11 - N .END BYTE INSTRUCTIONS ON DM11-BB;- MOVB U.UNIT-U.TSTA(R5),R4 ;;;GET LINE NUMBER3 BIS R4,(R3)+ ;;;SELECT LINE4 CALL HLMTIM ;;;DO COMMON MODEM TIME-OUT PROCESSING/ BEQ 20$ ;;;IF EQ Z-BIT SET - DROP DTR AND RTS/ BIS #7,@R3 ;;;ASSERT DTR, RTS AND LINE ENABLED BR 30$ ;;;ENABLE SCANS-20$: BIC #17,@R3 ;;;DROP DTR, RTS, SEC. XMITK INC @R3 ;;;SET LINE ENABLE130$: BIS #140,-(R3) ;;;ENABLE SCAN AND INTERRUPTST" RETURN ;;;RETURN FROM COROUTINE 7 .ENDC ;D$$M11  .ENDC ;D$$H11 - N . .TITLE TTYHVa .IDENT /07.00/;V6; COPYRIGHT (c) 1988 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;(<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;u;t; 28-AUG-82 DALE R. DONCHINd;t; MODIFICATIONS:;1; D. R. DONCHIN 05-JUN-83 05.01o2; DD173 -- FIX MINOR PROBLEMS WITH DHU/DHV11 CODE; ; D. R. DONCHIN 14-SEP-83 05.02 ; DD179 -- ADD HOSTSYNC SUPPORT ; L. KOGAN;e; D. R. DONCHIN 16-OCT-83 05.03L@; DD183 -- FIX SETTING OF SPEED WHEN NOABAUD AND PARITY ARE SET;M; S.C. ADAMS 23-APR-84 05.04B; SA170 -- CHANGE S4.XOF,XON,HPC,HPO TO S5.(ETC) AND S1.OBF TO S2;; AND CHANGE S3.ABP AND S3.ABD. AND CHANGE .OBF AND .CTSC;I; D. R. DONCHIN 15-JUN-84 05.05R; DD186 -- ADD DHU11 SUPPORT:;1; D. R. DONCHIN 15-JUN-84 05.06o@; DD187 -- IMPROVE MODEM HANDLING TO MEET EUROPEAN REQUIREMENTS;C; D. R. DONCHIN 15-JUN-84 05.07 +; DD193 -- FIX SOME MODEM CONTROL PROBLEMS ;C; D. R. DONCHIN 15-JUN-84 05.08 .; DD195 -- FIX BUFFER LOSS AND ABORT PROBLEMS;T; D. R. DONCHIN 18-SEP-84 05.094,; DD203 -- FIX DHV11 SUPPORT ON I/D SYSTEMS;C ; T. Lekas 2-Nov-84 05.10, 05.11:; TL334 -- Port is notified of flow control status change;C; D. R. DONCHIN 17-OCT-84 05.12 ; ;; DD205 -- FIX TIMING PROBLEM WHEN ABORTING DHU/DHV OUTPUT7; ; L. KOGAN 4-FEB-85 05.13E9; LK605 -- FIX SETTING TC.PAR AND TC.EPA CHARACTERISTICS0;; L. KOGAN 29-APR-85 05.14); LK607 -- FIX CONDITIONAL CO00-}}TADATADATADATADATADATADATADATADATADE (D$$VMD)N; ; L. KOGAN 5-JUN-85 05.15F"; LK608 -- FIX THE SELLIN PROBLEM; ; L. KOGAN 27-AUG-85 05.16@; LK609 -- SETUP THE RIGHT LINE BEFORE CHANGING LINE PARAMETERS;5;,%; MODIFIED FOR RSX-11M-PLUS V4.0 BY: ;w; L. KOGAN 18-JUN-86 6.012; LK710 -- INCLUDE 7-BIT CHARACTER LENGTH SUPPORT;I; L. KOGAN 08-SEP-86 6.02D3; LK715 -- ADD SUPPORT FOR Q-BUS DMA TRANSFER FROM6; A TASK BUFFER;R; L. KOGAN 01-DEC-86 6.030=; LK717 -- FIX DISABLED TERMINAL PROBLEM AFTER HIGH PRIORITYO0; OUTPUT IS ABORTED INSTEAD OF REGULAR OUTPUT;8; L. KOGAN 29-DEC-86 6.047; LK718 -- FIX SINGLE CHARACTER TRANSFER TO DHU11 LINEH;I;B; L. KOGAN 20-FEB-87 6.05E:; LK720 -- SUPPORT DIRECT TRANSFER FOR "PURE" IO.WAL ONLY;G; D. DONCHIN 24-FEB-87 6.06-?; DD721 -- BETTER HANDLE MIXED XOFF/XON AND QIO OUTPUT STREAMS6;0; L. KOGAN 26-JUN-87 6.07 7; LK726 -- SUPPORT Q-BUS DMA TRANSFER FOR REMOTE LINES.;G; L. KOGAN 02-JUL-87 6.087:; LK728 -- CHANGE DMA IO.WAL PACKET FORMAT (NO FLAG WORD);T$; MODIFIED FOR RSX-11M-PLUS V4.1 BY:;;; L. KOGAN 04-DEC-87 07.00;L+; LK730 -- ADJUST STACK FOR XON/XOF OUTPUT1;N;+.; CONTROLLER-DEPENDENT ROUTINES FOR DHU/DHV11.;-; ;E .IF DF D$$V11 .MCALL UCBDF$ UCBDF$ ;DEFINE UCB SYMBOLS .IF DF R$$MPL .MCALL KRBDF$ KRBDF$ ;DEFINE KRB SYMBOLS .IFF ;R$$MPL- .MCALL SCBDF$ SCBDF$ ;DEFINE SCB SYMBOLSR .ENDC ;R$$MPL .PSECT MAP5;-;6; EQUATED SYMBOLSH;E ; DHU/DHV11 REGISTER DEFINITIONS;R!CSR = 0 ;CONTROL STATUS REGISTER #RBUF = 2 ;RECEIVER BUFFER REGISTER7(TXCHAR = 2 ;TRANSMIT CHARACTER REGISTER!LPR = 4 ;LINE PARAMETER REGISTERRSTAT = 6 ;LINE STATUS REGISTER.#FIFODT = 6 ;DHU FIFO DATA REGISTERC#FIFOSZ = 6 ;DHU FIFO SIZE REGISTERY#LNCTRL = 10 ;LINE CONTROL REGISTERR0BFADR1 = 12 ;TRANSMIT BUFFER ADDRESS 1 REGISTER0BFADR2 = 14 ;TRANSMIT BUFFER ADDRESS 2 REGISTER1BFCNT = 16 ;TRANSMIT DMA BUFFER COUNTER REGISTER;Q7; DEFINITION FOR THE CONTROLLER ID BIT IN STAT REGISTERS; &DHUID = 400 ; DHUID=0 INDICATES DHV11 ; DHUID=1 INDICATES DHU11H;=;+; YVSTAX - START OUTPUT.5; NOTE - NON-BUFFERED OUTPUT CURRENTLY NOT SUPPORTED. ;T; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; U.TOP+2 BUFFER POINTER1; U.TOC BYTE COUNTS;R ; OUTPUT:1; OUTPUT STARTED. ; U.TOP+2 UNCHANGED; U.TOC UNCHANGED;F; REGISTERS ALTERED: R4F;-;6;T ; M; BUFFERED OUTPUT FOR ALL QIO, EXCEPT IO.WAL IS ALWAYS DONE FROM THE TERMINALRC; DRIVER BUFFERS. IN CASE OF IO.WAL FOR Q-BUS SYSTEMS OUTPUT MAY BENB; DONE FROM THE TASK BUFFER WITHOUT INTERMEDIATE TRANSFER INTO THE#; CHAIN OF USUAL TTDRV BUFFERS G; ONLY ONE INTERNAL TTDRV BUFFER IS USED FOR THIS TRANSFER. THIS BUFFER.G; DOES NOT CONTAIN DATA. IT CONTAINS INFORMATION FOR DIRECT OUTPUT FROMP; THE TASK BUFFERS. ; .; OFFSETS ; R; 0 - LINK WORD (CONTAINS 0); 2 - LENGTH D'; 4 - NUMBER OF BYTES FOR DMA TRANSFER A'; 6 - HIGH BYTE OF TASK BUFFER ADDRESS E(; 10 - LOW BYTES OF TASK BUFFER ADDRESS ; N-; THE REST OF THE OUTPUT BUFFER IS NOT USED A ; N; IN A REGULAR QIO WE HAVE AS MANY PHYSICAL DATA TRANSFERS AS WE HAVE INTERNALL; OUTPUT BUFFERS CHAINED FOR TASK OUTPUT. FOR 'PURE' IO.WAL WE HAVE ONLY ONE; PHYSICAL DATA TRANSFER ; P .ENABL LSBB;EHYVSTAX::BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;HIGH PRIORITY OUTPUT REQUESTED?4 BEQ 7$ ;;;N -POSSIBLY BEGIN NORMAL PRIORITY OUTPUT> BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT ALREADY IN PROGRESS? 6 BEQ 8$ ;;;Y - DO HIGH PRIOR.OUTPUT AT NEXT INTERRUPTC BIS #S5.HPO,U.TST5-U.TSTA(R5);;;SHOW BUSY DOING HIGH PRIOR. OUTPUTQ A)STAXH: CALL SELLIN ;;;SELECT THE LINE N" MOV R3,R4 ;;;COPY CSR ADDRESS ( BIT #DHUID,STAT(R3) ;;;CHECK FOR DHU  BEQ 2$ ;;;NO. THIS IS DHV 3 TSTB FIFOSZ(R3) ;;;IF DHU CHECK IF FIFO HAS SPACE S BEQ 8$ ;;;NO SPACE. EXIT O% ADD #FIFODT,R4 ;;;POINT TO FIFODT L M22$: BIT #S5.XOF,U.TST5-U.TSTA(R5);;;OUTPUT XOF?  BEQ 3005}*} D%B11110010$ ;;;NO R3 BIC #S5.XOF,U.TST5-U.TSTA(R5);;;RESET INDICATION T! MOV YVXOFF,-(SP) ;;;SET XOFF S BR 4$ ;;;GO ON O03$: BIC #S5.XON,U.TST5-U.TSTA(R5);;;RESET XON  MOV YVXON,-(SP) ;;;SET XON C R#4$: CMP R3,R4 ;;;IF EQUAL - DHV  BNE 5$ ;;;NO. THIS IS DHU 1 MOV (SP)+,TXCHAR(R3);;;OUTPUT XON/XOFF FOR DHV O BR 6$ ;;;ALL DONE ; X05$: MOVB (SP)+,(R4) ;;;OUTPUT XON/XOFF FOR DHU $$6$: JMP 60$ ;;;INITIALIZE OUTPUT 97$: BIT #S5.HPO,U.TST5-U.TSTA(R5) ;;;HIGH PRIOR. OUTPUT T ;;;IN PROGRESS? 3 BEQ STAXN ;;;Y - DO NORMAL PRIOR. OUTPUT ON NEXT  ;;;INTERRUPT 8$: JMP 70$ ;;;EXIT  STAXN: ;;;REFERENCE LABEL  .IF DF T$$ACD, BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT? BNE 10$ ;;;Y - JUMPP ADD #U.TOC,R4 ;;;POINT TO U.TOC&STAXM: CALL SELLIN ;;;SELECT THE LINE+ CALL MOUT ;;;GET NEXT CHARACTER TO OUTPUTF9 MOVB R2,U.ADMA-U.TSTA(R5) ;;;PUT CHARACTER IN DMA BUFFER = BIS #100000,U.ADMA-U.TSTA(R5) ;;;SET TRANSMIT DATA VALID BITO JMP 50$ ;;;INITIATE THE OUTPUT  .ENDC ;T$$ACD(10$: ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+2&STAX1: CALL SELLIN ;;;SELECT THE LINEE BICB #200,BFADR2+1(R3) ;;;DISABLE THE XMITTER IN CASE WE'RE X-OFF'ED2 .IF DF T$$DMA R = BIT #S5.DWA,U.TST5-U.TSTA(R5);;;CHECK FOR IO.WAL IN PROGRESS: BNE 48$ ;;;NOS .ENDC ;T$$DMA T X< MOV (R4),BFADR1(R3) ;;;SET VIRTUAL BUFFER ADDRESS (U.TOP+2) CLRB BFADR2(R3) ;;;; CMP (R4)+,#120000 ;;;SET CC-C IF BUFFER IS IN PRIMARY POOLO;JP; FOR 22-BIT SYSTEMS, CHECK FOR THE PRESENCE OF UMRS. THE CHECKING IS DIFFERENT; FOR RSX-11M AND RSX-11M-PLUS.L;  .IF DF M$$EXT .IF DF R$$MPL2 BIT #HF.UBM,$HFMSK ;;;UMRS EXIST? SET CC-Z IF NO .IFF ;R$$MPLA2 BIT #177777,$UMRPT ;;;UMRS EXIST? SET CC-Z IF NO .ENDC ;R$$MPL .ENDC ;M$$EXT;SP; IN I/D SYSTEMS, BUFFERS CAN BE IN EITHER TTCOM OR PRIMARY POOL, EACH REQUIRINGN; DIFFERENT RELOCATION CONSTANTS IF THERE ARE NO UMRS. FOR NON-I/D SYSTEMS WEM; ONLY NEED TO COMPUTE A PHYSICAL ADDRESS FOR BUFFERS IN THE DRIVER'S PRIVATES ; POOL FOR SYSTEMS WITHOUT UMRS.;S .IF DF K$$DAS BNE 30$ ;;;UMRS PRESENT - JUMP* BLO 20$ ;;;BUFFER IN PRIMARY POOL - JUMPE ADD RELCV+2,BFADR1(R3) ;;;ADD RELOCATION CONSTANT TO VIRTUAL ADDRESSXF MOVB RELCV,BFADR2(R3) ;;;(NOTE: RELCV MUST NOT HAVE BITS 6 AND 7 SET) ADCB BFADR2(R3) ;;; BR 40$ ;;;JOIN COMMON CODE;20$: ADD RELCV+6,BFADR1(R3) ;;;ADD POOL RELOCATION CONSTANTRB MOVB RELCV+4,BFADR2(R3) ;;;(RELCV MUST NOT HAVE BITS 6 AND 7 SET) ADCB BFADR2(R3) ;;; BR 40$ ;;;JOIN COMMON CODE.30$: BLO 40$ ;;;BUFFER IN PRIMARY POOL - JUMP .IF DF T$$SPLC SUB #20000,BFADR1(R3) ;;;FORCE BUFFER ADDRESS TO MAP THROUGH UMR 5A .ENDC ;T$$SPL .IFF ;K$$DAST .IF DF M$$EXT BNE 40$ ;;;UMRS PRESENT - JUMP .ENDC ;M$$EXT* BLO 40$ ;;;BUFFER IN PRIMARY POOL - JUMPE ADD RELCV+2,BFADR1(R3) ;;;ADD RELOCATION CONSTANT TO VIRTUAL ADDRESSAF MOVB RELCV,BFADR2(R3) ;;;(NOTE: RELCV MUST NOT HAVE BITS 6 AND 7 SET) ADCB BFADR2(R3) ;;; .ENDC ;K$$DAS(40$: MOV @R4,BFCNT(R3) ;;;SET BYTE COUNT* BR 49$ ;;;DMA TRANSFER FROM INT. BUFFER S .IF DF T$$DMA O48$: MOV R0,-(SP) ;;;SAVE R0$ MOV R4,R0 ;;;NOW R0 POINTS U.TOP+2* ADD #U.TFOB-U.TOP-2,R0;;;SET R0 TO U.TFOB MOV (R0),R0 ;;;6 CMP (R0)+,(R0)+ ;;;SET R0 AT THE BEGINNING OF BUFFER0 MOV (R0)+,BFCNT(R3) ;;;SET BYTE COUNT FOR DMA 1 MOV (R0)+,BFADR2(R3);;;SET 6 HIGH BITS OF ADDR )0 MOV (R0),BFADR1(R3);;;SET LOW 16 BITS OF ADDR  MOV (SP)+,R0 ;;;RESTORE R0 $ : .ENDC ;T$$DMA E T 49$: M/ BISB #200,BFADR2(R3) ;;;ENABLE DMA TRANSFER  ASSUME S2.CTS,100000 :,50$: TST 2(R5) ;;;OUTPUT STOPPED BY CTRL-S?% BMI 70$ ;;;YES- DON'T RESUME OUTPUTR;;; ;+; YVRESX - RESUME OUTPUT.;C; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S2.CTS 0E;-;F;D'YVRESX::CALL SELLIN ;;;SELECT THE LINEB .IF DF T$$ACD+ BIT #S2.O00=}}TADATADATADATADATADATADATADATADATABF,2(R5) ;;;DOING BUFFERED OUTPUT BNE 60$ ;;;Y - JUMPE% BIT #DHUID,STAT(R3) ;;;CHECK FOR DHU  BEQ 55$ ;;;LINE IS DHV -> 55$2 TSTB FIFOSZ(R3) ;;;IF DHU CHECK IF FIFO HAS SPACE$ BEQ 70$ ;;;NO SPACE. TRY NEXT TIME? MOVB U.ADMA-U.TSTA(R5),FIFODT(R3) ;;;INITIATE SINGLE CHAR XFERE4 BR 60$ ;;;INITIATE OUTPUT REGARDLESS OF XOFF STATEA55$: MOV U.ADMA-U.TSTA(R5),TXCHAR(R3);;;INITIATE SINGLE CHAR XFERN .ENDC ;T$$ACD560$: MOVB #200,BFADR2+1(R3) ;;;ENABLE THE TRANSMITTERD .IF NDF D$$VMD2YVMTIM:: .ENDC ;D$$VMD 70$: RETURN$;; .DSABL LSBB;#;I;+; YVABOX - ABORT OUTPUT.;Q; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;S;-;B;7YVABOX:: .IF DF T$$ACD, BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT? BEQ 10$ ;;;N - RETURN  .ENDC ;T$$ACDB BIT #S5.HPO,U.TST5-U.TSTA(R5);;;HIGH PRIORITY OUTPUT IN PROGRESS?& BNE 10$ ;;;YES - DO NOT ABORT OUTPUT5 BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT IN PROGRESS?R BNE 10$ ;;;N - JUMPD CALL SELLIN ;;;SELECT THE LINE4 BIS #1,LNCTRL(R3) ;;;ABORT THE CURRENT DMA TRANSFER= CMP (SP)+,#LOCKR ;;;REMOVE RETURN ADDRESS - WAS IT TO LOCKR?F BNE 10$ ;;;N - JUMP  MTPS #0 ;;;ALLOW INTERRUPTSX2 TST (SP)+ ;REMOVE RETURN ADDRESS TO FORK ROUTINE410$: RETURN ;RETURN WITHOUT SIGNALLING OUTPUT DONE;A;;+; YVSTOX - STOP OUTPUT.R;;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S2.CTS 1U;-;.;-'YVSTOX::CALL SELLIN ;;;SELECT THE LINE1; BICB #200,BFADR2+1(R3) ;;;CLEAR THE TRANSMITTER ENABLE BITN RETURN ;;;R;H;U .IF DF T$$GMC!T$$SMC!D$$VMD;+#; YVLPAR - GET/SET LINE PARAMETERS.L;R; INPUT:; R0 BIT 15: 0 = SET SPEED; 1 = GET SPEEDX); BIT 13: 1 = SET 7-BIT CHARACTER LENGTHK4; BIT 12: 1 = CHECK IF 7-BIT CHARACTER IS SUPPORTED;; BIT 11: 1 = SET SPEED SELECTED BY AUTO-BAUD DETECT LOGIC); BIT 10: 1 = SET DEVICE DEPENDENT SPEEDE!; (USED FOR SETTING PARITY)"; BIT 9: 1 = GET/SET ANSWER SPEED#; BIT 8: 0 = GET/SET RECEIVE SPEED ; 1 = GET/SET TRANSMIT SPEED; IF SET SPEED:/; BITS 0-7: NEW SPEED PARAMETER (S.XXX SYMBOL);V&; R1 Flow control status change flags.;U(; BIT 0: 1 = Enable input flow control.); BIT 1: 1 = Disable input flow control.R); BIT 2: 1 = Enable output flow control.R*; BIT 3: 1 = Disable output flow control.;L; BITS 4-15: Reserved;O<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;O ; OUTPUT:A; IF GET SPEED REQUESTED:E%; R4 POINTER TO DHU/DHV11 SPEED TABLEE; CC-C 0;; IF SET SPEED REQUESTED:E; CC-C 0 IF OK; 1 IF ILLEGAL SPEED SPECIFIEDM;RJ; NOTE THAT THIS ROUTINE CAN BE EXECUTED AT BOTH SYSTEM STATE (IN RESPONSEN; TO A SF.GMC OR SF.SMC QIO) AND FROM THE INPUT INTERRUPT SERVICE ROUTINE (FOR; AUTO-BAUD DETECT).;l;-;r;R; YVLPAR::) TST R1 ;Called for flow control change?  BEQ 5$ ;If EQ no - go on.R RETURN ;Not processed for DZ.5$:N .IF DF T$$GMC ! T$$SMC  G0 BIT #20000,R0 ;CHECK IF WE VALIDATE 7-BIT CHAR. BEQ 7$ ;NO  RETURN 7$:  BIT #10000,R0 ;CHECK SET 7-BITI BEQ 8$ ;NO. SET SPEED-PARITY 0 BR SETLN1 ;SET 7-BIT AND OTHER LINE PARAMETERS8$: T  .ENDC ;T$$GMC ! T$$SMCR .IF DF D$$VMD. BIT #4000,R0 ;SET SPEED FOR AUTO-BAUD DETECT? BEQ 20$ ;N - JUMP& BIT #2000,R0 ;DEVICE DEPENDENT SPEED? BNE 10$ ;Y - JUMPh! BIC #177400,R0 ;CLEAR UPPER BYTER5 MOVB SPDHV-1(R0),R0 ;GET DEVICE DEPENDENT SPEED BITSC-10$: BIC #^C<17>,R0 ;CLEAR ALL BUT SPEED BITS  MOV R0,R2 ;GET A COPYQ .IF DF R$$EIS8 ASH #4,R2 ;SHIFT SPEED BITS TO TRANSMIT SPEED POSITION .IFF ;R$$EIS-: CALL SHIFT4 ;SHIFT SPEED BITS TO TRANSMIT SPEED POSITION .ENDC ;R$$EIS& BIS R0,R2 ;ADD IN RECEIVE SPEED BITS4 MOVB R2,U.CW3-U.TSTA(R5) ;SET NEW SPEED IN DATABASE- BR SETLN1 ; AND SET NEW SPEED IN CONTROLLERP20$: ;REFERENCE LABEL .ENDC ;D$$VMD .IF DF T$$GMC&T$$SMC ! MOV R0,R4 ;SAVE INPUT PARAMETERS& SWAB R4 ;PUT FLAGS IN LOW ORDER BYTE BPL 30$ ;SET SPEED - JUMP2 .ENDC .IF DF T$$GMC00E}*} D%B11110010. MOV #SPDHV,R4 ;POINT TO DHU/DHV11 SPEED TABLE RETURN ;RETURN WITH CC-C = 0 .ENDC ;T$$GMC .IF DF T$$SMC!D$$VMDI .IF NDF T$$GMC! MOV R0,R4 ;SAVE INPUT PARAMETER ( SWAB R4 ;PUT FLAGS IN LOWER ORDER BYTE .ENDC ;NDF T$$GMC'30$: BIC #177400,R0 ;CLEAR R0 HIGH BYTEN$ MOVB SPDHV-1(R0),R2 ;GET SPEED BITS SEC ;ASSUME ERROR' BMI 40$ ;NOT A SUPPORTED SPEED - JUMPV ASRB R4 ;SET ANSWER SPEED? BEQ 50$ ;N - JUMPE .IF DF D$$VMD- BICB #17,U.CW3+1-U.TSTA(R5) ;CLEAR OLD VALUE1 BISB R2,U.CW3+1-U.TSTA(R5) ;SET NEW ANSWER SPEEDT CLC ;SHOW SUCCESS .IFF ;D$$VMD;5 SEC ;ATTEMPT TO SET ANSWER SPEED W/O MODEM SUPPORTM .ENDC ;D$$VMD 40$: RETURN;A$50$: BCS 60$ ;TRANSMIT SPEED - JUMP3 BICB #17,U.CW3-U.TSTA(R5) ;CLEAR OLD RECEIVE SPEED  BR 70$ ;JUMP TO SET NEW SPEED;960$: BICB #360,U.CW3-U.TSTA(R5) ;CLEAR OLD TRANSMIT SPEEDO .IF DF R$$EIS0 ASH #4,R2 ;SHIFT SPEED BITS TO PROPER POSITION .IFF ;R$$EISD2 CALL SHIFT4 ;SHIFT SPEED BITS TO PROPER POSITION .ENDC ;R$$EIS,70$: BISB R2,U.CW3-U.TSTA(R5) ;SET NEW SPEED! CALL LOCKI ;LOCK OUT INTERRUPTST3 MOV U.CW3-U.TSTA(R5),R2 ;;;GET NEW LINE PARAMETERSC# BR SETLIN ;;;GO AND LOAD INTO LPRS .ENDC ;DF T$$SMC!D$$VMD .ENDC ;T$$GMC!T$$SMC!D$$VMD;L;+; YVPWUP - POWER-UP.;U; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; U.STS SET UP FOR LOCAL LINE: ; US.CRW 0I ; US.DSB 0 ;-;E;O .ENABL LSBF .IF DF R$$CON8YVCONL::BIT #HF.UBM,$HFMSK ;UMRS PRESENT ON THIS SYSTEM? BEQ YVCPUP ;N - JUMP* MOV #UMR5S,R0 ;GET ADDRESS OF SAVED UMR 5$ MOV #UBMPR+<5*4>,R1 ;POINT AT UMR 5 MOV (R0)+,(R1)+ ;SET UP UMR 5 MOV (R0)+,(R1)+ ; .IF NDF T$$SPLP MOV (R0)+,(R1)+ ;SET UP UMR 6 MOV (R0)+,(R1)+ ; .ENDC ;NDF T$$SPLYVCPUP:: .IFF ;R$$CONU#YVPWUP::TST R2 ;IS THIS LINE ZERO?R BNE 30$ ;N - JUMPN .IFTF ;R$$CON MOV #40,@R3 ;SET MASTER RESETU.10$: BIT #40,@R3 ;IS RESET FUNCTION COMPLETE? BNE 10$ ;N - LOOP UNTIL DONE .IFT ;R$$CONO2 BIT #20000,@R3 ;DID INTERNAL DIAGNOSTICS SUCCEED? BEQ 20$ ;Y - JUMPD= MOVB #IE.FHE,$SCERR ;INDICATE FATAL HARDWARE ERROR ON DEVICE; RETURNR .IFTF ;R$$CON&20$: MOV #40100,@R3 ;ENABLE INTERRUPTS .IFT ;R$$CON RETURN(YVUONL::YVUPUP:: .ENDC ;R$$CON%30$: CALL LOCKI ;LOCK OUT INTERRUPTSI CALL SELLIN ;;;SELECT THE LINE3 BIS #4,LNCTRL(R3) ;;;ENABLE RECEIVER FOR THIS LINE BA BISB #US.OIU,U.STS-U.TSTA(R5) ;;;SET OUTPUT INTERRUPT UNEXPECTED F .IF DF T$$DMA 0 I( BIT #HF.QB,$HFMSK ;;;CHECK FOR Q-BUS  BEQ 33$ ;;;NO @ BIS #S5.DMA,U.TST5-U.TSTA(R5) ;;;SET BIT TELLING DHV/DHU IS DMA33$: ;;;REFERENCE LABEL ,  .ENDC ;T$$DMA $  .IF DF D$$VMD6 BIC #S5.ABP,U.TST5-U.TSTA(R5) ;;;RESET AUTO-BAUD MODE- BIT #U2.RMT,U.CW2-U.TSTA(R5) ;;;REMOTE LINE?E BEQ 40$ ;;;N - JUMP;> BISB #US.CRW,U.STS-U.TSTA(R5) ;;;SET WAITING FOR CARRIER FLAG0 MOV R3,-(SP) ;;;SAVE POSSIBLY MODIFIED REGISTER! CALL YVMTMA ;;;SET MODEM STATUS MOV (SP)+,R3 ;RESTORE REGISTER;' CALL LOCKI ;LOCK OUT INTERRUPTS AGAIN .ENDCSETLN1: ; REFERENCE LABEL=40$: MOV U.CW3-U.TSTA(R5),R2 ;;;GET NEW SPEED AND PARITY BITS 'SETLIN: CALL SELLIN ;;;SELECT THE LINED( SWAB R2 ;;;PUT SPEED BITS IN HIGH BYTE5 RORB R2 ;;;PUT PARITY ENABLE BIT IN PROPER POSITION / BICB #^C<40>,R2 ;;;CLEAR ALL BUT PARITY ENABLEU$ TST U.CW3-U.TSTA(R5) ;;;ODD PARITY? BMI 60$ ;;;Y - JUMPR' BIS #100,R2 ;;;N - SET TO EVEN PARITYR:60$: BIT #140000,R2 ;;;TRANSMIT SPEED 134.5 BAUD OR LOWER? BNE 70$ ;;;N - JUMP & BIS #200,R2 ;;;Y - SET TWO STOP BITS,70$: BIS #30,R2 ;;;SET EIGHT BIT CHARACTERS7 BIT #S5.CLN,U.TST5-U.TSTA(R5) ;;;CHECK 7-BIT CHARACTER  BEQ 75$ ;;;NO LEAVE IT 8-BIT BIC #10,R2 ;;;SET 7-BITT/75$: MOV R2,LPR(R3) ;;;LOAD NEW LINE PARAMETERST ;S;O7; WHEN RETURNING VIA COROUTINE "LOCKI", CC-C IS CLEAREDT;C RETURN ;RETURND .DSABL LSB6 .IF DF R$$CONYVCOFF::! CALL LOCKI ;LOCK OUT INTERRUPTSB! M00M}}TADATADATADATADATADATADATADATADATAOV #40,@R3 ;;;SET MASTER RESET. RETURN YVUOFF::! CALL LOCKI ;LOCK OUT INTERRUPTS CALL SELLIN ;;;SELECT THE LINE@ BIC #11004,LNCTRL(R3) ;;;DROP DTR, RTS AND DISABLE THE RECEIVER RETURN ;;;DROP PRIORITY .ENDC ;R$$CON; ;8;+"; INPUT INTERRUPT SERVICE ROUTINE.;-;P;31 DS.CHG = 70000 ;DATASET STATUS CHANGE CONDITION .ENABL LSBV;C .IF DF R$$MPL-$YVINP::TTSET$ YV ;;;SAVE R2, R3 AND SET UP:B ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS .IFF ;R$$MPLT+$DVINP::TTSET$ DV ;;;SAVE R2,R3 AND SET UP  ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST .IFTF ;R$$MPL410$: MOV RBUF(R3),R5 ;;;GET NEXT CHARACTER FROM SILO! BPL 70$ ;;;SILO IS EMPTY - JUMPD MOV R5,-(SP) ;;;SAVE CHARACTER( SWAB R5 ;;;GET LINE NUMBER IN LOW BYTE CALL MUXUCB ;;;GET UCB IN R5' MOV (SP)+,R2 ;;;RETRIEVE CHAR + STATUS.( BCS 10$ ;;;BAD LINE - IGNORE CHARACTER0 MOV R2,-(SP) ;;;CHECK FOR DATASET STATUS CHANGE0 BIC #^C,@SP ;;;CLEAR ALL BUT ERROR BITS, CMP #DS.CHG,(SP)+ ;;;DATASET STATUS CHANGE? BEQ 20$ ;;;Y - JUMP3 .IFF ;R$$MPL4! MOV R3,-(SP) ;;;SAVE CSR ADDRESSM .IFTF ;R$$MPL% MOV R4,-(SP) ;;;SAVE KRB/UCB ADDRESS5 CALL ICHAR1 ;;;DO COMMON INPUT INTERRUPT PROCESSINGV( MOV (SP)+,R4 ;;;RESTORE KRB/UCB ADDRESS .IFF ;R$$MPLL MOV (SP)+,R3 ;;;RESTORE CSR .IFT ;R$$MPLI# MOV @R4,R3 ;;;RESTORE CSR ADDRESSN .ENDC ;R$$MPL6 BR 10$ ;;;TRY TO GET ANOTHER CHARACTER FROM THE SILO;CQ; WE ARE HERE BECAUSE FRAMING ERROR, DATA OVERRUN AND PARITY ERROR BITS WERE SET,GN; WHICH MEANS THAT EITHER A DATASET STATUS CHANGE HAS OCCURRED OR A DIAGNOSTIC; MESSAGE HAS BEEN RECEIVEDR;(&20$: BIT #1,R2 ;;;DIAGNOSTIC MESSAGE? BNE 10$ ;;;Y - IGNORET .IF DF D$$VMD;V; PROCESS MODEM STATUS CHANGED;S MOV R4,-(SP) ;;;SAVE R4: MOV #100000,R4 ;;;SHOW THAT INTERFACE SUPPORTS DSR SIGNAL% BIT #10,R2 ;;;IS CLEAR TO SEND SET?L BEQ 30$ ;;;N - JUMPG( BIS #100,R4 ;;;Y - SET APPROPRIATE BIT*30$: BIT #20,R2 ;;;IS CARRIER DETECT SET? BEQ 40$ ;;;N - JUMPT' BIS #40,R4 ;;;Y - SET APPROPRIATE BIT 40$: BIT #40,R2 ;;;IS RING SET? BEQ 50$ ;;;N - JUMPS( BIS #200,R4 ;;;Y - SET APPROPRIATE BIT50$: TSTB R2 ;;;IS DSR SETE BPL 53$ ;;;N - JUMP) BIS #40000,R4 ;;;Y - SET APPROPRIATE BITS+53$: CALL SELLIN ;;;SETUP THE CORRECT LINE#5 CALL MODISR ;;;DO COMMON MODEM INTERRUPT PROCESSINGB, BVC 57$ ;;;NO SPECIAL ACTION NEEDED - JUMP BCS 55$ ;;;DROP DTR - JUMP+ BIS #11000,LNCTRL(R3) ;;;RAISE DTR AND RTS;+ BR 65$ ;;;AND TRY TO SERVICE ANOTHER LINEM.55$: BIC #11000,LNCTRL(R3) ;;;DROP DTR AND RTS(57$: BCS 65$ ;;;NO CALL ANSWERED - JUMP/ MOVB U.CW3+1-U.TSTA(R5),R2 ;;;GET ANSWER SPEEDE- BICB #^C<17>,R2 ;;;CLEAR ALL BUT SPEED FIELD;> MOVB R2,U.CW3-U.TSTA(R5) ;;;SET NEW RECEIVE SPEED IN DATABASE .IF DF R$$EIS0 ASH #4,R2 ;;;SET TRANSMIT SPEED = ANSWER SPEED .IFF ;R$$EISS2 CALL SHIFT4 ;;;SET TRANSMIT SPEED = ANSWER SPEED .ENDC ;R$$EIS? BISB R2,U.CW3-U.TSTA(R5) ;;;SET NEW TRANSMIT SPEED IN DATABASE;9 MOV U.CW3-U.TSTA(R5),R2 ;;;GET NEW SPEED AND PARITY BITS) ASSUME S4.ABD,1000007. TST 6(R5) ;;;AUTO-BAUD SPEED DETECT ENABLED? BPL 60$ ;;;N - JUMPG* MOV #273,R2 ;;;Y - SET LINE TO 4800 BAUD(60$: CALL SETLIN ;;;SET LINE PARAMETERS65$: MOV (SP)+,R4 ;;;RESTORE R4  .ENDC ;D$$VMD6 BR 10$ ;;;TRY TO GET A CHARACTER FROM THE INPUT SILO;<; SILO IS NOW EMPTY. SEE IF CONTROLLER IS READY TO TRANSMIT;S#70$: MOV @R3,R5 ;;;XMIT READY SET?C" BMI 75$ ;;;Y - GO DO OUTPUT WORK RETURN ;;;RETURNV;C;U;+#; OUTPUT INTERRUPT SERVICE ROUTINE.B;-;A;M .IF DF R$$MPL-$YVOUT::TTSET$ YV ;;;SAVE R2, R3 AND SET UP:B ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS .IFF ;R$$MPL:+$DVOUT::TTSET$ DV ;;;SAVE R2,R3 AND SET UP( ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST .ENDC ;R$$MPL7 MOV @R3,R5 ;;;GET INTERRUPTING LINE NUMBER AND STATUS * BPL 10$ ;;;CHECK THAT THERE IS AN ACTION)75$: MOV R4,-(SP) ;;;SAVE KRB/UCB ADDRESS =80$: MOV R5,-(SP) ;;;SAVE INTERRUPTING LINE NUMBER AND S00U}*} D%B11110010TATUSU( SWAB R5 ;;;GET LINE NUMBER IN LOW BYTE CALL MUXUCB ;;;GET UCB IN R5) MOV (SP)+,R2 ;;;RETRIEVE TRANSMIT STATUS  BCS 130$ ;;;BAD LINE - IGNORE= .IF DF R$$CON* BITB #US.OFL,U.ST2-U.TSTA(R5) ;;;OFFLINE? BNE 130$ ;;;Y - JUMP .ENDC ;R$$CON .IF DF T$$SPL+ MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;;;MAP UCBX . MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPLR$ MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX .ENDC ;T$$SPL ; C; WE'RE HERE BECAUSE AN OUTPUT REQUEST HAS COMPLETED OR WAS ABORTEDN ; 2 CALL SELLIN ;;;SELECT THE LINE THAT INTERRUPTED ; H; TO MAKE LATER ERROR CHECKING EASIER, MERGE THE DMA ABORT BIT (BIT 0 OF8; THE LNCTRL CSR) WITH THE DMA ERROR BIT (ALREADY IN R2); + ASL R2 ;;;SHIFT A ZERO INTO THE LOW-ORDER2 BISB LNCTRL(R3),R2 ;;;COMBINE ERROR BITS TOGETHER7 BIC #1,LNCTRL(R3) ;;;RESET ABORT BIT FOR NEXT TRANSFERR;N; CHECK IF XOFF/XON SHOULD BE OUTPUT NOW (POSSIBLY BETWEEN QIO OUTPUT BUFFERS);E4 BIC #100000,R2 ;;;ASSUME DON'T NEED XOFF/XON OUTPUTE BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;ANY HIGH PRIORITY REQUEST PENDING?  BEQ 85$ ;;;N - JUMP * CALL STAXH ;;;START HIGH PRIORITY OUTPUT, BIS #100000,R2 ;;;REMEMBER THAT WE DID THIS;R+; PROCESS ANY ERRORS FROM PREVIOUS TRANSFER ;O%85$: MOV R3,-(SP) ;;;SAVE CSR ADDRESSR+ ASR R2 ;;;DID WE ABORT PREVIOUS TRANSFER?T BCS 110$ ;;;Y - JUMP= BIT #10000,R2 ;;;DID THE CONTROLLER ABORT PREVIOUS TRANSFER?N BEQ 90$ ;;;N - JUMPO6 MOVB #1,U.TOTI(R4) ;;;SET TIMER TO EXPIRE IN 1 SECOND/ BR 120$ ;;;WAIT UNTIL THEN TO COMPLETE OUTPUT);;; DETERMINE WHAT TO DO NEXTD;?290$: TST R2 ;;;DID WE JUST START XOFF/XON OUTPUT?- BMI 120$ ;;;Y - DON'T START ANY MORE OUTPUT B BITB #US.OIU,U.STS-U.TSTA(R5) ;;;ANY QIO (OR ACD) OUTPUT PENDING? BNE 120$ ;;;N - JUMP ; K; WE HAVE NO OUTPUT IN PROGRESS BUT HAVE QIO OUTPUT TO DO. DETERMINE IF WEPP; SHOULD START IT FROM THE BEGINNING (S5.HPO SET) OR CONTINUE IT (S5.HPO CLEAR) ;M; BIT #S5.HPO,U.TST5-U.TSTA(R5) ;;;JUST STARTING QIO OUTPUT?B BEQ 95$ ;;;N - JUMPH4 CALL STAXN ;;;BEGIN QIO OUTPUT DELAYED BY XOFF/XON0 BR 120$ ;;;CLEAR S5.HPO AND GO ON TO NEXT LINE;TE; POSSIBLY CONTINUE (IF MORE BUFFERS OR CHARACTERS) QIO OR ACD OUTPUTT;.95$: ;;;REFERENCE LABEL .IF DF T$$ACD, BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT? BNE 100$ ;;;Y - JUMP ADD #U.TOC,R4 ;;;POINT TO U.TOC% DEC @R4 ;;;ANYTHING LEFT TO OUTPUT?I BEQ 110$ ;;;N - JUMP) CALL STAXM ;;;INITIATE ANOTHER TRANSFERT4 BR 120$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETED .ENDC ;T$$ACD)100$: ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+2F .IF DF T$$DMA S8 BIT #S5.DWA,U.TST5-U.TSTA(R5);;;CHECK IO.WAL COMPLETION BNE 110$ ;;;YES  .ENDC ;T$$DMA;104$: CALL NXTOB ;;;GET NEXT OUTPUT BUFFER IF THERE IS ONET BEQ 110$ ;;;N - JUMP;R5; WE GOT ANOTHER OUTPUT BUFFER - START OUTPUTTING IT.O;  TST -(R4) ;;;POINT TO U.TOP+2E MOV (SP)+,R3 ;;;GET CSR ADDRESS CALL STAX1 ;;;START OUTPUT0 BR 122$ ;;;CLEAR S5.HPO AND GO ON TO NEXT LINE110$: A BIC #S5.DWA,U.TST5-U.TSTA(R5);;;CLEAR DMA IO.WAL IN PROGRESS BITT) CALL ODONE ;;;DO OUTPUT DONE PROCESSINGT)120$: MOV (SP)+,R3 ;;;RESTORE CSR POINTEROE122$: BIC #S5.HPO,U.TST5-U.TSTA(R5) ;;;NO XOFF/XON OUTPUT IN PROGRESSG;N; *; SEE IF ANY OTHER LINE COMPLETED TRANSMIT;;-130$: MOV (SP),R4 ;;;RESTORE KRB/UCB ADDRESSS MOV @R3,R5 ;;;XMIT READY SET?R% BMI 80$ ;;;Y - DO IT ALL OVER AGAIN  TST (SP)+ ;;;CLEAN STACK- JMP 10$ ;;;SEE IF ANY MORE INPUT WORK TO DO ; .DSABL LSB ;E;1;  .IF NDF R$$EIST;SH; SUBROUTINE TO SHIFT R2 4 BIT POSITIONS TO THE LEFT FOR NON-EIS SYSTEMS;OSHIFT4: ASL R2 ;SHIFT ONCE; ASL R2 ;TWICEN ASL R2 ;THRICE ASL R2 ;LAST TIME5 RETURNO .ENDC ;NDF R$$EIS;(; SUBROUTINE TO SELECT LINE ON DHU/DHV11;N;T9SELLIN: MOV #40100,-(SP) ;;;INCLUDE INTERRUPT ENABLE BITS@5 BISB U.UNIT-U.TSTA(R5),(SP) ;;;GET THE LINE NUMBERO! MOV (SP)+,@R3 ;;;SELECT THE LINEA RETURN ;;;; .IF DF D$$VMD;W; ;+; YVMTIM - MODEM TIME-00]}x_}TADATADATADATADATADATADATADATADATAOUT1;-;;F .ENABL LSB(YVMTIM::CALL LOCKI ;LOCK OUT INTERRUPTS CALL SELLIN ;;;SELECT THE LINE0 BIT #U2.RMT,U.CW2-U.TSTA(R5) ;;;IS LINE REMOTE? BNE 10$ ;;;Y - JUMPL. BIC #400,LNCTRL(R3) ;;;SET LINK TYPE TO LOCAL! BR 20$ ;;;PROCESS MODEM TIMEOUT @YVMTMA: CALL LOCKI ;LOCK OUT INTERRUPTS (LINE ALREADY SELECTED)310$: BIS #400,LNCTRL(R3) ;;;SET LINK TYPE TO REMOTE 820$: CALL HLMTIM ;;;DO COMMON MODEM TIME-OUT PROCESSING/ BEQ 30$ ;;;IF EQ Z-BIT SET - DROP DTR AND RTST, BIS #11000,LNCTRL(R3) ;;;ASSERT DTR AND RTS RETURN ;;;A.30$: BIC #11000,LNCTRL(R3) ;;;DROP DTR AND RTS RETURN ;;;E .DSABL LSBU .ENDC ;D$$VMD .ENDC ;D$$V11 .END;;Y - JUMPL. BIC #400,LNCTRL(R3) ;;;SET LINK TYPE TO LOCAL! BR 20$ ;;;PROCESS MODEM TIMEOUT @YVMTMA: CALL LOCKI ;LOCK OUT INTERRUPTS (LINE ALREADY SELECTED)310$: BIS #400,LNCTRL(R3) ;;;SET LINK TYPE TO REMOTE 820$: CALL HLMTIM ;;;DO COMMON MODEM TIME-OUT PROCESSING/ BEQ 30$ ;;;IF EQ Z-BIT SET - DROP DTR AND RTST, BIS #11000,LN .TITLE TTYJ .IDENT /V4.00/B;06; COPYRIGHT (c) 1983 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;T<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;N;;; 27-JAN-78 PETER WANNHEDENS;C; PREVIOUSLY MODIFIED BY: ;N; P. WANNHEDEN ; C. F. SPITZM; D. R. DONCHIN);;; MODIFICATIONS:;L .PSECT MAP5;M;+*; CONTROLLER-DEPENDENT ROUTINES FOR DJ-11.;-;-;O T .IF DF D$$J11 ,; EQUATED SYMBOLSL;T; DJ-11 REGISTER DEFINITIONS;I!CSR = 0 ;CONTROL AND STATUS REG.ORBUF = 2 ;RECEIVER BUFFER REG..TCR = 4 ;TRANSMIT CONTROL REG.D"TBUF = 6 ;TRANSMITTER BUFFER REG.;C;E;+; YJPWUP - POWER UP.; ; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; U.STS SET UP FOR LOCAL LINE: ; US.CRW 0. ; US.DSB 0 ;-;O;I .IF DF R$$CONYJCONL::YJCPUP:: .IFF#YJPWUP::TST R2 ;IS THIS LINE ZERO?  BNE 20$ ;N - RETURN .IFTF, MOV #10,@R3 ;CLEAR SILO, UARTS, CONTROLLER!10$: BIT #20,@R3 ;CLR COMPLETED?O BNE 10$ ;N - WAITB" BIS #40501,@R3 ;ENABLE INTERRUPTS .IFTNYJUONL::YJUPUP::YJUOFF:: .ENDC ;R$$CON20$:YJMTIM::RETURN ;RETURN .IF DF R$$CONYJCOFF::, MOV #10,@R3 ;CLEAR SILO, UARTS, CONTROLLER!10$: BIT #20,@R3 ;CLR COMPLETED?: BNE 10$ ;N - LOOP. RETURN- .ENDC ;R$$CON;C;;+"; INPUT INTERRUPT SERVICE ROUTINE.;-;2;I .ENABL LSBE;  B .IF DF R$$MPL -$YJINP::TTSET$ YJ ;;;SAVE R2, R3 AND SET UP:  ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS $ .IFF ;R$$MPLB #+$DJINP::TTSET$ DJ ;;;SAVE R2,R3 AND SET UPO ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST T .ENDC ;R$$MPL N, CALL MUXINP ;;;DO COMMON MULTIPLEXER INPUT ;;;CHARACTER PROCESSINGR3 ;;;MUXINP DISMISSES INTERRUPT IF NO OUTPUT WORKL* BR 10$ ;;;XMIT READY - GO DO OUTPUT WORK;;N;+#; OUTPUT INTERRUPT SERVICE ROUTINE.I;-;B;S  .IF DF R$$MPL M-$YJOUT::TTSET$ YJ ;;;SAVE R2, R3 AND SET UP:E ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS E .IFF ;R$$MPLR P+$DJOUT::TTSET$ DJ ;;;SAVE R2,R3 AND SET UPS ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST I .ENDC ;R$$MPL M10$: MOV R3,-(SP) ;;;;, ADD #TBUF+1,@SP ;;;POINT TO BYTE CONTAINING0 ;;;INTERRUPTING LINE NUMBER (TBUF HIGH BYTE). CALL JZOUT ;;;DO OUTPUT INTERRUPT PROCESSING! ;;;COMMON FOR DJ-11 AND DJ-11I TST (SP)+ ;;;CLEAN STACK;;;+; YJABOX - ABORT OUTPUT.;T; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; U.TOC 0 ; U.TTOC 0;F; YJSTOX - STOP OUTPUT.T;$; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S1.CTS 1I;-;C;$YJABOX::YJSTOX::RETURN ;;;RETURN;B .DSABL LSBO  .ENDC ;D$$J11 ; ;I .ENDTING LINE NUMBER (TBUF HIGH BYTE). CALL JZOUT ;;;DO OUTPUT INTERRUPT PROCESSING! ;;;COMMON FOR DJ-11 AND DJ-11I TST (SP)+ ;;;CLEAN STACK;;;+; YJABOX - ABORT OUTPUT.;T; INPUT:<; REGISTERS R2-R00e}*} D%B11110010 .TITLE TTYL .IDENT /06.00/;T6; COPYRIGHT (c) 1988 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;B<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;C; ; 27-JAN-78 PETER WANNHEDENL;I; PREVIOUSLY MODIFIED BY:E;R; P. WANNHEDEN ; C. F. SPITZN; D. R. DONCHINI ; T. LEKAS;T;$; MODIFIED FOR RSX-11M-PLUS V4.1 BY:;-; ; L. KOGAN 20JAN-88 06.00 ;Z"; LK731 -- CLEAR DSR SUPPORT BITS;0;N;+*; CONTROLLER-DEPENDENT ROUTINES FOR DL-11.;-;9;B I> .IIF DF R$$PRO .IIF NDF D$$C11 .ERROR ;R$$PRO REQUIRES D$$C11 .IF DF D$$L11 U R .IF DF R$$MPL B .MCALL KRBDF$  KRBDF$ ;DEFINE KRB SYMBOLSM F .ENDC ;R$$MPL  .MCALL HWDDF$,UCBDF$A" HWDDF$ ;DEFINE HARDWARE SYMBOLS UCBDF$ ;DEFINE UCB SYMBOLSF .PSECT MAP5;O;I; EQUATED SYMBOLS;; DL-11 REGISTER DEFINITIONS;BRCSR = 0 ;RECEIVER STATUS REG.6$RBUF = 2 ;RECEIVER DATA BUFFER REG."XCSR = 4 ;TRANSMITTER STATUS REG.'XBUF = 6 ;TRANSMITTER DATA BUFFER REG.I;2; PROFESSIONAL 300 SERIES PRINTER PORT DEFINITIONS; .PDBUF = 173400 ;RECEIVER DATA BUFFER REGISTERPSTS = 173402 ;STATUS REGISTER PMODE = 173404 ;MODE REGISTER!PCMND = 173406 ;COMMAND REGISTERF;:; PROFESSIONAL 300 SERIES INTERRUPT CONTROLLER DEFINITIONS;L4ICCSR = 173202 ;INTERRUPT CONTROLLER 0 CSR REGISTER5PRINTR = 5 ;PRINTER RECEIVER INTERRUPT REQUEST LEVELT8PXINTR = 6 ;PRINTER TRANSMITTER INTERRUPT REQUEST LEVEL*CLSIMR = 50 ;CLEAR SINGLE IMR BIT COMMAND)STSIRR = 130 ;SET SINGLE IRR BIT COMMAND3;S;E;+; YLRESX - RESUME OUTPUT.;U; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S1.CTS 0 ;-; ;D6YLRESX::BIS #100,XCSR(R3) ;;;SET XMIT INTERRUPT ENABLE .IF DF R$$PRO;ND; FOR THE PROFESSIONAL 300 SERIES MACHINES BOTH METHODS OF EFFECTINGE; THE INTERRUPT ENABLE BITS ARE LEFT IN PLACE SO THAT THE SYSTEM WILLEC; WORK ON BOTH THE REAL HARDWARE AND THE BRIDGE SYSTEM. THE BRIDGE=D; SYSTEM CONSISTS OF AN 11/23-PLUS SYSTEM WITH AN INTERFACE ON IT TO; THE CTI BUS.;+A; ON THE REAL HARDWARE THE BIS #100... IS IGNORED. ON THE BRIDGEAF; SYSTEM THE FOLLOWING TWO INSTRUCTIONS ARE IGNORED BECAUSE THEY WRITE; INTO THE BOOT ROMS;X6 MOV #CLSIMR!PXINTR,ICCSR ;;;SET XMIT INTERRUPT ENABLE ;;;FOR PRINTER PORTB MOV #STSIRR!PXINTR,ICCSR ;;;CAUSE ANY PENDING INTERRUPTS TO OCCUR .ENDC ;R$$PRO;M;L;+; YLABOX - ABORT OUTPUT.;A; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; U.TOC 0 ; U.TTOC 0C;N!; YLSTOX - STOP (SUSPEND) OUTPUT.E;A; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S1.CTS 1S;-;N;RYLABOX::YLSTOX:: W .IF NDF D$$LMDB YLMTIM:: M .ENDC ;D$$LMD C RETURN ;;; ;E;P;+; YLPWUP - POWER-UP.;N; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; U.STS SET UP FOR LOCAL LINE: ; US.CRW 0X ; US.DSB 0U;-;;N .ENABL LSBT .IF DF R$$CONYLCONL::6YLCPUP::SEC ;SET CARRY BIT FOR CONTROLLER OPERATIONSYLUONL::YLUPUP:: .IFFTYLPWUP:: .ENDC ;R$$CON MOVB RBUF(R3),R0 ;EMPTY RBUFE N .IF DF D$$LMD S4 BIS #140,@R3 ;ENABLE DATASET AND RECEIVE INTERRUPTS B .IFF ;D$$LMD ( BIS #100,@R3 ;ENABLE RECEIVE INTERRUPTS .IF DF R$$PRO6 MOV #CLSIMR!PRINTR,ICCSR ;;;ENABLE RECEIVE INTERRUPTS ;;;FOR PRINTER PORT .ENDC ;R$$PRO RETURN ;RETURN  .IFT ;D$$LMD- 6 BCS 10$ ;RETURN IF PERFORMING A CONTROLLER OPERATION+ BIT #U2.RMT,U.CW2-U.TSTA(R5) ;REMOTE LINE?O BEQ 10$ ;N - RETURN< BISB #US.CRW,U.STS-U.TSTA(R5) ;SET WAITING FOR CARRIER FLAG;Y;U;+; YLMTIM - MODEM TIMER.B;#; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-;0;R(YLMTIM::CALL LOCKI ;LOCK OUT INTERRUPTS0 CALL HLMTIM ;;;CALL COMMON MODEM TIMER ROUTINE& BEQ 5$ ;;;IF EQ Z-BIT SET - DROP DTR# BISB #6,@R3 ;;;ASSERT DTR AND RTST RETURN ;;; 65$: BICB #17,@R3 ;;;CLEAR DTR, RTS, R00m}s}TADATADATADATADATADATADATADATADATAEADER ENABLE AND ;;;SECONDARY XMITR/10$: RETURN ;;;RETURN TO COROUTINE THAT HANGS- ;;;UP LINE IF NECESSARY- S .IFTF ;D$$LMD  .IF DF R$$CONYLCOFF::YLUOFF:: CLR @R3 ;DISABLE THE WORLD8 .IIF DF R$$PRO .ERROR ;R$$CON SHOULD NOT BE DEFINED FOR ;PRO 300 SERIES MACHINES RETURN  .ENDC ;R$$CON;L;M;+"; INPUT INTERRUPT SERVICE ROUTINE.;-;;;F  .IF DF R$$MPL R$YLINP::& TTSET$ YL ;;;SAVE R2, R3 AND SET UP: ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS$ MOV K.OWN(R4),R5 ;;;GET UCB ADDRESS R .IFF ;R$$MPLO R$DLINP:: .IF EQ D$$L11-1& CLR R4 ;;;SET UP DL CONTROLLER INDEX .ENDC$ TTSET$ DL ;;;SAVE R2,R3 AND SET UP ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST S MOV (R4),R5 ;;;GET UCB ADDRESS 0 .ENDC ;R$$MPL R" ADD #U.TSTA,R5 ;;;POINT TO U.TSTA .IFT ;D$$LMDP E% MOV @R3,R2 ;;;SAVE INTERRUPT STATUS ( BPL 20$ ;;;NO DATASET INTERRUPT - JUMP MOV R2,R4 ;;;GET A COPY;" ASL R4 ;;;GET RING BIT IN BIT 15 SWAB R4 ;;;GET IT IN BIT 7, BIC #140000,R4 ;;;DL11 DOES NOT SUPPORT DSR4 MOV R2,-(SP) ;;;SAVE R2 DESTROYED BY MODISR ROUTINE& CALL MODISR ;;;CALL COMMON MODEM ISR, BVC 16$ ;;;NO SPECIAL ACTION NEEDED - JUMP BCS 15$ ;;;DROP DTR - JUMP# BISB #6,@R3 ;;;ENABLE DTR AND RTS4 BR 16$ ;;;AND LOOK IF FURTHER PROCESSING IS NEEDED&15$: BICB #6,@R3 ;;;CLEAR DTR AND RTS16$: MOV (SP)+,R2 ;;;RESTORE R2L$20$: TSTB R2 ;;;RECEIVER INTERRUPT? BPL 10$ ;;;N - EXITP  .ENDC ;D$$LMD G .IF DF R$$PRO ASSUME H2.BRG,100000T- TST $HFMSK+2 ;;;IS THIS A PRO BRIDGE SYSTEM?R BMI 30$ ;;;IF NE YES' MOV PDBUF,R2 ;;;GET RECEIVED CHARACTERI BR 40$ ;;;AND CONTINUE .IFTF ;R$$PRO.30$: MOV RBUF(R3),R2 ;;;GET RECEIVED CHARACTER .IFT ;R$$PRO 40$: ;;;REFERENCE LABEL .ENDC ;R$$PRO+ CALLR ICHAR1 ;;;DO COMMON INPUT CHARACTER  ;;;PROCESSING AND RETURN;: .DSABL LSB ;R;O;+"; OUTPUT INTERRUPT SERVICE ROUTINE;-;B;1  .IF DF R$$MPL .$YLOUT::& TTSET$ YL ;;;SAVE R2, R3 AND SET UP: ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS$ MOV K.OWN(R4),R5 ;;;GET UCB ADDRESS .IFF ;R$$MPL  R$DLOUT:: .IF EQ D$$L11-1& CLR R4 ;;;SET UP DL CONTROLLER INDEX .ENDC$ TTSET$ DL ;;;SAVE R2,R3 AND SET UP ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST I MOV (R4),R5 ;;;GET UCB ADDRESS  .ENDC ;R$$MPL N" ADD #U.TSTA,R5 ;;;POINT TO U.TSTA;;U;+; YLSTAX - START OUTPUT.;-; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; U.TOP+2 BUFFER POINTERC; U.TOC BYTE COUNT4;-;A;E6YLSTAX::MOV #100,R2 ;;;GET BITMASK FOR XMIT INTERRUPT) BIS R2,XCSR(R3) ;;;ENABLE XMIT INTERRUPTC .IF DF R$$PROC MOV #CLSIMR!PXINTR,ICCSR ;;;ENABLE XMIT INTERRUPT FOR PRINTER PORT  .ENDC ;R$$PRO7 CALLR OUTISR ;;;DO COMMON OUTPUT INTERRUPT PROCESSINGB D .ENDC ;D$$L11 $;L;N .END#U.TSTA,R5 ;;;POINT TO U.TSTA;;U;+; YLSTAX - START OUTPUT.;-; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPEND .TITLE TTYZ .IDENT /06.01/E;T5; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATIONS; ALL RIGHTS RESERVED.;#<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;S;L; 27-JAN-78 PETER WANNHEDEN;.; PREVIOUSLY MODIFIED BY:T;L; P. WANNHEDEN ; C. F. SPITZ,; D. R. DONCHIN ; S. C. ADAMSE ; T. LEKAS;;; MODIFICATION HISTORY:;N; L. KOGAN 18-JUN-86 6.01.2; LK710 -- INCLUDE 7-BIT CHARACTER LENGTH SUPPORT;.;L .PSECT MAP5;.;+*; CONTROLLER-DEPENDENT ROUTINES FOR DZ-11.;-;P;T S .IF DF D$$Z11 R; EQUATED SYMBOLSF;R; DZ-11 REGISTER DEFINITIONS;D!CSR = 0 ;CONTROL AND STATUS REG.C+RBUF = 2 ;RECEIVER BUFFER REG. (READ-ONLY)*LPR = 2 ;LINE PARAMETER REG. (WRITE-ONLY)TCR = 4 ;TRANSMIT CONTROL REG.N'MSR = 6 ;MODEM STATUS REG. (READ-ONLY)/TBUF = 6 ;TRANSMITTER BUFFER REG. (WRITE-ONLY)S;Y; .ENABL LSB- - .IF DF T$$GMC!T$$SMC!D$$ZMD I;+#; YZLPAR - GET/SET L00u}*} D%B11110010INE PARAMETERS.S; ; INPUT:; R0 BIT 15: 0 = SET SPEED; 1 = GET SPEED); BIT 13: 1 = SET 7-BIT CHARACTER LENGTHE4; BIT 12: 1 = CHECK IF 7-BIT CHARACTER IS SUPPORTED;; BIT 11: 1 = SET SPEED SELECTED BY AUTO-BAUD DETECT LOGICG); BIT 10: 1 = SET DEVICE DEPENDENT SPEEDG!; (USED FOR SETTING PARITY)C"; BIT 9: 1 = GET/SET ANSWER SPEED; IF SET SPEED:/; BITS 0-7: NEW SPEED PARAMETER (S.XXX SYMBOL)S;Y&; R1 Flow control status change flags.;T(; BIT 0: 1 = Enable input flow control.); BIT 1: 1 = Disable input flow control.:); BIT 2: 1 = Enable output flow control.1*; BIT 3: 1 = Disable output flow control.;1; BITS 4-15: Reserved; <; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;C ; OUTPUT: ; IF GET SPEED REQUESTED:E ; R4 POINTER TO DZ11 SPEED TABLE; CC-C 0;C; IF SET SPEED REQUESTED:W; CC-C 0 IF OK; 1 IF ILLEGAL SPEED SPECIFIEDD;RJ; NOTE THAT THIS ROUTINE CAN BE EXECUTED AT BOTH SYSTEM STATE (IN RESPONSEN; TO A SF.GMC OR SF.SMC QIO) AND FROM THE INPUT INTERRUPT SERVICE ROUTINE (FOR; AUTO-BAUD SPEED DETECT).;l;-;r;1YZLPAR:: .IF DF D$$ZMD!T$$GMC!T$$SMC) TST R1 ;Called for flow control change?R BEQ 5$ ;If EQ no - go on.E RETURN ;Not processed for DZ.5$: 0 BIT #20000,R0 ;CHECK IF WE VALIDATE 7-BIT CHAR. BEQ 7$ ;NO RETURN 7$:T BIT #10000,R0 ;CHECK SET 7-BITK BEQ 8$ ;NO. SET SPEED-PARITY0 BR SETLN1 ;SET 7-BIT AND OTHER LINE PARAMETERS8$:H. BIT #4000,R0 ;SET SPEED FOR AUTO-BAUD DETECT? BEQ 10$ ;N - JUMPU* BIT #2000,R0 ;SET DEVICE DEPENDENT SPEED? BEQ 20$ ;N - JUMP- BIC #^C<17>,R0 ;CLEAR ALL BUT NEW SPEED BITS$ BR 40$ ;SET NEW SPEEDf10$: ;REFERENCE LABEL .ENDC ;D$$ZMD!T$$GMC!T$$SMC  .IF DF T$$GMC&T$$SMC. $ TST R0 ;GET OR SET SPEED?F BPL 20$ ;SET - JUMP. B .ENDC ;T$$GMC&T$$SMC$  .IF DF T$$GMC C( MOV #SPDZ,R4 ;POINT TO DZ11 SPEED TABLE RETURN ;RETURN WITH CC-C = 0H L .ENDC ;T$$GMC H .IF DF T$$SMC!D$$ZMDT E&20$: MOV R0,R4 ;COPY SPEED PARAMETERS! BIC #177400,R0 ;CLEAR UPPER BYTEE# MOVB SPDZ-1(R0),R0 ;GET SPEED BITS SEC ;ASSUME ERROR BMI 30$ ;ILLEGAL SPEED - JUMP BIT #1000,R4 ;SET ANSWER SPEED? BEQ 40$ ;N - JUMP$ .IF DF D$$ZMD4 BICB #17,U.CW3+1-U.TSTA(R5) ;CLEAR OLD ANSWER SPEED1 BISB R0,U.CW3+1-U.TSTA(R5) ;SET NEW ANSWER SPEEDC CLC ;SHOW SUCCESS .ENDC ;D$$ZMD 30$: RETURNT440$: MOVB R0,U.CW3-U.TSTA(R5) ;SET NEW RECEIVE SPEED .IF DF R$$EIS2 ASH #4,R0 ;SHIFT BITS TO TRANSMIT SPEED POSITION .IFF ;R$$EISS/ ASL R0 ;SHIFT BITS TO TRANSMIT SPEED POSITIONR ASL R0 ; ASL R0 ; ASL R0 ; .ENDC ;R$$EIS1 BISB R0,U.CW3-U.TSTA(R5) ;SET NEW TRANSMIT SPEEDP ? .ENDC ;T$$SMC!D$$ZMD . .ENDC ;T$$GMC!T$$SMC!D$$ZMD ->SETLN1: MOV U.CW3-U.TSTA(R5),R2 ;GET NEW SPEED AND PARITY BITS5SETLIN: BIC #^C<140017>,R2 ;CLEAR EXTRANEOUS NONSENSE;) CMPB R2,#2 ;IS SPEED 110 BAUD OR LOWER?U BGT 50$ ;N - JUMPC% BIS #20000,R2 ;Y - SET TWO STOP BITS,*50$: SWAB R2 ;PUT BITS IN PROPER POSITION9 BIS #10030,R2 ;SET 8 BIT CHARACTERS AND TURN RECEIVER ONP+ BISB U.UNIT-U.TSTA(R5),R2 ;SET LINE NUMBER8 BIT #S5.CLN,U.TST5-U.TSTA(R5) ;;;CHECK 7-BIT CHARACTERS BEQ 75$ ;;;NO LEAVE IT 8-BIT BIC #10,R2 ;;;SET 7-BITC/75$: MOV R2,LPR(R3) ;;;LOAD NEW LINE PARAMETERSR CLC ;SHOW SUCCESS RETURN;L; ;+; YZPWUP - POWER UP.;R; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; U.STS SET UP FOR LOCAL LINE: ; US.CRW 0B ; US.DSB 0A;-;P;B .IF DF R$$CONYZCONL::YZCPUP:: .IFF #YZPWUP::TST R2 ;IS THIS LINE ZERO?  BNE 70$ ;N - JUMP; .IFTF0 MOV #20,@R3 ;Y - CLEAR SILO, UARTS, CONTROLLER60$: BIT #20,@R3 ;DONE? BNE 60$ ;N - LOOPB& BIS #40140,@R3 ;Y - ENABLE INTERRUPTS .IFTL RETURNEYZUONL::YZUPUP:: .ENDC ;R$$CON70$: ;REFERENCE LABEL .IF DF D$$ZMD4 BIC #S5.ABP,U.TST5-U.TSTA(R5) ;RESET AUTO-BAUD MODE MOV R2,-(SP) ;SAVE R2 .IFTF ;D$$ZMD* CALL SETLN1 ;SET INITIAL CHARACTERISTICS ;IN LINE PARAMETER REGISTE00}}s}TADATADATADATADATADATADATADATADATARZ .IFT ;D$$ZMD MOV (SP)+,R2 ;RESTORE R2N+ BIT #U2.RMT,U.CW2-U.TSTA(R5) ;REMOTE LINE?M BEQ 150$ ;N - RETURN< BISB #US.CRW,U.STS-U.TSTA(R5) ;SET WAITING FOR CARRIER FLAG;L;B;+; YZMTIM - MODEM TIMER. ;E; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-;R;R;E .IFTF ;D$$ZMDYZMTIM:: # .IFT ;D$$ZMD. A6 MOV $BTMSK(R2),R2 ;GET BIT CORRESPONDING TO THIS LINE! CALL LOCKI ;LOCK OUT INTERRUPTSI2 CALL HLMTIM ;;;CALL COMMON MODEM TIMEOUT ROUTINE' BEQ 80$ ;;;IF EQ Z-BIT SET - DROP DTRR BISB R2,TCR+1(R3) ;;;SET DTRU RETURN ;;;T&80$: BICB R2,TCR+1(R3) ;;;DEASSERT DTR RETURN.;-;S;+; YZPOLL - POLL MODEM STATUS.G;L; INPUT:; R5 POINTER TO U.TSTA;-; ;U(YZPOLL::MOV U.SCB-U.TSTA(R5),R3 ;GET SCB .IF DF R$$MPL MOV @S.KRB(R3),R3 ;GET CSR; .IFF ;R$$MPL: MOV S.CSR(R3),R3 ;GET CSR .ENDC ;R$$MPL4 MOVB U.UNIT-U.TSTA(R5),R2 ;GET PHYSICAL UNIT NUMBER ASL R2 ;MULTIPLY BY 2M6 MOV $BTMSK(R2),R2 ;GET BIT CORRESPONDING TO THIS LINE CLR R4 ;START OFF FRESHB BITB R2,MSR(R3) ;RING ON? BEQ 90$ ;N - JUMP:& BIS #200,R4 ;Y - SET APPROPRIATE BIT#90$: BITB R2,MSR+1(R3) ;CARRIER ON?E BEQ 100$ ;N - JUMP& BIS #140,R4 ;Y - SET APPROPRIATE BIT7100$: MOV R2,-(SP) ;SAVE R2 DESTROYED BY MODISR ROUTINEL3 CALL MODISR ;DO COMMON MODEM INTERRUPT PROCESSING+ BVC 120$ ;NO SPECIAL ACTION NEEDED - JUMP BCS 110$ ;DROP DTR - JUMP;! BISB (SP)+,TCR+1(R3) ;ASSERT DTR; RETURNB(110$: BICB (SP)+,TCR+1(R3) ;DEASSERT DTR RETURNT4120$: MOV (SP)+,R2 ;POP STACK WITHOUT AFFECTING CC-C% BCS 150$ ;NO CALL ANSWERED - RETURN# ASSUME S4.ABD,100000R. TST 6(R5) ;;;AUTO-BAUD SPEED DETECT ENABLED?$ BPL 130$ ;;;IF NOT, DON'T SET BAUD( MOVB #14,R2 ;Y - SET LINE TO 4800 BAUD BR SETLIN ;O9130$: MOVB U.CW3+1-U.TSTA(R5),R0 ;GET REMOTE ANSWER SPEEDR2 BICB #^C<17>,R0 ;CLEAR ALL BUT ANSWER SPEED FIELD BR 40$ ;SET THAT SPEED D .ENDC ;D$$ZMD S 150$: RETURN S .DSABL LSBT B .IF DF R$$CONYZCOFF::, MOV #20,@R3 ;CLEAR SILO, UARTS, CONTROLLER10$: BIT #20,@R3 ;DONE? BNE 10$ ;N - LOOPC RETURNRYZUOFF::! CLR -(SP) ;GET A TEMPORARY WORDR> BISB U.UNIT-U.TSTA(R5),(SP) ;SET LINE NUMBER BUT RECEIVER OFF, MOV (SP)+,LPR(R3) ;LOAD NEW LINE PARAMETERS .IF DF D$$ZMD6 MOV $BTMSK(R2),R2 ;GET BIT CORRESPONDING TO THIS LINE BICB R2,TCR+1(R3) ;DROP DTR .ENDC ;D$$ZMD RETURND .ENDC ;R$$CON;E;;+"; INPUT INTERRUPT SERVICE ROUTINE.;-;B;S .ENABL LSBF;  C .IF DF R$$MPL V-$YZINP::TTSET$ YZ ;;;SAVE R2, R3 AND SET UP:B ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS O .IFF ;R$$MPL) G+$DZINP::TTSET$ DZ ;;;SAVE R2,R3 AND SET UP, ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST R .ENDC ;R$$MPL A, CALL MUXINP ;;;DO COMMON MULTIPLEXER INPUT ;;;CHARACTER PROCESSINGT3 ;;;MUXINP DISMISSES INTERRUPT IF NO OUTPUT WORKZ* BR 10$ ;;;XMIT READY - GO DO OUTPUT WORK;;N;+#; OUTPUT INTERRUPT SERVICE ROUTINE.S;-;B;S  .IF DF R$$MPL M-$YZOUT::TTSET$ YZ ;;;SAVE R2, R3 AND SET UP:E ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS E .IFF ;R$$MPLR P+$DZOUT::TTSET$ DZ ;;;SAVE R2,R3 AND SET UPS ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST I .ENDC ;R$$MPL M10$: MOV R3,-(SP) ;;;;% INC @SP ;;;POINT TO BYTE CONTAININGA/ ;;;INTERRUPTING LINE NUMBER (CSR HIGH BYTE)R. CALL JZOUT ;;;DO OUTPUT INTERRUPT PROCESSING# ;;;(COMMON FOR DJ-11 AND DZ-11)P TST (SP)+ ;;;CLEAN STACK;;;+; YZABOX - ABORT OUTPUT.;Y; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; U.TOC 0 ; U.TTOC 0;; YZSTOX - STOP OUTPUT.T;T; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S1.CTS 1T;-;.;CYZABOX::YZSTOX::RETURN ;;;RETURN;C .DSABL LSBT  .ENDC ;D$$Z11 ;;;T .ENDNG LINE NUMBER (CSR HIGH BYTE)R. CALL JZOUT ;;;DO OUTPUT INTERRUPT PROCESSING# ;;;(COMMON FOR DJ-11 AND DZ-11)P TST (SP)+ ;;;CLEAN STACK;;;+; YZABOX - ABORT OUTPUT.;Y; INPUT:00}} D%B11110010 .TITLE UTLDEF .IDENT /01/;; COPYRIGHT (C) 1982; ALL RIGHTS RESERVED/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;?; THIS SOFTWARE IS FURNISHED UNDER LICENSE AND MAY ONLY BE USED6; OR COPIED ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; T. LEKAS 04-JUN-82;; MODIFIED BY:;;4; THIS MODULE CONTAINS DEFINITIONS AND ROUTINES FROM0; EXEC MODULES THAT HAVE GONE AWAY IN XT SYSTEMS;$ALEB1::SEC ;FAIL MOV (SP)+,(SP)$QEMB:: RETURN$DVCER::$DVERR::$DTOER:: .WORD 0;D;++; **-$LDPWF-CALL DRIVER AT POWERFAIL ENTRY.L;ID; THIS ROUTINE WILL UNCONDITIONALLY CALL THE DRIVER AT ITS POWERFAIL; ENTRY FOR A SINGLE UNIT.;D ; INPUTS:A;M; R2=DDT ADDRESS. ; R3=DCB ADDRESS.E; R4=SCB ADDRESS.S; R5=UCB ADDRESS. ;L ; OUTPUTS:;; NONE;I; NO REGISTERS ARE PRESERVED!;-;S6$LDPWF::MOV KINAR5,-(SP) ;SAVE KERNEL INSTR ADDR REG 5/ MOV KINAR6,-(SP) ;SAVE KERNEL INSTR ADDR REG 6) MOV D.PCB(R3),R3 ;GET DRIVER PCB ADDRESS:% MOV P.REL(R3),KINAR5 ;MAP THE DRIVER+&55$: MOV S.KRB(R4),R3 ;GET KRB ADDRESS BEQ 60$ ;IF EQ NO KRB ADDRESSN( MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX;:; CALL DRIVER AT POWERFAIL ENTRY POINT WITH THE ARGUMENTS:;S; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK.'; R5=ADDRESS OF THE UNIT CONTROL BLOCK.R;R"; IF S.KRB=0 THEN R3 IS UNDEFINED.;5(60$: TST D.VPWF(R2) ;IS THERE AN ENTRY ? BEQ 70$ ;IF EQ NON CLC6 CALL @D.VPWF(R2) ;CALL DRIVER AT POWERFAIL ENTRYPOINT70$: ;REFERENCE LABEL2 MOV (SP)+,KINAR6 ;RESTORE KERNEL INSTR ADDR REG 62 MOV (SP)+,KINAR5 ;RESTORE KERNEL INSTR ADDR REG 5 RETURN ;O .ENDIEX;:; CALL DRIVER AT POWERFAIL ENTRY POINT WITH THE ARGUMENTS:;S; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK.'; R5=ADDRESS OF THE UNIT CONTROL BLOCK.R;R"; IF S.KRB=0 THEN R3 IS UNDEFINED.;5(60$: TST D.VPWF(R2) ;IS THERE AN ENTRY ? BEQ 70$ ;IF EQ NON CLC6 CALL @D.VPWF(R2) ;CALL DRIVER AT POWERFAIL ENTRYPOINT70$: ;REFERENCE LABEL .TITLE UTSUB1 .IDENT /02/;C; COPYRIGHT (C) 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDT9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.1; ; VERSION 02;E; T. J. MILLER 23-OCT-77;XB; THIS MODULE CONTAINS ROUTINES WHICH MAY BE CALLED AT TASK STATE.;E; MODIFIED BY:;.; J. E. PROVINO 22-JUN-79;; JP130 -- FIX CONDITIONALS. ;U; J. E. PROVINO 16-JUL-79A;F2; JP135 -- USE EIS INSTRUCTIONS IN $MUL AND $DIV.;;+,; **-$MUL-INTEGER MULTIPLY MAGNITUDE NUMBERS;P ; INPUTS:Y;D; R0=MULTIPLIER.; R1=MULTIPLICAND.;D ; OUTPUTS:;E); DOUBLE WORD RESULT IS RETURNED WITH THER); HIGH PART IN R0 AND THE LOW PART IN R1.;E9; REGISTERS R2, R3, R4, AND R5 ARE PRESERVED ACROSS CALL.O;-$$MUL:: TST R0 ;NEGATIVE MULTIPLIER? BMI 5$ ;IF MI YESD TST R1 ;NEGATIVE MULTIPLICAND? BMI 5$ ;IF MI YESI MUL R1,R0 ;MULTIPLY R1 BY R0 RETURN ;7"5$: MOV R0,-(SP) ;SAVE R0 FOR ADDS MOV #21,-(SP) ;SET REPEAT COUNT CLR R0 ;CLEAR HIGH PARTM 10$: ROR R0 ;DOUBLE RIGHT SHIFT ROR R1 ; BCC 20$ ;IF CC DO NOT ADD ADD 2(SP),R0 ;E&20$: DEC (SP) ;DECREMENT REPEAT COUNT BGT 10$ ;IF GT MORE TO GOH CMP (SP)+,(SP)+ ;CLEAN STACKT RETURN ;4;+*; **-$DIV-INTEGER DIVIDE MAGNITUDE NUMBERS;T ; INPUTS:I;M; R0=DIVIDEND.; R1=POSITIVE DIVISOR.;; ; OUTPUTS:;L1; QUOTIENT IS RETURNED IN R0 AND REMAINDER IN R1. ;B9; REGISTERS R2, R3, R4, AND R5 ARE PRESERVED ACROSS CALL.V;-;$DIV:: MOV R2,-(SP) ;SAVE R2 FOR INTERFACE TO DOUBLE DIVIDER$ MOV R1,R2 ;COPY DIVISOR FOR $DBDIV$ BMI 20$ ;IF MI DIVISOR IS NEGATIVE BEQ 30$ ;IF EQ DIVISOR IS ZERO) MOV R0,R1 ;SET UP DIVIDEND IN R0 AND R1 CLR R0 ; DIV R2,R0 ;DIVIDE R0,R1 BY R210$: MOV (SP)+,R2 ;RESTORE R2M RETURN ;E-20$: CLR R1 ;ZERO HIGH-ORDER WORD FOR $DBDIVS+ CALL $DBDIV ;PERFORM THE DIVIDE OPERATIONT BR 10$ ;$30$: MOV R0,R1 ;MOVE DIVIDEND TO R1 MOV #177777,R0 ;QUOTIENTA BR 10$ ;00}}TADATADATADATADATADATADATADATADATA;+7; **-$DBDIV-DOUBLE-PRECISION DIVIDE MAGNITITUDE NUMBERSE; ; INPUTS:D; ; R0=LOW-ORDER PART OF DIVIDEND.!; R1=HIGH-ORDER PART OF DIVIDEND.A; R2=POSITIVE DIVISOR.;S ; OUTPUTS:;V ; R0=LOW-ORDER PART OF QUOTIENT.; R1=REMAINDER.'; R2=UNDEFINED FOR POSSIBLE FUTURE USE.V; R3-R5 ARE PRESERVED.;T<; NOTE: IT IS THE CALLER'S RESPONSIBILITY TO INSURE THAT THE5; DIVISION OF THE INPUT OPERANDS YIELDS NO MORE THAN0; 16 BITS IN THE QUOTIENT.T;-&$DBDIV::MOV #16.,-(SP) ;SET LOOP COUNT30$: ASL R0 ;DOUBLE LEFT SHIFTN ROL R1 ;" CMP R1,R2 ;SUBTRACT OUT DIVISOR? BLO 40$ ;IF LO NO ! SUB R2,R1 ;SUBTRACT OUT DIVISORO INC R0 ;ADD IN LOW BIT$40$: DEC (SP) ;DECREMENT LOOP COUNT BGT 30$ ;IF GT MORE TO GO  TST (SP)+ ;CLEAN STACK RETURN ;I;+!; **-$CAT5-CONVERT ASCII TO RAD50; ; INPUTS:I;H/; R0=ADDRESS OF NEXT CHARACTER IN INPUT BUFFER.D; R1=PERIOD DISPOSITION FLAG.I+; IF R1 EQ 0, THEN PERIOD IS A TERMINATOR.T0; IF R1 NE 0, THEN PERIOD IS A RAD50 CHARACTER.;: ; OUTPUTS:;E6; C=1 IF SCAN WAS TERMINATED BY A NON-RAD50 CHARACTER./; C=0 IF THREE RAD50 CHARACTERS WERE CONVERTED. 9; NOTE: IF EITHER CASE THE FOLLOWING VALUES ARE RETURNED.R0; R0=ADDRESS OF NEXT CHARACTER IN INPUT BUFFER.; R1=PACKED RAD50 CHARACTERS.; R2=TERMINAL CHARACTER.E; R3 IS PRESERVED.;- S .IF DF R$$DSP S+$CAT5:: SAVNR ;SAVE NONVOLITILE REGISTERSR MOV R3,-(SP) ;SAVE R3 AS WELL+ MOV R1,-(SP) ;SAVE PERIOD DISPOSITION FLAG1 CLR R1 ;CLEAR ACCUMULATION/ MOV #CVTBL,R3 ;GET ADDRESS OF CONVERSION TABLE &10$: MOVB (R0)+,R5 ;GET NEXT CHARACTER- MOV #CNTRL,R4 ;GET ADDRESS OF CONTROL STRING CMPB (R4)+,R5 ;RAD50 CHARACTER? BLO 60$ ;IF LO NOD CMPB (R4)+,R5 ;ALPHABETIC?R BLOS 50$ ;IF LOS YES CMPB (R4)+,R5 ;RAD50 CHARACTER? BLO 60$ ;IF LO NOR CMPB (R4)+,R5 ;NUMERIC? BLOS 40$ ;IF LOS YES CMPB (R4)+,R5 ;"$"? BEQ 30$ ;IF EQ YES CMPB (R4)+,R5 ;"SPACE"? BEQ 60$ ;IF EQ YES# TST (SP) ;PERIOD RAD50 CHARACTER? BEQ 60$ ;IF EQ NOU CMPB (R4)+,R5 ;"."? BEQ 40$ ;IF EQ YES BR 60$ ;20$: SUB #' -11,R5 ;SPACEE30$: SUB #11-22,R5 ;"$",!40$: SUB #22-100,R5 ;PERIOD/DIGIT50$: SUB #100,R5 ;ALPHABETIC?% MOV R0,-(SP) ;SAVE NEXT BYTE ADDRESS;& MOV (R3)+,R0 ;GET CONVERSION CONSTANT MOV R1,-(SP) ;SAVE ACCUMULATION MOV R5,R1 ;SET MULTIPLIER)" CALL $MUL ;SCALE RAD50 CHARACTER MOV R1,R5 ;RESULT TO R5B- MOV (SP)+,R1 ;RETRIEVE PREVIOUS ACCUMULATIONB) MOV (SP)+,R0 ;RETRIEVE NEXT BYTE ADDRESS0 ADD R5,R1 ;ACCUMULATE RESULT& CMP R3,#CVTBL+6 ;CONVERTED THREE YET? BLO 10$ ;IF LO NO0$ TST (SP)+ ;CLEAN STACK-CLEAR CARRY BR 70$ ;*60$: COM (SP)+ ;CLEAN STACK AND SET CARRY+70$: MOVB -1(R0),R2 ;GET TERMINAL CHARACTER  MOV (SP)+,R3 ;RESTORE R33 RETURN ;N6CNTRL: .BYTE 'Z,'A,'9,'0,'$,' ,'. ;CONTROL BYTE STRING .EVEN.CVTBL: .WORD 50*50 ;RAD50 PACK MULTIPLICATION .WORD 50 ; .WORD 1 ;R .ENDC + ;+&; **-$SAVNR-SAVE NONVOLATILE REGISTERS; >; THIS ROUTINE IS A CO-ROUTINE THAT SAVES REGISTERS R4 AND R5.;-$SAVNR::MOV R4,-(SP) ;SAVE R4! MOV R5,-(SP) ;SET RETURN ADDRESSC MOV 4(SP),R5 ;RESTORE R5  CALL @(SP)+ ;CALL THE CALLER MOV (SP)+,R4 ;RESTORE R4V MOV (SP)+,R5 ;RESTORE R5H$ RETURN ;RETURN TO ORIGINAL CALLER;+&; **-$UTEND-END OF UTILITY SUBROUTINES; G; THIS ADDRESS IS THE LAST ADDRESS IN THE KERNEL DATA SPACE EXEC OR THEI<; MULTIPROCESSING EXEC WHICH A PRIVILEGED TASK NEEDS TO MAP.;-;- N $UTEND:: ; S .END THIS ROUTINE IS A CO-ROUTINE THAT SAVES REGISTERS R4 AND R5.;-$S .TITLE VIDSUB .IDENT /01/;; COPYRIGHT (C) 1982; ALL RIGHTS RESERVED/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;?; THIS SOFTWARE IS FURNISHED UNDER LICENSE AND MAY ONLY BE USED6; OR COPIED ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; VERSION 01;; T. LEKAS 7-FEB-82;; MODIFIED BY:; .MCALL DCBDF$ DCBDF$;;+9; EXEC SUBROUTINES FOR THE USE OF THE VIDEO FIRMWARE TASK!; WHILE IT IS MAPPED TO THE EXEC.;-; .IF DF D$$C11;;+@; N$DRIN - N00}} D%B11110010OTIFY THE TERMINAL DRIVER THAT THERE IS INPUT FOR IT;9 ; INPUTS:I; NONE;E ; OUTPUTS:;; THE TERMINAL DRIVER CT INPUT ROUTINE IS MAPPED AND CALLED ;F; REGISTERS MODIFIED:A; NONE;-;E5 .IIF DF,K$$DAS,.ERROR ;THIS MUST BE A NON I/D SYSTEM.3; THIS CODE ALSO ASSUMES THAT THE TTDRV IS LOADABLEI; NOTE:;7; WHEN WE FIGURE OUT WHAT REALLY NEEDS TO BE SAVED THISF/; CAN BE CLEANED UP AND PROBABLY GENERERALIZED.T; .ENABL LSBX)N$DRIN::JSR R5,SAVER ;SAVE THE REGISTERS$ MOV @#KINAR5,-(SP) ;SAVE APR 5 MOV @#KINAR6,-(SP) ;SAVE APR 6+ MOV #.CTDCB,R0 ;GET THE TTDRV DCB ADDRESSN/ MOV D.PCB(R0),R1 ;GET THE DRIVERS PCB ADDRESS> MOV P.REL(R1),@#KINAR5 ;MAP KERNEL INSTRUCTION APR5 TO DRIVER8 MOV D.DSP(R0),R0 ;GET ADDRESS OF DRIVER DISPATCH TABLE0 CALL @D.VTIN(R0) ;CALL DRIVER CT INPUT ROUTINE BR 10$ ;CLEANUP AND EXIT ;Y;+:; N$DROU - NOTIFY THE TERMINAL DRIVER OF OUTPUT COMPLETION;L ; INPUTS:; NONE;S ; OUTPUTS:G; THE TERMINAL DRIVER CT OUTPUT COMPLETION ROUTINE IS MAPPED AND CALLEDM;@; REGISTERS MODIFIED:R; NONE;-;R)N$DROU::JSR R5,SAVER ;SAVE THE REGISTERS) MOV @#KINAR5,-(SP) ;SAVE APR 5 MOV @#KINAR6,-(SP) ;SAVE APR 6+ MOV #.CTDCB,R0 ;GET THE TTDRV DCB ADDRESS)/ MOV D.PCB(R0),R1 ;GET THE DRIVERS PCB ADDRESS > MOV P.REL(R1),@#KINAR5 ;MAP KERNEL INSTRUCTION APR5 TO DRIVER8 MOV D.DSP(R0),R0 ;GET ADDRESS OF DRIVER DISPATCH TABLE0 CALL @D.VTOU(R0) ;CALL DRIVER CT INPUT ROUTINE'10$: MOV (SP)+,@#KINAR6 ;RESTORE APR 6U# MOV (SP)+,@#KINAR5 ;RESTORE APR 5L8; SET THE PRIORITY TO ZERO IF IT ISN'T ALREADY THERE NOW(; CHECK TO SEE IF THIS IS REALLY NEEDED MTPS #0 ; RETURN ;AND EXIT;,; SAVER - SAVE REGISTERS;D); THIS ROUTINE IS A CO-ROUTINE THAT SAVESP$; AND RESTORES REGISTERS R0 THRU R5.;SAVER: MOV R0,-(SP) ;SAVE R0 MOV R1,-(SP) ;SAVE R1 MOV R2,-(SP) ;SAVE R2 MOV R3,-(SP) ;SAVE R3 MOV R4,-(SP) ;SAVE R4! MOV R5,-(SP) ;SET RETURN ADDRESSR MOV 14(SP),R5 ;RESTORE R5 CALL @(SP)+ ;CALL THE CALLER MOV (SP)+,R4 ;RESTORE R4 MOV (SP)+,R3 ;RESTORE R3O MOV (SP)+,R2 ;RESTORE R2N MOV (SP)+,R1 ;RESTORE R1  MOV (SP)+,R0 ;RESTORE R00 MOV (SP)+,R5 ;RESTORE R5$ RETURN ;RETURN TO ORIGINAL CALLER .ENDC ;D$$C11 .ENDEHAT SAVESP$; AND RESTORES REGISTERS R0 THRU R5.;SAVER: MOV R0,-(SP) ;SAVE R0 MOV R1,-(SP) ;SAVE R1 MOV R2,-(SP) ;SAVE R2 MOV R3,-(SP) ;SAVE R3 MOV R4,-(SP) ;SAVE R4! MOV R5,-(SP) ;SET RETURN ADDRESSR MOV 14(SP),R5 ;RESTORE R5 CALL @(SP)+ ;CALL THE CALLER .TITLE VTDRVY .IDENT /05.00/S R; $; COPYRIGHT (c) 1983, 1985, 1988 BY(; DIGITAL EQUIPMENT CORPORATION, MAYNARD'; MASSACHUSETTS. ALL RIGHTS RESERVED.O;0A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USEDTA; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSEOA; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THISPA; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED ORZA; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO ANDT1; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERED.C;RA; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTAA; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;SA; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFM<; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.;R;T; MODIFIED FOR VERSION 2 BY:;A; D. R. DONCHIN ;R; MODIFIED FOR VERSION 2.1 BY:;E; D. R. DONCHIN 11-MAR-83Y;H$; DD167 -- FIX PROBLEMS WITH IO.RPR; $; Modified for RSX-11M-PLUS V3.0 by:;R ; J. C. Franzini 12-May-85 04.00&; JCF255 -- validate size of transfer;E$; MODIFIED FOR RSX-11M-PLUS V4.2 by:;E; M. W. ZAHAREE 27-MAY-88 5.001; MWZ004 -- DONT VALIDATE SIZE OF XFR ON ATT/DET ; ;S; VIRTUAL TERMINAL DRIVER.;T;+E; THE VIRTUAL TERMINAL DRIVER IS PRIMARILY INTENDED FOR A PARENT TASKVC; TO SIMULATE TERMINAL I/O FOR AN OFFSPRING TASK ACTIVATED WITH THE:F; SPAWN DIRECTIVE. THIS SIMULATION TAKES PLACE VIA A VIRTUAL TERM00}}TADATADATADATADATADATADATADATADATAINALA; UNIT WHOSE UNIQUE DATA STRUCTURES (DCB AND UCB) ARE DYNAMICALLY1E; CREATED WITH THE CREATE VIRTUAL TERMINAL DIRECTIVE. ONE COMMON SCBF); IS USED FOR ALL VIRTUAL TERMINAL UNITS.E;7G; THE VIRTUAL TERMINAL DRIVER EMPLOYS THE UC.QUE BIT TO RECEIVE ALL I/OSC; PACKETS DIRECTLY FROM THE QUEUE I/O DIRECTIVE AS THE REQUESTS ARESE; QUEUED. OFFSPRING READ AND WRITE REQUESTS ARE QUEUED TO THE COMMONAD; SCB AND DEQUEUED ONE BY ONE, BASED ON ATTACHMENT OF THE DEVICE ANDA; THE PRESENCE OF OTHER REQUESTS. EACH TIME AN OFFSPRING READ ORRD; WRITE IS DEQUEUED, THE PARENT TASK RECEIVES AN AST AT ITS INPUT ORD; OUTPUT AST ENTRY POINT. THE PARENT TASK IS THEN EXPECTED TO ISSUEB; A COMPLEMENTARY WRITE OR READ REQUEST TO SIMULATE A TERMINAL I/O ; TRANSFER.V;LD; ONLY OFFSPRING TASKS MAY ATTACH THE VIRTUAL TERMINAL UNIT. PARENTD; REQUESTS ARE ALWAYS SERVICED IN SPITE OF ATTACHMENT OF THE VIRTUAL; TERMINAL UNIT.;EF; INTERMEDIATE BUFFERING OF OFFSPRING I/O REQUESTS AND STOPPING OF THEE; OFFSPRING TASK IS PERFORMED WHEN POSSIBLE (OFFSPRING TASK IS CHECK-EA; POINTABLE AND CAN CURRENTLY DEQUEUE AN AST). WHEN INTERMEDIATETC; BUFFERING IS NOT PERFORMED, DATA TRANSFERS OCCUR DIRECTLY BETWEENR; OFFSPRING AND PARENT BUFFERS.T; @; SUCCESSFUL COMPLETION OF PARENT I/O REQUESTS RESULTS IN IS.SUCE; RETURNED IN THE FIRST WORD OF THE I/O STATUS BLOCK AND THE COUNT OFPG; BYTES ACTUALLY TRANSFERRED IN THE SECOND WORD. THE FIRST WORD OF THEFC; OFFSPRING STATUS IS PASSED IN THE CORRESPONDING PARENT REQUEST INKD; THE THIRD PARAMETER WORD OF THE DPB. THE SECOND WORD IS THE COUNTB; OF BYTES ACTUALLY TRANSFERRED. IN BOTH CASES THE COUNT OF BYTESF; ACTUALLY TRANSFERRED IS EQUAL TO THE SMALLER OF THE COUNTS SPECIFIED%; IN THE PARENT OR OFFSPRING REQUEST.L;-;F; LOCAL MACRO DEFINITIONSS;  S6 .MCALL DCBDF$, PKTDF$, SCBDF$, TCBDF$, UCBDF$, TTSYM$. DCBDF$ ;DEFINE DEVICE CONTROL BLOCK SYMBOLS2 PKTDF$ ;DEFINE I/O PACKET AND AST BLOCK SYMBOLS. SCBDF$ ;DEFINE STATUS CONTROL BLOCK SYMBOLS, TCBDF$ ;DEFINE TASK CONTROL BLOCK SYMBOLS3 UCBDF$ ,,TTDEF ;DEFINE UNIT CONTROL BLOCK SYMBOLST, TTSYM$ ;DEFINE TERMINAL DEPENDENT SYMBOLS;S,; DEFINE THE TERMINAL FUNCTION SUPPORT WORDS;O(TSP1 = F1.BUF ! F1.RPR ! F1.UTB ! F1.VBFTSP2 = F2.SCH ! F2.GCH ;A; DRIVER DISPATCH TABLE; C* .WORD VTDEA ;BUFFER DEALLOCATION ROUTINE DDT$ VT,,NONE,,,NEW ;I ; TERMINAL CHARACTERISTICS TABLE;DMCTAB:* .BYTE TC.TTP, 377, U.CW3+1 ;TERMINAL TYPE= .BYTE TC.SCP, U2.CRT/400, U.CW2+1 ;TERMINAL IS A SCOPE (CRT)B< .BYTE TC.SMR, U2.LWC, U.CW2 ;UPPER-CASE CONVERSION DISABLED. .BYTE TC.FDX, U3.FDX, U.CW3 ;FULL DUPLEX MODE .BYTE 0 ;TERMINATOR .EVEN;+8; **-VTINI-VIRTUAL TERMINAL DRIVER INITIATOR ENTRY POINT;VB; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE EACH TIME AD; PARENT OR OFFSPRING REQUEST IS ISSUED (UC.QUE IS SET). PARENT I/OC; REQUESTS ARE ALWAYS SERVICED IMMEDIATELY, NORMALLY RESULTING IN ATF; $BLXIO TRANSFER OF DATA AND THE COMPLETION OF THE PARENT REQUEST ANDH; THE CORRESPONDING OFFSPRING REQUEST. OFFSPRING REQUESTS ARE INITIALLYB; QUEUED AND THEN DEQUEUED ONE AT A TIME WHEN POSSIBLE. AN AST ISD; DECLARED IN THE PARENT TASK WHENEVER AN OFFSPRING READ OR WRITE IS ; DEQUEUED.I; ; INPUTS:R;I; R1 = ADDRESS OF I/O PACKET; R4 = ADDRESS OF SCBA; R5 = ADDRESS OF UCB ;U-; VIRTUAL TERMINAL I/O REQUEST PACKET FORMAT:E;S"; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK.O@; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER.(; WD. 04 -- VIRTUAL TERMINAL UCB ADDRESSB; WD. 05 -- I/O FUNCTION CODE (IO.ATT, IO.DET, IO.RLB, OR IO.WLB).0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.=; WD. 10 -- I/O STATUS BLOCK ADDRESS (DISPLACEMENT + 140000).I3; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE. *; WD. 12 -- RELOCATION BIAS OF I/O BUFFER.B; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER (DISPLACEMENT +14000000}} D%B11110010).(; WD. 14 -- CHARACTER COUNT OF TRANSFER.;; WD. 15 -- VFC BYTE (OFFSPRING)/OFFSPRING STATUS (PARENT).U; WD. 16 -- UNUSED.-0; WD. 17 -- STORES ALLOCATED BUFFER (OFFSPRING).9; WD. 20 -- STORES AST CONTROL BLOCK ADDRESS (OFFSPRING). 7; WD. 21 -- STORES PCB OF OFFSPRING BUFFER (OFFSPRING).-;-;T3; VALIDATE PARENT I/O REQUEST AND PERFORM TRANSFER.1;  T .ENABL LSBF=VTINI: CLR I.PRM+16(R1) ;CLEAR PCB PTR (TASK IS STOPPED FLAG)E+ MOVB I.FCN+1(R1),R2 ;PICK UP FUNCTION CODER MOV R1,R3 ;COPY PACKET ADDRESS. CMP I.TCB(R1),U.PTCB(R5) ;PARENT I/O REQUEST? BNE 40$ ;IF NE NOF/ CLR I.PRM+12(R1) ;CLEAR ALLOCATED BUFFER FIELD ) MOV R1,-(SP) ;SAVE PARENT PACKET ADDRESSG2 CLR -(SP) ;INIT SECOND WORD OF I/O STATUS RETURN3 ADD #I.PRM+6,R1 ;POINT TO DESIRED OFFSPRING STATUSR- CMPB R2,#IO.RLB/256. ;READ OR WRITE LOGICAL?E BLOS 30$ ;IF LOS YES;10$: CALL VTCHR ;PROCESS SF.GMC/SF.SMC/IO.GTS IF SPECIFIEDB4 BNE 115$ ;IF NE, ILLEGAL FUNCTION ISSUED BY PARENT+ BIT #1,-6(R1) ;RETURN STATUS TO OFFSPRING?T BNE 20$ ;IF NE YES;P4; PROCESS A PARENT ENABLE/DISABLE BUFFERING REQUEST.;I1 BIS #U3.DBF,U.CW3(R5) ;ASSUME BUFFERING DISABLED(" BIT #2,-6(R1) ;DISABLE BUFFERING? BNE 100$ ;IF NE YESW9 CMP U.CW4(R5),#V$$TLM ;BUFFER SIZE GREATER THAN MAXIMUM?D2 BHI 110$ ;IF HI YES, ILLEGAL TO ENABLE BUFFERING( BIC #U3.DBF,U.CW3(R5) ;ENABLE BUFFERING" BR 100$ ;COMPLETE PARENT REQUEST;G?; PROCESS A PARENT RETURN STATUS WITHOUT DATA TRANSFER REQUEST.A;T020$: BIT #U3.FDX,U.CW3(R5) ;IN FULL DUPLEX MODE? BNE 23$ ;IF NE YES- TST U.RPKT(R5) ;IS AN OFFSPRING READ ACTIVE?E BNE 25$ ;IF NE YES- BR 27$ ;HOPE FOR AN OFFSPRING WRITE REQUESTT423$: BIT #2,-6(R1) ;RETURN STATUS TO OFFSPRING READ? BNE 27$ ;IF NE NOT=25$: MOV U.RPKT(R5),R3 ;CORRESPONDING OFFSPRING READ REQUEST?I BEQ 116$ ;IF EQ NO, ERRORB# MOV -(R1),R0 ;GET SPECIFIED STATUSG MOV -(R1),R1 ;L BR 90$ ;COMPLETE BOTH PACKETSS>27$: MOV U.WPKT(R5),R3 ;CORRESPONDING OFFSPRING WRITE REQUEST?& BEQ 116$ ;IF EQ NO, ILLEGAL FUNCTION/ MOV -(R1),R0 ;PICK UP DESIRED OFFSPRING STATUSI MOV -(R1),R1 ;A BR 90$ ;COMPLETE BOTH PACKETS-30$: BNE 45$ ;IF NE REQUEST IS WRITE LOGICAL;B ; PROCESS A PARENT READ REQUEST.;I: MOV U.WPKT(R5),R3 ;GET OFFSPRING WRITE I/O PACKET ADDRESS& BEQ 116$ ;IF EQ THERE IS NONE, ERROR" MOV R3,-(SP) ;SAVE PACKET ADDRESS) ADD #I.PRM+6,R3 ;POINT PAST LENGTH FIELD+ MOV (R1),-(SP) ;SAVE OFFSPRING STATUS WORDW' MOV R3,R2 ;REVERSE PACKETS FOR $BLXIO MOV R1,R3 ;1 MOV R2,R1 ; BR 50$ ;40$: BR 120$ ;BRANCH AIDP;R!; PROCESS A PARENT WRITE REQUEST. ;=45$: MOV U.RPKT(R5),R3 ;GET OFFSPRING READ I/O PACKET ADDRESS & BEQ 116$ ;IF EQ THERE IS NONE, ERROR" MOV R3,-(SP) ;SAVE PACKET ADDRESS) ADD #I.PRM+6,R3 ;POINT PAST LENGTH FIELDS+ MOV (R1),-(SP) ;SAVE OFFSPRING STATUS WORDV;(J; MAKE THE TRANSFER LENGTH THE LESSOR OF THE PARENT AND OFFSPRING LENGTHS.;,.50$: MOV -(R3),R0 ;PICK UP SIZE OF ONE REQUEST/ CMP R0,-(R1) ;IS IT LARGER THAN OTHER REQUEST?R BLOS 60$ ;IF LOS NO0, MOV (R1),R0 ;PICK UP SMALLEST REQUEST SIZE(60$: MOV R0,4(SP) ;SAVE SIZE OF TRANSFER;,9; COPY THE DATA FROM THE WRITE BUFFER TO THE READ BUFFER.E;H1 CLR -(SP) ;INITIALLY CLEAR BUFFER TO DEALLOCATES1 MOV 12-4(R3),R4 ;PICK UP ALLOCATED OUTPUT BUFFER( BEQ 65$ ;IF EQ THERE IS NONE! MOV R4,R3 ;SET OUTPUT APR6 BIASE- MOV #140004,R4 ;SET OUTPUT APR6 DISPLACEMENTG BR 70$ ;365$: MOV -(R3),R4 ;PICK UP OUTPUT APR6 DISPLACEMENTR' MOV -(R3),R3 ;PICK UP OUTPUT APR6 BIASR470$: MOV 12-4(R1),R2 ;PICK UP ALLOCATED INPUT BUFFER BEQ 75$ ;IF EQ THERE IS NONE' MOV R2,(SP) ;SET TO DEALLOCATE BUFFERT- CLR 12-4(R1) ;CLEAR BUFFER POINTER IN PACKETR MOV R2,R1 ;SET INPUT APR5 BIAS, MOV #120004,R2 ;SET INPUT APR5 DISPLACEMENT BR 80$ ;275$: MOV -(R1),R2 ;PICK UP INPUT APR6 DISPLACEMENT& MOV -(R1),R1 ;PICK UP INPUT APR6 BIAS, SUB #20000,R2 ;CONVERT TO APR5 DISPLACEMENT+80$: CALL $BLXIO ;TRANSFER BUFFER CONTENTS + MOV (SP)+,R0 ;PICK UP BUFFER TO DEALLOCATET BEQ 85$ ;IF EQ THERE IS NONE& C00}}TADATADATADATADATADATADATADATADATAALL VTDEA ;DEALLOCATE OUTPUT BUFFER 7; ,; COMPLETE OFFSPRING AND PARENT I/O PACKETS.;O E+85$: MOV (SP)+,R0 ;PICK UP OFFSPRING STATUS 4 MOV (SP)+,R3 ;RETRIEVE OFFSPRING I/O PACKET ADDRESS( MOV (SP),R1 ;PICK UP BYTES TRANSFERRED(90$: CALL VTFIN ;COMPLETE OFFSPRING I/O/100$: MOV #IS.SUC&377,R0 ;SET PARENT I/O STATUSR BR 111$ ;#2110$: MOV #IE.BAD&377,R0 ;SET BAD PARAMETER STATUS-111$: MOV (SP)+,R1 ;PICK UP BYTES TRANSFERRED , MOV (SP)+,R3 ;PICK UP ADDRESS OF I/O PACKET$ CALL $IOFIN ;FINISH THE PARENT I/O* BR VTPKT ;BRANCH TO DEQUEUE NEXT REQUEST=115$: MOV #IE.DUN&377,R0 ;ASSUME DEVICE NOT ATTACHABLE STATUSP1 CMPB R2,#IO.DET/256. ;ATTACH OR DETACH FUNCTION?N BLOS 111$ ;IF LOS YESV? MOV #IE.IFC&377,R0 ;MUST BE IO.RPR WHICH IS ILLEGAL FOR PARENTO BR 111$ ;>116$: MOV #IE.IFC&377,R0 ;ASSUME ILLEG FUNC (NO OFFSPRING REQ)# BITB #US.BSY,U.STS(R5) ;UNIT BUSY?A BEQ 111$ ;IF EQ NO2 MOV #IE.ABO&377,R0 ;OFFSPRING REQUEST WAS ABORTED$ BICB #US.BSY,U.STS(R5) ;UNBUSY UNIT BR 111$ ;N ; 7; BEGIN OFFSPRING PACKET PROCESSING BY QUEUEING PACKET.1;  1120$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTIONP+ CALL VTCHR ;SET CHARACTERISTICS FUNCTION?C, BEQ 160$ ;IF EQ YES, ILLEGAL FOR OFFSPRING8 CMPB #IO.RPR/256.,I.FCN+1(R3) ;IS IT AN IO.RPR REQUEST?2 BNE 125$ ;IF NE NO, ONLY ONE BUFFER TO DEAL WITH; L; AN IO.RPR REQUEST REQUIRES TWO BUFFERS. THE EXECUTIVE ONLY ADDRESS CHECKSM; AND INCREMENTS THE PARTITION I/O COUNT FOR THE FIRST ONE (THE READ BUFFER).SK; NOW WE PERFORM THOSE FUNCTIONS FOR THE SECOND BUFFER (THE PROMPT BUFFER). I; SINCE THE PROMPT IS OUTPUT BEFORE THE READ IS INITIATED, THE I/O PACKET F; PARAMETERS ARE SWITCHED TO PLACE THE PROMPT BUFFER PARAMETERS FIRST.;O: MOV I.PRM+10(R3),R0 ;GET VIRTUAL ADDRESS OF PROMPT BUFFER. MOV I.PRM+12(R3),R1 ;GET PROMPT BUFFER LENGTH BEQ 155$ ;IF EQ ERRORP- CALL $CKBFR ;ADDRESS CHECK READ ONLY BUFFERO' CALL $RELOC ;RELOCATE VIRTUAL ADDRESSP0 MOV I.PRM+14(R3),I.PRM+6(R3) ;INSERT OUTPUT VFC7 MOV I.PRM+4(R3),I.PRM+14(R3) ;COPY INPUT BUFFER LENGTHU8 MOV I.PRM+12(R3),I.PRM+4(R3) ;COPY OUTPUT BUFFER LENGTH8 MOV I.PRM(R3),I.PRM+10(R3) ;COPY INPUT BUFFER APR6 BIAS= MOV I.PRM+2(R3),I.PRM+16(R3) ;COPY INPUT BUFFER DISPLACEMENT1 MOV R1,I.PRM(R3) ;INSERT OUTPUT BUFFER APR6 BIASP6 MOV R2,I.PRM+2(R3) ;INSERT OUTPUT BUFFER DISPLACEMENT$ MOV R3,R1 ;COPY I/O PACKET POINTER:125$: MOV U.SCB(R5),R0 ;POINT TO OFFSPRING PACKET LISTHEAD( CALL $QINSP ;INSERT PACKET BY PRIORITY (; C; PROPAGATE DRIVER BY ATTEMPTING TO DEQUEUE NEXT OFFSPRING REQUEST.L;T 4VTPKT: MOV #VTACC,R2 ;SET ACCEPTANCE ROUTINE ADDRESS6 CALL $GSPKT ;ATTEMPT TO DEQUEUE AN OFFSPRING REQUEST" BCC 131$ ;IF CC ONE WAS DEQUEUED RETURN ;U%131$: MOV R1,R3 ;COPY PACKET ADDRESSI4 MOV #IE.ABO&377,R0 ;ASSUME UNIT HAS BEEN ELIMINATED7 TST U.PTCB(R5) ;VIRTUAL TERMINAL UNIT BEEN ELIMINATED?A BEQ 160$ ;IF EQ YES 5 BIT #U3.RPR,U.CW3(R5) ;PROCESSING AN IO.RPR REQUEST?  BEQ VTCHK ;IF EQ NOB;OI; PROCESS AN OFFSPRING IO.RPR REQUEST. THE PROMPT BUFFER PARAMETERS HAVEQL; ALREADY BEEN SWITCHED WITH THE INPUT BUFFER PARAMETERS IN THE I/O PACKET. N; THE FUNCTION CODE IS NOW CHANGED TO IO.WLB SINCE THE PROMPT IS OUTPUT BEFOREN; THE READ BEGINS. WHEN THE PROMPT COMPLETES, THE PARAMETERS WILL BE SWITCHED0; BACK AND THE FUNCTION CODE CHANGED TO IO.RLB. ;U9 MOVB #IO.WLB/256.,I.FCN+1(R3) ;CHANGE FUNCTION TO IO.WLBBVTCHK:;3C; CHECK THAT THE PARENT DECLARED AN AST FOR THE REQUESTED FUNCTION. ;C9 MOV #IE.EOF&377,R0 ;END OF FILE RETURNED IF NO INPUT ASTS( MOV U.IAST(R5),R4 ;ASSUME INPUT REQUEST7 CMPB I.FCN+1(R3),#IO.RLB/256. ;IS IT AN INPUT REQUEST?N BEQ 140$ ;IF EQ YES ) BLO 135$ ;IF LO IT IS AN OUTPUT REQUEST 2 MOV U.AAST(R5),R4 ;ELSE IT IS AN ATTACH OR DETACH3 BEQ 210$ ;IF EQ PARENT DOES NOT WANT AST, SUCCESSE' BR 145$ ;ELSE BRANCH TO QUEUE THE AST/3135$: MOV U.OAST(R5),R4 ;PICK UP OUTPUT AST ADDRESS:) MOV #IS.SUC,R0 ;SUCCESS IF NO OUTPUT AST &140$: TST R4 ;DESIRED FUNCTION LEGAL? BEQ 160$ ;IF EQ NO O;IM; CHECK FOR 00}} D%B11110010VALID SIZE. SINCE WE ARE USING $BLXIO, THE TRANSFER CANNOT CROSS./; APR BOUNDARIES, SO THE MAXIMUM SIZE IS 4K-63.; + MOV #IE.BAD&377,R0 ;ASSUME SIZE IS TOO BIGO- CMP #20000-63.,I.PRM+4(R3) ;IS SIZE TOO BIG?A BLO 160$ ;IF LO, YES; F; ALLOCATE AND FILL IN AST CONTROL BLOCK TO NOTIFY PARENT TASK THAT AN!; OFFSPRING REQUEST WAS DEQUEUED.R;P 0145$: MOV #A.PRM+6,R1 ;PICK UP SIZE OF AST BLOCK! CALL $ALOCB ;ALLOCATE AST BLOCKS' BCC 180$ ;IF CC SUCCESSFUL ALLOCATIONO1150$: MOV #IE.NOD&377,R0 ;INSUFFICIENT POOL SPACEN& BR 160$ ;COMPLETE REQUEST WITH ERROR0155$: MOV #IE.SPC&377,R0 ;ILLEGAL BUFFER ADDRESS.160$: CLR R1 ;CLEAR SECOND WORD OF I/O STATUS'170$: CALL VTFIN ;COMPLETE I/O REQUESTO/175$: BR VTPKT ;BRANCH TO DEQUEUE NEXT REQUESTA5180$: MOV R0,@R3 ;SAVE POINTER TO AST BLOCK AT I.LNK TST (R0)+ ;SKIP OVER LINK WORD1 MOV R1,(R0)+ ;SET SIZE OF BLK TO RELEASE (A.CBL)F7 MOV #10.*2,(R0)+ ;SET # OF BYTES ON USER STACK (A.BYT) - MOV R4,(R0)+ ;SET PARENT AST ADDRESS (A.AST)O3 MOV #3,(R0)+ ;SET NUMBER OF AST PARAMETERS (A.NPR)T MOV (R5),R1 ;POINT TO VT: DCBI> MOVB D.UNIT(R1),(R0)+ ;SET UNIT NUMBER AS FIRST PARAM (A.PRM)= MOVB I.FCN(R3),(R0)+ ;ADD SUBFUNCTION IN HIGH BYTE (A.PRM+1)2 MOV I.PRM+4(R3),R4 ;PICK UP BYTE COUNT OF REQUEST4 MOV R4,(R0)+ ;SET BYTE COUNT AS 2ND PARAM (A.PRM+2); MOV I.PRM+6(R3),(R0) ;SET VERTICAL FORMAT AS 3RD (A.PRM+4)B7 CMPB I.FCN+1(R3),#IO.ATT/256. ;IS IT ATTACH OR DETACH? # BLO 220$ ;IF LO NO, READ OR WRITE  BNE 190$ ;IF NE IT IS DETACH0 MOV I.TCB(R3),R1 ;PICK UP OFFSPRING TCB ADDRESS8 MOV T.NAM+2(R1),(R0) ;INSERT 2ND WORD OF NAME (A.PRM+4)7 MOV T.NAM(R1),-(R0) ;INSERT 1ST WORD OF NAME (A.PRM+2)( BR 200$ ;BRANCH TO QUEUE AST,190$: CLR (R0) ;CLR AST PARAMETER (A.PRM+4)( CLR -(R0) ;CLR AST PARAMETER (A.PRM+2).200$: MOV R3,-(SP) ;SAVE ADDRESS OF I/O PACKET CALL 230$ ;QUEUE THE AST BLOCK, MOV (SP)+,R3 ;RESTORE ADDRESS OF I/O PACKET6210$: MOV #IS.SUC&377,R0 ;SET SUCCESSFUL RETURN STATUS BR 160$ ;COMPLETE REQUEST  I;E*; ATTEMPT TO BUFFER OFFSPRING I/O REQUEST.;A E4220$: CLR I.PRM+12(R3) ;CLEAR ALLOCATED BUFFER FIELDC BIT #U3.DBF!U3.RPR,U.CW3(R5) ;BUFFERING DISABLED OR PROMPT OUTPUT?  BNE 230$ ;IF NE YESA5 CALL $TSTBF ;SEE IF INTERMEDIATE BUFFERING POSSIBLE-1 BCS 230$ ;IF CS I/O NOT BUFFERED (NOT CKPTABLE)S, MOV R4,R1 ;PICK UP BYTE COUNT FOR TRANSFER8 ADD #4+77,R1 ;INCLUDE LINK AND SIZE WORDS, AND ROUND UP; ASH #-6,R1 ;CONVERT TO NUMBER OF SEC POOL BLOCKS REQUIREDS2 CALL $ALSEC ;ALLOCATE BUFFER FROM SECONDARY POOL' BCC 225$ ;IF CC ALLOCATION SUCCESSFUL24 CLR I.PRM+16(R3) ;CLEAR INTERMEDIATE BUFFERING FLAG BR 230$ ;.:225$: MOV R0,I.PRM+12(R3) ;SET POINTER TO ALLOCATED BUFFER MOV R0,KISAR6 ;MAP BUFFER$ MOV #4,@#140002 ;COUNT HEADER WORDS ADD R4,@#140002 ;SET BYTE COUNT6 CMPB I.FCN+1(R3),#IO.WLB/256. ;IS IT A WRITE REQUEST? BNE 229$ ;IF NE NO" MOV R3,-(SP) ;SAVE PACKET ADDRESS- MOV I.PRM(R3),R1 ;GET PHYSICAL BUFFER OFFSET 1 MOV I.PRM+2(R3),R2 ;SET SOURCE APR6 DISPLACEMENTT, SUB #20000,R2 ;CONVERT TO APR5 DISPLACEMENT& MOV R0,R3 ;SET DESTINATION APR6 BIAS! MOV R4,R0 ;SET COUNT FOR $BLXIOL2 MOV #140004,R4 ;SET DESTINATION APR6 DISPLACEMENT/ CALL $BLXIO ;TRANSFER OFFSPRING OUTPUT BUFFERF% MOV (SP)+,R3 ;RESTORE PACKET ADDRESSS3229$: CALL $INIBF ;INITIATE INTERMEDIATE BUFFERING, .;/F; QUEUE THE PARENT AST CONTROL BLOCK. PARENT AST ROUTINES ARE ENTEREDC; WITH THE FOLLOWING THREE WORDS ON THE STACK FOR OFFSPRING READ ORI; WRITE:; ); 0(SP)=UNIT NUMBER, I/O SUBFUNCTION CODE,'; 2(SP)=BYTE COUNT OF OFFSPRING REQUEST,3; 4(SP)=VERTICAL FORMAT WORD FROM OFFSPRING QIO DPBT;RC; PARENT AST ROUTINES ARE ENTERED WITH THE FOLLOWING THREE WORDS ONB$; THE STACK FOR AN OFFSPRING ATTACH:;); 0(SP)=UNIT NUMBER, I/O SUBFUNCTION CODE$); 2(SP)=FIRST WORD OF OFFSPRING TASK NAMER*; 4(SP)=SECOND WORD OF OFFSPRING TASK NAME;OC; PARENT AST ROUTINES ARE ENTERED WITH THE FOLLOWING THREE WORDS ONS$; THE STACK FOR AN OFFSPRING DETACH:;R); 0(SP)=UNIT NUMBER, I/O SUBFUNCTION CODEI ; 2(SP)=0 ; 00}}TADATADATADATADATADATADATADATADATA4(SP)=0C;T 3230$: MOV U.PTCB(R5),R0 ;PICK UP PARENT TCB ADDRESS MOV @R3,R1 ;POINT TO AST BLOCK( CALLR $QASTT ;QUEUE AST TO PARENT TASK R;WD; CANCEL I/O ENTRY POINT. ONLY OFFSPRING REQUESTS MAY BE CANCELLED,8; SINCE PARENT REQUESTS ARE ALWAYS SERVICED IMMEDIATELY.;K M:VTCAN: MOV U.RPKT(R5),R3 ;PICK UP CURRENT OFFSPRING PACKET+ BEQ 250$ ;IF EQ NO READ REQUEST IS QUEUEDT' CMP I.TCB(R3),R1 ;TCB ADDRESSES MATCH?I BNE 250$ ;IF NE NO MOV R1,-(SP) ;SAVE TCB ADDRESSD) MOV #IE.ABO&377,R0 ;SET FOR ABORT STATUSO$ CLR R1 ;ZERO SECOND WORD OF STATUS" CALL VTFIN ;COMPLETE I/O REQUEST" MOV (SP)+,R1 ;RESTORE TCB ADDRESS* TST U.PTCB(R5) ;HAS UNIT BEEN ELIMINATED?& BEQ 250$ ;IF EQ YES, LEAVE IT UNBUSY< BISB #US.BSY,U.STS(R5) ;KEEP UNIT BUSY UNTIL PARENT REQUEST8250$: MOV U.WPKT(R5),R3 ;GET ADDRESS OF OFFSPRING PACKET1260$: BEQ 175$ ;IF EQ NO WRITE REQUEST IS QUEUEDE' CMP I.TCB(R3),R1 ;TCB ADDRESSES MATCH?T BNE VTRET ;IF NE NO ) MOV #IE.ABO&377,R0 ;SET FOR ABORT STATUS#$ CLR R1 ;ZERO SECOND WORD OF STATUS" CALL VTFIN ;COMPLETE I/O REQUEST* TST U.PTCB(R5) ;HAS UNIT BEEN ELIMINATED?& BEQ 260$ ;IF EQ YES, LEAVE IT UNBUSY< BISB #US.BSY,U.STS(R5) ;KEEP UNIT BUSY UNTIL PARENT REQUEST ;UH; POWERFAIL, ONLINE/OFFLINE, AND TIMEOUT ENTRY POINTS ARE SIMPLY RETURNS;. TVTPWF: ;NO POWERFAIL ROUTINE /VTKRB: ;NO ONLINE/OFFLINE CONTROLLER ROUTINES)VTUCB: ;NO ONLINE/OFFLINE UNIT ROUTINEM VTOUT: CLC ;NO TIMEOUT ROUTINEVTRET: RETURN ;S F .DSABL LSBU ;R@; VTCHR-GET/SET CHARACTERISTICS AND GET TERMINAL SUPPORT ROUTINE;A; THIS ROUTINE IS CALLED TO PROCESS THE SF.GMC, SF.SMC AND IO.GTSLF; FUNCTIONS. IF NONE OF THOSE FUNCTIONS WERE SPECIFIED, AN INDICATIONA; IS RETURNED IN THE Z-BIT AS TO WHETHER THE FUNCTION WAS IO.STC. E; NO RETURN TO CALLER IS MADE FOR THE FUNCTIONS THIS ROUTINE HANDLES. ; ; INPUTS:I;C0; R1=I/O PACKET ADDRESS FROM OFFSPRING OR PARENT; R2=I/O FUNCTION CODE$; R5=ADDRESS OF VIRTUAL TERMINAL UCB;S ; OUTPUTS:;S7; IF FUNCTION IS IO.STC, CC-Z SET UPON RETURN TO CALLERN>; IF FUNCTION IS SF.GMC, SF.SMC OR IO.GTS, NO RETURN TO CALLER(; ELSE, CC-Z CLEAR UPON RETURN TO CALLER;N2VTCHR: CMPB R2,#IO.STC/256. ;IO.STC FUNCTION CODE? BNE VTRET ;IF NE NOB' CMP I.FCN(R3),#IO.STC ;IO.STC EXACTLY?  BEQ VTRET ;IF EQ YES" TST (SP)+ ;REMOVE RETURN ADDRESS* CMP I.TCB(R3),U.PTCB(R5) ;PARENT REQUEST? BNE 10$ ;IF NE NOF CMP (SP)+,(SP)+ ;CLEAN STACKT)10$: MOV I.PRM(R3),R0 ;GET BUFFER ADDRESSU& MOV I.PRM+2(R3),R1 ;GET BUFFER LENGTH1 CALL $ACHCK ;ADDRESS CHECK BUFFER, WORD ALIGNEDT BCS 110$ ;IF CS ERRORI, CALL $RELOC ;CONVERT TO ADDRESS DOUBLEWORD MOV R1,KISAR6 ;MAP BUFFER# MOV R2,R1 ;COPY ADDRESS OF BUFFER $ MOV R2,-(SP) ;AND SAVE IT FOR LATER CMP I.FCN(R3),#IO.GTS ;IO.GTS?E BNE 20$ ;IF NE NO ;Q; PROCESS IO.GTS;M MOV #IS.SUC,R0 ;SET SUCCESS8 MOV #TSP1,(R1)+ ;STORE FIRST WORD OF SUPPORT PARAMETERS, CMP I.PRM+2(R3),#2 ;WANTS MORE THAN 1 WORD? BEQ 160$ ;IF EQ NO# MOV #TSP2,(R1)+ ;STORE SECOND WORDE BR 160$ ;DONEK#20$: CMP I.FCN(R3),#SF.SMC ;SF.SMC?T BNE 70$ ;IF NE NOR;; PROCESS SF.SMC;T930$: CALL 200$ ;GET NEXT CHARACTERISTIC FROM USER BUFFER1 MOV R2,-(SP) ;SAVE BITMASKM5 CMPB -1(R1),#TC.FDX ;TRYING TO SET FULL DUPLEX MODE?G BNE 40$ ;IF NE NO$; CMP I.TCB(R3),U.PTCB(R5) ;PARENT TASK MAKING THAT REQUEST?S2 BNE 120$ ;IF NE NO, OFFSPRING NOT ALLOWED, ERROR140$: MOVB @R1,R0 ;GET NEW VALUE FROM USER BUFFERH"50$: ASRB R2 ;SHIFT BITMASK RIGHT BCS 60$ ;CARRY - JUMPO ROLB R0 ;SHIFT NEW VALUE LEFTC BR 50$ ;LOOP60$: ROLB R2 ;PICK UP LOST BITN% COMB R2 ;INVERT RIGHT ADJUSTED MASKC# BITB R2,(R1)+ ;NEW VALUE IN RANGE?O BNE 130$ ;IF NE NO BICB (SP)+,@R4 ;CLEAR OLD VALUE BISB R0,@R4 ;SET NEW VALUE! BR 30$ ;GET NEXT CHARACTERISTIC$#70$: CMP I.FCN(R3),#SF.GMC ;SF.GMC?A BEQ 90$ ;IF EQ YES% MOV #IE.IFC&377,R0 ;ILLEGAL FUNCTION  BR 115$ ;RETURN THE ERROR,;G; PROCESS SF.GMC;R*80$: INC R1 ;POINT TO NEXT CHARACTERISTIC990$: CALL 200$ ;GET NEXT CHAR00}} D%B11110010ACTERISTIC FROM USER BUFFER2 MOVB @R4,@R1 ;STORE CURRENT VALUE IN USER BUFFER MOVB R2,R0 ;COPY BITMASK COMB R0 ;INVERT IT$ BICB R0,@R1 ;CLEAR IRRELEVANT BITS#100$: ASRB R2 ;SHIFT BITMASK RIGHTV BCS 80$ ;CARRY - JUMPN0 RORB @R1 ;SHIFT VALUE IN USER BUFFER RIGHT TOO BR 100$ ;LOOPF;;; ERROR AND EXIT HANDLINGY;(110$: MOV #IE.SPC&377,R0 ;BUFFER PROBLEM-115$: CLR R1 ;RETURN ZERO SECOND STATUS WORDC BR 170$ ;FINISH I/OOD120$: MOV #!,R0 ;ILLEGAL CHARACTERISTIC CODE BR 140$ ;DECLARE ERROR6130$: MOV #!,R0 ;ILLEGAL VALUE-140$: DEC R1 ;BACK UP POINTER IN USER BUFFER@150$: TST (SP)+ ;CLEAN STACK$-160$: SUB (SP)+,R1 ;GET OFFSET IN USER BUFFERR$170$: CALL $IOFIN ;COMPLETE THE I/O+ JMP VTPKT ;TRY TO PROCESS ANOTHER REQUEST;;RG; ROUTINE TO RETRIEVE THE NEXT CHARACTERISTIC IN THE USER BUFFER, CHECK1B; IT FOR VALIDITY, AND RETURN THE CORRESPONDING BITMASK AND OFFSET;2%200$: MOV #IS.SUC,R0 ;ASSUME ALL DONEL$ SUB #2,I.PRM+2(R3) ;ANY MORE TO DO? BMI 150$ ;IF MI NO' MOVB (R1)+,R0 ;GET NEXT CHARACTERISTICV BEQ 120$ ;IF EQ BAD CODE5 MOV #MCTAB-2,R4 ;GET ADDRESS OF CHARACTERISTIC TABLE$>210$: CMPB (R4)+,(R4)+ ;UPDATE TO NEXT CHARACTERISTIC IN TABLE4 TSTB (R4) ;ANY MORE CHARACTERISTICS LEFT TO CHECK? BEQ 120$ ;IF EQ NO, ERRORN4 CMPB R0,(R4)+ ;FIND A MATCH BETWEEN USER AND TABLE? BNE 210$ ;IF NE NO, CLR R2 ;BE CAREFUL OF POSSIBLE SIGN EXTEND3 BISB (R4)+,R2 ;GET BITMASK FOR THIS CHARACTERISTICN2 MOVB (R4),R4 ;GET OFFSET FOR THIS CHARACTERISTIC( ADD R5,R4 ;MAKE POINTER TO BYTE IN UCB RETURN ;B;0; I/O PACKET ACCEPTANCE ROUTINE,;;4VTACC: CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ FUNCTION? BNE 10$ ;IF NE NOC* TST U.RPKT(R5) ;READ ALREADY IN PROGRESS?' BNE 50$ ;IF NE YES, CAN'T PROCESS NOW02 BIT #U3.RPR,U.CW3(R5) ;READ W/PROMPT IN PROGRESS?' BNE 50$ ;IF NE YES, CAN'T PROCESS NOW , BIT #U3.FDX,U.CW3(R5) ;IN FULL DUPLEX MODE?$ BNE 5$ ;IF NE YES, CAN PROCESS NOW: TST U.WPKT(R5) ;WRITE FUNCTION IN PROGRESS? (CLEARS CC-C)' BNE 50$ ;IF NE YES, CAN'T PROCESS NOWBB5$: MOV R1,U.RPKT(R5) ;SAVE I/O PACKET ADDRESS (LEAVES CC-C CLEAR) RETURN ;P310$: CMPB #IO.WLB/256.,I.FCN+1(R1) ;WRITE FUNCTION?  BNE 20$ ;IF NE NOK+ TST U.WPKT(R5) ;WRITE ALREADY IN PROGRESS?I' BNE 50$ ;IF NE YES, CAN'T PROCESS NOWR2 BIT #U3.RPR,U.CW3(R5) ;READ W/PROMPT IN PROGRESS?' BNE 50$ ;IF NE YES, CAN'T PROCESS NOWX, BIT #U3.FDX,U.CW3(R5) ;IN FULL DUPLEX MODE?% BNE 15$ ;IF NE YES, CAN PROCESS NOW59 TST U.RPKT(R5) ;READ FUNCTION IN PROGRESS? (CLEARS CC-C) ' BNE 50$ ;IF NE YES, CAN'T PROCESS NOWRC15$: MOV R1,U.WPKT(R5) ;SAVE I/O PACKET ADDRESS (LEAVES CC-C CLEAR)0 RETURN ;L;20$: CMPB #IO.RPR/256.,I.FCN+1(R1) ;READ W/PROMPT FUNCTION?T BNE 40$ ;IF NE NOA" TST U.RPKT(R5) ;READ IN PROGRESS? BNE 30$ ;IF NE YES, STOP SCAN#1 TST U.WPKT(R5) ;WRITE IN PROGRESS? (CLEARS CC-C)5 BNE 30$ ;IF NE YES, STOP SCANX+ MOV R1,U.WPKT(R5) ;SAVE I/O PACKET ADDRESS?6 BIS #U3.RPR,U.CW3(R5) ;SHOW READ W/PROMPT IN PROGRESS RETURN ;I830$: ADD #G$$SPA,SP ;ADD CONSTANT TO STACK TO ABORT SCAN40$: RETURN ;5)50$: SEC ;CAN'T PROCESS THE REQUEST NOWS RETURN ;C;E*; INTERMEDIATE BUFFER DEALLOCATION ROUTINE;N R VTDEA: MOV R0,KISAR6 ;MAP BUFFER MOV @#140002,R1 ;GET BYTE COUNT/ ADD #77,R1 ;ROUND UP TO NEXT 32 WORD BOUNDARYA8 ASH #-6,R1 ;CONVERT TO NUMBER OF SECONDARY POOL BLOCKS= CALLR $DESEC ;DEALLOCATE INTERMEDIATE SECONDARY POOL BUFFERC ;R+; VTFIN-FINISH VIRTUAL TERMINAL I/O REQUESTM;IH; THIS ROUTINE IS CALLED TO FINISH ALL OFFSPRING REQUESTS TO THE VIRTUALH; TERMINAL DRIVER (EXCEPT SF.GMC/SF.SMC/IO.GTS) AND PERFORM ANY CLEANUP.;R ; INPUTS:;N; R0=FIRST WORD OF I/O STATUSR; R1=SECOND WORD OF I/O STATUS); R3=ADDRESS OF I/O PACKET TO BE FINISHEDE$; R5=ADDRESS OF VIRTUAL TERMINAL UCB; ; OUTPUTS:;; NONE.R;; V*VTFIN: CMP R3,U.WPKT(R5) ;OFFSPRING WRITE? BNE 5$ ;IF NE NO& CLR U.WPKT(R5) ;SHOW NO WRITES ACTIVE) BIT #U3.RPR,U.CW3(R5) ;READ WITH PROMPT?  BEQ 7$ ;IF EQ NO700}}TADATADATADATADATADATADATADATADATA MOV I.PRM+10(R3),I.PRM(R3) ;SET INPUT BUFFER APR6 BIASE< MOV I.PRM+16(R3),I.PRM+2(R3) ;SET INPUT BUFFER DISPLACEMENT6 MOV I.PRM+14(R3),I.PRM+4(R3) ;SET INPUT BUFFER LENGTH* CLR I.PRM+16(R3) ;CLEAR BUFFERED I/O FLAG9 MOVB #IO.RLB/256.,I.FCN+1(R3) ;CHANGE FUNCTION TO IO.RLBE0 MOV R3,U.RPKT(R5) ;CHANGE IO.RPR INTO AN IO.RLB; BIC #U3.RPR,U.CW3(R5) ;FORGET WE WERE PROCESSING AN IO.RPRB% TSTB R0 ;ANY ERROR DETECTED SO FAR? BMI 6$ ;IF MI YES, END IT HERE; JMP VTCHK ;JUMP BACK TO HANDLE THE READ PORTION OF IO.RPR(&5$: CMP R3,U.RPKT(R5) ;OFFSPRING READ? BNE 10$ ;IF NE NO,(6$: CLR U.RPKT(R5) ;SHOW NO READS ACTIVE'7$: TST I.PRM+16(R3) ;WAS TASK STOPPED?T BEQ 10$ ;IF EQ NOI1 INC I.PRM+16(R3) ;SET SECONDARY POOL BUFFER FLAG/- CALLR $QUEBF ;COMPLETE BUFFERED I/O REQUESTM(10$: CALLR $IOFIN ;COMPLETE I/O REQUEST B .END#U3.RPR,U.CW3(R5) ;FORGET WE WERE PROCESSING AN IO.RPRB% TSTB R0 ;ANY ERROR DETECTED SO FAR? BMI 6$ ;IF MI YES, END IT HERE; JMP VTCHK ;JUMP BACK TO HANDLE THE READ PORT .TITLE XEDRV - QIO UNA driver .IDENT /03.00/ .ENABL LC;C; COPYRIGHT (C) 1988T/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.Q;$>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O>; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; MODULE DESCRIPTION;A8; UNA QIO Driver. This driver attempts to simulate theA; the DECnet Direct Line Access (DLX) functionality for the UNA.D;N;H); DISTIBUTED SYSTEMS SOFTWARE ENGINEERINGA;/; MODIFIED FOR RSX-11M-PLUS V3.0 UPDATE B BY:T; ;J; A. Kojnok 06-Aug-85 D; Added line of code to INIXM routine to load R5 with Port !; Status Table address. E;O; A. Kojnok 12-Aug-85 C; Corrected the CHKERR subroutine. The poll flag was set LD; and cleared incorrectly. Removed clearing the CS.POL ?; flag bit from PDMDON interrupt service entry routine and (; put it in FNINI routine.;N; A. Kojnok 20-Aug-85ED; Added test to INIXM routine to see if a transmission is F; already in progress. If yes, wait for transmit interrupt &; to initiate next transmit.; ; A. Kojnok 22-Oct-85dL; New code was added to the XMTINT routine to replace the call to M; GTPST subroutine. The code was added to test for the case where lK; the port was close before the xmit has been completed. In sucheJ; a case the Port Status Table addr saved in the task header is 4; zero and will cuase the driver to crash.;i; A. Kojnok 22-Oct-85 K; The time out value for the reset function in CTINI routine has eK; been changed to the time out value used for self test. This ishI; due because the DELUA for the reset tests if a self test has e?; already been run. If not, a self test is executed.t;s; L. Kogan 15-Nov-85 2.01 7; LK705 -- Added Adam Kojnok's changes to RSX packsT;e;d;a; MODIFIED FOR RSX-11M V4.4 BY: ; ;e; L. KOGAN 19-Nov-87 03.00:; LK729 -- Do not stop clock on a running driver;t l< .SBTTL ****************************************************< .SBTTL * UNA Driver Data Structures And Offset Definitions*< .SBTTL ****************************************************.IF NDF L$LIST .IIF NDF L$$IST,.NLISTr .IIF NDF L$$IST,.DSABL CRFx.ENDCt .SBTTL Register Conventions; 0; **************************00}} D%B11110010********************0; * Register Conventions used by this driver *0; **********************************************; ;24; R5 = Almost always points to the Port State Table:; R4 = Almost always points to the Controller State Table; R3 = I/O packet; R2 = Work registerf9; R1 = Ring routines use it to return ring entry address*; R0 = Work registerI;D I .SBTTL Local Macros;S; INTERNAL MACRO DEFINITIONS;.MACRO .DSECT START,CREF.IIF B , .DSABL CRF*.IIF DF L$$IST, .DSABL CRF.ASECT. = 0 .IIF DF L$$IST, .ENABL CRF.IIF B , .ENABL CRF*.IF NB . = START*.ENDC* .ENDM .DSECT.MACRO .BSECT START,CREF.IIF B , .DSABL CRFR.IIF DF L$$IST, .DSABL CRF.ASECT. = 1S.IF IDN ,. = 400 .ENDCo.IIF DF L$$IST, .ENABL CRF.IIF B , .ENABL CRFn .ENDM .BSECT.MACRO .ASSUME ARG1,COND,ARG2.IF COND -.IFF.ERROR ARG1 ;"COND ARG2" fails.ENDCO .ENDM .ASSUMER.MACRO APR5PC SUBNAMPC$$$$=.-IMPUR.IF GT 20000-PC$$$$A.IFF7.ERROR ; Subroutine "SUBNAM" out of APR5 address space .ENDCI .ENDM APR5PC .MACRO $QPKT,QUEUED JSR R0,QPAKTC .WORD QUEUE, .ENDM $QPKT .MACRO $DQPKT,QUEUE JSR R0,DQPAKA .WORD QUEUE .ENDM $DQPKT  T .SBTTL UNA conditionals;I; UNA conditionals;F4KISAR5 = 172352 ; Kernel instruction PAR 5 address4KISAR6 = 172354 ; Kernel instruction PAR 6 address-KDSAR5 = 172372 ; Kernel data PAR 5 addressS-KDSAR6 = 172374 ; Kernel data PAR 6 addressI; .IIF NDF U$$NCT .ERROR ; Number of controllers not definedAD .IIF NDF U$$NPC .ERROR ; Number of ports per controller not defined7 .IIF NDF U$$NRS .ERROR ; Receive ring size not definedT8 .IIF NDF U$$NTS .ERROR ; Transmit ring size not defined9 .ASSUME U$$NCT GE 1 ; Number of controllers must be GE 1A> .ASSUME U$$NPC GE 1 ; Number of ports/controller must be GE 15 .ASSUME U$$NRS GE 1 ; Receive ring size must be GE 176 .ASSUME U$$NTS GE 1 ; Transmit ring size must be GE 1 d .SBTTL System macros.* .MCALL PKTDF$,UCBDF$,DLXDF$,CHRDF$,EPMDF$# .MCALL TCBDF$,SCBDF$,PCBDF$,HDRDF$  .IF DF R$$MPL ; If RSX-11M+ .MCALL KRBDF$,CTBDF$N% CTBDF$ ; Controller Table OffsetsT KRBDF$ ; Define KRB offsetsm .ENDC& PKTDF$ ; Define I/O packet offsets UCBDF$ ; Define UCB offsetsA DLXDF$ ; Define DLX offsetsf% CHRDF$ ; Define other DLX offsetsE* EPMDF$ ; Ethernet protocol module defs TCBDF$ ; Define TCB offsetsi& SCBDF$ ,,SYSDEF ; Define SCB offsets PCBDF$ ; Define PCB offsetsU' HDRDF$ ; Define Task Header offsets$ F .SBTTL Controller State Table;-H; Controller state table offsets. The controller state table resides atD; the beginning of the driver for APR5 mapping reasons. Some of theK; controller state table buffers reside in the permanently mapped with UMRs G; region at the end of the driver. Each of these buffers have pointerse; to them in the table.T;+ .DSECTf!C.FLAG: .BLKW 1 ; UNA flags byte / ; UNA software flag bits (used in C.FLAG)s+ CS.PWF = 2 ; Power fail processing flag$/ CS.SER = 10 ; Status error encounteredo' CS.INT = 40 ; Interrupt pendingl4 CS.ENP = 100 ; Receive end packet encountered/ CS.POL = 200 ; UNA poll function neededt% CS.GST = 400 ; Get status nexte; CS.INI = 1000 ; Controller initialization in progressi$ CS.STP = 2000 ; Device stopped) CS.OFL = 100000 ; Controller offlinef .0C.OPRT: .BLKW 1 ; Count of number of ports open&C.PORT: .BLKW 1 ; Port list ROOT word*C.PROL: .BLKW 2 ; Protocol list root word1C.PCBP: .BLKW 1 ; UNA Port Control Block pointerN0C.UDBP: .BLKW 1 ; UNA Unibus Data Block pointer7C.INIW: .BLKW 1 ; Controller init completed wait queue0+C.RTRY: .BLKW 1 ; Initialize retry counter #C.INDX: .BLKW 1 ; Controller index ; H; These pointers are used by the diagnostic non-DLX function processors.; +C.KIR6: .BLKW 1 ; Non-DLX KISAR6 save areaf,C.DGBP: .BLKW 1 ; Diagnostic buffer pointer0C.DGBE: .BLKW 1 ; D00}}TADATADATADATADATADATADATADATADATAiagnostic buffer end pointer5C.DGBS: .BLKW 1 ; Start address of diagnostic bufferK;;=; These pointers are used by the function processing routines ;a6C.CFNC: .BLKW 1 ; Address of I/O packet for which the- ; ... current function is being performed ?C.FUNS: .BLKW 1 ; Current primary/secondary function save areas1C.PFNC: .BLKW 1 ; Pending control function queuei)C.CTMR: .BLKW 1 ; Control function timerD;S+; RECEIVE PROCESSING POINTERS AND WORK AREA ;f(C.RCVB: .BLKW 1 ; RCV ring base address-C.RCVF: .BLKW 1 ; RCV ring next free addressd1C.RCVC: .BLKW 1 ; RCV ring current entry addressa&C.RSEQ: .BLKW 1 ; RCV sequence number!C.RCVW: .BLKW 1 ; RCV wait queueo)C.RCVD: .BLKW 1 ; RCV pending completionn*C.RBFL: .BLKW 1 ; RCV receive buffer list3C.RML: .BLKW 1 ; RCV received message length.C.POVH: .BLKW 1 ; RCV protocol overhead7C.STRT: .BLKW 1 ; RCV Start buffer addr of current rcvE; -; TRANSMIT PROCESSING POINTERS AND WORK AREAS ;K(C.XMTB: .BLKW 1 ; XMT ring base address3C.XMTF: .BLKW 1 ; XMT ring next free entry address;1C.XMTC: .BLKW 1 ; XMT ring current entry address;2C.XSEQ: .BLKW 1 ; XMT ring entry sequence numbersC.XMTT: .BLKW 1 ; XMT timer1C.XMWQ: .BLKW 1 ; XMT FIFO I/O packet wait queueb/C.XMTP: .BLKW 1 ; XMT pending completion queuem<C.XHDR: .BLKW 1 ; XMT dest-source-protocol-byte.count) ; buffers list (Transmit Headers) ;r; CONTROLLER INTERNAL SAVE AREAS; ( ; Controller internal info save area1C.LOAD: .BLKW 1 ; Work area during load + C.PADDT/C.PADD: .BLKW 3 ; Node address (SEE C.LOAD!!!);+C.MODE: .BLKW 1 ; UNA default MODE (14001)K, ; UNA will pad short transmit messages# ; Enable H4000 collision testK ; Enable Half Duplex modeu%C.MCDV: .BLKW 1 ; Micro code versionm2C.MLT: .BLKW 1 ; # of multicast addresses enabled,C.PSTA: ; Last read port status save area,C.RREV: .BLKW 1 ; Microcode revision number-C.MMAX: .BLKW 1 ; Max number of mulicast IDsn3C.MXCT: .BLKW 1 ; Max length of counter data blockd$C.WRKP: .BLKW 1 ; Work area pointer .IF DF R$$MPL ; If RSX-11M+0C.CTB: .BLKW 1 ; CTB - Controller Table for KRB0C.KRB: .BLKW 1 ; KRB - Controller Request Block .ENDC*C.UCB: .BLKW 1 ; UCB - Unit Control Block,C.SCB: .BLKW 1 ; SCB - Status Control Block4C.DCB: .BLKW 1 ; DCB - Device Control Block Address)C.CSR: .BLKW 1 ; CSR for this controllerB$C.LOG: .BLKW 10. ; Error log packet)C.LEN =. ; Controller DState Table sizen X .SBTTL Port State Table Offsets;d; Port State Table Offsets;; .DSECTa&P.NXTP: .BLKW 1 ; Next port link word!P.FLAG: .BLKW 1 ; Port flag wordo# PS.OPN = 1 ; Port open flag bit < PS.DER = 2 ; Delayed error - Dropped a received message6 PS.XIN = 4 ; Line requires init function (IO.XIN) PS.ADR = 10 ; Address found! PS.PRO = 20 ; Protocol found) PS.MLC = 40 ; Multicast list changed%P.PTCB: .BLKW 1 ; Owning TCB address.P.LUN: .BLKW 1 ; Owning LUN%P.MCST: .BLKW 2 ; Multicast listheadb;OI; Used by Auxilliary buffer processor to save addr info for driver duringx; transmit processing.;B:P.XDAD: .BLKW 3 ; Holds Ethernet address for transmission;P.XPRO: .BLKW 1 ; Holds Ethernet protocol for transmissiona;I; Used by Auxilliary buffer processor to save addr info for driver duringA; receive processing.=; >P.RDAD: .BLKW 3 ; Holds Ethernet destination addr for receive>P.RSAD: .BLKW 3 ; Holds Ethernet destination addr for receive6P.RPRO: .BLKW 1 ; Holds Ethernet protocol for receive%P.RCVT: .BLKW 1 ; Receive timer save 1P.CTBL: .BLKW 1 ; Controller state table pointer.$P.WORK: .BLKW 4 ; General work area%P.LENG: ; Port data structure sizeK .SBTTL Protocol entry offsets;s; Define protocol list entries;b .DSECTcPL.LNK: .BLKW 1 ; Link word!PL.FLG: .BLKB 1 ; Protocol flags=- LF.EXC = LF$EXC ; Exclusive access protocolt( LF.DEF = LF$DEF ; Default user defined- LF.PAD = LF$PAD ; Protocol requires paddingPPL.USE: .BLKB 1 ; Use c00}} D%B11110010ountPL.PRO: .BLKW 1 ; ProtocolT$PL.DEF: ; Pointer to default port,PL.EXC: .BLKW 1 ; Pointer to exclusive port)PL.ADD: .BLKW 2 ; Address chain listheadE*PL.LEN: ; Length of protocol list entry# .SBTTL Address chain entry offsetsp;o; Address chain entriesS;c .DSECT AD.LNK: .BLKW 1 ; Link word#AD.ADD: .BLKW 3 ; Ethernet address )AD.PRT: .BLKW 1 ; Address of owning portE'AD.LEN: ; Address chain entry lengthA% .SBTTL Multicast address chain entryL; !; Multicast address chain entries ;; .DSECTTML.LNK: .BLKW 1 ; Link pointer $ML.ADD: .BLKW 3 ; Multicast address1ML.LEN: ; Multicast address chain entry lengthh* .SBTTL UNA hardware interface definitions;0; UNA CSR/Data Structure Offsets and Definitions; ; CSR offsets; .DSECTPCSR0: .BLKW ; Primary CSR(PCSR1: .BLKW ; State and self-test CSR#PCSR2: .BLKW ; Buffer address CSRE.PCSR3: .BLKW ; Buffer address (extended) CSR;B; PCSR0 bit definitionsi;n*R0.SEI = 100000 ; Status Error Interrupt+R0.CEI = 40000 ; Command Error Interruptn*R0.RXI = 20000 ; Receive Ring Interrupt+R0.TXI = 10000 ; Transmit Ring Interruptn-R0.CSI = 4000 ; Command Success Interruptt8R0.RUI = 2000 ; Receive Buffer Unavailable InterruptR0.RSV = 1000 ; RESERVED)R0.FEI = 400 ; Fatal Error Interrupt.)R0.INT = 200 ; Interrupt Summary BitL(R0.IE = 100 ; Interrupt Enable Bit!R0.RST = 40 ; UNA Reset BitB*R0.RMT = 20 ; UNA Remote Console Bit$R0.PCM = 17 ; UNA Command Bits; !; UNA primary command definitions;RCM.NOP = 0 ; NOP*CM.GPB = 1 ; Get Control Block Address*CM.GCM = 2 ; Get Control Block Command"CM.SLF = 3 ; Self Test Command'CM.STR = 4 ; Start Transmit/ReceiveuCM.BOO = 5 ; Boot CommandDCM.PDM = 10 ; Polling Demand CM.TMO = 11 ; Sanity Timer On!CM.TMF = 12 ; Sanity Timer Off0#CM.TMR = 13 ; Sanity Timer Reset #CM.STP = 17 ; Stop UNA Operation ! .SBTTL CSR1 register definitions=; ; PCSR1 bit definitions;,R1.PWR = 100000 ; Transceiver Power Status ; 0 = failure, 1 = OK1"R1.CAB = 40000 ; Cabling Status ; 0 = failure, 1 = OKo/R1.SLF = 37400 ; Self-test Return Code FieldM%R1.CER = 200 ; Command Error Bit#R1.STA = 7 ; UNA State FieldM;0); UNA hardware state bits (Used in C.STA)t;iST.RST = 0 ; Reset State#ST.PRI = 1 ; Primary Load State ST.RDY = 2 ; Ready StateST.RUN = 3 ; Running State$ST.UHL = 5 ; UNIBUS Halted State ST.NHL = 6 ; NI Halted State+ST.HLT = 7 ; UNIBUS and NI Halted State & .SBTTL UNA Port Control Block offsets; ; Port Control Block offsets;o .DSECT CB.CMD: .BLKB 1 ; Function Byte$CB.MBZ: .BLKB 1 ; Must Be Zero Byte'CB.ADD: ; Physical Address(1st word)i,CB.UDB: .BLKW 1 ; UNIBUS Data Block Address2CB.MAX: ; Max multicast addr allowed for device1CB.UD2: ; UNIBUS Data Block Address (Extended)y-CB.AD2: .BLKB 1 ; Physical Address(2nd word) 'CB.LEN: .BLKB 1 ; Length of Data Block +CB.LN2: ; Alternate Length of Data Block -CB.AD3: .BLKW 1 ; Physical Address(3rd word)r$CB.SIZ: ; Port Control Block Size .SBTTL Ring Descriptor Block ; :; Ring Descriptor Block (Used for codes FN.RRG and FN.WRG);D .DSECTy-RD.XMB: .BLKW 1 ; Transmit Ring Base AddressI0RD.XME: .BLKB 1 ; Transmit Ring Base (Extended)-RD.XML: .BLKB 1 ; Transmit Ring Entry Lengtha2RD.XMN: .BLKW 1 ; Transmit Ring Number of Entries,RD.RCB: .BLKW 1 ; Receive Ring Base Address7RD.RCE: .BLKB 1 ; Receive Ring Base Address (Extended)t,RD.RCL: .BLKB 1 ; Receive Ring Entry Length1RD.RCN: .BLKW 1 ; Receive Ring Number of Entries'RD.SIZ: ; Ring Discriptor Block Size  .SBTTL Line status bits;e5; Line status bits (Used for codes FN.RLS and FN.CLS)T;s-LS.ERR = 100000 ; Logical OR of Status Bitss'LS.MER = 40000 ; Multiple Errors Bit +LS.CDF = 20000 ; Collision Detect Failed LS.RSV = 10000 ; Reserved Bit!LS.TME = 4000 ; Timeout Error 'LS.RRE 00}}TADATADATADATADATADATADATADATADATA= 1000 ; Receiver Ring ErrorR'LS.XRE = 400 ; Transmit Ring ErrorK#LS.RAM = 100 ; RAM operationalR!LS.REV = 77 ; ROM REV Levelo .SBTTL Ring entry offsets;t; Ring entry offsets;T .DSECTa!RG.LEN: .BLKW 1 ; Segment Length("RG.ADD: .BLKW 1 ; Segment Address-RG.AD2: .BLKB 1 ; Segment Address (Extended)tRG.FLG: .BLKB 1 ; Flags Bytee*RG.RLN: .BLKB 1 ; Received Message Length/RG.ERR: .BLKB 1 ; Error Word (and TDR or MLEN).RG.ACT: .BLKB 1 ; Ring Entry Active Flag Byte-RG.SEQ: .BLKB 1 ; Ring Entry Sequence Number 9RG.UMR: .BLKW 1 ; UMR assignment block save during xmitsR4RG.VAD: .BLKW 1 ; Virtual Address of receive buffer'RG.LNK: .BLKW 1 ; Ring Entry Link WordsRG.SIZ: ; Ring Entry Size;S ; Ring flag byte bit definitions;g#RF.OWN = 200 ; UNA Ownership Bite' ; 0=Owned by driver, 1=Owned by UNA;$RF.ERR = 100 ; Combined Error Bit'RF.FRM = 40 ; Receive Framing Errorr(RF.OFL = 20 ; Receive Overflow Error2RF.MOR = 20 ; Transmit Multiple Retries Needed#RF.CRC = 10 ; Receive CRC Error +RF.ONE = 10 ; Transmit One Retry Neededm;RF.MLT = 4 ; Receive No Multicast Error(Set by driver)G*RF.DEF = 4 ; Transmit Packet Deferred!RF.STP = 2 ; Start of PacketiRF.ENP = 1 ; End of Packet9RF.OPN = 200 ; Open circuit(Set by driver in low byte)e:RF.SHT = 100 ; Short circuit(Set by driver in low byte);M!; Ring error word bit definitions;O'RE.BFL = 100000 ; Buffer Length ErrorM(RE.UTO = 40000 ; UNIBUS Timeout Error1RE.NCH = 20000 ; No Data Chaining Enabled(RCV) -RE.LCL = 10000 ; Late Collision Error(XMT) .RE.LCR = 4000 ; Loss of Carrier Error(XMT)0RE.RTY = 2000 ; Retries Execeeded Error(XMT)7RE.CIR = 14000 ; Short or Open Circuit (w/TDR value)f RE.TDR = 1777 ; TDR Bit Mask4RE.MLN = 7777 ; Received Message Length Bit Mask .SBTTL UNA MODE bit definitions;M; UNA MODE bit definitionsi;n7MD.PRM = 100000 ; UNA will accept all incoming frames 8MD.ENL = 40000 ; UNA will accept all multicast frames1MD.DRC = 20000 ; Disable receive data chaininge8MD.TPD = 10000 ; UNA will pad short transmit messages/MD.ECT = 4000 ; Enable H4000 collision teste8MD.DMT = 1000 ; Disable maintainence messages (loop,* ; boot, request ID, memory load)(MD.DTC = 10 ; Disable transmit CRC.MD.LOO = 4 ; Enable controller loopback+MD.HDX = 1 ; Enable Half Duplex mode0 .SBTTL DIAGNOSTIC (non DLX functions) FUNCTIONS;D*; DIAGNOSTIC (non DLX functions) FUNCTIONS; D; The following diagnostic functions will have the following format:;0; C.TYP = Function codea; C.DATI = Not Used-; C.DATO = Size of buffer starting at C.CHRLD$; C.STAT = Status Code (See CHRDF$)'; C.CHRL = Start of Input/Ouput Buffer ; ; OCTAL WORDS ; BUFFER SIZE"; FUNCTION REQUIRED;o;a; CONTROL BLOCK FUNCTIONSb;H%FN.NOP = 0 ; NOP Function 33C2FN.LSM = 1 ; Load and Start Microaddress 14FN.RDA = 2 ; Read Default Physical Address 3-FN.RPA = 4 ; Read Physical Address 3:-FN.WPA = 5 ; Write Physical Address 3o4FN.RML = 6 ; Read Multicast List From UNA 366FN.WML = 7 ; Write Multicast List To UNA (illegal)5FN.RRG = 10 ; Read Ring Format (illegal) 5FN.WRG = 11 ; Write Ring Format (illegal) &FN.RCN = 12 ; Read Counters 40.FN.CCN = 13 ; Read and Clear Counters 40&FN.RMD = 14 ; Read UNA Mode 1&FN.WMD = 15 ; Write UNA Mode 1(FN.RLS = 16 ; Read Line Status 104FN.CLS = 17 ; Read and Clear Line Status 10"FN.DMP = 20 ; Dump Internal RAM"FN.LOA = 21 ; Load Internal RAM-FN.RSY = 22 ; Read System ID Max 144 .FN.WSY = 23 ; Write System ID Max 144/FN.RSA = 24 ; Read Load Server Address 3R4FN.WSA = 25 ; Write Load Server Address 3; Software functions%FN.DIG = 26 ; Get Diagnostic Data., ; This function code is used to disp00}} D%B11110010atch/ ; ... to the diagnostic functions processor;0FN.UML = 27 ; UNA microcode support task wait.' ; This function is used to time out0+ ; ... a response from the support task. ) .SBTTL Receive Buffer Offset Definitions ; #; Receive Buffer Offset Definitionse;D .DSECTxM.LNK: .BLKW 1 ; Link wordo$M.ERR: .BLKW 1 ; Error status bytes+ ; Low byte = RDRB+5, High byte = RDRB+7 1 ; (RDRB means Receive Descriptor Ring Buffer)i*M.MLEN: .BLKW 1 ; Lenth of data in buffer&M.DADD: .BLKW 3 ; Destination address!M.SADD: .BLKW 3 ; Source address M.PRO: .BLKW 1 ; Protocol-M.DATA: .BLKW 1 ; Start of data (No padding)0'M.PDTA: .BLKW 1 ; Start of padded dataa .BLKW 255. ; Data buffer .BLKW 2 ; Room for CRC2M.DBSZ = .-M.DATA ; Receive data buffer area size M.SIZE: ; Receive buffer size% .SBTTL Other offsets and definitions ;y; Timer values;y0RSTIM = 10 ; Timeout value for reset command,SLFTIM = 16 ; Timeout value for self-test3CNTTIM = 2 ; Timeout value for control functions,XMTTIM = 30 ; Timeout value for transmits5UMLTIM = 180. ; UNA microcode support task responsep ; ... timeout value.0RETRYC = 3 ; Controller initialize retry count" .IF NDF R$$MPL ; If NOT RSX-11M+4U.UCBX = U.CNT ; Define U.UCBX for none M+ systems .ENDC ; R$$MPL+SENDBK = 8. ; Send and request block size'FCOPN = 33 ; Open function code valuem;v; Maximum trasmit buffer size ;65; 1518.-u;a:XMTBSZ = 1518.-<6+6+2+2+4> ; Maximum transmit buffer size0UMRWBS = 20. ; UMR wait block size 10. words; ; DEFINE BITS; BIT0 = 1uBIT1 = 2;BIT2 = 4aBIT3 = 10BIT4 = 20 BIT5 = 40+BIT6 = 100TBIT7 = 200XBIT8 = 400eBIT9 = 1000RBIT10 = 2000BIT11 = 4000BIT12 = 10000BIT13 = 20000BIT14 = 40000BIT15 = 100000) .SBTTL Error Log Definitions and Offsetsd;S; Error log typesB;C$ER.SER = 1 ; Status Error Interrupt%ER.STC = 2 ; Status Change InterruptMER.RCV = 3 ; Receive ErrorcER.XMT = 4 ; Transmit Error2ER.RBU = 5 ; Receive Buffer Unavailable Interrupt)ER.FCI = 6 ; Fatal controller initialize ; ; Error log offsetsI;  .DSECTT&E.LENG: .BLKW 1 ; Error packet lengthE.TYPE: .BLKB 1 ; Error type0$E.TMO: .BLKB 1 ; Time out flag byteE.CSR0: .BLKW 1 ; PCSR0E.CSR1: .BLKW 1 ; PCSR1$E.PCB: .BLKW 4 ; Port control block1E.FLG: .BLKB 1 ; Flag byte of xmt/rcb ring entry 2E.ERR: .BLKB 1 ; Error byte of xmt/rcv ring entryE.MODE: .BLKW 1 ; Mode bits!E.SIZE: ; Size of error packett ( .SBTTL UMR mapped communications region;rH; This area consists of various buffers that must reside in a UMR mappedI; region. Therefore, these buffers will be a part of the permanently UMREF; mapped region after the driver code. The controller state table has/; pointers that point to each of these buffers.o;c*C.WKSZ = 140. ; Controler work area size .DSECTr;C.PCB: .BLKB CB.SIZ ; UNA Port Control Block Buffer (PCBB)y;C.UDB: .BLKB RD.SIZ ; UNA Unibus Data Block Buffer (UDBB)c+C.RRNG: .BLKB U$$NRS*RG.SIZ ; RCV ring areanLC.XRNG: .BLKB *2; XMT ring area (2 entries for each transmit),C.XHED: ; Start of transmit header buffer .REPT U$$NTS ;; .BLKB 2+6+6+2+2 ; XMT Link-Dest-Source-Protocol-Byte.count  ; ... bufferse .ENDR .BLKW C.WKSZ ; Work buffer)C.BASZ: ; UMR mapped buffers area size  o" .SBTTL I/O Packet Usage By Driver;L; I/O Packet extension offsets; .IP.EXT = I.PRM ; I/O packet extension pointer .DSECTk/IX.ADR: .BLKW 1 ; I/O buffer addr (high order)C:IX.AUX: .BLKW 1 ; APR6 bias of Aux.characteristics buffer:IX.DIG: .BLKW 1 ; APR6 bias of optional diagnostic buffer-IX.FCN: .BLKW 1 ; Non-DLX function save area6&IXSIZE: ; I/O packet extension size;n;; I/P Packet Parameter Area.K; +-----------------------------------------------------------------------+oK; |Extn Ptr| P1 | Siz00}}TADATADATADATADATADATADATADATADATAe | P2 | Size | P3 | Size |Not used|K; +-----------------------------------------------------------------------+;; I.PRM |9; | +- Low 16 bits of buffers physical addressi; |f ; | I/O Packet Extension0; | +-----------------------------------+0; +--> |P1 Bias |P2 Bias |P3 Bias |Scratch |+; +-------------------------------------+m ; | V,; | +- High bits of P1 physical address; |-; V- ; IX.PRM; ; I/O Packet Use For RECEIVES ; =========================== ; ; While in receive wait queue-; ----------------------------; ; I.FCN - Receive wait timer D; I.PRM - This word will be pointing to the I/O packet extension.7; I.PRM+2 - I/O status save when receive is completed.- ; I.PRM+4 - Receive byte count.(; IX.FCN - Hold address of owning port; ; While in function wait queue; ----------------------------; D; I.PRM - This word will be pointing to the I/O packet extension.; IX.FCN - Function code.; ; I/O Packet Use For TRANSMITS; ============================; ; While in transmit queues; ------------------------;i; I.FCN - Retry countD; I.PRM - This word will be pointing to the I/O packet extension.9; I.PRM+2 - I/O status save when transmit has completed.b$; I.PRM+4 - Transmitted byte count.C; IX.FCN - Holds protocol flag bits while in transmit wait queue.-A; IX.FCN - Holds the following while in transmit pending queue:O2; Low byte = flag byte of transmit ring entry4; High byte = error byte of transmit ring entry; ; While in Function Queues; ------------------------; ; I.FCN - Retry counterI; I.PRM - This word will be pointing to the I/O packet extension. TheoC; I/O packet extension will be used to store the relocationR1; bias for each buffer in the I/O packet.p; IX.FCN - Function code.a; ,; I/O Packet Use For SET/GET CHARACTERISTICS,; ==========================================; I; I.PRM - This word will be pointing to the I/O packet extension. TheaA; I/O packet extension will be used to store the relocation-/; bias for each buffer in the I/O packet. :; IX.FCN - Function code. (when setting multi cast addr); 7; I/O Packet Use For CONTROL FUNCTION (Micro code load)t7; ===================================================== ;k!; I.PRM - I/O packet extension&; I.PRM+2 - Virtual address of buffer; I.PRM+4 - Buffer size%; I.PRM+6 - End of buffer +1 pointerR; ; IX.FCN - Function ; .IF NDF L$LIST .IIF NDF L$$IST,.LIST .IIF NDF L$$IST,.ENABL CRF .ENDCo< .SBTTL ****************************************************< .SBTTL * UNA QIO Processing Routines *< .SBTTL **************************************************** .PSECT ; UNA driver PSECT=L$LIST = 0 ; List prefix filek%UNAST: ; UNA driver start address  ; *** NOTE ***d$ ; This module must be the first# ; ... module in the task buildn  .SBTTL Driver Impure Area;+; Driver Impure Area;-IMPUR:6 .REPT U$$NCT ; Make room for controller state tables8 .BLKB C.LEN+ ; ... and port state tables .ENDRIMPRE: ; End of impure area@RELCT: .WORD -1,-1 ; Relocation constant used to compute Unibus1 ; ... address within the UMR mapped region ofT/ ; ... the driver. Initially -1 to indicatee) ; ... driver needs to be initialized. & .IF NDF R$$MPL ; If NOT RSX-11M-PLUS;CNTBL: .BLKW U$$NCT ; UCB save table for interrupt service .ENDC ; R$$MPL >CTABL: .BLKW U$$NCT ; Controller Table Pointers. Indexed via ; ... controller index.P*ENDCTB: .WORD 0 ; End of controller table"DAPR6: .BLKW 1 ; Driver APR6 save+UABKS: .WORD 0 ; UMR assignment block savet+MLTCB: .WORD 0 ; Microcode loader TCB savee>CVIRA: .WORD CBASE ; Virtual address of CBASE. used by UNAIN.9CACUM: .WORD 0 ; Time accumulator, used by CLOCK routineN'CLKBK: .WORD 0 ; Clock Block save area:=CTPTR: .WORD 0 ; Current controller p00~} D%B11110010ointer. Used by CLOCK.C$CLKFG: .BYTE 0 ; Clock running flag .EVEN .IF DF R$$MPL:CSCRET: .BLKW 1 ; Controller Status Change return address .ENDC t& .SBTTL $XETBL - Driver dispatch table&$XETBL::.WORD XEINI ; Initialization .WORD XECAN ; Cancel I/O  .WORD XETMO ; Timeout .WORD XEPWF ; Powerfail .IF DF R$$MPL) .WORD XECSC ; Controller status changee0 .WORD XETMO ; Unit status change (do nothing)$ .ASCII /XE/ ; Generic device name' .WORD $XEINT ; Interrupt entry pointe# .WORD 0 ; End of interrupt entry .XECTB: .WORD 0 ; Pointer to KRB table in CTB $XETBE::.WORD 0 ; End of table .ENDC;+G; QIO$ validation table. Each entry consistes of two words as follows: ;N; .BYTE SUB FUNCTION MASKDD; .BYTE BIT 200 SET --> FUNCTION INVALID IF LUN NOT ALREADY IN USE; (NO OPEN HAS BEEN ISSUED)%; .WORD ADDRESS OF FUNCTION PROCESSOR;-3QIOTBL: .WORD 100370,XECLN ; Close LUN (FC = 7)X1 .WORD 100370,XEXMT ; Write (FC = 31, IO.XTM)r0 .WORD 100370,XERCV ; Read (FC = 32, IO.XRC)0 .WORD 000370,XEOPN ; Open (FC = 33, IO.XOP)1 .WORD 100160,XETRM ; Close (FC = 34, IO.XTR)+5 .WORD 100370,XEINL ; Initialise (FC = 35, IO.XIN) 2 .WORD 000200,XECTL ; Control (FC = 36, IO.XTL)8 .WORD 100360,XECHR ; Characteristics (FC = 37, IO.XCH) N' .SBTTL XEINI - I/O request initiationW;+!; **-XEINI-I/O request initiation;IG; This routine is entered from the EXEC when an I/O packet is available;E; for processing. The request parameters must be validated within theI; context of the calling task.; ; NOTEB; UC.QUE bit is set in U.CTL of the UCB. Therefore, the EXEC doesC; not queue requests for the driver. The driver itself keeps trackEA; of the it's I/O packets. Thus the driver does not call $GTPKT.r;- ; Inputs:, ; R1 = Address of the I/O packet&; R4 = Address of status control block$; R5 = Address of unit control block;e'; Outputs: (to QIO processing routines)k*; R2 = LUN on which the request was issued; R3 = Address of I/O packet*; R4 = Address of requesting task's header-; (Task header will be mapped on RSX11M-Plus) /; R5 = Address of Port State Table (if present)e;s!XEINI: NOP ; Word for patchingl .IF DF DEBUG  BPT .ENDC' .IF NDF R$$MPL ; If NOT RSX-11M-PLUSG MOV U.SCB(R5),R3 ; R3 = SCBd* MOV S.CON(R3),R3 ; R3 = Controller index; MOV R5,CNTBL(R3) ; Save UCB pointer for interrupt routine .ENDC ; R$$MPL% CMP RELCT,#-1 ; Driver initialized?h BEQ IEABO ; Nod) MOV R1,R3 ; Copy address of I/O packets1 MOV #IXSIZE,R1 ; Get I/O packet extension blockm CALL $ALOCB ; ...) BCS 70$ ; Resource allocation failure.e? MOV I.PRM(R3),IX.ADR(R0) ; Save high address word in extension/ MOV R0,IP.EXT(R3) ; Save I/O packet extensionM& CLR IX.FCN(R0) ; Clear function word# CALL MPTHDR ; Map to task headeri( ; On return, R0=Task Header address) MOV I.LN2(R3),R2 ; Compute LUN on whichM" SUB #H.LUN-2,R2 ; this request SUB R0,R2 ; was issued& ASR R2 ; Each entry is 4 bytes long ASR R2 ; ...E- MOVB I.FCN+1(R3),R1 ; Get I/O function codeO. BIC #^C<177>,R1 ; Isolate real function code- SUB #7,R1 ; Is this a 'close LUN' request?d BEQ 20$ ; If EQ, yes+ SUB #21,R1 ; Normalise to dispatch tableM 20$: ASL R1 ; Form table index ASL R1 ; ...P4 ADD #QIOTBL,R1 ; Compute address in dispatch table: MOV #IE.ONP&377,R0 ; Assume invalid subfunction bits set: BITB I.FCN(R3),(R1)+ ; Any invalid subfunction bits set? BNE 30$ ; If NE, yese1 TSTB (R1)+ ; Should the LUN already be in use?+ BMI 40$ ; If MI, yesi0 MOV #IE.ALN&377,R0 ; Assume LUN already in use% TST @I.LN2(R3) ; Is the LUN in use?U BEQ 60$ ; If EQ, no.30$: CALLR RQALT ; Complete request in error040$: MOV #IE.IFC&377,R0 ; Assume LUN not in use5 MOV @I.LN2(R3),R5 ; Get address of Port State Tablep# BIC #1,R5 ; Remove LUN interlockA" BEQ 30$ ; If EQ, LUN not in use4 CMP I.TCB(R3),P.PTCB(R5) ; Port owned by same task?6 BNE N00 ~}TADATADATADATADATADATADATADATADATAOTIF ; If NE, user abort notification required1 CMPB R2,P.LUN(R5) ; Still accessed on same LUN?i BNE NOTIF ; If NE, no550$: MOV P.CTBL(R5),R4 ; R4 = Controller State Table / MOV #IE.DNR&377,R0 ; Assume device is stoppedT) BIT #CS.STP,C.FLAG(R4) ; Device stopped?#) BNE 30$ ; Yes, return device not readyV60$:( CALL MAPDRV ; Map to 2nd 4K of driver0 CALLR @(R1)+ ; Dispatch to processing routineD70$: MOV #+,R0 ; Resource allocation failure CLR R1 ; ...N! CALLR $IOFIN ; Post completiont7 APR5PC XEINI ; Make sure XEINI is in APR5 addr spaceL B0 .SBTTL NOTIF - Deliver user abort notification;+*; **-NOTIF-Deliver user abort notification;R@; The physical link in use by this user has been taken over by a?; previleged task. Complete this I/O request in error and stop *; further operation on this physical link.;- ; Inputs:t; R3 = Address of I/O packet;M9NOTIF: CLR @I.LN2(R3) ; No further activity on this linku;+1; **-IEABO-Complete I/O request with abort status;A0; Complete the I/O request with an abort status.;- ; Inputs:.; R3 = Address of I/O packet; 0IEABO: MOV #IE.ABO&377,R0 ; Set up abort status BR RQALT;+,; **-ISSUC-Complete I/O request successfully; **-RQALT-Alternate entry;t; Complete the I/O request.s;- ; Inputs:s; R3 = Address of I/O packet; 2ISSUC: MOV #IS.SUC&377,R0 ; Set up success status&RQALT: CLR R1 ; No additional status;+!; **-RQDON-Perform I/O completion ;I!; Perform general I/O completion.t;- ; Inputs: ; R0 = First word of I/O statusa ; R1 = Second word of I/O status; R3 = Address of I/O packet;BRQDON: MOV R4,-(SP) ; Save R41 MOV IP.EXT(R3),-(SP) ; Save I/O packet extension > BIS #,R0 ; Tell user, this is a broadcast channel CALL $IOFIN ; Post completion5 MOV (SP)+,R0 ; R0 = Address of I/O packet extensionS1 MOV #IXSIZE,R1 ; R1 = I/O packet extension size + CALL $DEACB ; Deallocate extension blocko MOV (SP)+,R4 ; Restore R4f RETURN ; Return to caller- u4 .SBTTL XEOPN - Establish access to a physical link;+.; **-XEOPN-Establish access to a physical link;QE; This function is called to gain access to a specific physical link.x;- ; Inputs:#*; R2 = LUN on which the request was issued; R3 = Address of I/O packet; R4 = Controller State Table *; I.PRM+1 - High byte of physical address,; I.PRM+2 - Low 16 bits of physical address'; I.PRM+4 - Length of string ; I.PRM+6 - Initial timeout; I.PRM+7 - Mode: (Ignored) c;e .ENABL LSB.XEOPN: .IF DF DEBUGh BPT .ENDC4 CALL MAPBF ; Convert data buffer physical address& ; ... to bias and virtual address( CALL GTPRT ; Find and allocate a port BCS RQALT ; If CS, errorN; <; R5 = Port Control Block, R4 = controller state table base;=& MOV #IE.NSF,R0 ; Assume line stopped- BIT #CS.STP,C.FLAG(R4) ; Controller stopped?1 BNE RQALT ; Yes# CALL MPTHDR ; Map to task header>- MOV R5,@I.LN2(R3) ; Mark this LUN as activeM' CALL MAPDRV ; Restore driver mapping7 MOV I.TCB(R3),P.PTCB(R5) ; Save TCB in port save areav/ MOVB R2,P.LUN(R5) ; Set up owning TCB and LUNi8 MOVB I.PRM+6(R3),P.RCVT(R5) ; Save receive timer valueA MOV #PS.XIN!PS.OPN,P.FLAG(R5); Pretend link needs initialization * INC C.OPRT(R4) ; INC count of open ports9 MOVB I.PRM+6(R3),P.RCVT(R5) ; Save receive timeout counto/ BIS #PS.OPN,P.FLAG(R5) ; Indicate port is openP- BIT #CS.OFL,C.FLAG(R4) ; Controller offline?)& BNE 50$ ; Yes, try to initialize it BR 20$ ; return success7 APR5PC XEOPN ; Make sure XEOPN is in APR5 addr spacee M;+; **-XEINL-Initialise channelC;nA; This function is called to restart operation of a physical link; following an error.L;- ; Inputs: ; R3 = Address of I/O packet; I.PRM - Initial timeout; I.PRM+1 - Mode:; R4 = Controller State Table 8; R5 = Address of Port Status physical link access block;rXEINL::P .IF DF DEBUGC BPT .ENDC8 BIT #PS.XIN,P.FLAG(R5) ; Port need00~} D%B11110010s to be initialized? BEQ 30$ ; No= MOVB I.PRM+6(R3),P.RCVT(R5) ; Save timeout time for receivese4 BIT #CS.OFL,C.FLAG(R4) ; Is the link state offline? BNE 40$ ; If NE, yesa3 BIC #PS.XIN,P.FLAG(R5) ; Indicate line initializedL.20$: CALLR ISSUC ; Otherwise, return success/30$: CALLR IEABO ; Abort the function request4>40$: MOVB @IP.EXT(R3),P.RCVT(R5) ; Save receive timeout value;50$: $QPKT C.INIW ; Queue packet to initialize wait queue760$: CALLR CTINI ; Initialize controller. Initialize) ; .. will test if init already underC+ ; .. way. If so, no action is taken.B' ; .. Init complete will return I/O  ; .. done on this item.7 APR5PC XEINL ; Make sure XEINL is in APR5 addr spaceL .DSABL LSBS O" .SBTTL XETRM - Terminate channel .SBTTL XECLN - Close LUN;+; **-XETRM-Terminate channel; **-XECLN-Close LUN;c2; This routine is called to close an open channel.;- ; Inputs:i ; R3 = Address of the I/O packet; R4 = Controller State Tablei"; R5 = Address of Port State Table;lXECLN: .IF DF DEBUG  BPT .ENDCXETRM: .IF DF DEBUG  BPT .ENDC) CLR P.FLAG(R5) ; Indicate port not open., DEC C.OPRT(R4) ; Decrement open port count4 CALL RLPRT ; Release port related data structures# CALL MPTHDR ; Map to task headerC: BIC #1,@I.LN2(R3) ; Make sure LUN interlock bit is clear;N#; Return I/O requests for this ports;n* MOV R3,-(SP) ; Save I/O packet for close' MOV R4,R2 ; Point to xmit wait queuet ADD #C.XMWQ,R2 ; .... CALL 20$ ; Remove I/O packets for this port* MOV R4,R2 ; Point to receive wait queue ADD #C.RCVW,R2 ; .... CALL 20$ ; Remove I/O packets for this port+ MOV R4,R2 ; Point to function wait queue  ADD #C.PFNC,R2 ; .... CALL 20$ ; Remove I/O packets for this port' MOV R4,R2 ; Point to init wait queuee ADD #C.INIW,R2 ; .... CALL 20$ ; Remove I/O packets for this port- MOV (SP)+,R3 ; Restore I/O packet for closeo% CALL MPTHDR ; Map to task's headeru2 CLR @I.LN2(R3) ; Ensure no more I/O on this link- BIT #CS.OFL,C.FLAG(R4) ; Controller offline?e BNE 10$ ; yes4 MOV #IS.SUC,I.PRM+2(R3) ; Save I/O status in packet CLR I.PRM+4(R3) ; ...,4 CALLR STMLT ; Write Multicast addresses to device10$: CALLR ISSUC ; Return successs(20$: MOV (R2),R3 ; Get next I/O packet BEQ 40$ ; No more% CALL MPTHDR ; Map to task's headerO/ CMP @I.LN2(R3),R5 ; I/O packet owned by port?I BNE 30$ ; Nos MOV (R3),(R2) ; Dequeue packet MOV R2,-(SP) ; Save R2! CALL IEABO ; Abort the requestk% MOV (SP)+,R2 ; Restore list pointerr BR 20$ ; Look at next itemM)30$: MOV R3,R2 ; R2 points to next itema! BR 20$ ; Continue to next itemL"40$: RETURN ; Return after call7 APR5PC XECLN ; Make sure XECLN is in APR5 addr spaceM , .SBTTL XEXMT - Transmit data;+; **-XEXMT-Transmit data;;B; This function is called to transmit data from the physical link.;- ; Inputs: ; R3 = Address of the I/O packet9; I.PRM+1 - High byte of physical address of data buffer ;; I.PRM+2 - Low 16 bits of physical address of data buffer "; I.PRM+4 - Length of data buffer?; I.PRM+6 - Virtual address of optional characteristics buffer6; I.PRM+10- Length of optional characteristics buffer:; I.PRM+12- Virtual address of optional diagnostic buffer1; I.PRM+14- Length of optional diagnostic buffer; R4 = Controller State Tableo; R5 = Address Port State Tablel;.9; I.PRM+1 - High byte of physical address of data bufferM;; I.PRM+2 - Low 16 bits of physical address of data buffer2;LXEXMT: .IF DF DEBUGa BPT .ENDC1 CALL BFCHK ; Validate optional characteristicsM ; .. buffer BCS 70$ ; If CS, invalids- TST I.PRM+6(R3) ; Do we have an AUX buffer?e BEQ 50$ ; If EQ, none present0 CALL XMTCH ; Process transmit characteristics% BCS 20$ ; Error in characteristics* MOV P.FLAG(R5),-(SP) ; Get port flag word2 BIC #^C,(SP) ; Clear unwanted bits> CMPB (SP)+,#PS.ADR!PS.PRO ; Do we00~}TADATADATADATADATADATADATADATADATA have protocol/address pair?+ BNE 50$ ; If NE, Ethernet address and/or. ; .. protocol not suppliedL0 MOV R4,R0 ; Generate pointer to protocol list ADD #C.PROL,R0 ; ...10$:" MOV (R0),R0 ; Get next protocol( BEQ 50$ ; Not found, invalid protocol: CMP P.XPRO(R5),PL.PRO(R0) ; Is this the callers protocol? BNE 10$ ; NoS/ MOV IP.EXT(R3),R1 ; R1 = I/O packet extension(B MOV PL.FLG(R0),IX.FCN(R1) ; Temp save protocol flags in extension1 MOV #IE.SPC&377,R0 ; Assume buffer is too largev/ CMP I.PRM+4(R3),#XMTBSZ ; Is buffer too large?e' BHI 60$ ; If HI, buffer is too largen, BIT #CS.OFL,C.FLAG(R4) ; Controller online?1 BEQ 40$ ; If EQ, yes ... initiate transmission(. MOV #IE.DNR&377,R0 ; Assume device not ready= BIT #PS.XIN,P.FLAG(R5) ; Line requires initialize function?c. BNE 20$ ; Yes, must issue IO.XIN or Close & ; .. Open( MOV #IE.ABO&377,R0 ; Abort the request< BIS #PS.XIN,P.FLAG(R5) ; Indicate, port must be initialized20$: CLR R1 ; CALLR RQDON ; Post completion30$: RETURN ;440$: $QPKT C.XMWQ ; Queue packet to transmit queue# BR INIXM ; Initiate transmissiont850$: MOV #IE.BAD&377,R0 ; Return bad parameter(s) error60$: CALLR RQALT ; 7"70$: CLR R1 ; Zero status word 2, BR XMTDN ; Do xmit done, maybe user wants ; ... diagnostic info i& .SBTTL INIXM - Initiate transmission;+ ; **-INIXM-Initiate transmission;@; Initiate transmission of the next available I/O packets on the; physical link.;- ; Inputs:s"; R5 = Address of port state table(; R4 = Address of controller state table;q; Registers modified:t; R0, R1, R2, R3, R4, R5;V*INIXM:: CLR -(SP) ; Set transmit counter;P; NOTE, we must not set up transmits until the current transmits have completed.O; Setting up the transmit ring and polling the UNA during a transmit will causeI; the UNA to get out of sunc!!!I;I CALL MAPDRV ; Map to driver5 MOV C.XMTC(R4),R1 ; Get current transmit ring entryt+ TSTB RG.ACT(R1) ; Transmission under way?A3 BNE 30$ ; Yes, wait for interrupt to startl ; ... next transmit!t;10$: MOV C.XMWQ(R4),R3 ; Any transmit I/O packets waiting?  BEQ 30$ ; If EQ, no6 CALL GTPST ; Load R5 with Port Status Table address0 CALL XMTCH ; Process transmit characteristics& CALL GTXMH ; Get xmit header buffer. BCS 30$ ; None available, wait for xmits to ; ... completeV/ MOV C.XMWQ(R4),R3 ; Get next transmit requestr7 MOV P.XDAD(R5),(R0)+ ; Put destination address intod5 MOV P.XDAD+2(R5),(R0)+ ; ... transmit buffer header  MOV P.XDAD+4(R5),(R0)+ ;3 MOV C.PADD(R4),(R0)+ ; Put source address into p5 MOV C.PADD+2(R4),(R0)+ ; ... Transmit buffer header  MOV C.PADD+4(R4),(R0)+ ;? MOV P.XPRO(R5),(R0)+ ; Put protocol into xmit buffer headers< MOV I.PRM+4(R3),(R0) ; Assume padding. Set byte count in ; ... transmit header2 SUB #14.,R0 ; R0 -> begin of transmit header* CALL GFXRE ; Get a transmit ring packet? MOV #14.,RG.LEN(R1) ; Put transmit buffer length in packet.;sF; NOTE - We cannot move the relocation value into the ring as this mayL; set the ownership bit and we are not ready for the UNA to take this entry.;e6 MOV RELCT+2,-(SP) ; Put relocation constant on stack MOV RELCT,-(SP) ; ... * ADD R0,(SP) ; Convert packet address to" ADC 2(SP) ; ... Unibus address. ;6 MOV (SP)+,RG.ADD(R1) ; Put unibus address of segment$ MOVB (SP)+,RG.AD2(R1) ; ... segment2 BIC #374,RG.AD2(R1) ; Make sure MBZ bits are off4 MOV R0,RG.VAD(R1) ; Save virtual address of header/ MOV IP.EXT(R3),R2 ; R2 = I/O packet extensiong9 BIT #LF.PAD,IX.FCN(R2) ; Protocol uses padded messages?f BEQ 20$- ADD #2,RG.LEN(R1) ; Account for byte count 20$:/ MOV R1,-(SP) ; Save header ring entry address.) CALL UMRMP ; Map user buffer with UMRs . MOV (SP)+,R0 ; Get header ring entry into r0@ MOVB #RF.STP!RF.OWN,RG.FLG(R0) ; Set start of chain and UNA own R5 $DQPKT C.XMWQ ; Dequeue I/O packet from wait queue / MOV IP.00%~} D%B11110010EXT(R3),R0 ; R0 = I/O packet extensiond1 CLR IX.FCN(R0) ; Clear tranmit status save wordc' MOVB #3,I.FCN(R3) ; Set retry counter;- $QPKT C.XMTP ; Queue to xmit pending queueD$ INC (SP) ; Indicate poll required BR 10$ ; Go, do next transmit30$:( TST (SP)+ ; Did we transmit anything? BNE 40$ ; Yes RETURN ; No, just return40$: t+ CALL POLRG ; Do Poll Ring command to UNA , MOV #XMTTIM,C.XMTT(R4) ; Set transmit timer CALLR CLOCK ; Start clock;w*; We get here from transmit done interrupt;c:XMTDN: TST I.PRM+12(R3) ; Do we have a diagnostic buffer? BEQ 10$ ; NoI+ MOV R0,I.PRM+2(R3) ; Save I/O status code 2 MOV R1,I.PRM+4(R3) ; Save byte count of transmit4 MOV IP.EXT(R3),R0 ; R0 = I/O packet extension addr: MOVB #FN.DIG,IX.FCN(R0) ; Set diagnostic func. in I/O pkt- $QPKT C.PFNC ; Queue function to pending QC" CALLR FNINI ; Initiate function10$: ; R0 = Status CALLR RQDON ; Do I/O done;L@; We get here from the non-DLX module after it has processed the6; function requests in the optional diagnostic buffer.;o3XDIDN: MOV I.PRM+2(R3),R0 ; R0 = Saved status code;0 MOV I.PRM+4(R3),R1 ; R1 = Characters processed CALLR RQDON ; Do I/O done .DSABL LSB0 = .SBTTL XERCV - Receive dataV;+; **-XERCV-Receive dataa;sA; This function is called to receive data from the physical link.C;- ; Inputs: ; R3 = Address of the I/O packet9; I.PRM+1 - High byte of physical address of data buffer ;; I.PRM+2 - Low 16 bits of physical address of data buffern"; I.PRM+4 - Length of data buffer?; I.PRM+6 - Virtual address of optional characteristics buffer;6; I.PRM+10- Length of optional characteristics buffer:; I.PRM+12- Virtual address of optional diagnostic buffer1; I.PRM+14- Length of optional diagnostic buffer; R4 = Controller State Tableo#; R5 = Address of port status tableC;- .ENABL LSBXERCV: .IF DF DEBUG  BPT .ENDC4 CALL MAPBF ; Convert data buffer physical address& ; ... to bias and virtual address1 CALL BFCHK ; Validate optional characteristicsf ; .. buffer BCS 50$ ; If CS, invalida1 MOV #IE.SPC&377,R0 ; Assume buffer is too large ! CMP I.PRM+4(R3),#XMTBSZ ; Is it?-* BHI BUFERR ; If HI, buffer is too large. BIT #CS.OFL,C.FLAG(R4) ; Is the link online? BNE 10$ ; If NE, yest8 MOV #IE.VER&377,R0 ; Assume we have a delayed error to ; .. report) BIT #PS.DER,P.FLAG(R5) ; Delayed error?  BEQ 40$ ; Nob2 BIC #PS.DER,P.FLAG(R5) ; Clear delayed error bit, BR 20$ ; Return packet with delayed error910$: MOV #IE.ABO&377,R0 ; Assume fatal error in progressi2 BIS #PS.XIN,P.FLAG(R5) ; Port must be initialized20$: CLR R1 ; ...)- CALLR RQDON ; Complete the receive requeste 30$: RETURNe840$: MOVB P.RCVT(R5),I.FCN(R3) ; Set timer in I/O packet/ MOV IP.EXT(R3),R0 ; R0 = I/O packet extension ' MOV R5,IX.FCN(R0) ; Save port addresso. $QPKT C.RCVW ; Queue the receive I/O packet CALL CLOCK ; Start the clockF BR 30$ ; Return,50$: MOV R0,I.PRM+2(R3) ; Save status codes CLR I.PRM+4(R3) ; ...#;O+; We get here after the receive is completeB;#:RCVDN: TST I.PRM+12(R3) ; Do we have a diagnostic buffer? BEQ RDIDN ; No, that's it!t6 MOV IP.EXT(R3),R0 ; Get I/O packet extention pointer: MOV #FN.DIG,IX.FCN(R0) ; Set diagnostic function code and ; ... show I/O complete4 $QPKT C.PFNC ; Queue packet to pending function Q) CALLR FNINI ; Try to initiate function 0BUFERR: CALLR RQALT ; Return with buffer error;VD; We get here after the non-DLX functions in the optional diagnostic; buffer have been processed. ; ,RDIDN: MOV I.PRM+2(R3),R0 ; R0 = I/O status! MOV I.PRM+4(R3),R1 ; Byte countI CALLR RQDON ; Return I/O done .DSABL LSB  k( .SBTTL XECHR - Set/Get characteristics;+"; **-XECHR-Set/Get characteristics; H; This routine is called to set/get multiple characteristics to/from the,; DLC associated with this physical channel.;- ; Inputs:A ; R3 = Address of the I/O packet=; I.PRM+1 -00-~}TADATADATADATADATADATADATADATADATA High byte of physical address of characteristicst ; buffer?; I.PRM+2 - Low 16 bits of physical address of characteristics ; buffer-; I.PRM+4 - Length of characteristics bufferR; R4 = Controller State Table.,; R4 = Address of physical link access block;aXECHR: .IF DF DEBUGC BPT .ENDC- BIT #CS.OFL,C.FLAG(R4) ; Controller offline?/ BEQ 10$ ; Noa' CALLR IEABO ; Return with abort codew10$:4 CALL MAPBF ; Convert data buffer physical address& ; ... to bias and virtual address6 MOV #IE.ONP&377,R0 ; Assume illegal subfunction code. MOVB I.FCN(R3),R1 ; Get the subfunction code ASR R1 ; Form word indexr ASR R1 ; ...n BIT #1,R1 ; Is it odd BNE XRQALT ; Yes, no good!a0 CMP #CHMAX,R1 ; Is the subfunction code valid? BLOS XRQALT ; If LOS, no% CALLR @CHFNC(R1) ; Perform function 5XRQALT: CALLR RQALT ; Complete the request in error;;+(; Set/Get characteristics function table;-*CHFNC: .WORD STCHR ; Set characteristics$ .WORD GTCHR ; Get characteristicsCHMAX= .-CHFNC e& .SBTTL XECTL - Control QIO processor;+ ; **-XECTL-Control QIO processor; :; Controll functions are only valid during Microcode load.@; The control function is used to pass a buffer of ECO Microcode?; segments to this driver. Therefore, the driver must validate ; the following:;-$; 1. The calling task is privileged.; 2. It's name is UML...2; 3. The controller must be in initialization mode;. ; Inputs: ; R3 = Address of I/O packet&; I.PRM+2 = Micro code segment buffer; I.PRM+4 = Buffer size; R4 = Controller State Table+XECTL: .IF DF DEBUGO BPT .ENDC. CALL MAPBF ; map physical address of buffer, MOV #IE.SPC&377,R0 ; Assume buffer too big- CMP I.PRM+4(R3),#8192.-64. ; Is it too larges! BHIS 20$ ; Buffer is too larget1 MOV #IE.PRI&377,R0 ; Assume privilege violations, MOV I.TCB(R3),R1 ; R1 = Task Control Block, BIT #T3.PRV,T.ST3(R1) ; Is task privileged? BEQ 20$ ; No , MOV #IE.BAD&377,R0 ; Assume bad parameters* MOV I.PRM+6(R3),R2 ; Get controller info4 CMP R2,#ENDCTB-CTABL ; Controller index reasonable? BHIS 20$ ; No, bad parameterB BIT #1,R2 ; Is it even? BNE 20$ ; No, bad parameter4 MOV CTABL(R2),R4 ; Get Controller State Table ptr.. MOV #IE.IFC&377,R0 ; Assume invalid function& CMP MLTCB,R1 ; Is tasks name MLT...?. BNE 20$ ; Invalid function for anyone else.> BIT #CS.INI,C.FLAG(R4) ; Are we initializing this controller?. BEQ 20$ ; No, then this function is invalid+ MOVB I.FCN(R3),R2 ; R2 = Load subfunctionr$ BMI 20$ ; Minus, invalid function ASL R2 ; Make it word index* CMP R2,#LOADND-LOADTB ; Valid subfunction BHIS 20$ ; No? CMP C.FUNS(R4),#FN.UML ; Is this 1st response by support task?  BNE 10$ ; NoV) CLR C.CTMR(R4) ; Clear controller timer( CLR C.CFNC(R4) ; No function is active+ CLR C.FUNS(R4) ; Clear function save word10$:$ CALLR @LOADTB(R2) ; Go to function!20$: CALLR RQALT ; Return error,*LOADTB: .WORD LODUM ; load UNA microcode .WORD ENDLOD ; End of loadr .WORD ABRTLD ; Abort loadLOADND=. ; End of table1ENDLOD: MOV #IS.SUC,R0 ; R0 = I/O success statusc CALLR RQALT ; Return(ABRTLD: CALL FTL ; Do fatal processing BR ENDLOD ; End of load 5 .SBTTL XECSC - Controller Status Change entry pointR;+/; **-XECSC-Controller status change entry point;;eA; This routine is entered from the executive when the status of aF; controller must be changed (online => offline or offline => online).;- ; Inputs:O1; R2 = KRB address for controller changing status $; R3 = CTB address for the above KRB(; (SP) = Return address for completion5; 2(SP) = Return address for intermediate completion;*; 'C' Clear = Offline => online transition*; 'C' Set = Online => offline transition;a ; Outputs:; On return through (SP):r; $SCERR = 1 if successful; $SCERR = Error code if not;e; Registers modified:e; R0, R1, R2, R3, R4, R5;l .IF DF R$$MPL ; RSX-11M-PLUSl"XECSC:: NOP ; Wor005~} D%B11110010d for patching( MOV (SP)+,CSCRET ; Save return address ROL R1 ; Save "C" bit- CMP RELCT,#-1 ; Was controller initialized?  BNE 5$ ; Yes  MOV L.DCB(R3),R5 ; R5=DCBe MOV D.UCB(R5),R5 ; R5=UCBl MOV U.SCB(R5),R4 ; R4=SCBi) MOVB K.IOC(R2),R3 ; R3=Controller indexi CALL XELOA ; Init controllerh BCS 60$ ; Init failed, exit!c5$:l( CALL MAPDRV ; Map to 2nd 4K of driver' MOV #CTABL,R0 ; R0 = Controller table10$:% MOV (R0)+,R4 ; R4 = Next controller: BEQ 40$ ; No more, just exitM5 CMP C.KRB(R4),R2 ; Do we have the right controller?a$ BNE 10$ ; No, get next controller0 MOV R3,C.CTB(R4) ; Save CTB address for driver1 ROR R1 ; Is this offline => online transition? BCC 50$ ; Yes4 BIS #KS.OFL,K.STS(R2) ; Indicate controller offline! CALL FTL ; Do fatal processingB5 BIS #CS.STP,C.FLAG(R4) ; Indicate controller stoppedM;tA; Now, check if all controllers have stopped. If so, then return:; static UMR to system.e;c' MOV #CTABL,R0 ; R0 = controller tablei( MOV #U$$NCT,R1 ; R1 = # of controllers20$:0 MOV (R0)+,R4 ; Get next controller state table BEQ 30$ ; No more- BIT #CS.STP,C.FLAG(R4) ; Controller stopped?i BNE 20$ ; Yes' BR 40$ ; At least one still running!#;O<; All controllers have stopped. Return static UMR to system;t30$:0 .IF DF M$$EXT ; If extended memory supported?3 MOV UABKS,R2 ; Now, point to UMR assignment blocke BEQ 40$ ; No assignment block, CALL $DEUMR ; Return static UMR to system' .REPT 6 ; Clear UMR assignment block; CLR (R2)+ .ENDR! CLR UABKS ; Show no static UMR  .ENDC ; M$$EXT*40$: CALLR @CSCRET ; Return to initiator 850$: BIC #KS.OFL,K.STS(R2) ; Turn off offline bit in KRB. BIC #CS.STP,C.FLAG(R4) ; Turn off stop switch> MOV K.CSR(R2),C.CSR(R4) ; Save CSR in Controller Status Table0 .IF DF M$$EXT ; If extended memory supported?+ TST UABKS ; Static UMR already assigned?4 BNE 40$ ; Already allocated  CALL GSUMR ; Get static UMR .ENDC ; M$$EXT BR 40$ ; All is well<60$: MOV #IE.ABO,$SCERR ; Abort, driver did not have enough BR 40$ ; ... buffer space7 APR5PC XECSC ; Make sure XECSC is in APR5 addr space) .ENDC ; RSX-11M-PLUS * .SBTTL FNINI - Function Initiate Routine;+:; This routine initiates a function in the function queue.;@; All non-DLX functions request in the user buffer are processedG; before control is given to the next I/O packet in the function queue.S;-FNINI: .IF DF DEBUGN BPT .ENDC# MOV #1,R3 ; Assume poll requiredV. TST C.CFNC(R4) ; Function processing active?+ BNE 40$ ; Yes, interrupt will start next  ; ... functionE7 BIT #CS.POL,C.FLAG(R4) ; Need to issue a poll command? BEQ 10$ ; No-6 BIC #CS.POL,C.FLAG(R4) ; Indicate poll command issued) MOV #CM.PDM,R0 ; Set up primary command  CALL LODCM ; Do Poll Ringsn BR 40$ ; Set timero110$: BIT #CS.GST,C.FLAG(R4) ; Need to get status?k BEQ 20$ ; Yes" MOV #FN.RLS,R1 ; Read UNA status CALLR LODFN ; ... BR 40$ ; Set timerl20$:& $DQPKT C.PFNC ; Get next I/O packet BCS 40$ ; Nothing to do!s CLR R1 ; Clear high byte / MOV IP.EXT(R3),R0 ; R0 = I/O packet extensiond( MOVB IX.FCN(R0),R1 ; get function code BEQ 50$ ; Zero is a NOP) BMI ABORT ; No negative function codesM1 CMP R1,#FN.WML ; Write multicast list function?l BNE 30$ ; No 3 MOV R3,C.CFNC(R4) ; Save packet as current activet ; ... function flag( CALLR STMLT ; Do write multicast list(30$: CMP R1,#FN.DIG ; Non-DLX functions+ BNE ABORT ; Something must be very wrongk3 MOV R3,C.CFNC(R4) ; Save packet as current active  ; ... function flag% CALLR NDLXD ; Do non-DLX functionsV40$: RETURN ;f.50$: MOV I.PRM+2(R3),R0 ; Recover status code! MOV I.PRM+4(R3),R1 ; Byte count! CALL RQDON ; Return I/O packett& BR FNINI ; Try to get next functionABORT: R .IF DF DEBUG ; If debugging BPT ; Breakn BR ABORT ; Loop on breakD .IFFu$ CRASH ; 00=~}TADATADATADATADATADATADATADATADATASome thing is very wrong .ENDC ; DEBUGE ! .SBTTL XEPWF - Device powerfailM;+; **-XEPWF-Device powerfails;rE; This routine is entered from the EXEC at powerfail recovery, systemc#; boot and device driver load time.:;- ; Inputs:); ; For RSX-11M+;; R3 = Controller Table (CTB) %; R2 = Kontroller Request Block (KRB); ; For RSX-11Mt;x; R3 = Controller index.,; R4 = Address of Status Control Block (SCB)$; R5 = Address of Unit Control Block;u; Registers modified:i; R0, R1, R2, R3, R4, R5; XEPWF: .IF DF DEBUGT BPT .ENDC# .IF NDF R$$MPL ; If not RSX-11M+o1 CMP RELCT,#-1 ; Controller already initialized?  BNE 10$ ; Yes BR XELOA ; No, initialize itr10$: .IFF:) CMP RELCT,#-1 ; Controller initialized? BEQ XETMO ; No, just return .ENDC ; R$$MPL' MOV #CTABL,R0 ; R0 = Controller tablex( CALL MAPDRV ; Map to 2nd 4K of driver120$: MOV (R0)+,R4 ; R4 = Controller status tableC BEQ 30$ ; That is it!' CALL FTL ; Do fatal error processing BR 20$ ; Do all of them30$:- .IF DF M$$EXT ; Extended memory supported?2 CALL $MPUBM ; Reload UMR map register to 2nd 4K .ENDC ; M$$EXT;+; **-XECAN-Cancel I/O requests; **-XETMO-Device timeouto;o&; These routines perform no operation.;-#XECAN: ;;; Should this be a NOP##XETMO: RETURN ;;; Return to exec7 APR5PC XEPWF ; Make sure XEPWF is in APR5 addr spaceR R/ .SBTTL $XELOA - Initialize driver at load times;+*; **-$XELOA-Initialize driver at load time; =; This code is called at the time when the driver is loaded.o<; This code initializes the driver data structures and saves ; pointers to system data bases.;- ; Inputs:n; R3 = Controller indexT,; R4 = Address of Status Control Block (SCB)$; R5 = Address of Unit Control Block;l ; Outputs:'; Driver data structurs are initialized;!XELOA: NOP ; Room for patchingi CALL SALL ; Save registers .IF DF DEBUGz BPT .ENDC .IF DF M$$MGE;EB; Compute APR6 value. We must do this here as the initialize code; may live in the APR6 region.;5 MOV @#KISAR5,DAPR6 ; DAPR6 = Driver start addr biass" BIT #40000,#DREND ; Driver GT 4K BEQ 10$ ; Non5 ADD #200,DAPR6 ; Yes, account for 4K mapped by APR5n BR 20$ ; 10$: 54 MOV #CBASE,-(SP) ; Get base of communications area# BIC #160000,(SP) ; Clear APR bits* ADD #77,(SP) ; Point past current sliver0 ASR (SP) ; Compute offset in slivers to CBASE ASR (SP) ; ...F ASR (SP) ; ...o ASR (SP) ; ...W ASR (SP) ; ...  ASR (SP) ; ...o$ ADD (SP)+,DAPR6 ; Add to APR5 bias;M&; Compute new vertual address of CBASE;d0 MOV #CBASE,R0 ; R0 = Old virtual addr of CBASE3 BIC #177700,R0 ; R0 = Offset into 1st APR6 sliverm- BIS #140000,R0 ; R0 = Virtual addr of CBASES/ MOV R0,CVIRA ; Save new virtual addr of CBASE#,20$: CALL MAPDRV ; Map to 2nd 4K of driver .ENDC ; M$$MGE. CALL UNAIN ; Initialize UNA data structures! BCS 30$ ; Failed to initialize ) .IF NDF R$$MPL ; If "NOT" RSX-11M-PLUS.1 MOV CTABL(R3),R4 ; R4 = Controller Status TableR+ CALL GSUMR ; Assign static UMR to driverC .IFF* CLR RELCT ; Indicate driver initialized7 CLR RELCT+2 ; ... "XECSC" will init relocation value .ENDC ; R$$MPL30$: RETURN ; Return to execV9 APR5PC $XELOA ; Make sure $XELOA is in APR5 addr space; t? .SBTTL QPAKT - Queue I/O packet to specified controller queuea;+.; **-QPAKT-Queue I/O packet to specified queue;l?; Queue an I/O packet to the end of specified controller queue.R;-; Calling sequence:S; JSR R0,QPKT; .WORD ;d ; Inputs:. ; R3 = Address of the I/O packet-; R4 = Address of the controller state tablew; ; Registers modified:; None; 6QPAKT:: MOV R3,-(SP) ; Save address of the I/O packet MOV R2,-(SP) ; Save R25 MOV R4,R2 ; Copy address of Controller State TableI0 ADD (R0)+,R2 ; Compute address of the listhead*10$: MOV R2,R3 ; Save address of current$00E~} D%B11110010 MOV (R2),R2 ; Get address of next3 BNE 10$ ; Loop till we find the end of the queueS# MOV 2(SP),(R3) ; Link new to lasto4 CLR @2(SP) ; Clear link pointer in new I/O packet# MOV (SP)+,R2 ; Restore I/O packetl MOV (SP)+,R3 ; Restoe R2 RTS R0 ; Return 8 .SBTTL DQPAK - Dequeue I/O packet from specified queue;+?; **-DQPAK-Dequeue I/O packet from one of the controller queues ;t9; Dequeue an I/O packet from one of the I/O queues on the; controller state table.d;-; Calling sequence:2; JSR R0,DQPKTe; .WORD ;w ; Inputs:e,; R4 = Address of the controller state table;l ; Outputs: ; R3 = Address of the I/O packet"; 'C' Clear - I/O packet available+; 'C' Set - No more I/O packets availableR;R; Registers modified:B; R3; DQPAK: MOV R2,-(SP) ; Save R2. MOV R4,R2 ; Compute address of the listhead ADD (R0)+,R2 ; ...) SEC ; Assume no I/O packets availablem, MOV (R2),R3 ; Get next entry on the queue BEQ 10$ ; If EQ, none. MOV (R3),(R2) ; Unlink I/O packet from queue/ CLR (R3) ; Clear link pointer (clears C-bit) 10$: MOV (SP)+,R2 ; Restore R2  RTS R0 ; Return o. .SBTTL MPTHDR - Map to Task Header Subroutine;+); **-MPTHDR-Map to Task Header Subroutinel;; Maps APR6 to Task Header;3 ; Inputs::; R3 = I/O packet addressM;R ; Outputs:; R0 = Task Header address;A; Registers R0 changed;-MPTHDR:n+ MOV I.TCB(R3),R0 ; Get task's TCB addresst; MOV T.PCB(R0),R0 ; then PCB address for task's window 0,' ; (PCB=Partition Control Block) R4 MOV P.HDR(R0),-(SP) ; Task header in primary pool?! .IF DF R$$MPL ; If RSX11M-PLUSe/ .IF DF M$$MGE ; Memory management supported?u- BNE 10$ ; If NE, header is in primary poolo0 MOV P.REL(R0),@#KISAR6 ; Map to the task header/ .IF DF K$$DAS ; Kernel data spcae supported? 4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS4 MOV #140000,(SP) ; Task header is at offset 14000010$: .ENDC ; M$$MGE .ENDC ; R$$MPL) MOV (SP)+,R0 ; R0 = Task Header addressM RETURN ;9 APR5PC MPTHDR ; Make sure MPTHDR is in APR5 addr spaceI M- .SBTTL MAPDRV - Map APR6 to 2nd 4K of driverp;+(; **-MAPDRV-Map APR6 to 2nd 4K of driver;a; Maps 2nd 4K of driver to APR6 ;a ; Inputs:s; DAPR6;. ; Ouputs:S; None; ; Registers undisturbedM;-MAPDRV:#/ .IF DF M$$MGE ; Memory menagement supported? . MOV DAPR6,@#KISAR6 ; Map to 2nd 4K of driver/ .IF DF K$$DAS ; Kernel data space supported?$4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ; M$$MGE RETURN ; Return to caller9 APR5PC MAPDRV ; Make sure MAPDRV is in APR5 addr spaceM a< .SBTTL ****************************************************< .SBTTL * Interrupt Handling Routines *< .SBTTL ****************************************************) .SBTTL INTTB - Interrupt Dispatch Table ;p#; INTERRUPT TRANSFER DISPATCH TABLES;;INTTB:' .WORD RCVINT ; Receive Ring Interrupt#( .WORD XMTINT ; Transmit Ring Interrupt* .WORD CMSINT ; Command Success Interrupt5 .WORD RBUINT ; Receive Buffer Unavailable Interruptu' .WORD CMINT ; Command Error Interrupt' .WORD SERINT ; Status Error Interrupt*' .WORD STCINT ; State Change InterruptnINTMSK:d% .WORD BIT13 ; Receive interrupt bit*& .WORD BIT12 ; Transmit interrupt bit% .WORD BIT11 ; Command interrupt bitD8 .WORD BIT10 ; Receive buffer unavailable interrupt bit+ .WORD BIT14 ; Command error interrupt bitn* .WORD BIT15 ; Status error interrupt bit) .WORD BIT8 ; State change interrupt bitt;u*; PRIMARY COMMAND INTERRUPT DISPATCH TABLE ; CODE .WORD RSTDN ; Reset Done -4n! .WORD SLFDN ; Self-test Done -2rCMDDTB: .WORD INTEXT ; NOP 0S# .WORD GPBDN ; Get Control Block 1.$ .WORD GCMDON ; Secondary Command 2 .WORD INTEXT ; Not used 3 .WORD STRDN ; Start 4o .WORD INTEXT ; Boot 5D .WORD INTEXT ; Not used 6 .WORD INTEXT ; Not used 7 .WORD PDMDON ; P00M~}TADATADATADATADATADATADATADATADATAoll Demand 10# .WORD INTEXT ; Sanity Timer On 11r$ .WORD INTEXT ; Sanity Timer Off 12& .WORD INTEXT ; Sanity Timer Reset 13 .WORD INTEXT ; Not used 14  .WORD INTEXT ; Not used 15e .WORD INTEXT ; Not used 16s .WORD INTEXT ; Stop 17 T; &; SECONDARY COMMAND INTERRUPT DISPATCH ; CODEGCM2DTB:S .WORD INTEXT ; Nop 0I- .WORD LSMDN ; Load and Start Microaddress 1o/ .WORD RDADN ; Read Default Physical Address 2t .WORD INTEXT ; Nop 3N) .WORD INTEXT ; Read Physical Address 40) .WORD ILLINT ; Write Physical Address 5O' .WORD ILLINT ; Read Multicast List 6I' .WORD WMLDN ; Write Multicast List 7T) .WORD ILLINT ; Read Ring Descriptor 10u) .WORD WRGDN ; Write Ring Descriptor 11.# .WORD ILLINT ; Read Counters 12E+ .WORD ILLINT ; Read and Clear Counters 13C .WORD ILLINT ; Read Mode 14N .WORD WMEDN ; Write Mode 15d% .WORD RLSDON ; Read Line Status 16 . .WORD ILLINT ; Read and Clear Line Status 17) .WORD ILLINT ; Dump Internal Memory 20l( .WORD LOADN ; Load Internal Memory 21# .WORD ILLINT ; Read System ID 22 $ .WORD ILLINT ; Write System ID 23% .WORD ILLINT ; Read Load Server 24;& .WORD ILLINT ; Write Load Server 25( .WORD ILLINT ; Diagnostic function 260 .WORD MLTMO ; No response from microcode ldr27 a;o;; Secondary command interrupt dispatch table for diagnostic >; functions interrupt service dispatch. The driver determines@; to use this table by looking at the subfunction byte in C.FUNS?; If the sign bit is set, the function is a diagnostic functionO); and this table is used for dispatching.L ; CODEsCM2NDT:3 .WORD INTEXT ; Nop 0d. .WORD ILLINT ; Load and Start Microaddress 1/ .WORD DRADN ; Read Default Physical Address 2. .WORD INTEXT ; Nop 3r( .WORD DRPDN ; Read Physical Address 4( .WORD DWADN ; Write Physical Address 5& .WORD DMLDN ; Read Multicast List 6( .WORD ILLINT ; Write Multicast List 7) .WORD ILLINT ; Read Ring Descriptor 10y* .WORD ILLINT ; Write Ring Descriptor 11" .WORD DRCDN ; Read Counters 12* .WORD DRCCD ; Read and Clear Counters 13 .WORD DRMDN ; Read Mode 14 .WORD DWMDN ; Write Mode 15N$ .WORD DRSTD ; Read Line Status 16- .WORD DRCSD ; Read and Clear Line Status 17) .WORD ILLINT ; Dump Internal Memory 20 ) .WORD ILLINT ; Load Internal Memory 21r" .WORD DRSID ; Read System ID 22# .WORD DWSID ; Write System ID 23L$ .WORD DRSDN ; Read Load Server 24% .WORD DWSAD ; Write Load Server 25. I& .SBTTL UNAI - UNA Interrupt Routine;+; #; **- UNAI - UNA INTERRUPT HANDLING ;dH; The conditions that can cause an interrupt are checked, and a dispatchK; made to handle each interrupt present. The order of interrupt handling isd; shown below:; Receive Ring Interruptm; Transmit Ring Interrupt; Command Success Interrupt'; Receive Buffer Unavailable Interrupt ; Command Error Interrupt; Software Error Interrupt ; State Change interruptD;SJ; The interrupt service entry will set CS.INT in the controller flag word.M; This bit indicates that an interrupt has taken place and enables the driveraD; to service all interrupts before it processes the receive buffers.;r; INPUT:; PCSR0 Interrupt Bits Set;i; OUTPUT TO INTERRUPT ROUTINES:e; R4 = Controller State Tablei; All registers availablec;s;-UNAI:;R ; Do some interrupt housekeeping;- INTSE$ XE,PR5,U$$NCT ;;; Dev.name, priorityn) .IF NDF R$$MPL ;;; If NOT RSX-11M-PLUSh MOV U.SCB(R5),R4 ;;; R4 = SCBC, MOV S.CON(R4),R4 ;;; R4 = Controller index .ENDC ;;; R$$MPL MOV R4,-(SP) ;;; Save R48 MOV CTABL(R4),R4 ;;; R4 = Controller State Table Addr 6 BIS #CS.INT,C.FLAG(R4) ;;; Indicate interrupt occured7 MOV U.SCB(R5),R4 ;;; Point to Controller Status Blockn$ CLRB S.CTM(R4) ;;; Disable timeout0 ADD #S.FRK+6,R4 ;;; Point to end of Fork Block, TST -4(R4) ;;; Fork Block already in use? BEQ 10$ ;;; If EQ no. MOV (SP)+,R4 ;;; Restore R41" RETURN ;;; Exit from interrupt310$: MOV (SP)+,(00U~} D%B11110010R4) ;;; Put saved R4 in Fork Blockx* CALL $FORK1 ;;; Create a system process MOV U.SCB(R5),R0 ; R0 = SCB;: CLR S.FRK+2(R0) ; Free fork block for further interrupts .IF DF DEBUGt BPT .ENDC9 MOV CTABL(R4),R4 ; R4 = Controller State Table Address 7 BIC #CS.INT,C.FLAG(R4) ; Clear interrupt seen flag bit;( CALL MAPDRV ; Map to 2nd 4K of driver3 MOV R0,-(SP) ; Save registers not saved by INTSX$. MOV R1,-(SP) ; ... MOV R2,-(SP) ; ... MOV R3,-(SP) ; ...& MOV C.CSR(R4),R0 ; Get PCSR0 address. MOV (R0),-(SP) ; Get PCSR0 contents on stack; MOVB 1(SP),1(R0) ; Clear all interrupt bits that were setR; '; Cycle through the possible interrupts;F+ CLRB (SP) ; Just keep the interrupt bits % CLR R0 ; Initialize index register20$:< BIT INTMSK(R0),(SP) ; Is this the reason for the interrupt BEQ 30$ ; If EQ, No...  MOV R0,-(SP) ; Save R0* CALL @INTTB(R0) ; Call interrupt routine MOV (SP)+,R0 ; Restore R0 .30$: TST (R0)+ ; Bump pointer to next reason- BIC INTMSK-2(R0),(SP) ; Clear out old reason0' BNE 20$ ; If NE, Still more bits setC;a,; All interrupts handled - dismiss interrupt;hL; At this point the driver tests if there are some received messages waiting; to be processed.;i"; o If not, the driver just exitsK; o Otherwise, the driver tests if another interrupt has taken place while %; servicing the current interrupt.B;)F; o If yes, just exit current interrupt. Next interrupt will process!; the received messages.C; o If their had not been an interrupt while servicing the currenttH; interrupt, the driver will finish processing the received messages.; : BIT #CS.ENP,C.FLAG(R4) ; Did we see a receive end packet? BEQ 40$ ; Noo, BIT #CS.INT,C.FLAG(R4) ; Interrupt pending?0 BNE 40$ ; Yes, let next interrupt process the ; ... received messages.h) CALL RCCMP ; process received messagesB6 CALL GTRBF ; Make sure all entries have rcv buffers,40$: TST (SP)+ ; Restore the stack pointer" MOV (SP)+,R3 ; Restore registers MOV (SP)+,R2 ; ... MOV (SP)+,R1 ; ... MOV (SP)+,R0 ; ...& RETURN ; Exit interrupt processing9 APR5PC $XEINT ; Make sure $XEINT is in APR5 addr spacee c/ .SBTTL RCVINT - Receive Ring Interrupt Handler ;+; -; **- RCVINT - RECEIVE RING INTERRUPT HANDLERp;e?; This routine is called when a receive ring interrupt has beeneH; detected. The ring is checked for the next current ring entry. If none; exist the routine exits.;tE; If a buffer has been received, the ring info is saved in the buffer.C; header and the buffer is queued for receive done processing. Ande1; the ring is scanned for another receive packet.E; C; The ring is emptied. All interrupts serviced before the receivedp; messages are completed. ;I ; INPUTS:E%; R4 = Controller State Table addressu;e;-RCVINT:e; $; Loop to retreive the receive chain;t010$: CALL GCRRE ; Get receive done ring packet& BEQ 50$ ; No more completed entries BCC 20$ ; No errors. CALL CHKERR ; Check if we have a real error BCC 20$ ; All is well) MOV R4,R2 ; Generate error packet addrn ADD #C.LOG,R2 ; ...e2 MOV #ER.RCV,E.TYPE(R2) ; Put error code in packet; MOVB RG.FLG(R1),E.FLG(R2) ; Put Ring's flag byte in packetg5 MOVB RG.ERR(R1),E.ERR(R2) ; Put error byte in packett$ CLR R3 ; No associated I/O packet% CALL ERLOG ; Log the receive errorn20$:7 MOV RG.VAD(R1),R3 ; R3 = Virtual address of rec.buff.$5 MOVB RG.FLG(R1),M.ERR(R3) ; Save error word of entry6 MOVB RG.ERR(R1),M.ERR+1(R3) ; Save ring error by also< MOV RG.RLN(R1),M.MLEN(R3) ; Save length of received message5 $QPKT C.RCVD ; Queue buffer for receive completion 4 BITB #RF.ENP,RG.FLG(R1) ; Did we get an end packet? BEQ 30$ ; Non> BIS #CS.ENP,C.FLAG(R4) ; Indicate, we have seen an end packet30$:" CALL RLPKT ; Release ring entry BR 10$ ; Get the rest450$: CALLR GTRBF ; Refresh the receive buffer ring o( .SBTTL CHKERR - Check out receive error;+$; **-CHKERR- Check00]~}TADATADATADATADATADATADATADATADATA out receive error;MF; This routine makes sure that, in fact, there is an error. There are9; two conditions under which a CRC error is not an error:r;r; 1. Loop back mode>; 2. The transmitting controller is the receiving controller.;;E; In the above cases, the controller is merely saying that no CRC was0 ; generated.; ; Inputs:i; R1 = Receive ring entryh;e ; Outputs:!; C-bit set on real error presentb; C-bit clear for no error;R; Registers not disturbed;->CHKERR: BITB #RF.ENP,RG.FLG(R1) ; Is this an end ring entry?0 BEQ 10$ ; Only end entry has correct statusD BITB #RF.FRM!RF.OFL,RG.FLG(R1) ; Frame Error or Message overflow?& BNE 30$ ; Yes, that is real errorG BITB #/400,RG.ERR(R1) ; Buffer length error or Unibust2 BNE 30$ ; ... time out error. That is error!4 BIT #MD.LOO,C.MODE(R4) ; Are we in loopback mode?+ BNE 10$ ; Yes, we always get CRC error  ; ... in loopback mode.9 MOV C.STRT(R4),R0 ; Get 1st buffer of current receive1' BEQ 30$ ; None found, assume error$; E; It is possible that C.STRT(R4) does not contain the starting buffer K; for the currently received message. If there was no start entry receivedBG; for this message, then the message will be dicarded by RCCMP routine.B;3C CMP C.PADD(R4),M.SADD(R0) ; Was message transmitted by this UNA?4 BNE 30$ ; Nop& CMP C.PADD+2(R4),M.SADD+2(R0) ; Well? BNE 30$ ; No & CMP C.PADD+2(R4),M.SADD+2(R0) ; Well? BNE 30$ ; Nos710$: BICB #RF.ERR!RF.CRC,RG.FLG(R1) ; Clear error bitsa CLC ; Indicate good return20$: RETURN ;%30$: SEC ; Indicate error return  BR 20$ ; Return a0 .SBTTL XMTINT - Transmit Ring Interrupt Handler;+;a.; **- XMTINT - TRANSMIT RING INTERRUPT HANDLER;i@; This routine is called when a transmit ring interrupt has beenF; generated. The ring is checked for the next completed entry. If none; exists the routine exits.P;+C; If an entry is found the entry is checked for any errors. ErrorsCF; are logged by the driver. If the transmit was error free the statusG; code is saved in the I/O packet at I.PRM and processing of the packet ; continues.;B ; INPUTS:-; R4 = Controller State Tabler;;-XMTINT: ;I2; Loop to retreive the next transmit chain on ring;e610$: CALL GCXRE ; Get next completed xmit ring entry& BEQ 70$ ; No more completed entries% MOV C.XMTP(R4),R3 ; R3 = I/O packete BCC 20$ ; Successful transmit3 MOV R4,R2 ; Generate pointer to error log packetC ADD #C.LOG,R2 ; ...r3 MOV #ER.XMT,E.TYPE(R2) ; Put error code in packet o; MOVB RG.FLG(R1),E.FLG(R2) ; Put Ring's flag byte in packetp5 MOVB RG.ERR(R1),E.ERR(R2) ; Put error byte in packet " CALL ERLOG ; Log transmit error320$: MOV IP.EXT(R3),R2 ; R2 = I/O packet extension6 BISB RG.ERR(R1),IX.FCN+1(R2) ; Save error status bits! BISB RG.FLG(R1),IX.FCN(R2) ; ...i" CALL RLPKT ; Release ring entry/ BITB #RF.STP,RG.FLG(R1) ; Was this start entry2 BEQ 30$ ; Non> MOV C.XHDR(R4),@RG.VAD(R1) ; Put transmit header in free list MOV RG.VAD(R1),C.XHDR(R4) ; ... BR 10$ ; See if there is more-30$: BITB #RF.ENP,RG.FLG(R1) ; End-of-packet?) BEQ 10$ ; Noe b@ MOV #XMTTIM,C.XMTT(R4) ; Assume xmit not active, restart timer.= MOV (R3),C.XMTP(R4) ; Remove I/O packet from xmit pending QC BNE 40$ ; More in ring?' CLR C.XMTT(R4) ; Clear transmit timer40$:0 .IF DF M$$EXT ; If extended memory supported?) MOV RG.UMR(R1),R2 ; R2 = UMR wait block;) ADD #10,R2 ; R2 = UMR assignment blockn MOV R3,-(SP) ; Save R3 CALL $DEUMR ; Deassign UMR. MOV (SP)+,R3 ; Restore R3  MOV C.UCB(R4),R0 ; R0 = UCBR5 MOV U.UCBX+6(R0),@RG.UMR(R1); Free up UMR wait blockT" MOV RG.UMR(R1),U.UCBX+6(R0) ; ... .ENDC ; M$$EXT;3; Got the whole transmit chain;r4 MOV R4,-(SP) ; Save controller state table pointer+ ; ... we have to do this in case GTPSTF ; ... distroys it1 CALL GTPST ; Restore Port Status Table pointerU7 MOV (SP)+,R4 ; Restore contr00e~} D%B11110010oller state table pointern TST R5 ; Port closed? BNE 45$ ; NoD& CALL IEABO ; Yes, abort the request BR 10$ ; Complete next item45$:! MOV #IS.SUC,R0 ; Assume success ! MOV I.PRM+4(R3),R1 ; Byte count,/ MOV IP.EXT(R3),R2 ; R2 = I/O packet extensiono BIT #RF.ERR,IX.FCN(R2) ; Error? BEQ 60$ ; Nov1 BIT #RE.RTY,IX.FCN(R2) ; Retry due to collisionse BEQ 50$ ; Nos) DECB I.FCN(R3) ; Should we try it againS BEQ 50$ ; Not: MOV C.XMWQ(R4),(R3) ; Yes, insert at front of wait queue MOV R3,C.XMWQ(R4) ; ...T BR 10$ ; Go, do nextE*50$: MOV #IE.ABO&377,R0 ; R0 = Abort code CLR R1 ; R1 = 0 byte countx/60$: CALL XMTDN ; Do transmit done processing BR 10$ ; Do next if any.70$: CALLR INIXM ; Try to start up transmits o2 .SBTTL CMSINT - Command Success Interrupt Handler0 .SBTTL CMEINT - Command Error Interrupt Handler;+;Q0; **- CMSINT - Command Success Interrupt Handler.; **- CMEINT - Command Error Interrupt Handler;eB; These routines are called when a command done interrupt has beenK; detected. If the command completes with success the C-Bit is cleared upon I; entry to the command done routines. If the command completes with error0;; the C-Bit is set when entering the command done routines.t;sF; The command function (C.FUNS=Primary/secondary func code) is used toF; dispatch to the command done routine. If the sign bit is set in theH; function code indicates the command was issued by the non-DLX functionG; processor and CM2NDT table is used to dispatch to the done processor.n; ; INPUTS:f; R4 = Controller State Tablec5; C.CFNC = Address of I/O packet for current functiond+; C.FUNS = Primary/Secondary function codesr;- .ENABL LSB CMSINT: ;e; Command success interrupts;* CLR R0 ; Set up "ROL R0" for zero C-bit BR 10$ ; Join common code;i(; Command error interrupt (also timeout);iCMINT:5 MOV #100000,R0 ; Set up "ROL R0" for non-zero C-bit 10$:+ CLRB C.CTMR(R4) ; Clear any pending timerN, MOV C.CFNC(R4),R3 ; Get I/O packet address- CLR C.CFNC(R4) ; Clear I/O packet save word 0 MOVB C.FUNS(R4),R1 ; Get primary function code, BIC #100000,R1 ; Make sure sign bit is off ASL R1 ; Make it word index ROL R0 ; Set/Clear C-bitc) CALLR @CMDDTB(R1) ; Dispatch to routine *INTEXT: RETURN ; Used for commands with ; ... no completion routine;s; Secondary command dispatch;0GCMDON: ROR R0 ; Save C-bitn1 CALL GTPST ; Restore Port Status Table pointere* MOVB C.FUNS+1(R4),R1 ; Get function byte( BMI 20$ ; Must be diagnostic function p ASL R1 ; Make it word index ROL R0 ; Set/Clear C-bit ' JMP @CM2DTB(R1) ; Dispatch to routinei&20$: BIC #177600,R1 ; Clear sign bits ASL R1 ; Make it word index/ .IF DF M$$MGE ; Memory management supported? 3 MOV C.KIR6(R4),@#KISAR6 ; Map to diagnostic buffere/ .IF DF K$$DAS ; Kernel data space supported?04 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ; M$$MGE ROL R0 ; Set/Clear C-bite, MOV C.DGBP(R4),R0 ; Restore buffer pointer( JMP @CM2NDT(R1) ; Go to done processor9 APR5PC GCMDON ; Make sure GCMDON is in APR5 addr spacei .DSABL LSB7;+; **-PDMDON- Poll Demand Done ;eD; This routine clears the C.CFNC flag and the CS.POL flag bit in theB; controller flag word (C.FLAG) and passes control to the function; processor (FNINI).;s ; INPUTS:; R4 = Controller State Tablep; PDMDON:I BCS 10$ ; Fatal1 CALLR FNINI ; Try to initiate another functiona10$: CALLR FTL ; Fatal error u5 .SBTTL RBUINT - Receive Buffer Unavailable Interrupt;+; 3; **- RBUINT - Receive Buffer Unavailable Interrupt;SE; This routine is called when a buffer unavailable interrupt has beene7; generated. The event is logged via the error logger.t;l ; INPUTS:d; R4 = Controller State Table ; ; REGISTERS MODIFIED:F ; R0,R1,R2;N;-7RBUINT: MOV R4,R2 ; Generate error log packet pointer$ ADD #C.LOG,R2 ; ...I2 MOV #ER.RBU,E.TYPE(R200m~}TADATADATADATADATADATADATADATADATA) ; Put error code in packet CLR R3 ; No I/O packetu CALL ERLOG ; Log the errore+ CALL GTRBF ; Refresh receive buffer ringT" BNE 10$ ; We added some buffers6 RETURN ; No receive buffs, return from int service410$: CALLR POLRG ; Tell UNA to get receive buffers i/ .SBTTL SERINT - Status Error Interrupt Handlerr/ .SBTTL STCINT - State Change Interrupt Handler * .SBTTL ILLINT - Illegal Interrupt Handler;+;r-; **- SERINT - Status Error Interrupt Handler-; **- STCINT - State Change Interrupt Handlerk(; **- ILLINT - Illegal Interrupt Handler; G; These routines are called as a result of the corresponding interrupts$J; being generated. The error is logged. These error are considered fatal.; ; INPUTS:C; R4 = Controller State Tabler;i; REGISTERS MODIFIED:T ; R0,R1,R3;u;-SERINT:p;a0; Queue up a control request to read line status;e7 BIS #CS.GST,C.FLAG(R4) ; Indicate get status in C.FLAG ) CALLR FNINI ; Try to do the Get Status; -; We get here after the Read Status interrupt ; 2RLSDON: BIT #1,R3 ; Is this driver's get status?' BEQ 10$ ; Go to normal service entryp/ BIC #CS.GST,C.FLAG(R4) ; Clear Get Status flagi/ MOV R4,R2 ; Generate eror log packet pointer ADD #C.LOG,R2 ; ...r; MOV #ER.SER,E.TYPE(R2) ; Put status error code into packetu5 MOV C.PCBP(R4),R0 ; R0 = Port Control Block pointere1 MOV (R0)+,E.PCB(R2) ; Put Status word in packeta MOV (R0)+,E.PCB+2(R2) ; ... MOV (R0)+,E.PCB+4(R2) ; ... MOV (R0)+,E.PCB+6(R2) ; ... MOV C.CSR(R4),R0 ; Get CSR1 MOV (R0),E.CSR0(R2) ; Put PCSR0 in error packeta1 MOV 2(R0),E.CSR1(R2) ; Put PCSR1 in error packetC CLR R3 ; No I/O packet  CALL ERLOG ; Log the error;& CALLR FTL ; Do UNA fatal processing810$: CALLR RLSDN ; Go to Read Status interrupt serviceSTCINT:oILLINT:/ BIT #CS.OFL,C.FLAG(R4) ; Is controller online?n BEQ 10$ ; Yes RETURN ; 10$: MOV C.CSR(R4),R0 ; Get CSR, MOV R4,R2 ; Generate error packet pointer ADD #C.LOG,R2 ; ...R2 MOV #ER.STC,E.TYPE(R2) ; Put error type in packet/ MOV (R0),E.CSR0(R2) ; PCSR0 into error packet)/ MOV 2(R0),E.CSR1(R2) ; PCSR1 into error packet " CLR R3 ; There is no I/O packet& CALL ERLOG ; Log State Change Error& CALLR FTL ; Do UNA fatal processing R .SBTTL CLOCK - Clock Routine;+; **-CLOCK-Clock Routine;C?; This routine performs all the timing services for the driver.;;-;: ; Inputs:R; R4 = Controller State Table;:; C.CTMR = Controller Timer. Times out command functions.!; C.XMTT = Transmit timeout timere+; C.RCVW = I/O packet in receive wait queueo; I.FCN holds timeout valueR;2 ; Outputs:A; None zero timers are decremented. Each timer that goes to zero ?; will cause a specific timeout service routine to be executed.;RA; If the wait time of receive I/O packets has expired, the packet@; is removed from the receive wait list and I/O done with IE.TMO!; status is returned to the user.e; ; (CLOCK:: TSTB CLKFG ; Is clock running? BNE 30$ ; Yes, just exit.( TST CLKBK ; Do we have a clock block? BNE 20$ ; Yes110$: MOV #C.LGTH,R1 ; R1 = Length of clock block ' CALL $ALOCB ; Allocate a clock blockt BCS 10$ ; Not available, MOV R0,CLKBK ; Save address of clock block20$:) INCB CLKFG ; Indicate clock is runninge! MOV CLKBK,R0 ; R0 = Clock Block,2 MOV #CLKTMO,C.SUB(R0) ; Set addr of timer service& CLR R1 ; R1 = High order delta time& MOV $TKPS,R2 ; R2 = Ticks per second MOV R4,-(SP) ; Save R4 MOV R5,-(SP) ; Save R54 MOV R4,R5 ; R5 = Identifier (Contr.State Tbl.Ptr)) MOV #C.SYST,R4 ; Declare system routine;3 CALL $CLINS ; Request insertion into clock queuet MOV (SP)+,R5 ; Restore R5; MOV (SP)+,R4 ; Restore R4 !30$: RETURN ; Return to caller:;C'; We get here after clock queue timeoutM;CCLKTMO:;( CALL MAPDRV ; Map to 2nd 4K of driver2 MOV #CTABL,CTPTR ; Save controller table pointer1 MOV @CTPTR,R4 ; Get next contr. state table ptro0 CLR CACUM ; Clear controller time accumulator10$:# T00u~} D%B11110010STB CLKFG ; Clock been stopped?. BEQ 80$ ; Yes, just exit., MOV C.UCB(R4),R0 ; R0 = Unit Control Block. MOV U.DCB(R0),R0 ; R0 = Device Control Block# TST D.DSP(R0) ; Driver in memory?s BEQ 80$ ; No, just exit.t% TST C.CTMR(R4) ; Command timer set?  BEQ 30$ ; Nou$ DEC C.CTMR(R4) ; Dec command timer BNE 20$ ; No timeout yet#, CALL CMINT ; Execute timeout for commands:20$: BIS C.CTMR(R4),CACUM ; Accum.time for clock insertion*30$: TST C.XMTT(R4) ; Transmit timer set? BEQ 50$ ; No ! DEC C.XMTT(R4) ; Dec xmit timerY BNE 40$ ; No timeout yetR' CALL FTL ; Do fatal error processingD% CLR CACUM ; Clear time accumulator BR 80$ ; Do next controller:40$: BIS C.XMTT(R4),CACUM ; Accum.time for clock insertion550$: MOV R4,R3 ; Generate pointer to receive wait Qc ADD #C.RCVW,R3 ; ...60$:/ MOV R3,R2 ; Save privious I/O packet pointero, MOV (R3),R3 ; Get next I/O packet in list BEQ 80$ ; No more* TSTB I.FCN(R3) ; I/O packet's timer set? BEQ 60$ ; No, don't bother it! DECB I.FCN(R3) ; Dec timer byteN BEQ 70$ ; not yet timed out7 BISB I.FCN(R3),CACUM ; Accum.time for clock insertionu# BR 60$ ; Process next I/O packetr.70$: MOV (R3),(R2) ; Dequeue packet from list- MOV R2,-(SP) ; Save privious packet pointer ! MOV #IE.TMO,R0 ; Timeout status  CLR R1 ; ...V' CALL RQDON ; Return timeout I/O donee( MOV (SP)+,R2 ; Restore privious packet$ MOV R2,R3 ; Make privious current& BR 60$ ; Do next I/O packet in list80$:* ADD #2,CTPTR ; Point to next controller4 MOV @CTPTR,R4 ; R4 = Next controller's state table, BNE 10$ ; Process next controllers timers3 CLRB CLKFG ; Assume timers done for this contrl.M" TST CACUM ; Any more timers set# BEQ 90$ ; Yes, restart the clocks CALL CLOCK ; Restart clockR90$: RETURN ; Return to exec.9 APR5PC CLKTMO ; Make sure CLKTMO is in APR5 addr space; e. .IF DF E$$DVC ; Device error log supported? .SBTTL ERLOG - Error Loggerk;+; **-ERLOG-Error loggerT; ; Interface to $LOGERl; ; Inputs:,7; R3 = Address of I/O packet (or zero if no I/O packet)o; R4 = Controller State TableC; ; Outputs:; None; ; All registers preservedT;C'ERLOG: CALL SALL ; Save all registersY, MOV C.UCB(R4),R5 ; R5 = Unit Control Block. MOV U.SCB(R5),R4 ; R4 = Status Control Block7 CLRB S.ROFF(R4) ; 0 offset to 1st reg of err.log.pkt.;@ MOV #/2,S.RCNT(R4) ; Save # of reg. to copy for err.log- MOV #E.SIZE,R1 ; R1 = Error log packet sizer1 MOV R3,S.PKT(R4) ; Save I/O packet for err.log.s% BNE 10$ ; We do have an I/O packetr" CLR R4 ; No I/O packet, no SCB.;t&; R1 = Error log packet size in bytes/; R3 = I/O packet address (0 if no I/O packet) ; R4 = SCB (0 if no I/O packetB ; R5 = UCB ;n.10$: CALL $LOGER ; Attempt to log err packet' BCS 40$ ; Unable to log error packetf MOV U.SCB(R5),R4 ; R5 = SCB; CLR R2 ; Get ready for BISB. BISB S.RCNT(R4),R2 ; R2 = Word count to copy. MOV 2(SP),R0 ; Generate error packet pointer ADD #C.LOG,R0 ; ...t> MOV C.MODE-C.LOG(R0),E.MODE(R0) ; Save current mode in packet520$: MOV (R0)+,(R1)+ ; Copy data to error log packetk DEC R2 ; ... BNE 20$ ; ...* TST S.PKT(R4) ; Do we have an I/O packet BNE 30$ ; Yes" CLR R4 ; No I/O packet, no SCB.*30$: CALL $FNERL ; Finish this error log540$: MOV 2(SP),R2 ; Generate pointer to error packet  ADD #C.LOG,R2 ; ... 1 MOV #/2,R3 ; Error packet size in wordsu50$: CLR (R2)+ ; Zero packet DEC R3 ; ...  BNE 50$ ; ...4 CALL MAPDRV ; Make sure we are mapped to driver's, RETURN ; ... APR6 space before returning7 APR5PC ERLOG ; Make sure ERLOG is in APR5 addr space2 .IFF..ERLOG: RETURN ; NOP if no error log support .ENDC ; E$$DVC I! .SBTTL RCCMP - Receive completeL;+; **-RCCMP-Receive completeM;2K; This routine is called after all the interrupts have been serviced. ThisEJ; routine scans the receive complete pending queue for a complete message.00}~}TADATADATADATADATADATADATADATADATAH; Upon finding a complete message, the destination is found and the data ; transfered to the user buffer.;- ; Inputs:e; R4 = Controller State Table ;e; Registers modified:a; R0, R1, R2, R3;.RCCMP: CALL MAPDRV ; Map to 2nd 4K of driver CLR R1 ; Init error status.9 MOV #-<6+6+2>,C.RML(R4) ; Assume normal receive overheadm10$:9 MOV C.RCVD(R4),R5 ; Get first item of received messagese BEQ 60$ ; No more, Just exit.+ BITB #RF.STP,M.ERR(R5) ; Start of message?a BNE 30$ ; YesC MOV (R5),C.RCVD(R4) ; No, deque receive buffer from received list < MOV C.RBFL(R4),(R5) ; Insert buffer in free receive buffer MOV R5,C.RBFL(R4) ; ... list! BR 10$ ; Find start of message 20$:' MOV (R5),R5 ; Get next message block - BEQ 60$ ; No more, wait for rest to arrive#30$:9 BITB #RF.ENP,M.ERR(R5) ; Is this the end of the message?C BEQ 20$ ; Noe/ BIC #170000,M.MLEN(R5) ; Clear high order bits / MOV M.MLEN(R5),C.RML(R4) ; Save message length > SUB #4+6+6+2,C.RML(R4) ; Account for CRC/Dest/Source/protocol+ BITB #RF.ERR,M.ERR(R5) ; Error in message?F) BNE 50$ ; Discard messages with errors 6 MOV C.RCVD(R4),R5 ; Get buffer with protocol/address) MOV R4,R1 ; Point to protocol listheadt ADD #C.PROL,R1 ; ...940$: MOV (R1),R1 ; Get addr of next protocol list entryR BNE 70$ ; If NE, we have one $50$: CALLR 210$ ; ... else no more60$: CALLR 200$ ; Just returni70$: CMP PL.PRO(R1),M.PRO(R5). BNE 40$ ; If NE, keep looking* MOVB PL.FLG(R1),R0 ; Save protocol flagsE MOV PL.EXC(R1),R3 ; Assume this is an exclusive or default protocol  BIT #LF.EXC,R0 ; Is it?r BNE 100$ ; If NE, it is2 ADD #PL.ADD,R1 ; Point to address chain listhead<80$: MOV (R1),R1 ; Get address of next address chain entry* BNE 90$ ; If NE, another entry to check) BIT #LF.DEF,R0 ; Default owner enabled?C* BEQ 50$ ; If EQ, no ... toss the packet- BR 100$ ; Process packet for default ownerRF90$: CMP M.SADD(R5),AD.ADD(R1) ; Compare address of received message* BNE 80$ ; ... to protocol's addresses CMP M.SADD+2(R5),AD.ADD+2(R1) ; BNE 80$ ; CMP M.SADD+4(R5),AD.ADD+4(R1) ; BNE 80$ ;0 MOV AD.PRT(R1),R3 ; Get address of owning port5100$: BIT #1,M.DADD(R5) ; Was this message sent to ae ; ... multicast address?e BEQ 120$ ; If EQ, noF' MOV R3,R1 ; Get pointer to multicast5- ADD #P.MCST,R1 ; ... address chain listhead 5110$: MOV (R1),R1 ; Get pointer to next multicast5 ; ... address block BEQ 50$ ; If EQ, no more8@ CMP M.DADD(R5),ML.ADD(R1) ; Compare message multicast address. BNE 110$ ; ... to the multicast addresses- CMP M.DADD+2(R5),ML.ADD+2(R1) ; ... enabled.  BNE 110$ ;n CMP M.DADD+4(R5),ML.ADD+4(R1) ; BNE 110$i120$:g2 BIT #LF.PAD,R0 ; Does this protocol use padding? BEQ 130$ ; If EQ, noR9 MOV M.DATA(R5),C.RML(R4) ; yes, first word is byte counta8 MOV #2,C.POVH(R4) ; Account for byte count in 1st word ; ... of message; H; At this point we have found the destination port. Now we have to find+; the I/O packet associated with that port.s;B130$: % MOV R3,R5 ; Put port address in R5C* MOV R4,R3 ; Generate receive wait Q ptr ADD #C.RCVW,R3 ; ...140$:+/ MOV R3,R2 ; Save privious I/O packet pointerF$ MOV (R3),R3 ; Get next I/O packet, BEQ 50$ ; None there, discard the message/ MOV IP.EXT(R3),R1 ; R1 = I/O packet extensionV4 CMP IX.FCN(R1),R5 ; I/O packet owned by this port? BNE 140$ ; Loop till foundt$ MOV (R3),(R2) ; Dequeue I/O packet;oF; We found the owner of the message. Now we must transfer the message; to the user buffer. ;P2 MOV #IE.DAO&377,-(SP) ; Assume data overrun error0 MOV I.PRM+4(R3),R1 ; Get size of user's buffer8 CMP C.RML(R4),R1 ; Is data block > than user's buffer? BHI 150$ ; If HI, yes MOV C.RML(R4),R1 ; get count. MOV #IS.SUC&377,(SP) ; ... and return success8150$: MOV R1,C.RML(R4) ; Save byte count for completion- MOV R1,-(SP) ; Save byte count for I/O doneV/160$: MOV R3,-(SP) ; 00~} D%B11110010Save registers R3, R4, R5t MOV R4,-(SP) ; ..g MOV R5,-(SP) ; ..f$ MOV C.RCVD(R4),R0 ; Get 1st buffer2 ADD #M.DADD,R0 ; Point to destination addr field5 MOV (R0)+,P.RDAD(R5) ; Save destination addr in port MOV (R0)+,P.RDAD+2(R5) ; ...o MOV (R0)+,P.RDAD+4(R5) ; ...10 MOV (R0)+,P.RSAD(R5) ; Save source addr in port MOV (R0)+,P.RSAD+2(R5) ; ...n MOV (R0)+,P.RSAD+4(R5) ; ...C2 MOV (R0)+,P.RPRO(R5) ; Save protocol addr in port* MOV R4,R5 ; R5 = Controller State Table170$:3( CALL MAPDRV ; Map to 2nd 4K of driver5 MOV #M.DBSZ,R0 ; R0 = Byte count (assume full buff), SUB C.POVH(R5),R0 ; ...#3 CMP R0,C.RML(R5) ; Less than full receive buffer?+ BLO 180$ ; No1 MOV C.RML(R5),R0 ; Yes, use byte count in C.RML 3180$: SUB R0,C.RML(R5) ; Account for current blockR! MOV DAPR6,R1 ; Source APR5 biasM) MOV C.RCVD(R5),R2 ; Source displacementA6 MOVB M.ERR(R2),-(SP) ; Save START/STOP bits on stack/ ADD #M.DATA,R2 ; Point to data area of buffere4 BITB #RF.STP,(SP)+ ; Is this 1st buffer of message BNE 185$ ; YesR= SUB #M.DATA-M.DADD,R2 ; No, so data starts where destination = ADD #M.DATA-M.DADD,R0 ; Account for added data in this blockBA SUB #M.DATA-M.DADD,C.RML(R5); Subtract added data from remainder0 BGE 185$ ; We have not exceeded the remainder4 ADD C.RML(R5),R0 ; Adjust byte count of this block+ CLR C.RML(R5) ; Indicate this block is it(.185$: ; ... address is in the first buffer MOV R0,-(SP) ; Save byte count3 ADD C.POVH(R5),R2 ; Add padding overhead, if any.f! SUB #20000,R2 ; Biased for APR5#6 CLR C.POVH(R5) ; Padding overhead only for 1st block/ MOV I.PRM+2(R3),R4 ; Destination displacementn& MOV @I.PRM(R3),R3 ; Destination APR6 CALL $BLXIO ; Copy the data MOV (SP)+,R0 ; Get byte countx' MOV 4(SP),R3 ; Get I/O packet address;/ ADD R0,I.PRM+2(R3) ; Increment buffer pointer 8 MOV C.RCVD(R5),R0 ; Dequeue buffer From receive done Q' BEQ 230$ ; Something is wrong, stop!y9 MOV (R0),C.RCVD(R5) ; Dequeue buffer from received lista2 MOV C.RBFL(R5),(R0) ; Insert buffer in free list MOV R0,C.RBFL(R5) ; ...y. BIT #RF.ENP,M.ERR(R0) ; Was it an END buffer? BEQ 187$ ; No% TST C.RML(R5) ; Is char count zero? BNE 230$X#187$: TST C.RML(R5) ; Are we done?; BNE 170$ ; No, get next block- MOV (SP)+,R5 ; Restore registers R5, R4, R3I MOV (SP)+,R4 ; ... MOV (SP)+,R3 ; ...3 TST I.PRM+6(R3) ; Auxilliary char. buffer exists? ! BEQ 190$ ; If EQ, none present05 CALL RCVCH ; Process received msg. characteristicsM190$:(; MOV (SP)+,I.PRM+4(R3) ; Save byte count and I/O completion 1 MOV (SP)+,I.PRM+2(R3) ; ... status in I/O packete1 CALL RCVDN ; Post completion on the I/O packetn BR 220$ ; Continue9200$: BIC #CS.ENP,C.FLAG(R4) ; Clear end packet seen flage1 CALLR GTRBF ; Add some buffers to receive ringR>210$: MOV C.RCVD(R4),R5 ; Get first item of received messages BEQ 200$ ; We must be done 0 MOV (R5),C.RCVD(R4) ; Deque from received list5 MOV C.RBFL(R4),(R5) ; Insert into receive free list9 MOV R5,C.RBFL(R4) ; ...)% BITB #RF.ENP,M.ERR(R5) ; Last block? BEQ 210$ ; No7220$: CALLR RCCMP ; look for another received messagem2230$: MOV (SP)+,R5 ; Restore registers R5, R4, R3 MOV (SP)+,R4 ; ... MOV (SP)+,R3 ; ...( MOV (SP)+,I.PRM+4(R3) ; Save byte count TST (SP)+ ; Tidy stack2 MOV #IE.DAO&377,I.PRM+2(R3) ; Indicate data error CLR I.PRM+4(R3) ; Zero receive CALL RCVDN ; Post completion ! BR 220$ ; Process next receiveF R< .SBTTL ****************************************************< .SBTTL * QIO UNA characteristics processing routines *< .SBTTL ****************************************************; .SBTTL RCVCH - Process receive auxilliary characteristics ;+5; **-RCVCH-Process receive auxilliary characteristics ;eG; Process the characteristics present in the auxilliary characteristicst ; buffer on the receive request.;- ; Inputs:C ; R3 = Address of the I/O packet:; I.PRM+6 - Virtual address of the characte00~}TADATADATADATADATADATADATADATADATAristics buffer1; I.PRM+10- Length of the characteristics buffer ; R4 = Controller State Tablec; R5 = Port State tableB; ; Registers modified:* ; R0, R1, R2;*5RCVCH: MOV IP.EXT(R3),R0 ; R0 = I/O packet extensionr/ .IF DF M$$MGE ; Memory management supported?a, MOV IX.AUX(R0),@#KISAR6 ; Map to AUX buffer/ .IF DF K$$DAS ; Kernel data space supported?t4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spcae .ENDC ; K$$DAS .ENDC ; M$$MGE? MOV I.PRM+6(R3),R0 ; Point to start of characteristics bufferL/ MOV R0,P.WORK(R5) ; Create end of user bufferr7 ADD I.PRM+10(R3),P.WORK(R5) ; P.WORK = End user buffert<10$: MOV #CS.IGN,R1 ; Assume characteristic will be ignored3 MOV (R0),R2 ; Get next characteristics type code . SUB #CC.ADR,R2 ; Normalise for DLX functions2 BLT 20$ ; If LT, not one of our characteristics ASL R2 ; Form word offset CMP R2,#RCMAX ; In range?  BHIS 20$ ; If HIS, no+ CLR C.DATO(R0) ; Assume no data availableM3 CALL @RCVTBL(R2) ; Dispatch to processing routineL>20$: MOV R1,C.STAT(R0) ; Return status of this characteristic2 ADD C.DATI(R0),R0 ; Point to next characteristic ADD #C.CHRL,R0 ; ...& CMP R0,P.WORK(R5) ; Are we done yet? BLO 10$ ; If LO, no( CALL MAPDRV ; Map to 2nd 4K of driver RETURNr;+(; Receive characteristics dispatch table;-RCVTBL:s8 .WORD RCVDAD ; Get source field from received message7 .WORD RCVPRO ; Get protocol field from received msg.m4 .WORD RCVADR ; Get dest. field from received msg.RCMAX =.-RCVTBLn7 APR5PC RCVCH ; Make sure RCVCH is in APR5 addr spacec c9 .SBTTL RCVADR - Get destination field from received msg.#;+4; **-RCVADR-Get destination field from received msg.;O.; Get destination field from received message.;- ; Inputs:'; R0 = Address of characteristics block 7; R1 = Default status (CS.IGN = Characteristic ignored)e ; R3 = Address of the I/O packet.; R5 = Port State table (contains source addr);m ; Outputs:*; R1 = Status to return for characteristic;ABRCVADR: CMP C.DATI(R0),#6 ; Are there at least 6 bytes available? BLO 10$ ; If LO, no MOV P.RDAD(R5),C.CHRL(R0) MOV P.RDAD+2(R5),C.CHRL+2(R0) MOV P.RDAD+4(R5),C.CHRL+4(R0)< MOV #6,C.DATO(R0) ; Fill in Ethernet address and it's size/ MOV #CS.SUC,R1 ; Return successful completiont 10$: RETURN19 APR5PC RCVADR ; Make sure RCVADR is in APR5 addr spaceA s6 .SBTTL RCVPRO - Get protocol field from received msg.;+4; **-RCVPRO-Get protocol field from received message;c+; Get protocol field from received message.e;- ; Inputs: '; R0 = Address of characteristics blocko7; R1 = Default status (CS.IGN = Characteristic ignored)2 ; R3 = Address of the I/O packet"; R5 = Address of Port State Table;n ; Outputs:*; R1 = Status to return for characteristic;fBRCVPRO: CMP C.DATI(R0),#2 ; Are there at least 2 bytes available? BLO 10$ ; If LO, no MOV P.RPRO(R5),C.CHRL(R0)= MOV #2,C.DATO(R0) ; Fill in Ethernet protocol and it's sizef/ MOV #CS.SUC,R1 ; Return successful completione 10$: RETURNd9 APR5PC RCVPRO ; Make sure RCVPRO is in APR5 addr space  o7 .SBTTL RCVDAD - Get source field from received message2;+2; **-RCVDAD-Get source field from received message;S(; Get source field from received message;- ; Inputs:h'; R0 = Address of characteristics block#7; R1 = Default status (CS.IGN = Characteristic ignored)I ; R3 = Address of the I/O packet; R5 = Port State Table ;i ; Outputs:*; R1 = Status to return for characteristic;RBRCVDAD: CMP C.DATI(R0),#6 ; Are there at least 6 bytes available? BLO 10$ ; If LO, no4 MOV P.RSAD(R5),C.CHRL(R0) ; Put Sender's Ethernet< MOV P.RSAD+2(R5),C.CHRL+2(R0) ; ... address into AUX buffer$ MOV P.RSAD+4(R5),C.CHRL+4(R0) ; ...< MOV #6,C.DATO(R0) ; Fill in Ethernet address and it's size/ MOV #CS.SUC,R1 ; Return successful completionG 10$: RETURNt9 APR5PC RCVDAD ; Make sure RCVDAD is in APR5 addr spacet a< .SBTTL XMCHR - Process transmit auxilliary characteristics;+6; **00~} D%B11110010-XMCHR-Process transmit auxilliary characteristics; G; Process the characteristics present in the auxilliary characteristicsS!; buffer on the transmit request.,;- ; Inputs:. ; R3 = Address of the I/O packet:; I.PRM+6 - Virtual address of the characteristics buffer1; I.PRM+10- Length of the characteristics buffer;; R4 = Port Status Table,; R5 = Address of the Controller State Table;u; Registers modified:d ; R0, R1, R2;.5XMTCH: MOV IP.EXT(R3),R0 ; R0 = I/O packet extensioni/ .IF DF M$$MGE ; Memory management supported?a, MOV IX.AUX(R0),@#KISAR6 ; Map to AUX buffer/ .IF DF K$$DAS ; Kernel data space supported?o4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ; M$$MGED BIC #PS.ADR!PS.PRO,P.FLAG(R5) ; Clear addr/protocol found flag bits? MOV I.PRM+6(R3),R0 ; Point to start of characteristics buffer 0 MOV R0,P.WORK(R5) ; Compute end of user buffer: ADD I.PRM+10(R3),P.WORK(R5) ; P.WORK = End of user buffer<10$: MOV #CS.IGN,R1 ; Assume characteristic will be ignored3 MOV (R0),R2 ; Get next characteristics type code.. SUB #CC.ADR,R2 ; Normalise for DLX functions2 BLT 20$ ; If LT, not one of our characteristics ASL R2 ; Form word offset CMP R2,#XMMAX ; In range?P BHIS 20$ ; If HIS, no3 CALL @XMTTBL(R2) ; Dispatch to processing routine;>20$: MOV R1,C.STAT(R0) ; Return status of this characteristic2 ADD C.DATI(R0),R0 ; Point to next characteristic ADD #C.CHRL,R0 ; ...& CMP R0,P.WORK(R5) ; Are we done yet? BLO 10$ ; If LO, no( CALL MAPDRV ; Map to 2nd 4K of driver RETURNc;+); Transmit characteristics dispatch tableX;-=XMTTBL: .WORD XMTADR ; Define Ethernet address for transmitL7 .WORD XMTPRO ; Define Ethernet protocol for transmitBXMMAX =.-XMTTBLS7 APR5PC XMTCH ; Make sure XMTCH is in APR5 addr space :5 .SBTTL XMTADR - Define Ethernet address for transmitt;+0; **-XMTADR-Define Ethernet address for transmit;AG; Define the Ethernet address to be used for this message transmission.;;- ; Inputs:C'; R0 = Address of characteristics blockR7; R1 = Default status (CS.IGN = Characteristic ignored) ; R3 = Address of the I/O packet,; R5 = Address of the Controller State Table; ; Outputs:*; R1 = Status to return for characteristic;CXMTADR: CMP C.DATI(R0),#6 ; Are there at least 6 bytes of address?B BLO 10$ ; If LO, no8 MOV C.CHRL(R0),P.XDAD(R5) ; Fill in Ethernet address$ MOV C.CHRL+2(R0),P.XDAD+2(R5) ; ...$ MOV C.CHRL+4(R0),P.XDAD+4(R5) ; ...; BIS #PS.ADR,P.FLAG(R5) ; Indicate Ethernet address seenr1 MOV #CS.SUC,R1 ; Return successful completion 10$: RETURNi9 APR5PC XMTADR ; Make sure XMTADR is in APR5 addr space  o6 .SBTTL XMTPRO - Define Ethernet protocol for transmit;+1; **-XMTPRO-Define Ethernet protocol for transmit ;AH; Define the Ethernet protocol to be used for this message transmission.;- ; Inputs:R'; R0 = Address of characteristics blockC7; R1 = Default status (CS.IGN = Characteristic ignored)R ; R3 = Address of the I/O packet0; R5 = Address of the physical link access block; ; Outputs:*; R1 = Status to return for characteristic;PDXMTPRO: CMP C.DATI(R0),#2 ; Are there at least 2 bytes of protocol? BLO 10$ ; If LO, no7 MOV C.CHRL(R0),P.XPRO(R5) ; Fill in Ethernet protocolc= BIS #PS.PRO,P.FLAG(R5) ; Indicate Ethernet protocol seen 5 MOV #CS.SUC,R1 ; Return successful completionA 10$: RETURNc9 APR5PC XMTPRO ; Make sure XMTPRO is in APR5 addr spacet n+ .SBTTL GTCHR - Get device characteristics5;+%; **-GTCHR-Get device characteristicsk; C; The get characteristics function is used to read device dependent *; characteristics for Ethernet interfaces.;- ; Inputs:?; R3 = Address of I/O packet; R4 = Contoller State Table; r5 = Port State Table;S; Registers modified: ; R0, R1, R2;e .ENABL LSBeGTCHR: MOV R3,-(SP) ; Save R3/ .IF DF M$$MGE ; Memory management supported? 9 MOV @IP.EXT(R3),@#KISAR6 ; Map to characteristics bufferB/ .IF DF 00~}TADATADATADATADATADATADATADATADATAK$$DAS ; Kernel data space supported?G4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ; M$$MGE7 MOV I.PRM+2(R3),R0 ; R0 = Virtual addr of user buffer@ MOV R0,P.WORK+4(R5) ; Save start addr for later. We will need/ ; ... it to compute how much of the buffero# ; ... we were able to process.S2 MOV R0,-(SP) ; Compute address past end of block ADD I.PRM+4(R3),(SP) ; ...o? MOV C.PROL(R4),P.WORK(R5) ; Save protocol and multicast listB8 MOV P.MCST(R5),P.WORK+2(R5) ; ... pointer in work area.210$: MOV (R0),R2 ; Get next characteristics type BEQ 40$ ; No more0 SUB #CC.DST,R2 ; Normalise for driver dispatch2 BLT 20$ ; If LT, not one of our characteristics ASL R2 ; Form word offset CMP R2,#GETMAX ; In range? BHIS 20$ ; If HIS, no+ MOV #CS.IGN,R1 ; Assume request too smallR3 CALL @GETTBL(R2) ; Dispatch to processing routineM BR 20$ ; )15$: MOV #CE.UDF,R1 ; Undefined functionr CLR R2 ; Nothing processedV720$: MOV R1,C.STAT(R0) ; Return status of this request:; MOV R2,C.DATO(R0) ; Return length of returned informationN=30$: ADD C.DATI(R0),R0 ; Point to next characteristics blockT ADD #C.CHRL,R0 ; ...! CMP R0,(SP) ; Are we done yet?  BLO 10$ ; If LO, no40$:! TST (SP)+ ; Clean up the stackH+ MOV (SP)+,R3 ; Restore I/O packet address ( CALL MAPDRV ; Map to 2nd 4K of driver< MOV P.CTBL(R5),R4 ; Restore Controller State Table pointer6 MOV R0,R1 ; Indicate we processed all of the buffer? SUB P.WORK+4(R5),R1 ; Compute number of characteristics proc.O# MOV #CS.SUC,R0 ; Indicate successo CALLR RQDON ; Post completion .DSABL LSB ;+$; Get characteristics dispatch table;-:GETTBL: .WORD GETDST ; Get remote address/protocol pairs) .WORD GETMCT ; Get a multicast addressGETMAX =.-GETTBL7 APR5PC GTCHR ; Make sure GTCHR is in APR5 addr spaceK r2 .SBTTL GETDST - Get remote address/protocol pairs;+-; **-GETDST-Get remote address/protocol pairss;aG; Get the next protocol and associated addresses enabled for this port.c;- ; Inputs:#'; R0 = Address of characteristics blockD2; R1 = Default status (CE.RTS = Request too small); R3 = Address of I/O packet; R4 = Controller State Tablet; R5 = Port State Tablep;s ; Outputs:*; R1 = Status to return for characteristic); R2 = # of bytes of returned information ;i; Registers modified:r ; R1, R2, R4;-2GETDST: CLR R2 ; Assume no output data available8 CMP C.DATI(R0),#4 ; Enough space for a protocol entry? BLO 100$ ; If LO, noe$ CLR -(SP) ; Reserve cell on stack310$: MOV #CS.SUC,R1 ; Assume successful completion=/ MOV R0,R2 ; Compute address of output buffer3 ADD #C.CHRL,R2 ; ...2 MOV P.WORK(R5),R4 ; Get next protocol list entry BEQ 50$ ; If EQ, no more=6 MOV (R4),P.WORK(R5) ; Move on down the protocol list3 MOV C.DATI(R0),(SP) ; Set up remaining byte count0 SUB #4,(SP) ; ... for building characteristic CLR -(SP) ; Initialise flag8 MOV PL.PRO(R4),(R2)+ ; Assume we will use this protocolA MOV PL.FLG(R4),(R2)+ ; Set up flags and usage count for protocolC2 ADD #PL.ADD,R4 ; Point to address chain listhead120$: MOV (R4),R4 ; Get next address chain entry; BEQ 40$ ; If EQ, no moree* CMP AD.PRT(R4),R5 ; Is it for this port?' BNE 20$ ; If NE, no ... keep lookinge+ INC (SP) ; Indicate valid protocol foundS0 SUB #6,2(SP) ; Reduce count of remaining bytes+ BLT 30$ ; If LT, insufficient space left)7 MOV AD.ADD(R4),(R2)+ ; Copy address into output buffer  MOV AD.ADD+2(R4),(R2)+ ; .... MOV AD.ADD+4(R4),(R2)+ ; ...d BR 20$ ; Keep looking#30$: MOV #CS.DAO,R1 ; Data overrunh040$: TST (SP)+ ; Was this protocol acceptable? BEQ 10$ ; If EQ, no%50$: TST (SP)+ ; Clean up the stack5, SUB R0,R2 ; Compute length of output data SUB #C.CHRL,R2 ; ... 100$: RETURN9 APR5PC GETDST ; Make sure GETDST is in APR5 addr spacef i( .SBTTL GETMCT - Get a multicast address;+#; **-GETMCT-Get a multicast addresso;a7; Get the next multica00~} D%B11110010st address enabled for this port..;- ; Inputs:('; R0 = Address of characteristics blockg2; R1 = Default status (CE.RTS = Request too small); R3 = Address of I/O packet; R4 = Controller State Tableo; R5 = Port State Tablee;u ; Outputs:*; R1 = Status to return for characteristic); R2 = # of bytes of returned information;R; Registers modified:e; R4;s6GETMCT: MOV R0,R2 ; Compute address of output buffer ADD #C.CHRL,R2 ; ...; CMP C.DATI(R0),#6 ; Enough space for a multicast address?a BLO 20$ ; If LO, no8 MOV P.WORK+2(R5),R4 ; Get next multicast address entry BEQ 10$ ; If EQ, no moreC MOV (R4),P.WORK+2(R5)? MOV ML.ADD(R4),(R2)+ ; Copy multicast address to output buffer MOV ML.ADD+2(R4),(R2)+ ; ...  MOV ML.ADD+4(R4),(R2)+ ; ...r,10$: MOV #CS.SUC,R1 ; Return success status020$: SUB R0,R2 ; Compute length of output data SUB #C.CHRL,R2 ; ... RETURNt7 APR5PC GTMCT ; Make sure GTMCT is in APR5 addr spaceD 0+ .SBTTL STCHR - Set device characteristicsa;+%; **-STCHR-Set device characteristics5;4E; The set characteristics function is used to set up device dependentVF; functions for the Ethernet interfaces (e.g. Protocol/address pairs).;- ; Inputs:M; R3 = Address of I/O packet; R4 = Controller State Table; R5 = Port State TableR;r; Registers modified:S; R0, R1, R2, R3, R4;t .ENABL LSBa&STCHR: MOV R3,-(SP) ; Save I/O packet/ .IF DF M$$MGE ; Memory management supported?c9 MOV @IP.EXT(R3),@#KISAR6 ; Map to characteristics buffer / .IF DF K$$DAS ; Kernel data space supported? 4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ; M$$MGE: MOV I.PRM+2(R3),R0 ; R0 = Characteristics buffer pointer9 MOV R0,P.WORK(R5) ; Save start addr of buffer. We willP) ; ... need it to compute how much ofS, ; ... the buffer we were able to procss: MOV R0,P.WORK+2(R5) ; Initialize how far we got pointer.2 MOV R0,-(SP) ; Compute address past end of block ADD I.PRM+4(R3),(SP) ; ...b210$: MOV (R0),R2 ; Get next characteristics type BEQ 30$ ; No more, MOV #CE.UDF,R1 ; Assume undefined function$ SUB #CC.DST,R2 ; Make it an index 2 BLT 20$ ; If LT, not one of our characteristics ASL R2 ; Form word offset CMP R2,#SETMAX ; In range? BHIS 20$ ; If HIS, no+ MOV #CE.RTS,R1 ; Assume request too small  MOV R0,-(SP) ; Save R03 CALL @SETTBL(R2) ; Dispatch to processing routine. MOV (SP)+,R0 ; Restore R0a$ BCS 40$ ; If CS, stop processing  ; ... characteristics720$: MOV R1,C.STAT(R0) ; Return status of this requestN9 ADD C.DATI(R0),R0 ; Point to next characteristics blockB ADD #C.CHRL,R0 ; ...< MOV R0,P.WORK+2(R5) ; Indicate how far we got successfully! CMP R0,(SP) ; Are we done yet?R BLO 10$ ; If LO, no030$: MOV #CS.SUC,R1 ; Indicate, processed all  ; ... characteristics%40$: TST (SP)+ ; Clean up the stack;+ MOV (SP)+,R3 ; Restore I/O packet addressR4 MOV P.CTBL(R5),R4 ; Restore Controller State Table( CALL MAPDRV ; Map to 2nd 4K of driverC SUB P.WORK(R5),P.WORK+2(R5) ; Compute how much we have processedn6 MOV P.WORK+2(R5),I.PRM+4(R3) ; Save it in I/O packet7 MOV R1,I.PRM+2(R3) ; Save status code in I/O packetf3 BIT #PS.MLC,P.FLAG(R5) ; Multicast list changed?; BEQ 50$ ; NoM1 MOV IP.EXT(R3),R0 ; R0 = I/O packet extension.@ MOV #FN.WML,IX.FCN(R0) ; Write Multicast List to UNA function6 $QPKT C.PFNC ; Queue packet to function pending Q- CALLR FNINI ; Try to initiate a functionD&50$: MOV I.PRM+2(R3),R0 ; R0 = Status+ MOV I.PRM+4(R2),R1 ; R1 = Bytes processedh& CALLR RQDON ; Return status to user .DSABL LSBi;+$; Set characteristics dispatch table;-=SETTBL: .WORD SETDST ; Define remote address/protocol pairsi) .WORD SETMCT ; Set a multicast addressXSETMAX =.-SETTBL7 APR5PC STCHR ; Make sure STCHR is in APR5 addr spaceu s5 .SBTTL SETDST - Define remote address/protocol pairst;+0; **-SETDST-Define remote address/protocol pairs;eC; Define00~}TADATADATADATADATADATADATADATADATA a number of address/protocol pairs for the specified port.R;- ; Inputs:y+; R0 = Address of the characteristics blocks2; R1 = Default status (CE.RTS = Request too small); R3 = Address of I/O packet; R4 = Controller State tablee; R5 = Port State Table;O ; Outputs:*; R1 = Status to return for characteristic;; 'C' Clear - Address/protocol entries successfully created7; 'C' Set - failed to create address/protocol entriesr;; Registers modified:r ; R0, R2, R4;t;SETDST: MOV R0,R4 ; Copy address of characteristics blocko6 CLR P.WORK+4(R5) ; Show no allocations performed yet CLR P.WORK+6(R5) ; ...9 MOV C.DATI(R4),R2 ; Get length of characteristics block=) SUB #4,R2 ; Remove protocol descriptort- BEQ 15$ ; Br if no addresses - only headerp& BLT 200$ ; If LT, request too small210$: SUB #6,R2 ; Remove another Ethernet address BGT 10$ ; If GT, more to go& BMI 200$ ; If MI, request too small515$: MOV #CE.PCN,R1 ; Assume protocol usage conflictT?20$: MOV P.CTBL(R5),R2 ; Get address of protocol list listheadR ADD #C.PROL,R2 ; ...730$: MOV (R2),R2 ; Get address of next protocol blockT BEQ 50$ ; If EQ, no morer6 CMP PL.PRO(R2),C.CHRL(R4) ; Protocol already in list?% BNE 30$ ; If NE, not this protocol 1 MOVB PL.FLG(R2),R0 ; Get current protocol flagsl9 BISB C.CHRL+2(R4),R0 ; ... or'd with new protocol flags17 BIT #LF.EXC,R0 ; Did either request exclusive access?o. BNE 200$ ; If NE, yes ... protocol conflict+ BITB #LF.DEF,C.CHRL+2(R4) ; Default owner? 7 BEQ 40$ ; If EQ, we are not enabling a default owner., BITB #LF.DEF,PL.FLG(R2) ; Can we enable it?2 BNE 200$ ; If NE, default owner already enabledA40$: MOVB PL.FLG(R2),-(SP) ; Check for consistent padding request  BIC #^C,(SP) ; ...L MOVB C.CHRL+2(R4),R0 ; ... BIC #^C,R0 ; ...0 CMP R0,(SP)+ ; Did they both request the same? BNE 200$ ; If NE, no & BR 60$ ; Use current protocol block850$: MOV #PL.LEN,R1 ; Get length of protocol list entry# CALL $ALOCB ; Allocate the blockI Q5 MOV #CE.RES,R1 ; Assume resource allocation failureL' BCS 200$ ; If CS, allocation failure 1 MOV R0,R2 ; Copy address of the protocol blockL" CLR (R0)+ ; Clear the link word. MOVB C.CHRL+2(R4),(R0)+ ; Copy protocol flags CLRB (R0)+ ; Zero usage count1 MOV C.CHRL(R4),(R0)+ ; Fill in the protocol type 2 CLR (R0)+ ; Assume no default or exclusive user* CLR (R0) ; Build address chain listhead MOV R0,2(R0) ; ... MOV R4,-(SP) ; Temp save R4C1 MOV P.CTBL(R5),R4 ; R4 = Controller state tableS- MOV R2,@C.PROL+2(R4) ; Add protocol entry toS. MOV R2,C.PROL+2(R4) ; ... end of master list MOV (SP)+,R4 ; Restore R4o=60$: BITB #LF.EXC!LF.DEF,C.CHRL+2(R4) ; Exclusive or default?R2 BEQ 70$ ; If EQ, not exculsive or default owner7 MOV R5,PL.DEF(R2) ; Set up default or exclusive ownerl>70$: MOV R2,P.WORK+4(R5) ; Save address of the protocol block; MOV C.DATI(R4),R2 ; Get size of the characteristics block SUB #4,R2 ; Remove overhead. BEQ 75$ ; If EQ, no addresses to be enabled# CALL BLDADR ; Build address listc BCS 200$ ; If CS, failure>75$: MOV P.WORK+4(R5),R2 ; Get address of protocol list entry780$: MOV P.WORK+6(R5),R0 ; Get next address list entryt BEQ 90$ ; If EQ, no morex* MOV (R0),P.WORK+6(R5) ; Save next address% CLR (R0) ; Clear out the link word0 MOV R0,@PL.ADD+2(R2) ; Add address entry to theA MOV R0,PL.ADD+2(R2) ; ... end of the list on the protocol blockc& INCB PL.USE(R2) ; Update usage count BR 80$ ; ... and loop%90$: BITB #LF.EXC!LF.DEF,C.CHRL+2(R4)B9 BEQ 100$ ; If EQ, not an exclusive or default protocolV# INCB PL.USE(R2) ; Inc usage counto*100$: MOV #CS.SUC,R1 ; Set success status CLC ; Indicate success RETURN9;+M; We are unable to build the protocol block and/or the address blocks becauseaN; of an address or protocol conflict or a resource allocation failure. Release<; the data structures we have allocated and return an error.;-)200$: MOV R1,-(SP) ; Save t00~} D%B11110010he error code >210$: MOV P.WORK+6(R5),R0 ; Get next address block to release BEQ 220$ ; If EQ, nonev5 MOV (R0),P.WORK+6(R5) ; Save addr of next addr blocko1 MOV #AD.LEN,R1 ; Set length of an address blockC% CALL $DEACB ; Deallocate the block+ BR 210$ ; ... and loopt6220$: CALL SCNPR ; Scan for inactive protocol blocks' MOV (SP)+,R1 ; Recover the error codeo SEC ; Indicate failure RETURNh9 APR5PC SETDST ; Make sure SETDST is in APR5 addr space $6 .SBTTL SCNPR - Scan protocol list for unused entries;+0; **-SCNPR-Scan protocol list for unused entries; F; Scan the protocol list for entries which have a zero usage count and; return them to the pool.;- ; Inputs:s"; R5 = Address of Port State table;h; Registers modified:.; R0, R1, R2, R4; <SCNPR: MOV P.CTBL(R5),R2 ; Get address of protocol listhead ADD #C.PROL,R2 ; ...110$: MOV (R2),R0 ; Get next protocol list entryP BEQ 40$ ; If EQ, no more / TSTB PL.USE(R0) ; Is this block still in use?  BEQ 20$ ; If EQ, no$ MOV R0,R2 ; Move on down the list BR 10$ ; ...e520$: MOV (R0),(R2) ; Unlink protocol entry from listv% BNE 30$ ; If NE, not last in chain ? MOV P.CTBL(R5),R4 ; Make sure we have Controller State Tabble+ MOV R2,C.PROL+2(R4) ; Fix up tail pointer830$: MOV #PL.LEN,R1 ; Get length of protocol list entry" MOV R2,-(SP) ; Save list pointer% CALL $DEACB ; Deallocate the block % MOV (SP)+,R2 ; Restore list pointer BR 10$ ; ... and loop 40$: RETURNn + .SBTTL BLDADR - Build address list entriesn;+&; **-BLDADR-Build address list entries;0+; Build the specified address list entries.B;- ; Inputs:E8; R2 = # of bytes remaining in the characteristics block+; R4 = Pointer to the characteristics block2"; R5 = Address of port state table;# ; Outputs:!; R1 = Error code (if applicable)9; 'C' Clear - Address list entries successfully allocatedc5; 'C' Set - Failed to allocate address list entries; ; Registers modified:; R0, R2;+BLDADR: MOV R4,-(SP) ; Get a free registern4 ADD #C.CHRL+4,R4 ; Point to first Ethernet address>10$: MOV #CE.IUM,R1 ; Assume illegal use of multicast address- BIT #1,(R4) ; Is this a multicast address?s BNE 100$ ; If NE, yes5 MOV P.WORK+4(R5),R0 ; Get pointer to protocol entryt ADD #PL.ADD,R0 ; ...+ CALL CHKADD ; Check for address conflict 1 MOV #CE.PCN,R1 ; Assume protocol usage conflictC+ BCS 100$ ; If CS, address already in user2 MOV R5,R0 ; Get pointer to list of address list/ ADD #P.WORK+6,R0 ; ... entries just allocatedH+ CALL CHKADD ; Check for address conflict* MOV #CE.MCE,R1 ; Assume address conflict+ BCS 100$ ; If CS, address already in usea MOV R2,-(SP) ; Save byte count6 MOV #AD.LEN,R1 ; Get length of an address list entry# CALL $ALOCB ; Allocate the block# MOV (SP)+,R2 ; Restore byte countn5 MOV #CE.RES,R1 ; Assume resource allocation failurec' BCS 100$ ; If CS, allocation failurei MOV P.WORK+6(R5),(R0)5 MOV R0,P.WORK+6(R5) ; Link block onto pending chain;" TST (R0)+ ; Skip over link word .REPT 3, MOV (R4)+,(R0)+ ; Fill in Ethernet address .ENDR. MOV R5,(R0)+ ; Set up address of owning port9 SUB #6,R2 ; Remove another ethernet address from countL BNE 10$ ; If NE, loop# MOV #CS.SUC,R1 ; Indicate successl TST (PC)+ ; ...100$: SEC ; Indicate failure! MOV (SP)+,R4 ; Recover registera RETURN  l( .SBTTL CHKADD - Check for address match;+#; **-CHKADD-Check for address match.;KC; Scan an address list for a match on a specified Ethernet address.n;- ; Inputs:T(; R0 = Address of listhead to be scanned); R4 = Address of 3 word Ethernet addressd;s ; Outputs:!; R1 = Error code (if applicable) /; 'C' Clear - No match on any entry in the list 1; 'C' Set - Match on an entry in the list found(;+; Registers modified: ; R0;t@CHKADD: MOV #CE.ACN,R1 ; Assume possible address usage conflict$10$: CLC ; Assume no more entries2 MOV (R0),R0 ; Get address of next entry in list B00~}TADATADATADATADATADATADATADATADATAEQ 20$ ; If EQ, no more 2 CMP AD.ADD(R0),(R4) ; Check for matching address BNE 10$ ; If NE, no match CMP AD.ADD+2(R0),2(R4) ; ...d BNE 10$ ; ... CMP AD.ADD+4(R0),4(R4) ; ...c BNE 10$ ; ...) SEC ; Indicate a match has been founde20$: RETURN ; Returnc n4 .SBTTL SETMCT - Enable a multicast address for port;+&; **-SETMCT-Enable a multicast address;p8; Enable a new multicast address for the specified port.;- ; Inputs:M+; R0 = Address of the characteristics blocki2; R1 = Default status (CE.RTS = Request too small)(; R4 = Address of controller state table"; R5 = Address of port state table;, ; Outputs:*; R1 = Status to return for characteristic:; 'C' Clear - Multicast address entry successfully created6; 'C' Set - Failed to create multicast address entry;E; Registers modified:s; R0, R2;+BSETMCT: CMP C.DATI(R0),#6 ; Do we have a valid multicast address?% BLO 100$ ; If LO, no ... too small! BEQ 10$ ; If EQ, exactly righth$ MOV #CE.RTL,R1 ; Request too large BR 100$ ; ... and exit 510$: MOV #CE.NMA,R1 ; Assume not a multicast addressA0 BIT #1,C.CHRL(R0) ; Is it a multicast address? BEQ 100$ ; If EQ, nor- MOV R5,R2 ; Get multicast address listhead  ADD #P.MCST,R2 ; ...@20$: MOV (R2),R2 ; Get address of next multicast address entry BEQ 30$ ; If EQ, no moreE CMP ML.ADD(R2),C.CHRL(R0) BNE 20$ ; If NE, keep looking CMP ML.ADD+2(R2),C.CHRL+2(R0) BNE 20$ CMP ML.ADD+4(R2),C.CHRL+4(R0) BNE 20$4 MOV #CE.MCE,R1 ; Multicast address already enabled BR 100$:30$: MOV R0,-(SP) ; Save address of characteristics block? MOV #ML.LEN,R1 ; Get length of a multicast address list entryn% CALL $ALOCB ; Allocate a new blocke3 MOV (SP)+,R2 ; R2 = Addr of characteristics block,! BCS 100$ ; If CS, no resourcest MOV C.CHRL(R2),ML.ADD(R0) MOV C.CHRL+2(R2),ML.ADD+2(R0) MOV C.CHRL+4(R2),ML.ADD+4(R0)3 CLR (R0) ; Link to end of multicast address list$ MOV R0,@P.MCST+2(R5) ; ...R MOV R0,P.MCST+2(R5) ; ... 9 BIS #PS.MLC,P.FLAG(R5) ; Indicate multicast list changedR1 MOV #CS.SUC,R1 ; Indicate successful completionV TST (PC)+ ; Indicate successl100$: SEC ; Indicate failure  RETURN;9 APR5PC SETMCT ; Make sure SETMCT is in APR5 addr spacee c+ .SBTTL STMLT - Enable multicast addresses;+%; **-STMLT-Enable multicast addresses(;,<; The following function will inform the UNA which multicast; addresses have been enabled.;-; Input:; R5 = Port status table; R4 = Controller state table#; R3 = Address of I/O packet!; I.PRM+2 = Caller's I/O statusS$; I.PRM+4 = Caller's R1 I/O status; ; Output: '; Multicast list is written to the UNA.c; 'C' bit set on error%; 'C' bit cleared for good I/O statuss&; I/O DONE IS RETURNED FOR THE REQUEST;- .ENABL LSBc#STMLT: CALL SALL ; Save registersu$ CALL BLDML ; Build multicast list1 TSTB C.MLT(R4) ; Do we have multicast addressesr/ BEQ 20$ ; No, just return I/O status to userr0 MOV C.PCBP(R4),R2 ; R2 = Port Control Block% CLR (R2)+ ; Clear function word 1 CMPB C.MLT(R4),C.MMAX(R4) ; Max number exceeded?t3 BHI 10$ ; Yes, put UNA in all multicast modet2 MOV RELCT,(R2) ; Put unibus relocation in PCB MOV RELCT+2,2(R2) ; ...< ADD C.WRKP(R4),(R2)+ ; Add offset into UMR mapped region ADC (R2)+ ; ...u8 MOVB C.MLT(R4),-(R2) ; Put # of milticast addr in PCBB/ MOV #FN.WML,R1 ; R1 = Write multicast listN( CALLR LODFN ; Execute the function;B ; Enable all multicast addresses;k?10$: BIS #MD.ENL,C.MODE(R4) ; Enable all multicast addressesX: MOV C.MODE(R4),(R2) ; Put it in Port Control Block (PCB)) MOV #FN.WMD,R1 ; Write mode function ( CALLR LODFN ; Execute the function;2'; Write Multicast Address list complete;;dWMLDN: BCS 40$ ; Error?i+20$: MOV I.PRM+2(R3),R0 ; R0 = Status code(:30$: MOV I.PRM+4(R3),R1 ; R1 = Length of buffer processed CALLR RQDON ; Report I/O doneD40$: CMPB #IO.XCH/400,I.FCN+1(R3) ; Are we processing char.funct00~} D%B11110010ion?% BNE 20$ ; No, keep caller's status * MOV #IE.ABO&377,R0 ; Set up abort status BR 20$ ; Return abort statusn .DSABL LSB) M0 .SBTTL BLDML - Build multicast addresses table;+*; **-BLDML-Build multicast addresses table;t9; Build the multicast address table for the set multicasti ; function.P;- ; Inputs:R!; R5 = Points to Port State TableR;R ; Outputs:5; 'C' Clear - Control function processing may proceedo1; 'C' Set - Control function processing delayedo;s; Registers modified:E; R0, R1;k8BLDML: CLR C.MLT(R4) ; Zero multicast addresses counter, MOV R4,R1 ; Compute address of port table ADD #C.PORT,R1 ; ... listheadB310$: MOV (R1),R1 ; Get address of next port tablem BEQ 80$ ; If EQ, no more+ MOV R1,R0 ; Compute address of multicast ' ADD #P.MCST,R0 ; ... address listhead520$: MOV (R0),R0 ; Get next multicast address entryC BEQ 10$ ; If EQ, no moreo MOV R1,-(SP) ; Save R1, R2 MOV R2,-(SP) ; ...0 MOV C.WRKP(R4),R1 ; Get pointer to work buffer CLR R2 ; Clear high byte)1 MOVB C.MLT(R4),R2 ; Get # of addresses to check;! BEQ 50$ ; If EQ, none to checkD@30$: CMP ML.ADD(R0),(R1) ; Check for matching multicast address BNE 40$ ; If NE, no match CMP ML.ADD+2(R0),2(R1), BNE 40$ CMP ML.ADD+4(R0),4(R1) 7 BEQ 60$ ; If EQ, multicast address already in buffer,'40$: ADD #6,R1 ; Skip over this entryB! SOB R2,30$ ; Check all entriesR:50$: MOV ML.ADD(R0),(R1)+ ; Fill in this multicast address MOV ML.ADD+2(R0),(R1)+r MOV ML.ADD+4(R0),(R1)+a6 INCB C.MLT(R4) ; Update count of multicast addresses&60$: MOV (SP)+,R2 ; Restore registers MOV (SP)+,R1 ; ...A CMPB C.MLT(R4),C.MMAX(R4) ; Have we reached max multicast addr. ; BLOS 20$ ; Loop for next address to enable for this port070$: SEC ; ...; BR 90$ ;c"80$: CLC ; Indicate good return90$: RETURN ; r< .SBTTL ****************************************************< .SBTTL * Non-DLX Function Processors *< .SBTTL ****************************************************5 .SBTTL NDLXF - Dispatch table for non-DLX functionsR;+'; Dispatch table for non-DLX functions. ;L ; Format:X-; .WORD ADDR ; Address of function processorB'; .BYTE FLAGS ; Flag bits, if set TRUEl=; .BYTE SIZE ; Max size of input/output data buffer requiredC; ; Flag bit definitions::;-'F.PRIV = 1 ; Read privelege flag bit*/F.LESS = 2 ; Buffer may be less than maximum "F.READ = 4 ; Function is a readNDLXF:! .WORD INVFUN ; 00 NOP function* .BYTE 0 ; Filler byte. .BYTE 0 ; Filler byteo5 .WORD INVFUN ; 01 Load and Start Microcode AddressX$ .BYTE 0 ; Must be priveleged# .BYTE 0 ; One word of inputB) .WORD REDDAD ; 02 Read Default Address3 .BYTE F.READ ; Anyone can use this functionr1 .BYTE 3*2 ; Requires 3 word output bufferV! .WORD INVFUN ; 03 NOP function .BYTE 0 ; Filler bytee .BYTE 0 ; Filler byte * .WORD REDADD ; 04 Read Physical Address3 .BYTE F.READ ; Anyone can use this function.1 .BYTE 3*2 ; Requires 3 word output buffer0+ .WORD WRTADD ; 05 Write Physical Address0) .BYTE F.PRIV ; Must be privilaged + .BYTE 3*2 ; Requires 3 word input addressR0 .WORD REDMLT ; 06 Read Multicast Address List/ .BYTE F.LESS!F.READ ; Must be privilagedu- .BYTE 6*10. ; Requires max of 10. addresses 1 .WORD INVFUN ; 07 Write Multicast Address ListY .BYTE 0 ; Filler byteO .BYTE 0 ; Filler byteA% .WORD INVFUN ; 10 Read Ring Formata .BYTE 0 ; Filler byte2 .BYTE 0 ; Filler bytet& .WORD INVFUN ; 11 Write Ring Format .BYTE 0 ; Filler byte; .BYTE 0 ; Filler byteY" .WORD READCT ; 12 Read Counters9 .BYTE F.LESS!F.READ ; Anyone can use this functionY+ .BYTE 32.*2 ; Output buffer > 0 and < 32., .WORD READCC ; 13 Read And Clear CountersA .BYTE F.PRIV!F.LESS!F.READ; Must be priveleged, BUF can be < max + .BYTE 32.*2 ; Output buffer > 0 and < 3200~~TADATADATADATADATADATADATADATADATA.t .WORD REDMOD ; 14 Read Mode- .BYTE F.READ ; Anyone can use this functionY( .BYTE 1*2 ; Requires a one word buffer .WORD WRTMOD ; 15 Write Mode0( .BYTE F.PRIV ; Must be priveleged user) .BYTE 1*2 ; Requires a one word buffern% .WORD REDSTA ; 16 Read Port Statusn- .BYTE F.READ ; Anyone can use this functiont. .BYTE 4*2 ; Four word output buffer required/ .WORD REDCST ; 17 Read And Clear Port Status;. .BYTE F.PRIV!F.READ ; Must be priveleged user. .BYTE 4*2 ; Four word output buffer required) .WORD INVFUN ; 20 Dump Internal Memoryn# .BYTE 0 ; Must be priveleged user + .BYTE 0 ; Buff size is tested by function;) .WORD INVFUN ; 21 Load Internal Memoryp# .BYTE 0 ; Must be priveleged users+ .BYTE 0 ; Buff size is tested by functiona# .WORD REDSID ; 22 Read System IDn: .BYTE F.LESS!F.READ ; Not priveleged, buffer can be < 1400 .BYTE 200. ; Up to 200. bytes of buffer needed$ .WORD WRTSID ; 23 Write System ID9 .BYTE F.PRIV!F.LESS ; Priveleged user, buff can be < 140e0 .BYTE 200. ; Up to 200. bytes of buffer needed- .WORD REDLOA ; 24 Read Load Server AddressY# .BYTE F.READ ; Anyone can read ito$ .BYTE 3*2 ; 3 word buffer required- .WORD WRTLOA ; 25 Write Load Server Address( .BYTE F.PRIV ; Must be priveleged user$ .BYTE 3*2 ; 3 word buffer requiredCHRMAX = .-NDLXF D, .SBTTL NDLXD - Non-DLX function dispatcher;+&; **-NDLXD-Non-DLX function dispatcher;OE; This routine is called to process the non-DLX function(s) specifiedrJ; in the user buffer pointed to by the optional diagnostic buffer pointer.;RH; If the optional diagnostic buffer is specified, this routine is calledL; before and after the receive or transmit is completed. On the first pass,M; the function requests with sign bit set are processed. On the second pass,e.; the positive function request are processed.;-J; Each function is handled individually. The request function code is usedH; as dispatch table index and a dispatch made to the individual handler.F; Each handler performs the required action and then returns to FUNSUC<; or FUNUNS and the next requset is processed in the buffer.;uH; If an individual request fails the request is left uncompleted and theG; next request in the buffer is processed. An invalid function requesteH; will terminate processing of the diagnostic buffer as it does not know+; how to step to the next request function.T;rN; This procedure is followed until the end-of-buffer is reached, at which time#; the control request is completed.r;r4; A Characteristics buffer has the following format:;r; Function Codee; Byte Count Inc; Byte Count Out; Status; Data; ; Next Function Code or 0 ; ...e;u ; INPUTS:a; R5 -> Port State Table; R4 -> Controller State Table; R3 = Address of I/O packett7; I.PRM+12(R3) = Virtual address of diagnostic buffero7; I.PRM+14(R3) = Length of optional diagnostic buffer'; I.PRM(R3) = I/O packet extensiond;- ; OUTPUTS:=; Function requests in the diagnostic buffer processed before0; control is returned to the function processor.;;- .ENABL LSBdNDLXD: .IF DF M$$MGE/ MOV IP.EXT(R3),R0 ; R0 = I/O packet extensiono3 MOV IX.DIG(R0),@#KISAR6 ; Map to diagnostic buffera/ .IF DF K$$DAS ; Kernel data space supported?d4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS< MOV @#KISAR6,C.KIR6(R4) ; Save mapping to diagnostic buffer .ENDC ;M$$MGE= MOV I.PRM+12(R3),R0 ; R0 = Vitual addr of diagnoctic buffere) MOV R0,C.DGBP(R4) ; Save buffer pointero+ MOV R0,C.DGBE(R4) ; Compute end of buffer" ADD I.PRM+14(R3),C.DGBE(R4) ; ...10$:( MOV (R0),R1 ; Get next function value BLE INVFUN ; Invalid function0 BIC #177600,R1 ; Generate dispatch table index ASL R1 ; ...s ASL R1 ; ...@" CMP R1,#CHRMAX ; Valid function? BHIS INVFUN ; No / ADD #NDLXF,R1 ; Point to dispatch table entry , CMP (R1),#INVFUN ; Is it a valid function?+ BEQ INVFUN ; Mark it as invalid functiono9 BIT #F.PRIV,2(R1) ; Function for p00~} D%B11110010riveleged tasks only?M BEQ 40$ ; No 0 MOV I.TCB(R3),R2 ; R2 = TCB of requesting task3 BIT #T3.PRV,T.ST3(R2) ; Is this a priveleged task?l" BEQ INVFUN ; No, ignore request40$:2 CMPB #-1,3(R1) ; Function tests the buffer size?$ BEQ 60$ ; Skip buffer size check.& MOV C.DATI(R0),R2 ; R2 = Buffer size' CMPB R2,3(R1) ; Is buffer big enough?a BEQ 60$ ; yes" BGT 70$ ; It can't be > maximum- BIT #F.LESS,2(R1) ; Is it ok if it is less?n BEQ 80$ ; No, buffer error 60$:' ADD #C.CHRL,R0 ; Point to data buffer 5 MOV R0,C.DGBP(R4) ; Save curent pointer into buffera .IF DF M$$MGE CALL MAPDRV ; Map to driver .ENDC ; M$$MGE % CALLR @(R1) ; Dispatch to function1;F; Request too largef;s.70$: MOV #CE.RTL,C.STAT(R0) ; Buffer too large! BR 100$ ; Process next requeste;C; Request too smallf; /80$: MOV #CE.RTS,C.STAT(R0) ; Request too smalla! BR 100$ ; Process next request);s'; Privelege violation, invalid functionb;eINVFUN:* MOV #CE.INV,C.STAT(R0) ; Invalid function BR 130$ ; Return)100$:e% ADD #C.CHRL,R0 ; Point to data area 6BUMP: ADD C.DATI-C.CHRL(R0),R0 ; Point to next request- CMP R0,C.DGBE(R4) ; Are we at end of buffer% BLO 10$ ; Go, process next request#-130$: CALL MAPDRV ; Map to 2nd 4K of driver;7 CMPB I.FCN+1(R3),#IO.XRC ; Is this a receive function?0 BNE 140$ ; No1 CALL RDIDN ; Return to receive diagnostic donen# BR 150$ ; Initiate next functiont3140$: CALL XDIDN ; Return to xmit diagnostic doneS,150$: CALLR FNINI ; Initiate next function7 APR5PC NDLXD ; Make sure NDLXD is in APR5 addr space KFUNSUC: MOV #CS.SUC,C.STAT-C.CHRL(R0); Indicate function request successfula BR BUMP ; Do next request7FUNUNS: MOV #CE.DNF,C.STAT-C.CHRL(R0); Indicate failure2 BR BUMP ; Do next request .DSABL LSB  i% .SBTTL REDDAD - Read Default Addresso& .SBTTL REDADD - Read Physical Address) .SBTTL REDLOA - Read Load Server Addressn;+;#; **- REDDAD - Read Default Addressi$; **- REDADD - Read Physical Address'; **- REDLOA - Read Load Server Address ;aB; These three routines are called to retreive the address desired.H; The UNA command is set up and the data returned is moved to the user'sG; buffer. If the user's buffer is too small a data overrun condition isP; given.;r ; INPUTS:.; R5 = Port State Table ; R4 = Controller State Table"; R3 = Address of I/O status block(; R0 = Pointer to user diagnostic buffer;n;- .ENABL LSBE3REDDAD: MOV #FN.RDA+200,R1 ; Move in function codes BR 10$e3REDADD: MOV #FN.RPA+200,R1 ; Move in function codes BR 10$o3REDLOA: MOV #FN.RSA+200,R1 ; Move in function codeh10$:# CALLR LODFN ; Load port functione .DSABL LSBh)DRADN: ; Entry for interrupt dispatcho)DRPDN: ; Entry for interrupt dispatche)DRSDN: ; Entry for interrupt dispatch BCS 10$ ; If carry set, error .IF DF M$$MGE( CALL MAPDRV ; Map to 2nd 4K of driver$ MOV C.PCBP(R4),R1 ; Point past PCB ADD #10,R1 ; ...0) MOV -(R1),-(SP) ; Save address on stack MOV -(R1),-(SP) ; ...1 MOV -(R1),-(SP) ; ...s3 MOV C.KIR6(R4),@#KISAR6 ; Map to diagnostic bufferc* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS/ MOV (SP)+,(R0) ; Store address in user buffer  MOV (SP)+,2(R0) ; ...s MOV (SP)+,4(R0) ; ...a9 MOV #6,C.DATO-C.CHRL(R0) ; Save number of bytes returned  .IFF . MOV C.PCBP(R4),R1 ; Point to 2nd word of PCB TST (R1)+ ; .../ MOV (R1)+,(R0) ; Store address in user bufferR MOV (R1)+,2(R0) ; ...R MOV (R1)+,4(R0) ; ...C9 MOV #6,C.DATO-C.CHRL(R0) ; Save number of bytes returned$ .ENDC ;M$$MGE# CALLR FUNSUC ; Complete request ;10$: CALLR FUNUNS ; Request failed9 APR5PC REDDAD ; Make sure REDDAD is in APR5 addr space (' .SBTTL WRTADD - Write physical address.* .SBTTL WRTLOA - Write load server address;+;s%; **- WRTADD - Write Physical Address,(; **- WRTLOA - Write Load Server Address;;H; This rou00~~TADATADATADATADATADATADATADATADATAtine sets the load server or physical address of the UNA. The F; address in the diagnostic buffer is given to the UNA using the Write7; Physical Adress or Write Load Server Address command. ;o ; INPUTS:e; R5 = Port State Table ; R4 = Controller State TableE; R3 = Address of I/O packet; R0 = Request function header;R;D;- .ENABL LSB WRTADD:+ MOV #FN.WPA+200,R1 ; Set up function code+ BR 10$*WRTLOA:-+ MOV #FN.WSA+200,R1 ; Set up function codee a10$: r .IF DF M$$MGE3 MOV C.KIR6(R4),@#KISAR6 ; Map to diagnostic bufferf* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS& ADD #6,R0 ; Point to end of address) MOV -(R0),-(SP) ; Save address on stack  MOV -(R0),-(SP) ; ...e MOV -(R0),-(SP) ; ...R( CALL MAPDRV ; Map to 2nd 4K of driver% MOV C.PCBP(R4),R2 ; Get PCB address; CLR (R2)+ ; ... MOV (SP)+,(R2)+ ; Set up PCB MOV (SP)+,(R2)+ ; ...c MOV (SP)+,(R2)+ ; .... .IFFM, MOV C.PCBP(R4),R2 ; Get port control block CLR (R2)+ ; Skip command word MOV (R0),(R2)+ ; Set up PCBK MOV 2(R0),(R2)+ ; ...c MOV 4(R0),(R2)+ ; ...C .ENDC ;M$$$MGED7 CMP R1,#FN.WPA+200 ; Are we writing physical address?e BNE 20$ ; No ; MOV -(R2),C.PADD+4(R4) ; Save physical addr as source addrA MOV -(R2),C.PADD+2(R4) ; ...r MOV -(R2),C.PADD(R4) ; ...C'20$: CALLR LODFN ; Load port function( .DSABL LSBP)DWADN: ; Entry for interrupt dispatch+)DWSAD: ; Entry for interrupt dispatch ! BCS 10$ ; If carry set, error. ) CALLR FUNSUC ; Return function successt10$:% CALLR FUNUNS ; Return unsuccessful)9 APR5PC WRTADD ; Make sure WRTADD is in APR5 addr spaceA $ .SBTTL REDMLT - Read Multicast List;+;M"; **- REDMLT - Read Multicast List;d; DESCRIPTION:; ; INPUTS:C; R5 = Port State Table-; R4 = Controller State TableC; R3 = Address of I/O packet; R0 = Address of user buffer ;;;- .ENABL LSBuREDMLT:c% MOV C.PCBP(R4),R1 ; Get PCB addresss TST (R1)+ ; 3 MOV RELCT,(R1) ; Put unibus relocator addr in PCBn MOV RELCT+2,2(R1) ; ...R. ADD C.WRKP(R4),(R1)+ ; Compute unibus address ADC (R1) ; ...T- MOVB #10.,1(R1) ; Ask for all ten addresses-3 MOV #FN.RML+200,R1 ; Read Multicast list functionu CALLR LODFNDMLDN: BCS 30$1 MOV C.DATI-C.CHRL(R0),R2 ; Get users buffer sizen CMP #60.,R2 ; Is it > max BHIS 10$ ; No MOV #60.,R2 ; Make it max10$:9 MOV R2,C.DATO-C.CHRL(R0) ; Save number of bytes returnedC* MOV C.WRKP(R4),R1 ; Point to work buffer$ MOV R0,-(SP) ; Save buffer address ASR R2 ; Make count words .IF DF M$$MGE20$:( CALL MAPDRV ; Map to 2nd 4K of driver! MOV (R1)+,-(SP) ; Get next word & MOV C.KIR6(R4),@#KISAR6 ; Map to user* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS' MOV (SP)+,(R0)+ ; Move the parameters DEC R2 ; Dec.counterm BNE 20$ ; Loop till doneR MOV (SP)+,R0 ; Restore R0r .IFF:20$: MOV (R1)+,(R0)+ ; Copy multicast list to user buffer DEC R2 ; Dec.counterR BNE 20$ ; Loop till doneF MOV (SP)+,R0 ; Restore R0V .ENDC ;M$$MGE CALLR FUNSUC ; Return success30$:" CALLR FUNUNS ; Complete request .DSABL LSBD9 APR5PC REDMLT ; Make sure REDMLT is in APR5 addr space;  .SBTTL READCT - Read Counters( .SBTTL READCC - Read And Clear Counters;+;r; **- READCT - Read Counters&; **- READCC - Read And Clear Counters; H; This routine is called to retreive the counters maintained by the UNA.;e ; INPUTS:D; R5 = Port State TableB; R4 = Controller State TableV; R3 = Address of I/O packet%; R0 = User diagnostic buffer pointern;c;- .ENABL LSBRREADCT: READCC:e) MOV C.PCBP(R4),R1 ; Get the PCB addressT TST (R1)+ ; Point at PCBB+23 MOV RELCT,(R1) ; Put unibus relocator addr in PCB. MOV RELCT+2,2(R1) ; ...a. ADD C.WRKP(R4),(R1)+ ; Compute unibus address ADC (R1)+ ; ... MOV #64.,(R1) ; Set byte+ MOV #FN.RCN+20000~} D%B11110010,R1 ; Assume Read Countersr .IF DF M$$MGE3 MOV C.KIR6(R4),@#KISAR6 ; Map to diagnostic buffer=* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ; M$$MGE: CMP C.TYP-C.CHRL(R0),#FN.RCN; Is it Read Counter function BEQ 10$ ; Yes8 MOV #FN.CCN+200,R1 ; No, it is Read and Clear Counters10$: .IF DF M$$MGE CALL MAPDRV ; Map to driver .ENDC ; M$$MGE% CALLR LODFN ; Execute the functionM)DRCDN: ; Entry for interrupt dispatch)DRCCD: ; Entry for interrupt dispatch; BCS 40$ ; Success3 MOV C.DATI-C.CHRL(R0),-(SP) ; Get user buffer sizeM ASR (SP) ; Make it word count/ .IF DF M$$MGE ; If memory management wupport ( CALL MAPDRV ; Map to 2nd 4K of driver .IFTF ;M$$MGE. MOV @C.WRKP(R4),R2 ; Get counters word count3 CMP R2,(SP) ; Can user buffer hold all counters?E BLOS 20$ ; YesM. MOV (SP),R2 ; Use word count of user buffer20$:& MOV C.KIR6(R4),@#KISAR6 ; Map to user* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS9 MOV R2,C.DATO-C.CHRL(R0) ; Save number of bytes returned ASL C.DATO-C.CHRL(R0) ; ..., MOV C.WRKP(R4),R1 ; Point to data returned, TST (R1)+ ; Skip count of words in buffer( MOV R0,(SP) ; Save R0 on stack .IFT ;M$$MGEn30$:( CALL MAPDRV ; Map to 2nd 4K of driver! MOV (R1)+,-(SP) ; Get next word & MOV C.KIR6(R4),@#KISAR6 ; Map to user* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS' MOV (SP)+,(R0)+ ; Move the parametersR DEC R2 ; Dec.countert BNE 30$ ; Loop till doneH .IFF ;M$$MGEM030$: MOV (R1)+,(R0)+ ; Copy data to user buffer DEC R2 ; Dec.counters BNE 30$ ; Loop till doneP .ENDC ;M$$MGE MOV (SP)+,R0 ; Restore R0 CALLR FUNSUC ; Return success40$: CALLR FUNUNS ; Request failed .DSABL LSB(9 APR5PC READCT ; Make sure READCT is in APR5 addr spacee o .SBTTL REDMOD - Read Mode;+;p; **- REDMOD - Read Mode; 4; This function reads the current mode from the UNA.;D ; INPUTS:e; R5 = Port State TableL; R4 = Controller State TableM; R3 = Address of I/O packet; R0 = Address of user buffer ; ;- .ENABL LSBEREDMOD:L( MOV #FN.RMD+200,R1 ; Read mode command% CALLR LODFN ; Execute the function DRMDN:& BCS 10$ ; If CS, error with command .IF DF M$$MGE( CALL MAPDRV ; Map to 2nd 4K of driver .ENDC ;M$$MGE% MOV C.PCBP(R4),R1 ; Get PCB address) MOV 2(R1),C.MODE(R4) ; Save current modes .IF DF M$$MGE- MOV C.KIR6(R4),@#KISAR6 ; Map to user buffer5* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ;M$$MGE0 MOV C.MODE(R4),(R0) ; Save Mode in user buffer9 MOV #2,C.DATO-C.CHRL(R0) ; Save number of bytes returned # CALLR FUNSUC ; Complete request D10$: CALLR FUNUNS ; Request failed9 APR5PC REDMOD ; Make sure REDMOD is in APR5 addr spaceC r .SBTTL WRTMOD - Write Mode ;+;r; **- WRTMOD - Write modeE;B; This routine is used to set the mode word in the UNA. To useF; this function, the user should first do a Get Mode to get a copy of G; the current UNA mode and set all bits currently set to avoid changingaE; a request from other users. A copy of this requested mode is savedsH; in case an enable all multicast must be done. The interrupt entry is E; shared with the set multicast if enable all multicast must be done.p;C ; INPUTS:B; R5 = Port State Table; R4 = Controller State Tabled; R3 = Address of I/O packet"; R0 = Pointer to user data buffer;o;- .ENABL LSBtWRTMOD:u .IF DF M$$MGE6 MOV C.KIR6(R4),@#KISAR6 ; Restore user buffer mapping* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .IFTF ;M$$MGE$ MOV (R0),-(SP) ; Get new mode bits .IFTt( CALL MAPDRV ; Map to 2nd 00~~TADATADATADATADATADATADATADATADATA4K of driver .ENDC ;M$$MGE) MOV C.PCBP(R4),R2 ; Get the PCB address % CLR (R2)+ ; Clear out old functiona$ MOV (SP)+,(R2) ; Fill in new mode ; BIS #MD.TPD,(R2)+ ; Make sure transmit padding is enabledD* MOV #FN.WMD+200,R1 ; Write mode function# CALLR LODFN ; Load port functionFDWMDN: BCS 10$ ; If CS, errord .IF DF M$$MGE( CALL MAPDRV ; Map to 2nd 4K of driver .ENDC ;M$$MGE% MOV C.PCBP(R4),R1 ; Get PCB addressw, MOV 2(R1),C.MODE(R4) ; Save as current mode .IF DF M$$MGE& MOV C.KIR6(R4),@#KISAR6 ; Map to user* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ;M$$MGE CALLR FUNSUC ; Return success10$: CALLR FUNUNS ; Request failed9 APR5PC WRTMOD ; Make sure WRTMOD is in APR5 addr spaceS o! .SBTTL REDSTA - Read Port StatusV+ .SBTTL REDCST - Read And Clear Port StatusE;+;C; **- REDSTA - Read Port Status); **- REDCST - Read And Clear Port Statuse;I; This function is called to implement the Read Port Status command. The N; channel status is put in the first three words of the user's buffer followedN; by the value of the last self-test performed (and power/cable bits). (PCSR1)C; If the user's buffer is not long enough, the request is returned T; "unsupported"d;p ; INPUTS:; R5 = Port State Tablet; R4 = Controller State Table ; R3 = Address of I/O packet; R0 = Address of user buffera;;- .ENABL LSBRREDSTA:lREDCST:  .IF DF M$$MGE8 MOV C.KIR6(R4),@#KISAR6 ; Map to user diagnostic buffer* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .IFTF ;M$$MGE1 MOV #FN.RLS+200,R1 ; Assume Read Status Commandf; CMP C.TYP-C.CHRL(R0),#FN.RLS; Is this Read Status functiont BEQ 10$ ; Yes+ MOV #FN.CLS+200,R1 ; It is Read And Cleare10$: .IFT ;M$$MGE=( CALL MAPDRV ; Map to 2nd 4K of driver .ENDC ; M$$MGE% CALLR LODFN ; Execute the function$DRSTD:DRCSD: BCS 20$ ; IF CS, errorr .IF DF M$$MGE( CALL MAPDRV ; Map to 2nd 4K of driver, MOV C.PCBP(R5),R1 ; Get address of the PCB TST (R1)+ ; Point to data- MOV (R1)+,-(SP) ; Save status data on stacks MOV (R1)+,-(SP) ; ... MOV (R1)+,-(SP) ; ....8 MOV C.KIR6(R4),@#KISAR6 ; Map to user diagnostic buffer* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS4 MOV (SP)+,(R0)+ ; Store status info in user buffer MOV (SP)+,(R0)+ ; ...I MOV (SP)+,(R0)+ ; ...$ .IFF ;M$$MGED, MOV C.PCBP(R4),R1 ; Get address of the PCB TST (R1)+ ; Point to PCB+2T3 MOV (R1)+,(R0)+ ; Copy Status info to user buffers MOV (R1)+,(R0)+ ; ...V MOV (R1)+,(R0)+ ; ...V .ENDC ;M$$MGE$ MOV C.CSR(R4),R1 ; Get CSR address, MOV 2(R1),(R0)+ ; Put PCSR1 in user buffer SUB #10,R0 ; Restore R0# CALLR FUNSUC ; Complete request s20$: CALLR FUNUNS ; Request failed .DSABL LSBt9 APR5PC REDSTA ; Make sure REDSTA is in APR5 addr space+ + .SBTTL REDSID - Read System IDV;+;4; **- REDSID - Read System ID;T@; This routine is called to retreive the system ID from the UNA.;s ; INPUTS:; R5 = Port State Table; R4 = Controller State TableN; R3 = Address of I/O packet%; R0 = User diagnostic buffer pointer+; ;- .ENABL LSB REDSID:S) MOV C.PCBP(R4),R1 ; Get the PCB address  TST (R1)+ ; Point at PCBB+23 MOV RELCT,(R1) ; Put unibus relocator addr in PCBR MOV RELCT+2,2(R1) ; ...D. ADD C.WRKP(R4),(R1)+ ; Compute unibus address ADC (R1)+ ; ...* MOV #100.,(R1) ; Store word count in PCB. MOV #FN.RSY+200,R1 ; Read system ID function% CALLR LODFN ; Execute the function5)DRSID: ; Entry for interrupt dispatch  BCS 20$ ; Success= MOV C.DATI-C.CHRL(R0),R2 ; R2 = # of bytes requested by user.9 MOV R2,C.DATO-C.CHRL(R0) ; Save number of bytes returnedr ASR R2 ; Make it word count, MOV C.WRKP(R4),R1 ; Point to data returned! MOV R0,-(SP) ;00~} D%B11110010 Save R0 on stack. .IF DF M$$MGE10$:( CALL MAPDRV ; Map to 2nd 4K of driver! MOV (R1)+,-(SP) ; Get next byteo& MOV C.KIR6(R4),@#KISAR6 ; Map to user* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS' MOV (SP)+,(R0)+ ; Move the parameters# DEC R2 ; Dec.countere BNE 10$ ; Loop till done  MOV (SP)+,R0 ; Restore R0e .IFFR410$: MOV (R1)+,(R0)+ ; Move parameters to user area DEC R2 ; Dec.counter, BNE 10$ ; Loop till done MOV (SP)+,R0 ; Restore R0  .ENDC ; M$$MGE CALLR FUNSUC ; Return success20$: CALLR FUNUNS ; Request failed .DSABL LSB9 APR5PC REDSID ; Make sure REDSID is in APR5 addr spaceD ; .SBTTL WRTSID - Write system ID;+;$; **- WRTSID - Write system ID;eD; This routine is called to set the system ID parameters in the UNA.K; To use this command the user should first execute a Get System ID commandtG; so that default parameter values may be obtained. The user will thenJ; change the fields desired and issue this command to write the parameters; back to the UNA.;R ; INPUTS: ; R5 = Port State Table ; R4 = Controller State Table ; R3 = Address of I/O packet#; R0 = Request function data buffers; ;- .ENABL LSB*WRTSID:- .IF DF M$$MGE& MOV C.KIR6(R4),@#KISAR6 ; Map to user* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ;M$$MGE8 MOV C.DATI-C.CHRL(R0),R1 ; R1 = byte count of system ID ASR R1 ; Make it word count) MOV R1,-(SP) ; Save word count on stackh& MOV C.WRKP(R4),R2 ; R2 = Work buffer MOV R0,-(SP) ; Save R010$: .IF DF M$$MGE& MOV C.KIR6(R4),@#KISAR6 ; Map to user* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS! MOV (R0)+,-(SP) ; Get next byteM( CALL MAPDRV ; Map to 2nd 4K of driver' MOV (SP)+,(R2)+ ; Move the parameters$ DEC R1 ; Dec.counterR BNE 10$ ; Loop till dones .IFFA* MOV (R0)+,(R2)+ ; Move ID to work buffer DEC R1 ; Dec.counterh BNE 10$ ; Loop till doneW .ENDC ; M$$MGE$ MOV (SP)+,R0 ; Restore R0 at entry' MOV C.PCBP(R4),R1 ; Get PCB+2 address. TST (R1)+ ; ...1 MOV RELCT,(R1) ; Generate unibus address in PCB  MOV RELCT+2,2(R1) ; ...N ADD C.WRKP(R4),(R1)+ ; ...- ADC (R1)+ ; ...* MOV (SP)+,(R1) ; Store word count in PCB+ MOV #FN.WSY+200,R1 ; Set up function code# CALLR LODFN ; Load port function;)DWSID: ; Entry for interrupt dispatch+ BCS 20$ ; Function failed CALLR FUNSUC ; Return success20$: CALLR FUNUNS ; Request failed .DSABL LSBR9 APR5PC WRTSID ; Make sure WRTSID is in APR5 addr spaced .< .SBTTL ****************************************************< .SBTTL * UNA QIO Driver Subroutines *< .SBTTL ***************************************************** .SBTTL SALL - Save Registers Co-routine;+$; **-SALL- Save Registers Co-routine;; Saves registers R0 - R5.;u; Input:; None;$;-$SALL: MOV R0,-(SP) ; Save registers MOV R1,-(SP) ; ... MOV R2,-(SP) ; ... MOV R3,-(SP) ; ... MOV R4,-(SP) ; ...' MOV 12(SP),-(SP) ; Get return addressd- MOV R5,14(SP) ; Replace return addr with R5*! CALL @(SP)+ ; Return to caller " MOV (SP)+,R4 ; Restore registers MOV (SP)+,R3 ; ... MOV (SP)+,R2 ; ... MOV (SP)+,R1 ; ... MOV (SP)+,R0 ; ... MOV (SP)+,R5 ; ... RETURN ;5 APR5PC SALL ; Make sure SALL is in APR5 addr spacet 09 .SBTTL BFCHK - Validate optional characteristics buffer ;+3; **-BFCHK-Validate optional characteristics buffer.;MD; Check the optional characteristics buffer supplied on transmit and; receive functions.;- ; Inputs:c; R3 = Address of I/O packet; R5 = Port State Table addressV?; I.PRM+6 - Virtual address of optional characteristics bufferR6; I.PRM+10- Length of optional characteristics buffer:; I.PRM+12- Virtual address of optional diagnostic bu00~~TADATADATADATADATADATADATADATADATAffer1; I.PRM+14- Length of optional diagnostic buffer ;V ; Outputs:5; I/O packet extension is set up with relocation biasp; for P2 and P3s&; R0 = Error code if buffer is invalid-; 'C' Clear - Buffer is valid or not suppliede; 'C' Set - Buffer is invalid;3; Registers modified:t ; R0, R1, R2;tBFCHK: MOV R4,-(SP) ; Save R4" CLR -(SP) ; Get a work register/ MOV IP.EXT(R3),R4 ; R4 = I/O packet extensionr5 MOV I.PRM+6(R3),R0 ; Get address of optional buffern/ BEQ 50$ ; No optional characteristics buffero) MOV I.PRM+10(R3),R1 ; Get buffer length/ BEQ 40$ ; If EQ, illegalw# CMP R1,#XMTBSZ ; Is it too large?d BHI 40$ ; If HI, yesf% CALL MPTHDR ; Map to task's headeri5 MOV I.PRM+6(R3),R0 ; Get address of optional bufferi ; ... "MPTHDR" distroyed it .IF DF R$$MPL ; If RSX-11M+) CALL $CKBFB ; Address check the buffert .IFFV) CALL $ACHKB ; Address check the buffer .ENDC ; R$$MPL" BCS 40$ ; If CS, illegal buffer( CALL $RELOC ; Relocate buffer address% MOV R1,2(R4) ; Store bias of bufferr3 MOV R2,I.PRM+6(R3) ; ... and it's virtual addressS1 .IF DF M$$MGE ; If memory management supportedC1 MOV R1,@#KISAR6 ; Map to characteristics buffer)* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ; M$$MGE/ MOV #I.PRM+6,R0 ; R0 = Offset into I/O packete/ CALL CKCHR ; Validate characteristics buffer , BCS 40$ ; Error in characteristics buffer:10$: MOV I.PRM+12(R3),R1 ; Get optional diagnostic buffer! BEQ 70$ ; No diagnostic buffer ) MOV I.PRM+14(R3),R1 ; Get buffer lengthe BEQ 60$ ; If EQ, illegal# CMP R1,#XMTBSZ ; Is it too large?s BHI 60$ ; If HI, yes$% CALL MPTHDR ; Map to task's headerK6 MOV I.PRM+12(R3),R0 ; Get address of optional buffer ; ... "MPTHDR" distroyed it .IF DF R$$MPL ; If RSX-11M+) CALL $CKBFB ; Address check the buffera .IFFs) CALL $ACHKB ; Address check the bufferc .ENDC ; R$$MPL" BCS 60$ ; If CS, illegal buffer( CALL $RELOC ; Relocate buffer address% MOV R1,4(R4) ; Store bias of bufferr4 MOV R2,I.PRM+12(R3) ; ... and it's virtual address1 .IF DF M$$MGE ; If memory management supportedC1 MOV R1,@#KISAR6 ; Map to characteristics buffer3* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ; M$$MGE0 MOV #I.PRM+12,R0 ; R0 = Offset into I/O packet/ CALL CKCHR ; Validate characteristics buffer  BCC 30$ ; Buffer is OKC& BR 60$ ; Clr diag buffer parameters'30$: CLC ; Assume there was no errorV MOV (SP)+,R0 ; Get statust BEQ 35$ ; All was wellD SEC ; Indicate error return 35$: MOV (SP)+,R4 ; Restore R4a( CALL MAPDRV ; Map to 2nd 4K of driver RETURN ; Return to callerd<40$: MOV #IE.SPC&377,(SP) ; Set up illegal buffer error code.50$: CLR I.PRM+6(R3) ; Indicate no AUX buffer7 CLR I.PRM+10(R3) ; No optional characteristics buffera BR 10$ ; Return<60$: MOV #IE.SPC&377,(SP) ; Set up illegal buffer error code670$: CLR I.PRM+12(R3) ; Indicate no diagnostic buffer CLR I.PRM+14(R3) ; ... BR 30$ ; Done7 APR5PC BFCHK ; Make sure BFCHK is in APR5 addr space+ ;0 .SBTTL CKCHR - Validate characteristics buffer;+*; **-CKCHR-Validate characteristics buffer;ED; Validate that the characteristics buffer is in the correct format.;- ; Inputs:n5; R0 = Offset in I/O packet to characteristics bufferr ; R3 = Address of the I/O packet; APR6 is mapped to buffer; ; Outputs:4; 'C' Clear - Characteristics buffer format is valid6; 'C' Set - Characteristics buffer format is invalid; )CKCHR: MOV R1,-(SP) ; Get some registersF MOV R2,-(SP) ; ...3 ADD R3,R0 ; Compute address of buffer descriptoru2 MOV (R0)+,R1 ; Get virtual address of the buffer- MOV (R0),R0 ; Get # of bytes in the bufferi210$: TST R0 ; Any more bytes left in the buffer?* BEQ 40$ ; If EQ, no ... buffer is valid00} D%B11110010 BLT 30$ ; Buffer is invalid7 CMP R0,#C.CHRL ; Enough space for a char. descriptor?  BLO 30$ ; If LO, no6 BIT #1,C.DATI(R1) ; Next charac. block word aligned? BNE 30$ ; If NE, no8 BIT #1,C.DATO(R1) ; Just in case it is an output buff. BNE 30$ ; If NE, no/ CLR C.STAT(R1) ; Clear characteristics status : SUB C.DATI(R1),R0 ; Remove space for this characteristic SUB #C.CHRL,R0 ; ...= ADD C.DATI(R1),R1 ; Point to next characteristic descriptor  ADD #C.CHRL,R1 ; ... BR 10$ ; and loop30$: SEC ; Indicate error&40$: MOV (SP)+,R2 ; Restore registers MOV (SP)+,R1 ; ... RETURN ;7 APR5PC CKCHR ; Make sure CKCHR is in APR5 addr space$ I+ .SBTTL GTPRT - Assign a port to requestori;+%; **-GTPRT-Assign a port to requestoro;D; Parse the string, search the controller ports for a free; port.s;- ; Inputs:h; R3 = Address of I/O packet#; I.PRM - Bias of string 0; I.PRM+2 - Virtual address of string'; I.PRM+4 - Length of stringC; ; Outputs:!; R0 = Error code (if applicable)r'; IE.NSF - No such in system #; R5 = Address of Port Status BlockH-; 'C' Clear - successfully assigned-; 'C' Set - Assignment error; ; Registers modified:t; R0, R1, R2, R4, R5; GTPRT:( MOV R3,-(SP) ; Save I/O packet address8 MOV I.PRM+2(R3),R0 ; Get virtual address of the string> MOV I.PRM+4(R3),R4 ; Compute address of the end of string +11 .IF DF M$$MGE ; If memory management supported / MOV @IP.EXT(R3),@#KISAR6 ; Map to input stringc* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ; M$$MGE e' CMPB #'L,(R0) ; Check for DELUA first  BNE 5$ ; No, must be DEUNA!+ TSTB (R0)+ ; Skip over the "l" character  CMPB #'U,(R0)+ ; Is it LUA?2 BNE 20$ ; No, error BR 7$ ; DELUA so far!*5$: CMPB #'U,(R0)+ ; Check for UNA device BNE 20$ ; ... CMPB #'N,(R0)+ ; ... BNE 20$ ; ...7$: CMPB #'A,(R0)+ ; ...@ BNE 20$ ; ... CMPB #'-,(R0)+ ; Check for "-" BNE 20$ ; Syntax errorM' MOVB (R0),R1 ; Get controller numberI CMPB R1,#'0 ; Below ASCII 0?N BLT 20$ ; Yes, error CMPB (R0),R1 ; Above ASCII 7? BGT 20$ ; Yes, error & BIC #177770,R1 ; Clear unwanted bits0 CMP R1,#U$$NCT-1 ; Is controller number valid?& BHI 20$ ; Invalid controller number) ASL R1 ; Covert it to controller indexi. MOV CTABL(R1),R4 ; R5=Controller State Table' MOV R4,R5 ; Gen pointer to port list/ ADD #C.PORT,R5 ; Point to port list root word"*10$: MOV (R5)+,R5 ; Get next port address BEQ 20$ ; End of list* BIT #PS.OPN,P.FLAG(R5) ; This port open? BNE 10$ ; No! CLC ; Indicate good returnB BR 30$ ; Return+20$: MOV #IE.NSF,R0 ; Say, no such lineP' SEC ; Indicate no available porti30$:( CALL MAPDRV ; Map to 2nd 4K of driver MOV (SP)+,R3 ; Restore R3l RETURN ;7 APR5PC GTPRT ; Make sure GTPRT is in APR5 addr space  n .SBTTL MAPBF - Map to buffer;+; **-MAPBF-Map to buffer;t?; This routine takes the physical address in I.PRM+2 and IX.ADRE9; and computes APR5 bias and displacement for I/O buffer.E;- ; Inputs:; R3 = I/O packet addressr'; I.PRM+2 = Low order physical address#(; I.PRM+1 = High order physical address; ; Output: ; KISAR6 mapped with biasC; R2 = Displacement ; ; Registers R1 changed; MAPBF: MOV R0,-(SP) ; Save R04 MOV I.PRM+2(R3),R1 ; R1 = Low order buffer address8 MOV @IP.EXT(R3),R0 ; R0 = High order bits in high byte; G; For 18 bit systems the high bits are in bits 4 and 5. Otherwise, theD2; high byte contains the high bits of the address.;u- .IF DF M$$EXT ; Extended memory supported?s( SWAB R0 ; High order bits in low byte .IFF ; If 18 bit systemc- ASR R0 ; Move bits 4 and 5 to bits 0 and 1b ASR R0 ; ...l ASR R0 ; ...e ASR R0 ; ...d0 BIC #177774,R0 ; Make sure high bits are clear .ENDC ; M$$EXT/ .IF DF M$$EIS00 ~TADATADATADATADATADATADATADATADATA ; If extended instrucation seth$ ASHC #-6.,R0 ; Calculate APR bias .IFFe .REPT 6 ROR R0 ; Divide by octal 100i ROR R1 ; ...b .ENDR .ENDC ; M$$EIS MOV R1,@I.PRM(R3) ; Save bias;9 BIC #177700,I.PRM+2(R3) ; R2 = Offset into 1st 100 bytess9 BIS #140000,I.PRM+2(R3) ; R2 = Virtual address of buffer MOV (SP)+,R0 ; R0 = Restore R0 RETURN ; Return to caller 7 APR5PC MAPBF ; Make sure MAPBF is in APR5 addr spacei e- .SBTTL GTXMH - Get a transmit header packet ;+'; **-GTXMH-Get a transmit header packet.; 6; This routine will allocate a transmit header packet.;- ; Inputs:a); Transmit header list (C.XBUF root word) ; ; Output:M; R0 points to transmit header B*; 'C' Clear - Transmit header packet found.; 'C' Set - Transmit packet header NOT found;a; Registers R1 changed;(%GTXMH: MOV R2,-(SP) ; Save R2 and R3; MOV R3,-(SP) ;( $DQPKT C.XHDR ; Get a transmit packet/ MOV R3,R0 ; Put transmit packet header in R1t" MOV (SP)+,R3 ; Restore R3 and R2 MOV (SP)+,R2 ; RETURN ; 0 .SBTTL GTPST - Get address of Port State Table;+*; **-GTPST-Get address of Port State Table;oA; This routine gets the address of the port control block via thel ; I/O packet.h;e ; Inputs:u; R3 = Address of I/O packet; ; Outputs:"; R5 = Address of Port State Table(; R4 = Address of Controller State Table;V; Registers Changed ; R4, R5;-4GTPST: BIT #CS.INI,C.FLAG(R4) ; Are we initializing?+ BNE 20$ ; Yes, init does not use a port. , BIT #1,R3 ; Do we have a real I/O packet? BNE 20$ ; No, just return.t+ MOV I.TCB(R3),R5 ; Get task's TCB addresso8 MOV T.PCB(R5),R5 ; .. then PCB addr of task's window 0' ; .. (PCB=Partition Control Block)t- TST P.HDR(R5) ; Task Header in primary poolt .IF DF R$$MPL .IF DF M$$MGE- BNE 10$ ; If NE, header is in primary poolS, MOV P.REL(R5),@#KISAR6 ; Map to task header* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS10$: .ENDC ;M$$MGE .ENDC ;R$$MPL* MOV @I.LN2(R3),R5 ; Get port state table& BIC #1,R5 ; Clear LUN interlock bit0 MOV P.CTBL(R5),R4 ; Get Controller State Table( CALL MAPDRV ; Map to 2nd 4K of driver!20$: RETURN ; Return to calleri7 APR5PC GTPST ; Make sure GTPST is in APR5 addr space; E) .SBTTL LODFN - Load Secondary Functoion)& .SBTTL LODCM - Load Primary Function;+; %; **- LODFN - Load Secondary FunctionR#; **- LODCM - Load Primary Functiona;D; These simple routines load the requested commands into the UNA and; intitiate the request.;b ; Inputs:,; R4 = Controller State Table; R3 = Address of I/O packet&; R1 = Secondary Function (LODFN only)(; R0 = Primary Function (only for LODCM); ; Registers Modified:T; R0,R1a;s;- .ENABL LSBPLODFN:! MOV #CM.GCM,R0 ; Set up command , MOVB R0,C.FUNS(R4) ; Save Primary Function5 MOVB R1,C.FUNS+1(R4) ; Save secondary function codeF- BIC #177740,R1 ; Make sure its a legal code/ MOV R1,@C.PCBP(R4) ; Set up secondary commandm BR 10$oLODCM:' CLRB C.FUNS+1(R4) ; No function values110$: MOV R3,C.CFNC(R4) ; Save addr of I/O packet 1 MOVB @C.CSR(R4),-(SP) ; Get current CSR contents3 BICB #R0.PCM,(SP) ; Clear out any command presentt2 BIC #^C,R0 ; Make sure we save only code BISB R0,(SP) ; Set command in. MOVB (SP)+,@C.CSR(R4) ; Issue primary command4 MOVB R0,C.FUNS(R4) ; Save current primary function$ MOVB #CNTTIM,C.CTMR(R4) ; Set timer CALL CLOCK ; Start timer RETURN ; .DSABL LSBB o% .SBTTL POLRG - Poll Ring Subroutinen;+;u ; **-POLRG-Poll Rings Subroutine;aF; This routine is called when a transmit request or requests have beenL; added to the transmit chain or when a receive buffer has been added to theI; receive chain. If the poll request flag already set, the routine exits.CJ; Otherwise CS.POL is set in the controller flag and controll is passed to; the function initiator.I; ;R ; INPUTS:t; R400} D%B11110010 = Controller State Tablei; ; REGISTERS MODIFIED:S; None;;- .ENABL LSB 6POLRG: BIT #CS.POL,C.FLAG(R4) ; Poll flag already set? BNE 10$ ; Yes, just returne5 BIS #CS.POL,C.FLAG(R4) ; Request a poll of the ringsn- CALLR FNINI ; Try to initiate the functionv!10$: RETURN ; Return to callere .SBTTL LODUM - Load UNA memory;+;e; **-LODUM-Load UNA memory;w ; Inputs:i; R3 - Address of I/O packet; R4 - Controller State Table ;c ; Outputs:; IS.SUC - Sucessful Load ?; IS.ABO - Time out or fatal controller error, load is aborted.;;- .ENABLE LSBLODUM:, MOV I.PRM+2(R3),R0 ; R0 = Microcode buffer5 MOV R0,C.LOAD+2(R4) ; Compute end of buffer pointer " ADD I.PRM+4(R3),C.LOAD+2(R4); ...5 MOV R0,C.LOAD+4(R4) ; Save it again as work pointer 3 MOV C.RBFL(R4),C.LOAD+6(R4) ; Get a receive bufferN5 MOV @C.LOAD+6(R4),C.RBFL(R4); Dequeue receive bufferu10$:- MOV R3,C.CFNC(R4) ; Save I/O packet address 1 .IF DF M$$MGE ; If memory management supporteda3 MOV @IP.EXT(R3),@#KISAR6 ; Map to microcode buffer * .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS) MOV @#KISAR6,C.LOAD(R4) ; Save APR6 biasC .ENDC ; M$$MGE2 MOV (R0)+,-(SP) ; Save byte count of this record2 MOV (R0)+,-(SP) ; Save UNA internal load address( CALL MAPDRV ; Map to 2nd 4K of driver8 MOV C.WRKP(R4),R1 ; Get pointer to scratch area (UDBB)- MOV 2(SP),(R1) ; Set byte count of transfer 6 BEQ 40$ ; If EQ, End of load sections in this block2 BMI 70$ ; Branch to load start address function- MOV (SP)+,6(R1) ; Copy the WCS load addressa2 CLR 10(R1) ; Clear high order byte of load addr5 CMP (SP),#512.-4. ; Is byte count GT a disk buffer?0 BHI 35$ ; Yes, abort load6 ADD #4,C.LOAD+4(R4) ; Point to next record in buffer ADD (SP),C.LOAD+4(R4) ; .../ MOV RELCT,2(R1) ; Set relocation bias in UDBBo MOV RELCT+2,4(R1) ; ...)+ MOV C.LOAD+6(R4),R3 ; Use receive buffer.e1 ADD R3,2(R1) ; Compute Unibus address of buffers ADC 4(R1) ; ...20$:/ .IF DF M$$MGE ; If memory management support)- MOV C.LOAD(R4),@#KISAR6 ; Map to user bufferl* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ; M$$MGE/ MOVB (R0)+,-(SP) ; Copy data from user bufferO( CALL MAPDRV ; Map to 2nd 4K of driver( MOVB (SP)+,(R3)+ ; Copy to load buffer" DEC (SP) ; Decrement byte count BNE 20$ ; Loop till done, TST (SP)+ ; Tidy stackr7 MOV C.PCBP(R4),R3 ; Get pointer to Port Control Block;/ MOV RELCT,2(R3) ; Set relocation bias in UDBB, MOV RELCT+2,4(R3) ; ...e' ADD R1,2(R3) ; Compute Unibus addressp ADC 4(R3) ; ...- MOV C.CFNC(R4),R3 ; Restore R3 for "LODFN". * MOV #FN.LOA,R1 ; Microcode load function& CALLR LODFN ; Execute the function ;L!; We get here after the interruptr;M#LOADN: BCS 30$ ; Errors are fatalr* MOV C.LOAD+4(R4),R0 ; Get buffer pointer6 CMP R0,C.LOAD+2(R4) ; Have we reached end of buffer?# BLO 10$ ; No, continue with loadr BEQ 50$ ; Yes, end of buffer)30$:! CALL IEABO ; Abort the requestL2 CALL MAPDRV ; Make sure we are mapped to driver! CALL FTL ; Do fatal processingV" BR 60$ ; Free up receive buffer/35$: TST (SP)+ ; Remove byte count from stack BR 30$ ; Abort load;f; End of buffer ;g40$: CMP (SP)+,(SP)+ ; Tidy stack50$:7 MOV #IS.SUC&377,R0 ; Successful load of load sectionsu4 MOV C.LOAD+4(R4),R1 ; Compute number of characters$ SUB I.PRM+2(R3),R1 ; ... processed CALL RQDON ; Return I/O done 960$: MOV C.RBFL(R4),@C.LOAD+6(R4); Free up receive bufferL" MOV C.LOAD+6(R4),C.RBFL(R4) ; ... RETURN ;;T ; End of loadp;e70$:) MOV C.PCBP(R4),R1 ; Get the PCB address:- MOV (SP)+,2(R1) ; Move in the start addressB5 CLR 4(R1) ; Clear high order addr (DELUA specific) TST (SP)+ ; Get rid of -13 MOV #FN.LSM,R1 ; Load and start microcode addressd5 CALL LODFN ; Issue the command, the interrupt00~TADATADATADATADATADATADATADATADATA willh' ; return control to LSMDN in CTINIe! BR 50$ ; Return I/O completionn .DSABL LSBC7 APR5PC LODUM ; Make sure LODUM is in APR5 addr spaceA 41 .SBTTL FTL - Fatal controller error processora;+; **-FTL-FATAL controller errore;h7; This subroutine performs fatal controller processing.r;-; ; Inputs:;; R4 = Controller State Tablep;f ; Outputs:;+; 1. The controller is reset/; 2. If controller initializing, retry 3 times. .; 3. Port related data structures are released9; 4. All I/O packets are returned to the requesting tasksu; with IE.ABO status code.S8; 5. All ports belonging to the controller are marked as4; requiring initialization (IO.XIN QIO function).7; This is required to simulate DECnet functionality.s;b .ENABL LSBr%FTL: CALL SALL ; Save all registers# TST C.CSR(R4) ; Do we have a CSR?a BEQ 10$ ; Not6 MOVB #R0.RST,@C.CSR(R4) ; Reset the UNA so that it is( ; ... put in a known state. Do not ; ... enable interrupts.e-10$: CLR C.CTMR(R4) ; Clear controller timerr' CLR C.XMTT(R4) ; Clear transmit timer * BIS #CS.OFL,C.FLAG(R4) ; Indicate offline. BIT #CS.INI,C.FLAG(R4) ; Are we initializing? BEQ 20$ ; noc) DECB C.RTRY(R4) ; Decrement retry countE& BLE 20$ ; We have tried three times;T=; we will try to initialize the controller up to three times.a;a6 MOV #-2,C.FUNS(R4) ; Set up current command dispatch; MOVB #RSTIM,C.CTMR(R4) ; Set up timer for possible failureo: MOVB #R0.IE,@C.CSR(R4) ; Re-enable interrupts, cleared by ; ... reset7 MOV C.INIW(R4),C.CFNC(R4) ; Get 1st waiting I/O packetS BR 95$ ; Return;a&; Release port related data structures; 420$: BIC #CS.INI,C.FLAG(R4) ; No longer initializing$ MOV R4,R0 ; Generate port address ADD #C.PORT,R0 ; ...*30$: MOV (R0),R5 ; Get next port in list BEQ 40$ ; No more!s, CALL RLPRT ; Release port data structures4 BIS #PS.XIN,P.FLAG(R5) ; Set requirs initialization! MOV R5,R0 ; Point to next port. BR 30$ ; Go, get next portr;s,; Return I/O packets with IE.ABO status code;.+40$: MOV R4,R5 ; Point to xmit wait queue5 ADD #C.XMWQ,R5 ; ... CALL 100$ ; Abort Q entries* MOV R4,R5 ; Point to receive wait queue ADD #C.RCVW,R5 ; ..." CALL 100$ ; Abort queue entries* MOV R4,R5 ; Point to xmit pending queue ADD #C.XMTP,R5 ; ...50$:1 MOV (R5),R3 ; R3 = Transmit pending I/O packets BEQ 60$ ; No more2 MOV C.XMTC(R4),R2 ; Get next item from xmit ring? MOV RG.LNK(R2),C.XMTC(R4) ; Move current pointer to next entryO= MOV C.XHDR(R4),@RG.VAD(R2) ; Insert xmit header in free list MOV RG.VAD(R2),C.XHDR(R4) ; ...0 .IF DF M$$EXT ; If extended memory supported?3 MOV C.XMTC(R4),R2 ; Get xmit data entry from ring.) MOV RG.UMR(R2),R2 ; R2 = UMR wait blockV- ADD #10,R2 ; Point to UMR assignment blockM CALL $DEUMR ; Deassign UMR3 MOV C.UCB(R4),R1 ; R1 = UCBc .IFTF ; M$$EXT- MOV C.XMTC(R4),R2 ; R2 = Current ring entryi .IFT ; M$$EXT2E MOV U.UCBX+6(R1),@RG.UMR(R2); Insert wait block into wait block list." MOV RG.UMR(R2),U.UCBX+6(R1) ; ... .ENDC ; M$$EXT? MOV RG.LNK(R2),C.XMTC(R4) ; Move current pointer to next entrye MOV (R5),R3 ; R3 = I/O packet! MOV (R3),(R5) ; Deque from list(( CALL IEABO ; Return with abort status BR 50$ ; Loop till all done60$:. MOV R4,R5 ; Point to pending function queue ADD #C.PFNC,R5 ; ..." CALL 100$ ; Abort queue entries' MOV R4,R5 ; Point to init wait queue; ADD #C.INIW,R5 ; ..." CALL 100$ ; Abort queue entries) MOV R4,R5 ; Point received buffer listX ADD #C.RCVD,R5 ; ...70$:( MOV (R5),R0 ; Get next receive buffer BEQ 90$ ; We are done1 MOV (R0),(R5) ; Deque buffer from received list,2 MOV C.RBFL(R4),(R0) ; Insert buffer in free list MOV R0,C.RBFL(R4) ; ... BR 70$ ; 390$: CLR C.CFNC(R4) ; There is no current functione CLR C.FUNS(R4) ; .../95$: BR FRERCV ; Free up receive ring buffers,+100$: MOV (R5),R3 ; Get next item in listR BEQ 120$ 00%} D%B11110010; Done MOV (R3),(R5) ; Dequeue item;+E; We must check if the request is an open request. If it is, we have(F; to free up the port assigned to it and clear the 2nd word of the lun; entry in the task header.e;-4 MOVB I.FCN+1(R3),-(SP) ; Get function code for this) BIC #^C<177>,(SP) ; Clear unwanted bits . CMP (SP)+,#FCOPN ; Is this an open function? BNE 110$ ; No, just abort it.% CALL MPTHDR ; Map to task's headern+ MOV @I.LN2(R3),R0 ; R0 = Port State Tablei+ BIC #1,R0 ; Clear possible interlock bitR% CLR P.FLAG(R0) ; Show port not open 9 CLR @I.LN2(R3) ; Show not open in 2nd word of LUN entryo( CALL MAPDRV ; Map to 2nd 4K of driver&110$: CALL IEABO ; Abort the request BR 100$ ; Do next itemC"120$: RETURN ; Return to caller6 APR5PC FTL ; Make sure FTL is in APR5 address space .DSABL LSB  a( .SBTTL FRERCV - Free up receive buffers;+ ; **-FRERCV-Free receive buffers;h>; This routine deallocates the buffers assigned to the receive; ring entries.l;n ; Inputs:R; Receive ring entries;o ; Outputs:/; Receive buffers are returned to the free list ; ; Registers modified:;; R0;-3FRERCV: MOV C.RCVB(R4),R0 ; R0 = Receive ring basee-10$: TSTB RG.ACT(R0) ; Is this entry active?  BEQ 20$ ; Nol< CLRB RG.ACT(R0) ; Deactivate it. So we don't do this again/ MOV RG.VAD(R0),R1 ; Get Unibus addr of bufferc+ MOV C.RBFL(R4),(R1) ; Insert in free listf MOV R1,C.RBFL(R4) ; ...a(20$: MOV RG.LNK(R0),R0 ; Get next entry' BEQ 30$ ; Not yet initialized, skip.e2 CMP R0,C.RCVB(R4) ; Have we scanned all entries? BNE 10$ ; No !30$: RETURN ; Return to calleri ;& .SBTTL CTINI - Initialize Controller;+;e ; **-CTINI-Initialize Controller;)C; This routine is called to start up the UNA hardware. This processcO; involves several commands to the UNA hardware and for this reason the routinefI; is actually a series of smaller routines executed after a Commmand Done. ; Interrupt.E; If this is the first time the device has been used since the drivereK; has been loaded, then a self-test will be run on the UNA. After a timeoutRH; has expired, the UNA will be checked for a "READY" state. If "READY",F; then the Port Control Block is given to the UNA and Read Port StatusM; command is executed to obtain the microcode revision number. The microcodee=; load support task is run passing to it the revision number. G; After the hardware operation has been verified the rings are set up. K; The UNA control command block is given to the UNA and this block is used F; to issue the Read Ring Descriptor and Read Mode commands to the UNA.B; If at any time a control request fails or times out the start upH; procedure is aborted and all outstanding request will be returned with; IE.ABO I/O status code.o;t; BEGIN:; ENABLE INTERRUPTSe ; RESET UNAc; SELFTEST UNA; IF READY STATE$; IFF REPORT ERROR - ABORT ; IFT GIVE PCB TO CONTROLLERE; READ PORT STATUS TO OBTAIN MICROCODE REVISION NUMBER NEEDEDs; BY MICROCODE SUPPORT TASKB; RUN MICRO CODE SUPPORT TASK AND PASS TO IT THE MICROCODE7; REVISION #, CSR OF CONTROLLER AND CONTROLLER INDEXo; LOAD MICROCODE; SET UP RINGSo; WRITE DEFAULT MODEg; INITIALIZE RINGS ; START UNA; ENDIFo;o ; INPUTS:I; R4 = Controller State TableE;- .ENABL LSBCTINI::S- BIT #CS.INI,C.FLAG(R4) ; Are we initializing  BEQ 10$ ; yes RETURN ; No, return.; ; Perform a reset on deviceV;O310$: CALL FRERCV ; Free up receive buffers from a  ; ... privious initialize4 BIS #CS.INI,C.FLAG(R4) ; Say initialize in progress, MOVB #RETRYC,C.RTRY(R4) ; Set retry counter% MOV R3,C.CFNC(R4) ; Save I/O packetI6 MOV #-2,C.FUNS(R4) ; Set up current command dispatch< MOVB #SLFTIM,C.CTMR(R4) ; Set up timer for possible failure6 MOVB #R0.RST,@C.CSR(R4) ; Reset the UNA so that it is ; ... put in a known stateQ: MOVB #R0.IE,@C.CSR(R4) ; Re-enable interrupts, cleared by ; ... reset BR 20$ ; Start cloc00-~TADATADATADATADATADATADATADATADATAkeRSTDN:& BCS 30$ ; Timeout error with device;t#; Perform a self-test on the device ;t% MOV R3,C.CFNC(R4) ; Save I/O packetY- MOV #-1,C.FUNS(R4) ; Set up current command < MOVB #SLFTIM,C.CTMR(R4) ; Set up timer for possible failure9 MOVB #CM.SLF!R0.IE,@C.CSR(R4); Issue a self-test commands20$: CALLR CLOCK ; Start clock;;; Self-test done entry;s)SLFDN: ; Entry for interrupt dispatchR' BCS 30$ ; UNA hard error, go log it.l$ MOV C.CSR(R4),R2 ; Get CSR address' MOV PCSR1(R2),R2 ; Get PCSR1 contentsm% BIC #177760,R2 ; Extract state bits 7 CMP #ST.RDY,R2 ; Ready? (This also checks transceiverI ; and cable bits)% BNE 30$ ; Nope - something's wrongV I;.6; Set up and execute Get Control Block address command;!$ MOV C.CSR(R4),R2 ; Get CSR address3 MOV RELCT,PCSR2(R2) ; Put relocation bias in UDBBf& MOV RELCT+2,PCSR3(R2) ; ... High bits. ADD C.PCBP(R4),PCSR2(R2) ; Set up PCB address ADC PCSR3(R2) ;) MOV #CM.GPB,R0 ; Set up primary commandP CALLR LODCM ; Load commandt;/; Get Control Block Address function completionR;R)GPBDN: ; Entry for interrupt dispatch BCS 30$ ; Function failed; 9; Read Controller Status to get microcode revision numberu;G, MOV #FN.RLS,R1 ; R1 = Read Status function# CALLR LODFN ; Load port functionL6UMLNAM: .RAD50 /UML.../ ; Micro code loader task nameRLSDN: BCS 30$ ; Read status failed,5 MOV C.PCBP(R4),R1 ; R1 = Port Control Block addressV! TST (R1)+ ; Skip function wordn6 MOV (R1)+,C.RREV(R4) ; Save microcode revision number= MOV (R1)+,C.MMAX(R4) ; Save max # of multicast addr possiblet/ MOV (R1)+,C.MXCT(R4) ; Save counter block size ( MOV R3,-(SP) ; Save I/O packet address, MOV #UMLNAM,R3 ; Point to loader task name+ CALL $SRSTD ; See if loader is installed * MOV R0,MLTCB ; Save microcode loader TCB BCC 25$ ; Fatal if not thereL .IF DF R$$MPL ; If RSX-11M+9 MOV #T.NKLF,R0 ; "Microcode loader not present" message CALL $DVMSG ; Print message+ MOV (SP)+,R3 ; Restore I/O packet addressv+ BR LSMDN1 ; Continue with initializationx .IFF ;+ MOV (SP)+,R3 ; Restore I/O packet addressc- BR 30$ ; This is fatal if loader not therea .ENDC ; R$$MPL/25$: MOV (SP)+,R3 ; Restore I/O packet address - MOV #SENDBK,R1 ; Set length of block needed;$ CALL $ALOCB ; Allocate core block" BCS 25$ ; Loop until you get it! MOV R0,R1 ; Copy block addressR# CLR (R0)+ ; Skip over first worde5 MOV C.INDX(R4),(R0)+ ; Put controller index in block; MOV C.DCB(R4),R2 ; R2 = DCBB4 MOV D.NAM(R2),(R0)+ ; Put controller name in block4 MOV C.PCBP(R4),R2 ; Get Port Control Block address- BIC #177700,2(R2) ; Isolate revision number0 MOV 2(R2),(R0) ; Save revision number in block+ CLRB 1(R0) ; Clear DELUA/DEUNA flag byten" MOV C.CSR(R4),R2 ; R2 = CSR addr2 BIT #20,PCSR1(R2) ; Is controller DEUNA or DELUA BEQ 27$ ; DEUNA INCB 1(R0) ; DELUAR27$:9 MOV R3,C.CFNC(R4) ; Save I/O packet of current functionuI MOV #+CM.GCM,C.FUNS(R4) ; Set wait for microcode loader task)( MOV MLTCB,R0 ; R0 = Task Control Block$ ; R1 = Address of message block0 CALL $EXRQF ; Request microcode loader to run) MOV #UMLTIM,C.CTMR(R4) ; Set timer valuem CALLR CLOCK ; Start clock;aB; We get here if the Microcode Loader Task does not respond within; the time out value specified.N;rMLTMO:;2F; We get here on a time out or controller error. This code will force; fatal initialization.t;u430$: MOV R4,R2 ; Generate error log packet pointer ADD #C.LOG,R2 ; .../ MOV #ER.FCI,E.TYPE(R2) ; Fatal controller init; MOV C.CSR(R4),R0 ; Get CSR/ MOV (R0)+,E.CSR0(R2) ; PCSR0 into error packetn/ MOV (R0)+,E.CSR1(R2) ; PCSR1 into error packetC% MOV C.PCBP(R4),R0 ; Get PCB pointerg3 ADD #E.PCB,R2 ; Point to PCB save in error packet , MOV (R0)+,(R2)+ ; Save PCB in error packet MOV (R0)+,(R2)+ ; ...r MOV (R0)+,(R2)+ ; ...l MOV (R0)+,(R2)+ ; ...l+ MOV R3,-(SP) ; Save address of I/O packetV$ CLR R005} D%B111100103 ; No associated I/O packet CALL ERLOG ; Log the error# MOV (SP)+,R3 ; Restore I/O packeto" CALLR FTL ; Do fatal processing;ME; We will come here after the micro code has been successfully loaded ;RLSMDN:. BCS 30$ ; If CS, error - abort the function;g+; Set up Get Ring Descriptor Command in PCBr;c6LSMDN1: MOV C.PCBP(R4),R2 ; Get Command Block Address) TST (R2)+ ; Skip to second word in PCB.. MOV RELCT,(R2) ; Put relocation bias in UDBB# MOV RELCT+2,2(R2) ; ... High bits 5 ADD C.WRKP(R4),(R2)+ ; Move in scratch block addresso ADC (R2)+ ; ...;s; Set up the ring descriptor;;1 MOV C.WRKP(R4),R2 ; Retrieve descriptor addresse. MOV RELCT,(R2) ; Put relocation bias in UDBB# MOV RELCT+2,2(R2) ; ... High bits 2 ADD C.XMTB(R4),(R2)+ ; Compute unibus address of  ADC (R2) ; ... transmit ringO& TSTB (R2)+ ; Skip high address byte7 MOVB #,(R2)+ ; Fill in entry size (in words)L1 MOV #U$$NTS*2,(R2)+ ; Fill in number of entries2. MOV RELCT,(R2) ; Put relocation bias in UDBB# MOV RELCT+2,2(R2) ; ... High bits(2 ADD C.RCVB(R4),(R2)+ ; Compute unibus address of  ADC (R2) ; ... receive ring& TSTB (R2)+ ; Skip high address byte7 MOVB #,(R2)+ ; Fill in entry size (in words)h/ MOV #U$$NRS,(R2)+ ; Fill in number of entriesd;s; Load the write ring requestt;n$ MOV #FN.WRG,R1 ; Secondary command CALLR LODFN ; Execute command; "; Write Ring Descriptor completion;(WRGDN: BCS 30$ ; Function Failed;V0; Set up the operating mode (padding, CRC, etc.);T% MOV C.PCBP(R4),R2 ; Get PCB address(( MOV C.MODE(R4),2(R2) ; Set default mode$ MOV #FN.WMD,R1 ; Secondary command CALLR LODFN ; Execute command; ; Write Mode completioni;n)WMEDN: ; Entry for interrupt dispatch  BCS 30$ ; Function failed; ; Initialize the rings;t( MOV R3,-(SP) ; Save current I/O packet CALL INIRG ; Initialize rings1 CALL GTRBF ; Allocate buffers for receive ring:# MOV (SP)+,R3 ; Restore I/O packet , MOV #FN.RDA,R1 ; R1 = Read default address CALLR LODFN ; do it! ; ); Read default address interrupt completee;lRDADN: BCS 30$ ; Function failed- MOV C.PCBP(R4),R0 ; R0 = Port Control Block  TST (R0)+ ; Skip 1st word, MOV (R0)+,C.PADD(R4) ; Save default address MOV (R0)+,C.PADD+2(R4) ; ...  MOV (R0)+,C.PADD+4(R4) ; ...R;(; Issue the Start requestk;) MOV #CM.STR,R0 ; Set up primary commandT" CALLR LODCM ; Issue the command;n; Start request completion;O*STRDN: ; Entry from interrupt dispatch! BCS 30$ ; Something went wrongt640$: $DQPKT C.INIW ; Deque item from init wait queue BCS 50$ ; No more' CALL ISSUC ; Return success I/O doneP BR 40$ ; Loop till no more 50$:- CLR C.FLAG(R4) ; Indicate controller onlinet( CALLR POLRG ; Request controller poll .DSABL LSBD 42 .SBTTL UMRMP - Map transmit I/O buffer with UMRs;+$; **-UMRMP- Map I/O buffer with UMRs;LF; This routine gets a trasmit ring packet, UMR maps the I/O buffer andF; sets up the transmit ring entry. This routine does not set the end!; packet flag in the ring entry. ;m ; Inputs:q; R3 = Address of I/O packet; R4 = Controller State TableO;n ; Output: %; R1 = Pointer to transmit ring entryA;4;-#UMRMP: CALL SALL ; Save registersP;GC; NOTE - For each transmit header buffer there is a UMR wait block.ML; This routine is called by the INIXM routine. A header buffer is allocatedJ; before this routine is called. Therefore, there must be a free transmit ; ring entry.a;i* CALL GFXRE ; Get a transmit ring packet$ BEQ 20$ ; Crash if none available .IF DF R$$MPL ; If RSX-11M+ MOV C.KRB(R4),R2 ; R2 = KRB  .ENDC ; R$$MPL MOV C.UCB(R4),R5 ; R5 = UCBt MOV C.SCB(R4),R4 ; R4 = SCBL/ MOV IP.EXT(R3),R0 ; R0 = I/O packet extension , MOV I.PRM+4(R3),RG.LEN(R1) ; Segment length ; Assume 22 bit systemb> MOV I.PRM+2(R3),RG.ADD(R1) ; Low order 16 bits of buffer addr/ .IF DF M$$EXT ; If extended memory supportede0 MOVB 1(00=~TADATADATADATADATADATADATADATADATAR0),RG.AD2(R1) ; High order address bits .IFF ; If 18 bit system$; MOV (R0),R0 ; Bits 4 & 5 of R0 contain high address bits- ASR R0 ; Move bits 4 and 5 to bits 0 and 1  ASR R0 ; ...U ASR R0 ; ...  ASR R0 ; ...R0 BIC #177774,R0 ; Make sure high bits are clear. MOVB R0,RG.AD2(R1) ; High order address bits .IFTF ; M$$EXTD MOVB #RF.ENP!RF.OWN,RG.FLG(R1) ; Set END of chain and UNA owner bit .IFT ; M$$EXT. .IF DF R$$MPL ; If RSX-11M+/ BIT #FE.EXT,$FMASK ; Is this a 22-bit system?  BEQ 10$ ; If EQ no 5 BIT #KS.EXT,K.STS(R2) ; Extended memory supported?R BNE 10$ ; If NE yes( TST @#$UMRHD+2 ; Unibus map available? BEQ 10$ ; No  .IFF ; If not RSX-11M+3 BIT #DV.EXT,U.CW1(R5) ; Extended memory supported?a BNE 10$ ; Yes& TST @#$UMRPT ; Unibus map available? BEQ 10$ ; No$ .ENDC ; R$$MPL* MOV U.UCBX+6(R5),R0 ; Get UMR wait block& BEQ 20$ ; Crash, something is wrong5 MOV (R0),U.UCBX+6(R5) ; Dequeue the assignment blockh; MOV R0,RG.UMR(R1) ; Save UMR wait block PTR in ring entryS/ MOV IP.EXT(R3),R2 ; R2 = I/O packet extension;9 MOV I.PRM+2(R3),U.BUF+2(R5) ; Set low 16 bits of addressQ4 MOVB 1(R2),U.BUF+1(R5) ; Set high 6 bits of address3 MOV I.PRM+4(R3),U.CNT(R5) ; Byte count of transfer$ MOV R1,R3 ; Save R1 in R3& CALL $STMP1 ; Set up the Unibus map) MOV RG.UMR(R3),R0 ; R0 = UMR wait block ) ADD #10,R0 ; R0 = UMR assignment blocke' CALL $MPUB1 ; Map Unibus to transferD) MOV RG.UMR(R3),R0 ; R0 = UMR wait blockR) ADD #10,R0 ; R0 = UMR assignment blockS< MOV M.UMVL(R0),RG.ADD(R3) ; Set low 16 bits of virtual addr" CLR -(SP) ; Get a work register. MOVB M.UMVH(R0),(SP) ; Get high virtual addr/ ASR (SP) ; Get ext.bits 4 & 5 into bit 0 & 1; ASR (SP) ; ...s ASR (SP) ; ...  ASR (SP) ; ...C" BIC #^C<3>,(SP) ; Clear high bit9 MOVB (SP)+,RG.AD2(R3) ; Put extension bits in ring entry  MOV R3,R1 ; R1 = Ring entry .ENDC ; M$$EXT710$: BITB #374,RG.AD2(R1) ; Must not have high bits onc BNE 20$ ; This is very bads RETURN ;20$: .IF DF DEBUG ; If debugging BPT ; Breakd BR 20$ ; Loop on break pointi .IFFV CRASH ; Something is wrong .ENDC ; DEBUG  * .SBTTL GSUMR - Get Static UMR for driver;+@; **-GSUMR-Get static UMR and compute Unibus relocation constant; B; This routine maps the device communications area and the receive>; buffers with a UMR. In addition, it computes the relocationC; constant for virtual memory address to Unibus address conversion. ;v ; Inputs:R; R4 = Controller State TableU; ; OUTPUTS:,; 1. Upper 4K of driver is mapped with a UMR6; (starting at 1st 64 byte boundry following CBASE)1; 2. Relocation constant computed (RELCT,RELCT+2)a; ;-#GSUMR: CALL SALL ; Save registersM .IF DF R$$MPL ; If RSX-11M+ MOV C.KRB(R4),R2 ; R2 = KRBh .ENDC ; R$$MPL MOV C.UCB(R4),R5 ; R5 = UCB  CLR R0 ; Clear R0 & R1c CLR R1 ;e( CLR RELCT ; Make relocation bias zero CLR RELCT+2 ; ...' CMP #120000,#UNAST ; Loadable driver?n BNE 60$ ; If not EQ no 7 MOV @#KISAR5,R1 ; Yes, copy real start of driver area / .IF DF M$$EIS ; If extended instrucation set)+ ASHC #6.,R0 ; Calculate physical addressT .IFF" MOV R1,R0 ; Get start of driver2 SWAB R0 ; Do non-EIS emulation of "ASHC #6.,R0"4 BIC #177400,R0 ; ... To calculate physical address SWAB R1 ; ... BIC #377,R1 ; ... ROR R0 ; ...R ROR R1 ; ...L ROR R0 ; ...a ROR R1 ; ...C .ENDC ; M$$EIS- .IF DF M$$EXT ; Extended memory supported? 8 MOV #CBASE,-(SP) ; Get communication area base address) SUB #120000,(SP) ; Subtract driver basee3 BIC #77,(SP) ; We are dealing with 64 byte blocksp- ADD (SP)+,R1 ; Compute physical address of t# ADC R0 ; ... communications area-; D; Set up selected UMR to map all of the driver's receive buffers andE; device communications areas and save relocation constant for UnibusR; address computation.;  .IF D00E} D%B11110010F R$$MPL ; If RSX-11M+/ BIT #FE.EXT,$FMASK ; Is this a 22-bit system?p BEQ 50$ ; If EQ no,5 BIT #KS.EXT,K.STS(R2) ; Extended memory supported?0 BNE 50$ ; If NE yes( TST @#$UMRHD+2 ; Unibus map available? BEQ 50$ ; Nok' MOV R2,R4 ; Copy KRB address into R4s2 ADD K.OFF(R2),R4 ; Point to UMR assignment block SUB #M.LGTH,R4 ; ... .IFF 3 BIT #DV.EXT,U.CW1(R5) ; Extended memory supported?n BNE 50$ ; Yes& TST @#$UMRPT ; Unibus map available? BEQ 50$ ; No ; MOV C.SCB(R4),R4 ; Pointer to UMR assignment block in SCB  ADD #S.MPR,R4 ; ... .ENDC ; R$$MPL - TST M.UMRN(R4) ; Static UMR already set up?t BNE 70$ ; If NE yes2 MOV R1,M.BFVL(R4) ; Set up LO 16-Bits of address2 MOVB R0,M.BFVH(R4) ; Set up HI 6-bits of address, MOV #4,M.UMRN(R4) ; Set up count for 1 UMR520$: MOV R4,R0 ; Copy UMR work area pointer into R0V CALL $ASUMR ; Go assign UMR's BCS 20$ ; If CS, try againT* MOV R4,UABKS ; Save UMR assignment block; G; Load selected UMR to map receive buffers 18-bit addresses transformedA ; from 16-bit virtual addresses.;$1 MOV R4,R3 ; Copy UMR work area pointer into R3 ) MOV U.SCB(R5),R4 ; Retrieve SCB addressL CALL $MPUB1 ; Map the Unibuse1 MOV R3,R0 ; Copy UMR work area pointer into R0e BR 40$ ; and continue530$: MOV R4,R0 ; Copy UMR work area pointer into r0a) MOV U.SCB(R5),R4 ; Retrieve SCB addresss;40$: MOV M.UMVL(R0),R1 ; Get LO 16-bits of virtual addressS7 MOVB M.UMVH(R0),R0 ; Get HI 2-bits of virtual addressr- .IF DF M$$EIS ; If extended insruction setr1 ASH #-4,R0 ; Shift bits <4:5> right into <0:1>  .IFFa- ASR R0 ; Shift bits <4:5> right into <0:1>v ASR R0 ; ...C ASR R0 ; ...p ASR R0 ; ...V .ENDC ; M$$EIS;aE; Compute and save the double word relocation constant to transform apL; a virtual address within the UMR mapped communications area into an 18-bit ; address.;(;50$: MOV CVIRA,-(SP) ; (SP) = Communications area vir.addr)" BIC #77,(SP) ; Clear offset bits3 SUB (SP)+,R1 ; Subtract UMR mapped communicationsr$ SBC R0 ; ... base virtual address60$:6 MOV R0,RELCT+2 ; Save relocation constant (HI order) MOV R1,RELCT ; ... (LO order)+ .IFF ; If extended memory not supported = SUB #120000,R1 ; Compute relocation bias for 18 bit machinea SBC R0 ; ...p+ MOV R0,RELCT+2 ; Save relocation bias foro' MOV R1,RELCT ; ... for PCB, UDB, etc.s60$:6 .IFTF ; In either case for extended memory support RETURN ; Return to callerf* .IFT ; If extended memory is supported:70$: MOV R4,-(SP) ; Save mapping assignment block pointer MOV U.SCB(R5),R4 ; R4 = SCBi/ CALL $MPUBM ; Reload Unibus mapping registero1 MOV (SP)+,R4 ; Restore assignment block pointere( BR 30$ ; Go, compute relocation value .ENDC ; M$$EXT 5 .SBTTL RLPRT - Release port related data structuresa;+/; **-RLPRT-Release port related data structures:;.H; Return all port related data structures to DSR. The multicast addressD; list is released and the protocol list is scanned for address list?; entries which are owned by this port which are then released.);- ; Inputs:i"; R5 = Address of Port State Table;g; Registers PreservedR;;#RLPRT: CALL SALL ; Save registersB1 MOV R5,R2 ; Generate pointer to multicast list  ADD #P.MCST,R2 ; ... root 510$: MOV (R2),R0 ; R0 = Next mulicast address blockR BEQ 15$ ; That is it!% MOV #ML.LEN,R1 ; Size of this blocke MOV (R0),(R2) ; Dequeue it MOV R2,-(SP) ; Save R24 CALL $DEACB ; Deallocate the multicast addr block MOV (SP)+,R2 ; restore R2  BR 10$ ; Do nexti15$:3 CLR P.MCST(R5) ; Reset multicast address listheado MOV R5,P.MCST+2(R5) ; ...r ADD #P.MCST,P.MCST+2(R5) ; ...L/20$: MOV P.CTBL(R5),R4 ; Compute protocol liste' ADD #C.PROL,R4 ; ... listhead address.930$: MOV (R4),R4 ; Get addr of next protocol list entry  BEQ 80$ ; If EQ, no morei> BITB #LF.EXC!LF.DEF,PL.FLG(R4); Exclusive or default protocol) BEQ 40$ ; If EQ, not an exclusi00M~TADATADATADATADATADATADATADATADATAve portD5 CMP R5,PL.EXC(R4) ; Is protocol owned by this port?+ BNE 40$ ; If NE, no/ DECB PL.USE(R4) ; Reduce protocol usage countm"40$: MOV R4,R2 ; Compute address% ADD #PL.ADD,R2 ; ... chain listhead+950$: MOV (R2),R0 ; Get pointer to next addr chain entrys BEQ 30$ ; If EQ, no mores; CMP R5,AD.PRT(R0) ; Is this protocol in use by this port?l BEQ 60$ ; If EQ, yes;% MOV R0,R2 ; Move on down the chainP BR 50$;560$: MOV (R0),(R2) ; Unlink address block from chainn% BNE 70$ ; If NE, not last in chain - MOV R2,PL.ADD+2(R4) ; Close up tail pointerI*70$: DECB PL.USE(R4) ; Reduce usage count2 MOV #AD.LEN,R1 ; Get size of address chain entry MOV R2,-(SP) ; Save R23 CALL $DEACB ; Deallocate the address chain entry  MOV (SP)+,R2 ; Restore R23 BR 50$ ; Try next entry980$: CALL SCNPR ; Remove inactive protocol list entriesQ RETURN ; Return R< .SBTTL ****************************************************< .SBTTL * UNA Ring Handling Subroutines *< .SBTTL ****************************************************) .SBTTL INIRG - Initialize Ring pointerst;+;D$; **-INIRG- Initialize Ring Pointers;yA; This routine is called to initialize the rings used by the UNA. ?; The ring pointers used by the other ring routines are set up.e;y ; INPUTS:L; R4 = Controller State Tablet;l; REGISTERS PRESERVED ;-INIRG::$ MOV R0,-(SP) ; Save work registers MOV R1,-(SP) ; ...;*; Initialize receive ring ; 6 MOV C.RCVB(R4),C.RCVF(R4) ; Restart next free pointer; MOV C.RCVB(R4),C.RCVC(R4) ; Restart current active pointeri) MOV #U$$NRS,R0 ; R0 = Receive ring sizeG, MOV C.RCVB(R4),R1 ; R1 = Receive ring base10$:! CALL CLRING ; Clear ring entryy. MOV R1,RG.LNK(R1) ; Copy descriptor address.5 ADD #RG.SIZ,RG.LNK(R1) ; Plus length of a descriptorn/ MOV RG.LNK(R1),R1 ; Update descriptor pointer DEC R0 ; One less to do BNE 10$ ; Loop till doneRN MOV C.RCVB(R4),RG.LNK-RG.SIZ(R1); Set link word to point to first descriptor ;a; Initialize transmit ring R;(6 MOV C.XMTB(R4),C.XMTF(R4) ; Restart next free pointer; MOV C.XMTB(R4),C.XMTC(R4) ; Restart current active pointer1- MOV #,R0 ; R0 = Receive ring sizee, MOV C.XMTB(R4),R1 ; R1 = Receive ring base20$:! CALL CLRING ; Clear ring entry . MOV R1,RG.LNK(R1) ; Copy descriptor address.5 ADD #RG.SIZ,RG.LNK(R1) ; Plus length of a descriptort/ MOV RG.LNK(R1),R1 ; Update descriptor pointer( DEC R0 ; One less to do BNE 20$ ; Loop till donesB MOV C.XMTB(R4),RG.LNK-RG.SIZ(R1); Set link word to point to first ; ... descriptore7 CLR C.RSEQ(R4) ; Clear receive sequence # accumulatort8 CLR C.XSEQ(R4) ; Clear transmit sequence # accumulator" MOV (SP)+,R1 ; Restore registers MOV (SP)+,R0 ; ... RETURN ; Exit to caller CLRING: MOV R2,-(SP) ; Save R2p2 MOV #RG.SIZ/2,R2 ; R2 = Word count of ring entry#10$: CLR (R1)+ ; Clear ring entry  DEC R2 ; Count down BNE 10$ ; Loop till done & SUB #RG.SIZ,R1 ; Restore R1 at entry MOV (SP)+,R2 ; Restore R2; RETURN ; Returnn r1 .SBTTL GFRRE - Get next free receive ring entryr;+;s+; **-GFRRE-Get next free receive ring entrye;tA; This routine is called to get the next free receive ring entry.sH; If no free entry is available a BEQ condition is returned. The routineG; uses the ring pointers set up by INIRNG and updates these pointers asC ; required.C;r ; INPUTS: ; R4 = Controller State Table1; ; OUTPUTS:&; R1 -> Free Ring Entry (or 0 if none); ;; REGISTERS MODIFIED:e; R1;-/GFRRE: MOV C.RCVF(R4),R1 ; Get next ring entryx- TSTB RG.ACT(R1) ; Is this an active packet?E BEQ 20$ ; Noc0 CLR R1 ; Indicate no receive packet available"10$: TST R1 ; Set condition code RETURN ; Return to callera20$:0 MOV RG.LNK(R1),C.RCVF(R4) ; Update free pointer# CLRB RG.FLG(R1) ; Clear flag bytep$ CLRB RG.ERR(R1) ; Clear error word, INCB C.RSEQ(R4) ; Generate sequence number: MOVB C.RSEQ(R4),RG.SEQ(R1) ; Put sequence # i00U} D%B11110010n ring entry* INCB RG.ACT(R1) ; Indicate packet active BR 10$ ; Return to caller n2 .SBTTL GFXRE - Get next free transmit ring entry;+;Q,; **-GFXRE-Get next free transmit ring entry;kB; This routine is called to get the next free transmit ring entry.H; If no free entry is available a BEQ condition is returned. The routineG; uses the ring pointers set up by INIRNG and updates these pointers asI ; required.); ; INPUTS:q; R4 = Controller State TableR;E ; OUTPUTS:&; R1 -> Free Ring Entry (or 0 if none); ; REGISTERS MODIFIED:e; R1;-GFXRE:) MOV C.XMTF(R4),R1 ; Get next ring entryn% TSTB RG.ACT(R1) ; Is packet active? BEQ 20$ ; Nox5 CLR R1 ; Indicate no transmit ring entry availabled"10$: TST R1 ; Set condition code RETURN ; Return to callerv20$:0 MOV RG.LNK(R1),C.XMTF(R4) ; Update free pointer# CLRB RG.FLG(R1) ; Clear flag byten$ CLRB RG.ERR(R1) ; Clear error word, INCB C.XSEQ(R4) ; Generate sequence number5 MOVB C.XSEQ(R4),RG.SEQ(R1) ; Return sequence # in R2f, INCB RG.ACT(R1) ; Indicate entry is active BR 10$ ; Return to caller t/ .SBTTL GCRRE - Get current receive ring entrye;+;2); **-GCRRE-Get current receive ring entryt;nG; This routine is called to get a completed ring entry from the receiver:; ring. If none is available a BEQ condition is returned.;iD; If a ring entry is found the error bit is tested and the C-bit set; if an error is found.R; ; INPUTS:s(; R4 = Address of Controller State Table; ; OUTPUTS:; R1 -> Ring Entry or 0T; Z-Bit set if no entry 7; C-Bit set if valid ring entry and error in ring entryR;- ; R1 modifiedc;-GCRRE:;e'; Check to see if an entry is availablee;n) MOV C.RCVC(R4),R1 ; Get next ring entrye% TSTB RG.ACT(R1) ; Is packet active?v' BEQ 10$ ; No - show no current entryo0 BITB #RF.OWN,RG.FLG(R1) ; Do we own this entry? BEQ 20$ ; Yes*10$: CLR R1 ; No - show no current entry BR 50$ ; ...N;s;; Got an entry - check sequence numbers and update pointers ;-;20$: INCB C.RSEQ+1(R4) ; Update Sequence Number, check forv ; overflown BNE 30$ ; Skip overflow codem/ TSTB RG.SEQ(R1) ; Ring entry overflowed also?t! BNE 100$ ; No - sequence error4 BR 40$ ;e;30$: CMPB C.RSEQ+1(R4),RG.SEQ(R1) ; Sequence numbers match?1 BNE 100$ ; No - crash40$:3 MOV RG.LNK(R1),C.RCVC(R4) ; Update current pointer;2$; Set up conditions codes for caller;c250$: ; Converge here for condition code set up$ TST R1 ; Do we have a ring entry? BEQ 70$ ; No - just exitQ0 BITB #RF.STP,RG.FLG(R1) ; Is this a start entry BEQ 55$ ; No3> MOV RG.VAD(R1),C.STRT(R4) ; Save start buffer addr for CHKERR55$:< BITB #RF.ERR,RG.FLG(R1) ; Yes - then do we have any errors? SEC ; Default to error" BNE 60$ ; Yes - default correct CLC ; Set no errors"60$: CLZ ; Set buffer available470$: RETURN ; Return with Z and C cond. codes set;r/; Ring has gone out of sequence - serious error ; 100$:  .IF DF DEBUG ; If debugging BPT( BR 100$ ; Don't loose the break point .IFF; CRASH ; Serious error5 .ENDC ; DEBUGA ,7 .SBTTL GCXRE - Get current active transmit ring entryT;+;,1; **-GCXRE-Get current active transmit ring entryC; H; This routine is called to get a completed ring entry from the transmit:; ring. If none is available a BEQ condition is returned.;tD; If a ring entry is found the error bit is tested and the C-bit set; if an error is found.0; ; INPUTS:E(; R4 = Address of Controller State Table;n ; OUTPUTS:; R1 -> Ring Entry or 0; Z-Bit set if no entry57; C-Bit set if valid ring entry and error in ring entryt;t ; R1 modifiedn;-GCXRE:;'; Check to see if an entry is availablet;n) MOV C.XMTC(R4),R1 ; Get next ring entrye$ TSTB RG.ACT(R1) ; Is packet active' BEQ 10$ ; No - show no current entry 0 BITB #RF.OWN,RG.FLG(R1) ; Do we own this entry? BEQ 20$ ; Yes*10$: CLR R1 ; No - show no current entry BR 50$ ; ... ;S;; Got an entry00]~TADATADATADATADATADATADATADATADATA - check sequence numbers and update pointers;1720$: BITB #RF.STP,RG.FLG(R1) ; Is this the start entry?e BEQ 25$ ; Non6 MOV RG.LNK(R1),R1 ; Get data entry for this transmit9 BITB #RF.OWN,RG.FLG(R1) ; Do we own the data entry also?V/ BNE 10$ ; No, wait until we own both entriesA3 MOV C.XMTC(R4),R1 ; Yes, return with header entry 25$:7 INCB C.XSEQ+1(R4) ; Update Sequence Number, check for? ; overflows BNE 30$ ; Skip overflow coder/ TSTB RG.SEQ(R1) ; Ring entry overflowed also?y! BNE 100$ ; No - sequence errore BR 40$ ;1;30$: CMPB C.XSEQ+1(R4),RG.SEQ(R1) ; Sequence numbers match?B BNE 100$ ; No - crash40$:3 MOV RG.LNK(R1),C.XMTC(R4) ; Update current pointer,;G$; Set up conditions codes for caller;B250$: ; Converge here for condition code set up$ TST R1 ; Do we have a ring entry? BEQ 70$ ; No - just exitQ< BITB #RF.ERR,RG.FLG(R1) ; Yes - then do we have any errors? SEC ; Default to error" BNE 60$ ; Yes - default correct CLC ; Set no errorsE"60$: CLZ ; Set buffer available470$: RETURN ; Return with Z and C cond. codes set;e/; Ring has gone out of sequence - serious errorR;N100$:. .IF DF DEBUG ; If debugging BPT ; Serious errorn' BR 100$ ; Don't lose the break pointg .IFFr# CRASH ; Something is very wrongw .ENDC ; DEBUG$ .SBTTL RLRPK - Release ring packet;+; **-RLRPK-Release ring packet;e:; This routine releases a ring packet by clearing clearing; it's active flag byte.;e; INPUT:; R1 -> Ring packetr; /RLPKT: CLRB RG.ACT(R1) ; Make packet available. RETURN ; i3 .SBTTL STRBF - Set up receive buffers on the ring$;+;D,; **-STRBF-SET UP RECEIVE BUFFER ON THE RING;oI; These routine, if it can, will allocate receive buffers for all receiveh1; ring entries and puts them on the receive ring.B; ; INPUTS:l%; R4 - Address Controller state tablee;n ; OUTPUTS:; None;u; REGISTERS CHANGEDp; ; R3, R1;-GTRBF:, CLR -(SP) ; Indicate, no new ring entries610$: MOV C.RBFL(R4),R3 ; Get next free receive buffer BEQ 20$ ; No more0 CALL GFRRE ; Get next free receive ring entry1 BEQ 20$ ; No free entries - just return buffer 5 MOV (R3),C.RBFL(R4) ; Dequeue buffer from free lista+ ; Clear ring entry save area in bufferi9 MOV R3,RG.VAD(R1) ; Save virtual addr of receive bufferS CLR (R3)+ ; M.LNK CLR (R3)+ ; M.ERR CLR (R3)+ ; M.MLENu;EF; NOTE - We cannot move the relocation value into the ring as this mayL; set the ownership bit and we are not ready for the UNA to take this entry.;26 MOV RELCT+2,-(SP) ; Put relocation constant on stack MOV RELCT,-(SP) ; ...N* ADD R3,(SP) ; Convert packet address to" ADC 2(SP) ; ... Unibus address. 6 MOV (SP)+,RG.ADD(R1) ; Put unibus address of segment, MOVB (SP)+,RG.AD2(R1) ; ... into ring entry5 BIT #374,RG.AD2(R1) ; High order bits must be clearE, BNE 40$ ; Something is very wrong, CRASH!@ MOV #M.SIZE-M.DADD.,RG.LEN(R1); Set buffer length in ring entry+ MOVB #RF.OWN,RG.FLG(R1) ; Set owner to UNAU. INC (SP) ; Say, we added buffer to the ring BR 10$ ; Try another ones;(; Receive ring loaded or no more buffers;n%20$: TST (SP)+ ; Did we do anything. RETURN ; Return 40$: .IF DF DEBUG ; If debugging BPT ; just break .IFFA CRASH ; Otherwise, CRASH .ENDC ; DEBUG  h0 .SBTTL UMRMPA - UMR mapped communications area;+*; **-UMRMPA-UMR mapped communications area;(E; This (UP TO 4K) area is mapped with a UMR. This area contains datao:; structures used to communicate with the UMR controllers.<; i.e. - PCB, UDBB, etc. The remainder of the space is used; for receive buffers.;-CBASE:3 .REPT U$$NCT ; Generate UMR mapped communication: ; ... buffers.=.+C.BASZ ; GEN mapped areae .ENDR1RCVBFA: .BLKW 1 ; Start of receive buffers area 9NBPERC: .BLKW 1 ; TEMP SAVE # OF BUFFERS PER CONTROLLERr2RCVBFL: .BLKW 1 ; Temp receive buffers list root h/ .SBTTL UNAIN - UNA00e} D%B11110010 driver initialization codee;+1; **-UNAIN-RSX QIO UNA driver initialization codeh;MD; This routine sets up and initializes the driver's data structures.I; Once the driver is initialized, this code becomes a part of the receivemM; buffers. This routine is called by the load routine at load time ($XELOA).N; ; Inputs:K5; IMPUR, CBASE work areas, CVIRA (CBASE VIRTUAL ADDR) ; ; Outputs:-; The driver data structures are initialized. ;p; All registers are used;-+UNAIN:ASL R3 ; Make word controller indexi MOV R3,-(SP) ; Save R3, R4, R5 MOV R4,-(SP) ; ... MOV R5,-(SP) ; ...;u$; Create UMR wait buffer list in UCB; 3 MOV #U$$NTS,R0 ; R0 = # of UMR wait blocks neededh5 ADD #U.UCBX+10,R5 ; R5 = Addr of 1st UMR wait blocks% MOV R5,-2(R5) ; Init list root worda10$:* MOV R5,(R5) ; Create link to next block ADD #UMRWBS,(R5) ; ...( MOV (R5),R5 ; R3 points to next block" DEC R0 ; Dec wait block counter BNE 10$ ; Loop till done 1 CLR -UMRWBS(R5) ; Clear link word of last entrye;2; Compute number of receive buffers per controller;+ MOV CVIRA,R1 ; R1 = CBASE virtual addressu- BIC #160000,R1 ; R1 = Area size below CBASE 5 MOV #8192.-256.,R0 ; R0 = MAX receive area possibleA, SUB R1,R0 ; R0 = Communications area size6 SUB #RCVBFA-CBASE,R0 ; Adjust for communications area- MOV R0,R2 ; Save receive buffers area size(? CMP R0,# ; Do we have at least 1 buff/control.?t BGE 20$ ; Yes" CALLR 130$ ; No receive buffers20$: CLR R1 ; Clear counter%30$: INC R1 ; Generate buffer count 7 SUB #,R0 ; Compute # of buff/controllerd! BGT 30$ ; Loop to get quotienta;z; ALLOCATE THE BUFFERS;-+ MOV CVIRA,R0 ; R0 = CBASE VIRTUAL ADDRESSS8 ADD #RCVBFA-CBASE,R0 ; R0 = VIRTUAL ADDRESS OF "RCVBFA"1 MOV R1,2(R0) ; Save # of buffers per controller 1 MOV R0,4(R0) ; Init receive buff list root wordN1 MOV R0,R1 ; R1 = Start of receive buffers areaB3 ADD R2,R0 ; R0 points beyond last receive buffer0+40$: MOV R1,(R1) ; Generate chain pointere ADD #M.SIZE,(R1) ; ...% MOV (R1),R1 ; POINT TO NEXT BUFFERf CMP R1,R0 ; ARE WE DONE BLO 40$ ; LOOP TILL DONEL2 CLR -M.SIZE(R1) ; CLEAR LINK WORD OF LAST BUFFER;T; Clear controller state tablesR; ? MOV #/2,R0 ; R0 = Word count of controller tablesf1 MOV #IMPUR,R1 ; R1 = Start of controller tables 50$:+ CLR (R1)+ ; Clear controller tables areaf DEC R0 ; Decrement counter, BNE 50$ ; Loop till doner;i"; Clear mapped communications area;r@ MOV #/2,R0 ; R0 = Word count of controller tables0 MOV CVIRA,R1 ; R1 = Start of controller tables60$:+ CLR (R1)+ ; Clear controller tables areaA DEC R0 ; Decrement counter BNE 60$ ; Loop till donee6 MOV #IMPUR,R1 ; R1 = Address of 1st controller table' MOV #CTABL,R4 ; R4 = Controller tablea- MOV #U$$NCT,R5 ; R5 = Number of controllersC;r-; Start controller state table initialization ;n/ MOV CVIRA,R3 ; R3 = Virtual addrress of CBASEa570$: MOV #U$$NPC,R0 ; R0 = # of ports per controller 3 MOV R1,R2 ; R2 = Address of 1st controller table;6 ADD #C.LEN,R2 ; R2 = Address of word after 1st table/ MOV R4,C.INDX(R1) ; Generate controller index  SUB #CTABL,C.INDX(R1) ; ...4 MOV R2,C.PORT(R1) ; Initialize port list root word. MOV R1,(R4)+ ; Save controller table pointer ; ... in CTABL 8 MOV #CS.OFL,C.FLAG(R1) ; Indicate controller is offline .IF DF R$$MPL ; If RSX-11M+8 BIS #CS.STP,C.FLAG(R1) ; Indicate controller is stopped .ENDC ; R$$MPL .IF DF DEBUG ; If debugging9 MOV #MD.TPD!MD.LOO,C.MODE(R1); Default mode is loop back  .ENDC ; DEBUGd# .IF NDF DEBUG ; If not debugging 6 MOV #MD.TPD!MD.ECT,C.MODE(R1) ; See UNA mode bit def. .ENDC ; DEBUGT5 MOV R1,C.PROL+2(R1) ; Set end protocol list pointerS ADD #C.PROL,C.PROL+2(R1) ; ... ;.1; Create list of port state tables for controllern;l>80$: MOV R1,P.CTBL(R2) ; Save Control.State Table ptr in port= MOV R2,P.MCST+2(R2) ; Initiali00mytTADATADATADATADATADATADATADATADATAze multicast list end pointerM ADD #P.MCST,P.MCST+2(R2) ; ...i$ MOV R2,(R2) ; Generate port chain' ADD #P.LENG,(R2) ; Point to next portU' MOV (R2),R2 ; R2 = Next port pointer  DEC R0 ; One less to do BNE 80$ ; Loop till done0 CLR -P.LENG(R2) ; Clear link word of next port; 4; Allocate UMR mapped data structures for controller;7 MOV R3,C.PCBP(R1) ; Set PCBB addr in controller tablel+ ADD #CB.SIZ,R3 ; Point to word after PCBBe: MOV R3,C.UDBP(R1) ; Set UDBB address in controller table* ADD #RD.SIZ,R3 ; R3 => Receive ring area; !; Initialize receive ring pointero;c, MOV R3,C.RCVB(R1) ; Save receive ring base4 MOV R3,C.RCVF(R1) ; Receve ring free entry pointer8 MOV R3,C.RCVC(R1) ; Receive ring current entry pointer6 ADD #U$$NRS*RG.SIZ,R3 ; Account for receive ring size;p"; Initialize transmit ring pointer;- MOV R3,C.XMTB(R1) ; Save transmit ring basee6 MOV R3,C.XMTF(R1) ; Transmit ring free entry pointer9 MOV R3,C.XMTC(R1) ; Transmit ring current entry pointere; ADD #*2,R3 ; Account for transmit ring sizer) ; (2 XMIT RING ENTRIES PER TRANSMIT)); !; Initialize transmit header listC;R2 MOV #U$$NTS,R0 ; R0 = # of transmit ring entries5 MOV R3,C.XHDR(R1) ; init xmit header list root wordN90$:, MOV R3,(R3) ; Create transmit header list ADD #2+6+6+2+2,(R3) ; ...t MOV (R3),R3 ; ... DEC R0 ; Dec counterg BNE 90$ ; Loop till done . CLR -22(R3) ; Clear link word of last entry1 MOV R3,C.WRKP(R1) ; Save pointer to work buffer#3 ADD #C.WKSZ,R3 ; Add in controller work area sizer; ); Allocate receive buffers for controller ; 2 MOV NBPERC,R0 ; R0 = # of buffers per controller3 MOV #RCVBFL,R2 ; R2 = Receive buffer list pointerR0 MOV (R2),C.RBFL(R1) ; Point to list of buffers100$:)/ MOV (R2),R2 ; Allocate buffers to controller, DEC R0 ; ...V BNE 100$ ; ...D2 MOV (R2),RCVBFL ; Dequeue buffers just allocated2 CLR -M.SIZE(R2) ; Clear link word in last buffer= ADD #C.LEN+,R1; Point to next controller areaR& DEC R5 ; Decrement controller count BNE 70$ ; Do next controllerc" CLC ; Indicate successful init'110$: MOV (SP)+,R5 ; Restore registersL MOV (SP)+,R4 ; ... MOV (SP)+,R3 ; ...% BCS 120$ ; We failed to initializeb;e%; Save pointers to KRB, SCB, DCB, UCBu;r/ MOV CTABL(R3),R0 ; Get controller state table 7 MOV R4,C.SCB(R0) ; Save SCB in controller state table .IF DF R$$MPL ; If RSX-11M+= MOV S.KRB(R4),C.KRB(R0) ; Save KRB in controller state table  .IFFr0 MOV S.CSR(R4),C.CSR(R0) ; Save controller's CSR .ENDC ; R$$MPL7 MOV R5,C.UCB(R0) ; Save UCB in controller state tableS= MOV U.DCB(R5),C.DCB(R0) ; Save DCB in controller state tableR"120$: RETURN ; Return to caller#130$: SEC ; Indicate init failedB BR 110$ ; ReturnDREND: ; End of driver codee'DRVSIZ=DREND-IMPUR ; Driver area size <RBFASZ=<16384.-64.>-DRVSIZ-196. ; Receive buffers area size& .BLKB RBFASZ ; Receive buffers areaRCBEND:r .ENDte table  .IFFr0 MOV S.CSR(R4),C.CSR(R0) ; Save controller's CSR .ENDC ; R$$MPL7 MOV R5,C.UCB(R0) ; Save UCB in controller state tableS= MOV U.DCB(R5),C.DCB(R0) ; Save DCB in controller state tableR"120$: RETURN ; Return to caller#130$: SEC ; Indicate init failedB BR 110$ ; ReturnDREND: ; End of driver codee'DRVSIZ=DREND-IMPUR ; Driver area size <RBFASZ=<16384.-64.>-DRVSIZ-196. ; Receive buffers area size& .BLKB RBFASZ ; Receive buffers areaRCBEND6; XEPRE.MAC PREFIX FILE FOR ASSEMBLING THE XE DRIVER&U$$NTS=3 ;NUMBER OF XMT RINGS ENTRIES*U$$NRS=8. ;NUMBER OF TRANMIT RING ENTRIES$U$$NCT=1 ;NUMBER OF UNA CONTROLLERS*U$$NPC=8. ;NUMBER OF PORTS PER CONTROLLER'L'c.=0$;:!; Multicast address chain entries$;: M$LNK:'L' .BLKW 1 ; Link pointer%M$ADD:'L' .BLKW 3 ; Multicast addressi M$LEN:'L' .PSECT .IF NB LST  .NLISTl .IFFr .MACRO EPMDF$,X,Y,Z .ENDM EPMDF$p .ENDC .ENDM EPMDF$ ; Default user defined)LF$PAD='B' 4 ; 00u} D%B11110010 .TITLE XMDRV  .IDENT /04.1/;V); COPYRIGHT (C) 1976, 1977,1979,1980,1981.5; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. 01754T;6<; 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 TO6; AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.;L?; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT17; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY ; DIGITAL EQUIPMENT CORPORATION.;F>; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY@; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.; ; VERSION 04;H; DMC-11 DRIVER ;T;E/; MPP005 -- ALLOW MODE CHANGE ONLY WHEN DEVICE ; IS OFFLINED; $; RC006 -- GENERAL FIX UP FOR M V3.2;#; IZ004 -- CORRECT UMR DEALLOCATIONR; E; RWS002 -- CORRECT SYSTEM CRASH BECAUSE NO I/O PACKET ON QUEUE AFTERG*; IOKILL OR LINE GOING DOWN SPR11-60550# .SBTTL LIBRARY MACROS ;JFR002I* .MCALL CUCDF$,INTSV$,PKTDF$,SCBDF$,UCBDF$( CUCDF$ ;COMMUNICATIONS UCB DEFINITIONS PKTDF$ ;I/O PACKET DEFINITIONS SCBDF$ ;SCB DEFINITIONSA UCBDF$ ;UCB DEFINITIONS  -' .SBTTL CONDITIONAL ASSEMBLY PARAMETERSE; 22 BIT ADDRESSINGE .IIF DF M$$MGE & M$$EXT, X$$22=0; 18 BIT ADDRESSING .IF DF M$$MGE0.IIF NDF M$$EXT, X$$18=0.ENDC #; QIO DRIVER PLUS 22 BIT ADDRESSINGE.IIF DF X$$22 Q$$22=0  X$$M11=X$$M11 ; DON'T LAUGHN ; LOADABLE DRIVER MAPPING NEEDED .IIF DF M$$MGE & LD$XM, X$$LDM=0; DYNAMIC UMR ALLOCATION COUNT .IF DF R$$MPL!V$$RSN&Q$$22B.IIF NDF XM$UMR, XM$UMR=5 .IIF NE XM$UMR-3, XM$UMR=5.ENDCE I .SBTTL EQUATED SYMBOLSI; BIT ASSIGNMENTS BIT0=1BIT1=2BIT2=4BIT3=10BIT4=20TBIT5=40NBIT6=100BIT7=200BIT8=400 BIT9=1000 BIT10=2000 BIT11=4000 BIT12=10000I BIT13=20000, BIT14=40000D BIT15=100000; CSR INDEX VALUESSEL0=0SEL2=2; SEL0 ASSIGNMENTSRUN=BIT15 ;RUN'MC=BIT14 ;MASTER CLEARI*RDYI=BIT7 ;MICROPROCESSOR READY FOR INPUT!IEI=BIT6 ;INPUT INTERRUPT ENABLENRQI=BIT5 ;REQUEST INV!TYPE=BIT2!BIT1!BIT0 ;REQUEST TYPEMRELEAS=RQI!IEI ;PORT RELEASE5; SEL0 INPUT TRANSACTION TYPES-BACCI=RQI ;BUFFER ADDRESS/CHARACTER COUNT IN2CNTLI=RQI!BIT0 ;CONTROL IN4BASEI=RQI!BIT1!BIT0 ;BASE INXMT=BACCI ;TRANSMIT BUFFERIRCV=BACCI!BIT2 ;RECEIVE BUFFER09PERR=BASEI ;CAUSE PROCEDURE ERROR BY DOING BASE IN TWICE0; SEL2 ASSIGNMENTS+RDYO=BIT7 ;MICROPROCESSOR READY FOR OUTPUT "IEO=BIT6 ;OUTPUT INTERRUPT ENABLE; SEL6 ASSIGNMENTS (CNTLI)HDX=BIT10 ;HALF DUPLEX=,SCNDRY=BIT11 ;HALF DUPLEX SECONDARY STATIONMOP=BIT8 ;MAINTENANCE MODER; SEL6 ASSIGNMENTS (BASEI)FRESUME=BIT12 ;RESUME AFTER POWERFAIL (PERIPHERALS HANDBOOK IS WRONG!); SEL6 ASSIGNMENTS (CNTLO)/DATACK=BIT0 ;RETRANSMISSION THRESHOLD EXCEEDEDI/TIMOUT=BIT1 ;NO REMOTE RESPONSE FOR 21 SECONDSC4ORUN=BIT2 ;MESSAGE RECEIVED BUT NO BUFFER AVAILABLE'MAINT=BIT3 ;DDCMP MAINTENANCE RECEIVEDR*LOST=BIT4 ;MESSAGE RECEIVED > BUFFER SIZE;DISCON=BIT6 ;MODEM DATA SET READY LEAD WENT FROM ON TO OFFE!START=BIT7 ;DDCMP START RECEIVEDN1MEMORY=BIT8 ;UNIBUS TIME-OUT ON MEMORY REFERENCE6BUG=BIT9 ;PROGRAM BUG!U<UNXINT=BIT14 ;UNEXPECTED INTERRUPT, NO I/O PACKET AVAILABLE(FATAL=TIMOUT!MAINT!LOST!START!MEMORY!BUG; U.CW3 ASSIGNMENTST0U3.ERR=BIT15 ;HAS FATAL ERROR OCCURRED? (1=YES).U3.KIL=BIT14 ;HAS I/O KILL BEEN DONE? (1=YES)(U3.PWF=BIT13 ;HAS POWER FAILED? (1=YES)-U3.MOD=HDX!SCNDRY!MOP ;CURRENT OPERATING MODEE.U3.FRK=BIT0 ;IS FORK PROCESS RUNNING? (1=YES); UCB DISPLACEMENTS USED .ASECTT .=U.VCB+2(U.XQ: .BLKW 1 ;TRANSMIT LISTHEAD ADDRESS'U.RQ: .BLKW 1 ;RECEIVE LISTHEAD ADDRESS U.ERR: .BLKW 1 ;ERROR STATUSU.LEN=.E .PSECTP0; MAXIMUM NUMBER OF BUFFERS WHICH DMC CAN HANDLE .IF DF Q$$22 .IF DF V$$RSN!R$$MPLT.IIF EQ XM$UMR-3, MAXBUF=1.ENDCO.IIF NDF MAXBUF, MAXBUF=2T.ENDCS.IIF NDF MAXBU00}tTADATADATADATADATADATADATADATADATAF, MAXBUF=7); LISTHEAD DISPLACEMENTS .ASECT= .=0 .BLKW 2 ;SENT QUEUE .BLKW 2 ;WAIT QUEUE"IOTYPE: .BLKB 1 ;SEL0 REQUEST TYPECOUNT: .BLKB 1 ;SENT COUNT .IF DF Q$$22UMR: .BLKW 1 ;NEXT UMR TO USEK*UMRSUM: .BLKW 1 ;SUM OF BOTH UMR ADDRESSES .ENDC .PSECTA; FIRST UMR ADDRESSWFIRSTUMR=1702000; WHERE BUFFER ADDRESS AND COUNT ARE TO BE FOUND X.PRM=I.PRMA"; DEVICE INITIALIZATION WAIT TIMES<S.WAIT=200. ;LOOP COUNTDOWN VALUE WAITING FOR RDYI TO BE SET1C.WAIT=100. ;DITTO WAITING FOR RDYI TO BE CLEAREDT D .SBTTL LOCAL DATA; MICROPROCESSOR BASE TABLE(S):; *** WARNING *** THIS MUST BE THE FIRST ASSEMBLY LOCATIONBASE: .REPT X$$M11 .BLKW 128.  .ENDR; DRIVER DISPATCH TABLES .IF DF R$$MPL( DDT$ XM,X$$M11,,INIT,CNTBL,NEW .IFF$ DDT$ XM,X$$M11,,INIT,CNTBL .ENDC; TEMPORARY UNIT SAVEC .IF GT X$$M11-1 TEMP: .BLKW 1A .ENDC ; LISTHEADSTLIST: .REPT X$$M11 .WORD 0,.-2 ;COMPLETED BUFFERST# .WORD 0,.-2 ;TRANSMITS SENT (U.XQ)D .WORD 0,.-2 ;TRANSMITS WAITINGE .BYTE XMT,0 .IF DF Q$$22 .BLKW 2 .IFTF" .WORD 0,.-2 ;RECEIVES SENT (U.RQ) .WORD 0,.-2 ;RECEIVES WAITING .BYTE RCV,0 .IFTM .BLKW 2 .ENDC .ENDR$; MULTIPLE UNIT BASE TABLE ADDRESSES .IF NDF X$$LDM1 .IF GT X$$M11-1BTAB:W BADDR=BASE .REPT X$$M11I .WORD BADDRBADDR=BADDR+256. .ENDR .ENDC .ENDC"; MULTIPLE UNIT LISTHEAD ADDRESSES .IF GT X$$M11-1XLTAB: XLADDR=LIST+4O .REPT X$$M11E .WORD XLADDR. .IF DF Q$$22NXLADDR=XLADDR+32. .IFF0XLADDR=XLADDR+24.T .ENDC .ENDR .ENDC; ADDRESS EXTENSION BITS .IF DF M$$MGE"AXTAB: .WORD 0,40000,100000,140000 .ENDC I .SBTTL INITIATE I/O;+; **-XMINIT-INITIATE DMC I/O;T ; INPUTS:A; R5=UCB ADDRESS;. ; OUTPUTS:; ALL I/O PACKETS PROCESSED;D; NOTE:.>; IF TIMER IS ACTIVE, DISCONNECT ERROR RECOVERY IS IN PROGRESS;- XMRET: RETURNU%XMINIT: MOV U.SCB(R5),R4 ;SCB ADDRESS1! TSTB S.CTM(R4) ;IS TIMER ACTIVE?1# BNE XMRET ;IF NE, YES - MUST WAITL* MOVB S.STS(R4),-(SP) ;SAVE ACTIVITY COUNT, CLRB S.STS(R4) ;DECLARE CONTROLLER NOT BUSY+ BICB #US.BSY,U.STS(R5) ; AND IDLE THE UNIT0- CALL $GTPKT ;GET AN I/O PACKET IF AVAILABLE- MOVB (SP)+,S.STS(R4) ;RESTORE ACTIVITY COUNTA# BCS XMRET ;IF CS, NO MORE PACKETSL; ; $GTPKT RETURNS THE FOLLOWING:; R1=I/O PACKET ADDRESSC"; R2=PHYSICAL UNIT NUMBER (U.UNIT); R3=CONTROLLER INDEX (S.CON)O; R4=SCB ADDRESS; R5=UCB ADDRESS;. MOV R5,R2 ;UCB ADDRESS ADD #U.CW2,R2 ;U.CW2 ADDRESST9 CMPB #IO.INL/256.,I.FCN+1(R1);IS IT A TRANSFER FUNCTION?  BLOS 2$ ;IF LOS, NOL) JMP TRAN ;ELSE IT IS A TRANSFER REQUEST ;E; CONTROL FUNCTION;T(2$: BNE 20$ ;IF NE, MODE CHANGE REQUEST* TSTB I.FCN(R1) ;IS IT TERMINATE FUNCTION? BNE 10$ ;IF NE, YESR;A; INITIALIZE (IO.INL)R;R- BIT #U2.ONL,(R2) ;IS DEVICE ALREADY ON-LINE?  BNE PKTOK ;IF NE, YESU# MOV R5,CNTBL(R3) ;SAVE UCB ADDRESSO .IF GT X$$M11-1, MOV XLTAB(R3),R0 ;TRANSMIT LISTHEAD ADDRESS .IFF#* MOV #LIST+4,R0 ;TRANSMIT LISTHEAD ADDRESS .ENDC0 MOV R0,U.XQ(R5) ;SAVE TRANSMIT LISTHEAD ADDRESS# ADD #COUNT,R0 ;POINT TO SENT COUNTS CLRB (R0)+ ;ZERO IT OUT .IF DF Q$$22  .IF DF V$$RSN!R$$MPLN .IF NDF R$$MPLT/ TST S.MPR+2(R4) ;DOES UMR BLOCK ALREADY EXIST?  .IFF + MOV S.KRB(R4),R2 ; MOV KRB ADDRESS INTO R22( ADD K.OFF(R2),R2 ;POINT TO UMR AREA + 2+ SUB #M.LGTH,R2 ;POINT TO START OF UMR AREAV! TST (R2) ; IS IT ALREADY SET UP? .ENDC BNE 6$ ;IF NE, YES (!!!) MOV R0,-(SP) ;SAVE R0% MOV R1,-(SP) ;AND THE PACKET ADDRESS. MOV R2,-(SP) ;AND SAVE R22 MOV #M.LGTH,R1 ;SET SIZE OF BLOCK TO BE REQUESTED- CALL $ALOCB ;TRY TO ALLOCATE THE DATA BLOCK. BCS 4$ ;IF C-SET WE FAILED0 MOV #,M.UMRN(R0) ;SETUP UMR COUNT * 4" CALL $ASUMR ;TRY TO GET THE UMRS BCC 5$ ;IF C-CLEAR WE GOT THEM, CALL $DEACB ;ELSE GIVE BACK THE DATA BLOCK4$: MOV (SP)+,R2 ;RESTORE R2! MOV (SP)+,R1 ;AND PACKET ADDRESS  TST (SP)+ ;POP THE STACK6 BR XMRSU ;AND REPORT THE RESOURCE ALLOCATION FAILURE5$: MOV (SP)+,R2 ;RESTORE R2 .IF NDF R$$MPL,00} D%B11110010) MOV M.UMRA(R0),S.MPR(R4) ;SAVE FIRST UMRZ. MOV R0,S.MPR+2(R4) ;AND THE UMR BLOCK ADDRESS .IFFA$ MOV M.UMRA(R0),(R2) ;SAVE FIRST UMR) MOV R0,2(R2) ; AND THE UMR BLOCK ADDRESST .ENDC= MOV R5,M.UMVL(R0) ;MARK THE UMR BLOCK (FOR SYSTEM DEBUGGING)E) MOV (SP)+,R1 ;RESTORE THE PACKET ADDRESSC' MOV (SP)+,R0 ;AND THE LISTHEAD POINTERR .ENDC .IF NDF R$$MPLC16$: MOV S.MPR(R4),R2 ;FIRST UMR IS FOR BASE TABLE  .IFFE.6$: MOV S.KRB(R4),R2 ; MOV KRB ADDRESS INTO R2( ADD K.OFF(R2),R2 ;POINT TO UMR AREA + 2+ SUB #M.LGTH,R2 ;POINT TO START OF UMR AREAR* MOV (R2),R2 ;R2=FIRST UMR FOR BASE TABLE .ENDC9 CMP (R2)+,(R2)+ ;SECOND AND THIRD UMRS ARE FOR TRANSMITS ! MOV R2,(R0)+ ;SECOND UMR ADDRESS, MOV R2,(R0) .IF EQ MAXBUF-2 & CMP (R2)+,(R2)+ ;GET TO THE THIRD UMR .ENDCC4 ADD R2,(R0)+ ;SUM OF SECOND AND THIRD UMR ADDRESSES .IFTF/ MOV R0,U.RQ(R5) ;SAVE RECEIVE LISTHEAD ADDRESSS .IFT # ADD #COUNT,R0 ;POINT TO SENT COUNTM CLRB (R0)+ ;ZERO IT OUTD8 CMP (R2)+,(R2)+ ;FOURTH AND FIFTH UMRS ARE FOR RECEIVES! MOV R2,(R0)+ ;FOURTH UMR ADDRESS, MOV R2,(R0) .IF EQ MAXBUF-2.& CMP (R2)+,(R2)+ ;GET TO THE FIFTH UMR .ENDC 4 ADD R2,(R0) ;SUM OF FOURTH AND FIFTH UMR ADDRESSES .IFF, CLRB COUNT(R0) ;ZERO OUT RECEIVE SENT COUNT .ENDC& CALL SETDMC ;INITIALIZE DMC HARDWARE$ BCS XMINF ;IF CS, HARDWARE TROUBLE' BIS #U2.ONL,U.CW2(R5) ;SET ON-LINE BITR8 BIC #^C,U.CW3(R5) ;CLEAR EVERYTHING EXCEPT MODE$ BR PKTOK ;RETURN SUCCESSFUL STATUS;+; TERMINATE (IO.TRM);R&10$: MOV R1,-(SP) ;SAVE PACKET ADDRESS CLR R0 ;NO SPECIAL ERROR CODEM CALL KILL ;KILL THE DEVICE-16$: MOV (SP)+,R1 ;RESTORE THE PACKET ADDRESSO$ BR PKTOK ;RETURN SUCCESSFUL STATUS;; MODE CHANGE FUNCTION;U)20$: BIT #U2.ONL,(R2) ;IS DEVICE ON-LINE?  BNE XMDNR ;IF NE, YES4 BITB #IO.HDX,I.FCN(R1);IS SUB-FUNCTION HALF-DUPLEX? BNE 30$ ;IF NE, YES 4 BITB #IO.FDX,I.FCN(R1);IS SUB-FUNCTION FULL DUPLEX? BEQ XMIFC ;IF EQ, NO;N; FULL DUPLEX (IO.FDX);E6 BIT #U2.LIN,(R2) ;WAS DEVICE SYSGENED AS HALF-DUPLEX? BNE XMIFC ;IF NE, YESE, BIC #U2.HDX,(R2)+ ;SET FULL DUPLEX IN U.CW2$ CLR (R2) ;HALF-DUPLEX MODE BIT OFF BR 50$R;O; HALF-DUPLEX (IO.HDX);S030$: BIS #U2.HDX,(R2)+ ;SET HALF-DUPLEX IN U.CW2$ MOV #HDX,(R2) ;HALF-DUPLEX MODE BIT( TST I.PRM(R1) ;LOOK AT QIO PARAMETER P1! BEQ 40$ ;IF EQ, PRIMARY STATIONP+ BIS #SCNDRY,(R2) ;IF NE, SECONDARY STATION..40$: TST I.PRM+2(R1) ;LOOK AT QIO PARAMETER P2 BEQ 50$ ;IF EQ, NORMAL MODE ' BIS #MOP,(R2) ;IF NE, MAINTENANCE MODEC50$: ;FALL THRU TO PKTOKB I .SBTTL FINISH I/O PACKETH;+0; **-PKTOK-FINISH PACKET WITH STATUS OF "IS.SUC"; **-FINPKT-ALTERNATE ENTRYO; ; INPUTS: ; R1=I/O PACKET ADDRESS2; R5=UCB ADDRESS;D; CALLING SEQUENCE:# ; JMP PKTOKF;P ; OUTPUTS:; PACKET FINISHEDO(; XMINIT CALLED TO START ANY NEW PACKETS;-.PKTOK: MOV #IS.SUC&377,-(SP);SUCCESSFUL STATUS)FINPKT: MOV R1,-(SP) ;SAVE PACKET ADDRESSI! CALL XMINIT ;TRY ANOTHER PACKETO% MOV (SP)+,R3 ;RESTORE PACKET ADDRESST MOV (SP)+,R0 ;STATUS WORD 1 CLR R1 ;STATUS WORD 2 = 0I! CALLR $IOFIN ;FINISH I/O PACKETF;S; DEVICE NOT READY; !XMINF: .IF DF R$$MPL!V$$RSN&Q$$22R CALL DEUMR ;DE-ALLOCATE UMR'SE .ENDCXMDNR: MOV #IE.DNR&377,-(SP) BR FINPKT;#; ILLEGAL BUFFER; XMSPC: MOV #IE.SPC&377,-(SP) BR FINPKT; ; ILLEGAL FUNCTION CODE;XMIFC: MOV #IE.IFC&377,-(SP) BR FINPKT;S; RESOURCE ALLOCATION FAILUREC;  .IF DF R$$MPL!V$$RSN&Q$$22AXMRSU: MOV #IE.RSU&377,-(SP) BR FINPKT .ENDC T% .SBTTL PROCESS QIO TRANSFER FUNCTION ;T; TRANSFER FUNCTIONR;O*TRAN: BIT #U2.ONL,(R2) ;IS DEVICE ON-LINE? BEQ XMDNR ;IF EQ, NO .IF DF X$$225 BIT #160000,I.PRM+4(R1) ;IS BUFFER SIZE >= 4K WORDS?E# ;BUFFER MUST BE MAPPED BY 1 UMRE .IFF5 BIT #140000,I.PRM+4(R1) ;IS BUFFER SIZE >= 8K WORDS?  .ENDCU+ BNE XMSPC ;IF NE, YES - BUFFER IS TOO BIG$ INCB S.STS(R4) ;INCR ACTIVITY COUNT .IF DF X$$18) MOV I.PRM(R1),R0 ;GET NPR EXTENSION BITSU+ SWAB R0 ;AND SHIFT00tTADATADATADATADATADATADATADATADATA FROM BIT POSITIONS 5-4R ASL R0 ;TO BIT POSITIONS 15-14 ASL R0F- BIS R0,I.PRM+4(R1) ;THEN AND WITH BYTE COUNTS .ENDCN7 CMPB #IO.WLB/256.,I.FCN+1(R1) ;IS IT A WRITE FUNCTION?0 BEQ 10$ ;IF EQ, YESE;I!; RECEIVE DATA (IO.RLB OR IO.RNS)B;A* MOV U.RQ(R5),R0 ;RECEIVE LISTHEAD ADDRESS BR 20$B;E"; TRANSMIT DATA (IO.WLB OR IO.WNS);X/10$: MOV U.XQ(R5),R0 ;TRANSMIT LISTHEAD ADDRESST/20$: MOV #XMINIT,-(SP) ;SET TO RETURN TO XMINITV ;FALL THRU TO TRYE N+ .SBTTL TRY TO GIVE TRANSFER REQUEST TO DMCI;+,; **-TRY-TRY TO GIVE TRANSFER REQUEST TO DMC; ; INPUTS:R+; R0=SENT Q LISTHEAD ADDRESS (U.XQ OR U.RQ); R1=I/O PACKET ADDRESSN; R4=SCB ADDRESS; R5=UCB ADDRESS;1$; OUTPUTS IF PORT WAS NOT AVAILABLE:; R0=WAIT Q LISTHEAD ADDRESS; R2,R3=DESTROYED ; R4=CSR ADDRESS; PACKET QUEUED ON WAIT QT;I.; OUTPUTS IF PORT WAS AVAILABLE BUT NOT READY:; R0=WAIT Q LISTHEAD ADDRESS; R2,R3=DESTROYEDE; R4=CSR ADDRESS; REQUEST TYPE!IEI LEFT IN SEL0; PACKET QUEUED ON WAIT QR;Q*; OUTPUTS IF PORT WAS AVAILABLE AND READY:; R2,R3=DESTROYEDC; R4=CSR ADDRESS$; DMC GIVEN BUFFER ADDRESS AND COUNT; DMC PORT RELEASEDE; SENT COUNT INCREMENTED; PACKET QUEUED ON SENT Q ;-'TRY: MTPS S.PRI(R4) ;DISABLE INTERRUPTS MOV S.CSR(R4),R4 ;;;CSR ADDRESS TST 4(R0) ;;;IS WAIT Q EMPTY?Q+ BNE 30$ ;;;IF NE, NO - NO ACTION POSSIBLEV! CALL PORT ;;;IS PORT AVAILABLE?  BCS 30$ ;;;IF CS, NO- BIT #RDYO,2(R4) ;;;IS OUTPUT TRANSFER READY?I( BNE 20$ ;;;IF NE, YES - USE INTERRUPTS MOV #4,R2 ;;;LOOP COUNTA.10$: BIT #RDYI,(R4) ;;;IS DMC READY FOR INPUT? BNE 40$ ;;;IF NE, YES  SOB R2,10$ ;;;,20$: BIS #IEI,(R4) ;;;ENABLE INPUT INTERRUPT BIS #IEI,(R4) ;;;TWICE /30$: CMP (R0)+,(R0)+ ;;;WAIT Q LISTHEAD ADDRESSR( CALL $QINSF ;;;INSERT PACKET ON WAIT Q ;;;NOTE-$QINSF DESTROYS R2 BR 50$ ;;;*40$: CALL GIVE ;;;GIVE PACKET INFO TO DMC%50$: MTPS #0 ;;;RE-ENABLE INTERRUPTSI RETURN T4 .SBTTL LOAD DATA PORT WITH BUFFER ADDRESS AND COUNT;+.; **-GIVE-GIVE BUFFER ADDRESS AND COUNT TO DMC;A ; INPUTS:#; R0=SENT Q LISTHEAD ADDRESS; R1=I/O PACKET ADDRESSE; R4=CSR ADDRESS; DMC READY FOR INPUTR;; ; OUTPUTS:; R2,R3=DESTROYED#$; DMC GIVEN BUFFER ADDRESS AND COUNT; DMC PORT RELEASED ; SENT COUNT INCREMENTED; PACKET INSERTED ON SENT Q ;-,GIVE: INCB COUNT(R0) ;;;INCREMENT SENT COUNT .IF DF Q$$22A$ MOV R0,R2 ;;;COPY LISTHEAD ADDRESS" MOV UMR(R2),R0 ;;;NEXT UMR TO USE1 MOV UMRSUM(R2),UMR(R2) ;;;RESET NEXT UMR ADDRESS SUB R0,UMR(R2) ;;;B& MOV R2,-(SP) ;;;SAVE LISTHEAD ADDRESS0 MOV X.PRM(R1),R2 ;;;PUT 18 BIT ADDRESS IN R2,R3 SWAB R2 ;;;  MOV X.PRM+2(R1),R3 ;;;D4 CALL MAP22 ;;;DO 22 BIT MAPPING AND LOAD DATA PORT, BIS X.PRM+4(R1),6(R4) ;;;INCLUDE BYTE COUNT) MOV (SP)+,R0 ;;;RESTORE LISTHEAD ADDRESST .IFFE1 MOV X.PRM+2(R1),4(R4) ;;;GIVE DMC BUFFER ADDRESS # MOV X.PRM+4(R1),6(R4) ;;;AND COUNT, .ENDC% BIC #RELEAS,(R4) ;;;RELEASE THE PORTN) CALLR $QINSF ;;;INSERT PACKET ON SENT QR ;;;NOTE-$QINSF DESTROYS R2 ( .SBTTL INITIALIZE DMC HARDWAREI;+#; **-SETDMC-INITIALIZE DMC HARDWARE ; ; INPUTS:R; R3=CONTROLLER INDEX (S.CON)M; R4=SCB ADDRESS; R5=UCB ADDRESS; U3.MOD=DMC MODEO;D ; OUTPUTS:; R0,R2,R3=DESTROYED; R4=CSR ADDRESS; CARRY CLEAR=OK); CARRY SET=HARDWARE NOT WORKING PROPERLYX;- .ENABL LSB;3SETDMC: CLR U.ERR(R5) ;CLEAR ERROR STATUS AND C-BIT .IF DF X$$22 .IF NDF R$$MPL ) MOV S.MPR(R4),R0 ;GET THE BASE TABLE UMRE .IFFE+ MOV S.KRB(R4),R0 ; MOV KRB ADDRESS INTO R0( ADD K.OFF(R0),R0 ;POINT TO UMR AREA + 2+ SUB #M.LGTH,R0 ;POINT TO START OF UMR AREA ! MOV (R0),R0 ;GET BASE TABLE UMRC .ENDC .ENDC MOV S.CSR(R4),R4 ;CSR ADDRESS# BIS #MC,(R4) ;MASTER CLEAR THE DMC3C; THE FOLLOWING INSTRUCTION NEEDED WITH COMIOP BOARD AND OK WITHOUTN( MOV #RUN,(R4) ;START THE MICROPROCESSOR- BIS #IEO,2(R4) ;ENABLE COMPLETION INTERRUPTS ' MOVB #BASEI,(R4) ;BASE IN REQUEST TYPE CALL WRDYIS ;WAIT FOR RDYI SET BCS 40$ ;IF CS, TROUBLEK;R2; THE BASE TABLE ADDRESS IS CALCULATED AS FOLLOWS:00} D%B111100100; IF UNMAPPED, USE EITHER "#BASE" OR "BTAB(R3)".=; IF MAPPED AND DMC DRIVER IS NOT LOADABLE, SAME AS UNMAPPED.;; IF MAPPED AND DMC DRIVER IS LOADABLE, USE KISAR5 CONTENTSE; SHIFTED LEFT 6 PLACES.L;N9; THUS, THE UMR IS ALWAYS SET TO THE ADDRESS OF THE FIRSTV<; BASE TABLE AND THE 18 BIT ADDRESS IS ADJUSTED ACCORDINGLY.;P .IF DF X$$LDM CLR R2 ;NO EXTENSION BITS YETE .IF DF X$$22 ASR R3 ;CALCULATE UNIT # * 400 SWAB R3 MOV R3,-(SP) ;SAVE IT ON STACKE5 MOV KISAR5,R3 ;UMR ALWAYS POINTS TO FIRST BASE TABLE  .IFF% ASL R3 ;BASE TABLE DISPLACEMENT/100I' ADD KISAR5,R3 ;PLUS DRIVER ADDRESS/100M .IFTFM" MOV #6,-(SP) ;NOW MULTIPLY BY 100#5$: ASL R3 ;BY SHIFTING R2,R3 LEFT ROL R2 ;6 PLACES DEC (SP) ;DONE?D BNE 5$ ;IF NE, NO  TST (SP)+ ;PURGE LOOP COUNTS .IFT2 CALL MAP22 ;DO 22 BIT MAPPING AND LOAD DATA PORT5 ADD (SP)+,4(R4) ;ADJUST BY MULTIPLE BASE TABLE INDEXL .IFF% MOV R3,4(R4) ;LOW 16 BITS OF ADDRESSO ASL R2 ;MAKE A WORD INDEX , MOV AXTAB(R2),6(R4) ;ADDRESS EXTENSION BITS .ENDC; .IFFE .IF GT X$$M11-1A+ MOV BTAB(R3),4(R4) ;LOW 16 BITS OF ADDRESSI .IFF( MOV #BASE,4(R4) ;LOW 16 BITS OF ADDRESS .ENDC  CLR 6(R4) ;NO EXTENSION BITS .ENDC3 CALL WRDYIC ;RELEASE PORT AND WAIT FOR RDYI CLEARR BCS 40$ ;IF CS, TROUBLE* MOVB #CNTLI,(R4) ;CONTROL IN REQUEST TYPE CALL WRDYIS ;WAIT FOR RDYI SET BCS 40$ ;IF CS, TROUBLEL0 MOV U.CW3(R5),-(SP) ;STRIP MODE BITS FROM U.CW3 BIC #^C,(SP)R MOV (SP)+,6(R4) ;SET DMC MODE ;FALL THRU TO WRDYIC;E&; RELEASE PORT AND WAIT FOR RDYI CLEAR;B*WRDYIC: BIC #RELEAS,(R4) ;RELEASE THE PORT MOV #C.WAIT,R2 ;LOOP COUNTB'10$: BIT #RDYI,(R4) ;IS RDYI STILL SET?N BEQ 40$ ;IF EQ, NO SOB R2,10$ # BR 30$ ;RDYI NOT CLEARED PROPERLYY;L; WAIT FOR RDYI SETS;R"WRDYIS: MOV #S.WAIT,R2 ;LOOP COUNT!20$: BIT #RDYI,(R4) ;IS RDYI SET?  BNE 40$ ;IF NE, YES SOB R2,20$L!30$: SEC ;RDYI NOT SET PROPERLYE 40$: RETURNC .DSABL LSB. > .SBTTL DO 22 BIT MAPPINGE;+/; **-MAP22-DO 22 BIT MAPPING AND LOAD DATA PORTT;D ; INPUTS:D; R0=UMR ADDRESS; R2,R3=22 BIT PHYSICAL ADDRESS ; R4=CSR ADDRESS; ; OUTPUTS:; R0,R2,R3=DESTROYED"; UMR LOADED WITH PHYSICAL ADDRESS*; DATA PORT LOADED WITH 18 BIT UMR ADDRESS;- .IF DF X$$22 &MAP22: MOV R3,(R0) ;COPY R2,R3 TO UMR- BIC #1,(R0)+ ;FIRST WORD OF UMR MUST BE EVENS MOV R2,(R0)+ * SUB #FIRSTU+4,R0 ;UMR# IS NOW IN BITS 6-2 SWAB R0 ASL R0( CLR R2 ;FORM AN 18 BIT NUMBER IN R2,R0- ASL R0 ;WITH BITS 17-13 CONTAINING THE UMR#M ROL R2D ASL R0A ROL R2D ROR R3 ;ODD/EVEN BIT TO CARRY & ADC R0 ;AND THEN TO BIT 0 OF ADDRESS2 MOV R0,4(R4) ;LOW 16 BITS OF ADDRESS TO DATA PORT ASL R2 ;MAKE A WORD INDEXS9 MOV AXTAB(R2),6(R4) ;ADDRESS EXTENSION BITS TO DATA PORT  RETURN .ENDC , .SBTTL PROCESS RDYI INTERRUPT;); PROCESS RDYI INTERRUPT;EC$XMINP::INTSV$ XM,PR5,X$$M11,,CNTBL ;;;GENERATE INTERRUPT SAVE CODEA0 JSR R0,XMSET ;;;DO INTERRUPT SETUP AND TRANSFER .WORD SEL0 ;;;CSR INDEX $ .WORD XMTRDY ;;;TRANSFER ADDRESSES .WORD BAD .WORD BAD .WORD FPERR .WORD RCVRDY .WORD BAD .WORD BAD .WORD BAD;; DMC READY FOR TRANSMIT BUFFERR; 4XMTRDY: MOV U.XQ(R5),R0 ;;;TRANSMIT LISTHEAD ADDRESS$ JSR R1,RDYINT ;;;GIVE BUFFER TO DMC;A; DMC READY FOR RECEIVE BUFFER;B3RCVRDY: MOV U.RQ(R5),R0 ;;;RECEIVE LISTHEAD ADDRESSR$ JSR R1,RDYINT ;;;GIVE BUFFER TO DMC;N; FORCE PROCEDURE ERROR ;E5FPERR: BIC #RELEAS,(R4) ;;;CLEAR RQI WHICH WILL CAUSER BR XMINTX ;;;CNTLO INTERRUPT D3 .SBTTL PROCESS COMPLETION OR CONTROL OUT INTERRUPTD;O; PROCESS COMPLETION INTERRUPT;DC$XMOUT::INTSV$ XM,PR5,X$$M11,,CNTBL ;;;GENERATE INTERRUPT SAVE CODEM0 JSR R0,XMSET ;;;DO INTERRUPT SETUP AND TRANSFER .WORD SEL2 ;;;CSR INDEXF$ .WORD XMTCOM ;;;TRANSFER ADDRESSES .WORD CNTLO .WORD BAD .WORD BAD .WORD RCVCOMH .WORD CNTLO .WORD BAD .WORD BAD;E; TRANSMIT BUFFER COMPLETE; 4XMTCOM: MOV U.XQ(R5),R0 ;;;TRANSMIT LISTHEAD ADDRESS) JSR R1,BUFCOM ;;;PROCESS 00tTADATADATADATADATADATADATADATADATABUFFER COMPLETET;D; RECEIVE BUFFER COMPLETEN; 3RCVCOM: MOV U.RQ(R5),R0 ;;;RECEIVE LISTHEAD ADDRESST) JSR R1,BUFCOM ;;;PROCESS BUFFER COMPLETEN; ; CONTROL OUTE;P)CNTLO: MOV 4(R4),R0 ;;;COPY SEL6 CONTENTS # BIC #RDYO,(R4) ;;;RELEASE THE PORTS( BIS R0,U.ERR(R5) ;;;UPDATE ERROR STATUS& BIT #FATAL,R0 ;;;IS IT A FATAL ERROR? BEQ 20$ ;;;IF EQ, NO/ BIT #BUG,R0 ;;;IS IT DISCONNECT ERROR PART 2?B BEQ 10$ ;;;IF EQ, NO MOV U.SCB(R5),R4 ;;;SCB ADDRESS; MOVB #2,S.CTM(R4) ;;;SET TIMER FOR BETWEEN 1 AND 2 SECONDS ) ;;;NOTE-ONLY 1 SECOND DELAY IS NEEDED.+ BR XMFRK ;;;CAN'T MASTER CLEAR UNTIL THENR*10$: BIS #MC,-(R4) ;;;MASTER CLEAR THE DMC BR XMFRK ;;;START FORK PROCESS.20$: BIT #DISCON,R0 ;;;IS IT DISCONNECT ERROR? BEQ XMINTX ;;;IF EQ, NOU. MOVB #PERR!IEI,-2(R4);;;CAUSE PROCEDURE ERROR ;;;FALL THRU TO XMINTX; ; EXIT FROM INTERRUPT ;DBAD:"XMINTX: MOV (SP)+,R0 ;;;RESTORE R0# JMP $INTXT ;;;EXIT FROM INTERRUPTA E1 .SBTTL SETUP FOR INTERRUPT ROUTINES AND TRANSFERN;+4; **-XMSET-SETUP FOR INTERRUPT ROUTINES AND TRANSFER;M ; INPUTS:'; R0=CALLING REGISTERE; INTSV$ HAS BEEN DONE;;; CALLING SEQUENCE:C; JSR R0,XMSET&; .WORD ;;;CSR INDEX (EITHER 0 OR 2)); .BLKW 8. ;;;TRANSFER ADDRESSES BY TYPEI; ; OUTPUTS: (IF VALID INTERRUPT)2; R4=CSR ADDRESS; R5=UCB ADDRESS; (SP)=SAVED R0N;*; ALTERNATE RETURN: (IF INVALID INTERRUPT); RETURN TO $INTXT;-0XMSET: TST R5 ;;;HAS UCB BEEN ENTERED IN TABLE? BEQ XMINTX ;;;IF EQ, NOO( BIT #U2.ONL,U.CW2(R5);;;IS DMC ON-LINE? BEQ XMINTX ;;;IF EQ, NON MOV U.SCB(R5),R4 ;;;SCB ADDRESS MOV S.CSR(R4),R4 ;;;CSR ADDRESS ADD (R0)+,R4 ;;;PLUS CSR INDEX1 MOV (R4),-(SP) ;;;STRIP EVERYTHING BUT TYPE BITS  BIC #^C,(SP)A ASL (SP) ;;;MAKE A WORD INDEXU. ADD (SP)+,R0 ;;;ADD TO TRANSFER TABLE ADDRESS JMP @(R0)+ ;;;AND GO!S D .SBTTL RDYI INTERRUPT ROUTINES ;+; **-RDYINT-GIVE BUFFER TO DMC;- ; INPUTS:T+; R0=SENT Q LISTHEAD ADDRESS (U.XQ OR U.RQ)X; R1=CALLING REGISTERB; R4=CSR ADDRESS; R5=UCB ADDRESS; 2(SP)=INTERRUPT SAVED R0;; CALLING SEQUENCE:S; JSR R1,RDYINTS;R ; OUTPUTS:$; DMC GIVEN BUFFER ADDRESS AND COUNT; DMC PORT RELEASEDP5; ATTEMPT MADE TO SETUP ANOTHER BUFFER OF EITHER TYPEP; INTERRUPT EXITED;-"RDYINT: MOV R2,-(SP) ;;;SAVE R2,R3 MOV R3,-(SP) ;;;D- CMP (R0)+,(R0)+ ;;;ADVANCE TO WAIT Q ADDRESSI0 CALL $QRMVF ;;;REMOVE FIRST PACKET FROM WAIT Q! ;;;NOTE-$QRMVF DESTROYS R2,R3 , BCS 20$ ;;;NO PACKET ON QUEUE IF CARRY SET+ CMP -(R0),-(R0) ;;;RESET TO SENT Q ADDRESSE! CALL GIVE ;;;GIVE BUFFER TO DMC* CALL ITRY ;;;TRY TO SETUP ANOTHER BUFFER%10$: MOV (SP)+,R3 ;;;RESTORE R1,R2,R3A MOV (SP)+,R2 ;;;T MOV (SP)+,R1 ;;;P" BR XMINTX ;;;EXIT FROM INTERRUPT220$: BIS #UNXINT,U.ERR(R5) ;;;FLAG ERROR CONDITION! BR 10$ ;EXIT AFTER POPING STACK; C% .SBTTL COMPLETION INTERRUPT ROUTINESR;+#; **-BUFCOM-PROCESS BUFFER COMPLETEF; ; INPUTS: +; R0=SENT Q LISTHEAD ADDRESS (U.XQ OR U.RQ)N; R1=CALLING REGISTERR; R4=CSR ADDRESS+2; R5=UCB ADDRESS; 2(SP)=INTERRUPT SAVED R0;G; CALLING SEQUENCE:C; JSR R1,BUFCOMT;E ; OUTPUTS:1; CHARACTER COUNT STORED IN X.PRM+4 OF I/O PACKETV*; PACKET MOVED FROM SENT Q TO COMPLETION Q; DMC PORT RELEASEDR5; ATTEMPT MADE TO SETUP ANOTHER BUFFER OF EITHER TYPEN*; FORK PROCESS STARTED IF IT'S NOT RUNNING; INTERRUPT EXITED;-"BUFCOM: MOV R2,-(SP) ;;;SAVE R2,R3 MOV R3,-(SP) ;;;T' DECB COUNT(R0) ;;;DECREMENT SENT COUNTA* CALL $QRMVF ;;;REMOVE PACKET FROM SENT Q! ;;;NOTE-$QRMVF DESTROYS R2,R3D0 MOV 4(R4),X.PRM+4(R1);;;PUT COUNT IN I/O PACKET .IF DF M$$MGE8 BIC #140000,X.PRM+4(R1) ;;;CLEAR ADDRESS EXTENSION BITS .ENDC# BIC #RDYO,(R4) ;;;RELEASE THE PORTT4 MOV U.XQ(R5),R0 ;;;TRANSMIT SENT Q LISTHEAD ADDRESS1 CMP -(R0),-(R0) ;;;COMPLETION Q LISTHEAD ADDRESSE. CALL $QINSF ;;;INSERT PACKET ON COMPLETION Q ;;;NOTE-$QINSF DESTROYS R2 TST -(R4) ;;;SEL0 ADDRESST* CALL ITRY ;;;TRY TO SETUP ANOTHER BUFFER! MOV (SP)+,R3 ;;;RESTORE R1,R2,R3  MOV (SP)+,R2 ;;;- MOV (SP00} D%B11110010)+,R1 ;;;R ;;;FALL THRU TO XMFRK; T .SBTTL FORK PROCESSING.; (; START FORK PROCESS IF IT'S NOT RUNNING;R7XMFRK: BIT #U3.FRK,U.CW3(R5);;;IS FORK PROCESS RUNNING?T BNE XMINTX ;;;IF NE, YES MOV (SP)+,R0 ;;;RESTORE R0D6 BIS #U3.FRK,U.CW3(R5);;;INDICATE FORK PROCESS RUNNING% CALL $FORK ;;;CREATE SYSTEM PROCESSP;I; FORK LEVEL PROCESSINGD;R2 MOV U.XQ(R5),R0 ;TRANSMIT SENT Q LISTHEAD ADDRESS/ CMP -(R0),-(R0) ;COMPLETION Q LISTHEAD ADDRESSS"10$: MOV U.SCB(R5),R4 ;SCB ADDRESS# MTPS S.PRI(R4) ;DISABLE INTERRUPTST6 CALL $QRMVF ;;;REMOVE FIRST PACKET FROM COMPLETION Q BCS 20$ ;;;IF CS, Q WAS EMPTYR! MTPS #0 ;;;RE-ENABLE INTERRUPTS " MOV #IS.SUC&377,R2 ;STATUS WORD 1/ MOV X.PRM+4(R1),R4 ;STATUS WORD 2 = BYTE COUNTS! CALL RAP ;RETURN THE I/O PACKETP BR 10$ ;AND TRY AGAINR420$: BIC #U3.FRK,U.CW3(R5);;;NO MORE FORK PROCESSING! MTPS #0 ;;;RE-ENABLE INTERRUPTST0 BIT #FATAL,U.ERR(R5) ;HAS FATAL ERROR OCCURRED? BEQ EXIT ;IF EQ, NOS' BIT #LOST,U.ERR(R5) ;WAS IT LOST DATA?  BEQ 30$ ;IF EQ, NO1 MOV U.RQ(R5),R0 ;RECEIVE SENT Q LISTHEAD ADDRESS 2 MOV #IE.DAO&377,R2 ;RETURN FIRST PACKET ON SENT Q( CALL DQRAP0 ;WITH A STATUS OF "IE.DAO"$30$: MOV #U3.ERR,R0 ;FATAL ERROR BIT0 MOV #IE.CNR&377,R2 ;ASSUME DDCMP START RECEIVED3 BIT #START,U.ERR(R5) ;WAS IT DDCMP START RECEIVED?: BNE RQP ;IF NE, YES;' BIT #TIMOUT,U.ERR(R5);WAS IT TIME-OUT?- BEQ RQPABO ;IF EQ, NO#' MOV #IE.TMO&377,R2 ;TIMEOUT ERROR CODE? BR RQP ;RETURN ALL PACKETS # .SBTTL TIMEOUTA;+; **-XMTMO-TIMEOUT ENTRY POINT;M ; INPUTS:,; R3=CONTROLLER INDEX (S.CON)R; R4=SCB ADDRESS; R5=UCB ADDRESS; ; OUTPUTS:.; DISCONNECT ERROR RECOVERY IS COMPLETED (QIO);-XMOUT:, BIS #MC,@S.CSR(R4) ;MASTER CLEAR THE DEVICE% CALLR XMINIT ;TIMER BLOCKED PACKETS, R .SBTTL CANCEL I/O AND POWERFAIL;+"; **-XMCANC-CANCEL I/O ENTRY POINT*; **-XMPWRF-POWERFAIL RECOVERY ENTRY POINT;, ; INPUTS:#; R0=A(I/O PACKET) CANCEL ONLY; R1=TCB ADDRESS (CANCEL ONLY); R3=CONTROLLER INDEX (S.CON) ; R4=SCB ADDRESS; R5=UCB ADDRESS;U ; OUTPUTS:; DEVICE IS KILLED;-XMPWF:0 MTPS #PR7 ;;; DISABLE INTERUPTS FROM THE WORLD. MOV #U3.PWF,R0 ;;;INDICATE POWERFAIL OCCURRED BR KILL ;;;CXMCAN:+ MOV #U3.KIL,R0 ;INDICATE I/O KILL WAS DONEI/ ; NOTE THAT INTERRUPTS ARE NOT DISABLED FORP ; THE NEXT FOUR INSTRUCTIONS ;FALL THRU TO KILL - .SBTTL KILL THE DMC;+; **-KILL-KILL THE DEVICEI!; **-RQP,RQPABO-ALTERNATE ENTRIESD;S ; INPUTS:L; R0=KILL REASON; R4=SCB ADDRESS; R5=UCB ADDRESS;5 ; OUTPUTS:; R0,R1,R2,R3,R4=DESTROYED; DMC MASTER CLEARED IF ON-LINE7; U2.ONL BIT CLEARED;; ALL PACKETS DEQUEUED AND RETURNED WITH STATUS OF "IE.ABO"R;-5KILL: BIT #U2.ONL,U.CW2(R5) ;;;IS THE DEVICE ON-LINE?  BNE 1$ ;;; IF NE THEN YESA" MTPS #0 ; ALLOW INTERRUPTS AGAIN BR EXIT ;IF EQ, NO11$: BIS #MC,@S.CSR(R4) ;;;MASTER CLEAR THE DEVICEI MTPS #0 ; ALL INTERRUPTS AGAIN3RQPABO: MOV #IE.ABO&377,R2 ;STATUS WORD 2 FOR LATER 'RQP: BIS R0,U.CW3(R5) ;SAVE KILL REASONE, BIC #U2.ONL,U.CW2(R5) ;IT'S NOT ON-LINE NOW .IF DF R$$MPL!V$$RSN&Q$$22C CALL DEUMR ;DE-ASSIGN UMR'ST .ENDC2 MOV U.XQ(R5),R0 ;TRANSMIT SENT Q LISTHEAD ADDRESS' CALL 10$ ;RETURN ALL TRANSMIT PACKETS;1 MOV U.RQ(R5),R0 ;RECEIVE SENT Q LISTHEAD ADDRESSE710$: CALL (PC) ;DO THE FOLLOWING FOR SENT Q AND WAIT Q 020$: CALL DQRAP0 ;DEQUEUE AND RETURN ONE PACKET! BCC 20$ ;IF CC, Q WAS NOT EMPTYA* CMP (R0)+,(R0)+ ;ADVANCE TO NEXT LISTHEAD EXIT: RETURN;:; QUEUE AN AST TO THE CCPL;A E) .SBTTL DEQUEUE AND RETURN ONE I/O PACKETN;+3; **-DQRAP/DQRAP0-DEQUEUE AND RETURN ONE I/O PACKETG/; **-RAP-RETURN AN ALREADY DE-QUEUED I/O PACKETS; ; INPUTS:A; R0=LISTHEAD ADDRESSU; R2=I/O STATUS WORD 1; R4=I/O STATUS WORD 2; ; OUTPUTS:; R1,R3,R4=DESTROYED-; CARRY CLEAR=PACKET DEQUEUED AND RETURNED OK ; CARRY SET=QUEUE WAS EMPTYA;- .ENABL LSBT,DQRAP0: CLR R4 ;ENTRY FOR STATUS WORD 2 = 0'DQRAP: MOV R2,-(SP) ;SAVE STATUS WORD 1E$ CALL $QRMVF ;DEQUEUE AN I/O PACKET ;NOTE-00tTADATADATADATADATADATADATADATADATA$QRMVF DESTROYS R2,R3N BCC 5$ ;IF CC, Q WAS NOT EMPTY BR 10$ ;RETURN WITH CARRY SETO%RAP: MOV R2,-(SP) ;SAVE STATUS WORD 1-5$:D$ MOV R0,-(SP) ;SAVE LISTHEAD ADDRESS MOV R1,R3 ;PACKET ADDRESS  MOV 2(SP),R0 ;STATUS WORD 1 MOV R4,R1 ;STATUS WORD 2" MOV U.SCB(R5),R4 ;GET SCB ADDRESS$ DECB S.STS(R4) ;DECR ACTIVITY COUNT$ CALL $IOFIN ;FINISH THE I/O PACKET ;NOTE-$IOFIN SAVES ONLY R5 CLC ;INDICATE SUCCESS' MOV (SP)+,R0 ;RESTORE LISTHEAD ADDRESS (10$: MOV (SP)+,R2 ;RESTORE STATUS WORD 1 RETURN2 .DSABL LSB; C .SBTTL DE-ASSIGN UMR'S0;+/; **-DEUMR-DEASSIGN UMR'S (FOR QIO DRIVER ONLY)T;W ; INPUTS:D; R5=UCB ADDRESS;V ; OUTPUTS:; R0,R3=DESTROYED ; R4=SCB ADDRESS; S.MPR+2(R4)=CLEAREDO;- .IF DF R$$MPL!V$$RSN&Q$$22MDEUMR: MOV R2,-(SP) ;SAVE R2 MOV R1,-(SP) ;AND R1 " MOV U.SCB(R5),R4 ;GET SCB ADDRESS .IF NDF R$$MPL* MOV S.MPR+2(R4),R2 ;GET UMR BLOCK ADDRESS .IFFS+ MOV S.KRB(R4),R2 ; MOV KRB ADDRESS INTO R2S( ADD K.OFF(R2),R2 ;POINT TO UMR AREA + 2+ SUB #M.LGTH,R2 ;POINT TO START OF UMR AREAA TST (R2) ;IS UMR ASSIGNED ?D .ENDC$ BEQ 10$ ;IF EQ, NO UMR BLOCK (!!!) .IF NDF R$$MPLA" CLR S.MPR+2(R4) ;ZERO THE POINTER .IFF CLR (R2) ;ZERO THE POINTER# MOV 2(R2),R2 ;R2=UMR BLOCK ADDRESSS .ENDC# MOV R2,R0 ;COPY UMR BLOCK ADDRESSV CALL $DEUMR ;DE-ASSIGN UMR'S' MOV #M.LGTH,R1 ;SETUP UMR BLOCK LENGTH$ CALL $DEACB ;DE-ALLOCATE UMR BLOCK10$: MOV (SP)+,R1 ;RESTORE R1  MOV (SP)+,R2 ;AND R2R RETURNK .ENDC P8 .SBTTL TRY TO SETUP ANOTHER BUFFER FROM INTERRUPT LEVEL;+:; **-ITRY-TRY TO SETUP ANOTHER BUFFER FROM INTERRUPT LEVEL;O ; INPUTS:(; R4=CSR ADDRESS; R5=UCB ADDRESS;) ; OUTPUTS:; R0=DESTROYED>; REQUEST TYPE!IEI LEFT IN SEL0 IF EITHER WAIT Q WAS NOT EMPTY&; RECEIVE REQUESTS ARE ATTEMPTED FIRST;-+ITRY: MOV U.RQ(R5),R0 ;;;TRY RECEIVES FIRST.& CALL IPORT ;;;IS THE PORT AVAILABLE?( BCC 10$ ;;;IF CC, YES (PORT IS LOADED)& MOV U.XQ(R5),R0 ;;;THEN TRY TRANSMITS& CALL IPORT ;;;IS THE PORT AVAILABLE? BCS 20$ ;;;IF CS, NO'10$: BIS #IEI,(R4) ;;;SET INTERRUPT BITR BIS #IEI,(R4) ;;;TWICE 20$: RETURN ;;;L;+; **-PORT-REQUEST THE DATA PORT55; **-IPORT-REQUEST THE DATA PORT FROM INTERRUPT LEVEL ;E ; INPUTS:N+; R0=SENT Q LISTHEAD ADDRESS (U.XQ OR U.RQ)V; R4=CSR ADDRESS;T ; OUTPUTS IF PORT WAS AVAILABLE: ; CARRY CLEARE; REQUEST TYPE LEFT IN SEL0T;P$; OUTPUTS IF PORT WAS NOT AVAILABLE: ; CARRY SETA;- .ENABL LSB,%IPORT: TST 4(R0) ;;;IS WAIT Q EMPTY?;' BEQ 10$ ;;;IF EQ, YES - NOTHING TO DOS4PORT: CMPB #MAXBUF,COUNT(R0) ;;;CAN DMC ACCEPT MORE?+ BEQ 10$ ;;;IF EQ, NO - NO ACTION POSSIBLE ;;;NOTE-CARRY IS NOW CLEAR. BIT #RDYI!RQI,(R4) ;;;IS PORT ALREADY IN USE?, BNE 10$ ;;;IF NE, YES - NO ACTION POSSIBLE1 MOVB IOTYPE(R0),(R4) ;;;SET REQUEST TYPE AND RQIU BR 20$ ;;;%10$: SEC ;;;INDICATE UNAVAILABILITYS20$: RETURN ;;;T .DSABL LSB  .IF DF R$$MPL;A;:; ; CONTORLER ONLINE ENTRY POINT:;R;T;4=; THE OLRSR ROUTINE WILL ENTER THIS DRIVER AT THE XMKRB LABLEO:; TO BRING THE DEVICE ONLINE OR OFFLINE. IF THE DEVICE IS<; COMMING ONLINE, THE UNIT IS MASTER CLEARED AND THE RUN BIT?; IS CLEARED. THE RUN BIT IS THEN TESTED. IF IT IS STILL SET,BA; THE BS1 SWITCH IS TURNED ON WHICH MAKES IT IMPOSSIBLE TO DIABLE;?; THE UNIT. THIS CONDITION IS NOT ALLOWED IN M+ AND THE ONLINEU@; COMMAND WILL FAIL. IF THE DEVICE IS COMMING OFFLINE, A MASTER9; CLEAR IS ISSUED AND THE RUN BIT IS CLEARED. NO TEST IS4 ; NECESSARY.;T; ;L ; INPUTS: ;V; R2 = KRB ADDRESSO; R3 = CTB ADDRESSC0; CARRY BIT CLEARED IF DEVICE IS TO COME ONLINE-; CARRY BIT SET IF DEVICE IS TO COME OFFLINEB;;S;EXMKRB:+ MOV #MC,@K.CSR(R2) ; MASTER CLEAR THE UNITT( BIC #RUN,@K.CSR(R2) ; CLEAR THE RUN BIT2 BCS 1$ ; IF DEVICE IS COMMING OFFLINE THE RETURN> BIT #RUN,@K.CSR(R2) ; ELSE TEST IF RUN BIT IS REALLY CLEARED.! BEQ 1$ ; IF YES THE ALL IS WELL A MOVB #IE.DNR&377,$SCERR ; ELSE THE RUN BIT BEING LOCKED ON MEANS4+ ; THAT THE BS1 SWITCH IS ON WHICH MEANS ) 00 D%B11110010 ; THE THAT A DOWNLINE LOAD CAN NOT BE + ; AVOIDED. WE DO NOT WANT THIS IN THISE ; THIS IN THE SYSTEM.E1$: RETURN ; GO BACK;S;E;M#; UNIT ONLINE - OFFLINE ENTRY POINTE;T;U;T=; WHEN THE UNIT IS BROUGHT ONLINE THE OLRSR ROUTINE CALLS THEE?; DRIVER AT THIS POINT WITH THE CARRY BIT CLEAR AND FOR OFFLINEI:; WITH THE CARRY BIT SET. WHEN COMMING ONLINE THE UNIT IS=; SET UP USING THE DRIVER ROUTINE "SETDMC". WHEN THE UNIT ISOA; OFFLINE A MASTER CLEAR IS ISSUED AND THE RUN BIT IS TURNED OFF.H;A;W ; INPUTS:C;N;B; R3 = CONTROLLER INDEX ; R4 = SCB ADDRESS; R5 = UCB ADDRESS;Y;M ; OUTPUTS:; ;G; NONE;;XMUCB:" BCC 3$ ; IF CC, THIS ONL REQUEST1$:" MOV S.KRB(R4),R2 ; R2=KRB ADDRESS+ MOV #MC,@K.CSR(R2) ; MASTER CLEAR THE UNITH( BIC #RUN,@K.CSR(R2) ; CLEAR THE RUN BIT3$: RETURN ; GO BACK .ENDC .ENDEN COMMING ONLINE THE UNIT IS=; SET UP USING THE DRIVER ROUTINE "SETDMC". WHEN THE UNIT ISOA; OFFLINE A MASTER CLEAR IS ISSUED AND THE RUN BIT IS TU .TITLE XWDRV .IDENT /02/ ;; COPYRIGHT (C) 1976, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; VERSION 02;; SCOTT G. DAVIS 21-JUL-76;; DUE ALMOST ENTIRELY TO XUDRV;; MODIFIED BY:;; R. E. CALDWELL 26-JUL-79;3; RC003 -- REMOVE UNNEEDED CONDITIONALS FOR M-PLUS#; AND USE DDT$ AND GTPKT$ MACROS.;); DUP11 SYNCHRONOUS COMMUNICATIONS DRIVER;D; MACRO LIBRARY CALLSY;H .MCALL PKTDF$,HWDDF$A$ PKTDF$ ;DEFINE I/O PACKET OFFSETS$ HWDDF$ ;DEFINE HARDWARE REGISTERS .MCALL UCBDF$,CUCDF$O UCBDF$ ; DEFINE UCB OFFSETS$ CUCDF$ ;COMMUNICATIONS UCB LABELS;; EQUATED SYMBOLS ;T;D; RXCSR BIT ASSIGNMENTS ;O!DTSTCH= 100000 ;DATA SET CHANGEB"RING= 40000 ;RING LINE ASSERTEDCTS= 20000 ;CLEAR TO SENDCRRIER= 10000 ;CARRIER STATEN!RECACT= 4000 ;RECEIVER ACTIVEDSRDY= 1000 ;DATA SET READYSSTRSYN= 400 ;STRIP SYNCRXDONE= 200 ;RECEIVER DONEF+RCVENB= 100 ;RECEIVER INTERRUPT ENABLED2DSINTE= 40 ;DATA SET CHANGE INTERRUPT ENABLE&SCHSYN= 20 ;SEARCH SYNC MODE BITRTS= 4 ;REQUEST TO SEND%TRMRDY= 2 ;DATA TERMINAL READYD;X; RXDBUF BIT ASSIGNMENTS;T(RXERR= 100000 ;RECEIVER ERROR "OR" BIT/OVRNER= 40000 ;RECEIVER OVERRUN ERROR IF SET ;; PARCSR INITIALIZATION VALUES;E(DECMOD= 100000 ;SET DDCMP/BISYNCH MODE&CRCINH=1000 ;INHIBIT CRC CALCULATION4INITMD=DECMOD!CRCINH ;PARAMETER INITIALIZATION BITS;1'TSOM=400 ;TRANSFER - START OF MESSAGE ; ;A; TXCSR BIT ASSIGNMENTSN;E5DNAINT= 100000 ;SET ON DATA NOT AVAILABLE INTERRUPTR%MSTRST= 400 ;MASTER DEVICE RESETT&TXDONE= 200 ;TRANSMITTER DONE BIT2TXINTE= 100 ;TRANSMITTER INTERRUPT ENABLE BIT4DNAEN= 40 ;ENABLE DATA NOT AVAILABLE INTERRUPT+SEND= 20 ;TRANSMITTER ENABLE (GO) BITE"HDPX= 10 ;HALF DUPLEX IF SET;I; DRIVER DISPATCH TABLEL;A DDT$ XW,D$$W11,P .PAGE;+G;**- XWINI - DUP-11 SYNCHRONOUS COMMUNICATION CONTROLLER I/O INITIATOR ;S?; XWINI IS ENTERED WHEN AN I/O REQUEST IS QUEUED ON THE DEVICE,A4; AND AT THE END OF EACH QIO REQUEST WHICH OBEYS THE;; NORMAL RSX-11M INPUT/OUTPUT LOGIC FLOW. IF THE DEVICE ISR8; AVAILABLE AND A REQUEST IS IN THE QUEUE FOR THAT UNIT,; THE REQUEST IS INITIATED.E0; IF NO REQUEST EXISTS FOR THAT UNIT OR IF IT IS>; BUSY, AN EXIT IS TAKEN TO THE CALLER. NOTE THAT BECAUSE OF=; THE NATURE OF THE DUP-11, EACH UNIT IS A CONTROLLER ITSELF, /; HAS ITS OWN SCB, AND THEREFORE ITS OWN QUEUE. 9; EACH TIME XWINI IS CALLED, IT IS CALLED TO SERVICE ONLYU!; THE UNIT SPECIFIED IN THE CALL.E;O ; INPUTS:R;E#; R4 = STATUS CONTROL BLOCK ADDRESSI*; R5 = ADDRESS OF THE UCB TO BE INITIATED.;V ; OUTPUTS:;E,; IF A REQUEST IS SUCCESSFULLY DEQUEUED, THE$; DEVICE IS INITIATED APPROPRIATELY.;- R .ENABL LSB  I9XWINI: TSTB U.CW2(R5) ;UNSOLICITED (HDPX) 00tTADATADATADATADATADATADATADATADATARECEIVE ACTIVE?A BPL 10$ ;IF NOT, PROCEED% JMP 180$ ;ACTIVATE NO NEW OPERATIONF710$: GTPKT$ XW,D$$W11,,,T ;GET AN I/O PACKET TO PROCESSH;M1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT: ; ); R1 = ADDRESS OF THE I/O REQUEST PACKET.R/; R2 = PHYSICAL UNIT NUMBER OF THE REQUEST UCB.=; R3 = CONTROLLER INDEX +; R4 = ADDRESS OF THE STATUS CONTROL BLOCK.T*; R5 = ADDRESS OF THE UCB SPECIFIED IN THE; XWINI CALL. .;-!; DUP11 I/O REQUEST PACKET FORMATT; ; WORD CONTENTD;D; 0 I/O QUEUE THREAD WORD$); 1 REQUEST PRIORITY, EVENT FLAG NUMBER .; 2 ADDRESS OF THE TCB OF THE REQUESTER TASK/; 3 POINTER TO SECOND LUN WORD IN TASK HEADERR&; 4 CONTENTS OF FIRST LUN WORD (UCB); 5 I/O FUNCTION CODEE); 6 VIRTUAL ADDRESS OF I/O STATUS BLOCK ); 7 RELOCATION BIAS OF I/O STATUS BLOCKE=; 10 I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT +140000)S,; 11 VIRTUAL ADDRESS OF AST SERVICE ROUTINE#; 12 RELOCATION BIAS OF I/O BUFFERT!; 13 BUFFER ADDRESS FOR TRANSFER"; 14 TOTAL BYTE COUNT TO TRANSFER5; 15 BYTE COUNT FOR SECOND PART OF TRANSMISSION OR 0 ; 16 NOT USED; 17 NOT USED; 20 NOT USED;S/20$: MOV S.CSR(R4),R2 ;GET RECEIVER CSR ADDRESSI, ADD #I.FCN+1,R1 ;POINT TO I/O FUNCTION CODE3 CMPB #IO.INL/256.,(R1) ;CHECK IF TRANSFER FUNCTIONO& BLOS 70$ ;BRANCH ON CONTROL FUNCTION8 BIT #U2.ONL,U.CW2(R5) ;IS DEVICE ON LINE (INITIALIZED?) BEQ 90$ ;CAN'T TRANSFER IF NOT$ BIT #DSRDY,(R2) ;IS DATA SET READY?! BEQ 90$ ;IF NOT, CAN'T TRANSFERR& CMPB #IO.RLB/256.,(R1) ;READ LOGICAL?$ BEQ 40$ ;YES, SERVICE READ REQUEST;O/; FALL THROUGH HERE ON TRANSMIT (WRITE LOGICAL)S;& BIS #RTS,(R2) ;ASSERT REQUEST TO SEND( MOVB U.SYNC(R5),R0 ;LOAD SYNC CHARACTER3 MOVB S.ITM(R4),S.CTM(R4) ;INITIALIZE TIMEOUT COUNT.. MOVB U.NSYN(R5),R3 ;NUMBER OF SYNCS IN LEADER/30$: MOVB R3,U.NSYC(R5) ;LOAD SYNC LEADER COUNT)" ADD #4,R2 ;POINT TO TRANSMIT CSR% BIS #SEND,(R2)+ ;ENABLE TRANSMISSION#;D; ***** NOTE *****;D:; SINCE TSOM IS SET THROUGHOUT THE TRANSMISSION, DATA LATE ; ERRORS WILL NEVER BE DETECTED.;E; ***** *****; BIC #177400,R0 ;CLEAR HIGH BYTE BIS #TSOM,R0 ;SET TSOMB MOV R0,(R2) ;SEND CHAR+TSOM # TST -(R2) ;CLEAR DATA LATE ERRORSC* BIS #DNAEN!TXINTE,(R2) ;ENABLE INTERRUPTS: BR 180$ ;RETURN - INTERRUPT CODE PROPAGATES TRANSMISSION;R; RECEIVE FUNCTION INITIATION ;C40$: ;REFERENCE LABEL# MOV R5,R0 ;SET UP TRANSFER VECTOR22 ADD #U.RBUF,R0 ;RECEIVE TRANSFER INFORMATION HERE# MOV U.BUF(R5),(R0)+ ;TRANSFER BIAST" MOV U.BUF+2(R5),(R0)+ ;AND OFFSET MOV U.CNT(R5),(R0) ;AND COUNT$ BIC #SCHSYN,(R2) ;FORCE RE-SYNCHING* TSTB 2(R2) ; ENSURE RECEIVE BUFFER CLEAR1 BIS #STRSYN!RCVENB!SCHSYN,(R2) ; ENABLE RECEIVERE5 BR 180$ ;RETURN - INTERRUPT CODE PROPAGATES RECEIVEB;$@; CONTROL FUNCTION INITIATION (INITIATE OR TERMINATE CONTROLLER,; OR CHANGE OPERATING MODE);:170$: BNE 110$ ;IF NOT EQUAL, MODE CHANGE REQUESTC CMP (R2)+,(R2)+ ;POINT TO TXCSR BIS #MSTRST,(R2) ;RESET DEVICEF TSTB -(R1) ;START FUNCTION?V" BNE 100$ ;IF NON-ZERO, TERMINATE;C; DO START FUNCTION INITIATION;N, TST U.CW2(R5) ;DEVICE TO BE IN HALF DUPLEX? BPL 80$ ;NO, IF PLUS( BIS #HDPX,(R2) ;PUT IN HALF DUPLEX MODE-80$: MOV #INITMD,R0 ;GET WORD SIZE, SYNC MODEO) BISB U.SYNC(R5),R0 ;OR IN SYNC CHARACTERI+ MOV R0,-(R2) ;INITIALIZE DEVICE PARAMETERS; BIS #STRSYN!TRMRDY!SCHSYN,-(R2) ;NOW INITIALIZE CONTROLLERU) BIS #U2.ONL,U.CW2(R5) ;MARK UNIT ON LINE; BR 160$ ;RETURN SUCCESSFUL;R ; CAN'T ESTABLISH COMMUNICATIONS;C@90$: MOV #IE.DNR&377,R0 ;SAY CAN'T INITIALIZE DEVICE (NOT READY) BR 170$ ;DO I/O DONE;); FUNCTION WAS TERMINATE LINE;LE100$: BIC #^C,U.CW2(R5) ;CLEAR OPERATING STATUSN# BR 160$ ;RETURN SUCCESSFUL STATUSB;.$; SERVICE DEVICE MODE CHANGE REQUEST;R6110$: BITB #IO.HDX,-(R1) ;SUBFUNCTION SAY HALF DUPLEX? BEQ 120$ ;IF ZERO, NOA6 BIS #U2.HDX,U.CW2(R5) ;SAY HALF DUPLEX CHARACTERISTIC1120$: BITB #IO.FDX,(R1) ;SET MODE TO FULL DUPLEX?S! BEQ 150$ ;DON'T SET FULL DUPLEXM, BIT00 D%B11110010 #U2.LIN,U.CW2(R5) ;IS LINK FULL DUPLEX?" BEQ 140$ ;IF SO, RUN FULL DUPLEX2130$: MOV #IE.IFC&377,R0 ;MARK AS ILLEGAL FUNCTION BR 170$ ;AND TERMINATE6140$: BIC #U2.HDX,U.CW2(R5) ;PUT IN FULL DUPLEX IN UCB2150$: BITB #IO.SYN,(R1) ;SYNC CHARACTER SPECIFIED? BEQ 160$ ;NO, IF NOT SET9 MOVB I.PRM-I.FCN(R1),U.SYNC(R5) ;MARK NEW SYNC CHARACTERFXWSUCC: ;REFERENCE LABEL22160$: MOV #IS.SUC&377,R0 ;RETURN SUCCESSFUL STATUSXWFIN: ;REFERENCE LABEL-170$: CLRB S.STS(R4) ;CLEAR CONTROLLER STATUSB- BICB #US.BSY,U.STS(R5) ;MARK UNIT IDLE, ALSOQ! MOV R0,-(SP) ;SAVE STATUS WORD 1$- MOV S.PKT(R4),-(SP) ;SAVE OLD PACKET ADDRESS" CALL XWINI ;INITIATE NEXT PACKET% MOV (SP)+,R3 ;GET OLD PACKET ADDRESS 0 MOV I.PRM+4(R3),R1 ;RETURN REQUESTED ITEM COUNT$ MOV (SP)+,R0 ;RESTORE STATUS WORD 1$ CALLR $IOFIN ;TERMINATE OLD PACKET180$: RETURN ;;U; POWER FAIL SERVICE;XWPWF: ;REFERENCE LABEL( CLRB S.CTM(R4) ;DISABLE DEVICE TIMEOUTS3 MOV #IE.DNR&377,R0 ;PUT ERROR CODE IN R0 FOR DWTMOB BR XWOUT ;FINISH I/O ABORT;T; I/O CANCELLATION SERVICE;V ; INPUTS: ; R0=I/O PACKET ADDRESS#; R1=TCB ADDRESS OF TASK TO CANCEL ; R4=SCB ADDRESSK; R5=UCB ADDRESSGXWCAN: ;;;REFERENCE LABEL* CMP R1,I.TCB(R0) ;;;CANCEL FOR THIS TASK? BNE 180$ ;;;JUST RETURN IF NOT4 CMPB #IO.WLB/256.,I.FCN+1(R0) ;;;TRANSMIT FUNCTION?! BEQ 180$ ;;;LET TRANSMIT FINISH% TST U.RCNT(R5) ;;;RECEIVER FINISHED?. BLE 180$ ;;;RETURN IF YESU0 BIC #RCVENB!SCHSYN,@S.CSR(R4) ;DISABLE RECEIVER5 MOV #IE.ABO&377,R0 ;;;PUT ERROR CODE IN R0 FOR XWOUTL' BR XWOUT ;;;FINISH OFF RECEIVE PACKET/;K; TIMEOUT SERVICE ROUTINES;F ; INPUTS:N; &; R0 = DEVICE TIMEOUT STATUS 'IE.DNR'; R3 = CONTROLLER INDEX; R4 = ADDRESS OF SCB; R5 = ADDRESS OF UCB;XWOUT: ;;;REFERENCE LABEL% MOV S.CSR(R4),R4 ;;;GET RECEIVER CSRN4 BIC #TXINTE!SEND!DNAEN,4(R4) ;;;DISABLE TRANSMITTER" BIC #RTS,(R4) ;;;TURN OFF CARRIER MTPS #0 ;;;ALLOW INTERRUPTS,210$: JMP XWTXND ;WAIT FOR SOFTWARE TIMEOUT .DSABL LSBO 7;;-; **- $XWINP - DUP-11 INPUT INTERRUPT SERVICE;;I$XWINP:: ;;;REFERENCE LABELI5 INTSV$ XW,PR5,D$$W11 ;;;GENERATE INTERRUPT SAVE CODEI( CALL XWSET ;;;SET CSR IN R4, UCB IN R5+ BIC #STRSYN,(R4)+ ;;; EXIT STRIP SYNC MODED- MOV (R4),R4 ;;;CONTENTS OF RCV BUFFER IN R4L) MOV KISAR6,-(SP) ;;;SAVE CURRENT MAPPINGB, MOV U.RBUF(R5),KISAR6 ;;;MAP TO USER BUFFER3 MOVB R4,@U.RBUF+2(R5) ;;;STORE BYTE IN USER BUFFER;, MOV (SP)+,KISAR6 ;;;RESTORE CURRENT MAPPING) DEC U.RCNT(R5) ;;;SEE IF COUNT SATISFIED; BEQ 30$ ;;;YES, IF EQUAL& INC U.RBUF+2(R5) ;;;BUMP BYTE ADDRESS3 BIT #20000,U.RBUF+2(R5) ;;;OVERFLOWED 4K BOUNDARY?  BEQ 20$ ;;;NO, IF ZERO. BIC #20000,U.RBUF+2(R5) ;;;CLEAR OVERFLOW BIT! ADD #200,U.RBUF(R5) ;;;BUMP BIAS$20$: RETURN ;;;EXIT FROM INTERRUPT;N; REQUEST SATISFIEDP;;30$: ;REFERENCE LABEL$ MOV U.SCB(R5),R4 ;;;GET SCB ADDRESS+ BIC #RCVENB,@S.CSR(R4) ;;;DISABLE RECEIVERS CALL $FORK ;;;GO TO FORK LEVEL% JMP XWSUCC ;COMPLETE SUCCESSFUL I/O  S; ,; **- $XWOUT - TRANSMITTER INTERRUPT SERVICE;C$XWOUT:: ;;;REFERENCE LABELS5 INTSV$ XW,PR5,D$$W11 ;;;GENERATE INTERRUPT SAVE CODE0 CALL XWSET ;;;SET RECEIVE CSR IN R4, UCB IN R5 ADD #4,R4 ;;;POINT TO TX CSR" TST (R4)+ ;;;DATA NOT AVAILABLE? BPL 10$ ;;;NO, IF NOT SET; ; CHECK DATA LATE;& TSTB -2(R4) ;;;TRANSMITTER DONE SET?& BPL 60$ ;;;IF NOT, DISMISS INTERRUPT*10$: BIT #CTS,-6(R4) ;;;CLEAR TO SEND SET? BEQ 20$ ;;;IF NOT, SEND A SYNC$ TSTB U.NSYC(R5) ;;;SYNC COUNT ZERO?" BEQ 30$ ;;;IF YES, TRANSMIT DATA/ DECB U.NSYC(R5) ;;;DECREMENT SYNC LEADER COUNTI! BLE 30$ ;;;IF LE, TRANSMIT DATAE220$: MOVB U.SYNC(R5),(R4) ;;;SEND A SYNC CHARACTER BR 50$ ;;;EXIT;4; SET UP AND TRANSMIT A BYTE; /30$: DEC U.CNT(R5) ;;;CHECK COUNT (0 NOT VALID)E BGE 40$ ;;;IF NOT, CONTINUE! TST U.CW2(R5) ;;;IN HALF DUPLEX? " BPL 80$ ;;;IF NOT, NO TURNAROUND% CMP #-3,U.CNT(R5) ;;;SENT TWO MARKS? $ BGE 70$ ;;;IF SO, TURN LINE AROUND MOVB #-1,(R4) ;;;OUTPUT A MARKC BR 50$ 00`TADATADATADATADATADATADATADATADATA ;;;DISMISS INTERRUPTE.40$: CALL $GTBYT ;;;GET NEXT BYTE FROM BUFFER$ MOVB (SP)+,(R4) ;;;OUTPUT CHARACTER-50$: MOV U.SCB(R5),R4 ;;;GET SCB ADDRESS BACKN0 MOVB S.ITM(R4),S.CTM(R4) ;;;RESET TIMEOUT COUNT%60$: BR XWSXT ;;;EXIT FROM INTERRUPTU'70$: BIC #SEND,-(R4) ;;;DON'T IDLE SYNCE+ TST -(R4) ;;;CLEAR RECEIVE DONE AND ERROR;* BIC #SCHSYN!RTS,-(R4) ;;;TURN OFF CARRIER% BIS #SCHSYN,(R4) ;;;FORCE RESYNCHINGO' ADD #6,R4 ;;;POINT TO TRANSMIT BUFFERR880$: BIC #TXINTE!DNAEN!SEND,-(R4) ;;;DISABLE TRANSMITTER% CALL $FORK ;;;CREATE SYSTEM PROCESST- MOV #IS.SUC&377,R0 ;RETURN SUCCESSFUL STATUSPXWTXND: ;REFERENCE LABELR$ MOV U.SCB(R5),R4 ;RESTORE SCB TO R4 JMP XWFIN ;MARK COMPLETION .PAGE;6; XWSET - SET UP REGISTER R4 WITH CSR ADDRESS, R5 WITH8; UCB ADDRESS. UNIT NUMBER IN LOW ORDER 4 BITS OF UNIT.; XWSET: ;;;REFERENCE LABEL& TST R5 ;;;TEST FOR VALID UCB ADDRESS BEQ 10$ ;;;IF NO UCB, TROUBLE;' BIT #U2.ONL,U.CW2(R5) ;;;UNIT ON LINE?N+ BEQ 10$ ;;;IF NOT ON LINE, CAN'T TRANSFERC* MOV U.SCB(R5),R4 ;;;FIRST GET SCB ADDRESS+ MOV S.CSR(R4),R4 ;;;NOW DEVICE CSR ADDRESSX RETURN ;;;AND NOW RETURNV010$: TST (SP)+ ;;;CLEAR STACK OF RETURN ADDRESS'XWSXT: JMP $INTXT ;;;DISMISS INTERRUPTP .END R4 WITH CSR ADDRESS, R5 WITH8; UCB ADDRESS. UNIT NUMBER IN LOW ORDER 4 BITS OF UNIT.; XWSET: ;;;REFERENCE LABEL& TST R5 ;;;TEST FOR VALID UCB ADDRESS BEQ 10$ ;;;IF NO UCB, TROUBLE;' BIT #U2.ONL,U.CW2(R5) ;;;UNIT ON LINE?N+ BEQ 10$ ;;;IF NOT ON LINE, C@ .TITLE XXATT - ATTACH AND DETACH PROCESSING FOR GENERIC DEVICES .IDENT /1.00/;e; COPYRIGHT (C) 1988 BY); DIGITAL EQUIPMENT CORPORATION, MAYNARD(; MASSACHUSSETTS. ALL RIGHTS RESERVED.;o5; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAYs5; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE"5; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THEs5; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER5; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE5; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TOD5; AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED.;(5; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO5; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUEDF5; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. ;D6; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR 5; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT ISI; NOT SUPPLIED BY DIGITAL.;N; KAREN L. NOEL ;H; MACRO LIBRARY CALLSI;  .MCALL UCBDF$,CPRDF$ UCBDF$ ,,1N CPRDF$P;+$; **-XXATT - PROCESS ATTACH REQUESTS; F; THIS ROUTINE IS DISPATCHED TO FROM XXDRV AFTER AN IO.ATT REQUEST HAS,; BEEN PROCESSED SUCCESSFULLY BY THE HOST. ;OF; IF THE UCB IS HTn: OR HT377:, ALLOCATE AN AST CONTROL BLOCK WITH TWOJ; EXTRA WORDS AND PUT THE TCB AND OF THE TASK AND THE LUN IN THOSE FIELDS.:; QUEUE THE AST CONTROL BLOCK AT OFFSET U.RAST OF THE UCB.;IJ; IF THE UCB IS NS:, ALLOCATE AN AST CONTROL BLOCK WITH ZERO PARAMETERS. ;*; IF THE UCB IS ANYTHING ELSE, WE'RE DONE.;R ; INPUTS:;X; R5 => UCB OF UNIT ATTACHED; R3 => DCB OF UNIT ATTACHED; R1 => CURRENT I/O PACKET;A; OUTPUTS: NONE.;P&; REGISTERS MODIFIED: R0, R1, R2, R3;-;T;U"; DEFINE LOCAL SYMBOLS AND STORAGE;O MAP6 = 140000ACBLNK: .BLKW 1 XXATT:: ; L; LOOK FOR ACB IN UCB QUEUE -- IF THIS IS NOT A NETWORK DEVICE, WE WILL WANTG; TO REJECT THE ATTACH IF WE FIND AN ACB (BECAUSE THE DEVICE IS ALREADYRL; ATTACHED). IF IT IS A NETWORK DEVICE, WE WILL WANT TO CHECK THE SPECIFIED; AST ADDRESS.;/ MOV R5,R0 ;GET POINTER TO ACB QUEUE LIST HEADU ADD #U.RAST,R0 ;=2$: MOV (R0),R0 ;GET NEXT ACB* BEQ 3$ ;IF EQ NOT IN LIST - LOOK OFF TCB 1( CMP A.PRM+14(R0),I.TCB(R1) ;RIGHT TASK? BNE 2$ ;IF NE NO/ CMPB A.PRM+16(R0),I.LN2(R1) ;RIGHT LUN NUMBER?  BNE 2$ ;IF NE NO BR 8$ ;FOUND ITS3$:O; %; SEARCH LIST OFF TCB FOR CORRECT ACBC;H" MOV I.TCB(R1),R0 ;GET TCB ADDRESS ADD #T.ASTL,R0 ;POINT TO LIST5$: MOV (R0),R0 ;GET NEXT ACB BEQ 10$ ;IF EQ NONET, CMPB A.PRM+00` D%B1111001016(R0),I.LN2(R1) ; MATCHING LUN? BNE 5$ ;IF NE NO8$: ;TJ; WE FOUND AN ACB. NETWORK ACBS GET CHANGED. OTHER DEVICES GET REJECTED.* CMP D.NAM(R3),#"NS ; IS THIS THE NETWORK?# BNE 45$ ; NO, GO RETURN AN ERROR. ;F; FOUND ACB, CHANGE AST ADDRESSR;; MOV I.PRM(R1),A.AST(R0)  CLC ; INDICATE SUCCESS. RETURN10$:I; WE DID NOT FIND AN ACB. CHECK TO SEE IF WE NEED ONE OR THIS ATTACH CANS; BE PERFORMED WITHOUT AN ACB.* CMP D.NAM(R3),#"NS ; IS THIS THE NETWORK?6 BEQ 12$ ; YES, SKIP OTHER CHECKS AND ACCEPT REQUEST.B BIS #SF$BLK,SNDCOD ; INDICATE TASK IS BLOCKED FOR THIS OPERATION.: CMP D.NAM(R3),#"HT ; IS THIS ONE OF OUR PSEUDO-TERMINALS?: BNE 19$ ; NO, DON'T SET UP AN ACB; U.RAST MAY NOT EXIST.; ; CHECK FOR UNSOL. CHARACTER AST;* BIT #TF.AST,I.FCN(R1) ;DO WE NEED AN ACB? BEQ 19$ ;IF EQ NOR12$:; ; ALLOCATE AN AST CONTROL BLOCK ;E& MOV R1,R3 ;GET ADDRESS OF I/O PACKET* MOV #30.,R1 ;SET SIZE OF ACB TO ALLOCATE/ MOV #ACBLNK,R4 ;GET ADDRESS TO STORE LINK INTOI, CALL ALACB ;ALLOCATE AN ACB FOR THE ATTACH+ BCS 40$ ;IF CS, ALLOCATION FAILED...ERROR  MOV R5,R0 ;GET UCB ADDRESS# ADD #U.RAST,R0 ;POINT TO LINK WORD?" TST 2(R0) ;IS SECOND WORD EMPTY? BNE 18$ ;IF NE NOS( MOV R0,2(R0) ;INITIALIZE QUEUE LISTHEAD:18$: MOV R2,R1 ;ADDRESS OF LINK WORD IN AST CONTROL BLOCK CALL $QINSF ;QUEUE IT UP19$: CLC ; INDICATE SUCCESS. RETURN ;RETURN SUCCESSFULLY;#; ERROR PROCESSING FOR ATTACHO;E40$:. MOV #IE.NOD&377,R0 ;ERROR - NO DYNAMIC MEMORY" BR 49$ ; JOIN COMMON ERROR CODE.45$:> MOV #IE.DAA&377,R0 ; INDICATE ERROR, DEVICE ALREADY ATTACHED.49$: SEC ;INDICATE FAILURE RETURN ;K;+'; **-ALACB - ALLOCATE AST CONTROL BLOCKB;1D; THIS SUBROUTINE ALLOCATES AN AST CONTROL BLOCK AND INITIALIZES THED; FIXED DATA. DATA THAT IS CHARACTERISTIC-DEPENDENT (SUCH AS A.AST)(; MUST BE SET BY THE CALLER UPON RETURN.; ; INPUTS::; R1 = SIZE IN BYTES OF ACB TO ALLOCATE (SAVED IN A.PRM+4); R3 => CURRENT I/O PACKET ; R5 => UCBA; ; OUTPUTS:99; CC-C CLEAR IF SUCCESSFUL ALLOCATION; CC-C SET OTHERWISEN@; R2 => LINK WORD OF ALLOCATED ACB (ACB'S HAVE NEGATIVE OFFSETS)&; ACBLNK => LINK WORD OF ALLOCATED ACB;T,; THE ALLOCATED ACB IS FORMATTED AS FOLLOWS:;A); +-------------------------------------+E7; | XXDRV KINAR5 BIAS | A.KSR5 (-4)U); |-------------------------------------|P7; | DEQUEUE SUBROUTINE ADDRESS (DQACB) | A.DQSR (-2)O); |-------------------------------------|N$; | THREAD WORD (0) | (0)); |-------------------------------------|O1; | LENGTH OF CONTROL BLOCK (0) | A.CBLT); |-------------------------------------|L0; | # BYTES TO ALLOC ON STACK | A.BYT); |-------------------------------------|-.; | AST ADDRESS (0) | A.AST); +-------------------------------------+40; | # AST PARAMETERS | A.NPR); |-----------------+-------------------|..; | U.HTID | 0 | A.PRM); |-----------------+-------------------|)-; | UCB OF ATTACHED UNIT | A.PRM+2 ); |-----------------+-------------------|.3; | FLAG BYTE | ACB SIZE | A.PRM+4 ); |-----------------+-------------------|T,; | ^C AST ADDRESS | A.PRM+6); |-------------------------------------|A'; | AST ADDRESS | A.PRM+10-); |-------------------------------------| .; | REMOTE PACKET HEADER BIAS | A.PRM+12); |-------------------------------------| 1; | TCB ADDRESS OF TASK | A.PRM+14-); |-------------------------------------|.#; | | LUN # | A.PRM+16-); +-------------------------------------+ ;E; REGISTERS MODIFIED: R1;-;-ALACB: CALL $ALOCB ;ALLOCATE SPACE  BCS 10$ ;BR IF ERROR7 MOV KINAR5,(R0)+ ;INSERT DRIVER APR 5 MAPPING (A.KSR5) 9 MOV #DQACB,(R0)+ ;INSERT POINTER TO ROUTINE TO CALL WHEN-# ;AST BLOCK IS DEQUEUED (A.DQSR) ' MOV R0,R2 ;SAVE ALLOCATED ACB ADDRESS-) MOV R0,ACBLNK ;STORE POINTER TO THE ACBT TST (R0)+ ;SKIP OVER LINK WORD1 C00`sTADATADATADATADATADATADATADATADATALR (R0)+ ;SET BLOCK LENGTH ZERO TO FORCE SYSXT . ;TO CALL US WHEN BLOCK IS DEQUEUED (A.CBL)& MOV #14.,(R0)+ ;ASSUME NOT A TERMINAL* BIT #DV.TTY,U.CW1(R5) ;IS THIS A TERMINAL BEQ 6$ ;IF EQ NO< MOV #16.,-2(R0) ;ALLOCATE 16. BYTES ON TASK'S STACK (A.BYT)=6$: CLR (R0)+ ;UNSOLICITED INPUT AST ADDRESS - CLEAR FOR NOW  CLR (R0)+ ;NO PARAMETERS* BIT #DV.TTY,U.CW1(R5) ;IS THIS A TERMINAL BEQ 7$ ;IF EQ NO MOV #1,-2(R0) ;1 PARAMETER 7$: CLRB (R0)+ ;6 MOVB I.PRM+2(R3),(R0)+ ;SAVE USER DEFINED TERMINAL ID MOV R5,(R0)+ ;SAVE UCB ADDRESSX+ MOVB R1,(R0)+ ;SAVE AST CONTROL BLOCK SIZE. CLRB (R0)+ ;ACB FLAG BYTE " CLR (R0)+ ;ASSUME NOT A TERMINAL* BIT #DV.TTY,U.CW1(R5) ;IS THIS A TERMINAL BEQ 8$ ;IF EQ NOA MOV I.PRM+4(R3),-2(R0) ;SAVE CONTROL-C AST ADDRESS IN ACB IF ONEE)8$: MOV I.PRM(R3),(R0)+ ;SAVE AST ADDRESS(- CLR (R0)+ ;CPRBUF BIAS (FILLED IN BY KXDRV)S. MOV I.TCB(R3),(R0)+ ;SAVE TCB ADDRESS OF TASK% MOVB I.LN2(R3),(R0) ;SAVE LUN NUMBER10$: RETURN ;ALL DONEV;R;+&; **-DQACB - DEQUEUE AST CONTROL BLOCK;D; INPUT:#; R0 - ADDRESS OF AST CONTROL BLOCKS;.;-DQACB:: ;C+; GET HEADER ADDRESS FROM AST CONTROL BLOCKN;' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGL$ MOV A.PRM+12(R0),KISAR6 ;MAP HEADER' MOV #1,H$STAT+MAP6 ;SET SUCCESS STATUSB CLR H$STAT+2+MAP6 ;" MOV (SP)+,KISAR6 ;RESTORE MAPPING;0; SEND RESPONSE TO CPR;  MOV R0,-(SP) ;SAVE ACB ADDRESS;& CPSEN$ #SN$RSP,A.PRM+12(R0),#H$SIZE+6" MOV (SP)+,R0 ;RESTORE ACB ADDRESS; !; CHECK FOR ACB MARKED FOR DELETE-;Q1 BITB #AF.MDE,A.PRM+5(R0) ;ACB MARKED FOR DELETE?S BEQ 10$ ;IF EQ NOS JMP DEACB ;DEALLOCATE ACB NOWR10$:;F; QUEUE AST TO UCB AGAIN;M% MOV R0,R1 ;GET ADDRESS OF LINK WORD$ MOV A.PRM+2(R0),R0 ;GET UCB ADDRESS# ADD #U.RAST,R0 ;POINT TO LIST HEADU& CALL $QINSF ;QUEUE AST CONTROL BLOCK RETURNM.PAGE9 .SBTTL PPDET - POST-QUEUE PROCESSING FOR DETACH REQUESTSR;;;+; **-XXDET - DETACH REQUESTS;EF; THIS ROUTINE IS DISPATCHED TO FROM XXINI AFTER AN IO.DET REQUEST HASE; BEEN DEQUEUED OR SPECIFY AST REQUEST HAS BEEN MADE FOR THE NETWORK.$; DEALLOCATE AST CONTROL BLOCK.L;T ; INPUTS: ; R5 => UCBU; R1 => CURRENT I/O PACKET;R; OUTPUTS: NONE.;I*; REGISTERS MODIFIED: R0, R1, R2, R3, R4;-;DXXDET::R;P; LOOK FOR ACB IN UCB QUEUEQ;F/ MOV R5,R4 ;GET POINTER TO ACB QUEUE LIST HEAD. ADD #U.RAST,R4 ;Q& MOV R4,R0 ;SAVE ADDRESS OF LIST HEAD'2$: MOV R0,R2 ;SAVE ADDRESS OF CURRENT  MOV (R2),R0 ;GET NEXT ACB * BEQ 3$ ;IF EQ NOT IN LIST - LOOK OFF TCB D( CMP A.PRM+14(R0),I.TCB(R1) ;RIGHT TASK? BNE 2$ ;IF NE NO/ CMPB A.PRM+16(R0),I.LN2(R1) ;RIGHT LUN NUMBER?: BNE 2$ ;IF NE NO; -; DEQUEUE AST CONTROL BLOCK AND DEALLOCATE IT;R MOV (R0),(R2) ;CLOSE UP LIST  BNE 25$ ;IF NE NO NEW LAST MOV R2,2(R4) ;NEW LASTU25$:' BR DEACB ;DEALLOCATE AST CONROL BLOCKI3$:A;%; SEARCH LIST OFF TCB FOR CORRECT ACBD;S" MOV I.TCB(R1),R2 ;GET TCB ADDRESS ADD #T.ASTL,R2 ;POINT TO LIST5$: MOV (R2),R2 ;GET NEXT ACB BEQ 6$ ;IF EQ NONE CMP A.PRM+2(R2),R5 ;RIGHT UCB?. BNE 5$ ;IF NE NO) CMPB A.PRM+16(R0),I.LN2(R1) ; RIGHT LUN?L BNE 5$ ; NO, KEEP LOOKING.> BISB #AF.MDE,A.PRM+5(R2) ;SET BIT TO DEALLOCATE AFTER DEQUEUE6$: RETURN ;AND FINISH10$:;S; DEALLOCATE AST CONTROL BLOCK;M1DEACB: MOVB A.PRM+4(R0),R1 ;GET LENGTH OF THE ACBE- CMP -(R0),-(R0) ;BACK UP TO START OF THE ACB # CALL $DEACB ;DEALLOCATE THE BLOCKR% RETURN ;COMPLETE SUCCESSFUL DETACHP .ENDIST5$: MOV (R2),R2 ;GET NEXT ACB BEQ 6$ ;IF EQ NO/ .TITLE XXDRV - GENERAL DEVICE INTERFACE DRIVER  .IDENT /1.04/;k; COPYRIGHT (C) 1988 BY); DIGITAL EQUIPMENT CORPORATION, MAYNARD(; MASSACHUSSETTS. ALL RIGHTS RESERVED.;u5; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAYe5; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE=5; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THEn5; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHERa5; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISEc5; MADE AVAILABLE TO ANY OTHER PERSON. 00s D%B11110010NO TITLE TOX5; AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED.;(5; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO5; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUEDF5; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. ;D6; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR 5; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT ISI; NOT SUPPLIED BY DIGITAL.;N%; KAREN L. NOEL AND PAUL K. M. WEISS E;O; MODIFICATIONS:;); V1.02 KLN - ADD XXCAN ENTRY POINT CODEO); V1.03 PKW - FIX CPR ALLOCATION FAILUREO?; V1.04 PKW - CALL CPCON AFTER PACKET ALLOCATED AND PUT IN UCB ; MACRO LIBRARY CALLSJ; 1 .MCALL HWDDF$,PKTDF$,SCBDF$,UCBDF$,CPRDF$,TCBDF$S$ HWDDF$ ;DEFINE HARDWARE REGISTERS SCBDF$ ,,1 ;SCB DEFINITIONS ( UCBDF$ ,,1 ;UNIT CONTROL BLOCK OFFSETS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS# CPRDF$ ;CPR SPECIFIC DEFINITIONSU! TCBDF$ ;TCB OFFSET DEFINITIONSN; ; DEVICE DISPATCH TABLEO;  DDT$ XX,1,,,,NEW=Y,,,SNX=YES;A; LOCAL SYMBOLSI;C MAP6 = 140000;F ; IMPURE DATAO;ASNDCOD::2 .BLKW 1 ; FUNCTION CODE TO USE TO SEND CPR PACKET .PAGE- .SBTTL XXCHK - SEND NEXT COMMAND ENTRY POINT$,; ** - XXCHK - SEND NEXT COMMNAD ENTRY POINT;FF; XXCHK IS A POOR NAME, BUT THAT'S WHAT DDT$ GENERATES, SO HERE IT IS.F; THIS ROUTINE JUST SENDS THE PACKET THAT WAS ALLOCATED AT UNIT ONLINE&; TIME TO VMS. NO RETURN IS EXPECTED.;B;FXXCHK:" CPSEN$ #SN$NOT,U.CPKT(R0),#H$SIZE RETURND .PAGE' .SBTTL XXUCB - UNIT ONLINE ENTRY POINT&; ** - XXUCB - UNIT ONLINE ENTRY POINT;D; FOR TT: UCBS WHICH ARE IN THE GENERIC DATA BASE, CALL THE ROUTINE E; $CPRCN TO ASSOCIATE THE TT: UCB WITH A CORRESPONDING VMS CP: UCB: E!; FOR ALL OTHER UCBS, JUST RETURN ;A*; SET UNIT MOUNTED (IF A MOUNTABLE DEVICE);H ; INPUTS:; S; R5 UCB ADDRESS; C=1 TRANSITION TO OFFLINE; C=0 TRANSITION TO ONLINE;. ; OUTPUTS:;E/; IE.DNR IS SET IN $SCERR IF OFFLINE TRANSITIONR;#XXUCB::R BCC 3$ ;IF CC ONLINE REQUEST + MOVB #IE.DNR,$SCERR ;SET DEVICE NOT READY  BR 10$ ;AND RETURN3$:TI; CHECK FOR UNIT ALREADY ONLINE SO WE DON'T DO THE CONNECT MORE THAN ONCES;I- BITB #US.OFL,U.ST2(R5) ;UNIT ALREADY ONLINE?B BEQ 10$ ;IF EQ YESC;UM; ONLY CALL THE CONNECT ROUTINE IF THE UNIT IS A REAL UNIT, NOT A GENERIC ONES; *5$: MOV U.DCB(R5),R0 ;GET THIS UNIT'S DCB+ CMPB #377,D.UNIT(R0) ;IS IT A GENERIC DCB% BEQ 10$ ;IF EQ YES - DON'T CONNECTE" MOV #AL$NBL,R0 ;DON'T BLOCK TASK MOV #1,R1 ;ALLOCATE ONE BLOCK CALL $CPALO! BCC 6$ ;IF WE GOT IT, CONTINUE & MOVB #IE.IDU,$SCERR ;FAIL THE ONLINE BR 10$ ;AND RETURN'6$: / MOV R0,U.CPKT(R5) ;SAVE THE PACKET IN THE UCBT( CALL $CPCON ;CALL THE CONNECT ROUTINE' MOV @#KISAR6,-(SP) ;SAVE APR6 MAPPING ! MOV R0,@#KISAR6 ;MAP THE PACKET / MOV #140001,R1 ;APR6 BASE ADDRESS - SKIP SIZET CLRB (R1)+ ;CLEAR SECOND BYTE MOV #H$SIZE,R2 ;SIZE OF HEADER ASR R2 ;CUT IT IN HALFO" DEC R2 ;FIRST WORD ALREADY DONE%7$: CLR (R1)+ ;CLEAR OUT THE HEADERK SOB R2,7$ ;' MOV #140000,R1 ;GET BASE ADDRESS BACK + MOVB #HT$SNX,H$TYPE(R1) ;SEND NEXT COMMANDA MOV R5,H$TIUC(R1) ;TI: UCB# MOV U.VUCB(R5),H$VUCB(R1) ;VMS UCB* MOV U.VUCB+2(R5),H$VUCB+2(R1) ;BOTH WORDS! MOV (SP)+,@#KISAR6 ;REMAP APR 6N 10$: RETURN# .PAGE5 .SBTTL XXKRB - CONTROLLER ONLINE/OFFLINE ENTRY POINTK3; ** - XXKRB- CONTROLLER ONLINE/OFFLINE ENTRY POINTE; ; INPUTS:E; ; R2 KRB ADDRESS; C=1 TRANSITION TO OFFLINE; C=0 TRANSITION TO ONLINE; ; OUTPUTS:;H/; IE.DNR IS SET IN $SCERR IF OFFLINE TRANSITIONE;DXXKRB:: BCC 10$ ;IF CC ONLINE REQUEST+ MOVB #IE.DNR,$SCERR ;SET DEVICE NOT READYM RETURN(10$:' MOV @#KISAR6,-(SP) ;SAVE APR6 MAPPINGU( MOV $KXBAS,@#KISAR6 ;MAP THE KX DRIVER7 MOV @#KISAR5,140014 ;PUT THE XX BIAS IN THE KX DRIVERO< MOV #ALFAIL,140016 ;AND THE ALLOCATION FAILURE ENTRY POINT* MOV (SP)+,@#KISAR6 ;RESTORE APR6 MAPPING RETURN$XXINT:: .PAGE( .SBTTL XXINI - INITIATE I/O ENTRY POINT'; ** - XXINI - INITIATE I/O ENTRY POINTR; ; INPUTS00sTADATADATADATADATADATADATADATADATA:R; ; R1 = I/O PACKET ; R4 = SCB ADDRESS$; R5 = UCB ADDRESS ; ; OUTPUTS:;S;; IF RESOURCES ARE AVAILABLE, THE REQUEST IS DEQUEUED AND (); PROCESSED ACCORDING TO THE DEVICE TYPE.A; XXINI::K;R+; CHECK FOR FUNCTIONS SENT TO US FROM DREIFI;H/ CMP #IO.CLN!1,I.FCN(R1) ;CLOSE LUN FROM DREIF?A BEQ 10$ ;IF EQ YEST, CMP #IO.DET!1,I.FCN(R1) ;DETACH FROM DREIF? BNE 45$ ;IF NE NO10$:( CLRB I.FCN(R1) ;DON'T NEED BIT ANYMORE;*.; GET RID OF STACK CONTEXT AND SET RUNDOWN BIT;R- MOV #$STACK-22,SP ;GET RID OF STACK CONTEXT$# MOV I.TCB(R1),R0 ;GET TCB ADDRESS:3 MOV T.ASTL(R0),R2 ;GET ADDRESS OF FIRST AST BLOCKE BEQ 40$ ;IF EQ NONE  TSTB A.CBL(R2) ;KERNAL AST?1 BMI 50$ ;IF MI YES, RUNDOWN BIT MIGHT DEADLOCKF40$: I) BIS #TS.RDN,T.STAT(R0) ;SET RUN DOWN BIT ! BR 50$ ;NO DIRECTIVE TO FINISHT45$:;#; FINISH DIRECTIVE - A;F, MOV #$STACK-24,SP ;POINT SP AT STATUS WORD; F; (NOTE TO BENNY: THE FOLLOWING CODE WAS STOLEN FROM $DRFIN IN DRDSP);OA; INCREMENT GROUP GLOBAL USE COUNTS (OR SCRATCH WORD IF DIRECIVEST; DON'T USE GROUP GLOBALS);M .IF DF G$$GEF0 INC @$GEFPT ;INCREMENT GROUP GLOBAL USE COUNT2 INCB @$GFTCB ;INC GRP GLOBAL USE COUNT FOR TASK .ENDC ; DF G$$GEF;G'; WRITE DIRECTIVE STATUS BACK INTO TASK(; + MTPD$ @#H.DSW ;SET DIRECTIVE STATUS WORDO;NH; GET USER STACK POINTER AND UPDATE TO REMOVE DPB OR ADDRESS OF DPB FROM ; THE STACK.; " MFPI SP ;GET USER STACK POINTER/ ADD $BTRMV,(SP) ;REMOVE BYTES FROM USER STACKM& MTPI SP ;RESTORE USER STACK POINTER50$:;I#; CHECK IF PACKET IS FOR A TERMINAL;2 BIT #DV.TTY,U.CW1(R5) ;IS THIS A TERMINAL DEVICE? BEQ NONTTY ;IF EQ NO$;C*; CALL TERMINAL PARAMETER CHECKING ROUTINEH; THIS MUST BE CALLED BEFORE THE PACKET IS QUEUED SINCE THE CONTEXT MUST; BE OF THE ISSUING TASK;T- CALL XXTTI ;CALL TERMINAL SPECIFIC ROUTINET" BCC TSTQUE ;GO DEQUEUE A PACKET+ JMP IOFIN ;IF CS ERROR - STATUS IN R0,R1A;P%; PREPROCESS NON TERMINAL I/O PACKETS I; THIS INCLUDES ACP FUNCTIONS AND NORMAL I/O FUNCTIONS FOR EVERYTHING BUT ; TERMINALSFNONTTY:I' CALL XXPRE ;PREPROCESSES I/O PACKETS " BCC TSTQUE ;GO DEQUEUE A PACKET+ JMP IOFIN ;IF CS ERROR - STATUS IN R0,R1I;RL; TSTQUE IS ONLY BRANCHED TO WHEN WE KNOW WE HAVE AT LEAST ONE PACKET IN THEK; QUEUE. IF THERE IS MORE THAN ONE, IT MEANS THAT A PREVIOUS ONE MUST HAVENK; FAILED TO ALLOCATE A CPR PACKET. IN THAT CASE, JUST RETURN, WE'LL TRY TO ; SEND IT WHEN KXDRV CALLS BACKI; 2TSTQUE: TST @(R4) ;MORE THAN ONE ENTRY IN QUEUE? BEQ ALPKT ;IF EQ NO Y& RETURN ;ALREADY WAITING FOR BUFFER;X"; ALLOCATE A CPRBUF REQUEST PACKET;T$; WE DO NOT DO IMPLICIT TASK START!G; THE TASK HAS ALREADY BOUND THE LUN WITH ITS AME. THIS MEANS THAT THEEP; IMPLICIT TASK START HAD TO HAVE ALREADY HAPPENED. SINCE WE MAY NOT BE RUNNINGP; UNDER THE CONTEXT OF THE SAME TASK THAT ISSUED THE QIO, THE VALUE IN $TKTCB ISP; NOT VALID. THE KXDRIVER USES $TKTCB TO SEE IF IT NEEDS TO DO AN IMPLICIT TASK'; START ONLY IF THE AL$IMP BIT IS SET. U;L; THE KXDRIVER WILL NOT RETURN FROM THE CPALO CALL IF IT FAILS TO ALLOCATE AN; BLOCK OF CPRBUF. SINCE WE DO NOT NECESSARILY HAVE THE TASK CONTEXT AND WE DOM; NOT WANT TO REISSUE THE QIO, WHEN RESOURCES BECOME AVAILABLE, THE KXDRIVER H; WILL CALL US BACK AT ALFAIL (SET UP BY XXKRB) TO REISSUE THE REQUEST. ; *ALFAIL: MOV U.SCB(R5),R4 ;RESTORE THE SCB=ALPKT: MOV #AL$XXD,R0 ;INDICATE NO BLOCKING AND NO PC BACKUPB MOV #1,R1 ;ALLOCATE 1 BLOCK. CALL $CPALO ;CALL ALLOCATE ROUTINE IN KXDRV;"; GET AN I/O PACKET FROM THE QUEUEF; WE USE $GSPKT INSTEAD OF $GTPKT SINCE WE IGNORE THE BUSY BIT IN THE J; CONTROLLER. THE AME WILL DECIDE IF A PARTICULAT CONTROLLER IS TOO BUSY.; $30$: MOV R0,-(SP) ;SAVE BUFFER BIAS- MOV #20$,R2 ;ADDRESS OF ACCEPTANCE ROUTINES" CALL $GSPKT ;DEQUEUE I/O PACKET# MOV (SP)+,R0 ;RESTORE BUFFER BIASR' BCC 40$ ;IF CC, WE GOT AN I/O PACKETN;AJ; THIS SHOULD NEVER HAPPEN. $GSPKT IS SPECIAL CASED TO GIVE US ANY PACKETN; IN OUR QUEUE00s D%B11110010 INCLUDING ATTACH AND DETACH. THIS IS HERE TO PROTECT OURSELVES; AND THE AME ;T8 CALLR $CPDEA ;DEALLOCATE THE CPRBUF PACKET AND RETURN;LG; THIS IS THE DRIVER ACCEPTANCE ROUTINE FOR $GSPKT - WE ACCEPT ANYTHING:(20$: CLC ;CLEAR CARRY FOR GSPKT$ CALL RETURN ; F;C; AFTER CALL TO $GSPKT;P; R1 = ADDRESS OF I/O PACKET; R2 = PHYSICAL UNIT #; R3 = CONTROLLER INDEXC; R4 = SCB ADDRESS;N40$:@; WE HAVE A PACKET. SET THE DEFAULT CODE TO BE USED TO SEND IT.;A/ MOV #SN$QIO,SNDCOD ; DEFAULT IS A NORMAL QIO. ;I; CHECK FOR OVERLAY QIO'SV;" MOV I.UCB(R1),R5 ;GET UCB ADRESS" TST U.CW1(R5) ;MOUNTABLE DEVICE?/ BPL 50$ ;IF PL NO, CAN'T BE OVERLAY FUNCTION % MOV I.FCN(R1),R2 ;GET FUNCTION CODEC1 CMP #IO.LOV,R2 ;IS IT THE I-SPACE LOAD OVERLAY? BNE 50$ ;IF NE NO45$: JMP OVERLD ;E1 CMP #IO.LDO,R2 ;IS IT THE D-SPACE LOAD OVERLAY?N BEQ 45$ ;IF EQ YESS50$:;S.; CHECK FOR ATTACH OR NETWORK SPECIFY AST QIO.;D MOV (R5),R3 ;GET DCB' CMPB I.FCN+1(R1),#IO.ATT/256. ;ATTACH?O BEQ 55$ ;IF EQ YES * CMP D.NAM(R3),#"NS ;IS THIS THE NETWORK? BNE 57$ ;IF NE NO# CMP I.FCN(R1),#16420 ;NETWORK SPA?$ BNE 57$ ;IF NE NO, TST I.PRM(R1) ;IS AN AST ADDRESS SPECIFIED* BEQ 57$ ;NO, IT'S DELETING THE REQUEST.55$:  MOV R0,-(SP) ;SAVE R0  MOV R1,-(SP) ; AND R1L MOV R4,-(SP) ; AND R4;6 CALL XXATT ;DO ATTACH (CARRY SET IF ERROR DETECTED)& MOV R0,R2 ;SAVE ERROR CODE, IF ANY. MOV (SP)+,R4 ;RESTORE R4 MOV (SP)+,R1 ; AND R1. MOV (SP)+,R0 ; AND R0T* BCC 57$ ;CONTINUE NORMALLY IF NO ERROR.$ MOV R2,-(SP) ;PRESERVE ERROR CODE., MOV R1,-(SP) ;PRESERVE I/O PACKET ADDRESS.# CALL $CPDEA ;RELEASE CPR PACKET.P+ MOV (SP)+,R1 ;RESTORE I/O PACKET ADDRESS.$# MOV (SP)+,R0 ;RESTORE ERROR CODE.5 MOV I.TCB(R1),R3 ;GET TCB.9 BIC #TS.RSW,T.STAT(R3) ;THERE IS NO WAIT FOR THIS ERROR.L+ MOV R1,R3 ;IOFIN WANTS I/O PACKET IN R3.C( CLR R1 ;CLEAR TOP HALF OF ERROR CODE.2 JMP IOFIN ;COMPLETE THIS I/O WITH ERROR STATUS.57$:2 BIT #DV.TTY,U.CW1(R5) ;IS THIS A TERMINAL DEVICE?% BEQ 575$ ;NO, FORGET ABOUT SF.GMC.S4 CMP #IO.GTS,I.FCN(R1) ;IS THIS GET SUPPORT REQUEST?! BEQ 573$ ;YES, WE BLOCK THOSE.P6 CMP #SF.GMC,I.FCN(R1) ;HOW ABOUT GET CHARACTERISTICS?& BNE 575$ ;NOPE, LET IT GO NORMALLY.573$:T7 BIS #SF$BLK,SNDCOD ;INDICATE TASK IS BLOCKED FOR THISO ; OPERATION.L575$:R; -; START FILLING IN THE CPRBUF REQUEST PACKET C;R MOV R0,KISAR6 ;MAP THE PACKETF# MOV #MAP6,R2 ;POINT TO THE HEADERA4 MOVB #HT$QIO,H$TYPE(R2) ;ASSUME REGULAR QIO REQUEST CLRB H$ICNT(R2) ;NO ITEMSR, ADD #P$LUN,R2 ;POINT TO THE PARAMETER AREA;IJ; FINISH FILLING IN THE I/O PACKET, WE ASSUME THERE CAN NOT BE MORE THAN 8; PARAMETER WORDSE/60$: MOVB I.LN2(R1),(R2)+ ;FILL IN P$LUN FIELDR+ MOVB I.LN2+1(R1),(R2)+ ;FILL IN FLAGS WORDE TST (R2)+ ;RESERVED WORD 0 MOV I.FCN(R1),(R2)+ ;FILL IN I/O FUNCTION CODE MOV R1,R3+ ADD #I.PRM,R1 ;POINT TO THE PARAMTER LISTP .REPT 8.V" MOV (R1)+,(R2)+ ;COPY PARAMETERS .ENDR, MOV R4,(R2) ;COPY SCB ADDRESS INTO PACKET( MOV R3,2(R2) ;COPY I/O PACKET ADDRESS  MOV R3,R1 ;RESTORE PKT TO R1I; ; SEND QIO REQUEST TO AMEA;T#SENPKT: MOV R5,-(SP) ;SAVE THE UCBN9 MOV I.TCB(R1),R5 ;GET THE TCB - MAY NOT BE CURRENT TASKI# SUB #MAP6,R2 ;GET SIZE OF REQUEST) CPSEN$ SNDCOD,R0,R2,#SNDRET;2; GET RETURN PACKET;V, MOV KISAR6,-(SP) ;SAVE TASK HEADER MAPPING MOV R0,KISAR6 ;MAP PACKETP) MOV #MAP6,R2 ;POINT TO HEADER OF PACKETV- MOV P$PARM+22(R2),R1 ;GET I/O PACKET ADDRESS,# MOV I.UCB(R1),R5 ;GET UCB ADDRESSM MOV (R5),R3 ;GET DCBC: CMPB #IO.ATT/256.,I.FCN+1(R1) ;IS THIS AN ATTACH REQUEST? BEQ 7$ ;YES, CHECK IT OUT. ' CMPB I.FCN+1(R1),#IO.DET/256. ;DETACH?R BEQ 8$ ;YES, DO DETACH.* CMP D.NAM(R3),#"NS ;IS THIS THE NETWORK? BNE 10$ ;NO, SKIP DETACH./ CMP I.FCN(R1),#16410 ;IS THIS A NETWORK CLOSE?K BEQ 8$ ;YES, CANCEL THE AST.P8 CMP I.FCN(R1),#IO.CLN*400 ;IS THIS A NETWORK CLOSE LUN? BEQ 8$ ;YES, CANCEL THE AST.+# CMP I.FCN(R1),#16420 ;NETWORK S00sTADATADATADATADATADATADATADATADATAPA? BNE 10$ ;NO, SKIP DETACH., TST I.PRM(R1) ;IS AN AST ADDRESS SPECIFIED BEQ 8$ ;NO, EMULATE DETACH. ;YES, CHECK FOR SUCCESS. 7$: ' CMP H$STAT(R2),#1 ;DID ATTACH SUCCEED; BEQ 10$ ;IF EQ YESS8$:D+ MOV I.UCB(R1),R5 ;GET UCB ADDRESS OF UNITWK; WE DECIDED NOT TO USE THIS METHOD, SO THIS CODE CAN BE DELETED IF THE NEWO; STUFF WORKS.,; MOV I.TCB(R1),R3 ;GET TCB ADDRESS OF TASK*; CMP R5,T.UCB(R3) ;IS THIS TO TASK'S TI:6; BEQ 5$ ;IF EQ, UCB IS TI:, COMPLETE I/O AS FAILURE;A<; CMP H$TYPE(R2),#HT$ATW ;WAS THIS ATTACH AND WAIT REQUEST?; BEQ 5$ ;IF EQ COMPLETE I/OE;A"; JMP ATTWAI ;DO ATTACH AND WAIT;5$:;$ ; CLEAR U.ATT(;,$; CLR U.ATT(R5) ;NO LONGER ATTACHED;E; DEALLOCATE ACB I;B MOV R0,-(SP) ;SAVE R0  MOV R2,-(SP) ;AND R2) CALL XXDET ;DEQUEUE AND DEALLOCATE ACBE MOV (SP)+,R2 ;RESTORE R2 MOV (SP)+,R0 ;AND R0-10$: MOV P$PARM+20(R2),R4 ;SAVE SCB ADDRESS )/ MOV P$PARM+22(R2),R5 ;SAVE I/O PACKET ADDRESSI$ MOV (SP)+,R3 ;GET OLD MAPPING BACK- MOV H$STAT(R2),-(SP) ;GET FIRST STATUS WORDI0 MOV H$STAT+2(R2),-(SP) ;AND SECOND STATUS WORD! MOV R3,KISAR6 ;MAP TASK HEADER ; ; DEALLOCATE PACKET;/ CALL $CPDEA ;CPDEA PRESERVES R4,R5 AND STACKO;E/; CONVERT LUN NUMBER BACK INTO POINTER INTO LUTP;;& MOVB I.LN2(R5),R3 ;GET LUN NUMBER" DEC R3 ;LUN NUMBERS START AT 10 ASL R3 ;MULTIPLY BY 4 (4 BYTES PER LUN ENTRY) ASL R3 ;S, ADD #,R3 ;GET OFFSET INTO LUT8 MOV R3,I.LN2(R5) ;RETURN TO LUN FIELD IN I/O PACKET;S; COMPLETE I/O; $ MOV R5,R3 ;GET I/O PACKET ADDRESS$ MOV I.UCB(R3),R5 ;GET UCB ADDRESS 2 BIT #DV.TTY,U.CW1(R5) ;IS THIS A TERMINAL DEVICE?+ BNE 30$ ;IF NE YES, NO FINISH PROCESSING ; ; TEST FOR OVERLAY LOADS ; NO FINISH PROCESSING NECESSARY;;% MOV I.FCN(R3),R2 ;GET FUNCTION CODER1 CMP #IO.LOV,R2 ;IS IT THE I-SPACE LOAD OVERLAY?L BEQ 30$ ;IF EQ YES 1 CMP #IO.LDO,R2 ;IS IT THE D-SPACE LOAD OVERLAY?G BEQ 30$ ;IF EQ YESVJ; XXFIN USES THE FIRST I/O STATUS WORD, AT 4(SP), INCLUDING RETURN ADDRESS; WE ARE ABOUT TO GENERATE.T7 CALL XXFIN ;DO FINISH WORK FOR NON TERMINAL DEVICEST& ;XXFIN: PRESERVES R4,R5 AND STACK130$: MOV (SP)+,R1 ;SETUP STATUS WORDS FOR $IODSA  MOV (SP)+,R0 ;;S6; COMMON POINT TO ALL I/O TO FINISH - SUCCESS OR ERROR;;; R0,R1 - STATUS; R3 - I/O PACKET; R5 - UCB ADDRESSE;YIOFIN:9 CLR I.PRM+16(R3) ;MAKE IOFIN KNOW WE DON'T HAVE A BLOCKD ;LOCKINGQF; $IODSA WILL FORK USING THE I/O PACKET AS THE FORK BLOCK IF THERE IS #; ANOTHER I/O PACKETS IN OUR QUEUE.O?; THIS WILL ENSURE THAT THE KX DRIVER WILL GET TO COMPLETE ITS &; RING PROCESSING AS SOON AS POSSIBLE.;S+ CALL $IODSA ;CALL I/O COMPLETION ROUTINES;R&; SEE IF ANYTHING ELSE IS IN OUR QUEUE;I.NEMORE: MOV U.SCB(R5),R4 ;RESTORE SCB ADDRESS% TST (R4) ;ANOTHER PACKET IN QUEUE? BNE 10$ ;YES, CHECK IT OUTI RETURNI10$: JMP ALPKT.SNDRET: MOV (SP)+,R5 ;RESTORE THE UCB ADDRESS/ BR NEMORE ;SEE IF THERE ARE ANY MORE TO SENDEL; THIS CODE IS NO LONGER USED AND CAN BE DELETED AS SOON AS THE NEW STUFF IS ; WORKING.;ATTWAI:3; MOVB #HT$ATW,H$TYPE+MAP6 ;CHANGE THE HEADER TYPE $; MOV (SP)+,KISAR6 ;RESTORE MAPPING,; MOV #MAP6+P$PARM+16.,R2 ;LENGTH OF PACKET; JMP SENPKT ;SEND PACKETE;+; 1; OVERLD - HANDLE LOAD OVERLAY REQUESTS TO CPRSYSO;R(; INPUT: R0 - BIAS OF THE REQUEST PACKET; R1 - ADDRESS OF I/O PACKET;;-OVERLD: ; $; FILL IN THE CPRBUF REQUEST PACKET ;E MOV R0,KISAR6 ;MAP THE PACKETS# MOV #MAP6,R2 ;POINT TO THE HEADER . MOVB #HT$LOV,H$TYPE(R2) ;LOAD OVERLAY REQUEST CLRB H$ICNT(R2) ;NO ITEMS#- MOV R4,P$PARM+20(R2) ;SAVE THE SCB ADDRESS 4 MOV R1,P$PARM+22(R2) ;SAVE THE I/O PACKET ADDRESS, ADD #P$IID,R2 ;POINT TO THE PARAMETER AREA;P; LOAD PARAMETERS ;R6 MOV I.TCB(R1),R4 ;GET TCB ADDRESS OF REQUESTING TASK0 MOV T.IID(R4),(R2)+ ;FILL IN IMAGE INDEX FIELD$ MOV I.PRM+4(R1),(R2)+ ;FILL IN SIZE# MOV I.PRM(R1),(R2)+ ;FILL IN BIAS , MOV I.PRM+2(R1),(R2)+ ;FILL IN DISPLACEMENT- MOV I00s D%B11110010.PRM+12(R1),(R2)+ ;FILL IN BLOCK NUMBER$;E; SEND QIO REQUEST TO CPRSYS; , JMP SENPKT ;AND GO SEND THE PACKET TO VMSXXOUT::HXXPWF::R RETURNV .PAGE% .SBTTL XXCAN- CANCEL I/O ENTRY POINTS$; ** - XXCAN- CANCEL I/O ENTRY POINT;RK; CANCEL I/O FOR ALL OUTSTANDING I/O ON THE UNIT SPECIFIED BY THE UCB IN R5T; K; FIRST SCAN THE DRIVER'S QUEUE FOR I/O PACKETS WHICH HAVEN'T BEEN SHIPPED +J; OVER YET. ONLY THOSE I/O PACKETS WHOSE TCB ADDRESSES MATCH THAT OF THE L; CURRENT TASK AND WHOSE UCB ADDRESSES MATCH WILL BE CONCIDERED. SINCE THE H; UCB ADDRESS DOES NOT IDENTIFY A UNIQUE UNIT, THE LUN NUMBER IS CHECKEDJ; AGAINST THE ONE PASSED TO US. IF ALL THESE MATCH, THE PACKET IS REMOVEDJ; FROM THE QUEUE AND THE I/O FINISHED. IF THE UCB ADDRESSES MATCH AND LUNJ; NUMBERS DON'T, WE MUST DO A FAKE GDVI DIRECTIVE TO FIND OUT IF THE UNITS; ARE THE SAME./;A ; INPUTS: ; '!; R1 TCB ADDRESS OF CURRENT TASK ; R4 SCB ADDRESS OF XX SCB; R5 UCB ADDRES TO KILL I/O TOH; $CPPKT BIAS OF A PACKET IN CPRBUF TO USE FOR I/O KILL OR GDVI REQUEST(; $CPLUN LUN NUMBER OF I/O KILL REQUESTF; P$LUN+2 OFF CPRBUF PACKET CONTAINS THE NUMBER OF WORDS ON THE STACK 6; WHICH MUST BE SAVED IF A GDVI PACKET MUST BE PASSED; $TEMP2;N ; OUTPUTS:;UD; APPROPRIATE I/O PACKETS ARE REMOVED FROM THE QUEUE AND AN I/O KILLD; PACKET IS SENT TO THE HOST, TO KILL ALL I/O OUTSTANDING ON THE LUN;XXCAN::A;E$; SCAN SCB QUEUE FOR PACKETS TO KILL; 0 MOV R4,R3 ;COPY ADDRESS OF I/O QUEUE LISTHEAD/10$: MOV R3,R2 ;SAVE ADDRESS OF CURRENT ENTRY ) MOV (R2),R3 ;GET ADDRESS OF NEXT ENTRYI BEQ 100$ ;IF EQ, NONE;B!; FOUND AN ENTRY IN THE SCB QUEUER;ON; - THIS IS A VERY STRANGE CASE SINCE THE GENERIC DRIVER ONLY HOLDS ONTO I/Os; IF RESOURCES ARE LACKINGTO; - TO HANDLE THIS SITUATION, WE WILL MAKE ONLY 2 CHECKS. IF THE I/O HAS COME N; FROM THIS TASK AND IF THE LUN NUMBERS ARE THE SAME. THE OTHER SITUATIONSO; WHICH SHOULD BE HANDLED, I/O FROM THIS TASK WITH DIFFERENT LUN NUMBERS ANDMK; THE SAME UCB ADDRESS CAN'T BE HANDLE WITHOUT MUCH PAIN BECAUSE OF THE XE; GENERIC UCB STRUCTURE. THIS IS NOT A TERRIBLE RESTRICTION. IF UM; RESOURCES ARE LACKING, THIS CANNOT BE AN IO.KIL QIO SINCE DRQIO DOES NOTTM; LET THE QIO COME THROUGH UNLESS A CPRBUF PACKET IS AVAILABLE. IF WE AREMK; BEING CALLED BECAUSE OF AN ALUN OR PFCS DIRECTIVE, SOMETHING IS REALLYNG; STRANGE BECAUSE THE DIRECTIVE MADE IT TO CPRAME BUT THE I/O PACKET ; COULDN'T.;W- CMP R1,I.TCB(R3) ;REQUEST FOR CURRENT TASK?C BNE 10$ ;IF NE NO2 TST $CPLUN ;IS KILL FOR ALL UNITS? (FROM DREIF) BEQ 50$ ;IF EQ YESN2 MOV I.LN2(R3),R0 ;GET POINTER TO SECOND LUN WORD+ SUB #H.LUN+2+MAP6,R0 ;CALCULATE LUN NUMBERQ ASR R0 ;DIVIDE BY 4 ASR R0 ;H$ CMP R0,$CPLUN ;IS IT THE SAME LUN?$ BNE 10$ ;IF NE NO - DON'T KILL IT;S; REMOVE I/O PACKET FROM QUEUE;E50$: MOV (R3),(R2) ;CLOSE UP LIST BNE 60$ ;IF NE NO NEW LASTE' MOV R2,2(R4) ;SET ADDRESS OF NEW LAST;P ; COMPLETE I/O WITH ABORT STATUS;A60$:/ MOV #IE.ABO&377,R0 ;SET FINAL STATUS TO ABORTR+ TSTB $TEMP2 ;SUBFUNCTION SET FOR IO.KIL?E BMI 70$ ;IF MI YES 3 CLR I.AST(R3) ;MAKE SURE THERE IS NO AST DECLAREDR'70$: CLR R1 ;CLEAR SECOND STATUS WORDD" CALL $IOFIN ;FINISH I/O REQUEST;I/; GO BACK TO SCAN SCB LIST FOR MORE I/O PACKETSK; ( MOV U.SCB(R5),R4 ;GET SCB ADDRESS BACK2 MOV $TKTCB,R1 ;GET CURRENT TASK TCB ADDRESS BACK JMP XXCAN ;SCAN QUEUE AGAIN;;!; PUT PACKET TOGETHER TO KILL I/OP;E100$:T# MOV $CPPKT,KISAR6 ;MAP THE PACKETO! BEQ 200$ ;IF EQ DON'T KILL I/OR# MOV #MAP6,R2 ;POINT TO THE HEADER % MOVB #HT$QIO,H$TYPE(R2) ;QIO REQUESTI CLRB H$ICNT(R2) ;NO ITEMS # MOVB $CPLUN,P$LUN(R2) ;FILL IN LUNR CLRB P$FLG(R2) ;NO BUFFERS. MOV #IO.KIL,P$FUNC(R2) ;FILL IN FUNCTION CODE;CK; SEND QIO REQUEST TO AME WITH IMMEDIATE RETURN - PACKET WILL BE DEALLOCATEM; ON DETATCHED RETURN BY KXDRVC;D+ MOV R1,R5 ;SET UP TCB FOR PSEUDO REQUEST; CPSEN$ #SN$PSR,KISAR6,#H$SIZE+60 CLR $CPPKT ;INDIC00s 3TADATADATADATADATADATADATADATADATAATE THAT I/O HAS BEEN KILLED200$:2 RETURN  .ENDT KILL I/OR# MOV #MAP6,R2 ;POINT TO THE HEADER % MOVB #HT$QIO,H$TYPE(R2) ;QIO REQUESTI CLRB H$ICNT(R2) ;NO ITEMS # MOVB $CPLUN,P$LUN(R2) ;FILL IN LUNR CLRB P$FLG(R2) ;NO BUFFERS. MOV #IO.KIL,P$FUNC(R2) ;FILL IN FUNCTION CODE;CK; SEND QIO REQUEST TO AME WITH IMMEDIATE RETURN - PACKET WILL BE DEALLOCATEM; ON DETATCHED RETURN BY KXDRVC;D+ MOV R1,R5 ;SET UP TCB FOR PSEUDO REQUEST; CPSEN$ #SN$PSR,KISAR6,#H$SIZE+60 CLR $CPPKT ;INDIC .TITLE XXFIN  .IDENT /01.00/M;P6; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;N<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;(; K. L. NOEL 24-MAR-87;S/; I/O FINISHING MODULE FOR NON TERMINAL DEVICESO;;S .PAGE; ; LOCAL SYMBOL DEFINITIONA;R6 MXSIZ = 0 ; MAXIMUM SIZE OF ATTRIBUTE TO GO IN CPRBUF/ MAP5 = 120000 ; ADDRESS OF FIRST WORD IN APR55. MAP6 = 140000 ; ADDRESS OF FIRST WORD IN APR6 .PAGE;+; "; I/O FUNCTION CODE DISPATCH TABLE; ;- DSPTBL: .WORD FN0BF ; 0 IO.KIL .WORD FN0BF ; 1 IO.WLBH .WORD FN0BF ; 2 IO.RLBB .WORD FN0BF ; 3 IO.ATT  .WORD FN0BF ; 4 IO.DETF .WORD FN0BF ; 5 ? .WORD FN0BF ; 6 ? .WORD FN0BF ; 7 ? .WORD 0 ;10-ILLEGAL FUNCTION- .WORD FNACP ;11-FIND FILE NAME IN DIRECTORYR. .WORD FNACP ;12-UNLOCK BLOCK - NOP'D IN MASK1 .WORD FNACP ;13-REMOVE FILE NAME FROM DIRECTORYN. .WORD FNACP ;14-ENTER FILE NAME IN DIRECTORY& .WORD FNACC ;15-ACCESS FILE FOR READ0 .WORD FNACC ;16-ACCESS FILE FOR READ AND WRITE6 .WORD FNACC ;17-ACCESS FILE FOR READ, WRITE, AND EXT .WORD FNDEA ;20-DEACCESS FILE $ .WORD FN0BF ;21-READ VIRTUAL BLOCK% .WORD FN0BF ;22-WRITE VIRTUAL BLOCK  .WORD FNACP ;23-EXTEND FILEO .WORD FNACP ;24-CREATE FILEO4 .WORD FNACP ;25-MARK FILE FOR DELETE/TRUNCATE FILE& .WORD FNACP ;26-READ FILE ATTRIBUTES' .WORD FNACP ;27-WRITE FILE ATTRIBUTESE/ .WORD FNACP ;30-USER MAGTAPE CONTROL FUNCTIONC* .WORD FN0BF ;31-TRANSMIT PROCESS MESSAGE) .WORD FN0BF ;32-RECEIVE PROCESS MESSAGED$ .WORD NTACC ;33-CONNECT TO PROCESS) .WORD NTDEA ;34-DISCONNECT FROM PROCESS-+ .WORD NCTSPL ;35-NETWORK CONTROL FUNCTIONL .PAGE;0'; DISPATCH TO CORRECT FINISHING ROUTINEP;2XXFIN::F SAVNR* MOV I.TCB(R3),R4 ;GET TCB ADDRESS OF TASK" MOV T.PCB(R4),R4 ;GET PCB ADDRESS! MOV P.REL(R4),KISAR6 ;MAP HEADERB0 MOVB I.FCN+1(R3),R2 ;RETRIEVE I/O FUNCTION CODE ASL R2 ;CONVERT TO WORD INDEXR4 MOV I.LN2(R3),R4 ;GET POINTER TO SECOND LUN WORD+ JMP @DSPTBL(R2) ;EXECUTE FINISHING ROUTINED-NCTSPL: ; SPLIT NETWORK CONTROL FUNCTIONS.D& MOV I.FCN(R4),R1 ; GET FUNCTION CODE.9 BIC #177707,R1 ; EXTRACT THREE BITS INDICATING FUNCTION.  ASR R1T ASR R1  JMP @NCTTBL(R1) ; DISPATCH.NCTTBL: .WORD NTACC ; 00, OPEN .WORD NTDEA ; 10, CLOSEP .WORD FN0BF ; 20, SPECIFY ASTP$ .WORD FN0BF ; 30, GET NETWORK DATA$ .WORD FN0BF ; 40, GET NETWORK DATA$ .WORD FN0BF ; 50, GET NETWORK DATA .WORD FN0BF ; 60. .WORD FN0BF ; 70, GET LOCAL NODE INFORMATION;X/; PROCESS ACCESS OR DEACCESS ERROR FOR NETWORK.T;KNTAERR:F7 BIC #1,(R4) ; CLEAR INTERLOCK BIT, LEAVING SECOND LUN#, ; WORD UNCHANGED FROM ORIGINAL VALUE.;N; NON ACP FUNCTION;FN0BF: RETURN;S$; NETWORK ACCESS AND DEACCESS STUBS.;PNTACC: TST 12(SP) ; DID ACCESS FAIL?0( BLT NTAERR ; YES, HANDLE ACCESS ERROR.: MOV #$XXWIN,(R4) ; SET UP REFERENCE TO FAKE WINDOW BLOCK. RETURNFNTDEA: TST 12(SP) ; DID ACCESS FAIL? ( BLT NTAERR ; YES, HANDLE ACCESS ERROR.3 CLR (R4) ; DELETE REFERENCE TO FAKE WINDOW BLOCK.R( MOV R3,-(SP) ; SAVE I/O PACKET ADDRESS. MOV R3,R1 ; PASS IT TO XXDET.N& MOV I.UCB(R3),R5 ; PASS UCB TO XXDET.1 JSR PC,XXDET ; CALL XXDET TO DELETE ACB, IF ANY.E+ MOV (SP)+,R3 ; RESTORE I/O PACKET ADDRESS.B RETURNT;:3; PROCESS ACCESS OR DEACCESS ERROR FOR FILE ACCESS.S;AFNAERR:S7 BIC #1,(R4) ; CLEAR INTERLOCK BIT, LEAVING SECOND LUNN, ; WORD UNCHANGED FROM ORIGINA003r D%B11110010L VALUE. BR FNACP ; JOIN COMMON CODE.;S; FINISH ACCESS FILE FUNCTION4;;FNACC: TST 12(SP) ; DID ACCESS FAIL?( BLT FNAERR ; YES, HANDLE ACCESS ERROR.8 MOV #$XXWIN,(R4) ;SET UP REFERENCE TO FAKE WINDOW BLOCK BR FNACP ;JOIN COMMON CODE;A ; FINISH DEACCESS FILE FUNCTIONS; FNDEA: TST 12(SP) ; DID ACCESS FAIL?( BLT FNAERR ; YES, HANDLE ACCESS ERROR.1 CLR (R4) ;DELETE REFERENCE TO FAKE WINDOW BLOCK); ; FINSH ACP FUNCTION;IFNACP:% MOV I.PRM(R3),R1 ;IS THERE A BUFFER?I BEQ ACPDON ;IF EQ NO J MOV R1,KISAR6 ;MAP CPR BUFFER; ; COPY FNB IF THERE IS ONE;T' MOV I.PRM+16(R3),R2 ;GET OFFSET OF FNBR BEQ COPFID ;IF EQ NONE! MOV #15.*2,R0 ;GET LENGHT OF FNBE+ CALL COPPRM ;COPY FNB INTO USER'S BUFFER C;O; COPY FID IF THERE IS ONE;ICOPFID:O! TST I.PRM+2(R3) ;IS THERE A FID?A BEQ COPATR ;IF EQ NO MOV #3.*2,R0 ;LENGHT OF FID MOV #4,R2 ;OFFSET TO FID0 CALL COPPRM ;COPY FID BACK INTO USER'S BUFFER ;I; COPY UPDATED ATTRIBUTES ; 4COPATR: MOV I.PRM+6(R3),R1 ;GET OFFSET OF ATTRIBUTES BEQ COPDON ;IF EQ NONE, BIS #MAP6,R1 ;MAKE SURE IT'S A APR6 ADDRESS 10$: TSTB (R1)+ ;TEST ATTRIBUTE BEQ 40$ ;IF EQ, NONE 5/ BGT 20$ ;IF GT ZERO, IT WAS A WRITE ATTRIBUTEN CLR R0 ;TO BE SAFE MOVB (R1)+,R0 ;GET LENGTH CMPB R0,#MXSIZ ;IS IT TOO BIG' BHI 30$ ;IF HI YES, COPY ALREADY DONE  TST (R1)+ ;SKIP PAST BIASD& MOV (R1)+,R2 ;GET OFFSET TO ATTRIBUTE- MOV R1,-(SP) ;SAVE POINTER TO ATTRIBUTE LISTY CALL COPPRM ;COPY PARAMETERR MOV (SP)+,R1 ;RESTORE POINTER BR 10$ ;GET NEXT ATTRIBUTE20$: INC R1 ;SKIP PAST LENGTH+30$: CMP (R1)+,(R1)+ ;SKIP PAST BIAS/OFFSETT BR 10$ ;GET NEXT ATTRIBUTE40$: COPDON:I;T; DEALLOCATE BUFFER ;R, MOV I.PRM(R3),R0 ;GET BIAS OF CPRBUF PACKET& MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS CALL $CPDEA ;DEALLOCATE PACKET) MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESSMACPDON: RETURN;FB; COPPRM - COPY PIECE OF CPR BUFFER BACK INTO USER'S ADDRESS SPACE;L(; INPUTS: R0 - LENGHT OF BUFFER IN BYTES6; R2 - OFFSET OF SOURCE BUFFER FROM TOP OF CPR BUFFER:; DESTINATION BIAS AND DISPLACEMENT MUST BE LOCATED AFTER; THE INDICATED BUFFER ;T; OUTPUT: BUFFER IS COPIED; R3 IS PRESERVED;BCOPPRM:R" MOV I.PRM(R3),R1 ;GET SOURCE BIAS& MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS1 MOV R2,R4 ;GET BIAS OFFSET PAIR FOR DESTINATIONM' BIS #MAP6,R4 ; ADD IN OFFSET TO BUFFER" ADD R0,R4 ; AND LENGHT OF BUFFER# MOV (R4)+,R3 ;GET DESTINATION BIASA MOV (R4),R4 ; AND OFFSET ADD #MAP5,R2 ;GET SOURCE OFFSET CALL $BLXIO ;PERFORM COPY ) MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESS  RETURNA .ENDST BE LOCATED AFTER; THE INDICATED BUFFER ;T; OUTPUT: BUFFER IS COPIED; R3 IS PRESERVED;BCOPPRM:R" MOV I.PRM(R3),R1 ;GET SOURCE BIAS& MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS1 MOV R2,R4 ;GET BIAS OFFSET PAIR FOR DESTINATIONM' BIS #MAP6,R4 ; ADD IN OFFSET TO BUFFER" ADD R0,R4 ; AND LENGHT OF BUFFER# MOV (R4)+,R3 ;GET DESTINATION BIASA MOV (R4),R4 ; AND OFFSET ADD #MAP5,R2 ;GET SOURC .TITLE XXPRE  .IDENT /01.00/?;e6; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;e<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;e; K. L. NOEL 17-MAR-87;e.; PREPROCESSOR MODULE FOR NON TERMINAL DEVICES;d;a .PAGE;S; LOCAL SYMBOL DEFINITION ;n/ MAP5 = 120000 ; ADDRESS OF FIRST WORD IN APR5t. MAP6 = 140000 ; ADDRESS OF FIRST WORD IN APR6;m; GLOBAL SYMBOL DEFINITION;.7 MXSIZ == 0 ; MAXIMUM SIZE OF ATTRIBUTE TO GO IN CPRBUF7 ; ALSO USED IN MODULE XXFIN. .PAGE;+; "; I/O FUNCTION CODE DISPATCH TABLE;U;- DSPTBL: .WORD FC0BF ; 0 IO.KIL .WORD FC1BF ; 1 IO.WLB  .WORD FC1BF ; 2 IO.RLB .WORD FCATT ; 3 IO.ATT .WORD FC0BF ; 4 IO.DETO .WORD FC0BF ; 5 ? .WORD FC0BF ; 6 ? .WORD FC0BF ; 7 IO.CLN" .WORD FCIFC ;10-ILLEGAL FUNCTION- .WORD FCPKT ;11-FIND FILE NAME IN DIRECTORYS. .WORD FCIFC ;12-UNLOCK BLOCK - NOP'D IN MA00rTADATADATADATADATADATADATADATADATASK1 .WORD FCPKT ;13-REMOVE FILE NAME FROM DIRECTORYN. .WORD FCPKT ;14-ENTER FILE NAME IN DIRECTORY& .WORD FCACC ;15-ACCESS FILE FOR READ0 .WORD FCACC ;16-ACCESS FILE FOR READ AND WRITE6 .WORD FCACC ;17-ACCESS FILE FOR READ, WRITE, AND EXT .WORD FCDAC ;20-DEACCESS FILE$ .WORD FC1BF ;21-READ VIRTUAL BLOCK% .WORD FC1BF ;22-WRITE VIRTUAL BLOCKD .WORD FCEXT ;23-EXTEND FILEF .WORD FCCRE ;24-CREATE FILEO4 .WORD FCDEL ;25-MARK FILE FOR DELETE/TRUNCATE FILE& .WORD FCPKT ;26-READ FILE ATTRIBUTES' .WORD FCPKT ;27-WRITE FILE ATTRIBUTESE/ .WORD FCPKT ;30-USER MAGTAPE CONTROL FUNCTIONC* .WORD NTWVB ;31-TRANSMIT PROCESS MESSAGE) .WORD NTRVB ;32-RECEIVE PROCESS MESSAGED$ .WORD NTACC ;33-CONNECT TO PROCESS) .WORD NTDAC ;34-DISCONNECT FROM PROCESS-* .WORD NTNCT ;35-NETWORK CONTROL FUNCTION" .WORD FCIFC ;36-ILLEGAL FUNCTION" .WORD FCIFC ;37-ILLEGAL FUNCTION .PAGE;F; ILLEGAL FUNCTION;0FCIFC: .WORD IEIFC ;SET ILLEGAL FUNCTION STATUS;O; ATTACH PROCESSINGL;TFCATT:2 .WORD SETRSW ; BLOCK TASK TO APPEAR SYNCHRONOUS.1 .WORD CK0XT ; EXIT WITH 0 BUFFERS IN FLAG BYTE.W; "; NON ACP FUNCTION WITH NO BUFFERS;R4FC0BF: .WORD CK0XT ;EXIT WITH 0 BUFFER IN FLAG BYTE;C"; NON ACP FUNCTION WITH ONE BUFFER;E4FC1BF: .WORD CK1XT ;EXIT WITH 1 BUFFER IN FLAG BYTE;I8; ACCESS FILE FOR READ, READ/WRITE, OR READ/WRITE/EXTEND;EFCACC:4 .WORD CKALN ;CHECK IF FILE ALREADY ACCESSED ON LUN" .WORD BDPKT ;BUILD AN I/O PACKET .WORD CKLHD ;LOCK DOWN HEADERL! .WORD CKRLK ;SYNCHRONIZE ACCESSK< .WORD CK1XC ;EXIT CONDITIONALLY WITH 1 BUFFER IN FLAG BYTE;N; DEACCESS FILE;O2FCDAC: .WORD CKNLN ;CHECK IF FILE ACCESSED ON LUN" .WORD BDPKT ;BUILD AN I/O PACKET .WORD CKLHD ;LOCK DOWN HEADERU! .WORD CKRLK ;SYNCHRONIZE ACCESS < .WORD CK1XC ;EXIT CONDITIONALLY WITH 1 BUFFER IN FLAG BYTE;E ; CREATE FILE/'; CREATE & ACCESS NOT LEGAL COMBINATIONK-; CREATE & EXTEND DOES NOT INCR PENDING COUNT ; SINCE NO WINDOW;.FCCRE:4 .WORD CKALN ;CHECK IF FILE ALREADY ACCESSED ON LUNFCDEL:FCEXT:; C; BUILD AN I/O PACKET FOR FIND, ENTER, REMOVE, EXTEND, DELETE, READ"; ATTRIBUTES, AND WRITE ATTRIBUTES;CFCPKT:" .WORD BDPKT ;BUILD AN I/O PACKET .WORD CKLHD ;LOCK DOWN HEADERE8 .WORD CK1XC ;EXIT CONDITIONALY WITH ONE BUFFER IN BYTE;DF; TABLE OF SPECIAL FUNCTION CODES TO BE CHECKED BY SOFTWARE WRITE LOCK; WLKTB: ;DEVICE DEPENDENT CODESN! .WORD IO.SMD ;SET MEDIA DENSITYS! .WORD IO.EOF ;WRITE END OF FILED .WORD IO.ERS ;ERASE TAPE# .WORD IO.DSE ;DATA SECURITY ERASE ;DIAGNOSTIC CODESE% .WORD IO.WDH ;WRITE DATA AND HEADERT& .WORD IO.WTD ;WRITE TRACK DESCRIPTOR0 .WORD IO.TDD ;WRITE TRACK DESCRIPTOR DISPLACED' .WORD IO.CEW ;WRITE BLOCK ON CE TRACK.* .WORD 0 ;TERMINATOR FOR WRITE LOCK TABLE,NTWVB: ; NETWORK SEND AND SEND INTERRUPT.+ .WORD CKNLN ; ENSURE FILE IS OPEN ON LUN.$ .WORD PRMPRP ; PREPARE PARAMETERS.2 .WORD CKBFR1 ; CHECK BUFFER ONE FOR READ ACCESS.. .WORD CK1XT ; INDICATE ONE BUFFER AND LEAVE.NTRVB: ; NETWORK RECEIVE.+ .WORD CKNLN ; ENSURE FILE IS OPEN ON LUN. $ .WORD PRMPRP ; PREPARE PARAMETERS.3 .WORD CKBFW1 ; CHECK BUFFER ONE FOR WRITE ACCESS.C. .WORD CK1XT ; INDICATE ONE BUFFER AND LEAVE.'NTACC: ; NETWORK ACCEPT AND CONNECT.O. .WORD CKALN ; ENSURE NO FILE IS OPEN ON LUN.$ .WORD PRMPRP ; PREPARE PARAMETERS.MERGE: ; MERGE FROM REJECT.2 .WORD CKBFR2 ; CHECK BUFFER TWO FOR READ ACCESS.2 .WORD CKBFR1 ; CHECK BUFFER ONE FOR READ ACCESS.9 .WORD ACSPL ; HANDLE SPECIAL ACCEPT/CONNECT PROCESSING..! .WORD CKLHD ; LOCK DOWN HEADER.E .WORD CKRLK ; INTERLOCK.* .WORD CKNXT ; EXIT WITH SEVERAL BUFFERS.2NTDAC: ; NETWORK ABORT, DISCONNECT, AND REJECT.+ .WORD CKNLN ; ENSURE FILE IS OPEN ON LUN.R$ .WORD PRMPRP ; PREPARE PARAMETERS.; .WORD ADRSPL ; DO SPECIAL ACCEPT/DISCONNECT/REJECT STUFF.R) ; REJECT GOES TO MERGE AT THIS POINT..2 .WORD CKBFR1 ; CHECK BUFFER ONE FOR READ ACCESS.! .WORD CKLHD ; LOCK DOWN HEADER.  .WORD CKRLK ; INTERLOCK.00r% D%B11110010. .WORD CK1XT ; INDICATE ONE BUFFER AND LEAVE.6NTNCT: ; NETWORK CLOSE, GET LOCAL NODE INFORMATION,. ; GET NETWORK DATA, OPEN, AND SPECIFY AST.2 .WORD NCTSPL ; SEPARATE PROCESSING AS NECESSARY.) ; GET NETWORK DATA AND GET LOCAL NODEN ; INFORMATION TO GO NTRVB.0 ; OPEN AND CLOSE FALL THROUGH, ANYTHING ELSE ; GOES TO SKIP." .WORD INSTSK ; INSERT TASK NAME.! .WORD CKLHD ; LOCK DOWN HEADER.E .WORD CKRLK ; INTERLOCK.SKIP:D. .WORD CK0XT ; INDICATE NO BUFFERS AND LEAVE. .PAGEXXPRE::N SAVNR7 MOV R1,-(SP) ;SAVE I/O PACKET ADDRESS FOR ERROR RETURNC5 CLR -(SP) ;SAVE ADDRESS OF CPRBUF PACKET FOR ERRORS - MOV SP,$TEMP0 ;REMEMBER WHERE THE STACK GOESI;A0; PREPARE REGISTERS FOR POLISH DISPATCH ROUTINES;D) MOV R1,R4 ;PUT I/O PACKET ADDRESS IN R4P0 MOVB I.FCN+1(R1),R2 ;RETRIEVE I/O FUNCTION CODE ASL R2 ;CONVERT TO WORD INDEXS3 MOV R5,-(SP) ;SAVE UCB ADDRESS FOR POLISH ROUTINES. MOV R5,R0 ;N5 MOV I.LN2(R4),R1 ;SAVE ADDRESS OF SECOND LUN WORDN" MOV R1,-(SP) ;FOR POLISH ROUTINES0 MOV DSPTBL(R2),R5 ;GET ADDRESS OF POLISH VECTOR$ JMP @(R5)+ ;EXECUTE POLISH ROUTINE;C; REGISTERS AT POLISH DISPATCH;T ; R0 - UCB; R1 - ADDRESS 2ND LUN WORD; R2 - FCTN CODE; R4 - POINTER TO I/O PACKET;D; SP-> 2ND LUN WORD ADDRESS ; UCB ADDRESS;VK; TASK HEADER IS ASSUMED TO BE MAPPED FOR ALL OF THE THREADED CODE ROUTINESS;M;R(; CHECK FOR FILE ALREADY ACCESSED ON LUN;.(CKALN: TST (R1) ;FILE ACCESSED ON LUN? BEQ CKJR5 ;IF EQ NOW JMP IEALN ;ERROR;P ; CHECK FOR FILE ACCESSED ON LUN;E(CKNLN: TST (R1) ;FILE ACCESSED ON LUN? BNE CKJR5 ;IF NE YES JMP IENLN ;ERROR; ; SET ACCESS/DEACCESS INTERLOCKA;E9CKRLK: INC @(SP) ;SET ACCESS/DEACCESS PENDING INTERLOCKKCKJR5: JMP @(R5)+N)PRMPRP: ; PREPARE NETWORK PARAMETERS.E8 MOV I.PRM+12(R4),I.PRM+16(R4) ; WILL BE ADJUSTED LATER. MOV I.PRM+10(R4),I.PRM+14(R4) MOV I.PRM+6(R4),I.PRM+12(R4) MOV I.PRM+4(R4),I.PRM+6(R4) MOV I.PRM+2(R4),I.PRM+4(R4) JMP @(R5)+ ; LEAVE. .ENABL LSB .CKBFR2: ; CHECK BUFFER TWO FOR READ ACCESS.0 MOV #I.PRM+6,R3 ; SET OFFSET TO SECOND ADDRESS. BR 10$N.CKBFR1: ; CHECK BUFFER ONE FOR READ ACCESS.- MOV #I.PRM,R3 ; SET OFFSET TO FIRST ADDRESS.E10$: ADD R4,R3 ; POINT TO ADDRESS. MOV R1,-(SP) ; SAVE REGISTERS. MOV R0,-(SP)M% MOV (R3),R0 ; GET ADDRESS TO CHECK.A MOV 4(R3),R1 ; GET LENGTH.( BEQ 50$ ; YES, ACCEPT IT.6- CALL CKBFR ; CHECK BUFFER FOR WRITE ACCESS.)! BCS IER0 ; ERROR CODE IS IN R0.P" MOV R1,(R3)+ ; PUT APR IN PACKET.% MOV R2,(R3) ; PUT OFFSET IN PACKET.A50$:" MOV (SP)+,R0 ; RESTORE REGISTERS. MOV (SP)+,R1 JMP @(R5)+ ; LEAVE.C .DSABL LSBN .ENABL LSBS1CKBFW3: ; CHECK BUFFER THREE FOR WRITE ACCESS.0 ; THIS IS CUSTOMIZED FOR THE NETWORK DEVICE.0 MOV #I.PRM+14,R3 ; SET OFFSET TO THIRD ADDRESS. MOV R1,-(SP) ; SAVE REGISTER.) MOV I.PRM+16(R4),R1 ; GET LENGTH TO USE.,$ CMP R1,#20 ; IS LENGTH ACCEPTABLE? BHI IEBAD ; NO, SIGNAL ERROR.  CMP I.PRM+12(R4),#20P" ; IS SECOND LENGTH ACCEPTABLE? BHI IEBAD ; NO, SIGNAL ERROR.A@ ADD R1,I.PRM+4(R4) ; HACK FIRST LENGTH TO INCLUDE THIRD BUFFER. ADD I.PRM+12(R4),I.PRM+4(R4) + ; HACK FIRST LENGTH TO REPRESENT TOTAL.E8 MOVB R1,I.PRM+13(R4) ; COMBINE TWO LENGTHS IN ONE WORD. BR 10$K/CKBFW1: ; CHECK BUFFER ONE FOR WRITE ACCESS. - MOV #I.PRM,R3 ; SET OFFSET TO FIRST ADDRESS.I MOV R1,-(SP) ; SAVE REGISTER.( MOV I.PRM+4(R4),R1 ; GET LENGTH TO USE.10$: ADD R4,R3 ; POINT TO ADDRESS.P MOV R0,-(SP) ; SAVE REGISTER.% MOV (R3),R0 ; GET ADDRESS TO CHECK.O TST R1 ; IS LENGTH ZERO? BEQ 50$ ; YES, ACCEPT IT. - CALL CKBFB ; CHECK BUFFER FOR WRITE ACCESS.R! BCS IER0 ; ERROR CODE IS IN R0.O" MOV R1,(R3)+ ; PUT APR IN PACKET.% MOV R2,(R3) ; PUT OFFSET IN PACKET..50$:" MOV (SP)+,R0 ; RESTORE REGISTERS. MOV (SP)+,R1S JMP @(R5)+ ; LEAVE.T .DSABL LSBR%ACSPL: ; SPLIT ACCEPT AND CONNECT.EA BIT #10,I.FCN(R4) ; IS THIS AN ACCEPT (FUNCTION 15410 OR 15610)?O) BNE 10$ ; YES, SKIP CONNECT PROCESSING.S*00r-TADATADATADATADATADATADATADATADATA MOV #1,R1 ; LIE ABOUT NUMBER OF BUFFERS.3 JMP CKBFW3 ; CHECK BUFFER THREE FOR WRITE ACCESS. 10$:$ MOV #11,R1 ; INDICATE TWO BUFFERS. JMP @(R5)+ ; LEAVE.E1ADRSPL: ; SPLIT ABORT, DISCONNECT, AND REJECT.E CMP #16020,I.FCN(R4)  ; IS THIS A REJECT? BNE 10$ ; NO, CONTINUE.I5 MOV #MERGE,R5 ; YES, SEND EXECUTION TO NEW LOCATION. 10$: JMP @(R5)+ ; LEAVE.E-NCTSPL: ; SPLIT NETWORK CONTROL FUNCTIONS. & MOV I.FCN(R4),R1 ; GET FUNCTION CODE.9 BIC #177707,R1 ; EXTRACT THREE BITS INDICATING FUNCTION.B ASR R1R ASR R1R7 TST NCTTBL(R1) ; IS THERE A SPECIAL LOCATION TO GO TO? BEQ 10$ ; NO, CONTINUE.T# MOV NCTTBL(R1),R5 ; YES, FETCH IT.E10$: JMP @(R5)+ ; LEAVE. NCTTBL:  .WORD 0 ; 00, OPEN .WORD 0 ; 10, CLOSES .WORD SKIP ; 20, SPECIFY AST$ .WORD NTRVB ; 30, GET NETWORK DATA$ .WORD NTRVB ; 40, GET NETWORK DATA$ .WORD NTRVB ; 50, GET NETWORK DATA .WORD FCIFC ; 60. .WORD NTRVB ; 70, GET LOCAL NODE INFORMATION;.; INSERT TASK NAME.X;CINSTSK:I MOV I.TCB(R4),R1 ; FIND TCB.< MOV T.NAM(R1),I.PRM+4(R4) ; PUT NAME IN PARAMETERS 3 AND 4. MOV T.NAM+2(R1),I.PRM+6(R4) ; JMP @(R5)+ ; CONTINUE.Y;E; ERROR ROUTINES;@;)F; FUNCTION IS AN ILLEGAL FUNCTION-DECLARE ILLEGAL FUNCTION CODE STATUS;O0IEIFC: MOV #IE.IFC&377,R4 ;SET ILLEGAL FUNCTION JMP IECMN;.@; ILLEGAL BUFFER ADDRESS SPECIFIED-DECLARE ILLEGAL BUFFER STATUS;A2IESPC: MOV #IE.SPC&377,R4 ;SET ILLEGAL BUFFER CODEIECOM: BR IECMN ;; 9; ILLEGAL BYTE COUNT OR ALIGNMENT-DECLARE ODD BYTE STATUS ;..IEBYT: MOV #IE.BYT&377,R4 ;SET ODD BYTE STATUS BR IECMN ;;T:; NO BUFFER SPACE AVAILABLE-SET NO BUFFER AVAILABLE STATUS;R7IENOD: MOV #IE.NOD&377,R4 ;SET NO BUFFER AVAILABLE CODEL BR IECMN ;;N(; BAD PARAMETER-SET BAD PARAMETER STATUS;41IEBAD: MOV #IE.BAD&377,R4 ;SET BAD PARAMETER CODEF BR IECMN ;;D4; PRIVILEGE VIOLATION-SET PRIVILEGE VIOLATION STATUS;37IEPRI: MOV #IE.PRI&377,R4 ;SET PRIVILEGE VIOLATION CODE BR IECMN ;;O?; FILE ALREADY ACCESSED ON LUN-SET FILE ALREADY ACCESSED STATSU7; 9IEALN: MOV #IE.ALN&377,R4 ;SET FILE ALREADY ACCESSED CODEV BR IECMN ;;E5; NO FILE ACCESSED ON LUN-SET NO FILE ACCESSED STATUST; 6IENLN: MOV #IE.NLN&377,R4 ;SET NO FILE ACCESSED STATUS BR IECOM ;;E ; RANDOM ERROR WITH STATUS IN R0;7IER0: MOV R0,R4 D;; COMMON ERROR EXIT ;V)IECMN: MOV $TEMP0,SP ;RESET STACK POINTERS6 MOV (SP)+,R0 ;RETRIEVE ADDRESS OF SECONDARY CONTROL B BEQ 10$ ;IF EQ NONE' CALL $CPDEA ;DEALLOCATE CPRBUF PACKETF%10$: MOV R4,R0 ;SET FINAL I/O STATUSL& CLR R1 ;CLEAR SECOND I/O STATUS WORD- MOV (SP)+,R3 ;RETRIEVE ADDRESS OF I/O PACKETC' MOV I.UCB(R3),R5 ;RETRIEVE UCB ADDRESST SEC ;INDICATE ERROR RETURN ;N; BUILD AN I/O PACKET; BDPKT:;; SPREAD OUT PARAMETERSS; 0 MOV I.PRM+12(R4),I.PRM+16(R4) ;COPY FNB ADDRESS' MOV I.PRM+10(R4),I.PRM+14(R4) ;COPY P5E' MOV I.PRM+6(R4),I.PRM+12(R4) ;COPY P4 ' MOV I.PRM+4(R4),I.PRM+10(R4) ;COPY P3 ; MOV I.PRM+2(R4),I.PRM+6(R4) ;COPY ATTRIBUTE LIST POINTERM, CLR I.PRM+4(R4) ;ASSUME NO BUFFER LENGTH. MOV I.PRM(R4),I.PRM+2(R4) ;COPY FID POINTER( CLR I.PRM(R4) ;ASSUME NO BUFFER BIAS; &; DETERMINE SIZE OF BUFFER TO ALLOCATE;R, CLR -(SP) ;SET COUNT OF ATTRIBUTES TO ZERO+ MOV KISAR6,-(SP) ;SAVE TASK HEADER MAPPING& MOV R4,-(SP) ;SAVE I/O PACKET POINTER2 CLR -(SP) ;SET SIZE OF CPRBUF ALLOCATION TO ZERO! TST I.PRM+2(R4) ;IS THERE A FID?Y BEQ 10$ ;IF EQ NO)9 ADD #3.*2+4,(SP) ;ACCOUNT FOR 3 WORD BUFFER PLUS ADDRESSO'10$: TST I.PRM+16(R4) ;IS THERE AN FNB?R BEQ 20$ ;IF EQ NOE: ADD #15.*2+4,(SP) ;ACCOUNT FOR 15 WORD BLOCK PLUS ADDRESS20$:;R-; CALCULATE SIZE OF ALL THE ATTRIBUTE BUFFERSI;O2 MOV I.PRM+6(R4),R3 ;GET ADDRESS OF ATTRIBUTE LIST BEQ 70$ ;IF EQ NONE S.30$: MOV R3,R0 ;GET ADDRESS OF NEXT ATTRIBUTE" MOV #4,R1 ;SET SIZE OF ATTRIBUTE1 CALL $ACHCK ;ADDRESS CHECK ATTRIBUTE DESCRIPTORI BCS IESPC ;IF CS ERROR CALL $RELOM ;RELOCATE AND MAP.$ ADD #4,R3 ;POINT TO NEXT ATTRIBUTE# T00r5 D%B11110010STB (R0)+ ;IS THERE AN ATTRIBUTEI BEQ 40$ ;IF EQ NOQ ADD #6,(SP) ;INCLUDE ATTRIBUTE4 INC 6(SP) ;INCREMENT NUMBER OF ATTRIBUTES COUNTER CLR R2 ;GET SIZE OF ATTRIBUTE  MOVB (R0),R2 ;4 CMP R2,#MXSIZ ;IS IT TOO BIG TO GO INTO THE BUFFER? BHI 30$ ;IF HI OR SAME, YESM& ADD R2,(SP) ;INCLUDE IT IN THE TOTAL BR 30$ ;LOOK AT NEXT ATTRIBUEU/40$: ADD #2,(SP) ;ACCOUNT FOR END OF LIST WORDP%70$: MOV (SP)+,R1 ;GET SIZE OF BUFFERR) MOV (SP)+,R4 ;RECOVER I/O PACKET POINTERT. MOV (SP)+,KISAR6 ;RECOVER TASK HEADER MAPPING# TST R1 ;WAS ANY BUFFER NECESSARY?# BNE 75$ ;YES, CONTINUE+ TST (SP)+ ;CLEAN STACK OF ATTRIBUTE COUNTS BR NOBUF ;NO BUFFER ,75$: ADD #4,R1 ;ACCOUNT FOR INITIAL 4 BYTES7 MOV R1,I.PRM+4(R4) ;SET LENGTH OF BUFFER IN I/O PACKETI;I; ALLOCATE A BUFFER FROM CPRBUFC;E,80$: ADD #77,R1 ;ROUND SIZE TO NEAREST 32.  ASH #-6,R1 ; WORD BLOCKC CLR R0 ;NO FLAGS, CALL $CPALO ;ALLOCATE A BUFFER FROM CPRBUF$ BCS IENOD ;IF CS ALLOCATION FAILED# MOV R0,@$TEMP0 ;SAVE BIAS ON STACK . MOV R0,I.PRM(R4) ;PUT BIAS IN FIRST PARAMETER% MOV KISAR6,R1 ;SAVE TASK HEADER BIASP MOV R0,KISAR6 ;MAP BUFFER. MOVB (SP)+,MAP6+1 ;SAVE NUMBER OF ATTRIBUTES ! MOV R1,KISAR6 ;REMAP TASK HEADERV0 MOV #MAP6+4,R3 ;POINT TO THIRD WORD FOR BUFFERS; ; BUILD FID ;B1 MOV I.PRM+2(R4),R0 ;SET ADDRESS OF FILE ID BLOCKE BEQ 90$ ;IF EQ NONE#D MOV #100000,I.PRM+2(R4);INDICATE THAT FID EXISTS (OFFSET 4 IMPLIED)* MOV #3*2,R1 ;SET LENGTH OF FILE ID BLOCK# CALL INPRMW ;INSERT FILE ID BLOCKI90$:;C; BUILD FILE NAME BLOCKT;A4 MOV I.PRM+16(R4),R0 ;SET ADDRESS OF FILE NAME BLOCK BEQ 100$ ;IF EQ NONE0 MOV R3,I.PRM+16(R4) ;PUT OFFSET INTO I/O PACKET2 BIC #MAP6,I.PRM+16(R4) ;GET RID OF APR6 BIAS BITS- MOV #15.*2,R1 ;SET LENGTH OF FILE NAME BLOCK% CALL INPRMW ;INSERT FILE NAME BLOCKS100$:E;O; BUILD ATTRIBUTE POINTER BLOCKQ;NEATRBK: MOV I.PRM+6(R4),R0 ;GET ADDRESS OF ATTRIBUTE DESCRIPTOR BLOCK % BEQ NOATTR ;NOT SPECIFIED? IF EQ NOO/ MOV R3,I.PRM+6(R4) ;PUT OFFSET INTO I/O PACKET1 BIC #MAP6,I.PRM+6(R4) ;GET RID OF APR6 BIAS BITS; MOV KISAR6,-(SP) ;SAVE MAPPINGQ% MOV I.PRM(R4),KISAR6 ;MAP CPR BUFFER)+ MOVB MAP6+1,R1 ;GET NUMBER OF ATTRIBUTESM BEQ 25$ ;IF EQ NULL LIST910$: MOV R1,-(SP) ;SAVE NUMBER OF ATTRIBUTES ON THE STACK % MOV #4,R1 ;COPY 4 WORDS INTO PACKETE( MOV R0,-(SP) ;SAVE ADDRESS OF ATTRIBUTE* CALL INPRM ;INSERT ATTRIBUTE INTO PACKET, SUB #6,R3 ;BACK UP TO ADDRESS OF ATTRIBUTE& MOVB -1(R3),R0 ;GET SIZE OF ATTRIBUTE CMPB R0,#MXSIZ ;IS IT TOO BIG?E BLO 20$ ;IF LO YES' MOV (R3),R0 ;GET ADDRESS OF ATTRIBUTEK CALL $RELOC ;RELOCATE IT MOV R1,(R3) ;SAVE BIAS MOV R2,2(R3) ; AND DISPLACEMENT,20$: CMP (R3)+,(R3)+ ;MOVE R3 PAST ADDRESSES+ MOV (SP)+,R0 ;RESTORE ADDRESS OF ATTRIBUTET& ADD #4,R0 ;ADDRESS OF NEXT ATTRIBUTE, MOV (SP)+,R1 ;GET NUMBER OF ATTRIBUTES LEFT1 SOB R1,10$ ;LOOP UNTIL ALL ATTRIBUTES ARE DONEI225$: CLR (R3)+ ;INCLUDE ZERO WORD FOR END OF LIST;#; INSERT ATTRIBUTES INTO THE BUFFERE;C1 MOV I.PRM+6(R4),R2 ;GET OFFSET OF ATTRIBUTE LISTS$ ADD #MAP6,R2 ;POINT FIRST ATTRIBUTE K-30$: TSTB (R2)+ ;IS THERE AN ATTRIBUTE HERE?V BEQ 40$ ;IF EQ NO  MOVB (R2)+,R1 ;GET LENGTH* CMPB R1,#MXSIZ ;IS IT TOO BIG FOR BUFFER? BLO 35$ ;IF LO NOS0 CMP (R2)+,(R2)+ ;MOVE POINTER TO NEXT ATTRIBUTE BR 30$ ;LOOK AT NEXT ATTRIBUTE I+35$: MOV (R2),R1 ;GET ADDRESS OF ATTRIBUTER7 MOV KISAR6,(R2)+ ;PUT BIAS/OFFSET IF ATTRIBUTE IN LISTR MOV R3,(R2)+ ;( MOV R2,-(SP) ;SAVE POINTER TO ATTRIBUTE CALL INPRM ;COPY ATTRIBUTE MOV (SP)+,R2 ;RESTORE POINTER BR 30$ ;LOOK AT NEXT ATTRIBUTE(40$: MOV (SP)+,KISAR6 ;REMAP TASK HEADERNOATTR:INOBUF: JMP @(R5)+);10; INPRM: INSERT PARAMETERS WITH NO ADDRESS CHECK<; INPRMW,INPRMB: INSERT PARAMETER BLOCK WORD OR BYTE ALIGNED; 8; INPUTS : R0 - ADDRESS OF BLOCK IN USER'S ADDRESS SPACE; R1 - LENGTH OF BLOCK/; R3 - POINTER INTO CPR BUFFER (APR6 ADDRESS)T; 8; OUTPUT: R0 - OFFSET INTO CPR BUFFER OF START OF BLOCK0; R3 - UPDATED TO POINTER AFTER IN00r=tCTADATADATADATADATADATADATADATADATASERTED BLOCK; R4 IS PRESERVEDS;E .ENABL LSBBINPRM: SAVNR ;SAVE R4,R5 E* MOV I.PRM(R4),-(SP) ;SAVE BIAS OF CPRBUF$ MOV R1,-(SP) ;SAVE LENGTH OF BUFFER BR 5$ ;JOIN COMMON CODEW1INPRMW: MOV #$CKBFW,R2 ;CKECK BUFFER WORD ALIGNEDE BR 2$ ;CALL ROUTINEA1INPRMB: MOV #$CKBFB,R2 ;CHECK BUFFER BYTE ALIGNEDR2$: SAVNR ;SAVE R4,R5-&; DO ADDRESS CHECK AND RELOCATE BUFFER) MOV I.PRM(R4),-(SP) ;SAVE BIAS OF CPRBUF $ MOV R1,-(SP) ;SAVE LENGTH OF BUFFER1 MOV R2,-(SP) ;SET ADDRES OF BUFFER CHECK ROUTINEK+ CALL @(SP)+ ;CHECK AND LOCK USER'S BUFFERR BCS INERR ;IF CS ERROR!5$: CALL $RELOC ;RELOCATE BUFFERP .DSABL LSB,@; MAP CPRBUF AND COPY BIAS OFFSET INTO 2 WORDS AFTER DATA BUFFER MOV (SP)+,R0 ;RESTORE LENGTHL( MOV KISAR6,R5 ;SAVE TASK HEADER MAPPING MOV (SP),KISAR6 ;MAP CPRBUF/ MOV R3,R4 ;GET OFFSET OF 2 WORDS AFTER BUFFERE ADD R0,R4 ;L MOV R1,(R4)+ ;COPY BIAS MOV R2,(R4) ; AND OFFSET! MOV R5,KISAR6 ;REMAP TASK HEADER ; USE BLXIO TO DO COPY) SUB #MAP6-MAP5,R2 ;MAKE OFFSET FROM APR5+# MOV R3,R4 ;GET OFFSET INTO CPRBUFS! MOV (SP)+,R3 ;GET BIAS OF CPRBUFE CALL $BLXIO ;COPY BUFFER( MOV R4,R3 ;PUT UPDATED POINTER INTO R32 ADD #4,R3 ;PUDATE POINTER PAST RELOCATED ADDRESS RETURNLINERR:  JMP IESPC ;RETURN WITH ERROR;G+; LOCK HEADER IN MEMORY DURING ACP FUNCTIONG;O3CKLHD: MOV $TKTCB,R0 ;GET CURRENT TASK TCB ADDRESS,, MOV T.ATT(R0),R0 ;GET ATTACHMENT DESCRIPTOR6 INCB A.IOC-A.TCBL(R0) ;BUMP I/O COUNT FOR TASK REGION4 MOV A.PCB-A.TCBL(R0),R0 ;GET ADDRESS OF TASK REGION( INCB P.IOC(R0) ;BUMP REGION'S I/O COUNT; BISB #200,I.EFN(R4) ;FLAG REQUEST AS A VIRTUAL I/O REQUESTV JMP @(R5)+ ;;PG; SET .RSW IN TCB TO BLOCK TASK UNTIL OPERATION IS COMPLETE OR AT LEASTR0; PAST PORTION THAT NEEDS TO APPEAR SYNCHRONOUS.; SETRSW:E% MOV I.TCB(R4),R1 ; GET TCB ADDRESS.< BIS #TS.RSW,T.STAT(R1) ; BLOCK TASK TO MAKE IT SYNCHRONOUS.2 JMP @(R5)+ ; GO TO NEXT ENTRY IN DISPATCH TABLE.;RF; EXIT WITH EITHER ONE OR NO BITS SET IN THE FLAG WORD, OR THE WORD AS; SPECIFIED IN R1.; .ENABL LSBM$CKNXT: ; USE R1 FOR BUFFER FLAGS. MOV R1,R0 ; GET BUFFER FLAGS./# BR 10$ ; CONTINUE IN COMMON CODE.E)CK1XC: TST I.PRM(R4) ;IS THERE A BUFFER?  BNE CK1XT ;IF NE YESCK0XT: CLR R0 ;NO BUFFERS BR 10$ ;JOIN COMMON CODECK1XT: MOV #1,R0 ;ONE BUFFERG10$: .DSABL LSBB;#; CALCULATE LUN NUMBER ;K1 MOV I.LN2(R4),R3 ;GET POINTER TO 2ND LUN WORD , SUB #,R3 ;GET OFFSET INTO LUT- ASR R3 ;DIVIDE BY 4 (4 BYTES PER LUN ENTRY)E ASR R3 ;! INC R3 ;LUN NUMBERS START AT 18 MOVB R3,I.LN2(R4) ;RETURN TO LUN FIELD IN I/O PACKET;R; FILL IN BUFFER FLAGN;U MOVB R0,I.LN2+1(R4) ;:;S; EXIT POLISH TO FUNCTION EXIT;B. TST (SP)+ ;REMOVE ADDRESS OF SECOND LUN WORD# MOV (SP)+,R5 ;RETRIEVE UCB ADDRESSV' CMP (SP)+,(SP)+ ;CLEAN OFF ERROR STACK, MOV U.SCB(R5),R0 ;GET I/O QUEUE LISTHEAD MOV R4,R1 ;GET PACKET POINTERR CALLR $QINSP ;INSERT PACKETT .END O LUT- ASR R3 ;DIVIDE BY 4 (4 BYTES PER LUN E .TITLE XXTTIM .IDENT /01.00/R;;6; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;C<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;.;+; 03-MAR-87 KAREN NOEL;L;L;+;; ****** X X T T I ******O;A; THIS MODULE CONTAINS THE ROUTINES TO VALIDATE A NEW I/O REQUESTRH; FOR A TERMINAL. THE I/O REQUESTS ARE VALIDATED PRIOR TO PLACING THEM J; IN THE DEVICE'S I/O PACKET QUEUE. THIS MUST OCCUR WHILE THE USER TASK L; WHICH ISSUED THE REQUEST IS STILL THE CURRENT TASK. NEXT, THE REQUEST IS 1; PLACED IN THE REQUEST QUEUE FOR THE TERMINAL. N;A;-;B .MCALL PKTDF$,UCBDF$,TCBDF$ PKTDF$W UCBDF$ ,,1  TCBDF$I;S; LOCAL SYMBOL DEFINITIONS;O MAP6 = 140000.PAGE*, .SBTTL XXTTI - FUNCTION CODE DISPATCH TABLE;S?; DISPATCH TABLE FOR PROCESSING DIFFERENT FUNCTION CODES BEFORET%; ENTERING A PACKET IN THE I/O QUEUE.P;IQPDSP: .WORD 0 ;IO.KIL  .WORD QPWLB ;IO.00tE D%B11110010WLB  .WORD QPRLB ;IO.RLBE .WORD QPATT ;IO.ATTD .WORD QPDET ;IO.DETH! .WORD QPSPC ;SPECIAL FUNCTIONS:I ; IO.GTS ; SF.SMC ; SF.GMC .WORD QPHNG ;IO.HNGB/ .WORD 0 ;RESERVED EXEC CLOSE-OUT-LUN FUNCTION - .WORD 0 ;RESERVED FOR USER MODE DIAGNOSTICS .WORD QPRPR ;IO.RPRP .WORD QPRTT ;IO.RTT  .IF DF B$$MAP .WORD QPWSD ;IO.WSDT .WORD QPRSD ;IO.RSD  .ENDC ;B$$MAP .WORD 0 ;IO.EIOG.PAGE ; .SBTTL XXTTI - TERMINAL I/O REQUEST INITIATION ENTRY POINTW; ;+-; **-XXTTI - VALIDATE I/O PACKET ENTRY POINT..;DK; THIS ROUTINE IS CALLED FROM "XXDRV" WHEN A TASK HAS ISSUED AN I/O REQUEST K; FOR A TERMINAL. THE CALL IS MADE PRIOR TO QUEUEING THE I/O PACKET TO THEOK; SCB QUEUE SINCE TERMINALS HAVE THE "UC.QUE" BIT SET IN THEIR UCB'S. THISQJ; IS DONE WHILE THE TASK CONTEXT IS STILL VALID, SINCE MANY FUNCTIONS WILL?; NEED ADDITIONAL PARAMETER CHECKS NOT DONE BY THE EXECUTIVE. .;G ; INPUTS:*; R1 => I/O REQUEST PACKET TO BE PROCESSED&; R4 => SCB FOR THE REQUESTED TERMINAL&; R5 => UCB FOR THE REQUESTED TERMINAL;S; OUTPUTS: NONE.; "; REGISTERS MODIFIED: R0, R1, R3;-;SXXTTI::  SAVNR$ MOV R1,R3 ;COPY I/O PACKET POINTER/ MOVB I.FCN+1(R3),R0 ;GET THE I/O FUNCTION CODEL$ ASL R0 ;CONVERT IT TO A WORD INDEX3 CALLR @QPDSP(R0) ;DISPATCH TO PROCESS THIS REQUEST .PAGEN9 .SBTTL . BUFFER ADDRESS CHECKING AND RELOCATION ROUTINESN;D;+2; **-CKBFR - ADDRESS CHECK BUFFER FOR READ ACCESSE; **-CKBFRW - ADDRESS CHECK BUFFER FOR READ ACCESS AND WORD ALIGNMENT 8; **-CKBFB - ADDRESS CHECK BUFFER FOR READ/WRITE ACCESS;I; THESE ROUTINES PERFORM THE DESCRIBED ADDRESS CHECKING ON A USER BUFFER.,; ; INPUTS:%; R0 => USER BUFFER (VIRTUAL ADDRESS) ; R1 = LENGTH OF USER BUFFER ;O ; OUTPUTS: *; CC-C = 0 IF ADDRESS CHECK WAS SUCCESSFUL"; CC-C = 1 IF ADDRESS CHECK FAILED4; R0 = ERROR CODE FOR ADDRESS CHECK FAILURE REASON:.; "IE.SPC" IF SPECIFIED BUFFER LENGTH IS ZEROB; "IE.SPC" IF BUFFER NOT WORD ALIGNED OR EXEC ADDRESS CHECK FAILS6; "IE.BAD" IF BUFFER SIZE IS GREATER THAN 8128. BYTES-; R1 = BIAS OF RELOCATED USER BUFFER ADDRESSO5; R2 = DISPLACEMENT OF RELOCATED USER BUFFER ADDRESS ; ; REGISTERS MODIFIED: R0;-;U .ENABL LSB CKBFRW:G. BIT #1,R0 ;DOES BUFFER START ON ODD ADDRESS?4 BNE 910$ ;IF NE, YES...RETURN INVALID BUFFER ERRORCKBFR::A5 MOV #$CKBFR,-(SP) ;SET UP CALL FOR READ-ACCESS CHECKO BR 10$ ;SKIP TO COMMON CODEFCKBFB::H6 MOV #$CKBFB,-(SP) ;SET UP CALL FOR WRITE-ACCESS CHECK10$: TST R1 ;IS BUFFER SIZE VALID?F3 BEQ 900$ ;IF EQ, NO...RETURN INVALID BUFFER ERROR 6 CMP R1,#20000-100 ;IS BUFFER BIGGER THAN 8128. BYTES?5 BHI 920$ ;IF HI, YES...RETURN BAD BUFFER SIZE ERRORE; MOV (SP),-(SP) ;DUPLICATE MAPPING ROUTINE ADDRESS ON STACKF, MOV KISAR6,2(SP) ;SAVE CURRENT EXEC MAPPING+ MOV $SAHDB,KISAR6 ;MAP CURRENT TASK HEADERM3 CALL @(SP)+ ;CALL REQUESTED ADDRESS CHECK ROUTINE+ MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGV+ BCS 910$ ;IF CS, IT FAILED...RETURN ERRORE9 CALL $RELOC ;RELOCATE ADDRESS AND CONVERT TO DOUBLEWORD, RETURN ;ALL DONEB900$:R( TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS910$:1A MOV #IE.SPC&377,R0 ;SET COMPLETION ERROR CODE FOR INVALID BUFFER BR 990$ ;SKIP 920$:A( TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS; MOV #IE.BAD&377,R0 ;SET COMPLETION ERROR CODE FOR BAD SIZE;990$:R SEC ;RETURN WITH ERROR FLAG RETURN ;ALL DONES .DSABL LSB.PAGEP" .SBTTL . WRITE REQUEST PROCESSING% .SBTTL . QPWSB - WRITE SPECIAL DATAR;R;+(; **-QPWSD - WRITE SPECIAL DATA (IO.WSD);-;O .IF DF B$$MAPQPWSD::D9 BIC #^C,I.FCN(R3) ;CLEAR DISALLOWED BITS$( BIS #TF.WAL,I.FCN(R3) ;SET REQUIRED BIT< CMP #T.RSDN,I.PRM+10(R3) ;IS THE DATA TYPE SPECIFIER LEGAL?% BHIS QPWLB1 ;IF HIS, YES...CONTINUEV6 BR EQPBAD ;ELSE, RETURN REQUEST WITH BAD PARAMENTERS .ENDC ;B$$MAP& .SBTTL . QPWLB - WRITE LOGICAL BLOCK;;+*; **-QPWLB - NORMAL WRITE REQUEST (IO.WLB);-;SQPWLB::BQPWLB1:B6 MOV #1,R4 ;INDICATING ONE BUFFER IN FIRST P00tMCTADATADATADATADATADATADATADATADATAARAMETER> BITB #TF.WBT,I.FCN(R3) ;IS THIS A BREAKTHROUGH WRITE REQUEST?: BEQ CKBFLN ;IF EQ, NO...CHECK BUFFER LENGTH AND QUEUE IT( MOV I.TCB(R3),R0 ;GET ISSUEING TASK TCB; BIT #T3.PRV!T3.CLI,T.ST3(R0) ;IS TASK PRIVILEGED OR A CLI? ' BNE 10$ ;IF NE, YES...DO BREAKTHROUGHS, CMP T.UCB(R0),R5 ;IS THE IO.WBT TO OWN TI:?% BNE EQPPRI ;IF NOT, DON'T ALLOW IT L 10$:  6 MOVB #251.,I.PRI(R3) ;CHANGE REQUEST TO PRIORITY 251.= BIS #TF.CCO,I.FCN(R3) ;BREAKTHROUGH IMPLIES CANCEL CONTROL-OP6 BR CKBFLN ;CHECK BUFFER LENGTH AND QUEUE THE REQUEST.PAGEE! .SBTTL . READ REQUEST PROCESSINGH$ .SBTTL . QPRSD - READ SPECIAL DATA;T;+/; **-QPRSD - READ SPECIAL DATA REQUEST (IO.RSD),;-;0 .IF DF B$$MAPQPRSD::C8 BIC #^C,I.FCN(R3) ;CLEAR DISALLOWED BITS4 BIS #,I.FCN(R3) ;FORCE REQUIRED BITS4 TST I.PRM+10(R3) ;IS THE DATA TYPE SPECIFIER LEGAL?1 BEQ EQPBAD ;ZERO IS NOT ALLOWED, BAD PARAMETERSS< CMP #T.RSDN,I.PRM+10(R3) ;IS THE DATA TYPE SPECIFIER LEGAL?< BHIS CKBFLN ;IF HIS, YES...FINISH CHECKS AND QUEUE REQUEST BR EQPBAD ;BAD PARAMETERSO .ENDC ;B$$MAP$ .SBTTL . QPRPR - READ AFTER PROMPT;Q;+/; **-QPRPR - READ AFTER PROMPT REQUEST (IO.RPR).;-;$ .ENABL LSB:QPRPR::C: MOV I.PRM+10(R3),R0 ;GET VIRTUAL ADDRESS OF PROMPT BUFFER, MOV I.PRM+12(R3),R1 ;GET PROMPT BUFFER SIZE. MOV R1,I.PRM+14(R3) ;SET LENGTH IN I/O PACKET: CALL CKBFR ;CHECK READ ACCESS AND RELOCATE PROMPT BUFFER9 BCC 10$ ;IF CC, OK...GO STORE ADDRESS AND QUEUE REQUESTB: BR IOFIN ;CHECK FAILED...COMPLETE REQUEST WITH THE ERROR- .SBTTL . QPRTT - READ WITH TERMINATOR TABLE;B;+8; **-QPRTT - READ WITH TERMINATOR TABLE REQUEST (IO.RTT);-;MQPRTT::T5 MOV I.PRM+10(R3),R0 ;GET ADDRESS OF TERMINATOR TABLE14 MOV #32.,R1 ;LENGTH OF TABLE IS FIXED AT 32. BYTES. MOV R1,I.PRM+14(R3) ;SET LENGTH IN I/O PACKET; CALL CKBFRW ;CHECK READ ACCESS AND RELOCATE TABLE ADDRESSD8 BCS IOFIN ;IF CS, CHECK FAILED...RETURN WITH THE ERROR10$:< MOV R1,I.PRM+10(R3) ;SAVE FIRST WORD OF ADDRESS DOUBLE WORD= MOV R2,I.PRM+12(R3) ;SAVE SECOND WORD OF ADDRESS DOUBLE WORDR" MOV #21,R4 ;INDICATE TWO BUFFERS6 BR CKBFLN ;CHECK BUFFER LENGTH AND QUEUE THE REQUEST .DSABL LSBI% .SBTTL . QPRLB - READ LOGICAL BLOCK ;L;+); **-QPRLB - NORMAL READ REQUEST (IO.RLB)3;-;SQPRLB::, MOV #1,R4 ;INDICATE ONE BUFFER6 BR CKBFLN ;CHECK BUFFER LENGTH AND QUEUE THE REQUEST.PAGES .SBTTL . ERROR HANDLING; ,; EQPPRI - RETURN PRIVILEGE VIOLATION ERROR.;REQPPRI:;; MOV #IE.PRI&377,R0 ;SET ERROR CODE FOR PRIVILEGE VIOLATION; BR IOFIN ;FINISH I/O REQUEST E;R+; EQPBAD - RETURN ERROR FOR BAD PARAMETERS.K;NEQPBAD::: MOV #IE.BAD&377,R0 ;SET ERROR FOR BAD PARAMETER SPECIFIED BR EQPFIN ;FINISH REQUEST ;L@; EQPSPC - RETURN ERROR BECAUSE OF INVALID BUFFER SPECIFICATION.;MEQPSPC: ? MOV #IE.SPC&377,R0 ;SET ERROR FOR ILLEGAL BUFFER SPECIFICATIONT; BR EQPFIN ;RETURN THE ERROR REQPFIN::IOFIN::I# CLR R1 ;CLEAR SECOND WORD OF IOSB SEC ;INDICATE FAILURE RETURN ;RETURN TO XXDRV.PAGE , .SBTTL . CKBFLN - FINAL BUFFER LENGTH CHECK;=; CKBFLN - CHECK THAT BUFFER LENGTH IS WITHIN (1,8K-64) BYTESV;ECKBFLN:R3 MOV I.PRM+4(R3),R1 ;GET LENGTH OF TRANSFER REQUEST 4 BEQ EQPSPC ;IF EQ, RETURN ZERO BUFFER LENGTH ERROR6 CMP R1,#20000-100 ;IS BUFFER BIGGER THAN 8128. BYTES?5 BHI EQPBAD ;IF HI, BUFFER IS TOO BIG...RETURN ERRORT< .SBTTL QUEUE - PLACE I/O REQUEST PACKET INTO TERMINAL QUEUE;RK; R4 NOW CONTAINS BUFFER FLAG. SAVE THE FLAG IN I.LN2+1 OF THE I/O PACKET.O;DQUEUE::G; ADD #U.TSTA,R5 ;POINT UCB POINTER TO THE FIRST STATUS WORDN. MOV I.LN2(R3),R0 ;GET POINTER TO 2ND LUN WORD, SUB #,R0 ;GET OFFSET INTO LUT- ASR R0 ;DIVIDE BY 4 (4 BYTES PER LUN ENTRY)E ASR R0 ;! INC R0 ;LUN NUMBERS START AT 105 MOVB R0,I.LN2(R3) ;RETURN TO LUN FIELD IN I/O PACKET + MOVB R4,I.LN2+1(R3) ;SAVE BUFFER FLAG BYTE0 MOV U.SCB-U.TSTA(R5),R0 ;GET I/O QUEUE LISTHEAD MOV R3,R1 ;GET PACKET POINTERU CALL $QINSP ;I00tU D%B11110010NSERT PACKET .IF DF M$$PRO# MOV #FR.GRQ,R3 ;COME BACK AT FPGRQ # CALL SWCPU ;SWITCH TO CORRECT CPUS .ENDC ;M$$PRO RETURN .PAGER. .SBTTL . QPATT/QPDET - ATTACH/DETACH REQUESTS;E;+-; **-QPATT - ATTACH TERMINAL REQUEST (IO.ATT)E-; **-QPDET - DETACH TERMINAL REQUEST (IO.DET)T; K; ENTRY POINT "QPATT" PERFORMS UNSOLICITED INPUT AST ADDRESS ADJUSTMENT FORR; SUPERVISOR MODE LIBRARIES.;V ; INPUTS:,; R3 => I/O PACKET FOR ATTACH/DETACH REQUEST; R5 => UCB FOR THE TERMINAL;P ; OUTPUTS:K; R3 => I/O PACKET TO BE QUEUEDG; R4 = BUFFER INDICATOR BYTEL;W"; REGISTERS MODIFIED: R0, R1, R2;-;PQPATT::T; 7; CHECK FOR UCB OF TERMINAL WHICH IS NOT TI: NOR HT377:S; DO NOT ALLOW ATTACHA;C- MOV I.UCB(R3),R2 ;GET UCB ADDRESS FOR ATTACHC" MOV I.TCB(R3),R4 ;GET TCB OF TASK$ MOV U.DCB(R2),-(SP) ; POINT TO DCB.$ ADD #D.UNIT,(SP) ; POINT TO D.UNIT.- CMPB #377,@(SP)+ ; IS IT THE GENERIC HT377:? " BEQ 5$ ; YES, AVOID USING U.ATT.* CMP T.UCB(R4),R2 ;IS THIS THE TASK'S TI:? BNE EQPPRI ;IF NE - VIOLATIONE-; TERMINALS ARE NOT ATTACHED ON THE RSX SIDE.R-; MOV R4,U.ATT(R2) ;INDICATE UNIT IS ATTACHEDT5$:< BIS #TS.RSW,T.STAT(R4) ; BLOCK TASK TO MAKE IT SYNCHRONOUS.: BITB #TF.AST,I.FCN(R3) ;ATTACH FOR UNSOLICITED INPUT AST? BEQ 35$ ;IF EQ NOB1 MOV I.PRM+4(R3),-(SP) ;GET CONTROL-C AST ADDRESST0 BEQ 10$ ;IF EQ, NONE...CHECK OTHER AST ADDRESS5 BIT #TF.XCC,I.FCN(R3) ;CONFLICTING SUBFUNCTION CODE?;' BNE 40$ ;IF NE, YES...RETURN AN ERROR)10$:; BIS I.PRM(R3),(SP)+ ;"OR" IN UNSOLICITED INPUT AST ADDRESS 3 BEQ 50$ ;IF EQ, NEITHER ADDRESS SPECIFIED...ERROR4430$: MOV I.PRM(R3),R2 ;GET ALL CHARACTER AST ADDRESS) CALL $CALTA ;ADJUST FOR SUPER/USER MODER" MOV R2,I.PRM(R3) ;AND PUT IT BACK. MOV I.PRM+4(R3),R2 ;GET CONTROL C AST ADDRESS) CALL $CALTA ;ADJUST FOR SUPER/USER MODE-$ MOV R2,I.PRM+4(R3) ;AND PUT IT BACK35$: K CLR R4 ;INDICATE NO BUFFERSC JMP QUEUE40$: TST (SP)+ ;CLEAN STACK#50$: JMP EQPSPC ;RETURN WITH ERRORO QPDET::S" MOV I.UCB(R3),R2 ;GET UCB ADDRESS CLR U.ATT(R2) ;CLEAR ATTACH I CLR R4 ;INDICATE NO BUFFERS. JMP QUEUE ;QUEUE THE REQUEST .PAGEC$ .SBTTL . QPSPC - "SPECIAL" REQUESTS;S;+=; **-QPSPC - HANDLE "SPECIAL" REQUESTS (IO.GTS/SF.GMC/SF.SMC)P;4G; THIS ROUTINE CHECKS PARAMETERS FOR THE "GET TERMINAL SUPPORT" AND THEMJ; "GET/SET MULTIPLE CHARACTERISTICS" FUNCTIONS. THE USER BUFFER FOR THESE"; REQUESTS MUST BE WORD-ALIGNED. ;C ; INPUTS:"; R3 => I/O PACKET FOR THE REQUEST; R5 => UCB FOR THE TERMINAL; ; OUTPUTS:E; R3 => I/O PACKET TO BE QUEUED; R4 = BUFFER INDICATOR BYTER;"; REGISTERS MODIFIED: R0, R1, R2;-;QPSPC::P MOV #1,R4 ;INDICATE ONE BUFFER) MOV I.PRM(R3),R0 ;GET ADDRESS OF BUFFER S$ MOV I.PRM+2(R3),R1 ; AND ITS LENGTH0 MOV R1,I.PRM+4(R3) ;PUSH LENGTH DOWN ONE FIELD$ MOV #CKBFB,R2 ;ASSUME A WRITE CHECKE CMP I.FCN(R3),#IO.GTS ;IO.GTS? ;GET TERMINAL DRIVER SUPPORT REQUEST?G BEQ 2$ ;IF EQ, YES= CMP I.FCN(R3),#SF.GMC ;GET MULTIPLE CHARACTERISTICS REQUEST?L BNE 3$ ;IF NE, NO 2$:  MOV R5,-(SP) ;SAVE UCB ADDRESS * MOV I.TCB(R3),R5 ;GET TCB ADDRESS OF TASK: BIS #TS.RSW,T.STAT(R5) ;BLOCK TASK TO MAKE IT SYNCHRONOUS" MOV (SP)+,R5 ;RESTORE UCB ADDRESS BR 10$ ;CHECK BUFFER ALIGNMENT3$:)= CMP I.FCN(R3),#SF.SMC ;SET MULTIPLE CHARACTERISTICS REQUEST?E7 BNE EQPIFC ;IF NE, NO...RETURN ILLEGAL FUNCTION ERRORN) MOV I.TCB(R3),R2 ;GET ISSUING TASK'S TCBP, CMP T.UCB(R2),R5 ;IS THIS TERMINAL HIS TI:?' BEQ 5$ ;IF EQ, YES...REQUEST IS LEGALS/ BIT #T3.PRV,T.ST3(R2) ;IS THE TASK PRIVILEGED?R BNE 5$ ;IF NE YES, OK 5 JMP EQPPRI ;IF EQ, NO...CAN'T ALLOW USER TO DO THISR)5$: MOV #CKBFRW,R2 ;SET UP FOR READ CHECKO10$:1 CALL (R2) ;ADDRESS CHECK BUFFER AND RELOCATE IT  BCC 20$ ;IF CC, NO ERROR6 JMP IOFIN ;IF ERROR, FINISH UP WITH ERROR CODE IN R020$:) MOV R1,I.PRM(R3) ;PUT BIAS IN I/O PACKETT' MOV R2,I.PRM+2(R3) ; AND DISPLACEMENTI" MOV R2,-(SP) ;GET BUFFER ADDRESS0 BIS I.PRM+4(R3),(SP) ;"OR" IN THE BUFFER LENGTH5 ROR (SP)+ ;IS EITHER THE00t]CTADATADATADATADATADATADATADATADATA ADDRESS OR THE LENGTH ODD?R/ BCC 30$ ;IF CC, BUFFER IS WORD-ALIGNED...SKIP 6 JMP EQPSPC ;RETURN ERROR FOR BUFFER NOT WORD-ALIGNED30$:! MOV U.DCB(R5),R0 ; POINT TO DCB.L1 CMPB #377,D.UNIT(R0) ; IS IT THE GENERIC HT377:?C& BEQ 80$ ; YES, WE CANNOT TRACK BITS.35$:;N4; DO SPECIAL CASED CHARACTERISTICS, SER, PRV AND SLV;T2 MOV I.PRM+4(R3),R0 ;GET NUMBER OF CHARACTERISTICS ASR R0 ;TWO BYTES PER CHAR.  MOV KISAR6,-(SP) ;SAVE MAPPING( MOV R1,KISAR6 ;MAP BUFFER5 MOV U.MUP(R5),-(SP) ;SAVE OLD U.MUP IN CASE OF ERRORD) MOV U.CW2(R5),-(SP) ; AND SAME OLD U.CW2D40$: ;J:; IF SETTING/CLEARING SERIAL MODE, SET/CLEAR UM.SER IN UCB;V CMPB (R2),#TC.TBM ;SERIAL MODE? BNE 50$ ;IF NE NO ) CMP I.FCN(R3),#SF.SMC ;IS THIS SET MODE?W" BNE 70$ ;IF NE NO, GET NEXT CHAR) BIS #UM.SER,U.MUP(R5) ;ASSUME SET SERIALS % TSTB 1(R2) ;ARE WE SETTING THE BIT?C BNE 70$ ;IF NEQ YES 3 BIT #1,U.LFLG(R5) ;ARE WE FORCED INTO SERIAL MODE?() BNE 70$ ;IF NE YES, IGNORE THIS REQUEST)$ BIC #UM.SER,U.MUP(R5) ;CLEAR SERIAL BR 70$ ;GET NEXT CHARA;SF; IF GETTING PRV CHARACTERISTIC, LET AME KNOW IF THE BIT IS SET OR NOT.; IF SETTING/CLEARING PRV, PRIVILEGE VIOLATION;?50$:! CMPB (R2),#TC.PRI ;IS THIS PRIV?# BNE 60$ ;IF NE NOO$ CMP I.FCN(R3),#SF.GMC ;IS THIS GMC?( BNE 90$ ;IF NE NO, PRIVILEGE VIOLATION' BIT #U2.PRV,U.CW2(R5) ;IS PRV BIT SET?B BEQ 70$ ;IF EQ NOE! BISB #1,1(R2) ;SET BIT IN BUFFERF BR 70$ ;GO GET NEXT CHAR;7*; SETTING/CLEARING SLAVE, TRACK BIT IN UCB;M60$:" CMPB (R2),#TC.SLV ;IS THIS SLAVE? BNE 70$ ;IF NE NOF T) CMP I.FCN(R3),#SF.SMC ;IS THIS SET CHAR?E BNE 70$ ;IF NE NO - BIC #U2.SLV,U.CW2(R5) ;ASSUME CLEARING SLAVE TSTB 1(R2) ;IS IT SET? BEQ 70$ ;IF EQ NO6! BIS #U2.SLV,U.CW2(R5) ;SET SLAVEG 70$: TST (R2)+ ;MOVE POINTER UP( SOB R0,40$ ;IF MORE LEFT, DO NEXT CHAR CMP (SP)+,(SP)+ ;CLEAN STACK7" MOV (SP)+,KISAR6 ;RESTORE MAPPING80$: JMP QUEUE ;QUEUE REQUEST90$:' MOV (SP)+,U.CW2(R5) ;RESTORE OLD U.CW2I' MOV (SP)+,U.MUP(R5) ;RESTORE OLD U.MUPS" MOV (SP)+,KISAR6 ;RESTORE MAPPING JMP EQPPRI ;INDICATE ERROR; M; EQPIFC - RETURN AN ERROR DUE TO ILLEGAL FUNCTION CODE OR INVALID MODIFIERS.V;EQPIFC::D MOV #IE.IFC&377,R0 ;SET ERROR FOR ILLEGAL FUNCTION CODE OR MODIFIER; JMP EQPFIN ;FINISH OFF THE REQUEST (RESTORE MAPPING ALSO) .PAGEN .SBTTL . QPHNG - HANGUP REQUEST;C;+$; **-QPHNG - HANGUP REQUEST (IO.HNG);H; THIS ROUTINE CHECKS AN IO.HNG REQUEST. A NON-PRIVILEGED TASK CAN HANGK; UP ONLY ITS "TI:" LINE. PRIVILEGED TASKS CAN HANG UP ANY LINE. A HANGUPIK; REQUEST, LIKE AN IO.WBT OR GET CHARACTERISTICS, BREAKS THROUGH THE QUEUE.E ; ; INPUTS:"; R3 => I/O PACKET FOR THE REQUEST; R5 => UCB FOR THE TERMINAL;I ; OUTPUTS:O; R3 => I/O PACKET TO BE QUEUED;; R4 = BUFFER INDICATOR BYTE ;P; REGISTERS MODIFIED: R0;-;NQPHNG::P$ CALL PREQUE ;SET UP FOR QUEUEING  CLR R4 ;INDICATE NO BUFFERS JMP QUEUE ;QUEUE THE REQUEST  PREQUE: ) MOV I.TCB(R3),R0 ;GET ISSUING TASK'S TCBE, CMP T.UCB(R0),R5 ;IS THIS TERMINAL HIS TI:?* BEQ J2QUE ;IF EQ, YES...ALLOW THE HANGUP/ BIT #T3.PRV,T.ST3(R0) ;IS THE TASK PRIVILEGED?P: BEQ J2EQPR ;IF EQ, NO...RETURN PRIVILEGE VIOLATION ERRORJ2QUE: .IF DF M$$PRO" MOV U.SCB(R5),R4 ;GET SCB ADDRESS/ BIT S.URM(R4),@$CPURM ;ALREADY ON CORRECT CPU?S' BEQ 5$ ;IF EQ NO, FORK TO CORRECT CPUR T .IFTF ; DF M$$PRO  I RETURN  E .IFT ; DF M$$PRO  =; CONVERT PARAMETER LIST PART OF I/O PACKET INTO A FORK BLOCKU>; (AND THE RETURN ADDRESS) FOR INTERPROCESSOR FORK. SINCE THIS@; IS A SUBROUTINE, WE MUST REMEMBER CALLER ADDRESS IN FORK BLOCK,; OR THE INTERPROCESSOR FORK DOES NOTHING. ; R;5$: ADD #I.PRM+14,R3 ;POINT PAST KISAR5 FIELD IN FORK BLOCKE) MOV (SP)+,(R3) ;REMEMBER RETURN ADDRESS E: MOV KINAR5,-(R3) ;INSERT DRIVER I MAPPING IN KISAR5 FIELD& CLR -(R3) ;CLEAR R4 IN FORK BLOCK 7 MOV S.URM(R4),-10(R3) ;SET URM OF DEVICE IN FORK BLOCK . MOV R3,R4 ;POINT R4 AT FOR00tej D%B11110010K BLOCK FOR $FORK1$ CALL $FORK1 ;SWITCH TO CORRECT CPU7 SUB #I.PRM+4,R3 ;POINT BACK TO BEGINNING OF FORK BLOCK, CALL MAPD ;RE-MAP DRIVER1 JMP @I.PRM+14(R3) ;DISPATCH TO ORIGINAL CALLER E  .ENDC ; DF M$$PROJ2EQPR: & TST (SP)+ ;GET RID OF RETURN ADDRESS. JMP EQPPRI ;RETURN PRIVILEGE VIOLATION ERROR .END ;INSERT DRIVER I MAPPING IN KISAR5 FIELD& CLR -(R3) ;CLEAR R4 IN FORK BLOCK 7 MOV S.URM(R4),-10(R3) ;SET URM OF DEVICE IN FORK BLOCK . MOV R3,R4 ;POINT R4 AT FORz@Ds@p@<&Kq@:2@`@@}s@'@e;@<&%t@<&9@h&@zձ@h'@?T@?S@X@,l@4@'@=@@=@' q@t @`;@<&D@hp!@:$9:@2X@ r!hyp( SYpAjpjff(L &LLA" "<&9<&Kq<&D   'B DLD>B( (@@P <&%t ' q44 t BB <&%t\\VVZZ WW '  SYi+cOF:LINCDGNLLW HEDLD -- Not enough contiguo&(*:08@HPZbZus file spaceDLD -- Odd address or non-existent memory errorDLD -- Directive error = %DDLD -- I/O error = %DDLD -- Read error = %DDLD -- Wait error = %DDLD -- Region creation errorDLD -- Window creation errorDLD -- Command line errorDLD --R Syntax errorDLD -- Parse errorDLD -- QIOW errorDLD -- File not foundDLD -- File close errorDLD -- Get partition parameters errorDLD -- Mapping errorDLD -- Partition too smallDLD -- Partition not foundDLD -- Data structure error in BIC-BINaJ input fileDLD -- Write error = %DDLD -- Parity error%NLow address = %O%NHigh address = %Oe w SYTICLPartition name: %2RPartition base: %O Size: %O (32. word blocks)File name: %XTransfer address: %Om  DLD -- Diagnostic loader DLD takes a BIC/BIN binary file, converts it to asystem image file and then loads it into a u ser-specifiedpartition. The binary file must have been converted fromDOS format using the /IM switch of FLX.Switches:  /HE -- types this help file /NL -- inhibits the partition load. the conversion is still performed.  /LI -- lists file and partition information /NC -- do not clear the rest of the partition following the program load. default is to clear /OFF:N - offset from the start of partition by nX32 words /LW -- Accounts for the DOS link word that may exist in bytes 0-1 of every input blockExamples:DLD>/HELP => types the help messageDLD>=COPY1 .BIN/NL/LI => convert copy1.bin to copy1.sys and list program information. do not load into partitionDLD>TST=RL DP => convert RLDP.BIC to RLDP.SYS and load it into the partition TSTDLD>TST=RLDP.SYS/NC/OFF:1 => load RLDP.SYS into partition TST at an offset of 32. words. conversion is not done and the rest of the partition is nxot cleared%Na piw0 b Hww^f:p w"ȕ0 w 2X p08?SR`=jr0x@=5z  A E` ~ NJ D>:%wwnwRȕ* $JR$9:Tsbjv~~ w# 5wE4 %zbw# ,"% > 6 . @=.4NR' qXhp!|# w00qzTADATADATADATADATADATADATADATADATAw7 |UtwzN4v 4# wB7 82.U,' q h'F4JvN,lR4V'\h'v&wl      w L7 7 5\d wF   w %w5T%$%A7J 7F x 6 5"&wn  5 B 7%  FP5  F wV "&7 !5  4 @<p7ww t4 5X $ w`UBwb JF w*v(4484<'J$ pt`~vf~ 4 ww# w# w5 5w w J842X(,' q2h&<@' qFhp!vz:    &blh "p7 6wH7 tV7 7 5@8 ppu JJw7 yw  mn5   @ Lw  p*b@ (`\w  <8w s vrwj  fV s*.NsnBRwJ  F62w*  &w   dw  D2Rr|xw  $\Xw  <8w L vrwj 2 6 VLv2:fVRwJ  h B2.w&e n B xcs x    P 4 hDn Pbf`n|4  6eB  ` PLw & & &  f& & & Ε 0,6 .2X "}s*`JN?T^p:22 0,47 H V  v 0,40X^ձhn`;6  %  RNw V  .*w|   ,0sPV Tstxs*td `wX @WtmB~7 m&y xWtB~5   `  |@j nz ~| P  j B   4  7 7 "  $~5j5 b j X\l"eh n jZ7`R R L& H  D:7 6 vw,7 %  z 7  d1 t~4f4e6  &4  6 J4f4e6 @4 f(.e;84<B`;LV4Zffx~ձ 4   B~"4f4e6 V  0 w  & 4`;246fLV Psn"7 U@eAtE7  Et m-pf-dz~ vn> f^ 5V  Bt  wm47< *f4e6 @4 f(.e;84<B`;LV4Zffx/1 SUB XRATE (DWELL, IRATE%, IPRSET%, IFLAG%) &! &! COPYRIGHT (C) 1977 &1! DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. &! &@! THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A &@! SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH &@! SYSTEM AND TO ONE WHO AGREES TO THESE LI00{ D%B11110010CENSE TERMS. TITLE &@! TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN & ! IN DEC. & ! &RA! THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT &AA! NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL & ! EQUIPMENT CORPORATION. &! &L?! DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF & ;! ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. & ! &A! VERSION 01 &! B. SCHREIBER 15-JUL-77 &! & 3! CONVERTED TO BASIC-PLUS-2: K. ALTMANN 8-DEC-77 &S?! THIS ROUTINE COMPUTES RATES AND PRESETS FOR THE CLOCK GIVEN &L*! THE DESIRED DWELL (INTER-SAMPLE TIME). &2 !+ &$! XRATE -- COMPUTE RATE AND PRESET &! &I! CALLING SEQUENCE: &S/! CALL XRATE (DWELL, IRATE%, IPRSET%, IFLAG%) & ! & ! INPUTS: &P! &O9! DWELL (FLOATING) THE DESIRED DWELL IN DECIMAL SECONDS &R3! IFLAG% (INTEGER) 0 IF CLOCK A, NON-0 IF CLOCK B &S! &S ! OUTPUTS: &! &7! IRATE% (INTEGER) THE SELECTED CLOCK RATE (1-7) OR 0 & #! IF NO RATE COULD BE SELECTED & 9! IPRSET% (INTEGER) THE TWOS-COMPLEMENT CLOCK PRESET TO & +! BE USED IN A CALL TO A SWEEP ROUTINE &R! &L! &E!- &#5 DIMENSION DWLMAX(5), TICKS(5) &R! &&&! DWLMAX CONTAINS THE MAXIMUM DWELL &2! (INTER-SAMPLE TIME) WHICH MAY BE OBTAINED FOR &3! PARTICULAR CLOCK RATE FOR EITHER CLOCK A OR B. &I! &I7 IF IFLAG% = 0% THEN &E DWLMAX(1%) = 0.065535 & \DWLMAX(2%) = 0.65535 &: \DWLMAX(3%) = 6.5535 & \DWLMAX(4%) = 65.535 & \DWLMAX(5%) = 655.35 & ELSE & DWLMAX(1%) = 0.000255 & \DWLMAX(2%) = 0.00255 &  \DWLMAX(3%) = 0.0255 & \DWLMAX(4%) = 0.255 &E \DWLMAX(5%) = 2.55 &25 ! &4! TICKS IS THE NUMBER OF CLOCK TICKS OBTAINED FOR &! A PARTICULAR CLOCK RATE. & ! &E TICKS(1%) = 1000000.0 &  \TICKS(2%) = 100000.0 & \TICKS(3%) = 10000.0 &  \TICKS(4%) = 1000.0 & \TICKS(5%) = 100.0 &N%30 IF DWELL < .000001 THEN GOTO 700 &A40 ! &2! FIND THE FASTEST CLOCK RATE WHICH WILL PERMIT &4! THE REQUESTED DWELL. CHOOSING THE FASTEST RATE &%! WILL GIVE THE FINEST RESOLUTION. &.! &  FOR I% = 1% TO 5% &( \ IF DWELL > DWLMAX(I%) THEN GOTO 500 &&70 ! I% CONTAINS THE SELECTED RATE &! &  IRATE% = I% &! &R*! COMPUTE THE CLOCK PRESET FOR THE USER &! &( \ PRESET = DWELL * TICKS(I%) & 3 \ IF PRESET = 32768.0 THEN IPRSET% = 32767% + 1% &0< ELSE IF PRESET > 32768.0 THEN IPRSET% = 65535.0 - PRESET & ELSE IPRSET% = - PRESET &H-400 XRATE = INT(PRESET + 0.05) / TICKS(I%) &R \ GOTO 900 & 500 NEXT I% &700 IRATE% = 0% &I 900 SUBENDRESOLUTION. &.! &  FOR I% = 1% TO 5% &( \ IF DWELL > DWLMAX(I%) THEN GOTO 500 &&70 ! I% CONTAINS THE SELECTED RATE &! &  IRATE% = I% &! &R*! COMPUTE THE CLOCK PRESET FOR THE USER &! &( \ PRESET = DWELL * TICKS(I%) & 3 \ IF PRESET = 32768.0 THEN IPRSET% = 32767% + 1% &0< ELSE IF PRESET > 32768.0 THEN IPRSET% = 65535.0 - PRESET & ELSE IPRSET% = - PRESET &H-400 XRATE = INT(PRESET + 0.05) / TICKS(I%) &R \ GOTO 900 & 500 NEXT I% &700 IRATE% = 0% &ICC COPYRIGHT (C) 1977/C DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.C>C THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>C SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>C INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>C ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>C MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>C SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>C TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN C IN DEC.CI?C THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?C NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL C EQUIPMENT CORPORATION.CO=C DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9C ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.IC C VERSION 01C B. SCHREIBER 15-JUL-77CECE:C MSH001 M.HARVEY CORRECTED FUNCTION RETURN VARIABLECTCH=C THIS ROUTINE COMPUTES RATES AND PRESETS FOR THE CLOCK GIVENS(C THE DE00TADATADATADATADATADATADATADATADATASIRED DWELL (INTER-SAMPLE TIME). C+"C XRATE -- COMPUTE RATE AND PRESETC C CALLING SEQUENCE: *C CALL XRATE (DWELL, IRATE, IPRSET, IFLAG)1C OR: HERTZ = XRATE (DWELL, IRATE, IPRSET, IFLAG) C C INPUTS:RCO5C DWELL (REAL*4) THE DESIRED DWELL IN DECIMAL SECONDSE2C IFLAG (INTEGER*2) 0 IF CLOCK A, NON-0 IF CLOCK BCS C OUTPUTS:CH6C IRATE (INTEGER*2) THE SELECTED CLOCK RATE (1-7) OR 0!C IF NO RATE COULD BE SELECTEDH8C IPRSET (INTEGER*2) THE TWOS-COMPLEMENT CLOCK PRESET TO)C BE USED IN A CALL TO A SWEEP ROUTINEIC.5C HERTZ (REAL*4) (IF CALLED AS A FUNCTION) THE ACTUALLC DWELL USED.CLC-4 REAL*4 FUNCTION XRATE (DWELL, IRATE, IPRSET, IFLAG), REAL*4 DWELL, PRESET, DWLMAX, BDWLMX, TICKS INTEGER*2 IRATE, IPRSET, ID) DIMENSION DWLMAX(5), TICKS(5), BDWLMX(5) CC$C DWLMAX CONTAINS THE MAXIMUM DWELL0C (INTER-SAMPLE TIME) WHICH MAY BE OBTAINED FOR%C PARTICULAR CLOCK RATE FOR CLOCK A.SCC1 DATA DWLMAX / 0.065535, 0.65535, 6.5535, 65.535,K 1 655.35 /BCS$C BDWLMX CONTAINS THE MAXIMUM DWELL0C (INTER-SAMPLE TIME) WHICH MAY BE OBTAINED FOR'C A PARTICULAR CLOCK RATE FOR CLOCK B. CC0 DATA BDWLMX / 0.000255, 0.00255, 0.0255, 0.255, 1 2.55 /,CL2C TICKS IS THE NUMBER OF CLOCK TICKS OBTAINED FORC A PARTICULAR CLOCK RATE.(C 3 DATA TICKS / 1000000.0, 100000.0, 10000.0, 1000.0,L 1 100.0 /! IF (DWELL .LT. .000001) GOTO 200 CR0C FIND THE FASTEST CLOCK RATE WHICH WILL PERMIT2C THE REQUESTED DWELL. CHOOSING THE FASTEST RATE#C WILL GIVE THE FINEST RESOLUTION.MCD DO 100 I = 1, 5 IF (IFLAG .NE. 0) GOTO 5A# IF (DWELL .GT. DWLMAX(I)) GOTO 100F GOTO 7B% 5 IF (DWELL .GT. BDWLMX(I)) GOTO 1005C.C I CONTAINS THE SELECTED RATECT 7 IRATE = ICR(C COMPUTE THE CLOCK PRESET FOR THE USERC  PRESET = DWELL * TICKS (I) ! IF (PRESET - 32768.0) 10, 20, 300CLC PRESET LT 32768.0CD 10 IPRSET = -IFIX (PRESET) GOTO 40CHC PRESET EQ 32768.0CH 20 IPRSET = "100000 GOTO 40CLC PRESET GT 32768.0CA$ 30 IPRSET = IFIX (65535.0 - PRESET)C2C RETURN THE RATE SELECTED TO USER IF CALLED AS A6C FUNCTION. HE CAN SEE IF HE WAS KILLED BY ROUNDOFF.C.. 40 XRATE = AINT(PRESET + 0.05) / TICKS(I) GOTO 900T 100 CONTINUEE 200 IRATE = 0 900 RETURNK ENDT FOR THE USERC  PRESET = DWELL * TICKS (I) ! IF (PRESET - 32768.0) 10, 20, 300CLC PRESET LT 32768.0CD 10 IPRSET = -IFIX (PRESET) GOTO 40CHC PRESET EQ 32768.0CH 20 IPRSET = "100000 GOTO 40CLC PRESET GT 32768.0CA$ 30 IPRSET =$ .TITLE KAADMP BURST MODE D/A OUTPUT .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 18-OCT-77;E,; THIS MODULE PERFORMS BURST MODE D/A OUTPUT;T; SYSTEM MACRO CALLS;  .MCALL KSWDF$ KSWDF$O D$ .SBTTL .AADMP BURST MODE D/A OUTPUT;+-; .AADMP -- DUMP BUFFERS TO D/A IN BURST MODEN;IG; THIS ROUTINE PERFORMS OUTPUT TO THE AA11 IN BURST MODE (NOT INTERRUPTT; OR CLOCK DRIVEN).B;I ; INPUTS:Q;M3; R4 POINTS TO SWB (.AASWB). SWB MUST BE ALL SET UP ; ; OUTPUTS:;A<; IF IEFN WAS SPECIFIED CORRECTLY, PERFORM BURST MODE OUTPUT<; AT USER TASK LEVEL UNTIL END OF SWEEP IS DETECTED. IF IEFN,; WAS INCORRECTLY SPECIFIED, RETURN IE.BAD .;Y;-..AADMP::MOV S.WUSW00 D%B11110010(R4),R3 ;POINT TO IBUF ARRAY# TST S.WNBF(R4) ;CONTINUOUS OUTPUT?2 BMI 20$ ;IF MI YES--MUST HAVE COMPLETION ROUTINE= CMP S.WNBF(R4),IB.NBF(R3) ;LESS BUFFERS TO DO THAN SUPPLIED?(0 BHI 20$ ;IF HI NO--GO CHECK COMPLETION ROUTINEA BIS #S$WEFN,S.WFL2(R4) ;YES--SET EFN FLAG SO WE DON'T CALL CMPLR  BR 40$ ;SKIP AHEAD720$: BIT #S$WEFN,S.WFL2(R4) ;EFN OR COMPLETION ROUTINE?T5 BNE 300$ ;IF NE EFN--ERROR--NEED COMPLETION ROUTINEN; #; SET UP TO START BURST MODE OUTPUTB;.040$: MOVB S.WBNO(R4),R5 ;GET FIRST BUFFER NUMBER ASL R5 ;MAKE WORD INDEXC" ADD R3,R5 ;POINT INTO IBUF ARRAY9 MOV IB.BUF(R5),R5 ;AND PULL OUT THE FIRST BUFFER ADDRESSR;;"; ENTER LOOP FOR BURST MODE OUTPUT;I- BIS #S$WACT,S.WFL2(R4) ;DECLARE SWEEP ACTIVEB-200$: CALL .AAGWD ;GET D/A DATUM FROM BUFFERD ROL R2 ;SAVE C-BIT# MOV S.WCSR(R4),R1 ;GET CSR ADDRESSW .IF NDF Q$$BUSP)220$: TSTB (R1) ;MAKE SURE UNIT IS READYR" BPL 220$ ;WAIT FOR THE READY BIT .ENDC ;Q$$BUS% CLR R0 ;PREPARE TO GET CHANNEL BYTER) BISB S.WCHB(R4),R0 ;GET THE CHANNEL BYTEW$ ADD R0,R1 ;POINT TO THE PROPER DAC MOV R3,(R1) ;OUTPUT TO DAC% CALL .AANXC ;UPDATE TO NEXT CHANNEL& ROR R2 ;CHECK THE C-BIT FROM GETWORD BCC 200$ ;IF CC KEEP GOING+240$: CALL .AAAST ;CALL COMPLETION ROUTINE ( BIT #S$WSTP,S.WFL2(R4) ;SHOULD WE STOP? BEQ 200$ ;IF EQ NO) RETURN ;YES--RETURN TO CALLER OF DASWP2; &; NO COMPLETION ROUTINE AND ONE NEEDED;21300$: MOV #-,@S.WUSW(R4) ;SET STATUSC RETURN ;BACK TO CALLERN B2 .SBTTL .AAAST "AST" ROUTINE FOR BURST MODE OUTPUT;+8; .AAAST -- CALL COMPLETION ROUTINE IN BURST MODE OUTPUT;C ; INPUTS: ;D; R4 POINTS TO SWB;R ; OUTPUTS:;H+; IF SUPPLIED, COMPLETION ROUTINE IS CALLEDG;G; NO REGISTERS ARE ALTERED;L;-2.AAAST: BIT #S$WEFN,S.WFL2(R4) ;USING EVENT FLAGS?! BNE 40$ ;IF NE YES--SKIP IT ALLS* MOV R5,-(SP) ;SAVE REGISTERS FROM FORTRAN MOV R4,-(SP)N MOV R3,-(SP)2 MOV R2,-(SP)I MOV R1,-(SP)W MOV R0,-(SP)A/ CALL @S.WEFN(R4) ;CALL USER COMPLETION ROUTINEA$20$: MOV (SP)+,R0 ;RESTORE REGISTERS MOV (SP)+,R1T MOV (SP)+,R2T MOV (SP)+,R3B MOV (SP)+,R4T MOV (SP)+,R5 40$: RETURNI 1 .SBTTL .AAGWD GET WORD FOR BURST MODE D/A OUTPUTO;+4; .AAGWD -- GET WORD FROM USER BUFFER FOR D/A OUTPUT; ; INPUTS: ;W; R5 BUFFER POINTER ; R4 POINTS TO SWB; ; OUTPUTS:;P; R3 DATA WORD; C-CLEAR NOT END OF BUFFERF'; C-SET END OF BUFFER OR STOP REQUESTEDM;R;-(.AAGWD::MOV (R5)+,R3 ;GET NEXT DATA WORD, CLC ;PRESET C-BIT FOR "NOT END OF BUFFER" DEC S.WCNT(R4) ;END OF BUFFER?S BGT 200$ ;IF GT NO) MOV S.WUSW(R4),R2 ;YES--GET IBUF ADDRESS MOV R2,R1 ;COPY IT+ ADD #IB.USQ,R1 ;POINT TO USER BUFFER QUEUE .REPT 8.U TSTB (R1)+ ;FIND THE FREE SLOT BMI 20$ ;IF MI FOUND IT .ENDM BR 140$ ;NO FREE SLOTS? >20$: MOVB S.WBNO(R4),-(R1);SET JUST FINISHED BUFFER INTO QUEUE/ BIT #S$WSEB!S$WSTP,S.WFL2(R4) ;STOP NECESSARY?S BNE 100$ ;IF NE YES" TST S.WNBF(R4) ;CONTINUOUS OUTPUT BMI 40$ ;IF MI YES) DEC S.WNBF(R4) ;NO--CHECK ENOUGH BUFFERS( BEQ 120$ ;IF EQ ALL DONE*40$: ADD #IB.DVQ,R2 ;POINT TO DEVICE QUEUE* MOVB (R2),R1 ;GET NEXT BUFFER NO. TO USE BMI 140$ ;IF MI ERRORB .REPT 3$ MOVB 1(R2),(R2)+ ;PUSH QUEUE AROUND MOVB 1(R2),(R2)+ ;..." BMI 60$ ;WATCH FOR THE QUICK OUT .ENDM% MOVB 1(R2),(R2)+ ;MOVE THE LAST BYTEJ! MOVB #-1,(R2) ;MARK END OF QUEUET/60$: MOVB R1,S.WBNO(R4) ;SET NEW CURRENT BUFFERE ASL R1 ;MAKE A WORD INDEXB# ADD S.WUSW(R4),R1 ;INDEX INTO IBUFI) MOV IB.BUF(R1),R5 ;GET POINTER TO BUFFER . MOV S.WSIZ(R4),S.WCNT(R4) ;RESET BUFFER COUNT. BR 180$ ;RETURN WITH C-SET FOR END OF BUFFER;E#; STOP BECAUSE S$WSTP!S$WSEB IS SET;;M7100$: MOV #-,@S.WUSW(R4) ;SET ABORT STATUSU BR 160$ ;FINISH UP;.; DONE OUTPUTTINGF;T1120$: MOV #IS.SUC,@S.WUSW(R4) ;SET SUCCESS STATUSH BR 160$ ;FINISH ;,; DATA OVERRUN (NO BUFFER);M>140$: MOV #-,@S.WUSW(R4) ;SET DATA OVERRUN STATUS;N; SET STOP AND C-BIT;;*160$: BIS #S$WSTP,S.WFL2(R4) ;FLAG TO STOP/00TADATADATADATADATADATADATADATADATA BIC #S$WACT,S.WFL2(R4) ;DECLARE SWEEP INACTIVEE180$: SEC ;SET C-BIT 200$: RETURN .ENDR END OF BUFFER;E#; STOP BECAUSE S$WSTP!S$WSEB IS SET;;M7100$: MOV #-,@S.WUSW(R4) ;SET ABORT STATUSU BR 160$ ;FINISH UP;.; DONE OUTPUTTINGF;T1120$: MOV #IS.SUC,@S.WUSW(R4) ;SET SUCCESS STATUSH BR 160$ ;FINISH ;,; DATA OVERRUN (NO BUFFER);M>140$: MOV #-,@S.WUSW(R4) ;SET DATA OVERRUN STATUS;N; SET STOP AND C-BIT;;*160$: BIS #S$WSTP,S.WFL2(R4) ;FLAG TO STOP/ .TITLE KAADRV ROUTINES FOR AA11 .IDENT /1.01/;O; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;V>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 1.01; B. SCHREIBER 26-SEP-77; ; MODIFIED BY -O;U; HOWARD BERNSTEIN - 8/817; HB013 -- ALLOW SWEEPS TO MULTIPLE AA11'S IN ONE CALLR;P1; THIS MODULE CONTAINS ROUTINES TO DRIVE THE AA11D;; SYSTEM MACRO CALLS;T .MCALL KDVDF$,KSWDF$  KDVDF$  KSWDF$ .IF DF N$AA11 O: .SBTTL DASWP INITIATE SYNCHRONOUS OR BURST MODE D/A SWEEP;+; DASWP -- START D/A SWEEP;S; CALLING SEQUENCE:R;LG; CALL DASWP (IBUF, LBUF, NBUF, MODE, IPRSET, IEFN, LDELAY, ICHN, NCHN); ; INPUTS:.;; SEE DOCUMENTATION-;;-"DASWP:: MOV R5,-(SP) ;SAVE ARG PTR' CALL .K.PAA ;VALIDATE ARGS ONTO STACKT .WORD 9. ;NINE ARGSE# .WORD 600 ;MASK FOR REQUIRED ARGSU0 MOV #.AASWB,R4 ;POINT TO AA SWEEP CONTROL BLOCK BCC 20$ ;IF CC CONTINUEF/ MOV #-,R3 ;ELSE SET BAD ARGUMENTSB& BR 600$ ;STORE ERROR CODE AND RETURN%20$: CALL .K.SET ;SET UP COMMON ARGSD BCS 200$ ;IF CS BAD ARGS CALL .K.DLY ;SEE ABOUT DELAY! BCS 300$ ;IF CS RESOURCE IN USEL# CALL .AAGCH ;GET D/A CHANNEL INFO BCS 200$ ;IF CS BAD ARGS! CALL .K.STB ;SET UP BUFFER INFOP% BCS 400$ ;IF CS ILLEGAL BUFFER SPECT$ BIT #S$WNOV,S.WFLG(R4) ;BURST MODE? BEQ 40$ ;IF EQ NOD# MOV (SP)+,R5 ;YES--RESTORE ARG PTRS% JMP .AADMP ;GO DO BURST MODE OUTPUTN40$: .IF DF K$$W11* CALL .AASSC ;SELECT SYNCH. CLOCK ROUTINE& CALL .KLQIN ;INSERT INTO CLOCK QUEUE CALL .KWCNI ;CONNECT CLOCK! BCS 300$ ;IF CS RESOURCE IN USED- BIS #S$WACT,S.WFL2(R4) ;FLAG SWEEP IS ACTIVEE MOV (SP)+,R5 ;RESTORE R5T RETURNN .IFF ;K$$W110/ MOV #-,R3 ;SET OPTION NOT PRESENTF0 BR 500$ ;AND LET HIM FIGURE OUT CLOCK NOT HERE .ENDC ;K$$W11;T; ERROR RETURNS ; ; BAD PARAMETERS; 200$: MOV #-,R3 BR 500$; ; RESOURCE IN USE;:300$: MOV #-,R3 BR 500$; ; ILLEGAL BUFFER SPECIFICATION; 400$: MOV #-,R33500$: MOV R5,SP ;RESTORE PRE-.K.PAA STACK POINTER I6600$: CALL .KLQRM ;REMOVE FROM QUEUE IN CASE INSERTED MOV #1,R4 ;STORE IN FIRST ARGR MOV (SP)+,R5 ;RESTORE ARG PTR CALLR .IESTO  T .SBTTL SCOPE SCOPE CONTROL$;+; SCOPE -- AA11 SCOPE CONTROLE;; CALLING SEQUENCE:T; "; CALL SCOPE (IUNIT, ICNTRL, IOSB); ; INPUTS: ;I; IUNIT AA11 UNIT #0; ICNTRL DATA FOR CSR OF AA11; IOSB RECEIVES STATUS;3 ; OUTPUTS:;#; ICNTRL MOVED INTO PROPER AA11 CSR0; ;- .IF NDF Q$$BUS!SCOPE:: MOV @2(R5),R0 ;GET UNIT #S BMI 120$ ;IF MI ERRORL MOV #.AASWB,R4 ;POINT TO AASWBS CMP R0,S.WUNT(R4) ;LEGAL UNIT?  BGE 120$ ;IF GE NO MOV @4(R5),R1 ;GET CSR BITS9 BIC #^C,R1 ;CLEAR ILLEGAL BITS FOR USER TO TOUCHA, MOV #<.AASWB+S.WU00 D%B11110010CB>,R2 ;POINT TO FIRST UCB20$: DEC R0 ;AT CORRECT UNIT? BLT 40$ ;IF LT YES! ADD #U.LGTH,R2 ;NO--MOVE TO NEXTL BR 20$ ;KEEP GOING040$: MOV R1,@U.CSR(R2) ;FOUND IT...OUTPUT TO CSR MOV #IS.SUC,@6(R5) ;SET SUCCESS 100$: RETURN'120$: MOV #3,R4 ;STORE IN 3RD ARGUMENTT& MOV #-,R3 ;BAD ARGUMENTS CALLR .IESTOI .IFF ;Q$$BUSP$SCOPE:: MOV #3,R4 ;STORE IN 3RD ARG+ MOV #-,R3 ;OPTION NOT PRESENTC CALLR .IESTO  .ENDC ;Q$$BUS O* .SBTTL .AAGCH GET D/A CHANNEL INFORMATION;+'; .AAGCH -- GET D/A CHANNEL INFORMATIONI ; INPUTS:$;I; STACK >> RETURN ADDRESSN; ICHN ADDRESS; NCHN ADDRESS; ; OUPUTS:,+; C-CLEAR CHANNEL INFORMATION SET UP IN SWBS; C-SET ILLEGAL CHANNEL NUMBER;U;-(.AAGCH::MOV (SP)+,R3 ;GET RETURN ADDRESS MOV (SP)+,R2 ;GET ICHN ADDRESSN BNE 20$ ;IF NE GO" MOV #.ZEROW,R2 ;ELSE DEFAULT TO 020$: MOV (R2),R2 ;GET ICHNE BMI 200$ ;IF MI ERROR " CMP R2,S.WMXC(R4) ;LEGAL CHANNEL? BHI 200$ ;IF HI NO MOV (SP)+,R1 ;GET NCHNR BNE 40$ ;IF NE OKH MOV #.ZEROW,R1 ;ELSE USE 0O40$: MOV (R1),R1 ;GET NCHN> BMI 200$ ;IF MI ERRORN BNE 60$ ;IF NE OKD INC R1 ;ELSE USE 1 CHANNEL 60$: MOV R1,-(SP) ;SAVE ON STACK ADD R2,R1 ;COMPUTE END CHANNEL$ DEC R1 ;DON'T GO PAST LAST CHANNEL% CMP R1,S.WMXC(R4) ;LEGAL END CHANNEL  BHI 200$ ;IF HI NO$ MOV R1,S.WHCH(R4) ;YES--FILL IN SWB MOV R2,S.WICH(R4) ;... ' MOV R2,S.WCCH(R4) ;SET CURRENT CHANNELP- MOV (SP),S.WNCH(R4) ;SET # OF CHANNELS TO DOH- MOV (SP)+,S.WCHX(R4);AND SAVED # OF CHANNELSE BIC #^C<3>,R2 ;CLEAR TO 0-3 .IF NDF Q$$BUS, INC R2 ;MAKE IT 1-4  .ENDC ;Q$$BUS ASL R2 ;CREATE WORD INDEXL% MOVB R2,S.WCHB(R4) ;SET CHANNEL BYTEV+ MOVB R2,S.WCBX(R4) ;AND SAVED CHANNEL BYTE/ MOV R3,-(SP) ;PUT RETURN ADDRESS BACK ON STACKM .IF GT N$AA11-1! CALL .AAXCH ;SET UP CSR ADDRESS, .ENDC ;N$AA11-1 CLC ;SUCCESS. RETURN;; ; SOME SORT OF ERROR; 200$: MOV R5,SP ;RESET SP SEC ;FLAG PROBLEM JMP (R3) ;RETURN TO CALLER (* .SBTTL .AANXC ADVANCE TO NEXT D/A CHANNEL;+%; .AANXC -- GO TO NEXT CHANNEL ON D/A ;A ; INPUTS:;.; R4 POINTS TO SWB ; R3 FREEE;R ; OUTPUTS:; !; SWB INCREMENTED TO NEXT CHANNELM; ); THIS ROUTINE MAY BE CALLED AT ANY LEVELV;,;- .PSECT .KSCT1/.AANXC::DEC S.WNCH(R4) ;;;DONE ENOUGH CHANNELS?X BLE 60$ ;;;IF LE YES--RESETN) INC S.WCCH(R4) ;;;NO--GO TO NEXT CHANNEL& ADD #2,S.WCHB(R4) ;;;INC CHANNEL BYTE .IF GT N$AA11-1, MOV S.WAUA(R4),R3 ;;;GET ACTIVE UCB ADDRESS ADD R4,R3 ;;;...5 CMP S.WCCH(R4),U.MAXC(R3) ;;;GOING TO NEXT CONVERTERE BLOS 40$ ;;;IF LOS NO ) ADD #U.LGTH,R3 ;;;YES--POINT TO NEXT D/AE6 MOV U.CSR(R3),S.WCSR(R4) ;;;CHANGE ACTIVE CSR IN SWB# SUB R4,R3 ;;;MAKE RELATIVE TO SWB 2 MOV R3,S.WAUA(R4) ;;;STORE ACTIVE UNIT UCB OFFSET# MOV S.WCCH(R4),R3 ;;;GET CHANNEL # BIC #^C<3>,R3 ;;;MAKE 0-3 .IF NDF Q$$BUS : MOVB #2,S.WCHB(R4) ;;;START WITH FIRST CHANNEL ON NEW DAC .IFF ;Q$$BUS$7 CLRB S.WCHB(R4) ;;;START WITH FIRST CHANNEL ON NEW DACD .ENDC ;Q$$BUS .IFTF ;N$AA11-140$: RETURN ;;; ;V; ALL CHANNELS DONE;;L560$: MOV S.WCHX(R4),S.WNCH(R4) ;;;RESET CHANNEL COUNTV: MOV S.WICH(R4),S.WCCH(R4) ;;;RESET CURRENT CHANNEL NUMBER1 MOVB S.WCBX(R4),S.WCHB(R4) ;;;RESET CHANNEL BYTE; .IFT ;N$AA11-1C;+; .AAXCH -- SET UP CSR AND SWB;E ; INPUTS:#;3; R4 POINTS TO SWB ; R3 FREE$; ; OUTPUTS:;W2; S.WAUA OFFSET FILLED IN SWB (> 1 AA11 IN SYSTEM);; NO OPERATION (1 AA11 IN SYSTEM--DATA FILLED IN AT SYSGEN)O;E;-&.AAXCH::MOV R4,R3 ;POINT TO FIRST UCB# ADD #S.WUCB,R3 ;REALLY POINT AT ITE+20$: CMP S.WCCH(R4),U.MAXC(R3) ;ON THIS AA?; BLOS 40$ ;IF LOS YES& ADD #U.LGTH,R3 ;NO--POINT TO NEXT UCB BR 20$ ;KEEP LOOKING,40$: MOV R3,S.WAUA(R4) ;POINT TO CURRENT UCB$ SUB R4,S.WAUA(R4) ;MAKE IT RELATIVE+ MOV U.CSR(R3),S.WCSR(R4) ;GET CSR INTO SWB4 .ENDC ;N$AA11-1 RETURN U3 .SBTTL .AASSC SELECT D/A SYNCHRONOUS CLOCK ROUTINEN;+:; .AASSC -- SELECT SYNCHRONOUS CLOCK ROUTINE FOR D/A SWEEP;O ; INPUTS:;X00TADATADATADATADATADATADATADATADATA; R4 POINTS TO SWB; SWB SET UP FOR SWEEP;B ; OUTPUTS:;N:; S.WSCR IN SWB MODIFIED TO POINT TO CORRECT CLOCK ROUTINE;0;- .PSECT8.AASSC::MOV #.AASO0,R3 ;ASSUME SINGLE CHANNEL D/A OUTPUT .IF NDF Q$$BUSA7 BIT #S$WSCW,S.WFLG(R4) ;SEE IF SCOPE CONTROL WORD MODEE BNE 60$ ;IF NE YES .IFTF ;Q$$BUS0 MOV S.WNCH(R4),R2 ;GET NUMBER OF CHANNELS TO DO DEC R2 ;ONE CHANNEL? BEQ 80$ ;IF EQ YES DEC R2 ;TWO CHANNELS?E BNE 40$ ;IF NE NOK4 CMPB #6,S.WCHB(R4) ;SEE IF TWO CHANNELS ON SAME D/A3 BHI 40$ ;IF HI NO--LAST ON ONE, AND FIRST ON NEXT* MOV #.AASO1,R3 ;YES--SET FOR TWO CHANNELS BR 80$ ;GO STORE ADDRESS+40$: MOV #.AASO2,R3 ;MORE THAN TWO CHANNELSL .IFT ;Q$$BUSP BR 80$ ;GO STORE ADDRESS460$: MOV #.AASO3,R3 ;SET FOR SCOPE CONTROL WORD MODE .ENDC ;Q$$BUS80$: .IF DF M$$MGE ADD $KRLC5,R3 ;RELOCATE TO APR5 .ENDC ;M$$MGE5 MOV R3,S.WSCR(R4) ;STORE SYNC. CLOCK ROUTINE ADDRESSH: MOV #.AAXIT,S.WSTR(R4) ;SET DUMMY SCHMITT TRIGGER ROUTINE RETURNE O+ .SBTTL .AASOX D/A CLOCK INTERRUPT ROUTINES ;+>; .AASO0 -- SYNCH. CLOCK ROUTINE FOR SINGLE CHANNEL D/A OUTPUT;;F; THIS ROUTINE IS CALLED AT CLOCK INTERRUPTS TO OUTPUT ONE D/A CHANNEL;$ ; INPUTS: ; ; R4 POINTS TO SWB ; R3 FREEA;3 ; OUTPUTS:;O(; C-CLEAR WORD OUTPUT, NOT END OF BUFFER@; C-SET WORD OUTPUT, END OF BUFFER, FORK TO SET EFN OR QUEUE AST;$;- .PSECT .KSCT1:.AASO0: MOV S.WCSR(R4),-(SP) ;;;GET CSR ADDRESS ONTO STACK* MOVB S.WCHB(R4),R3 ;;;GET 2*(CHANNEL + 1)- ADD R3,(SP) ;;;POINT AT PROPER DAC REGISTERU( CALL .KRDWD ;;;GET DATA WORD TO OUTPUT% MOV R3,@(SP)+ ;;;WRITE TO PROPER DAC0.AAXIT: RETURN ;;;RETURN WITH C-BIT FROM KRDWD;+F; .AASO1 -- SYNCH. CLOCK ROUTINE FOR 2-CHANNEL D/A OUTPUT ON SAME AA11;UH; THIS ROUTINE IS CALLED AT CLOCK INTERRUPT LEVEL TO OUTPUT TWO CHANNELS; TO THE D/A ON THE SAME AA11.;Q ; INPUTS:$;-; R4 POINTS TO SWB ; R3 FREEO;. ; OUTPUTS:;;$; C-CLEAR TWO CHANNELS OUTPUT TO D/A9; C-SET TWO CHANNELS OUTPUT, FORK TO SET EFN OR QUEUE ASTA;RB; NOTE: IN THE Q-BUS VERSION, IF S$WSIB IS SET, AN INTENSIFY PULSE6; WILL BE SENT THROUGH DAC3 OF THE SELECTED CONVERTER.;N;- .ENABL LSBD/.AASO1: MOV S.WCSR(R4),-(SP) ;;;GET CSR ADDRESSA* MOVB S.WCHB(R4),R3 ;;;GET 2*(CHANNEL + 1)# ADD R3,(SP) ;;;POINT TO FIRST DACE( CALL .KRDWD ;;;READ FIRST CHANNEL DATA! MOV R3,@(SP) ;;;WRITE TO THE DAC$ ADD #2,(SP) ;;;POINT TO SECOND DAC& CALL .KRDWD ;;;READ SECOND DATA WORD% MOV R3,@(SP)+ ;;;WRITE TO SECOND DAC, .IF DF Q$$BUS- BIT #S$WSIB,S.WFLG(R4) ;;;SET INTENSIFY BIT?F BEQ 20$ ;;;IF EQ NON>.A0DLY::BIT -(SP),(SP)+ ;;;YES--DELAY FOR SECOND DAC TO SETTLE/ MOV S.WCSR(R4),R3 ;;;GET CSR (1ST DAC) ADDRESSR" BIS #1,6(R3) ;;;SET INTENSIFY BIT..A1DLY::BIT -(SP),(SP)+ ;;;DO A DELAY OF SORTS$ BIC #1,6(R3) ;;;CLEAR INTENSIFY BIT .ENDC ;Q$$BUS 20$: RETURNM .DSABL LSBW E# .SBTTL .AASO2 N-CHANNEL D/A OUTPUTT;+9; .AASO2 -- SYNCH. CLOCK ROUTINE FOR N-CHANNEL D/A OUTPUTP;;E; THIS ROUTINE IS CALLED AT CLOCK INTERRUPT LEVEL TO OUTPUT MORE THANS; TWO CHANNELS OF D/A OUTPUT.;; ; INPUTS:D;:; R4 POINTS TO SWB ; R3 FREEO;E ; OUTPUTS:;T2; C-CLEAR ALL CHANNELS OUTPUT--DO NOT NEED TO FORK9; C-SET ALL CHANNELS OUTPUT--FORK FOR END OF BUFFER/SWEEP);;F; NOTE: THIS ROUTINE EXPECTS THAT THE SIZE OF THE BUFFER IS A MULTIPLE>; OF WORDS. IF THIS IS NOT THE CASE, UNEXPECTED RESULTS ; WILL OCCUR.;+;-0.AASO2: CLR -(SP) ;;;SET C-BIT SAVER ONTO STACK%10$: CALL .KRDWD ;;;READ A DATA WORDL ROL (SP) ;;;SAVE C-BIT MOV R3,-(SP) ;;;SAVE DATA WORD % MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESSP, MOVB S.WCHB(R4),-(SP);;;GET 2*(CHANNEL + 1). CLRB 1(SP) ;;;MAKE SURE WE ONLY ADD LOW BYTE$ ADD (SP)+,R3 ;;;POINT TO PROPER DAC$ MOV (SP)+,(R3) ;;;WRITE DATA TO DAC ROR (SP) ;;;CHECK C-BITH BCC 20$ ;;;IF CC CONTINUET& ROL (SP) ;;;SET PERMANENT C-BIT FLAG) BIT #S$WSTP,S.WFL2(R4) ;;;SHOULD WE STOP BNE 40$ ;;;IF NE YES+20$: CALL .AANXC ;;;NO--GO TO NEXT CHANNELL3 CMP S.WCHX(R4),S.WNCH(R4) ;00 D%B11110010;;DONE ENOUGH CHANNELS?B BNE 10$ ;;;NO--DO MORE 40$: ROR (SP)+ ;;;RESTORE C-BIT RETURND .ENDC ;N$AA11 .ENDSP);;;GET 2*(CHANNEL + 1). CLRB 1(SP) ;;;MAKE SURE WE ONLY ADD LOW BYTE$ ADD (SP)+,R3 ;;;POINT TO PROPER DAC$ MOV (SP)+,(R3) ;;;WRITE DATA TO DAC ROR (SP) ;;;CHECK C-BITH BCC 20$ ;;;IF CC CONTINUET& ROL (SP) ;;;SET PERMANENT C-BIT FLAG) BIT #S$WSTP,S.WFL2(R4) ;;;SHOULD WE STOP BNE 40$ ;;;IF NE YES+20$: CALL .AANXC ;;;NO--GO TO NEXT CHANNELL3 CMP S.WCHX(R4),S.WNCH(R4) ;, .TITLE KAASO3 D/A OUTPUT WITH SCOPE CONTROL .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 25-OCT-77;E>; THIS MODULE CONTAINS THE SYNCH. CLOCK ROUTINE FOR D/A OUTPUT; WITH SCOPE CONTROL WORDS.T;E; SYSTEM MACRO CALLS;H .MCALL KSWDF$, KDVDF$ KSWDF$E KDVDF$N .PSECT .KSCT1 O7 .SBTTL .AASO3 SYNCHRONOUS CLOCK ROUTINE FOR D/A OUTPUT ;+E; .AASO3 -- SYNCH. CLOCK ROUTINE FOR D/A OUTPUT W/SCOPE CONTROL WORDSO;R ; INPUTS:; R4 POINTS TO SWB; R3 AVAILABLE; ; OUTPUTS: ; C-CLEAR OK); C-SET FORK REQUESTED FOR EOB OR EOSWEEPL; >; NOTE: THE BUFFER MUST BE A MULTIPLE OF WORDS. THIS; IS NOT CHECKED BY SOFTWARE.C;O;- .IF NDF Q$$BUS 0.AASO3::CLR -(SP) ;;;SET C-BIT SAVER ONTO STACK( CALL .KRDWD ;;;READ SCOPE CONTROL WORD/ BIC #^C,R3 ;;;TRIM TO LEGAL SCOPE BITSH$ MOV R3,@S.WCSR(R4) ;;;OUTPUT TO CSR%10$: CALL .KRDWD ;;;READ A DATA WORDF ROL (SP) ;;;SAVE C-BIT MOV R3,-(SP) ;;;SAVE DATA WORDP% MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESSP, MOVB S.WCHB(R4),-(SP);;;GET 2*(CHANNEL + 1). CLRB 1(SP) ;;;MAKE SURE WE ONLY ADD LOW BYTE$ ADD (SP)+,R3 ;;;POINT TO PROPER DAC$ MOV (SP)+,(R3) ;;;WRITE DATA TO DAC ROR (SP) ;;;CHECK C-BITS BCC 20$ ;;;IF CC CONTINUEA& ROL (SP) ;;;SET PERMANENT C-BIT FLAG) BIT #S$WSTP,S.WFL2(R4) ;;;SHOULD WE STOPI BNE 40$ ;;;IF NE YES+20$: CALL .AANXC ;;;NO--GO TO NEXT CHANNELL3 CMP S.WCHX(R4),S.WNCH(R4) ;;;DONE ENOUGH CHANNELS?B BNE 10$ ;;;NO--DO MORE 40$: ROR (SP)+ ;;;RESTORE C-BIT RETURND .ENDC ;Q$$BUS .ENDSP);;;GET 2*(CHANNEL + 1). CLRB 1(SP) ;;;MAKE SURE WE ONLY ADD LOW BYTE$ ADD (SP)+,R3 ;;;POINT TO PROPER DAC$ MOV (SP)+,(R3) ;;;WRITE DATA TO DAC ROR (SP) ;;;CHECK C-BI$ .TITLE KADAGR A/D AUTO-GAIN RANGING .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 15-SEP-77;E?; THIS ROUTINE PERFORMS AUTO GAIN RANGING FOR THE AD11-K/AM11-KS .MCALL KSWD00TADATADATADATADATADATADATADATADATAF$, KDVDF$ KSWDF$O KDVDF$R .PSECT .KSCT1 S, .SBTTL .ADAGR A/D AUTO-GAIN RANGING ROUTINE;+%; .ADAGR -- PERFORM AUTO-GAIN RANGINGO;A ; INPUTS: ; *; A/D CONVERTER MUST HAVE THE DONE BIT SET; R3 POINTS TO CSR;Q ; OUTPUTS:;T; R3 CONVERTED VALUE;O;-.ADAGR::MOV R2,-(SP) ;;;SAVE R2I% MOV 2(R3),R2 ;;;READ CONVERTED VALUEC .IF DF A$$M11/ CLR -(SP) ;;;SET THE GAIN BITS ONTO THE STACK7- CMP R2,#4000 ;;;IS NUMBER IN NEGATIVE RANGE?  BGE 20$ ;;;IF GE YES NEG R2 ;;;NEGATE RESULT! BEQ 100$ ;;;IF ZERO GET OUT NOW1- BIC #^C<7777>,R2 ;;;ONLY LOOK AT TWELVE BITSI120$: CMP R2,#4200 ;;;NEED TO SAMPLE ABOVE GAIN 4?A BLT 30$ ;;;IF LT YES" CMP R2,#5000 ;;;SAMPLE AT GAIN 1? BGE 100$ ;;;IF GE YES4 MOV #<1*20>*400,(SP) ;;;NO--SET TO SAMPLE AT GAIN 4 BR 40$ ;;;GO SAMPLER530$: MOV #<2*20>*400,(SP) ;;;SET TO SAMPLE AT GAIN 16$# CMP R2,#4040 ;;;SAMPLE AT GAIN 16?I BGE 40$ ;;;IF GE YES5 MOV #<3*20>*400,(SP) ;;;NO--SET TO SAMPLE AT GAIN 64;-40$: BIS (SP),(R3) ;;;SET CORRECT MUX CHANNEL0 INC (R3) ;;;START CONVERSION$ MOV #TMO$AD,R2 ;;;GET TIMEOUT COUNT.60$: BIT #AD$ERR!AD$DON,(R3) ;;;ERROR OR DONE? BMI 80$ ;;;IF MI ERROR BNE 100$ ;;;IF NE DONE" DEC R2 ;;;NOT YET--CHECK TIMEOUT BGT 60$ ;;;IF GT NOT TIMEOUT) MOV #ADTMOV,R3 ;;;YES--SET TIMEOUT VALUEO BR 90$ ;;;RETURN280$: MOV 2(R3),R3 ;;;READ VALUE TO CLEAR CONVERTER" MOV #ADERRV,R3 ;;;SET ERROR VALUE(90$: TST (SP)+ ;;;CLEAR GAIN FROM STACK BR 120$ ;;;RETURNA*100$: MOV 2(R3),R3 ;;;READ CONVERTED VALUE- BIS (SP)+,R3 ;;;INSERT GAIN BITS INTO RESULT .IFF ;A$$M11; MOV R2,R3 ;;;POSITION RESULT .ENDC ;A$$M11 120$: MOV (SP)+,R2 ;;;RESTORE R2 RETURNE .END;IF NE DONE" DEC R2 ;;;NOT YET--CHECK TIMEOUT BGT 60$ ;;;IF GT NOT TIMEOUT) MOV #ADTMOV,R3 ;;;YES--SET TIMEOUT VALUEO BR 90$ ;;;RETURN280$: MOV 2(R3),R3 ;;;READ VALUE TO CLEAR CONVERTER" MOV #ADERRV,R3 ;;;SET ERROR VALUE(90$: TST (SP)+ ;;;CLEAR GAIN FROM STACK BR 120$ ;;;RETURNA*100$: MOV 2(R3),R3 ;;;READ CONVE( .TITLE KADDRV ROUTINES TO DRIVE THE ADC .IDENT /M01.00/; ; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.M;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 4-SEP-77 ;E;; THIS MODULE CONTAINS ROUTINES TO ACCESS THE A/D CONVERTERG;T; SYSTEM MACRO CALLS;T .MCALL CINT$S,KDVDF$,KSWDF$ KDVDF$S KSWDF$L .IF DF N$AD11 N;+1; THE A/D SWEEP OPERATES IN THE FOLLOWING MANNER:C;O5; 1) CONNECT FIRST ACTIVE A/D CONVERTER TO INTERRUPTSA*; 2) ARM CLOCK (THIS IS HANDLED ELSEWHERE),; 3) ENABLE FIRST A/D CONVERTER TO INTERRUPT; ; UPON RECEIVING INTERRUPT: ; .; 1) READ INTERRUPTING A/D CONVERTER AND STORE8; 2) FOR ALL OTHER 'NCHN'-1 SAMPLES, SET THE 'GO' BIT IN8; THE PROPER ADCSR AND TWIDDLE WITH A TIMEOUT WAITING; FOR THE CONVERSION.;; 3) AFTER ALL 'NCHN' SAMPLES HAVE BEEN TAKEN, RE-ARM FIRST.; A/D TO INTERRUPT AGAIN.;- . .SBTTL .ADCNI CONNECT A/D TO INTERRUPT VECTOR;+/; .ADCNI -- CONNECT A/D CONVERTER TO INTERRUPTSM;O ; INPUTS: ;D6; SWEEP CONTROL BLOCK ALL SETUP WITH R4 POINTING TO IT;T ; OUTPUTS:;C ; C-CLEAR SUCCESSFULLY CONNECTED; C-SET COULD NOT CONNECTA;S;-5.ADCNI::CALL .ADSLI ;SELECT PROPER INTERRUPT ROUTINEN' BCS 60$ ;IF CS INT ROUTINE NOT LOADEDA) MOV S.WAUA(R4),R3 ;GET PTR 00 D%B11110010TO ACTIVE UCB ADD R4,R3 ;REALLY POINT TO ITE: BIT #UF$CIN,U.FLG(R3) ;IS IT ALREADY CONNECTED TO VECTOR? BNE 40$ ;YES--DON'T RETRYA< CINT$S U.VEC(R3),#$KBASE,#.ADINT,#.ADEDI,S.WPRI(R4),#.ADAST" BCS 60$ ;IF CS COULD NOT CONNECT/ BIS #UF$CIN,U.FLG(R3);FLAG CONNECTED TO VECTORG40$: CLC ;FLAG GOOD 60$: RETURN  C2 .SBTTL .ADEDI A/D ENABLE/DISABLE ROUTINE FOR CINT;+7; .ADEDI -- ENABLE/DISABLE CONNECT TO INTERRUPT ROUTINEB;6A; THIS ROUTINE IS CALLED BY THE EXECUTIVE ON CONNECTS/DISCONNECTSA%; FROM INTERRUPT VECTORS FOR THE A/D.O;E ; INPUTS:C;U'; R1 POINTS TO INTERRUPT TRANSFER BLOCKO+; C-SET DISCONNECTING FROM INTERRUPT VECTORE(; C-CLEAR CONNECTING TO INTERRUPT VECTOR;A ; OUTPUTS:;I; A/D CONVERTER IS DISABLED#.; .KTKCB IS FILLED IN WITH TCB ADDRESS OF TASK;C;- .PSECT .KSCT1:.ADEDI: MOV .ADSWB+S.WCSR,R0 ;GET CSR ADDRESS OF CONVERTER: MOV 2(R0),R2 ;READ CONVERTER IN CASE LINGERING CONVERSION CLR (R0) ;STOP CONVERTER7 MOV @#$TKTCB,.KTKCB ;GET MY TCB ADDRESS FOR FUTURE REFI RETURNV O+ .SBTTL .ADSLI SELECT A/D INTERRUPT ROUTINEI;+$; .ADSLI -- SELECT INTERRUPT ROUTINE;N ; INPUTS:M;T ; SWB SETO; ; OUTPUTS:;C ; C-CLEAR OK-; .ADINT MODIFIED TO VECTOR TO PROPER ROUTINE ; AND S.WSTR SET IN .ADSWBL;I$; C-SET INTERRUPT ROUTINE NOT LOADED;S;- .PSECTA=.ADSLI::MOV #.ADSTR,S.WSTR(R4) ;SET UP THE ST ROUTINE ADDRESSR* MOV #.ADIN0,R3 ;THIS IS ROUTINE OF CHOICE2 MOV S.WNCH(R4),-(SP);GET # OF CHANNELS ONTO STACK .IF DF A$$M11 ! U$$ADIR0 BIT #S$WACA,S.WFL2(R4) ;ABS CHANNEL ADDRESSING?2 BNE 40$ ;IF NE YES--CHECK OUT NUMBER OF CHANNELS2 MOV S.WFLG(R4),-(SP);NO--GET MODE WORD ONTO STACK) BIC #^C<7>,(SP) ;CLEAR ALL BUT GAIN BITSE .ENDC ;A$$M11 ! U$$ADIN4 .IF DF U$$ADI ;USER-SUPPLIED A/D INTERRUPT ROUTINE& CMP (SP),#7 ;USER INTERRUPT ROUTINE? BEQ 50$ ;IF EQ YES .IFTF ;U$$ADI .IF DF A$$M11' CMP (SP)+,#5 ;IS IT PROGRAMMABLE GAIN?E BEQ 20$ ;IF EQ YES1 MOV #.ADIN2,R3 ;NO--ASSUME SINGLE CHANNEL W/GAINU DEC (SP)+ ;SEE IF ONE CHANNEL  BEQ 60$ ;IF EQ YES0 MOV #.ADIN3,R3 ;NO--SET FOR MULT CHANNEL W/GAIN BR 60$ ;GO FINISH UP<20$: MOV #.ADIN4,R3 ;ASSUME SINGLE CHANNEL PROGRAMMABLE GAIN DEC (SP)+ ;CHECK # OF CHANNELS BEQ 60$ ;IF EQ ALL SET6 MOV #.ADIN5,R3 ;ELSE SET FOR MULT CHANNELS PROG. GAIN BR 60$ ;FINISH UPT .ENDC ;A$$M11740$: DEC (SP)+ ;ABS CHANNEL ADDRESSING--CHECK CHANNELS+ BEQ 60$ ;IF EQ ALL SET/ MOV #.ADIN1,R3 ;ELSE SET FOR MULTIPLE CHANNELSA .IFT ;U$$ADIN# BR 60$ ;SKIP TO STORE ISR ADDRESSN50$: TST (SP)+ ;CLEAR STACK& MOV #.ADINU,R3 ;USE USER-SUPPLIED ISR .ENDC ;U$$ADI%60$: TST R3 ;SEE IF WE GOT A ROUTINE $ BEQ 100$ ;IF EQ ROUTINE NOT LOADED .IF DF M$$MGE ADD $KRLC5,R3 ;RELOCATE TO APR5 .ENDC ;M$$MGE6 MOV R3,.ADINT+2 ;SET THE INTERRUPT VECTOR XFR ADDRESS CLC ;SET GOOD RETURN0 RETURNP(100$: SEC ;FLAG INT ROUTINE NOT LOADED RETURN6 # .SBTTL .ADSTR ENABLE A/D CONVERTER ;+'; .ADSTR/.ADENX -- ENABLE A/D CONVERTER; ; INPUTS:T;T ; .ADSTR --S;"; R4 POINTS TO SWEEP CONTROL BLOCK; R3 AVAILABLE;- ; .ADENX --;."; R4 POINTS TO SWEEP CONTROL BLOCK; R3 POINTS TO CSR;Q ; OUTPUTS:;O1; ADCSR IS ARMED TO INTERRUPT ON CLOCK OR TRIGGER3;E/; NOTE: THIS ROUTINE MAY BE CALLED AT ANY LEVELT;;;- .PSECT .KSCT1*.ADSTR::MOV S.WCSR(R4),R3 ;GET CSR ADDRESS8.ADENX::BIT #S$WNOV,S.WFLG(R4) ;TRIGGER DRIVEN SAMPLING? BNE 20$ ;IF NE YES .IF NDF Q$$BUS2 MOV #AD$OVE!AD$ENB,-(SP) ;NO--SET OVERFLOW ENABLE BR 40$120$: MOV #AD$ESE!AD$ENB,-(SP) ;SET TRIGGER ENABLEB .IFF ;Q$$BUSB9 MOV #AD$IEN!AD$OVE!AD$ENB,-(SP) ;NO--SET OVERFLOW ENABLE BR 40$T820$: MOV #AD$IEN!AD$ESE!AD$ENB,-(SP) ;SET TRIGGER ENABLE .ENDC ;Q$$BUS<40$: MOVB S.WCHB(R4),1(SP);SET CHANNEL NUMBER INTO CSR-TO-BE% MOV (SP)+,(R3) ;JAM A/D CSR REGISTERC RETURN  T$ .SBTTL .DSBAD DISABLE A/D CONVERTER;+!; .DSBAD -- DISABLE A/D CONVERTER$;I ; INPUTS:;F"; R4 POINTS TO SWEEP CONTROL BLOCK;P ; OUTPUTS:;F; A/D CONV00ÀŀTADATADATADATADATADATADATADATADATAERTER IS DISABLEDV; ALL REGISTERS INTACT;T;- .IF GT N$AD11-1*.DSBAD::MOV R3,-(SP) ;SAVE R3 ON THE STACK MOV R4,R3 ;GET SWB ADDRESS# ADD #S.WUCB,R3 ;POINT TO FIRST UCB-3 MOV S.WUNT(R4),-(SP);SET COUNT OF UNITS ONTO STACKV.20$: BIT #UF$CIN,U.FLG(R3) ;IS UNIT CONNECTED? BEQ 40$ ;IF EQ NO ( CLR @U.CSR(R3) ;YES--DISABLE INTERRUPTS&40$: ADD #U.LGTH,R3 ;POINT TO NEXT UCB# DEC (SP) ;CHECK IF DONE ALL UNITSI BGT 20$ ;IF GT NO4 TST (SP)+ ;YES--CLEAR STACK MOV (SP)+,R3 ;YES--RESTORE R3 RETURNS .IFF ;N$AD11-1T*.DSBAD::CLR @S.WCSR(R4) ;DISABLE CONVERTER RETURN3 .ENDC ;N$AD11-1 .ENDC ;N$AD11 .ENDSWB ADDRESS# ADD #S.WUCB,R3 ;POINT TO FIRST UCB-3 MOV S.WUNT(R4),-(SP);SET COUNT OF UNITS ONTO STACKV.20$: BIT #UF$CIN,U.FLG(R3) ;IS UNIT CONNECTED? BEQ 40$ ;IF EQ NO ( CLR @U.CSR(R3) ;YES--DISABLE INTERRUPTS&40$: ADD #U.LGTH,R3 ;POINT TO NEXT UCB# DEC (SP) ;CHECK IF DONE ALL UNITSI BGT 20$ ;IF GT NO4 TST (SP)+ ;YES--CLEAR STACK MOV (SP)+,R3 ;YES--RESTORE ' .TITLE KADGCH GET CHANNEL INFO FOR A/DL .IDENT /02.00/T; ; COPYRIGHT (C) 1977, 1978, 1980/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.C;$>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 02.00 ; B. SCHREIBER 5-JUL-77E;E; MODIFIED BY:;U; M. S. HARVEY 4-JAN-80T(; MSH082 -- CORRECT GAIN RANGING OPTION;T:; THIS MODULE CHECKS THE CHANNEL INFORMATION FOR A/D SWEEP;N; SYSTEM MACRO CALLS;N .MCALL KSWDF$ KSWDF$I .IF DF N$AD11 .IF DF A$$M11<GAINTB: .BYTE 20,40,60 ;TABLE OF GAIN BITS FOR GAINS 4,16,64 .EVEN .ENDC ;A$$M11 E- .SBTTL .ADGCH GATHER A/D CHANNEL INFORMATIONA;+'; .ADGCH -- GET A/D CHANNEL INFORMATIONS;T ; INPUTS:Y;C7; STACK SETUP FROM .K.PAA AND ALL INFORMATION UP TO THE ; CHANNEL PICKED OFFS1; R5 HOLDS OLD SP BEFORE .K.PAA (SETUP BY .K.PAA)N ; R4 SWEEP CONTROL BLOCK ADDRESS;E ; OUTPUTS:;A ; C-CLEAR CHANNEL STUFF SETUP OK-; S.WICH SETUP WITCH STARTING CHANNEL NUMBER'; S.WNCH SETUP WITH NUMBER OF CHANNELSB0; S.WAUA SETUP WITH THE ACTIVE UNIT UCB ADDRESS;4;.'; C-SET ERROR IN CHANNEL SPECIFICATIONSH!; SP RESET TO VALUE BEFORE .K.PAA;;-+.ADGCH::MOV (SP)+,R3 ;PICKUP RETURN ADDRESSU+ BIT #S$WADC,S.WFL2(R4) ;WAS SETADC CALLED?N3 BNE 300$ ;IF NE YES--WE DON'T HAVE TO DO ANYTHINGL0 TST S.WCHI(R4) ;DO WE HAVE A CHANNEL INCREMENT? BNE 10$ ;IF NE YES$ MOV #1,S.WCHI(R4) ;NO--DEFAULT TO 12 BIC #S$WDIF,S.WFL2(R4) ;AND NO DIFFERENTIAL INPUT .IF DF A$$M11110$: BIT #S$WACA,S.WFL2(R4) ;ABS CHAN ADDRESSING?E BNE 15$ ;IF NE YES. BIT #7,S.WFLG(R4) ;NO--ARE ANY GAIN BITS SET?- BNE 15$ ;IF NE YES--NOT ABS CHAN ADDRESSING.4 BIS #S$WACA,S.WFL2(R4) ;NO--SET ABS CHAN ADDRESSING .IFF ;A$$M11A710$: BIS #S$WACA,S.WFL2(R4) ;SET ABS CHANNEL ADDRESSINGW .IFTF ;A$$M11.15$: CALL .ADCMC ;COMPUTE CHANNEL INFORMATION2 MOV (SP)+,R2 ;GET ADDRESS OF FIRST CHANNEL NUMBER BNE 20$ ;IF NE GO GET IT) MOV #.ZEROW,R2 ;DEFAULT--POINT AT A ZERO)20$: MOV (R2),R2 ;GET THE CHANNEL NUMBER(! BMI 200$ ;IF MI SURELY AN ERROR$, BIT #S$WDIF,S.WFL2(R4) ;DIFFERENTIAL INPUT? BEQ 40$ ;IF EQ NO1' BIC #1,R2 ;YES--FORCE AN EVEN CHANNEL-40$: CMP R2,S.WMXC(R4) ;LEGAL CHANNEL NUMBER?S BHI 200$ ;IF HI NO$ MOV (SP)+,R1 ;GET ADDRESS OF 'NCHN' BNE 60$ ;IF NE GO GET IT) MOV #.ZEROW,R1 ;DEFAULT--POINT AT A ZEROC60$: M00ˀ D%B11110010OV (R1),R1 ;GET 'NCHN'R! BMI 200$ ;IF MI CANNOT BE LEGALB BNE 80$ ;IF NE OKG INC R1 ;ELSE SET TO 1 CHANNELT'80$: MOV R1,-(SP) ;SAVE 'NCHN' ON STACKT& MOV R1,-(SP) ;MAKE A DESTROYABLE COPY! MOV R2,R1 ;SET STARTING CHANNELL)90$: ADD S.WCHI(R4),R1 ;INCREMENT CHANNELQ1 DEC (SP) ;THE FULL NUMBER OF CHANNEL INCREMENTS: BGT 90$ ;...$ TST (SP)+ ;KEEP THE STACK STRAIGHT0 DEC R1 ;DON'T CHECK ONE AFTER THE LAST CHANNEL' CMP R1,S.WMXC(R4) ;LAST CHANNEL LEGAL?R BHI 200$ ;IF HI NO--ERROR6 MOV R1,S.WHCH(R4) ;SET HIGHEST CHANNEL WE WILL ACCESS' MOV R2,S.WICH(R4) ;SET INITIAL CHANNEL ' MOV R2,S.WCCH(R4) ;AND CURRENT CHANNELP2 MOV (SP),S.WNCH(R4) ;AND NUMBER OF CHANNELS TO DO7 MOV (SP)+,S.WCHX(R4) ;SET THE SAVED NUMBER OF CHANNELSD3 MOV R3,-(SP) ;PUT RETURN ADDRESS BACK ON THE STACKU .IF GT N$AD11-12 CALL .ADXCH ;GO SETUP THE UCB POINTER IN THE SWB .ENDC ;N$AD11-1 CLR S.WGNW(R4) ;CLEAR GAIN WORD .IFT ;A$$M11.* BIT #7,S.WFLG(R4) ;WAS ANY GAIN SELECTED?3 BEQ .STCHB ;IF EQ NO--SET CHANNEL BYTE AND RETURNE& MOV S.WFLG(R4),R3 ;YES--GET FLAG WORD" BIC #^C<7>,R3 ;CLEAR ALL BUT GAIN% CMP R3,#5 ;IS IT PROGRAMMABLE GAIN?N. BEQ .STCHB ;IF EQ YES--WILL SAMPLE AT GAIN 1# BHI .STCHB ;IF HI NOT A REAL GAINC DEC R3 ;MAKE 2-4 IN RANGE 1-3R% BEQ .STCHB ;IF GAIN 1 SKIP THE REST % MOVB R3,S.WGNW(R4) ;STORE GAIN VALUE 7 MOVB GAINTB-1(R3),S.WGNW+1(R4) ;STORE GAIN BITS IN SWB( .ENDC ;A$$M11( BR .STCHB ;SET CHANNEL BYTE AND RETURN;N; ERROR--RESET STACK;T200$: MOV R5,SP ;RESET STACKE SEC!240$: JMP (R3) ;RETURN TO CALLERT; 1; SETADC WAS CALLED...JUST CLEAR STACK AND RETURN5;I9300$: CMP (SP)+,(SP)+ ;POP OFF ADDRESSES OF ICHN AND NCHNP CLC ;FLAG SUCCESS JMP (R3) ;RETURN TO CALLER C- .SBTTL .STCHB COMPUTE CHANNEL BYTE FOR SWEEPG;+$; .STCHB -- SET S.WCHB FOR A/D SWEEP;EB; THIS ROUTINE COMPUTES THE INITIAL CHANNEL BYTE FOR THE A/D SWEEP; ; INPUTS:$;1; SWEEP CONTROL BLOCK SET UP; ; OUTPUTS:;N; S.WCHB AND S.WCBX SET UP;$;-6.STCHB::MOV S.WAUA(R4),R3 ;GET ACTIVE UNIT UCB ADDRESS ADD R4,R3 ;POINT TO THE UCBE' MOV S.WICH(R4),R2 ;GET INITIAL CHANNEL$ .IF DF A$$M110 BIT #S$WACA,S.WFL2(R4) ;ABS CHANNEL ADDRESSING? BEQ 100$ ;IF EQ NO .IFTF ;A$$M11;B; ABS CHANNEL ADDRESSING;T-40$: MOV R4,-(SP) ;SET SWB ADDRESS ONTO STACKA% ADD #S.WUCB,(SP) ;POINT TO FIRST UCBH%45$: CMP R3,(SP) ;BACK TO FIRST UCB?P BHI 50$ ;IF HI NO% TST (SP)+ ;YES--KEEP STACK STRIAGHTP BR 120$ ;FINISH UP$50$: SUB #U.LGTH,R3 ;NO--BACK UP ONE+ MOV #16.,-(SP) ;ASSUME NO AM11 ON THIS A/DA BIT #UF$AMK,U.FLG(R3) ;CORRECT? BEQ 60$ ;IF EQ YES$ MOV #64.,(SP) ;NO--MAKE 64 CHANNELS"60$: SUB (SP)+,R2 ;BACK UP CHANNEL BR 45$ ;GO ON1 .IFT ;A$$M11&100$: BIC #^C<17>,R2 ;CLEAR EXTRA BITS .ENDC ;A$$M11)120$: BISB S.WGNW+1(R4),R2 ;SET GAIN BITS#% MOVB R2,S.WCHB(R4) ;SET CHANNEL BYTEC* MOVB R2,S.WCBX(R4) ;AND SAVE CHANNEL BYTE) CLC ;FLAG SUCCESS (RETURN FROM .ADGCH)R RETURNB 2) .SBTTL .ADCMC COMPUTE NUMBER OF CHANNELSC;+>; .ADCMC -- COMPUTE NUMBER OF CHANNELS INFORMATION FOR A SWEEP;G@; THIS ROUTINE WILL SET UP THE SWB FOR THE AD11 WITH THE CORRECT<; CHANNEL INFORMATION DEPENDING ON WHETHER ABSOLUTE CHANNEL D; ADDRESSING IS IN EFFECT. IT WILL ALSO SET THE CORRECT MAX CHANNEL+; INFORMATION INTO THE SWEEP CONTROL BLOCK.A;B ; INPUTS: ;S$; R4 POINTS TO A SWEEP CONTROL BLOCK;W ; OUTPUTS:;V.; THE SWB AND UNIT CONTROL BLOCKS ARE MODIFIED;A;-.ADCMC: MOV R3,-(SP) ;SAVE R3C MOV R4,R3 ;GET SWB POINTER# ADD #S.WUCB,R3 ;POINT TO FIRST UCBN( MOV #-1,R2 ;INIT CHANNEL COUNTER TO -1 .IF GT N$AD11-10 MOV S.WUNT(R4),-(SP) ;SET # OF UNITS ONTO STACK .IFTF ;N$AD11-1;H; BACK HERE FOR EACH UNITR;I%20$: MOV #16.,R1 ;ASSUME 16 CHANNELSC .IF DF A$$M11/ BIT #UF$AMK,U.FLG(R3) ;THIS AD11 HAVE AN AM11? BEQ 40$ ;IF EQ NOP> BIT #S$WACA,S.WFL2(R4) ;YES--ARE WE DOING ABSOLUTE CHAN ADDR?+ BEQ 40$ ;IF EQ NO--16 CHAN EVEN WITH AM11+ MOV #64.,R1 ;YES--INCREASE TO 64 CHANNELSG00ӀـTADATADATADATADATADATADATADATADATA .ENDC ;A$$M1140$: ADD R1,R2 ;UP THE COUNTER/ MOV R2,U.MAXC(R3) ;SET MAX CHANNEL WORD IN UCBG .IFT ;N$AD11-1S! ADD #U.LGTH,R3 ;MOVE TO NEXT UCBS DEC (SP) ;SEE IF MORE TO DO BGT 20$ ;IF GT YES--GO DO IT( INC (SP)+ ;CLEAR UNIT COUNT FROM STACK .ENDC ;N$AD11-1< MOV R2,S.WMXC(R4) ;SET MAX CHANNEL # IN SWEEP CONTROL BLOCK MOV (SP)+,R3 ;RESTORE R34 RETURNR E* .SBTTL .ADNXC ADVANCE TO NEXT A/D CHANNEL;+-; .ADNXC -- INCREMENT TO THE NEXT A/D CHANNELR;E7; THIS ROUTINE ADVANCES .ADSWB TO THE NEXT A/D CHANNEL. ; ; INPUTS:M;R; R4 POINTS TO SWB; .ADSWB SETUP;C ; OUTPUTS:;A2; R3 SETUP TO THE UCB OF THE CORRECT A/D CONVERTOR(; .ADSWB INCREMENTED TO THE NEXT CHANNEL;S;- .PSECT .KSCT1;.ADNXC::DEC S.WNCH(R4) ;;;DECR THE NUMBER OF CHANNELS TO DO.& BLE 60$ ;;;IF LE WE HAVE DONE ENOUGH2 ADD S.WCHI(R4),S.WCCH(R4) ;;;MOVE TO NEXT CHANNEL9 ADD S.WCHI(R4),S.WCHB(R4) ;;;INCREMENT CHANNEL BYTE ALSOC .IF GT N$AD11-1, MOV S.WAUA(R4),R3 ;;;GET ACTIVE UCB ADDRESS ADD R4,R3 ;;;REALLY GET IT520$: CMP S.WCCH(R4),U.MAXC(R3) ;;;GOING TO NEXT AD11?T! BLOS 40$ ;;;IF LOS NO--ALL DONET;H ; MOVE TO THE NEXT A/D CONVERTOR;  .IF DF A$$M11; BICB #^C<77>,S.WCHB(R4) ;;;ASSUME AM11/ABS CHAN ADDRESSING.! BIT #UF$AMK,U.FLG(R3) ;;;AM11-K?N# BEQ 25$ ;;;IF EQ NO--MUST RE-MASKE2 BIT #S$WACA,S.WFL2(R4) ;;;ABS CHANNEL ADDRESSING?$ BNE 30$ ;;;IF NE YES--MASK IS FINE .ENDC ;A$$M11?25$: BICB #^C<17>,S.WCHB(R4) ;;;NO--MUST RE-MASK TO 16 CHANNELSC*30$: ADD #U.LGTH,R3 ;;;MOVE R3 TO NEXT UCB% MOV R3,S.WAUA(R4) ;;;POINT SWB TO ITO6 SUB R4,S.WAUA(R4) ;;;MAKE IT RELATIVE TO START OF SWB9 MOV U.CSR(R3),S.WCSR(R4) ;;;PUT ACTIVE UNIT CSR INTO SWB .ENDC ;N$AD11-140$: RETURN ;;;/; (; ALL REQUESTED CHANNELS ARE DONE--RESET;MD60$: MOV S.WCHX(R4),S.WNCH(R4) ;;;RESET THE NUMBER OF CHANNELS TO DO4 MOV S.WICH(R4),S.WCCH(R4) ;;;AND THE CHANNEL NUMBER1 MOVB S.WCBX(R4),S.WCHB(R4) ;;;RESET CHANNEL BYTE. ;;;DROP INTO .ADXCH K+ .SBTTL .ADXCH COMPUTE UCB ADDRESS FOR AD11 ;+0; .ADXCH -- COMPUTE THE UCB ADDRESS FOR THE AD11;B=; THIS ROUTINE COMPUTES THE UCB ADDRESS OF THE AD11 GIVEN THER,; CHANNEL NUMBER IN THE SWEEP CONTROL BLOCK.; ; INPUTS:D;1&; R4 POINTS TO A/D SWEEP CONTROL BLOCK; .ADSWB SETUP;N ; OUTPUTS:;0; R3 POINTS TO CORRECT UCB; S.WAUA SETUP IN THE SWBN; S.WCSR SET UP IN SWB;,; NOTE:);;:; THIS ROUTINE MAY BE EXECUTED AT EITHER TASK OR INTERRUPT; LEVEL.;.;- .IF GT N$AD11-1 .ADXCH::MOV R4,R3 ;POINT TO SWB& ADD #S.WUCB,R3 ;POINT UP TO FIRST UCB<20$: CMP S.WCCH(R4),U.MAXC(R3) ;CAN CHANNEL BE ON THIS UNIT?* BLOS 40$ ;IF LOS YES--FOUND CORRECT UNIT% ADD #U.LGTH,R3 ;NO--BUMP TO NEXT UCB BR 20$ ;KEEP A'LOOKING/40$: MOV R3,S.WAUA(R4) ;POINT TO UCB IN THE SWB5 SUB R4,S.WAUA(R4) ;MAKE PTR RELATIVE TO START OF SWBA3 MOV U.CSR(R3),S.WCSR(R4) ;SET CSR ADDRESS INTO SWBE ;FOR FASTER ACCESS  .ENDC ;N$AD11-1 RETURN ;BACK TO CALLER. .ENDC ;N$AD11 .END.ADXCH::MOV R4,R3 ;POIN$ .TITLE KADINP SINGLE CHAN A/D INPUT .IDENT /2.02/;#; COPYRIGHT (C) 1977, 1981/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.T;D>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 2.02; B. SCHREIBER 20-OCT-77; ; MODIFIED BY:; ; M. S. HARVEY 4-JAN-80D(; MSH082 -- CORRECT GAIN RANGING 00ۀ D%B11110010OPTION;T; H. BERNSTEIN 20-OCT-815; HB018 -- ADD UCB OFFSET TO ACCESS SUBSEQUENT UCBs;'; HB039 -- MAKE U.LGTH IMMEDIATE MODEJ; ;C1; THIS MODULE PERFORMS A SINGLE A/D CHANNEL INPUTD; ; SYSTEM MACRO CALLS; .MCALL KSWDF$, KDVDF$ KSWDF$E KDVDF$  R- .SBTTL ADINP/IADINP SINGLE CHANNEL A/D INPUT ;+6; ADINP/IADINP -- SINGLE CHANNEL A/D SINGLE SHOT INPUT;E=; THIS ROUTINE SAMPLES ONE A/D CHANNEL ONE TIME (SINGLE SHOT) ;S; CALLING SEQUENCE: ;H ; CALL ADINP (MODE, ICHAN, IVAL);T; WHERE:;E.; MODE DESCRIBES THE MODE (SEE DOCUMENTATITON) ; ICHAN IS THE CHANNEL TO SAMPLE; IVAL IS THE SAMPLED VALUED; ; OUTPUTS:;M; IVAL THE SAMPLE VALUE/;H;-ADINP:: IADINP::# CALL .K.PAA ;PUSH ARGS ONTO STACKD .WORD 3 ;THREE ARGS .WORD 0 ;NONE REQUIRED. BCS 140$ ;HOW CAN YOU LOSE IF NONE REQUIRED? MOV (SP)+,R0 ;GET MODE ADDRESSI BNE 20$ ;IF NE CONTINUEM& MOV #.ZEROW,R0 ;ELSE USE DEFAULT OF 020$: MOV (R0),R4 ;GET MODE $ MOV (SP)+,R1 ;GET CHANNEL # ADDRESS BNE 40$ ;BR IF SUPPLIEDD MOV #.ZEROW,R1 ;USE CHANNEL 0"40$: MOV (R1),R5 ;GET THE CHANNEL0 CALL .ADIFU ;FIND A/D UNIT AND RETURN WITH CSR( ; ADDRESS IN R3, AND LH OF CSR IN R2( BCS 120$ ;IF CS ILLEGAL CHANNEL NUMBER, MOVB R2,1(R3) ;SET THE CHANNEL INTO THE CSR INC (R3) ;START THE CONVERSION( MOV #TMO$AD,R2 ;GET THE TIMEOUT COUNTER,60$: BIT #AD$ERR!AD$DON,(R3) ;ERROR OR DONE? BMI 80$ ;IF MI ERROR BNE 100$ ;IF NE DONE DEC R2 ;NEITHER--TIMEOUT? BGT 60$ ;NOT YET' MOV #ADTMOV,R0 ;YES--SET TIMEOUT VALUEE BR 120$ ;FINISH UP;C; A/D CONVERSION ERROR; $80$: MOV 2(R3),R0 ;READ VALUE ANYHOW .IF DF Q$$BUS" BIC #AD$ERR,(R3) ;CLEAR ERROR BIT .ENDC ;Q$$BUS MOV #ADERRV,R0 ;SET ERROR VALUE BR 120$ ;FINISH;; "; CONVERSION COMPLETED--READ VALUE;T100$: ;REF LABELM .IF DF A$$M11 CMP R4,#5 ;GAIN RANGING? BNE 110$ ;IF NE NO- CALL .ADIGR ;YES--PERFORM AUTO-GAIN RANGING0 BR 120$ ;RETURNC .IFTF ;A$$M11(110$: MOV 2(R3),R0 ;READ CONVERTED VALUE .IFT ;A$$M11 & TST R4 ;ABSOLUTE CHANNEL ADDRESSING?. BEQ 120$ ;IF EQ YES--SKIP GAIN BIT INSERTION MOV (R3),R1 ;NO--GET CSR WORDC( BIC #147777,R1 ;CLEAR ALL BUT GAIN BITS& BIS R1,R0 ;SET GAIN BITS INTO RESULT .ENDC ;A$$M11$120$: MOV (SP)+,R1 ;GET IVAL ADDRESS- BEQ 140$ ;IF EQ NOPLACE TO STORE--JUST EXIT1 MOV R0,(R1) ;STORE INTO IVAL140$: RETURN ;DONE L' .SBTTL .ADIFU FIND A/D UNIT AND SET UP0;+; .ADIFU -- FIND A/D UNIT$;1 ; INPUTS:O;(; R4 MODE FLAGE; R5 CHANNEL NUMBERA;1 ; OUTPUTS:;;; R3 CSR ADDRESS; R2 LH (CHANNEL) OF CSR; ;-E.ADIFU: MOV #.ADSWB+S.WUCB-U.LGTH,R3 ;POINT TO FIRST UCB MINUS U.LGTHR& MOV #-1,R2 ;INIT THE CHANNEL COUNTER3 MOV .ADSWB+S.WUNT,R1 ;GET NUMBER OF A/D CONVERTERS ; ; HERE FOR EACH CONVERTER;Q%20$: MOV #16.,R0 ;ASSUME 16 CHANNELSI+ ADD #U.LGTH,R3 ;POINT TO FIRST OR NEXT UCBU .IF DF A$$M11) BIT #UF$AMK,U.FLG(R3) ;IS THERE AN AM11? BEQ 40$ ;NO--ONLY 16 CHANNELS % TST R4 ;GAIN RANGING (OF ANY SORT)?A- BNE 40$ ;IF NE YES--NOT ABS CHAN ADDRESSINGE0 MOV #64.,R0 ;ABS CHAN MODE W/AM11--64 CHANNELS .IFTF ;A$$M11-40$: ADD R0,R2 ;COMPUTE LAST CHANNEL ON UNIT#- CMP R5,R2 ;IS DESIRED CHANNEL ON THIS UNIT?. BLOS 100$ ;IF LOS YESD" DEC R1 ;NO--LOOKED AT ALL UNITS? BGT 20$ ;IF GT NOV& CLR R0 ;CLEAR IN CASE WE STORE VALUE SEC ;FLAG A SCREW UPR RETURNU;; WE FOUND THE UNITT;F"100$: MOV R5,R2 ;COPY THE CHANNEL .IFT ;A$$M11L% BIC #^C<77>,R2 ;ASSUME ABS CHAN MODEF TST R4 ;SEE IF SO$ BEQ 120$ ;IF EQ YESH .ENDC ;A$$M11# BIC #^C<17>,R2 ;NO--TRIM SOME MOREH BIC #^C<7>,R4 ;TRIM MODE FLAG( MOVB GAINTB-1(R4),R1 ;GET THE GAIN BITS$ ADD R1,R2 ;TO GET THE CHANNEL BYTE3120$: MOV U.CSR(R3),R3 ;GET THE CSR ADDRESS OF UNITO CLC RETURNT;B; TABLE OF GAIN VALUES; GAINTB: .BYTE 0,20,40,60,0,0,0,0 .EVEN A4 .SBTTL .ADIGR A/D GAIN RANGING FOR SINGLE A/D INPUT;+.; .ADIGR -- SINGLE A/D INPUT AUTO-GAIN RANGING;C ; INPUTS: ;S*; A/D CONVERTER MUST00TADATADATADATADATADATADATADATADATA HAVE THE DONE BIT SET; R3 POINTS TO CSR; ; OUTPUTS:;; R0 CONVERTED VALUE;I;-*.ADIGR: MOV 2(R3),R0 ;READ CONVERTED VALUE .IF DF A$$M11 CLR R1 ;CLEAR GAIN BITS2) CMP R0,#4000 ;IS VALUE IN POSITIVE RANGE( BGE 20$ ;IF GE YES NEG R0 ;NEGATE RESULTT BEQ 100$ ;IF EQ GET OUT NOWU& BIC #^C<7777>,R0 ;TRIM TO TWELVE BITS/20$: CMP R0,#4200 ;NEED TO SAMPLE ABOVE GAIN 4?  BLT 30$ ;IF LT YES$ CMP R0,#5000 ;NO--SAMPLE AT GAIN 1? BGE 100$ ;IF GE YESS0 MOV #<1*20>*400,R1 ;NO--SET TO SAMPLE AT GAIN 4 BR 40$ ;GO SAMPLE130$: MOV #<2*20>*400,R1 ;SET TO SAMPLE AT GAIN 16! CMP R0,#4040 ;SAMPLE AT GAIN 16?D BGE 40$ ;IF GE YES1 MOV #<3*20>*400,R1 ;NO--SET TO SAMPLE AT GAIN 64 "40$: BIS R1,(R3) ;SET MUX CHANNEL INC (R3) ;START CONVERSION" MOV #TMO$AD,R0 ;GET TIMEOUT COUNT,60$: BIT #AD$ERR!AD$DON,(R3) ;ERROR OR DONE? BMI 80$ ;IF MI ERROR BNE 100$ ;IF NE DONE DEC R0 ;NOT YET--CHECK TIMEOUT BGT 60$ ;IF GT NOT TIMEOUT' MOV #ADTMOV,R0 ;YES--SET TIMEOUT VALUEN BR 120$ ;RETURN $80$: MOV 2(R3),R0 ;READ VALUE ANYHOW MOV #ADERRV,R0 ;SET ERROR VALUE BR 120$ ;RETURN4(100$: MOV 2(R3),R0 ;READ CONVERTED VALUE BIS R1,R0 ;SET THE FULL VALUET .ENDC ;A$$M11(120$: RETURN ;RETURN WITH SAMPLE IN R0 .END;START CONVERSION" MOV #TMO$AD,R0 ;GET TIMEOUT COUNT,60$: BIT #AD$ERR!AD$DON,(R3) ;ERROR OR DONE? BMI 80$ ;IF MI ERROR BNE 100$ ;IF NE DONE DEC R0 ;NOT YET--CHECK TIMEOUT BGT 60$ ;IF GT NOT TIMEOUT' MOV #ADTMOV,R0 ;YES--SET TIMEOUT VALUEN B3 .TITLE KADIN0 SINGLE CHANNEL A/D INTERRUPT HANDLER .IDENT /M01.01/; ; COPYRIGHT (C) 1977, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01.01 ; B. SCHREIBER 15-SEP-77;E; MODIFIED BY:;U; M. HARVEY 6-MAR-79 ; MSH030 ALWAYS CLEAR ERROR BIT; D; THIS MODULE SAMPLES ONE A/D CHANNEL IN ABSOLUTE CHANNEL ADDRESSING; MODE. .MCALL KDVDF$, KSWDF$ KDVDF$T KSWDF$E .PSECT .KSCT1 G6 .SBTTL .ADIN0 SUPER-FAST SINGLE CHANNEL A/D INTERRUPT;+<; .ADIN0 -- SINGLE CHANNEL NO GAIN RANGING INTERRUPT ROUTINE;SB; THIS INTERRUPT ROUTINE IS SELECTED IF THE USER SELECTED ABSOLUTE; CHANNEL ADDRESSING.E;Y ; INPUTS:;E8; R4 SET BY A JSR R4,.ADIN0; THIS INSTRUCTION IS LOCATED/; PHYSICALLY IMMEDIATELY PRECEDING THE ADSWB. R,; R5 POINTS TO THE FORK BLOCK (SETUP BY ICB);N ; OUTPUTS:; 0; THE DATA WORD IS WRITTEN INTO THE USER BUFFER.;$;; OPTIONALLY, A FORK WILL BE REQUESTED IN ORDER TO STOP THES<; SWEEP (CAN BE INDUCED BY A NUMBER OF REASONS) OR TO SET AN;; EVENT FLAG OR QUEUE AN AST TO SIGNAL THE END OF A BUFFER.R;T;-5.ADIN0::MOV R3,(SP) ;;;SAVE R3, OVERWRITING SAVED R4 & ;;;WHICH WE DON'T NEED TO PRESERVE .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .IFTF ;M$$MGE. MOV S.WCSR(R4),R3 ;;;GET CSR REGISTER ADDRESS TST (R3) ;;;CHECK FOR ERRORS* BPL 20$ ;;;IF PL NO ERRORS--GO READ DATA& BIC #AD$ERR,(R3) ;;;ERROR--CLEAR FLAG- MOV 2(R3),R3 ;;;READ DATA TO CLEAR CONVERTER " MOV #ADERRV,R3 ;;;SET ERROR VALUE BR 40$ ;;;GO WRITE INTO BUFFER'20$: MOV 2(R3),R3 ;;;READ DATA FROM ADC 040$: CALL .KWRWD ;;;WRITE WORD INTO USER BUFFER .IFT ;M$$MGEV# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6R .IFTF ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3;1 BCC 80$ ;;;IF CC NOT END OF BUFFER OR SWEE00 D%B11110010P END;9 BIT #S$WSTP,S.WFL2(R4) ;;;ARE WE GOING TO STOP THE SWEEP BEQ 60$ ;;;IF EQ NOR3 CALL .DSBAD ;;;YES--DISABLE A/D FROM INTERRUPTING 660$: CALLR .KEFQI ;;;DO THE FORK LEVEL THING AND EXIT80$: RETURN ;EXITE .ENDC ;M$$MGE .ENDWRITE INTO BUFFER'20$: MOV 2(R3),R3 ;;;READ DATA FROM ADC 040$: CALL .KWRWD ;;;WRITE WORD INTO USER BUFFER .IFT ;M$$MGEV# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6R .IFTF ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3;1 BCC 80$ ;;;IF CC NOT END OF BUFFER OR SWEE@ .TITLE KADIN1 MULTIPLE CHANNEL ABS CHANNEL ADDRESSING INTERRUPT .IDENT /M01.01/;R ; COPYRIGHT (C) 1977, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.E;R>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01.01 ; B. SCHREIBER 15-SEP-77;E; MODIFIED BY:;U; M. HARVEY 6-MAR-79 ; MSH030 ALWAYS CLEAR ERROR BIT; F; THIS INTERRUPT ROUTINE SAMPLES MULTIPLE CHANNELS IN ABSOLUTE CHANNEL; ADDRESSING MODE. .MCALL KSWDF$, KDVDF$ KSWDF$T KDVDF$C .PSECT .KSCT1 9 .SBTTL .ADIN1 MULTIPLE CHANNEL NO GAIN RANGING INTERRUPTI;+>; .ADIN1 -- MULTIPLE CHANNEL NO GAIN RANGING INTERRUPT ROUTINE;H?; THIS INTERRUPT ROUTINE IS SELECTED IF THE USER CHOSE ABSOLUTET,; CHANNEL ADDRESSING WITH MULTIPLE CHANNELS.;H ; INPUTS:E;70; R4 SET BY A JSR R4,.ADIN1; THIS INSTRUCTION IS6; LOCATED PHYSICALLY IMMEDIATELY PRECEDING THE ADSWB.,; R5 POINTS TO THE FORK BLOCK (SETUP BY ICB);L ; OUTPUTS:;MB; THE 'NCHN' CHANNELS ARE SAMPLED AND WRITTEN INTO THE USER BUFFER;;-8.ADIN1::MOV R3,(SP) ;;;SAVE R3, OVERWRITING R4 ON STACK .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .ENDC ;M$$MGE MOV R2,-(SP) ;;;SAVE R2' CLR -(SP) ;;;CLEAR "FORK NEEDED" FLAG % MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESSLE.AD1DC::CLRB (R3) ;;;DISABLE CLOCK/ST FROM STARTING MORE CONVERSIONSS/ TST (R3) ;;;CHECK RESULTS OF FIRST CONVERSION $ ;;;(STARTED BY CLOCK OR TRIGGER) BPL 80$ ;;;IF PL GO READ DATAM BR 60$ ;;;ELSE GO HANDLE ERROR;N'; COME HERE FOR ALL SUBSEQUENT CHANNELS;I<20$: MOVB S.WCHB(R4),1(R3);;;SET THE CHANNEL NUMBER INTO CSR INC (R3) ;;;START CONVERSION( MOV #TMO$AD,R2 ;;;GET THE TIMEOUT COUNT.40$: BIT #AD$ERR!AD$DON,(R3) ;;;ERROR OR DONE? BMI 60$ ;;;IF MI ERROR BNE 80$ ;;;IF NE DONE" DEC R2 ;;;NOT YET--CHECK TIMEOUT BGT 40$ ;;;NO TIMEOUT YETI% MOV #ADTMOV,R3 ;;;TIMEOUT--SET VALUER BR 100$ ;;;GO STORE VALUEE;Y; ERROR ;G60$: ;;;REF LABEL. BIC #AD$ERR,(R3) ;;;CLEAR CONVERTER ERROR BIT' MOV 2(R3),R3 ;;;READ CONVERSION ANYHOWA) MOV #ADERRV,R3 ;;;SET TO STORE A/D ERRORT BR 100$ ;;;GO STOREO;R; READ DATA FROM A/D CONVERTER;M)80$: MOV 2(R3),R3 ;;;READ CONVERTED VALUE:*100$: CALL .KWRWD ;;;WRITE WORD TO BUFFER BCC 120$ ;;;IF CC CONTINUE" ROL (SP) ;;;SET THE FLAG TO FORK3 BIT #S$WSTP,S.WFL2(R4) ;;;ARE WE SUPPOSED TO STOP?M BNE 140$ ;;;IF NE YES--GO STOP,120$: CALL .ADNXC ;;;SWITCH TO NEXT CHANNEL) MOV S.WCSR(R4),R3 ;;;PICK UP CSR ADDRESS38 CMP S.WCHX(R4),S.WNCH(R4) ;;;HAVE WE DONE ALL CHANNELS? BNE 20$ ;;;IF NE NOD' CALL .ADENX ;;;YES--ARM A/D CONVERTOR0; -; WE ARE ALL DONE SAMPLING FOR THIS INTERRUPTR;M7140$: ROR (SP)+ ;;;PICK UP THE FORK FLAG AND POP STACK. MOV (SP)+,R2 ;;;RESTORE R2R .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6G .ENDC MOV (SP)+,R3 ;;;RESTORE R3W- BCC 180$ ;;;IF00DATADATADATADATADATADATADATA CC NO FORK NEEDED--JUST EXITG1 BIT #S$WSTP,S.WFL2(R4) ;;;ARE WE STOPPING SWEEP?L BEQ 160$ ;;;IF EQ NO3 CALL .DSBAD ;;;YES--DISABLE A/D FROM INTERRUPTINGA4160$: CALLR .KEFQI ;;;FORK AND SET EFN OR QUEUE AST ;;;AND EXIT-180$: RETURN ;EXIT .ENDE ALL DONE SAMPLING FOR THIS INTERRUPTR;M7140$: ROR (SP)+ ;;;PICK UP THE FORK FLAG AND POP STACK. MOV (SP)+,R2 ;;;RESTORE R2R .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6G .ENDC MOV (SP)+,R3 ;;;RESTORE R3W- BCC 180$ ;;;IF< .TITLE KADIN2 SINGLE CHANNEL GAIN RANGING INTERRUPT HANDLER .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 15-SEP-77;E@; THIS MODULE SAMPLES ONE A/D CHANNEL WITH GAINS 1, 4, 16, OR 64 .MCALL KDVDF$, KSWDF$ KDVDF$O KSWDF$R .PSECT .KSCT1 S= .SBTTL .ADIN2 SINGLE CHANNEL A/D INTERRUPT HANDLER WITH GAINN;+8; .ADIN2 -- SINGLE CHANNEL SINGLE GAIN INTERRUPT ROUTINE;OE; THIS INTERRUPT ROUTINE IS SELECTED IF THE USER SELECTED ONE CHANNELO.; TO BE SAMPLED AT ONE GAIN (1, 4, 16, OR 64).;L ; INPUTS:S; 8; R4 SET BY A JSR R4,.ADIN2; THIS INSTRUCTION IS LOCATED/; PHYSICALLY IMMEDIATELY PRECEDING THE ADSWB. ,; R5 POINTS TO THE FORK BLOCK (SETUP BY ICB); ; OUTPUTS:;0; THE DATA WORD IS WRITTEN INTO THE USER BUFFER.;C;; OPTIONALLY, A FORK WILL BE REQUESTED IN ORDER TO STOP THED<; SWEEP (CAN BE INDUCED BY A NUMBER OF REASONS) OR TO SET AN;; EVENT FLAG OR QUEUE AN AST TO SIGNAL THE END OF A BUFFER. ; ;-5.ADIN2::MOV R3,(SP) ;;;SAVE R3, OVERWRITING SAVED R4,& ;;;WHICH WE DON'T NEED TO PRESERVE .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .IFTF ;M$$MGE. MOV S.WCSR(R4),R3 ;;;GET CSR REGISTER ADDRESS TST (R3) ;;;CHECK FOR ERRORS* BPL 20$ ;;;IF PL NO ERRORS--GO READ DATA' MOV 2(R3),R3 ;;;READ CONVERSION ANYHOWO" MOV #ADERRV,R3 ;;;SET ERROR VALUE BR 40$ ;;;GO WRITE INTO BUFFER,20$: MOV 2(R3),-(SP) ;;;READ CONVERTED VALUE MOV (R3),R3 ;;;COPY CSR . BIC #147777,R3 ;;;CLEAR ALL BUT THE GAIN BITS1 BIS (SP)+,R3 ;;;SET THE TOTAL A/D VALUE TO STOREI040$: CALL .KWRWD ;;;WRITE WORD INTO USER BUFFER .IFT ;M$$MGEP# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6V .IFTF ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3(1 BCC 80$ ;;;IF CC NOT END OF BUFFER OR SWEEP ENDO9 BIT #S$WSTP,S.WFL2(R4) ;;;ARE WE GOING TO STOP THE SWEEP BEQ 60$ ;;;IF EQ NOE3 CALL .DSBAD ;;;YES--DISABLE A/D FROM INTERRUPTINGV960$: CALLR .KEFQI ;;;FORK, SET EFN OR QUEUE AST AND EXIT 80$: RETURN ;EXIT  .ENDC ;M$$MGE .ENDITS1 BIS (SP)+,R3 ;;;SET THE TOTAL A/D VALUE TO STOREI040$: CALL .KWRWD ;;;WRITE WORD INTO USER BUFFER .IFT ;M$$MGEP# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6V .IFTF ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3(1 BCC 80$ ;;;IF CC NOT= .TITLE KADIN3 MULTIPLE CHANNEL SINGLE GAIN INTERRUPT ROUTINE .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE 00! D%B11110010WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 15-SEP-77;EE; THIS INTERRUPT ROUTINE SAMPLES MULTIPLE CHANNELS WITH A SINGLE GAINH; (I.E. GAIN 1, 4, 16, OR 64)O .MCALL KSWDF$, KDVDF$ KSWDF$A KDVDF$M .PSECT .KSCT1 = .SBTTL .ADIN3 MULTIPLE CHANNEL SINGLE GAIN INTERRUPT HANDLERI;+:; .ADIN3 -- MULTIPLE CHANNEL SINGLE GAIN INTERRUPT ROUTINE;A?; THIS INTERRUPT ROUTINE IS SELECTED IF THE USER CHOSE MULTIPLE 6; CHANNEL SAMPLING WITH A FIXED GAIN (1, 4, 16, OR 64); ; INPUTS:T;P0; R4 SET BY A JSR R4,.ADIN3; THIS INSTRUCTION IS6; LOCATED PHYSICALLY IMMEDIATELY PRECEDING THE ADSWB.,; R5 POINTS TO THE FORK BLOCK (SETUP BY ICB);1 ; OUTPUTS:;.B; THE 'NCHN' CHANNELS ARE SAMPLED AND WRITTEN INTO THE USER BUFFER;T;-8.ADIN3::MOV R3,(SP) ;;;SAVE R3, OVERWRITING R4 ON STACK .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .ENDC ;M$$MGE MOV R2,-(SP) ;;;SAVE R2' CLR -(SP) ;;;CLEAR "FORK NEEDED" FLAGA% MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESS6E.AD3DC::CLRB (R3) ;;;DISABLE CLOCK/ST FROM STARTING MORE CONVERSIONSS/ TST (R3) ;;;CHECK RESULTS OF FIRST CONVERSION $ ;;;(STARTED BY CLOCK OR TRIGGER) BPL 80$ ;;;IF PL GO READ DATA.' BR 60$ ;;;ELSE HANDLE ERROR CONDITIONR;E'; COME HERE FOR ALL SUBSEQUENT CHANNELS:; <20$: MOVB S.WCHB(R4),1(R3);;;SET THE CHANNEL NUMBER INTO CSR INC (R3) ;;;START CONVERSION( MOV #TMO$AD,R2 ;;;GET THE TIMEOUT COUNT.40$: BIT #AD$ERR!AD$DON,(R3) ;;;ERROR OR DONE? BMI 60$ ;;;IF MI ERROR BNE 80$ ;;;IF NE DONE:" DEC R2 ;;;NOT YET--CHECK TIMEOUT BGT 40$ ;;;NO TIMEOUT YETT% MOV #ADTMOV,R3 ;;;TIMEOUT--SET VALUEE BR 100$ ;;;GO STORE VALUEO;O; ERROR);B+60$: MOV 2(R3),R3 ;;;READ CONVERSION ANYHOWL) MOV #ADERRV,R3 ;;;SET TO STORE A/D ERROR  BR 100$ ;;;GO STOREN;:; READ DATA FROM A/D CONVERTER;S780$: MOV 2(R3),-(SP) ;;;READ CONVERTED VALUE ONTO STACKR" MOV (R3),R3 ;;;READ CSR CONTENTS* BIC #147777,R3 ;;;CLEAR ALL BUT GAIN BITS5 BIS (SP)+,R3 ;;;CREATE A/D INPUT WORD WITH GAIN BITSI*100$: CALL .KWRWD ;;;WRITE WORD TO BUFFER BCC 120$ ;;;IF CC CONTINUE" ROL (SP) ;;;SET FORK NEEDED FLAG3 BIT #S$WSTP,S.WFL2(R4) ;;;ARE WE SUPPOSED TO STOP?B BNE 140$ ;;;IF NE YES--GO STOP,120$: CALL .ADNXC ;;;SWITCH TO NEXT CHANNEL) MOV S.WCSR(R4),R3 ;;;PICK UP CSR ADDRESSE8 CMP S.WCHX(R4),S.WNCH(R4) ;;;HAVE WE DONE ALL CHANNELS? BNE 20$ ;;;IF NE NO ' CALL .ADENX ;;;YES--ARM A/D CONVERTORS;B-; WE ARE ALL DONE SAMPLING FOR THIS INTERRUPT(;+.140$: ROR (SP)+ ;;;CHECK THE FORK NEEDED FLAG MOV (SP)+,R2 ;;;RESTORE R2D .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6E .ENDC MOV (SP)+,R3 ;;;RESTORE R34- BCC 180$ ;;;IF CC NO FORK NEEDED--JUST EXITF1 BIT #S$WSTP,S.WFL2(R4) ;;;ARE WE STOPPING SWEEP?E BEQ 160$ ;;;IF EQ NO3 CALL .DSBAD ;;;YES--DISABLE A/D FROM INTERRUPTINGH8160$: CALLR .KEFQI ;FORK, SET EFN OR QUEUE AST AND EXIT180$: RETURN ;EXIT .END CONVERTORS;B-; WE ARE ALL DONE SAMPLING FOR THIS INTERRUPT(;+.140$: ROR (SP)+ ;;;CHECK THE FORK NEEDED FLAG MOV (SP)+,R2 ;;;RESTORE R2D .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6E .ENDC MOV (SP)+,R3 ;;;RESTORE R34- BCCA .TITLE KADIN4 SINGLE CHANNEL AUTO GAIN RANGING INTERRUPT HANDLER .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO 00!%DATADATADATADATADATADATADATAONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 15-SEP-77;E=; THIS MODULE SAMPLES ONE A/D CHANNEL WITH AUTO GAIN RANGING.E .MCALL KDVDF$, KSWDF$ KDVDF$  KSWDF$N .PSECT .KSCT1 E5 .SBTTL .ADIN4 SAMPLE 1 A/D CHANNEL WITH GAIN RANGINGO;+>; .ADIN4 -- SINGLE CHANNEL AUTO GAIN RANGING INTERRUPT ROUTINE;L@; THIS INTERRUPT ROUTINE IS SELECTED IF THE USER SELECTED SINGLE*; CHANNEL SAMPLING WITH AUTO GAIN RANGING.; ; INPUTS:R;A8; R4 SET BY A JSR R4,.ADIN4; THIS INSTRUCTION IS LOCATED/; PHYSICALLY IMMEDIATELY PRECEDING THE ADSWB. -,; R5 POINTS TO THE FORK BLOCK (SETUP BY ICB); ; OUTPUTS:;R0; THE DATA WORD IS WRITTEN INTO THE USER BUFFER.;F;; OPTIONALLY, A FORK WILL BE REQUESTED IN ORDER TO STOP THE <; SWEEP (CAN BE INDUCED BY A NUMBER OF REASONS) OR TO SET AN;; EVENT FLAG OR QUEUE AN AST TO SIGNAL THE END OF A BUFFER.E;T;-5.ADIN4::MOV R3,(SP) ;;;SAVE R3, OVERWRITING SAVED R4G& ;;;WHICH WE DON'T NEED TO PRESERVE .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .IFTF ;M$$MGE. MOV S.WCSR(R4),R3 ;;;GET CSR REGISTER ADDRESS8.AD4DC::CLRB (R3) ;;;DISABLE ANY MORE CONVERSION STARTS TST (R3) ;;;CHECK FOR ERRORS* BPL 20$ ;;;IF PL NO ERRORS--GO READ DATA' MOV 2(R3),R3 ;;;READ CONVERSION ANYHOWB" MOV #ADERRV,R3 ;;;SET ERROR VALUE BR 40$ ;;;GO WRITE INTO BUFFER920$: CALL .ADAGR ;;;PERFORM AUTO GAIN RANGING AND RETURNO ;;;THE CONVERTED VALUE IN R3040$: CALL .KWRWD ;;;WRITE WORD INTO USER BUFFER1 CALL .ADSTR ;;;RE-ENABLE CONVERTER TO INTERRUPTP .IFT ;M$$MGEM# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6I .IFTF ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3O1 BCC 80$ ;;;IF CC NOT END OF BUFFER OR SWEEP ENDS9 BIT #S$WSTP,S.WFL2(R4) ;;;ARE WE GOING TO STOP THE SWEEP  BEQ 60$ ;;;IF EQ NOO3 CALL .DSBAD ;;;YES--DISABLE A/D FROM INTERRUPTINGO860$: CALLR .KEFQI ;;;FORK SET EFN OR QUEUE AST AND EXIT80$: RETURN ;EXIT .ENDC ;M$$MGE .ENDIN R3040$: CALL .KWRWD ;;;WRITE WORD INTO USER BUFFER1 CALL .ADSTR ;;;RE-ENABLE CONVERTER TO INTERRUPTP .IFT ;M$$MGEM# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6I .IFTF ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3O1; .TITLE KADIN5 MULTIPLE CHANNEL AUTO GAIN RANGING INTERRUPT .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 15-SEP-77;EA; THIS INTERRUPT ROUTINE SAMPLES MULTIPLE CHANNELS WITH AUTO GAINT ; RANGING. .MCALL KSWDF$, KDVDF$ KSWDF$P KDVDF$O .PSECT .KSCT1 T; .SBTTL .ADIN5 MULTIPLE CHANNEL AUTO GAIN RANGING INTERRUPTE;+@; .ADIN5 -- MULTIPLE CHANNEL AUTO GAIN RANGING INTERRUPT ROUTINE; ?; THIS INTERRUPT ROUTINE IS SELECTED IF THE USER CHOSE MULTIPLEE*; CHANNEL SAMPLING WITH AUTO GAIN RANGING.;O ; INPUTS:O;A0; R4 SET BY A JSR R4,.ADIN5; THIS INSTRUCTION IS6; LOCATED PHYSICALLY IMMEDIATELY PRECEDING THE ADSWB.,; R5 POINTS TO THE FORK BLOCK (SETUP BY ICB)00%  D%B11110010;O ; OUTPUTS:;NB; THE 'NCHN' CHANNELS ARE SAMPLED AND WRITTEN INTO THE USER BUFFER;T;-8.ADIN5::MOV R3,(SP) ;;;SAVE R3, OVERWRITING R4 ON STACK .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .ENDC ;M$$MGE MOV R2,-(SP) ;;;SAVE R2+ CLR -(SP) ;;;CLEAR THE "FORK NEEDED" FLAGH% MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESSD.AD5DC::CLRB (R3) ;;;STOP CLOCK/ST FROM STARTING ANOTHER CONVERSION/ TST (R3) ;;;CHECK RESULTS OF FIRST CONVERSIOND$ ;;;(STARTED BY CLOCK OR TRIGGER) BPL 80$ ;;;IF PL GO READ INPUT BR 60$ ;;;ELSE GO HANDLE ERROR; '; COME HERE FOR ALL SUBSEQUENT CHANNELSA;5<20$: MOVB S.WCHB(R4),1(R3);;;SET THE CHANNEL NUMBER INTO CSR INC (R3) ;;;START CONVERSION( MOV #TMO$AD,R2 ;;;GET THE TIMEOUT COUNT.40$: BIT #AD$ERR!AD$DON,(R3) ;;;ERROR OR DONE? BMI 60$ ;;;IF MI ERROR BNE 80$ ;;;IF NE DONE" DEC R2 ;;;NOT YET--CHECK TIMEOUT BGT 40$ ;;;NO TIMEOUT YETR% MOV #ADTMOV,R3 ;;;TIMEOUT--SET VALUER BR 100$ ;;;GO STORE VALUEE;Y; ERROR ;G+60$: MOV 2(R3),R3 ;;;READ CONVERSION ANYHOW0) MOV #ADERRV,R3 ;;;SET TO STORE A/D ERROR  BR 100$ ;;;GO STOREN;A; READ DATA FROM A/D CONVERTER;S.80$: CALL .ADAGR ;;;PERFORM AUTO GAIN RANGING*100$: CALL .KWRWD ;;;WRITE WORD TO BUFFER BCC 120$ ;;;IF CC CONTINUE" ROL (SP) ;;;SET FORK NEEDED FLAG3 BIT #S$WSTP,S.WFL2(R4) ;;;ARE WE SUPPOSED TO STOP?R BNE 140$ ;;;IF NE YES--GO STOP,120$: CALL .ADNXC ;;;SWITCH TO NEXT CHANNEL) MOV S.WCSR(R4),R3 ;;;PICK UP CSR ADDRESSA8 CMP S.WCHX(R4),S.WNCH(R4) ;;;HAVE WE DONE ALL CHANNELS? BNE 20$ ;;;IF NE NOV' CALL .ADENX ;;;YES--ARM A/D CONVERTOR ;G-; WE ARE ALL DONE SAMPLING FOR THIS INTERRUPTS;0/140$: ROR (SP)+ ;;;CHECK THE FORK REQUEST FLAG$ MOV (SP)+,R2 ;;;RESTORE R2T .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6  .ENDC MOV (SP)+,R3 ;;;RESTORE R3 - BCC 180$ ;;;IF CC NO FORK NEEDED--JUST EXITN6 BIT #S$WSTP,S.WFL2(R4) ;;;YES--ARE WE STOPPING SWEEP? BEQ 160$ ;;;IF EQ NO3 CALL .DSBAD ;;;YES--DISABLE A/D FROM INTERRUPTING;:160$: CALLR .KEFQI ;;;FORK, SET EFN OR QUEUE AST AND EXIT180$: RETURN ;EXIT .ENDOR ;G-; WE ARE ALL DONE SAMPLING FOR THIS INTERRUPTS;0/140$: ROR (SP)+ ;;;CHECK THE FORK REQUEST FLAG$ MOV (SP)+,R2 ;;;RESTORE R2T .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6  .ENDC MOV (SP)+,R3 ;;;RESTORE R3 - BCC 180$ ;;;IF CC NO FORK NEEDED--JUST EXITN6 BIT #S$WSTP,S.WFL2(R4) ;;;YES--ARE WE STOPPING SWEEP? BEQ 160$ ;;;IF EQ NO3 CALL .DSBAD ;;;YES--DISABLE A/D FROM INTERRUPTING;:160$:  .TITLE KADSWP A/D INPUT SWEEP .IDENT /M02.00/; ; COPYRIGHT (C) 1977, 1978, 1984/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 02; B. SCHREIBER 5-SEP-77 ;E; MODIFIED BY:;O!; PAUL K. M. WEISS 27-SEP-83 2.00 ; (; PKW036 - ENABLE THE A/D FOR MODE 512.;A*; THIS MODULE INITIATES AN A/D INPUT SWEEP; ; SYSTEM MACRO CALLS;  .MCALL KSWDF$ KSWDF$U T# .SBTTL ADSWP START A/D INPUT SWEEPI;+ ; ADSWP -- START A/D INPUT SWEEP;E; CALLING SEQUENCE:I;N?; CALL ADSWP (IBUF,LBUF,NBUF,MODE,IPRSET,IEFN,LDELAY,ICHN,NCHN)R;L-; SEE DOCUMENTATION FOR ARGUMENT DESCRIPTIONS ;N;-'ADSWP:: MOV R5,-(SP) ;SAVE R5 (ARG PTR)H. CALL .K.PAA ;VALIDATE ARGS AND PUSH ON STACK .WORD 9. ;NINE ARGS2# .WORD 600 ;MASK FOR REQUIR00(DATADATADATADATADATADATADATAED ARGSF1 MOV #.ADSWB,R4 ;POINT TO A/D SWEEP CONTROL BLOCKP BCC 20$ ;IF CC CONTINUEC, MOV #-,R3 ;ELSE SET ERROR CODE! BR 600$ ;STORE ERROR AND RETURNI*20$: CALL .K.SET ;SETUP COMMON SWEEP ARGS BCS 200$ ;IF CS BAD ARGS) CALL .K.DLY ;SEE ABOUT DELAY FROM STARTF! BCS 300$ ;IF CS RESOURCE IN USEU0 CALL .ADGCH ;GET A/D CHANNEL INFORMATION SETUP BCS 200$ ;IF CS BAD ARGS+ CALL .K.STB ;SETUP BUFFER POINTERS IN SWBP. BCS 400$ ;IF CS ILLEGAL BUFFER SPECIFICATION. CALL .ADCNI ;CONNECT FIRST A/D TO INTERRUPTS) BCS 300$ ;IF CS CALL IT RESOURCE IN USEI& CALL .KLQIN ;INSERT INTO CLOCK QUEUE5 BIT #S$WDLY,S.WFL2(R4) ;IS THERE A DELAY FROM START?I BNE 80$ ;IF NE YES--NEED CLOCK .IF DF K$$W11( BIT #S$WEXT,S.WFLG(R4) ;EXTERNAL START? BNE 80$ ;IF NE YES--NEED CLOCK' ;IF NO CLOCK IN SYSTEM CAN STILL DOT ;EXTERNAL START VIA DIGO .IFTF ;K$$W111 BIT #S$WNOV,S.WFLG(R4) ;TRIGGER DRIVEN SAMPLING?W' BNE 90$ ;IF NE YES--NO NEED FOR CLOCKI80$: .IFT ;K$$W11  CALL .KWCNI ;INITIALIZE CLOCKB) BCS 300$ ;IF CS CALL IT RESOURCE IN USEC- BIS #S$WACT,S.WFL2(R4) ;FLAG SWEEP IS ACTIVED( BIT #S$WEXT,S.WFLG(R4) ;EXTERNAL START?1 BNE 100$ ;IF NE YES--ST ROUTINE WILL ENABLE A/DW .IFF ;K$$W11T1 MOV #-,R3 ;CLOCK OPTION NOT PRESENTE# BR 500$ ;GO RETURN STATUS TO USERC .ENDC ;K$$W11'90$: CALL .ADSTR ;ENABLE A/D CONVERTOR#100$: MOV (SP)+,R5 ;RESTORE ARG PTRI RETURNI;W; ERROR RETURNSE;S; BAD PARAMETERS;&200$: MOV #-,R3 ;SET CODE BR 500$ ;GO TO COMMON CODE;F; RESOURCE IN USEE; &300$: MOV #-,R3 ;SET CODE BR 500$;; ILLEGAL BUFFER SPECIFICATION;T&400$: MOV #-,R3 ;SET CODE2500$: MOV R5,SP ;RESTORE PRE-.K.PAA STACK POINTER1600$: CALL .KLQRM ;REMOVE FROM QUEUE IF INSERTED ' MOV #1,R4 ;SET ARG # TO STORE IT INTO MOV (SP)+,R5 ;RESTORE ARG PTR+ CALLR .IESTO ;SET CODE AND RETURN TO USERT .ENDRNI;W; ERROR RETURNSE;S; BAD PARAMETERS;&200$: MOV #-; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 7-SEP-77 ;E=; THIS MODULE CONTAINS ALL THE AST ROUTINES FOR THE DIFFERENTE ; SWEEPS. ;S; SYSTEM MACRO CALLS;D& .MCALL KSWDF$, ASTX$S, CINT$S, SETF$S KSWDF$A ' .SBTTL .ADAST HANDLE AST FOR A/D SWEEP ;++; .ADAST -- HANDLE AST QUEUED FOR A/D SWEEPD;O ; INPUTS:C;T&; STACK VECTOR ADDRESS ON TOP OF STACK;N ; OUTPUTS:;/; DISCONNECTS A/D CONVERTERS IF STOPPING SWEEP.R4; SETS EVENT FLAG IF NECESSARY, AND CALLS COMPLETION ; ROUTINE.;Y;- .ENABL LSB  .IF DF N$AD117.ADAST::MOV R0,(SP) ;SAVE R0, OVERWRITE VECTOR ADDRESS  MOV R1,-(SP) ;SAVE  MOV R2,-(SP) ; REST MOV R3,-(SP) ; OF$% MOV R4,-(SP) ; REGISTERS MOV R5,-(SP) ;...0 MOV #.ADSWB,R4 ;POINT TO AD SWEEP CONTROL BLOCK( BIT #S$WSTP,S.WFL2(R4) ;STOPPING SWEEP?0 BNE 60$ ;IF NE YES--GO FIX IOSB AND DISCONNECT .IFTF ;N$AD11D; COME TO 20$ TO CALL COMPLETION ROUTINE, RESTORE REGISTERS AND EXIT+; COME TO 40$ TO RESTORE REGISTERS AND EXIT;?; REGISTERS MUST BE ON STACK, WITH R5 AT TOP, AND R0 AT BOTTOM.O;W220$: CALL @S.WEFN(R4) ;NO--CALL COMPLETION ROUTINE00( D%B1111001040$: MOV (SP)+,R5 ;RESTORE MOV (SP)+,R4 ; THE$ MOV (SP)+,R3 ; REGISTERS MOV (SP)+,R2M MOV (SP)+,R1P MOV (SP)+,R0P ASTX$SB .IFT ;N$AD11P;L; STOPPING THE SWEEP;B,60$: CALL .DSCAD ;DISCONNECT A/D CONVERTERS& CALL .KLQRM ;REMOVE FROM CLOCK QUEUE .IF DF K$$W11 .IF DF FT$MOP! TST .KUCNT ;ANYONE USING CLOCK?S( BNE 80$ ;IF NE DO NOT DISCONNECT CLOCK .ENDC ;FT$MOP( CALL 400$ ;LAST USER--DISCONNECT CLOCK .ENDC ;K$$W11 -< .SBTTL SWEEP END--FILL IN I/O STATUS BLOCK AND CLEAN UP SWB;R?; COME TO 80$ TO TERMINATE A SWEEP. THE EVENT FLAG IS SET OR ARB; COMPLETION ROUTINE WILL BE CALLED. THE SWB IS THEN CLEARED OUT. ; (FLAGS).;E .IFTF ;N$AD11080$: CALL 100$ ;CLEAR SWB AND SET EFN IF NEEDED3 BCC 20$ ;IF CC WE NEED TO CALL COMPLETION ROUTINED) BR 40$ ;ELSE WE SET AN EVENT FLAG--DONEK;BC; ROUTINE TO CLEAR OUT SWB. IN ADDITION, SETS EVENT FLAG IF NEEDED.$;L ; OUTPUTS:;N*; C-CLEAR NEED TO CALL COMPLETION ROUTINE; C-SET EFN WAS SET--ALL DONE;N0100$: CLR S.WEFM(R4) ;CLEAR EVENT FLAG MASK WORD' CLR S.WEFA(R4) ;AND EVENT FLAG ADDRESSP CLR S.WFLG(R4) ;ZERO FLAG WORDH( MOV S.WFL2(R4),R0 ;GET SECOND FLAG WORD; BIC #^C,S.WFL2(R4) ;CLEAR ALL BITS EXCEPT A/D FLAGI. CLC ;PRE-SET C-BIT TO INDICATE CMPL ROUTINE3 BIT #S$WEFN,R0 ;ARE WE USING EVENT FLAGS OR AST'S?D' BEQ 120$ ;IF EQ NOT USING EVENT FLAGSN+ SETF$S S.WEFN(R4) ;ELSE SET THE EVENT FLAG % SEC ;SET C-BIT TO INDICATE EFN SETO 120$: RETURN .ENDC ;N$AD11 S$ .SBTTL .DRAST HANDLE DR11 SWEEP AST;+.; .DRAST -- AST ROUTINE FOR DIGITAL I/O SWEEPS;F ; INPUTS:P;C+; STACK VECTOR ADDRESS OF DEVICE AST IS FOR4;0 ; OUTPUTS:;A%; NORMAL COMPLETION ROUTINE IS CALLEDE8; STOPPING SWEEP - DR11 IS DISCONNECTED FROM INTERRUPTS,1; AND EVENT FLAG OR COMPLETION ROUTINE IS CALLEDV; AS APPROPRIATE.;B;- .IF DF N$DR11&.DRAST::MOV R1,-(SP) ;SAVE R1 ON STACK, MOV 2(SP),R1 ;GET VECTOR ADDRESS FROM STACK' MOV R0,2(SP) ;SAVE R0 WHERE VECTOR WAS$ MOV R2,-(SP) ;SAVEA MOV R3,-(SP) ; THE MOV R4,-(SP) ; REST- MOV R5,-(SP) ; OF THE REGISTERST1 MOV #.DRUTB,R0 ;GET POINTER TO SWEEP BLOCK TABLEP(200$: MOV (R0)+,R4 ;GET NEXT SWB ADDRESS BEQ 40$ ;IF EQ ALL DONED. CMP S.WUBX+U.IVEC(R4),R1 ;INPUT VECTOR RIGHT? BEQ 220$ ;IF EQ YESO/ CMP S.WUBX+U.OVEC(R4),R1 ;OUTPUT VECTOR RIGHT?. BNE 200$ ;IF NE NO9220$: BIT #S$WSTP,S.WFL2(R4) ;YES--ARE WE STOPPING SWEEP? 8 BEQ 20$ ;IF EQ NO--GO CALL COMPLETION ROUTINE AND EXIT;; STOPPING SWEEP;7280$: MOV S.WUBX+U.IVEC(R4),R3 ;ASSUME INPUT DISCONNECTM BIT #S$WIOF,S.WFL2(R4) ;CHECK" BNE 300$ ;IF NE INPUT DISCONNECT0 MOV S.WUBX+U.OVEC(R4),R3 ;NO--GET OUTPUT VECTOR 300$: CINT$S R3,,#0 ;DISCONNECT0 BIC #UF$CIN,S.WUBX+U.FLG(R4) ;FLAG DISCONNECTED BR 80$ ;FINISH UP0 .ENDC ;N$DR11 S$ .SBTTL .KWAST HANDLE AST'S FOR KW11;+?; .KWAST -- AST ROUTINE FOR CLOCK DRIVEN SWEEPS (EXCEPT GTHIST)T;I ; INPUTS:;Q; STACK VECTOR ADDRESS OF CLOCKO;O ; OUTPUTS:;%; NORMAL COMPLETION ROUTINE IS CALLEDU7; STOPPING SWEEP - KW11 IS DISCONNECTED FROM INTERRUPTSS2; (UNLESS MULT. OPERATIONS) AND EVENT FLAG IS SET/; OR COMPLETION ROUTINE CALLED AS APPROPRIATE.R;0;- .IF DF K$$W117.KWAST::MOV R0,(SP) ;SAVE R0, OVERWRITE VECTOR ADDRESS MOV R1,-(SP) ;HO HUM MOV R2,-(SP) ;SAVE THEM AWAYA MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP)  .IF NDF FT$MOPR& MOV .KASWB,R4 ;GET ACTIVE SWB ADDRESS/ BIT #S$WSTP,S.WFL2(R4) ;ARE WE STOPPING SWEEP?U1 BEQ 20$ ;IF EQ NO--CALL COMPLETION ROUTINE,EXIT" CALL 400$ ;YES--DISCONNECT CLOCK BR 80$ ;AND FINISH UP( .IFF ;FT$MOPA- MOV #<.KLQUU-S.WCLQ>,R4 ;POINT TO QUEUE HEADU.320$: MOV S.WCLQ(R4),R4 ;LINK TO NEXT IN QUEUE BEQ 380$ ;IF EQ END OF QUEUE, TST S.WFLG(R4) ;AST REQUEST FOR THIS SWEEP? BPL 320$ ;IF PL NO--IGNORE/ BIC #S$WAST,S.WFLG(R4) ;CLEAR AST REQUEST FLAGM/ BIT #S$WSTP,S.WFL2(R4) ;ARE WE STOPPING SWEEP?4 BEQ 360$ ;IF EQ NO--CONTINUE% CALL .KLQRM ;YES--REMOVE FROM QUEUEP1340$: CALL 100(#+%DATADATADATADATADATADATADATA00$ ;CLEAR SWB AND SET EFN IF NEEDEDI& BCS 320$ ;IF CS WE SET EFN--ALL DONE<360$: MOV R4,-(SP) ;SAVE SWB POINTER FROM COMPLETION ROUTINE/ CALL @S.WEFN(R4) ;CALL USER COMPLETION ROUTINER" MOV (SP)+,R4 ;RESTORE SWB POINTER BR 320$ ;CONTINUE SCANNING3380$: TST .KUCNT ;ARE THERE ANY MORE ACTIVE SWEEPS; BNE 40$ ;IF NE YES--ALL DONE! CALL 400$ ;NO--DISCONNECT CLOCK BR 40$ ;AND QUIT .ENDC ;FT$MOP;E; DISCONNECT CLOCK; -400$: MOV .KAVEC,R0 ;GET CLOCK VECTOR ADDRESSU' CALL 500$ ;DISCONNECT FROM INTERRUPTS  .IF DF Q$$BUS$ ADD #4,R0 ;DISCONNECT OTHER VECTOR CALL 500$ ;... .ENDC ;Q$$BUS; BIC #K$ACIN!K$ACTV!K$AGTD,.KAFLG ;FLAG NO LONGER CONNECTED $ ;AND NO GTHIST IN PROGRESS RETURN ;DONE 500$: CINT$S R0,,#0 ;DISCONNECT RETURNE .ENDC ;K$$W11 .DSABL LSB4 .ENDE YES--ALL DONE! CALL 400$ ;NO--DISCONNECT CLOCK BR 40$ ;AND QUIT .ENDC ;FT$MOP;E; DISCONNECT CLOCK; -400$: MOV .KAVEC,R0 ;GET CLOCK VECTOR ADDRESSU' CALL 500$ ;DIS) .TITLE KBFRMG BUFFER MANAGEMENT ROUTINES .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 15-AUG-77;E5; THIS MODULE CONTAINS ROUTINES FOR BUFFER MANAGEMENT ;G; SYSTEM MACRO CALLS;R .MCALL KSWDF$ KSWDF$H O, .SBTTL RLSBUF RELEASE BUFFER TO BUFFER POOL;+/; RLSBUF -- RELEASE A BUFFER TO THE BUFFER POOLJ; >; THIS ROUTINE IS CALLED BY THE USER TO DECLARE A BUFFER READY; FOR THE ISR TO USE. ;I; CALLING SEQUENCE:O; &; CALL RLSBUF (IBUF, IND, N1,N2,...N8);R ; INPUTS:Y;S+; IBUF THE IBUF ARRAY USED TO START A SWEEPP9; N1-N8 ARE THE BUFFERS TO RELEASE (MAY HAVE 1-8 BUFFERS); ; OUTPUTS:;O; IND RETURNS STATUS; 0 BAD BUFFER NUMBER; 1 BUFFERS RELEASED OK3; BUFFERS ARE INSERTED INTO THE DEVICE BUFFER QUEUEE;F;-&RLSBUF::MOV 2(R5),R1 ;GET IBUF ADDRESS MOV R1,R4 ;MAKE A COPY* MOVB (R5),R3 ;SET NUMBER OF ARGS INTO R3& CMP (R5)+,(R5)+ ;POINT TO IND ADDRESS( SUB #2,R3 ;IS THERE AN ARGUMENT THERE? BLE 80$ ;IF LE NO--QUIT NOW,% MOV (R5)+,R0 ;GET/CHECK IND ARGUMENTI# INC R0 ;MAKE -1 (DEFAULT) GO TO 01 BEQ 10$ ;IF EQ LEAVE AT 0E$ DEC R0 ;NOT DEFAULTED--GET IT BACK# MOV #1,(R0) ;SET SUCCESS INTO INDD&10$: MTPS #PR6 ;;;LOCK OUT INTERRUPTS020$: MOV @(R5)+,R2 ;;;GET THE NEXT BUFFER NUMBER BMI 25$ ;;;IF MI ERROR+ CMP R2,IB.NBF(R1) ;;;IS IT A LEGAL NUMBER?K BLO 30$ ;;;IF LO YES25$: TST R0 ;;;WAS IND GIVEN? BEQ 60$ ;;;IF EQ NOO DEC (R0) ;;;YES--MAKE 1 INTO 0 BR 60$ ;;;FINISH UPB,30$: ADD #IB.DVQ,R1 ;;;POINT TO DEVICE QUEUE .REPT 8.A) TSTB (R1)+ ;;;FIND THE END OF THE QUEUE1# BMI 40$ ;;;IF MI WE HAVE FOUND ITR .ENDM BR 60$ ;;;SHOULD NOT HAPPEN)-40$: MOVB R2,-(R1) ;;;ENTER BUFFER INTO QUEUEC$ MOV R4,R1 ;;;RESET POINTER TO IBUF$ DEC R3 ;;;DECREMENT ARGUMENT COUNT* BGT 20$ ;;;IF GT MORE BUFFERS TO RELEASE!60$: MTPS #0 ;;;ALLOW INTERRUPTS 80$: RETURNT R% .SBTTL INXTBF SET NEXT BUFFER TO USEQ;+"; INXTBF -- SET NEXT BUFFER TO USE;0; CALLING SEQUENCE::;D; IND = INXTBF (IBUF, N [,IND])E; ; INPUTS:A;%; IBUF IS THE IBUF FROM A SWEEP STARTU+; N IS THE NUMBER OF THE NEXT BUFFER TO SET.;M ; OUTPUTS:;;; R0/IND 0 IF ERROR0 ; 1 IF OK;);-INXTBF::CLR R4 ;ASSUM00++2 D%B11110010E FAILURE1 MOV 2(R5),R0 ;GET IBUF ADDRESSR) CALL .FDSWI ;FIND SWB THAT GOES WITH IT; BCS 80$ ;IF CS FORGET IT MOV @4(R5),R2 ;GET BUFFER # BMI 80$ ;MI IS ILLEGAL CMP R2,IB.NBF(R0) ;IS IT LEGAL? BHIS 80$ ;IF HIS NO-" MTPS #PR6 ;;;LOCK OUT INTERRUPTS& CMPB R2,S.WBNO(R1) ;;;CURRENT BUFFER?& BEQ 60$ ;;;IF EQ YES--CANNOT NEXT IT( ADD #IB.DVQ,R0 ;;;POINT TO DEVICE QUEUE% CMPB R2,(R0)+ ;;;IS IT ALREADY NEXT?M BEQ 50$ ;;;IF EQ YES--GET OUTR% MOV #1,R3 ;;;COUNT OF BYTES TO MOVE  .REPT 7 CMPB R2,(R0)+ ;;;IS THIS IT?  BEQ 20$ ;;;IF EQ YES* INC R3 ;;;NO--COUNT ANOTHER BYTE TO MOVE .ENDM( BR 60$ ;;;NOT IN QUEUE--CANNOT NEXT IT+20$: DEC R0 ;;;BACK UP TO BYTE IN QUESTIONA040$: MOVB -(R0),1(R0) ;;;PUSH QUEUE DOWN OVER IT DEC R3 ;;;CHECK FOR ENOUGH BGT 40$ ;;;DO ALL NEEDED( MOVB R2,(R0) ;;;MAKE NEW 'NEXT' BUFFER50$: INC R4 ;;;FLAG SUCCESS!60$: MTPS #0 ;;;ALLOW INTERRUPTSD'80$: MOV R4,R0 ;POSITION STATUS RETURNR" CMPB (R5),#3 ;WERE THERE 3 ARGS?) BNE 100$ ;IF NE NO--DO NOT STORE STATUSI, MOV 6(R5),R1 ;YES--GET POSSIBLE IND ADDRESS CMP #-1,R1 ;WAS IT DEFAULTED?. BEQ 100$ ;IF EQ YES  MOV R0,(R1) ;NO--STORE STATUSC 100$: RETURN O. .SBTTL RMVBUF REMOVE BUFFER FROM DEVICE QUEUE;++; RMVBUF -- REMOVE BUFFER FROM DEVICE QUEUE;T; CALLING SEQUENCE:D;M!; CALL RMVBUF (IBUF, IBUFNO, IND)F&; OR: IND = IRMVBF (IBUF, IBUFNO, IND); ; INPUTS:W;T%; IBUF IS THE IBUF FROM A SWEEP STARTT'; IBUFNO IS THE BUFFER NUMBER TO REMOVEA;? ; OUTPUTS:;F; IND 1 SUCCESSO; 0 NOT IN QUEUER;R;-IRMVBF:: ;REF LABELE&RMVBUF::MOV 2(R5),R0 ;GET IBUF ADDRESS MOV @4(R5),R1 ;GET BUF #R& ADD #IB.DVQ,R0 ;POINT TO DEVICE QUEUE" MOV #7,R2 ;SET MAX COUNT TO MOVE" MTPS #PR6 ;;;LOCK OUT INTERRUPTS .REPT 8.  CMPB R1,(R0)+ ;;;IS THIS IT?  BEQ 20$ ;;;IF EQ YES* DEC R2 ;;;NO--DEC COUNT OF BYTES TO MOVE .ENDM BR 80$ ;;;NOT IN QUEUE.20$: DEC R0 ;;;BACKUP PTR TO BYTE IN QUESTION TST R2 ;;;ANY TO MOVE?. BEQ 60$ ;;;IF EQ NO--JUST REMOVED LAST ENTRY#40$: MOVB 1(R0),(R0)+ ;;;MOVE QUEUEV DEC R2 ;;; BGT 40$ ;;;O%60$: MOVB #-1,(R0) ;;;END WITH A ZERO5 MOV #1,R0 ;;;SET STATUSD BR 100$ ;;;FINISH UP'80$: CLR R0 ;;;SET NOT IN QUEUE STATUS"100$: MTPS #0 ;;;ALLOW INTERRUPTS& CMPB (R5),#3 ;ARE THERE 3 ARGUMENTS?( BLO 120$ ;IF LO NO--DON'T STORE STATUS, MOV 6(R5),R1 ;YES--GET POSSIBLE IND ADDRESS CMP R1,#-1 ;WAS IT DEFAULTED?C BEQ 120$ ;IF EQ YESY MOV R0,(R1) ;NO--STORE STATUSO 120$: RETURN * .SBTTL .FDSWI FIND SWB GIVEN 'IBUF' ARRAY;+;; .FDSWI -- FIND SWEEP CONTROL BLOCK GIVEN THE 'IBUF' ARRAYM; ; INPUTS:;; /; R0 'IBUF' ARRAY ADDRESS (SAME AS USW ADDRESS)$;; ; OUTPUTS:;:; C-CLEAR FOUND SWEEPQ; R1 POINTS TO SWB;S; C-SET COULD NOT FIND SWB; R1 0; ; REGISTERS ALTERED:;; R1; ;-*.FDSWI::MOV #SWB0,R1 ;START WITH FIRST SWB(20$: CMP R0,S.WUSW(R1) ;IS THIS THE SWB? BEQ 40$ ;IF EQ YES( MOV S.WLNK(R1),R1 ;NO--LINK TO NEXT SWB BNE 20$ ;IF MORE GO CHECK  CLR R1 ;ELSE RETURN 0  SEC RETURNR; ; FOUND SWBI; 40$: CLC RETURNB .ENDN THE 'IBUF' ARRAYM; ; INPUTS:;; /; R0 'IBUF' ARRAY ADDRESS (SAME AS USW ADDRESS)$;; ; OUTPUTS:;:; C-CLEAR FOUND SWEEPQ; R1 POINTS TO SWB;S; C-SET COULD NOT FIND SWB; R1 0; ; REGISTERS ALTERED:;; R1; ;-*.FDSWI::MOV #SWB0,R1 ;START WITH FIRST SWB(20$: CMP R0,S.WUSW(R1) ;IS THIS THE SWB? BEQ 40$ ;IF EQ YES( MOV S.WLNK(R1),R1 ;NO--LINK TO NEXT SWB BNE 20$ ;IF MORE GO CHECK  CLR R1 ;ELSE R) .TITLE KBFSTS RETURN SWEEP BUFFER STATUST .IDENT /M01.02/;4 ; COPYRIGHT (C) 1977, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.N;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO 003%DATADATADATADATADATADATADATATHESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01.01 ; B. SCHREIBER 16-AUG-77;E; MODIFIED BY:;U; M. S. HARVEY 11-MAY-795; MSH031 -- CORRECT EVENT FLAG AND ARG LIST HANDLINGA;O1; TL092 -- CORRECT IWTBUF USE OF THE DEFAULT EFNN; C; THIS ROUTINE RETURNS INFORMATION ABOUT BUFFERS IN USE FOR A SWEEP ;U; SYSTEM MACRO CALLS;O .MCALL WTSE$S, KSWDF$, CLEF$S KSWDF$ Q# .SBTTL IBFSTS RETURN BUFFER STATUSE;+ ; IBFSTS -- RETURN BUFFER STATUS;I; CALLING SEQUENCE:E; ; CALL IBFSTS (IBUF, ISTAT)E;Y ; INPUTS:;E'; IBUF IS THE 'IBUF' FROM A SWEEP STARTE5; ISTAT IS AN ARRAY OF DIMENSION 'N' (N IS THE NUMBER3(; OF BUFFERS) WHICH RECEIVES THE STATUS; 2 IN DEVICE QUEUEO; 1 IN USER QUEUEH ; 0 UNKNOWN; -1 CURRENT BUFFERR;I;-"IBFSTS::TST (R5)+ ;SKIP ARG COUNT MOV (R5)+,R0 ;GET IBUF ADDRESSO MOV (R5)+,R2 ;GET ISTAT ADDRESS MOV R2,R3 ;COPY FOR A SECOND+ MOV IB.NBF(R0),R4 ;GET # OF BUFFERS IN USEN&20$: CLR (R3)+ ;CLEAR OUT ISTAT ARRAY DEC R4A BGT 20$ ;... CALL .FDSWI ;FIND SWB BCS 120$ ;SKIP IT IF NOT FOUND" MTPS #PR6 ;;;LOCK OUT INTERRUPTS0 MOVB S.WBNO(R1),R3 ;;;GET CURRENT BUFFER NUMBER ASL R3 ;;;MAKE WORD INDEX % ADD R2,R3 ;;;POINT INTO ISTAT ARRAY3 MOV #-1,(R3) ;;;STORE CURRENT BUFFER STATUS FOR ITS MOV R0,R3 ;;;POINT AT IBUF( ADD #IB.DVQ,R3 ;;;POINT TO DEVICE QUEUE+ MOV #2,R4 ;;;SET 'IN DEVICE QUEUE' STATUS %40$: MOVB (R3)+,R5 ;;;GET NEXT BUFFER  BMI 60$ ;;;IF MI END OF QUEUE+ ASL R5 ;;;MAKE WORD INDEXC ADD R2,R5 ;;;INDEX INTO ISTATI MOV R4,(R5) ;;;STORE STATUSI BR 40$ ;;;CONTINUE260$: ADD #IB.USQ,R0 ;;;POINT TO USER QUEUE IN IBUF DEC R4 ;;;MAKE A 2 INTO A 1L380$: MOVB (R0)+,R5 ;;;GET NEXT ITEM FROM USER QUEUES BMI 100$ ;;;IF MI ALL DONE ASL R5 ;;;MAKE WORD INDEXR ADD R2,R5 ;;;POINT INTO ISTATF MOV R4,(R5) ;;;STORE STATUSE BR 80$ ;;;CONTINUE"100$: MTPS #0 ;;;ALLOW INTERRUPTS 120$: RETURN 5 .SBTTL IWTBUF WAIT FOR BUFFER;+#; IWTBUF -- WAIT FOR BUFFER TO FILLR;N;; THIS ROUTINE WAITS FOR A BUFFER TO FILL BY WAITING ON THEE; SPECIFIED EVENT FLAG.T;E; CALLING SEQUENCE: ;P(; IBUFNO = IWTBUF (IBUF, IEFN [,IBUFNO]);A ; INPUTS:L;0-; IBUF IS THE 'IBUF' PARAM FROM A SWEEP STARTU3; IEFN IS (HOPEFULLY) THE 'IEFN' FROM A SWEEP STARTR;N ; OUTPUTS:;5*; IBUFNO IS THE NEXT BUFFER NUMBER TO USE.;S;+;-$IWTBUF::MOVB (R5),R3 ;GET ARG COUNT" TST (R5)+ ;POINT TO IBUF POINTER MOV (R5)+,R0 ;GET IBUF POINTER) MOV .KDFEF,R2 ;ASSUME DEFAULT EVENT FLAGN' CMP R3,#2 ;IS IEFN ARGUMENT POSSIBLE?L BLT 3$ ;IF LT NO& CMP (R5),#-1 ;USE DEFAULT EVENT FLAG? BEQ 3$ ;IF EQ YESB- TST @(R5) ;ARE WE SURE ITS NOT THE DEFAULT?U# BEQ 3$ ;IF EQ NO, ITS THE DEFAULTF MOV @(R5),R2 ;GET EVENT FLAGH(3$: TST (R5)+ ;POINT TO IBUFNO ARGUMENT* CALL .FDSWI ;FIND SWB ASSOCIATED WITH IT BCS 6$ ;IF CS SKIP IT+' TST S.WSTS(R1) ;IS SWEEP STILL ACTIVE?U) BNE 5$ ;IF NE WE ARE NO LONGER SAMPLINGV ;SO GO RETURN -1 TO USER1 MOVB IB.USQ(R0),R1 ;SEE IF A BUFFER IS AVAILABLE,# BPL 5$ ;IF PL BUFFER IS AVAILABLET WTSE$S R2 ;WAIT FOR ONE- 5$: CLEF$S R2 ;CLEAR EVENT FLAG 6$: BR IGTB0 ;GO TO COMMON CODE U .SBTTL IGTBUF GET BUFFER NUMBER ; IGTBUF -- RETURN BUFFER NUMBER;)4; THIS ROUTINE RETURNS THE NEXT BUFFER NUMBER TO USE;U; CALLING SEQUENCE:F; "; IBUFNO = IGTBUF (IBUF [,IBUFNO]); ; INPUTS:T;S1; IBUF IS THE 'IBUF' FROM A CALL TO START A SWEEP ;A ; OUTPUTS:;M$; IBUFNO IS THE BUFFER NUMBER TO USE;V;-)IGTBUF::MOVB (R5),R3 ;GET ARGUMENT COUNTB INC R3 ;MAKE SAME AS IWTBUFL TST (R5)+ ;SKIP COUNT WORD# MOV (R5)+,R0 ;GET IBUF/USW ADDRESS$-IGTB0: CALL .FDSWI ;FIND SWEEP CONTROL BLOC00;,=B D%B11110010KB3 BCS 40$ ;IF CS JUST RETURN -1 AND BE DONE WITH ITB/ ADD #IB.USQ,R0 ;POINT AT THE USER BUFFER QUEUEM" MTPS #PR6 ;;;LOCK OUT INTERRUPTS, MOVB (R0),R2 ;;;GET THE NEXT BUFFER TO USE, BMI 10$ ;;;IF MI NO NEED TO MOVE THE QUEUE .REPT 7/ MOVB 1(R0),(R0)+ ;;;MOVE THE QUEUE DOWN A BYTER .ENDM+ MOVB #-1,(R0) ;;;MARK THE END OF THE QUEUEM9 CMPB R2,S.WEBF(R1) ;;;SHOULD THIS BUFFER SET ERROR CODE?I BNE 10$ ;;;IF NE NO+2 MOV S.WSTS(R1),@S.WUSW(R1) ;;;YES--SET ERROR CODE!10$: MTPS #0 ;;;ALLOW INTERRUPTSI* MOV (R5),R1 ;GET POSSIBLE IBUFNO ADDRESS% CMP R3,#3 ;CAN IBUFNO BE SPECIFIED?  BLT 20$ ;IF LT NO; CMP R1,#-1 ;WAS IT SPECIFIED?R BEQ 20$ ;IF EQ NOF' MOV R2,(R1) ;YES--STORE BUFFER NUMBER '20$: MOV R2,R0 ;POSITION BUFFER NUMBER,+ RETURN ;BACK TO CALLER WITH NUMBER IN R0M;; CANNOT FIND SWB FOR IBUF;O'40$: MOV #-1,R2 ;JUST RETURN NO BUFFERL BR 10$ ;STORE CODE AND RETURNB .END;;IF NE NO+2 MOV S.WSTS(R1),@S.WUSW(R1) ;;;YES--SET ERROR CODE!10$: MTPS #0 ;;;A .TITLE KCLOKA CLOCK A CONTROL .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 5-SEP-77 ;E>; THIS ROUTINE ACCEPTS RATES AND PRESETS TO BE USED LATER WITH ; CLOCK A.;S; SYSTEM MACRO CALLS;D .MCALL KSWDF$ KSWDF$E A;++; CLOCKA -- SET RATE AND PRESET FOR CLOCK AN;M; CALLING SEQUENCE:T; (; CALL CLOCKA (IRATE, IPRSET,IND, [LUN]);L ; INPUTS:N;U'; IRATE IS THE DESIRED CLOCK RATE (0-7)N3; IPRSET IS THE 16-BIT 2S COMPLEMENT PRESET TO LOADO; LUN IS IGNORED;I ; OUTPUTS:;O; IND RETURNS STATUS; 0 BAD ARGUMENTS.; 1 CLOCK RATE AND PRESET SET FOR SWEEP START<; FLAGS ARE SET SO SWEEP ROUTINES KNOW THIS ROUTINE HAS BEEN ; CALLED.;L;-CLOCKA:: .IF DF K$$W11& CALL .K.PAA ;VALIDATE AND STACK ARGS .WORD 4 ;4 ARGSA! .WORD 14 ;1ST TWO ARGS REQUIREDN BCC 10$ ;IF CC CONTINUEO .IFTF ;K$$W11% MOV #3,R4 ;STORE IN THIRD ARG (IND)  CLR R3 ;STORE 0 FOR ERROR72 CALLR .IESTO ;TRY TO STORE ERROR CODE AND RETURN .IFT ;K$$W11N 10$: MOV @(SP)+,R0 ;GET THE RATE( BIC #^C<7>,R0 ;CLEAR UNINTERESTING BITS ASL R0 ;MAKE INTO CLOCK RATE A .IF DF Q$$BUS ASL R0 ;A COUPLE MORE SHIFTS& ASL R0 ;FOR THE Q-BUS VERSION PLEASE .ENDC ;Q$$BUS MOV R0,.KARAT ;SAVE FOR LATER$ MOV @(SP)+,.KAPRE ;STORE THE PRESET MOV (SP)+,R0 ;GET IND ADDRESS" BEQ 20$ ;IF EQ SKIP STATUS STORE MOV #1,(R0) ;SET SUCCESS20$: TST (SP)+ ;SKIP THE LUN ( BIS #K$ACAC,.KAFLG ;FLAG WE WERE CALLED .ENDC ;K$$W11 100$: RETURN .END$W11N 10$: MOV @(SP)+,R0 ;GET THE RATE( BIC #^C<7>,R0 ;CLEAR UNINTERESTING BITS ASL R0 ;MAKE INTO CLOCK RATE A .IF DF Q$$BUS ASL R0 ;A COUPLE MORE SHIFTS& ASL R0 ;FOR THE Q-BUS VERSION PLEASE . .TITLE KCLOKB CLOCK 'B' CONTROL .IDENT /M01.01/;;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.L;/>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE T00C%DATADATADATADATADATADATADATAERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 5-SEP-77 ;E; B. SCHREIBER 15-MAY-78; 9; BLS048 -- CORRECT NUMBER OF ARGUMENTS ACCEPTED FOR CALLS;T&; THIS ROUTINE CONTROLS KW11-K CLOCK B;L; SYSTEM MACRO CALLS;  .MCALL CINT$S, KSWDF$, KDVDF$ KSWDF$U KDVDF$U C;+; CLOCKB -- CLOCK B CONTROLD;O; CALLING SEQUENCE:A; /; CALL CLOCKB (IRATE, IPRSET, MODE, IND, [LUN]); ; INPUTS:E;O; IRATE IS THE RATE (0-7) .; IPRSET IS THE PRESET (TWOS COMPLEMENT 0-255); MODE IS THE MODE FLAGD; 0 - INTERRUPT MODE; 1 - NON-INTERRUPT MODEE; LUN IS IGNORED;A ; OUTPUTS:;0/; IND 0 UNABLE TO START CLOCK B (BAD ARGS, ETC)L!; 1 CLOCK B STARTED SUCCESSFULLY1;C;-CLOCKB:: ;REF LABELC .IF DF K$W11K0 CALL .K.PAA ;VALIDATE ARGS AND PUSH ONTO STACK .WORD 5 ;5 ARGUMENTS .WORD 0 ;NONE REQUIRED BCC 10$ ;IF CC OKO .IFTF ;K$W11K' MOV #4,R4 ;STORE CODE IN 4TH ARGUMENT  CLR R3 ;STORE 0 FOR ERRORP& CALLR .IESTO ;STORE ERROR AND RETURN .IFT ;K$W11K 10$: MOV (SP)+,R0 ;GET THE RATE BNE 40$ ;IF PRESENT FORGE ON- CLR .CLK16 ;ELSE ZERO 16-BIT SOFTWARE CLOCKE320$: CMP (SP)+,(SP)+ ;PIP IPRSET AND MODE ADDRESSEST BR 110$ ;RETURN SUCCESS)40$: MOV (R0),R0 ;GET THE SPECIFIED RATE BNE 60$ ;IF NE GO AHEADS CLR @.KBCSR ;ELSE STOP CLOCK B BR 20$ ;GO RETURN *60$: BIC #^C<7>,R0 ;CLEAR ALL BUT LOW BITS ASL R0 ;POSITION FOR CSR& MOV R0,.KBRAT ;SET FOR ENABLE ROUTINE! MOV (SP)+,R0 ;GET PRESET ADDRESST BNE 70$ ;IF NE GO HANDLE* MOV #.NEG1,R0 ;ELSE USE DEFAULT OF 1 TICK*70$: MOV (R0),.KBPRE ;SET THE CLOCK PRESET MOV (SP)+,R0 ;GET THE MODE WORD BNE 80$ ;IF NE OK(" MOV #.ZEROW,R0 ;DEFAULT IS MODE 0;80$: MOV (R0),.KBMOD ;SET FLAG FOR INTERRUPT ENABLE ROUTINEI. BIT #K$ACIN,.KBFLG ;ARE WE ALREADY CONNECTED? BEQ 100$ ;IF EQ NO--GO CONNECT CALL .KBSTRT ;YES--START CLOCK BR 110$ ;RETURN SUCCESSLG100$: CINT$S .KBVEC,#$KBASE,#.KBINT,#.KBEDI,#PR6 ;CONNECT TO INTERRUPTS+ BCS 120$ ;IF CS SKIP1 BIS #K$ACIN,.KBFLG ;FLAG CONNECTED TO INTERRUPTSU110$: MOV #1,R0 ;SET SUCCESS( BR 140$ ;RETURN 120$: CLR R0 ;SET FAILURE#140$: MOV (SP)+,R1 ;GET IND ADDRESSO# BEQ 160$ ;IF EQ SKIP STATUS STORE0 MOV R0,(R1) ;STORE IND RESULTF*160$: TST (SP)+ ;CLEAN LUN ARG FROM STACK RETURNE - .SBTTL .KBEDI CLOCK B ENABLE/DISABLE ROUTINEN;+.; .KBEDI -- ENABLE/DISABLE ROUTINE FOR CLOCK B; C; THIS ROUTINE IS CALLED BY THE EXECUTIVE TO ENABLE/DISABLE CLOCK BO;T ; INPUTS:B;11; C-SET DISCONNECTING CLOCK FROM INTERRUPT VECTORE; STOP CLOCK AND RETURN;1; C-CLEAR ENABLING CLOCK; START CLOCK; ;- .PSECT .KSCT1(.KBEDI: BCS .KBDSC ;IF CS GO DISCONNECT1 BIS #K$ACIN,.KBFLG ;FLAG CONNECTED TO INTERRUPTSE&.KBSTRT:MOV .KBCSR,R2 ;GET CSR ADDRESS CLR (R2) ;STOP THE CLOCK+ MOV #KB$OIE!KB$B2A!KB$ENB,R0 ;ENABLE CLOCKT$ BIT #1,.KBMOD ;SHOULD WE INTERRUPT? BEQ 20$ ;IF EQ YES--GO AHEAD6 MOV #KB$B2A!KB$ENB,R0 ;NO--DO NOT LET CLOCK INTERRUPT!20$: BIS .KBRAT,R0 ;SET RATE BITS ! MOV .KBPRE,2(R2) ;SET THE PRESETV MOV R0,(R2) ;AND THE CSR RETURN%.KBDSC: CLR @.KBCSR ;DISABLE CLOCK BK- BIC #K$ACIN,.KBFLG ;NOTE NO LONGER CONNECTEDC RETURNG;+%; .KBINT -- CLOCK B INTERRUPT ROUTINEC; ; INPUTS:T;; NONE; ; OUTPUTS:;C; .CLK16 IS INCREMENTED BY ONE;O;--.KBINT::INC .CLK16 ;;;COUNT CLOCK B OVERFLOWT- RETURN ;;;END OF CLOCK B INTERRUPT ROUTINE  Y( .SBTTL ICLOKB READ CLOCK B 16 BIT CLOCK;+; ICLOKB -- READ CLOCK B;S ; INPUTS:;; ; NONE; ; OUTPUTS:;2?; THE VALUE OF THE 16 BIT CLOCK IS RETURNED IN R0 FOR A FORTRAN ; FUNCTION CALL.; ;-$ICLOKB::MOV .CLK16,R0 ;GET THE VALUE RETURNE .IFF ;K$W11K+ICLOKB::00K.L5Q D%B11110010 CLR R0  RETURN  .ENDC ;K$W11K .END; NONE; ; OUTPUTS:;C; .CLK16 IS INCREMENTED BY ONE;O;--.KBINT::INC .CLK16 ;;;COUNT CLOCK B OVERFLOWT- RETURN ;;;END OF CLOCK B INTERRUPT ROUTINE  Y( .SBTTL ICLOKB READ CLOCK B 16 BIT CLOCK;+; ICLOKB -- READ CLOCK B;S ; INPUTS:;; ; NONE; ; OUTPUTS:;2?; THE VALUE OF THE 16 BIT CLOCK IS RETURNED IN R0 FOR A FORTRAN ; FUNCTION CALL.; ;-$ICLOKB::MOV .CLK16,R0 ;GET THE VALUE RETURNE .IFF ;K$W11K+ICLOKB::) .TITLE KCOMM COMMON RO DATA FOR K-SERIES .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; ; VERSION 01; B. SCHREIBER 19-AUG-77;EE; THIS MODULE CONTAINS THE READ-ONLY DATA BASE AND GLOBAL DEFINITIONS  E .SBTTL GLOBAL DEFINITIONS;+; GLOBAL DEFINITIONS;LB; THE FOLLOWING DEFINITIONS MAY BE ALTERED BY THE USER BY EDITTING ; THIS FILE:; :; ADTMOV THE VALUE RETURNED IN THE BUFFER WHEN THERE IS AN5; A/D TIMEOUT (THE A/D DID NOT CONVERT FAST ENOUGH).;E<; ADERRV THE VALUE RETURNED IN THE BUFFER WHEN THE A/D ERROR4; FLAG IS RAISED ON A CONVERSION (USUALLY INDICATES/; THAT CONVERSIONS ARE OCCURRING TOO RAPIDLY).7;E8; TMO$AD THE TIMEOUT COUNT USED WHEN WAITING FOR THE A/D5; TO CONVERT. IF YOU SEE A LOT OF "ADTMOV"'S IN THE 0; BUFFER, YOU MAY WISH TO INCREASE THIS NUMBER.;A;- .PSECT .KSCT02$KBASE:: ;LABEL TO DEFINE BEGINNING OF DATA BASE$ADTMOV == 177776 ;A/D TIMEOUT VALUE"ADERRV == 177777 ;A/D ERROR VALUE!TMO$AD == 25. ;A/D TIMEOUT COUNTE7I$BFVW == 171717 ;'IBUF' VALIDATION WORD (TO DETERMINE  ; IF SETIBF WAS CALLED) Y .SBTTL READ-ONLY DATA BASEN; ; A ZERO WORDA;L.ZEROW::.WORD 0D.NEG1:: .WORD 177777.ONE:: .WORD 1 .IF DF M$$MGE;R@; APR5 RELOCATION FACTOR TO ADD TO ADDRESSES AT TASK LEVEL SO WE4; MAY REFERENCE THEM AT EXEC LEVEL ON MAPPED SYSTEM.;AB$KRLC5::.WORD 120000-<$KBASE & 177700> ;VALUE TO BE ADDED FOR APR5 .ENDC .ENDADERRV == 177777 ;A/D ERROR VALUE!TMO$AD == 25. ;A/D TIMEOUT COUNTE7I$BFVW == 171717 ;'IBUF' VALIDATION WORD (TO DETERMINE  ; IF SETIBF WAS CALLED) Y .SBTTL READ-ONLY DATA BASEN; ; A ZERO WORDA;L.ZEROW::.WORD 0D.NEG1:: .WORD 177777.ONE:: .WORD 1 .IF DF M$$MGE;R2 .TITLE KCVADF CONVERT A/D INPUT TO FLOATING POINT .IDENT /M01.01/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.B;E>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 22-SEP-77;E; B. SCHREIBER 13-JUN-78; 8; BLS054 -- CONVERT THE ARGUMENT RAT005SGWDATADATADATADATADATADATADATAHER THAN ITS ADDRESS; ; FROM THE LPS ROUTINE CVSWG; <; THIS ROUTINE CONVERTS A/D INPUT TO A FLOATING POINT NUMBER;M; TABLE OF GAIN VALUES;UGAIN: .BYTE 6,4,2,0  1 .SBTTL CVADF CONVERT A/D INPUT TO FLOATING POINTB;+/; ROUTINE TO CONVERT SWITCH GAIN TO FLOATING PT ;R; CVADF (IVAL, [VAL])S;R; IVAL = SWITCH GAIN VALUE;E; BITS 15-12 GAIN ; 0=GAIN1E ; 1=GAIN4 ; 2=GAIN16 ; 3=GAIN64;2; BITS 11-0 VALUE ALWAYS PLUS-;-;+; INPUT R5 = ^ TO ARG LIST (FORTRAN FORMAT)H;I; OUTPUT VALUE IN R0-R1E;S; USE VAR=(64*VALUE)/GAINR;-CVADF:: MOV @2(R5),R2 ;GET IVALN% BMI 40$ ; IF MINUS HANDLE SPECIALLYU MOV R2,R1 ;ISOLATE GAIN, BIC #147777,R2 ;D BIC R2,R1 ;N CLR R0 ;CLEAR HIGH ORDER SWAB R2 ; PICK UP GAIN*1 ASR R2  ASR R2P ASR R2  ASR R2A( MOVB GAIN(R2),R2 ; GET NUMBER OF SHIFTS BEQ 60$ ; IF =0 THEN DONE 20$: ASL R1  ROL R0 DEC R2N BNE 20$ BR 60$2$40$: MOV #-1,R0 ; SET A MINUS PARAM MOV R2,R1;+(; ROUTINE TO FLOAT A DOUBLE WORD INTEGER; INPUT R0 -- HIGH ORDER; R1 -- LOW ORDER;I; OUTPUT R0-R1 FLOATING VALUE; R2,R3 DISTROYED;-60$: MOV R1,R3 ;FIND 0 FIRSTR CLR R2 ; CLEAR EXPONENT WORD BIS R0,R3/ BEQ 140$ ; IF ZERO SET R0=0 AND R1=0 AND R2=02 TST R0 ;TEST MINUS BPL 80$ ;R3 BIS #400,R2 ;IF MINUS SET SIGN BIT IN EXPON. WORDR$ NEG R0 ;2'S COMPLEMENT DOUBLE WORD NEG R1A SBC R0 ;(80$: BISB #240,R2 ;SET HIGHEST EXPONENT100$: ASL R1 ;NORMALIZE NUMBERM* ; BY SEARCHING FOR C BIT (HIDDEN NORM) ROL R0R BCS 120$0 DEC R2 ;DECREASE EXPONENTO BR 100$ ;U+120$: CLRB R1 ; SET UP R0,R1 FROM R2,R0,R1D BISB R0,R1V SWAB R1 CLRB R0 BISB R2,R0; SWAB R0 SWAB R2 ASR R2, ROR R01 ROR R1 #140$: CMPB (R5),#2 ;TWO ARGUMENTS?T' BNE 160$ ;IF NE NO--NO VALUE TO STORE, MOV 4(R5),R2 ;YES--GET ADDRESSO$ MOV R0,(R2)+ ;STORE HIGH ORDER PART# MOV R1,(R2) ;STORE LOW ORDER PARTB160$: RETURN ; .ENDXPONENT100$: ASL R1 ;NORMALIZE NUMBERM* ; BY SEARCHING FOR C BIT (HIDDEN/ .TITLE KDIGO SET DIGITAL INPUT START FOR SWEEP .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 5-SEP-77 ;E;; THIS ROUTINE ENABLES A DR11 INPUT BIT(S) TO START A SWEEPG;T; SYSTEM MACRO CALLS;T .MCALL KSWDF$, KDVDF$, CINT$S KSWDF$A KDVDF$  M* .SBTTL DIGO SET DIGITAL INPUT START EVENT;++; DIGO -- SET DR11 INPUT BIT TO START SWEEP ;I; CALLING SEQUENCE:C;T"; CALL DIGO (IUNIT, MASK, [KOUNT]);I ; INPUTS:R;O'; IUNIT DR11 UNIT NUMBER (DEFAULT IS 0)O ; MASK MASK TO SELECT START BITS/; IF DEFAULTED IMMEDIATELY SIMULATE ST1 FIRINGD(; IF ZERO, CANCEL PENDING DIGITAL START7; KOUNT RECEIVES THE VALUE OF THE 16-BIT SOFTWARE CLOCK ; IF MASK IS DEFAULTED.;M ; OUTPUTS:;T ; DR11 IS ENABLED TO START SWEEP;K;-4DIGO:: CALL .K.PAA ;VALIDATE ARGS AND PUSH ON STACK .WORD 3 ;3 ARGS- .WORD 0 BCS 100$ ;IF CS ERROR ! MOV (SP)+,R0 ;GET UNIT # ADDRESSA BNE 20$ ;IF GIVEN GO MOV #.ZEROW,R0 ;ELSE USE 0 20$: MOV (R0),R0 ;GET UNIT #  ASL R0 ;CONVERT TO WORD INDEXR MOV (SP)+,R1 ;GET MASK ADDRESSL" BEQ 200$ ;IF EQ SIMULATE ST1 NOW .IF DF N$DR11# MOV .DRUTB(R0),R4 ;GET SWB ADDRESSO" CMP R4,#DRSW0 ;IS IT A LEGAL SWB? BLO 120$ ;00G[aQ D%B11110010IF LO NO CMP R4,#.DRUTB ;MAYBE...  BHIS 120$ ;IF HIS NO$ MOV (R1),S.WMSK(R4) ;READ MASK BITS# BEQ 300$ ;IF EQ STOP DIGO REQUEST3;GB; WE MUST NOW CONNECT TO INTERRUPTS AND ENABLE FOR INPUT INTERRUPT;S TST S.WFL2(R4) ;ACTIVE SWEEP? BPL 40$ ;IF PL NO 5 BIT #S$WNOV,S.WFLG(R4) ;YES--IS IT INTERRUPT DRIVEN?O BEQ 40$ ;IF EQ NOP* BIT #S$WIOF,S.WFL2(R4) ;YES--IS IT INPUT?" BNE 60$ ;IF NE YES--SKIP CONNECT40$: MOV R4,R3 ;POINT TO SWBD) SUB #4,R3 ;BACK UP TO INTERRUPT ROUTINE8 BIS #S$WSST,S.WFL2(R4) ;FLAG SIMULATING SCHMITT TRIGGER= CINT$S S.WUBX+U.IVEC(R4),#$KBASE,R3,#.DREDI,S.WPRI(R4) ;CINT # BCS 320$ ;IF CS COULD NOT CONNECTM60$: ;REF LABEL .IF DF M$$MGE5 MOV #.DRIN3+120000-<$KBASE&177700>,-2(R4) ;PT TO ISR? .IFF ;M$$MGEL! MOV #.DRIN3,-2(R4) ;POINT TO ISRS .ENDC ;M$$MGE8 BIS #DI$ENB,@S.WCSR(R4) ;SET INPUT INTERRUPT ENABLE BIT .ENDC ;N$DR11$80$: TST (SP)+ ;SKIP KOUNT ARGUMENT 100$: RETURN;W; ILLEGAL UNIT;C&120$: CMP (SP)+,(SP)+ ;CLEAN THE STACK RETURN4;F; SIMULATE SCHMITT TRIGGER NOW;N200$: ;REF LABEL, .IF NDF FT$MOPS/ MOV .KASWB,R4 ;GET SWB ADDRESS OF ACTIVE SWEEPC BEQ 80$ ;NOTHING TO DO IF ZERO- BIT #S$WEXT,S.WFLG(R4) ;WANT EXTERNAL START?2 BEQ 80$ ;IF EQ NO.% MTPS #PR6 ;YES--LOCK OUT INTERRUPTSI. CALL @S.WSTR(R4) ;;;CALL SCHMITT TRIG ROUTINE/ BIC #S$WEXT,S.WFLG(R4) ;;;CLEAR EXT START FLAGC .IFF ;FT$MOPT1 MOV #.KLQUU-S.WCLQ,R4 ;POINT TO CLOCK QUEUE HEADL MTPS #PR6 ;LOCK OUT INTERRUPTS'210$: MOV S.WCLQ(R4),R4 ;;;LINK TO NEXTU BEQ 220$ ;;;IF EQ ALL DONE/ BIT #S$WEXT,S.WFLG(R4) ;;;WANT EXTERNAL START?. BEQ 210$ ;;;IF EQ NO--IGNORE3 CALL @S.WSTR(R4) ;;;YES--CALL SCHMITT TRIG ROUTINE$/ BIC #S$WEXT,S.WFLG(R4) ;;;CLEAR EXT START FLAG  BR 210$ ;;;CONTINUE  .ENDC ;FT$MOP'220$: MOV (SP)+,R3 ;;;GET KOUNT ADDRESS  BEQ 280$ ;;;IF EQ NOT GIVENL .IF DF K$W11K: MOV .CLK16,(R3) ;;;YES--STORE 16 BIT CLOCK AT TIME OF ST1 .IFF ;K$W11KH# CLR (R3) ;;;NO CLOCK--CLEAR KOUNT .ENDC ;K$W11K280$: ;;;REF LABELB .IF DF K$$W11) MOV .KACSR,R3 ;;;GET CLOCK A CSR ADDRESSE= BIC #KA$STF!KA$STI!KA$STE,(R3) ;;;DISABLE CLOCK SCHMITT TRIG 1 BIT #KA$ENB,(R3) ;;;SEE IF CLOCK ALREADY ENABLEDW* BNE 290$ ;;;IF NE YES??--DON'T RE-ARM IT" INC (R3) ;;;SET CLOCK A'COUNTING .ENDC ;K$$W11"290$: MTPS #0 ;;;ALLOW INTERRUPTS RETURN ;DONE;F; KILL PENDING REQUEST;R9300$: BIT #S$WSST,S.WFL2(R4) ;SIMULATING SCHMITT TRIGGER?1 BEQ 80$ ;IF EQ NO--JUST RETURN-320$: BIC #S$WSST,S.WFL2(R4) ;YES--WE WERE...A6 BIC #DI$ENB,@S.WCSR(R4) ;CLEAR INPUT INTERRUPT ENABLE BR 80$ ;RETURN .ENDKA$STI!KA$STE,(R3) ;;;DISABLE CLOCK SCHMITT TRIG 1 BIT #KA$ENB,(R3) ;;;SEE IF CLOCK ALREADY ENABLEDW* BNE 290$ ;;;IF NE YES??--DON'T RE-ARM IT" INC (R3) ;;;SET CLOCK A'COUNTING .ENDC ;K$$W11"290$: MTPS #0 ;;;ALLOW INTERRUPTS RETURN ;DONE;F; KILL PENDING REQUEST;R9300$: BIT #S$WSST,S.WFL2(R4) ;SIMULATING SCHMITT TRIGGER?1 BEQ 80$ ;IF EQ NO--JUST RETURN-320$: BIC #S$WSST,S.WF .TITLE KDIO SINGLE DIGITAL I/OG .IDENT /1.03/;D ; COPYRIGHT (C) 1977, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.A;T>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 1.03; B. SCHREIBER 5-SEP-77T; ; MODIFIED BY:; ; B. SCHREIBER 15-MAY-78;; BLS048 -- CORRECT USE OF MASK.00cWDATADATADATADATADATADATADATA CLEAR SAVED R5 FROM STACKO1; BEFORE SUCCESSFUL ROUTINE EXIT. WRITE VALUEN3; READ FROM DIGITAL REGISTER BACK TO REGISTER INI; ALL CASES.G;I; M. S. HARVEY 12-MAY-79;; MSH034 -- ALTER ONLY THOSE OUTPUT REGISTER BITS THAT HAVEO; BEEN MASK MARKEDS;E9; HB008 -- CONDITIONALIZE WRITE ACCESS TO RECEIVE BUFFERO; FOR Q-BUS DRV11; ;N3; THIS MODULE PROCESSES SINGLE DIGITAL INPUT/OUTPUTB;S; SYSTEM MACRO CALLS;: .MCALL KSWDF$,KDVDF$- KSWDF$L KDVDF$O C' .SBTTL IDINP/DINP SINGLE DIGITAL INPUTO;+#; IDINP/DINP -- SINGLE DIGIAL INPUTT;A; CALLING SEQUENCES:;T(; CALL DINP (IUNIT, [MASK], IOSB, INPUT); OR,; IND = IDINP (IUNIT, [MASK], IOSB, [INPUT]);E-; OR IND = IDINP (IUNIT) !FAST VERSION ONLY ;B ; INPUTS:R;S'; IUNIT IS THE DR11 UNIT (DEFAULT IS 0)C@; MASK SELECTS WHICH BITS WILL BE CLEARED IN DR11 INPUT REGISTER;R ; OUTPUTS:;D-; INPUT RECEIVES THE DATA INPUT FROM THE DR11S+; IND RECEIVES THE DATA INPUT FROM THE DR11V; IOSB RECEIVES THE I/O STATUS; ;- .IF NDF Q$$DIO IDINP::-DINP:: MOV R5,-(SP) ;SAVE ARG PTR & CALL .K.PAA ;VALIDATE AND STACK ARGS .WORD 4 ;4 ARGS  .WORD 2 ;IOSB REQUIRED BCS DIOBAD ;IF CS BAD ARGS MOV (SP)+,R1 ;GET UNIT NUMBER BNE 20$ ;IF NE OKN MOV #.ZEROW,R1 ;ELSE USE 01"20$: MOV (R1),R1 ;GET UNIT NUMBER ASL R1 ;MAKE INDEX& MOV .DRUTB(R1),R1 ;GET POINTER TO SWB+ CMP R1,#DRSW0 ;MAKE SURE LEGAL SWB ADDRESSR BLO 80$ ;IF LO NOT LEGAL& CMP R1,#.DRUTB ;THIS FOLLOWS LAST SWB BHIS 80$ ;IF HIS NOT LEGAL# MOV S.WCSR(R1),R1 ;GET CSR ADDRESSP' MOV DI$BUF(R1),R0 ;READ INPUT REGISTERK MOV (SP)+,R2 ;GET MASK ADDRESS. BNE 30$ ;IF NE GO USE MASK+ MOV #.NEG1,R2 ;ELSE USE DEFAULT OF ALL 1'SM .IF DF L$$SI130$: .IFFB>30$: MOV (R2),DI$BUF(R1) ;CLEAR BITS IN DIGITAL INPUT REGISTER .ENDC&40$: MOV #IS.SUC,@(SP)+ ;STORE SUCCESS" MOV (SP)+,R1 ;GET 'INPUT' ADDRESS BEQ 60$ ;IF EQ SKIP IT MOV R0,(R1) ;ELSE STORE DATA*60$: TST (SP)+ ;CLEAR SAVED R5 FROM STACK RETURNI80$:+DIOBD0: MOV R5,SP ;ILL UNIT--RESTORE STACKS;D; BAD PARAMETERS;12DIOBAD: MOV #-,R3 ;SET VALUE TO STORE" MOV #3,R4 ;STORE IN 3RD ARGUMENT MOV (SP)+,R5 ;GET ARG PTR BACKU- CALLR .IESTO ;TRY TO STORE ERROR AND RETURN .IFF ;Q$$DIOIDINP::!IDINP:: MOV @2(R5),R1 ;GET UNIT #R ASL R1 ;MAKE WORD INDEXS# MOV .DRUTB(R1),R1 ;GET SWB ADDRESSR# MOV S.WCSR(R1),R1 ;GET CSR ADDRESS , MOV DI$BUF(R1),R0 ;READ DR11 INPUT REGISTER .IF NDF L$$SI1E& MOV R0,DI$BUF(R1) ;CLEAR BITS IN DR11 .ENDC RETURN  .ENDC ;Q$$DIO ( .SBTTL IDOUT/DOUT SINGLE DIGITAL OUTPUT;+%; DOUT/IDOUT -- SINGLE DIGITAL OUTPUT4;S; CALLING SEQUENCES:;V(; CALL DOUT (IUNIT, [MASK], IOSB, IDATA); OR+; IOUT = IDOUT (IUNIT, [MASK], IOSB, IDATA)I; ; INPUTS:N; .; IUNIT IS THE DR11 UNIT NUMBER (DEFAULT IS 0)%; MASK SELECTS THE BITS TO BE ALTEREDR.; IDATA IS THE DATA WORD TO OUTPUT TO THE DR11;$ ; OUTPUTS:;D; IOSB RECEIVES THE I/O STATUS<; IOUT RECEIVES A COPY OF THE DR11 OUTPUT REGISTER IF CALLED; AS A FUNCTION.;;D>; NOTE: FOR THE QUICK VERSION, THE ARGUMENTS MASK AND IOSB ARE<; NOT USED, BUT ARE REQUIRED (OR DEFAULTED) TO KEEP THE SAME ; STRUCTURE AS THE SLOW VERSION.;- .IF NDF Q$$DIOIDOUT::IDOUT::, MOV R5,-(SP) ;SAVE ARG PTRN& CALL .K.PAA ;VALIDATE AND STACK ARGS .WORD 4 ;4 ARGSK .WORD 2 ;MASK  BCS DIOBAD ;IF CS BAD ARGS MOV (SP)+,R1 ;GET UNIT NUMBER BNE 20$ ;IF NE GO USEO MOV #.ZEROW,R1 ;ELSE USE 0 "20$: MOV (R1),R1 ;GET UNIT NUMBER ASL R1 ;MAKE WORD INDEXA" MOV .DRUTB(R1),R1 ;GET PTR TO SWB! CMP R1,#DRSW0 ;SEE IF A REAL SWBN BLO DIOBD0 ;IF LO NO CMP R1,#.DRUTB ;... BHIS DIOBD0 ;IF HIS ILLEGALT# MOV S.WCSR(R1),R1 ;GET CSR ADDRESS. MOV (SP)+,R2 ;GET MASK ADDRESS, BNE 40$ ;IF NE OK  MOV #.NEG1,R2 ;ELSE USE ALL 1S 40$: MOV (R2),R2 ;GET MASKA8 MOV DO$BUF(R1),R0 ;GET CURRENT OUTPUT REGISTER CONTENTS' BIC R2,R0 ;INITIALIZE THE MASKED BITS  COM R2 ;COMPLEMENT MOV (SP)+,R3 ;GET IOSB ADDRESS, MOV @(SP)+,R4 ;GET OU00kmQ D%B11110010TPUT DATAA BIC R2,R4 ;MASKV3 BIS R0,R4 ;RECOVER PROTECTED OUTPUT REGISTER BITSF- MOV R4,DO$BUF(R1) ;STORE DIGITAL OUTPUT DATA. MOV #IS.SUC,(R3)+ ;SET SUCCESS . MOV R4,R0 ;COPY IN CASE CALLED AS A FUNCTION& TST (SP)+ ;CLEAR SAVED R5 FROM STACK RETURNE .IFF ;Q$$DIO,IDOUT::E DOUT:: MOV @2(R5),R1 ;GET UNIT # ASL R1 ;MAKE WORD INDEXE# MOV .DRUTB(R1),R1 ;GET SWB ADDRESSB( MOV S.WCSR(R1),R1 ;GET DR11 CSR ADDRESS+ MOV @10(R5),DO$BUF(R1) ;WRITE DATA TO DR11D RETURNM .ENDC ;Q$$DIO .ENDTAA BIC R2,R4 ;MASKV3 BIS R0,R4 ;RECOVER PROTECTED OUTPUT REGISTER BITSF- MOV R4,DO$BUF(R1) ;STORE DIGITAL OUTPUT DATA. MOV #IS.SUC,(R3)+ ;SET SUCCESS . MOV R4,R0 ;COPY IN CASE CALLED AS A FUNCTION& TST (SP)+ ;CLEAR SAVED R5 FROM STACK RETURNE .IFF ;Q$$DIO,IDOUT::E DOUT:: MOV @2(R5),R1 ;GET UNIT # ASL R1 ;MAKE WORD INDEXE# MOV .DRUTB(R1),R1 ;GET SWB ADDRESSB( MOV S.WCSR(R1),R1 ;GET DR11 CSR ADDRESS+ MOV @10(R5),DO$BUF(R1) ;WRITE DATA TO DR11D RETURNM .ENDC ;Q$$DIO" .TITLE KDISWP DIGITAL INPUT SWEEP .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 11-SEP-77;E@; THIS MODULE INITIATES A DIGITAL INPUT SWEEP THROUGH THE DR11-K;H; SYSTEM MACRO CALLS;E .MCALL KSWDF$ KSWDF$  T' .SBTTL DISWP DIGITAL INPUT SWEEP STARTC;+.; DISWP -- START DIGITAL INPUT SWEEP ON DR11-K;C; CALLING SEQUENCE:I;A;; CALL DISWP (IBUF,LBUF,NBUF,MODE,IPRSET,IEFN,LDELAY,IUNIT)I;N ; INPUTS:O;; SEE DOCUMENTATIONR;O ; OUTPUTS:;H(; SWEEP IS STARTED UNLESS ERROR DETECTED;Q;-"DISWP:: MOV R5,-(SP) ;SAVE ARG PTR& CALL .K.PAA ;VALIDATE ARGS AND STACK .WORD 8. ;EIGHT ARGS# .WORD 300 ;MASK FOR REQUIRED ARGSH BCC 10$ ;IF CC CONTINUEC, MOV #-,R3 ;ELSE SET ERROR CODE CLR R4 ;IN CASE MULT SWEEPSE& BR 600$ ;STORE ERROR CODE AND RETURN410$: MOV 16(SP),R0 ;REACH DOWN AND GET IUNIT ADDRESS BNE 20$ ;IF NOT DEFAULTED GO MOV #.ZEROW,R0 ;ELSE USE UNIT 0"20$: MOV (R0),R0 ;GET UNIT NUMBER ASL R0 ;CONVERT TO INDEX3 MOV .DRUTB(R0),R4 ;GET SWEEP CONTROL BLOCK ADDRESS ! CMP R4,#DRSW0 ;ENSURE A REAL SWBK BLO 200$ ;IF LO ERRORS CMP R4,#.DRUTB ;CHECK HIGH ENDO BHIS 200$ ;IF HIS ERRORA. CALL .K.SET ;SET UP SWEEP BLOCK AND VALIDATE BCS 200$ ;IF CS ERROR DETECTED$ CALL .K.DLY ;CHECK DELAY PARAMETER BCS 300$ ;IF CS ERRORE" TST (SP)+ ;POP OFF IUNIT ADDRESS0 BIS #S$WIOF,S.WFL2(R4) ;FLAG THAT THIS IS INPUT( CALL .K.STB ;SET UP BUFFER INFORMATION+ BCS 400$ ;IF CS ILLEGAL NUMBER OF BUFFERSO8 BIT #S$WNOV,S.WFLG(R4) ;IS THIS INTERRUPT DRIVEN SWEEP?- BEQ 60$ ;IF EQ NO--SYNCHRONOUS CLOCK DRIVEN) CALL .DRCNI ;CONNECT DR11 TO INTERRUPTSC BCS 300$ ;IF CS ERROR$% CALL .DRSTR ;ENABLE DR11 INTERRUPTS  BR 80$ ;FINISH UPA;; SYNCRHONOUS CLOCK SWEEP START;L60$: ;REF LABEL .IF DF K$$W11/ CALL .DRSSC ;SELECT SYNCHRONOUS CLOCK ROUTINED& CALL .KLQIN ;INSERT INTO CLOCK QUEUE* CALL .KWCNI ;CONNECT CLOCK AND ENABLE IT BCS 300$ ;IF CS ERROR; .IFF ;K$$W11B5 MOV #-,R3 ;SET CLOCK OPTION NOT PRESENTT BR 500$ .ENDC ;K$$W11/80$: BIS #S$WACT,S.WFL2(R4) ;FLAG SWB IS ACTIVEC MOV (SP)+,R5 ;RESTORE ARG PTR RETURNF; ; ERROR RETURNSS; ; BAD PARAMETERS;T&200$: 00stDATADATADATADATADATADATADATAMOV #-,R3 ;SET CODE BR 500$;E; RESOURCE IN USE ;R&300$: MOV #-,R3 ;SET CODE BR 500$;Y; BAD BUFFER SPECIFICATION; 400$: MOV #-,R3 E2500$: MOV R5,SP ;RESTORE PRE-.K.PAA STACK POINTER600$:F, CALL .KLQRM ;REMOVE FROM QUEUE IF INSERTED# MOV #1,R4 ;STORE IN 1ST PARAMETERN MOV (SP)+,R5 ;RESTORE ARG PTR% CALLR .IESTO ;STORE CODE AND RETURN  .ENDC MOV (SP)+,R5 ;RESTORE ARG PTR RETURNF; ; ERROR RETURNSS; ; BAD PARAMETERS;T&200$: # .TITLE KDOSWP DIGITAL OUTPUT SWEEP .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 11-SEP-77;EA; THIS MODULE INITIATES A DIGITAL OUTPUT SWEEP THROUGH THE DR11-KT;S; SYSTEM MACRO CALLS; .MCALL KSWDF$ KSWDF$O A( .SBTTL DOSWP DIGITAL OUTPUT SWEEP START;+/; DOSWP -- START DIGITAL OUTPUT SWEEP ON DR11-KC;G; CALLING SEQUENCE:A;S;; CALL DOSWP (IBUF,LBUF,NBUF,MODE,IPRSET,IEFN,LDELAY,IUNIT)N;O ; INPUTS:;; SEE DOCUMENTATIONO;B ; OUTPUTS:;S(; SWEEP IS STARTED UNLESS ERROR DETECTED;M;-"DOSWP:: MOV R5,-(SP) ;SAVE ARG PTR& CALL .K.PAA ;VALIDATE ARGS AND STACK .WORD 8. ;EIGHT ARGS# .WORD 300 ;MASK FOR REQUIRED ARGSD BCC 10$ ;IF CC OKM0 MOV #-,R3 ;ELSE SET BAD PARAMETERS CLR R4 ;IN CASE MULT SWEEPSE$ BR 600$ ;STORE ERROR CODE AND EXIT410$: MOV 16(SP),R0 ;REACH DOWN AND GET IUNIT ADDRESS BNE 20$ ;IF NOT DEFAULTED GO MOV #.ZEROW,R0 ;ELSE USE UNIT 0"20$: MOV (R0),R0 ;GET UNIT NUMBER ASL R0 ;CONVERT TO INDEX3 MOV .DRUTB(R0),R4 ;GET SWEEP CONTROL BLOCK ADDRESSW! CMP R4,#DRSW0 ;ENSURE A REAL SWBL BLO 200$ ;IF LO ERRORA CMP R4,#.DRUTB ;CHECK HIGH END BHIS 200$ ;IF HIS ERRORR. CALL .K.SET ;SET UP SWEEP BLOCK AND VALIDATE BCS 200$ ;IF CS ERROR DETECTED$ CALL .K.DLY ;CHECK DELAY PARAMETER BCS 300$ ;IF CS ERROR " TST (SP)+ ;POP OFF IUNIT ADDRESS1 BIC #S$WIOF,S.WFL2(R4) ;FLAG THAT THIS IS OUTPUT ( CALL .K.STB ;SET UP BUFFER INFORMATION+ BCS 400$ ;IF CS ILLEGAL NUMBER OF BUFFERSV8 BIT #S$WNOV,S.WFLG(R4) ;IS THIS INTERRUPT DRIVEN SWEEP?- BEQ 60$ ;IF EQ NO--SYNCHRONOUS CLOCK DRIVENB) CALL .DRCNI ;CONNECT DR11 TO INTERRUPTSE BCS 300$ ;IF CS ERROR % CALL .DRSTR ;ENABLE DR11 INTERRUPTSW BR 80$ ;GO FINISH UP;S; SYNCRHONOUS CLOCK SWEEP STARTL;K60$: .IF DF K$$W11/ CALL .DRSSC ;SELECT SYNCHRONOUS CLOCK ROUTINEF& CALL .KLQIN ;INSERT INTO CLOCK QUEUE* CALL .KWCNI ;CONNECT CLOCK AND ENABLE IT BCS 300$ ;IF CS ERROR .IFF ;K$$W11 5 MOV #-,R3 ;SET CLOCK OPTION NOT PRESENTH BR 500$ ;RETURN STATUS .ENDC ;K$$W11080$: BIS #S$WACT,S.WFL2(R4) ;FLAG UNIT IS ACTIVE MOV (SP)+,R5 ;RESTORE ARG PTR RETURN ;O; ERROR RETURNS ;A; BAD PARAMETERS;200$: MOV #-,R3 BR 500$;L; RESOURCE IN USEK;0300$: MOV #-,R3 BR 500$;C; BAD BUFFER SPECIFICATION;C400$: MOV #-,R3K2500$: MOV R5,SP ;RESTORE PRE-.K.PAA STACK POINTER1600$: CALL .KLQRM ;REMOVE FROM QUEUE IF INSERTED# MOV #1,R4 ;STORE IN 1ST ARGT MOV (SP)+,R5 ;RESTORE ARG PTR CALLR .IESTO ;STORE AND RETURN .END$WACT,S.WFL2(R4) ;FLAG UNIT IS ACTIVE MOV (SP)+,R5 ;RESTORE ARG PTR RETURN ;O; ERROR RETURNS ;A; BAD PARAMETERS;00{mQ D%B11110010' .TITLE KDRDRV DRIVER ROUTINES FOR DR11- .IDENT /V04.00/;+<; COPYRIGHT (c) 1977, 1982 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;(<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.N;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION V04.00; B. SCHREIBER 4-SEP-77E;E; MODIFIED BY:;U; B. SCHREIBER 15-MAY-78<; BLS048 -- CLEAR BITS IN DR11 INPUT REGISTER ON SYNCH. I/O.;H; M. S. HARVEY 12-MAY-799; MSH032 -- IGNORE INTERRUPTS FOLLOWING END OF DATA SWEEPT; ; M. S. HARVEY 12-MAY-79*; MSH033 -- CORRECT STACK MANIPULATION BUG;U; M. S. HARVEY 13-MAY-79B; MSH035 -- IMPLEMENT INPUT SERVICE FOR INTERRUPTS BY CONTROL LINE; ; H. BERNSTEIN 16-SEP-81:; HB015 -- CORRECT ACCESS TO READ ONLY REGISTER FOR Q-BUS;;EB; THIS MODULE CONTAINS THE DR11 INTERRUPT AND CONNECT TO INTERRUPT ; ROUTINES.-;8; SYSTEM MACRO CALLS;I .MCALL KSWDF$, KDVDF$, CINT$S KSWDF$  KDVDF$V 1/ .SBTTL .DRCNI CONNECT DR11 TO INTERRUPT VECTOR ;+,; .DRCNI -- CONNECT DR11 TO INTERRUPT VECTOR;0 ; INPUTS:C;T; R4 SWB ADDRESS; ; OUTPUTS:;V; C-SET COULD NOT CONNECTM; C-CLEAR SUCCESSC;O;-..DRCNI::CALL .DRSLI ;SELECT INTERRUPT ROUTINE1 BIT #UF$CIN,S.WUBX+U.FLG(R4) ;ALREADY CONNECTED?I! BNE 20$ ;IF NE YES--DON'T RETRYL MOV R4,R3 ;COPY SWB ADDRESSN' SUB #4,R3 ;POINT TO INTERRUPT ROUTINE8/ MOV S.WUBX+U.IVEC(R4),R2 ;ASSUME INPUT CONNECT$ BIT #S$WIOF,S.WFL2(R4) ;IS IT? BNE 10$ ;IF NE YES& MOV S.WUBX+U.OVEC(R4),R2 ;NO--GET OVA410$: CINT$S R2,#$KBASE,R3,#.DREDI,S.WPRI(R4),#.DRAST ;CONNECT TO INTERRUPT VECTOR BCS 40$120$: BIS #UF$CIN,S.WUBX+U.FLG(R4) ;FLAG CONNECTEDO CLC 40$: RETURNL R/ .SBTTL .DREDI DR11 ENABLE/DISABLE CINT ROUTINEB;+A; .DREDI -- ENABLE/DISABLE ROUTINE FOR DR11 CONNECT TO INTERRUPTSR;3<; THIS ROUTINE IS CALLED BY THE EXECUTIVE WHEN CONNECTING OR'; DISCONNECTING FROM INTERRUPT VECTORS. ;N ; INPUTS:#;I&; R1 POINT TO INTERRUPT TRANSFER BLOCK;S ; OUTPUTS:;.1; INTERRUPTS FOR THE SPECIFIED DR11 ARE DISABLED.,9; ALL INPUT BITS ARE CLEARED IF THIS IS AN INPUT CONNECT.R;B;- .PSECT .KSCT19.DREDI::MOV X.VEC(R1),R0 ;GET VECTOR ADDRESS OF THIS DR115 MOV .DRXPT,R2 ;GET POINTER TO DR11 SWB POINTER TABLE+,20$: MOV (R2)+,R3 ;GET NEXT DR11 SWB ADDRESS BEQ 60$ ;IF EQ I AM CONFUSED7 CMP S.WUBX+U.IVEC(R3),R0 ;IS THE INPUT VECTOR CORRECT? BEQ 40$ ;IF EQ YES8 CMP S.WUBX+U.OVEC(R3),R0 ;NO--IS OUTPUT VECTOR CORRECT?& BNE 20$ ;IF NE NO--LOOK AT NEXT DR11,40$: MOV S.WCSR(R3),R2 ;GET DR11 CSR ADDRESS4 CMP S.WUBX+U.IVEC(R3),R0 ;IS THIS AN INPUT CONNECT? BNE 50$ ;IF NE NO0 BIC #DI$ENB,(R2) ;YES--DISABLE INPUT INTERRUPTS .IF NDF Q$$BUSH2 MOV #177777,DI$BUF(R2) ;YES--CLEAR ALL INPUT BITS .ENDC ;Q$$BUS BR 60$ ;ALL DONE050$: BIC #DO$ENB,(R2) ;DISABLE OUTPUT INTERRUPTS:60$: MOV @#$TKTCB,.KTKCB ;AND GET MY TCB ADDRESS FOR LATER RETURNI Q/ .SBTTL .DRSSC SELECT SYNCHRONOUS CLOCK ROUTINEC;+,; .DRSSC -- SELECT SYNCHRONOUS CLOCK ROUTINE;0<; THIS ROUTINE SELECTS EITHER .DRISR OR .DROSR FOR THE CLOCK; INTERRUPT ROUTINE TO CALL.;? ; INPUTS: ; ; R4 POINTS TO A COMPLETE SWB-;A ; OUTPUTS:;R>; S.WSCR IS FILLED IN THE SWEEP CONTROL BLOCK POINTED TO BY R48; S.WSTR IS FILLED IN WITH .DRSTR (USER VIRTUA00tDATADATADATADATADATADATADATAL ADDRESS);B;- .IF DF K$$W11@.DRSSC::MOV #.DRSTR,S.WSTR(R4) ;SET SCHMITT TRIGGER ROUTINE ADDR' MOV #.DROSR,-(SP) ;ASSUME OUTPUT SWEEPC1 BIT #S$WIOF,S.WFL2(R4) ;IS THIS AN OUTPUT SWEEP?- BEQ 20$ ;IF EQ YES* MOV #.DRISR,(SP) ;NO--SET FOR INPUT SWEEP .IF DF K$W11K; BIT #S$WTSS,S.WFLG(R4) ;IS IT TIME-STAMPED INPUT SAMPLING? BEQ 20$ ;IF EQ NO--ALL SET" MOV #.DRIST,(SP) ;YES--SET FOR IT .ENDC ;K$W11K20$: ;REF LABEL .IF DF M$$MGE6 ADD $KRLC5,(SP) ;RELOCATE TO APR5 FOR CLOCK INTERRUPT .ENDC ;M$$MGE! MOV (SP)+,S.WSCR(R4);SET THE SWB; RETURN ;BACK TO CALLER  .ENDC ;K$$W11 S, .SBTTL .DRSLI SELECT DR11 INTERRUPT ROUTINE;+); .DRSLI -- SELECT DR11 INTERRUPT ROUTINEY; ; INPUTS:R;P; R4 POINTS TO SWB ; SWB SET UP; ; OUTPUTS:;#8; PROPER INTERRUPT ROUTINE ADDRESS LOADED INTO INTERRUPT!; TRANSFER VECTOR IN FRONT OF SWBD;T;-..DRSLI::MOV #.DRIN0,-(SP) ;ASSUME SIMPLE INPUT% BIT #S$WIOF,S.WFL2(R4) ;IS IT INPUT?C BNE 20$ ;IF NE YES% MOV #.DRIN2,(SP) ;NO--SET FOR OUTPUTE BR 40$ ;SKIP20$: ;REF LABEL .IF DF K$W11K/ BIT #S$WTSS,S.WFLG(R4) ;TIME STAMPED SAMPLING?S BEQ 40$ ;IF EQ NOR" MOV #.DRIN1,(SP) ;YES--SET FOR IT .ENDC ;K$W11K40$: ;REF LABEL .IF DF M$$MGE" ADD $KRLC5,(SP) ;RELOCATE TO APR5 .ENDC ;M$$MGE0 MOV (SP)+,-2(R4) ;STORE ADDRESS IN FRONT OF SWB+ ; (THIS IS 2ND WORD OF JSR INSTRUCTION)  RETURN ;BACK TO CALLERE P% .SBTTL DRINT DR11 INTERRUPT ROUTINEST;++; .DRIN0 -- DIGITAL INPUT INTERRUPT ROUTINET;R8; THIS ROUTINE IS ENTERED WITH A JSR R4, .DRIN0 FROM THE;; DATA BASE. THIS WILL LEAVE R4 POINTING TO THE PROPER SWB.Q;$ ; INPUTS:R;M; R4 POINT TO SWBS;E ; OUTPUTS:;N8; WORD READ INTO USER BUFFER. IF NECESSARY, FORK TO SET; EVENT FLAG OR QUEUE AN AST.;.;-1.DRIN0::MOV R3,(SP) ;;;SAVE R3--OVERWRITE OLD R4  .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .ENDC ;M$$MGE% MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESST6 BIT #S$CTRL,S.WFLG(R4) ;;;INTERRUPT BY CONTROL LINES? BEQ 5$ ;;;IF EQ NO2 BIS #DI$ENB,(R3) ;;;ENABLE INTS AND CLEAR IN FLAG MOV DI$BUF(R3),R3 ;;;GET DATUMI BR 7$%5$: MOV DI$BUF(R3),-(SP) ;;;READ DR114 .IF NDF Q$$BUS% MOV (SP),DI$BUF(R3) ;;;WRITE IT BACKF .ENDC ;Q$$BUS. BIS #DI$ENB,(R3) ;;;ENABLE FOR NEXT INTERRUPT MOV (SP)+,R3 ;;;GET DATUM(7$: CALL .KWRWD ;;;WRITE TO USER BUFFER BR .DRINX ;;;GO TO COMMON CODE .IF DF K$W11K;+3; .DRIN1 -- DR11 INPUT INTERRUPT WITH TIME STAMPINGT;SB; THIS ROUTINE IS ENTERED WITH A JSR R4,.DRIN1 FROM THE DATA BASE,!; LEAVING R4 POINTING TO THE SWB.E;I ; INPUTS:V;$; R4 POINTS TO SWB;I ; OUTPUTS:;O6; DATA WORD AND VALUE OF 16-BIT SOFTWARE CLOCK AT TIME=; OF SAMPLE ARE WRITTEN INTO THE USER BUFFER. FORK REQUESTEDS.; IF NECCESARY TO SET EVENT FLAG OR QUEUE AST.;P;--.DRIN1::MOV R3,(SP) ;;;SAVE R3--OVERWRITE R4  .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .ENDC ;M$$MGE% MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESSP5 BIT #S$CTRL,S.WFLG(R4) ;;;INTERRUPT BY CONTROL LINE?1 BEQ 5$ ;;;IF EQ NO2 BIS #DI$ENB,(R3) ;;;ENABLE INTS AND CLEAR IN FLAG MOV DI$BUF(R3),R3 ;;;GET DATUMP BR 7$*5$: MOV DI$BUF(R3),-(SP) ;;;READ DATA WORD .IF NDF Q$$BUSS% MOV (SP),DI$BUF(R3) ;;;WRITE IT BACKF .ENDC ;Q$$BUS. BIS #DI$ENB,(R3) ;;;ENABLE FOR NEXT INTERRUPT MOV (SP)+,R3 ;;;GET DATA WORD(7$: CALL .KWRWD ;;;WRITE TO USER BUFFER" MOV .CLK16,R3 ;;;GET 16 BIT CLOCK CALL .KWRWD ;;;WRITE TO BUFFER BR .DRINX ;;;GO TO COMMON CODE .ENDC ;K$W11K R, .SBTTL .DRIN2 DR11 OUTPUT INTERRUPT ROUTINE;+); .DRIN2 -- DR11 OUTPUT INTERRUPT ROUTINEG;MA; THIS ROUTINE IS CALLED WITH A JSR R4,.DRIN2 FROM THE DATA BASE.;-; THIS LEAVES R4 POINTING TO THE CORRECT SWB.,;B ; INPUTS:R; ; R4 POINTS TO SWB$;S ; OUTPUTS:;B9; WORD IS READ FROM USER BUFFER AND OUTPUT TO DR11. FORKT9; REQUESTED IF END OF BUFFER OR END OF SWEEP TO SET EVENT1; FLAG OR QUEUE AST.;;-1.DRIN2::MOV R3,(SP) ;;;SAVE R3--OVERWRITE OLD R4M .IF DF M$$MGE MOV @00mQ D%B11110010#KISAR6,-(SP) ;;;SAVE APR6 .IFTF ;M$$MGE+ CALL .KRDWD ;;;READ WORD FROM USER BUFFERO MOV R3,-(SP) ;;;SAVE DATUM % MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESST% BIS #DO$ENB,(R3) ;;;ENABLE INTERRUPTT$ MOV (SP)+,DO$BUF(R3) ;;;OUTPUT DATA;+5; .DRINX -- FINISH UP DR11 INTERRUPT ROUTINE AND EXIT ;R); ENTER HERE TO FINISH UP DR11 INTERRUPT.S; ; INPUTS:U;R.; KISAR6 ON TOP OF STACK (MAPPED SYSTEMS ONLY); R3 NEXT ON STACK; C-SET IF FORK NECESSARY-;E ; OUTPUTS:;3; KISAR6, R3 RESTORED. FORK REQUESTED IF C-BIT SET8; IF STOPPING SWEEP, DR11 IS DISABLED FROM INTERRUPTING.;E;-.DRINX: ;;;REF LABEL .IFT ;M$$MGE,# MOV (SP)+,@#KISAR6 ;;;RESTORE APR63 .IFTF ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3O! BCC 80$ ;;;IF CC NO FORK NEEDEDH* BIT #S$WSTP,S.WFL2(R4) ;;;STOPPING SWEEP? BEQ 60$ ;;;IF EQ NO ( CALL .DSBDR ;;;YES--DISABLE INTERRUPTS960$: CALLR .KEFQI ;;;FORK, SET EFN OR QUEUE AST AND EXITA 80$: RETURNF;+(; .DSBDR -- DISABLE DR11 FROM INTERRUPTS;R0; THIS ROUTINE DISABLES A DR11 FROM INTERRUPTING; ; INPUTS: ;D; R4 POINTS TO SWBT;. ; OUTPUTS:;I<; INPUT OR OUTPUT INTERRUPTS (AS APPROPRIATE) ARE DISABLED.;R;-1.DSBDR: MOV #DI$ENB,-(SP) ;;;ASSUME INPUT DISABLEE/ BIT #S$WIOF,S.WFL2(R4) ;;;CHECK WITH THE FLAGS$" BNE 20$ ;;;IF NE YES--GO DISABLE2 MOV #DO$ENB,(SP) ;;;NO--DISABLE OUTPUT INTERRUPTS020$: BIC (SP)+,@S.WCSR(R4) ;;;DISABLE INTERRUPTS; MOV #.DRNOP,-2(R4) ;;;REDIRECT INTERRUPTS TO DUMMY ROUTINEL .IFT ;M$$MGER* ADD $KRLC5,-2(R4) ;;;RELOCATE THRU KISAR5 .IFTF ;M$$MGE RETURN;+*; .DRNOP -- DUMMY DR11-K INTERRUPT ROUTINE;T; THIS ROUTINE EATS INTERRUPTS;T ; INPUTS:B;.; R4 POINTS TO SWB; (SP) CONTAINS OLD R4; ; OUTPUTS:;!; EFFECT A NOOP INTERRUPT SERVICET;H;-!.DRNOP::TST (SP)+ ;;;CLEAN STACKB RETURN ;;;LOSE INTERRUPT HERE O2 .SBTTL .DRIN3 SCHMITT TRIGGER SIMULATOR INTERRUPT;+6; .DRIN3 -- SIMULATE SCHMITT TRIGGER INTERRUPT ROUTINE;M<; THIS ROUTINE IS ENTERED WITH A JSR R4,.DRIN3 FROM THE DATA'; BASE, LEAVING R4 POINTING TO THE SWB.; ; INPUTS:P; ; R4 POINTS TO SWB;R ; OUTPUTS:;H9; ALL SWEEPS REQUESTING EXTERNAL EVENT START ARE STARTED. 4; IF CLOCK IS IN THE SYSTEM, IT IS ENABLED TO COUNT.;E;--.DRIN3::MOV R3,(SP) ;;;SAVE R3, OVERWRITE R4S .IFT ;M$$MGEC MOV @#KISAR6,-(SP) ;;;SAVE APR6 .ENDC ;M$$MGE& MOV S.WCSR(R4),R3 ;;;SET UP R3 TO CSR+ MOV DI$BUF(R3),-(SP) ;;;READ DIGITAL INPUTR .IF NDF Q$$BUS % MOV (SP),DI$BUF(R3) ;;;WRITE IT BACKI .ENDC ;Q$$BUS2 BIT (SP)+,S.WMSK(R4);;;ANY LIT BITS SATISFY DIGO?! BNE 10$ ;;;IF NE YES--GO HANDLEU2 BIS #DI$ENB,(R3) ;;;NO--ENABLE FOR NEXT INTERRUPT BR 100$ ;;;GO EXIT210$: BIC #S$WSST,S.WFL2(R4) ;;;YES--CLEAR SST FLAG .IF DF FT$MOP .IF DF M$$MGE< MOV #<.KLQUX-S.WCLX>+120000-<$KBASE & 177700>,R4 ;;;PT TO Q .IFF ;M$$MGEN' MOV #<.KLQUX-S.WCLX>,R4 ;;;PT TO QUEUER .ENDC ;M$$MGE .IF DF K$$W11( MTPS #PR6 ;;;LOCK OUT CLOCK INTERRUPTS .ENDC ;K$$W11/15$: MOV S.WCLX(R4),R4 ;;;LINK TO NEXT IN QUEUES BEQ 80$ ;;;IF EQ ALL DONES/ BIT #S$WEXT,S.WFLG(R4) ;;;WANT EXTERNAL START?S# BEQ 15$ ;;;IF EQ NO--LOOK AT NEXTI* BIC #S$WEXT,S.WFLG(R4) ;;;YES--CLEAR FLAG .IFF ;FT$MOP;! MOV .KASWX,R4 ;;;GET SWB ADDRESSP- BEQ 100$ ;;;I DON'T KNOW WHAT TO DO IF 0!!!00 BIT #S$WEXT,S.WFLG(R4) ;;;DOING EXTERNAL START? BEQ 100$ ;;;IF EQ NO-60$: BIC #S$WEXT,S.WFLG(R4) ;;;YES--CLEAR FLGF .ENDC ;FT$MOP .IF DF M$$MGE3 MOV S.WSTR(R4),-(SP) ;;;PREPARE TO CALL ST ROUTINE4, ADD $KRLC5,(SP) ;;;RELOCATE ADDRESS TO APR5 CALL @(SP)+ ;;;CALL ST ROUTINE .IFF ;M$$MGEE: CALL @S.WSTR(R4) ;;;CALL SCHMITT TRIGGER ROUTINE TO START ;;; SWEEP .ENDC ;M$$MGE .IF DF FT$MOP! BR 15$ ;;;EXAMINE REST OF QUEUE .ENDC ;FT$MOP80$: ;;;REF LABEL .IF DF K$$W11) MOV .KACSR,R3 ;;;GET CLOCK A CSR ADDRESS0; BIC #KA$STF!KA$STI!KA$STE,(R3) ;;CLEAR SCHMITT TRIG ENABLEF# INC (R3) ;;;ENABLE CLOCK TO COUNTE .IF DF FT$MOP2 MTPS S.WPRI(R4) ;;;LOWER PRIO00DATADATADATADATADATADATADATARITY TO DEVICE AGAIN .ENDC ;FT$MOP .ENDC ;K$$W11100$: ;;;REF LABELI .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6  .ENDC ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3C RETURN ;;;F > .SBTTL .DRISR/.DROSR/.DRSTR SYNCHRONOUS CLOCK DRIVEN ROUTINES .IF DF K$$W11;+(; .DRISR -- SYNCH. DIGITAL INPUT ROUTINE;CC; THIS ROUTINE IS CALLED AT CLOCK INTERRUPT LEVEL TO INPUT ONE WORDG; FROM THE DR11.;; ; INPUTS:O;T; R4 POINTS TO SWB ; R3 FREEM; ; OUTPUTS:;O<; DATA WORD IS INPUT FROM DR11 AND WRITTEN INTO USER BUFFER.); C-SET NEED FORK TO SET EFN OR QUEUE ASTM; C-CLEAR ALL IS WELLR;;;-,.DRISR::MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESS* MOV DI$BUF(R3),-(SP);READ VALUE FROM DR11 .IF NDF Q$$BUSS0 MOV (SP),DI$BUF(R3) ;;;WRITE BACK TO CLEAR BITS .ENDC ;Q$$BUS MOV (SP)+,R3 ;RETRIEVE VALUE, CALLR .KWRWD ;;;WRITE TO BUFFER AND RETURN .IF DF K$W11K;+0; .DRIST -- DR11 SYNCH. INPUT WITH TIME STAMPING;B>; THIS ROUTINE IS CALLED AT CLOCK INTERRUPT LEVEL TO INPUT ONEB; DATA WORD FROM THE DR11 AND STORE IT AND THE VALUE OF THE 16-BIT$; SOFTWARE CLOCK IN THE USER BUFFER.; ; INPUTS: ;C; R4 POINT TO SWBR ; R3 FREEM;D ; OUTPUTS:;;9; BOTH DATA WORDS (DR11 INPUT AND 16-BIT CLOCK VALUE) AREF; WRITTEN INTO USER BUFFER.I); C-SET NEED FORK TO SET EFN OR QUEUE ASTI; C-CLEAR ALL OK;W;-,.DRIST::MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESS* MOV DI$BUF(R3),-(SP);READ VALUE FROM DR11 .IF NDF Q$$BUS0 MOV (SP),DI$BUF(R3) ;;;WRITE BACK TO CLEAR BITS .ENDC ;Q$$BUS MOV (SP)+,R3 ;RETRIEVE VALUEA* CALL .KWRWD ;;;WRITE WORD TO USER BUFFER( MOV .CLK16,R3 ;;;GET 16-BIT CLOCK VALUE1 CALLR .KWRWD ;;;WRITE TO USER BUFFER AND RETURN .ENDC ;K$W11K;+); .DROSR -- SYNCH. DIGITAL OUTPUT ROUTINEE;N?; THIS ROUTINE IS CALLED AT CLOCK INTERRUPT LEVEL TO OUTPUT ONE-; WORD TO THE DR11.;D ; INPUTS:.;R; R4 POINTS TO SWB ; R3 FREEV;$ ; OUTPUTS:;E.; NEXT DATA WORD FROM BUFFER IS OUTPUT TO DR11+; C-SET FORK NEEDED TO SET EFN OR QUEUE AST; C-CLEAR ALL OK;V;-&.DROSR::CALL .KRDWD ;;;READ DATA WORD MOV R3,-(SP) ;;;SAVE DATA WORDL% MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESSR6 MOV (SP)+,DO$BUF(R3) ;;;WRITE DATA TO OUTPUT REGISTER- RETURN ;;;RETURN WITH C INTACT FROM .KRDWD  .ENDC ;K$$W11;+2; .DRSTR -- HANDLE SCHMITT TRIGGER START INTERRUPT;A; THIS ROUTINE IS CALLED BY THE SCHMITT TRIGGER INTERRUPT ROUTINEFD; TO START A DIGITAL I/O SWEEP AFTER THE ST FIRING AND/OR DELAY FROM; START EVENT.;-?.DRSTR::BIT #S$WNOV,S.WFLG(R4) ;;;NON-OVERFLOW DRIVEN SAMPLING?A$ BEQ 40$ ;;;IF EQ NO--NOTHING TO DO2 CALL .DRSLI ;;;SELECT INTERRUPT ROUTINE -- COULD* ;;; HAVE BEEN DIGO STARTING THIS SWEEP/ MOV S.WCSR(R4),R3 ;;;YES--GET UNIT CSR ADDRESSH( MOV #DI$ENB,-(SP) ;;;ASSUME INPUT SWEEP+ BIT #S$WIOF,S.WFL2(R4) ;;;CHECK TO BE SURET BNE 20$ ;;;IF NE INPUT SWEEP* MOV #DO$ENB,(SP) ;;;NO--SET OUTPUT ENABLE,20$: BIS (SP)+,(R3) ;;;ENABLE FOR INTERRUPTS 40$: RETURNA .ENDAY FROM; START EVENT.;-?.DRSTR( .TITLE KDSCAD DISCONNECT A/D CONVERTERS .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 26-SEP-77;E=; THIS ROUTINE DISCONNECTS THE A/D CONVERTERS FROM INTERRUPTSE; ; SYST00 D%B11110010EM MACRO CALLS;T .MCALL KSWDF$,CINT$SO KSWDF$T E( .SBTTL .DSCAD DISCONNECT A/D CONVERTERS;+5; .DSCAD -- DISCONNECT A/D CONVERTERS FROM INTERRUPTSI;U8; THIS ROUTINE IS CALLED AT AST LEVEL WHEN IT IS TIME TO:; DISCONNECT THE A/D CONVERTERS FROM THE INTERRUPT SYSTEM.;O ; INPUTS:O;H; R4 POINTS TO SWB ; R3,R2 FREE;A ; OUTPUTS:; 5; ALL A/D CONVERTERS THAT ARE CONNECTED TO INTERRUPTSS; ARE DISCONNECTED.E; ;-&.DSCAD::MOV R4,R3 ;GET POINTER TO SWB# ADD #S.WUCB,R3 ;POINT TO FIRST UCBC' MOV S.WUNT(R4),R2 ;GET NUMBER OF UNITST920$: BIT #UF$CIN,U.FLG(R3) ;UNIT CONNECTED TO INTERRUPTS?C BEQ 40$ ;NO--LOOK AT NEXTR1 CINT$S U.VEC(R3),,#0 ;DISCONNECT FROM INTERRUPTS ) BIC #UF$CIN,U.FLG(R3) ;FLAG DISCONNECTEDT!40$: ADD #U.LGTH,R3 ;LOOK AT NEXTT DEC R2 ;SEE IF MORE TO DO BGT 20$ ;IF GT YES RETURN ;ALL DONEP .END; ALL A/D CONVERTERS THAT ARE CONNECTED TO INTERRUPTSS; ARE DISCONNECTED.E; ;-&.DSCAD::MOV R4,R3 ;GET POINTER TO SWB# ADD #S.WUCB,R3 ;POINT TO  .TITLE KDSDGO DISABLE DIGO .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 1-OCT-77 ;E>; THIS ROUTINE IS CALLED TO DISABLE DR11 INPUT INTERRUPTS FROMA; UNITS WHICH ARE SIMULATING START EVENTS WHEN A REAL ST1 OCCURS.A;A; SYSTEM MACRO CALLS; .MCALL KSWDF$,KDVDF$N KSWDF$  KDVDF$O .PSECT .KSCT1 C& .SBTTL .DSDGO DISABLE DIGO INTERRUPTS;+#; .DSDGO -- DISABLE DIGO INTERRUPTS ;I=; THIS ROUTINE IS CALLED BY THE KW11-K INTERRUPT ROUTINE WHEN <; A ST1 HAS OCCURRED. WE THEN LOOK AT ALL THE DR11'S TO SEE;; IF WE ARE SIMULATING A SCHMITT TRIGGER ON ANY, AND IF SO,7; DISABLE INPUT INTERRUPTS.L;T ; INPUTS:R;I; NONE;U ; OUTPUTS:;T8; DR11'S WHICH WERE SET TO SIMULATE SCHMITT TRIGGERS ARE ; DISABLED.Y;M;-.DSDGO::MOV R2,-(SP) ;;;SAVE R2N7 MOV .DRXPT,R3 ;;;GET POINTER TO DR11 SWB POINTER TABLEO.20$: MOV (R3)+,R2 ;;;GET NEXT DR11 SWB ADDRESS BEQ 40$ ;;;IF EQ ALL DONEH6 BIT #S$WSST,S.WFL2(R2) ;;;SIMULATING SCHMITT TRIGGER? BEQ 20$ ;;;IF EQ NOD* BIC #S$WSST,S.WFL2(R2) ;;;YES--CLEAR FLAG4 BIC #DI$ENB,@S.WCSR(R2) ;;;DISABLE INPUT INTERRUPTS BR 20$ ;;;LOOK AT MORE40$: MOV (SP)+,R2 ;;;RESTORE R2O RETURN  .END;T8; DR11'S WHICH W' .TITLE KDVDF K-SERIES HARDWARE DEFINES .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 27-JUN-77;E"; THIS MODULE DEFINES THE CSR BITS Y .MACRO KDVDF$ .IF NDF L$$SI1 00DATADATADATADATADATADATADATA;+/; KA$XXX - KW11-K CLOCK 'A' CSR BIT DEFINITIONSA;-(KA$STF = 100000 ;ST1 EVENT HAS OCCURRED,KA$STI = 40000 ;ST1 EVENT INTERRUPT ENABLE2KA$STE = 20000 ;ST1 EVENT ENABLES KA$ENA (ENABLE ; COUNTER)(KA$RIM = 0400 ;REPEATED INTERVAL MODE*KA$EEM = 1000 ;EXTERNAL EVENT TIME MODE/KA$EZB = 1400 ;EXTERNAL EVENT TIME FROM ZEROM ; BASE MODE3KA$MDF = 200 ;OVERFLOW OR COUNTER TO BUFFER XFR- ; HAS OCCURREDD,KA$MFE = 100 ;MODE FLAG INTERRUPT ENABLE3KA$OVF = 40 ;COUNTER 'A' OVERFLOW HAS OCCURRED *;KA$RAT = 16 ;MASK FOR CLOCK 'A' RATE"KA$ENB = 1 ;ENABLE CLOCK 'A';+.; KB$XXX - KW11-K CLOCK 'B' CSR BIT DEFINTIONS;-3KB$OVF = 200 ;COUNTER 'B' OVERFLOW HAS OCCURRED +KB$OIE = 100 ;OVERFLOW INTERRUPT ENABLE0$KB$B2A = 40 ;FEED B TO A ENABLE&;KB$ATO = 20 ;AUTO INCREMENT MODE*;KB$RAT = 16 ;MASK FOR CLOCK 'B' RATE"KB$ENB = 1 ;CLOCK 'B' ENABLE;+3; AD$XXX - AD11-K A/D CONVERTOR CSR BIT DEFINITIONSE;-AD$ERR = 100000 ;ERROR FLAGAD$DON = 200 ;DONE FLAG "AD$ENB = 100 ;INTERRUPT ENABLE7AD$OVE = 40 ;KW11-K OVERFLOW STARTS A/D CONVERSION 9AD$ESE = 20 ;EXTERNAL EVENT INITIATES A/D CONVERSIONE%AD$GO = 1 ;START A/D CONVERSION ;+4; DO$XXX - DR11-K DIGITAL OUTPUT CSR BIT DEFINITIONS4; DI$XXX - DR11-K DIGITAL INPUT CSR BIT DEFINITIONS;-7DO$FLG = 100000 ;EXTERNAL DATA ACCEPTED ON EXT. DEVICEL)DO$ENB = 40000 ;ENABLE OUTPUT INTERRUPT 2DO$BUF = 4 ;OFFSET FROM CSR TO OUTPUT BUFFER6DI$FLG = 200 ;EXTERNAL DATA READY FROM EXT. DEVICE(DI$ENB = 100 ;ENABLE INPUT INTERRUPT1DI$BUF = 2 ;OFFSET FROM CSR TO INPUT BUFFER   .IF NDF L$$PS1I;+3; DA$XXX - AA11-K D/A CONVERTOR CSR BIT DEFINITIONSS;-4DA$ERA = 10000 ;ERASE DATA IN STORAGE OSCILLOSCOPE!DA$WTU = 4000 ;WRITE THRU MODEUDA$STO = 2000 ;STORE-2DA$BT9 = 1000 ;BIT 9 (DIGITAL SIGNAL AVAILABLE)DA$RDY = 200 ;READY #;DA$ENB = 100 ;INTERRUPT ENABLE DA$EXD = 20 ;EXTERNAL DELAYDA$MDE = 14 ;MASK FOR MODEN'DA$FIE = 2 ;FAST INTENSIFY ENABLE 4DA$INT = 1 ;GENERATE INTENSIFY PULSE IN MODE 09DA$SCO=DA$ERA!DA$WTU!DA$STO$DA$BT9!DA$MDE!DA$FIE!DA$INT ; ( ;BITS LEGAL FOR USER TO SET IN SCOPE ;CONTROL WORDE .IFF ;L$$PS1S4DA$ERA = 10000 ;ERASE DATA IN STORAGE OSCILLOSCOPE(DA$WTU = 4000 ;SET WRITE THROUGH MODEDA$STO = 2000 ;STORET DA$CHN = 1000 ;CHANNEL SELECT DA$COL = 400 ;COLOR SELECTDA$RDY = 200 ;READY=#;DA$ENB = 100 ;INTERRUPT ENABLE DA$EXD = 20 ;EXTERNAL DELAYDA$MDE = 14 ;MODE(DA$FIE = 2 ;FAST INTENSIFY ENABLEDA$INT = 1 ;INTENSIFYR@DA$SCO = DA$ERA!DA$WTU!DA$STO!DA$CHN!DA$COL!DA$MDE!DA$FIE!DA$INT* ;BITS LEGAL FOR USER TO SET WITH SCOPE .ENDC ;L$$PS1 .IFF ;L$$SI1  .IF DF Q$$BUS;+!; KWV11 CLOCK CSR BIT DEFINITIONS ;-'KA$STF = 100000 ;ST2 EVENT HAS OCCUREDA,KA$STI = 40000 ;ST2 EVENT INTERRUPT ENABLE)KA$STE = 20000 ;ST2 EVENT ENABLES CLOCK=:KA$MDF = 200 ;OVERFLOW OR CTR TO BUFFR XFR HAS OCCURED'KA$OVF = 200 ;OVERFLOW HAS OCCURREDF.KA$IOO = 100 ;INTERRUPT ON OVERFLOW ENABLE"KA$MFE = 100 ;MODE FLAG ENABLE&;KA$RAT = 30 ;MASK FOR CLOCK RATE(KA$RIM = 2 ;REPEATED INTERVAL MODE*KA$EEM = 4 ;EXTERNAL EVENT TIME MODE9KA$EZB = 6 ;EXTERNAL EVENT TIME FROM ZERO BASE MODENKA$ENB = 1 ;ENABLE CLOCK;+1; AD$XXX - ADV11 A/D CONVERTOR CSR BIT DEFINTIONS ;-AD$ERR = 100000 ;ERROR FLAG(AD$IEN = 40000 ;ERROR INTERRUPT ENABLEAD$DON = 200 ;DONE FLAGR"AD$ENB = 100 ;INTERRUPT ENABLE6AD$OVE = 40 ;CLOCK OVERFLOW STARTS A/D CONVERSION6AD$ESE = 20 ;EXTERNAL EVENT STARTS A/D CONVERSION%AD$GO = 1 ;START A/D CONVERSION;;+3; DO$XXX - DRV11 DIGITAL OUTPUT CSR BIT DEFINITIONSM3; DI$XXX - DRV11 DIGITAL INPUT CSR BIT DEFINITIONSR;-(DO$FLG = 100000 ;EXTERNAL DATA ACCEPTED)DO$ENB = 40 ;OUTPUT INTERRUPT ENABLED2DO$BUF = 2 ;OFFSET TO OUTPUT BUFFER FROM CSR%DI$FLG = 200 ;EXTERNAL DATA 00 D%B11110010READYD(DI$ENB = 100 ;INPUT INTERRUPT ENABLE1DI$BUF = 4 ;OFFSET TO INPUT BUFFER FROM CSRW .ENDC ;Q$$BUS .ENDC ;L$$SI1 .MACRO KDVDF$ .ENDM .ENDM .ENDAD$GO = 1 ;START A/D CONVERSION;;+3; DO$XXX - DRV11 DIGITAL OUTPUT CSR BIT DEFINITIONSM3; DI$XXX - DRV11 DIGITAL INPUT CSR BIT DEFINITIONSR;-(DO$FLG = 100000 ;EXTERNAL DATA ACCEPTED)DO$ENB = 40 ;OUTPUT INTERRUPT ENABLED2DO$BUF = 2 ;OFFSET TO OUTPUT BUFFER FROM CSR%DI$FLG = 200 ;EXTERNAL DATA # .TITLE KEFQA SET EFN AND QUEUE AST .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 4-SEP-77 ;E;; THIS MODULE SETS EVENT FLAGS OR QUEUES AST'S FOR A SWEEP.G;T; SYSTEM MACRO CALLS;T .MCALL KSWDF$ KSWDF$  .PSECT .KSCT1 : .SBTTL .KEFQI INTERRUPT LEVEL SET EFN AND QUEUE AST ENTRY;+8; .KEFQI -- SET EFN AND QUEUE AST (FROM INTERRUPT LEVEL);E ; INPUTS:A; 0; STACK MUST BE AT LEVEL 0 (FOR RETURN TO INTSV); ; OUTPUTS:;O4; SYSTEM PROCESS IS CREATED, AND EFN IS SET OR EVENT-; FLAG IS QUEUED. A RETURN IS THEN EXECUTED.D;I; NOTE:E;O7; THIS ROUTINE IS ENTERED AT INTERRUPT LEVEL, AND EXITSE7; AT FORK LEVEL (UNLESS A FORK IS ALREADY IN PROGRESS).C;C5; THIS ROUTINE SHOULD BE ENTERED VIA A "CALLR .KEFQI";;- .ENABL LSBR;.KEFQI::BIT #S$WFRK,S.WFL2(R4) ;;;FORK ALREADY IN PROGRESS?F) BNE 40$ ;;;IF NE YES--DO NOT FORK AGAIN7 BIS #S$WFRK,S.WFL2(R4) ;;;NO--DECLARE FORK IN PROGRESS ' CALL @#$FORK2 ;;;CREATE SYSTEM PROCESSE# CLR (R3) ;DECLARE FORK BLOCK FREET3 BIC #S$WFRK,S.WFL2(R4) ;FORK NO LONGER IN PROGRESS5;***; BR .KEFQA ;SET EFN OR QUEUE AST AS APPROPRIATEV . .SBTTL .KEFQA SET EVENT FLAGS AND QUEUE AST'S;+'; .KEFQA -- SET EVENT FLAG OR QUEUE AST ;E ; INPUTS:A;A; R4 POINTS TO SWB; ; OUTPUTS:;/; AST QUEUED IF S$WEFN=0 OR IF STOPPING A SWEEP .; EFN SET IF S$WEFN=1 AND NOT STOPPING A SWEEP;I1; NOTE: THIS ROUTINE IS CALLED ONLY AT FORK LEVELP;R;-/.KEFQA::BIT #S$WSTP,S.WFL2(R4) ;STOPPING SWEEP?3% BNE 5$ ;IF NE YES--ALWAYS QUEUE ASTF, BIT #S$WEFN,S.WFL2(R4) ;SETTING EVENT FLAG? BNE 10$ ;IF NE YES--GO DO IT 5$: CALLR @#$QASTC ;QUEUE AN AST#10$: MOV R5,-(SP) ;SAVE ITB ADDRESSS" MOV .KTKCB,R5 ;GET MY TCB ADDRESS* MOV S.WEFA(R4),R1 ;GET EVENT FLAG ADDRESS& BNE 20$ ;IF NE $CEFI HAS BEEN CALLED' MOV S.WEFN(R4),R0 ;FIRST CALL--GET EFN + CALL @#$CEFI ;CONVERT TO ADDRESS AND MASK MOV R0,S.WEFM(R4) ;SET MASK MOV R1,S.WEFA(R4) ;AND ADDRESS 20$: MOV S.WEFM(R4),R0 ;GET MASK CALL @#$SETM ;SET EVENT FLAG" MOV (SP)+,R5 ;RESTORE ITB ADDRESS 40$: RETURN .DSABL LSBF ?@ .SBTTL .KWEFQ SET EFN OR QUEUE AST FOR MULT CLOCK DRIVEN SWEEPS;+>; .KWEFQ -- SET EFN OR QUEUE AST FOR MULT. CLOCK DRIVEN SWEEPS;S ; INPUTS:F;42; INTERRUPT LEVEL, STACK CLEAR FOR RETURN TO INTXT;S ; OUTPUTS:;M<; AT MOST ONE AST QUEUED, EFNS SET FOR ALL REQUESTING SWEEPS;O;- .IF DF K$$W11 & FT$MOPE/.KWEFQ::BIT #K$AFRK,.KAFLG ;;;FORK IN PROGRESS?& BNE 120$ ;;;IF NE YES--DO NOT REFORK0 BIS #K$AFRK,.KAFLG ;;;NO--FLAG FORK IN PROGRESS' CALL @#$FORK2 ;;;CREATE SYSTEM PROCESS# CLR (R3) ;DECLARE FORK BLOCK FREES0 BIC #K$AFRK,.KAFLG ;CLEAR FORK IN PROGRESS FLAG- CLR -(SP) ;SET "AST QUEUED" FLAG O00DATADATADATADATADATADATADATANTO STACKE .IF DF M$$MGE? MOV #<.KLQUX-S.WCLX>+120000-<$KBASE & 177700>,R4 ;PT TO Q HEADP .IFF ;M$$MGES* MOV #<.KLQUX-S.WCLX>,R4 ;PT TO QUEUE HEAD .ENDC ;M$$MGE(20$: MOV S.WCLX(R4),R4 ;MOVE TO NEXT SWB BEQ 100$ ;IF EQ END OF QUEUE= TST S.WFLG(R4) ;REQUEST FOR THIS SWEEP (S$WAST IS SIGN BIT)?;! BPL 20$ ;IF PL NO--MOVE TO NEXT#- BIT #S$WSTP,S.WFL2(R4) ;YES--STOPPING SWEEP?E& BNE 40$ ;IF NE YES--ALWAYS QUEUE AST/ BIT #S$WEFN,S.WFL2(R4) ;NO--USING EVENT FLAGS?T BNE 60$ ;IF NE YES--GO SET IT.40$: TST (SP) ;HAVE WE ALREADY QUEUED AN AST?) BNE 20$ ;IF NE YES--DON'T QUEUE ANOTHER $ INC (SP) ;NO--FLAG WE HAVE NOW THO CALL @#$QASTC ;QUEUE AST; BR 20$ ;CHECK REST OF QUEUE4.60$: BIC #S$WAST,S.WFLG(R4) ;CLEAR AST REQUEST MOV R5,-(SP) ;SAVE R5" MOV .KTKCB,R5 ;GET MY TCB ADDRESS* MOV S.WEFA(R4),R1 ;GET EVENT FLAG ADDRESS& BNE 80$ ;IF NE $CEFI HAS BEEN CALLED' MOV S.WEFN(R4),R0 ;FIRST CALL--GET EFNE/ CALL @#$CEFI ;CONVERT EFN TO MASK AND ADDRESSA! MOV R0,S.WEFM(R4) ;REMEMBER MASKI MOV R1,S.WEFA(R4) ;AND ADDRESSD 80$: MOV S.WEFM(R4),R0 ;GET MASK( CALL @#$SETM ;SET REQUESTED EVENT FLAG MOV (SP)+,R5 ;RESTORE R5L BR 20$ ;SCAN REST OF QUEUE100$: TST (SP)+ ;CLEAR STACKB120$: RETURN ;DONE .ENDC ;K$$W11 & FT$MOP, .ENDVE R5" MOV .KTKCB,R5 ;GET MY TCB ADDRESS* MOV S.WEFA(R4),R1 ;GET EVENT FLAG ADDRESS& BNE 80$ ;IF NE $CEFI HAS BEEN CALLED' MOV S.WEFN(R4),R0 ;FIRST CALL--GET EFNE/ CALL @#$CEFI ;CONVERT EFN TO MASK AND ADDRESSA! MOV R0,S.WEFM(R4) ;RE+ .TITLE KFLT16 FLOAT 2'S COMPLEMENT INTEGER .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 22-SEP-77;E4; THIS ROUTINE CONVERTS TWO'S COMPLEMENT INTEGERS TO; FLOATING POINT NUMBERS; 5; FROM THE RT11 ROUTINE FLT16 AND THE FORTRAN LIBRARYL; ROUTINE $IR.E N. .SBTTL FLT16 FLOAT AN UNSIGNED 16-BIT INTEGER;+); FLT16 -- FLOAT A 2'S COMPLEMENT INTEGERS;L; CALLING SEQUENCES:;O; VAL = FLT16 (IVAL); CALL FLT16 (IVAL, VAL)O; ; INPUTS: ;R ; IVAL 16 BIT INTEGER TO CONVERT;I ; OUTPUTS:;O"; VAL 32 BIT CONVERTED REAL NUMBER;E;-.FLT16:: MOV @2(R5),R0 ;PICKUP VALUE TO CONVERT6 CALL .FLT16 ;CALL INTERNAL ROUTINE TO CONVERT NUMBER) CMPB (R5),#2 ;WERE THERE TWO ARGUMENTS?E+ BNE 10$ ;IF NE NO--NO 'VAL' TO STORE INTO% MOV 4(R5),R2 ;YES--GET 'VAL' ADDRESSA CMP #-1,R2 ;WAS IT DEFAULTED?+$ BEQ 10$ ;IF EQ YES--SKIP THE STORE1 MOV R0,(R2)+ ;STORE MS PART OF RESULT INTO 'VAL'  MOV R1,(R2) ;STORE LS PART 10$: RETURNN;+; .FLT16 -- INTERNAL FLT16;O ; INPUTS:I; ; R0 16 BIT NUMBER TO CONVERTE;D ; OUTPUTS:;E; R0,R1 32-BIT CONVERTED NUMBERC; ;-8.FLT16::MOV R0,-(SP) ;PUSH ONTO STACK AND CHECK SIGN BIT. BPL 40$ ;IF PL CAN USE $IR (OR WHAT IS LEFT)" MOV R0,-(SP) ;PUSH ON STACK AGAIN! BIC #100000,(SP) ;CLEAR SIGN BITS CLRB (SP) ;CLEAR LS HALF SWAB (SP) ;MOVE MS HALF! ADD #44000,(SP) ;ADD IN EXPONENTE MOV (SP)+,R0 ;GET MS HALF SWAB (SP) ;WORK ON LS HALF CLRB (SP) ;CLEAR OUT REST:20$: MOV (SP)+,R1 ;GET LS HALF RETURN ;DONEN;S; HERE IF NOT LARGEU;R%40$: CLR -(SP) ;MAKE ROOM FOR RESULTR! MOV R0,R1 ;GET INTEGER ARGUMENT BEQ 120$ ;IF EQ ALL DONE, MOV #220,R2 ;GET MAX POSSIBLE EXPONENT + 1) CLRB 2(SP) 00 D%B11110010 ;CLEAR LOWEST ORDER FRACTIONP!80$: ROL R1 ;LOOK FOR NORMAL BIT0 BCS 100$ ;IF CS FOUND IT DEC R2 ;DECREASE EXPONENT  BR 80$ ;TRY AGAIN,100$: MOVB R1,3(SP) ;SAVE LOW ORDER FRACTION CLRB R1 ;A4 BISB R2,R1 ;COMBINE EXPONENT AND HI ORDER FRACTION( SWAB R1 ;(NOTE THAT SWAB CLEARS C-BIT)1 ROR R1 ;INSERT SIGN IN RESULT (ALWAYS POSITIVE): RORB 3(SP)M MOV R1,(SP) ;STORE RESULT,120$: MOV (SP)+,R0 ;GET RESULT MOV (SP)+,R1 ;... 140$: RETURN .ENDMAX POSSIBLE EXPONENT + 1) CLRB 2(SP) $ .TITLE KGHIST EVENT TIMING ROUTINES .IDENT /M01.01/; ; COPYRIGHT (C) 1977, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01.01 ; B. SCHREIBER 25-OCT-77;E; MODIFIED BY:;U; M. S. HARVEY 7-JUN-79T-; MSH037 -- CLEAR CLOCK A COUNTER ON ST1 FORE; POST-STIMULUS TIME MODET;E>; THIS MODULE CONTAINS ALL ROUTINES NECESSARY FOR EVENT TIMING;T; SYSTEM MACRO CALLS;O .MCALL KSWDF$, KDVDF$, CINT$S KSWDF$  KDVDF$U A) .SBTTL GTHIST EVENT TIMING START ROUTINEP;+$; GTHIST -- START EVENT TIMING SWEEP;O; CALLING SEQUENCE:I;O;; CALL GTHIST (IBUF, LBUF, NBUF, MODE, IPRSET, IEFN, KOUNT)I; ; OUTPUTS:;0; SWEEP IS STARTED;C;-"GTHIST::MOV R5,-(SP) ;SAVE ARG PTR0 CALL .K.PAA ;VALIDATE ARGS AND PUSH ONTO STACK .WORD 7 ;MAX OF 7 ARGS .WORD 140 ;IBUF, LBUF REQUIRED BCC 20$ ;IF CC CONTINUEE' MOV #-,R3 ;SET ERROR CODEO BR 600$ ;STORE ERROR AND EXIT$!20$: MOV #.TDSWB,R4 ;POINT TO SWB.- BEQ 200$ ;IF EQ DATA BASE WAS NOT GENNED IN' CALL .K.SET ;SET UP IBUF THROUGH IEFN BCS 200$ ;IF CS ERROR MOV R4,R3 ;POINT TO SWBN( ADD #S.WKNT,R3 ;POINT TO KOUNT ARGUMENT- MOV (SP)+,R0 ;GET KOUNT ADDRESS OFF OF STACKT+ MOV R0,(R3)+ ;SET VIRTUAL ADDRESS INTO SWBV BNE 40$ ;IF NE GO RELOCATE- CLR (R3)+ ;ELSE CLEAR BOTH WORDS OF ADDRESS, CLR (R3)+ ;... BR 60$ ;SKIP AHEAD#40$: CALL .KRLOC ;RELOCATE TO APR6R" MOV R1,(R3)+ ;SET APR6 RELOCATION MOV R2,(R3)+ ;SET APR6 BIAS)60$: CALL .K.STB ;SET UP BUFFER POINTERS ' BCS 400$ ;IF CS ILLEGAL SPECIFICATIONF& CALL .KLQIN ;INSERT INTO CLOCK QUEUE! CALL .TDCNI ;CONNECT AND ENABLE#) BCS 300$ ;IF CS CALL IT RESOURCE IN USEP- BIS #S$WACT,S.WFL2(R4) ;FLAG SWEEP IS ACTIVE,9 BIS #K$AGTD,.KAFLG ;FLAG TIME DATA GATHERING IN PROGRESSE MOV (SP)+,R5 ;RESTORE ARG PTR RETURNS; ; ERROR RETURNS3; ; BAD PARAMETERS;A200$: MOV #-,R3 T BR 500$;M; RESOURCE IN USER;E300$: MOV #-,R3 BR 500$;:; ILLEGAL BUFFER SPECIFICATION;R400$: MOV #-,R32500$: MOV R5,SP ;RESTORE PRE-.K.PAA STACK POINTER+600$: CALL .KLQRM ;REMOVE FROM CLOCK QUEUE3& MOV #1,R4 ;STORE INTO FIRST ARGUMENT MOV (SP)+,R5 ;RESTORE ARG PTR+ CALLR .IESTO ;STORE ERROR CODE AND RETURND * .SBTTL .TDCNI CONNECT CLOCK TO INTERRUPTS;+2; .TDCNI -- CONNECT TO INTERRUPTS FOR EVENT TIMING;E ; INPUTS:$;O!; .TDSWB SET UP (R4 POINTS TO IT)M; ; OUTPUTS:;R!; C-CLEAR CONNECT OK, CLOCK ARMED; C-SET COULD NOT CONNECTF;S;-..TDCNI: CALL .TDSLI ;SELECT INTERRUPT ROUTINE* MOV .KAVEC,R2 ;PICK UP THE VECTOR ADDRESS .IF DF Q$$BUS+ ADD #4,R2 ;CONNECT SCHMITT TRIGGER VECTORE .IFTF ;Q$$BUS CLR R3 ;FIRST DISCONNECT CALL 200$ ;ENSURE DISCONNECTED MOV #.TDINT,R3 ;NOW CONNECT .IF00ÁDATADATADATADATADATADATADATAT ;Q$$BUSO! CALL 200$ ;CONNECT CLOCK VECTORO) BCS 220$ ;IF CS DO NOT TRY OTHER VECTOR % SUB #4,R2 ;POINT TO OVERFLOW VECTORS CLR R3 ;FIRST DISCONNECT CALL 200$ ;... MOV #.TDOVF,R3 ;NOW CONNECT .ENDC ;Q$$BUS/200$: CINT$S R2,#$KBASE,R3,#.TDEDI,#PR6,#.KWASTU 220$: RETURN;+1; .TDSLI -- SELECT EVENT TIMING INTERRUPT ROUTINEA;#!; SETS UP .TDINT IN THE DATA BASEO;;-%.TDSLI: MOV #.TDIN1,R3 ;ASSUME MODE 1T .IF NDF Q$$BUSR TST S.WFLG(R4) ;IS IT?T BNE 20$ ;IF NE YES# MOV #.TDIN0,R3 ;NO--SET FOR MODE 0C20$: ;REF LABEL .ENDC ;Q$$BUS .IF DF M$$MGE ADD $KRLC5,R3 ;RELOCATE TO APR5 .ENDC ;M$$MGE+ MOV R3,-2(R4) ;POINT ISR TO PROPER ROUTINER RETURNN T6 .SBTTL .TDEDI ENABLE/DISABLE ROUTINE FOR EVENT TIMING;+"; .TDEDI -- ENABLE/DISABLE ROUTINE;->; THIS ROUTINE IS CALLED BY THE EXEC ON A CONNECT TO INTERRUPT; OR A DISCONNECT.;- ; INPUTS: ; ; NONE;; ; OUTPUTS:;; CLOCK IS ARMED IF CONNECTW!; CLOCK IS DISABLED IF DISCONNECTY;;- .PSECT .KSCT1,.TDEDI: MOV .KACSR,R0 ;GET CLOCK CSR ADDRESS BCS 60$ ;IF CS THEN DISCONNECT CLR (R0) ;STOP CLOCK2 MOV @#$TKTCB,.KTKCB ;GET MY TCB ADDRESS FOR LATER1 BIC #K$AOVF,.KAFLG ;CLEAR SOFTWARE OVERFLOW FLAG/ .IF DF M$$MGE6 MOV #.TDSWB+120000-<$KBASE & 177700>,R3 ;POINT TO SWB .IFF ;M$$MGEE MOV #.TDSWB,R3 ;POINT TO SWBC .ENDC ;M$$MGE .IF NDF Q$$BUS-) TST S.WFLG(R3) ;WHAT MODE ARE WE TIMING?- BNE 40$ ;IF NE THEN INTER STIMULUS INTERVALE;F*; SET FOR POST-STIMULUS TIME DATA (MODE 0);I; MOV #KA$EEM!KA$STI!KA$STE,R2 ;EXTERNAL EVENT MODE, SCHMITT + ; TRIGGER INTERRUPT ENABLE, AND SCHMITTK ; TRIGGER ENABLES COUNTERF BR 50$ ;START CLOCK AND RETURN .ENDC ;Q$$BUS;A,; INTER-STIMULUS INTERVAL TIME DATA (MODE 1);S40$: ;REF LABEL B MOV #KA$EZB!KA$MFE!KA$STI!KA$ENB,R2 ;SET EXT EVENT TIME FROM ZERO ;BASE, MODE FLAG ENABLE,$ ;ST INTERRUPT ENABLE, AND CLOCK ;COUNT ENABLEE&50$: BIS .KARAT,R2 ;INCLUDE CLOCK RATE MOV R2,(R0) ;ARM CLOCK RETURN ;; ; DISCONNECT;T60$: CLR (R0) ;STOP CLOCK RETURNM - .SBTTL .TDIN0 MODE 0 (PST) INTERRUPT ROUTINE;+*; .TDIN0 -- MODE 0 (PST) INTERRUPT ROUTINE; ; INPUTS:;.:; JSR R4 HERE FROM DATA BASE. R4 WILL THEN POINT TO .TDSWB;) ; OUTPUTS:A; IF ST1 FIRED, CLR CLOCK AND ENABLE OVERFLOWS AND ST2 INTERRUPTS 2; IF OVERFLOW, NOTE THAT AND ENABLE ST1 INTERRUPTSA; IF NEITHER OF ABOVE, STORE CLOCK BUFFER CONTENTS IN USER BUFFERA; OR -1 IF RECENT OVERFLOWM;R;- .ENABL LSB .IF NDF Q$$BUS 6.TDIN0::MOV R3,(SP) ;;;SAVE R3, OVERWRITE R4 ON STACK .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .IFTF ;M$$MGE' MOV .KACSR,R3 ;;;GET CLOCK CSR ADDRESS.' TST (R3) ;;;CHECK FOR SCHMITT TRIGGERH+ BMI 200$ ;;;IF MI SCHMITT TRIGGER 1 FIREDF( BIT #KA$OVF,(R3) ;;;DID CLOCK OVERFLOW?" BNE 300$ ;;;IF NE YES--GO HANDLE> BIC #KA$MDF,(R3) ;;;NO--SCHMITT TRIG 2 FIRED--CLEAR MODE FLAG MOV 2(R3),R3 ;;;READ CLOCKF3 BIT #K$AOVF,.KAFLG ;;;DID CLOCK OVERFLOW RECENTLY?  BEQ 20$ ;;;IF EQ NO % BIC #K$AOVF,.KAFLG ;;;YES--CLEAR FLGE6 MOV #177777,R3 ;;;STORE -1 TO INDICATE CLOCK OVERFLOW/20$: CALL .KWRWD ;;;WRITE VALUE TO USER BUFFER, .IFT ;M$$MGES# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6M .ENDC ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3 " BCC 120$ ;;;IF CC NO FORK NEEDED .IFTF ;Q$$BUS;+<; .TDFXT -- INTERRUPT EXIT FROM TIME DATA INTERRUPT ROUTINES; 2; THIS EXIT IS TAKEN WHEN IT IS NECCESARY TO FORK.; ; INPUTS:F;A; R4 POINTS TO SWB;O ; OUTPUTS:;B<; FORK REQUESTED, AST QUEUED OR EVENT FLAG SET. IF STOPPING; SWEEP, CLOCK IS DISABLED.O;D;-..TDFXT: BIT #S$WSTP,S.WFL2(R4) ;;;STOP NEEDED? BEQ 100$ ;;;IF EQ NO CLR @.KACSR ;;;YES--STOP CLOCK+ BIC #K$AGTD,.KAFLG ;;;NO LONGER DOING THISP100$: ;;;REF LABELB .IF NDF FT$MOPO5 CALLR .KEFQI ;;;FORK, SET EFN OR QUEUE AST AND EXITP .IFF ;FT$MOPD/ BIS #S$WAST,S.WFLG(R4) ;;;SET AST REQUEST FLAGE5 CALLR .KWEFQ ;;;FORK, SET EFN OR QUEUE AST AND EXITI .ENDC ;00ˁс D%B11110010FT$MOP 120$: RETURN .IFT ;Q$$BUSS;U; HERE IF SCHMITT TRIGGER FIREDG; ;200$: BIC #KA$STF!KA$ENB,(R3) ;;;CLEAR SCHMITT TRIGGER FLAGF ;;; AND STOP CLOCK" CLR 2(R3) ;;; CLEAR CLOCK BUFFER6 BIS #KA$MFE!KA$ENB,(R3) ;;;ENABLE OVERFLOW INTERRUPTS& ;;; AND START CLOCK W/COUNTER=0. MOV S.WKNT+4(R4),R3 ;;;GET KOUNT ADDRESS BIAS' BEQ 400$ ;;;IF EQ SKIP THE WHOLE DEALD .IF DF M$$MGE/ MOV S.WKNT+2(R4),@#KISAR6 ;;;MAP TO KOUNT WORD; .IFTF ;M$$MGE INC (R3) ;;;INKREMENT KOUNTT( BR 400$ ;;;RESTORE REGISERS AND RETURN;; CLOCK OVERFLOW;G300$: CLR (R3) ;;;STOP CLOCKT1 BIS #K$AOVF,.KAFLG ;;;FLAG THAT CLOCK OVERFLOWED;< MOV #KA$EEM!KA$STI!KA$STE,-(SP) ;;;SET EXT EVENT TIME MODE,& ;;; SCHMITT TRIG INTERRUPT ENABLE,' ;;; AND SCHMITT TRIG ENABLE COUNTERT* BIS .KARAT,(SP) ;;;INCLUDE THE CLOCK RATE$ MOV (SP)+,(R3) ;;;JAM THE CLOCK CSR400$: ;;;REF LABEL .IFT ;M$$MGEW# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6; .ENDC ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3N RETURN0 .ENDC ;Q$$BUS .DSABL LSBN < .SBTTL .TDIN1 INTER-STIMULUS INTERVAL (MODE 1) EVENT TIMING;+%; .TDIN1 -- ISI (MODE 1) EVENT TIMING;V ; INPUTS:$6; JSR R4 HERE FROM DATA BASE. R4 THEN POINTS TO .TDSWB;T ; OUTPUTS:+; IF OVERFLOW, SET SOFTWARE FLAG AND RETURN K; ELSE STORE CLOCK BUFFER CONTENTS OR -1 IF RECENT OVEFLOW INTO USER BUFFERT;C;- .ENABL LSB;6.TDIN1: MOV R3,(SP) ;;;SAVE R3, OVERWRITE R4 ON STACK' MOV .KACSR,R3 ;;;GET CLOCK CSR ADDRESSP .IF NDF Q$$BUSN$ BIT #KA$OVF,(R3) ;;;CLOCK OVERFLOW? BNE 100$ ;;;IF NE YESI. BIC #KA$MDF,(R3) ;;;NO--CLEAR MODE (ST2) FLAG .IFF ;Q$$BUSS# BIC #KA$STF,(R3) ;;;CLEAR ST2 FLAG$ .ENDC ;Q$$BUS .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .IFTF ;M$$MGE# MOV 2(R3),R3 ;;;READ CLOCK COUNTERO0 BIT #K$AOVF,.KAFLG ;;;DID WE RECENTLY OVERFLOW? BEQ 40$ ;;;IF EQ NO-& BIC #K$AOVF,.KAFLG ;;;YES--CLEAR FLAG, MOV S.WKNT+4(R4),R3 ;;;GET ADDRESS OF KOUNT BEQ 30$ ;;;IF EQ SKIP IT .IFT ;M$$MGE$* MOV S.WKNT+2(R4),@#KISAR6 ;;;MAP TO KOUNT .IFTF ;M$$MGE INC (R3) ;;;INKREMENT KOUNTC%30$: MOV #177777,R3 ;;;AND STORE A -1/40$: CALL .KWRWD ;;;WRITE VALUE TO USER BUFFER; .IFT ;M$$MGE # MOV (SP)+,@#KISAR6 ;;;RESTORE APR6P .ENDC ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3C# BCS .TDFXT ;;;IF CS GO FORK, ETC.D RETURN ;;;INTERRUPT EXIT4 .IF DF Q$$BUS;+0; .TDOVF -- OVERFLOW INTERRUPT ROUTINE FOR KWV11;3 ; INPUTS:R; !; CALLED HERE FROM INTERRUPT SAVET; ; OUTPUTS:;%; SOFTWARE CLOCK OVERFLOW FLAG IS SETK;T;-.TDOVF::MOV R3,-(SP) ;;;SAVE R3R' MOV .KACSR,R3 ;;;GET CLOCK CSR ADDRESSS .IFTF ;Q$$BUS;K; HERE IF CLOCK OVERFLOW;B6100$: BIS #K$AOVF,.KAFLG ;;;FLAG WE HAD CLOCK OVERFLOW .IFF ;Q$$BUSC7 BIC #KA$OVF!KA$MDF,(R3) ;;;CLEAR OVERFLOW , MODE FLAGSF .IFT ;Q$$BUSD. BIC #KA$OVF,(R3) ;;;CLEAR CLOCK OVERFLOW FLAG .ENDC ;Q$$BUS MOV (SP)+,R3 ;;;RESTORE R3K RETURN ;;;EXIT INTERRUPTA .DSABL LSBI .ENDSAVET; ; OUTPUTS:;%2 .TITLE KIESTO STORE ERROR CODE FROM ABORTED SWEEP .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 6-JUL-77 ;E?; THIS ROUTINE STORES THE ERROR CODE FROM AN ABORTED SWEEP INTOS00ӁՁDATADATADATADATADATADATADATA; THE USER'S I/O STATUS BLOCK. ;+2; .IESTO -- STORE ERROR CODE INTO I/O STATUS BLOCK;NB; THIS ROUTINE IS USED TO STORE THE ERROR CODE INTO THE I/O STATUSE; BLOCK FOR A SWEEP WHICH NEVER GOT STARTED (BAD PARAMETERS, RESOURCE ; IN USE, ETC.)M; ; INPUTS:.;O(; R5 POINTS TO THE FORTRAN ARGUMENT LIST0; R4 THE ARGUMENT NUMBER OF THE I/O STATUS BLOCK!; R3 STATUS CODE TO STORE IN IOSB ; ; OUTPUTS:;.:; THE VALUE IS STORED IN THE I/O STATUS BLOCK (IF PRESENT);F; REGISTERS ALTERED:;S; R4;S;-5.IESTO::CMPB R4,(R5) ;CAN IOSB BE IN PARAMETER LIST?I# BHI 20$ ;IF HI NO--USER LOSES BIGI ASL R4 ;CONVERT TO WORD INDEXE- ADD R5,R4 ;R4 NOW POINTS TO WORD CONTAINING  ; ADDRESS OF IOSB& CMP #-1,(R4) ;WAS ARGUMENT DEFAULTED? BEQ 20$ ;IF EQ YES--LOSE BIG MOV R3,@(R4) ;STORE STATUS 20$: RETURNM .ENDR OF THE I/O STATUS BLOCK!; R3 STATUS CODE TO STORE IN IOSB ; ; OUTPUTS:;.:; THE VALUE IS STORED IN THE I/O STATUS BLOCK (IF PRESENT);F; REGISTERS ALTERED:;S/ .TITLE KKWDRV KW11 HARDWARE INTERFACE ROUTINESE .IDENT /M01.00/; ; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 4-SEP-77 ;E:; THIS MODULE CONTAINS ROUTINES THAT ACCESS THE KW11 CLOCK;S; SYSTEM MACRO CALLS;  .MCALL CINT$S,KSWDF$,KDVDF$ KSWDF$E KDVDF$  , .SBTTL .KWCNI CONNECT CLOCK A TO INTERRUPTS;+/; .KWCNI -- CONNECT CLOCK A TO INTERRUPT VECTORO;E ; INPUTS: ; ; DATA BASE SET ;M ; OUTPUTS:;A; C-CLEAR CONNECT OK; C-SET COULD NOT CONNECTO;S;- .ENABL LSB .KWCNI::.IF DF FT$MOP $ TST .KAFLG ;ARE WE ALREADY ACTIVE?+ BMI 100$ ;YES--**SHOULD CHECK EXT START**E .ENDC ;FT$MOP% BIT #K$ACIN,.KAFLG ;IS IT CONNECTED?C" BNE 20$ ;YES--DON'T TRY IT AGAIN$ MOV .KAVEC,R1 ;CONNECT FIRST VECTOR CALL 200$ ;... BCS 120$ ;IF CS THEN ERROR .IF DF Q$$BUS ADD #4,R1 ;CONNECT ST2 VECTORN CALL 200$ ;... BCS 120$O .ENDC ;Q$$BUS1 BIS #K$ACIN,.KAFLG ;FLAG CONNECTED TO INTERRUPTS .KWCN0:: ;REF LABELL#20$: MOV .KACSR,R1 ;GET CSR ADDRESS 2 MOV .KAPRE,2(R1) ;SET PRESET INTO PRESET REGISTER .IF DF M$$MGEC MOV #.KWIN1+120000-<$KBASE&177700>,R3 ;ASSUME SWEEPING IMMEDIATELY$ .IFF ;M$$MGET, MOV #.KWIN1,R3 ;ASSUME SWEEPING IMMEDIATELY .IFTF ;M$$MGE7 MOV #KA$RIM!KA$ENB,R2 ;ASSUME A/D, NO EXT ST, NO DELAYH( BIT #S$WA$D,S.WFL2(R4);IS THIS THE A/D? BNE 40$ ;IF NE YES=30$: MOV #KA$RIM!KA$MFE!KA$ENB,R2 ;SET REPT INTRVL, MODE FLAG. ;ENABLE, AND CLOCK ENABLEU,40$: BIT #S$WEXT,S.WFLG(R4) ;EXTERNAL START? BEQ 60$ ;IF EQ NO9 BIS #KA$STI!KA$STE,R2 ;YES--SET ST INT ENABLE, ST ENABLED ;COUNTER8 BIC #KA$ENB,R2 ;CLEAR CLOCK ENABLE--ST WILL START CLOCK .IFT ;M$$MGEM6 MOV #.KWIN0+120000-<$KBASE&177700>,R3 ;SET FOR ST ISR .IFF ;M$$MGE MOV #.KWIN0,R3 ;SET FOR ST ISR  .IFTF ;M$$MGE.60$: BIT #S$WDLY,S.WFL2(R4) ;IS THERE A DELAY? BEQ 80$ ;IF EQ NO:% BIS #K$ADLY,.KAFLG ;YES--FLAG DELAY $ BIC #KA$RIM,R2 ;CLEAR REPT INTERVAL% BIS #KA$MFE,R2 ;SET MODE FLAG ENABLE4 .IFT ;M$$MGE?= MOV #.KWIN0+120000-<$KBASE&177700>,R3 ;SET FOR EXT START INEN .IFF ;M$$MGE& MOV #.KWIN0,R3 ;SET FOR EXT START ISR .IFTF ;M$$MGE'70$: MOV .KADLY,2(R1) ;SET DELAY PRESETI*80$: BIS .KARAT,R2 ;SET RATE I00ہс D%B11110010NTO CSR WORD4 MOV R3,.KWINT+2 ;SET ISR INTO INTERRUPT INSTRUCTION MOV R2,(R1) ;SET CLOCK CSR& BIS #K$ACTV,.KAFLG ;FLAG CLOCK ACTIVE100$: CLC ;FLAG OK120$: RETURN ;=200$: CINT$S R1,#$KBASE,#.KWINT,#.KWEDI,#PR6,#.KWAST ;CONNECT# RETURN  .ENDC ;M$$MGE .DSABL LSBM;?"; ENABLE DISABLE INTERRUPT ROUTINE;, .PSECT .KSCT1*.KWEDI: CLR @.KACSR ;DISABLE CLOCK ALWAYS- MOV @#$TKTCB,.KTKCB ;REMEMBER MY TCB ADDRESS: RETURNL (+ .SBTTL .KWIN? CLOCK "A" INTERRUPT ROUTINESE;+7; .KWIN0 -- CLOCK "A" INTERRUPT ROUTINE FOR ST OR DELAYI;R ; INPUTS:V;,; NONE;C ; OUTPUTS:;#;- .ENABL LSB 6.KWIN0::MOV R3,(SP) ;;;SAVE R3, OVERWRITE R4 ON STACK .IF NDF FT$MOPS MOV (R4),R4 ;;;GET SWB ADDRESS .IFF ;FT$MOP4 MOV .KLQUX,R4 ;;;GET SWB ADDRESS (ONLY 1ST CAN HAVE ;;;DELAY OR EXT START!)C .ENDC ;FT$MOP .IF DF M$$MGE .IFTF ;M$$MGE) MOV .KACSR,R3 ;;;GET CLOCK A CSR ADDRESSS# TST (R3) ;;;CHECK SCHMITT TRIGGERK) BMI 100$ ;;;IF MI SCHMITT TRIGGER FIRED % BIT #K$ADLY,.KAFLG ;;;DOING A DELAY?E BEQ 90$ ;;;NO--ALL DONE & BIC #K$ADLY,.KAFLG ;;;YES--CLEAR FLAG CLR (R3) ;;;DISABLE CLOCK; MOV .KAPRE,2(R3) ;;;SET PRESET& MOV R3,-(SP) ;;;SAVE R3 (CSR ADDRESS) .IFT ;M$$MGE6 MOV S.WSTR(R4),R3 ;;;GET USER MODE ST ROUTINE ADDRESS' ADD $KRLC5,R3 ;;;RELOCATE TO EXEC MODEC" CALL (R3) ;;;CALL THE ST ROUTINEC MOV #.KWIN1+120000-<$KBASE & 177700>,.KWINT+2 ;;;RESET INT ROUTINET .IFF ;M$$MGEC$ CALL @S.WSTR(R4) ;;;CALL ST ROUTINE* MOV #.KWIN1,.KWINT+2 ;;;RESET INT ROUTINE .IFTF ;M$$MGE/ BIC #S$WEXT,S.WFLG(R4) ;;;CLEAR EXT START FLAGS, BIT #S$WNOV,S.WFLG(R4) ;;;NON-CLOCK DRIVEN? BNE 85$ ;;;IF NE YESI10$: MOV #KA$RIM!KA$MFE!KA$ENB,R3 ;;;SET REPT INTRVL AND MODE FLAG ENABLEW1 BIT #S$WA$D,S.WFL2(R4) ;;;IS THIS THE A/D SWEEP?D BEQ 20$ ;;;IF EQ NOT9 MOV #KA$RIM!KA$ENB,R3 ;;;YES--NO CLOCK INTERRUPTS PLEASEI(20$: BIS .KARAT,R3 ;;;INCLUDE CLOCK RATE#40$: MOV R3,@(SP)+ ;;;SET CLOCK CSR60$: MOV (SP)+,R3 ;;;RESTORE R3I 80$: RETURNI)85$: TST (SP)+ ;;;CLEAR CSR OFF OF STACK; BR 60$ ;;;GO EXIT INTERRUPT4;;9; HERE IF NOT SCHMITT TRIGGER OR DELAY...MUST HAVE GOTTENK>; A DIGITAL INPUT START. FIX UP AND GO HANDLE REGULAR SAMPLING ; INTERRUPT.;N90$: ;;;REF LABEL .IFT ;M$$MGEA7 MOV #.KWIN1+120000-<$KBASE&177700>,.KWINT+2 ;;;SET ISRQ .IFF ;M$$MGEM MOV #.KWIN1,.KWINT+2 ;;;SET ISR .IFTF ;M$$MGE( BR KWIN1A ;;;HANDLE SAMPLING INTERRUPT;,; HERE IF ST1 FIREDS;?100$: BIC #KA$STF!KA$STI!KA$STE,(R3) ;;;DISABLE SCHMITT TRIGGER; ;;;AND CLEAR ST FLAG .IF DF N$DR11( CALL .DSDGO ;;;DISABLE DIGO IF ENABLED .ENDC ;N$DR112 BIT #S$WDLY,S.WFL2(R4) ;;;IS THERE A DELAY TO DO?3 BNE 300$ ;;;IF NE YES--WILL GET ANOTHER INTERRUPTF .IFT ;M$$MGE$. MOV S.WSTR(R4),R3 ;;;GET ST USER MODE ADDRESS' ADD $KRLC5,R3 ;;;RELOCATE TO EXEC MODE# CALL (R3) ;;;CALL ST ROUTINEC MOV #.KWIN1+120000-<$KBASE & 177700>,.KWINT+2 ;;;RESET INT ROUTINEI .IFF ;M$$MGE% CALL @S.WSTR(R4) ;;;CALL STR ROUTINEI* MOV #.KWIN1,.KWINT+2 ;;;RESET INT ROUTINE .ENDC ;M$$MGE/ BIC #S$WEXT,S.WFLG(R4) ;;;CLEAR EXT START FLAGD BR 300$ ;;;GO FINISH UP# D;+5; .KWIN1 -- CLOCK "A" INTERRUPT FOR SYNCHRONOUS SWEEPN;E ; INPUTS: ;T; R4 POINTS TO .KASWX ;$ ; OUTPUTS:;W<; ALL ACTIONS NECESSARY FOR CLOCK DRIVEN SWEEP ARE PERFORMED;E;-6.KWIN1::MOV R3,(SP) ;;;SAVE R3--OVERWRITE R4 ON STACK .IF NDF FT$MOP7' MOV (R4),R4 ;;;GET ACTIVE SWB ADDRESS  .IFTF ;FT$MOP4KWIN1A: BIC #KA$MDF,@.KACSR ;;;CLEAR CLOCK MODE FLAG .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .ENDC ;M$$MGE .IFF ;FT$MOPD% CLR -(SP) ;;;CLEAR FORK NEEDED FLAGK .IF DF M$$MGE1 MOV #<.KLQUX-S.WCLX>+120000-<$KBASE & 177700>,R4 .IFF ;M$$MGEA* MOV #<.KLQUX-S.WCLX>,R4 ;;;POINT TO QUEUE .ENDC ;M$$MGE+210$: MOV S.WCLX(R4),R4 ;;;LINK TO NEXT SWB3 BEQ 215$ ;;;IF EQ ALL DONE2 MOV S.WFL2(R4),R3 ;;;GET FLAGS AND SEE IF ACTIVE? BPL 210$ ;;;IF PL NOT ACTIVE' TSTB R3 ;;;ACTIVE--IS THIS A/D S00べDATADATADATADATADATADATADATAWEEP?;& BMI 210$ ;;;IF MI YES--DO NOT BOTHER1 CALL @S.WSCR(R4) ;;;YES--CALL SYNC CLOCK ROUTINEM BCC 210$ ;;;IF CC CONTINUE' BIS #S$WAST,S.WFLG(R4) ;;;SET AST FLAGD" INC (SP) ;;;SET FORK NEEDED FLAG BR 210$ ;;;CONTINUER!215$: TST (SP)+ ;;;NEED TO FORK?U BEQ 240$ ;;;IF EQ NO .IFT ;FT$MOP;3 CALL @S.WSCR(R4) ;;;CALL SYNCHRONOUS CLOCK ROUTINE BCC 240$ ;;;IF CC OK* BIT #S$WSTP,S.WFL2(R4) ;;;STOP THE SWEEP? BEQ 220$ ;;;IF EQ NO$ CLR @.KACSR ;;;YES--STOP THE CLOCK .ENDC ;FT$MOP220$: ;;;REF LABELM .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6  .ENDC ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3S .IF NDF FT$MOP 4 CALLR .KEFQI ;;;FORK SET EFN OR QUEUE AST AND EXIT .IFF ;FT$MOPU .IF DF M$$MGE1 MOV #<.KLQUX-S.WCLX>+120000-<$KBASE & 177700>,R4 .IFF ;M$$MGE * MOV #<.KLQUX-S.WCLX>,R4 ;;;POINT TO QUEUE .ENDC ;M$$MGE4 MOV .KUCNT,-(SP) ;;;SET CLOCK USER COUNT ONTO STACK;09; RUN THROUGH CLOCK QUEUE TO SEE IF WE NEED TO STOP CLOCKN;;+225$: MOV S.WCLX(R4),R4 ;;;LINK TO NEXT SWB$ BEQ 227$ ;;;IF EQ ALL DONE# TST S.WFL2(R4) ;;;IS SWEEP ACTIVE?M BMI 225$ ;;;IF MI YESS DEC (SP) ;;;NO--DEC USE COUNTE BR 225$ ;;;CONTINUE SCANNING#227$: TST (SP)+ ;;;ANY USERS LEFT?D BGT 230$ ;;;IF GT YES-# CLR @.KACSR ;;;NO--STOP THE CLOCK:230$: CALLR .KWEFQ ;;;FORK, SET EFN OR QUEUE AST AND EXIT .ENDC ;FT$MOP240$:V .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6U .ENDC ;M$$MGE 300$: MOV (SP)+,R3 ;;;RESTORE R3 320$: RETURN .DSABL LSB  .ENDO NEXT SWB$ BEQ 227$ ;;;IF EQ ALL DONE# TST S.WFL2(R4) ;;;IS SWEEP ACTIVE?M BMI 225$ ;;;IF MI YESS DEC (SP) ;;;NO--DEC USE COUNTE BR 225$ ;;;CONTINUE SCANNING#227$: TST (SP)+ ;;;ANY USERS LEFT?D BGT 230$ ;;;IF GT YES-# CLR @.KACSR ;;;NO--STOP THE CLOCK:230$: CALLR .KWEFQ ;;;FORK, SET EFN OR QUEUE AST AND EXIT .ENDC ;FT$MOP240$:V .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6U .ENDC ;M$$MGE 300$: MOV (SP)+,R3 ;;;RESTORE R3 320$: RE& .TITLE KLQSUB CLOCK QUEUE SUBROUTINES .IDENT /M01.01/;A; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.S;N>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION M01.01; B. SCHREIBER 15-NOV-77;E; MODIFIED BY:;U ; MSH017 M. HARVEY OCT. 12, 1978*; CORRECT CONDITIONALIZATION FOR NO CLOCK;A9; THIS MODULE CONTAINS ROUTINES TO MODIFY THE CLOCK QUEUE ;D; SYSTEM MACRO CALLS;O .MCALL KSWDF$ KSWDF$C O- .SBTTL .KLQIN INSERT SWEEPS INTO CLOCK QUEUEN;+); .KLQIN -- INSERT SWEEP INTO CLOCK QUEUEO;R8; THIS ROUTINE SETS UP A SWEEP TO BE IN THE CLOCK QUEUE.;L ; INPUTS:S; ; R4 POINTS TO SWB ; R3 FREE ;N ; OUTPUTS:;D5; [NOT MULTIPLE SWEEPS] .KASWB AND .KASWX ARE SET UP.E8; [MULTIPLE SWEEPS] SWB IS ENTERED INTO CLOCK QUEUE.,; [BOTH] ACTIVE FLAG IS SET FOR CLOCK;H;-.KLQIN:: ;REF LABELO .IF NDF FT$MOPU MOV #.KASWX,R3 ;POINT TO KASWX* MOV R4,(R3)+ ;SET SWB ADDRESS INTO .KASWX* MOV R4,(R3) ;SET SWB ADDRESS INTO .KASWB .IF DF M$$MGE* ADD $KRLC5,-(R3) ;RELOCATE .KASWX TO APR5 .ENDC ;M$$MGE .IFF ;FT$MOPU MTPS #PR6 ;LOCK OUT INTERRUPTS: MOV .KLQUU,S.WCLQ(R4) ;;;LINK NEW ACTIVE SWEEP INTO QUEUE MOV R4,.KLQUU ;;; .IF DF M$$MGE MOV R4,R3 ;;;COPY PTRS" ADD $KRLC5,R3 ;;;RELOCATE TO APR54 MOV .00끻 D%B11110010KLQUX,S.WCLX(R4) ;;;LINK INTO EXEC LEVEL QUEUE MOV R3,.KLQUX ;;;...F .ENDC ;M$$MGE( INC .KUCNT ;;;COUNT ANOTHER CLOCK USER MTPS #0 ;;;ALLOW INTERRUPTS .ENDC ;FT$MOP RETURN ;SWEEP IS IN THE QUEUE M, .SBTTL .KLQRM REMOVE SWEEP FROM CLOCK QUEUE;+); .KLQRM -- REMOVE SWEEP FROM CLOCK QUEUEP; ; INPUTS:N;R.; CALLED AT USER LEVEL WITH R4 POINTING TO SWB;E ; OUTPUTS:;M; SWB IS REMOVED FROM QUEUE$;E;-.KLQRM:: ;REF LABEL .IF NDF FT$MOPE CLR .KASWB ;CLEAR SWB ADDRESSR CLR .KASWX ;...C .IFF ;FT$MOPV MOV R3,-(SP) ;SAVE R3 MOV R2,-(SP) ;AND R2N" MTPS #PR6 ;;;LOCK OUT INTERRUPTS( MOV #.KLQUU-S.WCLQ,R3 ;;;POINT TO QUEUE/20$: MOV R3,R2 ;;;REMEMBER FROM WHENCE WE CAMET+ MOV S.WCLQ(R3),R3 ;;;LINK TO NEXT IN QUEUE. BEQ 40$ ;;;IF EQ MUST NOT HAVE BEEN IN QUEUE% CMP R4,R3 ;;;IS THIS THE RIGHT ONE?W BNE 20$ ;;;IF NE NO4 MOV S.WCLQ(R3),S.WCLQ(R2) ;;;YES--UNLINK FROM QUEUE .IF DF M$$MGE1 MOV S.WCLX(R3),S.WCLX(R2) ;;;AND FROM EXEC QUEUE  .ENDC ;M$$MGE" DEC .KUCNT ;;;DECREASE USE COUNT% BGT 40$ ;;;IF GT CLOCK STILL ACTIVED .IFTF ;FT$MOP .IF DF K$$W11- BIC #K$ACTV,.KAFLG ;;;CLOCK NO LONGER ACTIVE0 .ENDC ;K$$W11M .IFF ;FT$MOP !40$: MTPS #0 ;;;ALLOW INTERRUPTST MOV (SP)+,R2 ;RESTORE REGISTERS MOV (SP)+,R3 ;... .ENDC ;FT$MOP RETURN  .ENDRIGHT ONE?W BNE 20$ ;;;IF NE NO4 MOV S.WCLQ(R3),S.WCLQ(R2) ;;;YES--UNLINK FROM QUEUE .IF DF M$$MGE1 MOV S.WCLX(R3),S.WCLX(R2) ;;;AND FROM EXEC QUEU/ .TITLE KMUL INTEGER MULTIPLY MAGNITUDE NUMBERS .IDENT /03/;; COPYRIGHT (C) 1977, 1978.; DIGITAL EQUIPMENT CORP., MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE@; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION@; OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT1; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC.;@; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT@; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL; EQUIPMENT CORPORATION.;D@; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY?; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.C;E ; VERSION 03; ; D. N. CUTLER 10-FEB-72;+-; **-.KMUL-INTEGER MULTIPLY MAGNITUDE NUMBERSS;P ; INPUTS:C;O; R0=MULTIPLIER.; R1=MULTIPLICAND.;M ; OUTPUTS:; ); DOUBLE WORD RESULT IS RETURNED WITH THEF); HIGH PART IN R0 AND THE LOW PART IN R1.N;W9; REGISTERS R2, R3, R4, AND R5 ARE PRESERVED ACROSS CALL.N;- .ENABL LSBI&.KMUL:: MOV R0,-(SP) ;SAVE R0 FOR ADDS MOV #21,-(SP) ;SET REPEAT COUNT CLR R0 ;CLEAR HIGH PARTO 10$: ROR R0 ;DOUBLE RIGHT SHIFT ROR R1 ; BCC 20$ ;IF CC DO NOT ADD ADD 2(SP),R0 ;- CLC ;CLEAR CARRY INDICATORI&20$: DEC (SP) ;DECREMENT REPEAT COUNT BGT 10$ ;IF GT MORE TO GOE CMP (SP)+,(SP)+ ;CLEAN STACKU RETURN ;  .ENDRD RESULT IS RETURNED WITH THEF); HIGH PART IN R0 AND THE LOW PART IN R1.N;W9; REGISTERS R2, R3, R4, AND R5 ARE PRESERVED$ .TITLE KPAA PUSH ARGUMENT ADDRESSES .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 23-JUN-77;E5; SUBROUTINE TO PUSH FORTRAN ARGUMENT LIST ONTO STACK  ;+@; .K.PAA -- SUBR00DATADATADATADATADATADATADATAOUTINE TO PUSH ARGUMENT ADDRESSES ONTO THE STACK;E; CALLING SEQUENCE: ; CALL .K.PAAC; .WORD MAXARG; .WORD BITMAP0; (BIT0 FOR LAST ARG, BIT1 FOR NEXT TO LAST...);D ; INPUTS: ;C&; R5 ADDRESS OF ARGUMENT ADDRESS TABLE$; MAXARG MAXIMUM NUMBER OF ARGUMENTS1; BITMAP BIT MAP WITH ONES FOR REQUIRED ARGUMENTSS; ; OUTPUTS:; #; C-CLEAR ARGUMENTS SET UP ON STACKC9; STACK SETUP WITH ADDRESSES OR 0 FOR DEFAULTED ARGUMENTSU2; R5 HOLDS OLD SP FOR ERROR RECOVERY (CLEAN STACK);8; C-SET REQUIRED ARG NOT PRESENT, ILLEGAL NUMBER OF ARGS; STACK IS CLEARN$; R5 STILL POINTING TO ARGUMENT LIST;A; REGISTERS ALTERED:;I; R4,R3,R2,R1,R0; ;-+.K.PAA::MOV (SP)+,R3 ;GET ADDRESS OF RETURNE) MOV SP,R4 ;PRESERVE SP IN CASE OF ERRORM$ MOV (R3)+,R2 ;R2=MAX # OF ARGUMENTS0 MOV (R3)+,R1 ;R1=BIT MAP OF MANDATORY ARGUMENTS ;R3=RETURN ADDRESS. MOVB (R5),R0 ;GET ACTUAL NUMBER OF ARGUMENTS4 SUB R0,R2 ;PUSH A ZERO FOR EACH ARGUMENT NOT GIVEN) BMI 160$ ;IF MI THEN TOO MANY ARGUMENTS ' BEQ 40$ ;IF EQ ALL ARGUMENTS SUPPLIEDO20$: ROR R1 ;SEE IF MANDATORY BCS 160$ ;IF CS YES--ERROR( CLR -(SP) ;NO--SET A ZERO ON THE STACK& DEC R2 ;DO ALL UNSPECIFIED ARGUMENTS BNE 20$ ;WAIT FOR R2=0;V5; NOW SEE IF ANY MORE ARGS TO PROCESS (GIVEN IN CALL)R;A140$: MOV R0,R2 ;PICK UP COUNT OF ARGS LEFT TO DOA BEQ 120$ ;IF EQ ALL DONE. INC R2 ;ELSE SET R2 TO ADR OF WORD FOLLOWING ; ADDRESS LIST ASL R2 ;SET R2=2*(R0+1)+R5- ADD R5,R2 ;NOW R2 POINTS JUST PAST LAST ARG ;U>; PUSH GIVEN ARGUMENTS ONTO STACK IN REVERSE ORDER, CONVERTING!; DEFAULTED ARGUMENTS INTO ZEROES ;-60$: MOV -(R2),-(SP) ;PUSH ONE& CMP #-1,(SP) ;WAS ARGUMENT DEFAULTED? BEQ 80$ ;IF EQ YES ROR R1 ;NO--ROTATE BIT MAP BR 100$ ;M-80$: ROR R1 ;DEFAULTED ARG--WAS IT REQUIRED?M BCS 160$ ;IF CS YES--ERROR CLR (SP) ;NO--CHANGE TO ZERO100$: DEC R0 ;LOOP; BNE 60$ ;O#120$: CLC ;BETTER SAFE THAN SORRY  BR 180$ ;GO EXIT;2; HERE IF AN ERROR WAS DETECTEDO;S160$: MOV R4,SP ;RESTORE SP" SEC ;FLAG AN ERROR HAS OCCURRED# BR 200$ ;GO RETURN WITH R5 INTACTR6180$: MOV R4,R5 ;COPY OLD SP FOR LATER ERROR RECOVERY200$: JMP (R3) ;ROUTINE EXITE .END BEQ 80$ ;IF EQ YES ROR R1 ;NO--ROTATE BIT MAP BR 100$ ;M-80$: ROR R1 ;DEFAULTED ARG--WAS IT REQUIRED?M BCS 160$ ;IF CS YES--ERROR CLR (SP) ;NO--CHANGE TO ZERO100$: DEC R0 ;LOOP; BNE 60$ ;O#120$: CLC ;BETTER SAFE THAN SORRY  BR 180$ ;GO EXIT;2; HERE IF AN ERROR WAS DETECTEDO;S160$: MOV R4,SP ;RESTORE SP" SEC .NLIST .TITLE KPRE .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I;  ;HB; ASSEMBLY PREFIX FILE FOR K-SERIES PERIPHERAL SUPPORT SUBROUTINES; YM$$MGE=0 ;MAPPED SYSTEM%N$$MBF=8. ;MAXIMUM NUMBER OF BUFFERSAK$$W11=1 ;KW11-K CLOCK SUPPORTLK$W11K=1 ;KW11-K CLOCK G$$HST=0 ;GTHIST DATA BASEO$FT$MOP=0 ;MULT. CLOCK DRIVEN SWEEPS'N$AD11=1 ;AD11-K A/D CONVERTER SUPPORTNA$$M11=0 ;AM11-K SUPPORTIN$DR11=1 ;DR11-K SUPPORTT N$AA11=1 ;AA11-K D/A CONVERTERS)N$$SWB=5 ;NUMBER OF SWEEP CONTROL BLOCKST;OC; MACRO TO DEFINE JUMP TO SUBROUTINE WITH RETURN TO CALLER'S CALLERE;Y .MACRO CALLR ARGS JMP ARG .ENDM;O3; MACROS TO REFERENCE PSW FOR NON-LSI-11 PROCESSORSM;8 .IF NDF L$$SI1R .00 D%B11110010MACRO MFPS DST1 MOVB @#PS,DST .ENDM .MACRO MTPS SRC .IF IDN <#0>, CLRB @#PS .IFF MOVB SRC,@#PS .ENDC .ENDM .ENDC .LIST;AD11-K A/D CONVERTER SUPPORTNA$$M11=0 ;AM11-K SUPPORTIN$DR11=1 ;DR11-K SUPPORTT N$AA11=1 ;AA11-K D/A CONVERTERS)N$$SWB=5 ;NUMBER OF SWEEP CONTROL BLOCKST;OC; MACRO TO DEFINE JUMP TO SUBROUTINE WITH RETURN TO CALLER'S CALLERE;Y .MACRO CALLR ARGS JMP ARG .ENDM;O3; MACROS TO REFERENCE PSW FOR NON-LSI-11 PROCESSORSM;8 .IF NDF L$$SI1R .( .TITLE RCLOKB READ CLOCK B FROM FORTRAN .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 24-OCT-77;EC; THIS MODULE READS CLOCK B AND RETURNS THE VALUE IN FLOATING POINT  S .SBTTL RCLOKB;+<; RCLOKB -- READ CLOCK B AND RETURN RESULT IN FLOATING POINT;N; CALL:C; ; TIME = RCLOKB (RLAST [,PTIME]);T ; INPUTS: ;C6; RLAST IS THE VALUE TO BE SUBTRACTED FROM THE CURRENT2; 16-BIT SOFTWARE CLOCK TIME BEFORE RETURNING THE ; RESULT.;E ; OUTPUTS:;L; TIME,PTIME RETURN THE RESULT;;-'RCLOKB::CALL ICLOKB ;READ 16-BIT CLOCKE1 CALL .FLT16 ;CONVERT TO FLOATING POINT IN R0,R1- TST (R5)+ ;SKIP THE COUNT WORD# MOV (R5)+,R4 ;GET ADDRESS OF RLASTO CMP #-1,R4 ;WAS IT DEFAULTED? ! BEQ 40$ ;IF EQ YES--WE ARE DONEE$ MOV (R4),-(SP) ;NO--PUSH ONTO STACK% BIS 2(R4),(SP)+ ;AND SEE IF IT WAS 0T BEQ 40$ ;IF EQ YES# MOV (R4)+,R2 ;NO--GET THE ARGUMENTM MOV (R4)+,R3 ;.... CALL .KSUB ;SUBTRACT RLAST FROM CURRENT TIME ; (RETURN IN R0:R1)-40$: CMP -4(R5),#2 ;WERE THERE TWO ARGUMENTS?C BLT 100$ ;IF LT NO* CMP (R5),#-1 ;YES--WAS 2ND ARG DEFAULTED? BEQ 100$ ;IF EQ YES-) MOV (R5),R4 ;NO--GET ADDRESS OF 2ND ARG5" MOV R0,(R4)+ ;STORE TIME ARGUMENT MOV R1,(R4)+ ;... 100$: RETURN .ENDQ YES--WE ARE DONEE$ MOV (R4),-(SP) ;NO--PUSH ONTO STACK% BIS 2(R4),(SP)+ ;AND SEE IF IT WAS 0T BEQ 40$ ;IF EQ YES# MOV (R4)+,R2 ;NO--GET THE ARGUMENTM MOV (R4)+,R3 ;.... CALL .KSUB ;SUBTRACT RLAST FROM CURRENT TIME ; (RETURN IN R0:R1)-40$: CMP -4(R5),#2 ;WERE THERE TWO ARGUMENTS?C BLT 100$ ;IF LT NO* CMP (R5),#-1 ;YES--WAS 2ND ARG DEFAULTED? BEQ 100$ ;IF EQ YES-) MOV (R5),R4 ;NO--GET ADDRESS OF 2ND ARG5" MOV R0,(R4)+ ;STORE TIME ARGUMENT M# .TITLE KRLOC RELOCATE USER ADDRESS .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER (FROM IOSUB.MAC)E;N E;+); .KRLOC -- RELOCATE USER VIRTUAL ADDRESS ;E5; THIS ROUTINE T00DATADATADATADATADATADATADATARANSFORMAS A 16 BIT USER ADDRESS INTOO?; A RELOCATION BIAS AND DISPLACEMENT IN BLOCK RELATIVE TO APR6. ;O ; INPUTS:T; %; R0 USER VIRTUAL ADDRESS TO RELOCATE;O ; OUTPUTS:; ,; R1 RELOCATION BIAS TO BE LOADED INTO PAR6.2; R2 DISPLACEMENT IN BLOCK PLUS 140000 (PAR6 BIAS);B; REGISTERS ALTERED:;A; R1;S;-.KRLOC:: ;REF LABEL .IF NDF M$$MGEE" MOV R0,R2 ;COPY PHYSICAL ADDRESS CLR R1 ;CLEAR RELOCATION BIAS .IFFL! MOV R0,R1 ;COPY VIRTUAL ADDRESS% CLR R2 ;ZERO APR NUMBER ACCUMULATOR  ASL R1 ;COLLECT APR NUMBER ROL R2 ; ASL R1 ; ROL R2 ; ASL R1 ; ROL R2 ; ASL R2 ;CONVERT TO APR INDEX CLRB R1 ;CLEAR EXTRANEOUS BITS+ SWAB R1 ;COLLECT BLOCK NUMBER IN LOW BYTEN ROR R1 ;- ADD UISAR0(R2),R1 ;CALCULATE RELOCATION BIAS)! MOV R0,R2 ;COPY VIRTUAL ADDRESS14 BIC #177700,R2 ;CLEAR ALL BUT DISPLACEMENT IN BLOCK BIS #140000,R2 ;SET APR 6 BIASD .ENDC ;M$$MGE RETURN ;A .ENDFFL! MOV R0,R1 ;COPY VIRTUAL ADDRESS% CLR R2 ;ZERO APR .TITLE KRWBF READ/WRITE BUFFER .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; ; VERSION 01; B. SCHREIBER 14-JUL-77;E4; THIS MODULE READS AND WRITES THE USERS DATA BUFFER;E; SYSTEM MACRO CALLS;S .MCALL KSWDF$ KSWDF$H .PSECT .KSCT1 A< .SBTTL .KRDWD READ WORD FROM USER BUFFER AT INTERRUPT LEVEL;+;; .KRDWD -- READ WORD FROM USER BUFFER (AT INTERRUPT LEVEL)O;E ; INPUTS:A; ; R4 SWEEP CONTROL BLOCK POINTER;O ; OUTPUTS:;; C-CLEAR READ WORD OK; R3 HOLDS DATUM;R,; C-SET READ WORD OK--END OF BUFFER OR SWEEP;C; REGISTERS ALTERED:;I; NONE; ;-B.KRDWD::MOV S.WBPX(R4),R3 ;;;GET POINTER TO CURRENT BUFFER POINTER .IF DF M$$MGE) MOV (R3)+,@#KISAR6 ;;;MAP TO USER BUFFERS .IFTF ;M$$MGE4 MOV @(R3),-(SP) ;;;READ WORD FROM BUFFER ONTO STACK) ADD #2,(R3) ;;;INCREMENT BUFFER POINTER .IFT ;M$$MGEE) BIT #20000,(R3) ;;;OVERFLOW 4K BOUNDARY?A BEQ 40$ ;;;IF EQ NOL' BIC #20000,(R3) ;;;YES--CLEAR OVERFLOWL. ADD #200,-(R3) ;;;ADVANCE TO NEXT 4K BOUNDARY .IFTF ;M$$MGE 40$: CLC ;;;PRESET FOR SUCCESS0 DEC S.WCNT(R4) ;;;DECREMENT SAMPLE COUNT (C-OK)$ BGT 60$ ;;;IF GT NOT END OF BUFFER$ CALL .BFSWT ;;;YES--SWITCH BUFFERS$ SEC ;;;SET C-BIT FOR FORK REQUEST!60$: MOV (SP)+,R3 ;;;RESTORE WORD) RETURNW" ;;;M$$MGE CONDITIONAL CONTINUES = .SBTTL .KWRWD WRITE WORD INTO USER BUFFER AT INTERRUPT LEVELR" ;;;M$$MGE CONDITIONAL CONTINUED;+'; .KWRWD -- WRITE WORD INTO USER BUFFERO;F6; THIS ROUTINE WRITES A DATA WORD INTO THE USER BUFFER;F ; INPUTS:;0; R3 DATA WORD ; R4 SWEEP CONTROL BLOCK POINTER;C ; OUTPUTS:;O ; C-CLEAR OK;6;; C-SET OK BUT FORK REQUEST FOR END OF BUFFER, DONE, OR DAOB;E; REGISTERS ALTERED:;O; NONE;E;-&.KWRWD::MOV R3,-(SP) ;;;SAVE DATA WORD; MOV S.WBPX(R4),R3 ;;;GET POINTER TO CURRENT BUFFER POINTERW .IFT ;M$$MGEE) MOV (R3)+,@#KISAR6 ;;;MAP TO USER BUFFERC .IFTF ;M$$MGE/ MOV (SP)+,@(R3) ;;;WRITE WORD INTO USER BUFFER-20$: ADD #2,(R3) ;;;INCREMENT BUFFER POINTERU .IFT ;M$$MGE ) BIT #20000,(R3) ;;;OVERFLOW 4K BOUNDARY?R BEQ 40$ ;;;IF EQ NO ' BIC #20000,(R3) ;;;YES--CLEAR OVERFLOWK. ADD #200,-(R3) ;;;ADVANCE TO NEXT 4K BOUNDARY .IFTF ;M$$MGE"40$: C00  D%B11110010LC ;;;PRESET C FOR SUCCESS) DEC S.WCNT(R4) ;;;DECREMENT SAMPLE COUNTW) ;;; (**DEC DOES NOT AFFECT C-BIT**) " BGT 60$ ;;;IF GT BUFFER NOT DONE& CALL .BFSWT ;;;END OF BUFFER--SWITCH$ SEC ;;;SET C-BIT FOR FORK REQUEST60$: RETURN ;;;R" ;;;M$$MGE CONDITIONAL CONTINUES B0 .SBTTL .BFSWT SWITCH BUFFERS AT INTERRUPT LEVEL" ;;;M$$MGE CONDITIONAL CONTINUED;+!; .BFSWT -- SWITCH TO NEXT BUFFERC;R ; INPUTS:;D"; R4 POINTS TO SWEEP CONTROL BLOCK ; R3 SCRATCH;; ; OUTPUTS:;C; BUFFERS SWITCHED;C;-K.BFSWT::MOVB S.WBNO(R4),S.WLBF(R4) ;;;REMEMBER LAST BUFFER IN CASE OF ERRORC .IFT ;M$$MGE$< MOV S.WUSW+2(R4),@#KISAR6 ;;;MAP TO USER STATUS WORD (IBUF) .IFTF ;M$$MGE' MOV S.WUSW+4(R4),R3 ;;;GET USW ADDRESS- ADD #IB.USQ,R3 ;;;POINT TO USER BUFFER QUEUET .REPT 8.C, TSTB (R3)+ ;;;LOOK FOR EMPTY SLOT IN QUEUE BMI 10$ ;;;IF MI WE FOUND IT .ENDM- BR 100$ ;;;IF QUEUE IS FULL CALL IT OVERRUNT+ ;;;EVEN THO IT IS REALLY UNDERRUN(!!??) A10$: MOVB S.WBNO(R4),-(R3) ;;;ENTER BUFFER NUMBER INTO USER QUEUE,8 BIT #S$WSEB!S$WSTP,S.WFL2(R4) ;;;STOP AT END OF BUFFER?* ;;;OR JUST PLAIN STOP SWEEP? BNE 60$ ;;;IF NE YES' TST S.WNBF(R4) ;;;CONTINUOUS SAMPLING?+ BMI 20$ ;;;IF MI YES' DEC S.WNBF(R4) ;;;NO--DEC BUFFER COUNTF$ BEQ 80$ ;;;IF EQ SWEEP IS COMPLETE/20$: MOV S.WUSW+4(R4),R3 ;;;POINT TO IBUF AGAINI3 ADD #IB.DVQ,R3 ;;;POINT AT THE DEVICE BUFFER QUEUES: MOVB (R3),S.WBNO(R4) ;;;GET THE NEXT BUFFER NUMBER TO USE# BMI 100$ ;;;IF MI WE HAVE OVERRUN; .REPT 3/ MOVB 1(R3),(R3)+ ;;;MOVE THE QUEUE DOWN A BYTEF MOVB 1(R3),(R3)+ ;;;...% BMI 50$ ;;;TRY THE EASY OUT 3 TIMESS .ENDM140$: MOVB 1(R3),(R3)+ ;;;MOVE THE LAST ENTRY DOWNU) MOVB #-1,(R3) ;;;CLOSE QUEUE WITH A (-1)S850$: MOVB S.WBNO(R4),R3 ;;;GET NEW CURRENT BUFFER NUMBER ASL R3 ;;;MULTIPLY V ASL R3 ;;; BY 4 ADD R4,R3 ;;;INDEX INTO SWBD5 ADD #S.WIBP,R3 ;;; AND INTO INITIAL BUFFER POINTERSS% MOV (R3)+,S.WBPT(R4);;;MOVE POINTERS & MOV (R3)+,S.WBPT+2(R4) ;;;INTO S.WBPT0 MOV S.WSIZ(R4),S.WCNT(R4) ;;;RESET BUFFER COUNT RETURN ;;;DONE;V2; HERE WHEN S$WSEB IS TRUE (STOP AT END OF BUFFER);IE60$: MOV #-,S.WSTS(R4) ;;;SET STATUS OF ABORT FOR S$WSEBM$ BR 120$ ;;;FLAG TO STOP AND RETURN;; ALL BUFFERS SAMPLED ;G)80$: MOV #IS.SUC,S.WSTS(R4) ;;;SET STATUSU BR 120$ ;;;FINISH UP;4; DATA OVERRUN OR DONE SAMPLING;D?100$: MOV #-,S.WSTS(R4) ;;;SET DATA OVERRUN STATUSW,120$: BIS #S$WSTP,S.WFL2(R4) ;;;FLAG TO STOP= MOVB S.WLBF(R4),S.WEBF(R4) ;;;SET BUFFER IN ERROR NUMBER FORC) ;;;IGTBUF/IWTBUF (MAY NOT BE IN$' ;;;ERROR, BUT ACTUALLY END OF* ;;;SWEEP, BUT ITS ALL THE SAME!)4 BIC #S$WACT,S.WFL2(R4) ;;;SWEEP IS NO LONGER ACTIVE140$: RETURN ;;; .ENDC ;M$$MGE .END: MOV #IS.SUC,S.WSTS(R4) ;;;SET STATUSU BR 120$ ;;;FINISH UP;4; DATA OVERRUN OR DONE SAMPLING;D?100$: MOV #-,S.WSTS(R4) ;;;SET DATA OVERRUN STATUSW,120$: BIS #S$WSTP,S.WFL2(R4) ;;;FLAG TO STOP= M" .TITLE KSET SETUP ARGS FOR SWEEPS .IDENT /M02.00/;O ; COPYRIGHT (C) 1977, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;K>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 02.00 ; B. SCHREIBER 23-JUN-77;E; PREVIOUSLY MODIFIED BY:U;; B. SCHREIBER; M. S. HARVEY;H; MO00DATADATADATADATADATADATADATADIFIED BY:; ; M. S. HARVEY 9-OCT-79P6; MSH025 -- TRAP GROUP GLOBAL EVENT FLAG USE AS ERROR;I; ;; THIS ROUTINE POPS THE ARGUMENTS OFF OF THE STACK AND SETS "; UP THE SWEEP CONTROL BLOCK (SWB);A;O; SYSTEM MACRO CALLS;Q .MCALL KSWDF$, CLEF$S KSWDF$U ) .SBTTL .K.SET SET UP SWEEP CONTROL BLOCKY;+%; .K.SET -- SETUP SWEEP CONTROL BLOCKT;P ; INPUTS:C;; STACK SETUP FROM .K.PAAS.; R5 OLD SP BEFORE .K.PAA (RETURNED BY .K.PAA)&; R4 SWEEP CONTROL BLOCK (SWB) POINTER; ; OUTPUTS:;#; C-CLEAR SWEEP CONTROL BLOCK SETUP2); ALL ARGUMENTS THROUGH 'IEFN' HAVE BEENR; POPPED OFF OF THE STACK; ; C-SET ARGUMENT ERROR"; SP RESET TO VALUE BEFORE .K.PAA;L; REGISTERS ALTERED:; ; R3,R2C;C;-,.K.SET::MOV (SP)+,R3 ;POP OFF RETURN ADDRESS& TST S.WFL2(R4) ;SWEEP ALREADY ACTIVE? BMI 300$ ;IF MI YES--ERROR. BIC #S$W2CL,S.WFL2(R4) ;CLEAR FLAGS AS NEEDED, CLR S.WSTS(R4) ;CLEAR SWEEP I/O STATUS WORD MOV (SP)+,R1 ;GET IBUF ADDRESSN% CMP (R1),#I$BFVW ;WAS SETIBF CALLED?:# BNE 300$ ;IF NE NO--BAD ARGUMENTSE# CLR (R1) ;YES--SET OP IN PROGRESS 6 TSTB IB.DVQ(R1) ;HAS RLSBUF BEEN CALLED FOR 1 BUFFER? BMI 300$ ;IF MI NO--ERRORL/ MOV R1,S.WBPT(R4) ;YES--SAVE ADDRESS FOR LATER ; MOVB #-1,S.WEBF(R4) ;INIT ERROR BUFFER NUMBER TO NO BUFFERS+ MOV @(SP)+,S.WSIZ(R4) ; PICKUP BUFFER SIZEI BLE 300$ ;IF LE THEN ERROR, MOV S.WSIZ(R4),S.WCNT(R4) ;INIT THE COUNTER! MOV (SP)+,R2 ;GET 'NBUF' ADDRESSU BEQ 10$ ;IF EQ SET DEFAULT TST (R2) ;WAS IT POSITIVE? BGT 20$ ;IF GT YES&10$: MOV #.NEG1,R2 ;DEFAULT TO FOREVER/20$: MOV (R2),S.WNBF(R4) ;SET NUMBER OF BUFFERSR! MOV (SP)+,R2 ;GET 'MODE' ADDRESSF BNE 60$ ;IF NE GO STORE-* MOV #.ZEROW,R2 ;IF DEFAULTED STORE A ZERO$60$: MOV (R2),R2 ;PICKUP USER FLAGS8 BIC #^C,R2 ;CLEAR FLAGS USER SHOULD NOT HAVE ON( MOV R2,S.WFLG(R4) ;SET THE FLAGS IN SWB/ BIT #S$WTSS,R2 ;IS THIS TIME-STAMPED SAMPLING?E BEQ 100$ ;IF EQ NO--SKIP9 BIC #1,S.WSIZ(R4) ;YES--ENSURE EVEN # OF WORDS IN BUFFER;7 BIC #1,S.WCNT(R4) ; (JUST A BIT OF PROTECTION FOR ISR)27100$: MOV S.WSIZ(R4),2(R1) ;INIT IOSB(2) TO BUFFER SIZER# MOV (SP)+,R2 ;GET 'IPRSET' ADDRESSE .IF DF K$$W11 BEQ 140$ ;IF EQ SKIP/ BIT #S$WNOV,S.WFLG(R4) ;NON-OVERFLOW SAMPLING?(! BNE 160$ ;IF NE YES--SKIP CHECKC .IF DF FT$MOP, TST .KAFLG ;IS THERE ANOTHER ACTIVE SWEEP? BPL 140$ ;IF PL NO--SKIP CHECK# CMP (R2),.KAPRE ;YES--SAME PRESET?G BNE 300$ ;IF NE NO--ERRORP .IFTF ;FT$MOP MOV (R2),.KAPRE ;SET THE PRESET4140$: BIT #S$WNOV,S.WFLG(R4) ;NON-OVERFLOW SAMPLING? BNE 160$ ;IF NE YES.. TST .KAFLG ;NO--ARE ANY OTHER SWEEPS ACTIVE? .IFF ;FT$MOP' BMI 300$ ;IF MI YES--ERROR .IFT ;FT$MOP; BPL 150$ ;IF PL NO--OKAY' BIT #K$AGTD,.KAFLG ;YES--IS IT GTHIST?  BNE 300$ ;IF NE YES--ERROR150$:T .ENDC ;FT$MOP) BIT #K$ACAC,.KAFLG ;WAS 'CLOCKA' CALLED? , BEQ 300$ ;IF EQ NO--NO CLOCK RATE, AND NOT$ ; NON-OVERFLOW DRIVEN SAMPLING .IFF ;K$$W11;;140$: BIT #S$WNOV,S.WFLG(R4) ;NON-OVERFLOW DRIVEN SAMPLING?.+ BEQ 300$ ;IF EQ NO--LOSE BECAUSE NO CLOCK; .ENDC ;K$$W11; 7;LAST ARG TO CHECK IS THE EVENT FLAG/COMPLETION ROUTINEB;3$160$: MOV (SP)+,R2 ;GET ADDRESS OR 0! BEQ 165$ ;IF EQ USE DEFAULT EFNB; TST (R2) ;SEE IF EFN PRESENT (0 IS HALT SO CAN'T BE AST!)-& BNE 170$ ;IF NE YES--GO CHECK IT OUT4165$: MOV #.KDFEF,R2 ;NO--USE THE DEFAULT EVENT FLAG$ BR 180$ ;WE KNOW ITS AN EVENT FLAG8170$: CMP (R2),#96. ;IS IT AN EVENT FLAG OR ROUTINE ADDR# BLOS 180$ ;IF LOS THEN EVENT FLAGD$ BIT #1,R2 ;MAKE SURE LEGAL ADDRESS BNE 300$ ;IF NE ERROR2 MOV R2,S.WEFN(R4) ;SET COMPLETION ROUTINE ADDRESS BR 200$ ;GO EXIT-180$: CMP (R2),#64. ;GROUP GLOBAL EVENT FLAG?R BHI 300$ ;IF HI YES, ERROR TST (R2) ;CHECK EFN LEGALITY BLE 300$ ;IF LE THEN ILLEGAL+ MOV (R2),S.WEFN(R4) ;SET EVENT FLAG NUMBERT# CLEF$S (R2) ;CLEAR THE EVENT FLAGE BCS 300$ ;ILLEGAL EVENT FLAG2 BIS #S$WEFN,S.WFL2(R4) ;NOTE THAT EVENT FLAG USED200$: CLC ;FLAG ALL IS WELLB BR 900$ ;RETURNH;E3;SOME SORT OF ERROR--RESET SP AND RE00 D%B11110010TURN WITH C-SETE;0.300$: MOV R5,SP ;RESTORE SP TO ORIGINAL VALUE" SEC ;LET CALLER KNOW OF PROBLEM!900$: JMP (R3) ;RETURN TO CALLERO + .SBTTL .K.DLY SETUP/CHECK DELAY FROM STARTT;+3; .K.DLY -- SETUP/CHECK 'LDELAY' ARGUMENT FOR SWEEPL;M ; INPUTS:E;R(; (SP) ADDRESS OF 'LDELAY' ARGUMENT OR 0 ; R4 SWEEP CONTROL BLOCK POINTER#; R5 ORIGINAL SP AS SETUP BY .K.PAAW;( ; OUTPUTS:;E; C-CLEAR SETUP OK; .KADLY ZERO OR DELAY;&; C-SET CLOCK ACTIVE, OR DELAY ILLEGAL"; SP RESET TO VALUE BEFORE .K.PAA;0; REGISTERS ALTERED:;R; R3,R2R;N;--.K.DLY::MOV (SP)+,R3 ;PICK OFF RETURN ADDRESSM( MOV (SP)+,R2 ;GET 'LDELAY' ADDRESS OR 0 BNE 20$ ;IF NE GO USE IT& MOV #.ZEROW,R2 ;SET ADDRESS OF A ZERO20$: .IF DF K$$W11" TST .KAFLG ;IS THE CLOCK ACTIVE? BMI 60$ ;IF MI YES/ BIT #S$WA$D,S.WFL2(R4) ;IS THIS THE A/D SWEEP?I$ BNE 40$ ;IF NE YES--DELAY IS LEGAL0 BIT #S$WNOV,S.WFLG(R4) ;NO--IS IT CLOCK DRIVEN?& BNE 60$ ;IF NE YES--DELAY IS ILLEGAL'40$: MOV (R2),.KADLY ;NO--SET THE DELAYA BEQ 100$ ;IF EQ NO DELAY& NEG .KADLY ;MAKE IT TWO'S COMPLEMENT2 BIS #S$WDLY,S.WFL2(R4) ;NOTE THAT DELAY NECESSARY BR 80$ ;RETURN .ENDC ;K$$W11; ;CLOCK IS ACTIVE ALREADY;A(60$: TST (R2) ;WAS AN LDELAY SPECIFIED? BEQ 80$ ;IF EQ NO--OKO70$: SEC ;YES--ERROR MOV R5,SP ;RESET SP ON ERROR BR 100$ ;GO RETURN80$: CLC ;GOOD RETURNS!100$: JMP (R3) ;RETURN TO CALLERL .END--IS IT CLOCK DRIVEN?& BNE 60$ ;IF NE YES--DELAY IS ILLEGAL'40$: MOV (R2),.KADLY ;NO* .TITLE KSTADC SET A/D CHANNEL INFORMATION .IDENT /02.01/; ; COPYRIGHT (C) 1977, 1978, 1980/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 02.01 ; B. SCHREIBER 16-AUG-77;E; MODIFIED BY:;U; M. S. HARVEY 3-JAN-80T/; MSH081 -- CORRECT ARGUMENT VALIDATION CHECKS;O9; HB021 -- FLAG SETADC CALLED WHEN CALL .ADGCH SUCCEEDS;N;C?; THIS ROUTINE SETS UP A/D CHANNEL INFORMATION FOR AN A/D SWEEPI; ; SYSTEM MACRO CALLS;  .MCALL KSWDF$ KSWDF$T ;+'; SETADC -- SET A/D CHANNEL INFORMATION ;U; CALLING SEQUENCE: ; 5; CALL SETADC(IBUF,[IFLAG],[ICHN],[NCHN],[INC],[IND]) ; OR0; INC = (IBUF,[IFLAG],[ICHN],[NCHN],[INC],[IND]);S ; INPUTS:-;-1; IBUF (IGNORED--PRESENT FOR LPA11 COMPATIBILITY)TA; IFLAG IS 0 (DEFAULT) IF ABS CHANNEL ADDRESSING, NON-0 OTHERWISE-1; ICHN IS THE FIRST CHANNEL NUMBER (DEFAULT IS 0)9; NCHN IS THE NUMBER OF CHANNEL INCREMENTS (DEFAULT IS 1)/9; INC IS THE SIZE OF THE CHANNEL INCREMENT (DEFAULT IS 1); USE 2 FOR DIFFERENTIAL INPUT ; ; OUTPUTS:;T!; IND 0 IF ILLEGAL CHANNEL NUMBER; 1 IF ALL OK.; CHANNEL INFORMATION SET IN SWB FOR A/D SWEEP; ;-SETADC:: ;REF LABEL,ISTADC:: ;REF LABELU/ CALL .K.PAA ;VALIDATE AND SETUP ARGS ON STACKA .WORD 6 ;SIX ARGUMENTS. .WORD 40 ;ALL MAY BE DEFAULTED (EXCEPT IBUF) BCS 100$ ;IF CS ERROR % MOV #.ADSWB,R4 ;POINT AT THE A/D SWBI, TST (SP)+ ;POP OFF IBUF ADDRESS (NOT USED)" CLR S.WFLG(R4) ;CLEAR SWEEP FLAGS/ MOV (SP)+,R3 ;GET 'IFLAG' AND SEE IF DEFAULTEDE BNE 10$ ;IF NE NOU% MOV #.ZEROW,R3 ;YES--POINT AT A ZERON10$: MOV (SP)+,R0 ;GET 'ICHN'E MOV (SP)+,R1 ;GET 'NCHN'R MOV (SP)+,R2 ;GET 'INC' BNE 20$ ;IF NE USE GIVEN 'INC'! MOV #.ONE,R2 ;DEFAULT 'INC' TO 1N&20$: CMP #2,(R2) ;DIFFERENTIAL INPUT? BNE 40$ 00#%DATADATADATADATADATADATADATA;IF NE NO;% BIS #S$WDIF,S.WFL2(R4) ;YES--FLAG ITS340$: MOV (R2),S.WCHI(R4) ;SET THE CHANNEL INCREMENT/9 BIS #S$WACA,S.WFL2(R4) ;FLAG ABSOLUTE CHANNEL ADDRESSINGS TST (R3) ;CHECK WITH 'IFLAG' BEQ 45$ ;IF EQ YES- BIC #S$WACA,S.WFL2(R4) ;NO--CLEAR BIT IN SWB3 BIS #7,S.WFLG(R4) ;SET GAIN BITS FOR .ADGCH TO SEE+(45$: MOV SP,R5 ;SET SAVED STACK POINTER' MOV R1,-(SP) ;SET ARGS BACK ONTO STACKI MOV R0,-(SP) ; ...( CALL .ADGCH ;SETUP CHANNEL INFORMATION50$: MOV #1,R0 ;ASSUME SUCCESS BCC 60$ ;IF CC CORRECT CLR R0 ;ELSE SET FOR FAILUREC60$: BIS #S$WADC,S.WFL2(R4) ;FLAG THAT WE WERE HERE (SETADC CALLED)A( MOV (SP)+,R5 ;GET ADDRESS OF IND OR 0  BEQ 80$ ;IF EQ NO 'IND' GIVENA$ MOV R0,(R5) ;STORE RESULT IN 'IND'80$: RETURN ;BACK TO CALLERW;; HERE IF ERROR FROM .K.PAAB; (100$: CLR R0 ;CLEAR FOR FUNCTION RETURN CLR R3 ;SET CODE FOR .IESTOP& MOV #6,R4 ;STORE INTO SIXTH ARGUMENT- CALLR .IESTO ;TRY TO STORE ERROR AND RETURNA .END: MOV #1,R0 ;ASSUME SUCCESS BCC 60$$ .TITLE KSTB SETUP BUFFERS FOR SWEEP .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 19-JUL-77;E<; THIS MODULE SETS UP THE BUFFER INFORMATION PART OF THE SWB;T; SYSTEM MACRO CALLS;T .MCALL KSWDF$ KSWDF$  2 .SBTTL .K.STB SET UP BUFFER INFORMATION FOR SWEEP;+'; .K.STB -- SETUP BUFFER INFO FOR SWEEP ;C ; INPUTS:U;1; R4 POINTS TO SWEEP CONTROL BLOCK WHICH HAS BEENT; SETUP BY .K.SET;N ; OUTPUTS:;; C-CLEAR ALL OK:; THE BUFFER POINTERS (CURRENT AND INITIAL) ARE SETUP FOR%; EACH BUFFER SPECIFIED BY THE USER. ;D!; C-SET ILLEGAL NUMBER OF BUFFERSB;1; REGISTERS ALTERED:;L; R0-R3 ; ;-.K.STB::MOV R5,-(SP) ;SAVE R52 MOV S.WBPT(R4),R5 ;PICKUP POINTER TO 'IBUF' ARRAY ; (SETUP BY .K.SET)S- MOV R5,S.WUSW(R4) ;SET USER MODE USW ADDRESSS MOV R5,R0 ;COPY FOR .KRLOC CALL .KRLOC ;RELOCATE TO APR6I# MOV R1,S.WUSW+2(R4) ;SET APR6 BIASB& MOV R2,S.WUSW+4(R4) ;AND DISPLACEMENT* ADD #IB.DVQ,R5 ;POINT TO THE DEVICE QUEUE4 MOVB (R5),S.WBNO(R4) ;GET THE CURRENT BUFFER SET UP3 BMI 220$ ;IF MI RLSBUF HAS NOT BEEN CALLED--ERRORO .REPT 7' MOVB 1(R5),(R5)+ ;MOVE THE QUEUE DOWN  .ENDM! MOVB #-1,(R5) ;MARK END OF QUEUEP) MOV S.WBPT(R4),R5 ;GET PTR TO IBUF AGAIN 0 ADD #IB.NBF,R5 ;POINT TO NUMBER OF BUFFERS WORD3 MOV (R5)+,-(SP) ;PUSH NUMBER OF BUFFERS ONTO STACKC BLE 200$ ;IF LE THEN ERROR) CMP (SP),#8. ;CHECK FOR TOO MANY BUFFERSV BHI 200$ ;IF HI YESI. CLRB 1(SP) ;@SP=<#BUFFERS>,;E9; RUN THROUGH THE USER BUFFER LIST AND RELOCATE AS NEEDEDB;2/20$: MOV (R5)+,R0 ;GET NEXT USER BUFFER ADDRESS CALL .KRLOC ;RELOCATE TO APR6V! MOVB 1(SP),R3 ;GET BUFFER NUMBERV ASL R3 ;MULTIPLY ASL R3 ; BY 4W5 ADD R4,R3 ; TO INDEX INTO THE SWEEP CONTROL BLKI: ADD #S.WIBP,R3 ;INDEX INTO S.WIBP INITIAL BUFFER POINTERS4 MOV R1,(R3)+ ;SET APR6 BIAS (0 ON UNMAPPED SYSTEMS)7 MOV R2,(R3)+ ;SET DISPLACEMENT (PHYS ADDR ON UNMAPPED)F> CMPB 1(SP),S.WBNO(R4);IS THIS BUFFER THE FIRST BUFFER TO USE? BNE 40$ ;IF NE NOB3 MOV R1,S.WBPT(R4) ;YES--SET CURRENT BUFFER POINTER+ MOV R2,S.WBPT+2(R4) ; ...40$: INCB 1(SP) ;NEXT BUFFER  DECB (SP) ;MORE TO DO? BGT 20$ ;IF GT YES CLR (SP)+ ;NO--CLEAR STACK00+,1 D%B11110010 BR 300$ ;GO RETURN; ; ILLEGAL NUMBER OF BUFFERSO;L4200$: TST (SP)+ ;CLEAR NUMBER OF BUFFERS FROM STACK220$: SEC ;FLAG AN ERROR300$: MOV (SP)+,R5 ;RESTORE R5 RETURN ;RETURN WITH C CORRECT .ENDDDR ON UNMAPPED)F> CMPB 1(SP),S.WBNO(R4);IS THIS BUFFER THE FIRST BUFFER TO USE? BNE 40$ ;IF NE NOB3 MOV R1,S.WBPT(R4) ;YES--SET CURRENT BUFFER POINTER+ MOV R2,S.WBPT+2(R4) ; ...40$: INCB 1(SP) ;NEXT BUFFER  DECB (SP) ;MORE TO DO? BGT 20$ ;IF GT YES CLR (SP)+ ;NO--CLEAR STACK) .TITLE KSTIBF SETUP IBUF ARRAY FOR SWEEP .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 15-AUG-77;E'; THIS ROUTINE SETS UP THE 'IBUF' ARRAYT A;+#; SETIBF -- INITIALIZE 'IBUF' ARRAYR; 3; THIS ROUTINE SETS UP THE 'IBUF' ARRAY FOR A SWEEPL;T; CALLING SEQUENCE:C;8; CALL SETIBF (IBUF, IND, LPATAB, BUF1, BUF2,... , BUFN);I ; INPUTS:O;E#; IBUF IS AN ARRAY OF DIMENSION 40.M#; BUFN IS THE ADDRESS OF BUFFER 'N'R1; LPADTB UNUSED--PRESENT FOR LPA-11 COMPATIBILITY ; ; OUTPUTS:;O; IND RETURNS THE STATUS4; 0 TOO MANY BUFFERS--ADJUSTED FOR MAXIMUM (N$$MBF); 1 IBUF SET OK ; THE IBUF ARRAY IS INITIALIZED;T;-)SETIBF::MOVB (R5),R1 ;GET # OF ARGUMENTS' TST (R5)+ ;SKIP COUNTERU MOV (R5)+,R2 ;GET IBUF ADDRESS  MOV (R5)+,R3 ;GET IND ADDRESS INC R3 ;CHECK FOR -1 BEQ 5$ ;IF EQ LEAVE IT 0 DEC R3 ;GET ADDRESS BACK MOV #1,(R3) ;INIT TO SUCCESS5$: TST (R5)+ ;SKIP LPATABR# SUB #3,R1 ;ONLY COUNT THE BUFFERSP: MOV #I$BFVW,(R2)+ ;SET THE IBUF VALIDATION WORD INTO WD 1& CLR (R2)+ ;CLEAR SECOND WORD OF IBUF MOV #-1,(R2) ;INITIALIZE QUEUES .REPT 9.  MOV (R2)+,(R2) ;... .ENDM TST (R2)+ ;MOVE TO NEXT WORD) CMP R1,#N$$MBF ;LEGAL NUMBER OF BUFFERS?O BLOS 10$ ;IF LOS YES. MOV #N$$MBF,R1 ;NO--SET FOR MAX WE CAN HANDLE TST R3 ;SEE IF IND DEFAULTED, BEQ 10$ ;IF EQ YES--SKIP STATUS ALTERATION, CLR (R3) ;NOTE THAT TOO MANY BUFFERS GIVEN(10$: MOV R1,(R2)+ ;SET NUMBER OF BUFFERS220$: MOV (R5)+,(R2)+ ;SET BUFFER ADDRESS INTO IBUF DEC R1 ;DONE?  BGT 20$ ;IF GT NOE RETURN  .ENDBUF MOV #-1,(R2) ;INITIALIZE QUEUES .REPT 9.  MOV (R2)+,(R2) ;... .ENDM TST (R2)+ ;MOVE TO NEXT WORD) CMP R1,#N$$MBF ;LEG .TITLE KSTOP STOP A SWEEP .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 16-AUG-77; ; SYSTEM MACRO CALLS;O .MCALL KSWDF$ KSWDF$  ( .SBTTL STPSWP STOP AN IN PROG0036DATADATADATADATADATADATADATARESS SWEEP;+%; STPSWP -- STOP AN IN-PROGRESS SWEEP ;M; CALLING SEQUENCE:;I ; CALL STPSWP (IBUF, IWHEN, IND);I ; INPUTS:O;A2; IBUF IS THE IBUF USED IN A CALL TO START A SWEEP ; IWHEN SPECIFIES THE STOP TIME:; 0 IMMEDIATELY (DEFAULT) ; +N AT END OF CURRENT BUFFER ; -N (RESERVED)O; IND RETURNS THE STATUS+; 0 COULD NOT FIND SWB OR SWEEP NOT ACTIVEE; 1 SWEEP STOPPED;R ; OUTPUTS:; ; THE SWEEP IS STOPPED;;-STPSWP:: ;REF LABEL & CALL .K.PAA ;VALIDATE ARGS AND STACK .WORD 3 ;THREE ARGST .WORD 4 ;IBUF REQUIRED BCS 80$ ;IF CS CAN'T HELP OUTA CLR R2 ;ASSUME FAILURE MOV (SP)+,R0 ;GET IBUF ADDRESS  CALL .FDSWI ;FIND SWBO BCC 10$ ;IF CC CONTINUEC TST (SP)+ ;POP IWHEN ADDRESS BR 60$ ;FINISH UP %10$: MTPS #PR6 ;;;DISABLE INTERRUPTS(/ MOV #S$WSEB,R0 ;;;ASSUME STOP AT END OF BUFFERN" MOV (SP)+,R3 ;;;GET IWHEN ADDRESS. BEQ 20$ ;;;IF EQ DEFAULTED--STOP IMMEDIATELY" TST (R3) ;;;NO--SEE WHEN TO STOP( BNE 40$ ;;;IF NE STOP AT END OF BUFFER&20$: MOV #S$WSTP,R0 ;;;SET TO STOP NOW; CLR S.WCNT(R1) ;;;THIS SHOULD FORCE A BUFFER SWITCH TO GET % ;;; THE ISR TO REALIZE HE IS DONEU+40$: BIS R0,S.WFL2(R1) ;;;SET THE STOP FLAG$ MTPS #0 ;;;ALLOW INTERRUPTS  INC R2 ;SET SUCCESS "60$: MOV (SP)+,R0 ;GET IND ADDRESS BEQ 80$ ;IF EQ NOT SUPPLIEDS MOV R2,(R0) ;SET STATUS 80$: RETURNM .ENDR3 ;;;GET IWHEN ADDRESS. BEQ 20$ ;;;IF EQ DEFAULTED--STOP IMMEDIATELY" TST (R3) ;;;NO--SEE WHEN TO STOP( BNE 40$ ;;;IF NE STOP AT END OF BUFFER1 .TITLE KSUB SINGLE PRECISION FL. PT. SUBTRACTION .IDENT /M02.00/A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;:; COPYRIGHT (C) 1977, 1978, DIGITAL EQUIPMENT CORPORATION.; H.J.;+'; .KSUB -- SINGLE PRECISION SUBTRACTION;); THIS ROUTINE SUBTRACTS R2:R3 FROM R0:R1; ; INPUTS:;,; R0:R1, R2:R3 SINGLE PRECISION REAL NUMBERS; ; OUTPUTS:;; R0:R1 = R0:R1 - R2:R31; PRECISION SHOULD BE GOOD TO 24 BITS OF MANTISSAL;R;-,.KSUB:: ADD #100000,R2 ;NEGATE SECOND NUMBER MOV R4,-(SP) ;SAVE R4 AND R5R MOV R5,-(SP)M2 MOV #2,R5 ;R5 GETS SIGNS AND C GETS 1 EVENTUALLY ASL R0 ;GET SIGN OF 1 BEQ NOAD1 ;ITS 0., RESULT IS 2 ROR R5 ;SAVE SIGNR ASL R2 ;GET SIGN OF 2K BEQ NOAD2 ;ITS 0., RESULT IS 1 RORB R5 ;SAVE ITS SIGN' MOV R5,-(SP) ;PUT SIGNS AWAY FOR LATER, RORB R0 ;CARRY IS 1 - SET IMPLIED NORM BIT MOV R0,R4 ;MAKE COPY OF IT CLRB R4 ;ISOLATE EXPONENTO+ BIC R4,R0 ;CLEAR EXPONENT OUT OF MANTISSA SWAB R4 ;GET EXPONENT, SEC ;PERFORM SAME FOR 2 RORB R2 MOV R2,R5 CLRB R5 BIC R5,R2# SWAB R5 ;R4 IS EXP 1, R5 IS EXP 2T=;WE WANT R5 TO BE FINAL EXPONENT AND R4 TO BE NEGATIVE SCALERR# SUB R5,R4 ;HOW ARE WE NORMALIZED?L BEQ ALGND ;PERFECT+ BMI 5$ ;1 IS SMALLER, SCALE IT TO 2'S EXPS# ADD R4,R5 ;1 IS BIGGER, SWITCH'EMS NEG R4 ;FIX SHIFT COUNT  SWAB (SP) ;CORRECT SIGNS MOV R2,-(SP) ;SWITCH MANTISSA'S MOV R3,R2 MOV R1,R3 MOV R2,R1 MOV R0,R2 MOV (SP)+,R0U F*5$: CMP #-9.,R4 ;IS SHIFT LESS THAN BYTE?$ BLT BITSHF ;BRANCH IF YES TO DO IT& ADD #16.,R4 ;IS SHIFT LESS THAN WORD) BGE BYTSHF ;BRANCH IF YES TO BYTE SHIFT & CLR R1 ;SHIFT > WORD, CLEAR LOW WORD! ADD #8.,R4 ;IS SHIFT > 24 BITS?L) BGE WRDSHF ;BRANCH IF NOT TO WORD SHIFTS' ;ADDEND IS INSIGNIFICANT - CLEAN UP54INAD: ASL R3 ;FORCE MANTISSA UP FOR PUTTING IN SIGN$ ROL R2 ;ALWAYS LEAVES CARRY CLEAR!%INAD2: SWAB R5 ;PUT EXP IN HIGH PARTM3 BISB R2,R5 ;PUT IN MANTISSA WITHOUT IMPLIED BIT!!! ROLB (SP)+ ;GET SIGN FROM STACKN ROR R5 ;PUT INTO RESULTH ROR R3 ;RESCALE LOW PART* MOV R5,R2 ;MOVE HIGH PART TO RESULT SPOT&NOAD1: MOV (SP)+,R5 ;RESTORE REGISTERS MOV (SP)+,R4L" MOV R2,R0 ;SET RESULT INTO R0:R1 MOV R3,R1 ;... RETURN ;DONEINOAD2: ROL R5 ;GET SIGN OF 1  ROR R0 ;PUT BACK INTO IT MOV R0,R2 ;MOVE TO RESULT REGS MOV R1,R3! BR NOAD1 ;BRANCH INTO EXIT CODEA4BYTSHF: CLRB R1 ;BYTE SHIFT, LOW BYTE INSIGNIFICANT SWAB R1 ;PERFORM BYTE SHIFTH00;-@1 D%B11110010 SWAB R04WRDSHF: BIS R0,R1 ;MOVES R0 INTO CORRECT BYTE OF R1- CLR R0 ;R0 ONLY HAD 1 BYTE, NOW IT HAS NONE SUB #8.,R4 ;REFIX SHIFT COUNTS#BITSHF: ASR R0 ;NORMALIZE TO COUNTE ROR R1S INC R4P BMI BITSHF ;BRANCH IF NOT DONE- ROL R4 ;R4 IS ZERO FROM SHIFT LOOP - SET IT+ ADD R4,R1 ;TO THE ROUNDING BIT AND ROUND.  ADC R0 1ALGND: CMPB 1(SP),(SP) ;SEE IF SIGNS ARE THE SAMEB* BNE SUBT ;BRANCH IF NOT SAME TO SUBTRACT ADD R1,R3 ;ADD LOW PARTS ADC R2 ;ADD IN CARRY TO HIGH ADD R0,R2 ;ADD HIGH PARTSS. CMP #377,R2 ;ANOTHER HACK TO HANDL@ OVERFLOW. BCC INAD ;BRANCH IF NO CARRY OUT OF MANTISSA- INCB R5 ;BUMP EXP SINCE WE DON'T SHIFT LEFT 1 BEQ 1$ ;CANT ALTER CARRY SO WE USE INCB AND BEQB- SBC R4 ;THIS CLEARS THE CARRY IF R4=1, THUSO' ;PREVENTING US FROM ROUNDING TWICE.T& ADC R3 ;NOW ROUND WITH THE CAREFULLY BCC INAD2 ;(SHORTCUT); ADCB R2 ;MANIPULATED CARRY.E0 ADCB R5 ;BUMP EXP IF MANTISSA OVERFLOWED TWICE. BCC INAD2 ;WE ARE EVER VIGILANT FOR OVERFLOW1$: ;REF LABELH SETZ: CLR R2 CLR R3 ;ZERO THE RESULTO0NOAD0: CMP (SP)+,R0 ;POP THE SIGNS OFF THE STACK BR NOAD1 ;AND GO STORE ITM X$SUBT: SUB R1,R3 ;SUBTRACT LOW PARTS SBC R2 ;REDUCE HIGH BY CARRY SUB R0,R2 ;SUBTRACT HIGH PARTS+ BMI 2$ ;MAKE POSITIVE AND FIX RESULT SIGNF% TSTB R2 ;ARE WE ALREADY NORMALIZED?N BMI INAD ;BRANCH IF YESI DEC R5 ;ADJUST EXPONENT2 BLE 6$ ;BRANCH IF UNDERFLOW5! ASR R4 ;SHIFT ROUND BIT BACK INT ROL R3 ;NORMALIZE 1 PLACER ROL R2 , BEQ 3$ ;BRANCH IF HIGH PART 0 TO CHECK LOW(5$: TSTB R2 ;ARE WE ALREADY NORMALIZED? BMI INAD ;BRANCH IF YEST ASL R3 ;NORMALIZE RESULT ROL R2M DEC R5 ;ADJUST EXP&4$: BGT 5$ ;BRANCH IF DIDNT UNDERFLOW6$: ;REF LABELR BR SETZ ;GO SET RESULT TO 0.$2$: SWAB @SP ;SWITCH RESULTANT SIGN NEG R2 ;MAKE RESULT UNSIGNED NEG R3 SBC R2 ' BGT 5$ ;BRANCH IF NOT ZERO TO NORM ITN&3$: MOV R3,R2 ;START WITH 8 BIT SHIFT2 BEQ NOAD0 ;BRANCH IF LOW PART ZERO, RESULT IS 0.& SWAB R3 ;TEST HIGH PART OF LOW ORDER) BEQ 1$ ;BRANCH IF ZERO FOR 16 BIT SHIFTE! CLR R2 ;IF NOT JUST 8 BIT SHIFTR0 BISB R3,R2 ;MOVE HIGH PART OF LOW ORDER 8 BITS CLRB R3 ;REMOVE THEM SUB #8.,R5 ;ADJUST EXP BR 4$ ;NORMALIZE WHATS LEFTR1$: CLR R3 ;CLEAR LOW ORDER SUB #16.,R5 ;ADJUST EXPE' BR 4$ ;NORMALIZE WHATS LEFT, OPTIMIZEN$ ;TO COMBINE WITH JUST ABOVE CODE .END ZERO TO NORM ITN&3$: MOV R3,R2 ;START WITH 8 BIT SHIFT2 BEQ NOAD0 ;BRANCH IF LOW PART ZERO, RESULT IS 0.& SWAB R3 ;TEST HIGH PART OF LOW ORDER)- .TITLE KSWDF SWEEP CONTROL BLOCK DEFINITIONSO .IDENT /M01.01/;I ; COPYRIGHT (C) 1977, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.C;E>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01.01 ; B. SCHREIBER 6-JUL-77E;E; MODIFIED BY:;U; M. S. HARVEY 13-MAY-795; MSH035 -- DEFINE INTERRUPT CONTROL FLAG FOR DR11-KA;O;R;; THIS MODULE DEFINES THE SWEEP CONTROL BLOCK (SWB) OFFSETS+; AND FLAG VALUES CONTAINED WITHIN THE SWB.J  .MACRO KSWDF$;+#; SWB - SWEEP CONTROL BLOCK OFFSETS ;OC; THERE IS ONE SWEEP CONTROL BLOCK FOR EACH POSSIBLE TYPE OF SWEEP:R>; A/D, D/A, DIGITAL INPUT, DIGITAL OUTPUT, GATHERING HISTOGRAM; DATA. ;C;- .ASECTE.=0C2S.WLNK: .BLKW 1 ;LINK TO NEXT SWEEP CONTROL BLOCK%S.WFLG: .BLKW 1 ;SWEEP CONTROL FLAGS-S.WFL2: .BLKW 1 ;MO00-C6DATADATADATADATADATADATADATARE FLAGSBS.WUSW: .BLKW 3 ;USER STATUS WORD: USER, EXEC APR6 RELOC AND BIAS'S.WBNO: .BLKB 1 ;CURRENT BUFFER NUMBER  .BLKB 1 ;SPARE BYTEI!S.WEBF: .BLKB 1 ;BUFFER IN ERROR7S.WLBF: .BLKB 1 ;LAST BUFFER COMPLETED (SEE KRWBF.MAC)S/S.WIBP: .BLKW 2*N$$MBF ;INITIAL BUFFER POINTERSF;S.WBPX: .BLKW 1 ;POINTER TO S.WBPT <.+2>(+RELOC IF MAPPED)G)S.WBPT: .BLKW 2 ;CURRENT BUFFER POINTERS(S.WSIZ: .BLKW 1 ;SIZE OF BUFFER (WORDS)/S.WCNT: .BLKW 1 ;COUNT OF WORDS LEFT IN BUFFER @S.WNBF: .BLKW 1 ;NUMBER OF BUFFERS TO FILL OR NEGATIVE IF CONT- ; INUOUS SAMPLING ?S.WEFN: .BLKW 1 ;0, EFN, OR ADDRESS OF USER COMPLETION ROUTINE13S.WSCR: .BLKW 1 ;SYNCHRONOUS CLOCK ROUTINE ADDRESS.S.WSTS: .BLKW 1 ;FINAL STATUS1S.WSTR: .BLKW 1 ;SCHMITT TRIGGER ROUTINE ADDRESST! ;**NOTE**USER VIRTUAL ADDRESS .S.WEFM: .BLKW 1 ;EVENT FLAG MASK (FROM $CEFI)1S.WEFA: .BLKW 1 ;EVENT FLAG ADDRESS (FROM $CEFI) 5S.WKNT: ;VIRTUAL ADDRESS, EXEC APR6 RELOC AND BIASN1 ;OF KOUNT PARAMETER FOR GTHIST. NOTE: THESER4 ;THREE WORDS OVERLAP S.WMSK, S.WCSR, AND S.WPRI.8S.WMSK: .BLKW 1 ;MASK OF BITS TO SIMULATE ST1 ON (DR11))S.WCSR: .BLKW 1 ;ACTIVE UNIT CSR ADDRESSR0S.WPRI: .BLKW 1 ;DEVICE HARDWARE PRIORITY LEVEL .IF DF FT$MOP .IF NDF M$$MGEM3S.WCLX: ;ACTIVE CLOCK QUEUE--UNMAPPED EXEC LEVELA .IFF ;M$$MGEE2S.WCLX: .BLKW 1 ;ACTIVE CLOCK QUEUE--APR5 MAPPING .ENDC ;M$$MGE2S.WCLQ: .BLKW 1 ;ACTIVE CLOCK QUEUE--TASK MAPPING .ENDC ;FT$MOP*S.WUBX: ;DR11 UNIT CONTROL BLOCK OFFSET ;+ ; FOLLOWING CELLS ARE FOR AD/DA SWEEP ONLYS ;>S.WCHB: .BLKB 1 ;CHANNEL BYTE TO LOAD IN HIGH BYTE OF A/D CSR-S.WCBX: .BLKB 1 ;SAVED ORIGINAL CHANNEL BYTE )S.WICH: .BLKW 1 ;STARTING CHANNEL NUMBERW(S.WCCH: .BLKW 1 ;CURRENT CHANNEL NUMBER5S.WHCH: .BLKW 1 ;HIGHEST CHANNEL ACCESSED THIS SWEEPE7S.WCHX: .BLKW 1 ;NUMBER OF CHANNELS (RESET FOR S.WNCH)Q2S.WNCH: .BLKW 1 ;NUMBER OF CHANNELS (DECREMENTED),S.WMXC: .BLKW 1 ;MAXIMUM NUMBER OF CHANNELS#S.WCHI: .BLKW 1 ;CHANNEL INCREMENTL0S.WGNW: .BLKW 1 ;DATA WORD FOR GAIN INFORMATION0S.WUNT: .BLKW 1 ;NUMBER OF UNITS ON THIS DEVICE0S.WAUA: .BLKW 1 ;OFFSET TO ACTIVE UCB. (ADD R4) S.WUCB: ;THE UCB'S START HERE;+"; UCB - UNIT CONTROL BLOCK OFFSETS; (; UCB'S ARE USED BY THE ADSWP, AND DASWP,; THE DR11 UCB HAS U.FLG, U.IVEC, AND U.OVEC;.;-.=0 U.FLG: .BLKW 1 ;UNIT FLAGSO%U.IVEC: ;DR11 INPUT VECTOR ADDRESS U.VEC: .BLKW 1 ;VECTOR ADDRESSB&U.OVEC: ;DR11 OUTPUT VECTOR ADDRESS!U.CSR: .BLKW 1 ;CSR OF THIS UNIT.-U.MAXC: .BLKW 1 ;MAX # CHANNELS ON THIS UNITU.LGTH=.;+; OFFSETS INTO IBUF ARRAYI;-.=0 "IB.IOS: .BLKW 2 ;I/O STATUS BLOCK#IB.USQ: .BLKW 5 ;USER BUFFER QUEUE%IB.DVQ: .BLKW 5 ;DEVICE BUFFER QUEUES#IB.NBF: .BLKW 1 ;NUMBER OF BUFFERSA$IB.BUF: ;BEGINNING OF BUFFER LIST C;+4; FLAGS IN THE SWEEP CONTROL BLOCK (SWB) WORD S.WFLG;-7S$WAST = 100000 ;AST REQUEST FOR THIS SWEEP (SIGN BIT)C;(FREE) = 40000 ; ;(FREE) = 20000 ;R;(FREE) = 10000 ;W;(FREE) = 4000 ;.'S$WTSS = 2000 ;TIME-STAMPED SAMPLINGS4S$WNOV = 1000 ;NON-CLOCK OVERFLOW DRIVEN SAMPLING&S$WEXT = 400 ;EXTERNAL START (ST1);(FREE) = 200 ;K;(FREE) = 100 ;U1S$CTRL = 40 ;INTERRUPTS BY CONTROL LINE (DR11-K) +S$WAGR = 5 ;AUTO GAIN RANGING (AD11)I9S$WSIB = 2 ;SET INTENSIFY BIT AFTER X/Y PAIR (AA11)B4S$WEZB = 1 ;EXTERNAL EVENT TIME FROM ZERO BASE ; MODE (HISTOGRAM)3S$WSCW = 1 ;SCOPE CONTROL WORD PRESENT (AA11)(7S$WSTZ = 1 ;ST2 FIRING ZEROES COUNTER (HISTOGRAM) @S$WUSR = S$WTSS!S$WNOV!S$WEXT!S$CTRL!7 ;FLAGS WHICH USER MAY SET% ;(N O T E: SOME FLAGS IN LOW BYTES ; ARE NOT USED AT PRESENT);+; FLAGS IN WORD S.WFL2;-,S$WACT = 100000 ;SWEEP IS ACTIVE (SIGN BIT)/S$WDLY = 40000 ;SWEEP REQUESTS DELAY (LDELAY) +S$WDIF = 20000 ;DIFFERENTIAL INPUT (AD11)1/S$WEFN = 10000 ;EFN SETTING AS OPPOSED TO ASTR#S$WSTP = 4000 ;REQUESTED TO STOPS'S$WSEB = 2000 ;STOP AT END OF BUFFER(-S$WACA = 1000 ;ABSOLUTE CHANNEL ADDRESSINGN6S$WSST = 400 ;SIMULATE00-KM1 D%B11110010 SCHMITT TRIGGER (DIGO SETS)9S$WA$D = 200 ;THIS IS A/D SWEEP BLOCK (MUST BE 200!!)L(S$WADC = 100 ;SETADC HAS BEEN CALLED"S$WFRK = 40 ;FORK IN PROGRESS0S$WIOF = 20 ;INPUT (1) OR OUTPUT (0) (DR11)BS$W2CL = ^C ;CLEAR ALL BITS BUT THESE;+; FLAGS IN U.FLG;-9UF$ACT = 100000 ;UNIT WILL BE/IS ACTIVE IN CURRENT SWEEP;5UF$CIN = 40000 ;UNIT IS CONNECT TO INTERRUPT VECTORF%UF$AMK = 20000 ;AD11 HAS AM11 ON ITL D;+; FLAGS IN .KAFLG AND .KBFLG;-!K$ACTV = 100000 ;CLOCK IS ACTIVE #K$ADLY = 40000 ;DELAY IN PROGRESS "K$AGTD = 20000 ;GTHIST IS ACTIVE2K$ACIN = 10000 ;CLOCK IS CONNECTED TO INTERRUPTS(K$ACAC = 4000 ;CLOCKA HAS BEEN CALLED1K$AOVF = 2000 ;CLOCK A HAS OVERFLOWED (GTHIST)>6K$AFRK = 1000 ;FORK IN PROGRESS FOR CLOCK (MULTIPLE ;CLOCK DRIVEN SWEEPS ONLY) .PSECTI .MACRO KSWDF$ .ENDM .ENDM .ENDIS CONNECT TO INTERRUPT VECTORF%UF$AMK = 20000 ;AD11 HAS AM11 ON ITL D;+; FLAGS IN .KAFLG AND .KBFLG .NLIST .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY 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 EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; A; MACROS TO FACILITATE CALLING FORTRAN SUBROUTINES FROM MACRO-11.U;O ; VERSION 01; C. D'ELIA 17-NOV-77S;  S;+8; INITS -- INITIALIZE FOR STRUCTURED FORTRAN CALL MACROS;L; CALLING SEQUENCE:N; ; INITS; ; EFFECTS:;O; SETS THE GLOBAL LISTING FLAG; SETS THE ASSEMBLER PASS FLAG;L;- .MACRO INITS LST=0M$LST=LST .IF NDF $PASS$PASS=0P .IFF.$PASS=1E .ENDC .ENDM S L;+"; CALLS -- CALL FORTRAN SUBROUTINE;O; CALLING SEQUENCE:H; ; CALLS SUBR,;S; WHERE:;E ; SUBR IS THE SUBROUTINE TO CALL;R:; ARG1,..ARGN ARE THE ARGUMENTS TO PASS TO THE SUBROUTINE.1; THEY MAY EITHER BE CONSTANTS (1,5,8,12,ETC.-- ,; TAKEN AS DECIMAL NUMBERS ("." APPENDED))+; OR MEMORY LOCATIONS (IDATA, BUF, ETC.).N(; IF AN ARGUMENT IS DEFAULTED (",,") A-; MINUS 1 (177777) WILL BE INSERTED FOR THEF(; ARGUMENT ADDRESS (FORTRAN STANDARD).;. ; EXAMPLES:;; CALLS SUB1,<5,18,ARG3>; CALLS SUB2,N; CALLS SUB3,<,,,IOUT>;1;- .MACRO CALLS SUBR,ARGLST .PSECT $ARGL$$$1=.E .BLKB 2$NARG=01 .IRP X, .IF B .WORD 177777O .IFF .NTYPE $T,X .IF NE $T-67N .ERROR X ;INVALID ARGUMENTE .MEXITM .ENDC GENARG XE .ENDC $NARG=$NARG+1O .ENDM$$2=. .=$$1C .BYTE $NARG,0.=$$2T .PSECTL .IIF GT $LST, .LIST MOV #$$1,R5 JSR PC,SUBR .IIF GT $LST, .NLISTT .ENDM O A T A .MACRO GENARG ARG .IF DF $C'ARG .WORD $C'ARG> .PSECT $CONS$ .IF EQ .-$C'ARG$C'ARG: .WORD ARG'. .ENDC .PSECT $ARGL$ .IFFG .IF NDF $PASS .ERROR ;FAILED TO CALL "INITS" .MEXITA .ENDC .IF EQ $PASSO TSTARG ARG,\ARG .IFFP .WORD ARG .ENDC .ENDC .ENDM L A .MACRO TSTARG SYM,VAL .IF IDN , .PSECT $CONS$$C'SYM: .WORD SYM'.$ .PSECT $ARGL$ .WORD $C'SYMS .IFF. .WORD SYM .ENDC .ENDM .LIST PC,SUBR .IIF GT $LST, .NLISTT .ENDM O A T A .MACRO GENARG ARG .IF DF $C'ARG .WORD $C'ARG> .PSECT $CONS$ .IF EQ .-$C'ARG$C'ARG: .WORD ARG'. .ENDC .PSECT $ARGL$ .IFFG .IF NDF $PASS .ERROR ;FAILED TO CALL "INITS" .MEXITA .ENDC .IF EQ $PASSO TSTARG ARG,\ARG .IFFP .WORD ARG .ENDC00S6DATADATADATADATADATADATADATA<0O*9@>ZvE G  O .MACRO KDVDF$ .IF NDF L$$SI1;+/; KA$XXX - KW11-K CLOCK 'A' CSR BIT DEFINITIONS;-(KA$STF = 100000 ;ST1 EVENT HAS OCCURRED,KA$STI = 40000 ;ST1 EVENT INTERRUPT ENABLE2KA$STE = 20000 ;ST1 EVENT ENABLES KA$ENA (ENABLE ; COUNTER)(KA$RIM = 0400 ;REPEATED INTERVAL MODE*KA$EEM = 1000 ;EXTERNAL EVENT TIME MODE/KA$EZB = 1400 ;EXTERNAL EVENT TIME FROM ZERO ; BASE MODE3KA$MDF = 200 ;OVERFLOW OR COUNTER TO BUFFER XFR ; HAS OCCURRED,KA$MFE = 100 ;MODE FLAG INTERRUPT ENABLE3KA$OVF = 40 ;COUNTER 'A' OVERFLOW HAS OCCURREDA*;KA$RAT = 16 ;MASK FOR CLOCK 'A' RATE"KA$ENB = 1 ;ENABLE CLOCK 'A';+.; KB$XXX - KW11-K CLOCK 'B' CSR BIT DEFINTIONS;-3KB$OVF = 200 ;COUNTER 'B' OVERFLOW HAS OCCURREDM+KB$OIE = 100 ;OVERFLOW INTERRUPT ENABLE $KB$B2A = 40 ;FEED B TO A ENABLE&;KB$ATO = 20 ;AUTO INCREMENT MODE*;KB$RAT = 16 ;MASK FOR CLOCK 'B' RATE"KB$ENB = 1 ;CLOCK 'B' ENABLE;+3; AD$XXX - AD11-K A/D CONVERTOR CSR BIT DEFINITIONS ;-AD$ERR = 100000 ;ERROR FLAGAD$DON = 200 ;DONE FLAGK"AD$ENB = 100 ;INTERRUPT ENABLE7AD$OVE = 40 ;KW11-K OVERFLOW STARTS A/D CONVERSIONK9AD$ESE = 20 ;EXTERNAL EVENT INITIATES A/D CONVERSIONO%AD$GO = 1 ;START A/D CONVERSIONE;+4; DO$XXX - DR11-K DIGITAL OUTPUT CSR BIT DEFINITIONS4; DI$XXX - DR11-K DIGITAL INPUT CSR BIT DEFINITIONS;-7DO$FLG = 100000 ;EXTERNAL DATA ACCEPTED ON EXT. DEVICE )DO$ENB = 40000 ;ENABLE OUTPUT INTERRUPT-2DO$BUF = 4 ;OFFSET FROM CSR TO OUTPUT BUFFER6DI$FLG = 200 ;EXTERNAL DATA READY FROM EXT. DEVICE(DI$ENB = 100 ;ENABLE INPUT INTERRUPT1DI$BUF = 2 ;OFFSET FROM CSR TO INPUT BUFFERE  .IF NDF L$$PS1E;+3; DA$XXX - AA11-K D/A CONVERTOR CSR BIT DEFINITIONSD;-4DA$ERA = 10000 ;ERASE DATA IN STORAGE OSCILLOSCOPE!DA$WTU = 4000 ;WRITE THRU MODEIDA$STO = 2000 ;STORET2DA$BT9 = 1000 ;BIT 9 (DIGITAL SIGNAL AVAILABLE)DA$RDY = 200 ;READY #;DA$ENB = 100 ;INTERRUPT ENABLEB DA$EXD = 20 ;EXTERNAL DELAYDA$MDE = 14 ;MASK FOR MODEX'DA$FIE = 2 ;FAST INTENSIFY ENABLEB4DA$INT = 1 ;GENERATE INTENSIFY PULSE IN MODE 09DA$SCO=DA$ERA!DA$WTU!DA$STO$DA$BT9!DA$MDE!DA$FIE!DA$INT ;( ;BITS LEGAL FOR USER TO SET IN SCOPE ;CONTROL WORDE .IFF ;L$$PS1R4DA$ERA = 10000 ;ERASE DATA IN STORAGE OSCILLOSCOPE(DA$WTU = 4000 ;SET WRITE THROUGH MODEDA$STO = 2000 ;STORED DA$CHN = 1000 ;CHANNEL SELECT DA$COL = 400 ;COLOR SELECTDA$RDY = 200 ;READYE#;DA$ENB = 100 ;INTERRUPT ENABLE= DA$EXD = 20 ;EXTERNAL DELAYDA$MDE = 14 ;MODE(DA$FIE = 2 ;FAST INTENSIFY ENABLEDA$INT = 1 ;INTENSIFYD@DA$SCO = DA$ERA!DA$WTU!DA$STO!DA$CHN!DA$COL!DA$MDE!DA$FIE!DA$INT* ;BITS LEGAL FOR USER TO SET WITH SCOPE .ENDC ;L$$PS1 .IFF ;L$$SI10 .IF DF Q$$BUS;+!; KWV11 CLOCK CSR BIT DEFINITIONS0;-'KA$STF = 100000 ;ST2 EVENT HAS OCCURED;,KA$STI = 40000 ;ST2 EVENT INTERRUPT ENABLE)KA$STE = 20000 ;ST2 EVENT ENABLES CLOCK0:KA$MDF =00[M1 D%B11110010 200 ;OVERFLOW OR CTR TO BUFFR XFR HAS OCCURED'KA$OVF = 200 ;OVERFLOW HAS OCCURRED;.KA$IOO = 100 ;INTERRUPT ON OVERFLOW ENABLE"KA$MFE = 100 ;MODE FLAG ENABLE&;KA$RAT = 30 ;MASK FOR CLOCK RATE(KA$RIM = 2 ;REPEATED INTERVAL MODE*KA$EEM = 4 ;EXTERNAL EVENT TIME MODE9KA$EZB = 6 ;EXTERNAL EVENT TIME FROM ZERO BASE MODEIKA$ENB = 1 ;ENABLE CLOCK;+1; AD$XXX - ADV11 A/D CONVERTOR CSR BIT DEFINTIONSP;-AD$ERR = 100000 ;ERROR FLAG(AD$IEN = 40000 ;ERROR INTERRUPT ENABLEAD$DON = 200 ;DONE FLAGO"AD$ENB = 100 ;INTERRUPT ENABLE6AD$OVE = 40 ;CLOCK OVERFLOW STARTS A/D CONVERSION6AD$ESE = 20 ;EXTERNAL EVENT STARTS A/D CONVERSION%AD$GO = 1 ;START A/D CONVERSION ;+3; DO$XXX - DRV11 DIGITAL OUTPUT CSR BIT DEFINITIONSE3; DI$XXX - DRV11 DIGITAL INPUT CSR BIT DEFINITIONSR;-(DO$FLG = 100000 ;EXTERNAL DATA ACCEPTED)DO$ENB = 40 ;OUTPUT INTERRUPT ENABLER2DO$BUF = 2 ;OFFSET TO OUTPUT BUFFER FROM CSR%DI$FLG = 200 ;EXTERNAL DATA READYE(DI$ENB = 100 ;INPUT INTERRUPT ENABLE1DI$BUF = 4 ;OFFSET TO INPUT BUFFER FROM CSRV .ENDC ;Q$$BUS .ENDC ;L$$SI1 .MACRO KDVDF$ .ENDM .ENDMO .MACRO KSWDF$;+#; SWB - SWEEP CONTROL BLOCK OFFSETS-;VC; THERE IS ONE SWEEP CONTROL BLOCK FOR EACH POSSIBLE TYPE OF SWEEP:T>; A/D, D/A, DIGITAL INPUT, DIGITAL OUTPUT, GATHERING HISTOGRAM; DATA.E;=;- .ASECTP.=0T2S.WLNK: .BLKW 1 ;LINK TO NEXT SWEEP CONTROL BLOCK%S.WFLG: .BLKW 1 ;SWEEP CONTROL FLAGSNS.WFL2: .BLKW 1 ;MORE FLAGSBS.WUSW: .BLKW 3 ;USER STATUS WORD: USER, EXEC APR6 RELOC AND BIAS'S.WBNO: .BLKB 1 ;CURRENT BUFFER NUMBER1 .BLKB 1 ;SPARE BYTEM!S.WEBF: .BLKB 1 ;BUFFER IN ERROR 7S.WLBF: .BLKB 1 ;LAST BUFFER COMPLETED (SEE KRWBF.MAC)H/S.WIBP: .BLKW 2*N$$MBF ;INITIAL BUFFER POINTERST;S.WBPX: .BLKW 1 ;POINTER TO S.WBPT <.+2>(+RELOC IF MAPPED)T)S.WBPT: .BLKW 2 ;CURRENT BUFFER POINTERSP(S.WSIZ: .BLKW 1 ;SIZE OF BUFFER (WORDS)/S.WCNT: .BLKW 1 ;COUNT OF WORDS LEFT IN BUFFER @S.WNBF: .BLKW 1 ;NUMBER OF BUFFERS TO FILL OR NEGATIVE IF CONT- ; INUOUS SAMPLING ?S.WEFN: .BLKW 1 ;0, EFN, OR ADDRESS OF USER COMPLETION ROUTINE13S.WSCR: .BLKW 1 ;SYNCHRONOUS CLOCK ROUTINE ADDRESS.S.WSTS: .BLKW 1 ;FINAL STATUS1S.WSTR: .BLKW 1 ;SCHMITT TRIGGER ROUTINE ADDRESST! ;**NOTE**USER VIRTUAL ADDRESS .S.WEFM: .BLKW 1 ;EVENT FLAG MASK (FROM $CEFI)1S.WEFA: .BLKW 1 ;EVENT FLAG ADDRESS (FROM $CEFI) 5S.WKNT: ;VIRTUAL ADDRESS, EXEC APR6 RELOC AND BIASN1 ;OF KOUNT PARAMETER FOR GTHIST. NOTE: THESER4 ;THREE WORDS OVERLAP S.WMSK, S.WCSR, AND S.WPRI.8S.WMSK: .BLKW 1 ;MASK OF BITS TO SIMULATE ST1 ON (DR11))S.WCSR: .BLKW 1 ;ACTIVE UNIT CSR ADDRESSR0S.WPRI: .BLKW 1 ;DEVICE HARDWARE PRIORITY LEVEL .IF DF FT$MOP .IF NDF M$$MGEM3S.WCLX: ;ACTIVE CLOCK QUEUE--UNMAPPED EXEC LEVELA .IFF ;M$$MGEE2S.WCLX: .BLKW 1 ;ACTIVE CLOCK QUEUE--APR5 MAPPING .ENDC ;M$$MGE2S.WCLQ: .BLKW 1 ;ACTIVE CLOCK QUEUE--TASK MAPPING .ENDC ;FT$MOP*S.WUBX: ;DR11 UNIT CONTROL BLOCK OFFSET ;+ ; FOLLOWING CELLS ARE FOR AD/DA SWEEP ONLYS ;>S.WCHB: .BLKB 1 ;CHANNEL BYTE TO LOAD IN HIGH BYTE OF A/D CSR-S.WCBX: .BLKB 1 ;SAVED ORIGINAL CHANNEL BYTE )S.WICH: .BLKW 1 ;STARTING CHANNEL NUMBERW(S.WCCH: .BLKW 1 ;CURRENT CHANNEL NUMBER5S.WHCH: .BLKW 1 ;HIGHEST CHANNEL ACCESSED THIS SWEEPE7S.WCHX: .BLKW 1 ;NUMBER OF CHANNELS (RESET FOR S.WNCH)Q2S.WNCH: .BLKW 1 ;NUMBER OF CHANNELS (DECREMENTED),S.WMXC: .BLKW 1 ;MAXIMUM NUMBER OF CHANNELS#S.WCHI: .BLKW 1 ;CHANNEL INCREMENTL0S.WGNW: .BLKW 1 ;DATA WORD FOR GAIN INFORMATION0S.WUNT: .BLKW 1 ;NUMBER OF UNITS ON THIS DEVICE0S.WAUA: .BLKW 1 ;OFFSET TO ACTIVE UCB. (ADD R4) S.WUCB: ;THE UCB'S START HERE;+"; UCB - UNIT CONTROL BLOCK OFFSETS;H(; UCB'S ARE USED BY THE ADSWP, AND DASWP,; THE DR11 UCB HAS U.FLG, U.IVEC, AND U.OVEC;;-.=0BU.FLG: .BLKW 1 ;UNIT FLAGSE%U.IVEC: ;DR11 INPUT VECTOR ADDRESSBU.VEC: .BLKW 1 ;VECTOR ADDRESSM&U.OVEC: ;DR11 OUTPUT VECTOR ADDRESS!U.CSR: .BLKW 1 ;CSR OF THIS UNITN-U.MAXC: .BLK00cijkTADATADATADATADATADATAW 1 ;MAX # CHANNELS ON THIS UNITAU.LGTH=.;+; OFFSETS INTO IBUF ARRAYN;-.=0I"IB.IOS: .BLKW 2 ;I/O STATUS BLOCK#IB.USQ: .BLKW 5 ;USER BUFFER QUEUE'%IB.DVQ: .BLKW 5 ;DEVICE BUFFER QUEUEB#IB.NBF: .BLKW 1 ;NUMBER OF BUFFERS $IB.BUF: ;BEGINNING OF BUFFER LIST U;+4; FLAGS IN THE SWEEP CONTROL BLOCK (SWB) WORD S.WFLG;-7S$WAST = 100000 ;AST REQUEST FOR THIS SWEEP (SIGN BIT)L;(FREE) = 40000 ;M;(FREE) = 20000 ;T;(FREE) = 10000 ;.;(FREE) = 4000 ; 'S$WTSS = 2000 ;TIME-STAMPED SAMPLINGE4S$WNOV = 1000 ;NON-CLOCK OVERFLOW DRIVEN SAMPLING&S$WEXT = 400 ;EXTERNAL START (ST1);(FREE) = 200 ;B;(FREE) = 100 ;U;(FREE) = 40 ; +S$WAGR = 5 ;AUTO GAIN RANGING (AD11)B9S$WSIB = 2 ;SET INTENSIFY BIT AFTER X/Y PAIR (AA11)+4S$WEZB = 1 ;EXTERNAL EVENT TIME FROM ZERO BASE ; MODE (HISTOGRAM)3S$WSCW = 1 ;SCOPE CONTROL WORD PRESENT (AA11)07S$WSTZ = 1 ;ST2 FIRING ZEROES COUNTER (HISTOGRAM) 9S$WUSR = S$WTSS!S$WNOV!S$WEXT!7 ;FLAGS WHICH USER MAY SETN% ;(N O T E: SOME FLAGS IN LOW BYTE  ; ARE NOT USED AT PRESENT);+; FLAGS IN WORD S.WFL2;-,S$WACT = 100000 ;SWEEP IS ACTIVE (SIGN BIT)/S$WDLY = 40000 ;SWEEP REQUESTS DELAY (LDELAY)B+S$WDIF = 20000 ;DIFFERENTIAL INPUT (AD11)//S$WEFN = 10000 ;EFN SETTING AS OPPOSED TO ASTT#S$WSTP = 4000 ;REQUESTED TO STOPT'S$WSEB = 2000 ;STOP AT END OF BUFFERO-S$WACA = 1000 ;ABSOLUTE CHANNEL ADDRESSINGG6S$WSST = 400 ;SIMULATE SCHMITT TRIGGER (DIGO SETS)9S$WA$D = 200 ;THIS IS A/D SWEEP BLOCK (MUST BE 200!!) (S$WADC = 100 ;SETADC HAS BEEN CALLED"S$WFRK = 40 ;FORK IN PROGRESS0S$WIOF = 20 ;INPUT (1) OR OUTPUT (0) (DR11)BS$W2CL = ^C ;CLEAR ALL BITS BUT THESE;+; FLAGS IN U.FLG;-9UF$ACT = 100000 ;UNIT WILL BE/IS ACTIVE IN CURRENT SWEEP45UF$CIN = 40000 ;UNIT IS CONNECT TO INTERRUPT VECTOR %UF$AMK = 20000 ;AD11 HAS AM11 ON ITC N;+; FLAGS IN .KAFLG AND .KBFLG;-!K$ACTV = 100000 ;CLOCK IS ACTIVE$#K$ADLY = 40000 ;DELAY IN PROGRESSC"K$AGTD = 20000 ;GTHIST IS ACTIVE2K$ACIN = 10000 ;CLOCK IS CONNECTED TO INTERRUPTS(K$ACAC = 4000 ;CLOCKA HAS BEEN CALLED1K$AOVF = 2000 ;CLOCK A HAS OVERFLOWED (GTHIST)S6K$AFRK = 1000 ;FORK IN PROGRESS FOR CLOCK (MULTIPLE ;CLOCK DRIVEN SWEEPS ONLY) .PSECTI .MACRO KSWDF$ .ENDM .ENDMNNECT TO INTERRUPT VECTOR %UF$AMK = 20000 ;AD11 HAS AM11 ON ITC N;+; FLAGS IN .KAFLG AND .KBFLG;-!K$ACTV = 100000 ;CLOCK IS ACTIVE$#K$ .ENABLE SUBSTITUTION SET /UIC=[45,24] .OPEN TEMP.CMD-.10: .ASKS MS1 ENTER MODULE OR CR TO ASSEMBLE .IF MS1 = "" .GOTO 100 .ENABLE DATA%PIP 'MS1'.OBJ;*,[45,34]'MS1'.LST;*/DE9MAC 'MS1',[45,34]'MS1'/-SP=[45,10]KMLB/ML,KPRE/PA:1,'MS1' .DISABLE DATA .GOTO 10 .100: .CLOSE @TEMP.CMD PIP TEMP.CMD;*/DE SET /UIC=[45,24] PIP *.OBJ;*,[45,34]*.LST;*/DE:[1,54]KCOM/-HD/PI/MM,[1,54]KCOM/-SP,[1,54]KCOM=[45,24]KCOM[1,54]RSX11M.STB/SSC[1,1]EXELIB/LB/MSTACK=0#PAR=KCOM:0:20000/.ENDC .LIST;AD11-K A/D CONVERTER SUPPORTCA$$M11=0 ;AM11-K SUPPORT N$DR11=1 ;DR11-K SUPPORTR N$AA11=1 ;AA11-K D/A CONVERTERS)N$$SWB=5 ;NUMBER OF SWEEP CONTROL BLOCKS ; C; MACRO TO DEFINE JUMP TO SUBROUTINE WITH RETURN TO CALLER'S CALLERS;B .MACRO CALLR ARGK JMP ARG .ENDM;P3; MACROS TO REFERENCE PSW FOR NON-LSI-11 PROCESSORS$;F .IF NDF L$$SI1E .MA00lmnoqtuv;A; INDIRECT COMMAND FILE TO MAKE KLIB.MLB FOR K-SERIES SUBROUTINES;/DF:MAC+[45,10]KMLB/CR:20.:0.:5.=[45,10]KDVDF,KSWDF SET /UIC=[45,24] PIP K.OBS=*.OBJ SET /UIC=[1,1] LBR KLABLIB/CR=[45,24]K.OBS PIP [45,24]K.OBS;*/DE .ENABLE SUBSTITUTION SET /UIC=[1,1](.10: .ASKS MS1 MODULE NAME OR CR TO EXIT .IF MS1 = "" .GOTO 100 LBR KLABLIB/RP=[45,24]'MS1' .GOTO 10.100: &KADD2,LI:[45,34]KADD2/-SP=[45,10]KADD2&KRATE,LI:[45,34]KRATE/-SP=[45,10]KRATE .ENABLE QUIET .IF EQ "MCR" SET /DCL=TI: .DISABLE QUIETE2 .IF NE "[USER]" SET DEFAULT [USER]/NAMED .ENABLE QUIET TYPE HELLO.TXT$JOB HIYA [200/1] $MACRO HIYA $LINK HIYA $RUN HIYA$DATA WILLIE NELSON$EOD,$! COMMENT: HIYA ASSEMBLED, LINKED, AND RUN $RUN HIYABASIL WOLVERTON/$! COMMENT: HIYA RUN AGAIN WITH DIFFERENT DATA$EOJ DELETE DOCTOR.FEL;* DELETE NEW.FIL;* DELETE *.OBJ;* DELETE *.TSK;* DELETE NEWHI.MAC;* .ENABLE SUBSTITUTION .IFNDF .GOTO MCRSYS .SETS STCLI .IF EQ "DCL" SET TERM MCR.MCRSYS: .TESTFILE CLOCK.MAC .IF EQ 1 .GOTO OKAY ;F ; You must have the file "CLOCK.MAC" in your directory before you canG ; use this procedure. There should be a copy of the file available in? ; the directory containing this file. See your system manager ; /.OKAY: .OPEN CLKPRE.MAC .DATA .ENABL LC ;D ; This procedure allows you to assemble and build a version o00w~jkTADATADATADATADATADATAf the G ; VT-52/VT100 clock display program "CLOCK" that suits your taste and < ; your system.  ; MG ; Before you continue with this procedure, be sure that your VT100 (if;H ; you have one) is set to VT52 compatability mode. If you have a VT52, ; you''re all set.h ;A ; "CLOCK" displays the time in large block numbers 10 charactersnH ; high. The character normally used to make up the numerals is a solidK ; block (the graphic-mode equivalent of "a"). On some terminals, however,iF ; this character may not display as a solid block; or, you may prefer ; something else. ; .SETS TEMP "FORCHR = ''"B .SETS REGCHR "a"w; .ASK A Do you want to change the default display character  .IFF A .GOTO DEFCHR ;A ; Here is your selection. You can choose any character, but theLB ; lowercase characters translate to their graphic equivalents, as? ; shown below (the default is "a"; enter to preserve it).d ;# ;; abcdefghijklmnopqrstuvwxyz{|}`~f' ;F; abcdefghijklmnopqrstuvwxyz{|}`~Gt ;;GrB .ASKS[0:1] CHAR What symbol do you want as the display character? .IF EQ 0 .GOTO DEFCHRH .DATA 'TEMP''CHAR'H .GOTO POSTON .DEFCHR: .DATA 'TEMP''REGCHR' .POSTON: .DATA .DSABL LCG ;M ; The display is normally centered horizontally on the screen, near (but not. ; at) the top. You can change this position. ;E .ASK A Do you want to change the position of the clock on the screenr .IFF A .GOTO DEFPOS ;D .ASKS VPOS How many lines down from the top (Range 1-8, Default 3)?# .IF EQ 0 .DATA INITY = 3. ( .IF GT 0 .DATA INITY = 'VPOS'. ;E .ASKS HPOS How many lines in from the left (Range 1-35, Default 11)?$ .IF EQ 0 .DATA INITX = 11.( .IF GT 0 .DATA INITX = 'HPOS'. .GOTO SYSTEMo.DEFPOS: .DATA INITX = 11. .DATA INITY = 3.t.SYSTEM: ;M ; The following section includes or excludes some system-dependent functions  ; of the clock. ;@ .ASK OLDM Is your system an RSX-11M V3.2 (or older), or VAX/VMS .IFF OLDM .GOTO NEWSYS3.NOSPN:< .DATA POT = 0 .DATA RMDSPT = 0F .DATA DCLSPT = 0A .GOTO FINISH..NEWSYS: ;L ; Since you answered no to last question, I assume you have an RSX-11M V4.0 ; system or RSX-11M-PLUS. ;G .ASK SPAWN Does your system support parent/offspring tasking (most do)= .IFF SPAWN .GOTO NOSPN .DATA POT = 1 ;M ; Many RSX-11M/M-PLUS systems have DIGITAL Command Language (DCL), but no M $ ; 3.2 or earlier M systems have it. ;# .ASK DCL Does your system have DCLS .IFF DCL .DATA DCLSPT = 0 .IFT DCL .DATA DCLSPT = 1 ;H ; Your system may have a user version of the RMDEMO system display taskE ; available. If so, the MCR RMD command or the DCL SHOW MEMORY and s2 ; SHOW TASKS/DYNAMIC commands produce the display ;) .ASK RMD Is this the case on your system= .IFF RMD .DATA RMDSPT = 0 .IFT RMD .DATA RMDSPT = 1.FINISH: .CLOSE CLKPRE.MAC ; ; Now we'll build your clocko ; MAC CLOCK=CLKPRE,CLOCKt TKB CLOCK=CLOCK PIP CLKPRE.MAC;0,CLOCK.OBJ;*/DE ;@ .ASK A Do you want to purge previous versions of the clock task .IFT A PIP CLOCK.TSK/PU .IFNDF .GOTO DONE .IF STCLI EQ "DCL" SET /DCL=TI:.DONE: ; RUN CLOCK ;A ; To use this clock in the future, issue the command "RUN CLOCK"e display ;) .ASK RMD Is this the case on your system= .IFF RMD .DATA RMDSPT = 0 .IFT RMD .DATA RMDSPT = 1.FINISH: .CLOSE CLKPRE.MAC ; ; Now we'll build your clocko ; MAC CLOCK=CLKPRE,CLOCKt TKB CLOCK=CLOCK PIP CLKPRE.MAC;0,CLOCK.OBJ;*/DE ;@ .ASK A Do you want to purge .ENABLE SUBSTITUTION.BEGIN: .ASKS FILE Which file? TYPE 'FILE' .ASK DEL Delete the file  .IFT DEL DELETE 'FILE';*B .GOTO BEGIN00tuv .ENABLE QUIET .IF EQ "MCR" SET /DCL=TI: .DISABLE QUIETE2 .IF NE "[USER]" SET DEFAULT [USER]/NAMED .ENABLE QUIET TYPE HELLO.TXTI.; This Indirect command file prepares a new diskette for use on your RSXaM.; system. This is an example only. You may want to customize this file for.; your own use.  ;? ; Place the new diskette in one of the drives before answeringn ; the question.-.; Comments with only ; in front are printed.-.; Comments with .; in front are not printed.  .ENABLE SUBSTITUTION4K.; When SUBSTITUTION is enabled, Indirect can substitute a variable's value.; into a command. ; .ASKS DISK Which diskette driveL.; .ASKS is one of the ways Indirect prompts you. In this case you name theM.; drive with the new disk in it. Once you've answered, the name of the driveN.; is substituted wherever 'DISK' appears in a command. Although Indirect hasL.; features that allow you to check for correct syntax, this example commandB.; file does not check to make sure you entered a valid disk name. ;0 ; Labels can have up to 12 letters and numbers. ;# .ASKS LABEL What label do you wantSM.; The volume label is a combination identifier and password to the diskette. ;.; No one can mount the diskette without knowing the label.  ;! MOUNT/FOREIGN/NOSHAREABLE 'DISK'v$.; All disk volumes must be mounted. ANALYZE/MEDIA 'DISK'o.; Looking for bad blocks. INITIALIZE 'DISK' 'LABEL'(.; Putting the RSX format on the volume. DISMOUNT 'DISK' e'.; Dismounting from the /FOREIGN mount.! MOUNT/NOSHAREABLE 'DISK' 'LABEL'n#.; Mounting again as an RSX volume.  CREATE/DIRECTORY 'DISK'K.; Creating a new directory on the volume. It will have the same directorya .; name as your login directory. ;' ; Diskette in 'DISK' is ready for use.E ;'v$.; All disk volumes must be mounted. ANALYZE/MEDIA 'DISK'o.; Looking for bad blocks. INITIALIZE 'DISK' 'LABEL'(.; Putting the RSX format on the volume. DISMOUNT 'DISK' e'.; Dismounting from the /FOREIGN mount.! MOUNT/NOSHAREABLE 'DISK' 'LABEL'n#.; Mounting again as an RSX volume.  CREATE/DIRECTORTI:DON'T LOSE YOUR HEADTI:TO GAIN A MINUTETI:YOU NEED YOUR HEADTI:YOUR BRAINS ARE IN IT SHOW DEVICES SHOW USERS SHOW TIMECNC THIS TASK (TMCLI) ILLUSTRATES THE USE OF THE CLI CONTROL DIRECTIVES PRESENT )C IN RSX-11M V4.0 AND RSX-11M-PLUS V2.0. CFC WHEN SET UP AS A TERMINAL'S CLI, IT PROVIDES THE FOLLOWING COMMANDS:CC T -> TYPE FILEC M -> SET TERMINAL TO MCRC>C IF THE FIRST TWO LETTERS OF THE COMMAND ARE NOT "T" FOLLOWED3C BY A SPACE, OR "M" FOLLOWED BY A CARRIAGE RETURN,8C THE COMMAND IS PASSED TO MCR FOR EXECUTION. THEREFORE,HC USERS AT TERMINALS SET TO THIS CLI WILL SEE THE ENTIRE MCR COMMAND SETFC 00~jkTADATADATADATADATADATAAS BEING PRESENT, PLUS THE "T" AND "M" COMMANDS. IF THE "DPR" SWITCHFC IS INCLUDED ON THE CLI /INIT COMMAND, USERS WILL KNOW IMMEDIATELY IFGC THEIR TERMINAL IS SET TO THIS CLI BY THE PRESENCE OF THE DOUBLE RIGHT C ANGLE BRACKET AS THE PROMPT.COFC IF IT IS INITIALIZED WITH THE SYSTEM MESSAGE OPTION ENABLED, IT WILLDC GREET USERS WHEN THEIR TERMINAL IS SET TO THE CLI, AND SAY GOODBYE C TO THEM WHEN THEY SWITCH AWAY.CFBC IN ORDER TO BRING THIS CLI UP ON THE SYSTEM, ISSUE THE FOLLOWINGC COMMAND SEQUENCE:GCEC >FOR TMCLI,TMCLI/-SP=TMCLI.C >TKB TMCLI/FP,TMCLI/-SP=TMCLI,[1,1]FOROTS/LB C >INS TMCLI/CLI=YES/TASK=...TMC9C >CLI /INIT=TMCLI/MESSAGE/DPR="<15><12>/>>/"/TASK=...TMCECE?C IF USING FORTRAN IV-PLUS INSTEAD OF FORTRAN IV, THE FIRST TWO C COMMANDS ABOVE WOULD BE:CY C >F4P TMCLI,TMCLI/-SP=TMCLI.FTN.C >TKB TMCLI/FP,TMCLI/-SP=TMCLI,[1,1]F4POTS/LBC ;C TO SET TERMINALS TO THIS CLI, ISSUE THE FOLLOWING COMMAND 6C WHERE TTN: IS REPLACED BY THE TERMINAL NUMBER OR TI:COC >SET /CLI=TTN:TMCLIECHC NOTE THAT THE PROMPT ISSUED IN RESPONSE TO A CONTROL/C DEFAULTS TO THE%C NAME OF THE CLI WHICH IS "TMCLI>". CC JC IT CAN BE ELIMINATED FROM THE SYSTEM BY THE FOLLOWING COMMANDS, ASSUMINGC NO TERMINALS ARE SET TO IT: C C >CLI /ELIM=TMCLI C >REM ...TMCUCBHC EXPERIMENT WITH THE OTHER OPTIONS ON THE CLI /INIT COMMAND, THE ENABLELC AND DISABLE CLI COMMANDS, AND LEAVING OFF THE /MESSAGE SWITCH ON THE /INITGC COMMAND TO OBSERVE THE EFFECT THEY HAVE. ALSO TRY CHANGING THE /TASK=LEC SWITCH ON THE INS AND CLI /INIT COMMAND TO "/TASK=TMCLI" AND NOTICELJC THAT ONLY ONE COPY OF THE TASK WILL EXIST FOR ALL TERMINALS, RATHER THANEC ONE PER COMMAND. IF THIS IS DONE, YOU SHOULD ALSO CHANGE THE OPTIONRLC ON THE GTCMCI DIRECTIVE FROM GC.CEX TO GC.CST SO THE TASK WILL STAY ACTIVE6C BUT STOPPED WHEN NO COMMANDS ARE OUTSTANDING FOR IT.CBCC BUFFER AREASCOKC COMMAND BUFFER - THIS BUFFER IS USED IN THE GTCMCI DIRECTIVE. IT CON-ECC TAINS INFORMATION ON THE COMMAND RECEIVED (8 BYTES) %C AND THE COMMAND TEXT.L BYTE CMDBUF(264)H7 INTEGER*2 CBLEN ! NOTE THAT ON M+ THE MAXIMUM COMMAND," DATA CBLEN/263/ ! LENGTH IS 255.< INTEGER*2 GCCDV, GCCCL ! ASCII DEV NAM, # CHARS IN CMD LINEA BYTE GCCCT, GCCUN, GCCBF(255) ! # OF CHARS, TERMINAL UNIT #, CMD B EQUIVALENCE (GCCDV,CMDBUF), (GCCCL,CMDBUF(5)), (GCCCT,CMDBUF(4)),+ 1 (GCCBF,CMDBUF(9)), (GCCUN,CMDBUF(3))ECS@C INFORMATION BUFFER - ALSO RETURNED IN THE GTCMCI DIRECTIVE.CM BYTE IBUF(14) INTEGER*2 GCCPU; DATA IBLEN/14/,GCCPU/9/ ! LENGTH OF IBUF, LOGIN UIC OFFSET2? INTEGER*4 GCCOA ! ADDR OF OFFSPRING CONTROL BLOCK FROM PARENTD EQUIVALENCE (GCCOA,IBUF(7))C)C BUFFER IN WHICH TO GENERATE COMMANDSCCS5 BYTE BUF(72) ! BUFFER IN WHICH TO GENERATE COMMANDSR; REAL*8 TCMD(2) ! FOR CONVENIENCE IN ASSIGNMENT STATEMENTS, EQUIVALENCE (BUF,TCMD)(C,C MCR TASK NAME IN RAD50GCN) INTEGER*4 IMCR ! MCR TASK NAME IN RAD50  DATA IMCR/6RMCR.../CC&C DIRECTIVE SYMBOLIC VALUE DEFINITIONSC2% INTEGER*2 GCCCS, GCCEX, GCCST, GCCNDTH DATA GCCCS, GCCEX, GCCST, GCCND /0, 1, 2, 128/ ! INCP VALUES IN GTCMCI% DATA ISCLR /0/ ! IS.CLR RETURN CODEOG INTEGER*2 CMELM, CMEXT, CMLKT, CMRMT ! TERMINAL CODES FOR SYSTEM MSGS(- DATA CMELM, CMEXT, CMLKT, CMRMT /5, 6, 7, 8/RC* C CLI CODECRLC TO FORCE THE CLI TO EXIT INSTEAD OF RETURNING, THE GC.CEX OPTION IS SPECI-KC FIED IN THE GTCMCI DIRECTIVE BELOW. IF THE CLI IS INSTALLED SO THAT ONLYMHC ONE COPY OF THE TASK WILL EXIST FOR ALL TERMINALS, CHANGE THE VARIABLEJC GCCEX BELOW TO GCCST. THIS SPECIFIES THE GC.CST OPTION SO THAT THE TASKGC WILL STAY ACTIVE BUT STOPPED WHEN NO COMMANDS ARE OUTSTANDING FOR IT.RCCG 1 CALL GTCMCI(CMDBUF,CBLEN,IBUF,IBLEN,0,GCCEX,IDS) ! GET CMD FOR CLI, IF (IDS .LT. 0) GO TO 100C8FC IF THE GTCMCI DIRECTIVE HAD THE GC.CST OPTION SPECIFIED, WE MAY HAVE5C JUST BEEN UNSTOPPED, SO WE HAVE TO GET THE COMMAND.CCE6 IF (IDS .EQ. ISCLR) GO TO 1 ! WERE WE JUST UNSTOPPED? O8 IF (GCCDV .EQ. 0) GO TO 200 ! IS THIS A SYS00tuvTEM MESSAGE? 4 IGCCUN = GCCUN ! CONVERT BYTE TO INTEGER (UNIT #); CALL ASNLUN(5,GCCDV,IGCCUN,IDS) ! ASSIGN TERMINAL TO LUN 5C) IGCCCT=GCCCT ! CONVERT BYTE TO INTEGERC IF (IGCCCT .GE. 0) GO TO 5I6 IGCCCT = 256 + IGCCCT ! CONVERT NEGATIVE TO UNSIGNEDH 5 IF (IGCCCT .LT. GCCCL) GOTO 150 ! DID ENTIRE COMMAND FIT IN BUFFER?CAEC AT THIS POINT, THE CLI HAS A COMMAND TO BE PROCESSED. THE CODE FROM =C THE LABEL 1 TO HERE SHOULD BE FAIRLY COMMON AMONG ALL CLIS.CJC FROM THIS POINT ON, THE CODE WILL BE SPECIFIC TO THE PARTICULAR LANGUAGEDC THIS CLI IS IMPLEMENTING. COMMANDS CAN BE ADDED OR DELETED AT WILLDC BY MODIFYING CODE IN THIS SECTION. AS STATED ABOVE, THIS EXTREMELYEC SIMPLE CLI PROVIDES TWO COMMANDS, AND GIVES EVERYTHING ELSE TO MCR.TIC THIS CREATES AN OPEN ENDED ENVIRONMENT. REJECTING UNRECOGNIZED COMMANDSNGC INSTEAD OF PASSING THEM TO MCR WOULD LIMIT THE TERMINAL USER'S USE OF AC THE SYSTEM TO ONLY THOSE OPERATIONS ALLOWED BY THE CLI. THIS IS HC A SECURE WAY OF CONTROLLING SYSTEM USE, IN CASES WHEN IT IS NECESSARY.AC IN THIS EXAMPLE, CHANGING THE "GO TO 50" BELOW, TO A "GO TO 60"TCC WOULD CREATE AN ENVIRONMENT WHERE THE ONLY OPERATION A USER COULDSHC PERFORM WOULD BE TO TYPE FILES ON THE TERMINAL, OR SWITCH BACK TO MCR.JC ALL OF THE REST OF RSX IS TOTALLY INACCESSABLE. IF NO MEANS OF SWITCHINGDC BACK TO MCR IS PROVIDED, IT WOULD BE IMPOSSIBLE FOR THE USER TO DO2C ANYTHING THE CLI DOES NOT EXPLICITLY LET HIM DO.COC IS IT A "T" COMMAND?C < IF ((GCCBF(1) .EQ. 'T') .AND. (GCCBF(2) .EQ. ' ')) GO TO 10CSIC CHANGE THE NEXT IF STATEMENT TO "GO TO 60" TO ELIMINATE PASSING UNKNOWN C COMMANDS TO MCR.CM C IS IT ALSO NOT AN "M" COMMAND?COB IF ((GCCBF(1) .NE. 'M') .OR. (GCCBF(2) .NE. 13)) GO TO 50 ! MCTBC THE USER HAS ENTERED AN "M" COMMAND, SO SET THE TERMINAL TO MCR.CF TCMD(1) = 'SET /MCR'C$ TCMD(2) = '=TI: ' ! SET /MCR=TI:7 IGRP = IBUF(GCCPU+1) ! (CONVERT BYTE TO INTEGER) GROUPY( IMEM = IBUF(GCCPU) ! MEMBER PART OF UICC*C ISSUE RPOI$ DIRECTIVE TO EXECUTE COMMANDC < CALL RPOI(IMCR,IGRP,IMEM,,TCMD,12,,GCCDV,IGCCUN,,GCCOA,IDS)# IF (IDS .LE. 0) GO TO 110 ! ERROR?M GO TO 1 ! BACK TO STARTCNCC THE USER HAS ENTERED A "T" COMMAND SO CONSTRUCT THE NECESSARY PIP1C COMMAND AND SEND IT TO MCRCS> 10 TCMD(1) = 'PIP TI:=' ! PUT BEGINNING OF PIP CMD IN BUFFER& I2 = 8 ! POINTER INTO TARGET BUFFER= DO 20, I1 = 10, CBLEN ! BEGIN AT SPACE AFTER THE T IN CMDBUFI< IF (CMDBUF(I1) .EQ. 13) GO TO 30 ! END OF COMMAND? ()6 IF (CMDBUF(I1) .EQ. ' ') GO TO 20 ! SKIP ANY SPACES! I2 = I2 + 1 ! COUNT CHARACTERG1 BUF(I2) = CMDBUF(I1) ! COPY INTO OUTPUT BUFFERR 20 CONTINUE!; 30 IGRP = IBUF(GCCPU+1) ! (CONVERT BYTE TO INTEGER) GROUPO( IMEM = IBUF(GCCPU) ! MEMBER PART OF UICCD*C ISSUE RPOI$ DIRECTIVE TO EXECUTE COMMANDC < CALL RPOI(IMCR,IGRP,IMEM,,TCMD,I2,,GCCDV,IGCCUN,,GCCOA,IDS)# IF (IDS .LE. 0) GO TO 110 ! ERROR?G GO TO 1 ! BACK TO STARTCUCC IN THE ABOVE SECTION OF CODE, THE RPOI DIRECTIVE WAS USED TO PASSI9C THE PIP COMMAND TO THE MAIN COMMAND DISPATCHER (MCR...) BC WHICH WILL START A COPY OF PIP AND GIVE IT THE COMMAND. THE RPOIDC DIRECTIVE COULD BE USED TO GIVE THE COMMAND DIRECTLY TO ...PIP AND<C GIVE THE RESULTING TASK A DIFFERENT NAME. IN THIS EXAMPLE,>C WE COULD CALL THE RESULTING PIP TASK "TYPTNN" WHERE THE LASTDC THREE CHARACTERS (TNN) ARE REPLACED BY A DEVICE NAME CHARACTER ANDAC UNIT NUMBER. FOR EXAMPLE, IF THE "T" COMMAND WAS TYPED ON TT10:CDC THE RESULTING TASK NAME COULD BE MADE TO BE "TYPT10". THIS HAS THEGC ADVANTAGE OF ALLOWING THE TASK TO BE ABORTED BY AN "ABO TYP" COMMAND,PEC INSTEAD OF "ABO PIP", THUS THE USER WOULD NOT HAVE TO KNOW THAT THEHEC "T" COMMAND HE ISSUED IS ACTUALLY BE SERVICED BY THE PIP TASK. THIS @C IS EXACTLY WHAT THE DCL CLI DOES. IT IS NOT DONE HERE IN ORDER@C TO SIMPLIFY THE EXAMPLE. PICKING UP THE TERMINAL NAME AND UNITHC NUMBER, CONVERTING IT TO RAD50, AND SUPPLYING IT IN THE RPOI DIRECTIVEHC ALONG WITH A DIRECT REQUEST OF PIP IS LEFT AS AN EXERCISE TO THE USER.>C (BE CAREFUL ON M-P00jkTADATADATADATADATADATALUS SYSTEMS WITH MORE THAN 64. TERMINALS).IC NOTE THAT REQUESTING PIP DIRECTLY AVOIDS A SUBSTANTIAL AMOUNT OF SYSTEMA C OVERHEAD.ACHCCT5C COMMAND IS NOT "T" OR "M", SO GIVE IT TO MCR AS IS.TC.; 50 IGRP = IBUF(GCCPU+1) ! (CONVERT BYTE TO INTEGER) GROUPR( IMEM = IBUF(GCCPU) ! MEMBER PART OF UIC( IGCCCT = GCCCT ! # OF CHARS IN COMMANDC *C ISSUE RPOI$ DIRECTIVE TO EXECUTE COMMANDC A CALL RPOI(IMCR,IGRP,IMEM,,GCCBF,IGCCCT,,GCCDV,IGCCUN,,GCCOA,IDS)E# IF (IDS .LE. 0) GO TO 110 ! ERROR?N GO TO 1 ! BACK TO STARTC6CC CONTROL IS TRANSFERED HERE IF UNKNOWN COMMANDS ARE TO BE REJECTEDI!C INSTEAD OF BEING PASSED TO MCR.C 60 WRITE (5,62)S 62 FORMAT('0ILLEGAL COMMAND')R GO TO 1 ! BACK TO STARTCGC ERROR HANDLING CODE CI( 100 WRITE (5,102) IDS ! ERROR IN GTCMCI9 102 FORMAT('0FATAL ERROR IN GTCMCI DIRECTIVE. DSW=',I6)  GO TO 250 ! EXITCV& 110 WRITE (5,112) IDS ! ERROR IN RPOI7 112 FORMAT('0FATAL ERROR IN RPOI DIRECTIVE. DSW=',I6)  GO TO 250 ! EXITC!: 150 WRITE (5,152) ! ENTIRE COMMAND DID NOT FIT IN BUFFER4 152 FORMAT('0SORRY, PART OF YOUR COMMAND WAS LOST') GO TO 1 ! BACK TO STARTC4C A SYSTEM MESSAGE WAS RECEIVED INSTEAD OF A COMMANDCR 200 CONTINUEBE IF (GCCUN .EQ. CMLKT) GO TO 210 ! IS IT A NEW TERMINAL LINKED TO US?EB IF (GCCUN .EQ. CMRMT) GO TO 220 ! IS IT A TERMINAL BEING REMOVED?A IF (GCCUN .EQ. CMEXT) GO TO 250 ! IS IT AN ELIMINATE ALL PACKET?PC IF (GCCUN .EQ. CMELM) GO TO 250 ! IS IT A CLI ELIMINATION MESSAGE?2& GO TO 1 ! IGNORE ALL OTHER MESSAGESCEC ISSUE WELCOME MESSAGEUCRB 210 IGCCUN = CMDBUF(11) ! CONVERT BYTE TERMINAL UNIT # TO INTEGERC CALL ASNLUN(5,GCCBF,IGCCUN,IDS) ! ASSIGN LUN 5 TO SPECIFIED DEVICEA WRITE (5,212)* 212 FORMAT('0WELCOME TO THE EXAMPLE CLI') GO TO 1 ! BACK TO STARTCSC ISSUE GOOD BYE MESSAGEC B 220 IGCCUN = CMDBUF(11) ! CONVERT BYTE TERMINAL UNIT # TO INTEGERC CALL ASNLUN(5,GCCBF,IGCCUN,IDS) ! ASSIGN LUN 5 TO SPECIFIED DEVICEO WRITE (5,222)- 222 FORMAT('0GOOD BYE FROM THE EXAMPLE CLI')L GO TO 1 ! BACK TO STARTCE=C WHEN AN ELIMINATE ALL MESSAGE IS RECEIVED, EXIT IMMEDIATELYMCL 250 CONTINUEG CALL EXIT END F,IGCCUN,IDS) ! ASSIGN LUN 5 TO SPECIFIED DEVICEA WRITE (5,212)* 212 FORMAT('0WELCOME TO THE EXAMPLE CLI') GO TO 1 ! BACK TO STARTCSC ISSUE GOOD BYE MESSAGEC B 220 IGCCUN = CMDBUF(11) ! CONVERT BYTE TERMINAL UNIT # TO INTEGERC CALL ASNLUN(5,GCCBF,IGCCUN,IDS) ! ASSIGN LUN 5 TO SPECIFIED DEVICEO WRITE (5,222)- 222 FORMAT('0GOOD BYE FROM THE EXAMPLE CLI')L! .TITLE BMDRV - BLOCK MOVE DRIVER .IDENT /01/;+;; COPYRIGHT (c) 1981,1982 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; VERSION: 01.00; DATE: 1-APR-82; AUTHOR: MARIO DENOBILI;<; THIS IS A SAMPLE DRIVER WHICH DEMONSTRATES HOW TO USE SOME;; OF THE MORE SOPHISTICATED EXECUTIVE SERVICES AVAILABLE TO(; I/O DRIVERS. THIS DRIVER DEMONSTRATES:;L>; 1) THE CHECKING OF ADDITIONAL USER BUFFERS PRIOR TO QUEUEING; AN I/O PACKET.L;U*; 2) USE OF THE CLOCK QUEUE FROM A DRIVER.;&; 3) USE OF THE BUFFERED I/O MECHANISM;N9; 4) USE OF THE GENERAL BUFFERED I/O KERNEL AST MECHANISM ;M#; 5) USE OF REGION LOAD KERNEL ASTS1;; 6) USE OF BLXIO8;;A6; THIS DRIVER UNDERSTANDS PRECISELY ONE QIO, WHICH IS:; 7; ... IO.WLB,....., ; OR ; IO.WVBA;B;; THE DRIVER QUEUES A CLOCK BLOCK FOR TIME TICKS AND AT THEE;; END OF THAT TIME INTERVAL COPIES THE SOURCE BUFFER TO THEA:; DESTINATION BUFFER. IF POSSIBLE, THE REQUEST IS BUFFERED/; INTERNALLY WHILE THE CLOCK REQUEST IS POSTED.N;- .MCALL CLKDF$, PKTDF$% CLKDF$ ;DEFINE CLOCK BLOCK OFFSETSU$ PKTDF$ ;DEFINE I/O PACKET OFFSETS;E7; DEFINE MAXIMUM TRANSFER LENGTH WHICH WILL BE BUFFEREDN;I BUFLIM = 100. DDT$ BM,,NONE,,,NEW .PAGE;+); ** - BMINI - I/O INITIATION ENTRY POINTB; ; ; INPUTS:E; <; DRQIO (BECAUSE 00tuvTHE UC.QUE BIT IS SET IN THE UCB) SETS THE; REGISTERS TO THE FOLLOWING:T;H; R1 = ADDRESS OF I/O PACKET; R4 = ADDRESS OF SCB ; R5 = ADDRESS OF UCBW;E ; OUTPUTS:;EE; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAIT- E; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPER-X; ATION IS INITIATED.I;W; I/O REQUEST PACKET FORMAT: ;0'; I.LNK -- I/O QUEUE THREAD WORD.5; I.PRI/I.EFN -- REQUEST PRIORITY, EVENT FLAG NUMBER.N:; I.TCB -- ADDRESS OF THE TCB OF THE REQUESTER TASK.E; I.LN2 -- POINTER TO SECOND LUN WORD IN REQUESTER TASK HEADER. &; I.UCB -- UCB ADDRESS OF DEVICE,; I.FCN -- I/O FUNCTION CODE (IO.WLB).5; I.IOSB -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.A5; I.IOSB+2 -- RELOCATION BIAS OF I/O STATUS BLOCK.EB; I.IOSB+4 -- I/O STATUS BLOCK ADDRESS (DISPLACEMENT + 140000).8; I.IOSB+6 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.2; I.PRM -- RELOCATION BIAS OF SOURCE BUFFER.0; I.PRM+2 -- BUFFER ADDRESS OF I/O TRANSFER.2; I.PRM+4 -- NUMBER OF BYTES TO BE TRANSFERED.+; I.PRM+6 -- TIME DISPLACEMENT IN TICKS >; I.PRM+10 -- VIRTUAL ADDRES (TO BECOME RELOCATION BIAS) OF; DESTINATION BUFFERC; I.PRM+12 -- FILLED IN WITH DISPLACEMENT ADDRESS OF DESTINATIONS; BUFFER9; I.PRM+14 -- USED TO STORE BUFFER/CLOCK BLOCK ADDRESSN<; I.PRM+16 -- FILLED IN WITH PCB ADDRESS OF OUTPUT BUFFER;- .ENABL LSB  .PAGEC; *****************************************************************O ; * *2; * I N I T I A T I O N E N T R Y P O I N T * ; * *C; *****************************************************************O.BMINI: ; PRE-QUEUING INITIALIZE ENTRY POINTC; ***************************************************************** ; * *6; * ADDRESS CHECK THE SOURCE BUFFER WHILE THE TASKS *3; * CONTEXT IS LOADED, AND FILL IN THE NECESSARY *F%; * PARAMETERS IN THE I/O PACKET *A ; * *C; ***************************************************************** ( MOV R1,R3 ; COPY ADDRESS OF I/O PACKET; MOV I.PRM+10(R1),R0 ; GET VIRTUAL ADDRESS OF SOURCE BUFFER*1 MOV I.PRM+4(R3),R1 ; AND LENGTH OF SOURCE BUFFERRC; +---------------------------------------------------------------+* ; | |,; | THE INPUT PARAMETERS FOR $CKBFR ARE: | ; | |3; | R0 = STARTING ADDRESS OF BLOCK TO BE CHECKED |,.; | R1 = LENGTH OF THE BLOCK TO BE CHECKED |/; | $ATTPT = ADDRESS OF I.AADA IN I/O PACKET |*!; | (ESTABLISHED IN DRQIO) |*6; | CURRENT TASK HEADER MUST BE MAPPED THROUGH APR 6 |.; | (ESTABLISHED BY DIRECTIVE DISPATCHER) | ; | |#; | THE OUTPUT PARAMETERS ARE: |E ; | |2; | C = 0 IF CHECK AND PACKET UPDATE SUCCESSFUL |1; | I.AADA OR I.AADA IN PACKET POINTS TO | 2; | RELATED ADB, P.IOC, A.IOC INCREMENTED |3; | C = 1 IF CHECK UNSUCCESFUL OR I.AADA, I.AADA |!; | ALREADY FILLED IN |C ; | |C; +---------------------------------------------------------------+ 1 CALL $CKBFR ; CHECK BUFFER, INCREMENT A.IOC ANDT# ; P.IOC FOR APPROPRIATE REGIONS  BCC 10$ ; IF CC ALL WAS OKC; ***************************************************************** ; * *1; * SOURCE BUFFER WAS ILLEGAL, FINISH I/O HERE *A ; * *C; ***************************************************************** + MOV #IE.SPC&377,R0 ; SET COMPLETION STATUS* CLR R1 ; AND NUMBER OF BYTES TRANSFERRED .PAGEC; +---------------------------------------------------------------+ ; | |,; | THE INPUT PARAMETERS FOR $IOFIN ARE: | ; | |/; | R0 = FIRST WORD OF I/O STATUS TO RETURN |/; | R1 = SECOND WORD OF I/O STATUS TO RETURN |*#; | R3 = ADDRESS OF I/O PACKET | ; | |#; | THE OUTPUT PARAMETERS ARE: | ; | |; | R4 IS DESTROYED | ; | |C; +---------------------------------------------------------------+- CALLR $IOFIN ; COMPLETE I/O AND EXIT DRIVERAC; ***************************************************************** ; * *00jkTADATADATADATADATADATA3; * BUFFER WAS LEGAL, CONVERT VIRTUAL ADDRESS TO * /; * ADDRESS DOUBLEWORD AND STORE PARAMETERS *U ; * *C; *****************************************************************AC; +---------------------------------------------------------------+ ; | |,; | THE INPUT PARAMETERS FOR $RELOC ARE: | ; | |-; | R0 = USER VIRTUAL ADDRESS TO RELOCATE |L ; | |#; | THE OUTPUT PARAMETERS ARE: |* ; | |/; | R1 = APR6 RELOCATION BIAS OF USER BUFFER |+; | R2 = DISPLACEMENT IN BLOCK + 140000 |I ; | |C; +---------------------------------------------------------------+*+10$: CALL $RELOC ; RELOCATE BUFFER ADDRESS*5 MOV R1,I.PRM+10(R3) ; SAVE APR BIAS OF SOURCE BUFFER-/ MOV R2,I.PRM+12(R3) ; AND DISPLACEMENT ADDRESS - CLR I.PRM+16(R3) ; INDICATE NOT BUFFERED I/O  .PAGEC; *****************************************************************| ; * */; * NOW QUEUE THE PACKET IN THE DEVICE QUEUE *A ; * *C; *****************************************************************I0 MOV R4,R0 ; COPY POINTER TO I/O QUEUE LISTHEAD' MOV R3,R1 ; AND ADDRESS OF I/O PACKETCC; +---------------------------------------------------------------+ ; | |,; | THE INPUT PARAMETERS FOR $QINSP ARE: | ; | |-; | R0 = ADDRESS OF THE TWO WORD LISTHEAD |0; | R1 = ADDRESS OF THE PACKET TO BE INSERTED | ; | |; | NO OUTPUT PARAMETERS | ; | |C; +---------------------------------------------------------------+*& CALL $QINSP ; INSERT PACKET IN QUEUE .PAGEC; *****************************************************************S ; * *.; * BEGIN SERIAL PROCESSING OF I/O PACKETS * ; * *C; ***************************************************************** C; +---------------------------------------------------------------+= ; | |,; | THE INPUT PARAMETERS FOR $GTPKT ARE: | ; | |1; | R5 = ADDRESS OF THE UCB OF REQUESTING UNIT |- ; | |#; | THE OUTPUT PARAMETERS ARE: |L ; | |3; | C = 0 IF A REQUEST WAS SUCCESSFULLY DEQUEUED |*'; | R1 = ADDRESS OF THE I/O PACKET |*"; | R2 = PHYSICAL UNIT NUMBER |; | R3 = CONTROLLER INDEX | '; | R4 = SCB ADDRESS OF CONTROLLER |*!; | R5 = UCB ADDRESS OF UNIT |*/; | C = 1 IF UNIT BUSY OR NO PACKETS QUEUED |- ; | |C; +---------------------------------------------------------------+ .BMIN1: CALL $GTPKT ; ATTEMPT TO GET A REQUEST BCC 20$ ; IF CC WE GOT ONE& RETURN ; DEVICE BUSY OR QUEUE EMPTY20$: ; REFERENCE LABELF .PAGEC; ***************************************************************** ; * *(; * ATTEMPT TO ALLOCATE CLOCK BLOCK * ; * *C; ***************************************************************** % MOV R1,R3 ; COPY I/O PACKET ADDRESSO+ MOV #C.LGTH,R1 ; SET LENGTH OF CLOCK BLOCK-C; +---------------------------------------------------------------+L ; | |,; | THE INPUT PARAMETERS FOR $ALOCB ARE: | ; | |4; | R1 = SIZE OF THE BLOCK TO ALLOCATE (IN BYTES) | ; | |#; | THE OUTPUT PARAMETERS ARE: |* ; | |3; | C = 0 IF A BLOCK WAS SUCCESSFULLY ALLOCATED | C+; | R0 = ADDRESS OF THE ALLOCATED BLOCK |**; | R1 = LENGTH OF THE ALLOCATED BLOCK |/; | C = 1 IF NO BLOCK ISCURRENTLY AVAILABLE |D ; | |C; +---------------------------------------------------------------+-# CALL $ALOCB ; ATTEMPT TO ALLOCATEL BCC 30$ ; IF CC SUCCESSFUL$ MOV #IE.NOD&377,R0 ; SET I/O STATUSC; +---------------------------------------------------------------+ ; | |,; | THE INPUT PARAMETERS FOR $IOALT ARE: | ; | |,; | R0 = FIRST WORD OF I/O STATUS BLOCK |,; | R1 = SECOND WORD OF I/O STATUS BLOCK |,; | R2 = STARTING AND FINAL RETRY COUNTS |); | (IF AN ERROR LOGGING DEVICE) | ,; | R5 = UCB ADDRESS OF UNIT TO COMPLETE | ; | |#; | THE OUTPUT PARAMETERS ARE: |T ; | |; | R4 IS DESTROYED | ; | |C; +---------------------------------------------------------------+-00tuv$ CALL $IOALT ; AND COMPLETE THE I/O" BR BMIN1 ; GO LOOK FOR MORE WORK630$: MOV R0,I.PRM+14(R3) ; SAVE ADDRESS OF CLOCK BLOCK .PAGEC; *****************************************************************S ; * *.; * DETERMINE IF I/O REQUEST IS BUFFERABLE * ; * *C; *****************************************************************HC; +---------------------------------------------------------------+ ; | |,; | THE INPUT PARAMETERS FOR $TSTBF ARE: | ; | |*; | R3 = ADDRESS OF I/O PACKET TO TEST | ; | |#; | THE OUTPUT PARAMETERS ARE: |R ; | |(; | C = 0 IF REQUEST MAY BE BUFFERED |,; | C = 1 IF REQUEST MAY NOT BE BUFFERED | ; | |C; +---------------------------------------------------------------+/ CALL $TSTBF ; TEST FOR BUFFERABLE I/O REQUEST*) BCS 40$ ; IF CS CAN'T ALLOCATE A BUFFER-C; ***************************************************************** ; * *%; * ATTEMPT TO ALLOCATE A BUFFER * ; * *C; *****************************************************************P* MOV I.PRM+4(R3),R1 ; GET LENGTH OF BUFFER, CMP R1,#BUFLIM ; BIGGER THAN BUFFER LIMIT ?# BHI 40$ ; IF HI YES, DON'T BUFFER C; +---------------------------------------------------------------+- ; | |,; | THE INPUT PARAMETERS FOR $ALOCB ARE: | ; | |4; | R1 = SIZE OF THE BLOCK TO ALLOCATE (IN BYTES) | ; | |#; | THE OUTPUT PARAMETERS ARE: | ; | |3; | C = 0 IF A BLOCK WAS SUCCESSFULLY ALLOCATED | *+; | R0 = ADDRESS OF THE ALLOCATED BLOCK |**; | R1 = LENGTH OF THE ALLOCATED BLOCK |/; | C = 1 IF NO BLOCK ISCURRENTLY AVAILABLE | ; | |C; +---------------------------------------------------------------+-& CALL $ALOCB ; TRY TO ALLOCATE BUFFER" BCS 40$ ; IF CS COULDN'T GET ONE .PAGEC; *****************************************************************( ; * *+; * COPY USER BUFFER TO INTERNAL BUFFER * ; * *C; ***************************************************************** / MOV R0,R4 ; SET ADDRESS OF DESTINATION BUFFERH( MOV R3,R5 ; SAVE ADDRESS OF I/O PACKET, MOV I.PRM+4(R5),R0 ; SET LENGTH OF TRANSFER0 MOV I.PRM+10(R5),R1 ; SET BIAS OF SOURCE BUFFER' MOV I.PRM+12(R5),R2 ; AND DISPLACEMENT - BIC #140000,R2 ; STRIP OFF APR6 ADDRESS BITSN% BIS #120000,R2 ; AND SUBSTITUTE APR5*> MOV R4,I.PRM+10(R5) ; SET INTERNAL BUFFER ADDRESS INTO PACKETC; +---------------------------------------------------------------+* ; | |,; | THE INPUT PARAMETERS FOR $BLXIO ARE: | ; | |%; | R0 = NUMBER OF BYTES TO MOVE |V ; | R1 = SOURCE APR 5 BIAS |!; | R2 = SOURCE DISPLACEMENT |H#; | R3 = DESTINATION APR6 BIAS |S&; | R4 = DESTINATION DISPLACEMENT | ; | |"; | THE OUTPUT PARAMETERS ARE | ; | |; | R0 ALTERED |0; | R1,R3 PRESERVED |7; | R2,R4 POINT TO LAST BYTE OF SOURCE/DESTINATION +1 |A ; | |C; +---------------------------------------------------------------+ ' CALL $BLXIO ; COPY TO INTERNAL BUFFER  .PAGEC; *****************************************************************C ; * *(; * CONVERT TO BUFFERED I/O REQUEST * ; * *C; ***************************************************************** * MOV R5,R3 ; COPY I/O PACKET ADDRESS BACKC; +---------------------------------------------------------------+R ; | |,; | THE INPUT PARAMETERS FOR $INIBF ARE: | ; | |/; | R3 = ADDRESS OF THE I/O PACKET TO BUFFER |- ; | |; | NO OUTPUT PARAMETERS. |F ; | |C; +---------------------------------------------------------------+' CALL $INIBF ; INITIALIZE BUFFERED I/OEC; ****************************************************************** ; * *; * QUEUE THE CLOCK BLOCK *O ; * *C; *****************************************************************-540$: MOV I.PRM+14(R3),R0 ; GET ADDRESS OF CLOCK BLOCKB2 MOV #CLKSRV,C.SUB(R0) ; SET ADDRESS OF SUBROUTINE CLR R1 ; HIGH ORDER DELTA TIME$ MOV I.PRM+6(R3),R2 ; LO00jkTADATADATADATADATADATAW ORDER PART" MOV #C.SYST,R4 ; SET REQUEST TYPE. MOV R3,R5 ; USE PACKET ADDRESS AS IDENTIFIERC; +---------------------------------------------------------------+* ; | |,; | THE INPUT PARAMETERS FOR $CLINS ARE: | ; | |/; | R0 = ADDRESS OF THE CLOCK BLOCK TO QUEUE |**; | R1 = HIGH ORDER HALF OF DELTA TIME |); | R2 = LOW ORDER HALF OF DELTA TIME |D; | R4 = REQUEST TYPE |L4; | R5 = ADDRESS OF REQUESTING TASK OR IDENTIFIER | ; | |; | NO OUTPUT PARAMETERS. |O ; | |C; +---------------------------------------------------------------+A2 CALLR $CLINS ; QUEUE CLOCK BLOCK AND TEMPORARILY ; EXIT THE DRIVER- .PAGEC; *****************************************************************| ; * *); * C L O C K E N T R Y P O I N T *1 ; * *C; ***************************************************************** C; *****************************************************************T ; * *,; * CHECK TO SEE IF THE I/O WAS BUFFERED * ; * *C; *****************************************************************4CLKSRV: MOV C.TCB(R4),R5 ; GET ADDRESS OF I/O PACKET' TST I.PRM+16(R5) ; WAS IT BUFFERED I/O** BNE 50$ ; IF NE YES, GO QUEUE KERNEL ASTC; ***************************************************************** ; * *1; * COULDN'T BUFFER, PERFORM COPY HERE AND NOW ** ; * *C; ******************************************************************, MOV I.PRM+4(R5),R0 ; SET LENGTH TO TRANSFER, MOV I.PRM+10(R5),R1 ; BIAS OF SOURCE BUFFER. MOV I.PRM+12(R5),R2 ; DISPLEACEMENT OF SOURCE- BIC #140000,R2 ; STRIP OFF APR6 ADDRESS BITSS% BIS #120000,R2 ; AND CONVERT TO APR5 + MOV I.PRM(R5),R3 ; SET BIAS OF DESTINATIONU& MOV I.PRM+2(R5),R4 ; SET DISPLACEMENTC; +---------------------------------------------------------------+N ; | |,; | THE INPUT PARAMETERS FOR $BLXIO ARE: | ; | |%; | R0 = NUMBER OF BYTES TO MOVE |* ; | R1 = SOURCE APR 5 BIAS |!; | R2 = SOURCE DISPLACEMENT |M#; | R3 = DESTINATION APR6 BIAS |M&; | R4 = DESTINATION DISPLACEMENT | ; | |"; | THE OUTPUT PARAMETERS ARE | ; | |; | R0 ALTERED |A; | R1,R3 PRESERVED |7; | R2,R4 POINT TO LAST BYTE OF SOURCE/DESTINATION +1 |E ; | |C; +---------------------------------------------------------------+  CALL $BLXIO ; COPY BUFFERF1 MOV I.PRM+14(R5),R0 ; GET ADDRESS OF CLOCK BLOCKF+ MOV #C.LGTH,R1 ; GET LENGTH OF CLOCK BLOCKI .PAGEC; +---------------------------------------------------------------+ ; | |,; | THE INPUT PARAMETERS FOR $DEACB ARE: | ; | |+; | R0 = ADDRESS OF BLOCK TO DEALLOCATE |T*; | R1 = LENGTH OF BLOCK TO DEALLOCATE | ; | |; | NO OUTPUT PARAMETERS. |N ; | |C; +---------------------------------------------------------------+- CALL $DEACB ; DEALLOCATE ITB, MOV R5,R3 ; COPY PACKET ADDRESS FOR $IODON0BMSUC: MOV #IS.SUC&377,R0 ; SET FINAL I/O STATUS8 MOV I.PRM+4(R3),R1 ; AND LENGTH OF TRANSFER = REQUESTED3BMDON: MOV I.UCB(R3),R5 ; GET UCB ADDRESS OF DEVICENC; +---------------------------------------------------------------+L ; | |,; | THE INPUT PARAMETERS FOR $IODON ARE: | ; | |,; | R0 = FIRST WORD OF I/O STATUS BLOCK |,; | R1 = SECOND WORD OF I/O STATUS BLOCK |,; | R2 = STARTING AND FINAL RETRY COUNTS |); | (IF AN ERROR LOGGING DEVICE) |C,; | R5 = UCB ADDRESS OF UNIT TO COMPLETE | ; | |#; | THE OUTPUT PARAMETERS ARE: |N ; | |; | R4 IS DESTROYED | ; | |C; +---------------------------------------------------------------+- CALL $IODON ; COMPLETE THE I/O" BR BMIN1 ; GO LOOK FOR MORE WORK .PAGEC; ***************************************************************** ; * *1; * BUFFERED I/O, CONVERT I/O PACKET TO KERNEL *N!; * AST AND EXIT FROM DRIVER * ; * *C; *****************************************************************550$: MOV R4,R3 ; COPY CLOCK BLOCK ADDRESS FOR $REQUE ( MOV I.TCB(R5),R00tuv0 ; POINT TO TCB OF TASK TST (R4)+ ; SKIP LINK WORD% MOV #AK.GBI,(R4)+ ; SET A.CBL=AK.GBI-3 MOV KISAR5,(R4)+ ; SET APR BIAS OF SERVICE ROUTINE 6 MOV #KATSRV,(R4)+ ; SET ADDRESS OF PROCESSING ROUTINE6 MOV R5,(R4)+ ; SAVE I/O PACKET ADDRESS IN CLOCK BLOCKC; +---------------------------------------------------------------+X ; | |,; | THE INPUT PARAMETERS FOR $REQUE ARE: | ; | |.; | R0 = TCB ADDRESS TO QUEUE AST BLOCK TO |+; | R3 = ADDRESS OF THE PACKET TO QUEUE |V ; | |; | NO OUTPUT PARAMETERS. |+ ; | |C; +---------------------------------------------------------------+ " CALLR $REQUE ; QUEUE AST TO TASK .PAGEC; ***************************************************************** ; * *2; * K E R N E L A S T E N T R Y P O I N T * ; * *C; *****************************************************************:C; ***************************************************************** ; * *6; * GET PCB ADDRESS AND SEE IF PARTITION IS RESIDENT * ; * *C; *****************************************************************-.KATSRV: MOV 10(R3),R5 ; GET I/O PACKET ADDRESS7 MOV I.PRM+16(R5),R1 ; GET PCB ADDRESS OF BUFFER REGION*- BEQ 70$ ; IF EQ THERE IS NO COPY TO PERFORM C; +---------------------------------------------------------------+* ; | |,; | THE INPUT PARAMETERS FOR $TSPAR ARE: | ; | |7; | R0 = ADDRESS OF THE PACKET (THE KERNEL AST BLOCK) |7; | R1 = PCB ADDRESS OF THE PCB CONTAINING THE BUFFER | +; | R5 = TCB ADDRESS OF ASSOCIATED TASK |* ; | |"; | THE OUTPUT PARAMETERS ARE | ; | |6; | C = 0 IF REGION IS RESIDENT AND CAN BE ACCESSED |2; | C = 1 IF REGION IS NOT RESIDENT AND AST HAS |; | BEEN QUEUED |R ; | |C; +---------------------------------------------------------------+ " CALL $TSPAR ; REGION IN MEMORY ?" BCC 60$ ; IF CC REGION IN MEMORYC; *****************************************************************O ; * *6; * A REGION AST WAS QUEUED. BUMP BUFFERED I/O COUNT *7; * BACK UP TO FORCE I/O RUNDOWN IN CASE OF ABORT AND * "; * EXIT AST SERVICE ROUTINE. * ; * *C; *****************************************************************A# MOV I.TCB(R5),R0 ; GET TCB ADDRESS ) INCB T.TIO(R0) ; BUMP BUFFERED I/O COUNT-$ RETURN ; EXIT AST SERVICE ROUTINE .PAGEC; ****************************************************************** ; * *&; * PERFORM BUFFER COPY OPERATION * ; * *C; ***************************************************************** /60$: MOV I.TCB(R5),R0 ; GET TCB ADDRESS OF TASK / INCB T.IOC(R0) ; ADJUST REAL I/O COUNT UPWARDS ( MOV I.PRM+4(R5),R0 ; GET COUNT OF BYTES0 MOV I.PRM+10(R5),R2 ; SET SOURCE BUFFER ADDRESS2 MOV P.REL(R1),R3 ; GET STARTING BIAS OF PARTITION% ADD I.PRM(R5),R3 ; AND ADD IN OFFSETI& MOV I.PRM+2(R5),R4 ; SET DISPLACEMENTC; +---------------------------------------------------------------+F ; | |,; | THE INPUT PARAMETERS FOR $BLXIO ARE: | ; | |%; | R0 = NUMBER OF BYTES TO MOVE | ; | R1 = SOURCE APR 5 BIAS |!; | R2 = SOURCE DISPLACEMENT | #; | R3 = DESTINATION APR6 BIAS |V&; | R4 = DESTINATION DISPLACEMENT | ; | |"; | THE OUTPUT PARAMETERS ARE | ; | |; | R0 ALTERED |F; | R1,R3 PRESERVED |7; | R2,R4 POINT TO LAST BYTE OF SOURCE/DESTINATION +1 |E ; | |C; +---------------------------------------------------------------+  CALL $BLXIO ; COPY THE BUFFERR/ MOV I.PRM+10(R5),R0 ; GET BUFFER ADDRESS AGAINF* MOV I.PRM+4(R5),R1 ; GET LENGTH OF BUFFERC; +---------------------------------------------------------------+R ; | |,; | THE INPUT PARAMETERS FOR $DEACB ARE: | ; | |+; | R0 = ADDRESS OF BLOCK TO DEALLOCATE | *; | R1 = LENGTH OF BLOCK TO DEALLOCATE | ; | |; | NO OUTPUT PARAMETERS. |S ; | |C; +---------------------------------------------------------------+- CALL $DEACB ; DEALLOCATE IT  .PAGEC; **************************00ǂ΂jkTADATADATADATADATADATA***************************************M ; * *6; * IF THIS WASN'T A REGION LOAD AST, FINISH THE I/O * ; * *C; *****************************************************************C570$: MOV I.PRM+14(R5),R0 ; RETRIEVE AST BLOCK ADDRESSA) TST (R0) ; WAS THIS A REGION LOAD AST ?E BNE 80$ ; IF NE YES + MOV #C.LGTH,R1 ; SET LENGTH OF CLOCK BLOCK C; +---------------------------------------------------------------+- ; | |,; | THE INPUT PARAMETERS FOR $DEACB ARE: | ; | |+; | R0 = ADDRESS OF BLOCK TO DEALLOCATE | *; | R1 = LENGTH OF BLOCK TO DEALLOCATE | ; | |; | NO OUTPUT PARAMETERS. |* ; | |C; +---------------------------------------------------------------+;' CALL $DEACB ; DEALLOCATE CLOCK BLOCK W< MOV I.IOSB(R5),R3 ; GET VIRTUAL ADDRESS OF I/O STATUS BLOCK2 MOV #IS.SUC&377,-(SP) ; SET FIRST I/O STATUS WORD5 MTPD$ (R3)+ ; WRITE FIRST WORD OF STATUS (MAY TRAP)-6 MOV I.PRM+4(R5),-(SP) ; SET SECOND WORD OF I/O STATUS+ MTPD$ (R3) ; WRITE SECOND WORD (MAY TRAP)C8 CLR I.IOSB(R5) ; PREVENT $IODON ATTEMPT TO WRITE STATUS% MOV R5,R3 ; COPY I/O PACKET ADDRESSA# JMP BMSUC ; FINISH IN COMMON CODE-C; *****************************************************************D ; * */; * RECONVERT REGION LOAD AST TO A TASK AST *U ; * *C; *****************************************************************$80$: MOV R0,R3 ; COPY BLOCK ADDRESS+ CLR 10(R0) ; INDICATE NO BUFFER NEXT TIMES# MOV I.TCB(R5),R0 ; GET TCB ADDRESS C; +---------------------------------------------------------------+M ; | |,; | THE INPUT PARAMETERS FOR $REQUE ARE: | ; | |.; | R0 = TCB ADDRESS TO QUEUE AST BLOCK TO |+; | R3 = ADDRESS OF THE PACKET TO QUEUE |D ; | |; | NO OUTPUT PARAMETERS. |O ; | |C; +---------------------------------------------------------------+*7 CALLR $REQUE ; RE-QUEUE TASK AST AND EXIT AST SERVICEC .PAGEC; ***************************************************************** ; * *#; * MISCELLANEOUS ENTRY POINTS *- ; * *C; ***************************************************************** C; *****************************************************************D ; * *+; * C A N C E L E N T R Y P O I N T *U ; * *7; * WE COULD DEQUEUE PENDING CLOCK REQUEST, ETC HERE, *-4; * BUT WE DON'T, WE JUST LET THEM COMPLETE LATER * ; * *C; ******************************************************************BMCAN:C; ***************************************************************** ; * *-; * T I M E O U T E N T R Y P O I N T ** ; * *9; * SINCE THERE'S NO PHYSICAL DEVICE TO TIME OUT, NO-OP ** ; * *C; *****************************************************************UBMOUT:C; ***************************************************************** ; * *0; * P O W E R F A I L E N T R Y P O I N T * ; * *4; * POWERFAIL DOESN'T AFFECT NON-EXISTENT DEVICES * ; * *C; ***************************************************************** BMPWF:C; ***************************************************************** ; * *9; * S T A T U S C H A N G E E N T R Y P O I N T S ** ; * *7; * DON'T NEED TO TOUCH NON-EXISTENT DEVICE, JUST LET *$; * EXEC PUT DEVICE ON/OFF LINE * ; * *C; ***************************************************************** BMKRB:BMUCB:' RETURN ; ALL THESE ARE NO-OP FOR NOWE .ENDECES * ; * *C; ****************/ .TITLE BMTAB - DATA BASE FOR BLOCK MOVE DRIVER .IDENT /01/;O"; COPYRIGHT (c) 1981, 1982 BY(; DIGITAL EQUIPMENT CORPORATION, MAYNARD'; MASSACHUSETTS. ALL RIGHTS RESERVED.*; A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED*A; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE*A; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THISCA; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OREA; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSO00ςӂtuvN. NO TITLE TO ANDA2; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.; A; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTAA; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;SA; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFM<; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.;R; VERSION: 01.00; DATE: 1-APR-82Y; AUTHOR: MARIO DENOBILIY;T4; LOADABLE DATA BASE FOR EXAMPLE BUFFERED I/O DRIVER;R; MACRO LIBRARY CALLSN; .MCALL CLKDF$ .MCALL HWDDF$ .MCALL SCBDF$ . .MCALL UCBDF$ T% CLKDF$ ;DEFINE CLOCK BLOCK OFFSETSA$ HWDDF$ ;DEFINE HARDWARE REGISTERS$ SCBDF$ ,,SYSDEF ;DEFINE SCB OFFSETS UCBDF$ ;DEFINE UCB OFFSETS $BMDAT:: .PAGE;R; BM DCB;H $BMTBL=0 ;LOADABLE BMDRV $BMDCB:: .WORD 0 ; D.LNK  .WORD .BM0 ; D.UCB .ASCII /BM/ ; D.NAM  .BYTE 0,1-1 ; D.UNIT,D.UNIT+1R .WORD BMND-BMST ; D.UCBLE .WORD $BMTBL ; D.DSP ; D.MSK - FUNCTION MASKS/ .WORD 33 ; LEGAL 0-17 IO.KIL,IO.WLB,IO.ATTD ; IO.DET/ .WORD 31 ; CONTROL 0-17 IO.KIL,IO.ATT,IO.DETT .WORD 0 ; NOOP 0-17A .WORD 0 ; ACP 0-17D .WORD 4 ; LEGAL 20-37 IO.WVB .WORD 0 ; CONTROL 20-37B .WORD 0 ; NOOP 20-37  .WORD 0 ; ACP 20-37L .WORD 0 ; D.PCBB .PAGE;.; BM UCB'S;O PR0=0BMST=. .IF DF M$$MUP .WORD 0 .ENDC.BM0:: .WORD $BMDCB ; U.DCB .WORD .-2 ; U.RED$ .BYTE UC.QUE,0 ; U.CTL,U.STSU .BYTE 0,US.OFL ; U.UNIT,U.ST2 .WORD DV.REC ; U.CW1 .WORD 0 ; U.CW2  .WORD 0 ; U.CW3O .WORD 72. ; U.CW47 .WORD $BM0 ; U.SCB  .WORD 0 ; U.ATT  .WORD 0,0 ; U.BUF,U.BUF+20 .WORD 0 ; U.CNTEBMND=.;W; BM SCB'S;O$BM0:: .WORD 0,.-2 ; S.LHD0 .WORD 0,0,0,0 ; S.FRK  .WORD 0 ; S.KS5  .WORD 0 ; S.PKT .BYTE 0,0 ; S.CTM,S.ITM0 .BYTE 0,0 ; S.STS,S.ST3M .WORD 0 ; S.ST2C. .WORD 0 ; S.KRB - NO KRB SINCE NO CONTROLLER$BMEND:: E .END,0 ; U.CTL,U.STSU .BYTE 0 .TITLE CLOCK .NLIST BEX; CONDITIONAL ASSEMBLY CONTROLS8 .IF NDF POT ; ONLY ACCEPT THE FOLLOWING DEFINITIONS IF- ; THE SYMBOL POT IS UNDEFINED. IF POT IS- ; ALREADY DEFINED, THE FILE CLOCK.MAC HAS) ; BEEN ASSEMBLED WITH THE PREFIX FILE+ ; CLKPRE.MAC, THE OUTPUT OF THE CLKGEN  ; PROCEDURE.G; THE FOLLOWING SYMBOLS ALLOW YOU TO TAILOR THE PROGRAM TO YOUR SYSTEM.6POT = 1 ; PARENT-OFFSPRING TASKING (SPWN$ DIRECTIVE)( ; 1 IF SUPPORTED, 0 IF NOT SUPPORTED. ; PARENT-OFFSRPING TASKING IS SUPPORTED IN+ ; MOST M-PLUS AND M 3.2 SYSTEMS, BUT ISN) ; NOT AVAILABLE IN EARLIER M SYSTEMS. 5 .IF GT POT ; IF SPWN$ NOT SUPPORTED, YOU CAN'T HAVE  ; RMD OR DCL7RMDSPT = 1 ; RMD (SYSTEM DISPLAY) - 1 IF SUPPORTED, 03 ; IF NOT SUPPORTED. FOR THIS FUNCTION TO WORK,R* ; THE TASK MUST BE INSTALLED AS ...RMD6DCLSPT = 1 ; DCL SUPPORT - 1 IF SUPPORTED, 0 IF NOT.. ; DCL IS SUPPORTED IN MOST M-PLUS SYSTEMS,! ; NOT AVAILABLE ON M SYSTEMS./ .IFF ; IF NO PARENT-OFFSPRING TASKING, FORCE  ; RMDSPT AND DCLSPT TO 0 RMDSPT = 0 DCLSPT = 0 .ENDC*INITX = 11. ;INITIAL HORIZONTAL POSITION'INITY = 3. ;INITIAL VERTICAL POSITIONM .ENABL LC FORCHR = 'aR .DSABL LC2 .ENDC ; END OF COND. BLOCK THAT DEFINES DEFAULT% ; VALUES IF PREFIX FILE NOT USED. - .MCALL EXIT$S,DIR$,QIOW$,GTIM$S,QIOW$C,QIO$C;6 .MCALL WTSE$S,MRKT$S,ASTX$S,QIO$,SETF$S,CMKT$S,CLEF$S .MCALL QIOW$S,DRERR$ .IF GT POT  .MCALL SPWN$S .ENDC ; DEFINITIONS 9 .MACRO PRINT A,B ;MACRO TO PRINT LENGTH B FROM ADDRESS AL MOV A,OUTDPB+Q.IOPL ;ADDRESS0 MOV B,OUTDPB+Q.IOPL+2 ;LENGTH DIR$ #OUTDPB ;EXECUTE THE QIO  .ENDM@ .MACRO PRINCR A,B ;MACRO TO PRINT AS ABOVE, EXCEPT NO CAR. RET.= MOV #053,OUTDPB+Q.IOPL+4 ;VERTICAL FORMAT CODE FOR OVERPRINTS PRINT A,B8 MOV #040,OUTDPB+Q.IOPL+4 ;RESTORE NORMAL FORMAT CONTROL .ENDM; .MACRO IOFNCT FUNC ;MACRO TO DO A PARTICULAR I/O FUNCTION ? MOV OUTDPB+Q.IOFN,-(SP) ;PUSH CURRENT I/O FUNCTION CODE T00ׂ΂jkTADATADATADATADATADATAO STKI> MOV #FUNC,OUTDPB+Q.IOFN ;PLACE FUNCTION CODE IN FUNCTION WORD DIR$ #OUTDPB ;DO THE FUNCTION/ MOV (SP)+,OUTDPB+Q.IOFN ;RESTORE PREVIOUS CODE; .ENDM+NUMCOM = 7. ;NUMBER OF AVAILABLE COMMANDSO/ .IF GT POT ;TEST FOR PARENT-OFFSPRING TASKINGU3NUMCOM = NUMCOM+1 ;IF AVAILABLE, YOU GET M COMMANDP% .IF GT RMDSPT ;TEST FOR RMD SUPPORTS3NUMCOM = NUMCOM+1 ;IF AVAILABLE, YOU GET S COMMANDF .ENDC% .IF GT DCLSPT ;TEST FOR DCL SUPPORTM3NUMCOM = NUMCOM+1 ;IF AVAILABLE, YOU GET D COMMANDE .ENDC .ENDC.HOURS = TIMEIN+G.TIHR ;POINTER TO HOURS FIELD/MINS = TIMEIN+G.TIMI ;POINTER TO MINUTES FIELDP/SECS = TIMEIN+G.TISC ;POINTER TO SECONDS FIELD7XPOS = OUTDPB+Q.IOPL+4 ;POINTER TO VERT. CURSOR CONTROL 8YPOS = OUTDPB+Q.IOPL+5 ;POINTER TO HORIZ. CURSOR CONTROL .PAGE1; CONTROL AREA. EVERYTHING ELSE COMES FROM HERE.M6CLOCK: QIOW$C SF.GMC,5,2,,,, ;GET TERM. TYPE$ CMPB TYPBUF+1,#T.VT52 ;IS IT A VT52+ BEQ 10$ ;YES, GIVE IT AN ESCAPE SEQUENCEB% CMPB TYPBUF+1,#T.V100 ;IS IT A VT100+ BEQ 10$ ;YES, GIVE IT AN ESCAPE SEQUENCEE$ BR UNDTRM ;NO, NEITHER ONE - EXIT010$: DIR$ #SMCDPB ;DECLARE TERMINAL CAPABLE OF! ;GENERATING ESCAPE SEQUENCESO+ IOFNCT IO.ATT!TF.ESQ ;ATTACH THE TERMINAL=0 PRINT #WHORU,#2 ;ASK TERMINAL TO IDENTIFY TYPE; QIOW$C IO.RLB,5,2,,,, ;READ THE ESCAPE SEQUENCEM% IOFNCT IO.DET ;DETACH THE TERMINALU4 CLRB TCBUF+1 ;PREPARE TO DISABLE ESCAPE SEQUENCES6 DIR$ #SMCDPB ;DISABLE RECOGNITION OF ESC. SEQUENCES/ MOVB #TC.TTP,TCBUF ;PREPARE TO SET TERM. TYPEE6 CMPB IOBUF+1,#'[ ;CHECK SECOND CHARACTER OF SEQUENCE( BEQ VT100 ;IF A BRACKET, IT'S A VT100 CMPB IOBUF+1,#'/ ;CHECK AGAINA BEQ VT52 ;IF A SLASH, A VT5XO@UNDTRM: PRINT #TERROR,#TERRL ;OTHERWISE, NOT A DEFINED TERMINAL( EXIT$S ;PRINT ERROR MESSAGE AND EXIT6VT100: INCB TTTYP ;POSITIVE VALUE IN TTTYP FOR VT100: MOVB #T.V100,TCBUF+1 ;PREPARE TO SET TERM TO VT100 IN SW" BR DSPINI ;PROCEED WITH DISPLAY:VT52: CMPB IOBUF+2,#'K ;CHECK THIRD CHARACTER OF SEQUENCE3 BLT UNDTRM ;IF K OR HIGHER, A VT52; OTHERWISE NO : MOVB #T.VT52,TCBUF+1 ;PREPARE TO SET TERM. TO VT52 IN SW6DSPINI: DIR$ #SMCDPB ;SET TERM. PROPERLY IN SOFTWARE4 CALL CHRALT ; MOVE DISPLAY CHARACTER INTO STORAGE8 CALL REFRSH ;JUMP DIRECTLY TO REFRESH ROUTINE (DEFAULT ;INITIAL ACTION)JINCMND: QIOW$C IO.RVB,5,2,,IOSB,, ;WAIT FOR A COMMAND CHARACTER $TSTFLG: CLEF$S #2 ;CLEAR FLAG NO. 2 TST $DSW ;WAS FLAG SET?S7 BEQ INCMND ;IF NOT, GO BACK AND WAIT FOR IT TO BE SETE/ ; (THREE LINES ABOVE FIX BUG THAT OCCURS IFH0 ; MARK TIME ELAPSES AND SETS FLAG WHILE PRO-0 ; CESSING IS GOING ON, AND THE QIO TURNS OFF ; THE FLAG AGAIN.). MOV COMBUF,R1 ;GET COMMAND CHARACTER INTO R1 * BNE 1$ ;IF CHARACTER PRESENT, PROCESS IT= CMPB IOSB,#IE.EOF ;IF NO CHARACTER PRESENT, CHECK FOR CTRL/ZI2 BNE INCMND ;IF NOT CTRL/Z, WAIT FOR NEXT COMMAND JMP EXIT ;IF CTRL/Z, EXITL:1$: CLR COMBUF ;ERASE CHARACTER FROM BUFFER FOR NEXT TIME- CMP R1,#140 ;CHECK FOR LOWER-CASE CHARACTER ! BLE 2$ ;NOT LOWER-CASE; PROCEEDU6 SUB #40,R1 ;POTENTIALLY LOWER-CASE; CONVERT TO UPPERC2$: MOV #NUMCOM-1,R0 ;SCAN COMMANDS. NUMBER OF AVAIL. COMS. INTO R0A(5$: CMPB R1,COMNAM(R0) ;BE THIS THE ONE? BEQ 7$ ;YES, GO MAKE YOUR JUMP DEC R0 ;NO, TRY THE NEXT ONE! BGE 5$ ; IF THERE IS A NEXT ONEC CALL ILLCOM ;IF NOT, TELL USER& BR TSTFLG ; AND WAIT FOR NEXT ACTION!7$: ASL R0 ;MAKE R0 A WORD INDEXO: JSR PC,@COMADR(R0) ;GO OFF AND DO WHAT YOU'RE SUPPOSED TO% BR TSTFLG ;NOW WAIT FOR NEXT ACTIONB .PAGE); COMMAND PROCESSOR SUBROUTINES, ACCESSEDE;; WITH AN INDEXED JUMP TO SUBROUTINE FROM THE CONTROL AREA.C@; TIME DISPLAY ROUTINE. ENTER WITH DIFPOS=-1 FOR NORMAL UPDATE,/; DIFPOS=0 TO FORCE COMPLETE REFRESH OF DISPLAYUA; THE FOLLOWING CODE GETS THE CURRENT TIME IN BUFFER TIMEIN, THENC=; CALCULATES THE TIME TO THE NEXT REGUALR UPDATE AND ISSUES AN0; MARK TIME REQUEST, SPECIFYING A MART-TIME AST.9UPDATE: IOFNCT IO.KIL ;KILL ANY OUTSTANDING I/O REQUESTS 3 GTIM$S #TIMEIN ;GE00߂ӂtuvT CURRENT TIME IN BUFFER TIMEIN * NEG SECS ;NEGATE SECONDS FIELD OF TIMEIN= ADD #60.,SECS ; AND ADD 60 TO YIELD TIME TO NEXT MIN. CHANGES4 CMKT$S ;CANCEL ANY OUTSTANDING MARK-TIME REQUESTS5 MRKT$S ,SECS,#2,#TIMAST ;DO AN AST WHEN TIME CHANGES ?; FOLLOWING CODE CONVERTS BINARY TIME IN TIMEIN TO DECIMAL TIME A; IN TIME. IT ALSO CHECKS EACH DIGIT AND SETS DIFPOS TO THE FIRSTKF; DIGIT THAT IS DIFFERENT. NOTE THAT DIFPOS MUST BE NEGATIVE ENTERINGD; THIS ROUTINE FOR SCAN TO WORK. IF DIFPOS IS 0, ALL DIGITS OF TIME2; ARE UNCONDITIONALLY UPDATED (HANDY FOR REFRESH).0 MOV #HOURS,R2 ;ADDRESS OF HOURS FIELD OF TIMEIN! TST MODE ;12- OR 24-HOUR CLOCK?N3 BGT 10$ ;IF POS., 24-HOUR CLOCK; SKIP SUBTRACTION,! CMP (R2),#12. ;CHECK IF AM OR PMN BLE 10$ ;IF AM, PRINT AS IST/ SUB #12.,(R2) ;IF PM, CONVERT TO 12-HOUR CLOCKM010$: CLR R1 ;R1 KEEPS TRACK OF POSITION IN TIME+20$: CLR R0 ;R0 IS COUNTER FOR DECIMALIZERA 30$: INC R0 1 SUB #10.,(R2) ;TAKE AWAY TEN FROM TIME PARAMETERR) BGE 30$ ;IF NOT NEGATIVE, TAKE TEN MORER4 DEC R0 ;TOOK TEN TOO MANY, DEC R0 FOR CORRECT TENS7 CALL DIFF ;SEE IF THIS DIGIT DIFFERENT FROM LAST TIME;. MOV (R2),R0 ;GET REMAINDER AFTER SUBTRACTION* ADD #10.,R0 ;ADD TEN TO GET CORRECT ONES# INC R1 ;BUMP THE POSITION COUNTERM7 CALL DIFF ;SEE IF THIS DIGIT DIFFERENT FROM LAST TIME & CMP R1,#4 ;DONE WITH CONVERSION YET?- BGE 40$ ;YES, GO DO SETUP FOR PRINT ROUTINEO) INC R1 ;NO. BUMP R1 PAST COLON TO HOURS) INC R1A/ TST (R2)+ ;BUMP R2 TO MINUTES FIELD OF TIMEINA BR 20$ ;NOW GO DO MINUTES 040$: TST DIFPOS ;WERE THERE ANY NEW CHARACTERS?! BLT DONE ;NO; SUPPRESS PRINTINGF) IOFNCT IO.ATT ;YES. ATTACH THE TERMINALR# CALL GRAFIC ;INVOKE GRAPHICS MODEDD; THE FOLLOWING CODE SCANS THE BUFFER TIME FROM DIFPOS, THE POSITIONB; OF THE FIRST DIGIT THAT IS DIFFERENT FROM BEFORE. IT CONSTRUCTSD; AN OUTPUT BUFFER WITH THE ELEMENTS OF EACH CHARACTER THAT IS TO BEC; OUTPUT TO THE TERMINAL, THEN PRINTS THE BUFFER. IF DOES THIS TENM+; TIMES, ONCE FOR EACH LINE OF THE DISPLAY.O?; THIS ROUTINE USES REGISTERS R0-R4 THROUGHOUT, AND R5 BRIEFLY.?$SCAN: MOV #9.,R4 ;SET UP LINE COUNT? MOVB #INITY,YPOS ;INITIALIZE CURSOR POSITIONER VERT. COMPONENTR810$: MOV DIFPOS,R3 ;GET POSITION OF FIRST DIGIT TO PRINTD MOVB CHRPOS(R3),XPOS ;GET HORIZONTAL CURSOR POSITION OF FIRST DIGIT% MOV #IOBUF,R2 ;ADDRESS OF I/O BUFFERUC20$: MOVB LINOFF(R4),R1 ;GET OFFSET INTO DATA BASE CORRESPONDING TOH ; THE CURRENT LINE NUMBERF1 MOV #10.,R0 ;SET UP COUNT OF CHARACTERS TO MOVE ) CMP R3,#2 ;ARE WE ABOUT TO DO THE COLONI BNE 30$ ;NO, ITS A NUMERAL. ASR R1 ;YES, COLON. CUT OFFSET VALUE IN HALF1 ADD #COLON,R1 ;ADD IN ADDRESS OF COLON DATA BASE % ASR R0 ;CUT CHARACTER COUNT IN HALFE! BR 40$ ;GO MOVE COLON TO BUFFER130$: MOVB TIME(R3),R5 ;GET VALUE OF CURRENT DIGITO: BNE 35$ ;IF DIGIT NONZERO, DO NOT CHECK FOR LEADING ZERO- TST R3 ;IF DIGIT ZERO, IS IT IN POSITION 0?E BNE 35$ ;NO, PRINT IT = MOV #COLON,R1 ;YES, SUPPRESS IT. HANDY STRING OF 10 SPACES.T BR 40$ ;GO MOVE IN THE SPACES (35$: ASL R5 ;MAKE DIGIT INTO WORD INDEXB ADD NUMADD(R5),R1 ;ADD ADDRESS OF DIGIT'S DATA BASE TO LINE OFST.D40$: MOVB (R1)+,(R2)+ ;MOVE CHARACTER FROM DATA BASE TO PRINT BUFFER DEC R0 ;DONE YET? # BGT 40$ ;NO, DO ANOTHER CHARACTER % INC R3 ;BUMP DIGIT POSITION COUNTERO! CMP R3,#5 ;DONE WITH THIS LINE?O# BLT 20$ ;NO, DO ANOTHER CHARACTERF= SUB #IOBUF,R2 ;YES. CALCULATE THE LENGTH OF THE PRINT BUFFERM% PRINT #IOBUF,R2 ; AND PRINT THE LINES& INCB YPOS ;MOVE CURSOR DOWN ONE LINE" DEC R4 ;DECREMENT THE LINE COUNT& BGE 10$ ;IF MORE LINES, PROCESS THEM1 MOVB #1,XPOS ;DONE. RESET CURSOR TO LEFT MARGIN0& PRINT #NULL,#1 ;REPOSITION THE CURSOR" CALL ALPHA ;RETURN TO ALPHA MODE5DONE: MOV #-1,DIFPOS ;INITIALIZE DIFPOS FOR NEXT TIMEC$ IOFNCT IO.DET ;DETACH THE TERMINAL3 RETURN ;GO BACK AND WAIT FOR SOMETHING TO HAPPENN"; EXIT ROUTINE (THIS IS A TOUGHIE)"EXIT: CALL WIPE ;CLEAR THE SCREEN EXIT$SI"; ILLEGAL COMMAND NOTIFIER ROUTINE+ILLCOM: IOFNCT IO.ATT ;00΂jkTADATADATADATADATADATAATTACH THE TERMINAL;3 MOVB #INITY+10.,YPOS ;SET UP VERT. CURSOR POSITIONR- MOVB #1,XPOS ;SET UP HORIZ. CURSOR POSITIONT TSTB TTTYP ;CHECK FOR VT100 + BEQ 10$ ;NOT A VT100 - JUST PRINT MESSAGET0 PRINT #BB100,#BB100L ;TURN ON BOLD AND BLINKING)10$: PRINT #ILLMES,#ILLMEL ;PRINT MESSAGE # MOVB #INITY+10.,YPOS ;RESET CURSORW TSTB TTTYP ;A VT100P# BEQ 20$ ;NO, JUST POSITION CURSORG. PRINT #BBOFF,#BBOFFL ;TURN OFF BOLD AND BLINK* BR 30$ ;NOT NECESSARY TO POSITION CURSOR/20$: PRINT #NULL,#1 ;REPOSITION CURSOR TO STARTM.30$: IOFNCT IO.DET ;DONE. DETACH THE TERMINAL% RETURN ;RETURN FOR ANOTHER COMMANDR; REFRESH ROUTINEY5REFRSH: CLR DIFPOS ;FORCE COMPLETE UPDATE OF DISPLAY  CALL WIPE ;CLEAR SCREEN1& CALL UPDATE ;AND GO FILL IN THE TIME RETURNS ; CLEAR BOTTOM OF SCREEN ROUTINE0CLEAR: ;SUBROUTINE TO CLEAR BOTTOM OF SCREEN4 MOVB #INITY+10.,YPOS ;SET UP VERT. CURSOR POSITION. MOVB #1,XPOS ;SET UP HORIZ. CURSOR POSITION! PRINT #NULL,#1 ;POSITION CURSORI% CALL ERASE ;ERASE TO END-OF-SCREENM RETURN ; SET 24-HOUR CLOCK MODE ROUTINE1MODE24: INC MODE ;MAKE CLOCK MODE WORD POSITIVES' CALL CLEAR ;DELETE THE COMMAND CHAR.C* CALL UPDATE ;REFRESH CLOCK IF NECESSARY RETURN1 ; SET 12-HOUR CLOCK MODE ROUTINE)MODE12: CLR MODE ;CLEAR CLOCK MODE WORDU' CALL CLEAR ;DELETE THE COMMAND CHAR.O* CALL UPDATE ;REFRESH CLOCK IF NECESSARY RETURNC@; SPAWN A TASK, WAIT FOR COMPLETION OF TASK, AND RETURN TO CLOCK8 .IF GT POT ;CANT HAVE ANY OF THIS IF PARENT-OFFSPRING ;TASKING ISNT AVAILABLE& .IF GT RMDSPT ;TEST FOR RMD SUPPORT6SPNRMD: MOV #MCRNAM,R0 ;PUT ADDRESS OF MCR NAME IN R02 MOV #RMDNAM,R1 ;PUT ADDRESS OF RMD COMMAND IN R1- MOV #3,R2 ;PUT LENGTH OF RMD COMMAND IN R2  BR SPAWN ;GO SPAWN RMDEMO .ENDC6SPNMCR: MOV #MCRNAM,R0 ;PUT ADDRESS OF MCR NAME IN R01 MOV #MCRPRM,R3 ;PUT ADDRESS OF MCR PROMPT IN R3T' BR PRMPTR ;SKIP TO PROMPTING SECTIONO& .IF GT DCLSPT ;TEST FOR DCL SUPPORT6SPNDCL: MOV #DCLNAM,R0 ;PUT ADDRESS OF DCL NAME IN R01 MOV #DCLPRM,R3 ;PUT ADDRESS OF DCL PROMPT IN R3R .ENDC;PRMPTR: MOV #IOBUF,R1 ;PUT ADDRESS OF CLI INPUT BUF. IN R1M CALL WIPE ;CLEAN THE SCREEN:GETCOM: QIOW$S #IO.RPR,#5,#1,,#IOSB,,) ;OUTPUT A PROMPT AND WAIT FOR A LINEC1 MOV IOSB+2,R2 ;GET NUMBER OF CHARACTERS READ INE0 BEQ SPNDON ;IF NO CHARACTERS, RETURN TO CLOCK?SPAWN: SPWN$S R0,,,,,#4,,,R1,R2, ;SPAWN TASK; SET EFN 4 ON EXITS* BCC 10$ ;IF DIRECTIVE OK, WAIT FOR EXIT* CMP $DSW,#IE.INS ;IS TASK NOT INSTALLED?, BNE SPNDON ;NO, FUNKIER THAN THAT - QUIT.; PRINT #NOTASK,#NOTASL ;PRINT "TASK NOT INSTALLED" MESSAGET, BR NOFRSH ;LEAVE SPAWN WITHOUT REFRESHING'10$: WTSE$S #4 ;WAIT FOR TASK TO EXIT#0 CMP R1,#IOBUF ;IF R1=#IOBUF, CALL WAS TO A CLI' BEQ GETCOM ;GO OUTPUT ANOTHER PROMPTF0SPNDON: CALL REFRSH ;REFRESH THE CLOCK DISPLAYNOFRSH: RETURN) .ENDC ;END OF COND. BLOCK GOVERNED BY + ;PARENT-OFFSPRING TASKING AVAILABILITYC*ALTER: ;ALTERS DISPLAY CHARACTERISTICS CALL WIPE ;CLEAR SCREEN3 MOV #40,XPOS ;SET UP NORMAL CURSOR CURSOR CONTROLK9 PRINT #ALTMES,#ALTMSL ;TELL ABOUT ALTERATIONS AVAILABLE < PRINT #ATOZ,#ATOZL ;PRINT ALPHABET AND INVOKE GRAPHIC MODE% CALL GRAFIC ;SHIFT TO GRAPHIC MODEO, PRINT #ATOZ,#ATOZL ;PRINT GRAPHIC ALPHABET# CALL ALPHA ;RETURN TO ALPHA MODESD10$: QIOW$S #IO.RPR,#5,#1,,#IOSB,,<#IOBUF,#79.,,#YRCHS,#YRCHSL,#044>* ;ASK FOR CHARACTER AND WAIT FOR REPLY, DEC IOSB+2 ;HOW MANY CHARACTERS SUPPLIED?& BLT 20$ ;IF NONE, NO CHANGE; RETURN- BEQ 15$ ;IF ONE, USE IT TO CHANGE DATABASES8 PRINT #TUMANY,#TUMANL ;IF MORE THAN ONE, ERROR MESSAGE BR 10$ ;TRY AGAIN615$: MOVB IOBUF,DSPCHR ;MOVE NEW CHARACTER TO STORAGE& CALL CHRALT ;AND THENCE TO DATABASE-20$: CALL REFRSH ;REFRESH THE CLOCK DISPLAYB RETURN  .PAGE; SUBROUTINE SECTION7DIFF: ;SUBROUTINE TO CHECK IF NEW DIGIT IS DIFFERENTH1 ;FROM PREVIOUS DIGIT AND DO GOOD THINGS IF SOY7 TST DIFPOS ;HAS THE FIRST DIFFERENT DIGIT BEEN FOUND? 5 B00ӂtuvGE 10$ ;YES. MOVE IN THE NEW DIGIT UNCONDITIONALLYT4 CMPB R0,TIME(R1) ;NO. COMPARE NEW DIGIT TO PREVIOUS$ BEQ 20$ ;THEY'RE THE SAME. RETURN.9 MOV R1,DIFPOS ;THEY'RE DIFFERENT. SAVE POSITION OF DIGITO010$: MOVB R0,TIME(R1) ;MOVE NEW DIGIT INTO TIME. 20$: RETURN #TIMAST: ;UPDATE-TIME AST ROUTINE7 MOV #'U,COMBUF ;PLACE UPDATE COMMAND IN COMMAND BUFFER 0 TST (SP)+ ;BUMP SP TO PROPER LOCATION FOR EXIT5 SETF$S #2 ;SET EVENT FLAG 2 TO CLEAR THE WAIT STATEH ASTX$S ;RETURN TO PROGRAM@CHRALT: MOV #LSTCHR,R0 ;SUBROUTINE TO ALTER CHAR. GEN. DATA BASE MOVB DSPCHR,R1. MOV #CHAR0,R3#5$: CMPB -(R0),#40 ;CHECK FOR SPACEE BEQ 20$ MOVB R1,(R0)I20$: CMP R0,R3 BNE 5$S RETURNI4WIPE: ;SUBROUTINE TO CLEAR SCREEN AND HOME CURSOR7 MOV #100401,XPOS ;BIT PATTERN FOR POS. 1,1 AND ERASUREN9 PRINT #NULL,#1 ;POSITION CURSOR AT HOME AND ERASE SCREEN  RETURNPF; THE FOLLOWING SUBROUTINE (3 ENTRY POINTS) PERFORMS TERMINAL-SPECIFICD; OUTPUT IN ORDER TO ERASE TO THE END OF THE DISPLAY, ENTER GRAPHICS; MODE, AND ENTER ALHPA MODE(ERASE: MOV R0,-(SP) ;SAVE CONTENTS OF R0! TSTB TTTYP ;CHECK TERMINAL TYPEC BEQ 10$ ;IF ZERO, A VT52/ MOV #ERS100,R0 ;GET ERASURE SEQUENCE FOR VT100 BR TTFUN ;PRINT SEQUENCE110$: MOV #ERS52,R0 ;GET ERASURE SEQUENCE FOR VT52T BR TTFUN ;PRINT SEQUENCE)GRAFIC: MOV R0,-(SP) ;SAVE CONTENTS OF R0A! TSTB TTTYP ;CHECK TERMINAL TYPE  BEQ 10$ ;IF ZERO, A VT524 MOV #GRA100,R0 ;GET GRAPHIC MODE SEQUENCE FOR VT100 BR TTFUN ;AND PRINT IT610$: MOV #GRA52,R0 ;GET GRAPHIC MODE SEQUENCE FOR VT52 BR TTFUN ;AND PRINT IT(ALPHA: MOV R0,-(SP) ;SAVE CONTENTS OF R0! TSTB TTTYP ;CHECK TERMINAL TYPET BEQ 10$ ;IF ZERO, A VT522 MOV #ALP100,R0 ;GET ALPHA MODE SEQUENCE FOR VT100 BR TTFUN ;AND PRINT IT410$: MOV #ALP52,R0 ;GET ALPHA MODE SEQUENCE FOR VT521TTFUN: MOV XPOS,-(SP) ;SAVE CONTENTS OF VFC FIELD . CLR XPOS ;SET VFC FIELD TO ZERO (NO CONTROL)! PRINT R0,#3 ;PRINT THE SEQUENCEH" MOV (SP)+,XPOS ;RESTORE VFC FIELD MOV (SP)+,R0 ;RESTORE R0# RETURN; .PAGE; OFFSET AND ADDRESS TABLES 6CHRPOS: ;PRINT POSITION FOR EACH CHARACTER IN PRINT0 ; LINE - USE THESE VALUES AS ARG. TO CURSOR ; POSITIONER. .BYTE INITX ;TENS OF HOURS .BYTE INITX+10. ;ONES OF HOURS  .BYTE INITX+20. ;COLON#! .BYTE INITX+25. ;TENS OF MINUTESO! .BYTE INITX+35. ;ONES OF MINUTESV7LINOFF: ;OFFSET TO THE NTH LINE OF A GIVEN CHARACTER , .BYTE 90.,80.,70.,60.,50.,40.,30.,20.,10.,02COMNAM: ;LETTERS IDENTIFYING AVAILABLE COMMANDS= .ASCII /REC21/ ;REFRESH, EXIT, CLEAR BOTTOM, 24-HR., 12-HR. .ASCII /UA/ ;UPDATE, ALTER/ .IF GT POT ;TEST FOR PARENT-OFFSPRING TASKINGS% .IF GT RMDSPT ;TEST FOR RMD SUPPORTT .ASCII /S/ ;SPAWN RMDEMO F .ENDC; .ASCII /M/ ;SPAWN MCR (FREE WITH PARENT-OFFSPRING TSKNG.).% .IF GT DCLSPT ;TEST FOR DCL SUPPORTE .ASCII /D/ ;SPAWN DCLE .ENDC .ENDC .EVEN5NUMADD: ;ADDRESS OF THE DATA BASE FOR EACH NUMERAL.$ .WORD CHAR0,CHAR1,CHAR2,CHAR3,CHAR4$ .WORD CHAR5,CHAR6,CHAR7,CHAR8,CHAR9)COMADR: ;ADDRESSES OF COMMAND ROUTINESB4 .WORD REFRSH ;JUMP ADDRESS FOR REFRESH ROUTINE (R)/ .WORD EXIT ;JUMP ADDRESS FOR EXIT ROUTINE (E): .WORD CLEAR ;JUMP ADDRESS FOR CLEAR BOTTOM OF SCREEN (C)9 .WORD MODE24 ;JUMP ADDRESS FOR 24-HOUR MODE ROUTINE (2)-9 .WORD MODE12 ;JUMP ADDRESS FOR 12-HOUR MODE ROUTINE (1)/ .WORD UPDATE ;JUMP ADDRESS FOR UPDATE ROUTINE5 .WORD ALTER ;JUMP ADDRESS FOR DISPLAY ALTER ROUTINE./ .IF GT POT ;TEST FOR PARENT-OFFSPRING TASKINGA% .IF GT RMDSPT ;TEST FOR RMD SUPPORT 3 .WORD SPNRMD ;ADDRESS FOR ROUTINE TO SPAWN RMDEMOP .ENDC0 .WORD SPNMCR ;ADDRESS FOR ROUTINE TO SPAWN MCR% .IF GT DCLSPT ;TEST FOR DCL SUPPORT 0 .WORD SPNDCL ;ADDRESS FOR ROUTINE TO SPAWN DCL .ENDC .ENDC .IF GT POT- .IF GT RMDSPT.RMDNAM: .ASCII /RMD/ ;COMMAND NAME FOR RMDEMO .EVEN .ENDC)MCRNAM: .RAD50 /MCR.../ ;TASK NAME OF MCR  .IF GT DCLSPT)DCLNAM: .RAD50 /DCL.../ ;TASK NAME OF DCLT .ENDC .ENDC; USEFUL PRINT STRINGS6ERS100: .BYTE 33,133,112 ;VT100 ERASE-TO-END-OF-SCREEN200΂jkTADATADATADATADATADATAERS52: .BYTE 33,112,0 ;VT52 ERASE-TO-END-OF-SCREEN+GRA100: .BYTE 33,50,60 ;VT100 GRAPHICS MODES)GRA52: .BYTE 33,106,0 ;VT52 GRAPHICS MODEP)ALP100: .BYTE 33,50,102 ;VT100 ALPHA MODEOAALP52: .BYTE 33,107 ;VT52 ALPHA MODE (DON'T SEPARATE FROM NULL:) 5NULL: .BYTE 0 ;NULL CHARACTER FOR CURSOR POSITIONINGC5WHORU: .BYTE 33,132 ;ESC Z QUERIES TERMINAL IDENTITY .ENABL LCABB100: .ASCII <33>/[1;5m/ ;ESC. SEQ. FOR VT100 BOLD/BLINKING TEXTSBB100L =.-BB100 ?BBOFF: .ASCII <33>/[m/ ;ESC. SEQ. TO TURN OFF VT00 DISP. CHARS.VBBOFFL =.-BBOFFO.; FOLLOWING IS TEXT OF ILLEGAL COMMAND MESSAGE&ILLMES: .ASCII /Legal commands are --/- .ASCII <15><12><12>/R - Refresh the display/D .IF GT RMDSPT% .ASCII <11><11>/S - System display /T .ASCII /(RMDEMO)/ .ENDCE .ASCII <15><12>/C - Clear bottom of screen/<11>/E - Exit to monitor/S0 .ASCII <15><12>/1 - Set as a 12-hour clock/<11>$ .ASCII /2 - Set as a 24-hour clock/ .IF GT POTL .ASCII <15><12>&M&= .IF GT DCLSPT .ASCII &/D& .ENDC .ASCII & - Call MCR&D .IF GT DCLSPT .ASCII &/DCL& .ENDC* .ASCII & (Press to return to clock)& .ENDC- .ASCII <15><12>/A - Alter display character/>ILLMEL = .-ILLMESe .DSABL LC; PSEUDO-CLI PROMPTS .IF GT POTsMCRPRM: .ASCII /MCR>/  .IF GT DCLSPTDCLPRM: .ASCII /DCL>/- .ENDC .ENDC; "TASK NOT INSTALLED" MESSAGE7NOTASK: .ASCII /NO CAN DO - THAT TASK IS NOT INSTALLED/ NOTASL = .-NOTASKuEALTMES: .ASCII /SELECT A NEW DISPLAY CHARACTER ( FOR NO CHANGE)./&" .ASCII /YOUR SELECTION IS --/<12>ALTMSL = .-ALTMESIATOZ: .ENABL LC.) .ASCII /abcdefghijklmnopqrstuvwxyz{|}`~/. .DSABL LCATOZL = .-ATOZ YRCHS: .ASCII <12>/YOUR CHOICE?/YRCHSL =.-YRCHS 4TUMANY: .ASCII /YOU CAN ONLY SPECIFY ONE CHARACTER./TUMANL =.-TUMANYHTERROR: .ASCII /YOU CAN ONLY RUN THE CLOCK ON A VT100 OR VT52. SORRY.../TERRL =.-TERROR #; DATA BASE FOR CHARACTER GENERATORS .ENABL LCCHAR0: .ASCII / aaaaaa / .ASCII / aaaaaaaa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aaaaaaaa / .ASCII / aaaaaa /CHAR1: .ASCII / aa / .ASCII / aaa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aaaa / .ASCII / aaaa /CHAR2: .ASCII / aaaaaa / .ASCII / aaaaaaaa / .ASCII / aa aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aaaaaaa / .ASCII / aaaaaaaa /CHAR3: .ASCII / aaaaaa / .ASCII / aaaaaaaa / .ASCII / aa aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa aa / .ASCII / aaaaaaaa / .ASCII / aaaaaa /CHAR4: .ASCII / aa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aaaaaaaa / .ASCII / aaaaaaaa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa /CHAR5: .ASCII / aaaaaaa / .ASCII / aaaaaaa / .ASCII / aa / .ASCII / aa / .ASCII / aaaaaaa / .ASCII / aa aaa / .ASCII / aa / .ASCII / aa / .ASCII / aa aa / .ASCII / aaaaa /CHAR6: .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aaaaaaa / .ASCII / aaaaaaaa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aaaaaaaa / .ASCII / aaaaaa /CHAR7: .ASCII / aaaaaaaa / .ASCII / aaaaaaaa / .ASCII / aa aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aaa /CHAR8: .ASCII / aaaaaa / .ASCII / aaaaaaaa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aaaaaa / .ASCII / aaaaaa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aaaaaaaa / .ASCII / aaaaaa /CHAR9: .ASCII / aaaaaa / .ASCII / aaaaaaaa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aaaaaaaa / .00tuvASCII / aaaaaaa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa /COLON: .ASCII / /I .ASCII / /. .ASCII / // .ASCII / /  .ASCII / /I .ASCII / aaa /. .ASCII / aaa // .ASCII / /  .ASCII / aaa /a .ASCII / aaa / LSTCHR: .DSABL LC .EVEN .PAGE'; IMPURE AREA (NOT TOO IMPURE, I HOPE!)I>OUTDPB: QIOW$ IO.WLB,5,1,,,,<0,0,40> ;DPB FOR OUTPUT OPERATION<SMCDPB: QIOW$ SF.SMC,5,2,,IOSB,, ;DPB FOR SET MULT. ;CHARACTERISTICS OPERATION 9TIMEIN: .BLKW 8. ;BUFFER FOR TIME PARAMETERS FROM GTIM$SS7DIFPOS: .WORD 0 ;WORD TO CONTAIN FIRST DIFFERENT DIGIT.&COMBUF: .WORD 0 ;COMMAND INPUT BUFFER1MODE: .WORD 0 ;CLOCK MODE (0=12-HOUR, +=24-HOUR)!IOSB: .BLKW 2 ;I/O STATUS BUFFER;TCBUF: .BYTE TC.ESQ,1 ;BUFFER TO SET/CLEAR ESCAPE SEQ. REC.;TYPBUF: .BYTE TC.TTP,0 ;BUFFER TO GET TERM. CHARACTERISTICSW.TIME: .BLKB 5 ;5-BYTE BUFFER FOR DECIMAL TIME/TTTYP: .BYTE 0 ;TERMINAL TYPE: 0=VT52, 1=VT100R?DSPCHR: .BYTE FORCHR ;DISPLAY CHARACTER; INITIALIZE TO DEFAULTB0IOBUF: .BLKB 79. ;PRINT BUFFER (AND CLI COMMAND ; LINE INPUT BUFFER) .END CLOCKIGIT.&COMBUF: .WORD 0 ;COMMAND INPUT BUFFER1MODE: .WORD 0 ;CLOCK MODE (0=12-HOUR, +=24-HOUR)!IOSB: .BLKW 2 ;I/O STATUS BUFFER;TCBUF: .BYTE TC.ESQ,1 ;BUFFER TO SET/CLEAR ESCAPE SEQ. REC.;TYPBUF: .BYTE TC.TTP,0 ;BUFFER TO GET TERM. CHARACTERISTICSW.TIME: .BLKB 5 ;5-BYTE BUFFER FOR DECIMAL TIME/TTTYP: .BYTE 0 ;TERMINAL TYPE: 0=VT52, 1=VT100R?DSPCHR: .BYT .TITLE HIYA .LIST TTM .NLIST BEX .ENABL LC; MACRO LIBRARY CALLS .MCALL EXIT$S,QIOW$,DIR$,GTSK$INDPB: QIOW$ IO.RLB,5,1,,IOST &OUTDPB: QIOW$ IO.WLB,5,1,,IOST,,<,,40>SYSDPB: GTSK$ SYSBUF; LOCAL EQUATES/BSIZE=80. ; ACCEPTS NAMES UP TO 80 CHARACTERS; LOCAL DATA BUFFERS-MSG1: .ASCII /Could I have your name please?/"MSG1L=.-MSG1 ; THE LENGTH OF MSG1&MSGMP: .ASCII /RSX-11M-PLUS calling / %MSGMPL=.-MSGMP ; THE LENGTH OF MSGMPMSGM: .ASCII /RSX-11M calling /"MSGML=.-MSGM ; THE LENGTH OF MSGM1BUFF: .BLKB BSIZE ; SET UP BUFFER LENGTH = BSIZE ,OBUFF: .ASCII /IO ERROR WITH STATUS/<12><15>I1: .ASCII /DSW = /I2: .ASCII /IOST = / OSIZ=.-OBUFF .EVEN IOST: .BLKW 2SSYSBUF: .BLKW 16.; MAIN PROGRAM*HIYA: DIR$ #SYSDPB ; GET TASK ENVIRONMENT MOV #MSG1,R0 ; SET UP CALLs& MOV #MSG1L,R1 ; TO WRITE SUBROUTINE" MOV #40,R2 ; SINGLE SPACE OUTPUT CALL WRITE ; OUTPUT MSG1 MOV #BUFF,R0 ; SET UP CALL $ MOV #BSIZE,R1 ; TO READ SUBROUTINE# CALL READ ; READ NAME INTO BUFFER , MOV R2,-(SP) ; SAVE LENGTH OF READ TO STACK% CMP #1,SYSBUF+G.TSSY; IS IT RSX-11M?> BNE 10$' MOV #MSGM,R0 ; SET UP CALL FOR RSX-11M % MOV #MSGML,R1 ; TO WRITE SUBROUTINEB MOV R1,R4 ; SAVE LENGTH. BR 20$A110$: MOV #MSGMP,R0 ; SET UP CALL FOR RSX-11M-PLUSE& MOV #MSGMPL,R1 ; TO WRITE SUBROUTINE MOV R1,R4 ; SAVE LENGTH %20$: MOV #'$,R2 ; NO CARRIAGE RETURN CALL WRITE ; OUTPUT MESSAGE  MOV #BUFF,R0' MOV (SP)+,R1 ; RECOVER LENGTH OF NAMEU- MOVB #15,BUFF(R1) ; APPEND A CARRIAGE RETURNV INC R1 CLR R2 ;  CALL WRITE ; OUTPUT NAMEB ADD R4,R1 DEC R1 EXIT$S ; LEAVEV;+7; WRITE - SUBROUTINE TO WRITE A MESSAGE TO THE TERMINALI;S ; INPUTS:0; R0 - ADDRESS OF STRING TO BE PRINTED ON SCREEN ; R1 - LENGTH OF STRING TO PRINT.; R2 - LOW-ORDER CHARACTER IS CARRIAGE CONTROL;V ; OUTPUTS:; NONE;; NOTE:V@; WRITE OUTPUTS A PREFORMATTED ASCII STRING. ALL DATA CONVERSION?; (OCTAL NUMBERS TO ASCII, FOR EXAMPLE) MUST BE DONE BEFOREHAND,;-.WRITE:: MOV R0,OUTDPB+Q.IOPL ; FILL IN QIO DPB MOV R1,OUTDPB+Q.IOPL+2U MOV R2,OUTDPB+Q.IOPL+4D DIR$ #OUTDPB  BCS ERR1 ; DIRECTIVE ERROR TSTB IOST ; IO ERROR?  BLT ERR1 ; YES RETURNU;+2; READ - SUBROUTINE TO READ A LINE FROM A TERMINAL;- ; INPUTS:S; R0 - ADDRESS OF INPUT BUFFER+; R1 - MAXIMUM NUMBER OF CHARACTERS TO READ:; ; OUTPUTS:6; R2 - ACTUAL NUMBER OF CHARACTERS READ (NOT INCLUDING; TERMINATING CARRIAGE RETURN;T; NOTE:F=; THIS ROU00  kTADATADATADATADATADATATINE ONLY READS IN ASCII STRINGS. NO INTERPRETATIONP=; OR DATA CONVERSION IS DONE. NUMBERS READ IN WILL HAVE TO BEU=; CONVERTED TO THEIR BINARY EQUIVALENTS USING THE SYSTEM DATAT; CONVERSION SUBROUTINES.T;-,READ:: MOV R0,INDPB+Q.IOPL ; FILL IN QIO DPB MOV R1,INDPB+Q.IOPL+2 DIR$ #INDPB BCS ERR1 ; DIRECTIVE ERROR TSTB IOST ; IO ERROR?N BLT ERR1 ; YES+ MOV IOST+2,R2 ; RETURN COUNT OF CHARACTERSB RETURNR;+;; ERR1 - ERROR HANDLING ROUTINE FOR DIRECTIVE AND IO ERRORSO;F9; NOTE THAT ONLY ONE OF THE TWO NUMBERS DISPLAYED WILL BET ; SIGNIFICANT ;-0ERR1: MOV #I1+6,R0 ; ADDRESS TO CONVERT DSW INTO$ MOV $DSW,R1 ; DSW VALUE TO CONVERT# CLR R2 ; LEADING ZERO SUPPRESSIONB- CALL $CBDSG ; CONVERT BINARY TO SIGNED DEC.F2 MOV #I2+7,R0 ; ADDRESS TO CONVERT IO STATUS INTO2 MOVB IOST,R1 ; IO STATUS RETURN VALUE TO CONVERT# CLR R2 ; LEADING ZERO SUPPRESSION2( CALL $CBDSG ; CONVERT IO STATUS RETURN+ MOV #OBUFF,OUTDPB+Q.IOPL ; FILL IN QIO DPBE MOV #OSIZ,OUTDPB+Q.IOPL+2' DIR$ #OUTDPB ; EXECUTE OUTPUT REQUESTP EXIT$SL .END HIYAFICANT ;-0ERR1: MOV #I1+6,R0 ; ADDRESS TO CONVERT DSW INTO$ MOV $DSW,R1 ; DSW VALUE TO CONVERT# CLR R2 ; LEADING ZERO SUPPRESSIONB- CALL $CBDSG ; CONVERT BINARY TO SIGNED DEC.F2 MOV #I2+7,R0 ; ADDRESS TO CONVERT IO STATUS INTO2 MOVB IOST,R1 ; IO STATUS RETURN VALUE TO CONVERT# CLR R2 ; LEADING ZERO SUPPRESSION2( CALL $CBDSG ; CONVERT IO STATUS RETURN+ MOV #OBUFF,OUTDPB+Q.IOPL ; FILL IN QIO DPBE MOV #OSIZ,OUTDPB+Q.IOPL+2' DIR$ .TITLE STARS .NLIST BEX .LIST TTME; DEMONSTRATION SUBROUTINE FOR USE WITH "INTRODUCTION TO RSX-11M AND O; RSX-11M-PLUS" "HIYA" PROGRAM. PRINTS A LINE OF STARS UNDER GREETING MESSAGE.C; INPUTS: R0 CONTAINS ADDRESS OF MESSAGE BUFFER, R1 CONTAINS NUMBER9; OF STARS TO BE PRINTED. R0 AND R1 COME BACK UNCHANGED.5STARS:: MOV R1,R2 ; SET UP TALLY FOR NUMBER OF STARS410$: MOVB #'*,(R0)+ ; FILL MESSAGE BUFFER WITH STARS" DEC R2 ; TO THE CORRECT NUMBER.1 BGT 10$ ; IF NOT FINISHED, STASH ANOTHER STAR0 SUB R1,R0 ; RESTORE ADDRESS OF MESSAGE BUFFER MOV #40,R2 ; CARRIAGE CONTROLO CALL WRITE ; OUTPUT THE STARSH$ RTS PC ; RETURN TO CALLING PROGRAM .ENDREETING MESSAGE.C; INPUTS: R0 CONTAINS ADDRESS OF MESSAGE BUFFER, R1 CONTAINS NUMBER9; OF STARS TO BE PRINTED. R0 AND R1 COME BACK UNCHANGED.5STARS:: MOV R1,R2 ; SET UP TALLY FOR NUMBER OF STARS410$: MOVB #'*,(R0)+ ; FILL MESSAGE BUFFER WITH STARS" DEC R2 ; TO THE CORRECT NUMBER.1 BGT 10$ ; IF NOT FINISHED, S? .TITLE TMCLI - EXAMPLE CLI THAT IMPLEMENTS "T" AND "M" COMMAND .IDENT /1.00/;N; THIS TASK (TMCLI) ILLUSTRATES THE USE OF THE CLI CONTROL DIRECTIVES PRESENT ); IN RSX-11M V4.0 AND RSX-11M-PLUS V2.0. ;F; WHEN SET UP AS A TERMINAL'S CLI, IT PROVIDES THE FOLLOWING COMMANDS:;; T -> TYPE FILE; M -> SET TERMINAL TO MCR;>; IF THE FIRST TWO LETTERS OF THE COMMAND ARE NOT "T" FOLLOWED3; BY A SPACE, OR "M" FOLLOWED BY A CARRIAGE RETURN,8; THE COMMAND IS PASSED TO MCR FOR EXECUTION. THEREFORE,H; USERS AT TERMINALS SET TO THIS CLI WILL SEE THE ENTIRE MCR COMMAND SETF; AS BEING PRESENT, PLUS THE "T" AND "M" COMMANDS. IF THE "DPR" SWITCHF; IS INCLUDED ON THE CLI /INIT COMMAND, USERS WILL KNOW IMMEDIATELY IFG; THEIR TERMINAL IS SET TO THIS CLI BY THE PRESENCE OF THE DOUBLE RIGHT ; ANGLE BRACKET AS THE PROMPT.;OF; IF IT IS INITIALIZED WITH THE SYSTEM MESSAGE OPTION ENABLED, IT WILLD; GREET USERS WHEN THEIR TERMINAL IS SET TO THE CLI, AND SAY GOODBYE ; TO THEM WHEN THEY SWITCH AWAY.;FB; IN ORDER TO BRING THIS CLI UP ON THE SYSTEM, ISSUE THE FOLLOWING; COMMAND SEQUENCE:G;E; >MAC TMCLI,TMCLI/-SP=TMCLI+; >TKB TMCLI,TMCLI/-SP=TMCLI,[1,1]EXELIB/LBT ; >INS TMCLI/CLI=YES/TASK=...TMC9; >CLI /INIT=TMCLI/MESSAGE/DPR="<15><12>/>>/"/TASK=...TMCT;P;; TO SET TERMINALS TO THIS CLI, ISSUE THE FOLLOWING COMMAND6; WHERE TTN: IS REPLACED BY THE TERMINAL NUMBER OR TI:;N; >SET /CLI=TTN:TMCLI ;RH; NOTE THAT THE PROMPT ISSUED IN RESPONSE TO A CONTROL/C DEFAULTS TO THE%; NAME OF THE CLI 00tuvWHICH IS "TMCLI>". N;HJ; IT CAN BE ELIMINATED FROM THE SYSTEM BY THE FOLLOWING COMMANDS, ASSUMING; NO TERMINALS ARE SET TO IT:B;C; >CLI /ELIM=TMCLI ; >REM ...TMC;IH; EXPERIMENT WITH THE OTHER OPTIONS ON THE CLI /INIT COMMAND, THE ENABLEL; AND DISABLE CLI COMMANDS, AND LEAVING OFF THE /MESSAGE SWITCH ON THE /INITG; COMMAND TO OBSERVE THE EFFECT THEY HAVE. ALSO TRY CHANGING THE /TASK=LE; SWITCH ON THE INS AND CLI /INIT COMMAND TO "/TASK=TMCLI" AND NOTICELJ; THAT ONLY ONE COPY OF THE TASK WILL EXIST FOR ALL TERMINALS, RATHER THANE; ONE PER COMMAND. IF THIS IS DONE, YOU SHOULD ALSO CHANGE THE OPTIONRK; ON THE GCCI$ DIRECTIVE FROM GC.CEX TO GC.CST SO THE TASK WILL STAY ACTIVEE6; BUT STOPPED WHEN NO COMMANDS ARE OUTSTANDING FOR IT.;B + .MCALL GCCI$,RPOI$,EXIT$S,QIOW$,ALUN$,DIR$H;M; DIRECTIVE DPBS;/,GCCI: GCCI$ CMDBUF,CBLEN,IBUF,IBLEN,0,GC.CEXRPOI: RPOI$ MCR... QIOW: QIOW$ IO.WVB,5,1,,,,<,,40> ALUN: ALUN$ 5O N;O; BUFFER AREAS;N?CMDBUF: .BLKB 80.+G.CCBF ;LENGTH = HEADER PLUS COMMAND IN BYTESN, ;NOTE THAT ON M-PLUS THE MAXIMUM COMMAND/ ;LENGTH IS 255. BYTES, SO THE LENGTH SHOULDT0 ;BE <255.+G.CCBF> OR CHARACTERS MAY BE LOST. W"CBLEN=.-CMDBUF ;CALCULATE LENGTH .EVEN S<IBUF: .BLKB G.CCCA+2 ;LONG ENOUGH TO CONTAIN ALL INFORMATION IBLEN=.-IBUF ;CALCULATE LENGTH .EVEN CCTCMD: .ASCII /PIP TI:=/ ;BASIC PIP COMMAND TO IMPLEMENT "T" COMMAND !TCLEN=.-TCMD ;LENGTH OF COMMANDL4BUF: .BLKB 80.-TCLEN ;BUFFER TO GENERATE COMMANDS IN .EVEN GAMCR: .ASCII /M/<15> ;STRING TO RECOGNIZE AS A SET TO MCR REQUESTX8MCMD: .ASCII %SET /MCR=TI:% ;SET TERMINAL TO MCR COMMAND!MCLEN=.-MCMD ;LENGTH OF COMMANDA .EVEN E;S=; TEXT TO BE DISPLAYED UPON RECEIPT OF NEW TERMINAL LINKED ORB(; TERMINAL REMOVED MESSAGES FROM SYSTEM.;R8LKT: .ASCII <15><12>/WELCOME TO THE EXAMPLE CLI/<15><12> LKTLEN=.-LKT .EVEN C;RMT: .ASCII <15><12>/GOOD BYE FROM THE EXAMPLE CLI/<15><12>H RMTLEN=.-RMT .EVEN 8;T6; CHARACTERS LOST DUE TO BUFFER BEING TO SMALL MESSAGE;IECHLOST: .ASCII <15><12>/SORRY, PART OF YOUR COMMAND WAS LOST/<15><12>%CLLEN=.-CHLOST T;I; ILLEGAL COMMAND MESSAGE-;D-ILL: .ASCII <15><12>/ILLEGAL COMMAND/<15><12>T ILLLEN=.-ILL .EVEN P;F ; CLI CODE;I D .ENABL LSBN-START: DIR$ #GCCI ;GET A COMMAND FROM SYSTEMI" BCS 100$ ;IF CS, DIRECTIVE ERROR;1E; IF THE GCCI$ DIRECTIVE HAD THE GC.CST OPTION SPECIFIED, WE MAY HAVEE5; JUST BEEN UNSTOPPED, SO WE HAVE TO GET THE COMMAND. ;R* CMP #IS.CLR,$DSW ;WERE WE JUST UNSTOPPED? BEQ START ;IF EQ YES( MOV #CMDBUF,R0 ;POINT TO COMMAND BUFFER% TST (R0) ;IS THIS A SYSTEM MESSAGE? BEQ MSG ;IF EQ YES= CMPB G.CCCT(R0),G.CCCL(R0) ;DID ENTIRE COMMAND FIT IN BUFFERN BLO 150$ ;IF LO NO. MOV #RPOI,R5 ;POINT TO DPB OF RPOI$ DIRECTIVE;CE; AT THIS POINT, THE CLI HAS A COMMAND TO BE PROCESSED. THE CODE FROMD; THE "START:" LABEL TO HERE SHOULD BE FAIRLY COMMON AMONG ALL CLIS.J; FROM THIS POINT ON, THE CODE WILL BE SPECIFIC TO THE PARTICULAR LANGUAGED; THIS CLI IS IMPLEMENTING. COMMANDS CAN BE ADDED OR DELETED AT WILLD; BY MODIFYING CODE IN THIS SECTION. AS STATED ABOVE, THIS EXTREMELYE; SIMPLE CLI PROVIDES TWO COMMANDS, AND GIVES EVERYTHING ELSE TO MCR.NI; THIS CREATES AN OPEN ENDED ENVIRONMENT. REJECTING UNRECOGNIZED COMMANDSIG; INSTEAD OF PASSING THEM TO MCR WOULD LIMIT THE TERMINAL USER'S USE OFFA; THE SYSTEM TO ONLY THOSE OPERATIONS ALLOWED BY THE CLI. THIS ISLH; A SECURE WAY OF CONTROLLING SYSTEM USE, IN CASES WHEN IT IS NECESSARY.?; IN THIS EXAMPLE, CHANGING THE "BNE 50$" BELOW, TO A "BNE 60$"LC; WOULD CREATE AN ENVIRONMENT WHERE THE ONLY OPERATION A USER COULDHH; PERFORM WOULD BE TO TYPE FILES ON THE TERMINAL, OR SWITCH BACK TO MCR.J; ALL OF THE REST OF RSX IS TOTALLY INACCESSABLE. IF NO MEANS OF SWITCHINGD; BACK TO MCR IS PROVIDED, IT WOULD BE IMPOSSIBLE FOR THE USER TO DO2; ANYTHING THE CLI DOES NOT EXPLICITLY LET HIM DO.;L E* CMP #"T ,G.CCBF(R0) ;IS IT A "T" COMMAND? BEQ 10$ ;IF EQ YES) CMP MCR,G.CCBF(R0) ;IS IT A "M" COMMAND?X L;CG; CHANGE THE NEXT IN00  kTADATADATADATADATADATASTRUCTION TO "BNE 60$" TO ELIMINATE PASSING UNKNOWNN; COMMANDS TO MCR.;I BNE 50$ ;IF NE NOE;RB; THE USER HAS ENTERED AN "M" COMMAND, SO SET THE TERMINAL TO MCR.; : MOV #MCMD,R.POBF(R5) ;PUT ADDRESS OF CMD TO ISSUE IN DPB0 MOV #MCLEN,R.POBL(R5) ;PUT LENGTH OF CMD IN DPB BR ISSCMD ;ISSUE COMMAND ;TC; THE USER HAS ENTERED A "T" COMMAND SO CONSTRUCT THE NECESSARY PIPF; COMMAND AND SEND IT TO MCR;1 410$: MOV R0,R1 ;COPY ADDRESS OF BUFFER WITH COMMAND- ADD #G.CCBF+1,R1 ;POINT TO SPACE AFTER THE T 4 MOV #BUF,R2 ;POINT TO BUFFER THAT WILL CONTAIN CMD5 MOV #TCLEN,R4 ;GET LENGTH OF INITIAL PART OF COMMANDA&20$: MOVB (R1)+,R3 ;GET NEXT CHARACTER+ CMPB #15,R3 ;IS IT THE END OF THE COMMANDF BEQ 30$ ;IF EQ YES CMPB #40,R3 ;IS IT A SPACE BEQ 20$ ;IF EQ YES, SKIP IT . MOVB R3,(R2)+ ;PUT CHARACTER IN OUTPUT BUFFER INC R4 ;COUNT CHARACTERH BR 20$ ;GET NEXT CHARACTER<30$: MOV #TCMD,R.POBF(R5);PUT ADDRESS OF CMD TO ISSUE IN DPB, MOV R4,R.POBL(R5) ;INSERT LENGTH OF COMMAND;CE; THIS COMMAND WILL BE PASSED TO THE MAIN COMMAND DISPATCHER (MCR...)MB; WHICH WILL START A COPY OF PIP AND GIVE IT THE COMMAND. THE RPOID; DIRECTIVE COULD BE USED TO GIVE THE COMMAND DIRECTLY TO ...PIP AND<; GIVE THE RESULTING TASK A DIFFERENT NAME. IN THIS EXAMPLE,>; WE COULD CALL THE RESULTING PIP TASK "TYPTNN" WHERE THE LASTD; THREE CHARACTERS (TNN) ARE REPLACED BY A DEVICE NAME CHARACTER ANDA; UNIT NUMBER. FOR EXAMPLE, IF THE "T" COMMAND WAS TYPED ON TT10:.D; THE RESULTING TASK NAME COULD BE MADE TO BE "TYPT10". THIS HAS THEG; ADVANTAGE OF ALLOWING THE TASK TO BE ABORTED BY AN "ABO TYP" COMMAND,PE; INSTEAD OF "ABO PIP", THUS THE USER WOULD NOT HAVE TO KNOW THAT THEHE; "T" COMMAND HE ISSUED IS ACTUALLY BE SERVICED BY THE PIP TASK. THIS @; IS EXACTLY WHAT THE DCL CLI DOES. IT IS NOT DONE HERE IN ORDER@; TO SIMPLIFY THE EXAMPLE. PICKING UP THE TERMINAL NAME AND UNITH; NUMBER, CONVERTING IT TO RAD50, AND SUPPLYING IT IN THE RPOI DIRECTIVEH; ALONG WITH A DIRECT REQUEST OF PIP IS LEFT AS AN EXERCISE TO THE USER.>; (BE CAREFUL ON M-PLUS SYSTEMS WITH MORE THAN 64. TERMINALS).I; NOTE THAT REQUESTING PIP DIRECTLY AVOIDS A SUBSTANTIAL AMOUNT OF SYSTEMA ; OVERHEAD.A;H BR ISSCMD ;EXECUTE COMMAND T;L5; COMMAND IS NOT "T" OR "M", SO GIVE IT TO MCR AS IS. ; @50$: MOV #CMDBUF+G.CCBF,R.POBF(R5) ;PUT ADDRESS OF STRING IN DPB3 MOVB G.CCCT(R0),R.POBL(R5) ;PUT LENGTH IN RPOI DPB  V;I*; ISSUE RPOI$ DIRECTIVE TO EXECUTE COMMAND;R?ISSCMD: MOV (R0),R.PODV(R5) ;PUT NAME OF ISSUING DEVICE IN RPOIS- MOVB G.CCUN(R0),R.POUN(R5) ;COPY UNIT NUMBER 7 MOVB IBUF+G.CCPU,R.POUM(R5) ;PROPOGATE UIC OF TERMINALP MOVB IBUF+G.CCPU+1,R.POUG(R5)C MOV IBUF+G.CCOA,R.POOA(R5) ;COPY ID PARENT IN CASE WE WERE SPAWNED+ DIR$ #RPOI ;PASS COMMAND TO EXECUTOR TASKO BCC START ;IF CC, SUCCESSM BR 110$ ;ERROR );UC; CONTROL IS TRANSFERED HERE IF UNKNOWN COMMANDS ARE TO BE REJECTEDN!; INSTEAD OF BEING PASSED TO MCR.I;T160$: MOV #ILL,R1 ;POINT TO MESSAGE TO BE PRINTED(& MOV #ILLLEN,R2 ;GET LENGTH OF MESSAGE CALL ISSMSG ;ISSUE MESSAGE BR START ;TRY FOR NEXT COMMAND ,;O; ERROR HANDLING CODEF;R A#100$: CLR R0 ;FATAL ERROR ON GCCI$M BR 150$&110$: MOV #1,R0 ;FATAL ERROR ON RPOI$120$: IOT ;FATAL 4150$: MOV #CHLOST,R1 ;POINT TO MESSAGE TO BE PRINTED% MOV #CLLEN,R2 ;GET LENGTH OF MESSAGEU CALL ISSMSG ;ISSUE MESSAGE BR START .DSABL LSBT E;J4; A SYSTEM MESSAGE WAS RECEIVED INSTEAD OF A COMMAND;# ,@MSG: CMPB #CM.LKT,G.CCUN(R0) ;IS IT A NEW TERMINAL LINKED TO US? BEQ 10$ ;IF EQ YES8 CMPB #CM.RMT,G.CCUN(R0) ;IS IT A TERMINAL BEING REMOVED BEQ 20$ ;IF EQ YES6 CMPB #CM.EXT,G.CCUN(R0) ;IS IT A ELIMINATE ALL PACKET BEQ 50$ ;IF EQ YES9 CMPB #CM.ELM,G.CCUN(R0) ;IS IT A CLI ELIMINATION MESSAGEC BEQ 50$ ;IF EQ YES% BR START ;IGNORE ALL OTHER MESSAGES ;G; ISSUE WELCOME MESSAGEM; (10$: MOV #LKT,R1 ;POINT TO MESSAGE TEXT MOV #LKTLEN,R2 ;GET LENGTHS/ ADD #G.CCBF,R0 ;POINT TO TERMINAL THAT WAS SET BR 30$ ; R;;; ISSUE GOOD BYE MESSAGE;O(20$:00"tuv MOV #RMT,R1 ;POINT TO MESSAGE TEXT MOV #RMTLEN,R2 ;GET LENGTHB' ADD #G.CCBF,R0 ;POINT TO TERMINAL NAME 30$: CALL ISSMSG ;ISSUE MESSAGE JMP START ;GET NEXT COMMANDQ;S=; WHEN AN ELIMINATE ALL MESSAGE IS RECEIVED, EXIT IMMEDIATELYB;5 50$: EXIT$SS B;T; ROUTINE TO PRINT TO TERMINAL;G; ; INPUTS:M;E,; R0=ADDRESS OF NAME OF TERMINAL TO PRINT TO ; R1=ADDRESS OF MESSAGE TO PRINT; R2=LENGTH OF MESSAGE;T ; OUTPUTS:; ; NONE;BF; THIS ROUTINE PRINTS THE SPECIFIED MESSAGE ON THE SPECIFIED TERMINAL.C; ALL ERRORS THAT MIGHT RESULT ARE IGNORED. IN GENERAL, CLIS SHOULDTB; DO ASYNCHRONOUS I/O WITH COMPLETION AST'S, AND PROVIDE A TIMEOUT>; FACILITY TO KILL THE I/O IF IT HASN'T COMPLETED IN A CERTAINA; AMOUNT OF TIME IN ORDER TO PREVENT TERMINAL I/O FROM HOLDING UPT;; COMMAND PROCESSING. THIS IS NOT DONE HERE FOR SIMPLICITY.E;N T1ISSMSG: MOV (R0),ALUN+A.LUNA ;SET UP DEVICE NAMEL( MOVB 2(R0),ALUN+A.LUNU ;AND UNIT NUMBER$ CLRB ALUN+A.LUNU+1 ;CLEAR HIGH BYTE2 DIR$ #ALUN ;ASSIGN LUN 5 TO THE SPECIFIED DEVICE BCS 10$ ;IF CS, SKIP I/O+ MOV R1,QIOW+Q.IOPL ;SET ADDRESS OF MESSAGEN/ MOV R2,QIOW+Q.IOPL+2 ;INSERT LENGTH OF MESSAGEO$ DIR$ #QIOW ;DO I/O AND WAIT FOR IT 10$: RETURNE N .END START  T OF TIME IN ORDER TO PREVENT TERMINAL I/O FROM HOLDING UPT;; COMMAND PROCESSING. THIS IS NOT DONE HERE FOR SIMPLICITY.E;N T1ISSMSG: MOV (R0),ALUN+A.LUNA ;SET UP DEVICE NAMEL( MOVB 2(R0),ALUN+A.LUNU ;AND UNIT NUMBER$ CLRB ALUN+A.LUNU+1 ;CLEAR HIGH BYTE2 DIR$ #ALUN ;ASSI .TITLE XXDRV XX DEVICE DRIVER .IDENT /09/ F;S;J; XX11 CARTRIDGE DISK DRIVER;R; MACRO LIBRARY CALLSI;P .MCALL HWDDF$,PKTDF$ $ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS;E; EQUATED SYMBOLSS;M#LD$XX=0 ; DEFINE LOADABLE DRIVER RETRY=8. ;ERROR RETRY COUNTR'X$$X11=1. ; DEFINE NO. OF CONTROLLERSO;R ; LOCAL DATA;,>; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER);N<RTTBL: .BLKW X$$X11 ;ERROR RETRY COUNT AND DRIVE RESET FLAG; ; DIAGNOSTIC FUNCTION TABLE/;F!FUNTBL: .WORD IO.HMS!IQ.UMD, 0515V .WORD IO.BLS!IQ.UMD, 0511!FUNTB0: .WORD IO.RDH!IQ.UMD, 2505H .WORD IO.WDH!IQ.UMD, 2503 .WORD IO.WCK!IQ.UMD, 0507FUNTBE:O;S; DRIVER DISPATCH TABLES;M1 DDT$ XX,X$$X11,,,,NEW ;GENERATE DISPATCH TABLE ;;+3; **-XXINI-XX11 CARTRIDGE DISK CONTROLLER INITIATORO;J; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUESTN; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPAGATE THE EXECU-N; TION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN ATTEMPTI; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER ISUI; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER-L>; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.; ; INPUTS:X; :; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;E ; OUTPUTS:;EE; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAIT-RE; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPER-T; ATION IS INITIATED. ;- .ENABL LSBN9XXINI: GTPKT$ XX,X$$X11 ;GET NEXT I/O PACKET TO PROCESS ;N1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:M;I'; R1=ADDRESS OF THE I/O REQUEST PACKET. -; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.H; R3=CONTROLLER INDEX.(; R4=ADDRESS OF THE STATUS CONTROL BLOCK:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;I0; XX11 CARTRIDGE DISK I/O REQUEST PACKET FORMAT:;R"; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK. @; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER.J; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTOR TASK HEADER (UCB).1; WD. 05 -- I/O FUNCTION CODE (IO.RLB OR IO.WLB).C0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.=; WD. 10 -- I/O STATUS BLOCK ADDRESS (DISPLACEMENT + 140000).T3; WD. 11 -- VIRTUAL ADDRESS OF AST SERVI00'  kTADATADATADATADATADATACE ROUTINE.DA; WD. 12 -- MEMORY EXTENSION BITS (BITS 4 AND 5) OF I/O TRANSFER.F+; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER. -; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED.A; WD. 15 -- NOT USED.N9; WD. 16 -- LOW BYTE MUST BE ZERO AND HIGH BYTE NOT USED. 0; WD. 17 -- LOGICAL BLOCK NUMBER OF I/O REQUEST.A; WD. 20 -- RELOCATION BIAS OF DIAGNOSTIC REG. ADRS ELSE NOT USEDA4; WD. 21 -- DIAGNOSTIC REG. BLK ADRS (DISPL.+140000);O (= MOV #RETRY&377,RTTBL(R3) ;CLEAR POSITIONING AND SET RETRIESR' CALL $VOLVD ;VALIDATE VOLUME VALID I BCS 8$ ;IF CS WE FAILED  TST R0 ;TRANSFER FUNCTION? D BMI 1$ ;IF MI YES $ TST I.PRM+2(R1) ;SIZE THE DISK?  BPL 8$ ;IF PL NO & ASH #13.,R2 ;POSITION UNIT NUMBER * MOV S.CSR(R4),R0 ;RETRIEVE CSR ADDRESS " MOV R2,6(R0) ;SELECT THE DRIVE MOV R0,R2 ;COPY CSR ADDRESS % JMP 130$ ;PASS REGISTERS AND EXIT D1$: ;REF LABEL  .IF DF M$$EXT O, CALL $STMAP ;SET UP UNIBUS MAPPING ADDRESS .ENDC9 CMPB #IO.HMS/^D<256>,I.FCN+1(R1) ;DIAGNOSTIC FUNCTION? B BNE 5$ ;IF NE NO. MOV #FUNTBL,R0 ;GET ADDRESS OF FUNCTION TABLE-2$: CMP (R0)+,I.FCN(R1) ;FUNCTION CODE MATCH?? BEQ 3$ ;IF EQ YES # TST (R0)+ ;BYPASS CONTROLLER CODEN' CMP #FUNTBE,R0 ;END OF FUNCTION TABLE?  BEQ 5$ ;IF EQ YES( BR 2$ ;TRY AGAIN)3$: CMP R0,#FUNTB0 ;POSITIONING FUNCTION?P BHI 4$ ;IF HI NO6 INCB RTTBL+1(R3) ;YES, INDICATE POSITIONING OPERATION44$: BIS (R0),U.BUF(R5) ;SET CONTROLLER FUNCTION BITS BR 10$ ;GO CHECK BLOCK NUMBER/15$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTION 51 BIS #505,U.BUF(R5) ;ASSUME READ LOGICAL FUNCTIONI6 CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION?' BHIS 9$ ;IF HIS FUNCTION IS ILLEGAL S8$: JMP 120$ ;EXIT .9$: BEQ 10$ ;IF EQ FUNCTION IS READ LOGICAL 5 SUB #2,U.BUF(R5) ;CONVERT TO WRITE LOGICAL FUNCTION I-10$: CALL $BLKCK ;CHECK LOGICAL BLOCK NUMBERB- CALL $CVLBN ;CONVERT LOGICAL BLOCK NUMBER $ TST R1 ;WHICH SURFACE?  BEQ 15$ ;IF EQ SURFACE 0 ;" BIS #20,R0 ;SET SURFACE 1 BIT 015$: MOVB U.UNIT(R5),R1 ;RETRIEVE UNIT NUMBER * ASH #13.,R1 ;POSITION UNIT SELECT BITS ' ASH #5,R2 ;POSITION CYLINDER NUMBER L2 BIS R1,R2 ;MERGE UNIT BITS WITH CYLINDER NUMBER ( BIS R0,R2 ;MERGE TRK/SEC WITH CYLINDER2 MOV R2,I.PRM+10(R3) ;SAVE STARTING DISK ADDRESS ;E; INITIATE I/O OPERATION;I30$: ;REF LABEL .IF DF M$$EXT % CALL $MPUBM ;MAP UNIBUS TO TRANSFERE .ENDC% MOV S.CSR(R4),R2 ;GET ADDRESS OF CSRS9 MOV S.PKT(R4),R1 ;RETRIEVE ADDRESS OF I/O REQUEST PACKET ; MOVB S.ITM(R4),S.CTM(R4) ;SET CURRENT DEVICE TIMEOUT COUNTO+ ADD #6,R2 ;POINT TO DISK ADDRESS REGISTERY, MOV I.PRM+10(R1),(R2) ;INSERT DISK ADDRESS. MOV U.BUF+2(R5),-(R2) ;INSERT BUFFER ADDRESS8 MOV U.CNT(R5),-(R2) ;INSERT NUMBER OF BYTES TO TRANSFER! ROR (R2) ;CONVERT TO WORD COUNTE$ NEG (R2) ;MAKE NEGATIVE WORD COUNT TST -(R2) ;POINT BACK TO CSR+ MOV #IE.DNR&377,R0 ;ASSUME DRIVE NOT READY TSTB -4(R2) ;IS DRIVE READY? BMI 31$ ;IF MI YES/ BITB #US.SPU,U.STS(R5) ;IS DRIVE SPINNING UP?M BNE 35$ ;IF NE YES/ BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC OPERATION?  BNE 51$ ;IF NE YES JMP 110$ ;FINISH UP1531$: BICB #US.SPU,U.STS(R5) ;RESET DRIVE SPINNING UP)) MOV U.BUF(R5),(R2) ;LOAD FUNCTION AND GOR RETURNT;+$; CONTROLLER STATUS CHANGE OPERATION;R ; INPUTS:O;E; R2 = KRB ADDRESSG; R3 = CTB ADDRESST;R ; OUTPUTS:; -; CONTROLLER CLEARED ON ON LINE AND OFF LINEE;- T(XXKRB: MOV #1,@(R2) ;;;CLEAR CONTROLLER I;+<; CANCEL I/O OPERATION IS A NOP FOR FILE STRUCTURED DEVICES.;-#XXCAN: RETURN ;;;NOP FOR THE XX11O N;+:; UNIT STATUS CHANGE OPERATION - CALLED ONCE FOR EACH UNIT;, ; INPUTS:;;E; R3 = CONTROLLER INDEX; R4 = SCB ADDRESS ; R5 = UCB ADDRESST ; C = 0 UNIT OFFLINE TO ONLINE ; C = 1 UNIT ONLINE TO OFFLINE ; $SCERR = 1D;S ; OUTPUTS:; 0; UNIT OFFLINE - RETURN ($SCERR = 1 IS SUCCESS); UNIT ONLINE - RETURNE;- T+XXUCB: BCS XXCAN ;;;IF CS OFFLINE - RETURNI +; >; CODE SPECIFI00/"tuvC TO BRINGING A UNIT ONLINE (FOR EXAMPLE, SEEING@; WHETHER THE UNIT IS A NONEXISTENT DRIVE) COULD BE PLACED HERE.;U H RETURNA N;+0; POWER FAILURE OPERATION - A TRUE POWER FAILURE; @; CAUSES NO IMMEDIATE ACTION ON THE UNIT. THE CURRENT TIMEOUT ?; COUNT IS EXTENDED SO THAT IF THE UNIT WAS BUSY IT WILL HAVE A; SUFFICIENT TIME TO SPIN BACK UP. THE NEXT I/O REQUEST TO ANY =B; UNIT WILL BE SUSPENDED FOR AT LEAST THE EXTENDED TIMEOUT UNLESS "; THE UNIT IS ALREADY READY. ;- I O7XXPWF: TSTB S.STS(R4) ;;;IS THE DRIVE CURRENTLY BUSY? H BEQ 36$ ;;;IF EQ NO V4 MOVB #3,S.STS(R4) ;;;WAIT A MAXIMUM OF 45 SECONDS 335$: MOVB #15.,S.CTM(R4) ;;;15 SECONDS AT A TIME 636$: BISB #US.SPU,U.STS(R5) ;;;SET UNIT SPINNING UP  RETURN S;++; **-$XXINT-XX11 DISK CONTROLLER INTERRUPTS ;-($XXINT:: ;DEFINE INTERRUPT ENTRY POINT8 INTSV$ XX,PR5,X$$X11 ;;;SAVE REGISTERS AND SET PRIORITY- TSTB RTTBL+1(R4) ;;;DRIVE RESET IN PROGRESS?  BEQ 50$ ;;;IF EQ NO-& MOV R4,-(SP) ;;;SAVE CONTROLLER INDEX' MOV U.SCB(R5),R4 ;;;GET ADDRESS OF SCB$) MOV @S.CSR(R4),R4 ;;;GET CONTENTS OF CSRA$ BMI 40$ ;;;IF MI DRIVE RESET ERROR' BIT #20000,R4 ;;;DRIVE RESET COMPLETE?  BNE 40$ ;;;IF NE YES TST (SP)+ ;;;CLEAN STACK RETURN ;;; -40$: MOV (SP)+,R4 ;;;RESTORE CONTROLLER INDEXR+50$: CALL $FORK ;;;CREATE A SYSTEM PROCESSU" MOV R4,R3 ;COPY CONTROLLER INDEX% MOV U.SCB(R5),R4 ;GET ADDRESS OF SCBT% MOV S.CSR(R4),R2 ;GET ADDRESS OF CSRE/ MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL TRANSFERV, MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS 8 BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTION EXECUTED? 51$: BNE 130$ ;IF NE YES T TST (R2) ;ANY ERRORS? V BPL 65$ ;IF PL NO 4* MOV -2(R2),R1 ;SAVE ERROR STATUS REGISTER053$: MOV S.PKT(R4),R0 ;GET I/O PACKET ADDRESS & BITB #IQ.X,I.FCN(R0) ;INHIBIT RETRIES BNE 80$ ;IF NE YES" DECB RTTBL(R3) ;ANY MORE RETRIES? BLE 80$ ;IF LE NOT" MOV #1,(R2) ;CLEAR CONTROLLER 9 CLRB RTTBL+1(R3) ;CLEAR POSSIBLE DRIVE RESET IN PROGRESSL*55$: BIT #110000,R1 ;DRIVE RESET REQUIRED? BEQ 70$ ;IF EQ NO M560$: MOVB #1,RTTBL+1(R3) ;SET DRIVE RESET IN PROGRESS1. MOVB S.ITM(R4),S.CTM(R4) ;RESET TIMEOUT COUNT, MOV S.PKT(R4),R1 ;GET ADDRESS OF I/O PACKET0 MOV I.PRM+10(R1),6(R2) ;SET PROPER DRIVE NUMBER MOV #515,(R2) ;RESET DRIVEB RETURN ;C165$: ASRB RTTBL+1(R3) ;DRIVE RESET IN PROGRESS?  BCC 75$ ;IF CC NO E!70$: JMP 30$ ;RETRY FUNCTION R;75$: BITB #IO.WLC&377,I.FCN(R1) ;WRITE WITH WRITE CHECK? V BNE 76$ ;IF NE YES - BITB #US.WCK,U.STS(R5) ;WRITE CHECK ENABLED?$ BEQ 110$ ;IF EQ NO276$: MOV U.BUF(R5),R1 ;GET CURRENT FUNCTION CODE - BIT #1*2,R1 ;WRITE OR WRITE CHECK FUNCTION? BEQ 110$ ;IF EQ NO- BIS #2*2,U.BUF(R5) ;SET WRITE CHECK FUNCTION * BIT #2*2,R1 ;WAS FUNCTION A WRITE CHECK? BNE 110$ ;IF NE YES 56 MOV #RETRY&377,RTTBL(R3) ;REINITIALIZE RETRY COUNT ' BR 70$ ;START WRITE CHECK OPERATION F R080$: MOV #IE.WLK&377,R0 ;ASSUME WRITE LOCK ERROR! BIT #20000,R1 ;WRITE LOCK ERROR?S BNE 110$ ;IF NE YES 5/ MOV #IE.WCK&377,R0 ;ASSUME WRITE CHECK ERROR 6 ASR R1 ;GOOD ASSUMPTION? T% BCS 110$ ;IF CS WRITE CHECK ERROR O, MOV #IE.VER&377,R0 ;SET UNRECOVERABLE ERROR0110$: MOV 2(R2),R1 ;GET WORDS LEFT TO TRANSFER , ASL R1 ;CONVERT TO BYTES LEFT TO TRANSFER 7 ADD U.CNT(R5),R1 ;CALCULATE BYTES ACTUALLY TRANSFERED N" MOV #1,(R2) ;CLEAR CONTROLLER (120$: CALL $IODON ;FINISH I/O OPERATION! JMP XXINI ;PROCESS NEXT REQUESTT;KE; DEVICE TIMEOUT RESULTS IN A CONTROL AND DRIVE RESET FOLLOWED BY THEC; I/O OPERATION BEING REPEATED UNLESS THE OPERATION WAS DIAGNOSTIC.MA; TIMEOUTS ARE USUALLY CAUSED BY POWERFAILURE BUT MAY ALSO BE THE7; RESULT OF A HARDWARE FAILURE.$;O9XXOUT: BITB #US.SPU,U.STS(R5) ;;;IS DRIVE SPINNING UP? O BEQ 125$ ;;;IF EQ NO / DECB S.STS(R4) ;;;HAVE WE WAITED ENOUGH YET? R BEQ 125$ ;;;IF EQ YES N MTPS #0 ;;;ALLOW INTERRUPTS  JMP 30$ ; /125$: INCB S.STS(R4) ;;;LEAVE CONTROLLER BUSY I5 BICB #US.SPU,U.STS(R5) ;;;0078 kTADATADATADATADATADATARESET DRIVE SPINNING UP D( BIC #100,(R2) ;;;CLEAR INTERRUPT ENABLE MTPS #0 ;;;ALLOW INTERRUPTST. MOV S.PKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS- BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTIONE BEQ 140$ ;IF EQ TIMEOUT DURING ;NORMAL FUNCTION5130$: CALL $CRPAS ;PASS CONTROLLER REGISTERS TO TASK ) BR 110$ ;DIAGNOSTIC PROCESSING COMPLETE,140$: MOV #110000,R1 ;SET FOR DRIVE RESET  BR 53$ ; .DSABL LSB  .END INCB S.STS(R4) ;;;LEAVE CONTROLLER BUSY I5 BICB #US.SPU,U.STS(R5) ;;;% .TITLE XXTAB DATA BASE FOR DEVICE XX .IDENT /02/ ; ; AUTHOR: Z; ; ; CHANGES:; ;; MODULE FUNCTION:; ! .PAGE ; BREAK PAGE FOR PREFACE' .SBTTL SYMBOL, MACRO, DATA DEFINITIONS# .LIST TTM ; TERMINAL LISTING MODE% .NLIST BEX ; SUPPRESS BIN EXTENSION ;; LOCAL SYMBOL DEFINITIONS:;' XXUCBL = XXND-XXST ; DEFINE UCB LENGTH ;; LOCAL MACROS:; ;; LOCAL DATA BLOCKS:; ; .PAGE" .SBTTL XXDCB DEVICE CONTROL BLOCK &$XXDAT:: ; GLOBAL LABEL FOR START OF% ; DATA BASE AND DCB; USED BY LOADU'$USRTB:: ; GLOBAL LABEL FOR FIRST DCB ; REQUIRED FOR RESIDENT ; DATA BASES OF USER DRIVERS $XXDCB:: ; START OF DCB FOR XX ; REQUIRED BY LOAD .WORD 0 ; LINK TO NEXT DCB! .WORD XXUCB ; LINK TO FIRST UCB .ASCII /XX/ ; DEVICE NAMET$ .BYTE 0,1 ; LOWEST, HIGHEST UNIT # .WORD XXUCBL ; LENGTH OF UCB .WORD 0 ; ADDR OF DDTO$ .WORD 177477 ; LEGAL F M BITS 0-15" .WORD 70 ; CONTROL F M BITS 0-15 .WORD 0 ; NO-OP F M BITS 0-15 " .WORD 177200 ; ACP F M BITS 0-15" .WORD 377 ; LEGAL F M BITS 16-31" .WORD 0 ; CONTROL F M BITS 16-31 .WORD 0 ; NO-OP F M BITS 16-31 .WORD 377 ; ACP F M BITS 16-31 .WORD 0 ; ADDR OF PCBR! ; END OF DEVICE CONTROL BLOCKT B .PAGE+ .SBTTL XXUCB UNIT CONTROL BLOCK DEFINITION  IXXST: ; START OF UCB ENTRIESI ; FOR LENGTH CALCULATION) .IF DF M$$MUP ; FOR MULTIUSER PROTECTIONO! .WORD 0 ; OWNING TT UCB ADDRESS. .ENDC#XXUCB: ; START (OFFSET 0) OF UCBO .WORD $XXDCB ; BACK PTR TO DCB .WORD .-2 ; REDIRECT UCB PTR ; POINTS TO SELF INITIALLY .BYTE UC.ALG!UC.NPR!UC.PWF!1. ; DEFINE CONTROL FLAGS# .BYTE US.MNT ; DEFINE UNIT STATUS .BYTE 0 ; PHYSICAL UNIT # ( .BYTE US.OFL ; DEFINE MORE UNIT STATUS) .WORD DV.DIR!DV.MNT!DV.F11!DV.UMD!DV.MSDO ; DEFINE CHARACTERISTICS .WORD 0 ;  .WORD 4800. ; # OF BLOCKS .WORD 512. ; U.CW4 .WORD XXSCB ; PTR TO SCB .WORD 0 ; TCB ADDR OF TASK .WORD 0 ; DEVICE .WORD 0 ; DEPENDENDENT .WORD 0 ; DATA .WORD 0 ; .WORD 0 ; .WORD 0 ;P .WORD 0 ;N ; DISK PARAMETER WORDS$ .BYTE 12. ; # OF SECTORS PER TRACK% .BYTE 2. ; # OF TRACKS PER CYLINDER ( .WORD 200. ; # OF CYLINDERS PER VOLUMEXXND = . ; END OF UCB  E ; UCB FOR UNIT # 2) .IF DF M$$MUP ; FOR MULTIUSER PROTECTIONI! .WORD 0 ; OWNING TT UCB ADDRESS. .ENDCXX1: .WORD $XXDCB ; BACK PTR TO DCB .WORD .-2 ; REDIRECT UCB PTR ; POINTS TO SELF INITIALLY .BYTE UC.ALG!UC.NPR!UC.PWF!1N ; DEFINE CONTROL FLAGS# .BYTE US.MNT ; DEFINE UNIT STATUS0 .BYTE 1 ; PHYSICAL UNIT #K( .BYTE US.OFL ; DEFINE MORE UNIT STATUS) .WORD DV.DIR!DV.MNT!DV.F11!DV.UMD!DV.MSDC ; DEFINE CHARACTERISTICS .WORD 0 ;  .WORD 4800. ; # OF BLOCKSC .WORD 512. ; U.CW4 .WORD XXSCB ; POINTER TO SCB .WORD 0 ; TCB ADDR OF TASK .WORD 0 ; DEVICE .WORD 0 ; DEPENDENT .WORD 0 ; DATA .WORD 0 ; .WORD 0 ; .WORD 0 ;P .WORD 0 ;N ; DISK PARAMETER WORDS$ .BYTE 12. ; # OF SECTORS PER TRACK% .BYTE 2. ; # OF TRACKS PER CYLINDER ( .WORD 200. ; # OF CYLINDERS PER VOLUME ; END OF UCB FOR UNIT 1E I .PAGE& .SBTTL XXKRB CONTROLLER REQUEST BLOCK C# .BYTE PR5 ; XX RUNS AT PRIORITY 5D .BYTE 220/4 ; VECTOR / 4 .BYTE 0*2 ; CONTROLLER INDEX .BYTE 0 ; CONTROLLER I/O COUNT# .WORD 0!KS.OFL ; CONTROLLER STATUS  EXXKRB: ; START OF KRB .WORD 177404 ; CSR ADDRESS3 .WORD XXA-XXKRB ; OFFSET TO START OF UMR WORK AREA  .BYTE 1 ; HIGHEST PHY UNIT # .BYTE 0 ; UNUS00?CtuvED .WORD 0 ; PTR TO OWNER UCB;S'; CONTIGUOUS S C B HERE FOR DEVICE XXD; XXSCB: ; START OF SCB HERER( .WORD 0,.-2 ; HEAD OF I/O QUEUE, FIRST ; WORD 0, SECOND POINTS TO ; FIRST  P .IF DF M$$PRO ; MULTIPROCESSORR .WORD 0 ; FORK UNIBUS RUN MASK .ENDC 0 .WORD 0 ; FORK LINK WORD .WORD 0 ; FORK PCO .WORD 0 ; FORK R5R .WORD 0 ; FORK R4 ; END OF FORK BLOCKE  .WORD 0 ; KISAR5 .WORD 0 ; I/O PACKET ADDRESS" .BYTE 0 ; CURRENT TIME-OUT COUNT" .BYTE 4 ; INITIAL TIME-OUT COUNT .BYTE 0 ; CONTROLLER STATUS  .BYTE 0 ; STATUS EXTENSION 3# .WORD S2.CON ; STATUS EXTENSION 20 ; CONTIGUOUS ALLOCATIONR ; OF SCB/KRB IS USED .WORD XXKRB ; KRB ADDRESS.# .BYTE 8. ; # OF REGISTERS TO PASSD/ .BYTE 374 ; OFFSET FROM CSR TO FIRST REGISTER  .WORD 0 ; NOT USED- .IF DF M$$EXT ; FOR EXTENDED MEMORY SUPPORT $ .BLKW 6 ; MAPPING ASSIGNMENT BLOCK .WORD 0 ; KE.RHB .ENDC)XXA: ; END OF MAPPING ASSIGNMENT BLOCKR  E .PAGE) .SBTTL XXCTB CONTROLLER TABLE DEFINITIONY 0 .WORD 0 ; LINK TO FIRST ICB0" CTB ; MACRO FOR SYSTEM CTB LINK ; REQUIRED FOR RESIDENT ; DATA BASES OF USER DRIVERS% .WORD 0 ; ZERO FOR LAST CTB IN LISTD( .ASCII /XX/ ; DEFINE UNIQUE CONTROLLER& .WORD $XXDCB ; ADDRESS OF DCB FOR XX .BYTE 1 ; 1 CONTROLLER (1 KRB) .BYTE 0 ; STATUS IS ZERO&$XXCTB:: ; GLOBAL LABEL FOR LOAD AND ; INTSV$ MACRO .WORD XXKRB ; LINK TO KRB : ; END OF CTB DEFINITIONN($XXEND:: ; GLOBAL LABEL TO MARK END OF ; DATA BASE FOR LOAD .END.WORD 0 ; LINK TO FIRST ICB0" CTB ; MACRO FOR SYSTEM CTB LINK ; REQUIRED FOR RESIDENT ; DATA BASES OF USER DRIVERS% .WORD 0 ; ZERO FOR LAST CTB IN LISTD( .ASCII /XX/ ; DEFINE UNIQUE CONTROLLER& .WORD $XXDCB ; ADDRESS OF DCB FOR XX .BYTE 1 ; 1 CONTROLLER (1 KRB) .BYTE 0 ; STATUS IS ZERO&$XXCTB:: ; GLOBAL LABEL FOR LOAD AND ; INTSV$ MACRO .WORD XXKRB ; LINK TO KRB : ; END OF CTB DEFINITIONN($XXEND:: ; GLOBAL LABEL TO MARK END ,  @N zSYSYSYSYTICLz  zzVxx99  *00GK kTADATADATADATADATADATA,  @N zSYSYSYSYTICLz  zzVxx99  * ,  @N zSYSYSYSYTICLz  zzVxx99  *00OSTUVtuv,  @N zSYSYSYSYTICLz  zzVxx99  * A flea and a fly in a flue,) Were trapped and didn't know what to do. Said the fly, "Let us flee!" Said the flea, "Let us fly!") So they flew through a flaw in the flue.Time flies like an arrow.Space flies like a bow.Fruit flies like a banana. What romm ? - Shickard conference room.st typed a memo and e inneting.Pr@ ThvxL (D~Ĕؔ:Vn !!@ bdhvx^`STOP PAUSE __Only I did what you told me.I only did what you told me.I did only what you told me.I did what only you told me.I did what you only told me.I did what you told only me.I did what you told me only.!I did what you told me. Only ...51(The physics police always get their man.'Mysteries are not necessarily miracles.R!Little acorns from big oaks drop.)Nothing is so useless as a general maxim.00WY kTADATADATADATADATADATA2 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2 | |2 | Hello. |2 | |2 | You are now logged in on the |2 | RSX-11M-PLUS Operating System. |2 | |2 | This is the USER account. Nothing |2 | that you do in this account can do |2 | any harm either to the system, or to |2 | this account. |2 | |2 | Use this account with the terminal |2 | warm-up session described in the book |2 | Introduction to RSX-11M-PLUS. |2 | |2 | Take it easy. |2 | |2 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>any harm either to the system, or ) ^^* ^^^+ ^^^^^^, ^^^^^^^- ^^^^^^^^^ . ^^^^^^^^^^^/ ^^^^^^^^^^^^^^0 ^^^^^^^^^^^^^^^1 ^^^^^^^^^^^^^^^^^^2 ^^^^^^^^^^^^^^^^^^^3 ^^^^^^^^^^^^^^^^^^^^^ 4 ^^^^^^^^^^^^^^^^^^^^^^^5 ^^^^^^^^^^^^^^^^^^^^^^^^^^6 ^^^^^^^^^^^^^^^^^^^^^^^^^^^7 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 8 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^9 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ < ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^= ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^A ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^B ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ D ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^E ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^F ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^G ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^H ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^I ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^J ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^K ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ L ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^M ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^N ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^O ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^O ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^00_STUVtuv^^^^^^^^^^^^^^^^^^^^^^M ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^K ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^H ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^F ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^D ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^B ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^8 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^6 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^4 ^^^^^^^^^^^^^^^^^^^^^^^^2 ^^^^^^^^^^^^^^^^^^^^0 ^^^^^^^^^^^^^^^^. ^^^^^^^^^^^^, ^^^^^^^^* ^^^^) ^^^) ^^^) ^^^) ^^ ) ^^) ^^^ ^^^^^^^^^^^^^^^^7 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^J ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^P^^^^^^^^ ^ ^^^ ^^^ ^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^P^^^^^^^ ^^ ^^^ ^^^^ ^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^P^^^^^^^ ^^ ^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^P^^^^^^^ ^^^ ^ ^ ^^^^^ ^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^P^^^^^^^ ^^^^ ^^^^^ ^^^^^^ ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^P^^^^^^^ ^^^^^ ^^^ ^^ ^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^ ^^^ ^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^P^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^00gY kTADATADATADATADATADATA^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^ digital ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^O^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^N^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^M^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^L^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^K^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^J^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^I^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^H^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^G^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^F^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^E^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^D^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^A^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^A^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^?^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^>^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^<^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^:^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^9^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^8^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^7^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^600orTUVtuv^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^5^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^4^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^3^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^2^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^0^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^(^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^$^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^F^ yow!^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^(^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^2^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^<^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^F^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^F^ yow!^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^(^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^2^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^<^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^F^^^^^^^^^^^^^^^^0 FILES IN THE USER DIRECTORYFSome of the files in the RSX-11M-PLUS USER directory are used with theIntroduction to RSX-11M-PLUS.FAll files in the USER directory are protected so they cannot be:accidentally deleted. Here is a description of the files.FBATCH.BAT;1 A sample batch file used in the Introduction to illustrate batch command files.ECLEAN.CMD;1 An indirect command file for eliminating files created in > the terminal warm-up session. Do not invoke this file while5 a new user is in the course of the warm-up session. JCLKGEN.CMD;1 This indirect command file allows you to customize CLOCK.MAC.DDELETE.CMD;1 This indirect command file prints the latest version of= selected files on your terminal and deletes all versions ifi you wish.CHLOGIN.CMD;1 This indirect command file is executed each time you log in.2 It sets the terminal to DCL and types HELLO.TXT.IMYDISK.CMD;1 This indirect command file can be used to get a new disk ? ready to use. It shows how to do it and also illustrates how- Indirect works.GJSHAVE.CMD;1 An indirect command file to be passed to the BROADCAST command0 as described in the terminal warm-up session.ESHOW.CMD;1 This indirect command file is used in the terminal warm-ups8 session. It issues three SHOW commands in succession.>BMDRV.MAC;1 Source file for advanced I/O driver. Use with the. RSX-11M-PLUS Guide to Writing an I/O Driver.<BMTAB.MAC;1 Data base for advanced I/O driver. Use with the. RSX-11M-PLUS Guide to Writing an I/O Driver.HCLOCK.MAC;1 This source file was prepared as a programming exercise by a? member of the RSX-11M/M-PLUS documentation group. It runs onm? a video terminal printing the time in large characters on thet screen. BHIYA.MAC;1 A source file written in MACRO-11 Assembly Language for( use with the terminal warm-up session.CSTARS.MAC;1 A source file written in MACRO-11 Assembly Language for( use with the terminal warm-up session.GTMCLI.MAC;1 Simple sample CLI as described in the RSX-11M/M-PLUS System.& Management Guide. MACRO-11 version.GTMCLI.FTN;1 Simple sample CLI as described in the RSX-11M/M-PLUS Systemo; Management Guide. FORTRAN version. Compatible with allg DIGITAL FORTRAN compilers.HXXDRV.MAC;1 Source file for sample XX I/O driver. Use with RSX-11M-PLUS! Guide to Writing an I/O Driver.oFXXTAB.MAC;1 Data base for sample XX I/O driver. Use with RSX-11M-PLUS! Guide to Writing an I/O Driver.eJERROR.00w| kTADATADATADATADATADATATSK;1 Demonstration of exit-with-status. This task does nothing but> exit with a status of ERROR. Use with the three other tasks, to test tasks that respond to exit status.KSEVERE.TSK;1 Demonstration of exit-with-status. This task does nothing butI% exit with a status of SEVERE ERROR.oLSUCCESS.TSK;1 Demonstration of exit-with-status. This task does nothing but exit with a status of SUCCESS.LWARNING.TSK;1 Demonstration of exit-with-status. This task does nothing but exit with a status of WARNING.DFLU.TXT;1 This file is used in the Introduction to illustrate the" DIRECTORY command and wildcards.CFLY.TXT;* These three files are used in the Introduction to11 illustrate the DIRECTORY command and wildcards. DHELLO.TXT;1 This file contains the text you see each time you log in to the USER account.DLONG.TXT This file is used in the Introduction to illustrate CTRL/O and CTRL/C. NWHATSHERE.TXT;1 The file you are now reading. It identifies all files in this directory.BERASE.MAC;1 Demonstrates and tests the RMS-11 $ERASE function, oneBERASE.TSK;1 of the new directory and wildcard functions of RMS-11.2 See Chapter 7 of the RSX-11M/M-PLUS RMS-11 Macro Programmer's Guide.a>GSA.MAC;1 Demonstrates how to extend an RMS-11 task in case of7 pool exhaustion. See Chapter 7 of the RSX-11M/M-PLUST" RMS-11 Macro Programmer's Guide.BPARSE.MAC;1 Demonstrates and tests the RMS-11 $PARSE function, oneBPARSE.TSK;1 of the new directory and wildcard functions of RMS-11.2 See Chapter 7 of the RSX-11M/M-PLUS RMS-11 Macro Programmer's Guide.SDRENAME.MAC;1 Demonstrates and tests the RMS-11 $RENAME function, oneCRENAME.TSK;1 of the new directory and wildcard functions of RMS-11.2 See Chapter 7 of the RSX-11M/M-PLUS RMS-11 Macro Programmer's Guide.uDSEARCH.MAC;1 Demonstrates and tests the RMS-11 $SEARCH function, oneCSEARCH.TSK;1 of the new directory and wildcard functions of RMS-11.t2 See Chapter 7 of the RSX-11M/M-PLUS RMS-11 Macro Programmer's Guide.. See Chapter 7 of the RSX-11M/M-PLUS RMS-11 Macro Programmer's Guide.SDRENAME.MAC;1 Demonstrates and tests the RMS-11 $RENAME function, oneCRENAME.TSK;1 of the new directory and wildcard functions of RMS-11.2 See Chapter 7 of the RSX-11M/M-PLUS RMS-11 Macro Programmer's Guide.uDSEARCH.MAC;1 Demonstrates and tests the RMS-11 $SEARCH function, oneCSEARCH.TSK;1 of the new directory and wildcard functions of RMS-11.t2 See Chapter 7 of the RSX-11M/M-PLUS RMS-11 Macro Progra" .Title GSA - Core space allocator .Ident /V02.00/;; COPYRIGHT (c) 1983 BY); DIGITAL EQUIPMENT CORPORATION, MAYNARD(; MASSACHUSETTS. ALL RIGHTS RESERVED.; 6; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY6; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE6; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THE6; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER6; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE6; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO6; AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.; 6; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO6; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED6; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.; 6; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR6; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS; NOT SUPPLIED BY DIGITAL.; T;O3; Copyright (C) 1982, Digital Equipment CorporationE ; Maynard, Massachusetts 01754;N4; **-GSA - Dynamic memory allocation for RMS-11 pool;S; John Gemignani, Jr.!; RSX/RMS-11 Development ; March 11, 1982 ;N;W); Called by RMS-11 to manage pool space.D,; In the event of pool exhaustion, the task/; image will be extended to obtain more space.L; /; May be called by user written code providingA(; the interface standard is adhered to.;I ; Interface:; Request space:9<; R0 -> RMS/user Pool list head (maintained by RL/CQB)/; R1 := Amount of space requeste00rTUVtuvd (bytes)f<; R2 := 0 (differentiates between request and release);X; Release space:7; R0 -> RMS Pool list head (maintained by RL/CQB)o4; R1 := Amount of space to be released (bytes)(; R2 -> Base address (for release);t; ; Returns:5; C-Bit "set" if an error has occurred (failure) 5; C-Bit "clear" if no error has occurred (success)e; .Enabl LC .Enabl GBL  .Mcall Extk$S .Page! .Sbttl Control block definitionsR .Psect GSA$$D,RW,De;e; GSA internal data:; 9; GSABAS - Base address for the next memory allocation.l7; Initially set to zero, it will be assignedd4; the first address outside of the task's$; current address limits.6; GSAMIN - Decimal value reflecting the minimum size6; (in bytes) to extend the task in order to'; provide space to the pool.7; GSAREQ - Requested pool block number. If a request6; for the 'GSAMIN' fails, then the original8; allocation size will be attempted. If that6; fails, then there is no more memory left.;yGSABAS:: ; GSA base addressd& .Word 000000 ; (for next allocation)GSAMIN:: ; Minimum allocatione% .Word 512./64. ; (in 32-word blocks)l!GSAREQ:: ; Size of this request+ .Word 000000 ; (if 'GSAMIN' extends fail)  .Page .Sbttl GSA Initialization codeo .Psect GSA$$I,RO,Ie;p; GSA Initialization;e7; This code is entered when GSA is entered with GSABASg8; set to zero. In order to be able to build valid pool9; header tables, GSABAS must be properly initialized and.; maintained.;;:; Initialization consists of finding the size of the task:; in 32-word units, and converting that value to a usable:; 16-bit address (which corresponds to the address of the;; next task extension (Extk$S) call. Once GSABAS has beenn*; initialized, GSAINI will not be reused.;pGSAINI:t$ Mov R0,-(SP) ; R0-2 will be used to' Mov R1,-(SP) ; communicate with $INIDMt( Mov R2,-(SP) ; NOTE: $INIDM uses EXTSK.;o6; The following code will use $INIDM to initialize the;; dynamic memory. Contrary to documentation, R1 will returnd9; the first address following the task image, and R2 willn9; return the size of the "free" memory from that address.n;t8; NOTE: $INIDM and EXTSK reside in LB:[1,1]VMLIB for RSX:; systems, and in LB:[1,1]SYSLIB for RSTS/E systems.;u; $INIDM interface: ; Calls:; R0 -> Pool list headv;, ; Returns:"; R0 -> First address in task%; R1 -> First address AFTER tasko7; R2 := Size of free core after task (based at R1) ;o) Call $INIDM ; Initialize dynamic memoryd) Mov R1,GSABAS ; Setup the "free" addressa% Mov (SP)+,R2 ; Restore the registerst Mov (SP)+,R1 ;f Mov (SP)+,R0 ;n Return ; And return to GSAr .Page .Sbttl GSA Mainline code  .Psect GSA$$M,RO,I];B; GSA Mainline;.6; Entry point is "GSA", with registers 0-2 loaded as; described above.;uGSA:: ;-:; First, determine if dynamic memory has been initialized.;; GSABAS (initially set to zero) will be non-zero if $INIDM :; has been called and the memory list initialized. On RSX7; based systems it is possible to install tasks with anr<; extension (/INCREMENT). $INIDM will detect this and setup*; the first memory entry in the pool list.; :; A point to note: If the RSX task has been installed with9; the non-checkpointable (/-CP) flag, then EXTKs will nots9; return success. If it is necessary to install the taski<; non-checkpointable, then the task should be installed with; and increment value.;z* Tst GSABAS ; Dynamic memory initialized? Bne 10$ ; Yes if NE, proceed* Call GSAINI ; Otherwise, initialize pool10$:; .; Determine if this call involves real memory.3; R1 should contain the size (in bytes) of the core.2; block requested or to be released. If zero then8; return to the caller without an error (TST leaves CC).;s Tst R1 ; Real memory?s& Bne 20$ ; Yes if NE, then proc00| kTADATADATADATADATADATAess it) Return ; Otherwise return with successu20$:;e3; If this call is a request for space, pass controlD6; to the allocation routines. Otherwise, pass control4; to the system deallocation module $RLCB. There is2; no need to return, so control is passed via JMP.;' Tst R2 ; Address specified? (release)t) Beq 30$ ; No if EQ, then it's a requeste- Jmp $RLCB ; Otherwise it's a release; do itt30$:;T; Save our current context: ; R0 = Pool list head$ ; R1 = Size of memory required; R2 = 0 (signifies request);c Mov R0,-(SP)e Mov R1,-(SP)l Mov R2,-(SP)o;c-; Attempt an allocation from the current pool ,; If this is successful, pass control to the; common exit.;C! Call $RQCB ; Try the allocation Bcc 70$ ; CC signifies success;R8; Now that the initial allocation failed, we must extend7; the task and give the new area (extended into) to thea7; caller. To do this, the following procedure is used: ;=; 1. The task is extended*; 2. The area extended is returned to the2; pool specified as if a release was attempted,; 3. We retry the allocation operation, but0; this time it should succeed, since we have); increased the size of the pool areal;R8; NOTE: $RQCB has a bad habit of nuking registers, so it3; becomes necessary to save and restore them arounde; unsuccessful calls.k;d' Mov 2(SP),R1 ; Obtain the request size;l6; Determine what the requirement is in 32-word blocks.2; Retain this value to allow GSA to decide whether/; to issue further task extension directives inr$; order to satisfy the requirements.;a! Add #63.,R1 ; Round the requestt Asr R1 ; to a 32-word boundary! Asr R1 ; Then convert the value  Asr R1 ; to the number of  Asr R1 ; 32-word blocks. Asr R1s Asr R1e# Mov R1,GSAREQ ; Save the real sizeh;o3; We will allocate core to the pool in "reasonable"b5; increments to cut down on system overhead, and pooli6; fragmentation. This is accomplished by using either7; the requested size, or "GSAMIN", whichever is LARGER.o3; If the request is unsuccessful, and the amount is.9; smaller than GSAMIN, then request that particular size. ;w& Cmp R1,GSAMIN ; Smaller than minimum?" Bhi 40$ ; No if HI, use it as is% Mov GSAMIN,R1 ; Otherwise use GSAMIN40$:;M1; Now we attempt to extend the task by that size. 0; If the request fails, then use the size of the0; original request. If that also fails, then we; simply ran out of memory.o;i Extk$S R1 ; Extend the tasks Bcc 60$ ; CC if successful! Cmp R1,GSAREQ ; Is this request? Blos 50$ ; Yes if LOS, the end% Mov GSAREQ,R1 ; Otherwise try to uset Br 40$ ; the actual requestR50$: Sec ; Mark failureu Br 70$ ; And exit ; 5; The task has been extended, now this memory must be-; released to the pool for future allocation.a3; To do this, we setup the registers as if RMS weref3; going to release the core, and call ourself to doe3; the work. When the area has been released to thex4; pool, we will return inline and proceed to reenter8; our code again from start to reattempt the allocation.;60$: Mov 4(SP),R0 ; Setup the PLH Asl R1 ; Convert the realR Asl R1 ; size to the actual Asl R1 ; 16-bit size that Asl R1 ; was allocated.d Asl R1 ; The virtual address Asl R1 ; should be after the# Mov GSABAS,R2 ; task (which is nowe" Add R1,GSABAS ; part of the task)$ Call GSA ; Call ourself to release;e5; At this point, the new memory has been added to the3; pool, and is available for use. We now reattempt"; to allocate the memory required.;t% Mov (SP)+,R2 ; Restore our registersR$ Mov (SP)+,R1 ; to the initial state' Mov (SP)+,R0 ; upon entry, and reenter# Br GSA ; as if it's a new requestR;w;; Common exit. Leave the registers in their current state,o#; and return control to the caller.s;w70$:# Inc (SP)+ ; These won't alter thes+ Bit (SP)+,(SP)+ ; C-bit, so status remainse! Return ; unchanged upon returna .Endd00rTUVtuv .TITLE SEARCH - $SEARCH TEST  .IDENT /X01.00/;U; COPYRIGHT (c) 1983 BYN); DIGITAL EQUIPMENT CORPORATION, MAYNARD (; MASSACHUSETTS. ALL RIGHTS RESERVED.; .6; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY6; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE6; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THE6; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER6; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE6; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO6; AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.; 6; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO6; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED6; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.; 6; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR6; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS; NOT SUPPLIED BY DIGITAL.; T .ENABL LC .MCALL FAB$B,NAM$B,GSA$- .MCALL $PARSE,$SEARCH,$STORE,$FETCH,$COMPAREL .MCALL ALUN$S,QIOW$,DIR$,EXIT$S; ,; This program tests/demonstrates the use of; the RMS-11 $SEARCH function.;I;N; RMS-11 Data Structures; GSA$ GSAWFAB:: FAB$B ; Argument FAB# F$DNA SYDSKA ; If no device, SY: F$DNS SYDSKL ; should be used F$NAM NAM ; Link to NAM F$LCH 2. ; Channel #2 FAB$ENAM:: NAM$B ; NAM definition! N$ESA EXPSTR ; EXP STR addressB N$ESS 128. ; EXP STR length! N$RSA RESSTR ; RES STR addressP N$RSS 128. ; RES STR length NAM$E .PSECT $CODE$,RO,IXSEARCH::( ALUN$S #1,#"TI,#0 ; Assign the terminal" MOV #FAB,R0 ; Map the target FAB# MOV #EDBLK,R2 ; Map the exit block " MOV #NAM,R3 ; Map the target NAM! MOV #READ,R4 ; Map the input DPB # MOV #WRITE,R5 ; Map the output DPBd) CLR Q.IOPL+4(R5) ; Turn off carriage ctlC MOV #QUES,Q.IOPL(R5)B MOV #QUESL,Q.IOPL+2(R5) DIR$ R5 ; Prompt for the DNA TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error MOV #BUFF,Q.IOPL(R4) MOV #64.,Q.IOPL+2(R4) DIR$ R4 ; Get the response TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error, $STORE IOLEN,FNS,R0 ; Set the string length- $STORE #BUFF,FNA,R0 ; Set the string address / MOV #40,Q.IOPL+4(R5); Restore carriage controlu$ CLR FILCNT ; Init count of matches $PARSE R0 ; Parse the stringso $COMPARE #0,STS,R0 ; An error?P# BLT ERROR ; Yes if MI; display itRGETFIL:r* MOV #EDBLK,R2 ; Reset the edit block addr" $SEARCH R0 ; Get a matching file $COMPARE #0,STS,R0 ; Error? BLT ERROR ; Yes if LT  CLR (R2) ; Init the length+ $FETCH (R2),RSL,R3 ; Get the string lengthr TST (R2)+ ; Advance0- $FETCH (R2)+,RSA,R3 ; Get the string address;* MOV #RSSSTR,R1 ; Select the format string' TST FILCNT ; First file needs a blankN BNE NOTFST ; line before itA$ MOV #RSSST1,R1 ; Insert CR/LF firstNOTFST:R CALL PRINT ; Display the file $ MOV #FAB,R0 ; Rest the FAB address INC FILCNT ; Count this file# BR GETFIL ; And let's try anothereEXIT:R EXIT$S ; Task exitBERROR:+ $COMPARE #ER$NMF,STS,R0 ; No more matches?$$ BNE ERROR0 ; No - some other error, MOV FILCNT,(R2)+ ; Set the cound of matches BEQ ERROR2 ; No files... CLR (R2) ; Give the ESAt$ $FETCH (R2),ESL,R3 ; Set the length TST (R2)+ ; Advance word% $FETCH (R2),ESA,R3 ; Set the address1' MOV #TTLSTR,R1 ; Set the format string ! BR ERROR1 ; Go show it and exitAERROR2:e% CLR -(R2) ; Setup for string lengtht$ $FETCH (R2),ESL,R3 ; Set the length" TST (R2)+ ; Advance to next word% $FETCH (R2),ESA,R3 ; Set the addressT' MOV #NOFILE,R1 ; Set the format stringN BR ERROR1 ; Print the errorNERROR0: + $FETCH (R2)+,STS,R0 ; Set the STS returnedi! $FETCH (R2),STV,R0 ; And the STV- MOV #ERRSTR,R1 ; Set the error format string+ERROR1:c, CALL PRINT ; Go edit and print the message# JMP SEARCH ; Let's try this againrPRINT: MOV #EDBLK,R2 ; Setup editA MOV #BUFFER,R0 ; Output buffero CALL $EDMSG ; Exit the stringL MOV #BUFFER,Q.IOPL(R5)T MOV R1,Q.IOPL+2(R5) DIR$ R5 ; Send to the terminal RETURN ; Return to caller .PSECT $D00 kTADATADATADATADATADATAATA$,RW,DNSYDSKA: .Ascii "SY:" SYDSKL = . - SYDSKA2QUES: .Ascii <15><12>"Enter a wildcard filespec: " QUESL = . - QUESh0ERRSTR: .Asciz "$SEARCH error -- STS=%P, STV=%P"RSSST1: .Ascii "%N" RSSSTR: .Asciz " %VA"*NOFILE: .Asciz "%NNo files matching %VA%N"3TTLSTR: .Asciz "%NTotal of %D files matching %VA%N"V .EVENFILCNT: .WORD 0eEDBLK: .BLKW 6BUFFER:tBUFF: .Blkb 128.EXPSTR: .BLKB 128.RESSTR: .BLKB 128.IOSTAT: .WORD 0dIOLEN: .WORD 0READ: QIOW$ IO.RLB,1,1,,IOSTAT'WRITE: QIOW$ IO.WLB,1,1,,IOSTAT,,<,,40>i .END SEARCH .TITLE RENAME - $RENAME TEST .IDENT /X01.00/;; COPYRIGHT (c) 1983 BY); DIGITAL EQUIPMENT CORPORATION, MAYNARD(; MASSACHUSETTS. ALL RIGHTS RESERVED.; 6; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY6; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE6; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THE6; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER6; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE6; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO6; AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.; 6; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO6; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED6; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.; 6; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR6; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS; NOT SUPPLIED BY DIGITAL.; T .ENABL LC .MCALL FAB$B,NAM$B,GSA$: .MCALL $PARSE,$SEARCH,$RENAME,$STORE,$FETCH,$COMPARE,$SET .MCALL ALUN$S,QIOW$,DIR$,EXIT$S;W,; This program tests/demonstrates the use of; the RMS-11 $RENAME function.;S;T; RMS-11 Data Structures;E GSA$ GSACFAB1:: FAB$B ; Old file name F$DNA SYDSKA ; Default to SY: F$DNS SYDSKL F$NAM NAM1 ; Link to NAM1 F$LCH 2. ; Channel #2 FAB$ENAM1:: NAM$B ; NAM definitionE! N$ESA ESSTR1 ; EXP STR addressI N$ESS 128. ; EXP STR length! N$RSA RSSTR1 ; RES STR addressL N$RSS 128. ; RES STR length NAM$EFAB2:: FAB$B ; New file name F$NAM NAM2 ; Link to NAM2 F$LCH 2. ; Same channel FAB$ENAM2:: NAM$B ; NAM definition! N$ESA ESSTR2 ; EXP STR address N$ESS 128. ; EXP STR length NAM$E .PSECT $CODE$,RO,IeRENAME::( ALUN$S #1,#"TI,#0 ; Assign the terminal" MOV #FAB1,R0 ; Map the target FAB# MOV #EDBLK,R2 ; Map the exit blockE! MOV #READ,R4 ; Map the input DPBI# MOV #WRITE,R5 ; Map the output DPB$) CLR Q.IOPL+4(R5) ; Turn off carriage ctl. MOV #QUES1,Q.IOPL(R5) MOV #QUES1L,Q.IOPL+2(R5)w DIR$ R5 ; Prompt for the DNA TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error MOV #BUFF1,Q.IOPL(R4) MOV #64.,Q.IOPL+2(R4) DIR$ R4 ; Get the response TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error- $STORE IOLEN,DNS,R0 ; Set the default lengthA/ $STORE #BUFF1,DNA,R0 ; Set the default addresst" $PARSE R0 ; Parse the input spec $COMPARE #0,STS,R0 ; An error?M BLT ERROR ; Yes if LTQ MOV #FAB2,R0 ; Map the 2d FAB MOV #QUES2,Q.IOPL(R5) MOV #QUES2L,Q.IOPL+2(R5)(# DIR$ R5 ; Prompt for the new name TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error MOV #BUFF2,Q.IOPL(R4) MOV #64.,Q.IOPL+2(R4) DIR$ R4 ; Get the response TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error- $STORE IOLEN,FNS,R0 ; Set the default length/ $STORE #BUFF2,FNA,R0 ; Set the default address/ MOV #40,Q.IOPL+4(R5); Restore carriage controlS$ CLR FILCNT ; Initialize file count! BR LOOP ; Enter the RENAME loopFEXIT:# EXIT$S ; Task exit#LOOP:I! MOV #FAB1,R0 ; Get the input 00TUVtuvFABt" MOV #FAB2,R1 ; And the output FAB$ MOV #NAM1,R2 ; Setup NAM references MOV #NAM2,R3 ;L0 $SET #FB$FID,FOP,R0 ; Turn on explicit searches% $SEARCH R0 ; Attempt to find a fileB $COMPARE #0,STS,R0 ; Error? BLT SEAERR ; Yes if LT- $FETCH R4,RSA,R2 ; Get the resultant addresse' $STORE R4,DNA,R1 ; Set this as default(, $FETCH R4,RSL,R2 ; Get the resultant length* $STORE R4,DNS,R1 ; Set the default length* $RENAME R0,,,R1 ; Rename input as output $COMPARE #0,STS,R0 ; Error?$ BLT ERROR ; Yes if LT- investigate) MOV #EDBLK,R0 ; Setup to show the renameA CLR (R0) ;$ $FETCH (R0),RSL,R2 ; Set the length" TST (R0)+ ; Advance to next word& $FETCH (R0)+,RSA,R2 ; Set the address CLR (R0) ; $ $FETCH (R0),ESL,R3 ; Set the length" TST (R0)+ ; Advance to next word$ $FETCH (R0),ESA,R3 ; Set te address MOV #RENMSG,R1 ; Format stringe CALL PRINT ; Display itT INC FILCNT ; Count the file BR LOOP ; And try another fileERROR:# MOV #EDBLK,R2 ; Map the edit block+ $FETCH (R2)+,STS,R0 ; Set the STS returnedD! $FETCH (R2),STV,R0 ; And the STV- MOV #ERRSTR,R1 ; Set the error format stringg, CALL PRINT ; Go edit and print the message# JMP RENAME ; Let's try this againRSEAERR:3 $COMPARE #ER$NMF,STS,R0 ; End of wild card search?d BNE ERROR ; No if NE- show why# MOV #EDBLK,R0 ; Map the edit blockR TST FILCNT ; Any files?R# BNE TOTAL ; Yes if NE, show totalu MOV #NOFILE,R1 ; Show the totalSETES: CLR (R0) ;$ $FETCH (R0),ESL,R2 ; Set the length TST (R0)+ ; Advance;* $FETCH (R0)+,ESA,R2 ; Get the ESA address CALL PRINT ; JMP RENAME ; RepeathTOTAL:( MOV FILCNT,(R0)+ ; Set the rename count' MOV #TTLMSG,R1 ; Set the format stringt BR SETES ; Add ESA and print RPRINT: MOV #EDBLK,R2 ; Setup edite MOV #BUFFER,R0 ; Output bufferh CALL $EDMSG ; Exit the stringe MOV #BUFFER,WRITE+Q.IOPLA MOV R1,WRITE+Q.IOPL+2$ DIR$ #WRITE ; Send to the terminal RETURN ; Return to caller .PSECT $DATA$,RW,D)SYDSKA: .Ascii "SY:" SYDSKL = . - SYDSKAQUES1: .Ascii <15><12>"From: "e QUES1L = . - QUES1RQUES2: .Ascii <15><12>"To: "O QUES2L = . - QUES2)0ERRSTR: .Asciz "$RENAME error -- STS=%P, STV=%P"*RENMSG: .Asciz " File %VA renamed to %VA";TTLMSG: .Asciz "%NTotal of %D files matching %VA renamed%N"R*NOFILE: .Asciz "%NNo files matching %VA%N" .EVENFILCNT: .WORD 0EEDBLK: .BLKW 6BUFFER:.BUFF1: .BLKB 64.BUFF2: .BLKB 64 ESSTR1: .BLKB 128.ESSTR2: .BLKB 128.RSSTR1: .BLKB 128.IOSTAT: .WORD 0AIOLEN: .WORD 0READ: QIOW$ IO.RLB,1,1,,IOSTAT'WRITE: QIOW$ IO.WLB,1,1,,IOSTAT,,<,,40> .END RENAME .TITLE ERASE - $ERASE TESTN .IDENT /X01.00/; ; COPYRIGHT (c) 1983 BYT); DIGITAL EQUIPMENT CORPORATION, MAYNARDS(; MASSACHUSETTS. ALL RIGHTS RESERVED.; O6; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY6; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE6; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THE6; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER6; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE6; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO6; AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.; 6; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO6; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED6; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.; 6; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR6; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS; NOT SUPPLIED BY DIGITAL.; T .ENABL LC .MCALL FAB$B,NAM$B,GSA$, .MCALL $PARSE,$ERASE,$STORE,$FETCH,$COMPARE .MCALL ALUN$S,QIOW$,DIR$,EXIT$S;E,; This00 kTADATADATADATADATADATA program tests/demonstrates the use of4; the RMS-11 $ERASE function, with implicit $SEARCH.;A;S; RMS-11 Data Structures;T GSA$ GSAHFAB:: FAB$B ; Argument FAB# F$DNA SYDSKA ; If no device, SY:O F$DNS SYDSKL ; should be used F$NAM NAM ; Link to NAM F$LCH 2. ; Channel #2 FAB$ENAM:: NAM$B ; NAM definition! N$ESA EXPSTR ; EXP STR address. N$ESS 128. ; EXP STR length! N$RSA RESSTR ; RES STR address$ N$RSS 128. ; RES STR length NAM$E .PSECT $CODE$,RO,IoERASE::d( ALUN$S #1,#"TI,#0 ; Assign the terminal" MOV #FAB,R0 ; Map the target FAB# MOV #EDBLK,R2 ; Map the exit blockT" MOV #NAM,R3 ; Map the target NAM! MOV #READ,R4 ; Map the input DPB # MOV #WRITE,R5 ; Map the output DPBd) CLR Q.IOPL+4(R5) ; Turn off carriage ctlC MOV #QUES,Q.IOPL(R5)B MOV #QUESL,Q.IOPL+2(R5) DIR$ R5 ; Prompt for the DNA TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error MOV #BUFF,Q.IOPL(R4) MOV #64.,Q.IOPL+2(R4) DIR$ R4 ; Get the response TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error, $STORE IOLEN,FNS,R0 ; Set the string length- $STORE #BUFF,FNA,R0 ; Set the string address / MOV #40,Q.IOPL+4(R5); Restore carriage controlu$ CLR FILCNT ; Init count of matches $PARSE R0 ; Parse the stringso $COMPARE #0,STS,R0 ; An error?P# BLT ERROR ; Yes if MI; display itRGETFIL:r* MOV #EDBLK,R2 ; Reset the edit block addr# $ERASE R0 ; Issue implicit $ERASEV $COMPARE #0,STS,R0 ; Error? BLT ERROR ; Yes if LT  CLR (R2) ; Init the length+ $FETCH (R2),RSL,R3 ; Get the string lengthr TST (R2)+ ; Advance;- $FETCH (R2)+,RSA,R3 ; Get the string addressS* MOV #RSSSTR,R1 ; Select the format string' TST FILCNT ; First file needs a blank  BNE NOTFST ; line before itS$ MOV #RSSST1,R1 ; Insert CR/LF firstNOTFST:  CALL PRINT ; Display the filef$ MOV #FAB,R0 ; Rest the FAB address INC FILCNT ; Count this file# BR GETFIL ; And let's try anotherVEXIT:R EXIT$S ; Task exitBERROR:+ $COMPARE #ER$NMF,STS,R0 ; No more matches?$$ BNE ERROR0 ; No - some other error, MOV FILCNT,(R2)+ ; Set the cound of matches BEQ ERROR2 ; No files... CLR (R2) ; Give the ESAt$ $FETCH (R2),ESL,R3 ; Set the length TST (R2)+ ; Advance word% $FETCH (R2),ESA,R3 ; Set the address1' MOV #TTLSTR,R1 ; Set the format string ! BR ERROR1 ; Go show it and exitAERROR2:e% CLR -(R2) ; Setup for string lengtht$ $FETCH (R2),ESL,R3 ; Set the length" TST (R2)+ ; Advance to next word% $FETCH (R2),ESA,R3 ; Set the addressT' MOV #NOFILE,R1 ; Set the format stringN BR ERROR1 ; Print the errorNERROR0: + $FETCH (R2)+,STS,R0 ; Set the STS returnedi! $FETCH (R2),STV,R0 ; And the STV- MOV #ERRSTR,R1 ; Set the error format string+ERROR1:c, CALL PRINT ; Go edit and print the message" JMP ERASE ; Let's try this againPRINT: MOV #EDBLK,R2 ; Setup editi MOV #BUFFER,R0 ; Output buffer  CALL $EDMSG ; Exit the stringE MOV #BUFFER,Q.IOPL(R5)T MOV R1,Q.IOPL+2(R5) DIR$ R5 ; Send to the terminal RETURN ; Return to caller .PSECT $DATA$,RW,DnSYDSKA: .Ascii "SY:" SYDSKL = . - SYDSKA)QUES: .Ascii <15><12>"File(s) to erase: "i QUESL = . - QUESR/ERRSTR: .Asciz "$ERASE error -- STS=%P, STV=%P" RSSST1: .Ascii "%N"1#RSSSTR: .Asciz " File %VA deleted"t*NOFILE: .Asciz "%NNo files matching %VA%N";TTLSTR: .Asciz "%NTotal of %D files matching %VA deleted%N"  .EVENFILCNT: .WORD 0MEDBLK: .BLKW 6BUFFER:MBUFF: .Blkb 128.EXPSTR: .BLKB 128.RESSTR: .BLKB 128.IOSTAT: .WORD 0nIOLEN: .WORD 0READ: QIOW$ IO.RLB,1,1,,IOSTAT'WRITE: QIOW$ IO.WLB,1,1,,IOSTAT,,<,,40>K .END ERASE00TUVtuv .TITLE PARSE - $PARSE TESTN .IDENT /X01.00/; COPYRIGHT (c) 1983 BYT); DIGITAL EQUIPMENT CORPORATION, MAYNARD(; MASSACHUSETTS. ALL RIGHTS RESERVED.; R6; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY6; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE6; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THE6; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER6; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE6; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO6; AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.; 6; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO6; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED6; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.; 6; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR6; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS; NOT SUPPLIED BY DIGITAL.; T .ENABL LC .MCALL FAB$B,NAM$B,GSA$% .MCALL $PARSE,$STORE,$FETCH,$COMPAREA .MCALL ALUN$S,QIOW$,DIR$,EXIT$S; ,; This program tests/demonstrates the use of; the RMS-11 $PARSE function.H;I;A; RMS-11 Data Structures; GSA$ GSA FAB:: FAB$B ; Argument FAB F$NAM NAM ; Link to NAM F$LCH 2. ; Channel #2 FAB$ENAM:: NAM$B ; NAM definition! N$ESA EXPSTR ; EXP STR addressU N$ESS 128. ; EXP STR length NAM$E .PSECT $CODE$,RO,I PARSE::D( ALUN$S #1,#"TI,#0 ; Assign the terminal" MOV #FAB,R0 ; Map the target FAB# MOV #EDBLK,R2 ; Map the exit blockQ" MOV #NAM,R3 ; Map the target NAM! MOV #READ,R4 ; Map the input DPB # MOV #WRITE,R5 ; Map the output DPBA) CLR Q.IOPL+4(R5) ; Turn off carriage ctl  MOV #QUES1,Q.IOPL(R5) MOV #QUES1L,Q.IOPL+2(R5)n DIR$ R5 ; Prompt for the DNA TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error MOV #BUFF1,Q.IOPL(R4) MOV #64.,Q.IOPL+2(R4) DIR$ R4 ; Get the response TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error- $STORE IOLEN,DNS,R0 ; Set the default lengthD/ $STORE #BUFF1,DNA,R0 ; Set the default address  MOV #QUES2,Q.IOPL(R5) MOV #QUES2L,Q.IOPL+2(R5) DIR$ R5 ; Prompt for the DNA TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error MOV #BUFF2,Q.IOPL(R4) MOV #64.,Q.IOPL+2(R4) DIR$ R4 ; Get the response TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error- $STORE IOLEN,FNS,R0 ; Set the default lengthR/ $STORE #BUFF2,FNA,R0 ; Set the default addressh/ MOV #40,Q.IOPL+4(R5); Restore carriage control, $PARSE R0 ; Parse the strings $COMPARE #0,STS,R0 ; An error?e# BLT ERROR ; Yes if MI; display it) CLR (R2) ; Init the length+ $FETCH (R2),ESL,R3 ; Get the string length  TST (R2)+ ; AdvanceE- $FETCH (R2)+,ESA,R3 ; Get the string addressM, $FETCH (R2),FNB,R3 ; Get the file name bits* MOV #ESSSTR,R1 ; Select the format string CALL PRINT ; Display the fileE# CALL BITS ; Do the FNB bit disply$" BR PARSE ; And let's try anotherEXIT:h EXIT$S ; Task exit;ERROR:+ $FETCH (R2)+,STS,R0 ; Set the STS returnedi! $FETCH (R2),STV,R0 ; And the STVr- MOV #ERRSTR,R1 ; Set the error format string(, CALL PRINT ; Go edit and print the message! BR PARSE ; Let's try this again BITS:E# MOV #EDBLK,R2 ; Init EDBLK addressn$ $FETCH R0,FNB,R3 ; Get the FNB bits BIT #2000,R0 ; Quoted string? BEQ 2$ ; No if EQa# MOV #QUO,(R2)+ ; Set Quoted stringf"2$: BIT #1000,R0 ; Wild directory? BEQ 4$ ; No if EQA$ MOV #WDI,(R2)+ ; Set wild directory4$: BIT #400,R0 ; Node spec?E BEQ 6$ ; No if EQt MOV #NOD,(R2)+ ; Set nodespec"6$: BIT #100,R0 ; Directory spec? BEQ 8$ ; No if EQo MOV #DIR,(R2)+ ; Set directoryd8$: BIT #40,R0 ; Wild name? BEQ 10$ ; No if eq MOV #WNA,(R2)+ ; Set wild name210$: BIT #20,R0 ; Wild type?  BEQ 12$ ; No if EQ MOV #WTY,(R2)+ ; Set wild typer 12$: BIT #10,R0 ; Wild version? BEQ 14$ ; No if EQ" MOV #WVE,(R2)+ ; Set wild version14$: BIT #4,R0 ; Name?f BEQ 16$ ; No if EQ MOV #NME,(R2)+ ; Set name16$: BIT #2,R0 ; Type? BEQ 18$ ; No if EQ MOV #TYP,(R2)+ ; Set type18$: BIT #1,R0 ; Version? BEQ 20$ ; No if EQ MOV #00 kTADATADATADATADATADATAVER,(R2)+ ; Set versione'20$: MOV #END,(R2) ; End with a null...?% MOV #DEV,R1 ; Set the default (dev)  CALL PRINT ; Edit and printR RETURN ; And exitPRINT: MOV #EDBLK,R2 ; Setup edit  MOV #BUFFER,R0 ; Output bufferl CALL $EDMSG ; Exit the string MOV #BUFFER,Q.IOPL(R5)d MOV R1,Q.IOPL+2(R5) DIR$ R5 ; Send to the terminal RETURN ; Return to caller .PSECT $DATA$,RW,D7QUES1: .Ascii <15><12>"Enter the default name string: "# QUES1L = . - QUES1Q7QUES2: .Ascii <15><12>"Enter the primary name string: "V QUES2L = . - QUES2 /ERRSTR: .Asciz "$PARSE error -- STS=%P, STV=%P" 0ESSSTR: .Ascii "$PARSE expanded string is %VA%N", .Asciz " File name bits (FNB) are %P"DEV: .Asciz " (DEV%I"eNOD: .Asciz ", NOD%I"tDIR: .Asciz ", DIR%I"FNME: .Asciz ", NAM%I",QUO: .Asciz ", QUO%I" TYP: .Asciz ", TYP%I"VER: .Asciz ", VER%I"aWDI: .Asciz ", WDI%I"$WNA: .Asciz ", WNA%I" WTY: .Asciz ", WTY%I"uWVE: .Asciz ", WVE%I"EEND: .Asciz ")" .EVENEDBLK: .BLKW 16.BUFFER:aBUFF1: .Blkb 64.BUFF2: .Blkb 64UEXPSTR: .BLKB 128.IOSTAT: .WORD 0 IOLEN: .WORD 0READ: QIOW$ IO.RLB,1,1,,IOSTAT'WRITE: QIOW$ IO.WLB,1,1,,IOSTAT,,<,,40>n .END PARSEa ,.. X(SYSYSYSYTICLSY~Ϛγ<<(~Zn.|*"*0.9 (γϚ@γPN)*b*e?E? & f Yw  w  w ) ť ť 0B )Aaw Z)' UD$BA )&( U BQ (Е*  & & @( )f  e ee e &f w   wF'&f '1e? ww & fYw  nw`j  5p.A?eE &  m  bABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw 6'&& D¥%  B&ХVA ` C 00TUVtuved!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf % & e%6& e%/& e*AHŀ ȕ Е Е Е & e% & ex%Е A %& eL%A Е A bEA EЕ A A   $Е. t AЕ; $    w L%D&& bЕ- eaePPPЕ-$w %D  &Е. ce "% Е:   0$Bw  &, 7%J%%e%1  0 55@ v ͥ#@>E5uu  < 5@[W& AɥNfv & fA5e&5 4Q4 ea  5  b#5 55U  u  5 wJ 5u@`Bf@ΥY!T55W Υ5  A > v;`e Υ t1 \% Υ hΥ##e  6APPH 8 ,   &5@f >:55&HJ1B(ҔȊ 1E c0 1 p   ` %lEw0F5%$&Bl, @%  : E͵L `Ӵӕ, J :؆*l,ʘ `Bp585Υ  ` % 51 1 5BBl>ʥ]ʥ: N Nҕ. L&Bl.0Ҕ lȊ 4`Ewe  w :@ ( C a   e%/e.Ґqӥ0    e&f- B * ͋'% ͥ!ͥE%,  D5  PB2 %pċ5J J J @ EͥAA In flf ws$e$,fL " . {"{^{`wX wdbD D/5% %%  S0Ԋ8cP @"s JD%b p wX  hw* 5 tBh?lYjU@055   wn @pK5˥t)) ‹5Up55AɥAeu@A55U4 H  j &fw 51 e !`Be`@&  Ae G`5 ?  >9.E*551 w 5e JCœ 5œ  w\53 3 & U U@ UG3  >& Nf  * && @& & Nf8 o &0Zwp V5D% .A Vw J\w e   >w  nBA%&  ^% 5E     ,@ DAD`wU5 2wRBe,  'SY !@ʥ_ e 0ε%wX ,@   .ҕ: B n  W1SΕ[ B C`Δ > Ef&Nf& "W<W>W[W]CB`ק&ק&w ?ҕ[e zҕ, pҕ] * ͋ 5 D wѕ. B@ⳐB15   r; ( F BU1 1 1  w~58Be8bbbeJbb#1 AA ܃ BP5U ueLEew\h@B 0 %!w Twwק&ק&@w .E5BAw @ ևB  Bu BEC`"  D ccє D ɔɥaɥzɥ ۇ&e 00ǃ kTADATADATADATADATADATA# .5e˔Ee0  fEB`F ~ . ӥ:  ӥ:@! $  @! U`eUU5U mɥ[ɥ<"@  ˥.   0Q UDeĤ _ Uċ5E  lU0 E pU5 . 5E0 U L. x; n Ċ- bU " & N ӥ"   U5CM% E A5Q`C _C&  A &5 ˥A˥Z.˥a˥z(˥ ˥ ˥˥˥ ˥*˥% ˥$˥_  ˥0 ˥9 ˥7 U   ˋ˥ ˥ #  .0 µ1!0  5 55   e5& Y5 T SP K  E > 5&@@   ) % e  C   r  &V p 0 p 0    5wr     @  ppp 0 0 0  1 1 1 veN*PU5D e0  S b  ,rw ` 4@  %P $ N05E65Q M ̥ I5 5A@p 8 ȥ 45  % D`P`_ ,/O&PXVUTSEEuB 5 =/5 *@ %E E E  M͊    ` ͊ udEE5 p U 5@\ .% - / ,3e"5550% @L @ R , %P Eewup1 b5 E (#   *  P P &1u A  ) fL .H@ D,  4 H .   &f .D̥  w f 2 & 2r  4  8 <0w d& l   &ap aB#E   *   uD5e`w eE< .f "2  , ,p l J a b! jP PH  HP PH f ` %5w  #5 ȥ ȋ5ȋ1 1 ".#Հ && rpp  f '`0  0   &f 0 &V &  K&1 f  >%8 5`0+&! u  0   P 0 & %  5U e G 16 z,* M` 4 ʥ,  , 0<U: .% 0e  8`ee 08 6D Bʥ-  % 17ʥ* 1Y%V&5 '& eCʥ9@& 0c R  ʥ72& 0cV +  42% x`0. ,5%5  ʥ*5   0  # # # % 8w  1ʥ* ʥ%%Z$@e.!%'  & e a  A ҥ*B 40 Jʥ*ʥ7  ˕ ʥ" ʥaʥz‹  C^6 BBd&5; '& Ee0 &  N #  e0 `IҐ `e   8. 1  `̥ @ $ ! 1  ŀ f&& 6 pp   F& &   &  w  00σԃTUVtuv ͥ+ ,-..  .U.m. Up. ]<  ΊUE A .   6  X6 6 ev 66  .4.m t  `0 4"4 $e$t "4 &&e  0 Dw&D& ,%%%p& TI)f+~+5 Q) f F) @&;,)( 7 Nf& e &)f& e  ʜ ) ) V 3%l  ʜ )" ʜ ) n) w)) t) ufSY: Enter a wildcard filespec: $SEARCH error -- STS=%P, STV=%P%N %VA%NNo files matching %VA%N%NTotal of %D files matching %VA%N b+ b+ w BeE D` bl lrw   B eE"s    s-  Csl 5 ߥ& *  + 23E Ew Z   Е-   0@A XW e`fÊ    E &f &  m  f A N  %&   `@ ` B   & A @     %6 v- .$& H++++- +++R.++R.++++++-,.. S'SYSYSYSYTICLSY~Ϛγ<<'~Z.|*"*0.: γϚ@00׃ kTADATADATADATADATADATAγP)+*PpN+e?E? & f YwB  w:  w2   *  + 23E Ew 8)   Е-   0@A 6)W e`fÊ    E  w ( ť ť 0B (Aaw (' UD$BA (&( U BQ Е*  & & @( R(f  e ee e &f w   w,'&f f'1e? ww & fYw  nw`j  5.A?eE t&  m  bABDEFIMNOPQRSTUXYZ<>=MXd^)JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw z&&& D¥%  B&ХVA ` C ed!  aeNb A  Е%̥V P Е Bf  & enB& eZ;& e6Hŀ ȕ  nЕ Ћ  Е Е & e & eЕ A %& eA Е Е A A   $Е.  AЕ; ~    A &EA  HE 6Dw $D&& bЕ- eaePPPЕ-$w `$D  &Е. ce f$ Е:   Bw  &, 7(%P %$e%1   55@ ( ͥ#@>E5uu  < B5@[W& AɥNfv & fA5e&5 4Q4 ea  5  #5 55U J u l n5 w 5u@`Bf@ΥY!T55W Υ5  @A > ;`e Υ 1 % Υ Υ##e D APPH 8    5@f >:55&HJ1B(ҔȊ 1E c0 1 p   ` %lEwz0F5%$&Bl, @%  : E͵L `Ӵӕ, J :؆*l,ʘ `Bp585Υ T b` % 51 1 5BBl>ʥ]ʥ: N Nҕ. L&Bl.0Ҕ lȊ `Ewe  w @ ( C a   e%/e.Ґqӥ0    e&f8. B * ͋'% ͥ!ͥE%,  K5  PB2 %pˋ5J J J @ EͥAA In flf ws$e$,fL " . {"{^{`w wdbD z D/5% %%  S0Ԋ8cP @"s JD%b p w  w 5 tBh?lYjU@055   w @pK5˥t)) ‹5Up55AɥAeu@A55U4 H   &fwD 51 e !`Be`@&  Ae G`5 >  =8.E*450 [ 5e BCœG 5œ8  w00߃ԃTUVtuvP53 3 3 VBA%&  F %  "@ DAD`wU5 .wFBe[  VSY P @ʥ_*& a& Βf&  ߥ&ߥ&wc   :w, 5e 0ε% @   ҕ: B .5 ewN  w"1 B C` x˥.ӥ- ꇂf&Nf& HCB`ק&ק&S?ҕ[e ҕ, ҕ] B¥]¥> B=C` ޒΕ. ˥- N Q NN0KQ ˥. D wѕ0 Τ   ͋ 5D ѕ. B@ⳐB15   ; ( F BU1 1 1 5\ w>58Be8bbbeJbb#3 AA ܃ BP5U ueLEewjh @B`0 %!wh Tw~wק&ק&@w .5BA8 ևB  u BEC`  D ccє  D ɔɥaɥz Bއ&e # ˔Ee0  fEB`F ~ . ӥ:  ӥ:@! $  @! U`eUU5U mɥ[ɥ<"@  ˥.   z0Q UDeĤ _ Uċ5E  lU0 E pU5 . 5E0 U L. x; n Ċ- bU " & N ӥ"   U5CM% E A5Q`C _C&  p2 && ˥A˥Z˥a˥z ˥*˥% ˥$˥_  ˥0 ˥9 ˥7 U   ˋ˥ ˥ #  .0 µ1!0  5 55   e5& Y5 T SP K  E > V 5&@@   ) % e  C   r  &V p 0 p 0    5wr     @  ppp 0 0 0  1 1 1 veN*PU5D e0  S  ,rw ` 4@  %P $ N05E65Q M ̥ I5 5A@p 8 ȥ 45  % D`P`_ ,/O&PXVUTSEEuB 5 =/5 *@ %E E E  M͊    ` ͊ udEE5 p U 5@\ .% - / ,3e"5550% @L @ R , %P Eewjup1 b5 E v#  j *  P P &1u A  ) fL .H@ D,  4  .   &f .D̥  w f 2 & 2r  4  8 <0w d& l   &ap aB#E   *   uD5e`w eE< .f p2  , ,p l J a b! ZP PH  8P PH f ` %5w N #5 ȥ ȋ5ȋ1 1 ".#Հ && rpp  f `0   0  &f 0 &V &  K&1 f & >%8 5`0+&!00 kTADATADATADATADATADATA u  0   P 0 & %  5U e G 16 z,* M` R4 ʥ,  , 0<U: .% 0e  8`ee 08 6& $ʥ-  % 1ʥ* ;%8 ʥ72& 0cV +  42% x`0. ,5%5  ʥ*5   0  # # # % 8w R 1ʥ* ʥ%%Z$@e.!%'  & e a  A ҥ*B 40 Jʥ*ʥ7  ˕ ʥ" ʥaʥz‹  &^6 BBd; Ee0 `IҐ `e   8. 1  `̥ @ $ ! 1  ŀ f&&  pp   & &   & r w  JPUUp. ]<  ΊUE A .   6  J6 6 ev 66m t  `0 4"4 $e$t "4 &&e  0 Dw&D& %%%p& TIN*R,j,5 )  fBZ* @&7-Z**f& Le n )  f* @& ,*( 7 3 pUf& e ;1* 1-ff& e  N*   Ȝ ) R N* ) 8w%lN* 2*   wl*N*Z* Z*wj,SY: From: To: $RENAME error -- STS=%P, STV=%P File %VA renamed to %VA%NTotal of %D files matching %VA renamed%N%NNo files matching %VA%N N, N, w eE D` bl lrw \  B eE"s    s-  Csl&f &  m  f A N  %&   `@ ` B   & A @     % < -T.* , N,,,,4..,,.,,,,,,8.,?-?- S'00ԃTUVtuvSYSYSYSYTICLSY~Ϛγ<<'~Z8-|*"*0?-4 γϚEγP(T*)e?E? & f Yw: w2   *  + 23E Ew 6(   Е-   0@A 4(W e`fÊ    E  w ' ť ť 0B 'Aaw '' UD$BA '&( U BQ Е*  & & @( P'f  e ee e &f w   w*&&f d&1e? ww & fYw  nw`j  58-Ar?reE |f&vn  m  bABDEFIMNOPQRSTUXYZ<>=MXd^)JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw x%&& D¥%  B&ХVA ` C ed!  aeNb A  Е%̥V P Е Bf  & enB& eZ;& e6Hŀ ȕ  nЕ Ћ  Е Е & e & eЕ A %& eA Е Е A A   $Е.  AЕ; ~    A &EA  HE 6Dw #D&& bЕ- eaePPPЕ-$w ^#D  &Е. ce d# Е:   Bw  &, 7&$$#e$1   55@ ( ͥ#@>E5uu  < B5@[W& AɥNfv & fA5e&5 4Q4 ea  5  #5 55U J u l n5 w 5u@`Bf@ΥY!T55W Υ5  @A > ;`e Υ 1 % Υ Υ##e D APPH 8    5@f >:55&HJ1B(ҔȊ 1E c0 1 p   ` %lEwz0F5%$&Bl, @%  : E͵L `Ӵӕ, J :؆*l,ʘ `Bp585Υ T b` % 51 1 5BBl>ʥ]ʥ: N Nҕ. L&Bl.0Ҕ lȊ `Ewe  w @ ( C a   e%/e.Ґqӥ0    e&f, B * ͋'% ͥ!ͥE%,  K5  PB2 00 kTADATADATADATADATADATA%pˋ5J J J @ EͥAA In flf ws$e$,fL " . {"{^{`w wdbD z D/5% %%  S0Ԋ8cP @"s JD%b p w  w 5 tBh?lYjU@055   w @pK5˥t)) ‹5Up55AɥAeu@A55U4 H   &fwD 51 e !`Be`@&  Ae G`5 >  =8.E*450 [ 5e BCœG 5œ8  wP53 3 3 VBA%&  F %  "@ DAD`wU5 .wFBe[  VSY P @ʥ_*& a& Βf&  ߥ&ߥ&wc   :w, 5e 0ε% @   ҕ: B .5 ewN  w"1 B C` x˥.ӥ- ꇂf&Nf& HCB`ק&ק&S?ҕ[e ҕ, ҕ] B¥]¥> B=C` ޒΕ. ˥- N Q NN0KQ ˥. D wѕ0 Τ   ͋ 5D ѕ. B@ⳐB15   ; ( F BU1 1 1 5\ w>58Be8bbbeJbb#3 AA ܃ BP5U ueLEewjh @B`0 %!wh Tw~wק&ק&@w .5BA8 ևB  u BEC`  D ccє  D ɔɥaɥz Bއ&e # ˔Ee0  fEB`F ~ . ӥ:  ӥ:@! $  @! U`eUU5U mɥ[ɥ<"@  ˥.   z0Q UDeĤ _ Uċ5E  lU0 E pU5 . 5E0 U L. x; n Ċ- bU " & N ӥ"   U5CM% E A5Q`C _C&  p2 && ˥A˥Z˥a˥z ˥*˥% ˥$˥_  ˥0 ˥9 ˥7 U   ˋ˥ ˥ #  .0 µ1!0  5 55   e5& Y5 T SP K  E > V 5&@@   ) % e  C   r  &V p 0 p 0    5wr     @  ppp 0 0 0  1 1 1 veN*PU5D e0  S  ,rw ` 4@  %P $ N05E65Q M ̥ I5 5A@p 8 ȥ 45  % D`P`_ ,/O&PXVUTSEEuB 5 =/5 *@ %E E E  M͊    ` ͊ udEE5 p U 5@\ .% - / ,3e"5550% @L @ R , %P Eewjup1 b5 E v#  j *  P P &1u A  ) fL .H@ D,  4  .   00ԃTUVtuv&f .D̥  w f 2 & 2r  4  8 <0w d& l   &ap aB#E   *   uD5e`w eE< .f p2  , ,p l J a b! ZP PH  8P PH f ` %5w N #5 ȥ ȋ5ȋ1 1 ".#Հ && rpp  f `0   0  &f 0 &V &  K&1 f & >%8 5`0+&! u  0   P 0 & %  5U e G 16 z,* M` R4 ʥ,  , 0<U: .% 0e  8`ee 08 6& $ʥ-  % 1ʥ* ;%8 ʥ72& 0cV +  42% x`0. ,5%5  ʥ*5   0  # # # % 8w R 1ʥ* ʥ%%Z$@e.!%'  & e a  A ҥ*B 40 Jʥ*ʥ7  ˕ ʥ" ʥaʥz‹  &^6 BBd; Ee0 `IҐ `e   8. 1  `̥ @ $ ! 1  ŀ f&&  pp   & &   & r w  JPUUp. ]<  ΊUE A .   6  J6 6 ev 66m t  `0 4"4 $e$t "4 &&e  0 Dw&D& %%%p& TIH)**5 ( fFT) @&;,T)( 7 Xf& Ne &H)f& (e  ʜ ( ( V 3%l  ʜ )" ʜ ) ( wH)T) T) ufSY: File(s) to erase: $ERASE error -- STS=%P, STV=%P%N File %VA deleted%NNo files matching %VA%N%NTotal of %D files matching %VA deleted%N * * w eE D` bl lrw \  B eE"s    s-  Csl&f &  m  f A N  %&   `@ ` B   & A @    F X%  F,,8+ +++,88"-++"-++++++,00 kTADATADATADATADATADATA,?'?' W SYSYSYSYTICLSY~Ϛγ<< ~Z2'|DUDUDUDUTICLDU?'{. γϚ|γP#w w z" ť ť 0B n"Aaw H"' UD$BA "&( U BQ !Е*  & & @( !f  e ee e &f w   w4 &f n 1e? ww & fYw  nw`j  54'A?eE @&.m    be?E? & f YABDEFIMNOPQRSTUXYZ<>"Ba$ep|v$JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw && D¥%  B&ХVA 8 C ed!  aeNbE  Е%̥V A6D Ћ  AP AЕ Bf  & e6& e/& e*AHŀ ȕ Е Е Е & eR & e>Е A %& eA Е A bEA EЕ A dA   $Е. L AЕ;     w D&& bЕ- eaePPPЕ-$w D  &Е. ce  Е:   Bw &, 7Hfe1   55@ 8 ͥ#@>E5uu  < R5@[W& AɥNfv & fA5e&5 4Q4 ea  5  $#5 55U Z u | ~5 w  5u&f& B * ͋'% ͥ!ͥE%,  D5  PB2 %pċ5J J J @ EͥAA In flf ws$e$,fL " . {"{^{`wX wdbD D/5% %%  S0Ԋ8cP @"s JD%b p wX  hw* 5 tBh?lYjU@055 00ԃTUVtuv  wn @pK5˥t)) ‹5Up55AɥAeu@A55U4 H  j &fw 51 e !`Be`@&  Ae G`5 ?  >9.E*551 w 5e JCœ 5œ  w\53 3 & U U@ UG3  >& Nf  * && @& & Nf8 o &0Zwp V5D% .A Vw J\w e   >w  nBA%&  ^% 5E     ,@ DAD`wU5 2wRBe,  'SY !@ʥ_ e 0ε%wX ,@   .ҕ: B n  W1SΕ[ B C`Δ > Ef&Nf& "W<W>W[W]CB`ק&ק&w ?ҕ[e zҕ, pҕ] * ͋ 5 D wѕ. B@ⳐB15   r; ( F BU1 1 1  w~58Be8bbbeJbb#1 AA ܃ BP5U ueLEew\h@B 0 %!w Twwק&ק&@w .E5BAw @ ևB  Bu BEC`"  D ccє D ɔɥaɥzɥ ۇ&e # .5e˔Ee0  fEB`F ~ . ӥ:  ӥ:@! $  @! U`eUU5U mɥ[ɥ<"@  ˥.   0Q UDeĤ _ Uċ5E  lU0 E pU5 . 5E0 U L. x; n Ċ- bU " & N ӥ"   U5CM% E A5Q`C _C&  A &5 ˥A˥Z.˥a˥z(˥ ˥ ˥˥˥ ˥*˥% ˥$˥_  ˥0 ˥9 ˥7 U   ˋ˥ ˥ #  .0 µ1!0  5 55   e5& Y5 T SP K  E > 5&@@   ) % e  C   r  &V p 0 p 0    5wr     @  ppp 0 0 0  1 1 1 veN*PU5D e0  S b  ,rw ` 4@  %P $ N05E65Q M ̥ I5 5A@p 8 ȥ 45  % D`P`_ ,/O&PXVUTSEEuB 5 =/5 *@ %E E E  M͊    ` ͊ udEE5 p U 5@\ .% - / ,3e"5550% @L @@ R , %P Eewup1 b5 E (#   *  P P &1u A  ) fL .H@ D,  4 H .   &f .D̥  w f 2 & 2r  4  8 <0w d& l   &ap aB#E   *   uD5e`w eE< .f "2  , ,p l J 00 kTADATADATADATADATADATAa b! ZP PH  8P PH f ` %5w  #5 ȥ ȋ5ȋ1 1 ".#Հ && rpp  f `0   0  &f 0 &V &  K&1 . 1  `̥ @ $ ! 1  ŀ f&& x pp   & &   & . w  ͥ+ ,-..  .U.m. Up. ]<  ΊUE A .   6  T6 6 ev 66 .4.m t  `0 4"4 $e$t "4 &&e R 0 Dw &D& ~%%%p& TI#*$B$5 " !f`L2# @&JAF-2#*/" !f(0r# @&%,r#( f& e  ʜ o" 3 P" |#5"5"5"5@"5 "5"5#5"5"5"#" #2# 2# uf Enter the default name string: Enter the primary name string: $PARSE error -- STS=%P, STV=%P$PARSE expanded string is %VA%N File name bits (FNB) are %P (DEV%I, NOD%I, DIR%I, NAM%I, QUO%I, TYP%I, VER%I, WDI%I, WNA%I, WTY%I, WVE%I) &$ &$ w BeE D` bl lrw   B eE"s    s-  Csl 5 ߥ& *  + 23E Ew Z   Е-   0@A XW e`fÊ    E &f &  m  f A N  %&   `@ ` B   & A @       :&&"$j Z$^$b$f$&j j j$j$j$'j$j$'j$j$j$j$j$j$&<0Y "@,wwUwH www`Iw?w""w#w{Q3wT[7wxdwdUw WwwZww(wP :00 ԃTUVtuv@hY T33.;.; SGNMAIN.CMD.;1.; RSX-11M-PLUS SYSGEN -- Mainline command file.;.;.;.; COPYRIGHT (c) 1988,1989 BY).; DIGITAL EQUIPMENT CORPORATION, MAYNARD(.; MASSACHUSETTS. ALL RIGHTS RESERVED..;B.; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USEDB.; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSEB.; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THISB.; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED ORB.; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO AND3.; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.;.;B.; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTB.; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL.; EQUIPMENT CORPORATION.N.;B.; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF=.; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.I.;.; Version: 12.00S.;.; Written by:.;.; J. C. Franzini .;.; Previously modified by:.;.; J. C. Franzini .; G. N. Larsen .; L. B. McCulleyN.; J. W. BerzleT.;.; Modified for M-PLUS V4.2 by:T.; .; L.B. McCulley 20-Oct-88 11.02%.; LBM130 -- Fix BL display for FT .; .; L. B. McCulley 6-Jan-89 12.004.; LBM149 -- Propogate BL for display from sysbuild.;.; Documentation by:.;.; M. J. Tardiff.; LE.; This command file must run on the current and previous versions of;".; RSX-11M-PLUS and on VAX-11 RSX...; SYSGEN is supported on the following disks:.;.; RP04, RP05, RP06F.; RM02, RM03, RM05, RM80, RP07 .; RK07e.; RA60, RA80, RA81B.; Variable names and use conventions in the SYSGEN command files:.;D.; $a$aaa contains the value associated with the RSXMC symbol a$$aaaM.; a$aaaa contains the value associated with the data structure offset a.aaaaaK.; aa'xxx' type symbols should be thought of as arrays or tables, where thec.; variable xxx is the index..;-.; TEMPN, TEMPNn temporary numeric variabless,.; TEMPS, TEMPSn temporary string variables-.; TEMPL, TEMPLn temporary logical variables .;H.; These temporary variables should only be used for short-term, obviousK.; purposes: counters, indices, intermediate values, temporary work areas,eG.; etc. They should NEVER have any long-term significance. The entiretG.; life or scope of any one usage should be visible at a glance. NeveraC.; expect a temporary variable to be intact over a subroutine call.;.;L.; DFLTN temporary numeric variable holding default response for a questionK.; DFLTS temporary string variable holding default response for a questionaL.; DFLTL temporary logical variable holding default response for a question.;K.; The following string variables define all the drivers in a given system.VI.; Each variable contains a class of drivers. The drivers are classifiednE.; by whether they are DIGITAL-supplied or user-supplied, resident oraJ.; loadable, with resident or loadable data bases. The strings are of the4.; form: dd,dd,dd,... where dd is a device mnemonic.;D.; $DSRR DIGITAL-supplied resident drivers with resident data basesD.; $DSLR DIGITAL-supplied loadable drivers with resident data basesD.; $DSLL DIGITAL-supplied loadable drivers with loadable data basesA.; $USRR User-supplied resident drivers with resident data bases A.; $USLR User-supplied loadable drivers with resident data baseseA.; $USLL User-supplied loadable drivers with loadable data basesd.;5.; Global Symbols: * - defined in this command file..;&.; $DCLI* restore CLI to DCL when done.; $00( kTADATADATADATADATADATAEC* expanded commentsn.; $PREP* PREPGENd.; $RP* release disk1.; $SVNI1* Executive saved answer input file name 3.; $SVNI2* peripherals saved answer input file namerA.; $SVNI3* nonprivileged task builds saved answer input file names2.; $SVNO1* Executive saved answer output file name4.; $SVNO2* peripherals saved answer output file nameB.; $SVNO3* nonprivileged task builds saved answer output file name2.; $SVUI1* use saved answers for Executive options9.; $SVUI2* use saved answers for peripheral configurationd:.; $SVUI3* use saved answers for nonprivileged task buildsB.; $SYGEN* lower-level command files have been invoked from SYSGEN.;.;G.; The two special symbols $SGNBL and $SGNVR are defined in the modulenH.; SGNVERSN contained in SYSGEN.CLB in order to propogate the baselevelC.; and version numbers, respectively, provided at the start of theg!.; development sysbuild process.f.;J.; NOTE: The answers to the questions in this module are not saved in theM.; saved answer files. However, the answers can be pre-defined in SGNPREFIX.r.; File usage:.;.; @SYSGEN/LB:SGNVERSNm.; @SGNPREFIX .; @ACFANSf.; .CHAIN /LB:SGNNXT;  .ENABLE GLOBALl .ENABLE SUBSTITUTION  .ENABLE ESCAPEd .DISABLE LOWERCASEn @'$SGNFI'SYSGEN/LB:SGNVERSN ;0 ; RSX-11M-PLUS V'$SGNVR' BL'$SGNBL' SYSGEN  ; ; COPYRIGHT (c) 1988s. ; DIGITAL EQUIPMENT CORP., MAYNARD MA., 01754 ; .SETT $SYGENn .SETT Y .SETF N .SETS COLON ":" .SETF $CE .SETF $CD .SETF $AE .SETF $BE .SETF $BP .SETF $BN .SETF $VM .SETF $AD7.; Define these symbols in case SGNPREFIX is not aroundF, .SETF $18BIT ! SGNPREFIX redefines this !, .SETF $M$PRO ! SGNPREFIX redefines this !, .SETF $B$LIN ! SGNPREFIX redefines this !, .SETF $P$GEN ! SGNPREFIX redefines this !/ .SETS $DIRCT "" ! SGNPREFIX redefines this !), .SETF $SYSBL ! SGNPREFIX redefines this !5 .TESTFILE SGNPREFIX.CMD ! Is prefix file available?. .IF NE 1 .GOTO 10 @SGNPREFIX.CMD$L.10: .IFT .OR .IF EQ 5 .GOTO 12 ! always F on AME ;H ; SGN -- Warning: This terminal is nonprivileged. If all the requiredH ; tasks are not installed, or if you do not have write-access toH ; the necessary UFDs on the target system disk, this SYSGEN will$ ; not complete successfully.?.12: .SETF $DCLI ! remember if CLI was DCL so we can restore itT .IF NE "DCL" .GOTO 20 .SETT $DCLI ; SET TERM MCR .20: .; Continue..; Set terminal to /NONAMED mode if necessary.7 .IF EQ 5 .GOTO 22 ! If EQ, AME, nonamed mode-; .IFNDF .GOTO 22 ! If NDF, pre-V2.1, nonamed moder1 .SETN F4$NAM 1000 ! Define bit mask for F4.NAMoI .PARSE "," JUNKS JUNKS JUNKS FMASK4 JUNKS ! Get 4th feature maskk2 .SETN TEMPN 'FMASK4'&F4$NAM ! Isolate bit F4.NAM; .IF TEMPN EQ 0 .GOTO 22 ! If EQ, named dir not supportedr" .IF NE "[]" SET /NONAMED%.; ! If NE, named mode, reset it.22: .; Continue, .IF NE "[200,200]" SET /UIC=[200,200]A .IFDF .AND .IF EQ 6 SET /DPRO=[RWED,RWED,RWE,R]DT .IFDF .AND .IF EQ 5 SET PROT=(SY:RWED,OW:RWED,GR:RWE,WO:R)/DEFAULT .IFNDF $EC .GOTO 24 .IFF $EC .GOTO 39.24: .; Continue ;> ; To exit from the SYSGEN procedure at any time, type CTRL/Z. ;@ ; If you are unsure of the answer to a question for which a de-/ ; fault answer exists, use the default answer.  ; ; ;5 ;===================================================,8 ; Choosing SYSGEN Options '' at '