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