[Back to TIMING SWAG index] [Back to Main SWAG index] [Original]
{
DAVID DAHL
I never posted it as a Unit. I just posted a couple routines to set the
timer. They're actually a part of another, larger project I've been working
on to play digitized Sound out of several different output devices. When I
was asked if it were possible to speed up the tick and still have Dos's timer
Function behave normally, I threw them into a Unit and wrote the Program you
quoted from to illustrate how it would be done. Here are the timer routines
as a Unit:
The routines perform no error checking on input values, so be careful
with them. The Procedure Set8253Channel should never have a
channel value of more than 2 since the 8253 only has 3 channels
(0 - 2).
}
Unit C8253;
(* PUBLIC DOMAIN *)
Interface
Procedure SetPlaySpeed(Speed : LongInt);
Procedure SetDefaultTimerSpeed;
Procedure Set8253Channel(ChannelNumber : Byte; ProgramValue : Word);
Implementation
Const
C8253ModeControl = $43;
C8253OperatingFreq = 1193180;
C8253Channel : Array [0..2] of Byte = ($40, $41, $42);
{=[ 8253 Timer Programming Routines ]=====================================}
Procedure Set8253Channel(ChannelNumber : Byte; ProgramValue : Word);
begin
Port[C8253ModeControl] := 54 or (ChannelNumber SHL 6); { XX110110 }
Port[C8253Channel[ChannelNumber]] := Lo(ProgramValue);
Port[C8253Channel[ChannelNumber]] := Hi(ProgramValue);
end;
{-[ Set Clock Channel 0 (INT 8, IRQ 0) To Input Speed ]-------------------}
Procedure SetPlaySpeed (Speed : LongInt);
Var
ProgramValue : Word;
begin
ProgramValue := C8253OperatingFreq div Speed;
Set8253Channel(0, ProgramValue);
end;
{-[ Set Clock Channel 0 Back To 18.2 Default Value ]----------------------}
Procedure SetDefaultTimerSpeed;
begin
Set8253Channel (0, 0);
end;
end.
[Back to TIMING SWAG index] [Back to Main SWAG index] [Original]