/COMPAF /COMPARE ALL FILES ON TWO DEVICES /10-AUG-77 DS /COPYRIGHT (C) 1977 DIGITAL EQUIPMENT CORPORATION VERSION="1&77 PATCH="A&77 /** REQUIRES 16K MEMORY! ** /MEMORY MAP: /00000 COMMAND DECODER /02000 PROGRAM /06200 HANDLERS /10000 USR /12000 PRINT BUFFER (13 BLOCKS) /20000 DIRECTORY, DEV 1 (6 BLOCKS) /23000 BUFFER, DEV 1 (10 BLOCKS) /30000 DIRECTORY, DEV 2 (6 BLOCKS) /33000 BUFFER, DEV 2 (10 BLOCKS) /ASSEMBLY: / .PAL COMPAF,TERM(L89)=2000 / .SA SYS COMPAF /EQUALITIES CUR=00 /PROGRAM FIELD BUFFER=3000 /COMPARE BUFFERS BUFLEN=10 /BUFFER LENGTH, BLOCKS F1=20 /FIELD OF DEV 1 STUFF F2=30 /FIELD OF DEV 2 STUFF PRBUF=2000 /PRINT BUFFER (FIELD 1, 2000-7377) PF=10 /FIELD OF PRINT BUFFER /HANDLER BUFFERS (2 PAGES EACH) ODEVB=7200 IDEVB1=6600 IDEVB2=6200 /PAGE 0 VARIABLES T=30 /TEMPORARIES T2=31 T3=32 T4=33 T5=34 ODEVN=35 /DEVICE NUMBERS IDEVN1=36 IDEVN2=37 ODEVH=40 /HANDLER ENTRY POINTS IDEVH1=41 IDEVH2=42 PRBUFP=43 /PRINT BUFFER POINTER *2000 /START HERE /LOCK IN USR START, CIF 10 JMS I (7700) 10 /LOCK IN USR /DISALLOW RESTARTING TAD (JMP I START+1) DCA START TAD (7605) DCA START+1 /RESTART HERE /CALL COMMAND DECODER RESTAR, CIF 10 JMS I (200) 5 /CALL CD 0 /NO DEFAULT EXTENSION /INITIALIZE PRINT BUFFER TAD (PRBUF) DCA PRBUFP /ANALYZE WHAT USER TYPED /1ST OUTPUT DEV? JMS LD1; 7600 SNA JMP ERR1 /NONE /YES - SAVE NR AND (17) DCA ODEVN /2ND OUTPUT DEV? JMS LD1; 7605 SZA CLA JMP ERR1 /EXISTS /3RD OUTPUT DEV? JMS LD1; 7612 SZA CLA JMP ERR1 /EXISTS /IS OUTDEV NON-FILE? JMS LD2; ODEVN SPA CLA JMP ERR1 /NO /1ST INPUT DEV? JMS LD1; 7617 SNA JMP ERR1 /NONE /YES - SAVE NR AND (17) DCA IDEVN1 /1ST FILENAME? JMS LD1; 7620 SZA CLA JMP ERR1 /EXISTS /IS INDEV1 FILED? JMS LD2; IDEVN1 SMA CLA JMP ERR1 /NO /2ND INPUT DEV? JMS LD1; 7621 SNA JMP ERR1 /NONE /YES - SAVE NR AND (17) DCA IDEVN2 /2ND FILENAME? JMS LD1; 7622 SZA CLA JMP ERR1 /EXISTS /NOTE: 3RD, ETC. INPUT NAMES IGNORED /IS INDEV2 FILED? JMS LD2; IDEVN2 SMA CLA JMP ERR1 /NO /END OF ANALYSIS OF USER INPUT /PRINT REPORT HEADING TAD (M6) JMS TY /FETCH OUTPUT HANDLER TAD (FE1-1) JMS FETCH /FETCH INPUT HANDLER 1 TAD (FE2-1) JMS FETCH /FETCH INPUT HANDLER 2 TAD (FE3-1) JMS FETCH /READ DIRECTORY 1 JMS I IDEVH1 6^200+F1 /6 BLOCKS, FIELD 2 0 /ADDR 1 /BLOCK JMP ERR2 /READ DIRECTORY 2 JMS I IDEVH2 6^200+F2 /6 BLOCKS, FIELD 3 0 /ADDR 1 /BLOCK JMP ERR2 /INIT SCAN OF DIRECTORY 1 TAD (SC1) DCA DIR1 /LOOP: /GET NEXT NAME FROM DIR 1 GNND1, TAD (DIR1-1) JMS SCAN JMP EP /DONE TAD 11 DCA 14 /SAVE ENTRY ADDR /INIT SCAN OF DIR 2 TAD (SC1) DCA DIR2 /LOOK FOR MATCHING NAMES /GET NEXT NAME FROM DIR 2 GNND2, TAD (DIR2-1) JMS SCAN JMP NNFD /DONE /DO THE NAMES MATCH? TAD 14 DCA 11 /RESTORE ADDR OF DEV1 ENTRY TAD (NAME-1) /ALSO SAVE IN "NAME" DCA 13 JMS NMTCH JMS NMTCH JMS NMTCH JMS NMTCH /THE NAMES MATCH JMP PAGE2 /CONTINUE PAGE /COMPARE THE TWO FILES /LOOK UP FILE 1 PAGE2, TAD (NAME) DCA NAMEA TAD IDEVN1 CIF 10 JMS I (200) 2 /LOOKUP NAMEA, NAME /STARTING BLOCK 0 /-LENGTH JMP ERR2 /LOOK UP FILE 2 TAD (NAME) DCA NAMEB TAD IDEVN2 CIF 10 JMS I (200) 2 /LOOKUP NAMEB, NAME /STARTING BLOCK 0 /-LENGTH JMP ERR2 /SAME LENGTH? TAD NAMEA+1 CIA TAD NAMEB+1 SZA CLA JMP BAD /NO /LENGTH = 0 ? TAD NAMEA+1 SZA CLA JMP CONTM /NO: OK /YES - PRINT MSG JMS PRFINA TAD (M4) JMS TY /COUNT FILES AS COMPARING OK ISZ CNT1 JMP GNND1 /AND CONTINUE BADFLG, 7777 /7777=NO BAD MATCH FOUND YET /FILES COMPARE BAD BAD, ISZ BADFLG /IS THIS THE 1ST BAD MATCH? JMP BAD1 /NO TAD (M5) /YES - PRINT HEADING FIRST JMS TY BAD1, JMS PRFINA JMS CR ISZ CNT3 JMP GNND1 /SET UP COMPARISON CONTM, TAD NAMEA+1 /-LENGTH CIA DCA T TAD NAMEA /STARTING BLOCK DCA CMB1 TAD NAMEB DCA CMB2 /COMPARE LOOP: /FILES STILL LARGE? CMLOOP, TAD (-BUFLEN) TAD T SMA SZA JMP CMPA /YES CLA /NO - LAST 'T' BLOCKS TAD T JMS CMPBUF /FILES COMPARE OK ISZ CNT1 JMP GNND1 /COMPARE NEXT BLOCKS OF LARGE FILE CMPA, DCA T TAD (BUFLEN) JMS CMPBUF JMP CMLOOP /COMPARE N BLOCKS OF FILE CMPBUF, 0 DCA T2 TAD T2 CLL RTR;RTR;RTR /BLOCKS*200 AND (3600) /MAKE SURE WRITE BIT IS NEVER SET TAD (F1) DCA CMF1 /FUNCTION CONTROL WORD TAD CMF1 TAD (F2-F1) DCA CMF2 /READ N BLOCKS OF FILE ON DEV1 JMS I IDEVH1 CMF1, 0 /FUNCTION CONTROL WD BUFFER /ADDR CMB1, 0 /BLOCK JMP ERR2 /READ DEV2 JMS I IDEVH2 CMF2, 0 BUFFER CMB2, 0 JMP ERR2 /UPDATE BLOCK NR TAD T2 TAD CMB1 DCA CMB1 TAD T2 TAD CMB2 DCA CMB2 /SETUP TO SCAN N BLOCKS TAD T2 CLL RTR;RTR;RAR /BLOCKS*400 = WORDS CIA DCA T2 TAD (BUFFER) DCA T3 /INNER COMPARE LOOP INCMP, CDF F1 TAD I T3 CIA CDF F2 TAD I T3 CDF CUR SZA CLA JMP BAD /WORDS NOT EQUAL ISZ T3 /ON TO THE NEXT WORD ISZ T2 JMP INCMP JMP I CMPBUF /ALL N BLOCKS COMPARE OK PAGE /NO MORE FILES ON DEV2 NNFD, ISZ CNT4 /COUNT ONE EXTRA FILE ON DEV1 JMP GNND1 /AND CONTINUE /NO MORE FILES ON DEV1 /SCAN DEV2 TO COUNT FILES ON DEV2 /INITIALIZE SCAN OF DIR 2 EP, TAD (SC1) DCA DIR2 /COUNT FILES EP1, TAD (DIR2-1) JMS SCAN JMP DONE ISZ CNT2 /COUNT TOTAL FILES ON DEV2 JMP EP1 /DONE: PRINT RESULTS DONE, JMS CR TAD CNT1 TAD CNT3 JMS PRN TAD (M8) JMS TY TAD CNT1 JMS PRN TAD (M9) JMS TY TAD CNT3 JMS PRN TAD (M10) JMS TY TAD CNT4 SNA JMP DONE1 JMS PRN TAD (M11) JMS TY DONE1, TAD CNT1 TAD CNT3 CIA TAD CNT2 SNA JMP DONE2 JMS PRN TAD (M12) JMS TY DONE2, JMS DUMP /DUMP OUTPUT BUFFER JMP 7605 /RETURN TO MONITOR PAGE /SUBROUTINES, ETC. /LOAD FROM FIELD 1 LD1, 0 TAD I LD1 ISZ LD1 DCA T CDF 10 TAD I T CDF CUR JMP I LD1 /LOAD FROM SYSTEM TABLE IN FIELD 1 LD2, 0 TAD I LD2 ISZ LD2 DCA T TAD I T TAD (7757) DCA LD2A JMS LD1 LD2A, 0 JMP I LD2 /TYPE BAD SYNTAX ERROR MESSAGE ERR1, CLA TAD (M2) JMS TYPE JMP RESTAR /TYPE I/O ERROR MESSAGE ERR2, CLA TAD (M3) JMS TYPE JMP 7605 /FETCH A DEVICE HANDLER INTO ITS BUFFER FETCH, 0 DCA 10 /SEE PARAMETERS BELOW TAD I 10 DCA FETCH1 TAD I 10 DCA T TAD I 10 DCA T2 TAD I T CIF 10 JMS I (200) 1 /FETCH FETCH1, 0 /BUFFER ADDR JMP ERR2 TAD FETCH1 DCA I T2 JMP I FETCH /PARAMETER LISTS FOR "FETCH" FE1, ODEVB+1 ODEVN ODEVH FE2, IDEVB1+1 IDEVN1 IDEVH1 FE3, IDEVB2+1 IDEVN2 IDEVH2 /MATCH NEXT TWO CHARS OF FILENAMES, AND STORE IN "NAME" NMTCH, 0 CDF F1 TAD I 11 CDF CUR DCA T TAD T DCA I 13 TAD T CDF F2 CIA TAD I 12 CDF CUR SNA CLA JMP I NMTCH JMP GNND2 /BAD MATCH - TRY NEXT ENTRY IN DIR2 /"CURRENT" FILENAME NAME, ZBLOCK 4 /FILE COUNTS CNT1, 0 /NR COMPARED OK CNT2, 0 /TOTAL NR ON DEV2 CNT3, 0 /NR COMPARED BAD CNT4, 0 /EXTRAS ON DEV1 /PRINT CURRENT FILE NAME PRFINA, 0 TAD (NAME-1) DCA 10 JMS PRFN2 JMS PRFN2 JMS PRFN2 TAD (".) JMS PR JMS PRFN2 JMP I PRFINA PRFN2, 0 TAD I 10 DCA T TAD T RTR;RTR;RTR JMS PRINTH TAD T JMS PRINTH JMP I PRFN2 PAGE /COROUTINE TO SCAN DIRECTORY / INPUT: AC=PARAM LIST-1 / OUTPUT: RETURN 1: DONE (NO MORE ENTRIES FOUND) / RETURN 2: NORMAL / 11=ADDR OF F1 ENTRY / 12=ADDR OF F2 ENTRY SCAN, 0 DCA 10 TAD 10 DCA 13 /FOR USE WHEN RETURNING TAD I 10 DCA SC TAD I 10 DCA ENTRY TAD I 10 DCA SC2 TAD I 10 DCA SC5 TAD I 10 DCA SIZE TAD I 10 DCA SEGM TAD I 10 DCA SCFLD TAD I 10 DCA ENTRYA SCFLD, CDF F1 /SET PROPER FIELD JMP I SC /CONTINUE COROUTINE SC, SC1 /ADDR OF CURRENT COROUTINE SECTION CDF CUR /RESET FIELD ON RETURN TAD SC /SAVE LOCAL VARIABLES DCA I 13 TAD ENTRY DCA I 13 TAD SC2 DCA I 13 TAD SC5 DCA I 13 TAD SIZE DCA I 13 TAD SEGM DCA I 13 /SCFLD AND ENTRYA DON'T CHANGE, SO AREN'T SAVED ISZ SCAN /NORMAL RETURN JMP I SCAN /INITIALIZE DIRECTORY SCAN SC1, DCA SEGM /SEGMENT 1, LOC X0000 TAD (-6) DCA SC2 /INIT SEGMENT SCAN SC3, TAD I SEGM /-NR ENTRIES SNA JMP SC4 DCA SC5 TAD (4) TAD SEGM DCA T TAD I T /-NR OF INFO WDS CIA TAD (5) /ENTRY SIZE DCA SIZE TAD T IAC /FIRST ENTRY ADDR JMP SC6 /LOCATE TO NEXT ENTRY SC7, TAD I ENTRY /IS CURRENT ENTRY EMPTY? SZA CLA JMP SC10 /NO - "SIZE" WDS LONG TAD (2) /YES - 2 WDS LONG SKP SC10, TAD SIZE TAD ENTRY SC6, DCA ENTRY /SKIP EMPTY FILE ENTRIES TAD I ENTRY SNA CLA JMP SC8 /SKIP TENTATIVE FILE ENTRIES STA TAD ENTRY TAD SIZE /ADDR OF FILE LENGTH WD DCA T TAD I T SNA CLA JMP SC8 /FOUND A FILE ENTRY /SAVE ENTRY POINTER FOR OUTPUT STA /AUTO-INDEXED REFERENCE TAD ENTRY ENTRYA, DCA 11 /OR DCA 12 /RETURN JMS SC /MORE ENTRIES? SC8, ISZ SC5 JMP SC7 /YES /NO - LOCATE TO NEXT SEGMENT SC4, TAD (2) TAD SEGM DCA T /ADDR OF LINK WD TAD I T SNA JMP SC11 /NO MORE SEGS /CONVERT BLOCK NR TO BASE ADDR FOR SEG TAD (-1) CLL RTR;RTR;RAR /(BLOCK-1)*400 DCA SEGM ISZ SC2 /HAVE 6 SEGS BEEN SCANNED? JMP SC3 /NO - OK /ERROR: ATTEMPT TO LINK TO MORE THAN 6 SEGMENTS (IGNORE) /OTHERWISE SCAN IS DONE SC11, CDF CUR /RESTORE FIELD JMP I SCAN /"DONE" RETURN /LOCAL VARIABLES FOR "SCAN" SC2, 0 /SEGMENT COUNTER SC5, 0 /ENTRY COUNTER SIZE, 0 /SIZE OF EACH ENTRY ENTRY, 0 /POINTER TO NEXT ENTRY SEGM, 0 /BASE ADDR OF CURRENT DIR SEG /PARAMETERS FOR CALLS TO "SCAN" DIR1, SC1 /INITIALIZE THIS LOC ZBLOCK 5 CDF F1 /FIELD OF DEV 1 STUFF DCA 11 /WHERE TO PUT ENTRY ADDR FOUND DIR2, SC1 /INITIALIZE THIS LOC ZBLOCK 5 CDF F2 DCA 12 PAGE /OUTPUT ROUTINES /PRINT CHAR / INPUT: AC=CHAR (7 OR 8 BIT) PR, 0 CDF PF DCA I PRBUFP IFDEF DEBUG < TAD I PRBUFP CDF CUR JMS PRINT> ISZ PRBUFP CDF CUR JMP I PR /DUMP OUTPUT BUFFER DUMP, 0 TAD (232) /CTRL/Z=END OF FILE JMS PR JMS I ODEVH 6600+PF /WRITE UP TO 26 PAGES, FIELD PF PRBUF /ADDR 1 /BLOCK (UNUSED) JMP ERR2 JMP I DUMP /CRLF CR, 0 TAD (215) JMS PR TAD (212) JMS PR JMP I CR /PRINT 4-DIGIT OCTAL NR PRN, 0 DCA CR TAD (-4) DCA DUMP PRN1, TAD CR RTL;RAL DCA CR TAD CR RAL AND (7) TAD ("0) JMS PR ISZ DUMP JMP PRN1 JMP I PRN /TYPE A MESSAGE TY, 0 DCA PRN TYP1, TAD I PRN RTR;RTR;RTR JMS TYP2 TAD I PRN JMS TYP2 ISZ PRN JMP TYP1 TYP2, 0 AND (77) SNA JMP I TY /<00>=TERMINATOR TAD (-37) /"_" MEANS END-OF-LINE (CRLF) SNA JMP TYP3 TAD (37) /RESTORE AC AFTER TEST JMS PRINTH JMP I TYP2 TYP3, JMS CR JMP I TYP2 /PRINT 6-BIT CHAR IN RIGHT HALF OF AC PRINTH, 0 AND (77) SZA TAD (240) AND (77) TAD (240) JMS PR JMP I PRINTH PAGE /TEXT STRINGS M2, TEXT "PLEASE USE FORMAT: LISTDEV: