.TITLE LISTIO - I/O ROUTINES FOR LIST PROGRAM .IDENT /02.3/ .ENABL LC ;+ ; ; Free software BY ; Project Software & Development, Inc. ; ; This software is furnished for free and may be used and copied as ; desired. This software or any other copies thereof may be provided ; or otherwise made available to any other person. No title to and ; ownership of the software is hereby transferred or allowed. ; ; The information in this software is subject to change without notice ; and should not be construed as a commitment by PROJECT SOFTWARE ; AND DEVELOPMENT, INC. ; ; PROJECT SOFTWARE assumes no responsibility for the use or reliability ; of this software on any equipment whatsoever. ; ; Project Software & Development, Inc. ; 14 Story St. ; Cambridge, Ma. 02138 ; 617-661-1444 ; ; ; Title: LISTIO ; Author: Robin Miller ; Date: 29-OCT-81 ; ; Description: ; ; These routines do the input/output and error reporting. ; ; Modification History: ; ;- .ENABL AMA .MCALL DIR$, QIOW$S .SBTTL EQUATES AND MESSAGES ; Equates for RSX-11M error messages. TXTBIT = 1 ; INCLUDE TEXT OF MESSAGE MIDBIT = 2 ; INCLUDE MESSAGE ID SEVBIT = 4 ; INCLUDE SEVERITY LEVEL FACBIT = 10 ; INCLUDE FACILITY NAME .NLIST BEX ; Argument block for error messages. ERRBLK: .BYTE 6,0 ; ARG BLOCK FOR GETMSG .WORD ERRCOD ; ADDRESS OF ERROR CODE .WORD -1 ; NO OUTPUT BUFFER NEEDED .WORD MSGFLG ; ADDRESS OF FLAG WORD .WORD FACNAM ; ADDRESS OF FACILITY NAME .WORD STACOD ; ADDRESS FOR STATUS RETURN .WORD -1 ; ADDRESS OF MESSAGE FACILITY ERRCOD: .WORD 0 ; ERROR MESSAGE CODE FACNAM: .ASCIZ %LIST% ; FACILITY NAME .EVEN MSGFLG: .WORD TXTBIT!MIDBIT!SEVBIT!FACBIT ; INCLUDE EVERYTHING STACOD: .WORD 0 ; STATUS CODE RETURN ; Termination table for terminal read. TTABLE: .WORD 20000 ; TERMINATE ON .WORD 4000 ; AND CTRL/W .BLKW 14 ; REMAINING TABLE ZERO .SBTTL TYPE - PRINT AN ERROR MESSAGE ;+ ; ; TYPE - SUBROUTINE TO PRINT AN ERROR MESSAGE ; ; Called by: ; JSR R0,TYPE ; ; Inputs: ; R0 - Points to message address. ; ;- TYPE:: MOV (R0)+,TIQIO+Q.IOPL+2 ; SAVE BYTE COUNT MOV R0,TIQIO+Q.IOPL ; SAVE MESSAGE ADDRESS DIR$ #TIQIO ; WRITE IT TO TI: ADD -2(R0),R0 ; POINT PAST MESSAGE INC R0 ; ADVANCE TO NEXT WORD ? BIC #1,R0 ; MAKE R0 AN EVEN ADDRESS RTS R0 ; RETURN .SBTTL WRTNAM - WRITE FILE NAME TO TERMINAL WRTNAM:: TSTB TERM ; HARDCOPY TERMINAL ? BEQ 10$ ; IF EQ, YES (SKIP NAME) TSTB FILNAM ; FILE NAME EXIST ? BEQ 10$ ; IF EQ, NO MOV #FILNAM,R4 ; SET MESSAGE ADDRESS CALL WRITE ; AND WRITE IT 10$: RETURN .SBTTL FCSERR - REPORT AN FCS ERROR MESSAGE ;+ ; ; FCSERR - Report an File Control System (FCS) error message. ; ; This routine sets up the argument block for a call to PUTMSG to ; report the RSX-11M error message text. ; ; Inputs: ; FDBADR = Address of FDB which had error. ; ; All registers are preserved. ; ;- FCSERR:: CALL $SAVAL ; SAVE R0 - R5 MOV FDBADR,R0 ; COPY THE FDB ADDRESS MOV F.ERR(R0),ERRCOD ; COPY THE ERROR CODE MOV #ERRBLK,R5 ; ADDRESS OF ARG BLOCK CALL PUTMSG ; WRITE THE ERROR MESSAGE RETURN .SBTTL GETCMD - GET A COMMAND FROM THE USER ;+ ; ; GETCMD - Gets a command from the user. ; ; The Read-with-termination table function (IO.RTT) will allow control ; characters to terminate the read. Unfortunatly, the terminal driver ; does not interpret control characters such as DELETE, CTRL/U, etc ; with IO.RTT. Until addition code is added to simulate these functions, ; a normal read function will be done. ; ; An Read-with-prompt (IO.RPR!TF.BIN) could be used for the read, if ; the escape sequences for the VT100 are included in the prompt string. ; ; Outputs: ; R0 - Address of input buffer (terminated by NULL). ; R1 - Byte count of string entered. ; ;- GETCMD:: CALL REMATR ; REMOVE VT100 ATTRIBUTES QIOW$S #IO.RVB,#INLUN,#INEFN,,#TIOSB,,<#CMD,#CMDL,,> CMP TIOSB,#IS.CC ; CTRL/C TYPED BEQ 5$ ; IF EQ, YES CMPB TIOSB,#IE.EOF ; CNTL/Z TYPED ? BNE 10$ ; IF NE, NO 5$: BIS #B.EXIT,STATUS ; SHOW TIME TO EXIT TST (SP)+ ; POP RETURN ADDRESS BR 30$ ; COMMON RETURN 10$: MOV #CMD,R0 ; ADDRESS OF COMMAND MOV R0,R1 ; COPY THE ADDRESS CMP TIOSB,#IS.ESQ ; ESCAPE SEQUENCE ? BNE 15$ ; IF NE, NO TSTB VAXFLG ; RUNNING ON VAX/VMS ? BNE 15$ ; IF NE, YES SUB #3,TIOSB+2 ; NO, POINT TO ESCAPE 15$: ADD TIOSB+2,R1 ; POINT TO END OF INPUT CLRB (R1) ; TERMINATE WITH NULL CMP TIOSB,#IS.ESQ ; ESCAPE SEQUENCE ? BNE 20$ ; IF NE, NO ADD #3,TIOSB+2 ; ESCAPE SEQUENCE COUNT 20$: CALL CUPPER ; CONVERT TO UPPERCASE TSTB (R0)+ ; POINT TO NEXT BYTE BNE 20$ ; IF NE, MORE TO GO 30$: MOV #CMD,R0 ; ADDRESS OF INPUT STRING MOV TIOSB+2,R1 ; COPY THE BYTE COUNT RETURN .SBTTL WRITE - WRITE MESSAGE TO THE TERMINAL ;+ ; ; WRITE - Write specified message to the terminal. ; ; Inputs: ; R4 = Message address terminated by NULL. ; ;- WRITE:: CALL $SAVAL ; SAVE R0 - R5 10$: CLR R0 ; INITIALIZE COUNT MOV R4,R5 ; COPY MESSAGE ADDRESS 20$: INC R0 ; COUNT THIS BYTE CMP R0,#512. ; OVER THE LIMIT ? BGT 30$ ; IF GT, YES (WRITE) TSTB (R5)+ ; FIND END OF MESSAGE BNE 20$ ; IF NE, MORE TO GO DEC R5 ; DISCARD TERMINATOR 30$: MOV R5,R1 ; COPY ENDING ADDRESS SUB R4,R5 ; CALCULATE BYTE COUNT BEQ 100$ ; IF EQ, NOTHING QIOW$S #IO.WAL!TF.CCO,#INLUN,#INEFN,,#TIOSB,, MOV R1,R4 ; NEW STARTING ADDRESS TSTB (R4) ; END OF MESSAGE ? BNE 10$ ; IF NE, MORE TO GO 100$: RETURN ; Write a blank line to the terminal. BLANK:: TSTB VAXFLG ; RUNNING ON VAX/VMS ? BEQ 10$ ; IF EQ, NO MOV #CRLF,R4 ; SET TO WRITE CRLF CALL WRITE ; AND DO IT 10$: RETURN .END