.TITLE ASN ;TASK TO ASSIGN A FILE FOR I/O FOR AS: ;DEVICE .IDENT /GCE001/ ; G. EVERHART, 11/1978 ; ; THIS TASK WILL ACCEPT A SINGLE MCR COMMAND LINE OF ; THE FORM: ; ; ASN FILESPEC=IN OR ; ASN FILESPEC=OUT ; WHERE INPUT OR OUTPUT IS SPECIFIED. SPECIAL QIO FUNCTIONS ; WILL BE SENT TO THE AS.... DEVICE HANDLER TO OPEN THE ; INDICATED FILES FOR INPUT OR OUTPUT. ; ; IF THE FILESPEC IS NULL (I.E., EQUALS BEFORE FILESPEC IS ; SEEN), THE FILE ASSIGNED TO THE IN OR OUT CHANNEL WILL ; BE CLOSED. .MCALL GMCR$,EXIT$S,QIO$S .GLOBL ASNBGN,CMDLIN GMCRB: GMCR$ ;MCR BUFFER CMDLIN=GMCRB+G.MCRB .BLKW 40. .MCALL DIR$ ASNBGN: DIR$ #GMCRB ;GET COMMAND LINE IN INOPN=2400 DELOC=400 ;OPEN TO CLOSE CHANGE DELFCT=1000 ;INPUT VS OUTPUT DELTA ;I/O CODES FOR AS: HANDLER BCC 1$ EXIT$S ;LEAVE IF NO MCR COMMAND LINE 1$: MOVB @#$DSW,R0 ;CHARACTER COUNT IN LINE ;SCAN LINE FOR "=" SIGN AND CHECK FOR I OR O AS NEXT NONBLANK CHARACTER BIC #177400,R0 ;AVOID NEGATIVE MOV R0,R1 MOV #CMDLIN,R2 2$: CMPB (R2)+,#40 ;GET SPACE AFTER TASK NAME BEQ 3$ ;EXIT LOOP WHEN FOUND SOB R1,2$ 4$: EXIT$S ;LEAVE ON ERROR 3$: DEC R1 ;COUNT DOWN CHARS IN LINE BLE 4$ MOV R1,R0 ;SAVE LENGTH MOV R2,R3 ;START ADDR 5$: CMPB (R2)+,#'= ;TEST FOR = SIGN BEQ 6$ ;EXIT WHEN FOUND SOB R1,5$ ;ELSE LOOP BR 4$ ;SCRAM ON ERROR 6$: DEC R1 ;AGAIN,LENGTH LEFT BLE 4$ ; NOW R3 HAS START OF FILE STRING AND R2 POINTS TO END+1 MOV R3,R0 ;START ADDR TO R0 MOV R2,R5 CLR -(SP) ;FLAG OPEN SUB R3,R2 ;LENGTH=END-START+1. AHA! CMP R2,#1 ;ONLY 1 SPACE? BGT 7$ INC (SP) ;YES,FLAG CLOSE 7$: CMPB @R5,#40 ;SPACE AFTER = ? BNE 8$ ;NO,TEST I OR O INC R5 DEC R1 ;SKIP TO NEXT BLE 4$ BR 7$ 8$: CMPB @R5,#'I ;INPUT? BNE 9$ MOV #INOPN,R5 ;SET I/O FUNCT BR 10$ 9$: CMPB @R5,#'O ;OUTPUT? BNE 4$ ;NO,ILLEGAL SO GO MOV #,R5 ;SET I/O OPN FOR OUTPUT 10$: TST (SP)+ ;SEE IF CLOSE FLAGGED BEQ 11$ ;SKIP IF NOT ADD #DELOC,R5 ;MAKE CLOSE CALL 11$: ;GET READY FOR QIO LUN2=2 EFN2=2 SUB #4,SP ;IO STAT BLK ON STACK MOV SP,R3 ;R3=ADDR .MCALL QIOW$S QIOW$S R5,#LUN2,#EFN2,,R3,, ;DO I/O OPEN/CLOSE ;LUN 2 IS AS: BY TKB OR REA MOV @R3,@#177570 ;EXHIBIT I/O STATUS WORD IN LIGHTS ADD #4,SP ;(IN CASE THIS TASK DOES OTHER STUFF) EXIT$S ;FINALLY LEAVE .END ASNBGN ;THAT'S ALL. SAY GOODBYE TO THE NICE PEOPLE.