Trailing-Edge
-
PDP-10 Archives
-
BB-FP64A-SB_1986
-
10,7/dteco/dteco.mac
Click 10,7/dteco/dteco.mac to
see without markup as text/plain
There are 4 other files named dteco.mac in the archive. Click here to see a list.
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==:<BYTE (3)CSTVER(9)MAJVER(6)MINVER(18)EDTVER>
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<Y> 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 <FF>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, <LF> 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 <CR> 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 <TAB> 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<str>$" to find and delete matched string, "FK<str>$" to find
; string, then delete from previous "." inclusively through to new
; "."; "FR<str>$" to delete last string and replace with <str>;
; "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
; (<CR>'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 <FF> 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%<Q> add value "n" to q-register <Q>; 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==<<TTWMAX+2>/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 (<TAB> 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 <CR>, 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 <CR><LF> 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 <ADR>,<EXP .+1>
IFNB <ADR>,<EXP ADR>
]
>
; Macro to generate a warning message
;
DEFINE $WARN (PFX,ADR,TXT),<
MSG. 1,[''PFX'',,[ASCIZ |TXT|]
IFB <ADR>,<EXP .+1>
IFNB <ADR>,<EXP ADR>
]
>
; Macro to generate a fatal message
;
DEFINE $FATAL (PFX,ADR,TXT),<
MSG. 2,[''PFX'',,[ASCIZ |TXT|]
IFB <ADR>,<EXP GO>
IFNB <ADR>,<EXP ADR>
]
>
;MACRO TO DEFINE DATA LOCATIONS
DEFINE U(A,B)<
RELOC
A: BLOCK B
RELOC
>
SUBTTL Program entry and initialization
TWOSEG <HIORGP_PG2WRD>
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,<LSECTN-DSECTN+1> ;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,<TXO FF,PMATCH> ;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
; <ARG>
; <RTN>
; NON-SKIP RETURN
; SKIP RETURN
;
;WHERE <ARG> IS THE ARGUMENT TO BE PASSED IN SCAN'S T1; AND <RTN> 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., "<ESC>")
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,<NEVER,TEMPORARY,DELETE,PRESERVE>)
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,,<FUTURE>
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 ;<FUTURE>,,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 ;<FUTURE>,,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 ;<FUTURE>,,STORAGE POINTERS
SIXBIT /TECO/ ;HELP
SIXBIT /TECO/ ;OPTIONS NAME
OSLEN==.-OSBLK
;FOR WILD
;LKBLK: EXP FXVRSN ;SCAN/WILD PROTOCOL VERSION WORD
; WIFIR,,WILAS ;<FIRST,,LAST> SCAN BLOCK POINTER ADR
; INOPN,,INFIL ;<OPEN,,LOOKUP> 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] ;<CUR INPUT,,OUTPUT> SCNBLK PTR ADR
; INOPN,,OUOPN ;<INPUT,,OUTPUT> OPEN BLK ADR
; INFIL,,OUFIL ;<INPUT,,OUTPUT> FILE BLK ADR
; [0,,-1],,FILLEN ;DEFAULT EXT ADR,,FILE BLK LEN
; 0,,SCFLG ;<FUTURE>,,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 <ALT>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<CRLF>
; SINCE TYI USES SOSG, THE COUNT MUST BE
; ONE TOO LARGE (YECH).
CCLDUN: MOVEI B,.CHESC ;AN <ESC> 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 <ESC> 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,<MOVE B,[TTY603]>;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),<SIXBIT\NAM\>
TYPTBL: TRMTYP ;DEFINE TERMINAL NAMES TABLE
TYPTLN==.-TYPTBL ;LENGTH OF TYPE TABLE
;THE TTY TYPE DISPATCH TABLE
DEFINE X(NAM,DSP),<EXP 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 <BEL> AS ^G
; 2) COUNT SCREEN SCROLLING
CAIE CH,.CHBEL ;NO, USER TYPE A <BEL>?
JRST TYI4NG ;NO, NO ECHO WORRIES THEN
MOVE CH,CHTBL(CH) ;YES, GET <BEL> 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 <CR><LF>?
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,,<End of command file with unterminated commands pending>)
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 <LF>???
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,<BLKSIZ*5> ;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,,<Input error 11 on file 09>)
;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,<CHAR>
; PUSHJ P,TYIEC
; RETURN
;
;WHERE <CHAR> IS THE 7-BIT ASCII COMMAND CHARACTER TO BE ECHOED JUST AS
;WOULD THE MONITOR.
;
;PRESERVES ALL ACS.
TYIEC: CAIN CH,.CHDEL ;A <DEL>
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 <DEL>?
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 <CR><LF> APPENDED?
JRST TYIEC5 ;NO
MOVEI CH,.CHCRT ;YES, FIRST THE <CR>
PUSHJ P,TYOM ;OUTPUT IT
MOVEI CH,.CHLFD ;THEN THE <LF>
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 ;<LF>?
MOVEI CH,1 ;YES
CAIN CH,.CHVTB ;<VT>?
MOVEI CH,4 ;YES
CAIN CH,.CHFFD ;<FF>?
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 <CR>, 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 <ALT>, <CR> 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 ;<FF>?
CAIN CH,.CHBEL ;A <BEL>?
JRST TYOBEL ;YES, JUST OUTPUT IT
CAIN CH,.CHCNH ;<BS>?
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 <ESC>, 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: <ASCII "BEL"> + .CHBEL ;^G = <BEL>
<ASCII "TAB"> + .CHTAB ;^I = <TAB>
<ASCII "LF"> + .CHLFD ;^J = <LF>
<ASCII "VT"> + .CHVTB ;^K = <VT>
<ASCII "FF"> + .CHFFD ;^L = <FF>
<ASCII "CR"> + .CHCRT ;^M = <CR>
<ASCII "ESC"> + .CHESC ;^[ = <ESC>
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,<TTIBFN*<TTIBSZ+3>> ;TERMINAL INPUT BUFFER RING
U TOB,3 ;DITTO
U TTOBF1,<TTOBFN*<TTOBSZ+3>> ;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 <CR><LF>
;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 <CR>
PUSHJ P,TYOM ;OUTPUT IT
MOVEI CH,.CHLFD ;AND A <LF>
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,<SETZ A,> ;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,<Cannot OPEN crash recovery file>)
TEBIF3: $WARN (CRB,TEBIFX,<Crash recovery file blocksize not 200>)
TEBIF4: $WARN (CEC,TEBIFX,<Cannot ENTER crash recovery file>)
TEBIF5: $WARN (WIC,TEBIFX,<Wildcards illegal in /CRFILE switch>)
TEBIFX: $WARN (RWC,,<Running without crash recovery>)
SETZM TEBING ;MAKE PREDICTION COME TRUE
SETOM WINFLG ;DON'T MUNGE ON THE SCREEN
PJRST CRR ;ISSUE <CR><LF>
;TEBCHR -- ADD COMMAND CHARACTER TO CRASH RECOVERY FILE.
;CALL IS:
;
; MOVX CH,<CHAR>
; PUSHJ P,TEBCHR
; RETURN
;
;WHERE <CHAR> 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 <LF>, <VT>, OR <FF>)
CAIN CH,.CHESC ;OR AN <ESC>?
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 <NNN>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 <ESC>
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,,<Incomplete <...> 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 <ESC>
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 <ESC> 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; <TAB> - EAT STRING UP TO NORMAL <ESC> 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 <ESC> 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,,<Screen "frozen" due to program typeout, ^L to refresh>)
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 <DEL>
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 ;<CR>?
JRST LIS4V ;YES, PUT CURSOR ON SCREEN
CAIN CH,.CHLFD ;<LF>?
JRST LIS4L ;YES, 1L$$
CAIN CH,.CHFFD ;<FF>?
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 <LF>. 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 <LF>
CAIE CH,.CHLFD ;IT IS A <LF>, ISN'T IT?
HALT .+1 ;BLETCH
SKIPN SCTYPE ;OR NON-SCREEN-MODE TERMINAL?
JRST LIS1E ;YES, EAT THE <CR><LF>
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<STRING>$$ 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 ;<DEL>?
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 ;<ESC>?
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 <CR><LF>
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 "<SBLAH$;0TT>" DOES NICE THINGS)
JRST CD ;DECODE COMMAND
;HERE ON <DEL>
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 <CR>
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 <LF>
;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 ;<CR>
PUSHJ P,TYOM ;BACK TO START OF LINE
MOVEI CH,.CHLFD ;<LF>
SKIPN SCTYPE ;ON VIDEO TERMINAL?
PUSHJ P,TYOM ;NO, THEN NEED NEW LINE AS WELL
CAILE E,0 ;NICE NORMAL <CR><LF> 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 <CR><LF> = SPACE)
RUBWR1: LDB CH,COMPTR ;FETCH CURRENT LAST COMMAND CHARACTER
CAIE CH,.CHVTB ;IF A <VT>
CAIN CH,.CHFFD ;OR A <FF>
JRST RUBWR4 ;EAT IT, AND PRECEDING <CR>, IF PRESENT
RUBWR2: CAIE CH,.CHTAB ;IF A <TAB>
CAIN CH," " ;OR A SPACE
JRST RUBWR3 ;JUST ABSORB IT
CAIE CH,.CHLFD ;A <LF>?
JRST RUBWR7 ;RANDOM CHARACTER, EAT IT
PUSHJ P,RUBOUT ;RUBOUT THE <LF>
POPJ P, ;ALL USED UP, WATCH FIRST CHAR SPECIAL
CAIE CH,.CHCRT ;PRECEDED BY A <CR>?
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 <VT> OR <FF>
POPJ P, ;ALL USED UP, WATCH FIRST CHAR SPECIAL
CAIN CH,.CHCRT ;PRECEDED BY A <CR>?
JRST RUBWR7 ;YES, EAT THE <CR> 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 ;<LF>?
JRST RUBWR6 ;NO, END OF "SENTENCE"
PUSHJ P,BACKUP ;PEEK AT CHARACTER PRECEDING <LF>
AOS COMCNT ;RESTORE COMMAND CHARACTER COUNT
IBP COMPTR ;AND COMMAND CHARACTER POINTER
CAIN CH,.CHCRT ;<CR><LF> 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 <CR><EOL>) 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 <CR>
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 <CR>?
CAIN CH,.CHTAB ;A <TAB>?
JRST RUBTAB ;YES, HAIRY CASE
CAIN CH,.CHLFD ;<LF>?
JRST RUBLF ;YES
CAIN CH,.CHVTB ;<VT>?
JRST RUBVT ;YES
CAIN CH,.CHFFD ;<FF>?
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 <CR><LF>?
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] ;<VT> IS 4 <LF>S
RUBFF: MOVEI E,^D8 ;<FF> IS 8 <LF>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 <LF>
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
;<LF>'S, <VT>'S, OR <FF>'S NOT IMMEDIATELY PRECEDED BY A <CR>. NOTE THAT
;A <VT> IS 4 <LF>S, AND A <FF> IS 8 <LF>S.
;
;BACKLU IS LIKE BACKLN ONLY IT WILL GO BACK A LINE EVEN IF POINTER
;IS ONLY JUST PAST A <CR><LF>. 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 ;<LF>
MOVEI E,1 ;YES, ONE LINE
CAIN CH,.CHVTB ;<VT>?
MOVEI E,4 ;YES, FOUR LINES
CAIN CH,.CHFFD ;<FF>?
MOVEI E,^D8 ;YES, EIGHT LINES
JRST BACKL0 ;NOW SEARCH FOR THE PRECEDING LINE
BACKLN: SETZ E, ;COUNT OF LINES PASSED LOOKING FOR <CR>
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 ;<LF>?
HRLI E,1 ;YES
CAIN CH,.CHVTB ;<VT>?
HRLI E,4 ;YES, = 4 <LF>S
CAIN CH,.CHFFD ;<FF>?
HRLI E,^D8 ;YES, = 8 <LF>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 <CR><EOL>?
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 <CR><LF>?
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,,<Colon-modified command didn't return a value>)
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 <HIORGP_PG2WRD>(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 <HIORGP_PG2WRD>(A)
PUSHJ P,<HIORGP_PG2WRD>(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,<Wrong PC section, returning to proper PC section>)
PCSEC3: MOVE TT,SECTN ;THE CORRECT PC SECTION
HLLM TT,