Home » CEEFAX disks » telesoftware2.adl » OS\BITS/T\OSB22

OS\BITS/T\OSB22

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 » telesoftware2.adl
Filename: OS\BITS/T\OSB22
Read OK:
File size: 2BCB bytes
Load address: 0000
Exec address: 0000
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 22: Floating Point Arithmetic


In the last module we used a fixed point arithmetic system
for calculations.  The result was relatively fast but was
slightly innacurate since very small numbers were not
represented as well as they could have been.

You will remember that we converted from a real number to a
fixed point number by multiplying by a constant factor.  The
decimal example was that 12.34 became 12340 if the constant
factor was 100, and that .0123 became 12 (the last digit
being lost).  All our calculating was then done on the new,
larger numbers, which were integers and so we could use
integer arithmetic.  When we had our integer result it could
be converted back to its proper size by dividing by the
constant factor.  We also needed to know how multilplying
and dividing would be affected by this factor and compensate
for it.

The next logical step in this numbering is to make the
factor variable and to keep track of what it is.  This
could, for example, make 12.34 be represented by any of the
following:

                    1.234 * 10^+1
                    12.34 * 10^+0
                    123.4 * 10^-1
                    1234  * 10^-2

the last digit being a power of 10.  This is the scientific
notation used in the BBC Micro but written as E-2 etc.  This
part of the number is called the EXPONENT.  Since all the
above list are equivalent there is a need to decide on a
normal format for such notation.  There is a standard that
says that the first number (the MANTISSA) nust always be
between 0.1 and 1.  This would lead to 12.34 being written
as 0.1234E2 (meaning multiplied by 10 to the power 2).  The
BBC Micro standard has the mantissa between 1 and 10 so that
12.34 would be 1.234E1 (meaning multiplied by 10 to the
power 1).

Here we have a floating point decimal numbering convention
such that the mantissa is always of a size between two
limits and the exponent is the power of 10 by which you
multiply the mantissa to produce the required number.  You
will notice straight away that the mantissa is not an
integer.  Does this matter?  In fact it does not.

The object with our fixed point system in the last program
modules was to work with integers in the knowledge that our
numbers were in reality 65536 times too large.  But they
were only 65536 times too large if we insisted in thinking
of them as integers in this way.  The alternative way was to
put a ficticious 'decimal' point between the top two bytes
of the number and the bottom two.  This method would have
worked equally well and is essentially the same, it was only
a question of how we visualised the numbers being stored.

The rules for arithmetic for floating point are similar to
those for fixed point, except that the constant factor is
now variable and is known as the exponent.

Addition requires that the exponent of the two numbers be
the same, then the mantissae are added.  You keep the size
of the number the same by multiplying the mantissa by 10 to
the power of the number you subtract from the exponent (or
vice versa).

For example
                1.23E5 + 2.34E3

setting both to have an exponent of E3

             =  123E3 + 2.34E3
             =  125.34E3
             =  1.2534E5  (re-normalised)

It is up to you which number you de-normalise to match
which.  On paper it is often clearer to avoid too many zeros
by de-normalising the larger number.

Subtraction is similar to addition in that the exponents
must be made the same before subtraction, then normalisation
is carried out.

Multiplication is done by multiplying the mantissae and
adding the exponents.

For example
                1.23E5 * 2.34E3
             =  (1.23*2.34)E8
             =  2.8782E8

In this case we don't need to renormalise.

Division is similar to multiplication in that we divide the
mantissae and subtract the exponents.

For example
                1.23E5 / 2.34E3 
             =  (1.23/2.34)E2
             =  0.5256E2
             =  5.256E1   approximately

Incidentally, the habit of working with mantissae between 0
and 1 or between 1 and 10 dates back to the days of slide
rules.  The slide rule would take care of the calculations
of the mantissae but it was up to you to sort out the
position of your decimal point.

BBC BASIC has a convention for floating point arithmetic
which we will use in this module.  Using the exisiting
convention means I can use BBC BASIC to translate from
decimal into floating point instead of writing a conversion
routine.  This could be done by modifying the ASCII to
binary routine in module 12.

Five bytes are used to store a number, four bytes of
mantissa and one of exponent.

The binary equivalent of of 3.25 is 11.01 since, after the
binary point, the first place is 'halves' the second is
'quarters', the third is 'eighths' and so on.

To normalise this number under the BBC BASIC conventionwe
must have the binary point at the head of the number such
that

      3.25 (decimal) = 11.01 (binary) = .1101 x2^2

This gives us a representation in memory like this

  Exponent     Mantissa
  --------------------------------------------------------
  | 00000010 | 11010000 | 00000000 | 00000000 | 00000000 |
  --------------------------------------------------------

since the exponent is 2 (10 in binary) and the mantissa is
aligned to the left.  In this case, like one of our
conventions for decimal floating point, the mantissa is
always between 0 and 1.  In effect you shift the mantissa
until its top bit is set.  This means you can check the
negative flag (which reflects bit 7) of the first mantissa
byte if you want to check for normalisation.

It is vital to remember that, unlike integer numbers, where
the most significant byte is stored at the greatest address,
with floating point in the BBC Micro the exponent is at the
lowest address and the mantissa is stored in the next four
higher bytes, with the most significant byte in the LOWEST
address.

Now, because the first bit of the mantissa is ALWAYS going
to be set, unless the number is zero, BASIC uses that top
bit to denote sign.  This is not a 2's complement notation,
it is purely and simply a sign bit.  If it is set the number
is positive, if it is clear the number is negative.  But
remember that this is using a bit that ought to be set as a
flag and in fact the top bit is actually always set.

One final contrivance of BBC BASIC is to add &80 to the
exponent to aid in calculating, so I have done that below.

Hence, this is the representation of 3.25


  Exponent     Mantissa
  --------------------------------------------------------
  | 10000010 | 01010000 | 00000000 | 00000000 | 00000000 |
  --------------------------------------------------------
    &82        &50        &00        &00        &00

and this of -3.25

  Exponent     Mantissa
  --------------------------------------------------------
  | 10000010 | 11010000 | 00000000 | 00000000 | 00000000 |
  --------------------------------------------------------
    &82        &D0        &00        &00        &00

Zero is stored as five zero bytes.

In calculating with floating point numbers of this format we
have three operations.  Firstly we carry out the calculation
on the mantissae, secondly we carry out the operation on the
exponents and finally we normalise the result.

The program in this module takes a pair of numbers you enter
and calculates the sum and difference of them using modified
versions of the multi-byte arithmetical routines I have
introduced earlier in the series.

I won't go into great detail here about the program since it
is copiously annotated but a few points are worth
mentioning.

