annotate code_part1/OSTC_code_asm_part1/math.asm @ 552:44e9b961f156

Compute ppO2 for pSCR diving
author heinrichsweikamp
date Sat, 04 Feb 2012 18:23:36 +0100
parents 56da3e962e98
children e3ffc6d62a63
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
1 ; OSTC - diving computer code
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
2 ; Copyright (C) 2008 HeinrichsWeikamp GbR
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
3
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
4 ; This program is free software: you can redistribute it and/or modify
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
5 ; it under the terms of the GNU General Public License as published by
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
6 ; the Free Software Foundation, either version 3 of the License, or
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
7 ; (at your option) any later version.
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
8
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
9 ; This program is distributed in the hope that it will be useful,
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
10 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
11 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
12 ; GNU General Public License for more details.
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
13
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
14 ; You should have received a copy of the GNU General Public License
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
15 ; along with this program. If not, see <http://www.gnu.org/licenses/>.
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
16
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
17
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
18 ; Math routines
161
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
19 ; history:
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
20 ; 2005-10-30: Written by Matthias Heinrichs, info@heinrichsweikamp.com
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
21 ; 2007-06-21: MH last updated
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
22 ; 2011-01-19: Clean up of isr variante.
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
23 ; known bugs:
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
24 ; ToDo: clean up!
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
25
88
heinrichsweikamp
parents: 74
diff changeset
26
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
27 convert_time: ; converts hi:lo in minutes to hours (hi) and minutes (lo)
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
28 movff lo,xA+0 ; divide by 60...
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
29 movff hi,xA+1 ;
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
30 movlw d'60' ;
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
31 movwf xB+0 ;
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
32 clrf xB+1 ;
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
33 rcall div16x16 ; xA/xB=xC with xA as remainder
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
34 movff xC+0,hi ; Hours
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
35 movff xA+0,lo ; =remaining minutes (0.....59)
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
36 return
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
37
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
38 div16:
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
39 ; divA=divA/2^divB (divB: 8Bit only!)
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
40 bcf STATUS,C
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
41 rrcf divA+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
42 rrcf divA
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
43 decfsz divB
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
44 bra div16
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
45 return
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
46
552
44e9b961f156 Compute ppO2 for pSCR diving
heinrichsweikamp
parents: 544
diff changeset
47 sub32: ;xC:4=xC:4-sub_c:4 (Warning: sub_c+3 trashes sub_a+0!)
44e9b961f156 Compute ppO2 for pSCR diving
heinrichsweikamp
parents: 544
diff changeset
48 movf sub_c+0, W
44e9b961f156 Compute ppO2 for pSCR diving
heinrichsweikamp
parents: 544
diff changeset
49 subwf xC+0, F
44e9b961f156 Compute ppO2 for pSCR diving
heinrichsweikamp
parents: 544
diff changeset
50
44e9b961f156 Compute ppO2 for pSCR diving
heinrichsweikamp
parents: 544
diff changeset
51 movf sub_c+1, W
44e9b961f156 Compute ppO2 for pSCR diving
heinrichsweikamp
parents: 544
diff changeset
52 BTFSS STATUS, C
44e9b961f156 Compute ppO2 for pSCR diving
heinrichsweikamp
parents: 544
diff changeset
53 incfsz sub_c+1, W
44e9b961f156 Compute ppO2 for pSCR diving
heinrichsweikamp
parents: 544
diff changeset
54 subwf xC+1, F
44e9b961f156 Compute ppO2 for pSCR diving
heinrichsweikamp
parents: 544
diff changeset
55
44e9b961f156 Compute ppO2 for pSCR diving
heinrichsweikamp
parents: 544
diff changeset
56 movf sub_c+2, W
44e9b961f156 Compute ppO2 for pSCR diving
heinrichsweikamp
parents: 544
diff changeset
57 BTFSS STATUS, C
44e9b961f156 Compute ppO2 for pSCR diving
heinrichsweikamp
parents: 544
diff changeset
58 incfsz sub_c+2, W
44e9b961f156 Compute ppO2 for pSCR diving
heinrichsweikamp
parents: 544
diff changeset
59 subwf xC+2, F
44e9b961f156 Compute ppO2 for pSCR diving
heinrichsweikamp
parents: 544
diff changeset
60
44e9b961f156 Compute ppO2 for pSCR diving
heinrichsweikamp
parents: 544
diff changeset
61 movf sub_c+3, W
44e9b961f156 Compute ppO2 for pSCR diving
heinrichsweikamp
parents: 544
diff changeset
62 BTFSS STATUS, C
44e9b961f156 Compute ppO2 for pSCR diving
heinrichsweikamp
parents: 544
diff changeset
63 incfsz sub_c+3, W
44e9b961f156 Compute ppO2 for pSCR diving
heinrichsweikamp
parents: 544
diff changeset
64 subwf xC+3, F
44e9b961f156 Compute ppO2 for pSCR diving
heinrichsweikamp
parents: 544
diff changeset
65 return
44e9b961f156 Compute ppO2 for pSCR diving
heinrichsweikamp
parents: 544
diff changeset
66
544
56da3e962e98 show start of dive in internal logbook
heinrichsweikamp
parents: 476
diff changeset
67 sub16: ; sub_c = sub_a - sub_b (with signed values)
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
68 bcf neg_flag
74
a1ccb92b59cd 1.72beta release
heinrichsweikamp
parents: 0
diff changeset
69 movf sub_b+0, W ; Get Value to be subtracted
a1ccb92b59cd 1.72beta release
heinrichsweikamp
parents: 0
diff changeset
70 subwf sub_a+0, W ; Do the High Byte
a1ccb92b59cd 1.72beta release
heinrichsweikamp
parents: 0
diff changeset
71 movwf sub_c+0
a1ccb92b59cd 1.72beta release
heinrichsweikamp
parents: 0
diff changeset
72 movf sub_b+1, W ; Get the Value to be Subbed
a1ccb92b59cd 1.72beta release
heinrichsweikamp
parents: 0
diff changeset
73 subwfb sub_a+1, W
a1ccb92b59cd 1.72beta release
heinrichsweikamp
parents: 0
diff changeset
74 movwf sub_c+1
342
06299199dfb9 Fix bad max depth value (fix sub16 to avoid trashing sub_b).
JeanDo
parents: 161
diff changeset
75
354
cec312042b94 Fix sub16 neg detect (related to bug #44)
JeanDo
parents: 342
diff changeset
76 btfss STATUS,N ; Negativ result ?
cec312042b94 Fix sub16 neg detect (related to bug #44)
JeanDo
parents: 342
diff changeset
77 return ; NO: result positive done.
342
06299199dfb9 Fix bad max depth value (fix sub16 to avoid trashing sub_b).
JeanDo
parents: 161
diff changeset
78
354
cec312042b94 Fix sub16 neg detect (related to bug #44)
JeanDo
parents: 342
diff changeset
79 bsf neg_flag ; MARK result negative
342
06299199dfb9 Fix bad max depth value (fix sub16 to avoid trashing sub_b).
JeanDo
parents: 161
diff changeset
80
06299199dfb9 Fix bad max depth value (fix sub16 to avoid trashing sub_b).
JeanDo
parents: 161
diff changeset
81 comf sub_c+1 ; 16bit sign change.
06299199dfb9 Fix bad max depth value (fix sub16 to avoid trashing sub_b).
JeanDo
parents: 161
diff changeset
82 negf sub_c+0
06299199dfb9 Fix bad max depth value (fix sub16 to avoid trashing sub_b).
JeanDo
parents: 161
diff changeset
83 btfsc STATUS,C ; Carry to propagate ?
06299199dfb9 Fix bad max depth value (fix sub16 to avoid trashing sub_b).
JeanDo
parents: 161
diff changeset
84 incf sub_c+1,F ; YES: do it.
06299199dfb9 Fix bad max depth value (fix sub16 to avoid trashing sub_b).
JeanDo
parents: 161
diff changeset
85
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
86 return
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
87
544
56da3e962e98 show start of dive in internal logbook
heinrichsweikamp
parents: 476
diff changeset
88 subU16: ; sub_c = sub_a - sub_b (with UNSIGNED values)
426
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
89 bcf neg_flag
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
90 movf sub_b+0, W ; Get Value to be subtracted
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
91 subwf sub_a+0, W ; Do the High Byte
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
92 movwf sub_c+0
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
93 movf sub_b+1, W ; Get the Value to be Subbed
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
94 subwfb sub_a+1, W
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
95 movwf sub_c+1
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
96
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
97 btfsc STATUS,C ; Borrow to propagate ? (B == /CARRY)
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
98 return ; NO: result positive done.
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
99
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
100 bsf neg_flag ; MARK result negative
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
101
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
102 comf sub_c+1 ; 16bit sign change.
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
103 negf sub_c+0
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
104 btfsc STATUS,C ; Carry to propagate ?
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
105 incf sub_c+1,F ; YES: do it.
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
106
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
107 return
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
108
476
7779bfa89171 Cave bailout prediction.
JeanDo
parents: 426
diff changeset
109 ;=============================================================================
7779bfa89171 Cave bailout prediction.
JeanDo
parents: 426
diff changeset
110
105
64109f6fb3d1 added END to GasSetup, small fixes
heinrichsweikamp
parents: 88
diff changeset
111 mult16x16: ;xA*xB=xC
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
112 clrf xC+2 ; Clear the High-Order Bits
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
113 clrf xC+3
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
114 movf xA, w ; Do the "L" Multiplication first
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
115 mulwf xB
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
116 movf PRODL, w ; Save result
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
117 movwf xC
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
118 movf PRODH, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
119 movwf xC+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
120 movf xA, w ; Do the "I" Multiplication
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
121 mulwf xB+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
122 movf PRODL, w ; Save the Most Significant Byte First
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
123 addwf xC+1, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
124 movf PRODH, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
125 addwfc xC+2, f ; Add to the Last Result
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
126 movf xA+1, w ; Do the "O" Multiplication
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
127 mulwf xB
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
128 movf PRODL, w ; Add the Lower Byte Next
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
129 addwf xC+1, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
130 movf PRODH, w ; Add the High Byte First
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
131 addwfc xC+2, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
132 btfsc STATUS, C ; Add the Carry
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
133 incf xC+3, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
134 movf xA+1, w ; Do the "F" Multiplication
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
135 mulwf xB+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
136 movf PRODL, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
137 addwf xC+2, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
138 movf PRODH, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
139 addwfc xC+3, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
140 return
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
141
476
7779bfa89171 Cave bailout prediction.
JeanDo
parents: 426
diff changeset
142 ;=============================================================================
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
143
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
144 div16x16: ;xA/xB=xC with xA as remainder
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
145 ;uses divB as temp variable
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
146 clrf xC+0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
147 clrf xC+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
148 MOVF xB+0,W ; Check for zero
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
149 IORWF xB+1,W ;
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
150 BTFSC STATUS,Z ; Check for zero
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
151 RETLW H'FF' ; return 0xFF if illegal
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
152 MOVLW 1 ; Start count at 1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
153 MOVWF divB ; Clear Count
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
154 div16x16_1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
155 BTFSC xB+1,7 ; High bit set ?
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
156 bra div16x16_2 ; Yes then continue
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
157 INCF divB,F ; Increment count
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
158
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
159 bcf STATUS,C
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
160 rlcf xB+0,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
161 rlcf xB+1,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
162 bra div16x16_1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
163 div16x16_2:
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
164 ; Shift result left
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
165 bcf STATUS,C
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
166 rlcf xC+0,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
167 rlcf xC+1,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
168
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
169 ; Reduce Divisor
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
170
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
171 MOVF xB,W ; Get low byte of subtrahend
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
172 SUBWF xA,F ; Subtract DST(low) - SRC(low)
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
173 MOVF xB+1,W ; Now get high byte of subtrahend
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
174 BTFSS STATUS,C ; If there was a borrow, rather than
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
175 INCF xB+1,W ; decrement high byte of dst we inc src
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
176 SUBWF xA+1,F ; Subtract the high byte and we're done
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
177
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
178
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
179 BTFSC STATUS, C ; Did it reduce?
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
180 bra div16x16_3 ; No, so it was less than
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
181
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
182 movf xB+0,W ; Reverse subtraction
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
183 addwf xA+0,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
184 movf xB+1,W
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
185 addwfc xA+1,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
186
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
187 bra div16x16_4 ; Continue the process
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
188 div16x16_3:
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
189 BSF xC+0,0 ; Yes it did, this gets a 1 bit
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
190 div16x16_4:
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
191 DECF divB,F ; Decrement N_COUNT
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
192 BTFSC STATUS,Z ; If its not zero then continue
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
193 return
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
194
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
195 bcf STATUS,C
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
196 rrcf xB+1,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
197 rrcf xB+0,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
198
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
199 bra div16x16_2 ; Next bit.
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
200
476
7779bfa89171 Cave bailout prediction.
JeanDo
parents: 426
diff changeset
201 ;=============================================================================
7779bfa89171 Cave bailout prediction.
JeanDo
parents: 426
diff changeset
202
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
203 div32x16: ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
204 ; Setup
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
205 movlw .32 ; setup shift counter
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
206 movwf divB
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
207 movf xC+3,W ; move ACCb to ACCf
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
208 movwf xA+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
209 movf xC+2,W
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
210 movwf xA+0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
211 movf xC+1,W ; move ACCc to ACCe
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
212 movwf sub_a+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
213 movf xC+0,W
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
214 movwf sub_a+0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
215 clrf xC+3
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
216 clrf xC+2
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
217 clrf xC+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
218 clrf xC+0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
219 clrf sub_b+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
220 clrf sub_b+0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
221 div32x16_2
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
222 bcf STATUS,C
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
223 rlcf sub_a+0,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
224 rlcf sub_a+1,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
225 rlcf xA+0,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
226 rlcf xA+1,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
227 rlcf sub_b+0,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
228 rlcf sub_b+1,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
229 movf xB+1,W
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
230 subwf sub_b+1,W ; check if a>d
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
231 btfss STATUS,Z
476
7779bfa89171 Cave bailout prediction.
JeanDo
parents: 426
diff changeset
232 bra div32x16_3
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
233 movf xB+0,W
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
234 subwf sub_b+0,W ; if msb equal then check lsb
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
235 div32x16_3
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
236 btfss STATUS,C ; carry set if d>a
476
7779bfa89171 Cave bailout prediction.
JeanDo
parents: 426
diff changeset
237 bra div32x16_4
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
238 movf xB+0,W ; d-a into d
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
239 subwf sub_b+0,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
240 btfss STATUS,C
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
241 decf sub_b+1,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
242 movf xB+1,W
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
243 subwf sub_b+1,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
244 bsf STATUS,C ; shift a 1 into b (result)
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
245 div32x16_4
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
246 rlcf xC+0,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
247 rlcf xC+1,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
248 rlcf xC+2,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
249 rlcf xC+3,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
250 decfsz divB,F ; loop until all bits checked
476
7779bfa89171 Cave bailout prediction.
JeanDo
parents: 426
diff changeset
251 bra div32x16_2
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
252 return
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
253
161
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
254 ;=============================================================================
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
255 ; u16 * u16 --> 32bit multiply (xA * xB --> xC)
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
256 ; Used in interupt service routines, to compute temperature and pressure.
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
257 ;
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
258 isr_mult16x16:
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
259 clrf isr_xC+2 ; Clear the High-Order Bits
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
260 clrf isr_xC+3
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
261 movf isr_xA, w ; Do the "L" Multiplication first
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
262 mulwf isr_xB
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
263 movf PRODL, w ; Save result
161
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
264 movwf isr_xC+0
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
265 movf PRODH, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
266 movwf isr_xC+1
161
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
267 movf isr_xA+0, w ; Do the "I" Multiplication
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
268 mulwf isr_xB+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
269 movf PRODL, w ; Save the Most Significant Byte First
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
270 addwf isr_xC+1, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
271 movf PRODH, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
272 addwfc isr_xC+2, f ; Add to the Last Result
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
273 movf isr_xA+1, w ; Do the "O" Multiplication
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
274 mulwf isr_xB
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
275 movf PRODL, w ; Add the Lower Byte Next
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
276 addwf isr_xC+1, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
277 movf PRODH, w ; Add the High Byte First
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
278 addwfc isr_xC+2, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
279 btfsc STATUS, C ; Add the Carry
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
280 incf isr_xC+3, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
281 movf isr_xA+1, w ; Do the "F" Multiplication
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
282 mulwf isr_xB+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
283 movf PRODL, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
284 addwf isr_xC+2, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
285 movf PRODH, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
286 addwfc isr_xC+3, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
287 return
161
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
288
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
289 ;=============================================================================
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
290 ; 24bit shift, repeted WREG times.
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
291 ; Because we shift less than 8bits, and keep only C[2:1], we don't care what
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
292 ; bit is inserted...
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
293 ;
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
294 isr_shift_C31:
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
295 rrcf isr_xC+3,F ; Shift the three bytes...
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
296 rrcf isr_xC+2,F
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
297 rrcf isr_xC+1,F
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
298 decfsz WREG
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
299 bra isr_shift_C31
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
300 return
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
301
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
302 ;=============================================================================
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
303 ; s16 * s16 --> 32bit multiply (xA * xB --> xC)
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
304 ; Signed multiplication.
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
305 ; Code from... the Pic18F documentation ;-)
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
306 isr_unsigned_mult16x16:
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
307 MOVF isr_xA+0, W ; Lowest is simply a[0] * b[0]
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
308 MULWF isr_xB+0
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
309 MOVFF PRODL, isr_xC+0
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
310 MOVFF PRODH, isr_xC+1
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
311 ;
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
312 MOVF isr_xA+1, W ; And highest a[1] * b[1]
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
313 MULWF isr_xB+1
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
314 MOVFF PRODL, isr_xC+2
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
315 MOVFF PRODH, isr_xC+3
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
316 ;
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
317 MOVF isr_xA+0, W ; Intermediates do propagate:
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
318 MULWF isr_xB+1
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
319 MOVF PRODL, W
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
320 ADDWF isr_xC+1, F ; Add cross products
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
321 MOVF PRODH, W
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
322 ADDWFC isr_xC+2, F ; with propagated carry
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
323 CLRF WREG
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
324 ADDWFC isr_xC+3, F ; on the three bytes.
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
325 ;
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
326 MOVF isr_xA+1, W ; And the second one, similarly.
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
327 MULWF isr_xB+0
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
328 MOVF PRODL, W
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
329 ADDWF isr_xC+1, F ; Add cross products
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
330 MOVF PRODH, W
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
331 ADDWFC isr_xC+2, F
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
332 CLRF WREG
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
333 ADDWFC isr_xC+3, F
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
334 return
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
335
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
336 isr_signed_mult16x16:
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
337 rcall isr_unsigned_mult16x16
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
338
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
339 ; Manage sign extension of operand B
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
340 BTFSS isr_xB+1,7 ; Is B negatif ?
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
341 BRA isr_signed_mult_checkA ; No: check ARG1
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
342 MOVF isr_xA+0, W ; Yes: add -65536 * A
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
343 SUBWF isr_xC+2, F
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
344 MOVF isr_xA+1, W
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
345 SUBWFB isr_xC+3, F
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
346 ; And of operand A
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
347 isr_signed_mult_checkA
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
348 BTFSS isr_xA+1, 7 ; Is A negatif ?
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
349 RETURN ; No: done
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
350 MOVF isr_xB+0, W
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
351 SUBWF isr_xC+2, F
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
352 MOVF isr_xB+1, W
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
353 SUBWFB isr_xC+3, F
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
354 RETURN