SUBTTL Text Editor and COrrector RC CLEMENTS/PMH/CAM/JMP/GSB/RCM/CBD/JCS/Nothead SUBTTL Introduction ;Version number TECVER==124 TECMIN==1 TECEDT==355 TECWHO==2 SEARCH JOBDAT,MACTEN,UUOSYM ;UNIVERSAL FILES .DIRECTIVE .XTABM ;TENEX STYLE MACRO'S TWOSEG 400K ;TWO SEGMENTS SALL SHOW. %%JOBD ;JOBDAT VERSION NUMBER SHOW. %%MACT ;MACTEN VERSION NUMBER SHOW. %%UUOS ;UUOSYM'S VERSION NUMBER ;COPYRIGHT 1970,1971,1972, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;COPYRIGHT 1975 SNEVETS CORP.,BOHOKEN, J.N. ;COPYRIGHT 1976 ARMADILLO U., AUSTINTATIOUS, USA ;Copyright 1978 Privateer U, Bourbon Strut, Nude Oleander, Lousyanna IFN 0 < THE FOLLOWING SYMBOL IS USED BY THE 'EE' COMMAND CONTINUE ROUTINE TO DECIDE WHETHER THE VERSION OF TECO.SHR THAT IT GOTSEG WILL WORK PROPERLY WITH THE LOW FILE THAT GOTSEG IT. IT MUST BE INCREMENTED EVERY TIME THE LOW SEGMENT OF TECO IS ALTERED > XP %TECOV, 26 LOC .JBVER VRSN. TEC ;VERSION NUMBER LOC .JBREN EXP REE ;REENTRY ADDRESS RELOC 400K SUBTTL Table of Contents ; Table of Contents for TECO ; ; ; Section Page ; ; 1. Introduction . . . . . . . . . . . . . . . . . . . . . 1 ; 2. Table of Contents . . . . . . . . . . . . . . . . . . 2 ; 3. REVISION HISTORY . . . . . . . . . . . . . . . . . . . 3 ; 4. MACRO DEFINITIONS ; 4.1 .CLNAM . . . . . . . . . . . . . . . . . . . . 4 ; 4.2 CHKEO, ERROR . . . . . . . . . . . . . . . . . 5 ; 5. DEFAULT ASSEMBLY PARAMETERS . . . . . . . . . . . . . 6 ; 6. ACCUMULATOR ASSIGNMENTS . . . . . . . . . . . . . . . 7 ; 7. CONTROL FLAGS ; 7.1 AC FF . . . . . . . . . . . . . . . . . . . . 8 ; 7.2 AC F2 . . . . . . . . . . . . . . . . . . . . 9 ; 8. I-O CHANNELS . . . . . . . . . . . . . . . . . . . . . 10 ; 9. MISC PARAMETERS . . . . . . . . . . . . . . . . . . . 11 ; 10. PSEUDO RUN UUO IF NEEDED . . . . . . . . . . . . . . . 12 ; 11. STARTUP TIME INITIALIZATION . . . . . . . . . . . . . 13 ; 12. TEXT BUFFER INITIALIZATION . . . . . . . . . . . . . . 15 ; 13. REENTER COMMAND . . . . . . . . . . . . . . . . . . . 16 ; 14. INITIALIZATION OF JOB DEPENDENT PARAMETERS . . . . . . 17 ; 15. CCL Command processor . . . . . . . . . . . . . . . . 18 ; 16. RETURN NON-NULL TTY CHARACTER IN CH. . . . . . . . . . 22 ; 17. TYPE A CHARACTER. . . . . . . . . . . . . . . . . . . 24 ; 18. MESSAGE TYPE-OUT & NUMBER TYPE-OUT . . . . . . . . . . 27 ; 19. RETURN NEXT COMMAND CHAR AT CURRENT LEVEL . . . . . . 29 ; 20. SCAN COMMAND STRING FOR CHARACTER IN TT . . . . . . . 30 ; 21. SKAN ROUTINE DISPATCH TABLES . . . . . . . . . . . . . 33 ; 22. ACCEPT COMMAND STRING ROUTINE . . . . . . . . . . . . 35 ; 23. EXPAND THE COMMAND BUFFER . . . . . . . . . . . . . . 37 ; 24. PROCESS SPECIAL COMMAND EDITING CHARACTERS . . . . . . 39 ; 25. BACK UP BYTE POINTER IN AA, LOAD APPROPRIATE CHARACT . 41 ; 26. SPECIAL "IMMEDIATE" COMMAND PROCESSOR . . . . . . . . 42 ; 27. RUBOUT PROCESSOR . . . . . . . . . . . . . . . . . . . 44 ; 28. VIDEO RUBOUT PROCESSOR . . . . . . . . . . . . . . . . 46 ; 29. COMMAND DECODER . . . . . . . . . . . . . . . . . . . 50 ; 30. NUMERIC INPUT, VALRET, & ALTMODE PROCESSOR . . . . . . 51 ; 31. COMMA & PARENTHESES PROCESSOR . . . . . . . . . . . . 52 ; 32. MATHEMATICAL & LOGICAL OPERATORS . . . . . . . . . . . 53 ; 33. FLAGS - EOF, FORM FEED & . H Z POSITIONS . . . . . . . 54 ; 34. = & ^T COMMANDS . . . . . . . . . . . . . . . . . . . 55 ; 35. ^H, ^F AND ^^ COMMANDS . . . . . . . . . . . . . . . . 56 ; 36. EXTENDED ^T OPERATIONS . . . . . . . . . . . . . . . . 57 ; 37. BACKSLASH PROCESSOR . . . . . . . . . . . . . . . . . 58 ; 38. nA COMMAND . . . . . . . . . . . . . . . . . . . . . . 59 ; 39. Q-REGISTER COMMANDS ; 39.1 U & Q . . . . . . . . . . . . . . . . . . . . 60 ; 39.2 % . . . . . . . . . . . . . . . . . . . . . . 62 ; 39.3 X . . . . . . . . . . . . . . . . . . . . . . 63 ; 39.4 G . . . . . . . . . . . . . . . . . . . . . . 65 ; 39.5 M, W, [ & ] . . . . . . . . . . . . . . . . . 66 ; 40. MISCELLANEOUS CHARACTER DISPATCHER . . . . . . . . . . 67 ; 41. ^G COMMAND (GETTAB OR EXIT) . . . . . . . . . . . . . 68 ; 42. E COMMANDS ; 42.1 DISPATCH ROUTINE & TABLE . . . . . . . . . . . 69 ; 42.2 EL (SETUP AND OUTPUT ROUTINES) . . . . . . . . 70 ; 42.3 EE (SAVE TECO'S STATE) . . . . . . . . . . . . 72 ; 42.4 NEL & EE (LOW CORE) . . . . . . . . . . . . . 74 ; 42.5 EE (RESTART CODE) . . . . . . . . . . . . . . 75 ; 42.6 EI & EP (EDIT INSERT & EDIT PUT) . . . . . . . 76 ; 42.7 EX & EXIT ROUTINES . . . . . . . . . . . . . . 80 ; 42.8 ED (RUN UUO ON EXIT) . . . . . . . . . . . . . 82 ; 42.9 ET, EO & EU . . . . . . . . . . . . . . . . . 83 ; 42.10 ES . . . . . . . . . . . . . . . . . . . . . . 84 ; 42.11 EH (CHANGE ERROR MESSAGE LEVEL) . . . . . . . 85 ; 42.12 EV (SET TERMINAL CHARACTERISTICS) . . . . . . 86 ; 42.13 TERMINAL CHARACTERISTICS TABLES . . . . . . . 88 ; 42.14 EK (KILL) AND EN (RENAME) . . . . . . . . . . 90 ; 42.15 ER (PREPARE TO READ A FILE) . . . . . . . . . 91 ; 42.16 FILE SPEC SETUP . . . . . . . . . . . . . . . 93 ; 42.17 EB (EDIT BACKUP PROCESSOR) . . . . . . . . . . 94 ; 42.18 I/O ERROR ROUTINES . . . . . . . . . . . . . . 97 ; 42.19 EW (EDIT WRITE) . . . . . . . . . . . . . . . 98 ; 42.20 EZ & EF . . . . . . . . . . . . . . . . . . . 102 ; 42.21 EM (MTAPE UUO'S) . . . . . . . . . . . . . . . 103 ; 42.22 EB (FINISH UP COMMAND) . . . . . . . . . . . . 104 ; 42.23 EW (SUBROUTINES FOR EW) . . . . . . . . . . . 107 ; 42.24 MISC. ROUTINES . . . . . . . . . . . . . . . . 108 ; 43. ^V, ^W, ^X COMMANDS . . . . . . . . . . . . . . . . . 110 ; 44. ROUTINE TO PARSE FILE DESIGNATOR . . . . . . . . . . . 111 ; 45. TABLES FOR FILSPEC PARSER . . . . . . . . . . . . . . 115 ; 46. Y . . . . . . . . . . . . . . . . . . . . . . . . . . 118 ; 47. ^Y ! ^P - QUICK PAGE SCAN COMMANDS . . . . . . . . . . 120 ; 48. READ A CHARACTER FROM INPUT FILE . . . . . . . . . . . 121 ; 49. INSERT COMMAND . . . . . . . . . . . . . . . . . . . . 122 ; 50. ALPHA CASE CONVERTED . . . . . . . . . . . . . . . . . 126 ; 51. CHECK FOR NON-CONTROL CHARACTERS . . . . . . . . . . . 127 ; 52. NI . . . . . . . . . . . . . . . . . . . . . . . . . . 128 ; 53. T COMMAND . . . . . . . . . . . . . . . . . . . . . . 129 ; 54. V COMMAND . . . . . . . . . . . . . . . . . . . . . . 130 ; 55. PUT A CHARACTER IN THE OUTPUT FILE . . . . . . . . . . 131 ; 56. PW . . . . . . . . . . . . . . . . . . . . . . . . . . 135 ; 57. NJ, NC, & NL COMMANDS . . . . . . . . . . . . . . . . 137 ; 58. ROUTINE TO RETURN CURRENT ARGUMENT IN B . . . . . . . 138 ; 59. ND . . . . . . . . . . . . . . . . . . . . . . . . . . 139 ; 60. Searches ; 60.1 Commands . . . . . . . . . . . . . . . . . . . 140 ; 60.2 pattern source setup . . . . . . . . . . . . . 141 ; 60.3 set up search matrix . . . . . . . . . . . . . 143 ; 60.4 New fast search routine . . . . . . . . . . . 158 ; 60.5 Old slow but sure routine . . . . . . . . . . 161 ; 60.6 pattern found . . . . . . . . . . . . . . . . 163 ; 60.7 Autotype after succesful searches . . . . . . 164 ; 60.8 Pattern not found in this buffer . . . . . . . 165 ; 61. <> . . . . . . . . . . . . . . . . . . . . . . . . . . 167 ; 62. OTAG$ . . . . . . . . . . . . . . . . . . . . . . . . 169 ; 63. " ' PROCESSING . . . . . . . . . . . . . . . . . . . . 171 ; 64. EXECUTE INDIVIDUAL " COMMANDS . . . . . . . . . . . . 172 ; 65. ROUTINE TO TEST CHARACTER FOR $,%,.,0-9,A-Z . . . . . 173 ; 66. ERROR MESSAGE PRINTOUT . . . . . . . . . . . . . . . . 174 ; 67. ROUTINE TO TYPE C(TT) IN SIXBIT . . . . . . . . . . . 179 ; 68. ERROR PROCESSING ROUTINES . . . . . . . . . . . . . . 180 ; 69. DISPATCH TABLE FOR SPECIAL INFORMATION TYPEOUT . . . . 181 ; 70. SPECIAL INFORMATION TYPEOUT ROUTINES . . . . . . . . . 182 ; 71. UUO HANDLER . . . . . . . . . . . . . . . . . . . . . 184 ; 72. COMMAND TO COMPLEMENT TRACE MODE. "?" AS A COMMAND . . 185 ; 73. ROUTINE TO RETURN STRING OPERATION STRING ARGUMENTS. . 186 ; 74. ROUTINE TO RETURN IN CH THE CHARACTER TO THE RIGHT O . 187 ; 75. ROUTINES TO MOVE CHARACTERS AROUND . . . . . . . . . . 188 ; 76. GARBAGE COLLECTOR . . . . . . . . . . . . . . . . . . 191 ; 77. AUTOMATIC MEMORY EXPANSION . . . . . . . . . . . . . . 195 ; 78. COMMAND DISPATCH TABLE . . . . . . . . . . . . . . . . 197 ; 79. LOW SEGMENT . . . . . . . . . . . . . . . . . . . . . 198 SUBTTL REVISION HISTORY COMMENT { START OF VERSION 123A 205 FIX LOOPING EEE. 206 FIX FILE SPEC SCANNER WHEN TRACE MODE USED. 207 CHANGE CORE ERROR MESSAGE. 210 ADD ^G WITH NO ARGUMENT TO RETURN MY JOB NUMBER. 211 FIX :EP SO IT WORKS. 212 IMPLEMENT ^Y. 213 SO PEOPLE WITHOUT TECO.INI CAN ^G^G *I$$ FIRST COMMAND. 214 EI-EP SEES DEVICE. 215 NO TYPEOUT AFTER ^C^C REE. 216 EP[P,PN] INTERFERED WITH EB. 217 REMOVE FEATURE TO APPEND LOOKUP/ENTER/RENAME ERROR CODE TO PDL OV'S. 220 FIX RANDOM CORE MESSAGES FROM INI FILES. 221 INTERFACE TO JOBDAT.UNV AND CORRECT MISC BUGS. A) FIX 'MAKE' OR 'TECO' FILE.'.' WORK CORRECTLY B) SUPPORT SOS PAGE MARKS C) SET TTY NO ALT COMPATIBLITY D) DELAY IN CLEARING EB AND OUTPUT FLAGS ON EX COMMAND IN CASE ERROR OCCURS IN PROCESSING 222 SEARCH MACTEN AS WELL AS JOBDAT 223 INTERFACE WITH MACTEN MORE COMPLETELY. CLEAN UP THE SUBTTLS AND CHANGE NUMERICS TO BE THE INSTRUCTIONS 224 FIX ENTER ERROR 17'S FOR PEEPLE WHO HAVE FANCY DISK ALLOCATION ON IN THE MONITOR. 225 FIX PROBLEM WITH U MACRO. ADD TED: AS THE DEFAULT DEVICE ON AN EI OR EP COMMAND. 226 MAKE EP DEFAULT TO DSK: INSTEAD OF TED: 227 MAKE ERROR MESSAGE FINDER FASTER 230 FIX ^Y WITH NO ARG TO NOT THROW AWAY CURRENT PAGE 231 ADD USETI ON ER'D FILE FOR CONVENIENCE. 232 FIX EA TO WORK IF FILE NO EXIST, MAKE TE FILE[NOT ME] TO WRITE FILE ON [DEFAULT] 233 PREVENT S^ES$ FROM ALLOWING "." TO ESCAPE THE TEXT BUFFER. 234 FIX :SEARCH IN AN ITERATION TO NOT LEAVE GARBAGE AROUND. 235 FIX PROBLEMS WITH TECENT-20 ERRORS. EXTENDED ENTER USED THE SAME AREA AS DID THE SEARCH MATRIX. THEREFORE TO SOLVE THE PROBLEM MAKE THAT AND THE DSKCHR BLOCK SEPERATE AREAS. ***START OF U. TX. REVISIONS**** (236-249 NOT USED;PATCHES ONLY, SEE TEC124.DIF FOR NEW FEATURES) 250 INSTALLED DEBUG SWITCH TO SAVE SYMBOL TABLE AND READ TECO.ERR FROM [-] RATHER THAN SYS:. (= DEC #140) 251 PATCH FOR LARGE Q-REG STACK (SPR # 13756) 252 DO AN INITIAL CORE UUO IF .JBFF > .JBREL-202 TO PREVENT ILL MEM REF'S. 253 MAKE ^G IGNORE ET SETTING AND ALWAYS USE ARROW MODE 254 FIX ^ BUG (SPR # 18802) 255 FIX ILL Q-REG NAME (DEC EDIT # 170) 256 MAKE BYTE PTR. BACKUP MORE EFFICIENT 257 DONT LET EXTRA BLANKS IN AN ARITHMETIC EXPRESSION CAUSE TROUBLE (DEC EDIT # 167) 260 MAKE SURE M,NP FLAGS BIT 35 OF FIRST SEQ. NUMBER. REMOVE DEC #122 WHICH ONLY DID IT FOR HP. 261 MORE SEQ# FIXING: /SUPLSN NEEDS TO USE SLOW PUNCH ROUTINE FILES PROCESSED BY SOS NO LONGER MESSED UP. INSTALL EQUIVALENTS OF DEC #'S 115, 141, 150. 262 STILL MORE SEQ# FIXING: DON'T ALLOW NULL CHARACTERS IN FILE (INTENDED FOR STARTING SEQ #'S ON WORD BOUNDARIES) IF /SUPLSN IS SET. 263 ZERO DOUBLE ARG FLAG IN SEARCHES SO THAT SUBSEQUENT COMMANDS DON'T GET CONFUSED. 264 FIX :FS...$$ SO IT RECOGNIZES DOUBLE ALTMODE. (SPR # 18199) 265 FIX GARBAGE COLLECTION BUG (DEC EDIT # 161) 266 FIX ?ILL COMMAND ^ (SPR # 18607) NOTE: ALL DEC EDITS THROUGH 171 OR THEIR EQUIVALENTS ARE IN. START OF VERSION 124 267 FIX ADDRESS CHECK ON LOOKUP OF TMP FILE WHEN TMPCOR FAILS. 270 MAKE UUO ERROR MSG TYPE ENTIRE INSTRUCTION (SPR#19879) 271 FIX GARBAGE COLLECTION FROM EC AND EP. Q-REGISTER STACK WASN'T GETTING COLLECTED SINCE AC 17 CLOBBERED. 272 FIX ILL. UUO MSG AFTER .REENTER WHILE AC'S HAVE FAST CODE TO MOVE CHARACTERS. FIX MINOR BUGS IN FILESPEC SCANNER AND /R. 273 MAKE EXTENDED CCL COMMAND STRING WORK WITH .TMP FILES 274 FIX ILL. UUO. BUG RIGHT THIS TIME...(EDIT 272 GOOFED). 275 FIX BAD ARG PROCESSING TO MAKE THINGS LIKE -1^F= AND :5-1^T== AND -1A== WORK PROPERLY. FINALLY GET EI ARG PROCESSING TO WORK PROPERLY. M,NEIFILE$ WORKS, AS WELL AS MEIFILE$ AS WELL AS M,EIFILE$ (WHERE FILE HAS THE SECOND ARG ALREADY). 276 FIX BUG IN ERROR MSG FILE ACCESS. MAKE ^G WITH ONLY ONE ARG DO A PEEK INSTEAD OF A GETTAB. 277 SAVE A WORD WASTED BY EDIT 261. INSTALL DEC EDIT 172 (PROPER BOUNDS CHECKING). INSTALL EQUIVALENT OF DEC EDIT # 174. 300 FIX FAILURE WHEN RENAMING THE .TMP FILE (EB) IN AN AREA NOT YOUR OWN. *** BACK TO STEVENS/RAPIDATA AGAIN 277A FIX BUG IN REENTER (P MAY NOT CONTAIN A PDL) 300A FIX ARGS FOR TRMOP. TO GET TTY WIDTH 301 CHANGE E SELECTION ALGORITHM 302 CHANGE .RB??? DEFINITIONS SO THAT THEY USE UUOSYM. 303 Removed. 304 CHANGE THE FLAG NAMES AND THE DEFINITIONS. NOW USE THE TX?? MACROS FROM MACTEN FOR THE FLAGS. FF FLAGS ==> F.???? F2 FLAGS ==> S.???? 305 BISSW was added to allow TECO to make limited use of the Business Instruction Set. The code will not be removed, but it will also not be used. It turns out to be considerably slower than TECO's old mechanism and move string backwards. is not possible. 306 Change the error code for Undefined Terminal Type 307 See edit 277. 310 Add /INPLACE so that EB will ER EW to same place. 311 Finish fixing the flags (Edit 304). 312 Remove the PDP6 feature test. ***BACK TO TEXAS... 313 Increase efficiency of FS when both strings are the same length by skipping character-moving code. 314 Work on CRT stuff some more. Make treatment of no wrap-around better. Add ^N20 to error routines to type list of valid CRT types. 315 Modify EW defaulting so that it won't use the ER device if it is an ersatz. (For the same reason that it won't use ER's PPN.) Equivalents of DEC EDITS up to 174 are in. Also 176. 316 Fix SKAN routine so that the character after a PW is not ignored and so that @FD/.../ gets scanned properly. 317 Fix /SUPLSN. Slow punch routine will be used on a sequenced file IF /SUPLSN not set for INPUT file. Minor bugs in default PPN handler, initalization, and edit 313. 320 Fix EA so that privileged programs don't bomb if the LOOKUP fails. (Monitor thinks USETI is a super.) Fix bug in *i command: X3 routine should not add the garbage collection constant in this case. Add ADDS 580 terminal by popular demand. Fix a very rare ill mem ref bug: if MEMSIZ falls exactly on a 1K boundary, and Z is allowed to equal MEMSIZ, then the routine at NROOM6 fails, since it must reference (Z/5)+1. So make sure Z always stays less than MEMSIZ. 321 Fix X command to allow buffer length of greater than 2**18 characters; i.e. do not use immediate instructions to perform necessary arithmetic. ***The following adapted from Storage Technology Corp.'s revisions. 322 Fix double OCT error if first character of new command is 8 or 9. 323 Add "\\" command which reads/writes same as "\" but in octal. 324 Add VT50 terminal. 325 Add three immediate commands which work if they are the first things typed: = 1LT, <^H> = -1LT, and, in the spirit of DDT, <;> = 0LT. Fix several bugs in log file processing: ^G's were getting inserted twice; * commands weren't being inserted at all; first character in log file (usually *) missing if previous command was ^G^G'ed. 326 Change INIT to OPEN in TTOPEN and CCLTMP. Fix an obscure search bug which makes S^ES$ blow up if the character after the end of the buffer HAPPENS to be a blank or tab. 327 Fix serious problem arising when ^P and ^Y are used on sequenced files. n^P usually threw away page n-1; ^Y went into an infinite loop. 330 Fix bug in \\. 331 Fix Ill Mem Ref in ";" immediate command. Add H1500, ADM3A, ACT-IV, ACT-V and HP2640 terminals. Improve handling of ; and ^H commands. Modify ET command: 2ET means image typeout. Clear digit string bit to prevent 2.5 or 3Z4 from returning wierd values. 332 Improve U command. m,nUi will now store the value n into Q-reg i, and return m. This allows m,nUiUj to store two values, such as those passed to a macro. Improve [ command. n[i now behaves like [inUi, allowing the Q-reg to be saved before a value is stored. m,n[i[j will work as described above. Issue error msg if attempt to store a number smaller than -377777,,0 octal. 333 Support File Daemon, improve protection logic for EB's. .BAK files will always be given a protection of 0xx or 4xx. 334 Replace complete searching algorithm. (U. of New Orleans) 335 Change EO level to 3, and restore several of the obolete DEC features for EO < 3, such as position of pointer after searches, etc. (NSA) 336 Don't shrink too much after an EI file is processed, so that the purpose of "R TECO 50K" isn't defeated by the initial EITECO.INI. 337 Change EI-EP file defaulting. If no device or directory is specified, first look on [-], then on [,,TEC]/SCAN, and finally on TED:. Add /DEFAULT I/O switch to clear sticky defaults. Read TECO.ERR from the device and PPN that TECO was run from; if that fails, try SYS:. Other minor changes to error message processing. Change /READ to /READONLY. 340 Add warning message for ER and EB when file is found in directory other than the one specified (LIB: or /SCAN). Fix /INPLACE so it will really overwrite the file in these cases. Fix EN so file stays in the same directory unless a new directory is explicitly given. 341 Fix Ill mem ref in ^N processing for new search. 342 Fix backwards bounded searches which occur after the pointer. For example, HK IA12345$ J 6,0S123$$ shouldn't fail. Fix core problem preventing REENTER after ^Z. 343 Modify CCL command handler to support MAKE A=B command. Change our pseudo altmode character from % to $ (dollar sign). Make EWfile/APPEND$ equivalent to EAfile$. Make EBfile/READONLY$ equivalent to ERfile$. 344 Fix several bugs in slow search algorithm. Due to overwhelming popular demand, finally remove DEC's "feature" which treats all searches inside iterations as colon searches. Such searches will never issue an error message, but if EO > 2, they will now return no value. Semi-colons will still work correctly, since a ; with no arg looks at what happened in the last search. Searches using a previous string will now remember the exact match setting. 345 Fix LSN routines to properly handle page marks. (DEC edit 217). 346 Implement generalized nA command, which returns the ASCII value of the nth character to the right of the pointer. 0A returns the character to the left, and -nA returns the n+1st character to the left of the pointer. If .+n-1 is out of bounds, a 0 is returned. An m,nA command will cause m to be returned if the character is out of bounds. Implement :nA command to append n lines to the buffer. 347 Implement the nV command equivalent to n-1TnT. *** Start of Version 124A *** NOTE: All applicable DEC edits through 226 have been installed. 350 Make sure there is room for at least 5000 characters when TECO starts up. 351 Don't issue "Superseding existing file" message if /INPLACE. Fix V command for negative numbers. 352 Fix Ill mem ref in CCL command processor when TMP file doesn't end with or "}". 353 Fix problem with EB close routine so that it doesn't get fooled by old .BAK and .TMP files not in the default path. 354 Fix Ill. Mem. Ref. after TECO runs out of core. 355 Fix another Ill. Mem. Ref in EP command. Make EP a little faster. { SUBTTL MACRO DEFINITIONS -- .CLNAM COMMENT \ MACRO TO GENERATE TEXT CONTAINING CORRECT VERSION INFORMATION DEFINE THE MACRO .NAME TO BE WHAT YOU WANT, FOR EXAMPLE: DEFINE .NAME(V,M,E,W)< TITLE PROGRAM %'V'M'('E')'W > THEN CALL THE .CLNAM MACRO: .CLNAM FOO WHERE THERE ARE SYMBOLS DEFINED AS THE VERSION, MINOR VERSION (1=A, 2=B, ETC), EDIT, AND "WHO" VALUE. IT WILL GENERATE EXACTLY WHAT'S IN THE .NAME DEFINITION, WITH THE DUMMY ARGS SUBSTITUTED APPROPRIATELY (INCLUDING THE MINOR VERSION). THE SYMBOLS "FOOVER", "FOOMIN", "FOOEDT", AND "FOOWHO" ARE USED SIMILAR TO THE WAY THE VRSN. MACRO WORKS. \ DEFINE .CLNAM(FOO)< DEFINE .CLNM(LETTER,WHO)< IRPC LETTER,< IFE "A"-"'LETTER'"+FOO'MIN-1,< STOPI IFIDN <@>,< IFE FOO'WHO< .NAME(\FOO'VER,,\FOO'EDT,)> IFN FOO'WHO< .NAME(\FOO'VER,,\FOO'EDT,-WHO)>> IFDIF <@>,< IFE FOO'WHO< .NAME(\FOO'VER,LETTER,\FOO'EDT,)> IFN FOO'WHO< .NAME(\FOO'VER,LETTER,\FOO'EDT,-WHO)>>>>> IFG FOO'MIN-^D26,< FOO'MIN==0 PRINTX %MINOR VERSION TOO LARGE - IGNORED> IFG FOO'WHO-7,< FOO'WHO==0 PRINTX %WHO VERSION TOO LARGE - IGNORED> .CLNM(@ABCDEFGHIJKLMNOPQRSTUVWXYZ,\FOO'WHO) > DEFINE .NAME(V,M,E,W),< TITLE TECO %'V'M(E)'W TEXT EDITOR AND CORRECTOR > .CLNAM TEC SUBTTL MACRO DEFINITIONS -- CHKEO, ERROR ;CHECK EO FLAG: CHKEO EO#,ADDR ;IF EOFLAG > EO#, RETURN AT CALL+1 ;OTHERWISE GO TO ADDR DEFINE CHKEO(E,A) <1B22+B30,,A> ;TYPE ERROR MSG: ERROR E.XXX ;TYPE MESSAGE CORRESPONDING TO 'XXX' ;THEN GO TO GO ;THE FOLLOWING IS THE DEFINITION OF THE REGULAR ERROR UUO DEFINE ERROR(X) <1B8+'X' 'X'=<''X''>&777777> ;THE FOLLOWING IS THE DEFINITION OF THE COLONABLE ERROR MESSAGES ;THIS IS USED FOR THE NEW ERROR HANDLING WITH COLON CONTRUCTION ;IF AN ERROR OCCURS AND THE ..ERROR UUO IS EXECUTED, THE COLON FLAG ;IS CHECKED TO SEE WHETHER YOU SHOULD RETURN A VALUE OF 0 OR PROCEED ;AND TYPE OUT THE ERROR MESSAGE DEFINE ..ERROR(X) <1B8+10B12+'X' 'X'=<''X''>&777777> OPDEF TYPR1 [2B8] SUBTTL DEFAULT ASSEMBLY PARAMETERS NDS. CCL, 1 ;CCL CAPABILITY NDS. TEMP, 1 ;TMPCOR UUO CAPABILITY NDS. RUBSW, 0 ;DON'T MIMIC MONITOR NDS. NORUNS, 0 ;RUN UUO CAPABILITY NDS. AUTOFS, 0 ;DEFAULT IS NON-AUTOTYPE AFTER SEARCHES NDS. TYCASW, 0 ;DEFAULT TYPE-OUT MODE CAUSES FLAGGING OF ;CHARACTERS IN THE LOWER CASE RANGE WITH ' NDS. SRCHSW, 0 ;DEFAULT PREVAILING SEARCH MODE IS ACCEPT ;EITHER LC OR UC ALPHABETICS AS A MATCH NDS. BUFSIZ, ^D128 ;128 WORD I/O BUFFERS NDS. LPDL, 120 ;80 WORD PDL NDS. LPF, 40 ;32 WORD Q-REGISTER PDL NDS. VC, 0 ;OLD V COMMAND NOT IMPLEMENTED, ;[347] USE NEW V COMMAND INSTEAD NDS. EOVAL, 3 ;[335] THE STANDARD SETTING OF THE EO FLAG FOR ;THIS VERSION IS 3 NDS. BUGSW, 0 ;STANDARD IS DON'T SAVE SYMBOLS NDS. CRT, 1 ;CRT RUBOUT HANDLING CAPABILITY NDS. BISSW, 0 ;SUPPORT BIS (SLOW...) ;FOR ANY OTHER VERSION ASSEMBLE AS FOLLOWS: ;.R MACRO ;*TECO_TTY:,DSK:TECO.MAC ;CCL=0 (IF CCL NOT WANTED) ;TEMP=0 (IF TMPCOR UUO NOT WANTED) ;ERRMSG=1 (IF SHORT ERROR MESSAGES WANTED OR ; =3 IF EXTRA LONG ERROR MESSAGES WANTED) ;NORUNS=1 (IF RUN UUO SIMULATION WANTED) ;AUTOFS=-1 (IF DEFAULT = AUTOTYPE AFTER SEARCHES WANTED) ;TYCASW=1 (IF TYPE-OUT CASE FLAGGING DEFAULT VALUE ; TO FLAG UPPER CASE INSTEAD OF LOWER CASE ; CHARS. WANTED) ;TYCASW=-1 (IF TYPE-OUT CASE FLAGGING DEFAULT VALUE ; FOR NO FLAGGING WANTED) ;SRCHSW=1 (IF EXACT MODE WANTED AS THE DEFAULT VALUE ; OF THE PREVAILING SEARCH MODE) ;BUFSIZ=^D256 (IF 256-WORD I/O BUFFERS WANTED. ANY ; OTHER CONSTANT BESIDES 256 MAY BE USED. ; TECO USES STANDARD MONITOR BUFFERING, ; BUT IF THE MONITOR PROVIDES BUFFERS ; LARGER THAN 128 WORDS, BUFSIZ MUST BE ; CHANGED SO THAT SUFFICIENT SPACE IS ; RESERVED. ;LPDL=N (WHERE N 120, IF LARGER PDL WANTED) ;LPF=N (WHERE N 40, IF LARGER Q-REGISTER PDL WANTED) ;EOVAL=N (WHERE 0 F.NNUL==1B14 ;NON-NULL INSERT STRING (MIGHT BE ONLY ^V, SAY) F.NEG== 1B13 ;MINUS SIGN SEEN AS AN OPERATOR F.XXXX==1B12 ;[343] **** FREE **** F.EOFI==1B11 ;INPUT CLOSED BY EOF F.IOPN==1B10 ;INPUT FILE IS OPEN F.OOPN==1B09 ;OUTPUT FILE IS OPEN F.EBTP==1B08 ;EB FUNCTION TEMPORARY FLAG F.FILE==1B07 ;AT LEAST ONE ELEMENT OF FILE SPEC GIVEN F.PROT==1B06 ;FILE PROTECTION WAS SPECIFIED F.INIT==1B05 ;INIT FILE READING F.UBAK==1B04 ;EB IN EFFECT F.TALK==1B03 ;MESSAGE TYPE OUT IN GRABAK? F.TYOF==1B02 ;NEED TO OUTPUT A BUFFER F.TCTL==1B01 ;ALLOW CONTROL CHARS TYPED WITHOUT "^" F.CCL== 1B00 ;TECO COMMAND REQUESTS Y AFTER EB SUBTTL CONTROL FLAGS -- AC F2 ;RIGHT HALF - AC F2 S.CTLV==1B35 ;^V SEEN INSIDE TEXT S.CTVV==1B34 ;DOUBLE ^V SEEN INSIDE TEXT S.CTLW==1B33 ;^W SEEN INSIDE TEXT S.CTWW==1B32 ;DOUBLE ^W SEEN INSIDE TEXT S.XMAT==1B31 ;EXACT MATCH SEARCH MODE S.EMAT==1B30 ;TEMPORARILY ACCEPT EITHER UPPER OR LOWER CASE S.LCTT==1B29 ;TTY LINE HAS LC BIT ON S.NCFL==1B28 ;TYPE MESSAGE WITH NO CASE FLAGGING S.OCTL==1B27 ;OCTAL RADIX S.CTLR==1B26 ;^R SEEN AT INPUT TIME S.SKMR==1B25 ;WATCH FOR ^R WHEN SKIMMING S.SKMQ==1B24 ;WATCH FOR ^Q WHEN SKIMMING S.NTRC==1B23 ;DISABLE TRACING S.TXTC==1B22 ;TYPE , ETC INSTEAD OF PRINTER CONTROLS S.SFSN==1B21 ;SKANNING FS OR FN S.NCCT==1B20 ;NO CONTROL COMMANDS IN TEXT EXCEPT ^T, ^R S.LCAS==1B19 ;CONVERT UPPER CASE TO LOWER CASE BY DEFAULT S.UCAS==1B18 ;CONVERT LOWER CASE TO UPPER CASE BY DEFAULT ;LEFT HALF - AC F2 S.GOIN==1B17 ;A COMMAND STRING HAS BEEN SEEN S.CTLN==1B16 ;^N IN SEARCH ARGUMENT S.NALT==1B15 ;DON'T CONVERT OLD ALTMODES TO 033 ;**** S.NRAD & S.YANK ARE EQUAL, THIS IS OK S.NRAD==1B14 ;NULL REPLACEMENT ALTMODE DELIMITED S.YANK==1B14 ;^Y NOT ^P IN PROGRESS S.LOPN==1B13 ;LOG FILE OPEN S.INFO==1B12 ;INFORM USER OF ANY CORE CHANGE WHEN DONE S.DOIT==1B11 ;M AS OPPOSED JUST HX* S.XXXX==1B10 ;[331] ***FREE*** S.EA== 1B09 ;EDIT APPEND IN PROGRESS S.MINS==1B08 ;MINUS SEARCH S.DELS==1B07 ;TO DELETE TO FROM START TO PT SEARCH S.ASTR==1B06 ;DON'T PRINT STAR S.SSEQ==1B05 ;SUPPRESS SEQUENCE NOS ON INPUT S.SLOG==1B04 ;UNDER NO CIRCUMSTANCES SEN CHARACTER TO LOG FILE S.OLOG==1B03 ;WHEN AT TYOA, STICK IT IN THE LOG FILE ONLY S.LIN== 1B02 ;PUT YOUR TYPE IN IN THE LOG FILE S.LOUT==1B01 ;PUT TECO'S TYPE OUT IN THE LOG FILE S.DPPN==1B00 ;REMEMBER TO DEFAULT TO ZERO PPN SUBTTL I-O CHANNELS ;I-O CHANNELS INCHN== 2 OUTCHN==3 TTY== 4 ;CHANNEL FOR TTY IO CCLCHN==5 ;CHANNEL FOR THE CCL TMP FILE ERRCHN==6 ;CHANNEL FOR ERROR MESSAGE FILE LOGCHN==7 ;CHANNEL TO WRITE LOG FILE ON (IF ANY) SAVCHN==10 ;TO WRITE LOW SEG SAVE ON INICHN==11 ;TO READ INI FILE ON SUBTTL MISC PARAMETERS BEGPAG==200 ;FAKE ASCII CHAR = BEGINNING OF BUFFER ENDPAG==201 ;FAKE ASCII CHAR = END OF BUFFER IF NO EOL AT END SPCTAB==202 ;FAKE ASCII CHAR = SIGNAL TO SEARCH FOR A STRING OF SPACE/TABS SMATLN==^D131 ;Number of characters in the search matricies BITMLN==SMATLN/^D36+1 ;Number of words needed to hold SMATLN bits STABLN==^D131 ;Length of Otag$ build table GCTBL== LPF+40 EE1==1B12 ;PRINT UUO ERROR CODE AFTER ?XXX EE2==2B12 ;PRINT I/O ERROR CODE AFTER ?XXX EE3==3B12 ;PRINT NOTHING AFTER ?XXX BECAUSE NO CORE FOR ERROR FILE EO21== 1 ;TURN OFF SPECIAL VERSION 22+ FEATURES IF EO VALUE = 1 EODEC== 2 ;[335] Same for version 124+ SUBTTL PSEUDO RUN UUO IF NEEDED IFN NORUNS,< IFN CCL,< NORUN1: IOWD .-.,INHERE ;MODIFIED FOR LENGTH 0 NORUN2: CORE 15, EXIT ;NOT ENOUGH CORE TO GET COMPIL IN CCLCHN,NORUN1 ;READ THE FILE JRST NORBLT ;TO THE ACS EXIT ;NO GOOD. INHERE: ;WHERE CODE APPEARS NORAC: ;WHERE TO READ AC DATA FROM PHASE 0 NORBLT: BLT NORTOP,.-. ;ADR MODIFIED RESET AOS 1,.JBSA ;ADR + 1 JRST (1) ;START COMPIL NORTOP: XWD INHERE+1,75 ;MOVE COMPIL DOWN DEPHASE >> SUBTTL STARTUP TIME INITIALIZATION JRST RST ;THIS MUST BE IN 400010 WHEN SSAVED ;THIS IS USED BY THE EE COMMAND ROUTINE ;SAVED IN THE LOW SEGMENT TO START TECO ;AFTER A SAVE TECO: IFN CCL,< TDZA B,B MOVNI B,1 ;THE CCL ENTRY > RESET ;INITIALIZE ALL IO SETZB F2,LOCORE ;CLR DATA IN CASE OF ^C,ST & CLEAR F2 MOVE A,[XWD LOCORE,LOCORE+1] IFE BUGSW, IFN BUGSW, IFN CCL, MOVEM 11,ERRDEV ;[337] Save device we RUN from, for TECO.ERR MOVEM 7,ERRPPN ;[337] Save PPN as well MOVE A,[PUSHJ P,UUOH] ;SET UUO TRAP MOVEM A,.JB41 MOVE P,[XWD -LPDL,PDL] ;START ONE WORD DOWN HRRZ B,.JBFF ;MAKE SURE WE HAVE AT LEAST 1000. FREE WDS ADDI B,^D1000 ;[350] CAML B,.JBREL CORE B, JFCL ;KEEP GOING...WITH LUCK WE WILL AT LEAST GET ;THE PROPER ?COR MESSAGE HRRZ A,.JBREL ;.JBFF=.JBREL-202 SUBI A,47 ;[352] Buffer space for TMPCOR, etc. EXCH A,.JBFF IFN BUGSW, ADD A,[677,,-1] ;CBUF=[000700,,FF-1] MOVEM A,CBUF MOVEI A,201(A) IMULI A,5 MOVEM A,BEG ;BEG:=(CBUF+200)*5 MOVEM A,PT ;PT:=(CBUF+200)*5 MOVEM A,Z ;Z:=(CBUF+200)*5 MOVEM A,QRBUF ;QRBUF:=(CBUF+200)*5 PUSHJ P,SETUP ;SET UP STUFF ;Fall through to next page... HRREI A,TYCASW ;GET WHATEVER IS DEFAULT TYPE-OUT CASE FLAGGING MODE MOVEM A,TYCASF ;AND MAKE IT CURRENT HRRZI A,EOVAL ;INITIALIZE EO FLAG MOVEM A,EOFLAG HRREI A,AUTOFS ;INIT AUTOTYPE-AFTER-SEARCHES FLAG MOVEM A,AUTOF IFN CRT,< HLRZ A,CRTGEN ;GET "GENERAL CRT" FLAGS MOVEM A,CRTTYP ;STORE MOVEI A,BACRUB HRLI A,VCRT BLT A,CTUSEQ > SETOM INI ;REMEMBER TO DO INI FILE IFN BISSW,< ;BIS SUPPORT SETZM A ;SEE IF KL10 BLT A,0 ;... MOVEM A,BIS ;NOTE RESULT > ;END IFN BISSW ;Fall through to next page... SUBTTL TEXT BUFFER INITIALIZATION ;COMPUTE A VALUE WHICH IS 2/3 THE SIZE OF THE CHARACTER BUFFER.IF ;1/3 IS LESS THAN 128 CHARACTERS, THE BUFFER WILL BE 2/3 FILLED ON ;A "Y" OR "A" COMMAND,OTHERWISE, THE BUFFER WILL BE FILLED TO THE ;TOTAL AVAILABLE BUFFER - 128 CHARACTERS. PAYING ATTENTION TO THE ;FORM FEED AND LF OPERATORS. ;IT SHOULD BE NOTED THAT IN THE CASE OF AUTOMATIC ;MEMORY EXPANSION, THESE INSTRUCTIONS MUST BE RE-EXECUTED ;TO INSURE PROPER MEMORY BOUNDS. PUSH P,INITG ;FOR IN LINE CODING POPJ CRE23: MOVE A,.JBFF ;LATEST VALUE OF FF IMULI A,5 ;5 CHARACTERS PER MEM WORD MOVEM A,MEMSIZ ;MEMSIZ:=C(.JBFF)*5 INITG: POPJ P,.+1 ;EXIT OR CONTINUE MOVE A,CBUF MOVEI A,100(A) MOVEM A,CBUFH ;CBUFH:=CBUF+77 MOVEI A,SYL MOVEM A,DLIM ;DLIM:=SYL HRLOI A,10014 MOVEM A,NROOM2 ;NROOM2:=XWD 10014,-1 MOVEI FF,0 ;CLEAR FLAG REGISTER SKIPE SRHMOD ;IF DEFAULT SEARCH MODE IS NOT 0, TXOA FF,F.PMAT ;MAKE EXACT MODE CURRENT GOE: TXZA FF,777777-F.TRAC-F.EMSG-F.FORM-F.SEQ GO: TXZ FF,777777-F.TRAC-F.FORM-F.SEQ TXZ F2,S.SSEQ!S.SLOG!S.NTRC!S.OCTL ;[322] MOVE P,[XWD -LPDL,PDL] ;INITIALIZE PUSHDOWN LIST MOVEM P,PDLSAV SETZM PDL ;FLAG PDL TOP - NOTE: PDL FLAGS ARE ;0 = TOP OF PDL ;-1= LAST ITEM IS AN ITERATION ;+1= LAST ITEM IS A PARENTHESIS ;>1= LAST ITEM IS A MACRO SETZM XCTING ;NO LONGER DOING ANYTHING SETZM EQM ;CLEAR THE MACRO LEVEL COUNT MOVE PF,[XWD -LPF-1,PFL-1] AOSE INI ;TO DO THE INI FILE? JRST CLIS MOVSI E,(MOVE B,) ;FIX ILL UUO PROB IN INI FILES HLLM E,DLIM PUSHJ P,CLREXT ;SET UP EXTENDED LOOKUP BLOCK TXO F2,S.DOIT ;DO INI FILE SETOM XCTING ;SO IT DO IT PUSHJ P,TTOPEN ;OPEN THE TTY MOVSI E,'INI' ;SET UP EXTENSION PUSHJ P,INIFIL ;GET IT INTO CORE JRST CLIS ;GO DO REST SUBTTL REENTER COMMAND REE: CLRBFO ;STOP TYPEOUT MOVEM P,TEMPP ;PRESERVE P MOVE P,[IOWD 4,TEMPDL] ;SET UP STACK FOR SURE PUSH P,E ;SAVE AN AC MOVEI E,TTY ;CLOSE TTY RESDV. E, ;RESET TTY JFCL PUSHJ P,TTOPEN ;REOPEN TTY POP P,E ;RESTORE E, AFTER USE BY TTOPEN MOVE P,TEMPP ;RESTORE P RELEAS ERRCHN, ;FIX ADR CHECK AOSE XCTING ;COMMAND IN PROGRESS? JRST GO ;NO, GO AND LISTEN FOR INPUT JRSTF @.JBOPC ;CONTINUE ;ROUTINE TO FIX PDL OV'S PDLOV: MOVSI D,'PDL' ;FAKE AN ERROR MESSAGE TLNE P,-1 ;MAIN PDL ERROR? MOVSI D,'PDQ' ;Q REG STACK HLRZM D,.JBUUO ;PDL OV MOVEI B,"[" ;IN CASE PDQ SKIPE CTGLEV ;WERE WE IN THE MIDDLE OF A ^G SEARCH? MOVEI B,7 ;YES MOVEM B,ARGSTO ;SAVE IT SETZ D, ;DON'T APPEND A LOOKUP/ENTER/RENAME ERROR CODE! JRSTF ERRPDL ;CAUSE ERROR UUO TO HAPPEN SUBTTL INITIALIZATION OF JOB DEPENDENT PARAMETERS SETUP: MOVEI A,PDLOV ;WHERE TO GO ON PDLOV MOVEM A,.JBAPR ;SAVE MOVX A,AP.REN!AP.POV ;ENABLE FOR PDL OV TRAPPING APRENB A, ;SET TRAP GETPPN A, ;GET USER'S PROJ-PROG # JFCL ;[317]IN CASE SKIP RETURN MOVEM A,USRPPN SETOM DEFPTH ;GET DEFAULT PATH MOVE E,[11,,DEFPTH] PATH. E, MOVEM A,DEFPTH+2 ;IF NOT, JUST PPN MOVSI A,'DSK' ;DEFAULT DEVICE MOVEM A,ERSPEC ;SAVE FOR DEFAULT ER COMMAND SETOM MONITR ;GET MONITOR SERIES NUMBER MOVX A,%CNSTS GETTAB A, ;WHICH MONITOR? JRST TECO2 ;3 SERIES (MONITR=-1) TXNE A,ST%TDS ;WHAT MONITOR ? AOS MONITR ;5 SERIES (MONITR=+1) AOS MONITR ;4 SERIES (MONITR=0) TECO2: MOVE A,[F%FDAE&LH.ALF!.GTFET] ;[333] See if FILDAE is there GETTAB A, ;[333] SETZ A, ;[333] Assume not SETZM FDAEM ;[333] Ditto TXNE A,F%FDAE&RH.ALF ;[333] Well? SETOM FDAEM ;[333] Yes PJOB A, ;GET JOB # MOVEM A,JOBN MOVEI C,3 ;SET CTR JOBLUP: IDIVI A,12 ;CONVERT JOB# TO DECIMAL ASCII IN LEFT HALF ADDI AA,20 LSHC AA,-6 SOJG C,JOBLUP HRRI B,(SIXBIT /TEC/) ;FORM NAME ###TEC MOVEM B,TMPTEC ;SAVE HRROI A,.GTWCH ;GOING TO GET ERROR MESSAGE LEVEL BITS GETTAB A, ;GET WATCH BITS SETZ A, TXNN A,JW.WMS TXO A,JW.WPR!JW.WFL ;ASSUME FIRST LINE!PREFIX TXNE A,JW.WCN TXO A,JW.WFL MOVEM A,ERRLEN ;-1=SHORT, 0=MEDIUM, +1=LONG MOVEM A,PRMERR ;SAVE FOR DEFAULT POPJ P, SUBTTL CCL Command processor IFN CCL,< TTYPT: XWD 440700,TTYBFS ;CCL COMMAND BUFFER PTR TTYPT2: XWD 260700,TTYBFS ;TO INSERT FILE NAME AFTER EW OR EB CCLIN: IFN TEMP,< SETZ I, ;CLEAR TO DENOTE NO TMPCOR MOVE A,[XWD 2,TT] ;SET UP FOR TMPCOR READ & DELETE HRLZI TT,'EDT' ;SET UP READ BLOCK FOR TMPCOR UUO HRRZ TT1,.JBFF ;[343] Get first free location ADDI TT1,46 ;[343] Allow more than enough space CAML TT1,.JBREL ;[343] Do we have it? CORE TT1, ;[343] No - expand JFCL ;[343] Do the best we can HRRZ TT1,.JBFF ;[343] Where to put it SUB TT1,[XWD 46,1] ;[343] Make an IOWD TMPCOR A, ;READ AND DELETE FILE EDT JRST CCLTMP ;NO FILE EDT OR NO TMPCOR UUO HRRZ AA,.JBFF ;[343] Start of buffer area HRLI AA,350700 ;PICK UP EDT CHARACTERS, SKIP LINED "S" JSP I,CCLTM1 ;[343] Denote we have TMPCOR and continue below >;END OF IFN TEMP ;Here if TMPCOR failed. Read DSK:nnnEDT.TMP. CCLTMP: HLLZ B,TMPTEC ;GET SIXBIT JOB # HRRI B,(SIXBIT /EDT/) ;REST OF NAME MOVEM B,XFILNM+.RBNAM MOVSI B,(SIXBIT /TMP/) MOVEM B,XFILNM+.RBEXT SETZM XFILNM+.RBSIZ ;USE DEFAULT PATH, PREVENT ADR. CHK. MOVE T,.JBFF ;USE BUFFER SPACE BRIEFLY OPEN CCLCHN,[EXP .IOASC ;[326] SIXBIT /DSK/ ;[326] TO READ THE FILE EXP CCLB] ;[326] INPUT BUFFER JRST TECO ;IF NO DSK, SAY "*" INBUF CCLCHN,1 ;DONT ADR CHECK LOOKUP CCLCHN,XFILNM+.RBNAM ;OPEN THE FILE JRST TECO ;IT WASNT THERE? INPUT CCLCHN,0 MOVEM T,.JBFF ;GIVE BACK SPACE IBP CCLB+.BFPTR ;SKIP THE LINED S MOVE AA,CCLB+.BFPTR ;[343] Get byte pointer to input ;Fall back into normal process on next page ;Here when we have the command, either from TMP: or from DSK:. CCLTM1: MOVE T,TTYPT2 ;[343] Get output byte pointer MOVEI C,2 ;[343] Initialize the character count HRLI C,-<<46*5>-4> ;[343] Max of 186. chars MOVEI A,"=" ;[343] Flag no equals sign seen SETZ TT1, ;[343] Flag no dollar sign seen ;Loop back here on each new character in TMP file CCLIL: ILDB B,AA ;[343] Get next EDT character CAIN B,"$" ;[343] Is it a dollar sign? (Our pseudo altmode) JRST CCLALT ;[343] Yes CAMN B,A ;[343] First equals sign seen? JRST CCLEQL ;[343] Yes CAIE B,.CHCRT ;[343] CR? CAIN B,.CHALT ;[343] Old altmode? JRST CCLNUL ;[343] Assume we're done SKIPE B ;[352] Ignore nulls CCLIL1: IDPB B,T ;[343] Else store the character AOBJN C,CCLIL ;[343] Loop for all characters ; Fall through if too many characters; we can't overflow TTYBFS CCLOVF: JUMPN B,CCLOV1 ;[352] Is current char a null? LDB B,T ;[352] Yes, assume we're OK, pick up last char ADD T,[7B5] ;[352] Backup byte pointer JUMPG T,CCLNUL ;[352] SUB T,[430000,,1] ;[352] Fixup if necessary JRST CCLNUL ;[352] Go wrap things up CCLOV1: ERROR E.CTL ;[343] CCL command too long ; Here when a dollar sign seen CCLALT: MOVEI B,.CHESC ;[343] Change it into a real altmode JUMPN TT1,CCLIL1 ;[343] Is this the first one we've seen? MOVE TT1,AA ;[343] Yes, save input byte pointer JUMPL A,CCLIL1 ;[343] Was there a prior equal sign? MOVNI A,2 ;[343] No, so flag to ignore all future equal signs JRST CCLIL1 ;[343] Return to loop ; Here on the first "=" in the command string (unless $ seen first) CCLEQL: MOVEI B,.CHESC ;[343] Replace first equals sign IDPB B,T ;[343] with ER AOBJP C,CCLOVF ;[343] Count the escape MOVE D,T ;[343] Save T & C MOVE E,C ;[343] In case .TE A=B ADD C,[2,,2] ;[343] Count the "ER" we will add JUMPGE C,CCLOVF ;[343] Error if too many characters MOVEI B,"E" ;[343] Since we expect IDPB B,T ;[343] an input file MOVEI B,"R" ;[343] spec to follow IDPB B,T ;[343] the first one. SETO A, ;[343] Prevent finding later equals TXO FF,F.CCL ;[343] Do a EY in any case JRST CCLIL ;[343] and loop back for next character ; Here on a null (End of command). See if it was MAKE or TECO CCLNUL: MOVEI TT,"W" ;[343] Prepare for EW command CAILE B,.CHCRT ;WAS BREAK A CRLF? JRST CCLDUN ;NO. ALTMODE ASSUMED TXO FF,F.CCL ;REQUEST Y AFTER EB MOVEI TT,"B" ;[343] Now prepare for EB AOJN A,CCLDUN ;[343] continue unless EB and "=" was seen MOVE T,D ;[343] If .TE A=B, we never saw the "=" MOVE C,E ;[343] In case .MA A=B, then .TE JUMPE TT1,CCLDUN ;[343] Jump ahead unless there was a $ after "A=B" MOVE AA,TT1 ;[343] There was, so restore input BP to that point MOVNI A,-2 ;[343] Reset A so we don't do this again JRST CCLIL ;[343] And return to that point, leaving out the "=B" CCLDUN: MOVEI B,.CHESC IDPB B,T ;[343] TERMINATING TWO ALT'S IDPB B,T ;LAST ALT ADDI C,3 ;[343] COUNT BOTH ALTS & ADD 1 TO FOOL TYI0 MOVEI B,"E" ;NOW FILL IN THE EB OR EW MOVE T,TTYPT ;AT THE BEGINNING OF STRING MOVEM T,TIB+.BFPTR ;ALSO INITIALIZE TO READ THIS IDPB B,T ;STORE "E" IDPB TT,T ;[343] And either W or B HRRZM C,TIB+.BFCNT ;SET BUFR CTR IFN TEMP, ;[343] IF TMPCOR THEN DON'T HAVE TO CLOSE SETZM XFILNM+.RBNAM ;BY RENAME TO 0 RENAME CCLCHN,XFILNM ;GO. JFCL ;NOGO? CCLDU2: RELEAS CCLCHN, POPJ P, >;END OF IFN CCL SUBTTL RETURN NON-NULL TTY CHARACTER IN CH. ;CALL PUSHJ PDP,TYI ; RETURN TYI: TXZE FF,F.TYOF ;NEED A TYO? OUTPUT TTY,0 ;YES. DO SO. TYI0: SOSG TIB+.BFCNT ;CHARS IN NORMAL MODE? JRST TYI1 ;NONE LEFT TYI2: ILDB CH,TIB+.BFPTR ;YES. GET ONE JUMPE CH,TYI0 ;FLUSH NULLS TYI3: TXZ FF,F.DDTM ;CLR TTCALL REQUEST FLAG IFN RUBSW,< SETO A, ;AIM AT THIS TTY GETLCH A ;GETSTS TXNN A,GL.LCP ;SUPPRESS ECHO? > CAIE CH,.CHBEL ;BELL? JRST ALTLIN ;NO, BUT WATCH OUT FOR OLD ALTMODES TXO F2,S.SLOG ;DON'T PUT THE ^G IN THE LOG FILE JSP A,CONMES ;ECHO AN "^G" TOO ASCIZ /^G/ TXZ F2,S.SLOG MOVEI CH,.CHBEL ;GET BACK BELL POPJ P, TYI1: TXNE FF,F.DDTM ;SHOULD TYI BE TTCALL? JRST TYIDDT ;YES INPUT TTY,0 ;NO. ORDINARY. STATO TTY,IO.EOF ;END OF FILE? JRST TYI2 PUSHJ P,TTOPEN ;CLEAR EOF THE HARD WAY JRST TYI0 ;^Z WAS SEEN ALREADY. GET ANOTHER CH ;CONVERT 175 & 176 TO ALTMODE (033) UNLESS TTY LC IS ON ALTLIN: CAIL CH,.CHALT ;OLD ALTMODE? CAILE CH,.CHAL2 POPJ P, ;NO TXNN F2,S.NALT ;TEST TTY NO ALT BIT ALTX: MOVEI CH,.CHESC ;NOT ON, SO CONVERT TO 033 POPJ P, ;CONVERT 175 & 176 TO ALTMODE (033) IF EO = 1 ALTEO: CAIE CH,.CHALT ;OLD ALTMODE? CAIN CH,.CHAL2 CHKEO EO21,ALTX ;RUNNING OLD MACRO? IF SO, CONVERT POPJ P, ;NO, 175=RIGHT BRACE, 176=TILDE TYIDDT: TXZE FF,F.TYOF ;CHARACTERS WAITING FOR OUTPUT? OUTPUT TTY,0 ;YES, FORCE THEM OUT INCHRW CH ;WAIT FOR A SINGLE CHARACTER JRST TYI3 ;USE E INSTEAD OF T IN THIS ROUTINE, SINCE IT MAY BE CALLED ; AFTER A REENTER, WHILE T IS BEING USED TO MOVE CHARACTERS ; (FAST AC CODE). E HAS BEEN SAVED AT REE:. TTOPEN: MOVEI E,TTYBFS EXCH E,.JBFF ;SET .JBFF AND SAVE IT OPEN TTY,TTYBLK ;[326] INIT THE CONSOLE JRST .-1 ;[326] I REALLY WANT TTY INBUF TTY,1 OUTBUF TTY,1 ;KEEP IT SMALL MOVEM E,.JBFF ;RESTORE .JBFF IFN CCL,< SETZM TYIPT ;SIGNAL CCL BUFFER EMPTY > POPJ P, TTYBLK: EXP IO.FCS!.IOASC ;[326] TTY OPEN BLOCK SIXBIT /TTY/ TOB,,TIB SUBTTL TYPE A CHARACTER. ;FOR TYPING TEXT: FOR TYPING MESSAGES: ; MOVE CH,CHARACTER MOVE CH,CHARACTER ; PUSHJ P,TYO PUSHJ P,TYOM ; RETURN RETURN TYOS: TXOA F2,S.TXTC ;TYPE , ETC INSTEAD OF PRINTER CONTROLS TYOM: TXZ F2,S.TXTC ;CLR SPECIAL TYPEOUT FLAG TXOA F2,S.NCFL ;SET NO-CASE-FLAGGING FLAG TYO: TXZ F2,S.NCFL+S.TXTC ;CLR NO-CASE-FLAGGING FLAG & SPECIAL FLAG PUSH P,CH ;SAVE CHAR IN CASE ^ OR ' NEEDED TXZ FF,F.TCTL!F.IMAG ;[331] Zero literal and image flags SKIPN ETVAL ;[331] ET = 0? JRST TYOF ;[331] It's 0, so use up-arrow mode PUSH P,A ;[331] Save a #%&ing AC! MOVE A,ETVAL ;[331] Get ET value CAIN A,1 ;[331] ET=1? TXO FF,F.TCTL ;[331] Yes CAIN A,2 ;[331] ET=2? TXO FF,F.IMAG ;[331] Yes, set image mode POP P,A ;[331] Retore A JRST TYOB ;[331] Go type character TYOF: PUSHJ P,ALTEO ;[331] CONVERT OLD ALTMODES IF EO=1 IFN CRT, IFE CRT, JRST TYO1 ;BELOW TAB TXZN F2,S.TXTC ;WANT , ETC INSTEAD OF PRINTER CONTROLS? JRST TYOJ ;NO CAIG CH,.CHCRT ;IS IT A PRINTER CONTROL? JRST TYOH ;YES CAIE CH,.CHESC ;OR AN ALTMODE? JRST TYOG ;NO, DO NORMAL THING MOVEI CH,16 ;ADJUST INDEX FOR ALTMODE TYOH: MOVEI A,5 ;5 CHAR. CTR MOVE AA,[POINT 7,TSPTAB-10] ;& PTR TO RIGHT COMBINATION ADDI AA,(CH) TYOI: ILDB CH,AA ;TYPE OR WHATEVER SOJLE A,TYOB ;LAST CHAR GOES OUT VIA TYOB (TO POP CH) PUSHJ P,TYOA JRST TYOI TYOJ: CAIG CH,.CHCRT ;NO, TAB, LF, VT, FF, OR CR? JRST TYOB ;YES. TYPE IT AND RETURN CAIN CH,.CHESC MOVEI CH,"$" ;YES TYPE DOLLAR SIGN TYOG: CAIGE CH," " ;NO. ANY OTHER CONTROL CHARACTER? JRST TYO1 ;YES. TYOC: TXNE F2,S.LCTT+S.NCFL ;TTY LC ON? OR TYPING A MESSAGE? JRST TYOB ;YES, NO CASE FLAGGING MOVE A,TYCASF ;WHAT SHOULD BE FLAGGED? JUMPL A,TYOB ;NOTHING JUMPG A,TYOD ;UPPER CASE RANGE CAIGE CH,"A"+" "-1 ;LOWER CASE. IS THIS LC? JRST TYOB ;NO, SO DON'T FLAG IT TYOE: MOVEI CH,"'" ;YES, FLAG IT WITH ' PUSHJ P,TYOA MOVE CH,(P) ;GET BACK THE CHARACTER TXZ CH,40 ;MAKE IT UPPER CASE TYOB: PUSHJ P,TYOA ;TYPE CH. POP P,CH ;RESTORE CH TXZN FF,F.TCTL!F.IMAG ;[331] CLEAR LITERAL AND IMAGE FLAGS CAIE CH,.CHBEL ;[331] IF BELL, WE NEED A DING POPJ P, ;NO, RETURN JRST TYOA1 ;[325] BUT DON'T PUT THE DING INTO LOG FILE TYOA: TXNE F2,S.OLOG!S.LOUT ;PUT CHARACTER IN LOG FILE PUSHJ P,LOGOUT ;RIGHT! TYOA1: TXNE FF,F.IMAG ;[331] Do we want image typeout? JRST TYOK ;[331] Yes TXO FF,F.TYOF ;[325] MARK WILL NEED TO OUTPUT SOSG TOB+.BFCNT ;OUTPUT SPACE AVAIL? OUTPUT TTY,0 ;NO. OUTPUT. IDPB CH,TOB+.BFPTR CAILE CH,.CHFFD ;FORCE OUTPUT ON LF,FF ETC POPJ P, ;NO OUTPUT TTY,0 TXZ FF,F.TYOF ;NO LONGER NEED TO OUTPUT POPJ P, TYOK: TXZE FF,F.TYOF ;[331] If output pending... OUTPUT TTY,0 ;[331] put it out IONEOU CH ;[331] Output the image character POPJ P, ;[331] Return TYO1: PUSH P,CH ;TYPE CONTROL CHARACTER IN FORM "^CH" MOVEI CH, "^" PUSHJ P,TYOA ;TYPE ^ POP P,CH ADDI CH,100 ;CONVERT TO PRINTING CHARACTER JRST TYOB ;AND TYPE IT. TYOD: CAIL CH,100 ;IS THIS UPPER CASE? CAILE CH,137 JRST TYOB ;NO JRST TYOE ;YES, FLAG IT WITH ' ;PRINT THESE INSTEAD OF PRINTER CONTROLS IF S.TXTC FLAG IS ON TSPTAB: ASCII /^H/ ASCII // ASCII // ASCII // ASCII // ASCII // ASCII // SUBTTL MESSAGE TYPE-OUT & NUMBER TYPE-OUT ;CALL JSP A,CONMES ; ASCIZ /MESSAGE/ ; RETURN CONMES: HRLI A,(POINT 7,,) ;A=POINT 7,MESSAGE-ADDR ILDB CH,A ;GET MSG CHAR JUMPE CH,1(A) ;RETURN WHEN 0 FOUND PUSHJ P,TYOM ;TYPE WITH NO CASE FLAGGING JRST .-3 ;ROUTINE TO OUTPUT DECIMAL (OCTAL IF S.OCTL IS ON) INTEGER ;CALL MOVE B,INTEGER ; MOVEI A,ADDRESS OF OUTPUT ROUTINE ; PUSHJ P,DPT ; RETURN DPT: MOVEM A,LISTF5 JUMPGE B,DPT1 ;NUMBER > 0? MOVEI CH,"-" ;NO. OUTPUT - PUSHJ P,@LISTF5 MOVMS B ;B:=ABSOLUTE VALUE OF B DPT1: MOVEI A,12 ;RADIX 10 TXZE F2,S.OCTL ;[323] OCTAL RADIX? MOVEI A,10 ;YES, CHANGE TO RADIX 8 IDIVI B,(A) ;E:=DIGIT HRLM E,(P) ;PUT DIGIT ON LEFT HALF OF TOP OF PUSH DOWN LIST JUMPE B,.+2 ;DONE? PUSHJ P,.-3 ;NO. PUSH THIS DIGIT AND PRINT RETURN ADDRESS. HLRZ CH,(P) ;YES. CH:=DIGIT ADDI CH,"0" ;CONVERT IT TO ASCII. JRST @LISTF5 ;PRINT IT ;ROUTINE TO TYPE CARRIAGE RETURN LINE FEED ;CALL PUSHJ P,CRR ; RETURN CRR: JSP A,CONMES ;OUTPUT CRLF ASCIZ / / POPJ P, ;ROUTINE TO TYPE A STRING LITERALLY OUTIMG: TXO FF,F.IMAG ;[331] Use image mode OUTMES: HRLI A,(POINT 7,,) ;THIS ROUTINE WILL OUTPUT A STRING LITERALLY OUTMS1: ILDB CH,A JUMPE CH,OUTMS2 ;[331] PUSHJ P,TYOA TLNE A,700000 ;NO MORE THAN 5 CHARACTERS, THOUGH JRST OUTMS1 OUTMS2: TXZ FF,F.IMAG ;[331] Clear image flag POPJ P, SUBTTL RETURN NEXT COMMAND CHAR AT CURRENT LEVEL ;CALL: PUSHJ P,SKRCH ; ERROR RETURN IF NO MORE CHARS AT THIS LEVEL ; NORMAL RETURN WITH CHAR IN CH SKRCH: SKIPG COMCNT ;ANY CHARS LEFT? POPJ P, ;NO, TAKE ERROR RETURN PUSHJ P,RCH ;YES, GET NEXT CPOPJ1: AOS (P) ;SKIP RETURN POPJ P, ;ROUTINE TO RETURN NEXT CHARACTER FROM COMMAND BUFFER. ;CALL PUSHJ P,RCH ; RETURN ALWAYS WITH CHARACTER IN CH RCH: SOSGE COMCNT ;DECREMENT COMMAND BUFFER CHARACTER COUNT ;IS COMMAND BUFFER EMPTY? JRST RCH2 ;YES. POP UP TO HIGHER MACRO LEVEL. ILDB CH,CPTR ;NO. GET COMMAND CHARACTER IN CH PUSHJ P,ALTEO ;CONVERT OLD ALTMODES IF EO = 1 HRRM CH,EATCH ;IN CASE OF FAILURE DURING COLON ANYTHING TXNE FF,F.TRAC ;IN TRACE MODE? TXNE F2,S.NTRC ;TRACE ENABLED? POPJ P, ;NO, RETURN JRST TYO ;YES, TYPE THE COMMAND RCH2: POP P,CH ;SAVE RETURN FOR POPJ IN CH POP P,COMCNT ;GET RID OF FLAG SOSGE EQM ;DECREMENT THE MACRO COUNT SETZM EQM ;NEVER ALLOW IT TO GO NEG OR PEOPLE WILL SCREW UP SOSGE COMCNT ;IF ANG BRAK ON PDL, ITS A INCOMPLETE MACRO ERROR E.IAB POP P,COMCNT ;GET COUNT FROM NEXT MACRO LEVEL POP P,CPTR ;CURRENT POINTER TOO POP P,COMAX ;NUMBER OF COMMANDS PUSH P,CH ;GET RETURN BACK ON PDL. JRST RCH ;TRY AGAIN. ;GET NEXT CHAR FROM CURRENT COMMAND LEVEL WHERE A CHAR IS ;KNOWN TO BE THERE, AND NO TRACING IS WANTED GCH: SOS COMCNT ;REDUCE CHAR COUNT ILDB CH,CPTR ;GET CHAR. JRST ALTEO ;CONVERT OLD ALTMODES AND RETURN SUBTTL SCAN COMMAND STRING FOR CHARACTER IN TT ;IGNORING PAIRS STARTING WITH CHAR. IN TT1 AND ENDING WITH (TT) ;ASSUMED THAT CPTR IS SET ;NON-SKIP RETURN IF (TT) CAN'T BE FOUND ;SKIP RETURN IF FOUND ;CPTR LEFT SET FOR NEXT CHAR. IN COMMAND STRING SKAN: TXO F2,S.NTRC ;INHIBIT TRACE ACTION WHILE SKANNING MOVEI C,0 ;CTR FOR <> AND "...' PAIRS SKAN0: TXZ F2,S.SKMQ+S.SKMR+S.SFSN ;CLR SKIM FLAGS PUSHJ P,SKRCH2 ;GET COMMAND CHAR. SKAN01: CAIN CH,(TT1) ;SECONDARY CHARACTER? AOJA C,SKAN1 ;YES, COUNT IT CAIN CH,(TT) ;PRIMARY CHAR? JRST SKAN10 ;YES! SKAN1: CHKEO EO21,SKAN0 ;OLD STYLE SKAN IF EO = 1 MOVEI T,SKNTAB ;NO, WATCH OUT FOR TEXT STRINGS SKAN00: PUSHJ P,DISPAT JRST SKAN0 ;NOT A TEXT-ARG COMMAND, IGNORE IT SKAN2: PUSHJ P,SKRCH2 ;GET CHAR AFTER "^" CAIE CH,"A"+" " ;COULD BE LOWER CASE CAIN CH,"A" JRST SKAN7 ;^A COMMAND CAIN CH,"^" JRST SKAN11 ;^^ COMMAND JRST SKAN0 ;ORDINARY CTRL-COMMAND, FORGET IT SKAN3: PUSHJ P,SKRCH2 MOVEI T,SK3TAB ;WHICH E COMMAND? JRST SKAN00 SKAN4: PUSHJ P,SKRCH2 ;WHAT FOLLOWS @? MOVEI T,SK4TAB PUSHJ P,DISPAT JRST SKAN4 ;MUST BE 1 OF THESE 4 SKAN09: TXZ F2,S.SFSN ;FOR FD CASE JRST SKAN12 SKAN9: PUSHJ P,SKIM ;IGNORE TO $ JRST SKAN0 SKAN7: MOVEI T,1 ;IGNORE TO ^A JRST SKAN5 SKAN8: MOVEI T,"!" ;IGNORE TO ! SKAN5: PUSHJ P,SKIM1 ;IGNORE TO CHAR IN T JRST SKAN0 SKAN66: TXZ F2,S.SFSN ;FOR @FD CASE SKAN6: PUSHJ P,SKRCH2 ;GET SEARCH DELIMITER SKIPA T,CH ;IGNORE TO NEXT OCCURRENCE SKAN12: MOVEI T,.CHESC ;DELIMITER IS ALTMODE PUSHJ P,SKIMRQ ;SKIP TO DELIMITER & WATCH OUT FOR ^Q,^R JRST SKAN0 SKAN13: PUSHJ P,SKRCH2 ;GET INSERT DELIMITER SKIPA T,CH ;IGNORE TO NEXT OCCURRENCE SKAN14: MOVEI T,.CHESC ;DELIMITER IS ALTMODE PUSHJ P,SKIM.R ;SKIP TO DELIMITER & WATCH OUT FOR ^R JRST SKAN0 SKAN11: PUSHJ P,SKRCH2 ;IGNORE NEXT CHAR. JRST SKAN0 SKAN16: MOVEI T,SK5TAB ;TABLE FOR @F JRST SKAN17 SKAN15: MOVEI T,SK1TAB ;TABLE FOR F COMMANDS SKAN17: TXO F2,S.SFSN ;SIGNAL FS OR FN IN PROGRESS PUSHJ P,SKRCH2 ;GET CHAR AFTER F JRST SKAN00 SKAN18: PUSHJ P,SKRCH2 ;CHECK FOR POSSIBLE "PW" CAIE CH,"W" CAIN CH,"W"+" " JRST SKAN0 ;IT IS...FORGET IT JRST SKAN01 ;IT'S NOT...WE MUST CHECK THIS CHAR FURTHER SKAN10: SOJGE C,SKAN0 ;IF MATCH JUST ENDS A PAIR, LOOP BACK TXZ F2,S.NTRC ;ENABLE TRACING JRST CPOPJ1 ;OTHERWISE, WE HAVE WHAT WE WANT ;SKIM OVER TEXT ;ENTER AT SKIM TO SKIP TO NEXT ALTMODE, GIVING ^R & ^Q NO SPECIAL TREATMENT ;ENTER AT SKIM1 TO SKIP OVER ARBITRARY CHAR IN T, GIVING ^R & ^Q NO SPECIAL TREATMENT ;ENTER AT SKIM.R TO SKIP TO ARBITRARY CHAR IN T, UNLESS IT IS AFTER ^R ;ENTER AT SKIMRQ TO SKIP TO ARBITRARY CHAR IN T, UNLESS IT IS AFTER EITHER ^R OR ^Q SKIMRQ: TXO F2,S.SKMQ ;CK FOR ^Q AND ^R SKIM.R: TXOA F2,S.SKMR ;CK FOR ^R SKIM: MOVEI T,.CHESC ;SKIP TO NEXT ALTMODE SKIM1: PUSHJ P,SKRCH ;GET NEXT TEXT CHAR. JRST APOPJ ;ERROR RETURN FROM SKAN ROUTINE CAIN CH,(T) ;CHARACTER WE WANT? JRST SKIM3 ;YES CAIN CH,.CHCNQ ;^Q? TXNN F2,S.SKMQ ;YES, CK FLAG ON? JRST .+2 ;NO JRST SKIM2 ;YES CAIN CH,.CHCNR ;^R? TXNN F2,S.SKMR ;YES, CK FLAG ON? JRST SKIM1 ;NO, KEEP LOOKING SKIM2: PUSHJ P,SKRCH ;GOBBLE UP NEXT CHARACTER JRST APOPJ ;ERROR RETURN FROM SKAN JRST SKIM1 ;CONTINUE SKIMMING SKIM3: TXZE F2,S.SFSN ;SKIMMING OVER FS OR FN? JRST SKIM1 ;YES, IGNORE 1ST DELIMITER POPJ P, ;GET A SINGLE CHARACTER FROM COMMAND STRING ;TAKE ERROR RETURN FROM SKAN IF THERE ARE NO MORE SKRCH2: PUSHJ P,SKRCH ;GET A COMMAND CHAR. APOPJ: POP P,A ;ERROR RETURN FROM SKAN IF NO MORE CHARS. POPJ P, SUBTTL SKAN ROUTINE DISPATCH TABLES SKNTAB: XWD SKAN15,"F" XWD SKAN14,"I" XWD SKAN14,.CHTAB ;TAB XWD SKAN12,"_" XWD SKAN9,"O" XWD SKAN8,"!" XWD SKAN7,.CHCNA ;^A XWD SKAN11,.CHCCF ;^^ XWD SKAN2,"^" XWD SKAN3,"E" XWD SKAN11,"U" XWD SKAN11,"Q" XWD SKAN11,"X" XWD SKAN11,"G" XWD SKAN11,"W" XWD SKAN11,"M" XWD SKAN11,"%" XWD SKAN11,"[" XWD SKAN11,"]" XWD SKAN4,"@" XWD SKAN11,"""" ;" XWD SKAN12,"S" XWD SKAN12,"N" XWD SKAN18,"P" XWD 0,0 SK1TAB: XWD SKAN12,"S" ;S OR FS XWD SKAN12,"N" ;N OR FN XWD SKAN09,"D" XWD 0,0 ;LIST TERMINATOR SK3TAB: XWD SKAN9,"I" XWD SKAN9,"P" XWD SKAN9,"B" ;EB XWD SKAN9,"R" ;ER XWD SKAN9,"W" ;EW XWD SKAN9,"Z" ;EZ XWD SKAN9,"D" XWD SKAN9,"L" XWD SKAN9,"E" XWD SKAN9,"N" XWD SKAN9,"A" XWD SKAN9,"V" XWD 0,0 SK4TAB: XWD SKAN16,"F" ;@F XWD SKAN13,"I" ;@I XWD SKAN6,"_" ;@_ XWD SKAN6,"S" ;@S XWD SKAN6,"N" ;@N XWD 0,0 SK5TAB: XWD SKAN6,"S" ;@FS XWD SKAN6,"N" ;@FN XWD SKAN66,"D" ;@FD XWD 0,0 SUBTTL ACCEPT COMMAND STRING ROUTINE CLIS1: PUSHJ P,CRR ;TYPE CRLF CLIS: IFN CCL,< SKIPN CCLSW ;NEED CCL COMMAND? JRST LIS0 ;NO PUSHJ P,CCLIN ;GET THE CCL COMMAND TO TYI BUFFER JRST LIS02 ;AND DONT SAY STAR > LIS0: AOS INI ;ALLOW ^G^G *I$ ON FIRST COMMAND PUSHJ P,TTOPEN ;GET TELETYPE TXNE FF,F.EMSG ;1ST CHARACTER IN ALREADY? JRST LIS01 ;YES MOVEI CH,"*" TXZ F2,S.LCTT ;CLR TTY LC BIT SETO A, ;GETLCH ON THIS LINE GETLCH A TXNE A,GL.LCM ;TTY LC ON? TXO F2,S.LCTT ;YES, SET TTY LC BIT TXNN F2,S.LIN ;WANT OUTPUT? TXO F2,S.SLOG ;SUPPRESS * IN LOG FILE TXZ FF,F.CCL ;NOT THIS AGAIN HRRZ TT1,A ;GET UNIVERSAL I/O INDEX MOVEI TT,.TOALT ;CODE FOR ALT TESTING MOVE A,[XWD 2,TT] ;SET UP FOR TRMOP TRMOP. A, ;GET ALTMODE INFO FROM MONITOR LDB A,[POINTR (F2,S.LCTT)] ;IF THIS FAILS USE LC BIT SKIPE A ;SHOULD WE CHANGE TO OLD ALTMODES? TXOA F2,S.NALT ;DON'T CONVERT TXZ F2,S.NALT ;DO CONVERT IFN CRT,< MOVX TT,.TOWID ;GET WIDTH OF TTY MOVE A,[XWD 2,TT] ;USING A TRMOP. TRMOP. A, MOVEI A,^D72 ;ASSUME 72 IF NO TRMOP. MOVEM A,TTYWID ;STORE IT > PUSHJ P,TYOM ;TYPE * LIS01: TXZ F2,S.SLOG!S.ASTR ;[325] LOG FILE IS FULLY ACTIVE AGAIN TXOE FF,F.EMSG ;[325] IS ONE ALREADY IN? JRST LIS01A ;[325] YES TXO FF,F.DDTM ;[325] NO, FORCE CHARACTER MODE ON IT PUSHJ P,TYI LIS01A: CAIN CH,.CHLFD ;[325] IF 1ST CHAR IS LF, JRST IM1LT ;[325] DO A 1LT. CAIN CH,";" ;[325] IF IT'S A SEMI-COLON, JRST IM0LT ;[325] DO A 0LT. CAIN CH,.CHCNH ;[325] IF IT'S A BACKSPACE, JRST IMN1LT ;[325] DO A -1LT. CAIE CH,"*" ;1ST CHAR AN ASTERISK? JRST LIS02 ;NO, CONTINUE NORMALLY ;SAVE PREVIOUS COMMAND STRING IN NAMED Q-REGISTER TXNE F2,S.LIN ;[325] PUT THE * INTO LOG FILE? PUSHJ P,LOGOUT ;[325] YES SETZM EATCH ;NO CHARACTER READ YET TXNE F2,S.GOIN ;ANY CMD STRG SEEN YET? IF NOT, * IS ILLEGAL JRST LIS03 ;OK $NCS: PUSHJ P,CRR ;MUST PUT CR/LF BEFORE ?NCS ERROR E.NCS LIS03: MOVE C,COMLEN ;LENGTH OF STRING TXNE F2,S.NRAD ;IS IT AN FS...$$? ADDI C,1 ;YES, DON'T OMIT LAST ALTMODE ADDI C,2 ;OMIT LAST ALTMODE MOVEI B,CMDBFR ;POSITION OF FIRST CHAR. IN BYTES IFN BUGSW, IMULI B,5 PUSHJ P,X3 ;TRANSFER STRING TO Q-REG PUSHJ P,TYI ;GET Q-REG NAME FOR * COMMAND MOVEM CH,EATCH ;SAVE IN CASE ERROR TXNE F2,S.LIN ;[325] PUT IN LOG FILE? PUSHJ P,LOGOUT ;[325] YES MOVE A,TIB+.BFPTR ;GET POINTER TO CURRENT CH MOVEM A,CPTR ;STORE FOR POSSIBLE ERROR PUSHJ P,QREGV2 ;STORE 400000 IN QTAB MOVEM B,QTAB-"0"(CH) TXZ FF,F.EMSG ;NEXT INPUT CHAR NOT IN LIS02: SETZM COMCNT ;COMCNT:=0 TXZ F2,S.NRAD ;CLEAR FLAG SETZM SYMS MOVE T,[XWD SYMS,SYMS+1] BLT T,SYMEND-1 MOVE AA,CBUF MOVE B,CBUFH LI1: TXZ FF,F.ALT+F.BELL+F.XPLN+F.EM LI2: TXZ F2,S.SLOG ;THINGS MAY AGAIN ENTER LOG FILE CAILE B,(AA) ;COMMAND BUFFER EXCEEDED? JRST LI3 ;NO ;TO SEE IF TECO WILL NEED MORE CORE FOR COMMAND ;BUFFER EXPANSION. IF SO, GET IT MOVE C,Z ;GET THE NUMBER OF CHARACTERS NOW ADDI C,500 ;WILL WE OVERFLOW IF THIS IS REQUESTED? CAMGE C,MEMSIZ ;[320] WILL THIS OVERFLOW? JRST .+5 ;NO, FORGET THIS EVER HAPPENED MOVEM 17,AC2+15 ;[354] Will overflow, therefore save AC#17 MOVE 17,C ;THIS IS THE REQUEST FOR MEMORY PUSHJ P,GRABKQ ;GET THE NECESSARY CORE MOVE 17,AC2+15 ;[354] Restore AC#17 SUBTTL EXPAND THE COMMAND BUFFER ADDI B,100 ;YES. EXPAND COMMAND BUFFER 100 WORDS. MOVE C,Z IDIVI C,5 ;C:=DATA BUFFER END WORD ADDRESS. MOVE D,QRBUF PUSH P,F2 ;KLUDGE TO PROTECT F2 UNTIL AC'S ARE REORDERED IDIVI D,5 ;D:=Q-REG BUFFER BASE WORD ADDRESS. POP P,F2 ;RESTORE FLAGS SUBM C,D ;D:=NO. OF WORDS IN Q-REG BUFFER AND DATA BUFFER. MOVE CH,(C) MOVEM CH,100(C) ;MOVE Q-REG AND DATA BUFFERS UP 100 WORDS. SOS C SOJGE D,.-3 MOVEI C,500 ADDM C,BEG ;BEG:=C(BEG)+500 ADDM C,PT ;PT:=C(PT)+500 ADDM C,Z ;Z:=C(Z)+500 ADDM C,QRBUF ;QRBUF:=C(QRBUF)+500 MOVE D,Z LI3: MOVEM B,CBUFH ;NO. RESET HIGH END OF COMMAND BUFFER. TXZN FF,F.EMSG ;1ST CHAR IN ALREADY? PUSHJ P,TYI ;GET A NON-NULL CHARACTER IN CH IFN CRT, CAIN CH,.CHDEL ;RUBOUT? JRST DELCHR ;YES LI3A: TXZ F2,S.SLOG AOS A,COMCNT ;NO. INCREMENT COMMAND CHARACTER COUNT IDPB CH,AA ;STORE CHARACTER IN COMMAND BUFFER. LI4: CAIE CH,.CHESC ;ALT-MODE? JRST LI5 ;NO TXZN F2,S.CTLR ;PREVIOUS CHAR. A ^R? JRST LI7 ;NO CHKEO EO21,LI7 ;IF EO=1, NEVERMIND ^R LI9: TXZ FF,F.BELL ;ALTMODE CLEARS BELL FLAG JRST LI2 LI7: TXON FF,F.ALT ;YES. SET ALT-MODE FLAG. WAS IT ON? JRST LI9 ;NO MOVEM A,COMAX ;SET COMMAND CHARACTER ADDRESS UPPER BOUND MOVEM A,COMLEN ;SAVE IN CASE OF * COMMAND NEXT MOVE AA,CBUF ;INIT COMMAND BYTE PTR MOVE B,AA ;IN CASE INTO LOG FILE MOVEM AA,CPTR SKIPE CCLSW ;READING CCL CMD? PUSHJ P,TTOPEN ;YES, INIT TTY TXNE F2,S.LIN ;PUT YOUR TYPIN IN LOG FILE? PUSHJ P,BUFTYP TXNN F2,S.LIN ;INPUT TO FILE TOO? TXO F2,S.SLOG ;NO, SO DON'T PUT THIS CRLF THERE PUSHJ P,CRR ;TYPE CRLF TXZ F2,S.SLOG SETZM CCLSW ;FINISHED WITH CCL READ SETOM XCTING ;SET NO SCREW I FLAG JRST CD ;RIGHT, SO DECODE COMMAND BUFTYP: MOVE A,COMCNT ;HOW MANY CHARACTERS TO TRANSFER BUFTY0: TXNE F2,S.LOUT ;[325] TXO F2,S.OLOG LOGLP: ILDB CH,B ;GET CHARACTER TXNN F2,S.LOUT ;SENDING OUTPUT TOO? PUSHJ P,LOGOUT ;NO, SEND VEBATIM TXNE F2,S.LOUT PUSHJ P,TYOM ;SEND TO LOG FILE SOJG A,LOGLP ;EMPTY BUFFER TXO F2,S.OLOG ;ONLY IN LOG FILE IF ANYWHERE TXNN F2,S.LOUT PUSHJ P,CRR TXZ F2,S.OLOG ;SO TYPE OUT HAPPENS CORRECTLY POPJ P, SUBTTL PROCESS SPECIAL COMMAND EDITING CHARACTERS LI5: CAIN CH,.CHCNR ;^R? JRST CNTRLR ;YES TXZ F2,S.CTLR ;NO, CLR FLAG IN CASE PRECEDING CHAR WAS TXO F2,S.SLOG ;DON'T TYPE ANYTHING INTO LOG FILE HERE CAIN CH,.CHCNU ;^U? JRST CNTRLU ;YES CAIN CH,.CHBEL ;BELL? JRST LI6 ;YES TXZN FF,F.BELL ;NO, PREVIOUS CHAR A BELL? JRST LI1 ;NO, GET NEXT CHARACTER CAIN CH,"." ;IS THIS A PERIOD? JRST [MOVE D,COMCNT SUBI D,2 SETZM COMCNT MOVE AA,CBUF ILDB CH,AA SKIPN D PUSHJ P,BACKUP PUSHJ P,RETYP3 JRST LI2] ;RETYPE ENTIRE COMMAND CAIE CH," " ;YES, IS THIS A SPACE? JRST LI1 ;NO PUSHJ P,RETYPE ;YES, GO DO A RETYPE JRST LI2 RETYPE: PUSHJ P,BACKUP ;BACK OFF ^G SOS D,COMCNT ;MARK CURRENT POSITION PUSHJ P,BACKLN ;BACK UP TO BEG OF LINE JRST RETYP3 ;HIT BEG OF COMMAND STRING JRST RETY3A ;[331] Found a CR-EOL RETYP3: PUSH P,CH ;SAVE 1ST CHAR PUSHJ P,CRR ;TYPE CR-LF BEFORE COMMAND LINE MOVEI CH,"*" ;RETYPE THE * PUSHJ P,TYOM POP P,CH ;RETRIEVE 1ST CHARACTER RETY3A: PUSH P,ETVAL ;[331] Save ET value SETZM ETVAL ;[331] ET=0 for retyping JUMPE CH,RETYP4 ;DON'T PRINT ^@ IF NULL COMMAND STRING RETYP1: SKIPL COMCNT ;SEE IF ANY COMMANDS PUSHJ P,TYOM ;TYPE A CHAR OF COMMAND LINE RETYP4: AOS C,COMCNT ;ADVANCE COMMAND CTR CAIL C,(D) ;BACK IN PLACE? JRST RETYP2 ;YES ILDB CH,AA ;NO, GET NEXT CHAR JRST RETYP1 RETYP2: POP P,ETVAL ;[331] Restore ET value CAIN CH,.CHESC ;LOOKING AT AN ALTMODE? TXO FF,F.ALT ;YES, BETTER SET FLAG POPJ P, ;RETURN LI6: TXOE FF,F.BELL ;YES. SET BELL FLAG. TWO SUCCESSIVE BELLS? SOJA A,LI8 ;YES, REJECT COMMAND TXO FF,F.DDTM ;GET ANOTHER CHAR WITH TTCALL 0 JRST LI2 LI8: MOVEM A,COMLEN PUSHJ P,CRR ;YES. TYPE A CRLF TXO F2,S.GOIN!S.ASTR ;SO YOU CAN DO *I AFTER ^G^G JRST GO ;AND CLEAR COMMAND BUFFER. SUBTTL BACK UP BYTE POINTER IN AA, LOAD APPROPRIATE CHARACTER IN CH, ;AND ADJUST COMCNT BACKUP: ADD AA,[7B5] ;BACK UP CHAR PTR JUMPG AA,.+2 ;OK NOW? SUB AA,[430000,,1] ;NO NEEDS FURTHER FIXING LDB CH,AA ;LOAD CHAR SOS C,COMCNT ;DECREMENT COMMAND COUNT POPJ P, ;BACKUP TO BEGINNING OF CURRENT LINE ;CALL: PUSHJ P,BACKLN ; RETURN IF BACKUP WENT TO BEGINNING OF COMMAND STRING ; RETURN IF CR-EOL COMBINATION FOUND BACKLN: PUSHJ P,BACKUP ;BACK UP ONE CHAR JUMPLE C,CPOPJ ;RETURN IF NOTHING LEFT BACKL1: PUSHJ P,CKEOL ;IS THIS AN EOL CHAR? JRST BACKLN ;NO, KEEP BACKING UP PUSHJ P,BACKUP ;YES, BACK UP ONE MORE CAIE CH,.CHCRT ;IS THIS A CR? JRST BACKL1 ;NO, MAYBE ANOTHER EOL? JRST CPOPJ1 ;YES, TAKE SKIP RETURN ;PROCESS CONTROL-U CNTRLU: PUSHJ P,TYOM ;ECHO THE ^U PUSHJ P,BACKLN ;BACK UP TO BEG OF LINE JUMPLE C,CTLU1 ;IF NOTHING LEFT, RETYPE * AOS COMCNT ;KEEP CRLF IBP AA CTLU1: IFN CRT, PUSHJ P,CRR ;OUTPUT A REGULAR CRLF JUMPLE C,CLIS ;IF NOTHING LEFT, START FROM SCRATCH JRST LI1 ;CONTINUE TYPE-IN ;CONTROL-R IN COMMAND MODE PREVENTS AN ALTMODE AFTER IT ;FROM BEING A TERMINATOR CNTRLR: TXZN F2,S.CTLR ;^R ON ALREADY? TXO F2,S.CTLR ;NO, SET FLAG JRST LI1 SUBTTL SPECIAL "IMMEDIATE" COMMAND PROCESSOR ;[325] HERE TO MAKE AN INITIAL DO A "1LT$$" IM1LT: TXO F2,S.SLOG ;TURN OFF LOG FILE BRIEFLY MOVEI CH,.CHCRT ;[331] Type a to get to left margin PUSHJ P,TYOA ;[331] IFN CRT,< SKIPE CRTTYP ;DO WE HAVE A SCREEN, SKIPN DELLF ;AND A WAY OF GOING UP? JRST IM1LTA ;NO MOVEI A,DELLF ;WE ARE ON A CRT, PUSHJ P,OUTIMG ;[331] CANCEL THE SO WE DON'T WASTE SPACE MOVEI A,BACSEQ ;NOW GET RID OF THE "*" IN CASE OF BLANK LINE PUSHJ P,OUTMES ;... > ;END OF CRT IM1LTA: HRRI B,[BYTE (7) "+","L","T",.CHESC,.CHESC] ;LOG FILE COMMAND JRST IMCOM ;GO TO THE COMMON CODE ;HERE TO MAKE A <^H> DO A "-LT$$" IMN1LT: HRRI B,[BYTE (7) "-","L","T",.CHESC,.CHESC] ;[331] COMMAND FOR LOG FILE TXOA FF,F.NEG ;[331] FAKE A -1 ARG ;AND FALL INTO IM0LT FOR A WHILE... ;HERE TO MAKE A <;> DO A "0LT$$" IM0LT: TXZ FF,F.NEG ;[331] MAKE SURE F.NEG IS OFF TXO F2,S.SLOG ;TURN OFF LOG FILE IFN CRT,< SKIPE CRTTYP ;[331] ARE WE ON A SCREEN? JRST [SKIPE CTUSEQ ;[331] YES, DO WE HAVE A LINE DELETE MECHANISM? JRST [MOVEI A,CTUSEQ ;[331] YES, WE MUST BE ON A SCREEN PUSHJ P,OUTMES ;[331] DELETE THE LINE JRST IM0LT1] ;[331] GET BACK IN LINE ;[331] NO EOL, SO WE DO IT WITH BACKSPACE TXNE FF,F.NEG ;[331] WAS THIS A ;? JRST [PUSHJ P,BACONE ;[331] YES, SO BLANK OUT THE * JRST IM0LT1] ;[331] AND JUMP BACK IN LINE MOVEI A,BACCHR ;[331] IT WAS A ; SO BACK OVER IT PUSHJ P,OUTMES ;[331] PUSHJ P,BACTWO ;[331] AND BLANK OUT THE *; JRST IM0LT1] ;[331] NOW PROCEED > ;END OF CRT PUSHJ P,CRR ;NOT A SCREEN--DO A CRLF IM0LT1: TXNE FF,F.NEG ;HAVE WE ALREADY FAKED A -1 ARG? JRST IMCOM ;YES, SKIP AHEAD TO COMMON CODE TXO FF,F.ARG ;FAKE THE PRESENCE OF A 0 ARG. HRRI B,[BYTE (7) "0","L","T",.CHESC,.CHESC] ;COMMAND FOR LOG FILE ;FALL INTO COMMON CODE IMCOM: HRLI B,(POINT 7,) ;FORM POINTER FOR LOG FILE COMMAND MOVEI A,5 ;FIVE CHARACTERS MOVEM A,COMLEN ;SAVE IN CASE OF * COMMAND MOVE AA,CBUF ;GET START OF COMMAND BUFFER POP B,1(AA) ;STORE COMMAND THERE AOBJP B,.+1 ;READJUST B TXZ F2,S.SLOG ;TURN LOG FILE BACK ON TXNN F2,S.LIN ;TO PUT IT INTO LOG FILE? JRST IMCOM1 ;NO, SKIP THIS PUSH P,F2 ;SAVE FLAGS TXZ F2,S.LOUT ;PRETEND /NOOUT SO CRLF GETS PUT IN PUSHJ P,BUFTY0 ;GO INSERT COMMAND IN LOG FILE POP P,F2 ;RESTORE FLAGS IMCOM1: SETZM B ;PUT ZERO INTO B IN CASE WE'RE DOING "0LT" PUSHJ P,GETARG ;COMPUTE +L/0L/-L XOR B,C ;APPLY L MOVEMENT TO POINTER XORM B,PT ;... TXZ FF,F.ARG!F.ARG2 ;FAKE NO ARGS PUSHJ P,TYPE ;GO TYPE THE LINE JRST GO SUBTTL RUBOUT PROCESSOR IFE CRT,< DELCHR: > RUBOUT: TXO F2,S.SLOG SKIPG COMCNT ;ANYTHING TYPED IN? JRST CLIS1 ;NO, RETYPE * IFN RUBSW,< SETO A, ;GETLCH ON THIS TTY GETLCH A ;SET TO SUPPRESS ECHOING TLO A,4 SETLCH A PUSHJ P,SPLAT ;ACT LIKE THE MONITOR JRST RUB4 RUB1: SKIPGE COMCNT ;PAST BEGINNING OF COMMAND STRING YET? JRST RUB3 ;YES PUSHJ P,TYIDDT ;GET ONE CHARACTER CAIE CH,.CHDEL ;RUBOUT? JRST RUB2 ;NO RUB4: > LDB CH,AA ;RELOAD THE CHAR. SKIPE COMCNT ;UNLESS AT BEGINNING OF COMMAND STRING, PUSHJ P,TYOM ;ECHO THE DELETED CHAR. PUSHJ P,BACKUP ;BACK OVER THE CHAR. IFN RUBSW, IFE RUBSW, CAIN CH,"R"-100 ;IF PREVIOUS CHARACTER WAS ^R TXO F2,S.CTLR ;RESET FLAG IFE RUBSW, ;RESUME TYPE-IN IFN RUBSW,< JRST RUB1 ;TRY NEXT INPUT CHAR. RUB2: PUSH P,CH ;SAVE THIS GOOD GUY PUSHJ P,SPLAT ;TYPE THE SECOND \ POP P,CH ;GET THAT CHAR. BACK CAIE CH,.CHCNU ;CTRL-U? PUSHJ P,TYOM ;NO, ECHO IT PUSHJ P,TTCREE ;RESET TTCALL FOR ECHOING JRST LI3A ;PROCESS THIS CHAR. RUB3: PUSHJ P,SPLAT ;SECOND \ PUSHJ P,TTCREE ;RESET TTCALL MODE TO NORMAL JRST CLIS1 ;START A NEW COMMAND STRING > ;TYPE BACKSLASH IFN RUBSW,< SPLAT: MOVEI CH,"\" JRST TYOM > ;RESET TTCALL FOR ECHOING IFN RUBSW,< TTCREE: SETO A, ;GETLCH ON THIS TTY GETLCH A TLZ A,GL.LCP ;TURN OFF NO ECHO BIT SETLCH A POPJ P, > SUBTTL VIDEO RUBOUT PROCESSOR IFN CRT,< DELCHR: MOVE A,CRTTYP ;GET CRT FLAGS CAIN CH,.CHDEL ;IF ITS A DELETE, TRNN A,.CRUB. ;AND IT GETS NORMAL TREATMENT SKIPN CRTTYP ;OR CRTTYP IS 0 JRST RUBOUT ;THEN GO TO OLD ROUTINE TXO F2,S.SLOG ;NOTHING GOES INTO LOG FILE MOVEI A,CANRUB ;CANCEL THE EFFECT, IF ANY, OF THE RUBOUT CAIE CH,.CHDEL MOVEI A,CANBAK ;OR THE BACKSPACE PUSHJ P,OUTMES SKIPG COMCNT ;HAS ANYTHING BEEN SEEN? JRST BACNON ;NO PUSHJ P,HORPOS ;GO FIGURE OUT HORIZONTAL POSITION LDB CH,AA ;GET DOOMED CHARACTER CAIG CH,.CHBEL ;^G OR LESS? JRST BACDUB ;YES, THEY ARE TWO WIDE CAIN CH,.CHCNH ;BACKSPACE? JRST BACBAK CAIN CH,.CHTAB ;TAB? JRST BACTAB CAIG CH,.CHFFD ;EOL? (LF, VT, FF) JRST BACEOL CAIN CH,.CHCRT ;CARRIAGE RETURN? JRST BACCR CAIE CH,.CHESC ;ALTMODE, CAIL CH," " ;BLANK OR GREATER? JRST BACNOR BACDUB: PUSHJ P,BACTWO ;HERE TO RUBOUT A CHAR OF WIDTH 2 TRNA ;[331] BACNOR: PUSHJ P,BACONE DELDON: PUSHJ P,BACKUP ;WIPE IT FROM COMMAND STRING CAIL E,(OU) ;ARE WE BACK TO A FREE CRLF? JRST LI1 ;NO, RETURN DELFIN: PUSHJ P,HORPOS ;YES, GO RECALCULATE LENGTH PUSHJ P,BACREW ;AND RETYPE ABOVE LINE JRST LI1 ;AND RETURN BACEOL: MOVEI T,1 ;GET MULTIPLIER (LF=1) CAIE CH,.CHLFD ;IF NOT LF, MOVE T,VTMUL-13(CH) ;GET REAL MULTIPLIER MOVEI TT,DELLF-12(CH) ;GET PROPER STRING MOVEI A,FORCHR ;GET READY TO UNDO THE BACKSPACE MOVE CH,CRTTYP ;GET THE FLAGS FOR THIS CRT TRNE CH,.CWAP. ;IF THIS CRT DOES WRAP AROUND, SKIPE E ;OR IF WE ARE NOT AT THE LEFT MARGIN PUSHJ P,OUTMES ;THEN CANCEL THE BACKSPACE EOL1: JUMPLE T,DELDON ;FINISHED? MOVE A,TT ;GET STRING PUSHJ P,OUTIMG ;[331] AND TYPE IT SOJA T,EOL1 ;LOOP BACCR: MOVEI A,DELCR PUSHJ P,OUTIMG ;[331] IBP AA AOS COMCNT PUSHJ P,RETYPE ;FAKE A ^G JRST LI2 ;WE'RE DONE BACBAK: MOVEI A,FORCHR ;CANCEL A BACKSPACE PUSHJ P,OUTMES PUSHJ P,BACKUP JRST LI1 BACNON: MOVE CH,CRTTYP ;GET FLAGS TRNE CH,.CNCR. ;SHOULD WE SEND A LONE CR? JRST CLIS ;NOPE MOVEI CH,.CHCRT ;TYPE A CR PUSHJ P,TYOA JRST CLIS ;AND RETYPE * HORPOS: MOVE TT1,COMCNT ;SAVE CURRENT CHARACTER COUNT SETZ E, ;INIT LINE WIDTH TO 0 LDB CH,AA ;GET CURRENT CHAR PUSHJ P,BACKL1 ;BACK UP TO THE BEGINNING OF CURRENT LINE AOS E ;IF INITIAL LINE, THEN ACCOUNT FOR * MOVE T,AA ;SAVE POINTER MOVE TT,COMCNT ;AND COMMAND COUNT IBP T ;BUMP THE POINTER UP, TO PLEASE RETYPE POS2: MOVE OU,E ;SAVE LENGTH ILDB CH,AA ;GET NEXT CHAR PUSHJ P,LENCHR ;CALCULATE LENGTH OF CHARACTER AOS D,COMCNT ;BUMP CHAR COUNT CAIL D,(TT1) ;ARE WE BACK IN PLACE YET? POPJ P, ;YES JRST POS2 BACTAB: PUSHJ P,BACKUP ;GET RID OF THE TAB CAIGE E,(OU) ;ARE WE AT A FREE CRLF? JRST DELFIN ;YES SUBI E,1(OU) ;GET LENGTH OF TAB-1 BTAB1: JUMPLE E,LI1 ;RETURN IF LENGTH IS 0 MOVEI A,BACCHR ;BACK UP PUSHJ P,OUTMES SOJA E,BTAB1 ;LOOP BACREW: MOVEM T,AA ;HERE WHEN WE BACK UP OVER A FREE CRLF MOVEM TT,COMCNT ;RESTORE AA AND COMCNT (LAST TIME POS=0) SKIPN DELLF ;IF DELLF IS NULL, DONT BOTHER WITH THIS JRST BACRW0 MOVEI A,DELLF PUSHJ P,OUTIMG ;MOVE UP TWO LINES PUSHJ P,OUTIMG PUSHJ P,CRR ;TYPE A CRLF TO RESET HOR. POS. BACRW0: MOVEI CH,"*" ;ARE WE AT THE BEGINING OF A COMMAND? SKIPN COMCNT PUSHJ P,TYOA ;YES BACRW1: LDB CH,AA PUSHJ P,CKEOL ;WE DONT WANT EOL'S PJRST RETY3A ;[331] GO FAKE ^G IBP AA ;GET THE NEXT ONE AOS COMCNT JRST BACRW1 ;LOOP BACONE: MOVEI A,BACSEQ ;TO BACK OVER AND BLANK OUT A CHARACTER PJRST OUTMES BACTWO: PUSHJ P,BACONE ;HERE TO DELETE A DOUBLE CHAR MOVEI A,BACCHR PUSHJ P,OUTMES PJRST BACONE ;[331] ONCE AGAIN ;ROUTINE TO CALCULATE THE WIDTH OF A CHARACTER LENCHR: SETZ D, CAIE CH,.CHESC ;AN ALTMODE CAIL CH," " ;OR ANYTHING " " OR OVER AOJA D,LEN1 ;IS OF WIDTH 1 CAIN CH,.CHCNH ;A BACKSPACE IS -1 SOJA D,LEN2 CAIN CH,.CHLFD ;A LINEFEED IS 0 JRST LEN1 CAIN CH,.CHVTB ;A VERTICAL TAB MAY BE SPECIAL JRST [ADD D,VTWID JRST LEN1] CAIN CH,.CHFFD ;A FORM FEED MIGHT ALSO JRST [ADD D,FFWID JRST LEN1] CAIE CH,.CHTAB ;A TAB? JRST [ADDI D,2 ;NOPE, ALL ELSE OF WIDTH 2 JRST LEN1] ADDI E,10 ;STANDARD TAB WIDTH TXZ E,7 ;BUT MUST BE MULTIPLE OF 8 MOVEI D,10 SKIPA LEN1: ADD E,D ;THIS IS THE NEW LENGTH LEN2: CAMG E,TTYWID POPJ P, MOVE E,D ;WE ARE AT A FREE CRLF MOVE T,AA ;SO SAVE THE BP AND THE COUNT MOVE TT,COMCNT POPJ P, > ;END OF CRT CONDITIONAL SUBTTL COMMAND DECODER STOP: MONRT. ;SIMULATE ^C AT MACRO LEVEL CD:RET: HRRZS EATCH ;FLAG NOT TO EAT AFTER : ANYTHING FAILS TXZE FF,F.COLN ;F.COLN WHATEVER? JRST FFOK ;RETURN -1, WHATEVER IT WAS IT WAS SUCCESSFUL RETRET: TXZ FF,F.EBTP!F.ARG2!F.ARG!F.LARW!F.NSRH!F.SQIN!F.SRCH TXZ F2,S.SSEQ!S.DPPN!S.OLOG!S.SLOG!S.MINS!S.DOIT!S.INFO!S.DELS SKIPE INI ;IF INI FILE IN PROGRESS, NO COMMAND SEEN TXO F2,S.GOIN ;A COMMAND STRING IS IN CD1: SETZM NUM ;NO ARGUMENT STRING SEEN SETZM SYL TXZ FF,F.NEG ;CLEAR MINUS SIGN FLAG MOVX A, ;STANDARD ARG OPERATOR IS MOVE B,SYL CD3: HLLM A,DLIM CD5: PUSHJ P,RCH CD9: SKIPN XCTING ;KEEP GOING? JRST GO ;NO STOP MOVE A,CH ;GET COMMAND CHARACTER CAIL CH,"0" ;IS IT A DIGIT? CAILE CH,"9" TRNA ;[331] No, go clear flags JRST CD91 ;[331] Yes, leave flags alone TXZ FF,F.SYL ;[331] Clear digit string bit TXZ F2,S.OCTL ;NO, CLEAR OCTAL RADIX FLAG CD91: CAIE A,140 ;[331] 140 IS ILLEGAL CAILE A,172 ;ALSO 173-177 ARE ILLEGAL MOVEI A,0 CAILE A,137 ;REDUCE LOWER CASE TO UPPER SUBI A,40 ROT A,-1 ;DIV BY 2 JUMPL A,CD92 ;ODD CHARACTER HLRZ A,DTB(A) ;GET CODE & ADDR FOR EVEN CHAR. JRST CD93 CD92: HRRZ A,DTB(A) ;GET CODE & ADDR FOR ODD CHAR. CD93: TXZ F2,S.DOIT!S.INFO!S.MINS!S.EA!S.DPPN!S.YANK ;CLEAR INI FILE FLAGS TXZ FF,F.INIT!F.FILE TRNN A,300000 ;IS IT A JRST DISPATCH WITH NO ARG PROCESSING? JRST (A) ;YES, DO IT MOVE B,NUM ;NO, TAKE CARE OF ARGUMENTS MOVE C,DLIM ;GET DLIM TLNE C,777K ;IF NO OPERATION DON'T DO IT! XCT C ;NUM:=NUM (DLIM OPERATOR) SYL MOVEM B,NUM SETZM SYL ;CLEAR OLD OPERAND MOVSI C,(MOVE B,) ;DON'T USE THE SAME OP TWICE! HLLM C,DLIM ;SO RESET DLIM MOVE C,SARG ;SAVE SECOND ARGUMENT IN C. TXZ F2,S.CTLV+S.CTVV+S.CTLW+S.CTWW+S.EMAT+S.NCCT ;[344] MOVEM P,PDLSAV TRZ A,100000 ;CLR PUSHJ DISPATCH BIT TRZE A,200000 ;JRST OR PUSHJ DISPATCH? JRST (A) PUSHJ P,(A) JRST RET SUBTTL NUMERIC INPUT, VALRET, & ALTMODE PROCESSOR ;DIGITS FORM DECIMAL INTEGERS. CDNUM: TXON FF,F.SYL ;DIGIT STRING ALREADY STARTED? SETZM SYL ;NO, INIT TO ZERO MOVEI A,12 ;RADIX 10 TXNN F2,S.OCTL ;OCTAL FLAG ON? JRST CDNUM1 ;NO MOVEI A,10 ;YES, RADIX 8 CAILE CH,"7" ;FLAG 8 OR 9 IN OCTAL STRING ERROR E.OCT CDNUM1: IMUL A,SYL ;SCALE PREVIOUS VALUE ADDI A,-60(CH) ;ADD IN NEW DIGIT ;SOME COMMANDS HAVE A NUMERIC VALUE VALRET: HRRZS EATCH ;CLEAR THE EAT FLAG MOVEM A,SYL CD7: TXO FF,F.ARG JRST CD5 ALTMOD: SKIPN COMCNT ;ANY COMMANDS LEFT? JRST ALTM2 ;NO MOVE T,CPTR ;IF NEXT COMMAND CHARACTER IS ALT-MODE, GO ILDB CH,T CAIE CH,.CHESC JRST CD ALTM1: TXNE FF,F.TRAC ;TRACING? PUSHJ P,CRR ;YES, TYPE CR/LF BEFORE * JRST GO ALTM2: SKIPN EQM ;WITHOUT A MACRO ? JRST GO ;NO JRST CD ;MACRO RETURN ;^ MEANS THAT THE NEXT CHARACTER IS A CONTROL CHARACTER. UAR: PUSHJ P,SKRCH ;GET NEXT COMMAND CHARACTER. ERROR E.MEU TRZ CH,140 ;CHANGE IT TO CONTROL CHARACTER JRST CD9 ;DISPATCH SUBTTL COMMA & PARENTHESES PROCESSOR ;IF A COMMAND TAKES TWO NUMERIC ARGUMENTS, COMMA IS USED TO SEPARATE THEM COMMA: MOVEM B,SARG ;SAVE CURRENT ARGUMENT IN SARG. TXZE FF,F.ARG ;WAS THERE A CURRENT ARGUMENT? TXOE FF,F.ARG2 ;YES. WAS THERE ALREADY A SECOND ARGUMENT? ERROR E.ARG JRST CD1 ;YES. CLEAR CURRENT ARGUMENT. ;() MAY BE USED TO OVERRIDE LEFT TO RIGHT OPERATOR SCAN FOR +,-,*,/,& AND #. OPENP: PUSH P,NUM ;PUSH CURRENT ARGUMENT. PUSH P,DLIM ;CURRENT OPERATOR PUSH P,[1] ;SET PAREN FLAG ON PDL JRST CD1 CLOSEP: POP P,T ;LAST THING ON PDL A LEFT PAREN? JUMPL T,CLOSE1 ;SOMETHING LIKE (...<...) SOJN T,CLOSE2 ;MISSING ( MOVEM B,SYL ;YES. SAVE CURRENT ARGUMENT. POP P,DLIM ;RESTORE OPERATOR POP P,NUM ;RESTORE ARGUMENT. JRST CD7 CLOSE1: ERROR E.PAR CLOSE2: ERROR E.MLP ;^O SETS FLAG FOR OCTAL RADIX INPUT OCTIN: TXO F2,S.OCTL JRST CD5 ;RETURN WITHOUT MESSING UP ARGUMENTS ;IF 'HE' CAN HAVE ^F READ THE SWITCHES I CAN HAVE N^F RETURN ;THE TTY NUMBER OF JOB N + 200000 OCTAL OR ZERO IF NONE!!!! WHERE: TRMNO. B, ;WHAT TTY HE ON JRST BEGIN ;ZERO, NOT ONE ONE MOVE A,B ;RETURN VALUE JRST VALRET ;... SUBTTL MATHEMATICAL & LOGICAL OPERATORS ;LOGICAL AND CAND: MOVSI A,(AND B,) ;DLIM = AND B,SYL JRST CD3 ;LOGICAL OR COR: MOVSI A,(OR B,) ;DLIM = OR B,SYL JRST CD3 ;ADD TAKES ONE OR TWO ARGUMENTS PLUS: MOVSI A,(ADD B,) ;DLIM = ADD B,SYL JRST CD3 ;SUBTRACT TAKES ONE OR TWO ARGUMENTS MINUS: MOVSI A,(SUB B,) ;DLIM = SUB B,SYL TXO FF,F.NEG ;SET FLAG FOR -L, -T, ETC... JRST CD3 ;MULTIPLY TAKES TWO ARGUMENTS TIMES: MOVSI A,(IMUL B,) ;DLIM = IMUL B,SYL JRST CD3 ;DIVIDE (TRUNCATES) TAKES TWO ARGUMENTS SLASH: MOVSI A,(IDIV B,) ;DLIM = IDIV B,SYL JRST CD3 SUBTTL FLAGS - EOF, FORM FEED & . H Z POSITIONS ;RETURNS THE VALUE OF THE FORM FEED FLAG FFEED: TXNE FF,F.FORM ;IS IT SET? JRST FFOK ;YES, RETURN A -1 JRST BEGIN ;NO, DO BEGIN ROUTINE ;RETURNS THE NUMERIC VALUE 0. ABEGIN: SKIPL EATCH ;TO MUNCH? JRST BEGIN ;NO, PIG! MOVEI B,.CHESC ;TECO'S ALTMODE HRRZS CH,EATCH ;GET LAST CHARACTER INPUT FROM COMMAND SAMECH: CAMN CH,B ;SAME? JRST BEGIN ;RETURN FAILURE VALUE READNT: PUSHJ P,SKRCH ;GET ANOTHER CHARACTER IF NOT ERROR E.UCS JRST SAMECH ;LOOP TIL U SEE IT BEGIN: MOVEI A,0 JRST VALRET ;^N RETURNS VALUE OF EOF FLAG EOF: TXNN FF,F.EOFI ;EOF SEEN? JRST BEGIN ;NO, RETURN 0 JRST FFOK ;YES, RETURN -1 ;AN ABBREVIATION FOR B,Z HOLE: SETZM SARG ;SET SECOND ARGUMENT TO 0. TXNE FF,F.ARG2 ;FLAG ANY ARGS BEFORE H ERROR E.ARG TXOA FF,F.ARG2 ;.=NUMBER OF CHARACTERS TO THE LEFT OF THE POINTER PNT: SKIPA A,PT ;Z=NUMBER OF CHARACTERS IN THE BUFFER END1: MOVE A,Z SUB A,BEG JRST VALRET ;RETURN LENGTH OF LAST TEXT STRING PROCESSED IFN VC,< VCMD: MOVE A,VVAL ;LENGTH OF LAST TEXT JRST VALRET > SUBTTL = & ^T COMMANDS ;N= CAUSES THE VALUE OF N TO BE TYPED OUT. PRNT: TXNN FF,F.ARG ;INSIST ON ARG BEFORE = ERROR E.NAE MOVE A,CPTR ;SNEAK A LOOK AT NEXT COMMAND CHAR. ILDB CH,A CAIE CH,"=" ;ANOTHER = SIGN? JRST PRNT9 ;NO TXO F2,S.OCTL ;YES, THAT MEANS OCTAL RADIX TYPE-OUT PUSHJ P,SKRCH ;SWALLOW THE EXTRA = TXZ F2,S.OCTL ;AT END OF MACRO PRNT9: PUSHJ P,PRNT9S ;PRINT NUMBER TXZN FF,F.ARG2 ;TWO ARGS? JRST CRR ;CRLF AND RETURN TO CALLER JUMPL C,CRR ;NEG ARG MEANS CRLF WANTED JUMPE C,CPOPJ ;NOTHING IF ZERO MOVE CH,C ;GET CHARACTER TO BE OUTPUT JRST TYO ;ELSE TYPE CHAR AND RETURN ;TYPE C(B) IN OCTAL OCTMS: TXOA F2,S.OCTL ;SET OCTAL RADIX DECMS: TXZ F2,S.OCTL ;DECIMAL RADIX PRNT9S: MOVEI A,TYO ;OUTPUT ON TTY PUSHJ P,DPT ;TYPE NUMBER ;[323] S.OCTL IS NOW CLEARED IN DPT ;[323] TXZ F2,S.OCTL ;CLR RADIX FLAG POPJ P, ;CAUSES COMMAND INTERPRETATION TO STOP UNTIL THE USER TYPES A CHARACTER ;ON THE TELETYPE AND THEN HAS THE ASCII VALUE OF THE CHARACTER TYPED IN. SPTYI: SETZM XCTING ;SO NO WAIT FOR INPUT ON ^C REE TXZE FF,F.COLN ;EXTENDED TTY OPERATIONS? JRST EXTTTY ;YES TXO FF,F.DDTM PUSHJ P,TYI ;GET A SINGLE CHAR. SETOM XCTING ;RESET FLAG, HAVE CHARACTER SKIPA A,CH SUBTTL ^H, ^F AND ^^ COMMANDS ;HAS THE VALUE OF ELAPSED TIME, IN 60THS OF A SECOND, SINCE MIDNITE. GTIME: TIMER A, JRST VALRET ;HAS THE VALUE OF THE CONSOLE DATA SWITCHES. LAT: TXZE FF,F.ARG+F.ARG2 ;EITHER OF THESE ON GO TO WHERE JRST WHERE ;... SWITCH A, JRST VALRET ;HAS THE VALUE OF THE NEXT CHARACTER IN THE COMMAND STRING. CNTRUP: PUSHJ P,SKRCH ;^^ HAS VALUE OF CHAR FOLLOWING IT ERROR E.MUU MOVE A,CH JRST VALRET SUBTTL EXTENDED ^T OPERATIONS ;TABLE FOR EXTENDED TTY OPERATIONS ;FORMAT FIRST WORD 1B ON = LEGAL TTCALL ; SECOND WORD 1B ON = SHOULD SKIP (0 RETURNED IF NOT) ; THIRD WORD 1B ON = RETURNS A VALUE ELSE NOTHING TABLE1: ^B111011111111110000000000000000000000 TABLE2: ^B001001000001100000000000000000000000 TABLE3: ^B101011100000000000000000000000000000 EXTTTY: MOVE A,C ;I LIKE TO DO IT THIS WAY!! MOVN E,B ;GET - TTCALL NUMBER SKIPLE E ;WAS IT A NEGATIVE TTCALL? JRST HACK ;YES MOVSI CH,400K ;TO DETERMINE WHAT TO DO LSH CH,(E) ;GET IT TDNN CH,TABLE1 ;LEGAL? ERROR E.ITT CAIN B, ;RESCAN FUDGE FUNCTIONS? JRST REFUDG ;YES, DO THEM TXZ FF,F.ARG2 ;SO NO TWO ARGS RETURNS MOVE E,[TTCALL 0,A] ;FOR XCT DPB B,[POINT 4,E,12] ;MAKE A TTCALL N, XCT E ;DO IT JRST NOSKP ;SEE WHAT TO DO SETOM XCTING ;RESET I AM DOING SOMETHING FLAG TDNN CH,TABLE3 ;DOES HE GET -1 OR C(A) SETO A, ;-1 JRST VALRET ;MAKE IT AVAILABLR NOSKP: SETOM XCTING ;FIX ACTIVE FLAG TDNE CH,TABLE2 ;SHOULD HAVE SKIPPED JRST BEGIN ;RETURN ZERO TDNN CH,TABLE3 ;RETURN A VALUE? JRST RET ;NO JRST VALRET ;ELSE THROW THING IN A AT HIM REFUDG: SETOM XCTING ;KEEP GOING!!!! MOVE E,[RESCAN 1] ;ASSUME GOING TO RESCAN COMMAND LINE TXZE FF,F.ARG2 ;TWO ARGS = RETURN VALUE OF CCL FLAG MOVE E,[SKIPE CCLSW] ;TEST CCL SWITCH XCT E JRST FFOK ;COMMAND THERE = -1 JRST BEGIN ;0, NOTHING THERE HACK: SETOM XCTING CAILE E,2 ;LEGAL? ERROR E.ITT SETSTS TTY,@NOECHO-1(E) JRST RET NOECHO: EXP IO.SUP!IO.FCS!.IOASC ECHO: EXP IO.FCS!.IOASC SUBTTL BACKSLASH PROCESSOR ;HAS THE VALUE OF THE NUMBER REPRESENTED BY THE DIGITS (OR MINUS SIGN) ;FOLLOWING THE POINTER IN THE BUFFER. THE SCAN TERMINATES ON ANY OTHER ;CHARACTER. THE POINTER IS MOVED OVER THE NUMBER FOUND (IF ANY). BAKSL: MOVE A,CPTR ;[323] GET THE COMMAND BYTE POINTER ILDB CH,A ;[323] SNEAK A LOOK AT NEXT CHAR. CAIN CH,"\" ;[323] IS IT ANOTHER BACKSLASH? PUSHJ P,SKRCH ;[323] YES, TRY GETTING IT FOR REAL TXZA F2,S.OCTL ;[323] NOPE, CLEAR OCTAL FLAG TXO F2,S.OCTL ;[323] SET OCTAL FLAG TXZE FF,F.ARG ;WHICH KIND OF BACKSLASH? JRST BAKSL1 ;ARG TO MEMORY MOVEI A,^D10 ;[323] ASSUME DECIMAL RADIX TXZE F2,S.OCTL ;[323] IS IT REALLY OCTAL? MOVEI A,^D8 ;[323] YES, SET IT MOVE I,PT ;MEMORY TO VALRET CAML I,Z ;CAN WE READ ANOTHER? JRST BAKSL3 ;NO PUSHJ P,GETINC ;CK FOR +,- SIGN CAIN CH,"+" JRST BAKSLA ;IGNORE + CAIE CH,"-" JRST BAKSL0 ;NO SIGN TXO FF,F.ARG ;NEGATION FLAG BAKSLA: CAML I,Z ;OVERDID IT ? JRST BAKSL3 ;YES. EXIT PUSHJ P,GETINC ;NO. GET A CHAR BAKSL0: CAIGE CH,"0"(A) ;[330] DIGIT? CAIGE CH,"0" ;DIGIT? SOJA I,BAKSL2 ;NOT A DIGIT. BACKUP AND LEAVE LOOP SUBI CH,"0" ;CONVERT TO NUMBER EXCH CH,SYL IMULI CH,(A) ;[323] ADDM CH,SYL ;[323] SYL:= RADIX*SYL+CH JRST BAKSLA ;LOOP BAKSL3: MOVE I,Z ;HERE ON OVERFLOW BAKSL2: TXZE FF,F.ARG ;MINUS SIGN SEEN? MOVNS SYL ;YES. NEGATE MOVEM I,PT ;MOVE POINTER PAST # JRST CD7 ;DONE SUBTTL nA COMMAND ;nA (WHERE n IS A NUMERIC ARGUMENT) = VALUE IN 7-BIT ASCII OF THE ;nTH CHARACTER TO THE RIGHT OF THE POINTER. 0A WILL RETURN THE ;CHARACTER TO THE LEFT OF THE POINTER, -NA WILL RETURN THE N+1st ;CHARACTER TO THE LEFT OF THE POINTER. IF .+N-1 IS NOT WITHIN ;BOUNDS, A 0 WILL BE RETURNED, EXCEPT IN THE CASE OF M,NA, IN ;WHICH CASE M IS RETURNED. ACMD: TXNE FF,F.ARG ;[346] No argument implies Append TXNE FF,F.COLN ;[346] Or is there a colon? JRST APPEND ;Yes. THIS IN AN APPEND COMMAND. SETZ CH, ;[346] Set up 0 for return value CHKEO EODEC,ACMD2 ;[346] If EO = 2, do old-style 1A TXZE FF,F.ARG2 ;[346] Was there a 2nd arg? MOVE CH,C ;[346] Yes, use it instead ACMD1: SOS I,B ;[346] Get arg-1 ADD I,PT ;[346] Add in point CAML I,BEG ;[346] Check bounds CAML I,Z ;BUFFER EMPTY OR PT=Z TRNA ;[346] Out of bounds PUSHJ P,GET ;CH:=CHARACTER TO THE RIGHT OF PT. MOVE A,CH ;RETURN CH AS VALUE. JRST VALRET ACMD2: MOVEI B,1 ;[346] IF EO < 3, make arg=1 JRST ACMD1 ;[346] SUBTTL Q-REGISTER COMMANDS -- U & Q ;NUI PUTS THE NUMERIC VALUE N IN Q-REGISTER I. ;M,NUI PUTS N INTO Q-REGISTER I AND RETURNS M. USE: TXNN FF,F.ARG ;INSIST ON ARG BEFORE U ERROR E.NAU PUSHJ P,CRANGE ;[332] Go check range of argument USEA: PUSHJ P,QREGVI ;YES. CH:=Q-REGISTER INDEX. USEA1: MOVEM B,QTAB-"0"(CH) ;STORE ARGUMENT IN SELECTED Q-REG. TXZN FF,F.ARG2 ;[332] IS THERE A SECOND ARG? JRST RET ;[332] NO, RETURN MOVE A,C ;[332] YES, RETURN IT JRST VALRET ;[332] ;QI HAS THE VALUE OF THE LATEST QUANTITY PUT INTO Q-REGISTER I. QREG: PUSHJ P,QTXTST ;GET Q-REGISTER INDEX & CHECK FOR TEXT JRST VALRET PUSHJ P,QTEXEI ;GET Q REG ADR PUSHJ P,GTQCNT ;# CHARS IN Q REG MOVE B,CPTR ;GET COMMAND POINTER ILDB CH,B ;QA= (IE TYPE TEXT IN Q REG)? CAIE CH,"=" ;... ..ERROR E.NNQ PUSHJ P,SKRCH ;EAT = ..ERROR E.NNQ MOVE OU,I ;BEG OF Q REG MOVE B,OU ;START CHARACTER ADD B,C ;END MOVEI D,TYO ;ROUTINE TO TYPE CHARS SETZM XCTING ;SO ^C^C REE WORKS PROPERLY PUSHJ P,TYPEQ ;TYPE CONTENTS OF Q-REG SETOM XCTING ;DONE TYPING JRST RET ;DONE ;ROUTINE TO RETURN Q-REGISTER INDEX IN CH AND CONTENT IN A. QREGVI: PUSHJ P,SKRCH ;CH:=NEXT COMMAND STRING CHARACTER. ERROR E.MIQ QREGV2: CAIE CH,"*" ;EI REG? JRST NOTEI MOVEI CH,"Z"-<"A"-"9"-1>+1 ;INDEX INTO QTAB POPJ P, NOTEI: CAIL CH,"A"+" "-1 ;LC LETTER? TXZ CH,40 ;MAKE UC CAIGE CH,"0" ;DIGIT? ERROR E.IQN ;BAD NAME CAIG CH,"9" POPJ P, ;YES CAIL CH,"A" ;LETTER? CAILE CH,"Z" ERROR E.IQN ;BAD NAME SUBI CH,"A"-"9"-1 ;TRANSLATE LETTERS DOWN BY NUMBER OF POPJ P, ;CHARACTERS BETWEEN 9 AND A. ONLY 36 Q-REG'S ;[332] Routine to check range of number to be stored in a Q-reg. CRANGE: TLNE B,400000 ;[332] Does arg look like a text pointer? TLNE B,377777 ;[332] (I.E. less than -377777,,0?) POPJ P, ;[332] OK, return ERROR E.AOR ;[337] Out of range SUBTTL Q-REGISTER COMMANDS -- % ;%I ADDS 1 TO THE QUANTITY IN Q-REGISTER I AND STANDS FOR THE ; NEW VALUE PCNT: PUSHJ P,QTXTST ;GET Q-REG AND CHECK FOR TEXT AOSA A,QTAB-"0"(CH) ;INCREMENT Q-REG. ..ERROR E.NNQ JRST VALRET ;RETURN NEW VALUE. QTXTST: PUSHJ P,QREGVI ;GET Q-REG INDEX MOVE A,QTAB-"0"(CH) ;GET Q-REG CONTENTS TLNE A,400000 ;DOES IT CONTAIN TEXT? TLNE A,377777 POPJ P, ;YES, NON-SKIP RETURN JRST CPOPJ1 ;ELSE CONTAINS TEXT SUBTTL Q-REGISTER COMMANDS -- X ;M,NXI COPIES A PORTION OF THE BUFFER INTO Q-REGISTER I. ; IT SETS Q-REGISTER I TO A DUPLICATE OF THE (M+1)TH ; THROUGH NTH CHARACTERS IN THE BUFFER. THE BUFFER IS UNCHANGED. ;NXI INTO Q-REGISTER I IS COPIED THE STRING OF CHARACTERS STARTING ; IMMEDIATELY TO THE RIGHT OF THE POINTER AND PROCEEDING THROUGH ; THE NTH LINE FEED. X: IFN VC, ;CLR STRING LENGTH HOLD PUSHJ P,GETARG ;C:=FIRST STRING ARGUMENT ADDRESS ;B:=SECOND STRING ARGUMENT ADDRESS. COPYEI: PUSHJ P,CHK1 ;IS SECOND ARG. ADDR. > FIRST ARG. ADDR.? EXCH B,C ;YES. SUB C,B ;[321] C:=LENGTH OF STRING MOVE A,C ;[321] A:=LENGTH OF STRING SAVED ADDI C,3 ;[321] C:=LENGTH OF STRING+3. IFN VC, ADD B,C ;B:=FIRST ARG ADDR + LENGTH OF STRING + 3 PUSHJ P,X3 ;MOVE DATA TO Q-REG BUFR TXNN FF,F.INIT ;INI FILE THING? JRST X0 ;[332] NO, MAKE QTAB ENTRY NORMALLY. MOVEM B,QTAB-"0"+ ;INTO * Q-REG POPJ P, ;AND RETURN X0: PUSHJ P,QREGVI ;[332] CH:=Q-Register index MOVEM B,QTAB-"0"(CH) ;[332] Store argument in selected Q-reg JRST RET ;[332] Return ;TRANSFER DATA TO Q-REGISTER BUFR X3: PUSH P,PT ADDM C,(P) ;(P):=PT + LENGTH OF STRING + 3. MOVE D,BEG MOVEM D,PT ;PT:=BEG PUSHJ P,NROOM ;INSERT STRING AT BEG MOVE OU,RREL ;RREL CONTAINS RELOCATION CONSTANT IF ;GARBAGE COL. OCCURRED. ADDM OU,(P) ;RELOCATE TOP OF STRING POINTER. CAML B,BEG ;[320] IF WE ARE DOING A *I, DON'T CHANGE B!! ADD B,OU ;B:=FIRST ARG ADDR + LENGTH OF STRING + 3 + RREL MOVE OU,BEG ;OU:=ADDRESS OF Q-REG BUFFER ADDM C,BEG ;BEG:=C(BEG)+LENGTH OF STRING + 3 MOVE CH,C ;FIRST CHAR OF BUFFER :=LEAST SIGNIFICANT 7 BITS PUSHJ P,PUT ;OF LENGTH OF STRING + 3 AOS OU ;SECOND CHAR = MIDDLE 7 BITS OF LENGTH ROT CH,-7 PUSHJ P,PUT ROT CH,-7 MOVE I,B ;THIRD CHAR OF BUFFER := MOST SIGNIFICANT 7 BITS ;OF LENGTH OF STRING + 3 AOS OU X1: PUSHJ P,PUT ;MOVE STRING TO Q-REG BUFFER. AOS OU CAIN C,3 JRST X2 PUSHJ P,GETINC SOJA C,X1 X2: MOVE B,PT ;QTAB ENTRY :=XWD 400000,Q-REG BUFFER ;ADDRESS RELATIVE TO C(QRBUF) SUB B,QRBUF TLO B,400000 POP P,PT ;MOVE PT PAST STRING. POPJ P, SUBTTL Q-REGISTER COMMANDS -- G ;GI THE TEXT IN Q-REGISTER I IS INSERTED INTO THE BUFFER ; AT THE CURRENT LOCATION OF THE POINTER. THE POINTER IS THEN PUT JUST ; TO THE RIGHT OF THE INSERTION. THE Q-REGISTER IS NOT CHANGED. QGET: IFN VC, ;CLR STRING LENGTH HOLD PUSHJ P,QTEXT ;INIT Q-REG ACCESS MOVE B,CH ;SAVE INDEX PUSHJ P,GTQCNT ;C:=LENGTH OF STRING PUSHJ P,NROOMC ;MOVE FROM PT THROUGH Z UP C POSITIONS MOVE OU,PT HRRZ I,QTAB-"0"(B) ADD I,QRBUF ADDI I,3 QGET1: JUMPE C,RET ;MOVE STRING INTO DATA BUFFER PUSHJ P,GETINC PUSHJ P,PUT AOS OU,PT SOJA C,QGET1 ;GET 21 BIT Q-REGISTER CHARACTER COUNT GTQCNT: PUSHJ P,GETINC ;LOW ORDER 7 BITS MOVEM CH,C PUSHJ P,GETINC ;MIDDLE 7 BITS ROT CH,7 IORM CH,C PUSHJ P,GETINC ;HIGH 7 BITS ROT CH,^D14 IORM CH,C SUBI C,3 ;LESS 3 WORDS USED TO STORE THIS COUNT POPJ P, ;INITIALIZE ACCESS OF TEXT FROM A Q-REGISTER QTEXT: PUSHJ P,QREGVI ;A=QTAB ENTRY, CH=Q-REG INDEX QTEXEI: MOVE A,QTAB-"0"(CH) TLZE A,400000 ;MAKE SURE IT CONTAINS TEXT TLZE A,377777 ..ERROR E.NTQ ;NO TEXT ADD A,QRBUF MOVE I,A ;I=Q-REG BUFFER ADDRESS POPJ P, SUBTTL Q-REGISTER COMMANDS -- M, W, [ & ] ;MI PERFORM NOW THE TEXT IN Q-REGISTER I AS A SERIES OF COMMANDS. MJRST: SKIPE EQM ;W @ CMD LEVEL = M JRST QACCES ;ELSE OK MAC: PUSHJ P,QTEXT ;INIT Q-REG ACCESS MAC1: PUSH P,COMAX ;SAVE CURRENT COMMAND STATE PUSH P,CPTR PUSH P,COMCNT PUSH P,. ;FLAG MACRO ON PDL (LARGE POS. NO.) AOSA EQM ;INCREMENT THE MACRO LEVEL QACCES: PUSHJ P,QTEXT ;INIT Q REG ACCESS FOR W COMMAND PUSHJ P,GTQCNT ;GET NUMBER OF CHARACTERS IN MACRO MOVEM C,COMCNT ;THAT MANY COMMANDS TO COUNT MOVEM C,COMAX ;AND MAX. SUBI I,1 ;ADJUST TO SUIT BTAB IDIVI I,5 MOVE OU,BTAB(OU) ;MAKE A BYTE POINTER HRR OU,I MOVEM OU,CPTR ;PUT IT IN CPTR JRST CD5 ;DON'T FLUSH ANY ARGUMENTS ;]I POPS Q-REGISTER I OFF THE Q-REGISTER PUSHDOWN LIST. ; THE Q-REGISTER PUSHDOWN LIST IS CLEARED EACH TIME $$ IS TYPED. CLOSEB: HLRZ C,PF ;GET PDL COUNT MOVEI B,"]" ;POP CAIG C,-LPF-1 ;UNDERFLOW? ERROR E.PDQ PUSHJ P,QREGVI ;[332] GET Q-REG INDEX POP PF,QTAB-"0"(CH) ;[332] POP THE Q-REG JRST RET ;[332] RETURN ;[I PUSHES Q-REGISTER I ONTO THE Q-REGISTER PUSHDOWN LIST. ;n[i EQUIVALENT TO [i FOLLOWED BY nUi. ;m,n[I EQUIVALENT TO [I FOLLOWED BY m,nUi. OPENB: TXNE FF,F.ARG ;[332] Is there an argument? PUSHJ P,CRANGE ;[332] Yes, go check the range PUSHJ P,QREGVI PUSH PF,QTAB-"0"(CH) ;[332] PUSH Q-REG TXNN FF,F.ARG ;[332] WAS THERE AN ARG? JRST RET ;[332] NO, RETURN JRST USEA1 ;[332] YES, GO STORE IT SUBTTL MISCELLANEOUS CHARACTER DISPATCHER ;CALL: MOVE CH,CHARACTER ; MOVEI T,TABLE ADDR ; PUSHJ P,DISPAT ; NOT FOUND RETURN ;ENTER AT DISP1 TO AVOID CONVERTING LC TO UC DISPAT: CAIG CH,"Z"+" " ;CONVERT LC TO UC CAIG CH,137 JRST DISP1 TXZ CH,40 DISP1: PUSH P,A ;SAVE AC A WHILE WE USE IT DISP2: MOVE A,(T) ;GET TABLE ENTRY JUMPE A,APOPJ ;END OF TABLE CAIE CH,(A) ;SAME AOJA T,DISP2 ;NOT A MATCH HLRZM A,-1(P) ;GOT IT -- PUT DISPATCH ADDR ON PDL JRST APOPJ ;RESTORE AC A & DISPATCH ;USETI ON ER'D FILE PROCESSOR ;USETI ONLY LEGAL IF NOT EB AND ER IS TRUE IUSET: JUMPLE B,USTERR ;ARG LESS THAN OR = ZERO LOSES TXNN FF,F.UBAK ;MUST NOT BE EB IN FORCE TXNN FF,F.IOPN ;BUT MUST HAVE INPUT FILE OPEN USTERR: ERROR E.UST USETI INCHN,(B) ;DO THE USETI MOVX T,BF.IOU ;MUST CLEAR ALL THE USE BITS HRRZ A,IBUF ;STARTING HERE HRRZ B,A ;ENDING HERE TOO USTILP: ANDCAM T,(A) ;CLEAR THE BIT HRRZ A,(A) ;NEXT BUFFER CAME A,B ;DONE? JRST USTILP ;LOOP FOR ALL BUFFERS SETZM IBUF+.BFCNT ;FORCE A READ (IN) STATO INCHN,IO.ERR!IO.EOF ;ANY PROBLEM ARISE? POPJ P, ;NO, RETURN TO HIM USETI INCHN,1 ;BACK TO START OF FILE ERROR E.UST SUBTTL ^G COMMAND (GETTAB OR EXIT) ;ROUTINE TO EXIT IF EO = 1 (OLD ^G) OR DO GETTAB BELDMP: CHKEO EO21,DECDMP ;OLD EXIT TXNE FF,F.ARG ;IF NO ARG THEN RETURN JOB NUMBER JRST BELDP0 ;THERE IS AN ARG... PJOB A, ;JOB NUMBER JRST VALRET ;RETURN IT BELDP0: MOVE A,B ;GET ADR OR TABLE NO. TXZN FF,F.ARG2 ;TWO ARGS? JRST BELPEK ;NOPE, DO A PEEK HRL A,C ;FORM GETTAB WORD GETTAB A, ;DO THE GETTAB SETZ A, ;RETURN ZERO ON ERROR JRST VALRET ;ELSE RETURN WHATEVER BELPEK: PEEK A, ;WILL IT WORK? JRST VALRET ;WE'LL NEVER KNOW... SUBTTL E COMMANDS -- DISPATCH ROUTINE & TABLE ECMD: PUSHJ P,SKRCH ;GET CHAR AFTER E ERROR E.MEE CAIG CH,"Z"+" " ;LOWER CASE GOES TO UPPER CAIGE CH,"A"+" " ;... CAIA SUBI CH," " ;TO UPPER CASE HRREI TT,-"A"(CH) ;CONVERT TO TABLE OFFSET SKIPL TT ;NEG IS ERROR CAILE TT,"Z"-"A" ;IS BOUNDS E$$IEC: ERROR E.IEC LSHC TT,-1 ;CALCULATE TABLE WORD & HALF MOVE TT,ECTABL(TT) ;GET ADRS OF PROCESSORS SKIPL TT1 ;HAVE IT MOVSS TT ;NO, NEED OTHER HALF JRST (TT) ;GO ;E-COMMAND DISPATCH TABLE ECTABL: XWD OPNWRA,EBAKUP ;EA,EB XWD ECORE,RUNFX ;EC,ED XWD EECMD,CLOSEF ;EE,EF IFN CCL, XWD E$$IEC,ERRSET XWD EICMD,E$$IEC ;EI, XWD EKILL,MAKLOG ;EK,EL XWD EMTAPE,RENAM ;EM,EN XWD OLDMOD,EPCMD ;EO,EP XWD E$$IEC,OPNRD ;,ER XWD AUTOTY,TYOCTL ;ES,ET XWD TYCASE,VIDEO ;EU,EV XWD OPNWR,FINISH ;EW,EX XWD YANK,ZERDIR ;EY,EZ SUBTTL E COMMANDS -- EL (SETUP AND OUTPUT ROUTINES) LOGOUT: TXZN F2,S.ASTR TXNE F2,S.SLOG ;SKIP LOG FILE? POPJ P, ;RIGHT SOSG OLOG+.BFCNT ;DECREMENT BUFFER COUNTER OUTPUT LOGCHN, ;DUMP BUFFER IF NO ROOM IDPB CH,OLOG+.BFPTR ;PUT CHARACTER TXNE F2,S.OLOG ;MISUSING TYOM? POP P,CH ;YES, FORCE NICE RETURN POPJ P, ;AND RETURN MAKLOG: TXNE FF,F.ARG ;ARGUMENT? JRST CHANGL ;YES, CHANGE OUTPUT SPECIFICATION TXNE F2,S.LOPN ;DO WE HAVE AN OPEN LOG FILE? RENAME LOGCHN,LOGFL ;FINAL RENAME FOR PROTECTION JFCL ;"IMPOSSIBLE ERROR" SETZM LOGOPN+.OPMOD ;ASCII MODE FOR LOG FILE TXZ F2,S.LIN!S.LOUT!S.LOPN!S.OLOG PUSHJ P,DSPEC ;GET FILE SPEC AND DEFAULT MOVSI E,OLOG ;BUFFER HEADER MOVEM E,LOGOPN+.OPBUF ;SAVE MOVEI B,"L" ;TO MAKE CORRECT ERROR MESSAGE TYPE OPEN LOGCHN,LOGOPN ;OPEN DEVICE ..ERROR E.ODV MOVEI E,LOGCHN ;MUST BE A DSK!! DEVTYP E, ;WELL? JRST ERRILD TXNE E,77 ;DSK? JRST ERRILD SKIPN A,XFILNM+.RBEXT ;SPECIFY AN EXT? MOVSI A,'LOG' ;THIS IS DEFAULT MOVEM A,XFILNM+.RBEXT ;SAVE IT MOVE B,SWITC ;GET SWITCHES TLNN B,FS.APP ;TO SUPERSEDE OLD FILE? JRST ENTLOG ;YES MOVEI E,LOGCHN ;SET UP FOR CHKDEF LOOKUP LOGCHN,XFILNM ;SEE FILE SKIPA ;NOT THERE PUSHJ P,CHKPTH ;SEE IF FOUND ON SPECIFIED DIRECTORY ENTLOG: SETZM LOGOPN+1 ;NOPE ENT02: SKIPN LOGOPN+1 ;TO APPEND? CLOSE LOGCHN, ;NO, CLOSE FILE PUSHJ P,PPNSPC ;SET UP PPN IN CASE WIPED ENTER LOGCHN,XFILNM ;ENTER LOG FILE EE1+..ERROR E.ENT ;ENTER ERROR ON LOG FILE MOVEI E,LOGFL ;SAVE FILESPEC PUSHJ P,SPCSAV SKIPE LOGOPN+1 ;TO USETO? USETI LOGCHN,-1 ;DO IT MOVEI E,LOGSPC EXCH E,.JBFF OUTBUF LOGCHN,1 MOVEM E,.JBFF ;RESTORE .JBFF FOR LATER TXO F2,S.LIN!S.LOUT!S.LOPN ;ASSUME ALL INTO LOG FILE TLNE B,FS.NOO TXZ F2,S.LOUT TLNE B,FS.NOI TXZ F2,S.LIN POPJ P, ;AND RETURN DSPEC: PUSHJ P,FILSPC ;GET FILE SPEC DSPEC1: SKIPN E,XFILNM+.RBNAM ;SPECIFY A NAME? MOVE E,['TECO '] MOVEM E,XFILNM+.RBNAM SKIPN E,FILDEV ;HE SPECIFY A DEVICE MOVSI E,'DSK' ;ASSUME DSK MOVEM E,LOGOPN+1 ;SAVE IN OPEN BLOCK MOVEM E,FILDEV ;FIX IN CASE ERROR MOVEM E,SPCDEV POPJ P, ERRILD: RELEAS LOGCHN, ..ERROR E.ILD SUBTTL E COMMANDS -- EE (SAVE TECO'S STATE) EECMD: MOVEM 17,SAVEAC+17 ;PRESERVE 17 MOVEI 17,SAVEAC ;TO SAVE ALL AC'S BLT 17,SAVEAC+16 ;SAVE THEM MOVE 17,SAVEAC+17 ;RESTORE AC 17 MOVX E,S.LIN!S.LOUT!S.OLOG!S.LOPN ;CLEAR LOG FILE I-O FLAGS ANDCAM E,SAVEAC+F2 ;RESAVE FLAG MOVX E,F.OOPN!F.IOPN!F.UBAK ;NO FILES OPEN ANDCAM E,SAVEAC+FF ;SAVE IN LOW SEG PUSHJ P,DSPEC ;DEFAULT SKIPN E,XFILNM+.RBEXT ;SPECIFY AN EXT? MOVSI E,'SAV' ;DEFAULT MOVEM E,XFILNM+.RBEXT ;SAVE IT MOVSI E,OSAV ;FOR OUTPUT MOVEM E,LOGOPN+.OPBUF ;SAVE IT MOVE E,LOGOPN+.OPDEV ;GET DEVICE WE WILL OPEN DEVCHR E, ;WHAT IS IT JUMPE E,ERRNXD ;DOESN'T EXIST TXNE E,DV.OUT ;OUTPUT DEVICE MUST BE CAPABLE OF OUTPUT TXNN E,DV.M13 ;IN IMAGE BINARY ..ERROR E.ILD MOVEI E,.IOIBN ;IB FOR SAVE FILE MOVEM E,LOGOPN+.OPMOD ;SAVE IT OPEN SAVCHN,LOGOPN ;OPEN IT ..ERROR E.ODV MOVE E,[GETBLK,,STARTL] BLT E,STARTL+12 ;MAKE LITTLE PROGRAM IN LOW SEG ENTER SAVCHN,XFILNM ;ENTER THE OUTPUT FILE EE1+..ERROR E.ENT ;ERROR MOVEI E,EEFL ;SAVE FILE SPEC PUSHJ P,SPCSAV PUSH P,.JBSA ;SAVE FOR LATER RESTORE PUSH P,.JBCOR ;... MOVEI E,STARTL+6 ;WHERE TO START HRRM E,.JBSA ;FIX JOBSA MOVE E,.JBFF ;GET .JBFF NOW HRLM E,.JBSA HRLM E,.JBCOR ;SO SUBSEQUENT SAV-GET PAIRS WORK HRRZ A,.JBREL ;THIS IS OUR SIZE HRRM A,.JBCOR ;FIX ILL MEM REF PROB FOR EE OUTBUF SAVCHN,1 ;1 OUTPUT BUFFER MOVEM E,.JBFF ;SO WE NOT SAVE IT MOVEI A,.JBPFI+1 ;START SAVE AT 115 SAVTOP: SKIPN (A) ;ZERO? JSP E,MORE ;MORE TO GO? CAML A,.JBFF ;STOP? JRST SAVSTP ;RIGHT! MOVE B,A ;SAVE FIRST NON ZERO WORD SKIPE (A) ;ZERO? JSP E,MORE ;NO, SEE IF MORE SUBM B,A ;NEG NO OF WORDS MOVSS A ;FORM IOWD HRRI A,-1(B) ;FORMED PUSHJ P,SAVOUT ;SEND TO FILE MOVE E,A ;GET IOWD MOVE A,1(E) ;GET WORD PUSHJ P,SAVOUT ;SEND TO FILE AOBJN E,.-2 ;LOOP FOR THIS GROUP HRRZI A,1(E) ;NEXT WORD CAMGE A,.JBFF ;DONE? JRST SAVTOP ;NO, LOOP SAVSTP: MOVE A,[JRST STARTL+6] ;SO CORRECT THING HAPPENS PUSHJ P,SAVOUT ;OUTPUT IT RENAME SAVCHN,EEFL ;FINAL RENAME FOR PROTECTION JFCL ;"IMPOSSIBLE ERROR" RELEAS SAVCHN, ;CLOSE AND RELEASE CHANNEL FOR SAVE FILE POP P,.JBCOR POP P,.JBSA POPJ P, ;DONE SAVOUT: SOSGE OSAV+.BFCNT ;ROOM THIS BUFFER JRST OUTSAV ;NO, DUMP AND COME BACK IDPB A,OSAV+.BFPTR ;STICK WORD POPJ P, ;RETURN OUTSAV: OUT SAVCHN, ;DUMP BUFFER JRST SAVOUT ;GO BACK GETSTS SAVCHN,B ;ERROR STATUS POP P,.JBCOR POP P,.JBSA EE2+..ERROR E.OUT MORE: CAML A,.JBFF ;MORE? JRST (E) ;NO AOJA A,-2(E) ;NO RETURN .-2 SUBTTL E COMMANDS -- NEL & EE (LOW CORE) GETBLK: ('SYS') 'TECO ' REPEAT 4,<0> MOVEI E,STARTL GETSEG E, HALT MOVEI E,%TECOV ;TO MAKE SURE HI AND LOW SEG AGREE JRST 400010 ;ROUTINE TO CHANGE LOG FILE OUTPUT PARAMETERS CHANGL: PUSHJ P,SKRCH ;GET ANOTHER CHARACTER ..ERROR E.NAL CAIE CH,.CHESC ;MUST HAVE ALTMODE AFTER NEL ..ERROR E.NAL TXNN F2,S.LOPN ;HAVE A LOG FILE OPEN? ..ERROR E.NLF TXZ F2,S.LIN!S.LOUT ;ELSE CLEAR ALL TRNE B,1 ;OUTPUT? TXO F2,S.LOUT ;YES TRNE B,2 ;INPUT? TXO F2,S.LIN ;YES JUMPGE B,CPOPJ ;UNLESS B WAS NEGATIVE, RENAME LOGCHN,LOGFL ;RENAME FOR PROTECTION JFCL ;CANT HAPPEN RELEAS LOGCHN, ;IN WHICH CASE JUST CLOSE THE FILE TXZ F2,S.LIN!S.LOUT!S.LOPN!S.OLOG ;AND ZERO THE FLAGS POPJ P, ;OK, NOW DO THAT SUBTTL E COMMANDS -- EE (RESTART CODE) RST: CAIN E,%TECOV ;WILL THIS WORK JRST RST1 ;YES OUTSTR [ASCIZ .?TECWVT Wrong version of TECO GETSEG'd .] EXIT RST1: MOVEI E,REE ;RESET REN ADR MOVEM E,.JBREN ;SAVE MOVE E,[PUSHJ P,UUOH] ;FIX .JB41 MOVEM E,.JB41 ;... MOVSI 17,SAVEAC ;TO RESTORE AC'S BLT 17,17 ;DO IT PUSHJ P,TTOPEN ;REOPEN TTY PUSHJ P,SETUP ;RESET ALL DEFAULTS POP P,E ;THROW OUT WHERE YOU CAME FROM MOVEI A,TECO ;START ADR HRRM A,.JBSA ;SAVE IT JRST RET ;CONTINUE ;EDIT CORE (IE GARBAGE COLLECT AND SMALLIFY) ECORE: MOVEM PF,AC2+PF-2 ;[354] PUT PF WHERE GC EXPECTS IT ECORE1: MOVEI E,CORER ;[354] WHERE GC WILL RETURN MOVEM E,GCRET SETOM GCFLG ;GARBAGE COLLECT! MOVEM F2,SAVEAC ;PRESERVE FLAGS PUSH P,.JBREL ;SAVE SIZE NOW IN CASE NO CHANGE JRST GC ;DO IT CORER: HRRZ A,.JBCOR ;DON'T GET SMALLER THAN THIS MOVE F2,SAVEAC ;RESTORE FLAGS MOVE B,Z ;CHARACTER ADR OF LAST CHARACTER IDIVI B,5 ;WORD ADR AOJ B, ;YES CAMGE B,A ;WELL? MOVE B,A ;ELSE FORCE MIN TO (A) CORE B, ;DO IT JFCL MOVE A,.JBREL MOVEM A,.JBFF PUSHJ P,CRE23 ;RECOMPUTE SIZE OF TEXT BUFFER POP P,A ;GET OLD .JBREL BACK CAMN A,.JBREL ;DIFFERENT? POPJ P, ;NO, NO MESSAGE TXO FF,F.INIT ;FAKE OUT CORE ROUTINE JRST CORES ;SAY SIZE AND CONTINUE SUBTTL E COMMANDS -- EI & EP (EDIT INSERT & EDIT PUT) EICMD: TXOA F2,S.DOIT ;NOTE TO DO MI WHEN DONE READING EPCMD: TXZ F2,S.DOIT ;JUST READ IT INTO THE Q REG * PUSHJ P,FILSPC ;GET FILE SPEC MOVEI A,24 ;EI DEFAULT PUSHJ P,EIDFSP ;SET THEM UP SKIPN E,XFILNM+.RBEXT ;SPECIFY EXT? MOVSI E,'TEC' ;'TEC' IS DEFAULT FOR EI-EP TXOA F2,S.INFO ;TELL USER OF ANY CORE CHANGE WHEN THRU INIFIL: TXZ F2,S.INFO ;NEVER DO THIS! MOVEM E,XFILNM+.RBEXT ;SAVE IT ;***[337]*** ;Here to LOOKUP file for EI and EP. ;If no directory or device has been specified, then look for the ;file as follows: ; [-] ; [,,TEC]/SCAN ; TED: EPIGET: SETZM EPISEQ ;Clear search sequencer SKIPN FILPPN ;Directory specified? SKIPE FILDEV ;Or device? SETOM EPISEQ ;Yes, flag that no search sequence needed PUSHJ P,DSPEC1 ;DEFAULT DEVICE ETC SKIPGE EPISEQ ;Do we need a search sequence? JRST EPIG6 ;No, go read file TXNE F2,S.INFO ;Are we processing TECO.INI? JRST EPIG1 ;No, skip ahead MOVE E,USRPPN ;Yes, always use [,] MOVEM E,XFILNM+.RBPPN ;Store it JRST EPIG6 ;Go find the file EPIG1: MOVEI E,5 ;Initialize search sequencer MOVEM E,EPISEQ ;Store EPIG2: SOSG E,EPISEQ ;Get next step in search sequence JRST LOOKIN ;Finished. File was not found SETZM FILDEV ;Clear device for possible error msg. CAIE E,4 ;First step? JRST EPIG3 ;No MOVSI E,'DSK' ;Use DSK device MOVEM E,LOGOPN+1 ;Store SETZM XFILNM+.RBPPN ;Set default directory JRST EPIG6 ;Go straight to find it EPIG3: CAIE E,3 ;Second step? JRST EPIG3A ;No MOVEI E,FILPTH ;Set PATH pointer MOVEM E,XFILNM+.RBPPN ;in LOOKUP block MOVSI E,'TEC' ;Set [,,TEC] MOVEM E,FILSFD ;Store SETZM FILSFD+1 ;Set trailing 0 MOVE E,USRPPN ;Get logged-in PPN MOVEM E,FILPPN ;Store it CAMN E,DEFPTH+2 ;Same as default path PPN? SKIPE DEFPTH+3 ;And no SFD's? TRNA ;No, then search [,] also JRST EPIG7 ;Yes, don't bother setting /SCAN EPIG4: MOVEI E,2 ;Set /SCAN MOVEM E,FILPTH+1 ;Store JRST EPIG7 ;Go try EPIG3A: CAIE E,2 ;Third step? JRST EPIG5 ;No MOVE E,USRPPN ;Get logged-in PPN MOVEM E,XFILNM+.RBPPN ;Store CAMN E,DEFPTH+2 ;Same as default path? SKIPE DEFPTH+3 JRST EPIG7 ;No, go try JRST EPIG2 ;Yes, try next search EPIG5: ;Must be fourth step MOVSI E,'TED' ;Use TED: MOVEM E,LOGOPN+1 ;Store SETZM E,XFILNM+1 ;Clear directory spec SETZM FILPPN ;Clear this too for possible error msg. EPIG6: TXO FF,F.INIT ;INIT FILE READ IN PROGRESS SETZM LOGOPN+.OPMOD ;ASCII MODE MOVEI E,IINI ;INPUT BUFFER HEADER MOVEM E,LOGOPN+.OPBUF ;SAVE IT MOVE E,LOGOPN+.OPDEV ;DEVICE DEVCHR E, ;CHARACTERISTICS=? JUMPE E,ERRNXD ;NO SUCH DEVICE TXNE E,DV.IN ;INPUT DEVICE SHOULD BE CAPABLE OF INPUT TXNN E,DV.M0 ;IN ASCII MODE ..ERROR E.ILD OPEN INICHN,LOGOPN ;OPEN DEVICE ..ERROR E.IDV EPIG7: LOOKUP INICHN,XFILNM ;LOOK FOR FILE JRST EPIG2 ;Failed, go step the sequencer ;Found it...Fall through to next page PUSH P,.JBREL ;SAVE FOR LATER PUSH P,.JBFF ;[336] Save this too MOVE E,Z ;END OF TEXT BUFFER SUB E,BEG ;#CHARS IN IT MOVEM E,SAVEAC ;REMEMBER IT FOR LATER CLEAN UP MOVE TT,Z ;WHERE TO PUT BUFFER IDIVI TT,5 ;IN WORD ADR ADDI TT,2 ;ASSUME LEFT OVER + 1 MOVEM TT,.JBFF ;FIX IT INBUF INICHN,1 ;1 INPUT BUFFER MOVE OU,.JBFF ;WHERE WE WILL PUT THIS IMULI OU,5 ;ADR AS A NUMBER OF CHARACTERS MOVEM OU,SAVEAC+1 ;SAVE FOR LATER TRANSFER MOVEM 17,AC2+15 ;[354] Preserve 17 MOVE 17,(P) ;[355] Retrieve original .JBFF MOVEM 17,.JBFF ;[355] Put it back so it agrees with MEMSIZ SETZM 17 ;CLEAR FOR 1 K EXPAND INILP: SOSGE IINI+.BFCNT ;MORE TO READ? JRST [IN INICHN, ;NO, READ SOME JRST INILP ;AND CONTINUE GETSTS INICHN,B ;GET ERROR BITS TRNN B,IO.ERR ;ERROR? JRST INIDON ;NO JRST EE2ERR] ;SAY INPUT ERROR ILDB CH,IINI+.BFPTR ;GET CHARACTER JUMPE CH,INILP ;IGNORE IT CAML OU,MEMSIZ ;[355] FIT? PUSHJ P,GRABKQ ;[355] GET A K PUSHJ P,PUT ;[355] STICK IT IN TEXT BUFFER AOJA OU,INILP ;[355] DO REST OF IT CHKPUT: CAML OU,MEMSIZ ;FIT? PUSHJ P,GRABKQ ;GET A K PUSHJ P,PUT ;STICK IT IN TEXT BUFFER AOJA OU,CPOPJ ;DO REST OF IT INIDON: RELEAS INICHN, ;WE ARE DONE TXNE F2,S.INFO ;IF THIS OFF, INI FILE JRST SAVSIZ ;SAV SIZE MOVEI CH,.CHESC ;TECO'S ALTMODE PUSHJ P,CHKPUT PUSHJ P,CHKPUT SAVSIZ: MOVE 17,AC2+15 ;[354] Restore 17 MOVEM OU,Z ;SAVE ALL THAT STUFF MOVE C,SAVEAC+1 ;START OF IT MOVE B,Z ;END OF IT PUSHJ P,COPYEI ;COPY INTO * Q-REG MOVE B,BEG ;WHERE IT ALL STARTS ADD B,SAVEAC ;+ LENGTH MOVEM B,Z ;WHERE IT ENDS IDIVI B,5 ;FOR NEW .JBFF ADDI B,2 ;ASSUME LEFT OVER +1 IORI B,1777 ;MAKE LIKE A JOBREL SOJ B, ;SAFE POP P,E ;[336] Restore original .JBFF CAMLE E,B ;[336] If it is larger than our new one... MOVE B,E ;[336] then use old one so we don't shrink MOVEM B,.JBFF ;SAVE PUSHJ P,CRE23 ;YOU KNOW BY NOW!! POP P,E ;RESTORE OLD JOBREL CAMGE B,E ;E MOVEI A,CCLBLK ;RUN COMPIL HRLI A,1 ;AT START ADR PLUS ONE RUN A, ;RUN UUO JRST DECDMP ;JUST EXIT IF NO RUN. CCLBLK: SIXBIT /SYS/ SIXBIT /COMPIL/ ;RUN SYS:COMPIL REPEAT 4,<0> > SUBTTL E COMMANDS -- ED (RUN UUO ON EXIT) IFN NORUNS,< IFN CCL,< NORUN: MOVE 1,[SIXBIT /COMPIL/] MOVSI 2,SAVEXT ;SIXBIT FOR SAV OR DMP SETZB 3,4 INIT CCLCHN,.IODMP SIXBIT /SYS/ 0 EXIT LOOKUP CCLCHN,1 EXIT CALL 1,[SIXBIT /SETNAM/] HLRO 15,4 HRLM 15,NORUN1 MOVNS 15 MOVEI 16,73(15) ADDI 15,INHERE TXO 15,1777 MOVSI NORTOP,NORAC BLT NORTOP,NORTOP HRR NORBLT,16 JRST NORUN2 >> ;ROUTINE TO SET UP FOR RUN UUO ON EXIT RUNFX: HRLZM B,RUNIT+5 ;SAVE STARTING ADR INCREMENT PUSHJ P,FILSPC ;WHAT WE WILL RUN SKIPN E,FILDEV ;HE SPECIFY A DEVICE? MOVSI E,'SYS' ;DEFAULT TO 'SYS' MOVEM E,RUNIT ;PUT IT IN THE BLOCK MOVE A,[XFILNM+.RBNAM,,RUNIT+1] BLT A,RUNIT+4 ;SAVE FILE SPEC MOVE A,[FILPTH,,RUNIT+6] BLT A,RUNIT+17 ;SAVE PATH POPJ P, ;DONE IDIOT: MOVSI E,1 PUSHJ P,PUN1 JRST CLOSEF SUBTTL E COMMANDS -- ET, EO & EU ;ET COMMAND ; 0 = Normal typeout ; 1 = Literal typeout ; 2 = Image typeout (IONEOU) TYOCTL: POP P,CH ;CLR RET. ADDR. FROM PDL TXNE FF,F.ARG ;ARGUMENT? JRST TYOCT1 ;YES. SKIPE A,ETVAL ;[331] Get ET value CHKEO EODEC,FFOK ;[331] If EO > 2 and non-zero, return -1 JRST VALRET ;[331] Return the value TYOCT1: CHKEO EODEC,TYOCT3 ;[331] Jump if old style ET SKIPL B ;[331] Check range CAILE B,2 ;[331] ... ERROR E.ETA ;[331] Illegal value TYOCT2: MOVEM B,ETVAL ;[331] Store value JRST RET ;RETURN TYOCT3: JUMPE B,TYOCT2 ;[331] Old ET can be only 0 or 1 MOVEI B,1 ;[331] Non zero means 1 JRST TYOCT2 ;[331] Go store and return ;EO COMMAND OLDMOD: POP P,CH ;CLR RET. ADDR. FROM PDL TXNE FF,F.ARG ;ARGUMENT? JRST OLD1 ;YES, SET FLAG MOVE A,EOFLAG ;NO, RETURN VALUE OF EOFLAG JRST VALRET OLD1: CAIG B,0 ;N <= 0? MOVEI B,EOVAL ;YES, SET TO STANDARD CAILE B,EOVAL ;N > STANDARD FOR THIS VERSION? ERROR E.EOA MOVEM B,EOFLAG ;SET EOFLAG JRST RET ;EU COMMAND TYCASE: POP P,CH ;CLR RET. ADDR. FROM PDL TXNE FF,F.ARG ;ARGUMENT? JRST TYCAS1 ;YES MOVE A,TYCASF ;NO, RETURN VALUE OF TYPE-OUT CASE FLAG JRST VALRET TYCAS1: MOVEM B,TYCASF ;SET TYPE-OUT CASE FLAG JRST RET SUBTTL E COMMANDS -- ES AUTOTY: POP P,CH ;CLR RET ADDR FROM PDL TXNE FF,F.ARG ;ARG? JRST AUTOT1 ;YES MOVE A,AUTOF ;NO, RETURN VALUE OF FLAG JRST VALRET AUTOT1: MOVEI A,.CHLFD ;USE LF FOR FLAG IF ARG = 1 TO 37 CAIL B,1 CAILE B,37 MOVE A,B ;OTHERWISE USE WHAT HE GAVE MOVEM A,AUTOF ;SET NEW VALUE IN FLAG JRST RET SUBTTL E COMMANDS -- EH (CHANGE ERROR MESSAGE LEVEL) ERRSET: POP P,CH ;YOU GOT HERE BY PUSHJ DUMMY!! TXNE FF,F.ARG ;ARG SEEN? JRST ERRSE1 ;YES, RESET INDICATOR HLLZ B,ERRLEN ;NO, RETURN CURRENT VALUE OF FLAG MOVSI E,-3 ;NUMBER OF POSSIBILITIES TDNE B,JWTABL(E) ;BIT ON? MOVEI A,1(E) AOBJN E,.-2 ;NO, LOOP JRST VALRET JWTABL: XWD JW.WPR_-22,JW.WPR_-22 XWD JW.WFL_-22,_-22 XWD JW.WCN_-22,_-22 ERRSE1: CAILE B,3 ;3 IS HIEST MOVEI B,3 ;FORCE IT DOWN IF GREATER MOVE A,PRMERR ;ASSUME DEFAULT SKIPLE B ;OK ASSUMPTION? HRLZ A,JWTABL-1(B) ;NO MOVEM A,ERRLEN ;2 BECOMES 0 = MEDIUM JRST RET ;3 BECOMES +1 = LONG SUBTTL E COMMANDS -- EV (SET TERMINAL CHARACTERISTICS) VIDEO: IFE CRT,<..ERROR E.CRT> IFN CRT,< POP P,CH ;GET RID OF RETURN ADR TXNE FF,F.ARG ;ARG SEEN? JRST VIDCHG ;YES, GO POKE SETZ E, ;INIT SIXBIT NAME MOVE OU,[POINT 6,E] ;INIT POINTER MOVSI I,770000 ;INIT MASK FOR PARTIAL NAME VID1: PUSHJ P,SKRCH ;GET NEXT CHARACTER ..ERROR E.UTV ;NO MORE CAIN CH,.CHESC ;ALTMODE? JRST VID2 ;YES PUSHJ P,CKSYM ;LEGAL CHARACTER? SKIPA ;YES ..ERROR E.ICV ;NO MOVE CH,B ;PUT CHARACTER BACK IN CH PUSHJ P,PAKSIX ;PACK THE CHARACTER JRST VID1 ;LOOP VID2: MOVEM E,SWITHL ;SAVE IN CASE ITS BAD SETZM SWINDX ;NO MATCH YET MOVSI T,-NUMCRT ;SET UP INDEX POINTER VID3: CAMN E,CRTTAB(T) ;EXACT MATCH? JRST VID5 ;YES MOVE OU,CRTTAB(T) ;GET IT AND OU,I ;AND MASK IT CAME OU,E ;HOW ABOUT NOW? JRST VID4 ;NOPE SKIPE SWINDX ;GOT IT--IS THIS THE FIRST? ..ERROR E.ABT ;NOPE-AMBIGUOUS NAME MOVEM T,SWINDX ;STORE IT VID4: AOBJN T,VID3 ;GO TRY THE NEXT SKIPN T,SWINDX ;DID WE GET ONE? ..ERROR E.UTT ;UNKNOWN VID5: HLRZ A,CRTDSP(T) ;GET 1ST PARAMETER MOVEM A,CRTTYP MOVEI A,BACRUB ;NOW SET UP BLT FOR REST OF PARAMETERS HRL A,CRTDSP(T) ;WITH APPROPRIATE TERMINAL BLT A,CTUSEQ JRST RET ;WE'RE DONE ;HERE IF EV HAD NUMERICAL ARGUMENTS. VIDCHG: PUSHJ P,SKRCH ;GET ANOTHER CHARACTER ..ERROR E.NAV CAIE CH,.CHESC ;MUST BE ALTMODE ..ERROR E.NAV TXZN FF,F.ARG2 ;ONLY ONE ARG? JRST RETEV ;YES, GO RETURN THE VALUE SKIPLE C CAILE C,20 ;MAKE SURE FIRST ARG IS BETWEEN 1 AND 16. ..ERROR E.VOR CAIE C,20 ;EQUAL TO 16? JRST VDC1 ;NO CAMN B,[-1] ;YES, IS ARG -1? HRLZI B,032120 ;YES, CHANGE TO CRLF (SHIFTED 1 RIGHT) VDC1: CAILE C,6 ;IS THE 1ST ARG GREATER THAN 6? LSH B,1 ;YES, SHIFT (TECO CAN'T HANDLE BIG NEG. #S) MOVEM B,CRTTYP-1(C) ;STORE VALUE JRST RET RETEV: SKIPLE B ;CHECK RANGE CAILE B,20 ..ERROR E.VOR MOVE A,CRTTYP-1(B) ;GET VALUE CAILE B,6 ;NEED TO SHIFT AN ASCIZ TO MAKE IT POS? LSH A,-1 ;YES JRST VALRET SUBTTL E COMMANDS -- TERMINAL CHARACTERISTICS TABLES CRTTAB: SIXBIT /TTY/ ;TYPES OF CRT'S SIXBIT /CRT/ SIXBIT /ACT4/ ;[331] SIXBIT /ACT5/ ;[331] SIXBIT /ADD580/ SIXBIT /ADM2/ SIXBIT /ADM3/ SIXBIT /ADM3A/ ;[331] SIXBIT /BEE/ SIXBIT /DPT/ SIXBIT /CDC/ SIXBIT /H1200/ SIXBIT /H1500/ ;[331] SIXBIT /H2000/ SIXBIT /HP2640/ ;[331] SIXBIT /VT05/ SIXBIT /VT50/ ;[324] SIXBIT /VT52/ NUMCRT==.-CRTTAB ;FLAG BITS--STORED IN CRTTYP (PARAMETER 1). .CCRT.==1 ;TERMINAL IS A CRT .CNCR.==2 ;DON'T OUTPUT LONE CR TO TERMINAL .CRUB.==4 ;RUBOUT GETS TRADITIONAL TREATMENT (FOR GENERAL "CRT") .CWAP.==10 ;TERMINAL DOESN'T WRAP AROUND ON BACKSPACE FROM LEFT MARGIN ;ADDRESSES OF TERMINAL BLOCKS ;LEFT HALF CONTAINS VALUE OF CRTTYP (PARAMETER 1) CRTDSP: XWD 0,VTTY ;FOR TTY, ONLY THE 0 MATTERS-REST IS GARBAGE CRTGEN: XWD .CWAP.+.CRUB.+.CCRT.,VCRT ;GENERAL CRT SETTING. XWD .CCRT.+.CWAP.,VACT4 XWD .CCRT.+.CWAP.,VACT5 XWD .CCRT.,VADD5 XWD .CCRT.,VADM2 XWD .CWAP.+.CCRT.,VADM3 XWD .CWAP.+.CCRT.,VADM3A XWD .CCRT.,VBEE XWD .CWAP.+.CCRT.,VDPT XWD .CCRT.,VCDC XWD .CCRT.,VHZL1 XWD .CCRT.,VHZL15 XWD .CCRT.,VHZL2 XWD .CWAP.+.CCRT.,VHP26 ;[331] HP2640 XWD .CWAP.+.CCRT.,VVT05 XWD .CWAP.+.CCRT.,VVT50 ;[331] XWD .CWAP.+.CCRT.,VVT52 ;[331] VT52 same as VT50 VBEE: EXP 10,0,0,4,10 BYTE (7) 10 BYTE (7) 33,103 BYTE (7) 40,10 BYTE (7) 33,101 BYTE (7) 33,101 BYTE (7) 33,101 0 BYTE (7) 10 0 BYTE (7) 15,33,113,15 VACT5: VACT4: EXP 10,0,0,4,10 BYTE (7) 10 BYTE (7) 40 BYTE (7) 40,10 BYTE (7) 32 BYTE (7) 32 BYTE (7) 32 BYTE (7) 32 BYTE (7) 10 BYTE (7) 0 BYTE (7) 15,36 VADM2: EXP 10,0,1,4,10 BYTE (7) 10 BYTE (7) 40 BYTE (7) 40,10 BYTE (7) 13 BYTE (7) 13 BYTE (7) 13 0 BYTE (7) 10 0 BYTE (7) 15,33,124,15 VTTY: ;DUMMY ADDRESS - ALL THIS IS IGNORED VCRT: ;GENERAL CRT SETTING = ADM3 VADM3: EXP 10,0,0,0,0 BYTE (7) 10 BYTE (7) 40 BYTE (7) 40,10 EXP 0,0,0,0 BYTE (7) 10 0 0 VADM3A: EXP 10,0,1,4,10 BYTE (7) 10 BYTE (7) 40 BYTE (7) 40,10 BYTE (7) 13 BYTE (7) 13 BYTE (7) 13 BYTE (7) 13 BYTE (7) 10 EXP 0,0 VDPT: EXP 10,0,0,4,8 BYTE (7) 10,31 BYTE (7) 40 BYTE (7) 36 ;THIS MAY BE A LOCAL MOD AT U. OF T. BYTE (7) 32 BYTE (7) 32 BYTE (7) 32 BYTE (7) 32 BYTE (7) 10,31 BYTE (7) 31 BYTE (7) 15,36 VCDC: EXP 10,0,0,4,8 BYTE (7) 10 BYTE (7) 25 BYTE (7) 40,10 BYTE (7) 32 BYTE (7) 32 BYTE (7) 32 0 BYTE (7) 10,40,10,10 0 0 ;EOL SEEMS TO BE DISABLED ON A CDC (SHOULD BE ^V) VHP26: EXP 10,0,0,4,10 BYTE (7) 10 BYTE (7) 33,103 BYTE (7) 40,10 BYTE (7) 33,101 BYTE (7) 33,101 BYTE (7) 33,101 BYTE (7) 33,101 BYTE (7) 10,40,10,10 0 BYTE (7) 15,33,113,15 VHZL1: EXP 10,0,0,1,1 BYTE (7) 10 0 BYTE (7) 20,10 BYTE (7) 12 0 0 0 BYTE (7) 10 0 0 VHZL15: EXP 10,0,0,4,10 BYTE (7) 10 BYTE (7) 40 BYTE (7) 40,10 BYTE (7) 176,14 0 0 0 BYTE (7) 10 EXP 0 BYTE (7) 15,176,17,15 VHZL2: EXP 10,0,0,0,0 BYTE (7) 10 BYTE (7) 40 BYTE (7) 40,10 0 0 0 0 BYTE (7) 10 0 BYTE (7) 176,23,177,15 ;[331] VVT52: VVT50: EXP 10,0,0,4,10 BYTE (7) 10 BYTE (7) 33,103 BYTE (7) 40,10 BYTE (7) 33,101 BYTE (7) 33,101 BYTE (7) 33,101 BYTE (7) 33,101 BYTE (7) 10 0 BYTE (7) 15,33,113,15 VVT05: EXP 10,0,0,4,8 BYTE (7) 10 BYTE (7) 40 BYTE (7) 40,10 BYTE (7) 32 BYTE (7) 32 BYTE (7) 32 BYTE (7) 36,32 ;[331] BYTE (7) 10 0 BYTE (7) 15,36 VADD5: EXP 10,0,0,4,8 BYTE (7) 25,10 BYTE (7) 40 BYTE (7) 40,25,10 BYTE (7) 32 BYTE (7) 32 BYTE (7) 32 0 BYTE (7) 25,10 BYTE (7) 25,10 0 SUBTTL E COMMANDS -- EK (KILL) AND EN (RENAME) EKILL: MOVEI E,OUTCHN RESDV. E, ;DISCARD FILE CLOSE OUTCHN,CL.RST ;DO THE BEST WE CAN TXZ FF,F.UBAK+F.OOPN ;ZERO EB AND EW FLAGS POPJ P, ;AND RETURN RENAM: TXNE FF,F.UBAK ;EB IN PROGRESS ..ERROR E.EBO PUSHJ P,FILSPC ;GET A FILE SPEC (IF ANY) SKIPE FILDEV ..ERROR E.END TXZN FF,F.IOPN ;ER IN PROGRESS? ..ERROR E.ENO TXNN FF,F.FILE ;DID WE SEE ANY FILSPEC AT ALL JRST RENAM1 ;NO, MUST BE A DELETE PUSH P,FILPPN ;[340] Save directory spec PUSHJ P,ERDFSP ;YES, SO FILL IN ALL MISSING PARTS HRRZ E,INFILE+1 ;INCLUDING DATE STUFF- <000> NEEDS THIS HRRM E,XFILNM+.RBEXT POP P,(P) ;[340] Pop the stack SKIPN 1(P) ;[340] Was an explicit directory given? SETZM XFILNM+.RBPPN ;[340] No, don't move the file MOVE E,INFILE+2 TXNE FF,F.PROT ;WAS A FILE PROTECTION SPECIFIED? TLZ E,777000 ;YES, SO CLEAR OLD PROTECTION IORM E,XFILNM+.RBPRV ;STORE IT RENAM1: RENAME INCHN,XFILNM ;CHANGE NAME OR DELETE JRST RENFLD RELEASE INCHN, POPJ P, ;SUCCESSFUL RENFLD: RELEASE INCHN, EE1+..ERROR E.RNF SUBTTL E COMMANDS -- ER (PREPARE TO READ A FILE) OPNRD: TXZ FF,F.EOFI+F.IOPN ;NOT EOF & CLOSE PREVIOUS INPUT RELEAS INCHN,0 ;YES. RELEASE IT BEFORE OPENING NEW FILE. PUSHJ P,CLREXT ;CLEAR LOOKUP BLOCK PUSHJ P,FILSPC ;GET FILE SPEC SETZM NFORMS ;HAVE NOT SEEN ANY FORM FEEDS YET SETZM OPNRI+.OPMOD ;ASCII MODE PUSHJ P,ERDFSP ;NO SO SET UP DEFAULT FILE SPEC SKIPN FILPPN ;IS PPN 0? MOVE E,FILDEV ;INITIALIZE OPEN UUO ARGUMENTS MOVEM E,OPNR1 PUSHJ P,DEVCHK ;GET DEVICE CHARACTERISTICS MOVEM E,DEVSAV ;SAVE FOR EB JUMPE E,ERRNXD ;NO SUCH DEVICE TXNE E,DV.IN ;MUST BE ABLE TO INPUT TXNN E,DV.M0 ;IN ASCII MODE ..ERROR E.ILD MOVEI E,IBUF MOVEM E,OPNRB OPEN INCHN,OPNRI ;OPEN INPUT FILE ..ERROR E.IDV PUSHJ P,OPNIN HLLZS XFILNM+.RBEXT ;CLEAR EXT RH FOR MON ERR ON DTA SKIPG MONITR ;IF SERIES 3 OR 4 MONITOR, SHORT LOOKUP JRST OPNRD1 ;SHORT MOVE E,DEVSAV ;GET DEVICE CHARACTERISTICS SPR 10-8431 TXNE E,DV.DTA ;IS IT A DECTAPE? SPR 10-8431 JRST OPNRD1 ;YES, SHORT LOOKUP SPR 10-8431 LOOKUP INCHN,XFILNM ;EXTENDED LOOKUP JRST LKUPER ;ERROR JRST OPNRD2 OPNRD1: LOOKUP INCHN,XFILNM+.RBNAM ;SHORT LOOKUP JRST LKUPER ;LOOKUP FAILURE OPNRD2: PUSHJ P,CHKSPC ;[340] Issue warning if found elsewhere MOVEI E,INFILE ;SAVE INPUT SPECS PUSHJ P,SPCSAV TXO FF,F.IOPN ;INPUT FILE NOW OPEN MOVSI E,FS.SUP!FS.NOL ;CK SUPLSN SWITCH AND E,SWITC ;GET SETTING XORM E,SWITC ;[317]CLEAR THEM HERE, SO NO SUPLSN ON OUTPUT MOVEM E,INSWIT ;STORE SETTING FOR INPUT TXZ FF,F.SEQ ;CLR SEQUENCE NUMBER FLAG IN INCHN, ;READ A BUFFER IN JRST .+3 PUSHJ P,ANERR ;SOME ERROR, OR JUST EOF JRST OPNRD3 ;IT WAS EOF-FILE EMPTY MEANS UNSEQUENCED MOVE B,IBUF+.BFPTR ;GET ADR OF BUFR MOVE A,1(B) ;FIRST WORD OF BUFR IOR A,2(B) ;!2ND MOVEI B,RI ;SLOW INPUT ROUTINE TLNN E,FS.NOL ;NO LSN'S TRNN A,1 ;SEQF ;Fall through to next page... OPNRD3: MOVEI B,RIQ ;USE QUICK ONE MOVEM B,INCH ;SET UP INPUT ROUTINE CAIN B,RI ;SLOW? TXO FF,F.SEQ ;THEN MUST BE SEQUENCED FILE TXNE FF,F.EBTP ;[343] EB in progress? POPJ P, ;[343] Yes, return TXZE FF,F.CCL ;[343] ARE WE HERE FROM A .MAKE COMMAND? PUSHJ P,YANK ;[343] Yes, do an EY POPJ P, ;RETURN OPNIN: MOVEI T,IBUF1 ;GET INPUT BUFFERS EXCH T,.JBFF INBUF INCHN,2 MOVEM T,.JBFF POPJ P, SUBTTL E COMMANDS -- FILE SPEC SETUP ERDFSP: TDZA A,A EWDFSP: MOVEI A,12 EIDFSP: MOVE E,SWITC ;[337] Get file switches TLNN E,FS.DEF ;[337] /DEFAULT set? JRST DEFSP1 ;[337] No, continue MOVSI E,ERSPEC(A) ;[337] Yes, we must clear the block HRRI E,ERSPEC+1(A) ;[337] Set up the BLT SETZM ERSPEC(A) ;[337] Zero the block BLT E,ERSPEC+11(A) ;[337] DEFSP1: SKIPN E,XFILNM+.RBNAM ;HE TYPE A NAME? SKIPA E,ERSPEC+1(A) ;[337] NO, GET DEFAULT MOVEM E,ERSPEC+1(A) ;SAVE IT MOVEM E,XFILNM+.RBNAM SKIPN E,XFILNM+.RBEXT ;HE TYPE EXT? SKIPA E,ERSPEC+2(A) ;[337] NO, GET DEFAULT MOVEM E,ERSPEC+2(A) ;SAVE MOVEM E,XFILNM+.RBEXT MOVSI B,ERSPEC+4(A) ;SET UP PPN HRRI B,FILPPN MOVS I,B SKIPE FILPPN JRST DFSP1 TXNE F2,S.DPPN HRLI B,DEFPTH+2 ;HE WANTS [-] PUSHJ P,CHKERZ ;CHECK FOR ERSATZ DEVICE HRLI B,SPCPPN ;IT WAS ERSATZ--GET RIGHT PPN MOVE E,B ;[317]SAVE BLT AC BLT E,FILPPN+5 ;[317] HRRI B,SPCPPN ;PUT IT HERE TOO BLT B,SPCPPN+5 TXNE F2,S.DPPN ;[340] Make [-] default, but not ersatz PPN DFSP1: BLT I,ERSPEC+9(A) ;NOW MAKE IT THE NEW DEFAULT MOVE E,FILPPN MOVEM E,XFILNM+.RBSIZ ;FOR SHORT LOOKUPS AND ENTERS MOVEI E,FILPTH ;[340] Get pointer to PATH block SKIPE FILPPN ;[340] Does PATH block have something MOVEM E,XFILNM+.RBPPN ;[340] Yes, point to it SKIPN E,FILDEV ;HE TYPE A DEVICE? SKIPA E,ERSPEC(A) ;[337] NO, GET DEFAULT MOVEM E,ERSPEC(A) ;SAVE MOVEM E,FILDEV POPJ P, SUBTTL E COMMANDS -- EB (EDIT BACKUP PROCESSOR) EBAKUP: TXNE FF,F.UBAK ;BACKUP IN PROGRESS NOW? ..ERROR E.EBO TXO FF,F.EBTP ;SET EB UUO FLAG PUSHJ P,OPNRD ;READ THE SPECIFIED FILE MOVE E,SWITC ;[343] Get I/O switches TLNE E,FS.REA ;[343] /READONLY? JRST EBAKU3 ;[343] Yes, cancel EB and do an ER MOVE E,DEVSAV ;GET DEVICE CHARACTERISTICS TXNN E,DV.DIR ;DEVICE MUST HAVE DIRECTORY ..ERROR E.EBD TXNE E,DV.DTA ;SKIP IF NOT DECTAPE (E.G. DSK) SPR 10-8431 JRST EBAKU4 ;DO SHORT LOOKUP/ENTER. SPR 10-8431 HLLZS XFILNM+.RBEXT ;CLEAR EXT RH MOVE E,SWITC ;GET FILE SWITCHES TLNN E,FS.INP ;/INPLACE EDIT? JRST EBAKU0 ;NO TXZ FF,F.EBTP ;NO LONGER EB MOVE E,[FILPPN,,SPCPPN] ;[340] Save the real path BLT E,SPCPPN+5 ;[340] so EW goes to the right place JRST EBAKU6 ;DO ER/EW EBAKU0: MOVEI E,INCHN PUSHJ P,CHKDEF ;CHECK TO SEE IF SAME AS DEFAULT JRST EBAKU2 ;NOPE-JUST DO ER-EW MOVE E,FILDEV ;SAVE DEVICE NAME SKIPG MONITR ;SERIES 5 MONITOR? JRST EBAKU5 ;NO MOVE E,XFILNM+.RBSIZ ;COMPUTE # BLKS TO ASK FOR LSH E,-7 AOJ E, MOVEM E,XFILNM+.RBEST ;SAVE MOVE E,XFILNM+.RBDEV ;GET PHYSICAL UNIT NAME IN-FILE IS ON MOVEM E,DCLOC ;DO A DSKCHR ON IT MOVE E,[5,,DCLOC] DSKCHR E, EBAKU4: SKIPA E,FILDEV ;ERROR, USE BEST NAME WE HAVE MOVE E,DCLOC+.DCSNM ;GET NAME FOR FILESTR IN-FILE IS ON MOVEM E,FILDEV ;SO WE CAN PUT NEW FILE ON SAME STR ;Fall through to next page... EBAKU5: MOVEM E,EBDEV MOVE E,XFILNM+.RBNAM ;SAVE FILENAME MOVEM E,BAKNAM ;IN BACKUP STORE HLRZ E,XFILNM+.RBEXT ;AND THE EXTENSION CAIN E,(SIXBIT /BAK/) ;CANNOT USE EB WITH FILE EXT = "BAK" ..ERROR E.EBF HRLZM E,BAKNAM+1 LDB E,[POINT 9,XFILNM+.RBPRV,8] ;SAVE PROTECTION OF INPUT FILE MOVEM E,PROTEC ;SAVE INPUT FILE PROTECTION MOVEM E,EBPROT ;[333] Also in 2 RENAME switch MOVE A,E ;[333] Make full access CHKACC block HRLI A,.ACREN ;[333] and check for enough privs to do it straight MOVE AA,FILPPN ;[333] PPN of file owner MOVE B,USRPPN ;[333] Our PPN MOVEI E,A ;[333] Point to block CHKACC E, ;[333] See SETZ E, ;[333] Assume ok JUMPE E,EBAKU9 ;[333] OK if OK HRROS EBPROT ;[333] Flag that 2 RENAME's needed at close time HRLI A,.ACCPR ;[333] See if we can change protection to reasonable MOVEI E,A ;[333] CHKACC E, ;[333] Try that SETZ E, ;[333] Assume OK now (??) SKIPE E ;[333] Yes, skip to see if we are supposed to write ..ERROR E.EBP ;[333] No, it's too protected HRLI A,.ACWRI ;[333] Yes, can we write to it MOVEI E,A ;[333] CHKACC E, ;[333] SETZ E, ;[333] ????? JUMPE E,EBAKU9 ;[333] OK ..ERROR E.EBP ;[333] So sorry EBAKU9: MOVE E,PROTEC ;[333] Get input file protection back SKIPE A,SPCPRO LDB E,[POINT 9,A,8] MOVEM E,BAKPRO ;THIS IS THE DESIRED PROTECTION FOR THE NEW FILE MOVSI E,100000 ;MEANWHILE, USE <100> FOR .TMP FILE MOVEM E,SPCPRO ;SO FINAL RENAME NEVER FAILS. MOVE E,TMPTEC ;GET "###TEC" CAME E,XFILNM+.RBNAM ;FILNAM=###TEC? JRST EBAKU1 ;NO, OK HLRZ A,XFILNM+.RBEXT ;ALSO EXT="TMP"? CAIN A,(SIXBIT /TMP/) ;EB###TEC.TMP ILLEGAL ..ERROR E.EBF EBAKU1: MOVEM E,XFILNM+.RBNAM MOVEM E,BAKTMP ;SAVE FOR DTA RENAME MOVSI E,(SIXBIT /TMP/) MOVEM E,XFILNM+.RBEXT EBAKU6: PUSHJ P,OPNW4 ;WRITE THE TMP FILE PUSHJ P,OPNW2 TXNE FF,F.EBTP ;UNLESS NOT BACK-UP, TXO FF,F.UBAK ;SET IN PROGRESS EBAKU3: TXZE FF,F.CCL ;EB OR TECO COMMAND? PUSHJ P,YANK ;TECO, DO A Y ALSO POPJ P, EBAKU2: TXZ FF,F.EBTP ;NO LONGER AN EB SETZM SPCPPN ;FAKE DEFAULT PATH HLLZS XFILNM+.RBEXT ;RESTORE FILE SPECS MOVSI E,(SIXBIT /DSK/) MOVEM E,FILDEV ;MAKE SURE DSK AND NOT SOME ERSATZ. MOVEM E,SPCDEV ;HERE TOO JRST EBAKU6 SUBTTL E COMMANDS -- I/O ERROR ROUTINES LKUPER: RELEAS INCHN,0 TXZ FF,F.IOPN ;LET GO OF INPUT DEVICE EE1+..ERROR E.FNF ;TYPE OUTPUT ERROR ENTERR: RELEAS OUTCHN,0 TXZ FF,F.OOPN+F.UBAK ;LET GO OF OUTPUT DEVICE & EB FLAG LDB E,[POINT 6,XFILNM+.RBEXT,35] ;ERROR CODE CAIE E,2 ;ERROR CODE 2? JRST ENTER2 ;NO MOVE E,WRICHR ;GET DEVICE BITS TXNE E,DV.DTA ;IF DTA ITS FULL, OTHERWISE ENTER ERROR ..ERROR E.FUL ENTER2: EE1+..ERROR E.ENT LOOKIN: RELEAS INICHN, ;DON'T WANT CHANNEL ANYMORE TXZN F2,S.INFO ;WE PUSH ANYTHING? POPJ P, ;NO, DON'T WORRY EE1+..ERROR E.FNF SUBTTL E COMMANDS -- EW (EDIT WRITE) OPNWRA: TXOA F2,S.EA ;WE ARE GOING TO APPEND OPNWR: TXZ F2,S.EA PUSHJ P,OPNW1 OPNW2: MOVE E,WRICHR ;GET DEVCHR WORD TXNN E,DV.DTA ;DECTAPE? SKIPG MONITR ;OR OLD MONITOR JRST SHRTLK ;SHORT LOOKUP - ENTER TXNN E,DV.DSK ;A DSK? JRST SHRTLK ;NO, NO NEED FOR EXTENDED LOOKUP - ENTER SETO B, ;SET FOR FANCY DISK ALLOCATION MOVEI E,FILPTH ;[340] Make sure path pointer is set MOVEM E,XFILNM+.RBPPN ;[340] TXNE FF,F.EBTP ;THIS AN EB TEMP FILE ENTER? JRST XENTER ;YES, CARE NOT OF SUPERCEDE PUSHJ P,PPNSET ;SET UP DEFAULT, IF NECESSARY AOS FILPTH+1 ;NO SCANNING LOOKUP OUTCHN,XFILNM ;FILE THERE? JRST XENTER ;NO, JUST ENTER IT MOVE B,FILPPN ;SAVE PPN PUSHJ P,PPNSET ;RESET PPN TXNE F2,S.EA ;APPENDING? JRST XENTRE ;YES, DON'T SCREW UP PROT/DATE CLOSE OUTCHN, ;NO, CLOSE FOR SUPERCEDE XENTER: SETZM XFILNM+.RBPRV ;CREATION DATE NOW HLLZS XFILNM+.RBEXT ;... MOVE E,SPCPRO ;NOW SET UP RIGHT PROT. TRNE E,1 ;IF <000>, MAKE IT <100> TLO E,100000 HLLZM E,XFILNM+.RBPRV XENTRE: SETZM XFILNM+.RBALC ;CLEAR ALLOCATION ENTER OUTCHN,XFILNM ;ENTER THE FILE JRST ENTERR ;??? JUMPL B,OPNW5 ;[320] -1 MEANS LOOKUP FAILED, SO SKIP ALL THIS CAMN B,FILPPN ;FILE IN SAME AREA? PUSHJ P,SUPERC ;YES, THEN SUPERCEDING TXNE F2,S.EA ;TO APPEND? USETI OUTCHN,-1 ;YES, TELL GOD OPNW5: MOVEI T,OBUF1 ;WHERE OUTPUT BUFFERS MUST BE EXCH T,.JBFF ;TELL MONITOR TO PUT THEM THERE OUTBUF OUTCHN,2 ;TWO OF THEM MOVEM T,.JBFF ;AND RESTORE JOBFF MOVEI E,OUTFIL ;SAVE FILESPEC PUSHJ P,SPCSAV MOVSI E,FS.GEN+FS.SUP ;GET OUTPUT FS.GEN & FS.SUP SWITCHES AND E,SWITC MOVE T,INSWIT ;[317]GET INPUT SWITCHES MOVEI B,PPAQ ;ASSUME QUICK ROUTINE TLNE E,FS.GEN ;[317]MUST GENERATE LSN'S? MOVEI B,PPA ;= USE SLOW ONE TXNE FF,F.SEQ ;[317]SEQUENCED FILE? TLNE T,FS.SUP ;[317]YES, BUT IS INPUT SUPPRESSING THEM? SKIPA ;[317]BUFFER WILL NOT HAVE SEQUENCE NUMBERS MOVEI B,PPA ;[317]USE SLOW ROUTINE MOVEM B,OUTCH ;SAVE IT TXO FF,F.OOPN ;OUTPUT FILE NOW OPEN TLNE E,FS.GEN ;ARE BOTH SET? TLNN E,FS.SUP JRST .+2 ;NO, OK ..ERROR E.COS MOVEM E,OUTSWT ;STORE OUTPUT SWITCH MOVE E,[<"00000">B34+1] ;INIT LSN GENERATION CTR MOVEM E,LSNCTR POPJ P, DEVICL: MOVE E,OPNWI+.OPDEV ;DEVICE NAME DEVCHR E, ;WHAT IS IT CAIN E,0 ERRNXD: ..ERROR E.NXD TXNE E,DV.OUT ;MUST BE CAPABLE OF OUTPUT TXNN E,DV.M0 ;IN ASCII MODE ..ERROR E.ILD POPJ P, OPNW1: TXZE FF,F.UBAK TXZA FF,F.OOPN SKIPA CLOSE OUTCHN,CL.RST PUSHJ P,FILSPC PUSHJ P,EWDFSP ;SET UP DEFAULTS MOVE E,SWITC ;[343] Get I/O switches TLNE E,FS.APP ;[343] /APPEND? TXO F2,S.EA ;[343] Yes, set append flag SKIPE E,FILDEV ;DO WE HAVE A DEVICE? JRST OPNW11 ;YES MOVE E,ERSPEC ;NO, GET ER'S MOVE T,[XWD 3,E] ;CHECK IF ITS ERSATZ PATH. T, TRNE E+1,40 ;WELL? MOVSI E,'DSK' ;IT IS ERSATZ...SO MAKE IT DSK: OPNW11: MOVEM E,FILDEV ;STORE DEVICE MOVEM E,SPCDEV ;HERE TOO SKIPN E,XFILNM+.RBNAM ;HAVE A NAME? MOVE E,ERSPEC+1 ;USE ER'S NAME IF NOT MOVEM E,XFILNM+.RBNAM ;SAVE IT SKIPN E,XFILNM+.RBEXT ;GET EXT? MOVE E,ERSPEC+2 ;NO, USE ER'S HLLZM E,XFILNM+.RBEXT MOVSI B,(SIXBIT /SFD/) ;CHECK FOR AN .SFD FILE CAMN B,XFILNM+.RBEXT JRST OPNW4 ;IS AN .SFD, DONT GET DEFAULT PROT. SKIPE E,SPCPRO ;WAS A PROTECTION SPECIFIED? JRST OPNW1A ;YES, GO MAKE IT THE DEFAULT TXNN F2,S.EA ;IF WE ARE DOING AN EA, SKIPN E,EWSPEC+3 ;OR IF NO PREVIOUS DEFAULT JRST OPNW4 ;THEN DONT FIDDLE WITH ANYTHING MOVEM E,SPCPRO ;MAKE DEFAULT PROT THE CURRENT PROT OPNW1A: MOVEM E,EWSPEC+3 ;AND THE NEW DEFAULT TXO FF,F.PROT ;AND SAY WE'VE GOT ONE ; JRST OPNW4 ;FALL THROUGH OPNW4: TXZE FF,F.OOPN ;CALL HERE FROM EB RENAME OUTCHN,OUTFIL JFCL ;CANT HAPPEN RELEAS OUTCHN,0 SETZM OPNWI+.OPMOD MOVE E,FILDEV MOVEM E,OPNWD PUSHJ P,DEVCHK ;GET DEVICE CHARACTERISTICS MOVEM E,WRICHR MOVSI E,OBF MOVEM E,OPNWB PUSHJ P,DEVICL ;LEGAL DEVICE? OPEN OUTCHN,OPNWI ..ERROR E.ODV MOVEI B,"A" MOVEI E,OUTCHN DEVTYP E, ;TYPE OF DEVICE JRST OILDER TXNE F2,S.EA ;EDIT APPEND (IE DSK ONLY)? TRNN E,77 ;.TYDSK? SKIPA JRST OILDER MOVEI T,OBUF1 EXCH T,.JBFF OUTBUF OUTCHN,2 MOVEM T,.JBFF POPJ P, OILDER: RELEAS OUTCHN, ..ERROR E.ILD SUBTTL E COMMANDS -- EZ & EF ;GET I-O DEVICE CHARACTERISTICS IN AC E ;IF TTY, IT MUST BE AVAILABLE & NOT CONTROLLING A JOB DEVCHK: DEVCHR E, ;GET CHARACTERISTICS TXNN E,DV.TTY ;TTY? POPJ P, ;NO TXNE E,DV.AVL ;YES, AVAILABLE? TXNE E,DV.TTA ;CONTROLLING A JOB (INCLUDING USER)? ..ERROR E.TTY POPJ P, ;NO, IT'S OK ;EZ SELECTS THE OUTPUT DEVICE, ISSUES A REWIND COMMAND TO IT, ; ISSUES A COMMAND TO ZERO ITS DIRECTORY, AND OPENS THE FILE ; SPECIFIED (IF ANY). ZERDIR: PUSHJ P,OPNW1 ;DETERMINE OUTPUT DEVICE UTPCLR OUTCHN, ;CLEAR DIRECTORY OF OUTPUT DEVICE MTAPE OUTCHN,1 ;REWIND OUTPUT DEVICE JRST OPNW2 ;ENTER FILE ;EF FINISHES OUTPUT ON THE CURRENT OUTPUT FILE WITHOUT ; SELECTING A NEW OUTPUT FILE. CLOSEF: TXNN FF,F.OOPN POPJ P, CLOSE OUTCHN,CL.IN STATZ OUTCHN,IO.ERR JRST OUTERR TXNE FF,F.UBAK ;EB IN PROGRESS? PUSHJ P,BAKCLS ;YES (THIS WILL SKIP RETURN) RENAME OUTCHN,OUTFIL ;IF NOT EB, THEN RENAME FOR PROTECTION JFCL ;CANT HAPPEN RELEAS OUTCHN,0 TXZ FF,F.UBAK!F.OOPN ;CLEAR WRITE AND EB FLAGS POPJ P, SUBTTL E COMMANDS -- EM (MTAPE UUO'S) EMTAPE: TXNN FF,F.IOPN ERROR E.EMD MOVE E,OPNR1 ;SET UP INPUT DEVICE NAME MOVEM E,FILDEV ;IN CASE OF AN ERROR PUSHJ P,CHK2 CAIGE B,1 ERROR E.EMA MTAPE INCHN,0(B) OPEN INCHN,OPNRI ;RE-INIT BUFFERS ERROR E.IEM PJRST OPNIN SUBTTL E COMMANDS -- EB (FINISH UP COMMAND) ;THIS ROUTINE IS CALLED AT EF IF AN EB WAS DONE. IT DOES ;THE WORK OF MAKING THE INPUT FILE HAVE THE EXTENSION .BAK , ;DELETING ANY PREVIOUS FILE.BAK, AND RENAMING THE NEW OUTPUT ;FILE AS THE ORIGINAL FILE.EXT BAKCLS: CLOSE INCHN,0 MOVE E,EBDEV ;ORIGINAL EB DEVICE MOVEM E,FILDEV ;IN CASE OF AN ERROR TXZN FF,F.IOPN ;INPUT OPEN? JRST BKCLS4 ;NO CAMN E,OPNR1 ;ORIGINAL SAME AS CURRENT? JRST BKCLS2 ;YES BKCLS4: MOVEM E,OPNR1 ;NO, RE-OPEN ORIGINAL MOVE E,WRICHR ;GET DEVICE CHARACTERISITECS TXNN E,DV.DSK ;IS IT DISK ? JRST BKCLS6 ;NO - JUST DO NORMAL OPEN MOVX E,UU.PHS ;YES - DO PHYS ONLY OPEN IORM E,OPNRI+.OPMOD ;. . . BKCLS6: MOVEI E, ;SETUP ERROR CODE OPEN INCHN,OPNRI JRST BKCERR ;ERROR ROUTINE BKCLS2: MOVE E,BAKNAM MOVEM E,XFILNM+.RBNAM MOVSI E,(SIXBIT /BAK/) MOVEM E,XFILNM+.RBEXT MOVE E,WRICHR ;[353] Get device characteristics TXNE E,DV.DTA ;[353] DEC-tape? JRST BKCLSD ;[353] Yes MOVEI E,FILPTH ;[353] Set up path pointer MOVEM E,XFILNM+.RBPPN ;[353] PUSHJ P,PPNDEF ;[353] Set default path AOS FILPTH+1 ;[353] No scanning! MOVE B,PROTEC ;GET PROTECTION OF INPUT FILE SKIPN FDAEM ;[333] See what protection we want file to be TRZN B,700 ;[333] No FILDAE, make owner protection 0 TRZ B,300 ;[333] FILDAE, leave 400 on if it is LOOKUP INCHN,XFILNM ;[353] JRST BKCLS0 ;[333] .BAK file not there or protection failure LDB B,[POINTR (XFILNM+.RBPRV,RB.PRV)] ;GET PROTECTION OF BACKUP FILE SETZM XFILNM+.RBNAM MOVEI E, ;ERROR CODE IN CASE WE NEED IT RENAME INCHN,XFILNM ;[353] JRST BKCERR ;ERROR JRST BKCLS1 ;[333] Now go rename original file to .BAK ;[353] Here to do short LOOKUP on DEC-tapes BKCLSD: LOOKUP INCHN,XFILNM+.RBNAM ;[353] Short LOOKUP for DTA JRST BKCLS1 ;[353] None, assume not there SETZM XFILNM+.RBNAM ;[353] Zero the file name RENAME INCHN,XFILNM+.RBNAM ;[353] Delete JRST BKCERR ;[353] Most strange JRST BKCLS1 ;[353] Move on ;Here when LOOKUP on .BAK file fails BKCLS0: HRRZ E,XFILNM+.RBEXT ;[333] Get error code JUMPE E,BKCLS1 ;[333] 0 means not found, so we're OK MOVEI E,;[333] Otherwise, load error code JRST BKCERR ;[333] Can't LOOKUP existing .BAK file BKCLS1: MOVE E,BAKNAM MOVEM E,XFILNM+.RBNAM HLLZ E,BAKNAM+1 MOVEM E,XFILNM+.RBEXT MOVE E,WRICHR ;[353] Get device characteristics TXNE E,DV.DTA ;[353] DEC-tape? JRST BKCLD1 ;[353] Yes MOVEI E,FILPTH ;[353] Set up default path again MOVEM E,XFILNM+.RBPPN ;[353] (May have gotten wiped) PUSHJ P,PPNDEF ;[353] AOS FILPTH+1 ;[353] No scanning MOVEI E, ;ERROR CODE LOOKUP INCHN,XFILNM ;[353] JRST BKCERR ;ERROR SKIPG MONITR ;SERIES 5? JRST BKCLS5 ;NO SKIPL EBPROT ;[333] Need to do 2 RENAMEs due to protection? JRST BKCLS5 ;[333] No, skip this bother MOVE E,PROTEC ;GET PROT OF INPUT FILE ;When we arrive at this point, we know the protection must be ;<2xx>, the only one which requires a double rename but still ;allows us to edit at all. XORI E,300 ;THEN RENAME IT TO 100 RANGE -- DPB E,[POINTR (XFILNM+.RBPRV,RB.PRV)] ;SO WE CAN DO THE REAL RENAME TO .BAK MOVEI E, ;ERROR RENAME INCHN,XFILNM ;[353] JRST BKCERR ;ERROR BKCLS5: MOVSI E,(SIXBIT /BAK/) HLLM E,XFILNM+.RBEXT ;DATE75 DPB B,[POINTR (XFILNM+.RBPRV,RB.PRV)] ;GIVE BAK FILE SAME PROT AS OLD BAK RENAME INCHN,XFILNM ;[353] TRNA ;[333] Try to recover JRST BKCLS8 ;[333] Now go rename the .TMP file ;Here when renaming file to file.BAK with a lower protection fails. ;We will try again, this time keeping the protection the same. LDB E,[POINT 15,XFILNM+.RBEXT,35] ;[333] Get error code CAIE E,ERPRT% ;[333] Protection failure? JRST BKCLS7 ;[333] No, complete loss HLLZ E,BAKNAM+