the cutting room mirror

Radiant Silvergun (Arcade)

A vertical shoot-'em-up game that's considered to be a predecessor to Ikaruga.

Regional Differences#

The ST-V version, when using a non-Japanese BIOS, has quite different behavior than the Japanese version. These changes have never been present in any other version of the game.

  • Practice stage removed
  • Boss introductions removed
  • Button 3 completely disabled
  • Button 1+2 together uses the sword
  • Button 2 shoots shot C
  • Shot C additionally shoots directly behind the player
  • Shot C bombs-on-screen limit is 8 instead of 5 (It actually literally compares to a double-precision floating point 7.5, but that just ends up being effectively 8)

Source Code#

Large amounts of uncompiled source code can be found throughout the ST-V version's ROM. These addresses are assuming the ROM has been pre-concatenated.

0xC8800

This is part of the source code for the boss Golets.

eam[]={
    0x2000,
    0x2400,
    0x2800,
    0x2c00,
    0x3000,
};
/*-----------------------------------------------------------------*/
static  void    rain_beam(ENM_WK *x){
/*-----------------------------------------------------------------*/
    if(shot_kill_chk((COMM_OBJ *)x,1)){
        ;
    }else{
        if(x->sp==0){
            x->s8w1--;
            x->mw.zoomx += 0x800;
            if(x->s8w1<=0){
                x->sp++;
                x->s8w1 = 16;
                if(x->s8w0){
                    x->mw.angz = x->s16w0;
                }else{
                    x->mw.angz = get_ang(x, get_play0(&x->mw));
                }
                x->dx = 0;
                x->dy = 0;
//              x->s32w0 = fixmuls(sin32(x->mw.angz),+0x2c00);
//              x->s32w1 = fixmuls(cos32(x->mw.angz),-0x2c00);
                x->s32w0 = fixmuls(sin32(x->mw.angz),+LV5_rain_beam[LV5]);
                x->s32w1 = fixmuls(cos32(x->mw.angz),-LV5_rain_beam[LV5]);
            }
            x->dx += x->s32w0;
            x->dy += x->s32w1;
        }else{
            if(x->s8w1>0){
                x->s8w1--;
                x->dx += x->s32w0;
                x->dy += x->s32w1;
                x->mw.zoomx -= 0x800;
                x->mw.zoomy -= 0x180;
            }
        }
        x->mw.x += x->dx;
        x->mw.y += x->dy;
    }
    x->mw.anm_no = rain_beam_anm[gtimer&3];
}
/*-----------------------------------------------------------------*/
static  void    rain_beam_set(DELIVERY_WK *dw, BOS12_WK *ms){
/*-----------------------------------------------------------------*/
    ENM_WK  *x;

    x = obj_set(ENM_OBJ_AREA,obj_size(sizeof(ENM_WK)),shot);
    if(x == NULL)   return;

    mw_init(&x->mw);
    aw_init(&x->aw);
    ENM_WK_init(x);

    x->mw.obj_no        = ms->mw.obj_no;
    x->mw.dousa_func    = rain_beam;
    x->mw.sys_fg        = KILL_TAMA|SPR_NO_CUT_FG;

    x->mw.x = ms->rain_pos[X];
    x->mw.y = ms->rain_pos[Y];
    x->mw.z = 0;
    x->mw.pri_ofs = PRI_INU;

    x->mw.anm_no    = A_MARU1;
    x->mw.char_no   = CHAR_EFT;

    x->aw.atari_tbl_adr = at_rain_beam;
    x->aw.nakama        = NAKAMA_ENM;
    x->aw.zoku          = ZOKU_TAMA;

    x->s8w0    = dw->par;       /* Shoot Type */
    x->s8w1    = 16;            /* Speed Down Flame */
    x->mw.angz = dw->Ds16w0;    /* 1st angZ */
    x->s16w0   = dw->Ds16w1;    /* 2nd angZ */

    x->dx    = fixmuls(sin32(x->mw.angz),x->s8w1*+dw->Ds16w2*DEC/0x10);
    x->dy    = fixmuls(cos32(x->mw.angz),x->s8w1*-dw->Ds16w2*DEC/0x10);
    x->s32w0 = x->dx/-0x10;
    x->s32w1 = x->dy/-0x10;

    x->mw.zoomx = 0x1000;
    x->mw.zoomy = 0x8000;

    if(x->s8w0){
        x->mw.color_b   = char_tbl[CHAR_EFT].color + COL_YRED;
    }else{
        x->mw.color_b   = char_tbl[CHAR_EFT].color + COL_YELLOW;
    }
    x->mw.color_m   = x->mw.color_b;
}
/*============================================*/
/* ------------------------------------------ */
/*            Bakurai Touka                   */
/* ------------------------------------------ */
/*============================================*/
static  ATARI_TBL   at_baku[]={
    {   (ATFG_ATTACK | ATFG_TBL_END),   AT_NML,+0x00,+0x00,0x10,0x10,   },
};
extern  void    eft_moon(EFTC_OBJ *x);
/*-----------------------------------------------------------------*/
static  void    moon2(EFTC_OBJ *x){
/*-----------------------------------------------------------------*/
    eft_moon(x);
    x->mw.y -= SC_DY;
}
/*-----------------------------------------------------------------*/
static  void    baku(ENM_WK  *x){
/*-----------------------------------------------------------------*/
    EFTC_OBJ    *p;
    DELIVERY_WK dw;

    if(x->sp==0){
        x->dy    += 0x0e00;
        x->s32w0 += 0x0b00;

        if(x->mw.z > 0){
            x->sp++;
            x->mw.sys_fg = KILL_TAMA;
            x->dy = -SC_DY;
            x->s32w0 = 0;
            x->s32w1 = +0x1000;
            x->mw.zoomx = 0x2000;
    
            x->mw.anm_no    = A_MARU0;
            x->mw.char_no   = CHAR_EFT;
            x->mw.color_m   = 
            x->mw.color_b   = char_tbl[CHAR_EFT].color + COL_YRED;

            dw.x = x->mw.x;
            dw.y = x->mw.y;
            dw.z = x->mw.z;
            dw.Ds32w0 = +0x14000;
            p = eft_moon_set(&dw);
            if(p){
                p->mw.dousa_func = moon2;
            }
            se_set(SE02_BAKU2_2,x->mw.x);
        }else{
            if(x->mw.z < -0x30*DEC){
                x->mw.anm_no = A_SONI_BAKURAI01_A;
            }
            if(x->mw.z < -0x28*DEC){
                x->mw.anm_no = A_SONI_BAKURAI02_A;
            }
            if(x->mw.z < -0x20*DEC){
                x->mw.anm_no = A_SONI_BAKURAI03_A;
            }
            if(x->mw.z < -0x18*DEC){
                x->mw.anm_no = A_SONI_BAKURAI04_A;
            }else{
                x->mw.anm_no = A_SONI_BAKURAI05_A;
            }
            x->mw.anm_no += gtimer&1;
        }
    }else{
        x->mw.anm_no = rain_beam_anm[gtimer&3];
        x->mw.angz = RAND;
        x->s32w1 -= 0x080;
        x->mw.zoomx += x->s32w1;
        x->mw.zoomy = x->mw.zoomx;

        if(x->s32w0<0&&x->mw.zoomx<0x3000){
            x->mw.sys_fg = (KILL_TAMA|ATARI_OFF_FG);
        }
        x->mw.sys_fg &= -(X_FLP|Y_FLP)-1;
        x->mw.sys_fg |= RAND&(X_FLP|Y_FLP);
    }
    x->mw.y += x->dy;
    x->mw.z += x->s32w0;

    if(x->sp && (range_chk(&x->mw)||x->mw.zoomx<0)){
        x->mode = OBJ_M_KIE;
    }
}
/*-----------------------------------------------------------------*/
static  void    baku_set(DELIVERY_WK *dw){
/*-----------------------------------------------------------------*/
    ENM_WK  *x;

    x = obj_set(ENM_OBJ_AREA,obj_size(sizeof(ENM_WK)),shot);
    if(x == NULL)   return;

    mw_init(&x->mw);
    aw_init(&x->aw);
    ENM_WK_init(x);

    x->mw.obj_no        = dw->Dobj_no;
    x->mw.dousa_func    = baku;
    x->mw.sys_fg        = (KILL_TAMA|ATARI_OFF_FG);

    x->mw.x = dw->x;
    x->mw.y = dw->y;
    x->mw.z = dw->z;
    x->dy = -0x00000;
    x->mw.pri_ofs = PRI_SHOT;

    x->mw.anm_no    = A_SONI_BAKURAI01_A;
    x->mw.char_no   = CHAR_SONIC_E;
    x->mw.color_m   = 
    x->mw.color_b   = char_tbl[CHAR_SONIC_E].color + COL_SONIC_EFT;

    x->aw.atari_tbl_adr = at_baku;
    x->aw.nakama        = NAKAMA_ENM;
    x->aw.zoku          = ZOKU_TAMA;
    return;
}
/*============================================*/
/* ------------------------------------------ */
/*            SHUTTER VELM                    */
/* ------------------------------------------ */
/*============================================*/
extern  void    enm00_dead(COMM_OBJ *);
extern  ATARI_TBL   at_enm00_0[];
#define ENM00_0_LIFE        (SHOT_PW_VALCAN*2)      /* VELM */
/*=================================================================*/
static  void    bos12_enm00(ENM_WK *x){
/*=================================================================*/
    if(x->mw.y > +0x80*DEC){
        x->mode = OBJ_M_KIE;
            return;
    }
    if(x->aw.life <= 0){
        enm00_dead((COMM_OBJ *) x);
        x->mode = OBJ_M_KIE;
    }else{
        x->mw.anm_no = (x->mw.anm_no+1)&0x1f;
        x->mw.y -= SC_DY;
    }
}
/*=================================================================*/
static  void    bos12_enm00_set(DELIVERY_WK *dw){
/*=================================================================*/
    s8  i;
    ENM_WK  *x;

    i = ENM_OBJ_get();
    if(i == DUMMY_OBJ)  return;
    x = obj_set(ENM_OBJ_AREA,obj_size(sizeof(ENM_WK)),enm);
    if(x == NULL)       return;

    mw_init(&x->mw);
    aw_init(&x->aw);
    ENM_WK_init(x);

    x->mw.dousa_func    = bos12_enm00;
    x->mw.sys_fg        = KILL_TAMA|Y_FLP;
    x->mw.obj_no        = i;
    obj_x[x->mw.obj_no] = x;

    x->mw.char_no       = CHAR_VELM;
    x->mw.anm_no        = 0;
    x->aw.atari_tbl_adr = at_enm00_0;
    x->aw.life          = ENM00_0_LIFE;
    x->mw.color_m       = char_tbl[CHAR_VELM].color + ZOKU_YELLOW*0x10;
    x->mw.color_b       = x->mw.color_m;

    x->aw.nakama    = NAKAMA_ENM;
    x->aw.zoku      = ZOKU_YELLOW;

    x->mw.x = dw->x;
    x->mw.y = dw->y;
    x->mw.z = 0;
}
/*============================================*/
/* ------------------------------------------ */
/*            SHUTTER                         */
/* ------------------------------------------ */
/*============================================*/
/*=================================================================*/
static  ATARI_TBL   at_shut0[]={
/*=================================================================*/
    {(ATFG_ATTACK               ),  AT_BODY,+0x34,+0x00,0x22,0x03,},
    {(ATFG_DAMAGE | ATFG_TBL_END),  DM_NML, +0x34,+0x00,0x28,0x04,},
};
/*=================================================================*/
static  ATARI_TBL   at_shut1[]={
/*=================================================================*/
    {(ATFG_ATTACK               ),  AT_BODY,-0x34,+0x00,0x22,0x03,},
    {(ATFG_DAMAGE | ATFG_TBL_END),  DM_NML, -0x34,+0x00,0x28,0x04,},
};
/*=================================================================*/
static  void    shutout(ENM_WK *x){
/*=================================================================*/
    if(gtimer&1){
        x->aw.atari_tbl_adr = at_shut0;
    }else{
        x->aw.atari_tbl_adr = at_shut1;
    }
    x->mw.y -= SC_DY;
    if(x->mw.y>(+0x80*DEC+(+0x10*DEC/2))){
        x->mode = OBJ_M_KIE;
    }
}
/*=================================================================*/
static  void    shutout_disp(MAIN_WK *mw){
/*=================================================================*/
    ENM_WK  *x;
    MAIN_WK m;

    x = (ENM_WK *)((u32)mw-0x10);

    mw_init(&m);

    m.char_no = CHAR_SONIC_E;
    m.anm_no    = A_STAGE2_KABE;
    m.pri_ofs   = PRI_ENM;
    m.color_m   = 0x2000+char_tbl[CHAR_SONIC_E].color+COL_STAGE2_KABE;

    m.y = x->mw.y;
    m.z = 0;
    m.x = x->mw.x-0x34*DEC;
    spr_put(&m);
    m.x = x->mw.x+0x34*DEC;
    spr_put(&m);
}
/*=================================================================*/
static  void    shutout_set(s32 XP, s32 YP, BOS12_WK *ms, u8 FG){
/*=================================================================*/
    s8      i;
    ENM_WK  *p;
    DELIVERY_WK dw;
/*--------------------------------------------------------*/
    i = ENM_OBJ_get();
    if(i == DUMMY_OBJ)  return;
    p = obj_set(ENM_OBJ_AREA,obj_size(sizeof(ENM_WK)),enm);
    if(p == NULL)       return;
/*--------------------------------------------------------*/
    mw_init(&p->mw);
    aw_init(&p->aw);
    ENM_WK_init(p);

    p->mw.dousa_func    = shutout;
    p->mw.sys_fg        = (MODEL_DISP_FG|MODEL_FUNC_CALL_FG
                          |ATARI_MUTEKI_FG|ATARI_STEALTH_FG|KILL_TAMA);
    p->mw.poly_adr      = shutout_disp;
    p->mw.obj_no        = i;
    obj_x[p->mw.obj_no] = p;

    p->aw.atari_tbl_adr = at_shut0;
    p->aw.life          = 10;

    p->aw.nakama    = NAKAMA_KABE;
    p->aw.zoku      = ZOKU_NORMAL;

    p->mw.x = XP+(ms->scr_shut*16*DEC);
    p->mw.y = YP;
    if(RAND&0x10){
        if(ms->scr_shut>-2){
            ms->scr_shut--;
        }else{
            ms->scr_shut++;
        }
    }else{
        if(ms->scr_shut<+2){
            ms->scr_shut++;
        }else{
            ms->scr_shut--;
        }
    }
    if(FG && ms->zibaku==0){
        dw.x = p->mw.x;
        dw.y = p->mw.y;
        bos12_enm00_set(&dw);
    }
}
/*============================================================================*/
/* ------------------------------------------                                 */
/*              Sub Routines                                                  */
/* ------------------------------------------                                 */
/*============================================================================*/
/*=================================================================*/
static  BOS12_WK    *get_letsGO(BOS12_WK *x){
/*=================================================================*/
    return  obj_x[x->LG_no];
}

/*============================================================================*/
/* ------------------------------------------                                 */
/*              Steps Init                                                    */
/* ------------------------------------------                                 */
/*============================================================================*/
/*=================================================================*/
static  void    IDEON_SWORD_init(BOS12_WK *x){
/*=================================================================*/
    x->sp = s_IDEON_SWORD;
    x->runYpos = (+0x40+0x20)*DEC;
    x->s16w0 = 45;
    x->s32w0 = 0;
    x->s32w1 = 0;
    x->s32w2 = DEC;
    x->s32w3 = DEC;
}

/*============================================================================*/
/* ------------------------------------------                                 */
/*              Steps Main (SONIC)                                            */
/* ------------------------------------------                                 */
/*============================================================================*/
#if EDIT
    #include    "ang_edt.c"
    #include    "mot_edt.c"
/*=================================================================*/
static  void    TEST(BOS12_WK *x){
/*=================================================================*/
//  s16 *p;

    ang_edit(&x->mw);
    mot_edit(&x->sw,&x->ew);

#if 0
    /* Hit3D Posi Edit */
    if(spad[PAD_1P].trig & PAD_L){
        x->p0_posi_num--;
        if(x->p0_posi_num<0){
            x->p0_posi_num = p0_suu-1;
        }
    }
    if(spad[PAD_1P].trig & PAD_R){
        x->p0_posi_num++;
        if(x->p0_posi_num>p0_suu-1){
            x->p0_posi_num = 0;
        }
    }
    if(spad[PAD_1P].trig & PAD_UP){
        x->p0_menu--;
        if(x->p0_menu<0){
            x->p0_menu = 0;
        }
    }
    if(spad[PAD_1P].trig & PAD_DOWN){
        x->p0_menu++;
        if(x->p0_menu>3){
            x->p0_menu = 3;
        }
    }

    p = &p0_posi_data[4 * x->p0_posi_num];

    if(spad[PAD_1P].data & PAD_A){
        if(spad[PAD_1P].data & PAD_LEFT){
            *(p+x->p0_menu) -= 1;
        }
        if(spad[PAD_1P].data & PAD_RIGHT){
            *(p+x->p0_menu) += 1;
        }
    }else{
        if(spad[PAD_1P].trig & PAD_LEFT){
            *(p+x->p0_menu) -= 1;
        }
        if(spad[PAD_1P].trig & PAD_RIGHT){
            *(p+x->p0_menu) += 1;
        }
    }
    if(x->p0_menu == 3){
        *(p+x->p0_menu) &= 3;
    }

        num_set16(+0x80*DEC,+0x30*DEC,0,x->p0_posi_num);

    if(!(x->p0_menu==0 && gtimer&1)){
        num_set16(+0x80*DEC,+0x40*DEC,0,*(p+X));
    }
    if(!(x->p0_menu==1 && gtimer&1)){
        num_set16(+0x80*DEC,+0x48*DEC,0,*(p+Y));
    }
    if(!(x->p0_menu==2 && gtimer&1)){
        num_set16(+0x80*DEC,+0x50*DEC,0,*(p+Z));
    }
    if(!(x->p0_menu==3 && gtimer&1)){
        num_set16(+0x80*DEC,+0x60*DEC,0,*(p+3));
    }
#endif
}
#endif


/*=================================================================*/
/*=================================================================*/
/*=================================================================*/
#if SCR_DBG
static  void    test_hit_set(s32 XP, s32 YP);
#endif

