home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / xfd_developer / sources / asm / silmarils.a < prev    next >
Encoding:
Text File  |  2000-06-27  |  4.5 KB  |  292 lines

  1. *******************************************************
  2. **      XFD external decruncher for Silm Cruncher    **
  3. **        written by Mok and Wanted Team             **
  4. **          fixed by SDI in 1999           **
  5. *******************************************************
  6.  
  7.  
  8.         INCLUDE    "AINCLUDE:IncDirs.i"
  9.         INCLUDE    "libraries/xfdmaster.i"
  10.         INCLUDE    "lvo.i"
  11.  
  12.         * head function for tests
  13. *        INCLUDE    "xfdExeHead.a"
  14.  
  15. ; xfdForeman structure MUST be first thing in all external decrunchers
  16.  
  17. ForeMan        moveq    #-1,d0        ;security
  18.         rts
  19.         dc.l    XFDF_ID        ;id
  20.         dc.w    1        ;version
  21.         dc.w    0
  22.         dc.l    0,0        ;private
  23.         dc.l    S_Silm        ;first slave
  24.  
  25.         dc.b    "$VER: Silmarils 1.1 (12.07.1999) by Mok and Wanted Team",0
  26. N_Silm        dc.b    "Silmarils Data Cruncher",0
  27.         even
  28.  
  29. **************************************************
  30.  
  31. ; xfdSlave structure: this one doesn't support segment decrunching
  32.  
  33. S_Silm        dc.l    0        ;no more slaves
  34.         dc.w    1        ;version
  35.         dc.w    33        ;master version
  36.         dc.l    N_Silm        ;name
  37.         dc.w    XFDPFF_DATA    ;flags
  38.         dc.w    0
  39.         dc.l    RB_Silm        ;recog buffer
  40.         dc.l    DB_Silm        ;decrunch buffer
  41.         dc.l    0        ;recog segment
  42.         dc.l    0        ;decrunch segment
  43.  
  44.  
  45. ;-------------------------------------------------
  46.  
  47. ; Recog buffer function: receives buffer + length in a0/d0
  48.  
  49. RB_Silm        cmp.l    #12+2,d0
  50.         ble.s    .Exit
  51.         
  52.         CMP.L    #$8087010B,(A0)    * BSD executable
  53.         BEQ.B    .Exit
  54.         CMP.L    #$8103010B,(A0) * SUN executable
  55.         BEQ.B    .Exit
  56.  
  57.         cmp.b    #$A1,(a0)
  58.         beq.s    .Check1
  59.         cmp.b    #$C0,(A0)
  60.         beq.s    .Check2
  61.         cmp.b    #$C1,(A0)
  62.         beq.s    .Check2
  63.         cmp.b    #$80,(A0)
  64.         beq.s    .Check2
  65.         cmp.b    #$81,(A0)
  66.         beq.b    .Check2
  67.         bra.b    .Exit
  68. .Check1
  69.         cmp.l    #$0B090A0B,6(A0)
  70.         bne.b    .Check3
  71.         cmp.l    #$07050607,10(A0)
  72.         bne.b    .Check3
  73. .Check2
  74.         cmp.w    #$0001,4(A0)
  75.         beq.b    .Ok
  76. .Check3
  77.         tst.w    4(A0)
  78.         bne.b    .Exit
  79.         cmp.l    #$003D0900,10(A0)
  80.         bne.b    .Exit
  81. .Ok
  82.         moveq    #1,d0
  83.         rts
  84.  
  85. .Exit        moveq    #0,d0
  86.         rts
  87.  
  88. ;-------------------------------------------------
  89.  
  90. ;Decrunch buffer function: receives bufferinfo in a0
  91.  
  92. DB_Silm        movem.l    d2-d7/a2-a6,-(a7)
  93.         move.l    a0,a5
  94.         move.l    xfdbi_SourceBuffer(a5),a2
  95.  
  96.         move.l    (a2),d0
  97.         and.l    #$FFFFFF,d0
  98.         subq.l    #6,D0
  99.         tst.b    6(A2)
  100.         bne.b    No
  101.         subq.l    #8,D0
  102.         subq.l    #8,D0
  103. No
  104.         move.l    d0,xfdbi_TargetBufSaveLen(a5)
  105.         add.l    #$1000,d0
  106.         move.l    d0,xfdbi_TargetBufLen(a5)
  107.  
  108.         move.l    xfdbi_TargetBufMemType(a5),d1
  109.         move.l    4.w,a6
  110.         jsr    -198(a6)
  111.         move.w    #XFDERR_NOMEMORY,xfdbi_Error(a5)
  112.         move.l    d0,xfdbi_TargetBuffer(a5)
  113.         beq.s    .Exit
  114.  
  115.         move.l    d0,a1
  116.         move.l    a2,a0
  117.         bsr.s    D_Silm
  118.  
  119.         moveq    #1,d0
  120. .Exit        movem.l    (a7)+,d2-d7/a2-a6
  121.         rts
  122.  
  123. **************************************************
  124.  
  125. ; decruncher adapted by Mok
  126.  
  127. D_Silm
  128. depack:
  129.     move.l    (a0),d1
  130.     and.l    #$FFFFFF,d1
  131.     cmp.b    #$A1,(A0)
  132.     bne.w    dec2                ;+
  133. ;    move.b    (a0),d0
  134. ;    and.b    #$F0,d0
  135. ;    cmp.b    #$80,d0
  136. ;    beq.w    dec2
  137.     move.l    a0,-(sp)
  138.     subq.l    #6,d1
  139.     addq.l    #6,a0
  140.     tst.b    (a0)
  141.     bne.s    niee
  142.     lea    $10(a0),a0
  143. ;    sub.l    #$10,d1
  144.     subq.l    #8,d1                ;+
  145.     subq.l    #8,d1                ;+
  146. niee:
  147.     move.l    a1,a2
  148.     add.l    d1,a2
  149.     subq.l    #1,a2
  150.     lea    VC038(pc),a5
  151.     move.l    (a0)+,(a5)
  152.     move.l    (a0)+,4(a5)
  153.     clr.w    d7
  154.     movem.l    d1/a1,-(sp)
  155.     bsr.s    LBFD8
  156.     movem.l    (sp)+,d0/a1
  157.     move.l    (sp)+,a0
  158.     rts
  159. LBFD8
  160.     cmp.l    a2,a1
  161.     bgt.s    LBF98
  162.     moveq    #1,d0
  163.     bsr.s    LC042
  164.     tst.b    d5
  165.     beq.s    LC000
  166.     moveq    #0,d2
  167. LBFE6
  168.     moveq    #2,d0
  169.     bsr.s    LC042
  170.     add.w    d5,d2
  171.     cmp.w    #3,d5
  172.     beq.s    LBFE6
  173. LBFF2
  174.     moveq    #8,d0
  175.     bsr.s    LC042
  176.     move.b    d5,(a1)+
  177.     dbf    d2,LBFF2
  178.     cmp.l    a2,a1
  179.     bgt.s    LBF98
  180. LC000
  181.     bsr.s    LC040
  182.     clr.w    d0
  183.     move.b    0(a5,d5.w),d0
  184.     and.w    #3,d5
  185.     beq.b    LC020
  186.     move.w    d5,d2
  187.     bsr.s    LC042
  188. LC014
  189.     neg.w    d5
  190. LC016
  191.     move.b    -1(a1,d5.w),(a1)+
  192.     dbf    d2,LC016
  193.     bra.s    LBFD8
  194. LBF98
  195.     rts
  196. LC020
  197.     bsr.b    LC042
  198.     move.w    d5,d3
  199.     clr.w    d2
  200. LC028
  201.     bsr.s    LC040
  202.     add.w    d5,d2
  203.     cmp.w    #7,d5
  204.     beq.s    LC028
  205.     move.w    d3,d5
  206.     addq.w    #4,d2
  207.     bra.s    LC014
  208. LC040
  209.     moveq    #3,d0
  210. LC042
  211.     sub.b    d0,d7
  212.     bmi.s    LC04C
  213.     clr.w    d5
  214.     rol.l    d0,d5
  215.     rts
  216. LC04C
  217.     add.b    d0,d7
  218.     clr.w    d5
  219.     rol.l    d7,d5
  220.     swap    d5
  221.     move.w    (a0)+,d5
  222.     swap    d5
  223.     sub.b    d7,d0
  224.     moveq    #$10,d7
  225.     rol.l    d0,d5
  226.     sub.b    d0,d7
  227.     rts
  228. VC038
  229.     dcb.l    $2,0
  230. ;
  231. dec2:
  232.     move.l    d1,d0
  233.     movem.l    d0-d7/a0-a6,-(sp)
  234.     subq.l    #6,d1
  235.     addq.l    #6,a0
  236.     tst.b    (a0)                ;+
  237.     bne.s    LBEE0                ;+
  238.     lea    $10(a0),a0            ;+
  239.     subq.l    #8,d1                ;+
  240.     subq.l    #8,d1                ;+
  241.  
  242. LBEE0
  243.     move.l    d1,d6
  244.     move.l    a1,a5
  245.     add.l    a1,d6
  246.     move.l    d6,a6
  247.     move.l    a0,a3
  248. LBF12
  249.     moveq    #1,d3
  250. LBF18
  251.     tst.w    d3
  252.     bmi.b    LBF4E
  253.     bsr.b    LBF54
  254.     move.b    d0,d4
  255.     bmi.b    LBF3A
  256.     ext.w    d4
  257.     subq.w    #1,d4
  258. LBF2C
  259.     bsr.b    LBF54
  260.     bsr.b    LBF76
  261.     dbra    d4,LBF2C
  262.     bra.s    LBF18
  263. LBF3A
  264.     and.w    #$7F,d4
  265.     subq.w    #1,d4
  266.     bsr.b    LBF54
  267. LBF44
  268.     bsr.b    LBF76
  269.     dbra    d4,LBF44
  270.     bra.s    LBF18
  271. LBF4E
  272.     movem.l    (sp)+,d0-d7/a0-a6
  273.     rts
  274. LBF54
  275.     move.b    (a3)+,d0
  276.     rts
  277. LBF76
  278.     cmp.l    d6,a6
  279.     bge.b    LBF86
  280. LBF7C
  281.     move.b    d0,(a6)+
  282.     rts
  283. LBF86
  284.     move.l    a5,a6
  285.     addq.w    #1,a6
  286.     sub.w    d3,a6
  287.     subq.w    #1,d3
  288.     bpl.s    LBF7C
  289.     clr.w    d4
  290.     rts
  291. endy:
  292.