Display_Avr_3/hdlc_screen/Debug/hdlc_screen.lss
2024-02-22 17:16:03 +03:00

4531 lines
178 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

hdlc_screen.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .data 00000242 00800100 00001d52 00001de6 2**0
CONTENTS, ALLOC, LOAD, DATA
1 .text 00001d52 00000000 00000000 00000094 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .bss 00000054 00800342 00800342 00002028 2**0
ALLOC
3 .comment 0000008c 00000000 00000000 00002028 2**0
CONTENTS, READONLY
4 .note.gnu.avr.deviceinfo 00000040 00000000 00000000 000020b4 2**2
CONTENTS, READONLY
5 .debug_aranges 00000320 00000000 00000000 000020f4 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_info 0000378f 00000000 00000000 00002414 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_abbrev 00001589 00000000 00000000 00005ba3 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_line 00001e37 00000000 00000000 0000712c 2**0
CONTENTS, READONLY, DEBUGGING
9 .debug_frame 000009a0 00000000 00000000 00008f64 2**2
CONTENTS, READONLY, DEBUGGING
10 .debug_str 00000cc5 00000000 00000000 00009904 2**0
CONTENTS, READONLY, DEBUGGING
11 .debug_loc 00002fe7 00000000 00000000 0000a5c9 2**0
CONTENTS, READONLY, DEBUGGING
12 .debug_ranges 000002e8 00000000 00000000 0000d5b0 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00000000 <__vectors>:
0: 0c 94 34 00 jmp 0x68 ; 0x68 <__ctors_end>
4: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
8: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
c: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
10: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
14: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
18: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
1c: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
20: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
24: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
28: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
2c: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
30: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
34: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
38: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
3c: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
40: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
44: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
48: 0c 94 10 0b jmp 0x1620 ; 0x1620 <__vector_18>
4c: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
50: 0c 94 42 0b jmp 0x1684 ; 0x1684 <__vector_20>
54: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
58: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
5c: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
60: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
64: 0c 94 51 00 jmp 0xa2 ; 0xa2 <__bad_interrupt>
00000068 <__ctors_end>:
68: 11 24 eor r1, r1
6a: 1f be out 0x3f, r1 ; 63
6c: cf ef ldi r28, 0xFF ; 255
6e: d8 e0 ldi r29, 0x08 ; 8
70: de bf out 0x3e, r29 ; 62
72: cd bf out 0x3d, r28 ; 61
00000074 <__do_copy_data>:
74: 13 e0 ldi r17, 0x03 ; 3
76: a0 e0 ldi r26, 0x00 ; 0
78: b1 e0 ldi r27, 0x01 ; 1
7a: e2 e5 ldi r30, 0x52 ; 82
7c: fd e1 ldi r31, 0x1D ; 29
7e: 02 c0 rjmp .+4 ; 0x84 <__do_copy_data+0x10>
80: 05 90 lpm r0, Z+
82: 0d 92 st X+, r0
84: a2 34 cpi r26, 0x42 ; 66
86: b1 07 cpc r27, r17
88: d9 f7 brne .-10 ; 0x80 <__do_copy_data+0xc>
0000008a <__do_clear_bss>:
8a: 23 e0 ldi r18, 0x03 ; 3
8c: a2 e4 ldi r26, 0x42 ; 66
8e: b3 e0 ldi r27, 0x03 ; 3
90: 01 c0 rjmp .+2 ; 0x94 <.do_clear_bss_start>
00000092 <.do_clear_bss_loop>:
92: 1d 92 st X+, r1
00000094 <.do_clear_bss_start>:
94: a6 39 cpi r26, 0x96 ; 150
96: b2 07 cpc r27, r18
98: e1 f7 brne .-8 ; 0x92 <.do_clear_bss_loop>
9a: 0e 94 26 07 call 0xe4c ; 0xe4c <main>
9e: 0c 94 a7 0e jmp 0x1d4e ; 0x1d4e <_exit>
000000a2 <__bad_interrupt>:
a2: 0c 94 00 00 jmp 0 ; 0x0 <__vectors>
000000a6 <init_hdlc_client>:
#define SIZE_DATA_BUFFERS 64
int connecting_frame_timeout_bf;
void init_hdlc_client(struct Client* client, int connecting_frame_timeout){
a6: fc 01 movw r30, r24
client->state = IDLE_STATE;
a8: 81 e0 ldi r24, 0x01 ; 1
aa: 80 83 st Z, r24
client->connecting_frame_timeout = connecting_frame_timeout;
ac: 72 83 std Z+2, r23 ; 0x02
ae: 61 83 std Z+1, r22 ; 0x01
connecting_frame_timeout_bf = connecting_frame_timeout;
b0: 70 93 44 03 sts 0x0344, r23 ; 0x800344 <connecting_frame_timeout_bf+0x1>
b4: 60 93 43 03 sts 0x0343, r22 ; 0x800343 <connecting_frame_timeout_bf>
client->current_index_frame = 20;
b8: 84 e1 ldi r24, 0x14 ; 20
ba: 83 83 std Z+3, r24 ; 0x03
client->current_state_hdlc.control_escape = 0;
bc: 14 82 std Z+4, r1 ; 0x04
client->current_state_hdlc.fcs = FCS_INIT_VALUE;
be: 8f ef ldi r24, 0xFF ; 255
c0: 9f ef ldi r25, 0xFF ; 255
c2: 96 83 std Z+6, r25 ; 0x06
c4: 85 83 std Z+5, r24 ; 0x05
client->current_state_hdlc.start_index = -1;
c6: 90 87 std Z+8, r25 ; 0x08
c8: 87 83 std Z+7, r24 ; 0x07
client->current_state_hdlc.end_index = -1;
ca: 92 87 std Z+10, r25 ; 0x0a
cc: 81 87 std Z+9, r24 ; 0x09
client->current_state_hdlc.src_index = 0;
ce: 14 86 std Z+12, r1 ; 0x0c
d0: 13 86 std Z+11, r1 ; 0x0b
client->current_state_hdlc.dest_index = 0;
d2: 16 86 std Z+14, r1 ; 0x0e
d4: 15 86 std Z+13, r1 ; 0x0d
d6: 08 95 ret
000000d8 <hdlc_connect>:
}
void hdlc_connect(struct Client* client){
d8: fc 01 movw r30, r24
client->state = CONNECTING;
da: 83 e0 ldi r24, 0x03 ; 3
dc: 80 83 st Z, r24
client->frameS.seq_no = 0;
de: 80 89 ldd r24, Z+16 ; 0x10
e0: 88 7f andi r24, 0xF8 ; 248
e2: 80 8b std Z+16, r24 ; 0x10
client->frameS.frame = S_FRAME;
e4: 81 e0 ldi r24, 0x01 ; 1
e6: 87 87 std Z+15, r24 ; 0x0f
client->current_index_frame = client->frameS.seq_no;
e8: 13 82 std Z+3, r1 ; 0x03
ea: 08 95 ret
000000ec <hdlc_send_data>:
}
int hdlc_send_data(struct Client* client, uint8_t data[], size_t data_len){
ec: fc 01 movw r30, r24
if (client->state != READY_STATE){
ee: 80 81 ld r24, Z
f0: 82 30 cpi r24, 0x02 ; 2
f2: 89 f4 brne .+34 ; 0x116 <hdlc_send_data+0x2a>
return ERR_INVALID_STATE;
}
client->state = RECIVING;
f4: 85 e0 ldi r24, 0x05 ; 5
f6: 80 83 st Z, r24
if (SIZE_DATA_BUFFERS < data_len){
f8: 41 34 cpi r20, 0x41 ; 65
fa: 51 05 cpc r21, r1
fc: 78 f4 brcc .+30 ; 0x11c <hdlc_send_data+0x30>
return ERR_INVALID_DATA_SIZE;
}
client->frameI.seq_no = 0;
fe: 82 89 ldd r24, Z+18 ; 0x12
100: 88 7f andi r24, 0xF8 ; 248
102: 82 8b std Z+18, r24 ; 0x12
client->frameI.frame = I_FRAME;
104: 11 8a std Z+17, r1 ; 0x11
client->data_i_frame = data;
106: 74 8b std Z+20, r23 ; 0x14
108: 63 8b std Z+19, r22 ; 0x13
client->len_data_i_frame = data_len;
10a: 56 8b std Z+22, r21 ; 0x16
10c: 45 8b std Z+21, r20 ; 0x15
client->current_index_frame = client->frameI.seq_no;
10e: 13 82 std Z+3, r1 ; 0x03
client->state = RECIVING;
return 0;
110: 80 e0 ldi r24, 0x00 ; 0
112: 90 e0 ldi r25, 0x00 ; 0
114: 08 95 ret
client->current_index_frame = client->frameS.seq_no;
}
int hdlc_send_data(struct Client* client, uint8_t data[], size_t data_len){
if (client->state != READY_STATE){
return ERR_INVALID_STATE;
116: 8c ef ldi r24, 0xFC ; 252
118: 9f ef ldi r25, 0xFF ; 255
11a: 08 95 ret
}
client->state = RECIVING;
if (SIZE_DATA_BUFFERS < data_len){
return ERR_INVALID_DATA_SIZE;
11c: 8f ef ldi r24, 0xFF ; 255
11e: 9f ef ldi r25, 0xFF ; 255
client->len_data_i_frame = data_len;
client->current_index_frame = client->frameI.seq_no;
client->state = RECIVING;
return 0;
}
120: 08 95 ret
00000122 <hdlc_get_raw_frame>:
int hdlc_get_raw_frame(struct Client *client, uint8_t* buffer, size_t lenBuffer) {
122: cf 92 push r12
124: df 92 push r13
126: ef 92 push r14
128: ff 92 push r15
12a: 0f 93 push r16
12c: 1f 93 push r17
12e: cf 93 push r28
130: df 93 push r29
132: 00 d0 rcall .+0 ; 0x134 <hdlc_get_raw_frame+0x12>
134: cd b7 in r28, 0x3d ; 61
136: de b7 in r29, 0x3e ; 62
138: 7c 01 movw r14, r24
13a: 6b 01 movw r12, r22
13c: 5a 83 std Y+2, r21 ; 0x02
13e: 49 83 std Y+1, r20 ; 0x01
if(client->state == RECIVING){
140: fc 01 movw r30, r24
142: 80 81 ld r24, Z
144: 85 30 cpi r24, 0x05 ; 5
146: d1 f4 brne .+52 ; 0x17c <hdlc_get_raw_frame+0x5a>
int ret = hdlc_frame_data(&client->frameI, client->data_i_frame,
148: 45 89 ldd r20, Z+21 ; 0x15
14a: 56 89 ldd r21, Z+22 ; 0x16
14c: 63 89 ldd r22, Z+19 ; 0x13
14e: 74 89 ldd r23, Z+20 ; 0x14
150: 8e 01 movw r16, r28
152: 0f 5f subi r16, 0xFF ; 255
154: 1f 4f sbci r17, 0xFF ; 255
156: 96 01 movw r18, r12
158: c7 01 movw r24, r14
15a: 41 96 adiw r24, 0x11 ; 17
15c: 0e 94 48 03 call 0x690 ; 0x690 <hdlc_frame_data>
client->len_data_i_frame, buffer, &lenBuffer);
if (ret < 0){
160: 99 23 and r25, r25
162: 64 f4 brge .+24 ; 0x17c <hdlc_get_raw_frame+0x5a>
printf("err in get_frame: %d\n", ret);
164: 9f 93 push r25
166: 8f 93 push r24
168: 80 e0 ldi r24, 0x00 ; 0
16a: 91 e0 ldi r25, 0x01 ; 1
16c: 9f 93 push r25
16e: 8f 93 push r24
170: 0e 94 99 0b call 0x1732 ; 0x1732 <printf>
174: 0f 90 pop r0
176: 0f 90 pop r0
178: 0f 90 pop r0
17a: 0f 90 pop r0
}
}
if (client->state == CONNECTING){
17c: f7 01 movw r30, r14
17e: 80 81 ld r24, Z
180: 83 30 cpi r24, 0x03 ; 3
182: d1 f4 brne .+52 ; 0x1b8 <hdlc_get_raw_frame+0x96>
int ret = hdlc_frame_data(&client->frameS, NULL, 0, buffer, &lenBuffer);
184: 8e 01 movw r16, r28
186: 0f 5f subi r16, 0xFF ; 255
188: 1f 4f sbci r17, 0xFF ; 255
18a: 96 01 movw r18, r12
18c: 40 e0 ldi r20, 0x00 ; 0
18e: 50 e0 ldi r21, 0x00 ; 0
190: 60 e0 ldi r22, 0x00 ; 0
192: 70 e0 ldi r23, 0x00 ; 0
194: c7 01 movw r24, r14
196: 0f 96 adiw r24, 0x0f ; 15
198: 0e 94 48 03 call 0x690 ; 0x690 <hdlc_frame_data>
if (ret < 0){
19c: 99 23 and r25, r25
19e: 64 f4 brge .+24 ; 0x1b8 <hdlc_get_raw_frame+0x96>
printf("err in get_frame: %d\n", ret);
1a0: 9f 93 push r25
1a2: 8f 93 push r24
1a4: 80 e0 ldi r24, 0x00 ; 0
1a6: 91 e0 ldi r25, 0x01 ; 1
1a8: 9f 93 push r25
1aa: 8f 93 push r24
1ac: 0e 94 99 0b call 0x1732 ; 0x1732 <printf>
1b0: 0f 90 pop r0
1b2: 0f 90 pop r0
1b4: 0f 90 pop r0
1b6: 0f 90 pop r0
}
}
if (client->state == DISCONNECTING){
1b8: f7 01 movw r30, r14
1ba: 80 81 ld r24, Z
1bc: 84 30 cpi r24, 0x04 ; 4
1be: d1 f4 brne .+52 ; 0x1f4 <hdlc_get_raw_frame+0xd2>
int ret = hdlc_frame_data(&client->frame_rej, NULL, 0, buffer, &lenBuffer);
1c0: 8e 01 movw r16, r28
1c2: 0f 5f subi r16, 0xFF ; 255
1c4: 1f 4f sbci r17, 0xFF ; 255
1c6: 96 01 movw r18, r12
1c8: 40 e0 ldi r20, 0x00 ; 0
1ca: 50 e0 ldi r21, 0x00 ; 0
1cc: 60 e0 ldi r22, 0x00 ; 0
1ce: 70 e0 ldi r23, 0x00 ; 0
1d0: c7 01 movw r24, r14
1d2: 47 96 adiw r24, 0x17 ; 23
1d4: 0e 94 48 03 call 0x690 ; 0x690 <hdlc_frame_data>
if (ret < 0){
1d8: 99 23 and r25, r25
1da: 64 f4 brge .+24 ; 0x1f4 <hdlc_get_raw_frame+0xd2>
printf("err in get_frame: %d\n", ret);
1dc: 9f 93 push r25
1de: 8f 93 push r24
1e0: 80 e0 ldi r24, 0x00 ; 0
1e2: 91 e0 ldi r25, 0x01 ; 1
1e4: 9f 93 push r25
1e6: 8f 93 push r24
1e8: 0e 94 99 0b call 0x1732 ; 0x1732 <printf>
1ec: 0f 90 pop r0
1ee: 0f 90 pop r0
1f0: 0f 90 pop r0
1f2: 0f 90 pop r0
}
}
return 0;
}
1f4: 80 e0 ldi r24, 0x00 ; 0
1f6: 90 e0 ldi r25, 0x00 ; 0
1f8: 0f 90 pop r0
1fa: 0f 90 pop r0
1fc: df 91 pop r29
1fe: cf 91 pop r28
200: 1f 91 pop r17
202: 0f 91 pop r16
204: ff 90 pop r15
206: ef 90 pop r14
208: df 90 pop r13
20a: cf 90 pop r12
20c: 08 95 ret
0000020e <hdlc_decode_recived_raw_data>:
int hdlc_decode_recived_raw_data(struct Client* client, uint8_t* buffer, size_t len_buffer, uint8_t* recived_data, size_t* len_recived_data){
20e: 2f 92 push r2
210: 3f 92 push r3
212: 4f 92 push r4
214: 5f 92 push r5
216: 6f 92 push r6
218: 7f 92 push r7
21a: 8f 92 push r8
21c: 9f 92 push r9
21e: af 92 push r10
220: bf 92 push r11
222: cf 92 push r12
224: df 92 push r13
226: ef 92 push r14
228: ff 92 push r15
22a: 0f 93 push r16
22c: 1f 93 push r17
22e: cf 93 push r28
230: df 93 push r29
232: 00 d0 rcall .+0 ; 0x234 <hdlc_decode_recived_raw_data+0x26>
234: 00 d0 rcall .+0 ; 0x236 <hdlc_decode_recived_raw_data+0x28>
236: cd b7 in r28, 0x3d ; 61
238: de b7 in r29, 0x3e ; 62
23a: 5c 01 movw r10, r24
23c: 5c 83 std Y+4, r21 ; 0x04
23e: 4b 83 std Y+3, r20 ; 0x03
240: 22 2e mov r2, r18
242: 33 2e mov r3, r19
244: 38 01 movw r6, r16
return ERR_INVALID_SEQ_NUMBER_FRAME;
}
client->connecting_frame_timeout = connecting_frame_timeout_bf;
return 0;
}
246: 8d b6 in r8, 0x3d ; 61
248: 9e b6 in r9, 0x3e ; 62
return 0;
}
int hdlc_decode_recived_raw_data(struct Client* client, uint8_t* buffer, size_t len_buffer, uint8_t* recived_data, size_t* len_recived_data){
hdlc_control_t recv_control;
uint8_t recive[len_buffer];
24a: c4 2e mov r12, r20
24c: d5 2e mov r13, r21
24e: 8d b7 in r24, 0x3d ; 61
250: 9e b7 in r25, 0x3e ; 62
252: 8c 19 sub r24, r12
254: 9d 09 sbc r25, r13
256: 0f b6 in r0, 0x3f ; 63
258: f8 94 cli
25a: 9e bf out 0x3e, r25 ; 62
25c: 0f be out 0x3f, r0 ; 63
25e: 8d bf out 0x3d, r24 ; 61
260: ed b7 in r30, 0x3d ; 61
262: fe b7 in r31, 0x3e ; 62
264: 31 96 adiw r30, 0x01 ; 1
266: 2f 01 movw r4, r30
int ret = hdlc_get_data_with_state(&client->current_state_hdlc,&recv_control, buffer, len_buffer, recive,
268: ce 01 movw r24, r28
26a: 03 96 adiw r24, 0x03 ; 3
26c: 7c 01 movw r14, r24
26e: 8f 01 movw r16, r30
270: 96 01 movw r18, r12
272: ab 01 movw r20, r22
274: be 01 movw r22, r28
276: 6f 5f subi r22, 0xFF ; 255
278: 7f 4f sbci r23, 0xFF ; 255
27a: c5 01 movw r24, r10
27c: 04 96 adiw r24, 0x04 ; 4
27e: 0e 94 22 02 call 0x444 ; 0x444 <hdlc_get_data_with_state>
&len_buffer);
if (ret < 0) {
282: 99 23 and r25, r25
284: 0c f4 brge .+2 ; 0x288 <hdlc_decode_recived_raw_data+0x7a>
286: 48 c0 rjmp .+144 ; 0x318 <hdlc_decode_recived_raw_data+0x10a>
return ret;
}
if (recv_control.seq_no != client->current_index_frame){
288: 8a 81 ldd r24, Y+2 ; 0x02
28a: 87 70 andi r24, 0x07 ; 7
28c: 90 e0 ldi r25, 0x00 ; 0
28e: f5 01 movw r30, r10
290: 23 81 ldd r18, Z+3 ; 0x03
292: 30 e0 ldi r19, 0x00 ; 0
294: 82 17 cp r24, r18
296: 93 07 cpc r25, r19
298: 51 f0 breq .+20 ; 0x2ae <hdlc_decode_recived_raw_data+0xa0>
client->state = DISCONNECTING;
29a: 84 e0 ldi r24, 0x04 ; 4
29c: 80 83 st Z, r24
client->frame_rej.seq_no = 0;
29e: 80 8d ldd r24, Z+24 ; 0x18
2a0: 88 7f andi r24, 0xF8 ; 248
2a2: 80 8f std Z+24, r24 ; 0x18
client->frame_rej.frame = S_FRAME_NACK;
2a4: 82 e0 ldi r24, 0x02 ; 2
2a6: 87 8b std Z+23, r24 ; 0x17
return ERR_INVALID_SEQ_NUMBER_FRAME;
2a8: 8a ef ldi r24, 0xFA ; 250
2aa: 9f ef ldi r25, 0xFF ; 255
2ac: 35 c0 rjmp .+106 ; 0x318 <hdlc_decode_recived_raw_data+0x10a>
}
switch (recv_control.frame) {
2ae: 89 81 ldd r24, Y+1 ; 0x01
2b0: 81 30 cpi r24, 0x01 ; 1
2b2: 49 f0 breq .+18 ; 0x2c6 <hdlc_decode_recived_raw_data+0xb8>
2b4: 18 f0 brcs .+6 ; 0x2bc <hdlc_decode_recived_raw_data+0xae>
2b6: 82 30 cpi r24, 0x02 ; 2
2b8: d9 f0 breq .+54 ; 0x2f0 <hdlc_decode_recived_raw_data+0xe2>
2ba: 25 c0 rjmp .+74 ; 0x306 <hdlc_decode_recived_raw_data+0xf8>
case S_FRAME:
client->state = READY_STATE;
break;
case I_FRAME:
for (int i = 0; i < sizeof(recive)-2; i++){
2bc: f2 e0 ldi r31, 0x02 ; 2
2be: cf 1a sub r12, r31
2c0: d1 08 sbc r13, r1
2c2: 29 f4 brne .+10 ; 0x2ce <hdlc_decode_recived_raw_data+0xc0>
2c4: 0e c0 rjmp .+28 ; 0x2e2 <hdlc_decode_recived_raw_data+0xd4>
return ERR_INVALID_SEQ_NUMBER_FRAME;
}
switch (recv_control.frame) {
case S_FRAME:
client->state = READY_STATE;
2c6: 82 e0 ldi r24, 0x02 ; 2
2c8: f5 01 movw r30, r10
2ca: 80 83 st Z, r24
break;
2cc: 1c c0 rjmp .+56 ; 0x306 <hdlc_decode_recived_raw_data+0xf8>
2ce: f2 01 movw r30, r4
2d0: a2 2d mov r26, r2
2d2: b3 2d mov r27, r3
2d4: 4c 0c add r4, r12
2d6: 5d 1c adc r5, r13
case I_FRAME:
for (int i = 0; i < sizeof(recive)-2; i++){
recived_data[i] = recive[i];
2d8: 81 91 ld r24, Z+
2da: 8d 93 st X+, r24
switch (recv_control.frame) {
case S_FRAME:
client->state = READY_STATE;
break;
case I_FRAME:
for (int i = 0; i < sizeof(recive)-2; i++){
2dc: e4 15 cp r30, r4
2de: f5 05 cpc r31, r5
2e0: d9 f7 brne .-10 ; 0x2d8 <hdlc_decode_recived_raw_data+0xca>
recived_data[i] = recive[i];
}
*len_recived_data = sizeof(recive)-2;
2e2: f3 01 movw r30, r6
2e4: d1 82 std Z+1, r13 ; 0x01
2e6: c0 82 st Z, r12
client->state = SEND;
2e8: 86 e0 ldi r24, 0x06 ; 6
2ea: f5 01 movw r30, r10
2ec: 80 83 st Z, r24
break;
2ee: 0b c0 rjmp .+22 ; 0x306 <hdlc_decode_recived_raw_data+0xf8>
case S_FRAME_NACK:
client->state = DISCONNECTING;
2f0: 84 e0 ldi r24, 0x04 ; 4
2f2: f5 01 movw r30, r10
2f4: 80 83 st Z, r24
client->frame_rej.seq_no = 0;
2f6: 80 8d ldd r24, Z+24 ; 0x18
2f8: 88 7f andi r24, 0xF8 ; 248
2fa: 80 8f std Z+24, r24 ; 0x18
client->frame_rej.frame = S_FRAME_NACK;
2fc: 82 e0 ldi r24, 0x02 ; 2
2fe: 87 8b std Z+23, r24 ; 0x17
return ERR_INVALID_SEQ_NUMBER_FRAME;
300: 8a ef ldi r24, 0xFA ; 250
302: 9f ef ldi r25, 0xFF ; 255
304: 09 c0 rjmp .+18 ; 0x318 <hdlc_decode_recived_raw_data+0x10a>
}
client->connecting_frame_timeout = connecting_frame_timeout_bf;
306: 80 91 43 03 lds r24, 0x0343 ; 0x800343 <connecting_frame_timeout_bf>
30a: 90 91 44 03 lds r25, 0x0344 ; 0x800344 <connecting_frame_timeout_bf+0x1>
30e: f5 01 movw r30, r10
310: 92 83 std Z+2, r25 ; 0x02
312: 81 83 std Z+1, r24 ; 0x01
return 0;
314: 80 e0 ldi r24, 0x00 ; 0
316: 90 e0 ldi r25, 0x00 ; 0
}
318: 0f b6 in r0, 0x3f ; 63
31a: f8 94 cli
31c: 9e be out 0x3e, r9 ; 62
31e: 0f be out 0x3f, r0 ; 63
320: 8d be out 0x3d, r8 ; 61
322: 0f 90 pop r0
324: 0f 90 pop r0
326: 0f 90 pop r0
328: 0f 90 pop r0
32a: df 91 pop r29
32c: cf 91 pop r28
32e: 1f 91 pop r17
330: 0f 91 pop r16
332: ff 90 pop r15
334: ef 90 pop r14
336: df 90 pop r13
338: cf 90 pop r12
33a: bf 90 pop r11
33c: af 90 pop r10
33e: 9f 90 pop r9
340: 8f 90 pop r8
342: 7f 90 pop r7
344: 6f 90 pop r6
346: 5f 90 pop r5
348: 4f 90 pop r4
34a: 3f 90 pop r3
34c: 2f 90 pop r2
34e: 08 95 ret
00000350 <hdlc_timeout_handler>:
int hdlc_timeout_handler(struct Client* client, int delta_time){
client->connecting_frame_timeout -= delta_time;
350: fc 01 movw r30, r24
352: 21 81 ldd r18, Z+1 ; 0x01
354: 32 81 ldd r19, Z+2 ; 0x02
356: 26 1b sub r18, r22
358: 37 0b sbc r19, r23
35a: 32 83 std Z+2, r19 ; 0x02
35c: 21 83 std Z+1, r18 ; 0x01
if (client->connecting_frame_timeout <= 0){
35e: 12 16 cp r1, r18
360: 13 06 cpc r1, r19
362: 1c f4 brge .+6 ; 0x36a <hdlc_timeout_handler+0x1a>
return ERR_FRAME_TIME_OUT;
}
return 0;
364: 80 e0 ldi r24, 0x00 ; 0
366: 90 e0 ldi r25, 0x00 ; 0
368: 08 95 ret
int hdlc_timeout_handler(struct Client* client, int delta_time){
client->connecting_frame_timeout -= delta_time;
if (client->connecting_frame_timeout <= 0){
return ERR_FRAME_TIME_OUT;
36a: 8b ef ldi r24, 0xFB ; 251
36c: 9f ef ldi r25, 0xFF ; 255
}
return 0;
36e: 08 95 ret
00000370 <calc_fcs>:
0xb0a3, 0x8238, 0x93b1, 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb,
0x0e70, 0x1ff9, 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9,
0x8330, 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 };
FCS_SIZE calc_fcs(FCS_SIZE fcs, unsigned char value) {
return (fcs >> 8) ^ fcstab[(fcs ^ value) & 0xff];
370: fc 01 movw r30, r24
372: e6 27 eor r30, r22
374: ff 27 eor r31, r31
376: ee 0f add r30, r30
378: ff 1f adc r31, r31
37a: ea 5e subi r30, 0xEA ; 234
37c: fe 4f sbci r31, 0xFE ; 254
37e: 89 2f mov r24, r25
380: 99 27 eor r25, r25
382: 20 81 ld r18, Z
384: 31 81 ldd r19, Z+1 ; 0x01
386: 82 27 eor r24, r18
388: 93 27 eor r25, r19
38a: 08 95 ret
0000038c <hdlc_escape_value>:
//int hdlc_get_data(hdlc_control_t *control, const char *src,
// unsigned int src_len, char *dest, unsigned int *dest_len)
int hdlc_get_data(hdlc_control_t *control, uint8_t *src,
size_t src_len, uint8_t *dest, size_t *dest_len){
return hdlc_get_data_with_state(&hdlc_state, control, src, src_len, dest, dest_len);
}
38c: fa 01 movw r30, r20
38e: 93 e8 ldi r25, 0x83 ; 131
390: 98 0f add r25, r24
392: 92 30 cpi r25, 0x02 ; 2
394: 70 f4 brcc .+28 ; 0x3b2 <hdlc_escape_value+0x26>
396: 20 81 ld r18, Z
398: 31 81 ldd r19, Z+1 ; 0x01
39a: a9 01 movw r20, r18
39c: 4f 5f subi r20, 0xFF ; 255
39e: 5f 4f sbci r21, 0xFF ; 255
3a0: 51 83 std Z+1, r21 ; 0x01
3a2: 40 83 st Z, r20
3a4: db 01 movw r26, r22
3a6: a2 0f add r26, r18
3a8: b3 1f adc r27, r19
3aa: 9d e7 ldi r25, 0x7D ; 125
3ac: 9c 93 st X, r25
3ae: 90 e2 ldi r25, 0x20 ; 32
3b0: 89 27 eor r24, r25
3b2: 20 81 ld r18, Z
3b4: 31 81 ldd r19, Z+1 ; 0x01
3b6: a9 01 movw r20, r18
3b8: 4f 5f subi r20, 0xFF ; 255
3ba: 5f 4f sbci r21, 0xFF ; 255
3bc: 51 83 std Z+1, r21 ; 0x01
3be: 40 83 st Z, r20
3c0: fb 01 movw r30, r22
3c2: e2 0f add r30, r18
3c4: f3 1f adc r31, r19
3c6: 80 83 st Z, r24
3c8: 08 95 ret
000003ca <hdlc_get_control_type>:
3ca: 98 2f mov r25, r24
3cc: 80 ff sbrs r24, 0
3ce: 0b c0 rjmp .+22 ; 0x3e6 <hdlc_get_control_type+0x1c>
3d0: 86 95 lsr r24
3d2: 86 95 lsr r24
3d4: 83 70 andi r24, 0x03 ; 3
3d6: 11 f0 breq .+4 ; 0x3dc <hdlc_get_control_type+0x12>
3d8: 82 e0 ldi r24, 0x02 ; 2
3da: 01 c0 rjmp .+2 ; 0x3de <hdlc_get_control_type+0x14>
3dc: 81 e0 ldi r24, 0x01 ; 1
3de: 92 95 swap r25
3e0: 96 95 lsr r25
3e2: 97 70 andi r25, 0x07 ; 7
3e4: 03 c0 rjmp .+6 ; 0x3ec <hdlc_get_control_type+0x22>
3e6: 96 95 lsr r25
3e8: 97 70 andi r25, 0x07 ; 7
3ea: 80 e0 ldi r24, 0x00 ; 0
3ec: 97 70 andi r25, 0x07 ; 7
3ee: 08 95 ret
000003f0 <hdlc_frame_control_type>:
3f0: fc 01 movw r30, r24
3f2: 90 81 ld r25, Z
3f4: 91 30 cpi r25, 0x01 ; 1
3f6: 49 f0 breq .+18 ; 0x40a <__LOCK_REGION_LENGTH__+0xa>
3f8: 18 f0 brcs .+6 ; 0x400 <__LOCK_REGION_LENGTH__>
3fa: 92 30 cpi r25, 0x02 ; 2
3fc: 61 f0 breq .+24 ; 0x416 <__LOCK_REGION_LENGTH__+0x16>
3fe: 11 c0 rjmp .+34 ; 0x422 <__LOCK_REGION_LENGTH__+0x22>
400: 81 81 ldd r24, Z+1 ; 0x01
402: 87 70 andi r24, 0x07 ; 7
404: 88 0f add r24, r24
406: 80 61 ori r24, 0x10 ; 16
408: 08 95 ret
40a: 81 81 ldd r24, Z+1 ; 0x01
40c: 82 95 swap r24
40e: 88 0f add r24, r24
410: 80 7e andi r24, 0xE0 ; 224
412: 81 60 ori r24, 0x01 ; 1
414: 08 95 ret
416: 81 81 ldd r24, Z+1 ; 0x01
418: 82 95 swap r24
41a: 88 0f add r24, r24
41c: 80 7e andi r24, 0xE0 ; 224
41e: 89 60 ori r24, 0x09 ; 9
420: 08 95 ret
422: 80 e0 ldi r24, 0x00 ; 0
424: 08 95 ret
00000426 <hdlc_get_data_reset_with_state>:
426: fc 01 movw r30, r24
428: 8f ef ldi r24, 0xFF ; 255
42a: 9f ef ldi r25, 0xFF ; 255
42c: 92 83 std Z+2, r25 ; 0x02
42e: 81 83 std Z+1, r24 ; 0x01
430: 96 83 std Z+6, r25 ; 0x06
432: 85 83 std Z+5, r24 ; 0x05
434: 94 83 std Z+4, r25 ; 0x04
436: 83 83 std Z+3, r24 ; 0x03
438: 12 86 std Z+10, r1 ; 0x0a
43a: 11 86 std Z+9, r1 ; 0x09
43c: 10 86 std Z+8, r1 ; 0x08
43e: 17 82 std Z+7, r1 ; 0x07
440: 10 82 st Z, r1
442: 08 95 ret
00000444 <hdlc_get_data_with_state>:
444: 3f 92 push r3
446: 4f 92 push r4
448: 5f 92 push r5
44a: 6f 92 push r6
44c: 7f 92 push r7
44e: 8f 92 push r8
450: 9f 92 push r9
452: af 92 push r10
454: bf 92 push r11
456: cf 92 push r12
458: df 92 push r13
45a: ef 92 push r14
45c: ff 92 push r15
45e: 0f 93 push r16
460: 1f 93 push r17
462: cf 93 push r28
464: df 93 push r29
466: 00 d0 rcall .+0 ; 0x468 <hdlc_get_data_with_state+0x24>
468: 00 d0 rcall .+0 ; 0x46a <hdlc_get_data_with_state+0x26>
46a: cd b7 in r28, 0x3d ; 61
46c: de b7 in r29, 0x3e ; 62
46e: 00 97 sbiw r24, 0x00 ; 0
470: 09 f4 brne .+2 ; 0x474 <hdlc_get_data_with_state+0x30>
472: ea c0 rjmp .+468 ; 0x648 <hdlc_get_data_with_state+0x204>
474: 61 15 cp r22, r1
476: 71 05 cpc r23, r1
478: 09 f4 brne .+2 ; 0x47c <hdlc_get_data_with_state+0x38>
47a: e9 c0 rjmp .+466 ; 0x64e <hdlc_get_data_with_state+0x20a>
47c: 41 15 cp r20, r1
47e: 51 05 cpc r21, r1
480: 09 f4 brne .+2 ; 0x484 <hdlc_get_data_with_state+0x40>
482: e8 c0 rjmp .+464 ; 0x654 <hdlc_get_data_with_state+0x210>
484: 01 15 cp r16, r1
486: 11 05 cpc r17, r1
488: 09 f4 brne .+2 ; 0x48c <hdlc_get_data_with_state+0x48>
48a: e7 c0 rjmp .+462 ; 0x65a <hdlc_get_data_with_state+0x216>
48c: e1 14 cp r14, r1
48e: f1 04 cpc r15, r1
490: 09 f4 brne .+2 ; 0x494 <hdlc_get_data_with_state+0x50>
492: e6 c0 rjmp .+460 ; 0x660 <hdlc_get_data_with_state+0x21c>
494: 38 01 movw r6, r16
496: 49 01 movw r8, r18
498: 7a 83 std Y+2, r23 ; 0x02
49a: 69 83 std Y+1, r22 ; 0x01
49c: 9c 83 std Y+4, r25 ; 0x04
49e: 8b 83 std Y+3, r24 ; 0x03
4a0: 21 15 cp r18, r1
4a2: 31 05 cpc r19, r1
4a4: 09 f4 brne .+2 ; 0x4a8 <hdlc_get_data_with_state+0x64>
4a6: 99 c0 rjmp .+306 ; 0x5da <hdlc_get_data_with_state+0x196>
4a8: 8a 01 movw r16, r20
4aa: c1 2c mov r12, r1
4ac: d1 2c mov r13, r1
4ae: 68 94 set
4b0: 44 24 eor r4, r4
4b2: 45 f8 bld r4, 5
4b4: 33 24 eor r3, r3
4b6: 33 94 inc r3
4b8: 59 01 movw r10, r18
4ba: 21 e0 ldi r18, 0x01 ; 1
4bc: a2 1a sub r10, r18
4be: b1 08 sbc r11, r1
4c0: ab 81 ldd r26, Y+3 ; 0x03
4c2: bc 81 ldd r27, Y+4 ; 0x04
4c4: 13 96 adiw r26, 0x03 ; 3
4c6: 8d 91 ld r24, X+
4c8: 9c 91 ld r25, X
4ca: 14 97 sbiw r26, 0x04 ; 4
4cc: 99 23 and r25, r25
4ce: 9c f4 brge .+38 ; 0x4f6 <hdlc_get_data_with_state+0xb2>
4d0: f8 01 movw r30, r16
4d2: 80 81 ld r24, Z
4d4: 8e 37 cpi r24, 0x7E ; 126
4d6: 09 f0 breq .+2 ; 0x4da <hdlc_get_data_with_state+0x96>
4d8: 70 c0 rjmp .+224 ; 0x5ba <hdlc_get_data_with_state+0x176>
4da: ca 14 cp r12, r10
4dc: db 04 cpc r13, r11
4de: 20 f4 brcc .+8 ; 0x4e8 <hdlc_get_data_with_state+0xa4>
4e0: 81 81 ldd r24, Z+1 ; 0x01
4e2: 8e 37 cpi r24, 0x7E ; 126
4e4: 09 f4 brne .+2 ; 0x4e8 <hdlc_get_data_with_state+0xa4>
4e6: 70 c0 rjmp .+224 ; 0x5c8 <hdlc_get_data_with_state+0x184>
4e8: eb 81 ldd r30, Y+3 ; 0x03
4ea: fc 81 ldd r31, Y+4 ; 0x04
4ec: 87 81 ldd r24, Z+7 ; 0x07
4ee: 90 85 ldd r25, Z+8 ; 0x08
4f0: 94 83 std Z+4, r25 ; 0x04
4f2: 83 83 std Z+3, r24 ; 0x03
4f4: 62 c0 rjmp .+196 ; 0x5ba <hdlc_get_data_with_state+0x176>
4f6: f8 01 movw r30, r16
4f8: 50 80 ld r5, Z
4fa: 2e e7 ldi r18, 0x7E ; 126
4fc: 52 12 cpse r5, r18
4fe: 19 c0 rjmp .+50 ; 0x532 <hdlc_get_data_with_state+0xee>
500: ca 14 cp r12, r10
502: db 04 cpc r13, r11
504: 20 f4 brcc .+8 ; 0x50e <hdlc_get_data_with_state+0xca>
506: 21 81 ldd r18, Z+1 ; 0x01
508: 2e 37 cpi r18, 0x7E ; 126
50a: 09 f4 brne .+2 ; 0x50e <hdlc_get_data_with_state+0xca>
50c: 5d c0 rjmp .+186 ; 0x5c8 <hdlc_get_data_with_state+0x184>
50e: ab 81 ldd r26, Y+3 ; 0x03
510: bc 81 ldd r27, Y+4 ; 0x04
512: 17 96 adiw r26, 0x07 ; 7
514: 2d 91 ld r18, X+
516: 3c 91 ld r19, X
518: 18 97 sbiw r26, 0x08 ; 8
51a: ac 01 movw r20, r24
51c: 4f 5f subi r20, 0xFF ; 255
51e: 5f 4f sbci r21, 0xFF ; 255
520: 42 17 cp r20, r18
522: 53 07 cpc r21, r19
524: 09 f4 brne .+2 ; 0x528 <hdlc_get_data_with_state+0xe4>
526: 50 c0 rjmp .+160 ; 0x5c8 <hdlc_get_data_with_state+0x184>
528: 16 96 adiw r26, 0x06 ; 6
52a: 3c 93 st X, r19
52c: 2e 93 st -X, r18
52e: 15 97 sbiw r26, 0x05 ; 5
530: 5d c0 rjmp .+186 ; 0x5ec <hdlc_get_data_with_state+0x1a8>
532: bd e7 ldi r27, 0x7D ; 125
534: 5b 12 cpse r5, r27
536: 04 c0 rjmp .+8 ; 0x540 <hdlc_get_data_with_state+0xfc>
538: eb 81 ldd r30, Y+3 ; 0x03
53a: fc 81 ldd r31, Y+4 ; 0x04
53c: 30 82 st Z, r3
53e: 3d c0 rjmp .+122 ; 0x5ba <hdlc_get_data_with_state+0x176>
540: ab 81 ldd r26, Y+3 ; 0x03
542: bc 81 ldd r27, Y+4 ; 0x04
544: 8c 91 ld r24, X
546: 88 23 and r24, r24
548: 19 f0 breq .+6 ; 0x550 <hdlc_get_data_with_state+0x10c>
54a: 1c 92 st X, r1
54c: 50 80 ld r5, Z
54e: 54 24 eor r5, r4
550: 65 2d mov r22, r5
552: eb 81 ldd r30, Y+3 ; 0x03
554: fc 81 ldd r31, Y+4 ; 0x04
556: 81 81 ldd r24, Z+1 ; 0x01
558: 92 81 ldd r25, Z+2 ; 0x02
55a: 0e 94 b8 01 call 0x370 ; 0x370 <calc_fcs>
55e: ab 81 ldd r26, Y+3 ; 0x03
560: bc 81 ldd r27, Y+4 ; 0x04
562: 12 96 adiw r26, 0x02 ; 2
564: 9c 93 st X, r25
566: 8e 93 st -X, r24
568: 11 97 sbiw r26, 0x01 ; 1
56a: 17 96 adiw r26, 0x07 ; 7
56c: 2d 91 ld r18, X+
56e: 3c 91 ld r19, X
570: 18 97 sbiw r26, 0x08 ; 8
572: 13 96 adiw r26, 0x03 ; 3
574: 8d 91 ld r24, X+
576: 9c 91 ld r25, X
578: 14 97 sbiw r26, 0x04 ; 4
57a: 02 96 adiw r24, 0x02 ; 2
57c: 28 17 cp r18, r24
57e: 39 07 cpc r19, r25
580: 41 f4 brne .+16 ; 0x592 <hdlc_get_data_with_state+0x14e>
582: 85 2d mov r24, r5
584: 0e 94 e5 01 call 0x3ca ; 0x3ca <hdlc_get_control_type>
588: e9 81 ldd r30, Y+1 ; 0x01
58a: fa 81 ldd r31, Y+2 ; 0x02
58c: 91 83 std Z+1, r25 ; 0x01
58e: 80 83 st Z, r24
590: 14 c0 rjmp .+40 ; 0x5ba <hdlc_get_data_with_state+0x176>
592: 82 17 cp r24, r18
594: 93 07 cpc r25, r19
596: 8c f4 brge .+34 ; 0x5ba <hdlc_get_data_with_state+0x176>
598: ab 81 ldd r26, Y+3 ; 0x03
59a: bc 81 ldd r27, Y+4 ; 0x04
59c: 19 96 adiw r26, 0x09 ; 9
59e: 8d 91 ld r24, X+
5a0: 9c 91 ld r25, X
5a2: 1a 97 sbiw r26, 0x0a ; 10
5a4: 9c 01 movw r18, r24
5a6: 2f 5f subi r18, 0xFF ; 255
5a8: 3f 4f sbci r19, 0xFF ; 255
5aa: 1a 96 adiw r26, 0x0a ; 10
5ac: 3c 93 st X, r19
5ae: 2e 93 st -X, r18
5b0: 19 97 sbiw r26, 0x09 ; 9
5b2: f3 01 movw r30, r6
5b4: e8 0f add r30, r24
5b6: f9 1f adc r31, r25
5b8: 50 82 st Z, r5
5ba: eb 81 ldd r30, Y+3 ; 0x03
5bc: fc 81 ldd r31, Y+4 ; 0x04
5be: 87 81 ldd r24, Z+7 ; 0x07
5c0: 90 85 ldd r25, Z+8 ; 0x08
5c2: 01 96 adiw r24, 0x01 ; 1
5c4: 90 87 std Z+8, r25 ; 0x08
5c6: 87 83 std Z+7, r24 ; 0x07
5c8: ff ef ldi r31, 0xFF ; 255
5ca: cf 1a sub r12, r31
5cc: df 0a sbc r13, r31
5ce: 0f 5f subi r16, 0xFF ; 255
5d0: 1f 4f sbci r17, 0xFF ; 255
5d2: 8c 14 cp r8, r12
5d4: 9d 04 cpc r9, r13
5d6: 09 f0 breq .+2 ; 0x5da <hdlc_get_data_with_state+0x196>
5d8: 73 cf rjmp .-282 ; 0x4c0 <hdlc_get_data_with_state+0x7c>
5da: ab 81 ldd r26, Y+3 ; 0x03
5dc: bc 81 ldd r27, Y+4 ; 0x04
5de: 13 96 adiw r26, 0x03 ; 3
5e0: 8d 91 ld r24, X+
5e2: 9c 91 ld r25, X
5e4: 14 97 sbiw r26, 0x04 ; 4
5e6: 99 23 and r25, r25
5e8: 3c f0 brlt .+14 ; 0x5f8 <hdlc_get_data_with_state+0x1b4>
5ea: 64 01 movw r12, r8
5ec: eb 81 ldd r30, Y+3 ; 0x03
5ee: fc 81 ldd r31, Y+4 ; 0x04
5f0: 25 81 ldd r18, Z+5 ; 0x05
5f2: 36 81 ldd r19, Z+6 ; 0x06
5f4: 33 23 and r19, r19
5f6: 34 f4 brge .+12 ; 0x604 <hdlc_get_data_with_state+0x1c0>
5f8: d7 01 movw r26, r14
5fa: 1d 92 st X+, r1
5fc: 1c 92 st X, r1
5fe: 8e e0 ldi r24, 0x0E ; 14
600: 92 ed ldi r25, 0xD2 ; 210
602: 30 c0 rjmp .+96 ; 0x664 <hdlc_get_data_with_state+0x220>
604: 04 96 adiw r24, 0x04 ; 4
606: 28 17 cp r18, r24
608: 39 07 cpc r19, r25
60a: 3c f0 brlt .+14 ; 0x61a <hdlc_get_data_with_state+0x1d6>
60c: eb 81 ldd r30, Y+3 ; 0x03
60e: fc 81 ldd r31, Y+4 ; 0x04
610: 81 81 ldd r24, Z+1 ; 0x01
612: 92 81 ldd r25, Z+2 ; 0x02
614: 88 3b cpi r24, 0xB8 ; 184
616: 90 4f sbci r25, 0xF0 ; 240
618: 31 f0 breq .+12 ; 0x626 <hdlc_get_data_with_state+0x1e2>
61a: d7 01 movw r26, r14
61c: cd 92 st X+, r12
61e: dc 92 st X, r13
620: 0e e0 ldi r16, 0x0E ; 14
622: 12 ed ldi r17, 0xD2 ; 210
624: 0a c0 rjmp .+20 ; 0x63a <hdlc_get_data_with_state+0x1f6>
626: eb 81 ldd r30, Y+3 ; 0x03
628: fc 81 ldd r31, Y+4 ; 0x04
62a: 81 85 ldd r24, Z+9 ; 0x09
62c: 92 85 ldd r25, Z+10 ; 0x0a
62e: 02 97 sbiw r24, 0x02 ; 2
630: d7 01 movw r26, r14
632: 8d 93 st X+, r24
634: 9c 93 st X, r25
636: 0c 2d mov r16, r12
638: 1d 2d mov r17, r13
63a: 8b 81 ldd r24, Y+3 ; 0x03
63c: 9c 81 ldd r25, Y+4 ; 0x04
63e: 0e 94 13 02 call 0x426 ; 0x426 <hdlc_get_data_reset_with_state>
642: 80 2f mov r24, r16
644: 91 2f mov r25, r17
646: 0e c0 rjmp .+28 ; 0x664 <hdlc_get_data_with_state+0x220>
648: 8e e0 ldi r24, 0x0E ; 14
64a: 92 ed ldi r25, 0xD2 ; 210
64c: 0b c0 rjmp .+22 ; 0x664 <hdlc_get_data_with_state+0x220>
64e: 8e e0 ldi r24, 0x0E ; 14
650: 92 ed ldi r25, 0xD2 ; 210
652: 08 c0 rjmp .+16 ; 0x664 <hdlc_get_data_with_state+0x220>
654: 8e e0 ldi r24, 0x0E ; 14
656: 92 ed ldi r25, 0xD2 ; 210
658: 05 c0 rjmp .+10 ; 0x664 <hdlc_get_data_with_state+0x220>
65a: 8e e0 ldi r24, 0x0E ; 14
65c: 92 ed ldi r25, 0xD2 ; 210
65e: 02 c0 rjmp .+4 ; 0x664 <hdlc_get_data_with_state+0x220>
660: 8e e0 ldi r24, 0x0E ; 14
662: 92 ed ldi r25, 0xD2 ; 210
664: 0f 90 pop r0
666: 0f 90 pop r0
668: 0f 90 pop r0
66a: 0f 90 pop r0
66c: df 91 pop r29
66e: cf 91 pop r28
670: 1f 91 pop r17
672: 0f 91 pop r16
674: ff 90 pop r15
676: ef 90 pop r14
678: df 90 pop r13
67a: cf 90 pop r12
67c: bf 90 pop r11
67e: af 90 pop r10
680: 9f 90 pop r9
682: 8f 90 pop r8
684: 7f 90 pop r7
686: 6f 90 pop r6
688: 5f 90 pop r5
68a: 4f 90 pop r4
68c: 3f 90 pop r3
68e: 08 95 ret
00000690 <hdlc_frame_data>:
}
//int hdlc_frame_data(hdlc_control_t *control, const char *src,
// unsigned int src_len, char *dest, unsigned int *dest_len)
int hdlc_frame_data(hdlc_control_t *control, uint8_t *src,
size_t src_len, uint8_t *dest, size_t *dest_len){
690: 5f 92 push r5
692: 6f 92 push r6
694: 7f 92 push r7
696: 8f 92 push r8
698: 9f 92 push r9
69a: af 92 push r10
69c: bf 92 push r11
69e: cf 92 push r12
6a0: df 92 push r13
6a2: ef 92 push r14
6a4: ff 92 push r15
6a6: 0f 93 push r16
6a8: 1f 93 push r17
6aa: cf 93 push r28
6ac: df 93 push r29
6ae: 00 d0 rcall .+0 ; 0x6b0 <hdlc_frame_data+0x20>
6b0: cd b7 in r28, 0x3d ; 61
6b2: de b7 in r29, 0x3e ; 62
int dest_index = 0;
unsigned char value = 0;
FCS_SIZE fcs = FCS_INIT_VALUE;
// Make sure that all parameters are valid
if (!control || (!src && (src_len > 0)) || !dest || !dest_len) {
6b4: 00 97 sbiw r24, 0x00 ; 0
6b6: 09 f4 brne .+2 ; 0x6ba <hdlc_frame_data+0x2a>
6b8: 73 c0 rjmp .+230 ; 0x7a0 <hdlc_frame_data+0x110>
6ba: 61 15 cp r22, r1
6bc: 71 05 cpc r23, r1
6be: 21 f4 brne .+8 ; 0x6c8 <hdlc_frame_data+0x38>
6c0: 41 15 cp r20, r1
6c2: 51 05 cpc r21, r1
6c4: 09 f0 breq .+2 ; 0x6c8 <hdlc_frame_data+0x38>
6c6: 6f c0 rjmp .+222 ; 0x7a6 <hdlc_frame_data+0x116>
6c8: 21 15 cp r18, r1
6ca: 31 05 cpc r19, r1
6cc: 09 f4 brne .+2 ; 0x6d0 <hdlc_frame_data+0x40>
6ce: 6e c0 rjmp .+220 ; 0x7ac <hdlc_frame_data+0x11c>
6d0: 01 15 cp r16, r1
6d2: 11 05 cpc r17, r1
6d4: 09 f4 brne .+2 ; 0x6d8 <hdlc_frame_data+0x48>
6d6: 6d c0 rjmp .+218 ; 0x7b2 <hdlc_frame_data+0x122>
6d8: 38 01 movw r6, r16
6da: 79 01 movw r14, r18
6dc: 5a 01 movw r10, r20
6de: 4b 01 movw r8, r22
6e0: 8c 01 movw r16, r24
return -EINVAL;
}
// Start by adding the start flag sequence
dest[dest_index++] = HDLC_FLAG_SEQUENCE;
6e2: 81 e0 ldi r24, 0x01 ; 1
6e4: 90 e0 ldi r25, 0x00 ; 0
6e6: 9a 83 std Y+2, r25 ; 0x02
6e8: 89 83 std Y+1, r24 ; 0x01
6ea: 8e e7 ldi r24, 0x7E ; 126
6ec: f9 01 movw r30, r18
6ee: 80 83 st Z, r24
// Add the all-station address from HDLC (broadcast)
fcs = calc_fcs(fcs, HDLC_ALL_STATION_ADDR);
6f0: 6f ef ldi r22, 0xFF ; 255
6f2: 8f ef ldi r24, 0xFF ; 255
6f4: 9f ef ldi r25, 0xFF ; 255
6f6: 0e 94 b8 01 call 0x370 ; 0x370 <calc_fcs>
6fa: 6c 01 movw r12, r24
hdlc_escape_value(HDLC_ALL_STATION_ADDR, dest, &dest_index);
6fc: ae 01 movw r20, r28
6fe: 4f 5f subi r20, 0xFF ; 255
700: 5f 4f sbci r21, 0xFF ; 255
702: b7 01 movw r22, r14
704: 8f ef ldi r24, 0xFF ; 255
706: 0e 94 c6 01 call 0x38c ; 0x38c <hdlc_escape_value>
// Add the framed control field value
value = hdlc_frame_control_type(control);
70a: c8 01 movw r24, r16
70c: 0e 94 f8 01 call 0x3f0 ; 0x3f0 <hdlc_frame_control_type>
710: 58 2e mov r5, r24
fcs = calc_fcs(fcs, value);
712: 68 2f mov r22, r24
714: c6 01 movw r24, r12
716: 0e 94 b8 01 call 0x370 ; 0x370 <calc_fcs>
71a: 6c 01 movw r12, r24
hdlc_escape_value(value, dest, &dest_index);
71c: ae 01 movw r20, r28
71e: 4f 5f subi r20, 0xFF ; 255
720: 5f 4f sbci r21, 0xFF ; 255
722: b7 01 movw r22, r14
724: 85 2d mov r24, r5
726: 0e 94 c6 01 call 0x38c ; 0x38c <hdlc_escape_value>
// Only DATA frames should contain data
if (control->frame == I_FRAME) {
72a: f8 01 movw r30, r16
72c: 80 81 ld r24, Z
72e: 81 11 cpse r24, r1
730: 19 c0 rjmp .+50 ; 0x764 <hdlc_frame_data+0xd4>
// Calculate FCS and escape data
for (i = 0; i < src_len; i++) {
732: a1 14 cp r10, r1
734: b1 04 cpc r11, r1
736: b1 f0 breq .+44 ; 0x764 <hdlc_frame_data+0xd4>
738: 84 01 movw r16, r8
73a: 8a 0c add r8, r10
73c: 9b 1c adc r9, r11
73e: 58 01 movw r10, r16
fcs = calc_fcs(fcs, src[i]);
740: f8 01 movw r30, r16
742: 61 91 ld r22, Z+
744: 8f 01 movw r16, r30
746: c6 01 movw r24, r12
748: 0e 94 b8 01 call 0x370 ; 0x370 <calc_fcs>
74c: 6c 01 movw r12, r24
hdlc_escape_value(src[i], dest, &dest_index);
74e: ae 01 movw r20, r28
750: 4f 5f subi r20, 0xFF ; 255
752: 5f 4f sbci r21, 0xFF ; 255
754: b7 01 movw r22, r14
756: f5 01 movw r30, r10
758: 80 81 ld r24, Z
75a: 0e 94 c6 01 call 0x38c ; 0x38c <hdlc_escape_value>
hdlc_escape_value(value, dest, &dest_index);
// Only DATA frames should contain data
if (control->frame == I_FRAME) {
// Calculate FCS and escape data
for (i = 0; i < src_len; i++) {
75e: 80 16 cp r8, r16
760: 91 06 cpc r9, r17
762: 69 f7 brne .-38 ; 0x73e <hdlc_frame_data+0xae>
hdlc_escape_value(src[i], dest, &dest_index);
}
}
// Invert the FCS value accordingly to the specification
fcs ^= FCS_INVERT_MASK;
764: c0 94 com r12
766: d0 94 com r13
// Run through the FCS bytes and escape the values
for (i = 0; i < sizeof(fcs); i++) {
value = ((fcs >> (8 * i)) & 0xFF);
hdlc_escape_value(value, dest, &dest_index);
768: ae 01 movw r20, r28
76a: 4f 5f subi r20, 0xFF ; 255
76c: 5f 4f sbci r21, 0xFF ; 255
76e: b7 01 movw r22, r14
770: 8c 2d mov r24, r12
772: 0e 94 c6 01 call 0x38c ; 0x38c <hdlc_escape_value>
776: ae 01 movw r20, r28
778: 4f 5f subi r20, 0xFF ; 255
77a: 5f 4f sbci r21, 0xFF ; 255
77c: b7 01 movw r22, r14
77e: 8d 2d mov r24, r13
780: 0e 94 c6 01 call 0x38c ; 0x38c <hdlc_escape_value>
}
// Add end flag sequence and update length of frame
dest[dest_index++] = HDLC_FLAG_SEQUENCE;
784: 89 81 ldd r24, Y+1 ; 0x01
786: 9a 81 ldd r25, Y+2 ; 0x02
788: f7 01 movw r30, r14
78a: e8 0f add r30, r24
78c: f9 1f adc r31, r25
78e: 2e e7 ldi r18, 0x7E ; 126
790: 20 83 st Z, r18
*dest_len = dest_index;
792: 01 96 adiw r24, 0x01 ; 1
794: f3 01 movw r30, r6
796: 91 83 std Z+1, r25 ; 0x01
798: 80 83 st Z, r24
return 0;
79a: 80 e0 ldi r24, 0x00 ; 0
79c: 90 e0 ldi r25, 0x00 ; 0
79e: 0b c0 rjmp .+22 ; 0x7b6 <hdlc_frame_data+0x126>
unsigned char value = 0;
FCS_SIZE fcs = FCS_INIT_VALUE;
// Make sure that all parameters are valid
if (!control || (!src && (src_len > 0)) || !dest || !dest_len) {
return -EINVAL;
7a0: 8e e0 ldi r24, 0x0E ; 14
7a2: 92 ed ldi r25, 0xD2 ; 210
7a4: 08 c0 rjmp .+16 ; 0x7b6 <hdlc_frame_data+0x126>
7a6: 8e e0 ldi r24, 0x0E ; 14
7a8: 92 ed ldi r25, 0xD2 ; 210
7aa: 05 c0 rjmp .+10 ; 0x7b6 <hdlc_frame_data+0x126>
7ac: 8e e0 ldi r24, 0x0E ; 14
7ae: 92 ed ldi r25, 0xD2 ; 210
7b0: 02 c0 rjmp .+4 ; 0x7b6 <hdlc_frame_data+0x126>
7b2: 8e e0 ldi r24, 0x0E ; 14
7b4: 92 ed ldi r25, 0xD2 ; 210
// Add end flag sequence and update length of frame
dest[dest_index++] = HDLC_FLAG_SEQUENCE;
*dest_len = dest_index;
return 0;
7b6: 0f 90 pop r0
7b8: 0f 90 pop r0
7ba: df 91 pop r29
7bc: cf 91 pop r28
7be: 1f 91 pop r17
7c0: 0f 91 pop r16
7c2: ff 90 pop r15
7c4: ef 90 pop r14
7c6: df 90 pop r13
7c8: cf 90 pop r12
7ca: bf 90 pop r11
7cc: af 90 pop r10
7ce: 9f 90 pop r9
7d0: 8f 90 pop r8
7d2: 7f 90 pop r7
7d4: 6f 90 pop r6
7d6: 5f 90 pop r5
7d8: 08 95 ret
000007da <lcd_read>:
register char c;
while ( (c = pgm_read_byte(progmem_s++)) ) {
lcd_putc(c);
}
}
7da: cf 93 push r28
7dc: 88 23 and r24, r24
7de: 31 f0 breq .+12 ; 0x7ec <lcd_read+0x12>
7e0: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
7e4: 81 60 ori r24, 0x01 ; 1
7e6: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
7ea: 05 c0 rjmp .+10 ; 0x7f6 <lcd_read+0x1c>
7ec: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
7f0: 8e 7f andi r24, 0xFE ; 254
7f2: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
7f6: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
7fa: 82 60 ori r24, 0x02 ; 2
7fc: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
800: 60 91 42 03 lds r22, 0x0342 ; 0x800342 <__data_end>
804: 80 e0 ldi r24, 0x00 ; 0
806: 0e 94 95 06 call 0xd2a ; 0xd2a <pcf8574_setoutput>
80a: 62 e0 ldi r22, 0x02 ; 2
80c: 80 e0 ldi r24, 0x00 ; 0
80e: 0e 94 d6 06 call 0xdac ; 0xdac <pcf8574_setoutputpinhigh>
812: 00 c0 rjmp .+0 ; 0x814 <lcd_read+0x3a>
814: 64 e0 ldi r22, 0x04 ; 4
816: 80 e0 ldi r24, 0x00 ; 0
818: 0e 94 81 06 call 0xd02 ; 0xd02 <pcf8574_getoutputpin>
81c: c8 2f mov r28, r24
81e: 62 e0 ldi r22, 0x02 ; 2
820: 80 e0 ldi r24, 0x00 ; 0
822: 0e 94 da 06 call 0xdb4 ; 0xdb4 <pcf8574_setoutputpinlow>
826: 00 c0 rjmp .+0 ; 0x828 <lcd_read+0x4e>
828: 62 e0 ldi r22, 0x02 ; 2
82a: 80 e0 ldi r24, 0x00 ; 0
82c: 0e 94 d6 06 call 0xdac ; 0xdac <pcf8574_setoutputpinhigh>
830: 00 c0 rjmp .+0 ; 0x832 <lcd_read+0x58>
832: 64 e0 ldi r22, 0x04 ; 4
834: 80 e0 ldi r24, 0x00 ; 0
836: 0e 94 81 06 call 0xd02 ; 0xd02 <pcf8574_getoutputpin>
83a: c2 95 swap r28
83c: c0 7f andi r28, 0xF0 ; 240
83e: 8f 70 andi r24, 0x0F ; 15
840: c8 2b or r28, r24
842: 62 e0 ldi r22, 0x02 ; 2
844: 80 e0 ldi r24, 0x00 ; 0
846: 0e 94 da 06 call 0xdb4 ; 0xdb4 <pcf8574_setoutputpinlow>
84a: 8c 2f mov r24, r28
84c: cf 91 pop r28
84e: 08 95 ret
00000850 <lcd_waitbusy>:
850: 80 e0 ldi r24, 0x00 ; 0
852: 0e 94 ed 03 call 0x7da ; 0x7da <lcd_read>
856: 88 23 and r24, r24
858: dc f3 brlt .-10 ; 0x850 <lcd_waitbusy>
85a: 00 c0 rjmp .+0 ; 0x85c <lcd_waitbusy+0xc>
85c: 80 e0 ldi r24, 0x00 ; 0
85e: 0e 94 ed 03 call 0x7da ; 0x7da <lcd_read>
862: 08 95 ret
00000864 <toggle_e>:
864: 62 e0 ldi r22, 0x02 ; 2
866: 80 e0 ldi r24, 0x00 ; 0
868: 0e 94 d6 06 call 0xdac ; 0xdac <pcf8574_setoutputpinhigh>
86c: 00 c0 rjmp .+0 ; 0x86e <toggle_e+0xa>
86e: 62 e0 ldi r22, 0x02 ; 2
870: 80 e0 ldi r24, 0x00 ; 0
872: 0e 94 da 06 call 0xdb4 ; 0xdb4 <pcf8574_setoutputpinlow>
876: 08 95 ret
00000878 <lcd_write>:
878: cf 93 push r28
87a: c8 2f mov r28, r24
87c: 66 23 and r22, r22
87e: 31 f0 breq .+12 ; 0x88c <lcd_write+0x14>
880: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
884: 81 60 ori r24, 0x01 ; 1
886: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
88a: 05 c0 rjmp .+10 ; 0x896 <lcd_write+0x1e>
88c: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
890: 8e 7f andi r24, 0xFE ; 254
892: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
896: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
89a: 8d 7f andi r24, 0xFD ; 253
89c: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
8a0: 60 91 42 03 lds r22, 0x0342 ; 0x800342 <__data_end>
8a4: 80 e0 ldi r24, 0x00 ; 0
8a6: 0e 94 95 06 call 0xd2a ; 0xd2a <pcf8574_setoutput>
8aa: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
8ae: 8f 77 andi r24, 0x7F ; 127
8b0: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
8b4: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
8b8: 8f 7b andi r24, 0xBF ; 191
8ba: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
8be: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
8c2: 8f 7d andi r24, 0xDF ; 223
8c4: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
8c8: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
8cc: 8f 7e andi r24, 0xEF ; 239
8ce: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
8d2: cc 23 and r28, r28
8d4: 2c f4 brge .+10 ; 0x8e0 <lcd_write+0x68>
8d6: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
8da: 80 68 ori r24, 0x80 ; 128
8dc: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
8e0: c6 ff sbrs r28, 6
8e2: 05 c0 rjmp .+10 ; 0x8ee <lcd_write+0x76>
8e4: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
8e8: 80 64 ori r24, 0x40 ; 64
8ea: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
8ee: c5 ff sbrs r28, 5
8f0: 05 c0 rjmp .+10 ; 0x8fc <lcd_write+0x84>
8f2: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
8f6: 80 62 ori r24, 0x20 ; 32
8f8: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
8fc: c4 ff sbrs r28, 4
8fe: 05 c0 rjmp .+10 ; 0x90a <__stack+0xb>
900: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
904: 80 61 ori r24, 0x10 ; 16
906: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
90a: 60 91 42 03 lds r22, 0x0342 ; 0x800342 <__data_end>
90e: 80 e0 ldi r24, 0x00 ; 0
910: 0e 94 95 06 call 0xd2a ; 0xd2a <pcf8574_setoutput>
914: 0e 94 32 04 call 0x864 ; 0x864 <toggle_e>
918: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
91c: 8f 77 andi r24, 0x7F ; 127
91e: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
922: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
926: 8f 7b andi r24, 0xBF ; 191
928: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
92c: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
930: 8f 7d andi r24, 0xDF ; 223
932: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
936: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
93a: 8f 7e andi r24, 0xEF ; 239
93c: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
940: c3 ff sbrs r28, 3
942: 05 c0 rjmp .+10 ; 0x94e <__stack+0x4f>
944: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
948: 80 68 ori r24, 0x80 ; 128
94a: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
94e: c2 ff sbrs r28, 2
950: 05 c0 rjmp .+10 ; 0x95c <__stack+0x5d>
952: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
956: 80 64 ori r24, 0x40 ; 64
958: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
95c: c1 ff sbrs r28, 1
95e: 05 c0 rjmp .+10 ; 0x96a <__stack+0x6b>
960: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
964: 80 62 ori r24, 0x20 ; 32
966: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
96a: c0 ff sbrs r28, 0
96c: 05 c0 rjmp .+10 ; 0x978 <__stack+0x79>
96e: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
972: 80 61 ori r24, 0x10 ; 16
974: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
978: 60 91 42 03 lds r22, 0x0342 ; 0x800342 <__data_end>
97c: 80 e0 ldi r24, 0x00 ; 0
97e: 0e 94 95 06 call 0xd2a ; 0xd2a <pcf8574_setoutput>
982: 0e 94 32 04 call 0x864 ; 0x864 <toggle_e>
986: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
98a: 80 61 ori r24, 0x10 ; 16
98c: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
990: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
994: 80 62 ori r24, 0x20 ; 32
996: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
99a: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
99e: 80 64 ori r24, 0x40 ; 64
9a0: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
9a4: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
9a8: 80 68 ori r24, 0x80 ; 128
9aa: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
9ae: 60 91 42 03 lds r22, 0x0342 ; 0x800342 <__data_end>
9b2: 80 e0 ldi r24, 0x00 ; 0
9b4: 0e 94 95 06 call 0xd2a ; 0xd2a <pcf8574_setoutput>
9b8: cf 91 pop r28
9ba: 08 95 ret
000009bc <lcd_command>:
9bc: cf 93 push r28
9be: c8 2f mov r28, r24
9c0: 0e 94 28 04 call 0x850 ; 0x850 <lcd_waitbusy>
9c4: 60 e0 ldi r22, 0x00 ; 0
9c6: 8c 2f mov r24, r28
9c8: 0e 94 3c 04 call 0x878 ; 0x878 <lcd_write>
9cc: cf 91 pop r28
9ce: 08 95 ret
000009d0 <lcd_gotoxy>:
9d0: 61 11 cpse r22, r1
9d2: 04 c0 rjmp .+8 ; 0x9dc <lcd_gotoxy+0xc>
9d4: 80 58 subi r24, 0x80 ; 128
9d6: 0e 94 de 04 call 0x9bc ; 0x9bc <lcd_command>
9da: 08 95 ret
9dc: 80 54 subi r24, 0x40 ; 64
9de: 0e 94 de 04 call 0x9bc ; 0x9bc <lcd_command>
9e2: 08 95 ret
000009e4 <lcd_clrscr>:
9e4: 81 e0 ldi r24, 0x01 ; 1
9e6: 0e 94 de 04 call 0x9bc ; 0x9bc <lcd_command>
9ea: 08 95 ret
000009ec <lcd_led>:
9ec: 88 23 and r24, r24
9ee: 31 f0 breq .+12 ; 0x9fc <lcd_led+0x10>
9f0: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
9f4: 87 7f andi r24, 0xF7 ; 247
9f6: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
9fa: 05 c0 rjmp .+10 ; 0xa06 <lcd_led+0x1a>
9fc: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
a00: 88 60 ori r24, 0x08 ; 8
a02: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
a06: 60 91 42 03 lds r22, 0x0342 ; 0x800342 <__data_end>
a0a: 80 e0 ldi r24, 0x00 ; 0
a0c: 0e 94 95 06 call 0xd2a ; 0xd2a <pcf8574_setoutput>
a10: 08 95 ret
00000a12 <lcd_home>:
a12: 82 e0 ldi r24, 0x02 ; 2
a14: 0e 94 de 04 call 0x9bc ; 0x9bc <lcd_command>
a18: 08 95 ret
00000a1a <lcd_putc>:
a1a: cf 93 push r28
a1c: c8 2f mov r28, r24
a1e: 0e 94 28 04 call 0x850 ; 0x850 <lcd_waitbusy>
a22: ca 30 cpi r28, 0x0A ; 10
a24: 49 f4 brne .+18 ; 0xa38 <lcd_putc+0x1e>
a26: 80 34 cpi r24, 0x40 ; 64
a28: 10 f0 brcs .+4 ; 0xa2e <lcd_putc+0x14>
a2a: 80 e0 ldi r24, 0x00 ; 0
a2c: 01 c0 rjmp .+2 ; 0xa30 <lcd_putc+0x16>
a2e: 80 e4 ldi r24, 0x40 ; 64
a30: 80 58 subi r24, 0x80 ; 128
a32: 0e 94 de 04 call 0x9bc ; 0x9bc <lcd_command>
a36: 13 c0 rjmp .+38 ; 0xa5e <lcd_putc+0x44>
a38: 80 31 cpi r24, 0x10 ; 16
a3a: 29 f4 brne .+10 ; 0xa46 <lcd_putc+0x2c>
a3c: 60 e0 ldi r22, 0x00 ; 0
a3e: 80 ec ldi r24, 0xC0 ; 192
a40: 0e 94 3c 04 call 0x878 ; 0x878 <lcd_write>
a44: 06 c0 rjmp .+12 ; 0xa52 <lcd_putc+0x38>
a46: 80 35 cpi r24, 0x50 ; 80
a48: 21 f4 brne .+8 ; 0xa52 <lcd_putc+0x38>
a4a: 60 e0 ldi r22, 0x00 ; 0
a4c: 80 e8 ldi r24, 0x80 ; 128
a4e: 0e 94 3c 04 call 0x878 ; 0x878 <lcd_write>
a52: 0e 94 28 04 call 0x850 ; 0x850 <lcd_waitbusy>
a56: 61 e0 ldi r22, 0x01 ; 1
a58: 8c 2f mov r24, r28
a5a: 0e 94 3c 04 call 0x878 ; 0x878 <lcd_write>
a5e: cf 91 pop r28
a60: 08 95 ret
00000a62 <lcd_puts>:
a62: cf 93 push r28
a64: df 93 push r29
a66: ec 01 movw r28, r24
a68: 21 96 adiw r28, 0x01 ; 1
a6a: fc 01 movw r30, r24
a6c: 80 81 ld r24, Z
a6e: 88 23 and r24, r24
a70: 29 f0 breq .+10 ; 0xa7c <lcd_puts+0x1a>
a72: 0e 94 0d 05 call 0xa1a ; 0xa1a <lcd_putc>
a76: 89 91 ld r24, Y+
a78: 81 11 cpse r24, r1
a7a: fb cf rjmp .-10 ; 0xa72 <lcd_puts+0x10>
a7c: df 91 pop r29
a7e: cf 91 pop r28
a80: 08 95 ret
00000a82 <lcd_init>:
// инициализация дисплея
void lcd_init(uint8_t dispAttr)
{
a82: 1f 93 push r17
a84: cf 93 push r28
a86: df 93 push r29
a88: 18 2f mov r17, r24
#if LCD_PCF8574_INIT == 1
//инициализация pcf
pcf8574_init();
a8a: 0e 94 78 06 call 0xcf0 ; 0xcf0 <pcf8574_init>
#endif
dataport = 0;
a8e: 10 92 42 03 sts 0x0342, r1 ; 0x800342 <__data_end>
pcf8574_setoutput(LCD_PCF8574_DEVICEID, dataport);
a92: 60 91 42 03 lds r22, 0x0342 ; 0x800342 <__data_end>
a96: 80 e0 ldi r24, 0x00 ; 0
a98: 0e 94 95 06 call 0xd2a ; 0xd2a <pcf8574_setoutput>
static inline void _delayFourCycles(unsigned int __count)
{
if ( __count == 0 )
__asm__ __volatile__( "rjmp 1f\n 1:" );
else
__asm__ __volatile__ (
a9c: 80 ea ldi r24, 0xA0 ; 160
a9e: 9f e0 ldi r25, 0x0F ; 15
aa0: 01 97 sbiw r24, 0x01 ; 1
aa2: f1 f7 brne .-4 ; 0xaa0 <lcd_init+0x1e>
pcf8574_setoutput(LCD_PCF8574_DEVICEID, dataport);
delay(16000);
// первоначальная запись на ЖК-дисплей — 8 бит
dataport |= _BV(LCD_DATA1_PIN); // _BV(LCD_FUNCTION)>>4;
aa4: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
aa8: 80 62 ori r24, 0x20 ; 32
aaa: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
dataport |= _BV(LCD_DATA0_PIN); // _BV(LCD_FUNCTION_8BIT)>>4;
aae: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
ab2: 80 61 ori r24, 0x10 ; 16
ab4: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
pcf8574_setoutput(LCD_PCF8574_DEVICEID, dataport);
ab8: 60 91 42 03 lds r22, 0x0342 ; 0x800342 <__data_end>
abc: 80 e0 ldi r24, 0x00 ; 0
abe: 0e 94 95 06 call 0xd2a ; 0xd2a <pcf8574_setoutput>
// дрючим дисплей чтобы он начал работать
lcd_e_toggle();
ac2: 0e 94 32 04 call 0x864 ; 0x864 <toggle_e>
static inline void _delayFourCycles(unsigned int __count)
{
if ( __count == 0 )
__asm__ __volatile__( "rjmp 1f\n 1:" );
else
__asm__ __volatile__ (
ac6: 80 ee ldi r24, 0xE0 ; 224
ac8: 94 e0 ldi r25, 0x04 ; 4
aca: 01 97 sbiw r24, 0x01 ; 1
acc: f1 f7 brne .-4 ; 0xaca <lcd_init+0x48>
pcf8574_setoutput(LCD_PCF8574_DEVICEID, dataport);
// дрючим дисплей чтобы он начал работать
lcd_e_toggle();
delay(4992);
lcd_e_toggle();
ace: 0e 94 32 04 call 0x864 ; 0x864 <toggle_e>
static inline void _delayFourCycles(unsigned int __count)
{
if ( __count == 0 )
__asm__ __volatile__( "rjmp 1f\n 1:" );
else
__asm__ __volatile__ (
ad2: c0 e1 ldi r28, 0x10 ; 16
ad4: d0 e0 ldi r29, 0x00 ; 0
ad6: ce 01 movw r24, r28
ad8: 01 97 sbiw r24, 0x01 ; 1
ada: f1 f7 brne .-4 ; 0xad8 <lcd_init+0x56>
// дрючим дисплей чтобы он начал работать
lcd_e_toggle();
delay(4992);
lcd_e_toggle();
delay(64);
lcd_e_toggle();
adc: 0e 94 32 04 call 0x864 ; 0x864 <toggle_e>
static inline void _delayFourCycles(unsigned int __count)
{
if ( __count == 0 )
__asm__ __volatile__( "rjmp 1f\n 1:" );
else
__asm__ __volatile__ (
ae0: ce 01 movw r24, r28
ae2: 01 97 sbiw r24, 0x01 ; 1
ae4: f1 f7 brne .-4 ; 0xae2 <lcd_init+0x60>
delay(64);
lcd_e_toggle();
delay(64);
// переходим в 4 битный режим
dataport &= ~_BV(LCD_DATA0_PIN);
ae6: 80 91 42 03 lds r24, 0x0342 ; 0x800342 <__data_end>
aea: 8f 7e andi r24, 0xEF ; 239
aec: 80 93 42 03 sts 0x0342, r24 ; 0x800342 <__data_end>
pcf8574_setoutput(LCD_PCF8574_DEVICEID, dataport);
af0: 60 91 42 03 lds r22, 0x0342 ; 0x800342 <__data_end>
af4: 80 e0 ldi r24, 0x00 ; 0
af6: 0e 94 95 06 call 0xd2a ; 0xd2a <pcf8574_setoutput>
lcd_e_toggle();
afa: 0e 94 32 04 call 0x864 ; 0x864 <toggle_e>
static inline void _delayFourCycles(unsigned int __count)
{
if ( __count == 0 )
__asm__ __volatile__( "rjmp 1f\n 1:" );
else
__asm__ __volatile__ (
afe: 21 97 sbiw r28, 0x01 ; 1
b00: f1 f7 brne .-4 ; 0xafe <lcd_init+0x7c>
pcf8574_setoutput(LCD_PCF8574_DEVICEID, dataport);
lcd_e_toggle();
delay(64);
lcd_command(LCD_FUNCTION_DEFAULT); // настраиваем кол-во строк
b02: 88 e2 ldi r24, 0x28 ; 40
b04: 0e 94 de 04 call 0x9bc ; 0x9bc <lcd_command>
lcd_command(LCD_DISP_OFF); // вырубаем дисплей
b08: 88 e0 ldi r24, 0x08 ; 8
b0a: 0e 94 de 04 call 0x9bc ; 0x9bc <lcd_command>
lcd_clrscr(); // чистим экран
b0e: 0e 94 f2 04 call 0x9e4 ; 0x9e4 <lcd_clrscr>
lcd_command(LCD_MODE_DEFAULT); // запускаемся в стандартном режиме
b12: 86 e0 ldi r24, 0x06 ; 6
b14: 0e 94 de 04 call 0x9bc ; 0x9bc <lcd_command>
lcd_command(dispAttr); // отправляем настройки
b18: 81 2f mov r24, r17
b1a: 0e 94 de 04 call 0x9bc ; 0x9bc <lcd_command>
}
b1e: df 91 pop r29
b20: cf 91 pop r28
b22: 1f 91 pop r17
b24: 08 95 ret
00000b26 <Lcd_inciliation>:
struct TextCounter textCounter;
//struct TextCounter textCounter;
void Lcd_inciliation() {
lcd_init(LCD_DISP_ON_BLINK); // инициализация дисплея
b26: 8d e0 ldi r24, 0x0D ; 13
b28: 0e 94 41 05 call 0xa82 ; 0xa82 <lcd_init>
lcd_home(); // домой курсор
b2c: 0e 94 09 05 call 0xa12 ; 0xa12 <lcd_home>
lcd_led(0); // вкл подсветки
b30: 80 e0 ldi r24, 0x00 ; 0
b32: 0e 94 f6 04 call 0x9ec ; 0x9ec <lcd_led>
b36: 08 95 ret
00000b38 <fillBuffer1>:
//textCounter.startTime = millis(); // Запоминаем время запуска программы
//Из за строчки выше все ломается
}
void fillBuffer1(const char* source, char* buffer, size_t bufferSize, int incrementValue) {
b38: cf 92 push r12
b3a: df 92 push r13
b3c: ef 92 push r14
b3e: ff 92 push r15
b40: 0f 93 push r16
b42: 1f 93 push r17
b44: cf 93 push r28
b46: df 93 push r29
b48: 8c 01 movw r16, r24
b4a: 7b 01 movw r14, r22
b4c: c9 01 movw r24, r18
int startIndex = incrementValue % strlen(source); // Определяем начальный индекс на основе incrementValue
b4e: f8 01 movw r30, r16
b50: 01 90 ld r0, Z+
b52: 00 20 and r0, r0
b54: e9 f7 brne .-6 ; 0xb50 <fillBuffer1+0x18>
b56: 31 97 sbiw r30, 0x01 ; 1
b58: bf 01 movw r22, r30
b5a: 60 1b sub r22, r16
b5c: 71 0b sbc r23, r17
b5e: 0e 94 76 0b call 0x16ec ; 0x16ec <__udivmodhi4>
b62: 67 01 movw r12, r14
b64: 20 e1 ldi r18, 0x10 ; 16
b66: c2 0e add r12, r18
b68: d1 1c adc r13, r1
b6a: e7 01 movw r28, r14
int endIndex = startIndex + 16;
for (int i = 0; i < 16; ++i) {
buffer[i] = source[(startIndex + i) % strlen(source)];
b6c: 9c 01 movw r18, r24
b6e: 2e 19 sub r18, r14
b70: 3f 09 sbc r19, r15
b72: f8 01 movw r30, r16
b74: 01 90 ld r0, Z+
b76: 00 20 and r0, r0
b78: e9 f7 brne .-6 ; 0xb74 <fillBuffer1+0x3c>
b7a: 31 97 sbiw r30, 0x01 ; 1
b7c: bf 01 movw r22, r30
b7e: 60 1b sub r22, r16
b80: 71 0b sbc r23, r17
b82: c9 01 movw r24, r18
b84: 8c 0f add r24, r28
b86: 9d 1f adc r25, r29
b88: 0e 94 76 0b call 0x16ec ; 0x16ec <__udivmodhi4>
b8c: f8 01 movw r30, r16
b8e: e8 0f add r30, r24
b90: f9 1f adc r31, r25
b92: 80 81 ld r24, Z
b94: 89 93 st Y+, r24
void fillBuffer1(const char* source, char* buffer, size_t bufferSize, int incrementValue) {
int startIndex = incrementValue % strlen(source); // Определяем начальный индекс на основе incrementValue
int endIndex = startIndex + 16;
for (int i = 0; i < 16; ++i) {
b96: cc 15 cp r28, r12
b98: dd 05 cpc r29, r13
b9a: 59 f7 brne .-42 ; 0xb72 <fillBuffer1+0x3a>
buffer[i] = source[(startIndex + i) % strlen(source)];
}
buffer[16] = '\0'; // Установка нулевого символа в конце буфера
b9c: f7 01 movw r30, r14
b9e: 10 8a std Z+16, r1 ; 0x10
}
ba0: df 91 pop r29
ba2: cf 91 pop r28
ba4: 1f 91 pop r17
ba6: 0f 91 pop r16
ba8: ff 90 pop r15
baa: ef 90 pop r14
bac: df 90 pop r13
bae: cf 90 pop r12
bb0: 08 95 ret
00000bb2 <fillBuffer2>:
void fillBuffer2(float value1, float value2, float value3, char* buffer, size_t bufferSize) {
bb2: af 92 push r10
bb4: bf 92 push r11
bb6: cf 92 push r12
bb8: df 92 push r13
bba: ef 92 push r14
bbc: ff 92 push r15
bbe: 0f 93 push r16
bc0: 1f 93 push r17
snprintf(buffer, bufferSize, "%.2f.%.2f.%.2f", value1, value2, value3);
bc2: 1f 93 push r17
bc4: 0f 93 push r16
bc6: ff 92 push r15
bc8: ef 92 push r14
bca: 5f 93 push r21
bcc: 4f 93 push r20
bce: 3f 93 push r19
bd0: 2f 93 push r18
bd2: 9f 93 push r25
bd4: 8f 93 push r24
bd6: 7f 93 push r23
bd8: 6f 93 push r22
bda: 86 e1 ldi r24, 0x16 ; 22
bdc: 93 e0 ldi r25, 0x03 ; 3
bde: 9f 93 push r25
be0: 8f 93 push r24
be2: bf 92 push r11
be4: af 92 push r10
be6: df 92 push r13
be8: cf 92 push r12
bea: 0e 94 af 0b call 0x175e ; 0x175e <snprintf>
}
bee: 8d b7 in r24, 0x3d ; 61
bf0: 9e b7 in r25, 0x3e ; 62
bf2: 42 96 adiw r24, 0x12 ; 18
bf4: 0f b6 in r0, 0x3f ; 63
bf6: f8 94 cli
bf8: 9e bf out 0x3e, r25 ; 62
bfa: 0f be out 0x3f, r0 ; 63
bfc: 8d bf out 0x3d, r24 ; 61
bfe: 1f 91 pop r17
c00: 0f 91 pop r16
c02: ff 90 pop r15
c04: ef 90 pop r14
c06: df 90 pop r13
c08: cf 90 pop r12
c0a: bf 90 pop r11
c0c: af 90 pop r10
c0e: 08 95 ret
00000c10 <printLcd>:
void printLcd(struct DisplayData* displayData) {
c10: 6f 92 push r6
c12: 7f 92 push r7
c14: af 92 push r10
c16: bf 92 push r11
c18: cf 92 push r12
c1a: df 92 push r13
c1c: ef 92 push r14
c1e: ff 92 push r15
c20: 0f 93 push r16
c22: 1f 93 push r17
c24: cf 93 push r28
c26: df 93 push r29
c28: cd b7 in r28, 0x3d ; 61
c2a: de b7 in r29, 0x3e ; 62
c2c: c2 54 subi r28, 0x42 ; 66
c2e: d1 09 sbc r29, r1
c30: 0f b6 in r0, 0x3f ; 63
c32: f8 94 cli
c34: de bf out 0x3e, r29 ; 62
c36: 0f be out 0x3f, r0 ; 63
c38: cd bf out 0x3d, r28 ; 61
c3a: 3c 01 movw r6, r24
// Буферы для заполнения данных
char buffer1[17];
char buffer2[17];
// Заполнение буфера 1
fillBuffer1(displayData->topLine, buffer1, sizeof(buffer1), textCounter.incrementValue);
c3c: 20 91 49 03 lds r18, 0x0349 ; 0x800349 <textCounter+0x4>
c40: 30 91 4a 03 lds r19, 0x034A ; 0x80034a <textCounter+0x5>
c44: 41 e1 ldi r20, 0x11 ; 17
c46: 50 e0 ldi r21, 0x00 ; 0
c48: be 01 movw r22, r28
c4a: 6f 5f subi r22, 0xFF ; 255
c4c: 7f 4f sbci r23, 0xFF ; 255
c4e: 0e 94 9c 05 call 0xb38 ; 0xb38 <fillBuffer1>
// Заполнение буфера 2
fillBuffer2(displayData->value1, displayData->value2, displayData->value3, buffer2, sizeof(buffer2));
c52: f3 01 movw r30, r6
c54: e8 5b subi r30, 0xB8 ; 184
c56: ff 4f sbci r31, 0xFF ; 255
c58: e0 80 ld r14, Z
c5a: f1 80 ldd r15, Z+1 ; 0x01
c5c: 02 81 ldd r16, Z+2 ; 0x02
c5e: 13 81 ldd r17, Z+3 ; 0x03
c60: 34 97 sbiw r30, 0x04 ; 4
c62: 20 81 ld r18, Z
c64: 31 81 ldd r19, Z+1 ; 0x01
c66: 42 81 ldd r20, Z+2 ; 0x02
c68: 53 81 ldd r21, Z+3 ; 0x03
c6a: 34 97 sbiw r30, 0x04 ; 4
c6c: 60 81 ld r22, Z
c6e: 71 81 ldd r23, Z+1 ; 0x01
c70: 82 81 ldd r24, Z+2 ; 0x02
c72: 93 81 ldd r25, Z+3 ; 0x03
c74: 0f 2e mov r0, r31
c76: f1 e1 ldi r31, 0x11 ; 17
c78: af 2e mov r10, r31
c7a: b1 2c mov r11, r1
c7c: f0 2d mov r31, r0
c7e: fe 01 movw r30, r28
c80: 72 96 adiw r30, 0x12 ; 18
c82: 6f 01 movw r12, r30
c84: 0e 94 d9 05 call 0xbb2 ; 0xbb2 <fillBuffer2>
// Создание массива для вывода на дисплей
char displayArray[32];
strncpy(displayArray, buffer1, 16); // Копирование первых 16 символов из buffer1 в displayArray
c88: 40 e1 ldi r20, 0x10 ; 16
c8a: 50 e0 ldi r21, 0x00 ; 0
c8c: be 01 movw r22, r28
c8e: 6f 5f subi r22, 0xFF ; 255
c90: 7f 4f sbci r23, 0xFF ; 255
c92: ce 01 movw r24, r28
c94: 83 96 adiw r24, 0x23 ; 35
c96: 0e 94 8a 0b call 0x1714 ; 0x1714 <strncpy>
strncpy(displayArray + 16, buffer2, 16); // Копирование первых 16 символов из buffer2 в displayArray, начиная с позиции 16
c9a: 40 e1 ldi r20, 0x10 ; 16
c9c: 50 e0 ldi r21, 0x00 ; 0
c9e: b6 01 movw r22, r12
ca0: ce 01 movw r24, r28
ca2: c3 96 adiw r24, 0x33 ; 51
ca4: 0e 94 8a 0b call 0x1714 ; 0x1714 <strncpy>
// Вывод данных на экран
lcd_gotoxy(0, 0);
ca8: 60 e0 ldi r22, 0x00 ; 0
caa: 80 e0 ldi r24, 0x00 ; 0
cac: 0e 94 e8 04 call 0x9d0 ; 0x9d0 <lcd_gotoxy>
lcd_puts(displayArray);
cb0: ce 01 movw r24, r28
cb2: 83 96 adiw r24, 0x23 ; 35
cb4: 0e 94 31 05 call 0xa62 ; 0xa62 <lcd_puts>
lcd_gotoxy(0, 1);
cb8: 61 e0 ldi r22, 0x01 ; 1
cba: 80 e0 ldi r24, 0x00 ; 0
cbc: 0e 94 e8 04 call 0x9d0 ; 0x9d0 <lcd_gotoxy>
lcd_puts(displayArray + 16); // Вывод второй половины displayArray
cc0: ce 01 movw r24, r28
cc2: c3 96 adiw r24, 0x33 ; 51
cc4: 0e 94 31 05 call 0xa62 ; 0xa62 <lcd_puts>
}
cc8: ce 5b subi r28, 0xBE ; 190
cca: df 4f sbci r29, 0xFF ; 255
ccc: 0f b6 in r0, 0x3f ; 63
cce: f8 94 cli
cd0: de bf out 0x3e, r29 ; 62
cd2: 0f be out 0x3f, r0 ; 63
cd4: cd bf out 0x3d, r28 ; 61
cd6: df 91 pop r29
cd8: cf 91 pop r28
cda: 1f 91 pop r17
cdc: 0f 91 pop r16
cde: ff 90 pop r15
ce0: ef 90 pop r14
ce2: df 90 pop r13
ce4: cf 90 pop r12
ce6: bf 90 pop r11
ce8: af 90 pop r10
cea: 7f 90 pop r7
cec: 6f 90 pop r6
cee: 08 95 ret
00000cf0 <pcf8574_init>:
i2c_write(b);
i2c_stop();
return 0;
}
return -1;
}
cf0: 0e 94 de 06 call 0xdbc ; 0xdbc <i2c_init>
cf4: 83 e0 ldi r24, 0x03 ; 3
cf6: 8a 95 dec r24
cf8: f1 f7 brne .-4 ; 0xcf6 <pcf8574_init+0x6>
cfa: 00 00 nop
cfc: 10 92 4b 03 sts 0x034B, r1 ; 0x80034b <pcf8574_pinstatus>
d00: 08 95 ret
00000d02 <pcf8574_getoutputpin>:
d02: 81 11 cpse r24, r1
d04: 0e c0 rjmp .+28 ; 0xd22 <pcf8574_getoutputpin+0x20>
d06: 68 30 cpi r22, 0x08 ; 8
d08: 70 f4 brcc .+28 ; 0xd26 <pcf8574_getoutputpin+0x24>
d0a: 80 91 4b 03 lds r24, 0x034B ; 0x80034b <pcf8574_pinstatus>
d0e: 08 2e mov r0, r24
d10: 00 0c add r0, r0
d12: 99 0b sbc r25, r25
d14: 02 c0 rjmp .+4 ; 0xd1a <pcf8574_getoutputpin+0x18>
d16: 95 95 asr r25
d18: 87 95 ror r24
d1a: 6a 95 dec r22
d1c: e2 f7 brpl .-8 ; 0xd16 <pcf8574_getoutputpin+0x14>
d1e: 81 70 andi r24, 0x01 ; 1
d20: 08 95 ret
d22: 8f ef ldi r24, 0xFF ; 255
d24: 08 95 ret
d26: 8f ef ldi r24, 0xFF ; 255
d28: 08 95 ret
00000d2a <pcf8574_setoutput>:
d2a: cf 93 push r28
d2c: 81 11 cpse r24, r1
d2e: 0d c0 rjmp .+26 ; 0xd4a <pcf8574_setoutput+0x20>
d30: c6 2f mov r28, r22
d32: 60 93 4b 03 sts 0x034B, r22 ; 0x80034b <pcf8574_pinstatus>
d36: 8e e4 ldi r24, 0x4E ; 78
d38: 0e 94 e4 06 call 0xdc8 ; 0xdc8 <i2c_start>
d3c: 8c 2f mov r24, r28
d3e: 0e 94 14 07 call 0xe28 ; 0xe28 <i2c_write>
d42: 0e 94 0b 07 call 0xe16 ; 0xe16 <i2c_stop>
d46: 80 e0 ldi r24, 0x00 ; 0
d48: 01 c0 rjmp .+2 ; 0xd4c <pcf8574_setoutput+0x22>
d4a: 8f ef ldi r24, 0xFF ; 255
d4c: cf 91 pop r28
d4e: 08 95 ret
00000d50 <pcf8574_setoutputpin>:
// настройка пинов вывода
int8_t pcf8574_setoutputpin(uint8_t deviceid, uint8_t pin, uint8_t data) {
d50: cf 93 push r28
d52: df 93 push r29
if((deviceid >= 0 && deviceid < PCF8574_MAXDEVICES) && (pin >= 0 && pin < PCF8574_MAXPINS)) {
d54: 81 11 cpse r24, r1
d56: 24 c0 rjmp .+72 ; 0xda0 <pcf8574_setoutputpin+0x50>
d58: 68 30 cpi r22, 0x08 ; 8
d5a: 20 f5 brcc .+72 ; 0xda4 <pcf8574_setoutputpin+0x54>
uint8_t b = 0;
b = pcf8574_pinstatus[deviceid];
d5c: 80 91 4b 03 lds r24, 0x034B ; 0x80034b <pcf8574_pinstatus>
b = (data != 0) ? (b | (1 << pin)) : (b & ~(1 << pin));
d60: 44 23 and r20, r20
d62: 49 f0 breq .+18 ; 0xd76 <pcf8574_setoutputpin+0x26>
d64: c1 e0 ldi r28, 0x01 ; 1
d66: d0 e0 ldi r29, 0x00 ; 0
d68: 02 c0 rjmp .+4 ; 0xd6e <pcf8574_setoutputpin+0x1e>
d6a: cc 0f add r28, r28
d6c: dd 1f adc r29, r29
d6e: 6a 95 dec r22
d70: e2 f7 brpl .-8 ; 0xd6a <pcf8574_setoutputpin+0x1a>
d72: c8 2b or r28, r24
d74: 09 c0 rjmp .+18 ; 0xd88 <pcf8574_setoutputpin+0x38>
d76: c1 e0 ldi r28, 0x01 ; 1
d78: d0 e0 ldi r29, 0x00 ; 0
d7a: 02 c0 rjmp .+4 ; 0xd80 <pcf8574_setoutputpin+0x30>
d7c: cc 0f add r28, r28
d7e: dd 1f adc r29, r29
d80: 6a 95 dec r22
d82: e2 f7 brpl .-8 ; 0xd7c <pcf8574_setoutputpin+0x2c>
d84: c0 95 com r28
d86: c8 23 and r28, r24
pcf8574_pinstatus[deviceid] = b;
d88: c0 93 4b 03 sts 0x034B, r28 ; 0x80034b <pcf8574_pinstatus>
//рестартим
i2c_start(((PCF8574_ADDRBASE+deviceid)<<1) | I2C_WRITE);
d8c: 8e e4 ldi r24, 0x4E ; 78
d8e: 0e 94 e4 06 call 0xdc8 ; 0xdc8 <i2c_start>
i2c_write(b);
d92: 8c 2f mov r24, r28
d94: 0e 94 14 07 call 0xe28 ; 0xe28 <i2c_write>
i2c_stop();
d98: 0e 94 0b 07 call 0xe16 ; 0xe16 <i2c_stop>
return 0;
d9c: 80 e0 ldi r24, 0x00 ; 0
d9e: 03 c0 rjmp .+6 ; 0xda6 <pcf8574_setoutputpin+0x56>
}
return -1;
da0: 8f ef ldi r24, 0xFF ; 255
da2: 01 c0 rjmp .+2 ; 0xda6 <pcf8574_setoutputpin+0x56>
da4: 8f ef ldi r24, 0xFF ; 255
}
da6: df 91 pop r29
da8: cf 91 pop r28
daa: 08 95 ret
00000dac <pcf8574_setoutputpinhigh>:
// установка высокого уровня на выходных пинах
int8_t pcf8574_setoutputpinhigh(uint8_t deviceid, uint8_t pin) {
return pcf8574_setoutputpin(deviceid, pin, 1);
dac: 41 e0 ldi r20, 0x01 ; 1
dae: 0e 94 a8 06 call 0xd50 ; 0xd50 <pcf8574_setoutputpin>
}
db2: 08 95 ret
00000db4 <pcf8574_setoutputpinlow>:
// установка низкого уровня на выходных пинах
int8_t pcf8574_setoutputpinlow(uint8_t deviceid, uint8_t pin) {
return pcf8574_setoutputpin(deviceid, pin, 0);
db4: 40 e0 ldi r20, 0x00 ; 0
db6: 0e 94 a8 06 call 0xd50 ; 0xd50 <pcf8574_setoutputpin>
}
dba: 08 95 ret
00000dbc <i2c_init>:
// тупа повторяем условие СТАРТ
unsigned char i2c_rep_start(unsigned char address)
{
return i2c_start(address);
}
dbc: 10 92 b9 00 sts 0x00B9, r1 ; 0x8000b9 <__DATA_REGION_ORIGIN__+0x59>
dc0: 8d ef ldi r24, 0xFD ; 253
dc2: 80 93 b8 00 sts 0x00B8, r24 ; 0x8000b8 <__DATA_REGION_ORIGIN__+0x58>
dc6: 08 95 ret
00000dc8 <i2c_start>:
dc8: 94 ea ldi r25, 0xA4 ; 164
dca: 90 93 bc 00 sts 0x00BC, r25 ; 0x8000bc <__DATA_REGION_ORIGIN__+0x5c>
dce: ec eb ldi r30, 0xBC ; 188
dd0: f0 e0 ldi r31, 0x00 ; 0
dd2: 90 81 ld r25, Z
dd4: 99 23 and r25, r25
dd6: ec f7 brge .-6 ; 0xdd2 <i2c_start+0xa>
dd8: 90 91 b9 00 lds r25, 0x00B9 ; 0x8000b9 <__DATA_REGION_ORIGIN__+0x59>
ddc: 98 7f andi r25, 0xF8 ; 248
dde: 98 30 cpi r25, 0x08 ; 8
de0: 11 f0 breq .+4 ; 0xde6 <i2c_start+0x1e>
de2: 90 31 cpi r25, 0x10 ; 16
de4: a1 f4 brne .+40 ; 0xe0e <i2c_start+0x46>
de6: 80 93 bb 00 sts 0x00BB, r24 ; 0x8000bb <__DATA_REGION_ORIGIN__+0x5b>
dea: 84 e8 ldi r24, 0x84 ; 132
dec: 80 93 bc 00 sts 0x00BC, r24 ; 0x8000bc <__DATA_REGION_ORIGIN__+0x5c>
df0: ec eb ldi r30, 0xBC ; 188
df2: f0 e0 ldi r31, 0x00 ; 0
df4: 80 81 ld r24, Z
df6: 88 23 and r24, r24
df8: ec f7 brge .-6 ; 0xdf4 <i2c_start+0x2c>
dfa: 90 91 b9 00 lds r25, 0x00B9 ; 0x8000b9 <__DATA_REGION_ORIGIN__+0x59>
dfe: 98 7f andi r25, 0xF8 ; 248
e00: 98 31 cpi r25, 0x18 ; 24
e02: 39 f0 breq .+14 ; 0xe12 <i2c_start+0x4a>
e04: 81 e0 ldi r24, 0x01 ; 1
e06: 90 34 cpi r25, 0x40 ; 64
e08: 29 f4 brne .+10 ; 0xe14 <i2c_start+0x4c>
e0a: 80 e0 ldi r24, 0x00 ; 0
e0c: 08 95 ret
e0e: 81 e0 ldi r24, 0x01 ; 1
e10: 08 95 ret
e12: 80 e0 ldi r24, 0x00 ; 0
e14: 08 95 ret
00000e16 <i2c_stop>:
// передача условия СТОП на шину
void i2c_stop(void)
{
// отправка условия СТОП
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
e16: 84 e9 ldi r24, 0x94 ; 148
e18: 80 93 bc 00 sts 0x00BC, r24 ; 0x8000bc <__DATA_REGION_ORIGIN__+0x5c>
// ждем выполнения условия остановки
while(TWCR & (1<<TWSTO));
e1c: ec eb ldi r30, 0xBC ; 188
e1e: f0 e0 ldi r31, 0x00 ; 0
e20: 80 81 ld r24, Z
e22: 84 fd sbrc r24, 4
e24: fd cf rjmp .-6 ; 0xe20 <i2c_stop+0xa>
}
e26: 08 95 ret
00000e28 <i2c_write>:
unsigned char i2c_write( unsigned char data )
{
uint8_t twst;
// отправляем данные на уст-во
TWDR = data;
e28: 80 93 bb 00 sts 0x00BB, r24 ; 0x8000bb <__DATA_REGION_ORIGIN__+0x5b>
TWCR = (1<<TWINT) | (1<<TWEN);
e2c: 84 e8 ldi r24, 0x84 ; 132
e2e: 80 93 bc 00 sts 0x00BC, r24 ; 0x8000bc <__DATA_REGION_ORIGIN__+0x5c>
// ждем завершения передачи
while(!(TWCR & (1<<TWINT)));
e32: ec eb ldi r30, 0xBC ; 188
e34: f0 e0 ldi r31, 0x00 ; 0
e36: 80 81 ld r24, Z
e38: 88 23 and r24, r24
e3a: ec f7 brge .-6 ; 0xe36 <i2c_write+0xe>
// записываем ответ от ведомого уст-ва
twst = TW_STATUS & 0xF8;
e3c: 90 91 b9 00 lds r25, 0x00B9 ; 0x8000b9 <__DATA_REGION_ORIGIN__+0x59>
e40: 98 7f andi r25, 0xF8 ; 248
e42: 81 e0 ldi r24, 0x01 ; 1
e44: 98 32 cpi r25, 0x28 ; 40
e46: 09 f4 brne .+2 ; 0xe4a <i2c_write+0x22>
e48: 80 e0 ldi r24, 0x00 ; 0
if( twst != TW_MT_DATA_ACK) return 1;
return 0;
}
e4a: 08 95 ret
00000e4c <main>:
#include "UART/uart.h"
#include "stdbool.h"
#include "LCD/lcd.h"
#include "Protocol/protocol.h"
int main(void) {
e4c: 4f 92 push r4
e4e: 5f 92 push r5
e50: 6f 92 push r6
e52: 7f 92 push r7
e54: 8f 92 push r8
e56: 9f 92 push r9
e58: af 92 push r10
e5a: bf 92 push r11
e5c: cf 92 push r12
e5e: df 92 push r13
e60: ef 92 push r14
e62: ff 92 push r15
e64: 0f 93 push r16
e66: 1f 93 push r17
e68: cf 93 push r28
e6a: df 93 push r29
e6c: cd b7 in r28, 0x3d ; 61
e6e: de b7 in r29, 0x3e ; 62
e70: c3 50 subi r28, 0x03 ; 3
e72: d2 40 sbci r29, 0x02 ; 2
e74: 0f b6 in r0, 0x3f ; 63
e76: f8 94 cli
e78: de bf out 0x3e, r29 ; 62
e7a: 0f be out 0x3f, r0 ; 63
e7c: cd bf out 0x3d, r28 ; 61
struct Client hdlc;
bool flag_connection = false;
Lcd_inciliation();
e7e: 0e 94 93 05 call 0xb26 ; 0xb26 <Lcd_inciliation>
UART_init();
e82: 0e 94 9e 0a call 0x153c ; 0x153c <UART_init>
init_hdlc_client(&hdlc, 200);
e86: 68 ec ldi r22, 0xC8 ; 200
e88: 70 e0 ldi r23, 0x00 ; 0
e8a: ce 01 movw r24, r28
e8c: 01 96 adiw r24, 0x01 ; 1
e8e: 0e 94 53 00 call 0xa6 ; 0xa6 <init_hdlc_client>
// while(true){
// if (!flag_connection){
// }
// }
hdlc_connect(&hdlc);
e92: ce 01 movw r24, r28
e94: 01 96 adiw r24, 0x01 ; 1
e96: 0e 94 6c 00 call 0xd8 ; 0xd8 <hdlc_connect>
uint8_t buffer[10];
hdlc_get_raw_frame(&hdlc, buffer, sizeof buffer);
e9a: 4a e0 ldi r20, 0x0A ; 10
e9c: 50 e0 ldi r21, 0x00 ; 0
e9e: be 01 movw r22, r28
ea0: 66 5e subi r22, 0xE6 ; 230
ea2: 7f 4f sbci r23, 0xFF ; 255
ea4: ce 01 movw r24, r28
ea6: 01 96 adiw r24, 0x01 ; 1
ea8: 0e 94 91 00 call 0x122 ; 0x122 <hdlc_get_raw_frame>
UART_send(buffer, sizeof buffer);
eac: 6a e0 ldi r22, 0x0A ; 10
eae: 70 e0 ldi r23, 0x00 ; 0
eb0: ce 01 movw r24, r28
eb2: 4a 96 adiw r24, 0x1a ; 26
eb4: 0e 94 aa 0a call 0x1554 ; 0x1554 <UART_send>
while(!flag_connection){
uint8_t* buffer_recive[10];
UART_receive(buffer_recive, sizeof buffer_recive);
eb8: 64 e1 ldi r22, 0x14 ; 20
eba: 70 e0 ldi r23, 0x00 ; 0
ebc: ce 01 movw r24, r28
ebe: 80 51 subi r24, 0x10 ; 16
ec0: 9e 4f sbci r25, 0xFE ; 254
ec2: 0e 94 ce 0a call 0x159c ; 0x159c <UART_receive>
int err = hdlc_timeout_handler(&hdlc, 1);
ec6: 61 e0 ldi r22, 0x01 ; 1
ec8: 70 e0 ldi r23, 0x00 ; 0
eca: ce 01 movw r24, r28
ecc: 01 96 adiw r24, 0x01 ; 1
ece: 0e 94 a8 01 call 0x350 ; 0x350 <hdlc_timeout_handler>
if (err == ERR_FRAME_TIME_OUT){
ed2: 05 96 adiw r24, 0x05 ; 5
ed4: 81 f4 brne .+32 ; 0xef6 <main+0xaa>
hdlc_get_raw_frame(&hdlc, buffer, sizeof buffer);
ed6: 4a e0 ldi r20, 0x0A ; 10
ed8: 50 e0 ldi r21, 0x00 ; 0
eda: be 01 movw r22, r28
edc: 66 5e subi r22, 0xE6 ; 230
ede: 7f 4f sbci r23, 0xFF ; 255
ee0: ce 01 movw r24, r28
ee2: 01 96 adiw r24, 0x01 ; 1
ee4: 0e 94 91 00 call 0x122 ; 0x122 <hdlc_get_raw_frame>
UART_send(buffer, sizeof buffer);
ee8: 6a e0 ldi r22, 0x0A ; 10
eea: 70 e0 ldi r23, 0x00 ; 0
eec: ce 01 movw r24, r28
eee: 4a 96 adiw r24, 0x1a ; 26
ef0: 0e 94 aa 0a call 0x1554 ; 0x1554 <UART_send>
ef4: e1 cf rjmp .-62 ; 0xeb8 <main+0x6c>
continue;
}
err = hdlc_decode_recived_raw_data(&hdlc, buffer_recive, sizeof buffer_recive, 0, 0);
ef6: 00 e0 ldi r16, 0x00 ; 0
ef8: 10 e0 ldi r17, 0x00 ; 0
efa: 20 e0 ldi r18, 0x00 ; 0
efc: 30 e0 ldi r19, 0x00 ; 0
efe: 44 e1 ldi r20, 0x14 ; 20
f00: 50 e0 ldi r21, 0x00 ; 0
f02: be 01 movw r22, r28
f04: 60 51 subi r22, 0x10 ; 16
f06: 7e 4f sbci r23, 0xFE ; 254
f08: ce 01 movw r24, r28
f0a: 01 96 adiw r24, 0x01 ; 1
f0c: 0e 94 07 01 call 0x20e ; 0x20e <hdlc_decode_recived_raw_data>
f10: 8c 01 movw r16, r24
if (err < 0){
f12: 99 23 and r25, r25
f14: ac f4 brge .+42 ; 0xf40 <main+0xf4>
if (err == ERR_INVALID_SEQ_NUMBER_FRAME){
f16: 0a 3f cpi r16, 0xFA ; 250
f18: 8f ef ldi r24, 0xFF ; 255
f1a: 18 07 cpc r17, r24
f1c: b1 f4 brne .+44 ; 0xf4a <main+0xfe>
uint8_t* buffer_rej[10];
hdlc_get_raw_frame(&hdlc, buffer_rej, sizeof buffer_rej);
f1e: 44 e1 ldi r20, 0x14 ; 20
f20: 50 e0 ldi r21, 0x00 ; 0
f22: be 01 movw r22, r28
f24: 60 5a subi r22, 0xA0 ; 160
f26: 7e 4f sbci r23, 0xFE ; 254
f28: ce 01 movw r24, r28
f2a: 01 96 adiw r24, 0x01 ; 1
f2c: 0e 94 91 00 call 0x122 ; 0x122 <hdlc_get_raw_frame>
UART_send(buffer_rej, sizeof buffer_rej);
f30: 64 e1 ldi r22, 0x14 ; 20
f32: 70 e0 ldi r23, 0x00 ; 0
f34: ce 01 movw r24, r28
f36: 80 5a subi r24, 0xA0 ; 160
f38: 9e 4f sbci r25, 0xFE ; 254
f3a: 0e 94 aa 0a call 0x1554 ; 0x1554 <UART_send>
f3e: 05 c0 rjmp .+10 ; 0xf4a <main+0xfe>
return err;
}
return err;
}
if (hdlc.state == READY_STATE){
f40: 89 81 ldd r24, Y+1 ; 0x01
hdlc_get_raw_frame(&hdlc, buffer, sizeof buffer);
UART_send(buffer, sizeof buffer);
while(!flag_connection){
f42: 82 30 cpi r24, 0x02 ; 2
f44: 09 f0 breq .+2 ; 0xf48 <main+0xfc>
f46: b8 cf rjmp .-144 ; 0xeb8 <main+0x6c>
f48: 03 c0 rjmp .+6 ; 0xf50 <main+0x104>
hdlc_get_raw_frame(&hdlc, buffer, sizeof buffer);
UART_send(buffer, sizeof buffer);
continue;
}
err = hdlc_decode_recived_raw_data(&hdlc, buffer_recive, sizeof buffer_recive, 0, 0);
f4a: 80 2f mov r24, r16
f4c: 91 2f mov r25, r17
f4e: fe c0 rjmp .+508 ; 0x114c <main+0x300>
flag_connection = true;
}
}
struct message mess;
mess.numbers[0] = 1.23;
f50: 84 ea ldi r24, 0xA4 ; 164
f52: 90 e7 ldi r25, 0x70 ; 112
f54: ad e9 ldi r26, 0x9D ; 157
f56: bf e3 ldi r27, 0x3F ; 63
f58: 8c a3 std Y+36, r24 ; 0x24
f5a: 9d a3 std Y+37, r25 ; 0x25
f5c: ae a3 std Y+38, r26 ; 0x26
f5e: bf a3 std Y+39, r27 ; 0x27
mess.numbers[1] = 22.1;
f60: 8d ec ldi r24, 0xCD ; 205
f62: 9c ec ldi r25, 0xCC ; 204
f64: a0 eb ldi r26, 0xB0 ; 176
f66: b1 e4 ldi r27, 0x41 ; 65
f68: 88 a7 std Y+40, r24 ; 0x28
f6a: 99 a7 std Y+41, r25 ; 0x29
f6c: aa a7 std Y+42, r26 ; 0x2a
f6e: bb a7 std Y+43, r27 ; 0x2b
mess.numbers[2] = 100;
f70: 80 e0 ldi r24, 0x00 ; 0
f72: 90 e0 ldi r25, 0x00 ; 0
f74: a8 ec ldi r26, 0xC8 ; 200
f76: b2 e4 ldi r27, 0x42 ; 66
f78: 8c a7 std Y+44, r24 ; 0x2c
f7a: 9d a7 std Y+45, r25 ; 0x2d
f7c: ae a7 std Y+46, r26 ; 0x2e
f7e: bf a7 std Y+47, r27 ; 0x2f
mess.len_numbers = 3;
f80: 83 e0 ldi r24, 0x03 ; 3
f82: 90 e0 ldi r25, 0x00 ; 0
f84: 99 ab std Y+49, r25 ; 0x31
f86: 88 ab std Y+48, r24 ; 0x30
mess.str = "word war in new world io ex";
f88: 85 e2 ldi r24, 0x25 ; 37
f8a: 93 e0 ldi r25, 0x03 ; 3
f8c: 9b ab std Y+51, r25 ; 0x33
f8e: 8a ab std Y+50, r24 ; 0x32
mess.len_str = sizeof mess.str;
f90: 82 e0 ldi r24, 0x02 ; 2
f92: 90 e0 ldi r25, 0x00 ; 0
f94: 9d ab std Y+53, r25 ; 0x35
f96: 8c ab std Y+52, r24 ; 0x34
uint8_t data[64];
size_t len_data;
protocol_encode(mess, data, &len_data);
f98: 2e 01 movw r4, r28
f9a: e6 e7 ldi r30, 0x76 ; 118
f9c: 4e 0e add r4, r30
f9e: 51 1c adc r5, r1
fa0: 5f 92 push r5
fa2: 4f 92 push r4
fa4: 3e 01 movw r6, r28
fa6: f6 e3 ldi r31, 0x36 ; 54
fa8: 6f 0e add r6, r31
faa: 71 1c adc r7, r1
fac: 7f 92 push r7
fae: 6f 92 push r6
fb0: 8c a0 ldd r8, Y+36 ; 0x24
fb2: 9d a0 ldd r9, Y+37 ; 0x25
fb4: ae a0 ldd r10, Y+38 ; 0x26
fb6: bf a0 ldd r11, Y+39 ; 0x27
fb8: c8 a4 ldd r12, Y+40 ; 0x28
fba: d9 a4 ldd r13, Y+41 ; 0x29
fbc: ea a4 ldd r14, Y+42 ; 0x2a
fbe: fb a4 ldd r15, Y+43 ; 0x2b
fc0: 0c a5 ldd r16, Y+44 ; 0x2c
fc2: 1d a5 ldd r17, Y+45 ; 0x2d
fc4: 2e a5 ldd r18, Y+46 ; 0x2e
fc6: 3f a5 ldd r19, Y+47 ; 0x2f
fc8: 48 a9 ldd r20, Y+48 ; 0x30
fca: 59 a9 ldd r21, Y+49 ; 0x31
fcc: 6a a9 ldd r22, Y+50 ; 0x32
fce: 7b a9 ldd r23, Y+51 ; 0x33
fd0: 8c a9 ldd r24, Y+52 ; 0x34
fd2: 9d a9 ldd r25, Y+53 ; 0x35
fd4: 0e 94 5c 09 call 0x12b8 ; 0x12b8 <protocol_encode>
hdlc_send_data(&hdlc, data, len_data);
fd8: f2 01 movw r30, r4
fda: 40 81 ld r20, Z
fdc: 51 81 ldd r21, Z+1 ; 0x01
fde: b3 01 movw r22, r6
fe0: ce 01 movw r24, r28
fe2: 01 96 adiw r24, 0x01 ; 1
fe4: 0e 94 76 00 call 0xec ; 0xec <hdlc_send_data>
uint8_t buffer_data[72];
hdlc_get_raw_frame(&hdlc, buffer_data, sizeof buffer_data);
fe8: 48 e4 ldi r20, 0x48 ; 72
fea: 50 e0 ldi r21, 0x00 ; 0
fec: be 01 movw r22, r28
fee: 68 58 subi r22, 0x88 ; 136
ff0: 7f 4f sbci r23, 0xFF ; 255
ff2: ce 01 movw r24, r28
ff4: 01 96 adiw r24, 0x01 ; 1
ff6: 0e 94 91 00 call 0x122 ; 0x122 <hdlc_get_raw_frame>
UART_send(buffer_data, sizeof buffer_data);
ffa: 68 e4 ldi r22, 0x48 ; 72
ffc: 70 e0 ldi r23, 0x00 ; 0
ffe: ce 01 movw r24, r28
1000: 88 58 subi r24, 0x88 ; 136
1002: 9f 4f sbci r25, 0xFF ; 255
1004: 0e 94 aa 0a call 0x1554 ; 0x1554 <UART_send>
1008: 0f 90 pop r0
100a: 0f 90 pop r0
100c: 0f 90 pop r0
100e: 0f 90 pop r0
bool flag_recive = false;
uint8_t data_recive[64];
size_t len_data_recive;
while (!flag_recive){
uint8_t* buffer_recive_data[72];
UART_receive(buffer_recive_data, sizeof buffer_recive_data);
1010: 60 e9 ldi r22, 0x90 ; 144
1012: 70 e0 ldi r23, 0x00 ; 0
1014: ce 01 movw r24, r28
1016: 80 5a subi r24, 0xA0 ; 160
1018: 9e 4f sbci r25, 0xFE ; 254
101a: 0e 94 ce 0a call 0x159c ; 0x159c <UART_receive>
int err = hdlc_timeout_handler(&hdlc, 1);
101e: 61 e0 ldi r22, 0x01 ; 1
1020: 70 e0 ldi r23, 0x00 ; 0
1022: ce 01 movw r24, r28
1024: 01 96 adiw r24, 0x01 ; 1
1026: 0e 94 a8 01 call 0x350 ; 0x350 <hdlc_timeout_handler>
if (err == ERR_FRAME_TIME_OUT){
102a: 05 96 adiw r24, 0x05 ; 5
102c: 89 f4 brne .+34 ; 0x1050 <main+0x204>
hdlc_get_raw_frame(&hdlc, buffer_data, sizeof buffer_data);
102e: 48 e4 ldi r20, 0x48 ; 72
1030: 50 e0 ldi r21, 0x00 ; 0
1032: be 01 movw r22, r28
1034: 68 58 subi r22, 0x88 ; 136
1036: 7f 4f sbci r23, 0xFF ; 255
1038: ce 01 movw r24, r28
103a: 01 96 adiw r24, 0x01 ; 1
103c: 0e 94 91 00 call 0x122 ; 0x122 <hdlc_get_raw_frame>
UART_send(buffer_data, sizeof buffer_data);
1040: 68 e4 ldi r22, 0x48 ; 72
1042: 70 e0 ldi r23, 0x00 ; 0
1044: ce 01 movw r24, r28
1046: 88 58 subi r24, 0x88 ; 136
1048: 9f 4f sbci r25, 0xFF ; 255
104a: 0e 94 aa 0a call 0x1554 ; 0x1554 <UART_send>
104e: e0 cf rjmp .-64 ; 0x1010 <main+0x1c4>
continue;
}
err = hdlc_decode_recived_raw_data(&hdlc, buffer_recive_data, sizeof buffer_recive_data, data_recive, &len_data_recive);
1050: 8e 01 movw r16, r28
1052: 13 95 inc r17
1054: 9e 01 movw r18, r28
1056: 20 54 subi r18, 0x40 ; 64
1058: 3f 4f sbci r19, 0xFF ; 255
105a: 40 e9 ldi r20, 0x90 ; 144
105c: 50 e0 ldi r21, 0x00 ; 0
105e: be 01 movw r22, r28
1060: 60 5a subi r22, 0xA0 ; 160
1062: 7e 4f sbci r23, 0xFE ; 254
1064: ce 01 movw r24, r28
1066: 01 96 adiw r24, 0x01 ; 1
1068: 0e 94 07 01 call 0x20e ; 0x20e <hdlc_decode_recived_raw_data>
106c: 8c 01 movw r16, r24
if (err < 0){
106e: 99 23 and r25, r25
1070: 9c f4 brge .+38 ; 0x1098 <main+0x24c>
if (err == ERR_INVALID_SEQ_NUMBER_FRAME){
1072: 06 96 adiw r24, 0x06 ; 6
1074: b1 f4 brne .+44 ; 0x10a2 <main+0x256>
uint8_t* buffer_rej[10];
hdlc_get_raw_frame(&hdlc, buffer_rej, sizeof buffer_rej);
1076: 44 e1 ldi r20, 0x14 ; 20
1078: 50 e0 ldi r21, 0x00 ; 0
107a: be 01 movw r22, r28
107c: 60 51 subi r22, 0x10 ; 16
107e: 7e 4f sbci r23, 0xFE ; 254
1080: ce 01 movw r24, r28
1082: 01 96 adiw r24, 0x01 ; 1
1084: 0e 94 91 00 call 0x122 ; 0x122 <hdlc_get_raw_frame>
UART_send(buffer_rej, sizeof buffer_rej);
1088: 64 e1 ldi r22, 0x14 ; 20
108a: 70 e0 ldi r23, 0x00 ; 0
108c: ce 01 movw r24, r28
108e: 80 51 subi r24, 0x10 ; 16
1090: 9e 4f sbci r25, 0xFE ; 254
1092: 0e 94 aa 0a call 0x1554 ; 0x1554 <UART_send>
1096: 05 c0 rjmp .+10 ; 0x10a2 <main+0x256>
return err;
}
return err;
}
if (hdlc.state == SEND){
1098: 89 81 ldd r24, Y+1 ; 0x01
UART_send(buffer_data, sizeof buffer_data);
bool flag_recive = false;
uint8_t data_recive[64];
size_t len_data_recive;
while (!flag_recive){
109a: 86 30 cpi r24, 0x06 ; 6
109c: 09 f0 breq .+2 ; 0x10a0 <main+0x254>
109e: b8 cf rjmp .-144 ; 0x1010 <main+0x1c4>
10a0: 03 c0 rjmp .+6 ; 0x10a8 <main+0x25c>
hdlc_get_raw_frame(&hdlc, buffer_data, sizeof buffer_data);
UART_send(buffer_data, sizeof buffer_data);
continue;
}
err = hdlc_decode_recived_raw_data(&hdlc, buffer_recive_data, sizeof buffer_recive_data, data_recive, &len_data_recive);
10a2: 80 2f mov r24, r16
10a4: 91 2f mov r25, r17
10a6: 52 c0 rjmp .+164 ; 0x114c <main+0x300>
flag_recive = true;
}
}
struct message resp;
protocol_decode(data_recive, len_data_recive, &resp);
10a8: c0 50 subi r28, 0x00 ; 0
10aa: df 4f sbci r29, 0xFF ; 255
10ac: 68 81 ld r22, Y
10ae: 79 81 ldd r23, Y+1 ; 0x01
10b0: c0 50 subi r28, 0x00 ; 0
10b2: d1 40 sbci r29, 0x01 ; 1
10b4: ae 01 movw r20, r28
10b6: 4e 5f subi r20, 0xFE ; 254
10b8: 5e 4f sbci r21, 0xFE ; 254
10ba: ce 01 movw r24, r28
10bc: 80 54 subi r24, 0x40 ; 64
10be: 9f 4f sbci r25, 0xFF ; 255
10c0: 0e 94 be 08 call 0x117c ; 0x117c <protocol_decode>
struct DisplayData disp;
disp.value1 = resp.numbers[0];
10c4: ce 5f subi r28, 0xFE ; 254
10c6: de 4f sbci r29, 0xFE ; 254
10c8: 88 81 ld r24, Y
10ca: 99 81 ldd r25, Y+1 ; 0x01
10cc: aa 81 ldd r26, Y+2 ; 0x02
10ce: bb 81 ldd r27, Y+3 ; 0x03
10d0: c2 50 subi r28, 0x02 ; 2
10d2: d1 40 sbci r29, 0x01 ; 1
10d4: cc 5a subi r28, 0xAC ; 172
10d6: de 4f sbci r29, 0xFE ; 254
10d8: 88 83 st Y, r24
10da: 99 83 std Y+1, r25 ; 0x01
10dc: aa 83 std Y+2, r26 ; 0x02
10de: bb 83 std Y+3, r27 ; 0x03
10e0: c4 55 subi r28, 0x54 ; 84
10e2: d1 40 sbci r29, 0x01 ; 1
disp.value2 = resp.numbers[1];
10e4: ca 5f subi r28, 0xFA ; 250
10e6: de 4f sbci r29, 0xFE ; 254
10e8: 88 81 ld r24, Y
10ea: 99 81 ldd r25, Y+1 ; 0x01
10ec: aa 81 ldd r26, Y+2 ; 0x02
10ee: bb 81 ldd r27, Y+3 ; 0x03
10f0: c6 50 subi r28, 0x06 ; 6
10f2: d1 40 sbci r29, 0x01 ; 1
10f4: c8 5a subi r28, 0xA8 ; 168
10f6: de 4f sbci r29, 0xFE ; 254
10f8: 88 83 st Y, r24
10fa: 99 83 std Y+1, r25 ; 0x01
10fc: aa 83 std Y+2, r26 ; 0x02
10fe: bb 83 std Y+3, r27 ; 0x03
1100: c8 55 subi r28, 0x58 ; 88
1102: d1 40 sbci r29, 0x01 ; 1
disp.value3 = resp.numbers[2];
1104: c6 5f subi r28, 0xF6 ; 246
1106: de 4f sbci r29, 0xFE ; 254
1108: 88 81 ld r24, Y
110a: 99 81 ldd r25, Y+1 ; 0x01
110c: aa 81 ldd r26, Y+2 ; 0x02
110e: bb 81 ldd r27, Y+3 ; 0x03
1110: ca 50 subi r28, 0x0A ; 10
1112: d1 40 sbci r29, 0x01 ; 1
1114: c4 5a subi r28, 0xA4 ; 164
1116: de 4f sbci r29, 0xFE ; 254
1118: 88 83 st Y, r24
111a: 99 83 std Y+1, r25 ; 0x01
111c: aa 83 std Y+2, r26 ; 0x02
111e: bb 83 std Y+3, r27 ; 0x03
1120: cc 55 subi r28, 0x5C ; 92
1122: d1 40 sbci r29, 0x01 ; 1
//disp.topLine = *resp.str;
strncpy(disp.topLine, resp.str, sizeof(disp.topLine) - 1);
1124: c0 5f subi r28, 0xF0 ; 240
1126: de 4f sbci r29, 0xFE ; 254
1128: 68 81 ld r22, Y
112a: 79 81 ldd r23, Y+1 ; 0x01
112c: c0 51 subi r28, 0x10 ; 16
112e: d1 40 sbci r29, 0x01 ; 1
1130: 4f e3 ldi r20, 0x3F ; 63
1132: 50 e0 ldi r21, 0x00 ; 0
1134: ce 01 movw r24, r28
1136: 8c 5e subi r24, 0xEC ; 236
1138: 9e 4f sbci r25, 0xFE ; 254
113a: 0e 94 8a 0b call 0x1714 ; 0x1714 <strncpy>
printLcd(&disp);
113e: ce 01 movw r24, r28
1140: 8c 5e subi r24, 0xEC ; 236
1142: 9e 4f sbci r25, 0xFE ; 254
1144: 0e 94 08 06 call 0xc10 ; 0xc10 <printLcd>
return 0;
1148: 80 e0 ldi r24, 0x00 ; 0
114a: 90 e0 ldi r25, 0x00 ; 0
114c: cd 5f subi r28, 0xFD ; 253
114e: dd 4f sbci r29, 0xFD ; 253
1150: 0f b6 in r0, 0x3f ; 63
1152: f8 94 cli
1154: de bf out 0x3e, r29 ; 62
1156: 0f be out 0x3f, r0 ; 63
1158: cd bf out 0x3d, r28 ; 61
115a: df 91 pop r29
115c: cf 91 pop r28
115e: 1f 91 pop r17
1160: 0f 91 pop r16
1162: ff 90 pop r15
1164: ef 90 pop r14
1166: df 90 pop r13
1168: cf 90 pop r12
116a: bf 90 pop r11
116c: af 90 pop r10
116e: 9f 90 pop r9
1170: 8f 90 pop r8
1172: 7f 90 pop r7
1174: 6f 90 pop r6
1176: 5f 90 pop r5
1178: 4f 90 pop r4
117a: 08 95 ret
0000117c <protocol_decode>:
#include "protocol.h"
void protocol_decode(uint8_t encode_message[], size_t len_encode_message, struct message* decode_message){
117c: 8f 92 push r8
117e: 9f 92 push r9
1180: af 92 push r10
1182: bf 92 push r11
1184: cf 92 push r12
1186: df 92 push r13
1188: ef 92 push r14
118a: ff 92 push r15
118c: 0f 93 push r16
118e: 1f 93 push r17
1190: cf 93 push r28
1192: df 93 push r29
1194: cd b7 in r28, 0x3d ; 61
1196: de b7 in r29, 0x3e ; 62
1198: c0 54 subi r28, 0x40 ; 64
119a: d1 09 sbc r29, r1
119c: 0f b6 in r0, 0x3f ; 63
119e: f8 94 cli
11a0: de bf out 0x3e, r29 ; 62
11a2: 0f be out 0x3f, r0 ; 63
11a4: cd bf out 0x3d, r28 ; 61
11a6: 4b 01 movw r8, r22
int count_number = 0;
for(int i = 0; i < len_encode_message; i++){
11a8: 67 2b or r22, r23
11aa: 09 f4 brne .+2 ; 0x11ae <protocol_decode+0x32>
11ac: 6c c0 rjmp .+216 ; 0x1286 <protocol_decode+0x10a>
11ae: 20 e0 ldi r18, 0x00 ; 0
11b0: 30 e0 ldi r19, 0x00 ; 0
11b2: 60 e0 ldi r22, 0x00 ; 0
11b4: 70 e0 ldi r23, 0x00 ; 0
11b6: a1 2c mov r10, r1
11b8: b1 2c mov r11, r1
11ba: 6e 01 movw r12, r28
11bc: e5 e0 ldi r30, 0x05 ; 5
11be: ce 0e add r12, r30
11c0: d1 1c adc r13, r1
11c2: fe 01 movw r30, r28
11c4: 31 96 adiw r30, 0x01 ; 1
11c6: 7f 01 movw r14, r30
if (encode_message[i] == FLAG_NUMBER){
11c8: fc 01 movw r30, r24
11ca: e2 0f add r30, r18
11cc: f3 1f adc r31, r19
11ce: 20 81 ld r18, Z
11d0: 21 11 cpse r18, r1
11d2: 27 c0 rjmp .+78 ; 0x1222 <protocol_decode+0xa6>
11d4: db 01 movw r26, r22
11d6: 11 96 adiw r26, 0x01 ; 1
11d8: a8 0f add r26, r24
11da: b9 1f adc r27, r25
11dc: fe 01 movw r30, r28
11de: 31 96 adiw r30, 0x01 ; 1
union convert_float sample;
for (int z = 0; z < sizeof sample.buf; z++){
i++;
sample.buf[z] = encode_message[i];
11e0: 2d 91 ld r18, X+
11e2: 21 93 st Z+, r18
void protocol_decode(uint8_t encode_message[], size_t len_encode_message, struct message* decode_message){
int count_number = 0;
for(int i = 0; i < len_encode_message; i++){
if (encode_message[i] == FLAG_NUMBER){
union convert_float sample;
for (int z = 0; z < sizeof sample.buf; z++){
11e4: ec 15 cp r30, r12
11e6: fd 05 cpc r31, r13
11e8: d9 f7 brne .-10 ; 0x11e0 <protocol_decode+0x64>
11ea: 6c 5f subi r22, 0xFC ; 252
11ec: 7f 4f sbci r23, 0xFF ; 255
i++;
sample.buf[z] = encode_message[i];
}
decode_message->numbers[count_number++] = sample.fVal;
11ee: f5 01 movw r30, r10
11f0: ee 0f add r30, r30
11f2: ff 1f adc r31, r31
11f4: ee 0f add r30, r30
11f6: ff 1f adc r31, r31
11f8: e4 0f add r30, r20
11fa: f5 1f adc r31, r21
11fc: 09 81 ldd r16, Y+1 ; 0x01
11fe: 1a 81 ldd r17, Y+2 ; 0x02
1200: 2b 81 ldd r18, Y+3 ; 0x03
1202: 3c 81 ldd r19, Y+4 ; 0x04
1204: 00 83 st Z, r16
1206: 11 83 std Z+1, r17 ; 0x01
1208: 22 83 std Z+2, r18 ; 0x02
120a: 33 83 std Z+3, r19 ; 0x03
decode_message->len_numbers++;
120c: fa 01 movw r30, r20
120e: 24 85 ldd r18, Z+12 ; 0x0c
1210: 35 85 ldd r19, Z+13 ; 0x0d
1212: 2f 5f subi r18, 0xFF ; 255
1214: 3f 4f sbci r19, 0xFF ; 255
1216: 35 87 std Z+13, r19 ; 0x0d
1218: 24 87 std Z+12, r18 ; 0x0c
union convert_float sample;
for (int z = 0; z < sizeof sample.buf; z++){
i++;
sample.buf[z] = encode_message[i];
}
decode_message->numbers[count_number++] = sample.fVal;
121a: 95 01 movw r18, r10
121c: 2f 5f subi r18, 0xFF ; 255
121e: 3f 4f sbci r19, 0xFF ; 255
1220: 59 01 movw r10, r18
decode_message->len_numbers++;
}
if (encode_message[i] == FLAG_WORD){
1222: fc 01 movw r30, r24
1224: e6 0f add r30, r22
1226: f7 1f adc r31, r23
1228: 20 81 ld r18, Z
122a: 21 30 cpi r18, 0x01 ; 1
122c: 21 f5 brne .+72 ; 0x1276 <protocol_decode+0xfa>
int count_word = 0;
i++;
122e: 9b 01 movw r18, r22
1230: 2f 5f subi r18, 0xFF ; 255
1232: 3f 4f sbci r19, 0xFF ; 255
union convert_char sample;
for (int z = 0; z < encode_message[i]; z++){
1234: fc 01 movw r30, r24
1236: e2 0f add r30, r18
1238: f3 1f adc r31, r19
123a: e0 81 ld r30, Z
123c: ee 23 and r30, r30
123e: 99 f0 breq .+38 ; 0x1266 <protocol_decode+0xea>
1240: 6e 5f subi r22, 0xFE ; 254
1242: 7f 4f sbci r23, 0xFF ; 255
1244: dc 01 movw r26, r24
1246: a6 0f add r26, r22
1248: b7 1f adc r27, r23
124a: f7 01 movw r30, r14
124c: b9 01 movw r22, r18
i++;
124e: 6f 5f subi r22, 0xFF ; 255
1250: 7f 4f sbci r23, 0xFF ; 255
sample.buf[z] = encode_message[i];
1252: 2d 91 ld r18, X+
1254: 21 93 st Z+, r18
if (encode_message[i] == FLAG_WORD){
int count_word = 0;
i++;
union convert_char sample;
for (int z = 0; z < encode_message[i]; z++){
1256: 30 e0 ldi r19, 0x00 ; 0
1258: 8f 01 movw r16, r30
125a: 0e 19 sub r16, r14
125c: 1f 09 sbc r17, r15
125e: 02 17 cp r16, r18
1260: 13 07 cpc r17, r19
1262: ac f3 brlt .-22 ; 0x124e <protocol_decode+0xd2>
1264: 01 c0 rjmp .+2 ; 0x1268 <protocol_decode+0xec>
}
if (encode_message[i] == FLAG_WORD){
int count_word = 0;
i++;
1266: b9 01 movw r22, r18
union convert_char sample;
for (int z = 0; z < encode_message[i]; z++){
i++;
sample.buf[z] = encode_message[i];
}
decode_message->str = sample.cVal;
1268: 29 81 ldd r18, Y+1 ; 0x01
126a: 3a 81 ldd r19, Y+2 ; 0x02
126c: fa 01 movw r30, r20
126e: 37 87 std Z+15, r19 ; 0x0f
1270: 26 87 std Z+14, r18 ; 0x0e
decode_message->len_str = count_word;
1272: 11 8a std Z+17, r1 ; 0x11
1274: 10 8a std Z+16, r1 ; 0x10
#include "protocol.h"
void protocol_decode(uint8_t encode_message[], size_t len_encode_message, struct message* decode_message){
int count_number = 0;
for(int i = 0; i < len_encode_message; i++){
1276: 6f 5f subi r22, 0xFF ; 255
1278: 7f 4f sbci r23, 0xFF ; 255
127a: 9b 01 movw r18, r22
127c: 68 15 cp r22, r8
127e: 79 05 cpc r23, r9
1280: 08 f4 brcc .+2 ; 0x1284 <protocol_decode+0x108>
1282: a2 cf rjmp .-188 ; 0x11c8 <protocol_decode+0x4c>
1284: 02 c0 rjmp .+4 ; 0x128a <protocol_decode+0x10e>
#include "protocol.h"
void protocol_decode(uint8_t encode_message[], size_t len_encode_message, struct message* decode_message){
int count_number = 0;
1286: a1 2c mov r10, r1
1288: b1 2c mov r11, r1
}
decode_message->str = sample.cVal;
decode_message->len_str = count_word;
}
}
decode_message->len_numbers = count_number;
128a: fa 01 movw r30, r20
128c: b5 86 std Z+13, r11 ; 0x0d
128e: a4 86 std Z+12, r10 ; 0x0c
}
1290: c0 5c subi r28, 0xC0 ; 192
1292: df 4f sbci r29, 0xFF ; 255
1294: 0f b6 in r0, 0x3f ; 63
1296: f8 94 cli
1298: de bf out 0x3e, r29 ; 62
129a: 0f be out 0x3f, r0 ; 63
129c: cd bf out 0x3d, r28 ; 61
129e: df 91 pop r29
12a0: cf 91 pop r28
12a2: 1f 91 pop r17
12a4: 0f 91 pop r16
12a6: ff 90 pop r15
12a8: ef 90 pop r14
12aa: df 90 pop r13
12ac: cf 90 pop r12
12ae: bf 90 pop r11
12b0: af 90 pop r10
12b2: 9f 90 pop r9
12b4: 8f 90 pop r8
12b6: 08 95 ret
000012b8 <protocol_encode>:
void protocol_encode(struct message message, uint8_t encode_message[], size_t* len_encode_message){
12b8: 4f 92 push r4
12ba: 5f 92 push r5
12bc: 6f 92 push r6
12be: 7f 92 push r7
12c0: 8f 92 push r8
12c2: 9f 92 push r9
12c4: af 92 push r10
12c6: bf 92 push r11
12c8: cf 92 push r12
12ca: df 92 push r13
12cc: ef 92 push r14
12ce: ff 92 push r15
12d0: 0f 93 push r16
12d2: 1f 93 push r17
12d4: cf 93 push r28
12d6: df 93 push r29
12d8: cd b7 in r28, 0x3d ; 61
12da: de b7 in r29, 0x3e ; 62
12dc: c2 55 subi r28, 0x52 ; 82
12de: d1 09 sbc r29, r1
12e0: 0f b6 in r0, 0x3f ; 63
12e2: f8 94 cli
12e4: de bf out 0x3e, r29 ; 62
12e6: 0f be out 0x3f, r0 ; 63
12e8: cd bf out 0x3d, r28 ; 61
12ea: 22 96 adiw r28, 0x02 ; 2
12ec: 8f ae std Y+63, r8 ; 0x3f
12ee: 22 97 sbiw r28, 0x02 ; 2
12f0: 23 96 adiw r28, 0x03 ; 3
12f2: 9f ae std Y+63, r9 ; 0x3f
12f4: 23 97 sbiw r28, 0x03 ; 3
12f6: 24 96 adiw r28, 0x04 ; 4
12f8: af ae std Y+63, r10 ; 0x3f
12fa: 24 97 sbiw r28, 0x04 ; 4
12fc: 25 96 adiw r28, 0x05 ; 5
12fe: bf ae std Y+63, r11 ; 0x3f
1300: 25 97 sbiw r28, 0x05 ; 5
1302: 26 96 adiw r28, 0x06 ; 6
1304: cf ae std Y+63, r12 ; 0x3f
1306: 26 97 sbiw r28, 0x06 ; 6
1308: 27 96 adiw r28, 0x07 ; 7
130a: df ae std Y+63, r13 ; 0x3f
130c: 27 97 sbiw r28, 0x07 ; 7
130e: 28 96 adiw r28, 0x08 ; 8
1310: ef ae std Y+63, r14 ; 0x3f
1312: 28 97 sbiw r28, 0x08 ; 8
1314: 29 96 adiw r28, 0x09 ; 9
1316: ff ae std Y+63, r15 ; 0x3f
1318: 29 97 sbiw r28, 0x09 ; 9
131a: 2a 96 adiw r28, 0x0a ; 10
131c: 0f af std Y+63, r16 ; 0x3f
131e: 2a 97 sbiw r28, 0x0a ; 10
1320: 2b 96 adiw r28, 0x0b ; 11
1322: 1f af std Y+63, r17 ; 0x3f
1324: 2b 97 sbiw r28, 0x0b ; 11
1326: 2c 96 adiw r28, 0x0c ; 12
1328: 2f af std Y+63, r18 ; 0x3f
132a: 2c 97 sbiw r28, 0x0c ; 12
132c: 2d 96 adiw r28, 0x0d ; 13
132e: 3f af std Y+63, r19 ; 0x3f
1330: 2d 97 sbiw r28, 0x0d ; 13
1332: 2e 96 adiw r28, 0x0e ; 14
1334: 4f af std Y+63, r20 ; 0x3f
1336: 2e 97 sbiw r28, 0x0e ; 14
1338: 2f 96 adiw r28, 0x0f ; 15
133a: 5f af std Y+63, r21 ; 0x3f
133c: 2f 97 sbiw r28, 0x0f ; 15
133e: 60 96 adiw r28, 0x10 ; 16
1340: 6f af std Y+63, r22 ; 0x3f
1342: 60 97 sbiw r28, 0x10 ; 16
1344: 61 96 adiw r28, 0x11 ; 17
1346: 7f af std Y+63, r23 ; 0x3f
1348: 61 97 sbiw r28, 0x11 ; 17
134a: 62 96 adiw r28, 0x12 ; 18
134c: 8f af std Y+63, r24 ; 0x3f
134e: 62 97 sbiw r28, 0x12 ; 18
1350: 63 96 adiw r28, 0x13 ; 19
1352: 9f af std Y+63, r25 ; 0x3f
1354: 63 97 sbiw r28, 0x13 ; 19
1356: a7 96 adiw r28, 0x27 ; 39
1358: 0e ad ldd r16, Y+62 ; 0x3e
135a: 1f ad ldd r17, Y+63 ; 0x3f
135c: a7 97 sbiw r28, 0x27 ; 39
135e: 2f 96 adiw r28, 0x0f ; 15
1360: ce ac ldd r12, Y+62 ; 0x3e
1362: df ac ldd r13, Y+63 ; 0x3f
1364: 2f 97 sbiw r28, 0x0f ; 15
1366: 63 96 adiw r28, 0x13 ; 19
1368: 6e ad ldd r22, Y+62 ; 0x3e
136a: 7f ad ldd r23, Y+63 ; 0x3f
136c: 63 97 sbiw r28, 0x13 ; 19
size_t count = 0;
if (message.len_numbers > 0){
136e: c1 14 cp r12, r1
1370: d1 04 cpc r13, r1
1372: 09 f4 brne .+2 ; 0x1376 <protocol_encode+0xbe>
1374: 66 c0 rjmp .+204 ; 0x1442 <protocol_encode+0x18a>
1376: 78 01 movw r14, r16
1378: ce 01 movw r24, r28
137a: 8f 5b subi r24, 0xBF ; 191
137c: 9f 4f sbci r25, 0xFF ; 255
137e: 56 01 movw r10, r12
1380: aa 0c add r10, r10
1382: bb 1c adc r11, r11
1384: aa 0c add r10, r10
1386: bb 1c adc r11, r11
1388: a8 0e add r10, r24
138a: b9 1e adc r11, r25
138c: ae 01 movw r20, r28
138e: 4b 5f subi r20, 0xFB ; 251
1390: 5f 4f sbci r21, 0xFF ; 255
for (int i = 0; i < message.len_numbers; i++){
encode_message[count++] = FLAG_NUMBER;
1392: f7 01 movw r30, r14
1394: 11 92 st Z+, r1
union convert_float sample;
sample.fVal = message.numbers[i];
1396: dc 01 movw r26, r24
1398: 4d 90 ld r4, X+
139a: 5d 90 ld r5, X+
139c: 6d 90 ld r6, X+
139e: 7d 90 ld r7, X+
13a0: cd 01 movw r24, r26
13a2: 49 82 std Y+1, r4 ; 0x01
13a4: 5a 82 std Y+2, r5 ; 0x02
13a6: 6b 82 std Y+3, r6 ; 0x03
13a8: 7c 82 std Y+4, r7 ; 0x04
13aa: de 01 movw r26, r28
13ac: 11 96 adiw r26, 0x01 ; 1
for (int z = 0; z < sizeof sample.buf; z++){
encode_message[count++] = sample.buf[z];
13ae: 3d 91 ld r19, X+
13b0: 31 93 st Z+, r19
if (message.len_numbers > 0){
for (int i = 0; i < message.len_numbers; i++){
encode_message[count++] = FLAG_NUMBER;
union convert_float sample;
sample.fVal = message.numbers[i];
for (int z = 0; z < sizeof sample.buf; z++){
13b2: a4 17 cp r26, r20
13b4: b5 07 cpc r27, r21
13b6: d9 f7 brne .-10 ; 0x13ae <protocol_encode+0xf6>
13b8: b5 e0 ldi r27, 0x05 ; 5
13ba: eb 0e add r14, r27
13bc: f1 1c adc r15, r1
}
void protocol_encode(struct message message, uint8_t encode_message[], size_t* len_encode_message){
size_t count = 0;
if (message.len_numbers > 0){
for (int i = 0; i < message.len_numbers; i++){
13be: 8a 15 cp r24, r10
13c0: 9b 05 cpc r25, r11
13c2: 39 f7 brne .-50 ; 0x1392 <protocol_encode+0xda>
13c4: 96 01 movw r18, r12
13c6: 22 0f add r18, r18
13c8: 33 1f adc r19, r19
13ca: 22 0f add r18, r18
13cc: 33 1f adc r19, r19
13ce: 2c 0d add r18, r12
13d0: 3d 1d adc r19, r13
encode_message[count++] = sample.buf[z];
}
}
}
if (message.len_str > 0){
13d2: 61 15 cp r22, r1
13d4: 71 05 cpc r23, r1
13d6: 09 f1 breq .+66 ; 0x141a <protocol_encode+0x162>
encode_message[count++] = FLAG_WORD;
13d8: d8 01 movw r26, r16
13da: a2 0f add r26, r18
13dc: b3 1f adc r27, r19
13de: 81 e0 ldi r24, 0x01 ; 1
13e0: 8c 93 st X, r24
encode_message[count++] = message.len_str;
13e2: d9 01 movw r26, r18
13e4: 11 96 adiw r26, 0x01 ; 1
13e6: a0 0f add r26, r16
13e8: b1 1f adc r27, r17
13ea: 2e 5f subi r18, 0xFE ; 254
13ec: 3f 4f sbci r19, 0xFF ; 255
13ee: 6c 93 st X, r22
union convert_char sample;
sample.cVal = message.str;
13f0: 61 96 adiw r28, 0x11 ; 17
13f2: 8e ad ldd r24, Y+62 ; 0x3e
13f4: 9f ad ldd r25, Y+63 ; 0x3f
13f6: 61 97 sbiw r28, 0x11 ; 17
13f8: 9a 83 std Y+2, r25 ; 0x02
13fa: 89 83 std Y+1, r24 ; 0x01
13fc: de 01 movw r26, r28
13fe: 11 96 adiw r26, 0x01 ; 1
1400: f8 01 movw r30, r16
1402: e2 0f add r30, r18
1404: f3 1f adc r31, r19
}
}
if (message.len_str > 0){
encode_message[count++] = FLAG_WORD;
encode_message[count++] = message.len_str;
1406: 80 e0 ldi r24, 0x00 ; 0
1408: 90 e0 ldi r25, 0x00 ; 0
union convert_char sample;
sample.cVal = message.str;
for (int i = 0; i < message.len_str; i++){
encode_message[count++] = sample.buf[i];
140a: 2f 5f subi r18, 0xFF ; 255
140c: 3f 4f sbci r19, 0xFF ; 255
140e: 4d 91 ld r20, X+
1410: 41 93 st Z+, r20
if (message.len_str > 0){
encode_message[count++] = FLAG_WORD;
encode_message[count++] = message.len_str;
union convert_char sample;
sample.cVal = message.str;
for (int i = 0; i < message.len_str; i++){
1412: 01 96 adiw r24, 0x01 ; 1
1414: 86 17 cp r24, r22
1416: 97 07 cpc r25, r23
1418: c0 f3 brcs .-16 ; 0x140a <protocol_encode+0x152>
encode_message[count++] = sample.buf[i];
}
}
*len_encode_message = count;
141a: a9 96 adiw r28, 0x29 ; 41
141c: ee ad ldd r30, Y+62 ; 0x3e
141e: ff ad ldd r31, Y+63 ; 0x3f
1420: a9 97 sbiw r28, 0x29 ; 41
1422: 31 83 std Z+1, r19 ; 0x01
1424: 20 83 st Z, r18
1426: 13 c0 rjmp .+38 ; 0x144e <protocol_encode+0x196>
}
}
}
if (message.len_str > 0){
encode_message[count++] = FLAG_WORD;
1428: 81 e0 ldi r24, 0x01 ; 1
142a: f8 01 movw r30, r16
142c: 80 83 st Z, r24
encode_message[count++] = message.len_str;
142e: 61 83 std Z+1, r22 ; 0x01
union convert_char sample;
sample.cVal = message.str;
1430: 61 96 adiw r28, 0x11 ; 17
1432: 8e ad ldd r24, Y+62 ; 0x3e
1434: 9f ad ldd r25, Y+63 ; 0x3f
1436: 61 97 sbiw r28, 0x11 ; 17
1438: 9a 83 std Y+2, r25 ; 0x02
143a: 89 83 std Y+1, r24 ; 0x01
}
}
if (message.len_str > 0){
encode_message[count++] = FLAG_WORD;
encode_message[count++] = message.len_str;
143c: 22 e0 ldi r18, 0x02 ; 2
143e: 30 e0 ldi r19, 0x00 ; 0
1440: dd cf rjmp .-70 ; 0x13fc <protocol_encode+0x144>
encode_message[count++] = sample.buf[z];
}
}
}
if (message.len_str > 0){
1442: 61 15 cp r22, r1
1444: 71 05 cpc r23, r1
1446: 81 f7 brne .-32 ; 0x1428 <protocol_encode+0x170>
}
decode_message->len_numbers = count_number;
}
void protocol_encode(struct message message, uint8_t encode_message[], size_t* len_encode_message){
size_t count = 0;
1448: 20 e0 ldi r18, 0x00 ; 0
144a: 30 e0 ldi r19, 0x00 ; 0
144c: e6 cf rjmp .-52 ; 0x141a <protocol_encode+0x162>
encode_message[count++] = sample.buf[i];
}
}
*len_encode_message = count;
144e: ce 5a subi r28, 0xAE ; 174
1450: df 4f sbci r29, 0xFF ; 255
1452: 0f b6 in r0, 0x3f ; 63
1454: f8 94 cli
1456: de bf out 0x3e, r29 ; 62
1458: 0f be out 0x3f, r0 ; 63
145a: cd bf out 0x3d, r28 ; 61
145c: df 91 pop r29
145e: cf 91 pop r28
1460: 1f 91 pop r17
1462: 0f 91 pop r16
1464: ff 90 pop r15
1466: ef 90 pop r14
1468: df 90 pop r13
146a: cf 90 pop r12
146c: bf 90 pop r11
146e: af 90 pop r10
1470: 9f 90 pop r9
1472: 8f 90 pop r8
1474: 7f 90 pop r7
1476: 6f 90 pop r6
1478: 5f 90 pop r5
147a: 4f 90 pop r4
147c: 08 95 ret
0000147e <buffer_empty>:
void initialize_buffer(struct circular_buffer* cb) {
cb->buf_head = 0;
cb->buf_tail = 0;
}
// Проверка, пустой ли буфер
int buffer_empty(const struct circular_buffer* cb) {
147e: fc 01 movw r30, r24
return cb->buf_head == cb->buf_tail;
1480: 81 e0 ldi r24, 0x01 ; 1
1482: 90 e0 ldi r25, 0x00 ; 0
1484: 30 a1 ldd r19, Z+32 ; 0x20
1486: 21 a1 ldd r18, Z+33 ; 0x21
1488: 32 17 cp r19, r18
148a: 11 f0 breq .+4 ; 0x1490 <buffer_empty+0x12>
148c: 80 e0 ldi r24, 0x00 ; 0
148e: 90 e0 ldi r25, 0x00 ; 0
}
1490: 08 95 ret
00001492 <buffer_full>:
// Проверка, заполнен ли буфер
int buffer_full(const struct circular_buffer* cb) {
return (cb->buf_tail + 1) % BUFFER_SIZE == cb->buf_head; //проверяем следующее число, если оно будет совпадать с индексом головы то будет false, при совпадении вывод true
1492: fc 01 movw r30, r24
1494: 21 a1 ldd r18, Z+33 ; 0x21
1496: 30 e0 ldi r19, 0x00 ; 0
1498: 2f 5f subi r18, 0xFF ; 255
149a: 3f 4f sbci r19, 0xFF ; 255
149c: 2f 71 andi r18, 0x1F ; 31
149e: 30 78 andi r19, 0x80 ; 128
14a0: 33 23 and r19, r19
14a2: 34 f4 brge .+12 ; 0x14b0 <buffer_full+0x1e>
14a4: 21 50 subi r18, 0x01 ; 1
14a6: 31 09 sbc r19, r1
14a8: 20 6e ori r18, 0xE0 ; 224
14aa: 3f 6f ori r19, 0xFF ; 255
14ac: 2f 5f subi r18, 0xFF ; 255
14ae: 3f 4f sbci r19, 0xFF ; 255
14b0: fc 01 movw r30, r24
14b2: 40 a1 ldd r20, Z+32 ; 0x20
14b4: 50 e0 ldi r21, 0x00 ; 0
14b6: 81 e0 ldi r24, 0x01 ; 1
14b8: 90 e0 ldi r25, 0x00 ; 0
14ba: 24 17 cp r18, r20
14bc: 35 07 cpc r19, r21
14be: 11 f0 breq .+4 ; 0x14c4 <buffer_full+0x32>
14c0: 80 e0 ldi r24, 0x00 ; 0
14c2: 90 e0 ldi r25, 0x00 ; 0
}
14c4: 08 95 ret
000014c6 <write_buffer>:
// Запись в буфер
void write_buffer(struct circular_buffer* cb, int value) {
14c6: 1f 93 push r17
14c8: cf 93 push r28
14ca: df 93 push r29
14cc: ec 01 movw r28, r24
14ce: 16 2f mov r17, r22
if (buffer_full(cb)) { // проверяем, заполнен ли буфер
14d0: 0e 94 49 0a call 0x1492 ; 0x1492 <buffer_full>
14d4: 89 2b or r24, r25
14d6: 81 f4 brne .+32 ; 0x14f8 <write_buffer+0x32>
return;
}
cb->buffer[cb->buf_tail] = value;// записываем значение в элемент массива в хвост
14d8: 89 a1 ldd r24, Y+33 ; 0x21
14da: 90 e0 ldi r25, 0x00 ; 0
14dc: fe 01 movw r30, r28
14de: e8 0f add r30, r24
14e0: f9 1f adc r31, r25
14e2: 10 83 st Z, r17
cb->buf_tail = (cb->buf_tail + 1) % BUFFER_SIZE;// присваивается cb->buf_tail, обновляется его значение на следующий индекс в буфере
14e4: 01 96 adiw r24, 0x01 ; 1
14e6: 8f 71 andi r24, 0x1F ; 31
14e8: 90 78 andi r25, 0x80 ; 128
14ea: 99 23 and r25, r25
14ec: 24 f4 brge .+8 ; 0x14f6 <write_buffer+0x30>
14ee: 01 97 sbiw r24, 0x01 ; 1
14f0: 80 6e ori r24, 0xE0 ; 224
14f2: 9f 6f ori r25, 0xFF ; 255
14f4: 01 96 adiw r24, 0x01 ; 1
14f6: 89 a3 std Y+33, r24 ; 0x21
}
14f8: df 91 pop r29
14fa: cf 91 pop r28
14fc: 1f 91 pop r17
14fe: 08 95 ret
00001500 <read_buffer>:
// Чтение элемента
int read_buffer(struct circular_buffer* cb) {
1500: fc 01 movw r30, r24
cb->buf_head = 0;
cb->buf_tail = 0;
}
// Проверка, пустой ли буфер
int buffer_empty(const struct circular_buffer* cb) {
return cb->buf_head == cb->buf_tail;
1502: 20 a1 ldd r18, Z+32 ; 0x20
cb->buffer[cb->buf_tail] = value;// записываем значение в элемент массива в хвост
cb->buf_tail = (cb->buf_tail + 1) % BUFFER_SIZE;// присваивается cb->buf_tail, обновляется его значение на следующий индекс в буфере
}
// Чтение элемента
int read_buffer(struct circular_buffer* cb) {
if (buffer_empty(cb)) { // проверка на пустоту
1504: 81 a1 ldd r24, Z+33 ; 0x21
1506: 28 17 cp r18, r24
1508: b1 f0 breq .+44 ; 0x1536 <read_buffer+0x36>
return -1;// -1 как индикатор в случае ошибки
}
int value = cb->buffer[cb->buf_head]; // чтение по индексу головы
150a: 30 e0 ldi r19, 0x00 ; 0
150c: df 01 movw r26, r30
150e: a2 0f add r26, r18
1510: b3 1f adc r27, r19
1512: 4c 91 ld r20, X
1514: 50 e0 ldi r21, 0x00 ; 0
cb->buf_head = (cb->buf_head + 1) % BUFFER_SIZE; // увеличиваем индекс на 1
1516: 2f 5f subi r18, 0xFF ; 255
1518: 3f 4f sbci r19, 0xFF ; 255
151a: 2f 71 andi r18, 0x1F ; 31
151c: 30 78 andi r19, 0x80 ; 128
151e: 33 23 and r19, r19
1520: 34 f4 brge .+12 ; 0x152e <read_buffer+0x2e>
1522: 21 50 subi r18, 0x01 ; 1
1524: 31 09 sbc r19, r1
1526: 20 6e ori r18, 0xE0 ; 224
1528: 3f 6f ori r19, 0xFF ; 255
152a: 2f 5f subi r18, 0xFF ; 255
152c: 3f 4f sbci r19, 0xFF ; 255
152e: 20 a3 std Z+32, r18 ; 0x20
return value;
1530: 84 2f mov r24, r20
1532: 95 2f mov r25, r21
1534: 08 95 ret
cb->buf_tail = (cb->buf_tail + 1) % BUFFER_SIZE;// присваивается cb->buf_tail, обновляется его значение на следующий индекс в буфере
}
// Чтение элемента
int read_buffer(struct circular_buffer* cb) {
if (buffer_empty(cb)) { // проверка на пустоту
return -1;// -1 как индикатор в случае ошибки
1536: 8f ef ldi r24, 0xFF ; 255
1538: 9f ef ldi r25, 0xFF ; 255
}
int value = cb->buffer[cb->buf_head]; // чтение по индексу головы
cb->buf_head = (cb->buf_head + 1) % BUFFER_SIZE; // увеличиваем индекс на 1
return value;
}
153a: 08 95 ret
0000153c <UART_init>:
struct circular_buffer uartRxBuffer;
struct circular_buffer uartTxBuffer;
void UART_init(void) {
UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0) | (1<<TXCIE0) | (1 << UDRIE0); // прерывание по приему и передаче
153c: 88 ef ldi r24, 0xF8 ; 248
153e: 80 93 c1 00 sts 0x00C1, r24 ; 0x8000c1 <__DATA_REGION_ORIGIN__+0x61>
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
1542: 86 e0 ldi r24, 0x06 ; 6
1544: 80 93 c2 00 sts 0x00C2, r24 ; 0x8000c2 <__DATA_REGION_ORIGIN__+0x62>
UBRR0H = 0;
1548: 10 92 c5 00 sts 0x00C5, r1 ; 0x8000c5 <__DATA_REGION_ORIGIN__+0x65>
UBRR0L = 103;
154c: 87 e6 ldi r24, 0x67 ; 103
154e: 80 93 c4 00 sts 0x00C4, r24 ; 0x8000c4 <__DATA_REGION_ORIGIN__+0x64>
1552: 08 95 ret
00001554 <UART_send>:
}
void UART_send(uint8_t* data, size_t length) {
1554: 0f 93 push r16
1556: 1f 93 push r17
1558: cf 93 push r28
155a: df 93 push r29
for (size_t i = 0; i < length; i++) {
155c: 61 15 cp r22, r1
155e: 71 05 cpc r23, r1
1560: 99 f0 breq .+38 ; 0x1588 <UART_send+0x34>
1562: 8c 01 movw r16, r24
1564: ec 01 movw r28, r24
1566: 06 0f add r16, r22
1568: 17 1f adc r17, r23
if (!buffer_full(&uartTxBuffer)) {
156a: 8e e6 ldi r24, 0x6E ; 110
156c: 93 e0 ldi r25, 0x03 ; 3
156e: 0e 94 49 0a call 0x1492 ; 0x1492 <buffer_full>
1572: 89 2b or r24, r25
1574: 49 f4 brne .+18 ; 0x1588 <UART_send+0x34>
write_buffer(&uartTxBuffer, data[i]);
1576: 69 91 ld r22, Y+
1578: 70 e0 ldi r23, 0x00 ; 0
157a: 8e e6 ldi r24, 0x6E ; 110
157c: 93 e0 ldi r25, 0x03 ; 3
157e: 0e 94 63 0a call 0x14c6 ; 0x14c6 <write_buffer>
UBRR0H = 0;
UBRR0L = 103;
}
void UART_send(uint8_t* data, size_t length) {
for (size_t i = 0; i < length; i++) {
1582: c0 17 cp r28, r16
1584: d1 07 cpc r29, r17
1586: 89 f7 brne .-30 ; 0x156a <UART_send+0x16>
write_buffer(&uartTxBuffer, data[i]);
} else {
break; // если буфер передачи заполнен, то отправка прерывается
}
}
UCSR0B |= (1 << TXCIE0); // включаем прерывание по завершении передачи
1588: e1 ec ldi r30, 0xC1 ; 193
158a: f0 e0 ldi r31, 0x00 ; 0
158c: 80 81 ld r24, Z
158e: 80 64 ori r24, 0x40 ; 64
1590: 80 83 st Z, r24
}
1592: df 91 pop r29
1594: cf 91 pop r28
1596: 1f 91 pop r17
1598: 0f 91 pop r16
159a: 08 95 ret
0000159c <UART_receive>:
// Получение данных из буфера
int UART_receive(uint8_t* data, size_t length) {
159c: 8f 92 push r8
159e: 9f 92 push r9
15a0: af 92 push r10
15a2: bf 92 push r11
15a4: cf 92 push r12
15a6: df 92 push r13
15a8: ef 92 push r14
15aa: ff 92 push r15
15ac: 0f 93 push r16
15ae: 1f 93 push r17
15b0: cf 93 push r28
15b2: df 93 push r29
15b4: 8b 01 movw r16, r22
15b6: ec 01 movw r28, r24
char overflow = 0; // Флаг переполнения, который устанавливается, если превышен размер массива
uint32_t byteCount = 0; // Счетчик байтов, принятых из буфера приема
15b8: c1 2c mov r12, r1
15ba: d1 2c mov r13, r1
15bc: 76 01 movw r14, r12
// Пока буфер приема не пуст и не превышен лимит длины массива,
// функция продолжает читать байты из буфера и сохранять их в массив data.
while (!buffer_empty(&uartRxBuffer) && byteCount < length) {
15be: 4b 01 movw r8, r22
15c0: a1 2c mov r10, r1
15c2: b1 2c mov r11, r1
15c4: 0a c0 rjmp .+20 ; 0x15da <UART_receive+0x3e>
int reader = read_buffer(&uartRxBuffer); // Прием и запись символа в переменную
15c6: 8c e4 ldi r24, 0x4C ; 76
15c8: 93 e0 ldi r25, 0x03 ; 3
15ca: 0e 94 80 0a call 0x1500 ; 0x1500 <read_buffer>
data[byteCount] = reader; // Запись в массив с индексом byteCount
15ce: 89 93 st Y+, r24
byteCount++;
15d0: 8f ef ldi r24, 0xFF ; 255
15d2: c8 1a sub r12, r24
15d4: d8 0a sbc r13, r24
15d6: e8 0a sbc r14, r24
15d8: f8 0a sbc r15, r24
int UART_receive(uint8_t* data, size_t length) {
char overflow = 0; // Флаг переполнения, который устанавливается, если превышен размер массива
uint32_t byteCount = 0; // Счетчик байтов, принятых из буфера приема
// Пока буфер приема не пуст и не превышен лимит длины массива,
// функция продолжает читать байты из буфера и сохранять их в массив data.
while (!buffer_empty(&uartRxBuffer) && byteCount < length) {
15da: 8c e4 ldi r24, 0x4C ; 76
15dc: 93 e0 ldi r25, 0x03 ; 3
15de: 0e 94 3f 0a call 0x147e ; 0x147e <buffer_empty>
15e2: 89 2b or r24, r25
15e4: 29 f4 brne .+10 ; 0x15f0 <UART_receive+0x54>
15e6: c8 14 cp r12, r8
15e8: d9 04 cpc r13, r9
15ea: ea 04 cpc r14, r10
15ec: fb 04 cpc r15, r11
15ee: 58 f3 brcs .-42 ; 0x15c6 <UART_receive+0x2a>
}
// Проверка переполнения
if (byteCount > length) {
overflow = 1;
}
return overflow ? -1 : byteCount; // Возвращает количество успешно принятых байт или -1 в случае переполнения
15f0: 20 e0 ldi r18, 0x00 ; 0
15f2: 30 e0 ldi r19, 0x00 ; 0
15f4: 0c 15 cp r16, r12
15f6: 1d 05 cpc r17, r13
15f8: 2e 05 cpc r18, r14
15fa: 3f 05 cpc r19, r15
15fc: 10 f0 brcs .+4 ; 0x1602 <UART_receive+0x66>
15fe: c6 01 movw r24, r12
1600: 02 c0 rjmp .+4 ; 0x1606 <UART_receive+0x6a>
1602: 8f ef ldi r24, 0xFF ; 255
1604: 9f ef ldi r25, 0xFF ; 255
}
1606: df 91 pop r29
1608: cf 91 pop r28
160a: 1f 91 pop r17
160c: 0f 91 pop r16
160e: ff 90 pop r15
1610: ef 90 pop r14
1612: df 90 pop r13
1614: cf 90 pop r12
1616: bf 90 pop r11
1618: af 90 pop r10
161a: 9f 90 pop r9
161c: 8f 90 pop r8
161e: 08 95 ret
00001620 <__vector_18>:
// прерывание по завершению приема
ISR(USART_RX_vect) {
1620: 1f 92 push r1
1622: 0f 92 push r0
1624: 0f b6 in r0, 0x3f ; 63
1626: 0f 92 push r0
1628: 11 24 eor r1, r1
162a: 2f 93 push r18
162c: 3f 93 push r19
162e: 4f 93 push r20
1630: 5f 93 push r21
1632: 6f 93 push r22
1634: 7f 93 push r23
1636: 8f 93 push r24
1638: 9f 93 push r25
163a: af 93 push r26
163c: bf 93 push r27
163e: cf 93 push r28
1640: ef 93 push r30
1642: ff 93 push r31
uint8_t data = UDR0; // читаем из регистра UDR0
1644: c0 91 c6 00 lds r28, 0x00C6 ; 0x8000c6 <__DATA_REGION_ORIGIN__+0x66>
if (!buffer_full(&uartRxBuffer)) {
1648: 8c e4 ldi r24, 0x4C ; 76
164a: 93 e0 ldi r25, 0x03 ; 3
164c: 0e 94 49 0a call 0x1492 ; 0x1492 <buffer_full>
1650: 89 2b or r24, r25
1652: 31 f4 brne .+12 ; 0x1660 <__vector_18+0x40>
write_buffer(&uartRxBuffer, data);// записываем символ в буфер приема
1654: 6c 2f mov r22, r28
1656: 70 e0 ldi r23, 0x00 ; 0
1658: 8c e4 ldi r24, 0x4C ; 76
165a: 93 e0 ldi r25, 0x03 ; 3
165c: 0e 94 63 0a call 0x14c6 ; 0x14c6 <write_buffer>
}
}
1660: ff 91 pop r31
1662: ef 91 pop r30
1664: cf 91 pop r28
1666: bf 91 pop r27
1668: af 91 pop r26
166a: 9f 91 pop r25
166c: 8f 91 pop r24
166e: 7f 91 pop r23
1670: 6f 91 pop r22
1672: 5f 91 pop r21
1674: 4f 91 pop r20
1676: 3f 91 pop r19
1678: 2f 91 pop r18
167a: 0f 90 pop r0
167c: 0f be out 0x3f, r0 ; 63
167e: 0f 90 pop r0
1680: 1f 90 pop r1
1682: 18 95 reti
00001684 <__vector_20>:
ISR(USART_TX_vect) {
1684: 1f 92 push r1
1686: 0f 92 push r0
1688: 0f b6 in r0, 0x3f ; 63
168a: 0f 92 push r0
168c: 11 24 eor r1, r1
168e: 2f 93 push r18
1690: 3f 93 push r19
1692: 4f 93 push r20
1694: 5f 93 push r21
1696: 6f 93 push r22
1698: 7f 93 push r23
169a: 8f 93 push r24
169c: 9f 93 push r25
169e: af 93 push r26
16a0: bf 93 push r27
16a2: ef 93 push r30
16a4: ff 93 push r31
if (!buffer_empty(&uartTxBuffer)) {
16a6: 8e e6 ldi r24, 0x6E ; 110
16a8: 93 e0 ldi r25, 0x03 ; 3
16aa: 0e 94 3f 0a call 0x147e ; 0x147e <buffer_empty>
16ae: 89 2b or r24, r25
16b0: 39 f4 brne .+14 ; 0x16c0 <__vector_20+0x3c>
UDR0 = read_buffer(&uartTxBuffer);
16b2: 8e e6 ldi r24, 0x6E ; 110
16b4: 93 e0 ldi r25, 0x03 ; 3
16b6: 0e 94 80 0a call 0x1500 ; 0x1500 <read_buffer>
16ba: 80 93 c6 00 sts 0x00C6, r24 ; 0x8000c6 <__DATA_REGION_ORIGIN__+0x66>
16be: 05 c0 rjmp .+10 ; 0x16ca <__vector_20+0x46>
} else {
UCSR0B &= ~(1 << TXCIE0); // отключаем прерывание, когда все данные отправлены
16c0: e1 ec ldi r30, 0xC1 ; 193
16c2: f0 e0 ldi r31, 0x00 ; 0
16c4: 80 81 ld r24, Z
16c6: 8f 7b andi r24, 0xBF ; 191
16c8: 80 83 st Z, r24
}
16ca: ff 91 pop r31
16cc: ef 91 pop r30
16ce: bf 91 pop r27
16d0: af 91 pop r26
16d2: 9f 91 pop r25
16d4: 8f 91 pop r24
16d6: 7f 91 pop r23
16d8: 6f 91 pop r22
16da: 5f 91 pop r21
16dc: 4f 91 pop r20
16de: 3f 91 pop r19
16e0: 2f 91 pop r18
16e2: 0f 90 pop r0
16e4: 0f be out 0x3f, r0 ; 63
16e6: 0f 90 pop r0
16e8: 1f 90 pop r1
16ea: 18 95 reti
000016ec <__udivmodhi4>:
16ec: aa 1b sub r26, r26
16ee: bb 1b sub r27, r27
16f0: 51 e1 ldi r21, 0x11 ; 17
16f2: 07 c0 rjmp .+14 ; 0x1702 <__udivmodhi4_ep>
000016f4 <__udivmodhi4_loop>:
16f4: aa 1f adc r26, r26
16f6: bb 1f adc r27, r27
16f8: a6 17 cp r26, r22
16fa: b7 07 cpc r27, r23
16fc: 10 f0 brcs .+4 ; 0x1702 <__udivmodhi4_ep>
16fe: a6 1b sub r26, r22
1700: b7 0b sbc r27, r23
00001702 <__udivmodhi4_ep>:
1702: 88 1f adc r24, r24
1704: 99 1f adc r25, r25
1706: 5a 95 dec r21
1708: a9 f7 brne .-22 ; 0x16f4 <__udivmodhi4_loop>
170a: 80 95 com r24
170c: 90 95 com r25
170e: bc 01 movw r22, r24
1710: cd 01 movw r24, r26
1712: 08 95 ret
00001714 <strncpy>:
1714: fb 01 movw r30, r22
1716: dc 01 movw r26, r24
1718: 41 50 subi r20, 0x01 ; 1
171a: 50 40 sbci r21, 0x00 ; 0
171c: 48 f0 brcs .+18 ; 0x1730 <strncpy+0x1c>
171e: 01 90 ld r0, Z+
1720: 0d 92 st X+, r0
1722: 00 20 and r0, r0
1724: c9 f7 brne .-14 ; 0x1718 <strncpy+0x4>
1726: 01 c0 rjmp .+2 ; 0x172a <strncpy+0x16>
1728: 1d 92 st X+, r1
172a: 41 50 subi r20, 0x01 ; 1
172c: 50 40 sbci r21, 0x00 ; 0
172e: e0 f7 brcc .-8 ; 0x1728 <strncpy+0x14>
1730: 08 95 ret
00001732 <printf>:
1732: a0 e0 ldi r26, 0x00 ; 0
1734: b0 e0 ldi r27, 0x00 ; 0
1736: ef e9 ldi r30, 0x9F ; 159
1738: fb e0 ldi r31, 0x0B ; 11
173a: 0c 94 80 0e jmp 0x1d00 ; 0x1d00 <__prologue_saves__+0x20>
173e: ae 01 movw r20, r28
1740: 4b 5f subi r20, 0xFB ; 251
1742: 5f 4f sbci r21, 0xFF ; 255
1744: fa 01 movw r30, r20
1746: 61 91 ld r22, Z+
1748: 71 91 ld r23, Z+
174a: af 01 movw r20, r30
174c: 80 91 92 03 lds r24, 0x0392 ; 0x800392 <__iob+0x2>
1750: 90 91 93 03 lds r25, 0x0393 ; 0x800393 <__iob+0x3>
1754: 0e 94 df 0b call 0x17be ; 0x17be <vfprintf>
1758: e2 e0 ldi r30, 0x02 ; 2
175a: 0c 94 9c 0e jmp 0x1d38 ; 0x1d38 <__epilogue_restores__+0x20>
0000175e <snprintf>:
175e: ae e0 ldi r26, 0x0E ; 14
1760: b0 e0 ldi r27, 0x00 ; 0
1762: e5 eb ldi r30, 0xB5 ; 181
1764: fb e0 ldi r31, 0x0B ; 11
1766: 0c 94 7e 0e jmp 0x1cfc ; 0x1cfc <__prologue_saves__+0x1c>
176a: 0d 89 ldd r16, Y+21 ; 0x15
176c: 1e 89 ldd r17, Y+22 ; 0x16
176e: 8f 89 ldd r24, Y+23 ; 0x17
1770: 98 8d ldd r25, Y+24 ; 0x18
1772: 26 e0 ldi r18, 0x06 ; 6
1774: 2c 83 std Y+4, r18 ; 0x04
1776: 1a 83 std Y+2, r17 ; 0x02
1778: 09 83 std Y+1, r16 ; 0x01
177a: 97 ff sbrs r25, 7
177c: 02 c0 rjmp .+4 ; 0x1782 <snprintf+0x24>
177e: 80 e0 ldi r24, 0x00 ; 0
1780: 90 e8 ldi r25, 0x80 ; 128
1782: 01 97 sbiw r24, 0x01 ; 1
1784: 9e 83 std Y+6, r25 ; 0x06
1786: 8d 83 std Y+5, r24 ; 0x05
1788: ae 01 movw r20, r28
178a: 45 5e subi r20, 0xE5 ; 229
178c: 5f 4f sbci r21, 0xFF ; 255
178e: 69 8d ldd r22, Y+25 ; 0x19
1790: 7a 8d ldd r23, Y+26 ; 0x1a
1792: ce 01 movw r24, r28
1794: 01 96 adiw r24, 0x01 ; 1
1796: 0e 94 df 0b call 0x17be ; 0x17be <vfprintf>
179a: 4d 81 ldd r20, Y+5 ; 0x05
179c: 5e 81 ldd r21, Y+6 ; 0x06
179e: 57 fd sbrc r21, 7
17a0: 0a c0 rjmp .+20 ; 0x17b6 <snprintf+0x58>
17a2: 2f 81 ldd r18, Y+7 ; 0x07
17a4: 38 85 ldd r19, Y+8 ; 0x08
17a6: 42 17 cp r20, r18
17a8: 53 07 cpc r21, r19
17aa: 0c f4 brge .+2 ; 0x17ae <snprintf+0x50>
17ac: 9a 01 movw r18, r20
17ae: f8 01 movw r30, r16
17b0: e2 0f add r30, r18
17b2: f3 1f adc r31, r19
17b4: 10 82 st Z, r1
17b6: 2e 96 adiw r28, 0x0e ; 14
17b8: e4 e0 ldi r30, 0x04 ; 4
17ba: 0c 94 9a 0e jmp 0x1d34 ; 0x1d34 <__epilogue_restores__+0x1c>
000017be <vfprintf>:
17be: ab e0 ldi r26, 0x0B ; 11
17c0: b0 e0 ldi r27, 0x00 ; 0
17c2: e5 ee ldi r30, 0xE5 ; 229
17c4: fb e0 ldi r31, 0x0B ; 11
17c6: 0c 94 70 0e jmp 0x1ce0 ; 0x1ce0 <__prologue_saves__>
17ca: 6c 01 movw r12, r24
17cc: 7b 01 movw r14, r22
17ce: 8a 01 movw r16, r20
17d0: fc 01 movw r30, r24
17d2: 17 82 std Z+7, r1 ; 0x07
17d4: 16 82 std Z+6, r1 ; 0x06
17d6: 83 81 ldd r24, Z+3 ; 0x03
17d8: 81 ff sbrs r24, 1
17da: cc c1 rjmp .+920 ; 0x1b74 <vfprintf+0x3b6>
17dc: ce 01 movw r24, r28
17de: 01 96 adiw r24, 0x01 ; 1
17e0: 3c 01 movw r6, r24
17e2: f6 01 movw r30, r12
17e4: 93 81 ldd r25, Z+3 ; 0x03
17e6: f7 01 movw r30, r14
17e8: 93 fd sbrc r25, 3
17ea: 85 91 lpm r24, Z+
17ec: 93 ff sbrs r25, 3
17ee: 81 91 ld r24, Z+
17f0: 7f 01 movw r14, r30
17f2: 88 23 and r24, r24
17f4: 09 f4 brne .+2 ; 0x17f8 <vfprintf+0x3a>
17f6: ba c1 rjmp .+884 ; 0x1b6c <vfprintf+0x3ae>
17f8: 85 32 cpi r24, 0x25 ; 37
17fa: 39 f4 brne .+14 ; 0x180a <vfprintf+0x4c>
17fc: 93 fd sbrc r25, 3
17fe: 85 91 lpm r24, Z+
1800: 93 ff sbrs r25, 3
1802: 81 91 ld r24, Z+
1804: 7f 01 movw r14, r30
1806: 85 32 cpi r24, 0x25 ; 37
1808: 29 f4 brne .+10 ; 0x1814 <vfprintf+0x56>
180a: b6 01 movw r22, r12
180c: 90 e0 ldi r25, 0x00 ; 0
180e: 0e 94 d6 0d call 0x1bac ; 0x1bac <fputc>
1812: e7 cf rjmp .-50 ; 0x17e2 <vfprintf+0x24>
1814: 91 2c mov r9, r1
1816: 21 2c mov r2, r1
1818: 31 2c mov r3, r1
181a: ff e1 ldi r31, 0x1F ; 31
181c: f3 15 cp r31, r3
181e: d8 f0 brcs .+54 ; 0x1856 <vfprintf+0x98>
1820: 8b 32 cpi r24, 0x2B ; 43
1822: 79 f0 breq .+30 ; 0x1842 <vfprintf+0x84>
1824: 38 f4 brcc .+14 ; 0x1834 <vfprintf+0x76>
1826: 80 32 cpi r24, 0x20 ; 32
1828: 79 f0 breq .+30 ; 0x1848 <vfprintf+0x8a>
182a: 83 32 cpi r24, 0x23 ; 35
182c: a1 f4 brne .+40 ; 0x1856 <vfprintf+0x98>
182e: 23 2d mov r18, r3
1830: 20 61 ori r18, 0x10 ; 16
1832: 1d c0 rjmp .+58 ; 0x186e <vfprintf+0xb0>
1834: 8d 32 cpi r24, 0x2D ; 45
1836: 61 f0 breq .+24 ; 0x1850 <vfprintf+0x92>
1838: 80 33 cpi r24, 0x30 ; 48
183a: 69 f4 brne .+26 ; 0x1856 <vfprintf+0x98>
183c: 23 2d mov r18, r3
183e: 21 60 ori r18, 0x01 ; 1
1840: 16 c0 rjmp .+44 ; 0x186e <vfprintf+0xb0>
1842: 83 2d mov r24, r3
1844: 82 60 ori r24, 0x02 ; 2
1846: 38 2e mov r3, r24
1848: e3 2d mov r30, r3
184a: e4 60 ori r30, 0x04 ; 4
184c: 3e 2e mov r3, r30
184e: 2a c0 rjmp .+84 ; 0x18a4 <vfprintf+0xe6>
1850: f3 2d mov r31, r3
1852: f8 60 ori r31, 0x08 ; 8
1854: 1d c0 rjmp .+58 ; 0x1890 <vfprintf+0xd2>
1856: 37 fc sbrc r3, 7
1858: 2d c0 rjmp .+90 ; 0x18b4 <vfprintf+0xf6>
185a: 20 ed ldi r18, 0xD0 ; 208
185c: 28 0f add r18, r24
185e: 2a 30 cpi r18, 0x0A ; 10
1860: 40 f0 brcs .+16 ; 0x1872 <vfprintf+0xb4>
1862: 8e 32 cpi r24, 0x2E ; 46
1864: b9 f4 brne .+46 ; 0x1894 <vfprintf+0xd6>
1866: 36 fc sbrc r3, 6
1868: 81 c1 rjmp .+770 ; 0x1b6c <vfprintf+0x3ae>
186a: 23 2d mov r18, r3
186c: 20 64 ori r18, 0x40 ; 64
186e: 32 2e mov r3, r18
1870: 19 c0 rjmp .+50 ; 0x18a4 <vfprintf+0xe6>
1872: 36 fe sbrs r3, 6
1874: 06 c0 rjmp .+12 ; 0x1882 <vfprintf+0xc4>
1876: 8a e0 ldi r24, 0x0A ; 10
1878: 98 9e mul r9, r24
187a: 20 0d add r18, r0
187c: 11 24 eor r1, r1
187e: 92 2e mov r9, r18
1880: 11 c0 rjmp .+34 ; 0x18a4 <vfprintf+0xe6>
1882: ea e0 ldi r30, 0x0A ; 10
1884: 2e 9e mul r2, r30
1886: 20 0d add r18, r0
1888: 11 24 eor r1, r1
188a: 22 2e mov r2, r18
188c: f3 2d mov r31, r3
188e: f0 62 ori r31, 0x20 ; 32
1890: 3f 2e mov r3, r31
1892: 08 c0 rjmp .+16 ; 0x18a4 <vfprintf+0xe6>
1894: 8c 36 cpi r24, 0x6C ; 108
1896: 21 f4 brne .+8 ; 0x18a0 <vfprintf+0xe2>
1898: 83 2d mov r24, r3
189a: 80 68 ori r24, 0x80 ; 128
189c: 38 2e mov r3, r24
189e: 02 c0 rjmp .+4 ; 0x18a4 <vfprintf+0xe6>
18a0: 88 36 cpi r24, 0x68 ; 104
18a2: 41 f4 brne .+16 ; 0x18b4 <vfprintf+0xf6>
18a4: f7 01 movw r30, r14
18a6: 93 fd sbrc r25, 3
18a8: 85 91 lpm r24, Z+
18aa: 93 ff sbrs r25, 3
18ac: 81 91 ld r24, Z+
18ae: 7f 01 movw r14, r30
18b0: 81 11 cpse r24, r1
18b2: b3 cf rjmp .-154 ; 0x181a <vfprintf+0x5c>
18b4: 98 2f mov r25, r24
18b6: 9f 7d andi r25, 0xDF ; 223
18b8: 95 54 subi r25, 0x45 ; 69
18ba: 93 30 cpi r25, 0x03 ; 3
18bc: 28 f4 brcc .+10 ; 0x18c8 <vfprintf+0x10a>
18be: 0c 5f subi r16, 0xFC ; 252
18c0: 1f 4f sbci r17, 0xFF ; 255
18c2: 9f e3 ldi r25, 0x3F ; 63
18c4: 99 83 std Y+1, r25 ; 0x01
18c6: 0d c0 rjmp .+26 ; 0x18e2 <vfprintf+0x124>
18c8: 83 36 cpi r24, 0x63 ; 99
18ca: 31 f0 breq .+12 ; 0x18d8 <vfprintf+0x11a>
18cc: 83 37 cpi r24, 0x73 ; 115
18ce: 71 f0 breq .+28 ; 0x18ec <vfprintf+0x12e>
18d0: 83 35 cpi r24, 0x53 ; 83
18d2: 09 f0 breq .+2 ; 0x18d6 <vfprintf+0x118>
18d4: 59 c0 rjmp .+178 ; 0x1988 <vfprintf+0x1ca>
18d6: 21 c0 rjmp .+66 ; 0x191a <vfprintf+0x15c>
18d8: f8 01 movw r30, r16
18da: 80 81 ld r24, Z
18dc: 89 83 std Y+1, r24 ; 0x01
18de: 0e 5f subi r16, 0xFE ; 254
18e0: 1f 4f sbci r17, 0xFF ; 255
18e2: 88 24 eor r8, r8
18e4: 83 94 inc r8
18e6: 91 2c mov r9, r1
18e8: 53 01 movw r10, r6
18ea: 13 c0 rjmp .+38 ; 0x1912 <vfprintf+0x154>
18ec: 28 01 movw r4, r16
18ee: f2 e0 ldi r31, 0x02 ; 2
18f0: 4f 0e add r4, r31
18f2: 51 1c adc r5, r1
18f4: f8 01 movw r30, r16
18f6: a0 80 ld r10, Z
18f8: b1 80 ldd r11, Z+1 ; 0x01
18fa: 36 fe sbrs r3, 6
18fc: 03 c0 rjmp .+6 ; 0x1904 <vfprintf+0x146>
18fe: 69 2d mov r22, r9
1900: 70 e0 ldi r23, 0x00 ; 0
1902: 02 c0 rjmp .+4 ; 0x1908 <vfprintf+0x14a>
1904: 6f ef ldi r22, 0xFF ; 255
1906: 7f ef ldi r23, 0xFF ; 255
1908: c5 01 movw r24, r10
190a: 0e 94 cb 0d call 0x1b96 ; 0x1b96 <strnlen>
190e: 4c 01 movw r8, r24
1910: 82 01 movw r16, r4
1912: f3 2d mov r31, r3
1914: ff 77 andi r31, 0x7F ; 127
1916: 3f 2e mov r3, r31
1918: 16 c0 rjmp .+44 ; 0x1946 <vfprintf+0x188>
191a: 28 01 movw r4, r16
191c: 22 e0 ldi r18, 0x02 ; 2
191e: 42 0e add r4, r18
1920: 51 1c adc r5, r1
1922: f8 01 movw r30, r16
1924: a0 80 ld r10, Z
1926: b1 80 ldd r11, Z+1 ; 0x01
1928: 36 fe sbrs r3, 6
192a: 03 c0 rjmp .+6 ; 0x1932 <vfprintf+0x174>
192c: 69 2d mov r22, r9
192e: 70 e0 ldi r23, 0x00 ; 0
1930: 02 c0 rjmp .+4 ; 0x1936 <vfprintf+0x178>
1932: 6f ef ldi r22, 0xFF ; 255
1934: 7f ef ldi r23, 0xFF ; 255
1936: c5 01 movw r24, r10
1938: 0e 94 c0 0d call 0x1b80 ; 0x1b80 <strnlen_P>
193c: 4c 01 movw r8, r24
193e: f3 2d mov r31, r3
1940: f0 68 ori r31, 0x80 ; 128
1942: 3f 2e mov r3, r31
1944: 82 01 movw r16, r4
1946: 33 fc sbrc r3, 3
1948: 1b c0 rjmp .+54 ; 0x1980 <vfprintf+0x1c2>
194a: 82 2d mov r24, r2
194c: 90 e0 ldi r25, 0x00 ; 0
194e: 88 16 cp r8, r24
1950: 99 06 cpc r9, r25
1952: b0 f4 brcc .+44 ; 0x1980 <vfprintf+0x1c2>
1954: b6 01 movw r22, r12
1956: 80 e2 ldi r24, 0x20 ; 32
1958: 90 e0 ldi r25, 0x00 ; 0
195a: 0e 94 d6 0d call 0x1bac ; 0x1bac <fputc>
195e: 2a 94 dec r2
1960: f4 cf rjmp .-24 ; 0x194a <vfprintf+0x18c>
1962: f5 01 movw r30, r10
1964: 37 fc sbrc r3, 7
1966: 85 91 lpm r24, Z+
1968: 37 fe sbrs r3, 7
196a: 81 91 ld r24, Z+
196c: 5f 01 movw r10, r30
196e: b6 01 movw r22, r12
1970: 90 e0 ldi r25, 0x00 ; 0
1972: 0e 94 d6 0d call 0x1bac ; 0x1bac <fputc>
1976: 21 10 cpse r2, r1
1978: 2a 94 dec r2
197a: 21 e0 ldi r18, 0x01 ; 1
197c: 82 1a sub r8, r18
197e: 91 08 sbc r9, r1
1980: 81 14 cp r8, r1
1982: 91 04 cpc r9, r1
1984: 71 f7 brne .-36 ; 0x1962 <vfprintf+0x1a4>
1986: e8 c0 rjmp .+464 ; 0x1b58 <vfprintf+0x39a>
1988: 84 36 cpi r24, 0x64 ; 100
198a: 11 f0 breq .+4 ; 0x1990 <vfprintf+0x1d2>
198c: 89 36 cpi r24, 0x69 ; 105
198e: 41 f5 brne .+80 ; 0x19e0 <vfprintf+0x222>
1990: f8 01 movw r30, r16
1992: 37 fe sbrs r3, 7
1994: 07 c0 rjmp .+14 ; 0x19a4 <vfprintf+0x1e6>
1996: 60 81 ld r22, Z
1998: 71 81 ldd r23, Z+1 ; 0x01
199a: 82 81 ldd r24, Z+2 ; 0x02
199c: 93 81 ldd r25, Z+3 ; 0x03
199e: 0c 5f subi r16, 0xFC ; 252
19a0: 1f 4f sbci r17, 0xFF ; 255
19a2: 08 c0 rjmp .+16 ; 0x19b4 <vfprintf+0x1f6>
19a4: 60 81 ld r22, Z
19a6: 71 81 ldd r23, Z+1 ; 0x01
19a8: 07 2e mov r0, r23
19aa: 00 0c add r0, r0
19ac: 88 0b sbc r24, r24
19ae: 99 0b sbc r25, r25
19b0: 0e 5f subi r16, 0xFE ; 254
19b2: 1f 4f sbci r17, 0xFF ; 255
19b4: f3 2d mov r31, r3
19b6: ff 76 andi r31, 0x6F ; 111
19b8: 3f 2e mov r3, r31
19ba: 97 ff sbrs r25, 7
19bc: 09 c0 rjmp .+18 ; 0x19d0 <vfprintf+0x212>
19be: 90 95 com r25
19c0: 80 95 com r24
19c2: 70 95 com r23
19c4: 61 95 neg r22
19c6: 7f 4f sbci r23, 0xFF ; 255
19c8: 8f 4f sbci r24, 0xFF ; 255
19ca: 9f 4f sbci r25, 0xFF ; 255
19cc: f0 68 ori r31, 0x80 ; 128
19ce: 3f 2e mov r3, r31
19d0: 2a e0 ldi r18, 0x0A ; 10
19d2: 30 e0 ldi r19, 0x00 ; 0
19d4: a3 01 movw r20, r6
19d6: 0e 94 12 0e call 0x1c24 ; 0x1c24 <__ultoa_invert>
19da: 88 2e mov r8, r24
19dc: 86 18 sub r8, r6
19de: 45 c0 rjmp .+138 ; 0x1a6a <vfprintf+0x2ac>
19e0: 85 37 cpi r24, 0x75 ; 117
19e2: 31 f4 brne .+12 ; 0x19f0 <vfprintf+0x232>
19e4: 23 2d mov r18, r3
19e6: 2f 7e andi r18, 0xEF ; 239
19e8: b2 2e mov r11, r18
19ea: 2a e0 ldi r18, 0x0A ; 10
19ec: 30 e0 ldi r19, 0x00 ; 0
19ee: 25 c0 rjmp .+74 ; 0x1a3a <vfprintf+0x27c>
19f0: 93 2d mov r25, r3
19f2: 99 7f andi r25, 0xF9 ; 249
19f4: b9 2e mov r11, r25
19f6: 8f 36 cpi r24, 0x6F ; 111
19f8: c1 f0 breq .+48 ; 0x1a2a <vfprintf+0x26c>
19fa: 18 f4 brcc .+6 ; 0x1a02 <vfprintf+0x244>
19fc: 88 35 cpi r24, 0x58 ; 88
19fe: 79 f0 breq .+30 ; 0x1a1e <vfprintf+0x260>
1a00: b5 c0 rjmp .+362 ; 0x1b6c <vfprintf+0x3ae>
1a02: 80 37 cpi r24, 0x70 ; 112
1a04: 19 f0 breq .+6 ; 0x1a0c <vfprintf+0x24e>
1a06: 88 37 cpi r24, 0x78 ; 120
1a08: 21 f0 breq .+8 ; 0x1a12 <vfprintf+0x254>
1a0a: b0 c0 rjmp .+352 ; 0x1b6c <vfprintf+0x3ae>
1a0c: e9 2f mov r30, r25
1a0e: e0 61 ori r30, 0x10 ; 16
1a10: be 2e mov r11, r30
1a12: b4 fe sbrs r11, 4
1a14: 0d c0 rjmp .+26 ; 0x1a30 <vfprintf+0x272>
1a16: fb 2d mov r31, r11
1a18: f4 60 ori r31, 0x04 ; 4
1a1a: bf 2e mov r11, r31
1a1c: 09 c0 rjmp .+18 ; 0x1a30 <vfprintf+0x272>
1a1e: 34 fe sbrs r3, 4
1a20: 0a c0 rjmp .+20 ; 0x1a36 <vfprintf+0x278>
1a22: 29 2f mov r18, r25
1a24: 26 60 ori r18, 0x06 ; 6
1a26: b2 2e mov r11, r18
1a28: 06 c0 rjmp .+12 ; 0x1a36 <vfprintf+0x278>
1a2a: 28 e0 ldi r18, 0x08 ; 8
1a2c: 30 e0 ldi r19, 0x00 ; 0
1a2e: 05 c0 rjmp .+10 ; 0x1a3a <vfprintf+0x27c>
1a30: 20 e1 ldi r18, 0x10 ; 16
1a32: 30 e0 ldi r19, 0x00 ; 0
1a34: 02 c0 rjmp .+4 ; 0x1a3a <vfprintf+0x27c>
1a36: 20 e1 ldi r18, 0x10 ; 16
1a38: 32 e0 ldi r19, 0x02 ; 2
1a3a: f8 01 movw r30, r16
1a3c: b7 fe sbrs r11, 7
1a3e: 07 c0 rjmp .+14 ; 0x1a4e <vfprintf+0x290>
1a40: 60 81 ld r22, Z
1a42: 71 81 ldd r23, Z+1 ; 0x01
1a44: 82 81 ldd r24, Z+2 ; 0x02
1a46: 93 81 ldd r25, Z+3 ; 0x03
1a48: 0c 5f subi r16, 0xFC ; 252
1a4a: 1f 4f sbci r17, 0xFF ; 255
1a4c: 06 c0 rjmp .+12 ; 0x1a5a <vfprintf+0x29c>
1a4e: 60 81 ld r22, Z
1a50: 71 81 ldd r23, Z+1 ; 0x01
1a52: 80 e0 ldi r24, 0x00 ; 0
1a54: 90 e0 ldi r25, 0x00 ; 0
1a56: 0e 5f subi r16, 0xFE ; 254
1a58: 1f 4f sbci r17, 0xFF ; 255
1a5a: a3 01 movw r20, r6
1a5c: 0e 94 12 0e call 0x1c24 ; 0x1c24 <__ultoa_invert>
1a60: 88 2e mov r8, r24
1a62: 86 18 sub r8, r6
1a64: fb 2d mov r31, r11
1a66: ff 77 andi r31, 0x7F ; 127
1a68: 3f 2e mov r3, r31
1a6a: 36 fe sbrs r3, 6
1a6c: 0d c0 rjmp .+26 ; 0x1a88 <vfprintf+0x2ca>
1a6e: 23 2d mov r18, r3
1a70: 2e 7f andi r18, 0xFE ; 254
1a72: a2 2e mov r10, r18
1a74: 89 14 cp r8, r9
1a76: 58 f4 brcc .+22 ; 0x1a8e <vfprintf+0x2d0>
1a78: 34 fe sbrs r3, 4
1a7a: 0b c0 rjmp .+22 ; 0x1a92 <vfprintf+0x2d4>
1a7c: 32 fc sbrc r3, 2
1a7e: 09 c0 rjmp .+18 ; 0x1a92 <vfprintf+0x2d4>
1a80: 83 2d mov r24, r3
1a82: 8e 7e andi r24, 0xEE ; 238
1a84: a8 2e mov r10, r24
1a86: 05 c0 rjmp .+10 ; 0x1a92 <vfprintf+0x2d4>
1a88: b8 2c mov r11, r8
1a8a: a3 2c mov r10, r3
1a8c: 03 c0 rjmp .+6 ; 0x1a94 <vfprintf+0x2d6>
1a8e: b8 2c mov r11, r8
1a90: 01 c0 rjmp .+2 ; 0x1a94 <vfprintf+0x2d6>
1a92: b9 2c mov r11, r9
1a94: a4 fe sbrs r10, 4
1a96: 0f c0 rjmp .+30 ; 0x1ab6 <vfprintf+0x2f8>
1a98: fe 01 movw r30, r28
1a9a: e8 0d add r30, r8
1a9c: f1 1d adc r31, r1
1a9e: 80 81 ld r24, Z
1aa0: 80 33 cpi r24, 0x30 ; 48
1aa2: 21 f4 brne .+8 ; 0x1aac <vfprintf+0x2ee>
1aa4: 9a 2d mov r25, r10
1aa6: 99 7e andi r25, 0xE9 ; 233
1aa8: a9 2e mov r10, r25
1aaa: 09 c0 rjmp .+18 ; 0x1abe <vfprintf+0x300>
1aac: a2 fe sbrs r10, 2
1aae: 06 c0 rjmp .+12 ; 0x1abc <vfprintf+0x2fe>
1ab0: b3 94 inc r11
1ab2: b3 94 inc r11
1ab4: 04 c0 rjmp .+8 ; 0x1abe <vfprintf+0x300>
1ab6: 8a 2d mov r24, r10
1ab8: 86 78 andi r24, 0x86 ; 134
1aba: 09 f0 breq .+2 ; 0x1abe <vfprintf+0x300>
1abc: b3 94 inc r11
1abe: a3 fc sbrc r10, 3
1ac0: 11 c0 rjmp .+34 ; 0x1ae4 <vfprintf+0x326>
1ac2: a0 fe sbrs r10, 0
1ac4: 06 c0 rjmp .+12 ; 0x1ad2 <vfprintf+0x314>
1ac6: b2 14 cp r11, r2
1ac8: 88 f4 brcc .+34 ; 0x1aec <vfprintf+0x32e>
1aca: 28 0c add r2, r8
1acc: 92 2c mov r9, r2
1ace: 9b 18 sub r9, r11
1ad0: 0e c0 rjmp .+28 ; 0x1aee <vfprintf+0x330>
1ad2: b2 14 cp r11, r2
1ad4: 60 f4 brcc .+24 ; 0x1aee <vfprintf+0x330>
1ad6: b6 01 movw r22, r12
1ad8: 80 e2 ldi r24, 0x20 ; 32
1ada: 90 e0 ldi r25, 0x00 ; 0
1adc: 0e 94 d6 0d call 0x1bac ; 0x1bac <fputc>
1ae0: b3 94 inc r11
1ae2: f7 cf rjmp .-18 ; 0x1ad2 <vfprintf+0x314>
1ae4: b2 14 cp r11, r2
1ae6: 18 f4 brcc .+6 ; 0x1aee <vfprintf+0x330>
1ae8: 2b 18 sub r2, r11
1aea: 02 c0 rjmp .+4 ; 0x1af0 <vfprintf+0x332>
1aec: 98 2c mov r9, r8
1aee: 21 2c mov r2, r1
1af0: a4 fe sbrs r10, 4
1af2: 10 c0 rjmp .+32 ; 0x1b14 <vfprintf+0x356>
1af4: b6 01 movw r22, r12
1af6: 80 e3 ldi r24, 0x30 ; 48
1af8: 90 e0 ldi r25, 0x00 ; 0
1afa: 0e 94 d6 0d call 0x1bac ; 0x1bac <fputc>
1afe: a2 fe sbrs r10, 2
1b00: 17 c0 rjmp .+46 ; 0x1b30 <vfprintf+0x372>
1b02: a1 fc sbrc r10, 1
1b04: 03 c0 rjmp .+6 ; 0x1b0c <vfprintf+0x34e>
1b06: 88 e7 ldi r24, 0x78 ; 120
1b08: 90 e0 ldi r25, 0x00 ; 0
1b0a: 02 c0 rjmp .+4 ; 0x1b10 <vfprintf+0x352>
1b0c: 88 e5 ldi r24, 0x58 ; 88
1b0e: 90 e0 ldi r25, 0x00 ; 0
1b10: b6 01 movw r22, r12
1b12: 0c c0 rjmp .+24 ; 0x1b2c <vfprintf+0x36e>
1b14: 8a 2d mov r24, r10
1b16: 86 78 andi r24, 0x86 ; 134
1b18: 59 f0 breq .+22 ; 0x1b30 <vfprintf+0x372>
1b1a: a1 fe sbrs r10, 1
1b1c: 02 c0 rjmp .+4 ; 0x1b22 <vfprintf+0x364>
1b1e: 8b e2 ldi r24, 0x2B ; 43
1b20: 01 c0 rjmp .+2 ; 0x1b24 <vfprintf+0x366>
1b22: 80 e2 ldi r24, 0x20 ; 32
1b24: a7 fc sbrc r10, 7
1b26: 8d e2 ldi r24, 0x2D ; 45
1b28: b6 01 movw r22, r12
1b2a: 90 e0 ldi r25, 0x00 ; 0
1b2c: 0e 94 d6 0d call 0x1bac ; 0x1bac <fputc>
1b30: 89 14 cp r8, r9
1b32: 38 f4 brcc .+14 ; 0x1b42 <vfprintf+0x384>
1b34: b6 01 movw r22, r12
1b36: 80 e3 ldi r24, 0x30 ; 48
1b38: 90 e0 ldi r25, 0x00 ; 0
1b3a: 0e 94 d6 0d call 0x1bac ; 0x1bac <fputc>
1b3e: 9a 94 dec r9
1b40: f7 cf rjmp .-18 ; 0x1b30 <vfprintf+0x372>
1b42: 8a 94 dec r8
1b44: f3 01 movw r30, r6
1b46: e8 0d add r30, r8
1b48: f1 1d adc r31, r1
1b4a: 80 81 ld r24, Z
1b4c: b6 01 movw r22, r12
1b4e: 90 e0 ldi r25, 0x00 ; 0
1b50: 0e 94 d6 0d call 0x1bac ; 0x1bac <fputc>
1b54: 81 10 cpse r8, r1
1b56: f5 cf rjmp .-22 ; 0x1b42 <vfprintf+0x384>
1b58: 22 20 and r2, r2
1b5a: 09 f4 brne .+2 ; 0x1b5e <vfprintf+0x3a0>
1b5c: 42 ce rjmp .-892 ; 0x17e2 <vfprintf+0x24>
1b5e: b6 01 movw r22, r12
1b60: 80 e2 ldi r24, 0x20 ; 32
1b62: 90 e0 ldi r25, 0x00 ; 0
1b64: 0e 94 d6 0d call 0x1bac ; 0x1bac <fputc>
1b68: 2a 94 dec r2
1b6a: f6 cf rjmp .-20 ; 0x1b58 <vfprintf+0x39a>
1b6c: f6 01 movw r30, r12
1b6e: 86 81 ldd r24, Z+6 ; 0x06
1b70: 97 81 ldd r25, Z+7 ; 0x07
1b72: 02 c0 rjmp .+4 ; 0x1b78 <vfprintf+0x3ba>
1b74: 8f ef ldi r24, 0xFF ; 255
1b76: 9f ef ldi r25, 0xFF ; 255
1b78: 2b 96 adiw r28, 0x0b ; 11
1b7a: e2 e1 ldi r30, 0x12 ; 18
1b7c: 0c 94 8c 0e jmp 0x1d18 ; 0x1d18 <__epilogue_restores__>
00001b80 <strnlen_P>:
1b80: fc 01 movw r30, r24
1b82: 05 90 lpm r0, Z+
1b84: 61 50 subi r22, 0x01 ; 1
1b86: 70 40 sbci r23, 0x00 ; 0
1b88: 01 10 cpse r0, r1
1b8a: d8 f7 brcc .-10 ; 0x1b82 <strnlen_P+0x2>
1b8c: 80 95 com r24
1b8e: 90 95 com r25
1b90: 8e 0f add r24, r30
1b92: 9f 1f adc r25, r31
1b94: 08 95 ret
00001b96 <strnlen>:
1b96: fc 01 movw r30, r24
1b98: 61 50 subi r22, 0x01 ; 1
1b9a: 70 40 sbci r23, 0x00 ; 0
1b9c: 01 90 ld r0, Z+
1b9e: 01 10 cpse r0, r1
1ba0: d8 f7 brcc .-10 ; 0x1b98 <strnlen+0x2>
1ba2: 80 95 com r24
1ba4: 90 95 com r25
1ba6: 8e 0f add r24, r30
1ba8: 9f 1f adc r25, r31
1baa: 08 95 ret
00001bac <fputc>:
1bac: 0f 93 push r16
1bae: 1f 93 push r17
1bb0: cf 93 push r28
1bb2: df 93 push r29
1bb4: fb 01 movw r30, r22
1bb6: 23 81 ldd r18, Z+3 ; 0x03
1bb8: 21 fd sbrc r18, 1
1bba: 03 c0 rjmp .+6 ; 0x1bc2 <fputc+0x16>
1bbc: 8f ef ldi r24, 0xFF ; 255
1bbe: 9f ef ldi r25, 0xFF ; 255
1bc0: 2c c0 rjmp .+88 ; 0x1c1a <fputc+0x6e>
1bc2: 22 ff sbrs r18, 2
1bc4: 16 c0 rjmp .+44 ; 0x1bf2 <fputc+0x46>
1bc6: 46 81 ldd r20, Z+6 ; 0x06
1bc8: 57 81 ldd r21, Z+7 ; 0x07
1bca: 24 81 ldd r18, Z+4 ; 0x04
1bcc: 35 81 ldd r19, Z+5 ; 0x05
1bce: 42 17 cp r20, r18
1bd0: 53 07 cpc r21, r19
1bd2: 44 f4 brge .+16 ; 0x1be4 <fputc+0x38>
1bd4: a0 81 ld r26, Z
1bd6: b1 81 ldd r27, Z+1 ; 0x01
1bd8: 9d 01 movw r18, r26
1bda: 2f 5f subi r18, 0xFF ; 255
1bdc: 3f 4f sbci r19, 0xFF ; 255
1bde: 31 83 std Z+1, r19 ; 0x01
1be0: 20 83 st Z, r18
1be2: 8c 93 st X, r24
1be4: 26 81 ldd r18, Z+6 ; 0x06
1be6: 37 81 ldd r19, Z+7 ; 0x07
1be8: 2f 5f subi r18, 0xFF ; 255
1bea: 3f 4f sbci r19, 0xFF ; 255
1bec: 37 83 std Z+7, r19 ; 0x07
1bee: 26 83 std Z+6, r18 ; 0x06
1bf0: 14 c0 rjmp .+40 ; 0x1c1a <fputc+0x6e>
1bf2: 8b 01 movw r16, r22
1bf4: ec 01 movw r28, r24
1bf6: fb 01 movw r30, r22
1bf8: 00 84 ldd r0, Z+8 ; 0x08
1bfa: f1 85 ldd r31, Z+9 ; 0x09
1bfc: e0 2d mov r30, r0
1bfe: 09 95 icall
1c00: 89 2b or r24, r25
1c02: e1 f6 brne .-72 ; 0x1bbc <fputc+0x10>
1c04: d8 01 movw r26, r16
1c06: 16 96 adiw r26, 0x06 ; 6
1c08: 8d 91 ld r24, X+
1c0a: 9c 91 ld r25, X
1c0c: 17 97 sbiw r26, 0x07 ; 7
1c0e: 01 96 adiw r24, 0x01 ; 1
1c10: 17 96 adiw r26, 0x07 ; 7
1c12: 9c 93 st X, r25
1c14: 8e 93 st -X, r24
1c16: 16 97 sbiw r26, 0x06 ; 6
1c18: ce 01 movw r24, r28
1c1a: df 91 pop r29
1c1c: cf 91 pop r28
1c1e: 1f 91 pop r17
1c20: 0f 91 pop r16
1c22: 08 95 ret
00001c24 <__ultoa_invert>:
1c24: fa 01 movw r30, r20
1c26: aa 27 eor r26, r26
1c28: 28 30 cpi r18, 0x08 ; 8
1c2a: 51 f1 breq .+84 ; 0x1c80 <__ultoa_invert+0x5c>
1c2c: 20 31 cpi r18, 0x10 ; 16
1c2e: 81 f1 breq .+96 ; 0x1c90 <__ultoa_invert+0x6c>
1c30: e8 94 clt
1c32: 6f 93 push r22
1c34: 6e 7f andi r22, 0xFE ; 254
1c36: 6e 5f subi r22, 0xFE ; 254
1c38: 7f 4f sbci r23, 0xFF ; 255
1c3a: 8f 4f sbci r24, 0xFF ; 255
1c3c: 9f 4f sbci r25, 0xFF ; 255
1c3e: af 4f sbci r26, 0xFF ; 255
1c40: b1 e0 ldi r27, 0x01 ; 1
1c42: 3e d0 rcall .+124 ; 0x1cc0 <__ultoa_invert+0x9c>
1c44: b4 e0 ldi r27, 0x04 ; 4
1c46: 3c d0 rcall .+120 ; 0x1cc0 <__ultoa_invert+0x9c>
1c48: 67 0f add r22, r23
1c4a: 78 1f adc r23, r24
1c4c: 89 1f adc r24, r25
1c4e: 9a 1f adc r25, r26
1c50: a1 1d adc r26, r1
1c52: 68 0f add r22, r24
1c54: 79 1f adc r23, r25
1c56: 8a 1f adc r24, r26
1c58: 91 1d adc r25, r1
1c5a: a1 1d adc r26, r1
1c5c: 6a 0f add r22, r26
1c5e: 71 1d adc r23, r1
1c60: 81 1d adc r24, r1
1c62: 91 1d adc r25, r1
1c64: a1 1d adc r26, r1
1c66: 20 d0 rcall .+64 ; 0x1ca8 <__ultoa_invert+0x84>
1c68: 09 f4 brne .+2 ; 0x1c6c <__ultoa_invert+0x48>
1c6a: 68 94 set
1c6c: 3f 91 pop r19
1c6e: 2a e0 ldi r18, 0x0A ; 10
1c70: 26 9f mul r18, r22
1c72: 11 24 eor r1, r1
1c74: 30 19 sub r19, r0
1c76: 30 5d subi r19, 0xD0 ; 208
1c78: 31 93 st Z+, r19
1c7a: de f6 brtc .-74 ; 0x1c32 <__ultoa_invert+0xe>
1c7c: cf 01 movw r24, r30
1c7e: 08 95 ret
1c80: 46 2f mov r20, r22
1c82: 47 70 andi r20, 0x07 ; 7
1c84: 40 5d subi r20, 0xD0 ; 208
1c86: 41 93 st Z+, r20
1c88: b3 e0 ldi r27, 0x03 ; 3
1c8a: 0f d0 rcall .+30 ; 0x1caa <__ultoa_invert+0x86>
1c8c: c9 f7 brne .-14 ; 0x1c80 <__ultoa_invert+0x5c>
1c8e: f6 cf rjmp .-20 ; 0x1c7c <__ultoa_invert+0x58>
1c90: 46 2f mov r20, r22
1c92: 4f 70 andi r20, 0x0F ; 15
1c94: 40 5d subi r20, 0xD0 ; 208
1c96: 4a 33 cpi r20, 0x3A ; 58
1c98: 18 f0 brcs .+6 ; 0x1ca0 <__ultoa_invert+0x7c>
1c9a: 49 5d subi r20, 0xD9 ; 217
1c9c: 31 fd sbrc r19, 1
1c9e: 40 52 subi r20, 0x20 ; 32
1ca0: 41 93 st Z+, r20
1ca2: 02 d0 rcall .+4 ; 0x1ca8 <__ultoa_invert+0x84>
1ca4: a9 f7 brne .-22 ; 0x1c90 <__ultoa_invert+0x6c>
1ca6: ea cf rjmp .-44 ; 0x1c7c <__ultoa_invert+0x58>
1ca8: b4 e0 ldi r27, 0x04 ; 4
1caa: a6 95 lsr r26
1cac: 97 95 ror r25
1cae: 87 95 ror r24
1cb0: 77 95 ror r23
1cb2: 67 95 ror r22
1cb4: ba 95 dec r27
1cb6: c9 f7 brne .-14 ; 0x1caa <__ultoa_invert+0x86>
1cb8: 00 97 sbiw r24, 0x00 ; 0
1cba: 61 05 cpc r22, r1
1cbc: 71 05 cpc r23, r1
1cbe: 08 95 ret
1cc0: 9b 01 movw r18, r22
1cc2: ac 01 movw r20, r24
1cc4: 0a 2e mov r0, r26
1cc6: 06 94 lsr r0
1cc8: 57 95 ror r21
1cca: 47 95 ror r20
1ccc: 37 95 ror r19
1cce: 27 95 ror r18
1cd0: ba 95 dec r27
1cd2: c9 f7 brne .-14 ; 0x1cc6 <__ultoa_invert+0xa2>
1cd4: 62 0f add r22, r18
1cd6: 73 1f adc r23, r19
1cd8: 84 1f adc r24, r20
1cda: 95 1f adc r25, r21
1cdc: a0 1d adc r26, r0
1cde: 08 95 ret
00001ce0 <__prologue_saves__>:
1ce0: 2f 92 push r2
1ce2: 3f 92 push r3
1ce4: 4f 92 push r4
1ce6: 5f 92 push r5
1ce8: 6f 92 push r6
1cea: 7f 92 push r7
1cec: 8f 92 push r8
1cee: 9f 92 push r9
1cf0: af 92 push r10
1cf2: bf 92 push r11
1cf4: cf 92 push r12
1cf6: df 92 push r13
1cf8: ef 92 push r14
1cfa: ff 92 push r15
1cfc: 0f 93 push r16
1cfe: 1f 93 push r17
1d00: cf 93 push r28
1d02: df 93 push r29
1d04: cd b7 in r28, 0x3d ; 61
1d06: de b7 in r29, 0x3e ; 62
1d08: ca 1b sub r28, r26
1d0a: db 0b sbc r29, r27
1d0c: 0f b6 in r0, 0x3f ; 63
1d0e: f8 94 cli
1d10: de bf out 0x3e, r29 ; 62
1d12: 0f be out 0x3f, r0 ; 63
1d14: cd bf out 0x3d, r28 ; 61
1d16: 09 94 ijmp
00001d18 <__epilogue_restores__>:
1d18: 2a 88 ldd r2, Y+18 ; 0x12
1d1a: 39 88 ldd r3, Y+17 ; 0x11
1d1c: 48 88 ldd r4, Y+16 ; 0x10
1d1e: 5f 84 ldd r5, Y+15 ; 0x0f
1d20: 6e 84 ldd r6, Y+14 ; 0x0e
1d22: 7d 84 ldd r7, Y+13 ; 0x0d
1d24: 8c 84 ldd r8, Y+12 ; 0x0c
1d26: 9b 84 ldd r9, Y+11 ; 0x0b
1d28: aa 84 ldd r10, Y+10 ; 0x0a
1d2a: b9 84 ldd r11, Y+9 ; 0x09
1d2c: c8 84 ldd r12, Y+8 ; 0x08
1d2e: df 80 ldd r13, Y+7 ; 0x07
1d30: ee 80 ldd r14, Y+6 ; 0x06
1d32: fd 80 ldd r15, Y+5 ; 0x05
1d34: 0c 81 ldd r16, Y+4 ; 0x04
1d36: 1b 81 ldd r17, Y+3 ; 0x03
1d38: aa 81 ldd r26, Y+2 ; 0x02
1d3a: b9 81 ldd r27, Y+1 ; 0x01
1d3c: ce 0f add r28, r30
1d3e: d1 1d adc r29, r1
1d40: 0f b6 in r0, 0x3f ; 63
1d42: f8 94 cli
1d44: de bf out 0x3e, r29 ; 62
1d46: 0f be out 0x3f, r0 ; 63
1d48: cd bf out 0x3d, r28 ; 61
1d4a: ed 01 movw r28, r26
1d4c: 08 95 ret
00001d4e <_exit>:
1d4e: f8 94 cli
00001d50 <__stop_program>:
1d50: ff cf rjmp .-2 ; 0x1d50 <__stop_program>