/*=================================================================*/
static  void    RUN_se(BOS12_WK *x, s32 se_Xpos){
/*=================================================================*/
    if(x->runXpos != se_Xpos){
        se_set(SE02_BURNER2_2,x->mw.x);
    }
}
/*=================================================================*/
static  void    set_run_rain_beam(BOS12_WK *x){
/*=================================================================*/
    DELIVERY_WK dw;

    if(LV5<2){
        return;
    }
    se_set(SE_T_SHOT1,x->mw.x);

    dw.par    = 0x0000; /* Type */
    dw.Ds16w2 = 0x0007; /* 1st Speed */

    dw.Ds16w0 = 0xe000; /* 1st angZ */
    rain_beam_set(&dw,x);
    dw.Ds16w0 = 0x2000; /* 1st angZ */
    rain_beam_set(&dw,x);

    dw.Ds16w0 = 0xc000; /* 1st angZ */
    rain_beam_set(&dw,x);
    dw.Ds16w0 = 0x4000; /* 1st angZ */
    rain_beam_set(&dw,x);

    dw.Ds16w0 = 0xa000; /* 1st angZ */
    rain_beam_set(&dw,x);
    dw.Ds16w0 = 0x6000; /* 1st angZ */
    rain_beam_set(&dw,x);
}
/*=================================================================*/
static  void    SCROLL(BOS12_WK *x){
/*=================================================================*/
    s8  i,suu,set;
    u16 dat;
    s32 s32w0;
    FIXED       XpYp[XY];
    u8  FG;
#if SCR_DBG
    s16 BGX;
#endif
    DELIVERY_WK dw;
/*-------------------------------------*/
/*  Boss Moved Command                 */
/*-------------------------------------*/
    for(i=0; i<2; i++){
        x->scr_y[i] += SC_DY;
        if(x->scr_y[i] < -0x80*DEC){
/*-------------------------------------*/
#if SCR_DBG
            BGX = SCROLL_BG[(x->scr_step*2)+0];
            if(BGX!=BG_END){
                test_hit_set(BGX*DEC,(-0x80-0xc0)*DEC);
            }
            BGX = SCROLL_BG[(x->scr_step*2)+1];
            if(BGX!=BG_END){
                test_hit_set(BGX*DEC,(-0x80-0xc0)*DEC);
            }
#endif
/*-------------------------------------*/
            x->scr_step++;
            dat = SCROLL_proc[x->scr_step];
            if(dat==SC_loop){
                x->zibaku++;
                x->scr_step = 0;
                dat = SCROLL_proc[0];
            }
            x->scr_p[i] = dat&0xf;
            x->scr_y[i] += 0x80*2*DEC;

        /*---------------------*/
        /* Change Running Root */
        /*---------------------*/
            if(BACK_RUN_CHK){
                get_play_posi(x, 0, &XpYp[0]);

                if(XpYp[X]>0){
                    x->scr_rand[i] = -1;
                }else{
                    x->scr_rand[i] = +1;
                }
                if(LV5<3){
                    x->scr_rand[i] = 0-x->scr_rand[i];
                }
            }else{
                if(RAND&0x10){
                    x->scr_rand[i] = -1;
                }else{
                    x->scr_rand[i] = +1;
                }
            }
        /*-----------------*/
        /* Scroll Objs Set */
        /*-----------------*/
            suu = 0;
            yaji_set(x,dat&0xf00);
            dat &= 0xff;
            switch(dat){
                case    SC_ZERO  + ESET_SHUTOUT_SEL:
                    if(x->mw.x>0){
                        s32w0 = -0x78*DEC;
                    }else{
                        s32w0 = +0x78*DEC;
                    }
                    for(; suu<3; suu++){
                        shutout_set(s32w0,
                                    (-0x80-0x94-(suu*0x2c))*DEC,x,1);
                    }
                    x->scr_p[i] = SC_ZERO;
                    break;

                case    SC_CENT  + ESET_SHUTOUT_ENM6:
                case    SC_CENT  + ESET_SHUTOUT_START6:
                case    SC_CENT  + ESET_SHUTOUT_START:
                    set_run_rain_beam(x);

                    x->scr_shut = x->scr_rand[i];

                    if(dat==SC_CENT+ESET_SHUTOUT_ENM6  ){
                        FG = 1;
                    }else{
                        FG = 0;
                    }
                    if(dat==SC_CENT+ESET_SHUTOUT_START6
                    || dat==SC_CENT+ESET_SHUTOUT_ENM6  ){
                        set = 6;
                    }else{
                        set = 3;
                    }
                    for(; suu<set; suu++){
                        shutout_set(x->scr_rand[i]*-0x78*DEC,
                                    (-0x80-0x94-(suu*0x2c))*DEC,x,FG);
                    }
                    x->scr_p[i] = SC_CENT;
                    break;

                case    SC_CENT2 + ESET_SHUTOUT_START:
                    set_run_rain_beam(x);

                    x->scr_shut = x->scr_rand[i];
                    for(; suu<3; suu++){
                        shutout_set(x->scr_rand[i]*-0x78*DEC,
                                    (-0x80-0x94-0x80-(suu*0x2c))*DEC,x,0);
                    }
                    x->scr_p[i] = SC_CENT2;
                    break;
                case    SC_ZERO  + ESET_GO_SET:
                    x->fg ^= 1;
                    x->scr_p[i] = SC_ZERO;
                    break;
                case    SC_ZERO  + ESET_FIGHT:
                    x->fg ^= 2;
                    x->btimer = 0;
                    x->scr_p[i] = SC_ZERO;
                    x->IDEON_X_fg = 30;
                    break;
            }
        }
    }
/*-------------------------------------*/
/* Command Trans ???                   */
/*-------------------------------------*/
    for(i=0; i<2; i++){
        if(x->scr_rand[i] && -x->scr_y[i]>=(x->mw.y-0x10*DEC)){
            x->scr_command = x->scr_p[i];
            switch(x->scr_command){
                case    SC_ZERO:
            /*--------------*/
            /* 2way Missile */
            /*--------------*/
                    if(((x->sp==s_WAIT && x->runYpos>0)
                    && (x->IDEON_X==0||(x->IDEON_X!=0&&i)))
                    || (x->sp==s_IDEON_SWORD
                    && x->p1_fg&fg_brk&&x->p2_fg&fg_brk)){
                        dw.x = x->rain_pos[X];
                        dw.y = x->rain_pos[Y];
                        dw.z = 0;
                        dw.Ds32w3 = 0x1c000;    /* Speed */
                        dw.Ds16w1 = 40;         /* Homing Flame */
                        dw.Ds16w3 = 0x2000;     /* Re_Ang_Mode (64) */
                        dw.Ds16w0 = x->mw.angz;
                    
                        dw.Ds16w4 = dw.Ds16w0+0x0e00;   /* First Dir */
                        eshot03_set_cstm(&dw);
                        dw.Ds16w4 = dw.Ds16w0-0x0e00;   /* First Dir */
                        eshot03_set_cstm(&dw);
                    }
                    break;
                case    SC_SIDE:
                    RUN_se(x,0);
                    x->runsgt  = 0x20;
                    x->runXpos = 0;
                    x->runHundle = 0x50;
                    break;
                case    SC_SIDE2:
                    RUN_se(x,0);
                    x->runsgt  = 0x80;
                    x->runXpos = 0;
                    x->runHundle = 0x18;
                    break;
                case    SC_CENT2:
                    RUN_se(x,0x78*DEC*x->scr_rand[i]);
                    x->runsgt  = 0x80;
                    x->runXpos = 0x78*DEC*x->scr_rand[i];
                    x->runHundle = 0x18;
                    break;
                case    SC_CENT:
                    RUN_se(x,0x78*DEC*x->scr_rand[i]);
                    x->runsgt  = 0x20;
                    x->runXpos = 0x78*DEC*x->scr_rand[i];
                    x->runHundle = 0x50;
                    break;
                case    SC_LFT2:
                    RUN_se(x,+0x78*DEC);
                    x->runsgt  = 0x60;
                    x->runXpos = +0x78*DEC;
                    x->runHundle = 0x38;
                    break;
                case    SC_RGT2:
                    RUN_se(x,-0x78*DEC);
                    x->runsgt  = 0x60;
                    x->runXpos = -0x78*DEC;
                    x->runHundle = 0x38;
                    break;
                case    SC_BACK_TURN:
                    if(BACK_RUN_CHK){
                        IDEON_SWORD_init(x);
                    }else{
                        x->sp = s_BACK_TURN;
                        x->runspd = -SC_DY+DEC+0x8000;
                        x->runHundle = 0x40;
                        x->s32w0 = 0;
                        x->s32w1 = 0;
                        se_set(SE02_KAITEN2_2,x->mw.x);
                        M_hit_off(x);
                    }
                    break;
            }
            x->scr_rand[i] = 0;
        }
    }
    x->runZ = atan(x->runXpos-x->mw.x, (x->mw.y-x->runsgt*DEC)-x->mw.y);
    x->mw.y -= SC_DY;
}
/*=================================================================*/
static  void    RUN_rot(BOS12_WK *x){
/*=================================================================*/
    rot_sub(&x->angZspd,&x->angZssp,x->mw.angz,x->runZ,
            0x2000,8,x->runHundle);
    rot_sub(&x->angYspd,&x->angYssp,x->mw.angy,-x->mw.angz,
            0x4000,0x10,0x060);
}
/*=================================================================*/
static  void    RUN_sub(BOS12_WK *x){
/*=================================================================*/
    x->dx = fixmuls(sin32(x->mw.angz),-SC_DY+DEC);

    if(x->mw.y<x->runYpos+get_rand(0x10000)){
        x->runspd = comps32(x->runspd,-SC_DY-0x10000,0x8000);
        x->dy = -fixmuls(cos32(x->mw.angz),x->runspd);
    }else{
        x->runspd = comps32(x->runspd,-SC_DY+0xe000, 0x7000);
        x->dy = -fixmuls(cos32(x->mw.angz),x->runspd);
    }
}
/*=================================================================*/
static  void    DEMO(BOS12_WK *x){
/*=================================================================*/
    x->angYspd = comps32(x->angYspd, 0x800,0x20);
    x->angYssp = (x->mw.y/DEC)*-0x20;
    x->mw.x = (sin32(x->mw.angy+0x8000+x->angYssp)*((-x->mw.y/(DEC*2))-0x20));
    x->mw.z = (cos32(x->mw.angy+0x8000+x->angYssp)*-0x20)-0x40*DEC;
    x->dy = -0x20000;
    if(x->mw.y<0){
        x->sp++;
        x->mw.angx = 0;
        x->mw.angz = 0;
        if(x->LG_fg==0){
            M_hit_on(x);
            x->dx = -0x38000;
        }else{
            x->dx = +0x40000;
        }
    }
}
/*=================================================================*/
static  void    DEMO_1(BOS12_WK *x){
/*=================================================================*/
    if(x->LG_fg==0){
        x->dy += 0x0a00;
        x->dx += 0x1400;
        x->angYspd -= 0x2d;
        x->dz += 0x0696;

        if(x->dx>0 && x->mw.x>-0x30*DEC){
            x->sp++;
            x->angYssp = x->angYspd*2;
        }
    }else{
        x->angZspd -= 0x4;
        x->dx -= 0x4000;
        x->dy -= 0x0800;
        x->angYspd += 0x30;
        x->dz -= 0x0100;

        if(x->mw.y<-0x120*DEC){
            x->sp = m_Wait;
            x->mw.sys_fg = (SPR_DISP_CUT|ATARI_OFF_FG);
            x->dx = 0;
            x->dy = 0;
            x->dz = 0;
        }
    }
}
/*=================================================================*/
static  void    DEMO_2(BOS12_WK *x){
/*=================================================================*/
    RUN_rot(x);

    x->dx = comps32(x->dx, 0, 0x1234);
    x->dz = comps32(x->dz, 0, 0x1000);
    x->dy -= 0x700;

    if(x->dz==0){
        x->sp = s_WAIT;
        x->dy = 0;
        x->mw.z = 0x10*DEC;
    }
}
static  u8  LV5_kirai[]={
    40,
    30,
    20,
    17,
    14,
};
/*=================================================================*/
static  void    WAIT(BOS12_WK *x){
/*=================================================================*/
    PLAY_OBJ    *pw;
    DELIVERY_WK dw;

//  rot_sub(&x->angXspd,&x->angXssp,x->mw.angx,0,
//          0x1800,0x10,0x040);

    SCROLL(x);

/*------------------*/
/* Running Position */
/*------------------*/
    if(BACK_RUN_CHK){
        x->runYpos = (+0x48+0x20)*DEC;
    }else{
        x->runYpos = (-0x3c+0x20)*DEC;
    }
/*----------------*/
/* Running Attack */
/*----------------*/
    dw.Dobj_no = x->mw.obj_no;

    if(x->fg&2){

        x->IDEON_X = comps32(x->IDEON_X,16,2);
        if(x->IDEON_X == 14){
            se_set(SE02_METAL2_2,x->mw.x);
        }

    /*--------------*/
    /* Search Laser */
    /*--------------*/
        if(x->IDEON_X==16 && x->btimer>40){

            x->runZ = 0;

            pw = get_play0(&x->mw);
            dw.Ds32w0 = x->mw.x - pw->mw.x;
            if(dw.Ds32w0 > +0x0c*DEC){
                x->mw.x -= 0x2000;
            }
            if(dw.Ds32w0 < -0x0c*DEC){
                x->mw.x += 0x2000;
            }
            if(x->mw.x > +0x40*DEC){
                if(x->mw.x > (+0x78*DEC)+(0x10*DEC)){
                    x->mw.x =(+0x78*DEC)+(0x10*DEC);
                }
                if(x->mw.x < (+0x78*DEC)-(0x10*DEC)){
                    x->mw.x =(+0x78*DEC)-(0x10*DEC);
                }
            }else{
                if(x->mw.x < -0x40*DEC){
                    if(x->mw.x < (-0x78*DEC)-(0x10*DEC)){
                        x->mw.x =(-0x78*DEC)-(0x10*DEC);
                    }
                    if(x->mw.x > (-0x78*DEC)+(0x10*DEC)){
                        x->mw.x =(-0x78*DEC)+(0x10*DEC);
                    }
                }else{
                    if(x->mw.x > (+0x00*DEC)+(0x14*DEC)){
                        x->mw.x =(+0x00*DEC)+(0x14*DEC);
                    }
                    if(x->mw.x < (+0x00*DEC)-(0x14*DEC)){
                        x->mw.x =(+0x00*DEC)-(0x14*DEC);
                    }
                }
            }

            if(rest(x->btimer,WAIT_rain_tym[LV5])==0){
                se_set(SE_T_SHOT1,x->mw.x);

                dw.par    = 0x0000; /* Type */
                dw.Ds16w2 = 0x0007; /* 1st Speed */
                if(x->mw.y>0 || x->p6_fg&fg_brk || x->p4_fg&fg_brk){
                    dw.Ds16w0 = 0xd000; /* 1st angZ */
                    rain_beam_set(&dw,x);
                }
                if(x->mw.y>0 || x->p5_fg&fg_brk || x->p3_fg&fg_brk){
                    dw.Ds16w0 = 0x3000; /* 1st angZ */
                    rain_beam_set(&dw,x);
                }
            }
    /*-------------*/
    /* Armd Vulcan */
    /*-------------*/
            if(x->mw.y<0 && rest(x->btimer,25)==0){
                if(rest(x->btimer,25*2)==0){
                    if((x->p5_fg&fg_brk)==0){
                        dw.x = x->vul_L_pos[X];
                        dw.y = x->vul_L_pos[Y];
                        wall_set(&dw);
                    }
                }else{
                    if((x->p6_fg&fg_brk)==0){
                        dw.x = x->vul_R_pos[X];
                        dw.y = x->vul_R_pos[Y];
                        wall_set(&dw);
                    }
                }
            }
    /*----------------*/
    /* Wing Laser     */
    /*----------------*/
            if(x->mw.y<0 && x->btimer==45){
                if((x->p3_fg&fg_brk)==0){
                    wing_laser_set(x,0);
                }
                if((x->p4_fg&fg_brk)==0){
                    wing_laser_set(x,1);
                }
            }
    /*----------------*/
    /* Destroyed Mine */
    /*----------------*/
            if(x->p3_fg&fg_brk && x->p4_fg&fg_brk
            && x->p5_fg&fg_brk && x->p6_fg&fg_brk
            && x->mw.y<0 && rest(x->btimer,LV5_kirai[LV5])==0){
                se_set(SE02_T_SHOT2_1,x->mw.x);

                dw.x = x->rain_pos[X];
                dw.y = x->rain_pos[Y];
                dw.z = 0;
                dw.Ds16w0 = 0x8000+get_rand(0x0800);
                dw.Ds32w1 = 0x10000;        /* Main  MAX SPEED */
                dw.Ds16w1 = dw.Ds16w0;      /* First Seeta */
                #if 0
                dw.Ds16w6 = 3;              /* Attack Type */
                #endif
                dw.Ds16w6 = 0;              /* Attack Type */
                dw.Ds32w2 = 0x20000;        /* First SPEED */

                eshot06_set_cstm(&dw);
            }
        }
    }else{
        if(x->IDEON_X_fg){
            x->IDEON_X_fg--;
        }else{
            x->IDEON_X = comps32(x->IDEON_X,0,2);
            if(x->IDEON_X == 2){
                se_set(SE02_METAL2_2,x->mw.x);
            }
        }
#if 0
    /*------------*/
    /* Back Laser */
    /*------------*/
        if(x->runYpos>0 && (gtimer&0xf)==0){
            se_set(SE_E_SHOT1,x->mw.x);

            dw.x = x->rain_pos[X];
            dw.y = x->rain_pos[Y];
            dw.z       = 0;
            dw.Ds16w0  = x->mw.angz;
            dw.Ds16w1  = 0x10;  /* Speed Up Flame */
            dw.Ds16w2  = 0x01;  /* Color Type */
            eshot08_set_cstm(&dw);
        }
#endif
    }
    RUN_rot(x);
    RUN_sub(x);
}
/*=================================================================*/
static  void    BACK_TURN(BOS12_WK *x){
/*=================================================================*/
    SCROLL(x);
    RUN_rot(x);

    x->s32w1   = comps32(x->s32w1,0x300,0x08);
    x->mw.angx += x->s32w1;
#if 0
    if(x->mw.x<0){
        x->mw.angy  -= x->s32w1/2;
    }else{
        x->mw.angy  += x->s32w1/2;
    }
#endif
    x->s32w0   += x->s32w1;
    x->mw.z    =(cos32(x->mw.angx)*+0x40)-0x40*DEC+0x10*DEC;

    if(x->s32w0>DEC){
        x->mw.z = +0x10*DEC;
        x->mw.angx = 0;
        x->angXspd = 0;
        IDEON_SWORD_init(x);
    }
    x->runspd = comps32(x->runspd,-SC_DY-(0x30000),0x0900);
    x->dy = -fixmuls(cos32(x->mw.angz),x->runspd);
}
/*=================================================================*/
static  void    IDEON_SWORD(BOS12_WK *x){
/*=================================================================*/
    PLAY_OBJ    *p;
    DELIVERY_WK dw;

    SCROLL(x);
    RUN_rot(x);
    RUN_sub(x);

    x->s16w0++;
    if(x->s16w0>(80*10)){
        x->sp = s_WAIT;
    }

    x->IDEON_X = comps32(x->IDEON_X,0xb,1);
    if(x->IDEON_X == 0xa){
        se_set(SE02_METAL2_2,x->mw.x);
        M_hit_on(x);
    }

    p = get_play0(&x->mw);
    if(p->mw.y>0){
        x->runYpos = comps32(x->runYpos,(+0x40+0x20)*DEC+p->mw.y/4,0x8000);
    }else{
        x->runYpos = comps32(x->runYpos,(+0x40+0x20)*DEC,          0x8000);
    }
/*---------------*/
/* Rain Beam Set */
/*---------------*/
    if(x->s16w0>80*2
    && x->s16w0<80*(10-1) && rest(x->s16w0,IDEON_SWORD_rain_tym[LV5])==0){
        dw.par    = 0x0000; /* Type */
        dw.Ds16w2 = 0x0007; /* 1st Speed */
        if(rest(x->s16w0,IDEON_SWORD_rain_tym[LV5]*2)==0){
            dw.Ds16w0 = 0xd000; /* 1st angZ */
        }else{
            dw.Ds16w0 = 0x3000; /* 1st angZ */
        }
        rain_beam_set(&dw,x);

        se_set(SE_T_SHOT1,x->mw.x);
    }
/*-------------*/
/* IDEON Sword */
/*-------------*/
    if(x->s16w0<80*(10-1) && rest(x->s16w0,80)==0){
        if(rest(x->s16w0, 80*2)==0){
            if((x->p1_fg & fg_brk)==0){
                x->IDEON_L_sp = 1;
                x->s32w0 = 0;
                x->s32w2 = 0x8000;
                x->s16w2 = +0xc00;  /* zoomx 1st spd */
                x->s16w4 = +0xc00;  /* zoomy 1st spd */
                tame_set(&x->p1_fg, fg_brk, &x->IDEON_L_pos[X], &x->mw.angz,
                         COL_RRED);
            }
        }else{
            if((x->p2_fg & fg_brk)==0){
                x->IDEON_R_sp = 1;
                x->s32w1 = 0;
                x->s32w3 = 0x8000;
                x->s16w3 = +0xc00;  /* zoomx 1st spd */
                x->s16w5 = +0xc00;  /* zoomy 1st spd */
                tame_set(&x->p2_fg, fg_brk, &x->IDEON_R_pos[X], &x->mw.angz,
                         COL_RRED);
            }
        }
    }
    if(x->IDEON_L_sp){
        if(x->p1_fg & fg_brk || x->s32w0<0){
            x->IDEON_L_sp=0;
        }else{
            x->IDEON_L_sp++;
            if(x->IDEON_L_sp==40){
                se_set(SE02_SHOTL2_2,x->IDEON_L_pos[X]);

                IDEON_S_set(&x->IDEON_L_sp, &x->IDEON_L_pos[X], &x->s32w0);
                IDEON_S_eft_set(&x->IDEON_L_pos[X], COL_RRED, x->mw.angz);
                x->s32w2 = 0x0000;
            }
            if(x->IDEON_L_sp>=40){
                x->s32w0 += x->s16w2;
                x->s16w2 -= IDEON_SWORD_zoomx[LV5];

                x->s32w2 += x->s16w4;
                if(x->s16w4>0){
                    x->s16w4 -= 0x48;   /* Zoomy Speed */
                }
            }
        }
    }
    if(x->IDEON_R_sp){
        if(x->p2_fg & fg_brk || x->s32w1<0){
            x->IDEON_R_sp=0;
        }else{
            x->IDEON_R_sp++;
            if(x->IDEON_R_sp==40){
                se_set(SE02_SHOTL2_2,x->IDEON_R_pos[X]);

                IDEON_S_set(&x->IDEON_R_sp, &x->IDEON_R_pos[X], &x->s32w1);
                IDEON_S_eft_set(&x->IDEON_R_pos[X], COL_RRED, x->mw.angz);
                x->s32w3 = 0x0000;
            }
            if(x->IDEON_R_sp>=40){
                x->s32w1 += x->s16w3;
                x->s16w3 -= IDEON_SWORD_zoomx[LV5];

                x->s32w3 += x->s16w5;
                if(x->s16w5>0){
                    x->s16w5 -= 0x48;   /* Zoomy Speed */
                }
            }
        }
    }
}
/*=================================================================*/
static  void    DEAD(BOS12_WK *x){
/*=================================================================*/
    if(x->btimer > 120){
        x->sp = s_DEAD_WAIT;
        x->rep = report_set(100);
#if DBG_FG
        x->STG_SCORE0 = play_data[0].befor_stg_score;
        x->STG_SCORE1 = play_data[1].befor_stg_score;
#endif
        SCR_NextSection();
    }
}
/*=================================================================*/
static  void    DEAD_WAIT(BOS12_WK *x){
/*=================================================================*/
    BOS12_WK    *ms;
    EFT_OBJ *rep;

    rep = x->rep;
    if(rep->mode >= OBJ_M_KIE){
        x->mode = OBJ_M_KIE;
        area_no--;
#if DBG_FG
        play_data[0].befor_stg_score = x->STG_SCORE0;
        play_data[1].befor_stg_score = x->STG_SCORE1;
#endif
        ms = get_letsGO(x);
        ms->fg |= 2;
    }
}


