[Return to Main Page]

Multiply & Divide from 6502 Software Design, Expanded by Greg
[Up to Source Code Repository]


Multiply & Divide

Here are some multiplication and division routines to use for larger integers. I haven't taken any time to document the code much but it should be fairly straightforward and self explanatory. These are routines that I expanded from the 6502 Software Design book by Leo J. Scanlon. Anyone may contact me for questions or comments at greg@ntown.com.

;32 bit multiply with 64 bit product

MULTIPLY:  lda     #$00
           sta     PROD+4   ;Clear upper half of
           sta     PROD+5   ;product
           sta     PROD+6
           sta     PROD+7
           ldx     #$20     ;Set binary count to 32
SHIFT_R:   lsr     MULR+3   ;Shift multiplyer right
           ror     MULR+2
           ror     MULR+1
           ror     MULR
           bcc     ROTATE_R ;Go rotate right if c = 0
           lda     PROD+4   ;Get upper half of product
           clc              ; and add multiplicand to
           adc     MULND    ; it
           sta     PROD+4
           lda     PROD+5
           adc     MULND+1
           sta     PROD+5
           lda     PROD+6
           adc     MULND+2
           sta     PROD+6
           lda     PROD+7
           adc     MULND+3
ROTATE_R:  ror     a        ;Rotate partial product
           sta     PROD+7   ; right
           ror     PROD+6
           ror     PROD+5
           ror     PROD+4
           ror     PROD+3
           ror     PROD+2
           ror     PROD+1
           ror     PROD
           dex              ;Decrement bit count and
           bne     SHIFT_R  ; loop until 32 bits are
           clc              ; done
           lda     MULXP1   ;Add dps and put sum in MULXP2
           adc     MULXP2
           sta     MULXP2
           rts


;64 bit divide routine with 32 bit quotent

DIVIDE:    ldy     #$40       ;Set bit length
DO_NXT_BIT: asl    DVDQUO
           rol     DVDQUO+1
           rol     DVDQUO+2
           rol     DVDQUO+3
           rol     DVDQUO+4
           rol     DVDQUO+5
           rol     DVDQUO+6
           rol     DVDQUO+7
           rol     DVDR+8
           rol     DVDR+9
           rol     DVDR+$a
           rol     DVDR+$b
           rol     DVDR+$c
           rol     DVDR+$d
           rol     DVDR+$e
           rol     DVDR+$f
           ldx     #$00
           lda     #$08
           sta     ADDDP
           sec
SUBT:      lda     DVDR+8,x   ;Subtract divider from
           sbc     DVDR,x     ; partial dividend and
           sta     MULR,x     ; save
           inx
           dec     ADDDP
           bne     SUBT
           bcc     NXT        ;Branch to do next bit
           inc     DVDQUO     ; if result = or -
           ldx     #$08       ;Put subtractor result
RSULT:     lda     MULR-1,x   ; into partial dividend
           sta     DVDR+7,x
           dex
           bne     RSULT
NXT:       dey
           bne     DO_NXT_BIT
           sec
           lda     DIVXP1     ;Subtract dps and store result
           sbc     DIVXP2
           sta     DIVXP2
           rts
Last page update: August 6, 1999.