.TITLE C1SET .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.BAD = 4 IN.BSZ = 6 IN.OLN = 10 IN.OOP = 12 ; ; CALL C1SET(INLUN,CLIST,BUFF,BUFFSIZE,OUTLUN,OPTION) ; ; C1SET:: MOV #^RET ,-(SP) ; SET UP FOR TRACEBACK MOV #^RC1S,R4 JSR R4,NAM$ ; TRACEBACK SET UP ROUTINE MOV #6.,R0 ; NUMBER OF PARAM JSR PC,R5CHEK ; CHECK THEM MOV IN.CLS(R5),R0 ; R0 = CLIST CMP (R0),#104777 ; IS FIRST WORD OF CLIST CORRECT? BNE 5$ ; NO, EXIT WITH ERROR STATUS TST 2(R0) ; IS SECOND WORD CORRECT? BNE 5$ ; NO, EXIT WITH ERROR STATUS TST CL.BEG(R0) ; IS START OF CLIST OK? BGE 5$ ; NO, IT IS POSITIVE CMP CL.SIZ(R0),#4096. ; IS SIZE TOO BIG? BHI 5$ ; YES CMP CL.SIZ(R0),#4 ; TOO SMALL? BLT 5$ ; YES CMP @IN.BSZ(R5),CL.BSZ(R0) ; BUFFER SIZE > MINIMUM? BLT 5$ ; NO QIOW$S #IO.ATT,@IN.ILN(R5),#1,,#ISB,, ; ATTACH THE INPUT UNIT BCS 5$ ; Attach rejected CMPB ISB,#IS.SUC ; SUCCESS? BNE 5$ ; NO MOV @IN.BSZ(R5),R3 ; R3 = BUFFER SIZE CMP R3,#14. ; BUFF SIZE TOO SMALL? BLT 5$ ; YES CMP R3,#4096. ; SIZE TOO BIG? BHI 5$ ; YES BIT #1,R3 ; ODD NUMBER OF BYTES? BNE 5$ ; YES MOV #BS.SIZ+BH.SIZ,R3 ; #Bytes needed for input headers MOV C2.BOQ,R2 ; NOW SEARCH FOR OUTPUT HEADER 1$: 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 1$ ; NOT AT END SO CONTINUE QIOW$S #IO.ATT,@IN.OLN(R5),#1,,#ISB,,<> ; ATTACH OUTPUT UNIT BCS 5$ ; Not successful CMPB ISB,#IS.SUC ; Was attach successful ? BNE 5$ ; No ADD #BO.SIZ,R3 ; Also reserve output header 4$: JSR PC,BREQW ; Request space for headers BCC 6$ ; Space is available 5$: JMP BPARM ; No, issue error message 6$: 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 ; Skip over input header TST R2 ; OUTPUT HEADER REQUIRED? BNE 7$ ; 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 # 7$: MOV R2,BH.BOQ(R3) ; OUTPUT STAT BUFF. INTO HEADER TST @IN.OOP(R5) ; OUTPUT DESIRED? BEQ 10$ ; NO INCB BO.OOP(R2) ; YES 10$: SUB #BS.QUE,R4 ; NOW POINTS TO STATUS MOV #"C1,BH.TYP(R3) ; HEADER TYPE MOVB #1,BH.BCT(R3) ; Number of buffers in header 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 MOV @IN.BSZ(R5),R1 ; BUFFER SIZE TO WORK WITH MOV R4,BH.BSQ(R3) ; PUT FIRST STATUS INTO STAT QUE MOV IN.BAD(R5),R0 ; Data buffer address 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(R3),BF.TYP(R0) ; SET UP DATA TYPE RTS PC ; ALL DONE! ISB: .WORD 0,0 ; 2 WORD STATUS BLOCK .END