annotate code_part1/OSTC_code_asm_part1/math.asm @ 842:454ef5c2e6aa default tip

Bugfix: Auto-SP did not show >9m for some 2C hardware versions in German language firmware Make year settings until 2040 possible (This is likely the final release for this model)
author heinrichsweikamp
date Sat, 29 Nov 2025 14:11:07 +0100
parents 2a0e5d884fc3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
815
2a0e5d884fc3 BUGFIX: Fix licence in German
heinrichsweikamp
parents: 807
diff changeset
1 ; OSTC Mk.2, 2N and 2C - diving computer code
807
c50296c3059e BUGFIX: Divetime had unwanted "." behind the minutes
heinrichsweikamp
parents: 577
diff changeset
2 ; Copyright (C) 2015 HeinrichsWeikamp GbR
0
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
544
56da3e962e98 show start of dive in internal logbook
heinrichsweikamp
parents: 476
diff changeset
47 sub16: ; sub_c = sub_a - sub_b (with signed values)
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
48 bcf neg_flag
74
a1ccb92b59cd 1.72beta release
heinrichsweikamp
parents: 0
diff changeset
49 movf sub_b+0, W ; Get Value to be subtracted
a1ccb92b59cd 1.72beta release
heinrichsweikamp
parents: 0
diff changeset
50 subwf sub_a+0, W ; Do the High Byte
a1ccb92b59cd 1.72beta release
heinrichsweikamp
parents: 0
diff changeset
51 movwf sub_c+0
a1ccb92b59cd 1.72beta release
heinrichsweikamp
parents: 0
diff changeset
52 movf sub_b+1, W ; Get the Value to be Subbed
a1ccb92b59cd 1.72beta release
heinrichsweikamp
parents: 0
diff changeset
53 subwfb sub_a+1, W
a1ccb92b59cd 1.72beta release
heinrichsweikamp
parents: 0
diff changeset
54 movwf sub_c+1
342
06299199dfb9 Fix bad max depth value (fix sub16 to avoid trashing sub_b).
JeanDo
parents: 161
diff changeset
55
354
cec312042b94 Fix sub16 neg detect (related to bug #44)
JeanDo
parents: 342
diff changeset
56 btfss STATUS,N ; Negativ result ?
cec312042b94 Fix sub16 neg detect (related to bug #44)
JeanDo
parents: 342
diff changeset
57 return ; NO: result positive done.
342
06299199dfb9 Fix bad max depth value (fix sub16 to avoid trashing sub_b).
JeanDo
parents: 161
diff changeset
58
354
cec312042b94 Fix sub16 neg detect (related to bug #44)
JeanDo
parents: 342
diff changeset
59 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
60
06299199dfb9 Fix bad max depth value (fix sub16 to avoid trashing sub_b).
JeanDo
parents: 161
diff changeset
61 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
62 negf sub_c+0
06299199dfb9 Fix bad max depth value (fix sub16 to avoid trashing sub_b).
JeanDo
parents: 161
diff changeset
63 btfsc STATUS,C ; Carry to propagate ?
06299199dfb9 Fix bad max depth value (fix sub16 to avoid trashing sub_b).
JeanDo
parents: 161
diff changeset
64 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
65
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
66 return
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
67
544
56da3e962e98 show start of dive in internal logbook
heinrichsweikamp
parents: 476
diff changeset
68 subU16: ; sub_c = sub_a - sub_b (with UNSIGNED values)
426
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
69 bcf neg_flag
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
70 movf sub_b+0, W ; Get Value to be subtracted
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
71 subwf sub_a+0, W ; Do the High Byte
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
72 movwf sub_c+0
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
73 movf sub_b+1, W ; Get the Value to be Subbed
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
74 subwfb sub_a+1, W
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
75 movwf sub_c+1
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
76
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
77 btfsc STATUS,C ; Borrow to propagate ? (B == /CARRY)
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
78 return ; NO: result positive done.
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
79
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
80 bsf neg_flag ; MARK result negative
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
81
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
82 comf sub_c+1 ; 16bit sign change.
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
83 negf sub_c+0
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
84 btfsc STATUS,C ; Carry to propagate ?
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
85 incf sub_c+1,F ; YES: do it.
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
86
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
87 return
07f5b0baaa57 Adding temperature & ceiling curves
JeanDo
parents: 354
diff changeset
88
476
7779bfa89171 Cave bailout prediction.
JeanDo
parents: 426
diff changeset
89 ;=============================================================================
7779bfa89171 Cave bailout prediction.
JeanDo
parents: 426
diff changeset
90
105
64109f6fb3d1 added END to GasSetup, small fixes
heinrichsweikamp
parents: 88
diff changeset
91 mult16x16: ;xA*xB=xC
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
92 clrf xC+2 ; Clear the High-Order Bits
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
93 clrf xC+3
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
94 movf xA, w ; Do the "L" Multiplication first
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
95 mulwf xB
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
96 movf PRODL, w ; Save result
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
97 movwf xC
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
98 movf PRODH, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
99 movwf xC+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
100 movf xA, w ; Do the "I" Multiplication
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
101 mulwf xB+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
102 movf PRODL, w ; Save the Most Significant Byte First
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
103 addwf xC+1, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
104 movf PRODH, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
105 addwfc xC+2, f ; Add to the Last Result
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
106 movf xA+1, w ; Do the "O" Multiplication
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
107 mulwf xB
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
108 movf PRODL, w ; Add the Lower Byte Next
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
109 addwf xC+1, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
110 movf PRODH, w ; Add the High Byte First
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
111 addwfc xC+2, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
112 btfsc STATUS, C ; Add the Carry
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
113 incf xC+3, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
114 movf xA+1, w ; Do the "F" Multiplication
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
115 mulwf xB+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
116 movf PRODL, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
117 addwf xC+2, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
118 movf PRODH, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
119 addwfc xC+3, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
120 return
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
121
476
7779bfa89171 Cave bailout prediction.
JeanDo
parents: 426
diff changeset
122 ;=============================================================================
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
123
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
124 div16x16: ;xA/xB=xC with xA as remainder
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
125 ;uses divB as temp variable
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
126 clrf xC+0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
127 clrf xC+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
128 MOVF xB+0,W ; Check for zero
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
129 IORWF xB+1,W ;
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
130 BTFSC STATUS,Z ; Check for zero
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
131 RETLW H'FF' ; return 0xFF if illegal
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
132 MOVLW 1 ; Start count at 1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
133 MOVWF divB ; Clear Count
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
134 div16x16_1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
135 BTFSC xB+1,7 ; High bit set ?
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
136 bra div16x16_2 ; Yes then continue
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
137 INCF divB,F ; Increment count
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
138
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
139 bcf STATUS,C
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
140 rlcf xB+0,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
141 rlcf xB+1,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
142 bra div16x16_1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
143 div16x16_2:
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
144 ; Shift result left
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
145 bcf STATUS,C
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
146 rlcf xC+0,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
147 rlcf xC+1,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
148
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
149 ; Reduce Divisor
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
150
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
151 MOVF xB,W ; Get low byte of subtrahend
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
152 SUBWF xA,F ; Subtract DST(low) - SRC(low)
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
153 MOVF xB+1,W ; Now get high byte of subtrahend
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
154 BTFSS STATUS,C ; If there was a borrow, rather than
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
155 INCF xB+1,W ; decrement high byte of dst we inc src
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
156 SUBWF xA+1,F ; Subtract the high byte and we're done
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
157
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
158
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
159 BTFSC STATUS, C ; Did it reduce?
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
160 bra div16x16_3 ; No, so it was less than
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
161
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
162 movf xB+0,W ; Reverse subtraction
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
163 addwf xA+0,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
164 movf xB+1,W
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
165 addwfc xA+1,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
166
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
167 bra div16x16_4 ; Continue the process
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
168 div16x16_3:
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
169 BSF xC+0,0 ; Yes it did, this gets a 1 bit
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
170 div16x16_4:
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
171 DECF divB,F ; Decrement N_COUNT
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
172 BTFSC STATUS,Z ; If its not zero then continue
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
173 return
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
174
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
175 bcf STATUS,C
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
176 rrcf xB+1,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
177 rrcf xB+0,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
178
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
179 bra div16x16_2 ; Next bit.
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
180
476
7779bfa89171 Cave bailout prediction.
JeanDo
parents: 426
diff changeset
181 ;=============================================================================
7779bfa89171 Cave bailout prediction.
JeanDo
parents: 426
diff changeset
182
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
183 div32x16: ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
184 ; Setup
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
185 movlw .32 ; setup shift counter
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
186 movwf divB
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
187 movf xC+3,W ; move ACCb to ACCf
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
188 movwf xA+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
189 movf xC+2,W
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
190 movwf xA+0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
191 movf xC+1,W ; move ACCc to ACCe
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
192 movwf sub_a+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
193 movf xC+0,W
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
194 movwf sub_a+0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
195 clrf xC+3
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
196 clrf xC+2
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
197 clrf xC+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
198 clrf xC+0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
199 clrf sub_b+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
200 clrf sub_b+0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
201 div32x16_2
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
202 bcf STATUS,C
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
203 rlcf sub_a+0,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
204 rlcf sub_a+1,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
205 rlcf xA+0,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
206 rlcf xA+1,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
207 rlcf sub_b+0,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
208 rlcf sub_b+1,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
209 movf xB+1,W
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
210 subwf sub_b+1,W ; check if a>d
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
211 btfss STATUS,Z
476
7779bfa89171 Cave bailout prediction.
JeanDo
parents: 426
diff changeset
212 bra div32x16_3
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
213 movf xB+0,W
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
214 subwf sub_b+0,W ; if msb equal then check lsb
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
215 div32x16_3
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
216 btfss STATUS,C ; carry set if d>a
476
7779bfa89171 Cave bailout prediction.
JeanDo
parents: 426
diff changeset
217 bra div32x16_4
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
218 movf xB+0,W ; d-a into d
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
219 subwf sub_b+0,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
220 btfss STATUS,C
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
221 decf sub_b+1,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
222 movf xB+1,W
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
223 subwf sub_b+1,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
224 bsf STATUS,C ; shift a 1 into b (result)
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
225 div32x16_4
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
226 rlcf xC+0,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
227 rlcf xC+1,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
228 rlcf xC+2,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
229 rlcf xC+3,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
230 decfsz divB,F ; loop until all bits checked
476
7779bfa89171 Cave bailout prediction.
JeanDo
parents: 426
diff changeset
231 bra div32x16_2
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
232 return
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
233
161
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
234 ;=============================================================================
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
235 ; u16 * u16 --> 32bit multiply (xA * xB --> xC)
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
236 ; Used in interupt service routines, to compute temperature and pressure.
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
237 ;
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
238 isr_mult16x16:
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
239 clrf isr_xC+2 ; Clear the High-Order Bits
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
240 clrf isr_xC+3
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
241 movf isr_xA, w ; Do the "L" Multiplication first
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
242 mulwf isr_xB
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
243 movf PRODL, w ; Save result
161
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
244 movwf isr_xC+0
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
245 movf PRODH, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
246 movwf isr_xC+1
161
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
247 movf isr_xA+0, w ; Do the "I" Multiplication
0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
248 mulwf isr_xB+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
249 movf PRODL, w ; Save the Most Significant Byte First
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
250 addwf isr_xC+1, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
251 movf PRODH, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
252 addwfc isr_xC+2, f ; Add to the Last Result
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
253 movf isr_xA+1, w ; Do the "O" Multiplication
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
254 mulwf isr_xB
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
255 movf PRODL, w ; Add the Lower Byte Next
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
256 addwf isr_xC+1, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
257 movf PRODH, w ; Add the High Byte First
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
258 addwfc isr_xC+2, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
259 btfsc STATUS, C ; Add the Carry
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
260 incf isr_xC+3, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
261 movf isr_xA+1, w ; Do the "F" Multiplication
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
262 mulwf isr_xB+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
263 movf PRODL, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
264 addwf isr_xC+2, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
265 movf PRODH, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
266 addwfc isr_xC+3, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
267 return
161
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
268
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
269 ;=============================================================================
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
270 ; 24bit shift, repeted WREG times.
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
271 ; 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
272 ; bit is inserted...
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
273 ;
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
274 isr_shift_C31:
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
275 rrcf isr_xC+3,F ; Shift the three bytes...
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
276 rrcf isr_xC+2,F
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
277 rrcf isr_xC+1,F
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
278 decfsz WREG
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
279 bra isr_shift_C31
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
280 return
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
281
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
282 ;=============================================================================
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
283 ; s16 * s16 --> 32bit multiply (xA * xB --> xC)
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
284 ; Signed multiplication.
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
285 ; Code from... the Pic18F documentation ;-)
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
286 isr_unsigned_mult16x16:
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
287 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
288 MULWF isr_xB+0
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
289 MOVFF PRODL, isr_xC+0
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
290 MOVFF PRODH, isr_xC+1
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
291 ;
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
292 MOVF isr_xA+1, W ; And highest a[1] * b[1]
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
293 MULWF isr_xB+1
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
294 MOVFF PRODL, isr_xC+2
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
295 MOVFF PRODH, isr_xC+3
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
296 ;
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
297 MOVF isr_xA+0, W ; Intermediates do propagate:
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
298 MULWF isr_xB+1
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
299 MOVF PRODL, W
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
300 ADDWF isr_xC+1, F ; Add cross products
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
301 MOVF PRODH, W
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
302 ADDWFC isr_xC+2, F ; with propagated carry
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
303 CLRF WREG
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
304 ADDWFC isr_xC+3, F ; on the three bytes.
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
305 ;
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
306 MOVF isr_xA+1, W ; And the second one, similarly.
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
307 MULWF isr_xB+0
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
308 MOVF PRODL, W
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
309 ADDWF isr_xC+1, F ; Add cross products
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
310 MOVF PRODH, W
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
311 ADDWFC isr_xC+2, F
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
312 CLRF WREG
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
313 ADDWFC isr_xC+3, F
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
314 return
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
315
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
316 isr_signed_mult16x16:
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
317 rcall isr_unsigned_mult16x16
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
318
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
319 ; Manage sign extension of operand B
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
320 BTFSS isr_xB+1,7 ; Is B negatif ?
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
321 BRA isr_signed_mult_checkA ; No: check ARG1
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
322 MOVF isr_xA+0, W ; Yes: add -65536 * A
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
323 SUBWF isr_xC+2, F
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
324 MOVF isr_xA+1, W
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
325 SUBWFB isr_xC+3, F
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
326 ; And of operand A
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
327 isr_signed_mult_checkA
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
328 BTFSS isr_xA+1, 7 ; Is A negatif ?
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
329 RETURN ; No: done
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
330 MOVF isr_xB+0, W
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
331 SUBWF isr_xC+2, F
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
332 MOVF isr_xB+1, W
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
333 SUBWFB isr_xC+3, F
8d6aca08f66b Use signed arithmetic for pressure/temperature compensation.
JeanDo
parents: 105
diff changeset
334 RETURN