{$M 1024,0,0}
{$S-}
program joystick;
{ Driver per joystick analogico }
uses Dos;
{ Procedura di stampa delle stringhe senza utilizzo delle
funzioni di libreria che comporterebbero l'installazione
residente della system unit }
procedure writestr(s : string); assembler;
asm
push ds
lds si, s
cld
lodsb
xor ah, ah
xchg cx, ax
mov ah, 40h
mov bx, 0001
mov dx, si
int 21h
pop ds
end;
{ Procedura principale di lettura che restituisce il
counter del bit specificato }
function read_stick(n : word) : word; assembler;
asm
xor bx, bx
mov cx, n
mov dx, 0201h
out dx, al
@@loop:
in al, dx
test al, cl
jz @@quit
inc bx
jnz @@loop
@@quit:
mov ax, bx
end;
procedure wait_stick(n : word); assembler;
asm
mov cx, n
mov dx, 0201h
@@loop:
in al, dx
test al, cl
jnz @@loop
end;
{ Restituisce in AX e BX le coordinate X e Y; in CX lo stato dei pulsanti }
procedure read_joy(var a,b,c : word);
begin
if (a and 1) = 0 then begin
a := read_stick(1);
if a <> 0 then begin
c := (port[$0201] and $30) shr 4;
wait_stick(2);
b := read_stick(2);
end;
end
else begin
a := read_stick(4);
if a <> 0 then begin
c := (port[$0201] and $C0) shr 6;
wait_stick(8);
b := read_stick(8);
end;
end;
end;
procedure banner(var a,b,c : word);
var st : word;
begin
writestr(#13#10'CASASOFT High Resolution Joystick Driver V. 0.03'#13#10);
writestr('(c) 1992 Roberto Ceccarelli - All rights reserved'#13#10#10);
writestr(' Joystick A : ');
a := 0;
read_joy(a,b,c);
if a = 0 then begin
st := 0;
writestr('Not Installed'#13#10);
end
else begin
st := 1;
writestr('Ready'#13#10);
end;
writestr(' Joystick B : ');
a := 1;
read_joy(a,b,c);
if a = 0 then writestr('Not Installed'#13#10)
else begin
st := st + 2;
writestr('Ready'#13#10);
end;
a := $0003;
b := $cd01;
c := st;
writestr(#10);
end;
{$F+}
procedure NewIntF1(Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP: Word);
interrupt;
begin
case ax and $ff00 of
0 : banner(ax,bx,cx);
$100 : read_joy(ax,bx,cx);
end;
end;
procedure End_Resident;
begin
end;
{$F-}
var size,a,b,c : word;
procedure dohelp;
begin
halt(0);
end;
begin
banner(a,b,c);
if (paramstr(1) = '/?') then dohelp;
writestr('Warning: this is a alpha test release!'#13#10);
setintvec($F1,addr(newIntF1));
writestr('Installed with interrupt 0xF1'#13#10#10);
{ Rilascia Environment }
asm
mov ax, PrefixSeg
mov es, ax
mov bx, es:[002ch]
mov es, bx
mov ah, 49h
int 21h
end;
{ Installa Residente }
size := succ(ofs(End_Resident) div 16) + 16;
asm
mov ax, 3100h
mov dx, size
int 21h
end;
end.