Trailing-Edge
-
PDP-10 Archives
-
bb-d549g-sb
-
compar.mac
There are 10 other files named compar.mac in the archive. Click here to see a list.
TITLE COMPAR VERSION 3
SUBTTL COMPARES SOURCE FILES & MAKES CORRECTION FILE CWRU/CAM
;EDIT==6
;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
EXTERN GLTBL
EXTERN OLDNUM,OLDPNT,MRGOUT
ENTRY CBGET
EXTERNAL SAVE16,BASDDB
EXTERN CRPERR
EXTERN LBUFP1,SAVFFX,SAVAC2
HISEG
EXTERNAL .JBFF,.JBREL,.JBSYM,.JBDDT
EXTERN DIASW
ENTRY BIN,UIN
EXTERN OUTDEV,PPSET,ERRCNT,TOP,TOP1,TOP2,LBUFP
EXTERN LBUFP2,P1,P2,SAVEXS,TEMP,RTNTMP,WCADR,HIGH
EXTERN ROOM,GETCNT,GETFIL,NUMTMP,TEMPF1,TEMPF2
EXTERN LINEND,LSTCH,SAVEC,SAVNO2,LINCNT,SAVNO,LINEN0
EXTERN BUFF1,BUFF2,ENDP,NUMLIN
BACHAN=5
USCHAN=6
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
PP=17 ; PUSH DOWN POINTER
LPDL==20 ; LENGTH OF PUSH DOWN LIST
TAB==11
LF==12
FF==14
CR==15
VT==13 ; VERTICAL TAB
SSWBIT==100 ; /S SWITCH - IGNORE SPACING
CSWBIT==200 ; /C SWITCH - IGNORE COMMENTS
ALLSW==400 ; /B SWITCH (ALLOWS COMPARING BLANK LINES)
EOF1SW==1000 ; EOF SEEN ON FILE 1
EOF2SW==2000 ; EOF SEEN ON FILE 2
EOFTBL: EOF1SW
EOF2SW
NUMSW=10000 ; DO THEY WANT NUMBERED LINES?
MATCH==3
;SEE CAMIO FOR DESCRIPTIVE VERSION
DEFINE CHKLN (ROUT,HDR) <
PUSH PP,TT
MOVE TT,@HDR+1
TRZN TT,1
JRST ROUT'9
MOVEM TT,@HDR+1
PUSH PP,11
CAMN TT,[ASCII / /]
REPEAT 6,<
JSP 11,ROUT
>
POP PP,11
POP PP,TT
JRST ROUT
ROUT'9: POP PP,TT
>
COMPAR: MOVE PP,[IOWD 20,PPSET] ; SET UP COMPAR PDP
MOVE [XWD PPSET,PPSET+1] ; ZERO LOCAL STORAGE
SETZM PPSET ; HERE IS FIRST ZERO
MOVE .JBFF ; ALSO SAVE .JBFF
MOVEM SAVFFX
BLT ENDP-1 ; EVERYTHING GONE NOW
MOVEI BUFF1 ; RESTORE HIGHEST BUFFER ADDR
MOVEM LBUFP1 ; IN APPROPRIATE POINTERS
MOVEI BUFF2
MOVEM LBUFP2
MOVEI ENDP-1
MOVEM @GLTBL+1 ; AND IN PROPER TABLES
MOVEI FR,0 ; SPECIAL COMPAR FEATURES DON'T WORK
SETZM LSTCH ; TEMP SWITCH
HRLOI 377777 ; LARGEST POSSIBLE LINE NUMBER
MOVEM OLDNUM ; TO FORCE SETONE TO COMPUTE
MOVEM OLDNUM+1 ; LINE POINTERS AT OUTSET
SETZM LINEND ; SET END OF LINE FLAG TO FALSE
SETZM LINEN0
SOS LINEN0
SOS LINEN0 ; START LINEN0 OUT AT -2
SETOB F1,TOP1 ; INITIALIZE TOP OF EACH FILE
SETOB F2,TOP2 ; THE TOP IS THE HIGHEST LINE THAT WE HAVE EXAMINED
PUSHJ PP,GETTWO
JFCL ; ONE FILE HAS NO LINES
JRST MAINST ; START COMPARE 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 ORIGINAL LINE IN FILE 1 WHICH DID NOT MATCH
; MATCH THE NEW LINE FROM FILE TWO. IF SO THEN THE ORIGINAL 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
TRO 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
MAIN10:
PUSHJ PP,GETTWO
JRST MAIN15 ; ONE FILE SHORT
SETZ F1, ; RESET POINTER FOR FIRST FILE TO
; THE LINE IN WHICH THE DIFFERENCE WAS FOUND
MAIN12: PUSHJ PP,COMPL ; NOW SEE IF WE CAN MATCH THAT LINE
JSP W1,MULTI ; FOUND 1 LINE MATCH- LOOK FOR MULTIPLE
CAME F1,F2 ; HAVE WE LOOKED FROM THE MISMATCHED LINE
; TO THE CURRENT LINE?
AOJA F1,MAIN12 ; NO--UP LINE POINTER AND TRY AGAIN
SETZ F2, ; HAVEN'T FOUND A MATCH THIS TIME
; NOW TRY IT THE OTHER WAY
MAIN14: PUSHJ PP,COMPL
JSP W1,MULTI ; LOOK FOR MULTI LINE MATCH
CAME F2,F1
AOJA F2,MAIN14
JRST MAIN10 ; HAVEN'T BEEN ABLE TO MATCH ANYTHING
; YET GET TWO MORE LINES AND TRY 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
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: AOS CRPERR
JRST MAIN10
; AT THIS POINT NEITHER FILE HAS ANY MORE LINES TO BE READ.
; PRINT AS DIFFERENCES ANY LINES REMAINING FOR EITHER FILE.
FINISH: JUMPGE F1,FIN1 ; PRINT DIFFERENCES IF EITHER BUFFER
JUMPL F2,FIN2 ; HAS ANY LINES IN IT
FIN1: PUSHJ PP,SLIPO ; GO PREPARE LAST CORRETION FOR OUTPUT
FIN2: HRREI 13,-1 ; HERE GAME IS OVER. GIVE BACK
MOVE SAVFFX ; -1 AS EOF AND RESTORE .JBFF
MOVEM .JBFF
SETZM STATE. ; RESET CBGET STATE
MOVEI 5
MOVEM CRPERR ; RESET TO 5 CORR./REDUNDANCY CHECK
MOVEI ENDP-1
MOVEM @GLTBL+1 ; RESET ALL IMPORTANT TABLE
HRLZI 17,SAVAC2 ; GET USER'S REGS
BLT 17,16 ; AND PUT THEM BACK
MOVE 17,SAVAC2+17 ; GET REG 17
SETOM COMPOP ; SET OPTION TO DONE
HRREI 13,-1 ; EOSF
JRST CBRTN ; AND RETURN
MULTI: SKIPG NUMLIN
JRST MULT8
HRRZM W1,RTNTMP
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
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
CAMGE W1,NUMLIN ; TEST FOR END
JRST MULT2 ; TEST NEXT TWO
SUB F1,W1 ; RESET TO 1ST COMPARISON
SUB F2,W1
MULT8: PUSHJ PP,SLIPO ; OUTPUT A CORRECTION
ADD F1,NUMLIN ; CAUSE MOVEUP TO FLUSH ALL THE
ADD F2,NUMLIN ; LINES THAT WERE JUST MATCHED
JRST MAIN ; DIFFERENCES PRINTED- LOOK FOR MORE
; 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))
; 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 LINE #
MOVEM W3,OLDNUM(FR) ; SAVE # WE ARE COMPUTING
CAML W3,TT ; HOW DO THEY COMPAR
SKIPA T,OLDPNT(FR) ; GTR IS THERE A POINTER STORED?
SKIPA T,LBUFP1(FR) ; LESS, GET LOWEST BUFF ADDR
SUB W3,TT ; HOW FAR DO WE GO FROM WHERE WE ARE?
MOVSI TT,(ADD T,(T)) ; (SET UP IN AC)
MOVE TT+2,[JRST SETON2] ; SET UP AC
MOVE TT+1,.+1 ; SET UP AC
SOJGE W3,TT
; TT/ ADD T,(T) ;ADD IN WORD COUNT FOR LINE
; TT+1/ SOJGE W3,.-1 ;MORE LINES LEFT?
; TT+2/ JRST SETON2 ;NO
SETON2: HRRZM T,OLDPNT(FR) ; SAVE THIS POINTER
HRLI T,(POINT 7,0,35); NO, CHANGE TO BYTE POINTER
MOVEM T,W1(FR)
POPJ PP,
; MOVE UP THE POINTERS WHICH POINT TO THE LINES FROM WHICH WE
; ARE EXAMINING. THIS IS DONE EVERYTIME A MATCH IS FOUND
MOVEUP: 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 ; FORCE COMPUTATION OF
MOVEM 0,OLDNUM(FR) ; NEXT LINE POINTERS
POPJ PP,
; 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
CAMG W1,TOP(FR) ; HAVE WE GONE OVER THE TOP
JRST GLEXIT ; NO, LINE WAS AVAILABLE
SOS F1(FR) ; NOT CLEAR YET THAT A NEW LINE EXISTS
GLINE1: SETZM LINEND ; CLEAR END OF LINE FLAG
JSP TT,GCHAR ; GET A CHAR
TLNE FR,@EOFTBL(FR) ; END OF FILE?
POPJ PP, ; YES, NO LINE
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
CAIN C,"-" ; IS FIRS CHAR (SHUDDER) A -?
JRST FDGMIN ; OUCH! FUDGE PROPER EDIT COMMAND
JRST GLINE3 ; PHEW! CONTINUE UNFLUSTEREDLY
MLON; MULTI LINE LITERAL
GLINE2: JSP TT,GCHAR ; GET A CHAR
GLINE3: TLNN W1,760000 ; WILL NEXT IDPB GO INTO NEXT WORD?
JRST [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
JRST NOROOM ; NO ROOM IN THE INN
SETZM 1(W1)
JRST .+1] ; GO INTO MAIN LOOP
IDPB C,W1
SKIPL LINEND ; IF GCHAR SAYS END OF LINE,
JUMPN C,GLINE2 ; OR GIVES US A NULL
MOVEI C,0 ; BY GOLLY, WE GOT A LINE
TLNN W1,760000
JRST [HRRZ W3,@GLTBL(FR)
CAIG W3,3(W1)
JRST NOROOM
SETZM 1(W1)
JRST .+1]
IDPB C,W1 ; NOW MAKE THE LINE ASCIZ
SETZM LINEND ; RESET EOL FLAG
MOVE W3,WCADR ; GET BACK ADR OF WORD COUNT
SUBI W1,-1(W3) ; CALCULATE WORD COUNT
HRRM W1,(W3) ; SAVE WORD COUNT IN BUFFER
GLEXIT: AOS GETCNT ; INDEX # LINES FOUND
HRRZM FR,GETFIL ; SAVE # OF THIS FILE
POPJ PP,
FDGMIN: TLNN W1,760000
JRST [HRRZ W3,@GLTBL(FR)
CAIG W3,3(W1)
JRST NOROOM
SETZM 1(W1)
JRST .+1]
IDPB C,W1 ; - IS ALREADY IN C, BUT 2 ARE NEEDED!!
JRST GLINE3 ; NOW ADD THE ORIGINAL - AGAIN
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,4 ; LESS THAN 4 WORDS LEFT?
JRST NOR2 ; PLENTY ROOM AVAILABLE- DON'T GET MORE CORE
SETOM DIASW ; SET SW TO PREVENT DIALOGUE
MOVE SAVFFX ; NOPLACE TO GO NOW
MOVEM .JBFF ; SO RESTORE .JBFF
PUSHJ 16,IOERR ; PRINT ERROR MESSAGE
XWD [ASCIZ/?COMPAR BUFFER OVERFLOW/],BASDDB
HRLZI 17,SAVAC2 ; RESTORE USER'S REGS
BLT 17,16
MOVE 17,SAVAC2+17 ; GET REG 17
JSP 14,MRGOUT ; MAKE ERROR MSG APPEAR
[30] ; IN CORRECTION FILE
[ASCIZ/-"BUFFER OVERFLOW!!!!"
/]
MOVEI 13,0 ; GIVE BACK PROPER ERROR CODE
SETZM STATE. ; RESET STATE OF CBGET
JRST CBRTN ; AND TRUDGE HOME
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
NOR6: 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 377777
MOVEM OLDNUM+1 ; FORCE COMPUTATION O F LINE POINTERS
NOR98: POP PP,W1
NOR99: JRST GLINE3 ; CHECK COMPUTATIONS ON RETURNING
; 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
MOVEM W1,P1 ; P1=TEMP POINTER TO TEXT FOR FIRST FILE
MOVEM W2,P2 ; P2 FOR SECOND FILE
MOVEI W3,1
COMPL1: ILDB W1,P1 ; GET A CHARACTER FROM LINE FROM FIRST FILE
COMPL2: ILDB W2,P2 ; AND ONE FROM SECOND FILE
COMPL0: CAME W1,W2 ; THIS IS THE BIG TEST--ARE THEY EQUAL
JRST COMPL4 ; NO
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,TAB ; 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,TAB ; 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,
; ROUTINE TO GET A LEGIMATE CHARACTER
GCHAR: TLNE FR,@EOFTBL(FR) ; EOF SEEN?
JRST NULL ; YES, RETURN NULL
JSP 11,@[EXP BIN,UIN](FR); LOAD ONE FROM PROPER PLACE
CAIL C,37 ; COULD IT BE A FEED?
JRST (TT) ; NOPE
CAIN C,CR ; WAS IT A CR?
JRST (TT) ; YUP, AND THAT IS NOT A FEED
CAIN C,LF ; HOW BOUT AN LF
JRST LINDON ; YES, AND LINE IS NOW DONE
CAIN C,VT ; SAME STORY FOR VT
JRST LINDON
CAIN C,FF ; AND FORM FEED
JRST LINDON
JRST (TT) ; ANYTHING ELSE IS JUST RUBBISH
LINDON: AOS LINEN0(FR) ; NOW LINE IS DONE, INCREMENT COUNT
SETOM LINEND ; SET END OF LINE FLAG TO TRUE
JRST (TT) ; GO BACK
NULL: MOVEI C,0 ; HERE IS A NULL
SETOM LINEND ; ALSO END OF NON EXTANT LINE
JRST (TT) ; RETURN
NCON: SETZB C,C+2
DIVI C,12
ADDI C+1,60
ROTC C+1,-7
MOVE C+1,C
MOVEI C,0
JUMPN C+1,.-5
JRST 0(15)
; HERE IS THE ROUTINE THAT EXTRACTS INFORMATION FROM THE
; FORMER SRCCOM TYPE OUTPUT TO PRODUCE THE CORRECTION
; COMMANDS. THIS ROUTINE USES THE FOLLOWING BUFFERS
; AND WORRIES ABOUT THE FOLLOWING THINGS:
; BUFFER LIKELY CONTENTS
;
; NUMBUF ASCIZ/-<NUMBER><A COMMA IF:
; 1. A SECOND #
; FOLLOWS
; 2. THERE IS AN ID>
; <THEN THE 2ND NUMBER>/
; NUMBF2 ASCIZ/-<NUMBER>:/ FOR REDUNDANCY
; CHECK.
;
; ID. ID.-1 CONTAINS 5 TABS, AND ID. CONTAINS
; A TAB, THE THREE CHAR ID. SPECIFIED
; AND A NULL TO MAKE IT ASCIZ. SLIPO, BY
; BY KEEPING TRACK OF THE NUMBER OF CHARACTERS
; ON THE CORRECTION LINE, KNOWS WHETHER 5 OR
; SIX TABS ARE NEED TO SPACE OUT THE ID. OK.
; CHARACTERS OTHERWISE ARE TAKEN OUT OF THE COMPAR BUFFERS
; ACCORDING TO HOW MANY LINES OF DISCREPANCY EXIST, ETC.
SLIPO: MOVE C+4,[POINT 7,NUMBUF-1,35]
MOVEM PP,SAVEPP ; SAVE COMPAR'S PDP
HRRZI PP,SAVEXS ; AND ITS REGS
BLT PP,SAVEXS+16
MOVEI C,"-" ; SINCE THERE IS A CORRECTION A - IS NEEDED
MOVEI C+3,0 ; C+3 HOLDS CHARACTERS IN NUMBUF
SETZM NUMBUF
SETZM NUMBUF+1
SETZM NUMBUF+2 ; ENSURE ASCIZ
IDPB C,C+4 ; PUT IN THE -
AOJ C+3, ; AND ACCOUNT FOR IT
MOVE C+1,LINEN0 ; GET LINE # FOR COMPUTATION
JUMPLE F1,HM1 ; NO LINES IN BASE BUFF MEANS INSERTION
SUB C+1,TOP1 ; INSERTION DELETION TO BE FORMULATED
ADDI C+1,2 ; 1ST # IS ALWAYS LINE #-TOP1+2
JSP 15,NCON ; MAKE THE INTEGER ASCII
MOVE C+1,[POINT 7,C+1,35]
ILDB C,C+1 ; DRAG THE CHARS OUT OF REG C+2
JUMPE C,NXNO. ; SUPPRESS NULLS
AOJ C+3, ; ACCOUNT FOR EACH CHAR
IDPB C,C+4 ; AND PUT IN BUFFER
JRST .-4 ; UNTIL DONE
NXNO.: MOVEI C,"," ; INSERTION DELETION NEEDS A ,
IDPB C,C+4 ; SO PUT IT IN
AOJ C+3, ; AND ACCOUNT FOR IT
JUMPGE W1,NOTMT ; IF W1 IS GTR 0, BOTH FILES NOT AT EOF
MOVE C+1,LINEN0 ; IF THEY ARE AT EOF,
MOVEM C+1,SAVNO ; SAVE CURRENT LINEN O
ADDI C+1,2 ; THE SECOND # MUST BE LINE #+2
JRST CONV ; MAKE IT APPEAR IN THE BUFFER
NOTMT: MOVE C+1,LINEN0 ; GET THE NUMBER
; IF THE LINE # HAS NOT CHANGED SINCE THE LAST CORRECTION,
; NO NEW LINES HAVE BEEN READ IN. THIS IMPLIES THAT
; THE CONTENTS OF THE BUFFERS HAVE SEVERAL MATCHING LINES
; AND THE COMPARISON ALGORITHM IS CRUNCHING THROUGH AND
; FINDING THEM. WHEN THIS OCCURS, IT IS NECESSARY TO USE
; A DIFFERENT FORMULA TO COMPUTE LINENO'S (IT TOOK A LONG
; TIME TO DEDUCE THE DIFFERENT FORMULA) TO PRODUCE CORRECT
; CORRECTIONS.
CAMN C+1,SAVNO ; HAVE ANY NEW LINES BEEN INPUT?
JRST CO ; NO, GO USE OTHER FORMULA
MOVE TT,TOP2 ; YES
; IF THERE ARE ACTUALLY MORE LINES IN ONE BUFFER THAN IN
; THE OTHER, MORE FOOLING AROUND IS NECESSARY
CAML TT,TOP1 ; MORE LINES IN USER BUFF THAN IN BASE BUFF?
JRST CO ; YES, GO USE THE OTHER FORMULA
JRST OKOK ; OTHERWISE USE USUAL FORMULA
OKOK: MOVEM C+1,SAVNO ; SAVE THIS # IN CASE IT APPEARS ENCORE
SOJ C+1, ; PROPER FORMULA IS CURRENT #-1
JRST CONV ; MAKE IT APPEAR IN NUMBUF
CO: MOVEM C+1,SAVNO ; START OF OTHER FORMULA
SUB C+1,TOP1
ADD C+1,F1
AOJA C+1,CONV ; WHICH IS #-TOP1+F1+1 (I DON'T KNOW WHY EITHER)
LASNUM:
CONV: MOVEM C+1,SAVNO2
AOS SAVNO2 ; FOR RED. CHECK, USE COMPUTED #+1
JSP 15,NCON
MOVE C+1,[POINT 7,C+1,35]
ILDB C,C+1
JUMPE C,NUMFI
AOJ C+3,
IDPB C,C+4 ; PUT THE ASCII IN THE BUFFER
JRST .-4
NUMFI: SETZM LINCNT ; NOW DETERMINE HOW MANY TEXT LINES
MOVEI C,"," ; ASSUME THERE IS AN ID
SKIPE ID. ; ID. IS NON ZERO IF THERE IS ONE
IDPB C,C+4 ; PUT IN ANOTHER ,
CAIL C+3,8 ; ALREADY MORE THAN 8 CHARS ON LINE?
IBP PTRS.+1 ; YES, SO ALLOW ONLY 5 TABS
HRRZ C,LBUFP2
JUMPG W1,.+2 ; SKIPE IF EOF NOT TRUE
AOS LINCNT
ADDM F2,LINCNT ; NUMBER OF TEXT LINES IS F2
HRLI C,(POINT 7,0,35)
MOVEM C,PTRS.+3 ; MAKE POINTER POINT TO FIRST LINE
MOVE C+4,[POINT 7,NUMBF2-1,35]
SETZM NUMBF2
SETZM NUMBF2+1
MOVEI C,"-" ; NOW INSERT REDUNDANCY INFO
IDPB C,C+4 ; INTO NUMBF2
MOVE C+1,SAVNO2
JSP 15,NCON
MOVE C+1,[POINT 7,C+1,35]
ILDB C,C+1
JUMPE C,RDON
IDPB C,C+4
JRST .-3
RDON: MOVEI C,":"
IDPB C,C+4
JRST COMRE ; GO TO CBGET
HM1: MOVEM C+1,SAVNO
JUMPL W1,FIXUP
SUB C+1,TOP1 ; FOR INSERTION ONLY
AOJA C+1,LASNUM
FIXUP: ADDI C+1,2
SKIPGE TOP1 ; ANY LINES IN BASE BUFFER?
JRST LASNUM ; THEN THIS CAN'T BE A DELETE!
JSP 15,NCON
AOS CRPERR ; IF EOF AND INSERTION, NO RED. AFTER
MOVE C+1,[POINT 7,C+1,35]
ILDB C,C+1
JUMPE C,NUMFI1
AOJ C+3,0
IDPB C,C+4
JRST .-4
NUMFI1: MOVEI C,","
IDPB C,C+4
AOJ C+3,
MOVE C+1,LINEN0
ADDI C+1,2 ; MAKE SURE THIS SPECIAL CASE IS TREATED
JRST LASNUM ; PROPERLY
EXTERN BSPEC,USPEC,BADDB,USDDB,NOTFND,NOTAV.,IOERR
EXTERN SAVACS,USEIPT,BASIPT
EXTERN STATE.,COMPOP,SAVAC2,NUMBUF,ID.,ID.CNT,LINCNT
EXTERN SAVEPP,PTRS.,SAVEXS,NUMBF2,CRLFBF
FR=7
PP=17
C=10
; UIN AND BIN GET CHARS FROM USER AND BASE FILES
; RESPECTIVELY. THEY WORK THE SAME AS UCIN AND
; MCIN EXCEPT AT EOF, THE SET BITS IN FR TO SO
; INDICATE. THEIR DDB'S ARE FILLED BY CAMCTL WHEN
; FULLY AUTOMATED PROCESSING IS DESIRED. PROGRAM
; FLOW IS AS FOLLOWS:
; HUMANS CALL CAM
; CAM CALLS COMERG OR CBGET
; COMERG CALLS CBGET
; CBGET CALLS COMPAR
; COMPAR RETURNS TO CBGET
; AND CBGET RETURNS TO USER, AND UNWINDING PROCEEDS
; FROM THERE.
UIN: SKIPL USDDB+6
JRST OPENUS
USX: SOSG USEIPT+2
JRST FILLUS
USXX: ILDB C,USEIPT+1
CHKLN (UIN,USEIPT)
JUMPE C,USX
JRST (11)
FILLUS: IN USCHAN,
JRST USXX
GETSTS USCHAN,C
TRNE C,20000
JRST NULLUS
PUSHJ 16,IOERR
XWD [ASCIZ/?USERS FILE READ/],USDDB
JRST FILLUS
NULLUS: MOVEI C,0
TLO FR,@EOFTBL(FR)
JRST (11)
OPENUS: SKIPE USDDB+6
JRST NEWUS
MOVE C,USDDB
INITUS: MOVEM C,USPEC+1
OPEN USCHAN,USPEC
JRST USERR1
AOS USDDB+6
NEWUS: HRRZI C,SAVACS
BLT C,SAVACS+3
HRLZI C,USDDB+2
BLT C,3
LOOKUP USCHAN,0
JRST USERR2
HRLZI C,SAVACS
BLT C,3
SETOM USDDB+6
INPUT USCHAN,
JRST USXX
USERR1: PUSHJ 16,NOTAV.
XWD [ASCIZ/?USERS FILE/],USDDB
JRST INITUS-1
USERR2: PUSHJ 16,NOTFND
XWD [ASCIZ/?CANNOT FIND USERS FILE FILE /],USDDB
JRST NEWUS
BIN: SKIPL BADDB+6
JRST OPENBA
BAX: SOSG BASIPT+2
JRST FILLBA
BAXX: ILDB C,BASIPT+1
CHKLN (BIN,BASIPT)
JUMPE C,BAX
JRST (11)
FILLBA: IN BACHAN,
JRST BAXX
GETSTS BACHAN,C
TRNE C,20000
JRST NULLBA
PUSHJ 16,IOERR
XWD [ASCIZ/?BASE READ/],BADDB
JRST FILLBA
NULLBA: MOVEI C,0
TLO FR,@EOFTBL(FR)
JRST (11)
OPENBA: SKIPE BADDB+6
JRST NEWBA
MOVE C,BADDB
INITBA: MOVEM C,BSPEC+1
OPEN BACHAN,BSPEC
JRST BAERR1
AOS BADDB+6
NEWBA: HRRZI C,SAVACS
BLT C,SAVACS+3
HRLZI C,BADDB+2
BLT C,3
LOOKUP BACHAN,0
JRST BAERR2
HRLZI C,SAVACS
BLT C,3
SETOM BADDB+6
INPUT BACHAN,
JRST BAXX
BAERR1: PUSHJ 16,NOTAV.
XWD [ASCIZ/?BASE/],BADDB
JRST INITBA-1
BAERR2: PUSHJ 16,NOTFND
XWD [ASCIZ/?CANNOT FIND BASE FILE /],BADDB
JRST NEWBA
C=13
; CBGET IS A MASTER ROUTINE CALLED ELSEWHERE. IT IS
; CALLED BY A PUSHJ 16,CBGET AND IT RETURNS
; WITH ONE OF THREE THINGS IN REGISTER 13. ONE, IT
; CAN HAVE THE FIRST CHARACTER OF A CORRECTION COMMAND,
; OR SINGLE CHARACTERS FROM SUCH A COMMAND. TWO, 13
; CAN CONTAIN -1 IF NO MORE CORRECTIONS CAN BE SQUEZZED
; FROM THE INPUT FILES. THREE, IT WILL CONTAIN 0 IF
; COMPAR RAN OUT OF ROOM AND SMOTHERED IN TEXT.
; THE VARIABLE STATE. POINTS TO THE CURRENT ACTIVITY
; WHICH CBGET IS TRYING TO PUMP CHARACTERS FROM. THE
; VALUE OF STATE IS USED AS AN INDEX INTO CBACT TO TELL
; IT WHAT TO DO. ESSENTIALLY, IT GETS CHARACTERS FROM
; ASCIZ STRINGS POINTED TO BY ENTRIES IN THE
; POINTER TABLE. WHEN IT HEARS A NULL, IT ADVANCES THE
; STATE. ONE TO EXTRACT THE NEXT THING. WHEN THERE ARE
; NO MORE ACTIONS LEFT TO PERFORM, IT CALLS COMPAR TO GET
; MORE STRINGS AND SETS STATE. TO ONE, WHEREUPON IT RECYCLES.
CBGET: MOVE C,STATE. ; PICK UP THE STATE.
MOVEM 16,SAVE16 ; SAVE PDP THAT GOT US HERE
JRST @CBACT(C) ; NOW GET THE CHARACTER
STCOMP: SETZM STATE. ; STATE 0 MEANS START COMPAR
AOS COMPOP
AOS STATE.
MOVEM SAVAC2
MOVE [XWD 1,SAVAC2+1]
BLT SAVAC2+17 ; SAVE USER'S REGS
JRST COMPAR ; AND DO WORK
NUMGT: ILDB C,PTRS. ; STATE 1, GET # ON CORR.LINE
JUMPN C,CBRTN
MOVE C,[POINT 7,NUMBUF-1,35]
MOVEM C,PTRS. ; IF A NULL HEARD,RESET POINTER
AOS C,STATE. ; INCREMENT THE STATE
IDGET: SKIPE ID. ; IS THERE AN ID (STATE 2)
JRST ID.IS ; YES, NEX T CHAR COMES FROM THERE
AOS C,STATE. ; OTHERWISE CHANGE GEARS
JRST CRLFF ; AND OUTPUT A CR-LF
ID.IS: ILDB C,PTRS.+1
JUMPN C,CBRTN
MOVE C,[POINT 7,ID.-2,35]
MOVEM C,PTRS.+1 ; RESET POINTER TO ID
AOS C,STATE.
CRLFF: ILDB C,PTRS.+2 ; FEED CALLER CR-LF NOW TO END LINE
JUMPN C,CBRTN
MOVE C,[POINT 7,CRLFBF-1,35]
MOVEM C,PTRS.+2 ; RESET POINTER
AOS C,STATE.
TXTGET: SOSGE LINCNT ; ANY LINES OF TEXT TO GO?
JRST REDNCK ; NO, HOW ABOUT A REDUNDANCY CHECK?
AOS C,STATE. ; THERE IS TEXT
TXT2: ILDB C,PTRS.+3 ; GET THE TEXT
JUMPN C,CBRTN
HRLI C,(POINT 7,0,35)
HRR C,PTRS.+3 ; NULL IS END OF ONE LINE;
AOJ C, ; MAKE POINTER POINT TO NEXT LINE
MOVEM C,PTRS.+3
SOS STATE. ; THEN MAKE STATE CHECK IF ENOUGH LINES OUTPUTT
JRST TXTGET ; AND ACTUALLY BOOKKEEP
REDNCK: SOSG CRPERR ; TIME FOR A CHECK LINE?
JRST REDNFX ; YUP
SETZM STATE. ; DUKE SAYS NOPE
AOS STATE.
MOVEM SAVAC2
MOVE [XWD 1,SAVAC2+1]
BLT SAVAC2+17 ; SAVE USER'S REGS
HRLZI 17,SAVEXS ; RESTORE COMPARS REGS
BLT 17,16
MOVE PP,SAVEPP
POPJ PP, ; AND POP BACK TO COMPAR
REDNFX: AOS C,STATE. ; FIX UP STATE.
AOS C,STATE.
MOVEI C,5
MOVEM C,CRPERR ; AND RESTORE MODULUS COUNTER
REDNF: ILDB C,PTRS.+4 ; GET -NUMBER:
JUMPN C,CBRTN
MOVE C,[POINT 7,NUMBF2-1,35]
MOVEM C,PTRS.+4
AOS C,STATE.
REDTXT: ILDB C,PTRS.+3 ; NOW GET TEXT FROM COMPAR BUFF
CAIL C,37
JUMPN C,CBRTN
CAIN C,CR ; DON'T OUTPUT FEEDS
JRST CBRTN
CAIN C,LF
JRST NXT8
CAIN C,FF
JRST NXT8
CAIN C,VT
JRST NXT8
JUMPN C,CBRTN
NXT8: AOS STATE.
RDCRLF: ILDB C,PTRS.+2 ; NOW A CRLF
JUMPN C,CBRTN
MOVE C,[POINT 7,CRLFBF-1,35]
MOVEM C,PTRS.+2
SETZM STATE.
AOS STATE.
MOVEM SAVAC2
MOVE [XWD 1,SAVAC2+1]
BLT SAVAC2+17
HRLZI 17,SAVEXS
BLT 17,16
MOVE 17,SAVEPP
POPJ 17, ; ALL OVER!! GO BACK TO COMPAR FOR MORE
COMRE:
HRLZI 17,SAVAC2
BLT 17,15+1
MOVE 17,SAVAC2+17 ; INCLUDING HIS 17
JRST NUMGT ; RETURN FROM COMPAR: GET USER'S REGS BACKK
CBACT: STCOMP
NUMGT
IDGET
CRLFF
TXTGET
TXT2
REDNF
REDTXT
RDCRLF
CBRTN: MOVE 16,SAVE16 ; GO BACK TO CALLER
POPJ 16, ; VIA A POPJ
END ; THAT'S ALL FOLKS