; FILE NAME : T T I O . M A C ; DATE : JUNE 7, 1977 ; VERSION : 02.01 ; AUTHOR : JAMES STANFILL ; SWEDISH HOSPITAL MEDICAL CENTER ; ; REVISIONS : 02.01 19-JAN-78 J. STANFILL ; COMPLETE RE-WRITE IMPLEMENTING AN OPTIONAL TERMINAL ; TIME-OUT FOR READ REQUESTS. ; ; .TITLE TTIO .IDENT /02.01/ .MCALL DIR$,QIOW$,QIO$,MRKT$,CMKT$S,WTLO$,CLEF$ ; ; ; THIS SUBROUTINE (FORTRAN CALLABLE) WILL PERFORM I/O TO TERMINAL LIKE ; DEVICES. FOR READ REQUESTS AN OPTION EXISTS TO SPECIFY A TIME LIMIT ; IN SECONDS WITHIN WHICH THE READ MUST BE COMPLETE. IT IS ASSUMED THE ; LUN SPECIFIED IN THE CALL HAS BEEN PREVIOUSLY ASSIGNED TO THE SPECIFIC ; I/O DEVICE. ; ; NOTE: IF TERMINAL TIME-OUT IS SPECIFIED, BOTH EVENT FLAGS MUST BE IN ; THE RANGE OF 1 TO 16. OTHERWISE, AN ODD ADDRESS TRAP IS FORCED ; TO OCCUR. ; ; CALLING SEQUENCE : ; ; CALL TTIO (MODE,LUN,EVF,BUF,NCHR,IERR,[TMO,TMOEVF]) ; ; WHERE: ; ; MODE INTEGER*2 1 = READ, 2 = WRITE ; LUN INTEGER*2 LOGICAL UNIT NUMBER ; EVF INTEGER*2 EVENT FLAG NUMBER ; BUF INTEGER*2 I/O ARRAY ; NCHR INTEGER*2 PRESET TO SIZE OF BUF, ON RETURN ; CONTAINS NUMBER OF CHARACTERS READ. ; IERR INTEGER*2 I/O STATUS ERROR CODE ; 0 = SUCCESSFUL COMPLETION ; <1 = DSW ERROR CODE ; 1 = READ TIME-OUT ; 2 = BAD PARAMETERS ; 3 = TYPED ; TMO INTEGER*2 [OPTIONAL] TIME-OUT IN SECONDS ; TMOEVF INTEGER*2 [OPTIONAL] TIME-OUT EVENT FLAG [1 TO 16] ; ; NOTE: FOR CALLS FROM ASSEMBLY LANGUAGE PROGRAMS, CONDITION CODES ; ARE SET AS FOLLOWS : ; ; C = 1 FOR ; Z = 1 FOR NO INPUT ; V = 1 FOR TERMINAL READ TIME-OUT TTIO:: MOV R0,-(SP) ;SAVE MOV R1,-(SP) ; REGISTERS MOV R2,-(SP) ; USED CMP #1,@2(R5) ;A READ REQUEST ? BEQ 3$ ;YES CMP #2,@2(R5) ;THEN A WRITE REQUEST ? BEQ 1$ ;YES--CONTINUE TST 1 ;NO--BAD PARAMETERS ! 1$: MOV #QIOW,R0 ;PICK UP DPB ADDRESS MOV #IO.WLB,Q.IOFN(R0) ;AND SET CODE FOR WRITE BR 7$ 3$: CMP #6,(R5) ;TIME-OUT PARAMETERS SPECIFIED ? BEQ 5$ ;NO--CONTINUE MOV #QIO,R0 ;YES--RESET DPB ADDRESS 5$: MOV #IO.RLB,Q.IOFN(R0) ;SET FUNCTION CODE FOR READ 7$: MOV @4(R5),Q.IOLU(R0) ;PICK UP LUN FOR I/O MOV @6(R5),Q.IOEF(R0) ;AND EVENT FLAG TST @12(R5) ;NUMBER OF CHARACTERS > 0 ? BGT 9$ ;YES--CONTINUE MOV #2,TTIOST ;NO--SET ERROR RETURN JMP 19$ ;AND EXIT 9$: MOV 10(R5),Q.IOPL(R0) ;SET BUFFER ADDRESS MOV @12(R5),(R0) ;AND BUFFER SIZE CMP #2,@2(R5) ;IS THIS A WRITE ? BEQ 15$ ;YES CMP #6,(R5) ;TIME-OUT SPECIFIED ? BEQ 13$ ;NO--CONTINUE MOV @20(R5),R1 ;YES--PICK UP TIME-OUT FLAG MOV R1, ;INSERT INTO DPB'S FOR CLEAR MOV R1, ;EVENT FLAG AND MARK TIME CALL MASK ;SET BIT IN MASK WORD MOV R2,-(SP) ;TEMPORARILY SAVE ON STACK MOV @6(R5),R1 ;GET I/O EVENT FLAG CALL MASK ;AND SET BIT IN MASK ADD (SP)+,R2 ;FORM MASK OF BOTH FLAGS MOV R2, ;AND INSERT INTO DPB MOV @16(R5), ;SET TIME-OUT IN SECONDS IN DPB DIR$ R0 ;ISSUE READ DIR$ #TIMOUT ;START TIMER DIR$ #PAUSE ;AND WAIT FOR AN EVENT FLAG DIR$ #CLEF ;SOMETHING HAPPENED ! CMP #IS.SET,$DSW ;DID TIMER EXPIRE ? BEQ 11$ ;YES CMKT$S ;NO--STOP TIMER BR 17$ ;AND GO CHECK STATUS 11$: MOV #IOKIL,R1 ;SET UP DPB FOR I/O KILL MOV @4(R5),Q.IOLU(R1) ;PICK UP LUN AND MOV @6(R5),Q.IOEF(R1) ;EVENT FLAG DIR$ R1 ;KILL I/O REQUEST MOV #1,TTIOST ;SET ERROR RETURN CODE CLR @12(R5) ;AND CHARACTER COUNT BR 19$ ;AND STATUS FOR NO INPUT 13$: DIR$ R0 ;ISSUE READ WITH WAIT BR 17$ ;NOW GO CHECK STATUS 15$: DIR$ R0 ;ISSUE WRITE BR 23$ 17$: CMPB #IE.EOF,TTIOST ; TYPED ? BEQ 21$ ;YES CLR TTIOST ;NO--SET STATUS FOR SUCCESS MOV ,@12(R5) ;RETURN NUMBER OF CHARACTERS BNE 23$ ;ANYTHING TYPED ? 19$: MOV TTIOST,@14(R5) ;YES--RETURN I/O STATUS BR 23$ 21$: MOV #3,@14(R5) ;RETURN STATUS FOR 23$: MOV (SP)+,R2 ;RESTORE MOV (SP)+,R1 ; REGISTERS MOV (SP)+,R0 ; USED CMP #3,@14(R5) ;WAS TYPED ? BEQ 25$ ;YES CMP #1,@14(R5) ;DID TIMER EXPIRE ? BEQ 27$ ;YES TST @12(R5) ;WAS ANYTHING TYPED ? BNE 29$ ;YES--NORMAL EXIT CCC ;NO--SET CONDITION CODE SEZ ;FOR NO INPUT, I.E. Z = 1 BR 31$ 25$: CCC ;SET CONDITION CODE SEC ;FOR , I.E. C = 1 BR 31$ 27$: CCC ;SET CONDITION CODE SEV ;FOR TIME-OUT, I.E. V = 1 BR 31$ 29$: CCC ;CLEAR CONDITION CODES NORMALLY 31$: RETURN ;RETURN TO CALLER ; ; SUBROUTINE TO CHECK RANGE OF EVENT FLAGS FOR TERMINAL READ WITH ; TIME-OUT, AND TO SET APPROPRIATE BIT IN FLAG WORD MASK. ; ; ENTER WITH R1 = EVENT FLAG ; EXIT WITH R2 = FLAG WORD MASK ; MASK: CMP #1,R1 ;IS EVENT FLAG BGT 1$ ;IN RANGE FROM CMP #16.,R1 ;1 TO 16 ? BGE 2$ ;YES--CONTINUE 1$: TST 1 ;NO--FORCE AN ODD ADDRESS TRAP ! 2$: DEC R1 ;SET APPROPRIATE MOV #1,R2 ;BIT IN FLAG ASH R1,R2 ;WORD MASK RETURN ;AND RETURN TO CALLER ; ; ; ; DIRECTIVE PARAMETER BLOCKS ; ; TIMOUT: MRKT$ 0,0,2 PAUSE: WTLO$ 0,0 CLEF: CLEF$ 0 IOKIL: QIOW$ IO.KIL,,,,,,<0,0,0> QIO: QIO$ IO.RLB,,,,TTIOST,,<0,0,0> QIOW: QIOW$ IO.RLB,,,,TTIOST,,<0,0,0> ; TTIOST: .BLKW 2 ;TERMINAL I/O STATUS ; ; .END