Pascal Joystick
Pascal
Download (.zip)
{ -------------------------------------------------- File: JOYSTICK.PAS By: Ronny Wester, ronny@rat.se
Code to read PC sticks. Written with kind assistance of Christian Wagner. -------------------------------------------------- } unit Joystick;
interface
type
JoyRec = record present : Boolean; x, y : Word; button1, button2, button3, button4 : Boolean; end;
var
gSticks : array [1..2] of JoyRec;
procedure PollSticks; procedure InitSticks;
implementation
const
cStickPort = $0201;
{ PollSticks. Run to retrieve current values of sticks. Only sticks with the present flag set will be polled. Also see InitSticks below. }
procedure PollSticks; var b : Byte; mask : Byte; laps : Word; begin mask := 0; if gSticks[1].present then mask := 3; if gSticks[2].present then mask := mask or 12; FillChar( gSticks, SizeOf( gSticks), 0); laps := 0;
asm cli end;
Port[ cStickPort] := $FF; { Write anything to trigger countdown } repeat b := Port[ cStickPort]; if b and 1 <> 0 then Inc( gSticks[1].x); if b and 2 <> 0 then Inc( gSticks[1].y); if b and 4 <> 0 then Inc( gSticks[2].x); if b and 8 <> 0 then Inc( gSticks[2].y); Inc( laps); until (b and mask = 0) or (laps > 60000); { Timeout if no sticks connected }
asm sti end;
gSticks[1].present := b and 3 = 0; gSticks[2].present := b and 12 = 0;
if gSticks[1].present then begin gSticks[1].button1 := b and 16 = 0; gSticks[1].button2 := b and 32 = 0; gSticks[1].button3 := b and 64 = 0; gSticks[1].button4 := b and 128 = 0; end;
if gSticks[2].present then begin gSticks[2].button1 := b and 64 = 0; gSticks[2].button2 := b and 128 = 0; gSticks[2].button3 := b and 16 = 0; gSticks[2].button4 := b and 32 = 0; end; end;
{ Initialization. Assume both sticks present and do a poll. The poll routine will clear present flags of non-connected sticks. }
procedure InitSticks; begin gSticks[1].present := True; gSticks[2].present := True; PollSticks; end;
end.
|