//------------------------------------------------ // Mult/Div routines, taken from "The Fridge" // Made with 65CM interfaces //------------------------------------------------ #IFNDEF __LIB_MULTDIV #DEFINE __LIB_MULTDIV = 1 GOTO lib_multdiv_skip WORD lib_multdiv_acc WORD lib_multdiv_aux WORD lib_multdiv_ext //------------------------------------------------ // * MULTIPLY ROUTINE //* ACC*AUX -> [ACC,EXT] (low,hi) 32 bit result //------------------------------------------------ FUNC lib_multdiv_mult ( io:lib_multdiv_acc lib_multdiv_aux ) FUNC lib_multdiv_mult32 ( io:lib_multdiv_acc lib_multdiv_aux out:lib_multdiv_ext ) ASM lda #0 sta lib_multdiv_ext+1 ldy #$11 clc lib_multdiv_l1 ror lib_multdiv_ext+1 ror ror lib_multdiv_acc+1 ror lib_multdiv_acc bcc lib_multdiv_mul2 clc adc lib_multdiv_aux pha lda lib_multdiv_aux+1 adc lib_multdiv_ext+1 sta lib_multdiv_ext+1 pla lib_multdiv_mul2 dey bne lib_multdiv_l1 sta lib_multdiv_ext ENDASM FEND //------------------------------------------------ // * DIVIDE ROUTINE //* ACC/AUX -> ACC, remainder in EXT //------------------------------------------------ FUNC lib_multdiv_div ( io:lib_multdiv_acc lib_multdiv_aux ) FUNC lib_multdiv_divmod ( io:lib_multdiv_acc lib_multdiv_aux out:lib_multdiv_ext ) ASM lda #0 sta lib_multdiv_ext+1 ldy #$10 lib_multdiv_l2 asl lib_multdiv_acc rol lib_multdiv_acc+1 rol rol lib_multdiv_ext+1 pha cmp lib_multdiv_aux lda lib_multdiv_ext+1 sbc lib_multdiv_aux+1 bcc lib_multdiv_div2 sta lib_multdiv_ext+1 pla sbc lib_multdiv_aux pha inc lib_multdiv_acc lib_multdiv_div2 pla dey bne lib_multdiv_l2 sta lib_multdiv_ext ENDASM FEND LABEL lib_multdiv_skip #IFEND