/7 TTY DRIVER TASK FOR RTS8 V2B 25-SEP-76 VERS= 1 XLIST 1 /COPYRIGHT HAS APPEARED IN PARAM.PA / / / / / / / / / /COPYRIGHT (C) 1975,1976 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / XLIST 0 /WANT TO LIST TASK /EDIT HISTORY: / FEATURES ADDED BY S.R. ON 16-JUL-75: /1. CTRL/S, CTRL/Q /2. AUTOMATIC CR/LF AFTER TTY WIDTH REACHED (USU 80 COLS) /3. RE-ECHOING OF PROMPT LINES ON CTRL/U /4. BACKSPACE FACILITY FOR RUBOUT ON SCOPE TERMINALS /5. CTRL/U PRINTS "^U" /6. TAB OPTIONS /7. FILL OPTIONS / 4-AUG-75: COMBINED IN OLD TTY HANDLER / 25-NOV-75: ADDED KL8A SUPPORT / 29-DEC-75: ADDED WIDTH-IGNORING CODE / 23-JUN-76 REVISED KL8A SUPPORT / 25-Sep-76 FIXED WIDTH IGNORING CODE / FIXED ^S BUG. / FIXED BUG CONCERNING LINES WITH MORE THAN 4096 CHARS / 07-OCT-76 ADDED TTLOC AND TTFLD / ADJUSTED DEVICE CODE FOR MULTIPLE KL8A'S / ADDED GENERAL POWER FAIL CODE /TASK DATA BLOCK: INIWT= 0 IFNDEF TTFLD IFNDEF TTLOC IFNDEF TTDEV IFNZRO TTDEV-4&4000 IFNZRO TTDEV&6000 IFNDEF KBDEV IFNZRO KBDEV&6000 IFNDEF CONSOL /DEFAULT IS CONSOLE IFNDEF TASK /TASK COULD BE DEFINED IN CONTROL FILE IFNDEF VT50 /SET TO 0 IF DON'T WANT ^S, ^Q FEATURE IFNDEF SCOPE /SET TO 1 IF TTY CAN DO A BACKSPACE IFNDEF FILL /NUMBER OF FILL CHARACTERS AFTER CR/LF IFNDEF WIDTH /TTY LINE WIDTH IFNDEF TAB /SET TO 1 IF TTY HAS HARDWARE TABS IFNDEF OLDTTY /SET TO 1 TO GET OLD VERSION 1 TTY TASK IFNDEF LSTBOT /SET TO 1 TO LIST BOTH VERSIONS CUR=TTFLD IFZERO TTDEV&100 < KSFX= KBDEV^10+6001 KRBX= KBDEV^10+6006 TSFX= TTDEV^10+6001 TCFX= TTDEV^10+6002 TSKX= TTDEV^10+6005 /PDP 8/E ONLY TLSX= TTDEV^10+6006 > IFNZRO TTDEV&100 < IFNDEF KL8ADV /DEFINE KL8A IO CODE KLNUM=TTDEV&77%4 /KL8A NUMBER IFNZRO KL8A-KLNUM&4000 /MUST BE .LE. 'KL8A' KLNUM=KLNUM^2 /DEVICE CODES COME IN PAIRS TLSX= KL8ADV+KLNUM^10+6004 > /THE RTS-8 TELETYPE DRIVER PRINTS AND INPUTS LINES OR CHARACTER /STRINGS ON A TELETYPE. THE INPUT AND OUTPUT DEVICE CODES OF /THE TELETYPE ARE SPECIFIED (RESPECIVELY) BY THE PARAMETERS /"KBDEV" AND "TTDEV". IF THE PARAMETER "CONSOL" IS NOT DEFINED TO /BE ZERO, THE TELETYPE IS ASSUMED TO BE THE CONSOLE TELETYPE /AND WILL INVOKE THE MCR WHENEVER ^C IS TYPED ON IT. /THE FORMAT OF TTY DRIVER MESSAGES ARE: /WORD 1 USED AS EVENT FLAG FOR MESSAGE /WORDS 2-3 USED BY RTS-8 /WORD 4 FLAGS WORD - FLAGS ARE: / BIT 0 0=PACKED OUTPUT MESSAGE, 1=UNPACKED / BIT 1 0=PUT CRLF AFTER MESSAGE, 1=DO NOT / BIT 2 0=OUTPUT MESSAGE BEGINS AT WORD 6, 1= OUTPUT MESSAGE / POINTED TO BY WORD 6 / BIT 3 0=INPUT IS LINE ORIENTED, WITH EDITING / 1=INPUT IS COUNT ORIENTED W/O EDITING OR ECHOING / BIT 4 0=PERFORM I/O INDICATED BY OTHER BITS / 1=ASSIGN TTY DRIVER TO TASK IN BITS 5-11 / BITS 5-11 MAX # CHARS IN INPUT BUFFER (0 MEANS 4096) / OR TASK TO ASSIGN DRIVER TO (IF BIT 4=1) /WORD 5 IF ZERO, NO INPUT - ELSE POINTS AT INPUT BUFFER /WORD 6 OUTPUT MESSAGE OR POINTER TO MESSAGE /IF TTDEV OR KBDEV HAS FORM 100+LINE, THEN THIS /INDICATES THAT LINE OF KL8A IS TO BE USED. XLIST 1-LSTBOT IFZERO OLDTTY < XLIST 0 FIELD CUR%10 *TTLOC / / TEMPORARY / START, IFZERO TTDEV&100 < CAL SKPINS TTINT IFZERO PDP8E < /ONLY NEED 1 SKIP CHAIN ENTRY ON 8/E CAL SKPINS KBINT > > IFNZRO TTDEV&100 < IOF TAD MF /GET KL8A LINE # TO AC CIF 0 /CONNECT ROUTINE IN FIELD 0 JMS I MEVFLG /CONNECT TO KL8A LINE KBINT /KEYBOARD INT ADR TTINT /PRINTER INT ADR > IFDEF PWRF < CAL SENDW PWRF /SEND DERAIL ADDRESS TO POWER FAIL TASK PWMSG > IFDEF CANCLL < CAL SENDW EMS /DERAIL ADDR FOR READ CANCELL CANMSG > IFNZRO .&17-13&4000 < 1> /WORK LOC'S IF NEEDED IFNZRO .&17-13&4000 < 1> /WORK LOC'S IF NEEDED IFNZRO .&17-13&4000 < 1> /WORK LOC'S IF NEEDED IFNZRO .&17-13&4000 < 1> /WORK LOC'S IF NEEDED IFNZRO .&17-13&4000 < 1> /WORK LOC'S IF NEEDED IFNZRO .&17-13&4000 < 1> /WORK LOC'S IF NEEDED IFNZRO .&17-13&4000 < 1> /WORK LOC'S IF NEEDED IFNZRO .&17-13&4000 < 1> /WORK LOC'S IF NEEDED IFNZRO .&17-13&4000 < 1> /WORK LOC'S IF NEEDED IFNZRO .&17-13&4000 < 1> /WORK LOC'S IF NEEDED IFNZRO .&17-13&4000 < 1> /WORK LOC'S IF NEEDED / CDFMSG=.-1 /SUBROUTINE ENTRY POINT ADDR MSGCDF, JMP TTMSLP /START FETCHING MESSAGE JMP I CDFMSG /EXIT FROM CDF SUBROUTINE / / REUSE SETUP CODE FOR WORK LOCATIONS / MADDR=START /!!THIS MUST BE FIRST LOC ON PAGE !! FLAGS=START+3 /WARNING! FLAGS AND INPCNT MAY NOT BOTH / /BE INIT'ED WITH THE 400 BIT SET !! TTIEV=START+1 /MUST INIT >=0 ! SAVM=START+2 REPLYY=START+4 TTEV=START+10 /MUST BE INIT'ED WITH A VALUE >=0 !! / IFZERO TTDEV&100 IFNZRO TTDEV&100 / IFDEF WIDTH IFNDEF WIDTH / WADJ=WIDTH+1&7 WADJN=10-WADJ /DEFINITELY TRUE / / OUTJ, JMS TTOUTR /IMAGE OUTPUT CALLS TTOUTR NOT OUT JMP TTOLP /BACK TO TTY OUTPUT LOOP POPT, CLL RTR /CHAR 1; SHIFT DOWN RTR RTR JMS POPV /LEAVING POINTER FOR SECOND ACTION POP2, ISZ SAVM /MOVE TO NEXT JMS POPV /POINTER TO FIRST ACTION POP1, JMP POPT /POP1 AND POPIM MUST BE ADJACENT POPIM, ISZ SAVM /IMAGE, ONE PER WORD AND (177 M40, SZA /DONE? SZA IS LITERAL 40 IN LOW 7 BITS JMP OUTJ /NO CKCRLF, TAD FLAGS AND L2200 /200 BIT NOT ON; CHECK FOR CR BREAK, SNA CLA /BREAK ENTRY FROM ^O ALWAYS SKIPS CTRLU, JMS CRLF TAD REPLYY SZA /IS THERE INPUT REQUIRED? JMP SETINP /SET UP INPUT EORPLY, JMS RELES /FORCE OUT OF INTERRUPT LEVEL IFDEF CANCLL < STA /DISABLE READ CANCELL DCA TSKNO > TAD MSGCDF DCA MF TAD MEVFLG CAL /POST THE SENDER'S EVENT FLAG POST /SO HE'LL KNOW HE GOT HIS INPUT MF, TTDEV&77^4 /INITIALIZATION LITERAL FOR KL8A CODE / / START OF PROCESSING LOOP / TTMSLP, TAD ASGNEE /GET ASIGNEE (IF ANY) CAL RECEIV /TAKE THE MESSAGE OFF THE Q IFZERO TTDEV&100 < MEVFLG, 0 /GETS ADDRESS OF MESSAGE > IFNZRO TTDEV&100 < MEVFLG, KL8ACT /LITERAL FOR INITIALIZATION > DCA MSGCDF /FIELD OF MSG IN AC AC7775 TAD MEVFLG /MAKE A COPY OF ADDR DCA MADDR JMS CDFMSG /ADDR FIELD FOR CALLER TAD I MADDR DCA FLAGS /FIRST WORD OF MESSAGE IS FLAGS L2200, ISZ MADDR TAD I MADDR DCA REPLYY /2D WORD OF MESSAGE IS ADDRESS FOR ISZ MADDR /REPLY FROM KBD (0 IF NONE WANTED) IFDEF CANCLL < TAD I MEVFLG /FETCH CALLING TASK NO AND L77 DCA TSKNO /FOR CHECK WHEN CANCELLING > TAD FLAGS AND L1200 RTL /TEST BITS TO #0 AND #2 SMA SZA /SKIP UNLESS ASSIGN (ONLY ORIGINAL 200) JMP ASSIGN /YES - JUST ASSIGN TTY TO SENDER SMA CLA /BIT 1000 OF FLAG WORD INDICATES JMP CTRLU2 /IF MESSAGE OR POINTER TO IT FOLLOWS TAD I MADDR DCA MADDR L1200, /LITERAL 1200 CTRLU2, TAD MADDR DCA SAVM TAD FLAGS SPA CLA /SKIP IF PACKED IAC /IMAGE, POINT TO POPIM TAD (POP1 /INIT CHAR FETCHER DCA POPV JMP TTOLP /JOIN UP OUTPUT LOOP / /LOOP TO UNPACK AND OUTPUT MESSAGE / POPV, 0 /COME BACK HERE FROM POP1, POP2 AND L77 SNA JMP CKCRLF TAD M40 /CONVERT SIXBIT TO ASCII AND L77 TAD M40 /OUT PUTS IN HIGH BITS ISZ COLCNT /RUN OUT OF ROOM ON LINE ? SKP /SKP TO OUTPUT CHAR JMS CRLF /SPIN ANOTHER LINE, CRLF SAVES AC JMS OUT /PACKED GOES DIRECT TO OUT! TTOLP, JMS CDFMSG TAD I SAVM /CHAR , IN SOME FORM, TO AC CDF CUR /DEFAULT IS CURRENT FIELD JMP I POPV /DISPATCH TO CORRECT ACTION / /GO TO POP1, POP2, POPIM / / SET UP INPUT / SETINP, DCA REPLY /COPY OF BUFFER POINTER TO INCREMENT TAD FLAGS /FETCH UP COUNT AND (177 CIA JMP RPLYL1 /GO OUT TO INPUT PAGE / L77, 77 /LITERAL / / ASSIGN TTY TO A SPECIFIC USER / ASGNEE, 0 /THIS ONE / ASSIGN, TAD FLAGS /ENTER AC=1000, IN CASE RELEVANT AND L77 /STRIP TO TASK NO DCA ASGNEE /SAVE AS ASSIGNED TASK JMP EORPLY / / / CONTROL U PROCESSING HERE TO REDUCE LITERALS / CTU, TAD (136 / THIS IS ^ JMS TTOUTR TAD (125 / AND THIS A U JMS TTOUTR TAD FLAGS /REPROMPT FEATURE? CLL RTL SNL CLA JMP CTRLU /NO, REDO INPUT JMS CRLF /YES, REDO OUTPUT AND INPUT JMP CTRLU2 / IFDEF CANCLL < / XX, 0 /ARGUMENT HOLDER, NOT USED HERE TSKNO, -1 /SEMOPHORE AND ENTRY POINT CDF CUR DCA BUSY /TURN OFF OUTPUT JMP SHTDWN /GO SHUT DOWN INPUT / > PAGE / L400, 400 /MUST BE FIRST LOC ON PAGE / / LOW LEVEL TELETYPE OUTPUT CODE / / OUT, 0 AND (177 /177 MUST BE LAST LITERAL ON PAGE IFZERO TTDEV&100 IFNZRO TTDEV&100 / CNTLO, IOF /IOF, UNLESS CONTROL O, THEN CONVERTED TO / /A JMP BREAK TO FINISH OUTPUT / CNTLS, TLSX /TLSX, UNLESS CONTROL S, THEN CONVERTED TO / /A DCA QSWAIT, TO SAVE CHAR AND WAIT FOR ^Q / BUSY, 0 /0 IF OUTPUT NOT BUSY, SNA CLA IF BUSY / JMP SETBSY /0 IN BUSY FALLS THRU, GO SET BUSY ON FIRST / /OUTPUT THRU / POSTZ, CIF 0 /GENERAL EXIT ROUTINE IF TO 0 FOR POSTDS POSTDS / LM17, -17 /LITERAL TO CHECK CONTROL O / / / RELES IS CALLED TO RETURN TO BACKGROUND LEVEL / RELES, 0 TAD BUSY /AT INTERRUPT LEVEL LSNCL, SNA CLA /SKIP IF YES JMP I RELES /NO, JUST RETURN DCA BUSY /CLEAR INTERRUPT LEVEL FLAG TAD LTTEV /EVENT VARIABLE ADDR FOR POST JMP POSTZ /POST IT, AND RELES INTERRUPT SETBSY, CLA /SET THE BUSY FLAG TTY15, TAD LSNCL /GET A SNA CLA DCA BUSY CAL /WAIT WAITX LTTEV, TTEV ISZ I LTTEV /RETURN TO DEFAULT UNPOSTED STATE JMP I RELES /NASTY, AFTER ALL INTERRUPT STUFF, A JMS RELES / /POSTS TTEV / / / / XOFF ON A CONTROL S REPLACE TLSX WITH A DCA QSWAIT / XOFF, TAD LITQS /NEW FLAG SETTING; DCA QSWAIT DCA CNTLS JMP POSTZ /INPUT INTERRUPT / / XON ON A CONTROL Q TO ESTABLISH TLSX AND CHECK IF / THERE IS SUSPENDED OUTPUT / XON, TAD LTLSX /NEW FLAG SETTING DCA CNTLS TAD QSWAIT /SUSPENDED CHAR WAITING? SNA /SKIP IF YES JMP POSTZ /NO, JUST EXIT INTERRUPT DCA INCH /SAVE SUSPENDED CHAR LITQS, DCA QSWAIT /WHILE WE ZERO THE FLAG TAD INCH /CHAR BACK IN AC TO PRINT JMP CNTLO /MUST CHECK IF ^O HAPPENED / TTINT, IFZERO TTDEV&100 < ZBLOCK 2 /USED FOR LINKING INTO SKIP CHAIN IFZERO PDP8E IFNZRO PDP8E /CHECK FOR KEYBOARD OR PRINTER JMP I TTINT CDF CIF CUR IFNZRO PDP8E < TSFX /WHICH ONE? JMP KBINT /KEYBOARD > > IFZERO TTDEV&100 TAD BUSY /INPUT ALIVE SZA CLA /SKIP IF NOT JMP I OUT /RETURN TO FETCH MORE CHAR'S JMP POSTZ /?? WHY DID WE GET HRE KBINT, IFZERO TTDEV&100 < IFZERO PDP8E < ZBLOCK 2 /FOR LINKING INTO SKIP CHAIN KSFX JMP I KBINT CDF CIF CUR > KRBX /READ CHARACTER AND CLEAR FLAG > IFNZRO TTDEV&100 < AND L377 /STRIP ONLY IF KL8A > DCA INCH /HOLD TAD FLAGS /NOEDIT INPUT CHECK L200, AND L400 /THIS BIT ON IF NOEDIT AND INPCNT /AND ON IN THIS WORD IF STILL COUNT LEFT! SZA CLA /SKIP ON REGULAR PROCESSING JMP NOEDIT /NOEDIT AT INTERRUPT LEVEL TAD INCH L377, AND (177 /7 BITS FOR ANALYSIS INJOIN, DCA INCH /ON END OF NOEDIT SEND DOWN -1 TAD INCH /START CHECK SPECIAL CHARS TTY12, TAD LM17 /CHECK FOR CONTROL O IFZERO VT50 < IFZERO CONSOL < SNA CLA JMP INTCTO > IFNZRO CONSOL < SNA JMP INTCTO TAD (-3+17 SNA CLA JMP GETMCR > > IFNZRO VT50 < SNA /SKIP IF NOT JMP INTCTO /INTERRUPT CONTROL O TAD (+17-21 /CHECK FOR CONTROL Q SNA JMP XON TAD (+21-23 /CHECK FOR CONTROL S IFNZRO CONSOL < SNA JMP XOFF TAD (-3+23 /CHECK FOR CONTROL C SNA CLA JMP GETMCR > IFZERO CONSOL < SNA CLA JMP XOFF > > TAD (IOF /DEFAULT SWITCH, NO CONTROL O DCA CNTLO TAD (TTIEV /POST JMP POSTZ / INTCTO, TAD (JMP BREAK /CONTROL O SET OUTPUT SWITCH DCA CNTLO JMP POSTZ /DON'T WAKE DOWNSTAIRS / / TREAT NO EDIT INPUT / NOEDIT, JMS PUSH /PLACE CHAR IN BUFFER ISZ INPCNT /RETURN HERE, DONE JMP POSTZ /NO, DISMISS INTERRUPT STA /INCH TO -1 TO WAKE BACKGROUND JMP INJOIN / / ACTIVE MCR FOR CONTROL C / IFNZRO CONSOL < GETMCR, TAD TTIEV /SET TTIEV IF NOT ALREADY SET SNA CLA /SKIP IF SET ISZ TTIEV /SO SET IT CDF CIF 0 /MCR FLAG IN FIELD 0 TAD (MCREF POSTDS > / / PRINT CARRIAGE RETURN (FILLED ) AND LF / / / HEADER FOR CANCELL INITIALIZATION MESSAGE / CANMSG, COLCNT, 0 /ALSO USE LATER AS COLUMN COUTER T, 0 /TEMPORARY FOR CRLF INPCNT, 0 /COUNT FOR INPUT CONTROL TSKNO /MESSAGE DATA, POINT TO DERAIL ROUTINE / /DUMMY LOCATION (CRLF ENTRY POINT HERE USED) / /MUST FOLLOW TSKNO CRLF, 0 DCA T /SAVE AC THRU CALL! TAD TTY15 / JMS OUT TAD TTY12 JMS OUT TAD (-WIDTH-1 /RESET PER LINE COUNTER; -1 FOR PRETEST DCA COLCNT /CLEAR COLUMN COUNTER FOR TABS IFZERO FILL-1&4000 IFZERO FILL-2&4000 IFZERO FILL-3&4000 IFZERO FILL-4&4000 IFZERO FILL-5&4000 TAD T /RESTORING AC JMP I CRLF / IFNDEF PWRF < LTLSX, TLSX /LITERAL TLSX INCH, 0 /WORK LOC'S WHEN NO POWER FAIL QSWAIT, 0 > IFDEF PWRF < PWMSG, 0 /MESSAGE HEADER TO SEND ADDR TO PWRF INCH, 0 /DOUBLEAS WORK LOCATIONS QSWAIT, 0 DRLADR, . /ADDR IN MESSAGE, THEN ENTRY POINT DCA PWMSG /SAVE AC. / /ROUTINE DOESN'T DESTROY LINK. / /ROUTINE DOESN'T RELY ON INDERECT ADDR DCA INCH /CLEAR PENDING INPUT IFNZRO TTDEV&100 LTLSX, TLSX /SHOOOT NUL CHAR TO WAKE IFNZRO TTDEV&100 TAD PWMSG /SET UP AC JMP I DRLADR /RETURN > / PAGE / /INPUT REPLY FROM KEYBOARD / REPLY, 0 /BUFFER POINTER IN THIS PAGE / REPTOP, TAD (215 /AC HAS 7BIT CHAR-15 JMS CDFMSG /SET DATA FIELD FOR MESSAGE DCA I REPLY /STORE IT TAD I REPLY /PUT BACK IN AC FOR ECHOING CDF CUR /BACK TO OUR FIELD JMS TTOUTR /ECHO IT ISZ REPLY /MOVE PLACEMENT POINTER RPLYLP, JMS RELES /BACK TO BACKGROUND LEVEL CAL WAITX LTTIEV, TTIEV /WAIT FOR KEYBOARD STRIKE ISZ I LTTIEV /IMMEDIATELY SET EVENT FLAG AGAIN TAD INCH SNA /TOSS OUT NULL CHAR TTY10, JMP RPLYLP SPA /MINUS IN INCH SIGNALS END OF NOEDIT INPUT JMP EORPLY TAD (-25 /CHECK FOR CONTROL U SNA JMP CTU /GOT ONE TAD (+25-33 /CHECK FOR ALT MODE SZA /ALT MODES COLLECT IN SZA SKIP CHAIN TAD (+33-176 /CHECK ANOTHER KIND OF ALT MODE SMA SZA JMP RUBOUT /X - 176 GT 0 - X MUST BE 177 TTY40, SZA IAC SNA JMP ALTMOD /ALT MODE IS SPECIAL END-OF-LINE DELIMITER TAD (+175-15 /CHECK FOR CARRIAGE RETURN SNA /SKIP IF NOT, LEAVING CHAR-15 IN AC JMP CARRET ISZ INPCNT /IS THERE ROOM IN THE BUFFER? JMP REPTOP /YES, NORMAL PROCESSING STA RPLYL1, DCA INPCNT /SET INPUT CHAR COUNT JMP RPLYLP /CONTINUE /SPECIAL CHARACTER PROCESSING RUBOUT, TAD REPLYY /AC=1 ON ENTRY! CIA TAD REPLY /ARE WE AT THE BEGINNING SPA CLA /OF THE REPLY LINE? JMP RPLYLP /YES IFZERO SCOPE < TAD (134 JMS TTOUTR /OUTPUT A BACKSLASH > IFNZRO SCOPE < TAD TTY10 /BACKSPACE JMS OUT TAD TTY40 JMS OUT TAD TTY10 /BACKSPACE AGAIN JMS OUT STA /BACK UP COLUMN TAD COLCNT SMA /NOT TOO FAR THOUGH DCA COLCNT > STA TAD REPLY DCA REPLY /BUMP THE POINTER BACK ONE STA TAD INPCNT /REMEMBER TO INCREASE THE COUNT! TTY44, JMP RPLYL1 ALTMOD, TAD TTY44 JMS TTOUTR /ECHO ALT MODE AS $ STA /PUT SPECIAL DELIMITER IN MESSAGE CARRET, JMS CDFMSG /FIELD BACK TO MESSAGE BUFFER ! DCA I REPLY /SET THE LAST CHAR IN THE MESSAGE CDF CUR /CANCEL LOGIC SPLICES IN HERE! SHTDWN, DCA INPCNT /KILL INPUT JMS CRLF JMP EORPLY / / / OUTPUT ROUTINE, CHECKING FOR AND / TTOUTR, 0 /PRINT WITH COLUMN COUNT AND (177 /STRIP TO ESSENTIAL BITS TAD (-11 /CHECK FOR TAB SNA JMP TABB /GOT IT TAD (+11-15 /CHECK FOR CR SZA /SKIP IF YES JMP .+3 TAD (-WIDTH-2 /-1 FOR PRE-TEST AND ANOTHER -1 FOR / /ISZ COMING UP SHORTLY DCA COLCNT /RESET TO BEGINNING OF LINE ISZ COLCNT /WRAPPED AROUND LINE ?? SKP /NO JMS CRLF /ADJUST LINE ZOT, TAD (215 /RESTORE CHAR JMS OUT /PRINT IT JMP I TTOUTR / IFNZRO TAB < TABB, TAD COLCNT /UPDATE COLUMN COUNT TAD (WADJ /ADJUSTING TEST BY WIDTH MOD 8 AND (7770 TAD (WADJN /WADJN IS 8-WADJ SMA /OK UNLESS WENT POSITIVE STA /WENT POSITIVE, OUT OF LINNE DCA COLCNT TAD (+11-15 /CORRECT FOR COMING ADDITION TO PUT JMP ZOT /JUST PRINT TAB > IFZERO TAB < TABTOP, TAD (WADJ /ADJUST FOR WIDTH BEING MINUS, ETC. AND (7 /CHECK PROGRESS MODULO 8 SNA CLA /SKIP IF NOT YET DONE JMP I TTOUTR /ALL DONE TABB, TAD TTY40 JMS OUT /AT LEAST ONE SPACE MUST PRINT ISZ COLCNT /BUMP COUNTER JMP TABTOP /DIDN'T FLY OFF END STA /OFF END SET COUNT TO -1, NO MORE ROOM DCA COLCNT JMP I TTOUTR / > / / / / / PUSH CALLED AT INTERRUPT LEVEL TO PLACE CHAR IN USER BUFFER / PUSH, 0 /INIT VALUE FOR SETUP FOR CANCELL / /A CANCELL INIT ERROR COULD PUT -2 HERE TAD INCH /GRAB CHAR AGAIN JMS CDFMSG /FIELD FOR MESSAGE DCA I REPLY /PLACE ISZ REPLY /KICK POINTER CDF CUR /DEFAULT IS OUR FIELD JMP I PUSH /BACK TO INTERRUPT PAGE FOR FINISH / $