[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]