/*============================================================================*/
/* ------------------------------------------                                 */
/*              Steps Main (MUGNUM)                                           */
/* ------------------------------------------                                 */
/*============================================================================*/
/*=================================================================*/
static  void    M_hit_on(BOS12_WK *x){
/*=================================================================*/
    x->p0_fg &= -fg_hit-1;
    x->p1_fg &= -fg_hit-1;
    x->p2_fg &= -fg_hit-1;
    x->p3_fg &= -fg_hit-1;
    x->p4_fg &= -fg_hit-1;
    x->p5_fg &= -fg_hit-1;
    x->p6_fg &= -fg_hit-1;
}
/*=================================================================*/
static  void    M_hit_off(BOS12_WK *x){
/*=================================================================*/
    x->p0_fg |= fg_hit;
    x->p1_fg |= fg_hit;
    x->p2_fg |= fg_hit;
    x->p3_fg |= fg_hit;
    x->p4_fg |= fg_hit;
    x->p5_fg |= fg_hit;
    x->p6_fg |= fg_hit;
}
/*=================================================================*/
static  void    Wait(BOS12_WK *x){
/*=================================================================*/
    BOS12_WK    *ms;

    ms = get_letsGO(x);

    if(x->fg&2){
        x->sp = m_Figt_Wait;
        x->s32w0 = 0;
        return;
    }
    if(ms->fg & 1){
        x->sp = m_Dual;
        x->mw.x = -ms->mw.x;
        x->mw.y = -0xe0*DEC;
        x->mw.z = -0x30*DEC;
        x->dx   = -ms->dx;
        x->dy   =  ms->dy;
        x->dz = 0;
        x->angYspd = 0;
        x->mw.sys_fg = (MODEL_DISP_FG|MODEL_FUNC_CALL_FG|ATARI_OFF_FG);
    }
}
/*=================================================================*/
static  void    Dual(BOS12_WK *x){
/*=================================================================*/
    BOS12_WK    *ms;
    DELIVERY_WK dw;

    ms = get_letsGO(x);

    x->dx = -ms->dx;
    x->dy =  ms->dy;
    if((ms->fg&1)==0||x->fg&1){
        x->sp = m_Rtrn;
        x->dy = -0x0e000;
    }
    x->mw.y = comps32(x->mw.y,-0x50*DEC,DEC);
    x->mw.angz = -ms->mw.angz/4;
    x->mw.angy = -ms->mw.angy;
    x->mw.y -= SC_DY;

    if(x->mw.y > -0x60*DEC && abs(x->mw.x) > 0x30*DEC
    && rest(x->btimer,14)==0){
        dw.Dobj_no = x->mw.obj_no;
        dw.x = x->mw.x+get_rand(0x10*DEC);
        dw.y = x->mw.y+0x10*DEC;
        dw.z = x->mw.z;
        baku_set(&dw);
    }
}
/*=================================================================*/
static  void    Rtrn(BOS12_WK *x){
/*=================================================================*/
    x->runZ = 0;

    rot_sub(&x->angZspd,&x->angZssp,x->mw.angz,0,
            0x2000,8,0x10);

    if(x->mw.x>0){
        x->dx += 0x0400;
        x->angYspd -= 0x030;
    }else{
        x->dx -= 0x0400;
        x->angYspd += 0x030;
    }
    x->dy -= 0x1c00;
    if(x->mw.y<-0x0f0*DEC){
        x->sp = m_Wait;
        x->dx = 0;
        x->dy = 0;
        x->mw.sys_fg = (SPR_DISP_CUT|ATARI_OFF_FG);
    }
    x->mw.y -= SC_DY;
}
/*=================================================================*/
static  void    Figt_Wait(BOS12_WK *x){
/*=================================================================*/
    x->s32w0--;
    if(x->s32w0<0){
        se_set(SE02_APPEAR2_2_2,x->mw.x);

        x->sp = m_Demo;
        x->mw.sys_fg = (MODEL_DISP_FG|MODEL_FUNC_CALL_FG|ATARI_OFF_FG);
        x->mw.angz = 0;
        x->mw.angy = 0;
        x->mw.angx = 0;
        x->angZspd = 0;
        x->angZssp = 0;
        x->angYspd = 0;
        x->angYssp = 0;

        x->mw.x = -0x50*DEC+(-0xfff71f10);
        x->mw.y = -0xe0*DEC;
        x->mw.z = -0x70*DEC;
        x->dy   = +0x50000;
        x->dx   = +0x10000;
    
        x->fg |= 0x80;
        bar_set(P0_LIFE);
    }
}
/*=================================================================*/
static  void    Demo(BOS12_WK *x){
/*=================================================================*/
    x->mw.angx = div(x->mw.z-0x20*DEC,+0x280);
    x->mw.angy = -x->dx;
    x->mw.angz = x->dx/2;
    if(x->mw.z>=+0x20*DEC){
        se_set(SE02_SET2_2_2,x->mw.x);

        x->sp = m_Demo_Wait;
        x->proc_wait = 120;
        SSSS_Anime_Set(&x->sw, BOS12_TRNS1);
        M_hit_on(x);

        x->dx = 0;
        x->dy = 0;
        x->mw.z = +0x20*DEC;
        x->mw.angz = 0;
        x->mw.angy = 0;
        x->mw.angx = 0;
    }else{
        x->dx = comps32(x->dx,0,0x01d0);
        x->dy -= 0x0e00;
        x->mw.z += 0x10000;
    }
}
/*=================================================================*/
static  void    Demo_Wait(BOS12_WK *x){
/*=================================================================*/
    x->mw.y -= 0x3000;
    x->IDEON_X = comps32(x->IDEON_X,-3,1);
    if(x->sw.S_fg & ssss_end){
        x->sp = m_Figt;
    }
}

/*============================================================================*/
/* ------------------------------------------                                 */
/*              Main Proc                                                     */
/* ------------------------------------------                                 */
/*============================================================================*/
enum{
    BS_RAIN,
    BS_VULCAN,
    BS_MSHOT,
    BS_METEO,

    LOOP,
    BS_END
};
/*=================================================================*/
static  u8  proc_data[]={
/*=================================================================*/
    BS_RAIN,
    BS_VULCAN,
    BS_MSHOT,
    BS_METEO,
/*-------------------*/
    LOOP,
};
/*=================================================================*/
static  void    main_proc(BOS12_WK *x){
/*=================================================================*/
    u8  dt0;
    DELIVERY_WK dw;

    if(x->proc_wait){
        return;
    }
    dt0 = proc_data[x->proc_step];
    if(LOOP == dt0){
        x->proc_step = 0;
        dt0 = proc_data[x->proc_step];
        x->zibaku++;
    }
    x->proc_step++;
    switch(dt0){
        case    BS_RAIN:
            x->proc_wait = 120;
            x->s16w0 = 0;
            break;
        case    BS_VULCAN:
            x->sp = m_Vulc_Wait;
            x->proc_wait = 120;
            x->s16w0 = 0;
            x->s32w0 = 0;
            SSSS_Anime_Set(&x->sw, BOS12_Vulc_Set);
            break;
        case    BS_METEO:
            x->sp = m_Meto;
            x->proc_wait = 120;
            x->s16w0 = 0;
            SSSS_Anime_Set(&x->sw, BOS12_Meto_Set);
            break;
        case    BS_MSHOT:
            x->sp = m_Msht;
            x->proc_wait = 120;
            x->s16w0 = -4;
    
            dw.ix = (void *)x;
            if((x->p4_fg&fg_brk)==0 && (x->fg & 0x8000)==0){
                dw.x       = x->wng_R_pos[X];
                dw.y       = x->wng_R_pos[Y];
                dw.Ds16w0 = -0x0001;
                search_set(&dw);
            }
            if((x->p3_fg&fg_brk)==0 && (x->fg & 0x4000)==0){
                dw.x       = x->wng_L_pos[X];
                dw.y       = x->wng_L_pos[Y];
                dw.Ds16w0 = +0x0001;
                search_set(&dw);
            }
            break;
    }
}
/*=================================================================*/
static  void    Move(BOS12_WK *x){
/*=================================================================*/
    if(x->mw.y<-0x50*DEC){
        x->dy = comps32(x->dy,+0x08000,0x4000);
    }else{
        x->dy = comps32(x->dy,-0x08000,0x6000);
    }

    if(x->sp==m_Msht&&
      ((x->IDEON_L_sp&&x->IDEON_L_sp<64)||(x->IDEON_R_sp&&x->IDEON_R_sp<64))){
        rot_sub(&x->angZspd,&x->angZssp,x->mw.angz,
                x->IDEON_X_sv,
                0x0400,0x14,0x02);
    }else{
        rot_sub(&x->angZspd,&x->angZssp,x->mw.angz,
                get_ang(x, get_play0(&x->mw))+0x8000,
                0x0480,0x14,0x02);
    }
    x->mw.x = sin32(x->mw.angz+0x8000)*0x30;
}
/*=================================================================*/
static  void    Figt(BOS12_WK *x){
/*=================================================================*/
    PLAY_OBJ    *pw;
    DELIVERY_WK dw;

    x->mw.z = comps32(x->mw.z,+0x20*DEC, 0x4000);
    Move(x);
    x->proc_wait = comps32(x->proc_wait,0,1);

    if(x->sw.S_fg & ssss_end){
        SSSS_Anime_Set(&x->sw, BOS12_Wait);
    }

    main_proc(x);
    if(x->sp == m_Figt){
        x->s16w0++;
        if(rest(x->s16w0,18)==0){
            dw.par    = 0x0001; /* Type Red */
            pw = get_play0(&x->mw);
            if(pw->mw.y<x->mw.y){
                dw.Ds16w1 = x->mw.angz;
            }else{
                dw.Ds16w1 = 0x8000+x->mw.angz;
            }

            dw.Ds16w2 = 0x0006/*+rest(x->s16w0,18*8)/18*/;  /* 1st Speed */
    
            dw.Ds16w3 = (rest(x->s16w0,18*16)/18)*0x1000;
            dw.Ds16w0 = -dw.Ds16w3+0x4000+0x8000+x->mw.angz;    /* 1st angZ */
            rain_beam_set(&dw,x);
            dw.Ds16w0 = +dw.Ds16w3+0xc000+0x8000+x->mw.angz;    /* 1st angZ */
            rain_beam_set(&dw,x);

            se_set(SE02_T_SHOT2_2F2,x->mw.x);
        }
    }
}
/*=================================================================*/
static  void    Vulc_Wait(BOS12_WK *x){
/*=================================================================*/
    Move(x);
    if(x->sw.S_fg & ssss_end){
        x->sp = m_Vulc;
        SSSS_Anime_Set(&x->sw, BOS12_Vulc);
    }
}
/*=================================================================*/
static  void    Vulc(BOS12_WK *x){
/*=================================================================*/
    DELIVERY_WK dw;

    Move(x);
    x->s16w0++;
    if((x->p5_fg & fg_brk && x->p6_fg & fg_brk)
    || x->s16w0>80*(10)){
        x->sp = m_Figt;
        SSSS_Anime_Set(&x->sw, BOS12_Wait);
        return;
    }
/*---------------*/
/* Arms Vulcan   */
/*---------------*/
    if(rest(x->s16w0,vulc_tym[LV5])==0){
        dw.Dobj_no = x->mw.obj_no;
        if((x->p5_fg&fg_brk)==0){
            dw.x = x->vul_L_pos[X];
            dw.y = x->vul_L_pos[Y];
            dw.Ds16w0 = 0x8000+x->mw.angz+(0xc000+LamANGZ);
    
            se_set(SE02_T_SHOT2_2F1, dw.x);

            if(rest(x->s16w0,vulc_tym[LV5]*2)==0){
                dw.Ds16w0 += 0x700;
                vul_set(&dw);
                dw.Ds16w0 -= 0x700*2;
                vul_set(&dw);
            }else{
                vul_set(&dw);
            }
        }
        if((x->p6_fg&fg_brk)==0){
            dw.x = x->vul_R_pos[X];
            dw.y = x->vul_R_pos[Y];
            dw.Ds16w0 = 0x8000+x->mw.angz-(0xc000+RamANGZ);
    
            se_set(SE02_T_SHOT2_2F1, dw.x);

            if(rest(x->s16w0,vulc_tym[LV5]*2)!=0){
                dw.Ds16w0 += 0x700;
                vul_set(&dw);
                dw.Ds16w0 -= 0x700*2;
                vul_set(&dw);
            }else{
                vul_set(&dw);
            }
        }
    }
/*---------------*/
/* Rain Beam Set */
/*---------------*/
    if(x->sw.S_fg & ssss_loop){
        x->s32w0 = 0;
    }
    dw.par    = 0x0000; /* Type */
    if((x->s32w0 ==  0
     || x->s32w0 == 15)
    ){
        dw.Ds16w2 = 0x0006; /* 1st Speed */

        dw.Ds16w0 = 0x3000+0x8000+x->mw.angz;   /* 1st angZ */
        rain_beam_set(&dw,x);
        dw.Ds16w0 = 0xd000+0x8000+x->mw.angz;   /* 1st angZ */
        rain_beam_set(&dw,x);

        se_set(SE_T_SHOT1,x->mw.x);
    }
    if((x->s32w0 ==  5
     || x->s32w0 == 20)
     && LV5>1){
        dw.Ds16w2 = 0x000a; /* 1st Speed */

        dw.Ds16w0 = 0x4000+0x8000+x->mw.angz;   /* 1st angZ */
        rain_beam_set(&dw,x);
        dw.Ds16w0 = 0xc000+0x8000+x->mw.angz;   /* 1st angZ */
        rain_beam_set(&dw,x);

        se_set(SE_T_SHOT1,x->mw.x);
    }
    if((x->s32w0 == 10
     || x->s32w0 == 25)
     && LV5>0){
        dw.Ds16w2 = 0x0006; /* 1st Speed */

        dw.Ds16w0 = 0x5000+0x8000+x->mw.angz;   /* 1st angZ */
        rain_beam_set(&dw,x);
        dw.Ds16w0 = 0xb000+0x8000+x->mw.angz;   /* 1st angZ */
        rain_beam_set(&dw,x);

        se_set(SE_T_SHOT1,x->mw.x);
    }
    x->s32w0++;
}

/*=================================================================*/
static  void    Meto(BOS12_WK *x){
/*=================================================================*/
    DELIVERY_WK dw;

    x->mw.z = comps32(x->mw.z, 0x0c*DEC, 0x4000);
    if(x->sw.S_fg & ssss_end){
        SSSS_Anime_Set(&x->sw, BOS12_Meto);
    }
    Move(x);
    x->s16w0++;
    if(x->s16w0>80*(10)){
        x->sp = m_Figt;
        SSSS_Anime_Set(&x->sw, BOS12_Wait);
        return;
    }
    if(x->p1_fg&fg_brk
    && x->p2_fg&fg_brk
    && x->p5_fg&fg_brk
    && x->p6_fg&fg_brk){
        dw.Ds16w0 = 1;
    }else{
        dw.Ds16w0 = 0;
    }

    if(x->mw.z==0xc*DEC && rest(x->s16w0,meteo_tym[LV5]+dw.Ds16w0)==0){
        dw.Dobj_no = x->mw.obj_no;
        dw.x       = x->rain_pos[X];
        dw.y       = x->rain_pos[Y];
        dw.ang    = x->mw.angz;
        dw.Ds16w0 = (gtimer&8)/8;
        meteo_set(&dw);
    }
}
/*=================================================================*/
static  void    Msht(BOS12_WK *x){
/*=================================================================*/
    PLAY_OBJ    *pw;

    Move(x);

    pw = get_play0(&x->mw);
    if((abs(tang_dist_get(x->mw.angz+0x8000
                         ,get_ang(x,pw)))<0x1c00) 
    ||(x->IDEON_L_sp&&x->IDEON_L_sp<40)||(x->IDEON_R_sp&&x->IDEON_R_sp<40)
    ||x->s16w0>=80*4){
        x->s16w0++;
    }
    if(((x->p1_fg & fg_brk && x->p2_fg & fg_brk)
    || x->s16w0>80*(6) || pw->mw.y<x->mw.y)
    && x->IDEON_L_sp==0&&x->IDEON_R_sp==0){
        x->sp = m_Figt;
        return;
    }
    if(x->s16w0<80*(6-1) && rest(x->s16w0,80)==0){
        if(rest(x->s16w0, 80*2)==0){
            if((x->p1_fg & fg_brk)==0){
                x->IDEON_L_sp = 1;
                x->IDEON_X_sv = x->mw.angz;
                x->s32w0 = 0;
                x->s32w2 = 0x8000;
                x->s16w2 = +0xc00;  /* zoomx 1st spd */
                x->s16w4 = +0xc00;  /* zoomy 1st spd */
                tame_set(&x->p1_fg, fg_brk, &x->IDEON_L_pos[X], &x->mw.angz,
                         COL_RBLUE);
                SSSS_Anime_Set(&x->sw, BOS12_MshtL);
            }
        }else{
            if((x->p2_fg & fg_brk)==0){
                x->IDEON_R_sp = 1;
                x->IDEON_X_sv = x->mw.angz;
                x->s32w1 = 0;
                x->s32w3 = 0x8000;
                x->s16w3 = +0xc00;  /* zoomx 1st spd */
                x->s16w5 = +0xc00;  /* zoomy 1st spd */
                tame_set(&x->p2_fg, fg_brk, &x->IDEON_R_pos[X], &x->mw.angz,
                         COL_RBLUE);
                SSSS_Anime_Set(&x->sw, BOS12_MshtR);
            }
        }
    }
    if(x->IDEON_L_sp){
        if(x->p1_fg & fg_brk || x->s32w0<0){
            x->IDEON_L_sp=0;
        }else{
            x->IDEON_L_sp++;
            if(x->IDEON_L_sp==40){
                se_set(SE02_SHOTL2_2,x->IDEON_L_pos[X]);

                IDEON_S_set(&x->IDEON_L_sp, &x->IDEON_L_pos[X], &x->s32w0);
                IDEON_S_eft_set(&x->IDEON_L_pos[X], COL_RBLUE, x->mw.angz);
                x->s32w2 = 0x0000;
                x->angZspd = -0x180;
                x->angZssp = -0x040;
            }
            if(x->IDEON_L_sp>=40){
                x->s32w0 += x->s16w2;
                x->s16w2 -= IDEON_SWORD_zoomx[LV5];

                x->s32w2 += x->s16w4;
                if(x->s16w4>0){
                    x->s16w4 -= 0x48;   /* Zoomy Speed */
                }
            }
        }
    }
    if(x->IDEON_R_sp){
        if(x->p2_fg & fg_brk || x->s32w1<0){
            x->IDEON_R_sp=0;
        }else{
            x->IDEON_R_sp++;
            if(x->IDEON_R_sp==40){
                se_set(SE02_SHOTL2_2,x->IDEON_R_pos[X]);

                IDEON_S_set(&x->IDEON_R_sp, &x->IDEON_R_pos[X], &x->s32w1);
                IDEON_S_eft_set(&x->IDEON_R_pos[X], COL_RBLUE, x->mw.angz);
                x->s32w3 = 0x0000;
                x->angZspd = +0x180;
                x->angZssp = +0x040;
            }
            if(x->IDEON_R_sp>=40){
                x->s32w1 += x->s16w3;
                x->s16w3 -= IDEON_SWORD_zoomx[LV5];

                x->s32w3 += x->s16w5;
                if(x->s16w5>0){
                    x->s16w5 -= 0x48;   /* Zoomy Speed */
                }
            }
        }
    }
}

/*=================================================================*/
static  void    Dead(BOS12_WK *x){
/*=================================================================*/
    DELIVERY_WK dw;

    x->angXspd = comps32(x->angXspd, -0x0c00, 0x08);
    x->angZspd = comps32(x->angZspd, +0x0200, 0x01);

    x->dx = comps32(x->dx, 0, 0x1000);
    x->dy = comps32(x->dy, 0, 0x1000);

    if(x->btimer==60){
        dw.x = x->mw.x;
        dw.y = x->mw.y;
        dw.z = x->mw.z;
        dw.ix= x;
        bbom_set(&dw);
    }
    x->mw.z += x->dz;
    x->dz = comps32(x->dz, +0x30000, 0x80);

    if(x->btimer > 60+150){
        x->mode = OBJ_M_KIE;
    }
}

