annotate code_part1/OSTC_code_asm_part1/math.asm @ 70:8d8e753d72e3

1.72beta - small output fix in non-GF modes
author heinrichsweikamp
date Wed, 20 Oct 2010 19:43:11 +0200
parents 96a35aeda5f2
children a1ccb92b59cd
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
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
19 ; written by: Matthias Heinrichs, info@heinrichsweikamp.com
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
20 ; written: 10/30/05
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
21 ; last updated: 06/21/07
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
22 ; known bugs:
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
23 ; ToDo: clean up!
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
24
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
25 convert_time: ; converts hi:lo in minutes to hours (hi) and minutes (lo)
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
26 movff lo,xA+0 ; divide by 60...
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
27 movff hi,xA+1 ;
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
28 movlw d'60' ;
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
29 movwf xB+0 ;
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
30 clrf xB+1 ;
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
31 rcall div16x16 ; xA/xB=xC with xA as remainder
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
32 movff xC+0,hi ; Hours
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
33 movff xA+0,lo ; =remaining minutes (0.....59)
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
34 return
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
35
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
36 div16:
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
37 ; divA=divA/2^divB (divB: 8Bit only!)
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
38 bcf STATUS,C
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
39 rrcf divA+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
40 rrcf divA
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
41 decfsz divB
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
42 bra div16
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
43 return
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
44
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
45 div32:
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
46 ; xC=xC(32Bit)/2^divB (divB: 8Bit only!)
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
47 bcf STATUS,C
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
48 rrcf xC+3
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
49 rrcf xC+2
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
50 rrcf xC+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
51 rrcf xC+0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
52 decfsz divB
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
53 bra div32
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
54 return
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
55
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
56 invert_xC:
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
57 movf xC+1, w ; inverses xC+0:xC+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
58 sublw 0xFF
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
59 movwf xC+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
60 movf xC+0, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
61 bcf STATUS,C
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
62 sublw 0xFF
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
63 movwf xC+0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
64 return
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
65
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
66
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
67 sub16:
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
68 ; sub_c = sub_a - sub_b
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
69 bcf neg_flag
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
70 movf sub_b+0, w ; Get Value to be subtracted
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
71 subwf sub_a+0, w ; Do the High Byte
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
72 movwf sub_c+0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
73 movf sub_b+1, w ; Get the Value to be Subbed
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
74 subwfb sub_a+1, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
75 movwf sub_c+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
76 btfss STATUS,N
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
77 return ; result positve
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
78 ; sub_c = sub_a - sub_b
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
79 bsf neg_flag ; result negative
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
80 movff sub_c+0,sub_b+0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
81 movff sub_c+1,sub_b+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
82 setf sub_a
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
83 setf sub_a+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
84 movf sub_b+0, w ; Get Value to be subtracted
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
85 subwf sub_a+0, w ; Do the High Byte
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
86 movwf sub_c+0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
87 movf sub_b+1, w ; Get the Value to be Subbed
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
88 subwfb sub_a+1, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
89 movwf sub_c+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
90 return
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
91
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
92
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
93 mult16x16:
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
94 ;xA*xB=xC
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
95 clrf xC+2 ; Clear the High-Order Bits
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
96 clrf xC+3
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
97 movf xA, w ; Do the "L" Multiplication first
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
98 mulwf xB
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
99 movf PRODL, w ; Save result
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
100 movwf xC
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
101 movf PRODH, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
102 movwf xC+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
103 movf xA, w ; Do the "I" Multiplication
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
104 mulwf xB+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
105 movf PRODL, w ; Save the Most Significant Byte First
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
106 addwf xC+1, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
107 movf PRODH, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
108 addwfc xC+2, f ; Add to the Last Result
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
109 movf xA+1, w ; Do the "O" Multiplication
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
110 mulwf xB
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
111 movf PRODL, w ; Add the Lower Byte Next
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
112 addwf xC+1, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
113 movf PRODH, w ; Add the High Byte First
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
114 addwfc xC+2, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
115 btfsc STATUS, C ; Add the Carry
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
116 incf xC+3, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
117 movf xA+1, w ; Do the "F" Multiplication
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
118 mulwf xB+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
119 movf PRODL, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
120 addwf xC+2, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
121 movf PRODH, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
122 addwfc xC+3, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
123 return
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
124
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
125
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
126 div16x16: ;xA/xB=xC with xA as remainder
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
127 ;uses divB as temp variable
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
128 clrf xC+0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
129 clrf xC+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
130 MOVF xB+0,W ; Check for zero
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
131 IORWF xB+1,W ;
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
132 BTFSC STATUS,Z ; Check for zero
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
133 RETLW H'FF' ; return 0xFF if illegal
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
134 MOVLW 1 ; Start count at 1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
135 MOVWF divB ; Clear Count
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
136 div16x16_1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
137 BTFSC xB+1,7 ; High bit set ?
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
138 bra div16x16_2 ; Yes then continue
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
139 INCF divB,F ; Increment count
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
140
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
141 bcf STATUS,C
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
142 rlcf xB+0,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
143 rlcf xB+1,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
144 bra div16x16_1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
145 div16x16_2:
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
146 ; Shift result left
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
147 bcf STATUS,C
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
148 rlcf xC+0,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
149 rlcf xC+1,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
150
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
151 ; Reduce Divisor
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
152
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
153 MOVF xB,W ; Get low byte of subtrahend
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
154 SUBWF xA,F ; Subtract DST(low) - SRC(low)
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
155 MOVF xB+1,W ; Now get high byte of subtrahend
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
156 BTFSS STATUS,C ; If there was a borrow, rather than
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
157 INCF xB+1,W ; decrement high byte of dst we inc src
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
158 SUBWF xA+1,F ; Subtract the high byte and we're done
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
159
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
160
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
161 BTFSC STATUS, C ; Did it reduce?
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
162 bra div16x16_3 ; No, so it was less than
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
163
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
164 movf xB+0,W ; Reverse subtraction
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
165 addwf xA+0,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
166 movf xB+1,W
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
167 addwfc xA+1,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
168
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
169 bra div16x16_4 ; Continue the process
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
170 div16x16_3:
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
171 BSF xC+0,0 ; Yes it did, this gets a 1 bit
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
172 div16x16_4:
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
173 DECF divB,F ; Decrement N_COUNT
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
174 BTFSC STATUS,Z ; If its not zero then continue
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
175 return
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
176
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
177 bcf STATUS,C
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
178 rrcf xB+1,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
179 rrcf xB+0,F
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
180
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
181 bra div16x16_2 ; Next bit.
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
182
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
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
212 goto div32x16_3
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
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
217 goto div32x16_4
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
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
231 goto div32x16_2
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
232 return
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
233
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
234
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
235 isr_div16:
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
236 ; divA=divA/2^divB (divB: 8Bit only!)
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
237 bcf STATUS,C
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
238 rrcf isr_divA+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
239 rrcf isr_divA
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
240 decfsz isr_divB
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
241 bra isr_div16
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
242 return
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
243
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
244 isr_div32:
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
245 ; xC=xC(32Bit)/2^divB (divB: 8Bit only!)
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
246 bcf STATUS,C
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
247 rrcf isr_xC+3
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
248 rrcf isr_xC+2
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
249 rrcf isr_xC+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
250 rrcf isr_xC+0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
251 decfsz isr_divB
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
252 bra isr_div32
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
253 return
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
254
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
255 isr_invert_xC:
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
256 movf isr_xC+1, w ; inverses xC+0:xC+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
257 sublw 0xFF
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
258 movwf isr_xC+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
259 movf isr_xC+0, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
260 bcf STATUS,C
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
261 sublw 0xFF
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
262 movwf isr_xC+0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
263 return
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
264
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
265
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
266 isr_sub16:
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
267 ; sub_c = sub_a - sub_b
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
268 bcf neg_flag_isr
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
269 movf isr_sub_b+0, w ; Get Value to be subtracted
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
270 subwf isr_sub_a+0, w ; Do the High Byte
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
271 movwf isr_sub_c+0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
272 movf isr_sub_b+1, w ; Get the Value to be Subbed
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
273 subwfb isr_sub_a+1, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
274 movwf isr_sub_c+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
275 btfss STATUS,N
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
276 return ; result positve
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
277 ; sub_c = sub_a - sub_b
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
278 bsf neg_flag_isr ; result negative
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
279 movff isr_sub_c+0,isr_sub_b+0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
280 movff isr_sub_c+1,isr_sub_b+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
281 setf isr_sub_a
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
282 setf isr_sub_a+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
283 movf isr_sub_b+0, w ; Get Value to be subtracted
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
284 subwf isr_sub_a+0, w ; Do the High Byte
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
285 movwf isr_sub_c+0
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
286 movf isr_sub_b+1, w ; Get the Value to be Subbed
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
287 subwfb isr_sub_a+1, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
288 movwf isr_sub_c+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
289 return
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
290
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
291
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
292 isr_mult16x16:
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
293 ;xA*xB=xC
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
294 clrf isr_xC+2 ; Clear the High-Order Bits
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
295 clrf isr_xC+3
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
296 movf isr_xA, w ; Do the "L" Multiplication first
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
297 mulwf isr_xB
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
298 movf PRODL, w ; Save result
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
299 movwf isr_xC
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
300 movf PRODH, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
301 movwf isr_xC+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
302 movf isr_xA, w ; Do the "I" Multiplication
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
303 mulwf isr_xB+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
304 movf PRODL, w ; Save the Most Significant Byte First
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
305 addwf isr_xC+1, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
306 movf PRODH, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
307 addwfc isr_xC+2, f ; Add to the Last Result
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
308 movf isr_xA+1, w ; Do the "O" Multiplication
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
309 mulwf isr_xB
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
310 movf PRODL, w ; Add the Lower Byte Next
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
311 addwf isr_xC+1, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
312 movf PRODH, w ; Add the High Byte First
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
313 addwfc isr_xC+2, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
314 btfsc STATUS, C ; Add the Carry
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
315 incf isr_xC+3, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
316 movf isr_xA+1, w ; Do the "F" Multiplication
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
317 mulwf isr_xB+1
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
318 movf PRODL, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
319 addwf isr_xC+2, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
320 movf PRODH, w
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
321 addwfc isr_xC+3, f
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
322 return
96a35aeda5f2 Initial setup
heinrichsweikamp
parents:
diff changeset
323