base:multiplication_with_a_constant

This shows you the differences between two versions of the page.

Next revision | Previous revision | ||

base:multiplication_with_a_constant [2015-04-17 04:33] 127.0.0.1 external edit |
base:multiplication_with_a_constant [2021-02-10 01:24] (current) strobe fix a typo |
||
---|---|---|---|

Line 1: | Line 1: | ||

====== Multiplication with a constant ====== | ====== Multiplication with a constant ====== | ||

+ | |||

Multiplication by a specific constant can be a lot simpler and faster than a general-purpose routine to multiply two given numbers together. | Multiplication by a specific constant can be a lot simpler and faster than a general-purpose routine to multiply two given numbers together. | ||

Line 14: | Line 15: | ||

adc $2 ; Add the two results together | adc $2 ; Add the two results together | ||

</ | </ | ||

+ | |||

+ | ---- | ||

+ | |||

+ | By TWW: | ||

+ | |||

+ | Optimization of the above posted by unknown: The above is based on 8*A + 2*A. This routine would not allow any higher number than A = 25 as it would overflow (8 * 26) + (2 * 26) = 208 + 52 = 262 (However 25 fits perfectly f.ex. when you'd want to calculate a character line based on Y). | ||

+ | |||

+ | With this in mind, you can do 2*A + 8*A which saves you the asl $2. Also as long as A cannot be higher than 25, the upper 4 bits (high nybble) will always be #%0000. This means that the asl instructions will never set carry and the clc can be dropped. | ||

+ | |||

+ | This gives the following code to multiply A with 10 (assuming A is less than 26): | ||

+ | |||

+ | < | ||

+ | asl // Multiply A with 2 | ||

+ | sta $2 // Store A * 2 for later | ||

+ | asl // Multiply A with 4 | ||

+ | asl // Multiply A with 8 | ||

+ | adc $2 // Add A * 8 + A * 2 | ||

+ | </ | ||

+ | (12 cycles / 7 bytes) vs (17 cycles / 10 bytes) | ||

+ | |||

+ | ---- | ||

You may also use a table, which is even faster, but would take up more space. | You may also use a table, which is even faster, but would take up more space. |

base/multiplication_with_a_constant.1429237983.txt.gz ยท Last modified: 2015-04-17 04:33 by 127.0.0.1