;COMPARE.ASM ;11/??/77 ORIGINALLY WRITTEN BY WARD CHRISTENSEN ;12/31/77 ADD PICKUP OF SECOND FILENAME IF BLANK ;01/08/77 ADD SEQIO MACLIB TO READ BIG BLOCKS BSIZE EQU 4096 ;DISK BUFFER SIZE (TIMES 2) ORG 100H MACLIB SEQIO MOVE MACRO ?F,?T,?L MVI B,?L LXI D,?F LXI H,?T CALL MOVER ENDM ;TYPE SINGLE CHAR OR CHAR IN A TYPE MACRO ?C IF NOT NUL ?C MVI A,?C ENDIF PUSH B PUSH D PUSH H PUT CON POP H POP D POP B ENDM PRINT MACRO ?L LOCAL Z CALL Z IRP ?M, DB ?M ENDM DB '$' Z POP D MVI C,@MSG CALL @BDOS ENDM ; ;COMPARE.ASM - COMPARES 2 FILES ; ;COMMAND FORMAT: COMPARE NAME1 NAME2 ; IF NAME2 = NAME1 BUT IS ON B DISK, ; JUST TYPE: COMPARE NAME1 B: ; PRINT <'COMPARE.COM 1/8/78',0DH,0AH> ; ;INIT STACK ; POP H ;GET CP/M RET ADDR SHLD EXIT+1 ;MODIFY RETURN ADDR LXI SP,STACK ;GET MY STACK ; ;IF THE SECOND FCB IS BLANK, ;MOVE IN THE NAME FROM THE FIRST ; LDA @TFCB+17 CPI ' ' JNZ MOVE2 ;NOT BLANK MOVE @TFCB+1,@TFCB+17,11 ; ;'DECLARE' BOTH FCB'S ; MOVE2 FILE INFILE,FILE1,,1,,BSIZE FILE INFILE,FILE2,,2,,BSIZE ; ;COMPARE THE 2 FILES 1 BYTE AT A TIME ; COMP CALL READ1 MOV B,A ;SAVE CHAR PUSH B CALL READ2 POP B CMP B JZ COMP ; ;FILES UNEQUAL ; UNEQUAL PRINT 'FILES UNEQUAL AFTER ' PRBYTES LXI D,BYTES MVI C,@MSG CALL @BDOS PRINT <'LAST DATA READ FROM FILE 1:',0DH,0AH> LHLD PRTPTR DCR L MVI B,0 PRTLP INR L MOV A,M CPI 0DH JZ GOTCR CPI 0AH JZ TYPEIT CPI 9 ;TAB JZ TYPEIT CPI ' ' JC HEX CPI 7FH JNC HEX TYPEIT TYPE LDA COL INR A STA COL CPI 60 JC NEXT XRA A STA COL PUSH B PUSH H PRINT <0DH,0AH> POP H POP B JMP NEXT GOTCR XRA A STA COL MVI A,0DH JMP TYPEIT HEX PUSH PSW ;SAVE CHAR TYPE '(' POP PSW PUSH PSW RAR RAR RAR RAR CALL NIBBL POP PSW CALL NIBBL LDA COL ADI 3 STA COL MVI A,')' JMP TYPEIT NEXT DCR B JNZ PRTLP JMP EXIT ; ;READ BYTE FROM FILE 1 ; READ1 GET FILE1 JZ EOF1 ;GOT EOF? LHLD PRTPTR MOV M,A INR L SHLD PRTPTR PUSH PSW ;SAVE CHAR LXI H,BYTES+5 READI MOV A,M ORI '0' ;IN CASE IT WAS BLANK INR A MOV M,A CPI '9'+1 ;TIME TO CARRY? JNZ READNC MVI M,'0' DCX H JMP READI READNC POP PSW RET ; ;EOF ON FILE 1 - SET FLAG, READ 2 ; EOF1 MVI A,'Y' STA EOFLG CALL READ2 PRINT <'EOF FILE 1, NOT FILE 2',0DH,0AH> JMP UNEQUAL ; READ2 GET FILE2 RNZ ;NO EOF ; ;GOT EOF ON FILE 2, MUST HAVE GOTTEN IT ON FILE 1 ; EOF2 LDA EOFLG CPI 'Y' JZ AOK PRINT <'EOF FILE 2 BEFORE FILE 1',0DH,0AH> JMP UNEQUAL ; ;A-OK - FILES MATCH ; AOK PRINT 'FILES MATCH, LENGTH IS ' LXI D,BYTES MVI C,@MSG CALL @BDOS ;NOTE THE FOLLOWING DOES NOT RESTORE CP/M'S ;STACK POINTER, BUT THAT IS 'OK' BECAUSE THE ;FIRST INSTRUCTION IN CP/M IS A LXI SP EXIT JMP $-$ ;CP/M RET ADDR (MODIFIED) ERXIT POP D ;GET MESSAGE MVI C,@MSG CALL @BDOS JMP EXIT NIBBL ANI 0FH CPI 10 JC NUM ADI 7 NUM ADI '0' TYPE RET ;MOVE FROM (DE) TO (HL) LENGTH IN B MOVER LDAX D MOV M,A INX D INX H DCR B JNZ MOVER RET EOFLG DB 'N' COL DB 0 BYTES DB ' BYTES',0DH,0AH,'$' PRTPTR DW BUFF DS 30 ;STACK STACK EQU $ ;ORG TO PAGE BECAUSE 'INR L' USED TO LOOP THRU IT ORG ($+255) AND 0FF00H ;TO PAGE BUFF EQU $ REPT 16 DB ' ' ENDM BUFFERS EQU $ MEMSIZE EQU BUFFERS+@NXTB END