English Amiga Board (http://eab.abime.net/index.php)
-   Coders. Tutorials (http://eab.abime.net/forumdisplay.php?f=73)
-   -   div and mul of BCD or Hex? (http://eab.abime.net/showthread.php?t=103868)

 JoeJoe 08 September 2020 10:48

div and mul of BCD or Hex?

Hello coder,

I am currently working on the display and calculation of scores. I have already read the thread "BCD Arithmetic - howto^". The simple adding and subtracting is no problem. But I have to divide the score by 50. Also the points can be increased by graduation 3*90 or 5*240 etc.
Now to my problem. For dividing and multiplying with BCD there are no 1:1 commands. Multiplying can be avoided by using LookUp tables and adding. But for x:50 there is no alternative.
Of course I can calculate everything in hex and convert the hex values to decimal for the display. But this eats a lot of cycles. :(
How can I solve the problem without overloading the computer.

Thanks in advance
JoeJoe

@Admins: please move to right section, sorry

 meynaf 08 September 2020 11:13

You can convert the divide into a multiply.
First, add the number to itself to do *2.
Then, remove the two last digits to do /100.
You will have achieved /50.

 alkis 08 September 2020 11:18

/50 can be achieved by /100 (dropping last byte) and add the number to itself (so /100*2)

 JoeJoe 08 September 2020 11:46

thanks for your replies :)

 8bitbubsy 08 September 2020 13:11

Quote:
 Originally Posted by meynaf (Post 1426440) Then, remove the two last digits to do /100.
How is this achieved in a fast way when working with binary?

 meynaf 08 September 2020 13:18

Quote:
 Originally Posted by 8bitbubsy (Post 1426472) How is this achieved in a fast way when working with binary?
Who cares ? This thread is about BCD, not binary.

 JoeJoe 08 September 2020 14:10

That's right, but we don't want to be like that ;)

I do this with the reciprocal method. x/50 = x*(1/50)

 Thomas Richter 08 September 2020 16:07

Quote:
 Originally Posted by JoeJoe (Post 1426428) I am currently working on the display and calculation of scores. I have already read the thread "BCD Arithmetic - howto^". The simple adding and subtracting is no problem. But I have to divide the score by 50. Also the points can be increased by graduation 3*90 or 5*240 etc. Now to my problem. For dividing and multiplying with BCD there are no 1:1 commands. Multiplying can be avoided by using LookUp tables and adding. But for x:50 there is no alternative.

:50 is simple enough (already answered by others), but general multiplication or division in BCD is slow, in general. To multply, use the pen-and-paper algorithm of multiplying digit by digit, then add the partial products by a BCD add. Similarly, a BCD division follows the pen-and-paper algorithm of continuous subtraction until an overflow, and keeping the number of times a number was subtracted, then carry over the remainder, and continue with the next digit.

All these algorithms are slow...

 Thomas Richter 08 September 2020 16:09

Quote:
 Originally Posted by 8bitbubsy (Post 1426472) How is this achieved in a fast way when working with binary?

If you have no division instruction, the same way as in BCD, except that each digit can be either 0 or 1, which simplifies continuous subtraction to a single compare. If you do, well, use the division instruction.

 All times are GMT +2. The time now is 15:02.

Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2021, vBulletin Solutions Inc.

Page generated in 0.06955 seconds with 11 queries