home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD2.bin / bbs / dev / ssl-4.1.lha / SSL / SSLExamp / FSort.asm < prev    next >
Assembly Source File  |  1994-07-01  |  3KB  |  224 lines

  1. ; File Sorting Utility 1.1
  2. ; (c) 1994 MJSoft System Software, Martin Mares
  3.  
  4. ;DEBUG    set    1
  5. _GlobVec    set    1
  6. ;GATHERTX    set    1
  7. ;TEXTRACT    set    1
  8.  
  9.     include    "ssmac.h"
  10.  
  11. QUANTLOG    equ    13
  12. QUANTUM    equ    1<<QUANTLOG
  13.  
  14.     clistart
  15.  
  16.     get.l    stdin,d7
  17.     dt    siname,<STDIN>
  18.     tpea    siname
  19.     get.l    ffrom,d1
  20.     beq.s    ReadInit
  21.     move.l    d1,a0
  22.     move.l    a0,(sp)
  23.     moveq    #OPEN_OLD,d0
  24.     call    TrackOpen
  25.     move.l    d0,d7
  26.     put.l    d1,srctrk
  27.     dv.l    srctrk
  28. ReadInit    moveq    #0,d6
  29.     moveq    #0,d5        ; Pointer to first block
  30.     moveq    #10,d4
  31.  
  32. ReadIn    moveq    #64,d0
  33.     lsl.l    #QUANTLOG-6,d0
  34.     move.l    d0,d3
  35.     call    TrackAllocPub
  36.     move.l    d0,a3
  37.     add.l    d0,d3
  38.     move.l    d5,(a3)
  39.     move.l    a3,d5
  40.     addq.l    #6,a3
  41.     move.l    a3,a4
  42.     bra.s    CPL
  43. CPL1    move.b    (a2)+,(a3)+
  44. CPL    dbf    d6,CPL1
  45.     move.l    d7,d1
  46.     move.l    a3,d2
  47.     sub.l    d2,d3
  48.     call    TestBreak
  49.     call    dos,Read
  50.     move.l    (v),a6
  51.     add.l    d0,a3
  52.     move.l    a3,d1
  53.     sub.l    a4,d1
  54.     move.w    d1,-(a4)
  55.     tst.l    d0
  56.     ble.s    EndOrErr
  57.     move.l    a3,d6
  58.     subq.w    #1,d0
  59. RIFindEOL    cmp.b    -(a3),d4
  60.     dbeq    d0,RIFindEOL
  61.     beq.s    RIFoundEOL
  62.     dtl    <Line too long>,a0
  63.     jump    ExitError
  64.  
  65. RIFoundEOL    addq.l    #1,a3
  66.     sub.l    a3,d6
  67.     sub.w    d6,(a4)
  68.     move.l    a3,a2
  69.     bra.s    ReadIn
  70.  
  71. EndOrErr    beq.s    PrepareIndex
  72.     moveq    #err_read,d0
  73. reperrsp    move.l    (sp),a1
  74.     jump    ss,ReportError
  75.  
  76. PrepareIndex    tst.w    (a4)
  77.     beq.s    LastLineOK
  78.     cmp.b    -1(a3),d4
  79.     beq.s    LastLineOK
  80.     move.b    d4,(a3)
  81.     addq.w    #1,(a4)
  82.  
  83. LastLineOK    move.l    d5,a0
  84.     moveq    #0,d0
  85. .pi    move.l    (a0)+,d1
  86.     move.w    (a0)+,d2
  87.     beq.s    .nx
  88.     subq.w    #1,d2
  89. .loop    cmp.b    (a0)+,d4
  90. .next    dbeq    d2,.loop
  91.     bne.s    .nx
  92.     addq.l    #1,d0
  93.     dbf    d2,.loop
  94. .nx    move.l    d1,a0
  95.     tst.l    d1
  96.     bne.s    .pi
  97.  
  98.     move.l    d0,d6
  99.     lsl.l    #2,d0
  100.     moveq    #64,d2
  101.     lsl.l    #4,d2
  102.     add.l    d2,d0
  103.     call    TrackAllocPub
  104.     move.l    d0,a4        ; A4=buf start
  105.     move.l    d0,a1
  106.     add.l    d2,a1
  107.     move.l    a1,a3        ; A3=buf limit
  108.     move.l    d5,a0
  109. .idx    move.l    (a0)+,d1
  110.     move.w    (a0)+,d2
  111.     beq.s    .nxx
  112.     subq.w    #1,d2
  113. .lin    move.l    a0,(a1)+
  114. .chr    cmp.b    (a0)+,d4
  115.     dbeq    d2,.chr
  116.     bne.s    .nxx
  117.     sf    -1(a0)
  118.     dbf    d2,.lin
  119. .nxx    move.l    d1,a0
  120.     tst.l    d1
  121.     bne.s    .idx
  122.  
  123.     move.l    d6,d0
  124.     move.l    a3,a0
  125.     lea    cmpf(pc),a1
  126.     tsv.l    case
  127.     beq.s    go1
  128.     lea    cmpfcase(pc),a1
  129. go1    moveq    #4,d1
  130.     call    QuickSort
  131.  
  132.     get.l    srctrk,a0
  133.     call    FreeObject
  134.     get.l    stdout,d7
  135.     dt    soname,<STDOUT>
  136.     tpea    soname
  137.     get.l    fto,d1
  138.     beq.s    wrt1
  139.     move.l    d1,a0
  140.     moveq    #OPEN_NEW,d0
  141.     move.l    a0,(sp)
  142.     call    TrackOpen
  143.     move.l    d0,d7
  144. wrt1    move.l    a4,a2        ; A2=buf current
  145.     subq.l    #1,d6
  146.     bmi.s    done
  147.     move.l    d6,d5
  148.     swap    d5
  149. wrt2    move.l    (a3)+,a0
  150. wrt3    cmp.l    a2,a3
  151.     bne.s    wrt4
  152.     push    a0
  153.     bsr.s    flushbuf
  154.     pop    a0
  155. wrt4    move.b    (a0)+,(a2)+
  156.     bne.s    wrt3
  157.     move.b    d4,-1(a2)
  158.     dbf    d6,wrt2
  159.     dbf    d5,wrt2
  160.  
  161. done    bsr.s    flushbuf
  162.     addq.l    #8,sp
  163.     rts
  164.  
  165. flushbuf    move.l    d7,d1
  166.     move.l    a4,d2
  167.     move.l    a2,d3
  168.     sub.l    d2,d3
  169.     beq.s    flubu1
  170.     call    ss,TestBreak
  171.     call    dos,Write
  172.     cmp.l    d0,d3
  173.     bne.s    wrterr
  174. flubu1    move.l    a4,a2
  175.     rts
  176.  
  177. wrterr    moveq    #err_write,d0
  178.     bra    reperrsp
  179.  
  180. cmpfcase    move.l    (a0),a0
  181.     move.l    (a1),a1
  182. caseloop    move.b    (a0)+,d0
  183.     beq.s    caseend
  184.     cmp.b    (a1)+,d0
  185.     beq.s    caseloop
  186.     bcs.s    bgta
  187. agtb    moveq    #1,d0
  188.     rts
  189. bgta    moveq    #-1,d0
  190.     rts
  191. caseend    tst.b    (a1)
  192.     bne.s    bgta
  193.     moveq    #0,d0
  194.     rts
  195.  
  196. cmpf    move.l    (a0),a0
  197.     move.l    (a1),a1
  198. cfloop    move.b    (a0)+,d0
  199.     beq.s    caseend
  200.     move.b    (a1)+,d1
  201.     cmp.b    #'a',d0
  202.     bcs.s    1$
  203.     cmp.b    #'z'+1,d0
  204.     bcc.s    1$
  205.     sub.b    #32,d0
  206. 1$    cmp.b    #'a',d1
  207.     bcs.s    2$
  208.     cmp.b    #'z'+1,d1
  209.     bcc.s    2$
  210.     sub.b    #32,d1
  211. 2$    cmp.b    d1,d0
  212.     beq.s    cfloop
  213.     bcs.s    bgta
  214.     bra.s    agtb
  215.  
  216.     dt    <$VER: FSort 1.1 © 1994 MJSoft System Software>
  217.     tags
  218.     template    <FROM,TO,CASE/S>
  219.     dv.l    ffrom
  220.     dv.l    fto
  221.     dv.l    case
  222.     finish
  223.     end
  224.