=== lever-free bodies in main sharing a callee or global with func_80020598 (5 found; top 6 by shared symbols) — read them for the SHAPE ===
--- func_8001FC08 (src/800.c:12048) shares 3: D_80074818 func_80020DA4 func_80020F34 ---
void func_8001FC08(OBJ_8001FC08 *obj)
{
    LOC_8001FC08 L;
    extern MTX_8001FC08 D_80074818[];
    extern MTX_8001FC08 D_80075018[];
    MTX_8001FC08 *rm;
    MTX_8001FC08 *om;
    s32 *list;
    u8 *sp5;
    u8 *otp;
    u32 attrv;
    u32 objs;
    u32 w;
    u32 m;
    u32 tag;
    u32 n;
    s32 mode;
    u16 flags;
    u32 fpc;
    s32 ot;
    s32 spr;

    otp = &D_800A6518[D_800B9A02 * 20];
    attrv = obj->attr;
    mode = obj->mode;
    flags = obj->flags;
    L.uA0 = obj->w78;
    ot = D_80062BA8;
    L.f = 0;

    if (flags & 1) {
        obj->flags &= ~1;
        L.mm.a = obj->mm.a;
    } else {
        func_80020DA4((s32)obj->rot, (s32)&L.mm.a);
        L.mm.a.t[0] = obj->x;
        L.mm.a.t[1] = obj->y;
        L.mm.a.t[2] = obj->z;
    }

    spr = 0;
    if (flags & 0x20) {
        spr = obj->w80;
    }
    if (flags & 0x80) {
        if (spr != 0) {
            L.lp = (s16 *)(obj->w80 + 0x30);
        } else {
            L.lp = (s16 *)obj->w80;
        }
    } else {
        L.lp = 0;
    }
    L.cnt = 0;
    fpc = 0;
    if (flags & 0x10) {
        func_80020F34((s32)&L.mm.a, (s32)obj->scale);
    }

    func_80054AAC((s32)&L.f, (s32)&L.m0, (s32)&L.m1);

    obj->mm.a = L.mm.a;
    obj->mm.b = L.mm.b;

    list = obj->list;
    if (list == 0) {
        return;
    }
    objs = obj->objs;
    if (objs == 0) {
        return;
    }
    if (func_80021174(obj->w28, (s32)&L.mm.b.t[0]) == 0) {
        return;
    }

    if (mode == 1 || mode == 6) {
        sp5 = &D_800A5BD0[obj->idx * 20];
        L.attr = attrv;
        L.u10 = 0;
    } else {
        L.attr = attrv;
    }

    if (spr != 0) {
        func_80021008(spr);
    }

    if ((objs & 0x01000000) == 0 && (flags & 0x40) == 0) {
        if (func_80020248(list, objs, (s32)&L.m0, (s32)&L.m1, attrv & 0x40) == 0) {
            rm = D_80074818;
            om = D_80075018;
        } else {
            rm = (MTX_8001FC08 *)0x1F800000;
            om = (MTX_8001FC08 *)0x1F8000E0;
        }
        w = *list;
        if (w != 0) {
            do {
                tag = w & 0x7F000000;
                m = w & 0x80FFFFFF;
                if (tag != 0x01000000) {
                    func_80056F18(m + 0xC, (s32)&L, 0);
                    if ((attrv & 0x40) == 0) {
                        func_80052F04(rm);
                    }
                    func_80052E38(om);
                    if (L.lp != 0) {
                        func_8002109C(L.cnt, &L.lp);
                    }
                    if (mode == 0) {
                        func_80057094((s32)&L, (s32)otp, 0, ot);
                    } else if (mode == 5) {
                        func_800243EC((s32)&L, (s32)otp, 0);
                    }
                }
                if (L.lp != 0) {
                    func_80021120(&L.cnt, L.lp);
                }
                list++;
                rm++;
                om++;
                w = *list;
            } while (w != 0);
        }
    } else {
        n = objs & 0xFEFFFFFF;
        if (flags & 0x40) {
            func_80020598(list, n, (s32)&L.m0, (s32)&L.m1);
            rm = D_80074818;
            om = D_80075018;
        } else {
            if (func_80020A28(list, n, (s32)&L.m0, (s32)&L.m1,
                              attrv & 0x40) == 0) {
                rm = D_80074818;
                om = D_80075018;
            } else {
                rm = (MTX_8001FC08 *)0x1F800000;
                om = (MTX_8001FC08 *)0x1F8000E0;
            }
        }
        w = *list;
        if (w != 0) {
            do {
                tag = w & 0x7F000000;
                m = w & 0x80FFFFFF;
                if (tag == 0x01000000) {
                    if (mode == 1 || mode == 6) {
                        sp5 += 0x14;
                    }
                } else {
                    if (mode == 0 || mode == 5) {
                        func_80056F18(m + 0xC, (s32)&L, 0);
                    } else if (mode == 1 || mode == 6) {
                        L.u08 = *(s32 *)(sp5 + 8);
                        L.u0C = *(s32 *)(sp5 + 0xC);
                        sp5 += 0x14;
                    } else {
                        L.u08 = m;
                    }
                    if ((attrv & 0x40) == 0) {
                        func_80052F04(rm);
                    }
                    func_80052E38(om);
                    if ((flags & 0x40) == 0 && L.lp != 0) {
                        func_8002109C(L.cnt, &L.lp);
                    }
                    if (mode == 0) {
                        func_80057094((s32)&L, (s32)otp, 0, ot);
                    } else if (mode == 1) {
                        if (fpc < 2) {
                            func_80027BF0((s32)&L, (s32)otp, 0);
                            fpc++;
                        } else {
                            func_80055D40((s32)&L, (s32)otp, 0, ot);
                        }
                    } else if (mode == 6) {
                        func_800CAE80((s32)&L, (s32)otp, 0);
                    } else if (mode == 5) {
                        func_800243EC((s32)&L, (s32)otp, 0);
                    }
                }
                if ((flags & 0x40) == 0 && L.lp != 0) {
                    func_80021120(&L.cnt, L.lp);
                }
                list++;
                rm++;
                om++;
                w = *list;
            } while (w != 0);
        }
    }

    if (spr != 0) {
        func_80021050(spr);
    }
}

