1) Yes use Set object Frame ...
2) Remember its not just the CPU speed you have to worry about, even on the same machine the speed will vary depending on the work being done (like how much its having to display, anything else you have running, how much code is run between each sync)
3) I use a bit of code like that below on ALL animation/motion functions in my games as it creates a (pretty much) consistent speed:-
SYNC ON
Cyclestart = TIMER()
DO
REM Your code here, use the Cycle number in motion/animations and adjust (divide/multiply) as necessary
REM work out the cycle time (note minimum cycle seems to be 8, nothing smaller, just goes to zero instead)
Cycle = TIMER() - CycleStart
IF cycle = 0 THEN cycle = 2
Cyclestart = TIMER()
REM note: this gives 1 for a cycle of 10ms, so multiply this by whatever the original speed (at 10ms per cycle) was
SpeedModifier = 0.1 * Cycle
REM this ones used for CurveValue where bigger values are faster (IE inverse)
CurveModifier = INT( 100.0 / Cycle )
REM Syncronise
SYNC
LOOP
"Don`t try to engage my enthusiasm, I don`t have one"