Add README.md
[pdp8.git] / sw / os8 / v3d / sources / devext / dectapes / dectape1 / kl8e.pa
1 /19 SUPER TTY HANDLER FOR OS/8
2 /
3 /
4 /
5 /
6 /
7 /
8 /
9 /
10 /
11 /COPYRIGHT (C) 1974,1975,1977,1978 BY DIGITAL EQUIPMENT CORPORATION
12 /
13 /
14 /
15 /
16 /
17 /
18 /
19 /
20 /
21 /
22 /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
23 /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
24 /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
25 /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT.
26 /
27 /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
28 /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
29 /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
30 /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL.
31 /
32 /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
33 /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
34 /DIGITAL.
35 /
36 /
37 /
38 /
39 /
40 /
41 /
42 /
43 /
44 /
45
46 /S.W.,S.R.,H.J.,R.L.,S.R.
47
48 *0
49
50 -1
51 IFNDEF SLU <SLU=0>
52 IFZERO SLU <DEVICE KL8E;DEVICE TTY;0;TTY&177+4000;ZBLOCK 2>
53 IFZERO SLU-2 <DEVICE SLU2;DEVICE SLU2;0;TTY&177+4000;ZBLOCK 2>
54 IFZERO SLU-3 <DEVICE SLU3;DEVICE SLU3;0;TTY&177+4000;ZBLOCK 2>
55
56 /TWO-PAGE TELETYPE HANDLER FOR OS/8 V3.
57 /ON INPUT, RECOGNIZES ^Z, ^C, ^U, RUBOUT
58 /^Z MEANS END OF INPUT, INSERT ^Z IN BUFFER,
59 / PAD WITH ZEROES, AND ECHO "^Z"
60 /^C MEANS ABORT JOB, RETURN TO OS/8 VIA LOC 7600 TO SAVE CORE AND PRINT "^C"
61 /^U MEANS DELETE THE LAST LINE, ALLOW OPERATOR TO RETYPE
62 / (LINE STARTS AT BEGIN OF BUFFER AND IS TERMINATED BY A CR)
63 / A CR GETS ENTERED INTO BUFFER, CAUSES A LF TO ALSO ECHO
64 / AND GET ENTERED INTO BUFFER, BUFFER IS THEN PADDED WITH NULLS.
65 / CONVERTS LC TO UC
66
67 /ON OUTPUT RECOGNIZES ^C, ^O, ^S, ^Q FROM KEYBOARD
68 /^C CAUSES JOB TO ABORT, RETURN TO OS/8 VIA LOCATION 7600
69 / TO SAVE CORE AND PRINT "^C"
70 /^O CAUSES ECHOING BY THE HANDLER TO CEASE
71 / TYPING ANY OTHER CHARACTER RESUMES ECHOING.
72 /^S CAUSES THE HANDLER TO STOP SENDING TO TERMINAL
73 /^Q RESUMES HANDLER SENDING
74 / ^S AND ^Q ARE IGNORED IN OTHER CASES
75
76 /WHENEVER PRINTING CHARACTERS (EITHER ON OUTPUT OR WHEN ECHOING),
77 / IGNORES NULLS
78 / FLAGS LC WITH AN APOSTROPHE
79 / HANDLES TABS CORRECTLY (SEVERAL WAYS)
80 / PRINTS ESCAPE AS $
81 / DELAYS 16 MS AFTER LINEFEEDS
82 / PRINTS CONTROL CHARACTERS AS "^K"
83
84 /DOES AUTOMATIC CR/LF AT END OF LINE WIDTH.
85
86 /MAINTENANCE RELEASE CHANGES:
87
88 /1. ADDED KCC FOR NON-CONSOLE TELETYPES
89
90 /V3D CHANGES: (VERSION E)
91
92 /1. ADDED DELAY OPTION FOR VT78
93 /2. ADDED SCOPE RUBOUTS
94 /3. CHANGED VT78 DEFAULTS
95 /4. REARRANGED CODE FOR SET TTY ESC AND ARROW
96
97 /CHANGES FOR OS/78 V2
98
99 /1. CHANGED KSF TO KKSF, ETC.
100 / (DID NOT BUMP VERSION LETTER)
101 /2. MADE CONDITIONALS FOR SLU2
102 \f IFNDEF INDVC <INDVC=03>
103 IFNDEF OUTDVC <OUTDVC=INDVC+1>
104
105 KKSF=10^INDVC+6001
106 KKCC=10^INDVC+6002
107 KKRS=10^INDVC+6004
108 KKRB=KKCC KKRS
109 TTSF=10^OUTDVC+6001
110 TTCF=10^OUTDVC+6002
111 TTPC=10^OUTDVC+6004
112 TTLS=TTCF TTPC
113
114 TTYVERSION="E&77
115 \f/BUILD YOUR OWN TELETYPE HANDLER:
116
117 /THIS SOURCE HAS MUMBLE LOCATIONS LEFT.
118
119 /THE FOLLOWING CONDITIONALS ALLOW YOU TO INCLUDE OPTIONAL FEATURES.
120 /YOU MAY INCLUDE AS MANY OR AS FEW AS YOU DESIRE PROVIDED THERE
121 /IS ROOM LEFT.
122
123 /CONDITIONAL LOCATIONS LOCATIONS INCLUDED
124 /VARIABLE PAGE 1 PAGE 2 FEATURES
125
126 / DELAY 0 7 DELAY AFTER GIVEN CHAR
127 / CTRL 0 3 PRINT CONTROL CHARS AS ^K
128 / RUB 0 0 PRINT CHAR RUBBED OUT ON RUBOUTS
129 / SIMTAB 0 10 SIMULATE TABS AS SPACES
130 / SLOTAB 0 6 PUT OUT 2 RUBOUTS AFTER A TAB
131 / ESC 0 10 PRINT ESCAPE AS $
132 / FLAGLC 0 12 FLAG LOWER CASE CHARS ON OUTPUT
133 / CNVLC 0 7 CONVERT LOWER CASE ON INPUT TO UPPER CASE
134 / ALTMOD 0 11 CONVERT ALTMODES (175,176) TO ESCAPE (33)
135 / PAUS 0 20 PAUSE BETWEEN PAGES
136 / FREE LOCS: 2 33
137
138 VT78=1 /SET TO 0 TO ALLOW OTHER PARAMETERS
139 /SET TO 1 TO FORCE OTHER PARAMETERS TO VT78 COMPATIBLE
140
141 DELAY=0 /SET NON-ZERO TO ALLOW DELAY AFTER ANY CHAR (12=CR)
142 /TYPICALLY AFTER LF FOR HIGH SPEED VT05
143 /SET VALUE OF DELAY = 7-BIT CHAR TO DELAY AFTER
144
145 CTRL=1 /SET TO 1 TO ECHO CONTROL CHARS AS ^K
146 /SET TO 0 TO ACCEPT CONTROL CHARACTERS AND PUT
147 /IN BUFFER, BUT NOT ECHO THEM (EXCEPT THE USUAL)
148 RUB=1 /SET TO 0 TO ECHO EACH RUBOUT BY TYPING A BACK SLASH
149 /SET TO 1 TO ECHO CHARS RUBBED OUT UPON RUB-OUT
150 /SET TO 4000 TO PERFORM SCOPE TYPE RUBOUTS
151 SIMTAB=1 /SET TO 1 TO SIMULATE TABS AS THE CORRECT NUMBER OF SPACES
152 /SET TO 0 TO TYPE TABS AS TABS
153 SLOTAB=0 /SET TO 1 TO TYPE 2 RUBOUTS AFTER A TAB
154 /ONLY IS APPLICABLE IF SIMTAB=0
155 ALTMOD=0 /SET TO 1 TO CONVERT 175,176 TO 33
156 /(UPPER CASE TERMINALS ONLY)
157 ESC=1 /SET TO 1 TO ECHO ESCAPE AS $
158 /SET TO 0 TO ECHO ESCAPE AS A CONTROL CHAR (^[)
159 FLAGLC=1 /SET TO 1 TO FLAG LOWER CASE CHARS ON OUTPUT
160 /THIS IS FOR PEOPLE NOT PRIVELIDGED ENOUGH TO
161 /OWN A LOWER CASE TERMINAL
162 /SET TO 0 TO PRINT LOWER CASE CHARS AS IS
163 CNVLC=0 /SET TO 1 TO CONVERT LOWER CASE CHARS ON INPUT TO UPPER CASE
164 /SET TO 0 TO ACCEPT INPUTTED LOWER CASE CHARS AS IS
165 /THIS IS FOR PEOPLE WHO ARE HANDICAPPED BY A LOWER CASE
166 /TERMINAL AND ONLY WANT UPPER CASE
167 PAUS=200 /NON-0 PAUSES BETWEEN SCOPE PAGES
168 HEIGHT=30 /NUMBER OF LINES PER SCREEN
169
170 /SOME OF THE ABOVE OPTIONS SHOULD ACTUALLY BE IMPLEMENTED
171 /IN SUCH A MANNER THAT THE USER CAN CHANGE THEM VIA AN ALTER
172 /RATHER THAN HAVE TO REASSEMBLE.
173
174 IFNZRO VT78 <
175 DELAY=0
176 CTRL=1
177 RUB=4000
178 SIMTAB=0
179 SLOTAB=0
180 ALTMOD=0
181 ESC=1
182 FLAGLC=0
183 CNVLC=0
184 IFNZRO INDVC-3 <CTRL=0>
185 >
186 \f/CROSS PAGE LINKAGE:
187
188 /THIS CODE MUST BE ABLE TO LOAD INTO ANY TWO PAGES OF CORE
189 /THE ENTRY POINT IS AT THE NEXT LOCATION TO THE END OF THE FIRST PAGE
190 /AT THE END OF THE FIRST PAGE WE JMS TO PLINK,
191 /THIS LEAVES THE ADDRESS OF THE FIRST LOCATION OF THE NEXT PAGE
192 /IN LOCATION 'PLINK' . THIS JUST HAPPENS TO BE THE ADDRESS
193 /OF BOTH TTYPCH AND TTYGCH.
194
195 /TTYPCH AND TTYGCH SHARE THE SAME ENTRY POINT.
196 /IF IT IS CALLED WITH A 0 AC, IT IS A CALL TO TTYGCH,
197 /IF IT IS CALLED WITH A NON-ZERO AC, IT IS A CALL TO TTYPCH.
198
199 /RETURN 1 MEANS GOT RUBOUT
200 /TTYGCH TAKES RETURN 2 IF IT GOT A ^Z.
201 /OTHERWISE IT TAKES RETURN 3 WITH CHARACTER GOTTEN IN AC.
202
203 /TTYPCH TAKES RETURN 1 IF IT WANTS THE HANDLER TO GO AWAY,
204 /I.E IF IT SAW A ^Z.
205 /AC IS NORMALLY NON-ZERO UPON RETURN
206 /AC IS POSITIVE MEANS DO A CRLF
207
208 /WHEN ECHOING WE WANT TO CALL TTYPRT
209 /BUT OTHERWISE WE WANT TO CALL TTYPCH (WHICH DOES ADDITIONAL
210 /STUFF LIKE CHECK ^O, ^Q, ETC.
211 /WE TELL BY WHETHER OR NOT TTYGCH HAD BEEN PREVIOUSLY CALLED.
212 \f *200
213
214 PLINK, 0 /GETS ADDRESS OF TTYPCH AND TTYGCH (START OF NEXT PAGE)
215 STL CLA RAR /4000
216 TAD I TTY /RETRIEVE FUNCTION WORD, BUT PUT R/W BIT IN LINK
217 AND L3700 /EXTRACT NUMBER OF DOUBLE-WORDS TO TRANSFER
218 CMA /GET COUNT+1
219 DCA BUFSIZ /STORE AWAY
220 RDF /FIND OUT THE USER'S DATA FIELD
221 TAD CIFCDF /FORM OUR EXIT CIF CDF
222 DCA TTYXIT /STORE AWAY FOR EXIT ROUTINE
223 TAD TTY70 /GET FUNCTION WORD
224 L776, AND I TTY /ISOLATE FIELD OF BUFFER
225 TAD TTYCDF /FORM CDF TO FIELD OF BUFFER
226 DCA TTCDBF /STORE WHERE IT WILL BE USEFUL
227 /AT SAME TIME, INITIALIZE TTYEOF
228 ISZ TTY /POINT TO BUFFER ADDRESS
229 TAD I TTY /AND GET IT
230 DCA BUFSTRT /AND SAVE IT
231 ISZ TTY /POINT TO BLOCK #
232 TTY376, ISZ TTY /POINT TO ERROR RETURN
233 SHIFT, /OUTPUT SHIFT REGISTER
234 TTYEOF, /0 IF SAW CR OR ^Z AND WISH TO PAD BUFFER WITH 0'S
235 TTCDBF, HLT /CDF BUFFER FIELD
236 JMP TTYKLG
237 TTYLP, SNL CLA /LINK=1 MEANS OUTPUT
238 JMP TTYGET /INPUT IS FROM TTY:
239 \f/LINK MUST BE SET FIRST TIME THROUGH HERE.
240 /IT ACTS AS A GUARD BIT IN THE SHIFT REGISTER
241 ROTL, RTL
242 RTL
243 SPA /DO WE HAVE 8 BITS SHIFTED IN?
244 JMP TELP
245 DCA SHIFT /SAVE SHIFT REGISTER
246 TAD I BUFSTRT
247 SZA
248 JMS PUNCH /PRINT A CHARACTER
249 TAD I BUFSTRT
250 ISZ BUFSTRT /BUMP INPUT POINTER
251 TT7400, 7400 /PROTECT ISZ
252 AND TT7400
253 CLL RAL
254 TAD SHIFT /SHIFT HIGH ORDER 4 BITS INTO
255 JMP ROTL /SHIFT REGISTER
256 TELP, JMS PUNCH /PRINT 3RD CHARACTER OF DOUBLE-WORD
257 STL /***KLUDGE
258 TTYKLG, ISZ BUFSIZ /DONE?
259 JMP TTYLP /NOT YET
260 TTYX, TAD TTYEOF /IF INPUT AND WE WERE PADDING WITH 0'S
261 SZA CLA /TAKE SOFT ERROR EXIT
262 TTYRTN, ISZ TTY /POINT TO NORMAL RETURN
263 /CAN'T GET ERROR OR END-OF-FILE ON OUTPUT
264 TTYXIT, HLT /RETURN TO USER'S FIELD
265 JMP I TTY /RETURN TO USER
266 TTYCA, 0
267 TTYWC, 0
268 BUFSIZ, 0
269 BUFSTRT,0
270 TTY70, 70
271
272 PUNCH, 0 /NEVER CALL TTYPCH WITH ZERO AC
273 JMS I PLINK /CALL TTYPCH
274 JMP TTYRTN /GO AWAY, WE SAW A ^Z
275 L7700, SMA CLA /DID WE REACH END OF TTY LINE?
276 JMS CRLF /YES, PERFORM CR/LF
277 JMP I PUNCH /RETURN
278
279 TMP,
280 CRLF, 0
281 TAD L215
282 JMS I PLINK /CALL TTYPCH TO PRINT CR
283 L215, 215 /CAN'T RETURN HERE
284 CLA /****
285 TAD L212
286 JMS I PLINK /CALL TTYPCH TO PRINT LF
287 L212, 212 /CAN'T RETURN HERE
288 CLA /****
289 JMP I CRLF /RETURN
290 \fCTRLU, JMS CRLF /PERFORM A CR/LF
291 TTYGET, TAD BUFSTRT
292 DCA TTYCA /POINT TO START OF BUFFER
293 TAD BUFSIZ
294 CLL RAL /CONVERT DOUBLE-WORDS TO WORDS
295 DCAWC, DCA TTYWC /SET SIZE OF BUFFER
296 TSTEND, TAD TTYEOF
297 SNA CLA
298 JMP ZERO
299 JMS I PLINK /CALL TTYGCH TO GET A CHARACTER
300 JMP RUBOUT /RETURN 1 MEANS SAW RUBOUT
301 ZERO, DCA I TTYCA /RETURN 2 MEANS GOT CHARACTER
302 /STORE AWAY TEMPORARILY
303 /USING USER'S BUFFER AS A TEMP LOCATION
304 TAD I TTYCA /GET BACK CHARACTER
305 IFNZRO .-320 <_ERROR>
306 SZA
307 JMS PUNCH /ECHO IT
308 TAD I TTYCA /GET IT AGAIN
309 TAD M32 /-^Z
310 SNA
311 JMP CTRLZ
312 TAD L5 /^Z-^U
313 SNA /IS IT ^U?
314 JMP CTRLU /YES
315 TAD L7
316 GRUDGE, DCA TMP
317 ISZ TTYCA /NO
318 L7, 7
319 ISZ TTYWC /IS BUFFER FULL?
320 TT10, SKP
321 JMP TTYX
322 ISZ TMP /WAS LAST CHAR A CR?
323 JMP TSTEND /NO
324 DCA TTYEOF /YES, SET "PAD WITH 0'S" FLAG
325 ISZ TTY /POINT TO NORMAL RETURN
326 /CR IS NOT AN ERROR OR END-OF-FILE
327 TAD L212 /IF LAST CHAR INPUT WAS CR, NOW PRETEND LF WAS INPUT
328 JMP ZERO /REJOIN PROCESSING
329
330 CTRLZ, DCA TTYEOF
331 JMS CRLF
332 JMP GRUDGE
333
334 M32, -32
335 L5, 5
336 L3700, 3700
337 CIFCDF, CIF CDF 0
338 TTYCDF, CDF 0
339
340 /TTYEOF IS ZERO MEANS PAD BUFFER WITH ZEROES
341 \f/DON'T DO YET:
342 /RUBOUT, AND TTYWC /177 IN AC
343 / SNA CLA
344 / JMP CTRLU
345
346 RUBOUT, KKCC /TTYGCH DOESN'T CLEAR RO FROM BUFFER
347 TAD TTYCA
348 CIA
349 TAD BUFSTRT
350 SNA CLA /ARE WE AT BEGIN OF BUFFER?
351 JMP CTRLU /YES
352 STA
353 TAD TTYCA
354 DCA TTYCA
355 IFZERO RUB <
356 LSLASH, "\
357 TAD LSLASH /PRINT A BACK SLASH FOR EACH RUBBED OUT CHAR
358 >
359 IFNZRO RUB&4000+RUB <TAD I TTYCA> /PRINT CHAR JUST DELETED
360 IFNZRO RUB&4000 <TAD TT10> /BACKSPACE-SPACE-BACKSPACE
361 JMS PUNCH
362 STA
363 TAD TTYWC
364 JMP DCAWC /BUMP BACK WC AND GET ANOTHER CHAR
365
366 ZBLOCK 376-.
367 TTY, TTYVERSION /ENTRY POINT TO HANDLER
368 JMS PLINK /SET UP CROSS PAGE LINKAGE
369 IFNZRO TTY-376 <ENTERR,QQQQ>
370 PAGE
371 \f/INTERLUDE:
372
373 /USA STANDARD CODE FOR INFORMATION INTERCHANGE:
374
375 / 000 001 010 011 100 101 110 111
376 /
377 / 0000 NUL DLE SP 0 @ P ' 'P
378 /
379 / 0001 SOH DC1 ! 1 A Q 'A 'Q
380 /
381 / 0010 STX DC2 " 2 B R 'B 'R
382 /
383 / 0011 ETX DC3 # 3 C S 'C 'S
384 /
385 / 0100 EOT DC4 $ 4 D T 'D 'T
386 /
387 / 0101 ENQ NAK % 5 E U 'E 'U
388 /
389 / 0110 ACK SYN & 6 F V 'F 'V
390 /
391 / 0111 BEL ETB ' 7 G W 'G 'W
392 /
393 / 1000 BS CAN ( 8 H X 'H 'X
394 /
395 / 1001 HT EM ) 9 I Y 'I 'Y
396 /
397 / 1010 LF SUB * : J Z 'J 'Z
398 /
399 / 1011 VT ESC + ; K [ 'K '[
400 /
401 / 1100 FF FS , < L \ 'L '\
402 /
403 / 1101 CR GS - = M ] 'M ']
404 /
405 / 1110 SO RS . > N ^ 'N '^
406 /
407 / 1111 SI US / ? O _ 'O '_
408 /
409 \f/TTYGCH: GETS A CHAR FROM KBD
410 / IF GOT ^Z, IT SETS TTYEOF FLAG
411 / LEAVES IT IN AC IN 7-BIT
412
413 /TTYPRT: PRINTS CHAR IN AC ON TTY
414 / IGNORES NULLS
415 / PRINTS ^X ON CONTROL CHARS (EXCEPT CR, LF, FF, VT, TAB)
416 / PRINTS 'X ON LOWER CASE
417
418 /HANDLES TABS CORRECTLY
419 / AND AUTOMATICALLY PRINTS CR/LF AT EOL
420 / PRINTS ESCAPE AS $
421
422 /TTYTLS: USED TO ACTUALLY PRINT CHAR
423 / IT HANDLES TABS AUTOMATICALLY
424 / AND CR/LF'S AT END OF LINE
425
426 /TTYPCH: IT USES TTYPRT TO PRINT CHAR BUT ALSO RESPONDS TO
427 / ^C, ^O, ^S, ^Q.
428 / IF ^Z IS BEING PRINTED, IT THEN STOPS FURTHER PRINTING
429 \f/MUST BE AT TOP OF PAGE
430 TTYPCH, /ENTRY POINT TO TTY PUNCH ROUTINE
431 /OR TTY PRINT ROUTINE
432 TTYGCH, 0 /ENTRY POINT TO TTY GET CHAR ROUTINE
433 SNA
434 JMS TGCH /ZERO AC-MEANT CALL TO TTYGCH
435 PCH, AND (177 /FORCE TO 7-BIT
436 DCA TCHAR
437 TAD TGCH
438 M140, SZA CLA /ARE WE ECHOING?
439 JMP ECHO /YES, IGNORE ^S AND STUFF
440 K5, 5 /MUST BE AT REL 10
441 TAD TCHAR
442 TAD (-32
443 IFZERO PAUS <
444 SNA CLA
445 JMP I TTYPCH
446 >
447 IFNZRO PAUS <
448 SNA
449 JMP I TTYPCH
450 TAD L15 /32-15
451 SNA CLA /LOOK FOR CR
452 ISZ LINCNT /AT END OF PAGE?
453 JMP NOPAUS /NOT AT CR, OR AT CR BUT NOT AT END OF PAGE
454 L15, 15 /MUST BE HERE FOR SET
455 TAD PAUSN
456 DCA TTYTLS /SET COUNT FOR OUTER LOOP
457 ISZ LINCNT
458 JMP .-1
459 ISZ TTYTLS
460 JMP .-3
461 TAD LINSYZ
462 DCA LINCNT
463 >
464 NOPAUS, JMS TTYTST
465 TAD (203-217 /NO
466 SNA /^O?
467 DCA TCHAR /YES, SET TO NULL SO IT WILL BE IGNORED
468 TAD (217-223 /NO
469 SZA CLA /^S?
470 JMP ECHO /NO, IGNORE CHAR
471 TTCTLQ, JMS TTYTST
472 TAD (203-221 /NO, NOTHING ELSE MATTERS UNTIL ^Q
473 SZA CLA /^Q?
474 JMP TTCTLQ /NO, SUSPEND OUTPUTTING
475 TTY32, KKCC /YES, REMOVE ^Q FROM BUFFER
476 /HAD NO ROOM FOR:
477 / TAD LINSYZ
478 / DCA LINCNT
479 ECHO, DCA TGCH
480 ISZ TTYPCH
481 IFNZRO ESC <
482 TAD TCHAR
483 TAD (-33
484 SZA CLA
485 JMP .+3
486 TAD L44
487 DCA TCHAR
488 L44, 44
489 >
490 TAD TCHAR
491 SNA
492 JMP TTYCTO /IGNORE NULLS
493 IFNZRO RUB&4000 <
494 TAD (-10
495 SNA
496 JMP RUBO
497 TAD (10-16
498 >
499 IFZERO RUB&4000 <
500 TAD (-16
501 >
502 TTY100, CLL
503 TTY10, TAD K5
504 TTY240, SZA /TAB?
505 JMP NOTAB
506 IFNZRO SIMTAB <
507 TTYTAB, TAD TTY240
508 JMS TTYTLS
509 TTY7, 7 /HERE FOR NO SPECIAL REASON
510 TAD TABCTR
511 AND TTY7
512 SZA CLA
513 JMP TTYTAB
514 JMP TTYCTO
515 >
516 IFNZRO SLOTAB <
517 TAD TCHAR
518 JMS TTYTLS
519 TAD (177
520 JMS TTYTLS
521 TAD (177
522 JMP PRIN+1
523 >
524 IFZERO SIMTAB+SLOTAB <JMP PRIN>
525
526 /BUG: IF HARDWARE TABS, DON'T COUNT COLUMNS CORRECTLY
527
528 IFNZRO RUB&4000 <
529 RUBO, TAD TTY10 /OUTPUT BACKSPACE-RUBOUT-BACKSPACE
530 JMS TTYTLS
531 TAD TTY240
532 JMS TTYTLS
533 TAD (-4
534 TAD TABCTR
535 JMP PREPRN
536 >
537 \fNOTAB, SZL CLA
538 JMP SPCHR /DON'T UPARROW CHARS LF,CR,TAB,VT,FF
539 IFNZRO FLAGLC <
540 TAD TCHAR
541 AND TTY140
542 TAD M140
543 SZA CLA /IS IT LC?
544 JMP NOLC /NO
545 TTYQUO, "'
546 TAD TTYQUO /YES
547 JMS TTYTLS /PRINT QUOTE
548 TAD M40
549 JMP PRIN /PRINT UPPER CASE OF CHAR
550 >
551 NOLC, TAD TCHAR /NO, GET BACK CHAR
552 AND TTY140 /HIGH ORDER BITS IRRELEVANT
553 IFNZRO CTRL <
554 M40, SMA SZA CLA /CAN'T BE NEGATIVE
555 JMP PRIN /NOT A CONTROL CHARACTER
556 TAD TTYUPA /ECHO 201-237 AS ^X (EXCEPT 211-215)
557 JMS TTYTLS
558 TAD TTY100 /ADD X100 TO ^K TO GET K
559 >
560 IFZERO CTRL <
561 SNA CLA /IS CHAR A CONTROL CHAR?
562 JMP TTYCTO /YES, DON'T ECHO CONTROL CHARACTERS EXCEPT FOR 211-215
563 >
564 PRIN, TAD TCHAR
565 JMS TTYTLS
566 TTYCTO, TAD TABCTR /RETURN TABCNT IN AC
567 JMP I TTYPCH
568
569 IFZERO CTRL <
570 M40, -40
571 >
572
573 TTY140,
574 SPCHR, STA CLL
575 TAD LINSIZ
576 PREPRN, DCA TABCTR /THESE CHARS RESET COLUMN COUNTER
577 JMP PRIN
578 \fTGCH, 0 /NON-ZERO MEANS TTYGCH WAS CALLED
579 KKSF
580 JMP .-1 /WAIT FOR CHAR TO BE TYPED
581 JMS TTYTST
582 /WILD: (DON'T PUT IN) SZA CLA /FALL THRU AND RETURN R.O.
583 / ISZ TTYGCH
584 TAD (203-377
585 SNA CLA /TAKE RETURN 1 ON RUB OUT
586 JMP I TTYGCH /"CLUMSY" - R.L. (9/18/73)
587 ISZ TTYGCH
588 KKRB /GET CHARACTER
589 TTYAND, AND (177 /MUST RETURN CHAR IN 7-BIT
590 IFNZRO CNVLC <
591 DCA TCHAR
592 TAD TCHAR
593 AND TTY140
594 TAD M140
595 SNA CLA /IS IT LC?
596 TAD M40 /YES
597 TAD TCHAR /NO
598 >
599 IFNZRO ALTMOD <
600 TAD (-175 /IS IT 175 OR 176?
601 SMA
602 JMP CONV /YES, CONVERT ALTMODE TO ESCAPE
603 TAD (175 /NO, RESTORE CHAR
604 >
605 JMP I TTYGCH /TAKE RETURN 3
606
607 /SHOULDN'T TABCTR BE INITIALIZED TO C(LINSIZ) UPON ENTRY?
608
609 TABCTR, -110
610
611 TTYTLS, 0
612 TTLS
613 IFNZRO DELAY <
614 TAD (-DELAY
615 SZA CLA
616 STA
617 >
618 TTYTSF, TTSF
619 JMP .-1
620 IFNZRO DELAY <
621 IAC
622 SZA /19.66 MS IS G.T. 1/60 SEC
623 JMP TTYTSF
624 >
625 ISZ TABCTR
626 TTYUPA, "^
627 TT7600, 7600
628 JMP I TTYTLS
629 LINSIZ, -110
630
631 IFNZRO PAUS <
632 LINSYZ, -HEIGHT
633 LINCNT, -HEIGHT
634 PAUSN, -PAUS
635 >
636
637 IFNZRO ALTMOD <
638 IFNZRO KKCC-6032 <
639 CONV, CLA
640 TAD (33
641 JMP I TTYGCH
642 >
643 IFZERO KKCC-6032 <
644 CONV, CLA IAC
645 TAD TTY32 /DEVICE DEPENDENT
646 JMP TTYAND
647 >
648 >
649 \fTCHAR, 0
650
651 /TTYTST: READS KEYBOARD STATICALLY AND RESPONDS TO ^C
652 / OTHERWISE RETURNS CHAR (8-BIT) MINUS 203 IN AC.
653 / IF FLAG IS NOT UP, IT RETURNS A 1.
654
655 TTYTST, 0
656 TAD TT7600 /OR CHAR IN
657 KKRS
658 TAD (-7603 /-7603=175
659 KKSF
660 CLA IAC /STUFF IN BUFFER IS UNRELIABLE IF FLAG ISN'T UP
661 SZA
662 JMP I TTYTST
663 IFNZRO INDVC-3 <KKCC>
664 CIF CDF 0 /BRANCH TO OS/8 MONITOR AT 07600
665 JMP I TT7600 /IT WILL PRINT "^C" FOR CHAR IN BUFFER
666 PAGE
667 \f/ DYNAMICALLY MODIFYING THE KL8E HANDLER
668
669 / *** I M P O R T A N T ***
670
671 / THIS HANDLER CAN BE DYNAMICALLY CHANGED VIA SET COMMANDS.
672 / CONSEQUENTLY, IT IS EXTREMELY IMPORTANT THAT PEOPLE
673 / WHO MODIFY THIS SOURCE DO NOT AFFECT THE ALGORITHMS
674 / NECESSARY TO PERFORM SUCH MODIFICATIONS.
675
676 / THIS ALGORITHM IS EXPLAINED BELOW.
677
678 / SET TTY WIDTH=N
679
680 / SEARCH LOCATIONS 200-377 FOR A 7600. CALL ITS ADDRESS X.
681 / LET Y BE THE INSTRUCTION AT LOCATION X+1.
682 / FORM THE (RELATIVE) ADDRESS T=Y&177+200-1.
683 / THEN LOCATIONS T AND X+2 CONTAIN MINUS THE TTY WIDTH.
684 / THE WIDTH MUST BE A MULTIPLE OF 10 AND MUST NOT BE 200.
685 / (BECAUSE -200 IS THE MAGIC 7600)
686
687 / SET TTY CODE XX
688
689 / SEARCH ENTIRE HANDLER FOR INSTRUCTIONS OF THE FORM 6XXY
690 / WHERE XX IS NOT 20 OR 21,
691 / AND FURTHERMORE DON'T INCLUDE A 6031 IF 2 LOCATIONS
692 / FOLLOWING IS A 7650
693 / AND DON'T INCLUDE A 6034 IF 4 LOCATIONS FOLLOWING IS A 7650.
694
695
696 / SET TTY [NO] ECHO
697
698 / THE WORD INVOLVED IS AT (RELATIVE) LOCATION 120.
699 / SET TO 7440 TO ECHO.
700 / SET TO 7610 TO SUPPRESS ECHOING.
701
702
703 / SET TTY LC
704
705 / SEARCH LOCATIONS 200-377 FOR A 377. CALL ITS ADDRESS X.
706 / LOOK AT LOCATION X+5.
707 / IF THIS LOCATION IS NOT A 7650, THEN LC TO UC CONVERSION
708 / WAS NOT ENABLED AT ASSEMBLY TIME.
709 / IF THE FEATURE IS ENABLED, CHANGE LOCATION X+5 TO A 7610
710 / TO PREVENT THE CONVERSION. TO ALLOW CONVERSION, SET
711 / LOCATION X+5 BACK TO 7650.
712
713 / SET TTY PAGE
714
715 / SEARCH LOCATIONS 215-300 FOR A 7450. CALL ITS ADDRESS X.
716 / SET X+3 TO 7640 TO ENABLE ^S, ^Q.
717 / SET X+3 TO 7200 TO DISABLE ^S, ^Q.
718 \f/ SET TTY TAB
719
720 / SEARCH LOCATIONS 200-300 FOR A 7.
721 / IF NOT FOUND, SIMULATED TABS WAS NOT ENABLED AT ASSEMBLY TIME.
722 / IF FOUND, CALL ITS ADDRESS X.
723 / TO PATCH OUT SIMULATED TABS:
724 / MOVE C(X-12) TO LOCATION X-2
725 / CHANGE LOCATION X+3 TO A 7610
726 / TO RESTORE SIMULATED TABS:
727 / SET LOCATION X-2 TO X-4&77+1200
728 / CHANGE LOCATION X+3 TO A 7640
729
730 / SET TTY FILL
731
732 / THE LITERAL 177 MUST REMAIN AT THE END OF PAGE 2
733 / SEARCH LOCATIONS 200-300 FOR A 1377.
734 / IF NOT FOUND, THEN FILL CHARACTERS WERE NOT ENABLED AT ASSEMBLY
735 / TIME. IF FOUND, CALL ITS ADDRESS X.
736 / TO PATCH OUT FILL CHARACTERS, MOVE C(X+3) TO LOCATION X-1.
737 / TO RESTORE FILL CHARACTERS, MOVE C(X+1) TO LOCATION X-1.
738
739 / SET TTY FLAGLC
740
741 / SEARCH LOCATIONS 200-377 FOR A 247.
742 / IF NOT FOUND, LOWER CASE FLAGGING WAS NOT ENABLED AT ASSEMBLY TIME.
743 / IF FOUND, CALL ITS ADDRESS X.
744 / TO DISABLE FLAGGING, SET LOCATION X-2 TO A 7200.
745 / TO RE-ENABLE FLAGGING, SET LOCATION X-2 TO A 7640.
746
747 / SET TTY PAUSE [N]
748
749 / SEARCH LOCATIONS 200-300 FOR A 15.
750 / IF NOT FOUND, PAUSING WAS NOT ENABLED AT ASSEMBLY TIME.
751 / IF FOUND, CALL ITS ADDRESS X.
752 / TO DISABLE PAUSING AFTER A FULL SCREEN,
753 / SET LOCATION X-3 TO A 7610.
754 / TO RE-ENABLE PAUSING, SET LOCATION X-3 TO A 7650.
755 / TO SET PAUSE DURATION, SEARCH LOCATIONS 300-377 FOR A 7600,
756 / CALLING ITS ADDRESS X. THEN (MINUS THE) PAUSE DURATION IS AT
757 / LOCATION X+5.
758
759 / SET TTY HEIGHT
760
761 / THIS IS ONLY APPLICABLE IF SET TTY PAUSE HAS BEEN ASSEMBLED IN
762 / (A 15 CAN BE FOUND ON SECOND PAGE).
763 / NEGATIVE OF HEIGHT MUST BE SET IN BOTH LOCATIONS X+3 AND X+4
764 / WHERE X IS THE ADDRESS OF A 7600 AS IN ABOVE.
765 \f/ SET TTY ESCAPE
766
767 / SEARCH LOCATIONS 200-377 FOR A 44.
768 / IF NOT FOUND, THEN $ WAS NOT ASSEMBLED INTO TTY HANDLER.
769 / IF FOUND, CALL ITS ADDRESS X.
770 / TO DISABLE PRINTING ESCAPE AS $, SET LOCATION X-4 TO A 'CLA'.
771 / TO CAUSE ESCAPE TO PRINT AS AN ESCAPE, SET LOCATION X-4 TO SZA CLA.
772
773 / SET TTY ARROW
774
775 / SEARCH LOCATIONS 200-377 FOR 7740.
776
777 / IF NOT FOUND, USING OLD HANDLER.
778 / CALL ITS ADDRESS X.
779 / IF LOCATION X+1 IS MORE THAN 7000,
780 / THEN UPARROW MODE WAS NOT ASSEMBLED INTO KL8E.
781 / OTHERWISE, TO ALLOW ARROWS, SET LOCATION X+3 TO THE
782 / CONTENTS OF LOCATION X+6.
783 / TO CAUSE CONTROL CHARACTERS TO ECHO AS IS, SET
784 / LOCATION X+3 TO 'SKP CLA'.
785 / NOTE THAT THIS IS A DIFFERENT OPTION THAN ASSEMBLING CTRL=0.
786 \f IFDEF TEST <
787 *600
788
789 /TEST ROUTINE FOR KL8E HANDLER
790
791 GO, JMS I (TTY /CALL HANDLER
792 0600 /READ SIX PAGES
793 1000 /BUFFER AT 01000
794 0001 /BLOCK 1
795 HLT /ERROR RETURN
796 JMS I (TTY /CALL HANDLER AGAIN
797 4600 /OUTPUT SIX PAGES
798 1000
799 0001
800 HLT
801 CLA
802 JMP GO
803 >
804 $
805 \f