. . 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