basically correct mul, needs more testing