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