.TITLE ASK .IDENT /RICE01/ .MCALL QIOW$S,EXIT$S BUFF: .BLKB 80. ISTAT: .BLKW 2 YN: .ASCIZ .? [Y/N]:. .EVEN ; ; CALL ASK('QUESTION',ITEST) ; ITEST=0 if answer is NO ; ITEST=-1 if answer is YES ; ASK:: MOV #2,R0 CALL R5CHEK CALL GETTXT MOV #YN,R0 ; Now fill rest of buffer CALL MOVTXT ; Add on the question MOV R4,R1 ; Buffer to use SUB R3,R4 ; Byte count MOV #80.,R2 SUB R4,R2 ; Byte count for read 1$: CALL READIT TST ISTAT+2 ; Is there data? BEQ 1$ ; No MOVB (R1),R0 ; First char of string CMPB R0,#140 ; Is it upper case? BLT 2$ ; No SUB #40,R0 ; Convert it 2$: CMPB R0,#'N ; Yes, is it no? BEQ 5$ ; Yes CMPB R0,#'Y ; Is it YES? BNE 1$ ; No MOV #-1,@2(R5) RETURN 5$: CLR @2(R5) ; Tell user no RETURN ; ; READIT: QIOW$S #IO.RPR,#5,#1,,#ISTAT,, CMPB ISTAT,#IE.EOF ; Ok? BNE 4$ ; Yes EXIT$S ; No, End of file detected 4$: RETURN ; ; GETTXT: MOV (R5),R0 ; Input text address MOV #BUFF,R4 ; Buffer address MOV R4,R3 ; " " MOVTXT: CMP R4,#BUFF+79. ; Overflow ? BHIS 3$ ; Yes MOVB (R0)+,(R4)+ ; Move 1 byte BEQ 3$ ; Zero is end of text BR MOVTXT ; Continue till done 3$: RETURN ; ; CALL ASKS( 'TEXT',STRING,SIZE,[MIN],MAX [,DEFAULT]) ; DF1: .ASCIZ / [D:/ DF2: .ASCIZ /]:/ STR: .ASCIZ / :/ .EVEN DEFSIZ: .WORD 0 ; Default char string size ASKS:: TST (R5)+ ; Skip param count CLR DEFSIZ CALL GETTXT ; Get the question MOV #STR,R0 ; Non default string CMPB -2(R5),#5 ; Number of param OK? BGE 2$ ; Yes 1$: JMP BPARM ; No 2$: BEQ 6$ ; No default string MOV #DF1,R0 ; Start of default CALL MOVTXT MOV 12(R5),R0 ; Get the default text CALL PCHEK CALL MOVTXT ; Save it MOV 12(R5),R1 ; DITTO MOV 2(R5),R0 ; User buffer CALL PCHEK MOV @10(R5),R2 ; Max size MOV R2,DEFSIZ ; Will be default size 4$: MOVB (R1)+,(R0)+ ; Transfer default BEQ 5$ ; Done SOB R2,4$ 5$: SUB R2,DEFSIZ ; Default size MOV #DF2,R0 ; End default 6$: CALL MOVTXT SUB R3,R4 ; Buffer size MOV 2(R5),R1 ; String address MOV @10(R5),R2 ; String size 7$: CALL READIT ; Get string MOV ISTAT+2,R0 ; Char string length BNE 10$ ; Non zero MOV DEFSIZ,R0 ; Default? 10$: CMP 6(R5),#-1 ; Min value to test? BEQ 11$ ; No CMP @6(R5),@10(R5) ; Min greater than max? BGT 11$ ; Yes, do not check min CMP R0,@6(R5) ; Is string too short? BLT 7$ ; YES 11$: MOV R0,@4(R5) ; Length to user MOV @10(R5),R1 ; Max length SUB R0,R1 ; Number to clear BEQ 13$ ; Done ADD 2(R5),R0 ; Start address 12$: CLRB (R0)+ SOB R1,12$ 13$: RETURN PCHEK: CMP R0,#-1 BEQ 1$ ; Bad address RETURN ; Good 1$: JMP BPARM ; BAD params .END