;
;-- Included with this ZIP is two files,
;   e-s1.ecl - Compressed data of "Classic 1-1"
;   e-s1.ecr - Uncompressed data of "Classic 1-1"
;
;   Currently known are the following:
;   0x0 - Header "ASR0"
;   0x4 - ?
;   0x5-7 - Uncompressed Length
;   0x8-B - Offset of start of something??
;   0xC - Compressed data starts here.
;
;
;e-level Decompression Routine
;Dumped from the SMA4 Rom (DJ Bouche)
;Notes:
;
;r0 = Source
;r1 = Destination
;
;
;The data it's reading from is obviously all big-endian stored stuff.
;So a lot of code is taken up by just converting big-endian into
;little-endian for processing purposes.
;
;The stack is used mostly for storing common used things such as
;the source, destination and length.
;
;From poking around in the code I can identify some of the
;locations:
;
;Stack:
;0 - Source
;4 - Destination
;10- Length of Uncompressed 
;14- Some format information?
;
;A couple of memory locations are used for storing arrays of
;some sort.
;
;It would be nice if someone could decode this routine into more
;"useful" code, that could be converted into a function of some
;sort usable in a language such as C++ or VB.  I like the idea
;of using C++ as a DLL could be built with this format.
;
;Even more of a challenge, I'd like to see someone reverse the
;process of this and write a compressor.  I would be very
;thankful if any of this could be done.
;
;Mail me at andrew@limclan.org, MSN at that address, or AIM BoucheanBouche.
;Or visit the official E4 Channel at irc.forgetit.net #e4
;
;Any helpers will receive full creditation of their works at E4 and all
;programs made using the translated compression routines.
;
;Thanking you all in advance :),
;
;DJ Bouche
;



