@ PackFire 1.2e - (tiny depacker) by Neural @ ARM version by Mic (252 bytes) .section .text .align 2 .arm .global unpackfire_tiny @ r0 = packed data, r1 = dest unpackfire_tiny: stmfd sp!,{r4-r12,lr} add r2,r0,#26 ldrb r7,[r2],#1 lit_copy: ldrb r12,[r2],#1 strb r12,[r1],#1 main_loop: bl get_bit bcs lit_copy mov r3,#-1 get_index: add r3,r3,#1 bl get_bit bcc get_index cmp r3,#0x10 ldmeqfd sp!,{r4-r12,lr} bxeq lr bl get_pair mov r6,r3 cmp r3,#2 movhi r3,#0 mov r11,#4 mov r10,#0x10 cmp r3,#1 moveq r11,#2 moveq r10,#0x30 movhi r10,#0x20 bl get_bits bl get_pair sub r4,r1,r3 copy_bytes: ldrb r12,[r4],#1 strb r12,[r1],#1 subs r6,r6,#1 bne copy_bytes b main_loop get_pair: mov r8,#0 calc_len_dist: ands r10,r8,#15 moveq r5,#1 mov r4,r8,lsr#1 ldrb r11,[r0,r4] mov r4,#1 ands r10,r10,#1 movne r11,r11,lsr#4 mov r10,r5 and r11,r11,#15 add r5,r5,r4,lsl r11 add r8,r8,#1 subs r3,r3,#1 bpl calc_len_dist get_bits: stmfd sp!,{lr} mov r3,#0 getting_bits: subs r11,r11,#1 addmi r3,r3,r10 ldmmifd sp!,{pc} bl get_bit adc r3,r3,r3 b getting_bits get_bit: add r7,r7,r7 tst r7,#0xFF bne byte_done movs r12,r7,lsl#24 @ Set carry ldrb r7,[r2],#1 adc r7,r7,r7 byte_done: movs r12,r7,lsl#24 @ Set carry and r7,r7,#0xFF mov pc,lr