; CL1IN - CLONE TERMINAL INPUT SLAVE TASK CL1... ; LAST EDIT: 3-NOV-81 ; .NLIST .LIST TTM .NLIST BEX .TITLE CL1IN .LIST ; ; ;+ ; THIS TASK PERFORMS ALL TERMINAL INPUT FOR CLONE, THUS CLONE ITSELF ; IS FREE TO CHECKPOINT, DETACH REGIONS ETC. ; ; INSTALLED AS CL1... THIS TASK RECEIVES MESSAGES FROM CLONE HAVING ; THE FOLLOWING FORMAT: ; .BLKW 2 ;SENDER TASK NAME (CLONE) ; .BLKW 1 ;FUNCTION CODE (NOT USED) ; .BLKW 1 ;ADDRESS OF ISSUING CLONE PROCESS ; .BLKW 1 ;NUMBER OF MESSAGE PACKETS TO FOLLOW ; .BLKW 1 ;DEVICE NAME ; .BLKW 1 ;DEVICE UNIT ; .BLKW 8. ;START OF PROMPT MESSAGE AREA. ; ; WHEN THE PROMPT MESSAGE OCCUPIES MORE THAN 8 WORDS THE FOLLOWING ; PACKETS HAVE THE FORMAT: ; .BLKW 2 ;SENDER TASK NAME (CLONE) ; .BLKW 13. ;CONTINUATION OF PROMPT MESSAGE AREA. ; ; WHEN THE REQUEST COMPLETES, A REPLY IS RETURNED TO THE SENDER IN THE ; FOLLOWING FORMAT: ; .BLKW 2 ;SENDER TASK NAME (CL1...) ; .BLKW 1 ;REPLY TYPE (NOT USED) ; .BLKW 1 ;ADDRESS OF ISSUING CLONE PROCESS ; .BLKW 1 ;NUMBER OF MESSAGE PACKETS TO FOLLOW ; .BLKW 2 ;COPY OF QIO STATUS BLOCK FOR REQUEST ; .BLKW 8. ;START OF DATA BUFFER AREA. ; ; IF MORE PACKETS FOLLOW THEY HAVE THE FORMAT: ; .BLKW 2 ;SENDER TASK NAME(CL1...) ; .BLKW 11. ;CONTINUATION OF DATA BUFFER AREA. ; ; ;- ; .PSECT CL1IN ; ; ; THIS CONSTANT DETERMINS THE MAXIMUM NUMBER OF SIMULTANIOUS REQUESTS ; THAT CAN BE PROCESSED. REQUESTS IN EXCESS OF THIS NUMBER ARE QUEUED. MAXLUN=4 ; ; ; FOR EACH ACTIVE REQUEST A DATA BUFFER IS ALLOCATED IN THE FOLLOWING ; FORMAT: BFQSB=0 ; .BLKW 2 QIO STATUS BLOCK BFTNM=4 ; .BLKW 2 NAME OF REQUESTING TASK BFLUN=10 ; .BLKW 1 LUN ASSIGNED TO THIS TERMINAL BFUID=12 ; .BLKW 1 USER ASSIGNED REQUEST ID CODE BFBUF=14 ; .BLKW 40. 80. BYTE BUFFER BFSIZ=BFBUF+80. ; LENGTH OF BUFFER ; ; .MCALL DIR$,RCVD$,SDAT$,RCST$,ASTX$S,ALUN$,QIO$,QIOW$,STOP$S,USTP$ .MCALL ENAR$S,DSAR$S ; ; CL1IN: ENAR$S ;ENABLE ASTS BEFORE WE STOP CLR RCVST+R.CSTN ;CLEAR TASK NAME CLR RCVST+R.CSTN+2 DIR$ #RCVST ;RECEIVE OR STOP CMP $DSW,#IS.SUC ;DID WE GET SOMETHING ? BNE CL1IN ;IF NO GO WAIT AGAIN ; ; HERE WE HAVE A PROMPT AND READ REQUEST ; ALLOCATE A BUFFER AND ASSIGN LUN TO DEVICE. ; 10$: DSAR$S ;PROTECT OUR REGISTERS MOV #BUFTAB,R0 ;GET THE START OF THE BUFFER TABLE MOV #1,R1 ;INIT LUN NUMBER 11$: TST BFTNM(R0) ;IS THIS BUFFER FREE ? BEQ 20$ ;SKIP IF SO ADD #BFSIZ,R0 ;OFFSET TO NEXT BUFFER INC R1 ;AND INCREMENT LUN CMP R1,#MAXLUN ;ARE WE AT THE END OF THE TABLE BLE 11$ ;KEEP GOING IF ANY ARE LEFT ENAR$S ;ALLOW A COMPLETION AST TO OCCURE STOP$S ;ELSE WAIT FOR SOMETHING TO FREE UP BR 10$ ;AND GO TRY AGAIN ; 20$: MOV R0,R2 ;SET UP DATA AREA IN BUFFER CLR (R2)+ ;INIT QIO STATUS BLOCK CLR (R2)+ MOV RBUF,(R2)+ ;SAVE TASK NAME MOV RBUF+2,(R2)+ MOV R1,(R2)+ ;SAVE LUN MOV UID,(R2)+ ;SAVE USER ID MOV R1,ALUN+A.LULU ;SET LUN IN ASSIGN DPB MOV DEV,ALUN+A.LUNA ;SET DEVICE NAME IN DPB MOV UNIT,ALUN+A.LUNU;SET UNIT IN DPB DIR$ #ALUN ;ASSIGN LUN TO DEVICE BCS ERR1 ;SKIP IF THAT FAILS ; ; NOW COPY PROMPT FROM RECEIVE BUFFER TO I/O BUFFER MOV #40.,R3 ;MAX TRANSFER COUNT MOV NPKT,R4 ;NUMBER OF BUFFERS TO FOLLOW MOV #PROMPT,R1 ;POINT TO START OF PROMPT 21$: MOV (R1)+,(R2)+ ;COPY PROMPT DATA DEC R3 BEQ 30$ ;NO MORE SPACE IN BUFFER CMP R1,#BUFEND ;END OF BUFFER ? BLO 21$ ;IF NOT KEEP COPYING TST R4 ;ANY MORE BUFFERS BLE 30$ ;IF SO STOP MOV BFTNM(R0),RCVST+R.CSTN;SET TASK NAME FOR RECEIVE MOV BFTNM+2(R0),RCVST+R.CSTN+2 22$: DIR$ #RCVST ;RECEIVE THE NEXT BUFFER OR STOP CMP $DSW,#IS.SUC ;CHECK WE GOT SOMETHING BNE 22$ ;IF NO KEEP TRYING MOV #RBUF+4,R1 ;START OF CONTINUED PROMPT STRING DEC R4 ;ONE LESS BUFFER BR 21$ ;KEEP COPYING ; ; ISSUE A QIO ; READ-WITH-PROMPT UNLESS PROMPT STRING IS NULL. 30$: MOV #IO.RVB,QBLK+Q.IOFN ;ASSUME ITS A SIMPLE READ MOV BFLUN(R0),QBLK+Q.IOLU ;SAVE LUN IN QIO DPB MOV R0,QBLK+Q.IOSB ;SAVE STATUS BLOCK ADDRESS MOV R0,R2 ;POINT TO BUFFER ADD #BFBUF,R2 MOV R2,QBLK+Q.IOPL ;INPUT BUFFER ADDRESS TSTB (R2) ;IS PROMPT NULL ? BEQ 32$ MOV #IO.RPR,QBLK+Q.IOFN ;SET READ-WITH-PROMPT FUNCTION MOV R2,QBLK+Q.IOPL+6;SET PROMPT STRING ADDRESS CLR QBLK+Q.IOPL+10 ;CLEAR PROMPT LENGTH 31$: TSTB (R2)+ ;GET PROMPT STRING LENGTH BEQ 32$ INC QBLK+Q.IOPL+10 ;COUNT THE CHARACTER BR 31$ 32$: DIR$ #QBLK ;ISSUE THE QIO BCS ERR1 ;SKIP IF DIRECTIVE FAILS JMP CL1IN ; ERR1: MOV $DSW,BFQSB(R0) ;RETURN ERROR CODE CLR BFQSB+2(R0) CALL REPLY JMP CL1IN ;BACK TO THE START ; ; ; INPUT COMPLETION AST. NOTE THAT THIS ROUTINE PRESERVES NO REGISTERS ; THE MAIN CODE IS RESPONSIBLE FOR DISABLING AST RECOGNITION DURING ; PROCESSING. QAST: MOV (SP)+,R0 ;POP STATUS BLOCK ADDRESS CALL REPLY ;SEND BACK THE DATA DIR$ #USTP1 ;UNSTOP OURSELVES ASTX$S ; ; ; REPLY - COMPLETE A REQUEST, RETURN REPLY TO CALLER ; INPUT: R0 I/O BUFFER ADDRESS ; ; IF INPUT WAS TERMINATED BY ESCAPE, A CR IS ECHOED ON THE TERMINAL. ; REPLY: CMP BFQSB(R0),#IS.ESC ;WAS INPUT TERMINATED WITH ESCAPE BNE RPLY1 MOV BFLUN(R0),CRQIO+Q.IOLU ;SET LUN IN DPB DIR$ #CRQIO ;OUTPUT A CR AFTER THE ESCAPE RPLY1: MOV BFTNM(R0),SEND+S.DATN MOV BFTNM+2(R0),SEND+S.DATN+2 MOV #SBUF,R1 ;GET SEND BUFFER ADDRESS CLR (R1)+ ;NULL REPLY TYPE MOV BFUID(R0),(R1)+ ;RETURN USER ID CLR R4 ;ZERO BUFFERS-TO-FOLLOW COUNT MOV BFQSB+2(R0),R2 ;GET THE BYTE COUNT INC R2 ;CONVERT TO WORDS ASR R2 SUB #8.,R2 ;FREE SPACE IN FIRST BUFFER 1$: BLE 2$ ;SKIP IF THERE IS ROOM INC R4 ;COUNT ANOTHER BUFFER SUB #13.,R2 BGT 1$ 2$: MOV R4,(R1)+ ;SAVE BUFFER COUNT MOV BFQSB(R0),(R1)+ ;SAVE QIO STATUS BLOCK MOV BFQSB+2(R0),(R1)+ MOV R0,R2 ;POINT TO BUFFER ADD #BFBUF,R2 MOV #8.,R3 ;WORD COUNT FOR INITIAL PACKET 3$: MOV (R2)+,(R1)+ ;COPY REPLY SOB R3,3$ DIR$ #SEND ;SEND OFF THIS BUFFER DEC R4 ;AND COUNT IT BMI 4$ ;BREAK IF NO MORE MOV #SBUF,R1 ;ELSE BACK TO START OF BUFFER MOV #13.,R3 ;SET LENGTH FOR SUBSEQUENT PACKETS BR 3$ ;AND COPY IN MORE DATA ; 4$: MOV BFTNM(R0),UNSTP+U.STTN ;SET NAME FOR UNSTOP MOV BFTNM+2(R0),UNSTP+U.STTN+2 DIR$ #UNSTP ;UNSTOP THE CALLER CLR BFTNM(R0) ;MARK THE BUFFER FREE RETURN ; ; ; ; ; ; ALLOCATE THE BUFFERS BUFTAB: .BLKB BFSIZ*MAXLUN ; ; RCVST: RCST$ ,RBUF SEND: SDAT$ ,SBUF UNSTP: USTP$ USTP1: USTP$ CL1... ALUN: ALUN$ 0,XX,0 QBLK: QIO$ IO.RPR,,,,,QAST,<0,80.,,,,'$> CRQIO: QIOW$ IO.WVB,,1,,,, CRSTR: .WORD 15 ; RBUF: .BLKW 2 ;TASK NAME FUN: .WORD 0 ;FUNCTION CODE UID: .WORD 0 ;USER ID WORD NPKT: .WORD 0 ;NUMBER OF MESSAGE PACKETS TO FOLLOW DEV: .WORD 0 ;DEVICE NAME UNIT: .WORD 0 ;AND UNIT NUMBER PROMPT: .BLKW 8. ;START OF PROMPT STRING BUFEND=. ; SBUF: .BLKW 13. ; .END CL1IN