87 lines
2 KiB
Text
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
|