// recalc up vector up = math.Cross( forward, side );
It looks like you've reversed this cross product. forward x side will get you the down vector using the right-hand rule. Try doing side x forward and see if that fixes the issue.
Yep, I was at that point where I was trying anything. Code got messy, I didn't need to recalc the Up vector :-)