.TITLE RDTTY .IDENT /V01/ .SBTTL DESCRIPTION ; ; ; COMPONENT: RDTTY ; ; DATE: 09-JUL-79 ; ; AUTHOR: GR JOHNSON ; BATTELLE NORTHWEST ; P O BOX 999 ; RICHLAND WA 99352 ; ; SOURCE: MACRO-11 ; ; CALLER: FORTRAN IV-PLUS ; ; CALLING SEQUENCE: ; ; CALL RDTTY(LUN,IBUF,[ILEN],[RAL],[NOECHO],[ISW]) ; ; LUN = INTEGER CONTAINING A LOGICAL UNIT NUMBER. ; ; IBUF = VARIABLE OR ARRAY TO RECEIVE THE INPUT CHARACTER(S). ; ; ILEN = OPTIONAL INTEGER ARGUMENT SPECIFYING THE NUMBER ; OF CHARACTERS TO BE INPUT. (DEFAULT=1) ; ; RAL = OPTIONAL LITERAL 'READALL' INDICATING THAT ALL ; EIGHT BITS OF THE BYTE ARE TO BE INPUT WITHOUT ; INTERFERENCE BY THE TERMINAL DEVICE HANDLER. ; ; NOECHO = OPTIONAL LITERAL 'NOECHO' INDICATING THAT CHAR- ; ACTERS INPUT WILL NOT BE ECHOED BY THE TERMINAL ; DEVICE HANDLER. ; ; ISW = VARIABLE TO RECEIVE THE INTEGER STATUS WORD. ; ; +NN = SUCCESS. NN CHARACTERS RECEIVED. ; ; -10 = END-OF-FILE ENCOUNTERED ; ; -NN = OTHER FCS ERROR CODE ; ; ; DESCRIPTION: ; ; "RDTTY" INPUTS AN ARRAY OF BYTES USING THE QIO IO.RLB (READ ; LOGICAL BLOCK) FUNCTION. THE ROUTINE MAY BE USED WHENEVER IT IS DE- ; SIRABLE TO INPUT CHARACTERS FROM A TERMINAL DEVICE USING THE SPECIAL ; HANDLING OPTIONS PROVIDED BY RDTTY. ; ; RDTTY INPUT REQUESTS ARE SATISFIED WHEN EITHER THE USER BUFFER IS ; FILLED (ILEN CHARACTERS HAVE BEEN READ), OR ONE OF THE TERMINATION ; CHARACTERS (CARRIAGE RETURN OR ESCAPE) IS TYPED. THE USER BUFFER IS ; BLANK FILLED ON RETURN AND THE ACTUAL NUMBER OF CHARACTERS INPUT IS ; RETURNED IN THE INTEGER STATUS WORD. ; ; ; EXAMPLES: ; ; CALL RDTTY(5,CHAR) ; ; CALL RDTTY(5,PASWRD,6,,'NOECHO') ; ; ; IN THE FIRST EXAMPLE A SINGLE ASCII CHARACTER IS INPUT FROM THE ; TERMINAL. THE SECOND EXAMPLE DEMONSTRATES HOW RDTTY MIGHT BE USED TO ; INPUT A "SECRET" PASSWORD. ; ; .SBTTL SYMBOL DEFINITIONS ; ; ; .PSECT ; .MCALL QIOW$,DIR$ ; ; DPB: QIOW$ IO.RLB,,,,QIOST,,<,> ; DECLARE QIO DPB ; QIOBF = Q.IOPL+0 ; QIO BUFFER ADDRESS OFFSET QIOBFL = Q.IOPL+2 ; QIO BUFFER LENGTH OFFSET ; QIOST: .WORD 0,0 ; QIO STATUS BLOCK ; .SBTTL ENTRY POINT -- PERFORM QIO IO.RLB ; ; ; RDTTY:: ; ; MOV #DPB,R0 ; QIO DPB ADDRESS TO R0 MOV #IO.RLB,Q.IOFN(R0) ; DEFAULT FUNCTION TO QIO DPB MOV @2(R5),Q.IOLU(R0) ; LUN TO QIO DPB MOVB @2(R5),Q.IOEF(R0) ; SET EVENT FLAG FOR QIO AND WAIT MOV 4(R5),QIOBF(R0) ; BUFFER ADDRESS TO QIO DPB MOV #1,QIOBFL(R0) ; DEFAULT BUFFER LENGTH TO QIO DPB ; CMPB #3,(R5) ; THREE ARGUMENTS? BGT 6$ ; NO, GO ISSUE QIO TST 6(R5) ; NULL ARGUMENT? BLT 2$ ; YES, NEXT ARGUMENT MOV @6(R5),QIOBFL(R0) ; NO, ILEN TO QIO DPB ; 2$: CMPB #4,(R5) ; FOUR ARGUMENTS? BGT 6$ ; NO, GO ISSUE QIO TST 10(R5) ; NULL ARGUMENT? BLT 4$ ; YES, NEXT ARGUMENT BIS #TF.RAL,Q.IOFN(R0) ; NO, ASSUME 'READALL' ; 4$: CMPB #5,(R5) ; FIVE ARGUMENTS? BGT 6$ ; NO, GO ISSUE QIO TST 12(R5) ; NULL ARGUMENT? BLT 6$ ; YES, NEXT ARGUMENT BIS #TF.RNE,Q.IOFN(R0) ; NO, ASSUME 'NOECHO' ; 6$: DIR$ #DPB ; ISSUE QIO DIRECTIVE TSTB QIOST ; OPERATION SUCCESS? BLT ERR ; RETURN ON ERROR OR EOF ; 10$: MOV QIOBFL(R0),R2 ; BUFFER LENGTH TO R2 SUB QIOST+2,R2 ; SUBTRACT CHARACTERS INPUT BEQ SUC ; BRANCH IF BUFFER FILLED MOV 4(R5),R1 ; BUFFER ADDRESS TO R1 ADD QIOST+2,R1 ; POINT PAST LAST CHARACTER INPUT 12$: MOVB #040,(R1)+ ; BLANK FILL BUFFER SOB R2,12$ ; ; .SBTTL PROCESS ERRORS AND RETURN TO CALLER ; ; ; SUC: MOV QIOST+2,R4 ; ISW = CHARACTERS INPUT BR RTN ; ERR: MOVB QIOST,R4 ; READ ERROR ; ; RTN: CMPB #6,(R5) ; SIX ARGUMENTS? BGT 2$ ; NO, RETURN TO CALLER TST 14(R5) ; NULL ARGUMENT? BLT 2$ ; YES, RETURN TO CALLER MOV R4,@14(R5) ; NO, RETURN STATUS 2$: RTS PC ; RETURN TO CALLER .END ;