<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://learn.cemetech.net/index.php?action=history&amp;feed=atom&amp;title=Z80%3AFloating_Point</id>
	<title>Z80:Floating Point - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://learn.cemetech.net/index.php?action=history&amp;feed=atom&amp;title=Z80%3AFloating_Point"/>
	<link rel="alternate" type="text/html" href="http://learn.cemetech.net/index.php?title=Z80:Floating_Point&amp;action=history"/>
	<updated>2026-05-13T12:11:26Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>http://learn.cemetech.net/index.php?title=Z80:Floating_Point&amp;diff=341&amp;oldid=prev</id>
		<title>Maintenance script: Initial automated import</title>
		<link rel="alternate" type="text/html" href="http://learn.cemetech.net/index.php?title=Z80:Floating_Point&amp;diff=341&amp;oldid=prev"/>
		<updated>2016-02-06T06:05:07Z</updated>

		<summary type="html">&lt;p&gt;Initial automated import&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Floating Point Tutorial =&lt;br /&gt;
Although integer math may seem more natural for us when we program the Z80, floating point math that works with fractional numbers is not much more difficult. The only change is in representation and how &amp;#039;&amp;#039;we&amp;#039;&amp;#039; program the handling of the data. After reading this, hopefully the reader will not feel limited to integer math and not limited to even the representations here. Don&amp;#039;t just use a &amp;#039;sign bit&amp;#039; if you think it would be more mathematically sound to have a bit for additive inverses &amp;#039;&amp;#039;and&amp;#039;&amp;#039; multiplicative inverses. Add complex arithmetic, or try making Rational representations for sometimes many, many more bits of precision and a smaller risk for roundoff errors.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
The typical format includes a sign bit (additive inverse, positive/negative) an exponent, and a mantissa. TI, for example, uses 1 bit for sign, 8 bits for the exponent, and 7 bytes storing 12 base 10 digits. If the bytes were 0083 31 41 59 26 53 58 98, it would be read as sign=0, exponent=83h-80h=3, mantissa=3.1415926535898, so the value represented is 3.1415926535898*10^^3^^=3141.5926535898.&lt;br /&gt;
&lt;br /&gt;
Generally, the math has a wider range and better precision if we use a base of power of 2. Depending on the usage, we tend to try to pack all of the data to fill 8-bit multiples. TI uses an extra 8 bits to store the 1 sign bit, but in their application, they also use that byte to store variable type. They actually took advantage of unused bits that had to be there anyways.&lt;br /&gt;
&lt;br /&gt;
=== Sign Bit ===&lt;br /&gt;
The sign bit is just a 0 or 1 that determines if a number is positive or negative.&lt;br /&gt;
&lt;br /&gt;
=== Exponent ===&lt;br /&gt;
To decide a good range for the exponent, you will need to pick a base. TI used 10, but generally, 2 might be better or 256 so that we use whole bytes as digits. Essentially, we will use something like 2^^exponent^^*mantissa. It is generally easier to make the middle number in your range as 0. If you are using an 8-bit exponent, 80h=0 for the exponent. &lt;br /&gt;
&lt;br /&gt;
=== Mantissa ===&lt;br /&gt;
The mantissa is best kept &amp;quot;normalized&amp;quot; by making sure we don&amp;#039;t have leading zeroes. If we are using a base of 2, then a mantissa of %0011111100000000 is &amp;#039;&amp;#039;&amp;#039;usually&amp;#039;&amp;#039;&amp;#039; not what we want. Instead, we shift it left twice, which means we decrement the exponent by 2.&lt;br /&gt;
&lt;br /&gt;
==Examples ==&lt;br /&gt;
If we decided to have 1 bit for sign, 7 bits for the exponent, and 16 bits for the mantissa, using base 2, then the following would represent 1:&lt;br /&gt;
&lt;br /&gt;
    %01000000   ;sign=0, exponent=64 (treated as 0)&lt;br /&gt;
    %1000000000000000 ;mantissa=1.0&lt;br /&gt;
&lt;br /&gt;
And likewise, 2 would be just multiplying by 2 which is the same as increasing the exponent by 1:&lt;br /&gt;
&lt;br /&gt;
    %01000001   ;sign=0, exponent=65 (65-64=1)&lt;br /&gt;
    %1000000000000000 ;mantissa=1.0&lt;br /&gt;
    1.0*2^1=2&lt;br /&gt;
&lt;br /&gt;
So if we think of the exponent as the location of the decimal, 2 is 10.00000000000000 and 1 is 1.000000000000000. If we want to perform some arithmetic...&lt;br /&gt;
== Addition and Subtraction ==&lt;br /&gt;
This can be a bit difficult because we have to keep track of the sign of the inputs and the result, but we also have to line up the &amp;#039;decimal points&amp;#039; (the exponent). In the above examples for the 24-bit floats for 1.0 and 2.0, to line up the decimals, we need to rotate the mantissa of 1 to the right (and likewise, increment the exponent:&lt;br /&gt;
&lt;br /&gt;
    %01000001   ;sign=0, exponent=65 (treated as 1)&lt;br /&gt;
    %0100000000000000 ;mantissa=0.5&lt;br /&gt;
    0.5*2^1=1&lt;br /&gt;
&lt;br /&gt;
Note that 1 is now represented as a denormalized number, but we can directly add the numbers by adding their mantissas:&lt;br /&gt;
&lt;br /&gt;
    %01000001   ;sign=0, exponent=65 (treated as 1)&lt;br /&gt;
    %1100000000000000 ;mantissa=1.5&lt;br /&gt;
    1.5*2^1=3&lt;br /&gt;
&lt;br /&gt;
If there was overflow, we would have to rotate the result right to get the upper bit of the result back in the number and then increment the exponent. For example, if we added 2 to this, we would get %0100000000000000 as the 16-bit addition, but the overflow (carry flag) would be a 1, so we would rotate it back in, dropping the last bit (in our case, a 0):&lt;br /&gt;
&lt;br /&gt;
    %01000010   ;sign=0, exponent=66 (treated as 2)&lt;br /&gt;
    %1010000000000000 ;mantissa=1.25&lt;br /&gt;
    1.25*2^2=5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Adding two negative numbers -a+-b is the same as -(a+b) so it is just like adding two positive numbers and you don&amp;#039;t need to change the sign. Adding a positive and negative number will require a subtraction of their absolute values. For example, 2+-1 would require rotating the mantissas as in addition, but then subtract %1000...-%0100... to get %0100... which needs to be renormalised. In this case, it is still a positive result. If there was overflow (on the z80, the c flag is set), then our result is negative, but we also need to perform a 2s compliment on the mantissa (that is, negate it as if it were an integer). So in the case of 1-2, we would get:&lt;br /&gt;
