.TITLE ASK ; ; .IDENT /X04.02/ ; ; ; .ENABL LC ; ; ; Copyright (C) Shell Research Ltd. 1979 ; ; ; The copyright in this computer program and associated user ; instructions contained in this document is the property of ; Shell Research Ltd.. No guarantee is given or may be implied ; as to the adequacy of the program or its suitability for any ; particular purpose and no liability is accepted for any loss ; or damage arising out of its use. ; ; ; ; Version: X04.01 ; ; ; Original author:R J Carpenter 7-Nov-79 ; ; ; This version: J P Lamargot 10-Sep-82 ; ;+++ ; Traduction des messages en francais. ; Manipulations du curseur sur une VT 100 pour ; - Ecriture des messages eventuels sur la 24eme ligne ; - Saisie d'une nouvelle reponse au meme endroit que ; celle qui etait erronnee, apres effacement de celle-ci ;--- ; ; .PAGE .SBTTL DESCRIPTION ; ; ;++ ; This module (calleable from FORTRAN ) asks the user ; for a number, assigns a default value if required, and compares ; against limits (if required.). All errors are handled by the subroutine ; thus saving time and effort in the main program. The companion subroutines ; in ASKLIB are also required for correct operation. ; ; ; Calling sequence from FORTRAN is :- ; ; ; CALL ASKx(STRING,TARGET,MIN,MAX,DEFLT) ; ; Where:- ; ; STRING is the text string to be displayed as the question ; TARGET is the target variable ; MAX is the maximum acceptable value ; MIN is the minimum acceptable value ; and DEFLT is the default value ; ; The default default value = 0 and the checks are skipped if IMAX ; and/or IMIN ommitted ; ;-- ; ; ; .PAGE .SBTTL MACROS AND DEFINITIONS ; ; .MCALL .PRINT,.TTYIN,.TTYOUT ; ; .PAGE .SBTTL INITIALISATION ; ; ASK:: ; ; SET UP ALL THE DEFAULTS ; MOV #ASKSTR,STRADR ;SET UP A DEFAULT STRING MOV #RMIN,ARGLST+4 ;THESE 3 GET OVERWRITTEN IF USER SUPLIED MOV #RMAX,ARGLST+6 ; MOV #DEFLT,ARGLST+10 ; CLR LOGIC ;SAY BOTH FALSE INITALLY MOV #LOGIC,ARGLST+12 ;SET UP ADDR. OF LO LIMIT FLAG MOV #LOGIC+1,ARGLST+14 ;SET UP ADDR OF HI LIMIT FLAG MOV #CODE,ARGLST+16 ;SET ADDR OF CODE ; ; .PAGE .SBTTL ARGUEMENT CHECKING CODE ; ; ; SEE WHICH ARGS THE USER HAS SUPPLIED ; CLR R0 ;NO GARBAGE MOVB (R5),R0 ;GET THE NUMBER OF ARGS. BEQ ASKEXT ;BR IF NO ARGS. CMP 2(R5),#-1 ;STRING ADDR VALID ? BEQ 1$ ;BR IF NOT (USE DEFAULT STRING) MOV 2(R5),STRADR ;PUT IT IN OUR PRINT LIST 1$: DEC R0 ;WE PUT AWAY ONE ARG. BEQ ASKEXT ;CAN USE OTHER ROUTINES TO PRINT STRINGS ; ; BY NOW WE KNOW WE HAVE AT LEAST TWO ARGS BUT WHICH ARE THEY? ; ASK2: CMP 4(R5),#-1 ;IS IT THE TARGET ? BEQ ASKEXT ;NO ACTION IF NOT MOV 4(R5),ARGLST+2 ;PUT IT IN OUR OWN LIST 1$: DEC R0 ;ANY MORE ARGS ? BEQ ASKPRT ;BR IF NOT CMP 6(R5),#-1 ;IS IT THE MIN ? BEQ 2$ ;BR IF NOT MOV 6(R5),ARGLST+4 ;PUT IT IN OUR LIST INCB LOGIC ;SAY LO LIMIT SUPPLIED 2$: DEC R0 ;ANY MORE ARGS ? BEQ ASKPRT ;BR IF NOT CMP 10(R5),#-1 ;MAX VALUE SUPPLIED ? BEQ 3$ ;BR IF NOT MOV 10(R5),ARGLST+6 ;PUT IN IN THE LIST INCB LOGIC+1 ;SAY HI LIMIT VALID 3$: DEC R0 ;ANY MORE ARGS ? BEQ ASKPRT ;BR IF NOT CMP 12(R5),#-1 ;DEFAULT VALUE SUPPLIED ? BEQ ASKPRT ;BR IF NOT MOV 12(R5),ARGLST+10 ;PUT IT IN THE LIST ; ; .PAGE .SBTTL STRING PRINTING CODE ; ; ASKPRT:: .TTYOUT #12 ;PRINT THE LINE FEED MOV STRADR,R1 ;GET THE STRING START ADDR. INTO R1 1$: TSTB (R1)+ ;IS IT NULL ? BNE 1$ ;BR IF NOT DEC R1 ;POINT BACK TO NULL MOVB #200,(R1) ;SAY NO CRLF AT END OF STRING ;+++ .PRINT #ASKCLN ;Effacer le message precedent ;--- .PRINT STRADR ;PRINT THE STRING CLRB (R1) ;RESTORE THE NULL ; ; .PAGE .SBTTL CALLS TO FORTRAN AND EXIT ; ; CALLF4: MOV #ARGLST,R5 ;SET THE ARGLIST POINTER FOR F4 MOV R3,CODE ;THIS ARG. ONLY USED TO DISTIGUISH I & O CALL (R2) ;CALL F4 ROUTINE ; ; ASKEXT: ;+++ .PRINT #ASKCLN ;Effacer le message precedent ;--- RETURN ;RETURN TO CALLER ; ; .PAGE .SBTTL ARGUMENT AND DATA AREAS ; ; CODE: .WORD 1 DEFLT: .FLT2 0.0 RMIN: .FLT2 0.0 RMAX: .FLT2 0.0 LOGIC: .WORD 0 ; ; STRADR: .WORD ASKSTR ; ; ASKSTR: .WORD 0 ; ; ARGLST:: .WORD 7 .BLKW 7 ; ; ;+++ .PSECT ASKCLN,D,GBL,REL,OVR ASKCLN::.ASCII <33>/7/<33>/[24;01H/<33>/[2K/<33>/8/<200> ; <33>7 Save cursor ; <33>[24;01H Move cursor to line 24, column 1 ; <33>[2K Erase all the line in which the cursor is ; <33>8 Restore cursor .PSECT ASKINI,D,GBL,REL,OVR IAM: .BLKW 7 ASKSAV: .ASCII <33>/7/<200> ; <33>7 ;Save cursor ;--- .END