3 ms·
This reminds of another trick on the C64 to multiply two 8 Bit numbers a*b = [ ((a+b)/2)^2 - ((a-b)/2)^2 ] more or less: one 8 bit additon, one 8 bit subtrac
by s-macke 13y ago
This reminds of another trick on the C64 to multiply two 8 Bit numbers
a*b = [ ((a+b)/2)^2 - ((a-b)/2)^2 ]
more or less:
one 8 bit additon, one 8 bit subtraction, two table lookups for the squares and one 16 bit subtraction.
- bane 13y agoWere the divide by twos just bit shift operations? (I have no idea if the 6510 had bit shift operators.)
- s-macke 13y agoWell, I think it is part of the table. http://codebase64.org/doku.php?id=base:fast_8bit_multiplication_16bit_product http://codebase64.org/doku.php?id=base:fast_8bit_multiplicat... But the C64 had also a shifting operation.
- muyuu 13y agoYep, it does. ROL rotate left ROR rotate right ASL arithmetic shift left LSR logic shift right But for it to work for all 2-complement coded values we need to ensure that the MSB is copied back into itself to keep the value the same sign, which can be done with another shift. ; Divide a signed 16-bit value by 2 LDA MEM+1 ;Load the MSB ASL A ;Copy the sign bit into C ROR MEM+1 ;restore MSB ROR MEM+0 ;Rotate the LSB It's a bunch of cycles but nothing compared to a generic division.