I know how it worked that way.
The return address would always be on top of the stack, regardless of how many arguments there are. Main would get the return address right, but it would mess up A7. This would totally mess up any function that depended on it. But, when using a frame pointer, the actual value of A7 doesn't matter most of the time. All stack values are performed using A6-relative accesses, rather than A7-relative ones. And when a function ends, the UNLK instruction restores the A6 and A7 to values stored relative to A6.
So A7 is messed up for the duration of the function that calls main, but it is not used for anything and is quickly restored by UNLK as it returns.
As for the new problem, I am not sure (haven't looked at the code yet since my main 9.2.2 machine isn't on at the moment).
Bus error usually (always?) means invalid memory access. You got it to work the first time, so I think you have the code figured out. Things like more UPP madness and parameter order confusion come to mind.