Rev 16 | Rev 19 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 1
1 .cpu cortex-m3
2 .eabi_attribute 20, 1
3 .eabi_attribute 21, 1
4 .eabi_attribute 23, 3
5 .eabi_attribute 24, 1
6 .eabi_attribute 25, 1
7 .eabi_attribute 26, 1
8 .eabi_attribute 30, 1
9 .eabi_attribute 34, 1
10 .eabi_attribute 18, 4
11 .file "nmea.c"
12 .text
13 .Ltext0:
14 .cfi_sections .debug_frame
15 .section .text.decodeDec,"ax",%progbits
16 .align 1
17 .arch armv7-m
18 .syntax unified
19 .thumb
20 .thumb_func
21 .fpu softvfp
23 decodeDec:
24 .LVL0:
25 .LFB66:
26 .file 1 "../libNMEA/src/nmea.c"
1:../libNMEA/src/nmea.c **** /*
2:../libNMEA/src/nmea.c **** * nmea.c
3:../libNMEA/src/nmea.c **** *
4:../libNMEA/src/nmea.c **** * Created on: 6 Sep 2020
5:../libNMEA/src/nmea.c **** * Author: mike
6:../libNMEA/src/nmea.c **** */
7:../libNMEA/src/nmea.c ****
8:../libNMEA/src/nmea.c **** #include <math.h>
9:../libNMEA/src/nmea.c **** #include <stdint.h>
10:../libNMEA/src/nmea.c **** #include <stdlib.h>
11:../libNMEA/src/nmea.c **** #include <memory.h>
12:../libNMEA/src/nmea.c ****
13:../libNMEA/src/nmea.c **** #include "libNMEA/nmea.h"
14:../libNMEA/src/nmea.c ****
15:../libNMEA/src/nmea.c **** #include "libSerial/serial.h"
16:../libNMEA/src/nmea.c ****
17:../libNMEA/src/nmea.c **** char linebuff[80];
18:../libNMEA/src/nmea.c **** unsigned linePos = 0;
19:../libNMEA/src/nmea.c ****
20:../libNMEA/src/nmea.c **** typedef enum
21:../libNMEA/src/nmea.c **** {
22:../libNMEA/src/nmea.c **** SEARCH, READING
23:../libNMEA/src/nmea.c **** } NmeaState_t;
24:../libNMEA/src/nmea.c ****
25:../libNMEA/src/nmea.c **** NmeaState_t lineState = SEARCH;
26:../libNMEA/src/nmea.c ****
27:../libNMEA/src/nmea.c **** static bool
28:../libNMEA/src/nmea.c **** decodePacket (char *linebuff, int linePos, Location *loc);
29:../libNMEA/src/nmea.c ****
30:../libNMEA/src/nmea.c **** bool
31:../libNMEA/src/nmea.c **** updateLocation (Location *loc, usart_ctl * uc)
32:../libNMEA/src/nmea.c **** {
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 2
33:../libNMEA/src/nmea.c **** while (1)
34:../libNMEA/src/nmea.c **** {
35:../libNMEA/src/nmea.c **** if (!SerialCharsReceived (uc))
36:../libNMEA/src/nmea.c **** return false; // nothing to read, return immediately
37:../libNMEA/src/nmea.c ****
38:../libNMEA/src/nmea.c **** char c = GetCharSerial (uc);
39:../libNMEA/src/nmea.c **** switch (lineState)
40:../libNMEA/src/nmea.c **** {
41:../libNMEA/src/nmea.c **** case SEARCH:
42:../libNMEA/src/nmea.c **** if (c == '$')
43:../libNMEA/src/nmea.c **** lineState = READING;
44:../libNMEA/src/nmea.c **** linePos = 0;
45:../libNMEA/src/nmea.c **** break;
46:../libNMEA/src/nmea.c **** case READING:
47:../libNMEA/src/nmea.c **** if (c == '\r')
48:../libNMEA/src/nmea.c **** {
49:../libNMEA/src/nmea.c **** // handle the read code
50:../libNMEA/src/nmea.c **** bool success = decodePacket (linebuff, linePos, loc);
51:../libNMEA/src/nmea.c **** lineState = SEARCH;
52:../libNMEA/src/nmea.c ****
53:../libNMEA/src/nmea.c **** linePos = 0;
54:../libNMEA/src/nmea.c **** return success;
55:../libNMEA/src/nmea.c **** }
56:../libNMEA/src/nmea.c **** if (linePos < sizeof(linebuff))
57:../libNMEA/src/nmea.c **** linebuff[linePos++] = c;
58:../libNMEA/src/nmea.c **** else
59:../libNMEA/src/nmea.c **** {
60:../libNMEA/src/nmea.c **** lineState = SEARCH;
61:../libNMEA/src/nmea.c **** // search for the $ in any unread string
62:../libNMEA/src/nmea.c **** int i;
63:../libNMEA/src/nmea.c ****
64:../libNMEA/src/nmea.c **** for (i = 0; i < linePos; i++)
65:../libNMEA/src/nmea.c **** if (linebuff[i] == '$')
66:../libNMEA/src/nmea.c **** {
67:../libNMEA/src/nmea.c **** int n = i+1;
68:../libNMEA/src/nmea.c **** memcpy (linebuff, linebuff + n, linePos - i);
69:../libNMEA/src/nmea.c **** linePos = linePos - i;
70:../libNMEA/src/nmea.c **** linebuff[linePos++] = c;
71:../libNMEA/src/nmea.c **** lineState = READING;
72:../libNMEA/src/nmea.c **** }
73:../libNMEA/src/nmea.c ****
74:../libNMEA/src/nmea.c **** if (lineState == SEARCH)
75:../libNMEA/src/nmea.c **** linePos = 0;
76:../libNMEA/src/nmea.c **** }
77:../libNMEA/src/nmea.c **** break;
78:../libNMEA/src/nmea.c **** }
79:../libNMEA/src/nmea.c **** }
80:../libNMEA/src/nmea.c **** return 0;
81:../libNMEA/src/nmea.c **** }
82:../libNMEA/src/nmea.c ****
83:../libNMEA/src/nmea.c ****
84:../libNMEA/src/nmea.c **** static int8_t decodeDec(char c)
85:../libNMEA/src/nmea.c **** {
27 .loc 1 85 1 view -0
28 .cfi_startproc
29 @ args = 0, pretend = 0, frame = 0
30 @ frame_needed = 0, uses_anonymous_args = 0
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 3
31 @ link register save eliminated.
86:../libNMEA/src/nmea.c **** if (c>'9' && c<'0')
32 .loc 1 86 3 view .LVU1
87:../libNMEA/src/nmea.c **** return -1;
88:../libNMEA/src/nmea.c **** return c-'0';
33 .loc 1 88 3 view .LVU2
34 .loc 1 88 11 is_stmt 0 view .LVU3
35 0000 3038 subs r0, r0, #48
36 .LVL1:
89:../libNMEA/src/nmea.c **** }
37 .loc 1 89 1 view .LVU4
38 0002 40B2 sxtb r0, r0
39 0004 7047 bx lr
40 .cfi_endproc
41 .LFE66:
43 .section .text.decodeHex,"ax",%progbits
44 .align 1
45 .syntax unified
46 .thumb
47 .thumb_func
48 .fpu softvfp
50 decodeHex:
51 .LVL2:
52 .LFB67:
90:../libNMEA/src/nmea.c ****
91:../libNMEA/src/nmea.c **** static uint8_t
92:../libNMEA/src/nmea.c **** decodeHex (char c)
93:../libNMEA/src/nmea.c **** {
53 .loc 1 93 1 is_stmt 1 view -0
54 .cfi_startproc
55 @ args = 0, pretend = 0, frame = 0
56 @ frame_needed = 0, uses_anonymous_args = 0
57 .loc 1 93 1 is_stmt 0 view .LVU6
58 0000 10B5 push {r4, lr}
59 .LCFI0:
60 .cfi_def_cfa_offset 8
61 .cfi_offset 4, -8
62 .cfi_offset 14, -4
63 0002 0446 mov r4, r0
94:../libNMEA/src/nmea.c **** int8_t v = decodeDec(c);
64 .loc 1 94 3 is_stmt 1 view .LVU7
65 .loc 1 94 14 is_stmt 0 view .LVU8
66 0004 FFF7FEFF bl decodeDec
67 .LVL3:
95:../libNMEA/src/nmea.c **** if(v>=0)
68 .loc 1 95 3 is_stmt 1 view .LVU9
69 .loc 1 95 5 is_stmt 0 view .LVU10
70 0008 0028 cmp r0, #0
71 .LVL4:
72 .loc 1 95 5 view .LVU11
73 000a 0DDA bge .L9
96:../libNMEA/src/nmea.c **** return v;
97:../libNMEA/src/nmea.c **** c = tolower (c);
74 .loc 1 97 3 is_stmt 1 view .LVU12
75 .LBB2:
76 .loc 1 97 7 view .LVU13
77 .LVL5:
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 4
78 .loc 1 97 7 view .LVU14
79 000c 0A4B ldr r3, .L12
80 000e E35C ldrb r3, [r4, r3] @ zero_extendqisi2
81 0010 03F00303 and r3, r3, #3
82 0014 012B cmp r3, #1
83 0016 09D0 beq .L10
84 .LVL6:
85 .L6:
86 .loc 1 97 7 is_stmt 0 view .LVU15
87 .LBE2:
88 .loc 1 97 5 discriminator 4 view .LVU16
89 0018 E4B2 uxtb r4, r4
90 .LVL7:
98:../libNMEA/src/nmea.c **** if (c >= 'a' && c <= 'f')
91 .loc 1 98 3 is_stmt 1 discriminator 4 view .LVU17
92 .loc 1 98 16 is_stmt 0 discriminator 4 view .LVU18
93 001a A4F16103 sub r3, r4, #97
94 001e DBB2 uxtb r3, r3
95 .loc 1 98 6 discriminator 4 view .LVU19
96 0020 052B cmp r3, #5
97 0022 05D9 bls .L11
99:../libNMEA/src/nmea.c **** return c - 'a' + 10;
100:../libNMEA/src/nmea.c **** return 0;
98 .loc 1 100 10 view .LVU20
99 0024 0020 movs r0, #0
100 0026 00E0 b .L4
101 .LVL8:
102 .L9:
96:../libNMEA/src/nmea.c **** c = tolower (c);
103 .loc 1 96 5 is_stmt 1 view .LVU21
96:../libNMEA/src/nmea.c **** c = tolower (c);
104 .loc 1 96 12 is_stmt 0 view .LVU22
105 0028 C0B2 uxtb r0, r0
106 .LVL9:
107 .L4:
101:../libNMEA/src/nmea.c **** }
108 .loc 1 101 1 view .LVU23
109 002a 10BD pop {r4, pc}
110 .LVL10:
111 .L10:
112 .LBB3:
97:../libNMEA/src/nmea.c **** if (c >= 'a' && c <= 'f')
113 .loc 1 97 7 discriminator 1 view .LVU24
114 002c 2034 adds r4, r4, #32
115 .LVL11:
97:../libNMEA/src/nmea.c **** if (c >= 'a' && c <= 'f')
116 .loc 1 97 7 discriminator 1 view .LVU25
117 002e F3E7 b .L6
118 .LVL12:
119 .L11:
97:../libNMEA/src/nmea.c **** if (c >= 'a' && c <= 'f')
120 .loc 1 97 7 discriminator 1 view .LVU26
121 .LBE3:
99:../libNMEA/src/nmea.c **** return 0;
122 .loc 1 99 5 is_stmt 1 view .LVU27
99:../libNMEA/src/nmea.c **** return 0;
123 .loc 1 99 20 is_stmt 0 view .LVU28
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 5
124 0030 573C subs r4, r4, #87
125 .LVL13:
99:../libNMEA/src/nmea.c **** return 0;
126 .loc 1 99 20 view .LVU29
127 0032 E0B2 uxtb r0, r4
128 0034 F9E7 b .L4
129 .L13:
130 0036 00BF .align 2
131 .L12:
132 0038 01000000 .word _ctype_+1
133 .cfi_endproc
134 .LFE67:
136 .global __aeabi_i2f
137 .global __aeabi_fmul
138 .global __aeabi_fadd
139 .global __aeabi_fsub
140 .global __aeabi_f2d
141 .global __aeabi_dcmplt
142 .global __aeabi_fdiv
143 .section .text.decodeLL,"ax",%progbits
144 .align 1
145 .syntax unified
146 .thumb
147 .thumb_func
148 .fpu softvfp
150 decodeLL:
151 .LVL14:
152 .LFB68:
102:../libNMEA/src/nmea.c ****
103:../libNMEA/src/nmea.c **** // lat/long decoder
104:../libNMEA/src/nmea.c **** static float
105:../libNMEA/src/nmea.c **** decodeLL (char *ptr, int msDigitWeight)
106:../libNMEA/src/nmea.c **** {
153 .loc 1 106 1 is_stmt 1 view -0
154 .cfi_startproc
155 @ args = 0, pretend = 0, frame = 0
156 @ frame_needed = 0, uses_anonymous_args = 0
157 .loc 1 106 1 is_stmt 0 view .LVU31
158 0000 F8B5 push {r3, r4, r5, r6, r7, lr}
159 .LCFI1:
160 .cfi_def_cfa_offset 24
161 .cfi_offset 3, -24
162 .cfi_offset 4, -20
163 .cfi_offset 5, -16
164 .cfi_offset 6, -12
165 .cfi_offset 7, -8
166 .cfi_offset 14, -4
167 0002 0746 mov r7, r0
107:../libNMEA/src/nmea.c **** float digitWeight = msDigitWeight;
168 .loc 1 107 3 is_stmt 1 view .LVU32
169 .loc 1 107 9 is_stmt 0 view .LVU33
170 0004 0846 mov r0, r1
171 .LVL15:
172 .loc 1 107 9 view .LVU34
173 0006 FFF7FEFF bl __aeabi_i2f
174 .LVL16:
175 .loc 1 107 9 view .LVU35
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 6
176 000a 0446 mov r4, r0
177 .LVL17:
108:../libNMEA/src/nmea.c **** float result = 0;
178 .loc 1 108 3 is_stmt 1 view .LVU36
109:../libNMEA/src/nmea.c **** int i = 0;
179 .loc 1 109 3 view .LVU37
180 .loc 1 109 7 is_stmt 0 view .LVU38
181 000c 0023 movs r3, #0
108:../libNMEA/src/nmea.c **** float result = 0;
182 .loc 1 108 9 view .LVU39
183 000e 0025 movs r5, #0
184 0010 1EE0 b .L15
185 .LVL18:
186 .L21:
187 .LBB4:
110:../libNMEA/src/nmea.c **** while (1)
111:../libNMEA/src/nmea.c **** {
112:../libNMEA/src/nmea.c **** char c = ptr[i++];
113:../libNMEA/src/nmea.c **** if (c == '.')
114:../libNMEA/src/nmea.c **** continue;
115:../libNMEA/src/nmea.c **** int8_t v = decodeDec(c);
116:../libNMEA/src/nmea.c **** if (v>0)
117:../libNMEA/src/nmea.c **** {
118:../libNMEA/src/nmea.c **** result += digitWeight * v;
188 .loc 1 118 4 is_stmt 1 view .LVU40
189 .loc 1 118 26 is_stmt 0 view .LVU41
190 0012 FFF7FEFF bl __aeabi_i2f
191 .LVL19:
192 0016 2146 mov r1, r4
193 0018 FFF7FEFF bl __aeabi_fmul
194 .LVL20:
195 .loc 1 118 11 view .LVU42
196 001c 0146 mov r1, r0
197 001e 2846 mov r0, r5
198 0020 FFF7FEFF bl __aeabi_fadd
199 .LVL21:
200 0024 0546 mov r5, r0
201 .LVL22:
119:../libNMEA/src/nmea.c **** if (fabs (digitWeight - 1) < 0.01)
202 .loc 1 119 4 is_stmt 1 view .LVU43
203 .loc 1 119 26 is_stmt 0 view .LVU44
204 0026 4FF07E51 mov r1, #1065353216
205 002a 2046 mov r0, r4
206 .LVL23:
207 .loc 1 119 26 view .LVU45
208 002c FFF7FEFF bl __aeabi_fsub
209 .LVL24:
210 .loc 1 119 8 view .LVU46
211 0030 20F00040 bic r0, r0, #-2147483648
212 0034 FFF7FEFF bl __aeabi_f2d
213 .LVL25:
214 .loc 1 119 7 view .LVU47
215 0038 0BA3 adr r3, .L22
216 003a D3E90023 ldrd r2, [r3]
217 003e FFF7FEFF bl __aeabi_dcmplt
218 .LVL26:
219 0042 78B9 cbnz r0, .L19
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 7
120:../libNMEA/src/nmea.c **** digitWeight = 1 / 6.0;
121:../libNMEA/src/nmea.c **** else
122:../libNMEA/src/nmea.c **** digitWeight = digitWeight / 10;
220 .loc 1 122 6 is_stmt 1 view .LVU48
221 .loc 1 122 18 is_stmt 0 view .LVU49
222 0044 0A49 ldr r1, .L22+8
223 0046 2046 mov r0, r4
224 0048 FFF7FEFF bl __aeabi_fdiv
225 .LVL27:
226 004c 0446 mov r4, r0
227 .LVL28:
228 .L16:
229 .loc 1 122 18 view .LVU50
230 .LBE4:
106:../libNMEA/src/nmea.c **** float digitWeight = msDigitWeight;
231 .loc 1 106 1 view .LVU51
232 004e 3346 mov r3, r6
233 .LVL29:
234 .L15:
110:../libNMEA/src/nmea.c **** {
235 .loc 1 110 3 is_stmt 1 view .LVU52
236 .LBB5:
112:../libNMEA/src/nmea.c **** if (c == '.')
237 .loc 1 112 7 view .LVU53
112:../libNMEA/src/nmea.c **** if (c == '.')
238 .loc 1 112 21 is_stmt 0 view .LVU54
239 0050 5E1C adds r6, r3, #1
240 .LVL30:
112:../libNMEA/src/nmea.c **** if (c == '.')
241 .loc 1 112 12 view .LVU55
242 0052 F85C ldrb r0, [r7, r3] @ zero_extendqisi2
243 .LVL31:
113:../libNMEA/src/nmea.c **** continue;
244 .loc 1 113 7 is_stmt 1 view .LVU56
113:../libNMEA/src/nmea.c **** continue;
245 .loc 1 113 10 is_stmt 0 view .LVU57
246 0054 2E28 cmp r0, #46
247 0056 FAD0 beq .L16
115:../libNMEA/src/nmea.c **** if (v>0)
248 .loc 1 115 7 is_stmt 1 view .LVU58
115:../libNMEA/src/nmea.c **** if (v>0)
249 .loc 1 115 18 is_stmt 0 view .LVU59
250 0058 FFF7FEFF bl decodeDec
251 .LVL32:
116:../libNMEA/src/nmea.c **** {
252 .loc 1 116 7 is_stmt 1 view .LVU60
116:../libNMEA/src/nmea.c **** {
253 .loc 1 116 10 is_stmt 0 view .LVU61
254 005c 0028 cmp r0, #0
255 .LVL33:
116:../libNMEA/src/nmea.c **** {
256 .loc 1 116 10 view .LVU62
257 005e D8DC bgt .L21
258 .LBE5:
123:../libNMEA/src/nmea.c ****
124:../libNMEA/src/nmea.c **** continue;
125:../libNMEA/src/nmea.c **** }
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 8
126:../libNMEA/src/nmea.c **** break;
127:../libNMEA/src/nmea.c **** }
128:../libNMEA/src/nmea.c ****
129:../libNMEA/src/nmea.c **** return result;
130:../libNMEA/src/nmea.c ****
131:../libNMEA/src/nmea.c **** }
259 .loc 1 131 1 view .LVU63
260 0060 2846 mov r0, r5
261 0062 F8BD pop {r3, r4, r5, r6, r7, pc}
262 .LVL34:
263 .L19:
264 .LBB6:
120:../libNMEA/src/nmea.c **** else
265 .loc 1 120 18 view .LVU64
266 0064 034C ldr r4, .L22+12
267 .LVL35:
124:../libNMEA/src/nmea.c **** }
268 .loc 1 124 4 is_stmt 1 view .LVU65
269 0066 F2E7 b .L16
270 .L23:
271 .align 3
272 .L22:
273 0068 7B14AE47 .word 1202590843
274 006c E17A843F .word 1065646817
275 0070 00002041 .word 1092616192
276 0074 ABAA2A3E .word 1042983595
277 .LBE6:
278 .cfi_endproc
279 .LFE68:
281 .section .text.decodeDecimal,"ax",%progbits
282 .align 1
283 .syntax unified
284 .thumb
285 .thumb_func
286 .fpu softvfp
288 decodeDecimal:
289 .LVL36:
290 .LFB70:
132:../libNMEA/src/nmea.c ****
133:../libNMEA/src/nmea.c **** static float
134:../libNMEA/src/nmea.c **** decodeFP (char *ptr)
135:../libNMEA/src/nmea.c **** {
136:../libNMEA/src/nmea.c **** return strtof (ptr, NULL);
137:../libNMEA/src/nmea.c **** }
138:../libNMEA/src/nmea.c ****
139:../libNMEA/src/nmea.c **** static int decodeDecimal(char * ptr)
140:../libNMEA/src/nmea.c **** {
291 .loc 1 140 1 view -0
292 .cfi_startproc
293 @ args = 0, pretend = 0, frame = 0
294 @ frame_needed = 0, uses_anonymous_args = 0
295 .loc 1 140 1 is_stmt 0 view .LVU67
296 0000 70B5 push {r4, r5, r6, lr}
297 .LCFI2:
298 .cfi_def_cfa_offset 16
299 .cfi_offset 4, -16
300 .cfi_offset 5, -12
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 9
301 .cfi_offset 6, -8
302 .cfi_offset 14, -4
303 0002 0646 mov r6, r0
141:../libNMEA/src/nmea.c **** int i;
304 .loc 1 141 5 is_stmt 1 view .LVU68
142:../libNMEA/src/nmea.c **** int res=0;
305 .loc 1 142 5 view .LVU69
306 .LVL37:
143:../libNMEA/src/nmea.c **** int const width =2 ;
307 .loc 1 143 5 view .LVU70
144:../libNMEA/src/nmea.c **** for(i=0; i< width; i++)
308 .loc 1 144 5 view .LVU71
142:../libNMEA/src/nmea.c **** int res=0;
309 .loc 1 142 9 is_stmt 0 view .LVU72
310 0004 0024 movs r4, #0
311 .loc 1 144 10 view .LVU73
312 0006 2546 mov r5, r4
313 .LVL38:
314 .L25:
315 .loc 1 144 5 discriminator 1 view .LVU74
316 0008 012D cmp r5, #1
317 000a 0BDC bgt .L24
318 .LBB7:
145:../libNMEA/src/nmea.c **** {
146:../libNMEA/src/nmea.c **** int8_t v = decodeDec(*ptr);
319 .loc 1 146 2 is_stmt 1 view .LVU75
320 .loc 1 146 13 is_stmt 0 view .LVU76
321 000c 3078 ldrb r0, [r6] @ zero_extendqisi2
322 000e FFF7FEFF bl decodeDec
323 .LVL39:
147:../libNMEA/src/nmea.c **** if(v<0) return 0;
324 .loc 1 147 2 is_stmt 1 view .LVU77
325 .loc 1 147 4 is_stmt 0 view .LVU78
326 0012 0028 cmp r0, #0
327 .LVL40:
328 .loc 1 147 4 view .LVU79
329 0014 05DB blt .L28
148:../libNMEA/src/nmea.c **** res *=10;
330 .loc 1 148 2 is_stmt 1 discriminator 2 view .LVU80
331 .loc 1 148 6 is_stmt 0 discriminator 2 view .LVU81
332 0016 04EB8404 add r4, r4, r4, lsl #2
333 .LVL41:
334 .loc 1 148 6 discriminator 2 view .LVU82
335 001a 6300 lsls r3, r4, #1
336 .LVL42:
149:../libNMEA/src/nmea.c **** res +=v;
337 .loc 1 149 2 is_stmt 1 discriminator 2 view .LVU83
338 .loc 1 149 6 is_stmt 0 discriminator 2 view .LVU84
339 001c C418 adds r4, r0, r3
340 .LVL43:
341 .loc 1 149 6 discriminator 2 view .LVU85
342 .LBE7:
144:../libNMEA/src/nmea.c **** {
343 .loc 1 144 25 discriminator 2 view .LVU86
344 001e 0135 adds r5, r5, #1
345 .LVL44:
144:../libNMEA/src/nmea.c **** {
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 10
346 .loc 1 144 25 discriminator 2 view .LVU87
347 0020 F2E7 b .L25
348 .L28:
349 .LBB8:
147:../libNMEA/src/nmea.c **** res *=10;
350 .loc 1 147 17 view .LVU88
351 0022 0024 movs r4, #0
352 .LVL45:
353 .L24:
147:../libNMEA/src/nmea.c **** res *=10;
354 .loc 1 147 17 view .LVU89
355 .LBE8:
150:../libNMEA/src/nmea.c **** }
151:../libNMEA/src/nmea.c **** return res;
152:../libNMEA/src/nmea.c **** }
356 .loc 1 152 1 view .LVU90
357 0024 2046 mov r0, r4
358 0026 70BD pop {r4, r5, r6, pc}
359 .loc 1 152 1 view .LVU91
360 .cfi_endproc
361 .LFE70:
363 .section .text.decodeFP,"ax",%progbits
364 .align 1
365 .syntax unified
366 .thumb
367 .thumb_func
368 .fpu softvfp
370 decodeFP:
371 .LVL46:
372 .LFB69:
135:../libNMEA/src/nmea.c **** return strtof (ptr, NULL);
373 .loc 1 135 1 is_stmt 1 view -0
374 .cfi_startproc
375 @ args = 0, pretend = 0, frame = 0
376 @ frame_needed = 0, uses_anonymous_args = 0
135:../libNMEA/src/nmea.c **** return strtof (ptr, NULL);
377 .loc 1 135 1 is_stmt 0 view .LVU93
378 0000 08B5 push {r3, lr}
379 .LCFI3:
380 .cfi_def_cfa_offset 8
381 .cfi_offset 3, -8
382 .cfi_offset 14, -4
136:../libNMEA/src/nmea.c **** }
383 .loc 1 136 3 is_stmt 1 view .LVU94
136:../libNMEA/src/nmea.c **** }
384 .loc 1 136 10 is_stmt 0 view .LVU95
385 0002 0021 movs r1, #0
386 0004 FFF7FEFF bl strtof
387 .LVL47:
137:../libNMEA/src/nmea.c ****
388 .loc 1 137 1 view .LVU96
389 0008 08BD pop {r3, pc}
390 .cfi_endproc
391 .LFE69:
393 .section .text.decodePacket,"ax",%progbits
394 .align 1
395 .syntax unified
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 11
396 .thumb
397 .thumb_func
398 .fpu softvfp
400 decodePacket:
401 .LVL48:
402 .LFB71:
153:../libNMEA/src/nmea.c ****
154:../libNMEA/src/nmea.c **** bool
155:../libNMEA/src/nmea.c **** decodePacket (char *linebuff, int linePos, Location *loc)
156:../libNMEA/src/nmea.c **** {
403 .loc 1 156 1 is_stmt 1 view -0
404 .cfi_startproc
405 @ args = 0, pretend = 0, frame = 80
406 @ frame_needed = 0, uses_anonymous_args = 0
407 .loc 1 156 1 is_stmt 0 view .LVU98
408 0000 2DE9F043 push {r4, r5, r6, r7, r8, r9, lr}
409 .LCFI4:
410 .cfi_def_cfa_offset 28
411 .cfi_offset 4, -28
412 .cfi_offset 5, -24
413 .cfi_offset 6, -20
414 .cfi_offset 7, -16
415 .cfi_offset 8, -12
416 .cfi_offset 9, -8
417 .cfi_offset 14, -4
418 0004 95B0 sub sp, sp, #84
419 .LCFI5:
420 .cfi_def_cfa_offset 112
421 0006 0646 mov r6, r0
422 0008 0F46 mov r7, r1
423 000a 9046 mov r8, r2
157:../libNMEA/src/nmea.c **** uint8_t checksum = 0;
424 .loc 1 157 3 is_stmt 1 view .LVU99
425 .LVL49:
158:../libNMEA/src/nmea.c **** for (int i = 0; i < linePos - 3; i++)
426 .loc 1 158 3 view .LVU100
427 .LBB9:
428 .loc 1 158 8 view .LVU101
429 .loc 1 158 12 is_stmt 0 view .LVU102
430 000c 0023 movs r3, #0
431 .LBE9:
157:../libNMEA/src/nmea.c **** uint8_t checksum = 0;
432 .loc 1 157 11 view .LVU103
433 000e 1D46 mov r5, r3
434 .LVL50:
435 .L33:
436 .LBB10:
437 .loc 1 158 31 discriminator 1 view .LVU104
438 0010 FC1E subs r4, r7, #3
439 .loc 1 158 3 discriminator 1 view .LVU105
440 0012 9C42 cmp r4, r3
441 0014 03DD ble .L45
159:../libNMEA/src/nmea.c **** checksum ^= linebuff[i];
442 .loc 1 159 5 is_stmt 1 discriminator 3 view .LVU106
443 .loc 1 159 25 is_stmt 0 discriminator 3 view .LVU107
444 0016 F25C ldrb r2, [r6, r3] @ zero_extendqisi2
445 .loc 1 159 14 discriminator 3 view .LVU108
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 12
446 0018 5540 eors r5, r5, r2
447 .LVL51:
158:../libNMEA/src/nmea.c **** for (int i = 0; i < linePos - 3; i++)
448 .loc 1 158 37 discriminator 3 view .LVU109
449 001a 0133 adds r3, r3, #1
450 .LVL52:
158:../libNMEA/src/nmea.c **** for (int i = 0; i < linePos - 3; i++)
451 .loc 1 158 37 discriminator 3 view .LVU110
452 001c F8E7 b .L33
453 .L45:
158:../libNMEA/src/nmea.c **** for (int i = 0; i < linePos - 3; i++)
454 .loc 1 158 37 discriminator 3 view .LVU111
455 .LBE10:
160:../libNMEA/src/nmea.c **** uint8_t givenSum = (decodeHex (linebuff[linePos - 2]) << 4)
456 .loc 1 160 3 is_stmt 1 view .LVU112
457 .loc 1 160 42 is_stmt 0 view .LVU113
458 001e BB1E subs r3, r7, #2
459 .LVL53:
460 .loc 1 160 23 view .LVU114
461 0020 F05C ldrb r0, [r6, r3] @ zero_extendqisi2
462 .LVL54:
463 .loc 1 160 23 view .LVU115
464 0022 FFF7FEFF bl decodeHex
465 .LVL55:
466 .loc 1 160 57 view .LVU116
467 0026 0001 lsls r0, r0, #4
468 0028 5FFA80F9 uxtb r9, r0
161:../libNMEA/src/nmea.c **** + decodeHex (linebuff[linePos - 1]);
469 .loc 1 161 28 view .LVU117
470 002c 013F subs r7, r7, #1
471 .LVL56:
472 .loc 1 161 9 view .LVU118
473 002e F05D ldrb r0, [r6, r7] @ zero_extendqisi2
474 0030 FFF7FEFF bl decodeHex
475 .LVL57:
160:../libNMEA/src/nmea.c **** uint8_t givenSum = (decodeHex (linebuff[linePos - 2]) << 4)
476 .loc 1 160 11 view .LVU119
477 0034 4844 add r0, r0, r9
478 0036 C0B2 uxtb r0, r0
479 .LVL58:
162:../libNMEA/src/nmea.c **** if (givenSum != checksum)
480 .loc 1 162 3 is_stmt 1 view .LVU120
481 .loc 1 162 6 is_stmt 0 view .LVU121
482 0038 8542 cmp r5, r0
483 003a 40F08980 bne .L39
484 .LBB11:
163:../libNMEA/src/nmea.c **** return false;
164:../libNMEA/src/nmea.c ****
165:../libNMEA/src/nmea.c **** char *fieldPos[20];
166:../libNMEA/src/nmea.c **** int fieldCnt = 0;
167:../libNMEA/src/nmea.c **** // split fields
168:../libNMEA/src/nmea.c **** for (int i = 5; i < linePos - 3; i++)
485 .loc 1 168 12 view .LVU122
486 003e 0523 movs r3, #5
487 .LBE11:
166:../libNMEA/src/nmea.c **** // split fields
488 .loc 1 166 7 view .LVU123
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 13
489 0040 0021 movs r1, #0
490 0042 00E0 b .L36
491 .LVL59:
492 .L37:
493 .LBB12:
494 .loc 1 168 37 discriminator 2 view .LVU124
495 0044 0133 adds r3, r3, #1
496 .LVL60:
497 .L36:
498 .loc 1 168 3 discriminator 1 view .LVU125
499 0046 9C42 cmp r4, r3
500 0048 0BDD ble .L46
169:../libNMEA/src/nmea.c **** {
170:../libNMEA/src/nmea.c **** if (linebuff[i] == ',')
501 .loc 1 170 7 is_stmt 1 view .LVU126
502 .loc 1 170 19 is_stmt 0 view .LVU127
503 004a F25C ldrb r2, [r6, r3] @ zero_extendqisi2
504 .loc 1 170 10 view .LVU128
505 004c 2C2A cmp r2, #44
506 004e F9D1 bne .L37
171:../libNMEA/src/nmea.c **** {
172:../libNMEA/src/nmea.c **** fieldPos[fieldCnt++] = linebuff + i + 1;
507 .loc 1 172 4 is_stmt 1 view .LVU129
508 .LVL61:
509 .loc 1 172 40 is_stmt 0 view .LVU130
510 0050 5A1C adds r2, r3, #1
511 0052 3244 add r2, r2, r6
512 .loc 1 172 25 view .LVU131
513 0054 14A8 add r0, sp, #80
514 0056 00EB8100 add r0, r0, r1, lsl #2
515 005a 40F8502C str r2, [r0, #-80]
516 .loc 1 172 21 view .LVU132
517 005e 0131 adds r1, r1, #1
518 .LVL62:
519 .loc 1 172 21 view .LVU133
520 0060 F0E7 b .L37
521 .L46:
522 .loc 1 172 21 view .LVU134
523 .LBE12:
173:../libNMEA/src/nmea.c **** }
174:../libNMEA/src/nmea.c ****
175:../libNMEA/src/nmea.c **** }
176:../libNMEA/src/nmea.c ****
177:../libNMEA/src/nmea.c **** // decode RMC
178:../libNMEA/src/nmea.c **** if (linebuff[2] == 'R' && linebuff[3] == 'M' && linebuff[4] == 'C')
524 .loc 1 178 3 is_stmt 1 view .LVU135
525 .loc 1 178 15 is_stmt 0 view .LVU136
526 0062 B378 ldrb r3, [r6, #2] @ zero_extendqisi2
527 .LVL63:
528 .loc 1 178 6 view .LVU137
529 0064 522B cmp r3, #82
530 0066 01D0 beq .L47
179:../libNMEA/src/nmea.c ****
180:../libNMEA/src/nmea.c **** {
181:../libNMEA/src/nmea.c **** // decode the fields
182:../libNMEA/src/nmea.c **** loc->valid = *fieldPos[1];
183:../libNMEA/src/nmea.c **** if(loc->valid == 'A')
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 14
184:../libNMEA/src/nmea.c **** {
185:../libNMEA/src/nmea.c **** memcpy (loc->time, fieldPos[0], 6);
186:../libNMEA/src/nmea.c **** loc->lat = decodeLL (fieldPos[2], 10);
187:../libNMEA/src/nmea.c **** loc->ns = *fieldPos[3];
188:../libNMEA/src/nmea.c **** loc->lon = decodeLL (fieldPos[4], 100);
189:../libNMEA/src/nmea.c **** loc->ew = *fieldPos[5];
190:../libNMEA/src/nmea.c **** loc->speed = decodeFP (fieldPos[6]);
191:../libNMEA/src/nmea.c **** loc->heading = decodeFP (fieldPos[7]);
192:../libNMEA/src/nmea.c **** memcpy (loc->date, fieldPos[1], 6);
193:../libNMEA/src/nmea.c ****
194:../libNMEA/src/nmea.c **** loc->tv.tm_sec = decodeDecimal(&loc->time[4]);
195:../libNMEA/src/nmea.c **** loc->tv.tm_min = decodeDecimal(&loc->time[2]);
196:../libNMEA/src/nmea.c **** loc->tv.tm_hour= decodeDecimal(&loc->time[0]);
197:../libNMEA/src/nmea.c ****
198:../libNMEA/src/nmea.c **** loc->tv.tm_mday= decodeDecimal(&loc->date[0]);
199:../libNMEA/src/nmea.c **** loc->tv.tm_mon = decodeDecimal(&loc->date[2])-1;
200:../libNMEA/src/nmea.c **** loc->tv.tm_year= decodeDecimal(&loc->date[4])+100; //
201:../libNMEA/src/nmea.c ****
202:../libNMEA/src/nmea.c **** loc->tv.tm_isdst = 0;
203:../libNMEA/src/nmea.c **** loc->utc = mktime(&loc->tv);
204:../libNMEA/src/nmea.c ****
205:../libNMEA/src/nmea.c **** loc->good = true;
206:../libNMEA/src/nmea.c **** }
207:../libNMEA/src/nmea.c **** }
208:../libNMEA/src/nmea.c **** return true;
531 .loc 1 208 10 view .LVU138
532 0068 0120 movs r0, #1
533 006a 72E0 b .L35
534 .L47:
178:../libNMEA/src/nmea.c ****
535 .loc 1 178 37 discriminator 1 view .LVU139
536 006c F378 ldrb r3, [r6, #3] @ zero_extendqisi2
178:../libNMEA/src/nmea.c ****
537 .loc 1 178 26 discriminator 1 view .LVU140
538 006e 4D2B cmp r3, #77
539 0070 01D0 beq .L48
540 .loc 1 208 10 view .LVU141
541 0072 0120 movs r0, #1
542 0074 6DE0 b .L35
543 .L48:
178:../libNMEA/src/nmea.c ****
544 .loc 1 178 59 discriminator 2 view .LVU142
545 0076 3379 ldrb r3, [r6, #4] @ zero_extendqisi2
178:../libNMEA/src/nmea.c ****
546 .loc 1 178 48 discriminator 2 view .LVU143
547 0078 432B cmp r3, #67
548 007a 01D0 beq .L49
549 .loc 1 208 10 view .LVU144
550 007c 0120 movs r0, #1
551 007e 68E0 b .L35
552 .L49:
182:../libNMEA/src/nmea.c **** if(loc->valid == 'A')
553 .loc 1 182 7 is_stmt 1 view .LVU145
182:../libNMEA/src/nmea.c **** if(loc->valid == 'A')
554 .loc 1 182 29 is_stmt 0 view .LVU146
555 0080 019C ldr r4, [sp, #4]
556 .LVL64:
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 15
182:../libNMEA/src/nmea.c **** if(loc->valid == 'A')
557 .loc 1 182 20 view .LVU147
558 0082 2378 ldrb r3, [r4] @ zero_extendqisi2
182:../libNMEA/src/nmea.c **** if(loc->valid == 'A')
559 .loc 1 182 18 view .LVU148
560 0084 88F80030 strb r3, [r8]
183:../libNMEA/src/nmea.c **** {
561 .loc 1 183 7 is_stmt 1 view .LVU149
183:../libNMEA/src/nmea.c **** {
562 .loc 1 183 9 is_stmt 0 view .LVU150
563 0088 412B cmp r3, #65
564 008a 01D0 beq .L50
565 .loc 1 208 10 view .LVU151
566 008c 0120 movs r0, #1
567 008e 60E0 b .L35
568 .L50:
185:../libNMEA/src/nmea.c **** loc->lat = decodeLL (fieldPos[2], 10);
569 .loc 1 185 7 is_stmt 1 view .LVU152
185:../libNMEA/src/nmea.c **** loc->lat = decodeLL (fieldPos[2], 10);
570 .loc 1 185 18 is_stmt 0 view .LVU153
571 0090 08F10106 add r6, r8, #1
572 .LVL65:
185:../libNMEA/src/nmea.c **** loc->lat = decodeLL (fieldPos[2], 10);
573 .loc 1 185 34 view .LVU154
574 0094 009B ldr r3, [sp]
185:../libNMEA/src/nmea.c **** loc->lat = decodeLL (fieldPos[2], 10);
575 .loc 1 185 7 view .LVU155
576 0096 1A68 ldr r2, [r3] @ unaligned
577 0098 C8F80120 str r2, [r8, #1] @ unaligned
578 009c 9B88 ldrh r3, [r3, #4] @ unaligned
579 009e A8F80530 strh r3, [r8, #5] @ unaligned
186:../libNMEA/src/nmea.c **** loc->ns = *fieldPos[3];
580 .loc 1 186 7 is_stmt 1 view .LVU156
186:../libNMEA/src/nmea.c **** loc->ns = *fieldPos[3];
581 .loc 1 186 18 is_stmt 0 view .LVU157
582 00a2 0A21 movs r1, #10
583 .LVL66:
186:../libNMEA/src/nmea.c **** loc->ns = *fieldPos[3];
584 .loc 1 186 18 view .LVU158
585 00a4 0298 ldr r0, [sp, #8]
586 00a6 FFF7FEFF bl decodeLL
587 .LVL67:
186:../libNMEA/src/nmea.c **** loc->ns = *fieldPos[3];
588 .loc 1 186 16 view .LVU159
589 00aa C8F81400 str r0, [r8, #20] @ float
187:../libNMEA/src/nmea.c **** loc->lon = decodeLL (fieldPos[4], 100);
590 .loc 1 187 7 is_stmt 1 view .LVU160
187:../libNMEA/src/nmea.c **** loc->lon = decodeLL (fieldPos[4], 100);
591 .loc 1 187 26 is_stmt 0 view .LVU161
592 00ae 039B ldr r3, [sp, #12]
187:../libNMEA/src/nmea.c **** loc->lon = decodeLL (fieldPos[4], 100);
593 .loc 1 187 17 view .LVU162
594 00b0 1B78 ldrb r3, [r3] @ zero_extendqisi2
187:../libNMEA/src/nmea.c **** loc->lon = decodeLL (fieldPos[4], 100);
595 .loc 1 187 15 view .LVU163
596 00b2 88F81130 strb r3, [r8, #17]
188:../libNMEA/src/nmea.c **** loc->ew = *fieldPos[5];
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 16
597 .loc 1 188 7 is_stmt 1 view .LVU164
188:../libNMEA/src/nmea.c **** loc->ew = *fieldPos[5];
598 .loc 1 188 18 is_stmt 0 view .LVU165
599 00b6 6421 movs r1, #100
600 00b8 0498 ldr r0, [sp, #16]
601 00ba FFF7FEFF bl decodeLL
602 .LVL68:
188:../libNMEA/src/nmea.c **** loc->ew = *fieldPos[5];
603 .loc 1 188 16 view .LVU166
604 00be C8F81800 str r0, [r8, #24] @ float
189:../libNMEA/src/nmea.c **** loc->speed = decodeFP (fieldPos[6]);
605 .loc 1 189 7 is_stmt 1 view .LVU167
189:../libNMEA/src/nmea.c **** loc->speed = decodeFP (fieldPos[6]);
606 .loc 1 189 26 is_stmt 0 view .LVU168
607 00c2 059B ldr r3, [sp, #20]
189:../libNMEA/src/nmea.c **** loc->speed = decodeFP (fieldPos[6]);
608 .loc 1 189 17 view .LVU169
609 00c4 1B78 ldrb r3, [r3] @ zero_extendqisi2
189:../libNMEA/src/nmea.c **** loc->speed = decodeFP (fieldPos[6]);
610 .loc 1 189 15 view .LVU170
611 00c6 88F81030 strb r3, [r8, #16]
190:../libNMEA/src/nmea.c **** loc->heading = decodeFP (fieldPos[7]);
612 .loc 1 190 7 is_stmt 1 view .LVU171
190:../libNMEA/src/nmea.c **** loc->heading = decodeFP (fieldPos[7]);
613 .loc 1 190 20 is_stmt 0 view .LVU172
614 00ca 0698 ldr r0, [sp, #24]
615 00cc FFF7FEFF bl decodeFP
616 .LVL69:
190:../libNMEA/src/nmea.c **** loc->heading = decodeFP (fieldPos[7]);
617 .loc 1 190 18 view .LVU173
618 00d0 C8F82000 str r0, [r8, #32] @ float
191:../libNMEA/src/nmea.c **** memcpy (loc->date, fieldPos[1], 6);
619 .loc 1 191 7 is_stmt 1 view .LVU174
191:../libNMEA/src/nmea.c **** memcpy (loc->date, fieldPos[1], 6);
620 .loc 1 191 22 is_stmt 0 view .LVU175
621 00d4 0798 ldr r0, [sp, #28]
622 00d6 FFF7FEFF bl decodeFP
623 .LVL70:
191:../libNMEA/src/nmea.c **** memcpy (loc->date, fieldPos[1], 6);
624 .loc 1 191 20 view .LVU176
625 00da C8F81C00 str r0, [r8, #28] @ float
192:../libNMEA/src/nmea.c ****
626 .loc 1 192 7 is_stmt 1 view .LVU177
192:../libNMEA/src/nmea.c ****
627 .loc 1 192 18 is_stmt 0 view .LVU178
628 00de 08F10705 add r5, r8, #7
629 .LVL71:
192:../libNMEA/src/nmea.c ****
630 .loc 1 192 7 view .LVU179
631 00e2 2368 ldr r3, [r4] @ unaligned
632 00e4 C8F80730 str r3, [r8, #7] @ unaligned
633 00e8 A388 ldrh r3, [r4, #4] @ unaligned
634 00ea A8F80B30 strh r3, [r8, #11] @ unaligned
194:../libNMEA/src/nmea.c **** loc->tv.tm_min = decodeDecimal(&loc->time[2]);
635 .loc 1 194 7 is_stmt 1 view .LVU180
194:../libNMEA/src/nmea.c **** loc->tv.tm_min = decodeDecimal(&loc->time[2]);
636 .loc 1 194 24 is_stmt 0 view .LVU181
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 17
637 00ee 08F10500 add r0, r8, #5
638 00f2 FFF7FEFF bl decodeDecimal
639 .LVL72:
194:../libNMEA/src/nmea.c **** loc->tv.tm_min = decodeDecimal(&loc->time[2]);
640 .loc 1 194 22 view .LVU182
641 00f6 C8F82400 str r0, [r8, #36]
195:../libNMEA/src/nmea.c **** loc->tv.tm_hour= decodeDecimal(&loc->time[0]);
642 .loc 1 195 7 is_stmt 1 view .LVU183
195:../libNMEA/src/nmea.c **** loc->tv.tm_hour= decodeDecimal(&loc->time[0]);
643 .loc 1 195 24 is_stmt 0 view .LVU184
644 00fa 08F10300 add r0, r8, #3
645 00fe FFF7FEFF bl decodeDecimal
646 .LVL73:
195:../libNMEA/src/nmea.c **** loc->tv.tm_hour= decodeDecimal(&loc->time[0]);
647 .loc 1 195 22 view .LVU185
648 0102 C8F82800 str r0, [r8, #40]
196:../libNMEA/src/nmea.c ****
649 .loc 1 196 7 is_stmt 1 view .LVU186
196:../libNMEA/src/nmea.c ****
650 .loc 1 196 24 is_stmt 0 view .LVU187
651 0106 3046 mov r0, r6
652 0108 FFF7FEFF bl decodeDecimal
653 .LVL74:
196:../libNMEA/src/nmea.c ****
654 .loc 1 196 22 view .LVU188
655 010c C8F82C00 str r0, [r8, #44]
198:../libNMEA/src/nmea.c **** loc->tv.tm_mon = decodeDecimal(&loc->date[2])-1;
656 .loc 1 198 7 is_stmt 1 view .LVU189
198:../libNMEA/src/nmea.c **** loc->tv.tm_mon = decodeDecimal(&loc->date[2])-1;
657 .loc 1 198 24 is_stmt 0 view .LVU190
658 0110 2846 mov r0, r5
659 0112 FFF7FEFF bl decodeDecimal
660 .LVL75:
198:../libNMEA/src/nmea.c **** loc->tv.tm_mon = decodeDecimal(&loc->date[2])-1;
661 .loc 1 198 22 view .LVU191
662 0116 C8F83000 str r0, [r8, #48]
199:../libNMEA/src/nmea.c **** loc->tv.tm_year= decodeDecimal(&loc->date[4])+100; //
663 .loc 1 199 7 is_stmt 1 view .LVU192
199:../libNMEA/src/nmea.c **** loc->tv.tm_year= decodeDecimal(&loc->date[4])+100; //
664 .loc 1 199 24 is_stmt 0 view .LVU193
665 011a 08F10900 add r0, r8, #9
666 011e FFF7FEFF bl decodeDecimal
667 .LVL76:
199:../libNMEA/src/nmea.c **** loc->tv.tm_year= decodeDecimal(&loc->date[4])+100; //
668 .loc 1 199 52 view .LVU194
669 0122 0138 subs r0, r0, #1
199:../libNMEA/src/nmea.c **** loc->tv.tm_year= decodeDecimal(&loc->date[4])+100; //
670 .loc 1 199 22 view .LVU195
671 0124 C8F83400 str r0, [r8, #52]
200:../libNMEA/src/nmea.c ****
672 .loc 1 200 7 is_stmt 1 view .LVU196
200:../libNMEA/src/nmea.c ****
673 .loc 1 200 24 is_stmt 0 view .LVU197
674 0128 08F10B00 add r0, r8, #11
675 012c FFF7FEFF bl decodeDecimal
676 .LVL77:
200:../libNMEA/src/nmea.c ****
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 18
677 .loc 1 200 52 view .LVU198
678 0130 6430 adds r0, r0, #100
200:../libNMEA/src/nmea.c ****
679 .loc 1 200 22 view .LVU199
680 0132 C8F83800 str r0, [r8, #56]
202:../libNMEA/src/nmea.c **** loc->utc = mktime(&loc->tv);
681 .loc 1 202 7 is_stmt 1 view .LVU200
202:../libNMEA/src/nmea.c **** loc->utc = mktime(&loc->tv);
682 .loc 1 202 24 is_stmt 0 view .LVU201
683 0136 0023 movs r3, #0
684 0138 C8F84430 str r3, [r8, #68]
203:../libNMEA/src/nmea.c ****
685 .loc 1 203 7 is_stmt 1 view .LVU202
203:../libNMEA/src/nmea.c ****
686 .loc 1 203 18 is_stmt 0 view .LVU203
687 013c 08F12400 add r0, r8, #36
688 0140 FFF7FEFF bl mktime
689 .LVL78:
203:../libNMEA/src/nmea.c ****
690 .loc 1 203 16 view .LVU204
691 0144 C8E91201 strd r0, [r8, #72]
205:../libNMEA/src/nmea.c **** }
692 .loc 1 205 8 is_stmt 1 view .LVU205
205:../libNMEA/src/nmea.c **** }
693 .loc 1 205 18 is_stmt 0 view .LVU206
694 0148 0120 movs r0, #1
695 014a 88F80F00 strb r0, [r8, #15]
696 014e 00E0 b .L35
697 .LVL79:
698 .L39:
163:../libNMEA/src/nmea.c ****
699 .loc 1 163 12 view .LVU207
700 0150 0020 movs r0, #0
701 .LVL80:
702 .L35:
209:../libNMEA/src/nmea.c **** }
703 .loc 1 209 1 view .LVU208
704 0152 15B0 add sp, sp, #84
705 .LCFI6:
706 .cfi_def_cfa_offset 28
707 @ sp needed
708 0154 BDE8F083 pop {r4, r5, r6, r7, r8, r9, pc}
709 .loc 1 209 1 view .LVU209
710 .cfi_endproc
711 .LFE71:
713 .section .text.updateLocation,"ax",%progbits
714 .align 1
715 .global updateLocation
716 .syntax unified
717 .thumb
718 .thumb_func
719 .fpu softvfp
721 updateLocation:
722 .LVL81:
723 .LFB65:
32:../libNMEA/src/nmea.c **** while (1)
724 .loc 1 32 1 is_stmt 1 view -0
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 19
725 .cfi_startproc
726 @ args = 0, pretend = 0, frame = 0
727 @ frame_needed = 0, uses_anonymous_args = 0
32:../libNMEA/src/nmea.c **** while (1)
728 .loc 1 32 1 is_stmt 0 view .LVU211
729 0000 2DE9F843 push {r3, r4, r5, r6, r7, r8, r9, lr}
730 .LCFI7:
731 .cfi_def_cfa_offset 32
732 .cfi_offset 3, -32
733 .cfi_offset 4, -28
734 .cfi_offset 5, -24
735 .cfi_offset 6, -20
736 .cfi_offset 7, -16
737 .cfi_offset 8, -12
738 .cfi_offset 9, -8
739 .cfi_offset 14, -4
740 0004 8046 mov r8, r0
741 0006 0E46 mov r6, r1
742 0008 04E0 b .L56
743 .LVL82:
744 .L54:
745 .LBB13:
42:../libNMEA/src/nmea.c **** lineState = READING;
746 .loc 1 42 4 is_stmt 1 view .LVU212
42:../libNMEA/src/nmea.c **** lineState = READING;
747 .loc 1 42 7 is_stmt 0 view .LVU213
748 000a 2428 cmp r0, #36
749 000c 1DD0 beq .L66
750 .L57:
44:../libNMEA/src/nmea.c **** break;
751 .loc 1 44 4 is_stmt 1 view .LVU214
44:../libNMEA/src/nmea.c **** break;
752 .loc 1 44 12 is_stmt 0 view .LVU215
753 000e 2C4B ldr r3, .L69
754 0010 0022 movs r2, #0
755 0012 1A60 str r2, [r3]
45:../libNMEA/src/nmea.c **** case READING:
756 .loc 1 45 4 is_stmt 1 view .LVU216
757 .LVL83:
758 .L56:
45:../libNMEA/src/nmea.c **** case READING:
759 .loc 1 45 4 is_stmt 0 view .LVU217
760 .LBE13:
33:../libNMEA/src/nmea.c **** {
761 .loc 1 33 3 is_stmt 1 view .LVU218
762 .LBB17:
35:../libNMEA/src/nmea.c **** return false; // nothing to read, return immediately
763 .loc 1 35 7 view .LVU219
35:../libNMEA/src/nmea.c **** return false; // nothing to read, return immediately
764 .loc 1 35 12 is_stmt 0 view .LVU220
765 0014 3046 mov r0, r6
766 0016 FFF7FEFF bl SerialCharsReceived
767 .LVL84:
35:../libNMEA/src/nmea.c **** return false; // nothing to read, return immediately
768 .loc 1 35 10 view .LVU221
769 001a 0028 cmp r0, #0
770 001c 4CD0 beq .L64
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 20
38:../libNMEA/src/nmea.c **** switch (lineState)
771 .loc 1 38 7 is_stmt 1 view .LVU222
38:../libNMEA/src/nmea.c **** switch (lineState)
772 .loc 1 38 16 is_stmt 0 view .LVU223
773 001e 3046 mov r0, r6
774 0020 FFF7FEFF bl GetCharSerial
775 .LVL85:
776 0024 0746 mov r7, r0
777 .LVL86:
39:../libNMEA/src/nmea.c **** {
778 .loc 1 39 7 is_stmt 1 view .LVU224
779 0026 274B ldr r3, .L69+4
780 0028 1B78 ldrb r3, [r3] @ zero_extendqisi2
781 002a 002B cmp r3, #0
782 002c EDD0 beq .L54
783 002e 012B cmp r3, #1
784 0030 F0D1 bne .L56
47:../libNMEA/src/nmea.c **** {
785 .loc 1 47 4 view .LVU225
47:../libNMEA/src/nmea.c **** {
786 .loc 1 47 7 is_stmt 0 view .LVU226
787 0032 0D28 cmp r0, #13
788 0034 0DD0 beq .L67
56:../libNMEA/src/nmea.c **** linebuff[linePos++] = c;
789 .loc 1 56 4 is_stmt 1 view .LVU227
56:../libNMEA/src/nmea.c **** linebuff[linePos++] = c;
790 .loc 1 56 16 is_stmt 0 view .LVU228
791 0036 224B ldr r3, .L69
792 0038 1B68 ldr r3, [r3]
56:../libNMEA/src/nmea.c **** linebuff[linePos++] = c;
793 .loc 1 56 7 view .LVU229
794 003a 4F2B cmp r3, #79
795 003c 14D8 bhi .L60
57:../libNMEA/src/nmea.c **** else
796 .loc 1 57 6 is_stmt 1 view .LVU230
57:../libNMEA/src/nmea.c **** else
797 .loc 1 57 22 is_stmt 0 view .LVU231
798 003e 591C adds r1, r3, #1
799 0040 1F4A ldr r2, .L69
800 0042 1160 str r1, [r2]
57:../libNMEA/src/nmea.c **** else
801 .loc 1 57 26 view .LVU232
802 0044 204A ldr r2, .L69+8
803 0046 D054 strb r0, [r2, r3]
804 0048 E4E7 b .L56
805 .L66:
43:../libNMEA/src/nmea.c **** linePos = 0;
806 .loc 1 43 6 is_stmt 1 view .LVU233
43:../libNMEA/src/nmea.c **** linePos = 0;
807 .loc 1 43 16 is_stmt 0 view .LVU234
808 004a 1E4B ldr r3, .L69+4
809 004c 0122 movs r2, #1
810 004e 1A70 strb r2, [r3]
811 0050 DDE7 b .L57
812 .L67:
813 .LBB14:
50:../libNMEA/src/nmea.c **** lineState = SEARCH;
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 21
814 .loc 1 50 8 is_stmt 1 view .LVU235
50:../libNMEA/src/nmea.c **** lineState = SEARCH;
815 .loc 1 50 23 is_stmt 0 view .LVU236
816 0052 1B4C ldr r4, .L69
817 0054 4246 mov r2, r8
818 0056 2168 ldr r1, [r4]
819 0058 1B48 ldr r0, .L69+8
820 .LVL87:
50:../libNMEA/src/nmea.c **** lineState = SEARCH;
821 .loc 1 50 23 view .LVU237
822 005a FFF7FEFF bl decodePacket
823 .LVL88:
51:../libNMEA/src/nmea.c ****
824 .loc 1 51 8 is_stmt 1 view .LVU238
51:../libNMEA/src/nmea.c ****
825 .loc 1 51 18 is_stmt 0 view .LVU239
826 005e 0023 movs r3, #0
827 0060 184A ldr r2, .L69+4
828 0062 1370 strb r3, [r2]
53:../libNMEA/src/nmea.c **** return success;
829 .loc 1 53 8 is_stmt 1 view .LVU240
53:../libNMEA/src/nmea.c **** return success;
830 .loc 1 53 16 is_stmt 0 view .LVU241
831 0064 2360 str r3, [r4]
54:../libNMEA/src/nmea.c **** }
832 .loc 1 54 8 is_stmt 1 view .LVU242
54:../libNMEA/src/nmea.c **** }
833 .loc 1 54 15 is_stmt 0 view .LVU243
834 0066 28E0 b .L53
835 .LVL89:
836 .L60:
54:../libNMEA/src/nmea.c **** }
837 .loc 1 54 15 view .LVU244
838 .LBE14:
839 .LBB15:
60:../libNMEA/src/nmea.c **** // search for the $ in any unread string
840 .loc 1 60 8 is_stmt 1 view .LVU245
60:../libNMEA/src/nmea.c **** // search for the $ in any unread string
841 .loc 1 60 18 is_stmt 0 view .LVU246
842 0068 0024 movs r4, #0
843 006a 164B ldr r3, .L69+4
844 006c 1C70 strb r4, [r3]
62:../libNMEA/src/nmea.c ****
845 .loc 1 62 8 is_stmt 1 view .LVU247
64:../libNMEA/src/nmea.c **** if (linebuff[i] == '$')
846 .loc 1 64 8 view .LVU248
847 .LVL90:
64:../libNMEA/src/nmea.c **** if (linebuff[i] == '$')
848 .loc 1 64 8 is_stmt 0 view .LVU249
849 006e 00E0 b .L61
850 .LVL91:
851 .L62:
64:../libNMEA/src/nmea.c **** if (linebuff[i] == '$')
852 .loc 1 64 34 discriminator 2 view .LVU250
853 0070 0134 adds r4, r4, #1
854 .LVL92:
855 .L61:
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 22
64:../libNMEA/src/nmea.c **** if (linebuff[i] == '$')
856 .loc 1 64 22 discriminator 1 view .LVU251
857 0072 2546 mov r5, r4
858 0074 124A ldr r2, .L69
859 0076 1368 ldr r3, [r2]
64:../libNMEA/src/nmea.c **** if (linebuff[i] == '$')
860 .loc 1 64 8 discriminator 1 view .LVU252
861 0078 9C42 cmp r4, r3
862 007a 15D2 bcs .L68
65:../libNMEA/src/nmea.c **** {
863 .loc 1 65 3 is_stmt 1 view .LVU253
65:../libNMEA/src/nmea.c **** {
864 .loc 1 65 15 is_stmt 0 view .LVU254
865 007c 124A ldr r2, .L69+8
866 007e 125D ldrb r2, [r2, r4] @ zero_extendqisi2
65:../libNMEA/src/nmea.c **** {
867 .loc 1 65 6 view .LVU255
868 0080 242A cmp r2, #36
869 0082 F5D1 bne .L62
870 .LBB16:
67:../libNMEA/src/nmea.c **** memcpy (linebuff, linebuff + n, linePos - i);
871 .loc 1 67 7 is_stmt 1 view .LVU256
67:../libNMEA/src/nmea.c **** memcpy (linebuff, linebuff + n, linePos - i);
872 .loc 1 67 11 is_stmt 0 view .LVU257
873 0084 611C adds r1, r4, #1
68:../libNMEA/src/nmea.c **** linePos = linePos - i;
874 .loc 1 68 7 is_stmt 1 view .LVU258
875 0086 5D1B subs r5, r3, r5
876 0088 DFF83C90 ldr r9, .L69+8
877 008c 2A46 mov r2, r5
878 008e 4944 add r1, r1, r9
879 0090 4846 mov r0, r9
880 0092 FFF7FEFF bl memcpy
881 .LVL93:
69:../libNMEA/src/nmea.c **** linebuff[linePos++] = c;
882 .loc 1 69 7 view .LVU259
70:../libNMEA/src/nmea.c **** lineState = READING;
883 .loc 1 70 7 view .LVU260
70:../libNMEA/src/nmea.c **** lineState = READING;
884 .loc 1 70 23 is_stmt 0 view .LVU261
885 0096 6A1C adds r2, r5, #1
886 0098 094B ldr r3, .L69
887 009a 1A60 str r2, [r3]
70:../libNMEA/src/nmea.c **** lineState = READING;
888 .loc 1 70 27 view .LVU262
889 009c 09F80570 strb r7, [r9, r5]
71:../libNMEA/src/nmea.c **** }
890 .loc 1 71 7 is_stmt 1 view .LVU263
71:../libNMEA/src/nmea.c **** }
891 .loc 1 71 17 is_stmt 0 view .LVU264
892 00a0 084B ldr r3, .L69+4
893 00a2 0122 movs r2, #1
894 00a4 1A70 strb r2, [r3]
895 00a6 E3E7 b .L62
896 .L68:
71:../libNMEA/src/nmea.c **** }
897 .loc 1 71 17 view .LVU265
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 23
898 .LBE16:
74:../libNMEA/src/nmea.c **** linePos = 0;
899 .loc 1 74 8 is_stmt 1 view .LVU266
74:../libNMEA/src/nmea.c **** linePos = 0;
900 .loc 1 74 22 is_stmt 0 view .LVU267
901 00a8 064B ldr r3, .L69+4
902 00aa 1B78 ldrb r3, [r3] @ zero_extendqisi2
74:../libNMEA/src/nmea.c **** linePos = 0;
903 .loc 1 74 11 view .LVU268
904 00ac 002B cmp r3, #0
905 00ae B1D1 bne .L56
75:../libNMEA/src/nmea.c **** }
906 .loc 1 75 3 is_stmt 1 view .LVU269
75:../libNMEA/src/nmea.c **** }
907 .loc 1 75 11 is_stmt 0 view .LVU270
908 00b0 1346 mov r3, r2
909 00b2 0022 movs r2, #0
910 00b4 1A60 str r2, [r3]
911 00b6 ADE7 b .L56
912 .LVL94:
913 .L64:
75:../libNMEA/src/nmea.c **** }
914 .loc 1 75 11 view .LVU271
915 .LBE15:
36:../libNMEA/src/nmea.c ****
916 .loc 1 36 9 view .LVU272
917 00b8 0020 movs r0, #0
918 .L53:
919 .LBE17:
81:../libNMEA/src/nmea.c ****
920 .loc 1 81 1 view .LVU273
921 00ba BDE8F883 pop {r3, r4, r5, r6, r7, r8, r9, pc}
922 .LVL95:
923 .L70:
81:../libNMEA/src/nmea.c ****
924 .loc 1 81 1 view .LVU274
925 00be 00BF .align 2
926 .L69:
927 00c0 00000000 .word .LANCHOR1
928 00c4 00000000 .word .LANCHOR0
929 00c8 00000000 .word linebuff
930 .cfi_endproc
931 .LFE65:
933 .global lineState
934 .global linePos
935 .comm linebuff,80,4
936 .section .bss.linePos,"aw",%nobits
937 .align 2
938 .set .LANCHOR1,. + 0
941 linePos:
942 0000 00000000 .space 4
943 .section .bss.lineState,"aw",%nobits
944 .set .LANCHOR0,. + 0
947 lineState:
948 0000 00 .space 1
949 .text
950 .Letext0:
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 24
951 .file 2 "c:\\users\\mike\\appdata\\roaming\\xpacks\\@gnu-mcu-eclipse\\arm-none-eabi-gcc\\8.2.1-1.7
952 .file 3 "c:\\users\\mike\\appdata\\roaming\\xpacks\\@gnu-mcu-eclipse\\arm-none-eabi-gcc\\8.2.1-1.7
953 .file 4 "c:\\users\\mike\\appdata\\roaming\\xpacks\\@gnu-mcu-eclipse\\arm-none-eabi-gcc\\8.2.1-1.7
954 .file 5 "c:\\users\\mike\\appdata\\roaming\\xpacks\\@gnu-mcu-eclipse\\arm-none-eabi-gcc\\8.2.1-1.7
955 .file 6 "c:\\users\\mike\\appdata\\roaming\\xpacks\\@gnu-mcu-eclipse\\arm-none-eabi-gcc\\8.2.1-1.7
956 .file 7 "c:\\users\\mike\\appdata\\roaming\\xpacks\\@gnu-mcu-eclipse\\arm-none-eabi-gcc\\8.2.1-1.7
957 .file 8 "c:\\users\\mike\\appdata\\roaming\\xpacks\\@gnu-mcu-eclipse\\arm-none-eabi-gcc\\8.2.1-1.7
958 .file 9 "c:\\users\\mike\\appdata\\roaming\\xpacks\\@gnu-mcu-eclipse\\arm-none-eabi-gcc\\8.2.1-1.7
959 .file 10 "c:\\users\\mike\\appdata\\roaming\\xpacks\\@gnu-mcu-eclipse\\arm-none-eabi-gcc\\8.2.1-1.
960 .file 11 "c:\\users\\mike\\appdata\\roaming\\xpacks\\@gnu-mcu-eclipse\\arm-none-eabi-gcc\\8.2.1-1.
961 .file 12 "c:\\users\\mike\\appdata\\roaming\\xpacks\\@gnu-mcu-eclipse\\arm-none-eabi-gcc\\8.2.1-1.
962 .file 13 "Drivers/CMSIS/Include/core_cm3.h"
963 .file 14 "Drivers/CMSIS/Device/ST/STM32F1xx/Include/system_stm32f1xx.h"
964 .file 15 "Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xb.h"
965 .file 16 "Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h"
966 .file 17 "Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h"
967 .file 18 "Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_spi.h"
968 .file 19 "Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_uart.h"
969 .file 20 "Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h"
970 .file 21 "Core/Inc/main.h"
971 .file 22 "../libSerial/inc/libSerial/serial.h"
972 .file 23 "../libNMEA/inc/libNMEA/nmea.h"
973 .file 24 "<built-in>"
ARM GAS C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s page 25
DEFINED SYMBOLS
*ABS*:0000000000000000 nmea.c
C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s:16 .text.decodeDec:0000000000000000 $t
C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s:23 .text.decodeDec:0000000000000000 decodeDec
C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s:44 .text.decodeHex:0000000000000000 $t
C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s:50 .text.decodeHex:0000000000000000 decodeHex
C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s:132 .text.decodeHex:0000000000000038 $d
C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s:144 .text.decodeLL:0000000000000000 $t
C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s:150 .text.decodeLL:0000000000000000 decodeLL
C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s:273 .text.decodeLL:0000000000000068 $d
C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s:282 .text.decodeDecimal:0000000000000000 $t
C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s:288 .text.decodeDecimal:0000000000000000 decodeDecimal
C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s:364 .text.decodeFP:0000000000000000 $t
C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s:370 .text.decodeFP:0000000000000000 decodeFP
C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s:394 .text.decodePacket:0000000000000000 $t
C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s:400 .text.decodePacket:0000000000000000 decodePacket
C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s:714 .text.updateLocation:0000000000000000 $t
C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s:721 .text.updateLocation:0000000000000000 updateLocation
C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s:927 .text.updateLocation:00000000000000c0 $d
*COM*:0000000000000050 linebuff
C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s:947 .bss.lineState:0000000000000000 lineState
C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s:941 .bss.linePos:0000000000000000 linePos
C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s:937 .bss.linePos:0000000000000000 $d
C:\Users\mike\AppData\Local\Temp\ccE4nBkk.s:948 .bss.lineState:0000000000000000 $d
UNDEFINED SYMBOLS
_ctype_
__aeabi_i2f
__aeabi_fmul
__aeabi_fadd
__aeabi_fsub
__aeabi_f2d
__aeabi_dcmplt
__aeabi_fdiv
strtof
mktime
SerialCharsReceived
GetCharSerial
memcpy