.TITLE TTIO TERMINAL I/O ROUTINES .MCALL WSIG$S,DIR$,WTSE$S,QIO$ ; ; ** EDMWRT SUBROUTINE TO USE $EDMSG TO OUTPUT A MESSAGE EDMWRT::MOV #50$,R0 ;R0 HAS OUTPUT BUFFER ADDRESS MOV R0,30$ ;MAKE OUTPUT BUF. ADDRESS AVAILABLE TO TT$.WR CALL $EDMSG ;FORMAT THE MESSAGE CLR 45$ ;CLEAR DONE FLAG 1$: CMP R1,#256. ;MORE THAN 255 CHARS. TO OUTPUT? BLT 2$ ;NO - BRANCH MOVB #255.,25$ ;OUTPUT NEXT 255 CHARACTERS SUB #255.,R1 ;R1 HAS # CHARS LEFT TO OUTPUT BR 5$ 2$: MOVB R1,25$ ;MAKE CHAR COUNT AVAILABLE TO TT$.WR INC 45$ ;SHOW THAT THIS IS LAST PART OF MESSAGE 5$: JSR R5,TT$.W2 ;GO OUTPUT THIS PART OF MESSAGE .BYTE 0 ;NULL FORMS CONTROL 25$: .BYTE 0 ;CHAR COUNT 30$: .WORD 0 ;OUTPUT BUFFER ADDRESS TST 45$ ;ARE WE DONE YET? BNE 40$ ;YES - BRANCH ADD #255.,30$ ;ADJUST OUTPUT BUFFER ADDRESS BR 1$ ;GO OUTPUT NEXT PART OF MESSAGE 40$: RETURN 45$: .WORD 0 50$: .BLKW 128. ; ; ** END OF EDMWRT ; ; ; *** ROUTINE TO SPECIFY LUN TO BE USED AND ; TO ATTACH TERMINAL ; TT$.AT::MOV (R5)+,TT$.QI+Q.IOLU MOV #IO.ATT,TT$.QI+Q.IOFN BR TT$.I1 ; *** ROUTINE TO WRITE TO TERMINAL *** TT$.WR::MOV #IO.WVB,TT$.QI+Q.IOFN ;SET FUNCTION CODE TO WRITE BR TT$.C1 TT$.W2::MOV #IO.WAL,TT$.QI+Q.IOFN TT$.C1: MOVB (R5)+,TT$.QI+Q.IOPL+4. ;MOVE VERTICAL CONTROL TO DPB MOVB (R5)+,TT$.QI+Q.IOPL+2. ;MOVE COUNT TO DPB BNE 1$ ;BRANCH IF COUNT .GT. 0 TST (R5)+ ;ADD 2 TO R5 BR TT$.ND ;IF COUNT = 0 , IGNORE REQUEST 1$: MOV (R5)+,TT$.QI+Q.IOPL ;MOVE BUFFER ADDRESS TO DPB CLRB TT$.ER ;CLEAR ERROR INDICATOR BR TT$.I1 ; *** ROUTINE TO READ FROM TERMINAL *** TT$.RD::MOV #IO.RVB,TT$.QI+Q.IOFN ;SET FUNCTION CODE FOR READ MOV (R5)+,TT$.QI+Q.IOPL+2. ;MOVE READ CHAR CNT TO DPB BNE 1$ ;BRANCH IF COUNT .GT.0 TST (R5)+ ;ADD 2 TO R5 BR TT$.ND ;IF COUNT = 0 , IGNORE REQUEST 1$: MOV (R5)+,TT$.QI+Q.IOPL ;MOVE READ BUFF ADDRESS TO DPB CLR TT$.ER ;CLEAR ERROR INDICATOR TT$.I1: DIR$ #TT$.QI ;DO REQUESTED I/O ON TERMINAL BCC TT$.I3 ;DIRECTIVE ACCEPTED TT$.I2: WSIG$S ;WAIT FOR A SIGNIFICANT EVENT BR TT$.I1 ;THEN TRY AGAIN TT$.I3: WTSE$S #5 ;WAIT FOR I/O TO COMPLETE TSTB TT$.ST ;TEST RETURN CONDITION CODE BPL TT$.ND ;READ SUCCESSFUL, GO RETURN CMPB #IE.EOF,TT$.ST ;CNTL Z ENTERED? BEQ TT$.ND ;YES - GO RETURN CMP #IO.ATT,TT$.QI+Q.IOFN ;ATTEMPTING AN ATTACH BEQ TT$.ND ;YES - GO RETURN INCB TT$.ER ;INCREMENT ERROR INDICATOR CMPB TT$.ER,#10. ;HAVE WE TRIED 10 TIMES UNSUCCESSFULLY? BLE TT$.I2 ;NO - GO TRY TO DO I/O AGAIN MOV TT$.ST,ERRCOD ;YES - SAVE ERROR CODE JMP ABEND ;GO ABEND TT$.ND: RTS R5 ;I/O COMPLETED OK, RETURN TT$.QI: QIO$ 0,5,5,,TT$.ST ;SET UP DPB FOR TERMINAL I/O TT$.ST::.WORD 0 ;CONDITION CODE AT END OF I/O .WORD 0 ;NUMBER OF BYTES TRANSFERRED ERRCOD: .WORD 0 TT$.ER: .BYTE 0 .EVEN ABEND: MOVB TT$.ST,R0 ;R0 HAS ERROR CODE MOVB TT$.ST+1,R1 ;R1 GIVES TYPE OF ERROR CLR R2 CLR R3 CLR R4 CLR R5 BPT ;FORCE ABEND, REGISTER ;DUMP WILL CONTAIN ERROR CODES .END