;******************************************************************************* ; I N P U T . M A C ;******************************************************************************* .TITLE INPUT .IDENT /JAX001/ .ENABL LC .NLIST BEX ; FORTRAN CALL IS : ; ; CALL INPUT(DEST,DESTSZ,PROM,PROMSZ) ; ; DEST: DESTINATION OF INPUT STRING ; DESTSZ: DESTINATION LENGTH. ON RETURN FROM SUBROUTINE, ; IT'S THE ACTUAL NUMBER OF BYTES READ IN. ; ; PROM: PROMPT STRING (OPTIONAL) ; PROMSZ: LENGTH OF PROMPT STRING IN BYTES. ; .MCALL QIOW$,FSRSZ$,DIR$,C$C ; DEFINE A LOCAL MACRO .MACRO PRINT,A,B MOV A,WRITE+Q.IOPL MOV B,WRITE+Q.IOPL+2 DIR$ #WRITE .ENDM .MACRO INPUT,A,B MOV A,READ+Q.IOPL MOV B,READ+Q.IOPL+2 DIR$ #READ .ENDM INPUT ; DEFINE THE LUN TERLUN=5 ; DEFINE A FEW CC CHARACTERS C$C DS=44 .SBTTL DEFINE THE QIO'S ;******************************************************************************* READ: QIOW$ IO.RVB,TERLUN,1,,IOSTAT,, WRITE: QIOW$ IO.WVB,TERLUN,1,,,,<0,0,> IOSTAT: .BLKW 2. INBUF: .BLKW 40. INBUFS=.-INBUF ;******************************************************************************* .SBTTL DEFINE MISC. STORAGE ;******************************************************************************* SAVE: .BLKW 6. ;******************************************************************************* ; START THE PROCEDURE INPUT:: ; GET THE ARGUMENTS SENT US BY THE CALLING ROUTINE. ; ; ARG1: ADDRESS OF CHARACTER STRIN TO PUT RESULT IN. ; ARG2: ADDRESS OF LENGTH OF DESTINATION STRING. ; ARG3: ADDRESS OF A PROMPT STRING ; ARG4: LENGTH OF PROMPT STRING. ; SAVE ALL REGISTERS MOV R0,SAVE MOV R1,SAVE+2 MOV R2,SAVE+4 MOV R3,SAVE+6 MOV R4,SAVE+8. MOV R5,SAVE+10. CLR R4 ;USE AS A FLAG MOV 2(R5),R0 ;GET ADDRESS OF RECEIVING FIELD MOV @4(R5),R1 ;GET LENGTH OF DESTIATION BUFFER CMP #2,(R5) ;SEE IF ONLY TWO ARGUMENTS BHIS IN.RD ;YES, THEN WE DON'T DO A PROMPT. ; NOW IF MORE THAN TWO ARGUMENTS, THEN WE DO A PROMPT PR: PRINT 6(R5),@10(R5) ;PROMPT TO THE SCREEN INC R4 ;SET PROMPT FLAG ; NOW OUTPUT A STRING OF UNDERLINES TO SHOW HOW MANY CHARACTERS ; ARE ALLOWED FOR THE READ. IN.UL: MOVB #137,(R0)+ ;MOVE A _ HERE SOB R1,IN.UL ;DO FOR FULL READ LENGTH MOV 2(R5),R0 ;RESET POINTER MOV @4(R5),R1 ;RESET COUNT PRINT R0,R1 ;AND PRINT IT TO THE SCREEN ; NOW RESET THE POSITION OF THE CURSOR IN.BS: MOVB #BS,(R0)+ ;BACKUP ON THE SCREEN SOB R1,IN.BS ;AND GET BACK TO WHERE WE LEFT OFF MOV 2(R5),R0 ;RESET POINTER MOV @4(R5),R1 ;AND COUNT PRINT R0,R1 ;BACKUP CURSOR ; NOW CLEAR THE DESTINATION BUFFER TO NULLS IN.RD: MOVB #NUL,(R0)+ ;SET TO NOTHING SOB R1,IN.RD ;DO FOR ENTIRE ARRAY MOV 2(R5),R0 ;RESET POINTER MOV @4(R5),R1 ;AND COUNT ; NOW PERFORM A READ INPUT #INBUF,@4(R5) ;READ FROM TERMINAL ; SEE IF THEY TYPED A ^Z CMP #IE.EOF,IOSTAT ;^Z? BNE C.OK ;NO, CONTINUE TST IOSTAT+2 ;SEE IF ANYTHING READ BEFORE ^Z BEQ 2$ ;YES, THEN DON'T SET ERROR BR C.OK1 ;PROCESS NORMALLY 2$: MOV #IE.EOF,@4(R5) ;SET BYTE COUNT TO -10 BR UNSV ;RETURN ; NOW MOVE THE RESULT INTO THE TARGET BUFFER. C.OK: TST IOSTAT+2 ;SEE IF ZERO COUNT READ BNE C.OK1 ;GO BACK AND READ AGAIN TST R4 ;CHECK FLAG BNE PR ;SET, THEN DO A PROMPT BR IN.UL ;ELSE DISREGARD THE PROMPT C.OK1: MOV IOSTAT+2,R3 ;GET READ COUNT. MOV #INBUF,R4 ;SET BUFFER POINTER IN.LP: MOVB (R4)+,(R0)+ ;MOVE A BYTE. SOB R3,IN.LP ; RETURN THE NUMBER OF BYTES READ IN THE SECOND ARGUMENT. MOV IOSTAT+2,@4(R5) ;SET READ COUNT ; OKAY, SO WE'RE DONE. RESTORE THE REGISTERS ; AND RETURN CONTROL TO CP. UNSV: MOV SAVE,R0 MOV SAVE+2,R1 MOV SAVE+4,R2 MOV SAVE+6,R3 MOV SAVE+8.,R4 MOV SAVE+10.,R5 RETURN .END