--- func_8001F97C (src/800.c:11747) shares 2: func_80020DA4 func_80020F34 ---
void func_8001F97C(void *a0)
{
    extern void func_80020F34(s32 a0, s32 a1);
    s32 t1, t2, t3;

    func_80020DA4((s32)((u8 *)a0 + 0x10), (s32)((u8 *)a0 + 0x34));

    if (*(u16 *)((u8 *)a0 + 0x2C) & 0x10) {
        func_80020F34((s32)((u8 *)a0 + 0x34), (s32)((u8 *)a0 + 0x18));
    }

    t1 = *(s16 *)((u8 *)a0 + 0x08);
    t2 = *(s16 *)((u8 *)a0 + 0x0A);
    t3 = *(s16 *)((u8 *)a0 + 0x0C);
    *(s32 *)((u8 *)a0 + 0x48) = t1;
    *(s32 *)((u8 *)a0 + 0x4C) = t2;
    *(s32 *)((u8 *)a0 + 0x50) = t3;
    *(u16 *)((u8 *)a0 + 0x2C) |= 1;
}

--- func_80020248 (src/800.c:12280) shares 2: D_80074818 func_80020DA4 ---
s32 func_80020248(s32 *a0, OBJ_80020248 *a1, MTX_80020248 *a2, MTX_80020248 *a3, s32 a4)
{
    MTX_80020248 lm;            /* sp+0x10 */
    MTX_80020248 *rm;
    MTX_80020248 *om;
    u32 w;
    s32 n;
    s32 ret;

    ret = 0;
    n = 0;
    while (*a0++ != 0) {
        n++;
    }

    if (n >= 8) {
        rm = D_80074818;
        om = D_80075018;
    } else {
        rm = (MTX_80020248 *)0x1F800000;
        om = (MTX_80020248 *)0x1F8000E0;
        ret = 1;
    }

    while (--n != -1) {
        func_80020DA4((s32)a1->rot, (s32)&lm);

        w = a1->xy;
        lm.t[0] = w & 0xFFFF;
        lm.t[1] = w >> 16;
        lm.t[2] = a1->z;

        if (a4 == 0) {
            gte_SetRotMatrix(a2);
            gte_ldclmv(&lm.m[0][0]);
            gte_rtir();
            gte_stclmv(&rm->m[0][0]);
            gte_ldclmv(&lm.m[0][1]);
            gte_rtir();
            gte_stclmv(&rm->m[0][1]);
            gte_ldclmv(&lm.m[0][2]);
            gte_rtir();
            gte_stclmv(&rm->m[0][2]);
            rm++;
        }

        gte_SetRotMatrix(a3);
        gte_ldclmv(&lm.m[0][0]);
        gte_rtir();
        gte_stclmv(&om->m[0][0]);
        gte_ldclmv(&lm.m[0][1]);
        gte_rtir();
        gte_stclmv(&om->m[0][1]);
        gte_ldclmv(&lm.m[0][2]);
        gte_rtir();
        gte_stclmv(&om->m[0][2]);

        gte_SetTransMatrix(a3);
        gte_ldlv0(&lm.t[0]);
        gte_rtv0tr();
        gte_stlvnl(&om->t[0]);

        om++;
        a1++;
    }

    return ret;
}

