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