mirror of
https://github.com/PDP-10/stacken.git
synced 2026-02-28 09:07:42 +00:00
2810 lines
93 KiB
Plaintext
2810 lines
93 KiB
Plaintext
TITLE FILCOM PROGRAM TO COMPARE FILES - V22A(121)
|
||
SUBTTL BOWERING/DMN/TWE/DMN/LCR/LLN/ILG/MFB/MS/PY/BAH 15-Jun-88
|
||
|
||
|
||
|
||
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1970,1979,1981,1984,1986,1988.
|
||
;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.
|
||
|
||
|
||
|
||
|
||
VFILCM==22 ;VERSION NUMBER
|
||
VUPDATE==1 ;DEC UPDATE
|
||
VEDIT==121 ;EDIT LEVEL
|
||
VCUSTOM==0
|
||
|
||
%%FLCV==<VCUSTOM>B2+<VFILCM>B11+<VUPDATE>B17+VEDIT
|
||
IFDEF .MCRV.,<.VERSION <%%FLCV>>
|
||
|
||
INTERNAL .JBVER
|
||
LOC <.JBVER==137>
|
||
EXP %%FLCV
|
||
RELOC 0
|
||
|
||
EXTERNAL .JBFF, .JBREL, .HELPR
|
||
|
||
|
||
SEARCH UUOSYM,MACTEN ;[74]
|
||
.REQUEST REL:HELPER ;[72] Add the request for HELPER
|
||
.DIRECTIVE FLBLST ;[100]
|
||
SALL ;[100]
|
||
|
||
TWOSEG
|
||
RELOC 400000 ;[101] IF MOVED UP, CHANGE BLANK LINE IM MEMORY BIT
|
||
|
||
COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1970,1988. ALL RIGHTS RESERVED.
|
||
\; END COPYRIGHT MACRO
|
||
|
||
ACDEV==1 ;COMMAND SCANNER ACCUMULATORS
|
||
ACFILE==2
|
||
ACEXT==3
|
||
ACDEL==4
|
||
ACPNTR==5
|
||
ACPPN==6 ;COMMAND SCANNER AC FOR PROJ,PROG #
|
||
|
||
CTL==0 ;I/O CHANNEL ASSIGNMENTS
|
||
IN1==1
|
||
IN2==2
|
||
|
||
W1=1
|
||
W2=2
|
||
W3=3
|
||
FIL=4 ;FILE # (0 IS FILE 1; 1 IS FILE 2)
|
||
F1=5 ;LINE POINTER FILE 1 (CONTAINS INTEGER)
|
||
F2=F1+1 ;DITTO FILE 2
|
||
FR=7 ;FLAG REGISTER (LH) AND FILE #(0 OR 1)(RH)
|
||
C=10 ;CONTAINS 1 CHAR FOR PROCESSING
|
||
T=11 ;TEMPORARY AC
|
||
TT=12 ;TEMP AC
|
||
LOWER=13 ;LOWER BOUND OF COMPARE
|
||
UPPER=14 ;UPPER BOUND OF COMPARE
|
||
CNT=15 ;WORD OR LOCATION COUNT (BINARY)
|
||
PP=17 ;PUSH DOWN POINTER
|
||
S1==F1
|
||
S2==F2
|
||
LPDL==50 ;LENGTH OF PUSH DOWN LIST(HELPER NEEDS MORE THAN 20)
|
||
NOFORM==1 ;DON'T OUTPUT FORM FEED
|
||
PAGSW==2
|
||
ENDSW==4 ;END SWITCH (SUPPRESS FORM-FEED IF FILES IDENTICAL)
|
||
EOF1SW==10 ;EOF SEEN ON FILE 1
|
||
EOF2SW==20 ;EOF SEEN ON FILE 2
|
||
IOTTY==40 ;OUTPUT TO TTY
|
||
SSWBIT==100 ;/S SWITCH - IGNORE SPACING
|
||
CSWBIT==200 ;/C SWITCH - IGNORE COMMENTS
|
||
ALLSW==400 ;/B SWITCH (ALLOWS COMPARING BLANK LINES)
|
||
ASWBIT==1000 ;/A SWITCH - LINE BY LINE COMPARE (ASCII)
|
||
WSWBIT==2000 ;/W SWITCH - WORD BY WORD COMPARE (BINARY)
|
||
XSWBIT==4000 ;/X SWITCH - EXPAND SAV FILES (BINARY)
|
||
CTYPF==10000 ;1 IF ANY CHARS TYPED FOR A COMMAND
|
||
WDFBIT==20000 ;DEFAULT /W (EXTENSION OF REL,XPN,CHN,DMP ETC)
|
||
XDFBIT==40000 ;DEFAULT /X (EXTENSION OF SAV,LOW,SVE)
|
||
HSGBIT==100000 ;DEFAULT HIGH SEGMENT FILE (EXT OF SHR OR HGH)
|
||
USWBIT==200000 ;LIST ENTIRE 2ND FILE, SHOWING CHANGES
|
||
EXEBIT==400000 ;COMPARING EXE FILES IN PROGRESS
|
||
|
||
ASCSW==ASWBIT!SSWBIT!CSWBIT!ALLSW!USWBIT ;ASCII SWITCHES
|
||
BINSW==WSWBIT!XSWBIT!WDFBIT!XDFBIT!HSGBIT!EXEBIT ;BINARY SWITCHES
|
||
|
||
MATCH==3 ;# LINES TO BE MATCHED
|
||
LPP==^D56 ;LINES/PAGE
|
||
|
||
MAXSFD==7 ;MAXIMUM NUMBER OF SFD'S ALLOWED
|
||
PTHADR==4 ;OFFSET TO PATH BLOCK
|
||
PTHPPN==6 ;OFFSET TO PPN IN BLOCK
|
||
PTHSFD==7 ;OFFSET TO SFD IN BLOCK
|
||
SUBTTL REVISION HISTORY
|
||
|
||
;START OF VERSION 20A
|
||
;17 ADD DATE75 HACK
|
||
|
||
;START OF VERSION 21
|
||
;20 (10181) CHECK FOR DOUBLE = IN BINARY MODE
|
||
;21 (14149) FORCE /1L IF /U IS SEEN TO PRINT ONE LINE CHANGES
|
||
; ONLY. 02-OCT-74, JNT.
|
||
;22 (12251) CHANGE WORD COUNT FIELD TO 36 BITS TO PROVIDE
|
||
; FOR FILES LONGER THAN 2048 DISK BLOCKS.
|
||
;23 MAKES FILCOM GET THE JOB'S PROJ.NUMBER IF ONLY
|
||
; PROGR.NUMBER IS SPECIFIED, AND THE PROGR.NUMBER IF ONLY
|
||
; PROJ.NUMBER IS SPECIFIED. 03-JAN-75, IB.
|
||
;24 (15168) FIX ERROR MESSAGES FOR FILES NOT FOUND ETC.
|
||
; ILG 29-JAN-75
|
||
;
|
||
;25 ADD SUPPORT FOR EXE FILE COMPARISONS
|
||
; SEB 12-MAR-75
|
||
;26 change "foo: z" to be "foo: block 1" so low seg
|
||
; won't be created
|
||
; ig
|
||
;
|
||
;27 make "tty:=foo.exe" work correctly.
|
||
; seb may 6
|
||
|
||
;30 MAKE SURE THAT THE '/Q' SWITCH TAKES A QUICK EXIT WHEN
|
||
; DIFFERENCES ARE FOUND.
|
||
; SPR # 19411 29-APR-76 LCR.
|
||
;
|
||
;
|
||
;31 CLEAR FILCOM'S BUFFERS DURING INITIALIZATION ROUTINE,
|
||
; TO AVOID GETTING "FILES ARE DIFFERENT" WHEN COMPARING
|
||
; BINARY FILES UNDER ASCII MODE.
|
||
; SPR # 10-19442 30-APR-76 LCR.
|
||
;
|
||
;32 FIX ADDRESS CALCULATION WHEN EXPANDING .SAV FILES. WHEN
|
||
; FILCOM FOUND ONE END-OF-FILE, IT COULD GET CONFUSED
|
||
; ABOUT THE ADDRESSES IN THE OTHER FILE.
|
||
; SPR # 10-19991, 27-JUL-76 LLN.
|
||
;
|
||
;33 CORRECT SOME PROBLEMS ASSOCIATED WITH LINE NUMBERS -- NAMELY,
|
||
; IF SKIPPING BLANK LINES, ALSO SKIP LINES HAVING ONLY A LINE
|
||
; NUMBER. ALSO, HANDLE PAGE MARKS AND BASIC FILES (WHICH
|
||
; DON'T ALWAYS HAVE TABS AFTER LINE NUMBERS) CORRECTLY
|
||
; BY EATING THE CHARACTER AFTER A LINE NUMBER ONLY IF IT
|
||
; IS A TAB.
|
||
; SPR # 10-20234, 13-AUG-76 LLN.
|
||
;34 Try harder to find multiple-line matches in update
|
||
; mode. This involves varying NUMLIN as the two files are
|
||
; read, if no /L is given by the user. This gives FILCOM
|
||
; the look-ahead capability lost by edit 21, without
|
||
; reintroducing the same problems edit 21 fixed.
|
||
; SPR # 10-20346, 15-Oct-76 LLN.
|
||
;
|
||
;35 ADD SUPPORT FOR SFD'S
|
||
; NO SPR 16-DEC-76 ILG
|
||
;
|
||
;
|
||
;36 HAVE HEADER CONTAIN TRUE PATH INFORMATION
|
||
; REGARDLESS OF TYPED IN COMMAND STRING
|
||
; NO SPR 16-DEC-76 ILG
|
||
;
|
||
;37 COMPARE EXE FILES PROPERLY WHEN ONE FILE HAS DIFFERENT
|
||
; MAP FROM THE OTHER AND THE SECOND IS SHORTER.
|
||
; NO SPR 16-DEC-76 ILG
|
||
;
|
||
;40 RESERVED FOR DECSYSTEM20.
|
||
;
|
||
;41 DON'T WRITE A NULL FILE IF NO DIFFERENCES ARE ENCOUNTERED ON
|
||
; A COMPARISON.
|
||
; SPR # 21610 ILG 16-DEC-76
|
||
;
|
||
;42 ALLOW A NULL SPECIFICATION FOR EXTENSION ON THE OUTPUT SIDE
|
||
; NO SPR ILG 16-DEC-76
|
||
;
|
||
;43 Handle .EXE files which have a directory
|
||
; entry which encompasses more than 1000 pages.
|
||
; LLN, SPR # 10-21429, 12-Jan-77
|
||
;
|
||
;Make this version 21A.
|
||
;
|
||
;44 Consider carriage-return to be an EOL character
|
||
; if it is not followed by LF, VT, or FF. This
|
||
; gets underlining right in update mode.
|
||
; LLN, SPR # 10-22466, 22-Apr-77
|
||
;
|
||
;45 Exit when through processing a command if ^Z was used
|
||
; to terminate it. LLN, SPR # 10-22854, 2-Jun-77
|
||
;
|
||
;46 Make buffers for headers big enough to handle the
|
||
; longest possible filespecs. LLN, SPR # 10-23644,
|
||
; 12-Sep-77
|
||
;
|
||
;47 Make all the month names 3 characters and lowercase.
|
||
; LLN, SPR # 10-23642, 3-Oct-77
|
||
;
|
||
;50 Accept a line-terminating character in lieu of a
|
||
; closing right-bracket. LLN, SPR # 10-23642, 4-Oct-77
|
||
;
|
||
;51 Keep creation dates in the headers lined up. Note:
|
||
; this edit supercedes edit 46. LLN, 5-Oct-77,
|
||
; SPR # 10-23642.
|
||
;
|
||
;52 Always produce a file in update mode, even if
|
||
; there are no differences. LLN, SPR # 10-23873,
|
||
; 9-Dec-77
|
||
;
|
||
;53 If second input filespec was a magtape, and /W,
|
||
; /E, or /X was specified, no comparison was done and
|
||
; the first file was merely listed. LLN, 15-Dec-77,
|
||
; SPR # 10-23863.
|
||
;
|
||
;54 Finish teaching FILCOM about large (more than
|
||
; a halfword) addresses in EXE files.
|
||
; LLN, SPR # 10-25025, 13-Feb-78
|
||
;
|
||
;55 Prevent sporadic bogus differences with line-numbered
|
||
; files. LLN, SPR # 10-25063, 7-Apr-78
|
||
;
|
||
;56 EXE files were always being expanded, even if you
|
||
; said /W. Also, FILCOM was not skipping over the entry
|
||
; vector portion of the directory properly, resulting
|
||
; in the ?NOT IN EXE FORMAT message. LLN, 12-Oct-78,
|
||
; SPR # 10-26742
|
||
;
|
||
;57 Stop reading binary files as soon as the user-specified
|
||
; upper limit is reached. LLN, no SPR, 8-Jan-79
|
||
;
|
||
;60 Make this version 21B for TOPS20 release. Fix address
|
||
; calculation for EXE files so that bogus differences are
|
||
; not reported. LLN, no SPR, 30-Jan-79
|
||
;
|
||
;61 Make FILCOM recognize the extension UNV and use word compare
|
||
; instead of the ASCII line compare. MFB, 5-May-80
|
||
; SPR # 10-28165
|
||
;
|
||
;62 Make the year in the header line of the output standard format
|
||
; (i.e. YY not YYYY). MFB, 5-May-80, SPR # 10-27778
|
||
;
|
||
;63 Accept memory location greater than 777777 and print it
|
||
; in the full word instead of regular halfword
|
||
; typeout also jump to the new page first time to help readability
|
||
; MS, 22-Jan-81 SPR 10-30551
|
||
;
|
||
;64 Deleted by edit 70.
|
||
; Do not compare blank line which has spaces, tab or ";" followed
|
||
; by CRLF on C and S switch
|
||
; MS, 19-May-81, SPR #20-16170
|
||
;
|
||
;65 Deleted by edit 71.
|
||
; Set the flag EFN to check the validity of the next character
|
||
; after processing a switch.
|
||
; MS, 21-Aug-81, SPR #10-31477
|
||
;
|
||
;66 Deleted by edit 70.
|
||
; Correct edit 64. Check the characters at GLINE3.
|
||
; MS, 26-Aug-81, SPR 10-31463
|
||
;
|
||
;67 Fix off by one bug which will make two .EXE files which are
|
||
; identical except for the directories appear very different.
|
||
; PY, 16-Sep-81 SPR 20-16787
|
||
;
|
||
;70 Delete edits 64 and 66.
|
||
; BAH, 10-Nov-81, SPR 10-31714.
|
||
;
|
||
;71 Delete edit 65; it broke command processing if a switch is specified
|
||
; first. Fix the original problem which allowed switches to be typed
|
||
; in the middle of a filename. This edit also reports if an unknown
|
||
; switch has been typed and if more than one filename or extension has
|
||
; been typed. Therefore, some previously successful commands may now
|
||
; produce an error message and terminate the process.
|
||
; BAH, 21-Dec-81, SPR 10-31822
|
||
;
|
||
;72 Add a .REQUEST HELPER so loading isn't special cased.
|
||
; BAH, 12-Jan-82.
|
||
;
|
||
;73 Make FILCOM recognize the extensions ATR, DBS, QUD, SCH, APL, OVL, and
|
||
; SYM to use word compare instead of ASCII.
|
||
; BAH, 12-Jan-82, SPR 10-32024.
|
||
;
|
||
;74 None. 2-Nov-82. BAH.
|
||
; Search UUOSYM and MACTEN. Then add big buffer open bit. Also clean up
|
||
; listing a bit for readability.
|
||
;
|
||
;75 None. 2-Nov-83. BAH.
|
||
; Extend edit 71 to report an error if a double extension is typed,
|
||
; (TT:=FOO.BAR.BAR,FOO.BAR). FILCOM LOOKUPed the file BAR.BAR.
|
||
;
|
||
;Start version 22
|
||
;76 None. 6-Jun-84. TL.
|
||
; Merge code from ADP to add /O support. Modify it so output file
|
||
; is same as before if no /O. (For SIRUS, others who read FILCOM output.)
|
||
;
|
||
;77 None. 25-Jul-84. TL.
|
||
; Fix /O/B test for page break.
|
||
;
|
||
;100 None. 25-Jul-84. TL.
|
||
; More of edit 74. Also, deal with CCL RUN UUOs.
|
||
;
|
||
;101 None. 25-Jul-84. TL.
|
||
; Try to get /U without /L to be a bit brighter.
|
||
;102 10-34246 31-Jul-84 BAH
|
||
; If the right square bracket of the second input file spec is missing
|
||
; in the command "=A.B[C,D,E],A.B[F,G]", FILCOM gives a LOOKUP error 23.
|
||
; Edit 50 did not catch all cases.
|
||
;
|
||
;103 Eklund 8-Aug-84 TL
|
||
; /O format didn't pass muster. I'd rather switch than fight.
|
||
;
|
||
;104 WXD 28-Aug-84 TL
|
||
; /O didn't count label offsets right in all cases. Throw
|
||
; out the ADP method, and invent our own bugs.
|
||
;
|
||
;105 TARL 18-Sep-84 TL
|
||
; Revoke edit 41 if /T specified. This makes monitor builds on
|
||
; the -10 work better.
|
||
;
|
||
;106 RAP 19-Sep-84 TL
|
||
; Fix obscure Ill mem ref in edit 101.
|
||
;
|
||
;107 10-35153 10-Apr-85 TL
|
||
; 101 produces yet another obscure Ill mem ref.
|
||
;
|
||
;110 10-35161 14-May-85 TL
|
||
; 101 didn't quite get blank line suppression right. Deletion
|
||
; in /U mode isn't pretty.
|
||
;
|
||
;111 KBY 3-Jun-85 TL
|
||
; New HELPER needs more stack. Increase it.
|
||
;
|
||
;112 None. 9-Aug-85 BAH
|
||
; Do copyrights.
|
||
;
|
||
;113 None. 12-Sep-85 BAH
|
||
; FILCOM compares too many job data area locations. Do not compare
|
||
; locations 0-40, 42, 43, 45-73, 77-111, 113, 114, and 132 inclusive.
|
||
; Also FILCOM had a bug where it was erroneously comparing location 73.
|
||
;
|
||
;114 Deleted by edit 120.
|
||
; 868772 03-Feb-86 DRB
|
||
; /1L doesn't work. Apparent fencepost error.
|
||
;
|
||
;115 KBY/RDH 7-Apr-86 TL
|
||
; /O very rarely gets the base tag wrong. For example, if file 2 has
|
||
; two insertions that are far enough apart to be distinct, but closer
|
||
; than the length of the first insertion, the wrong tag would be used.
|
||
; Edit 110 broke some cases of a difference in progress at EOF,
|
||
; causing loops.
|
||
;
|
||
;116 10-33206 16-Sep-86 BAH
|
||
; Edit 101 did not take line sequenced blank lines when setting
|
||
; the 400K bit in the line header word.
|
||
;
|
||
;117 10-JMF-350987 25-Sep-87 TL
|
||
; Add /I - Do case-blind comparisons.
|
||
;
|
||
;120 10-36057 11-Jan-88 BAH
|
||
; Edit 114 broke /1L. Remove the edit. Since all traces of what edit
|
||
; 114 was trying to fix are gone, wait for another SPR to reproduce
|
||
; that problem.
|
||
;
|
||
;121 10-36057,10-36057AI 15-Jun-88 JJF
|
||
; Change sense of test used to see if we are in /L mode or not.
|
||
; Edit 120 went too far in the clean-up.
|
||
;
|
||
; END OF REVISION HISTORY.
|
||
;
|
||
SUBTTL FILE COMPARE
|
||
|
||
;PUT ONCE-ONLY INITIALIZATION HERE.
|
||
FILCOM: JFCL ;[100] IN CASE OF CCL RUN
|
||
SETZM XITFLG ;[45] ^Z HAS NOT BEEN TYPED
|
||
JRST COMPGO ;[45] SO GO PROCESS A COMMAND.
|
||
COMP: CLOSE CTL,
|
||
RELEAS CTL,
|
||
RELEAS IN1,
|
||
RELEAS IN2,
|
||
COMPGO: SKIPE XITFLG ;[45] EXIT BECAUSE OF ^Z?
|
||
EXIT 1, ;[45] YES, A CONTINUE WILL RESTART
|
||
RESET
|
||
MOVE PP,[IOWD LPDL,PPSET] ;SET UP PUSH DOWN LIST
|
||
MOVEI 0,ENDP+500 ;GUARANTEE ROOM FOR BUFFERS (2 DSK +TTY IN AND OUT)
|
||
CAMG 0,.JBREL ;BUT NEVER REDUCE SIZE
|
||
JRST .+3 ;INCASE LOADED WITH DDT
|
||
CORE 0,
|
||
JRST ERRCOR ;NOT AVAILABLE
|
||
SETZB LOWER,PPSET ;THIS IS THE ZERO WHICH WILL
|
||
;BE "BLT"ED TO CLEAR CORE
|
||
MOVE [XWD PPSET,PPSET+1] ;ZERO STORAGE AREA
|
||
BLT ENDP-1 ;UPPER LIMIT TO BE ZEROED
|
||
MOVE PPSET ;[31] ZERO OUT
|
||
MOVEM @.JBFF ;[31] FIRST BUFFER POS.
|
||
HRRZ .JBFF ;[31] BEGINING OF AREA TO CLEAR
|
||
ADDI 1 ;[31] SET THE 'FROM' PART FOR THE 'BLT'
|
||
CAML .JBREL ;[31] IS THIS NECESARY?
|
||
JRST CMPGO1 ;[31] NO, CONTINUE INITIALICING REST
|
||
HRL .JBFF ;[31] SET LH FOR 'BLT'
|
||
BLT @.JBREL ;[31] AND DO IT.
|
||
CMPGO1: HRLOI UPPER,377777 ;LARGE NUMBER BY DEFAULT
|
||
|
||
MOVEI 0,MATCH
|
||
MOVEM 0,NUMLIN ;MATCH IS NORMALLY 3 LINES
|
||
|
||
AOS PAGNUM+0 ;ZEROED BY BLT ABOVE-1ST PAGE IS 1
|
||
AOS PAGNUM+1 ;DITTO FOR SECOND FILE
|
||
|
||
|
||
MOVSI FR,PAGSW+NOFORM ;INIT FR FOR NEW PAGE HEADING
|
||
PUSHJ PP,INITTY ;INITIALIZE TTY
|
||
PUSHJ PP,CRLF ;OUTPUT CARRIAGE RETURN - LINE FEED
|
||
MOVEI C,"*" ;TELL USER WE ARE READY FOR COMMAND
|
||
PUSHJ PP,TYO ;OUTPUT THE *
|
||
PUSHJ PP,DMPOUT ;OUT GOES THE *
|
||
SETZM FILCNT ;CLEAR FILE COUNTER FOR NAME ROUTINE
|
||
PUSHJ PP,NAME1 ;ANALYIZE OUTPUT DEVICE AND NAME
|
||
CAIN C,"_" ;ERROR IF NO ARROW
|
||
JRST CTLSE1 ;ITS THERE--PROCEED
|
||
TLNN FR,CTYPF ;ANY COMMAND TYPED?
|
||
JRST COMPGO ;NO
|
||
CTLSER: PUSHJ PP,EAT ;[45] CLEAR OUT THE BAD LINE
|
||
JSP T,ERROUT
|
||
ASCIZ /?Command error/
|
||
|
||
CTLSE1: SETZM OUTEXT ;ASSUME NO OUTPUT EXTENSION GIVEN
|
||
CAIN ACDEL,"." ;DOT THERE?
|
||
SETOM OUTEXT ;YES,SO THERE IS AN EXTENSION
|
||
JUMPN ACDEV,CTLSE2 ;NO DEFAULT IF DEVICE NOT 0
|
||
SKIPN ACFILE
|
||
MOVSI ACDEV,'TTY' ;IF FILENAME 0, ASSUME TTY
|
||
SKIPE ACFILE
|
||
MOVSI ACDEV,'DSK' ;IF FILENAME NOT 0, ASSUME DSK
|
||
CTLSE2: MOVEM ACDEV,OUTDEV ;SAVE OUTPUT DEVICE IN DIRECTORY BLOCK
|
||
MOVEM ACFILE,OUTDIR ;PUT SIXBIT FILE NAME IN
|
||
HLLZM ACEXT,OUTDIR+1 ;AND SAVE EXTENSION
|
||
MOVEM ACPPN,OUTDIR+3 ; AND PROJ, PROG NUMBER
|
||
;PROCESS INPUT PART OF COMMAND STRING
|
||
|
||
AOS FILCNT ;INCREMENT FILE COUNT
|
||
PUSHJ PP,NAME1 ;GET INPUT COMMAND STRING
|
||
TLNN FR,CTYPF ;ANY FILE DESCRIPTOR TYPED?
|
||
JRST CTLSER ;NO, ERROR
|
||
SETZ T, ;GET A ZERO
|
||
EXCH T,EXTFL2 ;INCASE NO 2ND FILE
|
||
MOVEM T,EXTFL1 ;FLAGS IN RIGHT PLACE
|
||
CAIN C,"," ;COMMA TO TERMINATE 1ST INPUT FILE?
|
||
JRST CTLSE3 ;YES, NORMAL CASE
|
||
TLNE FR,ASCSW ;ASCII SWITCH?
|
||
JRST CTLSER ;YES, ERROR
|
||
TLNN FR,BINSW ;BINARY SWITCH?
|
||
TLNE T,BINSW ;OR EXT?
|
||
TLOA FR,EOF2SW ;YES, SET EOF FOR 2'ND INPUT FILE
|
||
JRST CTLSER ;ASCII, ERROR
|
||
CAIG C,.CHESC ;[20] [100] BUT ONLY ALLOW VALID EOF
|
||
CAIGE C,.CHLFD ;[20] [100] IF GREATER THAN ESC OR LESS THAN FF
|
||
JRST CTLSER ;[20] [100] GIVE ERROR
|
||
CAILE C,.CHCRT ;[20] [100] ONLY ALLOW LF, VT, FF, CR
|
||
CAIL C,.CHCNZ ;[20] [100] ^Z AND ESC
|
||
CAIA ;[20] TO END LINE
|
||
JRST CTLSER ;[20] OTHERWISE GIVE ERROR
|
||
CTLSE3: SKIPN ACDEV ;ASSUME DSK IF NO SPECIFIED DEVICE
|
||
MOVSI ACDEV,'DSK'
|
||
MOVEM ACDEV,INDEV1
|
||
MOVEM ACFILE,INDIR1 ;FIRST INPUT FILE
|
||
MOVEM ACEXT,INDIR1+1 ;AND SAVE EXTENSION
|
||
MOVEM ACPPN,INDIR1+3 ; AND PROJ,PROG NUMBER
|
||
MOVEM ACPPN,INDPPN ;SAVE P,P AGAIN
|
||
|
||
MOVEI 0,.IOASL ;[100] SET UP INPUT DATA MODE
|
||
TXO 0,UU.LBF ;[74] USE BIG BUFFERS
|
||
;1 (WHICH IS ACDEV) ALREADY IS SET UP
|
||
MOVEI 2,INBUF1 ;SET UP INPUT BUFFER HEADER
|
||
OPEN IN1,0 ;INIT DEVICE
|
||
JRST ERRI ;DEVICE CAN'T BE INITIALIZED
|
||
|
||
INBUF IN1,2 ;DO LOOKUP ON FIRST FILE NAME
|
||
LOOKUP IN1,INDIR1
|
||
JRST ERRIA1 ;[24]ERROR RETURN
|
||
MOVEI T,HBUF1
|
||
PUSHJ PP,HEADER ;CREATE HEADER LINE- FILE #1
|
||
MOVE T,EXTFL1 ;RESET T INCASE NO 2ND FILE
|
||
TLNE FR,EOF2SW ;PREMATURE EOF SET
|
||
JRST NOINP2 ;YES, NO SECOND FILE
|
||
PUSHJ PP,NAME1
|
||
TLNN FR,CTYPF ;ANY FILE DESCRIPTOR TYPED?
|
||
JRST CTLSER ;NO, ERROR
|
||
SKIPN ACDEV
|
||
MOVSI ACDEV,'DSK' ;"DSK" IS DEFAULT
|
||
MOVEM ACDEV,INDEV1
|
||
SKIPE ACFILE
|
||
MOVEM ACFILE,INDIR1 ;INSERT FILE NAME AND EXTENSION
|
||
CAIN ACDEL,"." ;PERIOD MEANS EXPLICIT EXTENSION
|
||
MOVEM ACEXT,INDIR1+1
|
||
MOVEM ACPPN,INDIR1+3 ;SAVE PROGER IN DIRECT BLOCK
|
||
MOVEM ACPPN,INDPPN ;SAVE P,P AGAIN
|
||
|
||
MOVEI 0,.IOASL ;[100] INIT DEVICE IN ASCII LINE MODE
|
||
TXO 0,UU.LBF ;[74] USE BIG BUFFERS
|
||
MOVEI 2,INBUF2 ;BUFFER HEADER FOR 2ND INPUT FILE
|
||
OPEN IN2,0 ;INIT 2ND DEVICE
|
||
JRST ERRI ;INIT FAILED
|
||
|
||
INBUF IN2,2 ;LOOKUP ON SECOND FILE NAME
|
||
LOOKUP IN2,INDIR1
|
||
JRST ERRIA2 ;[24]
|
||
MOVEI T,HBUF2
|
||
PUSHJ PP,HEADER ;CREATE HEADER LINE- FILE #2
|
||
|
||
TLNE FR,ASCSW ;ASCII SWITCHES SEEN
|
||
JRST INICTL ;YES, LEAVE WELL ALONE
|
||
SETZ T, ;[53] RESET DEFAULT MODE
|
||
TLNE FR,BINSW ;BINARY SWITCHES SEEN?
|
||
JRST SETBIN ;YES, CHANGE MODE TO BINARY
|
||
MOVE T,EXTFL1 ;GET DEFAULT EXT MODE
|
||
IOR T,EXTFL2 ;FOR BOTH FILES
|
||
TLNN T,BINSW ;BINARY WIN OVER ASCII
|
||
JRST INICTL ;ASCII
|
||
SETBIN: SETSTS IN2,.IOBIN ;[100] CHANGE TO BINARY MODE
|
||
NOINP2: MOVEI 0,(POINT 36,,35)
|
||
IOR FR,T ;SET MODE BINARY
|
||
SETSTS IN1,.IOBIN ;[100]
|
||
HRLM 0,INBUF1+1 ;CHANGE FROM ASCII
|
||
HRLM 0,INBUF2+1
|
||
INICTL: MOVEI 0,.IOASC ;[100] INIT OUTPUT DEVICE
|
||
TXO 0,UU.LBF ;[74] USE BIG BUFFERS
|
||
MOVE 1,OUTDEV
|
||
MOVSI 2,CTOBUF
|
||
OPEN CTL,0
|
||
JRST ERRA ;INIT FOR OUTPUT FAILED
|
||
MOVE TT,OUTDEV ;CAN OUTPUT DEVICE DO OUTPUT
|
||
DEVCHR TT,
|
||
TXNN TT,DV.OUT ;[100]
|
||
JRST ERRONO ;[24]NO
|
||
TXNE TT,DV.TTY ;[100] IS OUTPUT DEVICE TTY?
|
||
TLO FR,IOTTY ;YES, DO 1 OUTPUT PER LINE
|
||
|
||
SKIPN ACFILE,INDIR1 ;IF LAST INPUT FILE NAME WAS NULL,
|
||
MOVE ACFILE,[SIXBIT /FILCOM/] ; MAKE OUTPUT "FILCOM", BUT
|
||
SKIPN OUTDIR ; ONLY IF NO OUTPUT FILENAME SPECIFIED
|
||
MOVEM ACFILE,OUTDIR
|
||
MOVSI ACEXT,'SCM' ;ASSUME ASCII
|
||
TLNE FR,BINSW ;BINARY?
|
||
MOVSI ACEXT,'BCM' ;BCM IF BINARY
|
||
SKIPL OUTEXT ;OUTPUT EXTENSION GIVEN?
|
||
SKIPE OUTDIR+1 ;OR ONE IMPLIED?
|
||
SKIPA ;RIGHT, NO NEED FOR CHANGE
|
||
MOVEM ACEXT,OUTDIR+1 ;USE DEFAULT
|
||
ENTER CTL,OUTDIR ;AND TRY TO ENTER OUTPUT FILE NAME
|
||
JRST ERROEF ;[24]
|
||
OUTPUT CTL,
|
||
;FIND OUT HOW MUCH CORE IS AVAILABLE AND SET POINTERS AND LIMITS
|
||
|
||
HRRZ W1,.JBFF
|
||
ADDI W1,20 ;GUARANTEE AN INITIAL 20 WORDS
|
||
CORE W1, ; FOR TEXT BUFFERS
|
||
JRST NORERR ;DIDN'T GET IT, ERROR
|
||
|
||
AOS W1,.JBFF
|
||
HRRZM W1,LBUFP1 ;SET 1ST ADDRESS FILE 0
|
||
SETZM 1(W1) ;FORCE NULLS INTO BUFFER
|
||
HRRZM W1,LBUFP2 ;DITTO FILE 2
|
||
MOVE W1,.JBREL
|
||
SUB W1,.JBFF ;COMPUTE SPACE AVAILABLE
|
||
HRRZS W1
|
||
LSH W1,-1 ;AVAILABLE SPACE/2
|
||
ADDB W1,LBUFP2 ;INPUT POINTER FILE 2 STARTS HALF WAY THROUGH BUFFER
|
||
SETZM 1(W1) ;FORCE NULLS INTO BUFFER
|
||
|
||
HRLOI 0,377777
|
||
MOVEM 0,OLDNUM+0 ;ANY LINE # IS SMALLER THAN
|
||
MOVEM 0,OLDNUM+1 ; THIS ONE
|
||
|
||
SETOB F1,TOP1 ;INITIALIZE TOP OF EACH FILE
|
||
SETOB F2,TOP2 ;THE TOP IS THE HIGHEST LINE THAT WE HAVE EXAMINED
|
||
TLNE FR,BINSW ;BINARY COMPARE?
|
||
JRST BINCOM ;USE WORD BY WORD IF BINARY
|
||
SOS NUMLIN ;INIT SRCCOM MATCH COND TO "MATCH-1"
|
||
SETOM LSTSYM+SYMLIN ;[104] MAKE SURE BEGINNING OF FILE IS LINE 0
|
||
TLNN FR,USWBIT ;SEE IF UPDATE MODE
|
||
JRST MAINST ;NO
|
||
SKIPN LSEEN ;[21] SEE IF HAD /L
|
||
SETOM USWFLG ;[21],[34] NO, SET A FLAG
|
||
JRST MAINST ;START SRCCOM WITH 1ST LINES
|
||
;THE FOLLOWING CODE IS THE GUTS OF THE PROGRAM.
|
||
;WHEN THE LOOP AROUND MAIN DETECTS THAT TWO LINES ARE NOT A MATCH
|
||
;CONTROL GOES OFF TO DETERMINE THE EXTENT OF THESE DIFFERENCES.
|
||
;THE TOTAL DIFFERENCES ARE DETERMINED AS FOLLOWS. FIRST GET TWO
|
||
;MORE LINES. DOES THE ORGINAL LINE IN FILE 1 WHICH DID NOT MATCH
|
||
;MATCH THE NEW LINE FROM FILE TWO. IF SO THEN THE ORGINAL LINE
|
||
;IN FILE 2 WAS AN INSERTION. (OR A DELETION). IF NO MATCH THIS
|
||
;WAY TRY IT THE OTHER WAY. IF STILL NO MATCH GET TWO MORE LINES
|
||
;TAKE THE NEW LINE FROM FILE 1 AND TRY TO MATCH IT AGAINST ALL THE
|
||
;LINES WE HAVE BEEN EXAMINING IN FILE TWO; THEN DO IT THE OTHER
|
||
;WAY AROUND. EOF'S ARE DETECTED BY "GETTWO" WITH NO RETURN SKIP
|
||
|
||
MAIN: TRZ FR,-1 ;THIS FOR FILE ONE
|
||
PUSHJ PP,MOVEUP ;MOVE UP THE BOTTOM, BECAUSE WE ARE FINISHED
|
||
;WITH TWO LINES
|
||
HRRI FR,1 ;NOW FOR FILE TWO
|
||
PUSHJ PP,MOVEUP ;UP GOES THE BOTTOM POINTER
|
||
MAINST: SETOB F1,F2 ;INITIALIZE LINE POINTERS
|
||
PUSHJ PP,GETTWO ;GET TWO LINES
|
||
JRST MAIN15 ;ONE FILE SHORT
|
||
PUSHJ PP,COMPL ;COMPARE THESE TWO LINES
|
||
JRST MAIN ;THEY MATCH--LOOK AT NEXT TWO
|
||
|
||
;WHEN WE GET HERE WE HAVE DETECTED A DIFFERENCE
|
||
;NOW THE PROGRAM WILL LOOK AHEAD TO TRY AND FIND THE NEXT TWO
|
||
;MATCHING LINES.
|
||
|
||
AOS DIFFLG ;SET "DIFFERENCE IN PROGRESS" FLAG
|
||
AOS ERRCNT ;SET FLAG SHOWING DIFFERENCES FOUND
|
||
|
||
MAIN10: PUSHJ PP,GETTWO ;GET THE NEXT TWO LINES
|
||
JRST MAIN15 ;ONE FILE SHORT
|
||
SETZ F1, ;RESET POINTER FOR FIRST FILE TO
|
||
;THE LINE IN WHICH THE DIFFERENCE WAS FOUND
|
||
|
||
MOVE W1,NUMLIN ;[34] Make a temp copy
|
||
MOVEM W1,TNMLIN ;[34] in case we are updating
|
||
MAIN12: PUSHJ PP,COMPL ;NOW SEE IF WE CAN MATCH THAT LINE
|
||
JSP W1,MULTI ;FOUND 1 LINE MATCH- LOOK FOR MULTIPLE
|
||
MOVE T,F2 ;[107] TOP ON OTHER FILE
|
||
CAMLE T,TOP1 ;[107] IS IT LONGER THAN TOP ON THIS FILE?
|
||
MOVE T,TOP1 ;[107] YES, USE TOP OF THIS FILE
|
||
CAME F1,T ;[107] HAVE WE LOOKED FROM THE MISMATCHED LINE
|
||
;[107] TO THE CURRENT LINE?
|
||
AOJA F1,MAIN12 ;[107] NO--UP LINE POINTER AND TRY AGAIN
|
||
SETZ F2, ;[107] HAVEN'T FOUND A MATCH THIS TIME
|
||
;[107] NOW TRY IT THE OTHER WAY
|
||
MAIN14: MOVE T,F1 ;[107] TOP ON OTHER FILE
|
||
CAMLE T,TOP2 ;[107] IS IT LONGER THAN TOP ON THIS FILE
|
||
MOVE T,TOP2 ;[107] YES, USE TOP OF THIS FILE
|
||
CAML F2,T ;[107] LOOKED FAR ENOUGH? (THIS VERSION HAS
|
||
;THE INEFFICIENCY MENTIONED IN THE LIBRARY
|
||
;WRITE UP REMOVED- TWE)
|
||
JRST CHECK ;[34] Probably, check for /U
|
||
PUSHJ PP,COMPL
|
||
JSP W1,MULTI ;LOOK FOR MULTI LINE MATCH
|
||
AOJA F2,MAIN14 ;INDEX AND LOOK SOME MORE
|
||
|
||
CHECK: SKIPN USWFLG ;[34] Making special /U checks?
|
||
JRST MAIN10 ;[34] No, looked far enough
|
||
SOSGE TNMLIN ;[34] Lines to check this time
|
||
JRST MAIN10 ;[34] None, quit
|
||
JRST MAIN12 ;[34] Try MULTI again
|
||
|
||
|
||
;THE MAIN15 CODE HANDLES THE CASE OF EITHER (OR BOTH) FILES
|
||
;HAVING NO LINES TO COMPARE. IF BOTH FILES HAVE NO LINES, "FINISH"
|
||
;PRINTS OUT ALL LINES IN BOTH FILES (IF ANY) AS DIFFERENCES.
|
||
;IF EITHER FILE HAS A NEW LINE, THE SHORTER FILE IS
|
||
;SEARCHED FOR A MATCH FOR THAT LINE. THIS CONTINUES (READING A NEW LINE
|
||
;FROM THE LONGER FILE) UNTIL NEITHER FILE HAS ANY LINES OR UNTIL A
|
||
;MATCH IS FOUND.
|
||
|
||
MAIN15: SKIPGE W1,GETFIL ;DOES EITHER FILE HAVE A LINE?
|
||
JRST FINISH ;NO
|
||
AOS DIFFLG ;SET "DIFFERENCE IN PROGRESS" FLAG
|
||
AOS ERRCNT ;SET "DIFFERENCES FOUND" FLAG
|
||
HRRZM W1,FIL ;SAVE FILE # THAT HAS LINES
|
||
HRR FR,W1 ;SETUP FR FOR MAIN18
|
||
JUMPL F1,MAIN18 ;TRA IF FILE 1 HAS NO LINES
|
||
JUMPL F2,MAIN18 ;DITTO FILE 2
|
||
TRC FIL,1 ;CHANGE 1 TO 0 (OR VICE VERSA)
|
||
SETOM F1(FIL) ;LOOK THRU SHORT FILE FOR MATCH
|
||
MAIN17: MOVE W1,F1(FIL)
|
||
CAML W1,TOP1(FIL) ;SEARCHED THRU SHORT FILE?
|
||
JRST MAIN10 ;YES, AND NO MATCH
|
||
AOS F1(FIL) ;INDEX LINE
|
||
PUSHJ PP,COMPL ;LOOK FOR A MATCHING LINE
|
||
JSP W1,MULTI ;FOUND A MATCH, NOW LOOK FOR MULTIPLE MATCH
|
||
JRST MAIN17 ;NO MULTI LINE MATCH
|
||
|
||
MAIN18: TLNN FR,USWBIT ;FOR UPDATING, NO LISTING HERE
|
||
PUSHJ PP,PRNTXT ;ALL LINES ARE GONE FROM 1 FILE,
|
||
;OUTPUT THE OTHER WITHOUT USING CORE
|
||
JRST MAIN
|
||
;AT THIS POINT NEITHER FILE HAS ANY MORE LINES TO BE READ.
|
||
;PRINT AS DIFFERENCES ANY LINES REMAINING FOR EITHER FILE.
|
||
|
||
FINISH: MOVEM F1,TEMPF1 ;[115] FAKE OUT MULT8
|
||
MOVEM F2,TEMPF2 ;[115] ...JUST IN CASE WE END UP THERE
|
||
JUMPGE F1,MULT8 ;PRINT DIFFERENCES IF EITHER BUFFER
|
||
JUMPGE F2,MULT8 ; HAS ANY LINES IN IT
|
||
;NO LINES ANYWHERE
|
||
SKIPE OFSSWT ;[103] /O?
|
||
SKIPN W1,NOHDR ;[103] DID ONE FILE END SHORT?
|
||
JRST FIN1 ;[103] NO
|
||
TRNN W1,-1 ;[103] YES, FILE 1?
|
||
PUSHJ PP,PRNSEP ;[103] YES - SEP GOES AFTER EOF
|
||
|
||
FIN1: MOVEI W1,[ASCIZ /|
|
||
/]
|
||
TLNE FR,USWBIT ;"UPDATE" MODE?
|
||
SKIPN DIFFLG ;YES
|
||
JRST FIN2 ;NO
|
||
PUSHJ PP,PPRINT ;PRINT MESS. IF 2ND FILE IS TRUNCATED 1ST FILE
|
||
FIN2: MOVEI T,[ASCIZ /No differences encountered/]
|
||
SKIPN ERRCNT ;ANY DIFFERENCES?
|
||
JRST [ TLNN FR,USWBIT;[52] IF WE ARE UPDATING
|
||
SKIPE OPTSWT ;[105] OR USER WANTS FILE ANYHOW
|
||
JRST FIN3 ;[105] WE WANT TO KEEP THIS
|
||
CLOSE CTL,1B30;[52] DON'T PRODUCE AN OUTPUT FILE
|
||
JRST FIN3 ] ;CONTINUE WITH MESSAGES
|
||
MOVEI T,[ASCIZ /%files are different/]
|
||
SKIPE QSW ;/Q MODE?
|
||
MOVEI T,[ASCIZ /?files are different/]
|
||
FIN3: PUSHJ PP,TYPMSG ;PRINT MESSAGE
|
||
PUSHJ PP,CRLF
|
||
JRST COMP ;END OF SOURCE COMPARE
|
||
|
||
;THIS SECTION LOOKS FOR MULTI LINE MATCH
|
||
|
||
MULTI: SKIPGE NUMLIN ;[114][120][121] MULTIPLE LINE TEST?
|
||
JRST MULT7 ;NO
|
||
HRRZM W1,RTNTMP ;YES, SAVE RETURN ADDRESS
|
||
SETZM NUMTMP ;INIT MULTI-LINE COUNTER
|
||
MOVEM F1,TEMPF1 ;SAVE CURRENT POINTERS
|
||
MOVEM F2,TEMPF2
|
||
MULT2: PUSHJ PP,GETTWO ;GET NEXT TWO LINES
|
||
JRST MULT4 ;ONE FILE DOESN'T HAVE A LINE
|
||
MULT20: SKIPN USWFLG ;[101] FUNNY /U?
|
||
JRST MULT44 ;[101] NO
|
||
PUSHJ PP,SETP ;[101] POINT TO LINES
|
||
MOVEI W3,400K ;[101] BLANK LINE IN MEMORY BIT
|
||
TDNE W3,0(W2) ;[101] IS THIS ONE?
|
||
JRST MULT41 ;[101] YES, SKIP IT
|
||
TDNN W3,0(W1) ;[101] CHECK THE OTHER FILE
|
||
JRST MULT44 ;[101] NOPE
|
||
TRZA FR,-1 ;[101] GET ANOTHER LINE
|
||
MULT41: HRRI FR,1 ;[101] FROM SOME FILE
|
||
SETOM GETCNT ;[101]
|
||
SETOM GETFIL ;[101]
|
||
PUSHJ PP,GLINE ;[101] READ
|
||
SKIPGE GETCNT ;[101] GOT ONE?
|
||
JRST MULT4 ;[101] NO, EOF
|
||
JRST MULT20 ;[101] YUP, SEE IF ONE OF THEM IS BLANK
|
||
|
||
MULT44: PUSHJ PP,COMPL ;COMPARE THEM
|
||
JRST MULT6 ;MATCH, TEST MULTI COUNTER
|
||
MULT4: MOVE F1,TEMPF1 ;NO MATCH, RESET REGS
|
||
MOVE F2,TEMPF2
|
||
JRST @RTNTMP ;RETURN TO WHERE WE GOT TO MULTI FROM
|
||
|
||
MULT6: AOS W1,NUMTMP ;INDEX MULTI-LINE COUNTER
|
||
SKIPN USWFLG ;[34] Update mode check?
|
||
JRST MULT64 ;[34] No, regular one
|
||
CAMGE W1,TNMLIN ;[34] Test for end
|
||
JRST MULT2 ;[34] Not yet, keep trying
|
||
JRST MULT66 ;[34] Done
|
||
MULT64: CAMGE W1,NUMLIN ;[34] TEST FOR END
|
||
JRST MULT2 ;TEST NEXT TWO
|
||
MULT66: EXCH F1,TEMPF1 ;[34] [110] RESET TO 1ST COMPARISION
|
||
EXCH F2,TEMPF2 ;[110]
|
||
MULT7: TLNE FR,USWBIT ;MANUAL UPDATE MODE?
|
||
JRST MULT9 ;YES
|
||
MULT8: TLNE FR,USWBIT ;CHECK UPDATE MODE
|
||
JRST MAIN ;FOR UPDATE MODE, GET 2ND FILE PRINTED
|
||
PUSHJ PP,PNTBTH ;PRINT DIFFERENCES
|
||
;GO BACK AND START COMPARING.
|
||
;WHEN WE START COMPARING AGAIN THE LINE POINTER WILL
|
||
;BE POINTING TO THE FIRST TWO LINES AFTER THE MATCHING LINES
|
||
|
||
MOVE F1,TEMPF1 ;[110] CAUSE MOVEUP TO FLUSH ALL THE
|
||
MOVE F2,TEMPF2 ;[110] LINES THAT WERE JUST MATCHED
|
||
JRST MAIN ;DIFFERENCES PRINTED- LOOK FOR MORE
|
||
|
||
MULT9: SUBI F1,1 ;LEAVE POINTERS POINTING TO
|
||
SOJA F2,MAIN ; LAST DIFFERENCE
|
||
;THIS ROUTINE SETS UP THE POINTERS TO THE TEXT
|
||
|
||
;MEMORY STORAGE AREA LOOKS LIKE THIS:
|
||
;1) BUFFER SPACE FOR FILE # 0 (POINTED TO BY LBUFP1)
|
||
; A) XWD (PAGE #),(WORD COUNT FOR LINE (INCLUDING THIS WORD))
|
||
; BIT 18 OF WORD COUNT MEANS BLANK LINE IN CORE
|
||
; (/O) SYMBOL DEFINITION BLOCK FOR THIS LINE (5 WORDS)
|
||
; TEXT FOR LINE 0
|
||
; MORE TEXT FOR LINE 0
|
||
; & MORE, ENDED WITH A NULL
|
||
; B) MORE LINES (EACH WITH PAGE #,WORD COUNT, AND TEXT
|
||
;2) BUFFER SPACE FOR FILE 1 (POINTED TO BY LBUFP2)
|
||
; A) AS ABOVE
|
||
|
||
SETP: HRRI FR,1 ;SET UP POINTER FILE 1
|
||
PUSHJ PP,SETONE
|
||
HRRI FR,0 ;DITTO FILE 0
|
||
|
||
SETONE: MOVE W3,F1(FR) ;GET LINE #
|
||
SETON1: MOVE TT,OLDNUM(FR) ;GET LAST # COMPUTED FOR
|
||
MOVEM W3,OLDNUM(FR) ;SAVE NEW # AS OLD
|
||
CAML W3,TT ;IS NEW LARGER THAN OLD?
|
||
SKIPA T,OLDPNT(FR) ;YES, START FROM OLD BYTE POINTER
|
||
SKIPA T,LBUFP1(FR) ;NO, START FROM BEGINNING
|
||
SUB W3,TT ;LOOP ONLY FROM OLD POINTER
|
||
MOVSI TT,(ADD T,(T)) ;(SET UP IN AC)
|
||
MOVE TT+1,[TRZ T,400K] ;[101] [106]
|
||
MOVE TT+3,[JRST SETON2] ;[101] SET UP AC
|
||
MOVE TT+2,.+1 ;[101] SET UP AC
|
||
SOJGE W3,TT
|
||
;TT/ ADD T,(T) ;ADD IN WORD COUNT FOR LINE
|
||
;TT+1/ TRZ T,400K ;[101] CLEAR BLANK LINE BIT
|
||
;TT+2/ SOJGE W3,TT ;MORE LINES LEFT?
|
||
;TT+3/ JRST SETON2 ;NO
|
||
|
||
SETON2: HRRZM T,OLDPNT(FR) ;SAVE POINTER TO THIS LINE
|
||
HRLI T,(POINT 7,0,35) ;NO, CHANGE TO BYTE POINTER
|
||
MOVEM T,W1(FR)
|
||
POPJ PP,
|
||
|
||
;[115] FIX A BYTE POINTER TO ACCOUNT FOR /O BLOCK
|
||
|
||
FIXBP: TRNN FR,-1 ;DON'T IF NOT FILE 0
|
||
FIXBPD: SKIPN OFSSWT ;ONLY IF /O
|
||
POPJ PP, ;WORDS AREN'T THERE TO SKIP
|
||
HRRI W1,SSBLTE(W1) ;BUMP BYTE POINTER PAST SYMBOL BLOCK
|
||
POPJ PP, ;DONE
|
||
;MOVE UP THE POINTERS WHICH POINT TO THE LINES FROM WHICH WE
|
||
;ARE EXAMINING. THIS IS DONE EVERYTIME A MATCH IS FOUND
|
||
|
||
MOVEUP: TLNE FR,USWBIT ;MANUAL "UPDATE" MODE?
|
||
PUSHJ PP,UPDATE ;YES
|
||
MOVE W3,F1(FR) ;GET LINE # FOR THIS FILE
|
||
CAML W3,TOP(FR) ;GETTING RID OF ALL LINES?
|
||
JRST MOVEX ;YES, DON'T MOVE MEMORY
|
||
AOS W3,F1(FR) ;GET LINE # OF LINE TO SAVE
|
||
PUSHJ PP,SETON1 ;GET ADR OF 1ST LINE TO SAVE
|
||
HRL T,LBUFP1(FR) ;SET UP BLT AC (REVERSED)
|
||
PUSH PP,T ;SAVE
|
||
AOS W3,TOP(FR) ;GET 1ST NON-EXISTANT LINE #
|
||
PUSHJ PP,SETON1 ;GET CORRESPONDING 1ST ADR
|
||
POP PP,W1
|
||
SUB T,W1 ;CALCULATE WORD COUNT OF TRANSFER
|
||
ADD T,LBUFP1(FR) ;CALCULATE "E" OF BLT AC,E
|
||
MOVSS W1 ;SWITCH AC TO XWD FROM,TO
|
||
BLT W1,(T) ;AND AWAY WE GO
|
||
|
||
MOVEX: SETCM W2,F1(FR) ;W2_-<(F1)+1>
|
||
ADDM W2,TOP(FR) ;CHANGE TOP TO ACCOUNT FOR DEAR DEPARTED LINES
|
||
HRLOI 0,377777
|
||
MOVEM 0,OLDNUM(FR) ;FORCE SETON1 TO RECALCULATE
|
||
POPJ PP,
|
||
|
||
;LIST ALL OF SECOND FILE, EACH LINE PRECEDED BY VERTICAL BAR-TAB
|
||
; IF IT IS PART OF A MISMATCH (MISMATCH MEANS (F2) .GE. 1)
|
||
|
||
UPDATE: TRNN FR,-1 ;SECOND FILE?
|
||
POPJ PP, ;NO, RETURN
|
||
JUMPL F2,[HRLZS DIFFLG ;[110] YES, INSERTION ?
|
||
POPJ PP,] ;[110] YES, REMEMBER THAT
|
||
SETOM TEMP ;INIT LINE COUNTER
|
||
SOS F2 ;[110] BACK UP A LINE
|
||
PUSH PP,F2 ;[110] SAVE
|
||
UPDAT1: AOS F2,TEMP ;[110] GET NUMBER OF NEXT LINE
|
||
PUSHJ PP,SETONE ;[110] NOW FETCH BYTE POINTER
|
||
CAMLE F2,(PP) ;[110] DONE?
|
||
JRST UPDAT3 ;[110] YES
|
||
MOVEI C,0 ;[100] [110] PRINT VERTICAL BAR IF
|
||
SKIPN DIFFLG ; "DIFFERENCE FLAG" IS SET, OR IF
|
||
JRST UPDAT2 ; MORE THAN ONE LINE HAS BEEN LOOKED AT
|
||
MOVEI T,400K ;[110] UNLESS LINES ARE BLANK
|
||
TDNE T,(W2) ;[110] ...
|
||
JRST UPDAT2 ;[110] (THEY ARE)
|
||
SETOM DIFFLG ;[110] NOTE AT LEASE ONE VERTICAL BAR
|
||
MOVEI C,"|" ;[110]
|
||
UPDAT2: PUSHJ PP,UPDAT5 ;[110] PRINT DIFFERENCE CHAR AND LINE
|
||
JRST UPDAT1 ;[110] CONTINUE
|
||
|
||
UPDAT3: MOVEI C,0 ;[110] DONE, DEFAULT TO NO CHANGE
|
||
SKIPN DIFFLG ;[110] IF NONE,
|
||
JRST UPDAT4 ;[110] ASSUMPTION WON
|
||
MOVEI T,400K ;[110] SOME DIFFERENCE, BLANK LINE?
|
||
TDNE T,(W2) ;[110] IS IT?
|
||
JRST [SKIPL DIFFLG ;[110] YES, BLANK AND NO PREV "|"?
|
||
MOVEI C,"o" ;[110] YES, DELETION
|
||
JRST UPDAT4] ;[110] NO, BLANK + PREV "|", NO "|" HERE
|
||
MOVE T,DIFFLG ;[110] SEE WHAT KIND OF DIFFERENCE
|
||
MOVEI C,"o" ;[110] ASSUME DELETION
|
||
CAME T,[-1] ;[110] IF END OF ORDINARY DIFFERENCE, "|"
|
||
TLNN T,-1 ;[110] WAS IT A DELETION?
|
||
MOVEI C,"|" ;[110] AN ORDINARY CHANGE.
|
||
UPDAT4: PUSHJ PP,UPDAT5 ;[110] PRINT THE LINE
|
||
SETZM DIFFLG ;[110] NO DIFFERENCES KNOWN NOW
|
||
POP PP,F2 ;[110] RESTORE F2
|
||
AOJA F2,CPOPJ ;[110] RESUME SCAN
|
||
|
||
UPDAT5: PUSHJ PP,PCHART ;[110] PRINT DIFFERENCE FLAG IF ANY
|
||
MOVEI C,.CHTAB ;[100] PRINT A TAB
|
||
PUSHJ PP,PCHAR
|
||
MOVE W1,W2 ;GET BYTE POINTER INTO W1
|
||
PUSHJ PP,PRINT ;GO PRINT LINE
|
||
MOVEI C,.CHCRT ;[100]
|
||
PUSHJ PP,PCHAR ;PRINT CARRIAGE RETURN
|
||
ILDB C,W1 ;GET LINE TERMINATING CHARACTER
|
||
JRST PCHAR ;[110] PRINT IT AND RETURN
|
||
;CODE FOR GETTING TWO LINES
|
||
;CALLING SEQUENCE IS:
|
||
; PUSHJ PP,GETTWO
|
||
; RETURN 1 IF EITHER FILE HAS NO MORE LINES
|
||
; RETURN 2 IF ONE LINE READ FROM EACH FILE
|
||
; C(GETFIL)=THE # OF FILE FOR WHICH A LINE WAS READ (OR -1 IF NONE)
|
||
|
||
GETTWO: SETOM GETCNT ;INIT # LINESOBTAINED
|
||
SETOM GETFIL ;INIT FILE # LINE CAME FROM
|
||
TRZ FR,-1 ;ZERO RIGHT HALF OF "FR"--SET FOR FIRST FILE
|
||
PUSHJ PP,GLINE ;GET A LINE FROM FIRST FILE
|
||
HRRI FR,1 ;NOW DO FOR SECOND FILE
|
||
PUSHJ PP,GLINE
|
||
SKIPLE GETCNT ;GETCNT .G. 0 IF TWO LINES WERE GOT
|
||
AOS (PP) ;SKIP IF 2 LINES WERE AVAILABLE
|
||
POPJ PP,
|
||
|
||
GLINE: AOS W1,F1(FR) ;BUMP THE LINE POINTERS
|
||
CAMLE W1,TOP(FR) ;[76] HAVE WE GONE OVER THE TOP?
|
||
JRST GLINEB ;[76] NO LINE -- GO GET ONE
|
||
JRST GLNXIT ;[104] GOT IT IN CORE, GO AWAY
|
||
|
||
GLINEA: TLZ C,400000 ;[76] COUNT BLANK LINES
|
||
TRNN FR,-1 ;[103] ONLY COUNT FOR FILE 1
|
||
CAIN C,.CHFFD ;[76] [103] BUT NOT FORM-FEEDS
|
||
CAIA ;[103] FILE 2 OR FFD
|
||
AOS LSTSYM+SYMLIN ;[76] [104] COUNT LINES PAST SYMBOL
|
||
SKIPA ;[76]
|
||
|
||
GLINEB: SOS F1(FR) ;NOT CLEAR YET THAT A NEW LINE EXISTS
|
||
HRLS PAGNUM(FR) ;SAVE PAGE # AT BEGINNING OF LINE
|
||
PUSHJ PP,GCHAR ;GET A CHARACTER
|
||
TLNE FR,@EOFTBL(FR) ;END OF FILE?
|
||
POPJ PP, ;YES, NO LINE
|
||
TLNN FR,ALLSW ;SKIP IF COMPARING BLANK LINES
|
||
JUMPL C,GLINEA ;[76] MINUS CHARS INDICATE BLANK LINES
|
||
AOS W1,F1(FR) ;THERE ARE CHARS FOR A NEW LINE
|
||
MOVEM W1,TOP(FR) ;THIS LINE IS THE TOP LINE
|
||
PUSHJ PP,SETONE ;CALCULATE BYTE POINTER
|
||
MOVE W1,W1(FR) ;GET BYTE POINTER IN W1
|
||
MOVEM W1,WCADR ;SAVE ADR OF LINE WORD COUNT
|
||
HLLZ W2,PAGNUM(FR) ;[101] PICKUP PAGE # AT BEGINNING OF LINE
|
||
SKIPGE C ;[101] BLANK LINE?
|
||
TRO W2,400K ;[101] YES, REMEMBER THE FACT
|
||
MOVEM W2,(W1) ;[101] SAVE WITH THIS LINE
|
||
PUSHJ PP,FIXBP ;[115] ADJUST TO TEXT AREA IF NESCESSARY
|
||
JRST GLINE3
|
||
|
||
GLINE2: PUSHJ PP,GCHAR ;GET NEXT CHAR FOR LINE
|
||
GLINE3: TLNN W1,760000 ;WILL NEXT IDPB GO INTO NEXT WORD?
|
||
PUSHJ PP,GLCHEK ;CHECK ADDRESS
|
||
IDPB C,W1 ;STORE CHARS IN LINE BUFFER
|
||
JUMPG C,GLINE2 ;NEG CHARACTER IS END OF LINE
|
||
MOVEI W3,0 ;REPLACE LAST CHAR WITH NULL
|
||
DPB W3,W1
|
||
TLNN W1,760000 ;WILL TERM CHAR GO INTO NEXT WORD?
|
||
PUSHJ PP,GLCHEK ;YES, CHECK ADDRESS
|
||
IDPB C,W1 ;STORE TERM CHAR AFTER NULL
|
||
MOVE W3,WCADR ;GET BACK ADR OF WORD COUNT
|
||
SUBI W1,-1(W3) ;CALCULATE WORD COUNT
|
||
IOR W1,(W3) ;[101] PRESERVE BLANK LINE BIT
|
||
SKIPN USWFLG ;[116] FUNNY /U MODE?
|
||
JRST GLINE4 ;[116] NO. DON'T CHECK FOR LINE-SEQUENCED LINES
|
||
MOVE W2,1(W3) ;[116] GET THE FIRST WORD OF THE LINE
|
||
TRNN W2,1B35 ;[116] IS IT A LINE-SEQUENCED LINE?
|
||
JRST GLINE4 ;[116] NO. NO NEED TO CHECK IF THE LINE IS BLANK
|
||
LDB W2,[POINT 7,2(W3),6] ;[116] YES. GET THE FIRST CHARACTER
|
||
;[116] AFTER THE LINE SEQUENCE NUMBER
|
||
CAIE W2,.CHTAB ;[116] IF IT'S A TAB, CHECK FURTHER
|
||
JRST GLINE4 ;[116] OTHERWISE ASSUME NOT A BLANK LINE
|
||
LDB W2,[POINT 7,2(W3),13] ;[116] GET THE NEXT CHARACTER
|
||
SKIPN W2 ;[116] CHECK FOR A BLANK LINE
|
||
TRO W1,400K ;[116] SIGNIFY THAT THIS IS A BLANK LINE
|
||
GLINE4: HRRM W1,(W3) ;SAVE WORD COUNT IN BUFFER
|
||
;SEE IF TEXT JUST READ IN IS A LINE-NUMBERED BLANK LINE
|
||
TLNE FR,ALLSW ;[33] SKIPPING BLANK LINES?
|
||
JRST GLEXIT ;[33] NO, DON'T CHECK TEXT
|
||
PUSHJ PP,SETONE ;[33] GET POINTER TO TEXT
|
||
PUSHJ PP,FIXBP ;[115] ADJUST FOR POSSIBLE SYMBOL BLOCK
|
||
MOVE W1,W1(FR) ;[33] PUT IN KNOWN PLACE
|
||
MOVEI W3,1 ;[33] SET UP LINE NUMBER BIT
|
||
TDNN W3,1(W1) ;[33] IS IT SET?
|
||
JRST GLEXIT ;[33] NO, TEXT IS OK
|
||
AOS W1 ;[33] YES, SKIP LINE NUMBER
|
||
ILDB T,W1 ;[33] GET FIRST CHARACTER
|
||
JUMPE T,BLANK ;[33] IT'S NULL, LINE IS BLANK
|
||
CAIE T,.CHTAB ;[33] [100] IF A TAB, CHECK FURTHER
|
||
JRST GLEXIT ;[33]
|
||
ILDB T,W1 ;[33] SO GET NEXT CHARACTER
|
||
JUMPN T,GLEXIT ;[33] IF NOT NULL, LINE IS REALLY THERE
|
||
BLANK: SOS F1(FR) ;[33] NO LINE; DECREMENT COUNT
|
||
MOVEI C,.CHLFD ;[104] THIS WASN'T A PAGE MARK
|
||
JRST GLINEA ;[33] [104] GET ANOTHER LINE
|
||
GLEXIT: SKIPE OFSSWT ;[115] SKIP IF NOT /O
|
||
TRNE FR,-1 ;[115] DON'T COPY SYMBOL UNLESS FILE 0
|
||
JRST GLNXIT ;[115] DON'T COPY
|
||
PUSHJ PP,GLSYMB ;[104] LINE IS NOW IN - GET A SYMBOL
|
||
HRRZ W1,WCADR ;[115] GET START OF LINE
|
||
AOJ W1, ;[115] POINT TO SYMBOL BLOCK
|
||
HRLI W1,LSTSYM ;[115] PUT CURRENT SYMBOL THERE
|
||
HRRZ W2,W1 ;[115] SAVE COPY OF DESTINATION
|
||
BLT W1,SSBLTE-1(W2) ;[115] ONWARDS
|
||
GLNXIT: PUSHJ PP,SETONE ;[101] FIND LINE POINTERS
|
||
MOVE W1,W1(FR) ;[101] ONLY THE ONE FOR CURRENT FILE
|
||
MOVE W1,0(W1) ;[101] CHECK BLANK BIT IN HEADER
|
||
TRNE W1,400K ;[101] TO SEE IF TO BE IGNORED
|
||
SKIPN USWFLG ;[101] BUT ONLY IN FUNNY/U MODE
|
||
CAIA ;[101] DON'T IGNORE
|
||
JRST GLINE ;[101] DO
|
||
AOS GETCNT ;INDEX # LINES FOUND
|
||
HRRZM FR,GETFIL ;SAVE # OF THIS FILE
|
||
POPJ PP, ;[104] DONE.
|
||
GLTBL: LBUFP2 ;POINTS TO TOP ADR FILE 0
|
||
.JBREL ;POINTS TO TOP ADR FILE 1
|
||
|
||
GLCHEK: HRRZ W3,@GLTBL(FR) ;YES,GET HIGHEST ADR FOR THIS BUFFER
|
||
CAIG W3,3(W1) ;CHECK ADR. (LEAVE 1 WORD FOR WORD
|
||
;COUNT FOR NEXT LINE PLUS 1 WORD
|
||
;SLOP TO BE SAFE
|
||
PUSHJ PP,NOROOM ;[55] NO ROOM IN THE INN
|
||
HLRZM C,1(W1) ;PUT BIT17 INTO BIT35 (FOR SEQUENCE #)
|
||
POPJ PP,
|
||
;[76] HERE TO SEE IF THE CURRENT LINE HAS A SYMBOL DEFINITION (FOO:)
|
||
|
||
GLSYMB: SKIPE OFSSWT ;[104] IF NOT /O
|
||
TRNE FR,-1 ;[104] OR THIS IS FILE 2
|
||
POPJ PP, ;[104] DO NOTHING
|
||
PUSHJ PP,SETONE ;[76] SET W1 TO CURRENT LINE'S TEXT
|
||
PUSHJ PP,FIXBPD ;[115] ADJUST FOR HEADER
|
||
MOVE W2,[POINT 7,PSYMB] ;[76] WHERE WE CAN BUILD IT INTO
|
||
SETZM PSYMB ;[76] CLEAR IT OUT
|
||
SETZM PSYMB+1 ;[76]
|
||
MOVEI W3,^D10 ;[76] ARBITRARY MAX SYMBOL LENGTH OF 10 CHARACTERS
|
||
SETZ TT, ;[76] START WITH NO NNN$ LABEL SEEN
|
||
|
||
GLSY.1: ILDB T,W1 ;[76] FIRST EAT LEADING SPACES AND TABS
|
||
CAIE T,.CHTAB ;[76]
|
||
CAIN T," " ;[76]
|
||
JRST GLSY.1 ;[76]
|
||
SKIPA ;[76] THEN SKIP FIRST ILDB WITH NON-SPACE
|
||
|
||
GLSY.2: ILDB T,W1 ;[76] SCAN THROUGH A SYMBOL
|
||
JUMPE T,GLSY.N ;[76] [104] IF NO : BEFORE EOL, NO SYMBOL
|
||
|
||
CAIL T,"a" ;[76] LOWER CASE?
|
||
CAILE T,"z" ;[76]
|
||
SKIPA ;[76] NO
|
||
SUBI T,"a"-"A" ;[76] YES, CONVERT TO UPPER CASE
|
||
JUMPG TT,GLSY.3 ;[76] IF HAVE ALREADY SEEN A LETTER,
|
||
;[76] THEN CONTINUE BUILDING SYMBOL
|
||
CAIL T,"0" ;[76] A NUMBER?
|
||
CAILE T,"9" ;[76]
|
||
JRST GLSY.3 ;[76] NO, LOOK FOR LETTER
|
||
AOJL TT,[MOVEI TT,1 ;[76] IF HAVE ALREADY SEEN 999$ THEN SYMBOL IS SCREWY
|
||
JRST GLSY.3] ;[76] SO JUST ACCUMULATE STANDARD SYMBOL
|
||
SETO TT, ;[76] MARK THAT HAVE SEEN DIGIT
|
||
JRST GLSY.S ;[76] AND STORE CHARACTER INTO SYMBOL
|
||
|
||
GLSY.3: CAIE T,"$" ;[76] COULD IT BE A LOCAL PDP11 LABEL
|
||
JRST GLSY.4 ;[76] NO, KEEP BUILDING LABEL
|
||
AOJN TT,[MOVEI TT,1 ;[76] IS PDP11 LABEL IF HAVE SEEN ONLY DIGITS
|
||
JRST GLSY.S] ;[76] HAVEN'T, SO JUST BUILD SCREWY LABEL
|
||
HRREI TT,-2 ;[76] MARK THAT HAVE SEEN 999$ LABEL
|
||
JRST GLSY.S ;[76] AND GO STORE "$" INTO LABEL
|
||
GLSY.4: CAIE T,"." ;[76] IS THIS ONE OF THE SPECIAL SYMBOL
|
||
CAIN T,"%" ;[76] CHARACTERS?
|
||
JRST GLSY.S ;[76] YES, GO STORE INTO LABEL
|
||
CAIL T,"A" ;[76] IS IT A LETTER?
|
||
CAILE T,"Z" ;[76]
|
||
SKIPA ;[76] NO
|
||
JRST GLSY.S ;[76] YES, GO STORE INTO LABEL
|
||
CAIN T,":" ;[76] THE END OF A SYMBOL DEFINITION?
|
||
JRST GLSY.E ;[76] YES, GO END THIS LABEL
|
||
JRST GLSY.N ;[76] [104] MUST NOT BE A LABEL
|
||
|
||
GLSY.S: IDPB T,W2 ;[76] HAVE ANOTHER SYMBOL CHARACTER, BUILD SYMBOL
|
||
SOJG W3,GLSY.2 ;[76] BUT ONLY UP TO 10 CHARACTERS
|
||
JRST GLSY.N ;[76] [104] MUST NOT BE A SYMBOL
|
||
|
||
;HERE, WE HAVE A SYMBOL. FIGURE OUT WHICH SORT, AND STORE IT.
|
||
|
||
GLSY.E: HRRZ W1,DOLPTR ;[76] [103] FIRST TRY FOR 11 LOCAL LABEL
|
||
AOJL TT,GLSY.6 ;[76] IT IS IF SWITCH WAS -2
|
||
SETZM 0(W1) ;[76] OTHERWISE IT'S NOT, FORGET ANY FROM
|
||
SETZM 1(W1) ;[76] PREVIOUS LOCAL SYMBOL BLOCK
|
||
HRRZ W1,SYMPTR ;[76] [103] AND SWITCH TO SYMBOL POINTER
|
||
GLSY.6: MOVE T,PSYMB ;[76] COPY SYMBOL TO WHEREEVER WE NEED IT
|
||
MOVEM T,0(W1) ;[76]
|
||
MOVE T,PSYMB+1 ;[76]
|
||
MOVEM T,1(W1) ;[76]
|
||
SETOM LSTSYM+SYMLIN ;[76] [103] [104] RESTART LINES SINCE SYMBOL COUNT
|
||
|
||
;HERE TO ACCOUNT FOR THIS LINE
|
||
|
||
GLSY.N: PUSHJ PP,SETONE ;[77] POINT TO LINE AGAIN
|
||
HLRZ T,SSBLTE+1(W1) ;[76] [115] GET THE FIRST DATA WORD OUT
|
||
TRZ T,<BYTE (7)0,0,.CHDEL>_-^D18 ;[76] LESS THE PART OF THE THIRD BYTE
|
||
CAIE T,(BYTE (7).CHNUL,.CHFFD) ;[76] [103] UNLESS THIS IS A BLANK LINE W/FFD
|
||
AOS LSTSYM+SYMLIN ;[76] [104] COUNT A LINE SEEN LAST SYMBOL
|
||
POPJ PP, ;[76]
|
||
;IF A "CORE" UUO IS INSTALLED HERE, IT MUST ADJUST THE FOLLOWING
|
||
;LIST OF LOCATIONS (ALL BY THE AMOUNT THE SECOND BUFFER AREA
|
||
;IS MOVED, IF ANY):
|
||
;1) BYTE POINTER ADDRESS IN: W1
|
||
;2) BUFFER POINTER IN: LBUFP2
|
||
;3) 1ST ADDRESS FOR LINE IN: 0(PP) ON PUSH DOWN LIST
|
||
;THEN RETURN TO THE IDPB NEAR GLINE2+6
|
||
|
||
|
||
NOROOM: PUSH PP,W1 ;SAVE BYTE POINTER
|
||
TRC FR,1 ;CHANGE 1 TO 0 (OR VICE VERSA)
|
||
MOVE W3,TOP(FR) ;GET TOP LINE # FOR "OTHER" FILE
|
||
ADDI W3,1 ;FIND 1ST ADR OF THE NEXT LINE ABOVE TOP
|
||
PUSHJ PP,SETON1 ;GET ADR
|
||
HRRZM T,HIGH ;SAVE 1ST FREE ADR OF NON-FULL FILE
|
||
HRRZ T,@GLTBL(FR);GET HIGHEST ADR AVAILABLE TO NON-FULL FILE
|
||
SUB T,HIGH ;GET SPACE AVAILABLE
|
||
SUBI T,2 ;LEAVE 1 WRD FOR NEXT LINE WORD COUNT
|
||
;PLUS 1 WORD SLOP TO BE SAFE
|
||
TRC FR,1 ;CHANGE FILE # BACK TO THE WAY IT WAS
|
||
MOVEM T,ROOM ;SAVE ROOM AVAILABLE
|
||
CAIL T,^D400 ;COMPARE WITH 400. (NO MAGIC SIGNIFICANCE)
|
||
JRST NOR2 ;PLENTY ROOM AVAILABLE- DON'T GET MORE CORE
|
||
|
||
HRRZ T,.JBREL
|
||
MOVEM T,W1 ;SAVE THIS .JBREL AS "OLD" .JBREL
|
||
ADDI T,1 ;REQUEST CORE SIZE CONTAINING THIS ADDRESS
|
||
CORE T, ;CORE UUO
|
||
SKIPA T,ROOM ;FAIL
|
||
JRST NOR3 ;SUCCESS
|
||
JUMPG T,NOR4 ;ANY CORE LEFT AT ALL?
|
||
NORERR: JSP T,ERROUT ;NO, PRINT MESSAGE
|
||
ASCIZ /?Buffer capacity exceeded and no core available/
|
||
|
||
NOR3: HRRZ T,.JBREL ;CORE UUO SUCCESFUL- GET "NEW" .JBREL
|
||
SUB T,W1 ;FIND OUT HOW MUCH WAS ADDED
|
||
ADDB T,ROOM ;UPDATE TOTAL ROOM AVAILABLE
|
||
TRNE FR,1 ;WHICH FILE NEEDED ROOM?
|
||
JRST NOR98 ;FILE #1, IT JUST GOT IT
|
||
;FILE #0, SHUFFLE CORE
|
||
NOR2: ASH T,-1 ;DIVIDE AVAILABLE SPACE BETWEEN FILES
|
||
NOR4: MOVEM T,ROOM ;FILE #1 GETS MOVED THIS AMOUNT
|
||
TRNN FR,1 ;WHICH FILE NEEDED ROOOM?
|
||
JRST NOR5 ;FILE #0. MOVE #1 TOWARD 777777
|
||
;FILE #1. MOVE #1 TOWARD 0
|
||
MOVNS T,ROOM ;FILE IS MOVING IN NEGATIVE DIRECTION
|
||
ADDM T,WCADR ;WORD COUNT ADR FOR FILE# 1 IS MOVED DOWN
|
||
ADDM T,(PP) ;SAME WITH BYTE POINTER
|
||
MOVE W1,(PP) ;GET LAST ADR TO MOVE FROM BYTE POINTER
|
||
ADD T,LBUFP2 ;GET "TO" ADR. [(LBUFP2)-D OF M]
|
||
HRL T,LBUFP2 ;GET "FROM" ADR
|
||
BLT T,(W1) ;BLT T,"E" (T/ XWD "FROM","TO")
|
||
JRST NOR90
|
||
|
||
NOR5: MOVE W1,T ;GET D OF M
|
||
HRLI W1,(POP T,(T)) ;SETUP- POP T,<D OF M>(T) INTO W1
|
||
MOVE W2,HIGH ;GET HIGH(+1) ADR OF FILE #1
|
||
SUB W2,LBUFP2 ;GET LENGTH OF FILE #1
|
||
SOS T,HIGH ;GET LAST ADR IN FILE #1
|
||
HRLI T,400000(W2) ;PUT WORD COUNT(+400000) IN LEFT HALF
|
||
;400000 AVOIDS PDL OVERFLOW PROBLEM IN AC LOOP
|
||
MOVE W3,[JRST NOR90]
|
||
MOVE W2,.+1
|
||
JUMPL T,W1 ;W1/ POP T,<DISTANCE OF MOVE>(T)
|
||
;W2/ JUMPL T,W1
|
||
;W3/ JRST NOR90
|
||
;THE ABOVE INSTRUCTIONS ARE A REVERSE BLT AND ARE IN THE AC'S FOR SPEED
|
||
|
||
NOR90: MOVE T,ROOM ;GET DISTANCE FILE #1 WAS MOVED
|
||
ADDM T,LBUFP2 ;MODIFY STARTING ADR OF FILE #1
|
||
HRLOI 0,377777
|
||
MOVEM 0,OLDNUM+1 ;FORCE "SETONE" TO RECALCULATE BYTE POINTER
|
||
NOR98: POP PP,W1
|
||
POPJ PP,
|
||
|
||
;THIS PAGE CONTAINS ROUTINE FOR COMPARING TWO LINES
|
||
;IT HAS TWO RETURNS--CALLING ADR.+1 IF LINES MATCH OR
|
||
;CALLING ADR+2 IF NO MATCH
|
||
|
||
COMPL: PUSHJ PP,SETP ;CALCULATE POINTERS TO TEXT
|
||
PUSHJ PP,FIXBPD ;[115] FIX FILE 0 POINTER IF /O
|
||
MOVEM W1,P1 ;P1=TEMP POINTER TO TEXT FOR FIRST FILE
|
||
MOVEM W2,P2 ;P2 FOR SECOND FILE
|
||
|
||
MOVEI W3,1
|
||
TDNN W3,1(W1) ;TEST SEQUENCE # BIT
|
||
JRST COMPL5 ;[33] [100] NOT SEQ. #
|
||
AOS P1 ;SKIP OVER SEQ. # AND
|
||
ILDB W1,P1 ;[33] GET CHAR
|
||
CAIN W1,.CHTAB ;[100] [33] IS IT A TAB?
|
||
COMPL5: ILDB W1,P1 ;[33] [100] YES, EAT IT
|
||
|
||
;[100] HERE WITH FIRST GOOD CHAR FROM FILE 1 IN W1
|
||
|
||
TDNN W3,1(W2) ;SAME THING FOR FILE #2
|
||
JRST COMPL2 ;[33]
|
||
AOS P2
|
||
ILDB W2,P2 ;[33] GET NEXT CHAR
|
||
CAIE W2,.CHTAB ;[33] [100] IS IT A TAB?
|
||
JRST COMPL0 ;[33] NO, DON'T EAT
|
||
JRST COMPL2 ;[33] YES, DO EAT
|
||
COMPL1: ILDB W1,P1 ;GET A CHARACTER FROM LINE FROM FIRST FILE
|
||
COMPL2: ILDB W2,P2 ;AND ONE FROM SECOND FILE
|
||
COMPL0: CAMN W1,W2 ;THIS IS THE BIG TEST--ARE THEY EQUAL
|
||
JRST COMPL7 ;[117] YES, CONTINUE
|
||
SKIPN OPISWT ;[117] CASE-INVARIANT COMPARE?
|
||
JRST COMPL4 ;NO
|
||
CAIL W1,"a" ;[117] YES, UPCASE BOTH CHARS
|
||
CAILE W1,"z" ;[117]
|
||
CAIA ;[117]
|
||
TRZ W1,40 ;[117] CONVERT TO UPPER CASE
|
||
CAIL W2,"a" ;[117] YES, UPCASE BOTH CHARS
|
||
CAILE W2,"z" ;[117]
|
||
CAIA ;[117]
|
||
TRZ W2,40 ;[117] CONVERT TO UPPER CASE
|
||
CAME W1,W2 ;[117] TRY ONE MORE TIME
|
||
JRST COMPL4 ;[117] FAILED AGAIN, FORGET IT
|
||
COMPL7: CAIN W1,";" ;YES, COMMENT?
|
||
TLNN FR,CSWBIT ;YES, SUPPRESS COMMENTS?
|
||
JUMPN W1,COMPL1 ;NO,NO. TEST FOR END OF LINE
|
||
POPJ PP, ;LINES MATCH, RETURN
|
||
|
||
COMPL3: ILDB W1,P1 ;GET NEW CHAR FOR FILE 1
|
||
COMPL4: CAIE W1,40 ;SPACE?
|
||
CAIN W1,.CHTAB ;[100] OR TAB?
|
||
TLNN FR,SSWBIT ;AND IS SPACING BEING IGNORED?
|
||
SKIPA ;NO
|
||
JRST COMPL3 ;FLUSH SPACE OR TAB FOR FILE 1
|
||
|
||
CAIE W2,40 ;SPACE?
|
||
CAIN W2,.CHTAB ;[100] OR TAB?
|
||
TLNN FR,SSWBIT ;AND IS SPACING BEING IGNORED?
|
||
SKIPA ;NO
|
||
JRST COMPL2 ;YES, FLUSH A SPACE OR TAB FOR FILE 2
|
||
CAMN W1,W2 ;ARE THE CHARACTERS NOW THE SAME?
|
||
JRST COMPL7 ;YES, TEST FOR END OF LINES
|
||
CAIE W1,";" ;COMMENT IN FILE 1?
|
||
CAIN W2,";" ;OR IN FILE 2?
|
||
TLNN FR,CSWBIT ;AND ARE COMMENTS BEING IGNORED?
|
||
JRST CPOPJ1 ;NO, FILES DON'T MATCH, SKIP RETURN
|
||
JUMPE W1,CPOPJ ;YES, OTHER CHAR MUST BE NULL OR ELSE ONE
|
||
JUMPE W2,CPOPJ ; LINE IS LONGER THAN OTHER AND FILES DIFFER
|
||
|
||
CPOPJ1: AOS (PP)
|
||
CPOPJ: POPJ PP,
|
||
;WHEN WE GET TO THIS POINT WE HAVE FOUND
|
||
;THE EXTENT OF THE DIFFERENCES AND WE ARE READY TO PRINT
|
||
;THESE DIFFERENCES OUT
|
||
|
||
PNTBTH: TRZ FR,-1 ;OUTPUT FILE 1
|
||
PUSHJ PP,PNTTXT ;PRINT FILE 1 DIFFERENCES
|
||
MOVEI W1,[ASCIZ /****/]
|
||
PUSHJ PP,PPRINT
|
||
SKIPE OFSSWT ;[76] IF /OFFSET,
|
||
PUSHJ PP,PNTTAG ;[103] ADD THE TAG
|
||
PUSHJ PP,PCRLF
|
||
HRRI FR,1 ;THEN PRINT FILE 2 DIFFERENCES
|
||
PUSHJ PP,PNTTXT
|
||
MOVEI W1,[ASCIZ /**************/]
|
||
PUSHJ PP,PPRINT
|
||
JRST PCRLF ;PRINT CARRIAGE RETURN-LINE FEED
|
||
|
||
|
||
;THIS ROUTINE IMBEDS "SYMBOL+N" IN THE ASTERISK LINES
|
||
;THE "SYMBOL" MUST OCCUR WITHIN THE FIRST 10 CHARACTERS OF THE LINE
|
||
|
||
PNTTAG: MOVEI W1,[ASCIZ / ;At /] ;[76] [103] [115] NOISE
|
||
PUSHJ PP,PPRINT ;[76] [115]
|
||
PUSH PP,LBUFP1 ;[115] SAVE POINTER JUST IN CASE
|
||
SKIPN NOHDR ;[115] SKIP IF FLUSHING AN EOF
|
||
JRST PNTT.0 ;[115] NOPE, NORMAL CASE
|
||
MOVEI W1,SAVSYM-1 ;[115] YES, REDIRECT OUTPUT TO FAKE SYMBOL
|
||
MOVEM W1,LBUFP1 ;[115] BECAUSE LBUFP1 LIES
|
||
|
||
PNTT.0: MOVE W1,LBUFP1 ;[115] BOTTOM OF WINDOW IS LINE WITH TAG
|
||
MOVE W3,$SYMBL+1(W1) ;[76] [103] [115] GET LOCAL SYMBOL NAME
|
||
JUMPE W3,PNTT.1 ;[76] [103] SKIP THIS IF NO LOCAL SYMBOL THERE
|
||
MOVEI W1,$SYMBL+1(W1) ;[76] [103] [115] POINT BACK AT LABEL
|
||
PUSHJ PP,PPRINT ;[76] [103] [115] DO IT
|
||
JRST PNTT.2 ;[103] MAIN SYMBOL COMES LATER
|
||
|
||
PNTT.1: MOVE W1,LBUFP1 ;[115] POINT TO TEXT AGAIN
|
||
MOVEI W1,SYMBOL+1(W1) ;[115] GET ADDRESS OF MAJOR LABEL
|
||
SKIPN W2,(W1) ;[103] IF NULL
|
||
MOVEI W1,[ASCIZ /top of file /] ;[103] [115] SAY SOMETHING
|
||
PUSHJ PP,PPRINT ;[76] [103] [115] GET IT OUT
|
||
|
||
PNTT.2: MOVE W1,LBUFP1 ;[115] POINT TO TEXT BLOCK
|
||
SKIPN T,SYMLIN+1(W1) ;[76] [103] [115] GET NUMBER OF LINES SINCE LAST SYMBOL
|
||
JRST PNTT.3 ;[76] [103] NONE, SEE IF NEED A MAIN SYMBOL
|
||
MOVEI C,"+" ;[76] SOME, PUT IN PLUS
|
||
PUSHJ PP,TYO ;[76]
|
||
PUSHJ PP,PNTDEC ;[76] TYPE NUMBER OF LINES PAST SYMBOL
|
||
MOVEI C,"L" ;[103]
|
||
PUSHJ PP,TYO ;[103]
|
||
PNTT.3: JUMPE W3,PNTT.4 ;[103] [115] IF ONLY MAIN SYMBOL, NO QUALIFIER
|
||
MOVEI W1,[ASCIZ / following /] ;[76] [103] [115] ENCLOSE SYMBOL
|
||
PUSHJ PP,PPRINT ;[76] [115]
|
||
MOVE W1,LBUFP1 ;[115] GET ADDRESS ONE LAST TIME
|
||
MOVEI W1,SYMBOL+1(W1) ;[76] [115] POINT AT MAIN SYMBOL
|
||
PUSHJ PP,PPRINT ;[76] [103] [115] GET IT OUT
|
||
|
||
PNTT.4: POP PP,LBUFP1 ;[115] RESTORE BUFFER POINTER
|
||
POPJ PP, ;[115] DONE
|
||
;THIS SUBROUTINE PRINTS ALL THE TEXT IN THE
|
||
;BUFFER SPECIFIED BY C(FR)R. I. E. FILE 1 OR FILE 2
|
||
|
||
PNTTXT: SETOM PAGEN ;[76] GUARANTEE PAGE # MISMATCH- THEREFORE PRINT IT
|
||
SETOM TEMP ;[76] START POINTER AT -1
|
||
PNTTX2: AOS W1,TEMP ;[76] INDEX LINE COUNTER
|
||
CAMLE W1,F1(FR) ;PRINTED ALL LINES?
|
||
POPJ PP, ;YES, RETURN
|
||
PUSH PP,F1 ;NO, SAVE LINE POINTERS
|
||
PUSH PP,F2
|
||
SETZB F1,F2 ;F1=F2=0
|
||
MOVEM W1,F1(FR) ;SET UP EITHER FOR F1 OR F2
|
||
PUSHJ PP,SETONE ;CALCULATE BYTE POINTERS TO TEXT
|
||
MOVE W1,W1(FR) ;UNNECESSARY FOR FILE 1- MOVES BYTE PNT FILE 2
|
||
PUSHJ PP,PLINEN ;PRINT: 1) TEXT
|
||
PUSHJ PP,PCRLF
|
||
POP PP,F2
|
||
POP PP,F1 ;RESTORE REGS
|
||
JRST PNTTX2 ;[76] FINISH OUT ALL LINES
|
||
|
||
|
||
;HERE WHEN ONE FILE IS SHORT, ONLY WANT *'S ONCE
|
||
PRNTXT: SKIPE OFSSWT ;[103] NO SEP IF NOT /O
|
||
SKIPE NOHDR ;[76] BEEN HERE BEFORE?
|
||
JRST PNTTXT ;[76] [103] YES, HOP INTO THE MIDDLE AND PRINT A LINE
|
||
|
||
;FAKE A START OF CONFLICT
|
||
|
||
MOVE W1,[XWD LSTSYM,SAVSYM] ;[104] SAVE LAST LABEL
|
||
BLT W1,SAVSYM+SSBLTE-1 ;[104] ...
|
||
|
||
;IF READING FROM FILE 2, PRINT THE SEPERATOR LINE ABOVE
|
||
|
||
TRNE FR,-1 ;[103] FILE 2?
|
||
PUSHJ PP,PRNSEP ;[103] SEPARATOR
|
||
PUSHJ PP,PNTTXT ;[76] [103] PRINT THE LINE
|
||
HRROM FR,NOHDR ;[76] [103] REMEMBER WE DID
|
||
POPJ PP, ;[76]
|
||
PRNSEP: MOVEI W1,[ASCIZ /****/] ;[103]
|
||
PUSHJ PP,PPRINT ;[103]
|
||
PUSHJ PP,PNTTAG ;[103]
|
||
PJRST PCRLF ;[103]
|
||
|
||
PNTDEC: IDIVI T,^D10 ;[76] YE OLDE DECIMAL PRINT ROUTINE
|
||
HRLM TT,0(PP) ;[76]
|
||
SKIPE T ;[76]
|
||
PUSHJ PP,PNTDEC ;[76]
|
||
HLRZ C,0(PP) ;[76]
|
||
ADDI C,"0" ;[76]
|
||
PUSHJ PP,TYO ;[76]
|
||
AOS TEMP ;[76] COUNT THAT CHARACTER
|
||
POPJ PP, ;[76]
|
||
;THE FOLLOWING CODE IS USED TO OUTPUT A LINE OF TEXT
|
||
PLINEN: MOVEI C,"1"(FR)
|
||
PUSHJ PP,PCHART ;PRINT 1 OR 2
|
||
MOVEI C,")"
|
||
PUSHJ PP,PCHART ;PRINT )
|
||
HLRZ C,(W1) ;GET PAGE NUMBER FOR THIS LINE
|
||
CAME C,PAGEN ;IS IT THE SAME AS PREVIOUS LINE?
|
||
PUSHJ PP,PGNUM ;PRINT NEW PAGE NUMBER
|
||
MOVEI C,.CHTAB ;[100] PRINT TAB
|
||
PUSHJ PP,FIXBP ;[115] FIX BP TO POINT TO TEXT
|
||
|
||
PLINE3: PUSHJ PP,PCHART
|
||
PRINT: ILDB C,W1 ;GET CHARACTER
|
||
JUMPN C,PLINE3 ;LOOP UNTIL A NULL SHOWS UP
|
||
POPJ PP,
|
||
|
||
PPRINT: HRLI W1,(POINT 7,,) ;[115] MAKE ADDRESS INTO A BP
|
||
JRST PRINT ;[115] ...
|
||
|
||
|
||
TCRLF: ;THIS TEST IS FOR BINARY COMPARE ON TTY
|
||
;ONLY PRINT HEADER ONCE, SINCE TAKES UP SPACE
|
||
;ON VT05'S ETC
|
||
TLNN FR,IOTTY ;IS OUTPUT TO TTY?
|
||
JRST PCRLF ;NO, GIVE EACH PAGE A HEADER
|
||
SKIPE ERRCNT ;COUNT IS ZERO FIRST TIME IN
|
||
JRST CRLF ;NOT FIRST TIME
|
||
|
||
PCRLF: ;THIS CODE OUTPUTS A CARRAIGE RETURN-LINE
|
||
;FEED AND DECREMENTS THE LINE COUNT
|
||
|
||
PUSHJ PP,CRLF
|
||
SOSN LINCNT ;DECREMENT THE LINES/PAGE COUNT
|
||
TLO FR,PAGSW ;THIS MEANS WE GET A NEW HEADING
|
||
POPJ PP,
|
||
|
||
PGNUM: MOVEM C,PAGEN ;SAVE NEW PAGE # AS OLD
|
||
PGNUM1: IDIVI C,^D10 ;[100] STANDARD DECIMAL PRINT ROUTINE
|
||
HRLM C+1,(PP)
|
||
SKIPE C
|
||
PUSHJ PP,PGNUM1
|
||
HLRZ C,(PP)
|
||
ADDI C,"0"
|
||
JRST PCHART
|
||
;THIS PAGE CONTAINS ROUTINES FOR CHARACTER OUTPUT
|
||
|
||
;CHARACTERS OUTPUTED AS A STRING OF TEXT COME THROUGH HERE
|
||
|
||
PCHART: JUMPE C,CPOPJ ;ZERO MEANS A CARRIAGE RETURN
|
||
;IF SO WE ARE THROUGH WITH LINE
|
||
CAIL C,.CHTAB ;[100] IS CHAR BETWEEN 11 (TAB) AND
|
||
CAILE C,.CHCRT ;[100] 15 (CARRIAGE RETURN), OR
|
||
CAIL C," " ; .GE. THAN 40 (SPACE)?
|
||
JRST PCHAR ;YES, PRINT AS IS
|
||
MOVSI C,100(C) ;NO, CONTROL CHAR --SAVE
|
||
HRRI C,"^" ;THIS IS CONTROL SYMBOL
|
||
PUSHJ PP,PCHAR ;OUTPUT THE "^"
|
||
MOVSS C ;AND NOW FOR THE LETTER
|
||
|
||
PCHAR: TLNN FR,USWBIT ;NO HEADERS FOR UPDATE MODE
|
||
TLZN FR,PAGSW ;DO WE NEED A NEW HEADING
|
||
JRST TYO ;NO--SIMPLE CHARACTER OUTPUT
|
||
SETOM LINCNT ;YES
|
||
;THIS CODE OUTPUTS A HEADING COMPRISES OF THE TITLE OF
|
||
;EACH FILE AFTER "FILE 1)" AND "FILE 2)"
|
||
|
||
MOVEM 16,SAVEXS+16 ;SAVE ACCUMULATORS WHILE OUTPUTING HEADING
|
||
MOVEI 16,SAVEXS
|
||
BLT 16,SAVEXS+15 ;ACCUMULATORS ARE NOW SAVED
|
||
TLNE FR,ENDSW ;DON'T BOTHER IF NO ERRORS DETECTED
|
||
JRST PCHAR1
|
||
MOVEI C,.CHFFD ;[100] FOR NEW PAGE, ISSUE FORM FEED
|
||
TLNN FR,NOFORM ;IF 1, SUPPRESS FORM FEED
|
||
PUSHJ PP,TYO
|
||
MOVEI W1,[ASCIZ /File 1) /]
|
||
PUSHJ PP,PPRINT
|
||
MOVEI W1,HBUF1
|
||
PUSHJ PP,PPRINT ;PRINT FILE 1 NAME
|
||
MOVEI W1,HBUF1D ;[51]
|
||
PUSHJ PP,PPRINT ;[51] AND ITS CREATION DATE
|
||
PUSHJ PP,PCRLF
|
||
MOVEI W1,[ASCIZ /File 2) /]
|
||
PUSHJ PP,PPRINT
|
||
MOVEI W1,HBUF2
|
||
PUSHJ PP,PPRINT ;PRINT FILE 2 NAME
|
||
MOVEI W1,HBUF2D ;[51]
|
||
PUSHJ PP,PPRINT ;[51] AND ITS CREATION DATE
|
||
PCHAR1: PUSHJ PP,CRLF ;FOLLOWED BY TWO CARRIAGE RETURN FINE FEEDS
|
||
PUSHJ PP,CRLF
|
||
MOVEI LPP ;RESET LINES/PAGE COUNT
|
||
MOVEM LINCNT
|
||
MOVSI 16,SAVEXS ;AND RESTORE ACS
|
||
BLT 16,15
|
||
MOVE 16,SAVEXS+16
|
||
TLZ FR,NOFORM ;CLEAR SUPPRESS FF FLAG AFTER RESTORING AC'S
|
||
SKIPE QSW ;Q LISTING ONLY?
|
||
JRST QFIN ;YES, GIVE UP ON FIRST ERROR
|
||
JRST TYO ;DON'T FORGET ABOUT THAT ORGINAL CHARACTER
|
||
|
||
;THE CODE ON THIS PAGE IS FOR HANDLING INPUT ERRORS
|
||
;THERE ARE TWO TYPES OF ERRORS--EITHER THE FILE IS NOT FOUND
|
||
;OR THE DEVICE IS NOT AVAILABLE--THE FORMAT FOR THESE MESSAGES
|
||
;IS THE SAME FORMAT USED FOR THE "TECO" MESSAGES.
|
||
|
||
|
||
ERRIA1: SKIPA T,[[ASCIZ/?Input error for input file 1- /]] ;
|
||
ERRIA2: MOVEI T,[ASCIZ/?Input error for input file 2- /] ;
|
||
ERRIA: HRRZ FIL,INDIR1+1 ;SAVE ERROR CODE
|
||
PUSHJ PP,TYPMSG ;TYPE FIRST PART OF MESSAGE
|
||
MOVE T,INDIR1 ;GET FILE NAME
|
||
PUSHJ PP,PNTSIX ;PRINT
|
||
HLLZS T,INDIR1+1 ;GET EXTENSION FREED FROM GARBAGE
|
||
JUMPE T,NOEXT ;ANY EXTENSION?
|
||
MOVEI C,"." ;YES, TYPE DOT
|
||
PUSHJ PP,TYO
|
||
MOVE T,INDIR1+1 ;GET EXTENSION
|
||
PUSHJ PP,PNTSIX ;PRINT
|
||
NOEXT: PUSHJ PP,ERCODP ;PRINT ERROR CODE
|
||
MOVEI T,[ASCIZ/) /] ;IN CASE OUT OF BOUNDS
|
||
CAIG FIL,ERRLN ;JUST PRINT CLOSE PARENS
|
||
SKIPE T,ERRTAB(FIL) ;PICK UP ERROR MESSAGE
|
||
PUSHJ PP,TYPMS0
|
||
JRST CARR ;THIS WILL OUTPUT TWO C.R. AND EXIT
|
||
|
||
ERRTAB: [ASCIZ/) File not found/] ; 0
|
||
[ASCIZ/) Non-existent UFD/] ; 1
|
||
[ASCIZ/) Protection failure/] ; 2
|
||
[ASCIZ/) File being modified/] ; 3
|
||
0 ; 4 NOT APPLICABLE
|
||
0 ; 5
|
||
[ASCIZ/) UFD or RIB error/] ; 6
|
||
0 ; 7
|
||
0 ;10
|
||
0 ;11
|
||
0 ;12
|
||
0 ;13
|
||
[ASCIZ/) No room or quota exceeded/] ;14
|
||
[ASCIZ/) Write-lock error/] ;15
|
||
[ASCIZ/) Not enough monitor table space/] ;16
|
||
0 ;17
|
||
0 ;20
|
||
[ASCIZ/) Cannot supersede UFD/] ;21
|
||
0 ;22
|
||
[ASCIZ/) SFD not found/] ;23
|
||
[ASCIZ/) Search list empty/] ;24
|
||
[ASCIZ/) SFD Nesting too deep/] ;25
|
||
[ASCIZ/) Path error/] ;26
|
||
0 ;27
|
||
[ASCIZ/) File cannot be updated/] ;30
|
||
0 ;31
|
||
0 ;32
|
||
ERRLN==.-ERRTAB-1 ;MAXIMUM ERROR CODE KNOWN
|
||
ERRA: MOVE T,OUTDEV ;OUTPUT INIT FAIL
|
||
MOVEM T,INDEV1
|
||
|
||
ERRI: MOVEI T,[ASCIZ /?Device /]
|
||
PUSHJ PP,TYPMSG ;TYPE BEGINING OF MESSAGE
|
||
MOVE T,INDEV1
|
||
PUSHJ PP,PNTSIX
|
||
MOVEI T,[ASCIZ /: Not available/]
|
||
PUSHJ PP,TYPMS0 ;TYPE REST OF MESSAGE
|
||
JRST CARR ;INSERT CARRIAGE RETURNS AND EXIT
|
||
|
||
|
||
ERCODP: MOVEI C," " ;PRINT A SPACE
|
||
PUSHJ PP,TYO ;
|
||
MOVEI C,"(" ;AND OPEN PARENS
|
||
PUSHJ PP,TYO ;
|
||
MOVEI T,(FIL) ;PICK UP ERROR CODE
|
||
ERCOD1: IDIVI T,10 ;GET A DIGIT
|
||
HRLM TT,(PP) ;STASH IT
|
||
SKIPE T ;DONE?
|
||
PUSHJ PP,ERCOD1 ;NO
|
||
HLRZ C,(PP) ;GET THE DIGIT
|
||
ADDI C,"0" ;ASCII-SIZE IT
|
||
PUSHJ PP,TYO ;OUT IT
|
||
POPJ PP, ;AND THATS IT
|
||
PNTSIX: MOVE TT,[POINT 6,T] ;INIT SIXBIT BYTE POINTER
|
||
PNTS1: TLNN TT,770000 ;FINISHED WITH WORD?
|
||
POPJ PP, ;YES
|
||
ILDB C,TT ;NO, GET CHARACTER
|
||
JUMPE C,PNTS1 ;FLUSH SPACES
|
||
ADDI C," "-' ' ;[100] CHANGE TO ASCII
|
||
PUSHJ PP,TYO
|
||
JRST PNTS1
|
||
CRLF: MOVEI C,.CHCRT ;[100] OUTPUT A CARRIAGE RETURN-LINE FEED
|
||
PUSHJ PP,TYO
|
||
MOVEI C,.CHLFD ;[100] NOW THE LINE FEED
|
||
|
||
TYO: SOSG CTOBUF+2 ;DECREMENT BUFFER COUNT
|
||
PUSHJ PP,DMPOUT ;BUFFER WAS FULL
|
||
IDPB C,CTOBUF+1 ;DEPOSIT CHAR.
|
||
CAIN C,.CHLFD ;[100] LINE FEED?
|
||
TLNN FR,IOTTY ;WHILE DOING 1 OUTPUT PER LINE?
|
||
POPJ PP, ;NO
|
||
DMPOUT: OUT CTL, ;YES, OUTPUT BUFFER
|
||
POPJ PP, ;OK
|
||
JSP T,ERROUT
|
||
ASCIZ /?Output device error/
|
||
|
||
ERRONO: MOVEI T,[ASCIZ/?Output device error- /]
|
||
PUSHJ PP,TYPMSG ;[24]
|
||
MOVE T,OUTDEV ;[24]AND DEVICE
|
||
PUSHJ PP,PNTSIX ;[24]CANT DO OUTPUT
|
||
MOVEI T,[ASCIZ/: cannot do output/] ;[24]
|
||
PUSHJ PP,TYPMS0 ;[24]
|
||
JRST CARR ;[24]FINISH UP
|
||
ERROEF:
|
||
MOVE T,OUTDIR ;[24]SET UP DIR
|
||
MOVE TT,OUTDIR+1 ;[24]
|
||
MOVEM T,INDIR1 ;[24]FOR TYPEOUT
|
||
MOVEM TT,INDIR1+1 ;[24]
|
||
MOVEI T,[ASCIZ/?Output ENTER error for /]
|
||
JRST ERRIA ;[24]
|
||
ERRCOR: MOVEI T,[ASCIZ /?2K core needed and not available/]
|
||
PUSHJ PP,TYPMSG
|
||
EXIT ;PRINT MESSAGE AND EXIT
|
||
|
||
ERROUT: PUSHJ PP,TYPMSG ;OUTPUT ERROR
|
||
JRST CARR ;THROW IN TWO CR AND TRY AGAIN
|
||
|
||
TYPB: PUSHJ PP,TYPTAB
|
||
PUSHJ PP,TYCELL
|
||
PUSHJ PP,TYPSP
|
||
TYCELL: SKIPN TT,DIG ;[63] IF ZERO MEANS HW SIZE NEEDED
|
||
MOVEI TT,6 ;CALCULATER CONTENTS A A MEMORY WORD
|
||
;WHICH IS STORED IN AC T
|
||
;SHIFT A CHAR. INTO ACC AND ADD 60
|
||
;DO IT TO MAKE IT ASCII; DO THIS 6 TIMES
|
||
|
||
SETZM DIG ;[63] SET ZERO FOR NEXT TIME
|
||
TYCEL2: MOVEI C,0 ;[63] ADD THE LABEL
|
||
LSHC C,3
|
||
ADDI C,"0"
|
||
PUSHJ PP,PCHAR
|
||
SOJG TT,TYCEL2 ;[63]
|
||
POPJ PP,
|
||
|
||
TYPSP: MOVEI C," "
|
||
JRST TYO
|
||
|
||
TYPTB2: PUSHJ PP,TYPTAB
|
||
TYPTAB: MOVEI C,.CHTAB ;[100]
|
||
JRST TYO
|
||
|
||
TYCNT: AOS ERRCNT
|
||
HRLZ T,CNT
|
||
JRST TYCELL
|
||
|
||
|
||
|
||
;ROUTINES FOR OUTPUTING ERROR MESSAGES
|
||
|
||
TYPMSG: PUSHJ PP,INITTY ;INTIALIZE TTY
|
||
PUSHJ PP,CRLF ;OUTPUT A CARRIAGE RETURN
|
||
TYPMS0: HRLI T,(POINT 7,,) ;THIS IS POINTER FOR ERROR MESSAGE
|
||
SKIPA
|
||
PUSHJ PP,TYO
|
||
TYPMS1: ILDB C,T ;LOAD A CHAR. FROM ERROR MESSAGE
|
||
JUMPN C,.-2 ;ALL ERROR MESSAGES END WITH A ZERO
|
||
POPJ PP, ;THROUGH WITH ERROR MESSAGE
|
||
|
||
CARR: PUSHJ PP,CRLF ;COMMON EXIT FOR ERROR MESSAGES
|
||
PUSHJ PP,CRLF
|
||
JRST COMP ;GO TO VERY BEGINNING
|
||
|
||
;INITIALIZE TTY FOR ERROR MESSAGES
|
||
INITTY: CLOSE CTL,
|
||
RELEAS CTL,
|
||
INIT CTL,1
|
||
SIXBIT /TTY/
|
||
XWD CTOBUF,CTIBUF
|
||
HALT
|
||
INBUF CTL,1
|
||
OUTBUF CTL,1
|
||
POPJ PP,
|
||
|
||
;HELP MESSAGE TEXT
|
||
|
||
HELP: PUSHJ PP,EAT ;[45] READ TO END OF LINE
|
||
MOVE 1,['FILCOM'] ;NAME OF HELP FILE
|
||
PUSHJ PP,.HELPR ;READ IT
|
||
JRST COMPGO ;PRINT * AGAIN
|
||
|
||
;ROUTINE TO GET A LEGITIMATE CHARACTER
|
||
|
||
GCHAR: SKIPN OLDCHR(FR) ;[44] CHARACTER LEFT FROM LAST TIME?
|
||
JRST GCHAR0 ;[44] NO, PROCEED AS USUAL
|
||
MOVE C,OLDCHR(FR) ;[44] YES, USE IT INSTEAD OF A NEW ONE
|
||
SETZM OLDCHR(FR) ;[44] ZERO THE FLAG
|
||
JRST GCHR00 ;[44] SKIP CHECKS ALREADY MADE
|
||
GCHAR0: TLNE FR,@EOFTBL(FR) ;[44] EOF SEEN?
|
||
JRST NULL ;YES, RETURN NULL
|
||
SOSG @CNTTBL(FR) ;DECREMENT BUFFER COUNT
|
||
JSP C,@[EXP GCHAR1,GCHAR2](FR) ;BUFFER EMPTY- DO "INPUT"
|
||
SKIPN @CNTTBL(FR) ;DID WE GET ANY DATA
|
||
JRST GCHAR ;NO
|
||
ILDB C,@BYTTBL(FR) ;YES, GET A CHARACTER
|
||
JUMPE C,GCHAR ;GET RID OF NULLS
|
||
CAIE C,.CHLFD ;[100] LINE FEED?
|
||
CAIN C,.CHVTB ;[100] NO-VERTICAL TAB?
|
||
JRST EOL ;YES, RETURN WITH LINE-END FLAG SET
|
||
CAIN C,.CHCRT ;[100] CARRIAGE RETURN?
|
||
JRST [SETOM CRSEEN(FR) ;[44] YES, POSSIBLY FLUSH
|
||
JRST GCHAR] ;[44] SO GO GET ANOTHER
|
||
CAIN C,.CHFFD ;[100] IS IT A FORM FEED?
|
||
JRST FORM ;YES
|
||
SKIPN CRSEEN(FR) ;[44] WAS LAST CHARACTER A CR?
|
||
JRST GCHR00 ;[44] NO, WE HAVE WHAT WE WANT
|
||
MOVEM C,OLDCHR(FR) ;[44] YES, SAVE THIS ONE FOR NEXT TIME
|
||
MOVEI C,.CHCRT ;[44] [100] RETURN A CARRIAGE-RETURN
|
||
JRST EOL ;[44] AS AN EOL CHARACTER
|
||
GCHR00: HRL C,@SEQTBL(FR) ;[44] GET SEQUENCE # BIT (IF IT EXISTS)
|
||
TLZ C,777776 ;TURN OFF ALL BUT SEQ. # BIT
|
||
POPJ PP, ;NO, RETURN WITH CHAR
|
||
|
||
GCHAR1: INPUT IN1, ;INPUT FOR FILE 1
|
||
STATO IN1,762000 ;ERRORS OR END OF FILE?
|
||
JRST (C) ;NO
|
||
STATO IN1,742000 ;YES, EOF?
|
||
JRST EOF ;YES END OF FILE
|
||
JSP T,ERROUT
|
||
ASCIZ /?File 1 read error/
|
||
|
||
GCHAR2: INPUT IN2,
|
||
STATO IN2,762000
|
||
JRST (C)
|
||
STATO IN2,742000
|
||
JRST EOF
|
||
JSP T,ERROUT
|
||
ASCIZ /?File 2 read error/
|
||
|
||
SEQTBL: Z @INBUF1+1 ;POINTS TO ADR OF LAST CHAR FILE #0
|
||
Z @INBUF2+1 ;DITTO FILE #1
|
||
|
||
BYTTBL: INBUF1+1 ;ADR OF BYTE POINTER FILE #0
|
||
INBUF2+1 ;DITTO FILE #1
|
||
|
||
EOFTBL: EOF1SW ;EOF FLAG FOR FILE 1
|
||
EOF2SW ;EOF FLAG FOR FILE 2
|
||
|
||
CNTTBL: INBUF1+2 ;POINTS TO FILE 1 CHAR COUNT
|
||
INBUF2+2 ;DITTO FILE 2
|
||
|
||
EOF: TLO FR,@EOFTBL(FR) ;SET EOF FLAG
|
||
NULL: TDZA C,C ;THEN RETURN NULL CHAR
|
||
FORM: AOS PAGNUM(FR) ;INDEX PAGE NUMBER
|
||
EOL: TLO C,(1B0) ;SET BIT 0 TO SHOW END-OF-LINE
|
||
SETZM CRSEEN(FR) ;[44] ZERO A FLAG
|
||
POPJ PP,
|
||
|
||
;HERE TO SKIP REST OF FILES, AND TAKE A QUICK EXIT.
|
||
|
||
QFIN: AOS ERRCNT ;ENSURE AT LEAST ONE ERROR SEEN
|
||
JRST FIN2 ;[30] TAKE QUICK EXIT.
|
||
|
||
|
||
NAME1: SETZB ACDEV,ACDEL ;ZERO REGISTERS WHICH WILL RETURN THE NAMES
|
||
SETZB ACFILE,ACEXT
|
||
SETZB ACPPN,EXTFL2 ;INIT PROJ,PROG NUMBER TO [0,0]
|
||
TLZ FR,CTYPF ;CLEAR COMMAND TYPED FLAG
|
||
|
||
NAME3: MOVSI ACPNTR,(POINT 6,0) ;SET POINTER
|
||
SETZB TT,0 ;THE SIXBIT NAME WILL BE STORED IN THE AC0
|
||
|
||
GETIOC: PUSHJ PP,TTYIN ;GET INPUT CHARACTER
|
||
CAIN C,.CHCNZ ;[45] [100] AN EOF TERMINATES A FILE NAME
|
||
JRST [SETOM XITFLG ;[45] [100] AND CAUSES US TO EXIT LATER
|
||
JRST TERM] ;[45] [100] HANDLE WHAT WE HAVE
|
||
CAILE C,.CHCRT ;[45] [100] THIS IS ANOTHER WAY TO GET A FILE NAME
|
||
CAIN C,.CHESC ;[100] ALT MODE?
|
||
JRST TERM ;YES
|
||
CAIE C,"_" ;ONE KIND OF SEPERATOR
|
||
CAIN C,"," ;THIS ALSO MEANS WE HAVE FINISHED A TERM
|
||
JRST TERM ;TERM HAS BEEN READ
|
||
CAIN C,"/" ;IS THERE A SWITCH?
|
||
JRST GETSW ;YES
|
||
TLO FR,CTYPF ;SET COMMAND TYPED FLAG
|
||
CAIN C,":" ;HAVE WE BEEN GETTING A DEVICE NAME
|
||
JRST DEVICE ;YES
|
||
CAIN C,"." ;OR A FILE NAME
|
||
JRST [CAIN ACDEL,".";[75] IF WE'VE SEEN A . IN THE LAST PHRASE,
|
||
JRST ERRDEI ;[75] GIVE AN ERROR
|
||
JRST NAME] ;[75] OTHERWISE, PROCESS A FILENAME
|
||
CAIN C,"[" ;THIS CHAR STARTS A PROJ,PROG NUMBER
|
||
JRST GETPP
|
||
;ALL OTHER CHARACTERS SHOULD BE ALPHANUMERIC FOR FILENAMES
|
||
CAIL C,"A"
|
||
CAILE C,"Z"
|
||
JRST [CAIL C,"0" ;NOT ALPHABETIC, IS IT NUMERIC?
|
||
CAILE C,"9"
|
||
JRST CTLSER ;NOT ALPHANUMERIC, COMMAND ERROR
|
||
JRST .+1]
|
||
TRC C," "^!' ' ;[100] CONVERT TO SIXBIT
|
||
TLNE ACPNTR,770000 ;HAVE WE STORED SIX BYTES?
|
||
IDPB C,ACPNTR ;NO
|
||
JRST GETIOC ;GET ANOTHER CHAR.
|
||
TTYIN: SOSG CTIBUF+2 ;DECREMENT CHARACTER COUNT, ANY LEFT?
|
||
INPUT CTL, ;NO, GET A BUFFER FULL
|
||
ILDB C,CTIBUF+1 ;GET CHARACTER
|
||
JUMPE C,TTYIN ;FLUSH NULLS
|
||
CAIE C,.CHAL2 ;[100]
|
||
CAIN C,.CHALT ;[100]
|
||
MOVEI C,.CHESC ;[100] CHANGE ALL ALT MODES TO NEW
|
||
CAIN C,"="
|
||
MOVEI C,"_" ;= WILL EVENTUALLY REPLACE _
|
||
CAIL C,"a" ;[100]
|
||
CAILE C,"z" ;[100]
|
||
CAIA ;[100]
|
||
TRC C,"a"^!"A" ;[100] CHANGE LOWER CASE TO UPPER CASE
|
||
CAIE C," " ;[100] SKIP BLANKS
|
||
CAIN C,.CHTAB ;[100] AND TABS
|
||
JRST TTYIN
|
||
POPJ PP, ;NO, EXIT
|
||
DEVICE: SKIPA ACDEV,0 ;DEVICE NAME
|
||
NAME: MOVE ACFILE,0 ;FILE NAME
|
||
MOVE ACDEL,C ;SET DELIMITER
|
||
JRST NAME3 ;GET NEXT SYMBOL
|
||
|
||
TERM: PUSHJ PP,CHKTRM ;[71] CHECK FOR LAST DELIMETER SEEN
|
||
CAIE ACDEL,"." ;IF PERIOD,
|
||
POPJ PP,
|
||
HLRZ 0,ACEXT ;[71] PUT EXTENSION IN RH FOR TABLE SEARCH
|
||
MOVSI T,EXTBL-EXTBLE ;NEGATIVE WORD COUNT
|
||
CAIE 0,@EXTBL(T) ;MATCH EXT?
|
||
AOBJN T,.-1
|
||
HLLZ T,EXTBL(T) ;GET FLAGS
|
||
MOVEM T,EXTFL2 ;SAVE THEM
|
||
POPJ PP, ;EXIT
|
||
|
||
EXTBL: XDFBIT,,'SAV'
|
||
XDFBIT,,'LOW'
|
||
XDFBIT,,'SVE'
|
||
HSGBIT,,'SHR'
|
||
HSGBIT,,'HGH'
|
||
WDFBIT,,'UNV' ;[61]
|
||
WDFBIT,,'REL'
|
||
WDFBIT,,'XPN'
|
||
WDFBIT,,'CHN'
|
||
WDFBIT,,'DMP'
|
||
WDFBIT,,'BIN'
|
||
WDFBIT,,'RIM'
|
||
WDFBIT,,'RTB'
|
||
WDFBIT,,'RMT'
|
||
WDFBIT,,'BAC'
|
||
WDFBIT,,'BUG'
|
||
WDFBIT,,'CAL'
|
||
WDFBIT,,'DAE'
|
||
WDFBIT,,'DCR'
|
||
WDFBIT,,'MSB'
|
||
WDFBIT,,'OVR'
|
||
WDFBIT,,'QUC'
|
||
WDFBIT,,'QUE'
|
||
WDFBIT,,'QUF'
|
||
WDFBIT,,'SFD'
|
||
WDFBIT,,'SYS'
|
||
WDFBIT,,'UFD'
|
||
EXEBIT,,'EXE'
|
||
WDFBIT,,'OVL' ;[73] Overlay
|
||
WDFBIT,,'ATR' ;[73] SIMULA attribute file
|
||
WDFBIT,,'DBS' ;[73] DBMS file
|
||
WDFBIT,,'QUD' ;[73] Queue data file
|
||
WDFBIT,,'SCH' ;[73] DBMS file
|
||
WDFBIT,,'APL' ;[73] APL workspace default extension
|
||
WDFBIT,,'SYM' ;[73] ALGOL file
|
||
EXTBLE: 0 ;END OF TABLE
|
||
;CHKTRM - Routine to check if a filename or extension has been parsed into
|
||
; AC0. If so, store it in the appropriate AC (ACFILE or ACEXT). This
|
||
; routine also checks to see if double names have been typed and gives an
|
||
; error message if true. The only delimeters legally stored in ACDEL are
|
||
; comma and colon; if anything else is there, the error is internal;
|
||
; but don't report it since FILCOM is very simple minded about these
|
||
; things.
|
||
|
||
CHKTRM: JUMPE 0,CPOPJ ;[71] IF NO CHARACTERS STORED, CONTINUE
|
||
CAIE ACDEL,"." ;[71] IF DELIMETER IS A PERIOD, AC0 CONTAINS
|
||
JRST CHKTR1 ;[71] AN EXTENSION
|
||
SKIPE ACEXT ;[71] IF AN EXTENSION HAS ALREADY BEEN PARSED,
|
||
JRST ERRDEI ;[71] GIVE AN ERROR
|
||
HLLZ ACEXT,0 ;[71] STORE THE EXTENSION IN LH
|
||
JRST CHKTR3 ;[71] NOW ZERO SOME STUFF AND RETURN
|
||
|
||
|
||
;[71] HERE IF DELIMETER IS NOT A PERIOD
|
||
CHKTR1: JUMPE ACDEL,CHKTR2 ;[71] IF NO DELIMETER HAS BEEN TYPED OR IT'S A
|
||
CAIE ACDEL,":" ;[71] COLON, THEN CHARS IN AC0 ARE A FILENAME
|
||
POPJ PP, ;[71] SHOULD NEVER GET HERE SINCE ONLY ":", "."
|
||
;[71] ARE STORED IN ACDEL. HOWEVER, CONTINUE
|
||
;[71] PARSING IN THE SPIRIT OF FILCOM
|
||
CHKTR2: SKIPE ACFILE ;[71] IF A FILENAME HAS ALREADY BEEN PARSED,
|
||
JRST ERRDFI ;[71] GIVE AN ERROR
|
||
MOVE ACFILE,0 ;[71] STORE THE FILENAME
|
||
;[71] FALL INTO CHKTR2 ROUTINE
|
||
|
||
CHKTR3: SETZB TT,0 ;[71] CLEAR AC'S
|
||
MOVSI ACPNTR,(POINT 6,0) ;[71] RESET BYTE POINTER
|
||
POPJ PP, ;[71] AND RETURN
|
||
|
||
|
||
|
||
|
||
GETSW: PUSHJ PP,TTYIN ;A SWITCH HAS BEEN DETECTED
|
||
MOVSI T,SWTBL-SWTBLE ;SET UP NEG. COUNT FOR TABLE SEARCH
|
||
CAIE C,@SWTBL(T) ;FOUND CHAR? (INDIRECT=INDEX=0)
|
||
AOBJN T,.-1
|
||
JUMPGE T,GETSW1 ;JUMP IF NOTHING FOUND
|
||
TDOA FR,SWTBL(T) ;TURN ON FLAG (GARBAGE IN RIGHT)
|
||
GETSWE: SETOM QSW ;SET /Q SEEN
|
||
PUSHJ PP,CHKTRM ;[71] CHECK IF CELLS NEED TO BE STORED
|
||
JRST GETIOC ;GET NEXT PART OF COMMAND
|
||
|
||
GETSW1: CAIN C,"H" ;REQUEST FOR HELP?
|
||
JRST HELP ;YES
|
||
CAIN C,"Q" ;/Q?
|
||
JRST GETSWE ;YES
|
||
CAIN C,"O" ;[76] WANT SYMBOL OFFSETS?
|
||
JRST [SETOM OFSSWT ;[76] YES
|
||
JRST GETIOC] ;[76] GET NEXT PART OF COMMAND
|
||
CAIN C,"T" ;[105] WANT FILE ALWAYS?
|
||
JRST [SETOM OPTSWT ;[105] YES
|
||
JRST GETIOC] ;[105] ON WITH COMMAND
|
||
CAIN C,"I" ;[117] WANT CASE INVARIANT COMPARE?
|
||
JRST [SETOM OPISWT ;[117] YES
|
||
JRST GETIOC] ;[117] ONWARDS
|
||
SETZ T, ;START WITH ZERO
|
||
PUSHJ PP,GETOC2 ;BUILD OCTAL NUMBER IN T
|
||
JUMPE T,ERRSWT ;[71] ERROR IF NO NUMBER
|
||
MOVEM T,NUMLIN ;SAVE AS # EXTRA LINES TO MATCH (AFTER 1ST)
|
||
CAIN C,"L" ;[34] TEST FOR LIMIT SWITCHES
|
||
JRST [SETOM LSEEN ;[34] We saw the /L switch
|
||
JRST SETLIM+1] ;[34] Set up limits
|
||
CAIN C,"U" ;EITHER UPPER OR LOWER
|
||
JRST SETLIM ;FOUND ONE
|
||
JRST ERRSWT ;[71] REPORT UNKNOWN SWITCH TYPED
|
||
|
||
SETLIM: SKIPA UPPER,T ;UPPER LIMIT /0000U
|
||
MOVE LOWER,T ;LOWER LIMIT /0000L
|
||
PUSHJ PP,CHKTRM ;[71] SEE IF SWITCH TERMINATED A CELL
|
||
JRST GETIOC ;GET MORE COMMAND
|
||
|
||
SWTBL: SSWBIT,,"S" ;/S SUPPRESSES COMPARING SPACES, TABS
|
||
CSWBIT!SSWBIT,,"C" ;/C DON'T COMP. COMMENTS OR SPACING
|
||
ALLSW,,"B" ;/B ALLOWS COMPARING BLANK LINES
|
||
ASWBIT,,"A" ;/A COMPARE LINE BY LINE (ASCII)
|
||
WSWBIT,,"W" ;/W COMPARE WORD FOR WORD (BINARY)
|
||
XSWBIT,,"X" ;/X EXPAND SAV FILE FIRST (BINARY)
|
||
EXEBIT,,"E" ;/E COMPARE EXE FILES [25]
|
||
USWBIT+ALLSW,,"U" ;/U MANUAL UPDATE MODE
|
||
SWTBLE: ;END OF TABLE
|
||
;ERROR MESSAGES FOR SWITCH PARSING IN COMMAND LINE
|
||
|
||
ERRSWT: PUSH PP,C ;[71] SAVE THE UNKNOWN SWITCH ARGUMENT
|
||
PUSHJ PP,EAT ;[71] GET THE COMMAND IN CASE A ^Z WAS TYPED
|
||
MOVEI T,[ASCIZ /?Command error -- Unknown switch /] ;[71]
|
||
PUSHJ PP,TYPMSG ;[71]
|
||
POP PP,C ;[71] RESTORE THE CHARACTER
|
||
PUSHJ PP,TYO ;[71] CHARACTER IS IN C ALREADY
|
||
JRST CARR ;[71] FINISH UP AND TRY AGAIN
|
||
|
||
|
||
ERRDFI: PUSHJ PP,EAT ;[71] GET THE COMMAND IN CASE A ^Z WAS TYPED
|
||
JSP T,ERROUT ;[71]
|
||
ASCIZ /?Command error -- Double filename illegal/ ;[71]
|
||
|
||
|
||
ERRDEI: PUSHJ PP,EAT ;[71] GET THE COMMAND IN CASE A ^Z WAS TYPED
|
||
JSP T,ERROUT ;[71] IF AN EXTENSION ALREADY EXISTS
|
||
ASCIZ /?Command error -- Double extension illegal/
|
||
GETPP: PUSHJ PP,CHKTRM ;[71] CHECK IF [ TERMINATED A CELL
|
||
PUSHJ PP,GETOCT ;BUILD THE PROJ,PROG NUMBER
|
||
CAIN C,"-" ;WAS THIS DASH? (DEFAULT PATH)
|
||
JRST [ JUMPN T,CTLSER;MUST BE ONLY CHAR THEN
|
||
JRST DEFPTH ] ;GO DEFAULT THE PATH
|
||
CAIE C,","
|
||
JRST CTLSER
|
||
HRLZ ACPPN,T ;PUT PROJ NUMBER IN LEFT HALF
|
||
PUSHJ PP,GETOCT
|
||
HRR ACPPN,T ;PUT PROG NUM IN RIGHT HALF
|
||
GETPPN T, ;[23] GET JOB'S PPN
|
||
JFCL
|
||
TLNN ACPPN,777777 ;[23] PROJ NUMBER 0?
|
||
HLL ACPPN,T ;[23] YES, PUT JOB'S PROJ NUMBER IN LEFT HALF
|
||
TRNN ACPPN,777777 ;[23] PROG NUMBER 0?
|
||
HRR ACPPN,T ;[23] YES, PUT JOB'S PROG NUMBER IN RIGHT HALF
|
||
CAIN C,"]" ;SIMPLE PPN?
|
||
JRST GETIOC ;YES,CONTINUE WITH COMMAND
|
||
PUSHJ PP,CHKEOL ;[102] END OF LINE?
|
||
JRST TERM ;[102] YES, CONTINUE SCANNING
|
||
MOVE T,FILCNT ;GET FILE WE ARE DOING
|
||
MOVE T,[EXP OUTDIR,INDIR1](T) ;GET PROPER FILE
|
||
MOVEM ACPPN,PTHPPN(T) ;STORE PPN
|
||
MOVEI ACPPN,PTHADR(T) ;SET PPN TO POINT TO PATH BLOCK
|
||
MOVEI T,PTHSFD(T) ;SET UP FOR INPUT OF SFDS
|
||
HRLI T,-MAXSFD ;SET UP COUNTER TOO
|
||
GETPP1: CAIN C,"]" ;CLOSED WITH BRACKET?
|
||
JRST GETIOC ;YES,CONTINUE COMMAND SCANNING
|
||
PUSHJ PP,CHKEOL ;[102] END OF LINE?
|
||
JRST TERM ;[50] YES, CONTINUE SCANNING
|
||
SKIPGE T ;COUNT NEGATIVE?
|
||
CAIE C,"," ;IS THIS SFD SPECIFICATION?
|
||
JRST CTLSER ;NO, INDICATE ERROR
|
||
PUSHJ PP,RD6 ;READ THE SFD NAME
|
||
JUMPE TT,CTLSER ;IF NULL,ITS ERROR
|
||
MOVEM TT,0(T) ;STORE SFD
|
||
SETZM 1(T) ;INSURE NULL TERMINATOR
|
||
AOBJN T,.+1 ;INCREMENT BOTH PARTS OF SFD POINTER
|
||
JRST GETPP1 ;LOOP FOR NEXT ONE
|
||
|
||
|
||
;CHKEOL - CALL HERE TO CHECK FOR END OF LINE CHARACTER. RETURN IF END OF LINE,
|
||
; SKIP RETURN IF NOT.
|
||
|
||
CHKEOL: CAIN C,.CHESC ;[50] [100] ESCAPE?
|
||
POPJ PP, ;YES.
|
||
CAIE C,.CHCNZ ;[50] [100] MAYBE AN END OF FILE?
|
||
CAIG C,.CHCRT ;[50] [100] LF, FF, ETC.?
|
||
POPJ PP, ;YES.
|
||
JRST CPOPJ1 ;NOT END OF LINE.
|
||
GETOCT: MOVEI T,0 ;BUILD AN OCTAL NUMBER
|
||
GETOC1: PUSHJ PP,TTYIN
|
||
GETOC2: CAIL C,"0"
|
||
CAILE C,"7"
|
||
POPJ PP, ;RETURN ON A NON OCTAL DIGIT
|
||
LSH T,3
|
||
ADDI T,-"0"(C)
|
||
JRST GETOC1
|
||
|
||
RD6: PUSH PP,T ;SAVE T REG
|
||
MOVE T,[POINT 6,TT] ;STORE INTO TT
|
||
SETZ TT, ;CLEAR ARGUMENT
|
||
RD61: PUSHJ PP,TTYIN ;GET A CHARACTER
|
||
CAIL C,"0" ;LESS THAN 0?
|
||
CAILE C,"Z" ;OR GREATER THAN Z?
|
||
JRST TPOPJ ;YES,RETURN
|
||
CAILE C,"9" ;LESS THAN 9 OR
|
||
CAIL C,"A" ;GREATER THAN A?
|
||
JRST RD62 ;ITS OK
|
||
TPOPJ: POP PP,T ;RESTORE TEMP REGISTER
|
||
POPJ PP, ;RETURN
|
||
RD62: SUBI C," " ;CONVERT TO SIXBIT
|
||
TRNN TT,77 ;IF WORD NOT FULL,
|
||
IDPB C,T ;STORE BYTE
|
||
JRST RD61 ;LOOP FOR NEXT CHARACTER
|
||
|
||
DEFPTH: MOVE T,FILCNT ;GET FILE INDEX
|
||
MOVE T,[EXP OUTDIR,INDIR1](T) ;GET RIGHT DIR BLOCK
|
||
MOVEI ACPPN,PTHADR(T) ;PPN IS 0,,PATH BLOCK ADDRESS
|
||
SETOM PTHADR(T) ;READ DEFAULT PATH
|
||
MOVEI TT,PTHADR(T) ;POINT TO PATH BLOCK
|
||
HRLI TT,MAXSFD+4 ;LENGTH OF AREA AVAILABLE
|
||
PATH. TT, ;ASK MONITOR FOR DEFAULT PATH
|
||
JRST NOPTH ;NO AVAILABLE
|
||
PUSHJ PP,TTYIN ;GET NEXT CHARACTER
|
||
CAIN C,"]" ;CLOSES IT RIGHT?
|
||
JRST GETIOC ;RIGHT,GET REST OF STRING
|
||
JRST CTLSER ;OTHERWISE,COMPLAIN
|
||
|
||
NOPTH: JSP T,ERROUT ;IF PATH. UUO FAILED
|
||
ASCIZ /?PATH. UUO required to default file path/
|
||
|
||
EAT1: PUSHJ PP,TTYIN ;[45] GET A CHARACTER INTO C
|
||
EAT: CAIG C,.CHFFD ;[45] [100] IN THE RANGE OF FORM FEED
|
||
CAIGE C,.CHLFD ;[45] [100] DOWN TO LINE FEED?
|
||
CAIN C,.CHESC ;[45] [100] NO, IS IT AN ALTMODE?
|
||
POPJ PP, ;[45] YES! RETURN WITH EOL CHAR
|
||
CAIN C,.CHBEL ;[45] [100] IS IT A ^G?
|
||
POPJ PP, ;[45] YES, THAT ENDS LINE TOO
|
||
CAIE C,.CHCNZ ;[45] [100] IS IT A ^Z?
|
||
JRST EAT1 ;[45] NO, EAT ANOTHER CHARACTER
|
||
SETOM XITFLG ;[45] IT'S ^Z, MARK TO EXIT LATER
|
||
POPJ PP, ;[45] RETURN
|
||
|
||
;CREATE PAGE HEADER FOR LISTING FILES CONSISTING OF:
|
||
;DEVICE:FILENAME.EXT[PROJ,PROG,SFD,SFD,..,SFD] CREATED MMHH DAY-MONTH-YEAR
|
||
|
||
HEADER: MOVEI TT,IN1 ;ASSUME FIRST FILE
|
||
SETZM TEMP ;[51] SET SO WITH TEMP
|
||
CAIE T,HBUF1 ;IS IT?
|
||
JRST [MOVEI TT,IN2 ;[51] NO
|
||
AOS TEMP ;[51] MARK WITH TEMP
|
||
JRST .+1] ;[51] RETURN TO MAINLINE CODE
|
||
MOVEM TT,PTHBLK+.PTFCN;STORE AS FUNCTION
|
||
HRLI T,440700 ;MAKE ADDRESS INTO BYTE POINTER
|
||
MOVEM T,HPOINT ;AND SAVE FOR FUTURE USE
|
||
MOVE TT,[MAXSFD+4,,PTHBLK] ;SET UP FOR PATH.
|
||
SETZM PTHBLK+.PTPPN ;CLEAR PPN AND
|
||
SETZM PTHBLK+.PTPPN+1 ;FIRST SFD FROM LIST
|
||
PATH. TT, ;DO IT
|
||
SKIPA T,INDEV1 ;USE DEVICE FROM LOOKUP BLOCK IF FAILS
|
||
MOVE T,PTHBLK+.PTFCN ;OTHERWISE USE THE PATH. DEVICE
|
||
PUSHJ PP,HEDST6
|
||
MOVEI C,":"
|
||
PUSHJ PP,HEDDPB ;DEPOSIT COLON INTO HEADER
|
||
DEVCHR T, ;GET DEVICE CHARACTERISTICS
|
||
TLNN T,(1B15) ;DOES DEVICE HAVE A DIRECTORY?
|
||
JRST [PUSHJ PP,HEAD8;[51] DEPOSIT A NULL
|
||
JRST PRETTY] ;[51] CLEAN UP HEADER AND RETURN
|
||
SKIPE T,INDIR1
|
||
PUSHJ PP,HEDST6 ;IF FILE NAME NOT NULL, PRINT IT
|
||
HLLZ T,INDIR1+1 ;ISOLATE EXTENSION
|
||
JUMPE T,HEAD2 ;DON'T PRINT IF EXTENSION NULL
|
||
MOVEI C,"."
|
||
PUSHJ PP,HEDDPB ;PUT DOT INTO HEADER
|
||
HLLZ T,INDIR1+1
|
||
PUSHJ PP,HEDST6 ;PRINT EXTENSION
|
||
HEAD2: SKIPN T,PTHBLK+.PTPPN ;GET PPN FROM PATH, IF AVAILABLE
|
||
MOVE T,INDPPN ;OTHERWISE USE LOOKUP PPN
|
||
JUMPE T,HEAD4 ;SKIP WHOLE THING IF STILL NO PPN
|
||
MOVEI C,"[" ;PRINT IT
|
||
PUSHJ PP,HEDDPB
|
||
SKIPE PTHBLK+.PTPPN+1 ;ANY SFD'S?
|
||
JRST PRTPTH ;IF PATH (SFDS) , PRINT DIFFERENTLY
|
||
PUSH PP,T ;SAVE PROJ,PROG NUMBER
|
||
HLRZS T ;CLEAR PROG NUMBER
|
||
PUSHJ PP,HED8 ;PRINT PROJECT #
|
||
MOVEI C,","
|
||
PUSHJ PP,HEDDPB
|
||
POP PP,T ;RESTORE PROG NUMBER
|
||
ANDI T,-1 ;ISOLATE IT
|
||
PUSHJ PP,HED8 ;PRINT PROGRAMMER #
|
||
HEAD3: MOVEI C,"]"
|
||
PUSHJ PP,HEDDPB
|
||
HEAD4: MOVE TT,HPOINT ;[51] GET THE BYTE POINTER
|
||
MOVEM TT,HBPT2 ;[51] ASSUME 2ND FILE AND STORE
|
||
SKIPN TEMP ;[51] WAS IT THE FIRST FILE?
|
||
MOVEM TT,HBPT1 ;[51] YES, STORE IT RIGHT
|
||
SETZ C, ;[51] MAKE A NULL
|
||
PUSHJ PP,HEDDPB ;[51] TERMINATE THE FILESPEC
|
||
MOVE TT,[POINT 7,HBUF2D] ;[51] CREA. DATE POINTER
|
||
SKIPN TEMP ;[51] SECOND FILE?
|
||
MOVE TT,[POINT 7,HBUF1D] ;[51] NO, TRY AGAIN
|
||
MOVEM TT,HPOINT ;[51] SET UP FOR HEDDPB
|
||
|
||
MOVE T,[ASCII / crea/]
|
||
PUSHJ PP,HEDST7 ;PUT " CREA" INTO BUFFER
|
||
MOVE T,[ASCII /ted: /]
|
||
PUSHJ PP,HEDST7
|
||
LDB T,[POINT 11,INDIR1+2,23] ;GET CREATION TIME
|
||
IDIVI T,^D60 ;CHANGE TO HOURS AND MINUTES
|
||
PUSH PP,T+1 ;SAVE MINUTES
|
||
PUSHJ PP,HED10 ;PRINT HOURS
|
||
POP PP,T
|
||
PUSHJ PP,HED10 ;PRINT MINUTES
|
||
MOVEI C," "
|
||
PUSHJ PP,HEDDPB ;PUT A SPACE AFTER THE TIME
|
||
HEDDAT: LDB T,[POINT 12,INDIR1+2,35] ;GET LOW 12 BITS OF DATE
|
||
LDB T+1,[POINT 3,INDIR1+1,20] ;GET HIGH 3 BITS OF DATE
|
||
DPB T+1,[POINT 3,T,23] ;MERGE THE TWO PARTS
|
||
IDIVI T,^D31 ;STRIP OFF DAY OF MONTH
|
||
PUSH PP,T ;SAVE THE REST
|
||
MOVEI T,1(T+1)
|
||
PUSHJ PP,HED10 ;PRINT DAY
|
||
POP PP,T
|
||
IDIVI T,^D12
|
||
PUSH PP,T ;SAVE YEAR
|
||
MOVE T,MONTAB(T+1) ;GET MONTH TEXT
|
||
PUSHJ PP,HEDST7 ;[47] PRINT IT IN ASCII
|
||
POP PP,T
|
||
MOVEI T,^D64(T) ;[62] GET YEAR
|
||
PUSHJ PP,HED10 ;PRINT YEAR
|
||
PUSHJ PP,HEAD8 ;[51] DEPOSIT A NULL
|
||
; JRST PRETTY ;[51] CLEAN UP HEADER AND RETURN
|
||
PRETTY: SKIPN TEMP ;[51] ARE WE ON THE 2ND FILE?
|
||
POPJ PP, ;[51] NO, CLEAN UP HEADERS LATER
|
||
SKIPE HBUF1D ;[51] DOES EITHER FILE
|
||
SKIPN HBUF2D ;[51] LACK A CREATION DATE?
|
||
POPJ PP, ;[51] YES, NOTHING TO CLEAN UP
|
||
HLRZ TT,HBPT1 ;[51] FIND 1ST FILE'S LAST CHAR
|
||
HRLZI T,-5 ;[51] AOBJN COUNTER
|
||
PRET1: CAME TT,PRET4(T) ;[51] T'TH CHAR IN THE LAST WORD?
|
||
AOBJN T,PRET1 ;[51] NO, TRY AGAIN
|
||
HRRZ TT,HBPT1 ;[51] HOW MANY FULL WORDS?
|
||
SUBI TT,HBUF1 ;[51] GET THAT BY SUBTRACTION
|
||
IMULI TT,5 ;[51] GET NO. OF CHARS
|
||
ADDI TT,1(T) ;[51] IN THE 1ST FILESPEC
|
||
MOVEM TT,TEMP ;[51] SAVE IT
|
||
HLRZ TT,HBPT2 ;[51] NOW DO THE SAME
|
||
HRLZI T,-5 ;[51] CALCULATION FOR THE
|
||
PRET2: CAME TT,PRET4(T) ;[51] SECOND FILE
|
||
AOBJN T,PRET2 ;[51]
|
||
HRRZ TT,HBPT2 ;[51] ADDRESS OF LAST WORD
|
||
SUBI TT,HBUF2 ;[51] NO. OF FULL WORDS
|
||
IMULI TT,5 ;[51] CHARS IN THOSE WORDS
|
||
ADDI TT,1(T) ;[51] PLUS SOME LEFT OVER
|
||
CAMN TT,TEMP ;[51] ARE THE COUNTS THE SAME?
|
||
POPJ PP, ;[51] YES, WE ARE DONE!
|
||
MOVE T,HBPT1 ;[51] NO, ASSUME THE 1ST IS LESS
|
||
CAMG TT,TEMP ;[51] IS THE 2ND LESS?
|
||
MOVE T,HBPT2 ;[51] YES, POINT TO ITS STRING
|
||
SUB TT,TEMP ;[51] GET THE DIFFERENCE IN LENGTH
|
||
MOVMS TT ;[51] MAKE SURE IT'S POSITIVE
|
||
MOVEI C," " ;[51] PAD THE STRING WITH SPACES
|
||
PRET3: IDPB C,T ;[51] ADD A SPACE
|
||
SOJG TT,PRET3 ;[51] LOOP AROUND
|
||
SETZ C, ;[51] GET A NULL
|
||
IDPB C,T ;[51] END THE STRING WITH IT
|
||
POPJ PP, ;[51] WE ARE DONE
|
||
|
||
PRET4: 350700 ;[51] LEFT HALVES OF ASCII BYTE POINTERS
|
||
260700 ;[51]
|
||
170700 ;[51]
|
||
100700 ;[51]
|
||
010700 ;[51]
|
||
HEAD8: MOVEI C,.CHNUL ;[100] PUT NULL INTO BUFFER
|
||
HEDDPB: IDPB C,HPOINT
|
||
POPJ PP,
|
||
|
||
HEDST7: SKIPA TT,[POINT 7,T] ;PRINT 7 BIT ASCII
|
||
HEDST6: MOVE TT,[POINT 6,T] ;PRINT SIXBIT
|
||
HEDS2: TLNN TT,760000
|
||
POPJ PP, ;DONE
|
||
ILDB C,TT
|
||
JUMPE C,HEDS2
|
||
TLNN TT,000100
|
||
ADDI C," "-' ' ;[100] FOR SIXBIT, CONVERT TO ASCII
|
||
PUSHJ PP,HEDDPB ;OUTPUT CHARACTER
|
||
JRST HEDS2
|
||
|
||
HED8: TDZA W3,W3 ;PRINT OCTAL NUMBERS
|
||
HED10: MOVEI W3,2 ;PRINT DECIMAL NUMBERS
|
||
MOVE W2,W3 ;FORCE 2 DIGITS FOR DECIMAL NUMBERS
|
||
HED10A: IDIVI T,8(W3)
|
||
HRLM T+1,(PP)
|
||
SOSG W2 ;FORCE DIGITS UNTIL COUNT EXPIRES
|
||
SKIPE T
|
||
PUSHJ PP,HED10A
|
||
HLRZ C,(PP)
|
||
ADDI C,"0"
|
||
JRST HEDDPB
|
||
|
||
MONTAB: ASCII /-Jan-/
|
||
ASCII /-Feb-/
|
||
ASCII /-Mar-/
|
||
ASCII /-Apr-/
|
||
ASCII /-May-/
|
||
ASCII /-Jun-/
|
||
ASCII /-Jul-/
|
||
ASCII /-Aug-/
|
||
ASCII /-Sep-/
|
||
ASCII /-Oct-/
|
||
ASCII /-Nov-/
|
||
ASCII /-Dec-/
|
||
|
||
PRTPTH: HLRZ T,PTHBLK+.PTPPN ;GET PATH PPN
|
||
PUSHJ PP,HED8 ;INSERT INTO HEADER
|
||
MOVEI C,"," ;SEPARATE PROJ,PROG
|
||
PUSHJ PP,HEDDPB ;
|
||
HRRZ T,PTHBLK+.PTPPN ;GET PROG NUMBER
|
||
PUSHJ PP,HED8 ;STORE INTO HEADER
|
||
SETZ W1, ;START AT BASE OF SFDS
|
||
PRTPLP: MOVEI C,"," ;SEPARATE PPN,SFDS BY COMMA
|
||
PUSHJ PP,HEDDPB ;
|
||
MOVE T,PTHBLK+.PTPPN+1(W1) ;GET AN SFD NAME
|
||
PUSHJ PP,HEDST6 ;STORE INTO HEADER
|
||
SKIPN PTHBLK+.PTPPN+2(W1) ;NEXT SFD THERE?
|
||
JRST HEAD3 ;NO,FINISH UP
|
||
AOJA W1,PRTPLP ;ELSE LOOP FOR NEXT SFD
|
||
;HERE FOR BINARY COMPARE
|
||
|
||
BINCOM: TLNE FR,EOF2SW ;NO HEADER IF ONLY ONE FILE
|
||
TLZ FR,PAGSW ;FAKE AS NOT NEW PAGE
|
||
;SORT OUT CONFLICTING SWITCHES AND EXTENSIONS
|
||
TLNE FR,WSWBIT ;EXPLICIT /W?
|
||
TLZ FR,XSWBIT!XDFBIT!EXEBIT ;[56] YES, THEN DON'T EXPAND
|
||
TLNE FR,XSWBIT ;EXPLICIT /X?
|
||
TLZ FR,HSGBIT!WDFBIT ;YES
|
||
TLC FR,XDFBIT!HSGBIT ;MUTUALLY EXCLUSIVE BITS
|
||
TLCN FR,XDFBIT!HSGBIT ;THERFORE THEY BETTER NOT BE BOTH ON
|
||
TLZ FR,XDFBIT!HSGBIT ;THEY WERE , YOU LOSE
|
||
TLNE FR,HSGBIT!WDFBIT ;WAS ONE FILE NOT IN SAV FORMAT?
|
||
TLZ FR,XDFBIT ;THEN IGNORE OTHER EXT
|
||
TLNE FR,XDFBIT!WDFBIT ;WAS ONE FILE NOT A HIGH SEGMENT
|
||
TLZ FR,HSGBIT ;YES, THEN IGNORE ONE THAT WAS
|
||
;END OF THIS MESS
|
||
TLNN FR,HSGBIT ;TEST FOR EXT OF SHR, OR HGH
|
||
TDZA CNT,CNT ;NO, START AT 0
|
||
MOVEI CNT,400000 ;YES, START AT HIGH SEG ADDRESS
|
||
TLNN FR,XSWBIT!XDFBIT;NEED TO EXPAND?
|
||
JRST COMP1 ;NO
|
||
JRST SAV1 ;YES
|
||
|
||
|
||
|
||
READ1A: TRZ FR,-1 ;INDEX BY 0 FOR FILE 1
|
||
JSP C,GCHAR1
|
||
READ1: SOSGE INBUF1+2
|
||
JRST READ1A ;BUFFER EMPTY
|
||
ILDB W1,INBUF1+1
|
||
AOS (PP)
|
||
POPJ PP,
|
||
|
||
READ2A: HRRI FR,1 ;INDEX BY 1 FOR FILE 2
|
||
TLNE FR,EOF2SW ;PREMATURE EOF
|
||
JRST ZPOPJ ;YES, AVOID I/O ERROR
|
||
JSP C,GCHAR2
|
||
READ2: SOSGE INBUF2+2
|
||
JRST READ2A ;BUFFER EMPTY
|
||
ILDB W2,INBUF2+1
|
||
AOSA (PP)
|
||
ZPOPJ: SETZ W2, ;RETURN NUL CHARS.
|
||
POPJ PP,
|
||
COMP1: TLNE FR,EXEBIT ;EXE FILE? [25]
|
||
JRST EXSTUF ;YES. GO ELSEWHERE [25]
|
||
PUSHJ PP,READ1 ;GET WORD FROM FIRST FILE
|
||
JRST COMP10 ;HERE IF A READ FAILURE
|
||
PUSHJ PP,READ2 ;NOW GET WORD FROM SECOND FILE
|
||
JRST COMP12 ;HERE IF READ FAILURE
|
||
CAME W1,W2 ;THIS IS THE BIG TEST
|
||
PUSHJ PP,COMP2 ;IT FAILED--THERE IS A DIFFERENCE
|
||
AOS CNT ;[57] NO DIFFERENCE, BUMP COUNT
|
||
CAMLE CNT,UPPER ;[57] HAVE WE FINISHED?
|
||
JRST FIN2 ;[57] YES, EXIT QUICKLY
|
||
JRST COMP1 ;[57] NO, TRY AGAIN
|
||
|
||
COMP2: CAMGE CNT,LOWER ;[22] IS LINE NUMBER IN BOUNDS?
|
||
POPJ PP, ;NO,TRY NEXT ONE
|
||
CAMLE CNT,UPPER ;[22] HAVE WE FINISHED?
|
||
JRST FIN2 ;YES,SO EXIT QUICKLY
|
||
SETZ DIG ;[63] INITIALIZE
|
||
HLLZ T,CNT ;[63] MOVE LH OF CNT TO T
|
||
JUMPN T,COMP14 ;[63] JUMP IF RH IS NON-ZERO
|
||
HRLZ T,CNT ;GET LINE NUMBER FOR PRINT OUT
|
||
COMP2A: PUSHJ PP,TYCELL ;[63] GO PRINT IT
|
||
AOS ERRCNT ;BUMP ERROR COUNT
|
||
MOVE T,1 ;NO GET WORD FROM FIRST FILE
|
||
PUSHJ PP,TYPB ;PRINT IT WITH SPACES BETWEEN HALF WORDS
|
||
MOVE T,2 ;NOW WORD FROM SECOND FILE
|
||
TLNE FR,EXEBIT ;[27] IS THIS AN EXE FILE?
|
||
TLNN FR,EOF2SW ;[27] YES, IS THERE A 2ND FILE?
|
||
SKIPA ;NO TO EITHER
|
||
JRST TCRLF ;[27] YES JUST PRINT CRLF
|
||
PUSHJ PP,TYPB ;AND PRINT IT
|
||
MOVE T,1 ;NOW "OR" THE WORDS
|
||
XOR T,2
|
||
TLNN T,-1 ;IF ONLY ADDRESS FIELD IS DIFFERENT
|
||
JRST COMP3 ;HANDLE IT DIFFERENTLY
|
||
PUSHJ PP,TYPB ;NOW PRINT OUT THE "OR"ED WORD
|
||
JRST TCRLF ;OUTPUT A CARRIAGE RETURN-LINE FEED
|
||
COMP3: MOVE T,W1
|
||
SUB T,W2 ;SUBTRACT ADDRESSES
|
||
JUMPGE T,.+2
|
||
MOVNS T
|
||
MOVSS T ;PUT IN LEFT HALF
|
||
PUSHJ PP,TYPTAB ;TYPE A TAB
|
||
MOVEI W1,7 ;NEED 7 SPACES FOR ALLIGNMENT
|
||
PUSHJ PP,TYPSP ;TYPE A SPACE
|
||
SOJG W1,.-1 ;LOOP
|
||
PUSHJ PP,TYCELL ;AND ADDRESS
|
||
JRST TCRLF ;AND CONTINUE
|
||
|
||
COMP10: CAMG CNT,UPPER ;[22] OUT OF BOUNDS?
|
||
PUSHJ PP,RDFIL2 ;READ WORD FROM FILE 2 (REG OR EXE)
|
||
JRST FIN2
|
||
CAMGE CNT,LOWER ;[22]
|
||
AOJA CNT,COMP10 ;GET NEXT WORD
|
||
PUSHJ PP,TYCNT ;TYPE LINE COUNT
|
||
PUSHJ PP,TYPTB2 ;TWO TABS
|
||
MOVE T,W2
|
||
PUSHJ PP,TYPB
|
||
PUSHJ PP,TCRLF
|
||
AOJA CNT,COMP10
|
||
|
||
COMP12: CAMGE CNT,LOWER ;[22]
|
||
JRST COMP13
|
||
PUSHJ PP,TYCNT
|
||
MOVE T,W1
|
||
PUSHJ PP,TYPB
|
||
PUSHJ PP,TCRLF
|
||
CAMGE CNT,UPPER ;[22]
|
||
COMP13: PUSHJ PP,RDFIL1
|
||
JRST FIN2
|
||
AOJA CNT,COMP12
|
||
|
||
|
||
;COME HERE ONLY IF WE HAVE ADDRESS GREATER THAN 777777
|
||
;VERY FIRST TIME WHEN WE SEE FULL WORD ADDRESS WE ALSO JUMP TO NEW
|
||
;PAGE FOR READABILITY
|
||
;
|
||
COMP14: SKIPN FWA1ST ;[63] FULLWORD ADDRESS SEEN FIRST TIME?
|
||
TLO FR,PAGSW ;[63] THIS MEANS WE GET A NEW HEADING
|
||
SETOM FWA1ST ;[63] SET IT ONE FOR NEXT CHECK
|
||
MOVEI T,14 ;[63] NUMBER OF DIGITS FOR THE FULL WORD
|
||
MOVEM T,DIG ;[63] SAVE IT FOR LATER USE
|
||
MOVE T,CNT ;[63] GET FULL WORD LINE NUMBER
|
||
JRST COMP2A ;[63] JUMP BACK TO TYPE
|
||
|
||
|
||
;COME HERE IF WE ARE COMPARING TWO EXE FILES. THIS OPERATION
|
||
; IS SOMEWHAT SIMILAR TO COMPARING TWO BINARY
|
||
; FILES EXCEPT THAT WE MUST ALSO CYLE THRU THE FILE DIRECTORY
|
||
; AS WE GO.
|
||
;
|
||
;FIRST, WE MUST READ IN THE DIRECTORY AND STORE IT SOMEPLACE.
|
||
EXSTUF: TRZ FR,-1 ;SET FILE 1
|
||
EXSTF2: PUSHJ PP,EXERED ;READ THE FIRST WORD OF EXE FILE
|
||
SETZM DIRCTR ;CLEAR COUNTER OF DIRECTORY LENGTH
|
||
HLRZ T,W1 ;GET LEFT HALF OF IT
|
||
CAIE T,.SVDIR ;[100] IS THIS A PROPER EXE FILE?
|
||
JRST EXERR0 ;NO, GO PRINT APPROPRIATE ERROR MSG
|
||
TLZ W1,-1 ;CLEAR HEADER CODE AND LEAVE LENGTH
|
||
ADDM W1,DIRCTR ;BUMP COUNTER
|
||
SOS W1 ;=LENGTH OF DATA IN DIRECTORY
|
||
MOVEM W1,@[EXP DLNG1,DLNG2](FR) ;STORE LENGTH
|
||
HRRZ TT,.JBFF## ;GET TOP OF FREE SPACE
|
||
MOVEM TT,@[EXP DPTR1,DPTR2](FR) ;SET DIRECTORY POINTER
|
||
ADDB W1,.JBFF## ;=TOP OF NEW LOW SEGMENT
|
||
CAMG W1,.JBREL## ;IS THERE ENOUGH ROOM ALREADY?
|
||
JRST .+3 ;YES
|
||
CORE W1, ;NO, GET MORE CORE TO HOLD DIRECTORY
|
||
JRST CORERR ;NOT ENOUGH CORE, FATAL ERROR
|
||
HRRZ T,.JBFF## ;GET START OF FREE SPACE
|
||
SUB T,@[EXP DLNG1,DLNG2](FR)
|
||
HRRZ TT,@[EXP DLNG1,DLNG2](FR) ;GET LENGTH OF DIR
|
||
PUSHJ PP,EXERED ;READ A WORD FROM DIRECTORY
|
||
MOVEM W1,(T) ;STORE WORD IN FREE CORE
|
||
AOS T ;BUMP POINTER
|
||
SOJG TT,.-3 ;LOOP UNTIL MOVED ENTIRE DIRECTORY
|
||
GETBLK: PUSHJ PP,EXERED ;GET NEXT WORD IN FILE
|
||
HLRE T,W1 ;..AND ITS HEADER CODE
|
||
JUMPL T,EXERR0 ;MUST BE POSITIVE
|
||
CAIN T,.SVEND ;[100] END BLOCK?
|
||
JRST GOTEND ;YES
|
||
TLZ W1,-1 ;ISOLATE LENGTH
|
||
ADDM W1,DIRCTR ;BUMP TOTAL LENGTH
|
||
SOJE W1,GETBLK ;[56] WE HAVE READ ONE WORD ALREADY
|
||
MOVE T,W1 ;[56] PUT COUNT IN AC THAT IS SAFE
|
||
PUSHJ PP,EXERED ;SKIP OVER IT
|
||
SOJG T,.-1 ;[56]
|
||
JRST GETBLK ;GET NEXT BLOCK
|
||
GOTEND: TLZ W1,-1 ;JUST IN CASE END-BLOCK INCREASES
|
||
; IN THE FUTURE, ADD ITS LENGTH IN
|
||
ADDM W1,DIRCTR
|
||
HRRZ T,DIRCTR ;GET AMOUNT TO SKIP OVER
|
||
IDIVI T,^D512 ;=# OF PAGES IN DIRECTORY
|
||
MOVEI T,^D512 ;TT NOW HOLDS REMAINDER, WHICH IS
|
||
; THE OFFSET INTO THE LAST PAGE
|
||
; OF THE DIRECTORY
|
||
SUB T,TT ;=FREE SPACE ON LAST PAGE OF DIRECTORY
|
||
PUSHJ PP,@[EXP READ1,READ2](FR) ;PASS OVER DIRECTORY
|
||
JRST EXERR0 ;
|
||
SOJG T,.-2 ;LOOP UNTIL 1ST DATA PAGE IS IN
|
||
tlne fr,eof2sw ;2nd file ? [27]
|
||
jrst got2 ;no [27]
|
||
TRNN FR,-1 ;ARE WE READING IN FILE 1?
|
||
AOJA FR,EXSTF2 ;YES, BUMP TO FILE 2 AND READ IT IN
|
||
|
||
;FALL THRU TO NEXT PAGE WHEN BOTH DIRECTORIES ARE READ IN
|
||
;WE MUST NOW SET UP THE CORRECT POINTERS AND COUNTERS FOR EACH
|
||
; DIRECTORY.
|
||
GOT2: TRZ FR,-1 ;SET FILE 1
|
||
PUSHJ PP,MKNTRY ;SET UP AN IOWD FOR 1ST DIRECTORY ENTRY
|
||
MOVE S1,T ;RETURN WITH IOWD IN T
|
||
TLNE FR,EOF2SW ;[27] 2ND FILE?
|
||
JRST [HRLOI S2,377777 ;[60] NO, SET S2 HIGH
|
||
JRST EXLOOP] ;[60] DO COMPARISON
|
||
AOS FR ;SET FILE 2
|
||
PUSHJ PP,MKNTRY ;SET UP IOWD FOR 1ST ENTRY HERE ALSO
|
||
MOVE S2,T ;SAVE IT IN S2
|
||
|
||
;HERE IS THE MAIN COMPARISON LOOP:
|
||
|
||
EXLOOP: PUSHJ PP,SETCNT ;[60] MOVE UP CNT IF POSSIBLE
|
||
PUSHJ PP,EXRED1 ;READ A WORD FROM FILE1
|
||
JRST [HRLOI S1,377777 ;[54] MAKE S1 TO BE VERY HIGH NUMBER SO
|
||
JRST COMP10] ; SO S2 WILL CONTINUE TO PRINT
|
||
PUSHJ PP,EXRED2 ;READ WORD FROM FILE2
|
||
JRST [HRLOI S2,377777 ;[54] SAME FOR S2
|
||
JRST COMP12]
|
||
CAIG CNT,132 ;[113]
|
||
CAIN CNT,41 ;[113]
|
||
JRST EXLOO1 ;[113] COMPARE LOCS 41 AND GREATER THAN 132
|
||
CAIN CNT,44 ;[113]
|
||
JRST EXLOO1 ;[113] COMPARE LOC 44
|
||
CAIGE CNT,74 ;[113]
|
||
AOJA CNT,EXLOOP ;[113] DON'T COMPARE LOCS 0-40 AND 42-73 SANS 44
|
||
CAIG CNT,76 ;[113]
|
||
JRST EXLOO1 ;[113] COMPARE LOCS 74-76
|
||
CAIE CNT,132 ;[113]
|
||
CAIG CNT,111 ;[113]
|
||
AOJA CNT,EXLOOP ;[113] DON'T COMPARE LOCS 77-111, 132
|
||
CAIE CNT,113 ;[113]
|
||
CAIN CNT,114 ;[113]
|
||
AOJA CNT,EXLOOP ;[113] DON'T COMPARE LOCS 113 AND 114
|
||
;[113] HERE TO COMPARE LOCS 112, 115-131
|
||
EXLOO1: TLNN FR,EOF2SW ;DON'T COMPARE IF ONLY 1 FILE [27]
|
||
CAME W1,W2 ;HERE IT IS!!!!!!!
|
||
PUSHJ PP,COMP2 ;NO MATCH, PRINT LINE
|
||
AOS CNT ;[57] BUMP ADDRESS
|
||
CAMLE CNT,UPPER ;[57] HAVE WE FINISHED?
|
||
JRST FIN2 ;[57] YES, EXIT QUICKLY
|
||
JRST EXLOOP ;[57] NO, TRY AGAIN
|
||
;Subroutine to form pointers from the current directory entry
|
||
;
|
||
;Call:
|
||
; PUSHJ PP,MKNTRY
|
||
; Return here always
|
||
;
|
||
;On return, T will contain the address for the next word in
|
||
;the file. EX1CNT or EX2CNT, as appropriate, will contain the
|
||
;negative of the number of words covered by this directory
|
||
;entry.
|
||
;
|
||
MKNTRY: MOVE TT,@[EXP DPTR1,DPTR2](FR) ;GET DIRECTORY POINTER
|
||
LDB T,[POINT 9,1(TT),8] ;GET REPEAT COUNT OF THIS ENTRY
|
||
AOS T ;=# OF PAGES IN THIS ENTRY
|
||
IMUL T,[-^D512] ;[43] =# OF WORDS IN THIS ENTRY
|
||
MOVEM T,@[EXP EX1CNT,EX2CNT](FR) ;[43] Store away
|
||
HRRZ T,1(TT) ;[43] GET PROCESS PAGE #
|
||
LSH T,9 ;[43] MAKE INTO AN ADDRESS
|
||
MOVEI TT,40 ;ASSUME THIS IS THE LOW SEG
|
||
TRNN T,-1 ;IF THIS IS USER VIRTUAL PAGE 0
|
||
PUSHJ PP,SKPEXE ;SKIP UP TO LOC 41
|
||
POPJ PP, ;RETURN WITH ANSWER IN T
|
||
;SUBROUTINE TO READ ONE WORD FROM AN EXE FILE
|
||
;CALL:
|
||
; PUSHJ PP,EXRED1
|
||
; HERE IF EOF
|
||
; HERE WITH WORD IN W1
|
||
;
|
||
EXRED1: SETZ W1, ;CLEAR WORD WHERE IT IS TO GO
|
||
CAMGE CNT,S1 ;[54] DO THE FILE COUNTS MATCH UP?
|
||
JRST CPOPJ1 ;NO, THIS FILE IS AHEAD OF THE
|
||
; OTHER ONE, SO EXIT AS IF THE NEXT
|
||
; WORD WERE A ZERO
|
||
AOSG EX1CNT ;[43],[60] Bump word count
|
||
JRST EXRD1A ;[43] Go get it
|
||
MOVEI T,2 ;IF WE DIDN'T JUMP, THEN WE HAVE
|
||
; EXHAUSTED THE CURRENT DIRECTORY ENTRY
|
||
; AND WE MUST GET ANOUTHER ONE
|
||
ADDM T,DPTR1 ;BUMP DIRECTORY POINTER BY 2
|
||
TRZ FR,-1 ;SET FILE 1
|
||
SOS DLNG1 ;DECREMENT LENGTH
|
||
SOSG DLNG1 ;..IS THERE MORE IN THE DIRECTORY?
|
||
POPJ PP, ;NO, EXIT WITH ZERO
|
||
PUSHJ PP,MKNTRY ;MAKE A NEW IOWD FROM THIS DIRECT ENTRY
|
||
MOVE S1,T ;RESET S1
|
||
TLNE FR,EOF2SW ;[60] IS THERE A SECOND FILE?
|
||
PUSHJ PP,SETCNT ;[60] NO, SAFE TO RESET COUNT
|
||
CAME CNT,S1 ;[60] HAVE WE JUMPED AHEAD OF FILE 2?
|
||
JRST CPOPJ1 ;[60] YES, RETURN A ZERO
|
||
AOS EX1CNT ;[67] COUNT THE WORD WE ARE ABOUT TO READ
|
||
EXRD1A: AOJ S1, ;[60] BUMP ADDRESS
|
||
HRRZ T,@DPTR1 ;GET CURRENT FILE PAGE #
|
||
JUMPE T,CPOPJ1 ;IF ALLOCATED-BUT-ZERO, PRETEND THIS
|
||
; IS A ZERO WORD
|
||
JRST READ1 ;GO READ A WORD FROM FILE
|
||
;SUBROUTINE TO READ A WORD FROM EXE FILE #2
|
||
;
|
||
;CALLING CONVENTIONS SAME AS EXRED1
|
||
;
|
||
EXRED2: SETZ W2, ;CLEAR WORD
|
||
CAMGE CNT,S2 ;[54] DO ADDRESSES MATCH?
|
||
JRST CPOPJ1 ;NO, EXIT WITH 0
|
||
AOSG EX2CNT ;[43],[60] Bump word count
|
||
JRST EXRD2A ;[43] Go get it
|
||
MOVEI T,2 ;DIRECTORY ENTRY IS THRU...
|
||
ADDM T,DPTR2 ;...MAKE A NEW ONE
|
||
HRRI FR,1 ;SET FILE 2
|
||
SOS DLNG2 ;DECREMENT LENGTH
|
||
SOSG DLNG2 ;MORE DIRECTORY ENTRIES?
|
||
POPJ PP, ;NO
|
||
PUSHJ PP,MKNTRY ;MAKE A NEW IOWD
|
||
MOVE S2,T ;SAVE IT IN S2
|
||
TLNE FR,EOF1SW ;[60] IS THERE A FIRST FILE?
|
||
PUSHJ PP,SETCNT ;[60] NO, SAFE TO RESET COUNT
|
||
CAME CNT,S2 ;[54],[60] DID WE JUST LEAP AHEAD OF FILE 1?
|
||
JRST CPOPJ1 ;YES,DEFER READ UNTIL FILE 1 CATCHES UP
|
||
AOS EX2CNT ;[67] COUNT THE WORD WE ARE ABOUT TO READ
|
||
EXRD2A: AOJ S2, ;[60] BUMP ADDRESS
|
||
HRRZ T,@DPTR2 ;GET FILE PAGE #
|
||
JUMPE T,CPOPJ1 ;IF ABZ, XIT WITH ZERO
|
||
JRST READ2 ;GET A WORD FROM FILE 2
|
||
|
||
|
||
;SUBROUTINE TO READ A WORD FROM EITHER A REGULAR BINARY FILE
|
||
; OR AN EXE FILE. THIS ROUTINE IS CALLED ONLY ON EOF FROM
|
||
; ONE OF THE FILES.
|
||
;
|
||
RDFIL1: TLNN FR,EXEBIT ;IS THIS AN EXE FILE?
|
||
JRST READ1 ;NO, REGULAR READ
|
||
JRST EXRED1 ;YES, EXE READ
|
||
|
||
RDFIL2: TLNN FR,EXEBIT ;EXE FILE?
|
||
JRST READ2 ;NO
|
||
JRST EXRED2 ;YES
|
||
;SUBROUTINE TO READ ONE WORD FROM EITHER
|
||
; EXE FILE
|
||
;
|
||
;CALL:
|
||
; PUSHJ PP,EXERED
|
||
; RETURN HERE IF EOF (ERROR IF SO)
|
||
; HERE WITH WORD IN W1
|
||
EXERED: SETZB W1,W2 ;CLEAR BOTH
|
||
PUSHJ PP,@[EXP READ1,READ2](FR) ;READ A WORD
|
||
JRST EXERR0 ;BAD FORMAT (PREMATURE EOF)
|
||
SKIPN W1 ;DID IT COME FROM FILE 1?
|
||
MOVE W1,W2 ;NO, MOVE WORD TO W1
|
||
POPJ PP, ;RETURN
|
||
|
||
|
||
;SUBROUTINE TO SKIP OVER PART OF AN EXE FILE
|
||
;
|
||
;CALL:
|
||
; MOVE T,CURRENT-IOWD-POINTER
|
||
; MOVEI TT,# OF LOCS TO SKIP
|
||
; PUSHJ PP,SKPEXE
|
||
; RETURN HERE ALWAYS
|
||
;
|
||
SKPEXE: PUSHJ PP,@[EXP READ1,READ2](FR)
|
||
JRST EXERR0 ;ERROR
|
||
AOSLE @[EXP EX1CNT,EX2CNT](FR) ;[43]
|
||
JRST EXERR0 ;[43] Should not occur
|
||
AOJ T, ;[43]
|
||
SOJG TT,SKPEXE ;[43] LOOP
|
||
POPJ PP, ;RETURN
|
||
|
||
|
||
;ROUTINE TO SET CNT TO LOWER OF S1,S2
|
||
;
|
||
SETCNT: MOVE CNT,S1 ;[54] ASSUME IT'S S1
|
||
CAMLE CNT,S2 ;[54] IS IT?
|
||
MOVE CNT,S2 ;[54] NO
|
||
POPJ PP,
|
||
;THIS CODE EXPANDS SAV FILES BEFORE COMPARING THEM
|
||
|
||
READ1X: PUSHJ PP,READ1 ;GET A WORD
|
||
JRST SAV9 ;[32] EOF SEEN
|
||
MOVE S1,W1 ;STORE AOBJN WORD
|
||
JUMPGE W1,SAVER1 ;NOT SAV FORMAT
|
||
MOVEI CNT,1(S1) ;JUST INCASE NO 2ND FILE
|
||
POPJ PP,
|
||
|
||
READ2X: PUSHJ PP,READ2 ;SAME FOR SECOND WORD
|
||
JRST SAV19 ;[32]
|
||
MOVE S2,W2
|
||
JUMPGE W2,SAVER2
|
||
POPJ PP,
|
||
|
||
SAV1: SETZB S1,S2
|
||
READX1: PUSHJ PP,READ1X
|
||
JUMPL S2,SAV2
|
||
READX2: PUSHJ PP,READ2X
|
||
SAV2: MOVEI CNT,1(S1) ;GET FIRST LOCATION
|
||
CAILE CNT,1(S2) ;IS IT SMALLER OF THE TWO?
|
||
MOVEI CNT,1(S2) ;NO,SO USE S2
|
||
|
||
SAV3: SETZB W1,W2
|
||
CAIE CNT,1(S1) ;DO WE WANT THIS WORD
|
||
JRST .+4 ;NO
|
||
AOBJN S1,.+1
|
||
PUSHJ PP,READ1
|
||
JRST SAV9 ;[32]
|
||
CAIE CNT,1(S2)
|
||
JRST .+4
|
||
AOBJN S2,.+1
|
||
PUSHJ PP,READ2
|
||
JRST SAV19 ;[32]
|
||
CAME W1,W2
|
||
PUSHJ PP,COMP2
|
||
JUMPGE S1,READX1 ;GET ANOTHER AOBJN WORD
|
||
JUMPGE S2,READX2
|
||
AOS CNT ;[57] BUMP ADDRESS
|
||
CAMLE CNT,UPPER ;[57] HAVE WE FINISHED?
|
||
JRST FIN2 ;[57] YES, EXIT QUICKLY
|
||
JRST SAV3 ;[57] NO, TRY AGAIN
|
||
|
||
|
||
SAVER1: HLRZS S1
|
||
XORI S1,(JRST)
|
||
TRNN S1,777000 ;TEST FOR TRANSFER WORD
|
||
JRST SAV9 ;[32]
|
||
JSP T,ERROUT
|
||
ASCIZ /?File 1 not in SAV format/
|
||
|
||
SAVER2: HLRZS S2
|
||
XORI S2,(JRST)
|
||
TRNN S2,777000
|
||
JRST SAV19 ;[32]
|
||
JSP T,ERROUT
|
||
ASCIZ /?File 2 not in SAV format/
|
||
|
||
SAV14: HLRZ S1,W2
|
||
XORI S1,(JRST)
|
||
TRNN S1,777000
|
||
JRST FIN2
|
||
MOVE S2,W2
|
||
SAV9: MOVEI CNT,1(S2) ;[32]
|
||
SAV10: CAMG CNT,UPPER ;[22]
|
||
PUSHJ PP,READ2
|
||
JRST FIN2
|
||
JUMPGE S2,SAV14
|
||
CAMGE CNT,LOWER ;[22]
|
||
JRST SAV10A
|
||
PUSHJ PP,TYCNT
|
||
PUSHJ PP,TYPTB2
|
||
MOVE T,W2
|
||
PUSHJ PP,TYPB
|
||
PUSHJ PP,TCRLF
|
||
SAV10A: AOBJN S2,.+1
|
||
AOJA CNT,SAV10
|
||
|
||
SAV24: HLRZ S2,W1
|
||
XORI S2,(JRST)
|
||
TRNN S2,777000
|
||
JRST FIN2
|
||
MOVE S1,W1
|
||
SAV19: MOVEI CNT,1(S1) ;[32]
|
||
SAV20: CAMG CNT,UPPER ;[22]
|
||
PUSHJ PP,READ1
|
||
JRST FIN2
|
||
JUMPGE S1,SAV24
|
||
CAMGE CNT,LOWER ;[22]
|
||
JRST SAV20A
|
||
PUSHJ PP,TYCNT
|
||
MOVE T,W1
|
||
PUSHJ PP,TYPB
|
||
PUSHJ PP,TCRLF
|
||
SAV20A: AOBJN S1,.+1
|
||
AOJA CNT,SAV20
|
||
|
||
|
||
;ERROR MESSAGES FOR EXE FILE PROCESSING
|
||
;
|
||
;
|
||
;COME HERE IF EITHER FILE WAS NOT A EXE FILE
|
||
EXERR0: TRNE FR,-1 ;WAS IT FILE 1?
|
||
JRST EXERR2 ;NO
|
||
JSP T,ERROUT ;YES
|
||
ASCIZ /?File 1 not in correct EXE format/
|
||
|
||
;HERE IF FILE 2 IS BAD
|
||
EXERR2: JSP T,ERROUT
|
||
ASCIZ /?File 2 not in correct EXE format/
|
||
|
||
;HERE IF CAN'T READ DIRECTORY
|
||
CORERR: JSP T,ERROUT
|
||
ASCIZ /?Not enough core available to hold directory/
|
||
SYMPTR: POINT 7,LSTSYM+SYMBOL ;[76] [104] POINTER TO LAST SYMBOL
|
||
DOLPTR: POINT 7,LSTSYM+$SYMBL ;[76] [104] POINTER TO LAST LOCAL SYMBOL
|
||
|
||
RELOC ;IMPURE AREA
|
||
|
||
PPSET: BLOCK LPDL ;PUSH DOWN LIST STORAGE
|
||
|
||
CTIBUF: BLOCK 3
|
||
CTOBUF: BLOCK 3
|
||
INBUF1: BLOCK 3
|
||
INBUF2: BLOCK 3
|
||
ERRCNT: BLOCK 1 ;DIFFERENCES COUNTER (0 MEANS NO DIFFERENCES)
|
||
DIFFLG: BLOCK 1 ;"DIFFERENCE IN PROGRESS" FLAG (0 MEANS NO DIFF)
|
||
|
||
INDEV1: BLOCK 1
|
||
|
||
INDIR1: BLOCK 4+3+MAXSFD+1
|
||
INDPPN: BLOCK 1 ;HOLD PROJECT,PROGRAMMER #
|
||
|
||
PTHBLK: BLOCK MAXSFD+4 ;SFDS,OVERHEAD AND 0 DELIMITER WORD
|
||
|
||
OUTDEV: BLOCK 1 ;OUTPUT DEVICE
|
||
OUTEXT: BLOCK 1 ;FLAG FOR EXTENSION SEEN ON OUTPUT
|
||
OUTDIR: BLOCK 4+3+MAXSFD+1
|
||
|
||
FILCNT: BLOCK 1 ;COUNT OF CURRENT FILE
|
||
|
||
TOP: ;CONTAINS # LINES ACTUALLY STORED IN BUFFER FOR:
|
||
TOP1: BLOCK 1 ;FILE #1
|
||
TOP2: BLOCK 1 ;FILE #2
|
||
|
||
LBUFP:
|
||
LBUFP1: BLOCK 1 ;POINTER TO BEGINNING OF LINE STORAGE FOR FILE #1
|
||
LBUFP2: BLOCK 1 ;DITTO FILE #2
|
||
|
||
CRSEEN: BLOCK 2 ;[44] DECIDE WHAT TO DO WITH CR'S
|
||
OLDCHR: BLOCK 2 ;[44] HOLDS THE CHAR AFTER THE CR
|
||
|
||
P1: BLOCK 1 ;BYTE POINTERS USED BY "COMPL" SUBROUTINE
|
||
P2: BLOCK 1
|
||
|
||
HPOINT: BLOCK 1 ;HOLD BYTE POINTER FOR CREATING HEADERS
|
||
; *** KEEP THE NEXT 4 BLOCKS IN ORDER ***
|
||
HBUF1: BLOCK ^D14 ;[51] HOLDS HEADER FOR FIRST FILE
|
||
HBUF1D: BLOCK ^D6 ;[51] ITS CREATION DATE
|
||
HBUF2: BLOCK ^D14 ;[51] FOR SECOND FILE
|
||
HBUF2D: BLOCK ^D6 ;[51] ITS CREATION DATE
|
||
;-- END OF SPECIAL ORDER --
|
||
|
||
HBPT1: BLOCK 1 ;[51] POINTER TO END OF HBUF1
|
||
HBPT2: BLOCK 1 ;[51] POINTER TO END OF HBUF2
|
||
|
||
PAGNUM: BLOCK 2 ;PAGE NUMBERS FOR THE TWO FILES
|
||
; LH(# AT BEGIN OF LINE), RH(# AFTER LAST CHAR)
|
||
PAGEN: BLOCK 1 ;TEMPORARY FOR PAGE #'S IN PLINEN SUBROUTINE
|
||
OLDNUM: BLOCK 2 ;LAST LINE # USED IN "SETONE"
|
||
OLDPNT: BLOCK 2 ;LAST BYTE POINTER CALCULATED BY "SETONE"
|
||
|
||
SAVEXS: BLOCK 17 ;STORAGE FOR AC'S WHEN PRINTING PAGE HEADERS
|
||
|
||
TEMP: BLOCK 1
|
||
LINCNT: BLOCK 1
|
||
RTNTMP: BLOCK 1 ;RETURN ADDRESS FOR "MULTI" SUBROUTINE
|
||
WCADR: BLOCK 1 ;TEMP IN GLINE SUBROUTINE
|
||
HIGH: BLOCK 1 ;USED BY NOROOM
|
||
ROOM: BLOCK 1 ;USED BY "NOROOM"
|
||
GETCNT: BLOCK 1 ;# LINES (-1) "GETTWO" GOT
|
||
GETFIL: BLOCK 1 ;# OF FILE FROM WHICH "GETTWO" GOT LINE (.L. 0 IF NONE)
|
||
NUMLIN: BLOCK 1 ;# LINES FOR A MATCH
|
||
NUMTMP: BLOCK 1 ;TEMP FOR NUMLIN
|
||
TEMPF1: BLOCK 1 ;TEMP FOR F1
|
||
TEMPF2: BLOCK 1 ;TEMP FOR F2
|
||
EXTFL1: BLOCK 1 ;DEFAULT FLAGS FROM EXT OF FILE 1
|
||
EXTFL2: BLOCK 1 ;DITTO FOR FILE 2
|
||
LSEEN: BLOCK 1 ;[21] -1 IF /0000L SEEN
|
||
USWFLG: BLOCK 1 ;[34] -1 if /U but not /L
|
||
TNMLIN: BLOCK 1 ;[34] Temporary NUMLIN
|
||
QSW: BLOCK 1 ;-1 IF /Q SEEN
|
||
FWA1ST: BLOCK 1 ;[63] 0 MEANS SAW FULL WORD ADDRESS 1ST TIME
|
||
DIG: BLOCK 1 ;[63] NUMBER OF DIGITS
|
||
XITFLG: BLOCK 1 ;[45] -1 IF WE EXIT AFTER COMMAND
|
||
;EXE FILE TEMPS
|
||
DIRCTR: BLOCK 1 ;TOTAL LENGTH OF ENTIRE DIRECTORY
|
||
DPTR1: BLOCK 1 ;POINTER TO DIRECTORY FOR FILE 1
|
||
DPTR2: BLOCK 1 ;SAME FOR FILE 2
|
||
DLNG1: BLOCK 1 ;COUNTER FOR DIRECTORY LENGTH OF FILE 1
|
||
DLNG2: BLOCK 1 ;SAME FOR FILE 2
|
||
EX1CNT: BLOCK 1 ;[43] Word count for file 1 directory entry
|
||
EX2CNT: BLOCK 1 ;[43] Same for file 2
|
||
;END OF EXE TEMPS
|
||
OFSSWT: BLOCK 1 ;[76] SET IF LABEL OFFSETS WANTED
|
||
OPTSWT: BLOCK 1 ;[105] /T (KEEP OUTPUT FILE) SPECIFIED
|
||
OPISWT: BLOCK 1 ;[117] /I (IGNORE CASE) SPECIFIED
|
||
|
||
LSTSYM: PHASE 0 ;[104] LAST SYMBOL SEEN IN INPUT BASE FILE
|
||
SYMBOL: BLOCK 2 ;[76] LAST SYMBOL SEEN IN FILE 1
|
||
$SYMBL: BLOCK 2 ;[76] LAST LOCAL SYMBOL SEEN IN FILE 1
|
||
SYMLIN: BLOCK 1 ;[76] NUMBER OF LINES SEEN SINCE LAST SYMBOL
|
||
SSBLTE==.-SYMBOL ;[76] LENGTH FOR BLT'S
|
||
DEPHASE
|
||
|
||
SAVSYM: BLOCK SSBLTE ;[104]
|
||
|
||
NOHDR: BLOCK 1 ;[76] -1 IF UNEQUAL LENGTH FILES, PRINTED *******
|
||
PSYMB: BLOCK 2 ;[76] COPY OF SYMBOL WHILE SEEING IF IT IS ONE
|
||
VAR ;JUST IN CASE
|
||
|
||
ENDP:
|
||
RELOC ;DUMP LITS IN HIGH SEGMENT
|
||
|
||
END FILCOM
|