The JOYSTICK UP/DOWN/LEFT/RIGHT commands only really work with digital joysticks. Any movement away from 0,0 causes the commands to register movement. This is useless for most analog controlers because it is near enough impossible to move them on one axis without slightly moving it on the other.
You need to write your own joystick functions that use JOYSTICK X/Y combined with a deadzone.
global deadzone as integer
deadzone = 100
sync on
do
cls
y = 0
text 0, y, "joystick x() = " + str$(joystick x()) : inc y,10
text 0, y, "joystick y() = " + str$(joystick y()) : inc y,10
text 0, y, "joystick up() = " + str$(joystick up()) : inc y,10
text 0, y, "joystick down() = " + str$(joystick down()) : inc y,10
text 0, y, "joystick left() = " + str$(joystick left()) : inc y,10
text 0, y, "joystick right() = " + str$(joystick right()) : inc y,10
text 0, y, "joystick_up() = " + str$(joystick_up()) : inc y,10
text 0, y, "joystick_down() = " + str$(joystick_down()) : inc y,10
text 0, y, "joystick_left() = " + str$(joystick_left()) : inc y,10
text 0, y, "joystick_right() = " + str$(joystick_right()) : inc y,10
sync
loop
function joystick_up()
ret = 0
if joystick y() < deadzone * -1 then ret = 1
endfunction ret
function joystick_down()
ret = 0
if joystick y() > deadzone then ret = 1
endfunction ret
function joystick_left()
ret = 0
if joystick x() < deadzone * -1 then ret = 1
endfunction ret
function joystick_right()
ret = 0
if joystick x() > deadzone then ret = 1
endfunction ret
By way of demonstration, he emitted a batlike squeak that was indeed bothersome.