1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-02-28 09:07:42 +00:00
Files
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

2810 lines
93 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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