home *** CD-ROM | disk | FTP | other *** search
/ Fish 'n' More 2 / fishmore-publicdomainlibraryvol.ii1991xetec.iso / dirs / a68kex_431.lzh / A68Kex / cmp.asm < prev    next >
Assembly Source File  |  1991-01-17  |  15KB  |  596 lines

  1. *****************************************
  2. *                                       *
  3. * cmp - compare two files               *
  4. *                                       *
  5. * written by E. Lenz                    *
  6. *            Johann-Fichte-Strasse 11   *
  7. *            8 Munich 40                *
  8. *            Germany                    *
  9. *                                       *
  10. *****************************************
  11.  
  12.       XREF Disasm1,_Request
  13.  
  14. _AbsExecBase     equ 4
  15.  
  16. *****EXEC*******
  17.  
  18. _LVOForbid       equ -$84
  19. _LVOPermit       equ -$8a
  20. _LVOGetMsg       equ -$174
  21. _LVOReplyMsg     equ -$17a
  22. _LVOWaitPort     equ -$180
  23. _LVOCloseLibrary equ -$19e
  24.  
  25. _LVOOpenLibrary  equ -$228
  26.  
  27. *****DOS*****
  28.  
  29. _LVOOpen         equ -$1e
  30. _LVOClose        equ -$24
  31. _LVORead         equ -$2a
  32. _LVOWrite        equ -$30
  33.  
  34. pr_MsgPort       equ $5c
  35. pr_CLI           equ $ac
  36. ThisTask         equ $114
  37. VBlankFrequency  equ $212
  38. MODE_OLDFILE     equ 1005
  39.  
  40.          movea.l a0,a5             save instruction from CLI
  41.          move.l  d0,d4
  42.  
  43.          movea.l _AbsExecBase,a6   test if WB or CLI
  44.          movea.l ThisTask(a6),a0
  45.          tst.l   pr_CLI(a0)
  46.          bne.s   isCLI
  47.  
  48.          lea     pr_MsgPort(a0),a0 for WB get WB Message
  49.          jsr     _LVOWaitPort(a6)
  50.          jsr     _LVOGetMsg(a6)
  51.          move.l  d0,WBenchMsg
  52.          moveq   #1,d4             make sure there's no instruction
  53.  
  54. isCLI    cmpi.b  #60,VBlankFrequency(a6) test if PAL or NTSC
  55.          beq.s   isNTSC
  56.          move.l  #'256/',window+12
  57.  
  58. isNTSC   lea     dosname(pc),a1    open DOS library
  59.          moveq   #0,d0
  60.          jsr     _LVOOpenLibrary(a6)
  61.          move.l  d0,dosbase
  62.          beq.s   Gexit
  63.  
  64.          movea.l d0,a6             open Console window
  65.          move.l  #window,d1
  66.          move.l  #MODE_OLDFILE,d2
  67.          jsr     _LVOOpen(a6)
  68.          move.l  d0,conhandle
  69. Gexit    beq     exit
  70.  
  71.          subq.l  #1,d4
  72.          beq.s   noinst            no instruction from CLI
  73.  
  74.          lea     file1(pc),a0      transfer input file name
  75.          moveq   #0,d2
  76. trans1   move.b  (a5)+,d0
  77.          cmpi.b  #' ',d0
  78.          beq.s   toFile
  79.          move.b  d0,(a0)+
  80.          addq.l  #1,d2
  81.          subq.l  #1,d4
  82.          bne.s   trans1
  83.  
  84. toFile   move.b  #$a,(a0)+
  85.          move.l  d2,f1length
  86. toFile1  subq.l  #1,d4
  87.          beq.s   noinst
  88.          move.b  (a5)+,d0
  89.          cmpi.b  #' ',d0
  90.          beq.s   toFile1
  91.  
  92.          lea     file2(pc),a0
  93. trans2   move.b  d0,(a0)+
  94.          move.b  (a5)+,d0
  95.          addq.l  #1,f2length
  96.          cmpi.b  #$a,d0
  97.          beq.s   Parse
  98.          subq.l  #1,d4
  99.          bne.s   trans2
  100.  
  101.  
  102. noinst   moveq   #0,d0
  103.          move.l  #160,d1
  104.          moveq   #18,d2
  105.          lea     first(pc),a0
  106.          jsr     _Request
  107.          moveq   #-1,d0
  108.          lea     file1(pc),a1
  109. f1       addq.l  #1,d0
  110.          move.b  (a0)+,(a1)+
  111.          bne.s   f1
  112.          move.l  d0,f1length
  113.  
  114.          moveq   #0,d0
  115.          move.l  #160,d1
  116.          moveq   #18,d2
  117.          lea     second(pc),a0
  118.          jsr     _Request
  119.          moveq   #-1,d0
  120.          lea     file2(pc),a1
  121. f2       addq.l  #1,d0
  122.          move.b  (a0)+,(a1)+
  123.          bne.s   f2
  124.          move.l  d0,f2length
  125.          bra.s   noParse
  126.  
  127. Parse    lea     file1(pc),a0      zero behind strings
  128. Floop    cmpi.b  #$a,(a0)+
  129.          bne.s   Floop
  130.          clr.b   -(a0)
  131.  
  132.          lea     file2(pc),a0
  133. Gloop    cmpi.b  #$a,(a0)+
  134.          bne.s   Gloop
  135.          clr.b   -(a0)
  136.  
  137. noParse  move.l  #file1,d1         open first file
  138.          move.l  #MODE_OLDFILE,d2
  139.          jsr     _LVOOpen(a6)
  140.          move.l  d0,InFile
  141.          beq.s   exit
  142.  
  143.          move.l  #file2,d1         open second file
  144.          move.l  #MODE_OLDFILE,d2
  145.          jsr     _LVOOpen(a6)
  146.          move.l  d0,OutFile
  147.          beq.s   exit
  148.  
  149.          move.l  f1length(pc),d0
  150.          lea     file1(pc),a0
  151.          move.b  #$a,0(a0,d0)
  152.  
  153.          move.l  f2length(pc),d0
  154.          lea     file2(pc),a0
  155.          move.b  #$a,0(a0,d0)
  156.  
  157.          moveq   #0,d4
  158.          clr.w   Micro
  159.  
  160.          bsr.s   Compare
  161.  
  162. exit     move.l  conhandle(pc),d1  close console
  163.          beq.s   FileIn
  164.          jsr     _LVOClose(a6)
  165.  
  166. FileIn   move.l  InFile(pc),d1     close input file
  167.          beq.s   noIn
  168.          jsr     _LVOClose(a6)
  169.  
  170. noIn     move.l  OutFile(pc),d1    close output file
  171.          beq.s   noOut
  172.          jsr     _LVOClose(a6)
  173.  
  174. noOut    move.l  _AbsExecBase,a6
  175.          move.l  WBenchMsg(pc),d7
  176.          beq.s   NoBench
  177.          jsr     _LVOForbid(a6)    reply to WB
  178.          movea.l d7,a1
  179.          jsr     _LVOReplyMsg(a6)
  180.          jsr     _LVOPermit(a6)
  181.  
  182. NoBench  move.l  dosbase(pc),a1    close dos.lib
  183.          jsr     _LVOCloseLibrary(a6)
  184.          moveq   #0,d0
  185.          rts
  186.  
  187. *****ROUTINES******
  188.  
  189. Compare  move.l  InFile(pc),d1     fill buffer
  190.          move.l  #Buffer2,d2
  191.          moveq   #80,d3
  192.          jsr     _LVORead(a6)
  193.          move.l  d0,BufNum2
  194.          move.l  NextRel(pc),RelAddr
  195.          add.l   d0,NextRel
  196.  
  197.          move.l  OutFile(pc),d1
  198.          move.l  #Inst,d2
  199.          moveq   #80,d3
  200.          jsr     _LVORead(a6)
  201.          cmp.l   BufNum2(pc),d0
  202.          bne.s   length
  203.          tst.l   d0
  204.          beq.s   issame
  205.  
  206.          lea     Buffer2(pc),a0
  207.          lea     Inst(pc),a1
  208.          subq.l  #1,d0
  209.          moveq   #0,d5
  210. cmpl1    addq.l  #1,d4
  211.          addq.l  #1,d5
  212.          cmpm.b  (a0)+,(a1)+
  213.          bne.s   differ
  214. cmplp    dbra    d0,cmpl1
  215.          bra.s   Compare
  216.  
  217. issame   tst.l   difr
  218.          bne.s   yyy
  219.          move.l  #same,d2
  220.          moveq   #22,d3
  221.          bra.s   xxx
  222.  
  223. length   move.l  #NoLength,d2
  224.          moveq   #16,d3
  225. xxx      move.l  conhandle(pc),d1  write message to console
  226.          jsr     _LVOWrite(a6)
  227. yyy      move.l  conhandle(pc),d1  wait until keypressed
  228.          move.l  #align2,d2
  229.          moveq   #2,d3
  230.          jsr     _LVORead(a6)
  231.  
  232.          rts
  233.  
  234. differ   movem.l d0/d4-d5/a0-a1,-(a7)
  235.          move.l  #1,difr
  236.          move.l  #diff,d2
  237.          moveq   #17,d3
  238.          move.l  conhandle(pc),d1  write message to console
  239.          jsr     _LVOWrite(a6)
  240.          move.l  #Hextxt,d6
  241.          subq.l  #1,d4
  242.          bsr     decout
  243.          bsr     hex
  244.          move.l  #ata,d2
  245.          moveq   #24,d3
  246.          move.l  conhandle(pc),d1  write message to console
  247.          jsr     _LVOWrite(a6)
  248.  
  249. ; ASCII difference
  250.  
  251.          move.l  #file1,d2
  252.          move.l  f1length(pc),d3
  253.          addq.l  #1,d3
  254.          move.l  conhandle(pc),d1
  255.          jsr     _LVOWrite(a6)
  256.          lea     Buffer2(pc),a0
  257.          bsr     Ascii
  258.  
  259.          move.l  #file2,d2
  260.          move.l  f2length(pc),d3
  261.          addq.l  #1,d3
  262.          move.l  conhandle(pc),d1
  263.          jsr     _LVOWrite(a6)
  264.          lea     Inst(pc),a0
  265.          bsr     Ascii
  266.  
  267. ; HEX difference
  268.  
  269.          move.l  #file1,d2
  270.          move.l  f1length(pc),d3
  271.          addq.l  #1,d3
  272.          move.l  conhandle(pc),d1
  273.          jsr     _LVOWrite(a6)
  274.          lea     Buffer2(pc),a1
  275.          bsr     HexOut
  276.  
  277.          move.l  #file2,d2
  278.          move.l  f2length(pc),d3
  279.          addq.l  #1,d3
  280.          move.l  conhandle(pc),d1
  281.          jsr     _LVOWrite(a6)
  282.          lea     Inst(pc),a1
  283.          bsr     HexOut
  284.  
  285. ; press key for disassembled
  286.  
  287.          move.l  #key,d2
  288.          moveq   #32,d3
  289.          move.l  conhandle(pc),d1
  290.          jsr     _LVOWrite(a6)
  291.  
  292.          move.l  conhandle(pc),d1  wait until keypressed
  293.          move.l  #OutBuf,d2
  294.          moveq   #2,d3
  295.          jsr     _LVORead(a6)
  296.  
  297. ; disassembled difference
  298.  
  299.          lea     file1(pc),a0
  300.          lea     OutBuf(pc),a1
  301.          moveq   #0,d0
  302.          move.l  f1length(pc),d1
  303.          subq.l  #1,d1
  304. tran1    move.b  (a0)+,(a1)+
  305.          addq.l  #1,d0
  306.          dbra    d1,tran1
  307. clr1     cmpi.l  #40,d0
  308.          bge.s   filetwo
  309.          move.b  #' ',(a1)+
  310.          addq.l  #1,d0
  311.          bra.s   clr1
  312. filetwo  lea     file2(pc),a0
  313.          move.l  f2length(pc),d1
  314. tran2    move.b  (a0)+,(a1)+
  315.          addq.l  #1,d0
  316.          dbra    d1,tran2
  317.  
  318.          move.l  #OutBuf,d2
  319.          move.l  d0,d3
  320.          move.l  conhandle(pc),d1
  321.          jsr     _LVOWrite(a6)
  322.  
  323.          move.l  #Buffer2,d4       begin file 1
  324.          move.l  #Inst,d6          begin file 2
  325.          move.l  RelAddr(pc),d7    relative address
  326.          move.l  d7,-(a7)
  327.  
  328. DisLp    lea     Begin(pc),a0
  329.          move.l  d4,(a0)
  330.          move.l  d7,RelAddr
  331.          jsr     Disasm1
  332.          move.l  Begin(pc),d4
  333.          move.l  RelAddr(pc),d7
  334.          lea     Buffer(pc),a0
  335.          lea     OutBuf(pc),a1
  336.          moveq   #6,d1
  337. rela     move.b  (a0)+,(a1)+
  338.          dbra    d1,rela
  339.          lea     Buffer+40,a0
  340.          moveq   #39,d1
  341. trns1    move.b  (a0)+,(a1)+
  342.          dbra    d1,trns1
  343.  
  344.          lea     Begin(pc),a0
  345.          move.l  d6,(a0)
  346.          jsr     Disasm1
  347.          move.l  Begin(pc),d6
  348.          lea     Buffer+40,a0
  349.          lea     OutBuf+40,a1
  350.          moveq   #28,d1
  351. trns2    move.b  (a0)+,(a1)+
  352.          dbra    d1,trns2
  353.          move.b  #$a,(a1)
  354.          sub.w   Total(pc),d5
  355.          bgt.s   WriteOut
  356.  
  357.          lea     invtext(pc),a0    invert line
  358.          lea     Out1(pc),a1
  359.          moveq   #8,d0
  360. invt1    move.b  (a0)+,(a1)+
  361.          dbra    d0,invt1
  362.          lea     Out2(pc),a1
  363.          moveq   #8,d0
  364. invt2    move.b  (a0)+,(a1)+
  365.          dbra    d0,invt2
  366.          move.b  #$a,(a1)
  367.          moveq   #100,d5
  368.          move.l  #Out1,d2
  369.          moveq   #88,d3
  370.          bra.s   ReWrite
  371.  
  372. WriteOut move.l  #OutBuf,d2
  373.          moveq   #70,d3
  374. ReWrite  move.l  conhandle(pc),d1
  375.          jsr     _LVOWrite(a6)
  376.  
  377.          cmpi.l  #align2,d4
  378.          blt     DisLp
  379.  
  380.          move.l  #yes,d2
  381.          moveq   #18,d3
  382.          move.l  conhandle(pc),d1  write message to console
  383.          jsr     _LVOWrite(a6)
  384.  
  385.          move.l  conhandle(pc),d1  wait until keypressed
  386.          move.l  #align2,d2
  387.          moveq   #2,d3
  388.          jsr     _LVORead(a6)
  389.  
  390.          move.l  (a7)+,RelAddr
  391.          movem.l (a7)+,d0/d4-d5/a0-a1
  392.          move.b  align2(pc),d1
  393.          cmpi.b  #'n',d1
  394.          beq.s   Gcmp
  395.          cmpi.b  #'N',d1
  396.          bne     cmplp
  397.  
  398. Gcmp     rts
  399.  
  400.  
  401. ; decimal  output
  402.  
  403. decout   move.l  d4,-(a7)
  404.          lea     OutBuf(pc),a0
  405.          moveq   #0,d0
  406. wrlop    andi.l  #$ffff,d4
  407.          tst.l   d4
  408.          beq.s   back
  409.          divu    #10,d4
  410.          swap    d4
  411.          move.b  d4,(a0)+
  412.          swap    d4
  413.          addq.l  #1,d0
  414.          bra.s   wrlop
  415.  
  416. back     tst.l   d0                   zero is a special case
  417.          bne.s   bakk
  418.          addq.l  #1,d0
  419.          clr.b   OutBuf
  420. bakk     movea.l d6,a0
  421.          moveq   #6,d1
  422.          subq.l  #1,d0
  423. clr      cmp.l   d0,d1
  424.          beq.s   endclr
  425.          move.b  #' ',-(a0)
  426.          subq.l  #1,d1
  427.          bra.s   clr
  428.  
  429. endclr   lea     OutBuf(pc),a1
  430. rewlop   move.b  (a1)+,d1
  431.          addi.b  #'0',d1
  432.          move.b  d1,-(a0)
  433.          dbra    d0,rewlop
  434.          move.l  (a7)+,d4
  435.          rts
  436.  
  437. ; HEX output
  438.  
  439. hex      lea     hex1(pc),a0
  440.          move.l  d4,d0
  441.          andi.l  #$f000,d0
  442.          lsr.l   #8,d0
  443.          lsr.l   #4,d0
  444.          bsr.s   byte
  445.          andi.l  #$f00,d0
  446.          lsr.l   #8,d0
  447.          bsr.s   byte
  448. real     move.l  d4,d0
  449.          andi.l  #$f0,d0
  450.          lsr.l   #4,d0
  451.          bsr.s   byte
  452.          andi.l  #$f,d0
  453.  
  454. byte     cmpi.b  #9,d0
  455.          ble.s   bok
  456.          addq.l  #7,d0
  457. bok      addi.l  #'0',d0
  458.          move.b  d0,(a0)+
  459.          move.l  d4,d0
  460.          rts
  461.  
  462. ; write Ascii
  463.  
  464. Ascii    lea     OutBuf(pc),a1
  465.          moveq   #79,d1
  466.          move.l  d5,-(a7)
  467. Asc1     move.b  (a0)+,d0             get byte
  468.          move.b  d0,d2
  469.          andi.b  #$7f,d2
  470.          cmpi.b  #$20,d2
  471.          bge.s   isok
  472.          moveq   #$2e,d0
  473. isok     subq.l  #1,d5
  474.          bne.s   nextAsc
  475.          bsr.s   invert
  476. nextAsc  move.b  d0,(a1)+             write ASCII
  477.          dbra    d1,Asc1
  478.          move.l  (a7)+,d5
  479.          move.b  #$a,(a1)
  480.          move.l  #OutBuf,d2
  481.          moveq   #99,d3
  482.          move.l  conhandle(pc),d1
  483.          jsr     _LVOWrite(a6)
  484.          rts
  485.  
  486. invert   movem.l d1/a0,-(a7)
  487.          lea     invtext(pc),a0
  488.          moveq   #8,d1
  489. inv1     move.b  (a0)+,(a1)+
  490.          dbra    d1,inv1
  491.          move.b  d0,(a1)+
  492.          moveq   #7,d1
  493. inv2     move.b  (a0)+,(a1)+
  494.          dbra    d1,inv2
  495.          move.b  (a0),d0
  496.          movem.l (a7)+,d1/a0
  497.          rts
  498.  
  499. ; write Hex
  500.  
  501. HexOut   lea     OutBuf(pc),a0
  502.          moveq   #79,d1
  503.          moveq   #0,d4
  504.          move.l  d5,-(a7)
  505. Hex1     move.b  (a1)+,d4             get byte
  506.          subq.l  #1,d5
  507.          bne.s   nextHex
  508.          bsr.s   invh
  509.          bra.s   nexth
  510. nextHex  bsr     real
  511. nexth    dbra    d1,Hex1
  512.          move.l  (a7)+,d5
  513.          move.b  #$a,(a0)
  514.          move.l  #OutBuf,d2
  515.          move.l  #179,d3
  516.          move.l  conhandle(pc),d1
  517.          jsr     _LVOWrite(a6)
  518.          rts
  519.  
  520. invh     movem.l d1/a1,-(a7)
  521.          lea     invtext(pc),a1
  522.          moveq   #8,d1
  523. inv3     move.b  (a1)+,(a0)+
  524.          dbra    d1,inv3
  525.          bsr     real
  526.          moveq   #8,d1
  527. inv4     move.b  (a1)+,(a0)+
  528.          dbra    d1,inv4
  529.          movem.l (a7)+,d1/a1
  530.          rts
  531.  
  532. dosbase    dc.l 0
  533. conhandle  dc.l 0
  534. InFile     dc.l 0
  535. OutFile    dc.l 0
  536. WBenchMsg  dc.l 0
  537. NextRel    dc.l 0
  538. difr       dc.l 0
  539.  
  540. key        dc.b $a,' press RETURN for disassembled',$a
  541. yes        dc.b $a,' press N to exit',$a
  542.  
  543. invtext    dc.b $9b,'0;31;43',$6d,$9b,'0;31;40',$6d
  544.  
  545. NoLength   dc.b 'different length'
  546. same       dc.b 'the files are the same'
  547. diff       dc.b 'the files differ',$a
  548. ata        dc.b 'at  FFFFFF'
  549. Hextxt     dc.b ' or HEX: '
  550. hex1       dc.b 'FFFF',$a
  551.            cnop 0,2
  552.  
  553. f1length   dc.l 0
  554. file1      ds.b 80       file names
  555. f2length   dc.l 0
  556. file2      ds.b 80
  557.  
  558. Inst       ds.b 80
  559.  
  560. BufNum2    dc.l 0
  561. Buffer2    ds.b 80
  562. align2     ds.b 1
  563. Out1       ds.b 9
  564. OutBuf     ds.b 69
  565. Out2       ds.b 131
  566.  
  567. ; Communication structure
  568.  
  569. Begin      ds.l 1            Begin of disassembly
  570. RelAddr    ds.l 1            Relative address
  571. Micro      ds.w 1            Microprocessor type
  572. OpCode     ds.w 1            Opcode translation
  573. Type1      ds.w 1            Type of 1st operand
  574. Len1       ds.w 1            Length of 1st address
  575. Addr1      ds.l 1            1st address
  576. Type2      ds.w 1            Type of 2nd operand
  577. Len2       ds.w 1            Length of 2nd operand
  578. Addr2      ds.l 1            2nd address
  579. Total      ds.w 1            Total no of bytes
  580. Buffer     ds.b 40           Output buffer
  581.  
  582. dosname    dc.b 'dos.library',0
  583.            cnop 0,2
  584.  
  585. window     dc.b 'CON:0/0/639/199/Compare files',0
  586.            cnop 0,2
  587.  
  588. first      dc.b 'cmp two files - first file',0
  589.            even
  590.  
  591. second     dc.b 'cmp two files - second file',0
  592.            even
  593.  
  594.            end
  595.  
  596.