A short explanation:
once the program RETURN from GETKEY, it RETURN after the GOSUB line, then do once again the GETKEY sub, meet a RETURN without a previous gosub.

Gosub => stack+1 => stack = +
Return => stack-1 => stack = 0
Return +> stack-1 => stack=-1 <=== here's the underflow