__myevic__ void Plantouille( int xpsr, int* stack ) { int i, k; k = 0; SYS_UnlockReg(); WDT_Close(); SYS_LockReg(); InitDisplay(); while ( 1 ) { ClearScreenBuffer(); DrawImage( 0, 0, 'X'+0x27 ); DrawHexLong( 16, 0, xpsr, 0 ); DrawHexDigit( 0, 16, k ); for ( i = 0; i < 14 ; ++i ) { DrawHexLong( 16, 16+i*8, stack[i+k*14], 0 ); } DisplayRefresh(); while ( !PE0 || !PD2 || !PD3 ) CLK_SysTickDelay( 10000 ); while ( PE0 && PD2 && PD3 ) CLK_SysTickDelay( 10000 ); if ( !PE0 ) { SYS_UnlockReg(); SYS_ResetChip(); while ( 1 ) ; } if ( !PD2 ) ++k; if ( !PD3 ) --k; if ( k < 0 ) k = 0; else if ( k > 15 ) k = 15; } }
__myevic__ void GameIClick() { UpdateDataFlash(); if ( dfFBSpeed <= 2 ) { gFlags.playing_fb = 1; Screen = 0; gFlags.user_idle = 1; gFlags.refresh_display = 1; BatRefreshTmr = 0; SleepTimer = 3000; fbInitTimeouts(); ClearScreenBuffer(); DisplayRefresh(); fbBirdAnim( 24 ); fbCreateTimeout( fbStartScreen + 1 ); } }
__myevic__ void DrawScreen() { if ( Screen == 2 && FireDuration && FireDuration != CurrentFD ) { CurrentFD = FireDuration; ScreenDuration = 1; ShowFDTimer = 0; gFlags.refresh_display = 1; } if ( gFlags.refresh_display ) { gFlags.refresh_display = 0; ClearScreenBuffer(); switch ( Screen ) { case 0: // Black break; case 1: // Main view case 3: // Main view (?) case 4: // (unused?) ShowMainView(); break; case 2: // Firing if ( !dfStealthOn ) { ShowMainView(); } break; case 5: // Black w/ Battery ShowBatCharging(); break; case 20: // No Atomizer Found ShowNoAtoFound(); break; case 21: // Atomizer Short ShowAtoShort(); break; case 22: // Atomizer Low ShowAtoLow(); break; case 23: // 10s Protection Show10sProtec(); break; case 24: // Battery Low ShowBatLow(); break; case 25: // Battery Low Lock ShowBatLowLock(); break; case 28: // Key Lock ShowKeyLock(); break; case 29: // Device too hot ShowDevTooHot(); break; case 31: // Key UnLock ShowKeyUnLock(); break; case 37: // Board Temp ShowBoardTemp(); break; case 40: // Stealth ON/OFF ShowStealthMode(); break; case 41: // Ti ON/OFF ShowTiOnOff(); break; case 50: // FW Version ShowVersion(); break; case 51: // New Coil ShowNewCoil(); break; case 54: // Battery Voltage ShowBattVolts(); break; case 59: // TCR Set Menu ShowTCRSet(); break; case 82: // LOGO Menu ShowLOGOMenu(); break; case 83: // Game Menu ShowGameMenu(); break; case 100: ShowInfos(); break; case 101: ShowContrast(); break; case 102: ShowMenus(); break; case 103: ShowRTCSpeed(); break; case 104: ShowRTCAdjust(); break; default: break; } if ( myDbgFlag & 1 ) { int nd = (Screen<100?Screen<10?1:2:3); DrawValue( 64-6*nd, 120, Screen, 0, 0x01, nd ); DrawValue( 0, 120, ScreenDuration, 0, 0x01, 0 ); } DisplayRefresh(); } if (( gFlags.firing ) && ISMODETC(dfMode)) { ShowFDTimer += 5; } else { ShowFDTimer += 1; } if ( ShowFDTimer < 10 ) return; ShowFDTimer = 0; if ( ScreenDuration && --ScreenDuration ) return; switch ( Screen ) { case 0: // Black if ( dfStatus.off ) { SleepTimer = 0; } break; case 2: // Firing if ( dfStealthOn ) { gFlags.refresh_display = 1; if ( !(gFlags.battery_charging) ) { Screen = 0; SleepTimer = 18000; } else { Screen = 5; } } else { MainView(); } break; case 5: // Black w/ Battery break; case 20: // No Atomizer Found case 21: // Atomizer Short MainView(); break; case 22: // Atomizer Low case 23: // 10s Protection case 24: // Battery Low case 25: // Battery Low Lock break; case 29: // Device too hot MainView(); break; case 101: // Contrast Menu case 102: // Menus case 103: // RTC Speed gFlags.edit_capture_evt = 0; // NOBREAK case 59: // TCR Set Menu case 82: // LOGO Menu case 83: // Game Menu UpdateDataFlash(); // NOBREAK case 1: // Main view case 28: // Key Lock case 31: // Key UnLock case 37: // Board Temp case 40: // Stealth ON/OFF case 41: // Ti ON/OFF case 54: // Battery Voltage case 100: // Ferox's page case 104: // Adjust Clock if ( !dfScreenSave ) { if ( Screen != 1 ) MainView(); break; } if ( !(gFlags.battery_charging) ) { gFlags.refresh_display = 1; Screen = 0; SleepTimer = 18000; } else { Screen = 5; } break; case 50: // FW Version break; case 51: // New Coil MainView(); break; default: break; } return; }
//========================================================================= // Additional initialisations //------------------------------------------------------------------------- __myevic__ void CustomStartup() { //------------------------------------------------------------------------- // EADC test if ( 0 ) { uint32_t s1, s2, s3; SetADCState( 0, 1 ); SetADCState( 4, 1 ); do { ClearScreenBuffer(); CLK_SysTickDelay( 10 ); s3 = ADC_Read( 4 ); CLK_SysTickDelay( 10 ); s1 = ADC_Read( 18 ); CLK_SysTickDelay( 10 ); s2 = ADC_Read( 0 ); DrawValue( 8, 0, s1, 0, 0x29, 4 ); DrawValue( 8, 20, s2, 0, 0x29, 4 ); DrawValue( 8, 40, s3, 0, 0x29, 4 ); DisplayRefresh(); WaitOnTMR2( 1000 ); } while ( PD3 ); } //------------------------------------------------------------------------- // Timer test 1 if ( 0 ) { TIMER_Stop( TIMER3 ); TIMER_Close( TIMER3 ); MemClear( gPlayfield.uc, 256 ); CLK_SetModuleClock( TMR3_MODULE, CLK_CLKSEL1_TMR3SEL_LIRC, 0 ); gPlayfield.ul[1] = TIMER_Open( TIMER3, TIMER_PERIODIC_MODE, 10 ); TIMER_EnableInt( TIMER3 ); TIMER_Start( TIMER3 ); } //------------------------------------------------------------------------- // Timer test 2 if ( 0 ) { TIMER_Close( TIMER2 ); TIMER_Close( TIMER3 ); MemClear( gPlayfield.uc, 256 ); CLK_SetModuleClock( TMR2_MODULE, CLK_CLKSEL1_TMR2SEL_HXT, 0 ); CLK_SetModuleClock( TMR3_MODULE, CLK_CLKSEL1_TMR3SEL_LIRC, 0 ); CLK_EnableModuleClock( TMR2_MODULE ); CLK_EnableModuleClock( TMR3_MODULE ); __set_PRIMASK(1); TIMER3->CTL |= TIMER_CTL_RSTCNT_Msk; TIMER2->CTL |= TIMER_CTL_RSTCNT_Msk; TIMER3->CMP = 1000; TIMER3->CTL = TIMER_CTL_CNTEN_Msk | TIMER_ONESHOT_MODE; TIMER2->CTL = TIMER_CTL_CNTEN_Msk | TIMER_CONTINUOUS_MODE; while(!(TIMER3->INTSTS & TIMER_INTSTS_TIF_Msk)); TIMER2->CTL = 0; gPlayfield.ul[0] = TIMER2->CNT; __set_PRIMASK(0); TIMER_Close( TIMER2 ); TIMER_Close( TIMER3 ); CLK_SetModuleClock( TMR2_MODULE, CLK_CLKSEL1_TMR2SEL_HIRC, 0 ); CLK_EnableModuleClock( TMR2_MODULE ); TIMER_Open( TIMER2, TIMER_PERIODIC_MODE, 1000 ); TIMER_EnableInt( TIMER2 ); TIMER_Start( TIMER2 ); CLK_SetModuleClock( TMR3_MODULE, CLK_CLKSEL1_TMR3SEL_HXT, 0 ); CLK_EnableModuleClock( TMR3_MODULE ); TIMER_Open( TIMER3, TIMER_PERIODIC_MODE, 10 ); TIMER_EnableInt( TIMER3 ); TIMER_Start( TIMER3 ); } return; }
void __fastcall run_game_loop(int uMsg) { //int v3; // eax bool v5; // zf //int v6; // eax signed int v7; // [esp+8h] [ebp-24h] LRESULT (__stdcall *saveProc)(HWND, UINT, WPARAM, LPARAM); // [esp+Ch] [ebp-20h] struct tagMSG msg; // [esp+10h] [ebp-1Ch] nthread_ignore_mutex(1); start_game(uMsg); saveProc = SetWindowProc(GM_Game); control_update_life_mana(); msg_process_net_packets(); gbRunGame = 1; gbProcessPlayers = 1; gbRunGameResult = 1; drawpanflag = 255; DrawAndBlit(); PaletteFadeIn(8); drawpanflag = 255; gbGameLoopStartup = 1; nthread_ignore_mutex(0); while ( gbRunGame ) { diablo_color_cyc_logic(); if ( PeekMessageA(&msg, NULL, 0, 0, PM_NOREMOVE) ) { SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL); while ( PeekMessageA(&msg, NULL, 0, 0, PM_REMOVE) ) { if ( msg.message == WM_QUIT ) { gbRunGameResult = 0; gbRunGame = 0; break; } TranslateMessage(&msg); DispatchMessageA(&msg); } if ( !gbRunGame || (v7 = 1, !nthread_has_500ms_passed()) ) v7 = 0; SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL); v5 = v7 == 0; } else { //_LOBYTE(v6) = nthread_has_500ms_passed(); v5 = nthread_has_500ms_passed() == 0; } if ( !v5 ) { multi_process_network_packets(); game_loop(gbGameLoopStartup); msgcmd_send_chat(); gbGameLoopStartup = 0; DrawAndBlit(); } #ifdef SLEEP Sleep(1); #endif } if ( (unsigned char)gbMaxPlayers > 1u ) pfile_write_hero(); pfile_flush_W(); PaletteFadeOut(8); SetCursor(0); ClearScreenBuffer(); drawpanflag = 255; scrollrt_draw_game_screen(1); SetWindowProc(saveProc); free_game(); if ( cineflag ) { cineflag = 0; DoEnding(); } }