comparison 3rdparty/packages/basic09/basic09.real.add.68.asm @ 477:7a5d3fcbe2d8

Added Basic09 sources from Curtis Boyle
author boisy
date Tue, 08 Oct 2002 03:27:42 +0000
parents
children
comparison
equal deleted inserted replaced
476:1e5bbc865130 477:7a5d3fcbe2d8
1 * Add for REAL #'s - 6809 version
2 L3FB1 pshs x Preserve X
3 tst 2,y 1st byte of mantissa 0 (means value is 0)?
4 beq L3FC7 Yes, eat temp var & leave other var alone
5 tst 8,y Is original # a 0?
6 bne L3FCB No, go do actual add
7 L3FBB ldd 1,y Copy temp var's value overtop original var (0)
8 std 7,y
9 ldd 3,y
10 std 9,y
11 lda 5,y Copy last byte of mantissa (sign bit) to orig var
12 sta $B,y
13 L3FC7 leay 6,y Eat temp var & return
14 puls pc,x
15
16 * Real add with non-zero values starts here
17 * NOTE: Exponents are 2^n, with n being the SIGNED exponent byte
18 L3FCB lda 7,y Get 1st exponent
19 suba 1,y Calculate difference in exponents
20 bvc L3FD5 Didn't exceed +127 or -128, skip ahead
21 bpl L3FBB Went too big on plus side, make temp var the answe
22 bra L3FC7 Too small, eat temp var & leave answer alone
23
24 L3FD5 bmi L3FDD If negative difference in exponents, skip ahead
25 cmpa #31 Difference of exponents within 0-31?
26 ble L3FE5 Yes, go deal with it
27 bra L3FC7 >2^31, out of range so eat temp var & return
28
29 L3FDD cmpa #-31 Difference of exponents within -1 to -31?
30 blt L3FBB <2^-31, out of range so copy temp to answer
31 ldb 1,y ???Since negative difference, copy temp exponent
32 stb 7,y overtop destination exponent?
33 * As of this point, exponent in temp var no longer needed (A=difference in exp
34 L3FE5 ldb $B,y Get sign of dest. var
35 andb #$01 Keep sign bit only
36 stb ,y Save copy over var type
37 eorb 5,y EOR with sign bit of temp var
38 andb #$01 Keep only merged sign bit
39 stb 1,y Save what resulting sign should be
40 ldb $B,y
41 andb #$FE
42 stb $B,y
43 ldb 5,y
44 andb #$FE
45 stb 5,y
46 tsta Are exponents exactly the same?
47 beq L4031 Yes, skip ahead
48 bpl L4029 Exponent difference positive, go process
49 * Exponent difference is a negative value
50 nega Force to positive
51 leax 6,y Point X to dest. var
52 bsr L4082 Shift mantissa to match other value (into X:D)
53 tst 1,y Result going to be positive?
54 beq L4039 Yes, skip ahead
55 L400B subd 4,y Essentially, X:D=X:D-(2,y)
56 exg d,x
57 * This is essentially a sign reverse on 32 bit #?
58 sbcb 3,y
59 sbca 2,y
60 bcc L404D No borrow required, skip ahead
61 coma Compliment all 4 bytes
62 comb
63 exg d,x
64 coma
65 comb
66 addd #1 +1
67 exg d,x
68 bcc L4025 If no carry, skip ahead
69 addd #1 +1 to rest of 32 bit #
70 L4025 dec ,y Drop exponent by 1
71 bra L404D
72
73 * Exponent difference is positive value
74 L4029 leax ,y Point X to temp var
75 bsr L4082 Shift mantissa to match other value (into X:D)
76 stx 2,y
77 std 4,y
78 * Equal exponents come here
79 L4031 ldx 8,y Get mantissa of dest var into X:D
80 ldd $A,y
81 tst 1,y Check exponent of temp var
82 bne L400B <>0, go process
83 L4039 addd 4,y 32 bit add of X:D + [2,y]
84 exg d,x
85 adcb 3,y
86 adca 2,y
87 bcc L404D No overflow carry after add, skip ahead
88 rora Overflow, divide 32 bit mantissa by 2
89 rorb
90 exg d,x
91 rora
92 rorb
93 inc 7,y Bump up exponent of dest var by 1
94 exg d,x
95 L404D tsta
96 bmi L4060
97 L4050 dec 7,y
98 lbvs L40DD
99 exg d,x
100 lslb
101 rola
102 exg d,x
103 rolb
104 rola
105 bpl L4050
106 L4060 exg d,x
107 addd #1
108 exg d,x
109 bcc L4071
110 addd #1
111 bcc L4071
112 rora
113 inc 7,y
114 L4071 std 8,y
115 tfr x,d
116 andb #$FE Mask out sign bit in mantissa (force to positive)
117 tst ,y Result supposed to be negative?
118 beq L407C No, leave it alone
119 incb Set sign bit (negative result)
120 L407C std $A,y Save LSW of mantissa
121 leay 6,y Eat temp var
122 puls pc,x Restore X & return
123
124 * Entry: A=ABS(difference between exponents)
125 * Y=Ptr to temp var packet\ These could be swapped depending on whether
126 * X=Ptr to dest var packet/ exponent difference is positive or negative
127 * Exit: X:D is 32 bit shifted mantissa
128 L4082 suba #16 Subtract 16 from exponent difference (2 byte shift
129 blo L40A0 Wrapped to negative, skip ahead
130 suba #8 Try subtracting 8 from it
131 blo L4091 Wrapped, go add it back in
132 * 3 byte minimum shift
133 sta <u0014 Save number of rotates needed after 3 byte move
134 clra D=High word of mantissa
135 ldb 2,x
136 bra L4097 Go get Low word of mantissa into X & process
137
138 * 2 byte minimum shift
139 L4091 adda #8 Bump # shifts back up
140 sta <u0014 Save number of rotates needed
141 ldd 2,x D=
142 L4097 ldx #0
143 tst <u0014 Any shifts required?
144 bne L40BD Yes, go do them
145 rts No, return
146
147 L40A0 adda #8 Add 8 back (back to 1 byte shift)
148 bhs L40B3 Still more left, skip ahead
149 sta <u0014
150 clra
151 ldb 2,x
152 ldx 3,x
153 tst <u0014 Any shifts to do?
154 bne L40BF Yes, go do
155 exg d,x
156 rts
157
158 L40B3 adda #8 Add 8 back again (back to original difference)
159 sta <u0014 Save # bit shifts needed
160 ldd 2,x Get 32 bit mantissa into D:X from dest var
161 ldx 4,x
162 bra L40BF Go perform shift
163
164 * NOTE: BY LOOKS OF IT MOST OF THESE D,X PAIRS CAN BE CHANGED TO D,W (Q) PAIRS
165 * ELIMINATING ALL THE EXCHANGES AND SPEEDING UP REAL CALCS BY QUITE A BIT
166 L40BD exg d,x
167 L40BF lsra
168 rorb
169 exg d,x
170 rora
171 rorb
172 dec <u0014
173 bne L40BD
174 L40C9 rts