Home » CEEFAX disks » telesoftware5.adl » 07-02-88/T\OSB13

07-02-88/T\OSB13

This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.

Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.

Tape/disk: Home » CEEFAX disks » telesoftware5.adl
Filename: 07-02-88/T\OSB13
Read OK:
File size: 2E02 bytes
Load address: 0000
Exec address: FFFFFFFF
Duplicates

There is 1 duplicate copy of this file in the archive:

File contents
OSBITS - An Exploration of the BBC Micro at Machine Level

By Programmer

...........................................................


Part 13: Multi-Byte Multiplication

While I have no desire to labour the point it is worth
taking a detailed look at multiplication where the numbers
being multiplied are both several bytes long.  I have called
this multi-byte arithmetic although it is often known as
multi-precision arithmetic.

The last module included a routine which multiplied a large
number by a small one; a four byte number by a one byte
number.  The extension of this to arbitrarily large numbers
is straightforward but I want to deal with it separately so
that any confusion that may still be in your mind from last
time is dispelled.

Let's recap on the method employed in multiplication.  It is
exactly like the long multiplication you will have done at
school (and probably not used since) except, of course, that
we will be working in binary.  Ironically this makes it
easier although when working on paper we have to be careful
about binary maths because we are unused to it.

Returning to the single byte example from last time we have
the two numbers 11 and 27 which we want to multiply
together.  11 is 1011 in binary because it is made up of
2^3 + 2^1 + 2^0 (8+2+1) and 27 is 11011 because it is made
up of 2^4 + 2^3 + 2^1 + 2^0 (16+8+2+1).  It is irrelevant
that the numbers are related in a way that is obvious in
binary.

                     11011
                         x
                      1011
                 ---------
                     11011
                    11011o
                  11011ooo
                 ---------
                 100101001

This is how we carried out the multiplication in the last
module.  When we start multiplying large numbers together
though we run into a problem.  If you multiply a number with
x bits by a number with y bits the product has x+y bits (I'm
assuming the numbers are both positive).  If you want to
make sure that your result does not overflow you have to
allow for a result of that size.  This in fact means that
when you do your multiplication you have to have a partial
product workspace that is x+y bits long.  Obviously the more
bits in your partial product workspace the slower the
routine becomes because you are carrying out additions on
more bytes than you want the result to have.

It's worth looking at a different algorithm since there are
several ways of implementing multiplication. First I'll
rewrite the sum above to separate out the two additions.

                     11011
                         x
                      1011
                 ---------
                     11011
                    11011o
                 ---------
                   1010001
                  11011ooo
                 ---------
                 100101001

What we are doing here is shifting the multiplicand left and
then conditionally adding it onto the partial product.  As
an alternative how about shifting the partial product right
instead?  This would look like this:

       11011
           x
        1011
   ---------
       00000       ppws is empty to start with

       11011       lsb of 1011 is 1 so add 11011 to ppws
       11011       new ppws
        1101 1     shift ppws right one bit

       11011       bit 1 of 1011 is 1 so add 11011 to ppws
      101000 1
       10100 01    shift ppws right one bit

       00000       bit 2 of 1011 is 0 so don't add
       10100 01    new ppws
        1010 001   shift ppws right one bit

       11011       bit 3 of 1011 is 1 so add 11011 to ppws
      100101 001   new ppws
       10010 1001  shift ppws right one bit

If we count leading zeros in our multiplier and so carry out
eight operations (the next byte size up) we carry out
another four shifts and get the result

                  1 00101001

On each occasion we are shifting the multiplier right to
start with and then immediately afterwards we shift the ppws
right.  Now this could be a useful feature because if we can
combine the two shifts, multiplier and ppws, into a single
shift operation we will end up with the result in the space
where the multiplier was.

I haven't worried too much about speed before.  With the
number translation program last time the speed of the user
was the limiting factor anyway, so speed considerations were
irrelevant.  With a multiplication speed is a very important
consideration so let's look at the algorithm we have come up
with now.

    Clear ppws (partial product work space)
    Shift multiplier right, puts lsb into carry flag
    If carry set add multiplicand to ppws
    Shift ppws and multiplier right
    Repeat last two lines until all bits processed

When you have finished the lower bytes of the result have
replaced the multiplicand and the 'overflow' remains in the
ppws.  Now that looks short and to the point, the only
asymmetrical part being the initial shift, but we've got to
start somewhere.

So let's turn it into a program.

When rotating a multi-byte number you start at the far end,
(i.e. if rotating left start at the right and vice versa)
and use ASL or LSR as the first rotation so that you do not
shift the carry value in, because you do not want it!  The
other rotates will be ROL or ROR because then you use the
carry to carry the relevant bit over from one byte to the
next.  In this case we will treat the ppws and multiplier as
a single long block of memory with the ppws to the left of
the multiplier.

There is no limit to the size of numbers you can multiply
together with this method.  Remember that a four byte number
multiplied by another four byte number can result in an
eight byte result, so you have to allow for this
possibility.  If we were dealing solely with positive
numbers then, by treating the ppws and multiplier as a
single piece of work space, we would automatically have
enough room for a large result.  We could test for an
overflow by looking to see if anything was in the top 4
bytes.

A negative number with 4 bytes is defined as one with the
top most bit (bit 31) set.  Clearly if we are working to a
64 bit result then that number should be held in memory in
8 bytes with the top bit (number 63) set.  All the bits
between 31 and 63 would also be set.  To make this routine
operate totally correctly for negative numbers we would have
to expand the multiplier and multiplicand into 64 bit
numbers and have a routine that ran through 64 times instead
of 32.  For simplicity I have not done so.  The result is
that it is possible to generate a result (positive or
negative) that is too big but it is very difficult to trap.

The simplest solution would be to check to see what sign the
result should be and then convert both numbers to positive,
carry out the multiplication, and convert back afterwards if
needed.  Then you could just check to see if anything was
left in ppws after the multiplication.  Anything there would
indicate an overflow and hence an error.  Although we didn't
error trap the addition and subtraction in module 2 it could
have easily been done by branching to the error code
whenever the overflow flag was set after adding or
subtracting the highest byte.

The input routine in the last module can be modified to
always give a positive result and an indication of sign.
I am not going to use that input module here because all the
superfluous code is likely to cloud the main issue, which is
the multiplication.  I leave it to you to bolt the routines
together.  So I use dear old BASIC indirection operators to
put the numbers to be multiplied into the workspace and to
read the result out afterwards.

The multiplicand goes into 'multiplicand' and the multiplier
goes into 'multiplier'.  'ppws' is the partial product
workspace.  This arrangement fits nicely with the
requirement for ppws and multiplier to be together.  [In
fact the memory used for multi-byte maths does not need to
be contiguous, in a block, but it is sensible to have it
so.]

A further note on speed.  The 6502 works faster when it is
using zero page workspace, so we should really use some of
this for our routines.  I am not going to in this example
because it keeps a consistency with earlier modules and I
leave it to you to make the adjustment if you want to.  It
doesn't affect the algorithm at all.

