It is (as you say) a fairly long piece of code to expect someone to anaylse fully.
Firstly, great to see a lot of comments, but . . . .
some are excessive and uneccessary. For example
goto track ; return to track
Others are incorrect. For example:
under the routine downslow:
return ; return to main
It acutally returns to the calling part which itself are a subroutines/sections such as SET: and CUT:
In terms of program flow:
In the Main: program you have a call "gosub track"
but there is not RETURN command at the end of Track:
so the program will eventually fall through Track: into Upfast:
You have the line:
setint %10000000,%10000000
scattered through the program
In reality one at the start and then at the end of the Interrupt: routine will suffice.
Your have SETFREQ m8 at the start and also under the label Set:.
Unless you change the clock speed there is no need to repeat the command.
Near the top you have:
symbol Del=1 ; set delay to 1 microsecond
then you have many many lines with:
pins = %0010 : pause del
The pins configurations changes - it is the delay/pause that is of interest
PAUSE values are in 1 milli second not 1 microsecond increments.
roughly, each BSIC comamnds takes around 250 microseconds (the nature of interpreted BASIC programming). If you really want microsecond type pauses set Del = 0 and try.
Later remove all these PAUSE del commands.
Without looking at the program flow, you also have a lot of other pasues such as 250ms, 1000ms, 1500ms, 2000ms, etc.
Taking into consideration the above mentioned approx 0.25ms duration per program command and all the pasues it may be no wonder that your program is quite slow.
Suggest you revisit the delays in the first instance and also look at subroutines to make sure they are returning correctly.
Try it out in the Programming Editor simulator and see if the program flow is what you expect.