#include "game_types.h"

/* Sub_0800F6F0 @ 0x0800F6F0 (real 196B) -- chained setup with gap calls. Mirrors src/matched/Sub_0800F6F0.c. */
/* Runs the 118EC/109E8 setups, five gap calls (raw bl to unmapped spans --
   verify each target, never assume), mirrors a flag halfword to 0x04000008,
   posts two channel entries, sets the volume, conditionally runs the second
   gap call, and draws scaled. F000/FEED-class pools are VALUES here. */
extern void Sub_080118EC(int *p, int mode);
extern void Sub_080109E8(int *p);
extern void Sub_0800F6F0_GapA(int *a, int *b);
extern void Sub_0800F6F0_GapB(int *a, int b, int c);
extern void Sub_0800F6F0_GapC(int *a, int b);
extern void Sub_0800F6F0_GapD(int *a, int b);
extern void Sub_0800F6F0_GapE(int *a, int b);
extern void Sub_08011A20(int a, int b, int c, int d);
extern void Sound_SetVolume(int *p);
extern int Sub_0800F6F0_GapF(int *p);
extern void Sub_0800F6F0_GapG(int *p);
extern void Image_DrawScaled(int *dst, int acc);

void Sub_0800F6F0(int *p)
{
    Sub_080118EC((int *)((char *)p + 28), 1);
    Sub_080109E8((int *)((char *)p + 152));
    Sub_0800F6F0_GapA((int *)((char *)p + 324), (int *)((char *)p + 332));
    Sub_0800F6F0_GapB((int *)((char *)p + 356), 128, 0);
    Sub_0800F6F0_GapC((int *)((char *)p + 0x564), 8);
    Sub_0800F6F0_GapD((int *)((char *)p + 0x5E4), 16);
    Sub_0800F6F0_GapE((int *)((char *)p + 0x6A4), 8);
    {
        int *t = *(int **)0x02000154;
        *(unsigned short *)0x04000008 =
            (unsigned short)(*(unsigned short *)((char *)t + 20) | 40);
    }
    Sub_08011A20(3, 0x0800FEE1, 0, 0);
    Sub_08011A20(3, 0x0800FEED, 0, 0);
    Sound_SetVolume(p);
    if ((Sub_0800F6F0_GapF(p) & 0xFF) == 0)
        Sub_0800F6F0_GapG(p);
    Image_DrawScaled((int *)((char *)p + 0xA58),
                     *(unsigned short *)0x0400010C);
}
