2017-06-11 14:56:33 +00:00
|
|
|
# Print 16-bit Fixed Point Fraction
|
2017-06-11 14:18:38 +00:00
|
|
|
|
2017-06-11 14:37:51 +00:00
|
|
|
# Theory
|
|
|
|
|
|
|
|
Printing the fractional value of a 16-bit fixed point number in decimal is rather trivial.
|
|
|
|
|
|
|
|
For example, the number `0.7106` in 16-bit fixed point is 0.71506 * 65536 = 46,569 = `$B5E9`
|
|
|
|
|
2017-06-11 14:56:33 +00:00
|
|
|
* Q. How do we convert the number `$B5E9` back into `.7106` ?
|
|
|
|
* Q. By _digit peeling._
|
2017-06-11 14:37:51 +00:00
|
|
|
|
2017-06-11 14:56:33 +00:00
|
|
|
Given a fractional number `N` represented as a 16-bit integer then the pseudo-code is:
|
2017-06-11 14:48:25 +00:00
|
|
|
|
|
|
|
1. Multiply N by 10
|
2017-06-11 14:56:33 +00:00
|
|
|
2. Print the Integer Part of `N` (a digit)
|
2017-06-11 14:37:51 +00:00
|
|
|
3. Set the Integer Part to zero
|
2017-06-11 14:56:33 +00:00
|
|
|
5. Have we printed the total number of decimal digits we want? If no then goto step 1
|
2017-06-11 14:37:51 +00:00
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
```
|
2017-06-11 14:53:26 +00:00
|
|
|
+-----------------------------+
|
|
|
|
| |
|
|
|
|
0.7106 * 65536 = $B5E9 |
|
|
|
|
| |
|
|
|
|
| v
|
|
|
|
v '.'
|
2017-06-11 14:37:51 +00:00
|
|
|
$B5E9 * $A = $7.1B1A
|
|
|
|
$1B1A * $A = $1.0F04
|
|
|
|
$0F04 * $A = $0.9628
|
|
|
|
$9628 * $A = $5.DD90
|
|
|
|
$5DD9 * $A = $8.A7A0
|
|
|
|
```
|
|
|
|
|
2017-06-11 14:53:26 +00:00
|
|
|
An optimization for `N*10` is that this is equivalent to: `N*8 + N*2`
|
2017-06-11 14:37:51 +00:00
|
|
|
|
|
|
|
|
|
|
|
# Application
|
|
|
|
|
|
|
|
## Assembly (Source)
|
2017-06-11 14:18:38 +00:00
|
|
|
|
|
|
|
See file [print_fract.s](print_fract.s)
|
|
|
|
|
2017-06-11 14:37:51 +00:00
|
|
|
## Binary (Executable)
|
2017-06-11 14:18:38 +00:00
|
|
|
|
|
|
|
```
|
2017-06-11 14:22:00 +00:00
|
|
|
CALL-151
|
2017-06-11 14:45:23 +00:00
|
|
|
0800:a2 b5 a0 e9 20 1a 08 a9 ae 20 ed fd a2 00 bd 76
|
|
|
|
0810:08 20 ed fd e8 e0 05 d0 f5 60 8e 71 08 8c 72 08
|
|
|
|
0820:20 6a 08 aa 20 60 08 20 54 08 20 60 08 20 60 08
|
|
|
|
0830:20 44 08 ad 70 08 09 b0 9d 76 08 20 6a 08 e8 e0
|
|
|
|
0840:05 d0 e1 60 18 a0 02 b9 70 08 79 73 08 99 70 08
|
|
|
|
0850:88 10 f4 60 a0 02 b9 70 08 99 73 08 88 10 f7 60
|
|
|
|
0860:0e 72 08 2e 71 08 2e 70 08 60 a9 00 8d 70 08 60
|
|
|
|
0870:00 00 00 00 00 00 00 00 00 00 00
|
2017-06-11 14:22:00 +00:00
|
|
|
800G
|
2017-06-11 14:45:23 +00:00
|
|
|
E000G
|
2017-06-11 14:18:38 +00:00
|
|
|
```
|
2017-06-11 14:22:00 +00:00
|
|
|
|
2017-06-11 14:37:51 +00:00
|
|
|
## Output
|
2017-06-11 14:22:00 +00:00
|
|
|
|
|
|
|
```
|
2017-06-11 14:45:23 +00:00
|
|
|
.71058
|
2017-06-11 14:22:00 +00:00
|
|
|
```
|
|
|
|
|