I know it kind of renders your whole exercise redundant and unnecessary (though I understand the allure and importance of it), but you could just decompile the SQ3 scripts and see how Sierra did it.
I have been looking at the assembly scripts for clues and I also use the built in debug system for help too. I got my problem figured out, it's not super pretty but it works. Roger is driving his garbage grabber beautifully, even if the code is ugly

(class driveGrabber of Script
(method (handleEvent pEvent)
(super:handleEvent(pEvent))
// handle Said's, etc...
(switch((send pEvent:type))
(case evJOYSTICK
MapKeyToDir(pEvent)
(if (== (send pEvent:message) JOY_RIGHT) // right key pressed
(if (==(send gEgo: loop) 0) // ego pointing forward
(if (send gEgo: isStopped()) // grabber machine is stopped?
(send gEgo: setStep(3 1)) // start the grabber machine
(send gTheMusic:prevSignal(0) stop() number(52) loop(-1) play()) // grabber machine humming
)
(else // grabber machine is moving
(send gEgo: setStep(0 0) setMotion(NULL)) // stop the grabber machine
(send gTheMusic: prevSignal(0) stop()) // turn off the humming sound
)
)
(else // ego pointing backwards
(send gEgo: setLoop(0) setStep(3 1)) // look forward
(send gTheMusic:prevSignal(0) stop() number(52) loop(-1) play()) // start the grabber machine humming sound
)
)
(if (== (send pEvent:message) JOY_LEFT) // left key pressed
(if (==(send gEgo: loop) 1) // ego looking backwards
(if (send gEgo: isStopped()) // grabber machine is stopped?
(send gEgo: setStep(3 1)) // start the grabber machine
(send gTheMusic:prevSignal(0) stop() number(53) loop(-1) play()) // backing up warning sound
)
(else // ego is moving
(send gEgo: setStep(0 0) setMotion(NULL)) // stop the grabber machine
(send gTheMusic: prevSignal(0) stop()) // turn off the humming sound
)
)
(else // ego looking forwards
(send gEgo: setLoop(1) setStep(3 1)) // look backwards
(send gTheMusic:prevSignal(0) stop() number(53) loop(-1) play()) // start the backing up warning sound
)
)
)
)
)
)