extern int Math_SqrtFixed(int a, int b, int c, char *d);
int Math_CalcLookup(int a, int b, int c)
{
  register int ra __asm__("r4") = a;
  register int rb __asm__("r5") = b;
  register int rc __asm__("r6") = c;
  unsigned short buf[96];
  unsigned short *dma;
  unsigned short v;
  register int *flag __asm__("r3");
  unsigned short *src;
  unsigned short *dst;
  register int *flag2 __asm__("r1");
  register unsigned nn __asm__("r0");
  int mm;
  register char *extra __asm__("r3");
  dma = (unsigned short *)0x04000204;
  v = *dma;
  v = (v & 0xFFFC) | 3;
  *dma = v;
  flag = (int *)0x08014EA1;
  __asm__ volatile("" : "+r" (flag));
  src = (unsigned short *)((unsigned)flag & ~1u);
  dst = buf;
  nn = 0x08014ED1;
  flag2 = (int *)0x08014EA1;
  __asm__ volatile("" : "+r" (flag2));
  nn = (nn - (unsigned)flag2) << 15;
  goto test;
loop:
  *dst = *src;
  src++;
  dst++;
  nn = (mm - 1) << 16;
test:
  mm = nn >> 16;
  if (mm != 0)
    goto loop;
  extra = (char *)buf + 1;
  __asm__ volatile("" : : "r" (extra));
  return Math_SqrtFixed(ra, rb, rc, extra);
}