/*============================================================================*/
/* ------------------------------------------                                 */
/*            Main Proc                                                       */
/* ------------------------------------------                                 */
/*============================================================================*/
/*=================================================================*/
static  void    (*step_tbl[])(BOS12_WK *x)={
/*=================================================================*/
#if EDIT
    TEST,
#endif
/*- SONIC  ----------------------------*/
    DEMO,
    DEMO_1,
    DEMO_2,
    WAIT,
    BACK_TURN,
    IDEON_SWORD,
    DEAD,
    DEAD_WAIT,
/*- MUGNUM ----------------------------*/
    DEMO,
    DEMO_1,
    Wait,
    Dual,
    Rtrn,
    Figt_Wait,
    Demo,
    Demo_Wait,
    Figt,
    Vulc_Wait,
    Vulc,
    Meto,
    Msht,
    Dead,
};

/*=================================================================*/
void    bos12(BOS12_WK *x){
/*=================================================================*/
    u16 sp;
    s8  ZIBAKU_SUU;
    BOS12_WK    *ms;

    DELIVERY_WK dw;

#if MUTEKI_FG
    x->p0_life = P0_LIFE;
#endif
/*-----------------------------------------*/
    ms = get_letsGO(x);
    if(x->LG_fg==0){
        sp = s_DEAD;
        ZIBAKU_SUU = RT_zibaku_suu;
#if GO_START
        x->zibaku  = 100;
#endif
    }else{
        sp = m_Dead;
        ZIBAKU_SUU = GO_zibaku_suu;
    }
    if(x->fg&0x80){
        bar_life(x->p0_life);
    }

    if(x->sp<sp && (x->p0_life <= 0 || x->zibaku>ZIBAKU_SUU)){
    /*---------------------------------*/
        x->mw.sys_fg = (SPR_DISP_CUT|ATARI_OFF_FG);

        if(x->LG_fg==0){
            ms->fg = 1;
            SCR_NextSection();
        }
    /*---------------------------------*/
        dw.x = x->mw.x;
        dw.y = x->mw.y;
        dw.z = x->mw.z;
        eft_boms_set(&dw);
    /*---------------------------------*/
        x->sp = sp;
        boss_dead_sub();
        x->p0_fg |= (fg_brk|fg_off);
        x->btimer = 0;
    /*---------------------------------*/
    /* Rate Bonus Calc */
        BOS_RATE = 0;

        if(x->p0_life <= 0){
            BOS_POINT = POINT;
            BOS_RATE += P0_RATE;
        }else{
            BOS_POINT = 0;
        }
        if(x->p1_life <= 0){
            BOS_RATE += P1_RATE;
        }
        if(x->p2_life <= 0){
            BOS_RATE += P2_RATE;
        }
        if(x->p3_life <= 0){
            BOS_RATE += P3_RATE;
        }
        if(x->p4_life <= 0){
            BOS_RATE += P4_RATE;
        }
        if(x->p5_life <= 0){
            BOS_RATE += P5_RATE;
        }
        if(x->p6_life <= 0){
            BOS_RATE += P6_RATE;
        }
    /*---------------------------------*/
        x->p0_life = 0;
        x->p1_life = 0;
        x->p2_life = 0;
        x->p3_life = 0;
        x->p4_life = 0;
        x->p5_life = 0;
        x->p6_life = 0;
    }
/*-----------------------------------------*/
    if(x->p1_brk_sp==0 && x->p1_life <= 0){
        x->p1_brk_sp++;
        x->p1_fg |= fg_brk;
    }
    if(x->p2_brk_sp==0 && x->p2_life <= 0){
        x->p2_brk_sp++;
        x->p2_fg |= fg_brk;
    }
    if(x->p3_brk_sp==0 && x->p3_life <= 0){
        x->p3_brk_sp++;
        x->p3_fg |= fg_brk;
    }
    if(x->p4_brk_sp==0 && x->p4_life <= 0){
        x->p4_brk_sp++;
        x->p4_fg |= fg_brk;
    }
    if(x->p5_brk_sp==0 && x->p5_life <= 0){
        x->p5_brk_sp++;
        x->p5_fg |= fg_brk;
    }
    if(x->p6_brk_sp==0 && x->p6_life <= 0){
        x->p6_brk_sp++;
        x->p6_fg |= fg_brk;
    }
/*-----------------------------------------*/
/* Main Proc */
    (*step_tbl[x->sp])(x);

    SSSS_Anime(&x->sw);

    x->mw.x    += x->dx;
    x->mw.y    += x->dy;
    x->mw.z    += x->dz;
    x->mw.angx += x->angXspd;
    x->mw.angy += x->angYspd;
    x->mw.angz += x->angZspd;
/*-----------------------------------------*/
/* Parts Break Proc */
    if(x->p1_brk_sp && (x->p1_brk_sp-1 < p1_suu)){
        if(boss_brk_sub(&x->p1_posi[(x->p1_brk_sp-1)*XYZ], 8, 4)){
            x->p1_brk_sp++;
        }
    }
    if(x->p2_brk_sp && (x->p2_brk_sp-1 < p2_suu)){
        if(boss_brk_sub(&x->p2_posi[(x->p2_brk_sp-1)*XYZ], 8, 4)){
            x->p2_brk_sp++;
        }
    }
    if(x->p3_brk_sp && (x->p3_brk_sp-1 < p3_suu)){
        if(boss_brk_sub(&x->p3_posi[(x->p3_brk_sp-1)*XYZ], 8, 4)){
            x->p3_brk_sp++;
        }
    }
    if(x->p4_brk_sp && (x->p4_brk_sp-1 < p4_suu)){
        if(boss_brk_sub(&x->p4_posi[(x->p4_brk_sp-1)*XYZ], 8, 4)){
            x->p4_brk_sp++;
        }
    }
    if(x->p5_brk_sp && (x->p5_brk_sp-1 < p5_suu)){
        if(boss_brk_sub(&x->p5_posi[(x->p5_brk_sp-1)*XYZ], 8, 4)){
            x->p5_brk_sp++;
        }
    }
    if(x->p6_brk_sp && (x->p6_brk_sp-1 < p6_suu)){
        if(boss_brk_sub(&x->p6_posi[(x->p6_brk_sp-1)*XYZ], 8, 4)){
            x->p6_brk_sp++;
        }
    }
    x->btimer++;

    x->fg &= -0xc000-1; /* For Side Bits Comunication */
}

/*============================================================================*/
/* ------------------------------------------                                 */
/*            Polygon Disp                                                    */
/* ------------------------------------------                                 */
/*============================================================================*/
#if SCR_DBG
/*=================================================================*/
static  void    test_hit(ENM_WK *x){
/*=================================================================*/
    x->mw.y -= SC_DY;
    if(x->mw.y>(+0x80*DEC+(+0x80*DEC/2))){
        x->mode = OBJ_M_KIE;
    }
}
/*=================================================================*/
static  void    test_hit_disp(MAIN_WK *mw){
/*=================================================================*/
    ENM_WK  *x;
    MAIN_WK m;
    s16 pos[4][XY];

    x = (ENM_WK *)((u32)mw-0x10);

    mw_init(&m);

    m.sys_fg    = POLYGON_DISP_FG;
    m.poly_adr  = pos;
    m.pri_ofs   = PRI_ENM;
    m.color_m   = char_tbl[CHAR_EFT].color+COL_YRED+8;

    m.x = x->mw.x;
    m.y = x->mw.y;
    m.z = 0;

    pos[0][X]   = -0x40;
    pos[0][Y]   = -0x40;
    pos[1][X]   = +0x40;
    pos[1][Y]   = -0x40;
    pos[2][X]   = +0x40;
    pos[2][Y]   = +0x40;
    pos[3][X]   = -0x40;
    pos[3][Y]   = +0x40;

    spr_put(&m);
}
/*=================================================================*/
static  ATARI_TBL   at_test[]={
/*=================================================================*/
    {(ATFG_ATTACK               ),  AT_BODY,+0x00,+0x00,0x40,0x40,},
    {(ATFG_DAMAGE | ATFG_TBL_END),  DM_NML, +0x00,+0x00,0x40,0x40,},
};
/*=================================================================*/
static  void    test_hit_set(s32 XP, s32 YP){
/*=================================================================*/
    s8      i;
    ENM_WK  *p;
/*--------------------------------------------------------*/
    i = ENM_OBJ_get();
    if(i == DUMMY_OBJ)  return;
    p = obj_set(ENM_OBJ_AREA,obj_size(sizeof(ENM_WK)),enm);
    if(p == NULL)       return;
/*--------------------------------------------------------*/
    mw_init(&p->mw);
    aw_init(&p->aw);
    ENM_WK_init(p);

    p->mw.dousa_func    = test_hit;
    p->mw.sys_fg       |= (MODEL_DISP_FG|MODEL_FUNC_CALL_FG);
    p->mw.sys_fg       |= (ATARI_MUTEKI_FG|ATARI_STEALTH_FG);
    p->mw.poly_adr      = test_hit_disp;
    p->mw.obj_no        = i;
    obj_x[p->mw.obj_no] = p;

    p->aw.atari_tbl_adr = at_test;
    p->aw.life          = 10;

    p->aw.nakama    = NAKAMA_KABE;
    p->aw.zoku      = ZOKU_NORMAL;

    p->mw.x = XP;
    p->mw.y = YP;
}

#endif

/*=================================================================*/
static  void    bos12_disp(MAIN_WK *mw){
/*=================================================================*/
    BOS12_WK    *x;
    u16 i,*fg,LG;
    s16 *p;
    s32 s32w0,ofsX;
    MAIN_WK     b;
    FIXED   IDE_L_pos[XYZ*4];
    FIXED   IDE_R_pos[XYZ*4];

#if SCR_DBG
    MAIN_WK m;
    s16 pos[4][XY];
#endif
/*----------------------------------------------------------------------------*/
    x = (BOS12_WK *)((u32)mw-0x10);
/*----------------------------------------------------------------------------*/
    if(x->LG_fg){
        LG = 0;
        ofsX = 0;
    }else{
        LG = M_MAGNUM_BREST_R;
        ofsX = x->IDEON_X*DEC;
    }
/*----------------------------------------------------------------------------*/
/*  Scroll Debug                                                              */
/*----------------------------------------------------------------------------*/
#if SCR_DBG
    mw_init(&m);

    m.sys_fg    = POLYLINE_DISP_FG;
    m.poly_adr  = pos;
    m.pri_ofs   = PRI_SYS;
    m.color_m   = char_tbl[CHAR_EFT].color+COL_YRED;

    m.x = 0;
    m.z = 0;

    pos[0][X]   = -0x80;
    pos[0][Y]   = 0;
    pos[1][X]   = +0x80;
    pos[1][Y]   = 0;
    pos[2][X]   = +0x80;
    pos[2][Y]   = 0;
    pos[3][X]   = -0x80;
    pos[3][Y]   = 0;

    m.y     = -x->scr_y[0];
    spr_put(&m);
    m.y     = -x->scr_y[1];
    spr_put(&m);
#endif
/*----------------------------------------------------------------------------*/
/*  Damage Flag Proc                                                          */
/*----------------------------------------------------------------------------*/
    fg = &x->p0_fg;
    for(i=0; i<((8-2)+1); i++,fg++){
        if(*(fg) & fg_dmg_on)
            *(fg) &= -(fg_dmg_on + fg_dmg)-1;
        if(*(fg) & fg_dmg)
            *(fg) |=   fg_dmg_on;
    }
/*----------------------------------------------------------------------------*/
/*  Ideon Sword                                                               */
/*----------------------------------------------------------------------------*/
    if(x->IDEON_L_sp || x->IDEON_R_sp){
        if(v_timer&7){
            if(x->LG_fg){
                i = COL_RBLUE;
            }else{
                i = COL_RRED;
            }
        }else{
            if(x->LG_fg){
                i = COL_BLUE2;
            }else{
                i = COL_YRED;
            }
        }
        model_col_set(CHAR_MEFT,M_EFFECT_HADOUHOU,
                         char_tbl[CHAR_EFT].color + i);
    }
/*----------------------------------------------------------------------------*/
/*  Master Body                                                               */
/*----------------------------------------------------------------------------*/
    slPushMatrix(); /* PUSH 0 */
    slTranslate(x->mw.x,x->mw.y,x->mw.z);

    slPushMatrix(); /* PUSH */
    slRotZ(x->mw.angz);
    slRotX(x->mw.angx+MasANGZ);
    slRotY(x->mw.angy+MasANGY);
    slTranslate(0,-0x20*DEC,-0x10*DEC);
    p = &p0_posi_data[0];               /* Basic XYZ Data */
    for(i=0; i<p0_suu*3; p+=4,i+=3){
        slCalcPoint(*(p+X)*DEC,*(p+Y)*DEC,*(p+Z)*DEC,
                    &x->p0_posi[i]);        /* Trans XYZ Data */
    }
    if((x->p0_fg & fg_off)==0){
        slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
                       ->pdata_tbl[M_SONIC_BODY+LG][x->p0_fg&fg_dmg]);

        slCalcPoint(0,0,0,&x->rain_pos[X]);
    }
/*----------------------------------------------------------------------------*/
/*  Breat Parts L                                                             */
/*----------------------------------------------------------------------------*/
    slPushMatrix(); /* PUSH 1 */
    slTranslate(+0x010*DEC+x->IDEON_X*DEC,+0x000*DEC+(LwgPOSX*0x020),
                +0x000*DEC+(LwgPOSX*0x040));

    slPushMatrix(); /* PUSH 2 */
    slRotX(BstANGX);
    slRotY(BstANGY);
    slTranslate(+0x000*DEC,-0x010*DEC,+0x000*DEC);
    p = &p1_posi_data[0];
    for(i=0; i<p1_suu*3; p+=4,i+=3){
        slCalcPoint(*(p+X)*DEC,*(p+Y)*DEC,*(p+Z)*DEC,
                    &x->p1_posi[i]);
    }
    if((x->p1_fg & fg_off)==0){
        if((x->p1_fg & fg_brk)==0){
        slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
                       ->pdata_tbl[M_SONIC_BREST_L+LG][x->p1_fg&fg_dmg]);
        }else{
        slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
                       ->pdata_tbl[M_SONIC_BREST_L_DMG+LG][0]);
        }
    /*-------------*/
    /* Ideon Sword */
    /*-------------*/
        if(x->IDEON_L_sp){
            slPushMatrix(); /* PUSH */
            slRotY(v_timer*-0x0830);
            slScale(x->s32w0,x->s32w2,x->s32w0);
            slTranslate(+0x000*DEC,-0x00c*DEC,+0x000*DEC);
            slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_MEFT].header_adr)
                           ->pdata_tbl[M_EFFECT_HADOUHOU][0]);

            if(gtimer&1&&x->IDEON_L_sp>40){
                s32w0 = -(0x14+0x1c)*DEC;
            }else{
                s32w0 = -0x14*DEC;
            }
            for(i=0; i<4; i++){
                slCalcPoint(0,(i*-0x1c*2*DEC)+s32w0,0,&x->IDEON_L_pos[i*XYZ]);
            }
            for(i=0; i<4; i++){
                slCalcPoint(0,-abs(get_rand(x->s32w2*0x160)),0,&IDE_L_pos[i*XYZ]);
            }
            slPopMatrix();  /* POP */
        }
    }
    slPopMatrix();  /* PUSH 2 */
    slPopMatrix();  /* PUSH 1 */
/*----------------------------------------------------------------------------*/
/*  Breat Parts R                                                             */
/*----------------------------------------------------------------------------*/
    slPushMatrix(); /* PUSH 3 */
    slTranslate(-0x010*DEC-(x->IDEON_X*DEC),+0x000*DEC+(LwgPOSX*0x020),
                +0x000*DEC+(LwgPOSX*0x040));

    slPushMatrix(); /* PUSH 4 */
    slRotX(BstANGX);
    slRotY(-BstANGY);
    slTranslate(+0x000*DEC,-0x010*DEC,+0x000*DEC);
    p = &p2_posi_data[0];
    for(i=0; i<p2_suu*3; p+=4,i+=3){
        slCalcPoint(*(p+X)*DEC,*(p+Y)*DEC,*(p+Z)*DEC,
                    &x->p2_posi[i]);
    }
    if((x->p2_fg & fg_off)==0){
        if((x->p2_fg & fg_brk)==0){
        slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
                       ->pdata_tbl[M_SONIC_BREST_R+LG][x->p2_fg&fg_dmg]);
        }else{
        slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
                       ->pdata_tbl[M_SONIC_BREST_R_DMG+LG][0]);
        }
    /*-------------*/
    /* Ideon Sword */
    /*-------------*/
        if(x->IDEON_R_sp){
            slPushMatrix(); /* PUSH */
            slRotY(v_timer*+0x0830);
            slScale(x->s32w1,x->s32w3,x->s32w1);
            slTranslate(+0x000*DEC,-0x00c*DEC,+0x000*DEC);
            slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_MEFT].header_adr)
                           ->pdata_tbl[M_EFFECT_HADOUHOU][0]);

            if(gtimer&1&&x->IDEON_R_sp>40){
                s32w0 = -(0x14+0x1c)*DEC;
            }else{
                s32w0 = -0x14*DEC;
            }
            for(i=0; i<4; i++){
                slCalcPoint(0,(i*-0x1c*2*DEC)+s32w0,0,&x->IDEON_R_pos[i*XYZ]);
            }
            for(i=0; i<4; i++){
                slCalcPoint(0,-abs(get_rand(x->s32w3*0x160)),0,&IDE_R_pos[i*XYZ]);
            }
            slPopMatrix();  /* POP */
        }
    }
    slPopMatrix();  /* PUSH 4 */
    slPopMatrix();  /* PUSH 3 */
/*----------------------------------------------------------------------------*/
/*  Wings Parts L                                                             */
/*----------------------------------------------------------------------------*/
    slPushMatrix(); /* PUSH 5 */
    slTranslate(+0x010*DEC+(LwgPOSX*0x100)+ofsX,
                +0x008*DEC-(LwgPOSX*0x060),+0x000*DEC);

    slPushMatrix(); /* PUSH 6 */
    slTranslate(+0x000*DEC,+0x000*DEC,+0x000*DEC);
    slRotZ(LwgANGZ);
    slRotY(LwgANGY);
    p = &p3_posi_data[0];
    for(i=0; i<p3_suu*3; p+=4,i+=3){
        slCalcPoint(*(p+X)*DEC,*(p+Y)*DEC,*(p+Z)*DEC,
                    &x->p3_posi[i]);
    }
    if((x->p3_fg & fg_off)==0){
        if((x->p3_fg & fg_brk)==0){
        slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
                       ->pdata_tbl[M_SONIC_KATA_L+LG][x->p3_fg&fg_dmg]);
        slCalcPoint(+0x8*DEC,+0x40*DEC,0,&x->wng_L_pos[X]);
    /*--------------------------------------------------------------*/
    /* Omake Wing                                                   */
    /*--------------------------------------------------------------*/
        slPushMatrix();
        slTranslate(+0x014*DEC,+0x030*DEC,+0x008*DEC);
        if(x->mw.angy>0){
            slRotY(x->mw.angy);
        }
        slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
                       ->pdata_tbl[M_SONIC_HANE_L+LG][x->p3_fg&fg_dmg]);
        slPopMatrix();

        }else{
        slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
                       ->pdata_tbl[M_SONIC_KATA_L_DMG+LG][0]);
        }
    }
    /*------------------------------------------------------------------------*/
    /* Arm Parts L                                                            */
    /*------------------------------------------------------------------------*/
        slPushMatrix(); /* PUSH 7 */
        slTranslate(-0x004*DEC+(LamPOSX*0x040)-ofsX,
                    +0x00e*DEC+(LamPOSX*0x100),+0x000*DEC);

        slPushMatrix(); /* PUSH 8 */
        slRotZ(LamANGZ);
        slRotX(LamANGX);
        slTranslate(-0x000*DEC,+0x00a*DEC,0x000*DEC);
        p = &p5_posi_data[0];
        for(i=0; i<p5_suu*3; p+=4,i+=3){
            slCalcPoint(*(p+X)*DEC,*(p+Y)*DEC,*(p+Z)*DEC,
                        &x->p5_posi[i]);
        }
        if((x->p5_fg & (fg_off|fg_brk))==0){
            slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
                           ->pdata_tbl[M_SONIC_ARM_L+LG][x->p5_fg&fg_dmg]);
            slCalcPoint(0,+0x8*DEC,0,&x->vul_L_pos[X]);
        }
        slPopMatrix();  /* PUSH 8 */
        slPopMatrix();  /* PUSH 7 */
    /*------------------------------------------------------------------------*/
    slPopMatrix();  /* PUSH 6 */
    slPopMatrix();  /* PUSH 5 */
