home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 26 / AACD 26.iso / AACD / System / XFD / Developer / Sources / ASM / Silmarils.a < prev    next >
Encoding:
Text File  |  2001-09-16  |  3.9 KB  |  232 lines

  1. *******************************************************
  2. **      XFD external decruncher for Silm Cruncher    **
  3. **        written by Mok and Wanted Team             **
  4. **        fixed by SDI in 1999-2001             **
  5. *******************************************************
  6.  
  7.  
  8.         INCLUDE    "AINCLUDE:IncDirs.i"
  9.         INCLUDE    "libraries/xfdmaster.i"
  10.  
  11.         * head function for tests
  12. *        INCLUDE    "xfdExeHead.a"
  13.  
  14. ; xfdForeman structure MUST be first thing in all external decrunchers
  15.  
  16. ForeMan        moveq    #-1,d0        ;security
  17.         rts
  18.         dc.l    XFDF_ID        ;id
  19.         dc.w    1        ;version
  20.         dc.w    0
  21.         dc.l    0,0        ;private
  22.         dc.l    S_Silm        ;first slave
  23.  
  24.         dc.b    "$VER: Silmarils 1.3 (09.06.2001) by Mok and Wanted Team",0
  25. N_Silm        dc.b    "Silmarils Data Cruncher",0
  26.         even
  27.  
  28. **************************************************
  29.  
  30. ; xfdSlave structure: this one doesn't support segment decrunching
  31.  
  32. S_Silm        dc.l    0        ;no more slaves
  33.         dc.w    2        ;version
  34.         dc.w    39        ;master version
  35.         dc.l    N_Silm        ;name
  36.         dc.w    XFDPFF_DATA|XFDPFF_USERTARGET|XFDPFF_RECOGLEN
  37.         dc.w    0
  38.         dc.l    RB_Silm        ;recog buffer
  39.         dc.l    DB_Silm        ;decrunch buffer
  40.         dc.l    0        ;recog segment
  41.         dc.l    0        ;decrunch segment
  42.         dc.w    0,0
  43.         dc.l    12+2
  44.  
  45.  
  46. ;-------------------------------------------------
  47.  
  48. ; Recog buffer function: receives buffer + length in a0/d0
  49.  
  50. RB_Silm        CMP.L    #$8087010B,(A0)    * BSD executable
  51.         BEQ.B    .Exit
  52.         CMP.L    #$8103010B,(A0) * SUN executable
  53.         BEQ.B    .Exit
  54.  
  55.         cmp.b    #$A1,(a0)
  56.         beq.s    .Check1
  57.         cmp.b    #$C0,(A0)
  58.         beq.s    .Check2
  59.         cmp.b    #$C1,(A0)
  60.         beq.s    .Check2
  61.         cmp.b    #$80,(A0)
  62.         beq.s    .Check2
  63.         cmp.b    #$81,(A0)
  64.         beq.b    .Check2
  65.         bra.b    .Exit
  66. .Check1
  67.         cmp.l    #$0B090A0B,6(A0)
  68.         bne.b    .Check3
  69.         cmp.l    #$07050607,10(A0)
  70.         bne.b    .Check3
  71. .Check2
  72.         cmp.w    #$0001,4(A0)
  73.         beq.b    .Check4
  74. .Check3
  75.         tst.w    4(A0)
  76.         bne.b    .Exit
  77.         cmp.l    #$003D0900,10(A0)
  78.         bne.b    .Exit
  79.  
  80. .Check4        move.l    (a0),d0            *** added by SDI
  81.         and.l    #$FFFFFF,d0
  82.         tst.b    6(A0)
  83.         bne.b    .No
  84.         subq.l    #8,D0
  85.         subq.l    #8,D0
  86. .No        subq.l    #6,D0
  87.         ble.b    .Exit
  88.  
  89.         MOVE.L    D0,xfdrr_FinalTargetLen(A1)
  90.         ADDI.L    #$1000,D0
  91.         MOVE.L    D0,xfdrr_MinTargetLen(A1)
  92.  
  93.         moveq    #1,d0
  94.         rts
  95.  
  96. .Exit        moveq    #0,d0
  97.         rts
  98.  
  99. ;-------------------------------------------------
  100.  
  101. ;Decrunch buffer function: receives bufferinfo in a0
  102.  
  103. DB_Silm        movem.l    d2-d7/a2-a6,-(a7)
  104.         move.l    xfdbi_UserTargetBuf(A0),A1
  105.         move.l    xfdbi_SourceBuffer(A0),A0
  106.         move.l    (a0),d1
  107.         and.l    #$FFFFFF,d1
  108.         move.b    (a0),d2
  109.         subq.l    #6,d1
  110.         addq.l    #6,a0
  111.         tst.b    (a0)
  112.         bne.s    .silm1
  113.         lea    $10(a0),a0
  114.         subq.l    #8,d1
  115.         subq.l    #8,d1
  116. .silm1        cmp.b    #$A1,d2
  117.         bne.b    .silm2
  118.         bsr.b    D_Silm
  119.         bra.b    .end
  120. .silm2        bsr.b    D_Silm2
  121. .end        moveq    #1,d0
  122.         movem.l    (a7)+,d2-d7/a2-a6
  123.         rts
  124.  
  125. **************************************************
  126.  
  127. D_Silm2    move.l    d1,d6
  128.     move.l    a1,a5
  129.     add.l    a1,d6
  130.     move.l    d6,a6
  131.     move.l    a0,a3
  132.     moveq    #1,d3
  133. .silm2    tst.w    d3
  134.     bmi.b    .end
  135.     move.b    (a3)+,d0
  136.     move.b    d0,d4
  137.     bmi.b    .silm4
  138.     ext.w    d4
  139.     subq.w    #1,d4
  140. .silm3    move.b    (a3)+,d0
  141.     bsr.b    sub2
  142.     dbra    d4,.silm3
  143.     bra.s    .silm2
  144. .silm4    and.w    #$7F,d4
  145.     subq.w    #1,d4
  146.     move.b    (a3)+,d0
  147. .silm5    bsr.b    sub2
  148.     dbra    d4,.silm5
  149.     bra.s    .silm2
  150. .end    rts
  151.  
  152. sub2    cmp.l    d6,a6
  153.     bge.b    .s2b
  154. .s2a    move.b    d0,(a6)+
  155.     rts
  156. .s2b    move.l    a5,a6
  157.     addq.w    #1,a6
  158.     sub.w    d3,a6
  159.     subq.w    #1,d3
  160.     bpl.s    .s2a
  161.     clr.w    d4
  162.     rts
  163.  
  164. D_Silm    move.l    a1,a2
  165.     add.l    d1,a2
  166.     subq.l    #1,a2
  167.     subq.l    #8,a7
  168.     move.l    (a0)+,(a7)
  169.     move.l    (a0)+,4(a7)
  170.     clr.w    d7
  171. .silm2    cmp.l    a2,a1
  172.     bgt.s    .end
  173.     moveq    #1,d0
  174.     bsr.s    sub1b
  175.     tst.b    d5
  176.     beq.s    .silm5
  177.     moveq    #0,d2
  178. .silm3    moveq    #2,d0
  179.     bsr.s    sub1b
  180.     add.w    d5,d2
  181.     cmp.w    #3,d5
  182.     beq.s    .silm3
  183. .silm4    moveq    #8,d0
  184.     bsr.s    sub1b
  185.     move.b    d5,(a1)+
  186.     dbf    d2,.silm4
  187.     cmp.l    a2,a1
  188.     bgt.s    .end
  189. .silm5    bsr.s    sub1
  190.     clr.w    d0
  191.     move.b    0(a7,d5.w),d0
  192.     and.w    #3,d5
  193.     beq.b    .silm8
  194.     move.w    d5,d2
  195.     bsr.s    sub1b
  196. .silm6    neg.w    d5
  197. .silm7    move.b    -1(a1,d5.w),(a1)+
  198.     dbf    d2,.silm7
  199.     bra.s    .silm2
  200. .end    addq.l    #8,a7
  201.     rts
  202.  
  203. .silm8    bsr.b    sub1b
  204.     move.w    d5,d3
  205.     clr.w    d2
  206. .silm9    bsr.s    sub1
  207.     add.w    d5,d2
  208.     cmp.w    #7,d5
  209.     beq.s    .silm9
  210.     move.w    d3,d5
  211.     addq.w    #4,d2
  212.     bra.s    .silm6
  213.  
  214. sub1    moveq    #3,d0
  215. sub1b    sub.b    d0,d7
  216.     bmi.s    .s1a
  217.     clr.w    d5
  218.     rol.l    d0,d5
  219.     rts
  220. .s1a    add.b    d0,d7
  221.     clr.w    d5
  222.     rol.l    d7,d5
  223.     swap    d5
  224.     move.w    (a0)+,d5
  225.     swap    d5
  226.     sub.b    d7,d0
  227.     moveq    #$10,d7
  228.     rol.l    d0,d5
  229.     sub.b    d0,d7
  230.     rts
  231.  
  232.