From f56539053cc09a092c93a58ad288ded70fbb3412 Mon Sep 17 00:00:00 2001 From: MatyMeatBoy <108221324+MatyMeatBoy@users.noreply.github.com> Date: Wed, 4 Nov 2026 18:12:43 -0300 Subject: [PATCH] decompile sub_0800AD04 (camera clamp) Co-Authored-By: Claude --- asm/nonmatchings/code_08009088/sub_0800AD04.s | 177 ------------------ src/code_08009088.c | 113 +++++------ 2 files changed, 47 insertions(+), 243 deletions(-) delete mode 100644 asm/nonmatchings/code_08009088/sub_0800AD04.s diff --git a/asm/nonmatchings/code_08009088/sub_0800AD04.s b/asm/nonmatchings/code_08009088/sub_0800AD04.s deleted file mode 100644 index 18811f1c..00000000 --- a/asm/nonmatchings/code_08009088/sub_0800AD04.s +++ /dev/null @@ -1,177 +0,0 @@ - thumb_func_start sub_0800AD04 -sub_0800AD04: @ 0x0800AD04 - push {r4, r5, r6, r7, lr} - mov r7, r9 - mov r6, r8 - push {r6, r7} - adds r6, r0, #0 - adds r7, r1, #0 - adds r4, r2, #0 - ldr r1, [r6, #0] - lsls r1, r1, #8 - lsrs r1, r1, #0x10 - mov r8, r1 - ldr r1, [r7, #0] - lsls r1, r1, #8 - lsrs r1, r1, #0x10 - mov r9, r1 - ldr r3, _0800AD88 - adds r1, r3, #0 - adds r1, #0x9c - ldr r1, [r1, #0] - movs r2, #0x10 - ands r1, r2 - cmp r1, #0 - bne _0800AD5C - adds r2, r3, #0 - adds r2, #0x80 - mov r5, r8 - lsls r1, r5, #0x10 - asrs r1, r1, #0x10 - ldrh r2, [r2, #0] - adds r1, r1, r2 - subs r1, #0x78 - adds r2, r3, #0 - adds r2, #0x7c - strh r1, [r2, #0] - adds r2, #6 - mov r5, r9 - lsls r1, r5, #0x10 - asrs r1, r1, #0x10 - ldrh r2, [r2, #0] - adds r1, r1, r2 - subs r1, #0x60 - adds r2, r3, #0 - adds r2, #0x7e - strh r1, [r2, #0] -_0800AD5C: - cmp r4, #0 - beq _0800AD8C - adds r4, r3, #0 - adds r4, #0x7c - movs r1, #0 - ldrsh r2, [r4, r1] - adds r1, r3, #0 - adds r1, #0x74 - ldrh r1, [r1, #0] - subs r1, #0x1e - lsls r1, r1, #3 - cmp r2, r1 - ble _0800AD78 - strh r1, [r4, #0] -_0800AD78: - adds r4, r3, #0 - adds r4, #0x7e - movs r5, #0 - ldrsh r2, [r4, r5] - adds r1, r3, #0 - adds r1, #0x76 - b _0800ADB0 - .2byte 0x0000 -_0800AD88: .4byte gUnk_03003170 -_0800AD8C: - adds r4, r3, #0 - adds r4, #0x7c - movs r1, #0 - ldrsh r2, [r4, r1] - adds r1, r3, #0 - adds r1, #0x70 - ldrh r1, [r1, #0] - subs r1, #0x1e - lsls r1, r1, #3 - cmp r2, r1 - ble _0800ADA4 - strh r1, [r4, #0] -_0800ADA4: - adds r4, r3, #0 - adds r4, #0x7e - movs r5, #0 - ldrsh r2, [r4, r5] - adds r1, r3, #0 - adds r1, #0x72 -_0800ADB0: - ldrh r1, [r1, #0] - subs r1, #0x14 - lsls r1, r1, #3 - cmp r2, r1 - ble _0800ADBC - strh r1, [r4, #0] -_0800ADBC: - mov ip, r3 - mov r4, ip - adds r4, #0x7c - movs r2, #0 - ldrsh r1, [r4, r2] - cmp r1, #0 - bge _0800ADCE - movs r1, #0 - strh r1, [r4, #0] -_0800ADCE: - mov r5, ip - adds r5, #0x7e - movs r2, #0 - ldrsh r1, [r5, r2] - cmp r1, #0 - bge _0800ADDE - movs r1, #0 - strh r1, [r5, #0] -_0800ADDE: - mov r1, ip - adds r1, #0x9c - ldr r1, [r1, #0] - movs r2, #0x10 - ands r1, r2 - cmp r1, #0 - bne _0800AE0C - mov r2, ip - adds r2, #0x80 - ldrh r1, [r4, #0] - ldrh r2, [r2, #0] - subs r1, r1, r2 - mov r2, ip - adds r2, #0x88 - strh r1, [r2, #0] - subs r2, #6 - ldrh r1, [r5, #0] - ldrh r2, [r2, #0] - subs r1, r1, r2 - mov r2, ip - adds r2, #0x8a - strh r1, [r2, #0] - b _0800AE2A -_0800AE0C: - adds r2, r3, #0 - adds r2, #0x80 - adds r1, r3, #0 - adds r1, #0x88 - ldrh r1, [r1, #0] - ldrh r2, [r2, #0] - adds r1, r1, r2 - strh r1, [r4, #0] - movs r4, #0x82 - adds r1, r3, #0 - adds r1, #0x8a - ldrh r1, [r1, #0] - ldrh r2, [r4, r3] - adds r1, r1, r2 - strh r1, [r5, #0] -_0800AE2A: - ldrb r2, [r6, #0] - ldrb r3, [r7, #0] - mov r4, r8 - lsls r1, r4, #0x10 - asrs r1, r1, #8 - adds r2, r2, r1 - str r2, [r6, #0] - mov r5, r9 - lsls r1, r5, #0x10 - asrs r1, r1, #8 - adds r3, r3, r1 - str r3, [r7, #0] - pop {r3, r4} - mov r8, r3 - mov r9, r4 - pop {r4, r5, r6, r7} - pop {r1} - bx r1 - thumb_func_end sub_0800AD04 diff --git a/src/code_08009088.c b/src/code_08009088.c index c72f56aa..9780fe04 100644 --- a/src/code_08009088.c +++ b/src/code_08009088.c @@ -1056,76 +1056,57 @@ void sub_0800A998(void) t06_sysA998.flags = 0x80000000; } -#ifdef NONMATCHING -struct T06SysAD04 {u8 pad[0x70];u16 w,h,w1,h1,mapW,mapH;s16 x,y;u16 offX,offY,pad84,pad86,relX,relY;u8 pad8C[16];u32 flags;}; -extern struct T06SysAD04 t06_sysAD04 asm("gUnk_03003170"); -static inline void t06_finishAD04(struct T06SysAD04 *base) +struct CameraAD04 { + u8 pad00[0x70]; + u16 w70, w72, w74, w76; + u8 pad78[4]; + s16 x, y; + u16 baseX, baseY; + u8 pad84[4]; + u16 relX, relY; + u8 pad8C[0x10]; + u32 flags; +}; +extern struct CameraAD04 cameraAD04 asm("gUnk_03003170"); + +u32 sub_0800AD04(u32 *px, u32 *py, u32 alt) { - register struct T06SysAD04 *saved asm("ip")=base; - register s16 *x asm("r4")=&saved->x; - register s16 *y asm("r5"); - if(*x<0)*x=0; - y=&saved->y; - if(*y<0)*y=0; - if(!(saved->flags&16)) { - saved->relX=(u16)*x-saved->offX; - saved->relY=(u16)*y-saved->offY; + u32 dx = (u16)(*px >> 8); + u32 dy = (u16)(*py >> 8); + + if (!(cameraAD04.flags & 0x10)) { + cameraAD04.x = cameraAD04.baseX + ((s32)(dx << 16) >> 16) - 0x78; + cameraAD04.y = cameraAD04.baseY + ((s32)(dy << 16) >> 16) - 0x60; + } + if (alt) { + if (cameraAD04.x > (cameraAD04.w74 - 0x1e) * 8) + cameraAD04.x = (cameraAD04.w74 - 0x1e) * 8; + if (cameraAD04.y > (cameraAD04.w76 - 0x14) * 8) + cameraAD04.y = (cameraAD04.w76 - 0x14) * 8; } else { - *x=base->offX+base->relX; - {register u32 offset asm("r4")=0x82;u32 other;register u32 value asm("r1"); - value=base->relY; asm("" : "+r"(offset), "+r"(value)); - other=*(u16 *)(offset+(u32)base); *y=value+other;} - } -} -static inline u16 *t06_offsetAD04(u16 *p,u16 offset) {return (u16 *)((u8 *)p+offset);} -s32 sub_0800AD04(s32 *px,s32 *py,s32 layer) -{ - register s32 *result asm("r0")=px; - u32 x=((u32)*px<<8)>>16; - u32 y=((u32)*py<<8)>>16; - register struct T06SysAD04 *sys asm("r3")=&t06_sysAD04; - register s32 max asm("r1"); - register u16 *height asm("r1"); - register s16 *scroll asm("r4"); - register s32 current asm("r2"); - if(!(sys->flags&16)) { - register u16 *offset asm("r2")=&sys->offX; - register u32 temp asm("r5")=x; - register s32 value asm("r1")=(s16)temp; - value+=*offset;value-=120; - offset=(u16 *)&sys->x; - *offset=value; - offset=t06_offsetAD04(offset,6); - temp=y;value=(s16)temp; - {register u16 loaded asm("r2")=*(volatile u16 *)offset;value+=loaded;}value-=96; - offset=(u16 *)&sys->y; - *offset=value; - } - if(layer) { - scroll=&sys->x;current=*scroll; - max=(sys->w1-30)*8; - if(current>max)*scroll=max; - scroll=&sys->y;current=*scroll; - height=&sys->h1; + if (cameraAD04.x > (cameraAD04.w70 - 0x1e) * 8) + cameraAD04.x = (cameraAD04.w70 - 0x1e) * 8; + if (cameraAD04.y > (cameraAD04.w72 - 0x14) * 8) + cameraAD04.y = (cameraAD04.w72 - 0x14) * 8; + } + if (cameraAD04.x < 0) + cameraAD04.x = 0; + if (cameraAD04.y < 0) + cameraAD04.y = 0; + if (!(cameraAD04.flags & 0x10)) { + cameraAD04.relX = cameraAD04.x - cameraAD04.baseX; + cameraAD04.relY = cameraAD04.y - cameraAD04.baseY; } else { - scroll=&sys->x;current=*scroll; - max=(sys->w-30)*8; - if(current>max)*scroll=max; - scroll=&sys->y;current=*scroll; - height=&sys->h; - } - max=(*height-20)*8; - if(current>max)*scroll=max; - t06_finishAD04(sys); - {u32 lowX=(u8)*px; - u32 lowY=(u8)*py; - *px=lowX+((s32)(x<<16)>>8); - *py=lowY+((s32)(y<<16)>>8);} - return (s32)result; + cameraAD04.x = cameraAD04.baseX + cameraAD04.relX; + cameraAD04.y = cameraAD04.baseY + cameraAD04.relY; + } + { + u32 lowX = (u8)*px; + u32 lowY = (u8)*py; + *px = lowX + ((s16)dx << 8); + *py = lowY + ((s16)dy << 8); + } } -#else -INCLUDE_ASM("asm/nonmatchings/code_08009088", sub_0800AD04); -#endif extern u32 t06_resourcesAE50[] asm("gUnk_0847846C"); static inline u32 t06_resourceAE50(u32 index,u16 offset) {