/*----------------------------------------------------------------------------*/
/*  Wings Parts R                                                             */
/*----------------------------------------------------------------------------*/
    slPushMatrix(); /* PUSH 9 */
    slTranslate(-0x010*DEC-(LwgPOSX*0x100)-ofsX,
                +0x008*DEC-(LwgPOSX*0x060),+0x000*DEC);

    slPushMatrix(); /* PUSH 10*/
    slTranslate(-0x000*DEC,+0x000*DEC,+0x000*DEC);
    slRotZ(-LwgANGZ);
    slRotY(-LwgANGY);
    p = &p4_posi_data[0];
    for(i=0; i<p4_suu*3; p+=4,i+=3){
        slCalcPoint(*(p+X)*DEC,*(p+Y)*DEC,*(p+Z)*DEC,
                    &x->p4_posi[i]);
    }
    if((x->p4_fg & fg_off)==0){
        if((x->p4_fg & fg_brk)==0){
        slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
                       ->pdata_tbl[M_SONIC_KATA_R+LG][x->p4_fg&fg_dmg]);
        slCalcPoint(-0x8*DEC,+0x40*DEC,0,&x->wng_R_pos[X]);
    /*--------------------------------------------------------------*/
    /* Omake Wing                                                   */
    /*--------------------------------------------------------------*/
        slPushMatrix();
        slTranslate(-0x014*DEC,+0x030*DEC,+0x008*DEC);
        if(x->mw.angy<0){
            slRotY(x->mw.angy);
        }
        slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
                       ->pdata_tbl[M_SONIC_HANE_R+LG][x->p4_fg&fg_dmg]);
        slPopMatrix();

        }else{
        slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
                       ->pdata_tbl[M_SONIC_KATA_R_DMG+LG][0]);
        }
    }
    /*------------------------------------------------------------------------*/
    /* Arm Parts R                                                            */
    /*------------------------------------------------------------------------*/
        slPushMatrix(); /* PUSH 11*/
        slTranslate(+0x004*DEC-(LamPOSX*0x040)+ofsX,
                    +0x00e*DEC+(LamPOSX*0x100),+0x000*DEC);

        slPushMatrix(); /* PUSH 12*/
        slRotZ(-RamANGZ);
        slRotX(+RamANGX);
        slTranslate(-0x000*DEC,+0x00a*DEC,0x000*DEC);
        p = &p6_posi_data[0];
        for(i=0; i<p6_suu*3; p+=4,i+=3){
            slCalcPoint(*(p+X)*DEC,*(p+Y)*DEC,*(p+Z)*DEC,
                        &x->p6_posi[i]);
        }
        if((x->p6_fg & (fg_off|fg_brk))==0){
            slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
                           ->pdata_tbl[M_SONIC_ARM_R+LG][x->p6_fg&fg_dmg]);
            slCalcPoint(0,+0x8*DEC,0,&x->vul_R_pos[X]);
        }
        slPopMatrix();  /* PUSH 12*/
        slPopMatrix();  /* PUSH 11*/
    /*------------------------------------------------------------------------*/
    slPopMatrix();  /* PUSH 10*/
    slPopMatrix();  /* PUSH 9 */
/*----------------------------------------------------------------------------*/
/*  Reg   Parts  L                                                            */
/*----------------------------------------------------------------------------*/
    slPushMatrix();
    slTranslate(+0x013*DEC+(LwgPOSX*0x020),
                +0x020*DEC-(LwgPOSX*0x020),+0x015*DEC+(LrgPOSZ)*0x100);

    slPushMatrix();
    slRotX(LrgANGX);
    slRotZ(LrgANGZ);
    slRotY(LrgANGY);
    slTranslate(+0x000*DEC,+0x000*DEC,+0x000*DEC);
    p = &p7_posi_data[0];
    for(i=0; i<p7_suu*3; p+=4,i+=3){
        slCalcPoint(*(p+X)*DEC,*(p+Y)*DEC,*(p+Z)*DEC,
                    &x->p7_posi[i]);
    }
    if((x->p0_fg & fg_off)==0){
        slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
                       ->pdata_tbl[M_SONIC_LEG_L+LG][x->p0_fg&fg_dmg]);

        /* Back Fire Point */
        slCalcPoint( 0x0000*DEC,
                    (+0x0028+(RAND&3)+(rest(v_timer,3))*0x08)*DEC,
                     0x0008*DEC,
                    &x->p7_fire[0]);        /* Trans XYZ Data */
    }
    slPopMatrix();
    slPopMatrix();
/*----------------------------------------------------------------------------*/
/*  Reg   Parts  R                                                            */
/*----------------------------------------------------------------------------*/
    slPushMatrix();
    slTranslate(-0x013*DEC-(LwgPOSX*0x020),
                +0x020*DEC-(LwgPOSX*0x020),+0x015*DEC+(LrgPOSZ)*0x100);

    slPushMatrix();
    slRotX(RrgANGX);
    slRotZ(-RrgANGZ);
    slRotY(-RrgANGY);
    slTranslate(-0x000*DEC,+0x000*DEC,+0x000*DEC);
    p = &p8_posi_data[0];
    for(i=0; i<p8_suu*3; p+=4,i+=3){
        slCalcPoint(*(p+X)*DEC,*(p+Y)*DEC,*(p+Z)*DEC,
                    &x->p8_posi[i]);
    }
    if((x->p0_fg & fg_off)==0){
        slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
                       ->pdata_tbl[M_SONIC_LEG_R+LG][x->p0_fg&fg_dmg]);

        /* Back Fire Point */
        slCalcPoint( 0x0000*DEC,
                    (+0x0028+(RAND&3)+(rest(v_timer,3))*0x08)*DEC,
                     0x0008*DEC,
                    &x->p8_fire[0]);        /* Trans XYZ Data */
    }
    slPopMatrix();
    slPopMatrix();
/*----------------------------------------------------------------------------*/
/*  Tail  Parts                                                               */
/*----------------------------------------------------------------------------*/
    slPushMatrix();
    slTranslate(+0x000*DEC,+0x01e*DEC,-0x00a*DEC);

    slPushMatrix();
    slRotX(TilANGX);
    slTranslate(+0x000*DEC,+0x000*DEC,+0x000*DEC);
    if((x->p0_fg & fg_off)==0){
        slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
                       ->pdata_tbl[M_SONIC_SHIPPO+LG][x->p0_fg&fg_dmg]);
    }
    slPopMatrix();
    slPopMatrix();
/*----------------------------------------------------------------------------*/
    slPopMatrix();  /* PUSH */
    slPopMatrix();  /* PUSH 0 */

/*----------------------------------------------------------------------------*/
/*  Ideon Elec                                                                */
/*----------------------------------------------------------------------------*/
    if(x->IDEON_L_sp>40
    || x->IDEON_R_sp>40){
        mw_init(&b);
        b.sys_fg    = RAND&MESH_ON;
        b.angz      = x->mw.angz;
        b.char_no   = CHAR_EFT;
        b.pri_ofs   = PRI_INU;
        b.zoomy     = 0xc000;
        b.anm_no    = A_DENKI0+(RAND&0xf);
        if(x->LG_fg){
            b.color_m   = char_tbl[CHAR_EFT].color + COL_E_BLUE;
        }else{
            b.color_m   = char_tbl[CHAR_EFT].color + COL_E_RED;
        }
        if(x->IDEON_L_sp>40){
            b.zoomx     = x->s32w0+0x6000;
            for(i=0; i<4; i++){
                b.x         = IDE_L_pos[XYZ*i+X];
                b.y         = IDE_L_pos[XYZ*i+Y];
                b.z         = IDE_L_pos[XYZ*i+Z]-0xb0*DEC;
                spr_put(&b);
            }
        }
        if(x->IDEON_R_sp>40){
            b.zoomx     = x->s32w1+0x6000;
            for(i=0; i<4; i++){
                b.x         = IDE_R_pos[XYZ*i+X];
                b.y         = IDE_R_pos[XYZ*i+Y];
                b.z         = IDE_R_pos[XYZ*i+Z]-0xb0*DEC;
                spr_put(&b);
            }
            spr_put(&b);
        }
    }
/*----------------------------------------------------------------------------*/
/*  Backed Fire                                                               */
/*----------------------------------------------------------------------------*/
    if((x->p0_fg & fg_off)==0){
        mw_init(&b);

        b.zoomx     = (rest(v_timer,3)*0x3000)+0x4000+((RAND&0xf)*0x300);
        b.zoomy     = fixmuls(b.zoomx,0x14000);
        b.angz      = x->mw.angz;
        b.char_no   = CHAR_EFT;
        b.pri_ofs   = 0;

        switch(rest(v_timer,3)){
            case    0:
                if(LG){
                    b.color_m   = char_tbl[CHAR_EFT].color + COL_YELLOW;
                }else{
                    b.color_m   = char_tbl[CHAR_EFT].color + COL_BLUE2;
                }
                b.anm_no    = A_MARU0;
                break;
            case    1:
                if(LG){
                    b.color_m   = char_tbl[CHAR_EFT].color + COL_YRED;
                }else{
                    b.color_m   = char_tbl[CHAR_EFT].color + COL_BLUE;
                }
                b.anm_no    = A_MARU1;
                break;
            case    2:
                b.sys_fg |= MESH_ON;
                if(LG){
                    b.color_m   = char_tbl[CHAR_EFT].color + COL_E_RED;
                }else{
                    b.color_m   = char_tbl[CHAR_EFT].color + COL_E_BLUE;
                }
                b.anm_no    = A_MARU1;
        }
        if(v_timer&1){
            b.x = x->p8_fire[X];
            b.y = x->p8_fire[Y];
            b.z = x->p8_fire[Z]-0xb0*DEC;
            spr_put(&b);
            b.x = x->p7_fire[X];
            b.y = x->p7_fire[Y];
            b.z = x->p7_fire[Z]-0xb0*DEC;
            spr_put(&b);
        }else{
            b.x = x->p7_fire[X];
            b.y = x->p7_fire[Y];
            b.z = x->p7_fire[Z]-0xb0*DEC;
            spr_put(&b);
            b.x = x->p8_fire[X];
            b.y = x->p8_fire[Y];
            b.z = x->p8_fire[Z]-0xb0*DEC;
            spr_put(&b);
        }
    }
}


/*============================================================================*/
/* ------------------------------------------                                 */
/*            Init Main                                                       */
/* ------------------------------------------                                 */
/*============================================================================*/
/*=================================================================*/
static  void    bos12_set_S(BOS12_WK *x){
/*=================================================================*/
    x->sp = s_DEMO;

    x->runHundle = 0x40;
    x->runZ = 0;
    x->runsgt = 0x20;
    x->runspd = -SC_DY;
    x->runXpos = 0;
    x->runYpos = (-0x40+0x20)*DEC;

    x->scr_command = SC_ZERO;
    x->scr_step = 0;
    x->scr_p[0] = SC_ZERO;
    x->scr_p[1] = SC_ZERO;
    x->scr_y[0] = +0x80*DEC;
    x->scr_y[1] = +0x00*DEC;
    x->scr_rand[0] = +1;
    x->scr_rand[1] = +1;
    x->scr_shut = 0;

    x->fg = 0x80;
    bar_set(P0_LIFE);

    M_hit_off(x);
    se_set(SE02_APPEAR2_2,0);
}
/*=================================================================*/
static  void    bos12_set_M(BOS12_WK *x){
/*=================================================================*/
    x->sp = m_DEMO;
    x->mw.angy = 0x8000;

#if SCR_DBG
    x->scr_y[0] = +0x180*DEC;
    x->scr_y[1] = +0x080*DEC;
#endif
    M_hit_off(x);
}

/*=================================================================*/
static  void    bos12_hitset(BOS12_WK *x){
/*=================================================================*/
    x->p0_fg       = 0;
    x->p0_brk_sp   = 0;
    x->p0_posi_num = 0;     /* For EDIT */
    x->p0_menu     = 0;     /* For EDIT */
    x->p0_life     = P0_LIFE;

    HIT3D_SET(    p0_suu,
              &x->p0_posi[0],
              &x->p0_fg,
              &x->p0_life,
              &   p0_posi_data[0],
              x->mw.obj_no);
/*-----------------------------------------------*/
    x->p1_fg       = 0;
    x->p1_brk_sp   = 0;
    x->p1_life     = P1_LIFE;
    HIT3D_SET(    p1_suu,
              &x->p1_posi[0],
              &x->p1_fg,
              &x->p1_life,
              &   p1_posi_data[0],
              x->mw.obj_no);
/*-----------------------------------------------*/
    x->p2_fg       = 0;
    x->p2_brk_sp   = 0;
    x->p2_life     = P2_LIFE;
    HIT3D_SET(    p2_suu,
              &x->p2_posi[0],
              &x->p2_fg,
              &x->p2_life,
              &   p2_posi_data[0],
              x->mw.obj_no);
/*-----------------------------------------------*/
    x->p3_fg       = 0;
    x->p3_brk_sp   = 0;
    x->p3_life     = P3_LIFE;
    HIT3D_SET(    p3_suu,
              &x->p3_posi[0],
              &x->p3_fg,
              &x->p3_life,
              &   p3_posi_data[0],
              x->mw.obj_no);
/*-----------------------------------------------*/
    x->p4_fg       = 0;
    x->p4_brk_sp   = 0;
    x->p4_life     = P4_LIFE;
    HIT3D_SET(    p4_suu,
              &x->p4_posi[0],
              &x->p4_fg,
              &x->p4_life,
              &   p4_posi_data[0],
              x->mw.obj_no);
/*-----------------------------------------------*/
    x->p5_fg       = 0;
    x->p5_brk_sp   = 0;
    x->p5_life     = P5_LIFE;
    HIT3D_SET(    p5_suu,
              &x->p5_posi[0],
              &x->p5_fg,
              &x->p5_life,
              &   p5_posi_data[0],
              x->mw.obj_no);
/*-----------------------------------------------*/
    x->p6_fg       = 0;
    x->p6_brk_sp   = 0;
    x->p6_life     = P6_LIFE;
    HIT3D_SET(    p6_suu,
              &x->p6_posi[0],
              &x->p6_fg,
              &x->p6_life,
              &   p6_posi_data[0],
              x->mw.obj_no);
/*-----------------------------------------------*/
    HIT3D_SET(    p7_suu,
              &x->p7_posi[0],
              &x->p0_fg,
              &x->p0_life,
              &   p7_posi_data[0],
              x->mw.obj_no);
/*-----------------------------------------------*/
    HIT3D_SET(    p8_suu,
              &x->p8_posi[0],
              &x->p0_fg,
              &x->p0_life,
              &   p8_posi_data[0],
              x->mw.obj_no);
}

/*=================================================================*/
static  void    bos12_set_sub(BOS12_WK *x, s8 nB, u8 LG){
/*=================================================================*/
    /* Works Init */
    mw_init(&x->mw);
    aw_init(&x->aw);
/*-----------------------------------------------*/
    x->mw.dousa_func    = bos12;
    x->mw.sys_fg       |= (MODEL_DISP_FG|MODEL_FUNC_CALL_FG|ATARI_OFF_FG);
    x->mw.poly_adr      = bos12_disp;

    x->LG_fg = LG;
    x->LG_no = nB;

/*-----------------------------------------------*/
    x->mw.x = +0x000*DEC;
    x->mw.y = +0x120*DEC;
    x->mw.z = -0x060*DEC;
    x->dx = 0;
    x->dy = 0;
    x->dz = 0;

    x->angXspd = 0;
    x->angXssp = 0;
    x->angYspd = 0;
    x->angYssp = 0;
    x->angZspd = 0;
    x->angZssp = 0;

    x->btimer = 0;
    x->fg = 0;
    x->proc_step = 0;
    x->proc_wait = 0;
    x->zibaku = 0;

/*-----------------------------------------------*/
    if(LG==0){
        bos12_hitset(x);
        bos12_set_S(x);
    }else{
        bos12_hitset(x);
        bos12_set_M(x);
    }
    x->IDEON_L_sp = 0;
    x->IDEON_R_sp = 0;
    x->IDEON_X = 0;

/*--------------------------------------*/
/* SSSS Init */
    x->sw.S_Chain_suu = BOS12_Chain_suu;
    x->sw.S_mot_buf   = &x->mot_buf[0];
    x->sw.S_spd_buf   = &x->spd_buf[0];
    x->sw.S_ent_adr   = BOS12_mot_ent_tbl;

    SSSS_Mot_Set(&x->sw, BOS12_Mot_0000);
    SSSS_Anime_Set(&x->sw, BOS12_WAIT);
    SSSS_Anime(&x->sw);

#if EDIT
    x->sp = s_TEST;
    x->ew.edit_anm_adr = &BOS12_TRNS[0];
    x->ew.sp = 0;
    x->ew.parts_num = 0;
    x->mw.x = 0;
    x->mw.y = 0;
    x->mw.z = +0x10*DEC;
    SSSS_Anime_Set(&x->sw, x->ew.edit_anm_adr);
#endif
}

/*=================================================================*/
s8  bos12_set(void){
/*=================================================================*/
    BOS12_WK    *xL,*xG;
    s8           iL,iG;
    u16 i;

    iL = ENM_OBJ_get();
    if(iL == DUMMY_OBJ) return  0;
    xL = obj_set(ENM_OBJ_AREA,obj_size(sizeof(BOS12_WK)),enm);
    if(xL == NULL)      return  0;
    xL->mw.obj_no       = iL;
    obj_x[xL->mw.obj_no]= xL;

#if !EDIT
    iG = ENM_OBJ_get();
    if(iG == DUMMY_OBJ) return  0;
    xG = obj_set(ENM_OBJ_AREA,obj_size(sizeof(BOS12_WK)),enm);
    if(xG == NULL)      return  0;
    xG->mw.obj_no       = iG;
    obj_x[xG->mw.obj_no]= xG;
#endif

/*-----------------------------------------------*/
/*  Lets                                         */
/*-----------------------------------------------*/
    bos12_set_sub(xL,iG,0);

/*-----------------------------------------------*/
/*  GO                                           */
/*-----------------------------------------------*/
#if !EDIT
    bos12_set_sub(xG,iL,1);
#endif

    for(i=M_MAGNUM_BREST_R; i<M_SONIC_END; i++){
        model_col_set(CHAR_SONIC,i,
                        get_look_colno(CHAR_SONIC) + COL_MAGNUM);
    }
    return  iG;
}

0xDB400

This is part of an objdump listing.

etNbg0
00002ce8  .text      00002ce8 _SCR_2_1d_ctrl
00016be4  .control   06056be4 _hit3D
0002de70  .control   0606de70 _slSpecialCCalcModeNbg0
0002de78  .control   0606de78 _slSpecialCCalcModeNbg3
060fff60  *ABS*      060fff60 _DAR1
060ffdf8  *ABS*      060ffdf8 _rb_char_adr
0600406c  *ABS*      0600406c _PCM_WkSize
00000040  COMMON     00000040 _tim0_pos
06008a58  *ABS*      06008a58 _f_title
060ffdc0  *ABS*      060ffdc0 _VDP2_CCRSA
060ffd92  *ABS*      060ffd92 _VDP2_WCTLB
00023618  .control   06063618 _set_laser_hit
06009434  *ABS*      06009434 _f_st24_tne
00021014  .control   06061014 _disp_string8
00014c18  .control   06054c18 _eshot04_set_cstm
060ffcd4  *ABS*      060ffcd4 _VDP2_CYCA1L
06008028  *ABS*      06008028 ___ashiftrt_r4_2
00000614  .data      00004534 _houmon1
0000662c  .control   0604662c _bef_link_dmc
060ffcde  *ABS*      060ffcde _VDP2_CYCB1U
060ffefc  *ABS*      060ffefc _Window1_data
000269d0  .control   060669d0 ___gesf2
060ffca8  *ABS*      060ffca8 _DMASetFlag
060fff2c  *ABS*      060fff2c _Center2_data
0001e178  .control   0605e178 _init_objscr
06009104  *ABS*      06009104 _f_ed_bg05
000066f8  .text      000066f8 _SCR_2_6c_ctrl
06008b6c  *ABS*      06008b6c _f_demo43
060092bc  *ABS*      060092bc _f_stg2_tne_m
00029714  .control   06069714 _slCos
060ffcd2  *ABS*      060ffcd2 _VDP2_CYCA0U
00021714  .control   06061714 _set_kaiwa_int_func
0000089c  .text      0000089c _SONIC_set
00008418  .contbss   0607bd88 _weapon_level
0001e0e8  .control   0605e0e8 _scroll_system_stop
00003ee4  .text      00003ee4 _SCR_2_3_n0_sub
00019528  .control   06059528 _boss_brk_sub
0002d840  .control   0606d840 _slIncMatrixPtr
00018de0  .control   06058de0 _eft_moon_set
06008b24  *ABS*      06008b24 _f_demo31
00032dd8  .control   06072dd8 _anm_hibana02
000015e4  .data      00005504 _tail_anmpat
060ffd6c  *ABS*      060ffd6c _VDP2_BKTA
000187a0  .control   060587a0 _bbom
00022f88  .control   06062f88 _model_gour_set
060ffc0c  *ABS*      060ffc0c _EventCount
0001ecb8  .control   0605ecb8 _Map2VRAM
06008e00  *ABS*      06008e00 _f_nurse
00000000  SLPROG     00000000 _slZoomR
000080d4  .control   060480d4 _player_set
0600ed28  *ABS*      0600ed28 _v_timer
000023a0  .text      000023a0 _enm05_2
060fff16  *ABS*      060fff16 _Window2_Bottom
00002244  .text      00002244 _nise_set
06009394  *ABS*      06009394 _f_st10_tne
00016ff4  .control   06056ff4 _rot_sub
06007ff2  *ABS*      06007ff2 ___ashiftrt_r4_24
06035010  *ABS*      06035010 _set_imask
00008420  .contbss   0607bd90 _load_end_ram_adr
060ffc1c  *ABS*      060ffc1c _mtptr
060ffcd6  *ABS*      060ffcd6 _VDP2_CYCA1U
000003d4  .text      000003d4 _padman_muku
0000170c  .data      0000562c _middle_pos
06008b9c  *ABS*      06008b9c _f_peft
060ffd64  *ABS*      060ffd64 _VDP2_LSTA1
06008c88  *ABS*      06008c88 _f_misako
060ffc1a  *ABS*      060ffc1a _TransRequest
0000391c  .text      0000391c _SCR_2_3b2_init
000041ec  .text      000041ec _SCR_2_3d3_ctrl
00000f74  .control   06040f74 _credit_ct
06

