Testground/Test/Debug/Test.lss
2013-10-06 16:10:06 +00:00

3895 lines
151 KiB
Plaintext
Raw Permalink Blame History

Test.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .data 000000f2 00800100 000017f6 0000188a 2**0
CONTENTS, ALLOC, LOAD, DATA
1 .text 000017f6 00000000 00000000 00000094 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .bss 00000014 008001f2 008001f2 0000197c 2**0
ALLOC
3 .stab 00001254 00000000 00000000 0000197c 2**2
CONTENTS, READONLY, DEBUGGING
4 .stabstr 0000032e 00000000 00000000 00002bd0 2**0
CONTENTS, READONLY, DEBUGGING
5 .comment 0000002f 00000000 00000000 00002efe 2**0
CONTENTS, READONLY
6 .debug_aranges 00000208 00000000 00000000 00002f2d 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_info 000027cc 00000000 00000000 00003135 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_abbrev 00000fcb 00000000 00000000 00005901 2**0
CONTENTS, READONLY, DEBUGGING
9 .debug_line 000013d8 00000000 00000000 000068cc 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_frame 000004f8 00000000 00000000 00007ca4 2**2
CONTENTS, READONLY, DEBUGGING
11 .debug_str 000008f9 00000000 00000000 0000819c 2**0
CONTENTS, READONLY, DEBUGGING
12 .debug_loc 0000202b 00000000 00000000 00008a95 2**0
CONTENTS, READONLY, DEBUGGING
13 .debug_ranges 00000150 00000000 00000000 0000aac0 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00000000 <__vectors>:
0: 0c 94 69 00 jmp 0xd2 ; 0xd2 <__ctors_end>
4: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
8: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
c: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
10: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
14: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
18: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
1c: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
20: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
24: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
28: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
2c: 0c 94 e1 03 jmp 0x7c2 ; 0x7c2 <__vector_11>
30: 0c 94 09 04 jmp 0x812 ; 0x812 <__vector_12>
34: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
38: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
3c: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
40: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
44: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
48: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
4c: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
50: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
54: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
58: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
5c: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
60: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
64: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
68: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
6c: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
70: 0c 94 86 00 jmp 0x10c ; 0x10c <__bad_interrupt>
00000074 <device_descriptor>:
74: 12 01 00 02 02 00 00 10 01 00 03 00 00 01 01 02 ................
84: 03 01 ..
00000086 <string0>:
86: 04 03 09 04 ....
0000008a <string1>:
8a: 14 03 42 00 6c 00 75 00 62 00 62 00 46 00 69 00 ..B.l.u.b.b.F.i.
9a: 73 00 68 00 00 00 s.h...
000000a0 <string2>:
a0: 20 03 48 00 61 00 63 00 6b 00 65 00 72 00 2d 00 .H.a.c.k.e.r.-.
b0: 4a 00 65 00 6f 00 70 00 61 00 72 00 64 00 79 00 J.e.o.p.a.r.d.y.
...
000000c2 <string3>:
c2: 0e 03 30 00 30 00 30 00 30 00 30 00 30 00 00 00 ..0.0.0.0.0.0...
000000d2 <__ctors_end>:
d2: 11 24 eor r1, r1
d4: 1f be out 0x3f, r1 ; 63
d6: cf ef ldi r28, 0xFF ; 255
d8: d4 e0 ldi r29, 0x04 ; 4
da: de bf out 0x3e, r29 ; 62
dc: cd bf out 0x3d, r28 ; 61
000000de <__do_copy_data>:
de: 11 e0 ldi r17, 0x01 ; 1
e0: a0 e0 ldi r26, 0x00 ; 0
e2: b1 e0 ldi r27, 0x01 ; 1
e4: e6 ef ldi r30, 0xF6 ; 246
e6: f7 e1 ldi r31, 0x17 ; 23
e8: 02 c0 rjmp .+4 ; 0xee <__do_copy_data+0x10>
ea: 05 90 lpm r0, Z+
ec: 0d 92 st X+, r0
ee: a2 3f cpi r26, 0xF2 ; 242
f0: b1 07 cpc r27, r17
f2: d9 f7 brne .-10 ; 0xea <__do_copy_data+0xc>
000000f4 <__do_clear_bss>:
f4: 22 e0 ldi r18, 0x02 ; 2
f6: a2 ef ldi r26, 0xF2 ; 242
f8: b1 e0 ldi r27, 0x01 ; 1
fa: 01 c0 rjmp .+2 ; 0xfe <.do_clear_bss_start>
000000fc <.do_clear_bss_loop>:
fc: 1d 92 st X+, r1
000000fe <.do_clear_bss_start>:
fe: a6 30 cpi r26, 0x06 ; 6
100: b2 07 cpc r27, r18
102: e1 f7 brne .-8 ; 0xfc <.do_clear_bss_loop>
104: 0e 94 44 02 call 0x488 ; 0x488 <main>
108: 0c 94 f9 0b jmp 0x17f2 ; 0x17f2 <_exit>
0000010c <__bad_interrupt>:
10c: 0c 94 00 00 jmp 0 ; 0x0 <__vectors>
00000110 <ledg>:
int rgb = 0;
rgb |= (mask & (1<<0)) ? (1<<0) : (0<<0);
rgb |= (mask & (1<<1)) ? (1<<1) : (0<<1);
rgb |= (mask & (1<<2)) ? (1<<2) : (0<<2);
PORTB &= ~((1<<PINB5) | (1<<PINB6) | (1<<PINB7));
110: 95 b1 in r25, 0x05 ; 5
112: 9f 71 andi r25, 0x1F ; 31
114: 95 b9 out 0x05, r25 ; 5
PORTB |= (rgb<<PINB5);
116: 95 b1 in r25, 0x05 ; 5
118: 82 95 swap r24
11a: 88 0f add r24, r24
11c: 80 7e andi r24, 0xE0 ; 224
11e: 98 2b or r25, r24
120: 95 b9 out 0x05, r25 ; 5
122: 08 95 ret
00000124 <init_led>:
}
void init_led()
{
DDRB |= (1<<PINB7) | (1<<PINB6) | (1<<PINB5);
124: 84 b1 in r24, 0x04 ; 4
126: 80 6e ori r24, 0xE0 ; 224
128: 84 b9 out 0x04, r24 ; 4
12a: 08 95 ret
0000012c <uart_putchar>:
#include "rs232.h"
int uart_putchar(char c, FILE *stream)
{
12c: cf 93 push r28
12e: c8 2f mov r28, r24
if (c == '\n') {
130: 8a 30 cpi r24, 0x0A ; 10
132: 19 f4 brne .+6 ; 0x13a <uart_putchar+0xe>
uart_putchar('\r', stream); //Warten solange bis Zeichen gesendet wurde
134: 8d e0 ldi r24, 0x0D ; 13
136: 0e 94 96 00 call 0x12c ; 0x12c <uart_putchar>
}
loop_until_bit_is_set(UCSR1A, UDRE1); //Ausgabe des Zeichens
13a: e8 ec ldi r30, 0xC8 ; 200
13c: f0 e0 ldi r31, 0x00 ; 0
13e: 90 81 ld r25, Z
140: 95 ff sbrs r25, 5
142: fd cf rjmp .-6 ; 0x13e <uart_putchar+0x12>
UDR1 = c;
144: c0 93 ce 00 sts 0x00CE, r28
return (0);
}
148: 80 e0 ldi r24, 0x00 ; 0
14a: 90 e0 ldi r25, 0x00 ; 0
14c: cf 91 pop r28
14e: 08 95 ret
00000150 <init_rs232>:
void init_rs232()
{
UCSR1C = (1 << UCSZ11) |(1 << UCSZ10); //8N1
150: 86 e0 ldi r24, 0x06 ; 6
152: 80 93 ca 00 sts 0x00CA, r24
UCSR1B |= /*(1<<RXEN1) | (1<<RXCIE1) | */ (1<<TXEN1); //Enable TXEN im Register UCR TX-Data Enable
156: e9 ec ldi r30, 0xC9 ; 201
158: f0 e0 ldi r31, 0x00 ; 0
15a: 80 81 ld r24, Z
15c: 88 60 ori r24, 0x08 ; 8
15e: 80 83 st Z, r24
UBRR1L = (F_CPU / (BAUD_RATE * 16L) - 1); //Teiler wird gesetzt
160: 87 e6 ldi r24, 0x67 ; 103
162: 80 93 cc 00 sts 0x00CC, r24
stdout = &rs232; //<2F>ffnet einen Kanal f<>r printf (STDOUT)
166: 80 e0 ldi r24, 0x00 ; 0
168: 91 e0 ldi r25, 0x01 ; 1
16a: 90 93 03 02 sts 0x0203, r25
16e: 80 93 02 02 sts 0x0202, r24
172: 08 95 ret
00000174 <init>:
#include "usb_serial_config.h" // USB configuration
#include "usb_serial.h"
void init()
{
init_led();
174: 0e 94 92 00 call 0x124 ; 0x124 <init_led>
ledg(YELLOW);
178: 86 e0 ldi r24, 0x06 ; 6
17a: 90 e0 ldi r25, 0x00 ; 0
17c: 0e 94 88 00 call 0x110 ; 0x110 <ledg>
ledg(WHITE);
180: 87 e0 ldi r24, 0x07 ; 7
182: 90 e0 ldi r25, 0x00 ; 0
184: 0e 94 88 00 call 0x110 ; 0x110 <ledg>
init_rs232();
188: 0e 94 a8 00 call 0x150 ; 0x150 <init_rs232>
ledg(YELLOW);
18c: 86 e0 ldi r24, 0x06 ; 6
18e: 90 e0 ldi r25, 0x00 ; 0
190: 0e 94 88 00 call 0x110 ; 0x110 <ledg>
usb_init(); // initialize USB
194: 0e 94 9f 02 call 0x53e ; 0x53e <usb_init>
sei();
198: 78 94 sei
fprintf(&rs232, "Init....\n");
19a: 2e e0 ldi r18, 0x0E ; 14
19c: 31 e0 ldi r19, 0x01 ; 1
19e: 49 e0 ldi r20, 0x09 ; 9
1a0: 50 e0 ldi r21, 0x00 ; 0
1a2: 61 e0 ldi r22, 0x01 ; 1
1a4: 70 e0 ldi r23, 0x00 ; 0
1a6: 8f e6 ldi r24, 0x6F ; 111
1a8: 91 e0 ldi r25, 0x01 ; 1
1aa: 0e 94 a0 08 call 0x1140 ; 0x1140 <fwrite>
1ae: 08 95 ret
000001b0 <cdc_notify_getlinecoding>:
//-----------------------------------------------------------------------------
// This routine is called, when baudrate and transmission parameters (see
// cdc_linecoding in usb_serial.h) are requested by the host.
// Parameters of this variable can be modified in this routine, before they
// will be sent to host.
{
1b0: 08 95 ret
000001b2 <cdc_notify_setlinecoding>:
void cdc_notify_setlinecoding(void)
//-----------------------------------------------------------------------------
// This routine is called, when baudrate and transmission parameters (see
// cdc_linecoding in usb_serial.h) are set by the host.
// New settings are available in this variable, when this routine is called.
{
1b2: 08 95 ret
000001b4 <cdc_notify_setcontrollinestate>:
//-----------------------------------------------------------------------------
// This routine is called, when host is changing handshake output lines RTS and
// DTR.
// New settings are available in the global variable cdc_rtsdtr (see
// usb_serial.h).
{
1b4: 08 95 ret
000001b6 <usb_ep>:
//-----------------------------------------------------------------------------
void usb_ep(uint8_t endpoint, uint16_t datasize)
//-----------------------------------------------------------------------------
// handle of endpoint interrupt for incoming data
// "datasize" contains the number od bytes in the USB FIFO buffer
{
1b6: 0f 93 push r16
1b8: 1f 93 push r17
1ba: cf 93 push r28
1bc: df 93 push r29
1be: cd b7 in r28, 0x3d ; 61
1c0: de b7 in r29, 0x3e ; 62
1c2: c8 54 subi r28, 0x48 ; 72
1c4: d1 09 sbc r29, r1
1c6: 0f b6 in r0, 0x3f ; 63
1c8: f8 94 cli
1ca: de bf out 0x3e, r29 ; 62
1cc: 0f be out 0x3f, r0 ; 63
1ce: cd bf out 0x3d, r28 ; 61
char r[32]; // use endpoint buffer size (= maximum length of one transfered string)
char t[32];
char s[8];
uint8_t n;
if (endpoint==CDC_RX_ENDPOINT) {
1d0: 83 30 cpi r24, 0x03 ; 3
1d2: 09 f0 breq .+2 ; 0x1d6 <usb_ep+0x20>
1d4: 4d c1 rjmp .+666 ; 0x470 <usb_ep+0x2ba>
// serial data received
n=usb_rxdata(endpoint,(unsigned char *)r,sizeof(r)); // read data into buffer
1d6: 40 e2 ldi r20, 0x20 ; 32
1d8: be 01 movw r22, r28
1da: 6f 5f subi r22, 0xFF ; 255
1dc: 7f 4f sbci r23, 0xFF ; 255
1de: 0e 94 9c 03 call 0x738 ; 0x738 <usb_rxdata>
// parse command and prepare response
t[0]=0; // clear response string buffer
1e2: 19 a2 std Y+33, r1 ; 0x21
switch (r[0]) { // 1st byte is command
1e4: 89 81 ldd r24, Y+1 ; 0x01
1e6: 88 36 cpi r24, 0x68 ; 104
1e8: 69 f0 breq .+26 ; 0x204 <usb_ep+0x4e>
1ea: 30 f4 brcc .+12 ; 0x1f8 <usb_ep+0x42>
1ec: 8f 33 cpi r24, 0x3F ; 63
1ee: 51 f0 breq .+20 ; 0x204 <usb_ep+0x4e>
1f0: 83 36 cpi r24, 0x63 ; 99
1f2: 09 f0 breq .+2 ; 0x1f6 <usb_ep+0x40>
1f4: 1b c1 rjmp .+566 ; 0x42c <usb_ep+0x276>
1f6: 1a c0 rjmp .+52 ; 0x22c <usb_ep+0x76>
1f8: 89 36 cpi r24, 0x69 ; 105
1fa: 71 f0 breq .+28 ; 0x218 <usb_ep+0x62>
1fc: 80 37 cpi r24, 0x70 ; 112
1fe: 09 f0 breq .+2 ; 0x202 <usb_ep+0x4c>
200: 15 c1 rjmp .+554 ; 0x42c <usb_ep+0x276>
202: 1e c0 rjmp .+60 ; 0x240 <usb_ep+0x8a>
case '?': // help command
case 'h':
strcpy(t,"Valid commands: ? h i c p");
204: 8a e1 ldi r24, 0x1A ; 26
206: e9 e7 ldi r30, 0x79 ; 121
208: f1 e0 ldi r31, 0x01 ; 1
20a: de 01 movw r26, r28
20c: 91 96 adiw r26, 0x21 ; 33
20e: 01 90 ld r0, Z+
210: 0d 92 st X+, r0
212: 8a 95 dec r24
214: e1 f7 brne .-8 ; 0x20e <usb_ep+0x58>
break;
216: 13 c1 rjmp .+550 ; 0x43e <usb_ep+0x288>
case 'i': // info command
strcpy(t,"UxDIL CDC Demo V1.0");
218: 84 e1 ldi r24, 0x14 ; 20
21a: e3 e9 ldi r30, 0x93 ; 147
21c: f1 e0 ldi r31, 0x01 ; 1
21e: de 01 movw r26, r28
220: 91 96 adiw r26, 0x21 ; 33
222: 01 90 ld r0, Z+
224: 0d 92 st X+, r0
226: 8a 95 dec r24
228: e1 f7 brne .-8 ; 0x222 <usb_ep+0x6c>
break;
22a: 09 c1 rjmp .+530 ; 0x43e <usb_ep+0x288>
case 'c': // copyright command
strcpy(t,"(c) 2011 Reusch Elektronik");
22c: 8b e1 ldi r24, 0x1B ; 27
22e: e7 ea ldi r30, 0xA7 ; 167
230: f1 e0 ldi r31, 0x01 ; 1
232: de 01 movw r26, r28
234: 91 96 adiw r26, 0x21 ; 33
236: 01 90 ld r0, Z+
238: 0d 92 st X+, r0
23a: 8a 95 dec r24
23c: e1 f7 brne .-8 ; 0x236 <usb_ep+0x80>
break;
23e: ff c0 rjmp .+510 ; 0x43e <usb_ep+0x288>
case 'p': // parameter settings command
strcpy(t,"ppp");
240: 8e 01 movw r16, r28
242: 0f 5d subi r16, 0xDF ; 223
244: 1f 4f sbci r17, 0xFF ; 255
246: 80 e7 ldi r24, 0x70 ; 112
248: 90 e7 ldi r25, 0x70 ; 112
24a: a0 e7 ldi r26, 0x70 ; 112
24c: b0 e0 ldi r27, 0x00 ; 0
24e: 89 a3 std Y+33, r24 ; 0x21
250: 9a a3 std Y+34, r25 ; 0x22
252: ab a3 std Y+35, r26 ; 0x23
254: bc a3 std Y+36, r27 ; 0x24
ltoa(cdc_linecoding.dwDTERate,t,10);
256: 60 91 f5 01 lds r22, 0x01F5
25a: 70 91 f6 01 lds r23, 0x01F6
25e: 80 91 f7 01 lds r24, 0x01F7
262: 90 91 f8 01 lds r25, 0x01F8
266: 2a e0 ldi r18, 0x0A ; 10
268: 30 e0 ldi r19, 0x00 ; 0
26a: a8 01 movw r20, r16
26c: 0e 94 5a 08 call 0x10b4 ; 0x10b4 <ltoa>
strcat(t,":");
270: f8 01 movw r30, r16
272: 01 90 ld r0, Z+
274: 00 20 and r0, r0
276: e9 f7 brne .-6 ; 0x272 <usb_ep+0xbc>
278: 31 97 sbiw r30, 0x01 ; 1
27a: 8a e3 ldi r24, 0x3A ; 58
27c: 90 e0 ldi r25, 0x00 ; 0
27e: 91 83 std Z+1, r25 ; 0x01
280: 80 83 st Z, r24
itoa(cdc_linecoding.bDataBits,s,10);
282: 4a e0 ldi r20, 0x0A ; 10
284: 50 e0 ldi r21, 0x00 ; 0
286: be 01 movw r22, r28
288: 6f 5b subi r22, 0xBF ; 191
28a: 7f 4f sbci r23, 0xFF ; 255
28c: 80 91 fb 01 lds r24, 0x01FB
290: 90 e0 ldi r25, 0x00 ; 0
292: 0e 94 39 08 call 0x1072 ; 0x1072 <itoa>
strcat(t,s);
296: be 01 movw r22, r28
298: 6f 5b subi r22, 0xBF ; 191
29a: 7f 4f sbci r23, 0xFF ; 255
29c: c8 01 movw r24, r16
29e: 0e 94 2e 08 call 0x105c ; 0x105c <strcat>
switch (cdc_linecoding.bParityType) {
2a2: 80 91 fa 01 lds r24, 0x01FA
2a6: 82 30 cpi r24, 0x02 ; 2
2a8: 09 f1 breq .+66 ; 0x2ec <usb_ep+0x136>
2aa: 28 f4 brcc .+10 ; 0x2b6 <usb_ep+0x100>
2ac: 88 23 and r24, r24
2ae: 41 f0 breq .+16 ; 0x2c0 <usb_ep+0x10a>
2b0: 81 30 cpi r24, 0x01 ; 1
2b2: e9 f5 brne .+122 ; 0x32e <usb_ep+0x178>
2b4: 10 c0 rjmp .+32 ; 0x2d6 <usb_ep+0x120>
2b6: 83 30 cpi r24, 0x03 ; 3
2b8: 21 f1 breq .+72 ; 0x302 <usb_ep+0x14c>
2ba: 84 30 cpi r24, 0x04 ; 4
2bc: c1 f5 brne .+112 ; 0x32e <usb_ep+0x178>
2be: 2c c0 rjmp .+88 ; 0x318 <usb_ep+0x162>
case 0: strcat(t,"N");
2c0: fe 01 movw r30, r28
2c2: b1 96 adiw r30, 0x21 ; 33
2c4: 01 90 ld r0, Z+
2c6: 00 20 and r0, r0
2c8: e9 f7 brne .-6 ; 0x2c4 <usb_ep+0x10e>
2ca: 31 97 sbiw r30, 0x01 ; 1
2cc: 8e e4 ldi r24, 0x4E ; 78
2ce: 90 e0 ldi r25, 0x00 ; 0
2d0: 91 83 std Z+1, r25 ; 0x01
2d2: 80 83 st Z, r24
break;
2d4: 36 c0 rjmp .+108 ; 0x342 <usb_ep+0x18c>
case 1: strcat(t,"O");
2d6: fe 01 movw r30, r28
2d8: b1 96 adiw r30, 0x21 ; 33
2da: 01 90 ld r0, Z+
2dc: 00 20 and r0, r0
2de: e9 f7 brne .-6 ; 0x2da <usb_ep+0x124>
2e0: 31 97 sbiw r30, 0x01 ; 1
2e2: 8f e4 ldi r24, 0x4F ; 79
2e4: 90 e0 ldi r25, 0x00 ; 0
2e6: 91 83 std Z+1, r25 ; 0x01
2e8: 80 83 st Z, r24
break;
2ea: 2b c0 rjmp .+86 ; 0x342 <usb_ep+0x18c>
case 2: strcat(t,"E");
2ec: fe 01 movw r30, r28
2ee: b1 96 adiw r30, 0x21 ; 33
2f0: 01 90 ld r0, Z+
2f2: 00 20 and r0, r0
2f4: e9 f7 brne .-6 ; 0x2f0 <usb_ep+0x13a>
2f6: 31 97 sbiw r30, 0x01 ; 1
2f8: 85 e4 ldi r24, 0x45 ; 69
2fa: 90 e0 ldi r25, 0x00 ; 0
2fc: 91 83 std Z+1, r25 ; 0x01
2fe: 80 83 st Z, r24
break;
300: 20 c0 rjmp .+64 ; 0x342 <usb_ep+0x18c>
case 3: strcat(t,"M");
302: fe 01 movw r30, r28
304: b1 96 adiw r30, 0x21 ; 33
306: 01 90 ld r0, Z+
308: 00 20 and r0, r0
30a: e9 f7 brne .-6 ; 0x306 <usb_ep+0x150>
30c: 31 97 sbiw r30, 0x01 ; 1
30e: 8d e4 ldi r24, 0x4D ; 77
310: 90 e0 ldi r25, 0x00 ; 0
312: 91 83 std Z+1, r25 ; 0x01
314: 80 83 st Z, r24
break;
316: 15 c0 rjmp .+42 ; 0x342 <usb_ep+0x18c>
case 4: strcat(t,"S");
318: fe 01 movw r30, r28
31a: b1 96 adiw r30, 0x21 ; 33
31c: 01 90 ld r0, Z+
31e: 00 20 and r0, r0
320: e9 f7 brne .-6 ; 0x31c <usb_ep+0x166>
322: 31 97 sbiw r30, 0x01 ; 1
324: 83 e5 ldi r24, 0x53 ; 83
326: 90 e0 ldi r25, 0x00 ; 0
328: 91 83 std Z+1, r25 ; 0x01
32a: 80 83 st Z, r24
break;
32c: 0a c0 rjmp .+20 ; 0x342 <usb_ep+0x18c>
default: strcat(t,"?");
32e: fe 01 movw r30, r28
330: b1 96 adiw r30, 0x21 ; 33
332: 01 90 ld r0, Z+
334: 00 20 and r0, r0
336: e9 f7 brne .-6 ; 0x332 <usb_ep+0x17c>
338: 31 97 sbiw r30, 0x01 ; 1
33a: 8f e3 ldi r24, 0x3F ; 63
33c: 90 e0 ldi r25, 0x00 ; 0
33e: 91 83 std Z+1, r25 ; 0x01
340: 80 83 st Z, r24
};
switch (cdc_linecoding.bCharFormat) {
342: 80 91 f9 01 lds r24, 0x01F9
346: 81 30 cpi r24, 0x01 ; 1
348: 79 f0 breq .+30 ; 0x368 <usb_ep+0x1b2>
34a: 18 f0 brcs .+6 ; 0x352 <usb_ep+0x19c>
34c: 82 30 cpi r24, 0x02 ; 2
34e: 31 f5 brne .+76 ; 0x39c <usb_ep+0x1e6>
350: 1a c0 rjmp .+52 ; 0x386 <usb_ep+0x1d0>
case 0: strcat(t,"1");
352: fe 01 movw r30, r28
354: b1 96 adiw r30, 0x21 ; 33
356: 01 90 ld r0, Z+
358: 00 20 and r0, r0
35a: e9 f7 brne .-6 ; 0x356 <usb_ep+0x1a0>
35c: 31 97 sbiw r30, 0x01 ; 1
35e: 81 e3 ldi r24, 0x31 ; 49
360: 90 e0 ldi r25, 0x00 ; 0
362: 91 83 std Z+1, r25 ; 0x01
364: 80 83 st Z, r24
break;
366: 24 c0 rjmp .+72 ; 0x3b0 <usb_ep+0x1fa>
case 1: strcat(t,"1.5");
368: fe 01 movw r30, r28
36a: b1 96 adiw r30, 0x21 ; 33
36c: 01 90 ld r0, Z+
36e: 00 20 and r0, r0
370: e9 f7 brne .-6 ; 0x36c <usb_ep+0x1b6>
372: 31 97 sbiw r30, 0x01 ; 1
374: 81 e3 ldi r24, 0x31 ; 49
376: 9e e2 ldi r25, 0x2E ; 46
378: a5 e3 ldi r26, 0x35 ; 53
37a: b0 e0 ldi r27, 0x00 ; 0
37c: 80 83 st Z, r24
37e: 91 83 std Z+1, r25 ; 0x01
380: a2 83 std Z+2, r26 ; 0x02
382: b3 83 std Z+3, r27 ; 0x03
break;
384: 15 c0 rjmp .+42 ; 0x3b0 <usb_ep+0x1fa>
case 2: strcat(t,"2");
386: fe 01 movw r30, r28
388: b1 96 adiw r30, 0x21 ; 33
38a: 01 90 ld r0, Z+
38c: 00 20 and r0, r0
38e: e9 f7 brne .-6 ; 0x38a <usb_ep+0x1d4>
390: 31 97 sbiw r30, 0x01 ; 1
392: 82 e3 ldi r24, 0x32 ; 50
394: 90 e0 ldi r25, 0x00 ; 0
396: 91 83 std Z+1, r25 ; 0x01
398: 80 83 st Z, r24
break;
39a: 0a c0 rjmp .+20 ; 0x3b0 <usb_ep+0x1fa>
default: strcat(t,"?");
39c: fe 01 movw r30, r28
39e: b1 96 adiw r30, 0x21 ; 33
3a0: 01 90 ld r0, Z+
3a2: 00 20 and r0, r0
3a4: e9 f7 brne .-6 ; 0x3a0 <usb_ep+0x1ea>
3a6: 31 97 sbiw r30, 0x01 ; 1
3a8: 8f e3 ldi r24, 0x3F ; 63
3aa: 90 e0 ldi r25, 0x00 ; 0
3ac: 91 83 std Z+1, r25 ; 0x01
3ae: 80 83 st Z, r24
};
strcat(t," RTS=");
3b0: 8e 01 movw r16, r28
3b2: 0f 5d subi r16, 0xDF ; 223
3b4: 1f 4f sbci r17, 0xFF ; 255
3b6: d8 01 movw r26, r16
3b8: 0d 90 ld r0, X+
3ba: 00 20 and r0, r0
3bc: e9 f7 brne .-6 ; 0x3b8 <usb_ep+0x202>
3be: 11 97 sbiw r26, 0x01 ; 1
3c0: 86 e0 ldi r24, 0x06 ; 6
3c2: e2 ec ldi r30, 0xC2 ; 194
3c4: f1 e0 ldi r31, 0x01 ; 1
3c6: 01 90 ld r0, Z+
3c8: 0d 92 st X+, r0
3ca: 8a 95 dec r24
3cc: e1 f7 brne .-8 ; 0x3c6 <usb_ep+0x210>
itoa(cdc_rtsdtr>>1,s,10);
3ce: 80 91 f4 01 lds r24, 0x01F4
3d2: 4a e0 ldi r20, 0x0A ; 10
3d4: 50 e0 ldi r21, 0x00 ; 0
3d6: be 01 movw r22, r28
3d8: 6f 5b subi r22, 0xBF ; 191
3da: 7f 4f sbci r23, 0xFF ; 255
3dc: 86 95 lsr r24
3de: 90 e0 ldi r25, 0x00 ; 0
3e0: 0e 94 39 08 call 0x1072 ; 0x1072 <itoa>
strcat(t,s);
3e4: be 01 movw r22, r28
3e6: 6f 5b subi r22, 0xBF ; 191
3e8: 7f 4f sbci r23, 0xFF ; 255
3ea: c8 01 movw r24, r16
3ec: 0e 94 2e 08 call 0x105c ; 0x105c <strcat>
strcat(t," DTR=");
3f0: d8 01 movw r26, r16
3f2: 0d 90 ld r0, X+
3f4: 00 20 and r0, r0
3f6: e9 f7 brne .-6 ; 0x3f2 <usb_ep+0x23c>
3f8: 11 97 sbiw r26, 0x01 ; 1
3fa: 86 e0 ldi r24, 0x06 ; 6
3fc: e8 ec ldi r30, 0xC8 ; 200
3fe: f1 e0 ldi r31, 0x01 ; 1
400: 01 90 ld r0, Z+
402: 0d 92 st X+, r0
404: 8a 95 dec r24
406: e1 f7 brne .-8 ; 0x400 <usb_ep+0x24a>
itoa(cdc_rtsdtr&0x01,s,10);
408: 80 91 f4 01 lds r24, 0x01F4
40c: 4a e0 ldi r20, 0x0A ; 10
40e: 50 e0 ldi r21, 0x00 ; 0
410: be 01 movw r22, r28
412: 6f 5b subi r22, 0xBF ; 191
414: 7f 4f sbci r23, 0xFF ; 255
416: 81 70 andi r24, 0x01 ; 1
418: 90 e0 ldi r25, 0x00 ; 0
41a: 0e 94 39 08 call 0x1072 ; 0x1072 <itoa>
strcat(t,s);
41e: be 01 movw r22, r28
420: 6f 5b subi r22, 0xBF ; 191
422: 7f 4f sbci r23, 0xFF ; 255
424: c8 01 movw r24, r16
426: 0e 94 2e 08 call 0x105c ; 0x105c <strcat>
break;
42a: 09 c0 rjmp .+18 ; 0x43e <usb_ep+0x288>
default: strcpy(t,"invalid command");
42c: 80 e1 ldi r24, 0x10 ; 16
42e: ee ec ldi r30, 0xCE ; 206
430: f1 e0 ldi r31, 0x01 ; 1
432: de 01 movw r26, r28
434: 91 96 adiw r26, 0x21 ; 33
436: 01 90 ld r0, Z+
438: 0d 92 st X+, r0
43a: 8a 95 dec r24
43c: e1 f7 brne .-8 ; 0x436 <usb_ep+0x280>
}
strcat(t,"\r\n");
43e: be 01 movw r22, r28
440: 6f 5d subi r22, 0xDF ; 223
442: 7f 4f sbci r23, 0xFF ; 255
444: fb 01 movw r30, r22
446: 01 90 ld r0, Z+
448: 00 20 and r0, r0
44a: e9 f7 brne .-6 ; 0x446 <usb_ep+0x290>
44c: 31 97 sbiw r30, 0x01 ; 1
44e: 8d e0 ldi r24, 0x0D ; 13
450: 9a e0 ldi r25, 0x0A ; 10
452: a0 e0 ldi r26, 0x00 ; 0
454: 80 83 st Z, r24
456: 91 83 std Z+1, r25 ; 0x01
458: a2 83 std Z+2, r26 ; 0x02
// response
usb_txdata(CDC_TX_ENDPOINT,(unsigned char *)t,strlen(t)); // return answer to host
45a: fb 01 movw r30, r22
45c: 01 90 ld r0, Z+
45e: 00 20 and r0, r0
460: e9 f7 brne .-6 ; 0x45c <usb_ep+0x2a6>
462: 31 97 sbiw r30, 0x01 ; 1
464: af 01 movw r20, r30
466: 46 1b sub r20, r22
468: 57 0b sbc r21, r23
46a: 84 e0 ldi r24, 0x04 ; 4
46c: 0e 94 b2 03 call 0x764 ; 0x764 <usb_txdata>
}
}
470: c8 5b subi r28, 0xB8 ; 184
472: df 4f sbci r29, 0xFF ; 255
474: 0f b6 in r0, 0x3f ; 63
476: f8 94 cli
478: de bf out 0x3e, r29 ; 62
47a: 0f be out 0x3f, r0 ; 63
47c: cd bf out 0x3d, r28 ; 61
47e: df 91 pop r29
480: cf 91 pop r28
482: 1f 91 pop r17
484: 0f 91 pop r16
486: 08 95 ret
00000488 <main>:
int main(void)
{
488: cf 93 push r28
48a: df 93 push r29
48c: cd b7 in r28, 0x3d ; 61
48e: de b7 in r29, 0x3e ; 62
490: a0 97 sbiw r28, 0x20 ; 32
492: 0f b6 in r0, 0x3f ; 63
494: f8 94 cli
496: de bf out 0x3e, r29 ; 62
498: 0f be out 0x3f, r0 ; 63
49a: cd bf out 0x3d, r28 ; 61
init();
49c: 0e 94 ba 00 call 0x174 ; 0x174 <init>
ledg(GREEN);
4a0: 82 e0 ldi r24, 0x02 ; 2
4a2: 90 e0 ldi r25, 0x00 ; 0
4a4: 0e 94 88 00 call 0x110 ; 0x110 <ledg>
char t[32];
uint8_t i = 0;
4a8: 91 2c mov r9, r1
while(1)
{
ledg(YELLOW);
fprintf(&rs232, "test %d\n",++i);
4aa: 0f 2e mov r0, r31
4ac: fe ed ldi r31, 0xDE ; 222
4ae: af 2e mov r10, r31
4b0: f1 e0 ldi r31, 0x01 ; 1
4b2: bf 2e mov r11, r31
4b4: f0 2d mov r31, r0
4b6: 0f 2e mov r0, r31
4b8: fe e0 ldi r31, 0x0E ; 14
4ba: cf 2e mov r12, r31
4bc: f1 e0 ldi r31, 0x01 ; 1
4be: df 2e mov r13, r31
4c0: f0 2d mov r31, r0
t[0]=0; // clear response string buffer
sprintf(t, "test %d\r\n",i);
4c2: 0f 2e mov r0, r31
4c4: f7 ee ldi r31, 0xE7 ; 231
4c6: ef 2e mov r14, r31
4c8: f1 e0 ldi r31, 0x01 ; 1
4ca: ff 2e mov r15, r31
4cc: f0 2d mov r31, r0
4ce: 8e 01 movw r16, r28
4d0: 0f 5f subi r16, 0xFF ; 255
4d2: 1f 4f sbci r17, 0xFF ; 255
ledg(GREEN);
char t[32];
uint8_t i = 0;
while(1)
{
ledg(YELLOW);
4d4: 86 e0 ldi r24, 0x06 ; 6
4d6: 90 e0 ldi r25, 0x00 ; 0
4d8: 0e 94 88 00 call 0x110 ; 0x110 <ledg>
fprintf(&rs232, "test %d\n",++i);
4dc: 93 94 inc r9
4de: 1f 92 push r1
4e0: 9f 92 push r9
4e2: bf 92 push r11
4e4: af 92 push r10
4e6: df 92 push r13
4e8: cf 92 push r12
4ea: 0e 94 8e 08 call 0x111c ; 0x111c <fprintf>
t[0]=0; // clear response string buffer
4ee: 19 82 std Y+1, r1 ; 0x01
sprintf(t, "test %d\r\n",i);
4f0: 1f 92 push r1
4f2: 9f 92 push r9
4f4: ff 92 push r15
4f6: ef 92 push r14
4f8: 1f 93 push r17
4fa: 0f 93 push r16
4fc: 0e 94 d1 08 call 0x11a2 ; 0x11a2 <sprintf>
usb_txdata(CDC_TX_ENDPOINT,(unsigned char *)t,strlen(t));
500: f8 01 movw r30, r16
502: 01 90 ld r0, Z+
504: 00 20 and r0, r0
506: e9 f7 brne .-6 ; 0x502 <__stack+0x3>
508: 31 97 sbiw r30, 0x01 ; 1
50a: af 01 movw r20, r30
50c: 40 1b sub r20, r16
50e: 51 0b sbc r21, r17
510: b8 01 movw r22, r16
512: 84 e0 ldi r24, 0x04 ; 4
514: 0e 94 b2 03 call 0x764 ; 0x764 <usb_txdata>
ledg(GREEN);
518: 82 e0 ldi r24, 0x02 ; 2
51a: 90 e0 ldi r25, 0x00 ; 0
51c: 0e 94 88 00 call 0x110 ; 0x110 <ledg>
#else
//round up by default
__ticks_dc = (uint32_t)(ceil(fabs(__tmp)));
#endif
__builtin_avr_delay_cycles(__ticks_dc);
520: 2f ef ldi r18, 0xFF ; 255
522: 81 ee ldi r24, 0xE1 ; 225
524: 94 e0 ldi r25, 0x04 ; 4
526: 21 50 subi r18, 0x01 ; 1
528: 80 40 sbci r24, 0x00 ; 0
52a: 90 40 sbci r25, 0x00 ; 0
52c: e1 f7 brne .-8 ; 0x526 <__stack+0x27>
52e: 00 c0 rjmp .+0 ; 0x530 <__stack+0x31>
530: 00 00 nop
532: 0f b6 in r0, 0x3f ; 63
534: f8 94 cli
536: de bf out 0x3e, r29 ; 62
538: 0f be out 0x3f, r0 ; 63
53a: cd bf out 0x3d, r28 ; 61
53c: cb cf rjmp .-106 ; 0x4d4 <main+0x4c>
0000053e <usb_init>:
UHWCON = _BV(UVREGE); // enable PAD regulator
#endif
#ifdef MEGA6
UHWCON = _BV(UIMOD)|_BV(UVREGE); // set device mode, enable PAD regulator
#endif
USBCON = _BV(USBE) | _BV(FRZCLK); // enable USB
53e: 80 ea ldi r24, 0xA0 ; 160
540: 80 93 d8 00 sts 0x00D8, r24
#if (F_CPU==16000000)
// 16MHz
#ifdef MEGA2
PLLCSR = _BV(PLLE) | _BV(PLLP0); // config PLL, 16 MHz xtal
544: 86 e0 ldi r24, 0x06 ; 6
546: 89 bd out 0x29, r24 ; 41
PLLCSR = _BV(PLLE); // config PLL, 8 MHz xtal
#endif
#endif
while (!(PLLCSR & _BV(PLOCK))) ; // wait for PLL lock
548: 09 b4 in r0, 0x29 ; 41
54a: 00 fe sbrs r0, 0
54c: fd cf rjmp .-6 ; 0x548 <usb_init+0xa>
#ifdef MEGA4_6
USBCON = _BV(USBE)|_BV(OTGPADE); // start USB clock
#else
USBCON = _BV(USBE); // start USB clock
54e: 80 e8 ldi r24, 0x80 ; 128
550: 80 93 d8 00 sts 0x00D8, r24
#endif
UDCON = 0; // enable attach resistor
554: 10 92 e0 00 sts 0x00E0, r1
usb_conf = 0;
558: 10 92 f2 01 sts 0x01F2, r1
#if (NUMINTERFACES>1)
usb_if = 0xFF;
55c: 8f ef ldi r24, 0xFF ; 255
55e: 80 93 25 01 sts 0x0125, r24
#endif
#ifdef MEGA2
// port for VBUS detection
VBUSDIR &= ~_BV(VBUSPIN); // port as input
562: 3c 98 cbi 0x07, 4 ; 7
#endif
UDIEN = _BV(EORSTE); // enable "end of reset" interrupt
564: 88 e0 ldi r24, 0x08 ; 8
566: 80 93 e2 00 sts 0x00E2, r24
56a: 08 95 ret
0000056c <usb_endpoints>:
//-----------------------------------------------------------------------------
#ifdef STATICENDPOINTS // physical endpoint configuration for all interfaces, may differ from descriptor defintions
void usb_endpoints(void)
{
56c: 2f 92 push r2
56e: 3f 92 push r3
570: 4f 92 push r4
572: 5f 92 push r5
574: 7f 92 push r7
576: 8f 92 push r8
578: 9f 92 push r9
57a: af 92 push r10
57c: cf 92 push r12
57e: df 92 push r13
580: ef 92 push r14
582: ff 92 push r15
584: 0f 93 push r16
586: 1f 93 push r17
588: cf 93 push r28
58a: df 93 push r29
58c: ec e2 ldi r30, 0x2C ; 44
58e: f1 e0 ldi r31, 0x01 ; 1
590: 8e e2 ldi r24, 0x2E ; 46
592: 91 e0 ldi r25, 0x01 ; 1
594: 41 e0 ldi r20, 0x01 ; 1
uint8_t i;
for (i=0; i<MAX_ENDPOINT; i++) {
if (EPC.ep_type!=EP_TYPE_DISABLED) {
UENUM = i+1; // select endpoint
596: 0f 2e mov r0, r31
598: f9 ee ldi r31, 0xE9 ; 233
59a: cf 2e mov r12, r31
59c: d1 2c mov r13, r1
59e: f0 2d mov r31, r0
UECONX = _BV(EPEN); // enable endpoint
5a0: 0f 2e mov r0, r31
5a2: fb ee ldi r31, 0xEB ; 235
5a4: ef 2e mov r14, r31
5a6: f1 2c mov r15, r1
5a8: f0 2d mov r31, r0
5aa: aa 24 eor r10, r10
5ac: a3 94 inc r10
UECFG0X = EPC.ep_type; // transfer type and direction
5ae: 0c ee ldi r16, 0xEC ; 236
5b0: 10 e0 ldi r17, 0x00 ; 0
UECFG1X = EP_SIZE(EPC.ep_size)|
5b2: 6d ee ldi r22, 0xED ; 237
5b4: 70 e0 ldi r23, 0x00 ; 0
(EPC.ep_buffer); // buffer size and bank
if (IN_TRANSFER) UEIENX = 0; // no interrupts handling for IN endpoints
else UEIENX = _BV(RXOUTE); // interrupt handling for incoming data (OUT endpoint)
5b6: 0f 2e mov r0, r31
5b8: f0 ef ldi r31, 0xF0 ; 240
5ba: 4f 2e mov r4, r31
5bc: 51 2c mov r5, r1
5be: f0 2d mov r31, r0
5c0: 68 94 set
5c2: 99 24 eor r9, r9
5c4: 92 f8 bld r9, 2
for (i=0; i<MAX_ENDPOINT; i++) {
if (EPC.ep_type!=EP_TYPE_DISABLED) {
UENUM = i+1; // select endpoint
UECONX = _BV(EPEN); // enable endpoint
UECFG0X = EPC.ep_type; // transfer type and direction
UECFG1X = EP_SIZE(EPC.ep_size)|
5c6: 81 2c mov r8, r1
5c8: 68 94 set
5ca: 77 24 eor r7, r7
5cc: 74 f8 bld r7, 4
// Initializing Endpoints
//-----------------------------------------------------------------------------
#ifdef STATICENDPOINTS // physical endpoint configuration for all interfaces, may differ from descriptor defintions
void usb_endpoints(void)
5ce: df 01 movw r26, r30
#endif
uint8_t i;
for (i=0; i<MAX_ENDPOINT; i++) {
if (EPC.ep_type!=EP_TYPE_DISABLED) {
5d0: 20 81 ld r18, Z
5d2: 2f 3f cpi r18, 0xFF ; 255
5d4: 59 f1 breq .+86 ; 0x62c <usb_endpoints+0xc0>
UENUM = i+1; // select endpoint
5d6: e6 01 movw r28, r12
5d8: 48 83 st Y, r20
UECONX = _BV(EPEN); // enable endpoint
5da: e7 01 movw r28, r14
5dc: a8 82 st Y, r10
UECFG0X = EPC.ep_type; // transfer type and direction
5de: 20 81 ld r18, Z
5e0: e8 01 movw r28, r16
5e2: 28 83 st Y, r18
// Initializing Endpoints
//-----------------------------------------------------------------------------
#ifdef STATICENDPOINTS // physical endpoint configuration for all interfaces, may differ from descriptor defintions
void usb_endpoints(void)
5e4: 1c 01 movw r2, r24
5e6: 9c 01 movw r18, r24
5e8: 21 50 subi r18, 0x01 ; 1
5ea: 31 09 sbc r19, r1
for (i=0; i<MAX_ENDPOINT; i++) {
if (EPC.ep_type!=EP_TYPE_DISABLED) {
UENUM = i+1; // select endpoint
UECONX = _BV(EPEN); // enable endpoint
UECFG0X = EPC.ep_type; // transfer type and direction
UECFG1X = EP_SIZE(EPC.ep_size)|
5ec: e9 01 movw r28, r18
5ee: 28 81 ld r18, Y
5f0: 20 38 cpi r18, 0x80 ; 128
5f2: 41 f0 breq .+16 ; 0x604 <usb_endpoints+0x98>
5f4: 20 34 cpi r18, 0x40 ; 64
5f6: 41 f0 breq .+16 ; 0x608 <usb_endpoints+0x9c>
5f8: 20 32 cpi r18, 0x20 ; 32
5fa: 41 f0 breq .+16 ; 0x60c <usb_endpoints+0xa0>
5fc: 20 31 cpi r18, 0x10 ; 16
5fe: 41 f4 brne .+16 ; 0x610 <usb_endpoints+0xa4>
600: 37 2d mov r19, r7
602: 07 c0 rjmp .+14 ; 0x612 <usb_endpoints+0xa6>
604: 30 e4 ldi r19, 0x40 ; 64
606: 05 c0 rjmp .+10 ; 0x612 <usb_endpoints+0xa6>
608: 30 e3 ldi r19, 0x30 ; 48
60a: 03 c0 rjmp .+6 ; 0x612 <usb_endpoints+0xa6>
60c: 30 e2 ldi r19, 0x20 ; 32
60e: 01 c0 rjmp .+2 ; 0x612 <usb_endpoints+0xa6>
610: 38 2d mov r19, r8
612: e1 01 movw r28, r2
614: 28 81 ld r18, Y
616: 23 2b or r18, r19
618: eb 01 movw r28, r22
61a: 28 83 st Y, r18
(EPC.ep_buffer); // buffer size and bank
if (IN_TRANSFER) UEIENX = 0; // no interrupts handling for IN endpoints
61c: 2c 91 ld r18, X
61e: 20 ff sbrs r18, 0
620: 03 c0 rjmp .+6 ; 0x628 <usb_endpoints+0xbc>
622: d2 01 movw r26, r4
624: 1c 92 st X, r1
626: 02 c0 rjmp .+4 ; 0x62c <usb_endpoints+0xc0>
else UEIENX = _BV(RXOUTE); // interrupt handling for incoming data (OUT endpoint)
628: e2 01 movw r28, r4
62a: 98 82 st Y, r9
62c: 4f 5f subi r20, 0xFF ; 255
62e: 34 96 adiw r30, 0x04 ; 4
630: 04 96 adiw r24, 0x04 ; 4
#endif
uint8_t i;
for (i=0; i<MAX_ENDPOINT; i++) {
632: 45 30 cpi r20, 0x05 ; 5
634: 61 f6 brne .-104 ; 0x5ce <usb_endpoints+0x62>
}
}
#ifdef MEGA4_6
UERST = 0x7E; // endpoint FIFO reset for endpoint 1, 2, 3, 4, 5 and 6
#else
UERST = 0x1E; // endpoint FIFO reset for endpoint 1, 2, 3 and 4
636: ea ee ldi r30, 0xEA ; 234
638: f0 e0 ldi r31, 0x00 ; 0
63a: 8e e1 ldi r24, 0x1E ; 30
63c: 80 83 st Z, r24
#endif
UERST = 0;
63e: 10 82 st Z, r1
}
640: df 91 pop r29
642: cf 91 pop r28
644: 1f 91 pop r17
646: 0f 91 pop r16
648: ff 90 pop r15
64a: ef 90 pop r14
64c: df 90 pop r13
64e: cf 90 pop r12
650: af 90 pop r10
652: 9f 90 pop r9
654: 8f 90 pop r8
656: 7f 90 pop r7
658: 5f 90 pop r5
65a: 4f 90 pop r4
65c: 3f 90 pop r3
65e: 2f 90 pop r2
660: 08 95 ret
00000662 <usb_wait_in>:
void usb_wait_in(void)
// wait for host, until it's ready to receive IN package
{
uint8_t i;
do {
i = UEINTX;
662: e8 ee ldi r30, 0xE8 ; 232
664: f0 e0 ldi r31, 0x00 ; 0
666: 80 81 ld r24, Z
} while (!(i & (_BV(TXINI)|_BV(RXOUTI))));
668: 85 70 andi r24, 0x05 ; 5
66a: e9 f3 breq .-6 ; 0x666 <usb_wait_in+0x4>
}
66c: 08 95 ret
0000066e <usb_wait_receive_out>:
void usb_wait_receive_out(void)
{
while (!(UEINTX & _BV(RXOUTI))) ;
66e: e8 ee ldi r30, 0xE8 ; 232
670: f0 e0 ldi r31, 0x00 ; 0
672: 80 81 ld r24, Z
674: 82 ff sbrs r24, 2
676: fd cf rjmp .-6 ; 0x672 <usb_wait_receive_out+0x4>
}
678: 08 95 ret
0000067a <usb_desc_out>:
void usb_desc_out(bool isRAM, const uint8_t *pgmaddr, uint8_t size, uint16_t maxsize)
// return descriptor over endpoint 0 to host from flash memory or RAM
{
67a: 8f 92 push r8
67c: 9f 92 push r9
67e: af 92 push r10
680: bf 92 push r11
682: cf 92 push r12
684: df 92 push r13
686: ef 92 push r14
688: ff 92 push r15
68a: 0f 93 push r16
68c: 1f 93 push r17
68e: cf 93 push r28
690: df 93 push r29
692: d8 2e mov r13, r24
uint8_t i, len, n;
const uint8_t *addr;
addr=pgmaddr;
len=size;
if (len>maxsize) len=maxsize;
694: e4 2f mov r30, r20
696: f0 e0 ldi r31, 0x00 ; 0
698: 2e 17 cp r18, r30
69a: 3f 07 cpc r19, r31
69c: 10 f4 brcc .+4 ; 0x6a2 <usb_desc_out+0x28>
69e: c2 2e mov r12, r18
6a0: 01 c0 rjmp .+2 ; 0x6a4 <usb_desc_out+0x2a>
{
uint8_t i, len, n;
const uint8_t *addr;
addr=pgmaddr;
len=size;
6a2: c4 2e mov r12, r20
6a4: 06 2f mov r16, r22
6a6: 17 2f mov r17, r23
if (len>maxsize) len=maxsize;
do {
usb_wait_in();
if (i & _BV(RXOUTI)) return; // cancel
// send IN package
n = (len < ENDPOINT0_SIZE) ? len : ENDPOINT0_SIZE;
6a8: 68 94 set
6aa: 99 24 eor r9, r9
6ac: 94 f8 bld r9, 4
for (i = n; i; i--)
UEDATX = isRAM ? *addr++ : pgm_read_byte(addr++);
len -= n;
USB_SEND_IN;
6ae: 0f 2e mov r0, r31
6b0: f8 ee ldi r31, 0xE8 ; 232
6b2: ef 2e mov r14, r31
6b4: f1 2c mov r15, r1
6b6: f0 2d mov r31, r0
6b8: 0f 2e mov r0, r31
6ba: fe ef ldi r31, 0xFE ; 254
6bc: bf 2e mov r11, r31
6be: f0 2d mov r31, r0
usb_wait_in();
if (i & _BV(RXOUTI)) return; // cancel
// send IN package
n = (len < ENDPOINT0_SIZE) ? len : ENDPOINT0_SIZE;
for (i = n; i; i--)
UEDATX = isRAM ? *addr++ : pgm_read_byte(addr++);
6c0: c1 ef ldi r28, 0xF1 ; 241
6c2: d0 e0 ldi r29, 0x00 ; 0
6c4: a1 2c mov r10, r1
6c6: 01 c0 rjmp .+2 ; 0x6ca <usb_desc_out+0x50>
6c8: 8a 2c mov r8, r10
addr=pgmaddr;
len=size;
if (len>maxsize) len=maxsize;
do {
usb_wait_in();
6ca: 0e 94 31 03 call 0x662 ; 0x662 <usb_wait_in>
if (i & _BV(RXOUTI)) return; // cancel
6ce: 82 fc sbrc r8, 2
6d0: 26 c0 rjmp .+76 ; 0x71e <usb_desc_out+0xa4>
// send IN package
n = (len < ENDPOINT0_SIZE) ? len : ENDPOINT0_SIZE;
6d2: 2c 2d mov r18, r12
6d4: 80 e1 ldi r24, 0x10 ; 16
6d6: 8c 15 cp r24, r12
6d8: 08 f4 brcc .+2 ; 0x6dc <usb_desc_out+0x62>
6da: 29 2d mov r18, r9
for (i = n; i; i--)
6dc: 22 23 and r18, r18
6de: d9 f0 breq .+54 ; 0x716 <usb_desc_out+0x9c>
6e0: f8 01 movw r30, r16
6e2: 92 2f mov r25, r18
UEDATX = isRAM ? *addr++ : pgm_read_byte(addr++);
6e4: dd 20 and r13, r13
6e6: 11 f0 breq .+4 ; 0x6ec <usb_desc_out+0x72>
6e8: 80 81 ld r24, Z
6ea: 01 c0 rjmp .+2 ; 0x6ee <usb_desc_out+0x74>
6ec: 84 91 lpm r24, Z
6ee: 88 83 st Y, r24
do {
usb_wait_in();
if (i & _BV(RXOUTI)) return; // cancel
// send IN package
n = (len < ENDPOINT0_SIZE) ? len : ENDPOINT0_SIZE;
for (i = n; i; i--)
6f0: 91 50 subi r25, 0x01 ; 1
6f2: 31 96 adiw r30, 0x01 ; 1
6f4: 91 11 cpse r25, r1
6f6: f6 cf rjmp .-20 ; 0x6e4 <usb_desc_out+0x6a>
void usb_wait_receive_out(void)
{
while (!(UEINTX & _BV(RXOUTI))) ;
}
void usb_desc_out(bool isRAM, const uint8_t *pgmaddr, uint8_t size, uint16_t maxsize)
6f8: 62 2f mov r22, r18
6fa: 61 50 subi r22, 0x01 ; 1
6fc: 70 e0 ldi r23, 0x00 ; 0
6fe: 6f 5f subi r22, 0xFF ; 255
700: 7f 4f sbci r23, 0xFF ; 255
702: 06 0f add r16, r22
704: 17 1f adc r17, r23
if (i & _BV(RXOUTI)) return; // cancel
// send IN package
n = (len < ENDPOINT0_SIZE) ? len : ENDPOINT0_SIZE;
for (i = n; i; i--)
UEDATX = isRAM ? *addr++ : pgm_read_byte(addr++);
len -= n;
706: c2 1a sub r12, r18
USB_SEND_IN;
708: f7 01 movw r30, r14
70a: b0 82 st Z, r11
} while (len || n == ENDPOINT0_SIZE);
70c: c1 10 cpse r12, r1
70e: dc cf rjmp .-72 ; 0x6c8 <usb_desc_out+0x4e>
710: 20 31 cpi r18, 0x10 ; 16
712: d1 f2 breq .-76 ; 0x6c8 <usb_desc_out+0x4e>
714: 04 c0 rjmp .+8 ; 0x71e <usb_desc_out+0xa4>
// send IN package
n = (len < ENDPOINT0_SIZE) ? len : ENDPOINT0_SIZE;
for (i = n; i; i--)
UEDATX = isRAM ? *addr++ : pgm_read_byte(addr++);
len -= n;
USB_SEND_IN;
716: f7 01 movw r30, r14
718: b0 82 st Z, r11
} while (len || n == ENDPOINT0_SIZE);
71a: c1 10 cpse r12, r1
71c: d5 cf rjmp .-86 ; 0x6c8 <usb_desc_out+0x4e>
}
71e: df 91 pop r29
720: cf 91 pop r28
722: 1f 91 pop r17
724: 0f 91 pop r16
726: ff 90 pop r15
728: ef 90 pop r14
72a: df 90 pop r13
72c: cf 90 pop r12
72e: bf 90 pop r11
730: af 90 pop r10
732: 9f 90 pop r9
734: 8f 90 pop r8
736: 08 95 ret
00000738 <usb_rxdata>:
uint16_t r, i;
#else
uint8_t r, i;
#endif
UENUM = endpoint; // select endpoint
738: 80 93 e9 00 sts 0x00E9, r24
#ifdef MEGA4_6
r = ((uint16_t)(UEBCHX)<<8)+UEBCLX;
#else
r = UEBCLX;
73c: 90 91 f2 00 lds r25, 0x00F2
740: 84 2f mov r24, r20
742: 94 17 cp r25, r20
744: 08 f4 brcc .+2 ; 0x748 <usb_rxdata+0x10>
746: 89 2f mov r24, r25
#endif
if (r>maxdatasize) r = maxdatasize;
if (r) { // data available in input endpoint
748: 88 23 and r24, r24
74a: 59 f0 breq .+22 ; 0x762 <usb_rxdata+0x2a>
74c: 26 2f mov r18, r22
74e: e6 2f mov r30, r22
750: f7 2f mov r31, r23
for (i=0; i<r; i++) buffer[i]=UEDATX;
752: a1 ef ldi r26, 0xF1 ; 241
754: b0 e0 ldi r27, 0x00 ; 0
756: 9c 91 ld r25, X
758: 91 93 st Z+, r25
75a: 9e 2f mov r25, r30
75c: 92 1b sub r25, r18
75e: 98 17 cp r25, r24
760: d0 f3 brcs .-12 ; 0x756 <usb_rxdata+0x1e>
#endif
}
****/
}
return r;
}
762: 08 95 ret
00000764 <usb_txdata>:
#ifdef MEGA4_6
bool usb_txdata(uint8_t endpoint, uint8_t *buffer, uint16_t datasize)
#else
bool usb_txdata(uint8_t endpoint, uint8_t *buffer, uint8_t datasize)
#endif
{
764: cf 93 push r28
766: df 93 push r29
uint16_t i;
#else
uint8_t i;
#endif
if (datasize) {
768: 44 23 and r20, r20
76a: 29 f1 breq .+74 ; 0x7b6 <usb_txdata+0x52>
UENUM = endpoint;
76c: 80 93 e9 00 sts 0x00E9, r24
#define STALL UECONX = _BV(STALLRQ) | _BV(EPEN)
static inline void usb_wait_in_ready(void)
{
while (!(UEINTX & _BV(TXINI)));
770: e8 ee ldi r30, 0xE8 ; 232
772: f0 e0 ldi r31, 0x00 ; 0
774: 80 81 ld r24, Z
776: 80 ff sbrs r24, 0
778: fd cf rjmp .-6 ; 0x774 <usb_txdata+0x10>
UENUM = endpoint;
usb_wait_in_ready();
#ifdef MEGA4_6
if ((((uint16_t)(UEBCHX)<<8)+UEBCLX)==0) { // buffer is empty
#else
if (UEBCLX==0) { // buffer is empty
77a: 80 91 f2 00 lds r24, 0x00F2
77e: 81 11 cpse r24, r1
780: 1c c0 rjmp .+56 ; 0x7ba <usb_txdata+0x56>
782: 96 2f mov r25, r22
784: e6 2f mov r30, r22
786: f7 2f mov r31, r23
#endif
for (i=0; i<datasize; i++)
if (UEINTX & _BV(RWAL)) UEDATX = buffer[i];
788: a8 ee ldi r26, 0xE8 ; 232
78a: b0 e0 ldi r27, 0x00 ; 0
78c: c1 ef ldi r28, 0xF1 ; 241
78e: d0 e0 ldi r29, 0x00 ; 0
790: 8c 91 ld r24, X
792: 85 ff sbrs r24, 5
794: 02 c0 rjmp .+4 ; 0x79a <usb_txdata+0x36>
796: 80 81 ld r24, Z
798: 88 83 st Y, r24
79a: 31 96 adiw r30, 0x01 ; 1
#ifdef MEGA4_6
if ((((uint16_t)(UEBCHX)<<8)+UEBCLX)==0) { // buffer is empty
#else
if (UEBCLX==0) { // buffer is empty
#endif
for (i=0; i<datasize; i++)
79c: 8e 2f mov r24, r30
79e: 89 1b sub r24, r25
7a0: 84 17 cp r24, r20
7a2: b0 f3 brcs .-20 ; 0x790 <usb_txdata+0x2c>
if (UEINTX & _BV(RWAL)) UEDATX = buffer[i];
UEINTX&=~_BV(TXINI); // necessary (in this order) (changed V1.1.1)
7a4: e8 ee ldi r30, 0xE8 ; 232
7a6: f0 e0 ldi r31, 0x00 ; 0
7a8: 80 81 ld r24, Z
7aa: 8e 7f andi r24, 0xFE ; 254
7ac: 80 83 st Z, r24
UEINTX=0x7F; // (uint8_t)~_BV(FIFOCON);
7ae: 8f e7 ldi r24, 0x7F ; 127
7b0: 80 83 st Z, r24
return true;
7b2: 81 e0 ldi r24, 0x01 ; 1
7b4: 03 c0 rjmp .+6 ; 0x7bc <usb_txdata+0x58>
}
}
return false;
7b6: 80 e0 ldi r24, 0x00 ; 0
7b8: 01 c0 rjmp .+2 ; 0x7bc <usb_txdata+0x58>
7ba: 80 e0 ldi r24, 0x00 ; 0
}
7bc: df 91 pop r29
7be: cf 91 pop r28
7c0: 08 95 ret
000007c2 <__vector_11>:
// USB Device Interrupt
//-----------------------------------------------------------------------------
// Hardware interrupts of the USB controller
ISR(USB_GEN_vect)
{
7c2: 1f 92 push r1
7c4: 0f 92 push r0
7c6: 0f b6 in r0, 0x3f ; 63
7c8: 0f 92 push r0
7ca: 11 24 eor r1, r1
7cc: 8f 93 push r24
7ce: ef 93 push r30
7d0: ff 93 push r31
uint8_t intbits;
intbits = UDINT; // save flags
7d2: e1 ee ldi r30, 0xE1 ; 225
7d4: f0 e0 ldi r31, 0x00 ; 0
7d6: 80 81 ld r24, Z
UDINT = 0; // reset flags
7d8: 10 82 st Z, r1
if (intbits & _BV(EORSTI)) { // End Of Reset Interrupt Flag
7da: 83 ff sbrs r24, 3
7dc: 12 c0 rjmp .+36 ; 0x802 <__vector_11+0x40>
// initialize endpoint 0 for control transfers
UENUM = 0;
7de: 10 92 e9 00 sts 0x00E9, r1
UECONX = _BV(EPEN);
7e2: 81 e0 ldi r24, 0x01 ; 1
7e4: 80 93 eb 00 sts 0x00EB, r24
UECFG0X = EP_TYPE_CONTROL;
7e8: 10 92 ec 00 sts 0x00EC, r1
UECFG1X = EP_SIZE(ENDPOINT0_SIZE) | EP_SINGLE_BUFFER;
7ec: 82 e1 ldi r24, 0x12 ; 18
7ee: 80 93 ed 00 sts 0x00ED, r24
UEIENX = _BV(RXSTPE); // enable interrupt for incoming data
7f2: 88 e0 ldi r24, 0x08 ; 8
7f4: 80 93 f0 00 sts 0x00F0, r24
usb_conf = 0;
7f8: 10 92 f2 01 sts 0x01F2, r1
#if (NUMINTERFACES>1)
usb_if = 0xFF;
7fc: 8f ef ldi r24, 0xFF ; 255
7fe: 80 93 25 01 sts 0x0125, r24
#endif
}
}
802: ff 91 pop r31
804: ef 91 pop r30
806: 8f 91 pop r24
808: 0f 90 pop r0
80a: 0f be out 0x3f, r0 ; 63
80c: 0f 90 pop r0
80e: 1f 90 pop r1
810: 18 95 reti
00000812 <__vector_12>:
// Endpoint Interrupts
//-----------------------------------------------------------------------------
// Interrupts, triggered by incoming data in an endpoint, are handled here.
ISR(USB_COM_vect)
{
812: 1f 92 push r1
814: 0f 92 push r0
816: 0f b6 in r0, 0x3f ; 63
818: 0f 92 push r0
81a: 11 24 eor r1, r1
81c: 2f 92 push r2
81e: 3f 92 push r3
820: 4f 92 push r4
822: 5f 92 push r5
824: 6f 92 push r6
826: 7f 92 push r7
828: 8f 92 push r8
82a: 9f 92 push r9
82c: af 92 push r10
82e: bf 92 push r11
830: cf 92 push r12
832: df 92 push r13
834: ef 92 push r14
836: ff 92 push r15
838: 0f 93 push r16
83a: 1f 93 push r17
83c: 2f 93 push r18
83e: 3f 93 push r19
840: 4f 93 push r20
842: 5f 93 push r21
844: 6f 93 push r22
846: 7f 93 push r23
848: 8f 93 push r24
84a: 9f 93 push r25
84c: af 93 push r26
84e: bf 93 push r27
850: ef 93 push r30
852: ff 93 push r31
854: cf 93 push r28
856: df 93 push r29
858: cd b7 in r28, 0x3d ; 61
85a: de b7 in r29, 0x3e ; 62
85c: 29 97 sbiw r28, 0x09 ; 9
85e: de bf out 0x3e, r29 ; 62
860: cd bf out 0x3d, r28 ; 61
#if (USESN==2) // serial number in RAM
struct usb_string_descriptor_ram buf;
#endif
struct usb_control_request ucr;
if (UEINT & 0x01) {
862: 80 91 f4 00 lds r24, 0x00F4
866: 80 ff sbrs r24, 0
868: 8f c2 rjmp .+1310 ; 0xd88 <__vector_12+0x576>
// handle interrupts of endpoint 0 (control transfers)
UENUM = 0;
86a: 10 92 e9 00 sts 0x00E9, r1
intbits = UEINTX; // save interrupt flags of the endpoint
86e: 80 91 e8 00 lds r24, 0x00E8
if (intbits & _BV(RXSTPI)) { // control transfer, setup
872: 83 ff sbrs r24, 3
874: 58 c2 rjmp .+1200 ; 0xd26 <__vector_12+0x514>
ucr.bmRequestType = UEDATX;
876: e1 ef ldi r30, 0xF1 ; 241
878: f0 e0 ldi r31, 0x00 ; 0
87a: 50 81 ld r21, Z
ucr.bRequest = UEDATX;
87c: 40 81 ld r20, Z
ucr.wValue = UEDATX;
87e: 20 81 ld r18, Z
ucr.wValue |= (UEDATX << 8);
880: 30 81 ld r19, Z
882: 93 2f mov r25, r19
884: 80 e0 ldi r24, 0x00 ; 0
886: 82 2b or r24, r18
ucr.wIndex = UEDATX;
888: 60 81 ld r22, Z
ucr.wIndex |= (UEDATX << 8);
88a: 70 81 ld r23, Z
ucr.wLength = UEDATX;
88c: 30 81 ld r19, Z
ucr.wLength |= (UEDATX << 8);
88e: e0 81 ld r30, Z
UEINTX = ~(_BV(RXSTPI) | _BV(RXOUTI) | _BV(TXINI));
890: 22 ef ldi r18, 0xF2 ; 242
892: 20 93 e8 00 sts 0x00E8, r18
if (ucr.bRequest == GET_DESCRIPTOR) {
896: 46 30 cpi r20, 0x06 ; 6
898: 09 f0 breq .+2 ; 0x89c <__vector_12+0x8a>
89a: 5a c1 rjmp .+692 ; 0xb50 <__vector_12+0x33e>
ucr.wValue = UEDATX;
ucr.wValue |= (UEDATX << 8);
ucr.wIndex = UEDATX;
ucr.wIndex |= (UEDATX << 8);
ucr.wLength = UEDATX;
ucr.wLength |= (UEDATX << 8);
89c: 1e 2f mov r17, r30
89e: 00 e0 ldi r16, 0x00 ; 0
8a0: 03 2b or r16, r19
UEINTX = ~(_BV(RXSTPI) | _BV(RXOUTI) | _BV(TXINI));
if (ucr.bRequest == GET_DESCRIPTOR) {
switch (ucr.wValue) {
8a2: 81 15 cp r24, r1
8a4: 23 e0 ldi r18, 0x03 ; 3
8a6: 92 07 cpc r25, r18
8a8: 09 f4 brne .+2 ; 0x8ac <__vector_12+0x9a>
8aa: 2a c1 rjmp .+596 ; 0xb00 <__vector_12+0x2ee>
8ac: 48 f4 brcc .+18 ; 0x8c0 <__vector_12+0xae>
8ae: 81 15 cp r24, r1
8b0: 41 e0 ldi r20, 0x01 ; 1
8b2: 94 07 cpc r25, r20
8b4: f9 f0 breq .+62 ; 0x8f4 <__vector_12+0xe2>
8b6: 81 15 cp r24, r1
8b8: 92 40 sbci r25, 0x02 ; 2
8ba: 09 f0 breq .+2 ; 0x8be <__vector_12+0xac>
8bc: 45 c1 rjmp .+650 ; 0xb48 <__vector_12+0x336>
8be: 0c c0 rjmp .+24 ; 0x8d8 <__vector_12+0xc6>
8c0: 82 30 cpi r24, 0x02 ; 2
8c2: a3 e0 ldi r26, 0x03 ; 3
8c4: 9a 07 cpc r25, r26
8c6: 09 f4 brne .+2 ; 0x8ca <__vector_12+0xb8>
8c8: 2d c1 rjmp .+602 ; 0xb24 <__vector_12+0x312>
8ca: 08 f4 brcc .+2 ; 0x8ce <__vector_12+0xbc>
8cc: 22 c1 rjmp .+580 ; 0xb12 <__vector_12+0x300>
8ce: 83 30 cpi r24, 0x03 ; 3
8d0: 93 40 sbci r25, 0x03 ; 3
8d2: 09 f0 breq .+2 ; 0x8d6 <__vector_12+0xc4>
8d4: 39 c1 rjmp .+626 ; 0xb48 <__vector_12+0x336>
8d6: 2f c1 rjmp .+606 ; 0xb36 <__vector_12+0x324>
8d8: 2c e3 ldi r18, 0x3C ; 60
8da: 31 e0 ldi r19, 0x01 ; 1
8dc: 3d 83 std Y+5, r19 ; 0x05
8de: 2c 83 std Y+4, r18 ; 0x04
//-----------------------------------------------------------------------------
// Endpoint Interrupts
//-----------------------------------------------------------------------------
// Interrupts, triggered by incoming data in an endpoint, are handled here.
ISR(USB_COM_vect)
8e0: 6c e5 ldi r22, 0x5C ; 92
8e2: 71 e0 ldi r23, 0x01 ; 1
8e4: a0 e0 ldi r26, 0x00 ; 0
{
8e6: 40 e0 ldi r20, 0x00 ; 0
8e8: 50 e0 ldi r21, 0x00 ; 0
case 0x0200: // configuration descriptor
// get number of activated endpoints
n=0;
#if (NUMINTERFACES>1)
for (j=0; j<NUMINTERFACES; j++)
for (i=0; i<MAX_ENDPOINT; i++) n+=(EP_CONFIG[j][i].ep_type!=EP_TYPE_DISABLED);
8ea: ff 24 eor r15, r15
8ec: f3 94 inc r15
8ee: e1 2c mov r14, r1
8f0: 69 01 movw r12, r18
8f2: 1b c0 rjmp .+54 ; 0x92a <__vector_12+0x118>
ucr.wLength |= (UEDATX << 8);
UEINTX = ~(_BV(RXSTPI) | _BV(RXOUTI) | _BV(TXINI));
if (ucr.bRequest == GET_DESCRIPTOR) {
switch (ucr.wValue) {
case 0x0100: // device descriptor
usb_desc_out(false,&device_descriptor[0],pgm_read_byte(&device_descriptor[0]),ucr.wLength);
8f4: e4 e7 ldi r30, 0x74 ; 116
8f6: f0 e0 ldi r31, 0x00 ; 0
8f8: 44 91 lpm r20, Z
8fa: 98 01 movw r18, r16
8fc: bf 01 movw r22, r30
8fe: 80 e0 ldi r24, 0x00 ; 0
900: 0e 94 3d 03 call 0x67a ; 0x67a <usb_desc_out>
break;
904: 4a c2 rjmp .+1172 ; 0xd9a <__vector_12+0x588>
//-----------------------------------------------------------------------------
// Endpoint Interrupts
//-----------------------------------------------------------------------------
// Interrupts, triggered by incoming data in an endpoint, are handled here.
ISR(USB_COM_vect)
906: f9 01 movw r30, r18
908: e8 0f add r30, r24
90a: f9 1f adc r31, r25
case 0x0200: // configuration descriptor
// get number of activated endpoints
n=0;
#if (NUMINTERFACES>1)
for (j=0; j<NUMINTERFACES; j++)
for (i=0; i<MAX_ENDPOINT; i++) n+=(EP_CONFIG[j][i].ep_type!=EP_TYPE_DISABLED);
90c: bf 2d mov r27, r15
90e: e0 81 ld r30, Z
910: ef 3f cpi r30, 0xFF ; 255
912: 09 f4 brne .+2 ; 0x916 <__vector_12+0x104>
914: be 2d mov r27, r14
916: ab 0f add r26, r27
918: 04 96 adiw r24, 0x04 ; 4
91a: 80 31 cpi r24, 0x10 ; 16
91c: 91 05 cpc r25, r1
91e: 99 f7 brne .-26 ; 0x906 <__vector_12+0xf4>
920: 20 5f subi r18, 0xF0 ; 240
922: 3f 4f sbci r19, 0xFF ; 255
break;
case 0x0200: // configuration descriptor
// get number of activated endpoints
n=0;
#if (NUMINTERFACES>1)
for (j=0; j<NUMINTERFACES; j++)
924: 26 17 cp r18, r22
926: 37 07 cpc r19, r23
928: 11 f0 breq .+4 ; 0x92e <__vector_12+0x11c>
// Endpoint Interrupts
//-----------------------------------------------------------------------------
// Interrupts, triggered by incoming data in an endpoint, are handled here.
ISR(USB_COM_vect)
{
92a: ca 01 movw r24, r20
92c: ec cf rjmp .-40 ; 0x906 <__vector_12+0xf4>
92e: dd 82 std Y+5, r13 ; 0x05
930: cc 82 std Y+4, r12 ; 0x04
for (i=0; i<MAX_ENDPOINT; i++) n+=(EP_CONFIG[j][i].ep_type!=EP_TYPE_DISABLED);
#else
for (i=0; i<MAX_ENDPOINT; i++) n+=(EP_CONFIG[i].ep_type!=EP_TYPE_DISABLED);
#endif
#ifdef CDC
s = sizeof(cfg_desc)+NUMINTERFACES*sizeof(if_desc)+sizeof(cdc_desc)+n*sizeof(ep_desc);
932: 8a 2f mov r24, r26
934: 88 0f add r24, r24
936: 88 0f add r24, r24
938: 88 0f add r24, r24
93a: 8a 1b sub r24, r26
93c: 82 5d subi r24, 0xD2 ; 210
93e: 89 83 std Y+1, r24 ; 0x01
#else
s = sizeof(cfg_desc)+NUMINTERFACES*sizeof(if_desc)+n*sizeof(ep_desc);
#endif
cfg = malloc(s); // allocate memory
940: 90 e0 ldi r25, 0x00 ; 0
942: 0e 94 f6 06 call 0xdec ; 0xdec <malloc>
946: e8 2e mov r14, r24
948: f9 2e mov r15, r25
// initialize configuration descriptor
cfg->bLength = sizeof(cfg_desc);
94a: 89 e0 ldi r24, 0x09 ; 9
94c: d7 01 movw r26, r14
94e: 8c 93 st X, r24
cfg->bDescriptorType = 2;
950: 82 e0 ldi r24, 0x02 ; 2
952: 11 96 adiw r26, 0x01 ; 1
954: 8c 93 st X, r24
956: 11 97 sbiw r26, 0x01 ; 1
cfg->wTotalLength = s;
958: e9 81 ldd r30, Y+1 ; 0x01
95a: 12 96 adiw r26, 0x02 ; 2
95c: ec 93 st X, r30
95e: 12 97 sbiw r26, 0x02 ; 2
960: 13 96 adiw r26, 0x03 ; 3
962: 1c 92 st X, r1
964: 13 97 sbiw r26, 0x03 ; 3
cfg->bNumInterfaces = NUMINTERFACES;
966: 14 96 adiw r26, 0x04 ; 4
968: 8c 93 st X, r24
96a: 14 97 sbiw r26, 0x04 ; 4
cfg->bConfigurationValue = 1;
96c: 81 e0 ldi r24, 0x01 ; 1
96e: 15 96 adiw r26, 0x05 ; 5
970: 8c 93 st X, r24
972: 15 97 sbiw r26, 0x05 ; 5
cfg->iConfiguration = 0;
974: 16 96 adiw r26, 0x06 ; 6
976: 1c 92 st X, r1
978: 16 97 sbiw r26, 0x06 ; 6
cfg->bmAttributes = POWERING;
97a: 80 e8 ldi r24, 0x80 ; 128
97c: 17 96 adiw r26, 0x07 ; 7
97e: 8c 93 st X, r24
980: 17 97 sbiw r26, 0x07 ; 7
cfg->bMaxPower = MAXPOWER>>1;
982: 8a ef ldi r24, 0xFA ; 250
984: 18 96 adiw r26, 0x08 ; 8
986: 8c 93 st X, r24
988: 18 97 sbiw r26, 0x08 ; 8
// initialize interface descriptor
ifp = (if_desc *)((uint16_t)(cfg)+sizeof(cfg_desc));
98a: 19 96 adiw r26, 0x09 ; 9
98c: 0f 2e mov r0, r31
98e: f2 e2 ldi r31, 0x22 ; 34
990: af 2e mov r10, r31
992: f1 e0 ldi r31, 0x01 ; 1
994: bf 2e mov r11, r31
996: f0 2d mov r31, r0
998: 0f 2e mov r0, r31
99a: ff e1 ldi r31, 0x1F ; 31
99c: 8f 2e mov r8, r31
99e: f1 e0 ldi r31, 0x01 ; 1
9a0: 9f 2e mov r9, r31
9a2: f0 2d mov r31, r0
9a4: 0f 2e mov r0, r31
9a6: fc e1 ldi r31, 0x1C ; 28
9a8: 6f 2e mov r6, r31
9aa: f1 e0 ldi r31, 0x01 ; 1
9ac: 7f 2e mov r7, r31
9ae: f0 2d mov r31, r0
9b0: 40 e0 ldi r20, 0x00 ; 0
9b2: 50 e0 ldi r21, 0x00 ; 0
//-----------------------------------------------------------------------------
// Endpoint Interrupts
//-----------------------------------------------------------------------------
// Interrupts, triggered by incoming data in an endpoint, are handled here.
ISR(USB_COM_vect)
9b4: 41 2c mov r4, r1
9b6: 51 2c mov r5, r1
9b8: 31 2c mov r3, r1
// initialize interface descriptor
ifp = (if_desc *)((uint16_t)(cfg)+sizeof(cfg_desc));
#if (NUMINTERFACES>1)
for (j=0; j<NUMINTERFACES; j++) {
n = 0;
for (i=0; i<MAX_ENDPOINT; i++) n+=(EP_CONFIG[j][i].ep_type!=EP_TYPE_DISABLED); // number of endpoints for one interface
9ba: dd 24 eor r13, r13
9bc: d3 94 inc r13
9be: 23 2c mov r2, r3
//-----------------------------------------------------------------------------
// Endpoint Interrupts
//-----------------------------------------------------------------------------
// Interrupts, triggered by incoming data in an endpoint, are handled here.
ISR(USB_COM_vect)
9c0: 8f e6 ldi r24, 0x6F ; 111
9c2: 91 e0 ldi r25, 0x01 ; 1
9c4: 1b 83 std Y+3, r17 ; 0x03
9c6: 0a 83 std Y+2, r16 ; 0x02
9c8: fd 01 movw r30, r26
9ca: 88 c0 rjmp .+272 ; 0xadc <__vector_12+0x2ca>
9cc: d8 01 movw r26, r16
9ce: a2 0f add r26, r18
9d0: b3 1f adc r27, r19
// initialize interface descriptor
ifp = (if_desc *)((uint16_t)(cfg)+sizeof(cfg_desc));
#if (NUMINTERFACES>1)
for (j=0; j<NUMINTERFACES; j++) {
n = 0;
for (i=0; i<MAX_ENDPOINT; i++) n+=(EP_CONFIG[j][i].ep_type!=EP_TYPE_DISABLED); // number of endpoints for one interface
9d2: 6d 2d mov r22, r13
9d4: ac 91 ld r26, X
9d6: af 3f cpi r26, 0xFF ; 255
9d8: 09 f4 brne .+2 ; 0x9dc <__vector_12+0x1ca>
9da: 62 2d mov r22, r2
9dc: c6 0e add r12, r22
9de: 2c 5f subi r18, 0xFC ; 252
9e0: 3f 4f sbci r19, 0xFF ; 255
9e2: 20 31 cpi r18, 0x10 ; 16
9e4: 31 05 cpc r19, r1
9e6: 91 f7 brne .-28 ; 0x9cc <__vector_12+0x1ba>
9e8: 1d 83 std Y+5, r17 ; 0x05
9ea: 0c 83 std Y+4, r16 ; 0x04
#else
j = 0;
#endif
ifp->bLength = sizeof(if_desc);
9ec: 19 e0 ldi r17, 0x09 ; 9
9ee: 10 83 st Z, r17
ifp->bDescriptorType = 4;
9f0: 24 e0 ldi r18, 0x04 ; 4
9f2: 21 83 std Z+1, r18 ; 0x01
ifp->bInterfaceNumber = j;
9f4: 72 83 std Z+2, r23 ; 0x02
ifp->bAlternateSetting = 0;
9f6: 13 82 std Z+3, r1 ; 0x03
ifp->bNumEndpoints = n;
9f8: c4 82 std Z+4, r12 ; 0x04
ifp->bInterfaceClass = InterfaceClasses[j];
9fa: 9a 01 movw r18, r20
9fc: d5 01 movw r26, r10
9fe: 6d 91 ld r22, X+
a00: 5d 01 movw r10, r26
a02: 65 83 std Z+5, r22 ; 0x05
ifp->bInterfaceSubClass = InterfaceSubClasses[j];
a04: d4 01 movw r26, r8
a06: 6d 91 ld r22, X+
a08: 4d 01 movw r8, r26
a0a: 66 83 std Z+6, r22 ; 0x06
ifp->bInterfaceProtocol = InterfaceProtocols[j];
a0c: d3 01 movw r26, r6
a0e: 6d 91 ld r22, X+
a10: 3d 01 movw r6, r26
a12: 67 83 std Z+7, r22 ; 0x07
ifp->iInterface = 0;
a14: 10 86 std Z+8, r1 ; 0x08
#ifdef CDC
if (j==0) {
a16: 71 11 cpse r23, r1
a18: 0c c0 rjmp .+24 ; 0xa32 <__vector_12+0x220>
cdc = (cdc_desc *)((uint16_t)(ifp)+sizeof(if_desc));
a1a: bf 01 movw r22, r30
a1c: 39 96 adiw r30, 0x09 ; 9
a1e: ac e5 ldi r26, 0x5C ; 92
a20: b1 e0 ldi r27, 0x01 ; 1
for (i=0; i<CDC_DESCRIPTORSIZE; i++) *(cdc[0]+i)=CDCDescriptorData[i];
a22: 1d 91 ld r17, X+
a24: 11 93 st Z+, r17
a26: a8 17 cp r26, r24
a28: b9 07 cpc r27, r25
a2a: d9 f7 brne .-10 ; 0xa22 <__vector_12+0x210>
epp = (ep_desc *)((uint16_t)(cdc)+sizeof(cdc_desc));
a2c: fb 01 movw r30, r22
a2e: 7c 96 adiw r30, 0x1c ; 28
a30: 01 c0 rjmp .+2 ; 0xa34 <__vector_12+0x222>
} else epp = (ep_desc *)((uint16_t)(ifp)+sizeof(if_desc));
a32: 39 96 adiw r30, 0x09 ; 9
#else
epp = (ep_desc *)((uint16_t)(ifp)+sizeof(if_desc));
#endif
if (n) { // endpoints
a34: cc 20 and r12, r12
a36: 09 f4 brne .+2 ; 0xa3a <__vector_12+0x228>
a38: 46 c0 rjmp .+140 ; 0xac6 <__vector_12+0x2b4>
//-----------------------------------------------------------------------------
// Endpoint Interrupts
//-----------------------------------------------------------------------------
// Interrupts, triggered by incoming data in an endpoint, are handled here.
ISR(USB_COM_vect)
a3a: 22 95 swap r18
a3c: 32 95 swap r19
a3e: 30 7f andi r19, 0xF0 ; 240
a40: 32 27 eor r19, r18
a42: 20 7f andi r18, 0xF0 ; 240
a44: 32 27 eor r19, r18
a46: 21 5c subi r18, 0xC1 ; 193
a48: 3e 4f sbci r19, 0xFE ; 254
a4a: 11 e0 ldi r17, 0x01 ; 1
a4c: 59 87 std Y+9, r21 ; 0x09
a4e: 48 87 std Y+8, r20 ; 0x08
a50: 6c 81 ldd r22, Y+4 ; 0x04
a52: 7d 81 ldd r23, Y+5 ; 0x05
a54: 3f 83 std Y+7, r19 ; 0x07
a56: 2e 83 std Y+6, r18 ; 0x06
a58: a9 01 movw r20, r18
a5a: 43 50 subi r20, 0x03 ; 3
a5c: 51 09 sbc r21, r1
#else
epp = (ep_desc *)((uint16_t)(ifp)+sizeof(if_desc));
#endif
if (n) { // endpoints
for (i=0; i<MAX_ENDPOINT; i++) {
if (EPCO.ep_type!=EP_TYPE_DISABLED) {
a5e: da 01 movw r26, r20
a60: 0c 91 ld r16, X
a62: 0f 3f cpi r16, 0xFF ; 255
a64: 39 f1 breq .+78 ; 0xab4 <__vector_12+0x2a2>
epp->bLength = sizeof(ep_desc);
a66: b7 e0 ldi r27, 0x07 ; 7
a68: b0 83 st Z, r27
epp->bDescriptorType = 5;
a6a: 45 e0 ldi r20, 0x05 ; 5
a6c: 41 83 std Z+1, r20 ; 0x01
epp->bEndpointAddress = (i+1)|(EPCO.ep_type<<7);
a6e: 40 2f mov r20, r16
a70: 47 95 ror r20
a72: 44 27 eor r20, r20
a74: 47 95 ror r20
a76: 41 2b or r20, r17
a78: 42 83 std Z+2, r20 ; 0x02
epp->bmAttributes = EP_TRANSFER(EPCO.ep_type);
a7a: 01 34 cpi r16, 0x41 ; 65
a7c: 41 f0 breq .+16 ; 0xa8e <__vector_12+0x27c>
a7e: 00 34 cpi r16, 0x40 ; 64
a80: 41 f0 breq .+16 ; 0xa92 <__vector_12+0x280>
a82: 01 38 cpi r16, 0x81 ; 129
a84: 41 f0 breq .+16 ; 0xa96 <__vector_12+0x284>
a86: 00 38 cpi r16, 0x80 ; 128
a88: 41 f4 brne .+16 ; 0xa9a <__vector_12+0x288>
a8a: 42 e0 ldi r20, 0x02 ; 2
a8c: 07 c0 rjmp .+14 ; 0xa9c <__vector_12+0x28a>
a8e: 4d 2d mov r20, r13
a90: 05 c0 rjmp .+10 ; 0xa9c <__vector_12+0x28a>
a92: 4d 2d mov r20, r13
a94: 03 c0 rjmp .+6 ; 0xa9c <__vector_12+0x28a>
a96: 42 e0 ldi r20, 0x02 ; 2
a98: 01 c0 rjmp .+2 ; 0xa9c <__vector_12+0x28a>
a9a: 43 e0 ldi r20, 0x03 ; 3
a9c: 43 83 std Z+3, r20 ; 0x03
//-----------------------------------------------------------------------------
// Endpoint Interrupts
//-----------------------------------------------------------------------------
// Interrupts, triggered by incoming data in an endpoint, are handled here.
ISR(USB_COM_vect)
a9e: ae 81 ldd r26, Y+6 ; 0x06
aa0: bf 81 ldd r27, Y+7 ; 0x07
aa2: 12 97 sbiw r26, 0x02 ; 2
if (EPCO.ep_type!=EP_TYPE_DISABLED) {
epp->bLength = sizeof(ep_desc);
epp->bDescriptorType = 5;
epp->bEndpointAddress = (i+1)|(EPCO.ep_type<<7);
epp->bmAttributes = EP_TRANSFER(EPCO.ep_type);
epp->wMaxPacketSize = EPCO.ep_size;
aa4: 4c 91 ld r20, X
aa6: 44 83 std Z+4, r20 ; 0x04
aa8: 15 82 std Z+5, r1 ; 0x05
epp->bInterval = EPCO.ep_interval;
aaa: ae 81 ldd r26, Y+6 ; 0x06
aac: bf 81 ldd r27, Y+7 ; 0x07
aae: 4c 91 ld r20, X
ab0: 46 83 std Z+6, r20 ; 0x06
epp = (ep_desc *)((uint16_t)(epp)+sizeof(ep_desc));
ab2: 37 96 adiw r30, 0x07 ; 7
ab4: 1f 5f subi r17, 0xFF ; 255
ab6: 2c 5f subi r18, 0xFC ; 252
ab8: 3f 4f sbci r19, 0xFF ; 255
} else epp = (ep_desc *)((uint16_t)(ifp)+sizeof(if_desc));
#else
epp = (ep_desc *)((uint16_t)(ifp)+sizeof(if_desc));
#endif
if (n) { // endpoints
for (i=0; i<MAX_ENDPOINT; i++) {
aba: 15 30 cpi r17, 0x05 ; 5
abc: 59 f6 brne .-106 ; 0xa54 <__vector_12+0x242>
abe: 48 85 ldd r20, Y+8 ; 0x08
ac0: 59 85 ldd r21, Y+9 ; 0x09
ac2: 7d 83 std Y+5, r23 ; 0x05
ac4: 6c 83 std Y+4, r22 ; 0x04
ac6: 4f 5f subi r20, 0xFF ; 255
ac8: 5f 4f sbci r21, 0xFF ; 255
aca: 0c 81 ldd r16, Y+4 ; 0x04
acc: 1d 81 ldd r17, Y+5 ; 0x05
ace: 00 5f subi r16, 0xF0 ; 240
ad0: 1f 4f sbci r17, 0xFF ; 255
ad2: 1d 83 std Y+5, r17 ; 0x05
ad4: 0c 83 std Y+4, r16 ; 0x04
cfg->bmAttributes = POWERING;
cfg->bMaxPower = MAXPOWER>>1;
// initialize interface descriptor
ifp = (if_desc *)((uint16_t)(cfg)+sizeof(cfg_desc));
#if (NUMINTERFACES>1)
for (j=0; j<NUMINTERFACES; j++) {
ad6: 42 30 cpi r20, 0x02 ; 2
ad8: 51 05 cpc r21, r1
ada: 31 f0 breq .+12 ; 0xae8 <__vector_12+0x2d6>
adc: 74 2f mov r23, r20
//-----------------------------------------------------------------------------
// Endpoint Interrupts
//-----------------------------------------------------------------------------
// Interrupts, triggered by incoming data in an endpoint, are handled here.
ISR(USB_COM_vect)
ade: 92 01 movw r18, r4
ae0: c3 2c mov r12, r3
ae2: 0c 81 ldd r16, Y+4 ; 0x04
ae4: 1d 81 ldd r17, Y+5 ; 0x05
ae6: 72 cf rjmp .-284 ; 0x9cc <__vector_12+0x1ba>
ae8: 0a 81 ldd r16, Y+2 ; 0x02
aea: 1b 81 ldd r17, Y+3 ; 0x03
#if (NUMINTERFACES>1)
ifp = (if_desc *)epp;
}
#endif
// finally
usb_desc_out(true,(uint8_t *)cfg,s,ucr.wLength);
aec: 98 01 movw r18, r16
aee: 49 81 ldd r20, Y+1 ; 0x01
af0: b7 01 movw r22, r14
af2: 81 e0 ldi r24, 0x01 ; 1
af4: 0e 94 3d 03 call 0x67a ; 0x67a <usb_desc_out>
free(cfg);
af8: c7 01 movw r24, r14
afa: 0e 94 91 07 call 0xf22 ; 0xf22 <free>
break;
afe: 4d c1 rjmp .+666 ; 0xd9a <__vector_12+0x588>
case 0x0300: // String 0
usb_desc_out(false,(uint8_t *)&string0.bLength,pgm_read_byte(&string0.bLength),ucr.wLength);
b00: e6 e8 ldi r30, 0x86 ; 134
b02: f0 e0 ldi r31, 0x00 ; 0
b04: 44 91 lpm r20, Z
b06: 98 01 movw r18, r16
b08: bf 01 movw r22, r30
b0a: 80 e0 ldi r24, 0x00 ; 0
b0c: 0e 94 3d 03 call 0x67a ; 0x67a <usb_desc_out>
break;
b10: 44 c1 rjmp .+648 ; 0xd9a <__vector_12+0x588>
case 0x0301: // String 1
usb_desc_out(false,(uint8_t *)&string1.bLength,pgm_read_byte(&string1.bLength),ucr.wLength);
b12: ea e8 ldi r30, 0x8A ; 138
b14: f0 e0 ldi r31, 0x00 ; 0
b16: 44 91 lpm r20, Z
b18: 98 01 movw r18, r16
b1a: bf 01 movw r22, r30
b1c: 80 e0 ldi r24, 0x00 ; 0
b1e: 0e 94 3d 03 call 0x67a ; 0x67a <usb_desc_out>
break;
b22: 3b c1 rjmp .+630 ; 0xd9a <__vector_12+0x588>
case 0x0302: // String 2
usb_desc_out(false,(uint8_t *)&string2.bLength,pgm_read_byte(&string2.bLength),ucr.wLength);
b24: e0 ea ldi r30, 0xA0 ; 160
b26: f0 e0 ldi r31, 0x00 ; 0
b28: 44 91 lpm r20, Z
b2a: 98 01 movw r18, r16
b2c: bf 01 movw r22, r30
b2e: 80 e0 ldi r24, 0x00 ; 0
b30: 0e 94 3d 03 call 0x67a ; 0x67a <usb_desc_out>
break;
b34: 32 c1 rjmp .+612 ; 0xd9a <__vector_12+0x588>
#if (USESN>0)
case 0x0303: // String 3, serial number
#if (USESN==1) // serial number in the flash
usb_desc_out(false,(uint8_t *)&string3.bLength,pgm_read_byte(&string3.bLength),ucr.wLength);
b36: e2 ec ldi r30, 0xC2 ; 194
b38: f0 e0 ldi r31, 0x00 ; 0
b3a: 44 91 lpm r20, Z
b3c: 98 01 movw r18, r16
b3e: bf 01 movw r22, r30
b40: 80 e0 ldi r24, 0x00 ; 0
b42: 0e 94 3d 03 call 0x67a ; 0x67a <usb_desc_out>
i++;
}
buf.bLength=2*i+2; // total length of the data set
usb_desc_out(true,(uint8_t *)&buf,buf.bLength,ucr.wLength);
#endif
break;
b46: 29 c1 rjmp .+594 ; 0xd9a <__vector_12+0x588>
#endif
default:
STALL; // stall
b48: 81 e2 ldi r24, 0x21 ; 33
b4a: 80 93 eb 00 sts 0x00EB, r24
b4e: 25 c1 rjmp .+586 ; 0xd9a <__vector_12+0x588>
}
return;
}
if (ucr.bRequest == SET_ADDRESS) {
b50: 45 30 cpi r20, 0x05 ; 5
b52: 61 f4 brne .+24 ; 0xb6c <__vector_12+0x35a>
USB_SEND_IN;
b54: 2e ef ldi r18, 0xFE ; 254
b56: 20 93 e8 00 sts 0x00E8, r18
#define STALL UECONX = _BV(STALLRQ) | _BV(EPEN)
static inline void usb_wait_in_ready(void)
{
while (!(UEINTX & _BV(TXINI)));
b5a: e8 ee ldi r30, 0xE8 ; 232
b5c: f0 e0 ldi r31, 0x00 ; 0
b5e: 20 81 ld r18, Z
b60: 20 ff sbrs r18, 0
b62: fd cf rjmp .-6 ; 0xb5e <__vector_12+0x34c>
return;
}
if (ucr.bRequest == SET_ADDRESS) {
USB_SEND_IN;
usb_wait_in_ready();
UDADDR = ucr.wValue | _BV(ADDEN);
b64: 80 68 ori r24, 0x80 ; 128
b66: 80 93 e3 00 sts 0x00E3, r24
b6a: 17 c1 rjmp .+558 ; 0xd9a <__vector_12+0x588>
ucr.bmRequestType = UEDATX;
ucr.bRequest = UEDATX;
ucr.wValue = UEDATX;
ucr.wValue |= (UEDATX << 8);
ucr.wIndex = UEDATX;
ucr.wIndex |= (UEDATX << 8);
b6c: 37 2f mov r19, r23
b6e: 20 e0 ldi r18, 0x00 ; 0
b70: 26 2b or r18, r22
USB_SEND_IN;
usb_wait_in_ready();
UDADDR = ucr.wValue | _BV(ADDEN);
return;
}
if (ucr.bRequest == SET_CONFIGURATION && ucr.bmRequestType == 0) { // another configuration will be chosen
b72: 49 30 cpi r20, 0x09 ; 9
b74: 99 f4 brne .+38 ; 0xb9c <__vector_12+0x38a>
b76: 51 11 cpse r21, r1
b78: 3e c0 rjmp .+124 ; 0xbf6 <__vector_12+0x3e4>
if (ucr.wValue==1) { // configuration 1 will be chosen
b7a: 01 97 sbiw r24, 0x01 ; 1
b7c: 59 f4 brne .+22 ; 0xb94 <__vector_12+0x382>
usb_conf = ucr.wValue;
b7e: 81 e0 ldi r24, 0x01 ; 1
b80: 80 93 f2 01 sts 0x01F2, r24
USB_SEND_IN;
b84: 8e ef ldi r24, 0xFE ; 254
b86: 80 93 e8 00 sts 0x00E8, r24
#ifdef STATICENDPOINTS
usb_if = 0; // select interface 0
b8a: 10 92 25 01 sts 0x0125, r1
usb_endpoints(); // initialize endpoints
b8e: 0e 94 b6 02 call 0x56c ; 0x56c <usb_endpoints>
b92: 03 c1 rjmp .+518 ; 0xd9a <__vector_12+0x588>
usb_if = 0; // select interface 0
usb_endpoints(usb_if); // initialize endpoints
#endif
#endif
} else { // other configurations are not supported in this version
STALL; // stall
b94: 81 e2 ldi r24, 0x21 ; 33
b96: 80 93 eb 00 sts 0x00EB, r24
b9a: ff c0 rjmp .+510 ; 0xd9a <__vector_12+0x588>
}
return;
}
if (ucr.bRequest == GET_CONFIGURATION && ucr.bmRequestType == 0x80) {
b9c: 48 30 cpi r20, 0x08 ; 8
b9e: 81 f4 brne .+32 ; 0xbc0 <__vector_12+0x3ae>
ba0: 50 38 cpi r21, 0x80 ; 128
ba2: 09 f0 breq .+2 ; 0xba6 <__vector_12+0x394>
ba4: 43 c0 rjmp .+134 ; 0xc2c <__vector_12+0x41a>
#define STALL UECONX = _BV(STALLRQ) | _BV(EPEN)
static inline void usb_wait_in_ready(void)
{
while (!(UEINTX & _BV(TXINI)));
ba6: e8 ee ldi r30, 0xE8 ; 232
ba8: f0 e0 ldi r31, 0x00 ; 0
baa: 80 81 ld r24, Z
bac: 80 ff sbrs r24, 0
bae: fd cf rjmp .-6 ; 0xbaa <__vector_12+0x398>
}
return;
}
if (ucr.bRequest == GET_CONFIGURATION && ucr.bmRequestType == 0x80) {
usb_wait_in_ready();
UEDATX = usb_conf;
bb0: 80 91 f2 01 lds r24, 0x01F2
bb4: 80 93 f1 00 sts 0x00F1, r24
USB_SEND_IN;
bb8: 8e ef ldi r24, 0xFE ; 254
bba: 80 93 e8 00 sts 0x00E8, r24
bbe: ed c0 rjmp .+474 ; 0xd9a <__vector_12+0x588>
return;
}
if (ucr.bRequest == CDC_GET_LINE_CODING && ucr.bmRequestType == 0xA1) {
bc0: 41 32 cpi r20, 0x21 ; 33
bc2: c9 f4 brne .+50 ; 0xbf6 <__vector_12+0x3e4>
bc4: 51 3a cpi r21, 0xA1 ; 161
bc6: 09 f0 breq .+2 ; 0xbca <__vector_12+0x3b8>
bc8: 43 c0 rjmp .+134 ; 0xc50 <__vector_12+0x43e>
#define STALL UECONX = _BV(STALLRQ) | _BV(EPEN)
static inline void usb_wait_in_ready(void)
{
while (!(UEINTX & _BV(TXINI)));
bca: e8 ee ldi r30, 0xE8 ; 232
bcc: f0 e0 ldi r31, 0x00 ; 0
bce: 80 81 ld r24, Z
bd0: 80 ff sbrs r24, 0
bd2: fd cf rjmp .-6 ; 0xbce <__vector_12+0x3bc>
return;
}
if (ucr.bRequest == CDC_GET_LINE_CODING && ucr.bmRequestType == 0xA1) {
// request baudrate and transmission format
usb_wait_in_ready();
cdc_notify_getlinecoding();
bd4: 0e 94 d8 00 call 0x1b0 ; 0x1b0 <cdc_notify_getlinecoding>
bd8: e5 ef ldi r30, 0xF5 ; 245
bda: f1 e0 ldi r31, 0x01 ; 1
//-----------------------------------------------------------------------------
// Endpoint Interrupts
//-----------------------------------------------------------------------------
// Interrupts, triggered by incoming data in an endpoint, are handled here.
ISR(USB_COM_vect)
bdc: 8c ef ldi r24, 0xFC ; 252
bde: 91 e0 ldi r25, 0x01 ; 1
}
if (ucr.bRequest == CDC_GET_LINE_CODING && ucr.bmRequestType == 0xA1) {
// request baudrate and transmission format
usb_wait_in_ready();
cdc_notify_getlinecoding();
for (i=0; i<7; i++) UEDATX = cdc_linecoding.data[i];
be0: a1 ef ldi r26, 0xF1 ; 241
be2: b0 e0 ldi r27, 0x00 ; 0
be4: 21 91 ld r18, Z+
be6: 2c 93 st X, r18
be8: e8 17 cp r30, r24
bea: f9 07 cpc r31, r25
bec: d9 f7 brne .-10 ; 0xbe4 <__vector_12+0x3d2>
USB_SEND_IN;
bee: 8e ef ldi r24, 0xFE ; 254
bf0: 80 93 e8 00 sts 0x00E8, r24
bf4: d2 c0 rjmp .+420 ; 0xd9a <__vector_12+0x588>
return;
}
if (ucr.bRequest == CDC_SET_LINE_CODING && ucr.bmRequestType == 0x21) {
bf6: 40 32 cpi r20, 0x20 ; 32
bf8: c9 f4 brne .+50 ; 0xc2c <__vector_12+0x41a>
bfa: 51 32 cpi r21, 0x21 ; 33
bfc: 09 f0 breq .+2 ; 0xc00 <__vector_12+0x3ee>
bfe: 59 c0 rjmp .+178 ; 0xcb2 <__vector_12+0x4a0>
// set baudrate and transmission format
usb_wait_receive_out();
c00: 0e 94 37 03 call 0x66e ; 0x66e <usb_wait_receive_out>
c04: e5 ef ldi r30, 0xF5 ; 245
c06: f1 e0 ldi r31, 0x01 ; 1
//-----------------------------------------------------------------------------
// Endpoint Interrupts
//-----------------------------------------------------------------------------
// Interrupts, triggered by incoming data in an endpoint, are handled here.
ISR(USB_COM_vect)
c08: 8c ef ldi r24, 0xFC ; 252
c0a: 91 e0 ldi r25, 0x01 ; 1
return;
}
if (ucr.bRequest == CDC_SET_LINE_CODING && ucr.bmRequestType == 0x21) {
// set baudrate and transmission format
usb_wait_receive_out();
for (i=0; i<7; i++) cdc_linecoding.data[i] = UEDATX;
c0c: a1 ef ldi r26, 0xF1 ; 241
c0e: b0 e0 ldi r27, 0x00 ; 0
c10: 2c 91 ld r18, X
c12: 21 93 st Z+, r18
c14: e8 17 cp r30, r24
c16: f9 07 cpc r31, r25
c18: d9 f7 brne .-10 ; 0xc10 <__vector_12+0x3fe>
USB_ACK;
c1a: e8 ee ldi r30, 0xE8 ; 232
c1c: f0 e0 ldi r31, 0x00 ; 0
c1e: 8b ef ldi r24, 0xFB ; 251
c20: 80 83 st Z, r24
USB_SEND_IN;
c22: 8e ef ldi r24, 0xFE ; 254
c24: 80 83 st Z, r24
cdc_notify_setlinecoding();
c26: 0e 94 d9 00 call 0x1b2 ; 0x1b2 <cdc_notify_setlinecoding>
c2a: b7 c0 rjmp .+366 ; 0xd9a <__vector_12+0x588>
return;
}
if (ucr.bRequest == CDC_SET_CONTROL_LINE_STATE && ucr.bmRequestType == 0x21) {
c2c: 42 32 cpi r20, 0x22 ; 34
c2e: 81 f4 brne .+32 ; 0xc50 <__vector_12+0x43e>
c30: 51 32 cpi r21, 0x21 ; 33
c32: 09 f0 breq .+2 ; 0xc36 <__vector_12+0x424>
c34: 4f c0 rjmp .+158 ; 0xcd4 <__vector_12+0x4c2>
// set handshake outputs RTS and DTR
cdc_rtsdtr = (uint8_t)ucr.wValue;
c36: 80 93 f4 01 sts 0x01F4, r24
#define STALL UECONX = _BV(STALLRQ) | _BV(EPEN)
static inline void usb_wait_in_ready(void)
{
while (!(UEINTX & _BV(TXINI)));
c3a: e8 ee ldi r30, 0xE8 ; 232
c3c: f0 e0 ldi r31, 0x00 ; 0
c3e: 80 81 ld r24, Z
c40: 80 ff sbrs r24, 0
c42: fd cf rjmp .-6 ; 0xc3e <__vector_12+0x42c>
}
if (ucr.bRequest == CDC_SET_CONTROL_LINE_STATE && ucr.bmRequestType == 0x21) {
// set handshake outputs RTS and DTR
cdc_rtsdtr = (uint8_t)ucr.wValue;
usb_wait_in_ready();
USB_SEND_IN;
c44: 8e ef ldi r24, 0xFE ; 254
c46: 80 93 e8 00 sts 0x00E8, r24
cdc_notify_setcontrollinestate();
c4a: 0e 94 da 00 call 0x1b4 ; 0x1b4 <cdc_notify_setcontrollinestate>
c4e: a5 c0 rjmp .+330 ; 0xd9a <__vector_12+0x588>
return;
}
if (ucr.bRequest == GET_STATUS) {
c50: 41 11 cpse r20, r1
c52: 1a c0 rjmp .+52 ; 0xc88 <__vector_12+0x476>
#define STALL UECONX = _BV(STALLRQ) | _BV(EPEN)
static inline void usb_wait_in_ready(void)
{
while (!(UEINTX & _BV(TXINI)));
c54: e8 ee ldi r30, 0xE8 ; 232
c56: f0 e0 ldi r31, 0x00 ; 0
c58: 80 81 ld r24, Z
c5a: 80 ff sbrs r24, 0
c5c: fd cf rjmp .-6 ; 0xc58 <__vector_12+0x446>
}
if (ucr.bRequest == GET_STATUS) {
usb_wait_in_ready();
i = 0;
#ifdef SUPPORT_ENDPOINT_HALT
if (ucr.bmRequestType == 0x82) {
c5e: 52 38 cpi r21, 0x82 ; 130
c60: 51 f4 brne .+20 ; 0xc76 <__vector_12+0x464>
UENUM = ucr.wIndex;
c62: e9 ee ldi r30, 0xE9 ; 233
c64: f0 e0 ldi r31, 0x00 ; 0
c66: 20 83 st Z, r18
if (UECONX & _BV(STALLRQ)) i = 1;
c68: 80 91 eb 00 lds r24, 0x00EB
c6c: 85 fb bst r24, 5
c6e: 88 27 eor r24, r24
c70: 80 f9 bld r24, 0
UENUM = 0;
c72: 10 82 st Z, r1
c74: 01 c0 rjmp .+2 ; 0xc78 <__vector_12+0x466>
cdc_notify_setcontrollinestate();
return;
}
if (ucr.bRequest == GET_STATUS) {
usb_wait_in_ready();
i = 0;
c76: 80 e0 ldi r24, 0x00 ; 0
UENUM = ucr.wIndex;
if (UECONX & _BV(STALLRQ)) i = 1;
UENUM = 0;
}
#endif
UEDATX = i;
c78: e1 ef ldi r30, 0xF1 ; 241
c7a: f0 e0 ldi r31, 0x00 ; 0
c7c: 80 83 st Z, r24
UEDATX = 0;
c7e: 10 82 st Z, r1
USB_SEND_IN;
c80: 8e ef ldi r24, 0xFE ; 254
c82: 80 93 e8 00 sts 0x00E8, r24
c86: 89 c0 rjmp .+274 ; 0xd9a <__vector_12+0x588>
return;
}
#if (NUMINTERFACES>1)
if (ucr.bRequest == SET_INTERFACE && (ucr.bmRequestType == 0x20 || ucr.bmRequestType == 0)) { // another interface will be chosen
c88: 4b 30 cpi r20, 0x0B ; 11
c8a: 99 f4 brne .+38 ; 0xcb2 <__vector_12+0x4a0>
c8c: 50 32 cpi r21, 0x20 ; 32
c8e: 11 f0 breq .+4 ; 0xc94 <__vector_12+0x482>
c90: 51 11 cpse r21, r1
c92: 49 c0 rjmp .+146 ; 0xd26 <__vector_12+0x514>
if (ucr.wIndex<NUMINTERFACES) { // defined interface will be chosen
c94: 22 30 cpi r18, 0x02 ; 2
c96: 31 05 cpc r19, r1
c98: 40 f4 brcc .+16 ; 0xcaa <__vector_12+0x498>
usb_if = ucr.wIndex;
c9a: 20 93 25 01 sts 0x0125, r18
USB_SEND_IN;
c9e: 8e ef ldi r24, 0xFE ; 254
ca0: 80 93 e8 00 sts 0x00E8, r24
#ifdef STATICENDPOINTS
usb_endpoints(); // initialize endpoints
ca4: 0e 94 b6 02 call 0x56c ; 0x56c <usb_endpoints>
ca8: 78 c0 rjmp .+240 ; 0xd9a <__vector_12+0x588>
#else
usb_endpoints(usb_if); // initialize endpoints
#endif
} else { // other configurations are not supported in this version
STALL; // stall
caa: 81 e2 ldi r24, 0x21 ; 33
cac: 80 93 eb 00 sts 0x00EB, r24
cb0: 74 c0 rjmp .+232 ; 0xd9a <__vector_12+0x588>
}
return;
}
if (ucr.bRequest == GET_INTERFACE && ucr.bmRequestType == 0x80) {
cb2: 4a 30 cpi r20, 0x0A ; 10
cb4: 79 f4 brne .+30 ; 0xcd4 <__vector_12+0x4c2>
cb6: 50 38 cpi r21, 0x80 ; 128
cb8: b1 f5 brne .+108 ; 0xd26 <__vector_12+0x514>
#define STALL UECONX = _BV(STALLRQ) | _BV(EPEN)
static inline void usb_wait_in_ready(void)
{
while (!(UEINTX & _BV(TXINI)));
cba: e8 ee ldi r30, 0xE8 ; 232
cbc: f0 e0 ldi r31, 0x00 ; 0
cbe: 80 81 ld r24, Z
cc0: 80 ff sbrs r24, 0
cc2: fd cf rjmp .-6 ; 0xcbe <__vector_12+0x4ac>
}
return;
}
if (ucr.bRequest == GET_INTERFACE && ucr.bmRequestType == 0x80) {
usb_wait_in_ready();
UEDATX = usb_if;
cc4: 80 91 25 01 lds r24, 0x0125
cc8: 80 93 f1 00 sts 0x00F1, r24
USB_SEND_IN;
ccc: 8e ef ldi r24, 0xFE ; 254
cce: 80 93 e8 00 sts 0x00E8, r24
cd2: 63 c0 rjmp .+198 ; 0xd9a <__vector_12+0x588>
return;
}
#endif
#ifdef SUPPORT_ENDPOINT_HALT
if ((ucr.bRequest == CLEAR_FEATURE || ucr.bRequest == SET_FEATURE)
cd4: 41 30 cpi r20, 0x01 ; 1
cd6: 11 f0 breq .+4 ; 0xcdc <__vector_12+0x4ca>
cd8: 43 30 cpi r20, 0x03 ; 3
cda: 29 f5 brne .+74 ; 0xd26 <__vector_12+0x514>
&& ucr.bmRequestType == 0x02 && ucr.wValue == 0) {
cdc: 52 30 cpi r21, 0x02 ; 2
cde: 19 f5 brne .+70 ; 0xd26 <__vector_12+0x514>
ce0: 89 2b or r24, r25
ce2: 09 f5 brne .+66 ; 0xd26 <__vector_12+0x514>
i = ucr.wIndex & 0x7F;
ce4: 2f 77 andi r18, 0x7F ; 127
ce6: 33 27 eor r19, r19
if (i >= 1 && i <= MAX_ENDPOINT) {
ce8: 92 2f mov r25, r18
cea: 91 50 subi r25, 0x01 ; 1
cec: 94 30 cpi r25, 0x04 ; 4
cee: d8 f4 brcc .+54 ; 0xd26 <__vector_12+0x514>
USB_SEND_IN;
cf0: 9e ef ldi r25, 0xFE ; 254
cf2: 90 93 e8 00 sts 0x00E8, r25
UENUM = i;
cf6: 20 93 e9 00 sts 0x00E9, r18
if (ucr.bRequest == SET_FEATURE) {
cfa: 43 30 cpi r20, 0x03 ; 3
cfc: 21 f4 brne .+8 ; 0xd06 <__vector_12+0x4f4>
UECONX = _BV(STALLRQ)|_BV(EPEN);
cfe: 81 e2 ldi r24, 0x21 ; 33
d00: 80 93 eb 00 sts 0x00EB, r24
d04: 4a c0 rjmp .+148 ; 0xd9a <__vector_12+0x588>
} else {
UECONX = _BV(STALLRQC)|_BV(RSTDT)|_BV(EPEN);
d06: 89 e1 ldi r24, 0x19 ; 25
d08: 80 93 eb 00 sts 0x00EB, r24
UERST = _BV(i);
d0c: 81 e0 ldi r24, 0x01 ; 1
d0e: 90 e0 ldi r25, 0x00 ; 0
d10: ac 01 movw r20, r24
d12: 02 c0 rjmp .+4 ; 0xd18 <__vector_12+0x506>
d14: 44 0f add r20, r20
d16: 55 1f adc r21, r21
d18: 2a 95 dec r18
d1a: e2 f7 brpl .-8 ; 0xd14 <__vector_12+0x502>
d1c: ea ee ldi r30, 0xEA ; 234
d1e: f0 e0 ldi r31, 0x00 ; 0
d20: 40 83 st Z, r20
UERST = 0;
d22: 10 82 st Z, r1
d24: 3a c0 rjmp .+116 ; 0xd9a <__vector_12+0x588>
if (!usb_controlrequest(&ucr))
UECONX = _BV(STALLRQ) | _BV(EPEN); // stall
return;
#endif
}
UECONX = _BV(STALLRQ) | _BV(EPEN); // stall
d26: 81 e2 ldi r24, 0x21 ; 33
d28: 80 93 eb 00 sts 0x00EB, r24
d2c: 2d c0 rjmp .+90 ; 0xd88 <__vector_12+0x576>
d2e: 12 2f mov r17, r18
}
// handle pending interrupts for other endpoints
for (i=1; i<=MAX_ENDPOINT; i++) {
if (UEINT & _BV(i)) {
d30: 80 81 ld r24, Z
d32: 90 e0 ldi r25, 0x00 ; 0
d34: 02 2e mov r0, r18
d36: 02 c0 rjmp .+4 ; 0xd3c <__vector_12+0x52a>
d38: 95 95 asr r25
d3a: 87 95 ror r24
d3c: 0a 94 dec r0
d3e: e2 f7 brpl .-8 ; 0xd38 <__vector_12+0x526>
d40: 80 ff sbrs r24, 0
d42: 19 c0 rjmp .+50 ; 0xd76 <__vector_12+0x564>
UENUM=i; // select endpoint
d44: da 01 movw r26, r20
d46: 2c 93 st X, r18
intbits = UEINTX; // save interrupt bits of the endpoint
d48: db 01 movw r26, r22
d4a: 8c 91 ld r24, X
if (intbits & _BV(RXOUTI)) { // interrupt occured by incoming data
d4c: 82 ff sbrs r24, 2
d4e: 13 c0 rjmp .+38 ; 0xd76 <__vector_12+0x564>
#ifdef MEGA4_6
if (((uint16_t)(UEBCHX)<<8)+UEBCLX) { // data available in input endpoint
usb_ep(i,((uint16_t)(UEBCHX)<<8)+UEBCLX);
#else
if (UEBCLX) { // data available in input endpoint
d50: 80 91 f2 00 lds r24, 0x00F2
d54: 88 23 and r24, r24
d56: 41 f0 breq .+16 ; 0xd68 <__vector_12+0x556>
usb_ep(i,UEBCLX);
d58: 60 91 f2 00 lds r22, 0x00F2
d5c: 70 e0 ldi r23, 0x00 ; 0
d5e: 82 2f mov r24, r18
d60: 0e 94 db 00 call 0x1b6 ; 0x1b6 <usb_ep>
#endif
UENUM=i; // reselect endpoint (if changed by handling routine)
d64: 10 93 e9 00 sts 0x00E9, r17
}
UEINTX = ~(_BV(RXOUTI)|_BV(STALLEDI)); // clear interrupt flags
d68: e8 ee ldi r30, 0xE8 ; 232
d6a: f0 e0 ldi r31, 0x00 ; 0
d6c: 89 ef ldi r24, 0xF9 ; 249
d6e: 80 83 st Z, r24
UEINTX = 0x7F; // free bank (FIFOCON), has to be executed after RXOUTI!
d70: 8f e7 ldi r24, 0x7F ; 127
d72: 80 83 st Z, r24
d74: 12 c0 rjmp .+36 ; 0xd9a <__vector_12+0x588>
d76: 2f 5f subi r18, 0xFF ; 255
d78: 3f 4f sbci r19, 0xFF ; 255
}
UECONX = _BV(STALLRQ) | _BV(EPEN); // stall
}
// handle pending interrupts for other endpoints
for (i=1; i<=MAX_ENDPOINT; i++) {
d7a: 25 30 cpi r18, 0x05 ; 5
d7c: 31 05 cpc r19, r1
d7e: b9 f6 brne .-82 ; 0xd2e <__vector_12+0x51c>
UEINTX = 0x7F; // free bank (FIFOCON), has to be executed after RXOUTI!
return;
}
}
}
STALL; // stall
d80: 81 e2 ldi r24, 0x21 ; 33
d82: 80 93 eb 00 sts 0x00EB, r24
d86: 09 c0 rjmp .+18 ; 0xd9a <__vector_12+0x588>
cdc_notify_setcontrollinestate();
return;
}
if (ucr.bRequest == GET_STATUS) {
usb_wait_in_ready();
i = 0;
d88: 21 e0 ldi r18, 0x01 ; 1
d8a: 30 e0 ldi r19, 0x00 ; 0
UECONX = _BV(STALLRQ) | _BV(EPEN); // stall
}
// handle pending interrupts for other endpoints
for (i=1; i<=MAX_ENDPOINT; i++) {
if (UEINT & _BV(i)) {
d8c: e4 ef ldi r30, 0xF4 ; 244
d8e: f0 e0 ldi r31, 0x00 ; 0
UENUM=i; // select endpoint
d90: 49 ee ldi r20, 0xE9 ; 233
d92: 50 e0 ldi r21, 0x00 ; 0
intbits = UEINTX; // save interrupt bits of the endpoint
d94: 68 ee ldi r22, 0xE8 ; 232
d96: 70 e0 ldi r23, 0x00 ; 0
d98: ca cf rjmp .-108 ; 0xd2e <__vector_12+0x51c>
return;
}
}
}
STALL; // stall
}
d9a: 29 96 adiw r28, 0x09 ; 9
d9c: 0f b6 in r0, 0x3f ; 63
d9e: f8 94 cli
da0: de bf out 0x3e, r29 ; 62
da2: 0f be out 0x3f, r0 ; 63
da4: cd bf out 0x3d, r28 ; 61
da6: df 91 pop r29
da8: cf 91 pop r28
daa: ff 91 pop r31
dac: ef 91 pop r30
dae: bf 91 pop r27
db0: af 91 pop r26
db2: 9f 91 pop r25
db4: 8f 91 pop r24
db6: 7f 91 pop r23
db8: 6f 91 pop r22
dba: 5f 91 pop r21
dbc: 4f 91 pop r20
dbe: 3f 91 pop r19
dc0: 2f 91 pop r18
dc2: 1f 91 pop r17
dc4: 0f 91 pop r16
dc6: ff 90 pop r15
dc8: ef 90 pop r14
dca: df 90 pop r13
dcc: cf 90 pop r12
dce: bf 90 pop r11
dd0: af 90 pop r10
dd2: 9f 90 pop r9
dd4: 8f 90 pop r8
dd6: 7f 90 pop r7
dd8: 6f 90 pop r6
dda: 5f 90 pop r5
ddc: 4f 90 pop r4
dde: 3f 90 pop r3
de0: 2f 90 pop r2
de2: 0f 90 pop r0
de4: 0f be out 0x3f, r0 ; 63
de6: 0f 90 pop r0
de8: 1f 90 pop r1
dea: 18 95 reti
00000dec <malloc>:
dec: 0f 93 push r16
dee: 1f 93 push r17
df0: cf 93 push r28
df2: df 93 push r29
df4: 82 30 cpi r24, 0x02 ; 2
df6: 91 05 cpc r25, r1
df8: 10 f4 brcc .+4 ; 0xdfe <malloc+0x12>
dfa: 82 e0 ldi r24, 0x02 ; 2
dfc: 90 e0 ldi r25, 0x00 ; 0
dfe: e0 91 fe 01 lds r30, 0x01FE
e02: f0 91 ff 01 lds r31, 0x01FF
e06: 20 e0 ldi r18, 0x00 ; 0
e08: 30 e0 ldi r19, 0x00 ; 0
e0a: c0 e0 ldi r28, 0x00 ; 0
e0c: d0 e0 ldi r29, 0x00 ; 0
e0e: 23 c0 rjmp .+70 ; 0xe56 <malloc+0x6a>
e10: 40 81 ld r20, Z
e12: 51 81 ldd r21, Z+1 ; 0x01
e14: 48 17 cp r20, r24
e16: 59 07 cpc r21, r25
e18: a8 f0 brcs .+42 ; 0xe44 <malloc+0x58>
e1a: 48 17 cp r20, r24
e1c: 59 07 cpc r21, r25
e1e: 61 f4 brne .+24 ; 0xe38 <malloc+0x4c>
e20: 82 81 ldd r24, Z+2 ; 0x02
e22: 93 81 ldd r25, Z+3 ; 0x03
e24: 20 97 sbiw r28, 0x00 ; 0
e26: 19 f0 breq .+6 ; 0xe2e <malloc+0x42>
e28: 9b 83 std Y+3, r25 ; 0x03
e2a: 8a 83 std Y+2, r24 ; 0x02
e2c: 2e c0 rjmp .+92 ; 0xe8a <malloc+0x9e>
e2e: 90 93 ff 01 sts 0x01FF, r25
e32: 80 93 fe 01 sts 0x01FE, r24
e36: 29 c0 rjmp .+82 ; 0xe8a <malloc+0x9e>
e38: 21 15 cp r18, r1
e3a: 31 05 cpc r19, r1
e3c: 29 f0 breq .+10 ; 0xe48 <malloc+0x5c>
e3e: 42 17 cp r20, r18
e40: 53 07 cpc r21, r19
e42: 10 f0 brcs .+4 ; 0xe48 <malloc+0x5c>
e44: a9 01 movw r20, r18
e46: 02 c0 rjmp .+4 ; 0xe4c <malloc+0x60>
e48: be 01 movw r22, r28
e4a: df 01 movw r26, r30
e4c: 02 81 ldd r16, Z+2 ; 0x02
e4e: 13 81 ldd r17, Z+3 ; 0x03
e50: ef 01 movw r28, r30
e52: 9a 01 movw r18, r20
e54: f8 01 movw r30, r16
e56: 30 97 sbiw r30, 0x00 ; 0
e58: d9 f6 brne .-74 ; 0xe10 <malloc+0x24>
e5a: 21 15 cp r18, r1
e5c: 31 05 cpc r19, r1
e5e: 09 f1 breq .+66 ; 0xea2 <malloc+0xb6>
e60: 28 1b sub r18, r24
e62: 39 0b sbc r19, r25
e64: 24 30 cpi r18, 0x04 ; 4
e66: 31 05 cpc r19, r1
e68: 90 f4 brcc .+36 ; 0xe8e <malloc+0xa2>
e6a: 12 96 adiw r26, 0x02 ; 2
e6c: 8d 91 ld r24, X+
e6e: 9c 91 ld r25, X
e70: 13 97 sbiw r26, 0x03 ; 3
e72: 61 15 cp r22, r1
e74: 71 05 cpc r23, r1
e76: 21 f0 breq .+8 ; 0xe80 <malloc+0x94>
e78: fb 01 movw r30, r22
e7a: 93 83 std Z+3, r25 ; 0x03
e7c: 82 83 std Z+2, r24 ; 0x02
e7e: 04 c0 rjmp .+8 ; 0xe88 <malloc+0x9c>
e80: 90 93 ff 01 sts 0x01FF, r25
e84: 80 93 fe 01 sts 0x01FE, r24
e88: fd 01 movw r30, r26
e8a: 32 96 adiw r30, 0x02 ; 2
e8c: 44 c0 rjmp .+136 ; 0xf16 <malloc+0x12a>
e8e: fd 01 movw r30, r26
e90: e2 0f add r30, r18
e92: f3 1f adc r31, r19
e94: 81 93 st Z+, r24
e96: 91 93 st Z+, r25
e98: 22 50 subi r18, 0x02 ; 2
e9a: 31 09 sbc r19, r1
e9c: 2d 93 st X+, r18
e9e: 3c 93 st X, r19
ea0: 3a c0 rjmp .+116 ; 0xf16 <malloc+0x12a>
ea2: 20 91 fc 01 lds r18, 0x01FC
ea6: 30 91 fd 01 lds r19, 0x01FD
eaa: 23 2b or r18, r19
eac: 41 f4 brne .+16 ; 0xebe <malloc+0xd2>
eae: 20 91 28 01 lds r18, 0x0128
eb2: 30 91 29 01 lds r19, 0x0129
eb6: 30 93 fd 01 sts 0x01FD, r19
eba: 20 93 fc 01 sts 0x01FC, r18
ebe: 20 91 26 01 lds r18, 0x0126
ec2: 30 91 27 01 lds r19, 0x0127
ec6: 21 15 cp r18, r1
ec8: 31 05 cpc r19, r1
eca: 41 f4 brne .+16 ; 0xedc <malloc+0xf0>
ecc: 2d b7 in r18, 0x3d ; 61
ece: 3e b7 in r19, 0x3e ; 62
ed0: 40 91 2a 01 lds r20, 0x012A
ed4: 50 91 2b 01 lds r21, 0x012B
ed8: 24 1b sub r18, r20
eda: 35 0b sbc r19, r21
edc: e0 91 fc 01 lds r30, 0x01FC
ee0: f0 91 fd 01 lds r31, 0x01FD
ee4: e2 17 cp r30, r18
ee6: f3 07 cpc r31, r19
ee8: a0 f4 brcc .+40 ; 0xf12 <malloc+0x126>
eea: 2e 1b sub r18, r30
eec: 3f 0b sbc r19, r31
eee: 28 17 cp r18, r24
ef0: 39 07 cpc r19, r25
ef2: 78 f0 brcs .+30 ; 0xf12 <malloc+0x126>
ef4: ac 01 movw r20, r24
ef6: 4e 5f subi r20, 0xFE ; 254
ef8: 5f 4f sbci r21, 0xFF ; 255
efa: 24 17 cp r18, r20
efc: 35 07 cpc r19, r21
efe: 48 f0 brcs .+18 ; 0xf12 <malloc+0x126>
f00: 4e 0f add r20, r30
f02: 5f 1f adc r21, r31
f04: 50 93 fd 01 sts 0x01FD, r21
f08: 40 93 fc 01 sts 0x01FC, r20
f0c: 81 93 st Z+, r24
f0e: 91 93 st Z+, r25
f10: 02 c0 rjmp .+4 ; 0xf16 <malloc+0x12a>
f12: e0 e0 ldi r30, 0x00 ; 0
f14: f0 e0 ldi r31, 0x00 ; 0
f16: cf 01 movw r24, r30
f18: df 91 pop r29
f1a: cf 91 pop r28
f1c: 1f 91 pop r17
f1e: 0f 91 pop r16
f20: 08 95 ret
00000f22 <free>:
f22: ef 92 push r14
f24: ff 92 push r15
f26: 0f 93 push r16
f28: 1f 93 push r17
f2a: cf 93 push r28
f2c: df 93 push r29
f2e: 00 97 sbiw r24, 0x00 ; 0
f30: 09 f4 brne .+2 ; 0xf34 <free+0x12>
f32: 8f c0 rjmp .+286 ; 0x1052 <free+0x130>
f34: dc 01 movw r26, r24
f36: 12 97 sbiw r26, 0x02 ; 2
f38: 13 96 adiw r26, 0x03 ; 3
f3a: 1c 92 st X, r1
f3c: 1e 92 st -X, r1
f3e: 12 97 sbiw r26, 0x02 ; 2
f40: e0 90 fe 01 lds r14, 0x01FE
f44: f0 90 ff 01 lds r15, 0x01FF
f48: e1 14 cp r14, r1
f4a: f1 04 cpc r15, r1
f4c: 89 f4 brne .+34 ; 0xf70 <free+0x4e>
f4e: 2d 91 ld r18, X+
f50: 3c 91 ld r19, X
f52: 11 97 sbiw r26, 0x01 ; 1
f54: 28 0f add r18, r24
f56: 39 1f adc r19, r25
f58: 80 91 fc 01 lds r24, 0x01FC
f5c: 90 91 fd 01 lds r25, 0x01FD
f60: 82 17 cp r24, r18
f62: 93 07 cpc r25, r19
f64: 89 f5 brne .+98 ; 0xfc8 <free+0xa6>
f66: b0 93 fd 01 sts 0x01FD, r27
f6a: a0 93 fc 01 sts 0x01FC, r26
f6e: 71 c0 rjmp .+226 ; 0x1052 <free+0x130>
f70: e7 01 movw r28, r14
f72: 20 e0 ldi r18, 0x00 ; 0
f74: 30 e0 ldi r19, 0x00 ; 0
f76: 01 c0 rjmp .+2 ; 0xf7a <free+0x58>
f78: ea 01 movw r28, r20
f7a: ca 17 cp r28, r26
f7c: db 07 cpc r29, r27
f7e: 38 f4 brcc .+14 ; 0xf8e <free+0x6c>
f80: 4a 81 ldd r20, Y+2 ; 0x02
f82: 5b 81 ldd r21, Y+3 ; 0x03
f84: 9e 01 movw r18, r28
f86: 41 15 cp r20, r1
f88: 51 05 cpc r21, r1
f8a: b1 f7 brne .-20 ; 0xf78 <free+0x56>
f8c: 22 c0 rjmp .+68 ; 0xfd2 <free+0xb0>
f8e: bc 01 movw r22, r24
f90: 62 50 subi r22, 0x02 ; 2
f92: 71 09 sbc r23, r1
f94: fb 01 movw r30, r22
f96: d3 83 std Z+3, r29 ; 0x03
f98: c2 83 std Z+2, r28 ; 0x02
f9a: 00 81 ld r16, Z
f9c: 11 81 ldd r17, Z+1 ; 0x01
f9e: ac 01 movw r20, r24
fa0: 40 0f add r20, r16
fa2: 51 1f adc r21, r17
fa4: 4c 17 cp r20, r28
fa6: 5d 07 cpc r21, r29
fa8: 61 f4 brne .+24 ; 0xfc2 <free+0xa0>
faa: 48 81 ld r20, Y
fac: 59 81 ldd r21, Y+1 ; 0x01
fae: 40 0f add r20, r16
fb0: 51 1f adc r21, r17
fb2: 4e 5f subi r20, 0xFE ; 254
fb4: 5f 4f sbci r21, 0xFF ; 255
fb6: 51 83 std Z+1, r21 ; 0x01
fb8: 40 83 st Z, r20
fba: 4a 81 ldd r20, Y+2 ; 0x02
fbc: 5b 81 ldd r21, Y+3 ; 0x03
fbe: 53 83 std Z+3, r21 ; 0x03
fc0: 42 83 std Z+2, r20 ; 0x02
fc2: 21 15 cp r18, r1
fc4: 31 05 cpc r19, r1
fc6: 29 f4 brne .+10 ; 0xfd2 <free+0xb0>
fc8: b0 93 ff 01 sts 0x01FF, r27
fcc: a0 93 fe 01 sts 0x01FE, r26
fd0: 40 c0 rjmp .+128 ; 0x1052 <free+0x130>
fd2: f9 01 movw r30, r18
fd4: b3 83 std Z+3, r27 ; 0x03
fd6: a2 83 std Z+2, r26 ; 0x02
fd8: e9 01 movw r28, r18
fda: 69 91 ld r22, Y+
fdc: 79 91 ld r23, Y+
fde: c6 0f add r28, r22
fe0: d7 1f adc r29, r23
fe2: ac 17 cp r26, r28
fe4: bd 07 cpc r27, r29
fe6: 79 f4 brne .+30 ; 0x1006 <free+0xe4>
fe8: dc 01 movw r26, r24
fea: 5e 91 ld r21, -X
fec: 4e 91 ld r20, -X
fee: 46 0f add r20, r22
ff0: 57 1f adc r21, r23
ff2: 4e 5f subi r20, 0xFE ; 254
ff4: 5f 4f sbci r21, 0xFF ; 255
ff6: 51 83 std Z+1, r21 ; 0x01
ff8: 40 83 st Z, r20
ffa: 12 96 adiw r26, 0x02 ; 2
ffc: 8d 91 ld r24, X+
ffe: 9c 91 ld r25, X
1000: 13 97 sbiw r26, 0x03 ; 3
1002: 93 83 std Z+3, r25 ; 0x03
1004: 82 83 std Z+2, r24 ; 0x02
1006: a0 e0 ldi r26, 0x00 ; 0
1008: b0 e0 ldi r27, 0x00 ; 0
100a: 02 c0 rjmp .+4 ; 0x1010 <free+0xee>
100c: d7 01 movw r26, r14
100e: 7c 01 movw r14, r24
1010: f7 01 movw r30, r14
1012: 82 81 ldd r24, Z+2 ; 0x02
1014: 93 81 ldd r25, Z+3 ; 0x03
1016: 00 97 sbiw r24, 0x00 ; 0
1018: c9 f7 brne .-14 ; 0x100c <free+0xea>
101a: c7 01 movw r24, r14
101c: 02 96 adiw r24, 0x02 ; 2
101e: 20 81 ld r18, Z
1020: 31 81 ldd r19, Z+1 ; 0x01
1022: 82 0f add r24, r18
1024: 93 1f adc r25, r19
1026: 20 91 fc 01 lds r18, 0x01FC
102a: 30 91 fd 01 lds r19, 0x01FD
102e: 28 17 cp r18, r24
1030: 39 07 cpc r19, r25
1032: 79 f4 brne .+30 ; 0x1052 <free+0x130>
1034: 10 97 sbiw r26, 0x00 ; 0
1036: 29 f4 brne .+10 ; 0x1042 <free+0x120>
1038: 10 92 ff 01 sts 0x01FF, r1
103c: 10 92 fe 01 sts 0x01FE, r1
1040: 04 c0 rjmp .+8 ; 0x104a <free+0x128>
1042: 13 96 adiw r26, 0x03 ; 3
1044: 1c 92 st X, r1
1046: 1e 92 st -X, r1
1048: 12 97 sbiw r26, 0x02 ; 2
104a: f0 92 fd 01 sts 0x01FD, r15
104e: e0 92 fc 01 sts 0x01FC, r14
1052: cd b7 in r28, 0x3d ; 61
1054: de b7 in r29, 0x3e ; 62
1056: e6 e0 ldi r30, 0x06 ; 6
1058: 0c 94 ea 0b jmp 0x17d4 ; 0x17d4 <__epilogue_restores__+0x18>
0000105c <strcat>:
105c: fb 01 movw r30, r22
105e: dc 01 movw r26, r24
1060: 0d 90 ld r0, X+
1062: 00 20 and r0, r0
1064: e9 f7 brne .-6 ; 0x1060 <strcat+0x4>
1066: 11 97 sbiw r26, 0x01 ; 1
1068: 01 90 ld r0, Z+
106a: 0d 92 st X+, r0
106c: 00 20 and r0, r0
106e: e1 f7 brne .-8 ; 0x1068 <strcat+0xc>
1070: 08 95 ret
00001072 <itoa>:
1072: fb 01 movw r30, r22
1074: 9f 01 movw r18, r30
1076: e8 94 clt
1078: 42 30 cpi r20, 0x02 ; 2
107a: c4 f0 brlt .+48 ; 0x10ac <itoa+0x3a>
107c: 45 32 cpi r20, 0x25 ; 37
107e: b4 f4 brge .+44 ; 0x10ac <itoa+0x3a>
1080: 4a 30 cpi r20, 0x0A ; 10
1082: 29 f4 brne .+10 ; 0x108e <itoa+0x1c>
1084: 97 fb bst r25, 7
1086: 1e f4 brtc .+6 ; 0x108e <itoa+0x1c>
1088: 90 95 com r25
108a: 81 95 neg r24
108c: 9f 4f sbci r25, 0xFF ; 255
108e: 64 2f mov r22, r20
1090: 77 27 eor r23, r23
1092: 0e 94 8c 0b call 0x1718 ; 0x1718 <__udivmodhi4>
1096: 80 5d subi r24, 0xD0 ; 208
1098: 8a 33 cpi r24, 0x3A ; 58
109a: 0c f0 brlt .+2 ; 0x109e <itoa+0x2c>
109c: 89 5d subi r24, 0xD9 ; 217
109e: 81 93 st Z+, r24
10a0: cb 01 movw r24, r22
10a2: 00 97 sbiw r24, 0x00 ; 0
10a4: a1 f7 brne .-24 ; 0x108e <itoa+0x1c>
10a6: 16 f4 brtc .+4 ; 0x10ac <itoa+0x3a>
10a8: 5d e2 ldi r21, 0x2D ; 45
10aa: 51 93 st Z+, r21
10ac: 10 82 st Z, r1
10ae: c9 01 movw r24, r18
10b0: 0c 94 e7 0a jmp 0x15ce ; 0x15ce <strrev>
000010b4 <ltoa>:
10b4: fa 01 movw r30, r20
10b6: cf 93 push r28
10b8: ff 93 push r31
10ba: ef 93 push r30
10bc: 22 30 cpi r18, 0x02 ; 2
10be: 44 f1 brlt .+80 ; 0x1110 <ltoa+0x5c>
10c0: 25 32 cpi r18, 0x25 ; 37
10c2: 34 f5 brge .+76 ; 0x1110 <ltoa+0x5c>
10c4: c2 2f mov r28, r18
10c6: e8 94 clt
10c8: ca 30 cpi r28, 0x0A ; 10
10ca: 49 f4 brne .+18 ; 0x10de <ltoa+0x2a>
10cc: 97 fb bst r25, 7
10ce: 3e f4 brtc .+14 ; 0x10de <ltoa+0x2a>
10d0: 90 95 com r25
10d2: 80 95 com r24
10d4: 70 95 com r23
10d6: 61 95 neg r22
10d8: 7f 4f sbci r23, 0xFF ; 255
10da: 8f 4f sbci r24, 0xFF ; 255
10dc: 9f 4f sbci r25, 0xFF ; 255
10de: 2c 2f mov r18, r28
10e0: 33 27 eor r19, r19
10e2: 44 27 eor r20, r20
10e4: 55 27 eor r21, r21
10e6: ff 93 push r31
10e8: ef 93 push r30
10ea: 0e 94 a0 0b call 0x1740 ; 0x1740 <__udivmodsi4>
10ee: ef 91 pop r30
10f0: ff 91 pop r31
10f2: 60 5d subi r22, 0xD0 ; 208
10f4: 6a 33 cpi r22, 0x3A ; 58
10f6: 0c f0 brlt .+2 ; 0x10fa <ltoa+0x46>
10f8: 69 5d subi r22, 0xD9 ; 217
10fa: 61 93 st Z+, r22
10fc: b9 01 movw r22, r18
10fe: ca 01 movw r24, r20
1100: 60 50 subi r22, 0x00 ; 0
1102: 70 40 sbci r23, 0x00 ; 0
1104: 80 40 sbci r24, 0x00 ; 0
1106: 90 40 sbci r25, 0x00 ; 0
1108: 51 f7 brne .-44 ; 0x10de <ltoa+0x2a>
110a: 16 f4 brtc .+4 ; 0x1110 <ltoa+0x5c>
110c: cd e2 ldi r28, 0x2D ; 45
110e: c1 93 st Z+, r28
1110: 10 82 st Z, r1
1112: 8f 91 pop r24
1114: 9f 91 pop r25
1116: cf 91 pop r28
1118: 0c 94 e7 0a jmp 0x15ce ; 0x15ce <strrev>
0000111c <fprintf>:
111c: a0 e0 ldi r26, 0x00 ; 0
111e: b0 e0 ldi r27, 0x00 ; 0
1120: e4 e9 ldi r30, 0x94 ; 148
1122: f8 e0 ldi r31, 0x08 ; 8
1124: 0c 94 d2 0b jmp 0x17a4 ; 0x17a4 <__prologue_saves__+0x20>
1128: ce 01 movw r24, r28
112a: 09 96 adiw r24, 0x09 ; 9
112c: ac 01 movw r20, r24
112e: 6f 81 ldd r22, Y+7 ; 0x07
1130: 78 85 ldd r23, Y+8 ; 0x08
1132: 8d 81 ldd r24, Y+5 ; 0x05
1134: 9e 81 ldd r25, Y+6 ; 0x06
1136: 0e 94 f3 08 call 0x11e6 ; 0x11e6 <vfprintf>
113a: e2 e0 ldi r30, 0x02 ; 2
113c: 0c 94 ee 0b jmp 0x17dc ; 0x17dc <__epilogue_restores__+0x20>
00001140 <fwrite>:
1140: a0 e0 ldi r26, 0x00 ; 0
1142: b0 e0 ldi r27, 0x00 ; 0
1144: e6 ea ldi r30, 0xA6 ; 166
1146: f8 e0 ldi r31, 0x08 ; 8
1148: 0c 94 c8 0b jmp 0x1790 ; 0x1790 <__prologue_saves__+0xc>
114c: 6b 01 movw r12, r22
114e: 4a 01 movw r8, r20
1150: 79 01 movw r14, r18
1152: d9 01 movw r26, r18
1154: 13 96 adiw r26, 0x03 ; 3
1156: 2c 91 ld r18, X
1158: 21 ff sbrs r18, 1
115a: 1b c0 rjmp .+54 ; 0x1192 <fwrite+0x52>
115c: 8c 01 movw r16, r24
115e: c0 e0 ldi r28, 0x00 ; 0
1160: d0 e0 ldi r29, 0x00 ; 0
1162: 10 c0 rjmp .+32 ; 0x1184 <fwrite+0x44>
1164: d7 01 movw r26, r14
1166: 18 96 adiw r26, 0x08 ; 8
1168: ed 91 ld r30, X+
116a: fc 91 ld r31, X
116c: 19 97 sbiw r26, 0x09 ; 9
116e: b7 01 movw r22, r14
1170: d8 01 movw r26, r16
1172: 8d 91 ld r24, X+
1174: 8d 01 movw r16, r26
1176: 09 95 icall
1178: 89 2b or r24, r25
117a: 69 f4 brne .+26 ; 0x1196 <fwrite+0x56>
117c: 0a 15 cp r16, r10
117e: 1b 05 cpc r17, r11
1180: 89 f7 brne .-30 ; 0x1164 <fwrite+0x24>
1182: 21 96 adiw r28, 0x01 ; 1
1184: c8 15 cp r28, r8
1186: d9 05 cpc r29, r9
1188: 31 f0 breq .+12 ; 0x1196 <fwrite+0x56>
118a: 58 01 movw r10, r16
118c: ac 0c add r10, r12
118e: bd 1c adc r11, r13
1190: f5 cf rjmp .-22 ; 0x117c <fwrite+0x3c>
1192: c0 e0 ldi r28, 0x00 ; 0
1194: d0 e0 ldi r29, 0x00 ; 0
1196: ce 01 movw r24, r28
1198: cd b7 in r28, 0x3d ; 61
119a: de b7 in r29, 0x3e ; 62
119c: ec e0 ldi r30, 0x0C ; 12
119e: 0c 94 e4 0b jmp 0x17c8 ; 0x17c8 <__epilogue_restores__+0xc>
000011a2 <sprintf>:
11a2: ae e0 ldi r26, 0x0E ; 14
11a4: b0 e0 ldi r27, 0x00 ; 0
11a6: e7 ed ldi r30, 0xD7 ; 215
11a8: f8 e0 ldi r31, 0x08 ; 8
11aa: 0c 94 d0 0b jmp 0x17a0 ; 0x17a0 <__prologue_saves__+0x1c>
11ae: 0d 89 ldd r16, Y+21 ; 0x15
11b0: 1e 89 ldd r17, Y+22 ; 0x16
11b2: 86 e0 ldi r24, 0x06 ; 6
11b4: 8c 83 std Y+4, r24 ; 0x04
11b6: 1a 83 std Y+2, r17 ; 0x02
11b8: 09 83 std Y+1, r16 ; 0x01
11ba: 8f ef ldi r24, 0xFF ; 255
11bc: 9f e7 ldi r25, 0x7F ; 127
11be: 9e 83 std Y+6, r25 ; 0x06
11c0: 8d 83 std Y+5, r24 ; 0x05
11c2: ce 01 movw r24, r28
11c4: 49 96 adiw r24, 0x19 ; 25
11c6: ac 01 movw r20, r24
11c8: 6f 89 ldd r22, Y+23 ; 0x17
11ca: 78 8d ldd r23, Y+24 ; 0x18
11cc: ce 01 movw r24, r28
11ce: 01 96 adiw r24, 0x01 ; 1
11d0: 0e 94 f3 08 call 0x11e6 ; 0x11e6 <vfprintf>
11d4: ef 81 ldd r30, Y+7 ; 0x07
11d6: f8 85 ldd r31, Y+8 ; 0x08
11d8: e0 0f add r30, r16
11da: f1 1f adc r31, r17
11dc: 10 82 st Z, r1
11de: 2e 96 adiw r28, 0x0e ; 14
11e0: e4 e0 ldi r30, 0x04 ; 4
11e2: 0c 94 ec 0b jmp 0x17d8 ; 0x17d8 <__epilogue_restores__+0x1c>
000011e6 <vfprintf>:
11e6: ac e0 ldi r26, 0x0C ; 12
11e8: b0 e0 ldi r27, 0x00 ; 0
11ea: e9 ef ldi r30, 0xF9 ; 249
11ec: f8 e0 ldi r31, 0x08 ; 8
11ee: 0c 94 c2 0b jmp 0x1784 ; 0x1784 <__prologue_saves__>
11f2: 7c 01 movw r14, r24
11f4: 6b 01 movw r12, r22
11f6: 8a 01 movw r16, r20
11f8: fc 01 movw r30, r24
11fa: 17 82 std Z+7, r1 ; 0x07
11fc: 16 82 std Z+6, r1 ; 0x06
11fe: 83 81 ldd r24, Z+3 ; 0x03
1200: 81 ff sbrs r24, 1
1202: c8 c1 rjmp .+912 ; 0x1594 <vfprintf+0x3ae>
1204: 88 24 eor r8, r8
1206: 83 94 inc r8
1208: 91 2c mov r9, r1
120a: 8c 0e add r8, r28
120c: 9d 1e adc r9, r29
120e: f7 01 movw r30, r14
1210: 93 81 ldd r25, Z+3 ; 0x03
1212: f6 01 movw r30, r12
1214: 93 fd sbrc r25, 3
1216: 85 91 lpm r24, Z+
1218: 93 ff sbrs r25, 3
121a: 81 91 ld r24, Z+
121c: 6f 01 movw r12, r30
121e: 88 23 and r24, r24
1220: 09 f4 brne .+2 ; 0x1224 <vfprintf+0x3e>
1222: b4 c1 rjmp .+872 ; 0x158c <vfprintf+0x3a6>
1224: 85 32 cpi r24, 0x25 ; 37
1226: 39 f4 brne .+14 ; 0x1236 <vfprintf+0x50>
1228: 93 fd sbrc r25, 3
122a: 85 91 lpm r24, Z+
122c: 93 ff sbrs r25, 3
122e: 81 91 ld r24, Z+
1230: 6f 01 movw r12, r30
1232: 85 32 cpi r24, 0x25 ; 37
1234: 29 f4 brne .+10 ; 0x1240 <vfprintf+0x5a>
1236: b7 01 movw r22, r14
1238: 90 e0 ldi r25, 0x00 ; 0
123a: 0e 94 f7 0a call 0x15ee ; 0x15ee <fputc>
123e: e7 cf rjmp .-50 ; 0x120e <vfprintf+0x28>
1240: 51 2c mov r5, r1
1242: 31 2c mov r3, r1
1244: 20 e0 ldi r18, 0x00 ; 0
1246: 20 32 cpi r18, 0x20 ; 32
1248: a8 f4 brcc .+42 ; 0x1274 <vfprintf+0x8e>
124a: 8b 32 cpi r24, 0x2B ; 43
124c: 61 f0 breq .+24 ; 0x1266 <vfprintf+0x80>
124e: 28 f4 brcc .+10 ; 0x125a <vfprintf+0x74>
1250: 80 32 cpi r24, 0x20 ; 32
1252: 51 f0 breq .+20 ; 0x1268 <vfprintf+0x82>
1254: 83 32 cpi r24, 0x23 ; 35
1256: 71 f4 brne .+28 ; 0x1274 <vfprintf+0x8e>
1258: 0b c0 rjmp .+22 ; 0x1270 <vfprintf+0x8a>
125a: 8d 32 cpi r24, 0x2D ; 45
125c: 39 f0 breq .+14 ; 0x126c <vfprintf+0x86>
125e: 80 33 cpi r24, 0x30 ; 48
1260: 49 f4 brne .+18 ; 0x1274 <vfprintf+0x8e>
1262: 21 60 ori r18, 0x01 ; 1
1264: 2a c0 rjmp .+84 ; 0x12ba <vfprintf+0xd4>
1266: 22 60 ori r18, 0x02 ; 2
1268: 24 60 ori r18, 0x04 ; 4
126a: 27 c0 rjmp .+78 ; 0x12ba <vfprintf+0xd4>
126c: 28 60 ori r18, 0x08 ; 8
126e: 25 c0 rjmp .+74 ; 0x12ba <vfprintf+0xd4>
1270: 20 61 ori r18, 0x10 ; 16
1272: 23 c0 rjmp .+70 ; 0x12ba <vfprintf+0xd4>
1274: 27 fd sbrc r18, 7
1276: 29 c0 rjmp .+82 ; 0x12ca <vfprintf+0xe4>
1278: 38 2f mov r19, r24
127a: 30 53 subi r19, 0x30 ; 48
127c: 3a 30 cpi r19, 0x0A ; 10
127e: 88 f4 brcc .+34 ; 0x12a2 <vfprintf+0xbc>
1280: 26 ff sbrs r18, 6
1282: 07 c0 rjmp .+14 ; 0x1292 <vfprintf+0xac>
1284: 85 2d mov r24, r5
1286: 6a e0 ldi r22, 0x0A ; 10
1288: 0e 94 83 0b call 0x1706 ; 0x1706 <__mulqi3>
128c: 58 2e mov r5, r24
128e: 53 0e add r5, r19
1290: 14 c0 rjmp .+40 ; 0x12ba <vfprintf+0xd4>
1292: 83 2d mov r24, r3
1294: 6a e0 ldi r22, 0x0A ; 10
1296: 0e 94 83 0b call 0x1706 ; 0x1706 <__mulqi3>
129a: 38 2e mov r3, r24
129c: 33 0e add r3, r19
129e: 20 62 ori r18, 0x20 ; 32
12a0: 0c c0 rjmp .+24 ; 0x12ba <vfprintf+0xd4>
12a2: 8e 32 cpi r24, 0x2E ; 46
12a4: 21 f4 brne .+8 ; 0x12ae <vfprintf+0xc8>
12a6: 26 fd sbrc r18, 6
12a8: 71 c1 rjmp .+738 ; 0x158c <vfprintf+0x3a6>
12aa: 20 64 ori r18, 0x40 ; 64
12ac: 06 c0 rjmp .+12 ; 0x12ba <vfprintf+0xd4>
12ae: 8c 36 cpi r24, 0x6C ; 108
12b0: 11 f4 brne .+4 ; 0x12b6 <vfprintf+0xd0>
12b2: 20 68 ori r18, 0x80 ; 128
12b4: 02 c0 rjmp .+4 ; 0x12ba <vfprintf+0xd4>
12b6: 88 36 cpi r24, 0x68 ; 104
12b8: 41 f4 brne .+16 ; 0x12ca <vfprintf+0xe4>
12ba: f6 01 movw r30, r12
12bc: 93 fd sbrc r25, 3
12be: 85 91 lpm r24, Z+
12c0: 93 ff sbrs r25, 3
12c2: 81 91 ld r24, Z+
12c4: 6f 01 movw r12, r30
12c6: 81 11 cpse r24, r1
12c8: be cf rjmp .-132 ; 0x1246 <vfprintf+0x60>
12ca: 98 2f mov r25, r24
12cc: 95 54 subi r25, 0x45 ; 69
12ce: 93 30 cpi r25, 0x03 ; 3
12d0: 18 f0 brcs .+6 ; 0x12d8 <vfprintf+0xf2>
12d2: 90 52 subi r25, 0x20 ; 32
12d4: 93 30 cpi r25, 0x03 ; 3
12d6: 28 f4 brcc .+10 ; 0x12e2 <vfprintf+0xfc>
12d8: 0c 5f subi r16, 0xFC ; 252
12da: 1f 4f sbci r17, 0xFF ; 255
12dc: ff e3 ldi r31, 0x3F ; 63
12de: f9 83 std Y+1, r31 ; 0x01
12e0: 0d c0 rjmp .+26 ; 0x12fc <vfprintf+0x116>
12e2: 83 36 cpi r24, 0x63 ; 99
12e4: 31 f0 breq .+12 ; 0x12f2 <vfprintf+0x10c>
12e6: 83 37 cpi r24, 0x73 ; 115
12e8: 71 f0 breq .+28 ; 0x1306 <vfprintf+0x120>
12ea: 83 35 cpi r24, 0x53 ; 83
12ec: 09 f0 breq .+2 ; 0x12f0 <vfprintf+0x10a>
12ee: 5e c0 rjmp .+188 ; 0x13ac <vfprintf+0x1c6>
12f0: 23 c0 rjmp .+70 ; 0x1338 <vfprintf+0x152>
12f2: f8 01 movw r30, r16
12f4: 80 81 ld r24, Z
12f6: 89 83 std Y+1, r24 ; 0x01
12f8: 0e 5f subi r16, 0xFE ; 254
12fa: 1f 4f sbci r17, 0xFF ; 255
12fc: 44 24 eor r4, r4
12fe: 43 94 inc r4
1300: 51 2c mov r5, r1
1302: 54 01 movw r10, r8
1304: 15 c0 rjmp .+42 ; 0x1330 <vfprintf+0x14a>
1306: 38 01 movw r6, r16
1308: f2 e0 ldi r31, 0x02 ; 2
130a: 6f 0e add r6, r31
130c: 71 1c adc r7, r1
130e: f8 01 movw r30, r16
1310: a0 80 ld r10, Z
1312: b1 80 ldd r11, Z+1 ; 0x01
1314: 26 ff sbrs r18, 6
1316: 03 c0 rjmp .+6 ; 0x131e <vfprintf+0x138>
1318: 65 2d mov r22, r5
131a: 70 e0 ldi r23, 0x00 ; 0
131c: 02 c0 rjmp .+4 ; 0x1322 <vfprintf+0x13c>
131e: 6f ef ldi r22, 0xFF ; 255
1320: 7f ef ldi r23, 0xFF ; 255
1322: c5 01 movw r24, r10
1324: 2c 87 std Y+12, r18 ; 0x0c
1326: 0e 94 dc 0a call 0x15b8 ; 0x15b8 <strnlen>
132a: 2c 01 movw r4, r24
132c: 83 01 movw r16, r6
132e: 2c 85 ldd r18, Y+12 ; 0x0c
1330: 6f e7 ldi r22, 0x7F ; 127
1332: 26 2e mov r2, r22
1334: 22 22 and r2, r18
1336: 18 c0 rjmp .+48 ; 0x1368 <vfprintf+0x182>
1338: 38 01 movw r6, r16
133a: f2 e0 ldi r31, 0x02 ; 2
133c: 6f 0e add r6, r31
133e: 71 1c adc r7, r1
1340: f8 01 movw r30, r16
1342: a0 80 ld r10, Z
1344: b1 80 ldd r11, Z+1 ; 0x01
1346: 26 ff sbrs r18, 6
1348: 03 c0 rjmp .+6 ; 0x1350 <vfprintf+0x16a>
134a: 65 2d mov r22, r5
134c: 70 e0 ldi r23, 0x00 ; 0
134e: 02 c0 rjmp .+4 ; 0x1354 <vfprintf+0x16e>
1350: 6f ef ldi r22, 0xFF ; 255
1352: 7f ef ldi r23, 0xFF ; 255
1354: c5 01 movw r24, r10
1356: 2c 87 std Y+12, r18 ; 0x0c
1358: 0e 94 d1 0a call 0x15a2 ; 0x15a2 <strnlen_P>
135c: 2c 01 movw r4, r24
135e: 2c 85 ldd r18, Y+12 ; 0x0c
1360: 50 e8 ldi r21, 0x80 ; 128
1362: 25 2e mov r2, r21
1364: 22 2a or r2, r18
1366: 83 01 movw r16, r6
1368: 23 fc sbrc r2, 3
136a: 1c c0 rjmp .+56 ; 0x13a4 <vfprintf+0x1be>
136c: 06 c0 rjmp .+12 ; 0x137a <vfprintf+0x194>
136e: b7 01 movw r22, r14
1370: 80 e2 ldi r24, 0x20 ; 32
1372: 90 e0 ldi r25, 0x00 ; 0
1374: 0e 94 f7 0a call 0x15ee ; 0x15ee <fputc>
1378: 3a 94 dec r3
137a: 83 2d mov r24, r3
137c: 90 e0 ldi r25, 0x00 ; 0
137e: 48 16 cp r4, r24
1380: 59 06 cpc r5, r25
1382: a8 f3 brcs .-22 ; 0x136e <vfprintf+0x188>
1384: 0f c0 rjmp .+30 ; 0x13a4 <vfprintf+0x1be>
1386: f5 01 movw r30, r10
1388: 27 fc sbrc r2, 7
138a: 85 91 lpm r24, Z+
138c: 27 fe sbrs r2, 7
138e: 81 91 ld r24, Z+
1390: 5f 01 movw r10, r30
1392: b7 01 movw r22, r14
1394: 90 e0 ldi r25, 0x00 ; 0
1396: 0e 94 f7 0a call 0x15ee ; 0x15ee <fputc>
139a: 31 10 cpse r3, r1
139c: 3a 94 dec r3
139e: f1 e0 ldi r31, 0x01 ; 1
13a0: 4f 1a sub r4, r31
13a2: 51 08 sbc r5, r1
13a4: 41 14 cp r4, r1
13a6: 51 04 cpc r5, r1
13a8: 71 f7 brne .-36 ; 0x1386 <vfprintf+0x1a0>
13aa: ed c0 rjmp .+474 ; 0x1586 <vfprintf+0x3a0>
13ac: 84 36 cpi r24, 0x64 ; 100
13ae: 11 f0 breq .+4 ; 0x13b4 <vfprintf+0x1ce>
13b0: 89 36 cpi r24, 0x69 ; 105
13b2: 41 f5 brne .+80 ; 0x1404 <vfprintf+0x21e>
13b4: f8 01 movw r30, r16
13b6: 27 ff sbrs r18, 7
13b8: 07 c0 rjmp .+14 ; 0x13c8 <vfprintf+0x1e2>
13ba: 60 81 ld r22, Z
13bc: 71 81 ldd r23, Z+1 ; 0x01
13be: 82 81 ldd r24, Z+2 ; 0x02
13c0: 93 81 ldd r25, Z+3 ; 0x03
13c2: 0c 5f subi r16, 0xFC ; 252
13c4: 1f 4f sbci r17, 0xFF ; 255
13c6: 08 c0 rjmp .+16 ; 0x13d8 <vfprintf+0x1f2>
13c8: 60 81 ld r22, Z
13ca: 71 81 ldd r23, Z+1 ; 0x01
13cc: 88 27 eor r24, r24
13ce: 77 fd sbrc r23, 7
13d0: 80 95 com r24
13d2: 98 2f mov r25, r24
13d4: 0e 5f subi r16, 0xFE ; 254
13d6: 1f 4f sbci r17, 0xFF ; 255
13d8: 4f e6 ldi r20, 0x6F ; 111
13da: b4 2e mov r11, r20
13dc: b2 22 and r11, r18
13de: 97 ff sbrs r25, 7
13e0: 09 c0 rjmp .+18 ; 0x13f4 <vfprintf+0x20e>
13e2: 90 95 com r25
13e4: 80 95 com r24
13e6: 70 95 com r23
13e8: 61 95 neg r22
13ea: 7f 4f sbci r23, 0xFF ; 255
13ec: 8f 4f sbci r24, 0xFF ; 255
13ee: 9f 4f sbci r25, 0xFF ; 255
13f0: f0 e8 ldi r31, 0x80 ; 128
13f2: bf 2a or r11, r31
13f4: 2a e0 ldi r18, 0x0A ; 10
13f6: 30 e0 ldi r19, 0x00 ; 0
13f8: a4 01 movw r20, r8
13fa: 0e 94 23 0b call 0x1646 ; 0x1646 <__ultoa_invert>
13fe: a8 2e mov r10, r24
1400: a8 18 sub r10, r8
1402: 43 c0 rjmp .+134 ; 0x148a <vfprintf+0x2a4>
1404: 85 37 cpi r24, 0x75 ; 117
1406: 31 f4 brne .+12 ; 0x1414 <vfprintf+0x22e>
1408: 3f ee ldi r19, 0xEF ; 239
140a: b3 2e mov r11, r19
140c: b2 22 and r11, r18
140e: 2a e0 ldi r18, 0x0A ; 10
1410: 30 e0 ldi r19, 0x00 ; 0
1412: 24 c0 rjmp .+72 ; 0x145c <vfprintf+0x276>
1414: 99 ef ldi r25, 0xF9 ; 249
1416: b9 2e mov r11, r25
1418: b2 22 and r11, r18
141a: 8f 36 cpi r24, 0x6F ; 111
141c: b9 f0 breq .+46 ; 0x144c <vfprintf+0x266>
141e: 20 f4 brcc .+8 ; 0x1428 <vfprintf+0x242>
1420: 88 35 cpi r24, 0x58 ; 88
1422: 09 f0 breq .+2 ; 0x1426 <vfprintf+0x240>
1424: b3 c0 rjmp .+358 ; 0x158c <vfprintf+0x3a6>
1426: 0d c0 rjmp .+26 ; 0x1442 <vfprintf+0x25c>
1428: 80 37 cpi r24, 0x70 ; 112
142a: 21 f0 breq .+8 ; 0x1434 <vfprintf+0x24e>
142c: 88 37 cpi r24, 0x78 ; 120
142e: 09 f0 breq .+2 ; 0x1432 <vfprintf+0x24c>
1430: ad c0 rjmp .+346 ; 0x158c <vfprintf+0x3a6>
1432: 02 c0 rjmp .+4 ; 0x1438 <vfprintf+0x252>
1434: 20 e1 ldi r18, 0x10 ; 16
1436: b2 2a or r11, r18
1438: b4 fe sbrs r11, 4
143a: 0b c0 rjmp .+22 ; 0x1452 <vfprintf+0x26c>
143c: 84 e0 ldi r24, 0x04 ; 4
143e: b8 2a or r11, r24
1440: 08 c0 rjmp .+16 ; 0x1452 <vfprintf+0x26c>
1442: 24 ff sbrs r18, 4
1444: 09 c0 rjmp .+18 ; 0x1458 <vfprintf+0x272>
1446: e6 e0 ldi r30, 0x06 ; 6
1448: be 2a or r11, r30
144a: 06 c0 rjmp .+12 ; 0x1458 <vfprintf+0x272>
144c: 28 e0 ldi r18, 0x08 ; 8
144e: 30 e0 ldi r19, 0x00 ; 0
1450: 05 c0 rjmp .+10 ; 0x145c <vfprintf+0x276>
1452: 20 e1 ldi r18, 0x10 ; 16
1454: 30 e0 ldi r19, 0x00 ; 0
1456: 02 c0 rjmp .+4 ; 0x145c <vfprintf+0x276>
1458: 20 e1 ldi r18, 0x10 ; 16
145a: 32 e0 ldi r19, 0x02 ; 2
145c: f8 01 movw r30, r16
145e: b7 fe sbrs r11, 7
1460: 07 c0 rjmp .+14 ; 0x1470 <vfprintf+0x28a>
1462: 60 81 ld r22, Z
1464: 71 81 ldd r23, Z+1 ; 0x01
1466: 82 81 ldd r24, Z+2 ; 0x02
1468: 93 81 ldd r25, Z+3 ; 0x03
146a: 0c 5f subi r16, 0xFC ; 252
146c: 1f 4f sbci r17, 0xFF ; 255
146e: 06 c0 rjmp .+12 ; 0x147c <vfprintf+0x296>
1470: 60 81 ld r22, Z
1472: 71 81 ldd r23, Z+1 ; 0x01
1474: 80 e0 ldi r24, 0x00 ; 0
1476: 90 e0 ldi r25, 0x00 ; 0
1478: 0e 5f subi r16, 0xFE ; 254
147a: 1f 4f sbci r17, 0xFF ; 255
147c: a4 01 movw r20, r8
147e: 0e 94 23 0b call 0x1646 ; 0x1646 <__ultoa_invert>
1482: a8 2e mov r10, r24
1484: a8 18 sub r10, r8
1486: ff e7 ldi r31, 0x7F ; 127
1488: bf 22 and r11, r31
148a: b6 fe sbrs r11, 6
148c: 0b c0 rjmp .+22 ; 0x14a4 <vfprintf+0x2be>
148e: 2b 2d mov r18, r11
1490: 2e 7f andi r18, 0xFE ; 254
1492: a5 14 cp r10, r5
1494: 50 f4 brcc .+20 ; 0x14aa <vfprintf+0x2c4>
1496: b4 fe sbrs r11, 4
1498: 0a c0 rjmp .+20 ; 0x14ae <vfprintf+0x2c8>
149a: b2 fc sbrc r11, 2
149c: 08 c0 rjmp .+16 ; 0x14ae <vfprintf+0x2c8>
149e: 2b 2d mov r18, r11
14a0: 2e 7e andi r18, 0xEE ; 238
14a2: 05 c0 rjmp .+10 ; 0x14ae <vfprintf+0x2c8>
14a4: 7a 2c mov r7, r10
14a6: 2b 2d mov r18, r11
14a8: 03 c0 rjmp .+6 ; 0x14b0 <vfprintf+0x2ca>
14aa: 7a 2c mov r7, r10
14ac: 01 c0 rjmp .+2 ; 0x14b0 <vfprintf+0x2ca>
14ae: 75 2c mov r7, r5
14b0: 24 ff sbrs r18, 4
14b2: 0d c0 rjmp .+26 ; 0x14ce <vfprintf+0x2e8>
14b4: fe 01 movw r30, r28
14b6: ea 0d add r30, r10
14b8: f1 1d adc r31, r1
14ba: 80 81 ld r24, Z
14bc: 80 33 cpi r24, 0x30 ; 48
14be: 11 f4 brne .+4 ; 0x14c4 <vfprintf+0x2de>
14c0: 29 7e andi r18, 0xE9 ; 233
14c2: 09 c0 rjmp .+18 ; 0x14d6 <vfprintf+0x2f0>
14c4: 22 ff sbrs r18, 2
14c6: 06 c0 rjmp .+12 ; 0x14d4 <vfprintf+0x2ee>
14c8: 73 94 inc r7
14ca: 73 94 inc r7
14cc: 04 c0 rjmp .+8 ; 0x14d6 <vfprintf+0x2f0>
14ce: 82 2f mov r24, r18
14d0: 86 78 andi r24, 0x86 ; 134
14d2: 09 f0 breq .+2 ; 0x14d6 <vfprintf+0x2f0>
14d4: 73 94 inc r7
14d6: 23 fd sbrc r18, 3
14d8: 14 c0 rjmp .+40 ; 0x1502 <vfprintf+0x31c>
14da: 20 ff sbrs r18, 0
14dc: 0f c0 rjmp .+30 ; 0x14fc <vfprintf+0x316>
14de: 5a 2c mov r5, r10
14e0: 73 14 cp r7, r3
14e2: 60 f4 brcc .+24 ; 0x14fc <vfprintf+0x316>
14e4: 53 0c add r5, r3
14e6: 57 18 sub r5, r7
14e8: 73 2c mov r7, r3
14ea: 08 c0 rjmp .+16 ; 0x14fc <vfprintf+0x316>
14ec: b7 01 movw r22, r14
14ee: 80 e2 ldi r24, 0x20 ; 32
14f0: 90 e0 ldi r25, 0x00 ; 0
14f2: 2c 87 std Y+12, r18 ; 0x0c
14f4: 0e 94 f7 0a call 0x15ee ; 0x15ee <fputc>
14f8: 73 94 inc r7
14fa: 2c 85 ldd r18, Y+12 ; 0x0c
14fc: 73 14 cp r7, r3
14fe: b0 f3 brcs .-20 ; 0x14ec <vfprintf+0x306>
1500: 04 c0 rjmp .+8 ; 0x150a <vfprintf+0x324>
1502: 73 14 cp r7, r3
1504: 10 f4 brcc .+4 ; 0x150a <vfprintf+0x324>
1506: 37 18 sub r3, r7
1508: 01 c0 rjmp .+2 ; 0x150c <vfprintf+0x326>
150a: 31 2c mov r3, r1
150c: 24 ff sbrs r18, 4
150e: 12 c0 rjmp .+36 ; 0x1534 <vfprintf+0x34e>
1510: b7 01 movw r22, r14
1512: 80 e3 ldi r24, 0x30 ; 48
1514: 90 e0 ldi r25, 0x00 ; 0
1516: 2c 87 std Y+12, r18 ; 0x0c
1518: 0e 94 f7 0a call 0x15ee ; 0x15ee <fputc>
151c: 2c 85 ldd r18, Y+12 ; 0x0c
151e: 22 ff sbrs r18, 2
1520: 1e c0 rjmp .+60 ; 0x155e <vfprintf+0x378>
1522: 21 ff sbrs r18, 1
1524: 03 c0 rjmp .+6 ; 0x152c <vfprintf+0x346>
1526: 88 e5 ldi r24, 0x58 ; 88
1528: 90 e0 ldi r25, 0x00 ; 0
152a: 02 c0 rjmp .+4 ; 0x1530 <vfprintf+0x34a>
152c: 88 e7 ldi r24, 0x78 ; 120
152e: 90 e0 ldi r25, 0x00 ; 0
1530: b7 01 movw r22, r14
1532: 0c c0 rjmp .+24 ; 0x154c <vfprintf+0x366>
1534: 82 2f mov r24, r18
1536: 86 78 andi r24, 0x86 ; 134
1538: 91 f0 breq .+36 ; 0x155e <vfprintf+0x378>
153a: 21 fd sbrc r18, 1
153c: 02 c0 rjmp .+4 ; 0x1542 <vfprintf+0x35c>
153e: 80 e2 ldi r24, 0x20 ; 32
1540: 01 c0 rjmp .+2 ; 0x1544 <vfprintf+0x35e>
1542: 8b e2 ldi r24, 0x2B ; 43
1544: 27 fd sbrc r18, 7
1546: 8d e2 ldi r24, 0x2D ; 45
1548: b7 01 movw r22, r14
154a: 90 e0 ldi r25, 0x00 ; 0
154c: 0e 94 f7 0a call 0x15ee ; 0x15ee <fputc>
1550: 06 c0 rjmp .+12 ; 0x155e <vfprintf+0x378>
1552: b7 01 movw r22, r14
1554: 80 e3 ldi r24, 0x30 ; 48
1556: 90 e0 ldi r25, 0x00 ; 0
1558: 0e 94 f7 0a call 0x15ee ; 0x15ee <fputc>
155c: 5a 94 dec r5
155e: a5 14 cp r10, r5
1560: c0 f3 brcs .-16 ; 0x1552 <vfprintf+0x36c>
1562: aa 94 dec r10
1564: f4 01 movw r30, r8
1566: ea 0d add r30, r10
1568: f1 1d adc r31, r1
156a: b7 01 movw r22, r14
156c: 80 81 ld r24, Z
156e: 90 e0 ldi r25, 0x00 ; 0
1570: 0e 94 f7 0a call 0x15ee ; 0x15ee <fputc>
1574: a1 10 cpse r10, r1
1576: f5 cf rjmp .-22 ; 0x1562 <vfprintf+0x37c>
1578: 06 c0 rjmp .+12 ; 0x1586 <vfprintf+0x3a0>
157a: b7 01 movw r22, r14
157c: 80 e2 ldi r24, 0x20 ; 32
157e: 90 e0 ldi r25, 0x00 ; 0
1580: 0e 94 f7 0a call 0x15ee ; 0x15ee <fputc>
1584: 3a 94 dec r3
1586: 31 10 cpse r3, r1
1588: f8 cf rjmp .-16 ; 0x157a <vfprintf+0x394>
158a: 41 ce rjmp .-894 ; 0x120e <vfprintf+0x28>
158c: f7 01 movw r30, r14
158e: 26 81 ldd r18, Z+6 ; 0x06
1590: 37 81 ldd r19, Z+7 ; 0x07
1592: 02 c0 rjmp .+4 ; 0x1598 <vfprintf+0x3b2>
1594: 2f ef ldi r18, 0xFF ; 255
1596: 3f ef ldi r19, 0xFF ; 255
1598: c9 01 movw r24, r18
159a: 2c 96 adiw r28, 0x0c ; 12
159c: e2 e1 ldi r30, 0x12 ; 18
159e: 0c 94 de 0b jmp 0x17bc ; 0x17bc <__epilogue_restores__>
000015a2 <strnlen_P>:
15a2: fc 01 movw r30, r24
15a4: 05 90 lpm r0, Z+
15a6: 61 50 subi r22, 0x01 ; 1
15a8: 70 40 sbci r23, 0x00 ; 0
15aa: 01 10 cpse r0, r1
15ac: d8 f7 brcc .-10 ; 0x15a4 <strnlen_P+0x2>
15ae: 80 95 com r24
15b0: 90 95 com r25
15b2: 8e 0f add r24, r30
15b4: 9f 1f adc r25, r31
15b6: 08 95 ret
000015b8 <strnlen>:
15b8: fc 01 movw r30, r24
15ba: 61 50 subi r22, 0x01 ; 1
15bc: 70 40 sbci r23, 0x00 ; 0
15be: 01 90 ld r0, Z+
15c0: 01 10 cpse r0, r1
15c2: d8 f7 brcc .-10 ; 0x15ba <strnlen+0x2>
15c4: 80 95 com r24
15c6: 90 95 com r25
15c8: 8e 0f add r24, r30
15ca: 9f 1f adc r25, r31
15cc: 08 95 ret
000015ce <strrev>:
15ce: dc 01 movw r26, r24
15d0: fc 01 movw r30, r24
15d2: 67 2f mov r22, r23
15d4: 71 91 ld r23, Z+
15d6: 77 23 and r23, r23
15d8: e1 f7 brne .-8 ; 0x15d2 <strrev+0x4>
15da: 32 97 sbiw r30, 0x02 ; 2
15dc: 04 c0 rjmp .+8 ; 0x15e6 <strrev+0x18>
15de: 7c 91 ld r23, X
15e0: 6d 93 st X+, r22
15e2: 70 83 st Z, r23
15e4: 62 91 ld r22, -Z
15e6: ae 17 cp r26, r30
15e8: bf 07 cpc r27, r31
15ea: c8 f3 brcs .-14 ; 0x15de <strrev+0x10>
15ec: 08 95 ret
000015ee <fputc>:
15ee: 0f 93 push r16
15f0: 1f 93 push r17
15f2: cf 93 push r28
15f4: df 93 push r29
15f6: 8c 01 movw r16, r24
15f8: eb 01 movw r28, r22
15fa: 8b 81 ldd r24, Y+3 ; 0x03
15fc: 81 fd sbrc r24, 1
15fe: 03 c0 rjmp .+6 ; 0x1606 <fputc+0x18>
1600: 0f ef ldi r16, 0xFF ; 255
1602: 1f ef ldi r17, 0xFF ; 255
1604: 1a c0 rjmp .+52 ; 0x163a <fputc+0x4c>
1606: 82 ff sbrs r24, 2
1608: 0d c0 rjmp .+26 ; 0x1624 <fputc+0x36>
160a: 2e 81 ldd r18, Y+6 ; 0x06
160c: 3f 81 ldd r19, Y+7 ; 0x07
160e: 8c 81 ldd r24, Y+4 ; 0x04
1610: 9d 81 ldd r25, Y+5 ; 0x05
1612: 28 17 cp r18, r24
1614: 39 07 cpc r19, r25
1616: 64 f4 brge .+24 ; 0x1630 <fputc+0x42>
1618: e8 81 ld r30, Y
161a: f9 81 ldd r31, Y+1 ; 0x01
161c: 01 93 st Z+, r16
161e: f9 83 std Y+1, r31 ; 0x01
1620: e8 83 st Y, r30
1622: 06 c0 rjmp .+12 ; 0x1630 <fputc+0x42>
1624: e8 85 ldd r30, Y+8 ; 0x08
1626: f9 85 ldd r31, Y+9 ; 0x09
1628: 80 2f mov r24, r16
162a: 09 95 icall
162c: 89 2b or r24, r25
162e: 41 f7 brne .-48 ; 0x1600 <fputc+0x12>
1630: 8e 81 ldd r24, Y+6 ; 0x06
1632: 9f 81 ldd r25, Y+7 ; 0x07
1634: 01 96 adiw r24, 0x01 ; 1
1636: 9f 83 std Y+7, r25 ; 0x07
1638: 8e 83 std Y+6, r24 ; 0x06
163a: c8 01 movw r24, r16
163c: df 91 pop r29
163e: cf 91 pop r28
1640: 1f 91 pop r17
1642: 0f 91 pop r16
1644: 08 95 ret
00001646 <__ultoa_invert>:
1646: fa 01 movw r30, r20
1648: aa 27 eor r26, r26
164a: 28 30 cpi r18, 0x08 ; 8
164c: 61 f1 breq .+88 ; 0x16a6 <__ultoa_invert+0x60>
164e: 20 31 cpi r18, 0x10 ; 16
1650: 91 f1 breq .+100 ; 0x16b6 <__ultoa_invert+0x70>
1652: e8 94 clt
1654: 6f 93 push r22
1656: 6e 7f andi r22, 0xFE ; 254
1658: 6e 5f subi r22, 0xFE ; 254
165a: 7f 4f sbci r23, 0xFF ; 255
165c: 8f 4f sbci r24, 0xFF ; 255
165e: 9f 4f sbci r25, 0xFF ; 255
1660: af 4f sbci r26, 0xFF ; 255
1662: b1 e0 ldi r27, 0x01 ; 1
1664: 40 d0 rcall .+128 ; 0x16e6 <__ultoa_invert+0xa0>
1666: b4 e0 ldi r27, 0x04 ; 4
1668: 3e d0 rcall .+124 ; 0x16e6 <__ultoa_invert+0xa0>
166a: 67 0f add r22, r23
166c: 78 1f adc r23, r24
166e: 89 1f adc r24, r25
1670: 9a 1f adc r25, r26
1672: a1 1d adc r26, r1
1674: 68 0f add r22, r24
1676: 79 1f adc r23, r25
1678: 8a 1f adc r24, r26
167a: 91 1d adc r25, r1
167c: a1 1d adc r26, r1
167e: 6a 0f add r22, r26
1680: 71 1d adc r23, r1
1682: 81 1d adc r24, r1
1684: 91 1d adc r25, r1
1686: a1 1d adc r26, r1
1688: 22 d0 rcall .+68 ; 0x16ce <__ultoa_invert+0x88>
168a: 09 f4 brne .+2 ; 0x168e <__ultoa_invert+0x48>
168c: 68 94 set
168e: 3f 91 pop r19
1690: 06 2e mov r0, r22
1692: 00 0c add r0, r0
1694: 30 19 sub r19, r0
1696: 00 0c add r0, r0
1698: 00 0c add r0, r0
169a: 30 19 sub r19, r0
169c: 30 5d subi r19, 0xD0 ; 208
169e: 31 93 st Z+, r19
16a0: ce f6 brtc .-78 ; 0x1654 <__ultoa_invert+0xe>
16a2: cf 01 movw r24, r30
16a4: 08 95 ret
16a6: 46 2f mov r20, r22
16a8: 47 70 andi r20, 0x07 ; 7
16aa: 40 5d subi r20, 0xD0 ; 208
16ac: 41 93 st Z+, r20
16ae: b3 e0 ldi r27, 0x03 ; 3
16b0: 0f d0 rcall .+30 ; 0x16d0 <__ultoa_invert+0x8a>
16b2: c9 f7 brne .-14 ; 0x16a6 <__ultoa_invert+0x60>
16b4: f6 cf rjmp .-20 ; 0x16a2 <__ultoa_invert+0x5c>
16b6: 46 2f mov r20, r22
16b8: 4f 70 andi r20, 0x0F ; 15
16ba: 40 5d subi r20, 0xD0 ; 208
16bc: 4a 33 cpi r20, 0x3A ; 58
16be: 18 f0 brcs .+6 ; 0x16c6 <__ultoa_invert+0x80>
16c0: 49 5d subi r20, 0xD9 ; 217
16c2: 31 fd sbrc r19, 1
16c4: 40 52 subi r20, 0x20 ; 32
16c6: 41 93 st Z+, r20
16c8: 02 d0 rcall .+4 ; 0x16ce <__ultoa_invert+0x88>
16ca: a9 f7 brne .-22 ; 0x16b6 <__ultoa_invert+0x70>
16cc: ea cf rjmp .-44 ; 0x16a2 <__ultoa_invert+0x5c>
16ce: b4 e0 ldi r27, 0x04 ; 4
16d0: a6 95 lsr r26
16d2: 97 95 ror r25
16d4: 87 95 ror r24
16d6: 77 95 ror r23
16d8: 67 95 ror r22
16da: ba 95 dec r27
16dc: c9 f7 brne .-14 ; 0x16d0 <__ultoa_invert+0x8a>
16de: 00 97 sbiw r24, 0x00 ; 0
16e0: 61 05 cpc r22, r1
16e2: 71 05 cpc r23, r1
16e4: 08 95 ret
16e6: 9b 01 movw r18, r22
16e8: ac 01 movw r20, r24
16ea: 0a 2e mov r0, r26
16ec: 06 94 lsr r0
16ee: 57 95 ror r21
16f0: 47 95 ror r20
16f2: 37 95 ror r19
16f4: 27 95 ror r18
16f6: ba 95 dec r27
16f8: c9 f7 brne .-14 ; 0x16ec <__ultoa_invert+0xa6>
16fa: 62 0f add r22, r18
16fc: 73 1f adc r23, r19
16fe: 84 1f adc r24, r20
1700: 95 1f adc r25, r21
1702: a0 1d adc r26, r0
1704: 08 95 ret
00001706 <__mulqi3>:
1706: 00 24 eor r0, r0
00001708 <__mulqi3_loop>:
1708: 80 fd sbrc r24, 0
170a: 06 0e add r0, r22
170c: 66 0f add r22, r22
170e: 11 f0 breq .+4 ; 0x1714 <__mulqi3_exit>
1710: 86 95 lsr r24
1712: d1 f7 brne .-12 ; 0x1708 <__mulqi3_loop>
00001714 <__mulqi3_exit>:
1714: 80 2d mov r24, r0
1716: 08 95 ret
00001718 <__udivmodhi4>:
1718: aa 1b sub r26, r26
171a: bb 1b sub r27, r27
171c: 51 e1 ldi r21, 0x11 ; 17
171e: 07 c0 rjmp .+14 ; 0x172e <__udivmodhi4_ep>
00001720 <__udivmodhi4_loop>:
1720: aa 1f adc r26, r26
1722: bb 1f adc r27, r27
1724: a6 17 cp r26, r22
1726: b7 07 cpc r27, r23
1728: 10 f0 brcs .+4 ; 0x172e <__udivmodhi4_ep>
172a: a6 1b sub r26, r22
172c: b7 0b sbc r27, r23
0000172e <__udivmodhi4_ep>:
172e: 88 1f adc r24, r24
1730: 99 1f adc r25, r25
1732: 5a 95 dec r21
1734: a9 f7 brne .-22 ; 0x1720 <__udivmodhi4_loop>
1736: 80 95 com r24
1738: 90 95 com r25
173a: bc 01 movw r22, r24
173c: cd 01 movw r24, r26
173e: 08 95 ret
00001740 <__udivmodsi4>:
1740: a1 e2 ldi r26, 0x21 ; 33
1742: 1a 2e mov r1, r26
1744: aa 1b sub r26, r26
1746: bb 1b sub r27, r27
1748: fd 01 movw r30, r26
174a: 0d c0 rjmp .+26 ; 0x1766 <__udivmodsi4_ep>
0000174c <__udivmodsi4_loop>:
174c: aa 1f adc r26, r26
174e: bb 1f adc r27, r27
1750: ee 1f adc r30, r30
1752: ff 1f adc r31, r31
1754: a2 17 cp r26, r18
1756: b3 07 cpc r27, r19
1758: e4 07 cpc r30, r20
175a: f5 07 cpc r31, r21
175c: 20 f0 brcs .+8 ; 0x1766 <__udivmodsi4_ep>
175e: a2 1b sub r26, r18
1760: b3 0b sbc r27, r19
1762: e4 0b sbc r30, r20
1764: f5 0b sbc r31, r21
00001766 <__udivmodsi4_ep>:
1766: 66 1f adc r22, r22
1768: 77 1f adc r23, r23
176a: 88 1f adc r24, r24
176c: 99 1f adc r25, r25
176e: 1a 94 dec r1
1770: 69 f7 brne .-38 ; 0x174c <__udivmodsi4_loop>
1772: 60 95 com r22
1774: 70 95 com r23
1776: 80 95 com r24
1778: 90 95 com r25
177a: 9b 01 movw r18, r22
177c: ac 01 movw r20, r24
177e: bd 01 movw r22, r26
1780: cf 01 movw r24, r30
1782: 08 95 ret
00001784 <__prologue_saves__>:
1784: 2f 92 push r2
1786: 3f 92 push r3
1788: 4f 92 push r4
178a: 5f 92 push r5
178c: 6f 92 push r6
178e: 7f 92 push r7
1790: 8f 92 push r8
1792: 9f 92 push r9
1794: af 92 push r10
1796: bf 92 push r11
1798: cf 92 push r12
179a: df 92 push r13
179c: ef 92 push r14
179e: ff 92 push r15
17a0: 0f 93 push r16
17a2: 1f 93 push r17
17a4: cf 93 push r28
17a6: df 93 push r29
17a8: cd b7 in r28, 0x3d ; 61
17aa: de b7 in r29, 0x3e ; 62
17ac: ca 1b sub r28, r26
17ae: db 0b sbc r29, r27
17b0: 0f b6 in r0, 0x3f ; 63
17b2: f8 94 cli
17b4: de bf out 0x3e, r29 ; 62
17b6: 0f be out 0x3f, r0 ; 63
17b8: cd bf out 0x3d, r28 ; 61
17ba: 09 94 ijmp
000017bc <__epilogue_restores__>:
17bc: 2a 88 ldd r2, Y+18 ; 0x12
17be: 39 88 ldd r3, Y+17 ; 0x11
17c0: 48 88 ldd r4, Y+16 ; 0x10
17c2: 5f 84 ldd r5, Y+15 ; 0x0f
17c4: 6e 84 ldd r6, Y+14 ; 0x0e
17c6: 7d 84 ldd r7, Y+13 ; 0x0d
17c8: 8c 84 ldd r8, Y+12 ; 0x0c
17ca: 9b 84 ldd r9, Y+11 ; 0x0b
17cc: aa 84 ldd r10, Y+10 ; 0x0a
17ce: b9 84 ldd r11, Y+9 ; 0x09
17d0: c8 84 ldd r12, Y+8 ; 0x08
17d2: df 80 ldd r13, Y+7 ; 0x07
17d4: ee 80 ldd r14, Y+6 ; 0x06
17d6: fd 80 ldd r15, Y+5 ; 0x05
17d8: 0c 81 ldd r16, Y+4 ; 0x04
17da: 1b 81 ldd r17, Y+3 ; 0x03
17dc: aa 81 ldd r26, Y+2 ; 0x02
17de: b9 81 ldd r27, Y+1 ; 0x01
17e0: ce 0f add r28, r30
17e2: d1 1d adc r29, r1
17e4: 0f b6 in r0, 0x3f ; 63
17e6: f8 94 cli
17e8: de bf out 0x3e, r29 ; 62
17ea: 0f be out 0x3f, r0 ; 63
17ec: cd bf out 0x3d, r28 ; 61
17ee: ed 01 movw r28, r26
17f0: 08 95 ret
000017f2 <_exit>:
17f2: f8 94 cli
000017f4 <__stop_program>:
17f4: ff cf rjmp .-2 ; 0x17f4 <__stop_program>