%01000001 1100000000000000. 2s compliment would return $01000001 0100000000000000 and then we set the sign as negative and renormalise the number, getting the expected -1. In the case where the first number is negative and the second is positive, it would be easiest to swap their order for subtraction instead of making a separate reverse-subtract routine. &lt;br /&gt;
&lt;br /&gt;
== Multiplication and Division ==&lt;br /&gt;
Multiplication and division are much easier than addition and subtraction. When multiplying or dividing two numbers, you just need to use XOR logic on the signs and perform basically integer math on the mantissas. If both numbers are negative, their sign bits will be 1 and 1 xor 1=0, which is positive. Likewise, 1 xor 0=1, 0 xor 1=1, 0 xor 0=0. To multiply A and B, add their exponents together, to divide, subtract the exponent of B from A (taking care of underflow/overflow, accordingly which is a simple check of the c flag).&lt;br /&gt;
&lt;br /&gt;
Now you have the sign and exponent of the result, but you still need to get the mantissa. For multiplication, just multiply the two mantissas and take the upper bits for the result, rounding as seen fit. For division, it is a slightly different algorithm than integer division (or so it may seem). Since both numbers are normalized, you don&amp;#039;t need to rotate bits into an accumulator. Instead, check if B&amp;lt;=A. If it is, perform B-A as an integer subtraction, and set the upper bit of the result, else leave it reset. Then shift B to the right and repeat the process, setting or resetting the next bits at each iteration. For a 64-bit mantissa, this requires 64 tests. As well, for best accuracy, A and B would need additional 64 trailing zero bits making subtraction 128-bits. Since it is integer subtraction, it is still fairly trivial. &lt;br /&gt;
== Square Root ==&lt;br /&gt;
For square roots, exponents are divided by 2. If the exponent is odd, add 1 to it to make it even and rotate the mantissa right. From there, the mantissa can be treated as an integer to take the square root of.&lt;br /&gt;
== Modulo ==&lt;br /&gt;
For many trig applications, you will need to take input mod pi. To do this, check the exponent. If it is less than 1, it is smaller than pi, so you are finished. if it is greater than or equal to 1, perform 3-exponent and this will be the number of iterations required for the algorithm about to be described.&lt;br /&gt;
&lt;br /&gt;
If the mantissa is greater than or equal to pi, subtract pi. Then, shift pi to the right (dividing it by 2) and repeat the needed number of times.&lt;br /&gt;
&lt;br /&gt;
For general modulo, just replace &amp;#039;pi&amp;#039; with any number and check the exponent for being less than the exponent of the modulus. &lt;br /&gt;
= 24-bit Floating Point =&lt;br /&gt;
24-bit floats are excellent because the math can be contained in the registers. These currently use 7-bit exponents such that 0=0 and %1111111 = 3Fh = -1&lt;br /&gt;
== RAM equates ==&lt;br /&gt;
The order in which the RAM values are stored are important:&lt;br /&gt;
&lt;br /&gt;
    f24_exp2:&lt;br /&gt;
    	.db 0&lt;br /&gt;
    f24_exp1:&lt;br /&gt;
    	.db 0&lt;br /&gt;
    f24_exp4:&lt;br /&gt;
    	.db 0&lt;br /&gt;
    f24_exp3:&lt;br /&gt;
    	.db 0&lt;br /&gt;
    f24_exp6:&lt;br /&gt;
    	.db 0&lt;br /&gt;
    f24_exp5:&lt;br /&gt;
    	.db 0&lt;br /&gt;
    f24_man1:&lt;br /&gt;
    	.dw 0&lt;br /&gt;
    f24_man2:&lt;br /&gt;
    	.dw 0&lt;br /&gt;
    f24_man3:&lt;br /&gt;
    	.dw 0&lt;br /&gt;
    f24_man4:&lt;br /&gt;
    	.dw 0&lt;br /&gt;
    f24_man5:&lt;br /&gt;
    	.dw 0&lt;br /&gt;
    f24_man6:&lt;br /&gt;
    	.dw 0&lt;br /&gt;
    tempbyte1:&lt;br /&gt;
    	.db 0&lt;br /&gt;
    tempword1:&lt;br /&gt;
    	.dw 0&lt;br /&gt;
&lt;br /&gt;
== Addition/Subtraction ==&lt;br /&gt;
&lt;br /&gt;
    Float24Add:&lt;br /&gt;
    ;BHL+CDE&lt;br /&gt;
        ld a,c&lt;br /&gt;
        xor 40h&lt;br /&gt;
        ld c,a&lt;br /&gt;
    	rlc c&lt;br /&gt;
        ld a,b&lt;br /&gt;
        rla&lt;br /&gt;
    	rlc b&lt;br /&gt;
        xor 80h&lt;br /&gt;
    	sub c&lt;br /&gt;
    	jr z,f24shifted&lt;br /&gt;
    	jr nc,f24shiftDE&lt;br /&gt;
        rra&lt;br /&gt;
    	cp -16&lt;br /&gt;
    	jr nc,$+6&lt;br /&gt;
    	ld a,c \ ex de,hl \ rrca \ ret&lt;br /&gt;
    	srl h \ rr l&lt;br /&gt;
    	inc a \ jr nz,$-5&lt;br /&gt;
    	jr nc,$+3 \ inc hl&lt;br /&gt;
    	ld a,b \ and 1 \ ld b,a \ ld a,c \ and $FE \ xor 80h \ or b \ jp f24shifted+1&lt;br /&gt;
    f24ShiftDE:&lt;br /&gt;
    	rra&lt;br /&gt;
    	cp 16&lt;br /&gt;
    	jr c,$+5&lt;br /&gt;
    	ld a,b \ rrca \ ret&lt;br /&gt;
    	srl d \ rr e&lt;br /&gt;
    	dec a \ jr nz,$-5&lt;br /&gt;
    	jr nc,$+3 \ inc de&lt;br /&gt;
    	ld a,c \ and 1 \ ld c,a \ ld a,b \ and $FE \ or c \ ld c,a&lt;br /&gt;
    f24Shifted:&lt;br /&gt;
    	ld a,b \ rrca \ ld b,a \ ld a,c \ rrca \ ld c,a \ xor b \ ld a,b \ jp m,f24sub&lt;br /&gt;
    	add hl,de \ ret nc&lt;br /&gt;
    	ld c,0 \ inc c \ inc c \ rr h \ rr l \ jr nc,$+8 \ inc l \ jr nz,$+5 \ inc h&lt;br /&gt;
    	jr z,$-12&lt;br /&gt;
    	rlca \ add a,c \ jp p,$+10&lt;br /&gt;
    	jr c,$+7 \ bit 6,b \ rrca \ jr z,$+4&lt;br /&gt;
        rrca \ ret&lt;br /&gt;
    SetInf:&lt;br /&gt;
    	ld hl,$FFFF&lt;br /&gt;
    	rla&lt;br /&gt;
    	ld a,h&lt;br /&gt;
    	rra&lt;br /&gt;
    	ld b,a&lt;br /&gt;
    	ret&lt;br /&gt;
    f24Sub:&lt;br /&gt;
    	sbc hl,de&lt;br /&gt;
    	jr nc,normalise24&lt;br /&gt;
    	xor 80h&lt;br /&gt;
        ld b,a&lt;br /&gt;
        xor a \ sub l \ ld l,a&lt;br /&gt;
        sbc a,a \ sub h \ ld h,a&lt;br /&gt;
        ld a,b&lt;br /&gt;
    normalise24:&lt;br /&gt;
    	bit 7,h \ ret nz&lt;br /&gt;
    	ld a,b \ add a,a&lt;br /&gt;
    	cp $82 \ ret z&lt;br /&gt;
    	dec a \ dec a&lt;br /&gt;
    	add hl,hl&lt;br /&gt;
    	rlc b \ rra \ ld b,a&lt;br /&gt;
    	jp normalise24&lt;br /&gt;
    &lt;br /&gt;
    Float24Sub:&lt;br /&gt;
    ;BHL-CDE&lt;br /&gt;
        ld a,80h&lt;br /&gt;
        xor c&lt;br /&gt;
        ld c,a&lt;br /&gt;
        jp Float24Add&lt;br /&gt;
