--- /dev/null
+/17 SUPER TTY HANDLER FOR OS/8\r
+/\r
+/\r
+/\r
+/\r
+/\r
+/\r
+/\r
+/\r
+/\r
+/COPYRIGHT (C) 1974,1975,1977 BY DIGITAL EQUIPMENT CORPORATION\r
+/\r
+/\r
+/\r
+/\r
+/\r
+/\r
+/\r
+/\r
+/\r
+/\r
+/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE\r
+/AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT\r
+/CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY\r
+/FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT.\r
+/\r
+/THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER\r
+/UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED\r
+/(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH\r
+/SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL.\r
+/\r
+/DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE\r
+/OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY\r
+/DIGITAL.\r
+/\r
+/\r
+/\r
+/\r
+/\r
+/\r
+/\r
+/\r
+/\r
+/\r
+\r
+/S.W.,S.R.,H.J.,R.L.,S.R.\r
+\r
+ *0\r
+\r
+ -1\r
+ DEVICE KL8E;DEVICE TTY;0;TTY&177+4000;ZBLOCK 2\r
+\r
+/TWO-PAGE TELETYPE HANDLER FOR OS/8 V3.\r
+/ON INPUT, RECOGNIZES ^Z, ^C, ^U, RUBOUT\r
+/^Z MEANS END OF INPUT, INSERT ^Z IN BUFFER,\r
+/ PAD WITH ZEROES, AND ECHO "^Z"\r
+/^C MEANS ABORT JOB, RETURN TO OS/8 VIA LOC 7600 TO SAVE CORE AND PRINT "^C"\r
+/^U MEANS DELETE THE LAST LINE, ALLOW OPERATOR TO RETYPE\r
+/ (LINE STARTS AT BEGIN OF BUFFER AND IS TERMINATED BY A CR)\r
+/ A CR GETS ENTERED INTO BUFFER, CAUSES A LF TO ALSO ECHO\r
+/ AND GET ENTERED INTO BUFFER, BUFFER IS THEN PADDED WITH NULLS.\r
+/ CONVERTS LC TO UC\r
+\r
+/ON OUTPUT RECOGNIZES ^C, ^O, ^S, ^Q FROM KEYBOARD\r
+/^C CAUSES JOB TO ABORT, RETURN TO OS/8 VIA LOCATION 7600\r
+/ TO SAVE CORE AND PRINT "^C"\r
+/^O CAUSES ECHOING BY THE HANDLER TO CEASE\r
+/ TYPING ANY OTHER CHARACTER RESUMES ECHOING.\r
+/^S CAUSES THE HANDLER TO STOP SENDING TO TERMINAL\r
+/^Q RESUMES HANDLER SENDING\r
+/ ^S AND ^Q ARE IGNORED IN OTHER CASES\r
+\r
+/WHENEVER PRINTING CHARACTERS (EITHER ON OUTPUT OR WHEN ECHOING),\r
+/ IGNORES NULLS\r
+/ FLAGS LC WITH AN APOSTROPHE\r
+/ HANDLES TABS CORRECTLY (SEVERAL WAYS)\r
+/ PRINTS ESCAPE AS $\r
+/ DELAYS 16 MS AFTER LINEFEEDS\r
+/ PRINTS CONTROL CHARACTERS AS "^K"\r
+\r
+/DOES AUTOMATIC CR/LF AT END OF LINE WIDTH.\r
+\r
+/MAINTENANCE RELEASE CHANGES:\r
+\r
+/1. ADDED KCC FOR NON-CONSOLE TELETYPES\r
+\r
+/V3D CHANGES: (VERSION E)\r
+\r
+/1. ADDED DELAY OPTION FOR VT78\r
+/2. ADDED SCOPE RUBOUTS\r
+/3. CHANGED VT78 DEFAULTS\r
+/4. REARRANGED CODE FOR SET TTY ESC AND ARROW\r
+\f INDVC=03\r
+ OUTDVC=04\r
+\r
+ KSF=10^INDVC+6001\r
+ KCC=10^INDVC+6002\r
+ KRS=10^INDVC+6004\r
+ KRB=KCC KRS\r
+ TSF=10^OUTDVC+6001\r
+ TCF=10^OUTDVC+6002\r
+ TPC=10^OUTDVC+6004\r
+ TLS=TCF TPC\r
+\r
+ TTYVERSION="E&77\r
+\f/BUILD YOUR OWN TELETYPE HANDLER:\r
+\r
+/THIS SOURCE HAS MUMBLE LOCATIONS LEFT.\r
+\r
+/THE FOLLOWING CONDITIONALS ALLOW YOU TO INCLUDE OPTIONAL FEATURES.\r
+/YOU MAY INCLUDE AS MANY OR AS FEW AS YOU DESIRE PROVIDED THERE\r
+/IS ROOM LEFT.\r
+\r
+/CONDITIONAL LOCATIONS LOCATIONS INCLUDED\r
+/VARIABLE PAGE 1 PAGE 2 FEATURES\r
+\r
+/ DELAY 0 7 DELAY AFTER GIVEN CHAR\r
+/ CTRL 0 3 PRINT CONTROL CHARS AS ^K\r
+/ RUB 0 0 PRINT CHAR RUBBED OUT ON RUBOUTS\r
+/ SIMTAB 0 10 SIMULATE TABS AS SPACES\r
+/ SLOTAB 0 6 PUT OUT 2 RUBOUTS AFTER A TAB\r
+/ ESC 0 10 PRINT ESCAPE AS $\r
+/ FLAGLC 0 12 FLAG LOWER CASE CHARS ON OUTPUT\r
+/ CNVLC 0 7 CONVERT LOWER CASE ON INPUT TO UPPER CASE\r
+/ ALTMOD 0 11 CONVERT ALTMODES (175,176) TO ESCAPE (33)\r
+/ PAUS 0 20 PAUSE BETWEEN PAGES\r
+/ FREE LOCS: 2 33\r
+\r
+ VT78=1 /SET TO 0 TO ALLOW OTHER PARAMETERS\r
+ /SET TO 1 TO FORCE OTHER PARAMETERS TO VT78 COMPATIBLE\r
+\r
+ DELAY=0 /SET NON-ZERO TO ALLOW DELAY AFTER ANY CHAR (12=CR)\r
+ /TYPICALLY AFTER LF FOR HIGH SPEED VT05\r
+ /SET VALUE OF DELAY = 7-BIT CHAR TO DELAY AFTER\r
+\r
+ CTRL=1 /SET TO 1 TO ECHO CONTROL CHARS AS ^K\r
+ /SET TO 0 TO ACCEPT CONTROL CHARACTERS AND PUT\r
+ /IN BUFFER, BUT NOT ECHO THEM (EXCEPT THE USUAL)\r
+ RUB=1 /SET TO 0 TO ECHO EACH RUBOUT BY TYPING A BACK SLASH\r
+ /SET TO 1 TO ECHO CHARS RUBBED OUT UPON RUB-OUT\r
+ /SET TO 4000 TO PERFORM SCOPE TYPE RUBOUTS\r
+ SIMTAB=1 /SET TO 1 TO SIMULATE TABS AS THE CORRECT NUMBER OF SPACES\r
+ /SET TO 0 TO TYPE TABS AS TABS\r
+ SLOTAB=0 /SET TO 1 TO TYPE 2 RUBOUTS AFTER A TAB\r
+ /ONLY IS APPLICABLE IF SIMTAB=0\r
+ ALTMOD=0 /SET TO 1 TO CONVERT 175,176 TO 33\r
+ /(UPPER CASE TERMINALS ONLY)\r
+ ESC=1 /SET TO 1 TO ECHO ESCAPE AS $\r
+ /SET TO 0 TO ECHO ESCAPE AS A CONTROL CHAR (^[)\r
+ FLAGLC=1 /SET TO 1 TO FLAG LOWER CASE CHARS ON OUTPUT\r
+ /THIS IS FOR PEOPLE NOT PRIVELIDGED ENOUGH TO\r
+ /OWN A LOWER CASE TERMINAL\r
+ /SET TO 0 TO PRINT LOWER CASE CHARS AS IS\r
+ CNVLC=0 /SET TO 1 TO CONVERT LOWER CASE CHARS ON INPUT TO UPPER CASE\r
+ /SET TO 0 TO ACCEPT INPUTTED LOWER CASE CHARS AS IS\r
+ /THIS IS FOR PEOPLE WHO ARE HANDICAPPED BY A LOWER CASE\r
+ /TERMINAL AND ONLY WANT UPPER CASE\r
+ PAUS=200 /NON-0 PAUSES BETWEEN SCOPE PAGES\r
+ HEIGHT=30 /NUMBER OF LINES PER SCREEN\r
+\r
+/SOME OF THE ABOVE OPTIONS SHOULD ACTUALLY BE IMPLEMENTED\r
+/IN SUCH A MANNER THAT THE USER CAN CHANGE THEM VIA AN ALTER\r
+/RATHER THAN HAVE TO REASSEMBLE.\r
+\r
+ IFNZRO VT78 <\r
+ DELAY=0\r
+ CTRL=1\r
+ RUB=4000\r
+ SIMTAB=0\r
+ SLOTAB=0\r
+ ALTMOD=0\r
+ ESC=1\r
+ FLAGLC=0\r
+ CNVLC=0\r
+ IFNZRO INDVC-3 <CTRL=0>\r
+ >\r
+\f/CROSS PAGE LINKAGE:\r
+\r
+/THIS CODE MUST BE ABLE TO LOAD INTO ANY TWO PAGES OF CORE\r
+/THE ENTRY POINT IS AT THE NEXT LOCATION TO THE END OF THE FIRST PAGE\r
+/AT THE END OF THE FIRST PAGE WE JMS TO PLINK,\r
+/THIS LEAVES THE ADDRESS OF THE FIRST LOCATION OF THE NEXT PAGE\r
+/IN LOCATION 'PLINK' . THIS JUST HAPPENS TO BE THE ADDRESS\r
+/OF BOTH TTYPCH AND TTYGCH.\r
+\r
+/TTYPCH AND TTYGCH SHARE THE SAME ENTRY POINT.\r
+/IF IT IS CALLED WITH A 0 AC, IT IS A CALL TO TTYGCH,\r
+/IF IT IS CALLED WITH A NON-ZERO AC, IT IS A CALL TO TTYPCH.\r
+\r
+/RETURN 1 MEANS GOT RUBOUT\r
+/TTYGCH TAKES RETURN 2 IF IT GOT A ^Z.\r
+/OTHERWISE IT TAKES RETURN 3 WITH CHARACTER GOTTEN IN AC.\r
+\r
+/TTYPCH TAKES RETURN 1 IF IT WANTS THE HANDLER TO GO AWAY,\r
+/I.E IF IT SAW A ^Z.\r
+/AC IS NORMALLY NON-ZERO UPON RETURN\r
+/AC IS POSITIVE MEANS DO A CRLF\r
+\r
+/WHEN ECHOING WE WANT TO CALL TTYPRT\r
+/BUT OTHERWISE WE WANT TO CALL TTYPCH (WHICH DOES ADDITIONAL\r
+/STUFF LIKE CHECK ^O, ^Q, ETC.\r
+/WE TELL BY WHETHER OR NOT TTYGCH HAD BEEN PREVIOUSLY CALLED.\r
+\f *200\r
+\r
+PLINK, 0 /GETS ADDRESS OF TTYPCH AND TTYGCH (START OF NEXT PAGE)\r
+ STL CLA RAR /4000\r
+ TAD I TTY /RETRIEVE FUNCTION WORD, BUT PUT R/W BIT IN LINK\r
+ AND L3700 /EXTRACT NUMBER OF DOUBLE-WORDS TO TRANSFER\r
+ CMA /GET COUNT+1\r
+ DCA BUFSIZ /STORE AWAY\r
+ RDF /FIND OUT THE USER'S DATA FIELD\r
+ TAD CIFCDF /FORM OUR EXIT CIF CDF\r
+ DCA TTYXIT /STORE AWAY FOR EXIT ROUTINE\r
+ TAD TTY70 /GET FUNCTION WORD\r
+L776, AND I TTY /ISOLATE FIELD OF BUFFER\r
+ TAD TTYCDF /FORM CDF TO FIELD OF BUFFER\r
+ DCA TTCDBF /STORE WHERE IT WILL BE USEFUL\r
+ /AT SAME TIME, INITIALIZE TTYEOF\r
+ ISZ TTY /POINT TO BUFFER ADDRESS\r
+ TAD I TTY /AND GET IT\r
+ DCA BUFSTRT /AND SAVE IT\r
+ ISZ TTY /POINT TO BLOCK #\r
+TTY376, ISZ TTY /POINT TO ERROR RETURN\r
+SHIFT, /OUTPUT SHIFT REGISTER\r
+TTYEOF, /0 IF SAW CR OR ^Z AND WISH TO PAD BUFFER WITH 0'S\r
+TTCDBF, HLT /CDF BUFFER FIELD\r
+ JMP TTYKLG\r
+TTYLP, SNL CLA /LINK=1 MEANS OUTPUT\r
+ JMP TTYGET /INPUT IS FROM TTY:\r
+\f/LINK MUST BE SET FIRST TIME THROUGH HERE.\r
+/IT ACTS AS A GUARD BIT IN THE SHIFT REGISTER\r
+ROTL, RTL\r
+ RTL\r
+ SPA /DO WE HAVE 8 BITS SHIFTED IN?\r
+ JMP TELP\r
+ DCA SHIFT /SAVE SHIFT REGISTER\r
+ TAD I BUFSTRT\r
+ SZA\r
+ JMS PUNCH /PRINT A CHARACTER\r
+ TAD I BUFSTRT\r
+ ISZ BUFSTRT /BUMP INPUT POINTER\r
+TT7400, 7400 /PROTECT ISZ\r
+ AND TT7400\r
+ CLL RAL\r
+ TAD SHIFT /SHIFT HIGH ORDER 4 BITS INTO\r
+ JMP ROTL /SHIFT REGISTER\r
+TELP, JMS PUNCH /PRINT 3RD CHARACTER OF DOUBLE-WORD\r
+ STL /***KLUDGE\r
+TTYKLG, ISZ BUFSIZ /DONE?\r
+ JMP TTYLP /NOT YET\r
+TTYX, TAD TTYEOF /IF INPUT AND WE WERE PADDING WITH 0'S\r
+ SZA CLA /TAKE SOFT ERROR EXIT\r
+TTYRTN, ISZ TTY /POINT TO NORMAL RETURN\r
+ /CAN'T GET ERROR OR END-OF-FILE ON OUTPUT\r
+TTYXIT, HLT /RETURN TO USER'S FIELD\r
+ JMP I TTY /RETURN TO USER\r
+TTYCA, 0\r
+TTYWC, 0\r
+BUFSIZ, 0\r
+BUFSTRT,0\r
+TTY70, 70\r
+\r
+PUNCH, 0 /NEVER CALL TTYPCH WITH ZERO AC\r
+ JMS I PLINK /CALL TTYPCH\r
+ JMP TTYRTN /GO AWAY, WE SAW A ^Z\r
+L7700, SMA CLA /DID WE REACH END OF TTY LINE?\r
+ JMS CRLF /YES, PERFORM CR/LF\r
+ JMP I PUNCH /RETURN\r
+\r
+TMP,\r
+CRLF, 0\r
+ TAD L215\r
+ JMS I PLINK /CALL TTYPCH TO PRINT CR\r
+L215, 215 /CAN'T RETURN HERE\r
+ CLA /****\r
+ TAD L212\r
+ JMS I PLINK /CALL TTYPCH TO PRINT LF\r
+L212, 212 /CAN'T RETURN HERE\r
+ CLA /****\r
+ JMP I CRLF /RETURN\r
+\fCTRLU, JMS CRLF /PERFORM A CR/LF\r
+TTYGET, TAD BUFSTRT\r
+ DCA TTYCA /POINT TO START OF BUFFER\r
+ TAD BUFSIZ\r
+ CLL RAL /CONVERT DOUBLE-WORDS TO WORDS\r
+DCAWC, DCA TTYWC /SET SIZE OF BUFFER\r
+TSTEND, TAD TTYEOF\r
+ SNA CLA\r
+ JMP ZERO\r
+ JMS I PLINK /CALL TTYGCH TO GET A CHARACTER\r
+ JMP RUBOUT /RETURN 1 MEANS SAW RUBOUT\r
+ZERO, DCA I TTYCA /RETURN 2 MEANS GOT CHARACTER\r
+ /STORE AWAY TEMPORARILY\r
+ /USING USER'S BUFFER AS A TEMP LOCATION\r
+ TAD I TTYCA /GET BACK CHARACTER\r
+ IFNZRO .-320 <_ERROR>\r
+ SZA\r
+ JMS PUNCH /ECHO IT\r
+ TAD I TTYCA /GET IT AGAIN\r
+ TAD M32 /-^Z\r
+ SNA\r
+ JMP CTRLZ\r
+ TAD L5 /^Z-^U\r
+ SNA /IS IT ^U?\r
+ JMP CTRLU /YES\r
+ TAD L7\r
+GRUDGE, DCA TMP\r
+ ISZ TTYCA /NO\r
+L7, 7\r
+ ISZ TTYWC /IS BUFFER FULL?\r
+TT10, SKP\r
+ JMP TTYX\r
+ ISZ TMP /WAS LAST CHAR A CR?\r
+ JMP TSTEND /NO\r
+ DCA TTYEOF /YES, SET "PAD WITH 0'S" FLAG\r
+ ISZ TTY /POINT TO NORMAL RETURN\r
+ /CR IS NOT AN ERROR OR END-OF-FILE\r
+ TAD L212 /IF LAST CHAR INPUT WAS CR, NOW PRETEND LF WAS INPUT\r
+ JMP ZERO /REJOIN PROCESSING\r
+\r
+CTRLZ, DCA TTYEOF\r
+ JMS CRLF\r
+ JMP GRUDGE\r
+\r
+M32, -32\r
+L5, 5\r
+L3700, 3700\r
+CIFCDF, CIF CDF 0\r
+TTYCDF, CDF 0\r
+\r
+/TTYEOF IS ZERO MEANS PAD BUFFER WITH ZEROES\r
+\f/DON'T DO YET:\r
+/RUBOUT, AND TTYWC /177 IN AC\r
+/ SNA CLA\r
+/ JMP CTRLU\r
+\r
+RUBOUT, KCC /TTYGCH DOESN'T CLEAR RO FROM BUFFER\r
+ TAD TTYCA\r
+ CIA\r
+ TAD BUFSTRT\r
+ SNA CLA /ARE WE AT BEGIN OF BUFFER?\r
+ JMP CTRLU /YES\r
+ STA\r
+ TAD TTYCA\r
+ DCA TTYCA\r
+ IFZERO RUB <\r
+LSLASH, "\\r
+ TAD LSLASH /PRINT A BACK SLASH FOR EACH RUBBED OUT CHAR\r
+ >\r
+ IFNZRO RUB&4000+RUB <TAD I TTYCA> /PRINT CHAR JUST DELETED\r
+ IFNZRO RUB&4000 <TAD TT10> /BACKSPACE-SPACE-BACKSPACE\r
+ JMS PUNCH\r
+ STA\r
+ TAD TTYWC\r
+ JMP DCAWC /BUMP BACK WC AND GET ANOTHER CHAR\r
+\r
+ ZBLOCK 376-.\r
+TTY, TTYVERSION /ENTRY POINT TO HANDLER\r
+ JMS PLINK /SET UP CROSS PAGE LINKAGE\r
+ IFNZRO TTY-376 <ENTERR,QQQQ>\r
+ PAGE\r
+\f/INTERLUDE:\r
+\r
+/USA STANDARD CODE FOR INFORMATION INTERCHANGE:\r
+\r
+/ 000 001 010 011 100 101 110 111\r
+/\r
+/ 0000 NUL DLE SP 0 @ P ' 'P\r
+/\r
+/ 0001 SOH DC1 ! 1 A Q 'A 'Q\r
+/\r
+/ 0010 STX DC2 " 2 B R 'B 'R\r
+/\r
+/ 0011 ETX DC3 # 3 C S 'C 'S\r
+/\r
+/ 0100 EOT DC4 $ 4 D T 'D 'T\r
+/\r
+/ 0101 ENQ NAK % 5 E U 'E 'U\r
+/\r
+/ 0110 ACK SYN & 6 F V 'F 'V\r
+/\r
+/ 0111 BEL ETB ' 7 G W 'G 'W\r
+/\r
+/ 1000 BS CAN ( 8 H X 'H 'X\r
+/\r
+/ 1001 HT EM ) 9 I Y 'I 'Y\r
+/\r
+/ 1010 LF SUB * : J Z 'J 'Z\r
+/\r
+/ 1011 VT ESC + ; K [ 'K '[\r
+/\r
+/ 1100 FF FS , < L \ 'L '\\r
+/\r
+/ 1101 CR GS - = M ] 'M ']\r
+/\r
+/ 1110 SO RS . > N ^ 'N '^\r
+/\r
+/ 1111 SI US / ? O _ 'O '_\r
+/\r
+\f/TTYGCH: GETS A CHAR FROM KBD\r
+/ IF GOT ^Z, IT SETS TTYEOF FLAG\r
+/ LEAVES IT IN AC IN 7-BIT\r
+\r
+/TTYPRT: PRINTS CHAR IN AC ON TTY\r
+/ IGNORES NULLS\r
+/ PRINTS ^X ON CONTROL CHARS (EXCEPT CR, LF, FF, VT, TAB)\r
+/ PRINTS 'X ON LOWER CASE\r
+\r
+/HANDLES TABS CORRECTLY\r
+/ AND AUTOMATICALLY PRINTS CR/LF AT EOL\r
+/ PRINTS ESCAPE AS $\r
+\r
+/TTYTLS: USED TO ACTUALLY PRINT CHAR\r
+/ IT HANDLES TABS AUTOMATICALLY\r
+/ AND CR/LF'S AT END OF LINE\r
+\r
+/TTYPCH: IT USES TTYPRT TO PRINT CHAR BUT ALSO RESPONDS TO\r
+/ ^C, ^O, ^S, ^Q.\r
+/ IF ^Z IS BEING PRINTED, IT THEN STOPS FURTHER PRINTING\r
+\f/MUST BE AT TOP OF PAGE\r
+TTYPCH, /ENTRY POINT TO TTY PUNCH ROUTINE\r
+ /OR TTY PRINT ROUTINE\r
+TTYGCH, 0 /ENTRY POINT TO TTY GET CHAR ROUTINE\r
+ SNA\r
+ JMS TGCH /ZERO AC-MEANT CALL TO TTYGCH\r
+PCH, AND (177 /FORCE TO 7-BIT\r
+ DCA TCHAR\r
+ TAD TGCH\r
+M140, SZA CLA /ARE WE ECHOING?\r
+ JMP ECHO /YES, IGNORE ^S AND STUFF\r
+K5, 5 /MUST BE AT REL 10\r
+ TAD TCHAR\r
+ TAD (-32\r
+ IFZERO PAUS <\r
+ SNA CLA\r
+ JMP I TTYPCH\r
+ >\r
+ IFNZRO PAUS <\r
+ SNA\r
+ JMP I TTYPCH\r
+ TAD L15 /32-15\r
+ SNA CLA /LOOK FOR CR\r
+ ISZ LINCNT /AT END OF PAGE?\r
+ JMP NOPAUS /NOT AT CR, OR AT CR BUT NOT AT END OF PAGE\r
+L15, 15 /MUST BE HERE FOR SET\r
+ TAD PAUSN\r
+ DCA TTYTLS /SET COUNT FOR OUTER LOOP\r
+ ISZ LINCNT\r
+ JMP .-1\r
+ ISZ TTYTLS\r
+ JMP .-3\r
+ TAD LINSYZ\r
+ DCA LINCNT\r
+ >\r
+NOPAUS, JMS TTYTST\r
+ TAD (203-217 /NO\r
+ SNA /^O?\r
+ DCA TCHAR /YES, SET TO NULL SO IT WILL BE IGNORED\r
+ TAD (217-223 /NO\r
+ SZA CLA /^S?\r
+ JMP ECHO /NO, IGNORE CHAR\r
+TTCTLQ, JMS TTYTST\r
+ TAD (203-221 /NO, NOTHING ELSE MATTERS UNTIL ^Q\r
+ SZA CLA /^Q?\r
+ JMP TTCTLQ /NO, SUSPEND OUTPUTTING\r
+TTY32, KCC /YES, REMOVE ^Q FROM BUFFER\r
+/HAD NO ROOM FOR:\r
+/ TAD LINSYZ\r
+/ DCA LINCNT\r
+ECHO, DCA TGCH\r
+ ISZ TTYPCH\r
+ IFNZRO ESC <\r
+ TAD TCHAR\r
+ TAD (-33\r
+ SZA CLA\r
+ JMP .+3\r
+ TAD L44\r
+ DCA TCHAR\r
+L44, 44\r
+ >\r
+ TAD TCHAR\r
+ SNA\r
+ JMP TTYCTO /IGNORE NULLS\r
+ IFNZRO RUB&4000 <\r
+ TAD (-10\r
+ SNA\r
+ JMP RUBO\r
+ TAD (10-16\r
+ >\r
+ IFZERO RUB&4000 <\r
+ TAD (-16\r
+ >\r
+TTY100, CLL\r
+TTY10, TAD K5\r
+TTY240, SZA /TAB?\r
+ JMP NOTAB\r
+ IFNZRO SIMTAB <\r
+TTYTAB, TAD TTY240\r
+ JMS TTYTLS\r
+TTY7, 7 /HERE FOR NO SPECIAL REASON\r
+ TAD TABCTR\r
+ AND TTY7\r
+ SZA CLA\r
+ JMP TTYTAB\r
+ JMP TTYCTO\r
+ >\r
+ IFNZRO SLOTAB <\r
+ TAD TCHAR\r
+ JMS TTYTLS\r
+ TAD (177\r
+ JMS TTYTLS\r
+ TAD (177\r
+ JMP PRIN+1\r
+ >\r
+ IFZERO SIMTAB+SLOTAB <JMP PRIN>\r
+\r
+/BUG: IF HARDWARE TABS, DON'T COUNT COLUMNS CORRECTLY\r
+\r
+ IFNZRO RUB&4000 <\r
+RUBO, TAD TTY10 /OUTPUT BACKSPACE-RUBOUT-BACKSPACE\r
+ JMS TTYTLS\r
+ TAD TTY240\r
+ JMS TTYTLS\r
+ TAD (-4\r
+ TAD TABCTR\r
+ JMP PREPRN\r
+ >\r
+\fNOTAB, SZL CLA\r
+ JMP SPCHR /DON'T UPARROW CHARS LF,CR,TAB,VT,FF\r
+ IFNZRO FLAGLC <\r
+ TAD TCHAR\r
+ AND TTY140\r
+ TAD M140\r
+ SZA CLA /IS IT LC?\r
+ JMP NOLC /NO\r
+TTYQUO, "'\r
+ TAD TTYQUO /YES\r
+ JMS TTYTLS /PRINT QUOTE\r
+ TAD M40\r
+ JMP PRIN /PRINT UPPER CASE OF CHAR\r
+ >\r
+NOLC, TAD TCHAR /NO, GET BACK CHAR\r
+ AND TTY140 /HIGH ORDER BITS IRRELEVANT\r
+ IFNZRO CTRL <\r
+M40, SMA SZA CLA /CAN'T BE NEGATIVE\r
+ JMP PRIN /NOT A CONTROL CHARACTER\r
+ TAD TTYUPA /ECHO 201-237 AS ^X (EXCEPT 211-215)\r
+ JMS TTYTLS\r
+ TAD TTY100 /ADD X100 TO ^K TO GET K\r
+ >\r
+ IFZERO CTRL <\r
+ SNA CLA /IS CHAR A CONTROL CHAR?\r
+ JMP TTYCTO /YES, DON'T ECHO CONTROL CHARACTERS EXCEPT FOR 211-215\r
+ >\r
+PRIN, TAD TCHAR\r
+ JMS TTYTLS\r
+TTYCTO, TAD TABCTR /RETURN TABCNT IN AC\r
+ JMP I TTYPCH\r
+\r
+ IFZERO CTRL <\r
+M40, -40\r
+ >\r
+\r
+TTY140,\r
+SPCHR, STA CLL\r
+ TAD LINSIZ\r
+PREPRN, DCA TABCTR /THESE CHARS RESET COLUMN COUNTER\r
+ JMP PRIN\r
+\fTGCH, 0 /NON-ZERO MEANS TTYGCH WAS CALLED\r
+ KSF\r
+ JMP .-1 /WAIT FOR CHAR TO BE TYPED\r
+ JMS TTYTST\r
+/WILD: (DON'T PUT IN) SZA CLA /FALL THRU AND RETURN R.O.\r
+/ ISZ TTYGCH\r
+ TAD (203-377\r
+ SNA CLA /TAKE RETURN 1 ON RUB OUT\r
+ JMP I TTYGCH /"CLUMSY" - R.L. (9/18/73)\r
+ ISZ TTYGCH\r
+ KRB /GET CHARACTER\r
+TTYAND, AND (177 /MUST RETURN CHAR IN 7-BIT\r
+ IFNZRO CNVLC <\r
+ DCA TCHAR\r
+ TAD TCHAR\r
+ AND TTY140\r
+ TAD M140\r
+ SNA CLA /IS IT LC?\r
+ TAD M40 /YES\r
+ TAD TCHAR /NO\r
+ >\r
+ IFNZRO ALTMOD <\r
+ TAD (-175 /IS IT 175 OR 176?\r
+ SMA\r
+ JMP CONV /YES, CONVERT ALTMODE TO ESCAPE\r
+ TAD (175 /NO, RESTORE CHAR\r
+ >\r
+ JMP I TTYGCH /TAKE RETURN 3\r
+\r
+/SHOULDN'T TABCTR BE INITIALIZED TO C(LINSIZ) UPON ENTRY?\r
+\r
+TABCTR, -110\r
+\r
+TTYTLS, 0\r
+ TLS\r
+ IFNZRO DELAY <\r
+ TAD (-DELAY\r
+ SZA CLA\r
+ STA\r
+ >\r
+TTYTSF, TSF\r
+ JMP .-1\r
+ IFNZRO DELAY <\r
+ IAC\r
+ SZA /19.66 MS IS G.T. 1/60 SEC\r
+ JMP TTYTSF\r
+ >\r
+ ISZ TABCTR\r
+TTYUPA, "^\r
+TT7600, 7600\r
+ JMP I TTYTLS\r
+LINSIZ, -110\r
+\r
+ IFNZRO PAUS <\r
+LINSYZ, -HEIGHT\r
+LINCNT, -HEIGHT\r
+PAUSN, -PAUS\r
+ >\r
+\r
+ IFNZRO ALTMOD <\r
+ IFNZRO KCC-6032 <\r
+CONV, CLA\r
+ TAD (33\r
+ JMP I TTYGCH\r
+ >\r
+ IFZERO KCC-6032 <\r
+CONV, CLA IAC\r
+ TAD TTY32 /DEVICE DEPENDENT\r
+ JMP TTYAND\r
+ >\r
+ >\r
+\fTCHAR, 0\r
+\r
+/TTYTST: READS KEYBOARD STATICALLY AND RESPONDS TO ^C\r
+/ OTHERWISE RETURNS CHAR (8-BIT) MINUS 203 IN AC.\r
+/ IF FLAG IS NOT UP, IT RETURNS A 1.\r
+\r
+TTYTST, 0\r
+ TAD TT7600 /OR CHAR IN\r
+ KRS\r
+ TAD (-7603 /-7603=175\r
+ KSF\r
+ CLA IAC /STUFF IN BUFFER IS UNRELIABLE IF FLAG ISN'T UP\r
+ SZA\r
+ JMP I TTYTST\r
+ IFNZRO INDVC-3 <KCC>\r
+ CIF CDF 0 /BRANCH TO OS/8 MONITOR AT 07600\r
+ JMP I TT7600 /IT WILL PRINT "^C" FOR CHAR IN BUFFER\r
+ PAGE\r
+\f/ DYNAMICALLY MODIFYING THE KL8E HANDLER\r
+\r
+/ *** I M P O R T A N T ***\r
+\r
+/ THIS HANDLER CAN BE DYNAMICALLY CHANGED VIA SET COMMANDS.\r
+/ CONSEQUENTLY, IT IS EXTREMELY IMPORTANT THAT PEOPLE\r
+/ WHO MODIFY THIS SOURCE DO NOT AFFECT THE ALGORITHMS\r
+/ NECESSARY TO PERFORM SUCH MODIFICATIONS.\r
+\r
+/ THIS ALGORITHM IS EXPLAINED BELOW.\r
+\r
+/ SET TTY WIDTH=N\r
+\r
+/ SEARCH LOCATIONS 200-377 FOR A 7600. CALL ITS ADDRESS X.\r
+/ LET Y BE THE INSTRUCTION AT LOCATION X+1.\r
+/ FORM THE (RELATIVE) ADDRESS T=Y&177+200-1.\r
+/ THEN LOCATIONS T AND X+2 CONTAIN MINUS THE TTY WIDTH.\r
+/ THE WIDTH MUST BE A MULTIPLE OF 10 AND MUST NOT BE 200.\r
+/ (BECAUSE -200 IS THE MAGIC 7600)\r
+\r
+/ SET TTY CODE XX\r
+\r
+/ SEARCH ENTIRE HANDLER FOR INSTRUCTIONS OF THE FORM 6XXY\r
+/ WHERE XX IS NOT 20 OR 21,\r
+/ AND FURTHERMORE DON'T INCLUDE A 6031 IF 2 LOCATIONS\r
+/ FOLLOWING IS A 7650\r
+/ AND DON'T INCLUDE A 6034 IF 4 LOCATIONS FOLLOWING IS A 7650.\r
+\r
+\r
+/ SET TTY [NO] ECHO\r
+\r
+/ THE WORD INVOLVED IS AT (RELATIVE) LOCATION 120.\r
+/ SET TO 7440 TO ECHO.\r
+/ SET TO 7610 TO SUPPRESS ECHOING.\r
+\r
+\r
+/ SET TTY LC\r
+\r
+/ SEARCH LOCATIONS 200-377 FOR A 377. CALL ITS ADDRESS X.\r
+/ LOOK AT LOCATION X+5.\r
+/ IF THIS LOCATION IS NOT A 7650, THEN LC TO UC CONVERSION\r
+/ WAS NOT ENABLED AT ASSEMBLY TIME.\r
+/ IF THE FEATURE IS ENABLED, CHANGE LOCATION X+5 TO A 7610\r
+/ TO PREVENT THE CONVERSION. TO ALLOW CONVERSION, SET\r
+/ LOCATION X+5 BACK TO 7650.\r
+\r
+/ SET TTY PAGE\r
+\r
+/ SEARCH LOCATIONS 215-300 FOR A 7450. CALL ITS ADDRESS X.\r
+/ SET X+3 TO 7640 TO ENABLE ^S, ^Q.\r
+/ SET X+3 TO 7200 TO DISABLE ^S, ^Q.\r
+\f/ SET TTY TAB\r
+\r
+/ SEARCH LOCATIONS 200-300 FOR A 7.\r
+/ IF NOT FOUND, SIMULATED TABS WAS NOT ENABLED AT ASSEMBLY TIME.\r
+/ IF FOUND, CALL ITS ADDRESS X.\r
+/ TO PATCH OUT SIMULATED TABS:\r
+/ MOVE C(X-12) TO LOCATION X-2\r
+/ CHANGE LOCATION X+3 TO A 7610\r
+/ TO RESTORE SIMULATED TABS:\r
+/ SET LOCATION X-2 TO X-4&77+1200\r
+/ CHANGE LOCATION X+3 TO A 7640\r
+\r
+/ SET TTY FILL\r
+\r
+/ THE LITERAL 177 MUST REMAIN AT THE END OF PAGE 2\r
+/ SEARCH LOCATIONS 200-300 FOR A 1377.\r
+/ IF NOT FOUND, THEN FILL CHARACTERS WERE NOT ENABLED AT ASSEMBLY\r
+/ TIME. IF FOUND, CALL ITS ADDRESS X.\r
+/ TO PATCH OUT FILL CHARACTERS, MOVE C(X+3) TO LOCATION X-1.\r
+/ TO RESTORE FILL CHARACTERS, MOVE C(X+1) TO LOCATION X-1.\r
+\r
+/ SET TTY FLAGLC\r
+\r
+/ SEARCH LOCATIONS 200-377 FOR A 247.\r
+/ IF NOT FOUND, LOWER CASE FLAGGING WAS NOT ENABLED AT ASSEMBLY TIME.\r
+/ IF FOUND, CALL ITS ADDRESS X.\r
+/ TO DISABLE FLAGGING, SET LOCATION X-2 TO A 7200.\r
+/ TO RE-ENABLE FLAGGING, SET LOCATION X-2 TO A 7640.\r
+\r
+/ SET TTY PAUSE [N]\r
+\r
+/ SEARCH LOCATIONS 200-300 FOR A 15.\r
+/ IF NOT FOUND, PAUSING WAS NOT ENABLED AT ASSEMBLY TIME.\r
+/ IF FOUND, CALL ITS ADDRESS X.\r
+/ TO DISABLE PAUSING AFTER A FULL SCREEN,\r
+/ SET LOCATION X-3 TO A 7610.\r
+/ TO RE-ENABLE PAUSING, SET LOCATION X-3 TO A 7650.\r
+/ TO SET PAUSE DURATION, SEARCH LOCATIONS 300-377 FOR A 7600,\r
+/ CALLING ITS ADDRESS X. THEN (MINUS THE) PAUSE DURATION IS AT\r
+/ LOCATION X+5.\r
+\r
+/ SET TTY HEIGHT\r
+\r
+/ THIS IS ONLY APPLICABLE IF SET TTY PAUSE HAS BEEN ASSEMBLED IN\r
+/ (A 15 CAN BE FOUND ON SECOND PAGE).\r
+/ NEGATIVE OF HEIGHT MUST BE SET IN BOTH LOCATIONS X+3 AND X+4\r
+/ WHERE X IS THE ADDRESS OF A 7600 AS IN ABOVE.\r
+\f/ SET TTY ESCAPE\r
+\r
+/ SEARCH LOCATIONS 200-377 FOR A 44.\r
+/ IF NOT FOUND, THEN $ WAS NOT ASSEMBLED INTO TTY HANDLER.\r
+/ IF FOUND, CALL ITS ADDRESS X.\r
+/ TO DISABLE PRINTING ESCAPE AS $, SET LOCATION X-4 TO A 'CLA'.\r
+/ TO CAUSE ESCAPE TO PRINT AS AN ESCAPE, SET LOCATION X-4 TO SZA CLA.\r
+\r
+/ SET TTY ARROW\r
+\r
+/ SEARCH LOCATIONS 200-377 FOR 7740.\r
+\r
+/ IF NOT FOUND, USING OLD HANDLER.\r
+/ CALL ITS ADDRESS X.\r
+/ IF LOCATION X+1 IS MORE THAN 7000,\r
+/ THEN UPARROW MODE WAS NOT ASSEMBLED INTO KL8E.\r
+/ OTHERWISE, TO ALLOW ARROWS, SET LOCATION X+3 TO THE\r
+/ CONTENTS OF LOCATION X+6.\r
+/ TO CAUSE CONTROL CHARACTERS TO ECHO AS IS, SET\r
+/ LOCATION X+3 TO 'SKP CLA'.\r
+/ NOTE THAT THIS IS A DIFFERENT OPTION THAN ASSEMBLING CTRL=0.\r
+\f IFDEF TEST <\r
+ *600\r
+\r
+/TEST ROUTINE FOR KL8E HANDLER\r
+\r
+GO, JMS I (TTY /CALL HANDLER\r
+ 0600 /READ SIX PAGES\r
+ 1000 /BUFFER AT 01000\r
+ 0001 /BLOCK 1\r
+ HLT /ERROR RETURN\r
+ JMS I (TTY /CALL HANDLER AGAIN\r
+ 4600 /OUTPUT SIX PAGES\r
+ 1000\r
+ 0001\r
+ HLT\r
+ CLA\r
+ JMP GO\r
+ >\r
+ $\r
+\f\1a\0
\ No newline at end of file