0xDC000

This is part of the header file for the boss Golets.

/*------------------------------------------------------------------------*/
/* HIT3D                                                                  */
/*------------------------------------------------------------------------*/
/*-------------------------------------------*/
//M_SONIC_BODY
static  s16     p0_posi_data[]={
/* 0x00 */  0x0000, 0x0000, 0xfffb,     0x0000,
/* 0x00 */  0x0000, 0x0000, 0x0005,     0x0000,
/* 0x00 */  0x0000, 0xfff4, 0x0000,     0x0003,
/* 0x00 */  0x0000, 0x000b, 0x0002,     0x0000,
/* 0x00 */  0x0000, 0xfff4, 0x0008,     0x0003,
/* 0x00 */  0x0000, 0xfff4, 0xfff9,     0x0003,
/* 0x06 */  0x0000, 0xffef, 0x0002,     0x0003,
};
#define p0_suu  (6+1)
/*-------------------------------------------*/
//M_SONIC_BREST_L
//M_SONIC_BREST_R
static  s16     p1_posi_data[]={
/* 0x00 */  0x0000, 0xfff9, 0x0000,     0x0000,
/* 0x01 */  0x0000, 0x0006, 0x0000,     0x0000,
};
#define p1_suu  (1+1)
#define p2_suu  (1+1)
#define p2_posi_data    p1_posi_data
/*-------------------------------------------*/
//M_SONIC_KATA_L
static  s16     p3_posi_data[]={
/* 0x00 */  0x0000, 0xffff, 0x0000,     0x0000,
/* 0x00 */  0xfffd, 0x0035, 0x0000,     0x0000,
/* 0x00 */  0x0008, 0x000c, 0x0004,     0x0003,
/* 0x00 */  0x0008, 0x000c, 0xfffc,     0x0003,
/* 0x00 */  0x0008, 0x0014, 0x0004,     0x0003,
/* 0x00 */  0x0008, 0x0014, 0xfffc,     0x0003,
/* 0x00 */  0x0008, 0x001c, 0x0004,     0x0003,
/* 0x00 */  0x0008, 0x001c, 0xfffc,     0x0003,
/* 0x00 */  0x0008, 0x0024, 0x0004,     0x0003,
/* 0x00 */  0x0008, 0x0024, 0xfffc,     0x0003,
/* 0x00 */  0x000b, 0x002d, 0x0000,     0x0000,
/* 0x0b */  0x000b, 0x0038, 0x0000,     0x0000,
};
#define p3_suu  (11+1)
/*-------------------------------------------*/
//M_SONIC_KATA_R
static  s16     p4_posi_data[]={
/* 0x00 */  0x0000, 0xffff, 0x0000,     0x0000,
/* 0x00 */  0x0003, 0x0035, 0x0000,     0x0000,
/* 0x00 */  0xfff8, 0x000c, 0x0004,     0x0003,
/* 0x00 */  0xfff8, 0x000c, 0xfffc,     0x0003,
/* 0x00 */  0xfff8, 0x0014, 0x0004,     0x0003,
/* 0x00 */  0xfff8, 0x0014, 0xfffc,     0x0003,
/* 0x00 */  0xfff8, 0x001c, 0x0004,     0x0003,
/* 0x00 */  0xfff8, 0x001c, 0xfffc,     0x0003,
/* 0x00 */  0xfff8, 0x0024, 0x0004,     0x0003,
/* 0x00 */  0xfff8, 0x0024, 0xfffc,     0x0003,
/* 0x00 */  0xfff5, 0x002d, 0x0000,     0x0000,
/* 0x0b */  0xfff5, 0x0038, 0x0000,     0x0000,
};
#define p4_suu  (11+1)
/*-------------------------------------------*/
//M_SONIC_ARM_L
//M_SONIC_ARM_R
static  s16     p5_posi_data[]={
/* 0x00 */  0x0000, 0xfff9, 0x0000,     0x0000,
/* 0x01 */  0x0000, 0x0005, 0x0000,     0x0000,
};
#define p5_suu  (1+1)
#define p6_suu  (1+1)
#define p6_posi_data    p5_posi_data
/*-------------------------------------------*/
//M_SONIC_LEG_L
static  s16     p7_posi_data[]={
/* 0x00 */  0x0009, 0x0000, 0x0000,     0x0000,
/* 0x00 */  0x0000, 0x000d, 0x0000,     0x0000,
/* 0x00 */  0x0000, 0x0017, 0x0000,     0x0000,
/* 0x00 */  0x0000, 0x0020, 0x0000,     0x0000,
/* 0x00 */  0x0000, 0x001b, 0x000a,     0x0000,
/* 0x06 */  0x0000, 0x0011, 0x0006,     0x0000,
};
#define p7_suu  (6+1)
/*-------------------------------------------*/
//M_SONIC_LEG_R
static  s16     p8_posi_data[]={
/* 0x00 */  0xfff7, 0x0000, 0x0000,     0x0000,
/* 0x00 */  0x0000, 0x000d, 0x0000,     0x0000,
/* 0x00 */  0x0000, 0x0017, 0x0000,     0x0000,
/* 0x00 */  0x0000, 0x0020, 0x0000,     0x0000,
/* 0x00 */  0x0000, 0x001b, 0x000a,     0x0000,
/* 0x06 */  0x0000, 0x0011, 0x0006,     0x0000,
};
#define p8_suu  (6+1)

/*------------------------------------------------------------------------*/
/* SSSS Defines                                                           */
/*------------------------------------------------------------------------*/
#define BOS12_Chain_suu (19+1)

/*------------------------------------------------------------------------*/
/* Structs                                                                */
/*------------------------------------------------------------------------*/
obj_def(BOS12_WK,
    MAIN_WK     mw;
    ATARI_WK    aw;

/* For System */
    u8  sp;
    u16 fg; /* Control Master */
    u16 btimer;

/* For GAME Proc */
    u16 proc_step;
    s16 proc_wait;
    s16 zibaku;

/* For Moving */
    s32 dx;
    s32 dy;
    s32 dz;

    s16     angXspd;
    s16     angXssp;
    s16     angYspd;
    s16     angYssp;
    s16     angZspd;
    s16     angZssp;

/* For Hit3D */
    u16     p0_fg;
    u16     p1_fg;
    u16     p2_fg;
    u16     p3_fg;
    u16     p4_fg;
    u16     p5_fg;
    u16     p6_fg;
    u8      p0_brk_sp;
    u8      p1_brk_sp;
    u8      p2_brk_sp;
    u8      p3_brk_sp;
    u8      p4_brk_sp;
    u8      p5_brk_sp;
    u8      p6_brk_sp;
    s32     p0_life;
    s32     p1_life;
    s32     p2_life;
    s32     p3_life;
    s32     p4_life;
    s32     p5_life;
    s32     p6_life;
    FIXED   p0_posi[(XYZ)*p0_suu];
    FIXED   p1_posi[(XYZ)*p1_suu];
    FIXED   p2_posi[(XYZ)*p2_suu];
    FIXED   p3_posi[(XYZ)*p3_suu];
    FIXED   p4_posi[(XYZ)*p4_suu];
    FIXED   p5_posi[(XYZ)*p5_suu];
    FIXED   p6_posi[(XYZ)*p6_suu];
    FIXED   p7_posi[(XYZ)*p7_suu];
    FIXED   p8_posi[(XYZ)*p8_suu];
    FIXED   p7_fire[(XYZ)];
    FIXED   p8_fire[(XYZ)];

/* For Hit3D EDIT */
    s16     p0_posi_num;
    s16     p0_menu;
    s16     p0_save;

/* For SSSS */
    SSSS_WK     sw;
    s16         mot_buf[BOS12_Chain_suu];
    s16         spd_buf[BOS12_Chain_suu];
    SEDT_WK     ew;

/* For Parts_Link TransForm */
    s8      IDEON_X;    
    u8      IDEON_X_fg;
    u16     IDEON_X_sv; 

/* For Run-away */
    u8      runHundle;
    s16     runZ;
    s16     runsgt;
    s32     runspd;
    s32     runXpos;
    s32     runYpos;
    u8      scr_command;

    u8      scr_step;
    s8      scr_rand[2];
    u8      scr_p[2];
    s32     scr_y[2];
    s8      scr_shut;

/* For Lets&GO */
    u8          LG_fg;
    s8          LG_no;

/* For Ideon Sword */
    u8      IDEON_L_sp;
    u8      IDEON_R_sp;
    FIXED   IDEON_L_pos[XYZ*4];
    FIXED   IDEON_R_pos[XYZ*4];

/* For Shot Pos */
    FIXED   rain_pos[XYZ];
    FIXED   vul_L_pos[XYZ];
    FIXED   vul_R_pos[XYZ];
    FIXED   wng_L_pos[XYZ];
    FIXED   wng_R_pos[XYZ];

/* For Report Wait */
    EFT_OBJ *rep;
    s32     STG_SCORE0;
    s32     STG_SCORE1;

/* For UserFree */
    s16     s16w0;
    s16     s16w1;
    s16     s16w2;
    s16     s16w3;
    s16     s16w4;
    s16     s16w5;
    s32     s32w0;
    s32     s32w1;
    s32     s32w2;
    s32     s32w3;
);
obj_def(IDEON_SWORD_WK,
    MAIN_WK     mw;
    ATARI_WK    aw;

    u8      *IDEON_sp;
    FIXED   *pos;
    s32     *zom;
);
obj_def(SEARCH_WK,
    MAIN_WK     mw;
    ATARI_WK    aw;

    BOS12_WK    *ms;
    u16     fg;
    s32     dx;
    s32     dy;
    s8      s8w1;
    s8      s16we;
);

/*------------------------------------------------------------------------*/
/* SSSS Datas                                                             */
/*------------------------------------------------------------------------*/
#define DATA(Z)         Z,
#define MasANGY         *(x->sw.S_mot_buf+0x00)
#define MasANGZ         *(x->sw.S_mot_buf+0x01)
#define BstANGY         *(x->sw.S_mot_buf+0x02)
#define BstANGX         *(x->sw.S_mot_buf+0x03)
#define LwgANGY         *(x->sw.S_mot_buf+0x04)
#define LwgANGZ         *(x->sw.S_mot_buf+0x05)
#define LwgPOSX         *(x->sw.S_mot_buf+0x06)

#define LamPOSX         *(x->sw.S_mot_buf+0x07)
#define LamANGZ         *(x->sw.S_mot_buf+0x08)
#define LamANGX         *(x->sw.S_mot_buf+0x09)
#define RamANGZ         *(x->sw.S_mot_buf+0x0a)
#define RamANGX         *(x->sw.S_mot_buf+0x0b)

#define LrgPOSZ         *(x->sw.S_mot_buf+0x0c)
#define LrgANGZ         *(x->sw.S_mot_buf+0x0d)
#define LrgANGY         *(x->sw.S_mot_buf+0x0e)
#define LrgANGX         *(x->sw.S_mot_buf+0x0f)
#define RrgANGZ         *(x->sw.S_mot_buf+0x10)
#define RrgANGY         *(x->sw.S_mot_buf+0x11)
#define RrgANGX         *(x->sw.S_mot_buf+0x12)

#define TilANGX         *(x->sw.S_mot_buf+0x13)

/*====================================== 31 Line ===================*/
static  s16 BOS12_Mot_0000[]={
    DATA  ( 0x0000)                 /* MasANG Y   */
    DATA  ( 0x0000)                 /* MasANG Y   */
/*- Brest --------------------------*/
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
/*- Wing ---------------------------*/
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
/*- Arm Pos ------------------------*/
    DATA  ( 0x0000)                 /* Mas DATA   */
/*- Arm ----------------------------*/
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
/*- Reg ZP -------------------------*/
    DATA  ( 0x0000)                 /* Mas DATA   */
/*- Reg ----------------------------*/
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
/*- Til ----------------------------*/
    DATA  ( 0x0000)                 /* Mas DATA   */
};
/*====================================== 31 Line ===================*/
static  s16 BOS12_Mot_0001[]={
    DATA  ( 0x0000)                 /* MasANG Y   */
    DATA  ( 0xdc00)                 /* MasANG Y   */
/*- Brest --------------------------*/
    DATA  ( 0xc000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
/*- Wing ---------------------------*/
    DATA  ( 0xe000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x1000)                 /* Mas DATA   */
/*- Arm Pos ------------------------*/
    DATA  ( 0x0300)                 /* Mas DATA   */
/*- Arm ----------------------------*/
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0xf000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0xf000)                 /* Mas DATA   */
/*- Reg ZP -------------------------*/
    DATA  ( 0xf600)                 /* Mas DATA   */
/*- Reg ----------------------------*/
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x3000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x3000)                 /* Mas DATA   */
/*- Til ----------------------------*/
    DATA  ( 0x1000)                 /* Mas DATA   */
};
/*====================================== 31 Line ===================*/
static  s16 BOS12_Mot_0002[]={
    DATA  ( 0x0000)                 /* MasANG Y   */
    DATA  ( 0x8000)                 /* MasANG Y   */
/*- Brest --------------------------*/
    DATA  ( 0xc000)                 /* Mas DATA   */
    DATA  ( 0x2000)                 /* Mas DATA   */
/*- Wing ---------------------------*/
    DATA  ( 0xf000)                 /* Mas DATA   */
    DATA  ( 0xc000)                 /* Mas DATA   */
    DATA  ( 0x1a00)                 /* Mas DATA   */
/*- Arm Pos ------------------------*/
    DATA  ( 0x0800)                 /* Mas DATA   */
/*- Arm ----------------------------*/
    DATA  ( 0x3000)                 /* Mas DATA   */
    DATA  ( 0xe000)                 /* Mas DATA   */
    DATA  ( 0x3000)                 /* Mas DATA   */
    DATA  ( 0xe000)                 /* Mas DATA   */
/*- Reg ZP -------------------------*/
    DATA  ( 0xf000)                 /* Mas DATA   */
/*- Reg ----------------------------*/
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x1000)                 /* Mas DATA   */
    DATA  ( 0x5800)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x1000)                 /* Mas DATA   */
    DATA  ( 0x5800)                 /* Mas DATA   */
/*- Til ----------------------------*/
    DATA  ( 0x2000)                 /* Mas DATA   */
};
/*====================================== 31 Line ===================*/
static  s16 BOS12_Mot_0003[]={
    DATA  ( 0x0000)                 /* MasANG Y   */
    DATA  ( 0x4000)                 /* MasANG Y   */
/*- Brest --------------------------*/
    DATA  ( 0xc000)                 /* Mas DATA   */
    DATA  ( 0x4000)                 /* Mas DATA   */
/*- Wing ---------------------------*/
    DATA  ( 0x0800)                 /* Mas DATA   */
    DATA  ( 0xb800)                 /* Mas DATA   */
    DATA  ( 0x1600)                 /* Mas DATA   */
/*- Arm Pos ------------------------*/
    DATA  ( 0x0800)                 /* Mas DATA   */
/*- Arm ----------------------------*/
    DATA  ( 0x4000)                 /* Mas DATA   */
    DATA  ( 0xe000)                 /* Mas DATA   */
    DATA  ( 0x4000)                 /* Mas DATA   */
    DATA  ( 0xe000)                 /* Mas DATA   */
/*- Reg ZP -------------------------*/
    DATA  ( 0xe800)                 /* Mas DATA   */
/*- Reg ----------------------------*/
    DATA  ( 0xfc00)                 /* Mas DATA   */
    DATA  ( 0x4000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0xfc00)                 /* Mas DATA   */
    DATA  ( 0x4000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
/*- Til ----------------------------*/
    DATA  ( 0x4000)                 /* Mas DATA   */
};
/*====================================== 31 Line ===================*/
static  s16 BOS12_Mot_0004[]={
    DATA  ( 0x0000)                 /* MasANG Y   */
    DATA  ( 0x3000)                 /* MasANG Y   */
/*- Brest --------------------------*/
    DATA  ( 0xc000)                 /* Mas DATA   */
    DATA  ( 0x2000)                 /* Mas DATA   */
/*- Wing ---------------------------*/
    DATA  ( 0x2000)                 /* Mas DATA   */
    DATA  ( 0xc000)                 /* Mas DATA   */
    DATA  ( 0x1a00)                 /* Mas DATA   */
/*- Arm Pos ------------------------*/
    DATA  ( 0x0000)                 /* Mas DATA   */
/*- Arm ----------------------------*/
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
/*- Reg ZP -------------------------*/
    DATA  ( 0xf800)                 /* Mas DATA   */
/*- Reg ----------------------------*/
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x4000)                 /* Mas DATA   */
    DATA  ( 0xea00)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x4000)                 /* Mas DATA   */
    DATA  ( 0xea00)                 /* Mas DATA   */