080a7bec  b5f0 push {r4-r7,lr}
080a7bee  4657 mov r7, r10
080a7bf0  464e mov r6, r9
080a7bf2  4645 mov r5, r8
080a7bf4  b4e0 push {r5-r7}
080a7bf6  b08c add sp, -#0x30
void DecmpELevel(u8 *source, u8 *dest) {

080a7bf8  9000 str r0, [sp, #0x0]	;source
	u8 *tmp = source;

080a7bfa  9101 str r1, [sp, #0x4]	;destination
	u8 *tmp2 = dest;

080a7bfc  7940 ldrb r0, [r0, #0x5]	;reading of length value (big endian)
080a7bfe  0400 lsl r0, r0, #0x10
080a7c00  9004 str r0, [sp, #0x10]
080a7c02  9900 ldr r1, [sp, #0x0]
080a7c04  7988 ldrb r0, [r1, #0x6]
080a7c06  0200 lsl r0, r0, #0x08
080a7c08  9a04 ldr r2, [sp, #0x10]
080a7c0a  4302 orr r2, r0
080a7c0c  79c8 ldrb r0, [r1, #0x7]
080a7c0e  4302 orr r2, r0
080a7c10  9204 str r2, [sp, #0x10]
	u32 tmp3 = (source[5] << 0x10) | (source[6] << 8) | source[7];

080a7c12  7a08 ldrb r0, [r1, #0x8]	;reading of second (??) value (big endian)
080a7c14  0600 lsl r0, r0, #0x18
080a7c16  4680 mov r8, r0
080a7c18  7a48 ldrb r0, [r1, #0x9]
080a7c1a  0400 lsl r0, r0, #0x10
080a7c1c  4643 mov r3, r8
080a7c1e  4303 orr r3, r0
080a7c20  7a88 ldrb r0, [r1, #0xa]
080a7c22  0200 lsl r0, r0, #0x08
080a7c24  4303 orr r3, r0
080a7c26  7ac8 ldrb r0, [r1, #0xb]
080a7c28  4303 orr r3, r0
080a7c2a  4698 mov r8, r3
	u32 tmp4 = (source[8] << 0x18) | (source[9] << 0x10) | (source[10] << 8) | source[11];

080a7c2c  7909 ldrb r1, [r1, #0x4]      ;first byte (before 24-bit length value)
080a7c2e  2080 mov r0, #0x80
080a7c30  4008 and r0, r1
080a7c32  2480 mov r4, #0x80
080a7c34  00a4 lsl r4, r4, #0x02
080a7c36  9405 str r4, [sp, #0x14]
	u32 temp1 = 0x0200;

080a7c38  2800 cmp r0, #0x0
080a7c3a  d002 beq $080a7c42
	if (source[4] & 0x80) {

080a7c3c  2780 mov r7, #0x80
080a7c3e  017f lsl r7, r7, #0x05
080a7c40  9705 str r7, [sp, #0x14]
		temp1 = 0x1000;
	}

080a7c42  200c mov r0, #0xc
080a7c44  9002 str r0, [sp, #0x8]
	u32 temp2 = 12;

080a7c46  2101 mov r1, #0x1
080a7c48  4249 neg r1, r1
080a7c4a  9107 str r1, [sp, #0x1c]
080a7c4c  9106 str r1, [sp, #0x18]
	u32 temp3 = -1;
	u32 temp4 = -1;

080a7c4e  2200 mov r2, #0x0
080a7c50  9209 str r2, [sp, #0x24]
	u32 temp5 = 0;

080a7c52  2300 mov r3, #0x0
080a7c54  9308 str r3, [sp, #0x20]
	u32 temp6 = 0;

080a7c56  4931 ldr r1, [$080a7d1c] (=$02026800)
080a7c58  4831 ldr r0, [$080a7d20] (=$0202b004)
080a7c5a  6002 str r2, [r0, #0x0]
080a7c5c  600a str r2, [r1, #0x0]
	u32 tarray[0x0201];
	u32 tarray2[0x1001];
	
	tarray[0] = 0;
	tarray2[0] = 0;
	
	u32 *ptarray=tarray;

080a7c5e  9c00 ldr r4, [sp, #0x0]
080a7c60  4444 add r4, r8
	u8 *ptmp = (tmp + tmp4);

080a7c62  2704 mov r7, #0x4
080a7c64  44b8 add r8, r7
	tmp4 += 4;

080a7c66  2501 mov r5, #0x1
080a7c68  4b2e ldr r3, [$080a7d24] (=$02026000)
	u32 tarray3[0x0200];
	u32 *ptarray3=tarray3;

080a7c6a  2280 mov r2, #0x80
080a7c6c  0092 lsl r2, r2, #0x02
	for (u32 i = 0x0200; i > 0; i--) {

080a7c6e  c320 stmia r3!, {r5}
		*ptarray3++ = 1;

080a7c70  6808 ldr r0, [r1, #0x0]
080a7c72  3001 add r0, #0x1
080a7c74  6048 str r0, [r1, #0x4]
		*(ptarray+1) = ((*ptarray) + 1);

080a7c76  3104 add r1, #0x4
		ptarray++;

080a7c78  3a01 sub r2, #0x1
080a7c7a  2a00 cmp r2, #0x0
080a7c7c  d1f7 bne $080a7c6e
	}

080a7c7e  9800 ldr r0, [sp, #0x0]
080a7c80  9902 ldr r1, [sp, #0x8]
080a7c82  1843 add r3, r0, r1
	u8 *tmp5 = (tmp + temp2);

080a7c84  1c0f add r7, r1, #0x0
080a7c86  3704 add r7, #0x4
	//temp2 += 4; //see below!

080a7c88  9a05 ldr r2, [sp, #0x14]
080a7c8a  2a00 cmp r2, #0x0
080a7c8c  d00a beq $080a7ca4
	if (temp1) {

080a7c8e  2601 mov r6, #0x1
080a7c90  4923 ldr r1, [$080a7d20] (=$0202b004)
		//tarray2

080a7c92  4d25 ldr r5, [$080a7d28] (=$02027004)
		u32 tarray4[0x1000];
		u32 *ptarray4=tarray4;

		while (temp--) {
080a7c94  c540 stmia r5!, {r6}
			*ptarray4++ = 1;

080a7c96  6808 ldr r0, [r1, #0x0]
080a7c98  3001 add r0, #0x1
080a7c9a  6048 str r0, [r1, #0x4]
			*(ptarray2+1) = ((*ptarray2) + 1);

080a7c9c  3104 add r1, #0x4
			ptarray2++;

080a7c9e  3a01 sub r2, #0x1
080a7ca0  2a00 cmp r2, #0x0
080a7ca2  d1f7 bne $080a7c94
		}
	}

080a7ca4  7818 ldrb r0, [r3, #0x0]
080a7ca6  0600 lsl r0, r0, #0x18
080a7ca8  900a str r0, [sp, #0x28]
080a7caa  7858 ldrb r0, [r3, #0x1]
080a7cac  0400 lsl r0, r0, #0x10
080a7cae  990a ldr r1, [sp, #0x28]
080a7cb0  4301 orr r1, r0
080a7cb2  7898 ldrb r0, [r3, #0x2]
080a7cb4  0200 lsl r0, r0, #0x08
080a7cb6  4301 orr r1, r0
080a7cb8  78d8 ldrb r0, [r3, #0x3]
080a7cba  4301 orr r1, r0
080a7cbc  910a str r1, [sp, #0x28]
	u32 sometemp = (tmp5[0] << 0x18) | (tmp5[1] << 0x10) | (tmp5[2] << 8) | tmp5[3];

080a7cbe  7820 ldrb r0, [r4, #0x0]
080a7cc0  0600 lsl r0, r0, #0x18
080a7cc2  900b str r0, [sp, #0x2c]
080a7cc4  7860 ldrb r0, [r4, #0x1]
080a7cc6  0400 lsl r0, r0, #0x10
080a7cc8  9a0b ldr r2, [sp, #0x2c]
080a7cca  4302 orr r2, r0
080a7ccc  78a0 ldrb r0, [r4, #0x2]
080a7cce  0200 lsl r0, r0, #0x08
080a7cd0  4302 orr r2, r0
080a7cd2  78e0 ldrb r0, [r4, #0x3]
080a7cd4  4302 orr r2, r0
080a7cd6  920b str r2, [sp, #0x2c]
	u32 sometemp2 = (ptmp[0] << 0x18) | (ptmp[1] << 0x10) | (ptmp[2] << 8) | ptmp[3];

080a7cd8  9702 str r7, [sp, #0x8]
	temp2 += 4;

080a7cda  2300 mov r3, #0x0
080a7cdc  9303 str r3, [sp, #0xc]
	count = 0;

080a7cde  9c04 ldr r4, [sp, #0x10]
080a7ce0  42a3 cmp r3, r4
080a7ce2  db00 blt $080a7ce6
080a7ce4  e189 b $080a7ffa
	while (count < tmp3) {

080a7ce6  4811 ldr r0, [$080a7d2c] (=$02027000)
080a7ce8  6801 ldr r1, [r0, #0x0]
080a7cea  9806 ldr r0, [sp, #0x18]
080a7cec  f03f bl $080e781c		;subroutine
	u32 shitvar = subroutine(temp4,tarray[0x0200]);

080a7cf0  1c07 add r7, r0, #0x0
080a7cf2  990a ldr r1, [sp, #0x28]
080a7cf4  9a08 ldr r2, [sp, #0x20]
080a7cf6  1a88 sub r0, r1, r2
080a7cf8  1c39 add r1, r7, #0x0
080a7cfa  f03f bl $080e781c		;subroutine
080a7cfe  1c02 add r2, r0, #0x0
	u32 var = subroutine(sometemp-temp6, shitvar);

080a7d00  2100 mov r1, #0x0
	u32 someshit = 0;

080a7d02  2380 mov r3, #0x80
080a7d04  009b lsl r3, r3, #0x02
	u32 wtfshit = 0x0200;

080a7d06  4c05 ldr r4, [$080a7d1c] (=$02026800)
	do {

080a7d08  18c8 add r0, r1, r3
		u32 moreshit = someshit + 0x0200;

080a7d0a  1045 asr r5, r0, #0x01
080a7d0c  00a8 lsl r0, r5, #0x02
		s32 wtfshit2 = moreshit >> 1;

080a7d0e  1900 add r0, r0, r4
080a7d10  6800 ldr r0, [r0, #0x0]
		moreshit = tarray[wtfshit2];

080a7d12  4282 cmp r2, r0
080a7d14  d20c bcs $080a7d30
		if (var < moreshit) {

080a7d16  1c2b add r3, r5, #0x0
			wtfshit = wtfshit2;

080a7d18  e00b b $080a7d32
...
		}
		else {

080a7d30  1c69 add r1, r5, #0x1
			someshit = wtfshit2 + 1;
		}

080a7d32  4299 cmp r1, r3
080a7d34  dbe8 blt $080a7d08
	} while (someshit < wtfshit);

080a7d36  e000 b $080a7d3a

080a7d38  3d01 sub r5, #0x1
080a7d3a  2d00 cmp r5, #0x0
080a7d3c  db0a blt $080a7d54
	while (wtfshit-- >= 0) {

080a7d3e  00a9 lsl r1, r5, #0x02
080a7d40  4b47 ldr r3, [$080a7e60] (=$02026800)
080a7d42  18c8 add r0, r1, r3
080a7d44  6800 ldr r0, [r0, #0x0]
080a7d46  4290 cmp r0, r2
080a7d48  d8f6 bhi $080a7d38
080a7d4a  4c46 ldr r4, [$080a7e64] (=$02026804)
080a7d4c  1908 add r0, r1, r4
080a7d4e  6800 ldr r0, [r0, #0x0]
080a7d50  4282 cmp r2, r0
080a7d52  d2f1 bcs $080a7d38
		if ((tarray[wtfshit2] > var) || (tarray[wtfshit2 + 1] > var)) break;
	}

080a7d54  1c2e add r6, r5, #0x0
080a7d56  00a9 lsl r1, r5, #0x02
080a7d58  4a41 ldr r2, [$080a7e60] (=$02026800)
080a7d5a  1888 add r0, r1, r2
080a7d5c  6800 ldr r0, [r0, #0x0]
080a7d5e  4378 mul r0, r7
080a7d60  9b08 ldr r3, [sp, #0x20]
080a7d62  181b add r3, r3, r0
080a7d64  9308 str r3, [sp, #0x20]
	temp6 += (tarray[wtfshit2] * shitvar);

080a7d66  4c40 ldr r4, [$080a7e68] (=$02026000)
080a7d68  1909 add r1, r1, r4	
080a7d6a  6808 ldr r0, [r1, #0x0]
080a7d6c  1c02 add r2, r0, #0x0
080a7d6e  437a mul r2, r7	
080a7d70  9206 str r2, [sp, #0x18]
	temp4 = (tarray3[wtfshit] * shitvar)
	
080a7d72  3001 add r0, #0x1
080a7d74  6008 str r0, [r1, #0x0]
	tarray3[wtfshit]++;

080a7d76  3501 add r5, #0x1
080a7d78  2280 mov r2, #0x80
080a7d7a  0092 lsl r2, r2, #0x02
080a7d7c  00ab lsl r3, r5, #0x02
080a7d7e  4295 cmp r5, r2
080a7d80  dc07 bgt $080a7d92
080a7d82  4c37 ldr r4, [$080a7e60] (=$02026800)
080a7d84  1919 add r1, r3, r4
	ptarray = (tarray + (++wtfshit));
	while (wtfshit++ <= 0x0200) {

080a7d86  6808 ldr r0, [r1, #0x0]
080a7d88  3001 add r0, #0x1
080a7d8a  c101 stmia r1!, {r0}
		*ptarray++ = (*ptarray + 1);
		
080a7d8c  3501 add r5, #0x1
080a7d8e  4295 cmp r5, r2
080a7d90  ddf9 ble $080a7d86
	}

080a7d92  4836 ldr r0, [$080a7e6c] (=$02027000)
080a7d94  6800 ldr r0, [r0, #0x0]
080a7d96  9f08 ldr r7, [sp, #0x20]
080a7d98  9906 ldr r1, [sp, #0x18]
080a7d9a  187b add r3, r7, r1
	//tmpr3 = temp6+temp4; //see below

080a7d9c  4a34 ldr r2, [$080a7e70] (=$0000ffff)
080a7d9e  4290 cmp r0, r2
080a7da0  d91a bls $080a7dd8
	if (tarray[0x0200] > 0xFFFF) {

080a7da2  492f ldr r1, [$080a7e60] (=$02026800)
080a7da4  2000 mov r0, #0x0
080a7da6  6008 str r0, [r1, #0x0]
		tarray[0] = 0;

080a7da8  2200 mov r2, #0x0
		i = 0;

080a7daa  4c32 ldr r4, [$080a7e74] (=$000001ff)
080a7dac  46a2 mov r10, r4
		tmpr10 = 0x01FF;

080a7dae  2701 mov r7, #0x1
080a7db0  46bc mov r12, r7
		tmpr12 = 1;

080a7db2  482c ldr r0, [$080a7e64] (=$02026804)
080a7db4  4681 mov r9, r0
080a7db6  4c2c ldr r4, [$080a7e68] (=$02026000)
		ptarray3 = tarray3;

080a7db8  1c0f add r7, r1, #0x0
		ptarray = tarray;
		while (i++ < 0x0200 {

080a7dba  6821 ldr r1, [r4, #0x0]
080a7dbc  0849 lsr r1, r1, #0x01
080a7dbe  4660 mov r0, r12
080a7dc0  4301 orr r1, r0
080a7dc2  c402 stmia r4!, {r1}
			*ptarray3 = ((*ptarray3 << 1) | 1);

080a7dc4  cf01 ldmia r7!, {r0}
080a7dc6  1840 add r0, r0, r1
			tmpr0 = *(ptarray++) + *(ptarray3++);
			//ptarray3++;
			//ptarray++;

080a7dc8  4649 mov r1, r9
080a7dca  3104 add r1, #0x4
080a7dcc  4689 mov r9, r1
080a7dce  3904 sub r1, #0x4
080a7dd0  c101 stmia r1!, {r0}
			*(ptarray+1) = tmpr0;

080a7dd2  3201 add r2, #0x1
080a7dd4  4552 cmp r2, r10
080a7dd6  ddf0 ble $080a7dba
		}
	}

080a7dd8  22ff mov r2, #0xff
080a7dda  0612 lsl r2, r2, #0x18
080a7ddc  9808 ldr r0, [sp, #0x20]
080a7dde  4010 and r0, r2
080a7de0  4013 and r3, r2
080a7de2  4298 cmp r0, r3
080a7de4  d116 bne $080a7e14
	while (((temp6 + temp4) & 0xFF000000) == (temp6 & 0xFF000000)) {

080a7de6  9b0a ldr r3, [sp, #0x28]
080a7de8  0219 lsl r1, r3, #0x08
080a7dea  9c00 ldr r4, [sp, #0x0]
080a7dec  9f02 ldr r7, [sp, #0x8]
080a7dee  19e0 add r0, r4, r7
080a7df0  7800 ldrb r0, [r0, #0x0]
080a7df2  1809 add r1, r1, r0
080a7df4  910a str r1, [sp, #0x28]
080a7df6  1c38 add r0, r7, #0x0
080a7df8  3001 add r0, #0x1
080a7dfa  9002 str r0, [sp, #0x8]
		sometemp = ((sometemp<<8)|temp[temp2++]);

080a7dfc  9908 ldr r1, [sp, #0x20]
080a7dfe  0209 lsl r1, r1, #0x08
080a7e00  9108 str r1, [sp, #0x20]
		temp6 += 8;

080a7e02  9b06 ldr r3, [sp, #0x18]
080a7e04  021b lsl r3, r3, #0x08
080a7e06  9306 str r3, [sp, #0x18]
		temp4 += 8;

080a7e08  4011 and r1, r2
080a7e0a  9c08 ldr r4, [sp, #0x20]
080a7e0c  18e0 add r0, r4, r3
080a7e0e  4010 and r0, r2
080a7e10  4281 cmp r1, r0
080a7e12  d0e8 beq $080a7de6
	}

080a7e14  9f06 ldr r7, [sp, #0x18]
080a7e16  4816 ldr r0, [$080a7e70] (=$0000ffff)
080a7e18  4287 cmp r7, r0
080a7e1a  d817 bhi $080a7e4c
080a7e1c  1c02 add r2, r0, #0x0
080a7e1e  2380 mov r3, #0x80
080a7e20  025b lsl r3, r3, #0x09
	//r3 = 0x10000;
	while (temp4 < 0x10000) {

080a7e22  9808 ldr r0, [sp, #0x20]
080a7e24  4010 and r0, r2
080a7e26  1a18 sub r0, r3, r0
080a7e28  0200 lsl r0, r0, #0x08
080a7e2a  9006 str r0, [sp, #0x18]
		temp4 = (0x10000 - (temp6 & 0xFFFF));

080a7e2c  9c0a ldr r4, [sp, #0x28]
080a7e2e  0221 lsl r1, r4, #0x08
080a7e30  9f00 ldr r7, [sp, #0x0]
080a7e32  9c02 ldr r4, [sp, #0x8]
080a7e34  1938 add r0, r7, r4
080a7e36  7800 ldrb r0, [r0, #0x0]
080a7e38  1809 add r1, r1, r0
080a7e3a  910a str r1, [sp, #0x28]
080a7e3c  3401 add r4, #0x1
080a7e3e  9402 str r4, [sp, #0x8]
080a7e40  9f08 ldr r7, [sp, #0x20]
080a7e42  023f lsl r7, r7, #0x08
080a7e44  9708 str r7, [sp, #0x20]

080a7e46  9806 ldr r0, [sp, #0x18]
080a7e48  4290 cmp r0, r2
080a7e4a  d9ea bls $080a7e22
	}

080a7e4c  2eff cmp r6, #0xff
080a7e4e  dc13 bgt $080a7e78
080a7e50  9901 ldr r1, [sp, #0x4]
080a7e52  9a03 ldr r2, [sp, #0xc]
080a7e54  1888 add r0, r1, r2
080a7e56  7006 strb r6, [r0, #0x0]
080a7e58  3201 add r2, #0x1
080a7e5a  9203 str r2, [sp, #0xc]
080a7e5c  e0c8 b $080a7ff0
........
080a7e78  9b05 ldr r3, [sp, #0x14]
080a7e7a  009c lsl r4, r3, #0x02
080a7e7c  4f0f ldr r7, [$080a7ebc] (=$0202b004)
080a7e7e  19e0 add r0, r4, r7
080a7e80  6801 ldr r1, [r0, #0x0]
080a7e82  9807 ldr r0, [sp, #0x1c]
080a7e84  f03f bl $080e781c		;subroutine
080a7e88  1c07 add r7, r0, #0x0
080a7e8a  990b ldr r1, [sp, #0x2c]
080a7e8c  9a09 ldr r2, [sp, #0x24]
080a7e8e  1a88 sub r0, r1, r2
080a7e90  1c39 add r1, r7, #0x0
080a7e92  f03f bl $080e781c		;subroutine
080a7e96  1c02 add r2, r0, #0x0
080a7e98  2100 mov r1, #0x0
080a7e9a  9b05 ldr r3, [sp, #0x14]
080a7e9c  46a1 mov r9, r4
080a7e9e  1c34 add r4, r6, #0x0
080a7ea0  3cfd sub r4, #0xfd
080a7ea2  4299 cmp r1, r3
080a7ea4  da11 bge $080a7eca
080a7ea6  4e05 ldr r6, [$080a7ebc] (=$0202b004)
080a7ea8  18c8 add r0, r1, r3
080a7eaa  1045 asr r5, r0, #0x01
080a7eac  00a8 lsl r0, r5, #0x02
080a7eae  1980 add r0, r0, r6
080a7eb0  6800 ldr r0, [r0, #0x0]
080a7eb2  4282 cmp r2, r0
080a7eb4  d204 bcs $080a7ec0
080a7eb6  1c2b add r3, r5, #0x0
080a7eb8  e003 b $080a7ec2
080a7eba  0000 lsl r0, r0, #0x00
080a7ebc  b004 add sp, #0x10
080a7ebe  0202 lsl r2, r0, #0x08
080a7ec0  1c69 add r1, r5, #0x1
080a7ec2  4299 cmp r1, r3
080a7ec4  dbf0 blt $080a7ea8
080a7ec6  e000 b $080a7eca
080a7ec8  3d01 sub r5, #0x1
080a7eca  2d00 cmp r5, #0x0
080a7ecc  db0a blt $080a7ee4
080a7ece  00a9 lsl r1, r5, #0x02
080a7ed0  4b4e ldr r3, [$080a800c] (=$0202b004)
080a7ed2  18c8 add r0, r1, r3
080a7ed4  6800 ldr r0, [r0, #0x0]
080a7ed6  4290 cmp r0, r2
080a7ed8  d8f6 bhi $080a7ec8
080a7eda  3304 add r3, #0x4
080a7edc  18c8 add r0, r1, r3
080a7ede  6800 ldr r0, [r0, #0x0]
080a7ee0  4282 cmp r2, r0
080a7ee2  d2f1 bcs $080a7ec8
080a7ee4  9903 ldr r1, [sp, #0xc]
080a7ee6  1b48 sub r0, r1, r5
080a7ee8  1e42 sub r2, r0, #0x1
080a7eea  1c26 add r6, r4, #0x0
080a7eec  00ab lsl r3, r5, #0x02
080a7eee  3501 add r5, #0x1
080a7ef0  2e00 cmp r6, #0x0
080a7ef2  dd0c ble $080a7f0e
080a7ef4  9c01 ldr r4, [sp, #0x4]
080a7ef6  9903 ldr r1, [sp, #0xc]
080a7ef8  1860 add r0, r4, r1
080a7efa  18a1 add r1, r4, r2
080a7efc  7809 ldrb r1, [r1, #0x0]
080a7efe  7001 strb r1, [r0, #0x0]
080a7f00  3e01 sub r6, #0x1
080a7f02  9c03 ldr r4, [sp, #0xc]
080a7f04  3401 add r4, #0x1
080a7f06  9403 str r4, [sp, #0xc]
080a7f08  3201 add r2, #0x1
080a7f0a  2e00 cmp r6, #0x0
080a7f0c  dcf2 bgt $080a7ef4
080a7f0e  493f ldr r1, [$080a800c] (=$0202b004)
080a7f10  1858 add r0, r3, r1
080a7f12  6800 ldr r0, [r0, #0x0]
080a7f14  4378 mul r0, r7
080a7f16  9a09 ldr r2, [sp, #0x24]
080a7f18  1812 add r2, r2, r0
080a7f1a  9209 str r2, [sp, #0x24]
080a7f1c  4c3c ldr r4, [$080a8010] (=$02027004)
080a7f1e  1919 add r1, r3, r4
080a7f20  6808 ldr r0, [r1, #0x0]
080a7f22  1c02 add r2, r0, #0x0
080a7f24  437a mul r2, r7
080a7f26  9207 str r2, [sp, #0x1c]
080a7f28  3001 add r0, #0x1
080a7f2a  6008 str r0, [r1, #0x0]
080a7f2c  9b05 ldr r3, [sp, #0x14]
080a7f2e  429d cmp r5, r3
080a7f30  dc09 bgt $080a7f46
080a7f32  00a8 lsl r0, r5, #0x02
080a7f34  4c35 ldr r4, [$080a800c] (=$0202b004)
080a7f36  1901 add r1, r0, r4
080a7f38  6808 ldr r0, [r1, #0x0]
080a7f3a  3001 add r0, #0x1
080a7f3c  c101 stmia r1!, {r0}
080a7f3e  3501 add r5, #0x1
080a7f40  9f05 ldr r7, [sp, #0x14]
080a7f42  42bd cmp r5, r7
080a7f44  ddf8 ble $080a7f38
080a7f46  4931 ldr r1, [$080a800c] (=$0202b004)
080a7f48  464a mov r2, r9
080a7f4a  1850 add r0, r2, r1
080a7f4c  6800 ldr r0, [r0, #0x0]
080a7f4e  9c09 ldr r4, [sp, #0x24]
080a7f50  9f07 ldr r7, [sp, #0x1c]
080a7f52  19e3 add r3, r4, r7
080a7f54  4a2f ldr r2, [$080a8014] (=$0000ffff)
080a7f56  4290 cmp r0, r2
080a7f58  d914 bls $080a7f84
080a7f5a  2000 mov r0, #0x0
080a7f5c  6008 str r0, [r1, #0x0]
080a7f5e  2200 mov r2, #0x0
080a7f60  9c05 ldr r4, [sp, #0x14]
080a7f62  42a2 cmp r2, r4
080a7f64  da0e bge $080a7f84
080a7f66  2601 mov r6, #0x1
080a7f68  4f2b ldr r7, [$080a8018] (=$0202b008)
080a7f6a  4c29 ldr r4, [$080a8010] (=$02027004)
080a7f6c  1c0d add r5, r1, #0x0
080a7f6e  6821 ldr r1, [r4, #0x0]
080a7f70  0849 lsr r1, r1, #0x01
080a7f72  4331 orr r1, r6
080a7f74  c402 stmia r4!, {r1}
080a7f76  cd01 ldmia r5!, {r0}
080a7f78  1840 add r0, r0, r1
080a7f7a  c701 stmia r7!, {r0}
080a7f7c  3201 add r2, #0x1
080a7f7e  9805 ldr r0, [sp, #0x14]
080a7f80  4282 cmp r2, r0
080a7f82  dbf4 blt $080a7f6e
080a7f84  22ff mov r2, #0xff
080a7f86  0612 lsl r2, r2, #0x18
080a7f88  9809 ldr r0, [sp, #0x24]
080a7f8a  4010 and r0, r2
080a7f8c  4013 and r3, r2
080a7f8e  4298 cmp r0, r3
080a7f90  d114 bne $080a7fbc
080a7f92  9b0b ldr r3, [sp, #0x2c]
080a7f94  0219 lsl r1, r3, #0x08
080a7f96  9800 ldr r0, [sp, #0x0]
080a7f98  4440 add r0, r8
080a7f9a  7800 ldrb r0, [r0, #0x0]
080a7f9c  1809 add r1, r1, r0
080a7f9e  910b str r1, [sp, #0x2c]
080a7fa0  2401 mov r4, #0x1
080a7fa2  44a0 add r8, r4
080a7fa4  9f09 ldr r7, [sp, #0x24]
080a7fa6  023f lsl r7, r7, #0x08
080a7fa8  9709 str r7, [sp, #0x24]
080a7faa  9807 ldr r0, [sp, #0x1c]
080a7fac  0200 lsl r0, r0, #0x08
080a7fae  9007 str r0, [sp, #0x1c]
080a7fb0  1c39 add r1, r7, #0x0
080a7fb2  4011 and r1, r2
080a7fb4  1838 add r0, r7, r0
080a7fb6  4010 and r0, r2
080a7fb8  4281 cmp r1, r0
080a7fba  d0ea beq $080a7f92
080a7fbc  9907 ldr r1, [sp, #0x1c]
080a7fbe  4a15 ldr r2, [$080a8014] (=$0000ffff)
080a7fc0  4291 cmp r1, r2
080a7fc2  d815 bhi $080a7ff0
080a7fc4  2380 mov r3, #0x80
080a7fc6  025b lsl r3, r3, #0x09
080a7fc8  9809 ldr r0, [sp, #0x24]
080a7fca  4010 and r0, r2
080a7fcc  1a18 sub r0, r3, r0
080a7fce  0200 lsl r0, r0, #0x08
080a7fd0  9007 str r0, [sp, #0x1c]
080a7fd2  9c0b ldr r4, [sp, #0x2c]
080a7fd4  0221 lsl r1, r4, #0x08
080a7fd6  9800 ldr r0, [sp, #0x0]
080a7fd8  4440 add r0, r8
080a7fda  7800 ldrb r0, [r0, #0x0]
080a7fdc  1809 add r1, r1, r0
080a7fde  910b str r1, [sp, #0x2c]
080a7fe0  2701 mov r7, #0x1
080a7fe2  44b8 add r8, r7
080a7fe4  9809 ldr r0, [sp, #0x24]
080a7fe6  0200 lsl r0, r0, #0x08
080a7fe8  9009 str r0, [sp, #0x24]
080a7fea  9907 ldr r1, [sp, #0x1c]
080a7fec  4291 cmp r1, r2
080a7fee  d9eb bls $080a7fc8
080a7ff0  9a03 ldr r2, [sp, #0xc]
080a7ff2  9b04 ldr r3, [sp, #0x10]
080a7ff4  429a cmp r2, r3
080a7ff6  da00 bge $080a7ffa
080a7ff8  e675 b $080a7ce6
080a7ffa  9803 ldr r0, [sp, #0xc]
080a7ffc  b00c add sp, #0x30
080a7ffe  bc38 pop {r3-r5}
080a8000  4698 mov r8, r3
080a8002  46a1 mov r9, r4
080a8004  46aa mov r10, r5
080a8006  bcf0 pop {r4-r7}
080a8008  bc02 pop {r1}
080a800a  4708 bx r1

----------------------------
;subroutine


u32 subroutine(u32 in1, u32 in2) {

080e781c  2900 cmp r1, #0x0
080e781e  d034 beq $080e788a
	if (in2) {

080e7820  2301 mov r3, #0x1
080e7822  2200 mov r2, #0x0
		u32 tmp = 1;
		u32 tmp2 = 0;

080e7824  b410 push {r4}
080e7826  4288 cmp r0, r1
080e7828  d32c bcc $080e7884
		if (in1 > in2) {

080e782a  2401 mov r4, #0x1
080e782c  0724 lsl r4, r4, #0x1c
080e782e  42a1 cmp r1, r4
080e7830  d204 bcs $080e783c
			while (in2 < 0x10000000) {

080e7832  4281 cmp r1, r0
080e7834  d202 bcs $080e783c
				if (in2 >= in1) break;

080e7836  0109 lsl r1, r1, #0x04
080e7838  011b lsl r3, r3, #0x04
				in2 <<= 4;
				tmp <<= 4;

080e783a  e7f8 b $080e782e
			}

080e783c  00e4 lsl r4, r4, #0x03
080e783e  42a1 cmp r1, r4
080e7840  d204 bcs $080e784c
			while (in2 < 0x80000000) {
080e7842  4281 cmp r1, r0
080e7844  d202 bcs $080e784c
				if (in2 >= in1) break;

080e7846  0049 lsl r1, r1, #0x01
080e7848  005b lsl r3, r3, #0x01
				in2 <<= 1;
				tmp <<= 1;

080e784a  e7f8 b $080e783e
			}

			while (1) {

080e784c  4288 cmp r0, r1
080e784e  d301 bcc $080e7854
				if (in1 > in2) {

080e7850  1a40 sub r0, r0, r1
					in1 -= in2;

080e7852  431a orr r2, r3
					tmp2 |= tmp;
				}

080e7854  084c lsr r4, r1, #0x01
080e7856  42a0 cmp r0, r4
080e7858  d302 bcc $080e7860
				if (in1 > (in2>>1)) {

080e785a  1b00 sub r0, r0, r4
					in1 -= (in2>>1);

080e785c  085c lsr r4, r3, #0x01
080e785e  4322 orr r2, r4
					tmp2 |= tmp>>1;
				}

080e7860  088c lsr r4, r1, #0x02
080e7862  42a0 cmp r0, r4
080e7864  d302 bcc $080e786c
				if (in1 > (in2>>2)) {

080e7866  1b00 sub r0, r0, r4
					in1 -= (in2>>2);

080e7868  089c lsr r4, r3, #0x02
080e786a  4322 orr r2, r4
					tmp2 |= (tmp>>2);
				}

080e786c  08cc lsr r4, r1, #0x03
080e786e  42a0 cmp r0, r4
080e7870  d302 bcc $080e7878
				if (in1 > (in2>>3)) {

080e7872  1b00 sub r0, r0, r4
					in1 -= (in2>>3);

080e7874  08dc lsr r4, r3, #0x03
080e7876  4322 orr r2, r4
					tmp2 |= (tmp>>3);
				}

080e7878  2800 cmp r0, #0x0
080e787a  d003 beq $080e7884
				if (!in1) break;

080e787c  091b lsr r3, r3, #0x04
080e787e  d001 beq $080e7884
				if (!(tmp>>4)) break;

080e7880  0909 lsr r1, r1, #0x04
				in2 >>= 4;

080e7882  e7e3 b $080e784c
			}
		}

080e7884  1c10 add r0, r2, #0x0
080e7886  bc10 pop {r4}
080e7888  46f7 mov pc, lr
		return tmp2;
	}
	else {

080e788a  b500 push {lr}
080e788c  f7ff bl $080e7704
		sub_080e7704();

080e7890  2000 mov r0, #0x0
080e7892  bd00 pop {pc}
		return 0;
	}
}


void sub_080e7704() {
080e7704  46f7 mov pc, lr
	return;
}
