home *** CD-ROM | disk | FTP | other *** search
- {
- to whomever sent me a message concerning joystick support, I apologize that I
- cannot send this message to you directly (message Pointers were screwed up on m
- end, and I lost your message), but here is both my source For a Unit and a
- sample Program. First I'd like to say that my Unit may be somewhat inComplete.
- have only a Single joystick port, so reading of two ports is impossible. For
- this reason, I'd like to ask any and all to make suggestions, and modifications
- so that I, and all Programmers, may have a Complete Unit. Also, remarks have
- not been added to the Program, if an explanation is needed, please feel free to
- ask...I'd be more than happy to give explanations For my work. Anyhows, here i
- is...
- }
-
- Unit Joystick;
-
- Interface
-
- Function JoystickExists : Boolean;
- Function JoystickPosX : Integer;
- Function JoystickPosY : Integer;
- Function JoystickButtonA : Boolean;
- Function JoystickButtonB : Boolean;
-
- Implementation
-
- Uses Crt, Dos;
-
- Const GamePortAddr = $200;
- MaxCount = 500;
-
- Function JoystickStatus (Mask : Byte) : Integer;
- Var Counter : Integer;
- Label Read;
- begin
- Asm
- mov cx,MaxCount
- mov dx,GamePortAddr
- mov ah,Mask
- out dx,al
- read:
- in al,dx
- test al,ah
- loopnz read
- mov counter,cx
- end;
- JoystickStatus := MaxCount - Counter;
- Delay (2);
- end;
-
- Function JoystickPosX : Integer;
- begin
- JoystickPosX := JoystickStatus (1);
- end;
-
- Function JoystickPosY : Integer;
- begin
- JoystickPosY := JoystickStatus (2);
- end;
-
- Function JoystickButtonA : Boolean;
- begin
- JoystickButtonA := (Port [GamePortAddr] and 16) = 0;
- end;
-
- Function JoystickButtonB : Boolean;
- begin
- JoystickButtonB := (Port [GamePortAddr] and 32) = 0;
- end;
-
- Function JoystickExists : Boolean;
- Var Regs : Registers;
- begin
- JoystickExists := not ((JoystickPosX = 0) and (JoystickPosY = 0));
- end;
-
- end.
-
-
- {
-
- Program JoyTest;
-
- Uses Crt, Dos, AniVGA, Joystick;
-
- Var XMin, XMax, YMin, YMax,
- XRange, YRange,
- X, Y,
- PosX, PosY,
- Bullet1X, Bullet1Y,
- Bullet2X, Bullet2Y : Integer;
- Shooting1, Shooting2 : Boolean;
- ShootNext : Boolean;
-
- Procedure CalibrateJoystick (Var XMin, XMax, YMin, YMax : Integer);
- begin
- Write ('Press joystick to upper left corner and press button one...');
- Repeat Until JoystickButtonA;
- XMin := JoystickPosX;
- YMin := JoystickPosY;
- Writeln ('OK.');
- Repeat Until not JoystickButtonA;
- Write ('Press joystick to lower right corner and press button two...');
- Repeat Until JoystickButtonB;
- XMax := JoystickPosX;
- YMax := JoystickPosY;
- Writeln ('OK.');
- Repeat Until not JoystickButtonB;
- end;
-
- Procedure AnimateShip;
- begin
- X := JoystickPosX - XMin;
- if (X <= XRange div 3) then
- Dec (PosX, 3)
- else if (X > XRange * 2 div 3) then
- Inc (PosX, 3);
- Y := JoystickPosY - YMin;
- if (Y <= YRange div 3) then
- Dec (PosY, 3)
- else if (Y > YRange * 2 div 3) then
- Inc (PosY, 3);
- SpriteX [0] := PosX;
- SpriteY [0] := PosY;
- end;
-
- Procedure AnimateBullets;
- begin
- if Shooting1 then
- if (Bullet1Y < 0) then
- Shooting1 := False
- else
- Dec (Bullet1Y, 8)
- else
- begin
- Bullet1X := PosX + 3;
- Bullet1Y := PosY + 14;
- end;
- if Shooting2 then
- if (Bullet2Y < 0) then
- Shooting2 := False
- else
- Dec (Bullet2Y, 8)
- else
- begin
- Bullet2X := PosX + 30;
- Bullet2Y := PosY + 14;
- end;
- SpriteX [1] := Bullet1X;
- SpriteY [1] := Bullet1Y;
- SpriteX [2] := Bullet2X;
- SpriteY [2] := Bullet2Y;
- end;
-
- begin
- if JoystickExists and (LoadSprite ('SHIP1.COD', 1) = 1) and
- (LoadSprite ('BULLET.COD', 2) = 1) then
- begin
- ClrScr;
- CalibrateJoystick (XMin, XMax, YMin, YMax);
- ClrScr;
- InitGraph;
- SpriteN [0] := 1;
- SpriteN [1] := 2;
- SpriteN [2] := 2;
- PosX := 160;
- PosY := 160;
- Shooting1 := False;
- XRange := XMax - XMin;
- YRange := YMax - YMin;
- ShootNext := Boolean (0);
- While not (JoystickButtonA and JoystickButtonB) do
- begin
- if JoystickButtonA and not JoystickButtonB then
- if not Shooting1 and ShootNext then
- begin
- Bullet1X := PosX + 3;
- Bullet1Y := PosY + 14;
- Shooting1 := True;
- ShootNext := False;
- end
- else if not Shooting2 and not ShootNext then
- begin
- Bullet2X := PosX + 30;
- Bullet2Y := PosY + 14;
- Shooting2 := True;
- ShootNext := True;
- end;
- While JoystickButtonA do
- begin
- AnimateShip;
- AnimateBullets;
- Animate;
- end;
- AnimateShip;
- AnimateBullets;
- Animate;
- end;
- CloseRoutines;
- end
- else
- Writeln ('Game card not installed.');
- end.
-
- I apologize For giving you an example that Uses another Unit. if need be, this
- Program can be easily modified to provide a successful example. Hope this
- helps, and I hope my Programming is not toO bad.
- }