Contributor: PETE ROCCA { Does anyone got any unit/code on giving up time slice under DV or OS/2? Here they are for DOS, Windows, OS/2, DV and DoubleDos. You will need to detect the enviroment first (although none should make the system hang if it's the wrong enviroment, just be ignored) The key to good idle release is finding the right spots to put them. I have gotten my door making unit that I created to about 97% idle during pauses and 93% idle while waiting for keyboard input (with no delay in response - much better than the typical 12% idle pauses and 8% idle keyboard waits) Here is how... } Procedure Sleep(Seconds: Word); Var H,M,S,T,Last: Word; Begin If Seconds = 0 Then Exit; If Seconds > 999 Then Seconds := Seconds DIV 1000; {incase of caller is thinking milliseconds} GetTime(H,M,Last,T); Repeat Repeat GetTime(H,M,S,T); TimerSlice; TimerSlice; Until S <> Last; Last := S; Dec(Seconds); Until Seconds = 0; End; Function GetChar: Char; Var Counter, Span: Byte; Done: Boolean; Begin Span := 0; Done := False; Repeat Inc(Counter); If Counter > Span Then Begin Counter := 0; If IsChar Then Done := True Else If Span < 50 Then Inc(Span); End Else TimerSlice; Until Done; If KeyPressedExtended Then GetChar := Readkey Else GetChar := RxChar; End; Procedure TimerSlice; Begin Case SystemEnviroment Of DOS4:; DOS5, WINDOWS, OS2: Asm MOV AX,$1680 INT $2F End; DV: Asm MOV AX,$1000 INT $15 End; DOUBLEDOS: Asm MOV AX,$EE01 INT $21 End; End; End;