&lt;br /&gt;
== Multiplication ==&lt;br /&gt;
&lt;br /&gt;
    Float24Mul:&lt;br /&gt;
    ;BHL*CDE -&amp;gt; AHL&lt;br /&gt;
        ld a,b \ xor c&lt;br /&gt;
        and 80h&lt;br /&gt;
        push af&lt;br /&gt;
        sla b \ sra b&lt;br /&gt;
        sla c \ sra c&lt;br /&gt;
        ld a,b&lt;br /&gt;
        add a,c&lt;br /&gt;
        pop bc&lt;br /&gt;
        jp m,$+10&lt;br /&gt;
        cp 64&lt;br /&gt;
        jr nc,SetInf-2&lt;br /&gt;
        jp $+7&lt;br /&gt;
        cp -64&lt;br /&gt;
        jr c,SetInf-2&lt;br /&gt;
    ;B has the right sign&lt;br /&gt;
        and 7Fh&lt;br /&gt;
        or b&lt;br /&gt;
        push af&lt;br /&gt;
        ld b,h&lt;br /&gt;
        ld c,l&lt;br /&gt;
        call BC_Times_DE&lt;br /&gt;
        bit 7,l&lt;br /&gt;
        ld l,h&lt;br /&gt;
        ld h,b&lt;br /&gt;
        jr z,$+3&lt;br /&gt;
        inc hl&lt;br /&gt;
        pop af&lt;br /&gt;
        ret&lt;br /&gt;
    BC_Times_DE:&lt;br /&gt;
    ;BHLA is the result&lt;br /&gt;
        ld a,b&lt;br /&gt;
        or a&lt;br /&gt;
        ld hl,0&lt;br /&gt;
        ld b,h&lt;br /&gt;
    ;1&lt;br /&gt;
        add a,a&lt;br /&gt;
        jr nc,$+4&lt;br /&gt;
        ld h,d&lt;br /&gt;
        ld l,e&lt;br /&gt;
    ;2&lt;br /&gt;
        add hl,hl&lt;br /&gt;
        rla&lt;br /&gt;
        jr nc,$+4&lt;br /&gt;
        add hl,de&lt;br /&gt;
        adc a,b&lt;br /&gt;
    ;227+10b-7p&lt;br /&gt;
        add hl,hl&lt;br /&gt;
        rla&lt;br /&gt;
        jr nc,$+4&lt;br /&gt;
        add hl,de&lt;br /&gt;
        adc a,b&lt;br /&gt;
    &lt;br /&gt;
        add hl,hl&lt;br /&gt;
        rla&lt;br /&gt;
        jr nc,$+4&lt;br /&gt;
        add hl,de&lt;br /&gt;
        adc a,b&lt;br /&gt;
    &lt;br /&gt;
        add hl,hl&lt;br /&gt;
        rla&lt;br /&gt;
        jr nc,$+4&lt;br /&gt;
        add hl,de&lt;br /&gt;
        adc a,b&lt;br /&gt;
    &lt;br /&gt;
        add hl,hl&lt;br /&gt;
        rla&lt;br /&gt;
        jr nc,$+4&lt;br /&gt;
        add hl,de&lt;br /&gt;
        adc a,b&lt;br /&gt;
    &lt;br /&gt;
        add hl,hl&lt;br /&gt;
        rla&lt;br /&gt;
        jr nc,$+4&lt;br /&gt;
        add hl,de&lt;br /&gt;
        adc a,b&lt;br /&gt;
    &lt;br /&gt;
        add hl,hl&lt;br /&gt;
        rla&lt;br /&gt;
        jr nc,$+4&lt;br /&gt;
        add hl,de&lt;br /&gt;
        adc a,b&lt;br /&gt;
    &lt;br /&gt;
    ;===&lt;br /&gt;
    ;AHL is the result of B*DE*256&lt;br /&gt;
        push hl&lt;br /&gt;
        ld h,b&lt;br /&gt;
        ld l,b&lt;br /&gt;
        ld b,a&lt;br /&gt;
        ld a,c&lt;br /&gt;
        ld c,h&lt;br /&gt;
    ;1&lt;br /&gt;
        add a,a&lt;br /&gt;
        jr nc,$+4&lt;br /&gt;
        ld h,d&lt;br /&gt;
        ld l,e&lt;br /&gt;
    ;2&lt;br /&gt;
        add hl,hl&lt;br /&gt;
        rla&lt;br /&gt;
        jr nc,$+4&lt;br /&gt;
        add hl,de&lt;br /&gt;
        adc a,c&lt;br /&gt;
    ;227+10b-7p&lt;br /&gt;
        add hl,hl&lt;br /&gt;
        rla&lt;br /&gt;
        jr nc,$+4&lt;br /&gt;
        add hl,de&lt;br /&gt;
        adc a,c&lt;br /&gt;
    &lt;br /&gt;
        add hl,hl&lt;br /&gt;
        rla&lt;br /&gt;
        jr nc,$+4&lt;br /&gt;
        add hl,de&lt;br /&gt;
        adc a,c&lt;br /&gt;
    &lt;br /&gt;
        add hl,hl&lt;br /&gt;
        rla&lt;br /&gt;
        jr nc,$+4&lt;br /&gt;
        add hl,de&lt;br /&gt;
        adc a,c&lt;br /&gt;
    &lt;br /&gt;
        add hl,hl&lt;br /&gt;
        rla&lt;br /&gt;
        jr nc,$+4&lt;br /&gt;
        add hl,de&lt;br /&gt;
        adc a,c&lt;br /&gt;
    &lt;br /&gt;
        add hl,hl&lt;br /&gt;
        rla&lt;br /&gt;
        jr nc,$+4&lt;br /&gt;
        add hl,de&lt;br /&gt;
        adc a,c&lt;br /&gt;
    &lt;br /&gt;
        add hl,hl&lt;br /&gt;
        rla&lt;br /&gt;
        jr nc,$+4&lt;br /&gt;
        add hl,de&lt;br /&gt;
        adc a,c&lt;br /&gt;
    &lt;br /&gt;
        pop de&lt;br /&gt;
    ;Now BDE*256+AHL&lt;br /&gt;
        ld c,a&lt;br /&gt;
        ld a,l&lt;br /&gt;
        ld l,h&lt;br /&gt;
        ld h,c&lt;br /&gt;
        add hl,de&lt;br /&gt;
        ret nc&lt;br /&gt;
        inc b&lt;br /&gt;
    ;BHLA is the 32-bit result&lt;br /&gt;
        ret&lt;br /&gt;
