home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol256 / comp68.s < prev    next >
Encoding:
Text File  |  1986-03-22  |  6.5 KB  |  381 lines

  1.         .ttl    COMPARE TWO FILES
  2.  
  3.  
  4. * os interface
  5.  
  6. sysreset    equ    0
  7. conout        equ    2
  8. pstring        equ    9
  9. fopen        equ    15
  10. fclose        equ    16
  11. readsequ    equ    20
  12. setdma        equ    26
  13.  
  14.  
  15. * base page offsets
  16.  
  17. deffcb1        equ    $5c            * 1st parsed fcb
  18. deffcb2        equ    $38            * 2nd parsed fcb
  19.  
  20.  
  21. * registers
  22.  
  23. position    equ    d5
  24. f1dmaptr    equ    a3
  25. f2dmaptr    equ    a4
  26. f1fcbptr    equ    a5
  27. f2fcbptr    equ    a6
  28.  
  29.  
  30. * ascii characters
  31.  
  32. lf        equ    $0a
  33. cr        equ    $0d
  34.  
  35.  
  36. * misc. constants
  37.  
  38. blank        equ    $20
  39. eof        equ    $ff
  40. sequrec        equ    32            * current record offset
  41. sectsize    equ    128
  42. bufsize        equ    128            * sectors/buffer
  43.  
  44.  
  45.     .text
  46.  
  47. start:
  48.     move.l    4(sp),a0        * ^base page
  49.     bsr    setup
  50.     bsr    tryopen            * exit on failure
  51. mainloop:
  52.     bsr    f1rd8sct        * read file1 sectors
  53.     bsr    f2rd8sct        * read file2 sectors
  54.     bsr    compsect        * compare sectors, exit on eof
  55.     bra    mainloop
  56.  
  57.  
  58. setup:
  59.     lea    deffcb1(a0),a1        * ^first parsed fcb
  60.     lea    file1fcb,f1fcbptr    * ^fcb of file1
  61.     move.l    f1fcbptr,a2
  62.     bsr    xferfcb
  63.     lea    deffcb2(a0),a1        * ^2nd parsed fcb
  64.     lea    file2fcb,f2fcbptr    * ^fcb of file2
  65.     move.l    f2fcbptr,a2
  66.     bsr    xferfcb
  67.     lea    file1dma,f1dmaptr    * ^file1 dma address
  68.     lea    file2dma,f2dmaptr    * ^file2 dma address
  69.     moveq    #0,position        * position counter
  70.     rts
  71.  
  72.  
  73. xferfcb:
  74.     movem.l    d0/a1-a2,-(sp)
  75.     moveq    #12,d0            * drive code & filespec
  76. xferloop:
  77.     move.b    (a1)+,(a2)+
  78.     subq.b    #1,d0
  79.     bne    xferloop
  80.     movem.l    (sp)+,d0/a1-a2
  81.     rts
  82.  
  83.  
  84. tryopen:
  85.     move.l    f1fcbptr,d1
  86.     bsr    openfile
  87.     tst.b    d0
  88.     bpl    trynext
  89.     move.l    #f1nftxt,d1
  90.     bra    exit
  91.  
  92.  
  93. trynext:
  94.     move.l    f2fcbptr,d1
  95.     bsr    openfile
  96.     tst.b    d0
  97.     bpl    goodtry
  98.     move.l    #f2nftxt,d1
  99.  
  100.  
  101. exit:
  102.     moveq    #pstring,d0
  103.     bsr    bdos
  104.     moveq    #sysreset,d0
  105.     trap    #2
  106.  
  107.  
  108. goodtry:
  109.     clr.b    sequrec(f1fcbptr)    * clear current record
  110.     clr.b    sequrec(f2fcbptr)    * field in fcbs
  111.     rts
  112.  
  113.  
  114. openfile:
  115.     moveq    #fopen,d0
  116.     bsr    bdos
  117.     rts
  118.  
  119.  
  120. f1rd8sct:
  121.     movem.l    d0-d1/f1dmaptr,-(sp)
  122.     clr.b    f1sctib            * reset sect in buf count
  123. f1rd8lp:
  124.     move.l    f1dmaptr,d1
  125.     moveq    #setdma,d0
  126.     bsr    bdos            * set dma address
  127.     move.l    f1fcbptr,d1
  128.     moveq    #readsequ,d0
  129.     bsr    bdos            * read 1 logical sector
  130.     tst.b    d0            * eof?
  131.     bne    f1rd8ex            * yes, exit
  132.     addq.b    #1,f1sctib        * update sector count
  133.     cmp.b    #bufsize,f1sctib    * buffer full?
  134.     beq    f1rd8ex            * yes, exit
  135.     add.l    #sectsize,f1dmaptr    * update ^dma buffer
  136.     bra    f1rd8lp            * go for next sector
  137.  
  138. f1rd8ex:
  139.     movem.l    (sp)+,d0-d1/f1dmaptr
  140.     rts
  141.  
  142.  
  143. f2rd8sct:
  144.     movem.l    d0-d1/f2dmaptr,-(sp)
  145.     clr.b    f2sctib            * reset sect in buf count
  146. f2rd8lp:
  147.     move.l    f2dmaptr,d1
  148.     moveq    #setdma,d0
  149.     bsr    bdos            * set dma address
  150.     move.l    f2fcbptr,d1
  151.     moveq    #readsequ,d0
  152.     bsr    bdos            * read 1 logical sector
  153.     tst.b    d0            * eof?
  154.     bne    f2rd8ex            * yes
  155.     addq.b    #1,f2sctib        * update sector count
  156.     cmp.b    #bufsize,f2sctib    * buffer full?
  157.     beq    f2rd8ex            * yes, exit
  158.     add.l    #sectsize,f2dmaptr    * update ^dma buffer
  159.     bra    f2rd8lp
  160.  
  161. f2rd8ex:
  162.     movem.l    (sp)+,d0-d1/f2dmaptr
  163.     rts
  164.  
  165.  
  166. ltoahx:
  167.     movem.l    d0-d1/position/a0,-(sp)
  168.     lea    postring+6,a0        * ^ascii 'hex' string
  169.     moveq    #5,d0            * length counter
  170. ltoahxlp:
  171.     move.b    position,d1
  172.     bsr    makeascii        * convert 1 nibble
  173.     move.b    d1,-(a0)        * store it
  174.     lsr.l    #4,position        * prep next nibble
  175.     dbf    d0,ltoahxlp        * do all 6 nibbles
  176.     movem.l    (sp)+,d0-d1/position/a0
  177.     rts
  178.  
  179.  
  180. btohx:
  181.     move.b    d0,d1
  182.     bsr    makeascii        * convert lo nibble
  183.     exg    d0,d1
  184.     lsr.b    #4,d1            * move hi to lo nibble
  185.     bsr    makeascii        * convert hi nibble
  186.     rts
  187.  
  188.  
  189. makeascii:
  190.     and.b    #$0f,d1            * mask hi nibble
  191.     add.b    #'0',d1            * 0 becomes '0', etc.
  192.     cmp.b    #'9',d1            * >'9'?
  193.     ble    makeasc1        * no
  194.     addq.b    #7,d1            * $10 becomes 'A', etc.
  195. makeasc1:
  196.     rts
  197.  
  198.  
  199. compsect:
  200.     movem.l    d0-d2/a3-a4,-(sp)
  201.     move.b    f1sctib,d6        * file 1 sectors in buf
  202.     move.b    f2sctib,d7        * file 2 sectors in buf
  203. cmpsctlp:
  204.     move.b    #128,d2            * sector length
  205. cpbytelp:
  206.     move.b    (f1dmaptr),d0
  207.     cmp.b    (f2dmaptr),d0        * bytes equal?
  208.     beq    cmpsctup        * yes, just updt ptrs
  209.     cmp.b    #blank,d0        * printing char?
  210.     bcs    npchr1            * no
  211.     cmp.b    #$7f,d0            * > printing char?
  212.     bcc    npchr1            * yes, do not print
  213.     move.b    d0,f1asc        * is printing char
  214.     bra    npchr11
  215.  
  216. npchr1:
  217.     move.b    #blank,f1asc        * substitute blank
  218. npchr11:
  219.     bsr    btohx
  220.     move.b    d1,f1hxhi        * store hi asc 'nibble'
  221.     move.b    d0,f1hxlo        * store lo asc 'nibble'
  222.     move.b    (f2dmaptr),d0        * file2 byte
  223.     cmp.b    #blank,d0        * printing char?
  224.     bcs    npchr2            * no
  225.     cmp.b    #$7f,d0            * > printing char?
  226.     bcc    npchr2            * yes, do not print
  227.     move.b    d0,f2asc        * is printing char
  228.     bra    npchr21
  229.  
  230. npchr2:
  231.     move.b    #blank,f2asc        * substitute blank
  232. npchr21:
  233.     bsr    btohx
  234.     move.b    d1,f2hxhi        * store hi asc 'nibble'
  235.     move.b    d0,f2hxlo        * store lo asc 'nibble'
  236.     bsr    ltoahx            * conv posn to ascii
  237.     bsr    ppostrng        * print string incl '$'
  238. cmpsctup:
  239.     addq.l    #1,f1dmaptr        * ^next byte
  240.     addq.l    #1,f2dmaptr
  241.     addq.l    #1,position
  242.     subq.b    #1,d2            * done complete sector?
  243.     bne    cpbytelp        * no, loop
  244.     subq.b    #1,d6            * sector count file 1
  245.     beq    tsteof            * file 1 buffer done
  246.     subq.b    #1,d7            * sector count file 2
  247.     bne    cmpsctlp        * compare next sector
  248.     move.l    #f2tstxt,d1        * premature end of file 2
  249.     bra    exit
  250.  
  251. tsteof:
  252.     subq.b    #1,d7            * file 2 sector count
  253.     cmp.b    d6,d7            * both zero?
  254.     bhi    f1peof            * premature eof file 1
  255.     cmp.b    #bufsize,f1sctib    * were both buffers full?
  256.     bne    botheof            * no, must be both eof
  257.     movem.l    (sp)+,d0-d2/a3-a4
  258.     rts
  259.  
  260.  
  261. f1peof:
  262.     move.l    #f1tstxt,d1
  263.     bra    exit        * print txt & exit
  264.  
  265. botheof:
  266.     move.l    #eoptxt,d1
  267.     bra    exit
  268.  
  269.  
  270. ppostrng:
  271.     movem.l    d0-d1/a0,-(sp)        * print string incl '$'
  272.     moveq    #0,d1
  273.     lea    postxt,a0        * ^string
  274. ppostrlp:
  275.     move.b    (a0)+,d1
  276.     beq    exppostr        * end of string
  277.     moveq    #conout,d0
  278.     bsr    bdos
  279.     bra    ppostrlp
  280.  
  281. exppostr:
  282.     movem.l    (sp)+,d0-d1/a0
  283.     rts
  284.  
  285.  
  286. bdos:
  287.     movem.l    d1-d7/a0-a6,-(sp)
  288.     trap    #2
  289.     movem.l    (sp)+,d1-d7/a0-a6
  290.     rts
  291.  
  292.  
  293.     .data
  294.  
  295. file1fcb:
  296.     dc.b    0            * drive code
  297.     dc.b    'filename'        * file name
  298.     dc.b    'one'            * file type
  299.     dc.b    0            * extent #
  300.     dc.b    0            * s1, reserved
  301.     dc.b    0            * s2, reserved
  302.     dc.b    0            * rc, reserved
  303.     ds.b    16            * d0-dn, reserved
  304.     dc.b    0            * current sequ. record
  305.     dc.b    0,0,0            * r0,r1,r2 (r. access)
  306.  
  307.     .even
  308.  
  309. file2fcb:
  310.     dc.b    0            * drive code
  311.     dc.b    'filename'        * file name
  312.     dc.b    'two'            * file type
  313.     dc.b    0            * extent #
  314.     dc.b    0            * s1, reserved
  315.     dc.b    0            * s2, reserved
  316.     dc.b    0            * rc, reserved
  317.     ds.b    16            * d0-dn, reserved
  318.     dc.b    0            * current sequ. record
  319.     dc.b    0,0,0            * r0,r1,r2 (r. access)
  320.  
  321.  
  322. f1sctib:
  323.     dc.b    0            * file 1 buffer fill count
  324. f2sctib:
  325.     dc.b    0            * file 2 buffer fill count
  326.  
  327.  
  328. f1nftxt:
  329.     dc.b    'First file not found.'
  330.     dc.b    cr,lf,'$'
  331.  
  332. f2nftxt:
  333.     dc.b    'Second file not found.'
  334.     dc.b    cr,lf,'$'
  335.  
  336. f1tstxt:
  337.     dc.b    'Premature end of first file.'
  338.     dc.b    cr,lf,'$'
  339.  
  340. f2tstxt:
  341.     dc.b    'Premature end of second file.'
  342.     dc.b    cr,lf,'$'
  343.  
  344. eoptxt:
  345.     dc.b    'End of program.'
  346.     dc.b    cr,lf,'$'
  347.  
  348. postxt:
  349.     dc.b    'Position  '
  350. postring:
  351.     dc.b    '000000    '
  352. f1text:
  353.     dc.b    'File 1 = '
  354. f1hxhi:
  355.     dc.b    '0'
  356. f1hxlo:
  357.     dc.b    '0 '
  358. f1asc:
  359.     dc.b    '       '
  360.  
  361. f2text:
  362.     dc.b    'File 2 = '
  363. f2hxhi:
  364.     dc.b    '0'
  365. f2hxlo:
  366.     dc.b    '0 '
  367. f2asc:
  368.     dc.b    ' '
  369.     dc.b    cr,lf,0
  370.  
  371.     .even
  372.  
  373.     .bss
  374.  
  375. file1dma:
  376.     ds.b    sectsize*bufsize
  377. file2dma:
  378.     ds.b    sectsize*bufsize
  379.  
  380.     .end
  381.