.TITLE PROMPT - ROUTINES TO PROMPT AND WRITE .IDENT /01.4/ .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: PROMPT ; Author: Robin Miller & Gary Larsen ; Date: April 1, 1982 ; ; Description: ; ; Modification History: ; ;- .ENABL AMA .MCALL QIOW$S .SBTTL PROMPT - PROMPT THE USER ;+ ; ; PROMPT - PROMPT THE USER AND GET HIS ANSWER ; ; This routine writes the prompt to the terminal, and issues a read ; of 80. bytes. If the escape key or question mark is typed, the ; help flag is set true. If an esclaimation point is typed, the ; backup flag is set true. ; ; Inputs: ; R1 - address of user input buffer ; R2 - address of message to write on prompt. ; ; Outputs: ; HLPFLG <> 0 = help wanted. ; BCKFLG <> 0 = backup requested. ; ; All regesters are preserved. ; ;- PROMPT:: CALL $SAVAL ; SAVE R0 - R5 10$: MOV R2,R4 ; COPY THE PROMPT ADDRESS CLR BCKFLG ; CLEAR THE BACKUP FLAG CALL WRITE ; AND WRITE IT ; Issue the read to the terminal. Preserve R1 for read. QIOW$S #IO.RVB,#LOCAL,#LOCAL,,#LIOSB,, CALL CHKLIO ; CHECK FOR ERRORS MOV R1,R0 ; COPY THE INPUT ADDRESS CMP LIOSB,#IS.ESC ; ESCAPE FOR HELP ? BNE 20$ ; IF NE, NO 15$: TST HLPADR ; IS THERE A HELP MESSAGE ? BEQ 10$ ; IF EQ, NO (CONTINUE) CALL BLANK ; WRITE A BLANK LINE CALL GETHLP ; YES, GO TYPE IT BR 10$ ; AND PROMPT AGAIN 20$: ADD LIOSB+2,R0 ; POINT TO END OF STRING CLRB (R0) ; TERMINATE INPUT WITH NULL MOV R1,R0 ; RESTORE R0 TO START CMPB (R0),#'? ; QUESTION MARK FOR HELP BEQ 15$ ; YES, GO TYPE IT CMPB (R0),#'! ; DO THEY WISH TO BACKUP BNE 30$ ; IF EQ ,NO DEC BCKFLG ; ELSE SET THE BACKUP FLAG 30$: CALL CUPPER ; CONVERT TO UPPERCASE TSTB (R0)+ ; END OF STRING BNE 30$ ; IF NE, NO ; Write the response to the log file. TST LOCFLG ; LOCAL OUTPUT TO LOGFILE ? BEQ 40$ ; IF EQ, NO (SKIP LOGFILE) MOV R1,R2 ; ADDRESS FOR LOGFILE MOV LIOSB+2,R3 ; COPY THE BYTE COUNT BEQ 40$ ; IF EQ, NOTHING TO WRITE CALL WRTLOG ; WRITE IT TO THE LOG FILE 40$: CALL BLANK ; WRITE A BLANK LINE RETURN .SBTTL BLANK - WRITE A BLANK LINE ;+ ; ; BLANK - Write a blank line to the terminal and logfile. ; ;- BLANK:: MOV R4,-(SP) ; SAVE R4 MOV #CRLF,R4 ; SET FOR SINGLE SPACE CALL WRITE ; GO WRITE IT MOV (SP)+,R4 ; RESTORE R4 RETURN .SBTTL TBLANK - WRITE A BLANK LINE TO THE TERMINAL ;+ ; ; TBLANK - This routine writes a blank line to the terminal only. ; ;- TBLANK:: TST NCRLF ; NEED CR/LF AT TTY ? BEQ 10$ ; IF EQ, NO QIOW$S #IO.WAL!TF.CCO,#LOCAL,#LOCAL,,,,<#CRLF,#2,#0> 10$: CLR NCRLF ; CLEAR CR/LF FLAG RETURN .SBTTL CUPPER - CONVERT CHARACTER TO UPPER CASE ;+ ; ; CUPPER - Convert character to upper case. ; ; Inputs: ; (R0) = Character to convert. ; ;- CUPPER:: CMPB (R0),#'a ; POSSIBLE LOWERCASE ? BLO 10$ ; IF LO, NO CMPB (R0),#'z ; REALLY LOWERCASE ? BHI 10$ ; IF HI, NO BICB #40,(R0) ; CONVERT TO UPPERCASE 10$: RETURN .SBTTL WRITE - WRITE MESSAGE TO THE TERMINAL ;+ ; ; WRITE - Write specified message to the terminal. ; ; The message is written to both the terminal and the logfile (if it ; is open). The message is written using 512. bytes per QIO. This ; is done so the routine will work using the VAX/VMS AME which doesn't ; like writes to be too large (RSX-11M allows 8128. bytes per QIO). ; ; Inputs: ; R4 = Message address terminated by NULL. ; ; Outputs: ; All registers are preserved. ; ;- 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 ? BGE 30$ ; IF GE, 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 ; Write the message to the logfile. TST LOCFLG ; LOCAL OUTPUT TO LOGFILE ? BEQ 40$ ; IF EQ, NO (TERMINAL ONLY) MOV R4,R2 ; COPY THE BUFFER ADDRESS MOV R5,R3 ; COPY THE BYTE COUNT CALL WRTLOG ; AND WRITE TO LOG FILE ; Write the message to the terminal. 40$: QIOW$S #IO.WAL!TF.CCO,#LOCAL,#LOCAL,,,, CALL CHKDIR ; CHECK FOR ERRORS MOV R1,R4 ; NEW STARTING ADDRESS TSTB (R4) ; END OF MESSAGE ? BNE 10$ ; IF NE, MORE TO GO 100$: RETURN .END