[Back to JOYSTICK SWAG index] [Back to Main SWAG index] [Original]
(* A Joystick Unit !
------------------------------------------------------------------------------
This unit will also Detect Your Joystick. if it's detected then you'll have
to init the Joystick by turning the joystick in all directions and when done
press a button , And whala your joystick works I Hope!
See My sample program under the Unit code.
You may modify this code as muts as you want but , please give me a
credit,thanks !
Have a question or suggestions please tel me : E-mail riedijk@pi.net
By Ad Riedijk .
*)
Unit JoyStick;
interface
Const GamePortAddr = $200;
MaxCount = 500;
JUPDOWN=2;
JLEFTRIGHT=1;
type TJoyStick = Object
{there is not a range checking}
Xas,Yas:integer;{those will be updated when joyup or down left right
are called}
XSpeed,YSpeed:byte;{the increment of xas=xas+xspeed and yas:=yas+yspeed}
minX,minY,maxX,maxY:integer;
Function JoystickStatus (Mask : Byte) : Integer;
Function JoyUp:boolean;
Function JoyDown:boolean;
Function JoyLeft:boolean;
Function JoyRight:boolean;
Function JoyButton1:boolean;
Function JoyButton2:boolean;
Function JoyButtonPressreleased1:boolean;
Function JoyButtonPressreleased2:boolean;
Function InitJoyStick:boolean;
function DetectJoystick:boolean;
end;
implementation
uses crt;{for the delay}
Function TJoyStick.JoystickStatus (Mask : Byte) : Integer;
Var Counter : Integer;
p:byte;
begin
port[gameportaddr]:=0;{just write someting too the gameport}
counter:=maxcount;
repeat
dec(counter);
until (counter=0) or (port[gameportaddr] and mask<>mask);
JoystickStatus := MaxCount - Counter;
Delay (2);
end;
Function TJoyStick.JoyUp:boolean;
begin
if (JoyStickStatus(JUPDOWN) <= minY+10) then
begin
JoyUp:=true;
dec(Yas,Yspeed);
end
else JoyUp:=false;
end;
Function TJoyStick.JoyDown:boolean;
begin
if (JoyStickStatus(JUPDOWN) >= maxY-10) then
begin
JoyDown:=true;
inc(Yas,Yspeed);
end
else JoyDown:=false;
end;
Function TJoyStick.JoyLeft:boolean;
begin
if (JoyStickStatus(JLeftRight) <= minx+10) then
begin
JoyLeft:=true;
dec(Xas,Xspeed);
end
else JoyLeft:=false;
end;
Function TJoyStick.JoyRight:boolean;
begin
if (JoyStickStatus(JLeftRight) >= maxx-10) then
begin
JoyRight:=true;
inc(Xas,Xspeed);
end
else JoyRight:=false;
end;
Function TJoyStick.JoyButton1:boolean;
begin
if not (port[Gameportaddr] and 16 = 16) then JoyButton1:=true else
JoyButton1:=false;
end;
Function TJoyStick.JoyButton2:boolean;
begin
if not (port[Gameportaddr] and 32 = 32) then JoyButton2:=true else
JoyButton2:=false;
end;
Function TJoystick.JoyButtonPressreleased1:boolean;
begin
if joybutton1 then
begin
joybuttonpressreleased1:=true;
repeat
until not joybutton1;
end else joybuttonpressreleased1:=false;
end;
Function TJoystick.JoyButtonPressreleased2:boolean;
begin
if joybutton2 then
begin
joybuttonpressreleased2:=true;
repeat
until not joybutton2;
end else joybuttonpressreleased2:=false;
end;
Function TJoyStick.InitJoyStick :boolean;
var JMaxX,JMaxY,JMinY,JMinX:integer;
begin
if detectJoystick then
begin
Initjoystick:=true;
XSpeed:=1;
YSpeed:=1;
XAS:=0;
YAS:=0;
minX:=JoystickStatus (JLEFTRIGHT);
maxX:=JoystickStatus (JLEFTRIGHT);
minY:=JoystickStatus (JUPDOWN);
maxY:=JoystickStatus (JUPDOWN);
repeat
JminX:=JoystickStatus (JLEFTRIGHT);
if JminX < minx then minx:=Jminx;
JmaxX:=JoystickStatus (JLEFTRIGHT);
if JmaxX > maxX then maxX:=JmaxX;
JminY:=JoystickStatus (JUPDOWN);
if JminY < minY then minY:=JminY;
JmaxY:=JoystickStatus (JUPDOWN);
if JmaxY > maxY then maxY:=JmaxY;
if not detectJoystick then initjoystick:=false;
until JoyButton1 or JoyButton2 or (not detectJoystick);
end else Initjoystick:=false;
end;
Function TJoyStick.detectJoystick:boolean;
begin
if Joystickstatus(1) = Maxcount then detectJoystick:=false else
detectJoystick:=true;
end;
end.
{ --------------------- DEMO PROGRAM ----------------------- }
Program Joytest;
uses crt,dos,joystick;
var Joy:TJoyStick;
begin
clrscr;
writeln('please move your Joystick in all directions and when done press
a button ');
if not Joy.InitJoyStick then {Try this : when initjoystick runs just un
plug the joystick}
begin
writeln('Error no Joystick !');
halt(0);
end;
clrscr;
Writeln('Move the Joystick up and down and left and right');
writeln('Push a button A or B to Quit');
delay(200);
repeat
if Joy.JoyLeft then begin gotoxy(10,10);write(#17); end else
if Joy.JoyRight then begin gotoxy(10,10);write(#16); end else
begin gotoxy(10,10);write(#254);end;
if Joy.JoyUp then begin gotoxy(10,11);write(#30); end else
if Joy.JoyDown then begin gotoxy(10,11);write(#31); end else
begin gotoxy(10,11);write(#254); end;
delay(200);
until joy.JoyButtonPressreleased1 or joy.JoyButtonPressreleased2;
end.
[Back to JOYSTICK SWAG index] [Back to Main SWAG index] [Original]