rewritten assembler ; faster