//------------------------------------------------
//  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
