;;;RLE decompression routine;;; ; r0: Option ; r1: Source ; r2: Destination ; Returns r0: error code 080658A4 (T) push r4-r6,r14 080658A6 (T) lsl r0,r0,18h 080658A8 (T) lsr r0,r0,18h 080658AA (T) mov r5,0h ; Returned 080658AC (T) cmp r0,0h ;\ 080658AE (T) bne 80658D2h ;} If r0 parameter == 0: 080658B0 (T) ldrb r5,[r1] ;\ 080658B2 (T) add r1,1h ;| 080658B4 (T) cmp r5,0h ;} If [Source++] == 0: 080658B6 (T) bne 80658BEh ;/ 080658B8 (T) mov r5,80h ;\ 080658BA (T) lsl r5,r5,4h ;} r5 = 0x800 080658BC (T) b 80658EEh ;/ 080658BE (T) cmp r5,1h ;\ 080658C0 (T) beq 80658C6h ;| 080658C2 (T) cmp r5,2h ;} Else if ==1 or ==2: 080658C4 (T) bne 80658CCh ;/ 080658C6 (T) mov r5,80h ;\ 080658C8 (T) lsl r5,r5,5h ;} r5 = 0x1000 080658CA (T) b 80658EEh ;/ 080658CC (T) mov r5,80h ;\ 080658CE (T) lsl r5,r5,6h ;} Else: r5 = 0x2000 080658D0 (T) b 80658EEh ;/ 080658D2 (T) cmp r0,1h ;\ 080658D4 (T) beq 80658EEh ;} Else if r0 parameter != 1: 080658D6 (T) ldrb r0,[r1] ;\ 080658D8 (T) strb r0,[r2] ;| 080658DA (T) add r1,1h ;} [Dest++] = [Source++] 080658DC (T) add r2,1h ;/ 080658DE (T) strb r5,[r2] ;\ 080658E0 (T) add r2,1h ;} [Dest++] = 0 080658E2 (T) ldrb r0,[r1] ;\ 080658E4 (T) strb r0,[r2] ;| 080658E6 (T) add r1,1h ;| 080658E8 (T) add r2,1h ;} Repeat the above 080658EA (T) strb r5,[r2] ;| 080658EC (T) add r2,1h ;/ 080658EE (T) mov r6,r2 ; r6 = Dest 080658F0 (T) mov r4,0h ; Used as the current pass 080658F2 (T) ldrb r0,[r1] ;\ 080658F4 (T) add r1,1h ;| 080658F6 (T) cmp r0,1h ;} If [Source++] == 1: 080658F8 (T) bne 806593Ch ;/ 080658FA (T) ldrb r3,[r1] ;\ 080658FC (T) add r1,1h ;| 080658FE (T) add r4,1h ;} Increment r4 08065900 (T) cmp r3,0h ;} If [Source++] == 0, run next pass or end 08065902 (T) beq 8065992h ;/ 08065904 (T) mov r0,80h ;\ 08065906 (T) and r0,r3 ;| 08065908 (T) cmp r0,0h ;} If has 0x80: 0806590A (T) beq 806592Eh ;/ 0806590C (T) mov r0,7Fh ;\ 0806590E (T) and r3,r0 ;| 08065910 (T) cmp r3,0h ;} If &0x7F != 0: 08065912 (T) beq 8065920h ;/ 08065914 (T) ldrb r0,[r1] ;\ 08065916 (T) strb r0,[r2] ;} [Dest] = [Source] 08065918 (T) add r2,2h ; Dest += 2 0806591A (T) sub r3,1h ;\ 0806591C (T) cmp r3,0h ;} Loop loaded value times 0806591E (T) bne 8065914h ;/ 08065920 (T) add r1,1h ; Source++ 08065922 (T) b 8065932h ; Branch to 8065932 08065924 (T) ldrb r0,[r1] ;\ 08065926 (T) strb r0,[r2] ;} [Dest] = [Source++] 08065928 (T) add r1,1h ;/ 0806592A (T) add r2,2h ; Dest += 2 0806592C (T) sub r3,1h ;\ ;| 0806592E (T) cmp r3,0h ;} Loop loaded value times 08065930 (T) bne 8065924h ;/ 08065932 (T) ldrb r3,[r1] ;\ 08065934 (T) add r1,1h ;| 08065936 (T) cmp r3,0h ;} If [Source++] != 0, loop from 8065904 08065938 (T) bne 8065904h ;/ 0806593A (T) b 8065992h 0806593C (T) ldrb r3,[r1] ;\ If the Source wasn't 1: 0806593E (T) add r1,1h ;| 08065940 (T) lsl r3,r3,8h ;| 08065942 (T) ldrb r0,[r1] ;| 08065944 (T) orr r3,r0 ;} If big endian halfword [Source += 2] == 0, run next pass or end 08065946 (T) add r1,1h ;| 08065948 (T) add r4,1h ;| Increment r4 0806594A (T) cmp r3,0h ;| 0806594C (T) beq 8065992h ;/ 0806594E (T) mov r0,80h ;\ 08065950 (T) lsl r0,r0,8h ;| 08065952 (T) and r0,r3 ;} If has 0x8000: 08065954 (T) cmp r0,0h ;| 08065956 (T) beq 806597Eh ;/ 08065958 (T) ldr r0,=7FFFh ;\ 0806595A (T) and r3,r0 ;| 0806595C (T) cmp r3,0h ;} If &0x7FFF != 0: 0806595E (T) beq 806596Ch ;/ 08065960 (T) ldrb r0,[r1] ;\ 08065962 (T) strb r0,[r2] ;} [Dest] = [Source] 08065964 (T) add r2,2h ; Dest += 2 08065966 (T) sub r3,1h ;\ 08065968 (T) cmp r3,0h ;} Loop loaded value times 0806596A (T) bne 8065960h ;/ 0806596C (T) add r1,1h ; Source++ 0806596E (T) b 8065982h ; Branch to 8065982 08065970 dd 000007FFFh 08065974 (T) ldrb r0,[r1] ;\ 08065976 (T) strb r0,[r2] ;} [Dest] = [Source++] 08065978 (T) add r1,1h ;/ 0806597A (T) add r2,2h ; Dest += 2 0806597C (T) sub r3,1h ;\ ;| 0806597E (T) cmp r3,0h ;} Loop loaded value times 08065980 (T) bne 8065974h ;/ 08065982 (T) ldrb r3,[r1] ;\ 08065984 (T) add r1,1h ;| 08065986 (T) lsl r3,r3,8h ;| 08065988 (T) ldrb r0,[r1] ;| 0806598A (T) orr r3,r0 ;} If big endian halfword [Source += 2] != 0, loop from 806594E 0806598C (T) add r1,1h ;| 0806598E (T) cmp r3,0h ;| 08065990 (T) bne 806594Eh ;/ 08065992 (T) add r2,r6,1 ; r2 = old ++Dest 08065994 (T) cmp r4,1h ;\ 08065996 (T) ble 80658F2h ;} Do other pass 08065998 (T) mov r0,r5 ;\ 0806599A (T) pop r4-r6 ;| 0806599C (T) pop r1 ;} Return r5 0806599E (T) bx r1 ;/