.
. FILE COMPARE COMMAND ACTIVITY
.
.
. (C) Copyright 1972-1978 John Walker
.
. This software is in the public domain
.
AXR$
DEFUNCT$
FANG
IMT EQU R12 BLOCK 1 EOF FLAG
OMT EQU R13 BLOCK 2 EOF FLAG
PFCT EQU R14 PRINT FCT ADDRESS
.
PURE CODE
.
CHECK* LR,U IMT CLEAR FILE 1 AT EOF
LR,U OMT CLEAR FILE 2 AT EOF
LA,U A7 CLEAR HIT QUEUE ALLOCATED
LA,U A13 CLEAR RELATIVE BLOCK NUMBER
LX X7,CDBPC,X8 LOAD FIRST PARAMETER LINK
LX X3,CDMASK,X8 LOAD MASK BUFFER ADDRESS
LA A1,PBVAL,X7 LOAD FDT ADDRESS
LMJ A2,IOGET BUILD AN I/O FCT
LX,U X10,,A0 PUT FCT ADDRESS IN X10
LX X7,PBLINK,X7 LINK TO NEXT FILE
LA A1,PBVAL,X7 LOAD FDT ADDRESS OF 2ND FILE
LMJ A2,IOGET BUILD FCT FOR SECOND INPUT FILE
LX,U X9,,A0 X9 IS FCT ADDRESS OF SECOND FILE
LX X7,PBLINK,X7 LINK TO COUNT PARAMETER
LA,U A3,0377777 LOAD IMPLIED COUNT FOR NO OPTIONS
LA A14,CDOPTS,X8 LOAD COMMAND OPTIONS
TOP,U A14,OPTION('M') COMPARE BY FILES ?
J NOMX NO. DON'T SET UP FILE COUNT MODE
LA,U A3,1 LOAD IMPLIED FILE COUNT
LA,U A0,'M' LOAD I/O READ OPTION
SA A0,IOOPT,X9 SET UP 'M' MODE ON...
SA A0,IOOPT,X10 ...BOTH FILES
NOMX TZ X7 WAS A COUNT SUPPLIED ?
LA A3,PBVAL,X7 YES. USE SUPPLIED COUNT
SA A3,IOCOUNT,X9 PUT COUNT IN FCT 1
SA A3,IOCOUNT,X10 ...AND IN FCT 2 ALSO
LA A0,IOMASS,X10 LOAD MASS STORAGE FLAG
TE A0,IOMASS,X9 SAME TYPE FILES ?
J NOFDL NO. USER MUST SET CORRECT M/S LENGTH
JZ A0,NOFDL USE IMPLIED LENGTHS IF TAPE INPUT
LA A0,IOWAD,X9 LOAD WAD INDICATOR
TE A0,IOWAD,X10 IS WAD ATTRIBUTE THE SAME ?
J WFCHK NO. USE LENGTH OF FASTRAND FORMAT FILE
LA A0,IOBLEN,X10 LOAD ONE LENGTH
TLE A0,IOBLEN,X9 IS OTHER GREATER ?
LA A0,IOBLEN,X9 YES. USE IT INSTEAD
PUTLEN SA A0,IOBLEN,X9 PUT LENGTH IN BOTH FCT'S
SA A0,IOBLEN,X10 INSURING COMPARISON OF DATA ONLY
NOFDL LMJ A2,INPUT CREATE A READER FOR THE FIRST FILE
LR,U R3,,X10 SALT AWAY FIRST FDT ADDRESS
LX,U X10,,X9 GET FDT ADDRESS OF SECOND FILE
LMJ A2,INPUT CREATE READER FOR SECOND FILE
LX X10,R3 RESTORE FIRST FCT ADDRESS
.
. BLOCK COMPARISON LOOP
.
COMPARE LA,U A9 CLEAR DIFFERENCES IN THIS BLOCK
AA,U A13,1 BUMP RELATIVE BLOCK NUMBER
LA,U A12 CLEAR LAST BLOCK ENCOUNTERED HERE
DSL A1,72 CLEAR BLOCK BUFFER ADDRESSES
TZ IMT ANY MORE IN FILE 1 ?
J GEX2 NO. GET NEXT FROM FILE 2
GET IOBB,X10 YES. GET NEXT BLOCK
LA,U A2,,A1 SAVE BLOCK ADDRESS IN A2
LA,U A1 CLEAR FIRST BLOCK ADDRESS
LR IMT,IBLAST,A2 LOAD LAST BLOCK FLAG
AA A12,IBLAST,A2 SET IBLAST ENCOUNTERED INDICATOR
GEX2 TZ OMT IS FILE 2 EXHAUSTED ?
J GEX1 YES. SKIP THE READ ATTEMPT
GET IOBB,X9 NO. READ IT IN
LR OMT,IBLAST,A1 LOAD LAST BLOCK FLAG
AA A12,IBLAST,A1 SET IBLAST ENCOUNTERED IF IT WAS
GEX1 DS A1,R6 SAVE BLOCK ADDRESSES
JZ A1,GOTBY PROCESS TRAILING BLOCKS
JZ A2,GOTBY WHEN ONE FILE FINISHES EARLY
.
. NOW ANALYSE STATUS: IF BOTH EQUAL, AND NORMAL, 4, OR 5,
. PROCEED TO BLOCK COMPARISON. IF BOTH EOF STATUS, THEN
. THE BLOCKS ARE ACCEPTED AS EQUAL WITHOUT FURTHER COMPARISON
. CHECKS. IF AN ABNORMAL STATUS COMES BACK ON EITHER OR BOTH,
. THE STATUS IS EDITED, AND THE BLOCK IS DUMPED IF THERE'S
. ANY INFORMATION TO DUMP.
.
LA A0,IBSTAT,A1 LOAD STATUS OF SECOND BLOCK
TE A0,IBSTAT,A2 EQUAL TO FIRST BLOCK STATUS ?
J STDIFF NO. DUMP THE BLOCKS
JZ A0,BLCHK CHECK BLOCKS IF NORMAL STATUS
JE A0,1,CMPROK ACCEPT AS EQUAL IF EOF
JE A0,4,BLCHK CHECK IF AFC STATUS
JE A0,5,BLCHK CHECK IF PARTIAL M/S BLOCK READ
J STDIFF DUMP FOR OTHER ABNORMAL STATUS
.
. MAKE SURE BLOCK LENGTHS ARE THE SAME
.
BLCHK LA A0,IBLEN,A1 LOAD LENGTH OF SECOND BLOCK
TE A0,IBLEN,A2 SAME AS FIRST BLOCK ?
J LENDIF NO. DUMP BOTH BLOCKS
LX,U X1,IBDATA,A2 LOAD BLOCK 1 DATA POINTER
LX,U X2,IBDATA,A1 LOAD BLOCK 2 DATA POINTER
LXI,U X1,1 SET UP INCREMENTS...
LXI,U X2,1 ...FOR BOTH BLOCKS
LA,U A6 CLEAR BLOCK POSITION INDICATOR
LR R4,IBLEN,A1 LOAD BLOCK LENGTH COUNTER
TZ X3 ANY MASK TO APPLY ?
J MACOMP YES. TEST UNDER MASK
J CMPRX ENTER UNMASKED COMPARISON LOOP
.
CMPRS LA A0,,*X1 LOAD A WORD OF DATA
TE A0,,*X2 DOES IT COMPARE ?
LMJ X7,RECHIT NO. RECORD A 'HIT' FOR LATER EDITING
AA,U A6,1 INCREMENT BLOCK POSITION
CMPRX JGD R4,CMPRS LOOP FOR ALL WORDS IN BLOCK
CMPRY JNZ A9,DIFDUM ANY 'HITS' IN BLOCK ?
CMPROK JZ A1,NOBR1 ANY BUFFER TO RELEASE ?
BRELP A1 YES. RELEASE BUFFER 2
NOBR1 JZ A2,NOBR2 ANY BUFFER 1 ALLOCATED ?
BRELP A2 RELEASE FIRST DATA BUFFER
NOBR2 LA A0,IMT GET FILE 1 LAST FLAG
TNE A0,OMT BOTH FILES IN SAME STATUS ?
JNZ A0,CLOSEC YES. IS THAT EOF STATUS ?
J COMPARE NO. KEEP ON PROCESSING BLOCKS
.
. MASKED COMPARISON ROUTINE
.
MACOMP LA A3,PBVAL,X3 LOAD LENGTH OF MASK
LX,U X5,PBSS,X3 LOAD MASK START ADDRESS
LXI,U X5,1 SET UP INCREMENT
J MACOMB ENTER SEARCH LOOP
.
MACOML LA A4,,*X5 LOAD NEXT WORD OF KEY
ANA,U A3,1 DECREMENT LENGTH REMAINING
JNZ A3,MACOM1 MASK EXHAUSTED ?
LXM,U X5,PBSS,X3 YES. CYCLE POINTER BACK TO START
LA A3,PBVAL,X3 RELOAD TOTAL LENGTH
MACOM1 LA A0,,*X1 LOAD FIRST DATA WORD
XOR A0,,*X2 DIFFERENT BITS GO TO A9
AND A1,A4 EXAMINE ONLY DESIRED BITS
TZ A2 WERE QUANTITIES DIFFERENT UNDER MASK ?
LMJ X7,RECHIT YES. RECORD A HIT
AA,U A6,1 BUMP WORD POSITION
MACOMB JGD R4,MACOML LOOP FOR ALL WORDS
DL A1,R6 RESTORE BLOCK POINTERS
J CMPRY END OF BLOCK COMPARISON
.
. RECORD A DIFFERING WORD
.
RECHIT SX X5,A10 SAVE MASK BUFFER POINTER
SX X7,A8 SAVE RETURN POINT
LMJ X7,FISPER SET UP PRINTER
LX X7,A8 RELOAD RETURN POINT
BGET SFL ALLOCATE A HIT BUFFER
SA A6,SFFINDW,A0 STORE OUT HIT WORD NUMBER
LA,U A1,,A0 LOAD BUFFER ADDRESS
LA A0,A7 LOAD HIT QUEUE ADDRESS
INSERT . PUT ON COMPLETION QUEUE
AA,U A9,1 INCREMENT HIT COUNT
DL A1,R6 RESTORE BLOCK POINTERS
LX X5,A10 RESTORE MASK BUFFER POINTER
J 0,X7 RETURN
.
WFCHK LA A0,IOBLEN,X10 LOAD LENGTH OF ONE FILE ?
TNZ IOWAD,X9 IS OTHER FILE FASTRAND FORMAT ?
LA A0,IOBLEN,X9 YES. THEN USE ITS (FASTRAND) LENGTH
J PUTLEN STORE COMMON LENGTH IN PACKETS
.
. CLOSE OUT PROCESSING
.
CLOSEC JZ A7,NORDY PRINT DATA TO RELEASE ?
V PRINTER YES. UNLOCK PRINTER
BGET IBDATA ALLOCATE A DUMMY BLOCK BUFFER
LA,U A1,STERM LOAD SOFTWARE TERMINATION STATUS
SA A1,IBSTAT,A0 PUT STATUS IN BLOCK
SNONZ IBLAST,A0 MARK AS LAST BLOCK
LA,U A1,,A0 LOAD BLOCK ADDRESS
LA A0,PFCT GET ADDRESS OF PRINT FCT
PUT IOBB,A0 SEND BLOCK TO TERMINATE PRINT
P R11,,W WAIT FOR BLOCK COMPLETION
P QL,A0 WAIT FOR PRINT COMPLETION
BRELP PFCT RELEASE PRINT FCT
BRELP R11 RELEASE TERMINATION QUEUES
BRELP A7 RELEASE THE HIT QUEUE
NORDY BRELP X9 RELEASE FCT FOR FILE 2
BRELP X10 RELEASE FCT FOR FILE 1
COMPLETE . TERMINATE THIS COMMAND
.
. LIST DIFFERENCES, DUMP DIFFERING BLOCKS
.
DIFDUM R$DIT . ENTER EDITING MODE
E$MSG DATDIF EDIT BLOCKS DIFFER MESSAGE
E$DECV A13 FILL IN RELATIVE BLOCK NUMBER
E$MSGR . COPY REST OF MESSAGE
R$PRTX 2 PRINT AND TERMINATE
LMJ X7,FINDLE EDIT WORD NUMBERS (ROUTINE IS IN SEARCH)
J BANGOR EDIT THE BLOCK DUMP
BANGO LMJ X7,FISPER INSURE IN PRINT MODE
BANGOR LA A0,IMT GET FILE 1 LAST FLAG
TNE A0,OMT BOTH FILES IN SAME STATUS ?
JNZ A0,BANGO1 YES. IS THAT EOF STATUS ?
.
. EDIT MESSAGE INDICATING END OF ONE FILE
.
JZ A12,BANGO1 IGNORE IF ESTABLISHED SITUATION
R$DIT . SET UP EDITOR
E$MSG EOIM EDIT MESSAGE
LX X5,IOFDT,X10 LOAD FDT ADDRESS
TZ OMT WAS THIS ONE THE EOI FILE ?
LX X5,IOFDT,X9 NO. GET OTHER FDT
LMJ X6,EFILE EDIT OFFENDING FDT ADDRESS
R$PRTX 2 PRINT THE MESSAGE
BANGO1 R$DIT . ENTER EDITING MODE
TNZ R7 ANY BLOCK READ ?
J SPANGL NO. DON'T DUMP IT
E$MSG FILCON EDIT FILE CONTAINS MESSAGE
LX X5,IOFDT,X10 LOAD FDT ADDRESS
LMJ X6,EFILE EDIT FILE NAME
E$MSGR . COPY REST OF MESSAGE
R$PRT 2 PRINT IT
LA A1,R7 LOAD BLOCK BUFFER ADDRESS
SZ IBLAST,A1 MARK NOT LAST
LA A0,PFCT LOAD PRINT FCT ADDRESS
PUT IOBB,A0 SUBMIT FOR DUMPING
P R11,,W WAIT FOR DUMP
SPANGL TNZ R6 ANY SECOND BLOCK ?
J SPANDL NO. SKIP EDITING
E$MSG FILCON EDIT FILE CONTAINS
LX X5,IOFDT,X9 LOAD FDT ADDRESS
LMJ X6,EFILE EDIT FILE DESIGNATION
E$MSGR . COPY REST OF MESSAGE
R$PRTX 2 PRINT THE LINE
LA A1,R6 LOAD BLOCK BUFFER ADDRESS
SZ IBLAST,A1 CLEAR LAST BLOCK FLAG
LA A0,PFCT LOAD PRINT FCT ADDRESS
PUT IOBB,A0 PASS BUFFER TO PRINT
P R11,,W WAIT FOR PRINT TO COMPLETE
J NOBR2 COMPLETE BLOCK PROCESSING
.
SPANDL R$DITX . TERMINATE EDIT MODE
J NOBR2 GET MORE BLOCKS
.
. DUMP BLOCKS OF DIFFERING LENGTHS
.
LENDIF LMJ X7,FISPER INITIALISE PRINT MODE
R$DIT . ENTER EDITING MODE
E$MSG LENDIM EDIT DIFFERING LENGTHS MESSAGE
DIFFRP E$DECV A13 EDIT BLOCK NUMBER
E$MSGR . COPY REST OF MESSAGE
R$PRTX 2 PRINT THE MESSAGE
J BANGOR DUMP THE BLOCKS
.
. DUMP BLOCKS AFTER RUNNING OUT OF ONE FILE
.
GOTBY LA,U A3,,A1 LOAD ADDRESS OF ONE BLOCK
AA,U A3,,A2 GET ADDRESS OF FOUND BLOCK IN A3
ON DEBUG
TNZ,U 0,A3 ANY BLOCK READ ?
IERR . NOPE.
OFF DEBUG
LA A0,IBSTAT,A3 LOAD READ STATUS
JZ A0,BANGO DUMP IF NORMAL STATUS
JE A0,4,BANGO DUMP IF AFC STATUS
JE A0,5,BANGO OR PARTIAL MASS STORAGE BLOCK
JNE A0,1,CMPROK IGNORE BAD STATUS
LX X5,IBIOP,A3 LOAD I/O PACKET ADDRESS
TZ IOMASS,X5 TAPE FILE ?
J CMPROK NO. IGNORE FUNNY EOF STATUS
J BANGO DUMP THE BLOCK IF IT'S AN EOF MARK
.
. SET UP FOR FIRST PRINTED OUTPUT
.
FISPER JNZ A7,,X7 STUFF ALLOCATED YET ?
BGET QL NO. GET A HIT QUEUE
LA,U A7,,A0 SAVE HIT QUEUE ADDRESS
INITQ . MAKE IT A QUEUE
SX X9,R8 SAVE BOTH...
SX X10,R9 ...FCT POINTERS
LMJ A2,IOGNF BUILD AN FCT TO DRIVE PRINT
LX,U X10,,A0 GET FCT IN A0
LR,U PFCT,,A0 SAVE PRINT FCT LOCATION
BGET QPL*2 ALLOCATE COMPLETION QUEUES
LR,U R11,,A0 SAVE BLOCK COMPLETION QUEUE ADDRESS
LX,U X9,QPL,A0 LOAD PRINT COMPLETION QUEUE ADDRESS
LXI,U X9,,A0 PASS BLOCK COMPLETION QUEUE TO PRINT
INITPVQ 0 INITIALISE BLOCK COMPLETION QUEUE
INITPVQ 0,QPL,A0 INITIALISE COMPLETION QUEUE
LMJ A2,PRINT START THE PRINT ACTIVITY
P PRINTER LOCK THE PRINTER
LX X9,R8 RELOAD X9
LX X10,R9 RELOAD X10
J 0,X7 RETURN
.
. HANDLER FOR DIFFERING STATUS ON BLOCKS READ
.
. RULES: TREAT 0, 4, OR 5 AS EQUAL TO AN OTHER BLOCK
. STATUS OF 0, 4, OR 5. IF ONE STATUS IS AN
. EOF, PRINT EOF MESSAGE UNLESS FROM MASS
. STORAGE. IN ANY CASE, DUMP THE BLOCKS VIA
. BANGO.
.
STDIFF LA A4,IBSTAT,A1 LOAD FIRST STATUS
TNE,U A4,4 AFC ?
LA,U A4 YES. MAKE NORMAL
TNE,U A4,5 OR PARTIAL M/S BLOCK ?
LA,U A4 YES. MAKE NORMAL
LA A5,IBSTAT,A2 LOAD SECOND STATUS
TNE,U A5,4 WAS IT AN AFC ?
LA,U A5 YES. LET IT PASS
TNE,U A5,5 ...OR A PARTIAL BLOCK ?
LA,U A5 YES. MAKE IT LOOK NORMAL
TNE A4,A5 WERE STATI 'SIMILAR' ENOUGH ?
J BLCHK YES. PROCEED WITH OTHER TESTS
JE A4,1,EOFONE HANDLE SINGULAR EOF STATUS
JE A5,1,EOFONE FROM EITHER INPUT FILE
.
. BAD I/O STATUS ON FILE
.
LMJ X7,FISPER INSURE PRINT PROCESS IS CREATED
R$DIT . SET UP THE EDITOR
E$MSG BADIOS EDIT MESSAGE FOR BAD I/O STATUS
DL A1,R6 RESTORE BLOCK BUFFER POINTERS
TZ IBSTAT,A2 WAS FILE 2 IN ERROR ?
LA A1,A2 YES. MAKE A1 POINTER TO BAD BLOCK
LX X5,IBIOP,A1 LINK BACK TO I/O FCT
LX X5,IOFDT,X5 LINK BACK TO FDT FOR FILE
LMJ X6,EFILE EDIT THE FILE NAME
E$MSGR . EDIT THE REST OF THE MESSAGE
R$PRTX 2 PRINT THE MESSAGE
J BANGO DUMP THE GOOD BLOCK
.
EOFONE LA,U A0,,A1 LOAD EOF BLOCK ADDRESS
TNE,U A5,1 OR WAS IT THE OTHER ONE ?
LA,U A0,,A2 LOAD OTHER BLOCK BUFFER
LX X5,IBIOP,A0 LOAD I/O PACKET ADDRESS
TZ IOMASS,X5 MASS STORAGE EOF ?
J MSEOF YES. THIS ENDS THIS FILE'S PROCESSING
LMJ X7,FISPER INSURE PRINT IS OPENED
R$DIT . INITIALISE THE EDITOR
E$MSG DIFFER EDIT GENERAL DIFFERENCE MESSAGE
J DIFFRP APPEND BLOCK NUMBER AND DUMP BLOCKS
.
MSEOF TNE,U A0,,A1 FIND THE OFFENDER
LA,U A1 MARK THE BLOCK REMOVED
TNE,U A0,,A2 WAS IT THE OTHER ONE ?
LA,U A2 YES. MARK IT GONE
BRELP A0 RELEASE THE EOF BLOCK BUFFER
DS A1,R6 UPDATE SAVED BLOCK ADDRESSES
. ** EXAMINE REMAINING ONE'S STATUS **
J BANGO DUMP THE REMAINING BLOCK
.
PURE DATA
DATDIF 'DATA IN BLOCKS ! ARE UNEQUAL!'
LENDIM 'BLOCKS ! HAVE DIFFERENT LENGTHS.!'
DIFFER 'BLOCKS ! DIFFER.!'
BADIOS 'BAD I/O STATUS ENCOUNTERED ON FILE !.!'
EOIM 'END OF INFORMATION: FILE !'
FILCON 'FILE ! CONTAINS...!'
END