/*- Til ----------------------------*/
    DATA  ( 0x5400)                 /* Mas DATA   */
};
/*====================================== 31 Line ===================*/
static  s16 BOS12_Mot_0005[]={
    DATA  ( 0x0000)                 /* MasANG Y   */
    DATA  ( 0x1000)                 /* MasANG Y   */
/*- Brest --------------------------*/
    DATA  ( 0xc000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
/*- Wing ---------------------------*/
    DATA  ( 0x3000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x1100)                 /* Mas DATA   */
/*- Arm Pos ------------------------*/
    DATA  ( 0x0000)                 /* Mas DATA   */
/*- Arm ----------------------------*/
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
/*- Reg ZP -------------------------*/
    DATA  ( 0xf600)                 /* Mas DATA   */
/*- Reg ----------------------------*/
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x2000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x2000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
/*- Til ----------------------------*/
    DATA  ( 0x3b00)                 /* Mas DATA   */
};
/*====================================== 31 Line ===================*/
static  s16 BOS12_Mot_0006[]={
    DATA  ( 0x0000)                 /* MasANG Y   */
    DATA  ( 0x4000)                 /* MasANG Y   */
/*- Brest --------------------------*/
    DATA  ( 0xb800)                 /* Mas DATA   */
    DATA  ( 0x4000)                 /* Mas DATA   */
/*- Wing ---------------------------*/
    DATA  ( 0xc000)                 /* Mas DATA   */
    DATA  ( 0xc400)                 /* Mas DATA   */
    DATA  ( 0x0e00)                 /* Mas DATA   */
/*- Arm Pos ------------------------*/
    DATA  ( 0x0e00)                 /* Mas DATA   */
/*- Arm ----------------------------*/
    DATA  ( 0x6800)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x6800)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
/*- Reg ZP -------------------------*/
    DATA  ( 0xec00)                 /* Mas DATA   */
/*- Reg ----------------------------*/
    DATA  ( 0xfc00)                 /* Mas DATA   */
    DATA  ( 0x4000)                 /* Mas DATA   */
    DATA  ( 0x0300)                 /* Mas DATA   */
    DATA  ( 0xfc00)                 /* Mas DATA   */
    DATA  ( 0x4000)                 /* Mas DATA   */
    DATA  ( 0x0300)                 /* Mas DATA   */
/*- Til ----------------------------*/
    DATA  ( 0x4b00)                 /* Mas DATA   */
};
/*====================================== 31 Line ===================*/
static  s16 BOS12_Mot_0007[]={
    DATA  ( 0x0000)                 /* MasANG Y   */
    DATA  ( 0x3800)                 /* MasANG Y   */
/*- Brest --------------------------*/
    DATA  ( 0xc500)                 /* Mas DATA   */
    DATA  ( 0x5000)                 /* Mas DATA   */
/*- Wing ---------------------------*/
    DATA  ( 0xc000)                 /* Mas DATA   */
    DATA  ( 0xbb00)                 /* Mas DATA   */
    DATA  ( 0x0c00)                 /* Mas DATA   */
/*- Arm Pos ------------------------*/
    DATA  ( 0x0300)                 /* Mas DATA   */
/*- Arm ----------------------------*/
    DATA  ( 0x1000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x1000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
/*- Reg ZP -------------------------*/
    DATA  ( 0xec00)                 /* Mas DATA   */
/*- Reg ----------------------------*/
    DATA  ( 0xfa00)                 /* Mas DATA   */
    DATA  ( 0x3500)                 /* Mas DATA   */
    DATA  ( 0xfe00)                 /* Mas DATA   */
    DATA  ( 0xfa00)                 /* Mas DATA   */
    DATA  ( 0x3500)                 /* Mas DATA   */
    DATA  ( 0xfe00)                 /* Mas DATA   */
/*- Til ----------------------------*/
    DATA  ( 0x2800)                 /* Mas DATA   */
};
/*====================================== 30 Line ===================*/
static  s16 BOS12_Mot_0008[]={
    DATA  ( 0x0000)                 /* MasANG Y   */
    DATA  ( 0x4400)                 /* MasANG Y   */
/*- Brest --------------------------*/
    DATA  ( 0xcc00)                 /* Mas DATA   */
    DATA  ( 0x4000)                 /* Mas DATA   */
/*- Wing ---------------------------*/
    DATA  ( 0xfc00)                 /* Mas DATA   */
    DATA  ( 0xb800)                 /* Mas DATA   */
    DATA  ( 0x1200)                 /* Mas DATA   */
/*- Arm Pos ------------------------*/
    DATA  ( 0x0900)                 /* Mas DATA   */
/*- Arm ----------------------------*/
    DATA  ( 0x4000)                 /* Mas DATA   */
    DATA  ( 0xd000)                 /* Mas DATA   */
    DATA  ( 0x4000)                 /* Mas DATA   */
    DATA  ( 0xd000)                 /* Mas DATA   */
/*- Reg ZP -------------------------*/
    DATA  ( 0xe500)                 /* Mas DATA   */
/*- Reg ----------------------------*/
    DATA  ( 0xfa00)                 /* Mas DATA   */
    DATA  ( 0x3500)                 /* Mas DATA   */
    DATA  ( 0xf000)                 /* Mas DATA   */
    DATA  ( 0xfa00)                 /* Mas DATA   */
    DATA  ( 0x3500)                 /* Mas DATA   */
    DATA  ( 0xf000)                 /* Mas DATA   */
/*- Til ----------------------------*/
    DATA  ( 0x4b00)                 /* Mas DATA   */
};
/*====================================== 30 Line ===================*/
static  s16 BOS12_Mot_0009[]={
    DATA  ( 0x0000)                 /* MasANG Y   */
    DATA  ( 0x4200)                 /* MasANG Y   */
/*- Brest --------------------------*/
    DATA  ( 0xc000)                 /* Mas DATA   */
    DATA  ( 0x4600)                 /* Mas DATA   */
/*- Wing ---------------------------*/
    DATA  ( 0x0400)                 /* Mas DATA   */
    DATA  ( 0xc500)                 /* Mas DATA   */
    DATA  ( 0x1000)                 /* Mas DATA   */
/*- Arm Pos ------------------------*/
    DATA  ( 0x0800)                 /* Mas DATA   */
/*- Arm ----------------------------*/
    DATA  ( 0x3c00)                 /* Mas DATA   */
    DATA  ( 0xc000)                 /* Mas DATA   */
    DATA  ( 0x3c00)                 /* Mas DATA   */
    DATA  ( 0xc000)                 /* Mas DATA   */
/*- Reg ZP -------------------------*/
    DATA  ( 0xe900)                 /* Mas DATA   */
/*- Reg ----------------------------*/
    DATA  ( 0xf500)                 /* Mas DATA   */
    DATA  ( 0x3500)                 /* Mas DATA   */
    DATA  ( 0xf400)                 /* Mas DATA   */
    DATA  ( 0xf500)                 /* Mas DATA   */
    DATA  ( 0x3500)                 /* Mas DATA   */
    DATA  ( 0xf400)                 /* Mas DATA   */
/*- Til ----------------------------*/
    DATA  ( 0x4000)                 /* Mas DATA   */
};
/*====================================== 30 Line ===================*/
static  s16 BOS12_Mot_000a[]={
    DATA  ( 0xfc00)                 /* MasANG Y   */
    DATA  ( 0x4000)                 /* MasANG Y   */
/*- Brest --------------------------*/
    DATA  ( 0xa800)                 /* Mas DATA   */
    DATA  ( 0x4000)                 /* Mas DATA   */
/*- Wing ---------------------------*/
    DATA  ( 0xe600)                 /* Mas DATA   */
    DATA  ( 0xcc00)                 /* Mas DATA   */
    DATA  ( 0x1300)                 /* Mas DATA   */
/*- Arm Pos ------------------------*/
    DATA  ( 0x0500)                 /* Mas DATA   */
/*- Arm ----------------------------*/
    DATA  ( 0x7300)                 /* Mas DATA   */
    DATA  ( 0xe900)                 /* Mas DATA   */
    DATA  ( 0x1700)                 /* Mas DATA   */
    DATA  ( 0x2000)                 /* Mas DATA   */
/*- Reg ZP -------------------------*/
    DATA  ( 0xde00)                 /* Mas DATA   */
/*- Reg ----------------------------*/
    DATA  ( 0xe900)                 /* Mas DATA   */
    DATA  ( 0x1f00)                 /* Mas DATA   */
    DATA  ( 0xe100)                 /* Mas DATA   */
    DATA  ( 0x1100)                 /* Mas DATA   */
    DATA  ( 0x5600)                 /* Mas DATA   */
    DATA  ( 0xea00)                 /* Mas DATA   */
/*- Til ----------------------------*/
    DATA  ( 0x6d00)                 /* Mas DATA   */
};
/*====================================== 30 Line ===================*/
static  s16 BOS12_Mot_000b[]={
    DATA  ( 0x0400)                 /* MasANG Y   */
    DATA  ( 0x4000)                 /* MasANG Y   */
/*- Brest --------------------------*/
    DATA  ( 0xa800)                 /* Mas DATA   */
    DATA  ( 0x4000)                 /* Mas DATA   */
/*- Wing ---------------------------*/
    DATA  ( 0xe600)                 /* Mas DATA   */
    DATA  ( 0xcc00)                 /* Mas DATA   */
    DATA  ( 0x1300)                 /* Mas DATA   */
/*- Arm Pos ------------------------*/
    DATA  ( 0x0500)                 /* Mas DATA   */
/*- Arm ----------------------------*/
    DATA  ( 0x1700)                 /* Mas DATA   */
    DATA  ( 0x2000)                 /* Mas DATA   */
    DATA  ( 0x7300)                 /* Mas DATA   */
    DATA  ( 0xe900)                 /* Mas DATA   */
/*- Reg ZP -------------------------*/
    DATA  ( 0xde00)                 /* Mas DATA   */
/*- Reg ----------------------------*/
    DATA  ( 0x1100)                 /* Mas DATA   */
    DATA  ( 0x5600)                 /* Mas DATA   */
    DATA  ( 0xea00)                 /* Mas DATA   */
    DATA  ( 0xe900)                 /* Mas DATA   */
    DATA  ( 0x1f00)                 /* Mas DATA   */
    DATA  ( 0xe100)                 /* Mas DATA   */
/*- Til ----------------------------*/
    DATA  ( 0x6d00)                 /* Mas DATA   */
};
/*====================================== 30 Line ===================*/
static  s16 BOS12_Mot_000c[]={
    DATA  ( 0xfc00)                 /* MasANG Y   */
    DATA  ( 0x4000)                 /* MasANG Y   */
/*- Brest --------------------------*/
    DATA  ( 0xc000)                 /* Mas DATA   */
    DATA  ( 0x4000)                 /* Mas DATA   */
/*- Wing ---------------------------*/
    DATA  ( 0xf200)                 /* Mas DATA   */
    DATA  ( 0xb100)                 /* Mas DATA   */
    DATA  ( 0x1300)                 /* Mas DATA   */
/*- Arm Pos ------------------------*/
    DATA  ( 0x0a00)                 /* Mas DATA   */
/*- Arm ----------------------------*/
    DATA  ( 0x2000)                 /* Mas DATA   */
    DATA  ( 0xcf00)                 /* Mas DATA   */
    DATA  ( 0x2800)                 /* Mas DATA   */
    DATA  ( 0xe000)                 /* Mas DATA   */
/*- Reg ZP -------------------------*/
    DATA  ( 0xe300)                 /* Mas DATA   */
/*- Reg ----------------------------*/
    DATA  ( 0x0300)                 /* Mas DATA   */
    DATA  ( 0x4c00)                 /* Mas DATA   */
    DATA  ( 0xde00)                 /* Mas DATA   */
    DATA  ( 0xfd00)                 /* Mas DATA   */
    DATA  ( 0x1c00)                 /* Mas DATA   */
    DATA  ( 0xe700)                 /* Mas DATA   */
/*- Til ----------------------------*/
    DATA  ( 0x6900)                 /* Mas DATA   */
};
/*====================================== 30 Line ===================*/
static  s16 BOS12_Mot_000d[]={
    DATA  ( 0x0400)                 /* MasANG Y   */
    DATA  ( 0x4000)                 /* MasANG Y   */
/*- Brest --------------------------*/
    DATA  ( 0xc000)                 /* Mas DATA   */
    DATA  ( 0x4000)                 /* Mas DATA   */
/*- Wing ---------------------------*/
    DATA  ( 0xf200)                 /* Mas DATA   */
    DATA  ( 0xb100)                 /* Mas DATA   */
    DATA  ( 0x1300)                 /* Mas DATA   */
/*- Arm Pos ------------------------*/
    DATA  ( 0x0a00)                 /* Mas DATA   */
/*- Arm ----------------------------*/
    DATA  ( 0x2800)                 /* Mas DATA   */
    DATA  ( 0xe000)                 /* Mas DATA   */
    DATA  ( 0x2000)                 /* Mas DATA   */
    DATA  ( 0xcf00)                 /* Mas DATA   */
/*- Reg ZP -------------------------*/
    DATA  ( 0xe300)                 /* Mas DATA   */
/*- Reg ----------------------------*/
    DATA  ( 0xfd00)                 /* Mas DATA   */
    DATA  ( 0x1c00)                 /* Mas DATA   */
    DATA  ( 0xe700)                 /* Mas DATA   */
    DATA  ( 0x0300)                 /* Mas DATA   */
    DATA  ( 0x4c00)                 /* Mas DATA   */
    DATA  ( 0xde00)                 /* Mas DATA   */
/*- Til ----------------------------*/
    DATA  ( 0x6900)                 /* Mas DATA   */
};
/*====================================== 30 Line ===================*/
static  s16 BOS12_Mot_000e[]={
    DATA  ( 0x0000)                 /* MasANG Y   */
    DATA  ( 0x4600)                 /* MasANG Y   */
/*- Brest --------------------------*/
    DATA  ( 0xc000)                 /* Mas DATA   */
    DATA  ( 0x4600)                 /* Mas DATA   */
/*- Wing ---------------------------*/
    DATA  ( 0x1800)                 /* Mas DATA   */
    DATA  ( 0xa800)                 /* Mas DATA   */
    DATA  ( 0x0c00)                 /* Mas DATA   */
/*- Arm Pos ------------------------*/
    DATA  ( 0x0700)                 /* Mas DATA   */
/*- Arm ----------------------------*/
    DATA  ( 0x4000)                 /* Mas DATA   */
    DATA  ( 0xaa00)                 /* Mas DATA   */
    DATA  ( 0x4000)                 /* Mas DATA   */
    DATA  ( 0xaa00)                 /* Mas DATA   */
/*- Reg ZP -------------------------*/
    DATA  ( 0xf300)                 /* Mas DATA   */
/*- Reg ----------------------------*/
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x4000)                 /* Mas DATA   */
    DATA  ( 0x1000)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x4000)                 /* Mas DATA   */
    DATA  ( 0x1000)                 /* Mas DATA   */
/*- Til ----------------------------*/
    DATA  ( 0x1800)                 /* Mas DATA   */
};
/*====================================== 30 Line ===================*/
static  s16 BOS12_Mot_000f[]={
    DATA  ( 0x0000)                 /* MasANG Y   */
    DATA  ( 0x5c00)                 /* MasANG Y   */
/*- Brest --------------------------*/
    DATA  ( 0xc000)                 /* Mas DATA   */
    DATA  ( 0x2400)                 /* Mas DATA   */
/*- Wing ---------------------------*/
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0xd800)                 /* Mas DATA   */
    DATA  ( 0x0e00)                 /* Mas DATA   */
/*- Arm Pos ------------------------*/
    DATA  ( 0x0800)                 /* Mas DATA   */
/*- Arm ----------------------------*/
    DATA  ( 0x1b00)                 /* Mas DATA   */
    DATA  ( 0x1000)                 /* Mas DATA   */
    DATA  ( 0x1b00)                 /* Mas DATA   */
    DATA  ( 0x1000)                 /* Mas DATA   */
/*- Reg ZP -------------------------*/
    DATA  ( 0xed00)                 /* Mas DATA   */
/*- Reg ----------------------------*/
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x4000)                 /* Mas DATA   */
    DATA  ( 0x0400)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x4000)                 /* Mas DATA   */
    DATA  ( 0x0400)                 /* Mas DATA   */
/*- Til ----------------------------*/
    DATA  ( 0x5800)                 /* Mas DATA   */
};
/*====================================== 30 Line ===================*/
static  s16 BOS12_Mot_0010[]={
    DATA  ( 0x0000)                 /* MasANG Y   */
    DATA  ( 0x6800)                 /* MasANG Y   */
/*- Brest --------------------------*/
    DATA  ( 0xc000)                 /* Mas DATA   */
    DATA  ( 0x1c00)                 /* Mas DATA   */
/*- Wing ---------------------------*/
    DATA  ( 0xf500)                 /* Mas DATA   */
    DATA  ( 0xd200)                 /* Mas DATA   */
    DATA  ( 0x1000)                 /* Mas DATA   */
/*- Arm Pos ------------------------*/
    DATA  ( 0x0800)                 /* Mas DATA   */
/*- Arm ----------------------------*/
    DATA  ( 0x2000)                 /* Mas DATA   */
    DATA  ( 0xf000)                 /* Mas DATA   */
    DATA  ( 0x2000)                 /* Mas DATA   */
    DATA  ( 0xf000)                 /* Mas DATA   */
/*- Reg ZP -------------------------*/
    DATA  ( 0xed00)                 /* Mas DATA   */
/*- Reg ----------------------------*/
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x4000)                 /* Mas DATA   */
    DATA  ( 0xed00)                 /* Mas DATA   */
    DATA  ( 0x0000)                 /* Mas DATA   */
    DATA  ( 0x4000)                 /* Mas DATA   */
    DATA  ( 0xed00)                 /* Mas DATA   */
/*- Til ----------------------------*/
    DATA  ( 0x4d00)                 /* Mas DATA   */
};



/*=========================================================*/
static  s16 *BOS12_mot_ent_tbl[]={
/*--- Trans Form ------------------------------------------*/
    BOS12_Mot_0000,
    BOS12_Mot_0001,
    BOS12_Mot_0002,
    BOS12_Mot_0003,
    BOS12_Mot_0004,
    BOS12_Mot_0005,
/*--- M Vulcan --------------------------------------------*/
    BOS12_Mot_0006,
    BOS12_Mot_0007,
/*--- M Wait   --------------------------------------------*/
    BOS12_Mot_0008,
    BOS12_Mot_0009,
/*--- M Msht   --------------------------------------------*/
    BOS12_Mot_000a,
    BOS12_Mot_000b,
    BOS12_Mot_000c,
    BOS12_Mot_000d,
    BOS12_Mot_000e,
/*--- M Meto   --------------------------------------------*/
    BOS12_Mot_000f,
    BOS12_Mot_0010,
};

/*=========================================================*/
static  s16 BOS12_WAIT[]={
    0x0000, 10, 0,
    0x0000, 10, 0,
    SSSS_LOOP,
};
static  s16 BOS12_TRNS1[]={
    SSSS_START,
    0x0001, 10, 0,
    0x0002, 10, 0,
    0x0003, 10, 0,
    0x0003, 10, 0,
    0x0008, 30, 0,
    SSSS_END,
};
#if 0
static  s16 BOS12_TRNS2[]={
    SSSS_START,
    0x0004, 10, 0,
    0x0005, 10, 0,
    0x0000, 10, 0,
    SSSS_END,
};
#endif
static  s16 BOS12_Wait[]={
    0x0009, 20,   0,
    0x0008, 50, -45,
    0x0008, 40,  -5,
    0x0008, 20,   0,
    0x0009, 50, -45,
    0x0009, 40,  -5,
    SSSS_LOOP,
};

static  s16 BOS12_Vulc_Set[]={
    SSSS_START,
    0x0007, 30,  -8,
    0x0007, 20,  +4,
    SSSS_END,
};
static  s16 BOS12_Vulc[]={
    0x0007, 20,   0,
    0x0006, 100,-90,
    0x0006, 80, -10,
    0x0006, 20,   0,
    0x0007, 100,-90,
    0x0007, 80, -10,
    SSSS_LOOP,
};
static  s16 BOS12_MshtR[]={
    SSSS_START,
    0x000e, 40,   0,
    0x000a,  8,   0,
    0x000c, 16,   0,
    0x0008, 20,  -10,
    0x0008, 30,    0,
    SSSS_END,
};
static  s16 BOS12_MshtL[]={
    SSSS_START,
    0x000e, 40,   0,
    0x000b,  8,   0,
    0x000d, 16,   0,
    0x0008, 20,  -10,
    0x0008, 30,    0,
    SSSS_END,
};
static  s16 BOS12_Meto_Set[]={
    SSSS_START,
    0x0010, 30,   0,
    SSSS_END,
};
static  s16 BOS12_Meto[]={
    0x0010,  7,   0,
    0x000f,  7,   0,
    SSSS_LOOP,
};

#if EDIT
static  s16 BOS12_TRNS[]={
    0x0010, 10,   0,
    0x000f, 10,   0,
    SSSS_LOOP,
};
#endif

0xE4400

This is part of an objdump listing.

0026d1c  .control   06066d1c ___mulsi3
06008adc  *ABS*      06008adc _f_demo13
00000000  .text      00000000 _SCR_2_init
00014ef0  .control   06054ef0 _eshot07_disp
00032e48  .control   06072e48 _anm_gero00
06007860  *ABS*      06007860 _SND_GetSeqStat
060ffd26  *ABS*      060ffd26 _VDP2_MPGHRB
060342d8  *ABS*      060342d8 _slSetPortMode2
0600931c  *ABS*      0600931c _f_stg4_tne_m
00018a60  .control   06058a60 _bbom_set
060ffc76  *ABS*      060ffc76 _TotalVertices
00018170  .control   06058170 _hahen_set
0000de64  .control   0604de64 _eft_func
06008d2c  *ABS*      06008d2c _f_s3jama
0000ac40  .contbss   0607e5b0 _vntbl_body
00001174  .text      00001174 _set_mime_matrix
0000847a  .contbss   0607bdea _local_load_tex_ofs
00024f8c  .control   06064f8c _sys__interrupt_handler28
0000424c  .text      0000424c _SCR_2_3_moya
060fff18  *ABS*      060fff18 _Win1Zlimit
060ffd28  *ABS*      060ffd28 _VDP2_MPIJRB
00024d48  .control   06064d48 _SYS_SetUintMacSave
060094e4  *ABS*      060094e4 _f_st51_tne
000311a0  .control   060711a0 _slDivFX
00016084  .control   06056084 _hansya_anm
0001f244  .control   0605f244 _SCR_MoveRbgRB
00021534  .control   06061534 _demo_start
06004000  *ABS*      06004000 _main
0000847c  .contbss   0607bdec _load_col_ofs
06008c14  *ABS*      06008c14 _f_makuno
06004064  *ABS*      06004064 _SortListSize
0600405c  *ABS*      0600405c _EventSize
00019d38  .control   06059d38 _enm01_dead
06033530  *ABS*      06033530 _slInitInterrupt
06008ba8  *ABS*      06008ba8 _f_warning
00006608  .text      00006608 _moni_scr
060fff20  *ABS*      060fff20 _Win1_ScreenDist
00021c4c  .control   06061c4c _set_next_win
00016030  .control   06056030 _hansya_set
0000019c  .data      00007124 _st2_name_10
060ffd7c  *ABS*      060ffd7c _VDP2_RPTA
00003508  .text      00003508 _SCR_2_2c_ctrl
06033276  *ABS*      06033276 _BlankIn
00030930  .control   06070930 _slMapNbg0
00023a98  .control   06063a98 _chase_laser
000216d0  .control   060616d0 _kaiwa_tim0_func3
000095d0  .control   060495d0 _play_spred_set
060ffd5a  *ABS*      060ffd5a _VDP2_SCRCTL
060344d8  *ABS*      060344d8 _Smpc_Result
060ffde0  *ABS*      060ffde0 _ScrRotPtr
0002da30  .control   0606da30 _slVRAMMode
00006268  .text      00006268 _guid_set
06034d92  *ABS*      06034d92 _PCM_EndCheck
00017bb4  .control   06057bb4 _eft_bomb04_set
00002284  .text      00002284 _SCR_2_1a_ctrl
00008480  .contbss   0607bdf0 _obj_x
060ffd2a  *ABS*      060ffd2a _VDP2_MPKLRB
06006a58  *ABS*      06006a58 _SND_TIMING
060ffcc4  *ABS*      060ffcc4 _VDP2_TVSTAT
00024f02  .control   06064f02 _sys__interrupt_handler3
00003b50  .text      00003b50 _padman_disp2
060093f4  *ABS*      060093f4 _f_stg2_seq
0001fb4c  .control   0605fb4c _disp_warning_bg
00020ab4  .control   06060ab4 _mk_credit_map_sub
06008f18  *ABS*      06008f18 _f_titlebg
060ffde4  *ABS*      060ffde4 _nbg0_char_adr
00020884  .control   06060884 _mk_score_map
00030eb0  .control   06070eb0 _slSetAmbient
00014638  .control   06054638 _eshot02_set
000006f4  

