.TITLE LISTIO - I/O ROUTINES FOR LIST PROGRAM .IDENT /01/ .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 ; Local equates. BELL = 7 ; ASCII FOR BELL ; Strings for messages. .NLIST BEX ERRBUF: .ASCII %LIS -- % ; ERROR MESSAGE HEADER HEAD = .-ERRBUF ; OFFSET TO START MESSAGE .BLKB 80. ; ERROR MESSAGE BUFFER STFCS: .ASCIZ %FCS error, code = -% STDSW: .ASCIZ %DSW error, code = -% FILMSG: .ASCIZ %, file name = % NSFMSG: .ASCIZ %no such file(s)% .EVEN .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 FILNAM ; FILE NAME EXIST ? BEQ 10$ ; IF EQ, NO MOV #FILNAM,R4 ; SET MESSAGE ADDRESS CALL WRITE ; AND WRITE IT 10$: RETURN .SBTTL FERR - PRINT FCS ERROR CODE ;+ ; ; FERR - Subroutine to print DSW or FCS error code. ; ; Inputs: ; R0 - Address of the FDB which had the error. ; ; All registers are preserved. ; ;- FERR:: CALL $SAVAL ; SAVE R0 - R5 MOV #ERRBUF+HEAD,R3 ; POINT TO OUTPUT BUFFER MOVB F.ERR(R0),R5 ; GET ERROR CODE CMPB #IE.NSF,R5 ; IS ERROR "NO SUCH FILE" ? BNE 1$ ; IF NE, NO MOV #NSFMSG,R5 ; ELSE SET MESSAGE ADDRESS BR 6$ ; AND CONTINUE ... 1$: CLR R4 NEG R5 ; MAKE CODE POSITIVE BLE 10$ ; NO ERROR -- LEAVE DIV #10.,R4 ; DIVIDE THE CODE BY 10 SWAB R5 ; PUT RESULT IN HIGH BYTE BIS R5,R4 ; SET THE LOW ORDER BIS #"00,R4 ; MAKE IT NUMERIC MOV #STDSW,R5 ; PRESUME DSW ERROR TSTB F.ERR+1(R0) ; IS IT A DSW ERROR ? BMI 5$ ; IF MI, YES MOV #STFCS,R5 ; NO, MUST BE AN FCS ERROR 5$: MOVB (R5)+,(R3)+ ; MOVE IN THE STRING. BNE 5$ ; LOOP UNTIL "DONE" MOVB R4,-1(R3) ; MOVE IN LOW ORDER ERROR CODE SWAB R4 ; MOVB R4,(R3)+ ; AND HIGH ORDER ERROR CODE TSTB FILNAM ; DOES FILE NAME EXIST ? BEQ 7$ ; IF EQ, NO MOV #FILMSG,R5 ; SET TO MOVE SECOND PART 6$: MOVB (R5)+,(R3)+ ; AND MOVE IT BNE 6$ ; IF NE, MORE TO GO 7$: MOV #FILNAM,R5 ; GET ADDRESS OF FILE NAME TSTB (R5) ; DOES IT EXIST ? BEQ 9$ ; IF EQ, NO 8$: MOVB (R5)+,(R3)+ ; MOVE IT TO BUFFER BPL 8$ ; IF PL, MORE SUB #3,R3 ; DISCARD TERMINATORS 9$: MOVB #BELL,(R3)+ ; RING THE BELL ON ERRORS SUB #ERRBUF,R3 ; CALCULATE THE BYTE COUNT MOV #ERRBUF,TIQIO+Q.IOPL ; SET ERROR MESSAGE ADDRESS MOV R3,TIQIO+Q.IOPL+2 ; COPY THE BYTE COUNT DIR$ #TIQIO ; WRITE IT TO THE TERMINAL 10$: RETURN .SBTTL READ - READ COMMAND FROM TERMINAL ;+ ; ; READ - Read a command from the terminal. ; ; Inputs: ; R4 - Address of message to write. ; ;- READ:: CALL $SAVAL ; SAVE R0 - R5 10$: CALL WRTEOS ; WRITE EOS SEQUENCE CALL WRITE ; WRITE THE MESSAGE CALL REMATR ; REMOVE VT100 ATTRIBUTES DIR$ #QIOR ; READ FROM TERMINAL CMPB TIOSB,#IE.EOF ; CONTROL/Z TYPED ? BEQ 20$ ; IF EQ, YES CMP TIOSB,#IS.CC ; TERMINATED BY CONTROL/C ? BEQ 20$ ; IF EQ, YES MOV #INCMD,R0 ; ADDRESS OF COMMAND MOV TIOSB+2,R1 ; AND THE BYTE COUNT CLRB RAGAIN ; INIT READ AGAIN FLAG CLRB CLRCNT ; PRESUME CLEAR COUNT CALL CHKCMD ; CHECK FOR A COMMAND TSTB RAGAIN ; DO READ AGAIN ? BNE 10$ ; IF NE, YES BR 30$ ; AND CONTINUE ... 20$: BIS #B.EXIT,STATUS ; SHOW TIME TO EXIT 30$: TSTB CLRCNT ; CLEAR THE COUNT ? BNE 40$ ; IF NE, NO CLR LINCNT ; CLEAR THE LINE COUNT 40$: RETURN RAGAIN:: .BYTE 0 ; READ AGAIN FLAG CLRCNT:: ; CLEAR LINE COUNT FLAG .BYTE 0 .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 MOV R4,R5 ; COPY MESSAGE ADDRESS 10$: TSTB (R5)+ ; FIND END OF MESSAGE BGT 10$ ; IF GT, MORE TO GO DEC R5 ; DISCARD TERMINATOR SUB R4,R5 ; CALCULATE BYTE COUNT QIOW$S #IO.WAL!TF.CCO,#INLUN,#INEFN,,#TIOSB,, 20$: RETURN ; AND 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