; TRMSG.SUB - COMMAND FILE TO CATALOG TRMSG SUBROUTINE. .OPEN TRMSG.MAC .ENABLE DATA .LIST MEB .NLIST MD,CND .TITLE TRMSG .GLOBL TRMSG ; @SD@ TRMSG ; SUBPRGM ID: TRMSG ; PROGRAMMER: TSGT MARVIN L FREIMUND / ADLS ; CREATED ON: 14 JUN 78 FOR PROJECT 050540 ; UPDATED ON: 06 NOV 78 TO ADD CR ECHO ; ; DESCRIPTION: TRMSG IS A MACRO-11 LANGUAGE SYSTEMS SUBROUTINE USED ; ON THE PDP-11/45 TO SEND MESSAGES TO AND RECEIVE INPUT FROM THE ; TERMINAL. (INPUT ECHOING MAY BE SUPPRESSED AT THE CALLER'S OPTION). ; ; CALL FORMAT: CALL TRMSG(MSG,MSGL,ANS,ANSL) ; ; WHERE: ; ; MSG = NAME OF ARRAY OR BUFF CONTAINING MESSAGE. ; ...OR... ACTUAL LITERAL TEXT STRING ; MSGL = INTEGER NUMBER OF BYTES (CHARS) IN MSG TEXT ; ; ANS = NAME OF ARRAY (OR BUFFER) TO RECEIVE THE ANSWER. THIS ; PARAMETER (AND NEXT ONE) ARE OPTIONAL. ; NOTE: IF CNTRL-Z (EOF) IS TYPED, THE FIRST BYTE OF ANS ; WILL CONTAIN -10. ; ANSL = INTEGER CONTAINING MAX NUMBER OF CHARACTERS ; TO READ FROM THE TERMINAL. IF POSITIVE, ANS WILL BE ; ECHOED AS TYPED. IF NEGATIVE, ECHOING WILL BE SUP- ; PRESSED. ; NOTE: ANSL NUMBER OF BYTES WILL BE CLEARED BEGINNING ; AT THE ADDRESS OF ANS. ; ; INPUT/OUTPUT: LOGICAL UNIT 5 IS USED FOR THE TERMINAL ; ; ETAC SUBPGMS: NONE ; ; @ED@ ; ; READ=001000 ; READ FUNC (IO.RLB) RDNE=001020 ; READ FUNC (IO.RLB W/O ECHO) WRIT=000400 ; WRIT FUNC (IO.WLB) .MCALL QIOW$,DIR$ QTYP: QIOW$ WRIT,5,1,,IOST,,<0,0,0> QACP: QIOW$ 0,5,1,,IOST,,<0,0> TFN = QTYP+Q.IOFN TBF = QTYP+Q.IOPL TBC = QTYP+Q.IOPL+2 TCC = QTYP+Q.IOPL+4 AFN = QACP+Q.IOFN ABF = QACP+Q.IOPL ABC = QACP+Q.IOPL+2 IOST: .WORD 0,0 ; STATUS BLOCK CR: .BYTE 1,15 ; COUNT AND DATA FOR CR ; ; TRMSG: CALL $SAVAL MOV 2(R5),TBF ; STORE MSG ADDR MOV @4(R5),TBC ; STORE MSG LNGTH CMPB #2,(R5) ; WANT AN ANSWER? BEQ 3$ ; EQ MEANS NONE RQSTD MOV 6(R5),R0 ; R0 => ADDR OF ANS BUFF MOV @10(R5),R1 ; R1 = NMBR OF BYTES TST R1 ; NEGATIVE? BPL 1$ ; NOPE NEG R1 ; YES, MAKE IT POS 1$: MOVB #40,(R0)+ ; CLEAR THE BUFFER SOB R1,1$ ; LOOP MOV #'$,TCC ; NO CAR RTN AFTER MSG MOV 6(R5),ABF ; STORE ADDR OF ANS BUFF MOV @10(R5),ABC ; STORE MAX ANS LNGTH BPL 2$ ; POS MEANS ECHO INPUT NEG ABC ; CNVRT TO POSITIVE, THEN... MOV #RDNE,AFN ; STORE FUNC FOR READ W/O ECHO BR 4$ 2$: MOV #READ,AFN ; STORE FUNC FOR READ WITH ECHO BR 4$ 3$: MOV #40,TCC ; CR AFTER MSG (NO ANS EXPCTED) 4$: DIR$ #QTYP ; SEND MESSAGE CMPB #2,(R5) ; WANT ANSWER? BEQ 8$ ; NOPE DIR$ #QACP ; GET HIS ANSWER CMPB #IE.EOF,IOST ; EOF RECEIVED? BNE 5$ ; NOPE MOVB #-10.,@6(R5) ; RETURN EOF TO ANS 5$: CMP #RDNE,AFN ; WAS IT NO ECHO? BNE 7$ ; NO, CHECK FOR CR 6$: MOV #CR,R1 ; ADDR OF COUNT AND DATA MOVB (R1)+,R2 ; GET COUNT MOV R1,TBF ; ADDR MOV R2,TBC ; COUNT CLR TCC ; NO CARRIAGE CONTROL DIR$ #QTYP ; SEND IT MOVB #15,IOST+1 ; SET STATUS FOR CR TERM 7$: CMPB #15,IOST+1 ; WAS CR RETURNED BEQ 8$ ; YES BR 6$ ; NO, GO FORCE ONE 8$: RETURN ; RESTORE AND RETURN .END .DISABLE DATA .CLOSE MAC TRMSG,ADSTRMSG.DMP/-SP=TRMSG PIP TRMSG.MAC;*/DE .ASK ANSA DID IT ASSEMBLE OK .IFF ANSA .GOTO 500 .OPEN TSTMSG.FTN .ENABLE DATA C TSTMSG BYTE LBUF(10), LANS(10), LEOF DATA LEOF/-10/ C CALL BEGIN 100 CALL TRMSG('ENTER UP TO 10 CHARACTERS',25) CALL TRMSG('ENT>',4,LBUF,10) IF(LBUF(1).EQ.LEOF) GOTO 200 I = NBRCHR(LANS,10) CALL TRMSG('ENT>',4,LANS,-10) J = NBRCHR(LANS,10) CALL TRMSG('YOU TYPED IN:',13) CALL TRMSG(LBUF,I) CALL TRMSG('THEN YOU TYPED:',15) CALL TRMSG(LANS,J) GOTO 100 200 CALL SUB CALL QUIT END SUBROUTINE SUB CALL TRMSG('SAY GOODBYE',11,ANS,3) CALL TRMSG('THATS ALL FOLKS!',16) RETURN END .DISABLE DATA .CLOSE F4P TSTMSG,TSTMSG/-SP=TSTMSG PIP ADSTRMSG.DMP=TSTMSG.LST/AP PIP TSTMSG.FTN;*/DE,TSTMSG.LST;* .OPEN TSTMSG.CMD .DATA TSTMSG,TSTMSG/-SP=TSTMSG,TRMSG .CLOSE TKB @TSTMSG PIP ADSTRMSG.DMP=TSTMSG.MAP/AP PIP TSTMSG.CMD;*/DE,TSTMSG.MAP;* .SETS USER .SETS COMA USER[3:3] .IF COMA NE "," .GOTO 500 .ASK ANSC DO YOU WANT THIS INSERTED IN SYSLIB.OLB .IFF ANSC .GOTO 500 .ASK ANSL DO YOU WANT A LISTING OF NEW SYSLIB.OLB .IFNINS LBR INS $LBR .IFF ANSL LBR [1,1]SYSLIB/RP=TRMSG .IFT ANSL LBR [1,1]SYSLIB/RP,ADSSYSLIB.DMP/SP/FU=TRMSG .IFINS LBR REM LBR PIP TRMSG.OBJ;*/DE .500: PIP ADSTRMSG.DMP/SP .IFT ANSA PIP TSTMSG.OBJ;*/DE