--- func_80020A28 (src/800.c:12591) shares 2: D_80074818 func_80020DA4 ---
s32 func_80020A28(s32 *a0, OBJ_80020A28 *a1, MTX_80020248 *a2, MTX_80020248 *a3, s32 a4)
{
    MTX_80020248 lm;            /* sp+0x10 */
    u16 src[3];                 /* sp+0x30 */
    MTX_80020248 *rm;
    MTX_80020248 *om;
    u8 *c;
    u32 w;
    s32 n;
    s32 ret;

    ret = 0;
    n = 0;
    while (*a0++ != 0) {
        n++;
    }

    if (n >= 8) {
        rm = D_80074818;
        om = D_80075018;
    } else {
        rm = (MTX_80020248 *)0x1F800000;
        om = (MTX_80020248 *)0x1F8000E0;
        ret = 1;
    }

    while (--n != -1) {
        src[0] = *(u16 *)((u8 *)a1 + 6);
        w = a1->xy;
        src[1] = ((w >> 8) & 0xFF) | ((w & 0xF) << 8);
        src[2] = ((w >> 16) & 0xFF) | ((w & 0xF0) << 4);
        func_80020DA4((s32)src, (s32)&lm);

        if (a4 == 0) {
            gte_SetRotMatrix(a2);
            gte_ldclmv(&lm.m[0][0]);
            gte_rtir();
            gte_stclmv(&rm->m[0][0]);
            gte_ldclmv(&lm.m[0][1]);
            gte_rtir();
            gte_stclmv(&rm->m[0][1]);
            gte_ldclmv(&lm.m[0][2]);
            gte_rtir();
            gte_stclmv(&rm->m[0][2]);
            rm++;
        }

        gte_SetRotMatrix(a3);
        gte_ldclmv(&lm.m[0][0]);
        gte_rtir();
        gte_stclmv(&om->m[0][0]);
        gte_ldclmv(&lm.m[0][1]);
        gte_rtir();
        gte_stclmv(&om->m[0][1]);
        gte_ldclmv(&lm.m[0][2]);
        gte_rtir();
        gte_stclmv(&om->m[0][2]);

        gte_SetTransMatrix(a3);
        c = (u8 *)a1 + 3;
        gte_ldlvl_alt(c);
        gte_rtv0tr();
        gte_stlvnl(&om->t[0]);

        om++;
        a1++;
    }

    return ret;
}

--- func_8001F730 (src/800.c:11694) shares 1: func_80020DA4 ---
void func_8001F730(s32 a0, void *a1, void *a2)
{
    s32  matrix[8];   /* sp+0x10 */
    s16  sv[4][4];    /* sp+0x30 */
    s32  out[4][4];   /* sp+0x50 */
    u16 *c = (u16 *)a1;
    u8  *p = (u8 *)a2;

    func_80020DA4(a0, (s32)matrix);
    gte_SetRotMatrix(matrix);

    sv[0][0] = *(u16 *)(p + 0x08) - c[0];
    sv[0][1] = *(u16 *)(p + 0x0A) - c[1];
    sv[0][2] = 0;
    sv[1][0] = *(u16 *)(p + 0x10) - c[0];
    sv[1][1] = *(u16 *)(p + 0x12) - c[1];
    sv[1][2] = 0;
    sv[2][0] = *(u16 *)(p + 0x18) - c[0];
    sv[2][1] = *(u16 *)(p + 0x1A) - c[1];
    sv[2][2] = 0;
    sv[3][0] = *(u16 *)(p + 0x20) - c[0];
    sv[3][1] = *(u16 *)(p + 0x22) - c[1];
    sv[3][2] = 0;

    gte_ldv0(sv[0]);
    gte_rtv0();
    gte_stlvnl(out[0]);

    gte_ldv0(sv[1]);
    gte_rtv0();
    gte_stlvnl(out[1]);

    gte_ldv0(sv[2]);
    gte_rtv0();
    gte_stlvnl(out[2]);

    gte_ldv0(sv[3]);
    gte_rtv0();
    gte_stlvnl(out[3]);

    *(u16 *)(p + 0x08) = c[0] + out[0][0];
    *(u16 *)(p + 0x0A) = c[1] + out[0][1];
    *(u16 *)(p + 0x10) = c[0] + out[1][0];
    *(u16 *)(p + 0x12) = c[1] + out[1][1];
    *(u16 *)(p + 0x18) = c[0] + out[2][0];
    *(u16 *)(p + 0x1A) = c[1] + out[2][1];
    *(u16 *)(p + 0x20) = c[0] + out[3][0];
    *(u16 *)(p + 0x22) = c[1] + out[3][1];
}

