TITLE TECO %26(257) TEXT EDITOR AND CORRECTOR SUBTTL RC CLEMENTS/PMH/CAM/EAR/DML/JNG/BGS/DCE/MHK/CGN/RDH SEARCH JOBDAT,MACTEN,UUOSYM ;STANDARD DEFINITIONS SEARCH SWIL ;SWIL DEFINITIONS .REQUE REL:SWIL ;SWIL PACKAGE SALL ;PRETTY LISTINGS .DIREC FLBLST ;PRETTIER LISTINGS COMMENT \ TECO -- "Text Editor and COrrector" for TOPS-10 Copyright (C) 1970, 1971, 1972, 1975, 1976, 1977, 1978, 1980, 1982, 1984, 1986 Digital Equipment Corporation, Maynard, Massachusetts, U.S.A. This software is furnished under a license and may be used and copied only in accordance with the terms of such license and with the inclusion of the above copyright notice. This software or any other copies thereof may not be provided or otherwise made available to any other person. No title to and ownership of the software is hereby transferred. The information in this software is subject to change without notice and should not be construed as a commitment by Digital Equipment Corporation. Digital assumes no responsibility for the use or reliability of its software on equipment which is not supplied by Digital. \ ;TECO VERSION IDENTIFICATION MAJVER==26 ;MAJOR VERSION LEVEL MINVER==0 ;MINOR (MAINTENANCE RELEASE) LEVEL CSTVER==0 ;CUSTOMER VERSION (WHO LAST . . .) EDTVER==257 ;EDIT LEVEL %%TECO==: IF2,< PURGE CSTVER,MAJVER,MINVER,EDTVER> LOC .JBVER EXP %%TECO ;VERSION # SUBTTL Revision History ;*** CHANGES FROM VERSION 23 TO 23B *** ; EDIT 114- REMOVES CODE WHICH CHANGED BAK FILE PROTECTION TO ; STANDARD. CHANGES SEARCH COMMAND TO ACCEPT LOWER CASE ; FS AND FN. PROVIDES FOR $ IN Q REGISTER BY RETURNING ; TO NEXT LEVEL WHEN $ SEEN RATHER THAN REINITIALIZING. ; AREAS AFFECTED: GO, RCH2, ALTMOD, MAC, BKCLS2, ; FILSP2, FCMD, EQM ; EDIT 115- FIXES PERTAIN TO LINE SEQUENCE NUMBER PROCESSING ; CHANGES INSERTION OF 5 SPACES TO 5 SPACES AND TAB ; CHANGES SEQ# CHECK SO THAT 5 SPACES AND TAB ARE ; ACCEPTED AS LINE SEQ# (THIS ELIMINATES THE INSERTION ; AFTER THE FIRST TIME AND ALLOWS THEM TO BE REMOVED ; USING THE /SUPLSN SWITCH) ; AREAS AFFECTED:PPA06, PPA08, ; EDIT 116- CHANGES GARBAGE COLLECTION ROUTINE TO CHECK FOR ; ANYTHING TO SAVE PRIOR TO ATTEMPTING A BLT. ; AREAS AFFEDTED: GCS12 ; EDIT 117- CHANGES SEARCH ROUTINE TO PROVIDE PROPER OPERATION ; OF ^S, TECO'S "WILD DELIMITER", WHEN THE DELIMITER ; IS THE FIRST BUFFER CHARACTER. ; AREAS AFFECTED: S1, S4A, BCOUNT ; EDIT 120- CHANGES OPERATION OF ET COMMAND TO CONFORM TO ; DOCUMENTATION. ET SHOULD SUPPRESS CASE FLAGGING. ; AREAS AFFECTED: TYO ; EDIT 121- PROVIDES WARNING MESSAGE WHEN TECO ; DETECTS SEQUENCED FILE WITH NO LSN SWITCHES. ; ADDS CLEAR OF OUTPUT BUFFER PRIOR TO PACKING ; TO INSURE AGAINST SPURIOUS BIT35 SETTING. ; AREAS AFFECTED: YNKSEQ,PPA05 ; EDIT 122- FIXES HP COMMAND TO SET BIT 35 FOR FIRST ; LINE NUMBER IN THE BUFFER. ; AREAS AFFECTED: HOLE ; EDIT 123- REDEFINES OUTPUT BUFFERS AFTER SECOND OPEN FOR ; FILES WHICH ARE SUPERSEDED. THIS FIXES THE "ADDRESS ; CHECK FOR DEVICE DSK" PROBLEM. ; AREAS AFFECTED: OPNW3 ; EDIT 124- REMOVES THE %SUPERSEDING EXISTING FILE MESSAGE ; FOR NON-DIRECTORY DEVICES AND LIB: FILES. ; AREAS AFFECTED: OPNW2, OPNW3 ; EDIT 125- CORRECTS "ILL MEM REF AT USER PC 403647" BY ADDING ; A CHECK FOR SHORT ERROR MESSAGES USED PRIOR TO ; PERFORMING CORE CONTRACTION. ; AREAS AFFECTED: ERRP7 ; EDIT 126- CHANGES RENAME PROCESSING TO CONFORM TO DATE75 ; STANDARD. ; AREAS AFFECTED: EBAKU1, OPNW33, BKCLS3, BKCLS5 ; EDIT 127- CORRECTS EDIT#114 WHICH FAILED TO KEEP PROTECTION ; OF INPUT FILE AS PROT FOR BAK FILE. ; AREAS AFFECTED: BKCLS2 ; EDIT 130- CORRECTS PROBLEM CAUSED BY EDIT 121. PW COMMAND ; DID NOT WORK SINCE REGISTER "T" WAS NOT SAVED ; CAUSING THE COMMAND TO BE INTERPRETED AS A P COMMAND. ; AREAS AFFECTED: PPA05 ; EDIT 131- CORRECTS PORTION OF EDIT 124 WHICH CHECKED WRONG STATUS ; BIT. AREAS AFFECTED: OPNW3B ; EDIT 132- ADDS CHECK FOR DATA IN Q REGISTER PRIOR TO ALLOWING ; INCREMENT (% COMMAND) AND GENERATES ERROR MESSAGE IF ; ATTEMPTED WITH TEXT. AREAS AFFECTED: PCNT ; EDIT 133- MAKES EB WORK PROPERLY FOR FILES OUTSIDE OF ; USER'S PPN. SHOULD JUST DO ER/EW UNDER THIS ; CONDITION INSTEAD OF TRYING TO RENAME FILES. ; AREAS AFFECTED: EBAKUP ; EDIT 134- CHANGES CALLI AND TTCALL UUO'S TO STANDARD FORMAT ; EDIT 135- REPLACES EDIT 132 TO PUT ERROR MESSAGE IN STANDARD FORM ; AND PROVIDE FOR CHECK ON Q COMMAND AS WELL AS % ; ALSO PROVIDES PROPER OPERATION WITH NEGATIVE INTEGER. ; AREAS AFFECTED: PCNT, QREG ; EDIT 136- GENERAL CLEAN-UP TO MAKE EDIT 123 MORE EFFICIENT, ; REMOVE ROUTINE NOT NEEDED WITH EDIT 133, AND MAKE ; DEVICE DTA WORK PROPERLY. ; AREAS AFFECTED: OPNRD, EBAKUP, OPNWR, BAKCLS, EBS1 ; EDIT 137- ELIMINATES THE CONVERSION OF OLD ALTMODES TO CODE 033 ; IN COMMAND STRINGS IF TTY NO ALTMOD IS SET. ; AREAS AFFECTED: ALTIN, TYI ;EDIT 140- ADDS DEBUG SWITCH WHICH SAVES SYMBOLS, MAKES YANK ; MORE EFFICIENT FOR NNN COMMANDS, AND CLEANS UP ; THE %LINE NUMBER DETECTED MESSAGE ; AREAS AFFECTED: TECO, LIS03, YANK2, YNKSEQ, CMDBAS ; EDIT 141- REMOVE UNNECESSARY PORTION OF EDIT 121 AND ; EDIT 130. WORK ON LINE SEQUENCE NUMBER PROCESSING. ; AREAS AFFECTED:PPA04,PPA05 ; EDIT 142- FIXES COMMAND DISPATCH TABLE ENTRIES FOR CR AND ; LF TO PRESERVE NUMERIC ARGUMENTS. ; AREAS AFFECTED: DTB ; EDIT 143- MAKE CODE FOR Q-REG MORE EFFICIENT. ; AREAS AFFECTED: QREG, QTXTST ; EDIT 144- MAKES EH COMMAND USE STACK PROPERLY. ; AREAS AFFECTED: ERRSET ; EDIT 145- FIXES EW TO OTHER PPN'S. ; AREAS AFFECTED: OPNW33 ; EDIT 146- MAKES EB WORK PROPERLY FOR ERSATZ DEVICES. RENAMES ; DEVICE TO DSK FOR OUTPUT. AREAS AFFECTED: EBAKU2 ; EDIT 147- CHANGES OPEN FOR EB COMMAND TO PHYSICAL ONLY SINCE ; PHYS DEVICE NAME IS IN OPEN BLOCK. THIS IS NECESSARY ; TO ALLOW PROPER OPERATION OF RENAME SEQUENCE. ; AREAS AFFECTED: OPNW4, BKCLS4 ; EDIT 150- MODIFY LSN PROCESSING TO HANDLE SOS PAGE MARKS. ; AREAS AFFECTED: PPA08, PPA13, YANK5 ; EDIT 151- GENERAL CLEANUP OF COMMENTS, ETC. ; EDIT 152- CORRECTS CCL PROCESSING TO ACCEPT SPACES FROM COMPIL ; TO MAKE TECO FOO. COMMANDS WORK. ; AREAS AFFECTED: CCLTM1, CCLIL ; EDIT 153- ADDS SPECIAL CHECK FOR ERSATZ PPN TO INSURE SUPERSEDING ; MESSAGE WORKS FOR SYS:, NEW:, ETC. ; AREA AFFECTED: FILSP7 ; EDIT 154- MAKE EDIT 147 MORE EFFICIENT ; AREAS AFFECTED: OPNW44 ; EDIT 155- DELAY CLEARING EB AND OUTPUT OPEN FLAGS ON EX ; COMMAND IN CASE ERROR OCCURS IN PROCESSING. ; AREAS AFFECTED: CLOSEF ; EDIT 156- ADD ERROR CHECK AND MESSAGE FOR TAG TOO LONG. ; AREAS AFFECTED: OG1 ; EDIT 157- NOT USED (RESERVED) ; EDIT 160- PREVENTS TECO FROM GOING INTO INFINITE LOOP IF ; ERROR FILE IS NOT FOUND AND USER HAS SET 3EH. ; AREA AFFECTED: ERRP5 ; EDIT 161- CHANGES THE WAY <> USE THE STACK TO INSURE PROPER ; GARBAGE COLLECTIOM. ; AREAS AFFECTED: LSSTH, INCMA2 ; EDIT 162- FIXES PROBLEM CAUSED BY EDITS 147, 154, AND 160. ; AREAS AFFECTED: ERRP5, OPNW44, BKCLS4 ;*** CHANGES FROM VERSION 23B TO 24 *** ; EDIT 163- CORRECT OPERATION OF EB WHEN USER HAS CHANGED PATH ; AREAS AFFECTED: EBAKU2 ; EDIT 164- CORRECTS ERROR PRINTOUT PROBLEM WHICH CAN CAUSE RANDOM ; CORE UUO'S TO BE EXECUTED. ; AREAS AFFECTED: ERRP, ERRP0 ; EDIT 165- PROVIDES PRINTING OF LOOKUP ERROR CODE DURING EB ; AREAS AFFECTED: LKUPER ; EDIT 166- CORRECTS PROBLEMS WITH ?NCS ERROR ; AREAS AFFECTED: LIS01, ERRTYP ; EDIT 167- CAUSES SPACES IN ARITHMETIC STRINGS TO BE IGNORED ; EXCEPT AS A + OPERATOR ; AREAS AFFECTED: CD93 ; EDIT 170- CORRECTS TYPEOUT OF Q-REG NAME ON AN IQN ERROR FROM ; AN * COMMAND ; AREAS AFFECTED: LIS03 ; EDIT 171- CORRECTS OPERATION OF EW COMMAND WHEN PPN IS SPECIFIED ; PRIOR TO FILE.EXT ; AREAS AFFECTED: FILSP6 ; EDIT 172- CORRECTLY PUTS BOTH ARGUMENTS, IN A TWO ARGUMENT ; COMMAND (M,N T; M,N X; M,N K), WITHIN BUFFER BOUNDS ; AREA AFFECTED: CHK1 ;EDIT 173- FIXES TWO ARGUMENT P COMMAND TO SET BIT 35 WHEN ; FIRST ARGUMENT IS BEG OF BUFFER OR BEG OF LINE ; AREAS AFFECTED: CHK1, PUNCHR, PUNCH1(DELETED) ;EDIT 174- CORRECTS UIN ERROR CAUSED BY A NULL REPLACEMENT ; ALTMODE DELIMITED F SEARCH FOLLOWED BY AN * ; COMMAND ; AREAS AFFECTED:NOALT; LIS03; LIS02; FND3-1 ;EDIT 175- RE-DO ER,EW,EB,EZ,EM,EF,EX,EG COMMANDS TO UNDERSTAND ; DEFAULT PATHS, SFD'S, ERSATZ DEVICES, LIBRARIES, ; THE /SCAN PATH SETTING, THE FILE DAEMON, ETC. ETC. ; TECO WILL NOW EDIT THE FILE SPECIFIED BY AN EB ; COMMAND IN PLACE, I.E. BOTH THE BAK FILE AND THE EDITED ; SOURCE FILE WILL APPEAR IN THE DIRECTORY THAT THE USER ; SPECIFIED IN THE EB COMMAND. EXCEPTION: IF THE FILE TO ; BE EDITED IS NOT FOUND IN THE AREA SPECIFIED, BUT RATHER ; IN SOME LIBRARY AREA (LIB:, A HIGHER-LEVEL SFD, ON [1,4] ; WHEN NEW: WAS SPECIFIED, ETC.), THEN TECO WILL PRINT THE ; MESSAGE %FILE WAS FOUND IN [P,PN,SFD,SFD...] AND THEN ; TURN THE COMMAND INTO AN ER FROM THE AREA WHERE THE FILE ; WAS ACTUALLY FOUND AND AN EW INTO THE AREA THAT THE USER ; SPECIFIED. AN EB IN PLACE IS OBVIOUSLY NOT REASONABLE FOR ; FILES FOUND IN LIBRARY AREAS, AND THIS ACTION IS THOUGHT TO ; BE MORE REASONABLE THAN A ?FNF-0 ERROR. TECO WILL NOW ALSO ; RESPECT .RBSPL AND .RBNCA (NOT .RBVER - EDITING CHANGES THE ; VERSION) WHEN EDITING A FILE AS A RESULT OF AN EB COMMAND. ; THIS EDIT WAS CAREFUL NOT TO BREAK DECTAPES. ; AREAS: LOTS ;EDIT 176- CORRECTS PROBLEM OF /SUPLSN SWITCH AND NULL CHARACTERS ; IN OUTPUT FILES. CORRECTES PROBLEM OF /GENLSN ; WITH THE M,NP COMMAND AND EX COMMAND. EX PROBLEM CAUSED BY ; EDIT 174. ; AREAS AFFECTED: PPA02; PPA06; PPA13; CHK1 ;EDIT 177- PREVENTS RANDOM CORE UUO CAUSED BY EDIT 164. ; AREAS AFFECTED: ERRP0 ;EDIT 200- CORRECTS SOME MINOR PROBLEMS WITH EDIT 175. TECO.ERR WAS ; SOMETIMES BEING PRINTED INCORRECTLY. REMOVES ERDONE FLAG. ; AREAS AFFECTED: ERDONE,OPNRD,EBAKUP,WTFIL,BAKCLS,EPATH,CCLIL ;EDIT 201- MAKE FS SEARCH FASTER FOR SAME LENGTH ARGUMENTS. ; AREAS AFFECTED: FND ;EDIT 202- CLEAR THE OCTAL NUMBER FLAG ON ILLEGAL OCTAL DIGITS. ; AREAS AFFECTED: CDNUM ;[LAST EDIT IN VERSION 24] ;EDIT 203- INITIALIZE LINE SEQUENCE NUMBER FOR EB COMMAND ; AREA AFFECTED: EBAKUP ;EDIT 204- SAVE/RESTORE REGISTER USED BY TRACE. THIS CORRECTS ; FNF ERRORS FROM ER OR EB COMMANDS IF TRACE IS ON. ; AREA AFFECTED: RCH ;EDIT 205- IMPLEMENT "?AOR ARGUMENT OUT OF RANGE " FOR U COMMAND ; AREA AFFECTED: USE ;EDIT 206- MOVE "RUBSW==0" UP NEAR THE BEGINNING OF THE PROGRAM SO MACRO ; VERSION 53 DOSEN'T COMPLAIN THAT RUBSW WAS REFERENCED ; BEFORE IT WAS DEFINED. ; AREAS AFFECTED:CNTRLR+3,"MISC PARAMETERS"+25 ;EDIT 207- ADD CODE TO CHECK IF THE COMMAND BUFFER NEEDS MEMORY, IN ORDER ; TO STAY WITHIN BOUNDS, UPON INITIALIZATION. ; IF NECESSARY MEMORY IS EXPANDED. ; AREAS AFFECTED:INITG+2 ; EDIT 210- ADD CODE TO MAKE WINNING SEARCHES WITHIN ITERATIONS ; RETURN -1. ; AREAS AFFECTED:FND2+1 ; EDIT 211- FOR THE X COMMAND USE FULL WORDS TO REPRESENT THE BUFFER ; POINTER SO WHEN GREATER THAN 2**18 WE WON'T LOSE. ; AREA AFFECTED: X+4 ; EDIT 212- WHEN DOING A *I COMMAND DON'T GET FOOLED INTO THINKING THAT ; THE COMMAND BUFFER HAS MOVED WHEN A GARBAGE COLLECTION HAS ; OCCURED. ; AREA AFFECTED:X3+6.5 ; EDIT 213- WHEN SEARCHING, LEARN THAT WE ARE DONE WHEN WE EXAMINE ; AND DON'T MATCH A CHARACTER OUTSIDE OF THE ; BUFFER. THIS MAKES ^EL WORK BECAUSE THE BIT MASK ; ISN'T MESSED UP BY ADDITIONAL SEARCH ATTEMPTS. ; AREAS AFFECTED: S3, S4A+4.5 ; EDIT 214- FIX FILE STUFF IN EDIT [175] THAT DOESN'T SUPPORT NON-SFD ; MONITORS. ; EDIT 215- REMEMBER X-MATCH FOR ADDITIONAL SEARCHES. ; AREAS AFFECTED: CD93+8L, SERCHT ; EDIT 216- DON'T OVERFLOW THE SEARCH STRING STORAGE AREA ; WHEN THE 81ST CHARACTER IS ^R OR ^Q. ; AREA AFFECTED: SERCHG ; EDIT 217- GENERATE SOS PAGE MARKS WHEN USING LINE SEQUENCE ; NUMBERS. ; AREAS AFFECTED: PPA06, PPA14 ; EDIT 220- STOP TIMESHARING THE SEQUIN FLAG FOR INPUT AND OUTPUT ; OF SEQUENCED FILES. THIS ELIMINATES THE LOSS OF ; THE FIRST CHARACTER IN A /GENLSN'ED OUTPUT FILE ; IF IT IS A TAB OR A CR. ; AREAS AFFECTED: YANK1, YANK5, YNKSEZ ; EDIT 221- ACCOUNT FOR COMPIL FEATURE WHICH THROWS IN A NULL ; AFTER THE FILE SPEC IN COMMAND LINE. ; AREAS AFFECTED:CCLIL,CCLNUL ; EDIT 222- PREVENT SEARCHES FROM MATCHING A NULL WHEN THE ^^ ; COMMAND IS NOT GIVEN A CHARACTER TO OPERATE ON. ; ADD THE MCO ERROR (MISSING CHARACTER OPERAND). ; AREAS AFFECTED:CNTRU, THE ERR FILE ; EDIT 223- PREVENT SPACE/TAB SEARCHING FROM GOING TO FURTHER BUFFER ; POSITIONS WHEN A CHARACTER HAS ALREADY BEEN FOUND. ; AREAS AFFECTED:SPTB, S4D ; EDIT 224- CLEAN UP SOME COMMENTS AND ADD NEW ONES. ; EDIT 225 - FIX THE MAKE AND TECO COMMANDS BROKEN BY EDIT 221. ; AREAS AFFECTED: CCLDUN ; ; EDIT 226 - MAKE TECO SAVE SYMBOLS IN THE HIGH SEGMENT ONLY ; IF DEBUGGING. ; EDIT 227- REWRITE *I LOGIC BECAUSE IT EXHIBITED A VARIETY ; OF OBSCURE BUGS. ; AREAS AFFECTED: LIS01, LIS03, TIMES, ERRTYP ;230 GIVE A WARNING MESSAGE IF OUTPUT IS TO DEVICE NUL: ; AREA AFFECTED: OPNWR0 ;231 IMPLEMENT "EC" COMMAND TO PREVENT TECO FROM MAKING ; ALL SEARCHES WITHIN ITERATIONS INTO ; COLON-SEARCHES. ; 0EC MAKES ITERATION-SEARCHES COLON-SEARCHES. ; NEC FOR ANY NON-ZERO N, MAKES ITERATION-SEARCHES ; NON-COLON SEARCHES. ; EC RETURNS CURRENT SETTING. ; ; AREAS AFFECTED: ECTABL, FND2, COLOIT. ; (COLOIT IS A NEW ROUTINE) ;232 DON'T SUPERCEDE OUTPUT FILE WHEN ?FNF ERROR OCCURS AFTER ; "MAKE OUTFIL=INFILE" COMMAND. ; AREA AFFECTED: ERRP6 ;VERSION 24 (DISPLAY TECO... JUD LEONARD) ; EDIT 162- SCREEN FEATURES FROM ERIC OSMAN'S TV ; EDIT 163- FIX TTYSET TO TURN OFF FREE CRLF, NOT ON. ; EDIT 164- FIX VT05 FILL SEQUENCE TO USE RUBOUT RATHER THAN NULL ; AS FILLER. DAS87 DISCARDS NULLS. ; AREA AFFECTED: CNFILL+2 ;Version 25(233) RDH 19-Sep-79 ; ;233 Use 700 series monitor terminal types, don't enquire ; directly of terminal; add "EA" = Edit All command, read in ; entire file (with s etc.); don't set "." to "B" on a search ; failure - rather preserve "." across the failure; write crash ; recovery file nnnTEB.TMP; add "E@" = Edit At (indirect) to ; read commands from file (such as nnnTEB.TMP); support ANSI ; terminals (VT100); add space (as first char typed) to scroll ; through text, to do a "1L$$"; add "\\" as octal mode "\". ; ;234 RDH 24-Dec-79 ; Implement dump mode I/O for disk (read/write entire file in one ; giant I/O operation). Initial load with SCAN/WILD (only to read ; SWITCH.INI at the moment, but . . .). Add SWITCH.INI switchs: ; /EAMODE:[ON/OFF] Default dump in entire file ; /OKLSN Don't worry about LSN's in EAMODE ; /OKNULL Don't worry about null's in EAMODE ; /INITFILE:file Process "file" as command file on startup ; Add "EP" to write out (using dump mode if possible) file and then ; "EF" it (like "EX" but without THE EXIT). Add ^H (backspace) to ; scroll backwards (a backwards space). Rename crash recovery file ; to be nnnTEC.CMD (so LOGOUT doesn't delete it!). Add to put ; cursor on current screen (if not already there a la back/space). ; ;235 RDH 5-Feb-80 ; Obscure bug in memory management on ?Core cap exceeded errors. ; Revise [205] to allow Q-reg text anywhere in addressable memory ; Q-reg numerical values can range to approx +- 25 billion. ; ;236 RDH 18-Feb-80 ; Implement "arrow" keys. Various and sundry minor bugs. ; ;237 RDH 28-Feb-80 ; Don't allow 0-length inserts. Make command part of normal ; insert command (saves call to NROOM to expand buffer by 1). ; ;240 RDH 4-Mar-80 ; More junky little bugs: Q-reg relocation bug; If core expansion ; fails acs get trounced (F2 in particular, which causes all ; further SFD references to fail - this is also regular TECO bug). ; Modernize command editing - ^R to retype, ^W to rubout a word, ; ^V to quote next character, ^A/^B to do lower/upper case (it's ; what TV does, and seems as good as any other idea); TECO'S EO ; value is now 3, setting EO=2 reverts to old editing characters. ; ;241 RDH 26-Apr-80 ; Trash left on screen in obscure situations (due to CNTLF being ; called for character that wasn't echoed - either from command ; file or first char typed in command string). Add crash recovery ; file control - /CRFILE:file names the file, /CRPROT:nnn gives ; the protection, /CRDISP:NEVER!TEMPORARY!DELETE!PRESERVE to [not] ; delete the crash file, /CRSAVE:n to update the recovery file ; every "n" characters, modulo line breaks. ; ;242 RDH 20-May-80 ; Assorted buggies. ; ;243 MHK 2-Jun-80 ; Implement University of Texas search algorithm which includes the ; following features: ; 1) 10 times faster searching (forward direction) ; 2) backwards searches (using old TECO method) ; 3) bounded searches ; 4) FK searches (Find and Kill specified string) ; ;244 DPM 13-Jun-80 ; With all the various flavors of TECO floating around, finding the ; correct TECO.ERR file is nearly impossible. Solution: don't depend ; on an error file for messages. Implement $INFO, $WARN, and $FATAL ; macros to generate verbosity controlled messages. ; RDH 15-Jul-80 ; "FD$" to find and delete matched string, "FK$" to find ; string, then delete from previous "." inclusively through to new ; "."; "FR$" to delete last string and replace with ; ; "FV" to return last string value (size of string); and "F_" as ; similar to "FS" on general principles. Allow user to specify /RUN ; in SWITCH.INI (if he does, he deserves whatever he gets). Change ; "EP" to "EC" for compatibility with "-11/etc." TECO's, and always ; zero the buffer on exit. Add "EK" to kill current output file. ; Make "1+:Sblah$" type expressions work (":" commands imply a ; free "()" sequence, which includes PUSHing SARG). Ill mem ref ; from "FS" search (day one bug) - must call NROOM after setting new ; COMCNT/COMPTR. Don't do TEBJ sequence if nested into a command file ; ('s from command file cause nnnJ$$ to appear in nnnTEB file, ; which are not re-executed until after the entire command file ; is completed). ; ;245 RDH 24-Sep-80 ; Minor bug(s). ; ;246 RDH 24-Feb-81 ; Use TERMINAL LENGTH/STOP if available. ; ;247 RDH 21-Apr-82 ; Add VK100/VT101/VT102/VT125 terminal types (equivalent to VT100). ; ;250 RDH 22-Jul-82 ; Edit 217 will lead to I/O Address Check for certain bizarre ; files (e.g., a TOPS-20 DUMPER tape) - if a break character ; appears within a few characters of end of I/O buffer and input ; file LSNs exist. Note: an unexpected side "aspect" of this edit ; is that the "cleaned-up" code now generates LSNed files that ; are approximately .2% smaller than before (re standard TECO - ; which liked to leave random nulls sprinkled in the output file). ; In particular, while the files will FILCOM, they will not match ; using DIRECT/CHECKSUM! ; ;251 RDH 22-Aug-82 ; i,jP commands appended characters to output stream (this ; was caused by an earlier edit to clean up some code - not a problem ; with standard TECO sources). ; ;252 RDH 28-OCT-82 ; Preserve file version (.RBVER) for EB files. This applies even ; to faked ER/EW files, but does not apply to explicit user ER/EW ; sequences (i.e., if the user types "EB" the version is preserved, ; if the user types "ER" and/or "EW" the version is zero). ;DTECO %25(252) Released with 7.02 (as a tool) Spring, 1984 ;253 RDH 22-Jun-84 ; Add VT103/VT180/VT185/VT220/VT240 as more ANSI klones. ; ;254 RDH ; Version 26 ; Change over to SWIL (replace SCAN/WILD); first pass at running in ; extended addressing. (Also note the /SFT switch added, but forgotten ; in the edit history...); add "EP" command to PUSH to a new context; ; ;255 RDH 16-Feb-85 ; Don't do moby dump I/O except for disk devices (LPTs for example ; get annoyed); other assorted little buggies of little import. ; Some source cleanup (remove ancient edit numbers). ; ;256 RDH 22-Feb-85 ; Make n% add value "n" to q-register ; Make n^T type out ; ASCII character of value "n". Both are under control of EO=3. ; ;257 LEO 20-SEP-85 ; Copyrights. ; ;[END OF REVISION HISTORY] ;DEFAULT DEFINITIONS FOR ASSEMBLY SWITCHES & PARAMETERS: ND ERRMSG,2 ;MEDIUM LENGTH ERROR MESSAGES ND AUTOFS,0 ;DEFAULT IS NON-AUTOTYPE AFTER SEARCHES ND TYCASW,0 ;DEFAULT TYPE-OUT MODE CAUSES FLAGGING OF ;CHARACTERS IN THE LOWER CASE RANGE WITH ' ND SRCHSW,0 ;DEFAULT PREVAILING SEARCH MODE IS ACCEPT ;EITHER LC OR UC ALPHABETICS AS A MATCH ND SRCHMX,^D200 ;MAXIMUM CHARACTERS IN A SEARCH STRING ND EOVAL,3 ;THE STANDARD SETTING OF THE EO FLAG FOR ;THIS VERSION IS 3 (^R/^W/^U EDITING) ND BUGSW,1 ;STANDARD IS SAVE SYMBOLS ND TEBPRT,077 ;DEFAULT CRASH FILE PROTECTION ND TEBSAV,^D128 ;UPDATE CRASH RECOVERY FILE EVERY TEBSAV CHARS ; (CAN BE OVERRIDDEN VIA /CRSAVE:NNN) ND HIORGP,600 ;HIGH SEG ORIGIN PAGE ND CSECTN,1 ;CODE SECTION FOR EXTENDED ADDRESSING ND DSECTN,3 ;DATA SECTION FOR EXTENDED ADDRESSING ND LSECTN,6 ;LAST SECTION FOR EXTENDED ADDRESSING ; (LSECTN+1 = FIRST FREE SECTION) ND PDLEN,^D200 ;LENGTH OF PROGRAM STACK ND LPF,40 ;32 WORD Q-REGISTER PDL ND QRGMAX,44 ;NUMBER OF Q-REGISTERS (A-Z; 0-9) ND CMFMAX,4 ;LEVELS COMMAND FILES MAY NEST. ND XSPGMX,4 ;MAXIMUM "IDLE" PAGES TO CARRY AROUND ;ANY IN EXCESS WILL BE DEALLOCATED ND RMWAIW,1000 ;RANDOM MEMORY ALLOCATION INCREMENT (WORDS) ND COMAIW,200 ;COMMAND BUFFER ALLOCATION INCREMENT (WORDS) ND TMPBSZ,200 ;SIZE OF TMPCOR BUFFER ND DSKBFN,3 ;NUMBER OF INPUT BUFFERS ND DSKBSZ,^D128 ;SIZE OF DISK INPUT BUFFERS ; THIS UTILIZES ONE PAGE OF BUFFER SPACE. ; TECO IS SUFFICIENTLY COMPUTE BOUND THAT ; USING MANY/LARGE BUFFERS DOES NOT RUN ; ANY FASTER. ND TTIBFN,1 ;NUMBER OF TERMINAL INPUT BUFFERS ND TTIBSZ,30 ;SIZE OF TERMINAL INPUT BUFFER(S) ND TTOBFN,2 ;NUMBER OF TERMINAL OUTPUT BUFFERS ND TTOBSZ,100 ;SIZE OF TERMINAL OUTPUT BUFFERS ND TTLMAX,^D36 ;MAXIMUM SCREEN LENGTH WE CAN HANDLE ND TTWMAX,^D132 ;MAXIMUM SCREEN WIDTH WE CAN HANDLE WINDEX==</5>+1;INTERNAL LINE STORAGE ALLOCATION SIZE WINTOP==TTLMAX*WINDEX ;INTERNAL SCREEN STORAGE ALLOCATION SIZE ND RUN603,0 ;ALLOW TO RUN UNDER 6.03 MONITORS ND TTY603,'VT52 ' ;TERMINAL TYPE TO USE FOR 6.03 ;ACCUMULATOR ASSIGNMENTS FF= 0 ;CONTROL FLAGS T= 1 TT= 2 ;*** TT AND TT1 MUST BE ADJACENT *** TT1= 3 A= 4 ;*** A, AA AND B MUST BE CONTIGUOUS AND IN THAT ORDER *** AA= 5 ;TYPE-IN POINTER TO COMMAND BUFFER & SEARCH TABLE INDEX B= 6 ;*** B AND E MUST BE ADJACENT *** E= 7 C= 10 D= 11 F2= 12 ;MORE CONTROL FLAGS I= 13 ;"INPUT" CHARACTER ADDRESS OU= 14 ;"OUTPUT" CHARACTER ADDRESS (MUST BE I+1) CH= 15 ;CHARACTER AC PF= 16 ;Q-REGISTER PDL PTR P= 17 ;PROGRAM STACK ;DIFFERENT AC DEFINITIONS FOR INTERFACING WITH SCAN/WILD ;THESE WILL HAVE TO BE RECONCILED WITH TECO'S CONVENTIONS SOMEDAY T1=1 ;TEMP ACS T2=T1+1 T3=T2+1 T4=T3+1 P1=5 ;PERM ACS P2=P1+1 P3=P2+1 P4=P3+1 ;CONTROL FLAGS ;RIGHT HALF - AC FF ALTF== 1B35 ;ALT-MODE SEEN ARG2== 1B34 ;THERE IS A SECOND ARGUMENT ARG== 1B33 ;THERE IS AN ARGUMENT SLSL== 1B32 ;@ SEEN PCHFLG==1B31 ;N SEARCH COLONF==1B30 ;COLON SEEN COLONP==1B29 ;FREE "()" DUE TO COLON MODIFIER IN EFFECT SYLF== 1B28 ;SYLLABLE FLAG XPLNFL==1B27 ;HAVE TYPED EXTENSION OF ERROR MESSAGE ALREADY EMFLAG==1B26 ;HAVE TYPED 1ST LINE OF ERROR MESSAGE FINDR== 1B25 ;LEFT ARROW SEARCH QMFLG== 1B24 ;PROCESSING ERROR MESSAGE SEQUIN==1B23 ;OUTPUT: AFTER EOL NEXT 5 CHARS ARE SEQ # TRACEF==1B22 ;? SEEN SEQF== 1B21 ;SEQUENCE NUMBER SEEN ON INPUT BELLF== 1B20 ;^G SEEN ; 1B19 ;FREE FORM== 1B18 ;A FORM FEED TERMINATED THE LAST YANK OR APPEND COMMAND ;LEFT HALF - AC FF F.NNUL==1B17 ;NON-NULL INSERT STRING (MIGHT BE ONLY ^V, SAY) PMATCH==1B16 ;PREVAILING MATCH MODE TABSRT==1B15 ;TABBED INSERT ( COMMAND) TIBKA== 1B14 ;INPUT IN [BREAK ON ALL] CHARACTER MODE TINEC== 1B13 ;DON'T ECHO INPUT CHARACTERS TMPFLG==1B12 ;TMPCOR UUO ALLOWED FINF== 1B11 ;INPUT CLOSED BY EOF UREAD== 1B10 ;INPUT FILE IS OPEN UWRITE==1B09 ;OUTPUT FILE IS OPEN CFOF== 1B08 ;COMMAND FILE OPEN, USE IT RATHER THAN TTY EZTMP== 1B07 ;THIS COMMAND IS EZ, NOT EW FEXTF== 1B06 ;FILE EXT EXPECTED (.TYPED). UBAK== 1B05 ;EB IN EFFECT ; 1B04 ;FREE TYOF== 1B03 ;NEED TO OUTPUT A BUFFER TYOCTF==1B02 ;ALLOW CONTROL CHARS TYPED WITHOUT "^" CCLFLG==1B01 ;TECO COMMAND REQUESTS Y AFTER EB ;CONTROL FLAGS ;RIGHT HALF - AC F2 CTLVA== 1B35 ;^V/A SEEN INSIDE TEXT CTLVVA==1B34 ;DOUBLE ^V/A SEEN INSIDE TEXT CTLWB== 1B33 ;^W/^B SEEN INSIDE TEXT CTLWWB==1B32 ;DOUBLE ^W/^B SEEN INSIDE TEXT XMATCH==1B31 ;EXACT MATCH SEARCH MODE EMATCH==1B30 ;TEMPORARILY ACCEPT EITHER UPPER OR LOWER CASE LINCHR==1B29 ;TTY LINE HAS LC BIT ON TYMSGF==1B28 ;TYPE MESSAGE WITH NO CASE FLAGGING OCTALF==1B27 ;OCTAL RADIX CQUOTE==1B26 ;QUOTE THE NEXT COMMAND CHARACTER SKIMRF==1B25 ;WATCH FOR ^R WHEN SKIMMING SKIMQF==1B24 ;WATCH FOR ^Q WHEN SKIMMING NOTRAC==1B23 ;DISABLE TRACING TYSPCL==1B22 ;TYPE , ETC INSTEAD OF PRINTER CONTROLS SKANFS==1B21 ;SKANNING FS OR FN TXTCTL==1B20 ;NO CONTROL COMMANDS IN TEXT EXCEPT ^T, ^R LCASE== 1B19 ;CONVERT UPPER CASE TO LOWER CASE BY DEFAULT UCASE== 1B18 ;CONVERT LOWER CASE TO UPPER CASE BY DEFAULT XCASE==UCASE!LCASE!CTLVA!CTLVVA!CTLWB!CTLWWB ;ANY CASE CONTROL ;LEFT HALF - AC F2 GOING== 1B17 ;A COMMAND STRING HAS BEEN SEEN DOING== 1B16 ;AND IS BEING EXECUTED NOW CTXN== 1B15 ;^N IN SEARCH ARGUMENT NOALT== 1B14 ;DON'T CONVERT OLD ALTMODES TO 033 NALTFS==1B13 ;NULL REPLACEMENT ALTMODE DELIMITED F SEARCH SFDS== 1B12 ;SUB FILE DIRECTORIES ARE IN EFFECT LSNINF==1B11 ;IGNORE CHAR AFTER SEQ# IF IT'S A TAB OR CR ;REPLACES USE OF SEQUIN LSNF== 1B10 ;A LSN WAS SEEN SOMETIME IN THE TEXT BUFFER CBTMF== 1B09 ;CLEAR TO EOS IN GO BEFORE CLIS S.MINS==1B08 ;MINUS SEARCH S.REPL==1B07 ;FIND AND REPLACE SEARCH S.DELE==1B06 ;FD COMMAND S.KILL==1B05 ;FK COMMAND S.FRCM==1B04 ;FR COMMAND ;CHARACTER ECHO CONTROL FLAGS EC$UPA==1B0 ;ECHO AS ^X EC$SLF==1B1 ;ECHO AS SELF EC$DLR==1B2 ;ECHO AS "$" EC$CRL==1B3 ;ECHO WITH APPENDED ;I/O CHANNELS INCHN== 2 OUTCHN==3 TTYCHN==4 ;CHANNEL FOR TTY IO TTYIOS==IO.FCS+.IOASC ;BASIC TTY I/O MODE CCLCHN==5 ;CHANNEL FOR THE CCL TMP FILE ERRCHN==6 ;CHANNEL FOR ERROR MESSAGE FILE TEBCHN==7 ;CRASH RECOVERY FILE I/O CHANNEL CMFCHN==10 ;COMMAND ("E@") FILE I/O CHANNEL ;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 SMATXN==^D131 ;Number of characters in the search matricies BITMLN==SMATXN/^D36+1 ;Number of words needed to hold SMATXN bits STABLN==^D131 ;LENGTH OF SEARCH TABLE GCTBLN==100 ;GARBAGE COLLECTION TABLE(S) SIZE EO21==1 ;TECO %22+ FEATURES EO25==2 ;TECO %25+ NEW HANDLING OF ^R, ^W, ^V, ^G; ^T AND % COMMANDS FXVRSN==<12,,%%FXVE> ;SCAN/WILD PROTOCOL VERSION BLKSIZ==200 ;SIZE OF DISK BLOCK IN WORDS PAGSIZ==1000 ;SIZE OF MEMORY PAGE IN WORDS PG2WRD==^D9 ;LSH OF PAGE ADDRESS TO WORD ADDRESS WRD2PG==-^D9 ;LSH OF WORD ADDRESS TO PAGE ADDRESS ;OPERATORS ;TEMP (HA!) OPDEF IFIW [1B0] .NODDT IFIW ;KEEP SETZ OPCODE IFX2EF==^D17-^D05 ;LSH FOR IFIW INDEX TO EFIW INDEX ;CHECK EO FLAG: CHKEO EO#,ADDR ;IF EOFLAG GREATER THAN EO#, RETURN AT CALL+1 ;OTHERWISE GO TO ADDR ; OPDEF Local UUOS ; OPDEF MSG. [1B8] ;Verbosity controlled message processor OPDEF CHKEO [20B8] ;EO flag checking ; Macro to generate a comment message ; DEFINE $INFO (PFX,ADR,TXT),< MSG. 0,[''PFX'',,[ASCIZ |TXT|] IFB , IFNB , ] > ; Macro to generate a warning message ; DEFINE $WARN (PFX,ADR,TXT),< MSG. 1,[''PFX'',,[ASCIZ |TXT|] IFB , IFNB , ] > ; Macro to generate a fatal message ; DEFINE $FATAL (PFX,ADR,TXT),< MSG. 2,[''PFX'',,[ASCIZ |TXT|] IFB , IFNB , ] > ;MACRO TO DEFINE DATA LOCATIONS DEFINE U(A,B)< RELOC A: BLOCK B RELOC > SUBTTL Program entry and initialization TWOSEG U LOCORE,0 ;START OF DATA AREA COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1984,1986. ALL RIGHTS RESERVED. \ ;END COPYRIGHT\ TECO: TDZA B,B ;NORMAL PROGRAM ENTRY MOVNI B,1 ;THE CCL ENTRY RESET ;INITIALIZE ALL IO MOVE P,[IOWD PDLEN,PDLST] ;INITIALIZE STACK SKIPN CH,SECTN ;WERE WE RUNNING EXTENDED (^C, START)? JRST TECO01 ;NO HRRI CH,TECO05 ;YES XJRST CH ;SO GET BACK TO DESIGNATED PC SECTION ;SELECT A SECTION IF FEASIBLE TECO01: XMOVEI CH,777 ;GET CURRENT PC SECTION HLRZ CH,CH ;REDUCE TO JUST SECTION NUMBER JUMPE CH,TECO02 ;IF IN SECTION 0 (NORMAL) JUST INITIALIZE CAIN CH,CSECTN ;WERE WE MAGICALLY STARTED IN CODE SECTION? JRST TECO05 ;YES, ALL SET HERE, NO FINAGALING NEEDED OUTSTR [ASCIZ\? DTECO knows better than you in which section to run!\] EXIT ;PISS ON MEDDLING USER ;RUNNING IN SECTION 0, TRY FOR DESIGNATED EXTENDED PC SECTION (CSECTN) TECO02: MOVE TT1,[PA.GMS!<0,,CSECTN>] ;MAP SECTION 0 INTO SECTION CSECTN MOVEI TT,1 ;ONLY MAP ONE SECTION MOVE T,[.PAGSC,,TT] ;PAGE. ARG POINTER TO PAGE. T, ;TRY FOR EXTENDED PC SECTION JRST TECO05 ;NOPE, OH WELL, NO BIG DEAL XJRST [CSECTN,,TECO05];GOT IT ;RESET MEMORY (IN CASE ^C, START) TECO05: SETZB FF,F2 ;INITIALIZE FLAGS SETZM LOCORE ;CLEAR DATA IN CASE OF ^C,ST MOVE A,[XWD LOCORE,LOCORE+1] ;BLT POINTER TO BLT A,LOWEND-1 ;CLEAR IMPURE STORAGE MOVEM B,CCLSW ;REMEMBER HOW WE WERE STARTED ;FLAG RUNNING EXTENDED OR SECTION-0 (E.G., 7.02, KS10, ETC.) XMOVEI A,777 ;CURRENT PC SECTION HLLZM A,SECTN ;REMEMBER CURRENT PC SECTION LSH A,WRD2PG ;MAKE "PAGE NUMBER" OFFSET ;*** ;MUST USE SECTION 0 PAGE ADDRESSES!!! ;*** MOVEM A,SECTNP ;REMEMBER PC SECTION PAGE OFFSET ;GET RID OF DANGLING I/O BUFFER PAGES AND THE LIKE MOVE TT,.JBREL ;HIGHEST LOCATION IN LOW SEGMENT ADDI TT,PAGSIZ-1 ;ROUND UP AND LSH TT,WRD2PG ;TRUNCATE TO PAGE ADDRESS MOVEI T,HIORGP-1 ;FIRST PAGE IN HIGH SEGMENT SUB T,TT ;MAKE COUNT OF PAGES THAT SHOULDN'T EXIST JUMPE T,TECO07 ;NO PAGES TO DELETE ADD TT,A ;RELOCATE TO PAGES IN CURRENT SECTION PUSHJ P,PGZAP ;MAKE SURE PAGES DON'T EXIST HALT . ;BLETCH ;GET RID OF DANGLING DATA SECTIONS TECO07: SKIPN SECTN ;RUNNING EXTENDED JRST TECO10 ;NO MOVEI T, ;MAX DATA SECTIONS POSSIBLE MOVEI TT,DSECTN ;FIRST POSSIBLE DATA SECTION PUSHJ P,PSZAP ;MAKE SURE THEY DON'T EXIST HALT . ;EXTENDED BLETCH ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE TECO10: PUSHJ P,TTOPEN ;GO OPEN TTY PUSHJ P,GETTYP ;FIGURE OUT WHAT KIND OF SCREEN PUSHJ P,TTYGET ;GET AND REMEMBER INITIAL TTY MODES MOVEI A,1 ;SET TABS MOVEM A,OURTAB ;SET NO TAB CONVERSION MOVEM A,OURFCR ;SET NO FREE CRLF MOVEM A,OURDEM ;SET DEFERRED ECHO MODE SETZM OURBLN ;SET NO BLANK SUPPRESSION SETZM OURPSZ ;SET PAGE 0 SETZM OURSTO ;SET NO STOP PUSHJ P,TTYSET ;SETUP TECO TERMINAL CHARACTERISTICS SKIPE SCTYPE ;IF VIDEO SCREENING PUSHJ P,CLRSCN ;THEN CLEAR SCREEN MOVSI A,(ASCII */\*) MOVEM A,PTRCHR ;WHAT POINTER LOOKS LIKE ON SCREEN SETOM SCH ;SO FIRST CHARACTER IS TTYED PUSHJ P,UUOINI ;INITIALIZE UUO HANDLER HALT . ;CAN'T RECOVER FROM THIS PUSHJ P,PSIINI ;INITIALIZE PSI SERVICE (^C TRAP IN PARTICULAR) HALT .+1 ;CAN'T INIT PSI???? ;*** THIS IS A KROCK, BUT WHAT CAN I SAY? MOVE A,[BOSWT,,BOSWT+1] ;START OF SWITCHES BLOCK SETOM BOSWT ;INITIALIZE SWITCHES BLT A,EOSWT ;TO NO VALUE SEEN FLAG JSP OU,CALLSW ;CALL SCAN/WILD ISLEN,,ISBLK ;MOVE T1,[ISLEN,,ISBLK] IFIW .ISCAN## ;PUSHJ P,.ISCAN## JSP OU,CALLSW ;CALL SCAN/WILD OSLEN,,OSBLK ;MOVE T1,[OSLEN,,OSBLK] IFIW .OSCAN## ;PUSHJ P,.OSCAN## ;*** END OF THE KROCK ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE TECO20: MOVE TT,.JBFF ;FIRST FREE LOSEG LOCATION MOVEM TT,RMWBAS ;BECOMES BASE FOR RANDOM MEMORY ALLOCATION MOVEM TT,RMWEND ;SET END ADDRESS FOR RANDOM MEMORY SKIPE SECTN ;RUNNING EXTENDED? MOVSI TT,DSECTN ;YES, SELECT FIRST DATA SECTION AS BASE ADDRESS MOVEM TT,CMDBAS ;SET BASE ADDRESS FOR COMMAND BUFFER MOVEM TT,CMDEND ;ALSO END ADDRESS FOR COMMAND BUFFER SO FAR MOVSI T,(POINT 7,0,-1);PROTOTYPE BYTE POINTER SKIPE SECTN ;PC IN EXTENDED SECTION? TLOA T,(1B12) ;YES, USE DOUBLE-WORD BYTE POINTER HRR T,TT ;NO, USE SINGLE-WORD BYTE POINTER DMOVEM T,CMDPTR ;SET MASTER COMMAND BUFFER BYTE POINTER IMULI TT,5 ;CONVERT TO TEXT ADDRESS MOVEM TT,QRBUF ;SET Q-REG/ETC BASE ADDRESS MOVEM TT,BEG ;SET BEGIN ("B") ADDRESS OF EDITING TEXT MOVEM TT,PT ;SET CURSOR (".") ADDRESS WITHIN EDITING TEXT MOVEM TT,Z ;SET END ("Z") ADDRESS FOR EDITING TEXT SKIPN SECTN ;RUNNING EXTENDED? SKIPA TT,.JBREL ;NO, LOCAL CURRENT MEMORY LIMIT (WORDS) HRLOI TT,DSECTN-1 ;YES, GLOBAL CURRENT MEMORY LIMIT (WORDS) IMULI TT,5 ;CURRENT MEMORY LIMIT (CHARACTERS) MOVEM TT,MEMSIZ ;SET END ADDRESS FOR Q-REG/TEXT MEMORY SETOM MESFLG ;ON STARTUP THE SCREEN IS ALL MESSED UP! ; THIS WILL FORCE INITIALIZATION OF SCRN?? ; VARIABLES ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE TECO30: MOVE A,[F%FDAE&<-1,,0>!.GTFET] ;GETTAB FTFDAE GETTAB A, ;NEED TO KNOW IF FILE DAEMON SETZ A, ;MONITOR FOR EB STUFF SETZM FDAEM ;ASSUME NOT TXNE A,F%FDAE&<0,,-1>;FILE DAEMON MONITOR? SETOM FDAEM ;YES, SIGN BIT OF .RBPRV CHANGED MOVE C,[%FTSTR] ;FIND OUT IF SFDS ARE USED GETTAB C, ;... JRST .+2 ;ASSUME SO TXNE C,F%SFD &<0,,-1>;SFDS HERE? TXO F2,SFDS ;YES, SET THE FLAG MOVE A,.MYJOB## ;GET OUR JOB NUMBER MOVEI C,3 ;WANT THREE DIGITS' WORTH TECO40: IDIVI A,12 ;CONVERT JOB NUMBER TO SIXBIT ADDI AA,20 LSHC AA,-6 SOJG C,TECO40 HRRI B,'TEC' ;FORM NAME ###TEC MOVEM B,TMPTEC ;SAVE HRREI A,TYCASW ;GET DEFAULT TYPE-OUT CASE FLAGGING MODE MOVEM A,TYCASF ;AND MAKE IT CURRENT HRROI A,.GTLIM ;THE "BATCH" JOB TABLE GETTAB A, ;READ MONITOR INFORMATION SETZ A, ;DUH? TXNE A,JB.LBT ;ARE WE A BATCH JOB? SKIPGE A,S.EOBA ;YES, GET BATCH EO VALUE MOVE A,S.EOMO ;NO (OR NO /EOBATCH), GET TIMESHARING EO CAIG A,EOVAL ;USER GIVE AN EOVAL WITHIN REASON? CAIGE A,0 ;DID USER SPECIFY EITHER /EOMODE OR /EOBATCH? MOVEI A,EOVAL ;NO, PICKUP SYSTEM DEFAULT MOVEM A,EOFLAG ;AND SET OUR EO RUNTIME VALUE MOVEM A,EOFLAG HRREI A,ERRMSG-2 ;SET ERROR MESSAGE TYPE INDICATOR MOVEM A,ERRLEN ;-1=SHORT, 0=MEDIUM, +1=LONG HRREI A,AUTOFS ;INIT AUTOTYPE-AFTER-SEARCHES FLAG MOVEM A,AUTOF ;FALL THROUGH TO NEXT PAGE ;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. TECO50: MOVEI A,SYL MOVEM A,DLIM ;DLIM:=SYL MOVEI FF,0 ;CLEAR FLAG REGISTER IFN SRCHSW, ;MAKE EXACT MODE CURRENT XMOVEI T,RENTR ;OUR "REENTER" ADDRESS MOVEM T,.JBREN ;SET IT UP TOO JRST GO ;START TECO'ING SUBTTL REENTER COMMAND RECOVERY RENTR: MOVE P,[IOWD PDLEN,PDLST] ;[RE]INITIALIZE PUSHDOWN STACK SKIPN CH,SECTN ;RUNNING EXTENDED ADDRESSING? JRST RENTR1 ;NO HRRI CH,RENTR1 ;YES XJRST CH ;[RE]ENTER SELECTED PC SECTION RENTR1: PUSHJ P,TTOPEN ;GO [RE]OPEN TERMINAL CHANNEL PUSHJ P,GETTYP ;FIND OUT WHAT TYPE OF TERMINAL WE NOW HAVE PUSHJ P,TTYGET ;GET AND REMEMBER TTY MODES BECAUSE USER ;MAY HAVE CHANGED THEM WHILE AT MONITOR LEVEL PUSHJ P,TTYSEC ;RESTORE OUR OWN MODES ;FAKE OUT THE CRASH FILE MOVEI CH,.CHBEL ;A ^G CHARACTER PUSHJ P,TEBCHR ;STUFF IN FIRST ^G PUSHJ P,TEBCHR ;A SECOND ^G IN CASE THE FIRST GETS CAUGHT ; BY A "DANGLING" ^V IN THE CRASH FILE MOVEI CH,.CHCNU ;A ^U CHARACTER PUSHJ P,TEBCHR ;ABORT LAST POSSIBLE PARTIAL COMMAND PUSHJ P,TEBJ ;ISSUE NNNJ$$ COMMAND SO WE KNOW WHERE WE ARE ;OTHER RANDOM CLEANUP PUSHJ P,TYICNR ;ZAP COMMAND FILE (IF ANY) SETOM SCH ;SO CHARACTER COMES FROM TTY SETOM MESFLG ;ASSUME DISPLAY IS AMUCK SETZM WINFLG ;SO DISPLAY HAPPENS SETZM VFREEZ ; . . . ;RESUME TECO'ING XMOVEI T,GO ;ADDRESS FROM WHENCE TO RESUME MOVEM T,PSICCV+.PSVOP ;SET FOR DEBRK. TO SEE DEBRK. ;ALLOW FURTHER CONTROL-C'S JRST GO ;MUST HAVE BEEN ?ILL MEM REF OR SUCH JRST GO ; WHICH TOOK US TO MONITOR LEVEL ;SCAN/WILD INTERFACE STUFF ;CALLSW -- CALL A SCAN/WILD ROUTINE ;CALL IS: ; ; JSP OU,CALLSW ; ; ; NON-SKIP RETURN ; SKIP RETURN ; ;WHERE IS THE ARGUMENT TO BE PASSED IN SCAN'S T1; AND IS ;THE ROUTINE TO BE CALLED. ; ;SKIP OR NON-SKIP RETURN IS PRESERVED. ; ;PRESERVES ALL ACS. CALLSW: PUSH P,T1 ;SAVE PUSH P,T2 ; SCAN'S PUSH P,T3 ; VOLATILE PUSH P,T4 ; ACS MOVE T1,(OU) ;FETCH T1 ARGUMENT PUSHJ P,@1(OU) ;CALL SCAN/WILD ROUTINE HRRI OU,-1(OU) ;NON-SKIP RETURN DMOVEM T1,SCNT1 ;SAVE WHAT SCAN RETURNED US DMOVEM T3,SCNT3 ; . . . POP P,T4 ; RESTORE POP P,T3 ; SCAN'S POP P,T2 ; VOLATILE POP P,T1 ;ACS JRST 3(OU) ;RETURN TO CALLER U SCNT1,1 ;SCAN'S RETURNED T1 U SCNT2,1 ; AND T2 U SCNT3,1 ; AND T3 U SCNT4,1 ; AND T4 ;TECO/SCAN CHARACTER I/O ;SCNTYI -- RETURN ONE COMMAND INPUT CHARACTER SCNTYI: MOVEI P4,.CHLFD ;HMMM POPJ P, ;GO AWAY AGAIN ;SCNTYO -- TYPE ONE COMMAND TERMINAL CHARACTER SCNTYO: PUSHJ P,TECCTX ;SWITCH TO TECO ACS PUSH P,CH ;SAVE A REG PUSH P,A ; AND ANOTHER REG PUSH P,AA ; AND YET ANOTHER REG MOVE CH,SCNACS+T1 ;THE CHARACTER SCAN WANTS TO OUTPUT PUSHJ P,TYOM ;TYPE A CHARACTER POP P,AA ; RESTORE A REG POP P,A ; AND ANOTHER REG POP P,CH ;AND YET ANOTHER REG PJRST SCNCTX ;SWITCH BACK TO SCAN ;SCNTYS -- TYPE ONE SPECIAL CHARACTER (E.G., "") SCNTYS: PUSHJ P,TECCTX ;SWITCH TO TECO ACS PUSH P,CH ;SAVE A REG PUSH P,A ; AND ANOTHER REG PUSH P,AA ; AND YET ANOTHER REG MOVE CH,SCNACS+T1 ;THE CHARACTER SCAN WANTS TO OUTPUT PUSHJ P,TYOS ;TYPE A SPECIAL CHARACTER POP P,AA ; RESTORE A REG POP P,A ; AND ANOTHER REG POP P,CH ;AND YET ANOTHER REG PJRST SCNCTX ;SWITCH BACK TO SCAN ;SCNCTX -- SWITCH TO SCAN/WILD CONTEXT SCNCTX: MOVEM 10,TECACS+10 ;Save AC 10 MOVEI 10,TECACS ;Set up BLT BLT 10,TECACS+10-1 ;Save TECO's ACs MOVSI 10,SCNACS ;SCAN'S ACS BLT 10,10 ;SET THEM UP POPJ P, ;Return in SCAN's context ;TECCTX -- SWITCH TO TECO CONTEXT TECCTX: MOVEM 10,SCNACS+10 ;Save AC 10 MOVEI 10,SCNACS ;Set up BLT BLT 10,SCNACS+10-1 ;Save SCAN's ACs MOVSI 10,TECACS ;Address of TECO context acs BLT 10,10 ;Back to TECO mode POPJ P, ;Return in TECO's context U TECACS,10 ;TECO's ACs U SCNACS,10 ;SCAN's ACs ;SWITCH DEFINITIONS DM CRF,.FXLEN,0,0 DM INI,.FXLEN,0,0 DEFINE SWTCHS,< SL CRDISP,S.CRDI,$TB,$TBDEL,FS.NFS!FS.VRQ SP CRFILE,S.CRFI,.SWFIL##,CRF,FS.NFS!FS.VRQ SP CRPROT,S.CRPR,.SWOCT##,,FS.NFS!FS.VRQ SP CRSAVE,S.CRSA,.SWDEC##,,FS.NFS!FS.VRQ SN EAMODE,S.EAMO,FS.NFS SP EOBATC,S.EOBA,.SWDEC##,,FS.NFS!FS.VRQ SP EOMODE,S.EOMO,.SWDEC##,,FS.NFS!FS.VRQ SP INITFI,S.INIT,.SWFIL##,INI,FS.NFS!FS.VRQ SN OKLSN,S.OKLS,FS.NFS SN OKNULL,S.OKNU,FS.NFS SN SFT,S.SFT,FS.NFS > KEYS ($TB,) DOSCAN(TECSW) ;DATA BLOCKS ;FOR SCAN ;MONITOR COMMAND TABLE CCMDT: 'MAKE ' ;CREATE A NEW FILE 'TECO ' ;EDIT AN EXISTING FILE CCMDL==.-CCMDT ;ISCAN PARAMETER BLOCK ISBLK: EXP FXVRSN ;SCAN/WILD PROTOCOL VERSION WORD IOWD CCMDL,CCMDT ;IOWD OF LEGAL MONITOR COMMANDS CCLSW,,'TEC' ;ADR OF STARTING OFFSET,,CCL NAME 0,,SCNTYO ;CHAR INPUT RTN,,CHAR OUTPUT RTN Z ;INDIRECT FILE BLOCK POINTER (XWD) Z ;PROMPT RTN,,MONRET RTN Z ;FLAGS,, Z ;ERROR INTERCEPT RTN ISLEN==.-ISBLK ;TSCAN PARAMETER BLOCK ;TSBLK: EXP FXVRSN ;SCAN/WILD PROTOCOL VERSION WORD ; IOWD TECSWL,TECSWN ;IOWD POINTER FOR SWITCH NAMES ; XWD TECSWD,TECSWM ;DEFAULT TABLE,,PROCESSOR TABLE ; XWD 0,TECSWP ;,,STORAGE POINTERS ; SIXBIT /TECO/ ;HELP ; XWD CLRALL,0 ;CLEAR ALL,,CLEAR FILE ; XWD INX,OUX ;ALLOC INPUT AREA,,ALLOC OUTPUT AREA ; Z ;MEMORIZE STICKY,,APPLY STICKY ; Z ;CLEAR STICKY,,FLAGS ; Z ;,,SWITCH VALUE STORAGE RTN ; ; TSLEN==.-TSBLK ;OSCAN BLOCK OSBLK: EXP FXVRSN ;SCAN/WILD PROTOCOL VERSION WORD IOWD TECSWL,TECSWN ;IOWD POINTER FOR SWITCH NAMES XWD TECSWD,TECSWM ;DEFAULT TABLE,,PROCESSOR TABLE XWD 0,TECSWP ;,,STORAGE POINTERS SIXBIT /TECO/ ;HELP SIXBIT /TECO/ ;OPTIONS NAME OSLEN==.-OSBLK ;FOR WILD ;LKBLK: EXP FXVRSN ;SCAN/WILD PROTOCOL VERSION WORD ; WIFIR,,WILAS ; SCAN BLOCK POINTER ADR ; INOPN,,INFIL ; BLOCK ADDRESS ; .FXLEN,,FILLEN ;SCAN BLOCK LENGTH,,LOOKUP LENGTH ; 0,,WICUR ;FLAGS!CHANNEL,,CUR SCNBLK PTR ADR ; Z ;END OF DIRECTORY RTN ; ; LKLEN==.-LKBLK ;SCBLK: EXP FXVRSN ;SCAN/WILD PROTOCOL VERSION WORD ; WICUR,,[OUSCN] ; SCNBLK PTR ADR ; INOPN,,OUOPN ; OPEN BLK ADR ; INFIL,,OUFIL ; FILE BLK ADR ; [0,,-1],,FILLEN ;DEFAULT EXT ADR,,FILE BLK LEN ; 0,,SCFLG ;,,SCWILD PROCESSING FLAGS ; ; SCLEN==.-SCBLK ;THIS PAGE CONTAINS THE COMMAND READER FOR THE CCL SYSTEM CCLDSK: .IOASC ;ASCII I/O 'DSK ' ;TO A DISK DEVICE 0,,CCLB ;INPUT BUFFER RING HEADER U CCLB,3 ;THE HEADER FOR CCL FILE I/O CCLIN: HRRZ TT,.JBFF ;GET FIRST FREE ADDI TT,TMPBSZ ;LAST LOC USED IN TMPCOR CAMG TT,.JBREL ;ENOUGH ROOM? JRST CCLIN2 ;YES, JUST READ IN BUFFER LSH TT,WRD2PG ;NO, MAKE PAGE ADDRESS ADD TT,SECTNP ;OFFSET TO PC SECTION PUSHJ P,P1CRE ;ALLOCATE ANOTHER MEMORY PAGE HALT . ;BAD NEWS CCLIN2: HRLI T,'EDT' ;SET UP READ BLOCK FOR TMPCOR UUO HRLOI TT,-TMPBSZ-1 ;SIZE OF TMPCOR READ ADD TT,.JBFF ;MAKE IOWD POINTER TO TMPCOR BUFFER MOVE TT1,[.TCRDF,,T] ;TMPCOR UUO ARG POINTER TO TMPCOR TT1, ;READ AND DELETE FILE EDT JRST CCLTMP ;NO FILE EDT OR NO TMPCOR UUO HRRZ AA,.JBFF ;GET START OF BUFFER AREA HRLI AA,350700 ;PICK UP EDT CHARACTERS, SKIP LINED "S" TXO FF,TMPFLG ;SET TMPCOR FLAG JRST CCLTM1 ;FINISH PROCESSING COMMAND ;HERE IF TMPCOR FAILED. READ NNNEDT.TMP FROM DSK: CCLTMP: HLLZ B,TMPTEC ;GET SIXBIT JOB # HRRI B,'EDT' ;REST OF NAME MOVE T,[-XFILEN,,XFILNM-1] ;PDL INTO LOOKUP BLOCK PUSH T,[XFILEN] ;FIRST WORD IS CNT OF ARGS PUSH T,[0] ;LOOK ON DEFAULT PATH PUSH T,B ;STORE FILENAME PUSH T,['TMP '] ;EXTENSION MOVE T,.JBFF ;USE BUFFER SPACE BRIEFLY OPEN CCLCHN,CCLDSK ;OPEN DSK CHANNEL JRST TECO ;IF NO DSK, SAY "*" INBUF CCLCHN,1 ;DONT ADR CHECK LOOKUP CCLCHN,XFILNM ;OPEN THE FILE JRST TECO ;IT WASN'T THERE? INPUT CCLCHN,0 MOVEM T,.JBFF ;GIVE BACK SPACE IBP CCLB+1 ;SKIP THE LINED S MOVE AA,CCLB+1 ;SETUP BYTE POINTER TO INPUT CCLTM1: MOVE T,TTYPT2 ;OUTPUT CHARS MOVEI C,2 ;INIT CHAR CTR MOVEI A,"=" ;FLAG NO EQUALS SIGN SEEN ;FALL INTO LOOP ON NEXT PAGE ;LOOP BACK HERE ON EACH NEW CHARACTER IN THE TMP FILE CCLIL: ILDB B,AA ;INPUT THE FILE NAME & EXT CAMN B,A ;FIRST EQUALS SIGN SEEN? JRST CCLEQL ;YES CAIE B,.CHCRT ;CR? CAIN B,"}" ;OLD ALT? AOJA C,CCLNUL ;THEN PROCESS JUMPE B,CCLIL ;THROW AWAY NULLS IDPB B,T ;ELSE STORE CHAR AOJA C,CCLIL ;AND LOOP FOR ALL CHARS ;HERE ON THE FIRST "=" IN THE COMMAND STRING CCLEQL: MOVE D,T ;SAVE C & T MOVE E,C ;INCASE .TE A=B MOVEI B,.CHESC ;REPLACE FIRST EQUALS SIGN IDPB B,T ; WITH ER MOVEI B,"E" ; SINCE WE EXPECT IDPB B,T ; AN INPUT FILE MOVEI B,"R" ; SPEC TO FOLLOW IDPB B,T ; THE FIRST ONE ADDI C,3 ;COUNT THE CHARS STORED SETO A, ;PREVENT FINDING LATER EQUALS TXO FF,CCLFLG ;DO A Y IN ANY CASE JRST CCLIL ;AND LOOP BACK FOR NEXT CHAR ;HERE ON A NUL (END OF COMMAND). SEE IF IT WAS MAKE OR TECO CCLNUL: MOVEI TT,"W" ;PREPARE FOR EW COMMAND CAILE B,.CHCRT ;WAS BREAK A CRLF? JRST CCLDUN ;NO. ALTMODE ASSUMED TXO FF,CCLFLG ;REQUEST Y AFTER EB MOVEI TT,"B" ;NOW PREPARE FOR EB AOJN A,CCLDUN ;CONTINUE UNLESS EB & "=" WAS SEEN MOVE T,D ;IF .TE A=B, WE NEVER SAW THE "=" AOS C,E ;IN CASE .MA A=B, THEN .TE ; SINCE TYI USES SOSG, THE COUNT MUST BE ; ONE TOO LARGE (YECH). CCLDUN: MOVEI B,.CHESC ;AN TO TERMINATE THE FILE SPEC IDPB B,T ;TERMINATE THE FILE SPEC SKIPL S.EAMO ;EAMODE SET? TXZ FF,CCLFLG ;YES, NO FREE YANKS THEN TXZN FF,CCLFLG ;WANT TO YANK IN THE FIRST PAGE? JRST CCLDU1 ;NO MOVEI B,"E" ;YES, A YANK COMMAND IDPB B,T ;STUFF IT INTO THE BUFFER MOVEI B,"Y" ;YANK COMMAND, PART TWO IDPB B,T ;STUFF IT INTO THE BUFFER TOO MOVEI B,.CHESC ;ANOTHER CHARACTER IDPB B,T ;TERMINATE THE YANK COMMAND ADDI C,3 ;COUNT THE "EY$" CHARACTERS CCLDU1: IDPB B,T ;SECOND ALT TO TERMINATE COMMAND ADDI C,2 ;COUNT TERMINATING "$$" CHARACTERS 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 ;AND EITHER W OR B MOVEM C,TIB+.BFCTR ;SET BUFR CTR TXZE FF,TMPFLG ;TMPCOR UUO IN PROGRESS? JRST CCLDU2 ;YES, DON'T CLOSE DSK SETZM XNAM ;NOW FLUSH FILE RENAME CCLCHN,XFILNM ;BY RENAME TO ZERO JFCL ;PROTECTED? CCLDU2: RELEAS CCLCHN, POPJ P, ;FIGURE OUT WHAT KIND OF TERMINAL THIS IS, AND SET THE SCTYPE CODE GETTYP: MOVEI A,.TOTRM ;TRMOP. TERMINAL TYPE FUNCTION MOVE AA,TTYUDX ;GET TERMINAL UDX MOVE B,[2,,A] ;TRMOP. ARG POINTER TO TRMOP. B, ;READ MONITOR'S TERMINAL TYPE SETO B, ;MONITOR DOESN'T KNOW (PRE-7.00) IFN RUN603,;IF 6.03, SET ASSEMBLED TERMINAL ;HERE WITH TERMINAL TYPE IN B (SIXBIT NAME), SEE IF WE LIKE IT MOVSI A,-TYPTLN ;LENGTH OF OUR TYPE TABLE GETTY2: CAME B,TYPTBL(A) ;TERMINAL WE KNOW ABOUT? AOBJN A,GETTY2 ;NO, CHECK REST OF TABLE MOVE B,TYPVTX(A) ;GET INTERNAL TERMINAL TYPE ; (0 IF UNKNOWN) MOVEM B,SCTYPE ;REMEMBER FOR SCREEN CHECKING HRLZ A,TYPCTL(B) ;ADDRESS OF CONTROL CODES TABLE HRRI A,TTYESC ;ADDRESS OF CONTROL CODES TABLE BLT A,TTYESZ ;COPY WORKING TABLE MOVEI A,8 MOVEM A,TABSIZ ;TABS EVERY 8 COLUMNS POPJ P, ;TTY CONTROL STUFF ;INTERNAL TERMINAL TYPES VXTTY==0 ;NO SCREEN CONTROL (UNKNOWN/HARDCOPY) VX05==1 ;VT05 VXD50==2 ;VT50-CLASS VXDEC==3 ;VT52-CLASS VXANSI==4 ;VT100 (ANSI) CLASS TYPCTL: VCTTY ;(00) NONE (E.G., HARDCOPY TERMINAL) VC05 ;(01) VT05 CONTROL VCD50 ;(02) DEC-STANDARD SANS CURSOR ADDRESSING VCDEC ;(03) DEC-STANDARD ESCAPE CONTROL VCANSI ;(04) ANSI-STANDARD ESCAPE CONTROL ;TERMINAL TYPES DEFINITIONS DEFINE TRMTYP,< X VT05, VX05 ;GOOD OLE VT05 X VT50, VXD50 ;DINKY VT50 X VT52, VXDEC ;STANDARD VT52 X VT55, VXDEC ;VT52 WITH GRAPHICS X VT61, VXDEC ;FANCY EDITING TERMINAL X DAS21, VXDEC ;FUNNY LOOKING VT52 X VT100, VXANSI ;NOT-SO-NEW-ANYMORE NEWEST LATEST GREATEST X VT101, VXANSI ;EL CHEAPO VT100 X VT102, VXANSI ;FANCY VERSION OF EL CHEAPO VT100 X VT103, VXANSI ;EGADS, THEY'RE PROLIFERATING LIKE RABBITS X VT125, VXANSI ;VT100 WITH GRAPHICS X VT180, VXANSI ;ROBIN X VT185, VXANSI ;ROBIN RED BREST? X VT220, VXANSI ;NEWEST LATEST GREATEST WITH SUCKY KEYBOARD X VT240, VXANSI ;FANCIER VERSION OF NEWEST ETC. X VK100, VXANSI ;VT100 WITH EVEN MORE GRAPHICS ("GIGI") > ;END TRMTYP MACRO ;THE TTY TYPES TABLE DEFINE X(NAM,DSP), TYPTBL: TRMTYP ;DEFINE TERMINAL NAMES TABLE TYPTLN==.-TYPTBL ;LENGTH OF TYPE TABLE ;THE TTY TYPE DISPATCH TABLE DEFINE X(NAM,DSP), TYPVTX: TRMTYP ;DEFINE TYPE DISPATCH TABLE VXTTY ;(--) UNKNOWN TERMINAL (NO CONTROL) ;OUR WORKING TABLE OF TTY CONTROL U THOME,1 ;(00) HOME U TEREOL,1 ;(01) ERASE TO END OF LINE U TEREOS,1 ;(02) ERASE TO END OF SCREEN U TCUP,1 ;(03) CURSOR UP U TDOWN,1 ;(04) CURSOR DOWN U TRIGHT,1 ;(05) CURSOR RIGHT U TLEFT,1 ;(06) CURSOR LEFT U TDCAD,1 ;(07) DIRECT CURSOR ADDRESS PROCESSOR U TKESC,1 ;(10) START OF ESCAPE SEQUENCE U TKCUP,1 ;(11) CURSOR UP "KEY" U TKDWN,1 ;(12) CURSOR DOWN "KEY" U TKRGT,1 ;(13) CURSOR RIGHT "KEY" U TKLFT,1 ;(14) CURSOR LEFT "KEY" U TCOCH,1 ;(15) CONTINUATION CHARACTER TTYESC==THOME ;START OF CONTROL TABLE TTYESZ==TCOCH ;END OF CONTROL TABLE ;PROTOTYPE CONTROL TABLE FOR HARDCOPY TERMINALS VCTTY: BLOCK 1 ;(00) HOME BLOCK 1 ;(01) ERASE TO END OF LINE BLOCK 1 ;(02) ERASE TO END OF SCREEN BLOCK 1 ;(03) CURSOR UP BLOCK 1 ;(04) CURSOR DOWN BLOCK 1 ;(05) CURSOR RIGHT BLOCK 1 ;(06) CURSOR LEFT BLOCK 1 ;(07) DIRECT CURSOR ADDRESS PROCESSOR BLOCK 1 ;(10) START OF ESCAPE SEQUENCE BLOCK 1 ;(11) CURSOR UP "KEY" BLOCK 1 ;(12) CURSOR DOWN "KEY" BLOCK 1 ;(13) CURSOR RIGHT "KEY" BLOCK 1 ;(14) CURSOR LEFT "KEY" EXP "!" ;(15) LINE CONTINUATION CHARACTER ;PROTOTYPE CONTROL TABLE FOR VT05'S VC05: BYTE(7) 035,177,177,177,177 ;(00) HOME BYTE(7) 036,177,177,177,177 ;(01) ERASE TO END OF LINE BYTE(7) 037,177,177,177,177 ;(02) ERASE TO END OF SCREEN BYTE(7) 032,177,177,177,177 ;(03) CURSOR UP BYTE(7) 012,000,000,000,000 ;(04) CURSOR DOWN BYTE(7) 030,000,000,000,000 ;(05) CURSOR RIGHT BYTE(7) 010,000,000,000,000 ;(06) CURSOR LEFT IFIW VT05LN ;(07) DIRECT CURSOR ADDRESS PROCESSOR EXP 0 ;(10) START OF ESCAPE SEQUENCE EXP 032 ;(11) CURSOR UP "KEY" EXP 013 ;(12) CURSOR DOWN "KEY" EXP 030 ;(13) CURSOR RIGHT "KEY" EXP 010 ;(14) CURSOR LEFT "KEY" EXP "!" ;(15) CONTINUATION CHARACTER ;PROTOTYPE CONTROL TABLE FOR DEC-STANDARD TERMINALS SANS CURSOR CONTROL (VT50'S) VCD50: BYTE(7) 033,"H",000,000,000 ;(00) HOME BYTE(7) 033,"K",000,000,000 ;(01) ERASE TO EOL BYTE(7) 033,"J",000,000,000 ;(02) ERASE TO EOS BYTE(7) 033,"A",000,000,000 ;(03) CURSOR UP BYTE(7) 033,"B",000,000,000 ;(04) CURSOR DOWN BYTE(7) 033,"C",000,000,000 ;(05) CURSOR RIGHT BYTE(7) 033,"D",000,000,000 ;(06) CURSOR LEFT IFIW VT50LN ;(07) DCA PROCESSOR EXP .CHESC ;(10) START OF ESCAPE SEQUENCE EXP "A" ;(11) CURSOR UP "KEY" EXP "B" ;(12) CURSOR DOWN "KEY" EXP "C" ;(13) CURSOR RIGHT "KEY" EXP "D" ;(14) CURSOR LEFT "KEY" EXP "!" ;(15) CONTINUATION CHARACTER ;PROTOTYPE CONTROL TABLE FOR DEC-STANDARD TERMINALS (VT52'S) VCDEC: BYTE(7) 033,"H",000,000,000 ;(00) HOME BYTE(7) 033,"K",000,000,000 ;(01) ERASE TO EOL BYTE(7) 033,"J",000,000,000 ;(02) ERASE TO EOS BYTE(7) 033,"A",000,000,000 ;(03) CURSOR UP BYTE(7) 033,"B",000,000,000 ;(04) CURSOR DOWN BYTE(7) 033,"C",000,000,000 ;(05) CURSOR RIGHT BYTE(7) 033,"D",000,000,000 ;(06) CURSOR LEFT IFIW VT52LN ;(07) DCA PROCESSOR EXP .CHESC ;(10) START OF ESCAPE SEQUENCE EXP "A" ;(11) CURSOR UP "KEY" EXP "B" ;(12) CURSOR DOWN "KEY" EXP "C" ;(13) CURSOR RIGHT "KEY" EXP "D" ;(14) CURSOR LEFT "KEY" EXP "|" ;(15) CONTINUATION CHARACTER ;PROTOTYPE CONTROL TABLE FOR ANSI-STANDARD TERMINALS (VT100) VCANSI: BYTE(7) 033,"[","H",000,000 ;(00) HOME BYTE(7) 033,"[","0","K",000 ;(01) ERASE TO EOL BYTE(7) 033,"[","0","J",000 ;(02) ERASE TO EOS BYTE(7) 033,"[","1","A",000 ;(03) CURSOR UP BYTE(7) 033,"[","1","B",000 ;(04) CURSOR DOWN BYTE(7) 033,"[","1","C",000 ;(05) CURSOR RIGHT BYTE(7) 033,"[","1","D",000 ;(06) CURSOR LEFT IFIW VTANLN ;(07) DCA PROCESSOR EXP .CHESC ;(10) START OF ESCAPE SEQUENCE EXP "A" ;(11) CURSOR UP "KEY" EXP "B" ;(12) CURSOR DOWN "KEY" EXP "C" ;(13) CURSOR RIGHT "KEY" EXP "D" ;(14) CURSOR LEFT "KEY" EXP "|" ;(15) CONTINUATION CHARACTER ;PSI SERVICE INITIALIZATION ;SETUP PSI SYSTEM PSIINI: XMOVEI T,PSIVEC ;BASE PSI VECTOR SKIPE SECTN ;RUNNING EXTENDED? TXO T,PS.IEA ;YES, WANT "EXTENDED" FORMAT THEN PIINI. T, ;INITIALIZE PSI SYSTEM POPJ P, ;BLETCH ;BY DEFAULT, ALWAYS GET ^C TRAPPING, SO INCLUDE IT AS PART OF THE ;"GENERIC" PSI SETUP CODE XMOVEI T,CCINT ;CONTROL-C TRAP ROUTINE MOVEM T,PSICCV+.PSVNP ;SET TRAP PC MOVX T,PS.VTO!PS.VDS ;CONTROL-FLAGS: IGNORE FURTHER ^C'S MOVEM T,PSICCV+.PSVFL ;SET FLAGS WORD MOVE T,[PS.FON!PS.FAC+[.PCSTP ;ENABLE ARG BLOCK FOR ^C TRAP XWD PSICCV-PSIVEC,0 ;VECTOR OFFSET EXP 0]] ;JUNK WORD PISYS. T, ;ENABLE CONTROL-C TRAPPING POPJ P, ;JUNK JRST CPOPJ1 ;PSI (AND ^C TRAP) SETUP ;CONTROL-C TRAP SERVICE ROUTINE CCINT: PUSH P,A ;SAVE ACCUMULATORS A, AA, AND B PUSH P,AA ; . . . PUSH P,B ; . . . PUSH P,T ;SAVE PUSH P,TT ; EVEN PUSH P,TT1 ; MORE PUSH P,CH ; ACS PUSHJ P,TEBURB ;FORCE COMMAND BACKUP UPDATE NOW PUSHJ P,CLREOS ;CLEAR OUT JUNK AT BOTTOM OF SCREEN PUSHJ P,TTYRST ;RESTORE ORIGINAL USER TTY MODES PUSHJ P,ZAPTT ;CLEAR OUT THE TTY EXIT 1, ;LET MONITOR HAVE USER ;BACK HERE WHEN USER TYPES CONTINUE CCONT: PUSHJ P,TTOPEN ;RE-OPEN DEVICE TTY: PUSHJ P,GETTYP ;CHECK ON TERMINAL TYPE JUST IN CASE . . . PUSHJ P,TTYGET ;GET TTY MODES (USER MAY HAVE CHANGED THEM) PUSHJ P,TTYSEC ;SETUP OUR TTY MODES TXNN F2,DOING ;EXECUTING A COMMAND? SKIPE COMCNT ;NO, ANY COMMAND CHARACTERS IN YET? JRST CCONT5 ;YES TO ONE OF THE ABOVE, JUST RESUME ;HERE WHEN USER ^C'ED FROM COMMAND INPUT WAIT, NO CHARACTERS IN YET PUSHJ P,CLRSCN ;FORCIBLY CLEAR THE WHOLE SCREEN XMOVEI CH,GO ;ADDRESS FROM WHENCE TO RESUME MOVEM CH,PSICCV+.PSVOP;SET FOR DEBRK. TO SEE JRST CCONT8 ;AND GO RESTART ;HERE WHEN USER ^C'ED FROM SOMETHING HAPPENING, JUST RESUME CCONT5: SETOM MESFLG ;NOTE THAT SCREEN IS [PROBABLY] TRASHED SETZM WINFLG ;WE WANT IT UPDATED NOW! SETZM VFREEZ ; . . . CCONT8: POP P,CH ;RESTORE POP P,TT1 ; SOME POP P,TT ; MORE POP P,T ; ACS POP P,B ;RESTORE A, AA, AND B POP P,AA ; . . . POP P,A ; . . . DEBRK. ;BACK TO THE OLD GRIND.... HALT GO ;DUH? HALT GO ;DOUBLE DUH? SUBTTL TERMINAL HANDLING AND I/O ROUTINES ;TTOPEN - OPEN AND INITIALIZE THE TERMINAL I/O CHANNEL TTOPEN: OPEN TTYCHN,TTYBLK ;OPEN DEVICE TTY: JRST TTOPF1 ;OPEN FAILURE? OFF TO A BAD START! SETOM TTSTS ;INITIALLY JUNK STATUS MOVEI T,TTYCHN ;TTY I/O CHANNEL DEVTYP T, ;GET DEVICE TYPE INFORMATION JRST TTOPF2 ;CAN'T FAIL LDB TT,[POINTR T,TY.DEV] ;GET DEVICE CODE CAIE TT,.TYTTY ;IS TTY: A TRUE TERMINAL? JRST TTOPF3 ;NO, BARF ON USER MOVEI T,TTYCHN ;TTY I/O CHANNEL AGAIN IONDX. T, ;GET OFFICIAL TTY UDX JRST TTOPF4 ;CAN'T FAIL MOVEM T,TTYUDX ;SAVE FOR ASSORTED AND SUNDRY TRMOP.S ;NOW SET UP INPUT BUFFER RING STRUCTURE MOVE A,[TTIBFN,,TTIBSZ+3] ;TERMINAL INPUT BUFARG MOVEI AA,TTIBF1 ;FIRST INPUT BUFFER MOVEI B,TIB ;TERMINAL INPUT BUFFER RING PUSHJ P,SETBF ;INITIALIZE INPUT BUFFER RING HALT . ;CAN'T HAPPEN ;NOW SET UP OUTPUT BUFFER RING STRUCTURE MOVE A,[TTOBFN,,TTOBSZ+3] ;TERMINAL OUTPUT BUFARG MOVEI AA,TTOBF1 ;FIRST OUTPUT BUFFER MOVEI B,TOB ;OUTPUT RING HEADER PUSHJ P,SETBF ;INITIALIZE OUTPUT BUFFER RING HALT . ;CAN'T HAPPEN POPJ P, ;TERMINAL CHANNEL ALL SET ;TTOPEN ERRORS TTOPF1: OUTSTR [ASCIZ\? Can't OPEN device TTY:\] JRST TTOPFX ;COMMON ERROR EXIT TTOPF2: OUTSTR [ASCIZ\? DEVTYP failure for TTY channel\] JRST TTOPFX ;COMMON ERROR EXIT TTOPF3: OUTSTR [ASCIZ\? Device TTY: is not a real terminal\] JRST TTOPFX ;COMMON ERROR EXIT TTOPF4: OUTSTR [ASCIZ\? IONDX. failure for TTY channel\] JRST TTOPFX ;COMMON ERROR EXIT TTOPFX: OUTSTR [ASCIZ\ \] ;BLANK LINE BEFORE THE "." EXIT 1, ;RETURN TO MONITOR LEVEL JRST TTOPEN ;USER .CONTINUED, SO TRY AGAIN ;ROUTINE TO GET AND REMEMBER VARIOUS TTY SETTINGS, SO IF WE CHANGE THEM, ;WE CAN RESTORE THEM CORRECTLY WHEN TECO EXITS TO THE MONITOR FOR ANY ;REASON TTYGET: MOVE TT,TTYUDX ;GET OUR TTY UDX FOR SUBSEQUENT TRMOP.'S MOVEI T,.TOLCT ;LOWER CASE CONVERSION MOVE B,[2,,T] ;TRMOP. ARG POINTER TO TRMOP. B, ;READ LC SETTING SETZ B, ;ASSUME LOWER CASE TTY SKIPN B ;LOWER CASE CAPABILITY? TXOA F2,LINCHR ;YES, SET FLAG TXZ F2,LINCHR ;NO, CLEAR IT MOVEI T,.TOALT ;READY TO CHECK FOR ALTMODE CONVERSION MOVE B,[2,,T] ;TRMOP. ARG POINTER TO TRMOP. B, ;READ ALTMODE CONVERSION SETTING MOVEI B,0 ;ASSUME NOT SKIPE B ;COPY ALTMODE CONVERSION SWITCH TO F2 TXOA F2,NOALT TXZ F2,NOALT MOVEI T,.TOTAB ;PREPARE TO READ TAB-SPACES SWITCH MOVE B,[2,,T] ;TRMOP. ARG POINTER TO TRMOP. B, ;READ TAB-SPACES SWITCH SETZ B, ;ASSUME NOT MOVEM B,TTYTAB ;REMEMBER TAB SWITCH SETTING MOVEI T,.TONFC ;PREPARE TO READ FREE CRLF SWITCH MOVE B,[2,,T] ;TRMOP. ARG POINTER TO TRMOP. B, ;READ CRLF SWITCH SETZ B, ;ASSUME FREE CRLF MOVEM B,TTYFCR ;SAVE CURRENT FREE CRLF SETTING MOVEI T,.TOBLK ;PREPARE TO READ TTY BLANK MOVE B,[2,,T] ;TRMOP. ARG POINTER TO TRMOP. B, ;READ CRLF SWITCH SETZ B, ;ASSUME TTY NO BLANK SUPPRESS MOVEM B,TTYBLN ;SAVE CURRENT TTY BLANK MOVEI T,.TODEM ;PREPARE TO READ DEFERRED ECHO MODE MOVE B,[2,,T] ;TRMOP. ARG POINTER TO TRMOP. B, ;READ DEFERRED ECHO SETTING SETZ B, ;ASSUME IMMEDIATE ECHO MOVEM B,TTYDEM ;SAVE CURRENT DEFERRED ECHO MODE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE MOVEI T,.TOWID ;PREPARE TO READ TTY WIDTH MOVE B,[2,,T] ;TRMOP. ARG POINTER TO TRMOP. B, ;READ TTY WIDTH MOVEI B,^D80 ;ASSUME VT52-CLASS WIDTH CAILE B,TTWMAX ;CAN WE HANDLE IT? MOVEI B,TTWMAX ;NO, USE MOST WE SUPPORT SUBI B,1 ;(WE START AT 0) MOVEM B,SWIDTH ;SET SCREEN WIDTH MOVEI T,.TOSTO ;PREPARE TO READ TERMINAL STOP MOVE B,[2,,T] ;TRMOP. ARG POINTER TO TRMOP. B, ;READ TERMINAL [NO] STOP JRST TTYGE5 ;FALL BACK TO TERMINAL PAGE MOVEM B,TTYSTO ;REMEMBER USER'S TERMINAL [NO] STOP SETTING MOVEI T,.TOLNB ;PREPARE TO READ TERMINAL LENGTH MOVE B,[2,,T] ;TRMOP. ARG POINTER TO TRMOP. B, ;READ TERMINAL "FORMS" LENGTH JRST TTYGE5 ;ASSUME NOT YET IMPLEMENTED JUMPN B,TTYGE7 ;USE LENGTH IF ANY IS SET MOVEI T,.TOSSZ ;PREPARE TO READ STOP SIZE MOVE B,[2,,T] ;TRMOP. ARG POINTER TO TRMOP. B, ;READ STOP SIZE JRST TTYGE5 ;ASSUME NOT YET IMPLEMENTED JUMPN B,TTYGE7 ;USE STOP SIZE IF ANY IS SET TTYGE5: MOVEI T,.TOPSZ ;PREPARE TO READ PAGE SIZE MOVE B,[2,,T] ;TRMOP. ARG POINTER TO TRMOP. B, ;READ PAGE SIZE SETZ B, ;ASSUME PAGE 0 MOVEM B,TTYPSZ ;SAVE CURRENT USER'S PAGE SIZE TTYGE6: JUMPN B,TTYGE7 ;USE KNOWN PAGE SIZE MOVE B,SCTYPE ;GET TTY TYPE MOVE B,[DEC 63,20,12,24,24](B) ;HYPOTHESIZE A LENGTH TTYGE7: CAILE B,TTLMAX ;CAN WE HANDLE IT? MOVEI B,TTLMAX ;NO, THE MOST WE CAN HANDLE MOVEM B,SSIZE ;SAVE SCREEN "SIZE" MOVE T,B ;NEED TWO CONTIGUOUS REGISTERS IMULI T,^D100 ;TO CALCULATE PERCENTAGE OF SCREEN IDIVI T,^D120 ;TO USE FOR TEXT (20 OUT OF 24 LINES) MOVEM T,DLENTH ;SET LENGTH OF TEXT AREA MOVEM T,SLENTH ; . . . IDIVI T,3 ;PREFERRED OFFSET FOR CURSOR MOVEM T,CLENTH ;SET FOR OTHERS POPJ P, ;WE HAVE READ ALL PERTINENT TTY INFO ;ROUTINE TO SET VARIOUS TTY MODES FROM OURTAB, OURFCR ETC. ; ;ENTER AT TTYSEC TO CLEAR THE TERMINAL INPUT STREAM COMMAND WHICH ;STARTED US UP (E.G., REENTER COMMAND) AND WHICH WOULD OTHERWISE PREVENT ;THE DISPLA ROUTINE FROM UPDATING THE SCREEN (IT WOULD THINK IT HAD ;TYPEAHEAD (THE MONITOR COMMAND) AND TERMINATE). TTYSEC: MOVEI T,.TOSIP ;SKIP-IF-INPUT FUNCTION MOVE TT,TTYUDX ;FOR OUR COMMAND TERMINAL MOVE B,[2,,T] ;TRMOP. ARG POINTER TO TRMOP. B, ;NUDGE TERMINAL AND CLEAR COUNTERS JFCL ;DON'T CARE, AS LONG AS DISPLA DOES OUTPUT TTYSET: TDZA A,A ;SETUP FROM OUR MODES TTYRST: MOVEI A,1 ;RESET OLD TERMINAL MODES SKIPN SCTYPE ;ONLY MUCK WITH USER TTY IF VIDEO SCREENING POPJ P, ;HARDCOPY, LEAVE IT ALONE MOVE TT,TTYUDX ;SET TTY UDX FOR TRMOP.S BELOW MOVEI T,.TOTAB+.TOSET ;PREPARE TO SET TAB CONVERSION MOVE TT1,OURTAB(A) ;GET TAB SETTING MOVE B,[3,,T] ;TRMOP. ARG POINTER TO TRMOP. B, ;SET UP TTY TAB-SPACES SWITCH JFCL ;IGNORE FAILURE MOVEI T,.TONFC+.TOSET ;PREPARE TO SET FREE CRLF SETTING MOVE TT1,OURFCR(A) ;GET STATE TO SET MOVE B,[3,,T] ;TRMOP. ARG POINTER TO TRMOP. B, ;SET UP FREE CRLF SWITCH JFCL ;ERROR IS OK MOVEI T,.TOBLK+.TOSET ;PREPARE TO SET TTY NO BLANK SUPPRESSION MOVE TT1,OURBLN(A) ;GET STATE TO SET MOVE B,[3,,T] ;TRMOP. ARG POINTER TO TRMOP. B, ;SET TTY NO BLANK SUPPRESSION JFCL ;ERROR IS OK MOVEI T,.TODEM+.TOSET ;PREPARE TO SET DEFERRED ECHO MODE MOVE TT1,OURDEM(A) ;GET STATE TO SET MOVE B,[3,,T] ;TRMOP. ARG POINTER TO TRMOP. B, ;SET UP DEFERRED ECHO MODE JFCL ;ERROR IS OK MOVEI T,.TOSTO+.TOSET ;PREPARE TO SET STOP MOVE TT1,OURSTO(A) ;GET STATE TO SET MOVE B,[3,,T] ;TRMOP. ARG POINTER TO TRMOP. B, ;SET TERMINAL [NO] STOP JRST TTYSE5 ;FAILED, USE TERMINAL PAGE INSTEAD JRST TTYSE7 ;DO NOT USE PAGE TRMOP.! TTYSE5: MOVEI T,.TOPSZ+.TOSET ;PREPARE TO SET PAGE SIZE 0 MOVE TT1,OURPSZ(A) ;GET STATE TO SET MOVE B,[3,,T] ;TRMOP. ARG POINTER TO TRMOP. B, ;SET UP PAGE SIZE 0 JFCL ;ERROR IS OK TTYSE7: POPJ P, ;USER'S TERMINAL HAS BEEN [RE]SET ;*** DO NOT SEPARATE OURFCR FROM TTYFCR, NOR OURTAB FROM TTYTAB *** U OURFCR,1 ;WHAT TECO'S CRLF BIT IS U TTYFCR,1 ;HOLDS CRLF BIT AS EXISTING THE LAST ;TIME WE WENT FROM MONITOR TO TECO U OURTAB,1 ;WHAT TECO'S TAB-SPACE BIT IS U TTYTAB,1 ;SAME FOR TAB-SPACES BIT U OURBLN,1 ;WHAT TECO'S BLANK SUPRESSION IS U TTYBLN,1 ;AND USER'S SELECTION U OURDEM,1 ;WHAT TECO'S DEFERRED ECHO MODE IS U TTYDEM,1 ;AND USER'S SELECTION U OURPSZ,1 ;TECO'S PAGE SIZE U TTYPSZ,1 ;ORIGINAL PAGE SIZE U OURSTO,1 ;TECO'S [NO] STOP U TTYSTO,1 ;ORIGINAL [NO] STOP ;ROUTINE TO RETURN NON-NULL TTY CHARACTER IN CH. ;CALL PUSHJ PDP,TYI ; RETURN TYI: TXZE FF,TYOF ;NEED A TYO? PUSHJ P,TYOOUT ;YES. DO SO. TYI0: SKIPL CH,SCH ;IF SAVED CHARACTER IN SCH JRST TYIB4 ;USE IT INSTEAD OF INPUTTING ONE FROM TTY TXNE FF,CFOF ;READING FROM COMMAND FILE? JRST TYICF ;YES, DIFFERENT BUFFER(S) SOSG TIB+.BFCTR ;CHARS IN NORMAL MODE? PUSHJ P,TYIIN ;NONE LEFT, GET ANOTHER BUFFERFUL ILDB CH,TIB+.BFPTR ;YES. GET ONE JUMPE CH,TYI0 ;FLUSH NULLS TYI3: PUSHJ P,TEBCHR ;SAVE COMMAND CHARACTER IN CRASH RECOVERY FILE TYI4: TXZ FF,TIBKA ;CLEAR CHARACTER MODE TXZN FF,TINEC ;NO ECHO? SKIPE CMFECH ;OR SUPPRESSING COMMAND FILE ECHO? PJRST ALTLIN ;YES, DON'T DO ANY SPECIAL CHARACTER STUFF ; 1) ECHO AS ^G ; 2) COUNT SCREEN SCROLLING CAIE CH,.CHBEL ;NO, USER TYPE A ? JRST TYI4NG ;NO, NO ECHO WORRIES THEN MOVE CH,CHTBL(CH) ;YES, GET ECHO CONTROL TXZ CH,EC$SLF ;THE MONITOR ALREADY ECHOED THIS WAY PJRST TYIEC0 ;SO JUST ECHO IT FOR HIM AS ^G TYI4NG: CAIL CH," " ;CONTROL CHARACTER? JRST ALTLIN ;NO (BUT WATCH FOR OLDE ALTMODES) CAIL CH,.CHLFD ;VERTICAL MOTION CHARACTER? CAILE CH,.CHFFD ; . . . SKIPA CH,CHTBL(CH) ;NO, GET ECHO CONTROL BITS JRST CNTLF ;YES, COUNT ANY EFFECTS ON SCREEN TXNE CH,EC$CRL ;THIS CHARACTER ECHO WITH ? JRST TYI5C ;YES, ACCOUNT FOR POSSIBLE SCROLLING ANDI CH,177 ;NO, REDUCE TO JUST ASCII CHARACTER POPJ P, ;AND GIVE IT TO CALLER TYI5C: PUSH P,CH ;SAVE THE BITS/CHARACTER MOVEI CH,.CHLFD ;PRETEND A LINE FEED PUSHJ P,CNTLF ;NOTE SCREEN MAY HAVE SCROLLED POP P,CH ;RESTORE THE BITS/CHARACTER ANDI CH,177 ;AND REDUCE TO JUST CHARACTER POPJ P, ;AND GIVE IT TO CALLER TYIINZ: CLOSE TTYCHN, ;CLEAR EOF (^Z) TYIIN: MOVEI CH,TTYIOS ;BASIC TTY STATUS TXNE FF,TIBKA ;WANT SINGLE CHARACTER? IORI CH,IO.BKA ;YEAH TXNE FF,TINEC ;WANT TO SUPPRESS ECHO? IORI CH,IO.SUP ;YEAH CAME CH,TTSTS ;SAME IOS AS LAST PASS THROUGH HERE? SETSTS TTYCHN,(CH) ;NO, CHANGE TO NEW TERMINAL MODE MOVEM CH,TTSTS ;SAVE NEW LAST STATUS IFN RUN603,< TXNE CH,IO.BKA ;WANT CHARACTER MODE HERE? JRST [INCHRW CH ;YES, PICK UP SINGLE CHARACTER JRST CPOPJ1] ;AND SKIP TYI0'S "ILDB" > ;END IFN RUN603 IN TTYCHN, ;ASK FOR INPUT POPJ P, ;GOT IT, RETURN TO READ IT STATZ TTYCHN,IO.EOF ;END OF FILE? JRST TYIINZ ;GO CLEAR EOF OUTSTR [ASCIZ\? I/O error reading from command terminal\] EXIT ;AND THAT IS THE END OF THAT TYIB4: SETOM SCH ;SO CHARACTER IS INPUT NEXT TIME POPJ P, ;CONVERT 175 & 176 TO ALTMODE (033) UNLESS TTY NOALT IS ON ALTLIN: CAIL CH,175 ;OLD ALTMODE? CAILE CH,176 POPJ P, ;NO TXNN F2,NOALT ;TEST TTY NOALT BIT ALTX: MOVEI CH,.CHESC ; CONVERT TO 033 POPJ P, ;CONVERT 175 & 176 TO ALTMODE (033) IF EO = 1 ALTEO: CAIE CH,175 ;OLD ALTMODE? CAIN CH,176 CHKEO EO21,ALTX ;RUNNING OLD MACRO? IF SO, CONVERT POPJ P, ;NO, 175=RIGHT BRACE, 176=TILDE ;HERE TO READ CHARACTER FROM COMMAND FILE RATHER THAN TTY: TYICF: SOSL CMFIBH+.BFCTR ;ANY CHARACTERS LEFT? JRST TYICF3 ;YES, KEEP READING THEM PUSHJ P,TYICN ;NO, READ ANOTHER BUFFER SKIPA CH,COMCNT ;EOF, GET COMMAND CHARACTER COUNT JRST TYICF ;GOT MORE CHARACTERS, COUNT EM DOWN SKIPE EQM ;IF REQUEST FROM A MACRO, OK JRST TYI ; (MUST BE FROM CMCCT) JUMPE CH,GO ;NO, IF NO OUTSTANDING COMMANDS, RESTART ; AND REFRESH SCREEN AS NEEDED $WARN (EOC,,) JRST TYI ;AND GET REGULAR TTY COMMANDS TYICF3: ILDB CH,CMFIBH+.BFPTR;YES, READ NEXT COMMAND FILE CHARACTER AOS CMFCTR ;BUMP CHARACTER COUNTER JUMPE CH,TYICF ;DISCARD NULLS SKIPN CMFECH ;USER REQUEST ECHOING OF THE COMMAND FILE? CAIN CH,.CHDEL ;YES, BUT DON'T ECHO RUBOUTS JRST TYI4 ;RETURN COMMAND CHARACTER (BUT DON'T WRITE ; IT IN CRASH RECOVERY FILE!) TXNE FF,TINEC ;SUPPRESSING INPUT ECHO? JRST TYI4 ;YES, IF IT NEEDS ECHOING, IT WILL BE ECHOED LATER PUSH P,A ;SAVE SOME ACS PUSH P,AA ; THAT TYOM KRUMPS UPON CAIN CH,.CHLFD ;A ??? SOS CURLIN ;YES, CNTLF GETS CALLED BY TYI AND TYO . . . PUSHJ P,TYOM ;"ECHO" THE COMMAND FILE CHARACTER POP P,AA ;RESTORE POSSIBLE TROUNCED ACS POP P,A ; . . . JRST TYI4 ;PROCESS COMMAND CHARACTER NORMALLY ;READ ANOTHER BUFFER, POPPING UP TO PREVIOUS FILE ON EOF TYICN: IN CMFCHN, ;READ NEXT BUFFER JRST CPOPJ1 ;RETURN WITH CHARACTERS STATO CMFCHN,IO.EOF ;END OF FILE? JRST TYICE2 ;NO, I/O ERROR, GO COMPLAIN TXZ FF,CFOF ;NO MORE COMMAND FILE (PROBABLY) RELEAS CMFCHN, ;LET GO OF USED-UP FILE SOSG CMFLVL ;DECREMENT NESTING COUNT JRST TYICNZ ;ALL FILES USED UP, BACK TO TTY: ;HERE ON EOF FROM COMMAND FILE NESTED WITHIN ANOTHER COMMAND FILE, ;"POP" BACK TO PREVIOUS COMMAND FILE AND CONTINUE PROCESSING PUSH P,A ;NEED A COUPLA ACS HERE PUSH P,AA ; . . . MOVE A,CMFPDP ;COMMAND FILE STACK POINTER SUBI A,CMFLEN ;"POP" THE POINTER MOVEM A,CMFPDP ;SAVE NEW POINTER FOR NEXT TIME HRLZ A,A ;LEFT HALF OF BLT POINTER HRRI A,CMFBLK ;POINT TO "ACTIVE" COMMAND FILE AREA BLT A,CMFBLK+CMFLEN-1 ;"POP" PREVIOUS COMMAND FILE SPECS MOVE A,[CMFBLK,,COMBLK] ;BLT POINTER TO BLT A,COMBLK+COMBLN-1 ;SET UP SPEC IN FILE SPEC AREA PUSHJ P,FILALT ;GO SETUP OPEN AND LOOKUP BLOCKS PUSHJ P,CMFOPN ;OPEN AND SET UP FOR I/O MOVE A,CMFCTR ;CHAR POSITION IN FILE WE WERE LAST AT IDIVI A, ;A:=BLOCK NUMBER IN FILE USETI CMFCHN,1(A) ;SET TO READ THAT PARTICULAR BLOCK IN CMFCHN, ;AND BRING IT IN CAIA ;GOOD JRST TYICE2 ;CAN'T GET EOF SO MUST BE ERROR MOVN AA,AA ;DON'T HAVE SUB AC FROM MEM ADDM AA,CMFIBH+.BFCTR;SO DO ADD NEGATIVE INSTEAD IBP CMFIBH+.BFPTR ;BUMP BYTE POINTER PAST ALREADY READ CHARS AOJL AA,.-1 ;LOOP FOR ALL OF THEM ; (CAN'T DO ADJBP SINCE IT DOESN'T DO THE ; RIGHT THING IN THIS CASE) TXO FF,CFOF ;COMMAND FILE OPEN AGAIN POP P,AA ;RESTORE ACS USED UP POP P,A ; . . . JRST CPOPJ1 ;BACK TO TYICF TO READ A CHARACTER ;COMMAND FILE I/O ERROR ROUTINE(S) TYICE2: GETSTS CMFCHN,B ;I/O STATUS IN B FOR ERRP PUSHJ P,TYICNR ;ABORT AND CLEAR COMMAND FILE $FATAL (INP,,) ;CLEAR COMMAND FILE PROCESSING TYICNR: RELEAS CMFCHN, ;TOSS OUT FILE TYICNZ: SETZM CMFLVL ;NO COMMAND FILES NESTED SETZM CMFECH ;NO LONGER SUPPRESSING TYI ECHO SETZM CMFTYO ;NOR GENERAL PROGRAM OUTPUT SETZM CMFPDP ;NO MORE SPECS ON THE STACK TXZ FF,CFOF ;COMMAND FILE PROCESSING IS DEAD ;RDH SETOM MESFLG ;SCREEN NEEDS REFRESHING POPJ P, ;ET C'EST CA. ;TYIEC -- "ECHO" A COMMAND CHARACTER ;CALL IS: ; ; MOVX CH, ; PUSHJ P,TYIEC ; RETURN ; ;WHERE IS THE 7-BIT ASCII COMMAND CHARACTER TO BE ECHOED JUST AS ;WOULD THE MONITOR. ; ;PRESERVES ALL ACS. TYIEC: CAIN CH,.CHDEL ;A IORI CH,1000 ;YES CAIGE CH," " ;NORMAL PRINTING ASCII? SKIPA CH,CHTBL(CH) ;NO, CONTROL, FETCH ECHO BITS TXO CH,EC$SLF ;YES, JUST ECHO AS SELF TRZE CH,1000 ;WAS IT A ? ANDI CH,177 ;YES, RUBOUTS DON'T ECHO AT ALL ;NOW ECHO THE CHARACTER TO THE TERMINAL AS WOULD THE MONITOR TYIEC0: PUSH P,CH ;SAVE THEM TXNN CH,EC$UPA ;ECHO IN ^X FORM? JRST TYIEC2 ;NO MOVEI CH,"^" ;YES, FIRST THE UP-ARROW PUSHJ P,TYOM ;OUTPUT IT HRRZ CH,0(P) ;THE CHARACTER AGAIN TRO CH,100 ;ASCIIIZE IT PUSHJ P,TYOM ;AND OUTPUT IT TOO MOVE CH,0(P) ;CHARACTER AND FLAGS AGAIN TYIEC2: TXNN CH,EC$SLF ;ECHO LITERALLY JRST TYIEC3 ;NO ANDI CH,177 ;YES PUSHJ P,TYOM ;OUTPUT CHARACTER MOVE CH,0(P) ;RESTORE FLAGS AND CHARACTER TYIEC3: TXNN CH,EC$DLR ;ECHO AS "$" (I.E., ALTMODE) JRST TYIEC4 ;NO MOVEI CH,"$" ;YES PUSHJ P,TYOM ;SO OUTPUT THE DOLLAR SIGN MOVE CH,0(P) ;RESTORE FLAGS AND CHARACTER TYIEC4: TXNN CH,EC$CRL ;CHARACTER GET APPENDED? JRST TYIEC5 ;NO MOVEI CH,.CHCRT ;YES, FIRST THE PUSHJ P,TYOM ;OUTPUT IT MOVEI CH,.CHLFD ;THEN THE PUSHJ P,TYOM ;OUTPUT IT TOO TYIEC5: POP P,CH ;RESTORE STACK AND CHARACTER ANDI CH,177 ;AND NOTHING BUT THE CHARACTER POPJ P, ;RETURN ;THE CHARACTER TABLE CHTBL: EC$UPA+.CHNUL ;000 NUL EC$UPA+.CHCNA ;001 ^A EC$UPA+.CHCNB ;002 ^B EC$UPA+.CHCNC ;003 ^C EC$UPA+.CHCND ;004 ^D EC$UPA+.CHCNE ;005 ^E EC$UPA+.CHCNF ;006 ^F EC$UPA+EC$SLF+.CHBEL ;007 ^G (BELL) EC$UPA+.CHCNH ;010 ^H (BACKSPACE) EC$SLF+.CHTAB ;011 ^I (TAB) EC$SLF+.CHLFD ;012 ^J (LINE FEED) EC$SLF+.CHVTB ;013 ^K (VERTICAL TAB) EC$SLF+.CHFFD ;014 ^L (FORM FEED) EC$SLF+.CHCRT ;015 ^M (CARRIAGE RETURN) EC$UPA+.CHCNN ;016 ^N EC$UPA!EC$CRL+.CHCNO ;017 ^O EC$UPA+.CHCNP ;020 ^P .CHCNQ ;021 ^Q (XON) EC$UPA+.CHCNR ;022 ^R .CHCNS ;023 ^S (XOFF) .CHCNT ;024 ^T EC$UPA+.CHCNU ;025 ^U EC$UPA+.CHCNV ;026 ^V EC$UPA+.CHCNW ;027 ^W EC$UPA+.CHCNX ;030 ^X EC$UPA+.CHCNY ;031 ^Y EC$UPA!EC$CRL+.CHCNZ ;032 ^Z (EOF) EC$DLR+.CHESC ;033 ^[ (ESCAPE) EC$UPA+.CHCBS ;034 ^\ EC$UPA+.CHCRB ;035 ^] EC$UPA+.CHCCF ;036 ^^ EC$UPA+.CHCUN ;037 ^_ ;HERE WHEN A LINE FEED PASSES THE SCREEN, TO NOTE WHEN SCROLLING OCCURS CNTLF: CAIL CH,.CHLFD ;VERTICAL CHARACTER MOTION? CAILE CH,.CHFFD ; . . . POPJ P, ;NO PUSH P,CH ;YES, SAVE IT CAIN CH,.CHLFD ;? MOVEI CH,1 ;YES CAIN CH,.CHVTB ;? MOVEI CH,4 ;YES CAIN CH,.CHFFD ;? MOVEI CH,10 ;YES PUSH P,CH ;SAVE COUNT OF LINES THIS CHARACTER IS WORTH CNTLF2: AOS CH,CURLIN ;COUNT CURSOR MOVEMENT DOWNWARDS SUB CH,SSIZE ;FORCED SCREEN TO SCROLL YET? JUMPL CH,CNTLF8 ;NO SETOM SCRLED ;NOTE THE SCREEN HAS ACTUALLY SCROLLED MOVE CH,[WINDOW+WINDEX,,WINDOW] ;YES, SCREEN SCROLLED A LINE BLT CH,WINDOW+WINTOP-WINDEX-1 ;SO SCROLL OUR COPY TOO SETOM WINDOW+WINTOP-WINDEX ;LAST LINE NOW BLANK MOVE CH,[WINDOW+WINTOP-WINDEX,,WINDOW+WINTOP-WINDEX+1] BLT CH,WINDOW+WINTOP-1 ;SO BLANK OUR COPY TOO PUSH P,A ;NEED PUSH P,AA ; TO PUSH P,B ; SAVE PUSH P,C ; LOTS PUSH P,D ; OF PUSH P,E ; ACS PUSH P,T ; . PUSH P,TT ; . PUSH P,TT1 ; . PUSH P,I ; . PUSH P,OU ; . DMOVE A,SCRNA ;SCREEN BASE MOVEI D,1 ;WANT TO MOVE DOWN A LINE PUSHJ P,DISMV ;CALL THE MAGIC ROUTINE DMOVEM A,SCRNA ;SET FOR NEXT CALL TO WINFIL POP P,OU ; . POP P,I ; . POP P,TT1 ; . POP P,TT ; . POP P,T ; . POP P,E ; NEED POP P,D ; TO POP P,C ; RESTORE POP P,B ; LOTS POP P,AA ; OF POP P,A ;ACS SOS CURLIN ;BACKUP CURSOR TO LAST LINE AGAIN CNTLF8: SOSLE (P) ;NEED TO ACCOUNT FOR MORE LINES? JRST CNTLF2 ;YES, GO BACK AND DO IT AGAIN POP P,CH ;NO, JUNK COUNT WORD POP P,CH ;RESTORE CALLER'S CHARACTER POPJ P, ;AND RETURN TO WHOMEVER U SCH,1 ;HOLDS SAVED CHARACTER TO BE "INPUT" NEXT ; INSTEAD OF TYPED IN ONE U SCRLED,1 ;.LT. 0 IF SCREEN SCROLLED DUE TO TYPEIN U COLUMN,1 ;PRINTING COLUMN U CURLIN,1 ;DISPLAY CURSOR IS CURRENTLY ON THIS LINE # ;ROUTINE TO TYPE A CHARACTER. ;CALL AS FOLLOWS: ;FOR TYPING TEXT: FOR TYPING MESSAGES: ; MOVE CH,CHARACTER MOVE CH,CHARACTER ; PUSHJ P,TYO PUSHJ P,TYOM ; RETURN RETURN ;UNLESS TYOCTF IS TRUE, CONTROL CHARACTERS ARE TYPED WITH "^" ;FOLLOWED BY THE CORRESPONDING PRINTING CHARACTER. ; ;USES ACS A AND AA TYOS: TXOA F2,TYSPCL ;TYPE , ETC INSTEAD OF PRINTER CONTROLS TYOM: TXZ F2,TYSPCL ;CLR SPECIAL TYPEOUT FLAG TXOA F2,TYMSGF ;SET NO-CASE-FLAGGING FLAG TYO: TXZ F2,TYMSGF+TYSPCL;CLR NO-CASE-FLAGGING FLAG & SPECIAL FLAG PUSHJ P,ALTEO ;CHECK FOR FUNNY ALTMODES TXNE F2,TYSPCL ;ARE WE TYPING , ETC. ?? JRST TYOSP ;YES, LOOK FOR SPECIAL CASES TYO2: CAIN CH,.CHTAB ;IS IT A TAB ?? JRST TYOTAB ;YES CAIN CH,.CHLFD ;LINEFEED?? JRST TYOLF ;YES CAIN CH,.CHCRT ;CARRIAGE RETURN ?? JRST TYOCR ;YES CAIN CH,.CHESC ;ESCAPE?? JRST TYOESC ;YES CAIE CH,.CHFFD ;? CAIN CH,.CHBEL ;A ? JRST TYOBEL ;YES, JUST OUTPUT IT CAIN CH,.CHCNH ;? JRST TYOBS ;YES CAIG CH,37 ;SKIP IF NON-CONTROL JRST TYOCT ;HANDLE NON-FORMATTING CONTROLS PUSHJ P,SFLAGC ;SKIP IF CHARACTER WRONG CASE CAIA ;IT'S THE CORRECT CASE JRST TYOFLG ;FLAG WRONG CASE CHARACTERS TYOCH: AOS COLUMN ;YES, SO REMEMBER TO INCREMENT IT FOR CHARACTER JRST TYOA ;FINALLY....GO TYPE THE BLASTED CHARACTER !!! TYOBEL: TXNN F2,TYMSGF ;MESSAGE OR TEXT? TYOCT: TXNE FF,TYOCTF ;WANT TO OUTPUT CONTROL LITERALLY? JRST TYOA ;TYPE CONTROL CHARACTER LITERALLY PUSH P,CH ;SAVE CONTROL-CHARACTER TO BE TYPED MOVEI CH,"^" ;GET UPARROW PUSHJ P,TYO ;TYPE IT MOVE CH,(P) ;GET CONTROL CHARACTER, BUT LEAVE IT ON THE STACK ADDI CH,100 ;MAKE IT CORRESPONDING NON-CONTROL JRST TYOFL5 ;TYPE X OF ^X TYOFLG: PUSH P,CH ;SAVE CHARACTER MOVEI CH,CFLAG ;GET WRONG CASE SYMBOL PUSHJ P,TYO ;TYPE WRONG CASE FLAG MOVE CH,(P) ;GET CHARACTER ORIGINALLY TO BE PRINTED TYOFL5: PUSH P,TYCASF ;SAVE CURRENT CASE SWITCH SETOM TYCASF ;SET CASE TO 0 SO NO FLAGGING PUSHJ P,TYO ;OF X PART OF ^X POP P,TYCASF ;RESTORE CASE SWITCH POP P,CH ;AND ORIGINAL CONTROL CHARACTER POPJ P, ;AND RETURN TYOBS: SKIPN SCTYPE ;ON VIDEO SCREEN? JRST TYOCT ;NO, RANDOM CONTROL CHARACTER SOSGE COLUMN ;BACKSPACE MOVES CURSOR BACKWARDS SETZM COLUMN ;***KROCK JRST TYOA ;OUTPUT THE CHARACTER WITHOUT FURTHER ADO TYOTAB: MOVE CH,COLUMN ;GET CURRENT COLUMN COUNT ;RDH CAML CH,SWIDTH ;ARE WE AT RIGHT MARGIN? ;RDH PUSHJ P,CRR ;YES, SO GO TO NEXT LINE ;RDH MOVE CH,COLUMN ;GET CURRENT COLUMN COUNT ADDI CH,8 ;ADD 8 TO IT FOR TAB COUNT TRZ CH,7 ;BUT JUST GO TO NEXT MULTIPLE OF 8 SUB CH,COLUMN ;CH:=COUNT OF POSITIONS TO NEXT TAB STOP ADDM CH,COLUMN ;UPDATE COLUMN POSITION COUNTER NOW PUSH P,CH ;SAVE COUNT MOVEI CH," " ;GET TAB SIMULATOR CHARACTER (SPACE) PUSHJ P,TYOA ;OUTPUT A SPACE (ERASING SCREEN SLOT) SOSLE (P) ;COUNT IT DOWN JRST .-2 ;FILL ENTIRE TAB SLOT POP P,CH ;RESTORE STACK MOVEI CH,.CHTAB ;RETURN WHAT WE WERE CALLED WITH POPJ P, ;RETURN TO CALLER TYOCR: SETZM COLUMN ;SET COLUMN TO 0 BECAUSE CR GOES TO LEFT MARGIN MOVEI CH,.CHCRT ;REMEMBER WE STARTED WITH CR JRST TYOA ;TYPE CARRIAGE RETURN TYOESC: MOVEI CH,"$" ;ALTMODE PRINTS AS DOLLAR SIGN PUSHJ P,TYO ;TYPE DOLLAR SIGN MOVEI CH,.CHESC ;RESTORE CH AS ESCAPE POPJ P, ;HERE TO TYPE OUT CHARACTERS IN THE FORM , ETC. TYOSP: PUSH P,A ;SAVE A PUSH P,CH ;AND CH TOO MOVEI A,TSPTBL ;SPECIAL CHARACTER-NAMES TABLE TYOSP2: LDB CH,[POINT 7,(A),35] ;LOOK AT TABLE ENTRY JUMPE CH,TYOSP9 ;NOT A SPECIAL CHARACTER CAME CH,(P) ;SPECIAL CASE CHARACTER? AOJA A,TYOSP2 ;NOT THIS ONE, LOOK AT REST OF THE TABLE MOVEI CH,"<" ;YES, START OF SPECIAL TYPEOUT PUSHJ P,TYOCH ;OUTPUT CHARACTER TLOA A,(POINT 7,) ;MAKE BYTE POINTER TO SPECIAL TYPEOUT TYOSP5: PUSHJ P,TYOCH ;OUTPUT ANOTHER CHARACTER ILDB CH,A ;FETCH NEXT FUNNY CHARACTER JUMPN CH,TYOSP5 ;AND TYPE IT OUT MOVEI CH,">" ;END OF SPECIAL CASE NAME PUSHJ P,TYOCH ;TYPE IT OUT POP P,CH ;RESTORE REAL CHARACTER POP P,A ;AND SCRATCH AC USED POPJ P, ;RETURN TO TYOS CALLER TYOSP9: POP P,CH ;RESTORE CHARACTER POP P,A ;AND SCRATCH AC TROUNCED JRST TYO2 ;TYPE OUT NORMALLY ;THE SPECIAL NAME TABLE FOR CHARACTERS TSPTBL: + .CHBEL ;^G = + .CHTAB ;^I = + .CHLFD ;^J = + .CHVTB ;^K = + .CHFFD ;^L = + .CHCRT ;^M = + .CHESC ;^[ = EXP 0 ;END OF TABLE TYOLF: PUSHJ P,CNTLF ;GO NOTE LINE WENT OUT ;AND OUTPUT IT TYOA: SOSG TOB+.BFCTR ;OUTPUT SPACE AVAILABLE? PUSHJ P,TYOOUT ;NO, DO OUTPUT IDPB CH,TOB+.BFPTR ;STUFF CHARACTER IN OUTPUT BUFFER TXO FF,TYOF ;MARK OUTPUT PENDING IN BUFFER AOS TYOTCT ;COUNT TOTAL ACTIVITY POPJ P, ;RETURN TYOOUT: TXZ FF,TYOF ;NOTE NO NEED FOR OUTPUT ANYMORE OUT TTYCHN, ;GIVE CURRENT BUFFER TO MONITOR POPJ P, ;RETURN WITH NEW BUFFER POPJ P, ;IGNORE ERROR FOR NOW ;TTY OPEN BLOCK TTYBLK: TTYIOS ;INITIAL I/O STATUS 'TTY ' ;AIM FOR TTY DEVICE TOB,,TIB ;RING HEADERS FOR I/O TTYPT: POINT 7,TTIBF1+3 ;CCL COMMAND BUFFER POINTER TTYPT2: POINT 7,TTIBF1+3,13 ;TO INSERT FILE NAME AFTER EW OR EB U TYIPT,1 ; U TIB,3 ;BUFFER HEADER U TTIBF1,> ;TERMINAL INPUT BUFFER RING U TOB,3 ;DITTO U TTOBF1,> ;TERMINAL OUTPUT BUFFER RING U TTSTS,1 ;CURRENT TERMINAL I/O MODE U TTYUDX,1 ;UDX OF TTY ON TTY CHANNEL U TYOTCT,1 ;COUNT OF TERMINAL OUTPUT SINCE START OF CMD U IBUF,3 ;INPUT TEXT FILE BUFFER RING HEADER U OBUF,3 ;OUTPUT TEXT FILE BUFFER RING HEADER U BICNT,1 ;.EQ. 0 THEN INPUT BUFFER RING NOT SETUP ;.GT. 0 THEN COUNT OF BUFFERED INPUTS (+1) U BOCNT,1 ;.EQ. 0 THEN OUTPUT BUFFER RING NOT SETUP ;.GT. 0 THEN COUNT OF BUFFERED OUTPUTS (+1) U IOFIR,1 ;FIRST PAGE IN USE FOR I/O U IOLIST,4 ;DUMP-MODE I/O COMMAND LIST ;INBMES -- TYPE OUT A MESSAGE, INSURING A FRESH LINE ;CALL IS: ; ; PUSHJ P,INBMES ; ASCIZ\TEXT\ ; RETURN ; ;USES CH INBMES: SKIPE COLUMN ;IN COLUMN 0 (LEFT MARGIN) PUSHJ P,CRR ;NO, ISSUE A CRLF INLMES: PUSH P,A ;PRESERVE AC "A" HRRZ A,-1(P) ;GET LOCAL ADDRESS OF ASCIZ STRING TLOA A,(POINT 7,) ;MAKE INTO A BYTE POINTER AND SKIP INTO LOOP INLME2: PUSHJ P,TYOM ;OUTPUT THIS CHARACTER ILDB CH,A ;GET THE NEXT CHARACTER JUMPN CH,INLME2 ;AND OUTPUT IT HRRI A,1(A) ;ADVANCE PAST JUNK HRRM A,-1(P) ;AND SET RETURN ADDRESS POP P,A ;RESTORE AC "A" PJRST CRR ;CAP OFF THE MESSAGE WITH A ;ROUTINE TO OUTPUT DECIMAL (OCTAL IF OCTALF 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 GREATER THAN 0? MOVEI CH,"-" ;NO. OUTPUT - PUSHJ P,@LISTF5 MOVMS B ;B:=ABSOLUTE VALUE OF B DPT1: MOVEI A,12 ;RADIX 10 TXNE F2,OCTALF ;OCTAL RADIX? MOVEI A,10 ;YES, CHANGE TO RADIX 8 DPT3: IDIVI B,(A) ;E:=DIGIT PUSH P,E ;PUT DIGIT ON TOP OF PUSH DOWN LIST CAIE B,0 ;DONE? PUSHJ P,DPT3 ;NO. PUSH THIS DIGIT AND PRINT RETURN ADDRESS. POP P,CH ;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: MOVEI CH,.CHCRT ;A PUSHJ P,TYOM ;OUTPUT IT MOVEI CH,.CHLFD ;AND A PJRST TYOM ;OUTPUT IT AND RETURN SUBTTL CRASH RECOVERY FILE ROUTINES ;THE TEB??? ROUTINES (AND ASSOCIATED VARIABLES) WRITE THE CRASH RECOVERY ;FILE WHICH CONTAINS VERBATIM EVERY CHARACTER TYPED IN BY THE USER (YES, ;EVEN RUBOUTS!). CCL CHARACTERS ARE INCLUDED, BUT ALL OTHER COMMAND FILE ;CHARACTERS (E@ FILES) ARE EXCLUDED. ; ;THE CRASH RECOVERY FILE IS CONTROLLED BY THE /CRDISP SWITCH, WHICH ;TAKES "NEVER", "TEMPORARY", "DELETE", OR "PRESERVE" AS ARGUMENTS. ;"NEVER" TURNS OFF CRASH RECOVERY. "TEMPORARY" WRITES THE RECOVERY FILE ;AS NNNTEB.TMP AND DELETES IT ON EXIT. "DELETE" WRITES THE RECOVERY FILE ;AS NNNTEB.TEB (SO LOGOUT WON'T GET IT) AND DELETES IT ON EXIT. "PRESERVE" ;WRITES THE RECOVERY FILE AS NNNTEB.TEB AND DOESN'T DELETE IT. ; ;FURTHER, THE USER CAN SPECIFY THE CRASH RECOVERY FILE EXPLICITLY ;VIA /CRFILE:FILESPEC. ; ;THE CRASH RECOVERY FILE IS AUTOMATICALLY UPDATED EVERY TEBSAV CHARACTERS ;(ACTUALLY THE FIRST BREAK CHARACTER AFTER TEBSAV CHARACTERS) AND IN ANY ;CASE EVERY BLOCK'S WORTH (640 DECIMAL). ;CRASH RECOVERY IMPURE DATA U TEBINF,1 ;.NE. 0 THEN TEBINI HAS BEEN CALLED U TEBING,1 ;.NE. 0 THEN CRASH FILE BEING WRITTEN U TEBCNT,1 ;COUNT OF CHARACTERS TILL NEXT CHECKPOINT U TEBOBH,3 ;OUTPUT BUFFER RING HEADER BLOCK U TEBOBF,BLKSIZ+3 ;OUTPUT BUFFER RING (1 BUFFER ONLY) ;TEBINI -- INITIALIZE CRASH RECOVERY FILE FOR WRITTING TEBINI: SETOM TEBINF ;TEBINI HAS BEEN CALLED SETZM TEBING ;BUT WE'RE NOT WRITING THE FILE (YET) MOVE TT,S.CRDI ;/CRDISP SETTING CAIN TT,$TBNEV ;/CRDISP:NEVER? POPJ P, ;YES, THEN NO CRASH RECOVERY FILE ;SUPPLY DEFAULT CRASH FILE IF USER DIDN'T GIVE ONE MOVSI A,'DSK' ;DEFAULT CRASH FILE DEVICE SKIPN S.CRFI+.FXDEV ;/CRFILE GIVE A DEVICE? MOVEM A,S.CRFI+.FXDEV ;NO, USE OUR DEFAULT SKIPGE TT,S.CRDI ;/CRDISP SETTING MOVEI TT,$TBTEM ;NONE, DEFAULT IS /CRDISP:TEMPORARY MOVE A,TMPTEC ;SIXBIT/NNNTEC/ SUBI A,1 ;SIXBIT/NNNTEB/ (IN CASE .TMP EXTENSION) SETO AA, ; -1 = NO WILDCARDS SKIPN S.CRFI+.FXNAM ;/CRFILE GIVE A FILENAME? DMOVEM A,S.CRFI+.FXNAM ;NO, USE NNNTEB AS A DEFAULT MOVSI A,'TEB' ;TEB EXTENSION CAIN TT,$TBTEM ;/CRDISP:TEMPORARY? MOVSI A,'TMP' ;YES, LET LOGOUT DELETE IT FOR US SKIPN S.CRFI+.FXEXT ;/CRFILE GIVE AN EXTENSION? HLLOM A,S.CRFI+.FXEXT ;NO, USE DEFAULT (,,-1 = NO WILDCARDS) MOVX B,FX.DIR ;THE DIRECTORY-TYPED FLAG TDNE B,S.CRFI+.FXMOM ;/CRFILE GIVE A DIRECTORY? JRST TEBIN1 ;YES IORM B,S.CRFI+.FXMOM ;NO, WE ARE SUPPLYING ONE THEN IORM B,S.CRFI+.FXMOD ;AND IT IS TO BE [,] SETZM S.CRFI+.FXDIR ; . . . SETOM S.CRFI+.FXDIM ; -1 = NO WILDCARDS TEBIN1: MOVEI A,TEBPRT ;DEFAULT CRASH FILE PROTECTION SKIPE FDAEM ;IS THIS A FILE-DAEMON SYSTEM? TRO A,400 ;YES SKIPL S.CRPR ;USER SPECIFY /CRSPRO? MOVE A,S.CRPR ;YES, USE HIS EXPLICIT PROTECTION THEN DPB A,[POINTR S.CRFI+.FXMOD,FX.PRO] ;SUPPLY PROTECTION MOVEI A,FX.PRO ;THE PROTECTION MASK DPB A,[POINTR S.CRFI+.FXMOM,FX.PRO] ;SET MASK TOO ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;NOW SETUP THE OPEN AND LOOKUP BLOCKS FROM THE SCAN BLOCK SETZM XFIBLK ;INITIALIZE FIRST WORD OF FILE BLOCK MOVE A,[XFIBLK,,XFIBLK+1] ;BLT POINTER TO BLT A,XFIBLK+XFILEN-1 ;INITIALIZE ENTIRE FILE BLOCK MOVEI A,XFILEN ;LENGTH OF ENTER BLOCK MOVEM A,XCNT ;SET IN ENTER BLOCK JSP OU,CALLSW ;THIS IS A TOTALLY DISGUSTING KROCK! .FXLEN,,S.CRFI ;T1/SCAN BLOCK IFIW TEBIX ;ADDRESS OF ROUTINE TO GO TO .STOPB JRST TEBIF5 ;WILDCARDS? MOVX A,UU.RRC ;ASCII, AUTO UPDATE OF RIB IFN RUN603, ;6.03 WILL GIVE ?ILL DATA MODE . . . IORM A,OPNSTS ;SET INITIAL I/O STATUS MOVSI A,TEBOBH ;ADDRESS OF OUTPUT BUFFER RING HEADER MOVEM A,OPNBUF ;SET IN OPEN BLOCK OPEN TEBCHN,OPNBLK ;INITIALIZE I/O CHANNEL JRST TEBIF1 ;CAN'T OPEN DSK:????????? ;WE HAVE OUTPUT DEVICE, VERIFY IT'S USEFULLNESS MOVEI A,OPNBLK ;I/O CHANNEL DEVSIZ A, ;SEE HOW BIG BUFFERS SHOULD BE MOVEI A,BLKSIZ+3 ;ASSUME OK ANDI A,-1 ;JUST BUFFER SIZE (INC OVERHEAD) SUBI A,2 ;JUST BUFFER SIZE CAIE A,BLKSIZ+1 ;RIGHT SIZE? JRST TEBIF3 ;NO, FORGET IT HRLI A,TEBOBF+.BFHDR ;ADDRESS OF BUFFER IN RING MOVSM A,TEBOBF+.BFHDR ;SETUP BUFFER RING HRRI A,(BF.VBR) ;VIRGIN BUFFER RING BIT MOVSM A,TEBOBH+.BFADR ;LINK RING TO HEADER BLOCK SETZM TEBOBH+.BFCTR ;FORCE INITIAL OUT ;NOW CREATE OUTPUT FILE ENTER TEBCHN,XFIBLK ;CREATE THE RECOVERY FILE JRST TEBIF4 ;CREATE ERROR ;ALL SET FOR CRASH RECOVERY FILE WRITING SETOM TEBING ;WE ARE NOW LOGGING ALL INPUT POPJ P, ;RETURN ALL SET ;JUNK KROCK ROUTINE FOR CALLING .STOPB TEBIX: MOVEI T2,OPNBLK ;ADDRESS OF OPEN BLOCK MOVE T3,[XFILEN,,XFIBLK] ;LENGTH,,ADDRESS OF ENTER BLOCK MOVEI T4,PTHBLK ;AND A PATH BLOCK WE CAN USE PJRST .STOPB## ;NOW LET SCAN DO ITS THING ;INITIALIZATION FAILURES ;THESE ROUTINES ARE JUNK, BUT UNTIL TECO HAS A BETTER ERROR-HANDLING ;FACILITY THEY WILL JUST HAVE TO DO . . . TEBIF1: $WARN (COC,TEBIFX,) TEBIF3: $WARN (CRB,TEBIFX,) TEBIF4: $WARN (CEC,TEBIFX,) TEBIF5: $WARN (WIC,TEBIFX,) TEBIFX: $WARN (RWC,,) SETZM TEBING ;MAKE PREDICTION COME TRUE SETOM WINFLG ;DON'T MUNGE ON THE SCREEN PJRST CRR ;ISSUE ;TEBCHR -- ADD COMMAND CHARACTER TO CRASH RECOVERY FILE. ;CALL IS: ; ; MOVX CH, ; PUSHJ P,TEBCHR ; RETURN ; ;WHERE IS THE 7-BIT ASCII COMMAND CHARACTER AS TYPED BY THE USER. ; ;ON AN I/O ERROR A WARNING MESSAGE IS ISSUED, BUT ANY REAL ERRORS ARE ;JUST IGNORED. ; ;PRESERVES ALL ACS. TEBCHR: SKIPN TEBING ;DOING COMMAND BACKUP? POPJ P, ;NO, THEN DON'T DO IT SOSG TEBOBH+.BFCTR ;ANY ROOM IN OUTPUT BUFFER? PUSHJ P,TEBOUT ;NO, OUTPUT CURRENT BUFFER IDPB CH,TEBOBH+.BFPTR;PUT CHARACTER IN BUFFER SOSLE TEBCNT ;TIME TO FORCE A CHECKPOINT YET? POPJ P, ;NO CAIL CH,.CHLFD ;YES, A BREAK CHARACTER ENCOUNTERED? CAILE CH,.CHFFD ; (I.E., A , , OR ) CAIN CH,.CHESC ;OR AN ? CAIA ;YES POPJ P, ;NO, THEN STILL MORE TO COME ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;TIME TO CHECKPOINT THE OUTPUT FILE TEBURB: SKIPN TEBING ;DOING COMMAND CRASH RECOVERY? POPJ P, ;NO, THEN DON'T DO IT PUSH P,A ;NEED A COUPLA ACS PUSH P,AA ; . . . MOVE AA,[TEBCHN,,.FOURB] ;FILOP. FUNCTION WORD MOVE A,[1,,AA] ;FILOP. ARG POINTER TO PUSH P,TEBOBH+.BFPTR ;MONITOR BUG - LEAVES POINTER MUNGED PUSH P,TEBOBH+.BFCTR ;MONITOR BUG - THE COUNTER TOO FILOP. A, ;CHECKPOINT THE CRASH RECOVERY FILE OUTSTR [ASCIZ\% Error checkpointing crash recovery file, proceeding \] ;COMPLAIN TO USER POP P,A ;SAVED BYTE COUNTER SKIPE TEBOBH+.BFCTR ;DID WE JUST CROSS A BLOCK BOUNDRY? MOVEM A,TEBOBH+.BFCTR ;NO, STILL HAVE OLD BLOCK, SUPPRESS NULLS POP P,TEBOBH+.BFPTR ;END OF MONITOR BUG SKIPGE A,S.CRSA ;/CRSAVE:NNN GIVEN? MOVEI A,TEBSAV ;NO, COUNT OF CHARACTERS TILL NEXT CHECKPOINT CAIG A,0 ;IF 0 (E.G., /CRSAVE:0) MOVEI A,-1 ;THEN WAIT FOR A BLOCK BOUNDRY MOVEM A,TEBCNT ;RESET CHARACTER COUNTER POP P,AA ;RESTORE THE CRUNCHED ACS POP P,A ; . . . POPJ P, ;AND RETURN IN ANY CASE ;OUTPUT CURRENT BUFFER, GET NEW ONE TEBOUT: OUT TEBCHN, ;GIVE BUFFER TO MONITOR CAIA ;ALL WELL AND GOOD OUTSTR [ASCIZ\% Error writing crash recovery file, proceeding \] ;COMPLAIN TO USER MOVEM A,TEBCNT ;NEED AN AC SKIPGE A,S.CRSA ;GET USER-SPECIFIED SAVE COUNT MOVEI A,TEBSAV ;COUNT OF CHARACTERS TO NEXT CHECKPOINT CAIG A,0 ;IF 0 (E.G., /CRSAVE:0) MOVEI A,-1 ;THEN WAIT FOR A BLOCK BOUNDRY EXCH A,TEBCNT ;RESET SINCE OUT IS AN IMPLICIT CHECKPOINT POPJ P, ;AND RETURN IN ANY CASE ;TEBFIN -- TIME TO EXIT, TOSS OUT CRASH RECOVERY FILE NOW. TEBFIN: SKIPGE A,S.CRDI ;GET /CRDISP SETTING MOVEI A,$TBDEL ;NONE, ASSUME /CRDISP:DELETE JUMPE A,TEBFI6 ;IF NO FILE DON'T BOTHER CAIN A,$TBPRE ;/CRDISP:PRESERVE? JRST TEBFI3 ;YES SETZB A,AA ;NULL FILENAM = DELETE SKIPE TEBING ;I/O CHANNEL OPEN? RENAME TEBCHN,A ;YES, DELETE CRASH RECOVERY FILE JFCL ;HO HUM TEBFI3: CLOSE TEBCHN, ;LET GO OF FILE IN ANY CASE RELEAS TEBCHN ;AND DEVICE/CHANNEL AS WELL TEBFI6: SETZM TEBING ;FILE NO LONGER OPEN POPJ P, ;AND THAT'S THAT. ;TEBJ -- WRITE OUT A J COMMAND TO THE BACKUP COMMAND FILE TO ;ENSURE THAT, IN THE EVENT OF A CRASH RECOVERY STINT ON A DIFFERENT ;TERMINAL TYPE, THE CURSOR (".") WILL BE IN THE RIGHT PLACE. TEBJ: PUSH P,A ;SAVE A PUSH P,B ;SAVE B PUSH P,B+1 ;AND "IDIVI B," PUSH P,CH ;SAVE CHARACTER XMOVEI A,TEBCHR ;CHARACTER OUTPUT ROUTINE MOVE B,I ;THE CURRENT CURSOR POSITION SUB B,BEG ;MAKE INTO RELATIVE TEXT POSITION PUSHJ P,DPT ;"TYPE" THE CURSOR POSITION MOVEI CH,"J" ;A "J" COMMAND PUSHJ P,TEBCHR ;PUT IT IN BACKUP FILE MOVEI CH,.CHESC ;AND TERMINATING PUSHJ P,TEBCHR ;PUT IT IN BACKUP FILE PUSHJ P,TEBCHR ;TERMINATE REGULAR COMMAND POP P,CH ;RESTORE CH POP P,B+1 ;RESTORE "IDIVI B," POP P,B ;RESTORE B POP P,A ;RESTORE A POPJ P, ;RETURN SUBTTL COMMAND CHARACTER ROUTINES ;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, ;PEEK AT NEXT COMMAND CHAR AT CURRENT LEVEL ;CALL: PUSHJ P,PKRCH ; ERROR RETURN IF NO MORE CHARS AT THIS LEVEL ; NORMAL RETURN WITH CHAR IN CH PKRCH: SKIPG COMCNT ;ANY CHARS LEFT? POPJ P, ;NO, TAKE ERROR RETURN PUSH P,COMPTR ;SAVE CURRENT COMMAND POINTER PUSH P,COMPTX ; (DOUBLE-WORD POINTER ADDRESS) PUSH P,COMCNT ;SAVE CURRENT COMMAND COUNTER PUSHJ P,GCH ;YES, GET NEXT CHAR SANS TRACING POP P,COMCNT ;RESTORE COMMAND COUNTER POP P,COMPTX ; (DOUBLE-WORD POINTER ADDRESS) POP P,COMPTR ;RESTORE COMMAND POINTER JRST CPOPJ1 ;TAKE SUCCESSFUL RETURN WITH CHAR IN CH ;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,COMPTR ;GET CHAR. JRST ALTEO ;CONVERT OLD ALTMODES AND RETURN ;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,COMPTR ;NO. GET COMMAND CHARACTER IN CH PUSHJ P,ALTEO ;CONVERT OLD ALTMODES IF EO = 1 TXNE FF,TRACEF ;IN TRACE MODE? TXNE F2,NOTRAC ;TRACE ENABLED? POPJ P, ;NO, RETURN PUSH P,A ;YES, SAVE A FOR CALLING ROUTINE PUSHJ P,TYO ;TYPE THE COMMAND POP P,A ;RESTORE THE STATE POPJ P, ;AND RETURN RCH2: POP P,CH ;SAVE RETURN FOR POPJ IN CH POP P,COMCNT ;GET RID OF FLAG SKIPE EQM ;DON'T ALLOW NEG MACRO COUNT SOS EQM ;DECREMENT THE MACRO LEVEL SOSG COMCNT ;IF ANG BRAK ON PDL, ITS A INCOMPLETE MACRO $FATAL (IAB,, or (...) in macro>) POP P,COMCNT ;GET COUNT FROM NEXT MACRO LEVEL POP P,COMPTX ;RESTORE DOUBLE-WORD POINTER ADDRESS (IF ANY) POP P,COMPTR ;CURRENT POINTER TOO POP P,COMMAX ;NUMBER OF COMMAND CHARACTERS PUSH P,CH ;PUT RETURN BACK ON PDL. JRST RCH ;TRY AGAIN. ;SCAN COMMAND STRING FOR CHARACTER IN TT ;IGNORING PAIRS STARTING WITH CHAR. IN TT1 AND ENDING WITH (TT) ;ASSUMED THAT COMPTR IS SET ;NON-SKIP RETURN IF (TT) CAN'T BE FOUND ;SKIP RETURN IF FOUND ;COMPTR LEFT SET FOR NEXT CHAR. IN COMMAND STRING SKAN: TXO F2,NOTRAC ;INHIBIT TRACE ACTION WHILE SKANNING MOVEI C,0 ;CTR FOR <> AND "...' PAIRS SKAN0: TXZ F2,SKIMQF+SKIMRF+SKANFS ;CLR SKIM FLAGS PUSHJ P,SKIMCH ;GET COMMAND CHAR. CAIN CH,(TT1) ;SECONDARY CHARACTER? AOJA C,SKAN1 ;YES, COUNT IT CAIN CH,(TT) ;PRIMARY CHAR? JRST SKAN99 ;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,SKIMCH ;GET CHAR AFTER "^" CAIN CH,"A" JRST SKAN7 ;^A COMMAND CAIN CH,"^" JRST SKAN11 ;^^ COMMAND JRST SKAN0 ;ORDINARY CONTROL-COMMAND, FORGET IT ;EB; EP; ER; EW; EZ; E@. SKAN3: PUSHJ P,SKIMCH MOVEI T,SK3TAB ;WHICH E COMMAND? JRST SKAN00 ;@I; @N; @S; @_; @FN; @FS; @F_ SKAN4: PUSHJ P,SKIMCH ;WHAT FOLLOWS @? MOVEI T,SK4TAB PUSHJ P,DISPAT JRST SKAN4 ;MUST BE 1 OF THESE 4 ;O; EB; EP; ER; EW; E@ - EAT NORMAL STRING DELIMITED BY SKAN9: PUSHJ P,SKIM ;IGNORE TO $ JRST SKAN0 ;HERE TO EAT ^AMESSAGE^A SKAN7: MOVEI T,.CHCNA ;IGNORE TO ^A JRST SKAN5 ;HERE TO EAT !TAG! SKAN8: MOVEI T,"!" ;IGNORE TO ! SKAN5: PUSHJ P,SKIM1 ;IGNORE TO CHAR IN T JRST SKAN0 ;EAT TEXT STRING DELIMITED BY @/TEXT/ CLASS CONSTRUCTION SKAN6: PUSHJ P,SKIMCH ;GET SEARCH DELIMITER SKIPA T,CH ;IGNORE TO NEXT OCCURRENCE ;EAT TEXT DELIMITED BY NORMAL CONSTRUCTION SKAN12: MOVEI T,.CHESC ;DELIMITER IS ALTMODE PUSHJ P,SKIMRQ ;SKIP TO DELIMITER & WATCH OUT FOR ^Q,^R JRST SKAN0 ;@I - GET EXPLICIT TERMINATOR AND EAT STRING SKAN13: PUSHJ P,SKIMCH ;GET INSERT DELIMITER SKIPA T,CH ;IGNORE TO NEXT OCCURRENCE ;I; - EAT STRING UP TO NORMAL DELIMITER SKAN14: MOVEI T,.CHESC ;DELIMITER IS ALTMODE PUSHJ P,SKIM.R ;SKIP TO DELIMITER & WATCH OUT FOR ^R JRST SKAN0 ;Q-REGISTER COMMAND, EAT Q-REGISTER NAME SKAN11: PUSHJ P,SKIMCH ;IGNORE NEXT CHAR. JRST SKAN0 ;@FN; @FS; @F_ - EAT TWO TEXT STRINGS WITH EXPLICIT DELIMITERS SKAN16: MOVEI T,SK5TAB ;TABLE FOR @F JRST SKAN17 ;FN; FS; F_ - EAT TWO TEXT STRINGS WITH NORMAL DELIMITER SKAN15: MOVEI T,SK1TAB ;TABLE FOR F COMMANDS SKAN17: TXO F2,SKANFS ;SIGNAL FS OR FN IN PROGRESS PUSHJ P,SKIMCH ;GET CHAR AFTER F JRST SKAN00 ;D/FD; K/FK; R/FR SKAN20: TXZN F2,SKANFS ;CLEAR F-COMMAND (2 STRING ARGS) FLAG JRST SKAN0 ;OOPS - WASN'T AN F COMMAND JRST SKAN12 ;GO EAT SINGLE STRING ;@D/@FD; @K/@FK; @R/@FR SKAN21: TXZN F2,SKANFS ;CLEAR F-COMMAND (2 STRING ARGS) FLAG JRST SKAN0 ;OOPS - WASN'T AN F COMMAND JRST SKAN6 ;GO EAT SINGLE STRING ;HERE ON END OF "PAIRED" STRING, RETURN UNLESS NESTED SKAN99: SOJGE C,SKAN0 ;IF MATCH JUST ENDS A PAIR, LOOP BACK TXZ F2,NOTRAC ;ENABLE TRACING JRST CPOPJ1 ;OTHERWISE, WE HAVE WHAT WE WANT ;SKIM OVER TEXT ; ;SKIM SKIP TO NEXT ALTMODE, GIVING ^R & ^Q NO SPECIAL TREATMENT ;SKIM1 SKIP OVER ARBITRARY CHAR IN T, GIVING ^R & ^Q NO SPECIAL TREATMENT ;SKIM.R SKIP TO ARBITRARY CHAR IN T, UNLESS IT IS AFTER ^R ;SKIMRQ SKIP TO ARBITRARY CHAR IN T, UNLESS IT IS AFTER EITHER ^R OR ^Q SKIMRQ: TXO F2,SKIMQF ;CK FOR ^Q AND ^R SKIM.R: TXOA F2,SKIMRF ;CK FOR ^R SKIM: MOVEI T,.CHESC ;SKIP TO NEXT ALTMODE SKIM0: CHKEO EO25,SKIM1 ;IF EO=1,2 THEN USE OLD QUOTING CHARACTERS SKIM1V: PUSHJ P,SKIMCH ;SKIM ANOTHER COMMAND CHARACTER CAIN CH,(T) ;DELIMITER CHARACTER WE WANT? JRST SKIM3 ;YES TXNE F2,SKIMRF ;NO, ALLOWING QUOTING? CAIE CH,.CHCNV ;YES, IS THIS THE QUOTE CHARACTER? JRST SKIM1V ;NO, KEEP LOOKING FOR DELIMITER PUSHJ P,SKIMCH ;YES, EAT IT AND THE CHARACTER QUOTED JRST SKIM1V ;KEEP LOOKING FOR DELIMITER SKIM1: PUSHJ P,SKIMCH ;GET NEXT TEXT CHAR. CAIN CH,(T) ;CHARACTER WE WANT? JRST SKIM3 ;YES CAIN CH,.CHCNQ ;^Q? TXNN F2,SKIMQF ;YES, CK FLAG ON? JRST .+2 ;NO JRST SKIM2 ;YES CAIN CH,.CHCNR ;^R? TXNN F2,SKIMRF ;YES, CK FLAG ON? JRST SKIM1 ;NO, KEEP LOOKING SKIM2: PUSHJ P,SKIMCH ;GOBBLE UP NEXT CHARACTER JRST SKIM1 ;CONTINUE SKIMMING SKIM3: TXZE F2,SKANFS ;SKIMMING OVER FS OR FN? JRST SKIM0 ;YES, IGNORE 1ST DELIMITER POPJ P, ;GET A SINGLE CHARACTER FROM COMMAND STRING ;TAKE ERROR RETURN FROM SKAN IF THERE ARE NO MORE SKIMCH: PUSHJ P,SKRCH ;GET A COMMAND CHAR. APOPJ: POP P,A ;ERROR RETURN FROM SKAN IF NO MORE CHARS. POPJ P, ;SKAN ROUTINE DISPATCH TABLES SKNTAB: XWD SKAN15,"F" XWD SKAN14,"I" XWD SKAN14,.CHTAB ;TAB XWD SKAN9,"O" XWD SKAN8,"!" XWD SKAN7,1 ;^A XWD SKAN11,36 ;^^ XWD SKAN2,"^" XWD SKAN3,"E" XWD SKAN11,"U" XWD SKAN11,"Q" XWD SKAN11,"X" XWD SKAN11,"G" XWD SKAN11,"M" XWD SKAN11,"%" XWD SKAN11,"[" XWD SKAN11,"]" XWD SKAN4,"@" XWD SKAN11,42 ;" SK1TAB: XWD SKAN12,"S" ;S OR FS XWD SKAN12,"N" ;N OR FN XWD SKAN12,"_" ;_ OR F_ XWD SKAN20,"D" ;D (IGNORED) OR FD XWD SKAN20,"K" ;K (IGNORED) OR FK XWD SKAN20,"R" ;R (IGNORED) OR FR XWD 0,0 ;LIST TERMINATOR SK3TAB: XWD SKAN9,"B" ;EB XWD SKAN9,"P" ;EP XWD SKAN9,"R" ;ER XWD SKAN9,"W" ;EW XWD SKAN9,"Z" ;EZ XWD SKAN9,"@" ;E@ XWD 0,0 SK4TAB: XWD SKAN16,"F" ;@F XWD SKAN13,"I" ;@I SK5TAB: XWD SKAN6,"S" ;@S OR @FS XWD SKAN6,"N" ;@N OR @FN XWD SKAN6,"_" ;@_ OR @F_ XWD SKAN21,"D" ;@D (IGNORED) OR @FD XWD SKAN21,"K" ;@K (IGNORED) OR @FK XWD SKAN21,"R" ;@R (IGNORED) OR @FR XWD 0,0 SUBTTL START TECO'ING ;HERE FROM ERROR GOE: TRZA FF,777777-TRACEF-QMFLG-FORM-SEQF ;HERE TO START UP A NEW COMMAND GO: TRZ FF,777777-TRACEF-FORM-SEQF PUSHJ P,PCSEC ;VERIFY PC IN PROPER SECTION ;RDH TXZ FF,CCLFLG ;CLEAR "Y" REQUESTED FLAG TXZ F2,DOING ;NOT IN A COMMAND YET TXZ F2,NOTRAC MOVE P,[IOWD PDLEN,PDLST] ;INITIALIZE PUSHDOWN LIST SETZM PDLST0 ;FLAG PDL TOP - NOTE: PDL FLAGS ARE ;0 = TOP OF PDL ;-1 = LAST ITEM IS AN ITERATION ;+1 = LAST ITEM IS A PARENTHESIS ;GT 1 = LAST ITEM IS A MACRO PUSH P,CH ;SAVE POSSIBLE ALREADY INPUT CHARACTER AOSN TOOBIG ;MAYBE TIME TO TRY TO SHRINK DOWN? PUSHJ P,SHRINK ;YES, SEE IF ANY MEMORY CAN BE RECLAIMED ; MOVE A,BEG ;GET POSITION BUFFER FLOATED AWAY TO ; SUB A,OLDBEG ;CALCULATE DISTANCE IT MOVED ; ADDM A,SCRNA ;MARK NEW START OF SCREEN BASE ; ADDM A,SCRNB ;AND FIRST CHARACTER ON SCREEN ; ADDM A,SCRNZ ;AND END OF SCREEN TOO ; ADDM A,OLDBEG ;MARK FOR NEXT DRIFT SKIPE SCTYPE ;MAYBE DON'T DISPLAY SKIPE CMFTYO ;SUPPRESSING OUTPUT DUE TO COMMAND FILE? JRST GO2 ;DO NOT DISPLAY SKIPE VFREEZ ;SCREEN FROZEN BY "V" COMMAND? JRST GO2 ;YES, DO NOT REDISPLAY! SKIPN WINFLG ;SCREEN HAVE IMPORTANT INFO? JRST GOSC ;NO, OK TO REDISPLAY SKIPN SCRLED ;YES, DID IT CAUSE A SCROLL? JRST GOSB ;NO, THEN WE CAN STILL SAFELY REDISPLAY SKIPE S.SFT ;USER TIRED OF JUNK MESSAGE? $INFO (SFT,,) JRST GO2 ;JUST TYPE "*" ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE GOSB: TXZ F2,CBTMF ;DON'T ERASE TO END OF SCREEN GOSC: MOVE I,Z ;GET POINTER TO END OF BUFFER MOVEM I,SCRNVZ ;TELL DISPLAY TO GO ALL THE WAY ; MOVE B,SCRNB ;START OF SCREEN ; MOVE C,SCRNZ ;END OF SCREEN ; CAML B,BEG ;SCREEN START IN IN TEXT BUFFER? ; CAMLE C,Z ;AND END STILL IN TEXT BUFFER? ; SETOM MESFLG ;NO - SOMETHING MESSED UP SKIPE MESFLG ;RECONFIGURE DISPLAY IF REFRESH NECESSARY PUSHJ P,WINIT ;RECALCULATE DISPLAY START PUSHJ P,WINFIL ;FILL UP NEW SCREENFUL SKIPGE DISPTF ;SEE IF POINTER IS ON SCREEN JRST GOSC2 ;IT WAS, WE'RE OK PUSHJ P,WINIT ;WASN'T, SO RECALCULATE SCREEN START PUSHJ P,WINFIL ;AND REBUILD A SCREEN IMAGE SKIPL DISPTF ;CURSOR ON SCREEN NOW? HALT .+1 ;BLETCH GOSC2: SKIPE MESFLG ;IF WINDOW OUT OF SYNC WITH SCREEN, PUSHJ P,ZAPSCN ;MAKE THEM BOTH EMPTY PUSHJ P,DISPLX ;OUTPUT THE SCREEN IMAGE MOVE CH,SLENTH ;LENGTH OF SCREEN DISPLAY AREA PUSHJ P,LINECH ;POSITION CURSOR TO COMMAND AREA TXZE F2,CBTMF ;WANT A CLREOS HERE? PUSHJ P,CLREOS ;YES SETZM SCRLED ;CLEAR SCREEN-HAS-SCROLLED FLAG GO2: POP P,CH ;RESTORE POSSIBLE FIRST COMMAND CHARACTER SETZM EQM ;CLEAR MACRO LEVEL COUNT MOVE PF,[XWD -LPF-1,PFL-1] SKIPN CMFINF ;HAVE WE PROCESSED INIT FILE YET? PUSHJ P,CMFINI ;NO, PROCESS IT IF REQUESTED SKIPN TEBINF ;HAVE WE CALLED TEBINI YET? PUSHJ P,TEBINI ;NO, INITIALIZE CRASH RECOVERY FILE JRST CLIS CLIS: SETZM WINFLG ;SO DISPLAY WILL HAPPEN NEXT TIME SETZM VFREEZ ; . . . CLIS4: SETZM COMCNT ;AT THIS POINT WE HAVE NO COMMAND CHARACTERS SETZM COLUMN ;AND ARE AGAINST THE LEFT MARGIN SKIPN CCLSW ;NEED CCL COMMAND? JRST LIS0 ;NO PUSHJ P,CCLIN ;GET THE CCL COMMAND TO TYI BUFFER JRST LI0 ;AND DON'T PROMPT "*" LIS0: SKIPN CMFECH ;NOECHOING OF COMMAND FILE INPUT? TXNE FF,QMFLG ;1ST CHARACTER IN ALREADY? JRST LIS1A ;YES MOVEI CH,"*" PUSHJ P,TYOM ;TYPE * LIS1: TXO FF,TIBKA!TINEC ;CATCH FIRST CHARACTER TYPED LIS1A: TXOE FF,QMFLG ;UNLESS ONE ALREADY IN JRST LIS1C ;WE ALREADY HAVE FIRST CHAR PUSHJ P,TYI SKIPN CMFECH ;NOECHOING COMMAND FILE INPUT? SKIPN SCTYPE ;IF USING A SCREEN, JRST LIS1C ;NOT, JUST PROCESS COMMAND PUSH P,CH ;WE ARE, SAVE TYPED CHARACTER A MOMENT PUSHJ P,CLREOS ;CLEAR OLD COMMAND FROM SCREEN POP P,CH ;GET USER'S CHARACTER BACK LIS1C: CAIE CH,.CHDEL ;IS CHARACTER A CAIN CH,.CHCNU ;OR A ^U? LIS1E: TXZA FF,QMFLG ;FORCE TYI CALL CAIA ;(SKIP) JRST LIS1 ;JUST EAT THE CHARACTER SANS ECHO LIS1F: SKIPE TKESC ;DOES THIS TERMINAL SEND ESCAPE SEQUENCES? JRST LIS2 ;YES, GO CHECK FOR ESCAPE SEQUENCE CAMN CH,TKCUP ;CURSOR UP KEY? JRST LIS4A ;YES CAMN CH,TKDWN ;CURSOR DOWN KEY? JRST LIS4B ;YES CAMN CH,TKRGT ;CURSOR RIGHT KEY? JRST LIS4C ;YES CAMN CH,TKLFT ;CURSOR LEFT KEY? JRST LIS4D ;YES LIS1N: CAIN CH,.CHCNH ;^H (BACKSPACE) TYPED? JRST LIS4P ;YES, DISPLAY PREVIOUS SCREEN CAIN CH," " ;SPACE TYPED? JRST LIS4S ;YES, DISPLAY MORE OF SCREEN CAIN CH,.CHCRT ;? JRST LIS4V ;YES, PUT CURSOR ON SCREEN CAIN CH,.CHLFD ;? JRST LIS4L ;YES, 1L$$ CAIN CH,.CHFFD ;? JRST LIS4R ;YES, REFRESH SCREEN SKIPN CMFECH ;NO, SUPPRESSING COMMAND FILE ECHO? PUSHJ P,TYIEC ;NO, ECHO THE CHARACTER CAIN CH,.CHCNZ ;^Z? JRST LIS4Z ;YES, RETURN TO MONITOR LEVEL CAIN CH,"*" ;1ST CHAR AN ASTERISK? JRST LIS4X ;YES, SAVE AWAY PREVIOUS COMMAND STRING JRST LI0 ;NO, REGULAR COMMAND - CONTINUE NORMALLY ;HERE TO INTERPRET POSSIBLE USER-INDUCED ESCAPE SEQUENCE (E.G., THE ;VARIOUS "ARROW" KEYS). LIS2: CAMN CH,TKESC ;START OF AN ESCAPE SEQUENCE? SKIPN TT,SCTYPE ;ON A VIDEO TERMINAL? JRST LIS1N ;NO, FORGET THIS STUFF CAIE TT,VXANSI ;ANSI ESCAPE SEQUENCES? JRST LIS2E ;NO TXO FF,TIBKA!TINEC ;YES, QUIETLY PUSHJ P,TYI ; READ SECOND CHARACTER OF SEQUENCE CAIE CH,"[" ;REALLY ANSI SEQUENCE? JRST LIS2U ;NO, QUEER CHARACTERS LIS2E: TXO FF,TIBKA!TINEC ;QUIETLY PUSHJ P,TYI ; SNARF NEXT NEXT INPUT CHARACTER CAMN CH,TKCUP ;CURSOR UP KEY? JRST LIS4A ;YES CAMN CH,TKDWN ;CURSOR DOWN KEY? JRST LIS4B ;YES CAMN CH,TKRGT ;CURSOR RIGHT KEY? JRST LIS4C ;YES CAMN CH,TKLFT ;CURSOR LEFT KEY? JRST LIS4D ;YES ;UNKNOWN ESCAPE SEQUENCE, JUST TREAT IT AS A REGULAR COMMAND SEQUENCE ;IF ANSI, THEN WE LOSE THE "[", BUT THINGS ARE TOUGH ALL OVER. LIS2U: MOVEM CH,SCH ;SAVE SECOND CHARACTER SKIPE CMFECH ;SUPPRESSING COMMAND FILE ECHO? JRST LIS2X ;YES, DON'T ECHO STUFF THEN MOVE CH,TKESC ;NO, "ESCAPE" CHARACTER PUSHJ P,TYIEC ;"ECHO" IT MOVE CH,SCH ;AND THE OTHER CHARACTER TYPED PUSHJ P,TYIEC ;"ECHO" IT TOO LIS2X: MOVE CH,TKESC ;FIRST CHARACTER TYPED JRST LI0 ;TREAT AS A REGULAR COMMAND ;MOVE CURSOR UP ONE SCREEN LINE LIS4A: SKIPA D,[-1] ;MOVE "UP" ONE LINE ;MOVE CURSOR DOWN ONE SCREEN LINE LIS4B: MOVEI D,1 ;MOVE "DOWN" ONE LINE SKIPN SCTYPE ;ON A VIDEO TERMINAL? JRST LI0 ;NO, TREAT AS NORMAL CHARACTER THEN PUSH P,D ;SAVE COUNT MOVE A,DIPTI ;GET LAST REMEMBERED "." IN DISPLAY IMAGE CAMN A,PT ;HAS "." CHANGED (E.G., "BJ.=$$" COMMAND) SKIPL DISPTF ;NO, IS "." ON THE CURRENT SCREEN? CAIA ;SOMETHING SMELLS, RE-BUILD THE BLOODY SCREEN JRST LIS4B1 ;NO, PROCEEDING NORMALLY ;HERE WHEN SOMETHING FUNNY IS HAPPENING - FOR SOME REASON THE CURSOR ;(I.E., ".") IS NOT ON THE CURRENT SCREEN IMAGE (E.G., ^H COMMAND) OR ;"." IS NOT CORRECTLY REPRESENTED BY THE CURRENT SCREEN IMAGE WHICH ;DISPLAYS "." (E.G., "BJ.=$$" COMMAND WHICH LEAVES THE SCREEN FROZEN, ;"." DISPLAYED ON FROZEN SCREEN, BUT "." IS REALLY AT 0). MOVE TT,Z ;GET END OF TEXT BUFFER MOVEM TT,SCRNVZ ;ENSURE THAT DISPLAY GOES ALL THE WAY PUSHJ P,WINIT ;INITIALIZE A VIRGIN SCREEN PUSHJ P,WINFIL ;AND RE-BUILD IT FROM FIRST PRINCIPLES MOVE D,(P) ;RESTORE D LIS4B1: CAIN D,1 ;MOVING DOWN? SETOM PT ;YES, DON'T GET CONFUSED BY THE "/\" DMOVE A,DIPTA ;BASE/COUNT PAIR FOR SCREEN LINE WITH "." PUSHJ P,DISMV ;MOVE POINTER AROUND POP P,D ;RESTORE COUNT (DIRECTION FLAG ALSO) JUMPGE D,LIS4B3 ;IF MOVING FORWARD ALL SET CAMN A,DIPTA ;HAS ANYTHING HAPPENED CAME AA,DIPTAA ; (DITTO) CAIA ;YES JRST [MOVEM A,PT ;NO, AT TOP OF TEXT JRST GO] ;SO CAN'T GO ANY FURTHER SETZ D, ;CHANGE THE POINTER NOT AT ALL PUSHJ P,DISMV ;BUT SET I TO START OF SCREEN LINE LIS4B3: SETZB C,CH ;INITIALIZE COUNTER AND CHARACTER CAMGE I,Z ;AGAINST BOTTOM OF TEXT? SKIPN DIPTC ;OR CURSOR AGAINST MARGIN? JRST LIS4B8 ;YES LIS4B5: PUSHJ P,DISCHR ;GET A DISPLAY CHARACTER CAIE CH,.CHCRT ;IF END OF DISPLAY LINE CAMN C,DIPTC ;OR REACHED OLD CURSOR'S "POSITION" SOSA I ;YES, TOSS OUT "CURRENT" CHARACTER AOJA C,LIS4B5 ;NOT YET LIS4B8: MOVEM I,PT ;MOVE THE CURSOR (".") ;NOW WRITE AN NNNJ COMMAND INTO COMMAND FILE (IN CASE LATER EXECUTED ON ;A DIFFERENT SCREEN SIZE) TXNN FF,CFOF ;IF TOP-LEVEL COMMAND TERMINAL TYPEIN PUSHJ P,TEBJ ;THEN WRITE THE NNNJ COMMAND JRST GO ;NOW UPDATE SCREEN ;CURSOR RIGHT LIS4C: AOS A,PT ;MOVE RIGHT ONE PLACE CAMLE A,Z ;STILL IN THE TEXT BUFFER? SOS PT ;NO, BACK TO WHERE WE WERE JRST GO ;NEXT COMMAND ;CURSOR LEFT LIS4D: SOS A,PT ;MOVE LEFT ONE PLACE CAMGE A,BEG ;STILL IN THE TEXT BUFFER? AOS PT ;NO, BACK TO WHERE WE WERE JRST GO ;NEXT COMMAND ;HERE TO FORCE A SCREEN REFRESH LIS4R: SETZM WINFLG ;CLEAR STICKY SCREEN FLAG SETZM VFREEZ ; . . . SETOM MESFLG ;AND ANNOUNCE THE TRASHED SCREEN EFFECT TXO F2,CBTMF ;ALSO CLEAR OUT BOTTOM OF SCREEN LIS4RG: TXZ FF,QMFLG ;GOBBLE UP THE CHARACTER JRST GO ;AND LET GOSC REFRESH THE SCREEN ;HERE TO DO A "1L$$" COMMAND WHEN USER TYPES A . IN ADDITION, ;IF NOT VIDEO SCREEN MODE DO A "1T$$" AS WELL. LIS4L: MOVEI B,1 ;EXPLICIT "1" LINE TXO FF,ARG ;MAKE IT TOTALLY EXPLICIT PUSHJ P,LINE ;ADVANCE ONE LINE SKIPE SCTYPE ;VIDEO SCREEN HANDLING? JRST GO ;YES, DO SCREEN UPDATE PUSHJ P,CRR ;NO, START UP A NEW LINE MOVEI B,1 ;WANT ONE LINE ONLY TXO FF,ARG ;EXPLICITLY ONE LINE PUSHJ P,TYPE ;TYPE ONE LINE JRST GO ;GO FOR NEXT COMMAND ;HERE TO "SCROLL" BACKWARDS THROUGH THE TEXT WITHOUT CHANGING "." LIS4P: SKIPN SCTYPE ;DOING VIDEO SCREEN HANDLING? JRST LI0 ;NO, TREAT BACKSPACE AS A CHARACTER PUSHJ P,VUPRV ;VIEW PREVIOUS WINDOW'S WORTH PUSHJ P,CLREOS ;CLEAR ANY JUNK LEFT LYING AROUND JRST LIS4RG ;RESTART COMMAND SCANNING ;HERE TO "SCROLL" FOREWARDS THROUGH THE TEXT WITHOUT CHANGING "." LIS4S: SKIPN SCTYPE ;DOING VIDEO SCREEN HANDLING? JRST LI0 ;NO, TREAT SPACE AS A SPACE PUSHJ P,VUNXT ;VIEW NEXT WINDOW'S WORTH PUSHJ P,CLREOS ;CLEAR ANY JUNK LEFT LYING AROUND JRST LIS4RG ;RESTART COMMAND SCANNING ;HERE TO PUT CURSOR ON CURRENT SCREEN LIS4V: PUSHJ P,TYI ;GET THE FOLLOWING CAIE CH,.CHLFD ;IT IS A , ISN'T IT? HALT .+1 ;BLETCH SKIPN SCTYPE ;OR NON-SCREEN-MODE TERMINAL? JRST LIS1E ;YES, EAT THE SKIPL DISPTF ;CURSOR ALREADY ON SCREEN? JRST LIS4V2 ;NO DMOVE A,DIPTA ;YES, GET CURSOR BASE SETZ D, ;MOVE 0 LINES JRST LIS4V4 ;FIND START OF LINE LIS4V2: DMOVE A,SCRNA ;CURRENT SCREEN BASE MOVE D,CLENTH ;HOW FAR DOWN WE PREFER THE CURSOR LIS4V4: PUSHJ P,DISMV ;GET APPROPRIATE TEXT ADDRESS MOVEM I,PT ;SET NEW "." ;NOW WRITE AN NNNJ COMMAND INTO COMMAND FILE (IN CASE LATER EXECUTED ON ;A DIFFERENT SCREEN SIZE) TXNN FF,CFOF ;IF TOP-LEVEL COMMAND TERMINAL TYPEIN PUSHJ P,TEBJ ;THEN WRITE THE NNNJ COMMAND JRST GO ;NOW UPDATE SCREEN ;RETURN TO MONITOR LEVEL. NO ATTEMPT IS MADE TO PROTECT AGAINST ;PSYCHOPATHIC USERS ISSUING ".FINISH" COMMANDS . . . LIS4Z: TXZE FF,TYOF ;NEED A TYO? PUSHJ P,TYOOUT ;YES. DO SO. PJRST FINISZ ;NOTHING SPECIAL HERE ;SAVE PREVIOUS COMMAND STRING IN NAMED Q-REGISTER LIS4X: MOVE C,COMLEN ;LENGTH OF STRING TXNN F2,NALTFS ;FS$$ COMMAND LAST THING? SUBI C,1 ;NO, TOSS OUT SECOND $ OF $$ ; NOTE THAT IF COMMAND WAS ABORTED BY ^G^U ; THEN DELLIN LEFT COMLEN COUNTING THE ^G ; CHARACTER SO WE CAN DO THE SUBI HERE. MOVE B,CMDBAS ;POSITION OF FIRST CHAR. IN BYTES IMULI B,5 TXNN F2,GOING ;ANY CMD SEEN BEFORE? TDZA B,B ;NO - FLAG NCS ERROR FOR LATER. PUSHJ P,XQREG ;YES - SAVE CMD IN Q-REG BUFFER MOVEM B,COMSAV ;SAVE FOR LATER HRRZI CH,"*" ;RESTORE CH (GARBAGED BY XQREG) JRST LI0 ;START UP COMMAND PROCESSING SUBTTL TECO COMMAND INPUT AND EDITING LI0:; SETZM COMCNT ;COMCNT:=0 TXZ F2,NALTFS ;CLEAR FLAG SETZM TAGSYM ;INITIALIZE "O" COMMAND TAG "SYMBOL TABLE" MOVE T,[XWD TAGSYM,TAGSYM+1] ;BLT POINTER TO BLT T,SYMEND-1 ;ZERO TAG SYMBOL TABLE DMOVE A,CMDPTR ;MASTER COMMAND BUFFER STUFFER DMOVEM A,COMPTR ;RESET DYNAMIC COMMAND POINTER LI10: TXZ FF,ALTF+BELLF+XPLNFL+EMFLAG LI11: MOVEI A,1 ;ONE CHARACTER ADJBP A,COMPTR ;ADVANCE COMMAND BUFFER BYTE POINTER SKIPN SECTN ;PC IN EXTENDED SECTION? HRRZ AA,A ;NO, HALF WORD ADDRESS CAMGE AA,CMDEND ;ROOM IN COMMAND BUFFER? JRST LI30 ;YES ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;EXPAND COMMAND BUFFER, ALLOCATING CORE IF NEEDED LI20: MOVE T,Z ;GET THE NUMBER OF CHARACTERS NOW ADDI T,COMAIW*5 ;PLUS INCREMENTAL TEXT GROWTH SIZE CAMG T,MEMSIZ ;WILL THIS OVERFLOW? JRST LI23 ;NO, JUST EXPAND THE COMMAND BUFFER PUSHJ P,GRABAK ;GET THE NECESSARY CORE JRST CORERR ;BUMMER! COMMAND GOT TOO BIG ;OK, EXPAND THE COMMAND BUFFER CONFIDENTLY LI23: MOVEI B,COMAIW ;EXPAND COMMAND BUFFER ADDB B,CMDEND ;EXTEND COMMAND BUFFER END ADDRESS MOVE A,QRBUF ;BASE TEXT ADDRESS FOR Q-REGS/ETC. IDIVI A,5 ;A:=Q-REG/ETC. BASE WORD ADDRESS. MOVE AA,A ;BASE TEXT ADDRESS (WORDS) ADDI AA,COMAIW ;OFFSET BY "EXPANSION" SIZE MOVE B,Z ;EDITING BUFFER END TEXT ADDRESS IDIVI B,5 ;B:=EDITING BUFFER END WORD ADDRESS. SUB B,A ;B:=TOTAL Q-REG AND TEXT WORDS MOVSI T,((B)) ;ASSUME IFIW INDEXING OFF OF AC "B" SKIPE SECTN ;PC IN EXTENDED SECTION? LSH T,IFX2EF ;YES, SELECT EFIW INDEXING THEN IOR A,T ;INDEX "SOURCE" POINTER IOR AA,T ;INDEX "DESTINATION" POINTER ;LOOP MOVING TEXT AREA DOWN IN MEMORY LI25: MOVE T,@A ;GET A Q-REG/DATA BUFFER WORD MOVEM T,@AA ;AND MOVE IT DOWN SOJGE B,LI25 ;LOOP FOR ENTIRE TEXT AREA ;NOW RELOCATE ALL THE WORLD'S POINTERS (MUCH SIMPLER THAN GC'S WORRIES) MOVEI B,COMAIW*5 ;HOW FAR TEXT MOVED ADDM B,QRBUF ;RELOCATE Q-REG BASE ADDRESS ADDM B,BEG ;RELOCATE EDITING BUFFER "B" ADDRESS ADDM B,PT ;RELOCATE EDITING BUFFER "." ADDRESS ADDM B,Z ;RELOCATE EDITING BUFFER "Z" ADDRESS MOVSI AA,-SCRNRL ;LENGTH OF SCREEN RELOCATION TABLE ADDM B,@SCRNRP ;RELOCATE SCREEN POINTER AOBJN AA,.-1 ;RELOCATE THE REST OF 'EM ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;HERE ON EACH COMMAND INPUT CHARACTER LI30: TXZN FF,QMFLG ;1ST CHAR IN ALREADY? PUSHJ P,TYI ;GET A NON-NULL CHARACTER IN CH CAIN CH,.CHDEL ;? JRST CTRDL ;YES, UNCONDITIONALLY RUBOUT ONE CHARACTER TXZE F2,CQUOTE ;IS QUOTE-THE-NEXT-CHARACTER SET? JRST LI3QT ;YES, THEN WE HAVE A COMMAND CHARACTER CAIN CH,.CHBEL ;CONTROL-G? JRST CTRLG ;YES CAIN CH,.CHCNR ;CONTROL-R? JRST CTRLR ;YES CAIN CH,.CHCNU ;CONTROL-U? JRST CTRLU ;YES CAIN CH,.CHCNV ;CONTROL-V? JRST CTRLV ;YES CAIN CH,.CHCNW ;CONTROL-W? JRST CTRLW ;YES ;WE HAVE A COMMAND CHARACTER IN CH. STASH IT AWAY AND READ MORE AOS COMCNT ;COUNT ANOTHER COMMAND CHARACTER IDPB CH,COMPTR ;AND STASH IT IN THE COMMAND BUFFER CAIN CH,.CHESC ;? JRST LI70 ;YES, MAYBE TIME TO EXECUTE THE COMMAND JRST LI10 ;BACK FOR THE NEXT COMMAND CHARACTER LI3QN: TXO F2,CQUOTE ;WANT TO QUOTE THE NEXT CHARACTER LI3QQ: TXZ FF,ALTF!BELLF ;AND DO NOTHING ELSE WITH IT LI3QT: AOS COMCNT ;COUNT THIS CHARACTER AS A COMMAND CHARACTER IDPB CH,COMPTR ;AND PUT IT IN THE COMMAND BUFFER JRST LI11 ;BACK FOR THE NEXT COMMAND CHARACTER LI70: TXZ FF,BELLF ;$ CLEARS ^G FLAG TXON FF,ALTF ;SET ALT-MODE FLAG. WAS IT ON? JRST LI11 ;NO, KEEP ACCEPTING COMMAND INPUT MOVE A,COMCNT ;COUNT OF COMMAND CHARACTERS MOVEM A,COMMAX ;SET COMMAND CHARACTER ADDRESS UPPER BOUND MOVEM A,COMLEN ;SAVE IN CASE OF * COMMAND NEXT CAIG A,2 ;JUST $$? PUSHJ P,TEBURB ;YES, FORCE OUT BACKUP FILE CHARACTERS DMOVE A,CMDPTR ;MASTER COMMAND BUFFER BYTE POINTER DMOVEM A,COMPTR ;RESET COMMAND BUFFER BYTE POINTER SETZM CCLSW ;FINISHED WITH CCL READ SKIPE CMFECH ;SUPPRESSING ECHO DUE TO COMMAND FILE? JRST LI74 ;YES, THEN NO SKIPN SCTYPE ;UNLESS DISPLAYING, PUSHJ P,CRR ;TYPE CRLF LI74: TXZE FF,TYOF ;ANY OUTPUT HANGING AROUND? PUSHJ P,TYOOUT ;YEAH, NOW IS A REASONABLE TIME TO FORCE IT OUT SETZM TYOTCT ;CLEAR OUTPUT ACTIVITY COUNTER ; (SO "" DOES NICE THINGS) JRST CD ;DECODE COMMAND ;HERE ON CTRDL: PUSHJ P,RUBCHR ;RUBOUT ONE COMMAND CHARACTER JRST LIS1E ;EMPTY, WATCH FIRST CHARACTER SPECIAL JRST LI10 ;RESUME COMMAND TYPEIN ;HERE ON CONTROL-G CTRLG: TXO FF,BELLF ;SET BELL FLAG TXZ FF,ALTF ;AND CLEAR ESC SEEN FLAG JRST LI3QT ;AND STUFF ^G INTO COMMAND BUFFER ;HERE ON CONTROL-R CTRLR: CHKEO EO21,LI3QQ ;IF EO=1 THEN ^R IS RANDOM CHARACTER CHKEO EO25,LI3QN ;IF EO=2 THEN ^R IS QUOTING CHARACTER PUSHJ P,RETYPR ;OTHERWISE ^R RETYPES THE CURRENT LINE SKIPG COMCNT ;HAVE ANY COMMANDS? JRST LIS1E ;NO, WATCH FIRST CHARACTER SPECIAL JRST LI11 ;AND SIMPLY DISAPPEARS ;HERE ON CONTROL-U CTRLU: PUSHJ P,DELLIN ;DELETE ONE "PHYSICAL" COMMAND LINE JRST CLIS4 ;EMPTY, RE-PROMPT JRST LI10 ;RESUME COMMAND TYPEIN ;HERE ON CONTROL-V CTRLV: CHKEO EO25,LI3QQ ;IF EO=1 OR 2 THEN ^V IS RANDOM CHARACTER JRST LI3QN ;OTHERWISE ^V IS QUOTING CHARACTER ;HERE ON CONTROL-W CTRLW: CHKEO EO25,LI3QQ ;IF EO=1 OR 2 THEN ^W IS RANDOM CHARACTER PUSHJ P,RUBWRD ;OTHERWISE ^W RUBS-OUT A COMMAND WORD JRST LIS1E ;EMPTY, WATCH FIRST CHARACTER SPECIAL JRST LI10 ;RESUME COMMAND TYPEIN ;RETYPE THE CURRENT COMMAND LINE RETYPR: TXNE FF,BELLF ;^G^R (RETYPE ENTIRE COMMAND)? PUSHJ P,BACKUP ;YES, DELETE THE ^G FROM THE COMMAND BUFFER MOVE D,COMCNT ;MARK CURRENT POSITION PUSHJ P,BACKLN ;BACK UP TO BEG OF LINE JRST RETYP2 ;HIT BEG OF COMMAND STRING IBP COMPTR ;SKIP THE AOS C,COMCNT ; (AND COUNTER TOO) ;AT THIS POINT, COMCNT IS ONE TOO SMALL AND COMPTR POINTS ONE BYTE IN FRONT ;OF THE FIRST TEXT COMMAND CHARACTER TO BE REPRINTED (E.G., ON THE ;OR IMMEDIATELY IN FRONT OF THE COMMAND BUFFER IF NO FULL LINES YET). RETYP2: SKIPE CMFECH ;COMMAND FILE NO ECHO? JRST RETYP4 ;YES, NO OUTPUT HERE THEN MOVEI CH,.CHCRT ; PUSHJ P,TYOM ;BACK TO START OF LINE MOVEI CH,.CHLFD ; SKIPN SCTYPE ;ON VIDEO TERMINAL? PUSHJ P,TYOM ;NO, THEN NEED NEW LINE AS WELL CAILE E,0 ;NICE NORMAL SETUP? PUSHJ P,RETYUP ;NO, EMBEDDED LINE MOVEMENTS, WORK HARDER MOVEI CH,"*" ;OUR PROMPT SKIPG COMCNT ;HAVE WE BACKED UP TO THE START? PUSHJ P,TYOM ;YES, THEN RE-PROMPT FOR NEATNESS TOO MOVEM D,COMCNT ;RESET COMCNT TO CORRECTNESS JRST RETYP5 ;ENTER RETYPE LOOP ;LOOP OUTPUTTING THE COMMAND LINE AS PRESENT IN THE BUFFER RETYP4: ILDB CH,COMPTR ;GET NEXT [POSSIBLE] COMMAND CHAR JUMPLE C,RETYP5 ;(BACKLN CAN RETURN US -1) SKIPN CMFECH ;SUPPRESSING ECHO DUE TO COMMAND FILE? PUSHJ P,TYIEC ;ECHO (TYPE) COMMAND CHARACTER RETYP5: CAMGE C,D ;CAUGHT UP YET? AOJA C,RETYP4 ;NO, DO MORE RETYP8: SKIPE SCTYPE ;ON VIDEO SCREEN? PUSHJ P,CLREOS ;YES, ERASE POSSIBLE GARBAGE LDB CH,COMPTR ;RELOAD CURRENT [LAST] CHARACTER CAIN CH,.CHESC ;LOOKING AT AN ALTMODE? TXO FF,ALTF ;YES, BETTER SET FLAG POPJ P, ;RETURN RETYUP: SKIPN SCTYPE ;ON VIDEO SCREEN? POPJ P, ;HARDCOPY - WE CAN DO NOTHING USEFUL HERE PUSH P,CH ;SAVE CHARACTER CAML E,SLENTH ;MOVEMENT GREATER THAN SCREEN SIZE? JRST RETYU8 ;YES, JUST CLEAR SCREEN PUSHJ P,CUP ;MOVE CURSOR UP ONE LINE SOJG E,.-1 ;MOVE UP AS MANY LINES AS NEEDED PUSHJ P,CLREOS ;CLEAR REST OF SCREEN POP P,CH ;RESTORE CHARACTER POPJ P, ;AND RETURN RETYU8: PUSHJ P,CLRSCN ;ERASE AND HOME UP SETZ E, ;WE DID ALL THE LINES NEEDED POP P,CH ;RESTORE CHARACTER POPJ P, ;BACK TO WHOMEVER ;HERE TO RUBOUT ONE COMMAND CHARACTER RUBCHR: PUSHJ P,RUBOUT ;RUBOUT ONE COMMAND CHARACTER POPJ P, ;ALL USED UP, WATCH FIRST CHAR SPECIAL JRST CPOPJ1 ;BACK FOR MORE COMMAND INPUT ;HERE TO RUBOUT ONE COMMAND "WORD" RUBWRD: SKIPN SCTYPE ;ON VIDEO TERMINAL? JRST RUBWR1 ;NO, THE "^W" STAYS PUSHJ P,RUB2P ;YES, ERASE THE "^W" FROM THE SCREEN TXNN FF,BELLF ;^G^W (RUBOUT "SENTENCE")? JRST RUBWR1 ;NO PUSHJ P,RUB2P ;YES, ERASE THE "^G" FROM THE SCREEN PUSHJ P,BACKUP ; AND FROM THE COMMAND BUFFER TOO! ;NOW EAT ANY AND ALL PRECEDING SPACES (ASSUME = SPACE) RUBWR1: LDB CH,COMPTR ;FETCH CURRENT LAST COMMAND CHARACTER CAIE CH,.CHVTB ;IF A CAIN CH,.CHFFD ;OR A JRST RUBWR4 ;EAT IT, AND PRECEDING , IF PRESENT RUBWR2: CAIE CH,.CHTAB ;IF A CAIN CH," " ;OR A SPACE JRST RUBWR3 ;JUST ABSORB IT CAIE CH,.CHLFD ;A ? JRST RUBWR7 ;RANDOM CHARACTER, EAT IT PUSHJ P,RUBOUT ;RUBOUT THE POPJ P, ;ALL USED UP, WATCH FIRST CHAR SPECIAL CAIE CH,.CHCRT ;PRECEDED BY A ? JRST RUBWR5 ;NO, TREAT AS A POSSIBLE WORD BREAK RUBWR3: PUSHJ P,RUBOUT ;RUBOUT THE CHARACTER POPJ P, ;ALL USED UP, WATCH FIRST CHAR SPECIAL JRST RUBWR2 ;LOOK FOR MORE SPACES RUBWR4: PUSHJ P,RUBOUT ;EAT THE OR POPJ P, ;ALL USED UP, WATCH FIRST CHAR SPECIAL CAIN CH,.CHCRT ;PRECEDED BY A ? JRST RUBWR7 ;YES, EAT THE TOO RUBWR5: CAIL CH,"0" ;NUMERIC? CAILE CH,"9" ; . . . CAIL CH,"A" ;ALPHAMERIC (UPPER CASE)? CAILE CH,"Z" ; . . . CAIL CH,"a" ;ALPHAMERIC (LOWER CASE)? CAILE CH,"z" ; . . . CAIN CH,"-" ;OR RANDOM HYPHEN? JRST RUBWR7 ;YES TO ONE OF ABOVE, PART OF WORD, EAT IT TXNN FF,BELLF ;^G^W (RUBOUT "SENTENCE")? JRST CPOPJ1 ;NO, ONLY ONE WORD, ALL DONE CAIE CH," " ;YES, ON A SPACE? CAIN CH,.CHCRT ;OR A TAB? JRST RUBWR7 ;YES, THEN NOT A "SENTENCE" BREAK CAIE CH,.CHLFD ;? JRST RUBWR6 ;NO, END OF "SENTENCE" PUSHJ P,BACKUP ;PEEK AT CHARACTER PRECEDING AOS COMCNT ;RESTORE COMMAND CHARACTER COUNT IBP COMPTR ;AND COMMAND CHARACTER POINTER CAIN CH,.CHCRT ; PAIR? JRST RUBWR4 ;YES, THEN NOT A "SENTENCE" BREAK LDB CH,COMPTR ;NO, RESTORE CHARACTER RUBWR6: TXZ FF,BELLF ;CLEAR ^G FLAG JRST CPOPJ1 ;AND RESUME COMMAND TYPEIN RUBWR7: PUSHJ P,RUBOUT ;RUBOUT ANOTHER COMMAND CHARACTER POPJ P, ;ALL USED UP, WATCH FIRST CHAR SPECIAL JRST RUBWR5 ;SEE IF END OF "WORD" YET ;DELETE ONE "PHYSICAL" (TERMINATED BY ) COMMAND LINE DELLIN: TXNN FF,BELLF ;^G^U (DELETE ENTIRE COMMAND)? JRST DELLI2 ;NO, JUST ^U, EAT THIS PHYSICAL LINE PUSHJ P,BACKUP ;YES, EAT THE ^G ADDI C,1 ;(SIGH) SO LIS4X CAN SUBI IT OUT AGAIN MOVEM C,COMLEN ;IN CASE OF "*" COMMAND IMMEDIATELY FOLLOWING TXO F2,GOING ;FLAG THAT WE HAVE SOMETHING GOING ON DELLI2: PUSHJ P,BACKLU ;BACKUP A LINE, GUARANTEEING MOVEMENT SETOM COMCNT ;NOTE NO COMMANDS LEFT SKIPE CMFECH ;COMMAND FILE NO ECHO? JRST DELLI6 ;YES SKIPE SCTYPE ;NO, USER TYPEIN, ON VIDEO TERMINAL? JRST DELLI4 ;YES, ERASE THE LINE PUSHJ P,INLMES ;"ECHO" THE ^U ASCIZ \^U\ PUSHJ P,CRR ;GO TO A NEW LINE JRST DELLI6 ;AND FINISH UP DELLI4: MOVEI CH,.CHCRT ;A PUSHJ P,TYOM ;BACK TO MARGIN CAIE E,0 ;BAD CASE (EMBEDDED "LINES")? PUSHJ P,RETYUP ;YES, MOVE CURSOR BACK THEN PUSHJ P,CLREOL ;YES, ERASE ABOUT-TO-BE ERASED LINE FROM SCREEN DELLI6: SKIPGE COMCNT ;ANYTHING LEFT IN BUFFER? POPJ P, ;NO AOS COMCNT ;KEEP CRLF IBP COMPTR JRST CPOPJ1 ;CONTINUE TYPE-IN ;RUBOUT ONE COMMAND CHARACTER, CLEARING THE SCREEN AS NEEDED RUBOUT: SKIPG COMCNT ;ANYTHING TYPED IN? POPJ P, ;NO, RETURN ALL USED UP LDB CH,COMPTR ;RELOAD THE CHAR. SKIPE COMCNT ;AT BEGINNING OF COMMAND STRING? SKIPE CMFECH ;COMMAND FILE NO ECHO? JRST RUBOU8 ;YES TO ONE OF ABOVE ;RUBOUT ONE LOGICAL CHARACTER FROM THE SCREEN SKIPN SCTYPE ;ON VIDEO TERMINAL? JRST RUBOU6 ;NO CAIN CH,.CHDEL ;A RUBOUT? JRST RUBOU8 ;YES (?) CAIE CH,.CHCRT ;A ? CAIN CH,.CHTAB ;A ? JRST RUBTAB ;YES, HAIRY CASE CAIN CH,.CHLFD ;? JRST RUBLF ;YES CAIN CH,.CHVTB ;? JRST RUBVT ;YES CAIN CH,.CHFFD ;? JRST RUBFF ;YES CAIGE CH," " ;RANDOM CONTROL CHARACTER? SKIPA CH,CHTBL(CH) ;YES HRLI CH,(EC$SLF) ;NO, PRINTING ASCII TXNE CH,EC$CRL ;ECHO WITH ? JRST RUBCRL ;YES, ICK PUSH P,C ;SAVE AN AC SETZ C, ;INITIAL COUNTER TXNN CH,EC$SLF ;ECHO LITERALLY? TXNE CH,EC$DLR ;OR AS "$"? MOVEI C,1 ;YES, ONE SCREEN POSITION TAKEN UP TXNE CH,EC$UPA ;ECHO AS ^X? MOVEI C,2 ;YES, THEN TAKES UP TWO POSITIONS RUBOU3: PUSHJ P,RUB1P ;WIPE OUT ONE SCREEN CHARACTER SOJG C,RUBOU3 ;LOOP FOR ALL SCREEN POSITIONS POP P,C ;RESTORE AC JRST RUBOU8 ;FINALLY GO DELETE CHARACTER RUBOU6: PUSHJ P,TYOM ;JUST ECHO THE CHARACTER BEING RUBBED-OUT RUBOU8: PUSHJ P,BACKUP ;BACK OVER THE CHAR. RUBOU9: JUMPG C,CPOPJ1 ;RESUME TYPE-IN IF ANYTHING LEFT SKIPE SCTYPE ;ON SCREEN-MODE TERMINAL? POPJ P, ;YES, JUST WAIT PUSHJ P,CRR ;NO, SO GO TO NEW LINE, MOVEI CH,"*" ;RE-PROMPT, PJRST TYOM ;AND WAIT FOR NEW COMMAND RUBCRL: PUSHJ P,CUP ;BACKUP A LINE FIRST, THEN RUBTAB: PUSHJ P,BACKUP ;RUBOUT THE LAST CHARACTER JUMPLE C,RETYPR ;IF NONE LEFT, RE-PROMPT TXZE FF,BELLF ;^G SEEN RECENTLY (E.G., ^G^W)? JRST RUBTA2 ;YES, DON'T DELETE IT IN RETYPE CODE PUSHJ P,RETYPR ;OTHERWISE REBUILD THE SCREEN LINE JRST CPOPJ1 ;AND RETURN FOR MORE INPUT RUBTA2: PUSHJ P,RETYPR ;REBUILD THE SCREEN LINE TXO FF,BELLF ;TURN ^G FLAG BACK ON JRST CPOPJ1 ;RETURN HAPPILY RUBVT: SKIPA E,[4] ; IS 4 S RUBFF: MOVEI E,^D8 ; IS 8 S PUSHJ P,CUP ;MOVE UP THE SCREEN SOJG E,.-1 ; FOR REQUISITE NUMBER OF LINES JRST RUBOU8 ;AND DELETE THE CHARACTER RUBLF: PUSHJ P,CUP ;MOVE CURSOR UP ONE LINE JRST RUBOU8 ;DELETE THE RUB2P: PUSHJ P,RUB1P ;BLANK FIRST (OF TWO) SCREEN POSITIONS RUB1P: SKIPE CMFECH ;NO-ECHOING OF COMMAND FILE? POPJ P, ;YES, THEN NO OUTPUT MOVEI CH,.CHCNH ;BACKSPACE CHARACTER PUSHJ P,TYOM ;OUTPUT IT MOVEI CH," " ;SPACE CHARACTER PUSHJ P,TYOM ;OUTPUT IT MOVEI CH,.CHCNH ;ANOTHER BACKSPACE CHARACTER PJRST TYOM ;OUTPUT IT ;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 ; ;RETURNS IN E THE COUNT OF "LOGICAL" LINES PASSED - I.E., THE COUNT OF ;'S, 'S, OR 'S NOT IMMEDIATELY PRECEDED BY A . NOTE THAT ;A IS 4 S, AND A IS 8 S. ; ;BACKLU IS LIKE BACKLN ONLY IT WILL GO BACK A LINE EVEN IF POINTER ;IS ONLY JUST PAST A . THIS ALLOWS MULTIPLE ^U'S TO EAT MULTIPLE ;LINES. BACKLU: SETZ E, ;COUNT OF LINES PASSED LDB CH,COMPTR ;GET CURRENT COMMAND CHARACTER CAIN CH,.CHLFD ; MOVEI E,1 ;YES, ONE LINE CAIN CH,.CHVTB ;? MOVEI E,4 ;YES, FOUR LINES CAIN CH,.CHFFD ;? MOVEI E,^D8 ;YES, EIGHT LINES JRST BACKL0 ;NOW SEARCH FOR THE PRECEDING LINE BACKLN: SETZ E, ;COUNT OF LINES PASSED LOOKING FOR LDB CH,COMPTR ;COPY OF CURRENT LAST CHARACTER SKIPA C,COMCNT ;AND COUNT OF CHARACTERS BACKL0: PUSHJ P,BACKUP ;BACK UP ONE CHAR BACKL1: JUMPG C,BACKL5 ;KEEP GOING IF MORE TO DO BACKL2: HLRZ C,E ;GET LAST "LINES" COUNT ADD E,C ;ADD TO TOTAL SO FAR ANDI E,-1 ;RETURN "LINES" SKIPPED MOVE C,COMCNT ;RESTORE C TXZ FF,BELLF ;CLEAR FLAG POPJ P, ;SINCE WE JUST HIT THE START OF THE BUFFER BACKL5: PUSHJ P,CKEOL ;IS THIS AN EOL CHAR? JRST BACKL8 ;NO, LOOP FOR OTHER FUNNY CHARACTERS HLRZ C,E ;GET LAST "LINES" COUNT ADD E,C ;ADD TO TOTAL SO FAR CAIN CH,.CHLFD ;? HRLI E,1 ;YES CAIN CH,.CHVTB ;? HRLI E,4 ;YES, = 4 S CAIN CH,.CHFFD ;? HRLI E,^D8 ;YES, = 8 S PUSHJ P,BACKUP ;YES, BACK UP ONE MORE JUMPLE C,BACKL2 ;IF AT BEGINING, THEN STOP IN ANY CASE TXNN FF,BELLF ;DOING ^G BACKUP (E.G., ^G^R OR ^G^U)? CAIE CH,.CHCRT ;NO, AT OTHER THAN A ? JRST BACKL1 ;YES (TO EITHER), DON'T STOP HERE ANDI E,-1 ;RETURN COUNT OF "EXCESS" LINES SKIPPED JRST CPOPJ1 ;TAKE SKIP RETURN BACKL8: CAIGE CH," " ;CONTROL CHARACTER? MOVE CH,CHTBL(CH) ;YES, GET ECHO CONTROL BITS TXNE CH,EC$CRL ;THIS CHARACTER ECHO WITH ? ADDI E,1 ;YES, COUNT IT IN LINES COUNTER JRST BACKL0 ;AND LOOK AT NEXT (PREVIOUS) CHARACTER ;BACK UP BYTE POINTER IN COMPTR, LOAD APPROPRIATE CHARACTER IN CH, ;AND ADJUST COMCNT BACKUP: MOVNI T,1 ;NEGATIVE ONE POSITIONS ADJBP T,COMPTR ;BACK UP COMPTR ONE POSITION DMOVEM T,COMPTR ;AND LEAVE RESULTS IN COMPTR SOSLE C,COMCNT ;DECREMENT COMMAND COUNT LDB CH,COMPTR ;LOAD CHAR IF ANY LEFT POPJ P, SUBTTL TECO COMMAND EXECUTION CD: TXO F2,GOING!DOING ;A COMMAND STRING IS IN RET: PUSHJ P,PCSEC ;CHECK FOR WRONG PC SECTION TXZ FF,ARG!ARG2!FINDR!PCHFLG!SEQUIN TXZ F2,S.MINS!S.REPL!S.DELE!S.KILL!S.FRCM ;CLEAR SEARCH FLAGS TXZE FF,COLONP ;COLON-MODIFIED COMMAND FORGET TO RETURN VALUE? $FATAL (NVR,,) CD1: SETZM SYL ;NO ARGUMENT ELEMENT (OR ATOM) SEEN CD2: SETZM NUM ;NO ARGUMENT STRING SEEN MOVE A,BEG ;STARTING CHARACTER ADDRESS CAML A,Z ;ANY TEXT IN TEXT BUFFER TXZ F2,LSNF ;NO, THEN NO LSN'S LEFT EITHER MOVSI A,(MOVE B,) ;STANDARD ARG OPERATOR IS MOVE B,SYL CD3: HLLM A,DLIM CD5: PUSHJ P,RCH CD9: MOVE A,CH ;GET COMMAND CHARACTER CAIL CH,"0" ;IS IT A DIGIT? CAILE CH,"9" TXZ F2,OCTALF ;NO, CLEAR OCTAL RADIX FLAG CAIE A,"`" ;ACCENT GRAVE IS ILLEGAL CAILE A,"z" ;ALSO 173-177 ARE ILLEGAL MOVEI A,0 CAILE A,"_" ;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: 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 XCT DLIM ;NUM:=NUM (DLIM OPERATOR) SYL MOVEM B,NUM SETZM SYL ;CLEAR OLD OPERAND MOVE C,SARG ;SAVE SECOND ARGUMENT IN C. TXZ FF,SYLF ;CLR DIGIT STRING BIT TXZ F2,CTLVA+CTLVVA+CTLWB+CTLWWB+EMATCH+TXTCTL TRZ A,100000 ;CLR PUSHJ DISPATCH BIT TRZE A,200000 ;JRST OR PUSHJ DISPATCH? JRST (A) PUSHJ P,(A) JRST RET U DLIM,1 ; U NUM,1 ; U SYL,1 ; U SARG,1 ; ;CHECK FOR PC SECTION GOODNESS PCSEC: PUSH P,TT ;SAVE AN AC XMOVEI TT,777 ;GET CURRENT PC SECTION ANDCMI TT,777 ;REDUCE TO JUST SECTION COUNT CAMN TT,SECTN ;PC STILL IN RIGHT SECTION? JRST PCSEC8 ;YES, OK $FATAL (WPS,PCSEC3,) PCSEC3: MOVE TT,SECTN ;THE CORRECT PC SECTION HLLM TT,-1(P) ;FORCE POPJ TO RIGHT SECTION TOO HRRI TT,PCSEC8 ;AND A LOCAL PC XJRST TT ;RESTORE SECTION GOODNESS PCSEC8: POP P,TT ;RESTORE TRASHED AC POPJ P, ;RETURN IN PROPER SECTION ;DIGITS FORM DECIMAL INTEGERS. CDNUM: TXON FF,SYLF ;DIGIT STRING ALREADY STARTED? SETZM SYL ;NO, INIT TO ZERO MOVEI A,12 ;RADIX 10 TXNN F2,OCTALF ;OCTAL FLAG ON? JRST CDNUM1 ;NO MOVEI A,10 ;YES, RADIX 8 CAIG CH,"7" ;8 OR 9 IN OCTAL STRING? JRST CDNUM1 ;NO, PROCEED TXZ F2,OCTALF ;YES, CLEAR OCTAL FLAG $FATAL (OCT,,< "00" in octal digit string>) CDNUM1: IMUL A,SYL ;SCALE PREVIOUS VALUE ADDI A,-60(CH) ;ADD IN NEW DIGIT ;SOME COMMANDS HAVE A NUMERIC VALUE VALRET: MOVEM A,SYL CD7: TXO FF,ARG JRST CD5 ;$ () COMMAND ALTMOD: PUSHJ P,PKRCH ;PEEK AHEAD ONE CHARACTER JRST ALTM2 ;NO COMMAND CHARACTERS LEFT AT THIS LEVEL CAIE CH,.CHESC JRST CD ALTM1: TXNE FF,TRACEF ;TRACING? PUSHJ P,CRR ;YES, TYPE CR/LF BEFORE * JRST GO ALTM2: SKIPN EQM ;WITHIN 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. $FATAL (MEU,,) TRZ CH,140 ;CHANGE IT TO CONTROL CHARACTER JRST CD9 ;DISPATCH ;^O SETS FLAG FOR OCTAL RADIX INPUT OCTIN: TXO F2,OCTALF JRST CD5 ;RETURN WITHOUT MESSING UP ARGUMENTS ;IF A COMMAND TAKES TWO NUMERIC ARGUMENTS, COMMA IS USED TO SEPARATE THEM COMMA: MOVEM B,SARG ;SAVE CURRENT ARGUMENT IN SARG.