&lt;br /&gt;
== Division ==&lt;br /&gt;
Note that this routine currently does not use 32-bit subtractions, so it can get bad accuracy.&lt;br /&gt;
&lt;br /&gt;
    Float24Div:&lt;br /&gt;
    ;BHL/CDE -&amp;gt; AHL&lt;br /&gt;
        ld a,b \ xor c&lt;br /&gt;
        and 80h&lt;br /&gt;
        push af&lt;br /&gt;
        sla b \ sra b&lt;br /&gt;
        sla c \ sra c&lt;br /&gt;
        ld a,b&lt;br /&gt;
        sub c&lt;br /&gt;
        pop bc&lt;br /&gt;
        jp m,$+11&lt;br /&gt;
        cp 64&lt;br /&gt;
        jp nc,SetInf-2&lt;br /&gt;
        jp $+7&lt;br /&gt;
        cp -64&lt;br /&gt;
        jp c,SetInf-2&lt;br /&gt;
    ;B has the right sign&lt;br /&gt;
        and 7Fh&lt;br /&gt;
        or b&lt;br /&gt;
        push af&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
        ld bc,0&lt;br /&gt;
        or a \ sbc hl,de \ jr c,$+7 \ set 7,b \ jp $+4 \ add hl,de \ srl d \ rr e&lt;br /&gt;
        or a \ sbc hl,de \ jr c,$+7 \ set 6,b \ jp $+4 \ add hl,de \ srl d \ rr e&lt;br /&gt;
        or a \ sbc hl,de \ jr c,$+7 \ set 5,b \ jp $+4 \ add hl,de \ srl d \ rr e&lt;br /&gt;
        or a \ sbc hl,de \ jr c,$+7 \ set 4,b \ jp $+4 \ add hl,de \ srl d \ rr e&lt;br /&gt;
        or a \ sbc hl,de \ jr c,$+7 \ set 3,b \ jp $+4 \ add hl,de \ srl d \ rr e&lt;br /&gt;
        or a \ sbc hl,de \ jr c,$+7 \ set 2,b \ jp $+4 \ add hl,de \ srl d \ rr e&lt;br /&gt;
        or a \ sbc hl,de \ jr c,$+7 \ set 1,b \ jp $+4 \ add hl,de \ srl d \ rr e&lt;br /&gt;
        or a \ sbc hl,de \ jr c,$+7 \ set 0,b \ jp $+4 \ add hl,de \ srl d \ rr e&lt;br /&gt;
        or a \ sbc hl,de \ jr c,$+7 \ set 7,c \ jp $+4 \ add hl,de \ srl d \ rr e&lt;br /&gt;
        or a \ sbc hl,de \ jr c,$+7 \ set 6,c \ jp $+4 \ add hl,de \ srl d \ rr e&lt;br /&gt;
        or a \ sbc hl,de \ jr c,$+7 \ set 5,c \ jp $+4 \ add hl,de \ srl d \ rr e&lt;br /&gt;
        or a \ sbc hl,de \ jr c,$+7 \ set 4,c \ jp $+4 \ add hl,de \ srl d \ rr e&lt;br /&gt;
        or a \ sbc hl,de \ jr c,$+7 \ set 3,c \ jp $+4 \ add hl,de \ srl d \ rr e&lt;br /&gt;
        or a \ sbc hl,de \ jr c,$+7 \ set 2,c \ jp $+4 \ add hl,de \ srl d \ rr e&lt;br /&gt;
        or a \ sbc hl,de \ jr c,$+7 \ set 1,c \ jp $+4 \ add hl,de \ srl d \ rr e&lt;br /&gt;
        or a \ sbc hl,de \ jr c,$+4 \ set 0,c&lt;br /&gt;
        ld h,b \ ld l,c&lt;br /&gt;
        pop bc&lt;br /&gt;
        jp normalise24&lt;br /&gt;
