static void SDL_SetTimerSpeed(void) { word rate; //void interrupt (*isr)(void); // PORT interrupts not available if ((DigiMode == sds_PC) && DigiPlaying) { rate = TickBase * 100; //isr = SDL_t0ExtremeAsmService; // PORT } else if ( (MusicMode == smm_AdLib) || ((DigiMode == sds_SoundSource) && DigiPlaying) ) { rate = TickBase * 10; //isr = SDL_t0FastAsmService; // PORT } else { rate = TickBase * 2; //isr = SDL_t0SlowAsmService; // PORT } if (rate != TimerRate) { //setvect(8,isr); // PORT SDL_SetIntsPerSec(rate); TimerRate = rate; } }
/////////////////////////////////////////////////////////////////////////// // // SDL_InitDelay() - Sets up TimerDelay's for SDL_Delay() // /////////////////////////////////////////////////////////////////////////// static void SDL_InitDelay(void) { id0_int_t i; id0_word_t timer,speed; setvect(8,SDL_TimingService); // Set to my timer 0 ISR SDL_SetIntsPerSec(1000); // Time 1ms for (i = 0,timer = 0;i < 10;i++) // Do timing test 10 times { asm xor dx,dx // Zero DX asm mov cx,0xffff // Put starting value in CX asm mov [TimerDone],cx // TimerDone = false - 1 startloop: asm or [TimerDone],0 asm jnz startloop // Make sure we're at the start loop: asm test [TimerDone],1 // See if TimerDone flag got hit asm jnz done // Yep - drop out of the loop asm loop loop done: if (0xffff - TimerVal > timer) timer = 0xffff - TimerVal; } timer += timer / 2; // Use some slop TimerDelay10 = timer / (1000 / 10); TimerDelay25 = timer / (1000 / 25); TimerDelay100 = timer / (1000 / 100); SDL_SetTimer0(0); // Reset timer 0 setvect(8,t0OldService); // Set back to old ISR }