What you have done is impressive for someone who didn't know about view offsets.
I had a look at you code and
The way it is written is a little hard to follow, you really need to think about using;
- constants
- indents
- comments
- sensible variable names
- less goto statements
When debugging your own code, it's sometimes hard to remember what you were thinking when you wrote a particular routine. When debugging someone else's code, its impossible.
While it's up to you how you write your code, if you're asking for help, you really need to meet us half way by making your code easy to follow.
You can't expect people to pick through a big bag of nasty to find the nugget of gold that you need. You need to help people to help you.
As it wasn't too big, and I had some time, I've done you a favour and started the process for you - see attached.
As to the original question, the lines;
screenx#=chopperatx#-16
screeny#=chopperaty#-12
establishes a fixed difference difference between the screen and the chopper.
The sprite position is calculated from the difference between these in updatechopper(), this answer will never change so the chopper will always be at the same position.
And as a guess, it will be 16 Tiles across and 12 down.
Not a maths problem, not a bug, just human error