home *** CD-ROM | disk | FTP | other *** search
/ telefisk.org / virusCollection.lzx / VirusResearch / Cjezus-virus / decompressor.asm < prev    next >
Assembly Source File  |  2012-06-07  |  3KB  |  120 lines

  1. *********************************************************************
  2. ;  a0 source
  3. ;  a1 target
  4.  
  5.         movem.l    d2-d7/a2-a6,-(sp)
  6.         move.l    (a0)+,d0
  7.         bsr    decompress
  8.         movem.l    (sp)+,d2-d7/a2-a6
  9.         rts
  10.  
  11. ;;;
  12. ;;;                Remarks
  13. ;;;                =======
  14. ;;;
  15. ;;;   * This code relies on XPK_MARGIN being >= 32 !!!
  16. ;;;     If only one Bit in the last ControlWord is used, the remaining 15
  17. ;;;     will be filled with 0.  This will result in 15 LiteralItems on
  18. ;;;     decompression.  In Addition to this there is NO CHECK, if a match
  19. ;;;     matches more than the input.  This can result in a match which is
  20. ;;;     17 Bytes to long giving a maximum total of 32 Bytes garbled after
  21. ;;;     the outputblock after decompresion.
  22. ;;;       (XPK_MARGIN is 256 in xpkmaster.library V2.0)
  23. ;;;
  24.  
  25. ;                                ;Register Map
  26. ;                                ;============
  27. ;  a0    Points to next source      byte.
  28. ;  a1    Points to next destination byte.
  29. ;  a2    Temporary.
  30. ;  a3    Unused.
  31. ;  a4    Pointer for the input word stream.
  32. ;  a5    Unused.
  33. ;  a6    Stackframe linkage register. Don't touch!
  34. ;  a7    Stack pointer.
  35.  
  36. ;  d0    Length of the compressed.
  37. ;  d1    control Word
  38. ;  d2    Counter for halfunrolled decompress_16_items_loop.
  39. ;  d3    Temporary used to calculate copy item length.
  40. ;  d4    Temporary used to calculate copy item offset.
  41. ;  d5    Unused.
  42. ;  d6    Unused.
  43. ;  d7    Unused.
  44.  
  45. ;;;---------------------------------------------------------------------------
  46.  
  47. decompress:
  48.  
  49.     move.l    d0,a4
  50.     add.l    a0,a4        ;a4:=behind the end of input block
  51.  
  52.     moveq.l    #0,d4        ;d4:=0
  53.  
  54. ;;;---------------------------------------------------------------------------
  55.  
  56. DOCOPY MACRO
  57.     move.w    -(a4),d4    ;Grab the copy item description
  58.     moveq    #$0F,d3
  59.     and.b    d4,d3        ;extract length.
  60.     add.b    d3,d3        ;adjust length to length*2
  61.     lsr.w    #4,d4        ;extract offset
  62.  
  63.     move.l    a1,a2        ;Subtract the offset yielding the
  64.     suba.l    d4,a2        ;address from which we copy.
  65.     jmp    MOVE\@(PC,d3.w)    ;jump to the right place
  66. MOVE\@    move.b    (a2)+,(a1)+    ;0
  67.     move.b    (a2)+,(a1)+    ;1
  68.     move.b    (a2)+,(a1)+    ;2
  69.     move.b    (a2)+,(a1)+    ;3
  70.     move.b    (a2)+,(a1)+    ;4
  71.     move.b    (a2)+,(a1)+    ;5
  72.     move.b    (a2)+,(a1)+    ;6
  73.     move.b    (a2)+,(a1)+    ;7
  74.     move.b    (a2)+,(a1)+    ;8
  75.     move.b    (a2)+,(a1)+    ;9
  76.     move.b    (a2)+,(a1)+    ;10
  77.     move.b    (a2)+,(a1)+    ;11
  78.     move.b    (a2)+,(a1)+    ;12
  79.     move.b    (a2)+,(a1)+    ;13
  80.     move.b    (a2)+,(a1)+    ;14
  81.     move.b    (a2)+,(a1)+    ;15
  82.     move.b    (a2)+,(a1)+
  83.     move.b    (a2)+,(a1)+
  84.     ENDM
  85.  
  86. DOLITERAL MACRO
  87.     move.b    (a0)+,(a1)+    ;Literal item means copy a byte.
  88.     ENDM
  89.  
  90.     ;This loop processes one 16-item item group per iteration.
  91.     ;This loop terminates when we definitely have decompressed all
  92.     ;16-item blocks.  It may overwrite 15+17 innocent bytes AFTER the
  93.     ;end of outbuf.
  94.  
  95. oloop:    move.w    -(a4),d1
  96.     moveq    #7,d2
  97. iloop:
  98.     add.w    d1,d1
  99.     bcs.s    Copy0
  100. Lit0:    DOLITERAL
  101.     add.w    d1,d1
  102.     bcs.s    Copy1
  103. Lit1:    DOLITERAL
  104.     dbra    d2,iloop
  105.     cmp.l    a4,a0
  106.     bcs.s    oloop
  107.     bra.s    finish
  108.  
  109. Copy0:    DOCOPY
  110.     add.w    d1,d1
  111.     bcc.s    Lit1
  112. Copy1:    DOCOPY
  113.     dbra    d2,iloop
  114.     cmp.l    a4,a0
  115.     bcs    oloop
  116.     
  117. finish:
  118.     rts
  119.  
  120.