Firstly the workspace is cleared and then a counter is
initialised to the number of bits in the numbers.  Since
this routine will cope with negative numbers as easily as
positive ones (2's complement negative that is) we will need
all 32 bits.  -1 is &FFFFFFFF (I will refrain from printing
out 32 '1's just to illustrate this point.)

The first thing that happens in the code is that we clear
our partial product workspace and set the bit counter to 32
(or however many bits you are working with).  To get our
algorithm ready we have to first rotate or shift the
multiplier right to put its least significant bit (lsb) into
the carry flag.  We can then use branches on carry to decide
whether or not to add the multiplicand onto the contents of
the partial product workspace.

'mbm_loop' (for multi-byte multiplication) is the top of the
main loop.  In it we first check the carry flag to see if
the lsb of the multiplier was set.  If it was then we will
add the multiplicand onto the ppws but if not the program
goes to 'no_add_mbm' where both the ppws and the multiplier
are rotated right.  (Where I refer to 'ws_something' I mean
the group of bytes that make up that word, in this case
'multiplicand' to 'multiplicand+3'.)  This rotation puts the
lsb of the multiplier into the carry flag ready for another
run around the loop.

Remember we rotate the ppws and multiplier each time we go
around the loop whether or not we add the multiplicand to
the partial product.  Following the rotation the X register,
which is counting the loop for us, is reduced by one. 
Counting down is usually better than counting up because a
simple BNE will suffice to trap zero rather than having to
CMP with anything.  Here we BNE back to 'mbm_loop'.

When we finally fall through the BNE we reach an RTS which
finishes the routine.  The four byte result is in
'multiplier' with any overflow in 'ppws'.  Then follow the
three FNEQUM functions that reserve memory for the
workspace.  If you have BASIC 2 or later you can replace
them with EQUD 0 in each case.

The BASIC at the end prints out the result with a check and
tells you what exactly is in 'ppws' and 'multiplier' so you
can see what happens if you enter large numbers.  However,
for a product under 32 bytes the results will be correct for
positive and negative.

Multiplication and division routines are amongst the most
time sensitive in maths.  In an early module when I said
that you might wish to do more than just multiply faster I
was in fact hiding the truth.  The routines in BBC BASIC are
so efficient that you can multiply two integers together
faster from his BASIC than with this code here.  However I
am aiming for clarity (built for comfort not for speed I
believe) which is my excuse and I will stick to it.

If you wish to expand (or contract) this routine to work
with a different number of bytes you simply change the size
of the workspace areas accordingly and add or subtract from
the lists of LDA/ADC/STAs and LSR/RORs.  Remember that by
convention with the 6502 a multi-byte number is stored with
its lowest significant byte in the lowest memory location
and the most significant byte in the highest location.  This
results from the way a 16 bit address must be stored with
the less significant byte first.

Next time we move on to division and an output routine which
needs division to operate.  Then on to a general division
routine similar to the multiplication one in this module.
00000000  4f 53 42 49 54 53 20 2d  20 41 6e 20 45 78 70 6c  |OSBITS - An Expl|
00000010  6f 72 61 74 69 6f 6e 20  6f 66 20 74 68 65 20 42  |oration of the B|
00000020  42 43 20 4d 69 63 72 6f  20 61 74 20 4d 61 63 68  |BC Micro at Mach|
00000030  69 6e 65 20 4c 65 76 65  6c 0d 0d 42 79 20 50 72  |ine Level..By Pr|
00000040  6f 67 72 61 6d 6d 65 72  0d 0d 2e 2e 2e 2e 2e 2e  |ogrammer........|
00000050  2e 2e 2e 2e 2e 2e 2e 2e  2e 2e 2e 2e 2e 2e 2e 2e  |................|
*
00000080  2e 2e 2e 2e 2e 0d 0d 0d  50 61 72 74 20 31 33 3a  |........Part 13:|
00000090  20 4d 75 6c 74 69 2d 42  79 74 65 20 4d 75 6c 74  | Multi-Byte Mult|
000000a0  69 70 6c 69 63 61 74 69  6f 6e 0d 0d 57 68 69 6c  |iplication..Whil|
000000b0  65 20 49 20 68 61 76 65  20 6e 6f 20 64 65 73 69  |e I have no desi|
000000c0  72 65 20 74 6f 20 6c 61  62 6f 75 72 20 74 68 65  |re to labour the|
000000d0  20 70 6f 69 6e 74 20 69  74 20 69 73 20 77 6f 72  | point it is wor|
000000e0  74 68 0d 74 61 6b 69 6e  67 20 61 20 64 65 74 61  |th.taking a deta|
000000f0  69 6c 65 64 20 6c 6f 6f  6b 20 61 74 20 6d 75 6c  |iled look at mul|
00000100  74 69 70 6c 69 63 61 74  69 6f 6e 20 77 68 65 72  |tiplication wher|
00000110  65 20 74 68 65 20 6e 75  6d 62 65 72 73 0d 62 65  |e the numbers.be|
00000120  69 6e 67 20 6d 75 6c 74  69 70 6c 69 65 64 20 61  |ing multiplied a|
00000130  72 65 20 62 6f 74 68 20  73 65 76 65 72 61 6c 20  |re both several |
00000140  62 79 74 65 73 20 6c 6f  6e 67 2e 20 20 49 20 68  |bytes long.  I h|
00000150  61 76 65 20 63 61 6c 6c  65 64 0d 74 68 69 73 20  |ave called.this |
00000160  6d 75 6c 74 69 2d 62 79  74 65 20 61 72 69 74 68  |multi-byte arith|
00000170  6d 65 74 69 63 20 61 6c  74 68 6f 75 67 68 20 69  |metic although i|
00000180  74 20 69 73 20 6f 66 74  65 6e 20 6b 6e 6f 77 6e  |t is often known|
00000190  20 61 73 0d 6d 75 6c 74  69 2d 70 72 65 63 69 73  | as.multi-precis|
000001a0  69 6f 6e 20 61 72 69 74  68 6d 65 74 69 63 2e 0d  |ion arithmetic..|
000001b0  0d 54 68 65 20 6c 61 73  74 20 6d 6f 64 75 6c 65  |.The last module|
000001c0  20 69 6e 63 6c 75 64 65  64 20 61 20 72 6f 75 74  | included a rout|
000001d0  69 6e 65 20 77 68 69 63  68 20 6d 75 6c 74 69 70  |ine which multip|
000001e0  6c 69 65 64 20 61 20 6c  61 72 67 65 0d 6e 75 6d  |lied a large.num|
000001f0  62 65 72 20 62 79 20 61  20 73 6d 61 6c 6c 20 6f  |ber by a small o|
00000200  6e 65 3b 20 61 20 66 6f  75 72 20 62 79 74 65 20  |ne; a four byte |
00000210  6e 75 6d 62 65 72 20 62  79 20 61 20 6f 6e 65 20  |number by a one |
00000220  62 79 74 65 0d 6e 75 6d  62 65 72 2e 20 20 54 68  |byte.number.  Th|
00000230  65 20 65 78 74 65 6e 73  69 6f 6e 20 6f 66 20 74  |e extension of t|
00000240  68 69 73 20 74 6f 20 61  72 62 69 74 72 61 72 69  |his to arbitrari|
00000250  6c 79 20 6c 61 72 67 65  20 6e 75 6d 62 65 72 73  |ly large numbers|
00000260  0d 69 73 20 73 74 72 61  69 67 68 74 66 6f 72 77  |.is straightforw|
00000270  61 72 64 20 62 75 74 20  49 20 77 61 6e 74 20 74  |ard but I want t|
00000280  6f 20 64 65 61 6c 20 77  69 74 68 20 69 74 20 73  |o deal with it s|
00000290  65 70 61 72 61 74 65 6c  79 20 73 6f 0d 74 68 61  |eparately so.tha|
000002a0  74 20 61 6e 79 20 63 6f  6e 66 75 73 69 6f 6e 20  |t any confusion |
000002b0  74 68 61 74 20 6d 61 79  20 73 74 69 6c 6c 20 62  |that may still b|
000002c0  65 20 69 6e 20 79 6f 75  72 20 6d 69 6e 64 20 66  |e in your mind f|
000002d0  72 6f 6d 20 6c 61 73 74  0d 74 69 6d 65 20 69 73  |rom last.time is|
000002e0  20 64 69 73 70 65 6c 6c  65 64 2e 0d 0d 4c 65 74  | dispelled...Let|
000002f0  27 73 20 72 65 63 61 70  20 6f 6e 20 74 68 65 20  |'s recap on the |
00000300  6d 65 74 68 6f 64 20 65  6d 70 6c 6f 79 65 64 20  |method employed |
00000310  69 6e 20 6d 75 6c 74 69  70 6c 69 63 61 74 69 6f  |in multiplicatio|
00000320  6e 2e 20 20 49 74 20 69  73 0d 65 78 61 63 74 6c  |n.  It is.exactl|
00000330  79 20 6c 69 6b 65 20 74  68 65 20 6c 6f 6e 67 20  |y like the long |
00000340  6d 75 6c 74 69 70 6c 69  63 61 74 69 6f 6e 20 79  |multiplication y|
00000350  6f 75 20 77 69 6c 6c 20  68 61 76 65 20 64 6f 6e  |ou will have don|
00000360  65 20 61 74 0d 73 63 68  6f 6f 6c 20 28 61 6e 64  |e at.school (and|
00000370  20 70 72 6f 62 61 62 6c  79 20 6e 6f 74 20 75 73  | probably not us|
00000380  65 64 20 73 69 6e 63 65  29 20 65 78 63 65 70 74  |ed since) except|
00000390  2c 20 6f 66 20 63 6f 75  72 73 65 2c 20 74 68 61  |, of course, tha|
000003a0  74 0d 77 65 20 77 69 6c  6c 20 62 65 20 77 6f 72  |t.we will be wor|
000003b0  6b 69 6e 67 20 69 6e 20  62 69 6e 61 72 79 2e 20  |king in binary. |
000003c0  20 49 72 6f 6e 69 63 61  6c 6c 79 20 74 68 69 73  | Ironically this|
000003d0  20 6d 61 6b 65 73 20 69  74 0d 65 61 73 69 65 72  | makes it.easier|
000003e0  20 61 6c 74 68 6f 75 67  68 20 77 68 65 6e 20 77  | although when w|
000003f0  6f 72 6b 69 6e 67 20 6f  6e 20 70 61 70 65 72 20  |orking on paper |
00000400  77 65 20 68 61 76 65 20  74 6f 20 62 65 20 63 61  |we have to be ca|
00000410  72 65 66 75 6c 0d 61 62  6f 75 74 20 62 69 6e 61  |reful.about bina|
00000420  72 79 20 6d 61 74 68 73  20 62 65 63 61 75 73 65  |ry maths because|
00000430  20 77 65 20 61 72 65 20  75 6e 75 73 65 64 20 74  | we are unused t|
00000440  6f 20 69 74 2e 0d 0d 52  65 74 75 72 6e 69 6e 67  |o it...Returning|
00000450  20 74 6f 20 74 68 65 20  73 69 6e 67 6c 65 20 62  | to the single b|
00000460  79 74 65 20 65 78 61 6d  70 6c 65 20 66 72 6f 6d  |yte example from|
00000470  20 6c 61 73 74 20 74 69  6d 65 20 77 65 20 68 61  | last time we ha|
00000480  76 65 0d 74 68 65 20 74  77 6f 20 6e 75 6d 62 65  |ve.the two numbe|
00000490  72 73 20 31 31 20 61 6e  64 20 32 37 20 77 68 69  |rs 11 and 27 whi|
000004a0  63 68 20 77 65 20 77 61  6e 74 20 74 6f 20 6d 75  |ch we want to mu|
000004b0  6c 74 69 70 6c 79 0d 74  6f 67 65 74 68 65 72 2e  |ltiply.together.|
000004c0  20 20 31 31 20 69 73 20  31 30 31 31 20 69 6e 20  |  11 is 1011 in |
000004d0  62 69 6e 61 72 79 20 62  65 63 61 75 73 65 20 69  |binary because i|
000004e0  74 20 69 73 20 6d 61 64  65 20 75 70 20 6f 66 0d  |t is made up of.|
000004f0  32 5e 33 20 2b 20 32 5e  31 20 2b 20 32 5e 30 20  |2^3 + 2^1 + 2^0 |
00000500  28 38 2b 32 2b 31 29 20  61 6e 64 20 32 37 20 69  |(8+2+1) and 27 i|
00000510  73 20 31 31 30 31 31 20  62 65 63 61 75 73 65 20  |s 11011 because |
00000520  69 74 20 69 73 20 6d 61  64 65 0d 75 70 20 6f 66  |it is made.up of|
00000530  20 32 5e 34 20 2b 20 32  5e 33 20 2b 20 32 5e 31  | 2^4 + 2^3 + 2^1|
00000540  20 2b 20 32 5e 30 20 28  31 36 2b 38 2b 32 2b 31  | + 2^0 (16+8+2+1|
00000550  29 2e 20 20 49 74 20 69  73 20 69 72 72 65 6c 65  |).  It is irrele|
00000560  76 61 6e 74 0d 74 68 61  74 20 74 68 65 20 6e 75  |vant.that the nu|
00000570  6d 62 65 72 73 20 61 72  65 20 72 65 6c 61 74 65  |mbers are relate|
00000580  64 20 69 6e 20 61 20 77  61 79 20 74 68 61 74 20  |d in a way that |
00000590  69 73 20 6f 62 76 69 6f  75 73 20 69 6e 0d 62 69  |is obvious in.bi|
000005a0  6e 61 72 79 2e 0d 0d 20  20 20 20 20 20 20 20 20  |nary...         |
000005b0  20 20 20 20 20 20 20 20  20 20 20 20 31 31 30 31  |            1101|
000005c0  31 0d 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |1.              |
000005d0  20 20 20 20 20 20 20 20  20 20 20 78 0d 20 20 20  |           x.   |
000005e0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
000005f0  20 20 20 31 30 31 31 0d  20 20 20 20 20 20 20 20  |   1011.        |
00000600  20 20 20 20 20 20 20 20  20 2d 2d 2d 2d 2d 2d 2d  |         -------|
00000610  2d 2d 0d 20 20 20 20 20  20 20 20 20 20 20 20 20  |--.             |
00000620  20 20 20 20 20 20 20 20  31 31 30 31 31 0d 20 20  |        11011.  |
00000630  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000640  20 20 31 31 30 31 31 6f  0d 20 20 20 20 20 20 20  |  11011o.       |
00000650  20 20 20 20 20 20 20 20  20 20 20 31 31 30 31 31  |           11011|
00000660  6f 6f 6f 0d 20 20 20 20  20 20 20 20 20 20 20 20  |ooo.            |
00000670  20 20 20 20 20 2d 2d 2d  2d 2d 2d 2d 2d 2d 0d 20  |     ---------. |
00000680  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000690  31 30 30 31 30 31 30 30  31 0d 0d 54 68 69 73 20  |100101001..This |
000006a0  69 73 20 68 6f 77 20 77  65 20 63 61 72 72 69 65  |is how we carrie|
000006b0  64 20 6f 75 74 20 74 68  65 20 6d 75 6c 74 69 70  |d out the multip|
000006c0  6c 69 63 61 74 69 6f 6e  20 69 6e 20 74 68 65 20  |lication in the |
000006d0  6c 61 73 74 0d 6d 6f 64  75 6c 65 2e 20 20 57 68  |last.module.  Wh|
000006e0  65 6e 20 77 65 20 73 74  61 72 74 20 6d 75 6c 74  |en we start mult|
000006f0  69 70 6c 79 69 6e 67 20  6c 61 72 67 65 20 6e 75  |iplying large nu|
00000700  6d 62 65 72 73 20 74 6f  67 65 74 68 65 72 0d 74  |mbers together.t|
00000710  68 6f 75 67 68 20 77 65  20 72 75 6e 20 69 6e 74  |hough we run int|
00000720  6f 20 61 20 70 72 6f 62  6c 65 6d 2e 20 20 49 66  |o a problem.  If|
00000730  20 79 6f 75 20 6d 75 6c  74 69 70 6c 79 20 61 20  | you multiply a |
00000740  6e 75 6d 62 65 72 20 77  69 74 68 0d 78 20 62 69  |number with.x bi|
00000750  74 73 20 62 79 20 61 20  6e 75 6d 62 65 72 20 77  |ts by a number w|
00000760  69 74 68 20 79 20 62 69  74 73 20 74 68 65 20 70  |ith y bits the p|
00000770  72 6f 64 75 63 74 20 68  61 73 20 78 2b 79 20 62  |roduct has x+y b|
00000780  69 74 73 20 28 49 27 6d  0d 61 73 73 75 6d 69 6e  |its (I'm.assumin|
00000790  67 20 74 68 65 20 6e 75  6d 62 65 72 73 20 61 72  |g the numbers ar|
000007a0  65 20 62 6f 74 68 20 70  6f 73 69 74 69 76 65 29  |e both positive)|
000007b0  2e 20 20 49 66 20 79 6f  75 20 77 61 6e 74 20 74  |.  If you want t|
000007c0  6f 0d 6d 61 6b 65 20 73  75 72 65 20 74 68 61 74  |o.make sure that|
000007d0  20 79 6f 75 72 20 72 65  73 75 6c 74 20 64 6f 65  | your result doe|
000007e0  73 20 6e 6f 74 20 6f 76  65 72 66 6c 6f 77 20 79  |s not overflow y|
000007f0  6f 75 20 68 61 76 65 20  74 6f 0d 61 6c 6c 6f 77  |ou have to.allow|
00000800  20 66 6f 72 20 61 20 72  65 73 75 6c 74 20 6f 66  | for a result of|
00000810  20 74 68 61 74 20 73 69  7a 65 2e 20 20 54 68 69  | that size.  Thi|
00000820  73 20 69 6e 20 66 61 63  74 20 6d 65 61 6e 73 20  |s in fact means |
00000830  74 68 61 74 0d 77 68 65  6e 20 79 6f 75 20 64 6f  |that.when you do|
00000840  20 79 6f 75 72 20 6d 75  6c 74 69 70 6c 69 63 61  | your multiplica|
00000850  74 69 6f 6e 20 79 6f 75  20 68 61 76 65 20 74 6f  |tion you have to|
00000860  20 68 61 76 65 20 61 20  70 61 72 74 69 61 6c 0d  | have a partial.|
00000870  70 72 6f 64 75 63 74 20  77 6f 72 6b 73 70 61 63  |product workspac|
00000880  65 20 74 68 61 74 20 69  73 20 78 2b 79 20 62 69  |e that is x+y bi|
00000890  74 73 20 6c 6f 6e 67 2e  20 20 4f 62 76 69 6f 75  |ts long.  Obviou|
000008a0  73 6c 79 20 74 68 65 20  6d 6f 72 65 0d 62 69 74  |sly the more.bit|
000008b0  73 20 69 6e 20 79 6f 75  72 20 70 61 72 74 69 61  |s in your partia|
000008c0  6c 20 70 72 6f 64 75 63  74 20 77 6f 72 6b 73 70  |l product worksp|
000008d0  61 63 65 20 74 68 65 20  73 6c 6f 77 65 72 20 74  |ace the slower t|
000008e0  68 65 0d 72 6f 75 74 69  6e 65 20 62 65 63 6f 6d  |he.routine becom|
000008f0  65 73 20 62 65 63 61 75  73 65 20 79 6f 75 20 61  |es because you a|
00000900  72 65 20 63 61 72 72 79  69 6e 67 20 6f 75 74 20  |re carrying out |
00000910  61 64 64 69 74 69 6f 6e  73 20 6f 6e 0d 6d 6f 72  |additions on.mor|
00000920  65 20 62 79 74 65 73 20  74 68 61 6e 20 79 6f 75  |e bytes than you|
00000930  20 77 61 6e 74 20 74 68  65 20 72 65 73 75 6c 74  | want the result|
00000940  20 74 6f 20 68 61 76 65  2e 0d 0d 49 74 27 73 20  | to have...It's |
00000950  77 6f 72 74 68 20 6c 6f  6f 6b 69 6e 67 20 61 74  |worth looking at|
00000960  20 61 20 64 69 66 66 65  72 65 6e 74 20 61 6c 67  | a different alg|
00000970  6f 72 69 74 68 6d 20 73  69 6e 63 65 20 74 68 65  |orithm since the|
00000980  72 65 20 61 72 65 0d 73  65 76 65 72 61 6c 20 77  |re are.several w|
00000990  61 79 73 20 6f 66 20 69  6d 70 6c 65 6d 65 6e 74  |ays of implement|
000009a0  69 6e 67 20 6d 75 6c 74  69 70 6c 69 63 61 74 69  |ing multiplicati|
000009b0  6f 6e 2e 20 46 69 72 73  74 20 49 27 6c 6c 0d 72  |on. First I'll.r|
000009c0  65 77 72 69 74 65 20 74  68 65 20 73 75 6d 20 61  |ewrite the sum a|
000009d0  62 6f 76 65 20 74 6f 20  73 65 70 61 72 61 74 65  |bove to separate|
000009e0  20 6f 75 74 20 74 68 65  20 74 77 6f 20 61 64 64  | out the two add|
000009f0  69 74 69 6f 6e 73 2e 0d  0d 20 20 20 20 20 20 20  |itions...       |
00000a00  20 20 20 20 20 20 20 20  20 20 20 20 20 20 31 31  |              11|
00000a10  30 31 31 0d 20 20 20 20  20 20 20 20 20 20 20 20  |011.            |
00000a20  20 20 20 20 20 20 20 20  20 20 20 20 20 78 0d 20  |             x. |
00000a30  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000a40  20 20 20 20 20 31 30 31  31 0d 20 20 20 20 20 20  |     1011.      |
00000a50  20 20 20 20 20 20 20 20  20 20 20 2d 2d 2d 2d 2d  |           -----|
00000a60  2d 2d 2d 2d 0d 20 20 20  20 20 20 20 20 20 20 20  |----.           |
00000a70  20 20 20 20 20 20 20 20  20 20 31 31 30 31 31 0d  |          11011.|
00000a80  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000a90  20 20 20 20 31 31 30 31  31 6f 0d 20 20 20 20 20  |    11011o.     |
00000aa0  20 20 20 20 20 20 20 20  20 20 20 20 2d 2d 2d 2d  |            ----|
00000ab0  2d 2d 2d 2d 2d 0d 20 20  20 20 20 20 20 20 20 20  |-----.          |
00000ac0  20 20 20 20 20 20 20 20  20 31 30 31 30 30 30 31  |         1010001|
00000ad0  0d 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |.               |
00000ae0  20 20 20 31 31 30 31 31  6f 6f 6f 0d 20 20 20 20  |   11011ooo.    |
00000af0  20 20 20 20 20 20 20 20  20 20 20 20 20 2d 2d 2d  |             ---|
00000b00  2d 2d 2d 2d 2d 2d 0d 20  20 20 20 20 20 20 20 20  |------.         |
00000b10  20 20 20 20 20 20 20 20  31 30 30 31 30 31 30 30  |        10010100|
00000b20  31 0d 0d 57 68 61 74 20  77 65 20 61 72 65 20 64  |1..What we are d|
00000b30  6f 69 6e 67 20 68 65 72  65 20 69 73 20 73 68 69  |oing here is shi|
00000b40  66 74 69 6e 67 20 74 68  65 20 6d 75 6c 74 69 70  |fting the multip|
00000b50  6c 69 63 61 6e 64 20 6c  65 66 74 20 61 6e 64 0d  |licand left and.|
00000b60  74 68 65 6e 20 63 6f 6e  64 69 74 69 6f 6e 61 6c  |then conditional|
00000b70  6c 79 20 61 64 64 69 6e  67 20 69 74 20 6f 6e 74  |ly adding it ont|
00000b80  6f 20 74 68 65 20 70 61  72 74 69 61 6c 20 70 72  |o the partial pr|
00000b90  6f 64 75 63 74 2e 20 20  41 73 0d 61 6e 20 61 6c  |oduct.  As.an al|
00000ba0  74 65 72 6e 61 74 69 76  65 20 68 6f 77 20 61 62  |ternative how ab|
00000bb0  6f 75 74 20 73 68 69 66  74 69 6e 67 20 74 68 65  |out shifting the|
00000bc0  20 70 61 72 74 69 61 6c  20 70 72 6f 64 75 63 74  | partial product|
00000bd0  20 72 69 67 68 74 0d 69  6e 73 74 65 61 64 3f 20  | right.instead? |
00000be0  20 54 68 69 73 20 77 6f  75 6c 64 20 6c 6f 6f 6b  | This would look|
00000bf0  20 6c 69 6b 65 20 74 68  69 73 3a 0d 0d 20 20 20  | like this:..   |
00000c00  20 20 20 20 31 31 30 31  31 0d 20 20 20 20 20 20  |    11011.      |
00000c10  20 20 20 20 20 78 0d 20  20 20 20 20 20 20 20 31  |     x.        1|
00000c20  30 31 31 0d 20 20 20 2d  2d 2d 2d 2d 2d 2d 2d 2d  |011.   ---------|
00000c30  0d 20 20 20 20 20 20 20  30 30 30 30 30 20 20 20  |.       00000   |
00000c40  20 20 20 20 70 70 77 73  20 69 73 20 65 6d 70 74  |    ppws is empt|
00000c50  79 20 74 6f 20 73 74 61  72 74 20 77 69 74 68 0d  |y to start with.|
00000c60  0d 20 20 20 20 20 20 20  31 31 30 31 31 20 20 20  |.       11011   |
00000c70  20 20 20 20 6c 73 62 20  6f 66 20 31 30 31 31 20  |    lsb of 1011 |
00000c80  69 73 20 31 20 73 6f 20  61 64 64 20 31 31 30 31  |is 1 so add 1101|
00000c90  31 20 74 6f 20 70 70 77  73 0d 20 20 20 20 20 20  |1 to ppws.      |
00000ca0  20 31 31 30 31 31 20 20  20 20 20 20 20 6e 65 77  | 11011       new|
00000cb0  20 70 70 77 73 0d 20 20  20 20 20 20 20 20 31 31  | ppws.        11|
00000cc0  30 31 20 31 20 20 20 20  20 73 68 69 66 74 20 70  |01 1     shift p|
00000cd0  70 77 73 20 72 69 67 68  74 20 6f 6e 65 20 62 69  |pws right one bi|
00000ce0  74 0d 0d 20 20 20 20 20  20 20 31 31 30 31 31 20  |t..       11011 |
00000cf0  20 20 20 20 20 20 62 69  74 20 31 20 6f 66 20 31  |      bit 1 of 1|
00000d00  30 31 31 20 69 73 20 31  20 73 6f 20 61 64 64 20  |011 is 1 so add |
00000d10  31 31 30 31 31 20 74 6f  20 70 70 77 73 0d 20 20  |11011 to ppws.  |
00000d20  20 20 20 20 31 30 31 30  30 30 20 31 0d 20 20 20  |    101000 1.   |
00000d30  20 20 20 20 31 30 31 30  30 20 30 31 20 20 20 20  |    10100 01    |
00000d40  73 68 69 66 74 20 70 70  77 73 20 72 69 67 68 74  |shift ppws right|
00000d50  20 6f 6e 65 20 62 69 74  0d 0d 20 20 20 20 20 20  | one bit..      |
00000d60  20 30 30 30 30 30 20 20  20 20 20 20 20 62 69 74  | 00000       bit|
00000d70  20 32 20 6f 66 20 31 30  31 31 20 69 73 20 30 20  | 2 of 1011 is 0 |
00000d80  73 6f 20 64 6f 6e 27 74  20 61 64 64 0d 20 20 20  |so don't add.   |
00000d90  20 20 20 20 31 30 31 30  30 20 30 31 20 20 20 20  |    10100 01    |
00000da0  6e 65 77 20 70 70 77 73  0d 20 20 20 20 20 20 20  |new ppws.       |
00000db0  20 31 30 31 30 20 30 30  31 20 20 20 73 68 69 66  | 1010 001   shif|
00000dc0  74 20 70 70 77 73 20 72  69 67 68 74 20 6f 6e 65  |t ppws right one|
00000dd0  20 62 69 74 0d 0d 20 20  20 20 20 20 20 31 31 30  | bit..       110|
00000de0  31 31 20 20 20 20 20 20  20 62 69 74 20 33 20 6f  |11       bit 3 o|
00000df0  66 20 31 30 31 31 20 69  73 20 31 20 73 6f 20 61  |f 1011 is 1 so a|
00000e00  64 64 20 31 31 30 31 31  20 74 6f 20 70 70 77 73  |dd 11011 to ppws|
00000e10  0d 20 20 20 20 20 20 31  30 30 31 30 31 20 30 30  |.      100101 00|
00000e20  31 20 20 20 6e 65 77 20  70 70 77 73 0d 20 20 20  |1   new ppws.   |
00000e30  20 20 20 20 31 30 30 31  30 20 31 30 30 31 20 20  |    10010 1001  |
00000e40  73 68 69 66 74 20 70 70  77 73 20 72 69 67 68 74  |shift ppws right|
00000e50  20 6f 6e 65 20 62 69 74  0d 0d 49 66 20 77 65 20  | one bit..If we |
00000e60  63 6f 75 6e 74 20 6c 65  61 64 69 6e 67 20 7a 65  |count leading ze|
00000e70  72 6f 73 20 69 6e 20 6f  75 72 20 6d 75 6c 74 69  |ros in our multi|
00000e80  70 6c 69 65 72 20 61 6e  64 20 73 6f 20 63 61 72  |plier and so car|
00000e90  72 79 20 6f 75 74 0d 65  69 67 68 74 20 6f 70 65  |ry out.eight ope|
00000ea0  72 61 74 69 6f 6e 73 20  28 74 68 65 20 6e 65 78  |rations (the nex|
00000eb0  74 20 62 79 74 65 20 73  69 7a 65 20 75 70 29 20  |t byte size up) |
00000ec0  77 65 20 63 61 72 72 79  20 6f 75 74 0d 61 6e 6f  |we carry out.ano|
00000ed0  74 68 65 72 20 66 6f 75  72 20 73 68 69 66 74 73  |ther four shifts|
00000ee0  20 61 6e 64 20 67 65 74  20 74 68 65 20 72 65 73  | and get the res|
00000ef0  75 6c 74 0d 0d 20 20 20  20 20 20 20 20 20 20 20  |ult..           |
00000f00  20 20 20 20 20 20 20 31  20 30 30 31 30 31 30 30  |       1 0010100|
00000f10  31 0d 0d 4f 6e 20 65 61  63 68 20 6f 63 63 61 73  |1..On each occas|
00000f20  69 6f 6e 20 77 65 20 61  72 65 20 73 68 69 66 74  |ion we are shift|
00000f30  69 6e 67 20 74 68 65 20  6d 75 6c 74 69 70 6c 69  |ing the multipli|
00000f40  65 72 20 72 69 67 68 74  20 74 6f 0d 73 74 61 72  |er right to.star|
00000f50  74 20 77 69 74 68 20 61  6e 64 20 74 68 65 6e 20  |t with and then |
00000f60  69 6d 6d 65 64 69 61 74  65 6c 79 20 61 66 74 65  |immediately afte|
00000f70  72 77 61 72 64 73 20 77  65 20 73 68 69 66 74 20  |rwards we shift |
00000f80  74 68 65 20 70 70 77 73  0d 72 69 67 68 74 2e 20  |the ppws.right. |
00000f90  20 4e 6f 77 20 74 68 69  73 20 63 6f 75 6c 64 20  | Now this could |
00000fa0  62 65 20 61 20 75 73 65  66 75 6c 20 66 65 61 74  |be a useful feat|
00000fb0  75 72 65 20 62 65 63 61  75 73 65 20 69 66 20 77  |ure because if w|
00000fc0  65 20 63 61 6e 0d 63 6f  6d 62 69 6e 65 20 74 68  |e can.combine th|
00000fd0  65 20 74 77 6f 20 73 68  69 66 74 73 2c 20 6d 75  |e two shifts, mu|
00000fe0  6c 74 69 70 6c 69 65 72  20 61 6e 64 20 70 70 77  |ltiplier and ppw|
00000ff0  73 2c 20 69 6e 74 6f 20  61 20 73 69 6e 67 6c 65  |s, into a single|
00001000  0d 73 68 69 66 74 1a 20  6f 70 65 72 61 74 69 6f  |.shift. operatio|
00001010  6e 20 77 65 20 77 69 6c  6c 20 65 6e 64 20 75 70  |n we will end up|
00001020  20 77 69 74 68 20 74 68  65 20 72 65 73 75 6c 74  | with the result|
00001030  20 69 6e 20 74 68 65 20  73 70 61 63 65 0d 77 68  | in the space.wh|
00001040  65 72 65 20 74 68 65 20  6d 75 6c 74 69 70 6c 69  |ere the multipli|
00001050  65 72 20 77 61 73 2e 0d  0d 49 20 68 61 76 65 6e  |er was...I haven|
00001060  27 74 20 77 6f 72 72 69  65 64 20 74 6f 6f 20 6d  |'t worried too m|
00001070  75 63 68 20 61 62 6f 75  74 20 73 70 65 65 64 20  |uch about speed |
00001080  62 65 66 6f 72 65 2e 20  20 57 69 74 68 20 74 68  |before.  With th|
00001090  65 0d 6e 75 6d 62 65 72  20 74 72 61 6e 73 6c 61  |e.number transla|
000010a0  74 69 6f 6e 20 70 72 6f  67 72 61 6d 20 6c 61 73  |tion program las|
000010b0  74 20 74 69 6d 65 20 74  68 65 20 73 70 65 65 64  |t time the speed|
000010c0  20 6f 66 20 74 68 65 20  75 73 65 72 0d 77 61 73  | of the user.was|
000010d0  20 74 68 65 20 6c 69 6d  69 74 69 6e 67 20 66 61  | the limiting fa|
000010e0  63 74 6f 72 20 61 6e 79  77 61 79 2c 20 73 6f 20  |ctor anyway, so |
000010f0  73 70 65 65 64 20 63 6f  6e 73 69 64 65 72 61 74  |speed considerat|
00001100  69 6f 6e 73 20 77 65 72  65 0d 69 72 72 65 6c 65  |ions were.irrele|
00001110  76 61 6e 74 2e 20 20 57  69 74 68 20 61 20 6d 75  |vant.  With a mu|
00001120  6c 74 69 70 6c 69 63 61  74 69 6f 6e 20 73 70 65  |ltiplication spe|
00001130  65 64 20 69 73 20 61 20  76 65 72 79 20 69 6d 70  |ed is a very imp|
00001140  6f 72 74 61 6e 74 0d 63  6f 6e 73 69 64 65 72 61  |ortant.considera|
00001150  74 69 6f 6e 20 73 6f 20  6c 65 74 27 73 20 6c 6f  |tion so let's lo|
00001160  6f 6b 20 61 74 20 74 68  65 20 61 6c 67 6f 72 69  |ok at the algori|
00001170  74 68 6d 20 77 65 20 68  61 76 65 20 63 6f 6d 65  |thm we have come|
00001180  20 75 70 0d 77 69 74 68  20 6e 6f 77 2e 0d 0d 20  | up.with now... |
00001190  20 20 20 43 6c 65 61 72  20 70 70 77 73 20 28 70  |   Clear ppws (p|
000011a0  61 72 74 69 61 6c 20 70  72 6f 64 75 63 74 20 77  |artial product w|
000011b0  6f 72 6b 20 73 70 61 63  65 29 0d 20 20 20 20 53  |ork space).    S|
000011c0  68 69 66 74 20 6d 75 6c  74 69 70 6c 69 65 72 20  |hift multiplier |
000011d0  72 69 67 68 74 2c 20 70  75 74 73 20 6c 73 62 20  |right, puts lsb |
000011e0  69 6e 74 6f 20 63 61 72  72 79 20 66 6c 61 67 0d  |into carry flag.|
000011f0  20 20 20 20 49 66 20 63  61 72 72 79 20 73 65 74  |    If carry set|
00001200  20 61 64 64 20 6d 75 6c  74 69 70 6c 69 63 61 6e  | add multiplican|
00001210  64 20 74 6f 20 70 70 77  73 0d 20 20 20 20 53 68  |d to ppws.    Sh|
00001220  69 66 74 20 70 70 77 73  20 61 6e 64 20 6d 75 6c  |ift ppws and mul|
00001230  74 69 70 6c 69 65 72 20  72 69 67 68 74 0d 20 20  |tiplier right.  |
00001240  20 20 52 65 70 65 61 74  20 6c 61 73 74 20 74 77  |  Repeat last tw|
00001250  6f 20 6c 69 6e 65 73 20  75 6e 74 69 6c 20 61 6c  |o lines until al|
00001260  6c 20 62 69 74 73 20 70  72 6f 63 65 73 73 65 64  |l bits processed|
00001270  0d 0d 57 68 65 6e 20 79  6f 75 20 68 61 76 65 20  |..When you have |
00001280  66 69 6e 69 73 68 65 64  20 74 68 65 20 6c 6f 77  |finished the low|
00001290  65 72 20 62 79 74 65 73  20 6f 66 20 74 68 65 20  |er bytes of the |
000012a0  72 65 73 75 6c 74 20 68  61 76 65 0d 72 65 70 6c  |result have.repl|
000012b0  61 63 65 64 20 74 68 65  20 6d 75 6c 74 69 70 6c  |aced the multipl|
000012c0  69 63 61 6e 64 20 61 6e  64 20 74 68 65 20 27 6f  |icand and the 'o|
000012d0  76 65 72 66 6c 6f 77 27  20 72 65 6d 61 69 6e 73  |verflow' remains|
000012e0  20 69 6e 20 74 68 65 0d  70 70 77 73 2e 20 20 4e  | in the.ppws.  N|
000012f0  6f 77 20 74 68 61 74 20  6c 6f 6f 6b 73 20 73 68  |ow that looks sh|
00001300  6f 72 74 20 61 6e 64 20  74 6f 20 74 68 65 20 70  |ort and to the p|
00001310  6f 69 6e 74 2c 20 74 68  65 20 6f 6e 6c 79 0d 61  |oint, the only.a|
00001320  73 79 6d 6d 65 74 72 69  63 61 6c 20 70 61 72 74  |symmetrical part|
00001330  20 62 65 69 6e 67 20 74  68 65 20 69 6e 69 74 69  | being the initi|
00001340  61 6c 20 73 68 69 66 74  2c 20 62 75 74 20 77 65  |al shift, but we|
00001350  27 76 65 20 67 6f 74 20  74 6f 0d 73 74 61 72 74  |'ve got to.start|
00001360  20 73 6f 6d 65 77 68 65  72 65 2e 0d 0d 53 6f 20  | somewhere...So |
00001370  6c 65 74 27 73 20 74 75  72 6e 20 69 74 20 69 6e  |let's turn it in|
00001380  74 6f 20 61 20 70 72 6f  67 72 61 6d 2e 0d 0d 57  |to a program...W|
00001390  68 65 6e 20 72 6f 74 61  74 69 6e 67 20 61 20 6d  |hen rotating a m|
000013a0  75 6c 74 69 2d 62 79 74  65 20 6e 75 6d 62 65 72  |ulti-byte number|
000013b0  20 79 6f 75 20 73 74 61  72 74 20 61 74 20 74 68  | you start at th|
000013c0  65 20 66 61 72 20 65 6e  64 2c 0d 28 69 2e 65 2e  |e far end,.(i.e.|
000013d0  20 69 66 20 72 6f 74 61  74 69 6e 67 20 6c 65 66  | if rotating lef|
000013e0  74 20 73 74 61 72 74 20  61 74 20 74 68 65 20 72  |t start at the r|
000013f0  69 67 68 74 20 61 6e 64  20 76 69 63 65 20 76 65  |ight and vice ve|
00001400  72 73 61 29 0d 61 6e 64  20 75 73 65 20 41 53 4c  |rsa).and use ASL|
00001410  20 6f 72 20 4c 53 52 20  61 73 20 74 68 65 20 66  | or LSR as the f|
00001420  69 72 73 74 20 72 6f 74  61 74 69 6f 6e 20 73 6f  |irst rotation so|
00001430  20 74 68 61 74 20 79 6f  75 20 64 6f 20 6e 6f 74  | that you do not|
00001440  0d 73 68 69 66 74 20 74  68 65 20 63 61 72 72 79  |.shift the carry|
00001450  20 76 61 6c 75 65 20 69  6e 2c 20 62 65 63 61 75  | value in, becau|
00001460  73 65 20 79 6f 75 20 64  6f 20 6e 6f 74 20 77 61  |se you do not wa|
00001470  6e 74 20 69 74 21 20 20  54 68 65 0d 6f 74 68 65  |nt it!  The.othe|
00001480  72 20 72 6f 74 61 74 65  73 20 77 69 6c 6c 20 62  |r rotates will b|
00001490  65 20 52 4f 4c 20 6f 72  20 52 4f 52 20 62 65 63  |e ROL or ROR bec|
000014a0  61 75 73 65 20 74 68 65  6e 20 79 6f 75 20 75 73  |ause then you us|
000014b0  65 20 74 68 65 0d 63 61  72 72 79 20 74 6f 20 63  |e the.carry to c|
000014c0  61 72 72 79 20 74 68 65  20 72 65 6c 65 76 61 6e  |arry the relevan|
000014d0  74 20 62 69 74 20 6f 76  65 72 20 66 72 6f 6d 20  |t bit over from |
000014e0  6f 6e 65 20 62 79 74 65  20 74 6f 20 74 68 65 0d  |one byte to the.|
000014f0  6e 65 78 74 2e 20 20 49  6e 20 74 68 69 73 20 63  |next.  In this c|
00001500  61 73 65 20 77 65 20 77  69 6c 6c 20 74 72 65 61  |ase we will trea|
00001510  74 20 74 68 65 20 70 70  77 73 20 61 6e 64 20 6d  |t the ppws and m|
00001520  75 6c 74 69 70 6c 69 65  72 20 61 73 0d 61 20 73  |ultiplier as.a s|
00001530  69 6e 67 6c 65 20 6c 6f  6e 67 20 62 6c 6f 63 6b  |ingle long block|
00001540  20 6f 66 20 6d 65 6d 6f  72 79 20 77 69 74 68 20  | of memory with |
00001550  74 68 65 20 70 70 77 73  20 74 6f 20 74 68 65 20  |the ppws to the |
00001560  6c 65 66 74 20 6f 66 0d  74 68 65 20 6d 75 6c 74  |left of.the mult|
00001570  69 70 6c 69 65 72 2e 0d  0d 54 68 65 72 65 20 69  |iplier...There i|
00001580  73 20 6e 6f 20 6c 69 6d  69 74 20 74 6f 20 74 68  |s no limit to th|
00001590  65 20 73 69 7a 65 20 6f  66 20 6e 75 6d 62 65 72  |e size of number|
000015a0  73 20 79 6f 75 20 63 61  6e 20 6d 75 6c 74 69 70  |s you can multip|
000015b0  6c 79 0d 74 6f 67 65 74  68 65 72 20 77 69 74 68  |ly.together with|
000015c0  20 74 68 69 73 20 6d 65  74 68 6f 64 2e 20 20 52  | this method.  R|
000015d0  65 6d 65 6d 62 65 72 20  74 68 61 74 20 61 20 66  |emember that a f|
000015e0  6f 75 72 20 62 79 74 65  20 6e 75 6d 62 65 72 0d  |our byte number.|
000015f0  6d 75 6c 74 69 70 6c 69  65 64 20 62 79 20 61 6e  |multiplied by an|
00001600  6f 74 68 65 72 20 66 6f  75 72 20 62 79 74 65 20  |other four byte |
00001610  6e 75 6d 62 65 72 20 63  61 6e 20 72 65 73 75 6c  |number can resul|
00001620  74 20 69 6e 20 61 6e 0d  65 69 67 68 74 20 62 79  |t in an.eight by|
00001630  74 65 20 72 65 73 75 6c  74 2c 20 73 6f 20 79 6f  |te result, so yo|
00001640  75 20 68 61 76 65 20 74  6f 20 61 6c 6c 6f 77 20  |u have to allow |
00001650  66 6f 72 20 74 68 69 73  0d 70 6f 73 73 69 62 69  |for this.possibi|
00001660  6c 69 74 79 2e 20 20 49  66 20 77 65 20 77 65 72  |lity.  If we wer|
00001670  65 20 64 65 61 6c 69 6e  67 20 73 6f 6c 65 6c 79  |e dealing solely|
00001680  20 77 69 74 68 20 70 6f  73 69 74 69 76 65 0d 6e  | with positive.n|
00001690  75 6d 62 65 72 73 20 74  68 65 6e 2c 20 62 79 20  |umbers then, by |
000016a0  74 72 65 61 74 69 6e 67  20 74 68 65 20 70 70 77  |treating the ppw|
000016b0  73 20 61 6e 64 20 6d 75  6c 74 69 70 6c 69 65 72  |s and multiplier|
000016c0  20 61 73 20 61 0d 73 69  6e 67 6c 65 20 70 69 65  | as a.single pie|
000016d0  63 65 20 6f 66 20 77 6f  72 6b 20 73 70 61 63 65  |ce of work space|
000016e0  2c 20 77 65 20 77 6f 75  6c 64 20 61 75 74 6f 6d  |, we would autom|
000016f0  61 74 69 63 61 6c 6c 79  20 68 61 76 65 0d 65 6e  |atically have.en|
00001700  6f 75 67 68 20 72 6f 6f  6d 20 66 6f 72 20 61 20  |ough room for a |
00001710  6c 61 72 67 65 20 72 65  73 75 6c 74 2e 20 20 57  |large result.  W|
00001720  65 20 63 6f 75 6c 64 20  74 65 73 74 20 66 6f 72  |e could test for|
00001730  20 61 6e 0d 6f 76 65 72  66 6c 6f 77 20 62 79 20  | an.overflow by |
00001740  6c 6f 6f 6b 69 6e 67 20  74 6f 20 73 65 65 20 69  |looking to see i|
00001750  66 20 61 6e 79 74 68 69  6e 67 20 77 61 73 20 69  |f anything was i|
00001760  6e 20 74 68 65 20 74 6f  70 20 34 0d 62 79 74 65  |n the top 4.byte|
00001770  73 2e 0d 0d 41 20 6e 65  67 61 74 69 76 65 20 6e  |s...A negative n|
00001780  75 6d 62 65 72 20 77 69  74 68 20 34 20 62 79 74  |umber with 4 byt|
00001790  65 73 20 69 73 20 64 65  66 69 6e 65 64 20 61 73  |es is defined as|
000017a0  20 6f 6e 65 20 77 69 74  68 20 74 68 65 0d 74 6f  | one with the.to|
000017b0  70 20 6d 6f 73 74 20 62  69 74 20 28 62 69 74 20  |p most bit (bit |
000017c0  33 31 29 20 73 65 74 2e  20 20 43 6c 65 61 72 6c  |31) set.  Clearl|
000017d0  79 20 69 66 20 77 65 20  61 72 65 20 77 6f 72 6b  |y if we are work|
000017e0  69 6e 67 20 74 6f 20 61  0d 36 34 20 62 69 74 20  |ing to a.64 bit |
000017f0  72 65 73 75 6c 74 20 74  68 65 6e 20 74 68 61 74  |result then that|
00001800  20 6e 75 6d 62 65 72 20  73 68 6f 75 6c 64 20 62  | number should b|
00001810  65 20 68 65 6c 64 20 69  6e 20 6d 65 6d 6f 72 79  |e held in memory|
00001820  20 69 6e 0d 38 20 62 79  74 65 73 20 77 69 74 68  | in.8 bytes with|
00001830  20 74 68 65 20 74 6f 70  20 62 69 74 20 28 6e 75  | the top bit (nu|
00001840  6d 62 65 72 20 36 33 29  20 73 65 74 2e 20 20 41  |mber 63) set.  A|
00001850  6c 6c 20 74 68 65 20 62  69 74 73 0d 62 65 74 77  |ll the bits.betw|
00001860  65 65 6e 20 33 31 20 61  6e 64 20 36 33 20 77 6f  |een 31 and 63 wo|
00001870  75 6c 64 20 61 6c 73 6f  20 62 65 20 73 65 74 2e  |uld also be set.|
00001880  20 20 54 6f 20 6d 61 6b  65 20 74 68 69 73 20 72  |  To make this r|
00001890  6f 75 74 69 6e 65 0d 6f  70 65 72 61 74 65 20 74  |outine.operate t|
000018a0  6f 74 61 6c 6c 79 20 63  6f 72 72 65 63 74 6c 79  |otally correctly|
000018b0  20 66 6f 72 20 6e 65 67  61 74 69 76 65 20 6e 75  | for negative nu|
000018c0  6d 62 65 72 73 20 77 65  20 77 6f 75 6c 64 20 68  |mbers we would h|
000018d0  61 76 65 0d 74 6f 20 65  78 70 61 6e 64 20 74 68  |ave.to expand th|
000018e0  65 20 6d 75 6c 74 69 70  6c 69 65 72 20 61 6e 64  |e multiplier and|
000018f0  20 6d 75 6c 74 69 70 6c  69 63 61 6e 64 20 69 6e  | multiplicand in|
00001900  74 6f 20 36 34 20 62 69  74 0d 6e 75 6d 62 65 72  |to 64 bit.number|
00001910  73 20 61 6e 64 20 68 61  76 65 20 61 20 72 6f 75  |s and have a rou|
00001920  74 69 6e 65 20 74 68 61  74 20 72 61 6e 20 74 68  |tine that ran th|
00001930  72 6f 75 67 68 20 36 34  20 74 69 6d 65 73 20 69  |rough 64 times i|
00001940  6e 73 74 65 61 64 0d 6f  66 20 33 32 2e 20 20 46  |nstead.of 32.  F|
00001950  6f 72 20 73 69 6d 70 6c  69 63 69 74 79 20 49 20  |or simplicity I |
00001960  68 61 76 65 20 6e 6f 74  20 64 6f 6e 65 20 73 6f  |have not done so|
00001970  2e 20 20 54 68 65 20 72  65 73 75 6c 74 20 69 73  |.  The result is|
00001980  0d 74 68 61 74 20 69 74  20 69 73 20 70 6f 73 73  |.that it is poss|
00001990  69 62 6c 65 20 74 6f 20  67 65 6e 65 72 61 74 65  |ible to generate|
000019a0  20 61 20 72 65 73 75 6c  74 20 28 70 6f 73 69 74  | a result (posit|
000019b0  69 76 65 20 6f 72 0d 6e  65 67 61 74 69 76 65 29  |ive or.negative)|
000019c0  20 74 68 61 74 20 69 73  20 74 6f 6f 20 62 69 67  | that is too big|
000019d0  20 62 75 74 20 69 74 20  69 73 20 76 65 72 79 20  | but it is very |
000019e0  64 69 66 66 69 63 75 6c  74 20 74 6f 20 74 72 61  |difficult to tra|
000019f0  70 2e 0d 0d 54 68 65 20  73 69 6d 70 6c 65 73 74  |p...The simplest|
00001a00  20 73 6f 6c 75 74 69 6f  6e 20 77 6f 75 6c 64 20  | solution would |
00001a10  62 65 20 74 6f 20 63 68  65 63 6b 20 74 6f 20 73  |be to check to s|
00001a20  65 65 20 77 68 61 74 20  73 69 67 6e 20 74 68 65  |ee what sign the|
00001a30  0d 72 65 73 75 6c 74 20  73 68 6f 75 6c 64 20 62  |.result should b|
00001a40  65 20 61 6e 64 20 74 68  65 6e 20 63 6f 6e 76 65  |e and then conve|
00001a50  72 74 20 62 6f 74 68 20  6e 75 6d 62 65 72 73 20  |rt both numbers |
00001a60  74 6f 20 70 6f 73 69 74  69 76 65 2c 0d 63 61 72  |to positive,.car|
00001a70  72 79 20 6f 75 74 20 74  68 65 20 6d 75 6c 74 69  |ry out the multi|
00001a80  70 6c 69 63 61 74 69 6f  6e 2c 20 61 6e 64 20 63  |plication, and c|
00001a90  6f 6e 76 65 72 74 20 62  61 63 6b 20 61 66 74 65  |onvert back afte|
00001aa0  72 77 61 72 64 73 20 69  66 0d 6e 65 65 64 65 64  |rwards if.needed|
00001ab0  2e 20 20 54 68 65 6e 20  79 6f 75 20 63 6f 75 6c  |.  Then you coul|
00001ac0  64 20 6a 75 73 74 20 63  68 65 63 6b 20 74 6f 20  |d just check to |
00001ad0  73 65 65 20 69 66 20 61  6e 79 74 68 69 6e 67 20  |see if anything |
00001ae0  77 61 73 0d 6c 65 66 74  20 69 6e 20 70 70 77 73  |was.left in ppws|
00001af0  20 61 66 74 65 72 20 74  68 65 20 6d 75 6c 74 69  | after the multi|
00001b00  70 6c 69 63 61 74 69 6f  6e 2e 20 20 41 6e 79 74  |plication.  Anyt|
00001b10  68 69 6e 67 20 74 68 65  72 65 20 77 6f 75 6c 64  |hing there would|
00001b20  0d 69 6e 64 69 63 61 74  65 20 61 6e 20 6f 76 65  |.indicate an ove|
00001b30  72 66 6c 6f 77 20 61 6e  64 20 68 65 6e 63 65 20  |rflow and hence |
00001b40  61 6e 20 65 72 72 6f 72  2e 20 20 41 6c 74 68 6f  |an error.  Altho|
00001b50  75 67 68 20 77 65 20 64  69 64 6e 27 74 0d 65 72  |ugh we didn't.er|
00001b60  72 6f 72 20 74 72 61 70  20 74 68 65 20 61 64 64  |ror trap the add|
00001b70  69 74 69 6f 6e 20 61 6e  64 20 73 75 62 74 72 61  |ition and subtra|
00001b80  63 74 69 6f 6e 20 69 6e  20 6d 6f 64 75 6c 65 20  |ction in module |
00001b90  32 20 69 74 20 63 6f 75  6c 64 0d 68 61 76 65 20  |2 it could.have |
00001ba0  65 61 73 69 6c 79 20 62  65 65 6e 20 64 6f 6e 65  |easily been done|
00001bb0  20 62 79 20 62 72 61 6e  63 68 69 6e 67 20 74 6f  | by branching to|
00001bc0  20 74 68 65 20 65 72 72  6f 72 20 63 6f 64 65 0d  | the error code.|
00001bd0  77 68 65 6e 65 76 65 72  20 74 68 65 20 6f 76 65  |whenever the ove|
00001be0  72 66 6c 6f 77 20 66 6c  61 67 20 77 61 73 20 73  |rflow flag was s|
00001bf0  65 74 20 61 66 74 65 72  20 61 64 64 69 6e 67 20  |et after adding |
00001c00  6f 72 0d 73 75 62 74 72  61 63 74 69 6e 67 20 74  |or.subtracting t|
00001c10  68 65 20 68 69 67 68 65  73 74 20 62 79 74 65 2e  |he highest byte.|
00001c20  0d 0d 54 68 65 20 69 6e  70 75 74 20 72 6f 75 74  |..The input rout|
00001c30  69 6e 65 20 69 6e 20 74  68 65 20 6c 61 73 74 20  |ine in the last |
00001c40  6d 6f 64 75 6c 65 20 63  61 6e 20 62 65 20 6d 6f  |module can be mo|
00001c50  64 69 66 69 65 64 20 74  6f 0d 61 6c 77 61 79 73  |dified to.always|
00001c60  20 67 69 76 65 20 61 20  70 6f 73 69 74 69 76 65  | give a positive|
00001c70  20 72 65 73 75 6c 74 20  61 6e 64 20 61 6e 20 69  | result and an i|
00001c80  6e 64 69 63 61 74 69 6f  6e 20 6f 66 20 73 69 67  |ndication of sig|
00001c90  6e 2e 0d 49 20 61 6d 20  6e 6f 74 20 67 6f 69 6e  |n..I am not goin|
00001ca0  67 20 74 6f 20 75 73 65  20 74 68 61 74 20 69 6e  |g to use that in|
00001cb0  70 75 74 20 6d 6f 64 75  6c 65 20 68 65 72 65 20  |put module here |
00001cc0  62 65 63 61 75 73 65 20  61 6c 6c 20 74 68 65 0d  |because all the.|
00001cd0  73 75 70 65 72 66 6c 75  6f 75 73 20 63 6f 64 65  |superfluous code|
00001ce0  20 69 73 20 6c 69 6b 65  6c 79 20 74 6f 20 63 6c  | is likely to cl|
00001cf0  6f 75 64 20 74 68 65 20  6d 61 69 6e 20 69 73 73  |oud the main iss|
00001d00  75 65 2c 20 77 68 69 63  68 20 69 73 0d 74 68 65  |ue, which is.the|
00001d10  20 6d 75 6c 74 69 70 6c  69 63 61 74 69 6f 6e 2e  | multiplication.|
00001d20  20 20 49 20 6c 65 61 76  65 20 69 74 20 74 6f 20  |  I leave it to |
00001d30  79 6f 75 20 74 6f 20 62  6f 6c 74 20 74 68 65 20  |you to bolt the |
00001d40  72 6f 75 74 69 6e 65 73  0d 74 6f 67 65 74 68 65  |routines.togethe|
00001d50  72 2e 20 20 53 6f 20 49  20 75 73 65 20 64 65 61  |r.  So I use dea|
00001d60  72 20 6f 6c 64 20 42 41  53 49 43 20 69 6e 64 69  |r old BASIC indi|
00001d70  72 65 63 74 69 6f 6e 20  6f 70 65 72 61 74 6f 72  |rection operator|
00001d80  73 20 74 6f 0d 70 75 74  20 74 68 65 20 6e 75 6d  |s to.put the num|
00001d90  62 65 72 73 20 74 6f 20  62 65 20 6d 75 6c 74 69  |bers to be multi|
00001da0  70 6c 69 65 64 20 69 6e  74 6f 20 74 68 65 20 77  |plied into the w|
00001db0  6f 72 6b 73 70 61 63 65  20 61 6e 64 20 74 6f 0d  |orkspace and to.|
00001dc0  72 65 61 64 20 74 68 65  20 72 65 73 75 6c 74 20  |read the result |
00001dd0  6f 75 74 20 61 66 74 65  72 77 61 72 64 73 2e 0d  |out afterwards..|
00001de0  0d 54 68 65 20 6d 75 6c  74 69 70 6c 69 63 61 6e  |.The multiplican|
00001df0  64 20 67 6f 65 73 20 69  6e 74 6f 20 27 6d 75 6c  |d goes into 'mul|
00001e00  74 69 70 6c 69 63 61 6e  64 27 20 61 6e 64 20 74  |tiplicand' and t|
00001e10  68 65 20 6d 75 6c 74 69  70 6c 69 65 72 0d 67 6f  |he multiplier.go|
00001e20  65 73 20 69 6e 74 6f 20  27 6d 75 6c 74 69 70 6c  |es into 'multipl|
00001e30  69 65 72 27 2e 20 20 27  70 70 77 73 27 20 69 73  |ier'.  'ppws' is|
00001e40  20 74 68 65 20 70 61 72  74 69 61 6c 20 70 72 6f  | the partial pro|
00001e50  64 75 63 74 0d 77 6f 72  6b 73 70 61 63 65 2e 20  |duct.workspace. |
00001e60  20 54 68 69 73 20 61 72  72 61 6e 67 65 6d 65 6e  | This arrangemen|
00001e70  74 20 66 69 74 73 20 6e  69 63 65 6c 79 20 77 69  |t fits nicely wi|
00001e80  74 68 20 74 68 65 0d 72  65 71 75 69 72 65 6d 65  |th the.requireme|
00001e90  6e 74 20 66 6f 72 20 70  70 77 73 20 61 6e 64 20  |nt for ppws and |
00001ea0  6d 75 6c 74 69 70 6c 69  65 72 20 74 6f 20 62 65  |multiplier to be|
00001eb0  20 74 6f 67 65 74 68 65  72 2e 20 20 5b 49 6e 0d  | together.  [In.|
00001ec0  66 61 63 74 20 74 68 65  20 6d 65 6d 6f 72 79 20  |fact the memory |
00001ed0  75 73 65 64 20 66 6f 72  20 6d 75 6c 74 69 2d 62  |used for multi-b|
00001ee0  79 74 65 20 6d 61 74 68  73 20 64 6f 65 73 20 6e  |yte maths does n|
00001ef0  6f 74 20 6e 65 65 64 20  74 6f 0d 62 65 20 63 6f  |ot need to.be co|
00001f00  6e 74 69 67 75 6f 75 73  2c 20 69 6e 20 61 20 62  |ntiguous, in a b|
00001f10  6c 6f 63 6b 2c 20 62 75  74 20 69 74 20 69 73 20  |lock, but it is |
00001f20  73 65 6e 73 69 62 6c 65  20 74 6f 20 68 61 76 65  |sensible to have|
00001f30  20 69 74 0d 73 6f 2e 5d  0d 0d 41 20 66 75 72 74  | it.so.]..A furt|
00001f40  68 65 72 20 6e 6f 74 65  20 6f 6e 20 73 70 65 65  |her note on spee|
00001f50  64 2e 20 20 54 68 65 20  36 35 30 32 20 77 6f 72  |d.  The 6502 wor|
00001f60  6b 73 20 66 61 73 74 65  72 20 77 68 65 6e 20 69  |ks faster when i|
00001f70  74 20 69 73 0d 75 73 69  6e 67 20 7a 65 72 6f 20  |t is.using zero |
00001f80  70 61 67 65 20 77 6f 72  6b 73 70 61 63 65 2c 20  |page workspace, |
00001f90  73 6f 20 77 65 20 73 68  6f 75 6c 64 20 72 65 61  |so we should rea|
00001fa0  6c 6c 79 20 75 73 65 20  73 6f 6d 65 20 6f 66 0d  |lly use some of.|
00001fb0  74 68 69 73 20 66 6f 72  20 6f 75 72 20 72 6f 75  |this for our rou|
00001fc0  74 69 6e 65 73 2e 20 20  49 20 61 6d 20 6e 6f 74  |tines.  I am not|
00001fd0  20 67 6f 69 6e 67 20 74  6f 20 69 6e 20 74 68 69  | going to in thi|
00001fe0  73 20 65 78 61 6d 70 6c  65 0d 62 65 63 61 75 73  |s example.becaus|
00001ff0  65 20 69 74 20 6b 65 65  70 73 20 61 20 63 6f 6e  |e it keeps a con|
00002000  73 69 73 74 65 6e 63 79  20 77 69 74 68 20 65 61  |sistency with ea|
00002010  72 6c 69 65 72 20 6d 6f  64 75 6c 65 73 20 61 6e  |rlier modules an|
00002020  64 20 49 0d 6c 65 61 76  65 20 69 74 20 74 6f 20  |d I.leave it to |
00002030  79 6f 75 20 74 6f 20 6d  61 6b 65 20 74 68 65 20  |you to make the |
00002040  61 64 6a 75 73 74 6d 65  6e 74 20 69 66 20 79 6f  |adjustment if yo|
00002050  75 20 77 61 6e 74 20 74  6f 2e 20 20 49 74 0d 64  |u want to.  It.d|
00002060  6f 65 73 6e 27 74 20 61  66 66 65 63 74 20 74 68  |oesn't affect th|
00002070  65 20 61 6c 67 6f 72 69  74 68 6d 20 61 74 20 61  |e algorithm at a|
00002080  6c 6c 2e 0d 0d 46 69 72  73 74 6c 79 20 74 68 65  |ll...Firstly the|
00002090  20 77 6f 72 6b 73 70 61  63 65 20 69 73 20 63 6c  | workspace is cl|
000020a0  65 61 72 65 64 20 61 6e  64 20 74 68 65 6e 20 61  |eared and then a|
000020b0  20 63 6f 75 6e 74 65 72  20 69 73 0d 69 6e 69 74  | counter is.init|
000020c0  69 61 6c 69 73 65 64 20  74 6f 20 74 68 65 20 6e  |ialised to the n|
000020d0  75 6d 62 65 72 20 6f 66  20 62 69 74 73 20 69 6e  |umber of bits in|
000020e0  20 74 68 65 20 6e 75 6d  62 65 72 73 2e 20 20 53  | the numbers.  S|
000020f0  69 6e 63 65 0d 74 68 69  73 20 72 6f 75 74 69 6e  |ince.this routin|
00002100  65 20 77 69 6c 6c 20 63  6f 70 65 20 77 69 74 68  |e will cope with|
00002110  20 6e 65 67 61 74 69 76  65 20 6e 75 6d 62 65 72  | negative number|
00002120  73 20 61 73 20 65 61 73  69 6c 79 20 61 73 0d 70  |s as easily as.p|
00002130  6f 73 69 74 69 76 65 20  6f 6e 65 73 20 28 32 27  |ositive ones (2'|
00002140  73 20 63 6f 6d 70 6c 65  6d 65 6e 74 20 6e 65 67  |s complement neg|
00002150  61 74 69 76 65 20 74 68  61 74 20 69 73 29 20 77  |ative that is) w|
00002160  65 20 77 69 6c 6c 20 6e  65 65 64 0d 61 6c 6c 20  |e will need.all |
00002170  33 32 20 62 69 74 73 2e  20 20 2d 31 20 69 73 20  |32 bits.  -1 is |
00002180  26 46 46 46 46 46 46 46  46 20 28 49 20 77 69 6c  |&FFFFFFFF (I wil|
00002190  6c 20 72 65 66 72 61 69  6e 20 66 72 6f 6d 20 70  |l refrain from p|
000021a0  72 69 6e 74 69 6e 67 0d  6f 75 74 20 33 32 20 27  |rinting.out 32 '|
000021b0  31 27 73 20 6a 75 73 74  20 74 6f 20 69 6c 6c 75  |1's just to illu|
000021c0  73 74 72 61 74 65 20 74  68 69 73 20 70 6f 69 6e  |strate this poin|
000021d0  74 2e 29 0d 0d 54 68 65  20 66 69 72 73 74 20 74  |t.)..The first t|
000021e0  68 69 6e 67 20 74 68 61  74 20 68 61 70 70 65 6e  |hing that happen|
000021f0  73 20 69 6e 20 74 68 65  20 63 6f 64 65 20 69 73  |s in the code is|
00002200  20 74 68 61 74 20 77 65  20 63 6c 65 61 72 0d 6f  | that we clear.o|
00002210  75 72 20 70 61 72 74 69  61 6c 20 70 72 6f 64 75  |ur partial produ|
00002220  63 74 20 77 6f 72 6b 73  70 61 63 65 20 61 6e 64  |ct workspace and|
00002230  20 73 65 74 20 74 68 65  20 62 69 74 20 63 6f 75  | set the bit cou|
00002240  6e 74 65 72 20 74 6f 20  33 32 0d 28 6f 72 20 68  |nter to 32.(or h|
00002250  6f 77 65 76 65 72 20 6d  61 6e 79 20 62 69 74 73  |owever many bits|
00002260  20 79 6f 75 20 61 72 65  20 77 6f 72 6b 69 6e 67  | you are working|
00002270  20 77 69 74 68 29 2e 20  20 54 6f 20 67 65 74 20  | with).  To get |
00002280  6f 75 72 0d 61 6c 67 6f  72 69 74 68 6d 20 72 65  |our.algorithm re|
00002290  61 64 79 20 77 65 20 68  61 76 65 20 74 6f 20 66  |ady we have to f|
000022a0  69 72 73 74 20 72 6f 74  61 74 65 20 6f 72 20 73  |irst rotate or s|
000022b0  68 69 66 74 20 74 68 65  0d 6d 75 6c 74 69 70 6c  |hift the.multipl|
000022c0  69 65 72 20 72 69 67 68  74 20 74 6f 20 70 75 74  |ier right to put|
000022d0  20 69 74 73 20 6c 65 61  73 74 20 73 69 67 6e 69  | its least signi|
000022e0  66 69 63 61 6e 74 20 62  69 74 20 28 6c 73 62 29  |ficant bit (lsb)|
000022f0  20 69 6e 74 6f 0d 74 68  65 20 63 61 72 72 79 20  | into.the carry |
00002300  66 6c 61 67 2e 20 20 57  65 20 63 61 6e 20 74 68  |flag.  We can th|
00002310  65 6e 20 75 73 65 20 62  72 61 6e 63 68 65 73 20  |en use branches |
00002320  6f 6e 20 63 61 72 72 79  20 74 6f 20 64 65 63 69  |on carry to deci|
00002330  64 65 0d 77 68 65 74 68  65 72 20 6f 72 20 6e 6f  |de.whether or no|
00002340  74 20 74 6f 20 61 64 64  20 74 68 65 20 6d 75 6c  |t to add the mul|
00002350  74 69 70 6c 69 63 61 6e  64 20 6f 6e 74 6f 20 74  |tiplicand onto t|
00002360  68 65 20 63 6f 6e 74 65  6e 74 73 20 6f 66 0d 74  |he contents of.t|
00002370  68 65 20 70 61 72 74 69  61 6c 20 70 72 6f 64 75  |he partial produ|
00002380  63 74 20 77 6f 72 6b 73  70 61 63 65 2e 0d 0d 27  |ct workspace...'|
00002390  6d 62 6d 5f 6c 6f 6f 70  27 20 28 66 6f 72 20 6d  |mbm_loop' (for m|
000023a0  75 6c 74 69 2d 62 79 74  65 20 6d 75 6c 74 69 70  |ulti-byte multip|
000023b0  6c 69 63 61 74 69 6f 6e  29 20 69 73 20 74 68 65  |lication) is the|
000023c0  20 74 6f 70 20 6f 66 20  74 68 65 0d 6d 61 69 6e  | top of the.main|
000023d0  20 6c 6f 6f 70 2e 20 20  49 6e 20 69 74 20 77 65  | loop.  In it we|
000023e0  20 66 69 72 73 74 20 63  68 65 63 6b 20 74 68 65  | first check the|
000023f0  20 63 61 72 72 79 20 66  6c 61 67 20 74 6f 20 73  | carry flag to s|
00002400  65 65 20 69 66 0d 74 68  65 20 6c 73 62 20 6f 66  |ee if.the lsb of|
00002410  20 74 68 65 20 6d 75 6c  74 69 70 6c 69 65 72 20  | the multiplier |
00002420  77 61 73 20 73 65 74 2e  20 20 49 66 20 69 74 20  |was set.  If it |
00002430  77 61 73 20 74 68 65 6e  20 77 65 20 77 69 6c 6c  |was then we will|
00002440  0d 61 64 64 20 74 68 65  20 6d 75 6c 74 69 70 6c  |.add the multipl|
00002450  69 63 61 6e 64 20 6f 6e  74 6f 20 74 68 65 20 70  |icand onto the p|
00002460  70 77 73 20 62 75 74 20  69 66 20 6e 6f 74 20 74  |pws but if not t|
00002470  68 65 20 70 72 6f 67 72  61 6d 0d 67 6f 65 73 20  |he program.goes |
00002480  74 6f 20 27 6e 6f 5f 61  64 64 5f 6d 62 6d 27 20  |to 'no_add_mbm' |
00002490  77 68 65 72 65 20 62 6f  74 68 20 74 68 65 20 70  |where both the p|
000024a0  70 77 73 20 61 6e 64 20  74 68 65 20 6d 75 6c 74  |pws and the mult|
000024b0  69 70 6c 69 65 72 0d 61  72 65 20 72 6f 74 61 74  |iplier.are rotat|
000024c0  65 64 20 72 69 67 68 74  2e 20 20 28 57 68 65 72  |ed right.  (Wher|
000024d0  65 20 49 20 72 65 66 65  72 20 74 6f 20 27 77 73  |e I refer to 'ws|
000024e0  5f 73 6f 6d 65 74 68 69  6e 67 27 20 49 20 6d 65  |_something' I me|
000024f0  61 6e 0d 74 68 65 20 67  72 6f 75 70 20 6f 66 20  |an.the group of |
00002500  62 79 74 65 73 20 74 68  61 74 20 6d 61 6b 65 20  |bytes that make |
00002510  75 70 20 74 68 61 74 20  77 6f 72 64 2c 20 69 6e  |up that word, in|
00002520  20 74 68 69 73 20 63 61  73 65 0d 27 6d 75 6c 74  | this case.'mult|
00002530  69 70 6c 69 63 61 6e 64  27 20 74 6f 20 27 6d 75  |iplicand' to 'mu|
00002540  6c 74 69 70 6c 69 63 61  6e 64 2b 33 27 2e 29 20  |ltiplicand+3'.) |
00002550  20 54 68 69 73 20 72 6f  74 61 74 69 6f 6e 20 70  | This rotation p|
00002560  75 74 73 20 74 68 65 0d  6c 73 62 20 6f 66 20 74  |uts the.lsb of t|
00002570  68 65 20 6d 75 6c 74 69  70 6c 69 65 72 20 69 6e  |he multiplier in|
00002580  74 6f 20 74 68 65 20 63  61 72 72 79 20 66 6c 61  |to the carry fla|
00002590  67 20 72 65 61 64 79 20  66 6f 72 20 61 6e 6f 74  |g ready for anot|
000025a0  68 65 72 0d 72 75 6e 20  61 72 6f 75 6e 64 20 74  |her.run around t|
000025b0  68 65 20 6c 6f 6f 70 2e  0d 0d 52 65 6d 65 6d 62  |he loop...Rememb|
000025c0  65 72 20 77 65 20 72 6f  74 61 74 65 20 74 68 65  |er we rotate the|
000025d0  20 70 70 77 73 20 61 6e  64 20 6d 75 6c 74 69 70  | ppws and multip|
000025e0  6c 69 65 72 20 65 61 63  68 20 74 69 6d 65 20 77  |lier each time w|
000025f0  65 20 67 6f 0d 61 72 6f  75 6e 64 20 74 68 65 20  |e go.around the |
00002600  6c 6f 6f 70 20 77 68 65  74 68 65 72 20 6f 72 20  |loop whether or |
00002610  6e 6f 74 20 77 65 20 61  64 64 20 74 68 65 20 6d  |not we add the m|
00002620  75 6c 74 69 70 6c 69 63  61 6e 64 20 74 6f 0d 74  |ultiplicand to.t|
00002630  68 65 20 70 61 72 74 69  61 6c 20 70 72 6f 64 75  |he partial produ|
00002640  63 74 2e 20 20 46 6f 6c  6c 6f 77 69 6e 67 20 74  |ct.  Following t|
00002650  68 65 20 72 6f 74 61 74  69 6f 6e 20 74 68 65 20  |he rotation the |
00002660  58 20 72 65 67 69 73 74  65 72 2c 0d 77 68 69 63  |X register,.whic|
00002670  68 20 69 73 20 63 6f 75  6e 74 69 6e 67 20 74 68  |h is counting th|
00002680  65 20 6c 6f 6f 70 20 66  6f 72 20 75 73 2c 20 69  |e loop for us, i|
00002690  73 20 72 65 64 75 63 65  64 20 62 79 20 6f 6e 65  |s reduced by one|
000026a0  2e 20 0d 43 6f 75 6e 74  69 6e 67 20 64 6f 77 6e  |. .Counting down|
000026b0  20 69 73 20 75 73 75 61  6c 6c 79 20 62 65 74 74  | is usually bett|
000026c0  65 72 20 74 68 61 6e 20  63 6f 75 6e 74 69 6e 67  |er than counting|
000026d0  20 75 70 20 62 65 63 61  75 73 65 20 61 0d 73 69  | up because a.si|
000026e0  6d 70 6c 65 20 42 4e 45  20 77 69 6c 6c 20 73 75  |mple BNE will su|
000026f0  66 66 69 63 65 20 74 6f  20 74 72 61 70 20 7a 65  |ffice to trap ze|
00002700  72 6f 20 72 61 74 68 65  72 20 74 68 61 6e 20 68  |ro rather than h|
00002710  61 76 69 6e 67 20 74 6f  0d 43 4d 50 20 77 69 74  |aving to.CMP wit|
00002720  68 20 61 6e 79 74 68 69  6e 67 2e 20 20 48 65 72  |h anything.  Her|
00002730  65 20 77 65 20 42 4e 45  20 62 61 63 6b 20 74 6f  |e we BNE back to|
00002740  20 27 6d 62 6d 5f 6c 6f  6f 70 27 2e 0d 0d 57 68  | 'mbm_loop'...Wh|
00002750  65 6e 20 77 65 20 66 69  6e 61 6c 6c 79 20 66 61  |en we finally fa|
00002760  6c 6c 20 74 68 72 6f 75  67 68 20 74 68 65 20 42  |ll through the B|
00002770  4e 45 20 77 65 20 72 65  61 63 68 20 61 6e 20 52  |NE we reach an R|
00002780  54 53 20 77 68 69 63 68  0d 66 69 6e 69 73 68 65  |TS which.finishe|
00002790  73 20 74 68 65 20 72 6f  75 74 69 6e 65 2e 20 20  |s the routine.  |
000027a0  54 68 65 20 66 6f 75 72  20 62 79 74 65 20 72 65  |The four byte re|
000027b0  73 75 6c 74 20 69 73 20  69 6e 0d 27 6d 75 6c 74  |sult is in.'mult|
000027c0  69 70 6c 69 65 72 27 20  77 69 74 68 20 61 6e 79  |iplier' with any|
000027d0  20 6f 76 65 72 66 6c 6f  77 20 69 6e 20 27 70 70  | overflow in 'pp|
000027e0  77 73 27 2e 20 20 54 68  65 6e 20 66 6f 6c 6c 6f  |ws'.  Then follo|
000027f0  77 20 74 68 65 0d 74 68  72 65 65 20 46 4e 45 51  |w the.three FNEQ|
00002800  55 4d 20 66 75 6e 63 74  69 6f 6e 73 20 74 68 61  |UM functions tha|
00002810  74 20 72 65 73 65 72 76  65 20 6d 65 6d 6f 72 79  |t reserve memory|
00002820  20 66 6f 72 20 74 68 65  0d 77 6f 72 6b 73 70 61  | for the.workspa|
00002830  63 65 2e 20 20 49 66 20  79 6f 75 20 68 61 76 65  |ce.  If you have|
00002840  20 42 41 53 49 43 20 32  20 6f 72 20 6c 61 74 65  | BASIC 2 or late|
00002850  72 20 79 6f 75 20 63 61  6e 20 72 65 70 6c 61 63  |r you can replac|
00002860  65 0d 74 68 65 6d 20 77  69 74 68 20 45 51 55 44  |e.them with EQUD|
00002870  20 30 20 69 6e 20 65 61  63 68 20 63 61 73 65 2e  | 0 in each case.|
00002880  0d 0d 54 68 65 20 42 41  53 49 43 20 61 74 20 74  |..The BASIC at t|
00002890  68 65 20 65 6e 64 20 70  72 69 6e 74 73 20 6f 75  |he end prints ou|
000028a0  74 20 74 68 65 20 72 65  73 75 6c 74 20 77 69 74  |t the result wit|
000028b0  68 20 61 20 63 68 65 63  6b 20 61 6e 64 0d 74 65  |h a check and.te|
000028c0  6c 6c 73 20 79 6f 75 20  77 68 61 74 20 65 78 61  |lls you what exa|
000028d0  63 74 6c 79 20 69 73 20  69 6e 20 27 70 70 77 73  |ctly is in 'ppws|
000028e0  27 20 61 6e 64 20 27 6d  75 6c 74 69 70 6c 69 65  |' and 'multiplie|
000028f0  72 27 20 73 6f 20 79 6f  75 0d 63 61 6e 20 73 65  |r' so you.can se|
00002900  65 20 77 68 61 74 20 68  61 70 70 65 6e 73 20 69  |e what happens i|
00002910  66 20 79 6f 75 20 65 6e  74 65 72 20 6c 61 72 67  |f you enter larg|
00002920  65 20 6e 75 6d 62 65 72  73 2e 20 20 48 6f 77 65  |e numbers.  Howe|
00002930  76 65 72 2c 0d 66 6f 72  20 61 20 70 72 6f 64 75  |ver,.for a produ|
00002940  63 74 20 75 6e 64 65 72  20 33 32 20 62 79 74 65  |ct under 32 byte|
00002950  73 20 74 68 65 20 72 65  73 75 6c 74 73 20 77 69  |s the results wi|
00002960  6c 6c 20 62 65 20 63 6f  72 72 65 63 74 20 66 6f  |ll be correct fo|
00002970  72 0d 70 6f 73 69 74 69  76 65 20 61 6e 64 20 6e  |r.positive and n|
00002980  65 67 61 74 69 76 65 2e  0d 0d 4d 75 6c 74 69 70  |egative...Multip|
00002990  6c 69 63 61 74 69 6f 6e  20 61 6e 64 20 64 69 76  |lication and div|
000029a0  69 73 69 6f 6e 20 72 6f  75 74 69 6e 65 73 20 61  |ision routines a|
000029b0  72 65 20 61 6d 6f 6e 67  73 74 20 74 68 65 20 6d  |re amongst the m|
000029c0  6f 73 74 0d 74 69 6d 65  20 73 65 6e 73 69 74 69  |ost.time sensiti|
000029d0  76 65 20 69 6e 20 6d 61  74 68 73 2e 20 20 49 6e  |ve in maths.  In|
000029e0  20 61 6e 20 65 61 72 6c  79 20 6d 6f 64 75 6c 65  | an early module|
000029f0  20 77 68 65 6e 20 49 20  73 61 69 64 0d 74 68 61  | when I said.tha|
00002a00  74 20 79 6f 75 20 6d 69  67 68 74 20 77 69 73 68  |t you might wish|
00002a10  20 74 6f 20 64 6f 20 6d  6f 72 65 20 74 68 61 6e  | to do more than|
00002a20  20 6a 75 73 74 20 6d 75  6c 74 69 70 6c 79 20 66  | just multiply f|
00002a30  61 73 74 65 72 20 49 0d  77 61 73 20 69 6e 20 66  |aster I.was in f|
00002a40  61 63 74 20 68 69 64 69  6e 67 20 74 68 65 20 74  |act hiding the t|
00002a50  72 75 74 68 2e 20 20 54  68 65 20 72 6f 75 74 69  |ruth.  The routi|
00002a60  6e 65 73 20 69 6e 20 42  42 43 20 42 41 53 49 43  |nes in BBC BASIC|
00002a70  20 61 72 65 0d 73 6f 20  65 66 66 69 63 69 65 6e  | are.so efficien|
00002a80  74 20 74 68 61 74 20 79  6f 75 20 63 61 6e 20 6d  |t that you can m|
00002a90  75 6c 74 69 70 6c 79 20  74 77 6f 20 69 6e 74 65  |ultiply two inte|
00002aa0  67 65 72 73 20 74 6f 67  65 74 68 65 72 0d 66 61  |gers together.fa|
00002ab0  73 74 65 72 20 66 72 6f  6d 20 68 69 73 20 42 41  |ster from his BA|
00002ac0  53 49 43 20 74 68 61 6e  20 77 69 74 68 20 74 68  |SIC than with th|
00002ad0  69 73 20 63 6f 64 65 20  68 65 72 65 2e 20 20 48  |is code here.  H|
00002ae0  6f 77 65 76 65 72 20 49  0d 61 6d 20 61 69 6d 69  |owever I.am aimi|
00002af0  6e 67 20 66 6f 72 20 63  6c 61 72 69 74 79 20 28  |ng for clarity (|
00002b00  62 75 69 6c 74 20 66 6f  72 20 63 6f 6d 66 6f 72  |built for comfor|
00002b10  74 20 6e 6f 74 20 66 6f  72 20 73 70 65 65 64 20  |t not for speed |
00002b20  49 0d 62 65 6c 69 65 76  65 29 20 77 68 69 63 68  |I.believe) which|
00002b30  20 69 73 20 6d 79 20 65  78 63 75 73 65 20 61 6e  | is my excuse an|
00002b40  64 20 49 20 77 69 6c 6c  20 73 74 69 63 6b 20 74  |d I will stick t|
00002b50  6f 20 69 74 2e 0d 0d 49  66 20 79 6f 75 20 77 69  |o it...If you wi|
00002b60  73 68 20 74 6f 20 65 78  70 61 6e 64 20 28 6f 72  |sh to expand (or|
00002b70  20 63 6f 6e 74 72 61 63  74 29 20 74 68 69 73 20  | contract) this |
00002b80  72 6f 75 74 69 6e 65 20  74 6f 20 77 6f 72 6b 0d  |routine to work.|
00002b90  77 69 74 68 20 61 20 64  69 66 66 65 72 65 6e 74  |with a different|
00002ba0  20 6e 75 6d 62 65 72 20  6f 66 20 62 79 74 65 73  | number of bytes|
00002bb0  20 79 6f 75 20 73 69 6d  70 6c 79 20 63 68 61 6e  | you simply chan|
00002bc0  67 65 20 74 68 65 20 73  69 7a 65 0d 6f 66 20 74  |ge the size.of t|
00002bd0  68 65 20 77 6f 72 6b 73  70 61 63 65 20 61 72 65  |he workspace are|
00002be0  61 73 20 61 63 63 6f 72  64 69 6e 67 6c 79 20 61  |as accordingly a|
00002bf0  6e 64 20 61 64 64 20 6f  72 20 73 75 62 74 72 61  |nd add or subtra|
00002c00  63 74 20 66 72 6f 6d 0d  74 68 65 20 6c 69 73 74  |ct from.the list|
00002c10  73 20 6f 66 20 4c 44 41  2f 41 44 43 2f 53 54 41  |s of LDA/ADC/STA|
00002c20  73 20 61 6e 64 20 4c 53  52 2f 52 4f 52 73 2e 20  |s and LSR/RORs. |
00002c30  20 52 65 6d 65 6d 62 65  72 20 74 68 61 74 20 62  | Remember that b|
00002c40  79 0d 63 6f 6e 76 65 6e  74 69 6f 6e 20 77 69 74  |y.convention wit|
00002c50  68 20 74 68 65 20 36 35  30 32 20 61 20 6d 75 6c  |h the 6502 a mul|
00002c60  74 69 2d 62 79 74 65 20  6e 75 6d 62 65 72 20 69  |ti-byte number i|
00002c70  73 20 73 74 6f 72 65 64  20 77 69 74 68 0d 69 74  |s stored with.it|
00002c80  73 20 6c 6f 77 65 73 74  20 73 69 67 6e 69 66 69  |s lowest signifi|
00002c90  63 61 6e 74 20 62 79 74  65 20 69 6e 20 74 68 65  |cant byte in the|
00002ca0  20 6c 6f 77 65 73 74 20  6d 65 6d 6f 72 79 20 6c  | lowest memory l|
00002cb0  6f 63 61 74 69 6f 6e 0d  61 6e 64 20 74 68 65 20  |ocation.and the |
00002cc0  6d 6f 73 74 20 73 69 67  6e 69 66 69 63 61 6e 74  |most significant|
00002cd0  20 62 79 74 65 20 69 6e  20 74 68 65 20 68 69 67  | byte in the hig|
00002ce0  68 65 73 74 20 6c 6f 63  61 74 69 6f 6e 2e 20 20  |hest location.  |
00002cf0  54 68 69 73 0d 72 65 73  75 6c 74 73 20 66 72 6f  |This.results fro|
00002d00  6d 20 74 68 65 20 77 61  79 20 61 20 31 36 20 62  |m the way a 16 b|
00002d10  69 74 20 61 64 64 72 65  73 73 20 6d 75 73 74 20  |it address must |
00002d20  62 65 20 73 74 6f 72 65  64 20 77 69 74 68 0d 74  |be stored with.t|
00002d30  68 65 20 6c 65 73 73 20  73 69 67 6e 69 66 69 63  |he less signific|
00002d40  61 6e 74 20 62 79 74 65  20 66 69 72 73 74 2e 0d  |ant byte first..|
00002d50  0d 4e 65 78 74 20 74 69  6d 65 20 77 65 20 6d 6f  |.Next time we mo|
00002d60  76 65 20 6f 6e 20 74 6f  20 64 69 76 69 73 69 6f  |ve on to divisio|
00002d70  6e 20 61 6e 64 20 61 6e  20 6f 75 74 70 75 74 20  |n and an output |
00002d80  72 6f 75 74 69 6e 65 20  77 68 69 63 68 0d 6e 65  |routine which.ne|
00002d90  65 64 73 20 64 69 76 69  73 69 6f 6e 20 74 6f 20  |eds division to |
00002da0  6f 70 65 72 61 74 65 2e  20 20 54 68 65 6e 20 6f  |operate.  Then o|
00002db0  6e 20 74 6f 20 61 20 67  65 6e 65 72 61 6c 20 64  |n to a general d|
00002dc0  69 76 69 73 69 6f 6e 0d  72 6f 75 74 69 6e 65 20  |ivision.routine |
00002dd0  73 69 6d 69 6c 61 72 20  74 6f 20 74 68 65 20 6d  |similar to the m|
00002de0  75 6c 74 69 70 6c 69 63  61 74 69 6f 6e 20 6f 6e  |ultiplication on|
00002df0  65 20 69 6e 20 74 68 69  73 20 6d 6f 64 75 6c 65  |e in this module|
00002e00  2e 0d                                             |..|
00002e02
07-02-88/T\OSB13.m0
07-02-88/T\OSB13.m1
07-02-88/T\OSB13.m2
07-02-88/T\OSB13.m4
07-02-88/T\OSB13.m5