--- /dev/null
+/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