home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol115 / compbin.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  8.2 KB  |  552 lines

  1. ;COMPBIN.ASM
  2. ;MOD OF COMPARE.ASM FOR BINARY FILES
  3. ;INCLUDES REPORTING AND ACCEPTANCE OF INSERTIONS,
  4. ;DELETIONS, ETC.
  5. ;
  6. ;COMPARE.ASM
  7. ;11/??/77 ORIGINALLY WRITTEN BY WARD CHRISTENSEN
  8. ;12/31/77 ADD PICKUP OF SECOND FILENAME IF BLANK
  9. ;01/08/77 ADD SEQIO MACLIB TO READ BIG BLOCKS
  10. ;09-09-82 MOD TO COMPBIN BY RUSS BAKKE
  11. ;
  12.     MACLIB    SEQIO
  13. BSIZE    EQU    1024    ;DISK BUFFER SIZE (TIMES 2)
  14.     ORG    100H
  15. ;
  16. ;MACRO DEFS
  17. PRINT    MACRO    ?L
  18.     LOCAL    Z
  19.     CALL    Z
  20.     IRP    ?M,<?L>
  21.     DB    ?M
  22.     ENDM
  23.     DB    '$'
  24. Z    POP    D
  25.     MVI    C,@MSG
  26.     CALL    @BDOS
  27.     ENDM
  28. ;
  29. GETF    MACRO    ?B,?P,?F,?E,?L,?N
  30.     LOCAL    Q,R,S
  31.     IF    NOT NUL ?B
  32.     LXI    H,?B
  33.     ENDIF
  34.     IF    NOT NUL ?P
  35.     SHLD    ?P
  36.     ENDIF
  37.     IF    NOT NUL ?L
  38.     LXI    B,?L
  39.     ENDIF
  40. Q    PUSH    B
  41.     PUSH    H
  42.     CALL    ?F
  43.     POP    H
  44.     POP    B
  45.     MOV    M,A
  46.     JZ    R    ;EOF
  47.     INX    H
  48.     DCX    B
  49.     MOV    A,B    ;DONE?
  50.     ORA    C
  51.     JNZ    Q    ;NO
  52.     JMP    S
  53. ;
  54. R    MVI    A,1    ;SET EOF FLAG
  55.     STA    ?E
  56. ;
  57. S    SHLD    ?N    ;SAVE EOF ADDR
  58.     ENDM
  59. ;
  60. REFILL    MACRO    ?B,?P,?E,?C
  61.     LOCAL    P
  62.     PUSH    D
  63.     SHLD    ?C
  64.     XCHG
  65.     LXI    B,8192    ;BUFFER SIZE
  66.     LHLD    ?P
  67.     PUSH    H
  68.     MOV    A,H    ;NEGATE HL
  69.     CMA
  70.     MOV    H,A
  71.     MOV    A,L
  72.     CMA
  73.     MOV    L,A
  74.     INX    H
  75.     DAD    D    ;ADD DE
  76.     LXI    D,?B
  77.     DAD    D    ;ADD BUFST
  78.     SHLD    ?C
  79.     POP    H
  80. P    MOV    A,M    ;MOVE CHAR
  81.     STAX    D
  82.     DCX    B    ;COUNT IT
  83.     INX    D    ;MOVE POINTERS
  84.     INX    H
  85.     CALL    ?E
  86.     JNZ    P
  87.     ENDM
  88. ;
  89. CKEOB    MACRO    ?E
  90.     PUSH    D
  91.     LXI    D,?E
  92.     CALL    CMPHD
  93.     POP    D
  94.     ENDM
  95. ;
  96. CKEOF    MACRO    ?E
  97.     PUSH    D
  98.     XCHG
  99.     LHLD    ?E
  100.     XCHG
  101.     CALL    CMPHD
  102.     POP    D
  103.     ENDM
  104. ;
  105. ;COMPBIN.ASM - COMPARES 2 BINARY FILES
  106. ;
  107. ;COMMAND FORMAT: COMPBIN NAME1 NAME2
  108. ;    IF NAME2 = NAME1 BUT IS ON B DISK,
  109. ;    JUST TYPE: COMPBIN NAME1 B:
  110. ;
  111.     LXI    SP,STACK    ;INIT STACK
  112. ;
  113.     PRINT    <'COMPBIN.COM 09-09-82',0DH,0AH>
  114. ;
  115. ;IF THE SECOND FCB IS BLANK,
  116. ;MOVE IN THE NAME FROM THE FIRST
  117. ;
  118.     LDA    @TFCB+17
  119.     CPI    ' '
  120.     JNZ    MOVE2    ;NOT BLANK
  121.     MVI    B,11
  122.     LXI    D,@TFCB+1
  123.     LXI    H,@TFCB+17
  124.     CALL    MOVER
  125. ;
  126. ;'DECLARE' BOTH FCB'S
  127. ;
  128. MOVE2    FILE    INFILE,FILE1,,1,,BSIZE
  129.     FILE    INFILE,FILE2,,2,,BSIZE
  130. ;
  131. ;COMPARE THE 2 FILES
  132. ;
  133. ;FIRST, READ 8K INTO FIRST BUFFER
  134.     GETF    BUF1ST,OK1,GETFILE1,EOF1FG,8192,EOF1
  135. ;READ 8K INTO SECOND BUFFER
  136.     GETF    BUF2ST,OK2,GETFILE2,EOF2FG,8192,EOF2
  137. ;
  138. ;NOW START COMPARE
  139.     LXI    H,BUF1ST
  140.     LXI    D,BUF2ST
  141. COMP    LDAX    D
  142.     CMP    M
  143.     JNZ    DIFFER
  144.     INX    H
  145.     INX    D
  146. ;ARE WE AT START OF NEW 8 BYTE BLOCK?
  147. ;(IN ORDER TO HANDLE MOVING POINTERS, WE
  148. ;KEEP POINTERS TO KNOWN GOOD DATA IN "OK1"
  149. ;& "OK2" TO THE START OF THE LAST GOOD 8
  150. ;BYTE BLOCK.  THIS BLOCK ALWAYS STARTS ON
  151. ;XXX0H ADDR IN FILE 1; IT MAY NOT IN FILE 2.)
  152. ;
  153.     MOV    A,L
  154.     ANI    7
  155.     CZ    EOBL
  156. ;
  157. ;ARE WE AT EOF (WHICH IS EITHER EOF LOCN
  158. ;OR END OF BUFFER)?
  159.     CALL    CKEOF1
  160.     JNZ    COMP1    ;NO
  161.     LDA    EOF1FG
  162.     ORA    A
  163.     JNZ    EOFFND    ;YES AND EOF LOADED, QUIT
  164.     CALL    EOBUF1
  165. ;
  166. COMP1    CALL    CKEOF2
  167.     JNZ    COMP2    ;NO
  168.     LDA    EOF2FG
  169.     ORA    A
  170.     JNZ    EOFFND
  171.     CALL    EOBUF2
  172. ;
  173. COMP2    JMP    COMP
  174. ;
  175. ;FOUND A DIFFERENCE;
  176. ;IF EOF IS NOT IN BUFFER, FIRST FORCE
  177. ;BUFFER FILL IN ORDER TO AVOID HITTING
  178. ;EOBUF IN DIFFERENCE PROCESSING
  179. DIFFER    LDA    EOF1FG
  180.     ORA    A    ;TEST 0
  181.     JNZ    DIFF1
  182. ;NOW SEE IF AT START OF BUFFER
  183.     PUSH    H
  184.     LHLD    OK1
  185.     CKEOB    BUF1ST
  186.     POP    H
  187.     CNZ    EOBUF1
  188. DIFF1    LDA    EOF2FG
  189.     ORA    A
  190.     JNZ    DIFF2
  191.     XCHG
  192.     PUSH    H
  193.     LHLD    OK2
  194.     CKEOB    BUF2ST
  195.     POP    H
  196.     XCHG
  197.     CNZ    EOBUF2
  198. ;
  199. ;IF WE ARE NOT AT START OF BLOCK IN FILE 1,
  200. ;STEP (STOP AT EOF)
  201. DIFF2    XCHG
  202.     SHLD    CURR2    ;SAVEDE
  203.     XCHG
  204.     MVI    C,8    ;REPEAT 8 TIMES
  205. DIFF3    INX    H;MOVE OFF SOB
  206.     CALL    GOSOB    ;GO TO NEXT SOB
  207.     XCHG
  208.     LHLD    CURR2    ;RESTORE DE
  209.     XCHG
  210. ;
  211. ;NOW SEE IF WE ARE AT EOF IN EITHER FILE
  212.     CALL    CKEOF1
  213.     JZ    DIFEOF
  214.     CALL    CKEOF2
  215.     JZ    DIFEOF
  216. ;
  217. ;NOW FIND EXTEND OF DIFFERENCE.
  218. ;COMPARE CURRENT BLOCK IN FILE 1 TO
  219. ;FILE 2.
  220. ;HL POINTS TO CURRENT BLOCK IN FILE 1,
  221. ;DE IN FILE 2
  222. ;INC DE UP TO 64 TIMES, COMPARING BYTE TO HL.
  223. ;IF A MATCH IS FOUND:
  224. ;  INC HL ALSO; LOOK FOR 8 MATCHES IN A ROW.
  225. ;  IF NOT FOUND RESTORE HL & CONTINUE. 
  226. ;  IF FOUND, EXIT.
  227. ;IF 64 INCREMENTS HIT,
  228. ;INC HL BY 8 & REPEAT TOTAL OF 8 TIMES.
  229. ;IF STILL NOT FOUND, GIVE UP.
  230. ;IF EOF HIT, EXIT.
  231. ;
  232.     MVI    B,64    ;8 BLOCKS OF 8 BYTES
  233. ;
  234. DIFF4    LDAX    D
  235.     CMP    M
  236.     CZ    BYTEM
  237.     JZ    MATCH
  238.     INX    D
  239.     CALL    CKEOF2
  240.     JZ    DIFEOF
  241.     DCR    B
  242.     JNZ    DIFF4
  243. ;
  244. ;NOT FOUND, NEXT BLOCK
  245.     DCR    C
  246.     JNZ    DIFF3
  247. ;
  248. ;STILL NO MATCH FOUND.  PRINT 8 BLOCKS
  249. ;FROM EACH BUFFER & EXIT.
  250. ;
  251. ;WE HAVE A DIFFERENCE AND ARE AT EOF IN A FILE
  252. ;PRINT FROM "LAST" POINTER TO EOF IN BOTH BUFFERS
  253. ;(STOP AFTER 8 BLOCKS)
  254. DIFEOF    LDA    ERFLG
  255.     ORA    A    ;TEST ERROR FLAG
  256.     JNZ    DIFE1
  257.     INR    A    ;SET IT
  258.     STA    ERFLG
  259.     PRINT    <'FILES UNEQUAL',0DH,0AH>
  260. DIFE1    PRINT    <'****** FILE 1:',0DH,0AH>
  261. ;PRINT FILE 1 FROM "LAST OK"
  262.     LHLD    EOF1
  263.     XCHG
  264.     LHLD    OK1
  265.     CALL    PRBUF
  266.     PRINT    <'*** FILE 2:',0DH,0AH>
  267.     LHLD    EOF2
  268.     XCHG
  269.     LHLD    OK2
  270.     CALL    PRBUF
  271.     JMP    EXIT
  272. ;
  273. ;BYTEM--HAVE MATCHING BYTE, MOVING DE IN
  274. ;ONE BUFFER, MATCHES HL IN OTHER BUFFER.
  275. ;WANT TO FIND 7 MORE MATCHING BYTES IN A ROW.
  276. ;RET Z IF SO.
  277. BYTEM    PUSH    H
  278.     PUSH    D
  279.     PUSH    B
  280.     MVI    B,7    ;MATCH 7 BYTES
  281. BML    INX    H
  282.     INX    D
  283.     LDAX    D
  284.     CMP    M
  285.     JNZ    BM2
  286.     DCR    B
  287.     JNZ    BML
  288. ;HAVE 7 MORE MATCHED BYTES (& Z SET)
  289. BM2    POP    B
  290.     POP    D
  291.     POP    H
  292.     RET
  293. ;
  294. ;PRBUF--PRINT BUFFER (AT HL) FOR 9 BLOCKS OR EOF
  295. ;ENTER WITH EOF ADDR IN DE
  296. PRBUF    MVI    B,9
  297. PRBUF1    PUSH    B
  298.     CALL    PRBLK    ;PRINT BLOCK
  299.     POP    B
  300.     JZ    PREOF    ;AT EOF?
  301.     DCR    B    ;COUNT BLOCK
  302.     JNZ    PRBUF1
  303.     RET
  304. ;
  305. ;PREOF--AT EOF IN PRINT
  306. PREOF    PRINT    <'*EOF',0DH,0AH>
  307.     RET
  308. ;
  309. ;PRBLK--PRINT BLOCK FROM HL
  310. ;LIMIT IN DE--RET Z IF HIT
  311. PRBLK    SHLD    TEMP    ;SAVE HL
  312. MVI    B,8    ;8 BYTES
  313. PRBLK1    CALL    CMPHD
  314.     RZ
  315.     MOV    A,M
  316.     INX    H
  317. ;DISPLAY A IN HEX
  318.     PUSH    PSW
  319.     RRC        ;SHIFT RIGHT 4
  320.     RRC
  321.     RRC
  322.     RRC
  323.     CALL    TAD
  324.     POP    PSW
  325.     CALL    TAD
  326.     MVI    A,' '
  327.     CALL    TYPE
  328.     DCR    B
  329.     JNZ    PRBLK1
  330. ;
  331. ;NOW DISPLAY LINE IN ASCII ('.' IF NOT PRINTABLE)
  332.     LHLD    TEMP
  333.     MVI    B,8    ;8 BYTES
  334. PRBLK2    MOV    A,M
  335.     INX    H
  336.     CPI    80H
  337.     JNC    NOPR
  338.     CPI    20H
  339.     JNC    PRBLK3
  340. ;
  341. NOPR    MVI    A,'.'    ;SUB '.' FOR NON-PRINTING
  342. PRBLK3    CALL    TYPE
  343.     DCR    B
  344.     JNZ    PRBLK2
  345.     CALL    CRLF
  346.     INR    A    ;CLEAR Z FLAG
  347.     RET
  348. ;
  349. ;TAD--TRANSLATE HEX TO ASCII & DISPLAY
  350. TAD    ANI    0FH    ;MASK
  351.     ADI    90H
  352.     DAA
  353.     ACI    40H
  354.     DAA
  355.     CALL    TYPE
  356.     RET
  357. ;
  358. CRLF    MVI    A,CR
  359.     CALL    TYPE
  360.     MVI    A,LF
  361. ;
  362. ;TYPE--DISPLAY CHAR IN A
  363. TYPE    PUSH    B
  364.     PUSH    D
  365.     PUSH    H
  366.     PUT    CON
  367.     POP    H
  368.     POP    D
  369.     POP    B
  370.     RET
  371. ;
  372. ;MATCH:  HAVE A MATCHED BLOCK.  HL & DE POINT
  373. ;TO START OF BLOCK.
  374. ;PRINT FROM OK1 & OK2 TO END OF DIFF.
  375. ;UPDATE OK1 & OK2 & RETURN TO COMPARE.
  376. MATCH    PUSH    H
  377.     PUSH    D
  378.     SHLD    CURR1    ;TEMP STORAGE
  379.     XCHG
  380.     SHLD    CURR2
  381. ;
  382. ;PRINT THE BUFFERS
  383.     LDA    ERFLG
  384.     ORA    A    ;TEST ERROR FLAG
  385.     JNZ    MAT1
  386.     INR    A    ;SET IT
  387.     STA    ERFLG
  388.     PRINT    <'FILES UNEQUAL',0DH,0AH>
  389. MAT1    PRINT    <'****** FILE 1:',0DH,0AH>
  390.     LHLD    CURR1
  391.     XCHG
  392. ;DE POINTS TO END OF BUFF1 TO BE PRINTED
  393.     LHLD    OK1
  394.     CALL    PRTOLM
  395.     PRINT    <'*** FILE 2:',0DH,0AH>
  396.     LHLD    CURR2    ;NOW BUFF 2
  397.     XCHG
  398.     LHLD    OK2
  399.     CALL    PRTOLM
  400. ;
  401. ;NOW UPDATE OK1, OK2, POINTERS
  402.     LHLD    CURR1
  403.     SHLD    OK1
  404.     LHLD    CURR2
  405.     SHLD    OK2
  406.     POP    D
  407.     POP    H
  408.     JMP    COMP    ;RETURN TO COMPARE LOOP
  409. ;
  410. ;PRTOLM--PRINT FROM HL TO LIMIT IN DE
  411. PRTOLM    CALL    PRBLK
  412.     JNZ    PRTOLM    ;NOT DONE
  413.     RET
  414. ;
  415. ;EOBL--MOVE POINTERS TO "LAST OK BLOCKS"
  416. EOBL    PUSH    H
  417.     PUSH    D
  418.     CALL    RETSBL    ;BACK UP TO PREVIOUS LINE
  419.     SHLD    OK1    ;SAVE IT
  420.     XCHG
  421.     CALL    RETSBL
  422.     SHLD    OK2
  423.     POP    D
  424.     POP    H
  425.     RET
  426. ;
  427. ;EOBUF1-END OF BUFFER 1
  428. ;COPY FROM "LAST OK BLOCK" POINTER THRU END
  429. ;OF BUFFER, TO START OF BUFFER;
  430. ;REFILL REST OF BUFFER
  431. ;KEEP POINTER TO CURRENT BYTE (NOW AT EOBUF)
  432. EOBUF1    REFILL    BUF1ST,OK1,CKEOB1,CURR1
  433. ;
  434. ;NOW FILL BUFFER
  435.     XCHG
  436.     GETF    ,,GETFILE1,EOF1FG,,EOF1
  437. ;
  438. ;SET UP POINTER OK1
  439.     LXI    H,BUF1ST
  440.     SHLD    OK1
  441.     LHLD    CURR1    ;NEW BUFFER PTR
  442.     POP    D    ;RECOVER
  443.     RET
  444. ;
  445. ;EOBUF2--END OF BUFFER2
  446. EOBUF2    XCHG
  447.     REFILL    BUF2ST,OK2,CKEOB2H,CURR2
  448.     XCHG
  449.     GETF    ,,GETFILE2,EOF2FG,,EOF2
  450.     LXI    H,BUF2ST
  451.     SHLD    OK2
  452.     LHLD    CURR2
  453.     XCHG
  454.     POP    H
  455.     RET
  456. ;
  457. ;CKEOB1--SEE IF HL IS AT END OF BUFF1
  458. ;(RET Z IF SO)
  459. CKEOB1    CKEOB    BUF1EN
  460.     RET
  461. ;
  462. ;CKEOF1--SEE IF HL IS AT END OF FILE1
  463. ;(EOBUF OR LOADED EOF)
  464. ;(RET Z IF SO)
  465. CKEOF1    CKEOF    EOF1
  466.     RET
  467. ;
  468. ;CKEOF2--SEE IF DE IS AT END OF FILE2
  469. CKEOF2    XCHG
  470.     CKEOF    EOF2
  471.     XCHG
  472.     RET
  473. ;
  474. ;CKEOB2H--SEE IF HL IS AT END OF BUFF2
  475. CKEOB2H    CKEOB    BUF2EN
  476.     RET
  477. ;
  478. ;EOFFND--AT EOF IN VALID COMPARE
  479. ;IF NO ERROR FLAG, PRINT OK & EXIT
  480. ;ELSE JUST EXIT
  481. EOFFND    LDA    ERFLG
  482.     ORA    A    ;SET FLAGS
  483.     JZ    AOK
  484.     JMP    EXIT
  485. ;
  486. ;A-OK - FILES MATCH
  487. ;
  488. AOK    PRINT    'FILES MATCH'
  489. EXIT    RST    0    ;RET TO CP/M
  490. ;
  491. ERXIT    POP    D    ;GET MESSAGE
  492.     MVI    C,@MSG
  493.     CALL    @BDOS
  494.     JMP    EXIT
  495. ;
  496. ;RETSBL--RET HL TO START OF BLOCK
  497. RETSBL    DCX    H    ;BACK TO PREV BLOCK
  498.     MOV    A,L
  499.     ANI    0F8H
  500.     MOV    L,A
  501.     RET
  502. ;
  503. ;GOSOB--INC HL TO START OF NEXT BLOCK OR EOF
  504. ;IN FILE 1
  505. GOSOB    MOV    A,L
  506.     ANI    7
  507.     RZ    ;THERE
  508.     INX    H
  509.     CALL    CKEOF1
  510.     RZ
  511.     JP    GOSOB
  512. ;
  513. ;CMPHD--COMPARE HL TO DE
  514. ;RETS Z IF EQ, C IF HL>DE
  515. CMPHD    MOV    A,D
  516.     SUB    H
  517.     RNZ
  518.     MOV    A,E
  519.     SUB    L
  520.     RET
  521. ;
  522. ;MOVE FROM (DE) TO (HL) LENGTH IN B
  523. MOVER    LDAX    D
  524.     MOV    M,A
  525.     INX    D
  526.     INX    H
  527.     DCR    B
  528.     JNZ    MOVER
  529.     RET
  530. ;
  531. ;DATA STORAGE
  532.     DS    80    ;STACK
  533. STACK    EQU    $
  534. OK1    DS    2    ;LAST VALID LINE, FILE1
  535. OK2    DS    2
  536. CURR1    DS    2    ;CURRENT LINE IN SEARCH
  537. CURR2    DS    2
  538. ERFLG    DB    0    ;ERROR FLAG
  539. EOF1    DS    2    ;EOF ADDR
  540. EOF2    DS    2
  541. EOF1FG    DB    0    ;EOF FLAGS
  542. EOF2FG    DB    0
  543. TEMP    DS    2
  544.     ORG    ($+15) AND 0FFF0H    ;TO 16 BYTE BOUNDARY
  545. BUF1ST    DS    8192
  546. BUF1EN
  547. BUF2ST    DS    8192
  548. BUF2EN
  549. BUFFERS    EQU    $
  550. MEMSIZE    EQU    BUFFERS+@NXTB
  551.     END
  552.