Csaba Skrabák - 2020-08-22
'CALL MYSTERY SUBPROGRAM WITH 2 PARAMETERS, EXPECT RESULT ON STACK
PUSH 126:PUSH 45:GOSUB MYSTERY:PULL RESULT
PRINT RESULT
END
@MYSTERY
PULL RA:PULL V:PULL U 'GET PARAMETERS FROM STACK IN REVERSED ORDER
IF U = V OR V = 0 THEN PUSH U:PUSH RA:RETURN 'RETURNING RESULT U
IF U = 0 THEN PUSH V:PUSH RA:RETURN 'RETURNING RESULT V
PUSH RA 'RETURN ADDRESS IS NOT SAFE IN A GLOBAL VARIABLE: SAVE TO STACK BEFORE RECURSIVE CALL
IF U AND 1 T.G. ODDU
    IF V AND 1 THEN PUSH U/2:PUSH V:GOSUB MYSTERY:PULL RV:PULL RA:PUSH RV:PUSH RA:RETURN
    PUSH U/2:PUSH V/2:GOSUB MYSTERY:PULL RV:PULL RA:PUSH RV*2:PUSH RA:RETURN
@ODDU
    IF NOT(V)AND 1 THEN PUSH U:PUSH V/2:GOSUB MYSTERY:PULL RV:PULL RA:PUSH RV:PUSH RA:RETURN
    IF U > V THEN PUSH (U - V)/2:PUSH V:GOSUB MYSTERY:PULL RV:PULL RA:PUSH RV:PUSH RA:RETURN
    PUSH (V - U)/2:PUSH U:GOSUB MYSTERY:PULL RV:PULL RA:PUSH RV:PUSH RA:RETURN
 

Last edit: Csaba Skrabák 2020-08-22