.TITLE GETINT .IDENT /V1/ ;+ ; ; Routine to accept an integer number for FORTRAN. The FORTRAN calling ; sequence is: ; ; CALL GETINT (N,FLAG,LOW,HIGH[,N,...,N]) ; ; N = INTEGER*2 TO HOLD INPUT NUMBER ; FLAG = LOGICAL*1 TO HOLD OK/NOT OK FLAG ; LOW = INTEGER*2 LOWEST NUMBER ACCEPTED ; HIGH = INTEGER*2 HIGHEST NUMBER ACCEPTED ; ; ; D. O'Reilly 17-Dec-82 ; ;- .MCALL QIOW$,DIR$ .PSECT DATA,RW,D INBUFF: .BLKB 30. NCHAR: .WORD 20. MASK: .WORD 1 ARGSTG: .WORD 3,INBUFF,NCHAR,MASK OUTBUF: .BLKB 80. OUTLIN: .ASCIZ <33><131><64><40>/Number must be between %D and %D%N/ .EVEN WRTOUT: QIOW$ IO.WVB,5,1,,,, TMPBLK: .BLKW 2 .PSECT ROCODE,RO,I GETINT:: MOV #30.,NCHAR ;SET UP NUMBER OF CHARS TO READ CALL 4$ ; read the line, get first argumment MOV (R5),R4 ; get the number of arguments specified SUB #4,R4 ; get the actual number to read BEQ 20$ ; no optional arguments MOV #10,R3 ; offset for getting to correct location MOV @2(R5),-(SP) ; save the current value 1$: CMP R2,#', ; did we see a comma BNE 15$ ; nope, all done MOV R3,-(SP) ; save R3 MOV R4,-(SP) ; R4 CALL 6$ ; get an integer MOV (SP)+,R4 ; restore R4 MOV (SP),R3 ; R3 ADD R5,R3 ; add to the correct location MOV @2(R5),@2(R3) ; put it in the correct location MOV (SP)+,R3 ; restore the value ADD #2,R3 ; bump for next possible argument DEC R4 ; drop the number to do BNE 1$ ; try it again BR 15$ ; finish up, no more room 4$: CLRB @4(R5) ;SIGNIFY FLAG IS 'FALSE' 5$: MOV R5,-(SP) ;SAVE THE CURRENT ARGUEMENT LIST MOV #ARGSTG,R5 ;SET UP R5 FOR THE CALL CALL RDLINE ;READ IN THE DATA MOV (SP)+,R5 ;RESTORE THE ARGUEMENT LIST TST NCHAR ;ANYTHING READ IN? BEQ 20$ ;IF EQ, NO MOV #INBUFF,R0 ;THE INPUT ASCII BUFFER ADD NCHAR,R0 ;POINT TO END OF THE GOOD DATA MOVB #15,(R0) ;AND INSERT A MOV #INBUFF,R0 ;POINT BACK TO THE BEGINNING 6$: CALL $CDTB ;CONVERT TO DECIMAL CMP R1,@6(R5) ;IS THE NUMBER LARGE ENOUGH? BLT 10$ ;IF LT, NO CMP R1,@10(R5) ;IS IT TOO LARGE? BGT 10$ ;IF GT, YES MOV R1,@2(R5) ;STICK THE NUMBER INTO THE ARGUEMENT MOVB #-1,@4(R5) ;SIGNIFY 'TRUE' FOR THE FLAG BR 20$ ;AND GO AWAY SUCCESSFULLY 10$: MOV @6(R5),TMPBLK ;THE LOW END OF THE RANGE MOV @10(R5),TMPBLK+2 ;AND THE HIGH END OF THE RANGE MOV #OUTBUF,R0 ;THE OUTPUT BUFFER MOV #OUTLIN,R1 ;THE FORMAT MOV #TMPBLK,R2 ;AND THE ARGUEMENT BLOCK CALL $EDMSG ;FORMAT THE MESSAGE SUB #OUTBUF,R0 ;CALCULATE THE LENGTH MOV R0,WRTOUT+Q.IOPL+2 ;PUT INTO QIO DPB DIR$ #WRTOUT ;AND WRITE THE MESSAGE OUT MOV #5,NCHAR ;RESET THE ARGUEMENT LIST BR 5$ ;AND GO TRY AGAIN 15$: MOV (SP)+,@2(R5) ; put in the original value 20$: RETURN ;GO AWAY .END