Reputation: 122
I was wondering if there is a command/method to perform modulo in Motorola 68000 assembly?
I want to perform d4 mod 1000 and d3 mod 100.
Current I am using the following formula but this take several lines,
if a mod n then a - (n * int(a/n))
I have seen this formula for d0 mod d1
CLR.L D2
MOVE.W D0,D2
DIVU D1,D2
SWAP D2
Thanks for the answers.
Upvotes: 5
Views: 3277
Reputation: 5041
START
DIVU #1000,D4
CLR.W D4 ; delete quotient
SWAP D4 ; modulus from top to bottom 16 bits
DIVU #100,D3
CLR.W D3 ; delete quotient
SWAP D3 ; modulus from top to bottom 16 bits
One thing that this code doesn't handle is whether the result would be larger than #ffff(65535), for which you need extra code, possibly a test to check if D3/D4 is greater than the divisor shifted up by 16 bits.
As the modulus will be a number between 0 and 99/999, you could alternatively use EXT.W after the swap instead of CLR.W before the swap. Note that EXT sign extends a value.
Upvotes: 2
Reputation: 16331
The DIVU
instruction does precisely what you are looking for. When you perform DIVU
, the long word of the destination is divided by the word of the source. In your case, you wrote:
DIVU D1, D2
So, D2 is being divided by D1. In the quotient, there are two parts returned. The high order word of D2 will contain the remainder (the modulus) while the low order word contains the quotient. This is why you typically see a SWAP d2
. This moves the remainder to the low order word.
Upvotes: 8