To repeat what Henrik said using slightly different words, there is nothing wrong with using a GOTO to exit a loop as you are using it because that is pretty much what it was intended for. Where you can get into trouble is when you use GOTO to exit a subroutine and thereby miss a RETURN. Your code snippet does not show what's inside the subroutines "one" and "two" but for example, perhaps "one" contains the code:
one:
IF something = value THEN GOTO Main_Loop
something = different
RETURN
In this case, whenever the program goes to "one" it puts whatever it was doing on the stack. When it hits the RETURN, it takes the values off the stack and puts them back where they were before the GOSUB, and life is good. When the condition of "something = value" is met, the clean up doesn't happen, and the old register values are left on the stack. Each time it happens, a little more memory is not released. Eventually you run out of stack space and crash.
In your example, the GOTO is not inside a subroutine, so you don't have to worry about it. It should run forever.
The same is true of ISRs which are just a special kind of subroutine.
Bookmarks