.TITLE CMPR .SBTTL COMPARISON PROCESSOR ;********************************************************************* ; ; PROCESS FILES TO BE COMPARED FROM INPUT CIL ; ;********************************************************************* CMPR:: CALL INDEXC ;GET THE REGIONS NEEDED MOV #INX1,R1 ;POINT TO ONE REGION MOV #10000,R2 ;SIZE CALL BLANK ;CLEAR IT MOV #INX2,R1 ;POINT TO THE OTHER REGION MOV #10000,R2 ;SIZE CALL BLANK ;CLEAR IT MOV #PRIINP,R0 ;FDB PTR MOV #1,F.BKVB+2(R0) ;INIT BLOCK PTR CLR F.BKVB(R0) ; MOV #INX1,F.BKDS+2(R0) ;PUT INDEX IN THE REGION MOV PRIBUF+22,R2 ;SIZE OF INDEX CALL CILRD ;READ IN THE INDEX FROM A CIL MOV #SECINP,R0 ;FDB PTR MOV #1,F.BKVB+2(R0) ;INIT BLOCK PTR CLR F.BKVB(R0) ; MOV #INX2,F.BKDS+2(R0) ;PUT INDEX IN THE REGION MOV SECBUF+22,R2 ;SIZE OF INDEX CALL CILRD ;READ IN THE INDEX FROM A CIL MOV #ICMD,R2 ;PTR TO INDIRECT COMMANDS .PAGE LOOP: TST (R2)+ ;CHECK CODE WORD BMI CMPDNE ;IF -1, THEN ALL DONE CALL CMPFND ;GO FIND THE MODULES NEEDED BCS LOOP ;DIDN'T FIND BOTH PUSH R2 ;SAVE FOR THE TIME BEING MOV ARG5,MOD1 ;GET SIZE MOV SIZE,MOD2 ; LOOP2: MOV MOD1,SIZ1 ;AMOUNT TO READ SUB #ARYSIZ,MOD1 ;DO WE HAVE MORE THAN WE CAN READ? BLT .+10 ;NO MOV #ARYSIZ,SIZ1 ;YES, SO READ THE MAX FOR ONE TIME MOV MOD2,SIZ2 ;AMOUNT TO READ SUB #ARYSIZ,MOD2 ;DO WE HAVE MORE THAN WE CAN READ? BLT .+10 ;NO MOV #ARYSIZ,SIZ2 ;YES, SO READ THE MAX FOR ONE TIME MOV #PRIINP,R0 ;FDB PTR MOV #INX1+10000,F.BKDS+2(R0) ;SET-UP REGION BUFFER ADDRESS MOV SIZ1,R2 ;SIZE OF MODULE MOV ARG11+10,F.BKVB+2(R0) ;BLOCK NUMBER CLR F.BKVB(R0) ; CALL CILRD ;READ IN THE DESIRED MODULE MOV #SECINP,R0 ;FDB PTR MOV #INX2+10000,F.BKDS+2(R0) ;SET-UP REGION BUFFER ADDRESS MOV SIZ2,R2 ;SIZE OF MODULE MOV BLOCK,F.BKVB+2(R0) ;BLOCK NUMBER CLR F.BKVB(R0) ; CALL CILRD ;READ IN THE DESIRED MODULE MOV #CMPMG,R1 ;PRINT MODULE HEADER MESSAGE CALL OUTPUT ;PRINT IT MOV #INX1+10000,R0 ;MODULE 1 BUFFER PTR MOV #INX2+10000,R4 ;MODULE 2 BUFFER PTR MOV SIZ1,R1 ;LENGTH ASR R1 ;MAKE A WORD OFFSET MOV SIZ2,R3 ;LENGTH ASR R3 ;MAKE A WORD OFFSET CLR R5 ;INIT # OF ERRORS ALLOWED CALL DOCMP ;DO THE COMPARE TST MOD1 ;MORE TO DO? BGT LOOP2 ;YES TST MOD2 ;MORE TO DO? BGT LOOP2 ;YES MOV #CRLF,R1 ;SEPARATE CALL OUTPUT ;PRINT CRLF POP R2 ;GET IT BACK JMP LOOP ;KEEP LOOPING CMPDNE: JMP RESTAR ;ALL DONE .PAGE ;*************************************************************************** ; ; SEARCH BOTH CIL INDEXES FOR THE MODULES DESIRED ; ;*************************************************************************** CMPFND: MOV #INX1+22,R4 ;GET INDEX BUFFER PTR CMP1: INCR 16 ;SKIP AHEAD CALL DIROP ;READ A DIRECTORY ENTRY BCC .+12 ;GOT ONE CALL MODNOT ;DIDN'T FIND THE MODULE SEC ;REPORT THE ERROR RETURN ; CMP (R2),NAME ;CHECK FOR THE RIGHT NAME BNE CMP1 ;NO CMP 2(R2),NAME+2 ;EXACT MATCH? BNE CMP1 ;NO ; FOUND A MATCH MOV #CMP1TM,R1 ;GET THE DATE AND TIME CALL DATE ;DO IT MOV ARG8,ARG ;SAVE PARAMETERS MOV ARG9,ARG2 ; MOV ARG10,ARG3 ; MOV ARG11,ARG4 ; MOV ARG11+2,ARG5 ; MOV ARG11+4,ARG6 ; MOV ARG11+6,ARG7 ; MOV BLOCK,ARG11+10 ; CMP (R2)+,(R2)+ ;SKIP 1ST NAME MOV #INX2+22,R4 ;GET INDEX BUFFER PTR CMP2: INCR 16 ;SKIP AHEAD CALL DIROP ;READ A DIRECTORY ENTRY BCC .+12 ;GOT ONE CALL MODNOT ;DIDN'T FIND THE MODULE SEC ;REPORT THE ERROR RETURN ; CMP (R2),NAME ;CHECK FOR THE RIGHT NAME BNE CMP2 ;NO CMP 2(R2),NAME+2 ;EXACT MATCH? BNE CMP2 ;NO ; FOUND A MATCH MOV #CMP2TM,R1 ;GET THE DATE AND TIME CALL DATE ;DO IT CMP (R2)+,(R2)+ ;SKIP 1ST NAME CLC ;SIGNAL OUR SUCCESS RETURN .PAGE ;*************************************************************************** ; ; EXECUTE THE ACTUAL WORD BY WORD COMPARE ; R0 = ADDR OF MODULE 1, R1 = LENGTH ; R4 = ADDR OF MODULE 2, R3 = LENGTH ; R5 = COUNTER OF ERRORS ; ;*************************************************************************** DOCMP: CMP (R0),(R4) ;GOT A MATCH? BNE NOMTCH ;NO CMP (R0)+,(R4)+ ;YES, SKIP CMPC: DEC R1 ;COUNT IT, DONE? BEQ CDONE1 ;YES DEC R3 ;COUNT IT, DONE? BEQ CDONE2 ;YES ADD #2,LADR ;KEEP ADDRESS UP TO DATE ADD #2,ARG6 ; BR DOCMP ;LOOP TIL DONE CDONE1: DEC R3 ;COUNT IT CDONE2: CMP R1,R3 ;DID WE FINISH TOGETHER? BNE ONEBIG ;NO, SO ONE IS BIGGER RETURN ; ; ONEBIG: MOV #BIGMG,R1 ;MESSAGE PTR CALL PRINT ;REPORT THE ERROR RETURN ; BIGMG: .ASCIZ / *** MODULES ARE NOT OF EQUAL SIZE ***/ .EVEN ; NOMTCH: MOV ARG6,ARG ;ADDRESS MOV (R0)+,ARG2 ;CONTENTS MOV LADR,ARG3 ;ADDRESS MOV (R4)+,ARG4 ;CONTENTS PUSH R1 ;SAVE MOV #CMPRP,R1 ;MESSAGE FORMAT CALL OUTPUT ;PRINT IT POP R1 ;GET IT BACK INC R5 ;COUNT THE ERROR CMP #MAX,R5 ;OVER MAXIMUM # OF ERRORS? BLE .+6 ;YES JMP CMPC ;NO, SO CONTINUE MOV #STPMG,R1 ;MESSAGE FORMAT CALL OUTPUT ;PRINT IT RETURN ; STPMG: .ASCIZ / *** CURRENT MODULE COMPARE TERMINATED ***/ .EVEN .PAGE ;*************************************************************************** ; ; LOCAL STORAGE DEFINITIONS ; ;*************************************************************************** CRLF: .ASCIZ /%N%N/ CMPMG: .ASCII /%2R %2R / CMP1TM: .ASCII /XX-XXX-XX XX:XX:XX/ .ASCII / %P %P %P%N/ .ASCII /%2R %2R / CMP2TM: .ASCII /XX-XXX-XX XX:XX:XX/ .ASCIZ / %P %P %P%N%N/ CMPRP: .ASCIZ / %P:%P %P:%P/ .EVEN MOD1: .WORD 0 MOD2: .WORD 0 SIZ1: .WORD 0 SIZ2: .WORD 0 .END