/64 TTY DRIVER TASK FOR RTS8 V3 / /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 / 14-DEC-76 FIXED L7 BUG / #10 V2B CONVERSION TO MACREL / #21-39 REWRITE ENTIRELY: INTERRUPT DRIVEN I/O. EMERGENCY MESSAGE. / BF SUPPORT. CLOCK TIMEOUT OF HUNG INPUT. / POSSIBLE PARAM'S:EMT,BF,TTTIM,STRIP / #42 BRING BACK .FSECT LITERALS, LEVEL=0 / #43 KL8A FIX / #44 CHANGED LARGE FSECTS TO RSECTS, REMOVED SOME LINKS / #45 CHANGE .TASK MACRO CALL FOR SECOND DEVICE / #46 ANOTHER .FSECT CHANGE / #47 CHANGE .TASK FROM TASK20 CHANGE / #48 MODIFY USE OF SYMBOL 'TASK' / #49 CHANGE INTERACTION OF ASSIGN, AND TIMEOUT / #50 BUG IN 49, FSECTS AGAIN / #51 RTS8 INSTEAD OF RTFLD / #52 MORE MULTI-TTY PROBLEMS ALL 'TASK' TO 'TTTASK' / #53 KL FIXES, INDIRECT FIXES ON MONITOR TABLES / #54 MORE BUG FIXES / #55 54 MISSED / #56 INDIRECT FIX ON QHEAD / #57 TRY FIX FOR LF CHARACTER COUNT / #58 PDP8E CONDITIONAL TO OMNI, GLOBAL TO TIMOUT / #59 REMOVE CONTROL BUG RESULTING FROM PREVIOUS EDIT / #60 PAGE PROBLEM FILL=7, NOT OMNI, TAB, QS / #61 IMAGE MODE INPUT ALWAYS APPENDS , FIX / #62 MAKE CONTROL O CLEAR QSWAIT; ALLOW CONTROL S DURING EMT / #63 VT50 CONDITIONAL ERROR, SHORT BUG / #64 MOVE LITSZA TO ALLOW ALT-MODE PATCH / VERS=64. / / / / / / / / / / /COPYRIGHT (C) 1975,1976,1977,1978,1979 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 /TASK DATA BLOCK: INIWT= 0 IFNDEF TTDEV IFNZRO TTDEV-4&4000 IFNZRO TTDEV&6000 IFNDEF KBDEV IFNZRO KBDEV&6000 IFNDEF VT50 /SET TO 1 IF 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 CLOCK IFNDEF TTTIM IFNDEF STRIP IFNDEF OMNI IFNDEF TASK IFNDEF TTTASK IFNDEF MCR IFDEF MCR > IFNDEF EMTCDV IFNDEF OS8 IFNDEF BKT IFDEF BKT > 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 HB=200 > IFNZRO TTDEV&100 < IFNDEF KL8ADV /DEFINE KL8A IO CODE KLNUM=TTDEV&77%4 /KL8A NUMBER IFNZRO KL8A-KLNUM-1&4000 /MUST BE .LE. 'KL8A' KLNUM=KLNUM^2 /DEVICE CODES COME IN PAIRS TLSX= KL8ADV+KLNUM^10+6004 HB=TTDEV&77^400+200 > /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 /WORDS 3.3-3.7 -2, CDF TO MESSAGE FIELD /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 A LINE OF KL8A IS TO BE USED. / / 'EXTRA' ASSEMBY PARAMETERS NOT IN BUILD / / 'SHORT' BECOMES TRUE WHEN HARDWARE TAB, AND NO LINE WIDTH SPECIFIED / GIVES SHORTER CODE PATH IN COLUMN COUNTINIG AREA / / 'STRIP' WHEN DEFINED BY USER, ELIMINATES CHARACTER MODE INPUT, / AND MAKES CONTROL ECHOING MESSIER. BOTH OF THESE THINGS REMOVE CODE. / / CODE CHANGERS, WATCH IT, MOST PAGES ARE FULL, OR NEARLY SO / WORST CASE IS LIKELY TO BE OMNI=0, TAB=0, ALL ELSE ON / .ZSECT TTZ\TTDEV, LEVEL=0 PWMSG, /ALSO POWER FAIL MESSAGE HEADER REPLY, 0 /ACTIVE INPUT PLACER HOLDER, 0 /EXTRA CHARACTER INPUT HOLDER DURING MAINSTREAM INPCNT, 0 /INPUT COUNTER INCH, DRAIL /THIS CHAR TO MAINSTREAM IN, ZZ /INPUT VECTOR LCRLF, CRLF /POINTER TO CARRIAGE RETURN, LINE FEED ROUTINE IFNDEF PWRF < DRAIL, /PREVENT ASSEMBLY ERROR > .RSECT TTR\TTDEV, LEVEL=0 FIELD TTZ\TTDEV .IF EQ TTTASK-TTY < .TASK TTY /MAKE FIRST ONE 'TTY' > .IF NE TTTASK-TTY < .TASK TTTASK /BUT OTHER TTY'S GET TO BE 'TTTASK' > / SHORT=0 IFZERO WIDTH < IFNZRO TAB < SHORT=1 > > .EXTERNAL MSGTBL,TFTABL,TSTABL QHEAD=TTTASK+TTTASK+MSGTBL /HEAD OF RECEIVE QUEUE FOR TTY WAITER=TFTABL+TTTASK TKTMP=TTTASK+TTTASK+TTTASK+TTTASK+TSTABL IFNZRO EAESV TKPC=TKTMP+1 TKAC=TKPC+1 .IF EQ MCRCDV-TTTASK < .EXTERNAL MCREF > .IF EQ BKTCDV-TTTASK < .EXTERNAL KBEX,TTEX .GLOBAL BKGSET > IFNZRO TTTIM < .GLOBAL TDELAY /POINT TO TIMOUT PAIR > IFNZRO TTDEV&100 < .EXTERNAL KL8ACT /START UP ADDR FOR KL8A > / PAGE OF CODE FOR RECEIVE, SET-UP, ETC. / / / ## USE ONCE ONLY CODE FOR TEMPORARIES ETC. ## / IFZERO STRIP < ZZXCV=(400 /FORCE LITERAL 400 FIRST (MAKING 377 LITERAL) > FLAGS, /FLAGS MUST LEAD OFF PAGE!! (MAKING LITERALS) START, IFNZRO FLAGS&177 IFZERO TTDEV&100 < CAL TTEV, SKPINS /TTEV MUST INIT GREATER THAN 0 MEVFLG, TTINT IFZERO OMNI < /ONLY NEED 1 SKIP CHAIN ENTRY ON 8/E REPLYY, CAL OFLAG, SKPINS KFLAG, KBINT > IFNZRO OMNI < REPLYY, 0 OFLAG, 1 KFLAG, 1 > > IFNZRO TTDEV&100 < CIF RTS8 /CONNECT IN RTS8 FIELD TTEV, TAD MF /GET KL8A LINE # INTO AC MEVFLG, IOF REPLYY, JMS I MADDR /CONNECT TO KL8A LINE OFLAG, KBINT /KEYBOARD INT ADR KFLAG, TTINT /PRINTER INT ADR > IFDEF PWRF < BFLAG, CAL KBEV, SENDW /KBEV MUST INIT GREATER THAN 0 BKEV, PWRF /SEND DERAIL ADDRESS TO POWER FAIL TASK PWMSG > IFNDEF PWRF < BFLAG, 1 KBEV, 1 BKEV, 1 0 > SETBUF=.-1 /SETBUF ROUTINE OVELAPS LAST ONE BUFCDF, JMP TTMSLP /GO RECEIVE FIRST MESSAGE JMP I SETBUF ASGNEE, 0 /TTY ASSIGNED TO THIS TASK / / ## ASSIGN AND END OF REQUEST ## / ASSIGN, DCA ASGNEE /RECEIVES ONLY HONOR THIS GUY'S SENDS EORPLY, TAD MEVFLG /POST ADDR FOR SENDER'S REQUEST CAL POST /TELL HIM WE'RE DONE IFNZRO TTDEV&100 < MF, TTDEV&77^4 /LITERAL FOR KL8A INIT (LINE #) > IFZERO TTDEV&100 < MF, 0 /REGULAR PROCESSING; FIELD OF POST GOES HERE > CYCLE, IOF /NO WINDOW BEFORE HIT RECEIVE .IF EQ EMTCDV-TTTASK < TAD KFLAG /IS THIS AN ABORTED OPERATION SZA CLA /SKIP IF YES JMP CKBKG /GO CHECK FOR BACKGROUND REQUEST ISZ KFLAG /NEXT OPERATION BACK TO NORMAL ISZ KBEV /MAKE SURE THIS HAS NOT BEEN LEFT 0 TAD (EMT /RECEIVE REQUEST FROM EMERGENCY TASK JMP TTWCAL /GO DIRECTLY TO WAIT CAL > CKBKG, .IF EQ BKTCDV-TTTASK < TAD BFLAG /BACKGROUND WANT IT? SNA CLA /SKIP IF NOT JMP SETBKG /YES, GO SET IT UP > / / ## RECEIVE LOGIC ## / / TTMSLP, TAD ASGNEE /IF ASSIGNED, HERE IT IS TTWCAL, CAL /GET NEXT MESSAGE RECEIV IFZERO TTDEV&100 < MADDR, 0 /GETS ADDRESS OF MESSAGE > IFNZRO TTDEV&100 < MADDR, KL8ACT /LITERAL FOR KL INIT > DCA BUFCDF /CALL CDF, DEFAULT FOR BUFFER IF NO -2 AAJOIN, TAD BUFCDF /COPY IN MF TO POST REQUEST DCA MF JMS SETBUF /SET CDF TO THAT FIELD OF CALL AC7775 /MAKE POINTER TO EVENT FLAG TAD MADDR DCA MEVFLG JOIN1, TAD I MADDR /GET AN ARGUMENT ISZ MADDR CMA CLL RAR /CHECK FOR LEADING -2 SNA /SKIP IF NOT, REGULAR FORMAT JMP FORMAT /GO DO NEW FORMAT CMA CML RAL /RESTORE FLAGS WORD DCA FLAGS TAD I MADDR /GET INPUT POINTER WORD ISZ MADDR DCA REPLYY /INPUT BUFFER ADDR (IF ANY) L1200, TAD FLAGS /CHECK FOR INDIRECT BUFFER AND L1200 /ALSO SEES ASSIGN, BUT THAT DOESN'T MATTER SNA CLA /SKIP ON ORIGINAL 1000 BIT JMP HERE /NO INDIRECT TAD I MADDR /INDIRECT BUFFER POINTER DCA MADDR /LEAVING MADDR POINTING TO BUFFER HERE, CDF .FLD /BACK TO OUR FIELD TAD BUFCDF /PUT CDF INTO OUTPUT LOOP DCA ZOT1 CTRLU2, TAD FLAGS /CHECK FOR ASSIGN, SET UP INPUT COUNT AND L377 /KEEP 7 BIT ARGUMENT, AND ASSIGN BIT TAD (7600 /IF ASSIGN, AC + TASK # SMA /SKIP IF NOT ASSIGN JMP ASSIGN /AC ALL SET, JUST DEPOSIT IT AND LEAVE TAD L200 /GET BACK 7 BIT ARGUMENT (THE INPUT COUNT CIA /MAKE MINUS FOR LOOP CONTROL DCA INPCNT TAD MADDR /MAKE ACTIVE OUTPUT POINTER FROM STORED ONE DCA SAVM TAD REPLYY /IF INPUT IS EXPECTED, KILL CONTROL O !! SNA CLA .IF EQ EMTCDV-TTTASK < TAD OFLAG /ALSO KILL IT IF EMT'S OFLAG IN FORCE (0) SZA CLA > JMP OOFF /LEAVE IT ALONE TAD LIOF / (IOF; SWITCH IS BY CORE MODIFICATION DCA CNTLO OOFF, AC4000 /SWING AC0 OF FLAGS TO AC11 L200, AND FLAGS /LITERAL 200 RTL TAD (POP1 /INIT OUTPUT FETCHER DCA POPV JMP ZOT1 /GO TO OUTPUT LOOP IFNZRO STRIP < L377, 377 /SWHEN STRIP IS IN EFFECT, THE L377 GOES AWAY > / / ## END OF OUTPUT, SET UP INPUT ## / CKCRLF, AC2000 /CDF UNCERTAIN CYCLIN, AND FLAGS /CHECK IF NEED TO ISSUE BREAK, SNA CLA /ENTRY FROM ^O ALWAYS SKIPS DOLF, JMS I LCRLF /APPEND CR, LF NOLF, JMS RELES /RETURN TO MAINSTREAM LEVEL, CDF HERE TAD REPLYY /ARE WE TO DO INPUT? SNA /SKIP IF YES JMP EORPLY /POST THIS AND RECEIVE NEXT DCA REPLY /WORKING POINTER TAD BUFCDF /MOVE CDF DCA WHERE /TO POINT TO INPUT BUFFER LIOF, IOF /SAFE ZONE DCA HOLDER /NO HUNG INPUT IFZERO STRIP < TAD FLAGS /WHICH KIND OF INPUT L377, AND (400 /NON-ZERO IF IMAGE INPUT, ALSO LITERAL 377 SZA CLA /SKIP ON REGULAR LINE INPUT TAD (STRAIT-REGIN > JMP NOMORE /JOIN UP WITH INPUT RESTART / /AND EXECUTE START-UP CODE AT NOMORE / / ## GOT A -2 FORMAT CALL ## / FORMAT, TAD I MADDR /GET THE CDF ISZ MADDR DCA BUFCDF /CHANGE BUFFER FIELD JMP JOIN1 /GO BACK WITH MAIN LINE / / ## INPUT ENDED, ONE WAY OR OTHER, FINISH UP ## / EOIN, DCA REPLYY /DON'T GO INPUT AGAIN TAD (400 /IMAGE MODE DOESN'T WANT CRLF, GO CHECK IT OUT JMP CYCLIN / / XCNTLU, JMS CECHO /ECHO A CONTROL U 125+HB /HERE IS THE U AC2000 /MUST WE REPROMMPT AND FLAGS SZA CLA /SKIP IF NOT JMP CTRLU2 /YES, STILL AT INTERRUPT LEVEL, THAT'S OK JMP NOLF /NO SECOND LINE FEED FOR CONTROL U / / PAGE / .FSECT TT1\TTDEV,ROOT FIELD TTZ\TTDEV / / / PAGE OF CODE FOR INPUT INTERRUPT HANDLING / / VECTOR HERE FROM INTERRUPT ENTRY POINT VIA 'IN' / / ## REGULAR INPUT ## / REGIN, AND (177 /REGULAR INPUT TAD (-175 /CHECK FOR ORDINARY INPUT CHAR CLL TAD (135 /CARRIES TO LINK IF ORDINARY SNL /SKIP IF ORDINARY JMP SPCLCH /SPECIAL CHAR IFZERO SHORT < ISZ COLCNT /ROOM LEFT ON TTY CARRIAGE? JMP QUICK /YES, CONTINUE WITH QUICK PATH TAD (40 /REFURBISH CHARACTER DCA INCH /SEND TO MAINSTREAM STA /BACK UP COLUMN COUNT FOR MAINSTREAM ISZ DCA COLCNT JMP JOIN3 /WAKE UP MAINSTREAM > QUICK, TAD (40+HB /PUT ON 'PRINTING BITS' LTLSX, TLSX /ECHO THE CHARACTER, ALSO A LITERAL IFNZRO TTDEV&100 /IF KL, STRIP HIGH BITS JMS ISUB /PLACE CHAR, ISZ, ETC. RETURN ONLY IF FULL STA /NO, DUMMY COUNT TO -1 DCA INPCNT /ALL CHARS THEN TO LAST POSITION IN BUFFER JMP POSTIZ /EXIT FROM INTERRUPT / SPCLCH, TAD (40 /ADJUST CHAR TO CALL CKSPCL JMS CKSPCL IFZERO STRIP < JMP JOIN /JOIN UP TO SAVE SPACE / / ## STRAIGHT INPUT WITH NO MODIFICATION (DATA IN, AS IN PAPER TAPE) ## / STRAIT, IFNZRO TTDEV&100 JMS ISUB /PLACE CHAR ETC. RETURN WHEN DONE CDF .FLD /CDF HERE FOR POST EVENT VARIABLE JOIN, > DCA INCH /ARGUMENT FOR MAINSTREAM JOIN3, TAD (ZZ /NO, SO HERE, QUIT DCA IN /VECTOR INPUT TO DORMANT ROUTINE TAD (KBEV /POST KEYBOARD EVENT FLAG JMP POSTIZ / / / ## DORMANT INPUT ROUTINE ## / ZZ, DOWN, AND (177 JMS CKSPCL DCA HOLDER /ONE CHARACTER SAVE THRU MAINSTREAM / /IN ZZ CASE, NO ONE LOOKS AT HOLDER JMP POSTIZ / / ## COMMON SUBROUTINE FOR INPUT ## / ISUB, 1 /CALL WITH PLACE CHAR IN AC; RETURN IF INPCNT FULL; / /OTHERWISE GO TO IOK.TIMER USES THIS AS ACTIVITY FLAG! WHERE, HLT /CDF TO USER'S BUFFER. WATCH INDIRECTS!! DCA I REPLY /PLACE CHAR IN USER BUFFER ISZ INPCNT /STILL MORE ROOM IN BUFFER? SKP /SKIP TO EXIT INTERRUPT JMP I ISUB /FULL, CALLER HAS SPECIFIC ACTION IOK, ISZ REPLY /IS OK TO INCREMENT POINTER POSTIZ, CIF RTS8 POSTDS / / / ## CHECK FOR CERTAIN CONTROL CHARACTERS AT INTERRUPT LEVEL ## / / / CALL WITH CHARACTER IN AC, RETURN CHAR IN AC IF NO ACTION REQUIRED / CKSPCL, 0 IFZERO VT50 < /NO ^Q ^S TAD (-17 /CHECK FOR CONTROL O > IFNZRO VT50 < /CHECKING ORDER S,Q,O TAD (-23 SNA JMP XCNTLS /DO CONTROL S TAD (-21+23 SNA JMP XCNTLQ /DO CONTROL Q TAD (-17+21 /SET UP FOR CONTROL O > SNA /CHECK FOR O JMP XCNTLO /DO IT .IF EQ TTTASK-MCRCDV < /^C IF WE ARE MCR CONSOLE TAD (-3+17 SNA JMP XCNTLC .IF EQ BKTCDV-TTTASK < /^B FOR BACKGROUND-FOREGROUND IAC SNA JMP XCNTLB TAD (2 /RESTORE CHARACTER TO ORIGINAL > .IF NE BKTCDV-TTTASK < /ON NO BACKGROUND TAD (3 /JUST RESTORE > > .IF NE TTTASK-MCRCDV < /NO ^C .IF EQ BKTCDV-TTTASK < /CHECKING FOR CONTROL B TAD (-2+17 SNA JMP XCNTLB TAD (2 /RESTORE CHAR > .IF NE BKTCDV-TTTASK < /NEITHER ^B ^C TAD (17 /JUST CANCEL CONTROL O > > JMP I CKSPCL /RETURNING CHAR IN AC / / ## ACT ON SPECIAL CHARACTERS ## / IFNZRO VT50 < LSFLAG, QSWAIT&177+3200 /DCA QSWAIT XCNTLS, //TERMINAL'S CONTROL S TAKES PRIORITY OVER USER'S!! // .IF EQ EMTCDV-TTTASK < // TAD OFLAG /IF THIS IN FORCE, DON'T HONOR ^S // SNA CLA // JMP POSTIZ // > TAD LSFLAG /HOLD ANY PENDING OUTPUT DCA CNTLS JMP POSTIZ XCNTLQ, TAD LTLSX DCA CNTLS /PUT FLAG TO 'NORMAL' STATE TAD QSWAIT /ANY HUNG OUTPUT SNA /SKIP IF YES JMP POSTIZ /NO, GET OUT DCA CKSPCL /TEMPORARY DCA QSWAIT /SO SECOND ^Q DOESN'T REBOUNCE CHAR TAD CKSPCL /IN AC TO REJOIN OUTPUT LOOP JMP CNTLS /NOW GO DO THE TLSX! > / .IF EQ TTTASK-MCRCDV < XCNTLC, TAD (MCREF /MCR EVENT FLAG CDF MCREF JMP POSTIZ > XCNTLO, .IF EQ EMTCDV-TTTASK < TAD OFLAG /IF THIS IN FORCE SNA CLA /DON'T HONOR CONTROL O JMP POSTIZ > IFNZRO VT50 < TAD LTLSX /KILL ^S IN EITHER DIRECTION DCA CNTLS DCA QSWAIT /ALSO MAKE THERE BE NO SAVED CHAR > IFZERO STRIP < /STRIP REMOVES AESTHETIC CONTROL O TAD BUSY /AT OUTPUT INTERRUPT LEVEL SNA CLA /SKIP IF YES JMP OPASS /NO, DON'T NEED TAD (HB /ON CONFLICT, GARBAGE THIS NULL JMS OUT JMS I LCRLF TAD LLB /LITERAL JMP I LBREAK DCA CNTLO JMP CNTLO LLB, LBREAK&177+5600 > OPASS, TAD CNTLO /FLIP FLAG TO OTHER SETTING CIA TAD OMAGIC /SUM OF SETTINGS MINUS THIS ONE IS OTHER ONE! DCA CNTLO JMP POSTIZ OMAGIC, LBREAK&177+5600+IOF /SUM OF TWO POSSIBLE SETTINGS / /FIRST PART IS JMP I LBREAK / / / / / .RSECT TTR\TTDEV,ROOT / / / PAGE OF CODE FOR MAINSTREAM INPUT HANDLING / / EMTZ=0 /DEFAULT VALUE IF EMTCDV NOT US / / SQUEEZE POWER FAIL CODE ONTO THIS PAGE / IFDEF PWRF < / DRTEMP, 0 DRAIL, 0 DCA DRTEMP /SAVE ONLY AC, AS WE DON'T TOUCH THE REST TAD (HB KTLSX, TLSX /PRINT A NULL TO WAKE OUTPUT L7600, 7600 /CLEAR AC, AND LITERAL 7600 TAD DRTEMP JMP I DRAIL /AND JUST RETURN, THAT'S IT > IFNDEF PWRF < IFNZRO VT50 < KTLSX, TLSX /KEEP ASSEMBLER HAPPY > L7600, 7600 > / NOMORE, TAD (REGIN /SET UP REGULAR INTERRUPT VECTOR AGAIN DCA IN /THIS ONLY WORKS BECAUSE WE ARE AT INTERRUPT LEVEL JMS RELES /KICK ECHO CODE BACK TO MAINSTREAM IFNZRO TTTIM < CLA IAC /SET ISUB NON0 AT IWAIT TO TELL TIMER ABOUT US JMP IWAIT /COMPLICATED CLOCK WAIT DOESN'T FIT HERE > / IFZERO TTTIM < IWAIT, CAL /SIMPLE WAIT WAITX MKBEV, KBEV ISZ I MKBEV /GET IT BACK TO 1 > ECHECK, .IF EQ EMTCDV-TTTASK < EMTZ=1 /ASSEMBLY FLAG FOR FURTHER DOWN TAD KFLAG /EMERGENCY MESSAGE INPUT FLUSH? SZA CLA /SKIP IF YES > JMP BYPASS /REGULAR INPUT PROCESSING IFNZRO EMTZ+TTTIM < /FOR EITHER EMERGENCY OR CLOCK TIMOUT KILLIN, TAD (ZZ /MAKE INPUT DORMANT DCA IN TAD LITSZA /MAKE CECHO SKIP JMS CECHO 125+HB /A CONTROL U IS ECHO'D AC4000 /THIS IS PLACED IN USER BUFFER AS TERMINATOR JMP CARRET /FINISH UP IN COMMON WITH NORMAL END > / / / / ## GIVE CHAR TO CALLER ## / RPLYLP, TAD (375 /REFURBISH CHAR FOR CALLER JMS SETBUF /SET CDF DCA I REPLY /PLACE IT TAD I REPLY /GET IT AGAIN FOR ECHO ISZ REPLY TAD L7600 /SUBTRACT OFF 200,TTOUTR WANTS ONLY 7 BITS JMS TTOUTR /RETURN AT INTERRUPT LEVEL !! IJOIN, TAD HOLDER /AN INTERRUPT HAPPENED WHILE WE WERE HERE? SNA /SKIP IF IT DID JMP NOMORE /NO MORE CHAR'S DCA INCH /HOLD EXTRA CHARACTER DCA HOLDER /CLEAR FOR NEXT ONE JMS RELES /KICK BACK TO MAINSTREAM / / ## LOOK AT THE CHARACTER ## / BYPASS, TAD INCH /WHAT WAS THE CHAR IFZERO STRIP < SNA JMP EOIN /SIGNAL END OF CHARACTER TYPE INPUT > TAD (-15 SNA JMP CARRET TAD (-25+15 /CHECKING FOR CONTROL U SNA JMP XCNTLU TAD (+25-33 /START CHECKING FOR VARIOUS ALT-MODES SZA /ANY ALT MODE COLLECTS IN SZA CHAIN TAD (+33-176 LITSZA, SMA SZA /LITERAL TO ALWAYS SKIP ON ZERO AC JMP RUBOUT SZA IAC SNA JMP ALTMOD ISZ INPCNT JMP RPLYLP STA RPLYL1, DCA INPCNT NOECH, IOF JMP IJOIN / / ## ALT-MODE AND CARRIAGE RETURN TERMINATE INPUT ## / ALTMOD, TAD (44+HB /ECHO A DOLLAR SIQN JMS OUT STA /-1 TO BUFFER CARRET, JMS SETBUF /POINT TO BUFFER FIELD DCA I REPLY /PLACE -1 FOR ALT, AND 0 FOR , 4000 FOR ABORTED JMP EOIN /END OF INPUT / / ## RUBOUT PROCESSING FOR INPUT ## / RUBOUT, TAD REPLYY /AC=1 ON ENTRY CIA TAD REPLY SPA CLA /AT BEGINNING OF LINE? JMP NOECH /DO IOF TO REJOIN INPUT PROCESSING IFZERO SCOPE < TAD (134 /BACKSLASH JMS TTOUTR > IFNZRO SCOPE < TAD (10+HB JMS OUT /ALL BITS MUST BE IN PLACE FOR OUT TAD (40+HB JMS OUT TAD (10+HB JMS OUT > IFZERO SHORT < STA //TAKE OUT THIS ONE IF ENABLE // FULL CHECK TAD COLCNT /BACK UP COLUMN // TAD (LINSIZ //CHECK BACKING UP TOO FAR?? // SPA /POSSIBLY COULD HAVE A MULTILINE INPUT? // CLA // TAD (-LINSIZ-1 /IN GENERAL CASE, HAVE ADDED -1 DCA COLCNT > STA /BACK UP STORAGE POINTER TAD REPLY DCA REPLY STA /AND MODIFY INPUT COUNT TAD INPCNT JMP RPLYL1 / / ## CECHO ECHO CONTROL CHARACTER ## / / CONTROL CHARACTER IS AT CALL +1 / / ECHO ^, CONTROL CHAR, THEN FULL / / RETURN AT INTERRUPT LEVEL / / NORMALLY, CALL WITH 0 IN AC / / IF CECHO IS NOT TO ISSUE CALL WITH A SKIP INSTRUCTION IN AC! / CECHO, 0 DCA CESKP /PLACE POSSIBLE SKIP (0) IS NOP TAD NOECH /RESET ^O AND ^Q FLAGS (LITERAL IOF) DCA CNTLO IFNZRO VT50 < TAD KTLSX DCA CNTLS > TAD (HB /SEND OUT SACRIFICIAL NULL IN CASE TRAFFIC JMS OUT /BEING SENT BY BACKGROUND ETC. TAD (136+HB /THE ^ JMS OUT TAD I CECHO JMS OUT /THE CHARACTER CESKP, 0 /SKIP GOES HERE TO MISS CRLF JMS I LCRLF /THE LINE FEED ETC. ISZ CECHO /MOVE TO EXIT JMP I CECHO / / / / / / .RSECT TTR\TTDEV,ROOT / / PAGE OF OUTPUT CODE / / ## RELES, RETURN TO MAINSTREAM ## / / THE HANDLER STARTS THE FIRST OUTPUT I/O FROM MAINSTREAM (AT 'OUT') / AND COMES TO SETBSY. / / AT SETBSY SOME BOOKKEEPING IS DONE, AND A WAIT IS DONE ON TTEV. / / OUTPUT CONTINUES AT INTERRUPT LEVEL UNTIL THE LAST CHARACTER / HAS BEEN PUT OUT. / / AFTER THIS LAST CHARACTER, A JMS RELES IS DONE, STILL AT INTERRUPT / LEVEL. AT RELES SOME BOOKKEEPING IS DONE, THEN THE WAIT ON TTEV / IS POSTED. THE CODE RETURNS FROM THE WAIT AT MAINSTREAM, AND DOES / A JMP I RELES. THUS, THE EFFECT IS TO CONVERT FROM INTERRUPT CODE / AT JMS RELES TO MAINSTREAM CODE AT JMS+1. / / L177, 177 /GRAB TOP OF PAGE TO FORCE A 200 IFNZRO TTDEV&100 < LHB, HB > SETBSY, SKP CLA /CLEAR AC, BE A LITERAL LBREAK, BREAK /LITERAL FOR JMP I BREAK ON CONTROL O TAD SETBSY /LOAD UP A SKP CLA DCA BUSY /TO SHOW INTERRUPT LEVEL CAL /WAIT FOR JMS RELES TO POST WAITX LTTEV, TTEV /EVENT FLAG ISZ I LTTEV /RETURN TO DEFAULT UNPOSTED STATE RELJOI, ION /IN CASE CAME OVER FROM RELES, MAINSTREAM JMP I RELES / RELES, 0 CDF .FLD /FORCE TO OUR FIELD FOR COMING POST TAD BUSY /ALREADY AT MAINSTREAM SNA CLA /SKIP IF NO; JMP RELJOI /GO BACK, INTERRUPTS ON DCA BUSY /CLEAR BUSY TO SHOW BACKGROUND TAD (POSTZ /INTERRUPTS VECTOR TO JUST EXIT DCA OUT TAD LTTEV /POST WAIT, WHICH EXITS FROM RELES JMP POSTZ /WAIT DONE BY FIRST ENTRY TO OUT !!!! / / ## OUTPUT UNPACKING ROUTINES ## / POPV, 0 AND (77 /DONE? SNA JMP CKCRLF /NEED CARRIAGE RETURN LINE FEED? TAD (40+HB /CONVERT SIXBIT TO ASCII AND (77 TAD (40+HB /GOT TO ASCII IFZERO SHORT < ISZ COLCNT /DID WE OVERFLOW THE LINE? JMP ZOT0 /NO JMS CRLF /YES, MAKE A NEW ONE ISZ COLCNT /PRE INCREMENT FOR CHAR WE'RE ABOUT TO PLACE ON LINE! > ZOT0, JMS OUT /CHARACTER TO DEVICE ZOT1, HLT /CDF TO DATA PLACED HERE TAD I SAVM /FETCH DATA WORD JMP I POPV /DISPATCH TO CORRECT UNPACKING ACTION / POPT, IFNZRO OMNI < BSW /ACTION ONE, BRING TOP CHAR TO BOTTOM > IFZERO OMNI < CLL RTR RTR RTR > JMS POPV /LEAVING POINTER TO NEXT TIME POP2, ISZ SAVM /ACTION TWO, MOVE POINTER TO NEXT JMS POPV /LEAVING POINTER POP1, JMP POPT /LOOP / / POPIM MUST FOLLOW POP1 !! / IFZERO TTDEV&100 < LHB, > POPIM, AND L177 /ACTION FOR IMAGE MODE SNA /SKIP IF MORE JMP CKCRLF /NOPE ISZ SAVM /POINTER TO NEXT CHAR JMS TTOUTR /CHECK , TAB, LINE POSITION JMP ZOT1 /LOOP BACK FOR NEXT / SAVM, 0 /POINTER TO OUTPUT DATA / / ## IMAGE OUTPUT, CHECKING FOR , TAB ## / / ALSO USED FOR ECHOING / IFNZRO SHORT < /NO COLUMN COUNTING WHEN HDWR TAB, INFIN WIDTH TTOUTR, 0 TAD (-15 SNA JMP CARRT TAD (HB+15 / , OUT REQUIRES PRINTING BITS JMS OUT JMP I TTOUTR > / / IFZERO SHORT < / / LINSIZ=WIDTH&7770 /LINSIZ ONLY A MULTIPLE OF 8 / COLCNT, 0 /COUNT UP FROM -LINSIZ-1 (PRE-INCREMENT) / TTOUTR, 0 /CALL WITH 7 BIT CHAR TAD (-15 /IS IT A SNA JMP CARRT STL /SET UP TEST FOR 12-14 CHARACTER VALUE TAD (-11+15 /MAKE AC=0 IF TAB SPA SNA SZL /SKIP UNLESS 12-14 !! ISZ COLCNT /OVER EDGE OF LINE?? DON'T COUNT POSITION OF 12,13,14 JMP TTOT /NO JMS CRLF /YES ZOO, ISZ COLCNT /PRE-INCREMENT, WE ALREADY HAVE A CHAR FOR NEW LINE TTOT, IFNZRO TAB < /IF HARDWARE TAB SUPPORT SZA JMP TTOJ TAD COLCNT /GOT A TAB, ADJUST COUNT AND L7770 TAD L7 DCA COLCNT > IFZERO TAB < /IF SOFTWARE TAB SUPPORT SNA / JMP TABB /YES > TTOJ, TAD (11+HB /CHAR READY TO PRINT JMS OUT /SO PRINT JMP I TTOUTR / / / ## SOFTWARE TABBER ## / / IFZERO TAB < TABB, TAD (40+HB /PRINT A SPACE JMS OUT /PRIMITIVE OUTPUTTER IAC /CHECK POSITION ON LINE TAD COLCNT /TAB POSITIONS (7), CARRY TO 10 OCTAL MULTIPLE AND L7 /DID WE GET TO TAB POSITION SZA CLA /SKIP IF YES JMP ZOO /INCREMENT COUNT, CYCLE BACK TO TABB! JMP I TTOUTR > > CARRT, STA /SIGNAL CR-LF TO SKIP LF JMS CRLF /DO CARRIAGE RETURN WITH COLUMN ADJUST L7770, 7770 /PAIR OF LITERALS CLEARS AC L7, 7 JMP I TTOUTR /GO BACK / / / / / / ## 'SUBROUTINE' OUT, PRIMITIVE CHARACTER PUTTER ## / / DO THE CHARACTER (TYPICALLY AT INTERRUPT LEVEL), RELEASE INTERRUPT, / GET NEXT INTERRUPT, JMP I OUT TO RETURN TO CALLER (CDF TO .FLD) / / CALL WITH CHARACTER TO PRINT IN AC (STRIPPED AND WITH PRINTING BITS) / OUT, 0 CNTLO, IOF /JMP I LBREAK IF CONTROL O; IOF NEEDED FIRST TIME IN CNTLS, TLSX /DCA QSWAIT IF CONTROL S; MUST BE ON SAME PAGE BUSY, 0 /0 IF NOT AT INTERRUPT LEVEL, SKP CLA IF SO JMP SETBSY /FIRST TIME IN, CONVERT TO INTERRUPT LEVEL POSTZ, CIF RTS8 /RELEASE INTERRUPT, POSTING IF AC NON0 POSTDS / / ## TELETYPE INTERRUPT ENTRY POINT ## / TTINT, IFZERO TTDEV&100 < ZBLOCK 2 /SKIP CHAIN LINKAGE IFZERO OMNI IFNZRO OMNI JMP I TTINT /IT WASN'T OUR FLAG CDF CIF .FLD IFNZRO OMNI < TSFX /WHICH ONE?? JMP KBINT /KEYBOARD > > IFZERO TTDEV&100 JMP I OUT /VECTOR TO WHOMEVER OWNS OUTPUT / / THIS IS LOGICAL END OF THE OUT SUBROUTINE / IFNZRO VT50 < QSWAIT, 0 /SAVE CHAR THRU ^S, ^Q > / / / ## KEYBOARD INTERRUPT ENTRY POINT ## / KBINT, IFZERO TTDEV&100 < IFZERO OMNI < ZBLOCK 2 /LINKAGE KSFX / JMP I KBINT /NOT OURS CDF CIF .FLD > KRBX > JMP I IN /DISPATCH TO INTERRUPT OWNER (CDF TO .FLD) / / / ## CRLF UTILITY TO GO TO NEXT LINE ## / / SAVE ANY AC CONTENTS THRU CALL / NOTE, IF CALL WITH AC=-1, DON'T DO LINE FEED! / IFNZRO FILL&7774 < /PREVENT ASSEMBLY ERROR IFNZRO SHORT < COLCNT, 0 > > CRLF, 0 / DCA INCH /INCH IS REALLY A SAFE TEMPORARY! TAD (15+HB / , OUT REQUIRES PRINTING BITS JMS OUT TAD (12+HB / ISZ INCH /SKIP LINE FEED PRINTING IF IMAGE MODE JMS OUT CLA /CLEAR AC, IN CASE SKIP HAPPENED / / SET UP EQUATE TO HANDLE PAGE OVERFLOW / OOPS=0 /DEFAULT, ALL WILL FIT IFZERO OMNI < IFZERO TAB < IFZERO FILL-2&4000 < OOPS=1 >>> IFNZRO OOPS < JMS OVRFLW /FILL CHARS WON'T FIT HERE, DO ELSEWHERE > IFZERO OOPS < / IFNZRO FILL&7774 < /LOTS OF FILLERS TAD (-FILL /YES, MAKE A LOOP DCA COLCNT /SAFE TEMPORARY TAD LHB JMS OUT ISZ COLCNT /COUNT OUT NULLS FOR FILLER JMP .-3 > IFZERO FILL&7774 < /FEW OR NO FILLERS .REPT FILL TAD LHB /YES, JUST USE A .REPT JMS OUT .ENDR > > IFZERO SHORT < /UNLESS COLUMN POSITIONING DISABLED TAD (-LINSIZ-1 DCA COLCNT > STA /BRING BACK CALLING AC, CANCEL ISZ TAD INCH JMP I CRLF / IFNZRO OOPS < /PUT OVERFLOW HERE .FSECT TOV\TTDEV FIELD TTZ\TTDEV OVRFLW, 0 IFNZRO FILL&7774 < /LOTS OF FILLERS TAD (-FILL /YES, MAKE A LOOP DCA COLCNT /SAFE TEMPORARY TAD (HB JMS OUT ISZ COLCNT /COUNT OUT NULLS FOR FILLER JMP .-3 > IFZERO FILL&7774 < /FEW OR NO FILLERS .REPT FILL TAD (HB /YES, JUST USE A .REPT JMS OUT .ENDR > JMP I OVRFLW > / / / / / IFNZRO TTTIM < / .FSECT TTT\TTDEV,ROOT FIELD TTZ\TTDEV / / MULTIPLY SHERTZ BY TTTIM TO GIVE DOUBLE PRECISION RESULT / MSHIFT=TTTIM MLOW=SHERTZ&1 MADD=SHERTZ%2 MAH=0 MAL=0 / XLIST .REPT 14 / MAH=MAL%4000+MAH+MAH MAL=MAL&3777 MAL=MSHIFT%4000^MADD+MAL MAH=MAL%4000+MAH MAL=MSHIFT%4000&MLOW+MAL+MAL MSHIFT=MSHIFT+MSHIFT .ENDR XLIST / / S.R. REMOVED GENERATTED LINKS FROM THIS SECT / CPAUSE, ZBLOCK 4 /CLOCK PARAM BLOCK, FIRST ARG. 0 TDELAY, MAH /DOUBLE PRECISION NUMBER OF TICKS FOR WAIT MAL / / BONG, TAD I (ISUB /NONE IF ZERO STILL IN SUBR CALL SZA CLA JMP REBONG /SOME HAPPENED, JUST RESTART CLOCK CDF RTS8 /ANYTHING IN RECIEVE Q? TAD I (QHEAD /IN CASE PAGES ALIGN IN DIFFERENT FIELDS CDF .FLD SNA CLA /SKIP IF YES JMP REBONG /QUEUE EMPTY, RECALL THE CLOCK TAD ASGNEE /ARE WE ASSIGNED SNA /SKIP IF YES JMP KILLIN /NO, JUST KILL INPUT TAD (4000 /PULL INPUT FOR THIS ASSIGNEE CAL /BUT DON'T WAIT IF NO SUCH REQUEST RECEIV AADDR, 0 /ADDR HERE IF WAS REQUEST SNA /SKIP IF REALLY A REQUEST JMP REBONG /NO REQUEST FROM ASSIGNEE, LEAVE ALL ALONE DCA BUFCDF /START UP NEW REQUEST; LEAVING OLD ONE 'HANGING' TAD AADDR /SINCE IT IS THE SAME USER DCA MADDR /FAKING OUT A REGULAR ENTRY JMP AAJOIN / REBONG, CAL /RESTART CLOCK INTERVAL SEND CLOCK CPAUSE ISZ CPAUSE /?????!!!!! IWAIT, DCA I (ISUB /SET TO 0 (REBONG)OR 1 (NOMORE) IWAITL, IOF /MUST PROTECT MULTI-WAIT TAD I (KBEV /KEYBOARD HAPPENED ISZ I (KBEV /1 IT, IN CASE IT WAS A 0 SNA CLA JMP I (ECHECK /YES TAD (4000+TTTASK /NO, ENSURE WAIT BITS RIGHT DCA I (KBEV TAD CPAUSE /CLOCK GO OFF SNA CLA JMP BONG /YUP TAD (4000+TTTASK DCA CPAUSE CIF RTS8 WAITM EFWT JMP IWAITL / / / > / .IF EQ EMTCDV-TTTASK < .FSECT TTEMT,ROOT FIELD TTZ\TTDEV / / TASK FOR EMERGENCY MESSAGE SERVICE / .TASK EMT,EMT,ESTART / / / ## CAL BLOCK TO SEND TO TTY ## / EHDR, ZBLOCK 3 -2 /INDIRECT FIELD TYPE ECDF, 0 /PLACE CDF HERE EFWORD, 0 /PLACE FLAGS WORD HERE EREPLY, 0 /INPUT BUFFER HERE EADDR, 0 /TEXT BUFFER POINTER HERE / / / / ## VARIOUS SENDS AND POSTS ## / NOWAIT, CDF .FLD /KFLAG INDIRECT, SO OUR FIELD DCA KFLAG /TELETYPE ACTIVE, MAKE SURE IT QUITS TAD (KBEV /POST TTY INPUT KEYBOARD EVENT VARIABLE CAL /TO BREAK ANY INPUT WAIT POST CDF .FLD ESEND, CAL /NOW RELAY MESSAGE TO TTY SENDW TTY EHDR ISZ OFLAG /CONTROL O HOLDER BACK TO NORMAL STATE AC7775 /BACK UP POINTER TO EV TAD TADDR /NOW POST OUR CALLER CAL POST EF, 0 /CALLER'S FIELD / / ## RECEIVE MESSAGE ## / ESTART, CAL /RECEIVE, WORK ON NEXT MESSAGE IN RECEIV TADDR, 0 /MESSAGE ADDR HERE DCA EFLAG /SAVE DATA FIELD DCA OFLAG /DISABLE CONTROL O TAD KIOF /LITERAL IOF DCA CNTLO EFLAG, 0 /SET UP TO ACCESS CALLER'S FIELD TAD EFLAG /MOVE CDF DCA EF /DATA FIELD TO POST MESSAGE WHEN DONE TAD TADDR /COPY TO EADDR TO FETCH ARGUMENTS DCA EADDR TAD EFLAG /DEFAULT DATA FIELD FOR BUFFER IS THAT OF CALL EJOIN, DCA ECDF /BACK HERE FROM -2 FORMAT TAD I EADDR /LEADING WORD, FLAGS OR -2 ISZ EADDR CMA CLL RAR /CHECK FOR -2 SNA /SKIP IF NOT JMP EFORMT /IS, SPECIAL TREATMENT CMA CML RAL /RESTORE ORIGINAL WORD DCA EFWORD /SAVE FLAGS WORD TAD I EADDR /GET INPUT BUFFER WORD ISZ EADDR DCA EREPLY TAD EFWORD /CHECK INDIRECT BIT AND (1000 SZA CLA JMP EIND /WAS SET, DO AN EXTRA INDIRECT TAD (1000 /WASN'T SET, MUST SET BECAUSE TTY WILL BE INDIRECT TAD EFWORD DCA EFWORD /DONE, CHECK TTY STATUS JMP CKTT EIND, TAD I EADDR /DO EXTRA INDIRECT DCA EADDR / / ## SET UP DONE, CHECK STATE OF TTY ## / CKTT, TAD (MSGWT /MASK TO CHECK RECEIVE WAIT CDF RTS8 /DATA FIELD TO CHECK SYSTEM TABLES KIOF, IOF /INTERRUPTS OFF AND I (WAITER /CHECK FOR RECIEVE WAIT (INDIRECT MUST BE THERE) SNA CLA JMP NOWAIT /NOT IN RECEIVE WAIT, TELETYPE ALIVE TAD (EMT /SEARCH FOR OUR REQUEST! DCA I (TKAC /ZERO AC SO NO ASSIGNMENT LOCKOUT !! JMP ESEND /NOW JUST SEND OUR MESSAGE / / ## GOT A -2 FORMAT CALL ## / EFORMT, TAD I EADDR /GET CDF ISZ EADDR JMP EJOIN /REJOIN MAIN LINE / / / / > / / / .IF EQ BKTCDV-TTTASK < .FSECT TTBKG, LEVEL=0 FIELD TTZ\TTDEV .TASK BKT,BKT,BSTART / / ## SMALL EXTRA TASK FOR BACKGROUND SUPPORT ## / / RECEIVE WAIT DECISION CANNOT BE MADE AT INTERRUPT LEVEL / NEED THIS SMALL EXTRA TASK FOR THAT PURPOSE / / PROBABLY PRIORITY OS8SUP-1 / BSTART, CAL /WAIT FOR NEXT ^B WAITX LBKEV, BKEV ISZ I LBKEV DCA BFLAG /SAY BACKGROUND WANTS TTY CDF RTS8 /SET UP TO ACCESS SYSTEM TABLES TAD (MSGWT /MASK TO CHECK RECIEVE WAIT IOF /CAN'T HAVE INTERRUPTS AND I (WAITER /ARE WE IN RECIEVE WAIT SNA /SKIP IF YES JMP BSTART /NO, JUST SET THE FLAG, TTY WILL LOOK AT IT CIA /SO TURN OFF THE RECEIVE WAIT BIT TAD I (WAITER /MUST BE INDIRECT IN CASE TABLE IN SAME PAGE / /OF OTHER FIELD DCA I (WAITER DCA I (TKAC /CLEAR AC TAD (SETBKG /PC GOES DIRECTLY TO SET BACKGROUND DCA I (TKPC JMP BSTART / / ## TTY TASK CODE FOR BF SUPPORT LIVING IN THIS PAGE ## / / VECTORS TO SUPPORT MODULES / BACKOU, CDF CIF TTEX JMP TTEX / BACKIN, AND (377 TAD (-6 /CHECK FOR 6 SZA TAD (-200 /NOW CHECK FOR 206 SNA JMP REVERT /GIVE TTY BACK TO FOREGROUND TAD (206 CDF CIF KBEX JMP KBEX / REVERT, ISZ BFLAG /DON'T WANT IT ANY MORE TAD KKBEV /POST KBEV WAIT POST4Z, CIF RTS8 POSTDS XCNTLB, TAD LBKEV /POST BACKGROUND SET UP TASK A ^B HAPPENED JMP POST4Z SETBKG, JMS CECHO /ECHO A ^B 102+HB /B FOR ECHOER JMS RELES /TO MAINSTREAM,,, IOF /BUT INTERRUPTS OFF! TAD (BACKOU /NOW SET OUTPUT TO BACKGROUND DCA OUT TAD (BACKIN /INPUT GOES TO BACKGROUND DCA IN TAD (HB /WAKE UP BACKGROUND OUTPUT WITH AN INTERRUPT TLSX DCA BKGSET /BACKGROUND NOW OWNS IT (AC CANNOT BE 0) JMS RELES /MUST BE AT MAINSTREAM FOR WAIT CAL CAL WAITX KKBEV, KBEV /TO BE WAKEN BY ^F, OR EMT ISZ I KKBEV IOF /KEEP INTERRUPTS OUT WHILE CHANGING TAD (ZZ /INPUT TO DORMAT DCA IN DCA BKGSET /BACKGROUND NOW DOES NOT OWN TERMINAL JMS CECHO /WAKING AT MAINSTREAM 106+HB /THE F FOR ^F JMS RELES /TO MAINSTREAM AGAIN (CECHO LEFT AT INTERRUPT) JMP CYCLE /GO RECEIVE NEXT, BUT CLEAR EFLAG / BKGSET, 0 /NON0 IF BACKGROUND OWNS TERMINAL / / / / > / /