c65gm/lib/multdivlib.c65

87 lines
2 KiB
Text

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