&lt;br /&gt;
== log base 2 ==&lt;br /&gt;
&lt;br /&gt;
    Float24Lg:&lt;br /&gt;
    ;Inputs: AHL is the 24-bit float&lt;br /&gt;
    ;     bit 7,a is the sign&lt;br /&gt;
    ;     bits 0~6 are the signed exponent&lt;br /&gt;
    ;     HL is the mantissa&lt;br /&gt;
    ;Output:&lt;br /&gt;
    ;    nc flag set if result would be complex&lt;br /&gt;
    ;    c if real result&lt;br /&gt;
    ;    BHL is the computed result if real&lt;br /&gt;
        or a&lt;br /&gt;
        jp p,$+9&lt;br /&gt;
        ld a,-1&lt;br /&gt;
        ld hl,0&lt;br /&gt;
        ret&lt;br /&gt;
        add a,a&lt;br /&gt;
        sra a&lt;br /&gt;
    ;A is now the value that must be added to the final result&lt;br /&gt;
        push af&lt;br /&gt;
        exx \ ld hl,0 \ exx&lt;br /&gt;
    FloatLogLoop:&lt;br /&gt;
    ;Step 1 : check if HL &amp;gt;=AAAA&lt;br /&gt;
    step1:&lt;br /&gt;
        ld bc,$AAAA&lt;br /&gt;
        xor a&lt;br /&gt;
        sbc hl,bc&lt;br /&gt;
        add hl,bc&lt;br /&gt;
        jp c,step2&lt;br /&gt;
        exx&lt;br /&gt;
        ld bc,27200&lt;br /&gt;
        add hl,bc&lt;br /&gt;
        exx&lt;br /&gt;
    ;multiply HL by 3/4&lt;br /&gt;
        ld d,h&lt;br /&gt;
        ld e,l&lt;br /&gt;
        add hl,hl \ rla&lt;br /&gt;
        add hl,de \ adc a,0&lt;br /&gt;
        rra \ rr h \ rr l&lt;br /&gt;
        rra \ rr h \ rr l&lt;br /&gt;
        jr nc,step1+3&lt;br /&gt;
        inc hl&lt;br /&gt;
        jp step1+3&lt;br /&gt;
    step2:&lt;br /&gt;
        ld bc,$9249&lt;br /&gt;
        xor a&lt;br /&gt;
        sbc hl,bc&lt;br /&gt;
        add hl,bc&lt;br /&gt;
        jp c,step3&lt;br /&gt;
        exx&lt;br /&gt;
        ld bc,12625&lt;br /&gt;
        add hl,bc&lt;br /&gt;
        exx&lt;br /&gt;
    ;multiply HL by 7/8&lt;br /&gt;
        ld d,h&lt;br /&gt;
        ld e,l&lt;br /&gt;
        add hl,hl \ rla&lt;br /&gt;
        add hl,hl \ rla&lt;br /&gt;
        add hl,hl \ rla&lt;br /&gt;
        sbc hl,de \ sbc a,0&lt;br /&gt;
        rra \ rr h \ rr l&lt;br /&gt;
        rra \ rr h \ rr l&lt;br /&gt;
        rra \ rr h \ rr l&lt;br /&gt;
        jr nc,step2+3&lt;br /&gt;
        inc hl&lt;br /&gt;
        jp step2+3&lt;br /&gt;
    step3:&lt;br /&gt;
        ld bc,$8888&lt;br /&gt;
        xor a&lt;br /&gt;
        sbc hl,bc&lt;br /&gt;
        add hl,bc&lt;br /&gt;
        jp c,step4&lt;br /&gt;
        exx&lt;br /&gt;
        ld bc,6102&lt;br /&gt;
        add hl,bc&lt;br /&gt;
        exx&lt;br /&gt;
    ;multiply HL by 7/8&lt;br /&gt;
        ld d,h&lt;br /&gt;
        ld e,l&lt;br /&gt;
        add hl,hl \ rla&lt;br /&gt;
        add hl,hl \ rla&lt;br /&gt;
        add hl,hl \ rla&lt;br /&gt;
        add hl,hl \ rla&lt;br /&gt;
        sbc hl,de \ sbc a,0&lt;br /&gt;
        rra \ rr h \ rr l&lt;br /&gt;
        rra \ rr h \ rr l&lt;br /&gt;
        rra \ rr h \ rr l&lt;br /&gt;
        rra \ rr h \ rr l&lt;br /&gt;
        jr nc,step3+3&lt;br /&gt;
        inc hl&lt;br /&gt;
        jp step3+3&lt;br /&gt;
    step4:&lt;br /&gt;
        ld bc,$8421&lt;br /&gt;
        xor a&lt;br /&gt;
        sbc hl,bc&lt;br /&gt;
        add hl,bc&lt;br /&gt;
        jp c,step5&lt;br /&gt;
        exx&lt;br /&gt;
        ld bc,3002&lt;br /&gt;
        add hl,bc&lt;br /&gt;
        exx&lt;br /&gt;
    ;multiply HL by 31/32&lt;br /&gt;
    ;multiply HL by 31&lt;br /&gt;
        push hl&lt;br /&gt;
        srl h \ rr l \ rra&lt;br /&gt;
        srl h \ rr l \ rra&lt;br /&gt;
        srl h \ rr l \ rra&lt;br /&gt;
        ld d,a&lt;br /&gt;
        ld a,h \ ld h,l \ ld l,d&lt;br /&gt;
        pop de&lt;br /&gt;
        sbc hl,de \ sbc a,0&lt;br /&gt;
    ;now divide by 32&lt;br /&gt;
    ; 7 shifts right&lt;br /&gt;
        add hl,hl \ rla&lt;br /&gt;
        add hl,hl \ rla&lt;br /&gt;
        add hl,hl \ rla&lt;br /&gt;
        bit 7,l&lt;br /&gt;
        ld l,h&lt;br /&gt;
        ld h,a&lt;br /&gt;
        jr z,step4+3&lt;br /&gt;
        inc hl&lt;br /&gt;
        jp step4+3&lt;br /&gt;
    &lt;br /&gt;
    step5:&lt;br /&gt;
        ld bc,$8208&lt;br /&gt;
        xor a&lt;br /&gt;
        sbc hl,bc&lt;br /&gt;
        add hl,bc&lt;br /&gt;
        jp c,step6&lt;br /&gt;
        exx&lt;br /&gt;
        ld bc,1489&lt;br /&gt;
        add hl,bc&lt;br /&gt;
        exx&lt;br /&gt;
    ;multiply HL by 63/64&lt;br /&gt;
    &lt;br /&gt;
    ;multiply HL by 63&lt;br /&gt;
        push hl&lt;br /&gt;
        srl h \ rr l \ rra&lt;br /&gt;
        srl h \ rr l \ rra&lt;br /&gt;
        ld d,a&lt;br /&gt;
        ld a,h \ ld h,l \ ld l,d&lt;br /&gt;
        pop de&lt;br /&gt;
        sbc hl,de \ sbc a,0&lt;br /&gt;
    ;now divide by 64&lt;br /&gt;
    ; 7 shifts right&lt;br /&gt;
        add hl,hl \ rla&lt;br /&gt;
        add hl,hl \ rla&lt;br /&gt;
        bit 7,l&lt;br /&gt;
        ld l,h&lt;br /&gt;
        ld h,a&lt;br /&gt;
        jr z,step5+3&lt;br /&gt;
        inc hl&lt;br /&gt;
        jp step5+3&lt;br /&gt;
    &lt;br /&gt;
    step6:&lt;br /&gt;
        ld bc,$8102&lt;br /&gt;
        xor a&lt;br /&gt;
        sbc hl,bc&lt;br /&gt;
        add hl,bc&lt;br /&gt;
        jp c,step7&lt;br /&gt;
        exx&lt;br /&gt;
        ld bc,742&lt;br /&gt;
        add hl,bc&lt;br /&gt;
        exx&lt;br /&gt;
    ;multiply HL by 127&lt;br /&gt;
        ld d,h&lt;br /&gt;
        ld e,l&lt;br /&gt;
        srl h \ rr l&lt;br /&gt;
        ld a,h \ ld h,l \ ld l,0 \ rr l&lt;br /&gt;
        sbc hl,de \ sbc a,0&lt;br /&gt;
    ;now divide by 128&lt;br /&gt;
    ; 7 shifts right&lt;br /&gt;
        add hl,hl \ rla&lt;br /&gt;
        bit 7,l&lt;br /&gt;
        ld l,h&lt;br /&gt;
        ld h,a&lt;br /&gt;
        jr z,step6+3&lt;br /&gt;
        inc hl&lt;br /&gt;
        jp step6+3&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    step7:&lt;br /&gt;
        ld bc,$8080&lt;br /&gt;
        xor a&lt;br /&gt;
        sbc hl,bc&lt;br /&gt;
        add hl,bc&lt;br /&gt;
        jp c,step8&lt;br /&gt;
        exx&lt;br /&gt;
        ld bc,370&lt;br /&gt;
        add hl,bc&lt;br /&gt;
        exx&lt;br /&gt;
    ;multiply HL by 255&lt;br /&gt;
        ld d,h&lt;br /&gt;
        ld e,l&lt;br /&gt;
        ld a,h \ ld h,l \ ld l,0&lt;br /&gt;
        sbc hl,de \ sbc a,0&lt;br /&gt;
    ;now divide by 256&lt;br /&gt;
        bit 7,l&lt;br /&gt;
        ld l,h&lt;br /&gt;
        ld h,a&lt;br /&gt;
        jr z,step7+3&lt;br /&gt;
        inc hl&lt;br /&gt;
        jp step7+3&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    step8:&lt;br /&gt;
        exx \ ld bc,185 \ exx&lt;br /&gt;
        rrc c&lt;br /&gt;
        sbc hl,bc&lt;br /&gt;
        add hl,bc&lt;br /&gt;
        jp c,step9&lt;br /&gt;
        exx&lt;br /&gt;
        add hl,bc&lt;br /&gt;
        exx&lt;br /&gt;
    ;multiply HL by 511/512&lt;br /&gt;
        xor a&lt;br /&gt;
        ld e,h&lt;br /&gt;
        ld d,a&lt;br /&gt;
        cp L&lt;br /&gt;
        jr z,$+3&lt;br /&gt;
        inc de&lt;br /&gt;
        add hl,hl \ rla&lt;br /&gt;
        sbc hl,de \ sbc a,0&lt;br /&gt;
        rra \ rr h \ rr l&lt;br /&gt;
        jr nc,step8+7&lt;br /&gt;
        inc hl&lt;br /&gt;
        jp step8+7&lt;br /&gt;
    &lt;br /&gt;
    step9:&lt;br /&gt;
        rrc c&lt;br /&gt;
        sbc hl,bc&lt;br /&gt;
        add hl,bc&lt;br /&gt;
        jp c,step10&lt;br /&gt;
        exx&lt;br /&gt;
        ld c,92&lt;br /&gt;
        add hl,bc&lt;br /&gt;
        exx&lt;br /&gt;
    ;multiply HL by 1023/1024&lt;br /&gt;
        xor a&lt;br /&gt;
        ld e,h&lt;br /&gt;
        ld d,a&lt;br /&gt;
        cp L&lt;br /&gt;
        jr z,$+3&lt;br /&gt;
        inc de&lt;br /&gt;
        add hl,hl \ rla&lt;br /&gt;
        add hl,hl \ rla&lt;br /&gt;
        sbc hl,de \ sbc a,0&lt;br /&gt;
        rra \ rr h \ rr l&lt;br /&gt;
        rra \ rr h \ rr l&lt;br /&gt;
        jr nc,step9+2&lt;br /&gt;
        inc hl&lt;br /&gt;
        jp step9+2&lt;br /&gt;
    &lt;br /&gt;
    step10:&lt;br /&gt;
        rrc c&lt;br /&gt;
        sbc hl,bc&lt;br /&gt;
        add hl,bc&lt;br /&gt;
        jp c,step11&lt;br /&gt;
        exx&lt;br /&gt;
        ld c,46&lt;br /&gt;
        add hl,bc&lt;br /&gt;
        exx&lt;br /&gt;
    ;multiply HL by 1023/1024&lt;br /&gt;
        xor a&lt;br /&gt;
        ld e,h&lt;br /&gt;
        ld d,a&lt;br /&gt;
        cp L&lt;br /&gt;
        jr z,$+3&lt;br /&gt;
        inc de&lt;br /&gt;
        add hl,hl \ rla&lt;br /&gt;
        add hl,hl \ rla&lt;br /&gt;
        add hl,hl \ rla&lt;br /&gt;
        sbc hl,de \ sbc a,0&lt;br /&gt;
        rra \ rr h \ rr l&lt;br /&gt;
        rra \ rr h \ rr l&lt;br /&gt;
        rra \ rr h \ rr l&lt;br /&gt;
        jr nc,step10+2&lt;br /&gt;
        inc hl&lt;br /&gt;
        jp step10+2&lt;br /&gt;
    &lt;br /&gt;
    step11:&lt;br /&gt;
        rrc c&lt;br /&gt;
        sbc hl,bc&lt;br /&gt;
        add hl,bc&lt;br /&gt;
        jp c,step12&lt;br /&gt;
        exx&lt;br /&gt;
        ld c,23&lt;br /&gt;
        add hl,bc&lt;br /&gt;
        exx&lt;br /&gt;
    ;multiply HL by 2047/2048&lt;br /&gt;
        xor a&lt;br /&gt;
        ld e,h&lt;br /&gt;
        ld d,a&lt;br /&gt;
        cp L&lt;br /&gt;
        jr z,$+3&lt;br /&gt;
        inc de&lt;br /&gt;
        add hl,hl \ rla&lt;br /&gt;
        add hl,hl \ rla&lt;br /&gt;
        add hl,hl \ rla&lt;br /&gt;
        add hl,hl \ rla&lt;br /&gt;
        sbc hl,de \ sbc a,0&lt;br /&gt;
        rra \ rr h \ rr l&lt;br /&gt;
        rra \ rr h \ rr l&lt;br /&gt;
        rra \ rr h \ rr l&lt;br /&gt;
        rra \ rr h \ rr l&lt;br /&gt;
        jr nc,step11+2&lt;br /&gt;
        inc hl&lt;br /&gt;
        jp step11+2&lt;br /&gt;
    &lt;br /&gt;
    step12:&lt;br /&gt;
    ;    rrc c&lt;br /&gt;
    ;    sbc hl,bc&lt;br /&gt;
    ;    add hl,bc&lt;br /&gt;
    ;    jp c,step13&lt;br /&gt;
    ;    exx&lt;br /&gt;
    ;    ld c,12&lt;br /&gt;
    ;    add hl,bc&lt;br /&gt;
    ;    exx&lt;br /&gt;
    &lt;br /&gt;
    step13:&lt;br /&gt;
    logfin:&lt;br /&gt;
    &lt;br /&gt;
        pop af&lt;br /&gt;
        exx&lt;br /&gt;
        ld bc,$7F07&lt;br /&gt;
        ld d,a&lt;br /&gt;
        ld a,b&lt;br /&gt;
        ret z&lt;br /&gt;
        ld a,d&lt;br /&gt;
        ld e,0&lt;br /&gt;
    &lt;br /&gt;
        jp p,$+7&lt;br /&gt;
        ld c,$87&lt;br /&gt;
        neg&lt;br /&gt;
        dec c&lt;br /&gt;
        add a,a \ jp p,$-2&lt;br /&gt;
        ld d,a&lt;br /&gt;
        jp Float24Add&lt;br /&gt;
