extern int Physics_CalcDistanceClamped(int, int *, int, int);
extern int SWI_Halt(int, int);
extern int Math_Divide(int *, int, int *);
extern int Math_Sqrt(int, int, int);
extern void Level_CreateWalls(int, int, int, int);

void Save_Load(int a0, int a1, int a2, int a3)
{
  register int p1 __asm__("r8") = a1;
  register int p2 __asm__("r9") = a2;
  register int p3 __asm__("sl") = a3;
  int stk[5];
  int r;
  register int h __asm__("r5");
  (void)r;
  {
    int k = 198;
    int a;
    int b;
    int *dst;
    int r0a;
    k <<= 1;
    r0a = a0 + k;
    a = p1 + 72;
    b = p2 + 72;
    dst = &stk[1];
    r = Physics_CalcDistanceClamped(r0a, dst, a, b);
  }
  {
    int s4 = stk[1];
    int s8 = stk[2];
    s4 <<= 4;
    s4 >>= 16;
    s8 <<= 4;
    s8 >>= 16;
    h = SWI_Halt(s4, s8);
    __asm__ volatile("" : "+r"(h));
    h <<= 16;
    h = (int)((unsigned)h >> 20);
    {
      register int *mem __asm__("r6");
      register int dummy __asm__("r4");
      stk[3] = stk[1];
      {
        register int t __asm__("r3") = stk[2];
        stk[4] = t;
      }
      {
        int *a0 = &stk[3];
        int *a2 = &stk[4];
        mem = (int *)0x02000C60;
        dummy = *(volatile int *)((char *)mem + 4);
        (void)dummy;
        Math_Divide(a0, stk[1], a2);
      }
      {
        register int sa __asm__("r0") = stk[3];
        register int sb __asm__("r2") = stk[4];
        int sum = sa + sb;
        int sign = sum >> 31;
        int m2 = *(int *)((char *)mem + 16);
        int sq = Math_Sqrt(sum, sign, m2);
        sq <<= 6;
        stk[0] = sq;
      }
    }
  }
  Level_CreateWalls(p1, p2, h, p3);
}
