.TITLE CMDRV .IDENT /V1/ .IDENT /V2/ .IDENT /V3/ ;3/30/77 .IDENT /V3.1/ ;7/28/77 .IDENT /V3.2/ ;9/14/77 .IDENT /V3.3/ ;12-MAR-78 .SBTTL CAMAC DRIVER FOR RSX11M ; ;MODIFICATIONS ; ;D.B. CURTIS 8/25/76 ADDED BD COMMAND STATUS WORD ;TO THE SECOND IOSW. ALSO KILLED THE ASSEMBLY ERROR THAT OCCURED. ; ;D.B. CURTIS 3/30/77 ADDED VERSION 3 MODS FOR LOADABLE DRIVER SUPPORT ;AND FOR MULTAPAL CONTROLLERS ;I HAVE ALSO REMOVED THE EXTRA SPACE IN THE DRIVER THAT WAS ;ADDED FOR POSSABLE EXPANSION AND THE PRINT STATEMENT THAT HELPED ;DETURMIN THE SIZE AS NO LONGER NEEDED. ; ; D.B.CURTIS ADDED VERSION 3.1 MODS TO ALLOW SETTING OF THE BM BIT ;THIS WILL ALLOW STOP MODE OPERATION OF THE DRIVER FOR JORWARS. ;AT THIS SAME TIME I CLEANED UP THE CODE FOR HANDLING BD011S ;ALSO ADDED CONDITIONAL SELECT ERROR MESSAGE AND FIXED BUG IN THE ;READ REGISTER FUNCTION THAT WIOLD PRODUCE A SELECT ERROR MESSAG ; ;D.B. CURTIS ADDED CODE TO ALLOW THE HIGH BIT OF THE SUBFUNCTION CODE ;TO INHIBIT THE DEVISE SELECT ERROR MESSAGE IF SET ; ; ;D.B.CURTIS ADDED CODE TO FIX BUG WHEN HANDLING MULTIPL CONTROLLERS ; ; ; IF G$$WRD OR P$$WRD NOT DEFINED ERRORS WILL BE PRODUCED ; THIS DRIVER USES THEM AND THY MUST BE SPECIFIED AT SYSGEN TIME ;&.AP ;&.SKIP 5 ;+ ; ; THIS IS A CAMAC DRIVER FOR RSX11M. IT HAS THE FOLLOWING FUNCTIONS: ;.SKIP 2 ;.LITERAL ; ; FOR ALL CASES, IF THE HIGH ORDER BIT IF THE SUBFUNCTION CODE IS ON ; SELECT ERROR MESSZGES WILL NOT BE PRODUCED ; ; FUNCTION MODIFIER ; ; 0=IO.KIL ; 1=WRITE ; 0=PROGRAMED DATA WRITE ; 1=ENTER LAM RECOGNITION CODE ; THIS IS NOT YET IMPLEMETED ; 2=NON DATA TRANSFER ; 2=READ ; 0=PROGRAMMED DATA READ ; 1=BRANCH DRIVER REGISTER READ ; 3=ATTACH ; 4=DETATCH ; 6=DMA TRANSFER ; 7-31=ILLEGAL ; ;.END LITERAL ;.SKIP 2 ; ; THE DRIVER IS WRITTEN FOR A EGG BD-011 BRANCH DRIVER ;WITH THE EXTENDED WORD COUNT MODIFICATION. ;IT ALSO SUPPORTS THE JORWAY BRANCH DRIVER INCLUDING EXTENDED ;MEMORY SUPPORT. THIS IS SELECTED BY DEFINING JORW. ; DMA TRANSFERS MUST BE SENT TO UNIT 1, NON DMA TRNASFERS MUST ;BE SENT TO UNIT 0. IF AN ATTEMPT IS MADE TO ACCESS A NON EXISTANT ;MODULE, A SELECT ERROR MESSAGE WILL BE DISPLAYED ON THE ;TERMINAL. IF A DEVICE NOT READY IS EVER PRINTED OUT, THE ;BD-011 IS SICK AND THE COMPUTING HARDWARE ;PEOPLE SHOULD BE CONTACTED. THE ONLY SUCCESSFULL ERROR RETURN IS IS.SUC. ; THE ERROR RETURNS OCCURE IN THE FIRST BYTE OF THE IOSW THE SECOND ;BYTE IS ALWAYS ZERO AND THE THIRD AND FORTH BYTES (THE SECOND WORD) ;CONTAIN THE COMMAND STATUS WORD OF THE ;BRANCH DRIVER. ;THE ERROR RETURNS ARE ;.LS ;.LE;IE.VER WHICH IS UNRECOVERABLE ERROR AND ;OCCURES IF THERE IS A BD-011 TIMEOUT. (IE THE CRATE ;IS OFFLINE OR THERE ISN'T ANY MOUDULE IN THE SELECTED STATION) ;.LE;IE.BAD WHICH IS BAD PARAMITER AND OCCURES IF AN ATTEMPT WAS ;MADE TO DO A DMA TO UNIT 0 OR A NON DMA TO UNIT 1. ;.LE;IE.ONP WHICH IS ILLEGAL SUBFUNCTION AND OCCURES IF THE ;SUBFUNCTIONS FOR FUNCTION 1 AND 2 ARE INCORRECT. ;.ELS ; THE REST OF THIS DESCRIBES THE FLOW OF THE LOGIC OF THE DRIVER. ;- ; ;MACRO LIBRARY CALLS ; .MCALL ABODF$,DEVDF$,HWDDF$,PKTDF$,TCBDF$,IOERR$ ABODF$ DEVDF$ HWDDF$ PKTDF$ TCBDF$ IOERR$ ;+ ; THE CAMAC FUNCTION CODES HAVE THE FOLLOWING NMUNONICS: ;.LS ; IO.CPW=400 ;.LE;IO.CPW=CAMAC PROGRAMMED DATA WRITE IO.ELM=401 ;.LE;IO.ELM=ENABLE LAM RECOGNITION (THIS IS CURRENTLY DISALBED) IO.NDT=402 ;.LE;IO.NDT=NON DATA TRANSFER IO.CPR=1000 ;.LE;IO.CPR=CAMAC PROGRAMMED READ IO.CRR=1001 ;.LE;IO.CRR=CAMAC REGISTER READ IO.CDM=3000 ;.LE;IO.CDM=CAMAC DMA TRANSFER CM.NMS=200 ;.LE;CM.NMS=DONOT ALLOW DEVICE SELECT ERROR MESSAGES ; ;.ELS ; DEFINE THE PRIORITY OF THE BD-011 BY EQUATING ;PL TO THE CORRECT PRIORITY (I.E. ;PL=PR4). ; DEFINE THE NUMBER OF CONTROLLERS BY EQUATING ;C$$M11 TO THE CORRECT NUMBER (I.E. ;C$$M11=1 ;- PL=PR4 ; ;& FOR A LOADABLE DRIVER LD$CM=0 MUST BE DEFINED ; ;& FOR A JORWAY BRANCH DRIVER DEFINE JORW JORW=0 ; ;LOCAL DATA ;+ ; LOCAL DATA BITS AND OFFSETS ARE, ; ;.LS DMA=4 ;.LE;DMA, WHICH SHOWES THAT A DMA OPERATION WAS THE LAST ;OPERATION THAT COMPLETED. LAMEN=2 ;.LE;LAMEN, WHICH SHOWS THAT LAMS SHOULD BE ENABLED AFTER ;A DMA OPERATION. MD24=40000 ;.LE;MD24, WHICH IS THE 24 BIT MODE OF THE FNA REGISTER. MADR=4 ;.LE;MADR, WHICH IS THE OFFSET FOR THE MEMORY ADDRESS ;REGISTER. DATA=2 ;.LE;DATA, WHICH IS THE OFFSET FOR THE DATA REGISTER. XTEND=12 ;.LE;XTEND, WHICH IS THE OFFSET FOR THE EXTENDED ;WORD COUNT REGISTER. FNA=10 ;.LE;FNA, WHICH IS THE OFFSET FOR THE FUNCTION, STATION, ;AND ADDRESS REGISTER. CRAT=6 ;.LE;CRAT, WHICH IS THE OFFSET FOR THE CRATE SELECT. SELER=0 ;.LE;SELER, WHICH IS A CONDITIONAL TO ALLOW (IF DEFINED) ;SELECT ERRORS TO BE SENT TO THE CONSUL ;.ELS ;- ; ; CHECK FOR GETWORD AND PUTWORD ; .IIF NDF G$$WRD, .ERROR; GETWORD MUST BE SELECTED .IIF NDF P$$WRD, .ERROR; PUTWORD MUST BE DEFINED ; CNTBL: .BLKW C$$M11 ;THIS IS USED TO STORE UCB ADDRESS FOR INTERUPT ROUTINE .IF GT C$$M11-1 TEMP: .BLKW 1 .ENDC ; ;DRIVER DISPATCH TABLE ; $CMTBL:: .WORD CMINI .WORD CMCAN .WORD CMOUT .WORD CMPWF ; ;+ ; THE POWER FAIL ROUTINE CMPWF IS ENTERED AT SYSTEM STARTUP AND AFTER ;RECOVERING FROM A POWER OUTAGE. ;ON ENTRY R3-R5 CONTAINE INFORMATION. ; ; R3=CONTROLER INDEX ; R4=SCB ADDRESS ; R5=UCB ADDRESS ; ;- ;&THE ROUTINE WILL CMPWF: MOV S.CSR(R4),R3 ;GET THE ADDRESS OF THE BD-011 CLR (R3)+ ;&CLEAR CLR (R3)+ ;&ALL OF CLR (R3)+ ;&THE CLR (R3)+ ;®ISTERS AND CLR (R3)+ ;&CLEAR THE CLR @S.CSR(R4) ;&CONTROL REGISTER AGAIN TO CLEAN UP ANY JUNK MOV #1,@S.CSR(R4) ;&AND THEN CAUSE A BRANCH INITALIZE. ;+ ; THE ONLY TIME THAT A BZ CAN BE DONE IS DUE TO THIS ROUTINE! ;IF A CRATE MUST BE INITALIZED THE CRATE CONTROLLER FUNCTION MUST BE USED. ;- 1$: TST @S.CSR(R4) ;WAIT FOR THE BZ TO FINISH BPL 1$ RETURN ;AND RETURN ; ;+ ; CMCAN IS THE ROUTINE THAT IS CALLED WHEN AN IO.KIL FUNCTION ;IS EXECUTED OR WHEN THE TASK IS ABORTED. ;ON ENTRY THE REGISTERS CONTAIN: ; ; R0=ADDRESS OF CURRENT I/O PACKET ; R1=ADDRESS OF TCB OF CURRENT TASK ; R3=CONTROLLER INDEX ; R4=ADDRESS OF SCB ; R5=ADDRESS OF UCB ;.SKIP 1 ;CMCAN NORMALLY JUST RETURNS WITHOUT ALTERING ANY THING. ;- ; CMCAN: RETURN ; ;+ ; CMOUT IS ENTERED WHEN A TIMEOUT OCCURES. DUE TO THE INTERNAL TIMEOUTS ;OF THE BD-011, THERE IS LITTLE NEED FOR THIS ROUTINE. HOWEVER DURING ;DEBUGGING OF THE ROUTINE IT HAS COME IN USEFULL AT TIMES. ;THIS IS BECAUSE IF A GROSS ERROR IS MADE IN THE I/O PACKET AND ;THE WRONG RSX FUNCTION IS GIVEN TO THE CAMAC FUNCTION, ;THIS FEATURE WILL TIME YOU OUT EVENTUALLY ;AND LET THE TASK BE ABORTED. ; THE REGISTERS ON ENTRY ARE: ; ; R0=STATUS CODE ; R3=CONTROLER INDEX ; R4=SCB ADDRESS ; R5=UCB ADDRESS ; ;OPERATION IS AS FOLLOWS: ;.LS CMOUT: CLRB PS ;.LE;LOWER PROCESSOR PRIORITY TO 0 MOV #T.NDNR,R0 ;.LE;CAUSE THE DEVICE NOT READY ;MESSAGE TO BE PRINTED BR DDD ;.ELS ; DD IS JUMPED TO IF THERE IS A TIME OUT OR ABORT ;ERROR. IF THE CM.NMS IS CLEAR IN THE SECOND CONTROLL WORD, DD ; CAUSES A DEVICE SELECT ERROR MESSAGE TO BE PRINTED OUT ON ;THE CONSULE. BOTH CMOUT AND DD ENTRYS CAUSE A IE.VER (IRRECOVERABLE ;ERROR) STATUS BIT TO BE PUT IN THE I/O STATUS BLOCK. ; DD: BIC #400,@S.CSR(R4) ;THE DD ENTRY ALSO ALWAYS RESETS THE ABORT BIT .IF DF SELER BIT #CM.NMS,U.CW2(R5) ;CHECK FOR NO MESSAGE BNE DDDD ;IF NE NO MESSAGE MOV #T.NDSE,R0 ; DDD: CALL $DVMSG ; DDDD: .IFF DDD: .ENDC MOV #IE.VER&377,R0 ; JMP DON ; ; CMINI IS ENTERED FROM THE QIO DIRECTIVE WHEN AN I/O REQUEST IS QUEUED ;AND AT THE END OF A PREVOUS I/O OPERATION TO PROPAGATE THE ;EXECUTION OF THE DRIVER. IF THE CONTROLLER IS NOT BUSY, AN ATTEMPT ;IS MADE TO DEQUEUE THE NEXT I/O REQUEST. IF THE CONTROLLER IS ;BUSY, A RETURN TO THE CALLER IS MADE. IF THE DEQUEUE ATTEMPT WAS ;SUCCESSFULL, THEN THE I/O OPERATION IS INITIATED AND A RETURN IS DONE. ;ON ENTRY, R5= ADDRESS OF THE UCB OF THE PROPER CONTROLLER. ; THE DEVICE DEPENDANT PARAMITERS FOR THE CAMAC FUNCTIONS ;ARE: ;.SKIP 1 ;.LITERAL ; FUNCTION/SUBFUNCTION PARAMITERS ; ; PDW(1/0) ; NDT(1/2) <0, 0, 0, CRATE SELECT, FNA> ; PDR(2/0) ; BDRR(2/1) ; DMA(6/0) ;.END LITERAL ;.SKIP 1 ;- ; CMINI: CALL $GTPKT ;ATTEMPT TO DEQUEUE A PACKET BCC 1$ ;IF CARRY CLEAR DEQUEUED OK RETURN ;ELSE RETURN ;+ ;ON SUCCESSFULL RETURN FROM $GTPKT, THE REGISTERS ARE: ; ; R1=ADDRESS OF I/O PACKET ; R2=PHYSICAL UNIT NUMBER ; R3=CONTROLLER INDEX ; R4=ADDRESS OF SCB ; R5=ADDRESS OF UCB ;- ;& THE FUNCTION DISPATCHING IS THEN DONE BY ; 1$: MOV R5,CNTBL(R3) ;&SAVING THE UCB ADDRESS FOR THE INTERUPT ;&ROUTINES CLR U.CW2(R5) ;&AND CLEARING THE DEVICE PARAMITER WORD MOVB I.FCN(R1),R3 ;SAVE NO MESSAGE STATUS BIC #177577,R3 BIS R3,U.CW2(R5) ;AND SET THE BITS MOVB I.FCN+1(R1),R3 ;&NEXT, THE FUNCTION IS PUT IN R3 ASL R3 CLC ;&AND THE CARRY BIT CLEARED TO ASSUME A ;&NON DMA TRANSFER. JMP @DISPAT(R3) DISPAT: .WORD RET ;&IF THE FUNCTION IS 0 THEN AN IMMEDIATE ;&RETURN IS DONE. PLEASE NOTE THE DISPATCH TO RET ;&IS NEVER DONE AS THE FUNCTION SHOULD BE ;&HANDLED BY THE QIO ROUTINES. .WORD WRI ;&IF THE FUNCTION IS 1 THEN A WRITE OF SOME TYPE ;&IS ASSUMED. .WORD RED ;&IF THE FUNCTION IS 2, A READ .WORD RET ;&IF 3, 4, OR 5 THE .WORD RET ;&FUNCTION IS IMMEDIATLY .WORD RET ;&RETURNED. .WORD DMAA ;&IF THE FUNCTION IS 6 THEN A DMA ;&IS ASSUMED. ; ;& WRI IS WHERE YOU GO IF THE FUNCTION IS ONE. ; WRI: MOVB I.FCN(R1),R3 ;&THE SUBFUNCTON IS PUT IN R3, BIC #177400!CM.NMS,R3 ;CLEAR OFF MESSAGE BIT CMP R3,#3 ;&AND IT IS CHECKED FOR BLO 1$ ;&LEGALITY. BR DON2 ;&IF NOT LEGAL, DON2 WILL INDICAT IT. 1$: ASL R3 ;&IF LEGAL, A WORD INDEX IS GENERATED JMP @DPT1(R3) ;&AND THE PROPER FUNCTION IS DISPATCHED. DPT1: .WORD 2$,LAMR,3$ ; 2$: ;& FOR A PROGRAMED DATA WRITE THE JSR PC,SETUP ;&BD-011 REGISTERS ARE SETUP AND THEN MOV I.PRM(R1),DATA(R2) ;&THE LOW 16 BITS ARE WRITTEN INTO THE ;&DATA REGISTER. NEXT, THE FNA WORD IN THE BIT #MD24,I.PRM+10(R1) ;&QIO PACKET IS CHECKED FOR 24 BIT MODE BEQ A ;&AND IF SO WILL WRITE THE UPPER 8 BITS. MOV I.PRM+2(R1),DATA(R2) ;&IN EITHER CASE, BR A ;&A BRANCH TO A IS DONE. ; ;& FOR A NON DATA TRANSFER ; 3$: JSR PC,SETUP ;&THE REGISTERS ARE SETUP BR A ;&AND A BRANCH TO A IS DONE. ; ;& FOR A READ FUNCTION ; RED: MOVB I.FCN(R1),R3 ;&THE SUBFUNCTION IS CHECKED BIC #177400!CM.NMS,R3 ;CLEAR OFF MESSAGE BIT CMP R3,#2 ;&FOR LEGALITY AND IF NOT BLO TICTAC ;&OK IE.ONP IS SENT TO THE $IODON DON2: MOV #IE.ONP&377,R0 ;&ROUTINE. OTHERWISE, THE SUBFUNCTION JMP DON TICTAC: ASL R3 ;&IS MADE INTO A WORD INDEX JMP @DPT2(R3) ;&AND DISPATCHED. DPT2: .WORD 5$,6$ ; ; 5$: JSR PC,SETUP ;& FOR A PROGRAMMED DATA TRANSFER READ THE 1$: TST (R2) ;&OPERATION IS STARTED BY A CALL TO SETUP ;&AND THEN WAIT FOR THE TASK COMPLETION BPL 1$ ;&READY BIT TO COME UP. MOV DATA(R2),-(SP) ;&THEN THE LOW 16 BITS ARE PUSHED ON CALL $PTWRD ;&THE STACK AND PLACED IN THE BUFFER BY A CALL ;&TO $PTWRD. BIT #MD24,I.PRM+10(R1) ;&THE FNA WORD IS THEN CHECKED FOR BNE 2$ ;&24 BIT MODE AND IF NOT SET WILL CLR -(SP) ;&CLEAR THE NEXT LOCATION IN THE USERS BUFFER. BR 3$ ;&OTHERWISE, THE UPPER 8 BITS ARE 2$: MOV DATA(R2),-(SP) ;&PLACED THERE. 3$: CALL $PTWRD ; BR A ;&THEN BRANCH TO A OF COURSE. ; 6$: MOV R4,-(SP) ;& TO READ THE BRANCH DRIVER REGISTERS, MOV S.CSR(R4),R4 ;&GET THE ADDRESS OF THE CONTROLLER MOV (R4),-(SP) ;&AND READ EACH REGISTER INTO THE USERS BUFFER CALL $PTWRD ;&WITH THE EXCEPTION OF THE DATA BUFFER ADD #4,R4 ;&WHOSE POSITION IN THE DATA BUFFER WILL CLR -(SP) ;&BE ZEROED. CALL $PTWRD MOV (R4)+,-(SP) ; CALL $PTWRD MOV (R4)+,-(SP) ; CALL $PTWRD MOV (R4)+,-(SP) CALL $PTWRD MOV (R4),-(SP) CALL $PTWRD MOV (SP)+,R4 ; MOV #IS.SUC&377,R0 ;&AS NO CAMAC OPERATON WAS DONE A RETURN BR DON ;&TO DON IS SUFFICENT TO FINISH THIS ;&OPERATION. ; ; DMAA: ; ;& THE DMA FUNCTION IS SPECIFIED BY CALLING SETUP WITH THE CARRY BIT ;&SET. THIS WILL CAUSE THE PROCESSOR PRIORITY TO BE RAISED TO LEVEL ;&PL FOR A SHORT TIME. ; MOVB I.FCN(R1),R3 ;GET THE SUBFUNCTION BIC #177400!CM.NMS,R3 ;CLEAR OFF MESSAGE BIT BNE DON2 ;AND IF NOT LEGAL SHOW IT SEC ;HERE SET THE CARRY MOVB S.ITM(R4),S.CTM(R4) ;&THE TIMEOUT IS ALSO SET FOR THIS FUNCTION ;&EVEN IF IT PROBABLY WON'T BE USED. JSR PC,SETUP ;NOW CALL SETUP TO FIX THE REGISTERS ; ; ;& CODE STARTING AT A IS EXECUTED AFTER EVERY FUNCTION/SUBFUNCTION EXCEPT ;&THE LAM RECOGNITION FUNCTION. ; A: TST @S.CSR(R4) ;&FIRST THE STATUS/CONTROL REGISTER IS CHECKED ;&AND IF BUSY A BRANCH TO B IS DONE. BPL B ;&OTHERWISE, BIT #DMA,U.CW2(R5) ;&THE DMA MODE BIT IS CHECKED AND BEQ DON3 ;&IF OFF BRANCH TO DON3 TO FINISH THE OPERATION. ; ;&IF SET, YOU ARE AT PROCESSOR PRIORITY PL AND HAVE BEEN ;&SINCE THE CALL TO SETUP IN DMAA. ; MOV @S.CSR(R4),U.CW3(R5) ;SAVE STATUS WORD BIC #44,@S.CSR(R4) ;&NEXT, THE COMPLETION SEQUENCER AND ;&INTERUPT ENABLE ARE CLEARED AS THEY WILL ;&BE SET AND AN INTERUPT IS NOT NESSASARY. ; BIC #PR7,PS ;&NOW THE PRIORITY IS SET BACK TO ZERO BIC #DMA,U.CW2(R5) ;&AND THE DMA MODE BIT CLEARED. CLRB S.CTM(R4) ;&ALSO, THE TIMEOUT IS CLEARED AS THE OPERATION ;&IS COMPLETE BIT #LAMEN,U.CW2(R5) ;& THE LAM ENABLE MODE BIT IS CHECKED BEQ DON1 ;&AND IF NOT SET BRANCH TO DON1. MOV #10,@S.CSR(R4) ;&OTERWISE, THE LAM INTERUPT IS ENABLED. ; ; AT DON3 THE STATUS REGISTER IS PLACED IN U.CW3 FOR DMA OPERATIONS ; INVOLVING INTERUPTS THIS HAS ALREADY BEEN DONE ; IF A DMA W/O INTERUPT IT IS DONE IN A ; DON3: MOV @S.CSR(R4),U.CW3(R5) ;SAVE STATUS ; ;& AT DON1, THE ; DON1: BIT #10400,U.CW3(R5) ;&CONTROL/STATUS REGISTER IS CHECKED FOR ; BEQ 1$ JMP DD ;&ABORT AND TIMEOUT AND IF SO JUMP TO DD. 1$: MOV #IS.SUC&377,R0 ;&OTHERWISE, SUCCESSFULL COMPLETION IS ;&ASSUMED, ALSO THE CAMAC CONTROL ;&STATUS WORD IS PUT INTO THE DON: MOV @S.CSR(R4),R1 ;&SECOND WORD OF THE IOSB AND A CALL TO ;&$IODON IS EXECUTED ; CALL $IODON JMP CMINI ;&AND THEN ATTEMPT TO DEQUEUE ANOTHER IO PACKET. ; ; IF THE OPERATION IS NOT COMPLETE WHEN CHECKED IN A:, THEN ; THIS CODE IS EXECUTED TO LOWER THE PROCESSOR PRIORITY AND ALLOW ; THE COMPLETION INTERUPT TO OCCURE. ; B: BIC #PR7,PS ; RET: RETURN ;; ;& $CMIN1 IS THE TASK COMPLETION INTERUPT ENTRY POINT. ;&IT IS ENTERED WHEN AN OPERATION WAS NOT DONE WHEN THE PROGRAM JUMPED TO ;&A. ; $CMINT:: INTSV$ CM,PL,C$$M11 ;& FIRST CALL INTSV$ TO DO THE INTERUPT STUFF ;&AND PUT THE UCB ADDRESS INTO R5 MOV U.SCB(R5),R4 ;&AND THE SCB ADDRESS IN R4. CLRB S.CTM(R4) ;&CLEAR THE TIMEOUT MOV S.CSR(R4),R4 ;&AND REPLACE R4 WITH THE ADDRESS OF THE BD-011 MOV (R4),U.CW3(R5) ;SAVE STATUS WORD BIC #4,(R4) ;&AND CLEAR THE TASK COMPLETION ENABLE BIC #DMA,U.CW2(R5) ;&BIT AND THE DMA MODE BIT. CALL $FORK ;&NOW A $FORK IS DONE TO PRODUCE A SYSTEM ;&PROCESS. BIT #LAMEN,U.CW2(R5) ;& ONCE THE SYSTEM GETS AROUND TO IT THE BEQ 2$ ;&ENABLE LAM BIT IS CHECKED AND IF SET BIS #10,(R4) ;&WILL ENABLE LAM INTERUPTS. AT THIS POINT ;&AN INTERUPT MAY OCCURE BUT SINCE IT ;&IS AFTER THE FORK I DONT NEED TO HAVE TWO ;&SCB'S. 2$: MOV U.SCB(R5),R4 ;&NOW GET THE UCB ADDRESS AND PUT IT ;&INTO R4 AGAIN AND JUMP JMP DON1 ;&TO DON1. ; ; ; ; ;I/O PACKETS FOR LAM RECOGNITION REQUESTS ; ; 13=LOW MASK BITS ; 14=HIGH MASK BITS ; 15=CRATE CODE FOR OPERATION ON LAM ; 16=FNA FOR OPERATION ON LAM ; ; ;THIS FUNCTION SETS UP A LIST OF PERMISSABLE LAMS TO BE ;RECOGNIZED BY THE SYSTEM THE CRATE CODE AND FNA SHOULD BE SETUP ;WITH THE PROPER FUNCTION TO CLEAR THE LAM WHEN IT OCCURES ;THE MASK BITS ARE ANDED WITH THE GRADED L WORDS TO DECIDE ;IF THE SYSTEM RECOGNIZES THE LAM. MULTIPLE TASKS CAN BE INFORMED ;FROM A SINGLE LAM ; ;; LAMR: .IF DF,LAMSV .IFF JMP DON1 .ENDC ; ;; ;CMIN2 IS THE ROUTINE ENTERED WHEN A BRANCH LAM INTERRUPT ;IS SEEN. THE PROGRAM DOES A GRADED LAM ON THE REQUESTING BD-011 ;SCANS THE MASK WORDS LOADED INTO MEMORY BY LAMR FOR A MATCH. ;IF NO MATCH IS FOUND AN ERROR INDICATION IS SENT ;IF A MATCH IS FOUND THE CRATE AND FNA CODES ARE EXECUTED ;OF THE MATCHED LAM PSEUDO I/O PACKET ;THIS IS ONLY DONE ONCE REGARDLESS OF THE NUMBER OF TASKS ;REQUESTING NOTIFICATION OF LAM. ; ; ; ;PSUDO I/O PACKETS ARE SENT TO $IOFIN THEY WILL NOT BE DEALLOCATED ;FROM DYNAMIC MEMORY AS THE BLOCK SIZE PARAMETER IS SET TO ZERO ;THIS ALLOWS ME TO USE THE SAME BLOCKS OVER AND OVER AGAIN TO RESPOND ;TO THE LAMS ; ;; ; ;; $CMIN2: .IF DF,LAMSV .IFF RTI .ENDC ; ; ;& SETUP IS THE ROUTINE THAT LOADS THE BRANCH DRIVER'S REGISTERS WITH ;&THE PROPER STUFF TO START AN OPERATION. ;&IF THE CARY IS CLEAR, A NON DMA OPERATION IS ASSUMED, OTHER ;&WISE A DMA TRANSFER IS SPECIFIED. ; ; ;; SETUP: MOV R2,-(SP) ;& FIRST SAVE THE UNIT NUMBER AND MOV S.CSR(R4),R2 ;&PUT THE ADDRESS OF THE CONTROL ;&STATUS REGISTER INTO R2. BCC 2$ ;&NEXT CHECK TO SEE IF THE CARRY IS SET BIT #1,(SP) ;&AND IF SO CHECK TO SEE THAT THE UNIT IS BEQ 4$ ;&CM1: IF NOT INDICATE AN ERROR MOV U.BUF+2(R5),R3 ;&OTHERWISE, GET THE ADDRESS OF THE BIC #10,(R2) ;&BUFFER AND CLEAR THE LAM INTERUPT ENABLE BIS #DMA,U.CW2(R5) ;&ALSO SET THE DMA MODE BIT MOV R3,MADR(R2) ;&START LOADING THE BDS REGISTERS STARTING ;&WITH THE ADDRESS REGISTER. MOV U.CNT(R5),R3 ;&NOW GET THE ASR R3 ;&BYTE COUNT AND PLACE IN R3 AND SET TO BIT #MD24,I.PRM+10(R1) ;&WORD COUNT. THE FNA WORD MUST BE CHECKED ;&FOR 24 BIT TRANSFER AND IF SET DEVIDE THE ;&WORD COUNT BY TWO ONCE AGINE. BEQ 5$ ASR R3 ; 5$: NEG R3 ;&NOW THE WORD COUNT IS NEGATED BIC #^C7777,R3 ;&EXTRANOUS BITS MASKED OFF .IF DF,JORW MOV I.PRM+12(R1),(SP) ;GET THE BM WORD AND PLACE IN (SP) BIC #^C140000,(SP) ;CLEAR OFF ANY JUNK MOV I.PRM+6(R1),CRAT(R2) ;LOAD THE CRATE SELECT WORD BIS R3,(SP) MOV U.BUF(R5),R3 BIC #^C60,R3 SWAB R3 BIS (SP)+,R3 .IFF BIC #^C777,R3 ;CLEAR OFF EXTRA BITS FOR BD011 MOV I.PRM+6(R1),(SP) ;SAVE CRATE SELECT BIC #^C177000,(SP) ;CLEAR POSSABLE WORDCOUNT BIS (SP)+,R3 ;OR ON THE CRATE SELECT TO THE WORD COUNT MOV R3,CRAT(R2) ;AND WRITE THE CRATESELECT WORD COUNT OUT .ENDC MOV R3,XTEND(R2) ;&AND LOADED INTO THE EXTENDED WORD COUNT BIS #PL,PS ;®ISTER. NOW THE PROCESSOR PRIORITY ;&IS RAISED SO THAT IF THE DMA OPERATION ;&FINISHES BEFORE I EXIT THIS ROUTINE ;&I CAN DISABLE THE PENDING INTERUPT ;&AND THEREBY REMOVE THE NEED TO GO ;&THROUGH THE INTERUPT SERVICE CODE. ;&THE TRADE OFF IS THAT I MUST RUN AT THE LEVEL ;&OF THE BD TILL THIS IS DONE BUT IT ONLY TACKS A ;&SHORT TIME. ; ; BIS #4,@S.CSR(R4) ;&AT THIS TIME THE COMPLETION INTERUPT MOV I.PRM+10(R1),FNA(R2) ;&IS ENABLED AND THE FNA WORD LOADED ;&WHICH CAUSES THE OPERATION TO START RTS PC ;&WHICH CAUSES THE OPERATION TO START ; ;& FOR A NON DMA TRANSFER, THE UNIT ; 2$: BIT #1,(SP)+ ;&IS CHECKED TO BE CM0: BEQ 3$ ;&AND IF NOT, 4$: MOV #IE.BAD&377,R0 ;&AN ERROR FUNCTON IS SENT OUT ADD #2,SP ;HERE CLEAR OUT THE STACK JMP DON ;AND JUMP TO DONE 3$: MOV I.PRM+6(R1),CRAT(R2) ;&OTHERWISE, LOAD THE CRATE SELECT MOV I.PRM+10(R1),FNA(R2) ;&AND THE FNA WORD RTS PC ;&AND RETURN. .END