&lt;br /&gt;
== Square Root ==&lt;br /&gt;
&lt;br /&gt;
    Float24Sqrt:&lt;br /&gt;
    ;Input:&lt;br /&gt;
    ;  AHL is the 24-bit float of which to find the square root&lt;br /&gt;
    ;Output:&lt;br /&gt;
    ;  BHL is the resulting 24-bit square root&lt;br /&gt;
        or a&lt;br /&gt;
        jp p,$+9&lt;br /&gt;
        ld a,-1&lt;br /&gt;
        ld hl,0&lt;br /&gt;
        ret&lt;br /&gt;
    &lt;br /&gt;
        rra&lt;br /&gt;
        jr c,$+6&lt;br /&gt;
        srl h&lt;br /&gt;
        rr l&lt;br /&gt;
        add a,a&lt;br /&gt;
        add a,a&lt;br /&gt;
        sra a&lt;br /&gt;
        rra&lt;br /&gt;
        ld b,a&lt;br /&gt;
    SqrtHL_prec16:&lt;br /&gt;
    ;input: HL&lt;br /&gt;
    ;Output: DE&lt;br /&gt;
    ;247 bytes&lt;br /&gt;
    ;1269 t-states worst case&lt;br /&gt;
    ;Average is about 1219 t-states&lt;br /&gt;
        xor a&lt;br /&gt;
        ld d,a&lt;br /&gt;
    &lt;br /&gt;
        ld c,l&lt;br /&gt;
        ld l,h&lt;br /&gt;
        ld h,a&lt;br /&gt;
    &lt;br /&gt;
        add hl,hl&lt;br /&gt;
        add hl,hl&lt;br /&gt;
        cp h&lt;br /&gt;
        jr nc,$+5&lt;br /&gt;
        dec h&lt;br /&gt;
        ld a,4&lt;br /&gt;
    &lt;br /&gt;
        add hl,hl&lt;br /&gt;
        add hl,hl&lt;br /&gt;
        ld e,a&lt;br /&gt;
        sub h&lt;br /&gt;
        jr nc,$+6&lt;br /&gt;
        cpl&lt;br /&gt;
        ld h,a&lt;br /&gt;
        inc e&lt;br /&gt;
        inc e&lt;br /&gt;
    &lt;br /&gt;
        ld a,e&lt;br /&gt;
        add hl,hl&lt;br /&gt;
        add hl,hl&lt;br /&gt;
        add a,a&lt;br /&gt;
        ld e,a&lt;br /&gt;
        sub h&lt;br /&gt;
        jr nc,$+6&lt;br /&gt;
        cpl&lt;br /&gt;
        ld h,a&lt;br /&gt;
        inc e&lt;br /&gt;
        inc e&lt;br /&gt;
    &lt;br /&gt;
        ld a,e&lt;br /&gt;
        add hl,hl&lt;br /&gt;
        add hl,hl&lt;br /&gt;
        add a,a&lt;br /&gt;
        ld e,a&lt;br /&gt;
        sub h&lt;br /&gt;
        jr nc,$+6&lt;br /&gt;
        cpl&lt;br /&gt;
        ld h,a&lt;br /&gt;
        inc e&lt;br /&gt;
        inc e&lt;br /&gt;
    &lt;br /&gt;
        ld a,e&lt;br /&gt;
        ld l,c&lt;br /&gt;
    &lt;br /&gt;
        add hl,hl&lt;br /&gt;
        add hl,hl&lt;br /&gt;
        add a,a&lt;br /&gt;
        ld e,a&lt;br /&gt;
        sub h&lt;br /&gt;
        jr nc,$+6&lt;br /&gt;
        cpl&lt;br /&gt;
        ld h,a&lt;br /&gt;
        inc e&lt;br /&gt;
        inc e&lt;br /&gt;
    &lt;br /&gt;
        ld a,e&lt;br /&gt;
        add hl,hl&lt;br /&gt;
        add hl,hl&lt;br /&gt;
        add a,a&lt;br /&gt;
        ld e,a&lt;br /&gt;
        sub h&lt;br /&gt;
        jr nc,$+6&lt;br /&gt;
        cpl&lt;br /&gt;
        ld h,a&lt;br /&gt;
        inc e&lt;br /&gt;
        inc e&lt;br /&gt;
    &lt;br /&gt;
        ld a,e&lt;br /&gt;
        add a,a \ ld e,a&lt;br /&gt;
        add hl,hl&lt;br /&gt;
        add hl,hl&lt;br /&gt;
        jr nc,$+6&lt;br /&gt;
        sub h \ jp $+6&lt;br /&gt;
        sub h&lt;br /&gt;
        jr nc,$+6&lt;br /&gt;
        inc e \ inc e&lt;br /&gt;
        cpl&lt;br /&gt;
        ld h,a&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
        ld a,l&lt;br /&gt;
        ld l,h&lt;br /&gt;
        add a,a&lt;br /&gt;
        ld h,a&lt;br /&gt;
        adc hl,hl&lt;br /&gt;
        adc hl,hl&lt;br /&gt;
        sll e \ rl d&lt;br /&gt;
        sbc hl,de&lt;br /&gt;
        jr nc,$+3&lt;br /&gt;
        add hl,de&lt;br /&gt;
        sbc a,a \ add a,a \ inc a \ add a,e \ ld e,a&lt;br /&gt;
    &lt;br /&gt;
    ;iteration 9&lt;br /&gt;
        add hl,hl \ add hl,hl&lt;br /&gt;
        sll e \ rl d&lt;br /&gt;
        sbc hl,de&lt;br /&gt;
        jr nc,$+3&lt;br /&gt;
        add hl,de&lt;br /&gt;
        sbc a,a \ add a,a \ inc a \ add a,e \ ld e,a&lt;br /&gt;
    &lt;br /&gt;
        add hl,hl \ add hl,hl&lt;br /&gt;
        sll e \ rl d&lt;br /&gt;
        sbc hl,de&lt;br /&gt;
        jr nc,$+3&lt;br /&gt;
        add hl,de&lt;br /&gt;
        sbc a,a \ add a,a \ inc a \ add a,e \ ld e,a&lt;br /&gt;
    &lt;br /&gt;
        add hl,hl \ add hl,hl&lt;br /&gt;
        sll e \ rl d&lt;br /&gt;
        sbc hl,de&lt;br /&gt;
        jr nc,$+3&lt;br /&gt;
        add hl,de&lt;br /&gt;
        sbc a,a \ add a,a \ inc a \ add a,e \ ld e,a&lt;br /&gt;
    &lt;br /&gt;
        add hl,hl \ add hl,hl&lt;br /&gt;
        sll e \ rl d&lt;br /&gt;
        sbc hl,de&lt;br /&gt;
        jr nc,$+3&lt;br /&gt;
        add hl,de&lt;br /&gt;
        sbc a,a \ add a,a \ inc a \ add a,e \ ld e,a&lt;br /&gt;
    &lt;br /&gt;
        add hl,hl \ add hl,hl&lt;br /&gt;
        sll e \ rl d&lt;br /&gt;
        sbc hl,de&lt;br /&gt;
        jr nc,$+3&lt;br /&gt;
        add hl,de&lt;br /&gt;
        sbc a,a \ add a,a \ inc a \ add a,e \ ld e,a&lt;br /&gt;
    &lt;br /&gt;
        add hl,hl \ add hl,hl&lt;br /&gt;
        sll e \ rl d&lt;br /&gt;
        sbc hl,de&lt;br /&gt;
        jr nc,$+3&lt;br /&gt;
        add hl,de&lt;br /&gt;
        sbc a,a \ add a,a \ inc a \ add a,e \ ld e,a&lt;br /&gt;
    &lt;br /&gt;
        sll e \ rl d&lt;br /&gt;
        add hl,hl \ add hl,hl    ;up to 17 bits&lt;br /&gt;
        jr nc,$+8&lt;br /&gt;
            sbc hl,de&lt;br /&gt;
            inc e&lt;br /&gt;
            jp $+13&lt;br /&gt;
        sbc hl,de&lt;br /&gt;
        jr nc,$+3&lt;br /&gt;
        add hl,de&lt;br /&gt;
        sbc a,a \ add a,a \ inc a \ add a,e \ ld e,a&lt;br /&gt;
    &lt;br /&gt;
        srl d \ rr e \ scf&lt;br /&gt;
        sbc hl,de&lt;br /&gt;
        ccf&lt;br /&gt;
        ex de,hl&lt;br /&gt;
        adc hl,hl&lt;br /&gt;
        ret&lt;br /&gt;
