home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
No Fragments Archive 10: Diskmags
/
nf_archive_10.iso
/
MAGS
/
STESTOS
/
STESTOS1.MSA
/
GIVEAWAY
/
ICE.PAC
/
ICE_UNPA.S
< prev
next >
Wrap
Text File
|
1987-04-22
|
3KB
|
163 lines
;********************************************* unpacking routine of PACK-ICE
; a0 = Pointer to packed data
; a1 = Address to which the data is unpacked
; "bsr" of "jsr" to ice_decrunch with registers a0 and a1 prepared.
ice_decrunch:
movem.l d0-a6,-(sp)
bsr.s getinfo
cmpi.l #'ICE!',d0
bne not_packed
bsr.s getinfo
lea.l -8(a0,d0.l),a5
bsr.s getinfo
move.l d0,(sp)
move.l a1,a4
move.l a1,a6
adda.l d0,a6
move.l a6,a3
move.b -(a5),d7
bsr normal_bytes
move.l a3,a6
bsr get_1_bit
bcc.s not_packed
move.w #$0f9f,d7
bsr get_1_bit
bcc.s ice_00
moveq #15,d0
bsr get_d0_bits
move.w d1,d7
ice_00: moveq #3,d6
ice_01: move.w -(a3),d4
moveq #3,d5
ice_02: add.w d4,d4
addx.w d0,d0
add.w d4,d4
addx.w d1,d1
add.w d4,d4
addx.w d2,d2
add.w d4,d4
addx.w d3,d3
dbra d5,ice_02
dbra d6,ice_01
movem.w d0-d3,(a3)
dbra d7,ice_00
not_packed:
movem.l (sp)+,d0-a6
rts
getinfo: moveq #3,d1
getbytes: lsl.l #8,d0
move.b (a0)+,d0
dbf d1,getbytes
rts
normal_bytes:
bsr.s get_1_bit
bcc.s test_if_end
moveq.l #0,d1
bsr.s get_1_bit
bcc.s copy_direkt
lea.l direkt_tab+20(pc),a1
moveq.l #4,d3
nextgb: move.l -(a1),d0
bsr.s get_d0_bits
swap.w d0
cmp.w d0,d1
dbne d3,nextgb
no_more: add.l 20(a1),d1
copy_direkt:
move.b -(a5),-(a6)
dbf d1,copy_direkt
test_if_end:
cmpa.l a4,a6
bgt.s strings
rts
get_1_bit:add.b d7,d7
bne.s bitfound
move.b -(a5),d7
addx.b d7,d7
bitfound: rts
get_d0_bits:
moveq.l #0,d1
hole_bit_loop:
add.b d7,d7
bne.s on_d0
move.b -(a5),d7
addx.b d7,d7
on_d0: addx.w d1,d1
dbf d0,hole_bit_loop
rts
strings: lea.l length_tab(pc),a1
moveq.l #3,d2
get_length_bit:
bsr.s get_1_bit
dbcc d2,get_length_bit
no_length_bit:
moveq.l #0,d4
moveq.l #0,d1
move.b 1(a1,d2.w),d0
ext.w d0
bmi.s no_über
get_über: bsr.s get_d0_bits
no_über: move.b 6(a1,d2.w),d4
add.w d1,d4
beq.s get_offset_2
lea.l more_offset(pc),a1
moveq.l #1,d2
getoffs: bsr.s get_1_bit
dbcc d2,getoffs
moveq.l #0,d1
move.b 1(a1,d2.w),d0
ext.w d0
bsr.s get_d0_bits
add.w d2,d2
add.w 6(a1,d2.w),d1
bpl.s depack_bytes
sub.w d4,d1
bra.s depack_bytes
get_offset_2:
moveq.l #0,d1
moveq.l #5,d0
moveq.l #-1,d2
bsr.s get_1_bit
bcc.s less_40
moveq.l #8,d0
moveq.l #$3f,d2
less_40: bsr.s get_d0_bits
add.w d2,d1
depack_bytes:
lea.l 2(a6,d4.w),a1
adda.w d1,a1
move.b -(a1),-(a6)
dep_b: move.b -(a1),-(a6)
dbf d4,dep_b
bra normal_bytes
direkt_tab:
dc.l $7fff000e,$00ff0007,$00070002,$00030001,$00030001
dc.l 270-1, 15-1, 8-1, 5-1, 2-1
length_tab:
dc.b 9,1,0,-1,-1
dc.b 8,4,2,1,0
more_offset:
dc.b 11, 4, 7, 0
dc.w $11f, -1, $1f
;************************************************* end of unpacking routine