int xfer(uint32_t *data_) { uint32_t data = *data_; int i; //WAIT_WITH_TIMEOUT(!(GBA_IN&(1<<MISO_BIT)), 25600, goto error); cli(); RESET_TIMER(); for (i=0;i<32;i++) { GBA_OUT &= ~((1<<CLK_BIT) | (1<<MOSI_BIT)); GBA_OUT |= ((data>>31)&1)<<MOSI_BIT; WAIT_TIMER(); GBA_OUT |= (1<<CLK_BIT); data<<=1; data |= (GBA_IN>>MISO_BIT)&1; WAIT_TIMER(); } sei(); *data_ = data; return 0; error: return -1; }
/* 画像の表示 */ void TeamLogo::Process() { switch( mStatus){ case FADEIN: mAlpha += 0.02f; if( mAlpha >= 1.0f ){ mAlpha = 1.0f; mStatus = WAIT; //SE //GAMECONTROL->GetSoundController()->PlaySE("audio\\se\\se_team_rogo.wav"); } break; case WAIT: WAIT_TIMER(mTimer, 3.0f) mStatus = FADEOUT; WAIT_END break; case FADEOUT: mAlpha -= 0.02f; if( mAlpha <= 0.0f ){ mAlpha = 0.0f; if( GAMECONTROL->GetFader()->FadeOut() ) STAGE_CLEAR; } break; } // 描画 DX_DRAWALPHA("graphics\\screen\\team_logo.png", 120, 220, 0, 0, 560, 160, mAlpha); }
static void wd_proc(void) { static byte am[6]; byte i_met; word stat = 0; static /*PROGMEM */void * entries[] = { ADDR(t0), ADDR(t0_cmd), ADDR(t1), ADDR(t1_set), ADDR(t1_trkupd), ADDR(t1_trk0), ADDR(t1_step), ADDR(t1_waits), ADDR(t1_vrfy), ADDR(t1_waitd), ADDR(t1_hlt), ADDR(t1_rdam), ADDR(t2), ADDR(t2_waitd), ADDR(t2_hlt), ADDR(t2_loop), ADDR(t2_amc), ADDR(t2_rd), ADDR(t2_rdblk), ADDR(t2_mchk), ADDR(t2_wr), ADDR(t3), ADDR(t3_wait), ADDR(t3_hlt), ADDR(t3_rdam), ADDR(t4), ADDR(reset), ADDR(done) }; goto *entries[wd.state]; /***************/ ENTRY(t0); /***************/ WAIT(); /***************/ ENTRY(t0_cmd); /***************/ WD_TRACE(("wd: t0_cmd: %s, cr=0x%02x\n", wd_command_decode(wd.cr), wd.cr)); if ((wd.cr & TYPEIV_MASK) == TYPEIV) { BDI_ResetWrite(); BDI_ResetRead( 0 ); if ((wd.cr & INTR_MASK) != 0) { wd.ready = fdc_query(FDC_READY); SET_TIMERU( 64 ); JUMP(t4); } if (!WD_BUSY()) { wd.cr_c = 0; } WD_TRACE(("wd: clr busy signal (#1)\n")); WD_CLR_BUSY(); JUMP(t0); } else if ((wd.cr & TYPEI_MASK) == TYPEI) { wd.cr_c = wd.cr; wd.str &= ~(WD17XX_STAT_CRCERR|WD17XX_STAT_SEEKERR); fdc_set(FDC_HLD, (wd.cr_c & TYPEI_BIT_H) != 0); JUMP(t1); } else { wd.cr_c = wd.cr; wd.str &= ~(WD17XX_STAT_RECTYPE|WD17XX_STAT_WRERR|WD17XX_STAT_CRCERR|WD17XX_STAT_LOST|WD17XX_STAT_WP|WD17XX_STAT_NOTFOUND); if (!fdc_query(FDC_READY)) { JUMP(done); } fdc_set(FDC_HLD, 1); if ((wd.cr_c & TYPEII_MASK) == TYPEII) { JUMP(t2); } else { if ((wd.cr_c & TYPEIII_AM_MASK) != TYPEIII_AM) { wd.str |= WD17XX_STAT_WP; JUMP(done); } JUMP(t3); } } WAIT(); //========================================================= // type 1 //========================================================= /***************/ ENTRY(t1); /***************/ WD_TRACE(("wd: t1: dr=%x, hld=%u\n", wd.dr, fdc_query(FDC_HLD))); if ((wd.cr_c & TYPEI_STEP_MASK) != 0) { if ((wd.cr_c & TYPEI_STEPWD_MASK) == TYPEI_STEPWD) { fdc_set(FDC_SDIR, (wd.cr_c & TYPEI_SDIR_MASK) == 0); } if ((wd.cr_c & TYPEI_BIT_U)) { JUMP(t1_trkupd); } else { JUMP(t1_step); } } else { if ((wd.cr_c & TYPEI_SEEK_MASK) != TYPEI_SEEK) { // restore wd.tr = 0xff; wd.dr = 0; } } /***************/ ENTRY(t1_set); /***************/ WD_TRACE(("wd: t1_set, time=%s\n", ticks_str(get_ticks()))); wd.dsr = wd.dr; if (wd.dsr == wd.tr) { JUMP(t1_vrfy); } fdc_set(FDC_SDIR, wd.dsr > wd.tr); /***************/ ENTRY(t1_trkupd); /***************/ WD_TRACE(("wd: t1_trkupd, sdir=%u, tr=%u, time=%s\n", fdc_query(FDC_SDIR), wd.tr, ticks_str(get_ticks()))); if (fdc_query(FDC_SDIR)) { wd.tr += 1; } else { wd.tr -= 1; } /***************/ ENTRY(t1_trk0); /***************/ WD_TRACE(("wd: t1_trk0, sdir=%u, time=%s\n", fdc_query(FDC_SDIR), ticks_str(get_ticks()))); if (!fdc_query(FDC_TRK0) && !fdc_query(FDC_SDIR)) { WD_TRACE(("wd: t1_trk0: trk0\n")); wd.tr = 0; JUMP(t1_vrfy); } else { fdc_set(FDC_STEP, 1); SET_TIMERU(WD_STEP_INTERVAL); } /***************/ ENTRY(t1_step); /***************/ WDH_TRACE(("wd: t1_step time=%s\n", ticks_str(get_ticks()))); WAIT_TIMER(); fdc_set(FDC_STEP, 0); SET_TIMER(wd_step_rate(wd.cr_c & TYPEI_BIT_R)); /***************/ ENTRY(t1_waits); /***************/ WDH_TRACE(("wd: t1_waits time=%s\n", ticks_str(get_ticks()))); // delay according to r1,r0 field WAIT_TIMER(); if ((wd.cr_c & 0xe0) == 0) { JUMP(t1_set); } /***************/ ENTRY(t1_vrfy); /***************/ WD_TRACE(("wd: t1_vrfy time=%s\n", ticks_str(get_ticks()))); // is V = 1? if ((wd.cr_c & TYPEI_BIT_V) == 0) { JUMP(done); } // set hld fdc_set(FDC_HLD, 1); // setup delay SET_TIMER(DATA_DELAY); /***************/ ENTRY(t1_waitd); /***************/ WDH_TRACE(("wd: t1_waitd time=%s\n", ticks_str(get_ticks()))); // has 15 ms expired WAIT_TIMER(); /***************/ ENTRY(t1_hlt); /***************/ WD_TRACE(("wd: t1_hlt time=%s\n", ticks_str(get_ticks()))); // is hlt = 1 if (!wd_is_hld()) { WAIT(); } wd.icnt = 0; /***************/ ENTRY(t1_rdam); /***************/ WD_TRACE(("wd: t1_rdam, icnt=%u, time=%s\n", wd.icnt, ticks_str(get_ticks()))); if (wd.icnt >= 6) { wd.str |= WD17XX_STAT_SEEKERR; JUMP(done); } stat = floppy_stat(); if ((stat & FLP_STAT_AM) == 0) { WAIT(); } if (wd_rd_am(am)) { if (wd.tr == am[0]) { JUMP(done); } } WAIT(); //========================================================= // type 2 //========================================================= /***************/ ENTRY(t2); /***************/ WD_TRACE(("wd: t2 tr=%u, sr=%u, side=%u, cr=%x, time=%s\n", wd.tr, wd.sr, wd.cr_c & TYPEII_BIT_S ? 1 : 0, wd.cr_c, ticks_str(get_ticks()))); floppy_set_sec_id(wd.sr); if ((wd.cr_c & TYPEII_BIT_E) == 0) { JUMP(t2_hlt); } SET_TIMER(DATA_DELAY); /***************/ ENTRY(t2_waitd); /***************/ WDH_TRACE(("wd: t2_waitd time=%s\n", ticks_str(get_ticks()))); WAIT_TIMER(); /***************/ ENTRY(t2_hlt); /***************/ WD_TRACE(("wd: t2_hlt time=%s\n", ticks_str(get_ticks()))); if (!wd_is_hld()) { WAIT(); } // TG43 /***************/ ENTRY(t2_loop); /***************/ WD_TRACE(("wd: t2_loop time=%s\n", ticks_str(get_ticks()))); if ((wd.cr_c & TYPEII_WR_MASK) == TYPEII_WR) { if (fdc_query(FDC_WP)) { WD_TRACE(("wd: t2_loop disk is wp\n")); wd.str |= WD17XX_STAT_WP; JUMP(done); } } wd.icnt = 0; /***************/ ENTRY(t2_amc); /***************/ if (wd.icnt >= 6) { wd.str |= WD17XX_STAT_NOTFOUND; JUMP(done); } stat = floppy_stat(); if ((stat & FLP_STAT_AM) == 0) { WAIT(); } if (!wd_rd_am(am)) { JUMP(done); } WD_TRACE(("wd: t2_amc, sz=%u (trk,side,sec) dsk(%u,%u,%u) wd(%u,%u,%u) time=%s\n", am[3], am[0], am[1], am[2], wd.tr, wd.cr_c & TYPEII_BIT_S ? 1 : 0, wd.sr, ticks_str(get_ticks()))); if (wd.tr != am[0]) { if( floppy_fast_mode ) { wd.str |= WD17XX_STAT_NOTFOUND; JUMP(done); } else WAIT(); } if (wd.sr != am[2]) { WAIT(); } // 1795 - other operation if ( (wd.cr_c & TYPEII_BIT_C) != 0 ) { byte side = ( wd.cr_c & TYPEII_BIT_S ) != 0 ? 0 : 1; if ( side == am[1] ) { WAIT(); } } wd.dcnt = wd_sect_size(am[3]); BDI_ResetWrite(); SET_TIMER_DCNT( wd.dcnt ); if ((wd.cr_c & TYPEII_WR_MASK) == TYPEII_WR) { BDI_ResetRead( wd.dcnt - 1 ); WD_TRACE(("wd: t2_amc, SET_DRQ() time=%s\n", ticks_str(get_ticks()))); WD_SET_DRQ(); JUMP(t2_wr); } /***************/ ENTRY(t2_rd); /***************/ WD_TRACE(("wd: t2_rd time=%s\n", ticks_str(get_ticks()))); stat = floppy_stat(); if ((stat & FLP_STAT_AM) != 0) { wd.str |= WD17XX_STAT_NOTFOUND; JUMP(done); } // put record type in status reg bit 5 if ((stat & FLP_STAT_DEL) != 0) { wd.str |= WD17XX_STAT_RECTYPE; // 1 = deleted record, 0 - normal record } else { wd.str &= ~WD17XX_STAT_RECTYPE; // 1 = deleted record, 0 - normal record } /***************/ ENTRY(t2_rdblk); /***************/ WDH_TRACE(("wd: t2_rdblk dcnt=%u, time=%s\n", wd.dcnt, ticks_str(get_ticks()))); while( wd.dcnt > 1 ) { wd_floppy_read(); BDI_Write( wd.dsr ); wd.dcnt--; } // has first byte been assembled in dsr if (!WD_DRQ()) { t2_rd_common: if (wd.dcnt == 0) { stat = floppy_stat(); if( ( stat & FLP_STAT_ERR ) != 0 ) wd.str |= WD17XX_STAT_CRCERR; if( ( wd.str & WD17XX_STAT_CRCERR ) != 0 ) JUMP(done); JUMP(t2_mchk); } wd_floppy_read(); wd.dr = wd.dsr; wd.dcnt -= 1; WD_SET_DRQ(); } else { if (TIMER_EXP()) { WD_TRACE(("wd: t2_rdblk - set LOST, time=%s (byte time=%s, drq time=%s)\n", ticks_str(get_ticks()), ticks_str1(wd.delta_time), ticks_str2(wd.start_time))); //__TRACE( "wd: t2_rdblk - set LOST\n" ); wd.str |= WD17XX_STAT_LOST; wd.str |= WD17XX_STAT_CRCERR; BDI_ResetWrite(); goto t2_rd_common; } } WAIT(); /***************/ ENTRY(t2_mchk); /***************/ WD_TRACE(("wd: t2_mchk wdstat=%x, flp_stat=%x, time=%s\n", wd.str, stat, ticks_str(get_ticks()))); if ((wd.cr_c & TYPEII_BIT_M) != 0) { wd.sr += 1; JUMP(t2_loop); } WD_TRACE(("wd: end of read\n")); JUMP(done); /***************/ ENTRY(t2_wr); /***************/ WDH_TRACE(("wd: t2_wr dcnt=%u, time=%s\n", wd.dcnt, ticks_str(get_ticks()))); while( BDI_Read( &wd.dsr ) ) { wd_floppy_write(); wd.dcnt--; } if (!WD_DRQ()) { wd.dsr = wd.dr; t2_wr_common: wd_floppy_write(); wd.dcnt -= 1; if (wd.dcnt == 0) { stat = floppy_stat(); if( ( stat & FLP_STAT_ERR ) != 0 ) wd.str |= WD17XX_STAT_CRCERR; if( ( wd.str & WD17XX_STAT_CRCERR ) != 0 ) JUMP(done); JUMP(t2_mchk); } WD_SET_DRQ(); } else { if (TIMER_EXP()) { WD_TRACE(("wd: t2_wr - set LOST, time=%s (byte time=%s, drq time=%s)\n", ticks_str(get_ticks()), ticks_str1(wd.delta_time), ticks_str2(wd.start_time))); //__TRACE( "wd: t2_wr - set LOST\n" ); BDI_ResetRead(0); wd.str |= WD17XX_STAT_LOST; wd.str |= WD17XX_STAT_CRCERR; wd.dsr = 0; goto t2_wr_common; } } WAIT(); //========================================================= // type 3 //========================================================= /***************/ ENTRY(t3); /***************/ WD_TRACE(("wd: t3 time=%s\n", ticks_str(get_ticks()))); if ((wd.cr_c & TYPEIII_BIT_E) == 0) { JUMP(t3_hlt); } SET_TIMER(DATA_DELAY); /***************/ ENTRY(t3_wait); /***************/ WDH_TRACE(("wd: t3_wait time=%s\n", ticks_str(get_ticks()))); WAIT_TIMER(); /***************/ ENTRY(t3_hlt); /***************/ WD_TRACE(("wd: t3_hlt time=%s\n", ticks_str(get_ticks()))); if (!wd_is_hld()) { WAIT(); } wd.icnt = 0; wd.dcnt = 6; wd_crc_init(); BDI_ResetWrite(); /***************/ ENTRY(t3_rdam); /***************/ WDH_TRACE(("wd: t3_rdam time=%s\n", ticks_str(get_ticks()))); if (wd.icnt >= 6) { wd.str |= WD17XX_STAT_NOTFOUND; JUMP(done); } if (wd.dcnt == 6) { stat = floppy_stat(); if ((stat & FLP_STAT_AM) == 0) { WAIT(); } } while( wd.dcnt > 1 ) { wd_floppy_read(); BDI_Write( wd.dsr ); wd.dcnt--; } if (!WD_DRQ()) { if (wd.dcnt == 0) { WD_TRACE(("wd: rd_am, crc=0x%04x\n", wd.crc)); WD_TRACE(("wd: rd_am (%u,%u,%u,%u), crc=0x%02x%02x\n", am[5], am[4], am[3], am[2], am[1], am[0])); if (wd.crc != 0) { wd.str |= WD17XX_STAT_CRCERR; } JUMP(done); } wd_floppy_read(); wd.dr = wd.dsr; wd.dcnt -= 1; #if defined(DEBUG) && DEBUG am[wd.dcnt] = wd.dsr; #endif if (wd.dcnt == 5) { wd.sr = wd.dsr; } WD_SET_DRQ(); } WAIT(); //========================================================= // type 4 //========================================================= /***************/ ENTRY(t4); /***************/ WAIT_TIMER(); i_met = INTR_MASK_I3; if (wd.ready != fdc_query(FDC_READY)) { i_met |= wd.ready ? INTR_MASK_I1 : INTR_MASK_I0; wd.ready = !wd.ready; } if (wd.index) { i_met |= INTR_MASK_I2; } if ((i_met & wd.cr & INTR_MASK) == 0) { WAIT(); } JUMP(done); /***************/ ENTRY(reset); /***************/ WAIT(); /***************/ ENTRY(done); /***************/ fdc_set(FDC_STEP, 0); WD_TRACE(("wd: clr busy signal (#2)\n\n")); WD_CLR_BUSY(); //WD_CLR_DRQ(); WD_SET_INT(); STATE(t0); }
void KariudoKen::_Move() { SetAnim( mStatus ); // 自機の位置を取得 int jx = GAMECONTROL->GetJiki()->GetAtHtPointX(); int jy = GAMECONTROL->GetJiki()->GetAtHtPointY(); // ----当たりの処理 MapAtHt(); if( mStatus != SHINDA ) Ataridp(); switch( mStatus ){ case ARUKI: { // ----自機の位置を確認 float sax = jx - CenterX(); float say = jy - CenterY(); float sa = sqrt(sax*sax + say*say); if( sa < KARIKENKGHANI ){ mStatus = WAIT1; } break; } case WAIT1: mSpX = 0; WAIT_TIMER(mKgTimer, KARIKENWTM1); mStatus = KOGEKI; WAIT_END break; case KOGEKI: if( mAniNoX == 2 && !mSeFl ){//SE //SE if( !IsGamenGai() ) GAMECONTROL->GetSoundController()->PlaySE("audio\\se\\se_ken_atack.wav"); mSeFl = true; } mSpX = 0; mMuki = CenterX() < jx; if( mDousaEnd ){ mStatus = WAIT2; mSeFl = false; } break; case WAIT2: mSpX = 0; WAIT_TIMER(mKgTimer, KARIKENWTM2); mStatus = ARUKI; WAIT_END break; } Draw(); mSpX += mAccX; mSpY += mAccY; mX += mSpX + mAshibaSpX; mY += mSpY; // 当たり判定のフレーム if( mStatus != SHINDA ) HtFrame(); }
void CurtainRollScr::UpdateStage() { switch( mStage ){ // フェードイン case FADING: if( GAMECONTROL->GetFader()->FadeIn() ){ //幕をあげる GAMECONTROL->GetMaku()->Open(); mStage = OPENING; } break; // 幕アップ case OPENING: if( GAMECONTROL->GetMaku()->IsOpen() ){ mStage = WAIT1SEC; } break; // 1秒待機 case WAIT1SEC: WAIT_TIMER(mTimer, 1.0f) GAMECONTROL->GetTxtGraphicController()->ShowWithAlphaFade( TxtGraphicController::CENTER, GI("THANKSSX"), GI("THANKSSY"), "graphics\\screen\\thank_you.png", 3.0f, 0.05f ); mStage = THANKSPLAYING; WAIT_END break; // サンキュー case THANKSPLAYING: if( GAMECONTROL->GetTxtGraphicController()->IsFinished() ) mStage = WAIT1SECMORE; break; // さらに1秒待機 case WAIT1SECMORE: WAIT_TIMER(mTimer, 1.0f) mStage = HEROINE_ENTERING; heroine->SetPos(500-GI("HERSIZE"), GI("FLOORY") - GI("HERSIZE")); heroine->GetAnimationSet()->SetCurAnimation(HERAN_WALK); heroine->SetSp( GF("SPWALK"), 0 ); GAMECONTROL->GetMobManager()->Request( heroine, true ); WAIT_END break; // ヒロイン登場 case HEROINE_ENTERING: if( heroine->GetX() >= 500+170-GI("HERSIZE") ){ heroine->SetSp(0,0); heroine->GetAnimationSet()->SetCurAnimation(HERAN_STOP); mStage = HEROINE_STOP1SEC; } break; // ヒロイン停止 case HEROINE_STOP1SEC: WAIT_TIMER(mTimer, 1.0f) mStage = HEROINE_ATTACK; heroine->GetAnimationSet()->SetCurAnimation(HERAN_ATT); heroine->SetSp( GF("SPWALK"), 0 ) ; heroine->SetAcc( GF("ACCKOGEKI") / SP->FRAMERATE, 0 ); GAMECONTROL->GetSoundController()->LoopSE("audio\\se\\se_hiroin_tijoukougeki.wav"); WAIT_END break; // ヒロイン攻撃 case HEROINE_ATTACK: // 敵に当たったら敵が死ぬ for(int i=0; i<7; i++){ if( actors[i]->IsJikiColliding() && actors[i]->GetAnimationSet()->GetCurAnimationIdx() == TEKI_STAND ){ actors[i]->GetAnimationSet()->SetCurAnimation( TEKI_DIE ); actors[i]->SetSp( GF("SHINIPATT_SPX"), -GF("SHINIPATT_SHOSP") ); actors[i]->SetAcc( 0, SP->GRAVITY ); GAMECONTROL->GetSoundController()->PlaySE("audio\\se\\se_kougekimeityuu.wav"); } } // 到着 if( heroine->GetX() >= 500+740-GI("HERSIZE") && heroine->GetAnimationSet()->GetCurAnimation()->GetCurFrameIdx() == 3) { heroine->SetSp(0,0); heroine->SetAcc(0,0); heroine->GetAnimationSet()->SetCurAnimation(HERAN_ATTEND); mStage = HEROINE_ATTACKEND; GAMECONTROL->GetSoundController()->StopSE("audio\\se\\se_hiroin_tijoukougeki.wav"); } break; // 攻撃終了動作 case HEROINE_ATTACKEND: if( heroine->GetAnimationSet()->GetCurAnimation()->GetLoopCount() == 1 ){ heroine->GetAnimationSet()->SetCurAnimation(HERAN_STOP); mStage = HEROINE_STOP1SECMORE; } break; // さらに1秒停止 case HEROINE_STOP1SECMORE: WAIT_TIMER(mTimer, 1.0f) mStage = SEEYOUAGAIN; GAMECONTROL->GetTxtGraphicController()->ShowWithAlphaFade( TxtGraphicController::CENTER, GI("SEEYOUSX"), GI("SEEYOUSY"), "graphics\\screen\\see_you_again.png", 3.0f, 0.05f ); WAIT_END break; // また遊んでね case SEEYOUAGAIN: if( GAMECONTROL->GetTxtGraphicController()->IsFinished() ){ mStage = CLOSINGANDFADINGOUT; GAMECONTROL->GetMaku()->Close(); } break; // バイバイ case CLOSINGANDFADINGOUT: if( GAMECONTROL->GetMaku()->IsClosed() ){ if( GAMECONTROL->GetFader()->FadeOut() ){ GAMECONTROL->GetSoundController()->ResetBGMs(); GAMECONTROL->GetStageManager()->GoToStage(1); } } break; } }