&lt;br /&gt;
== Float To Signed Int ==&lt;br /&gt;
&lt;br /&gt;
    FloatToSInt:&lt;br /&gt;
    ;Input: BHL&lt;br /&gt;
    ;Output : DE&lt;br /&gt;
    ;Overflow is handled as 0x7FFF or 0xFFFF&lt;br /&gt;
        ld de,0&lt;br /&gt;
        ld a,b&lt;br /&gt;
        and 80h&lt;br /&gt;
        or d&lt;br /&gt;
        ld d,a&lt;br /&gt;
        ld a,b&lt;br /&gt;
        add a,a&lt;br /&gt;
        ret m&lt;br /&gt;
        dec de&lt;br /&gt;
        rr d \ rr e&lt;br /&gt;
        sub 16&lt;br /&gt;
        ret nc&lt;br /&gt;
        cpl&lt;br /&gt;
        ld d,h \ ld e,l&lt;br /&gt;
        ld b,a&lt;br /&gt;
        sra d \ rr e&lt;br /&gt;
        djnz $-4&lt;br /&gt;
        ret&lt;br /&gt;
&lt;br /&gt;
== Float to Unsigned Int ==&lt;br /&gt;
&lt;br /&gt;
    FloatToUInt:&lt;br /&gt;
    ;Input: BHL&lt;br /&gt;
    ;Output : DE&lt;br /&gt;
    ;Overflow is handled as 0xFFFF&lt;br /&gt;
        ld de,0&lt;br /&gt;
        ld a,b&lt;br /&gt;
        add a,a&lt;br /&gt;
        ret m&lt;br /&gt;
        dec de&lt;br /&gt;
        sub 16&lt;br /&gt;
        ret nc&lt;br /&gt;
        cpl&lt;br /&gt;
        ld d,h \ ld e,l&lt;br /&gt;
        ld b,a&lt;br /&gt;
        srl d \ rr e&lt;br /&gt;
        djnz $-4&lt;br /&gt;
        ret&lt;br /&gt;