The input of the floating point numbers is done using a
pseudo OPT function defined at the end of the program.  It
relies on us knowing where BASIC will store the first
variable beginning with a ` sign (pound).  We can use this
knowledge to both put and retrieve BBC BASIC format floating
point numbers.

Ironically, although having separately signed numbers makes
life easier for multiplication and division (next module) it
actually complicates addition and subtraction more than
somewhat.  I have introduced an extra byte to act as an
overflow with each of the numbers in the workspace so that
we can convert negative numbers to 2's complement and back
again.  In fact the BASIC fp routines also use a rounding
byte to improve precision but that does not seem to be
necessary here.

The main routines for addition and subtraction are
straightforward enough.  They are basically five byte
multiple precision similar to those in earlier modules.  The
curious difference is that, as I mentioned before, the bytes
are stored back to front with the most significant byte in
the lowest memory location.

In the main section of the program there are these
subroutines:

'move_sign_bit' moves the sign bits from the top of the
mantissae and puts them into a separate byte for later use.

'equate_exponents' denormalises the smaller of the two
numbers so that the exponents of the two numbers are the
same.  It does this by rotating the mantissa right (which
makes it smaller) while increasing the exponent until the
exponents match.

'neg_convert' makes any negative numbers into 2's
complement, making use of the extra overflow byte.

Then come the addition or subtraction subroutines.

'neg_convert_back' takes any result that is 2's complement
negative and makes it positive while modifying its sign
byte.

Then we trap a zero result since the zero format is
non-standard and would put the renormalising routine into an
endless loop.

'renormalise' adjusts the result until it is a normalised
number (with the top bit of the mantissa set) as expected by
BASIC.  The exponent is adjusted accordingly.  If there is
anything in the overflow byte then the whole mantissa
(including the overflow byte) is rotated right until the
overflow byte is empty.  The exponent is increased by one
for each rotation.  If, during the course of this increment,
the exponent becomes zero then we have generated a number
too large for the system to handle, and an error is
generated.  It has the number 20 but I have given it a
different message to the standard 'too big'.

If the overflow byte is empty then the rest of the mantissa
is rotated left until the top bit of the mantissa is set. 
The exponent is decreased by one for each rotation.  Of
course if the top bit is already set then the number is
correct.

Finally the routine at 'replace_top_bit' calculates the new
sign bit and replaces the top bit of the mantissa with it.

When you run the program you may have to be in MODE 7
because the assember code is rather long.   You enter a
couple of numbers of virtually any size, and you will be
able to compare the addition and subtraction results from
this machine code and from BASIC.  The machine code here is
almost twice as fast as BASIC although in some circumstances
it is not quite as precise.  This is only likely to show as
a difference of 1 in the smallest significant digit between
the two proffered results.

Next time multiplication and division.
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 0d 0d 0d 50  61 72 74 20 32 32 3a 20  |.......Part 22: |
00000090  46 6c 6f 61 74 69 6e 67  20 50 6f 69 6e 74 20 41  |Floating Point A|
000000a0  72 69 74 68 6d 65 74 69  63 0d 0d 0d 49 6e 20 74  |rithmetic...In t|
000000b0  68 65 20 6c 61 73 74 20  6d 6f 64 75 6c 65 20 77  |he last module w|
000000c0  65 20 75 73 65 64 20 61  20 66 69 78 65 64 20 70  |e used a fixed p|
000000d0  6f 69 6e 74 20 61 72 69  74 68 6d 65 74 69 63 20  |oint arithmetic |
000000e0  73 79 73 74 65 6d 0d 66  6f 72 20 63 61 6c 63 75  |system.for calcu|
000000f0  6c 61 74 69 6f 6e 73 2e  20 20 54 68 65 20 72 65  |lations.  The re|
00000100  73 75 6c 74 20 77 61 73  20 72 65 6c 61 74 69 76  |sult was relativ|
00000110  65 6c 79 20 66 61 73 74  20 62 75 74 20 77 61 73  |ely fast but was|
00000120  0d 73 6c 69 67 68 74 6c  79 20 69 6e 6e 61 63 75  |.slightly innacu|
00000130  72 61 74 65 20 73 69 6e  63 65 20 76 65 72 79 20  |rate since very |
00000140  73 6d 61 6c 6c 20 6e 75  6d 62 65 72 73 20 77 65  |small numbers we|
00000150  72 65 20 6e 6f 74 0d 72  65 70 72 65 73 65 6e 74  |re not.represent|
00000160  65 64 20 61 73 20 77 65  6c 6c 20 61 73 20 74 68  |ed as well as th|
00000170  65 79 20 63 6f 75 6c 64  20 68 61 76 65 20 62 65  |ey could have be|
00000180  65 6e 2e 0d 0d 59 6f 75  20 77 69 6c 6c 20 72 65  |en...You will re|
00000190  6d 65 6d 62 65 72 20 74  68 61 74 20 77 65 20 63  |member that we c|
000001a0  6f 6e 76 65 72 74 65 64  20 66 72 6f 6d 20 61 20  |onverted from a |
000001b0  72 65 61 6c 20 6e 75 6d  62 65 72 20 74 6f 20 61  |real number to a|
000001c0  0d 66 69 78 65 64 20 70  6f 69 6e 74 20 6e 75 6d  |.fixed point num|
000001d0  62 65 72 20 62 79 20 6d  75 6c 74 69 70 6c 79 69  |ber by multiplyi|
000001e0  6e 67 20 62 79 20 61 20  63 6f 6e 73 74 61 6e 74  |ng by a constant|
000001f0  20 66 61 63 74 6f 72 2e  20 20 54 68 65 0d 64 65  | factor.  The.de|
00000200  63 69 6d 61 6c 20 65 78  61 6d 70 6c 65 20 77 61  |cimal example wa|
00000210  73 20 74 68 61 74 20 31  32 2e 33 34 20 62 65 63  |s that 12.34 bec|
00000220  61 6d 65 20 31 32 33 34  30 20 69 66 20 74 68 65  |ame 12340 if the|
00000230  20 63 6f 6e 73 74 61 6e  74 0d 66 61 63 74 6f 72  | constant.factor|
00000240  20 77 61 73 20 31 30 30  2c 20 61 6e 64 20 74 68  | was 100, and th|
00000250  61 74 20 2e 30 31 32 33  20 62 65 63 61 6d 65 20  |at .0123 became |
00000260  31 32 20 28 74 68 65 20  6c 61 73 74 20 64 69 67  |12 (the last dig|
00000270  69 74 0d 62 65 69 6e 67  20 6c 6f 73 74 29 2e 20  |it.being lost). |
00000280  20 41 6c 6c 20 6f 75 72  20 63 61 6c 63 75 6c 61  | All our calcula|
00000290  74 69 6e 67 20 77 61 73  20 74 68 65 6e 20 64 6f  |ting was then do|
000002a0  6e 65 20 6f 6e 20 74 68  65 20 6e 65 77 2c 0d 6c  |ne on the new,.l|
000002b0  61 72 67 65 72 20 6e 75  6d 62 65 72 73 2c 20 77  |arger numbers, w|
000002c0  68 69 63 68 20 77 65 72  65 20 69 6e 74 65 67 65  |hich were intege|
000002d0  72 73 20 61 6e 64 20 73  6f 20 77 65 20 63 6f 75  |rs and so we cou|
000002e0  6c 64 20 75 73 65 0d 69  6e 74 65 67 65 72 20 61  |ld use.integer a|
000002f0  72 69 74 68 6d 65 74 69  63 2e 20 20 57 68 65 6e  |rithmetic.  When|
00000300  20 77 65 20 68 61 64 20  6f 75 72 20 69 6e 74 65  | we had our inte|
00000310  67 65 72 20 72 65 73 75  6c 74 20 69 74 20 63 6f  |ger result it co|
00000320  75 6c 64 0d 62 65 20 63  6f 6e 76 65 72 74 65 64  |uld.be converted|
00000330  20 62 61 63 6b 20 74 6f  20 69 74 73 20 70 72 6f  | back to its pro|
00000340  70 65 72 20 73 69 7a 65  20 62 79 20 64 69 76 69  |per size by divi|
00000350  64 69 6e 67 20 62 79 20  74 68 65 0d 63 6f 6e 73  |ding by the.cons|
00000360  74 61 6e 74 20 66 61 63  74 6f 72 2e 20 20 57 65  |tant factor.  We|
00000370  20 61 6c 73 6f 20 6e 65  65 64 65 64 20 74 6f 20  | also needed to |
00000380  6b 6e 6f 77 20 68 6f 77  20 6d 75 6c 74 69 6c 70  |know how multilp|
00000390  6c 79 69 6e 67 0d 61 6e  64 20 64 69 76 69 64 69  |lying.and dividi|
000003a0  6e 67 20 77 6f 75 6c 64  20 62 65 20 61 66 66 65  |ng would be affe|
000003b0  63 74 65 64 20 62 79 20  74 68 69 73 20 66 61 63  |cted by this fac|
000003c0  74 6f 72 20 61 6e 64 20  63 6f 6d 70 65 6e 73 61  |tor and compensa|
000003d0  74 65 0d 66 6f 72 20 69  74 2e 0d 0d 54 68 65 20  |te.for it...The |
000003e0  6e 65 78 74 20 6c 6f 67  69 63 61 6c 20 73 74 65  |next logical ste|
000003f0  70 20 69 6e 20 74 68 69  73 20 6e 75 6d 62 65 72  |p in this number|
00000400  69 6e 67 20 69 73 20 74  6f 20 6d 61 6b 65 20 74  |ing is to make t|
00000410  68 65 0d 66 61 63 74 6f  72 20 76 61 72 69 61 62  |he.factor variab|
00000420  6c 65 20 61 6e 64 20 74  6f 20 6b 65 65 70 20 74  |le and to keep t|
00000430  72 61 63 6b 20 6f 66 20  77 68 61 74 20 69 74 20  |rack of what it |
00000440  69 73 2e 20 20 54 68 69  73 0d 63 6f 75 6c 64 2c  |is.  This.could,|
00000450  20 66 6f 72 20 65 78 61  6d 70 6c 65 2c 20 6d 61  | for example, ma|
00000460  6b 65 20 31 32 2e 33 34  20 62 65 20 72 65 70 72  |ke 12.34 be repr|
00000470  65 73 65 6e 74 65 64 20  62 79 20 61 6e 79 20 6f  |esented by any o|
00000480  66 20 74 68 65 0d 66 6f  6c 6c 6f 77 69 6e 67 3a  |f the.following:|
00000490  0d 0d 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |..              |
000004a0  20 20 20 20 20 20 31 2e  32 33 34 20 2a 20 31 30  |      1.234 * 10|
000004b0  5e 2b 31 0d 20 20 20 20  20 20 20 20 20 20 20 20  |^+1.            |
000004c0  20 20 20 20 20 20 20 20  31 32 2e 33 34 20 2a 20  |        12.34 * |
000004d0  31 30 5e 2b 30 0d 20 20  20 20 20 20 20 20 20 20  |10^+0.          |
000004e0  20 20 20 20 20 20 20 20  20 20 31 32 33 2e 34 20  |          123.4 |
000004f0  2a 20 31 30 5e 2d 31 0d  20 20 20 20 20 20 20 20  |* 10^-1.        |
00000500  20 20 20 20 20 20 20 20  20 20 20 20 31 32 33 34  |            1234|
00000510  20 20 2a 20 31 30 5e 2d  32 0d 0d 74 68 65 20 6c  |  * 10^-2..the l|
00000520  61 73 74 20 64 69 67 69  74 20 62 65 69 6e 67 20  |ast digit being |
00000530  61 20 70 6f 77 65 72 20  6f 66 20 31 30 2e 20 20  |a power of 10.  |
00000540  54 68 69 73 20 69 73 20  74 68 65 20 73 63 69 65  |This is the scie|
00000550  6e 74 69 66 69 63 0d 6e  6f 74 61 74 69 6f 6e 20  |ntific.notation |
00000560  75 73 65 64 20 69 6e 20  74 68 65 20 42 42 43 20  |used in the BBC |
00000570  4d 69 63 72 6f 20 62 75  74 20 77 72 69 74 74 65  |Micro but writte|
00000580  6e 20 61 73 20 45 2d 32  20 65 74 63 2e 20 20 54  |n as E-2 etc.  T|
00000590  68 69 73 0d 70 61 72 74  20 6f 66 20 74 68 65 20  |his.part of the |
000005a0  6e 75 6d 62 65 72 20 69  73 20 63 61 6c 6c 65 64  |number is called|
000005b0  20 74 68 65 20 45 58 50  4f 4e 45 4e 54 2e 20 20  | the EXPONENT.  |
000005c0  53 69 6e 63 65 20 61 6c  6c 20 74 68 65 0d 61 62  |Since all the.ab|
000005d0  6f 76 65 20 6c 69 73 74  20 61 72 65 20 65 71 75  |ove list are equ|
000005e0  69 76 61 6c 65 6e 74 20  74 68 65 72 65 20 69 73  |ivalent there is|
000005f0  20 61 20 6e 65 65 64 20  74 6f 20 64 65 63 69 64  | a need to decid|
00000600  65 20 6f 6e 20 61 0d 6e  6f 72 6d 61 6c 20 66 6f  |e on a.normal fo|
00000610  72 6d 61 74 20 66 6f 72  20 73 75 63 68 20 6e 6f  |rmat for such no|
00000620  74 61 74 69 6f 6e 2e 20  20 54 68 65 72 65 20 69  |tation.  There i|
00000630  73 20 61 20 73 74 61 6e  64 61 72 64 20 74 68 61  |s a standard tha|
00000640  74 0d 73 61 79 73 20 74  68 61 74 20 74 68 65 20  |t.says that the |
00000650  66 69 72 73 74 20 6e 75  6d 62 65 72 20 28 74 68  |first number (th|
00000660  65 20 4d 41 4e 54 49 53  53 41 29 20 6e 75 73 74  |e MANTISSA) nust|
00000670  20 61 6c 77 61 79 73 20  62 65 0d 62 65 74 77 65  | always be.betwe|
00000680  65 6e 20 30 2e 31 20 61  6e 64 20 31 2e 20 20 54  |en 0.1 and 1.  T|
00000690  68 69 73 20 77 6f 75 6c  64 20 6c 65 61 64 20 74  |his would lead t|
000006a0  6f 20 31 32 2e 33 34 20  62 65 69 6e 67 20 77 72  |o 12.34 being wr|
000006b0  69 74 74 65 6e 0d 61 73  20 30 2e 31 32 33 34 45  |itten.as 0.1234E|
000006c0  32 20 28 6d 65 61 6e 69  6e 67 20 6d 75 6c 74 69  |2 (meaning multi|
000006d0  70 6c 69 65 64 20 62 79  20 31 30 20 74 6f 20 74  |plied by 10 to t|
000006e0  68 65 20 70 6f 77 65 72  20 32 29 2e 20 20 54 68  |he power 2).  Th|
000006f0  65 0d 42 42 43 20 4d 69  63 72 6f 20 73 74 61 6e  |e.BBC Micro stan|
00000700  64 61 72 64 20 68 61 73  20 74 68 65 20 6d 61 6e  |dard has the man|
00000710  74 69 73 73 61 20 62 65  74 77 65 65 6e 20 31 20  |tissa between 1 |
00000720  61 6e 64 20 31 30 20 73  6f 20 74 68 61 74 0d 31  |and 10 so that.1|
00000730  32 2e 33 34 20 77 6f 75  6c 64 20 62 65 20 31 2e  |2.34 would be 1.|
00000740  32 33 34 45 31 20 28 6d  65 61 6e 69 6e 67 20 6d  |234E1 (meaning m|
00000750  75 6c 74 69 70 6c 69 65  64 20 62 79 20 31 30 20  |ultiplied by 10 |
00000760  74 6f 20 74 68 65 0d 70  6f 77 65 72 20 31 29 2e  |to the.power 1).|
00000770  0d 0d 48 65 72 65 20 77  65 20 68 61 76 65 20 61  |..Here we have a|
00000780  20 66 6c 6f 61 74 69 6e  67 20 70 6f 69 6e 74 20  | floating point |
00000790  64 65 63 69 6d 61 6c 20  6e 75 6d 62 65 72 69 6e  |decimal numberin|
000007a0  67 20 63 6f 6e 76 65 6e  74 69 6f 6e 0d 73 75 63  |g convention.suc|
000007b0  68 20 74 68 61 74 20 74  68 65 20 6d 61 6e 74 69  |h that the manti|
000007c0  73 73 61 20 69 73 20 61  6c 77 61 79 73 20 6f 66  |ssa is always of|
000007d0  20 61 20 73 69 7a 65 20  62 65 74 77 65 65 6e 20  | a size between |
000007e0  74 77 6f 0d 6c 69 6d 69  74 73 20 61 6e 64 20 74  |two.limits and t|
000007f0  68 65 20 65 78 70 6f 6e  65 6e 74 20 69 73 20 74  |he exponent is t|
00000800  68 65 20 70 6f 77 65 72  20 6f 66 20 31 30 20 62  |he power of 10 b|
00000810  79 20 77 68 69 63 68 20  79 6f 75 0d 6d 75 6c 74  |y which you.mult|
00000820  69 70 6c 79 20 74 68 65  20 6d 61 6e 74 69 73 73  |iply the mantiss|
00000830  61 20 74 6f 20 70 72 6f  64 75 63 65 20 74 68 65  |a to produce the|
00000840  20 72 65 71 75 69 72 65  64 20 6e 75 6d 62 65 72  | required number|
00000850  2e 20 20 59 6f 75 0d 77  69 6c 6c 20 6e 6f 74 69  |.  You.will noti|
00000860  63 65 20 73 74 72 61 69  67 68 74 20 61 77 61 79  |ce straight away|
00000870  20 74 68 61 74 20 74 68  65 20 6d 61 6e 74 69 73  | that the mantis|
00000880  73 61 20 69 73 20 6e 6f  74 20 61 6e 0d 69 6e 74  |sa is not an.int|
00000890  65 67 65 72 2e 20 20 44  6f 65 73 20 74 68 69 73  |eger.  Does this|
000008a0  20 6d 61 74 74 65 72 3f  20 20 49 6e 20 66 61 63  | matter?  In fac|
000008b0  74 20 69 74 20 64 6f 65  73 20 6e 6f 74 2e 0d 0d  |t it does not...|
000008c0  54 68 65 20 6f 62 6a 65  63 74 20 77 69 74 68 20  |The object with |
000008d0  6f 75 72 20 66 69 78 65  64 20 70 6f 69 6e 74 20  |our fixed point |
000008e0  73 79 73 74 65 6d 20 69  6e 20 74 68 65 20 6c 61  |system in the la|
000008f0  73 74 20 70 72 6f 67 72  61 6d 0d 6d 6f 64 75 6c  |st program.modul|
00000900  65 73 20 77 61 73 20 74  6f 20 77 6f 72 6b 20 77  |es was to work w|
00000910  69 74 68 20 69 6e 74 65  67 65 72 73 20 69 6e 20  |ith integers in |
00000920  74 68 65 20 6b 6e 6f 77  6c 65 64 67 65 20 74 68  |the knowledge th|
00000930  61 74 20 6f 75 72 0d 6e  75 6d 62 65 72 73 20 77  |at our.numbers w|
00000940  65 72 65 20 69 6e 20 72  65 61 6c 69 74 79 20 36  |ere in reality 6|
00000950  35 35 33 36 20 74 69 6d  65 73 20 74 6f 6f 20 6c  |5536 times too l|
00000960  61 72 67 65 2e 20 20 42  75 74 20 74 68 65 79 0d  |arge.  But they.|
00000970  77 65 72 65 20 6f 6e 6c  79 20 36 35 35 33 36 20  |were only 65536 |
00000980  74 69 6d 65 73 20 74 6f  6f 20 6c 61 72 67 65 20  |times too large |
00000990  69 66 20 77 65 20 69 6e  73 69 73 74 65 64 20 69  |if we insisted i|
000009a0  6e 20 74 68 69 6e 6b 69  6e 67 0d 6f 66 20 74 68  |n thinking.of th|
000009b0  65 6d 20 61 73 20 69 6e  74 65 67 65 72 73 20 69  |em as integers i|
000009c0  6e 20 74 68 69 73 20 77  61 79 2e 20 20 54 68 65  |n this way.  The|
000009d0  20 61 6c 74 65 72 6e 61  74 69 76 65 20 77 61 79  | alternative way|
000009e0  20 77 61 73 20 74 6f 0d  70 75 74 20 61 20 66 69  | was to.put a fi|
000009f0  63 74 69 63 69 6f 75 73  20 27 64 65 63 69 6d 61  |cticious 'decima|
00000a00  6c 27 20 70 6f 69 6e 74  20 62 65 74 77 65 65 6e  |l' point between|
00000a10  20 74 68 65 20 74 6f 70  20 74 77 6f 20 62 79 74  | the top two byt|
00000a20  65 73 0d 6f 66 20 74 68  65 20 6e 75 6d 62 65 72  |es.of the number|
00000a30  20 61 6e 64 20 74 68 65  20 62 6f 74 74 6f 6d 20  | and the bottom |
00000a40  74 77 6f 2e 20 20 54 68  69 73 20 6d 65 74 68 6f  |two.  This metho|
00000a50  64 20 77 6f 75 6c 64 20  68 61 76 65 0d 77 6f 72  |d would have.wor|
00000a60  6b 65 64 20 65 71 75 61  6c 6c 79 20 77 65 6c 6c  |ked equally well|
00000a70  20 61 6e 64 20 69 73 20  65 73 73 65 6e 74 69 61  | and is essentia|
00000a80  6c 6c 79 20 74 68 65 20  73 61 6d 65 2c 20 69 74  |lly the same, it|
00000a90  20 77 61 73 20 6f 6e 6c  79 0d 61 20 71 75 65 73  | was only.a ques|
00000aa0  74 69 6f 6e 20 6f 66 20  68 6f 77 20 77 65 20 76  |tion of how we v|
00000ab0  69 73 75 61 6c 69 73 65  64 20 74 68 65 20 6e 75  |isualised the nu|
00000ac0  6d 62 65 72 73 20 62 65  69 6e 67 20 73 74 6f 72  |mbers being stor|
00000ad0  65 64 2e 0d 0d 54 68 65  20 72 75 6c 65 73 20 66  |ed...The rules f|
00000ae0  6f 72 20 61 72 69 74 68  6d 65 74 69 63 20 66 6f  |or arithmetic fo|
00000af0  72 20 66 6c 6f 61 74 69  6e 67 20 70 6f 69 6e 74  |r floating point|
00000b00  20 61 72 65 20 73 69 6d  69 6c 61 72 20 74 6f 0d  | are similar to.|
00000b10  74 68 6f 73 65 20 66 6f  72 20 66 69 78 65 64 20  |those for fixed |
00000b20  70 6f 69 6e 74 2c 20 65  78 63 65 70 74 20 74 68  |point, except th|
00000b30  61 74 20 74 68 65 20 63  6f 6e 73 74 61 6e 74 20  |at the constant |
00000b40  66 61 63 74 6f 72 20 69  73 0d 6e 6f 77 20 76 61  |factor is.now va|
00000b50  72 69 61 62 6c 65 20 61  6e 64 20 69 73 20 6b 6e  |riable and is kn|
00000b60  6f 77 6e 20 61 73 20 74  68 65 20 65 78 70 6f 6e  |own as the expon|
00000b70  65 6e 74 2e 0d 0d 41 64  64 69 74 69 6f 6e 20 72  |ent...Addition r|
00000b80  65 71 75 69 72 65 73 20  74 68 61 74 20 74 68 65  |equires that the|
00000b90  20 65 78 70 6f 6e 65 6e  74 20 6f 66 20 74 68 65  | exponent of the|
00000ba0  20 74 77 6f 20 6e 75 6d  62 65 72 73 20 62 65 0d  | two numbers be.|
00000bb0  74 68 65 20 73 61 6d 65  2c 20 74 68 65 6e 20 74  |the same, then t|
00000bc0  68 65 20 6d 61 6e 74 69  73 73 61 65 20 61 72 65  |he mantissae are|
00000bd0  20 61 64 64 65 64 2e 20  20 59 6f 75 20 6b 65 65  | added.  You kee|
00000be0  70 20 74 68 65 20 73 69  7a 65 0d 6f 66 20 74 68  |p the size.of th|
00000bf0  65 20 6e 75 6d 62 65 72  20 74 68 65 20 73 61 6d  |e number the sam|
00000c00  65 20 62 79 20 6d 75 6c  74 69 70 6c 79 69 6e 67  |e by multiplying|
00000c10  20 74 68 65 20 6d 61 6e  74 69 73 73 61 20 62 79  | the mantissa by|
00000c20  20 31 30 20 74 6f 0d 74  68 65 20 70 6f 77 65 72  | 10 to.the power|
00000c30  20 6f 66 20 74 68 65 20  6e 75 6d 62 65 72 20 79  | of the number y|
00000c40  6f 75 20 73 75 62 74 72  61 63 74 20 66 72 6f 6d  |ou subtract from|
00000c50  20 74 68 65 20 65 78 70  6f 6e 65 6e 74 20 28 6f  | the exponent (o|
00000c60  72 0d 76 69 63 65 20 76  65 72 73 61 29 2e 0d 0d  |r.vice versa)...|
00000c70  46 6f 72 20 65 78 61 6d  70 6c 65 0d 20 20 20 20  |For example.    |
00000c80  20 20 20 20 20 20 20 20  20 20 20 20 31 2e 32 33  |            1.23|
00000c90  45 35 20 2b 20 32 2e 33  34 45 33 0d 0d 73 65 74  |E5 + 2.34E3..set|
00000ca0  74 69 6e 67 20 62 6f 74  68 20 74 6f 20 68 61 76  |ting both to hav|
00000cb0  65 20 61 6e 20 65 78 70  6f 6e 65 6e 74 20 6f 66  |e an exponent of|
00000cc0  20 45 33 0d 0d 20 20 20  20 20 20 20 20 20 20 20  | E3..           |
00000cd0  20 20 3d 20 20 31 32 33  45 33 20 2b 20 32 2e 33  |  =  123E3 + 2.3|
00000ce0  34 45 33 0d 20 20 20 20  20 20 20 20 20 20 20 20  |4E3.            |
00000cf0  20 3d 20 20 31 32 35 2e  33 34 45 33 0d 20 20 20  | =  125.34E3.   |
00000d00  20 20 20 20 20 20 20 20  20 20 3d 20 20 31 2e 32  |          =  1.2|
00000d10  35 33 34 45 35 20 20 28  72 65 2d 6e 6f 72 6d 61  |534E5  (re-norma|
00000d20  6c 69 73 65 64 29 0d 0d  49 74 20 69 73 20 75 70  |lised)..It is up|
00000d30  20 74 6f 20 79 6f 75 20  77 68 69 63 68 20 6e 75  | to you which nu|
00000d40  6d 62 65 72 20 79 6f 75  20 64 65 2d 6e 6f 72 6d  |mber you de-norm|
00000d50  61 6c 69 73 65 20 74 6f  20 6d 61 74 63 68 0d 77  |alise to match.w|
00000d60  68 69 63 68 2e 20 20 4f  6e 20 70 61 70 65 72 20  |hich.  On paper |
00000d70  69 74 20 69 73 20 6f 66  74 65 6e 20 63 6c 65 61  |it is often clea|
00000d80  72 65 72 20 74 6f 20 61  76 6f 69 64 20 74 6f 6f  |rer to avoid too|
00000d90  20 6d 61 6e 79 20 7a 65  72 6f 73 0d 62 79 20 64  | many zeros.by d|
00000da0  65 2d 6e 6f 72 6d 61 6c  69 73 69 6e 67 20 74 68  |e-normalising th|
00000db0  65 20 6c 61 72 67 65 72  20 6e 75 6d 62 65 72 2e  |e larger number.|
00000dc0  0d 0d 53 75 62 74 72 61  63 74 69 6f 6e 20 69 73  |..Subtraction is|
00000dd0  20 73 69 6d 69 6c 61 72  20 74 6f 20 61 64 64 69  | similar to addi|
00000de0  74 69 6f 6e 20 69 6e 20  74 68 61 74 20 74 68 65  |tion in that the|
00000df0  20 65 78 70 6f 6e 65 6e  74 73 0d 6d 75 73 74 20  | exponents.must |
00000e00  62 65 20 6d 61 64 65 20  74 68 65 20 73 61 6d 65  |be made the same|
00000e10  20 62 65 66 6f 72 65 20  73 75 62 74 72 61 63 74  | before subtract|
00000e20  69 6f 6e 2c 20 74 68 65  6e 20 6e 6f 72 6d 61 6c  |ion, then normal|
00000e30  69 73 61 74 69 6f 6e 0d  69 73 20 63 61 72 72 69  |isation.is carri|
00000e40  65 64 20 6f 75 74 2e 0d  0d 4d 75 6c 74 69 70 6c  |ed out...Multipl|
00000e50  69 63 61 74 69 6f 6e 20  69 73 20 64 6f 6e 65 20  |ication is done |
00000e60  62 79 20 6d 75 6c 74 69  70 6c 79 69 6e 67 20 74  |by multiplying t|
00000e70  68 65 20 6d 61 6e 74 69  73 73 61 65 20 61 6e 64  |he mantissae and|
00000e80  0d 61 64 64 69 6e 67 20  74 68 65 20 65 78 70 6f  |.adding the expo|
00000e90  6e 65 6e 74 73 2e 0d 0d  46 6f 72 20 65 78 61 6d  |nents...For exam|
00000ea0  70 6c 65 0d 20 20 20 20  20 20 20 20 20 20 20 20  |ple.            |
00000eb0  20 20 20 20 31 2e 32 33  45 35 20 2a 20 32 2e 33  |    1.23E5 * 2.3|
00000ec0  34 45 33 0d 20 20 20 20  20 20 20 20 20 20 20 20  |4E3.            |
00000ed0  20 3d 20 20 28 31 2e 32  33 2a 32 2e 33 34 29 45  | =  (1.23*2.34)E|
00000ee0  38 0d 20 20 20 20 20 20  20 20 20 20 20 20 20 3d  |8.             =|
00000ef0  20 20 32 2e 38 37 38 32  45 38 0d 0d 49 6e 20 74  |  2.8782E8..In t|
00000f00  68 69 73 20 63 61 73 65  20 77 65 20 64 6f 6e 27  |his case we don'|
00000f10  74 20 6e 65 65 64 20 74  6f 20 72 65 6e 6f 72 6d  |t need to renorm|
00000f20  61 6c 69 73 65 2e 0d 0d  44 69 76 69 73 69 6f 6e  |alise...Division|
00000f30  20 69 73 20 73 69 6d 69  6c 61 72 20 74 6f 20 6d  | is similar to m|
00000f40  75 6c 74 69 70 6c 69 63  61 74 69 6f 6e 20 69 6e  |ultiplication in|
00000f50  20 74 68 61 74 20 77 65  20 64 69 76 69 64 65 20  | that we divide |
00000f60  74 68 65 0d 6d 61 6e 74  69 73 73 61 65 20 61 6e  |the.mantissae an|
00000f70  64 20 73 75 62 74 72 61  63 74 20 74 68 65 20 65  |d subtract the e|
00000f80  78 70 6f 6e 65 6e 74 73  2e 0d 0d 46 6f 72 20 65  |xponents...For e|
00000f90  78 61 6d 70 6c 65 0d 20  20 20 20 20 20 20 20 20  |xample.         |
00000fa0  20 20 20 20 20 20 20 31  2e 32 33 45 35 20 2f 20  |       1.23E5 / |
00000fb0  32 2e 33 34 45 33 20 0d  20 20 20 20 20 20 20 20  |2.34E3 .        |
00000fc0  20 20 20 20 20 3d 20 20  28 31 2e 32 33 2f 32 2e  |     =  (1.23/2.|
00000fd0  33 34 29 45 32 0d 20 20  20 20 20 20 20 20 20 20  |34)E2.          |
00000fe0  20 20 20 3d 20 20 30 2e  35 32 35 36 45 32 0d 20  |   =  0.5256E2. |
00000ff0  20 20 20 20 20 20 20 20  20 20 20 20 3d 20 20 35  |            =  5|
00001000  2e 32 35 36 45 31 20 20  20 61 70 70 72 6f 78 69  |.256E1   approxi|
00001010  6d 61 74 65 6c 79 0d 0d  49 6e 63 69 64 65 6e 74  |mately..Incident|
00001020  61 6c 6c 79 2c 20 74 68  65 20 68 61 62 69 74 20  |ally, the habit |
00001030  6f 66 20 77 6f 72 6b 69  6e 67 20 77 69 74 68 20  |of working with |
00001040  6d 61 6e 74 69 73 73 61  65 20 62 65 74 77 65 65  |mantissae betwee|
00001050  6e 20 30 0d 61 6e 64 20  31 20 6f 72 20 62 65 74  |n 0.and 1 or bet|
00001060  77 65 65 6e 20 31 20 61  6e 64 20 31 30 20 64 61  |ween 1 and 10 da|
00001070  74 65 73 20 62 61 63 6b  20 74 6f 20 74 68 65 20  |tes back to the |
00001080  64 61 79 73 20 6f 66 20  73 6c 69 64 65 0d 72 75  |days of slide.ru|
00001090  6c 65 73 2e 20 20 54 68  65 20 73 6c 69 64 65 20  |les.  The slide |
000010a0  72 75 6c 65 20 77 6f 75  6c 64 20 74 61 6b 65 20  |rule would take |
000010b0  63 61 72 65 20 6f 66 20  74 68 65 20 63 61 6c 63  |care of the calc|
000010c0  75 6c 61 74 69 6f 6e 73  0d 6f 66 20 74 68 65 20  |ulations.of the |
000010d0  6d 61 6e 74 69 73 73 61  65 20 62 75 74 20 69 74  |mantissae but it|
000010e0  20 77 61 73 20 75 70 20  74 6f 20 79 6f 75 20 74  | was up to you t|
000010f0  6f 20 73 6f 72 74 20 6f  75 74 20 74 68 65 0d 70  |o sort out the.p|
00001100  6f 73 69 74 69 6f 6e 20  6f 66 20 79 6f 75 72 20  |osition of your |
00001110  64 65 63 69 6d 61 6c 20  70 6f 69 6e 74 2e 0d 0d  |decimal point...|
00001120  42 42 43 20 42 41 53 49  43 20 68 61 73 20 61 20  |BBC BASIC has a |
00001130  63 6f 6e 76 65 6e 74 69  6f 6e 20 66 6f 72 20 66  |convention for f|
00001140  6c 6f 61 74 69 6e 67 20  70 6f 69 6e 74 20 61 72  |loating point ar|
00001150  69 74 68 6d 65 74 69 63  0d 77 68 69 63 68 20 77  |ithmetic.which w|
00001160  65 20 77 69 6c 6c 20 75  73 65 20 69 6e 20 74 68  |e will use in th|
00001170  69 73 20 6d 6f 64 75 6c  65 2e 20 20 55 73 69 6e  |is module.  Usin|
00001180  67 20 74 68 65 20 65 78  69 73 69 74 69 6e 67 0d  |g the exisiting.|
00001190  63 6f 6e 76 65 6e 74 69  6f 6e 20 6d 65 61 6e 73  |convention means|
000011a0  20 49 20 63 61 6e 20 75  73 65 20 42 42 43 20 42  | I can use BBC B|
000011b0  41 53 49 43 20 74 6f 20  74 72 61 6e 73 6c 61 74  |ASIC to translat|
000011c0  65 20 66 72 6f 6d 0d 64  65 63 69 6d 61 6c 20 69  |e from.decimal i|
000011d0  6e 74 6f 20 66 6c 6f 61  74 69 6e 67 20 70 6f 69  |nto floating poi|
000011e0  6e 74 20 69 6e 73 74 65  61 64 20 6f 66 20 77 72  |nt instead of wr|
000011f0  69 74 69 6e 67 20 61 20  63 6f 6e 76 65 72 73 69  |iting a conversi|
00001200  6f 6e 0d 72 6f 75 74 69  6e 65 2e 20 20 54 68 69  |on.routine.  Thi|
00001210  73 20 63 6f 75 6c 64 20  62 65 20 64 6f 6e 65 20  |s could be done |
00001220  62 79 20 6d 6f 64 69 66  79 69 6e 67 20 74 68 65  |by modifying the|
00001230  20 41 53 43 49 49 20 74  6f 0d 62 69 6e 61 72 79  | ASCII to.binary|
00001240  20 72 6f 75 74 69 6e 65  20 69 6e 20 6d 6f 64 75  | routine in modu|
00001250  6c 65 20 31 32 2e 0d 0d  46 69 76 65 20 62 79 74  |le 12...Five byt|
00001260  65 73 20 61 72 65 20 75  73 65 64 20 74 6f 20 73  |es are used to s|
00001270  74 6f 72 65 20 61 20 6e  75 6d 62 65 72 2c 20 66  |tore a number, f|
00001280  6f 75 72 20 62 79 74 65  73 20 6f 66 0d 6d 61 6e  |our bytes of.man|
00001290  74 69 73 73 61 20 61 6e  64 20 6f 6e 65 20 6f 66  |tissa and one of|
000012a0  20 65 78 70 6f 6e 65 6e  74 2e 0d 0d 54 68 65 20  | exponent...The |
000012b0  62 69 6e 61 72 79 20 65  71 75 69 76 61 6c 65 6e  |binary equivalen|
000012c0  74 20 6f 66 20 6f 66 20  33 2e 32 35 20 69 73 20  |t of of 3.25 is |
000012d0  31 31 2e 30 31 20 73 69  6e 63 65 2c 20 61 66 74  |11.01 since, aft|
000012e0  65 72 20 74 68 65 0d 62  69 6e 61 72 79 20 70 6f  |er the.binary po|
000012f0  69 6e 74 2c 20 74 68 65  20 66 69 72 73 74 20 70  |int, the first p|
00001300  6c 61 63 65 20 69 73 20  27 68 61 6c 76 65 73 27  |lace is 'halves'|
00001310  20 74 68 65 20 73 65 63  6f 6e 64 20 69 73 0d 27  | the second is.'|
00001320  71 75 61 72 74 65 72 73  27 2c 20 74 68 65 20 74  |quarters', the t|
00001330  68 69 72 64 20 69 73 20  27 65 69 67 68 74 68 73  |hird is 'eighths|
00001340  27 20 61 6e 64 20 73 6f  20 6f 6e 2e 0d 0d 54 6f  |' and so on...To|
00001350  20 6e 6f 72 6d 61 6c 69  73 65 20 74 68 69 73 20  | normalise this |
00001360  6e 75 6d 62 65 72 20 75  6e 64 65 72 20 74 68 65  |number under the|
00001370  20 42 42 43 20 42 41 53  49 43 20 63 6f 6e 76 65  | BBC BASIC conve|
00001380  6e 74 69 6f 6e 77 65 0d  6d 75 73 74 20 68 61 76  |ntionwe.must hav|
00001390  65 20 74 68 65 20 62 69  6e 61 72 79 20 70 6f 69  |e the binary poi|
000013a0  6e 74 20 61 74 20 74 68  65 20 68 65 61 64 20 6f  |nt at the head o|
000013b0  66 20 74 68 65 20 6e 75  6d 62 65 72 20 73 75 63  |f the number suc|
000013c0  68 0d 74 68 61 74 0d 0d  20 20 20 20 20 20 33 2e  |h.that..      3.|
000013d0  32 35 20 28 64 65 63 69  6d 61 6c 29 20 3d 20 31  |25 (decimal) = 1|
000013e0  31 2e 30 31 20 28 62 69  6e 61 72 79 29 20 3d 20  |1.01 (binary) = |
000013f0  2e 31 31 30 31 20 78 32  5e 32 0d 0d 54 68 69 73  |.1101 x2^2..This|
00001400  20 67 69 76 65 73 20 75  73 20 61 20 72 65 70 72  | gives us a repr|
00001410  65 73 65 6e 74 61 74 69  6f 6e 20 69 6e 20 6d 65  |esentation in me|
00001420  6d 6f 72 79 20 6c 69 6b  65 20 74 68 69 73 0d 0d  |mory like this..|
00001430  20 20 45 78 70 6f 6e 65  6e 74 20 20 20 20 20 4d  |  Exponent     M|
00001440  61 6e 74 69 73 73 61 0d  20 20 2d 2d 2d 2d 2d 2d  |antissa.  ------|
00001450  2d 2d 2d 2d 2d 2d 2d 2d  2d 2d 2d 2d 2d 2d 2d 2d  |----------------|
*
00001480  2d 2d 0d 20 20 7c 20 30  30 30 30 30 30 31 30 20  |--.  | 00000010 |
00001490  7c 20 31 31 30 31 30 30  30 30 20 7c 20 30 30 30  || 11010000 | 000|
000014a0  30 30 30 30 30 20 7c 20  30 30 30 30 30 30 30 30  |00000 | 00000000|
000014b0  20 7c 20 30 30 30 30 30  30 30 30 20 7c 0d 20 20  | | 00000000 |.  |
000014c0  2d 2d 2d 2d 2d 2d 2d 2d  2d 2d 2d 2d 2d 2d 2d 2d  |----------------|
*
000014f0  2d 2d 2d 2d 2d 2d 2d 2d  0d 0d 73 69 6e 63 65 20  |--------..since |
00001500  74 68 65 20 65 78 70 6f  6e 65 6e 74 20 69 73 20  |the exponent is |
00001510  32 20 28 31 30 20 69 6e  20 62 69 6e 61 72 79 29  |2 (10 in binary)|
00001520  20 61 6e 64 20 74 68 65  20 6d 61 6e 74 69 73 73  | and the mantiss|
00001530  61 20 69 73 0d 61 6c 69  67 6e 65 64 20 74 6f 20  |a is.aligned to |
00001540  74 68 65 20 6c 65 66 74  2e 20 20 49 6e 20 74 68  |the left.  In th|
00001550  69 73 20 63 61 73 65 2c  20 6c 69 6b 65 20 6f 6e  |is case, like on|
00001560  65 20 6f 66 20 6f 75 72  0d 63 6f 6e 76 65 6e 74  |e of our.convent|
00001570  69 6f 6e 73 20 66 6f 72  20 64 65 63 69 6d 61 6c  |ions for decimal|
00001580  20 66 6c 6f 61 74 69 6e  67 20 70 6f 69 6e 74 2c  | floating point,|
00001590  20 74 68 65 20 6d 61 6e  74 69 73 73 61 20 69 73  | the mantissa is|
000015a0  0d 61 6c 77 61 79 73 20  62 65 74 77 65 65 6e 20  |.always between |
000015b0  30 20 61 6e 64 20 31 2e  20 20 49 6e 20 65 66 66  |0 and 1.  In eff|
000015c0  65 63 74 20 79 6f 75 20  73 68 69 66 74 20 74 68  |ect you shift th|
000015d0  65 20 6d 61 6e 74 69 73  73 61 0d 75 6e 74 69 6c  |e mantissa.until|
000015e0  20 69 74 73 20 74 6f 70  20 62 69 74 20 69 73 20  | its top bit is |
000015f0  73 65 74 2e 20 20 54 68  69 73 20 6d 65 61 6e 73  |set.  This means|
00001600  20 79 6f 75 20 63 61 6e  20 63 68 65 63 6b 20 74  | you can check t|
00001610  68 65 0d 6e 65 67 61 74  69 76 65 20 66 6c 61 67  |he.negative flag|
00001620  20 28 77 68 69 63 68 20  72 65 66 6c 65 63 74 73  | (which reflects|
00001630  20 62 69 74 20 37 29 20  6f 66 20 74 68 65 20 66  | bit 7) of the f|
00001640  69 72 73 74 20 6d 61 6e  74 69 73 73 61 0d 62 79  |irst mantissa.by|
00001650  74 65 20 69 66 20 79 6f  75 20 77 61 6e 74 20 74  |te if you want t|
00001660  6f 20 63 68 65 63 6b 20  66 6f 72 20 6e 6f 72 6d  |o check for norm|
00001670  61 6c 69 73 61 74 69 6f  6e 2e 0d 0d 49 74 20 69  |alisation...It i|
00001680  73 20 76 69 74 61 6c 20  74 6f 20 72 65 6d 65 6d  |s vital to remem|
00001690  62 65 72 20 74 68 61 74  2c 20 75 6e 6c 69 6b 65  |ber that, unlike|
000016a0  20 69 6e 74 65 67 65 72  20 6e 75 6d 62 65 72 73  | integer numbers|
000016b0  2c 20 77 68 65 72 65 0d  74 68 65 20 6d 6f 73 74  |, where.the most|
000016c0  20 73 69 67 6e 69 66 69  63 61 6e 74 20 62 79 74  | significant byt|
000016d0  65 20 69 73 20 73 74 6f  72 65 64 20 61 74 20 74  |e is stored at t|
000016e0  68 65 20 67 72 65 61 74  65 73 74 20 61 64 64 72  |he greatest addr|
000016f0  65 73 73 2c 0d 77 69 74  68 20 66 6c 6f 61 74 69  |ess,.with floati|
00001700  6e 67 20 70 6f 69 6e 74  20 69 6e 20 74 68 65 20  |ng point in the |
00001710  42 42 43 20 4d 69 63 72  6f 20 74 68 65 20 65 78  |BBC Micro the ex|
00001720  70 6f 6e 65 6e 74 20 69  73 20 61 74 20 74 68 65  |ponent is at the|
00001730  0d 6c 6f 77 65 73 74 20  61 64 64 72 65 73 73 20  |.lowest address |
00001740  61 6e 64 20 74 68 65 20  6d 61 6e 74 69 73 73 61  |and the mantissa|
00001750  20 69 73 20 73 74 6f 72  65 64 20 69 6e 20 74 68  | is stored in th|
00001760  65 20 6e 65 78 74 20 66  6f 75 72 0d 68 69 67 68  |e next four.high|
00001770  65 72 20 62 79 74 65 73  2c 20 77 69 74 68 20 74  |er bytes, with t|
00001780  68 65 20 6d 6f 73 74 20  73 69 67 6e 69 66 69 63  |he most signific|
00001790  61 6e 74 20 62 79 74 65  20 69 6e 20 74 68 65 20  |ant byte in the |
000017a0  4c 4f 57 45 53 54 0d 61  64 64 72 65 73 73 2e 0d  |LOWEST.address..|
000017b0  0d 4e 6f 77 2c 20 62 65  63 61 75 73 65 20 74 68  |.Now, because th|
000017c0  65 20 66 69 72 73 74 20  62 69 74 20 6f 66 20 74  |e first bit of t|
000017d0  68 65 20 6d 61 6e 74 69  73 73 61 20 69 73 20 41  |he mantissa is A|
000017e0  4c 57 41 59 53 20 67 6f  69 6e 67 0d 74 6f 20 62  |LWAYS going.to b|
000017f0  65 20 73 65 74 2c 20 75  6e 6c 65 73 73 20 74 68  |e set, unless th|
00001800  65 20 6e 75 6d 62 65 72  20 69 73 20 7a 65 72 6f  |e number is zero|
00001810  2c 20 42 41 53 49 43 20  75 73 65 73 20 74 68 61  |, BASIC uses tha|
00001820  74 20 74 6f 70 0d 62 69  74 20 74 6f 20 64 65 6e  |t top.bit to den|
00001830  6f 74 65 20 73 69 67 6e  2e 20 20 54 68 69 73 20  |ote sign.  This |
00001840  69 73 20 6e 6f 74 20 61  20 32 27 73 20 63 6f 6d  |is not a 2's com|
00001850  70 6c 65 6d 65 6e 74 20  6e 6f 74 61 74 69 6f 6e  |plement notation|
00001860  2c 0d 69 74 20 69 73 20  70 75 72 65 6c 79 20 61  |,.it is purely a|
00001870  6e 64 20 73 69 6d 70 6c  79 20 61 20 73 69 67 6e  |nd simply a sign|
00001880  20 62 69 74 2e 20 20 49  66 20 69 74 20 69 73 20  | bit.  If it is |
00001890  73 65 74 20 74 68 65 20  6e 75 6d 62 65 72 0d 69  |set the number.i|
000018a0  73 20 70 6f 73 69 74 69  76 65 2c 20 69 66 20 69  |s positive, if i|
000018b0  74 20 69 73 20 63 6c 65  61 72 20 74 68 65 20 6e  |t is clear the n|
000018c0  75 6d 62 65 72 20 69 73  20 6e 65 67 61 74 69 76  |umber is negativ|
000018d0  65 2e 20 20 42 75 74 0d  72 65 6d 65 6d 62 65 72  |e.  But.remember|
000018e0  20 74 68 61 74 20 74 68  69 73 20 69 73 20 75 73  | that this is us|
000018f0  69 6e 67 20 61 20 62 69  74 20 74 68 61 74 20 6f  |ing a bit that o|
00001900  75 67 68 74 20 74 6f 20  62 65 20 73 65 74 20 61  |ught to be set a|
00001910  73 20 61 0d 66 6c 61 67  20 61 6e 64 20 69 6e 20  |s a.flag and in |
00001920  66 61 63 74 20 74 68 65  20 74 6f 70 20 62 69 74  |fact the top bit|
00001930  20 69 73 20 61 63 74 75  61 6c 6c 79 20 61 6c 77  | is actually alw|
00001940  61 79 73 20 73 65 74 2e  0d 0d 4f 6e 65 20 66 69  |ays set...One fi|
00001950  6e 61 6c 20 63 6f 6e 74  72 69 76 61 6e 63 65 20  |nal contrivance |
00001960  6f 66 20 42 42 43 20 42  41 53 49 43 20 69 73 20  |of BBC BASIC is |
00001970  74 6f 20 61 64 64 20 26  38 30 20 74 6f 20 74 68  |to add &80 to th|
00001980  65 0d 65 78 70 6f 6e 65  6e 74 20 74 6f 20 61 69  |e.exponent to ai|
00001990  64 20 69 6e 20 63 61 6c  63 75 6c 61 74 69 6e 67  |d in calculating|
000019a0  2c 20 73 6f 20 49 20 68  61 76 65 20 64 6f 6e 65  |, so I have done|
000019b0  20 74 68 61 74 20 62 65  6c 6f 77 2e 0d 0d 48 65  | that below...He|
000019c0  6e 63 65 2c 20 74 68 69  73 20 69 73 20 74 68 65  |nce, this is the|
000019d0  20 72 65 70 72 65 73 65  6e 74 61 74 69 6f 6e 20  | representation |
000019e0  6f 66 20 33 2e 32 35 0d  0d 0d 20 20 45 78 70 6f  |of 3.25...  Expo|
000019f0  6e 65 6e 74 20 20 20 20  20 4d 61 6e 74 69 73 73  |nent     Mantiss|
00001a00  61 0d 20 20 2d 2d 2d 2d  2d 2d 2d 2d 2d 2d 2d 2d  |a.  ------------|
00001a10  2d 2d 2d 2d 2d 2d 2d 2d  2d 2d 2d 2d 2d 2d 2d 2d  |----------------|
*
00001a30  2d 2d 2d 2d 2d 2d 2d 2d  2d 2d 2d 2d 0d 20 20 7c  |------------.  ||
00001a40  20 31 30 30 30 30 30 31  30 20 7c 20 30 31 30 31  | 10000010 | 0101|
00001a50  30 30 30 30 20 7c 20 30  30 30 30 30 30 30 30 20  |0000 | 00000000 |
00001a60  7c 20 30 30 30 30 30 30  30 30 20 7c 20 30 30 30  || 00000000 | 000|
00001a70  30 30 30 30 30 20 7c 0d  20 20 2d 2d 2d 2d 2d 2d  |00000 |.  ------|
00001a80  2d 2d 2d 2d 2d 2d 2d 2d  2d 2d 2d 2d 2d 2d 2d 2d  |----------------|
*
00001ab0  2d 2d 0d 20 20 20 20 26  38 32 20 20 20 20 20 20  |--.    &82      |
00001ac0  20 20 26 35 30 20 20 20  20 20 20 20 20 26 30 30  |  &50        &00|
00001ad0  20 20 20 20 20 20 20 20  26 30 30 20 20 20 20 20  |        &00     |
00001ae0  20 20 20 26 30 30 0d 0d  61 6e 64 20 74 68 69 73  |   &00..and this|
00001af0  20 6f 66 20 2d 33 2e 32  35 0d 0d 20 20 45 78 70  | of -3.25..  Exp|
00001b00  6f 6e 65 6e 74 20 20 20  20 20 4d 61 6e 74 69 73  |onent     Mantis|
00001b10  73 61 0d 20 20 2d 2d 2d  2d 2d 2d 2d 2d 2d 2d 2d  |sa.  -----------|
00001b20  2d 2d 2d 2d 2d 2d 2d 2d  2d 2d 2d 2d 2d 2d 2d 2d  |----------------|
*
00001b40  2d 2d 2d 2d 2d 2d 2d 2d  2d 2d 2d 2d 2d 0d 20 20  |-------------.  |
00001b50  7c 20 31 30 30 30 30 30  31 30 20 7c 20 31 31 30  || 10000010 | 110|
00001b60  31 30 30 30 30 20 7c 20  30 30 30 30 30 30 30 30  |10000 | 00000000|
00001b70  20 7c 20 30 30 30 30 30  30 30 30 20 7c 20 30 30  | | 00000000 | 00|
00001b80  30 30 30 30 30 30 20 7c  0d 20 20 2d 2d 2d 2d 2d  |000000 |.  -----|
00001b90  2d 2d 2d 2d 2d 2d 2d 2d  2d 2d 2d 2d 2d 2d 2d 2d  |----------------|
*
00001bc0  2d 2d 2d 0d 20 20 20 20  26 38 32 20 20 20 20 20  |---.    &82     |
00001bd0  20 20 20 26 44 30 20 20  20 20 20 20 20 20 26 30  |   &D0        &0|
00001be0  30 20 20 20 20 20 20 20  20 26 30 30 20 20 20 20  |0        &00    |
00001bf0  20 20 20 20 26 30 30 0d  0d 5a 65 72 6f 20 69 73  |    &00..Zero is|
00001c00  20 73 74 6f 72 65 64 20  61 73 20 66 69 76 65 20  | stored as five |
00001c10  7a 65 72 6f 20 62 79 74  65 73 2e 0d 0d 49 6e 20  |zero bytes...In |
00001c20  63 61 6c 63 75 6c 61 74  69 6e 67 20 77 69 74 68  |calculating with|
00001c30  20 66 6c 6f 61 74 69 6e  67 20 70 6f 69 6e 74 20  | floating point |
00001c40  6e 75 6d 62 65 72 73 20  6f 66 20 74 68 69 73 20  |numbers of this |
00001c50  66 6f 72 6d 61 74 20 77  65 0d 68 61 76 65 20 74  |format we.have t|
00001c60  68 72 65 65 20 6f 70 65  72 61 74 69 6f 6e 73 2e  |hree operations.|
00001c70  20 20 46 69 72 73 74 6c  79 20 77 65 20 63 61 72  |  Firstly we car|
00001c80  72 79 20 6f 75 74 20 74  68 65 20 63 61 6c 63 75  |ry out the calcu|
00001c90  6c 61 74 69 6f 6e 0d 6f  6e 20 74 68 65 20 6d 61  |lation.on the ma|
00001ca0  6e 74 69 73 73 61 65 2c  20 73 65 63 6f 6e 64 6c  |ntissae, secondl|
00001cb0  79 20 77 65 20 63 61 72  72 79 20 6f 75 74 20 74  |y we carry out t|
00001cc0  68 65 20 6f 70 65 72 61  74 69 6f 6e 20 6f 6e 20  |he operation on |
00001cd0  74 68 65 0d 65 78 70 6f  6e 65 6e 74 73 20 61 6e  |the.exponents an|
00001ce0  64 20 66 69 6e 61 6c 6c  79 20 77 65 20 6e 6f 72  |d finally we nor|
00001cf0  6d 61 6c 69 73 65 20 74  68 65 20 72 65 73 75 6c  |malise the resul|
00001d00  74 2e 0d 0d 54 68 65 20  70 72 6f 67 72 61 6d 20  |t...The program |
00001d10  69 6e 20 74 68 69 73 20  6d 6f 64 75 6c 65 20 74  |in this module t|
00001d20  61 6b 65 73 20 61 20 70  61 69 72 20 6f 66 20 6e  |akes a pair of n|
00001d30  75 6d 62 65 72 73 20 79  6f 75 20 65 6e 74 65 72  |umbers you enter|
00001d40  0d 61 6e 64 20 63 61 6c  63 75 6c 61 74 65 73 20  |.and calculates |
00001d50  74 68 65 20 73 75 6d 20  61 6e 64 20 64 69 66 66  |the sum and diff|
00001d60  65 72 65 6e 63 65 20 6f  66 20 74 68 65 6d 20 75  |erence of them u|
00001d70  73 69 6e 67 20 6d 6f 64  69 66 69 65 64 0d 76 65  |sing modified.ve|
00001d80  72 73 69 6f 6e 73 20 6f  66 20 74 68 65 20 6d 75  |rsions of the mu|
00001d90  6c 74 69 2d 62 79 74 65  20 61 72 69 74 68 6d 65  |lti-byte arithme|
00001da0  74 69 63 61 6c 20 72 6f  75 74 69 6e 65 73 20 49  |tical routines I|
00001db0  20 68 61 76 65 0d 69 6e  74 72 6f 64 75 63 65 64  | have.introduced|
00001dc0  20 65 61 72 6c 69 65 72  20 69 6e 20 74 68 65 20  | earlier in the |
00001dd0  73 65 72 69 65 73 2e 0d  0d 49 20 77 6f 6e 27 74  |series...I won't|
00001de0  20 67 6f 20 69 6e 74 6f  20 67 72 65 61 74 20 64  | go into great d|
00001df0  65 74 61 69 6c 20 68 65  72 65 20 61 62 6f 75 74  |etail here about|
00001e00  20 74 68 65 20 70 72 6f  67 72 61 6d 20 73 69 6e  | the program sin|
00001e10  63 65 20 69 74 0d 69 73  20 63 6f 70 69 6f 75 73  |ce it.is copious|
00001e20  6c 79 20 61 6e 6e 6f 74  61 74 65 64 20 62 75 74  |ly annotated but|
00001e30  20 61 20 66 65 77 20 70  6f 69 6e 74 73 20 61 72  | a few points ar|
00001e40  65 20 77 6f 72 74 68 0d  6d 65 6e 74 69 6f 6e 69  |e worth.mentioni|
00001e50  6e 67 2e 0d 0d 54 68 65  20 69 6e 70 75 74 20 6f  |ng...The input o|
00001e60  66 20 74 68 65 20 66 6c  6f 61 74 69 6e 67 20 70  |f the floating p|
00001e70  6f 69 6e 74 20 6e 75 6d  62 65 72 73 20 69 73 20  |oint numbers is |
00001e80  64 6f 6e 65 20 75 73 69  6e 67 20 61 0d 70 73 65  |done using a.pse|
00001e90  75 64 6f 20 4f 50 54 20  66 75 6e 63 74 69 6f 6e  |udo OPT function|
00001ea0  20 64 65 66 69 6e 65 64  20 61 74 20 74 68 65 20  | defined at the |
00001eb0  65 6e 64 20 6f 66 20 74  68 65 20 70 72 6f 67 72  |end of the progr|
00001ec0  61 6d 2e 20 20 49 74 0d  72 65 6c 69 65 73 20 6f  |am.  It.relies o|
00001ed0  6e 20 75 73 20 6b 6e 6f  77 69 6e 67 20 77 68 65  |n us knowing whe|
00001ee0  72 65 20 42 41 53 49 43  20 77 69 6c 6c 20 73 74  |re BASIC will st|
00001ef0  6f 72 65 20 74 68 65 20  66 69 72 73 74 0d 76 61  |ore the first.va|
00001f00  72 69 61 62 6c 65 20 62  65 67 69 6e 6e 69 6e 67  |riable beginning|
00001f10  20 77 69 74 68 20 61 20  60 20 73 69 67 6e 20 28  | with a ` sign (|
00001f20  70 6f 75 6e 64 29 2e 20  20 57 65 20 63 61 6e 20  |pound).  We can |
00001f30  75 73 65 20 74 68 69 73  0d 6b 6e 6f 77 6c 65 64  |use this.knowled|
00001f40  67 65 20 74 6f 20 62 6f  74 68 20 70 75 74 20 61  |ge to both put a|
00001f50  6e 64 20 72 65 74 72 69  65 76 65 20 42 42 43 20  |nd retrieve BBC |
00001f60  42 41 53 49 43 20 66 6f  72 6d 61 74 20 66 6c 6f  |BASIC format flo|
00001f70  61 74 69 6e 67 0d 70 6f  69 6e 74 20 6e 75 6d 62  |ating.point numb|
00001f80  65 72 73 2e 0d 0d 49 72  6f 6e 69 63 61 6c 6c 79  |ers...Ironically|
00001f90  2c 20 61 6c 74 68 6f 75  67 68 20 68 61 76 69 6e  |, although havin|
00001fa0  67 20 73 65 70 61 72 61  74 65 6c 79 20 73 69 67  |g separately sig|
00001fb0  6e 65 64 20 6e 75 6d 62  65 72 73 20 6d 61 6b 65  |ned numbers make|
00001fc0  73 0d 6c 69 66 65 20 65  61 73 69 65 72 20 66 6f  |s.life easier fo|
00001fd0  72 20 6d 75 6c 74 69 70  6c 69 63 61 74 69 6f 6e  |r multiplication|
00001fe0  20 61 6e 64 20 64 69 76  69 73 69 6f 6e 20 28 6e  | and division (n|
00001ff0  65 78 74 20 6d 6f 64 75  6c 65 29 20 69 74 0d 61  |ext module) it.a|
00002000  63 74 75 61 6c 6c 79 20  63 6f 6d 70 6c 69 63 61  |ctually complica|
00002010  74 65 73 20 61 64 64 69  74 69 6f 6e 20 61 6e 64  |tes addition and|
00002020  20 73 75 62 74 72 61 63  74 69 6f 6e 20 6d 6f 72  | subtraction mor|
00002030  65 20 74 68 61 6e 0d 73  6f 6d 65 77 68 61 74 2e  |e than.somewhat.|
00002040  20 20 49 20 68 61 76 65  20 69 6e 74 72 6f 64 75  |  I have introdu|
00002050  63 65 64 20 61 6e 20 65  78 74 72 61 20 62 79 74  |ced an extra byt|
00002060  65 20 74 6f 20 61 63 74  20 61 73 20 61 6e 0d 6f  |e to act as an.o|
00002070  76 65 72 66 6c 6f 77 20  77 69 74 68 20 65 61 63  |verflow with eac|
00002080  68 20 6f 66 20 74 68 65  20 6e 75 6d 62 65 72 73  |h of the numbers|
00002090  20 69 6e 20 74 68 65 20  77 6f 72 6b 73 70 61 63  | in the workspac|
000020a0  65 20 73 6f 20 74 68 61  74 0d 77 65 20 63 61 6e  |e so that.we can|
000020b0  20 63 6f 6e 76 65 72 74  20 6e 65 67 61 74 69 76  | convert negativ|
000020c0  65 20 6e 75 6d 62 65 72  73 20 74 6f 20 32 27 73  |e numbers to 2's|
000020d0  20 63 6f 6d 70 6c 65 6d  65 6e 74 20 61 6e 64 20  | complement and |
000020e0  62 61 63 6b 0d 61 67 61  69 6e 2e 20 20 49 6e 20  |back.again.  In |
000020f0  66 61 63 74 20 74 68 65  20 42 41 53 49 43 20 66  |fact the BASIC f|
00002100  70 20 72 6f 75 74 69 6e  65 73 20 61 6c 73 6f 20  |p routines also |
00002110  75 73 65 20 61 20 72 6f  75 6e 64 69 6e 67 0d 62  |use a rounding.b|
00002120  79 74 65 20 74 6f 20 69  6d 70 72 6f 76 65 20 70  |yte to improve p|
00002130  72 65 63 69 73 69 6f 6e  20 62 75 74 20 74 68 61  |recision but tha|
00002140  74 20 64 6f 65 73 20 6e  6f 74 20 73 65 65 6d 20  |t does not seem |
00002150  74 6f 20 62 65 0d 6e 65  63 65 73 73 61 72 79 20  |to be.necessary |
00002160  68 65 72 65 2e 0d 0d 54  68 65 20 6d 61 69 6e 20  |here...The main |
00002170  72 6f 75 74 69 6e 65 73  20 66 6f 72 20 61 64 64  |routines for add|
00002180  69 74 69 6f 6e 20 61 6e  64 20 73 75 62 74 72 61  |ition and subtra|
00002190  63 74 69 6f 6e 20 61 72  65 0d 73 74 72 61 69 67  |ction are.straig|
000021a0  68 74 66 6f 72 77 61 72  64 20 65 6e 6f 75 67 68  |htforward enough|
000021b0  2e 20 20 54 68 65 79 20  61 72 65 20 62 61 73 69  |.  They are basi|
000021c0  63 61 6c 6c 79 20 66 69  76 65 20 62 79 74 65 0d  |cally five byte.|
000021d0  6d 75 6c 74 69 70 6c 65  20 70 72 65 63 69 73 69  |multiple precisi|
000021e0  6f 6e 20 73 69 6d 69 6c  61 72 20 74 6f 20 74 68  |on similar to th|
000021f0  6f 73 65 20 69 6e 20 65  61 72 6c 69 65 72 20 6d  |ose in earlier m|
00002200  6f 64 75 6c 65 73 2e 20  20 54 68 65 0d 63 75 72  |odules.  The.cur|
00002210  69 6f 75 73 20 64 69 66  66 65 72 65 6e 63 65 20  |ious difference |
00002220  69 73 20 74 68 61 74 2c  20 61 73 20 49 20 6d 65  |is that, as I me|
00002230  6e 74 69 6f 6e 65 64 20  62 65 66 6f 72 65 2c 20  |ntioned before, |
00002240  74 68 65 20 62 79 74 65  73 0d 61 72 65 20 73 74  |the bytes.are st|
00002250  6f 72 65 64 20 62 61 63  6b 20 74 6f 20 66 72 6f  |ored back to fro|
00002260  6e 74 20 77 69 74 68 20  74 68 65 20 6d 6f 73 74  |nt with the most|
00002270  20 73 69 67 6e 69 66 69  63 61 6e 74 20 62 79 74  | significant byt|
00002280  65 20 69 6e 0d 74 68 65  20 6c 6f 77 65 73 74 20  |e in.the lowest |
00002290  6d 65 6d 6f 72 79 20 6c  6f 63 61 74 69 6f 6e 2e  |memory location.|
000022a0  0d 0d 49 6e 20 74 68 65  20 6d 61 69 6e 20 73 65  |..In the main se|
000022b0  63 74 69 6f 6e 20 6f 66  20 74 68 65 20 70 72 6f  |ction of the pro|
000022c0  67 72 61 6d 20 74 68 65  72 65 20 61 72 65 20 74  |gram there are t|
000022d0  68 65 73 65 0d 73 75 62  72 6f 75 74 69 6e 65 73  |hese.subroutines|
000022e0  3a 0d 0d 27 6d 6f 76 65  5f 73 69 67 6e 5f 62 69  |:..'move_sign_bi|
000022f0  74 27 20 6d 6f 76 65 73  20 74 68 65 20 73 69 67  |t' moves the sig|
00002300  6e 20 62 69 74 73 20 66  72 6f 6d 20 74 68 65 20  |n bits from the |
00002310  74 6f 70 20 6f 66 20 74  68 65 0d 6d 61 6e 74 69  |top of the.manti|
00002320  73 73 61 65 20 61 6e 64  20 70 75 74 73 20 74 68  |ssae and puts th|
00002330  65 6d 20 69 6e 74 6f 20  61 20 73 65 70 61 72 61  |em into a separa|
00002340  74 65 20 62 79 74 65 20  66 6f 72 20 6c 61 74 65  |te byte for late|
00002350  72 20 75 73 65 2e 0d 0d  27 65 71 75 61 74 65 5f  |r use...'equate_|
00002360  65 78 70 6f 6e 65 6e 74  73 27 20 64 65 6e 6f 72  |exponents' denor|
00002370  6d 61 6c 69 73 65 73 20  74 68 65 20 73 6d 61 6c  |malises the smal|
00002380  6c 65 72 20 6f 66 20 74  68 65 20 74 77 6f 0d 6e  |ler of the two.n|
00002390  75 6d 62 65 72 73 20 73  6f 20 74 68 61 74 20 74  |umbers so that t|
000023a0  68 65 20 65 78 70 6f 6e  65 6e 74 73 20 6f 66 20  |he exponents of |
000023b0  74 68 65 20 74 77 6f 20  6e 75 6d 62 65 72 73 20  |the two numbers |
000023c0  61 72 65 20 74 68 65 0d  73 61 6d 65 2e 20 20 49  |are the.same.  I|
000023d0  74 20 64 6f 65 73 20 74  68 69 73 20 62 79 20 72  |t does this by r|
000023e0  6f 74 61 74 69 6e 67 20  74 68 65 20 6d 61 6e 74  |otating the mant|
000023f0  69 73 73 61 20 72 69 67  68 74 20 28 77 68 69 63  |issa right (whic|
00002400  68 0d 6d 61 6b 65 73 20  69 74 20 73 6d 61 6c 6c  |h.makes it small|
00002410  65 72 29 20 77 68 69 6c  65 20 69 6e 63 72 65 61  |er) while increa|
00002420  73 69 6e 67 20 74 68 65  20 65 78 70 6f 6e 65 6e  |sing the exponen|
00002430  74 20 75 6e 74 69 6c 20  74 68 65 0d 65 78 70 6f  |t until the.expo|
00002440  6e 65 6e 74 73 20 6d 61  74 63 68 2e 0d 0d 27 6e  |nents match...'n|
00002450  65 67 5f 63 6f 6e 76 65  72 74 27 20 6d 61 6b 65  |eg_convert' make|
00002460  73 20 61 6e 79 20 6e 65  67 61 74 69 76 65 20 6e  |s any negative n|
00002470  75 6d 62 65 72 73 20 69  6e 74 6f 20 32 27 73 0d  |umbers into 2's.|
00002480  63 6f 6d 70 6c 65 6d 65  6e 74 2c 20 6d 61 6b 69  |complement, maki|
00002490  6e 67 20 75 73 65 20 6f  66 20 74 68 65 20 65 78  |ng use of the ex|
000024a0  74 72 61 20 6f 76 65 72  66 6c 6f 77 20 62 79 74  |tra overflow byt|
000024b0  65 2e 0d 0d 54 68 65 6e  20 63 6f 6d 65 20 74 68  |e...Then come th|
000024c0  65 20 61 64 64 69 74 69  6f 6e 20 6f 72 20 73 75  |e addition or su|
000024d0  62 74 72 61 63 74 69 6f  6e 20 73 75 62 72 6f 75  |btraction subrou|
000024e0  74 69 6e 65 73 2e 0d 0d  27 6e 65 67 5f 63 6f 6e  |tines...'neg_con|
000024f0  76 65 72 74 5f 62 61 63  6b 27 20 74 61 6b 65 73  |vert_back' takes|
00002500  20 61 6e 79 20 72 65 73  75 6c 74 20 74 68 61 74  | any result that|
00002510  20 69 73 20 32 27 73 20  63 6f 6d 70 6c 65 6d 65  | is 2's compleme|
00002520  6e 74 0d 6e 65 67 61 74  69 76 65 20 61 6e 64 20  |nt.negative and |
00002530  6d 61 6b 65 73 20 69 74  20 70 6f 73 69 74 69 76  |makes it positiv|
00002540  65 20 77 68 69 6c 65 20  6d 6f 64 69 66 79 69 6e  |e while modifyin|
00002550  67 20 69 74 73 20 73 69  67 6e 0d 62 79 74 65 2e  |g its sign.byte.|
00002560  0d 0d 54 68 65 6e 20 77  65 20 74 72 61 70 20 61  |..Then we trap a|
00002570  20 7a 65 72 6f 20 72 65  73 75 6c 74 20 73 69 6e  | zero result sin|
00002580  63 65 20 74 68 65 20 7a  65 72 6f 20 66 6f 72 6d  |ce the zero form|
00002590  61 74 20 69 73 0d 6e 6f  6e 2d 73 74 61 6e 64 61  |at is.non-standa|
000025a0  72 64 20 61 6e 64 20 77  6f 75 6c 64 20 70 75 74  |rd and would put|
000025b0  20 74 68 65 20 72 65 6e  6f 72 6d 61 6c 69 73 69  | the renormalisi|
000025c0  6e 67 20 72 6f 75 74 69  6e 65 20 69 6e 74 6f 20  |ng routine into |
000025d0  61 6e 0d 65 6e 64 6c 65  73 73 20 6c 6f 6f 70 2e  |an.endless loop.|
000025e0  0d 0d 27 72 65 6e 6f 72  6d 61 6c 69 73 65 27 20  |..'renormalise' |
000025f0  61 64 6a 75 73 74 73 20  74 68 65 20 72 65 73 75  |adjusts the resu|
00002600  6c 74 20 75 6e 74 69 6c  20 69 74 20 69 73 20 61  |lt until it is a|
00002610  20 6e 6f 72 6d 61 6c 69  73 65 64 0d 6e 75 6d 62  | normalised.numb|
00002620  65 72 20 28 77 69 74 68  20 74 68 65 20 74 6f 70  |er (with the top|
00002630  20 62 69 74 20 6f 66 20  74 68 65 20 6d 61 6e 74  | bit of the mant|
00002640  69 73 73 61 20 73 65 74  29 20 61 73 20 65 78 70  |issa set) as exp|
00002650  65 63 74 65 64 20 62 79  0d 42 41 53 49 43 2e 20  |ected by.BASIC. |
00002660  20 54 68 65 20 65 78 70  6f 6e 65 6e 74 20 69 73  | The exponent is|
00002670  20 61 64 6a 75 73 74 65  64 20 61 63 63 6f 72 64  | adjusted accord|
00002680  69 6e 67 6c 79 2e 20 20  49 66 20 74 68 65 72 65  |ingly.  If there|
00002690  20 69 73 0d 61 6e 79 74  68 69 6e 67 20 69 6e 20  | is.anything in |
000026a0  74 68 65 20 6f 76 65 72  66 6c 6f 77 20 62 79 74  |the overflow byt|
000026b0  65 20 74 68 65 6e 20 74  68 65 20 77 68 6f 6c 65  |e then the whole|
000026c0  20 6d 61 6e 74 69 73 73  61 0d 28 69 6e 63 6c 75  | mantissa.(inclu|
000026d0  64 69 6e 67 20 74 68 65  20 6f 76 65 72 66 6c 6f  |ding the overflo|
000026e0  77 20 62 79 74 65 29 20  69 73 20 72 6f 74 61 74  |w byte) is rotat|
000026f0  65 64 20 72 69 67 68 74  20 75 6e 74 69 6c 20 74  |ed right until t|
00002700  68 65 0d 6f 76 65 72 66  6c 6f 77 20 62 79 74 65  |he.overflow byte|
00002710  20 69 73 20 65 6d 70 74  79 2e 20 20 54 68 65 20  | is empty.  The |
00002720  65 78 70 6f 6e 65 6e 74  20 69 73 20 69 6e 63 72  |exponent is incr|
00002730  65 61 73 65 64 20 62 79  20 6f 6e 65 0d 66 6f 72  |eased by one.for|
00002740  20 65 61 63 68 20 72 6f  74 61 74 69 6f 6e 2e 20  | each rotation. |
00002750  20 49 66 2c 20 64 75 72  69 6e 67 20 74 68 65 20  | If, during the |
00002760  63 6f 75 72 73 65 20 6f  66 20 74 68 69 73 20 69  |course of this i|
00002770  6e 63 72 65 6d 65 6e 74  2c 0d 74 68 65 20 65 78  |ncrement,.the ex|
00002780  70 6f 6e 65 6e 74 20 62  65 63 6f 6d 65 73 20 7a  |ponent becomes z|
00002790  65 72 6f 20 74 68 65 6e  20 77 65 20 68 61 76 65  |ero then we have|
000027a0  20 67 65 6e 65 72 61 74  65 64 20 61 20 6e 75 6d  | generated a num|
000027b0  62 65 72 0d 74 6f 6f 20  6c 61 72 67 65 20 66 6f  |ber.too large fo|
000027c0  72 20 74 68 65 20 73 79  73 74 65 6d 20 74 6f 20  |r the system to |
000027d0  68 61 6e 64 6c 65 2c 20  61 6e 64 20 61 6e 20 65  |handle, and an e|
000027e0  72 72 6f 72 20 69 73 0d  67 65 6e 65 72 61 74 65  |rror is.generate|
000027f0  64 2e 20 20 49 74 20 68  61 73 20 74 68 65 20 6e  |d.  It has the n|
00002800  75 6d 62 65 72 20 32 30  20 62 75 74 20 49 20 68  |umber 20 but I h|
00002810  61 76 65 20 67 69 76 65  6e 20 69 74 20 61 0d 64  |ave given it a.d|
00002820  69 66 66 65 72 65 6e 74  20 6d 65 73 73 61 67 65  |ifferent message|
00002830  20 74 6f 20 74 68 65 20  73 74 61 6e 64 61 72 64  | to the standard|
00002840  20 27 74 6f 6f 20 62 69  67 27 2e 0d 0d 49 66 20  | 'too big'...If |
00002850  74 68 65 20 6f 76 65 72  66 6c 6f 77 20 62 79 74  |the overflow byt|
00002860  65 20 69 73 20 65 6d 70  74 79 20 74 68 65 6e 20  |e is empty then |
00002870  74 68 65 20 72 65 73 74  20 6f 66 20 74 68 65 20  |the rest of the |
00002880  6d 61 6e 74 69 73 73 61  0d 69 73 20 72 6f 74 61  |mantissa.is rota|
00002890  74 65 64 20 6c 65 66 74  20 75 6e 74 69 6c 20 74  |ted left until t|
000028a0  68 65 20 74 6f 70 20 62  69 74 20 6f 66 20 74 68  |he top bit of th|
000028b0  65 20 6d 61 6e 74 69 73  73 61 20 69 73 20 73 65  |e mantissa is se|
000028c0  74 2e 20 0d 54 68 65 20  65 78 70 6f 6e 65 6e 74  |t. .The exponent|
000028d0  20 69 73 20 64 65 63 72  65 61 73 65 64 20 62 79  | is decreased by|
000028e0  20 6f 6e 65 20 66 6f 72  20 65 61 63 68 20 72 6f  | one for each ro|
000028f0  74 61 74 69 6f 6e 2e 20  20 4f 66 0d 63 6f 75 72  |tation.  Of.cour|
00002900  73 65 20 69 66 20 74 68  65 20 74 6f 70 20 62 69  |se if the top bi|
00002910  74 20 69 73 20 61 6c 72  65 61 64 79 20 73 65 74  |t is already set|
00002920  20 74 68 65 6e 20 74 68  65 20 6e 75 6d 62 65 72  | then the number|
00002930  20 69 73 0d 63 6f 72 72  65 63 74 2e 0d 0d 46 69  | is.correct...Fi|
00002940  6e 61 6c 6c 79 20 74 68  65 20 72 6f 75 74 69 6e  |nally the routin|
00002950  65 20 61 74 20 27 72 65  70 6c 61 63 65 5f 74 6f  |e at 'replace_to|
00002960  70 5f 62 69 74 27 20 63  61 6c 63 75 6c 61 74 65  |p_bit' calculate|
00002970  73 20 74 68 65 20 6e 65  77 0d 73 69 67 6e 20 62  |s the new.sign b|
00002980  69 74 20 61 6e 64 20 72  65 70 6c 61 63 65 73 20  |it and replaces |
00002990  74 68 65 20 74 6f 70 20  62 69 74 20 6f 66 20 74  |the top bit of t|
000029a0  68 65 20 6d 61 6e 74 69  73 73 61 20 77 69 74 68  |he mantissa with|
000029b0  20 69 74 2e 0d 0d 57 68  65 6e 20 79 6f 75 20 72  | it...When you r|
000029c0  75 6e 20 74 68 65 20 70  72 6f 67 72 61 6d 20 79  |un the program y|
000029d0  6f 75 20 6d 61 79 20 68  61 76 65 20 74 6f 20 62  |ou may have to b|
000029e0  65 20 69 6e 20 4d 4f 44  45 20 37 0d 62 65 63 61  |e in MODE 7.beca|
000029f0  75 73 65 20 74 68 65 20  61 73 73 65 6d 62 65 72  |use the assember|
00002a00  20 63 6f 64 65 20 69 73  20 72 61 74 68 65 72 20  | code is rather |
00002a10  6c 6f 6e 67 2e 20 20 20  59 6f 75 20 65 6e 74 65  |long.   You ente|
00002a20  72 20 61 0d 63 6f 75 70  6c 65 20 6f 66 20 6e 75  |r a.couple of nu|
00002a30  6d 62 65 72 73 20 6f 66  20 76 69 72 74 75 61 6c  |mbers of virtual|
00002a40  6c 79 20 61 6e 79 20 73  69 7a 65 2c 20 61 6e 64  |ly any size, and|
00002a50  20 79 6f 75 20 77 69 6c  6c 20 62 65 0d 61 62 6c  | you will be.abl|
00002a60  65 20 74 6f 20 63 6f 6d  70 61 72 65 20 74 68 65  |e to compare the|
00002a70  20 61 64 64 69 74 69 6f  6e 20 61 6e 64 20 73 75  | addition and su|
00002a80  62 74 72 61 63 74 69 6f  6e 20 72 65 73 75 6c 74  |btraction result|
00002a90  73 20 66 72 6f 6d 0d 74  68 69 73 20 6d 61 63 68  |s from.this mach|
00002aa0  69 6e 65 20 63 6f 64 65  20 61 6e 64 20 66 72 6f  |ine code and fro|
00002ab0  6d 20 42 41 53 49 43 2e  20 20 54 68 65 20 6d 61  |m BASIC.  The ma|
00002ac0  63 68 69 6e 65 20 63 6f  64 65 20 68 65 72 65 20  |chine code here |
00002ad0  69 73 0d 61 6c 6d 6f 73  74 20 74 77 69 63 65 20  |is.almost twice |
00002ae0  61 73 20 66 61 73 74 20  61 73 20 42 41 53 49 43  |as fast as BASIC|
00002af0  20 61 6c 74 68 6f 75 67  68 20 69 6e 20 73 6f 6d  | although in som|
00002b00  65 20 63 69 72 63 75 6d  73 74 61 6e 63 65 73 0d  |e circumstances.|
00002b10  69 74 20 69 73 20 6e 6f  74 20 71 75 69 74 65 20  |it is not quite |
00002b20  61 73 20 70 72 65 63 69  73 65 2e 20 20 54 68 69  |as precise.  Thi|
00002b30  73 20 69 73 20 6f 6e 6c  79 20 6c 69 6b 65 6c 79  |s is only likely|
00002b40  20 74 6f 20 73 68 6f 77  20 61 73 0d 61 20 64 69  | to show as.a di|
00002b50  66 66 65 72 65 6e 63 65  20 6f 66 20 31 20 69 6e  |fference of 1 in|
00002b60  20 74 68 65 20 73 6d 61  6c 6c 65 73 74 20 73 69  | the smallest si|
00002b70  67 6e 69 66 69 63 61 6e  74 20 64 69 67 69 74 20  |gnificant digit |
00002b80  62 65 74 77 65 65 6e 0d  74 68 65 20 74 77 6f 20  |between.the two |
00002b90  70 72 6f 66 66 65 72 65  64 20 72 65 73 75 6c 74  |proffered result|
00002ba0  73 2e 0d 0d 4e 65 78 74  20 74 69 6d 65 20 6d 75  |s...Next time mu|
00002bb0  6c 74 69 70 6c 69 63 61  74 69 6f 6e 20 61 6e 64  |ltiplication and|
00002bc0  20 64 69 76 69 73 69 6f  6e 2e 0d                 | division..|
00002bcb
OS\BITS/T\OSB22.m0
OS\BITS/T\OSB22.m1
OS\BITS/T\OSB22.m2
OS\BITS/T\OSB22.m4
OS\BITS/T\OSB22.m5