0xE5000

This is part of the source code for Stage 2.

/*==================================================================*/
/*                          STG02                                   */
/*==================================================================*/
#include    "bios.h"
#include    "ryo.h"
#include    "game.h"
#include    "nami.h"
#include    "scroll.h"
/*------------------------------------------------------------------*/
#define NORMAL_SET      1
#define BOSSX_DEBUG_SET 0
#define BOSSY_DEBUG_SET 0
#define BOSSZ_DEBUG_SET 0
#define PAD_DEBUG_SET   0

#define FLAT_MODE   0
/*------------------------------------------------------------------*/
#define tm(X,Y,Z)   ((X*60*60)+(Y*60)+Z)
/*------------------------------------------------------------------*/
ENM_SET_TBL_    etbl00[];
ENM_SET_TBL_    etbl01[];
ENM_SET_TBL_    etbl02[];
ENM_SET_TBL_    etbl03[];
ENM_SET_TBL_    etbl04[];

/*------------------------------------------------------------------*/
/* Common Enemy                                                     */
/*------------------------------------------------------------------*/
extern  s32     eset10_enm00_set(ESET_OBJ *ex);
extern  s32     inu_set(ESET_OBJ *ex);
extern  void    name_set_sub(s8 *AD0, s8 *AD1, s8 *AD2, s8 *AD3,  s16 Wait);

/*------------------------------------------------------------------*/
/* Boss   Enemy                                                     */
/*------------------------------------------------------------------*/
extern  s8      bos10_set(void);
extern  s8      bos11_set(void);
extern  s8      bos12_set(void);
extern  s8      padman_set(void);
extern  s8      guid_set(void);

extern  s8      bike_set(void);
extern  s32     nise_set(ENM_SET_TBL *etbl);
/*------------------------------------------------------------------*/
static  s8 bos00_name[] = "^1KOTETSU";
static  s8 bos00_p0[]   = "1:HARDINESS";
static  s8 bos00_p1[]   = "2:SLEIGHT;OF;HAND";
static  s8 bos00_p2[]   = "3:FRIEND;SHIP";

static  s8 bos01_name[] = "^1GOLETS";
static  s8 bos01_p0[]   = "1:HIGH;SPEED;SIGHT";
static  s8 bos01_p1[]   = "2:BRAVE;HEART";
static  s8 bos01_p2[]   = "3:BROTHER;LOVE";

static  s8 bos02_name[] = "^1NASU";
static  s8 bos02_p0[]   = "1:BRAVE;FOR;ENTER;BOSOM";
static  s8 bos02_p1[]   = "2:PLACATE;TO;ANIMAL";
static  s8 bos02_p2[]   = "3:WILD;CAMERA";

static  s8 bos03_name[] = "^1DAIKAI10";
static  s8 bos03_p0[]   = "1:DECIDE;WEAPONS";
static  s8 bos03_p1[]   = "2:SUPPLE;THINK";
static  s8 bos03_p2[]   = "3:...AND;LUCK";

static  s8 bos04_name[] = "^1GEDO-O";
static  s8 bos04_p0[]   = "1:MAKE TIME";
static  s8 bos04_p1[]   = "2:DECIDE;WEAPONS";
static  s8 bos04_p2[]   = "3:LOOK;OVER;TO;LINES";

static  s8  *bos_name[]={
    bos00_name,
    bos01_name,
    bos02_name,
    bos03_name,
    bos04_name,
};
static  s8  *bos_poten[]={
    bos00_p0,bos00_p1,bos00_p2,
    bos01_p0,bos01_p1,bos01_p2,
    bos02_p0,bos02_p1,bos02_p2,
    bos03_p0,bos03_p1,bos03_p2,
    bos04_p0,bos04_p1,bos04_p2,
};
/*=================================================================*/
static  s32 name_set(ENM_SET_TBL *etbl){
/*=================================================================*/
    name_set_sub(bos_name[(u8)etbl->no],
                 bos_poten[((u8)etbl->no*3)+0],
                 bos_poten[((u8)etbl->no*3)+1],
                 bos_poten[((u8)etbl->no*3)+2],
                 etbl->d0.swl);
    return  1;
}
/*==================================================================*/
#define step    no
#define load_adr    etbl->w1.swl
#define vram_adr    etbl->w2.swl
#define tex_ofs     etbl->w3.sww[0]
#define col_ofs     etbl->w3.sww[1]

#define sd_adr  etbl->w1.swl
#define sq_adr  (sd_adr + sd_size)
#define sd_size etbl->w2.swl
#define sq_size etbl->w3.swl

static  s32 SE_load(ENM_SET_TBL *etbl, u8 TONE){
    enum{
        LOAD_INIT,
        SD_LOAD_START,
        SD_LOAD_WAIT,
        SD_SET,
        LOAD_END,
        END
    };
    s32 ret;
#ifdef SS
    GfsHn   cdhn;
#endif
#ifdef STV
    LOAD_FILE_INF   *cdhn;
#endif
    cdhn    = etbl->w0.func;

//  return  1;

    ret = 0;
    switch(etbl->step){
/*----------------------*/
    case LOAD_INIT:
/*----------------------*/
        sd_adr  = local_load_end_ram_adr;
        sd_adr  -= STG_TONE_BANK_SIZE_MAX;

        etbl->step  = SD_LOAD_START;
        break;
/*----------------------*/
    case SD_LOAD_START:
/*----------------------*/
        cdhn    = sd_data_load(TONE,sd_adr);
        if(cdhn == NULL)break;
        sd_size = file_size_get(cdhn);
        etbl->step  = SD_LOAD_WAIT;
        break;
/*----------------------*/
    case SD_LOAD_WAIT:
/*----------------------*/
        if(!read_check(cdhn))break;
        etbl->step  = SD_SET;
        break;
/*----------------------*/
    case SD_SET:
/*----------------------*/
        sd_data_set(TONE,sd_adr,sd_size);
        etbl->step  = LOAD_END;
        break;
/*----------------------*/
    case LOAD_END:
/*----------------------*/
        ret = 1;
        break;
    }
    etbl->w0.func   = cdhn;
    etbl->d0.swl--;
    return(ret);

}
/*============================================================================*/
static  s32 stg21_se_load(ENM_SET_TBL *etbl){
/*============================================================================*/
    return  SE_load(etbl,SD_STG21_TNE);
}
/*============================================================================*/
static  s32 stg22_se_load(ENM_SET_TBL *etbl){
/*============================================================================*/
    return  SE_load(etbl,SD_STG22_TNE);
}
/*============================================================================*/
static  s32 stg23_se_load(ENM_SET_TBL *etbl){
/*============================================================================*/
    return  SE_load(etbl,SD_STG23_TNE);
}
/*============================================================================*/
static  s32 stg24_se_load(ENM_SET_TBL *etbl){
/*============================================================================*/
    return  SE_load(etbl,SD_STG24_TNE);
}
/*============================================================================*/
static  s32 stg25_se_load(ENM_SET_TBL *etbl){
/*============================================================================*/
    return  SE_load(etbl,SD_STG25_TNE);
}
#undef  sd_adr
#undef  sq_adr
#undef  sd_size
#undef  sq_size
/*==================================================================*/
#define step    no
#define load_adr    etbl->w1.swl
#define vram_adr    etbl->w2.swl
#define tex_ofs     etbl->w3.sww[0]
#define col_ofs     etbl->w3.sww[1]

#define sd_adr  etbl->w1.swl
#define sq_adr  (sd_adr + sd_size)
#define sd_size etbl->w2.swl
#define sq_size etbl->w3.swl

static  s32 bos_bgm_load(ENM_SET_TBL *etbl)
{
    enum{
        LOAD_INIT,
        SD_LOAD_START,
        SD_LOAD_WAIT,
        SQ_LOAD_START,
        SQ_LOAD_WAIT,

        BGM_STOP,
        BGM_STOP_WAIT,
        SD_SET,
        SQ_SET,
        BGM_SET,

        LOAD_END,
        END
    };
    s32 ret;

#ifdef SS
    GfsHn   cdhn;
#endif
#ifdef STV
    LOAD_FILE_INF   *cdhn;
#endif

    cdhn    = etbl->w0.func;

    ret = 0;
    switch(etbl->step){
    case LOAD_INIT:
        sd_adr  = local_load_end_ram_adr;
        sd_adr  -= BGM_BANK_SIZE_MAX;

        etbl->step++;
        break;

    case SD_LOAD_START:
        cdhn    = sd_data_load(SD_BOS2_TNE_M,   sd_adr);
        if(cdhn == NULL)break;
        sd_size = file_size_get(cdhn);
        etbl->step  = SD_LOAD_WAIT;
        break;
    case SD_LOAD_WAIT:
        if(!read_check(cdhn))break;
        etbl->step++;
        break;

    case SQ_LOAD_START:
        cdhn    = sd_data_load(SD_BOS2_SEQ_M,   sq_adr);
        if(cdhn == NULL)break;
        sq_size = file_size_get(cdhn);
        etbl->step  = SQ_LOAD_WAIT;
        break;
    case SQ_LOAD_WAIT:
        if(!read_check(cdhn))break;
        etbl->step  = BGM_STOP;
        break;
    case BGM_STOP:
        if(etbl->d0.swl > 0)break;
        bgm_stop(200);
        etbl->step  = BGM_STOP_WAIT;
        break;
    case BGM_STOP_WAIT:
        if(sd_x->bgm_set_no != BGM_NULL)break;
        etbl->d0.swl    = 2;
        etbl->step  = SD_SET;
        break;
    case SD_SET:
        if(etbl->d0.swl > 0)break;
        sd_data_set(SD_BOS2_TNE_M,sd_adr,sd_size);
        sd_data_set(SD_BOS2_SEQ_M,sq_adr,sq_size);

        etbl->d0.swl    = cmin(etbl->d1.swl,((sd_size + sq_size) / DIV_DMA_SIZE) + 4);
        etbl->step  = BGM_SET;
        break;
    case BGM_SET:
        if(etbl->d0.swl > 0)break;
        gcon_x->bgm_load_no = BGM_BOS02;
        bgm_set(BGM_BOS02);
        etbl->step  = LOAD_END;
        break;
    case LOAD_END:
        ret = 1;
        break;
    }
    etbl->w0.func   = cdhn;
    etbl->d0.swl--;
    return(ret);
}
#undef  sd_adr
#undef  sq_adr
#undef  sd_size
#undef  sq_size


/*=================================================================*/
s32     demo01_set(ENM_SET_TBL *etbl){
/*=================================================================*/
    switch(Set_Step){
    case    0:          
        if(!(get_stage_fg() & STAGE_START_FG))break;
        Set_Step++;
        break;
    case    1:          
        if(SCR_NextAreaFlag){
            eset_x = enm_set_set((ENM_SET_TBL *)etbl00);
            return  -1;
        }
    }
    return  0;
}
/*============================================================================*/
/*                                                                            */
/* ---  KOTESU Stage  ------------------------------------------------------- */
/*                                                                            */
/*============================================================================*/
static  s32 kotetsu_load(ENM_SET_TBL *etbl)
{
    enum{
        LOAD_INIT,
        MODEL_LOAD_START,
        MODEL_LOAD_WAIT,
        MODEL_LOAD_END,

        CHAR_LOAD_START,
        CHAR_LOAD_WAIT,
        CHAR_LOAD_END,

        LOAD_END,
        END
    };
    s32 ret;

#ifdef SS
    GfsHn   cdhn;
#endif
#ifdef STV
    LOAD_FILE_INF   *cdhn;
#endif

    cdhn    = etbl->w0.func;

    ret = 0;
    switch(etbl->step){
    case LOAD_INIT:
        load_adr    = local_load_ram_adr;
        vram_adr    = local_load_vram_adr;
        tex_ofs     = local_load_tex_ofs;
        col_ofs     = local_load_col_ofs;

        etbl->step  = MODEL_LOAD_START;
        break;

    case MODEL_LOAD_START:
        cdhn    = model_load(CHAR_KOTETSU,load_adr);
        if(cdhn == NULL)break;
        etbl->step  = MODEL_LOAD_WAIT;
        break;
    case MODEL_LOAD_WAIT:
        if(!read_check(cdhn))break;
        model_load_end(CHAR_KOTETSU,load_adr);
        vram_adr    = model_set(CHAR_KOTETSU,vram_adr,tex_ofs,col_ofs);
        tex_ofs += ((P_HEADER *)char_tbl[CHAR_KOTETSU].header_adr)->tex_suu;
        if((char_tbl[CHAR_KOTETSU].atrb & CL_MODE) != CL16Look){
            col_ofs += ((P_HEADER *)char_tbl[CHAR_KOTETSU].header_adr)->colsize;
        }
        load_adr    = (u32)((P_HEADER *)char_tbl[CHAR_KOTETSU].header_adr)->texinf;

        model_all_hss_set (CHAR_KOTETSU,M_KOTETSU_END); 
        model_all_flat_set(CHAR_KOTETSU,M_KOTETSU_END);
        set_light_color   (22,24,28);
        set_light_ambient (10,12,14);
        set_light_angle   (+0x1000,-0x2000,-0x0000);

        etbl->step  = MODEL_LOAD_END;
        break;
    case MODEL_LOAD_END:
        etbl->step  = CHAR_LOAD_START;
        break;

    case CHAR_LOAD_START:
        cdhn    = char_load(CHAR_KOTET_E,load_adr);
        if(cdhn == NULL)break;
        etbl->step  = CHAR_LOAD_WAIT;
        break;
    case CHAR_LOAD_WAIT:
        if(!read_check(cdhn))break;
        char_load_end(CHAR_KOTET_E,load_adr);
        vram_adr    = char_set(CHAR_KOTET_E,vram_adr,tex_ofs,col_ofs);
        tex_ofs += ((S_HEADER *)char_tbl[CHAR_KOTET_E].header_adr)->tex_suu;
        col_ofs += ((S_HEADER *)char_tbl[CHAR_KOTET_E].header_adr)->colsize;
        load_adr    = (u32)((S_HEADER *)char_tbl[CHAR_KOTET_E].header_adr)->texinf;

        etbl->step  = CHAR_LOAD_END;
        break;
    case CHAR_LOAD_END:
        etbl->step  = LOAD_END;
        break;

    case LOAD_END:
        ret = 1;
        break;
    }

    etbl->w0.func   = cdhn;

    return(ret);
}

/*=================================================================*/
s32     KOTETSU_set(ENM_SET_TBL *etbl){
/*=================================================================*/
    EFT_OBJ *x;
    s8  OBJ_NO;

    switch(Set_Step){
    case    0:          /* Boss Set */
        OBJ_NO = bos10_set();
        if(OBJ_NO){
            Set_Step++;
            Set_Boss_obj_no = OBJ_NO;
        }
        break;
    case    1:          /* Boss Dead Wait */
        if(obj_x[Set_Boss_obj_no]==0){
            x = report_set( 60);
            if(x){
                Set_Step++;
                Set_Report_Adr = (u32)x;
                SCR_NextSection();
            }
        }
        break;
    case    2:          /* Next Enemies Set */
        x = (EFT_OBJ *)Set_Report_Adr;
        if(x->mode >= OBJ_M_KIE){
            Set_Step++;
            SCR_NextSection();
        }
        break;
    case    3:          /* Next Enemies Set */
        if(SCR_NextAreaFlag){
            eset_x = enm_set_set((ENM_SET_TBL *)etbl01);
            return  -1;
        }
    }
    return  0;
}

/*============================================================================*/
/*                                                                            */
/* ---  SONIC  Stage  ------------------------------------------------------- */
/*                                                                            */
/*============================================================================*/
static  s32 sonic_load(ENM_SET_TBL *etbl)
{
    enum{
        LOAD_INIT,
        MODEL_LOAD_START,
        MODEL_LOAD_WAIT,
        MODEL_LOAD_END,

        CHAR_LOAD_START,
        CHAR_LOAD_WAIT,
        CHAR_LOAD_END,

        LOAD_END,
        END
    };
    s32 ret;

#ifdef SS
    GfsHn   cdhn;
#endif
#ifdef STV
    LOAD_FILE_INF   *cdhn;
#endif

    cdhn    = etbl->w0.func;

    ret = 0;
    switch(etbl->step){
    case LOAD_INIT:
        load_adr    = local_load_ram_adr;
        vram_adr    = local_load_vram_adr;
        tex_ofs     = local_load_tex_ofs;
        col_ofs     = local_load_col_ofs;

        etbl->step  = MODEL_LOAD_START;
        break;

    case MODEL_LOAD_START:
        cdhn    = model_load(CHAR_SONIC,load_adr);
        if(cdhn == NULL)break;
        etbl->step  = MODEL_LOAD_WAIT;
        break;
    case MODEL_LOAD_WAIT:
        if(!read_check(cdhn))break;
        model_load_end(CHAR_SONIC,load_adr);
        vram_adr = model_set(CHAR_SONIC,vram_adr,tex_ofs,col_ofs);
        tex_ofs += ((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)->tex_suu;
        if((char_tbl[CHAR_SONIC].atrb & CL_MODE) != CL16Look){
            col_ofs += ((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)->colsize;
        }
        load_adr = (u32)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)->texinf;

        model_all_hss_set (CHAR_SONIC,M_SONIC_END); 
        model_all_flat_set(CHAR_SONIC,M_SONIC_END);
        set_light_color   (28,28,28);
        set_light_ambient (12,12,12);
        set_light_angle   (-0x2000,+0x2000,-0x0000);

        etbl->step  = MODEL_LOAD_END;
        break;
    case MODEL_LOAD_END:
        etbl->step  = CHAR_LOAD_START;
        break;

    case CHAR_LOAD_START:
        cdhn    = char_load(CHAR_SONIC_E,load_adr);
        if(cdhn == NULL)break;
        etbl->step  = CHAR_LOAD_WAIT;
        break;
    case CHAR_LOAD_WAIT:
        if(!read_check(cdhn))break;
        char_load_end(CHAR_SONIC_E,load_adr);
        vram_adr    = char_set(CHAR_SONIC_E,vram_adr,tex_ofs,col_ofs);
        tex_ofs += ((S_HEADER *)char_tbl[CHAR_SONIC_E].header_adr)->tex_suu;
        col_ofs += ((S_HEADER *)char_tbl[CHAR_SONIC_E].header_adr)->colsize;
        load_adr    = (u32)((S_HEADER *)char_tbl[CHAR_SONIC_E].header_adr)->texinf;

        etbl->step  = CHAR_LOAD_END;
        break;
    case CHAR_LOAD_END:
        etbl->step  = LOAD_END;
        break;

    case LOAD_END:
        ret = 1;
        break;
    }

    etbl->w0.func   = cdhn;

    return(ret);
}

/*=================================================================*/
s32     SONIC_set(ENM_SET_TBL *etbl){
/*=================================================================*/
    EFT_OBJ *x;
    s8  OBJ_NO;

    switch(Set_Step){
    case    0:          /* Scroll Wait */
        if(SCR_NextAreaFlag){
            Set_Step++;
        }
        break;
    case    1:          /* Boss Set */
        OBJ_NO = bos12_set();
        if(OBJ_NO){
            Set_Step++;
            Set_Boss_obj_no = OBJ_NO;
        }
        break;
    case    2:          /* Boss Dead Wait */
        if(obj_x[Set_Boss_obj_no]==0){
            x = report_set( 60);
            if(x){
                Set_Step++;
                Set_Report_Adr = (u32)x;
                SCR_NextSection();
            }
        }
        break;
    case    3:          /* Next Enemies Set */
        x = (EFT_OBJ *)Set_Report_Adr;
        if(x->mode >= OBJ_M_KIE){
            Set_Step++;
            SCR_NextSection();
        }
        break;
    case    4:          /* Next Enemies Set */
        if(SCR_NextAreaFlag){
            eset_x = enm_set_set((ENM_SET_TBL *)etbl02);
            return  -1;
        }
    }
    return  0;
}

/*============================================================================*/
/*                                                                            */
/* ---  NURSE  Stage  ------------------------------------------------------- */
/*