TITLE RSXVT3 - RSX-11M VTY SERVICE SUBTTL RSXVT3 - TITLE PAGE SALL ; ; ************************************************************************ ; * ; THIS PROGRAM IS PROVIDED ON AN "AS IS" BASIS ONLY. DIGITAL EQUIPMENT * ; COMPUTER USER'S SOCIETY, DIGITAL EQUIPMENT CORPORATION, MONSANTO, AND * ; THE AUTHOR DISCLAIM ALL WARRANTIES ON THE PROGRAM, INCLUDING WITHOUT * ; LIMITATION, ALL IMPLIED WARRANTIES OF MERCHANTABLITY AND FITNESS. * ; * ; FULL PERMISSION AND CONSENT IS HEREBY GIVEN TO DECUS AND TO THE DECUS * ; SPECIAL INTEREST GROUPS TO REPRODUCE, DISTRIBUTE, AND PUBLISH AND * ; PERMIT OTHERS TO REPRODUCE IN WHOLE OR IN PART, IN ANY FORM AND * ; WITHOUT RESTRICTION, THIS PROGRAM AND ANY INFORMATION RELATING THERETO * ; * ; ************************************************************************ ; ; VERSION: V02.06 ; ; AUTHOR: RW STAMERJOHN MAPS 20-SEP-77 ; ; RSX-11M VTY PROGRAM (DEC-10 TO PDP-11). ; ; BUILD INSTRUCTIONS: ; ; .COMPILE RSXVT3 ; .LOAD RSXVT3 ; .NSSAVE ; ; UNIVERSAL FILES: ; SEARCH UUOSYM ; ; MODIFICATIONS: ; ; V01.01 RWS 03-MAR-78 CORRECT HIBER WAIT CONDITION. ; ; V01.02 RWS 03-MAR-78 RESUME CHARACTER INPUT IF MARKER NOT ; SEEN IN 4 SECONDS. ; ; V02.00 RWS 15-AUG-78 MODIFY FOR DECNET PHASE II. ; ; V02.01 RWS 08-SEP-78 RENAME TO RSXVT3, USE VTY3.. ; HAS PARNTER. ; ; V02.02 RWS 08-SEP-78 ADD CONTROL-O SUPPORT ; ; V02.03 RWS 08-SEP-78 REMOVE V01.02 AND CHECK TTY INPUT ; BETWEEN TASK OUTPUTS ; ; V02.04 RWS 09-SEP-78 REMOVE SOME ERROR MESSAGES ; ; V02.05 RWS 21-SEP-78 USE TRMOP FOR TTY OUTPUT ; ; V02.06 RWS 09-OCT-78 USE TWO TSK CHANNELS, ONE FOR ; INPUT, ONE FOR OUTPUT. REQUIRED ; TO SOLVE MONITOR BUG. SUBTTL RSXVT3 - MACRO DEFINITIONS ; CREATE - CREATES I/O BUFFERS FOR IRREGULAR SIZED I/O TRANSFERS. ; ; NUMBER = NUMBER OF BUFFERS IN LIST. ; SIZE = SIZE OF A BUFFER. ; DEFINE CREATE (NUMBER,SIZE) < XLIST TOP= . REPEAT NUMBER-1, < EXP 0 XWD SIZE+1,.+SIZE+3 BLOCK SIZE+1 > EXP 0 XWD SIZE+1,TOP+1 BLOCK SIZE+1 LIST > SUBTTL RSXVT3 - SYMBOLIC DEFINITIONS ; ACCUMULATOR DEFINITIONS: F= 0 ;FLAGS T1= 1 ;TEMPORARY AC1 T2= 2 ;TEMPORARY AC2 T3= 3 ;TEMPORARY AC3 CR= 5 ;CHARACTER AC CO= 6 ;COUNTER AC PT= 7 ;POINTER AC P= 17 ;PUSHDOWN LIST POINTER ; FLAG WORD BITS: ODTMSK= 000001 ;ODT TOGGLE (0 = ON) NXTMSK= 000002 ;NEXT CHARACTER ECHO (0 = YES) OUTMSK= 000004 ;FORCE OUTPUT (0 = NO) MRKMSK= 000010 ;WAIT TILL MARKER RETURNED (0 = NO) RCVMSK= 000020 ;MARKER RECEIVED (0 = NO) OFFMSK= 000040 ;TTY OUTPUT OFF (0 = NO) ; CHARACTER DEFINITIONS: CNTRLO= 017 ;CONTROL-O CNTRLP= 020 ;SWITCH MODES (ODT). CNTRLY= 031 ;EXIT VTY SERVICE. SPACE= 040 ;ASCII SPACE (START OF SIXBIT CODE). ZERO= 060 ;ASCII ZERO. UNDER= 137 ;ASCII UNDERSCORE (END OF SIXBIT CODE). MARKR= 377 ;MARKER SYMBOL. ; I/O CHANNELS: TKICHL= 1 ;DECNET INPUT CHANNEL. TKOCHL= 2 ;DECNET OUTPUT CHANNEL. TTYCHL= 3 ;TTY CHANNEL. ; FILE STATUS ERROR MASK: ERRMSK= IO.IMP+IO.DER+IO.DTE+IO.BKT+IO.EOF ; I/O BUFFER SYMBOLICS: TSKONM= 6 ;NUMBER OF TSK OUTPUT BUFFERS. TSKINM= 6 ;NUMBER OF TSK INPUT BUFFERS. TTYINM= 6 ;NUMBER OF TTY INPUT BUFFERS. TOP11S= 40/4 ;SIZE OF BUFFERS TO PDP-11. FRP11S= 124/4 ;SIZE OF BUFFERS FROM PDP-11. SUBTTL RSXVT3 - R/W DATA DEFINITIONS TWOSEG RELOC 0 ; TSK NODE NAME: NODNAM: XWD 0,2 ; SIXBIT /XXXXXX/ ;NODE NAME. ; TSK OPEN BUFFER: TKIBLK: EXP UU.AIO+.IOBYT ;OPEN STATUS. SIXBIT /TSKXXX/ ;DEVICE NAME. XWD 0,TSKHDI ;RING BUFFER HEADERS. TKOBLK: EXP UU.AIO+.IOBYT ;OPEN STATUS SIXBIT /TSKXXX/ ;DEVICE NAME. XWD TSKHDO,0 ;RING BUFFER HEADERS. ; LOOKUP AND ENTER BLOCK FOR DECNET. ACTIVE: SIXBIT /TTYXXX/ ;ACTIVE TASK NAME (US). XWD 0,0 ; XWD 0,0 ; XWD 0,0 ; PASIVE: SIXBIT /VTY3../ ;PASSIVE TASK NAME (PDP-11). XWD 0,0 ; XWD 0,0 ; XWD 1,10 ;PPN. ; TTY OPEN BLOCK: TTYBLK: EXP UU.AIO+.IOPIM ;OPEN STATUS SIXBIT /TTY / ;DEVICE NAME. XWD 0,TTYHDI ;RING BUFFER HEADERS. ; RING BUFFERS HEADERS: TSKHDO: BLOCK 3 ;TSK OUTPUT. TSKHDI: BLOCK 3 ;TSK INPUT. TTYHDI: BLOCK 3 ;TTY INPUT. ; RING BUFFERS: TSKOBF: CREATE TSKONM,TOP11S TSKIBF: CREATE TSKINM,FRP11S TTYIBF: CREATE TTYINM,1 ; TTY TRMOP BLOCKS. SETPAG: EXP 1000+.TOPAG ;SET PAGE. EXP 0 ;TTY UDX NUMBER. EXP -1 ;DIRECTION. SETPIM: EXP 1000+.TOPBS ;SET PIM BREAK SET. EXP 0 ;TTY UDX NUMBER. EXP 0 ;NULL BREAK SET. ; LINE INPUT BUFFER. BFLINE: BLOCK 20 ;BUFFER FOR 80 CHARACTERS. ; PUSHDOWN LIST PDLSZ= 100 ;PUSHDOWN LIST SIZE. PDL: BLOCK PDLSZ ;PUSHDOWN LIST. SUBTTL RSXVT3 - R/O DATA DEFINITIONS RELOC 400000 ; CRLF STRING. CRLF: BYTE (7)15,12 ; SUBTTL RSXVT3 - INITIALIZE VTY SERVICE START: ;REF. LABEL - START OF PROGRAM. RESET ;RESET THE WORLD WHEN WE START. MOVE P,[-PDLSZ,,PDL-1] ;SETUP THE PUSHDOWN LIST. ; ; GET TERMINAL NUMBER AND SETUP APPROPRIATE WORDS. ; MOVNI T1,1 ;SET TO GET OUT TTY UDX. TRMNO. T1, ;GET TTY UDX NUMBER. HALT ; NO ERRORS EXPECTED. MOVEM T1,SETPAG+1 ;STORE FOR LATER USE MOVEM T1,SETPIM+1 ; ANDI T1,777 ;CLEAR ALL BUT TTY NUMBER IDIVI T1,^D64 ;SPLIT OFF LOW TWO DIGITS IDIVI T2,^D8 ;SPLIT OFF LOW DIGIT LSH T1,^D12 ;POSITION HIGH DIGIT LSH T2,^D6 ;POSTION MIDDLE DIGIT ADD T1,T2 ;ADD IN MIDDLE DIGIT ADD T1,T3 ;ADD IN LOW DIGIT ADD T1,[SIXBIT /TTY000/] ;FOR TTYXXX NAME MOVEM T1,ACTIVE ;STORE OUR ACTIVE NAME ; ; TELL THE USER WHO WE ARE. ; MOVEI T2,[ASCIZ /RSX-11M VTY SERVICE - V02.01/] PUSHJ P,OUTMES ;OUTPUT ANNOUCEMENT. ; ; GET THE DESIRED NODE TO CONNECT TO. ; GTNODE: OUTSTR CRLF OUTSTR [ASCIZ /NODE: /] PUSHJ P,GTLINE ;GET THE INPUT LINE. JUMPE CO,GTNODE ; IF NO INPUT, REPROMPT. CAILE CO,6 ;ONLY LOOK AT FIRST SIX CHARACTERS. MOVEI CO,6 ;SET FOR SIX CHARACTERS. MOVE T1,[POINT 6,NODNAM+1] ;SET STORAGE POINTER. SETZM ,NODNAM+1 ;CLEAR NODE NAME. GTNOD2: ILDB CR,PT ;GET CHARACTER. CAIL CR,SPACE ;SKIP IF CHARACTER BREAK. CAIL CR,UNDER ;SKIP IF CHARACTER GOOD. JRST GTNOD3 ; GOT ALL CHARACTERS. SUBI CR,SPACE ;CONVERT TO SIXBIT. IDPB CR,T1 ;STORE IN NODE NAME FIELD. SOJG CO,GTNOD2 ;LOOP THROUGH ALL CHARACTERS. GTNOD3: ; ; ; GET THE NODE NUMBER. ; MOVE T1,[.NDRNN,,NODNAM] ;GET THE REQUEST BLOCK. NODE. T1, ;ASK FOR THE NODE NUMBER. JRST NODERR ; PROCESS ERROR. ; ; FORM THE REQUIRED DEVICE NAME. ; IDIVI T1,^D8 ;SPLIT THE NODE NUMBER IN TWO. LSH T1,^D12 ;POSITION THE HIGH DIGIT. LSH T2,^D6 ;POSITION THE LOW DIGIT. ADD T1,T2 ;FORM A SINGLE WORD. ADD T1,[SIXBIT /TSK000/] ;FORM DEVICE NAME. MOVEM T1,TKIBLK+1 ;STORE IN OPEN BLOCK. MOVEM T1,TKOBLK+1 ;STORE IN OPEN BLOCK. ; ; OPEN THE COMMUNICATIONS TO THE REMOTE NODE. ; OPEN TKOCHL,TKOBLK ;OPEN THE TSK FOR OUTPUT. JRST OPNERR ; PROCESS ERROR. OPEN TKICHL,TKIBLK ;OPEN THE TSK FOR INPUT. JRST OPNERR ; PROCESS ERROR. MOVE T1,[400000,,TSKOBF+1] ;LINK TO MY RING BUFFERS. MOVEM T1,TSKHDO ; MOVE T1,[400000,,TSKIBF+1] ; MOVEM T1,TSKHDI ; MOVE T1,[POINT 8,,0] ;SETUP FOR 8 BIT BYTES DURING I/O. HLLM T1,TSKHDO+1 ;SET OUTPUT BYTE SIZE. HLLM T1,TSKHDI+1 ;SET INPUT BYTE SIZE. LOOKUP TKICHL,ACTIVE ;DECLARE INPUT LINK (PASSIVE) HALT ; NO ERRORS EXPECTED. LOOKUP TKOCHL,ACTIVE ;DECLARE US THE ACTIVE TASK. HALT ; NO ERRORS EXPECTED. ENTER TKOCHL,PASIVE ;DECLARE THE TASK TO CONNECT TO. JRST PASERR ; PROCESS ERROR. OUTPUT TKOCHL, ;SETUP OUTPUT RING BUFFERS. GTPAS4: IN TKICHL, ;INPUT RESPONSE FROM PDP-11. JRST CONTCT ; CONTINUE ON SUCCESS. STATZ TKICHL,ERRMSK ;SKIP IF NO INPUT YET. JRST TSKIER ; PROCESS ERROR. MOVE T1,[HB.RIO+100] ;GET WHAT TO SLEEP FOR. HIBER T1, ;SLEEP TILL I/O COMPLETES. HALT ; NO ERRORS EXPECTED. JRST GTPAS4 ;TRY INPUT REQUEST AGAIN. ; ; TELL USER CONNECTION IS COMPLETE. ; CONTCT: ILDB T1,TSKHDI+1 ;GET PDP-11 TTY NUMBER. MOVEI T2,[ASCIZ /CONNECTION COMPLETE TO RSX-11M VTY #/] PUSHJ P,OUTNUM ;OUTPUT MESSAGE. MOVEI T2,[ASCIZ /TYPE ^Y TO BREAK CONNECTION, ^P FOR ODT TOGGLE/] PUSHJ P,OUTMES ;OUTPUT MESSAGE. OUTSTR CRLF ;OUTPUT BLANK LINE. ; ; COMPLETE TTY SETUP. ; MOVE T1,[3,,SETPAG] ;GET TRMOP COMMAND. TRMOP. T1, ;ISSUE TRMOP. HALT ; NO ERRORS EXPECTED. MOVE T1,[3,,SETPIM] ;GET PIM BREAK SET. TRMOP. T1, ;ISSUE TRMOP. HALT ; NO ERRORS EXPECTED. OPEN TTYCHL,TTYBLK ;OPEN TTY FOR PIM I/O. HALT ; NO ERRORS EXPECTED. MOVE T1,[400000,,TTYIBF+1] ; MOVEM T1,TTYHDI ; MOVE T1,[POINT 8,0] ;SET BYTE SIZE. HLLM T1,TTYHDI+1 ;SET INPUT BYTE SIZE. ; ; SET INITIAL FLAGS MASK. ; SETZ F, ;INITIAL FLAGS ARE ZERO. ; ; TELL USER INITIAL ODT MODE SETTING. ; MOVEI T2,[ASCIZ /^P [ENTERING ODT MODE]/] PUSHJ P,OUTMES ;OUTPUT MESSAGE. OUTSTR [ASCIZ />/] ;OUTPUT RSX-11M PROMPT. SUBTTL RSXVT3 - SERVICE VTY WAIT: ;REF. LABEL. MOVE T1,[HB.RIO+HB.RTC+^D4000] ;GET WHAT TO SLEEP FOR. HIBER T1, ;SLEEP TILL I/O COMPLETES. HALT ; NO ERRORS EXPECTED. ; ; SEE IF TTY INPUT BLOCKED. ; INTST: TRNE F,MRKMSK ;SKIP IF BLOCKED. JRST INTSK ; TRY FOR TSK INPUT. ; ; TRY TTY TO SEE IF IT HAS ANY I/O TO DO. ; INTTY: IN TTYCHL, ;TRY INPUTTING FROM TTY. JRST INTTY2 ; YEA, IT DOES. STATZ TTYCHL,ERRMSK ;WAS ERROR REAL? HALT ; NO ERRORS EXPECTED. JRST INTSK ; NO, TRY TASK FOR INPUT. ; ; GET CHARACTERS AND OUTPUT TO PDP-11. ; INTTY2: SOSGE TTYHDI+2 ;SKIP IF CHARACTER. JRST INTTY ; TRY FOR MORE INPUT. ILDB CR,TTYHDI+1 ;GET CHARACTER. TRZ CR,200 ;SET PDP-11 TO ECHO CHARACTER. CAIN CR,CNTRLY ;IS THIS EXIT CHARACTER. JRST FINISH ; YES, TERMINATE. CAIN CR,CNTRLP ;IS THIS ODT TOGGLE. JRST TOGGLE ; YES, TOGGLE ODT. CAIN CR,CNTRLO ;IS THIS CONTROL-O TRO F,OFFMSK ; YES, TURN OUTPUT OFF CAIN CR,CNTRLO ;IS THIS CONTROL-O CLRBFO ; YES, CLEAR OUTPUT BUFFERS TRNN F,ODTMSK ;ARE WE IN ODT MODE. JRST INTTY5 ; YES, FORCE OUTPUT. CAIGE CR,SPACE ;IS THIS A BREAK CHARACTER. JRST INTTY3 ; YES, FORCE OUTPUT. CAILE CR,UNDER ;TEST FURTHER. JRST INTTY3 ; YES, FORCE OUTPUT. TRZE F,NXTMSK ;DOES CHARACTER FOLLOW BREAK. JRST INTTY4 ; YES, FORCE OUTPUT. OUTCHR CR ;OUTPUT CHARACTER TRO CR,200 ;SET CHARACTER ALREADY ECHOED. JRST INTTY6 ; INTTY3: TRO F,NXTMSK ;SET TO NOT ECHO NEXT CHARACTER ALSO. INTTY4: PUSHJ P,PUTTSK ;OUTPUT TO PDP-11. JRST TSKOER ; REPORT ERROR. TRO F,MRKMSK ;SET TO WAIT FOR MARKER. MOVEI CR,MARKR ;GET MARKER SYMBOL. INTTY5: TRO F,OUTMSK ;FORCE OUTPUT TO PDP-11. INTTY6: PUSHJ P,PUTTSK ;OUTPUT TO PDP-11. JRST TSKOER ; REPORT ERROR. TRNE F,MRKMSK ;WAS MARKER SENT? JRST INTSK ; YES, ONLY TRY FOR TASK INPUT. JRST INTTY2 ;TRY FOR ANOTHER CHARACTER. ; ; TOGGLE ODT FLAG. ; TOGGLE: MOVEI T2,[ASCIZ /^P [ENTERING ODT MODE]/] TRCN F,ODTMSK ;TOGGLE AND SKIP IF SET ON. MOVEI T2,[ASCIZ /^P [LEAVING ODT MODE]/] PUSHJ P,OUTMES JRST INTTY2 ;TRY FOR ANOTHER CHARACTER. ; ; TRY FOR TSK INPUT. ; INTSK: IN TKICHL, ;TRY INTPUTTING FROM TSK. JRST INTSK2 ; YEA, IT DOES. STATZ TKICHL,ERRMSK ;WAS ERROR REAL? JRST TSKIER ; YES. TRZE F,RCVMSK ;WAS A MARKER RECEIVED? JRST INTTY2 ; YES, TRY FOR REMAINING TTY INPUT. JRST WAIT ;LOOP TO WAIT STATE. ; ; GET CHARACTERS AND OUTPUT TO TTY. ; INTSK2: SOSGE TSKHDI+2 ;SKIP IF CHARACTER. JRST INTST ; SEE IF MORE TTY INPUT. ILDB CR,TSKHDI+1 ;GET CHARACTER. CAIN CR,MARKR ;SKIP IF NOT MARKER. JRST INTSK3 ; GO TURN MARK WAIT FLAG OFF. CAIN CR,CNTRLO ;SKIP IF NOT CONTROL-O JRST INTSK4 ; GO TURN OUTPUT ON TRNE F,OFFMSK ;IS OUTPUT TURN OFF? JRST INTSK2 ;YES, JUST EMPTY BUFFER OUTCHR CR ;OUTPUT CHARACTER. JRST INTSK2 ;LOOP FOR MORE CHARACTERS. INTSK3: TRZ F,MRKMSK ;TURN OFF WAIT BIT. TRO F,RCVMSK ;TURN ON MARKER RECEIVED BIT. JRST INTSK2 ;TRY FOR ANOTHER CHARACTER. INTSK4: TRZ F,OFFMSK ;TRUN OUTPUT ON JRST INTSK2 ;GET MORE OUTUT SUBTTL RSXVT3 - ERROR PROCESSING ; THIS CODE DETERMINES WHAT TYPE OF ERROR MESSAGE TO OUTPUT FOR THE ; VARIOUS ERRORS THAT CAN OCCUR. EACH ENTRY CLASSIFES THE ERROR AND ; JUMPS TO THE APPOPRIATE MESSAGE OUTPUT. ; ; PROCESS NODE ERRORS. ; NODERR: JRST ERRN02 ;OUTPUT ?VTYUNE. ; ; PROCESS OPEN ERRORS. ; OPNERR: JRST ERRN03 ;ALL OPEN ERRORS ARE %VTYNTS. ; ; PROCESS PASIVE ERRORS (FROM ENTER). ; PASERR: HRRZ T1,PASIVE+1 ;GET ERROR CODE. JRST ERRN07 ; OUTPUT ?VTYUEE. ; ; PROCESS TSK OUTPUT ERRORS. ; TSKOER: GETSTS TKOCHL,T1 ;GET TASK I/O STATUS. JRST ERRN08 ; ALL OUTPUT ERRORS ARE UNDEFINED. ; ; PROCESS TSK INPUT ERRORS. ; TSKIER: GETSTS TKICHL,T1 ;GET TASK I/O STATUS. JRST ERRN09 ; ALL INPUT ERRORS ARE UNDEFINED. SUBTTL RSXVT3 - ERROR MESSAGES ; ; THIS CODE ARE THE VARIOUS ERROR MESSAGES. THE APPROPRIATE MESSAGES IS ; SELECTED FROM THE PREVIOUS PAGE. ; ERRN02: MOVEI T2,[ASCIZ /?VTYUNE - UNDEFINED NODE ERROR #/] PUSHJ P,OUTNUM ;OUTPUT MESSAGE. JRST FINISH ;EXIT PROGRAM. ERRN03: MOVEI T2,[ASCIZ /%VTYNTS - NO TASK DEVICE AVAILABLE AT SELECTED NODE/] PUSHJ P,OUTMES ;OUTPUT MESSAGE. JRST GTNODE ;GET ANOTHER NODE NAME. ERRN07: MOVEI T2,[ASCIZ /?VTYUUE - UNDEFINED ENTER ERROR #/] PUSHJ P,OUTNUM ;OUTPUT MESSAGE. JRST FINISH ;EXIT PROGRAM. ERRN08: MOVEI T2,[ASCIZ /?VTYTOE - TASK OUTPUT ERROR #/] PUSHJ P,OUTNUM ;OUTPUT MESSAGE. JRST FINISH ;EXIT PROGRAM. ERRN09: MOVEI T2,[ASCIZ /?VTYTIE - TASK INPUT ERROR #/] PUSHJ P,OUTNUM ;OUTPUT MESSAGE. JRST FINISH ;EXIT PROGRAM. SUBTTL RSXVT3 - RELEASE CHANNELS AND EXIT FINISH: ;REF. LABEL - END OF PROGRAM. RELEASE TKOCHL, ;RELEASE TSK OUTPUT CHANNEL. RELEASE TKICHL, ;RELEASE TSK INPUT CHANNEL. RELEASE TTYCHL, ;RELEASE THE TTY. EXIT 0, ;EXIT SUBTTL PUT??? - OUTPUT ROUTINES ; OUTPUT CHARACTER IN CR TO TSK. PUTTSK: IDPB CR,TSKHDO+1 ;PUT CHARACTER IN BUFFER. SOSG TSKHDO+2 ;COUNT AND SKIP IF NOT FULL. JRST OUTTSK ; OUTPUT BUFFER. TRZN F,OUTMSK ;SKIP IF WE ARE TO FORCE OUTPUT. JRST SUCESS ; RETURN TO CALLER. OUTTSK: TRZ F,OUTMSK ;SET FORCE OUTPUT CLEAR. OUT TKOCHL, ;OUTPUT BUFFER. JRST SUCESS ; TAKE SUCESS EXIT. STATZ TKOCHL,ERRMSK ;WAS ERROR REAL. POPJ P, ; YES TAKE ERROR EXIT. JRST OUTTSK ; NO, TRY UNTIL WE SUCCED. ; TAKE SKIP RETURN ON NO ERRORS. SUCESS: AOS (P) ;TAKE SKIP RETURN. POPJ P, ;RETURN TO CALLER. SUBTTL OUTXXX - VARIOUS MESSAGE OUTPUT ROUTINES ; OUTPUT MESSAGE IN T2, NUMBER IN T1. OUTNUM: OUTSTR CRLF ;OUTPUT BLANK LINE. OUTSTR (T2) ;OUTPUT MESSAGE. PUSHJ P,OCTO ;OUTPUT NUMBER. OUTSTR CRLF ;OUTPUT LINE. POPJ P, ;RETURN TO CALLER. ; OUTPUT MESSAGE IN T2. OUTMES: OUTSTR CRLF ;OUTPUT BLANK LINE. OUTSTR (T2) ;OUTPUT MESSAGE. OUTSTR CRLF ;OUTPUT LINE. POPJ P, ;RETURN TO CALLER. ; OCTAL OUTPUT ROUTINE, OUTPUT NUMBER IN T1. OCTO: IDIVI T1,10 ;GET FIRST DIGIT. JUMPE T1,OCTC ;JUMP IF NO MORE TO DO. HRLM T2,(P) ;STORE CHARACETER AWAY ON STACK. PUSHJ P,OCTO ;AND DIVIDE AGAIN. HLRZ T2,(P) ;RETRIEVE CHARACTER. OCTC: ADDI T2,ZERO ;CONVERT TO ASCII. OUTCHR T2 ;AND TYPE. POPJ P, ;RETURN TO CALLER. SUBTTL GTLINE - INPUT LINE FROM TTY ; THIS ROUTINE INPUTS A LINE FROM THE TTY AND RETURNS TO THE CALLER ; A BYTE POINTER FOR PROCESSING CHARACTERS AND A CHARACTER COUNT. IT ; CONVERTS LOWER-CASE TO UPPER BEFORE STORING THE CHARACTER. ; ; CALLING SEQUENCE: ; ; CALL BY: PUSHJ P,GTLINE ; ; CALL WITH: NO ARGUMENTS REQUIRED. ; ; EXITS WITH: T1 = END-OF-LINE CHARACTER. ; CO = COUNT OF CHARACTERS IN BUFFER. ; PT = BYTE POINTER TO BUFFER. ; ; SPECIAL NOTES: ; ; THE END-OF-LINE CHARACTER IS NOT STORED IN THE BUFFER OR COUNTED. ; GTLINE: ;REF. LABEL. SETZ CO, ;SET COUNT TO ZERO. MOVE PT,[POINT 7,BFLINE] ;GET CHARACTER STORAGE POINTER. GTLIN2: INCHWL T1 ;INPUT CHARACTER. CAIG T1,SPACE ;SKIP IF NOT TERMINATOR. JRST GTLIN3 ; ALL DONE. CAILE T1,UNDER ;SKIP IF UPPER CASE. SUBI T1,40 ;CONVERT TO UPPER CASE. IDPB T1,PT ;STORE CHARACTER IN BUFFER. AOJA CO,GTLIN2 ;COUNT AND LOOP. GTLIN3: MOVE PT,[POINT 7,BFLINE] ;RESET CHARACTER STORAGE POINTER. CLRBFI ;CLEAR ANY MORE OF LINE. POPJ P, ;RETURN TO CALLER. END START