mirror of
https://github.com/PDP-10/stacken.git
synced 2026-03-01 01:19:17 +00:00
5499 lines
170 KiB
Plaintext
5499 lines
170 KiB
Plaintext
TITLE TECO VERSION 24A(235)
|
||
SUBTTL TEXT EDITOR AND CORRECTOR RC CLEMENTS/PMH/CAM/EAR/DML/JNG/BGS/DCE/MHK/CGN
|
||
|
||
EDIT==235
|
||
VERSION==XWD 2401,EDIT
|
||
|
||
|
||
|
||
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1970,1971,1972,1975,1976,1977,1984,1985,1986. ALL RIGHTS RESERVED.
|
||
;
|
||
;
|
||
;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.
|
||
|
||
|
||
|
||
SEARCH UUOSYM,MACTEN ;[175]
|
||
|
||
|
||
|
||
; . . . EDIT 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 COLLCETION ROUTINE TO CHECK FOR
|
||
; ANYTHING TO SAVE PRIOR TO ATTEMPTING A BLT.
|
||
; AREAS AFFEDTED: GCS2
|
||
|
||
|
||
; 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, CMDBFR
|
||
|
||
; 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 .>2**18 WE WONT 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
|
||
;
|
||
;233 If TECO is editing a file in a non-default path with
|
||
; a prot. of <257>, it can't rename the source
|
||
; file to it's backup. The RENAME UUO to drop
|
||
; protection of the file causes loss of path info.
|
||
;
|
||
;234 None. BAH 2-Oct-84.
|
||
; Update copyrights.
|
||
;
|
||
;235 None. LEO 22-Aug-85
|
||
; Do copyrights.
|
||
;
|
||
;[END OF REVISION HISTORY]
|
||
|
||
;DEFAULT DEFINITIONS FOR ASSEMBLY SWITCHES & PARAMETERS:
|
||
|
||
IFNDEF CCL, <CCL== 1> ;CCL CAPABILITY
|
||
IFNDEF TEMP, <TEMP== 1> ;TMPCOR UUO CAPABILITY
|
||
IFNDEF PDP6, <PDP6== 0> ;PDP-10 VERSION
|
||
IFNDEF ERRMSG, <ERRMSG==2> ;MEDIUM LENGTH ERROR MESSAGES
|
||
IFNDEF NORUNS, <NORUNS==0> ;RUN UUO CAPABILITY
|
||
IFNDEF AUTOFS, <AUTOFS==0> ;DEFAULT IS NON-AUTOTYPE AFTER SEARCHES
|
||
IFNDEF TYCASW, <TYCASW==0> ;DEFAULT TYPE-OUT MODE CAUSES FLAGGING OF
|
||
;CHARACTERS IN THE LOWER CASE RANGE WITH '
|
||
IFNDEF SRCHSW, <SRCHSW==0> ;DEFAULT PREVAILING SEARCH MODE IS ACCEPT
|
||
;EITHER LC OR UC ALPHABETICS AS A MATCH
|
||
IFNDEF BUFSIZ, <BUFSIZ==^D128> ;128 WORD I/O BUFFERS
|
||
IFNDEF LPDL, <LPDL== 120> ;80 WORD PDL
|
||
IFNDEF LPF, <LPF== 40> ;32 WORD Q-REGISTER PDL
|
||
IFNDEF VC, <VC== 0> ;V COMMAND NOT IMPLEMENTED
|
||
IFNDEF EOVAL, <EOVAL== 2> ;THE STANDARD SETTING OF THE EO FLAG FOR
|
||
;THIS VERSION IS 2
|
||
IFNDEF BUGSW, <BUGSW==0> ;[140] STANDARD IS DON'T SAVE SYMBOLS
|
||
IFN BUGSW,<.TEXT "/SYMSEG:HIGH"> ;[226] LOAD SYMBOLS INTO
|
||
;[226] HI SEG IF DEBUGGING.
|
||
|
||
;FOR ANY OTHER VERSION ASSEMBLE AS FOLLOWS:
|
||
;.R MACRO
|
||
;*TECO_TTY:,DSK:TECO.MAC
|
||
;CCL=0 (IF CCL NOT WANTED)
|
||
;TEMP=0 (IF TMPCOR UUO NOT WANTED)
|
||
;PDP6=1 (IF PDP-6 VERSION WANTED)
|
||
;ERRMSG=1 (IF SHORT ERROR MESSAGES WANTED OR
|
||
; =3 IF EXTRA LONG ERROR MESSAGES WANTED)
|
||
;NORUNS=1 (IF RUN UUO SIMULATION WANTED)
|
||
;AUTOFS=-1 (IF DEFAULT = AUTOTYPE AFTER SEARCHES WANTED)
|
||
;TYCASW=1 (IF TYPE-OUT CASE FLAGGING DEFAULT VALUE
|
||
; TO FLAG UPPER CASE INSTEAD OF LOWER CASE
|
||
; CHARS. WANTED)
|
||
;TYCASW=-1 (IF TYPE-OUT CASE FLAGGING DEFAULT VALUE
|
||
; FOR NO FLAGGING WANTED)
|
||
;SRCHSW=1 (IF EXACT MODE WANTED AS THE DEFAULT VALUE
|
||
; OF THE PREVAILING SEARCH MODE)
|
||
;BUFSIZ=^D256 (IF 256-WORD I/O BUFFERS WANTED. ANY
|
||
; OTHER CONSTANT BESIDES 256 MAY BE USED.
|
||
; TECO USES STANDARD MONITOR BUFFERING,
|
||
; BUT IF THE MONITOR PROVIDES BUFFERS
|
||
; LARGER THAN 128 WORDS, BUFSIZ MUST BE
|
||
; CHANGED SO THAT SUFFICIENT SPACE IS
|
||
; RESERVED.
|
||
;LPDL=N (WHERE N>120, IF LARGER PDL WANTED)
|
||
;LPF=N (WHERE N>40, IF LARGER Q-REGISTER PDL WANTED)
|
||
;EOVAL=N (WHERE 0<N<2, IF EO-CONTROLLED FEATURES ADDED
|
||
; SINCE EO=N WAS STANDARD ARE NOT WANTED)
|
||
;BUGSW=1 (IF SAVE OF SYMBOL TABLE IS DESIRED)
|
||
;^Z
|
||
;^Z
|
||
;ACCUMULATOR ASSIGNMENTS
|
||
|
||
FF= 0 ;CONTROL FLAGS
|
||
P= 1 ;PUSH DOWN POINTER
|
||
;*** A, AA AND B MUST BE CONTIGUOUS AND IN THAT ORDER ***
|
||
A= 2
|
||
AA= 3 ;TYPE-IN POINTER TO COMMAND BUFFER & SEARCH TABLE INDEX
|
||
;*** B AND E MUST BE ADJACENT AND B<11 ***
|
||
B= 4 ;COMMAND BUFFER END ADDRESS
|
||
E= 5
|
||
C= 6
|
||
D= 7
|
||
F2= 10 ;MORE CONTROL FLAGS
|
||
T= 11
|
||
;*** TT AND TT1 MUST BE ADJACENT ***
|
||
TT= 12
|
||
TT1= 13
|
||
I= 14
|
||
OU= 15
|
||
CH= 16 ;CHARACTER AC
|
||
PF= 17 ;Q-REGISTER PDL PTR
|
||
;CONTROL FLAGS
|
||
;RIGHT HALF - AC FF
|
||
|
||
ALTF== 1 ;ALT-MODE SEEN
|
||
ARG2== 2 ;THERE IS A SECOND ARGUMENT
|
||
ARG== 4 ;THERE IS AN ARGUMENT
|
||
FSRCH== 10 ;REPLACEMENT SEARCH
|
||
SLSL== 20 ;@ SEEN
|
||
PCHFLG==40 ;N SEARCH
|
||
COLONF==100 ;COLON SEEN
|
||
SYLF== 200 ;SYLLABLE FLAG
|
||
XPLNFL==400 ;HAVE TYPED EXTENSION OF ERROR MESSAGE ALREADY
|
||
EMFLAG==1000 ;HAVE TYPED 1ST LINE OF ERROR MESSAGE
|
||
FINDR== 2000 ;LEFT ARROW SEARCH
|
||
QMFLG== 4000 ;PROSESSING ERROR MESSAGE
|
||
SEQUIN==10000 ;OUTPUT: AFTER EOL NEXT 5 CHARS ARE SEQ #
|
||
;INPUT: IGNORE CHAR AFTER SEQ# IF IT'S TAB
|
||
TRACEF==20000 ;? SEEN
|
||
SEQF== 40000 ;SEQUENCE NUMBER SEEN ON INPUT
|
||
BELLF== 100000 ;^G SEEN
|
||
DDTMF== 200000 ;NEED TO TYI IN DDT MODE
|
||
FORM== 400000 ;A FORM FEED TERMINATED THE LAST YANK OR APPEND COMMAND
|
||
|
||
;LEFT HALF - AC FF
|
||
|
||
PMATCH==2 ;PREVAILING MATCH MODE
|
||
IFN VC,<
|
||
TABSRT==4 ;TAB CORRECTION FOR VVAL
|
||
>
|
||
TMPFLG==40 ;TMPCOR UUO ALLOWED
|
||
FINF== 100 ;INPUT CLOSED BY EOF
|
||
UREAD== 200 ;INPUT FILE IS OPEN
|
||
UWRITE==400 ;OUTPUT FILE IS OPEN
|
||
;********* FREE BIT *********
|
||
EZTMP== 2000 ;[175] THIS COMMAND IS EZ, NOT EW
|
||
FEXTF== 4000 ;FILE EXT EXPECTED (.TYPED).
|
||
UBAK== 20000 ;EB IN EFFECT
|
||
GKTLKF==40000 ;MESSAGE TYPE OUT IN GRABAK?
|
||
TYOF== 100000 ;NEED TO OUTPUT A BUFFER
|
||
TYOCTF==200000 ;ALLOW CONTROL CHARS TYPED WITHOUT "^"
|
||
CCLFLG==400000 ;TECO COMMAND REQUESTS Y AFTER EB
|
||
;CONTROL FLAGS
|
||
;RIGHT HALF - AC F2
|
||
|
||
CTLV== 1 ;^V SEEN INSIDE TEXT
|
||
CTLVV== 2 ;DOUBLE ^V SEEN INSIDE TEXT
|
||
CTLW== 4 ;^W SEEN INSIDE TEXT
|
||
CTLWW== 10 ;DOUBLE ^W SEEN INSIDE TEXT
|
||
XMATCH==20 ;EXACT MATCH SEARCH MODE
|
||
EMATCH==40 ;TEMPORARILY ACCEPT EITHER UPPER OR LOWER CASE
|
||
LINCHR==100 ;TTY LINE HAS LC BIT ON
|
||
TYMSGF==200 ;TYPE MESSAGE WITH NO CASE FLAGGING
|
||
OCTALF==400 ;OCTAL RADIX
|
||
CTLR== 1000 ;^R SEEN AT INPUT TIME
|
||
SKIMRF==2000 ;WATCH FOR ^R WHEN SKIMMING
|
||
SKIMQF==4000 ;WATCH FOR ^Q WHEN SKIMMING
|
||
NOTRAC==10000 ;DISABLE TRACING
|
||
TYSPCL==20000 ;TYPE <CR>, ETC INSTEAD OF PRINTER CONTROLS
|
||
SKANFS==40000 ;SKANNING FS OR FN
|
||
TXTCTL==100000 ;NO CONTROL COMMANDS IN TEXT EXCEPT ^T, ^R
|
||
LCASE== 200000 ;CONVERT UPPER CASE TO LOWER CASE BY DEFAULT
|
||
UCASE== 400000 ;CONVERT LOWER CASE TO UPPER CASE BY DEFAULT
|
||
|
||
;LEFT HALF - AC F2
|
||
|
||
GOING== 1 ;A COMMAND STRING HAS BEEN SEEN
|
||
CTLN== 2 ;^N IN SEARCH ARGUMENT
|
||
NOALT== 4 ;[137] DON'T CONVERT OLD ALTMODES TO 033
|
||
NALTFS==10 ;[174] NULL REPLACEMENT ALTMODE DELIMITED
|
||
;[174] F SEARCH
|
||
SFDS== 20 ;[214] SUB FILE DIRECTORIES ARE IN EFFECT
|
||
LSNINF==40 ;[220] IGNORE CHAR AFTER SEQ# IF IT'S A TAB OR CR
|
||
;[220] REPLACES USE OF SEQUIN
|
||
;I-O CHANNELS
|
||
|
||
INCHN== 2
|
||
OUTCHN==3
|
||
TTY== 4 ;CHANNEL FOR TTY IO
|
||
CCLCHN==5 ;CHANNEL FOR THE CCL TMP FILE
|
||
ERRCHN==6 ;CHANNEL FOR ERROR MESSAGE FILE
|
||
;MISC PARAMETERS
|
||
|
||
ALT== 033 ;TECO'S ALTMODE
|
||
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
|
||
STABLN==^D131 ;LENGTH OF SEARCH TABLE
|
||
IOEOT== 2000
|
||
DVDIR==4 ;[136] DIRECTORY DEVICE CHAR. BIT
|
||
DVMTA== 20 ;MTA DEVICE CHARACTERISTIC BIT
|
||
DVDTA== 100 ;DTA DEVICE CHARACTERISTIC BIT
|
||
DVDSK==200000 ;[136] DSK DEVICE CHARACTERISTIC BIT
|
||
CNFTBL==11 ;FOR GETTAB UUO
|
||
STATES==17 ;DITTO
|
||
SERES5==3400 ;DITTO
|
||
JBTPRG==3 ;JOBNAME TABLE
|
||
LVDTBL==16 ;LEVEL D PARAMETERS TABLE
|
||
STNPRT==12 ;SYSTEM STANDARD PROTECTION WORD
|
||
GCTBL== 100
|
||
SAVEXT=='SAV' ;PDP-10 SAVE FILE EXTENSION
|
||
IFN PDP6,<SAVEXT=='DMP'> ;PDP-6 SAVE FILE EXTENSION
|
||
EE1==1B12 ;PRINT UUO ERROR CODE AFTER ?XXX
|
||
EE2==2B12 ;PRINT I/O ERROR CODE AFTER ?XXX
|
||
EE3==3B12 ;PRINT NOTHING AFTER ?XXX BECAUSE NO CORE FOR ERROR FILE
|
||
|
||
EO21== 1 ;TURN OFF SPECIAL VERSION 22+ FEATURES IF EO VALUE = 1
|
||
RUBSW==0 ;[206] MUST BE ZERO
|
||
;OPERATORS
|
||
|
||
;CHECK EO FLAG: CHKEO EO#,ADDR
|
||
;IF EOFLAG > EO#, RETURN AT CALL+1
|
||
;OTHERWISE GO TO ADDR
|
||
|
||
DEFINE CHKEO(E,A)
|
||
<1B22+<E>B30,,A>
|
||
|
||
;TYPE ERROR MSG: ERROR E.XXX
|
||
;TYPE MESSAGE CORRESPONDING TO 'XXX'
|
||
;THEN GO TO GO
|
||
|
||
DEFINE ERROR(X)
|
||
<1B8+'X'
|
||
'X'=<''X''>&777777>
|
||
|
||
OPDEF TYPR1 [2B8]
|
||
EXTERN .JBREL,.JBFF,.JB41,.JBSA,.JBUUO
|
||
|
||
JOBREN==124
|
||
JOBVER==137
|
||
|
||
LOC JOBVER
|
||
EXP VERSION ;VERSION #
|
||
|
||
LOC JOBREN
|
||
EXP REE ;REENTRY ADDRESS
|
||
|
||
|
||
;MACRO TO DEFINE DATA LOCATIONS
|
||
|
||
DEFINE U(A,B)<
|
||
RELOC
|
||
A: BLOCK B
|
||
RELOC
|
||
>
|
||
|
||
|
||
TWOSEG
|
||
|
||
RELOC 0
|
||
RELOC 400000
|
||
|
||
|
||
|
||
COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1970,1986. ALL RIGHTS RESERVED.
|
||
\;END COPYRIGHT MACRO
|
||
|
||
|
||
|
||
U LOCORE,0 ;START OF DATA AREA
|
||
|
||
SALL
|
||
;PSEUDO RUN UUO IF NEEDED
|
||
|
||
IFN NORUNS,<
|
||
IFN CCL,<
|
||
NORUN1: IOWD .-.,INHERE ;MODIFIED FOR LENGTH
|
||
0
|
||
NORUN2: CALLI 15,11
|
||
CALLI 12 ;NOT ENOUGH CORE TO GET COMPIL
|
||
IN CCLCHN,NORUN1 ;READ THE FILE
|
||
JRST NORBLT ;TO THE ACS
|
||
CALLI 12 ;NO GOOD.
|
||
|
||
INHERE: ;WHERE CODE APPEARS
|
||
NORAC: ;WHERE TO READ AC DATA FROM
|
||
PHASE 0
|
||
NORBLT: BLT NORTOP,.-. ;ADR MODIFIED
|
||
CALLI 0
|
||
AOS 1,.JBSA ;ADR + 1
|
||
JRST (1) ;START COMPIL
|
||
NORTOP: XWD INHERE+1,75 ;MOVE COMPIL DOWN
|
||
DEPHASE
|
||
>>
|
||
;STARTUP TIME INITIALIZATION
|
||
|
||
TECO:
|
||
IFN CCL,<
|
||
TDZA B,B
|
||
MOVNI B,1 ;THE CCL ENTRY
|
||
>
|
||
RESET ;INITIALIZE ALL IO
|
||
SETZM LOCORE ;CLR DATA IN CASE OF ^C,ST
|
||
MOVE A,[XWD LOCORE,LOCORE+1]
|
||
IFE BUGSW,<BLT A,@.JBREL>
|
||
IFN BUGSW,<BLT A,LOWEND-1>
|
||
IFN CCL,<MOVEM B,CCLSW>
|
||
IFE PDP6,<MOVE A,[PUSHJ P,UUOH]> ;SET UUO TRAP
|
||
IFN PDP6,<MOVE A,[JSR UUOH]> ;PDP-6 ASSUMES TRAP SET WITH JSR
|
||
MOVEM A,.JB41
|
||
MOVE P,[XWD -LPDL,PDL] ;START ONE WORD DOWN
|
||
HRRZ A,.JBREL ;.JBFF=.JBREL-202
|
||
IFN TEMP,<SUBI A,10> ;SUBTRACT ENOUGH FOR A TMPCOR READ
|
||
EXCH A,.JBFF
|
||
IFN BUGSW,<MOVEM A,CMDBFR>
|
||
ADD A,[677,,-1] ;CBUF=[000700,,FF-1]
|
||
MOVEM A,CBUF
|
||
MOVEI A,201(A)
|
||
IMULI A,5
|
||
MOVEM A,BEG ;BEG:=(CBUF+200)*5
|
||
MOVEM A,PT ;PT:=(CBUF+200)*5
|
||
MOVEM A,Z ;Z:=(CBUF+200)*5
|
||
MOVEM A,QRBUF ;QRBUF:=(CBUF+200)*5
|
||
GETPPN A, ;GET USER'S PROJ-PROG #
|
||
JFCL ;[175] SOMETIMES SKIPS
|
||
MOVEM A,USRPPN
|
||
SETOM MONITR ;GET MONITOR SERIES NUMBER
|
||
MOVE A,[XWD STATES,CNFTBL]
|
||
GETTAB A, ;WHICH MONITOR?
|
||
JRST TECO2 ;3 SERIES (MONITR=-1)
|
||
TLNE A,SERES5
|
||
AOS MONITR ;5 SERIES (MONITR=+1)
|
||
AOS MONITR ;4 SERIES (MONITR=0)
|
||
|
||
|
||
;FALL THROUGH TO NEXT PAGE
|
||
TECO2: MOVE A,[F%FDAE&<-1,,0>!.GTFET] ;[175] GETTAB FTFDAE
|
||
GETTAB A, ;[175] NEED TO KNOW IF FILE DAEMON
|
||
SETZ A, ;[175] MONITOR FOR EB STUFF
|
||
SETZM FDAEM ;[175] ASSUME NOT
|
||
TRNE A,F%FDAE&<0,,-1> ;[175] FILE DAEMON MONITOR?
|
||
SETOM FDAEM ;[175] YES, SIGN BIT OF .RBPRV CHANGED
|
||
SETZM DEFPTH ;[175] NOW DETERMINE JOB'S DEFAULT
|
||
MOVE A,[DEFPTH,,DEFPTH+1] ;[175] PATH
|
||
BLT A,DEFPTH+10 ;[175] FIRST, ZERO PATH BLOCK
|
||
SETOM DEFPTH ;[175] FUNCTION -1 IS READ PATH
|
||
MOVE C,USRPPN ;[175] DEFAULT PATH IF NO PATH UUO
|
||
MOVE A,[10,,DEFPTH] ;[175] POINT TO ARG BLOCK
|
||
PATH. A, ;[175] READ JOB'S DEFAULT PATH
|
||
MOVEM C,DEFPPN ;[175] POOR SUBSTITUTE
|
||
PJOB A, ;GET JOB #
|
||
MOVEM A,JOBN
|
||
MOVE C,[%FTSTR] ;[214] FIND OUT IF SFDS ARE USED
|
||
GETTAB C, ;[214] ...
|
||
JRST .+2 ;[214] ASSUME SO
|
||
TRNE C,F%SFD &<0,,-1> ;[214] SFDS HERE?
|
||
TLO F2,SFDS ;[214] YES, SET THE FLAG
|
||
MOVEI C,3 ;SET CTR
|
||
JOBLUP: IDIVI A,12 ;CONVERT JOB# TO DECIMAL ASCII IN LEFT HALF
|
||
ADDI AA,20
|
||
LSHC AA,-6
|
||
SOJG C,JOBLUP
|
||
HRRI B,(SIXBIT /TEC/) ;FORM NAME ###TEC
|
||
MOVEM B,TMPTEC ;SAVE
|
||
HRREI A,TYCASW ;GET WHATEVER IS DEFAULT TYPE-OUT CASE FLAGGING MODE
|
||
MOVEM A,TYCASF ;AND MAKE IT CURRENT
|
||
HRRZI A,EOVAL ;INITIALIZE EO FLAG
|
||
MOVEM A,EOFLAG
|
||
HRREI A,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
|
||
|
||
|
||
|
||
U DEFPTH,1
|
||
U DEFFLG,1
|
||
U DEFPPN,1
|
||
U DEFSFD,6
|
||
|
||
|
||
;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.
|
||
|
||
PUSH P,INITG ;FOR IN LINE CODING POPJ
|
||
CRE23: MOVE A,.JBFF ;LATEST VALUE OF FF
|
||
IMULI A,5 ;5 CHARACTERS PER MEM WORD
|
||
MOVEM A,MEMSIZ ;MEMSIZ:=C(.JBFF)*5
|
||
INITG: POPJ P,.+1 ;EXIT OR CONTINUE
|
||
|
||
MOVE A,CBUF
|
||
MOVEI A,100(A)
|
||
CAMG A,.JBREL ;[207] IS THE MEMORY REALLY THERE ?
|
||
JRST .+6 ;[207] YES; GO BACK TO WORK
|
||
PUSH P,17 ;[207] IT IS NOT THERE! GO SNARF A K.
|
||
MOVE 17,.JBREL ;[207] FIND OUT HOW MUCH WE NEED .
|
||
SUB 17,A ;[207] LEAVE IT IN 17 FOR GRABKQ TO LOOK AT .
|
||
PUSHJ P,GRABKQ ;[207] GRAB THE K...QUIETLY.
|
||
POP P,17 ;[207] RESTORE AC 17.
|
||
MOVEM A,CBUFH ;CBUFH:=CBUF+77
|
||
MOVEI A,SYL
|
||
MOVEM A,DLIM ;DLIM:=SYL
|
||
MOVE A,[XWD 10014,-1]
|
||
MOVEM A,NROOM2 ;NROOM2:=XWD 10014,-1
|
||
MOVEI FF,0 ;CLEAR FLAG REGISTER
|
||
SKIPE SRHMOD ;IF DEFAULT SEARCH MODE IS NOT 0,
|
||
TLOA FF,PMATCH ;MAKE EXACT MODE CURRENT
|
||
GOE: TRZA FF,777777-TRACEF-QMFLG-FORM-SEQF
|
||
GO: TRZ FF,777777-TRACEF-FORM-SEQF
|
||
TLZ FF,CCLFLG ;[175] CLEAR "Y" REQUESTED FLAG
|
||
TRZ F2,NOTRAC
|
||
MOVE P,[XWD -LPDL,PDL] ;INITIALIZE PUSHDOWN LIST
|
||
SETZM PDL ;FLAG PDL TOP - NOTE: PDL FLAGS ARE
|
||
;0 = TOP OF PDL
|
||
;-1= LAST ITEM IS AN ITERATION
|
||
;+1= LAST ITEM IS A PARENTHESIS
|
||
;>1= LAST ITEM IS A MACRO
|
||
SETZM EQM ;[114] CLEAR MACRO LEVEL COUNT
|
||
MOVE PF,[XWD -LPF-1,PFL-1]
|
||
JRST CLIS
|
||
|
||
;FROM REE COMMAND DISTRIBUTION IN THE MONITOR
|
||
|
||
REE: CLRBFO ;STOP TYPEOUT
|
||
JRST GO ;GO AND LISTEN FOR INPUT
|
||
;THIS PAGE CONTAINS THE COMMAND READER FOR THE CCL SYSTEM
|
||
|
||
IFN CCL,<
|
||
TTYPT: XWD 440700,TTYBFS ;CCL COMMAND BUFFER PTR
|
||
TTYPT2: XWD 260700,TTYBFS ;TO INSERT FILE NAME AFTER EW OR EB
|
||
|
||
U CCLB,3 ;THE HEADER FOR CCL FILE IO
|
||
|
||
CCLIN:
|
||
IFN TEMP,<
|
||
MOVE A,[XWD 2,TT] ;SET UP FOR TMPCOR READ & DELETE
|
||
HRLI TT,'EDT' ;SET UP READ BLOCK FOR TMPCOR UUO
|
||
HRRZ TT1,.JBFF ;[175] GET FIRST FREE
|
||
ADDI TT1,46 ;[175] LAST LOC USED IN TMPCOR
|
||
CAML TT1,.JBREL ;[175] ENOUGH ROOM?
|
||
CORE TT1, ;[175] NO, EXPAND
|
||
JFCL ;[175] DOESN'T MATER
|
||
HRLZI TT1,-46 ;[175] GET IT ALL
|
||
HRR TT1,.JBFF
|
||
SOJ TT1, ;MAKE IT AN IOWD
|
||
TMPCOR A, ;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"
|
||
TLO FF,TMPFLG ;[175] SET TMPCOR FLAG
|
||
JRST CCLTM1 ;[175] FINISH PROCESSING COMMAND
|
||
CCLTMP: >
|
||
;HERE IF TMPCOR FAILED OR FEATURE TEST OFF. READ NNNEDT.TMP FROM DSK:
|
||
|
||
HLLZ B,TMPTEC ;GET SIXBIT JOB #
|
||
HRRI B,(SIXBIT /EDT/) ;REST OF NAME
|
||
MOVE T,[-XFILEN,,XFILNM-1] ;[175] PDL INTO LOOKUP BLOCK
|
||
PUSH T,[XFILEN] ;[175] FIRST WORD IS CNT OF ARGS
|
||
PUSH T,[0] ;[175] LOOK ON DEFAULT PATH
|
||
PUSH T,B ;[175] STORE FILENAME
|
||
PUSH T,['TMP '] ;[175] EXTENSION
|
||
MOVE T,.JBFF ;USE BUFFER SPACE BRIEFLY
|
||
INIT CCLCHN,0
|
||
SIXBIT /DSK/ ;TO READ THE FILE
|
||
EXP CCLB ;INPUT BUFFER
|
||
JRST TECO ;IF NO DSK, SAY "*"
|
||
INBUF CCLCHN,1 ;DONT ADR CHECK
|
||
LOOKUP CCLCHN,XFILNM ;[175] OPEN THE FILE
|
||
JRST TECO ;IT WASNT THERE?
|
||
INPUT CCLCHN,0
|
||
MOVEM T,.JBFF ;GIVE BACK SPACE
|
||
IBP CCLB+1 ;SKIP THE LINED S
|
||
MOVE AA,CCLB+1 ;[175] SETUP BYTE POINTER TO INPUT
|
||
CCLTM1: MOVE T,TTYPT2 ;[175] OUTPUT CHARS
|
||
MOVEI C,2 ;INIT CHAR CTR
|
||
MOVEI A,"=" ;[175] 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 ;[175] INPUT THE FILE NAME & EXT
|
||
CAMN B,A ;[175] FIRST EQUALS SIGN SEEN?
|
||
JRST CCLEQL ;[175] YES
|
||
CAIE B,15 ;[221] CR?
|
||
CAIN B,175 ;[221] OLD ALT?
|
||
AOJA C,CCLNUL ;[221] THEN PROCESS
|
||
JUMPE B,CCLIL ;[221] THROW AWAY NULLS
|
||
IDPB B,T ;[175] ELSE STORE CHAR
|
||
AOJA C,CCLIL ;[175] AND LOOP FOR ALL CHARS
|
||
|
||
;HERE ON THE FIRST "=" IN THE COMMAND STRING
|
||
CCLEQL: MOVEI B,ALT ;[175] REPLACE FIRST EQUALS SIGN
|
||
IDPB B,T ;[175] WITH <ALT>ER
|
||
ADDI C,1 ;[200] COUNT THE ALT
|
||
MOVE D,T ;[200] SAVE C & T
|
||
MOVE E,C ;[200] INCASE .TE A=B
|
||
MOVEI B,"E" ;[175] SINCE WE EXPECT
|
||
IDPB B,T ;[175] AN INPUT FILE
|
||
MOVEI B,"R" ;[175] SPEC TO FOLLOW
|
||
IDPB B,T ;[175] THE FIRST ONE
|
||
ADDI C,2 ;[175] COUNT THE CHARS STORED
|
||
SETO A, ;[175] PREVENT FINDING LATER EQUALS
|
||
TLO FF,CCLFLG ;[175] DO A Y IN ANY CASE
|
||
JRST CCLIL ;[175] AND LOOP BACK FOR NEXT CHAR
|
||
|
||
;HERE ON A NUL (END OF COMMAND). SEE IF IT WAS MAKE OR TECO
|
||
|
||
CCLNUL: MOVEI TT,"W" ;[200] PREPARE FOR EW COMMAND
|
||
CAILE B,15 ;WAS BREAK A CRLF?
|
||
JRST CCLDUN ;NO. ALTMODE ASSUMED
|
||
TLO FF,CCLFLG ;REQUEST Y AFTER EB
|
||
MOVEI TT,"B" ;[200] NOW PREPARE FOR EB
|
||
AOJN A,CCLDUN ;[200] CONTINUE UNLESS EB & "=" WAS SEEN
|
||
MOVE T,D ;[200] IF .TE A=B, WE NEVER SAW THE "="
|
||
MOVE C,E ;[200] IN CASE .MA A=B, THEN .TE<CRLF>
|
||
CCLDUN: MOVEI B,ALT
|
||
IDPB B,T ;[225] TERMINATING TWO ALT'S
|
||
IDPB B,T ;LAST ALT
|
||
ADDI C,3 ;[225] COUNT 2ND ALT & ADD 1 TO FOOL TYI0
|
||
MOVEI B,"E" ;NOW FILL IN THE EB OR EW
|
||
MOVE T,TTYPT ;AT THE BEGINNING OF STRING
|
||
MOVEM T,TIB+1 ;ALSO INITIALIZE TO READ THIS
|
||
IDPB B,T ;STORE "E"
|
||
IDPB TT,T ;[200] AND EITHER W OR B
|
||
MOVEM C,TIB+2 ;SET BUFR CTR
|
||
IFN TEMP,<TLZE FF,TMPFLG ;TMPCOR UUO IN PROGRESS?
|
||
JRST CCLDU2> ;YES, DONT CLOSE DSK
|
||
SETZM XNAM ;[175] NOW FLUSH FILE
|
||
RENAME CCLCHN,XFILNM ;[175] BY RENAME TO ZERO
|
||
JFCL ;[175] PROTECTED?
|
||
CCLDU2: RELEAS CCLCHN,
|
||
POPJ P,
|
||
>
|
||
;ROUTINE TO RETURN NON-NULL TTY CHARACTER IN CH.
|
||
;CALL PUSHJ PDP,TYI
|
||
; RETURN
|
||
|
||
TYI: TLZE FF,TYOF ;NEED A TYO?
|
||
OUTPUT TTY,0 ;YES. DO SO.
|
||
TYI0: SOSG TIB+2 ;CHARS IN NORMAL MODE?
|
||
JRST TYI1 ;NONE LEFT
|
||
TYI2: ILDB CH,TIB+1 ;YES. GET ONE
|
||
JUMPE CH,TYI0 ;FLUSH NULLS
|
||
TYI3: TRZ FF,DDTMF ;CLR TTCALL REQUEST FLAG
|
||
IFN RUBSW,<
|
||
SETO A, ;AIM AT THIS TTY
|
||
TTCALL 6,A ;GETSTS
|
||
TLNN A,4 ;SUPPRESS ECHO?
|
||
>
|
||
CAIE CH,7 ;BELL?
|
||
JRST ALTLIN ;CHECK FOR ALTMODE
|
||
JSP A,CONMES ;ECHO AN "^G" TOO
|
||
ASCIZ /^G/
|
||
MOVEI CH,7 ;GET BACK BELL
|
||
POPJ P,
|
||
|
||
TYI1: TRNE FF,DDTMF ;SHOULD TYI BE TTCALL?
|
||
JRST TYIDDT ;YES
|
||
INPUT TTY,0 ;NO. ORDINARY.
|
||
STATO TTY,20000 ;END OF FILE?
|
||
JRST TYI2
|
||
PUSHJ P,TTOPEN ;CLEAR EOF THE HARD WAY
|
||
JRST TYI0 ;^Z WAS SEEN ALREADY. GET ANOTHER CH
|
||
|
||
;CONVERT 175 & 176 TO ALTMODE (033) UNLESS TTY NOALT IS ON
|
||
|
||
ALTLIN: CAIL CH,175 ;OLD ALTMODE?
|
||
CAILE CH,176
|
||
POPJ P, ;NO
|
||
TLNN F2,NOALT ;[137] TEST TTY NOALT BIT
|
||
ALTX: MOVEI CH,ALT ; 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
|
||
TYIDDT: TLZE FF,TYOF ;CHARACTERS WAITING FOR OUTPUT?
|
||
OUTPUT TTY,0 ;YES, FORCE THEM OUT
|
||
TTCALL 0,CH ;WAIT FOR A SINGLE CHARACTER
|
||
JRST TYI3
|
||
|
||
TTOPEN: MOVEI T,TTYBFS
|
||
EXCH T,.JBFF ;SET .JBFF AND SAVE IT
|
||
INIT TTY,100 ;INIT THE CONSOLE
|
||
SIXBIT /TTY/
|
||
XWD TOB,TIB ;SHOULD BE
|
||
JRST .-3 ;I REALLY WANT TTY
|
||
INBUF TTY,1
|
||
OUTBUF TTY,1 ;KEEP IT SMALL
|
||
MOVEM T,.JBFF ;RESTORE .JBFF
|
||
IFN CCL,<
|
||
SETZM TYIPT ;SIGNAL CCL BUFFER EMPTY
|
||
>
|
||
POPJ P,
|
||
;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.
|
||
|
||
TYOS: TROA F2,TYSPCL ;TYPE <CR>, ETC INSTEAD OF PRINTER CONTROLS
|
||
TYOM: TRZ F2,TYSPCL ;CLR SPECIAL TYPEOUT FLAG
|
||
TROA F2,TYMSGF ;SET NO-CASE-FLAGGING FLAG
|
||
TYO: TRZ F2,TYMSGF+TYSPCL ;CLR NO-CASE-FLAGGING FLAG & SPECIAL FLAG
|
||
PUSH P,CH ;SAVE CHAR IN CASE ^ OR ' NEEDED
|
||
TLNE FF,TYOCTF ;ET IN EFFECT?
|
||
JRST TYOB ;[120] YES, TYPE ALL CHARACTERS AS IS
|
||
PUSHJ P,ALTEO ;CONVERT OLD ALTMODES IF EO=1
|
||
CAIGE CH,11
|
||
JRST TYO1 ;BELOW TAB
|
||
TRZN F2,TYSPCL ;WANT <CR>, ETC INSTEAD OF PRINTER CONTROLS?
|
||
JRST TYOJ ;NO
|
||
CAIG CH,15 ;IS IT A PRINTER CONTROL?
|
||
JRST TYOH ;YES
|
||
CAIE CH,ALT ;OR AN ALTMODE?
|
||
JRST TYOG ;NO, DO NORMAL THING
|
||
MOVEI CH,16 ;ADJUST INDEX FOR ALTMODE
|
||
TYOH: MOVEI A,5 ;5 CHAR. CTR
|
||
MOVE AA,[POINT 7,TSPTAB-11] ;& PTR TO RIGHT COMBINATION
|
||
ADDI AA,(CH)
|
||
TYOI: ILDB CH,AA ;TYPE <CR> OR WHATEVER
|
||
SOJLE A,TYOB ;LAST CHAR GOES OUT VIA TYOB (TO POP CH)
|
||
PUSHJ P,TYOA
|
||
JRST TYOI
|
||
TYOJ: CAIG CH,15 ;NO, TAB, LF, VT, FF, OR CR?
|
||
JRST TYOB ;YES. TYPE IT AND RETURN
|
||
CAIN CH,ALT
|
||
MOVEI CH,"$" ;YES TYPE DOLLAR SIGN
|
||
TYOG: CAIGE CH,40 ;NO. ANY OTHER CONTROL CHARACTER?
|
||
JRST TYO1 ;YES.
|
||
TYOC: TRNE F2,LINCHR+TYMSGF ;TTY LC ON? OR TYPING A MESSAGE?
|
||
JRST TYOB ;YES, NO CASE FLAGGING
|
||
MOVE A,TYCASF ;WHAT SHOULD BE FLAGGED?
|
||
JUMPL A,TYOB ;NOTHING
|
||
JUMPG A,TYOD ;UPPER CASE RANGE
|
||
CAIGE CH,140 ;LOWER CASE. IS THIS LC?
|
||
JRST TYOB ;NO, SO DON'T FLAG IT
|
||
TYOE: MOVEI CH,47 ;YES, FLAG IT WITH '
|
||
PUSHJ P,TYOA
|
||
MOVE CH,(P) ;GET BACK THE CHARACTER
|
||
TRZ CH,40 ;MAKE IT UPPER CASE
|
||
TYOB: PUSHJ P,TYOA ;TYPE CH.
|
||
POP P,CH ;RESTORE CH
|
||
CAIN CH,7 ;IF BELL AND ET IS OFF, WE MUST
|
||
TLNE FF,TYOCTF ;FALL INTO TYOA TO GET A DING
|
||
POPJ P, ;RETURN
|
||
TYOA: TLO FF,TYOF ;MARK WILL NEED TO OUTPUT
|
||
SOSG TOB+2 ;OUTPUT SPACE AVAIL?
|
||
OUTPUT TTY,0 ;NO. OUTPUT.
|
||
IDPB CH,TOB+1
|
||
CAILE CH,14 ;FORCE OUTPUT ON LF,FF ETC
|
||
POPJ P, ;NO
|
||
OUTPUT TTY,0
|
||
TLZ FF,TYOF ;NO LONGER NEED TO OUTPUT
|
||
POPJ P,
|
||
|
||
TYO1: PUSH P,CH ;TYPE CONTROL CHARACTER IN FORM "^CH"
|
||
MOVEI CH, "^"
|
||
PUSHJ P,TYOA ;TYPE ^
|
||
POP P,CH
|
||
ADDI CH,100 ;CONVERT TO PRINTING CHARACTER
|
||
JRST TYOB ;AND TYPE IT.
|
||
|
||
TYOD: CAIL CH,100 ;IS THIS UPPER CASE?
|
||
CAILE CH,137
|
||
JRST TYOB ;NO
|
||
JRST TYOE ;YES, FLAG IT WITH '
|
||
|
||
IFN CCL,<U TYIPT,1> ;
|
||
U TTYBFS,46 ;100 MODE TTY BFRS
|
||
U TIB,3 ;BUFFER HEADER
|
||
U TOB,3 ;DITTO
|
||
U JOBN,1 ;JOB #
|
||
U USRPPN,1 ;USER PROJ-PROG #
|
||
U MONITR,1 ;MONITOR LEVEL: 0=3,1=4,2=5
|
||
U IBUF,3 ;
|
||
U OBF,3 ;
|
||
U IBUF1,2*<BUFSIZ+3> ;
|
||
U OBUF1,2*<BUFSIZ+3> ;
|
||
|
||
;PRINT THESE INSTEAD OF PRINTER CONTROLS IF TYSPCL FLAG IS ON
|
||
|
||
TSPTAB: ASCII /<TAB>/
|
||
ASCII /<LF>/
|
||
ASCII /<VT>/
|
||
ASCII /<FF>/
|
||
ASCII /<CR>/
|
||
ASCII /<ALT>/
|
||
;MESSAGE TYPE-OUT
|
||
;CALL JSP A,CONMES
|
||
; ASCIZ /MESSAGE/
|
||
; RETURN
|
||
|
||
CONMES: HRLI A,440700 ;A=POINT 7,MESSAGE-ADDR
|
||
ILDB CH,A ;GET MSG CHAR
|
||
JUMPE CH,1(A) ;RETURN WHEN 0 FOUND
|
||
PUSHJ P,TYOM ;TYPE WITH NO CASE FLAGGING
|
||
JRST .-3
|
||
|
||
;ROUTINE TO OUTPUT DECIMAL (OCTAL IF 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 > 0?
|
||
MOVEI CH,"-" ;NO. OUTPUT -
|
||
PUSHJ P,@LISTF5
|
||
MOVMS B ;B:=ABSOLUTE VALUE OF B
|
||
DPT1: MOVEI A,12 ;RADIX 10
|
||
TRNE F2,OCTALF ;OCTAL RADIX?
|
||
MOVEI A,10 ;YES, CHANGE TO RADIX 8
|
||
IDIVI B,(A) ;E:=DIGIT
|
||
HRLM E,(P) ;PUT DIGIT ON LEFT HALF OF TOP OF PUSH DOWN LIST
|
||
JUMPE B,.+2 ;DONE?
|
||
PUSHJ P,.-3 ;NO. PUSH THIS DIGIT AND PRINT RETURN ADDRESS.
|
||
HLRZ CH,(P) ;YES. CH:=DIGIT
|
||
ADDI CH,60 ;CONVERT IT TO ASCII.
|
||
JRST @LISTF5 ;PRINT IT
|
||
|
||
;ROUTINE TO TYPE CARRIAGE RETURN LINE FEED
|
||
;CALL PUSHJ P,CRR
|
||
; RETURN
|
||
CRR: JSP A,CONMES ;OUTPUT CRLF
|
||
ASCIZ /
|
||
/
|
||
POPJ P,
|
||
;RETURN NEXT COMMAND CHAR AT CURRENT LEVEL
|
||
;CALL: PUSHJ P,SKRCH
|
||
; ERROR RETURN IF NO MORE CHARS AT THIS LEVEL
|
||
; NORMAL RETURN WITH CHAR IN CH
|
||
|
||
SKRCH: SKIPG COMCNT ;ANY CHARS LEFT?
|
||
POPJ P, ;NO, TAKE ERROR RETURN
|
||
PUSHJ P,RCH ;YES, GET NEXT
|
||
CPOPJ1: AOS (P) ;SKIP RETURN
|
||
POPJ P,
|
||
|
||
;ROUTINE TO RETURN NEXT CHARACTER FROM COMMAND BUFFER.
|
||
;CALL PUSHJ P,RCH
|
||
; RETURN ALWAYS WITH CHARACTER IN CH
|
||
|
||
RCH: SOSGE COMCNT ;DECREMENT COMMAND BUFFER CHARACTER COUNT
|
||
;IS COMMAND BUFFER EMPTY?
|
||
JRST RCH2 ;YES. POP UP TO HIGHER MACRO LEVEL.
|
||
ILDB CH,CPTR ;NO. GET COMMAND CHARACTER IN CH
|
||
PUSHJ P,ALTEO ;CONVERT OLD ALTMODES IF EO = 1
|
||
TRNE FF,TRACEF ;IN TRACE MODE?
|
||
TRNE F2,NOTRAC ;TRACE ENABLED?
|
||
POPJ P, ;NO, RETURN
|
||
JRST TYO ;YES, TYPE THE COMMAND
|
||
;RCH+7 [204]
|
||
PUSH P,A ;[204] YES, SAVE A FOR CALLING ROUTINE
|
||
|
||
POP P,A ;[204] RESTORE THE STATE
|
||
POPJ P, ;[204] AND RETURN
|
||
|
||
RCH2: POP P,CH ;SAVE RETURN FOR POPJ IN CH
|
||
POP P,COMCNT ;GET RID OF FLAG
|
||
SKIPE EQM ;[114] DON'T ALLOW NEG MACRO COUNT
|
||
SOS EQM ;[114] DECREMENT THE MACRO LEVEL
|
||
SOSG COMCNT ;IF ANG BRAK ON PDL, ITS A INCOMPLETE MACRO
|
||
ERROR E.IAB
|
||
POP P,COMCNT ;GET COUNT FROM NEXT MACRO LEVEL
|
||
POP P,CPTR ;CURRENT POINTER TOO
|
||
POP P,COMAX ;NUMBER OF COMMANDS
|
||
PUSH P,CH ;GET RETURN BACK ON PDL.
|
||
JRST RCH ;TRY AGAIN.
|
||
|
||
;GET NEXT CHAR FROM CURRENT COMMAND LEVEL WHERE A CHAR IS
|
||
;KNOWN TO BE THERE, AND NO TRACING IS WANTED
|
||
|
||
GCH: SOS COMCNT ;REDUCE CHAR COUNT
|
||
ILDB CH,CPTR ;GET CHAR.
|
||
JRST ALTEO ;CONVERT OLD ALTMODES AND RETURN
|
||
;SCAN COMMAND STRING FOR CHARACTER IN TT
|
||
;IGNORING PAIRS STARTING WITH CHAR. IN TT1 AND ENDING WITH (TT)
|
||
;ASSUMED THAT CPTR IS SET
|
||
;NON-SKIP RETURN IF (TT) CAN'T BE FOUND
|
||
;SKIP RETURN IF FOUND
|
||
;CPTR LEFT SET FOR NEXT CHAR. IN COMMAND STRING
|
||
|
||
SKAN: TRO F2,NOTRAC ;INHIBIT TRACE ACTION WHILE SKANNING
|
||
MOVEI C,0 ;CTR FOR <> AND "...' PAIRS
|
||
SKAN0: TRZ F2,SKIMQF+SKIMRF+SKANFS ;CLR SKIM FLAGS
|
||
PUSHJ P,SKRCH2 ;GET COMMAND CHAR.
|
||
CAIN CH,(TT1) ;SECONDARY CHARACTER?
|
||
AOJA C,SKAN1 ;YES, COUNT IT
|
||
CAIN CH,(TT) ;PRIMARY CHAR?
|
||
JRST SKAN10 ;YES!
|
||
SKAN1: CHKEO EO21,SKAN0 ;OLD STYLE SKAN IF EO = 1
|
||
MOVEI T,SKNTAB ;NO, WATCH OUT FOR TEXT STRINGS
|
||
SKAN00: PUSHJ P,DISPAT
|
||
JRST SKAN0 ;NOT A TEXT-ARG COMMAND, IGNORE IT
|
||
SKAN2: PUSHJ P,SKRCH2 ;GET CHAR AFTER "^"
|
||
CAIN CH,"A"
|
||
JRST SKAN7 ;^A COMMAND
|
||
CAIN CH,"^"
|
||
JRST SKAN11 ;^^ COMMAND
|
||
JRST SKAN0 ;ORDINARY CTRL-COMMAND, FORGET IT
|
||
SKAN3: PUSHJ P,SKRCH2
|
||
MOVEI T,SK3TAB ;WHICH E COMMAND?
|
||
JRST SKAN00
|
||
SKAN4: PUSHJ P,SKRCH2 ;WHAT FOLLOWS @?
|
||
MOVEI T,SK4TAB
|
||
PUSHJ P,DISPAT
|
||
JRST SKAN4 ;MUST BE 1 OF THESE 4
|
||
SKAN9: PUSHJ P,SKIM ;IGNORE TO $
|
||
JRST SKAN0
|
||
SKAN7: MOVEI T,1 ;IGNORE TO ^A
|
||
JRST SKAN5
|
||
SKAN8: MOVEI T,"!" ;IGNORE TO !
|
||
SKAN5: PUSHJ P,SKIM1 ;IGNORE TO CHAR IN T
|
||
JRST SKAN0
|
||
SKAN6: PUSHJ P,SKRCH2 ;GET SEARCH DELIMITER
|
||
SKIPA T,CH ;IGNORE TO NEXT OCCURRENCE
|
||
SKAN12: MOVEI T,ALT ;DELIMITER IS ALTMODE
|
||
PUSHJ P,SKIMRQ ;SKIP TO DELIMITER & WATCH OUT FOR ^Q,^R
|
||
JRST SKAN0
|
||
SKAN13: PUSHJ P,SKRCH2 ;GET INSERT DELIMITER
|
||
SKIPA T,CH ;IGNORE TO NEXT OCCURRENCE
|
||
SKAN14: MOVEI T,ALT ;DELIMITER IS ALTMODE
|
||
PUSHJ P,SKIM.R ;SKIP TO DELIMITER & WATCH OUT FOR ^R
|
||
JRST SKAN0
|
||
SKAN11: PUSHJ P,SKRCH2 ;IGNORE NEXT CHAR.
|
||
JRST SKAN0
|
||
SKAN16: MOVEI T,SK5TAB ;TABLE FOR @F
|
||
JRST SKAN17
|
||
SKAN15: MOVEI T,SK1TAB ;TABLE FOR F COMMANDS
|
||
SKAN17: TRO F2,SKANFS ;SIGNAL FS OR FN IN PROGRESS
|
||
PUSHJ P,SKRCH2 ;GET CHAR AFTER F
|
||
JRST SKAN00
|
||
SKAN10: SOJGE C,SKAN0 ;IF MATCH JUST ENDS A PAIR, LOOP BACK
|
||
TRZ F2,NOTRAC ;ENABLE TRACING
|
||
JRST CPOPJ1 ;OTHERWISE, WE HAVE WHAT WE WANT
|
||
|
||
;SKIM OVER TEXT
|
||
;ENTER AT SKIM TO SKIP TO NEXT ALTMODE, GIVING ^R & ^Q NO SPECIAL TREATMENT
|
||
;ENTER AT SKIM1 TO SKIP OVER ARBITRARY CHAR IN T, GIVING ^R & ^Q NO SPECIAL TREATMENT
|
||
;ENTER AT SKIM.R TO SKIP TO ARBITRARY CHAR IN T, UNLESS IT IS AFTER ^R
|
||
;ENTER AT SKIMRQ TO SKIP TO ARBITRARY CHAR IN T, UNLESS IT IS AFTER EITHER ^R OR ^Q
|
||
|
||
SKIMRQ: TRO F2,SKIMQF ;CK FOR ^Q AND ^R
|
||
SKIM.R: TROA F2,SKIMRF ;CK FOR ^R
|
||
SKIM: MOVEI T,ALT ;SKIP TO NEXT ALTMODE
|
||
SKIM1: PUSHJ P,SKRCH ;GET NEXT TEXT CHAR.
|
||
JRST APOPJ ;ERROR RETURN FROM SKAN ROUTINE
|
||
CAIN CH,(T) ;CHARACTER WE WANT?
|
||
JRST SKIM3 ;YES
|
||
CAIN CH,21 ;^Q?
|
||
TRNN F2,SKIMQF ;YES, CK FLAG ON?
|
||
JRST .+2 ;NO
|
||
JRST SKIM2 ;YES
|
||
CAIN CH,22 ;^R?
|
||
TRNN F2,SKIMRF ;YES, CK FLAG ON?
|
||
JRST SKIM1 ;NO, KEEP LOOKING
|
||
SKIM2: PUSHJ P,SKRCH ;GOBBLE UP NEXT CHARACTER
|
||
JRST APOPJ ;ERROR RETURN FROM SKAN
|
||
JRST SKIM1 ;CONTINUE SKIMMING
|
||
SKIM3: TRZE F2,SKANFS ;SKIMMING OVER FS OR FN?
|
||
JRST SKIM1 ;YES, IGNORE 1ST DELIMITER
|
||
POPJ P,
|
||
|
||
;GET A SINGLE CHARACTER FROM COMMAND STRING
|
||
;TAKE ERROR RETURN FROM SKAN IF THERE ARE NO MORE
|
||
|
||
SKRCH2: PUSHJ P,SKRCH ;GET A COMMAND CHAR.
|
||
APOPJ: POP P,A ;ERROR RETURN FROM SKAN IF NO MORE CHARS.
|
||
POPJ P,
|
||
;SKAN ROUTINE DISPATCH TABLES
|
||
|
||
SKNTAB: XWD SKAN15,"F"
|
||
XWD SKAN14,"I"
|
||
XWD SKAN14,11 ;TAB
|
||
XWD SKAN12,"_"
|
||
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 0,0 ;LIST TERMINATOR
|
||
|
||
SK3TAB: XWD SKAN9,"B" ;EB
|
||
XWD SKAN9,"R" ;ER
|
||
XWD SKAN9,"W" ;EW
|
||
XWD SKAN9,"Z" ;EZ
|
||
XWD 0,0
|
||
|
||
SK4TAB: XWD SKAN16,"F" ;@F
|
||
XWD SKAN13,"I" ;@I
|
||
XWD SKAN6,"_" ;@_
|
||
SK5TAB: XWD SKAN6,"S" ;@S OR @FS
|
||
XWD SKAN6,"N" ;@N OR @FN
|
||
XWD 0,0
|
||
CLIS1: PUSHJ P,CRR ;TYPE CRLF
|
||
CLIS:
|
||
IFN CCL,<
|
||
SKIPN CCLSW ;NEED CCL COMMAND?
|
||
JRST LIS0 ;NO
|
||
PUSHJ P,CCLIN ;GET THE CCL COMMAND TO TYI BUFFER
|
||
JRST LIS02 ;AND DONT SAY STAR
|
||
>
|
||
LIS0: PUSHJ P,TTOPEN ;GET TELETYPE
|
||
TRNE FF,QMFLG ;1ST CHARACTER IN ALREADY?
|
||
JRST LIS01 ;YES
|
||
MOVEI CH,"*"
|
||
TRZ F2,LINCHR ;CLR TTY LC BIT
|
||
SETO A, ;GETLCH ON THIS LINE
|
||
TTCALL 6,A
|
||
TLNE A,20 ;TTY LC ON?
|
||
TRO F2,LINCHR ;YES, SET TTY LC BIT
|
||
HRRZ TT1,A ;[137] GET UNIVERSAL I/O INDEX
|
||
MOVEI TT,1026 ;[137] CODE FOR ALT TESTING
|
||
MOVE A,[XWD 2,TT] ;[137] SET UP FOR TRMOP
|
||
TRMOP. A, ;[137] GET ALTMODE INFO FROM MONITOR
|
||
LDB A,[POINT 1,F2,29] ;[137] IF THIS FAILS USE LC BIT
|
||
SKIPE A ;[137] SHOULD WE CHANGE OLD ALTMODES?
|
||
TLOA F2,NOALT ;[137] DON'T CONVERT
|
||
TLZ F2,NOALT ;[137] DO CONVERT
|
||
PUSHJ P,TYOM ;TYPE *
|
||
LIS01: TRON FF,QMFLG ;UNLESS ONE ALREADY IN
|
||
PUSHJ P,TYI
|
||
CAIE CH,"*" ;1ST CHAR AN ASTERISK?
|
||
JRST LIS02 ;NO, CONTINUE NORMALLY
|
||
|
||
;SAVE PREVIOUS COMMAND STRING IN NAMED Q-REGISTER
|
||
|
||
LIS03: MOVE C,COMLEN ;LENGTH OF STRING
|
||
TLNE F2,NALTFS ;[174] NULL REPLACEMENT ALTMODE DELIMITED
|
||
;[174] F SEARCH?
|
||
ADDI C,1 ;[174] YES, DONT OMIT LAST ALTMODE
|
||
ADDI C,2 ;OMIT LAST ALTMODE
|
||
MOVEI B,CMDBFR ;POSITION OF FIRST CHAR. IN BYTES
|
||
IFN BUGSW,<MOVE B,CMDBFR>
|
||
IMULI B,5
|
||
TLNN F2,GOING ;[227] ANY CMD SEEN BEFORE?
|
||
SKIPA B,[-1,,-1] ;[227] NO - FLAG NCS ERROR FOR LATER.
|
||
PUSHJ P,X3 ;[227] YES - SAVE CMD IN Q-REG BUFFER
|
||
MOVEM B,COMSAV ;[227] SAVE FOR LATER
|
||
HRRZI CH,"*" ;[227] RESTORE CH (GARBAGED BY X3)
|
||
LIS02: SETZM COMCNT ;COMCNT:=0
|
||
TLZ F2,NALTFS ;[174] CLEAR FLAG
|
||
SETZM SYMS
|
||
MOVE T,[XWD SYMS,SYMS+1]
|
||
BLT T,SYMEND-1
|
||
MOVE AA,CBUF
|
||
MOVE B,CBUFH
|
||
|
||
LI1: TRZ FF,ALTF+BELLF+XPLNFL+EMFLAG
|
||
LI2: CAILE B,(AA) ;COMMAND BUFFER EXCEEDED?
|
||
JRST LI3 ;NO
|
||
|
||
|
||
;TO SEE IF TECO WILL NEED MORE CORE FOR COMMAND
|
||
;BUFFER EXPANSION. IF SO, GET IT
|
||
|
||
MOVE C,Z ;GET THE NUMBER OF CHARACTERS NOW
|
||
ADDI C,500 ;WILL WE OVERFLOW IF THIS IS REQUESTED?
|
||
CAMG C,MEMSIZ ;WILL THIS OVERFLOW?
|
||
JRST .+5 ;NO, FORGET THIS EVER HAPPENED
|
||
PUSH P,17 ;WILL OVERFLOW, THEREFORE, SAVE AC#17
|
||
MOVE 17,C ;THIS IS THE REQUEST FOR MEMORY
|
||
PUSHJ P,GRABKQ ;GET THE NECESSARY CORE
|
||
POP P,17 ;RESTORE AC#17
|
||
;OK, EXPAND THE COMMAND BUFFER CONFIDENTLY
|
||
|
||
ADDI B,100 ;YES. EXPAND COMMAND BUFFER 100 WORDS.
|
||
MOVE C,Z
|
||
IDIVI C,5 ;C:=DATA BUFFER END WORD ADDRESS.
|
||
MOVE D,QRBUF
|
||
PUSH P,F2 ;KLUDGE TO PROTECT F2 UNTIL AC'S ARE REORDERED
|
||
IDIVI D,5 ;D:=Q-REG BUFFER BASE WORD ADDRESS.
|
||
POP P,F2 ;RESTORE FLAGS
|
||
SUBM C,D ;D:=NO. OF WORDS IN Q-REG BUFFER AND DATA BUFFER.
|
||
MOVE CH,(C)
|
||
MOVEM CH,100(C) ;MOVE Q-REG AND DATA BUFFERS UP 100 WORDS.
|
||
SOS C
|
||
SOJGE D,.-3
|
||
MOVEI C,500
|
||
ADDM C,BEG ;BEG:=C(BEG)+500
|
||
ADDM C,PT ;PT:=C(PT)+500
|
||
ADDM C,Z ;Z:=C(Z)+500
|
||
ADDM C,QRBUF ;QRBUF:=C(QRBUF)+500
|
||
MOVE D,Z
|
||
LI3: MOVEM B,CBUFH ;NO. RESET HIGH END OF COMMAND BUFFER.
|
||
TRZN FF,QMFLG ;1ST CHAR IN ALREADY?
|
||
PUSHJ P,TYI ;GET A NON-NULL CHARACTER IN CH
|
||
CAIN CH,177 ;RUBOUT?
|
||
JRST RUBOUT ;YES
|
||
LI3A: AOS A,COMCNT ;NO. INCREMENT COMMAND CHARACTER COUNT
|
||
IDPB CH,AA ;STORE CHARACTER IN COMMAND BUFFER.
|
||
LI4: CAIE CH,ALT ;ALT-MODE?
|
||
JRST LI5 ;NO
|
||
TRZN F2,CTLR ;PREVIOUS CHAR. A ^R?
|
||
JRST LI7 ;NO
|
||
CHKEO EO21,LI7 ;IF EO=1, NEVERMIND ^R
|
||
LI9: TRZ FF,BELLF ;ALTMODE CLEARS BELL FLAG
|
||
JRST LI2
|
||
|
||
LI7: TRON FF,ALTF ;YES. SET ALT-MODE FLAG. WAS IT ON?
|
||
JRST LI9 ;NO
|
||
MOVEM A,COMAX ;SET COMMAND CHARACTER ADDRESS UPPER BOUND
|
||
MOVEM A,COMLEN ;SAVE IN CASE OF * COMMAND NEXT
|
||
MOVE AA,CBUF ;INIT COMMAND BYTE PTR
|
||
MOVEM AA,CPTR
|
||
SKIPE CCLSW ;READING CCL CMD?
|
||
PUSHJ P,TTOPEN ;YES, INIT TTY
|
||
PUSHJ P,CRR ;TYPE CRLF
|
||
SETZM CCLSW ;FINISHED WITH CCL READ
|
||
JRST CD ;DECODE COMMAND
|
||
LI5: CAIN CH,22 ;^R?
|
||
JRST CNTRLR ;YES
|
||
TRZ F2,CTLR ;NO, CLR FLAG IN CASE PRECEDING CHAR WAS
|
||
CAIN CH,25 ;^U?
|
||
JRST CNTRLU ;YES
|
||
CAIN CH,7 ;BELL?
|
||
JRST LI6 ;YES
|
||
TRZN FF,BELLF ;NO, PREVIOUS CHAR A BELL?
|
||
JRST LI1 ;NO, GET NEXT CHARACTER
|
||
CAIE CH," " ;YES, IS THIS A SPACE?
|
||
JRST LI2
|
||
RETYPE: PUSHJ P,BACKUP ;BACK OFF ^G<SPACE>
|
||
SOS D,COMCNT ;MARK CURRENT POSITION
|
||
PUSHJ P,BACKLN ;BACK UP TO BEG OF LINE
|
||
JRST RETYP3 ;HIT BEG OF COMMAND STRING
|
||
RETYP1: SKIPL COMCNT ;[151] SEE IF ANY COMMANDS
|
||
PUSHJ P,TYOM ;TYPE A CHAR OF COMMAND LINE
|
||
RETYP4: AOS C,COMCNT ;ADVANCE COMMAND CTR
|
||
CAIL C,(D) ;BACK IN PLACE?
|
||
JRST RETYP2 ;YES
|
||
ILDB CH,AA ;NO, GET NEXT CHAR
|
||
JRST RETYP1
|
||
|
||
RETYP2: CAIN CH,ALT ;LOOKING AT AN ALTMODE?
|
||
TRO FF,ALTF ;YES, BETTER SET FLAG
|
||
JRST LI2
|
||
|
||
RETYP3: PUSH P,CH ;SAVE 1ST CHAR
|
||
PUSHJ P,CRR ;TYPE CR-LF BEFORE COMMAND LINE
|
||
POP P,CH ;RETRIEVE 1ST CHARACTER
|
||
JUMPE CH,RETYP4 ;DON'T PRINT ^@ IF NULL COMMAND STRING
|
||
JRST RETYP1
|
||
|
||
LI6: TROE FF,BELLF ;YES. SET BELL FLAG. TWO SUCCESSIVE BELLS?
|
||
JRST LI8 ;YES, REJECT COMMAND
|
||
TRO FF,DDTMF ;GET ANOTHER CHAR WITH TTCALL 0
|
||
JRST LI2
|
||
|
||
LI8: SUBI A,1 ;SAVE COMCNT-1 IN CASE * COMMAND FOLLOWS
|
||
MOVEM A,COMLEN
|
||
TLO F2,GOING ;SO YOU CAN DO *I AFTER ^G^G
|
||
PUSHJ P,CRR ;YES. TYPE A CRLF
|
||
JRST GO ;AND CLEAR COMMAND BUFFER.
|
||
;BACK UP BYTE POINTER IN AA, LOAD APPROPRIATE CHARACTER IN CH,
|
||
;AND ADJUST COMCNT
|
||
|
||
BACKUP: ADD AA,[7B5] ;BACK UP CHAR PTR
|
||
JUMPG AA,.+3 ;OK NOW?
|
||
SUBI AA,1 ;NO, NEEDS FURTHER FIXING
|
||
HRLI AA,010700
|
||
LDB CH,AA ;LOAD CHAR
|
||
SOS C,COMCNT ;DECREMENT COMMAND COUNT
|
||
POPJ P,
|
||
|
||
;BACKUP TO BEGINNING OF CURRENT LINE
|
||
;CALL: PUSHJ P,BACKLN
|
||
; RETURN IF BACKUP WENT TO BEGINNING OF COMMAND STRING
|
||
; RETURN IF CR-EOL COMBINATION FOUND
|
||
|
||
BACKLN: PUSHJ P,BACKUP ;BACK UP ONE CHAR
|
||
JUMPLE C,CPOPJ ;RETURN IF NOTHING LEFT
|
||
BACKL1: PUSHJ P,CKEOL ;IS THIS AN EOL CHAR?
|
||
JRST BACKLN ;NO, KEEP BACKING UP
|
||
PUSHJ P,BACKUP ;YES, BACK UP ONE MORE
|
||
CAIE CH,15 ;IS THIS A CR?
|
||
JRST BACKL1 ;NO, MAYBE ANOTHER EOL?
|
||
JRST CPOPJ1 ;YES, TAKE SKIP RETURN
|
||
|
||
;PROCESS CONTROL-U
|
||
|
||
CNTRLU: PUSHJ P,TYOM ;ECHO THE ^U
|
||
PUSHJ P,BACKLN ;BACK UP TO BEG OF LINE
|
||
JUMPLE C,CLIS1 ;IF NOTHING LEFT, RETYPE *
|
||
AOS COMCNT ;KEEP CRLF
|
||
IBP AA
|
||
PUSHJ P,CRR ;CR-LF AFTER ^U
|
||
JRST LI1 ;CONTINUE TYPE-IN
|
||
|
||
;CONTROL-R IN COMMAND MODE PREVENTS AN ALTMODE AFTER IT
|
||
;FROM BEING A TERMINATOR
|
||
|
||
CNTRLR: TRZN F2,CTLR ;^R ON ALREADY?
|
||
TRO F2,CTLR ;NO, SET FLAG
|
||
JRST LI1
|
||
;PROCESS RUBOUTS
|
||
|
||
|
||
RUBOUT: SKIPG COMCNT ;ANYTHING TYPED IN?
|
||
JRST CLIS1 ;NO, RETYPE *
|
||
IFN RUBSW,<
|
||
SETO A, ;GETLCH ON THIS TTY
|
||
TTCALL 6,A ;SET TO SUPPRESS ECHOING
|
||
TLO A,4
|
||
TTCALL 7,A
|
||
PUSHJ P,SPLAT ;ACT LIKE THE MONITOR
|
||
JRST RUB4
|
||
RUB1: SKIPGE COMCNT ;PAST BEGINNING OF COMMAND STRING YET?
|
||
JRST RUB3 ;YES
|
||
PUSHJ P,TYIDDT ;GET ONE CHARACTER
|
||
CAIE CH,177 ;RUBOUT?
|
||
JRST RUB2 ;NO
|
||
RUB4: >
|
||
LDB CH,AA ;RELOAD THE CHAR.
|
||
SKIPE COMCNT ;UNLESS AT BEGINNING OF COMMAND STRING,
|
||
PUSHJ P,TYOM ;ECHO THE DELETED CHAR.
|
||
PUSHJ P,BACKUP ;BACK OVER THE CHAR.
|
||
IFE RUBSW,<JRST LI1> ;RESUME TYPE-IN
|
||
IFN RUBSW,<
|
||
JRST RUB1 ;TRY NEXT INPUT CHAR.
|
||
RUB2: PUSH P,CH ;SAVE THIS GOOD GUY
|
||
PUSHJ P,SPLAT ;TYPE THE SECOND \
|
||
POP P,CH ;GET THAT CHAR. BACK
|
||
CAIE CH,25 ;CTRL-U?
|
||
PUSHJ P,TYOM ;NO, ECHO IT
|
||
PUSHJ P,TTCREE ;RESET TTCALL FOR ECHOING
|
||
JRST LI3A ;PROCESS THIS CHAR.
|
||
RUB3: PUSHJ P,SPLAT ;SECOND \
|
||
PUSHJ P,TTCREE ;RESET TTCALL MODE TO NORMAL
|
||
JRST CLIS1 ;START A NEW COMMAND STRING
|
||
>
|
||
|
||
;TYPE BACKSLASH
|
||
|
||
IFN RUBSW,<
|
||
SPLAT: MOVEI CH,"\"
|
||
JRST TYOM
|
||
>
|
||
|
||
;RESET TTCALL FOR ECHOING
|
||
|
||
IFN RUBSW,<
|
||
TTCREE: SETO A, ;GETLCH ON THIS TTY
|
||
TTCALL 6,A
|
||
TLZ A,4 ;TURN OFF NO ECHO BIT
|
||
TTCALL 7,A
|
||
POPJ P,
|
||
>
|
||
CD:
|
||
RET: TRZ FF,ARG2+ARG+FINDR+PCHFLG+SEQUIN+FSRCH
|
||
TLO F2,GOING ;A COMMAND STRING IS IN
|
||
CD1: SETZM NUM ;NO ARGUMENT STRING SEEN
|
||
SETZM SYL
|
||
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"
|
||
TRZ F2,OCTALF ;NO, CLEAR OCTAL RADIX FLAG
|
||
CAIE A,140 ;140 IS ILLEGAL
|
||
CAILE A,172 ;ALSO 173-177 ARE ILLEGAL
|
||
MOVEI A,0
|
||
CAILE A,137 ;REDUCE LOWER CASE TO UPPER
|
||
SUBI A,40
|
||
ROT A,-1 ;DIV BY 2
|
||
JUMPL A,CD92 ;ODD CHARACTER
|
||
HLRZ A,DTB(A) ;GET CODE & ADDR FOR EVEN CHAR.
|
||
JRST CD93
|
||
CD92: HRRZ A,DTB(A) ;GET CODE & ADDR FOR ODD CHAR.
|
||
CD93: TRNN A,300000 ;IS IT A JRST DISPATCH WITH NO ARG PROCESSING?
|
||
JRST (A) ;YES, DO IT
|
||
MOVE B,NUM ;NO, TAKE CARE OF ARGUMENTS
|
||
XCT DLIM ;NUM:=NUM (DLIM OPERATOR) SYL
|
||
MOVEM B,NUM
|
||
setzm syl ;[167] clear old operand
|
||
MOVE C,SARG ;SAVE SECOND ARGUMENT IN C.
|
||
TRZ FF,SYLF ;CLR DIGIT STRING BIT
|
||
TRZ F2,CTLV+CTLVV+CTLW+CTLWW+EMATCH+TXTCTL
|
||
TRZ A,100000 ;CLR PUSHJ DISPATCH BIT
|
||
TRZE A,200000 ;JRST OR PUSHJ DISPATCH?
|
||
JRST (A)
|
||
PUSHJ P,(A)
|
||
JRST RET
|
||
|
||
|
||
U DLIM,1 ;
|
||
U NUM,1 ;
|
||
U SYL,1 ;
|
||
U SARG,1 ;
|
||
;DIGITS FORM DECIMAL INTEGERS.
|
||
|
||
CDNUM: TRON FF,SYLF ;DIGIT STRING ALREADY STARTED?
|
||
SETZM SYL ;NO, INIT TO ZERO
|
||
MOVEI A,12 ;RADIX 10
|
||
TRNN F2,OCTALF ;OCTAL FLAG ON?
|
||
JRST CDNUM1 ;NO
|
||
MOVEI A,10 ;YES, RADIX 8
|
||
CAIG CH,"7" ;[202] 8 OR 9 IN OCTAL STRING?
|
||
JRST CDNUM1 ;[202] NO, PROCEED
|
||
TRZ F2,OCTALF ;[202] YES, CLEAR OCTAL FLAG
|
||
ERROR E.OCT;; ;[202] AND COMPLAIN TO THE USER
|
||
CDNUM1: IMUL A,SYL ;SCALE PREVIOUS VALUE
|
||
ADDI A,-60(CH) ;ADD IN NEW DIGIT
|
||
|
||
;SOME COMMANDS HAVE A NUMERIC VALUE
|
||
VALRET: MOVEM A,SYL
|
||
CD7: TRO FF,ARG
|
||
JRST CD5
|
||
|
||
ALTMOD: SKIPN COMCNT ;ANY COMMANDS LEFT?
|
||
JRST ALTM2 ;[114] NO
|
||
MOVE T,CPTR ;IF NEXT COMMAND CHARACTER IS ALT-MODE, GO
|
||
ILDB CH,T
|
||
CAIE CH,ALT
|
||
JRST CD
|
||
ALTM1: TRNE FF,TRACEF ;TRACING?
|
||
PUSHJ P,CRR ;YES, TYPE CR/LF BEFORE *
|
||
JRST GO
|
||
ALTM2: SKIPN EQM ;[114] WITHIN A MACRO?
|
||
JRST GO ;[114] NO
|
||
JRST CD ;[114] MACRO RETURN
|
||
|
||
;^ MEANS THAT THE NEXT CHARACTER IS A CONTROL CHARACTER.
|
||
|
||
UAR: PUSHJ P,SKRCH ;GET NEXT COMMAND CHARACTER.
|
||
ERROR E.MEU
|
||
TRZ CH,140 ;CHANGE IT TO CONTROL CHARACTER
|
||
JRST CD9 ;DISPATCH
|
||
;IF A COMMAND TAKES TWO NUMERIC ARGUMENTS, COMMA IS USED TO SEPARATE THEM
|
||
|
||
COMMA: MOVEM B,SARG ;SAVE CURRENT ARGUMENT IN SARG.
|
||
TRZE FF,ARG ;WAS THERE A CURRENT ARGUMENT?
|
||
TROE FF,ARG2 ;YES. WAS THERE ALREADY A SECOND ARGUMENT?
|
||
ERROR E.ARG
|
||
JRST CD1 ;YES. CLEAR CURRENT ARGUMENT.
|
||
|
||
;() MAY BE USED TO OVERRIDE LEFT TO RIGHT OPERATOR SCAN FOR +,-,*,/,& AND #.
|
||
|
||
OPENP: PUSH P,NUM ;PUSH CURRENT ARGUMENT.
|
||
PUSH P,DLIM ;CURRENT OPERATOR
|
||
PUSH P,[1] ;SET PAREN FLAG ON PDL
|
||
JRST CD1
|
||
|
||
CLOSEP: POP P,T ;LAST THING ON PDL A LEFT PAREN?
|
||
JUMPL T,CLOSE1 ;SOMETHING LIKE (...<...)
|
||
SOJN T,CLOSE2 ;MISSING (
|
||
MOVEM B,SYL ;YES. SAVE CURRENT ARGUMENT.
|
||
POP P,DLIM ;RESTORE OPERATOR
|
||
POP P,NUM ;RESTORE ARGUMENT.
|
||
JRST CD7
|
||
|
||
CLOSE1: ERROR E.PAR
|
||
CLOSE2: ERROR E.MLP
|
||
|
||
;^O SETS FLAG FOR OCTAL RADIX INPUT
|
||
|
||
OCTIN: TRO F2,OCTALF
|
||
JRST CD5 ;RETURN WITHOUT MESSING UP ARGUMENTS
|
||
;LOGICAL AND
|
||
|
||
CAND: MOVSI A,(AND B,) ;DLIM = AND B,SYL
|
||
JRST CD3
|
||
|
||
;LOGICAL OR
|
||
|
||
COR: MOVSI A,(OR B,) ;DLIM = OR B,SYL
|
||
JRST CD3
|
||
|
||
;ADD TAKES ONE OR TWO ARGUMENTS
|
||
|
||
PLUS: MOVSI A,(ADD B,) ;DLIM = ADD B,SYL
|
||
JRST CD3
|
||
|
||
;SUBTRACT TAKES ONE OR TWO ARGUMENTS
|
||
|
||
MINUS: MOVSI A,(SUB B,) ;DLIM = SUB B,SYL
|
||
JRST CD3
|
||
|
||
;MULTIPLY TAKES TWO ARGUMENTS
|
||
|
||
TIMES: MOVE B,COMAX ;[227] CALCULATE WHICH CHARACTER
|
||
SUB B,COMCNT ;[227] * WAS.
|
||
CAIE B,1 ;[227] WAS * THE FIRST CHAR?
|
||
JRST TIMES0 ;[227] NO - GO DO MULTIPLY.
|
||
MOVE B,COMSAV ;[227] YES - GET SAVED Q-BFR PTR
|
||
CAME B,[-1,,-1] ;[227] IS IT ERROR-FLAGGED?
|
||
JRST .+3 ;[227] NO - NO ERROR (YET)
|
||
PUSHJ P,GCH ;[227] YES - GET Q-REG NAME
|
||
ERROR E.NCS ;[227] AND DO ERROR.
|
||
PUSHJ P,QREGVI ;[227] GET Q-REG NAME WITH IQL CHECK
|
||
MOVEM B,QTAB-"0"(CH) ;[227] AND SAVE PTR IN THE Q-REG.
|
||
JRST CD ;[227]
|
||
TIMES0: MOVSI A,(IMUL B,) ;DLIM = IMUL B,SYL
|
||
JRST CD3
|
||
|
||
;DIVIDE (TRUNCATES) TAKES TWO ARGUMENTS
|
||
|
||
SLASH: MOVSI A,(IDIV B,) ;DLIM = IDIV B,SYL
|
||
JRST CD3
|
||
|
||
;RETURNS THE VALUE OF THE FORM FEED FLAG
|
||
|
||
FFEED: TRNE FF,FORM ;IS IT SET?
|
||
JRST FFOK ;YES, RETURN A -1
|
||
;NO, DO BEGIN ROUTINE
|
||
;RETURNS THE NUMERIC VALUE 0.
|
||
|
||
BEGIN: MOVEI A,0
|
||
JRST VALRET
|
||
|
||
;^N RETURNS VALUE OF EOF FLAG
|
||
|
||
EOF: TLNN FF,FINF ;EOF SEEN?
|
||
JRST BEGIN ;NO, RETURN 0
|
||
JRST FFOK ;YES, RETURN -1
|
||
|
||
;AN ABBREVIATION FOR B,Z
|
||
|
||
HOLE: SETZM SARG ;SET SECOND ARGUMENT TO 0.
|
||
TRO FF,SEQUIN ;[122] INITIALIZE AS NEW LINE
|
||
TRNE FF,ARG2 ;FLAG ANY ARGS BEFORE H
|
||
ERROR E.ARG
|
||
TROA FF,ARG2
|
||
|
||
;.=NUMBER OF CHARACTERS TO THE LEFT OF THE POINTER
|
||
|
||
PNT: SKIPA A,PT
|
||
|
||
;Z=NUMBER OF CHARACTERS IN THE BUFFER
|
||
|
||
END1: MOVE A,Z
|
||
SUB A,BEG
|
||
JRST VALRET
|
||
|
||
;RETURN LENGTH OF LAST TEXT STRING PROCESSED
|
||
|
||
IFN VC,<
|
||
VCMD: MOVE A,VVAL ;LENGTH OF LAST TEXT
|
||
JRST VALRET
|
||
>
|
||
|
||
U VVAL,1 ;LENGTH OF LAST TEXT STRING PROCESSED
|
||
;N= CAUSES THE VALUE OF N TO BE TYPED OUT.
|
||
|
||
PRNT: TRNN FF,ARG ;INSIST ON ARG BEFORE =
|
||
ERROR E.NAE
|
||
MOVE A,CPTR ;SNEAK A LOOK AT NEXT COMMAND CHAR.
|
||
ILDB CH,A
|
||
CAIE CH,"=" ;ANOTHER = SIGN?
|
||
JRST PRNT9 ;NO
|
||
TRO F2,OCTALF ;YES, THAT MEANS OCTAL RADIX TYPE-OUT
|
||
PUSHJ P,SKRCH ;SWALLOW THE EXTRA =
|
||
TRZ F2,OCTALF ;AT END OF MACRO
|
||
PRNT9: PUSHJ P,PRNT9S ;PRINT NUMBER
|
||
JRST CRR ;CRLF AND RETURN TO CALLER
|
||
|
||
;TYPE C(B) IN OCTAL
|
||
|
||
OCTMS: TROA F2,OCTALF ;SET OCTAL RADIX
|
||
|
||
;TYPE C(B) IN DECIMAL
|
||
|
||
DECMS: TRZ F2,OCTALF ;DECIMAL RADIX
|
||
PRNT9S: MOVEI A,TYO ;OUTPUT ON TTY
|
||
PUSHJ P,DPT ;TYPE NUMBER
|
||
TRZ F2,OCTALF ;CLR RADIX FLAG
|
||
POPJ P,
|
||
|
||
|
||
|
||
;CAUSES COMMAND INTERPRETATION TO STOP UNTIL THE USER TYPES A CHARACTER
|
||
;ON THE TELETYPE AND THEN HAS THE ASCII VALUE OF THE CHARACTER TYPED IN.
|
||
|
||
|
||
SPTYI: TRO FF,DDTMF
|
||
PUSHJ P,TYI ;GET A SINGLE CHAR.
|
||
SKIPA A,CH
|
||
|
||
|
||
;HAS THE VALUE OF ELAPSED TIME, IN 60THS OF A SECOND, SINCE MIDNITE.
|
||
|
||
GTIME: TIMER A,
|
||
JRST VALRET
|
||
|
||
|
||
;HAS THE VALUE OF THE CONSOLE DATA SWITCHES.
|
||
|
||
LAT: SWITCH A,
|
||
JRST VALRET
|
||
|
||
;HAS THE VALUE OF THE NEXT CHARACTER IN THE COMMAND STRING.
|
||
|
||
CNTRUP: PUSHJ P,SKRCH ;^^ HAS VALUE OF CHAR FOLLOWING IT
|
||
ERROR E.MUU
|
||
MOVE A,CH
|
||
JRST VALRET
|
||
;HAS THE VALUE OF THE NUMBER REPRESENTED BY THE DIGITS (OR MINUS SIGN)
|
||
;FOLLOWING THE POINTER IN THE BUFFER. THE SCAN TERMINATES ON ANY OTHER
|
||
;CHARACTER. THE POINTER IS MOVED OVER THE NUMBER FOUND (IF ANY).
|
||
|
||
BAKSL: TRZE FF,ARG ;WHICH KIND OF BACKSLASH?
|
||
JRST BAKSL1 ;ARG TO MEMORY
|
||
MOVE I,PT ;MEMORY TO VALRET
|
||
CAML I,Z ;CAN WE READ ANOTHER?
|
||
JRST BAKSL3 ;NO
|
||
PUSHJ P,GETINC ;CK FOR +,- SIGN
|
||
CAIN CH,"+"
|
||
JRST BAKSLA ;IGNORE +
|
||
CAIE CH,"-"
|
||
JRST BAKSL0 ;NO SIGN
|
||
TRO FF,ARG ;NEGATION FLAG
|
||
BAKSLA: CAML I,Z ;OVERDID IT ?
|
||
JRST BAKSL3 ;YES. EXIT
|
||
PUSHJ P,GETINC ;NO. GET A CHAR
|
||
BAKSL0: CAIG CH,"9" ;DIGIT?
|
||
CAIGE CH,"0" ;DIGIT?
|
||
SOJA I,BAKSL2 ;NOT A DIGIT. BACKUP AND LEAVE LOOP
|
||
SUBI CH,"0" ;CONVERT TO NUMBER
|
||
EXCH CH,SYL
|
||
IMULI CH,12
|
||
ADDM CH,SYL ;SYL:= 10.*SYL+CH
|
||
JRST BAKSLA ;LOOP
|
||
|
||
BAKSL3: MOVE I,Z ;HERE ON OVERFLOW
|
||
BAKSL2: TRZE FF,ARG ;MINUS SIGN SEEN?
|
||
MOVNS SYL ;YES. NEGATE
|
||
MOVEM I,PT ;MOVE POINTER PAST #
|
||
JRST CD7 ;DONE
|
||
|
||
|
||
;NA (WHERE N IS A NUMERIC ARGUMENT) = VALUE IN 7-BIT ASCII OF THE
|
||
;CHARACTER TO THE RIGHT OF THE POINTER.
|
||
|
||
ACMD: TRNN FF,ARG ;DOES AN ARGUMENT PRECEED A?
|
||
JRST APPEND ;NO. THIS IN AN APPEND COMMAND.
|
||
MOVE A,Z ;IF POINTER IS AT END OF
|
||
SUB A,PT ; BUFFER OR IF BUFFER EMPTY,
|
||
JUMPE A,VALRET ; MUST GIVE 1A=0
|
||
MOVE I,PT ;YES.
|
||
PUSHJ P,GET ;CH:=CHARACTER TO THE RIGHT OF PT.
|
||
MOVE A,CH ;RETURN CH AS VALUE.
|
||
JRST VALRET
|
||
;NUI PUTS THE NUMERIC VALUE N IN Q-REGISTER I.
|
||
|
||
USE: TRNN FF,ARG ;INSIST ON ARG BEFORE U
|
||
ERROR E.NAU
|
||
;USE+1 1/2 [205]
|
||
TLNE B,400000 ;[205] DOES THE ARG LOOK LIKE A TEXT POINTER?
|
||
TLNE B,377777 ;[205] (IE., IS IT OUT OF RANGE?)
|
||
JRST USEA ;[205] NO, GO STORE IT
|
||
ERROR E.AOR
|
||
USEA: PUSHJ P,QREGVI ;YES. CH:=Q-REGISTER INDEX.
|
||
MOVEM B,QTAB-"0"(CH) ;STORE ARGUMENT IN SELECTED Q-REG.
|
||
JRST RET
|
||
|
||
;QI HAS THE VALUE OF THE LATEST QUANTITY PUT INTO Q-REGISTER I.
|
||
|
||
QREG: PUSHJ P,QTXTST ;[135] GET Q-REG & CHECK FOR TEXT
|
||
JRST VALRET
|
||
|
||
;ROUTINE TO RETURN Q-REGISTER INDEX IN CH AND CONTENT IN A.
|
||
|
||
QREGVI: PUSHJ P,SKRCH ;CH:=NEXT COMMAND STRING CHARACTER.
|
||
ERROR E.MIQ
|
||
QREGV2: CAIL CH,140 ;LC LETTER?
|
||
TRZ CH,40 ;MAKE UC
|
||
CAIGE CH,"0" ;DIGIT?
|
||
ERROR E.IQN
|
||
CAIG CH,"9"
|
||
POPJ P, ;YES
|
||
CAIL CH,"A" ;LETTER?
|
||
CAILE CH,"Z"
|
||
ERROR E.IQN
|
||
SUBI CH,"A"-"9"-1 ;TRANSLATE LETTERS DOWN BY NUMBER OF
|
||
POPJ P, ;CHARACTERS BETWEEN 9 AND A. ONLY 36 Q-REG'S
|
||
|
||
|
||
;%I ADDS 1 TO THE QUANTITY IN Q-REGISTER I AND STANDS FOR THE
|
||
; NEW VALUE
|
||
|
||
PCNT: PUSHJ P,QTXTST ;[135] GET Q-REG & CHECK FOR TEXT
|
||
AOS A,QTAB-"0"(CH) ;INCREMENT THE Q REG
|
||
JRST VALRET ;RETURN NEW VALUE.
|
||
QTXTST: PUSHJ P,QREGVI ;[135] GET Q-REG INDEX
|
||
MOVE A,QTAB-"0"(CH) ;[135] GET Q-REG CONTENTS
|
||
TLNE A,400000 ;[143] DOES IT CONTAIN TEXT?
|
||
TLNE A,377777 ;[143]
|
||
POPJ P, ;[135] NO,RETURN
|
||
ERROR E.NNQ
|
||
;M,NXI COPIES A PORTION OF THE BUFFER INTO Q-REGISTER I.
|
||
; IT SETS Q-REGISTER I TO A DUPLICATE OF THE (M+1)TH
|
||
; THROUGH NTH CHARACTERS IN THE BUFFER. THE BUFFER IS UNCHANGED.
|
||
;NXI INTO Q-REGISTER I IS COPIED THE STRING OF CHARACTERS STARTING
|
||
; IMMEDIATELY TO THE RIGHT OF THE POINTER AND PROCEEDING THROUGH
|
||
; THE NTH LINE FEED.
|
||
|
||
X:
|
||
IFN VC,<SETZM VVAL> ;CLR STRING LENGTH HOLD
|
||
PUSHJ P,GETARG ;C:=FIRST STRING ARGUMENT ADDRESS
|
||
;B:=SECOND STRING ARGUMENT ADDRESS.
|
||
PUSHJ P,CHK1 ;IS SECOND ARG. ADDR. > FIRST ARG. ADDR.?
|
||
EXCH B,C ;YES.
|
||
SUB C,B ;[211] C:=LENGTH OF STRING.
|
||
MOVE A,C ;[211] STORE LENGTH OF STRING SAVED
|
||
ADDI C,3 ;[211] C:=LENGTH OF STRING +3.
|
||
; MOVEI A,-3(C) ;STORE LENGTH OF STRING SAVED
|
||
IFN VC,<MOVEM A,VVAL>
|
||
ADD B,C ;B:=FIRST ARG ADDR + LENGTH OF STRING + 3
|
||
PUSHJ P,X3 ;MOVE DATA TO Q-REG BUFR
|
||
JRST USEA ;NO, MAKE QTAB ENTRY NORMALLY.
|
||
|
||
;TRANSFER DATA TO Q-REGISTER BUFR
|
||
|
||
X3: PUSH P,PT
|
||
ADDM C,(P) ;(P):=PT + LENGTH OF STRING + 3.
|
||
MOVE D,BEG
|
||
MOVEM D,PT ;PT:=BEG
|
||
PUSHJ P,NROOM ;INSERT STRING AT BEG
|
||
MOVE OU,RREL ;RREL CONTAINS RELOCATION CONSTANT IF
|
||
;GARBAGE COL. OCCURRED.
|
||
ADDM OU,(P) ;RELOCATE TOP OF STRING POINTER.
|
||
CAML B,BEG ;[212] DON'T NEED TO RELOCATE IF *I
|
||
ADD B,OU ;B:=FIRST ARG ADDR + LENGTH OF STRING + 3 + RREL
|
||
MOVE OU,BEG ;OU:=ADDRESS OF Q-REG BUFFER
|
||
ADDM C,BEG ;BEG:=C(BEG)+LENGTH OF STRING + 3
|
||
MOVE CH,C ;FIRST CHAR OF BUFFER :=LEAST SIGNIFICANT 7 BITS
|
||
PUSHJ P,PUT ;OF LENGTH OF STRING + 3
|
||
AOS OU ;SECOND CHAR = MIDDLE 7 BITS OF LENGTH
|
||
ROT CH,-7
|
||
PUSHJ P,PUT
|
||
ROT CH,-7
|
||
MOVE I,B ;THIRD CHAR OF BUFFER := MOST SIGNIFICANT 7 BITS
|
||
;OF LENGTH OF STRING + 3
|
||
AOS OU
|
||
X1: PUSHJ P,PUT ;MOVE STRING TO Q-REG BUFFER.
|
||
AOS OU
|
||
CAIN C,3
|
||
JRST X2
|
||
PUSHJ P,GETINC
|
||
SOJA C,X1
|
||
X2: MOVE B,PT ;QTAB ENTRY :=XWD 400000,Q-REG BUFFER
|
||
;ADDRESS RELATIVE TO C(QRBUF)
|
||
SUB B,QRBUF
|
||
TLO B,400000
|
||
POP P,PT ;MOVE PT PAST STRING.
|
||
POPJ P,
|
||
;GI THE TEXT IN Q-REGISTER I IS INSERTED INTO THE BUFFER AT THE
|
||
; CURRENT LOCATION OF THE POINTER. THE POINTER IS THEN PUT JUST
|
||
; TO THE RIGHT OF THE INSERTION. THE Q-REGISTER IS NOT CHANGED.
|
||
|
||
QGET:
|
||
IFN VC,<SETZM VVAL> ;CLR STRING LENGTH HOLD
|
||
PUSHJ P,QTEXT ;INIT Q-REG ACCESS
|
||
MOVE B,CH ;SAVE INDEX
|
||
PUSHJ P,GTQCNT ;C:=LENGTH OF STRING
|
||
PUSHJ P,NROOMC ;MOVE FROM PT THROUGH Z UP C POSITIONS
|
||
MOVE OU,PT
|
||
HRRZ I,QTAB-"0"(B)
|
||
ADD I,QRBUF
|
||
ADDI I,3
|
||
QGET1: JUMPE C,RET ;MOVE STRING INTO DATA BUFFER
|
||
PUSHJ P,GETINC
|
||
PUSHJ P,PUT
|
||
AOS OU,PT
|
||
SOJA C,QGET1
|
||
|
||
;GET 21 BIT Q-REGISTER CHARACTER COUNT
|
||
|
||
GTQCNT: PUSHJ P,GETINC ;LOW ORDER 7 BITS
|
||
MOVEM CH,C
|
||
PUSHJ P,GETINC ;MIDDLE 7 BITS
|
||
ROT CH,7
|
||
IORM CH,C
|
||
PUSHJ P,GETINC ;HIGH 7 BITS
|
||
ROT CH,^D14
|
||
IORM CH,C
|
||
SUBI C,3 ;LESS 3 WORDS USED TO STORE THIS COUNT
|
||
POPJ P,
|
||
|
||
;INITIALIZE ACCESS OF TEXT FROM A Q-REGISTER
|
||
|
||
QTEXT: PUSHJ P,QREGVI ;A=QTAB ENTRY, CH=Q-REG INDEX
|
||
MOVE A,QTAB-"0"(CH)
|
||
TLZE A,400000 ;MAKE SURE IT CONTAINS TEXT
|
||
TLZE A,377777
|
||
ERROR E.NTQ
|
||
ADD A,QRBUF
|
||
MOVE I,A ;I=Q-REG BUFFER ADDRESS
|
||
POPJ P,
|
||
;MI PERFORM NOW THE TEXT IN Q-REGISTER I AS A SERIES OF COMMANDS.
|
||
|
||
MAC: PUSHJ P,QTEXT ;INIT Q-REG ACCESS
|
||
PUSH P,COMAX ;SAVE CURRENT COMMAND STATE
|
||
PUSH P,CPTR
|
||
PUSH P,COMCNT
|
||
PUSH P,. ;FLAG MACRO ON PDL (LARGE POS. NO.)
|
||
PUSHJ P,GTQCNT ;GET NUMBER OF CHARACTERS IN MACRO
|
||
MOVEM C,COMCNT ;THAT MANY COMMANDS TO COUNT
|
||
MOVEM C,COMAX ;AND MAX.
|
||
SUBI I,1 ;ADJUST TO SUIT BTAB
|
||
IDIVI I,5
|
||
MOVE OU,BTAB(OU) ;MAKE A BYTE POINTER
|
||
HRR OU,I
|
||
MOVEM OU,CPTR ;PUT IT IN CPTR
|
||
AOS EQM ;[114] INCREMENT THE MACRO LEVEL
|
||
JRST CD5 ;DON'T FLUSH ANY ARGUMENTS
|
||
|
||
|
||
;]I POPS Q-REGISTER I OFF THE Q-REGISTER PUSHDOWN LIST.
|
||
; THE Q-REGISTER PUSHDOWN LIST IS CLEARED EACH TIME $$ IS TYPED.
|
||
|
||
CLOSEB: SKIPA C,[POP PF,]
|
||
|
||
;[I PUSHES Q-REGISTER I ONTO THE Q-REGISTER PUSHDOWN LIST.
|
||
|
||
OPENB: MOVSI C,261000+PF*40
|
||
PUSHJ P,QREGVI
|
||
HRRI C,QTAB-"0"(CH) ;C:=Q-REGISTER INDEX.
|
||
XCT C ;PUSH OR POP Q-REGISTER.
|
||
JRST RET
|
||
;E COMMANDS SELECT AND CONTROL FILE INPUT-OUTPUT MEDIA
|
||
|
||
ECMD: PUSHJ P,SKRCH ;GET CHAR AFTER E
|
||
ERROR E.MEE
|
||
MOVEI T,ECTABL ;INDEX DISPATCH TABLE
|
||
PUSHJ P,DISPAT
|
||
ERROR E.IEC
|
||
|
||
;E-COMMAND DISPATCH TABLE
|
||
|
||
ECTABL: XWD TYOCTL,"T"
|
||
XWD OPNRD,"R"
|
||
XWD OPNWR,"W"
|
||
XWD CLOSEF,"F"
|
||
XWD ZERDIR,"Z"
|
||
XWD EMTAPE,"M"
|
||
XWD EBAKUP,"B"
|
||
XWD FINISH,"X"
|
||
IFN CCL,<XWD CCLFIN,"G">
|
||
XWD OLDMOD,"O"
|
||
XWD TYCASE,"U"
|
||
XWD ERRSET,"H"
|
||
XWD AUTOTY,"S"
|
||
XWD COLOIT,"C" ;[231] DISABLE AUTO-COLON SEARCHES
|
||
XWD 0,0 ;MARKS END OF LIST
|
||
|
||
|
||
;[214] THIS ROUTINE POINTS TO THE PATH BLOCK IF SUB FILE DIRECTORIES ARE
|
||
;[214] IMPLEMENTED, OTHERWISE IT WILL PUT THE PPN IN .RBPPN.
|
||
STOMP: TLNN F2,SFDS ;[214] SEE IF SUB FILE DIRECTORIES EXIST
|
||
JRST .+3 ;[214] THEY DON'T
|
||
PUSH E,[PTHBLK] ;[214] YES, POINT TO THE PATH BLOCK
|
||
POPJ P, ;[214]
|
||
PUSH E,COMPPN ;[214] USE THE GIVEN PPN OR THE DEFAULT PPN
|
||
POPJ P, ;[214]
|
||
;MISCELLANEOUS CHARACTER DISPATCHER
|
||
;CALL: MOVE CH,CHARCATER
|
||
; MOVEI T,TABLE ADDR
|
||
; PUSHJ P,DISPAT
|
||
; NOT FOUND RETURN
|
||
;ENTER AT DISP1 TO AVOID CONVERTING LC TO UC
|
||
|
||
DISPAT: CAIG CH,172 ;CONVERT LC TO UC
|
||
CAIG CH,137
|
||
JRST DISP1
|
||
TRZ CH,40
|
||
DISP1: PUSH P,A ;SAVE AC A WHILE WE USE IT
|
||
DISP2: MOVE A,(T) ;GET TABLE ENTRY
|
||
TRNN A,777777 ;ANYTHING LEFT?
|
||
JRST APOPJ ;NO -- RESTORE AC A & RETURN
|
||
SUBI A,(CH) ;COMPARE
|
||
MOVSS A
|
||
TLNE A,777777
|
||
AOJA T,DISP2 ;NOT A MATCH
|
||
MOVEM A,-1(P) ;GOT IT -- PUT DISPATCH ADDR ON PDL
|
||
JRST APOPJ ;RESTORE AC A & DISPATCH
|
||
;EX -- FINISH OUTPUT AND RETURN TO THE TIME-SHARING EXEC.
|
||
|
||
FINIS1: SETSTS TTY,0 ;RETURN TO NORMAL TTY MODE
|
||
OUTPUT TTY,0 ;DUMMY OUTPUT TO LET SCNSER IN ON THE NEW MODE
|
||
TRO FF,PCHFLG ;NO FREE FORM FEEDS
|
||
MOVSI E,1 ;A LARGE NUMBER OF PAGES
|
||
PUSHJ P,PUN1 ;PUNCH THOSE PAGES
|
||
JRST CLOSEF ;CLOSE AND RENAME FILES
|
||
|
||
FINISH: PUSHJ P,FINIS1 ;FINISH UP.
|
||
|
||
;^Z -- RETURN TO THE MONITOR (SAME AS THE OLD ^G)
|
||
|
||
DECDMP: RELEAS TTY,0
|
||
RELEAS INCHN,0
|
||
RELEAS OUTCHN,0
|
||
TLZ FF,UREAD+UWRITE+FINF+UBAK ;IN CASE OF A CONTINUE
|
||
RESET
|
||
EXIT 1,
|
||
JRST GO ;IF HE CONTINUES
|
||
|
||
IFN CCL,<
|
||
CCLFIN: PUSHJ P,FINIS1 ;FINISH FILE IO
|
||
IFN NORUNS,<
|
||
SKIPGE MONITR ;CHECK FOR 4 SERIES MONITOR
|
||
JRST NORUN ;3 SERIES - SIMULATE RUN UUO
|
||
>
|
||
MOVEI A,CCLBLK ;RUN COMPIL
|
||
HRLI A,1 ;AT START ADR PLUS ONE
|
||
CALLI A,35 ;RUN UUO
|
||
JRST DECDMP ;JUST EXIT IF NO RUN.
|
||
|
||
CCLBLK: SIXBIT /SYS/
|
||
SIXBIT /COMPIL/ ;RUN SYS:COMPIL
|
||
REPEAT 4,<0>
|
||
>
|
||
IFN NORUNS,<
|
||
IFN CCL,<
|
||
NORUN: MOVE 1,[SIXBIT /COMPIL/]
|
||
MOVSI 2,SAVEXT ;SIXBIT FOR SAV OR DMP
|
||
SETZB 3,4
|
||
INIT CCLCHN,17
|
||
SIXBIT /SYS/
|
||
0
|
||
CALLI 12
|
||
LOOKUP CCLCHN,1
|
||
CALLI 12
|
||
CALL 1,[SIXBIT /SETNAM/]
|
||
HLRO 15,4
|
||
HRLM 15,NORUN1
|
||
MOVNS 15
|
||
MOVEI 16,73(15)
|
||
ADDI 15,INHERE
|
||
TRO 15,1777
|
||
MOVSI NORTOP,NORAC
|
||
BLT NORTOP,NORTOP
|
||
HRR NORBLT,16
|
||
JRST NORUN2
|
||
>>
|
||
;ET COMMAND
|
||
|
||
TYOCTL: POP P,CH ;CLR RET. ADDR. FROM PDL
|
||
TRNE FF,ARG ;ARGUMENT?
|
||
JRST TYOCT1 ;YES.
|
||
TLNE FF,TYOCTF ;NO, FLAG ON?
|
||
JRST FFOK ;YES, RETURN -1
|
||
JRST BEGIN ;NO, RETURN 0
|
||
|
||
TYOCT1: TLZ FF,TYOCTF ;CLEAR ET FLAG
|
||
JUMPE B,RET ;ARGUMENT NON-ZERO?
|
||
TLO FF,TYOCTF ;YES. SET ET FLAG
|
||
JRST RET ;RETURN
|
||
|
||
;EO COMMAND
|
||
|
||
OLDMOD: POP P,CH ;CLR RET. ADDR. FROM PDL
|
||
TRNE FF,ARG ;ARGUMENT?
|
||
JRST OLD1 ;YES, SET FLAG
|
||
MOVE A,EOFLAG ;NO, RETURN VALUE OF EOFLAG
|
||
JRST VALRET
|
||
|
||
OLD1: CAIG B,0 ;N <= 0?
|
||
MOVEI B,EOVAL ;YES, SET TO STANDARD
|
||
CAILE B,EOVAL ;N > STANDARD FOR THIS VERSION?
|
||
ERROR E.EOA
|
||
MOVEM B,EOFLAG ;SET EOFLAG
|
||
JRST RET
|
||
|
||
U EOFLAG,1 ;EDIT OLD FLAG
|
||
|
||
;EU COMMAND
|
||
|
||
TYCASE: POP P,CH ;CLR RET. ADDR. FROM PDL
|
||
TRNE FF,ARG ;ARGUMENT?
|
||
JRST TYCAS1 ;YES
|
||
MOVE A,TYCASF ;NO, RETURN VALUE OF TYPE-OUT CASE FLAG
|
||
JRST VALRET
|
||
|
||
TYCAS1: MOVEM B,TYCASF ;SET TYPE-OUT CASE FLAG
|
||
JRST RET
|
||
|
||
U TYCASF,1 ;TYPE-OUT CASE FLAG: 0 = TYPE ' BEFORE LC
|
||
;+ = TYPE ' BEFORE UC; - = DON'T TYPE FLAGS
|
||
;ES COMMAND
|
||
|
||
AUTOTY: POP P,CH ;CLR RET ADDR FROM PDL
|
||
TRNE FF,ARG ;ARG?
|
||
JRST AUTOT1 ;YES
|
||
MOVE A,AUTOF ;NO, RETURN VALUE OF FLAG
|
||
JRST VALRET
|
||
|
||
AUTOT1: MOVEI A,12 ;USE LF FOR FLAG IF ARG = 1 TO 37
|
||
CAIL B,1
|
||
CAILE B,37
|
||
MOVE A,B ;OTHERWISE USE WHAT HE GAVE
|
||
MOVEM A,AUTOF ;SET NEW VALUE IN FLAG
|
||
JRST RET
|
||
|
||
U AUTOF,1 ;NON-ZERO IMPLIES AUTOTYPE AFTER SEARCHES
|
||
;POSITIVE IMPLIES TYPE AUTOF AS A PTR MARKER
|
||
|
||
|
||
|
||
;
|
||
;EC COMMAND
|
||
|
||
COLOIT: POP P,CH ;[231] CLR RETURN ADDR.
|
||
TRNE FF,ARG ;[231] ARGUMENT?
|
||
JRST COLOI1 ;[231] YES - GO PROCESS IT.
|
||
MOVE A,COLOFL ;[231] NO - RETURN FLAG VALUE
|
||
JRST VALRET ;[231]
|
||
|
||
COLOI1: CAIE B,0 ;[231] ZERO ARGUMENT?
|
||
SETO B, ;[231] NO - MAKE ALL ONES
|
||
MOVEM B,COLOFL ;[231] SAVE ARGUMENT
|
||
JRST RET ;[231]
|
||
|
||
U COLOFL,1 ;[231] NON-ZERO IMPLIES NO AUTO-COLON
|
||
;[231] ZERO IMPLIES AUTO-COLON.
|
||
|
||
;^V COMMAND
|
||
|
||
LOWCAS: TRNE FF,ARG ;ARG SEEN?
|
||
JUMPE B,CLRCAS ;YES, IF 0 CLEAR ALL PREVAILING CASE FLAGS
|
||
TRZ F2,UCASE ;CLEAR ^W FLAG
|
||
TRO F2,LCASE ;& SET ^V FLAG
|
||
JRST RET
|
||
|
||
;^W COMMAND
|
||
|
||
STDCAS: TRNE FF,ARG ;ARG SEEN?
|
||
JUMPE B,CLRCAS ;YES, IF 0 CLEAR ALL PREVAILING CASE FLAGS
|
||
TRZ F2,LCASE ;CLEAR ^V FLAG
|
||
TROA F2,UCASE ;& SET ^W FLAG
|
||
|
||
CLRCAS: TRZ F2,LCASE+UCASE ;0^V OR 0^W CLEARS BOTH FLAGS
|
||
JRST RET
|
||
|
||
;^X COMMAND
|
||
|
||
SETMCH: TRNE FF,ARG ;ANY ARGUMENT?
|
||
JRST SETMC1 ;YES
|
||
TLNE FF,PMATCH ;NO, FORCED EXACT MATCH FLAG ON?
|
||
JRST FFOK ;YES, RETURN -1
|
||
JRST BEGIN ;NO, RETURN 0
|
||
|
||
SETMC1: TLZ FF,PMATCH ;CLR ^X FLAG
|
||
JUMPE B,RET ;IF ARG = 0, FLAG = 0
|
||
TLO FF,PMATCH ;OTHERWISE, SET FLAG
|
||
JRST RET
|
||
|
||
;EH COMMAND -- CHANGE ERROR MESSAGE DEFAULT
|
||
|
||
ERRSET: POP P,CH ;[144] ADJUST STACK POINTER.
|
||
TRNE FF,ARG ;ARG SEEN?
|
||
JRST ERRSE1 ;YES, RESET INDICATOR
|
||
MOVE A,ERRLEN ;NO, RETURN CURRENT VALUE OF FLAG
|
||
ADDI A,2 ;CONVERT TO EXTERNAL VALUE
|
||
JRST VALRET
|
||
|
||
ERRSE1: JUMPG B,.+2 ;TRANSLATE AS FOLLOWS:
|
||
MOVEI B,ERRMSG ;-N,0 IS SET TO STANDARD (ERRMSG)
|
||
SUBI B,2 ;1 BECOMES -1 = SHORT MESSAGE
|
||
MOVEM B,ERRLEN ;2 BECOMES 0 = MEDIUM
|
||
JRST RET ;3 BECOMES +1 = LONG
|
||
;ER PREPARE TO READ FILE
|
||
|
||
OPNRD: TLZ FF,FINF+UREAD ;NOT EOF & CLOSE PREVIOUS INPUT
|
||
RELEAS INCHN,0 ;[175] RELEASE INPUT BEVICE
|
||
SETZM SWITC ;[175] NO FILE SWITCHES TYPED YET
|
||
PUSHJ P,FILSPC ;GET FILE SPEC
|
||
PUSHJ P,RDFIL ;[175] LOOKUP FILE, IF POSSIBLE
|
||
PUSHJ P,TYPFFI ;[175] FOUND ON LIBRARY
|
||
MOVE E,SWITC ;[175] PICKUP USER'S SWITCHES
|
||
TLC E,GENLSN!SUPLSN ;[175] SEE IF BOTH ARE SET
|
||
TLCN E,GENLSN!SUPLSN ;[175] ARE THEY?
|
||
ERROR E.COS;; ;[175] YES, CONTRADICTORY SWITCHES
|
||
MOVEM E,INSWIT ;STORE SETTING FOR INPUT
|
||
TRZ FF,SEQF ;CLR SEQUENCE NUMBER FLAG
|
||
TLZE FF,CCLFLG ;[175] YANK REQUESTED?
|
||
PUSHJ P,YANK ;[175] YES, DO IT
|
||
POPJ P,
|
||
|
||
U INDEV,1
|
||
U INBUF,1
|
||
U INCHR,1
|
||
U INPTH,2
|
||
U INPPN,1
|
||
U INSFD,6
|
||
U INNAM,1
|
||
U INEXT,1
|
||
;SUBROUTINE TO OPEN THE INPUT DEVICE, SET UP BUFFERS, AND LOOKUP
|
||
;THE INPUT FILE. DOES NOT RETURN IF AN OPEN OR LOOKUP FAILURE OCCURS.
|
||
;NON-SKIP RETURN IF FILE FOUND IN LIB:, SKIP IF FILE IS OK.
|
||
|
||
RDFIL: SETZM OPNSTS ;[175] ASCII MODE
|
||
MOVEI E,IBUF
|
||
MOVEM E,OPNBUF ;[175]
|
||
MOVE E,OPNDEV ;[175] PICKUP INPUT DEVICE
|
||
MOVEM E,INDEV ;[175] SAVE FOR ERRORS
|
||
MOVE E,OPNCHR ;[175] DEVCHR WORD, TOO
|
||
MOVEM E,INCHR ;[175] ERROR PROCESSOR NEEDS IT
|
||
OPEN INCHN,OPNBLK ;[175] OPEN INPUT FILE
|
||
ERROR E.IDV
|
||
MOVEI T,IBUF1 ;[175] GET INPUT BUFFERS
|
||
EXCH T,.JBFF ;[175]
|
||
INBUF INCHN,2 ;[175]
|
||
MOVEM T,.JBFF ;[175]
|
||
MOVE A,[XNAM,,INNAM] ;[175] COPY INPUT FILE NAME
|
||
BLT A,INEXT ;[175] FOR ERROR MESSAGES
|
||
TXNN E,DV.DIR ;[175] LOOKUP UUO NEEDED?
|
||
JRST RDFIL2 ;[175] NO, DON'T DO ONE
|
||
TLNE E,DVDTA ;[136] IS IT DECTAPE?
|
||
JRST RDFIL1 ;[136] YES, DO SHORT LOOKUP
|
||
LOOKUP INCHN,XFILNM ;EXTENDED LOOKUP
|
||
JRST LKUPER ;ERROR
|
||
TLO FF,UREAD ;[175] INPUT FILE NOW OPEN
|
||
MOVEI E,INCHN ;[175] INPUT CHANNEL
|
||
MOVEM E,PTHBLK ;[175] PUT INTO PATH BLOCK
|
||
MOVE E,[PTHLEN,,PTHBLK] ;[175] DO PATH UUO
|
||
PATH. E, ;[175] TO DETERMINE WHERE FILE WAS FOUND
|
||
JRST CPOPJ1 ;[175] PROBABLY A TTY: OR TSK:
|
||
MOVE E,[PTHPPN,,INPPN] ;[175] COPY PATH TO FILE
|
||
BLT E,INSFD+5 ;[175] FOR ERROR MESSAGE PROCESSOR
|
||
PUSHJ P,CHKPTH ;[175] WAS IT FOUND WHERE SAID IT WAS?
|
||
POPJ P, ;[175] NO, NON-SKIP RETURN
|
||
JRST CPOPJ1 ;[175] YES, ALL IS WELL
|
||
RDFIL1: LOOKUP INCHN,SFILNM ;[175] SHORT LOOKUP
|
||
JRST LKUPER ;LOOKUP FAILURE
|
||
RDFIL2: TLO FF,UREAD ;[175] INPUT FILE NOW OPEN
|
||
AOS (P) ;[175] DECTAPES DON'T HAVE LIB'S
|
||
POPJ P, ;[175] RETURN
|
||
EBAKUP: TLNE FF,UBAK ;[175] IS EB ALREADY IN PROGRESS?
|
||
ERROR E.EBO;; ;[175] YES, NEW ONE ILLEGAL TILL EF
|
||
TLZ FF,UBAK!UREAD!FINF ;[175] INPUT FILE CLOSED
|
||
RELEAS INCHN, ;[175] (AS SOON AS WE CLOSE IT)
|
||
PUSHJ P,CLOSEF ;[175] CLOSE OUTPUT FILE IF ANY
|
||
SETZM SWITC ;[175] NO I/O SWITCHES TYPED YET
|
||
PUSHJ P,FILSPC ;[175] PARSE USER'S FILE SPEC
|
||
MOVE E,SWITC ;[175] GET SWITCHES USER TYPED
|
||
TLC E,GENLSN!SUPLSN ;[175] CHECK FOR CONFLICTING SWITCHES
|
||
TLCN E,GENLSN!SUPLSN ;[175] DID HE GIVE BOTH?
|
||
ERROR E.COS;; ;[175] YES, ERROR
|
||
MOVEM E,INSWIT ;[175] NO, STORE BOTH AS INPUT...
|
||
MOVEM E,OUTSWT ;[175] AND AS OUTPUT SWITCHES
|
||
;EBAKUP +14 1/2 [203]
|
||
|
||
MOVE E,[<"00000">B34+1] ;[203] SETUP INITIAL LSN
|
||
MOVEM E,LSNCTR ;[203] FOR OUTPUT FILE
|
||
SKIPE E,OPNCHR ;[175] GET CHARACTERISTICS OF HIS DEVICE
|
||
TXNE E,DV.DSK!DV.DTA ;[175] IF DEVICE EXISTS BUT ISN'T RIGHT
|
||
CAIA ;[175] DOESN'T EXIST (GET BETTER MESSAGE
|
||
;[175] WHEN OPEN FAILS) OR IS OK
|
||
ERROR E.EBD;; ;[175] ILLEGAL EB DEVICE
|
||
HLRZ A,XEXT ;[175] GET PROPOSED EXTENSION
|
||
TLC E,-1-<(DV.TTA)> ;[175] CONTRARY TO POPULAR BELIEF,
|
||
TLCE E,-1-<(DV.TTA)> ;[175] NUL: DOESN'T PROHIBIT UFD/SFD!
|
||
TXNN E,DV.DSK ;[175] IS EB DEVICE A DISK?
|
||
JRST EBAKU0 ;[175] NO, DIRECTORY NAMES LEGAL
|
||
CAIE A,'SFD' ;[175] CAN'T DO EB TO DIRECTORIES,
|
||
CAIN A,'UFD' ;[175] SINCE RENAMES WOULD FAIL AT EF
|
||
ERROR E.EBF;; ;[175] ILLEGAL EB FILE
|
||
EBAKU0: CAIN A,'BAK' ;[175] IS IT BAK?
|
||
ERROR E.EBF;; ;[175] CAN'T DO EB TO BAK FILES
|
||
CAIE A,'TMP' ;[175] USER'S EXTENSION .TMP?
|
||
JRST EBAKU1 ;[175] NO, FILENAME IS OK TO USE
|
||
MOVE A,XNAM ;[175] CAN'T ALLOW NNNTEC.TMP,
|
||
CAMN A,TMPTEC ;[175] SINCE THAT'S OUR TEMP OUTPUT FILE
|
||
ERROR E.EBF;; ;[175] IT WAS NNNTEC.TMP, ILLEGAL FILE
|
||
EBAKU1: PUSHJ P,RDFIL ;[175] OPEN DEVICE & LOOKUP FILE
|
||
JRST FAKERW ;[175] ON LIB:, CAN'T DO EB, DO ER/EW
|
||
SETZM PTHBLK ;[175] CLEAR RETURNED JUNK
|
||
SETZM PTHFLG ;[175] IN CASE MONITOR LOOKS AT IT
|
||
MOVE E,OPNCHR ;[175] GET DEVCHR OF EB DEVICE
|
||
MOVEM E,EBCHR ;[175] STORE FOR BAKCLS
|
||
SETZM OPNSTS ;[175] ASCII MODE FOR OPNOU
|
||
MOVE E,[XNAM,,EBNAM] ;[175] SAVE EB FILE & EXT FOR BAKCLS
|
||
BLT E,EBEXT ;[175] ..
|
||
MOVE E,[PTHPPN,,EBPPN] ;[175] SAVE EB PATH TOO
|
||
BLT E,EBSFD+4 ;[175] ..
|
||
MOVE E,OPNCHR ;[175] GET EB DEVICE
|
||
TXNN E,DV.DSK ;[175] IS IT A DSK: ?
|
||
JRST EBAKU4 ;[175] NO, DON'T BOTHER WITH PROTECTIONS
|
||
|
||
;FALL THROUGH TO NEXT PAGE
|
||
;HERE IF EB TO A DISK. CHECK THAT THE INPUT FILE ISN'T TOO PROTECTED TO
|
||
;ALLOW ALL THE RENAMES TO HAPPEN AT END OF EDITING. NOTE THAT OTHER
|
||
;PROTECTION FAILURES CAN OCCUR (.BAK FILE PROTECTED ETC.), BUT WE ARE
|
||
;ONLY CHECKING THIS CASE BECAUSE IT IS BY FAR THE MOST COMMON ERROR.
|
||
;WE WILL ALLOW AN EB IF 1) WE ARE THE OWNER OF THE FILE (HAVE CHANGE
|
||
;PROTECTION RIGHTS) AND CAN WRITE THE FILE (PROTECTION 0,1, OR 2 IN
|
||
;5.07) (NOTE THAT WE COULD ALWAYS EDIT A <777> FILE IN THE USER'S AREA
|
||
;WITH ENOUGH RENAMES TO CHANGE THE PROTECTION, BUT WE WILL ARBITRARILY
|
||
;DISALLOW EDITING IF THE USER CAN'T EVEN WRITE THE FILE WITHOUT CHANGING
|
||
;ITS PROTECTION) OR 2) WE HAVE RENAME ACCESS TO THE FILE (PROTECTED 0
|
||
;OR 1 IN 5.07).
|
||
|
||
LDB A,[POINT 9,XPRV,8] ;[175] PICKUP FILE PROTECTION
|
||
MOVEM A,EBPROT ;[175] SAVE FOR BAKCLS
|
||
HRLI A,.ACREN ;[175] CHECK NEEDED RENAME ACCESS
|
||
MOVE AA,PTHPPN ;[175] FILE'S PPN IN LOC + 1
|
||
MOVE B,USRPPN ;[175] USER'S IN LOC + 2
|
||
MOVEI E,A ;[175] POINT TO 3 CONTIGUOUS ACS
|
||
CHKACC E, ;[175] SEE IF WE CAN RENAME IT
|
||
SETZ E, ;[175] DON'T KNOW, ASSUME OK
|
||
JUMPE E,EBAKU3 ;[175] IF CHKACC WON, GO EDIT FILE
|
||
|
||
;HERE IF WE CAN'T RENAME THE FILE. CAN STILL EDIT IT IF WE CAN BOTH
|
||
;CHANGE THE PROTECTION & WRITE THE FILE. OTHERWISE, GIVE AN ERROR.
|
||
HRROS EBPROT ;[175] SET LH=-1 AS FLAG FOR BAKCLS
|
||
;[175] THAT 2 RENAMES WILL BE NEEDED
|
||
HRLI A,.ACCPR ;[175] CHECK .ACCPR TO SEE IF WE OWN IT
|
||
MOVEI E,A ;[175] POINT TO THE ARG BLOCK
|
||
CHKACC E, ;[175] CHECK IF WE CAN CHANGE PROTECTION
|
||
SETZ E, ;[175] PATH UUO BUT NO CHKACC?
|
||
JUMPE E,EBAKU2 ;[175] OK, NOW CHECK WRITE ACCESS
|
||
ERROR E.EBP;; ;[175] EB FILE IS TOO PROTECTED
|
||
|
||
EBAKU2: HRLI A,.ACWRI ;[175] WE OWN IT, BUT CAN WE WRITE IT?
|
||
MOVEI E,A ;[175] (MIGHT BE <555>)
|
||
CHKACC E, ;[175] ASK FILSER
|
||
SETZ E, ;[175] NEVER BOMB USER HERE
|
||
JUMPE E,EBAKU3 ;[175] OK, GO EDIT IT
|
||
ERROR E.EBP;; ;[175] PROTECTED FILE
|
||
|
||
;HERE IF OK TO EDIT A DISK FILE. SETUP THE PROPER STRUCTURE FROM
|
||
;THE INPUT CHANNEL SO THAT THE NEW FILE WILL BE ON THE SAME STR.
|
||
EBAKU3: MOVE E,XDEV ;[175] GET REAL INPUT FILE UNIT
|
||
MOVEM E,DCBLK ;[175] STORE FOR DSKCHR
|
||
MOVE E,[DCLEN,,DCBLK] ;[175] DO DSKCHR TO GET STR
|
||
DSKCHR E, ;[175] THAT FILE WAS FOUND ON
|
||
JRST EBAKU4 ;[175] FAILED, USE WHAT WE HAVE
|
||
MOVE E,DCSNM ;[175] OK, PICKUP STR NAME
|
||
MOVEM E,OPNDEV ;[175] STORE IN NEW OPEN BLOCK
|
||
MOVX E,UU.PHS ;[175] USE PHYSICAL ONLY OPEN
|
||
MOVEM E,OPNSTS ;[175] SINCE WE HAVE PHYSICAL STR NAME
|
||
|
||
|
||
;FALL THROUGH TO NEXT PAGE
|
||
;ENTER HERE IF GOING TO A DECTAPE.
|
||
EBAKU4: MOVE E,[OPNBLK,,EBSTS] ;[175] SAVE STS & DEV FOR BAKCLS
|
||
BLT E,EBDEV ;[175] ..
|
||
PUSHJ P,OPNOU ;[175] OPEN EB DEVICE
|
||
MOVE E,[-XFILEN+1,,XFILNM] ;[175] PDL TO LOOKUP BLOCK
|
||
PUSHJ P,STOMP ;[214] PUT THE RIGHT THING IN .RBPPN
|
||
PUSH E,TMPTEC ;[175] FILE NAME IS NNNTEC
|
||
PUSH E,['TMP '] ;[175] EXTENSION IS TMP (WIPE DATES)
|
||
MOVX E,<777>B8 ;[175] CLEAR ALL DATES FOR ENTER
|
||
ANDM E,XPRV ;[175] BUT KEEP ORIGINAL PROTECTION
|
||
MOVX E,<100>B8 ;[175] GET LOWEST NON-ZERO PROTECTION
|
||
SKIPN XPRV ;[175] IF EDITING A <000> FILE,
|
||
MOVEM E,XPRV ;[175] DO ENTER WITH <100> SO WON'T
|
||
;[175] GET SYSTEM DEFAULT PROTECTION
|
||
SETZM XVER ;[175] EDITING CHANGES FILE VERSIONS!
|
||
MOVE E,XSIZ ;[175] NOW SETUP OUTPUT ESTIMATE
|
||
ADDI E,777 ;[175] ROUND UP INPUT + 2 RIBS + 1
|
||
LSH E,-7 ;[175] CONVERT TO BLOCKS
|
||
MOVEM E,XEST ;[175] STORE FOR OUTPUT ENTER
|
||
SETZM XALC ;[175] NO NEED FOR CONTIGUITY
|
||
SETZM XPOS ;[175] CERTAINLY NO SPECIFIC PLACE!
|
||
PUSHJ P,WTFIL ;[175] DO ENTER ON .TMP FILE
|
||
TLO FF,UWRITE+UBAK ;[175] IT ALL WORKED! TURN ON FLAGS
|
||
EBAKU5: TLZE FF,CCLFLG ;[175] CALLED FROM TECO COMMAND?
|
||
PUSHJ P,YANK ;[175] YES, DO A Y
|
||
POPJ P, ;[175] DONE
|
||
|
||
|
||
;HERE IF THE EB FILE WAS FOUND ON SOME LIBRARY AREA. TURN THE EB
|
||
;INTO AN ER/EW, SO THAT THE FILE ON THE LIBRARY WON'T BE MODIFIED.
|
||
|
||
FAKERW: PUSHJ P,TYPFFI ;[175] TELL WHAT WE'RE DOING
|
||
PUSHJ P,FILALT ;[175] PUT OUTPUT FILE EXACTLY WHERE
|
||
SETZM OPNSTS ;[175] THE USER SPECIFIED. ITS KNOWN
|
||
PUSHJ P,OPNOU ;[175] NOT TO EXIST, SINCE A LOOKUP
|
||
PUSHJ P,WTFIL ;[175] FOUND IT ONLY ON LIB
|
||
TLO FF,UWRITE ;[175] EW SUCCESSFULLY INITIATED
|
||
PJRST EBAKU5 ;[175] DO A Y IF FROM A TECO COMMAND
|
||
|
||
|
||
U TMPTEC,1 ;SAVE FOR ###TEC. FILE NAME
|
||
U FDAEM,1 ;[175] NON-ZERO MEANS FTFDAE ON IN MON.
|
||
U EBSTS,1 ;[175] SAVED MODE FOR EB DEVICE
|
||
EBOPN==EBSTS ;[175] ALTERNATE NAME
|
||
U EBDEV,1 ;[175] DEVICE FOR EB
|
||
U EBBUF,1 ;[175] BUFFER ADDR (NOT USED)
|
||
U EBCHR,1 ;[175] EB DEVICE DEVCHR
|
||
U EBPTH,2 ;[175] PATH BLOCK HEADER (NOT USED)
|
||
U EBPPN,1 ;[175] PPN THAT EB FILE CAME FROM
|
||
U EBSFD,5 ;[175] SFD'S IN EB FILE'S PATH
|
||
U EBNAM,1 ;[175] EB FILE NAME
|
||
U EBEXT,1 ;[175] EB EXTENSION
|
||
U EBPROT,1 ;[175] LH=-1 IF EDITING OWNER'S <2XX>
|
||
;[175] FILE, RH=ORIGINAL FILE'S PROT
|
||
;INPUT FILE LOOKUP ERROR
|
||
|
||
LKUPER: RELEAS INCHN,0
|
||
TLZ FF,UREAD+FINF ;[175] LET GO OF INPUT DEVICE
|
||
EE1+ERROR E.FNF
|
||
|
||
;TYPE OUTPUT ERROR
|
||
|
||
ENTERR: RELEAS OUTCHN,0
|
||
TLZ FF,UWRITE+UBAK ;LET GO OF OUTPUT DEVICE & EB FLAG
|
||
LDB E,[POINT 15,XEXT,35] ;[175] ERROR CODE
|
||
CAIE E,ERPRT% ;[175] MAYBE DTA FULL?
|
||
JRST ENTER2 ;[175] NO
|
||
MOVE A,OUCHR ;[175] YES
|
||
TXNE A,DV.DTA ;[175] IF DTA ITS FULL, ELSE ENTER ERROR
|
||
ERROR E.FUL
|
||
ENTER2: EE1+ERROR E.ENT
|
||
;EZ SELECTS THE OUTPUT DEVICE, ISSUES A REWIND COMMAND TO IT,
|
||
; ISSUES A COMMAND TO ZERO ITS DIRECTORY, AND OPENS THE FILE
|
||
; SPECIFIED (IF ANY).
|
||
|
||
;EW SELECTS THE OUTPUT DEVICE AND OPENS THE FILE SPECIFIED (IF ANY)
|
||
|
||
ZERDIR: TLOA FF,EZTMP ;[175] FLAG EZ COMMAND, NOT EW
|
||
OPNWR: TLZ FF,EZTMP ;[175] THIS IS A REAL EW COMMAND
|
||
TLNE FF,UBAK ;[175] EB IN PROGRESS?
|
||
ERROR E.EBO;; ;[175] YES, EW IS A NO-NO
|
||
PUSHJ P,CLOSEF ;[175] GIVE HIM A FREE EF ON OLD FILE
|
||
SETZM SWITC ;[175] NO I/O SWITCHES TYPED YET
|
||
PUSHJ P,FILSPC ;[175] PARSE NEW FILE SPEC, SET UP X???
|
||
MOVE E,SWITC ;[175] GET SWITCHES HE TYPED
|
||
TLC E,GENLSN+SUPLSN ;[175] CHECK FOR BOTH BEING ON
|
||
TLCN E,GENLSN+SUPLSN ;[175] WITH TRIED & TRUE TLC, TLCN TRICK
|
||
ERROR E.COS;; ;[175] CONFLICTING OUTPUT SWITCHES
|
||
MOVEM E,OUTSWT ;[175] OK, STORE WHAT HE TYPED
|
||
MOVE E,[<"00000">B34+1] ;[175] SETUP INITIAL LSN
|
||
MOVEM E,LSNCTR ;[175] FOR OUTPUT FILE
|
||
SETZM OPNSTS ;[175] ASCII MODE
|
||
PUSHJ P,OPNOU ;[175] OPEN OUTPUT DEVICE, SETUP BUFFERS
|
||
TLZN FF,EZTMP ;[175] WAS THIS AN EZ COMMAND?
|
||
JRST OPNWR0 ;[175] NO, CONTINUE
|
||
UTPCLR OUTCHN, ;[175] YES, ZERO DIRECTORY
|
||
MTREW. OUTCHN, ;[175] AND REWIND THE "DECTAPE"
|
||
MTWAT. OUTCHN, ;[175] WAIT FOR IT IN CASE MTA
|
||
OPNWR0: MOVEI E,OUTCHN ;[230] LOAD E WITH THE OUTPUT CHANNEL
|
||
DEVNAM E, ;[230] FIND OUT THE "REAL" DEVICE NAME
|
||
JFCL ;[230] WELL, WE LOSE.
|
||
CAME E,[SIXBIT/NUL/] ;[230] IS IT NUL:?
|
||
JRST OPNWRA ;[230] NO - CONTINUE.
|
||
JSP A,CONMES ;[230] YES - MAKE SURE USER KNOWS.
|
||
ASCIZ \%Output is to NUL:
|
||
\
|
||
OPNWRA: MOVE E,OPNCHR ;[175] DEVCHR OF DEVICE WE JUST OPENED
|
||
TXNN E,DV.DIR ;[175] A DIRECTORY DEVICE?
|
||
JRST OPNWR3 ;[175] NO, CAN'T SUPERSEDE EXISTING FILE
|
||
TLC E,-1-<(DV.TTA)> ;[175] CAN NEVER SUPERCEDE
|
||
TLCN E,-1-<(DV.TTA)> ;[175] ON DEVICE NUL:
|
||
JRST OPNWR3 ;[175] YUP, IT'S NUL:. DON'T CHECK.
|
||
TXNE E,DV.DTA ;[175] IF A DECTAPE..
|
||
JRST OPNWR1 ;[175] MUST GO DO SHORT LOOKUP
|
||
LOOKUP OUTCHN,XFILNM ;[175] SEE IF HE'S GOING TO SUPERSEDE
|
||
JRST OPNWR3 ;[175] NOT A CHANCE
|
||
MOVEI E,OUTCHN ;[175] MAYBE, SEE IF THE FILE
|
||
MOVEM E,PTHBLK ;[175] IS REALLY WHERE HE SAID IT WAS
|
||
MOVE E,[PTHLEN,,PTHBLK] ;[175] OR ON SOME LIB
|
||
PATH. E, ;[175] BY DOING A PATH UUO & COMPARING
|
||
JRST OPNWR3 ;[175] ?? OH WELL, MESSAGE NOT CRITICAL
|
||
PUSHJ P,CHKPTH ;[175] COMPARE FOUND WITH SOUGHT
|
||
JRST OPNWR3 ;[175] FOUND IN A LIB, IGNORE IT
|
||
JRST OPNWR2 ;[175] WILL SUPERSEDE, WARN USER
|
||
;HERE IF WRITING TO A DECTAPE
|
||
OPNWR1: LOOKUP OUTCHN,SFILNM ;[175] DO SHORT LOOKUP
|
||
JRST OPNWR3 ;[175] NOT THERE
|
||
OPNWR2: JSP A,CONMES ;[175] TYPE FATEFUL MESSAGE
|
||
ASCIZ \%Superseding existing file
|
||
\
|
||
OPNWR3: CLOSE OUTCHN, ;[175] WE DON'T WANT UPDATE MODE (!!)
|
||
PUSHJ P,FILALT ;[175] RE-SET UP THE ENTER BLOCK
|
||
PUSHJ P,WTFIL ;[175] DO ENTER ON OUTPUT FILE
|
||
TLO FF,UWRITE ;[175] OUTPUT FILE NOW OPEN
|
||
POPJ P, ;[175] DONE
|
||
;SUBROUTINE TO OPEN THE OUTPUT DEVICE AND SETUP THE OUTPUT BUFFERS
|
||
;USES E,T
|
||
|
||
OPNOU: MOVSI E,OBF ;[175] SETUP ADDR OF OUTPUT HEADER
|
||
MOVEM E,OPNBUF ;[175] IN OPEN BLOCK
|
||
OPEN OUTCHN,OPNBLK ;[175] FIND THE DEVICE
|
||
ERROR E.ODV;; ;[175] NONE SUCH OR IN USE
|
||
MOVE E,OPNDEV ;[175] GET DEVICE WE JUST OPENED
|
||
MOVEM E,OUDEV ;[175] SAVE FOR ERRORS
|
||
MOVE E,OPNCHR ;[175] NEED DEVCHR, TOO
|
||
MOVEM E,OUCHR ;[175] (SEE ENTERR)
|
||
MOVEI T,OBUF1 ;[175] NOW SET UP BUFFERS
|
||
EXCH T,.JBFF ;[175] TWO OF THEM,
|
||
OUTBUF OUTCHN,2 ;[175] IN OUR SPECIFIED PLACE
|
||
MOVEM T,.JBFF ;[175] THEN RESTORE REAL .JBFF
|
||
POPJ P, ;[175] DONE
|
||
|
||
|
||
;SUBROUTINE TO ENTER OUTPUT FILE. DOES SHORT ENTER IF DTA. USES E.
|
||
|
||
WTFIL: MOVE E,[XNAM,,OUNAM] ;[175] SAVE FILENAME & EXTENSION
|
||
BLT E,OUEXT ;[175] FOR PRETTY ERROR MESSAGES
|
||
MOVE E,OPNCHR ;[175] SHORT ENTER IF DTA
|
||
TXNE E,DV.DTA ;[175] IS IT?
|
||
JRST WTFIL1 ;[175] YES
|
||
ENTER OUTCHN,XFILNM ;[175] NO, DO EXTENDED ENTER
|
||
JRST ENTERR ;[175] WARN OF FAILURE
|
||
MOVEI E,OUTCHN ;[175] DETERMINE PATH TO FILE CREATED
|
||
MOVEM E,PTHBLK ;[175] BY DOING PATH UUO ON CHANNEL
|
||
MOVE E,[10,,PTHBLK] ;[175] POINT TO PATH BLOCK
|
||
PATH. E, ;[175] READ THE PATH TO THE FILE
|
||
POPJ P, ;[175] NOT A DIRECTORY DEVICE
|
||
MOVE E,[PTHPPN,,OUPPN] ;[175] NOW SAVE PATH AWAY
|
||
BLT E,OUPPN+5 ;[175] IN CASE OF OUTPUT ERRORS
|
||
POPJ P, ;[175] SUCCESS
|
||
;HERE IF DTA
|
||
WTFIL1: ENTER OUTCHN,SFILNM ;[175] SHORT ENTER FOR DTA
|
||
JRST ENTERR ;[175] FULL?
|
||
POPJ P, ;[175] OK, RETURN
|
||
|
||
|
||
|
||
U OUDEV,1
|
||
U OUBUF,1
|
||
U OUCHR,1
|
||
U OUPTH,2
|
||
U OUPPN,1
|
||
U OUSFD,6
|
||
U OUNAM,1
|
||
U OUEXT,1
|
||
;EF FINISHES OUTPUT ON THE CURRENT OUTPUT FILE WITHOUT
|
||
; SELECTING A NEW OUTPUT FILE.
|
||
|
||
CLOSEF: TLNN FF,UWRITE ;[155]
|
||
POPJ P,
|
||
CLOSE OUTCHN, ;[175] CLOSE OUTPUT COMPLETELY
|
||
STATZ OUTCHN,740000
|
||
JRST OUTERR
|
||
TLZ FF,UWRITE ;[175] CLEAR NOW IN CASE ERROR IN BAKCLS
|
||
TLNE FF,UBAK ;[155] EB IN PROGRESS?
|
||
PUSHJ P,BAKCLS ;[175] YES
|
||
RELEAS OUTCHN,0
|
||
TLZ FF,UBAK ;[175] CLEAR WRITE AND EB FLAGS
|
||
POPJ P,
|
||
|
||
|
||
|
||
;EM EXECUTE MTAPE UUO.
|
||
|
||
EMTAPE: TLNN FF,UREAD
|
||
ERROR E.EMD
|
||
PUSHJ P,CHK2
|
||
CAIGE B,1
|
||
ERROR E.EMA
|
||
WAIT INCHN, ;[175] WAIT FOR BUFFERS TO FILL
|
||
MTAPE INCHN,0(B)
|
||
HRRZ A,IBUF ;[175] GET ADDR OF FIRST BUFFER
|
||
MOVE E,A ;[175] COPY TO TEMP AC
|
||
MOVX T,BF.IOU ;[175] GET "BUFFER IN USE" BIT
|
||
EMTAP1: ANDCAM T,0(E) ;[175] CLEAR IT IN CURRENT BUFFER
|
||
HRRZ E,0(E) ;[175] PICKUP ADDRESS OF NEXT
|
||
CAME E,A ;[175] DONE WITH ALL BUFFERS IN RING?
|
||
JRST EMTAP1 ;[175] NO, LOOP
|
||
SETOM IBUF+2 ;[175] INSURE NEXT IN GETS NEW RECORD
|
||
MTWAT. INCHN, ;[175] MAKE SURE SPACING COMPLETES
|
||
POPJ P, ;[175] END OF COMMAND
|
||
;THIS ROUTINE IS CALLED AT EF IF AN EB WAS DONE. IT DOES
|
||
;THE WORK OF MAKING THE INPUT FILE HAVE THE EXTENSION .BAK ,
|
||
;DELETING ANY PREVIOUS FILE.BAK, AND RENAMING THE NEW OUTPUT
|
||
;FILE AS THE ORIGINAL FILE.EXT
|
||
|
||
BAKCLS: TLZ FF,UREAD+FINF ;[175] AN EB EF WIPES INPUT CHANNEL, TOO
|
||
RELEAS INCHN, ;[175] GET RID OF OLD DEVICE
|
||
MOVE E,[EBOPN,,OPNBLK] ;[175] RETRIEVE EB DEVICE
|
||
BLT E,OPNDEV ;[175] FROM EB SAVE AREA
|
||
SETZM OPNBUF ;[175] NO BUFFERS NEEDED FOR RENAMES
|
||
OPEN INCHN,OPNBLK ;[175] RE-GRAB DEVICE
|
||
ERROR E.IRN;; ;[175] IT WENT AWAY??
|
||
SETZM XFILNM ;[175] SETUP LOOKUP BLOCK
|
||
MOVE E,[XFILNM,,XFILNM+1] ;[175] TO DELETE OLD BAK FILE
|
||
BLT E,XFILNM+XFILEN-1 ;[175] FIRST, BLT TO ZERO
|
||
MOVE E,[-XFILEN,,XFILNM-1] ;[175] SET UP PDL TO XFILNM
|
||
PUSH E,[XFILEN-1] ;[175] SETUP LENGTH OF BLOCK
|
||
PUSHJ P,STOMP ;[214] PUT THE RIGHT THING IN .RBPPN
|
||
PUSH E,EBNAM ;[175] SET .RBNAM TO ORIG FILE NAME
|
||
PUSH E,['BAK '] ;[175] EXTENSION IS BAK
|
||
MOVE E,EBCHR ;[175] GET EB DEV CHARACTERISTICS
|
||
TXNE E,DV.DTA ;[175] IS IT A DECTAPE?
|
||
JRST BKCLS2 ;[175] YES, GO DO DTA'ISH THINGS
|
||
SETZM PTHBLK ;[175] NO, CLEAR OUT PATH BLOCK
|
||
SETZM PTHFLG ;[175] SINCE MONITOR LOOKS AT FLAGS
|
||
MOVE E,[EBPPN,,PTHPPN] ;[175] RESTORE PATH FROM EB SAVE
|
||
BLT E,PTHBLK+PTHLEN-2 ;[175] EBPPN IS ONLY 5 WORDS
|
||
SETZM PTHBLK+PTHLEN-1 ;[175] PTHBLK HAS XTRA 0 ON END
|
||
HRRZ B,EBPROT ;[175] SETUP AC B TO BE PROTECTION THAT
|
||
ANDCMI B,300 ;[175] WE WILL GIVE .BAK FILE IF NONE
|
||
SKIPN FDAEM ;[175] NOW EXISTS
|
||
ANDCMI B,400 ;[175] (I.E <0XX> OR <4XX> IF FDAEM)
|
||
LOOKUP INCHN,XFILNM ;[175] FIND OLD .BAK FILE
|
||
JRST BKCLS3 ;[175] NONE THERE, GO MAKE ONE
|
||
LDB B,[POINT 9,XPRV,8] ;[175] MAKE NEW .BAK HAVE SAME
|
||
;[175] PROTECTION AS OLD ONE DID
|
||
SETZM XNAM ;[175] DELETE OLD .BAK FILE
|
||
RENAME INCHN,XFILNM ;[175] BY RENAMING TO 0 . . .
|
||
EE1+ERROR E.BAK;; ;[175] TOO PROTECTED TO GET RID OF
|
||
JRST BKCLS3 ;[175] OK, GO RENAME SOURCE TO BAK
|
||
|
||
;HERE IF OLD BAK FILE SOUGHT ON A DECTAPE. USE SHORT LOOKUP/RENAME
|
||
BKCLS2: LOOKUP INCHN,SFILNM ;[175] LOOK FOR THE FILE
|
||
JRST BKCLS3 ;[175] NONE, DON'T SWEAT IT
|
||
SETZM XNAM ;[175] DELETE BY RENAMING TO ZERO
|
||
RENAME INCHN,SFILNM ;[175] ..
|
||
EE1+ERROR E.BAK;; ;[175] HOW CAN IT FAIL ON MY DTA??
|
||
;HERE TO RENAME THE OLD SOURCE FILE TO FILE.BAK
|
||
|
||
BKCLS3: MOVE E,[-XFILEN+1,,XFILNM] ;[200] RESET THINGS TO EB FILE
|
||
PUSHJ P,STOMP ;[214] LAST LOOKUP MIGHT HAVE WIPED PPN
|
||
PUSH E,EBNAM ;[175] WE WIPED XNAM
|
||
PUSH E,EBEXT ;[175] EXTENSION DEFINITELY ISN'T BAK
|
||
MOVE E,EBCHR ;[175] GET ORIGINAL EB DEVICE DEVCHR
|
||
TXNE E,DV.DTA ;[175] DECTAPE?
|
||
JRST BKCLS5 ;[175] YES, DO SHORT LOOKUP/RENAME
|
||
SETZM PTHBLK ;[175] NO, MAKE SURE PTHBLK SETUP RIGHT
|
||
SETZM PTHFLG ;[175] MONITOR RETURNS STUFF ON LOOKUP
|
||
LOOKUP INCHN,XFILNM ;[175] FIND ORIGINAL SOURCE FILE
|
||
EE1+ERROR E.ILR;; ;[175] I'M EXTREMELY OFFENDED
|
||
SKIPL EBPROT ;[175] NEED TO LOWER PROTECTION?
|
||
JRST BKCLS4 ;[175] NO, JUST RENAME IT TO .BAK
|
||
MOVX E,<300>B8 ;[175] CLEAR THESE BITS
|
||
ANDCAM E,XPRV ;[175] TO MAKE PROTECTION REASONABLE
|
||
RENAME INCHN,XFILNM ;[175] DOWN GOES THE PROTECTION
|
||
EE1+ERROR E.IRB;; ;[175] FILE DAEMON WON'T LET US?
|
||
SETZM PTHBLK ;[233] After rename to change prot.,
|
||
SETZM PTHFLG ;[233] non-default path will be lost
|
||
LOOKUP INCHN,XFILNM ;[233] so get it again
|
||
EE1+ERROR E.ILR;; ;[233]
|
||
BKCLS4: MOVE A,XEXT ;[175] SAVE DATES FOR ERROR RECOVERY
|
||
MOVSI E,'BAK' ;[175] NEW FILE NAME IS FILE.BAK
|
||
HLLM E,XEXT ;[175] KEEP SAME DATES ETC.
|
||
DPB B,[POINT 9,XPRV,8] ;[175] STORE BAK FILE PROTECTION
|
||
RENAME INCHN,XFILNM ;[175] MAKE OLD SOURCE INTO BAK
|
||
CAIA ;[175] TRY TO RECOVER
|
||
JRST BKCLS6 ;[175] NOW GO MAKE .TMP FILE NEW SOURCE
|
||
|
||
;HERE IF RENAMING THE OLD SOURCE FILE TO FILE.BAK WITH A LOWER
|
||
;PROTECTION FAILED. IT COULD BE THAT THE FILE IS PROTECTED RENAME
|
||
;BUT NO CHANGE PROTECTION AGAINST US. IF THIS IS THE CASE, WE WILL
|
||
;GO AHEAD AND CHANGE THE EXTENSION TO BAK, BUT LEAVE THE PROTECTION
|
||
;ALONE.
|
||
LDB E,[POINT 15,XEXT,35] ;[175] PICKUP RENAME ERROR CODE
|
||
CAIE E,ERPRT% ;[175] PROTECTION FAILURE?
|
||
EE1+ERROR E.IRB;; ;[175] NO, STOP NOW
|
||
MOVEM A,XEXT ;[175] YES, RESTORE DATES WIPED BY ERROR
|
||
LOOKUP INCHN,XFILNM ;[175] LOOKUP OLD SOURCE AGAIN
|
||
EE1+ERROR E.ILR;; ;[175] GONE??
|
||
MOVSI E,'BAK' ;[175] NEW EXTENSION
|
||
HLLM E,XEXT ;[175] CHANGE ONLY EXTENSION
|
||
RENAME INCHN,XFILNM ;[175] TRY IT AGAIN
|
||
EE1+ERROR E.IRB;; ;[175] SOME OTHER ERROR?
|
||
JRST BKCLS6 ;[175] WON, GO MAKE .TMP NEW SOURCE
|
||
|
||
;HERE TO MAKE FILE.SRC BE FILE.BAK IF ON A DTA
|
||
BKCLS5: LOOKUP INCHN,SFILNM ;[175] FIND OLD SOURCE FILE
|
||
EE1+ERROR E.ILR;; ;[175] HOW CAN THIS BE?
|
||
MOVSI E,'BAK' ;[175] NEW EXTENSION IS .BAK
|
||
HLLM E,XEXT ;[175] KEEP DATES ETC.
|
||
RENAME INCHN,SFILNM ;[175] CHANGE NAME TO FILE.BAK
|
||
EE1+ERROR E.IRB;; ;[175] JUST NOT MY LUCKY DAY
|
||
|
||
|
||
;FALL THROUGH TO NEXT PAGE
|
||
;HERE TO FIND OUTPUT NNNTEC.TMP FILE, AND RENAME IT TO NEW SOURCE FILE.
|
||
BKCLS6: RELEAS INCHN, ;[175] MAKE SURE INPUT DEVICE FINISHED
|
||
SETZM XFILNM ;[175] CAN'T BE TOO CAREFUL
|
||
MOVE E,[XFILNM,,XFILNM+1] ;[175] SO BLT LOOKUP BLOCK TO 0
|
||
BLT E,XFILNM+XFILEN-1 ;[175] ..
|
||
MOVE E,[-XFILEN,,XFILNM-1] ;[175] SETUP PDL TO LOOKUP BLOCK
|
||
PUSH E,[XFILEN-1] ;[175] RESET LENGTH WORD
|
||
PUSHJ P,STOMP ;[214] RESET .RBPPN
|
||
PUSH E,TMPTEC ;[175] SET .RBNAM TO NNNTEC
|
||
PUSH E,['TMP '] ;[175] EXTENSION IS TMP
|
||
MOVE E,EBCHR ;[175] DEVCHR OF EB DEVICE
|
||
TXNE E,DV.DTA ;[175] DECTAPE?
|
||
JRST BKCLS8 ;[175] YES, DO SHORT LOOKUPS
|
||
SETZM PTHBLK ;[175] ZAP BITS MONITOR RETURNS
|
||
SETZM PTHFLG ;[175] ON LOOKUPS OR RENAMES
|
||
LOOKUP OUTCHN,XFILNM ;[175] FIND THE .TMP FILE
|
||
EE1+ERROR E.OLR;; ;[175] WENT AWAY??
|
||
SKIPL EBPROT ;[175] NEED TO LOWER PROTECTION?
|
||
JRST BKCLS7 ;[175] NO, GO CHANGE NAME
|
||
SKIPN FDAEM ;[175] FILE DAEMON MONITOR?
|
||
SKIPA A,[POINT 3,XPRV,2] ;[175] NO, OWNER FIELD 3 BITS
|
||
MOVE A,[POINT 2,XPRV,2] ;[175] YES, ONLY 2 BITS
|
||
SETZ E, ;[175] LOWEST POSSIBLE PROTECTION
|
||
DPB E,A ;[175] STORE IN OWNER FIELD
|
||
RENAME OUTCHN,XFILNM ;[175] LOWER PROTECTION OF FILE
|
||
EE1+ERROR E.RNO;; ;[175] CANT?
|
||
SETZM PTHBLK ;[233] After rename to change prot.,
|
||
SETZM PTHFLG ;[233] non-default path will be lost
|
||
LOOKUP OUTCHN,XFILNM ;[233] so get it again
|
||
EE1+ERROR E.OLR;; ;[233]
|
||
BKCLS7: MOVE E,EBNAM ;[175] GET SOURCE FILE NAME
|
||
MOVEM E,XNAM ;[175] STORE FOR RENAME
|
||
MOVE E,EBEXT ;[175] GET SOURCE EXTENSION
|
||
HLLM E,XEXT ;[175] STORE WITHOUT TOUCHING DATES
|
||
MOVE E,EBPROT ;[175] MAKE PROTECTION SAME AS OLD
|
||
DPB E,[POINT 9,XPRV,8] ;[175] ..
|
||
RENAME OUTCHN,XFILNM ;[175] TURN TMP FILE INTO NEW SOURCE
|
||
EE1+ERROR E.RNO;; ;[175] FILE DAEMON DOESN'T KNOW US
|
||
POPJ P, ;[175] ALL DONE
|
||
|
||
;HERE TO RENAME TMP FILE TO NEW SOURCE FILE ON A DTA
|
||
BKCLS8: LOOKUP OUTCHN,SFILNM ;[175] DO SHORT LOOKUP TO FIND FILE
|
||
EE1+ERROR E.OLR;; ;[175] GONE!
|
||
MOVE E,EBNAM ;[175] GET SOURCE FILE NAME
|
||
MOVEM E,XNAM ;[175] STORE FOR RENAME
|
||
MOVE E,EBEXT ;[175] PICKUP EB EXTENSION
|
||
HLLM E,XEXT ;[175] STORE WITHOUT TOUCHING DATES
|
||
RENAME OUTCHN,SFILNM ;[175] LAST RENAME OF THE JOB
|
||
EE1+ERROR E.RNO;; ;[175] HOW CAN WE LOSE NOW?
|
||
POPJ P, ;[175] DONE
|
||
;ROUTINE TO DETERMINE IF THE FILE FOUND BY A LOOKUP UUO WAS
|
||
;ACTUALLY FOUND WHERE THE USER SPECIFIED, OR ON SOME LIBRARY
|
||
;AREA. IT EXPECTS THE USER'S LAST COMMAND TO STILL BE IN COM???,
|
||
;THE FILE TO HAVE BEEN LOOKED UP USING THE XFILNM BLOCK, AND A PATH
|
||
;UUO ON THE CHANNEL TO HAVE BEEN DONE INTO THE PTHBLK BLOCK.
|
||
;CALL:
|
||
; PUSHJ P,CHKPTH
|
||
; HERE IF FOUND ON A LIBRARY AREA
|
||
; HERE IF FOUND WHERE SOUGHT
|
||
;USES AC'S A AND E.
|
||
|
||
|
||
;HERE WHEN CPATH & PTHBLK SET UP. COMPARE THE PATHS.
|
||
CHKPTH: SKIPN E,COMDEV ;[175] GET DEVICE USER TYPED
|
||
MOVSI E,'DSK' ;[175] BLANK DEFAULTS TO DSK:
|
||
MOVEM E,CPATH ;[175] STORE IN OUR PATH BLOCK
|
||
MOVE E,[CPTLEN,,CPATH] ;[175] DO A PATH UUO ON IT
|
||
PATH. E, ;[175] TO SEE IF USER MEANT HIS PPN
|
||
JFCL ;[175] PROBABLY MTA: OR TSK:
|
||
MOVE E,CFLG ;[175] PICKUP FLAGS WORD
|
||
TXNN E,PT.IPP ;[175] IS THIS AN ERSATZ DEVICE?
|
||
JRST CMPDSK ;[175] NO, MUST BE DSK: OF SOME SORT
|
||
|
||
;HERE IF AN ERSATZ DEVICE. COPY SFD'S FROM USER SPECIFICATION, SINCE
|
||
;AN ERSATZ DEVICE OVERRIDES ONLY THE PPN PORTION OF THE PATH.
|
||
MOVE E,[COMSFD,,CSFD] ;[175] COPY SFD'S ONLY
|
||
BLT E,CPATH+CPTLEN-1 ;[175] ..
|
||
JRST CMPPTH ;[175] NOW GO COMPARE PATHS
|
||
|
||
;HERE IF DEVICE DOES NOT IMPLY A PPN. PATH BLOCK IS OK IF USER
|
||
;DIDN'T SPECIFY A PPN, OTHERWISE WE MUST COPY OVER WHAT HE TYPED.
|
||
CMPDSK: SKIPG COMPPN ;[175] IS DEFAULT PATH OK?
|
||
JRST CMPPTH ;[175] YES, GO COMPARE WITH FOUND
|
||
MOVE E,[COMPPN,,CPPN] ;[175] NO, GET WHAT USER SAID
|
||
BLT E,CPATH+CPTLEN-1 ;[175] ONLY PPN & SFD'S
|
||
CMPPTH: SETZ A, ;[175] SETUP TO LOOP OVER PATH
|
||
CMPLUP: MOVE E,CPPN(A) ;[175] GET NEXT WORD OF PATH
|
||
CAME E,PTHPPN(A) ;[175] MATCH WHERE IT WAS FOUND?
|
||
POPJ P, ;[175] NO, IN A LIBRARY
|
||
SKIPE E ;[175] DONE IF ZERO
|
||
AOJA A,CMPLUP ;[175] ELSE COMPARE MORE SFD'S
|
||
AOS (P) ;[175] PATHS WERE THE SAME
|
||
POPJ P, ;[175] SO GIVE SKIP RETURN
|
||
;ROUTINE TO TYPE THE "%FILE FOUND IN ..." MESSAGE. EXPECTS
|
||
;THE PATH TO BE IN PTHBLK. USES A,B,C,CH,TT
|
||
|
||
TYPFFI: JSP A,CONMES ;[175] TYPE FIRST PART
|
||
ASCIZ \%File found in [\ ;[175]
|
||
MOVEI C,PTHBLK ;[175] POINT TO PATH BLOCK
|
||
PUSHJ P,TYPATH ;[175] TYPE IT
|
||
JSP A,CONMES ;[175] NOW FINISH MESSAGE
|
||
ASCIZ \]
|
||
\
|
||
POPJ P,
|
||
|
||
|
||
;ROUTINE TO TYPE A PATH IN THE PATH BLOCK POINTED TO BY AC C.
|
||
;USES AC'S B,CH,TT
|
||
|
||
TYPATH: HLRZ B,2(C) ;[175] GET PROJECT
|
||
PUSHJ P,OCTMS ;[175] TYPE IT
|
||
MOVEI CH,"," ;[175] SEPARATOR
|
||
PUSHJ P,TYOM ;[175] TYPE
|
||
HRRZ B,2(C) ;[175] PROGRAMMER
|
||
PUSHJ P,OCTMS ;[175] PUT IT OUT IN OCTAL
|
||
TYPTH1: SKIPN TT,3(C) ;[175] MORE SFD'S?
|
||
POPJ P, ;[175] NO
|
||
MOVEI CH,"," ;[175] YES, END LAST ONE
|
||
PUSHJ P,TYOM ;[175] WITH A COMMA
|
||
PUSHJ P,SIXBMS ;[175] TYPE THIS ONE
|
||
AOJA C,TYPTH1 ;[175] LOOP
|
||
;ROUTINE TO PARSE FILE DESIGNATOR
|
||
;STORES WHAT USER TYPED IN COM???, AND COPIES IT INTO X????,
|
||
;READY TO DO A LOOKUP OR ENTER. NULL DEVICE DEFAULTS TO DSK:
|
||
;ENTER AT FILALT TO COPY COM??? AREA TO X???? AREA.
|
||
;USES AC'S A,B,E,CH
|
||
|
||
FILSPC: TLZ FF,FEXTF ;[175] INITIALIZE FILE SCANNING FLAGS
|
||
SETZM COMZR ;[175] ZERO AREA THAT WE USE
|
||
MOVE A,[COMZR,,COMZR+1] ;[175] INCLUDES COM???, X????
|
||
BLT A,COMEZR ;[175] ..
|
||
|
||
;BACK HERE TO PARSE A NEW FIELD OF THE FILE SPECIFICATION
|
||
NEWFLD: PUSHJ P,FILWRD ;[175] ACCUMULATE SIXBIT INTO AC E
|
||
CAIN CH,":" ;[175] WAS TERMINATOR A COLON?
|
||
JRST FILDEV ;[175] YES, GO PROCESS DEVICE
|
||
CAIN CH,"." ;[175] A PERIOD?
|
||
JRST FILNAM ;[175] YES, STORE FILENAME & FLAG EXT.
|
||
PUSHJ P,STRFLD ;[175] ALL OTHER TERMINATORS START A
|
||
;[175] FIELD, SO STORE END OF LAST ONE
|
||
CAIN CH,"[" ;[175] PATH DESIGNATOR?
|
||
JRST FILPTH ;[175] YES, GO READ IN PATH
|
||
CAIN CH,"/" ;[175] A SWITCH?
|
||
JRST FILSWT ;[175] YES, GO READ IT
|
||
CAIE CH,ALT ;[175] ONLY OTHER DELIMITER AN ALT
|
||
ERROR E.IFN;; ;[175] NO, SO ILLEGAL CHARACTER
|
||
|
||
;HERE WHEN FILESPEC FINISHED (ALTMODE SEEN). COPY COM??? TO X??? & POPJ.
|
||
FILALT: SETZM XFILNM ;[175] ZERO LOOKUP BLOCK AGAIN
|
||
MOVE E,[XFILNM,,XFILNM+1] ;[175] INCASE ENTRY AT FILALT
|
||
BLT E,XFILNM+XFILEN-1 ;[175] BUT NOT TOO FAR
|
||
SKIPN E,COMDEV ;[175] PICKUP USER DEVICE IF ANY
|
||
MOVSI E,'DSK' ;[175] NONE, SO USE DSK:
|
||
MOVEM E,OPNDEV ;[175] STORE FOR OPEN
|
||
DEVCHR E, ;[175] ALSO NEED CHARACTERISTICS
|
||
MOVEM E,OPNCHR ;[175] SO WE CAN TELL DECTAPES FROM DSK:
|
||
TXNE E,DV.TTY ;[175] IS IT A TTY?
|
||
TXNN E,DV.TTA ;[175] YES, CONTROLLING A JOB (OURS)?
|
||
CAIA ;[175] NO TO EITHER
|
||
ERROR E.TTY;; ;[175] ILLEGAL TTY I/O DEVICE
|
||
MOVE A,[-XFILEN,,XFILNM-1] ;[175] SETUP PDL INTO LOOKUP BLK
|
||
PUSH A,[XFILEN-1] ;[175] FIRST WORD IS LENGTH
|
||
SKIPG COMPPN ;[175] DID USER SPECIFY A PATH?
|
||
TDZA E,E ;[175] NO, USE A ZERO FOR DEFAULT
|
||
MOVEI E,PTHBLK ;[175] YES, POINT TO PATH BLOCK
|
||
TLNN F2,SFDS ;[214] SEE IF SFDS ARE USED
|
||
MOVE E,COMPPN ;[214] IF NOT, THEN USE A PPN.
|
||
PUSH A,E ;[175] STORE PATH POINTER OR ZERO OR PPN
|
||
PUSH A,COMNAM ;[175] STORE FILE NAME
|
||
PUSH A,COMEXT ;[175] EXTENSION
|
||
SETZM PTHBLK ;[175] SETUP PTHBLK FROM COMPPN
|
||
SETZM PTHFLG ;[175] ZERO 1ST 2 WORDS FOR MONITOR
|
||
MOVE A,[COMPPN,,PTHPPN] ;[175] COPY REST FROM COMMAND
|
||
BLT A,PTHBLK+PTHLEN-2 ;[175] ..
|
||
SETZM PTHBLK+PTHLEN-1 ;[175] MAKE SURE IT TERMINATES WITH A 0
|
||
POPJ P,
|
||
;HERE WHEN ":" TYPED. STORE THE DEVICE NAME.
|
||
FILDEV: SKIPE E ;[175] USER TYPE A DEVICE?
|
||
TLNE FF,FEXTF ;[175] MAYBE, REALLY AN EXTENSION?
|
||
ERROR E.NDV;; ;[175] NO OR YES, NULL DEVICE ILLEGAL
|
||
MOVEM E,COMDEV ;[175] YES, STORE IT
|
||
JRST NEWFLD ;[175] AND GO PARSE THE NEXT FIELD
|
||
|
||
;HERE WHEN "." TYPED. STORE ANY FILE NAME THAT'S BEEN ACCUMULATING
|
||
;ALSO, SET FLAG SO NEXT FIELD SEEN WILL BE STORED AS EXTENSION
|
||
FILNAM: TLOE FF,FEXTF ;[175] SET EXTENSION FLAG
|
||
ERROR E.DEX;; ;[175] DOUBLE EXTENSION ILLEGAL
|
||
JUMPE E,NEWFLD ;[175] MAYBE NO FILENAME (FOO[,].BAR)
|
||
SKIPE COMNAM ;[175] THERE IS, DUPLICATE?
|
||
ERROR E.DFN;; ;[175] YES, ERROR
|
||
MOVEM E,COMNAM ;[175] NO, STORE THE FILE NAME
|
||
JRST NEWFLD ;[175] READY FOR THE NEXT FIELD
|
||
|
||
;HERE WHEN "/" OR "[" OR <ALT> TYPED. STORE FILE OR EXT. FIRST
|
||
STRFLD: TLZE FF,FEXTF ;[175] WAITING FOR AN EXTENSION?
|
||
JRST STREXT ;[175] YES, GO STORE IT
|
||
JUMPE E,CPOPJ ;[175] DON'T STORE IF NOTHING THERE
|
||
SKIPE COMNAM ;[175] FILE NAME ALREADY SEEN?
|
||
ERROR E.DFN;; ;[175] YES, ERROR
|
||
MOVEM E,COMNAM ;[175] NO, STORE THE FILE NAME
|
||
POPJ P, ;[175] RETURN
|
||
;HERE IF WE SHOULD STORE AN EXTENSION
|
||
STREXT: JUMPE E,CPOPJ ;[175] DON'T STORE IF NOT TYPED
|
||
SKIPE COMEXT ;[175] DOUBLE EXTENSION?
|
||
ERROR E.DEX;; ;[175] YES, ILLEGAL
|
||
HLLZM E,COMEXT ;[175] NO, STORE EXTENSION
|
||
POPJ P, ;[175] DONE
|
||
;HERE WHEN "[" TYPED. READ IN A PATH SPECIFICATION.
|
||
FILPTH: SKIPE COMPPN ;[175] ONLY ONE PER CUSTOMER
|
||
ERROR E.DDI;; ;[175] DOUBLE DIRECTORY ILLEGAL
|
||
PUSHJ P,FILOCT ;[175] READ THE PROJECT
|
||
CAIN CH,"-" ;[175] [-] MEANS DEFAULT PATH
|
||
JUMPE E,FILDFP ;[175] BUT [123-] DOESN'T
|
||
CAIN CH,"," ;[175] ONLY LEGAL TERMINATOR IS ","
|
||
TDNE E,[-1,,400000] ;[175] AND PROJECT MUST BE .LE. 377777
|
||
ERROR E.IPJ;; ;[175] ILLEGAL PPN
|
||
SKIPN E ;[175] [, ???
|
||
HLRZ E,USRPPN ;[175] YES, USE LOGGED-IN PROJECT
|
||
MOVSM E,COMPPN ;[175] STORE FOR RETURN
|
||
PUSHJ P,FILOCT ;[175] GET PROGRAMMER
|
||
TLNE E,-1 ;[175] ONLY HALF WORD ALLOWED
|
||
ERROR E.IPG;; ;[175] ERROR
|
||
SKIPN E ;[175] [FOO,]??
|
||
HRRZ E,USRPPN ;[175] YES, USE LOGGED IN PROGRAMMER
|
||
HRRM E,COMPPN ;[175] STORE ANSWER
|
||
CAIN CH,ALT ;[175] ALLOW X:Y.Z[,<ALT>
|
||
JRST FILALT ;[175]
|
||
CAIN CH,"]" ;[175] END OF SPEC?
|
||
JRST NEWFLD ;[175] YES, GO READ MORE
|
||
CAIE CH,"," ;[175] LAST CHANCE
|
||
ERROR E.IFN;; ;[175] ILLEGAL CHARACTER
|
||
;HERE TO COLLECT SFD'S FROM THE COMMAND STRING
|
||
MOVE B,[XWD -5,COMSFD] ;[175] MAX SFD'S ALLOWED
|
||
FILSFD: PUSHJ P,FILWRD ;[175] PARSE SFD NAME
|
||
SKIPN E ;[175] MUST BE ONE
|
||
ERROR E.NSF;; ;[175] NULL SFD ILLEGAL
|
||
MOVEM E,(B) ;[175] OK, STORE IT
|
||
CAIN CH,ALT ;[175] END OF IT ALL?
|
||
JRST FILALT ;[175] FINISH UP
|
||
CAIN CH,"]" ;[175] NO, END OF PATH?
|
||
JRST NEWFLD ;[175] YES, LOOK FOR SWITCHES ETC
|
||
CAIE CH,"," ;[175] MORE SFD'S?
|
||
ERROR E.IFN;; ;[175] NO, JUNK
|
||
AOBJN B,FILSFD ;[175] GO AFTER MORE SFD'S
|
||
ERROR E.SFD;; ;[175] SPEC NESTED TOO DEEPLY
|
||
|
||
;HERE ON "[-". SET COMPPN TO -1 TO INDICATE DEFAULT PATH.
|
||
FILDFP: SETOM COMPPN ;[175] DEFAULT PATH
|
||
PUSHJ P,FILCHR ;[175] NEXT CHARACTER
|
||
CAIN CH,ALT ;[175] ALLOW IT TO END HERE
|
||
JRST FILALT ;[175] FINISH UP
|
||
CAIE CH,"]" ;[175] ELSE MUST FINISH RIGHT
|
||
ERROR E.IFN;; ;[175] DON'T LIKE IT
|
||
JRST NEWFLD ;[175] GO GET MORE
|
||
;HERE ON A "/". READ IN THE SWITCH.
|
||
FILSWT: PUSHJ P,FILWRD ;[175] READ THE SWITCH NAME
|
||
MOVEM E,SWITHL ;[175] STORE FOR ERROR MSGS
|
||
MOVEI B,SWITAB ;[175] POINT TO SWITCH TABLE
|
||
FILSWL: SKIPN (B) ;[175] DONE?
|
||
ERROR E.UIS;; ;[175] UNKNOWN I/O SWITCH
|
||
CAME E,(B) ;[175] MATCH?
|
||
AOJA B,FILSWL ;[175] NO, TRY NEXT
|
||
SUBI B,SWITAB ;[175] CONVERT SWITCH TO OFFSET
|
||
MOVNS B ;[175] NEED NEGATIVE FOR LSH
|
||
MOVSI E,(1B0) ;[175] 1B0 IS 1ST SWITCH, 1B1 IS SECOND
|
||
LSH E,(B) ;[175] CONVERT TO RIGHT BIT
|
||
IORM E,SWITC ;[175] STORE FOR RETURN
|
||
CAIN CH,"/" ;[175] ANOTHER SWITCH COMING?
|
||
JRST FILSWT ;[175] YES, PROCESS IT
|
||
CAIN CH,ALT ;[175] END OF IT ALL?
|
||
JRST FILALT ;[175] YES, GO FINISH UP
|
||
ERROR E.IFN;; ;[175] NOTHING ELSE LEGAL ANYMORE
|
||
|
||
|
||
|
||
;FILE SELECTION COMMAND SWITCH TABLE
|
||
|
||
SWITAB: SIXBIT /GENLSN/ ;GENERATE LINE SEQ#'S ON OUTPUT
|
||
SIXBIT /SUPLSN/ ;SUPPRESS LSN (INPUT OR OUTPUT)
|
||
0
|
||
|
||
U INSWIT,1 ;INPUT SWITCHES
|
||
U OUTSWT,1 ;OUTPUT SWITCHES
|
||
U LSNCTR,1 ;LSN GENERATION CTR
|
||
|
||
;SWITCH BITS -- LEFT HALF
|
||
|
||
GENLSN==1B18
|
||
SUPLSN==1B19
|
||
;HERE TO READ AN ALFAMERIC WORD INTO E IN SIXBIT. USES A.
|
||
FILWRD: SETZ E, ;[175] INITIALIZE ACCUMULATOR AC
|
||
MOVE A,[POINT 6,E] ;[175] SETUP TO STORE IN IT
|
||
FILWRL: PUSHJ P,FILCHR ;[175] GET NEXT CHAR
|
||
CAIL CH,"A" ;[175] A LETTER?
|
||
CAILE CH,"Z" ;[175] MAYBE, IS IT?
|
||
CAIA ;[175] NO, COULD BE A DIGIT
|
||
JRST FILWR1 ;[175] IT IS A LETTER. STORE IT.
|
||
CAIL CH,"0" ;[175] DIGIT?
|
||
CAILE CH,"9" ;[175] IS IT?
|
||
POPJ P, ;[175] NOPE, END OF WORD
|
||
FILWR1: SUBI CH,"A"-'A' ;[175] CONVERT TO SIXBIT
|
||
TLNE A,770000 ;[175] AC E FULL YET?
|
||
IDPB CH,A ;[175] NO, STORE THE CHARACTER
|
||
JRST FILWRL ;[175] LOOP FOR ENTIRE WORD
|
||
|
||
;HERE TO READ AN OCTAL NUMBER INTO E.
|
||
FILOCT: SETZ E, ;[175] INITIALIZE ANSWER
|
||
FILOCL: PUSHJ P,FILCHR ;[175] GET NEXT DIGIT
|
||
CAIL CH,"0" ;[175] A DIGIT?
|
||
CAILE CH,"7" ;[175] (OCTAL, THAT IS)
|
||
POPJ P, ;[175] NO, END OF OCTAL NUMBER
|
||
LSH E,3 ;[175] YES, MAKE ROOM
|
||
ADDI E,-"0"(CH) ;[175] ADD IN NEXT DIGIT
|
||
JRST FILOCL ;[175] LOOP FOR ENTIRE NUMBER
|
||
|
||
;GET A CHAR FOR FILEPSPECIFICATION
|
||
;IGNORE SPACE, TAB, LF, VT, FF, CR; CONVERT LC TO UC
|
||
|
||
FILCHR: PUSHJ P,SKRCH
|
||
ERROR E.UFS
|
||
CAIL CH,141
|
||
CAILE CH,172
|
||
JRST .+2
|
||
TRZ CH,40
|
||
CAIN CH,40
|
||
JRST FILCHR
|
||
CAIL CH,11
|
||
CAILE CH,15
|
||
POPJ P,
|
||
JRST FILCHR
|
||
;Y RENDER THE BUFFER EMPTY. READ INTO THE BUFFER UNTIL
|
||
; (A) A FORM FEED CHARACTER IS READ, OR
|
||
; (B) THE BUFFER IS WITHIN ONE THIRD OR
|
||
;128 CHARACTERS OF CAPACITY AND A LINE FEED IS READ, OR
|
||
; (C) AN END OF FILE IS READ, OR
|
||
; (D) THE BUFFER IS COMPLETELY FULL.
|
||
;THE FORM FEED (IF PRESENT) DOES NOT ENTER THE BUFFER.
|
||
|
||
YANK:
|
||
|
||
YANK1: MOVE OU,BEG
|
||
MOVEM OU,PT ;PT:=BEG
|
||
TLZ F2,LSNINF ;[220] CLEAR THE CLEARING FLAG
|
||
|
||
YANK2: TLNE FF,FINF ;[140] IF WE FINISHED ALREADY
|
||
JRST YANK51 ;[140] THEN GET OUT
|
||
TRZ FF,FORM ;RESET THE YANK,APPEND FORM FEED FLAG
|
||
TLNN FF,UREAD ;ERROR IF INPUT NOT SPECIFIED
|
||
ERROR E.NFI
|
||
|
||
;MAINTAIN AT LEAST A MINIMUM SIZE BUFFER OF 3000
|
||
;CHARACTERS AT ALL TIMES, WHEN TECO ASKS FOR INPUT FROM
|
||
;ANYTHING BUT THE CONSOLE.
|
||
|
||
MOVE C,PT ;GET .
|
||
MOVEM C,Z ;TELL NROOM IT'S AN EXPAND
|
||
SUBM OU,C ;BUT EXPAND WITH REAL Z IN MIND
|
||
ADDI C,^D3000 ;NEED 3000 ABOVE Z
|
||
PUSHJ P,NROOM
|
||
YANK6: ADD OU,RREL ;RELOCATE IN CASE GARBAGE COLLECTION DONE
|
||
MOVE TT,MEMSIZ ;TOP OF BUFFER
|
||
MOVE CH,TT
|
||
SUB TT,OU
|
||
IDIVI TT,3
|
||
SUBM CH,TT
|
||
MOVEM TT,M23 ;M23 HAS 2/3 PT
|
||
SUBI CH,200
|
||
MOVEM CH,M23PL ;M23PL HAS 200 BELOW TOP
|
||
YANK4: CAMGE OU,M23 ;2/3 FULL YET?
|
||
JRST YANK3 ;NO, KEEP GOING
|
||
CAMG OU,M23PL ;YES, GETTING NEAR TOP?
|
||
CAIN CH,12 ;NO. LINE FEED?
|
||
JRST YANK51 ;YES. THAT'S ALL.
|
||
;NO. GET MORE.
|
||
|
||
YANK3: SOSLE IBUF+2 ;IS DEVICE BUFFER EMPTY?
|
||
JRST YANK5 ;NO.
|
||
INPUT INCHN,0 ;YES. FILL IT.
|
||
STATZ INCHN,740000 ;ERROR?
|
||
JRST INERR ;YES.
|
||
STATO INCHN,20000 ;NO. END OF FILE?
|
||
JRST YANK5 ;NO.
|
||
TLO FF,FINF
|
||
JRST YANK51 ;CLEAR BUFFER AND RETURN.
|
||
YANK5: ILDB CH,IBUF+1 ;CH:=NEXT CHARACTER.
|
||
TLZN F2,LSNINF ;[220] WAS THE LAST THING A SUPPRESSED LSN?
|
||
JRST YANK52 ;NO
|
||
CAIE CH,15 ;[150] YES, IGNORE THE NEXT CHARACTER
|
||
CAIN CH,11 ;[150] IF IT'S A CR (FOR SOS) OR A TAB
|
||
JRST YANK3 ; IGNORE IT
|
||
YANK52: JUMPE CH,YANK3 ;IF NULL, IGNORE IT.
|
||
MOVE T,@IBUF+1
|
||
TRNE T,1 ;SEQUENCE NUMBER?
|
||
JRST YNKSEQ ;YES
|
||
YANK50: PUSHJ P,PUT ;NO. PUT CHARACTER IN DATA BUFFER.
|
||
CAIE CH,14 ;FORM FEED?
|
||
AOJA OU,YANK4 ;NO. UPDATE DATA BUFFER PTR AND CHECK FOR OVERFLOW.
|
||
TRO FF,FORM ;YANK AND/OR APPEND TERMINATED ON A LFORM FEED
|
||
YANK51: MOVEM OU,Z ;YES. SET END OF DATA BUFFER AND RETURN
|
||
POPJ P,
|
||
|
||
YNKSEQ: MOVE T,INSWIT ;SUPPRESS SEQ# FLAG ON?
|
||
TLNE T,SUPLSN
|
||
JRST YNKSEZ ;YES, STRIP THEM OFF AS IN DAYS OF YORE
|
||
TRON FF,SEQF ;SET SEQ FILE AND [121]
|
||
;JRST IF ALREADY SEEN [121]
|
||
TLNE T,GENLSN ;DOES USER WANT LSN'S? [121]
|
||
JRST YANK50 ;IF SO DON'T BOTHER HIM [121]
|
||
;HERE IF NO LSN SWITCH AND SEQUENCED FILE
|
||
; TELL USER WHAT'S ABOUT TO HAPPEN [121]
|
||
MOVE T,CH ;SAVE THE CHARACTER [121]
|
||
JSP A,CONMES ;OUTPUT THE MESSAGE [121]
|
||
ASCIZ /%LINE NUMBER DETECTED IN INPUT FILE
|
||
/
|
||
MOVE CH,T ;RESTORE CHARACTER [121]
|
||
JRST YANK50 ; [121]
|
||
|
||
YNKSEZ: MOVEI T,4 ;CTR FOR REST OF SEQ #
|
||
IBP IBUF+1 ;MOVE PTR OVER THIS CHAR
|
||
SOS IBUF+2 ;& CTR TOO
|
||
SOJG T,.-2
|
||
TLO F2,LSNINF ;[220] IGNORE NEXT CHAR IF TAB
|
||
TRO FF,SEQUIN ;IGNORE NEXT CHAR IF IT IS A TAB
|
||
JRST YANK3
|
||
|
||
INERR: GETSTS INCHN,B ;SAVE ERROR FLAGS
|
||
RELEAS INCHN,0
|
||
TLZ FF,UREAD
|
||
EE2+ERROR E.INP
|
||
|
||
|
||
|
||
;A APPEND TO THE END OF THE BUFFER FROM THE SELECTED INPUT
|
||
; TERMINATING THE READ IN THE SAME MANNER AS Y. THE POINTER
|
||
; IS NOT MOVED BY A.
|
||
|
||
APPEND: MOVE OU,Z ;STORE DATA AT END OF BUFFER.
|
||
PUSHJ P,YANK2
|
||
JRST RET
|
||
;^ITEXT$ INSERTS AT THE CURRENT POINTER LOCATION THE ^I (TAB)
|
||
; AND THE TEXT FOLLOWING THE ^I UP TO BUT NOT INCLUDING THE
|
||
; ALT MODE. THE POINTER IS PUT TO THE RIGHT OF THE INSERTED
|
||
; MATERIAL.
|
||
|
||
TAB: TRZ FF,ARG ;NO ARGUMENT WANTED
|
||
PUSHJ P,TAB2 ;INSERT TAB
|
||
IFN VC,<TLO FF,TABSRT> ;ADJUST VVAL
|
||
|
||
;ITEXT$ INSERT, AT THE CURRENT POINTER LOCATION, THE TEXT FOLLOWING
|
||
; THE I UP TO BUT NOT INCLUDING THE FIRST ALT. MODE. THE
|
||
; POINTER IS PUT TO THE RIGHT OF THE INSERTED MATERIAL.
|
||
|
||
INSERT: TRNE FF,ARG ;IS THERE AN ARGUMENT?
|
||
JRST INS1A ;YES. NI COMMAND.
|
||
MOVEI CH,ALT ;NORMAL TERMINATOR
|
||
TRZN FF,SLSL ;DID @ PRECEED I?
|
||
JRST INSERA ;NO, TERMINATOR = ALTMODE
|
||
PUSHJ P,SKRCH ;YES. CH:=USER SELECTED TERMINATOR.
|
||
ERROR E.UIN
|
||
INSERA: MOVEI B,(CH) ;B=INSERTION TERMINATOR.
|
||
PUSH P,CPTR ;SAVE CURRENT POSITION IN CMD STRING
|
||
PUSH P,COMCNT
|
||
MOVEI C,0 ;COUNT # CHARACTERS TO INSERT IN C AND
|
||
;MOVE CPTR TO END OF STRING.
|
||
INSER0: PUSHJ P,SKRCH ;GET NEXT CHARACTER
|
||
ERROR E.UIN
|
||
CAIN CH,(B) ;IS IT THE TERMINATOR?
|
||
JRST INSER2 ;YES, END OF 1ST PASS
|
||
CHKEO EO21,INSER1 ;IF EO=1, CTRL-CHARS ARE JUST TEXT
|
||
MOVEI T,IN1TAB ;CK FOR ^V, ^W, ^R, ^T, ^^
|
||
TRNE F2,TXTCTL ;^T FLAG ON?
|
||
MOVEI T,IN2TAB ;YES, USE RESTRICTED TABLE
|
||
PUSHJ P,DISP1
|
||
TRNN F2,TXTCTL ;IF ^T ON, ALL OTHER CTL-CHARS LEGAL TEXT
|
||
PUSHJ P,CKNCC ;CHECK FOR OTHER CTRL-CHARS (THEY ARE ILLEGAL)
|
||
INSER1: AOJA C,INSER0 ;COUNT TEXT CHARACTERS
|
||
INSER2: MOVEM C,VVAL ;SAVE LENGTH OF STRING
|
||
IFN VC,<
|
||
TLZE FF,TABSRT ;TAB INSERTED?
|
||
AOS VVAL ;YES, COUNT IT
|
||
>
|
||
TRZ F2,TXTCTL ;REFRESH ^T FLAG
|
||
TRNE FF,FSRCH ;DOING FS OR FN?
|
||
JRST SERCHJ ;YES
|
||
POP P,COMCNT ;RESET TO BEGINNING OF INSERT TEXT
|
||
POP P,CPTR
|
||
PUSHJ P,NROOM ;YES. MOVE FROM PT THROUGH Z UP C POSITIONS.
|
||
;MOVE INSERTION INTO DATA BUFFER
|
||
|
||
INS1B: MOVE OU,PT
|
||
INS1C: PUSHJ P,GCH ;CH:=CHARACTER FROM COMMAND STRING.
|
||
INS1F: CAIN CH,(B) ;IS IT THE TERMINATOR?
|
||
POPJ P, ;YES. DON'T STORE IT.
|
||
CHKEO EO21,INS1D ;IF EO=1, THERE ARE NO CTL-CHAR. COMMANDS
|
||
MOVEI T,INSTAB ;CK FOR CONTROL CHARACTERS
|
||
TRNE F2,TXTCTL ;^T FLAG ON?
|
||
MOVEI T,INTTAB ;YES, ONLY ^T AND ^R ARE SPECIAL
|
||
PUSHJ P,DISP1
|
||
INS1E: PUSHJ P,CASE ;CONVERT UC TO LC IF FLAGS WARRANT
|
||
INS1D: PUSHJ P,PUT ;NO. STORE CHARACTER IN DATA BUFFER TO RIGHT OF PT.
|
||
AOS PT ;PT:=PT+1
|
||
JRST INS1B ;LOOP
|
||
;DISPATCH TABLE FOR INSERT STRING CONTROL CHARACTERS (COUNT PASS)
|
||
|
||
IN1TAB: XWD INSER0,26 ;^V
|
||
XWD INSER0,27 ;^W
|
||
XWD INSER0,36 ;^^
|
||
IN2TAB: XWD INSER4,24 ;^T
|
||
XWD INSER3,22 ;^R
|
||
XWD 0,0 ;END OF LIST
|
||
|
||
;GET CHARACTER AFTER ^R
|
||
|
||
INSER3: PUSHJ P,SKRCH ;DON'T COUNT ^R & DON'T DO CHECKS ON CHAR AFTER IT
|
||
ERROR E.UIN
|
||
JRST INSER1
|
||
|
||
;CHANGE NO-CONTROL-COMMANDS FLAG
|
||
|
||
INSER4: TRC F2,TXTCTL
|
||
JRST INSER0 ;DON'T COUNT ^T
|
||
;DISPATCH TABLE FOR INSERT STRING CONTROL CHARACTERS (INSERT PASS)
|
||
|
||
INSTAB: XWD INSLOW,26 ;^V
|
||
XWD INSSTD,27 ;^W
|
||
XWD INSSPC,36 ;^^
|
||
INTTAB: XWD INSMAC,24 ;^T
|
||
XWD INSIGR,22 ;^R
|
||
XWD 0,0 ;END OF LIST
|
||
|
||
;^V CAUSES THE NEXT CHARACTER TO BE CONVERTED TO LOWER CASE (IF UPPER CASE)
|
||
;^V^V SETS LOWER CASE MODE UNTIL THE END OF THE TEXT STRING (OR FURTHER NOTICE)
|
||
|
||
INSLOW: PUSHJ P,C.V ;SET ^V FLAGS
|
||
JRST INS1C ;CONTINUE TO NEXT CHAR.
|
||
|
||
;^W CAUSES NEXT CHAR. TO BE TAKEN AS IS (STANDARD MODE)
|
||
;^W^W SETS STANDARD MODE UNTIL END OF TEXT STRING (OR FURTHER NOTICE)
|
||
|
||
INSSTD: PUSHJ P,C.W ;SET ^W FLAGS
|
||
JRST INS1C ;CONTINUE TO NEXT CHAR.
|
||
|
||
;^R CAUSES NEXT CHAR. TO BE TAKEN AS TEXT
|
||
;EVEN IF IT IS A CONTROL CHAR. OR THE TEXT TERMINATOR
|
||
|
||
INSIGR: PUSHJ P,GCH ;GET NEXT CHAR.
|
||
JRST INS1E ;TREAT AS TEXT
|
||
|
||
;^^ -- IF NEXT CHAR IS @,[,\,],^, OR _, CONVERT IT TO LC RANGE
|
||
|
||
INSSPC: PUSHJ P,GCH ;GET NEXT CHAR
|
||
PUSHJ P,CVTSPC ;CONVERT IF WARRANTED
|
||
JRST INS1F
|
||
|
||
;CHANGE NO-CONTROL-COMMANDS MODE
|
||
|
||
INSMAC: TRC F2,TXTCTL ;COMPLEMENT ^T FLAG
|
||
JRST INS1C ;GO ON TO NEXT CHAR
|
||
;SET ^V FLAGS
|
||
|
||
C.V: TRON F2,CTLV ;SET ^V FLAG -- WAS IT ON BEFORE?
|
||
POPJ P, ;NO
|
||
TRZ F2,CTLV+CTLWW ;YES, SET ^V^V FLAG & CLR OTHERS
|
||
TRO F2,CTLVV
|
||
POPJ P,
|
||
|
||
;SET ^W FLAGS
|
||
|
||
C.W: TRON F2,CTLW ;SET ^W FLAG -- WAS IT ON BEFORE?
|
||
POPJ P, ;NO
|
||
TRZ F2,CTLW+CTLVV ;YES, SET ^W^W FLAG & CLR OTHERS
|
||
TRO F2,CTLWW
|
||
POPJ P,
|
||
|
||
;CONVERT ALPHABETIC CH TO UPPER OR LOWER CASE ACCORDING TO CASE CONTROL FLAGS
|
||
|
||
CASE: CAIL CH,"A" ;IS CHAR IN UPPER CASE RANGE?
|
||
CAILE CH,"Z"
|
||
CAIL CH,"A"+40 ;IS IT IN LOWER CASE RANGE?
|
||
CAILE CH,"Z"+40
|
||
JRST CASE3 ;NO
|
||
CASE2: TRNE F2,LCASE ;PREVAILING LOWER CASE?
|
||
TRO CH,40 ;YES, CONVERT TO LOWER
|
||
TRNE F2,UCASE ;PREVAILING UPPER CASE?
|
||
TRZ CH,40 ;YES, CONVERT TO UPPER
|
||
TRNE F2,CTLVV ;DOUBLE ^V ON?
|
||
TRO CH,40 ;YES, CONVERT TO LC
|
||
TRNE F2,CTLWW ;DOUBLE ^W ON?
|
||
TRZ CH,40 ;YES, CONVERT TO UC
|
||
TRZE F2,CTLV ;SINGLE ^V ON?
|
||
TRO CH,40 ;YES, CONVERT TO LC
|
||
TRZE F2,CTLW ;SINGLE ^W ON?
|
||
TRZ CH,40 ;YES, CONVERT TO UC
|
||
CASE3: TRZ F2,CTLV+CTLW ;CLR IN CASE NO CONVERSION
|
||
POPJ P,
|
||
|
||
;CONVERT @, [, \, ], ^, AND _ TO THE EQUIVALENT LC CHARACTER
|
||
|
||
CVTSPC: CAIL CH,"["
|
||
CAILE CH,"_"
|
||
CAIN CH,"@"
|
||
TRO CH,40 ;CONVERT TO LOWER CASE RANGE
|
||
POPJ P,
|
||
;CHECK FOR NON-CONTROL CHARACTERS
|
||
;IF CH<10, OR 15<CH<33, OR 33<CH<40, CH IS AN ILLEGAL CTRL-CHAR
|
||
|
||
CKNCC: CAIGE CH,40
|
||
CAIG CH,15
|
||
CAIGE CH,10
|
||
CAIN CH,33
|
||
POPJ P, ;IT IS 10-15 OR 33 OR 40+
|
||
MOVEI B,(CH) ;SAVE CHAR FOR ERROR MSG ROUTINE
|
||
ERROR E.ICT
|
||
;NI INSERT AT THE POINTER A CHARACTER WHOSE 7-BIT ASCII CODE IS N
|
||
; (BASE 10). THE POINTER IS MOVED TO THE RIGHT OF THE NEW CHARACTER.
|
||
|
||
INS1A: CHKEO EO21,INS1X ;IF EO=1 SKIP NEXT STUFF
|
||
PUSHJ P,SKRCH ;GET CHAR AFTER I
|
||
ERROR E.NAI
|
||
CAIE CH,ALT ;IT HAD BETTER BE AN ALTMODE
|
||
ERROR E.NAI
|
||
INS1X: MOVE CH,NUM ;CH:=NUM
|
||
|
||
;INSERT CH IN DATA BUFFER AT PT
|
||
|
||
TAB2: MOVEI C,1 ;MOVE FROM PT THROUGH Z UP 1 POSITION.
|
||
PUSHJ P,NROOMC
|
||
AOS OU,PT ;PT:=PT+1
|
||
SOJA OU,PUT ;STORE CH AT PT-1
|
||
|
||
;NBACKSLASH INSERT AT THE CURRENT POINTER LOCATION THE ASCII NUMBERS
|
||
; EQUAL TO N.
|
||
|
||
BAKSL1: MOVE T,[XWD 700,STAB-1]
|
||
MOVEI C,0 ;COUNT # DIGITS IN C.
|
||
MOVEI A,BAKSL4 ;SET DPT TO RETURN TO BAKSL4
|
||
PUSHJ P,DPT ;CONVERT C(B) TO ASCII AND STORE STRING IN STAB.
|
||
MOVE B,[XWD 700,STAB-1]
|
||
PUSHJ P,NROOMC ;MOVE FROM PT THROUGH Z UP C POSITIONS.
|
||
BAKSL5: MOVE OU,PT ;POSITION TO PUT CHAR IN
|
||
ILDB CH,B ;GET NEXT CHAR OF THE #
|
||
PUSHJ P,PUT ;STORE THE CHAR
|
||
AOS PT ;MOVE THE POINTER
|
||
SOJG C,BAKSL5 ;DECREMENT THE CHAR CTR
|
||
JRST RET
|
||
|
||
BAKSL4: IDPB CH,T ;STORE DIGIT IN STAB
|
||
AOJA C,CPOPJ ;C:=C+1. RETURNS TO DPT CALL + 1 ON COMPLETION.
|
||
|
||
;@ COMMAND MODIFIER
|
||
|
||
ATSIGN: TROA FF,SLSL ;SET @ SEEN FLAG
|
||
|
||
;COLON COMMAND MODIFIER
|
||
|
||
COLON: TRO FF,COLONF ;SET : SEEN FLAG
|
||
JRST RET
|
||
;NT TYPE OUT THE STRING OF CHARACTERS STARTING AT THE RIGHT OF THE
|
||
; POINTER AND CONTINUING THROUGH THE NTH LINE FEED ENCOUNTERED.
|
||
; IF N IS NEGATIVE, N LINES TO THE LEFT OF THE POINTER ARE TYPED.
|
||
;T SAME AS 1T.
|
||
;I,JT TYPE OUT THE (I+1)TH THROUGH THE JTH CHARACTER OF THE BUFFER.
|
||
|
||
TYPE:
|
||
TYPE4: MOVEI D,TYO ;D:=ADDRESS OF OUTPUT ROUTINE.
|
||
|
||
TYPE0: PUSHJ P,GETARG ;C:=FIRST STRING ARGUMENT ADDRESS.
|
||
;B:=SECOND STRING ARGUMENT ADDRESS.
|
||
|
||
TYPE1: PUSHJ P,CHK1 ;C:=MAX(C(C),BEG), B:=MIN(C(B),Z)
|
||
MOVE I,C ;START GETTING CHARACTERS AT C.
|
||
TYPE3: CAML I,B ;DONE?
|
||
JRST TYPE5 ;YES.
|
||
MOVE TT,I ;NO. GET NEXT CHAR
|
||
IDIVI TT,5 ;THIS IS A COPY OF GETINC
|
||
HLL TT,BTAB(TT1) ;..
|
||
LDB CH,TT ;COPIED TO SPEED IT UP
|
||
ADDI I,1 ;..
|
||
PUSHJ P,(D) ;OUTPUT IT
|
||
JRST TYPE3 ;LOOP
|
||
TYPE5: MOVEI A,PPA ;IF TYPING OR I,JP DON'T APPEND FF.
|
||
MOVEI CH,14 ;IF PUNCHING, APPEND FF.
|
||
CAIE A,(D) ;D=PPA?
|
||
POPJ P, ;NO
|
||
TRNN FF,PCHFLG ;IS THIS AN "N" SEARCH?
|
||
CPPA: JRST PPA ;NO, APPEND A FORM FEED
|
||
TRNN FF,FORM ;DID LAST Y,A TERMINATE ON A FORM FEED?
|
||
POPJ P, ;NO,DO NOT APPEND ONE
|
||
;YES, FALL INTO PPA: TO APPEND FF
|
||
PPA: TLNN FF,UWRITE ;ERROR IF NO OUTPUT FILE
|
||
ERROR E.NFO
|
||
PPA05: SOSLE OBF+2 ;YES. IS OUTPUT BUFFER FULL?
|
||
JRST PPA11 ;NO.
|
||
OUTPUT OUTCHN,0 ;YES. WRITE IT
|
||
STATZ OUTCHN,740000 ;ERROR?
|
||
JRST OUTERR ;YES.
|
||
MOVE A,OUCHR ;[175]
|
||
TXNE A,DV.MTA ;[175]
|
||
STATO OUTCHN,IOEOT ;A MAG TAPE AND AFTER EOT?
|
||
SKIPA ;NO
|
||
JRST OUTERR
|
||
PPA11: MOVE A,OUTSWT ;GET OUTPUT SWITCHES
|
||
TRNE FF,SEQF ;SEQUENCED FILE?
|
||
JRST PPA02 ;YES
|
||
TLNE A,GENLSN ;NO, OUTPUT GENLSN ON?
|
||
JRST PPA02 ;YES, GENERATE LSN
|
||
TRZ FF,SEQUIN ;CLR SO AS NOT TO SCREW YANK
|
||
PPA01: IDPB CH,OBF+1 ;CH TO OUTPUT BUFFER.
|
||
POPJ P, ;RETURN
|
||
|
||
|
||
OUTERR: GETSTS OUTCHN,B ;SAVE ERROR FLAGS
|
||
RELEAS OUTCHN,0 ;CLOSE FILE AND RELEASE OUTPUT DEVICE.
|
||
TLZ FF,UWRITE+UBAK ;CLEAR OUTPUT FILE OPEN INDICATOR.
|
||
EE2+ERROR E.OUT
|
||
PPA02: TRNN FF,SEQUIN ;WAS LAST CHAR AN EOL OR BEG OF BUFR?
|
||
JRST PPA03 ;NO
|
||
MOVE AA,OUTSWT ;[176] GET OUTPUT SWITCHES
|
||
TLNE AA,SUPLSN ;[176] SUPPRES SEQ # ?
|
||
JRST PPA06 ;[176] YES
|
||
MOVE A,OBF+2 ;ROOM FOR SEQ# IN OUTPUT BUFR?
|
||
CAIG A,14 ;[217] PAGE MARKS ARE A LITTLE BIGGER
|
||
JRST PPA05 ;NO, OUTPUT & COME BACK
|
||
PPA07: LDB A,[POINT 6,OBF+1,5] ;GET CURRENT BYTE POSITION IN OUT BUFR
|
||
CAIG A,1 ;AT END OF WORD?
|
||
JRST PPA06 ;YES
|
||
IBP OBF+1 ;NO, PAD OUT WORD WITH NULLS
|
||
SOS OBF+2
|
||
JRST PPA07 ;TRY AGAIN
|
||
PPA06: TRZ FF,SEQUIN ;[176] MOVED DOWN FROM PPA07-1
|
||
TRNE FF,SEQF ;[176] REMOVE PPA06 LABEL
|
||
;[176] GENERATE NEW LSN OR OUTPUT EXISTING LSN?
|
||
JRST PPA04 ;OUTPUT EXISTING LSN
|
||
CAIN CH,14 ;[217] HANDLE A FORM-FEED?
|
||
JRST PPA14 ;[217] GO DO IT.
|
||
MOVE A,LSNCTR ;GET LAST CREATED LSN WITH BIT 35 ON
|
||
ADD A,[BYTE (7)106,106,106,107] ;& ADD ASCII 10 TO IT
|
||
MOVE T,A
|
||
AND T,[BYTE (7)60,60,60,60]
|
||
LSH T,-3
|
||
MOVE TT,A
|
||
AND TT,[BYTE (7)160,160,160,160]
|
||
IOR T,TT
|
||
SUB A,T
|
||
ADD A,[BYTE (7)60,60,60,60]
|
||
MOVEM A,LSNCTR ;STORE NEW LSN
|
||
PPA06A: AOS OBF+1 ;& OUTPUT THE 5 DIGITS + BIT 35
|
||
MOVEM A,@OBF+1
|
||
MOVEI A,11 ;FOLLOWED BY TAB
|
||
IDPB A,OBF+1
|
||
MOVE A,OBF+2 ;ADJUST BUFR CTR
|
||
SUBI A,6
|
||
MOVEM A,OBF+2
|
||
PPA03: PUSHJ P,CKEOL ;IS THIS CHAR AN EOL?
|
||
JRST PPA01 ;NO
|
||
TRO FF,SEQUIN ;YES, SET EOL FLAG
|
||
CAIE CH,14 ;[217] A FORM FEED?
|
||
JRST PPA01 ;[217] NO, SO JUST OUTPUT
|
||
TLNE AA,SUPLSN ;[217] SUPPRESSING LSN'S?
|
||
JRST PPA01 ;[217] YES
|
||
MOVEI A,15 ;[217] NO, INSERT CRLF
|
||
IDPB A,OBF+1 ;[217] BEFORE A PAGE MARK
|
||
MOVEI A,12 ;[217] SO IT WILL BE RECOGNIZED
|
||
IDPB A,OBF+1 ;[217]
|
||
SOS OBF+2 ;[217] AND UPDATE
|
||
SOS OBF+2 ;[217] THE COUNTER
|
||
JRST PPA14 ;[217] MARK THE PAGE
|
||
;OUTPUT EXISTING LSN WITH LEADING ZEROS
|
||
|
||
PPA04: MOVEI A,4 ;INIT 5 DIGIT CTR
|
||
MOVEM A,LSNCTR
|
||
MOVE A,[<"00000">B34] ;INIT LSN ACCUMULATOR
|
||
CAIL CH,"0" ;IS CURRENT CHAR A DIGIT?
|
||
CAILE CH,"9"
|
||
JRST PPA08 ;NO, FILL IN 5 SPACES
|
||
JRST PPA12
|
||
PPA10: SOSGE LSNCTR ;DONE 5 DIGITS YET?
|
||
JRST PPA09 ;YES
|
||
PPA12: LSH A,7 ;PUT DIGIT INTO ACCUMULATOR
|
||
DPB CH,[POINT 7,A,34]
|
||
CAML I,B
|
||
JRST PPA09
|
||
PUSHJ P,GETINC ;[141]GET NEXT BUFFER CHAR
|
||
CAIL CH,"0" ;IS IT A DIGIT?
|
||
CAILE CH,"9"
|
||
JRST PPA09 ;NO
|
||
JRST PPA10 ;YES, STORE IT
|
||
|
||
PPA08: MOVE A,[<" ">B34] ;[150] GET 5 SPACES
|
||
PPA08X: CAIE CH," " ;[150] SPACE?
|
||
JRST PPA08B ;NO, INSERT 5 SPACES [115]
|
||
SOSGE LSNCTR ;HAVE WE SEEN 5 SPACES [115]
|
||
JRST PPA08C ;IF SO CHECK FOR TAB [115]
|
||
PUSHJ P,GETINC ;[141]GET NEXT CHARACTER
|
||
JRST PPA08X ;[150] TRY AGAIN
|
||
|
||
; HERE IF WE'VE SEEN 5 SPACES MAY BE TECO BLANK SEQUENCE NUMBER,
|
||
; SOS PAGE MARK, OR SPACES THE USER HAS INSERTED.
|
||
PPA08C: PUSHJ P,GETINC ;[150] PICK IT UP AND
|
||
CAIE CH,15 ;[150] TEST FOR CR (FOR SOS) OR
|
||
CAIN CH,11 ;[150] TAB TO BE OUTPUT WITH SPACES
|
||
JRST PPA09 ;[150] OUTPUT 5 SPACES + CHAR IN CH
|
||
; JRST PPA08B ;[150] MUST BE USER'S SPACES!
|
||
|
||
; HERE IF NOT 5 SPACES FOLLOWED BY TAB OR CR. THIS IMPLIES
|
||
; THAT ANY SPACES SEEN WERE USER'S TEXT.
|
||
PPA08B: SUBI I,5 ;[150] BACK UP TO FIRST CHARACTER
|
||
ADD I,LSNCTR ;[150] AND OUTPUT IT WITH BLANK LSN
|
||
PUSHJ P,GETINC ;[141] GET PROPER CHARACTER
|
||
MOVE AA,OUTSWT ;GET SWITCHES [115]
|
||
TLNE AA,SUPLSN ;SUPPRESS SEQ# [115]
|
||
JRST PPA01 ;[141] YES
|
||
TRO A,1 ;NO, SET BIT 35 [115]
|
||
JRST PPA06A ;OUTPUT SEQ# WITH A TAB [115]
|
||
PPA09: MOVE AA,OUTSWT ;GET SWITCHES
|
||
TLNE AA,SUPLSN ;SUPPRESS SEQ#'S?
|
||
JRST PPA13 ;YES
|
||
TRO A,1 ;SET BIT 35
|
||
AOS OBF+1 ;& OUTPUT SEQ #
|
||
MOVEM A,@OBF+1
|
||
MOVE A,OBF+2 ;& ADJUST BUFR CTR
|
||
SUBI A,5
|
||
MOVEM A,OBF+2
|
||
JRST PPA03 ; CONTINUE
|
||
|
||
PPA13: CAIE CH,15 ;[150] ELIMINATE CR (FOR SOS)
|
||
CAIN CH,11 ;IS TERMINATOR A TAB?
|
||
AOSA OBF+2 ;[176] YES, FIX POINTER AND
|
||
JRST PPA01 ;NO, OUTPUT IT
|
||
POPJ P, ;[176] OMIT IT
|
||
;
|
||
; HERE TO INSERT A SOS STYLE PAGE MARK.
|
||
;
|
||
PPA14: MOVE A,[BYTE(7) 40,40,40,40,40] ;[217] FIVE SPACES
|
||
TRO A,1 ;[217] AND THE BIT ON
|
||
AOS OBF+1 ;[217] OUTPUT IT
|
||
MOVEM A,@OBF+1 ;[217]
|
||
MOVE A,[BYTE(7) 15,14,0,0,0] ;[217] AND CR,FF
|
||
AOS OBF+1 ;[217] INCREMENT THE POINTER
|
||
MOVEM A,@OBF+1 ;[217] AND DEPOSIT
|
||
MOVE A,OBF+2 ;[217] ADJUST BUFR CTR
|
||
SUBI A,12 ;[217]
|
||
MOVEM A,OBF+2 ;[217]
|
||
TRO FF,SEQUIN ;[217] SET THE EOL FLAG
|
||
MOVE A,[<"00000">B34+1] ;[217] RESET THE LSN'S
|
||
MOVEM A,LSNCTR
|
||
POPJ P, ;[] AND RETURN
|
||
;PW OUTPUT THE ENTIRE BUFFER, FOLLOWED BY A FORM FEED CHARACTER.
|
||
; TO THE SELECTED OUTPUT DEVICE. BUFFER IS UNCHANGED AND POINTER
|
||
; IS UNMOVED.
|
||
;P IS IDENTICAL TO PWY.
|
||
;NP IS IDENTICAL TO PP...P (P PERFORMED N TIMES).
|
||
;I,JP OUTPUTS (I+1)TH THROUGH JTH CHARACTERS OF BUFFER. NO FORM
|
||
; FEED IS PUT AT THE END. BUFFER UNCHANGED; POINTER UNMOVED.
|
||
|
||
PUNCHA: MOVEI D,CPPA ;SELECT PPA FOR OUTPUT INDIRECTLY IN CASE I,JP.
|
||
TRNE FF,ARG2 ;I,JP?
|
||
JRST TYPE0 ;YES. GET STRING ARGUMENTS AND OUTPUT.
|
||
MOVE E,B ;NO. E:=N
|
||
MOVE B,CPTR
|
||
ILDB T,B ;T:=COMMAND CHARACTER FOLLOWING P.
|
||
TRZ T,40 ;FILTER L.C.
|
||
JUMPL E,CPOPJ ;IF N<0, IGNORE P.
|
||
CHKEO EO21,PUN1 ;OLD STYLE P ALWAYS GIVES FORM FEED
|
||
CAIE T,"W" ;PW ALWAYS GIVES FORM FEED
|
||
TRO FF,PCHFLG ;OTHERWISE, FORM GOES OUT ONLY IF FORM CAME IN
|
||
PUN1: PUSHJ P,PUNCHR ;PUNCH OUT BUFFER
|
||
SKIPE COMCNT ;IF NO COMMANDS LEFT
|
||
CAIE T,"W" ;OR COMMAND IS NOT W
|
||
JRST PUN3 ;READ NEXT PAGE
|
||
CAIG E,1 ;ARG DOWN TO 1 YET?
|
||
PUSHJ P,RCH ;YES, THROW AWAY THE W
|
||
PUN4: MOVE C,Z
|
||
CAMN C,BEG ;EMPTY BUFFER?
|
||
TLNN FF,FINF ;NO. QUIT ON EOF
|
||
SOJG E,PUN1 ;YES. E:=E-1. DONE?
|
||
CPOPJ: POPJ P, ;YES
|
||
|
||
PUN2: MOVE OU,BEG ;IF NOTHING READ IN, CLEAR THE BUFFER
|
||
MOVEM OU,PT
|
||
TRZ FF,FORM ;AND THE FORM FEED FLAG
|
||
JRST YANK51 ;SET Z=BEG & POPJ
|
||
|
||
PUNCHR: MOVE C,BEG ;OUTPUT DATA BUFFER.
|
||
MOVE B,Z
|
||
MOVEI D,PPA
|
||
CAME B,C ;IS PAGE BUFFER EMPTY?
|
||
JRST TYPE1 ;[173] NO; IF SEQUENCED FILE, START PAGE WITH SEQ#
|
||
;[173] EDIT 173 OBSOLECES PUNCH1
|
||
|
||
TRNE FF,FORM ;YES, IS THERE A FORM-FEED ON THIS BLANK PAGE?
|
||
JRST TYPE5 ;YES, OUTPUT IT
|
||
POPJ P, ;NO, DON'T OUTPUT ANYTHING
|
||
|
||
PUN3: TLNE FF,UREAD ;ANY INPUT FILE?
|
||
TLNE FF,FINF ;DONT TRY TO READ IF NO DATA LEFT
|
||
JRST PUN2
|
||
PUSHJ P,YANK1 ;RENEW BUFFER
|
||
JRST PUN4 ;CONTINUE
|
||
;NJ MOVE THE POINTER TO THE RIGHT OF THE NTH CHARACTER IN THE
|
||
; BUFFER. (I.E., GIVE "." THE VALUE N.)
|
||
;J SAME AS 0J.
|
||
|
||
JMP: ADD B,BEG ;PT:=N+BEG
|
||
JRST JMP1
|
||
|
||
|
||
|
||
;NR SAME AS .-NJ.
|
||
|
||
REVERS: PUSHJ P,CHK2 ;MAKE SURE THERE IS AN ARGUMENT
|
||
MOVNS B ;B:=-C(B)
|
||
SKIPA
|
||
|
||
;NC SAME AS .+NJ. NOTE THAT N MAY BE NEGATIVE.
|
||
|
||
CHARAC: PUSHJ P,CHK2 ;MAKE SURE THERE IS AN ARGUMENT
|
||
ADD B,PT ;B:=PT+C(B)
|
||
|
||
;IF B LIES BETWEEN BEG AND Z, STORE IT IN PT.
|
||
|
||
JMP1: PUSHJ P,CHK ;IS C(B) WITHIN DATA BUFFER?
|
||
MOVEM B,PT ;YES. PT:=C(B)
|
||
JRST RET
|
||
|
||
;NL IF N>0: MOVE POINTER TO THE RIGHT, STOPPING WHEN IT HAS
|
||
; PASSED OVER N LINE FEEDS.
|
||
; IF N<0: MOVE POINTER TO THE LEFT; STOP WHEN IT HAS PASSED
|
||
; OVER N+1 EOL'S AND THEN MOVE IT TO THE RIGHT OF
|
||
; THE LAST EOL PASSED OVER.
|
||
;L SAME AS 1L.
|
||
|
||
LINE: TRNE FF,ARG2 ;ERROR IF THERE ARE 2 ARGS
|
||
ERROR E.TAL
|
||
PUSHJ P,GETARG ;NO. C:=FIRST STRING ARGUMENT ADDRESS,
|
||
;B:=SECOND STRING ARGUMENT ADDRESS.
|
||
XOR B,C
|
||
XORM B,PT
|
||
JRST RET
|
||
;ROUTINE TO RETURN CURRENT ARGUMENT IN B
|
||
;ASSUMES A VALUE OF 1 WITH SIGN OF LAST OPERATOR IF THERE IS NO CURRENT ARGUMENT
|
||
;CALL PUSHJ P,CHK2
|
||
; RETURN WITH B:=CURRENT ARG.,+1 OR -1
|
||
|
||
CHK2: TROE FF,ARG ;IS THERE AN ARGUMENT?
|
||
POPJ P, ;YES. IT'S ALREADY IN B.
|
||
CHK22: LDB B,[XWD 340200,DLIM] ;B:=1 WITH SIGN OF LAST OPERATOR.
|
||
MOVNS B
|
||
AOJA B,CPOPJ
|
||
|
||
;NK PERFORM NL BUT DELETE EVERYTHING THE POINTER MOVES OVER.
|
||
;M,NK DELETE THE (M+1)TH THROUGH THE NTH CHARACTER FROM THE BUFFER.
|
||
; THE POINTER IS THEN PUT WHERE THE DELETION TOOK PLACE.
|
||
;K SAME AS 1K
|
||
|
||
KILL: PUSHJ P,GETARG ;C:=FIRST STRING ARG. ADDRESS
|
||
;B:=SECOND STRING ARG. ADDRESS
|
||
PUSHJ P,CHK1 ;C:=MAX(C(C),BEG), B:=MIN(C(B),Z)
|
||
MOVEM C,PT ;PT:=C(C)
|
||
SUB B,C ;B:=NO. OF CHARACTERS TO KILL.
|
||
JUMPE B,RET ;IF NONE, RETURN. OTHERWISE, FALL INTO DELETE
|
||
;ND DELETE N CHARACTERS FROM THE BUFFER: IF N IS POSITIVE, DELETE
|
||
; THEM JUST TO THE RIGHT OF THE POINTER; IF N IS NEGATIVE, DELETE
|
||
; THEM JUST TO ITS LEFT.
|
||
;D SAME AS 1D
|
||
|
||
DELETE: PUSHJ P,CHK2 ;MAKE SURE B CONTAINS AN ARGUMENT
|
||
MOVM C,B
|
||
MOVNS C ;C:=-ABS(B)
|
||
ADD B,PT ;B:=PT+B
|
||
PUSHJ P,CHK ;STILL IN DATA BUFFER?
|
||
CAMGE B,PT ;YES. IS N NEGATIVE?
|
||
MOVEM B,PT ;YES. MOVE PT BACK FOR DELETION.
|
||
PUSHJ P,NROOM ;MOVE FROM PT+ABS(C) THROUGH Z DOWN ABS(C) POSITIONS
|
||
JRST RET
|
||
|
||
|
||
|
||
;ROUTINE TO CHECK DATA BUFFER POINTER
|
||
;CALL MOVE B,POINTER
|
||
; PUSHJ P,CHK
|
||
; RETURN IF B LIES BETWEEN BEG AND Z
|
||
|
||
CHK: CAMG B,Z
|
||
CAMGE B,BEG
|
||
ERROR E.POP
|
||
POPJ P,
|
||
|
||
;ROUTINE TO PUT STRING ARGUMENT ADDRESSES WITHIN DATA BUFFER
|
||
;BOUNDS AND CHECK ORDER RELATION.
|
||
;CALL MOVE C,FIRST STRING ARGUMENT ADDRESS
|
||
; MOVE B,SECOND STRING ARGUMENT ADDRESS
|
||
; PUSHJ P,CHK1
|
||
; RETURN
|
||
|
||
CHK1: CAMLE C,B ;[172] C>B? (CHECK FIRST!)
|
||
ERROR E.SAL
|
||
CAMGE C,BEG ;[172] C:=MAX(C(C),BEG)
|
||
MOVE C,BEG ;[172]
|
||
CAMLE C,Z ;[172] C:=MIN(C(C),Z)
|
||
MOVE C,Z ;[172]
|
||
CAMGE B,BEG ;[172] B:=MAX(C(B),BEG)
|
||
MOVE B,BEG ;[172]
|
||
CAMLE B,Z ;[172] B:=MIN(C(B),Z)
|
||
MOVE B,Z ;[172]
|
||
CAMN C,BEG ;[173] YES; BEG OF BUFFER?
|
||
JRST CHK1.5 ;[173] YES
|
||
MOVE TT,C ;[173] NO; BEG OF LINE?
|
||
SUBI TT,1 ;[173] GET PREV CHAR
|
||
IDIVI TT,5 ;[173] RIGHT HALF OF PTR
|
||
HLL TT,BTAB(TT1) ;[173] LEFT HALF OF PTR
|
||
LDB CH,TT ;[173]
|
||
PUSHJ P,CKEOL ;[173] PREV CHAR = EOL?
|
||
POPJ P, ;[173] NO; RETURN
|
||
CHK1.5: TRO FF,SEQUIN ;[173] YES; SET FLAG
|
||
POPJ P, ;[172] RETURN (CHANGE COMMENT)
|
||
;_ SEARCH
|
||
|
||
LARR: TROA FF,FINDR ;FINDR:=1 FOR LEFT ARROW SEARCH
|
||
|
||
;N SEARCH
|
||
|
||
SERCHP: TRO FF,PCHFLG ;PCHFLG:=1 FOR N SEARCH
|
||
|
||
;S SEARCH
|
||
|
||
SERCH: SKIPLE E,B ;E=SEARCH COUNT
|
||
JRST SERCHA ;POSITIVE ARGUMENT
|
||
TRNE FF,ARG ;ILLEGAL 0 OR - SRH ARG
|
||
ERROR E.ISA
|
||
SERCHA: MOVEI CH,ALT ;USE ALT-MODE DELIMITER IF NO @ SEEN
|
||
TRZN FF,SLSL ;@ SEEN?
|
||
JRST SERCHB ;NO, TERMINATOR = ALTMODE
|
||
PUSHJ P,SKRCH ;YES. CH:=USER SPECIFIED DELIMITER.
|
||
ERROR E.USR
|
||
SERCHB: MOVEM CH,B ;B:=SEARCH STRING DELIMITER
|
||
MOVEM CH,ARGTRM ;SAVE TERMINATOR FOR FS INSERTION
|
||
SETZM STAB ;CLEAR SEARCH MATRIX
|
||
MOVE A,[XWD STAB,STAB+1]
|
||
BLT A,STAB+STABLN-1
|
||
PUSHJ P,SKRCH ;LOOK AHEAD 1 CHAR
|
||
ERROR E.USR
|
||
CAIE CH,(B) ;IS IT THE DELIMITER?
|
||
JRST SERCHT ;NO, AN ARGUMENT IS GIVEN
|
||
SKIPN SRHCTR ;YES, USE PREVIOUS SEARCH STRING
|
||
ERROR E.SNA
|
||
JRST SERCH0
|
||
|
||
U ARGTRM,1 ;FS, FN 2ND ARG TERMINATOR
|
||
;MOVE NEW STRING TO STORAGE
|
||
|
||
SERCHT: TRZ F2,XMATCH ;[215]
|
||
SETZM SRHCTR ;CLR STRING CTR
|
||
MOVE AA,[POINT 7,SRHARG] ;INIT STORAGE PTR
|
||
JRST SERCHD ;1ST CHAR ALREADY IN
|
||
SERCHC: PUSHJ P,SKRCH ;GET NEXT CHAR OF CMD STRING
|
||
ERROR E.USR
|
||
SERCHD: CHKEO EO21,SERCHE ;IF EO=1, ^R IS JUST TEXT
|
||
CAIE CH,22 ;^R?
|
||
SERCHE: CAIN CH,21 ;^Q?
|
||
JRST SERCHG ;YES, NEXT CHAR IS TEXT
|
||
CAIN CH,(B) ;THE DELIMITER?
|
||
JRST SERCH0 ;YES
|
||
CAIN CH,24 ;^T?
|
||
JRST SERCHU ;YES
|
||
TRNE F2,TXTCTL ;^T FLAG ON?
|
||
JRST SERCHF ;YES, ^V AND ^W ARE JUST TEXT
|
||
CAIE CH,26 ;^V?
|
||
CAIN CH,27 ;^W?
|
||
TRO F2,XMATCH ;YES, SET EXACT MATCH FLAG
|
||
SERCHF: AOS A,SRHCTR ;BUMP STRING CTR
|
||
CAILE A,^D80 ;STILL FIT IN STORE?
|
||
ERROR E.STC
|
||
IDPB CH,AA ;STORE CHARACTER
|
||
JRST SERCHC ;& GO BACK FOR MORE
|
||
|
||
SERCHG: AOS A,SRHCTR ;COUNT THE ^R (^Q)
|
||
CAILE A,^D80 ;[216] STILL FIT IN STORE?
|
||
ERROR E.STC ;[216] NO
|
||
IDPB CH,AA ;& STORE IT
|
||
PUSHJ P,SKRCH ;GET NEXT CHAR
|
||
ERROR E.USR
|
||
JRST SERCHF ;STORE IT AS TEXT
|
||
|
||
SERCHU: TRC F2,TXTCTL ;COMPLEMENT CONTROL CMD DISABLING SWITCH
|
||
JRST SERCHF
|
||
;SET UP SEARCH MATRIX
|
||
|
||
SERCH0: TRZ F2,TXTCTL ;REFRESH ^T FLAG
|
||
SETZM SCESQB ;CLR ^E[...] NEST CTR
|
||
MOVE B,SRHCTR ;INIT STRING CTR
|
||
MOVE AA,[POINT 7,SRHARG] ;& POINTER
|
||
MOVSI D,400000 ;INIT MATRIX BIT PTR
|
||
|
||
SERCH2: ILDB CH,AA ;CH:=NEXT SEARCH STRING CHARACTER.
|
||
SKIPN SCESQB ;GATHERING DATA FOR ^E[...]?
|
||
JRST .+3 ;NO
|
||
SOJL B,CNTREE ;YES, ERRORS GO TO ?ICE
|
||
JRST .+2
|
||
SOJL B,SERCHI ;END OF STRING?
|
||
MOVEI T,S2TABL ;CK FOR CTL CHAR IN STRING
|
||
TRNE F2,TXTCTL ;^T FLAG ON?
|
||
MOVEI T,S3TABL ;YES, USE RESTRICTED TABLE
|
||
PUSHJ P,DISP1
|
||
CHKEO EO21,SRCH2B ;IF EO=1, FORCE EXACT MODE
|
||
TRNN F2,TXTCTL ;IF ^T FLAG ON, ALL ^CHARS ARE LEGAL
|
||
PUSHJ P,CKNCC ;CK FOR OTHER CTRL-CHARS (THEY ARE ILLEGAL)
|
||
SRCH2E: TRNE F2,EMATCH ;IGNORE XMATCH FLAG?
|
||
JRST SRCH2F ;YES, FORCE ACCEPT-EITHER SEARCH
|
||
TRNN F2,XMATCH ;NO, XMATCH ON?
|
||
TLNE FF,PMATCH ;NO, PREVAILING EXACT MATCH FLAG ON?
|
||
JRST SRCH2B ;EMATCH=0 & XMATCH OR PMATCH =1 IMPLIES EXACT MODE
|
||
SRCH2F: CAIL CH,141 ;ACCEPT-EITHER SEARCH MODE
|
||
CAILE CH,172 ;IS IT LOWER CASE ALPHA?
|
||
SKIPA ;NO
|
||
TRZ CH,40 ;YES, MAKE IT UPPER CASE
|
||
CAIL CH,"A" ;IS IT UPPER CASE ALPHA?
|
||
CAILE CH,"Z"
|
||
JRST SERCH4 ;NO
|
||
XORM D,STAB+40(CH) ;ENABLE MATCH ON CORRESP. LC CHAR.
|
||
JRST SERCH4
|
||
|
||
SRCH2B: PUSHJ P,CASE ;EXACT MODE SEARCH -- ADJUST CASE
|
||
SERCH4: XORM D,STAB(CH) ;MARK CHARACTER TO MATCH
|
||
SERCH5: SKIPE SCESQB ;GATHERING DATA FOR A ^E[...]?
|
||
POPJ P, ;YES
|
||
TLZN F2,CTLN ;DOES ^N PRECEDE THIS CHAR POSITION?
|
||
JRST SERCH6 ;NO
|
||
ANDCAM D,STAB+BEGPAG ;YES, CLEAR ALL FAKE BITS
|
||
ANDCAM D,STAB+ENDPAG
|
||
ANDCAM D,STAB+SPCTAB
|
||
SERCH6: LSH D,-1 ;MOVE TO NEXT CHAR. POSITION IN MATRIX
|
||
SETZM SCESQB ;(BASE IS 0)
|
||
JUMPN D,SERCH2 ;36 CHARS SEEN YET? IF NOT CONTINUE.
|
||
JUMPE B,SERCHI ;TOO MUCH IF STILL ANOTHER CHAR WAITING
|
||
ERROR E.STL
|
||
;SCAN INSERT ARGUMENT IF F-SEARCH
|
||
|
||
SERCHI: TRNN FF,FSRCH ;F-SEARCHING?
|
||
JRST SERCH1 ;NO
|
||
TRZ F2,TXTCTL ;REFRESH ^T FLAG
|
||
MOVE CH,ARGTRM ;GET TERMINATOR TO WATCH FOR
|
||
JRST INSERA ;SCAN INSERT ARGUMENT
|
||
|
||
SERCHJ: POP P,COMBAK ;SAVE COMCNT & CPTR FOR THE INSERTION
|
||
POP P,CPTBAK
|
||
;THEN FALL INTO SERCH1
|
||
|
||
;START SEARCHING
|
||
|
||
SERCH1: MOVE AA,D ;END OF SEARCH MARKER
|
||
MOVE I,PT ;START SEARCHING AT PT
|
||
S1: TRNE FF,ARG ;IS THERE AN ARGUMENT?
|
||
JUMPLE E,FND ;YES. SEEN STRING N TIMES?
|
||
MOVE TT,I ;NO, FORM BYTE PTR WHICH WILL BE
|
||
SUBI TT,1 ;INCREMENTED BEFORE USE
|
||
IDIVI TT,5
|
||
HLL TT,BTAB(TT1)
|
||
CAMG I,BEG ;AT BEG OF BUFR?
|
||
SKIPL STAB+BEGPAG ;& 1ST SERCH CHAR = BEG OF BUFR CHAR?
|
||
JRST S3 ;NO
|
||
MOVSI D,200000 ;YES, START SEARCH AT 2ND SEARCH CHAR
|
||
MOVE TT1,TT ;SET DYNAMIC PTR = STATIC PTR
|
||
SETOM BCOUNT ;FLAG 1ST IS BEGPAG [117]
|
||
JRST S4B ;ENTER SEARCH LOOP
|
||
|
||
S3: MOVSI D,400000 ;START SEEKING MATCH FOR 1ST CHAR
|
||
MOVE TT1,TT ;SET DYNAMIC PTR=STATIC PTR
|
||
JRST S4A
|
||
S4: TDNE D,STAB+SPCTAB ;IS SPACE/TAB STRING BIT SET?
|
||
JRST SPTB ;YES
|
||
S4D: ADDI I,1 ;[223] LOOK AT NEXT LOC, XCEPT 1ST TIME THRU
|
||
S4C: LSH D,-1 ;ADVANCE TO NEXT CHAR POSITION
|
||
S4B: CAMN D,AA ;END OF SEARCH TABLE?
|
||
JRST FND ;YES.
|
||
S4A: ILDB CH,TT1 ;NO, GET NEXT CHAR
|
||
TDNE D,STAB(CH) ;IS IT A MATCH?
|
||
JRST S4 ;YES, GO TO NEXT TABLE ENTRY.
|
||
AOSN BCOUNT ;IF WE FAILED WITH BEGPAG [117]
|
||
JRST S3 ; THEN TRY AGAIN WITH 1ST CHAR [117]
|
||
CAML I,Z ;[213] REACHED TOP OF BUFFER?
|
||
JRST NOFND ;[213] YES.
|
||
AOS I,PT ;NO MATCH. PT:=PT+1
|
||
IBP TT ;MOVE STATIC BYTE PTR
|
||
JRST S3 ;KEEP LOOKING
|
||
FND: CAMLE I,Z ;REACH TOP OF BUFFER?
|
||
JRST NOFND ;YES. SEARCH FAILED.
|
||
SETOM SFINDF ;NO. SFINDF:=-1
|
||
MOVE A,I
|
||
SUB A,PT ;COMPUTE LENGTH OF SEARCH ARG
|
||
MOVEM I,PT ;MOVE PT PAST THE STRING
|
||
SOJG E,S1 ;FIND IT N TIMES?
|
||
TRNN FF,FSRCH ;F-SEARCH?
|
||
JRST FND3 ;NO
|
||
MOVE C,VVAL ;YES, GET INSERT SIZE
|
||
SUBI C,(A) ;INSERT MINUS DELETE
|
||
MOVNS A ;SET PT TO BEGINNING OF STRING FOUND
|
||
ADDM A,PT
|
||
CAIE C,0 ;[201] SKIP FOR SAME LENGTH STRINGS
|
||
PUSHJ P,NROOM ;STRETCH OR SCRUNCH THE HOLE
|
||
MOVE B,ARGTRM ;GET TERMINATOR TO LOOK FOR
|
||
MOVE A,COMBAK ;RESET COMCNT & CPTR TO BEGINNING
|
||
MOVEM A,COMCNT ; OF INSERT ARGUMENT
|
||
MOVE A,CPTBAK
|
||
MOVEM A,CPTR
|
||
PUSHJ P,INS1B ;INSERT THE 2ND ARG
|
||
PUSHJ P,ZEROTT ;DO AUTO-TYPE IF REQUIRED
|
||
MOVE CH,ARGTRM
|
||
SKIPN VVAL ;IS THERE A NON-NULL INSERT?
|
||
CAIE CH,ALT ;ALTMODE TERMINATOR?
|
||
JRST FND2 ;NO
|
||
TLO F2,NALTFS ;[174] SET NULL REPLACEMENT ALTMODE
|
||
;[174] DELIMITED F SEARCH FLAG
|
||
JRST ALTM1 ;YES, FS<STRING>$$ TERMINATES EXECUTION
|
||
FND3:
|
||
IFN VC,<MOVEM A,VVAL> ;SAVE LENGTH OF STRING
|
||
PUSHJ P,ZEROTT ;AUTOTYPE
|
||
FND2: TRZN FF,COLONF ;COLON MODIFIER?
|
||
SKIPGE (P) ;[210] NO, BUT IS THIS AN ITERATION?
|
||
JRST [ SKIPN COLOFL ;[231] IS AUTO-COLON DISABLED?
|
||
JRST FFOK ;[231] NO - TREAT LIKE COLON SEARCH
|
||
JRST RET ;[231] YES - JUST RETURN
|
||
] ;[231]
|
||
JRST RET ;[210] NIETHER
|
||
|
||
FFOK: MOVNI A,1 ;YES. RETURN VALUE OF -1
|
||
JRST VALRET
|
||
|
||
U COMBAK,1 ;STORE FOR COMCNT DURING FS, FN
|
||
U CPTBAK,1 ;DITTO CPTR
|
||
;AUTOTYPE AFTER SUCCESSFUL SEARCHES
|
||
; IF AUTOF IS NON-ZERO
|
||
; INCLUDE POINTER MARKER = ASCII CHAR IN AUTOF IF AUTOF > 0
|
||
|
||
ZEROTT: TRNE FF,COLONF ;NO AUTOTYPE ON COLON SEARCHES
|
||
POPJ P,
|
||
SKIPL -1(P) ;IN AN ITERATION?
|
||
SKIPN AUTOF ;AUTOTYPE WANTED?
|
||
POPJ P,
|
||
TRO FF,ARG ;DO 0T
|
||
SETZ B,
|
||
PUSHJ P,TYPE
|
||
HRRZ CH,AUTOF
|
||
SKIPL AUTOF ;PTR MARKER WANTED?
|
||
PUSHJ P,TYOM ;YES
|
||
MOVEI B,1 ;DO 1T
|
||
PUSHJ P,TYPE
|
||
TRZ FF,ARG
|
||
POPJ P,
|
||
NOFND: TDNN D,STAB+ENDPAG ;ENDPAG GOOD FOR A MATCH HERE?
|
||
JRST NOFND3 ;NO
|
||
LSH D,-1 ;YES, BUT ONLY IF THIS IS LAST SRH CHAR
|
||
CAMN D,AA
|
||
JRST FND ;ENDPAG MATCHES!
|
||
NOFND3: MOVE I,BEG ;SEARCH FAILED
|
||
MOVEM I,PT ;PT=BEG
|
||
SETZM SFINDF ;SFINDF=0
|
||
TRNE FF,PCHFLG+FINDR ;S SEARCH?
|
||
JRST NOFND1 ;NO.
|
||
|
||
|
||
BEGIN1: TRZN FF,COLONF ;YES. COLON MODIFIER?
|
||
JRST NOFND2 ;NO
|
||
|
||
|
||
BEGIN2: TRZ FF,PCHFLG+FINDR ;YES.
|
||
JRST BEGIN ;RETURN VALUE OF 0
|
||
|
||
|
||
|
||
NOFND1: MOVEM E,SRHCNT ;YES. SAVE SEARCH COUNT
|
||
MOVEM AA,SRHAA ;& SAVE END OF MATRIX MARKER
|
||
MOVEI B,1 ;PUNCH 1 PAGE ONLY
|
||
TRNE FF,PCHFLG ;N SEARCH?
|
||
PUSHJ P,PUNCHA ;YES. PUNCH THIS BUFFER AND REFILL IT.
|
||
TLNN FF,UREAD ;ANY INPUT FILE?
|
||
JRST BEGIN1 ;NO
|
||
TLNE FF,FINF ;MORE DATA?
|
||
TRNE FF,FORM
|
||
JRST NOFND4 ;YES
|
||
MOVE E,BEG ;EOF & NO FORM SEEN
|
||
CAMN E,Z ;CHECK BUFFER CONTENTS
|
||
JRST BEGIN1 ;NO MORE DATA
|
||
NOFND4: TRNE FF,FINDR ;LEFT ARROW SEARCH?
|
||
PUSHJ P,YANK1 ;YES. FILL BUFFER.
|
||
MOVE E,SRHCNT ;RESTORE SEARCH COUNT.
|
||
MOVE D,SRHAA ;RESTORE END OF STRING MARKER
|
||
JRST SERCH1 ;RESUME SEARCH
|
||
|
||
|
||
NOFND2: SKIPGE (P) ;IN AN ITERATION?
|
||
JRST BEGIN2 ;YES. RETURN VALUE OF 0
|
||
ERROR E.SRH
|
||
|
||
U SRHCNT,1 ;SEARCH COUNT STORE
|
||
U SRHAA,1 ;END OF SEARCH MATRIX MARKER
|
||
|
||
SRHMOD: EXP SRCHSW ;DEFAULT SEARCH MODE
|
||
;CNTR S MATCHES ANY SEPARATOR CHARACTER (I.E., ANY CHARACTER NOT
|
||
;A LETTER, NUMBER, PERIOD, DOLLAR SIGN OR PER CENT SYMBOL)
|
||
|
||
CNTRS: MOVE T,[-STABLN+3,,1] ;SET ALL CURRENT BITS EXCEPT NULL & SPCTAB
|
||
PUSHJ P,SETSTB ; & ENDPAG, BUT DO INCLUDE BEGPAG
|
||
XORM D,STAB+"." ;NOW, SCRATCH ALL SYMBOL CHARS
|
||
XORM D,STAB+"%"
|
||
XORM D,STAB+"$"
|
||
MOVE T,[-^D10,,"0"] ;DIGITS
|
||
PUSHJ P,SETSTB
|
||
CNTLEA: MOVE T,[-^D26,,"A"] ;UC CHARS (ENTRY FOR ^EA)
|
||
PUSHJ P,SETSTB
|
||
CNTLEV: MOVE T,[-^D26,,141] ;LC CHARS (ENTRY FOR ^EV)
|
||
JRST CNTRXX
|
||
|
||
;CNTR X MATCHES ANY ARBITRARY CHARACTER
|
||
|
||
CNTRX: MOVE T,[-STABLN+4,,1] ;WANT TO ACCEPT ANYTHING AS A MATCH
|
||
CNTRXX: PUSHJ P,SETSTB ; EXCEPT NULL & SPCTAB & BEGPAG & ENDPAG
|
||
JRST SERCH5
|
||
|
||
;CNTR N REVERSES THE SENSE OF THE SEARCH FOR THE NEXT CHARACTER
|
||
|
||
CNTRN: MOVE T,[-STABLN+4,,1] ;STAB CTR & PTR
|
||
PUSHJ P,SETSTB ;SET CURRENT POSITION BIT FOR ALL CHARS
|
||
TLO F2,CTLN ;SET ^N FLAG
|
||
JRST SERCH2
|
||
|
||
;SET STAB BITS AS INDICATED BY T & D
|
||
|
||
SETSTB: XORM D,STAB(T)
|
||
AOBJN T,.-1
|
||
POPJ P,
|
||
|
||
;DISPATCH TABLE FOR 2ND SCAN OF SEARCH STRING
|
||
|
||
S2TABL: XWD CNTRE,05 ;^E
|
||
XWD CNTRX,30 ;^X
|
||
XWD CNTRN,16 ;^N
|
||
XWD CNTRS,23 ;^S
|
||
XWD CNTRV,26 ;^V
|
||
XWD CNTRW,27 ;^W
|
||
XWD CNTRL,34 ;^\
|
||
XWD CNTRU,36 ;^^
|
||
S3TABL: XWD CNTRT,24 ;^T
|
||
XWD CNTRQ,21 ;^Q
|
||
XWD CNTRR,22 ;^R
|
||
XWD CNTR33,ALT ;ALTMODE
|
||
XWD 0,0 ;END OF LIST
|
||
;^E COMMANDS
|
||
|
||
CNTRE: CHKEO EO21,SERCH4 ;IF EO=1, ^E IS JUST TEXT
|
||
ILDB CH,AA ;GET CHAR. AFTER ^E
|
||
SOJL B,CNTREE ;NONE THERE
|
||
MOVEI T,S4TABL ;GO TO PROPER ^E COMMAND
|
||
PUSHJ P,DISPAT ; TO SET SPECIFIED CHARACTER BITS
|
||
CNTREE: ERROR E.ICE
|
||
|
||
;DISPATCH TABLE FOR ^E COMMANDS
|
||
|
||
S4TABL: XWD CNTLEA,"A" ;^EA ACCEPT ANY ALPHA
|
||
XWD CNTLEV,"V" ;^EV ACCEPT ANY L.C. ALPHA
|
||
XWD CNTLEW,"W" ;^EW ACCEPT ANY U.C. ALPHA
|
||
XWD CNTLED,"D" ;^ED ACCEPT ANY DIGIT
|
||
XWD CNTLEL,"L" ;^EL ACCEPT ANY E-O-L CHAR.
|
||
XWD CNTLES,"S" ;^ES ACCEPT A STRING OF SPACES OR TABS
|
||
XWD CNTLEN,74 ;^E<NNN> ACCEPT ASCII <NNN>
|
||
XWD CNTLEB,133 ;^E[A,B,C] ACCEPT A OR B OR C
|
||
XWD 0,0 ;END OF LIST
|
||
|
||
U SCESQB,1 ;SEARCH FOR ^E[...] NESTING COUNTER
|
||
;^EW
|
||
|
||
CNTLEW: MOVE T,[-^D26,,"A"] ;UPPER CASE ALPHABETIC CHARS.
|
||
JRST CNTRXX
|
||
|
||
;^ED
|
||
|
||
CNTLED: MOVE T,[-^D10,,"0"] ;DIGITS
|
||
JRST CNTRXX
|
||
|
||
;^EL
|
||
|
||
CNTLEL: MOVE I,Z ;IS LAST CHAR IN BUFR AN EOL?
|
||
CAMG I,BEG
|
||
JRST CNTLE3 ;NO
|
||
SUBI I,1
|
||
PUSHJ P,GET
|
||
CAIL CH,12
|
||
CAILE CH,14
|
||
CNTLE3: XORM D,STAB+ENDPAG ;NO, ENDPAG IS GOOD FOR A MATCH
|
||
MOVE T,[-3,,12] ;LF, VT, FF
|
||
JRST CNTRXX
|
||
|
||
;^ES
|
||
|
||
CNTLES: XORM D,STAB+40 ;SPACE
|
||
XORM D,STAB+11 ;TAB
|
||
XORM D,STAB+SPCTAB ;& SPACE/TAB STRING BIT
|
||
JRST SERCH5
|
||
|
||
;SKIP OVER A STRING OF SPACES AND/OR TABS WHILE SEARCHING
|
||
|
||
SPTB: CAIE CH,40 ;[223] HAVE ALREADY MATCHED
|
||
CAIN CH,11 ;[223] ON OTHER THAN SP/TAB?
|
||
JRST SPTB1 ;[223] NO, LOOK FOR SP/TABS
|
||
JRST S4D ;[223] YES, NEXT SEARCH POSITION
|
||
SPTB1: ADDI I,1 ;[223] ADVANCE TO NEXT BUFFER LOCATION
|
||
CAML I,Z ;END-OF BUFFER?
|
||
JRST S4C ;YES, NO MORE SPACE/TABS
|
||
MOVEM TT1,ERR1 ;SAVE CURRENT BYTE PTR (USING ERR1 AS TMP)
|
||
ILDB CH,TT1 ;LOOK AT NEXT CHAR
|
||
CAIE CH,40 ;IS IT A SPACE?
|
||
CAIN CH,11 ;OR TAB?
|
||
JRST SPTB1 ;[223] YES, KEEP SKIPPING
|
||
MOVE TT1,ERR1 ;NO, END OF SPACE/TAB STRING
|
||
JRST S4C ; RESTORE BYTE-POINTER & CONTINUE SEARCH
|
||
;^E[A,B,C,...]
|
||
|
||
CNTLEB: AOS SCESQB ;BUMP ^E[...] NEST CTR
|
||
CNTLE0: PUSHJ P,SERCH2 ;GET CHAR FROM OR-STRING
|
||
ILDB CH,AA ;GET SEPARATOR
|
||
SOJL B,CNTREE
|
||
CAIN CH,"," ;MORE TO GO?
|
||
JRST CNTLE0 ;COMMA IMPLIES YES
|
||
CAIE CH,"]" ;END OF OR-STRING?
|
||
ERROR E.ICE
|
||
SOS SCESQB ;DECREMENT ^E[...] NEST CTR
|
||
JRST SERCH5 ;YES
|
||
|
||
;^E<NNN> (NNN IS OCTAL FOR A SINGLE ASCII CHAR)
|
||
|
||
CNTLEN: MOVEI A,0 ;CLR NUMBER ACCUMULATOR
|
||
CNTLE1: ILDB CH,AA ;GET A DIGIT
|
||
SOJL B,CNTREE ;SHOULDN'T RUN OUT
|
||
CAIN CH,76 ;RIGHT ANGLE-BRACKET?
|
||
JRST CNTLE2 ;YES, END OF NUMBER
|
||
CAIL CH,"0" ;IS IT A DIGIT?
|
||
CAILE CH,"7"
|
||
ERROR E.ICE
|
||
LSH A,3 ;YES, SCALE UP THE PREVIOUS VALUE
|
||
ADDI A,-60(CH) ;AND ADD IN THE NEW DIGIT
|
||
JRST CNTLE1 ;TRY FOR MORE
|
||
CNTLE2: ANDI A,177 ;EXTRACT AN ASCII CHAR.
|
||
XORM D,STAB(A) ;AND SET THE CORRESP. BIT
|
||
JRST SERCH5
|
||
;^R IS SAME AS ^Q (PROVIDED EO NOT = 1)
|
||
;EXCEPT IT DOESN'T CAUSE RUBOUT PROBLEMS
|
||
|
||
CNTRR: CHKEO EO21,SERCH4 ;IF EO=1, ^R IS JUST TEXT
|
||
|
||
;^Q CAUSES NEXT CHAR TO BE TAKEN AS TEXT EVEN IF IT IS
|
||
;A CTRL CHAR. OR THE TERMINATOR
|
||
|
||
CNTRQ: ILDB CH,AA ;GET NEXT CHAR
|
||
SOJA B,SRCH2E ;& PROCESS AS ORDINARY TEXT
|
||
|
||
;^V CAUSES NEXT CHAR TO BE TAKEN AS LOWER CASE
|
||
;^V^V SETS LOWER CASE MODE UNTIL FURTHER NOTICE
|
||
|
||
CNTRV: CHKEO EO21,SERCH4 ;IF EO=1, ^V IS JUST TEXT
|
||
PUSHJ P,C.V ;SET ^V FLAGS
|
||
JRST SERCH2
|
||
|
||
;^W CAUSES NEXT CHAR TO BE TAKEN WITHOUT CONVERSION
|
||
;^W^W SETS STANDARD CASE MODE UNTIL FURTHER NOTICE
|
||
|
||
CNTRW: CHKEO EO21,SERCH4 ;IF EO=1, ^W IS JUST TEXT
|
||
PUSHJ P,C.W ;SET ^W FLAGS
|
||
JRST SERCH2
|
||
|
||
;FIRST ^\ CHANGES MATCH MODE TO ACCEPT EITHER UC OR LC
|
||
;SECOND ONE TURNS ACCEPT EITHER FLAG OFF
|
||
|
||
CNTRL: CHKEO EO21,SERCH4 ;IF EO=1, ^\ IS JUST TEXT
|
||
TRC F2,EMATCH ;COMPLEMENT ACCEPT EITHER FLAG
|
||
JRST SERCH2
|
||
|
||
;IF SEARCHING FOR ALTMODE, AND IF EO=1, 033 & 175 ARE MATCHES
|
||
|
||
CNTR33: CHKEO EO21,.+2 ;EO=1?
|
||
JRST SERCH4 ;NO, ACCEPT 033 ONLY
|
||
XORM D,STAB+175 ;YES, MARK 175 AS ACCEPTABLE MATCH
|
||
JRST SERCH4 ;& 033
|
||
|
||
;^^ CAUSES IMMEDIATELY FOLLOWING @,[,\,],^,_ TO BE CONVERTED TO LC RANGE
|
||
|
||
CNTRU: CHKEO EO21,SERCH4 ;IF EO=1, ^^ IS TEXT
|
||
ILDB CH,AA ;GET NEXT CHAR
|
||
PUSHJ P,CVTSPC ;CONVERT TO LC IF @, ETC
|
||
SOJGE B,SRCH2E ;[222] CONTINUE UNLESS NO CHAR
|
||
ERROR E.MCO ;[222] FOR US TO LOWER CASEIFY
|
||
|
||
;^T DISABLES ALL CNTRL COMMANDS EXCEPT ^Q,^R,^T AND ALLOWS ALL OTHER
|
||
;CNTRL CHARS AS TEXT. THE NEXT ^T TURNS THE ^T SWITCH BACK OFF.
|
||
|
||
CNTRT: CHKEO EO21,SERCH4 ;IF EO=1, ^T IS TEXT
|
||
TRC F2,TXTCTL
|
||
JRST SERCH2
|
||
;F SEARCHES
|
||
|
||
FCMD: PUSHJ P,SKRCH ;GET CHAR AFTER F
|
||
ERROR E.MEF
|
||
TRO FF,FSRCH ;SET F-SEARCH FLAG
|
||
TRZ CH,40 ;UPPER OR LOWER CASE [114]
|
||
CAIN CH,"S" ;FS?
|
||
JRST SERCH ;YES
|
||
CAIN CH,"N" ;FN?
|
||
JRST SERCHP ;YES
|
||
ERROR E.IFC
|
||
;<> ITERATION BRACKETS. COMMAND INTERPRETATION IS SENT
|
||
; BACK TO THE < WHEN THE > IS ENCOUNTERED.
|
||
|
||
LSSTH: PUSH P,ITERCT ;SAVE ITERATION COUNT
|
||
PUSH P,COMAX ;[161] KEEP MAX. FOR GARBAGE COLLECTION
|
||
PUSH P,CPTR ;SAVE COMMAND STATE
|
||
PUSH P,COMCNT
|
||
SETOM ITERCT ;ITERCT:=-1
|
||
PUSH P,ITERCT ;-1 FLAGS ITERATION ON PDL
|
||
TRZN FF,ARG ;IS THERE AN ARGUMENT?
|
||
JRST RET ;NO
|
||
JUMPLE B,INCMA1 ;IF ARG NOT > 0, SKIP OVER <>
|
||
MOVEM B,ITERCT ;YES. ITERCT:=ARGUMENT
|
||
JRST RET
|
||
|
||
|
||
GRTH: SKIPGE A,(P) ;IS THERE A LEFT ANGLE BRACKET?
|
||
JRST GRTH2 ;YES. OTHERWISE ITS A MISSING < OR
|
||
SOJE A,GRTH9 ;SOMETHING LIKE <...(...>
|
||
ERROR E.MLA
|
||
GRTH2: SOSN ITERCT ;ITERCT:=ITERCT-1. DONE?
|
||
JRST INCMA2 ;YES
|
||
MOVE A,-2(P) ;NO. RESTORE COMMAND STATE TO START OF ITERATION.
|
||
MOVEM A,CPTR
|
||
MOVE A,-1(P)
|
||
MOVEM A,COMCNT
|
||
TRNE FF,TRACEF ;TRACING?
|
||
PUSHJ P,CRR ;YES. OUTPUT CRLF
|
||
JRST RET
|
||
|
||
GRTH9: ERROR E.MRP
|
||
|
||
U ITERCT,1 ;
|
||
U SFINDF,1 ;
|
||
;; IF NOT IN AN ITERATION, GIVES ERROR. IF IN AN ITERATION AND
|
||
; IF THE MOST RECENT SEARCH FAILED, SEND COMMAND TO FIRST UNMATCHED
|
||
; > TO THE RIGHT. OTHERWISE, NO EFFECT.
|
||
|
||
SEMICL: SKIPL (P) ;ERROR IF NOT IN <...>
|
||
ERROR E.SNI
|
||
TRNN FF,ARG ;YES. IF NO ARG,
|
||
MOVE B,SFINDF ;USE LAST SEARCH SWITCH (0 OR -1).
|
||
JUMPL B,CD ;IF ARG <0, JUST RET + EXECUTE LOOP
|
||
INCMA1: MOVEI TT,">" ;SKAN FOR >
|
||
MOVEI TT1,"<" ;IGNORE <...> STRINGS
|
||
PUSHJ P,SKAN
|
||
|
||
ERROR E.MRA
|
||
INCMA2: SUB P,[XWD 3,3] ;[161] POP OUT A LEVEL
|
||
POP P,COMAX ;[161]
|
||
POP P,ITERCT
|
||
JRST RET
|
||
|
||
|
||
|
||
;!TAG! TAG DEFINITION. THE TAG IS A NAME FOR THE LOCATION IT
|
||
; APPEARS IN IN A MACRO, ITERATION OR COMMAND STRING.
|
||
|
||
EXCLAM: PUSHJ P,SKRCH ;LOOK FOR NEXT !
|
||
ERROR E.UTG
|
||
CAIE CH,"!"
|
||
JRST EXCLAM
|
||
JRST RET
|
||
;OTAG$ GO TO THE TAG NAMED TAG. THE TAG MUST APPEAR IN THE
|
||
; CURRENT MACRO OR COMMAND STRING.
|
||
|
||
OG: MOVE A,CPTR
|
||
MOVE AA,A
|
||
IDIVI AA,17
|
||
CAMN A,SYMS(B)
|
||
JRST OGFND
|
||
SKIPN SYMS(B)
|
||
JRST OGNF
|
||
CAMN A,SYMS+1(B)
|
||
|
||
ES1: AOJA B,OGFND
|
||
SKIPN SYMS+1(B)
|
||
ES2: AOJA B,OGNF
|
||
CAMN A,SYMS+2(B)
|
||
AOJA B,ES1
|
||
SKIPN SYMS+2(B)
|
||
ADDI B,2
|
||
|
||
OGNF: PUSH P,CPTR
|
||
PUSH P,B
|
||
MOVEI D,STAB
|
||
OGW: CAIG D,STAB+STABLN-2 ;[156] IS THE TAG TOO LONG?
|
||
JRST OG1 ;[156] NO, CONTINUE
|
||
ERROR E.TTL
|
||
OG1: PUSHJ P,SKRCH ;GET NEXT COMMAND CHAR
|
||
|
||
ERROR E.MEO
|
||
MOVEM CH,(D) ;STAB ... _ TAG
|
||
CAIE CH,ALT
|
||
AOJA D,OGW
|
||
MOVEI A,"!" ;TAG TERMINATOR
|
||
MOVEM A,(D)
|
||
SETZM 1(D)
|
||
MOVE B,COMCNT ;MAKE PTR TO START OF THIS COMMAND LEVEL
|
||
SUB B,COMAX
|
||
IDIVI B,5
|
||
ADD B,CPTR
|
||
JUMPE E,OG7 ;NO REMAINDER
|
||
SOS B
|
||
MOVMS E
|
||
JRST .(E)
|
||
IBP B
|
||
IBP B
|
||
IBP B
|
||
IBP B
|
||
OG7: MOVEM B,CPTR
|
||
MOVE B,COMAX ;GET # OF CMD CHARS AT THIS LEVEL
|
||
MOVEM B,COMCNT
|
||
OG2: MOVEI TT,"!" ;SKAN FOR !
|
||
MOVEI TT1,-1 ;NO SECONDARY CHAR.
|
||
PUSHJ P,SKAN
|
||
ERROR E.TAG
|
||
TRO F2,NOTRAC ;DON'T TYPE EVERY TAG WHILE TRACING
|
||
MOVEI E,STAB ;INIT SEARCH STRING TO 1ST CHAR AFTER !
|
||
OG5: SKIPN (E) ;OVER STRING?
|
||
JRST OG3 ;YES
|
||
PUSHJ P,SKRCH ;NO. GET A CHAR
|
||
ERROR E.TAG
|
||
CAMN CH,(E) ;MATCH ?
|
||
AOJA E,OG5 ;YES. MOVE ON.
|
||
CAIN CH,"!" ;NO, ARE WE AT END OF A TAG?
|
||
JRST OG2 ;YES, LOOK FOR ANOTHER
|
||
MOVEI E,"!" ;NO, SKIP TO NEXT !
|
||
OG6: PUSHJ P,SKRCH ;GET NEXT CHAR OF TAG
|
||
ERROR E.UTG
|
||
CAIE CH,(E) ;!?
|
||
JRST OG6 ;NO, KEEP GOING
|
||
JRST OG2 ;YES, LOOK FOR ANOTHER TAG
|
||
|
||
OG3: TRZ F2,NOTRAC ;RE-ENABLE TRACING
|
||
POP P,A ;GET INDEX TO SYMBOL TABLE
|
||
POP P,SYMS(A) ;SAVE POSITION OF THIS O COMMAND
|
||
MOVE B,COMCNT ;SAVE COMCNT FOR THIS TAG
|
||
MOVEM B,CNTS(A)
|
||
MOVE B,CPTR ;SAVE TAG POSITION IN COMMAND STRING
|
||
MOVEM B,VALS(A)
|
||
JRST RET
|
||
|
||
|
||
OGFND: MOVE A,VALS(B)
|
||
MOVEM A,CPTR
|
||
MOVE A,CNTS(B)
|
||
MOVEM A,COMCNT
|
||
JRST RET
|
||
;N"G HAS NO EFFECT IF N IS GREATER THAT 0. OTHERWISE,
|
||
; SEND COMMAND INTERPRETATION TO NEXT MATCHING '.
|
||
; THE " AND ' MATCH SIMILAR TO ( AND ).
|
||
;N"L SEND COMMAND TO MATCHING ' UNLESS N<0.
|
||
;N"N SEND COMMAND TO MATCHING ' UNLESS N NOT = 0.
|
||
;N"E SEND COMMAND TO MATCHING ' UNLESS N=0.
|
||
;N"F SEND COMMAND TO MATCHING ' UNLESS N=0.
|
||
;N"U SEND COMMAND TO MATCHING ' UNLESS N=0.
|
||
;N"T SEND COMMAND TO MATCHING ' UNLESS N<0.
|
||
;N"S SEND COMMAND TO MATCHING ' UNLESS N<0.
|
||
;N"C SEND COMMAND TO MATCHING ' UNLESS THE VALUE OF N AS AN ASCII
|
||
; CHARACTER IS A LETTER, NUMBER, PERIOD (.), DOLLAR SIGN ($),
|
||
; OR PER CENT (%).
|
||
;N"A SEND COMMAND TO MATCHING ' UNLESS THE VALUE OF N AS AN ASCII
|
||
; CHARACTER IS ALPHABETIC.
|
||
;N"D SEND COMMAND TO MATCHING ' UNLESS THE VALUE OF N AS AN ASCII
|
||
; CHARACTER IS A DIGIT.
|
||
;N"V SEND COMMAND TO MATCHING ' UNLESS THE VALUE OF N AS AN ASCII
|
||
; CHARACTER IS LOWER CASE ALPHABETIC.
|
||
;N"W SEND COMMAND TO MATCHING ' UNLESS THE VALUE OF N AS AN ASCII
|
||
; CHARACTER IS UPPER CASE ALPHABETIC.
|
||
|
||
DQUOTE: TRNN FF,ARG ;ERROR IF NO ARG BEFORE "
|
||
ERROR E.NAQ
|
||
PUSHJ P,SKRCH ;GET CHAR AFTER "
|
||
ERROR E.MEQ
|
||
MOVEI T,DQTABL ;INDEX DISPATCH TABLE
|
||
PUSHJ P,DISPAT ;DISPATCH FOR CHAR. AFTER "
|
||
ERROR E.IQC
|
||
|
||
;" COMMAND DISPATCH TABLE
|
||
|
||
DQTABL: XWD DQ.G,"G"
|
||
XWD DQ.L,"L"
|
||
XWD DQ.N,"N"
|
||
XWD DQ.E,"E"
|
||
XWD DQ.C,"C"
|
||
XWD DQ.L,"T"
|
||
XWD DQ.E,"F"
|
||
XWD DQ.L,"S"
|
||
XWD DQ.E,"U"
|
||
XWD DQ.A,"A"
|
||
XWD DQ.D,"D"
|
||
XWD DQ.V,"V"
|
||
XWD DQ.W,"W"
|
||
XWD 0,0 ;END OF LIST
|
||
;EXECUTE INDIVIDUAL " COMMANDS
|
||
|
||
DQ.V: TRZN B,40 ;EXECUTE "V
|
||
JRST NOGO ;IF BIT 30 NOT ON IT CAN'T BE L.C.
|
||
DQ.A: TRZ B,40 ;EXECUTE "A -- TREAT UC & LC ALIKE
|
||
DQ.W: CAIL B,"A" ;EXECUTE "W
|
||
CAILE B,"Z"
|
||
JRST NOGO ;IT IS NOT A LETTER
|
||
JRST RET ;IT IS A LETTER
|
||
DQ.D: CAIL B,"0" ;EXECUTE "D
|
||
CAILE B,"9"
|
||
JRST NOGO ;IT IS NOT A DIGIT
|
||
JRST RET ;IT IS A DIGIT
|
||
DQ.C: PUSHJ P,CKSYM1 ;EXECUTE "C
|
||
JRST RET ;IT IS A SYMBOL CHAR
|
||
JRST NOGO ;IT'S NOT A SYMBOL CHAR
|
||
DQ.G: MOVNS B ;EXECUTE "G
|
||
DQ.L: JUMPL B,RET ;EXECUTE "L
|
||
JRST NOGO ;TEST FAILED
|
||
DQ.N: JUMPN B,RET ;EXECUTE "N
|
||
JRST NOGO ;TEST FAILED
|
||
DQ.E: JUMPE B,RET ;EXECUTE "E, "F, "U
|
||
NOGO: MOVEI TT,47 ;SKAN FOR '
|
||
MOVEI TT1,42 ;IGNORE "...' STRINGS
|
||
PUSHJ P,SKAN
|
||
ERROR E.MAP
|
||
JRST RET
|
||
;ROUTINE TO TEST CHARACTER FOR $,%,.,0-9,A-Z
|
||
;CALL PUSHJ P,CKSYM
|
||
; RETURN IF $,%,.,0-9,A-Z
|
||
; RETURN ON ALL OTHER CHARACTERS
|
||
|
||
CKSYM: MOVEI B,(CH) ;ENTER AT CKSYM1 IF CHAR ALREADY IN B
|
||
CKSYM1: CAIE B,"$" ;$ OR %?
|
||
CAIN B,"%"
|
||
POPJ P, ;YES
|
||
CAIN B,"." ;NO. POINT?
|
||
POPJ P, ;YES.
|
||
CAIGE B,"0" ;NO. DIGIT OR LETTER?
|
||
JRST CPOPJ1 ;NO
|
||
CAIG B,"9" ;MAYBE. DIGIT?
|
||
POPJ P, ;YES.
|
||
CKSYM2: TRZ B,40 ;LC TO UC
|
||
CAIL B,"A" ;LETTER?
|
||
CAILE B,"Z"
|
||
JRST CPOPJ1 ;NO.
|
||
POPJ P, ;YES
|
||
;ERROR MESSAGE PRINTOUT
|
||
|
||
ERRP: TRO FF,QMFLG ;ERROR PROCEDURE IN PROGRESS
|
||
;ERRP+1/2 [164]
|
||
MOVE B,.JBREL ;[164] SAVE CURRENT CORE
|
||
MOVEM B,RELSAV ;[164]
|
||
HRLZ B,.JBUUO ;GET ERROR CODE
|
||
CLRBFI ;CLEAR TTY
|
||
PUSHJ P,TTOPEN
|
||
MOVEI CH,"?" ;TYPE ?
|
||
PUSHJ P,TYOM
|
||
HLLZ TT,B ;PRINT CODE
|
||
PUSHJ P,SIXBMS
|
||
LDB D,[POINT 4,.JBUUO,12] ;GET SPECIAL TYPEOUT FLAG
|
||
JUMPE D,ERRP04 ;NO SPECIAL ERROR EXTENSION
|
||
CAIN D,3 ;FLAG=EE3?
|
||
JRST ERRP05 ;YES
|
||
MOVEI CH,"-" ;NO, TYPE EXTENSION (MONITOR ERROR CODE)
|
||
PUSHJ P,TYOM
|
||
LDB B,[POINT 15,XEXT,35] ;[175] GET UUO ERROR FLAG
|
||
SOJLE D,ERRP03 ;1 IMPLIES IT IS A UUO ERROR
|
||
HRRZI B,740000 ;GET I-O ERROR FLAGS
|
||
AND B,ARGSTO
|
||
ERRP03: PUSHJ P,OCTMS ;TYPE ERROR CODE IN OCTAL
|
||
ERRP04: MOVE B,ERRLEN ;HOW MUCH MESSAGE WANTED?
|
||
JUMPGE B,ERRP02 ;AT LEAST 1ST FULL LINE
|
||
PUSHJ P,CRR ;HE WANTS ONLY ?XXX, SO END LINE
|
||
JRST ERRP5 ;BETTER SEE IF HE WANTS MORE
|
||
ERRP02: MOVEI CH,11 ;1ST LINE OF MESSAGE AUTOMATIC
|
||
PUSHJ P,TYOM ;TYPE TAB
|
||
ERRP0: INIT ERRCHN,0 ;INIT INPUT FROM SYS:
|
||
SIXBIT /SYS/
|
||
XWD 0,ERRHDR
|
||
JRST NOERRS ;CAN'T
|
||
MOVE B,RELSAV ;[177] SETUP FOR GRABJR CALL BELOW
|
||
MOVE TT,Z ;GET ACTUAL FIRST FREE LOC
|
||
IDIVI TT,5
|
||
ADDI TT,2
|
||
MOVEI T,<BUFSIZ+3>*2(TT) ;ROOM FOR 2 DISK BUFFERS?
|
||
CAML T,.JBFF
|
||
PUSHJ P,GRABJR ;NO, GET 1K CORE
|
||
EXCH TT,.JBFF ;GET INPUT BUFFER
|
||
INBUF ERRCHN,2
|
||
MOVEM TT,.JBFF
|
||
MOVSI A,(SIXBIT /ERR/)
|
||
MOVEM A,TECERR+1 ;SET UP FILE EXTENSION
|
||
SETZM TECERR+2
|
||
SETZM TECERR+3
|
||
HRL A,JOBN ;GET JOBNUMBER
|
||
HRRI A,JBTPRG ;& JOBNAME TABLE ADDRESS
|
||
GETTAB A, ;GET JOBNAME
|
||
JRST ERRP01 ;CAN'T
|
||
MOVEM A,TECERR ;SET FILE NAME
|
||
LOOKUP ERRCHN,TECERR ;LOOKUP JOBNAME.ERR
|
||
JRST ERRP01 ;NOT THERE, SO USE TECO.ERR
|
||
JRST ERRP1 ;FOUND
|
||
ERRP01: MOVE A,[SIXBIT /TECO/]
|
||
MOVEM A,TECERR
|
||
LOOKUP ERRCHN,TECERR ;FIND TECO.ERR
|
||
JRST NOERRS ;NOT ON SYS:
|
||
ERRP1: PUSHJ P,ERRCHR ;GET A CHAR. FROM TECO.ERR
|
||
CAIE CH,"?" ;LOOK FOR START OF A MESSAGE
|
||
JRST ERRP1 ;NO, TRY NEXT
|
||
SETZ T, ;YES, INIT RESULT ACCUMULATOR
|
||
HRRZ D,.JBUUO ;GET ERROR CODE AGAIN
|
||
ERRP2: PUSHJ P,ERRCHR ;GET NEXT CHAR
|
||
CAIN CH,11 ;TAB?
|
||
JRST ERRP3 ;YES
|
||
LSH T,6 ;SCALE PREV. RESULT UP ONE CHAR
|
||
ADDI T,-40(CH) ;ADD NEW SIXBIT CHAR TO PREVIOUS RESULT
|
||
JRST ERRP2
|
||
ERRP3: CAME D,T ;IS THIS CODE EQUAL TO THE ERROR CODE?
|
||
JRST ERRP1 ;NO, KEEP GOING
|
||
PUSHJ P,ERRPRN ;YES, PRINT EVERYTHING UP TO THE LF
|
||
TRO FF,EMFLAG ;NOTE THAT THE 1ST LINE HAS BEEN TYPED
|
||
JRST ERRP5
|
||
NOERRS: TRO FF,XPLNFL+EMFLAG ;CANT DO /
|
||
JSP A,CONMES ;PRINT BAD NEWS
|
||
ASCIZ /
|
||
?EEE Unable to Read Error Message File
|
||
/
|
||
ERRP5: MOVE A,COMAX
|
||
SUB A,COMCNT
|
||
MOVEM A,ERR1 ;ERR1:=COMAX-COMCNT
|
||
MOVE A,CPTR
|
||
MOVEM A,ERR2 ;ERR2:=CPTR
|
||
MOVE A,ERRLEN ;DOES HE WANT THE WHOLE THING AUTOMATICALLY?
|
||
TRNN FF,XPLNFL ;[162] IF SO, CAN WE GIVE IT TO HIM?
|
||
JUMPG A,XPLAIN ;YES
|
||
|
||
ERRP6: TLZN FF,CCLFLG ;GET HERE FROM A "TECO" COMMAND?
|
||
JRST ERRP6A ;NO
|
||
LDB CH,[POINT 15,XEXT,35] ;[175] CHECK FOR ?FNF-00
|
||
JUMPN CH,ERRP6A ;IT'S NOT
|
||
HRRZ CH,.JBUUO ;MAYBE
|
||
CAIE CH,(SIXBIT /FNF/) ;[232]
|
||
JRST ERRP6A ;[232] NO
|
||
CLOSE OUTCHN,CL.RST ;[232] YES - DON'T SUPERCEDE OLD FILE.
|
||
JRST DECDMP ;YES, POP UP TO MONITOR
|
||
ERRP6A: MOVEI CH,"*" ;TYPE * FOR NEXT COMMAND
|
||
PUSHJ P,TYOM
|
||
TRO FF,DDTMF
|
||
PUSHJ P,TYI ;GET A CHARACTER NOW
|
||
CAIN CH,"?" ;QUESTION MARK?
|
||
JRST ERRTYP ;YES, TYPE BAD COMMAND
|
||
TRNE FF,XPLNFL ;EXPLANATION TYPED YET?
|
||
JRST ERRP7 ;YES, CAN'T DO THAT AGAIN
|
||
CAIE CH,"/" ;NO, IS IT A SLASH?
|
||
JRST ERRP7 ;NO
|
||
TRNN FF,EMFLAG ;YES, 1ST LINE DONE YET?
|
||
JRST ERRP0 ;NO
|
||
JRST XPLAIN ;OK, TYPE MORE EXPLANATION OF ERROR
|
||
|
||
ERRP7: RELEAS ERRCHN,
|
||
TRNN FF,XPLNFL+EMFLAG ;MED OR LONG MSG TYPED? [125]
|
||
JRST GOE ;NO, SKIP CORE CONTRACTN[125]
|
||
MOVE B,RELSAV ;GO BACK TO CORE WE HAD BEFORE
|
||
CORE B,
|
||
JFCL ;REDUCTION WON'T FAIL
|
||
JRST GOE ;GET REST OF COMMAND
|
||
|
||
U TECERR,4 ;LOOKUP SPECS FOR TECO.ERR
|
||
U ERRHDR,3 ;RING HEADER FOR TECO.ERR
|
||
U RELSAV,1 ;STORE FOR .JBREL
|
||
U ARGSTO,1 ;STORE FOR ARGUMENT (IF ANY)
|
||
ERRPRN: PUSHJ P,ERRCHR ;GET A CHAR FROM ERR. FILE
|
||
ERRPR2: CAIE CH,16 ;^N?
|
||
JRST ERRPR3 ;NO, SKIP
|
||
PUSHJ P,ERRCHR ;GET 1ST DIGIT AFTER ^N
|
||
MOVEI T,-60(CH)
|
||
IMULI T,^D10 ;PUT IT IN TEN'S PLACE
|
||
PUSHJ P,ERRCHR ;GET 2ND DIGIT
|
||
ADDI T,-60(CH)
|
||
ROT T,-1 ;DIVIDE TOTAL BY 2 & SAVE BIT 35
|
||
HLRZ CH,ETABL(T) ;GET LEFT SIDE ADDR IN CASE EVEN
|
||
TLNE T,400000 ;EVEN OR ODD?
|
||
HRRZ CH,ETABL(T) ;ODD, GET ADDR FROM RIGHT SIDE
|
||
JRST (CH) ;TYPE SPECIAL INFORMATION
|
||
|
||
ERRPR3: PUSHJ P,TYOM ;PRINT NORMAL CHARS.
|
||
CAIE CH,12 ;LF?
|
||
JRST ERRPRN ;NO
|
||
POPJ P,
|
||
|
||
;GET A CHARACTER FROM SYS:TECO.ERR
|
||
|
||
ERRCHR: SOSG ERRHDR+2 ;ANY CHARS. IN BUFFER?
|
||
JRST ERRCH2 ;NO
|
||
ERRCH1: ILDB CH,ERRHDR+1 ;YES, GET NEXT
|
||
JUMPE CH,ERRCHR ;IGNORE NULLS
|
||
POPJ P,
|
||
ERRCH2: IN ERRCHN,0 ;GET NEXT BUFFER
|
||
JRST ERRCH1 ;OK, NOW GET A CHAR.
|
||
ERRCH3: POP P,A ;UNABLE TO READ TECO.ERR
|
||
JRST NOERRS
|
||
|
||
;GET 1K CORE FOR ERROR MESSAGE FILE READ-IN
|
||
|
||
GRABJR: ADDI B,^D1024 ;ADD 1K
|
||
CORE B,
|
||
JRST ERRCH3 ;CAN'T GET IT
|
||
POPJ P,
|
||
|
||
;CAN'T PRINT ERROR FILE BECAUSE OF NO CORE
|
||
|
||
ERRP05: TRO FF,XPLNFL+EMFLAG
|
||
JSP A,CONMES
|
||
ASCIZ / Storage Capacity Exceeded
|
||
/
|
||
JRST ERRP5
|
||
;ROUTINE TO TYPE C(TT) IN SIXBIT
|
||
;CALL MOVE TT,[SIXBIT /MESSAGE/]
|
||
; PUSHJ P,SIXBMS
|
||
; RETURN
|
||
|
||
|
||
SIXBMS: SKIPN CH,TT ;ALL SPACES?
|
||
JRST SIXBM2 ;YES
|
||
MOVNI B,6
|
||
MOVE E,[POINT 6,TT]
|
||
ILDB CH,E
|
||
JUMPE CH,CPOPJ
|
||
SIXBM2: ADDI CH,40
|
||
PUSHJ P,TYOM
|
||
AOJL B,.-4
|
||
POPJ P,
|
||
ERRTYP: MOVE AA,ERR2 ;VALUE OF CPTR WHEN LAST ERROR OCCURRED.
|
||
MOVEI B,12
|
||
SUBI AA,2 ;BACK POINTER UP 10 CHARACTERS.
|
||
ILDB CH,AA ;GET CHARACTER
|
||
CAMG B,ERR1 ;WAS IT IN THE COMMAND BUFFER?
|
||
PUSHJ P,TYOM ;YES. TYPE IT.
|
||
CAME AA,ERR2 ;HAVE WE REACHED THE BAD COMMAND?
|
||
SOJA B,.-4 ;NO. DO IT AGAIN.
|
||
;ERRTYP+10 [166] SR#17205
|
||
ERRTY1: JSP A,CONMES ;PRINT A ? TO MARK END
|
||
ASCIZ /?
|
||
/
|
||
JRST ERRP6A
|
||
|
||
XPLA2: PUSHJ P,ERRPR2 ;PRINT UP TO LF
|
||
XPLAIN: PUSHJ P,ERRCHR ;IS NEXT CHAR A "?" OR ^A,^B, ... ^H?
|
||
CAIN CH,"?"
|
||
JRST XPLA1 ;YES
|
||
CAILE CH,10
|
||
JRST XPLA2 ;NO, KEEP GOING
|
||
XPLA1: TRO FF,XPLNFL ;SET FLAG THAT XPLANATION IS TYPED
|
||
JRST ERRP6 ;YES, STOP HERE
|
||
|
||
U ERR1,1 ;
|
||
U ERR2,1 ;
|
||
U COMLEN,1 ;LENGTH OF BASIC COMMAND STRING
|
||
;DISPATCH TABLE FOR SPECIAL INFORMATION TYPEOUT
|
||
;BASED ON CHARACTER AFTER CONTROL-N
|
||
|
||
ETABL: XWD ECOMCH,EOUTFL ;00 01
|
||
XWD EFILEN,EERNUM ;02 03
|
||
XWD EDEVNM,EPROJN ;04 05
|
||
XWD EARG1,EPROTC ;06 07
|
||
XWD EEBFN,EINFIL ;08 09
|
||
XWD EEBFIL,EIOFLG ;10 11
|
||
XWD ESTAB,ESKIP ;12 13
|
||
XWD EISKIP,EFILSP ;14 15
|
||
XWD EEOVAL,EESRCH ;16 17
|
||
XWD EECTRL,EESWIT ;18 19
|
||
XWD EEBPTH,EINFSP ;20 21
|
||
XWD EOUFSP,EPATH ;22 23
|
||
;SPECIAL INFORMATION TYPEOUT ROUTINES
|
||
|
||
|
||
EECTRL: SKIPA CH,ARGSTO ;GET BAD CHAR FROM TEXT STRING
|
||
ECOMCH: LDB CH,CPTR ;GET LAST COMMAND STRING CHAR.
|
||
PUSHJ P,TYOS
|
||
JRST ERRPRN
|
||
|
||
EOUTFL: MOVEI TT1,OUNAM ;[175] AIM AT OUTPUT FILENAME
|
||
EOUTF2: PUSHJ P,EFILE ;[175] TYPE THE FILE
|
||
JRST ERRPRN ;[175] CONTINUE WITH MESSAGE
|
||
|
||
;HERE TO TYPE A FILENAME.EXTENSION
|
||
EFILE: MOVE TT,(TT1) ;[175] PICK UP FILE NAME
|
||
PUSHJ P,SIXBMS ;PRINT FILENAME
|
||
HLLZ TT,1(TT1)
|
||
JUMPE TT,CPOPJ ;[175] SKIP REST IF NO EXTENSION
|
||
MOVEI CH,"."
|
||
PUSHJ P,TYOM
|
||
PUSHJ P,SIXBMS ;PRINT EXTENSION
|
||
POPJ P, ;[175]
|
||
|
||
EFILEN: MOVEI TT1,XNAM ;[175] GET FILENAME REF'D BY UUO
|
||
JRST EOUTF2
|
||
|
||
EERNUM: LDB B,[POINT 15,XEXT,35] ;[175] GET 2-DIGIT ERROR CODE
|
||
EERNU1: PUSHJ P,OCTMS ;TYPE IT
|
||
JRST ERRPRN
|
||
|
||
EDEVNM: MOVE TT,OPNDEV ;[175] GET DEVICE NAME
|
||
EDEVN1: PUSHJ P,SIXBMS ;[175] PRINT THE DEVICE NAME
|
||
JRST ERRPRN ;[175] BACK FOR MORE OF MESSAGE
|
||
|
||
EPROJN: SKIPE PTHPPN ;[175] LOOKUP/ENTER ON DEFAULT PATH?
|
||
SKIPA C,[PTHBLK] ;[175] NO, GET PATH WE USED
|
||
MOVEI C,DEFPTH ;[175] YES, POINT TO DEFAULT PATH
|
||
PUSHJ P,TYPATH ;[175] TYPE THE PATH
|
||
JRST ERRPRN ;[175] AND CONTINUE WITH TYPEOUT
|
||
|
||
EESWIT: MOVE TT,SWITHL ;GET I/O SWITCH NAME
|
||
JRST EDEVN1 ;[175] TYPE IT & RETURN
|
||
|
||
EARG1: MOVE B,ARGSTO ;GET ARG BACK
|
||
EARG1A: PUSHJ P,DECMS ;PRINT IT
|
||
JRST ERRPRN
|
||
EPROTC: LDB B,[POINT 9,XPRV,8] ;[175] GET FILE PROTECTION
|
||
JRST EERNU1
|
||
|
||
EEBFN: MOVE TT,EBNAM ;[175] EB FILENAME
|
||
JRST EDEVN1 ;[175] PRINT IT WITHOUT EXTENSION
|
||
|
||
EINFIL: MOVEI TT1,INNAM ;[175] AIM AT INPUT FILENAME
|
||
JRST EOUTF2
|
||
|
||
EEBFIL: MOVEI TT1,EBNAM ;[175] AIM AT EB ORIGINAL FILENAME
|
||
JRST EOUTF2
|
||
EIOFLG: HRRZI B,740000 ;RETRIEVE I/O ERROR FLAGS
|
||
AND B,ARGSTO
|
||
JRST EERNU1
|
||
|
||
ESTAB: MOVEI TT,STAB ;INDEX STAB WHERE TAG RESIDES
|
||
ESTAB1: MOVE CH,(TT)
|
||
JUMPE CH,ERRPRN ;THAT'S ALL
|
||
PUSHJ P,TYOS
|
||
AOJA TT,ESTAB1
|
||
|
||
EISKIP: LDB TT,[POINT 4,ARGSTO,21] ;GET I/O ERROR FLAGS
|
||
SKIPA
|
||
ESKIP: LDB TT,[POINT 15,XEXT,35] ;[175]
|
||
ESKIP2: PUSHJ P,ERRCHR ;LOOK FOR ^A
|
||
CAIN CH,2 ;^B ENCOUNTERED?
|
||
JRST ERRPRN ;YES, PRINT DEFAULT MESSAGE
|
||
CAIE CH,1
|
||
JRST ESKIP2 ;NOT ^A
|
||
PUSHJ P,ERRCHR ;GET 1ST DIGIT AFTER ^A
|
||
MOVEI T,-60(CH)
|
||
LSH T,3 ;MULT BY 8
|
||
PUSHJ P,ERRCHR ;GET NEXT DIGIT
|
||
ADDI T,-60(CH)
|
||
CAME TT,T ;THIS THE NUMBER WE WANT?
|
||
JRST ESKIP2 ;NO
|
||
JRST ERRPRN ;YES, NOW START PRINTING
|
||
|
||
EEOVAL: MOVEI B,EOVAL ;GET MAXIMUM EOFLAG FOR THIS VERSION
|
||
JRST EARG1A
|
||
|
||
EESRCH: MOVE TT,[POINT 7,SRHARG] ;GET PTR TO SEARCH STRING
|
||
MOVE B,SRHCTR ;& STRING CTR
|
||
EESRH2: ILDB CH,TT ;GET STRING CHAR
|
||
PUSHJ P,TYOS ;TYPE IT
|
||
SOJE B,ERRPRN ;WATCH STRING CTR
|
||
JRST EESRH2 ;NOT FINISHED YET
|
||
EFILSP: MOVEI TT1,XNAM ;[175] POINT TO FILE NAME
|
||
MOVEI C,PTHBLK ;[175] AND DEVICE, CHR'S, PATH
|
||
JRST EFLSUB ;[175] JOIN COMMON ROUTINE
|
||
|
||
EPATH: SKIPA C,[PTHBLK] ;[200] POINT TO PTHBLK
|
||
EEBPTH: MOVEI C,EBPTH ;[175] POINT TO EB PATH
|
||
JRST EDSPTH ;[175] GO DISPLAY IT
|
||
|
||
EINFSP: MOVEI TT1,INNAM ;[175] SETUP INPUT FILE NAME
|
||
MOVEI C,INPTH ;[175] AND INPUT PATH
|
||
JRST EFLSUB ;[175] MERGE WITH COMMON CODE
|
||
|
||
EOUFSP: MOVEI TT1,OUNAM ;[175] OUTPUT FILE NAME
|
||
MOVEI C,OUPTH ;[175] OUTPUT PATH
|
||
; JRST EFLSUB ;[175] COMMON CODE
|
||
|
||
;HERE TO PRINT DEV:FILE.EXT[PATH]
|
||
EFLSUB: MOVE TT,-3(C) ;[175] GET DEVICE NAME
|
||
PUSHJ P,SIXBMS ;[175] TYPE IT
|
||
MOVEI CH,":" ;[175] SEPERATOR
|
||
PUSHJ P,TYOM ;[175] TYPE IT
|
||
PUSHJ P,EFILE ;[175] TYPE THE FILE.EXT
|
||
|
||
;HERE TO TYPE PATH C POINTS TO IF FROM A DISK.
|
||
EDSPTH: MOVE E,-1(C) ;[175] GET DEVCHR WORD
|
||
TXNN E,DV.DSK ;[175] A DISK?
|
||
JRST ERRPRN ;[175] NO, DONE
|
||
SKIPE 2(C) ;[175] THIS PATH BLOCK SET UP?
|
||
JRST EDSPT1 ;[175] YES, PROCEED
|
||
MOVE E,-3(C) ;[175] NO, PICKUP DEVICE
|
||
MOVEM E,0(C) ;[175] STORE IN PATH BLOCK
|
||
MOVSI E,10 ;[200] ASSUME 10 WORDS LONG
|
||
HRRI E,0(C) ;[175] NOW SET UP FOR PATH UUO
|
||
PATH. E, ;[175] FIND OUT DEVICE'S PATH
|
||
JRST ERRPRN ;[175] NOT A DISK, FORGET IT
|
||
EDSPT1: MOVEI CH,"[" ;[175] ANNOUNCE THE PATH
|
||
PUSHJ P,TYOM ;[175] OUT IT GOES
|
||
PUSHJ P,TYPATH ;[175] TYPE IT
|
||
MOVEI CH,"]" ;[175] ANNOUNCE END OF PATH
|
||
PUSHJ P,TYOM ;[175] TYPE IT
|
||
JRST ERRPRN ;[175] LOOP BACK FOR MORE OF THE MESSAGE
|
||
|
||
;UUO HANDLER
|
||
|
||
UUOH:
|
||
IFN PDP6,<0> ;PDP-6 JSR ENTRY
|
||
MOVEM B,ARGSTO ;SAVE POSSIBLE ARG
|
||
LDB B,[POINT 9,.JBUUO,8] ;GET UUO TYPE
|
||
CAIL B,20 ;CHKEO?
|
||
JRST CEO ;YES
|
||
CAIN B,1 ;ERROR UUO?
|
||
JRST ERRP ;YES
|
||
UUOERR: MOVEM B,PTHPPN ;[175]
|
||
HRRZ B,(P) ;ADDRESS OF ILLEGAL UUO
|
||
SUBI B,1
|
||
ERROR E.UUO
|
||
|
||
U LISTF5,1 ;OUTPUT DISPATCH
|
||
|
||
;CHKEO EO#,ADDR
|
||
;IF EOFLAG > EO#, RETURN AT CALL+1 (FEATURE IS LEFT ON)
|
||
;OTHERWISE GO TO ADDR (FEATURE IS TURNED OFF)
|
||
|
||
CEO: PUSH P,A ;SAVE AC
|
||
LDB B,[POINT 8,.JBUUO,12] ;GET EO TEST VALUE
|
||
MOVE A,EOFLAG ;GET LAST SETTING OF EOFLAG
|
||
CAIG A,(B) ;EOFLAG > TEST VALUE?
|
||
JRST CEO1 ;NO
|
||
CEO2: POP P,A ;RESTORE AC A
|
||
MOVE B,ARGSTO ;RESTORE AC B
|
||
IFE PDP6,<POPJ P,> ;RETURN
|
||
IFN PDP6,<JRST @UUOH>
|
||
|
||
CEO1: HRRZ A,.JBUUO ;GET DISPATCH ADDR
|
||
HRRM A,-1(P) ;PUT ON PDL AS RET. ADDR.
|
||
JRST CEO2
|
||
;COMMAND TO COMPLEMENT TRACE MODE. "?" AS A COMMAND
|
||
|
||
QUESTN: TRCN FF,TRACEF ;COMPLEMENT TRACE FLAG
|
||
JRST RET
|
||
PUSHJ P,CRR ;TYPE CR/LF AFTER TRACE MODE EXIT
|
||
JRST RET
|
||
|
||
COMMEN: PUSHJ P,SKRCH ;GET A COMMENT CHAR
|
||
ERROR E.UCA
|
||
CAIN CH,1 ;^A
|
||
JRST RET ;DONE
|
||
TRNN FF,TRACEF ;OMIT DOUBLE TYPE-OUT WHEN TRACING
|
||
PUSHJ P,TYOM ;TYPE IT
|
||
JRST COMMEN
|
||
|
||
;OLD ^G EXIT COMMAND AND ILLEGAL COMMANDS
|
||
|
||
BELDMP: CHKEO EO21,DECDMP ;IF EO=1, DO ^Z, OTHERWISE ^G IS ILLEGAL
|
||
|
||
ERRA: ERROR E.ILL
|
||
;ROUTINE TO RETURN STRING OPERATION STRING ARGUMENTS.
|
||
;ARGUMENTS ARE CHARACTER ADDRESSES IN THE DATA BUFFER.
|
||
;TRANSFORMS M,N OR N, WHERE THE LATTER SPECIFIES A NUMBER OF LINES,
|
||
;TO ARGUMENTS.
|
||
;CALL PUSHJ P,GETARG
|
||
; RETURN WITH FIRST ARGUMENT ADDRESS IN C, SECOND IN B.
|
||
;IF THE EO VALUE HAS BEEN SET TO 1, THE ONLY EOL CHAR IS LINE FEED.
|
||
;IF EO > 1, THE EOL CHARS ARE LF, VT, AND FF (& END OF BUFFER IF
|
||
;LAST CHAR IN BUFR IS NOT AN EOL)
|
||
|
||
GETARG: TRNE FF,ARG2 ;IS THERE A SECOND ARGUMENT?
|
||
JRST GETAG6 ;YES
|
||
|
||
;N SIGN INDICATES DIRECTION RELATIVE TO PT.
|
||
GETNAG: PUSHJ P,CHK2 ;NO, GET 1ST ARG (+ OR - 1 IF NONE THERE)
|
||
MOVE I,PT ;IN:=PT
|
||
GETAG4: JUMPLE B,GETAG2 ;WAS LAST ARGUMENT FUNCTION -?
|
||
CAMN I,Z ;NO. ARGUMENT IS LOCATION OF NTH EOL FORWARD FROM PT.
|
||
;IS PT AT END OF BUFFER?
|
||
JRST GETAG1 ;YES.
|
||
PUSHJ P,GETINC ;NO. CH:=NEXT DATA BUFFER CHARACTER, IN:=IN+1
|
||
PUSHJ P,CKEOL ;IS IT AN EOL?
|
||
JRST GETAG4 ;NO. TRY AGAIN.
|
||
SOJG B,GETAG4 ;YES. NTH EOL?
|
||
|
||
GETAG1: MOVE B,I ;YES. RETURN FIRST ARGUMENT IN C
|
||
MOVE C,PT ;SECOND IN B.
|
||
POPJ P,
|
||
|
||
;M,N
|
||
GETAG6: ADD B,BEG ;C:=M+BEG
|
||
ADD C,BEG ;B:=N+BEG
|
||
POPJ P,
|
||
|
||
GETAG2: SOS I ;SET I FOR CHAR BEFORE PT
|
||
CAMGE I,BEG ;PASSED BEGINNING OF BUFFER?
|
||
JRST GETAG3 ;YES. IN:=BEG
|
||
PUSHJ P,GETINC ;NO. CH:=NEXT DATA BUFFER CHARACTER. IN:=IN+1
|
||
PUSHJ P,CKEOL ;IS IT AN EOL?
|
||
SOJA I,GETAG2 ;NO. BACK UP ONE POSITION AND TRY AGAIN.
|
||
AOJLE B,.-1 ;YES. NTH EOL?
|
||
|
||
GETAG3: CAMGE I,BEG ;YES. PASSED BEGINNING OF BUFFER?
|
||
MOVE I,BEG ;YES. RESET TO BEGINNING.
|
||
MOVE C,I ;NO. RETURN FIRST ARGUMENT IN C.
|
||
MOVE B,PT ;SECOND IN B
|
||
POPJ P,
|
||
;ROUTINE TO RETURN IN CH THE CHARACTER TO THE RIGHT OF THE POINTER
|
||
;AND INCREMENT THE POINTER.
|
||
;CALL MOVE I,POINTER (AS A CHARACTER ADDRESS)
|
||
; PUSHJ P,GETINC
|
||
; RETURN WITH CHARACTER IN CH AND POINTER TO CHARACTER IN IN.
|
||
|
||
GETINC: PUSHJ P,GET
|
||
AOJA I,CPOPJ
|
||
|
||
GET: MOVE TT,I
|
||
IDIVI TT,5
|
||
HLL TT,BTAB(TT1)
|
||
LDB CH,TT
|
||
POPJ P,
|
||
|
||
PUT: MOVE TT,OU
|
||
IDIVI TT,5
|
||
HLL TT,BTAB(TT1)
|
||
DPB CH,TT
|
||
POPJ P,
|
||
|
||
;CHARACTER TRANSLATION BYTE POINTER TABLE
|
||
;TRANSLATES 1 CHARACTER POSITION TO THE RIGHT OF A CHARACTER ADDRESS POINTER
|
||
|
||
BTAB: XWD 350700,0
|
||
XWD 260700,0
|
||
XWD 170700,0
|
||
XWD 100700,0
|
||
XWD 10700,0
|
||
|
||
;CHECK IF CH = EOL CHARACTER
|
||
;CALL: PUSHJ P,CKEOL
|
||
; RETURN IF CH NOT = EOL
|
||
; RETURN IF CH IS EOL CHAR
|
||
|
||
CKEOL: CAIN CH,12 ;LINE FEED?
|
||
JRST CPOPJ1 ;YES, IT IS AN EOL!
|
||
CHKEO EO21,CPOPJ ;IF EO=1, LF IS ONLY POSSIBLE EOL
|
||
CAIE CH,13 ;VERTICAL TAB?
|
||
CAIN CH,14 ;FORM FEED?
|
||
AOS (P) ;YES, SKIP RETURN
|
||
POPJ P, ;NO
|
||
NROOMC:
|
||
IFN VC,<MOVEM C,VVAL> ;SAVE LENGTH OF STRING
|
||
NROOM: MOVEM 17,AC2+15 ;SAVE 17
|
||
MOVEI 17,NROOM9 ;ANTICIPATE GARBAGE COLLECTION
|
||
MOVEM 17,GCRET ;THIS THE EXIT DISPATCH
|
||
SETZM CRREL
|
||
SETZM RREL
|
||
MOVE 17,PT
|
||
CAMN 17,Z ;PT=Z? I.E., DATA BUFFER EXPANSION?
|
||
JRST NROOM1 ;YES.
|
||
NROOM0: MOVE 17,[XWD 2,AC2] ;NO. SAVE ACS 2 THROUGH 16.
|
||
BLT 17,AC2+14
|
||
JUMPL C,NROOM6 ;DELETION?
|
||
SETOM GCFLG ;NO.
|
||
|
||
;MOVE STRING STORAGE UP C CHARACTERS STARTING AT PT.
|
||
|
||
NROOM9: MOVE 17,Z
|
||
ADD 17,C
|
||
CAML 17,MEMSIZ ;WILL REQUEST OVERFLOW MEMORY?
|
||
JRST GC ;YES. GARBAGE COLLECT.
|
||
;MOVE FROM PT THROUGH Z UP C POSITIONS
|
||
MOVE 14,C ;NO.
|
||
IDIVI 14,5 ;AC14:=Q(REQ/5), AC15:=REM(REQ/5)
|
||
IMULI 15,7 ;AC15:=(REM(REQ/5))*7
|
||
MOVN 13,15 ;AC13:=-(REM(REQ/5))*7
|
||
MOVEI 15,-43(15) ;AC15:=(REM(REQ/5))*7-43
|
||
MOVE 11,PT
|
||
IDIVI 11,5 ;AC11:=Q(PT/5), AC12:=REM(PT/5)
|
||
MOVNI 16,-5(12)
|
||
IMULI 16,7 ;AC16:=-(REM(PT/5)-5)*7
|
||
DPB 16,[XWD 300600,NROOM2] ;SET SIZE FIELD OF LAST PARTIAL WORD POINTER.
|
||
ADDI 14,1(11) ;AC14:=Q(REQ/5)+Q(PT/5)+1
|
||
MOVE 16,Z
|
||
IDIVI 16,5 ;AC16:=Q(Z/5)
|
||
MOVEI B,1(16)
|
||
SUB B,11 ;B:=Q(Z/5)+1-Q(PT/5)=NO. OF WORDS TO MOVE.
|
||
|
||
|
||
;PUT MOVE ROUTINE IN FAST ACS
|
||
HRLI 11,200000+B+A*40 ;AC11:=MOVE A,[Q(PT/5)](B)
|
||
HRLOI 12,241000+A*40 ;AC12:=ROT A,-1
|
||
HRLI 13,245000+A*40 ;AC13:=ROTC A,-(REM(REQ/5))*7
|
||
HRLI 14,202000+B+AA*40 ;AC14:=MOVEM AA,[Q(PT/5)+1](B)
|
||
HRLI 15,245000+A*40 ;AC15:=ROTC A,(REM(REQ/5))*7-43
|
||
MOVE 17,[JRST,NROOM7] ;AC16:=SOJGE B,11
|
||
MOVE 16,.+1 ;AC17:=JRST NROOM7
|
||
SOJGE B,11 ;B:=B-1. DONE?
|
||
|
||
NROOM7: ROTC A,43(13) ;YES. STORE LAST PARTIAL WORD.
|
||
DPB A,NROOM2
|
||
ADDM C,Z ;Z:=Z+REQ
|
||
NROOM5: MOVE 17,[XWD 2,AC2] ;RESTORE ACS AND RETURN.
|
||
MOVSS 17
|
||
BLT 17,17
|
||
POPJ P,
|
||
|
||
|
||
U NROOM2,1 ;POINTER TO LAST PARTIAL WORD ON UPWARD MOVE.
|
||
;A CALL FOR A BUFFER EXPANSION, WHERE PT=Z. IF
|
||
;THERE IS NOT ENOUGH ROOM, PERFORM THE GARBAGE COLLECTION ROUTINE
|
||
;IF THERE IS STILL NO ROOM, GET THE NECESSARY CORE FROM THE
|
||
;MONITOR TO SATISFY THIS REQUEST
|
||
|
||
NROOM1: ADD 17,C ;TOTAL SPACE REQUIREMENT
|
||
CAMG 17,MEMSIZ ;IS THERE ENOUGH?
|
||
JRST .+4 ;YES, THEREFORE, UPDATE Z AND EXIT
|
||
MOVEI 17,GCRETA ;EXIT DISPATCH FOR THE
|
||
MOVEM 17,GCRET ;GARBAGE COLLECTION ROUTINE
|
||
JRST NROOM0 ;GO DO THE GARBAGE COLLECTION
|
||
ADDM C,Z ;UPDATE Z, SIZE IS OK
|
||
MOVE 17,AC2+15 ;RESTORE AC#17
|
||
POPJ P, ;EXIT OUT
|
||
|
||
|
||
;NOT ENOUGH ROOM FOR THE EXPANSION, GARBAGE COLLECTION HAS BEEN
|
||
;PERFORMED, IF NEED BE, GRAB A K FROM THE MONITOR (OR MORE)
|
||
|
||
GCRETA: MOVE 17,Z ;GET TOTAL SO FAR
|
||
ADD 17,C ;ADD IN THE REQUEST
|
||
CAML 17,MEMSIZ ;STILL IN NEED OF CORE?
|
||
PUSHJ P,GRABAK ;YES, GET THE REQUIRED CORE FROM THE MONITOR
|
||
ADDM C,Z ;UPDATE Z AND EXIT
|
||
JRST NROOM5 ;RESTORE ALL AC'S AND RETURN TO SEQUENCE
|
||
|
||
U GCRET,1 ;GC EXIT DISPATCH
|
||
;MOVE FROM PT+ABS(C) THROUGH Z DOWN ABS(C) POSITIONS
|
||
NROOM6: MOVE 14,PT ;INITIALIZE PARTIAL WORD POINTER.
|
||
IDIVI 14,5 ;AC14:=Q(PT/5), AC15:=REM(PT/5)
|
||
MOVEM 14,B ;B:=Q(PT/5)
|
||
HRRZM 14,NROOM4
|
||
IMULI 15,7
|
||
DPB 15,[XWD 300600,NROOM4] ;SIZE:=(REM(PT/5))*7
|
||
MOVNI 15,-44(15)
|
||
DPB 15,[XWD 360600,NROOM4] ;POSITION:=44-(REM(PT/5))*7
|
||
MOVE 11,Z
|
||
IDIVI 11,5 ;AC11:=Q(Z/5)+1, AC12:=REM(Z/5)
|
||
ADDI 11,1
|
||
MOVE 13,C
|
||
IDIVI 13,5
|
||
ADDI 13,-1(11) ;AC13:=Q(Z/5)-Q(REQ/5)
|
||
MOVNM 14,12 ;AC12:=(REM(REQ/5))*7
|
||
IMULI 12,7
|
||
MOVNI 15,-43(12) ;AC15:=43-(REM(REQ/5))*7
|
||
SUBI B,1(13) ;B:=Q(PT/5)+Q(REQ/5)-Q(Z/5)-1:=# WORDS TO MOVE
|
||
|
||
|
||
NROOM8: HRLI 11,200000+B+AA*40 ;AC11:=MOVE AA,[Q(Z/5)+1](B)
|
||
HRLI 12,245000+A*40 ;AC12:=ROTC A,(REM(REQ/5))*7
|
||
HRLI 13,202000+B+A*40 ;AC13:=MOVEM A,[Q(Z/5)-Q(REQ/5)](B)
|
||
MOVE 14,[ADDM A,@13] ;AC14:=ADDM A,@13
|
||
HRLI 15,245000+A*40 ;AC15:=ROTC A,43-(REM(REQ/5))*7
|
||
MOVE 17,[JRST NROOM3] ;AC16:=AOJLE B,11
|
||
ADDM C,Z ;AC17:=JRST NROOM3
|
||
LDB C,NROOM4
|
||
MOVE A,@11 ;Z:=C(Z)-REQ
|
||
ROT A,-1 ;A:=Q(PT/5)+Q(REQ/5) RIGHT JUSTIFIED.
|
||
MOVE 16,.+1
|
||
AOJLE B,11 ;B:=B+1. DONE?
|
||
|
||
NROOM3: DPB C,NROOM4 ;YES. DEPOSIT PARTIAL WORD.
|
||
JRST NROOM5
|
||
|
||
U NROOM4,1 ;PARTIAL WORD POINTER FOR DOWNWARD MOVE
|
||
GC: AOSE GCFLG ;FIRST ATTEMPT?
|
||
JRST PRENR9 ;TRY TO EXPAND MEMORY
|
||
SETOM GCPTR ;YES. GCPTR:=-1
|
||
SETZM SYMS ;CLEAR SYMS,VALS AND CNTS TABLES
|
||
MOVE T,[XWD SYMS,SYMS+1]
|
||
BLT T,SYMEND-1
|
||
MOVEI T,CPTR ;COMMAND BUFFER
|
||
PUSHJ P,GCMA
|
||
MOVEI T,(P)
|
||
PUSHJ P,GCMA ;NO. GARBAGE COLLECT ALL BYTE POINTERS ON IT.
|
||
CAILE T,PDL+1
|
||
SOJA T,.-2
|
||
HRRZ T,AC2+PF-2 ;GARBAGE COLLECT Q-REG PUSHDOWN LIST.
|
||
CAIL T,PFL
|
||
PUSHJ P,GCM
|
||
CAILE T,PFL
|
||
SOJA T,.-2
|
||
MOVE T,[XWD -44,QTAB] ;GARBAGE COLLECT Q-REGISTERS.
|
||
PUSHJ P,GCM
|
||
AOBJN T,.-1
|
||
MOVE I,BEG ;MAKE SURE STUFF BEFORE BEG
|
||
SUB I,QRBUF ;IS COLLECTED
|
||
MOVEI T,0 ;MARK THIS AS LAST COLLECTION
|
||
PUSHJ P,GCM3 ;STORE IT ON TH GC LIST
|
||
;COMPACT QREG STRING STORAGE AREA
|
||
;
|
||
MOVE I,QRBUF ;I: NEXT FREE ADDR. TO USE
|
||
|
||
;FIND STRING WITH LOWEST ADDRESS IN AREA
|
||
|
||
GCS1A: MOVSI TT,200000 ;TT>MAX. NO. CHARACTERS IN WORLD
|
||
MOVE OU,GCPTR ;GO BACKWARDS THROUGH GCTAB
|
||
GCS1: HRRZ A,GCTAB(OU) ;GET ADDR OF STRING FOUND ABOVE
|
||
ADD A,QRBUF
|
||
CAMGE A,I ;PTR ABOVE AREA ALREADY DONE?
|
||
JRST GCS2 ;NO, NOT INTERESTED
|
||
CAMGE A,TT ;THIS LOWEST PTR IN GC AREA?
|
||
MOVE TT,A ;YES, REMEMBER IT
|
||
GCS2: SOJGE OU,GCS1
|
||
CAMN TT,[1B1] ;ANYTHING IN GCTAB? [116]
|
||
JRST GCS4A ;NO, DON'T SAVE INFINITY[116]
|
||
|
||
;HAVE FOUND A STRING, MOVE IT AND EVERYTHING AFTER IT DOWN TO
|
||
;LOWEST FREE ADDRESS.
|
||
|
||
MOVE F2,TT ;HIGHEST CHARACTER.
|
||
IDIVI F2,5 ;LENGTH OF STRING
|
||
IDIVI I,5 ;WORDS TO OFFSET
|
||
SKIPE B ;FRACTIONATED WORD?
|
||
AOS I ;YES, ROUND UP
|
||
MOVS OU,F2 ;SET UP SOURCE FOR BLT
|
||
MOVE T,F2
|
||
SUB T,I ;COMPUTE DISTANCE OF MOVE
|
||
JUMPLE T,GCS4A ;ANYTHING TO GET?
|
||
HRR OU,I ;SETUP DEST FOR BLT
|
||
MOVE B,Z ;GET TOP OF BUFR FOR BLT
|
||
HRRZ F2,(P) ;SEE WHO CALLED NROOM
|
||
CAIN F2,YANK6 ;WAS IT APPEND?
|
||
MOVE B,AC2+OU-2 ;YES, MUST USE THE REAL Z FOR THE BLT
|
||
IDIVI B,5 ;SETUP FINAL DEST FOR BLT
|
||
SUB B,T ;IE FINAL SOURCE MINUS DISTANCE
|
||
BLT OU,(B) ;MOVE STUFF DOWN
|
||
MOVNS OU,T ;GET NEG DISTANCE
|
||
IMULI OU,5 ;IN TERMS OF CHARACTERS
|
||
ADDM OU,BEG ;BEG:=C(BEG)-5*NREG
|
||
ADDM OU,PT ;PT:=C(PT)-5*NREG
|
||
ADDM OU,Z ;Z:=C(Z)-5*NREG
|
||
ADDM OU,RREL ;RREL:=C(RREL)-5*NREG
|
||
MOVE CH,GCPTR ;UPDATE INSERTER
|
||
|
||
GCS3: HRRZI TT1,GCTAB(CH) ;GET STRING ADDR
|
||
HRRZ A,(TT1)
|
||
ADD A,QRBUF
|
||
CAMGE A,TT
|
||
JRST GCS4
|
||
ADDM OU,(TT1) ;RELOCATE PTR
|
||
HLRZ A,(TT1) ;GET ADDR WHERE STRING WAS LIVING
|
||
JUMPE A,GCS4 ;NO PTR TO BEG
|
||
CAIN A,CPTR ;IN COMMAND BUFFER?
|
||
ADDM T,CRREL ;YES. UPDATE COMMAND POINTER RELOCATION
|
||
SKIPL (A) ;Q-REG?
|
||
ADDM T,(A) ;NO
|
||
SKIPGE (A) ;Q-REG?
|
||
ADDM OU,(A) ;YES. RELOCATE BASE POINTER.
|
||
|
||
GCS4: SOJGE CH,GCS3 ;DONE?
|
||
ADD TT,OU ;YES. IN:=C(TT)-5*NREG
|
||
|
||
GCS4A: CAML TT,BEG ;LAST COLLECTION?
|
||
JRST @GCRET ;YES, RETURN
|
||
MOVE I,TT
|
||
PUSH P,C
|
||
PUSHJ P,GTQCNT
|
||
ADD I,C
|
||
POP P,C
|
||
JRST GCS1A
|
||
;MARK ACTIVE QREG STRING
|
||
; T: ADDRESS OF QREG STRING PTR
|
||
|
||
GCM: MOVE I,(T)
|
||
TLZE I,400000 ;DOES Q-REG CONTAIN TEXT?
|
||
TLZE I,377777
|
||
POPJ P, ;NO
|
||
ADD I,QRBUF ;YES. ENTER POINTER IN GCTAB
|
||
|
||
GCM2: CAML I,BEG ;REGION BEFORE TEXT BUFFER?
|
||
POPJ P, ;NO. FORGET IT.
|
||
SUB I,QRBUF ;YES. IN:=# CHARACTERS TO RETREIVE.
|
||
; IN Q-REG BUFFER AREA?
|
||
JUMPL I,CPOPJ ;NO. FORGET IT.
|
||
GCM3: AOS TT,GCPTR ;YES. TO BE GRABBED.
|
||
CAIL TT,GCTBL ;AM I WINNING?
|
||
ERROR E.GCE ;NO. VERY BAD.
|
||
HRL I,T ;XWD ADDRESS OF BYTE POINTER,NO. CHARACTERS
|
||
MOVEM I,GCTAB(TT) ;SAVE DATA
|
||
POPJ P, ;DONE THIS POINTER
|
||
|
||
;IF T POINTS TO AN ASCII BYTE POINTER, IN:=CHARACTER ADDRESS OF TOP
|
||
;OF STRING - NO. OF CHARACTERS.
|
||
GCMA: HLRZ TT,(T) ;LEFT HALF OF PTR
|
||
TRC TT,700 ;DOES T POINT TO A TEXT BYTE POINTER?
|
||
TRNE TT,7700
|
||
POPJ P, ;NO
|
||
MOVE I,-1(T) ;MAYBE. GET WORD BEFORE POINTER. (MAX)
|
||
SUB I,1(T) ;MAX-CT
|
||
LSH TT,-14 ;BYTE POSITION
|
||
IDIVI TT,7 ;NO. OF CHARACTERS
|
||
MOVEI TT1,4-3+1 ;2
|
||
SUB TT1,TT ;2-NO. OF CHARACTERS
|
||
HRRZ TT,(T) ;POINTER WORD ADDRESS (UNRELOCATED)
|
||
IMULI TT,5 ;5*ADDRESS
|
||
ADD TT,TT1
|
||
SUBM TT,I ;5*ADDRESS-NO. CHARS+2+CT-MAX
|
||
JRST GCM2
|
||
;**********AUTOMATIC MEMORY EXPANSION*********
|
||
|
||
;MEMORY WILL BE EXPANDED UNDER ONE OF THESE CONDITIONS.
|
||
|
||
; 1.AN INTERNAL BUFFER EXPANSION CANNOT BE PERFORMED,
|
||
; TO DO SO WOULD OVERFLOW THE PRESENT MEMORY
|
||
; CAPACITY. THE INTERNAL OPERATIONS WHICH DESCOVER
|
||
; THE NEED FOR EXPANSION ARE:
|
||
|
||
; A.COMMAND BUFFER EXPANDING
|
||
; B.THE Q-REG GET (GI)
|
||
; C.THE Q-REG LOAD (NXI)
|
||
; D.ANY OF THE INSERTS
|
||
; E.COMMAND ACCEPTANCE ROUTINE
|
||
|
||
|
||
; 2.THE DATA BUFFER WILL BE MAINTAINED AT A MINIMUM
|
||
; NUMBER OF 5000 CHARACTERS BEFORE NEW DATA IS LOADED
|
||
; FROM AN INPUT DEVICE OTHER THAN THE CONSOLE. Q-REG
|
||
; USAGE SHORTENS THE NUMBER OF AVAILABLE CHARACTERS
|
||
; DIRECTLY, AND NORMAL TECO COMMANDS ARE GREATLY IMPARED
|
||
; OTHERWISE.
|
||
|
||
|
||
;SAVE THE ACCUMULATORS
|
||
|
||
|
||
GRABAK: TLOA FF,GKTLKF ;TALKATIVE GRAB
|
||
GRABKQ: TLZ FF,GKTLKF ;GRAB A K QUIETLY
|
||
MOVEM CH,SAV16 ;TO SAVE THE ACCUMULATORS
|
||
MOVEI CH,SAVE ;WHILE WE SCOOT ALL OVER THE
|
||
BLT CH,SAV16-1 ;THE PLACE
|
||
|
||
;COUNT THE NUMBER OF BLOCKS NEEDED TO FILL THE REQUEST
|
||
|
||
MOVEI F2,^D1024 ;1 BLOCK OF CORE
|
||
MOVEI B,1 ;WE WILL NEED AT LEAST ONE BLOCK
|
||
ADDM F2,.JBFF ;UP THE FIRST FREE COUNT
|
||
PUSHJ P,CRE23 ;COMPUTE A NEW MEMSIZ AND 2/3 VALUE
|
||
CAML 17,MEMSIZ ;WILL THIS BE ENOUGH CORE?
|
||
AOJA B,.-3 ;NO, COMPUTE ANOTHER BLOCK
|
||
;NUMBER OF BLOCKS HAVE BEEN FOUND
|
||
;OBTAIN THE NEEDED CORE FROM THE MONITOR
|
||
|
||
MOVE B,.JBFF ;TO HELP OUT THE MONITOR
|
||
CORE B, ;MAKE THE CALL TO THE MONITOR
|
||
JRST NOTANY ;NO CORE (OR NOT ENOUGH) AVAILABLE
|
||
TLNN FF,GKTLKF ;MESSAGE DESIRABLE?
|
||
JRST EXITZ ;NO
|
||
MOVEI CH,"["
|
||
PUSHJ P,TYOM
|
||
MOVE B,.JBREL ;SIZE OF CORE NOW
|
||
ADDI B,1
|
||
ASH B,-12
|
||
PUSHJ P,DECMS ;PRINT
|
||
JSP A,CONMES
|
||
ASCIZ /K Core]
|
||
/
|
||
|
||
;RESTORE THE AC'S AND EXIT FROM THIS COR GET ROUTINE
|
||
|
||
EXITZ: MOVSI CH,SAVE ;FROM TO
|
||
BLT CH,CH ;ALL AC'S AS THEY WERE
|
||
POPJ P, ;AND EXIT
|
||
|
||
;NO CORE AVAILABLE (OR NOT ENOUGH)
|
||
|
||
NOTANY: HLRZ A,.JBSA ;GET LAST FIGURE OF CORE BOUND
|
||
MOVEM A,.JBFF ;AND STORE IT
|
||
PUSHJ P,CRE23 ;COMPUTE THE MEMSIZE VALUES AGAIN
|
||
MOVSI CH,SAVE ;RESTORE THE ACCUMULATORS
|
||
BLT CH,CH ;& INFORM THE OUTSIDE WORLD THAT THEY LOSE
|
||
EE3+ERROR E.COR
|
||
|
||
;THIS IS AN AUXILARY SPOT FOR ENTRANCE FROM GC2
|
||
;GET THE REQUIRED CORE TO SAVE THE JOB IF POSSIBLE
|
||
|
||
PRENR9: PUSHJ P,GRABAK ;GET THE REQUIRED CORE
|
||
JRST NROOM9 ;GO TRY THE INSERT AGAIN
|
||
U BEG,1 ;
|
||
U PT,1 ;
|
||
U Z,1 ;
|
||
U QRBUF,1 ;
|
||
;*** DO NOT SEPARATE ***
|
||
U COMAX,1 ;TOTAL # OF CHARS AT CUR. CMD. LEVEL
|
||
U CPTR,1 ;EXECUTION-TIME CMD STRING PTR
|
||
U COMCNT,1 ;# OF CHARS REMAINING TO BE EXECUTED AT THIS LEVEL
|
||
;*** DO NOT SEPARATE ***
|
||
U CBUFH,1 ;
|
||
U CBUF,1 ;
|
||
U MEMSIZ,1 ;
|
||
IFN CCL,<U CCLSW,1>
|
||
U GCPTR,1 ;
|
||
U CRREL,1 ;
|
||
U GCFLG,1 ;
|
||
U RREL,1 ;
|
||
|
||
|
||
;CORRECT FOR 2/3 BUFFER FILLING ERROR.M23 IS 2/3'S AND M23PL IS 2/3
|
||
;PLUS THE OTHER THIRD-128 CHARACTERS.
|
||
|
||
U M23,1 ;
|
||
U M23PL,1 ;
|
||
|
||
|
||
; [227] ADD A NEW GLOBAL FOR *I COMMAND.
|
||
U COMSAV,1 ;[227] SAVED Q-REG VALUE FOR *I
|
||
|
||
|
||
|
||
;COMMAND DISPATCH TABLE
|
||
|
||
DEFINE DSP (C1,A1,C2,A2)<
|
||
XWD <<C1>B20+A1>,<<C2>B20+A2>>
|
||
|
||
;CODES INDICATE TYPE OF DISPATCH
|
||
JR==0 ;FOR SIMPLE JRST DISPATCH
|
||
HR==1 ;FOR DISPATCH TO A COMMAND PERFORMED BY A SUBROUTINE
|
||
MV==2 ;FOR JRST DISPATCH AFTER PROCESSING PRECEDING NUMERIC ARGUMENTS
|
||
|
||
DTB: DSP(JR,ERRA,JR,COMMEN) ;^@ ^A
|
||
DSP(JR,ERRA,JR,ERRA) ;^B ^C
|
||
DSP(JR,ERRA,JR,FFEED) ;^D ^E
|
||
DSP(JR,LAT,JR,BELDMP) ;^F ^G
|
||
DSP(JR,GTIME,HR,TAB) ;^H TAB
|
||
DSP(JR,CD5,JR,ERRA) ;LF VT [142]
|
||
DSP(HR,TYO,JR,CD5) ;FF CR [142]
|
||
DSP(JR,EOF,JR,OCTIN) ;^N ^O
|
||
DSP(JR,ERRA,JR,ERRA) ;^P ^Q
|
||
DSP(JR,ERRA,JR,ERRA) ;^R ^S
|
||
DSP(JR,SPTYI,JR,ERRA) ;^T ^U
|
||
DSP(MV,LOWCAS,MV,STDCAS) ;^V ^W
|
||
DSP(MV,SETMCH,JR,ERRA) ;^X ^Y
|
||
DSP(JR,DECDMP,JR,ALTMOD) ;^Z ^[
|
||
DSP(JR,ERRA,JR,ERRA) ;^BKSLH ^]
|
||
DSP(JR,CNTRUP,JR,ERRA) ;^^ ^LFTARR
|
||
DSP(MV,PLUS,JR,EXCLAM) ;SPACE !
|
||
DSP(MV,DQUOTE,MV,COR) ;" #
|
||
DSP(JR,ERRA,JR,PCNT) ;$ %
|
||
DSP(MV,CAND,JR,CD) ;& '
|
||
DSP(JR,OPENP,MV,CLOSEP) ;( )
|
||
DSP(MV,TIMES,MV,PLUS) ;* +
|
||
DSP(MV,COMMA,MV,MINUS) ;, -
|
||
DSP(JR,PNT,MV,SLASH) ;. /
|
||
DSP(JR,CDNUM,JR,CDNUM) ;0 1
|
||
DSP(JR,CDNUM,JR,CDNUM) ;2 3
|
||
DSP(JR,CDNUM,JR,CDNUM) ;4 5
|
||
DSP(JR,CDNUM,JR,CDNUM) ;6 7
|
||
DSP(JR,CDNUM,JR,CDNUM) ;8 9
|
||
DSP(MV,COLON,MV,SEMICL) ;: ;
|
||
DSP(MV,LSSTH,HR,PRNT) ;< =
|
||
DSP(JR,GRTH,JR,QUESTN) ;> ?
|
||
DSP(MV,ATSIGN,JR,ACMD) ;@ A
|
||
DSP(JR,BEGIN,MV,CHARAC) ;B C
|
||
DSP(MV,DELETE,HR,ECMD) ;D E
|
||
DSP(MV,FCMD,JR,QGET) ;F G
|
||
DSP(JR,HOLE,HR,INSERT) ;H I
|
||
DSP(MV,JMP,MV,KILL) ;J K
|
||
DSP(MV,LINE,JR,MAC) ;L M
|
||
DSP(MV,SERCHP,JR,OG) ;N O
|
||
DSP(HR,PUNCHA,JR,QREG) ;P Q
|
||
DSP(MV,REVERS,MV,SERCH) ;R S
|
||
DSP(HR,TYPE,MV,USE) ;T U
|
||
DSP(JR,ERRA,JR,ERRA) ;V W
|
||
DSP(MV,X,HR,YANK) ;X Y
|
||
DSP(JR,END1,MV,OPENB) ;Z [
|
||
DSP(MV,BAKSL,MV,CLOSEB) ;BKSLH ]
|
||
DSP(JR,UAR,MV,LARR) ;^ LFTARR
|
||
U ERRLEN,1 ;TYPE OF ERROR MESSAGES WANTED BY DEFAULT
|
||
U AC2,16 ;SAVE AC2-AC17 IN NROOM ROUTINE
|
||
U STAB,STABLN ;SEARCH MATRIX
|
||
COMZR==STAB ;[175] BEGINNING OF AREA TO ZERO
|
||
;[175] WHEN ENTERING COMMAND SCANNER
|
||
COMDEV=STAB ;[175] DEVICE USER TYPED
|
||
COMNAM=COMDEV+1 ;[175] FILENAME " "
|
||
COMEXT=COMNAM+1 ;[175] EXTENSION " "
|
||
COMPPN=COMEXT+1 ;[175] PPN " "
|
||
COMSFD=COMPPN+1 ;[175] SFD'S " "
|
||
SWITC=COMSFD+5 ;[175] SWITCHES " "
|
||
SWITHL=SWITC+1 ;[175] LAST SWITCH TYPED, IN SIXBIT
|
||
|
||
OPNBLK==<OPNSTS=SWITHL+1> ;[175] STATUS TO DO OPEN WITH
|
||
OPNDEV=OPNSTS+1 ;[175] DEVICE TO OPEN
|
||
OPNBUF=OPNDEV+1 ;[175] BUFFER ADDRESS
|
||
|
||
OPNCHR=OPNBUF+1 ;[175] DEVCHR OF DEVICE IN OPNDEV
|
||
|
||
PTHBLK=OPNCHR+1 ;[175] 1ST WORD OF PATH BLOCK
|
||
PTHFLG=PTHBLK+1 ;[175] SCAN SWITCH & OTHER FLAGS
|
||
PTHPPN=PTHFLG+1 ;[175] PROJ-PROG PAIR
|
||
PTHSFD=PTHPPN+1 ;[175] FIRST SFD
|
||
PTHLEN=PTHSFD+5-PTHBLK+1 ;[175] LENGTH OF PATH BLOCK
|
||
|
||
XFILNM==PTHBLK+PTHLEN ;[175] EXTENDED OPEN BLOCK
|
||
XCNT=XFILNM+.RBCNT ;[175] COUNT OF ARGS FOLLOWING
|
||
XPPN=XFILNM+.RBPPN ;[175] POINTER TO PATH BLOCK
|
||
XNAM=XFILNM+.RBNAM ;[175] FILE NAME
|
||
XEXT=XFILNM+.RBEXT ;[175] EXTENSION
|
||
XPRV=XFILNM+.RBPRV ;[175] PROT. & DATES
|
||
XSIZ=XFILNM+.RBSIZ ;[175] FILE SIZE (WORDS)
|
||
XVER=XFILNM+.RBVER ;[175] VERSION
|
||
XSPL=XFILNM+.RBSPL ;[175] SPOOLING NAME
|
||
XEST=XFILNM+.RBEST ;[175] ESTIMATED SIZE
|
||
XALC=XFILNM+.RBALC ;[175] BLOCKS ALLOCATED TO FILE
|
||
XPOS=XFILNM+.RBPOS ;[175] POSITION OF FILE ON DISK
|
||
XNCA=XFILNM+.RBNCA ;[175] NON-PRIVED CUST. ARG.
|
||
XDEV=XFILNM+.RBDEV ;[175] UNIT OF STR THAT FILE CAME FROM
|
||
XFILEN=XDEV-XFILNM+1 ;[175] LENGTH OF LOOKUP BLOCK
|
||
|
||
SFILNM==XNAM ;[175] ALTERNATE NAME FOR DTA LOOKUPS
|
||
CPATH=XFILNM+XFILEN ;[175] SECOND PATH BLOCK FOR CHKPTH
|
||
CFLG=CPATH+1 ;[175] SCAN SWITCH
|
||
CPPN=CFLG+1 ;[175] PPN
|
||
CSFD=CPPN+1 ;[175] 1ST SFD
|
||
CPTLEN=CSFD+5-CPATH+1 ;[175] LENGTH OF PATH BLOCK
|
||
|
||
DCBLK=CPATH+CPTLEN ;[175] DSKCHR BLOCK FOR EB OPEN
|
||
DCSNM=DCBLK+.DCSNM ;[175] STRUCTURE NAME FILE IS ON
|
||
DCLEN==DCSNM-DCBLK+1 ;[175] LENGTH OF DSKCHR BLOCK
|
||
|
||
COMEZR==DCBLK+DCLEN-1 ;[175] LAST LOCATION TO ZERO IN SCANNER
|
||
IFL <STABLN-<COMEZR-COMZR+1>>,<PRINTX ? MOVE X??? BLOCKS TO BIGGER AREA>
|
||
|
||
U BCOUNT,1 ;BEGPAG MATCH FLAG FOR SERCH1 [ED#117]
|
||
U SYMS,22 ;LIS+4(0),OG3+1,GC+3(0)
|
||
U VALS,22 ;LIS+4(0),OG3+3,GC+3(0)
|
||
U CNTS,22 ;LIS+4(0),OG3+2,GC+3(0)
|
||
U SYMEND,0 ;
|
||
U EQM,1 ;LEVEL OF MACRO NESTING [ED#114]
|
||
U SRHCTR,1 ;# OF CHARS IN SEARCH ARGUMENT (MUST PRECEDE SRHARG)
|
||
U SRHARG,^D16 ;STORE FOR SEARCH ARGUMENT
|
||
U PFL,LPF ;
|
||
U GCTAB,GCTBL ;GCS3+4,GCM2+13
|
||
U QTAB,44 ;Q-REGISTER TABLE
|
||
;USEA+1,PCNT+1
|
||
U PDL,LPDL ;
|
||
U SAVE,16 ;AC STORAGE FOR GC
|
||
U SAV16,1 ;
|
||
|
||
IFE BUGSW,<U CMDBFR,0> ;COMMAND BUFFER
|
||
IFN BUGSW, <U CMDBFR,1
|
||
U LOWEND,0>
|
||
|
||
LIT ;SO PATCH SPACE IS AT TOP OF HI-SEG
|
||
PATCH: END TECO
|
||
|
||
|