.TITLE C2SET .IDENT /RICE01/ .ENABL LC .MCALL QIO$S,QIOW$S,QIO$,DIR$,ASTX$S,DSAR$S,ENAR$S .MCALL EXIT$S .LIST MEB IN.ILN = 0 IN.CLS = 2 IN.BCT = 4 IN.BSZ = 6 IN.OLN = 10 IN.OOP = 12 IN.ALN = 14 IN.AOP = 16 IN.ERR = 20 ; ; CALL CSET(INLUN,CLIST,BUFFCOUNT,BUFFSIZE,OUTLUN,OPTION, ; ALUN, ANALOPT,LERR) ; ; LERR = 1 SUCCESS IS.SUC ; = 2 BUFFER SIZE TOO BIG (MAX 2048.) ; = 3 INADEQUATE SPACE FOR BUFFERS ; = 4 BUFFER TOO SMALL ; = 5 BUFFER SIZE HAS ODD #BYTES ; = 177600 BAD CLIST ; = "400 + DSW ATTACH DIRECTIVE REJECTED ; > 128 ATTACHEMENT OF INPUT REJECTED ; = "1000 + STS ATTACHMENT FOR OUTPUT REJECTED ; = "1400 + DSW OUPUT ATTACH DIRECTIVE REJECTED ; C2SET:: MOV #^RET ,-(SP) ; SET UP FOR TRACEBACK MOV #^RC2S,R4 JSR R4,NAM$ ; TRACEBACK SET UP ROUTINE MOV #9.,R0 ; NUMBER OF PARAM JSR PC,R5CHEK ; CHECK THEM MOV #177600,@IN.ERR(R5) ; SET ERROR 4 MOV IN.CLS(R5),R0 ; R0 = CLIST CMP (R0),#104777 ; IS FIRST WORD OF CLIST CORRECT? BNE 11$ ; NO, EXIT WITH ERROR STATUS TST 2(R0) ; IS SECOND WORD CORRECT? BNE 11$ ; NO, EXIT WITH ERROR STATUS TST CL.BEG(R0) ; IS START OF CLIST OK? BGE 11$ ; NO, IT IS POSITIVE CMP CL.SIZ(R0),#4096. ; IS SIZE TOO BIG? BHI 11$ ; YES CMP CL.SIZ(R0),#10 ; TOO SMALL? BLT 11$ ; YES MOV #IE.DAO,@IN.ERR(R5) ; *** BUFFER TOO SMALL CMP @IN.BSZ(R5),CL.BSZ(R0) ; BUFFER SIZE > MINIMUM? BLT 11$ ; NO QIOW$S #IO.ATT,@IN.ILN(R5),#1,,#ISB,,,ERRDSW ; ATTACH THE INPUT UNIT MOV ISB,@IN.ERR(R5) ; STATUS TO USER CMPB ISB,#IS.SUC ; SUCCESS? BNE 11$ ; NO MOV @IN.BSZ(R5),R3 ; R3 = BUFFER SIZE MOV #4,@IN.ERR(R5) ; ERROR 4 CMP R3,#14. ; BUFF SIZE TOO SMALL? BLT 11$ ; YES MOV #2,@IN.ERR(R5) ; ERROR 2 CMP R3,#2048. ; SIZE TOO BIG? BHI 11$ ; YES MOV #5,@IN.ERR(R5) ; ERROR 5 BIT #1,R3 ; ODD NUMBER OF BYTES? BNE 11$ ; YES ADD #BS.SIZ,R3 ; ADD ON STATUS HEADER SIZE MUL @IN.BCT(R5),R3 ; MULTIPLY BY NUMBER OF BUFFS BMI 11$ ; TOO MANY BUFFERS BCS 11$ ; TOO MANY BUFFERS ADD #BH.SIZ,R3 ; ADD ON THE HEADER SIZE BCS 11$ ; ALSO TOO LARGE MOV C2.BOQ,R2 ; NOW SEARCH FOR OUTPUT HEADER 3$: CMPB BO.OLN(R2),@IN.OLN(R5) ; IS OUTPUT LUN IN USE BEQ 4$ ; YES, DO NOT RESERVE SPACE MOV (R2),R2 ; GET NEXT OUTPUT HEADER BNE 3$ ; NOT AT END SO CONTINUE QIOW$S #IO.ATT,@IN.OLN(R5),#1,,#ISB,,<>,ERRDSW ; ATTACH THE OUTPUT UNIT CMPB ISB,#IS.SUC ; WAS IT OK! BEQ 13$ ; YES ADD #1000,ISB ; SET UP FOR OUTPUT ERR CODE MOV ISB,@IN.ERR(R5) ; NO, BAD RETURN 13$: ADD #BO.SIZ,R3 ; RESERVE SPACE FOR NEW OUTPUT HEADER BCC 4$ ; OK, NO ERROR 11$: RETURN 4$: CLC MOV #3,@IN.ERR(R5) ; NOT ENOUGH SPACE ERROR JSR PC,BREQW ; R3 = HEADERS IF NO ERROR BCS 11$ ; NO MOV #1,@IN.ERR(R5) ; CLEAR ERROR PARAMETER MOV C2.BHQ,BH.QUE(R3) ; PUT THE CURRENT HEADER MOV R3,C2.BHQ ; AT THE BEGIN OF THE HEADER QUE MOV R3,R4 ADD #BH.SIZ,R4 ; R4 = EITHER OUTPUT OR INPUT STAT BUFFER TST R2 ; OUTPUT HEADER REQUIRED? BNE 6$ ; NO MOV R4,R2 ; WILL BE OUT HEADER ADD #BO.SIZ,R4 ; R4 = FIRST INPUT STAT. BUFF. MOV C2.BOQ,(R2) ; PUT THE NEW OUPUT STATUS BUFF. MOV R2,C2.BOQ ; AT THE HEAD OF THE OUPUT STAT. QUE MOV @IN.OLN(R5),BO.OLN(R2) ; INSERT UNIT # 6$: MOV R2,BH.BOQ(R3) ; OUTPUT STAT BUFF. INTO HEADER TST @IN.OOP(R5) ; OUTPUT DESIRED? BEQ 7$ ; NO INCB BO.OOP(R2) ; YES 7$: SUB #BS.QUE,R4 ; NOW POINTS TO STATUS MOV #"C2,BH.TYP(R3) ; HEADER TYPE MOVB @IN.BCT(R5),R2 ; R2 = BUFFER COUNT MOVB R2,BH.BCT(R3) ; SAVE COUNT IN HEADER MOVB R2,BH.IMN(R3) ; MINIMUM NUMBER OF BUFFS IN INPUT ASRB BH.IMN(R3) ; IS INITIALLY HALF TOT BUFFER COUNT. MOV R3,R1 ; WILL POINT TO QIO ADD #BH.QIO,R1 ; NOW R1 POINTS TO INPUT QIO$ MOV #006001,(R1) ; INSERT DIC INTO QIO$ MOV #IO.RBC!200,Q.IOFN(R1) ; INPUT FUNCTION MOVB @IN.ILN(R5),Q.IOLU(R1) ; INPUT LUN MOV #C2I,Q.IOAE(R1) ; INSERT AST ADDRESS MOV @IN.BSZ(R5),Q.IOPL+2(R1) ; BUFFER SIZE SUB #BF.DAT,Q.IOPL+2(R1) ; NOW IS SIZE LESS HEADER MOV IN.CLS(R5),R0 ; POINTS TO CLIST MOV CL.SIZ(R0),Q.IOPL+6(R1) ; COMMAND LIST SIZE MOV CL.MSK(R0),Q.IOPL+12(R1) ; COMMAND LIST CRATE MASK ADD #CL.BEG,R0 ; POINTS TO START OF CLIST MOV R0,Q.IOPL+4(R1) ; COMMAND LIST MOV #-1,Q.IOPL+10(R1) ; TIMEOUT COUNT MOVB @IN.OOP(R5),BH.OOP(R3) ; OUTPUT OPTION MOVB @IN.AOP(R5),BH.AOP(R3) ; ANALYSIS OPTION MOV @IN.BSZ(R5),R1 ; BUFFER SIZE TO WORK WITH ADD #BS.SIZ,R1 ; STATUS HEADER + BUFFER TOTAL SIZE MOV R3,R5 ; R5 = BUFFER HEADER ADD #BH.BSQ,R3 ; R3 = STATUS QUE 12$: MOV R4,(R3) ; PUT FIRST STATUS INTO STAT QUE MOV R4,R3 ADD #BS.QUE,R3 ; R3 = POINTER TO NEXT STATUS BUFF. MOV R4,R0 ; WILL BE DATA BUFF ADD #BS.SIZ+BS.QUE,R0 ; R0 = DATA BUFF POINTER MOV C2.BHQ,BS.BHQ(R4) ; SAVE REVERSE POINTER DECB (R4) ; SET NOT IN I/O QUE DECB BS.ANL(R4) ; SET NOT IN ANAL QUE MOV R0,BS.ADD(R4) ; SAVE BUFFER ADDRESS MOVB BH.QIO+Q.IOLU(R5),BF.TYP(R0) ; SET UP DATA TYPE ADD R1,R4 ; POINTS TO NEXT STS BUFF SOB R2,12$ ; CONTINUE TILL ALL SET UP RTS PC ; ALL DONE! ISB: .WORD 0,0 ; 2 WORD STATUS BLOCK ERRDSW: MOV #400,ISB ; SET UP DIRECTIVE REJECTED CODE MOVB $DSW,ISB ; SET UP ERROR CODE RETURN .END