&lt;br /&gt;
== Atan2 (CORDIC) ==&lt;br /&gt;
This is getting questionable accuracy, but it is a CORDIC implementation of arctangent using an x and y input:&lt;br /&gt;
&lt;br /&gt;
    Float24Atan2:&lt;br /&gt;
    ;Inputs:&lt;br /&gt;
    ; BHL=X&lt;br /&gt;
    ; CDE=Y&lt;br /&gt;
    ;Outputs:&lt;br /&gt;
    ; AHL is the angle (64 corresponds to 90 degrees)&lt;br /&gt;
    ; CDE can be multiplied by 0.60725293500888 (7F 9B75)to get sqrt(x^2+y^2).&lt;br /&gt;
        ld (f24_exp2),bc&lt;br /&gt;
        ld (f24_man1),hl&lt;br /&gt;
        ld (f24_man2),de&lt;br /&gt;
        xor a&lt;br /&gt;
        ld h,a&lt;br /&gt;
        ld l,a&lt;br /&gt;
        ld (f24_man3),hl&lt;br /&gt;
        ld (f24_exp3),a&lt;br /&gt;
        ld (f24_man4),hl&lt;br /&gt;
        ld (f24_exp4),a&lt;br /&gt;
        ld hl,Float24_arctantable&lt;br /&gt;
        ld (tempword1),hl&lt;br /&gt;
    f24_atan2loop:&lt;br /&gt;
        ld (tempbyte1),a&lt;br /&gt;
        add a,c&lt;br /&gt;
        and $7F&lt;br /&gt;
        ld c,a&lt;br /&gt;
    ;add CDE to f1, store to f5&lt;br /&gt;
        ld hl,(f24_man1)&lt;br /&gt;
        call Float24Add&lt;br /&gt;
        ld (f24_exp5),a&lt;br /&gt;
        ld (f24_man5),hl&lt;br /&gt;
    &lt;br /&gt;
        ld bc,(f24_exp2)&lt;br /&gt;
        ld a,(tempbyte1)&lt;br /&gt;
        add a,b&lt;br /&gt;
        and $7F&lt;br /&gt;
        bit 7,b&lt;br /&gt;
        jr z,$+4&lt;br /&gt;
        or 80h&lt;br /&gt;
        ld d,a&lt;br /&gt;
        ld b,c&lt;br /&gt;
        ld c,d&lt;br /&gt;
        ld de,(f24_man1)&lt;br /&gt;
        ld hl,(f24_man2)&lt;br /&gt;
    &lt;br /&gt;
        bit 7,b&lt;br /&gt;
        jr nz,$+2+3+3+3+3+1+3&lt;br /&gt;
        call Float24Sub&lt;br /&gt;
        ld (f24_man2),hl&lt;br /&gt;
        ld (f24_exp2),a&lt;br /&gt;
        ld hl,(tempword1)&lt;br /&gt;
        ld c,(hl)&lt;br /&gt;
        jp adjustangle&lt;br /&gt;
    &lt;br /&gt;
        call Float24Add&lt;br /&gt;
        ld (f24_man2),hl&lt;br /&gt;
        ld (f24_exp2),a&lt;br /&gt;
        ld a,(tempbyte1)&lt;br /&gt;
        ld hl,(tempword1)&lt;br /&gt;
        ld c,(hl) \ set 7,c&lt;br /&gt;
    AdjustAngle:&lt;br /&gt;
        inc hl&lt;br /&gt;
        ld e,(hl) \ inc hl&lt;br /&gt;
        ld d,(hl) \ inc hl&lt;br /&gt;
        ld (tempword1),hl&lt;br /&gt;
        ld hl,(f24_man4)&lt;br /&gt;
        ld a,(f24_exp4)&lt;br /&gt;
        ld b,a&lt;br /&gt;
        call Float24Add&lt;br /&gt;
        ld (f24_man4),hl&lt;br /&gt;
        ld (f24_exp4),a&lt;br /&gt;
    &lt;br /&gt;
        ld hl,(f24_man5)&lt;br /&gt;
        ld a,(f24_exp5)&lt;br /&gt;
        ld (f24_man1),hl&lt;br /&gt;
        ld (f24_exp1),a&lt;br /&gt;
    &lt;br /&gt;
        ld bc,(f24_exp2)&lt;br /&gt;
        ld de,(f24_man2)&lt;br /&gt;
        ld a,(tempbyte1)&lt;br /&gt;
        dec a&lt;br /&gt;
        cp -8&lt;br /&gt;
        jp nz,f24_atan2loop&lt;br /&gt;
        ld hl,(f24_man4)&lt;br /&gt;
        ld a,(f24_exp4)&lt;br /&gt;
        ld bc,(f24_exp1)&lt;br /&gt;
        ld de,(f24_man1)&lt;br /&gt;
        ret&lt;br /&gt;
    &lt;br /&gt;
    Float24_arctantable:&lt;br /&gt;
     .db 5   \ .dw $8000&lt;br /&gt;
     .db 4   \ .dw $9720&lt;br /&gt;
     .db 3   \ .dw $9FB4&lt;br /&gt;
     .db 2   \ .dw $A222&lt;br /&gt;
     .db 1   \ .dw $A2C3&lt;br /&gt;
     .db 0   \ .dw $A2EC&lt;br /&gt;
     .db -1  \ .dw $A2F6&lt;br /&gt;
     .db -2  \ .dw $A2F9    ;note that from here, these are essentially the same&lt;br /&gt;
     .db -3  \ .dw $A2F9&lt;br /&gt;
     .db -4  \ .dw $A2F9&lt;br /&gt;
     .db -5  \ .dw $A2FA&lt;br /&gt;
     .db -6  \ .dw $A2FA&lt;br /&gt;
     .db -7  \ .dw $A2FA&lt;br /&gt;
     .db -8  \ .dw $A2FA&lt;br /&gt;
     .db -9  \ .dw $A2FA&lt;br /&gt;
     .db -10 \ .dw $A2FA&lt;br /&gt;
&lt;br /&gt;
= 32-bit Floating Point =&lt;br /&gt;
= 80-bit Floating Point =&lt;br /&gt;
&lt;br /&gt;
= Conclusion =&lt;br /&gt;
For more routines, until this page can be filled in more, see this [https://drive.google.com/folderview?id=0B4HNIXQZLWM8Z3NQMGJTbHVhRm8&amp;amp;usp=sharing Floating Point Library]&lt;br /&gt;
&lt;br /&gt;
{{lowercase}}&lt;br /&gt;
[[Category:Z80 Assembly]]&lt;br /&gt;
[[Category:Z80 Heaven]]&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
</feed>