[Back to JOYSTICK SWAG index] [Back to Main SWAG index] [Original]

    {
    > Can anybody give me any info on how to read signals from pins on say
    > COM2: or from LPT1: or even from The joystick port? I think it has
    > been done with the PORT command or something, but what are the values
    > to use to read them with?

    As mentioned in the Neural_Net Echo:
    }

    UNIT joys;

    {Joystick interface for Turbo Pascal.}
    {Copyright 1993 by Wesley R. Elsberry.  Released for noncommercial use.}
    {NO WARRANTY.}

    INTERFACE

    VAR
      xcor, ycor,
      fire1, fire2 : WORD;

    PROCEDURE joy;     { basic info for first joystick }
    PROCEDURE testjoy; { minimal test routine }

    IMPLEMENTATION

    { Significant aid was had from the example given in:
      programm to read joystick : turbo c 2.0 - Jean-Yves Vinet }

    CONST
      JOYPORT = $201;
      STROUT  = $FF;
      STRCMP  = $FFFF;

    VAR
      inread,
      temp   : BYTE;

    PROCEDURE joy;
    VAR
      done : BOOLEAN;
    BEGIN
      done := FALSE;
      xcor := 0;
      ycor := 0;
      port[JOYPORT] := STROUT;

      while (NOT done) DO
      BEGIN
        if ((port[JOYPORT] AND 1) = 0) then
          done := TRUE;
        INC(xcor);
        if (xcor = STRCMP) then
          done := true;
      END;

      while ((port[JOYPORT] AND 2) <> 0) DO ;

      done := FALSE;
      port[JOYPORT] := STROUT;

      while (NOT done) DO
      BEGIN
        if ((port[JOYPORT] AND 2) = 0) then
          done := TRUE;
        INC(ycor);
        if (ycor = STRCMP) then
          done := TRUE;
      END;

      inread := port[JOYPORT];

      { Button A at $10, B at $20, C at $40, D at $80. }
      if ((inread AND $10) <> $10) then
        fire1 := 1;
      if ((inread AND $20) <> $20) then
        fire2 := 1;
    END;

    {If you want to grab the second joystick values, the X coordinate
    should be gotten from comparing port[JOYPORT] to 4, the Y coordinate
    from comparing port[JOYPORT] to 8.}

    PROCEDURE testjoy;
    BEGIN
      while TRUE do
      BEGIN
        joy;
        WRITELN(xcor : 5, '  ', ycor, '  ', fire1, '  ', fire2);
        xcor  := 0;
        ycor  := 0;
        fire1 := 0;
        fire2 := 0;
      END;
    END;

    BEGIN
      {No initialization required.}
    END.

    {
    The above was a pretty quick and dirty approach to grabbing values
    off the game card.  I'm sure that there are better means of doing it,
    but I haven't put in the time to find them.  Interestingly enough,
    the Turbo C version mentioned in the comments of the unit above does
    not give as large a value for the maximum displacement of a joystick,
    which is an indicator that the Turbo Pascal code is faster than its
    equivalent Turbo C counterpart.
    }

[Back to JOYSTICK SWAG index] [Back to Main SWAG index] [Original]