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

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