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