[Back to JOYSTICK SWAG index] [Back to Main SWAG index] [Original]
Program Joystick;
uses CRT;
const Gameport=$201;
Timer0=$40;
TControl=$43;
MaxLoops=5000;
Button1=$10; Button2=$20; Button3=$40; Button5=$80;
Xaxis1=$01; Yaxis1=$02; Xaxis2=$04; Yaxis2=$08;
var X,Y:word;
Procedure GetJoy; assembler;
label loop1,loop2,axis1,loop3,axdone;
asm
cli {disable interrupts}
mov dx,Gameport; {set port adress}
mov cx,MaxLoops;
mov al,0;
out TControl,al; {latch count in timer0}
in al,Timer0; {low byte of timer count}
mov ah,al;
in al,Timer0; {high byte of timer count}
xchg al,ah;
mov bx,ax; {start count in BX}
out dx,al; {trigger game port}
in al,dx
loop1:
in al,dx; {Read Gameport}
mov ah,al;
and ax,$0201; {X axis in al; Y axis in ah}
test al,Xaxis1; {is X axis done?}
jz axis1;
test ah,Yaxis1; {is Y axis done?}
loopnz loop1;
{Y axis done first!}
out TControl,al;
in al,Timer0; {low byte of Y axis count}
mov ah,al;
in al,Timer0; {high byte of Y axis count}
xchg al,ah
push ax {store Y axis count on the stack}
loop2:
in al,dx;
and al,Xaxis1;
test al,Xaxis1; {Test X axis}
loopnz loop2;
{X axis done(after Y)}
out TControl,al;
in al,Timer0;
mov ah,al;
in al,Timer0;
xchg al,ah {X axis count}
sub ax,bx; {find difference}
neg ax
mov X,ax; {Save X axis time}
pop ax; {Get Y axis count}
sub ax,bx
neg ax
mov Y,ax; {Save Y axis time}
jmp axdone {We're done.}
axis1: {X axis done first}
out TControl,al;
in al,Timer0
mov ah,al
in al,Timer0
xchg al,ah
push ax {Store X axis count on the stack}
loop3:
in al,dx
and al,Yaxis1;
test al,Yaxis1;
loopnz loop3;
{Y is done}
out TControl,al;
in al,Timer0;
mov ah,al
in al,Timer0
xchg al,ah
sub ax,bx
neg ax
mov Y,ax {Save Y axis Time}
pop ax {Get X axis count}
sub ax,bx
neg ax
mov X,ax {Save X axis count}
axdone:
sti
end;
var b1,b2,b3,b4:byte;
Procedure Getbutton; assembler;
label bt2,bt3,bt4,done;
asm
mov b1,0
mov b2,0
mov b3,0
mov b4,0
mov dx,Gameport;
in al,dx;
test al,$10;
jnz bt2 {there must be a better way to do this}
mov b1,1
bt2:
test al,$20;
jnz bt3
mov b2,1
bt3:
test al,$40;
jnz bt4;
mov b3,1;
bt4:
test al,$80;
jnz done;
mov b4,1
done:
end;
var k:char; done:boolean; MaxX,Minx,MaxY,MinY:word;
MX,MY:byte; {percent-adjusted centered joystick values}
CX,CY,D:byte; {Cursor positions and loop Delay}
Begin
ClrScr;
done:=false;
GetJoy;
MaxX:=X; MinX:=X; MaxY:=Y; MinY:=Y; {initial values}
Writeln('Whip that joystick around until the 4 leftmost numbers stop changing,');
writeln('then center the joystick and press button 1 or any key.');
if KeyPressed then k:=ReadKey; {Clear KeyBuffer}
while not done do begin
GetJoy;
if X>=MaxX then MaxX:=X; {find the range of the joystick}
if X<=MinX then MinX:=X;
if Y>=MaxY then MaxY:=Y;
if Y<=MinY then MinY:=Y;
gotoxy(1,5);
Writeln(MinX,' ',MaxX,' ',X,' ');
Writeln(MinY,' ',MaxY,' ',Y,' ');
GetButton;
if B1=1 then Done:=true;
if KeyPressed then Done:=true;
end;
if KeyPressed then k:=ReadKey;
X:=round(((X-MinX)/MaxX)*100); {Percent-adjust: this scales }
Y:=round(((Y-MInY)/MaxY)*100); { the number to between 1 and 100.}
MX:=X; MY:=Y;
done:=false;
gotoxy(1,8);
Write('Press any key.');
if KeyPressed then k:=Readkey;
while not done do begin
GetJoy;
X:=round(((X-MinX)/MaxX)*100);
Y:=round(((Y-MInY)/MaxY)*100);
gotoxy(1,9);
GetButton;
Write(X,' ',Y,' ',B1,B2,B3,B4,' ');
if keypressed then Done:=true;
end;
k:=Readkey;
CX:=40; CY:=10; {Initial cursor position}
D:=100;
Done:=False;
ClrScr;
Writeln('Use the joystick to change cursor positions.');
Writeln('buttons 1 and 2 write smiley faces,');
Writeln('buttons 3 and 4 change joystick speed.');
writeln('Press any key to exit.');
while not done do begin;
GetJoy;
X:=round(((X-MinX)/MaxX)*100);
Y:=round(((Y-MInY)/MaxY)*100);
if X>MX+10 then CX:=CX+1; {change cursor position?}
if X<MX-10 then CX:=CX-1;
if Y>MY+10 then CY:=CY+1;
if Y<MY-10 then CY:=CY-1;
if CX>80 then CX:=1; {there is probably a faster way }
if CX<1 then CX:=80; {to do this using mod. }
if CY>23 then CY:=1;
if CY<1 then CY:=23;
gotoxy(1,24);
write(D,' ');
gotoxy(CX,CY);
GetButton;
if b1=1 then write(chr(1));
if b2=1 then write(chr(2));
if b3=1 then D:=(D+1)mod 250;
if b4=1 then D:=(D-1)mod 250;
if Keypressed then done:=true;
delay(D);
end;
k:=Readkey;
end.
And before I did this, I couldn't progam more than 2 lines of Asm.
--- Renegade v10-05 Exp
* Origin: The Digital Domain - (716) 791-4849 (1:260/149)
SEEN-BY: 270/101 280/1 396/1 3615/50 51
PATH: 260/149 10 1 270/101 396/1 3615/50
[Back to JOYSTICK SWAG index] [Back to Main SWAG index] [Original]