|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 1277 (0x4fd) Types: TextFile Notes: UNIX file Names: »msma.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code └─⟦f4b8d8c84⟧ UNIX Filesystem └─⟦this⟧ »libmp/msma.c«
#include "mprec.h" #include <assert.h> /* * Msma takes the mint pointed to by "to" and adds to it (in place) * the product of the following : * 1. the mint pointed to by "from". * 2. the int "fac" (it is assumed that 0 <= fac < 2 * BASE). * 3. BASE raised to the "shift" power. * Note that it is assumed that the length of "to" is big enough to * hold the result. * It is also assumed that "from" and "to" are distinct. */ void msma(from, fac, shift, to) mint *from, *to; int fac; unsigned shift; { register int carry; register char *fp, *tp; register unsigned count; int mifl; assert(0 <= fac && fac < 2 * BASE); /* general case needs fac != 0, so handle fac == 0 */ if (fac == 0) return; /* find out sign of "from" */ mifl = ispos(from); /* do the multiply assuming "from" is positive */ fp = from->val; tp = to->val + shift; carry = 0; count = from->len; if (!mifl) --count; assert(tp + count <= to->val + to->len); while (count-- != 0) { carry += *tp + *fp++ * fac; *tp++ = carry % BASE; carry >>= L2BASE; } /* propogate carry or borrow */ count = to->val + to->len - tp; if (!mifl) carry -= fac; while (count-- != 0 && carry != 0) { carry += *tp + BASE; *tp++ = carry % BASE; carry = (carry >> L2BASE) - 1; } }