home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
telefisk.org
/
amiga_virus_collection_research.7z
/
VIRUSCOLLECTIE
/
C
/
CJEZUS
/
CE_JESUS.LHA
/
decompressor.asm
< prev
next >
Wrap
Assembly Source File
|
1995-09-11
|
3KB
|
120 lines
*********************************************************************
; a0 source
; a1 target
movem.l d2-d7/a2-a6,-(sp)
move.l (a0)+,d0
bsr decompress
movem.l (sp)+,d2-d7/a2-a6
rts
;;;
;;; Remarks
;;; =======
;;;
;;; * This code relies on XPK_MARGIN being >= 32 !!!
;;; If only one Bit in the last ControlWord is used, the remaining 15
;;; will be filled with 0. This will result in 15 LiteralItems on
;;; decompression. In Addition to this there is NO CHECK, if a match
;;; matches more than the input. This can result in a match which is
;;; 17 Bytes to long giving a maximum total of 32 Bytes garbled after
;;; the outputblock after decompresion.
;;; (XPK_MARGIN is 256 in xpkmaster.library V2.0)
;;;
; ;Register Map
; ;============
; a0 Points to next source byte.
; a1 Points to next destination byte.
; a2 Temporary.
; a3 Unused.
; a4 Pointer for the input word stream.
; a5 Unused.
; a6 Stackframe linkage register. Don't touch!
; a7 Stack pointer.
; d0 Length of the compressed.
; d1 control Word
; d2 Counter for halfunrolled decompress_16_items_loop.
; d3 Temporary used to calculate copy item length.
; d4 Temporary used to calculate copy item offset.
; d5 Unused.
; d6 Unused.
; d7 Unused.
;;;---------------------------------------------------------------------------
decompress:
move.l d0,a4
add.l a0,a4 ;a4:=behind the end of input block
moveq.l #0,d4 ;d4:=0
;;;---------------------------------------------------------------------------
DOCOPY MACRO
move.w -(a4),d4 ;Grab the copy item description
moveq #$0F,d3
and.b d4,d3 ;extract length.
add.b d3,d3 ;adjust length to length*2
lsr.w #4,d4 ;extract offset
move.l a1,a2 ;Subtract the offset yielding the
suba.l d4,a2 ;address from which we copy.
jmp MOVE\@(PC,d3.w) ;jump to the right place
MOVE\@ move.b (a2)+,(a1)+ ;0
move.b (a2)+,(a1)+ ;1
move.b (a2)+,(a1)+ ;2
move.b (a2)+,(a1)+ ;3
move.b (a2)+,(a1)+ ;4
move.b (a2)+,(a1)+ ;5
move.b (a2)+,(a1)+ ;6
move.b (a2)+,(a1)+ ;7
move.b (a2)+,(a1)+ ;8
move.b (a2)+,(a1)+ ;9
move.b (a2)+,(a1)+ ;10
move.b (a2)+,(a1)+ ;11
move.b (a2)+,(a1)+ ;12
move.b (a2)+,(a1)+ ;13
move.b (a2)+,(a1)+ ;14
move.b (a2)+,(a1)+ ;15
move.b (a2)+,(a1)+
move.b (a2)+,(a1)+
ENDM
DOLITERAL MACRO
move.b (a0)+,(a1)+ ;Literal item means copy a byte.
ENDM
;This loop processes one 16-item item group per iteration.
;This loop terminates when we definitely have decompressed all
;16-item blocks. It may overwrite 15+17 innocent bytes AFTER the
;end of outbuf.
oloop: move.w -(a4),d1
moveq #7,d2
iloop:
add.w d1,d1
bcs.s Copy0
Lit0: DOLITERAL
add.w d1,d1
bcs.s Copy1
Lit1: DOLITERAL
dbra d2,iloop
cmp.l a4,a0
bcs.s oloop
bra.s finish
Copy0: DOCOPY
add.w d1,d1
bcc.s Lit1
Copy1: DOCOPY
dbra d2,iloop
cmp.l a4,a0
bcs oloop
finish:
rts