Divide by 3: Difference between revisions

From NESdev Wiki
Jump to navigationJump to search
m (Parodius Da? more like Parodius DEL)
No edit summary
Line 3: Line 3:
== 16-bit dividend, no remainder ==
== 16-bit dividend, no remainder ==


<pre>
<source lang="6502tasm">
  ; divide 16 bit number by 3 by multiplying by 1/3
  ; divide 16 bit number by 3 by multiplying by 1/3
  ; enter with
  ; enter with
Line 71: Line 71:
  rts
  rts
.endproc
.endproc
</pre>
</source>


==References==
==References==
*[http://forums.nesdev.org/viewtopic.php?p=74242#p74242 bogax's post]
*[http://forums.nesdev.org/viewtopic.php?p=74242#p74242 bogax's post]

Revision as of 09:28, 24 August 2013

A lot of times, you need to divide something by 3. One way is to multiply by $55.

16-bit dividend, no remainder

<source lang="6502tasm">

; divide 16 bit number by 3 by multiplying by 1/3
; enter with
; A containing the hi byte of the number to be divided by 3
; Y containing the lo byte of the number to be divided by 3
; the hi byte of the partial product is kept in A or saved
; on the stack when neccessary
; the product (N/3 quotient) is returned hi byte in A,
; lo byte in Y

.proc div3_ay

; save the number in lo_temp, hi_temp
sty lo_temp
sty lo_product
sta hi_temp
ldy #$09
clc
bcc ENTER
; each pass through loop adds the number in
; lo_temp, hi_temp to the partial product and
; then divides the partial product by 4

LOOP:

pha
lda lo_product
adc lo_temp
sta lo_product
pla
adc hi_temp

ENTER:

ror
ror lo_product
lsr
ror lo_product
dey
bne LOOP
ldy lo_product
rts

.endproc

8-bit dividend, no remainder

 ; enter with number to be divided in A
 ; answer returned in A
.proc div3_a
 sta temp
 lsr
 lsr
 adc temp
 ror
 lsr
 adc temp
 ror
 lsr
 adc temp
 ror
 lsr
 adc temp
 ror
 lsr
 rts
.endproc
</source>

References

*bogax's post