From efe5e4bd6135c579cfd45418527e9b403c6a2863 Mon Sep 17 00:00:00 2001 From: Michael Wiebusch Date: Sun, 20 Oct 2013 15:36:57 +0200 Subject: [PATCH] cnc working with touchpad and usb interface, which is not perfect yet, no global coordinates in mm yet --- firmware/USBtoSerial.c | 293 +- firmware/USBtoSerial.c~ | 291 +- firmware/USBtoSerial.elf | Bin 152063 -> 157357 bytes firmware/USBtoSerial.hex | 820 +++--- firmware/USBtoSerial.lss | 6020 +++++++++++++++++++++----------------- firmware/USBtoSerial.map | 900 +++--- firmware/USBtoSerial.o | Bin 47588 -> 58600 bytes firmware/USBtoSerial.sym | 259 +- firmware/pins.h~ | 5 +- 9 files changed, 4826 insertions(+), 3762 deletions(-) diff --git a/firmware/USBtoSerial.c b/firmware/USBtoSerial.c index 43d1620..e5b7451 100644 --- a/firmware/USBtoSerial.c +++ b/firmware/USBtoSerial.c @@ -35,12 +35,17 @@ */ #define F_CPU 16e6 +#include +#include #include "USBtoSerial.h" #include #include "TM1001A.c" // #include "rfm70.c" #include "pins.h" +int16_t plate_pos_x = 0,plate_pos_y = 0; +char stringbuffer[16]; + /** Circular buffer to hold data from the host before it is sent to the device via the serial port. */ static RingBuffer_t USBtoUSART_Buffer; @@ -130,11 +135,11 @@ void Usb2SerialTask(void) { } /* Load the next byte from the USART transmit buffer into the USART */ - if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) { - Serial_SendByte(RingBuffer_Remove(&USBtoUSART_Buffer)); +// if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) { +// Serial_SendByte(RingBuffer_Remove(&USBtoUSART_Buffer)); // dummy = RingBuffer_Remove(&USBtoUSART_Buffer); // sendPayload(&dummy,1,0); - } +// } CDC_Device_USBTask(&VirtualSerial_CDC_Interface); USB_USBTask(); @@ -280,6 +285,28 @@ void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) { } +int8_t sign(int16_t x) { + return (x > 0) - (x < 0); +} + + +void uart_print_number(uint32_t zahl, uint8_t no_digits) { + my_uitoa(abs(zahl),stringbuffer,no_digits); + uart_puts(stringbuffer); + +} +void uart_print_signed_number(uint32_t zahl, uint8_t no_digits) { + my_uitoa(abs(zahl),stringbuffer,no_digits); + if (sign(zahl) < 0) { + uart_putc('-'); + } else { + uart_putc('+'); + } + uart_puts(stringbuffer); + +} + + /** Main program entry point. This routine contains the overall program flow, including initial * setup of all components and the main program loop. */ @@ -359,29 +386,207 @@ uint8_t motor_step(uint8_t motor, int8_t direction) { // motor: M1 or M2, direct } -int8_t sign(int16_t x) { - return (x > 0) - (x < 0); + +uint32_t times_ten_pow(uint8_t exponent) { + uint32_t val = 1; + for (uint8_t i = 1; i <= exponent; i++) { + val *= 10; + } + return val; } -void move_plate(int16_t dx, int16_t dy){ + + +uint8_t move_plate(int16_t dx, int16_t dy){ static int16_t todo_x,todo_y = 0; int8_t signum; + uint8_t returnval = 0; todo_x += dx; todo_y += dy; signum = sign(todo_x); + if(signum != 0) { + returnval++; + } motor_step(X,signum); todo_x -= signum; signum = sign(todo_y); + if(signum != 0) { + returnval++; + } motor_step(Y,signum); todo_y -= signum; + return returnval; // busy } +void pos_report(void){ + uart_puts("x_pos: "); + uart_print_signed_number(plate_pos_x,6); +// my_uitoa(plate_pos_x, stringbuffer, 6); +// uart_puts(stringbuffer); + uart_puts(" y_pos: "); + uart_print_signed_number(plate_pos_y,6); + uart_puts("\r"); +} +#define POSITION 0 +#define GOTO 1 +#define MOVEREL 2 +#define SETZERO 3 + +void parse_command(void){ + + + static char cmdbuffer[16]; + static char numbuffer[16]; + static uint16_t predot = 0,postdot = 0; + static uint8_t cmdPos, curCmdLen, num_start = 0, nums_found = 0; + uint8_t action=0,axis=0; + int8_t num_sign = 1; + char byte; + + /* Load the next byte from the USART transmit buffer into the USART */ + if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) { + byte = RingBuffer_Remove(&USBtoUSART_Buffer); + + if (byte == '\r' || byte == '\n') {// end of command, evaluate cemmand! + uart_puts("\r\n"); + cmdbuffer[cmdPos] = '\0'; // terminate new command string + curCmdLen = cmdPos; + cmdPos = 0; + + + if (cmdbuffer[0] == 'g' || cmdbuffer[0] == 'G') { // goto command + action = GOTO; + } else if ( cmdbuffer[0] == 'm' || cmdbuffer[0] == 'M') { + action = MOVEREL; + } else if ( cmdbuffer[0] == 'z' || cmdbuffer[0] == 'Z' ) { + action = SETZERO; + } else { + action = POSITION; + } + + if (cmdbuffer[1] == 'x' || cmdbuffer[1] == 'X') { + axis = X; + } else if (cmdbuffer[1] == 'y' || cmdbuffer[1] == 'Y') { + axis = Y; + } + + // if you expect coordinate, parse number! + if (action == GOTO || action == MOVEREL){ + + predot = 0; + postdot = 0; + num_sign = 1; + num_start = 0; + nums_found = 0; + + for (uint8_t i=2; i<=curCmdLen; i++) { + if ( num_start == 0 && cmdbuffer[i] == '-' ) { // if you find a minus before + // you find a digit, it's a negative number + num_sign = -1; + } + + if ( cmdbuffer[i] >= 48 && cmdbuffer[i] <= 57 ){ // is it a number? + if ( num_start == 0) { // this is the first digit in the string + num_start = i; + } + } else { // no digit! + if ( num_start != 0) { // digits have been found before + strncpy(numbuffer,cmdbuffer+num_start,i-num_start); // copy number found to + // numbuffer + numbuffer[i-num_start] = '\0'; // make sure it's always a terminated string + nums_found++; + if(nums_found == 1) { // its the predot digits + predot = atoi(numbuffer); + } else { // its the postdot digits + uint8_t postdotlen = i-num_start; + if (postdotlen < 3){ // if too small ,fill with zeros + for( uint8_t j = postdotlen; j <=2; j++) { + numbuffer[j] = '0'; + } + } + // crop the number to three post dot digits + numbuffer[3] = '\0'; + + postdot = atoi(numbuffer); + } + num_start = 0; + } + } + } + + } + + int16_t steps = 0,dest=0; + + switch (action) { + case GOTO: + uart_puts("GOTO "); + uart_putc(88+axis);// x or y + uart_print_signed_number(predot*num_sign,3); + uart_putc('.'); + uart_print_number(postdot,3); + uart_puts("\r\n"); + + dest = num_sign *( predot*24 +(postdot*10)/416); + + if (axis == X) { + steps = dest - plate_pos_x; + move_plate(steps,0); + plate_pos_x += steps; + } else if (axis == Y) { + steps = dest - plate_pos_y; + move_plate(0,steps); + plate_pos_y += steps; + } + pos_report(); + + break; + case MOVEREL: + uart_puts("MOVE "); + uart_putc(88+axis);// x or y + uart_print_signed_number(predot*num_sign,3); + uart_putc('.'); + uart_print_number(postdot,3); + uart_puts("\r\n"); + + steps = num_sign *( predot*24 +(postdot*10)/416); + + if (axis == X) { + move_plate(steps,0); + plate_pos_x += steps; + } else if (axis == Y) { + move_plate(0,steps); + plate_pos_y += steps; + } + pos_report(); + break; + + case SETZERO: + plate_pos_x = 0; + plate_pos_y = 0; + pos_report(); + break; + + case POSITION: + pos_report(); + break; + + } + + + + } else { // queue command + cmdbuffer[cmdPos++] = byte; + uart_putc(byte); + } + } +} int main(void) { @@ -405,55 +610,18 @@ int main(void) sei(); -// setup rfm70 transceiver - -// Begin(); -// -// setMode(0);// set mode t -// setChannel(8); -// _delay_ms(1000); -// sendPayload("eins",4, 0); -// _delay_ms(1000); - -// end uint16_t loopcounter=0; - char stringbuffer[16]; - - touchpad_set_abs_mode();// tell the touchpad you want to use it in the "absolute mode" - while (1) { - break; // goto next mode - Usb2SerialTask(); - loopcounter++; - if(loopcounter< 2000) { - continue; - } - loopcounter=0; - touchpad_read(); // read data from the touchpad - uart_puts("x_pos: "); - my_uitoa(x_abs(),stringbuffer,4);// x_abs returns current x position of your finger - uart_puts(stringbuffer); - uart_puts(" y_pos: "); - my_uitoa(y_abs(),stringbuffer,4);// y_abs returns current y position of your finger - uart_puts(stringbuffer); - uart_puts(" z_pressure: ");// z_pressure returns current "pressure" (contact area) of your finger - my_uitoa(z_pressure(),stringbuffer,4); - uart_puts(stringbuffer); - uart_puts("\r"); - } - // end of absolute mode demo block -// -// #elif DEMO_MODE == RELATIVE_MODE -// begin of relative mode demo block uart_puts("you selected the relative position demo modus:\n\r"); touchpad_set_rel_mode_100dpi();// use touchpad in relative mode // touchpad_set_rel_mode_200dpi(); // uncomment this line if you want double resolution - uint8_t x, y = 0; + int16_t x, y = 0; int8_t dx, dy = 0; + uint8_t busy = 0, last_busy = 0; while (1) { @@ -463,40 +631,27 @@ int main(void) // continue; // } // loopcounter=0; - + parse_command(); // read data from virtual comport touchpad_read(); // read data from touchpad dx = delta_x();// returns the amount your finger has moved in x direction since last readout dy = delta_y();// returns the amount your finger has moved in y direction since last readout // increment/decrement some dummy variables with the - if (x + dx > 255) { - x = 255; - } else if (x + dx < 0) { - x = 0; - } else { - x = (x + dx); - } - if (y + dy > 255) { - y = 255; - } else if (y + dy < 0) { - y = 0; - } else { - y = (y + dy); + plate_pos_x += dx; + plate_pos_y += dy; + + + last_busy = busy; + busy = move_plate(dx,dy); + + + if (last_busy && !(busy)){ + pos_report(); } - - uart_puts("x_pos: "); - my_uitoa(x, stringbuffer, 4); - uart_puts(stringbuffer); - uart_puts(" y_pos: "); - my_uitoa(y, stringbuffer, 4); - uart_puts(stringbuffer); - uart_puts("\r"); _delay_ms(10); - move_plate(dx>>0,dy>>0); - } // end of relative mode demo block diff --git a/firmware/USBtoSerial.c~ b/firmware/USBtoSerial.c~ index 43d1620..cd90034 100644 --- a/firmware/USBtoSerial.c~ +++ b/firmware/USBtoSerial.c~ @@ -35,12 +35,17 @@ */ #define F_CPU 16e6 +#include +#include #include "USBtoSerial.h" #include #include "TM1001A.c" // #include "rfm70.c" #include "pins.h" +int16_t plate_pos_x = 0,plate_pos_y = 0; +char stringbuffer[16]; + /** Circular buffer to hold data from the host before it is sent to the device via the serial port. */ static RingBuffer_t USBtoUSART_Buffer; @@ -130,11 +135,11 @@ void Usb2SerialTask(void) { } /* Load the next byte from the USART transmit buffer into the USART */ - if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) { - Serial_SendByte(RingBuffer_Remove(&USBtoUSART_Buffer)); +// if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) { +// Serial_SendByte(RingBuffer_Remove(&USBtoUSART_Buffer)); // dummy = RingBuffer_Remove(&USBtoUSART_Buffer); // sendPayload(&dummy,1,0); - } +// } CDC_Device_USBTask(&VirtualSerial_CDC_Interface); USB_USBTask(); @@ -280,6 +285,28 @@ void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) { } +int8_t sign(int16_t x) { + return (x > 0) - (x < 0); +} + + +void uart_print_number(uint32_t zahl, uint8_t no_digits) { + my_uitoa(abs(zahl),stringbuffer,no_digits); + uart_puts(stringbuffer); + +} +void uart_print_signed_number(uint32_t zahl, uint8_t no_digits) { + my_uitoa(abs(zahl),stringbuffer,no_digits); + if (sign(zahl) < 0) { + uart_putc('-'); + } else { + uart_putc('+'); + } + uart_puts(stringbuffer); + +} + + /** Main program entry point. This routine contains the overall program flow, including initial * setup of all components and the main program loop. */ @@ -359,29 +386,205 @@ uint8_t motor_step(uint8_t motor, int8_t direction) { // motor: M1 or M2, direct } -int8_t sign(int16_t x) { - return (x > 0) - (x < 0); + +uint32_t times_ten_pow(uint8_t exponent) { + uint32_t val = 1; + for (uint8_t i = 1; i <= exponent; i++) { + val *= 10; + } + return val; } -void move_plate(int16_t dx, int16_t dy){ + + +uint8_t move_plate(int16_t dx, int16_t dy){ static int16_t todo_x,todo_y = 0; int8_t signum; + uint8_t returnval = 0; todo_x += dx; todo_y += dy; signum = sign(todo_x); + if(signum != 0) { + returnval++; + } motor_step(X,signum); todo_x -= signum; signum = sign(todo_y); + if(signum != 0) { + returnval++; + } motor_step(Y,signum); todo_y -= signum; + return returnval; // busy } +void pos_report(void){ + uart_puts("x_pos: "); + uart_print_signed_number(plate_pos_x,6); +// my_uitoa(plate_pos_x, stringbuffer, 6); +// uart_puts(stringbuffer); + uart_puts(" y_pos: "); + uart_print_signed_number(plate_pos_y,6); + uart_puts("\r"); +} +#define POSITION 0 +#define GOTO 1 +#define MOVEREL 2 +#define SETZERO 3 + +void parse_command(void){ + + + static char cmdbuffer[16]; + static char numbuffer[16]; + static uint16_t predot = 0,postdot = 0; + static uint8_t cmdPos, curCmdLen, num_start = 0, nums_found = 0; + uint8_t action=0,axis=0; + int8_t num_sign = 1; + char byte; + + /* Load the next byte from the USART transmit buffer into the USART */ + if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) { + byte = RingBuffer_Remove(&USBtoUSART_Buffer); + + if (byte == '\r' || byte == '\n') {// end of command, evaluate cemmand! + uart_puts("\r\n"); + cmdbuffer[cmdPos] = '\0'; // terminate new command string + curCmdLen = cmdPos; + cmdPos = 0; + + + if (cmdbuffer[0] == 'g' || cmdbuffer[0] == 'G') { // goto command + action = GOTO; + } else if ( cmdbuffer[0] == 'm' || cmdbuffer[0] == 'M') { + action = MOVEREL; + } else if ( cmdbuffer[0] == 'z' || cmdbuffer[0] == 'Z' ) { + action = SETZERO; + } else { + action = POSITION; + } + + if (cmdbuffer[1] == 'x' || cmdbuffer[1] == 'X') { + axis = X; + } else if (cmdbuffer[1] == 'y' || cmdbuffer[1] == 'Y') { + axis = Y; + } + + // if you expect coordinate, parse number! + if (action == GOTO || action == MOVEREL){ + + predot = 0; + postdot = 0; + num_sign = 1; + num_start = 0; + nums_found = 0; + + for (uint8_t i=2; i<=curCmdLen; i++) { + if ( num_start == 0 && cmdbuffer[i] == '-' ) { // if you find a minus before + // you find a digit, it's a negative number + num_sign = -1; + } + + if ( cmdbuffer[i] >= 48 && cmdbuffer[i] <= 57 ){ // is it a number? + if ( num_start == 0) { // this is the first digit in the string + num_start = i; + } + } else { // no digit! + if ( num_start != 0) { // digits have been found before + strncpy(numbuffer,cmdbuffer+num_start,i-num_start); // copy number found to + // numbuffer + numbuffer[i-num_start] = '\0'; // make sure it's always a terminated string + nums_found++; + if(nums_found == 1) { // its the predot digits + predot = atoi(numbuffer); + } else { // its the postdot digits + uint8_t postdotlen = i-num_start; + if (postdotlen < 3){ // if too small ,fill with zeros + for( uint8_t j = postdotlen; j <=2; j++) { + numbuffer[j] = '0'; + } + } + // crop the number to three post dot digits + numbuffer[3] = '\0'; + + postdot = atoi(numbuffer); + } + num_start = 0; + } + } + } + + } + + int16_t steps = 0,dest=0; + + switch (action) { + case GOTO: + uart_puts("GOTO "); + uart_putc(88+axis);// x or y + uart_print_signed_number(predot*num_sign,3); + uart_putc('.'); + uart_print_number(postdot,3); + uart_puts("\r\n"); + + dest = num_sign *( predot*24 +(postdot*10)/416); + + if (axis == X) { + steps = dest - plate_pos_x; + move_plate(steps,0); + plate_pos_x += steps; + } else if (axis == Y) { + steps = dest - plate_pos_y; + move_plate(0,steps); + plate_pos_y += steps; + } + + break; + case MOVEREL: + uart_puts("MOVE "); + uart_putc(88+axis);// x or y + uart_print_signed_number(predot*num_sign,3); + uart_putc('.'); + uart_print_number(postdot,3); + uart_puts("\r\n"); + + steps = num_sign *( predot*24 +(postdot*10)/416); + + if (axis == X) { + move_plate(steps,0); + plate_pos_x += steps; + } else if (axis == Y) { + move_plate(0,steps); + plate_pos_y += steps; + } + break; + + case SETZERO: + plate_pos_x = 0; + plate_pos_y = 0; + pos_report(); + break; + + case POSITION: + pos_report(); + break; + + } + + + + } else { // queue command + cmdbuffer[cmdPos++] = byte; + uart_putc(byte); + } + } +} int main(void) { @@ -405,55 +608,18 @@ int main(void) sei(); -// setup rfm70 transceiver - -// Begin(); -// -// setMode(0);// set mode t -// setChannel(8); -// _delay_ms(1000); -// sendPayload("eins",4, 0); -// _delay_ms(1000); - -// end uint16_t loopcounter=0; - char stringbuffer[16]; - - touchpad_set_abs_mode();// tell the touchpad you want to use it in the "absolute mode" - while (1) { - break; // goto next mode - Usb2SerialTask(); - loopcounter++; - if(loopcounter< 2000) { - continue; - } - loopcounter=0; - touchpad_read(); // read data from the touchpad - uart_puts("x_pos: "); - my_uitoa(x_abs(),stringbuffer,4);// x_abs returns current x position of your finger - uart_puts(stringbuffer); - uart_puts(" y_pos: "); - my_uitoa(y_abs(),stringbuffer,4);// y_abs returns current y position of your finger - uart_puts(stringbuffer); - uart_puts(" z_pressure: ");// z_pressure returns current "pressure" (contact area) of your finger - my_uitoa(z_pressure(),stringbuffer,4); - uart_puts(stringbuffer); - uart_puts("\r"); - } - // end of absolute mode demo block -// -// #elif DEMO_MODE == RELATIVE_MODE -// begin of relative mode demo block uart_puts("you selected the relative position demo modus:\n\r"); touchpad_set_rel_mode_100dpi();// use touchpad in relative mode // touchpad_set_rel_mode_200dpi(); // uncomment this line if you want double resolution - uint8_t x, y = 0; + int16_t x, y = 0; int8_t dx, dy = 0; + uint8_t busy = 0, last_busy = 0; while (1) { @@ -463,40 +629,27 @@ int main(void) // continue; // } // loopcounter=0; - + parse_command(); // read data from virtual comport touchpad_read(); // read data from touchpad dx = delta_x();// returns the amount your finger has moved in x direction since last readout dy = delta_y();// returns the amount your finger has moved in y direction since last readout // increment/decrement some dummy variables with the - if (x + dx > 255) { - x = 255; - } else if (x + dx < 0) { - x = 0; - } else { - x = (x + dx); - } - if (y + dy > 255) { - y = 255; - } else if (y + dy < 0) { - y = 0; - } else { - y = (y + dy); + plate_pos_x += dx; + plate_pos_y += dy; + + + last_busy = busy; + busy = move_plate(dx,dy); + + + if (last_busy && !(busy)){ + pos_report(); } - - uart_puts("x_pos: "); - my_uitoa(x, stringbuffer, 4); - uart_puts(stringbuffer); - uart_puts(" y_pos: "); - my_uitoa(y, stringbuffer, 4); - uart_puts(stringbuffer); - uart_puts("\r"); _delay_ms(10); - move_plate(dx>>0,dy>>0); - } // end of relative mode demo block diff --git a/firmware/USBtoSerial.elf b/firmware/USBtoSerial.elf index 09b7903c6b6248be900443d5505a2311a2e85585..e7a1412859885515cb474c14940e3287651080f8 100755 GIT binary patch literal 157357 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⁡pi4X=!(M`ppbV}~G&g?pZ1 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

{{-7QY`F{4`op{yr*~S5 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 PU)maQ%w`AFquT!g{HJ_v diff --git a/firmware/USBtoSerial.hex b/firmware/USBtoSerial.hex index b3036b3..8edcda6 100644 --- a/firmware/USBtoSerial.hex +++ b/firmware/USBtoSerial.hex @@ -1,9 +1,9 @@ :100000009AC00000B4C00000B2C00000B0C0000040 :10001000AEC00000ACC00000AAC00000A8C0000034 -:10002000A6C00000A4C00000A2C000007CC7000061 -:100030000C9437089CC000009AC0000098C00000D3 +:10002000A6C00000A4C00000A2C000000C943109CA +:100030000C94D5099CC000009AC0000098C0000034 :1000400096C0000094C0000092C0000090C0000064 -:100050008EC000004BC100008AC000004EC30000EB +:100050008EC000004BC100008AC0000023C3000016 :1000600086C0000084C0000082C0000080C0000084 :100070007EC000007CC000007AC0000078C0000094 :1000800076C0000074C0000072C0000070C00000A4 @@ -18,9 +18,9 @@ :1001100020005500530042002D00520053003200D1 :100120003300320020004100640061007000740060 :1001300065007200000011241FBECFEFD4E0DEBFC7 -:10014000CDBF11E0A0E0B1E0E8EBFAE102C005901C -:100150000D92AA36B107D9F712E0AAE6B1E001C0C4 -:100160001D92A43AB107E1F765D40C945A0D48CF1B +:10014000CDBF11E0A0E0B1E0E8E8FEE102C005901B +:100150000D92AA37B107D9F712E0AAE7B1E001C0C2 +:100160001D92A03FB107E1F72FD60C94420F48CF64 :10017000FC01A081B1816C93808191810196918372 :100180008083268137818217930721F484819581AA :10019000918380832FB7F894828593850196938706 @@ -45,392 +45,454 @@ :1002C0000895FC012FB7F894718360837383628370 :1002D0007583648360587F4F7783668380E890E0FE :1002E00091878087138612862FBF08951F920F92E1 -:1002F0000FB60F9211248F93809196028F5F809397 -:1003000096028F910F900FBE0F901F90189586B593 -:100310003091960220E0280F311DC901089516BCC6 -:10032000109296020895DF92EF92FF920F931F931F +:1002F0000FB60F9211248F938091E2028F5F80934B +:10030000E2028F910F900FBE0F901F90189586B547 +:100310003091E20220E0280F311DC901089516BC7A +:100320001092E2020895DF92EF92FF920F931F93D3 :10033000CF93DF9383E085BDF2DF509A5898E7DFD3 -:10034000BC0180E090E00E945B0C20E030E84EE0D1 -:1003500053E40E94C30B87FDF2CF82E085BDDD240C +:10034000BC0180E090E00E94FB0D20E030E84EE030 +:1003500053E40E94630D87FDF2CF82E085BDDD246A :10036000D39410E0DCDF509A5898D1DFBC0180E0D4 -:1003700090E00E945B0C20E030E04CE852E40E94E8 -:10038000C30B87FDF2CF5098589AC1DFBC0180E0C3 -:1003900090E00E945B0C20E030E048E453E40E94CF -:1003A000C30B87FDF2CF41C0C8E0D0E000E8E12EEA -:1003B000FF248DE892E0E80EF91EB1DF509A5898BC +:1003700090E00E94FB0D20E030E04CE852E40E9447 +:10038000630D87FDF2CF5098589AC1DFBC0180E021 +:1003900090E00E94FB0D20E030E048E453E40E942E +:1003A000630D87FDF2CF41C0C8E0D0E000E8E12E48 +:1003B000FF2489EC92E0E80EF91EB1DF509A5898BC :1003C000F7018081802379F0A2DFBC0180E090E01A -:1003D0000E945B0C20E030E04CE852E40E94C30B2A +:1003D0000E94FB0D20E030E04CE852E40E94630DE7 :1003E00087FDF2CF0EC093DFBC0180E090E00E9459 -:1003F0005B0C20E030E042E053E40E94C30B87FD39 +:1003F000FB0D20E030E042E053E40E94630D87FDF6 :10040000F2CF5098589A83DFBC0180E090E00E94C0 -:100410005B0C20E030E048E453E40E94C30B87FD0E +:10041000FB0D20E030E048E453E40E94630D87FDCB :10042000F2CF0695219749F61F5F1D1508F4BCCF42 :1004300076DF509A58986BDFBC0180E090E00E9414 -:100440005B0C20E030E042E053E40E94C30B87FDE8 +:10044000FB0D20E030E042E053E40E94630D87FDA5 :10045000F2CF5098589A5BDFBC0180E090E00E9498 -:100460005B0C20E030E048E453E40E94C30B87FDBE -:10047000F2CF80918D028B3329F0893341F409E06A +:10046000FB0D20E030E048E453E40E94630D87FD7B +:10047000F2CF8091C9028B3329F0893341F409E02E :10048000D02E02C0B3E0DB2E113009F46BCF47DF72 -:100490003EDFBC0180E090E00E945B0C20E030E099 -:1004A0004AEF53E40E940D0D18160CF442C048990F -:1004B000EFCF489BFECFCEE8D2E011E001C0182F6D +:100490003EDFBC0180E090E00E94FB0D20E030E0F8 +:1004A0004AEF53E40E94AD0E18160CF442C048996E +:1004B000EFCF489BFECFCAECD2E011E001C0182F6D :1004C0001882A8E0EA2EF12C00E829DF20DFBC0129 -:1004D00080E090E00E945B0C20E030E048E453E4D0 -:1004E0000E940D0D181614F4115024C04899EECF37 +:1004D00080E090E00E94FB0D20E030E048E453E42F +:1004E0000E94AD0E181614F4115024C04899EECF96 :1004F00016DF489BFECF0BDFBC0180E090E00E943E -:100500005B0C20E030E048EC52E40E94C30B87FF14 +:10050000FB0D20E030E048EC52E40E94630D87FFD1 :1005100003C08881800F888306950894E108F1085C :10052000E114F10491F6812F8F5F2196893039F61D :1005300001C010E0812FDF91CF911F910F91FF90AB :10054000EF90DF9008955098589AEEE6F0E08081A1 -:100550008160808308958CE380938D02E4DE809334 -:1005600097028091970208958BE380938D0283E632 -:1005700080938E0284E080938F02D5DE8DE380939A -:100580008D02D1DE89E380938D0210929402CBDE3E -:100590008FEF91EEA4E081509040A040E1F700C0C1 -:1005A000000008958BE380938D0283E680938E0292 -:1005B00081E080938F02B7DE8FEF91EEA4E081504F -:1005C0009040A040E1F700C000000895809197029C -:1005D000882351F080918E0286FF04C081958F732D -:1005E000819508958F73089580E008958091970212 -:1005F000882351F080918F0286FF04C081958F730C -:10060000819508958F73089580E008951F938FB7A3 -:10061000F89420917401309175018FBF809172011F -:10062000909173012817390751F085E491E00E94F9 -:10063000300BBC0197FD03C08AE691E099DD2FB72E -:10064000F89480910002909101022FBF009701F170 -:10065000209146012F702093E9002091E80020FFAF -:1006600017C08031910510F08FE090E0182F0EC078 -:10067000E091F801F091F90185E491E060817FD784 -:100680001150882329F486EF91E08DDD112381F745 -:100690002FB7F89480917401909175012FBF009746 -:1006A00049F08AE691E07FDD9091C80095FFFCCF8C -:1006B0008093CE0085E491E0BCD776D61F91089553 -:1006C00084B7877F84BF88E10FB6F8948093600079 -:1006D000109260000FBE90E080E80FB6F89480930F -:1006E0006100909361000FBE0FC40895089585E4E2 -:1006F00091E021C785E491E072C61F920F920FB678 -:100700000F9211242F933F934F935F936F937F9397 -:100710008F939F93AF93BF93EF93FF936091CE001E -:100720008EB3843019F486EF91E022DDFF91EF91D2 -:10073000BF91AF919F918F917F916F915F914F91F9 -:100740003F912F910F900FBE0F901F9018958F9291 -:100750009F92AF92BF92CF92DF92EF92FF921F9340 -:10076000FC01A18DA150A23028F4B0E0AC59BE4FDD -:100770001C9101C010E0808D823009F41860828DD8 -:10078000873031F0883031F0863029F4126003C0B0 -:10079000146001C016601092C9001092C800109237 -:1007A000CA00C488D588E688F788C701B60196953F -:1007B0008795779567950E945B0C20E034E244EFC3 -:1007C00059E47DD74B015C01C701B6010E945B0C67 -:1007D0009B01AC01C501B401DAD720E030E040E86C -:1007E0005FE36CD70E942F0C7093CD006093CC0018 -:1007F0001093CA0082E08093C80088E98093C90002 -:100800001F91FF90EF90DF90CF90BF90AF909F909F -:100810008F900895682F8EB3843019F486EF91E09D -:10082000A7CC0895EF92FF92CF93DF93E82EE701D4 -:100830007E01F92EE70101C0EDDF89918823E1F700 -:10084000DF91CF91FF90EF9008952F923F924F92BA -:100850005F926F927F928F929F92AF92BF92CF9250 -:10086000DF92EF92FF920F931F93CF93DF937B0161 -:100870008C01822F90E0FA01E80FF91F1082D22E2E -:10088000DA944D2C552447FC5094EA01C40DD51D33 -:10089000AA24BB24AAE06A2E712C812C912C1C0165 -:1008A000089421083108F0E2CF2E22C0E114F104AF -:1008B0000105110541F4C501840D951D82159305AF -:1008C00014F4C88208C0C801B701A40193010E94B2 -:1008D000380D605D6883C801B701A40193010E94CF -:1008E000380D79018A01DA9421970894A108B1089A -:1008F000D7FEDCCFDF91CF911F910F91FF90EF904A -:10090000DF90CF90BF90AF909F908F907F906F902F -:100910005F904F903F902F90089580E05DDC80E0E5 -:1009200096DC229A239A249A259A279A269A3F9A05 -:100930003E9A08950F931F93162F823050F4A82FDC -:10094000B0E0AA0FBB1FAA59BE4F2D913C91119741 -:1009500002C02CEE30E0E82FF0E0812F992787FDD0 -:1009600090950496EA57FD4F4081840F911D64E0F5 -:1009700070E00E94250D8083E82FF0E0E05AFE4FE2 -:100980000081112311F0802F01C080E0F901099549 -:10099000802F1F910F91089521E0181619060CF071 -:1009A00020E0892F881F8827881F281B822F089501 -:1009B0001F932091840230918502280F391F3093B4 -:1009C0008502209384028091820290918302860F97 -:1009D000971F9093830280938202C901DDDF182F55 -:1009E00080E0612FA7DF812F992787FD90952091C7 -:1009F000840230918502281B390B309385022093A5 -:100A000084028091820290918302C6DF182F81E0D8 -:100A1000612F90DF812F992787FD90952091820289 -:100A200030918302281B390B30938302209382027A -:100A30001F910895AF92BF92CF92DF92EF92FF92F3 -:100A40000F931F93DF93CF93CDB7DEB760970FB6A9 -:100A5000F894DEBF0FBECDBF60DF32DE8AE691E0E4 -:100A600066E771E02EDC86EF91E062E072E029DC5F -:100A7000789469DD8FEF99E6A8E181509040A0401D -:100A8000E1F700C0000078946FDD80E091E0CADEFD -:100A900089DDDD248E010F5F1F4FB8DD5CDDA6DD33 -:100AA000A82E94DDEA2CFF24E7FCF09497012C0D8E -:100AB000311D2F3F310509F024F437FD05C0CA0C64 -:100AC00004C0CC24CA9401C0CC24A82EBB24A7FC0B -:100AD000B09495012D0D311D2F3F310509F024F4FF -:100AE00037FD05C0D80E04C0DD24DA9401C0DD2432 -:100AF00081E391E097DE6C2D70E080E090E0A8014A -:100B000024E0A3DEC8018EDE89E391E08BDE6D2D4B -:100B100070E080E090E0A80124E097DEC80182DE6A -:100B200083E491E07FDEAFE3BCE91197F1F700C009 -:100B30000000C701B5013CDFB0CF923029F09330FF -:100B400041F09130E9F417C02EE330E0EAEAF0E03A -:100B50001BC0813041F0813018F0823089F406C02A -:100B6000E8EEF0E005C0ECEEF0E002C0E6E0F1E017 -:100B7000249130E009C022E130E0E8E9F0E004C06F -:100B800020E030E0E0E0F0E0DA011196FC93EE9333 -:100B9000C9010895282F392FF9018091A20290915F -:100BA000A3028617970718F4BC0120E034C0611532 -:100BB0007105D9F78091E8008E778093E800F5CF32 -:100BC0008EB38823E9F18530B9F18091E80083FD87 -:100BD00035C08091E80082FD29C08091E80080FF47 -:100BE0001AC08091F20090E006C021912093F1009C -:100BF0006150704001966115710519F088309105BA -:100C0000A0F321E08830910509F020E08091E80010 -:100C10008E778093E8006115710591F6222381F6A5 -:100C200005C08EB3882361F0853061F08091E800C3 -:100C300082FFF7CF80E0089583E0089581E0089572 -:100C400082E0089583E00895E82FF92F8091A202B1 -:100C50009091A3028617970718F4BC0120E036C0D4 -:100C600061157105D9F78091E8008E778093E800CF -:100C7000F5CF8EB3882309F43EC08530C1F1809151 -:100C8000E80083FD36C08091E80082FD2AC0809193 -:100C9000E80080FF1BC08091F20090E007C0249123 -:100CA0002093F100319661507040019661157105F5 -:100CB00019F08830910598F321E08830910509F00A -:100CC00020E08091E8008E778093E800611571053F -:100CD00081F6222371F605C08EB3882361F085303A -:100CE00061F08091E80082FFF7CF80E0089583E013 -:100CF000089581E0089582E0089583E00895982F93 -:100D00002CC0292F2F702093E900981739F070918B -:100D1000EC002091ED005091F00003C0242F762FBD -:100D200050E021FF19C03091EB003E7F3093EB0083 -:100D30003091ED003D7F3093ED003091EB0031605C -:100D40003093EB007093EC002093ED005093F00093 -:100D50002091EE0027FF08C09F5F953090F28F70C2 -:100D60008093E90081E0089580E00895EF92FF927A -:100D70000F931F93CF93DF93162FE82EE7017E0189 -:100D8000F92EE70100E02AC09881992329F16B81AF -:100D9000E981FA812C81892F8F70853018F5629551 -:100DA000660F660F607C991F9927991F692B223067 -:100DB00010F096E001C092E028E030E040E003C08F -:100DC0004F5F220F331F2E173F07D0F34295407F0E -:100DD000492B95DF882331F00F5F25960117A0F28C -:100DE00081E001C080E0DF91CF911F910F91FF90D2 -:100DF000EF90089580919C0287FF11C003C08EB3CD -:100E00008823B1F08091E80082FFF9CF8091E8005B -:100E10008B778093E80008958EB3882349F0809102 -:100E2000E80080FFF9CF8091E8008E778093E8009A -:100E300008958091E4009091E50044E62091EC0053 -:100E400020FF25C02091E80020FD15C02EB32223ED -:100E5000A1F02530A1F02091EB0025FD12C02091DA -:100E6000E4003091E5002817390741F3442359F095 -:100E70004150C901E3CF80E0089582E0089583E006 -:100E8000089581E0089584E0089580E00895209118 -:100E9000E80022FFDBCFF9CF40D042D08091D800CC -:100EA0008F778093D8008091D80080688093D80095 -:100EB0008091D8008F7D8093D80084E089BD86E042 -:100EC00089BD09B400FEFDCF1EBA1092980210929F -:100ED0009A021092990280E060E042E010DF809177 -:100EE000E1008E7F8093E1008091E2008160809339 -:100EF000E2008091E20088608093E2008091E0004F -:100F00008E7F8093E0000895E3E6F0E080818E7F9D -:100F1000808381E080939B02BFCF1092E20008950E -:100F20001092E10008951F920F920FB60F921124B4 -:100F30002F933F934F935F936F937F938F939F93E1 -:100F4000AF93BF93EF93FF938091E10082FF0AC0BC -:100F50008091E20082FF06C08091E1008B7F809348 -:100F6000E10021D28091E10080FF16C08091E20073 -:100F700080FF12C08091E2008E7F8093E20080911A -:100F8000E20080618093E2008091D80080628093CB -:100F9000D80019BC1EBAAADB8091E10084FF2CC0E6 -:100FA0008091E20084FF28C084E089BD86E089BD8D -:100FB00009B400FEFDCF8091D8008F7D8093D800CA -:100FC0008091E1008F7E8093E1008091E2008F7E2E -:100FD0008093E2008091E20081608093E200809142 -:100FE0009802882321F48091E30087FF02C084E007 -:100FF00001C081E08EBB79DB8091E10083FF26C0D8 -:101000008091E20083FF22C08091E100877F80937E -:10101000E10082E08EBB109298028091E1008E7F09 -:101020008093E1008091E2008E7F8093E2008091C6 -:10103000E20080618093E20080E060E042E05FDEF9 -:101040008091F00088608093F000ADD1FF91EF9126 -:10105000BF91AF919F918F917F916F915F914F91D0 -:101060003F912F910F900FBE0F901F9018951F92D8 -:101070000F920FB60F9211241F932F933F934F930C -:101080005F936F937F938F939F93AF93BF93EF93F0 -:10109000FF931091E9001F708091EC001092E9001D -:1010A0008091F000877F8093F00078941BD010929D -:1010B000E9008091F00088608093F0001093E900CF -:1010C000FF91EF91BF91AF919F918F917F916F9120 -:1010D0005F914F913F912F911F910F900FBE0F90F5 -:1010E0001F9018951F93DF93CF93CDB7DEB7AC97C2 -:1010F0000FB6F894DEBF0FBECDBFECE9F2E08091F1 -:10110000F100819322E0E43AF207C9F7F3DA809123 -:10111000E80083FF30C180919C0220919D02253020 -:1011200009F484C0263040F42130A1F1213070F060 -:10113000233009F020C12EC0283009F4EFC0293037 -:1011400009F4FEC0263009F016C192C0803821F0A3 -:10115000823809F010C108C08091990290919A02DA -:10116000992371F082600CC08091A0028F708093EF -:10117000E9009091EB0081E095FF80E01092E9009A -:101180009091E800977F9093E8008093F10010928F -:10119000F100CFC0882319F0823009F0ECC090E054 -:1011A0008F719070009729F08230910509F0E3C0AB -:1011B0000BC080919E02813009F0DDC0233009F020 -:1011C00080E080939A022CC080919E02882341F592 -:1011D0002091A0022F7009F4CEC02093E9008091E5 -:1011E000EB0080FF1DC080919D02833021F480912F -:1011F000EB00806213C08091EB0080618093EB0074 -:1012000081E090E002C0880F991F2A95E2F7809351 -:10121000EA001092EA008091EB0088608093EB0076 -:101220001092E9008091E800877F86C0882309F04A -:10123000A2C010919E021F778091E3008078812BDD -:101240008093E3008091E800877F8093E800D2DDFF -:101250008091E80080FFFCCF8091E300806880935C -:10126000E300112311F083E001C082E08EBB83C054 -:101270008058823008F07FC080919E0290919F023A -:1012800023E08C3D920791F583E08C838AE28B8387 -:101290005FB7F894DE01159680E090E04EE061E2E1 -:1012A000E42FF0E060935700E49180FF03C0E295E3 -:1012B000EF704F5FEF702E2F30E0EA3018F0295CAE -:1012C0003F4F02C0205D3F4F2D933D9301968431E7 -:1012D000910531F75FBF8091E800877F8093E80038 -:1012E000CE0103966AE270E055DC12C06091A00264 -:1012F000AE014F5F5F4F21DCBC01009709F43BC09A -:101300008091E800877F8093E80089819A819CDC46 -:101310008091E8008B778093E8002DC0803859F5E4 -:101320008091E800877F8093E80080919802809305 -:10133000F1008091E8008E778093E8005BDD1BC0B0 -:101340008823C9F490919E029230A8F48091E8001D -:10135000877F8093E800909398024CDD80919802FB -:10136000882321F48091E30087FF02C084E001C05C -:1013700081E08EBBBCD98091E80083FF0AC08091D8 -:10138000E800877F8093E8008091EB008062809383 -:10139000EB00AC960FB6F894DEBF0FBECDBFCF9179 -:1013A000DF911F91089508951F938EB38823A9F0AC -:1013B0008091E9008F709091EC0090FF02C010E8DE -:1013C00001C010E0182B1092E9008091E80083FF23 -:1013D00001C088DE1F701093E9001F910895CF931C -:1013E000DF93EC018091E80083FFA2C0888190E048 -:1013F0002091A0023091A1022817390709F098C066 -:1014000080919D02813269F0823220F4803209F0AD -:101410008FC03CC0823209F46AC0833209F088C0B0 -:1014200079C080919C02813A09F082C08091E800E5 -:10143000877F8093E8008091E80080FFFCCF8C8953 -:101440009D89AE89BF898093F100292F3A2F4B2FB8 -:1014500055272093F1009D01442755272093F10043 -:101460008B2F9927AA27BB278093F100888D809323 -:10147000F100898D8093F1008A8D8093F100809135 -:10148000E8008E778093E800B5DC52C080919C0222 -:10149000813209F04DC08091E800877F8093E80099 -:1014A00004C08EB3882309F443C08091E80082FF12 -:1014B000F8CF3091F1002091F1009091F1008091EE -:1014C000F1003C8B2D8B9E8B8F8B8091F100888F50 -:1014D0008091F100898F8091F1008A8F8091E800DE -:1014E0008B778093E80086DCCE0131D921C08091D2 -:1014F0009C028132E9F48091E800877F8093E800C4 -:1015000079DC80919E0290919F02998B888BCE010D -:10151000D4D00EC080919C02813251F48091E800B9 -:10152000877F8093E80066DCCE0160919E02C5D083 -:10153000DF91CF910895CF93DF93EC014096FC01AA -:101540008BE0DF011D928A95E9F782E08C83898721 -:1015500083E08E87CE01019661E008DC882359F094 -:10156000CE01069661E002DC882329F0CE010B96BD -:1015700061E0FCDB01C080E0DF91CF910895DF9353 -:10158000CF930F92CDB7DEB7FC018EB38430F9F460 -:101590002489358946895789211531054105510529 -:1015A000B1F081818F708093E9008091E80085FD22 -:1015B0000AC08091E8008E778093E800698339DC67 -:1015C0006981882329F46093F10080E001C082E002 -:1015D0000F90CF91DF910895FC018EB3843019F5FF -:1015E00024893589468957892115310541055105D9 -:1015F000D1F081818F708093E9008091F20088237F -:10160000A1F09091E8008091E8008E778093E80047 -:1016100095FD0DC00EDC882359F49091E8009E776B -:101620009093E800089582E0089580E0089580E0B6 -:1016300008952EB3243099F4FC0124893589468914 -:101640005789211531054105510549F021812F7038 -:101650002093E9002091E80020FF01C0BDCF08954C -:10166000FC018EB3843029F5248935894689578950 -:101670002115310541055105E1F086818F70809378 -:10168000E9008091E80082FF14C08091F200882375 -:1016900021F02091F10030E002C02FEF3FEF809168 -:1016A000F200882341F48091E8008B778093E80072 -:1016B00002C02FEF3FEFC901089508955058BB278E -:1016C000AA270ED070C161D130F066D120F031F47C -:1016D0009F3F11F41EF456C10EF4E095E7FB4CC198 -:1016E000E92F72D180F3BA17620773078407950751 -:1016F00018F071F49EF58AC10EF4E0950B2EBA2F06 -:10170000A02D0B01B90190010C01CA01A001112407 -:10171000FF27591B99F0593F50F4503E68F11A16B3 -:10172000F040A22F232F342F4427585FF3CF469544 -:1017300037952795A795F0405395C9F77EF41F1666 -:10174000BA0B620B730B840BBAF09150A1F0FF0F30 -:10175000BB1F661F771F881FC2F70EC0BA0F621F1C -:10176000731F841F48F4879577956795B795F7950C -:101770009E3F08F0B3CF9395880F08F09927EE0F9E -:10178000979587950895D4D008F481E008950CD0FA -:101790000AC102D140F0F9D030F021F45F3F19F0D6 -:1017A000EBC0511134C1EEC00FD198F39923C9F3A6 -:1017B0005523B1F3951B550BBB27AA276217730757 -:1017C000840738F09F5F5F4F220F331F441FAA1F0B -:1017D000A9F333D00E2E3AF0E0E830D091505040CB -:1017E000E695001CCAF729D0FE2F27D0660F771F79 -:1017F000881FBB1F261737074807AB07B0E809F05B -:10180000BB0B802DBF01FF2793585F4F2AF09E3FEF -:10181000510568F0B1C0FBC05F3FECF3983EDCF3CC -:10182000869577956795B795F7959F5FC9F7880F68 -:10183000911D9695879597F90895E1E0660F771FBA -:10184000881FBB1F621773078407BA0720F0621B4B -:10185000730B840BBA0BEE1F88F7E0950895BCD08C -:1018600088F09F5790F0B92F9927B751A0F0D1F089 -:10187000660F771F881F991F1AF0BA95C9F712C013 -:10188000B13081F0C3D0B1E00895C0C0672F782F88 -:101890008827B85F39F0B93FCCF38695779567957F -:1018A000B395D9F73EF490958095709561957F4FEB -:1018B0008F4F9F4F0895E89409C097FB3EF4909591 -:1018C0008095709561957F4F8F4F9F4F9923A9F019 -:1018D000F92F96E9BB279395F695879577956795A8 -:1018E000B795F111F8CFFAF4BB0F11F460FF1BC0EC -:1018F0006F5F7F4F8F4F9F4F16C0882311F096E97F -:1019000011C0772321F09EE8872F762F05C066232C -:1019100071F096E8862F70E060E02AF09A95660FE5 -:10192000771F881FDAF7880F9695879597F908959E -:10193000990F0008550FAA0BE0E8FEEF16161706E0 -:10194000E807F907C0F012161306E407F50798F048 -:10195000621B730B840B950B39F40A2661F0232B61 -:10196000242B252B21F408950A2609F4A140A695DD -:101970008FEF811D811D089597F99F6780E870E0C2 -:1019800060E008959FEF80EC089500240A941616F5 -:10199000170618060906089500240A94121613065D -:1019A000140605060895092E0394000C11F48823EB -:1019B00052F0BB0F40F4BF2B11F460FF04C06F5F07 -:1019C0007F4F8F4F9F4F089557FD9058440F551FDD -:1019D00059F05F3F71F04795880F97FB991F61F0B1 -:1019E0009F3F79F087950895121613061406551F28 -:1019F000F2CF4695F1DF08C0161617061806991F94 -:101A0000F1CF86957105610508940895E894BB2788 -:101A100066277727CB0197F908958ADF08F48FEFBF -:101A20000895AA1BBB1B51E107C0AA1FBB1FA61725 -:101A3000B70710F0A61BB70B881F991F5A95A9F777 -:101A400080959095BC01CD01089597FB092E07263E -:101A50000AD077FD04D0E5DF06D000201AF4709597 -:101A600061957F4F0895F6F7909581959F4F089562 -:101A7000A1E21A2EAA1BBB1BFD010DC0AA1FBB1F92 -:101A8000EE1FFF1FA217B307E407F50720F0A21B04 -:101A9000B30BE40BF50B661F771F881F991F1A9471 -:101AA00069F760957095809590959B01AC01BD019B -:081AB000CF010895F894FFCF67 -:101AB800796F752073656C656374656420746865F7 -:101AC8002072656C617469766520706F73697469DA -:101AD8006F6E2064656D6F206D6F6475733A0A0DC3 -:101AE80000785F706F733A20002020795F706F7301 -:101AF8003A20000D000083100000010410000001CE -:101B08008208000001000000000000000000000042 -:0A1B18000A0905063020EC00270141 +:100550008160808308958CE38093C902E4DE8093F8 +:10056000E3028091E30208958BE38093C90283E65E +:100570008093CA0281E08093CB02D5DE8FEF91EEAB +:10058000A4E081509040A040E1F700C00000089531 +:100590008091E302882351F08091CA0286FF04C053 +:1005A00081958F73819508958F73089580E00895E4 +:1005B0008091E302882351F08091CB0286FF04C032 +:1005C00081958F73819508958F73089580E00895C4 +:1005D0001F938FB7F89420918801309189018FBFC4 +:1005E00080918601909187012817390751F084E5A1 +:1005F00091E00E94D00CBC0197FD03C08EE791E012 +:10060000B7DD2FB7F89480911402909115022FBF97 +:10061000009709F1209155012F702093E900209156 +:10062000E80020FF18C08031910510F08FE090E0C5 +:10063000182F0FC0E0910C02F0910D0284E591E0BB +:1006400060810E945F0C1150882329F48AE092E0B7 +:10065000AADD112379F784E591E00E94B90C0E948C +:10066000730B1F91089584B7877F84BF88E10FB60D +:10067000F89480936000109260000FBE90E080E8D4 +:100680000FB6F89480936100909361000FBEDAC5B5 +:100690000895089584E591E00C943B0C84E591E085 +:1006A0000C948E0B1F920F920FB60F9211242F9362 +:1006B0003F934F935F936F937F938F939F93AF93EA +:1006C000BF93EF93FF936091CE008EB3843019F403 +:1006D0008AE092E04DDDFF91EF91BF91AF919F9144 +:1006E0008F917F916F915F914F913F912F910F90DB +:1006F0000FBE0F901F9018958F929F92AF92BF924E +:10070000CF92DF92EF92FF921F93FC01A18DA15037 +:10071000A23028F4B0E0AD58BE4F1C9101C010E0EB +:10072000808D823009F41860828D873031F08830F6 +:1007300031F0863029F4126003C0146001C01660E5 +:100740001092C9001092C8001092CA00C488D588BF +:10075000E688F788C701B6019695879577956795DE +:100760000E94FB0D20E034E244EF59E40E94FF0CAC +:100770004B015C01C701B6010E94FB0D9B01AC015E +:10078000C501B4010E94670D20E030E040E85FE35E +:100790000E94FE0C0E94CF0D7093CD006093CC00A0 +:1007A0001093CA0082E08093C80088E98093C90052 +:1007B0001F91FF90EF90DF90CF90BF90AF909F90F0 +:1007C0008F900895682F8EB3843019F48AE092E0F8 +:1007D000CFCC0895EF92FF92CF93DF93E82EE701FD +:1007E0007E01F92EE70101C0EDDF89918823E1F751 +:1007F000DF91CF91FF90EF9008952F923F924F920B +:100800005F926F927F928F929F92AF92BF92CF92A0 +:10081000DF92EF92FF920F931F93CF93DF937B01B1 +:100820008C01822F90E0FA01E80FF91F1082D22E7E +:10083000DA944D2C552447FC5094EA01C40DD51D83 +:10084000AA24BB24AAE06A2E712C812C912C1C01B5 +:10085000089421083108F0E2CF2E22C0E114F104FF +:100860000105110541F4C501840D951D82159305FF +:1008700014F4C88208C0C801B701A40193010E9402 +:10088000EA0E605D6883C801B701A40193010E946C +:10089000EA0E79018A01DA9421970894A108B10837 +:1008A000D7FEDCCFDF91CF911F910F91FF90EF909A +:1008B000DF90CF90BF90AF909F908F907F906F9080 +:1008C0005F904F903F902F90089521E018161906E1 +:1008D0000CF020E0892F881F8827881F281B822F73 +:1008E0000895242F77FF03C0709561957F4F882767 +:1008F00077FD8095982F42ED52E07FDF82ED92E008 +:1009000069CF0F931F93242F8B0177FF03C070953E +:1009100061957F4F882777FD8095982F42ED52E0B3 +:100920006CDFC801D2DF87FF02C08DE201C08BE21D +:1009300049DF82ED92E04EDF1F910F91089580E034 +:100940004BDC80E084DC229A239A249A259A279A09 +:10095000269A3F9A3E9A08950F931F93162F82303E +:1009600050F4A82FB0E0AA0FBB1FAB58BE4F2D917B +:100970003C91119702C02CEE30E0E82FF0E0812F7F +:10098000992787FD90950496EE53FD4F4081840F83 +:10099000911D64E070E00E94D70E8083E82FF0E0A4 +:1009A000E159FE4F0081112311F0802F01C080E03A +:1009B000F9010995802F1F910F9108950F931F93AF +:1009C0002091C0023091C102280F391F3093C1021B +:1009D0002093C0028091BE029091BF02860F971FA4 +:1009E0009093BF028093BE02C9016FDF082F11E010 +:1009F000882309F410E080E0602FAEDF602F7727B6 +:100A000067FD70952091C0023091C102261B370B03 +:100A10003093C1022093C0028091BE029091BF0228 +:100A200054DF082F81111F5F81E0602F95DF602F59 +:100A3000772767FD70952091BE023091BF02261B7B +:100A4000370B3093BF022093BE02812F1F910F916D +:100A5000089580E091E0BEDE60917A0170917B01A3 +:100A6000882777FD8095982F46E04BDF88E091E05E +:100A7000B1DE60917C0170917D01882777FD8095C2 +:100A8000982F46E03EDF82E191E0A4CECF92DF9244 +:100A9000EF92FF920F931F93CF93DF932FB7F894AA +:100AA00080918801909189012FBF009709F483C13B +:100AB0008EE791E078DB8D3019F08A3009F070C153 +:100AC00084E191E087DE80919902E82FF0E0E25521 +:100AD000FD4F108280939802109299028091AE028D +:100AE000873659F0873449F08D3649F08D3439F026 +:100AF0008A3739F08A3539F404C001E005C002E0D4 +:100B000003C003E001C000E08091AF02883739F0F4 +:100B1000883529F0893729F011E0893519F010E07E +:100B200001C011E0802F8150823008F06DC010921A +:100B30009D0210929C0210929B0210929A021092B7 +:100B400097021092960292E0F92EDD24D39480E36E +:100B5000C82E54C0E0909702EE2049F4EF2DF0E04B +:100B6000E255FD4F80818D3211F4DD24DA94CF2DD2 +:100B7000D0E0FE01E255FD4F808180538A3028F499 +:100B8000EE20D9F5F092970238C0EE20B1F16E2D2B +:100B900070E0C61BD70B62557D4F8EE992E0AE0127 +:100BA0000E94290FC256DD4F1882809196028F5FF6 +:100BB00080939602813049F48EE992E00E940C0FF6 +:100BC00090939D0280939C0216C08F2D8E198330C6 +:100BD00040F4E82FF0E0E256FD4FC0828F5F833093 +:100BE000C1F71092A1028EE992E00E940C0F90933F +:100BF0009B0280939A0210929702F394809198023C +:100C00008F1508F0A7CF02C0DD24D394023009F479 +:100C10005FC0033009F4BAC0013009F0BFC087E1FA +:100C200091E0D8DD812F885ACDDDCD2DDD27C7FDA0 +:100C3000D09560919C0270919D02CE010E94B10EF0 +:100C4000BC0180E090E043E05CDE8EE2BBDD6091C1 +:100C50009A0270919B0280E090E043E042DE84E1E2 +:100C600091E0B8DD80919A0290919B026AE070E079 +:100C70000E94B10E60EA71E00E94C30E9B01809158 +:100C80009C0290919D0268E170E00E94B10E280FD5 +:100C9000391FCE01B9010E94B10E112369F42091D0 +:100CA0007A0130917B01E82EE7017E01F92EE70100 +:100CB000C21BD30BCE014DC020917C0130917D0130 +:100CC000E82EE7017E01F92EE701C21BD30B4FC0CE +:100CD0008DE191E07FDD812F885A74DDCD2DDD27F8 +:100CE000C7FDD09560919C0270919D02CE010E943B +:100CF000B10EBC0180E090E043E003DE8EE262DDF5 +:100D000060919A0270919B0280E090E043E0E9DDFF +:100D100084E191E05FDD80919A0290919B026AE00C +:100D200070E00E94B10E60EA71E00E94C30E9B0168 +:100D300080919C0290919D0268E170E00E94B10E4A +:100D4000280F391FCE01B9010E94B10EEC01112309 +:100D500071F460E070E032DE80917A0190917B0165 +:100D60008C0F9D1F90937B0180937A0117C080E0C8 +:100D700090E0BE0123DE80917C0190917D018C0F7B +:100D80009D1F90937D0180937C0108C010927B0190 +:100D900010927A0110927D0110927C015ADE0BC0F4 +:100DA00090919902E92FF0E0E255FD4F80839F5F1B +:100DB0009093990207DDDF91CF911F910F91FF90E2 +:100DC000EF90DF90CF9008950F931F93DF93CF9311 +:100DD0000F92CDB7DEB7B3DD46DC8EE791E06AE86F +:100DE00071E06FDA8AE092E066E172E06ADA7894A4 +:100DF000AADB8FEF99E6A8E181509040A040E1F78F +:100E000000C00000789483E291E0E4DCADDB10E008 +:100E1000DFDB3CDEA0DBCCDB082FBADB402F552725 +:100E200047FD509520917A0130917B01240F351FA9 +:100E300030937B0120937A01682F772767FD7095A7 +:100E400080917C0190917D01860F971F90937D0189 +:100E500080937C01CA01B2DD112329F0882319F4A3 +:100E60008983F7DD8981AFE3BCE91197F1F700C011 +:100E70000000182FCDCF923029F0933041F09130FF +:100E8000E9F417C02EE330E0EAEAF0E01BC081305D +:100E900041F0813018F0823089F406C0E8EEF0E0CD +:100EA00005C0ECEEF0E002C0E6E0F1E0249130E0B5 +:100EB00009C022E130E0E8E9F0E004C020E030E0E1 +:100EC000E0E0F0E0DA011196FC93EE93C901089599 +:100ED000282F392FF9018091EE029091EF028617A9 +:100EE000970718F4BC0120E034C061157105D9F7EB +:100EF0008091E8008E778093E800F5CF8EB3882349 +:100F0000E9F18530B9F18091E80083FD35C0809129 +:100F1000E80082FD29C08091E80080FF1AC080911E +:100F2000F20090E006C021912093F10061507040E2 +:100F300001966115710519F088309105A0F321E043 +:100F40008830910509F020E08091E8008E77809349 +:100F5000E8006115710591F6222381F605C08EB374 +:100F6000882361F0853061F08091E80082FFF7CF3F +:100F700080E0089583E0089581E0089582E0089577 +:100F800083E00895E82FF92F8091EE029091EF020F +:100F90008617970718F4BC0120E036C0611571056B +:100FA000D9F78091E8008E778093E800F5CF8EB373 +:100FB000882309F43EC08530C1F18091E80083FDAB +:100FC00036C08091E80082FD2AC08091E80080FF51 +:100FD0001BC08091F20090E007C024912093F100A3 +:100FE00031966150704001966115710519F0883095 +:100FF000910598F321E08830910509F020E0809177 +:10100000E8008E778093E8006115710581F6222350 +:1010100071F605C08EB3882361F0853061F0809150 +:10102000E80082FFF7CF80E0089583E0089581E033 +:10103000089582E0089583E00895982F2CC0292F09 +:101040002F702093E900981739F07091EC002091EF +:10105000ED005091F00003C0242F762F50E021FFC7 +:1010600019C03091EB003E7F3093EB003091ED00E2 +:101070003D7F3093ED003091EB0031603093EB0019 +:101080007093EC002093ED005093F0002091EE005F +:1010900027FF08C09F5F953090F28F708093E90022 +:1010A00081E0089580E00895EF92FF920F931F93DF +:1010B000CF93DF93162FE82EE7017E01F92EE7018B +:1010C00000E02AC09881992329F16B81E981FA8196 +:1010D0002C81892F8F70853018F56295660F660F09 +:1010E000607C991F9927991F692B223010F096E098 +:1010F00001C092E028E030E040E003C04F5F220FE3 +:10110000331F2E173F07D0F34295407F492B95DFC1 +:10111000882331F00F5F25960117A0F281E001C00E +:1011200080E0DF91CF911F910F91FF90EF90089594 +:101130008091E80287FF11C003C08EB38823B1F00D +:101140008091E80082FFF9CF8091E8008B7780934F +:10115000E80008958EB3882349F08091E80080FF6D +:10116000F9CF8091E8008E778093E8000895809110 +:10117000E4009091E50044E62091EC0020FF25C0BA +:101180002091E80020FD15C02EB32223A1F02530C8 +:10119000A1F02091EB0025FD12C02091E4003091D8 +:1011A000E5002817390741F3442359F04150C9019C +:1011B000E3CF80E0089582E0089583E0089581E020 +:1011C000089584E0089580E008952091E80022FFCA +:1011D000DBCFF9CF40D042D08091D8008F77809379 +:1011E000D8008091D80080688093D8008091D80082 +:1011F0008F7D8093D80084E089BD86E089BD09B4E5 +:1012000000FEFDCF1EBA1092E4021092E602109288 +:10121000E50280E060E042E010DF8091E1008E7F37 +:101220008093E1008091E20081608093E2008091F0 +:10123000E20088608093E2008091E0008E7F8093DE +:10124000E0000895E3E6F0E080818E7F808381E016 +:101250008093E702BFCF1092E20008951092E10060 +:1012600008951F920F920FB60F9211242F933F9360 +:101270004F935F936F937F938F939F93AF93BF939E +:10128000EF93FF938091E10082FF0AC08091E2001A +:1012900082FF06C08091E1008B7F8093E10022D223 +:1012A0008091E10080FF16C08091E20080FF12C0B3 +:1012B0008091E2008E7F8093E2008091E200806165 +:1012C0008093E2008091D80080628093D80019BC9E +:1012D0001EBADFD98091E10084FF2CC08091E2002A +:1012E00084FF28C084E089BD86E089BD09B400FE82 +:1012F000FDCF8091D8008F7D8093D8008091E10050 +:101300008F7E8093E1008091E2008F7E8093E200E7 +:101310008091E20081608093E2008091E402882362 +:1013200021F48091E30087FF02C084E001C081E0E6 +:101330008EBBAED98091E10083FF26C08091E20090 +:1013400083FF22C08091E100877F8093E10082E0EB +:101350008EBB1092E4028091E1008E7F8093E100C9 +:101360008091E2008E7F8093E2008091E2008061B4 +:101370008093E20080E060E042E05FDE8091F00078 +:1013800088608093F000AED1FF91EF91BF91AF9153 +:101390009F918F917F916F915F914F913F912F918D +:1013A0000F900FBE0F901F9018951F920F920FB6BF +:1013B0000F9211241F932F933F934F935F936F933B +:1013C0007F938F939F93AF93BF93EF93FF9310916E +:1013D000E9001F708091EC001092E9008091F0000C +:1013E000877F8093F00078941BD01092E900809161 +:1013F000F00088608093F0001093E900FF91EF9176 +:10140000BF91AF919F918F917F916F915F914F911C +:101410003F912F911F910F900FBE0F901F90189525 +:101420001F93DF93CF93CDB7DEB7AC970FB6F89489 +:10143000DEBF0FBECDBFE8EEF2E08091F1008193F8 +:1014400022E0E03FF207C9F729D98091E80083FF45 +:1014500031C18091E8022091E902253009F484C06D +:10146000263040F42130A1F1213070F0233009F012 +:1014700021C12EC0283009F4EFC0293009F4FEC084 +:10148000263009F017C192C0803821F0823809F067 +:1014900011C108C08091E5029091E602992371F094 +:1014A00082600CC08091EC028F708093E900909173 +:1014B000EB0081E095FF80E01092E9009091E80058 +:1014C000977F9093E8008093F1001092F100CFC0D5 +:1014D000882319F0823009F0EDC090E08F71907090 +:1014E000009729F08230910509F0E4C00BC080918B +:1014F000EA02813009F0DEC0233009F080E08093F9 +:10150000E6022CC08091EA02882341F52091EC028A +:101510002F7009F4CFC02093E9008091EB0080FF89 +:101520001DC08091E902833021F48091EB0080623C +:1015300013C08091EB0080618093EB0081E090E02C +:1015400002C0880F991F2A95E2F78093EA00109253 +:10155000EA008091EB0088608093EB001092E90034 +:101560008091E800877F86C0882309F0A3C010918E +:10157000EA021F778091E3008078812B8093E3005B +:101580008091E800877F8093E800D2DD8091E800B9 +:1015900080FFFCCF8091E30080688093E3001123FB +:1015A00011F083E001C082E08EBB84C0805882309D +:1015B00008F080C08091EA029091EB0223E08C3D1C +:1015C000920791F583E08C838AE28B835FB7F8946E +:1015D000DE01159680E090E04EE061E2E42FF0E05D +:1015E00060935700E49180FF03C0E295EF704F5F76 +:1015F000EF702E2F30E0EA3018F0295C3F4F02C028 +:10160000205D3F4F2D933D9301968431910531F735 +:101610005FBF8091E800877F8093E800CE0103964A +:101620006AE270E055DC12C06091EC02AE014F5FDF +:101630005F4F21DCBC01009709F43CC08091E800B9 +:10164000877F8093E80089819A819CDC8091E80003 +:101650008B778093E8002EC0803861F58091E80098 +:10166000877F8093E8008091E4028093F10080916D +:10167000E8008E778093E8005BDD1CC08823D1F4FE +:101680009091EA029230B0F48091E800877F8093D5 +:10169000E8009093E4024CDD8091E402882321F479 +:1016A0008091E30087FF02C084E001C081E08EBB2F +:1016B0000E944A038091E80083FF0AC08091E800FD +:1016C000877F8093E8008091EB0080628093EB003D +:1016D000AC960FB6F894DEBF0FBECDBFCF91DF91B1 +:1016E0001F91089508951F938EB38823A9F08091C8 +:1016F000E9008F709091EC0090FF02C010E801C0EB +:1017000010E0182B1092E9008091E80083FF01C0DF +:1017100087DE1F701093E9001F910895CF93DF9328 +:10172000EC018091E80083FFA3C0888190E02091C4 +:10173000EC023091ED022817390709F099C0809129 +:10174000E902813269F0823220F4803209F090C0DF +:101750003CC0823209F46BC0833209F089C07AC080 +:101760008091E802813A09F083C08091E800877F88 +:101770008093E8008091E80080FFFCCF8C899D89F0 +:10178000AE89BF898093F100292F3A2F4B2F55271F +:101790002093F1009D01442755272093F1008B2FC2 +:1017A0009927AA27BB278093F100888D8093F100A9 +:1017B000898D8093F1008A8D8093F1008091E800FB +:1017C0008E778093E800B4DC53C08091E8028132C8 +:1017D00009F04EC08091E800877F8093E80004C044 +:1017E0008EB3882309F444C08091E80082FFF8CFCB +:1017F0003091F1002091F1009091F1008091F10081 +:101800003C8B2D8B9E8B8F8B8091F100888F8091EC +:10181000F100898F8091F1008A8F8091E8008B77A9 +:101820008093E80085DCCE010E947C0321C080917A +:10183000E8028132E9F48091E800877F8093E80034 +:1018400077DC8091EA029091EB02998B888BCE0134 +:10185000D4D00EC08091E802813251F48091E8002A +:10186000877F8093E80064DCCE016091EA02C5D0F6 +:10187000DF91CF910895CF93DF93EC014096FC0167 +:101880008BE0DF011D928A95E9F782E08C838987DE +:1018900083E08E87CE01019661E006DC882359F053 +:1018A000CE01069661E000DC882329F0CE010B967C +:1018B00061E0FADB01C080E0DF91CF910895DF9312 +:1018C000CF930F92CDB7DEB7FC018EB38430F9F41D +:1018D00024893589468957892115310541055105E6 +:1018E000B1F081818F708093E9008091E80085FDDF +:1018F0000AC08091E8008E778093E800698337DC26 +:101900006981882329F46093F10080E001C082E0BE +:101910000F90CF91DF910895FC018EB3843019F5BB +:101920002489358946895789211531054105510595 +:10193000D1F081818F708093E9008091F20088233B +:10194000A1F09091E8008091E8008E778093E80004 +:1019500095FD0DC00CDC882359F49091E8009E772A +:101960009093E800089582E0089580E0089580E073 +:1019700008952EB3243099F4FC01248935894689D1 +:101980005789211531054105510549F021812F70F5 +:101990002093E9002091E80020FF01C0BDCF089509 +:1019A000FC018EB3843029F524893589468957890D +:1019B0002115310541055105E1F086818F70809335 +:1019C000E9008091E80082FF14C08091F200882332 +:1019D00021F02091F10030E002C02FEF3FEF809125 +:1019E000F200882341F48091E8008B778093E8002F +:1019F00002C02FEF3FEFC901089508955058BB274B +:101A0000AA270ED070C161D130F066D120F031F438 +:101A10009F3F11F41EF456C10EF4E095E7FB4CC154 +:101A2000E92F72D180F3BA1762077307840795070D +:101A300018F071F49EF58AC10EF4E0950B2EBA2FC2 +:101A4000A02D0B01B90190010C01CA01A0011124C4 +:101A5000FF27591B99F0593F50F4503E68F11A1670 +:101A6000F040A22F232F342F4427585FF3CF469501 +:101A700037952795A795F0405395C9F77EF41F1623 +:101A8000BA0B620B730B840BBAF09150A1F0FF0FED +:101A9000BB1F661F771F881FC2F70EC0BA0F621FD9 +:101AA000731F841F48F4879577956795B795F795C9 +:101AB0009E3F08F0B3CF9395880F08F09927EE0F5B +:101AC000979587950895D4D008F481E008950CD0B7 +:101AD0000AC102D140F0F9D030F021F45F3F19F093 +:101AE000EBC0511134C1EEC00FD198F39923C9F363 +:101AF0005523B1F3951B550BBB27AA276217730714 +:101B0000840738F09F5F5F4F220F331F441FAA1FC7 +:101B1000A9F333D00E2E3AF0E0E830D09150504087 +:101B2000E695001CCAF729D0FE2F27D0660F771F35 +:101B3000881FBB1F261737074807AB07B0E809F017 +:101B4000BB0B802DBF01FF2793585F4F2AF09E3FAC +:101B5000510568F0B1C0FBC05F3FECF3983EDCF389 +:101B6000869577956795B795F7959F5FC9F7880F25 +:101B7000911D9695879597F90895E1E0660F771F77 +:101B8000881FBB1F621773078407BA0720F0621B08 +:101B9000730B840BBA0BEE1F88F7E0950895BCD049 +:101BA00088F09F5790F0B92F9927B751A0F0D1F046 +:101BB000660F771F881F991F1AF0BA95C9F712C0D0 +:101BC000B13081F0C3D0B1E00895C0C0672F782F45 +:101BD0008827B85F39F0B93FCCF38695779567953C +:101BE000B395D9F73EF490958095709561957F4FA8 +:101BF0008F4F9F4F0895E89409C097FB3EF490954E +:101C00008095709561957F4F8F4F9F4F9923A9F0D5 +:101C1000F92F96E9BB279395F69587957795679564 +:101C2000B795F111F8CFFAF4BB0F11F460FF1BC0A8 +:101C30006F5F7F4F8F4F9F4F16C0882311F096E93B +:101C400011C0772321F09EE8872F762F05C06623E9 +:101C500071F096E8862F70E060E02AF09A95660FA2 +:101C6000771F881FDAF7880F9695879597F908955B +:101C7000990F0008550FAA0BE0E8FEEF161617069D +:101C8000E807F907C0F012161306E407F50798F005 +:101C9000621B730B840B950B39F40A2661F0232B1E +:101CA000242B252B21F408950A2609F4A140A6959A +:101CB0008FEF811D811D089597F99F6780E870E07F +:101CC00060E008959FEF80EC089500240A941616B2 +:101CD000170618060906089500240A94121613061A +:101CE000140605060895092E0394000C11F48823A8 +:101CF00052F0BB0F40F4BF2B11F460FF04C06F5FC4 +:101D00007F4F8F4F9F4F089557FD9058440F551F99 +:101D100059F05F3F71F04795880F97FB991F61F06D +:101D20009F3F79F087950895121613061406551FE4 +:101D3000F2CF4695F1DF08C0161617061806991F50 +:101D4000F1CF86957105610508940895E894BB2745 +:101D500066277727CB0197F908958ADF08F48FEF7C +:101D600008955527002480FF02C0060E571F660FF6 +:101D7000771F6115710521F096958795009799F762 +:101D8000952F802D0895AA1BBB1B51E107C0AA1FE8 +:101D9000BB1FA617B70710F0A61BB70B881F991F0C +:101DA0005A95A9F780959095BC01CD01089597FBB0 +:101DB000092E07260AD077FD04D0E5DF06D00020E3 +:101DC0001AF4709561957F4F0895F6F79095819577 +:101DD0009F4F0895A1E21A2EAA1BBB1BFD010DC047 +:101DE000AA1FBB1FEE1FFF1FA217B307E407F507CB +:101DF00020F0A21BB30BE40BF50B661F771F881FA7 +:101E0000991F1A9469F760957095809590959B013C +:101E1000AC01BD01CF010895FC0188279927E89402 +:101E200021912032E9F3293010F02E30C8F32B3203 +:101E300039F02D3231F4689403C01AD0820F911D0D +:101E4000219120532A30C8F31EF4909581959F4F1D +:101E50000895FB01DC014150504048F001900D9283 +:101E60000020C9F701C01D9241505040E0F708958D +:101E7000BC01880F991F880F991F860F971F880F25 +:081E8000991F0895F894FFCFAB +:101E8800785F706F733A20002020795F706F733A23 +:101E980020000D000D0A00474F544F20004D4F56AB +:101EA800452000796F752073656C656374656420DF +:101EB8007468652072656C617469766520706F73EB +:101EC8006974696F6E2064656D6F206D6F647573DA +:101ED8003A0A0D000083100000010410000001827E +:101EE8000800000100000000000000000000000AD7 +:0A1EF8000905063020EC0027010068 :00000001FF diff --git a/firmware/USBtoSerial.lss b/firmware/USBtoSerial.lss index a1312b9..4d9bd91 100644 --- a/firmware/USBtoSerial.lss +++ b/firmware/USBtoSerial.lss @@ -3,35 +3,35 @@ USBtoSerial.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn - 0 .data 0000006a 00800100 00001ab8 00001b4c 2**0 + 0 .data 0000007a 00800100 00001e88 00001f1c 2**0 CONTENTS, ALLOC, LOAD, DATA - 1 .text 00001ab8 00000000 00000000 00000094 2**1 + 1 .text 00001e88 00000000 00000000 00000094 2**1 CONTENTS, ALLOC, LOAD, READONLY, CODE - 2 .bss 0000013a 0080016a 0080016a 00001bb6 2**0 + 2 .bss 00000176 0080017a 0080017a 00001f96 2**0 ALLOC - 3 .stab 0000228c 00000000 00000000 00001bb8 2**2 + 3 .stab 0000255c 00000000 00000000 00001f98 2**2 CONTENTS, READONLY, DEBUGGING - 4 .stabstr 0000044f 00000000 00000000 00003e44 2**0 + 4 .stabstr 000004d5 00000000 00000000 000044f4 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_aranges 00000568 00000000 00000000 00004293 2**0 + 5 .debug_aranges 00000590 00000000 00000000 000049c9 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_pubnames 00000e6e 00000000 00000000 000047fb 2**0 + 6 .debug_pubnames 00000f05 00000000 00000000 00004f59 2**0 CONTENTS, READONLY, DEBUGGING - 7 .debug_info 00008f87 00000000 00000000 00005669 2**0 + 7 .debug_info 00009207 00000000 00000000 00005e5e 2**0 CONTENTS, READONLY, DEBUGGING - 8 .debug_abbrev 000021f5 00000000 00000000 0000e5f0 2**0 + 8 .debug_abbrev 0000220b 00000000 00000000 0000f065 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_line 0000781c 00000000 00000000 000107e5 2**0 + 9 .debug_line 00007b46 00000000 00000000 00011270 2**0 CONTENTS, READONLY, DEBUGGING - 10 .debug_frame 00000890 00000000 00000000 00018004 2**2 + 10 .debug_frame 000008e0 00000000 00000000 00018db8 2**2 CONTENTS, READONLY, DEBUGGING - 11 .debug_str 00003c87 00000000 00000000 00018894 2**0 + 11 .debug_str 00003d5d 00000000 00000000 00019698 2**0 CONTENTS, READONLY, DEBUGGING - 12 .debug_loc 00004764 00000000 00000000 0001c51b 2**0 + 12 .debug_loc 00004a7a 00000000 00000000 0001d3f5 2**0 CONTENTS, READONLY, DEBUGGING - 13 .debug_pubtypes 00001111 00000000 00000000 00020c7f 2**0 + 13 .debug_pubtypes 00001111 00000000 00000000 00021e6f 2**0 CONTENTS, READONLY, DEBUGGING - 14 .debug_ranges 000007c0 00000000 00000000 00021d90 2**0 + 14 .debug_ranges 00000818 00000000 00000000 00022f80 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: @@ -71,9 +71,8 @@ Disassembly of section .text: 26: 00 00 nop 28: a2 c0 rjmp .+324 ; 0x16e <__bad_interrupt> 2a: 00 00 nop - 2c: 7c c7 rjmp .+3832 ; 0xf26 <__vector_11> - 2e: 00 00 nop - 30: 0c 94 37 08 jmp 0x106e ; 0x106e <__vector_12> + 2c: 0c 94 31 09 jmp 0x1262 ; 0x1262 <__vector_11> + 30: 0c 94 d5 09 jmp 0x13aa ; 0x13aa <__vector_12> 34: 9c c0 rjmp .+312 ; 0x16e <__bad_interrupt> 36: 00 00 nop 38: 9a c0 rjmp .+308 ; 0x16e <__bad_interrupt> @@ -94,7 +93,7 @@ Disassembly of section .text: 56: 00 00 nop 58: 8a c0 rjmp .+276 ; 0x16e <__bad_interrupt> 5a: 00 00 nop - 5c: 4e c3 rjmp .+1692 ; 0x6fa <__vector_23> + 5c: 23 c3 rjmp .+1606 ; 0x6a4 <__vector_23> 5e: 00 00 nop 60: 86 c0 rjmp .+268 ; 0x16e <__bad_interrupt> 62: 00 00 nop @@ -159,18 +158,18 @@ Disassembly of section .text: 142: 11 e0 ldi r17, 0x01 ; 1 144: a0 e0 ldi r26, 0x00 ; 0 146: b1 e0 ldi r27, 0x01 ; 1 - 148: e8 eb ldi r30, 0xB8 ; 184 - 14a: fa e1 ldi r31, 0x1A ; 26 + 148: e8 e8 ldi r30, 0x88 ; 136 + 14a: fe e1 ldi r31, 0x1E ; 30 14c: 02 c0 rjmp .+4 ; 0x152 <__do_copy_data+0x10> 14e: 05 90 lpm r0, Z+ 150: 0d 92 st X+, r0 - 152: aa 36 cpi r26, 0x6A ; 106 + 152: aa 37 cpi r26, 0x7A ; 122 154: b1 07 cpc r27, r17 156: d9 f7 brne .-10 ; 0x14e <__do_copy_data+0xc> 00000158 <__do_clear_bss>: 158: 12 e0 ldi r17, 0x02 ; 2 - 15a: aa e6 ldi r26, 0x6A ; 106 + 15a: aa e7 ldi r26, 0x7A ; 122 15c: b1 e0 ldi r27, 0x01 ; 1 15e: 01 c0 rjmp .+2 ; 0x162 <.do_clear_bss_start> @@ -178,11 +177,11 @@ Disassembly of section .text: 160: 1d 92 st X+, r1 00000162 <.do_clear_bss_start>: - 162: a4 3a cpi r26, 0xA4 ; 164 + 162: a0 3f cpi r26, 0xF0 ; 240 164: b1 07 cpc r27, r17 166: e1 f7 brne .-8 ; 0x160 <.do_clear_bss_loop> - 168: 65 d4 rcall .+2250 ; 0xa34

- 16a: 0c 94 5a 0d jmp 0x1ab4 ; 0x1ab4 <_exit> + 168: 2f d6 rcall .+3166 ; 0xdc8
+ 16a: 0c 94 42 0f jmp 0x1e84 ; 0x1e84 <_exit> 0000016e <__bad_interrupt>: 16e: 48 cf rjmp .-368 ; 0x0 <__vectors> @@ -541,9 +540,9 @@ ISR( TIMER0_OVF_vect) { 2f4: 11 24 eor r1, r1 2f6: 8f 93 push r24 t0ovfcount++; - 2f8: 80 91 96 02 lds r24, 0x0296 + 2f8: 80 91 e2 02 lds r24, 0x02E2 2fc: 8f 5f subi r24, 0xFF ; 255 - 2fe: 80 93 96 02 sts 0x0296, r24 + 2fe: 80 93 e2 02 sts 0x02E2, r24 } 302: 8f 91 pop r24 304: 0f 90 pop r0 @@ -557,7 +556,7 @@ ISR( TIMER0_OVF_vect) { uint16_t t0ext(void) { return (t0ovfcount * 256 + (u16) TCNT0); // return current counter value 30e: 86 b5 in r24, 0x26 ; 38 - 310: 30 91 96 02 lds r19, 0x0296 + 310: 30 91 e2 02 lds r19, 0x02E2 314: 20 e0 ldi r18, 0x00 ; 0 316: 28 0f add r18, r24 318: 31 1d adc r19, r1 @@ -572,7 +571,7 @@ void t0rst(void) { TCNT0 = 0; // set counter to zero 31e: 16 bc out 0x26, r1 ; 38 t0ovfcount = 0; // set overflow counter to zero - 320: 10 92 96 02 sts 0x0296, r1 + 320: 10 92 e2 02 sts 0x02E2, r1 } 324: 08 95 ret @@ -610,12 +609,12 @@ u08 adb(void) { 340: bc 01 movw r22, r24 342: 80 e0 ldi r24, 0x00 ; 0 344: 90 e0 ldi r25, 0x00 ; 0 - 346: 0e 94 5b 0c call 0x18b6 ; 0x18b6 <__floatunsisf> + 346: 0e 94 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> 34a: 20 e0 ldi r18, 0x00 ; 0 34c: 30 e8 ldi r19, 0x80 ; 128 34e: 4e e0 ldi r20, 0x0E ; 14 350: 53 e4 ldi r21, 0x43 ; 67 - 352: 0e 94 c3 0b call 0x1786 ; 0x1786 <__cmpsf2> + 352: 0e 94 63 0d call 0x1ac6 ; 0x1ac6 <__cmpsf2> 356: 87 fd sbrc r24, 7 358: f2 cf rjmp .-28 ; 0x33e ; // Warteschleife @@ -642,12 +641,12 @@ u08 adb(void) { 36c: bc 01 movw r22, r24 36e: 80 e0 ldi r24, 0x00 ; 0 370: 90 e0 ldi r25, 0x00 ; 0 - 372: 0e 94 5b 0c call 0x18b6 ; 0x18b6 <__floatunsisf> + 372: 0e 94 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> 376: 20 e0 ldi r18, 0x00 ; 0 378: 30 e0 ldi r19, 0x00 ; 0 37a: 4c e8 ldi r20, 0x8C ; 140 37c: 52 e4 ldi r21, 0x42 ; 66 - 37e: 0e 94 c3 0b call 0x1786 ; 0x1786 <__cmpsf2> + 37e: 0e 94 63 0d call 0x1ac6 ; 0x1ac6 <__cmpsf2> 382: 87 fd sbrc r24, 7 384: f2 cf rjmp .-28 ; 0x36a ; @@ -660,12 +659,12 @@ u08 adb(void) { 38c: bc 01 movw r22, r24 38e: 80 e0 ldi r24, 0x00 ; 0 390: 90 e0 ldi r25, 0x00 ; 0 - 392: 0e 94 5b 0c call 0x18b6 ; 0x18b6 <__floatunsisf> + 392: 0e 94 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> 396: 20 e0 ldi r18, 0x00 ; 0 398: 30 e0 ldi r19, 0x00 ; 0 39a: 48 e4 ldi r20, 0x48 ; 72 39c: 53 e4 ldi r21, 0x43 ; 67 - 39e: 0e 94 c3 0b call 0x1786 ; 0x1786 <__cmpsf2> + 39e: 0e 94 63 0d call 0x1ac6 ; 0x1ac6 <__cmpsf2> 3a2: 87 fd sbrc r24, 7 3a4: f2 cf rjmp .-28 ; 0x38a 3a6: 41 c0 rjmp .+130 ; 0x42a @@ -682,7 +681,7 @@ u08 adb(void) { if (adb_werte[z_byte] & bitpos) 3ae: e1 2e mov r14, r17 3b0: ff 24 eor r15, r15 - 3b2: 8d e8 ldi r24, 0x8D ; 141 + 3b2: 89 ec ldi r24, 0xC9 ; 201 3b4: 92 e0 ldi r25, 0x02 ; 2 3b6: e8 0e add r14, r24 3b8: f9 1e adc r15, r25 @@ -707,12 +706,12 @@ u08 adb(void) { 3ca: bc 01 movw r22, r24 3cc: 80 e0 ldi r24, 0x00 ; 0 3ce: 90 e0 ldi r25, 0x00 ; 0 - 3d0: 0e 94 5b 0c call 0x18b6 ; 0x18b6 <__floatunsisf> + 3d0: 0e 94 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> 3d4: 20 e0 ldi r18, 0x00 ; 0 3d6: 30 e0 ldi r19, 0x00 ; 0 3d8: 4c e8 ldi r20, 0x8C ; 140 3da: 52 e4 ldi r21, 0x42 ; 66 - 3dc: 0e 94 c3 0b call 0x1786 ; 0x1786 <__cmpsf2> + 3dc: 0e 94 63 0d call 0x1ac6 ; 0x1ac6 <__cmpsf2> 3e0: 87 fd sbrc r24, 7 3e2: f2 cf rjmp .-28 ; 0x3c8 3e4: 0e c0 rjmp .+28 ; 0x402 @@ -723,12 +722,12 @@ u08 adb(void) { 3e8: bc 01 movw r22, r24 3ea: 80 e0 ldi r24, 0x00 ; 0 3ec: 90 e0 ldi r25, 0x00 ; 0 - 3ee: 0e 94 5b 0c call 0x18b6 ; 0x18b6 <__floatunsisf> + 3ee: 0e 94 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> 3f2: 20 e0 ldi r18, 0x00 ; 0 3f4: 30 e0 ldi r19, 0x00 ; 0 3f6: 42 e0 ldi r20, 0x02 ; 2 3f8: 53 e4 ldi r21, 0x43 ; 67 - 3fa: 0e 94 c3 0b call 0x1786 ; 0x1786 <__cmpsf2> + 3fa: 0e 94 63 0d call 0x1ac6 ; 0x1ac6 <__cmpsf2> 3fe: 87 fd sbrc r24, 7 400: f2 cf rjmp .-28 ; 0x3e6 ; @@ -741,12 +740,12 @@ u08 adb(void) { 408: bc 01 movw r22, r24 40a: 80 e0 ldi r24, 0x00 ; 0 40c: 90 e0 ldi r25, 0x00 ; 0 - 40e: 0e 94 5b 0c call 0x18b6 ; 0x18b6 <__floatunsisf> + 40e: 0e 94 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> 412: 20 e0 ldi r18, 0x00 ; 0 414: 30 e0 ldi r19, 0x00 ; 0 416: 48 e4 ldi r20, 0x48 ; 72 418: 53 e4 ldi r21, 0x43 ; 67 - 41a: 0e 94 c3 0b call 0x1786 ; 0x1786 <__cmpsf2> + 41a: 0e 94 63 0d call 0x1ac6 ; 0x1ac6 <__cmpsf2> 41e: 87 fd sbrc r24, 7 420: f2 cf rjmp .-28 ; 0x406 ADB_POUT |= ADB_BIT; @@ -784,12 +783,12 @@ u08 adb(void) { 438: bc 01 movw r22, r24 43a: 80 e0 ldi r24, 0x00 ; 0 43c: 90 e0 ldi r25, 0x00 ; 0 - 43e: 0e 94 5b 0c call 0x18b6 ; 0x18b6 <__floatunsisf> + 43e: 0e 94 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> 442: 20 e0 ldi r18, 0x00 ; 0 444: 30 e0 ldi r19, 0x00 ; 0 446: 42 e0 ldi r20, 0x02 ; 2 448: 53 e4 ldi r21, 0x43 ; 67 - 44a: 0e 94 c3 0b call 0x1786 ; 0x1786 <__cmpsf2> + 44a: 0e 94 63 0d call 0x1ac6 ; 0x1ac6 <__cmpsf2> 44e: 87 fd sbrc r24, 7 450: f2 cf rjmp .-28 ; 0x436 ; @@ -802,19 +801,19 @@ u08 adb(void) { 458: bc 01 movw r22, r24 45a: 80 e0 ldi r24, 0x00 ; 0 45c: 90 e0 ldi r25, 0x00 ; 0 - 45e: 0e 94 5b 0c call 0x18b6 ; 0x18b6 <__floatunsisf> + 45e: 0e 94 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> 462: 20 e0 ldi r18, 0x00 ; 0 464: 30 e0 ldi r19, 0x00 ; 0 466: 48 e4 ldi r20, 0x48 ; 72 468: 53 e4 ldi r21, 0x43 ; 67 - 46a: 0e 94 c3 0b call 0x1786 ; 0x1786 <__cmpsf2> + 46a: 0e 94 63 0d call 0x1ac6 ; 0x1ac6 <__cmpsf2> 46e: 87 fd sbrc r24, 7 470: f2 cf rjmp .-28 ; 0x456 ; // Entscheidung, ob noch weitere Daten übertragen werden if (adb_werte[0] == COM_LISTEN3) - 472: 80 91 8d 02 lds r24, 0x028D + 472: 80 91 c9 02 lds r24, 0x02C9 476: 8b 33 cpi r24, 0x3B ; 59 478: 29 f0 breq .+10 ; 0x484 anzahl_out = 2 + 1; @@ -853,12 +852,12 @@ u08 adb(void) { 492: bc 01 movw r22, r24 494: 80 e0 ldi r24, 0x00 ; 0 496: 90 e0 ldi r25, 0x00 ; 0 - 498: 0e 94 5b 0c call 0x18b6 ; 0x18b6 <__floatunsisf> + 498: 0e 94 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> 49c: 20 e0 ldi r18, 0x00 ; 0 49e: 30 e0 ldi r19, 0x00 ; 0 4a0: 4a ef ldi r20, 0xFA ; 250 4a2: 53 e4 ldi r21, 0x43 ; 67 - 4a4: 0e 94 0d 0d call 0x1a1a ; 0x1a1a <__gesf2> + 4a4: 0e 94 ad 0e call 0x1d5a ; 0x1d5a <__gesf2> 4a8: 18 16 cp r1, r24 4aa: 0c f4 brge .+2 ; 0x4ae 4ac: 42 c0 rjmp .+132 ; 0x532 <__stack+0x33> @@ -870,7 +869,7 @@ u08 adb(void) { while (!(ADB_PIN & ADB_BIT)) 4b2: 48 9b sbis 0x09, 0 ; 9 4b4: fe cf rjmp .-4 ; 0x4b2 - 4b6: ce e8 ldi r28, 0x8E ; 142 + 4b6: ca ec ldi r28, 0xCA ; 202 4b8: d2 e0 ldi r29, 0x02 ; 2 4ba: 11 e0 ldi r17, 0x01 ; 1 4bc: 01 c0 rjmp .+2 ; 0x4c0 @@ -903,12 +902,12 @@ u08 adb(void) { 4ce: bc 01 movw r22, r24 4d0: 80 e0 ldi r24, 0x00 ; 0 4d2: 90 e0 ldi r25, 0x00 ; 0 - 4d4: 0e 94 5b 0c call 0x18b6 ; 0x18b6 <__floatunsisf> + 4d4: 0e 94 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> 4d8: 20 e0 ldi r18, 0x00 ; 0 4da: 30 e0 ldi r19, 0x00 ; 0 4dc: 48 e4 ldi r20, 0x48 ; 72 4de: 53 e4 ldi r21, 0x43 ; 67 - 4e0: 0e 94 0d 0d call 0x1a1a ; 0x1a1a <__gesf2> + 4e0: 0e 94 ad 0e call 0x1d5a ; 0x1d5a <__gesf2> 4e4: 18 16 cp r1, r24 4e6: 14 f4 brge .+4 ; 0x4ec return (z_byte - 1); @@ -929,12 +928,12 @@ u08 adb(void) { 4f8: bc 01 movw r22, r24 4fa: 80 e0 ldi r24, 0x00 ; 0 4fc: 90 e0 ldi r25, 0x00 ; 0 - 4fe: 0e 94 5b 0c call 0x18b6 ; 0x18b6 <__floatunsisf> + 4fe: 0e 94 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> 502: 20 e0 ldi r18, 0x00 ; 0 504: 30 e0 ldi r19, 0x00 ; 0 506: 48 ec ldi r20, 0xC8 ; 200 508: 52 e4 ldi r21, 0x42 ; 66 - 50a: 0e 94 c3 0b call 0x1786 ; 0x1786 <__cmpsf2> + 50a: 0e 94 63 0d call 0x1ac6 ; 0x1ac6 <__cmpsf2> 50e: 87 ff sbrs r24, 7 510: 03 c0 rjmp .+6 ; 0x518 <__stack+0x19> adb_werte[z_byte] += bitpos; @@ -1021,5175 +1020,5774 @@ void touchpad_init(void) { uint8_t touchpad_read(void) { adb_werte[0] = COM_TALK0; 556: 8c e3 ldi r24, 0x3C ; 60 - 558: 80 93 8d 02 sts 0x028D, r24 + 558: 80 93 c9 02 sts 0x02C9, r24 adb_data_length = adb(); 55c: e4 de rcall .-568 ; 0x326 - 55e: 80 93 97 02 sts 0x0297, r24 + 55e: 80 93 e3 02 sts 0x02E3, r24 return adb_data_length; - 562: 80 91 97 02 lds r24, 0x0297 + 562: 80 91 e3 02 lds r24, 0x02E3 } 566: 08 95 ret -00000568 : +00000568 : + _delay_ms(100); +} -void touchpad_set_abs_mode(void) { - // Auf Absolutmodus umschalten +void touchpad_set_rel_mode_100dpi(void) { + // Auf Relativmodus umschalten adb_werte[0] = COM_LISTEN3; 568: 8b e3 ldi r24, 0x3B ; 59 - 56a: 80 93 8d 02 sts 0x028D, r24 + 56a: 80 93 c9 02 sts 0x02C9, r24 adb_werte[1] = BITS(0110,0011); 56e: 83 e6 ldi r24, 0x63 ; 99 - 570: 80 93 8e 02 sts 0x028E, r24 - adb_werte[2] = 4; //CDM Modus - 574: 84 e0 ldi r24, 0x04 ; 4 - 576: 80 93 8f 02 sts 0x028F, r24 + 570: 80 93 ca 02 sts 0x02CA, r24 + adb_werte[2] = 1; //default modus: 100 dpi mouse + 574: 81 e0 ldi r24, 0x01 ; 1 + 576: 80 93 cb 02 sts 0x02CB, r24 adb(); 57a: d5 de rcall .-598 ; 0x326 - - adb_werte[0] = COM_TALK1; - 57c: 8d e3 ldi r24, 0x3D ; 61 - 57e: 80 93 8d 02 sts 0x028D, r24 - adb(); // Werte holen - 582: d1 de rcall .-606 ; 0x326 - - adb_werte[0] = COM_LISTEN1; - 584: 89 e3 ldi r24, 0x39 ; 57 - 586: 80 93 8d 02 sts 0x028D, r24 - adb_werte[7] = 0x00; //Absolutmodus - 58a: 10 92 94 02 sts 0x0294, r1 - adb(); - 58e: cb de rcall .-618 ; 0x326 #else //round up by default __ticks_dc = (uint32_t)(ceil(fabs(__tmp))); #endif __builtin_avr_delay_cycles(__ticks_dc); - 590: 8f ef ldi r24, 0xFF ; 255 - 592: 91 ee ldi r25, 0xE1 ; 225 - 594: a4 e0 ldi r26, 0x04 ; 4 - 596: 81 50 subi r24, 0x01 ; 1 - 598: 90 40 sbci r25, 0x00 ; 0 - 59a: a0 40 sbci r26, 0x00 ; 0 - 59c: e1 f7 brne .-8 ; 0x596 - 59e: 00 c0 rjmp .+0 ; 0x5a0 - 5a0: 00 00 nop - _delay_ms(100); -} - 5a2: 08 95 ret - -000005a4 : - -void touchpad_set_rel_mode_100dpi(void) { - // Auf Relativmodus umschalten - adb_werte[0] = COM_LISTEN3; - 5a4: 8b e3 ldi r24, 0x3B ; 59 - 5a6: 80 93 8d 02 sts 0x028D, r24 - adb_werte[1] = BITS(0110,0011); - 5aa: 83 e6 ldi r24, 0x63 ; 99 - 5ac: 80 93 8e 02 sts 0x028E, r24 - adb_werte[2] = 1; //default modus: 100 dpi mouse - 5b0: 81 e0 ldi r24, 0x01 ; 1 - 5b2: 80 93 8f 02 sts 0x028F, r24 - adb(); - 5b6: b7 de rcall .-658 ; 0x326 - 5b8: 8f ef ldi r24, 0xFF ; 255 - 5ba: 91 ee ldi r25, 0xE1 ; 225 - 5bc: a4 e0 ldi r26, 0x04 ; 4 - 5be: 81 50 subi r24, 0x01 ; 1 - 5c0: 90 40 sbci r25, 0x00 ; 0 - 5c2: a0 40 sbci r26, 0x00 ; 0 - 5c4: e1 f7 brne .-8 ; 0x5be - 5c6: 00 c0 rjmp .+0 ; 0x5c8 - 5c8: 00 00 nop + 57c: 8f ef ldi r24, 0xFF ; 255 + 57e: 91 ee ldi r25, 0xE1 ; 225 + 580: a4 e0 ldi r26, 0x04 ; 4 + 582: 81 50 subi r24, 0x01 ; 1 + 584: 90 40 sbci r25, 0x00 ; 0 + 586: a0 40 sbci r26, 0x00 ; 0 + 588: e1 f7 brne .-8 ; 0x582 + 58a: 00 c0 rjmp .+0 ; 0x58c + 58c: 00 00 nop _delay_ms(100); } - 5ca: 08 95 ret + 58e: 08 95 ret -000005cc : +00000590 : return ((adb_werte[4] & 0b01110000) << 6) | ((adb_werte[3] & 0b01110000) << 3) | (adb_werte[1] & 0b01111111); } int8_t delta_y(void) { if(adb_data_length ==0) { - 5cc: 80 91 97 02 lds r24, 0x0297 - 5d0: 88 23 and r24, r24 - 5d2: 51 f0 breq .+20 ; 0x5e8 + 590: 80 91 e3 02 lds r24, 0x02E3 + 594: 88 23 and r24, r24 + 596: 51 f0 breq .+20 ; 0x5ac return 0; } if (adb_werte[1] & 0b01000000) { - 5d4: 80 91 8e 02 lds r24, 0x028E - 5d8: 86 ff sbrs r24, 6 - 5da: 04 c0 rjmp .+8 ; 0x5e4 + 598: 80 91 ca 02 lds r24, 0x02CA + 59c: 86 ff sbrs r24, 6 + 59e: 04 c0 rjmp .+8 ; 0x5a8 return -((128 - adb_werte[1]) & 0b00111111); - 5dc: 81 95 neg r24 - 5de: 8f 73 andi r24, 0x3F ; 63 - 5e0: 81 95 neg r24 - 5e2: 08 95 ret + 5a0: 81 95 neg r24 + 5a2: 8f 73 andi r24, 0x3F ; 63 + 5a4: 81 95 neg r24 + 5a6: 08 95 ret } else { return adb_werte[1] & 0b00111111; - 5e4: 8f 73 andi r24, 0x3F ; 63 - 5e6: 08 95 ret + 5a8: 8f 73 andi r24, 0x3F ; 63 + 5aa: 08 95 ret | ((adb_werte[3] & 0b01110000) << 3) | (adb_werte[1] & 0b01111111); } int8_t delta_y(void) { if(adb_data_length ==0) { return 0; - 5e8: 80 e0 ldi r24, 0x00 ; 0 + 5ac: 80 e0 ldi r24, 0x00 ; 0 if (adb_werte[1] & 0b01000000) { return -((128 - adb_werte[1]) & 0b00111111); } else { return adb_werte[1] & 0b00111111; } } - 5ea: 08 95 ret + 5ae: 08 95 ret -000005ec : +000005b0 : int8_t delta_x(void) { if(adb_data_length ==0) { - 5ec: 80 91 97 02 lds r24, 0x0297 - 5f0: 88 23 and r24, r24 - 5f2: 51 f0 breq .+20 ; 0x608 + 5b0: 80 91 e3 02 lds r24, 0x02E3 + 5b4: 88 23 and r24, r24 + 5b6: 51 f0 breq .+20 ; 0x5cc return 0; } if (adb_werte[2] & 0b01000000) { - 5f4: 80 91 8f 02 lds r24, 0x028F - 5f8: 86 ff sbrs r24, 6 - 5fa: 04 c0 rjmp .+8 ; 0x604 + 5b8: 80 91 cb 02 lds r24, 0x02CB + 5bc: 86 ff sbrs r24, 6 + 5be: 04 c0 rjmp .+8 ; 0x5c8 return -((128 - adb_werte[2]) & 0b00111111); - 5fc: 81 95 neg r24 - 5fe: 8f 73 andi r24, 0x3F ; 63 - 600: 81 95 neg r24 - 602: 08 95 ret + 5c0: 81 95 neg r24 + 5c2: 8f 73 andi r24, 0x3F ; 63 + 5c4: 81 95 neg r24 + 5c6: 08 95 ret } else { return adb_werte[2] & 0b00111111; - 604: 8f 73 andi r24, 0x3F ; 63 - 606: 08 95 ret + 5c8: 8f 73 andi r24, 0x3F ; 63 + 5ca: 08 95 ret } } int8_t delta_x(void) { if(adb_data_length ==0) { return 0; - 608: 80 e0 ldi r24, 0x00 ; 0 + 5cc: 80 e0 ldi r24, 0x00 ; 0 if (adb_werte[2] & 0b01000000) { return -((128 - adb_werte[2]) & 0b00111111); } else { return adb_werte[2] & 0b00111111; } } - 60a: 08 95 ret + 5ce: 08 95 ret -0000060c : +000005d0 : void Usb2SerialTask(void) { - 60c: 1f 93 push r17 + 5d0: 1f 93 push r17 static inline uint_reg_t GetGlobalInterruptMask(void) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) return SREG; - 60e: 8f b7 in r24, 0x3f ; 63 + 5d2: 8f b7 in r24, 0x3f ; 63 static inline void GlobalInterruptDisable(void) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) cli(); - 610: f8 94 cli + 5d4: f8 94 cli uint16_t Count; uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask(); GlobalInterruptDisable(); Count = Buffer->Count; - 612: 20 91 74 01 lds r18, 0x0174 - 616: 30 91 75 01 lds r19, 0x0175 + 5d6: 20 91 88 01 lds r18, 0x0188 + 5da: 30 91 89 01 lds r19, 0x0189 static inline void SetGlobalInterruptMask(const uint_reg_t GlobalIntState) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) SREG = GlobalIntState; - 61a: 8f bf out 0x3f, r24 ; 63 + 5de: 8f bf out 0x3f, r24 ; 63 /* Only try to read in bytes from the CDC interface if the transmit buffer is not full */ if (!(RingBuffer_IsFull(&USBtoUSART_Buffer))) - 61c: 80 91 72 01 lds r24, 0x0172 - 620: 90 91 73 01 lds r25, 0x0173 - 624: 28 17 cp r18, r24 - 626: 39 07 cpc r19, r25 - 628: 51 f0 breq .+20 ; 0x63e + 5e0: 80 91 86 01 lds r24, 0x0186 + 5e4: 90 91 87 01 lds r25, 0x0187 + 5e8: 28 17 cp r18, r24 + 5ea: 39 07 cpc r19, r25 + 5ec: 51 f0 breq .+20 ; 0x602 { int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface); - 62a: 85 e4 ldi r24, 0x45 ; 69 - 62c: 91 e0 ldi r25, 0x01 ; 1 - 62e: 0e 94 30 0b call 0x1660 ; 0x1660 - 632: bc 01 movw r22, r24 + 5ee: 84 e5 ldi r24, 0x54 ; 84 + 5f0: 91 e0 ldi r25, 0x01 ; 1 + 5f2: 0e 94 d0 0c call 0x19a0 ; 0x19a0 + 5f6: bc 01 movw r22, r24 /* Read bytes from the USB OUT endpoint into the USART transmit buffer */ if (!(ReceivedByte < 0)) - 634: 97 fd sbrc r25, 7 - 636: 03 c0 rjmp .+6 ; 0x63e + 5f8: 97 fd sbrc r25, 7 + 5fa: 03 c0 rjmp .+6 ; 0x602 RingBuffer_Insert(&USBtoUSART_Buffer, ReceivedByte); - 638: 8a e6 ldi r24, 0x6A ; 106 - 63a: 91 e0 ldi r25, 0x01 ; 1 - 63c: 99 dd rcall .-1230 ; 0x170 + 5fc: 8e e7 ldi r24, 0x7E ; 126 + 5fe: 91 e0 ldi r25, 0x01 ; 1 + 600: b7 dd rcall .-1170 ; 0x170 static inline uint_reg_t GetGlobalInterruptMask(void) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) return SREG; - 63e: 2f b7 in r18, 0x3f ; 63 + 602: 2f b7 in r18, 0x3f ; 63 static inline void GlobalInterruptDisable(void) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) cli(); - 640: f8 94 cli - 642: 80 91 00 02 lds r24, 0x0200 - 646: 90 91 01 02 lds r25, 0x0201 + 604: f8 94 cli + 606: 80 91 14 02 lds r24, 0x0214 + 60a: 90 91 15 02 lds r25, 0x0215 static inline void SetGlobalInterruptMask(const uint_reg_t GlobalIntState) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) SREG = GlobalIntState; - 64a: 2f bf out 0x3f, r18 ; 63 + 60e: 2f bf out 0x3f, r18 ; 63 } /* Check if the UART receive buffer flush timer has expired or the buffer is nearly full */ uint16_t BufferCount = RingBuffer_GetCount(&USARTtoUSB_Buffer); if (BufferCount) - 64c: 00 97 sbiw r24, 0x00 ; 0 - 64e: 01 f1 breq .+64 ; 0x690 + 610: 00 97 sbiw r24, 0x00 ; 0 + 612: 09 f1 breq .+66 ; 0x656 */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 650: 20 91 46 01 lds r18, 0x0146 - 654: 2f 70 andi r18, 0x0F ; 15 - 656: 20 93 e9 00 sts 0x00E9, r18 + 614: 20 91 55 01 lds r18, 0x0155 + 618: 2f 70 andi r18, 0x0F ; 15 + 61a: 20 93 e9 00 sts 0x00E9, r18 * \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise. */ static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsINReady(void) { return ((UEINTX & (1 << TXINI)) ? true : false); - 65a: 20 91 e8 00 lds r18, 0x00E8 + 61e: 20 91 e8 00 lds r18, 0x00E8 { Endpoint_SelectEndpoint(VirtualSerial_CDC_Interface.Config.DataINEndpoint.Address); /* Check if a packet is already enqueued to the host - if so, we shouldn't try to send more data * until it completes as there is a chance nothing is listening and a lengthy timeout could occur */ if (Endpoint_IsINReady()) - 65e: 20 ff sbrs r18, 0 - 660: 17 c0 rjmp .+46 ; 0x690 + 622: 20 ff sbrs r18, 0 + 624: 18 c0 rjmp .+48 ; 0x656 { /* Never send more than one bank size less one byte to the host at a time, so that we don't block * while a Zero Length Packet (ZLP) to terminate the transfer is sent if the host isn't listening */ uint8_t BytesToSend = MIN(BufferCount, (CDC_TXRX_EPSIZE - 1)); - 662: 80 31 cpi r24, 0x10 ; 16 - 664: 91 05 cpc r25, r1 - 666: 10 f0 brcs .+4 ; 0x66c - 668: 8f e0 ldi r24, 0x0F ; 15 - 66a: 90 e0 ldi r25, 0x00 ; 0 - 66c: 18 2f mov r17, r24 + 626: 80 31 cpi r24, 0x10 ; 16 + 628: 91 05 cpc r25, r1 + 62a: 10 f0 brcs .+4 ; 0x630 + 62c: 8f e0 ldi r24, 0x0F ; 15 + 62e: 90 e0 ldi r25, 0x00 ; 0 + 630: 18 2f mov r17, r24 /* Read bytes from the USART receive buffer into the USB IN endpoint */ while (BytesToSend--) - 66e: 0e c0 rjmp .+28 ; 0x68c + 632: 0f c0 rjmp .+30 ; 0x652 * \return Next data element stored in the buffer. */ static inline uint8_t RingBuffer_Peek(RingBuffer_t* const Buffer) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); static inline uint8_t RingBuffer_Peek(RingBuffer_t* const Buffer) { return *Buffer->Out; - 670: e0 91 f8 01 lds r30, 0x01F8 - 674: f0 91 f9 01 lds r31, 0x01F9 + 634: e0 91 0c 02 lds r30, 0x020C + 638: f0 91 0d 02 lds r31, 0x020D { /* Try to send the next byte of data to the host, abort if there is an error without dequeuing */ if (CDC_Device_SendByte(&VirtualSerial_CDC_Interface, - 678: 85 e4 ldi r24, 0x45 ; 69 - 67a: 91 e0 ldi r25, 0x01 ; 1 - 67c: 60 81 ld r22, Z - 67e: 7f d7 rcall .+3838 ; 0x157e - 680: 11 50 subi r17, 0x01 ; 1 - 682: 88 23 and r24, r24 - 684: 29 f4 brne .+10 ; 0x690 + 63c: 84 e5 ldi r24, 0x54 ; 84 + 63e: 91 e0 ldi r25, 0x01 ; 1 + 640: 60 81 ld r22, Z + 642: 0e 94 5f 0c call 0x18be ; 0x18be + 646: 11 50 subi r17, 0x01 ; 1 + 648: 88 23 and r24, r24 + 64a: 29 f4 brne .+10 ; 0x656 { break; } /* Dequeue the already sent byte from the buffer now we have confirmed that no transmission error occurred */ RingBuffer_Remove(&USARTtoUSB_Buffer); - 686: 86 ef ldi r24, 0xF6 ; 246 - 688: 91 e0 ldi r25, 0x01 ; 1 - 68a: 8d dd rcall .-1254 ; 0x1a6 + 64c: 8a e0 ldi r24, 0x0A ; 10 + 64e: 92 e0 ldi r25, 0x02 ; 2 + 650: aa dd rcall .-1196 ; 0x1a6 /* Never send more than one bank size less one byte to the host at a time, so that we don't block * while a Zero Length Packet (ZLP) to terminate the transfer is sent if the host isn't listening */ uint8_t BytesToSend = MIN(BufferCount, (CDC_TXRX_EPSIZE - 1)); /* Read bytes from the USART receive buffer into the USB IN endpoint */ while (BytesToSend--) - 68c: 11 23 and r17, r17 - 68e: 81 f7 brne .-32 ; 0x670 - static inline uint_reg_t GetGlobalInterruptMask(void) - { - GCC_MEMORY_BARRIER(); - - #if (ARCH == ARCH_AVR8) - return SREG; - 690: 2f b7 in r18, 0x3f ; 63 - static inline void GlobalInterruptDisable(void) - { - GCC_MEMORY_BARRIER(); - - #if (ARCH == ARCH_AVR8) - cli(); - 692: f8 94 cli - uint16_t Count; - - uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask(); - GlobalInterruptDisable(); - - Count = Buffer->Count; - 694: 80 91 74 01 lds r24, 0x0174 - 698: 90 91 75 01 lds r25, 0x0175 - static inline void SetGlobalInterruptMask(const uint_reg_t GlobalIntState) - { - GCC_MEMORY_BARRIER(); - - #if (ARCH == ARCH_AVR8) - SREG = GlobalIntState; - 69c: 2f bf out 0x3f, r18 ; 63 - } - } - } - - /* Load the next byte from the USART transmit buffer into the USART */ - if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) { - 69e: 00 97 sbiw r24, 0x00 ; 0 - 6a0: 49 f0 breq .+18 ; 0x6b4 - Serial_SendByte(RingBuffer_Remove(&USBtoUSART_Buffer)); - 6a2: 8a e6 ldi r24, 0x6A ; 106 - 6a4: 91 e0 ldi r25, 0x01 ; 1 - 6a6: 7f dd rcall .-1282 ; 0x1a6 - * \param[in] DataByte Byte to transmit through the USART. - */ - static inline void Serial_SendByte(const char DataByte) ATTR_ALWAYS_INLINE; - static inline void Serial_SendByte(const char DataByte) - { - while (!(UCSR1A & (1 << UDRE1))); - 6a8: 90 91 c8 00 lds r25, 0x00C8 - 6ac: 95 ff sbrs r25, 5 - 6ae: fc cf rjmp .-8 ; 0x6a8 - UDR1 = DataByte; - 6b0: 80 93 ce 00 sts 0x00CE, r24 + 652: 11 23 and r17, r17 + 654: 79 f7 brne .-34 ; 0x634 +// if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) { +// Serial_SendByte(RingBuffer_Remove(&USBtoUSART_Buffer)); // dummy = RingBuffer_Remove(&USBtoUSART_Buffer); // sendPayload(&dummy,1,0); - } +// } CDC_Device_USBTask(&VirtualSerial_CDC_Interface); - 6b4: 85 e4 ldi r24, 0x45 ; 69 - 6b6: 91 e0 ldi r25, 0x01 ; 1 - 6b8: bc d7 rcall .+3960 ; 0x1632 + 656: 84 e5 ldi r24, 0x54 ; 84 + 658: 91 e0 ldi r25, 0x01 ; 1 + 65a: 0e 94 b9 0c call 0x1972 ; 0x1972 USB_USBTask(); - 6ba: 76 d6 rcall .+3308 ; 0x13a8 + 65e: 0e 94 73 0b call 0x16e6 ; 0x16e6 } - 6bc: 1f 91 pop r17 - 6be: 08 95 ret + 662: 1f 91 pop r17 + 664: 08 95 ret -000006c0 : +00000666 : /** Configures the board hardware and chip peripherals for the demo's functionality. */ void SetupHardware(void) { /* Disable watchdog if enabled by bootloader/fuses */ MCUSR &= ~(1 << WDRF); - 6c0: 84 b7 in r24, 0x34 ; 52 - 6c2: 87 7f andi r24, 0xF7 ; 247 - 6c4: 84 bf out 0x34, r24 ; 52 + 666: 84 b7 in r24, 0x34 ; 52 + 668: 87 7f andi r24, 0xF7 ; 247 + 66a: 84 bf out 0x34, r24 ; 52 wdt_disable(); - 6c6: 88 e1 ldi r24, 0x18 ; 24 - 6c8: 0f b6 in r0, 0x3f ; 63 - 6ca: f8 94 cli - 6cc: 80 93 60 00 sts 0x0060, r24 - 6d0: 10 92 60 00 sts 0x0060, r1 - 6d4: 0f be out 0x3f, r0 ; 63 + 66c: 88 e1 ldi r24, 0x18 ; 24 + 66e: 0f b6 in r0, 0x3f ; 63 + 670: f8 94 cli + 672: 80 93 60 00 sts 0x0060, r24 + 676: 10 92 60 00 sts 0x0060, r1 + 67a: 0f be out 0x3f, r0 ; 63 The type of x is clock_div_t. */ void clock_prescale_set(clock_div_t __x) { uint8_t __tmp = _BV(CLKPCE); __asm__ __volatile__ ( - 6d6: 90 e0 ldi r25, 0x00 ; 0 - 6d8: 80 e8 ldi r24, 0x80 ; 128 - 6da: 0f b6 in r0, 0x3f ; 63 - 6dc: f8 94 cli - 6de: 80 93 61 00 sts 0x0061, r24 - 6e2: 90 93 61 00 sts 0x0061, r25 - 6e6: 0f be out 0x3f, r0 ; 63 + 67c: 90 e0 ldi r25, 0x00 ; 0 + 67e: 80 e8 ldi r24, 0x80 ; 128 + 680: 0f b6 in r0, 0x3f ; 63 + 682: f8 94 cli + 684: 80 93 61 00 sts 0x0061, r24 + 688: 90 93 61 00 sts 0x0061, r25 + 68c: 0f be out 0x3f, r0 ; 63 clock_prescale_set(clock_div_1); /* Hardware Initialization */ // LEDs_Init(); USB_Init(); } - 6e8: 0f c4 rjmp .+2078 ; 0xf08 + 68e: da c5 rjmp .+2996 ; 0x1244 -000006ea : +00000690 : /** Event handler for the library USB Connection event. */ void EVENT_USB_Device_Connect(void) { // LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); } - 6ea: 08 95 ret + 690: 08 95 ret -000006ec : +00000692 : /** Event handler for the library USB Disconnection event. */ void EVENT_USB_Device_Disconnect(void) { // LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); } - 6ec: 08 95 ret + 692: 08 95 ret -000006ee : +00000694 : /** Event handler for the library USB Configuration Changed event. */ void EVENT_USB_Device_ConfigurationChanged(void) { bool ConfigSuccess = true; ConfigSuccess &= CDC_Device_ConfigureEndpoints(&VirtualSerial_CDC_Interface); - 6ee: 85 e4 ldi r24, 0x45 ; 69 - 6f0: 91 e0 ldi r25, 0x01 ; 1 + 694: 84 e5 ldi r24, 0x54 ; 84 + 696: 91 e0 ldi r25, 0x01 ; 1 + 698: 0c 94 3b 0c jmp 0x1876 ; 0x1876 -// LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR); +0000069c : } - 6f2: 21 c7 rjmp .+3650 ; 0x1536 - -000006f4 : /** Event handler for the library USB Control Request reception event. */ void EVENT_USB_Device_ControlRequest(void) { CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface); - 6f4: 85 e4 ldi r24, 0x45 ; 69 - 6f6: 91 e0 ldi r25, 0x01 ; 1 -} - 6f8: 72 c6 rjmp .+3300 ; 0x13de + 69c: 84 e5 ldi r24, 0x54 ; 84 + 69e: 91 e0 ldi r25, 0x01 ; 1 + 6a0: 0c 94 8e 0b jmp 0x171c ; 0x171c -000006fa <__vector_23>: +000006a4 <__vector_23>: /** ISR to manage the reception of data from the serial port, placing received bytes into a circular buffer * for later transmission to the host. */ ISR(USART1_RX_vect, ISR_BLOCK) { - 6fa: 1f 92 push r1 - 6fc: 0f 92 push r0 - 6fe: 0f b6 in r0, 0x3f ; 63 - 700: 0f 92 push r0 - 702: 11 24 eor r1, r1 - 704: 2f 93 push r18 - 706: 3f 93 push r19 - 708: 4f 93 push r20 - 70a: 5f 93 push r21 - 70c: 6f 93 push r22 - 70e: 7f 93 push r23 - 710: 8f 93 push r24 - 712: 9f 93 push r25 - 714: af 93 push r26 - 716: bf 93 push r27 - 718: ef 93 push r30 - 71a: ff 93 push r31 + 6a4: 1f 92 push r1 + 6a6: 0f 92 push r0 + 6a8: 0f b6 in r0, 0x3f ; 63 + 6aa: 0f 92 push r0 + 6ac: 11 24 eor r1, r1 + 6ae: 2f 93 push r18 + 6b0: 3f 93 push r19 + 6b2: 4f 93 push r20 + 6b4: 5f 93 push r21 + 6b6: 6f 93 push r22 + 6b8: 7f 93 push r23 + 6ba: 8f 93 push r24 + 6bc: 9f 93 push r25 + 6be: af 93 push r26 + 6c0: bf 93 push r27 + 6c2: ef 93 push r30 + 6c4: ff 93 push r31 uint8_t ReceivedByte = UDR1; - 71c: 60 91 ce 00 lds r22, 0x00CE + 6c6: 60 91 ce 00 lds r22, 0x00CE if (USB_DeviceState == DEVICE_STATE_Configured) - 720: 8e b3 in r24, 0x1e ; 30 - 722: 84 30 cpi r24, 0x04 ; 4 - 724: 19 f4 brne .+6 ; 0x72c <__vector_23+0x32> + 6ca: 8e b3 in r24, 0x1e ; 30 + 6cc: 84 30 cpi r24, 0x04 ; 4 + 6ce: 19 f4 brne .+6 ; 0x6d6 <__vector_23+0x32> RingBuffer_Insert(&USARTtoUSB_Buffer, ReceivedByte); - 726: 86 ef ldi r24, 0xF6 ; 246 - 728: 91 e0 ldi r25, 0x01 ; 1 - 72a: 22 dd rcall .-1468 ; 0x170 + 6d0: 8a e0 ldi r24, 0x0A ; 10 + 6d2: 92 e0 ldi r25, 0x02 ; 2 + 6d4: 4d dd rcall .-1382 ; 0x170 } - 72c: ff 91 pop r31 - 72e: ef 91 pop r30 - 730: bf 91 pop r27 - 732: af 91 pop r26 - 734: 9f 91 pop r25 - 736: 8f 91 pop r24 - 738: 7f 91 pop r23 - 73a: 6f 91 pop r22 - 73c: 5f 91 pop r21 - 73e: 4f 91 pop r20 - 740: 3f 91 pop r19 - 742: 2f 91 pop r18 - 744: 0f 90 pop r0 - 746: 0f be out 0x3f, r0 ; 63 - 748: 0f 90 pop r0 - 74a: 1f 90 pop r1 - 74c: 18 95 reti - -0000074e : + 6d6: ff 91 pop r31 + 6d8: ef 91 pop r30 + 6da: bf 91 pop r27 + 6dc: af 91 pop r26 + 6de: 9f 91 pop r25 + 6e0: 8f 91 pop r24 + 6e2: 7f 91 pop r23 + 6e4: 6f 91 pop r22 + 6e6: 5f 91 pop r21 + 6e8: 4f 91 pop r20 + 6ea: 3f 91 pop r19 + 6ec: 2f 91 pop r18 + 6ee: 0f 90 pop r0 + 6f0: 0f be out 0x3f, r0 ; 63 + 6f2: 0f 90 pop r0 + 6f4: 1f 90 pop r1 + 6f6: 18 95 reti + +000006f8 : /** Event handler for the CDC Class driver Line Encoding Changed event. * * \param[in] CDCInterfaceInfo Pointer to the CDC class interface configuration structure being referenced */ void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { - 74e: 8f 92 push r8 - 750: 9f 92 push r9 - 752: af 92 push r10 - 754: bf 92 push r11 - 756: cf 92 push r12 - 758: df 92 push r13 - 75a: ef 92 push r14 - 75c: ff 92 push r15 - 75e: 1f 93 push r17 - 760: fc 01 movw r30, r24 + 6f8: 8f 92 push r8 + 6fa: 9f 92 push r9 + 6fc: af 92 push r10 + 6fe: bf 92 push r11 + 700: cf 92 push r12 + 702: df 92 push r13 + 704: ef 92 push r14 + 706: ff 92 push r15 + 708: 1f 93 push r17 + 70a: fc 01 movw r30, r24 uint8_t ConfigMask = 0; switch (CDCInterfaceInfo->State.LineEncoding.ParityType) - 762: a1 8d ldd r26, Z+25 ; 0x19 - 764: a1 50 subi r26, 0x01 ; 1 - 766: a2 30 cpi r26, 0x02 ; 2 - 768: 28 f4 brcc .+10 ; 0x774 - 76a: b0 e0 ldi r27, 0x00 ; 0 - 76c: ac 59 subi r26, 0x9C ; 156 - 76e: be 4f sbci r27, 0xFE ; 254 - 770: 1c 91 ld r17, X - 772: 01 c0 rjmp .+2 ; 0x776 - 774: 10 e0 ldi r17, 0x00 ; 0 + 70c: a1 8d ldd r26, Z+25 ; 0x19 + 70e: a1 50 subi r26, 0x01 ; 1 + 710: a2 30 cpi r26, 0x02 ; 2 + 712: 28 f4 brcc .+10 ; 0x71e + 714: b0 e0 ldi r27, 0x00 ; 0 + 716: ad 58 subi r26, 0x8D ; 141 + 718: be 4f sbci r27, 0xFE ; 254 + 71a: 1c 91 ld r17, X + 71c: 01 c0 rjmp .+2 ; 0x720 + 71e: 10 e0 ldi r17, 0x00 ; 0 case CDC_PARITY_Even: ConfigMask = (1 << UPM11); break; } if (CDCInterfaceInfo->State.LineEncoding.CharFormat == CDC_LINEENCODING_TwoStopBits) - 776: 80 8d ldd r24, Z+24 ; 0x18 - 778: 82 30 cpi r24, 0x02 ; 2 - 77a: 09 f4 brne .+2 ; 0x77e + 720: 80 8d ldd r24, Z+24 ; 0x18 + 722: 82 30 cpi r24, 0x02 ; 2 + 724: 09 f4 brne .+2 ; 0x728 ConfigMask |= (1 << USBS1); - 77c: 18 60 ori r17, 0x08 ; 8 + 726: 18 60 ori r17, 0x08 ; 8 switch (CDCInterfaceInfo->State.LineEncoding.DataBits) - 77e: 82 8d ldd r24, Z+26 ; 0x1a - 780: 87 30 cpi r24, 0x07 ; 7 - 782: 31 f0 breq .+12 ; 0x790 - 784: 88 30 cpi r24, 0x08 ; 8 - 786: 31 f0 breq .+12 ; 0x794 - 788: 86 30 cpi r24, 0x06 ; 6 - 78a: 29 f4 brne .+10 ; 0x796 + 728: 82 8d ldd r24, Z+26 ; 0x1a + 72a: 87 30 cpi r24, 0x07 ; 7 + 72c: 31 f0 breq .+12 ; 0x73a + 72e: 88 30 cpi r24, 0x08 ; 8 + 730: 31 f0 breq .+12 ; 0x73e + 732: 86 30 cpi r24, 0x06 ; 6 + 734: 29 f4 brne .+10 ; 0x740 { case 6: ConfigMask |= (1 << UCSZ10); - 78c: 12 60 ori r17, 0x02 ; 2 + 736: 12 60 ori r17, 0x02 ; 2 break; - 78e: 03 c0 rjmp .+6 ; 0x796 + 738: 03 c0 rjmp .+6 ; 0x740 case 7: ConfigMask |= (1 << UCSZ11); - 790: 14 60 ori r17, 0x04 ; 4 + 73a: 14 60 ori r17, 0x04 ; 4 break; - 792: 01 c0 rjmp .+2 ; 0x796 + 73c: 01 c0 rjmp .+2 ; 0x740 case 8: ConfigMask |= ((1 << UCSZ11) | (1 << UCSZ10)); - 794: 16 60 ori r17, 0x06 ; 6 + 73e: 16 60 ori r17, 0x06 ; 6 break; } /* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */ UCSR1B = 0; - 796: 10 92 c9 00 sts 0x00C9, r1 + 740: 10 92 c9 00 sts 0x00C9, r1 UCSR1A = 0; - 79a: 10 92 c8 00 sts 0x00C8, r1 + 744: 10 92 c8 00 sts 0x00C8, r1 UCSR1C = 0; - 79e: 10 92 ca 00 sts 0x00CA, r1 + 748: 10 92 ca 00 sts 0x00CA, r1 /* Set the new baud rate before configuring the USART */ UBRR1 = SERIAL_2X_UBBRVAL(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS); - 7a2: c4 88 ldd r12, Z+20 ; 0x14 - 7a4: d5 88 ldd r13, Z+21 ; 0x15 - 7a6: e6 88 ldd r14, Z+22 ; 0x16 - 7a8: f7 88 ldd r15, Z+23 ; 0x17 - 7aa: c7 01 movw r24, r14 - 7ac: b6 01 movw r22, r12 - 7ae: 96 95 lsr r25 - 7b0: 87 95 ror r24 - 7b2: 77 95 ror r23 - 7b4: 67 95 ror r22 - 7b6: 0e 94 5b 0c call 0x18b6 ; 0x18b6 <__floatunsisf> - 7ba: 20 e0 ldi r18, 0x00 ; 0 - 7bc: 34 e2 ldi r19, 0x24 ; 36 - 7be: 44 ef ldi r20, 0xF4 ; 244 - 7c0: 59 e4 ldi r21, 0x49 ; 73 - 7c2: 7d d7 rcall .+3834 ; 0x16be <__addsf3> - 7c4: 4b 01 movw r8, r22 - 7c6: 5c 01 movw r10, r24 - 7c8: c7 01 movw r24, r14 - 7ca: b6 01 movw r22, r12 - 7cc: 0e 94 5b 0c call 0x18b6 ; 0x18b6 <__floatunsisf> - 7d0: 9b 01 movw r18, r22 - 7d2: ac 01 movw r20, r24 - 7d4: c5 01 movw r24, r10 - 7d6: b4 01 movw r22, r8 - 7d8: da d7 rcall .+4020 ; 0x178e <__divsf3> - 7da: 20 e0 ldi r18, 0x00 ; 0 - 7dc: 30 e0 ldi r19, 0x00 ; 0 - 7de: 40 e8 ldi r20, 0x80 ; 128 - 7e0: 5f e3 ldi r21, 0x3F ; 63 - 7e2: 6c d7 rcall .+3800 ; 0x16bc <__subsf3> - 7e4: 0e 94 2f 0c call 0x185e ; 0x185e <__fixunssfsi> - 7e8: 70 93 cd 00 sts 0x00CD, r23 - 7ec: 60 93 cc 00 sts 0x00CC, r22 + 74c: c4 88 ldd r12, Z+20 ; 0x14 + 74e: d5 88 ldd r13, Z+21 ; 0x15 + 750: e6 88 ldd r14, Z+22 ; 0x16 + 752: f7 88 ldd r15, Z+23 ; 0x17 + 754: c7 01 movw r24, r14 + 756: b6 01 movw r22, r12 + 758: 96 95 lsr r25 + 75a: 87 95 ror r24 + 75c: 77 95 ror r23 + 75e: 67 95 ror r22 + 760: 0e 94 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> + 764: 20 e0 ldi r18, 0x00 ; 0 + 766: 34 e2 ldi r19, 0x24 ; 36 + 768: 44 ef ldi r20, 0xF4 ; 244 + 76a: 59 e4 ldi r21, 0x49 ; 73 + 76c: 0e 94 ff 0c call 0x19fe ; 0x19fe <__addsf3> + 770: 4b 01 movw r8, r22 + 772: 5c 01 movw r10, r24 + 774: c7 01 movw r24, r14 + 776: b6 01 movw r22, r12 + 778: 0e 94 fb 0d call 0x1bf6 ; 0x1bf6 <__floatunsisf> + 77c: 9b 01 movw r18, r22 + 77e: ac 01 movw r20, r24 + 780: c5 01 movw r24, r10 + 782: b4 01 movw r22, r8 + 784: 0e 94 67 0d call 0x1ace ; 0x1ace <__divsf3> + 788: 20 e0 ldi r18, 0x00 ; 0 + 78a: 30 e0 ldi r19, 0x00 ; 0 + 78c: 40 e8 ldi r20, 0x80 ; 128 + 78e: 5f e3 ldi r21, 0x3F ; 63 + 790: 0e 94 fe 0c call 0x19fc ; 0x19fc <__subsf3> + 794: 0e 94 cf 0d call 0x1b9e ; 0x1b9e <__fixunssfsi> + 798: 70 93 cd 00 sts 0x00CD, r23 + 79c: 60 93 cc 00 sts 0x00CC, r22 /* Reconfigure the USART in double speed mode for a wider baud rate range at the expense of accuracy */ UCSR1C = ConfigMask; - 7f0: 10 93 ca 00 sts 0x00CA, r17 + 7a0: 10 93 ca 00 sts 0x00CA, r17 UCSR1A = (1 << U2X1); - 7f4: 82 e0 ldi r24, 0x02 ; 2 - 7f6: 80 93 c8 00 sts 0x00C8, r24 + 7a4: 82 e0 ldi r24, 0x02 ; 2 + 7a6: 80 93 c8 00 sts 0x00C8, r24 UCSR1B = ((1 << RXCIE1) | (1 << TXEN1) | (1 << RXEN1)); - 7fa: 88 e9 ldi r24, 0x98 ; 152 - 7fc: 80 93 c9 00 sts 0x00C9, r24 + 7aa: 88 e9 ldi r24, 0x98 ; 152 + 7ac: 80 93 c9 00 sts 0x00C9, r24 } - 800: 1f 91 pop r17 - 802: ff 90 pop r15 - 804: ef 90 pop r14 - 806: df 90 pop r13 - 808: cf 90 pop r12 - 80a: bf 90 pop r11 - 80c: af 90 pop r10 - 80e: 9f 90 pop r9 - 810: 8f 90 pop r8 - 812: 08 95 ret + 7b0: 1f 91 pop r17 + 7b2: ff 90 pop r15 + 7b4: ef 90 pop r14 + 7b6: df 90 pop r13 + 7b8: cf 90 pop r12 + 7ba: bf 90 pop r11 + 7bc: af 90 pop r10 + 7be: 9f 90 pop r9 + 7c0: 8f 90 pop r8 + 7c2: 08 95 ret -00000814 : +000007c4 : void uart_putc(unsigned char data) { - 814: 68 2f mov r22, r24 + 7c4: 68 2f mov r22, r24 if (USB_DeviceState == DEVICE_STATE_Configured){ - 816: 8e b3 in r24, 0x1e ; 30 - 818: 84 30 cpi r24, 0x04 ; 4 - 81a: 19 f4 brne .+6 ; 0x822 + 7c6: 8e b3 in r24, 0x1e ; 30 + 7c8: 84 30 cpi r24, 0x04 ; 4 + 7ca: 19 f4 brne .+6 ; 0x7d2 RingBuffer_Insert(&USARTtoUSB_Buffer, data); - 81c: 86 ef ldi r24, 0xF6 ; 246 - 81e: 91 e0 ldi r25, 0x01 ; 1 - 820: a7 cc rjmp .-1714 ; 0x170 - 822: 08 95 ret + 7cc: 8a e0 ldi r24, 0x0A ; 10 + 7ce: 92 e0 ldi r25, 0x02 ; 2 + 7d0: cf cc rjmp .-1634 ; 0x170 + 7d2: 08 95 ret -00000824 : +000007d4 : } } void uart_puts(const char *s ) { - 824: ef 92 push r14 - 826: ff 92 push r15 - 828: cf 93 push r28 - 82a: df 93 push r29 - 82c: e8 2e mov r14, r24 - 82e: e7 01 movw r28, r14 - 830: 7e 01 movw r14, r28 - 832: f9 2e mov r15, r25 - 834: e7 01 movw r28, r14 + 7d4: ef 92 push r14 + 7d6: ff 92 push r15 + 7d8: cf 93 push r28 + 7da: df 93 push r29 + 7dc: e8 2e mov r14, r24 + 7de: e7 01 movw r28, r14 + 7e0: 7e 01 movw r14, r28 + 7e2: f9 2e mov r15, r25 + 7e4: e7 01 movw r28, r14 while (*s) - 836: 01 c0 rjmp .+2 ; 0x83a + 7e6: 01 c0 rjmp .+2 ; 0x7ea uart_putc(*s++); - 838: ed df rcall .-38 ; 0x814 + 7e8: ed df rcall .-38 ; 0x7c4 } void uart_puts(const char *s ) { while (*s) - 83a: 89 91 ld r24, Y+ - 83c: 88 23 and r24, r24 - 83e: e1 f7 brne .-8 ; 0x838 + 7ea: 89 91 ld r24, Y+ + 7ec: 88 23 and r24, r24 + 7ee: e1 f7 brne .-8 ; 0x7e8 uart_putc(*s++); }/* uart_puts */ - 840: df 91 pop r29 - 842: cf 91 pop r28 - 844: ff 90 pop r15 - 846: ef 90 pop r14 - 848: 08 95 ret + 7f0: df 91 pop r29 + 7f2: cf 91 pop r28 + 7f4: ff 90 pop r15 + 7f6: ef 90 pop r14 + 7f8: 08 95 ret -0000084a : +000007fa : // convert an unsigned integer to string void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) { - 84a: 2f 92 push r2 - 84c: 3f 92 push r3 - 84e: 4f 92 push r4 - 850: 5f 92 push r5 - 852: 6f 92 push r6 - 854: 7f 92 push r7 - 856: 8f 92 push r8 - 858: 9f 92 push r9 - 85a: af 92 push r10 - 85c: bf 92 push r11 - 85e: cf 92 push r12 - 860: df 92 push r13 - 862: ef 92 push r14 - 864: ff 92 push r15 - 866: 0f 93 push r16 - 868: 1f 93 push r17 - 86a: cf 93 push r28 - 86c: df 93 push r29 - 86e: 7b 01 movw r14, r22 - 870: 8c 01 movw r16, r24 + 7fa: 2f 92 push r2 + 7fc: 3f 92 push r3 + 7fe: 4f 92 push r4 + 800: 5f 92 push r5 + 802: 6f 92 push r6 + 804: 7f 92 push r7 + 806: 8f 92 push r8 + 808: 9f 92 push r9 + 80a: af 92 push r10 + 80c: bf 92 push r11 + 80e: cf 92 push r12 + 810: df 92 push r13 + 812: ef 92 push r14 + 814: ff 92 push r15 + 816: 0f 93 push r16 + 818: 1f 93 push r17 + 81a: cf 93 push r28 + 81c: df 93 push r29 + 81e: 7b 01 movw r14, r22 + 820: 8c 01 movw r16, r24 int8_t i; // schleifenzähler string[no_digits] = '\0'; // String Terminator - 872: 82 2f mov r24, r18 - 874: 90 e0 ldi r25, 0x00 ; 0 - 876: fa 01 movw r30, r20 - 878: e8 0f add r30, r24 - 87a: f9 1f adc r31, r25 - 87c: 10 82 st Z, r1 + 822: 82 2f mov r24, r18 + 824: 90 e0 ldi r25, 0x00 ; 0 + 826: fa 01 movw r30, r20 + 828: e8 0f add r30, r24 + 82a: f9 1f adc r31, r25 + 82c: 10 82 st Z, r1 for (i = (no_digits - 1); i >= 0; i--) { - 87e: d2 2e mov r13, r18 - 880: da 94 dec r13 + 82e: d2 2e mov r13, r18 + 830: da 94 dec r13 }/* uart_puts */ // convert an unsigned integer to string void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) { - 882: 4d 2c mov r4, r13 - 884: 55 24 eor r5, r5 - 886: 47 fc sbrc r4, 7 - 888: 50 94 com r5 - 88a: ea 01 movw r28, r20 - 88c: c4 0d add r28, r4 - 88e: d5 1d adc r29, r5 + 832: 4d 2c mov r4, r13 + 834: 55 24 eor r5, r5 + 836: 47 fc sbrc r4, 7 + 838: 50 94 com r5 + 83a: ea 01 movw r28, r20 + 83c: c4 0d add r28, r4 + 83e: d5 1d adc r29, r5 int8_t i; // schleifenzähler string[no_digits] = '\0'; // String Terminator for (i = (no_digits - 1); i >= 0; i--) { - 890: aa 24 eor r10, r10 - 892: bb 24 eor r11, r11 + 840: aa 24 eor r10, r10 + 842: bb 24 eor r11, r11 if (zahl == 0 && i < (no_digits - 1)) { string[i] = ' '; } else { string[i] = (zahl % 10) + '0'; - 894: aa e0 ldi r26, 0x0A ; 10 - 896: 6a 2e mov r6, r26 - 898: 71 2c mov r7, r1 - 89a: 81 2c mov r8, r1 - 89c: 91 2c mov r9, r1 + 844: aa e0 ldi r26, 0x0A ; 10 + 846: 6a 2e mov r6, r26 + 848: 71 2c mov r7, r1 + 84a: 81 2c mov r8, r1 + 84c: 91 2c mov r9, r1 void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) { int8_t i; // schleifenzähler string[no_digits] = '\0'; // String Terminator for (i = (no_digits - 1); i >= 0; i--) { if (zahl == 0 && i < (no_digits - 1)) { - 89e: 1c 01 movw r2, r24 - 8a0: 08 94 sec - 8a2: 21 08 sbc r2, r1 - 8a4: 31 08 sbc r3, r1 + 84e: 1c 01 movw r2, r24 + 850: 08 94 sec + 852: 21 08 sbc r2, r1 + 854: 31 08 sbc r3, r1 string[i] = ' '; - 8a6: f0 e2 ldi r31, 0x20 ; 32 - 8a8: cf 2e mov r12, r31 + 856: f0 e2 ldi r31, 0x20 ; 32 + 858: cf 2e mov r12, r31 // convert an unsigned integer to string void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) { int8_t i; // schleifenzähler string[no_digits] = '\0'; // String Terminator for (i = (no_digits - 1); i >= 0; i--) { - 8aa: 22 c0 rjmp .+68 ; 0x8f0 + 85a: 22 c0 rjmp .+68 ; 0x8a0 if (zahl == 0 && i < (no_digits - 1)) { - 8ac: e1 14 cp r14, r1 - 8ae: f1 04 cpc r15, r1 - 8b0: 01 05 cpc r16, r1 - 8b2: 11 05 cpc r17, r1 - 8b4: 41 f4 brne .+16 ; 0x8c6 + 85c: e1 14 cp r14, r1 + 85e: f1 04 cpc r15, r1 + 860: 01 05 cpc r16, r1 + 862: 11 05 cpc r17, r1 + 864: 41 f4 brne .+16 ; 0x876 }/* uart_puts */ // convert an unsigned integer to string void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) { - 8b6: c5 01 movw r24, r10 - 8b8: 84 0d add r24, r4 - 8ba: 95 1d adc r25, r5 + 866: c5 01 movw r24, r10 + 868: 84 0d add r24, r4 + 86a: 95 1d adc r25, r5 int8_t i; // schleifenzähler string[no_digits] = '\0'; // String Terminator for (i = (no_digits - 1); i >= 0; i--) { if (zahl == 0 && i < (no_digits - 1)) { - 8bc: 82 15 cp r24, r2 - 8be: 93 05 cpc r25, r3 - 8c0: 14 f4 brge .+4 ; 0x8c6 + 86c: 82 15 cp r24, r2 + 86e: 93 05 cpc r25, r3 + 870: 14 f4 brge .+4 ; 0x876 string[i] = ' '; - 8c2: c8 82 st Y, r12 - 8c4: 08 c0 rjmp .+16 ; 0x8d6 + 872: c8 82 st Y, r12 + 874: 08 c0 rjmp .+16 ; 0x886 } else { string[i] = (zahl % 10) + '0'; - 8c6: c8 01 movw r24, r16 - 8c8: b7 01 movw r22, r14 - 8ca: a4 01 movw r20, r8 - 8cc: 93 01 movw r18, r6 - 8ce: 0e 94 38 0d call 0x1a70 ; 0x1a70 <__udivmodsi4> - 8d2: 60 5d subi r22, 0xD0 ; 208 - 8d4: 68 83 st Y, r22 + 876: c8 01 movw r24, r16 + 878: b7 01 movw r22, r14 + 87a: a4 01 movw r20, r8 + 87c: 93 01 movw r18, r6 + 87e: 0e 94 ea 0e call 0x1dd4 ; 0x1dd4 <__udivmodsi4> + 882: 60 5d subi r22, 0xD0 ; 208 + 884: 68 83 st Y, r22 } // Modulo rechnen, dann den ASCII-Code von '0' addieren zahl /= 10; - 8d6: c8 01 movw r24, r16 - 8d8: b7 01 movw r22, r14 - 8da: a4 01 movw r20, r8 - 8dc: 93 01 movw r18, r6 - 8de: 0e 94 38 0d call 0x1a70 ; 0x1a70 <__udivmodsi4> - 8e2: 79 01 movw r14, r18 - 8e4: 8a 01 movw r16, r20 + 886: c8 01 movw r24, r16 + 888: b7 01 movw r22, r14 + 88a: a4 01 movw r20, r8 + 88c: 93 01 movw r18, r6 + 88e: 0e 94 ea 0e call 0x1dd4 ; 0x1dd4 <__udivmodsi4> + 892: 79 01 movw r14, r18 + 894: 8a 01 movw r16, r20 // convert an unsigned integer to string void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits) { int8_t i; // schleifenzähler string[no_digits] = '\0'; // String Terminator for (i = (no_digits - 1); i >= 0; i--) { - 8e6: da 94 dec r13 - 8e8: 21 97 sbiw r28, 0x01 ; 1 - 8ea: 08 94 sec - 8ec: a1 08 sbc r10, r1 - 8ee: b1 08 sbc r11, r1 - 8f0: d7 fe sbrs r13, 7 - 8f2: dc cf rjmp .-72 ; 0x8ac + 896: da 94 dec r13 + 898: 21 97 sbiw r28, 0x01 ; 1 + 89a: 08 94 sec + 89c: a1 08 sbc r10, r1 + 89e: b1 08 sbc r11, r1 + 8a0: d7 fe sbrs r13, 7 + 8a2: dc cf rjmp .-72 ; 0x85c string[i] = (zahl % 10) + '0'; } // Modulo rechnen, dann den ASCII-Code von '0' addieren zahl /= 10; } } - 8f4: df 91 pop r29 - 8f6: cf 91 pop r28 - 8f8: 1f 91 pop r17 - 8fa: 0f 91 pop r16 - 8fc: ff 90 pop r15 - 8fe: ef 90 pop r14 - 900: df 90 pop r13 - 902: cf 90 pop r12 - 904: bf 90 pop r11 - 906: af 90 pop r10 - 908: 9f 90 pop r9 - 90a: 8f 90 pop r8 - 90c: 7f 90 pop r7 - 90e: 6f 90 pop r6 - 910: 5f 90 pop r5 - 912: 4f 90 pop r4 - 914: 3f 90 pop r3 - 916: 2f 90 pop r2 - 918: 08 95 ret - -0000091a : + 8a4: df 91 pop r29 + 8a6: cf 91 pop r28 + 8a8: 1f 91 pop r17 + 8aa: 0f 91 pop r16 + 8ac: ff 90 pop r15 + 8ae: ef 90 pop r14 + 8b0: df 90 pop r13 + 8b2: cf 90 pop r12 + 8b4: bf 90 pop r11 + 8b6: af 90 pop r10 + 8b8: 9f 90 pop r9 + 8ba: 8f 90 pop r8 + 8bc: 7f 90 pop r7 + 8be: 6f 90 pop r6 + 8c0: 5f 90 pop r5 + 8c2: 4f 90 pop r4 + 8c4: 3f 90 pop r3 + 8c6: 2f 90 pop r2 + 8c8: 08 95 ret + +000008ca : + +int8_t sign(int16_t x) { + return (x > 0) - (x < 0); + 8ca: 21 e0 ldi r18, 0x01 ; 1 + 8cc: 18 16 cp r1, r24 + 8ce: 19 06 cpc r1, r25 + 8d0: 0c f0 brlt .+2 ; 0x8d4 + 8d2: 20 e0 ldi r18, 0x00 ; 0 + 8d4: 89 2f mov r24, r25 + 8d6: 88 1f adc r24, r24 + 8d8: 88 27 eor r24, r24 + 8da: 88 1f adc r24, r24 +} + 8dc: 28 1b sub r18, r24 + 8de: 82 2f mov r24, r18 + 8e0: 08 95 ret + +000008e2 : + + +void uart_print_number(uint32_t zahl, uint8_t no_digits) { + 8e2: 24 2f mov r18, r20 + my_uitoa(abs(zahl),stringbuffer,no_digits); + 8e4: 77 ff sbrs r23, 7 + 8e6: 03 c0 rjmp .+6 ; 0x8ee + 8e8: 70 95 com r23 + 8ea: 61 95 neg r22 + 8ec: 7f 4f sbci r23, 0xFF ; 255 + 8ee: 88 27 eor r24, r24 + 8f0: 77 fd sbrc r23, 7 + 8f2: 80 95 com r24 + 8f4: 98 2f mov r25, r24 + 8f6: 42 ed ldi r20, 0xD2 ; 210 + 8f8: 52 e0 ldi r21, 0x02 ; 2 + 8fa: 7f df rcall .-258 ; 0x7fa + uart_puts(stringbuffer); + 8fc: 82 ed ldi r24, 0xD2 ; 210 + 8fe: 92 e0 ldi r25, 0x02 ; 2 + +} + 900: 69 cf rjmp .-302 ; 0x7d4 + +00000902 : +void uart_print_signed_number(uint32_t zahl, uint8_t no_digits) { + 902: 0f 93 push r16 + 904: 1f 93 push r17 + 906: 24 2f mov r18, r20 + my_uitoa(abs(zahl),stringbuffer,no_digits); + 908: 8b 01 movw r16, r22 + 90a: 77 ff sbrs r23, 7 + 90c: 03 c0 rjmp .+6 ; 0x914 + 90e: 70 95 com r23 + 910: 61 95 neg r22 + 912: 7f 4f sbci r23, 0xFF ; 255 + 914: 88 27 eor r24, r24 + 916: 77 fd sbrc r23, 7 + 918: 80 95 com r24 + 91a: 98 2f mov r25, r24 + 91c: 42 ed ldi r20, 0xD2 ; 210 + 91e: 52 e0 ldi r21, 0x02 ; 2 + 920: 6c df rcall .-296 ; 0x7fa + if (sign(zahl) < 0) { + 922: c8 01 movw r24, r16 + 924: d2 df rcall .-92 ; 0x8ca + 926: 87 ff sbrs r24, 7 + 928: 02 c0 rjmp .+4 ; 0x92e + uart_putc('-'); + 92a: 8d e2 ldi r24, 0x2D ; 45 + 92c: 01 c0 rjmp .+2 ; 0x930 + } else { + uart_putc('+'); + 92e: 8b e2 ldi r24, 0x2B ; 43 + 930: 49 df rcall .-366 ; 0x7c4 + } + uart_puts(stringbuffer); + 932: 82 ed ldi r24, 0xD2 ; 210 + 934: 92 e0 ldi r25, 0x02 ; 2 + 936: 4e df rcall .-356 ; 0x7d4 + +} + 938: 1f 91 pop r17 + 93a: 0f 91 pop r16 + 93c: 08 95 ret + +0000093e : PORTY2 |= ((byte & (1<<2))>>2)<>3)< + 93e: 80 e0 ldi r24, 0x00 ; 0 + 940: 4b dc rcall .-1898 ; 0x1d8 set_y(0); - 91e: 80 e0 ldi r24, 0x00 ; 0 - 920: 96 dc rcall .-1748 ; 0x24e + 942: 80 e0 ldi r24, 0x00 ; 0 + 944: 84 dc rcall .-1784 ; 0x24e DDRX0 |= (1<: +00000958 : uint8_t motor_step(uint8_t motor, int8_t direction) { // motor: M1 or M2, direction +1 or -1, 0 for coil deactivation - 934: 0f 93 push r16 - 936: 1f 93 push r17 - 938: 16 2f mov r17, r22 - 93a: 82 30 cpi r24, 0x02 ; 2 - 93c: 50 f4 brcc .+20 ; 0x952 - 93e: a8 2f mov r26, r24 - 940: b0 e0 ldi r27, 0x00 ; 0 - 942: aa 0f add r26, r26 - 944: bb 1f adc r27, r27 - 946: aa 59 subi r26, 0x9A ; 154 - 948: be 4f sbci r27, 0xFE ; 254 - 94a: 2d 91 ld r18, X+ - 94c: 3c 91 ld r19, X - 94e: 11 97 sbiw r26, 0x01 ; 1 - 950: 02 c0 rjmp .+4 ; 0x956 - 952: 2c ee ldi r18, 0xEC ; 236 - 954: 30 e0 ldi r19, 0x00 ; 0 + 958: 0f 93 push r16 + 95a: 1f 93 push r17 + 95c: 16 2f mov r17, r22 + 95e: 82 30 cpi r24, 0x02 ; 2 + 960: 50 f4 brcc .+20 ; 0x976 + 962: a8 2f mov r26, r24 + 964: b0 e0 ldi r27, 0x00 ; 0 + 966: aa 0f add r26, r26 + 968: bb 1f adc r27, r27 + 96a: ab 58 subi r26, 0x8B ; 139 + 96c: be 4f sbci r27, 0xFE ; 254 + 96e: 2d 91 ld r18, X+ + 970: 3c 91 ld r19, X + 972: 11 97 sbiw r26, 0x01 ; 1 + 974: 02 c0 rjmp .+4 ; 0x97a + 976: 2c ee ldi r18, 0xEC ; 236 + 978: 30 e0 ldi r19, 0x00 ; 0 case Y: setport = &set_y; break; } next_phase = (phase_memory[motor] + 4 + direction) % 4; - 956: e8 2f mov r30, r24 - 958: f0 e0 ldi r31, 0x00 ; 0 - 95a: 81 2f mov r24, r17 - 95c: 99 27 eor r25, r25 - 95e: 87 fd sbrc r24, 7 - 960: 90 95 com r25 - 962: 04 96 adiw r24, 0x04 ; 4 - 964: ea 57 subi r30, 0x7A ; 122 - 966: fd 4f sbci r31, 0xFD ; 253 - 968: 40 81 ld r20, Z - 96a: 84 0f add r24, r20 - 96c: 91 1d adc r25, r1 - 96e: 64 e0 ldi r22, 0x04 ; 4 - 970: 70 e0 ldi r23, 0x00 ; 0 - 972: 0e 94 25 0d call 0x1a4a ; 0x1a4a <__divmodhi4> + 97a: e8 2f mov r30, r24 + 97c: f0 e0 ldi r31, 0x00 ; 0 + 97e: 81 2f mov r24, r17 + 980: 99 27 eor r25, r25 + 982: 87 fd sbrc r24, 7 + 984: 90 95 com r25 + 986: 04 96 adiw r24, 0x04 ; 4 + 988: ee 53 subi r30, 0x3E ; 62 + 98a: fd 4f sbci r31, 0xFD ; 253 + 98c: 40 81 ld r20, Z + 98e: 84 0f add r24, r20 + 990: 91 1d adc r25, r1 + 992: 64 e0 ldi r22, 0x04 ; 4 + 994: 70 e0 ldi r23, 0x00 ; 0 + 996: 0e 94 d7 0e call 0x1dae ; 0x1dae <__divmodhi4> phase_memory[motor] = next_phase; - 976: 80 83 st Z, r24 + 99a: 80 83 st Z, r24 next_pattern = phase_pattern[next_phase]; - 978: e8 2f mov r30, r24 - 97a: f0 e0 ldi r31, 0x00 ; 0 - 97c: e0 5a subi r30, 0xA0 ; 160 - 97e: fe 4f sbci r31, 0xFE ; 254 - 980: 00 81 ld r16, Z + 99c: e8 2f mov r30, r24 + 99e: f0 e0 ldi r31, 0x00 ; 0 + 9a0: e1 59 subi r30, 0x91 ; 145 + 9a2: fe 4f sbci r31, 0xFE ; 254 + 9a4: 00 81 ld r16, Z if (direction != 0) { - 982: 11 23 and r17, r17 - 984: 11 f0 breq .+4 ; 0x98a + 9a6: 11 23 and r17, r17 + 9a8: 11 f0 breq .+4 ; 0x9ae (*setport)(next_pattern); - 986: 80 2f mov r24, r16 - 988: 01 c0 rjmp .+2 ; 0x98c + 9aa: 80 2f mov r24, r16 + 9ac: 01 c0 rjmp .+2 ; 0x9b0 } else { (*setport)(0); - 98a: 80 e0 ldi r24, 0x00 ; 0 - 98c: f9 01 movw r30, r18 - 98e: 09 95 icall + 9ae: 80 e0 ldi r24, 0x00 ; 0 + 9b0: f9 01 movw r30, r18 + 9b2: 09 95 icall } return next_pattern; } - 990: 80 2f mov r24, r16 - 992: 1f 91 pop r17 - 994: 0f 91 pop r16 - 996: 08 95 ret - -00000998 : + 9b4: 80 2f mov r24, r16 + 9b6: 1f 91 pop r17 + 9b8: 0f 91 pop r16 + 9ba: 08 95 ret -int8_t sign(int16_t x) { - return (x > 0) - (x < 0); - 998: 21 e0 ldi r18, 0x01 ; 1 - 99a: 18 16 cp r1, r24 - 99c: 19 06 cpc r1, r25 - 99e: 0c f0 brlt .+2 ; 0x9a2 - 9a0: 20 e0 ldi r18, 0x00 ; 0 - 9a2: 89 2f mov r24, r25 - 9a4: 88 1f adc r24, r24 - 9a6: 88 27 eor r24, r24 - 9a8: 88 1f adc r24, r24 +000009bc : + return val; } - 9aa: 28 1b sub r18, r24 - 9ac: 82 2f mov r24, r18 - 9ae: 08 95 ret -000009b0 : -void move_plate(int16_t dx, int16_t dy){ - 9b0: 1f 93 push r17 + +uint8_t move_plate(int16_t dx, int16_t dy){ + 9bc: 0f 93 push r16 + 9be: 1f 93 push r17 static int16_t todo_x,todo_y = 0; int8_t signum; + uint8_t returnval = 0; todo_x += dx; - 9b2: 20 91 84 02 lds r18, 0x0284 - 9b6: 30 91 85 02 lds r19, 0x0285 - 9ba: 28 0f add r18, r24 - 9bc: 39 1f adc r19, r25 - 9be: 30 93 85 02 sts 0x0285, r19 - 9c2: 20 93 84 02 sts 0x0284, r18 + 9c0: 20 91 c0 02 lds r18, 0x02C0 + 9c4: 30 91 c1 02 lds r19, 0x02C1 + 9c8: 28 0f add r18, r24 + 9ca: 39 1f adc r19, r25 + 9cc: 30 93 c1 02 sts 0x02C1, r19 + 9d0: 20 93 c0 02 sts 0x02C0, r18 todo_y += dy; - 9c6: 80 91 82 02 lds r24, 0x0282 - 9ca: 90 91 83 02 lds r25, 0x0283 - 9ce: 86 0f add r24, r22 - 9d0: 97 1f adc r25, r23 - 9d2: 90 93 83 02 sts 0x0283, r25 - 9d6: 80 93 82 02 sts 0x0282, r24 + 9d4: 80 91 be 02 lds r24, 0x02BE + 9d8: 90 91 bf 02 lds r25, 0x02BF + 9dc: 86 0f add r24, r22 + 9de: 97 1f adc r25, r23 + 9e0: 90 93 bf 02 sts 0x02BF, r25 + 9e4: 80 93 be 02 sts 0x02BE, r24 signum = sign(todo_x); - 9da: c9 01 movw r24, r18 - 9dc: dd df rcall .-70 ; 0x998 - 9de: 18 2f mov r17, r24 + 9e8: c9 01 movw r24, r18 + 9ea: 6f df rcall .-290 ; 0x8ca + 9ec: 08 2f mov r16, r24 + + +uint8_t move_plate(int16_t dx, int16_t dy){ + static int16_t todo_x,todo_y = 0; + int8_t signum; + uint8_t returnval = 0; + 9ee: 11 e0 ldi r17, 0x01 ; 1 + 9f0: 88 23 and r24, r24 + 9f2: 09 f4 brne .+2 ; 0x9f6 + 9f4: 10 e0 ldi r17, 0x00 ; 0 + + signum = sign(todo_x); + if(signum != 0) { + returnval++; + } motor_step(X,signum); - 9e0: 80 e0 ldi r24, 0x00 ; 0 - 9e2: 61 2f mov r22, r17 - 9e4: a7 df rcall .-178 ; 0x934 + 9f6: 80 e0 ldi r24, 0x00 ; 0 + 9f8: 60 2f mov r22, r16 + 9fa: ae df rcall .-164 ; 0x958 todo_x -= signum; - 9e6: 81 2f mov r24, r17 - 9e8: 99 27 eor r25, r25 - 9ea: 87 fd sbrc r24, 7 - 9ec: 90 95 com r25 - 9ee: 20 91 84 02 lds r18, 0x0284 - 9f2: 30 91 85 02 lds r19, 0x0285 - 9f6: 28 1b sub r18, r24 - 9f8: 39 0b sbc r19, r25 - 9fa: 30 93 85 02 sts 0x0285, r19 - 9fe: 20 93 84 02 sts 0x0284, r18 + 9fc: 60 2f mov r22, r16 + 9fe: 77 27 eor r23, r23 + a00: 67 fd sbrc r22, 7 + a02: 70 95 com r23 + a04: 20 91 c0 02 lds r18, 0x02C0 + a08: 30 91 c1 02 lds r19, 0x02C1 + a0c: 26 1b sub r18, r22 + a0e: 37 0b sbc r19, r23 + a10: 30 93 c1 02 sts 0x02C1, r19 + a14: 20 93 c0 02 sts 0x02C0, r18 signum = sign(todo_y); - a02: 80 91 82 02 lds r24, 0x0282 - a06: 90 91 83 02 lds r25, 0x0283 - a0a: c6 df rcall .-116 ; 0x998 - a0c: 18 2f mov r17, r24 + a18: 80 91 be 02 lds r24, 0x02BE + a1c: 90 91 bf 02 lds r25, 0x02BF + a20: 54 df rcall .-344 ; 0x8ca + a22: 08 2f mov r16, r24 + if(signum != 0) { + a24: 81 11 cpse r24, r1 + returnval++; + a26: 1f 5f subi r17, 0xFF ; 255 + } motor_step(Y,signum); - a0e: 81 e0 ldi r24, 0x01 ; 1 - a10: 61 2f mov r22, r17 - a12: 90 df rcall .-224 ; 0x934 + a28: 81 e0 ldi r24, 0x01 ; 1 + a2a: 60 2f mov r22, r16 + a2c: 95 df rcall .-214 ; 0x958 todo_y -= signum; - a14: 81 2f mov r24, r17 - a16: 99 27 eor r25, r25 - a18: 87 fd sbrc r24, 7 - a1a: 90 95 com r25 - a1c: 20 91 82 02 lds r18, 0x0282 - a20: 30 91 83 02 lds r19, 0x0283 - a24: 28 1b sub r18, r24 - a26: 39 0b sbc r19, r25 - a28: 30 93 83 02 sts 0x0283, r19 - a2c: 20 93 82 02 sts 0x0282, r18 + a2e: 60 2f mov r22, r16 + a30: 77 27 eor r23, r23 + a32: 67 fd sbrc r22, 7 + a34: 70 95 com r23 + a36: 20 91 be 02 lds r18, 0x02BE + a3a: 30 91 bf 02 lds r19, 0x02BF + a3e: 26 1b sub r18, r22 + a40: 37 0b sbc r19, r23 + a42: 30 93 bf 02 sts 0x02BF, r19 + a46: 20 93 be 02 sts 0x02BE, r18 + return returnval; // busy } - a30: 1f 91 pop r17 - a32: 08 95 ret + a4a: 81 2f mov r24, r17 + a4c: 1f 91 pop r17 + a4e: 0f 91 pop r16 + a50: 08 95 ret -00000a34
: +00000a52 : +void pos_report(void){ + uart_puts("x_pos: "); + a52: 80 e0 ldi r24, 0x00 ; 0 + a54: 91 e0 ldi r25, 0x01 ; 1 + a56: be de rcall .-644 ; 0x7d4 + uart_print_signed_number(plate_pos_x,6); + a58: 60 91 7a 01 lds r22, 0x017A + a5c: 70 91 7b 01 lds r23, 0x017B + a60: 88 27 eor r24, r24 + a62: 77 fd sbrc r23, 7 + a64: 80 95 com r24 + a66: 98 2f mov r25, r24 + a68: 46 e0 ldi r20, 0x06 ; 6 + a6a: 4b df rcall .-362 ; 0x902 +// my_uitoa(plate_pos_x, stringbuffer, 6); +// uart_puts(stringbuffer); + uart_puts(" y_pos: "); + a6c: 88 e0 ldi r24, 0x08 ; 8 + a6e: 91 e0 ldi r25, 0x01 ; 1 + a70: b1 de rcall .-670 ; 0x7d4 + uart_print_signed_number(plate_pos_y,6); + a72: 60 91 7c 01 lds r22, 0x017C + a76: 70 91 7d 01 lds r23, 0x017D + a7a: 88 27 eor r24, r24 + a7c: 77 fd sbrc r23, 7 + a7e: 80 95 com r24 + a80: 98 2f mov r25, r24 + a82: 46 e0 ldi r20, 0x06 ; 6 + a84: 3e df rcall .-388 ; 0x902 + uart_puts("\r"); + a86: 82 e1 ldi r24, 0x12 ; 18 + a88: 91 e0 ldi r25, 0x01 ; 1 +} + a8a: a4 ce rjmp .-696 ; 0x7d4 + +00000a8c : +#define POSITION 0 +#define GOTO 1 +#define MOVEREL 2 +#define SETZERO 3 + +void parse_command(void){ + a8c: cf 92 push r12 + a8e: df 92 push r13 + a90: ef 92 push r14 + a92: ff 92 push r15 + a94: 0f 93 push r16 + a96: 1f 93 push r17 + a98: cf 93 push r28 + a9a: df 93 push r29 + static inline uint_reg_t GetGlobalInterruptMask(void) + { + GCC_MEMORY_BARRIER(); + #if (ARCH == ARCH_AVR8) + return SREG; + a9c: 2f b7 in r18, 0x3f ; 63 + static inline void GlobalInterruptDisable(void) + { + GCC_MEMORY_BARRIER(); + + #if (ARCH == ARCH_AVR8) + cli(); + a9e: f8 94 cli + uint16_t Count; + + uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask(); + GlobalInterruptDisable(); + + Count = Buffer->Count; + aa0: 80 91 88 01 lds r24, 0x0188 + aa4: 90 91 89 01 lds r25, 0x0189 + static inline void SetGlobalInterruptMask(const uint_reg_t GlobalIntState) + { + GCC_MEMORY_BARRIER(); + + #if (ARCH == ARCH_AVR8) + SREG = GlobalIntState; + aa8: 2f bf out 0x3f, r18 ; 63 + uint8_t action=0,axis=0; + int8_t num_sign = 1; + char byte; + + /* Load the next byte from the USART transmit buffer into the USART */ + if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) { + aaa: 00 97 sbiw r24, 0x00 ; 0 + aac: 09 f4 brne .+2 ; 0xab0 + aae: 83 c1 rjmp .+774 ; 0xdb6 + byte = RingBuffer_Remove(&USBtoUSART_Buffer); + ab0: 8e e7 ldi r24, 0x7E ; 126 + ab2: 91 e0 ldi r25, 0x01 ; 1 + ab4: 78 db rcall .-2320 ; 0x1a6 + + if (byte == '\r' || byte == '\n') {// end of command, evaluate cemmand! + ab6: 8d 30 cpi r24, 0x0D ; 13 + ab8: 19 f0 breq .+6 ; 0xac0 + aba: 8a 30 cpi r24, 0x0A ; 10 + abc: 09 f0 breq .+2 ; 0xac0 + abe: 70 c1 rjmp .+736 ; 0xda0 + uart_puts("\r\n"); + ac0: 84 e1 ldi r24, 0x14 ; 20 + ac2: 91 e0 ldi r25, 0x01 ; 1 + ac4: 87 de rcall .-754 ; 0x7d4 + cmdbuffer[cmdPos] = '\0'; // terminate new command string + ac6: 80 91 99 02 lds r24, 0x0299 + aca: e8 2f mov r30, r24 + acc: f0 e0 ldi r31, 0x00 ; 0 + ace: e2 55 subi r30, 0x52 ; 82 + ad0: fd 4f sbci r31, 0xFD ; 253 + ad2: 10 82 st Z, r1 + curCmdLen = cmdPos; + ad4: 80 93 98 02 sts 0x0298, r24 + cmdPos = 0; + ad8: 10 92 99 02 sts 0x0299, r1 + + + if (cmdbuffer[0] == 'g' || cmdbuffer[0] == 'G') { // goto command + adc: 80 91 ae 02 lds r24, 0x02AE + ae0: 87 36 cpi r24, 0x67 ; 103 + ae2: 59 f0 breq .+22 ; 0xafa + ae4: 87 34 cpi r24, 0x47 ; 71 + ae6: 49 f0 breq .+18 ; 0xafa + action = GOTO; + } else if ( cmdbuffer[0] == 'm' || cmdbuffer[0] == 'M') { + ae8: 8d 36 cpi r24, 0x6D ; 109 + aea: 49 f0 breq .+18 ; 0xafe + aec: 8d 34 cpi r24, 0x4D ; 77 + aee: 39 f0 breq .+14 ; 0xafe + action = MOVEREL; + } else if ( cmdbuffer[0] == 'z' || cmdbuffer[0] == 'Z' ) { + af0: 8a 37 cpi r24, 0x7A ; 122 + af2: 39 f0 breq .+14 ; 0xb02 + af4: 8a 35 cpi r24, 0x5A ; 90 + af6: 39 f4 brne .+14 ; 0xb06 + af8: 04 c0 rjmp .+8 ; 0xb02 + curCmdLen = cmdPos; + cmdPos = 0; + + + if (cmdbuffer[0] == 'g' || cmdbuffer[0] == 'G') { // goto command + action = GOTO; + afa: 01 e0 ldi r16, 0x01 ; 1 + afc: 05 c0 rjmp .+10 ; 0xb08 + } else if ( cmdbuffer[0] == 'm' || cmdbuffer[0] == 'M') { + action = MOVEREL; + afe: 02 e0 ldi r16, 0x02 ; 2 + b00: 03 c0 rjmp .+6 ; 0xb08 + } else if ( cmdbuffer[0] == 'z' || cmdbuffer[0] == 'Z' ) { + action = SETZERO; + b02: 03 e0 ldi r16, 0x03 ; 3 + b04: 01 c0 rjmp .+2 ; 0xb08 + } else { + action = POSITION; + b06: 00 e0 ldi r16, 0x00 ; 0 + } + + if (cmdbuffer[1] == 'x' || cmdbuffer[1] == 'X') { + b08: 80 91 af 02 lds r24, 0x02AF + b0c: 88 37 cpi r24, 0x78 ; 120 + b0e: 39 f0 breq .+14 ; 0xb1e + b10: 88 35 cpi r24, 0x58 ; 88 + b12: 29 f0 breq .+10 ; 0xb1e + axis = X; + } else if (cmdbuffer[1] == 'y' || cmdbuffer[1] == 'Y') { + b14: 89 37 cpi r24, 0x79 ; 121 + b16: 29 f0 breq .+10 ; 0xb22 +#define POSITION 0 +#define GOTO 1 +#define MOVEREL 2 +#define SETZERO 3 + +void parse_command(void){ + b18: 11 e0 ldi r17, 0x01 ; 1 + b1a: 89 35 cpi r24, 0x59 ; 89 + b1c: 19 f0 breq .+6 ; 0xb24 + } else { + action = POSITION; + } + + if (cmdbuffer[1] == 'x' || cmdbuffer[1] == 'X') { + axis = X; + b1e: 10 e0 ldi r17, 0x00 ; 0 + b20: 01 c0 rjmp .+2 ; 0xb24 + } else if (cmdbuffer[1] == 'y' || cmdbuffer[1] == 'Y') { + axis = Y; + b22: 11 e0 ldi r17, 0x01 ; 1 + } + + // if you expect coordinate, parse number! + if (action == GOTO || action == MOVEREL){ + b24: 80 2f mov r24, r16 + b26: 81 50 subi r24, 0x01 ; 1 + b28: 82 30 cpi r24, 0x02 ; 2 + b2a: 08 f0 brcs .+2 ; 0xb2e + b2c: 6d c0 rjmp .+218 ; 0xc08 + + predot = 0; + b2e: 10 92 9d 02 sts 0x029D, r1 + b32: 10 92 9c 02 sts 0x029C, r1 + postdot = 0; + b36: 10 92 9b 02 sts 0x029B, r1 + b3a: 10 92 9a 02 sts 0x029A, r1 + num_sign = 1; + num_start = 0; + b3e: 10 92 97 02 sts 0x0297, r1 + nums_found = 0; + b42: 10 92 96 02 sts 0x0296, r1 + + for (uint8_t i=2; i<=curCmdLen; i++) { + b46: 92 e0 ldi r25, 0x02 ; 2 + b48: f9 2e mov r15, r25 + // if you expect coordinate, parse number! + if (action == GOTO || action == MOVEREL){ + + predot = 0; + postdot = 0; + num_sign = 1; + b4a: dd 24 eor r13, r13 + b4c: d3 94 inc r13 + predot = atoi(numbuffer); + } else { // its the postdot digits + uint8_t postdotlen = i-num_start; + if (postdotlen < 3){ // if too small ,fill with zeros + for( uint8_t j = postdotlen; j <=2; j++) { + numbuffer[j] = '0'; + b4e: 80 e3 ldi r24, 0x30 ; 48 + b50: c8 2e mov r12, r24 + postdot = 0; + num_sign = 1; + num_start = 0; + nums_found = 0; + + for (uint8_t i=2; i<=curCmdLen; i++) { + b52: 54 c0 rjmp .+168 ; 0xbfc + if ( num_start == 0 && cmdbuffer[i] == '-' ) { // if you find a minus before + b54: e0 90 97 02 lds r14, 0x0297 + b58: ee 20 and r14, r14 + b5a: 49 f4 brne .+18 ; 0xb6e + b5c: ef 2d mov r30, r15 + b5e: f0 e0 ldi r31, 0x00 ; 0 + b60: e2 55 subi r30, 0x52 ; 82 + b62: fd 4f sbci r31, 0xFD ; 253 + b64: 80 81 ld r24, Z + b66: 8d 32 cpi r24, 0x2D ; 45 + b68: 11 f4 brne .+4 ; 0xb6e + // you find a digit, it's a negative number + num_sign = -1; + b6a: dd 24 eor r13, r13 + b6c: da 94 dec r13 + } + + if ( cmdbuffer[i] >= 48 && cmdbuffer[i] <= 57 ){ // is it a number? + b6e: cf 2d mov r28, r15 + b70: d0 e0 ldi r29, 0x00 ; 0 + b72: fe 01 movw r30, r28 + b74: e2 55 subi r30, 0x52 ; 82 + b76: fd 4f sbci r31, 0xFD ; 253 + b78: 80 81 ld r24, Z + b7a: 80 53 subi r24, 0x30 ; 48 + b7c: 8a 30 cpi r24, 0x0A ; 10 + b7e: 28 f4 brcc .+10 ; 0xb8a + if ( num_start == 0) { // this is the first digit in the string + b80: ee 20 and r14, r14 + b82: d9 f5 brne .+118 ; 0xbfa + num_start = i; + b84: f0 92 97 02 sts 0x0297, r15 + b88: 38 c0 rjmp .+112 ; 0xbfa + } + } else { // no digit! + if ( num_start != 0) { // digits have been found before + b8a: ee 20 and r14, r14 + b8c: b1 f1 breq .+108 ; 0xbfa + strncpy(numbuffer,cmdbuffer+num_start,i-num_start); // copy number found to + b8e: 6e 2d mov r22, r14 + b90: 70 e0 ldi r23, 0x00 ; 0 + b92: c6 1b sub r28, r22 + b94: d7 0b sbc r29, r23 + b96: 62 55 subi r22, 0x52 ; 82 + b98: 7d 4f sbci r23, 0xFD ; 253 + b9a: 8e e9 ldi r24, 0x9E ; 158 + b9c: 92 e0 ldi r25, 0x02 ; 2 + b9e: ae 01 movw r20, r28 + ba0: 0e 94 29 0f call 0x1e52 ; 0x1e52 + // numbuffer + numbuffer[i-num_start] = '\0'; // make sure it's always a terminated string + ba4: c2 56 subi r28, 0x62 ; 98 + ba6: dd 4f sbci r29, 0xFD ; 253 + ba8: 18 82 st Y, r1 + nums_found++; + baa: 80 91 96 02 lds r24, 0x0296 + bae: 8f 5f subi r24, 0xFF ; 255 + bb0: 80 93 96 02 sts 0x0296, r24 + if(nums_found == 1) { // its the predot digits + bb4: 81 30 cpi r24, 0x01 ; 1 + bb6: 49 f4 brne .+18 ; 0xbca + predot = atoi(numbuffer); + bb8: 8e e9 ldi r24, 0x9E ; 158 + bba: 92 e0 ldi r25, 0x02 ; 2 + bbc: 0e 94 0c 0f call 0x1e18 ; 0x1e18 + bc0: 90 93 9d 02 sts 0x029D, r25 + bc4: 80 93 9c 02 sts 0x029C, r24 + bc8: 16 c0 rjmp .+44 ; 0xbf6 + } else { // its the postdot digits + uint8_t postdotlen = i-num_start; + bca: 8f 2d mov r24, r15 + bcc: 8e 19 sub r24, r14 + if (postdotlen < 3){ // if too small ,fill with zeros + bce: 83 30 cpi r24, 0x03 ; 3 + bd0: 40 f4 brcc .+16 ; 0xbe2 + for( uint8_t j = postdotlen; j <=2; j++) { + numbuffer[j] = '0'; + bd2: e8 2f mov r30, r24 + bd4: f0 e0 ldi r31, 0x00 ; 0 + bd6: e2 56 subi r30, 0x62 ; 98 + bd8: fd 4f sbci r31, 0xFD ; 253 + bda: c0 82 st Z, r12 + if(nums_found == 1) { // its the predot digits + predot = atoi(numbuffer); + } else { // its the postdot digits + uint8_t postdotlen = i-num_start; + if (postdotlen < 3){ // if too small ,fill with zeros + for( uint8_t j = postdotlen; j <=2; j++) { + bdc: 8f 5f subi r24, 0xFF ; 255 + bde: 83 30 cpi r24, 0x03 ; 3 + be0: c1 f7 brne .-16 ; 0xbd2 + numbuffer[j] = '0'; + } + } + // crop the number to three post dot digits + numbuffer[3] = '\0'; + be2: 10 92 a1 02 sts 0x02A1, r1 + + postdot = atoi(numbuffer); + be6: 8e e9 ldi r24, 0x9E ; 158 + be8: 92 e0 ldi r25, 0x02 ; 2 + bea: 0e 94 0c 0f call 0x1e18 ; 0x1e18 + bee: 90 93 9b 02 sts 0x029B, r25 + bf2: 80 93 9a 02 sts 0x029A, r24 + } + num_start = 0; + bf6: 10 92 97 02 sts 0x0297, r1 + postdot = 0; + num_sign = 1; + num_start = 0; + nums_found = 0; + + for (uint8_t i=2; i<=curCmdLen; i++) { + bfa: f3 94 inc r15 + bfc: 80 91 98 02 lds r24, 0x0298 + c00: 8f 15 cp r24, r15 + c02: 08 f0 brcs .+2 ; 0xc06 + c04: a7 cf rjmp .-178 ; 0xb54 + c06: 02 c0 rjmp .+4 ; 0xc0c + static char cmdbuffer[16]; + static char numbuffer[16]; + static uint16_t predot = 0,postdot = 0; + static uint8_t cmdPos, curCmdLen, num_start = 0, nums_found = 0; + uint8_t action=0,axis=0; + int8_t num_sign = 1; + c08: dd 24 eor r13, r13 + c0a: d3 94 inc r13 + + } + + int16_t steps = 0,dest=0; + + switch (action) { + c0c: 02 30 cpi r16, 0x02 ; 2 + c0e: 09 f4 brne .+2 ; 0xc12 + c10: 5f c0 rjmp .+190 ; 0xcd0 + c12: 03 30 cpi r16, 0x03 ; 3 + c14: 09 f4 brne .+2 ; 0xc18 + c16: ba c0 rjmp .+372 ; 0xd8c + c18: 01 30 cpi r16, 0x01 ; 1 + c1a: 09 f0 breq .+2 ; 0xc1e + c1c: bf c0 rjmp .+382 ; 0xd9c + case GOTO: + uart_puts("GOTO "); + c1e: 87 e1 ldi r24, 0x17 ; 23 + c20: 91 e0 ldi r25, 0x01 ; 1 + c22: d8 dd rcall .-1104 ; 0x7d4 + uart_putc(88+axis);// x or y + c24: 81 2f mov r24, r17 + c26: 88 5a subi r24, 0xA8 ; 168 + c28: cd dd rcall .-1126 ; 0x7c4 + uart_print_signed_number(predot*num_sign,3); + c2a: cd 2d mov r28, r13 + c2c: dd 27 eor r29, r29 + c2e: c7 fd sbrc r28, 7 + c30: d0 95 com r29 + c32: 60 91 9c 02 lds r22, 0x029C + c36: 70 91 9d 02 lds r23, 0x029D + c3a: ce 01 movw r24, r28 + c3c: 0e 94 b1 0e call 0x1d62 ; 0x1d62 <__mulhi3> + c40: bc 01 movw r22, r24 + c42: 80 e0 ldi r24, 0x00 ; 0 + c44: 90 e0 ldi r25, 0x00 ; 0 + c46: 43 e0 ldi r20, 0x03 ; 3 + c48: 5c de rcall .-840 ; 0x902 + uart_putc('.'); + c4a: 8e e2 ldi r24, 0x2E ; 46 + c4c: bb dd rcall .-1162 ; 0x7c4 + uart_print_number(postdot,3); + c4e: 60 91 9a 02 lds r22, 0x029A + c52: 70 91 9b 02 lds r23, 0x029B + c56: 80 e0 ldi r24, 0x00 ; 0 + c58: 90 e0 ldi r25, 0x00 ; 0 + c5a: 43 e0 ldi r20, 0x03 ; 3 + c5c: 42 de rcall .-892 ; 0x8e2 + uart_puts("\r\n"); + c5e: 84 e1 ldi r24, 0x14 ; 20 + c60: 91 e0 ldi r25, 0x01 ; 1 + c62: b8 dd rcall .-1168 ; 0x7d4 + + dest = num_sign *( predot*24 +(postdot*10)/416); + c64: 80 91 9a 02 lds r24, 0x029A + c68: 90 91 9b 02 lds r25, 0x029B + c6c: 6a e0 ldi r22, 0x0A ; 10 + c6e: 70 e0 ldi r23, 0x00 ; 0 + c70: 0e 94 b1 0e call 0x1d62 ; 0x1d62 <__mulhi3> + c74: 60 ea ldi r22, 0xA0 ; 160 + c76: 71 e0 ldi r23, 0x01 ; 1 + c78: 0e 94 c3 0e call 0x1d86 ; 0x1d86 <__udivmodhi4> + c7c: 9b 01 movw r18, r22 + c7e: 80 91 9c 02 lds r24, 0x029C + c82: 90 91 9d 02 lds r25, 0x029D + c86: 68 e1 ldi r22, 0x18 ; 24 + c88: 70 e0 ldi r23, 0x00 ; 0 + c8a: 0e 94 b1 0e call 0x1d62 ; 0x1d62 <__mulhi3> + c8e: 28 0f add r18, r24 + c90: 39 1f adc r19, r25 + c92: ce 01 movw r24, r28 + c94: b9 01 movw r22, r18 + c96: 0e 94 b1 0e call 0x1d62 ; 0x1d62 <__mulhi3> + + if (axis == X) { + c9a: 11 23 and r17, r17 + c9c: 69 f4 brne .+26 ; 0xcb8 + steps = dest - plate_pos_x; + c9e: 20 91 7a 01 lds r18, 0x017A + ca2: 30 91 7b 01 lds r19, 0x017B + ca6: e8 2e mov r14, r24 + ca8: e7 01 movw r28, r14 + caa: 7e 01 movw r14, r28 + cac: f9 2e mov r15, r25 + cae: e7 01 movw r28, r14 + cb0: c2 1b sub r28, r18 + cb2: d3 0b sbc r29, r19 + move_plate(steps,0); + cb4: ce 01 movw r24, r28 + cb6: 4d c0 rjmp .+154 ; 0xd52 + plate_pos_x += steps; + } else if (axis == Y) { + steps = dest - plate_pos_y; + cb8: 20 91 7c 01 lds r18, 0x017C + cbc: 30 91 7d 01 lds r19, 0x017D + cc0: e8 2e mov r14, r24 + cc2: e7 01 movw r28, r14 + cc4: 7e 01 movw r14, r28 + cc6: f9 2e mov r15, r25 + cc8: e7 01 movw r28, r14 + cca: c2 1b sub r28, r18 + ccc: d3 0b sbc r29, r19 + cce: 4f c0 rjmp .+158 ; 0xd6e + } + pos_report(); + + break; + case MOVEREL: + uart_puts("MOVE "); + cd0: 8d e1 ldi r24, 0x1D ; 29 + cd2: 91 e0 ldi r25, 0x01 ; 1 + cd4: 7f dd rcall .-1282 ; 0x7d4 + uart_putc(88+axis);// x or y + cd6: 81 2f mov r24, r17 + cd8: 88 5a subi r24, 0xA8 ; 168 + cda: 74 dd rcall .-1304 ; 0x7c4 + uart_print_signed_number(predot*num_sign,3); + cdc: cd 2d mov r28, r13 + cde: dd 27 eor r29, r29 + ce0: c7 fd sbrc r28, 7 + ce2: d0 95 com r29 + ce4: 60 91 9c 02 lds r22, 0x029C + ce8: 70 91 9d 02 lds r23, 0x029D + cec: ce 01 movw r24, r28 + cee: 0e 94 b1 0e call 0x1d62 ; 0x1d62 <__mulhi3> + cf2: bc 01 movw r22, r24 + cf4: 80 e0 ldi r24, 0x00 ; 0 + cf6: 90 e0 ldi r25, 0x00 ; 0 + cf8: 43 e0 ldi r20, 0x03 ; 3 + cfa: 03 de rcall .-1018 ; 0x902 + uart_putc('.'); + cfc: 8e e2 ldi r24, 0x2E ; 46 + cfe: 62 dd rcall .-1340 ; 0x7c4 + uart_print_number(postdot,3); + d00: 60 91 9a 02 lds r22, 0x029A + d04: 70 91 9b 02 lds r23, 0x029B + d08: 80 e0 ldi r24, 0x00 ; 0 + d0a: 90 e0 ldi r25, 0x00 ; 0 + d0c: 43 e0 ldi r20, 0x03 ; 3 + d0e: e9 dd rcall .-1070 ; 0x8e2 + uart_puts("\r\n"); + d10: 84 e1 ldi r24, 0x14 ; 20 + d12: 91 e0 ldi r25, 0x01 ; 1 + d14: 5f dd rcall .-1346 ; 0x7d4 + + steps = num_sign *( predot*24 +(postdot*10)/416); + d16: 80 91 9a 02 lds r24, 0x029A + d1a: 90 91 9b 02 lds r25, 0x029B + d1e: 6a e0 ldi r22, 0x0A ; 10 + d20: 70 e0 ldi r23, 0x00 ; 0 + d22: 0e 94 b1 0e call 0x1d62 ; 0x1d62 <__mulhi3> + d26: 60 ea ldi r22, 0xA0 ; 160 + d28: 71 e0 ldi r23, 0x01 ; 1 + d2a: 0e 94 c3 0e call 0x1d86 ; 0x1d86 <__udivmodhi4> + d2e: 9b 01 movw r18, r22 + d30: 80 91 9c 02 lds r24, 0x029C + d34: 90 91 9d 02 lds r25, 0x029D + d38: 68 e1 ldi r22, 0x18 ; 24 + d3a: 70 e0 ldi r23, 0x00 ; 0 + d3c: 0e 94 b1 0e call 0x1d62 ; 0x1d62 <__mulhi3> + d40: 28 0f add r18, r24 + d42: 39 1f adc r19, r25 + d44: ce 01 movw r24, r28 + d46: b9 01 movw r22, r18 + d48: 0e 94 b1 0e call 0x1d62 ; 0x1d62 <__mulhi3> + d4c: ec 01 movw r28, r24 + + if (axis == X) { + d4e: 11 23 and r17, r17 + d50: 71 f4 brne .+28 ; 0xd6e + move_plate(steps,0); + d52: 60 e0 ldi r22, 0x00 ; 0 + d54: 70 e0 ldi r23, 0x00 ; 0 + d56: 32 de rcall .-924 ; 0x9bc + plate_pos_x += steps; + d58: 80 91 7a 01 lds r24, 0x017A + d5c: 90 91 7b 01 lds r25, 0x017B + d60: 8c 0f add r24, r28 + d62: 9d 1f adc r25, r29 + d64: 90 93 7b 01 sts 0x017B, r25 + d68: 80 93 7a 01 sts 0x017A, r24 + d6c: 17 c0 rjmp .+46 ; 0xd9c + } else if (axis == Y) { + move_plate(0,steps); + d6e: 80 e0 ldi r24, 0x00 ; 0 + d70: 90 e0 ldi r25, 0x00 ; 0 + d72: be 01 movw r22, r28 + d74: 23 de rcall .-954 ; 0x9bc + plate_pos_y += steps; + d76: 80 91 7c 01 lds r24, 0x017C + d7a: 90 91 7d 01 lds r25, 0x017D + d7e: 8c 0f add r24, r28 + d80: 9d 1f adc r25, r29 + d82: 90 93 7d 01 sts 0x017D, r25 + d86: 80 93 7c 01 sts 0x017C, r24 + d8a: 08 c0 rjmp .+16 ; 0xd9c + } + pos_report(); + break; + + case SETZERO: + plate_pos_x = 0; + d8c: 10 92 7b 01 sts 0x017B, r1 + d90: 10 92 7a 01 sts 0x017A, r1 + plate_pos_y = 0; + d94: 10 92 7d 01 sts 0x017D, r1 + d98: 10 92 7c 01 sts 0x017C, r1 + pos_report(); + break; + + case POSITION: + pos_report(); + d9c: 5a de rcall .-844 ; 0xa52 + break; + d9e: 0b c0 rjmp .+22 ; 0xdb6 + } + + + + } else { // queue command + cmdbuffer[cmdPos++] = byte; + da0: 90 91 99 02 lds r25, 0x0299 + da4: e9 2f mov r30, r25 + da6: f0 e0 ldi r31, 0x00 ; 0 + da8: e2 55 subi r30, 0x52 ; 82 + daa: fd 4f sbci r31, 0xFD ; 253 + dac: 80 83 st Z, r24 + dae: 9f 5f subi r25, 0xFF ; 255 + db0: 90 93 99 02 sts 0x0299, r25 + uart_putc(byte); + db4: 07 dd rcall .-1522 ; 0x7c4 + } + } +} + db6: df 91 pop r29 + db8: cf 91 pop r28 + dba: 1f 91 pop r17 + dbc: 0f 91 pop r16 + dbe: ff 90 pop r15 + dc0: ef 90 pop r14 + dc2: df 90 pop r13 + dc4: cf 90 pop r12 + dc6: 08 95 ret + +00000dc8
: int main(void) { - a34: af 92 push r10 - a36: bf 92 push r11 - a38: cf 92 push r12 - a3a: df 92 push r13 - a3c: ef 92 push r14 - a3e: ff 92 push r15 - a40: 0f 93 push r16 - a42: 1f 93 push r17 - a44: df 93 push r29 - a46: cf 93 push r28 - a48: cd b7 in r28, 0x3d ; 61 - a4a: de b7 in r29, 0x3e ; 62 - a4c: 60 97 sbiw r28, 0x10 ; 16 - a4e: 0f b6 in r0, 0x3f ; 63 - a50: f8 94 cli - a52: de bf out 0x3e, r29 ; 62 - a54: 0f be out 0x3f, r0 ; 63 - a56: cd bf out 0x3d, r28 ; 61 + dc8: 0f 93 push r16 + dca: 1f 93 push r17 + dcc: df 93 push r29 + dce: cf 93 push r28 + dd0: 0f 92 push r0 + dd2: cd b7 in r28, 0x3d ; 61 + dd4: de b7 in r29, 0x3e ; 62 init_motors(); - a58: 60 df rcall .-320 ; 0x91a + dd6: b3 dd rcall .-1178 ; 0x93e char dummy; uint8_t field_val = 0; SetupHardware(); - a5a: 32 de rcall .-924 ; 0x6c0 + dd8: 46 dc rcall .-1908 ; 0x666 RingBuffer_InitBuffer(&USBtoUSART_Buffer, USBtoUSART_Buffer_Data, sizeof(USBtoUSART_Buffer_Data)); - a5c: 8a e6 ldi r24, 0x6A ; 106 - a5e: 91 e0 ldi r25, 0x01 ; 1 - a60: 66 e7 ldi r22, 0x76 ; 118 - a62: 71 e0 ldi r23, 0x01 ; 1 - a64: 2e dc rcall .-1956 ; 0x2c2 + dda: 8e e7 ldi r24, 0x7E ; 126 + ddc: 91 e0 ldi r25, 0x01 ; 1 + dde: 6a e8 ldi r22, 0x8A ; 138 + de0: 71 e0 ldi r23, 0x01 ; 1 + de2: 6f da rcall .-2850 ; 0x2c2 RingBuffer_InitBuffer(&USARTtoUSB_Buffer, USARTtoUSB_Buffer_Data, sizeof(USARTtoUSB_Buffer_Data)); - a66: 86 ef ldi r24, 0xF6 ; 246 - a68: 91 e0 ldi r25, 0x01 ; 1 - a6a: 62 e0 ldi r22, 0x02 ; 2 - a6c: 72 e0 ldi r23, 0x02 ; 2 - a6e: 29 dc rcall .-1966 ; 0x2c2 + de4: 8a e0 ldi r24, 0x0A ; 10 + de6: 92 e0 ldi r25, 0x02 ; 2 + de8: 66 e1 ldi r22, 0x16 ; 22 + dea: 72 e0 ldi r23, 0x02 ; 2 + dec: 6a da rcall .-2860 ; 0x2c2 static inline void GlobalInterruptEnable(void) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) sei(); - a70: 78 94 sei + dee: 78 94 sei // LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); GlobalInterruptEnable(); touchpad_init(); // you need to call this to setup the I/O pin! - a72: 69 dd rcall .-1326 ; 0x546 - a74: 8f ef ldi r24, 0xFF ; 255 - a76: 99 e6 ldi r25, 0x69 ; 105 - a78: a8 e1 ldi r26, 0x18 ; 24 - a7a: 81 50 subi r24, 0x01 ; 1 - a7c: 90 40 sbci r25, 0x00 ; 0 - a7e: a0 40 sbci r26, 0x00 ; 0 - a80: e1 f7 brne .-8 ; 0xa7a - a82: 00 c0 rjmp .+0 ; 0xa84 - a84: 00 00 nop + df0: aa db rcall .-2220 ; 0x546 + df2: 8f ef ldi r24, 0xFF ; 255 + df4: 99 e6 ldi r25, 0x69 ; 105 + df6: a8 e1 ldi r26, 0x18 ; 24 + df8: 81 50 subi r24, 0x01 ; 1 + dfa: 90 40 sbci r25, 0x00 ; 0 + dfc: a0 40 sbci r26, 0x00 ; 0 + dfe: e1 f7 brne .-8 ; 0xdf8 + e00: 00 c0 rjmp .+0 ; 0xe02 + e02: 00 00 nop _delay_ms(500); sei(); - a86: 78 94 sei + e04: 78 94 sei uint16_t loopcounter=0; - char stringbuffer[16]; - touchpad_set_abs_mode();// tell the touchpad you want to use it in the "absolute mode" - a88: 6f dd rcall .-1314 ; 0x568 - } - // end of absolute mode demo block -// -// #elif DEMO_MODE == RELATIVE_MODE -// begin of relative mode demo block + uart_puts("you selected the relative position demo modus:\n\r"); - a8a: 80 e0 ldi r24, 0x00 ; 0 - a8c: 91 e0 ldi r25, 0x01 ; 1 - a8e: ca de rcall .-620 ; 0x824 + e06: 83 e2 ldi r24, 0x23 ; 35 + e08: 91 e0 ldi r25, 0x01 ; 1 + e0a: e4 dc rcall .-1592 ; 0x7d4 touchpad_set_rel_mode_100dpi();// use touchpad in relative mode - a90: 89 dd rcall .-1262 ; 0x5a4 + e0c: ad db rcall .-2214 ; 0x568 // touchpad_set_rel_mode_200dpi(); // uncomment this line if you want double resolution - uint8_t x, y = 0; - a92: dd 24 eor r13, r13 - } else { - y = (y + dy); - } - - uart_puts("x_pos: "); - my_uitoa(x, stringbuffer, 4); - a94: 8e 01 movw r16, r28 - a96: 0f 5f subi r16, 0xFF ; 255 - a98: 1f 4f sbci r17, 0xFF ; 255 - uint8_t x, y = 0; + int16_t x, y = 0; int8_t dx, dy = 0; + uint8_t busy = 0, last_busy = 0; + e0e: 10 e0 ldi r17, 0x00 ; 0 while (1) { Usb2SerialTask(); - a9a: b8 dd rcall .-1168 ; 0x60c + e10: df db rcall .-2114 ; 0x5d0 +// loopcounter++; // if(loopcounter<2000) { // continue; // } // loopcounter=0; - + parse_command(); // read data from virtual comport + e12: 3c de rcall .-904 ; 0xa8c touchpad_read(); // read data from touchpad - a9c: 5c dd rcall .-1352 ; 0x556 + e14: a0 db rcall .-2240 ; 0x556 dx = delta_x();// returns the amount your finger has moved in x direction since last readout - a9e: a6 dd rcall .-1204 ; 0x5ec - aa0: a8 2e mov r10, r24 + e16: cc db rcall .-2152 ; 0x5b0 + e18: 08 2f mov r16, r24 dy = delta_y();// returns the amount your finger has moved in y direction since last readout - aa2: 94 dd rcall .-1240 ; 0x5cc + e1a: ba db rcall .-2188 ; 0x590 // increment/decrement some dummy variables with the - if (x + dx > 255) { - aa4: ea 2c mov r14, r10 - aa6: ff 24 eor r15, r15 - aa8: e7 fc sbrc r14, 7 - aaa: f0 94 com r15 - aac: 97 01 movw r18, r14 - aae: 2c 0d add r18, r12 - ab0: 31 1d adc r19, r1 - ab2: 2f 3f cpi r18, 0xFF ; 255 - ab4: 31 05 cpc r19, r1 - ab6: 09 f0 breq .+2 ; 0xaba - ab8: 24 f4 brge .+8 ; 0xac2 - x = 255; - } else if (x + dx < 0) { - aba: 37 fd sbrc r19, 7 - abc: 05 c0 rjmp .+10 ; 0xac8 - x = 0; - } else { - x = (x + dx); - abe: ca 0c add r12, r10 - ac0: 04 c0 rjmp .+8 ; 0xaca - dx = delta_x();// returns the amount your finger has moved in x direction since last readout - dy = delta_y();// returns the amount your finger has moved in y direction since last readout - - // increment/decrement some dummy variables with the - if (x + dx > 255) { - x = 255; - ac2: cc 24 eor r12, r12 - ac4: ca 94 dec r12 - ac6: 01 c0 rjmp .+2 ; 0xaca - } else if (x + dx < 0) { - x = 0; - ac8: cc 24 eor r12, r12 - } else { - x = (x + dx); - } - - if (y + dy > 255) { - aca: a8 2e mov r10, r24 - acc: bb 24 eor r11, r11 - ace: a7 fc sbrc r10, 7 - ad0: b0 94 com r11 - ad2: 95 01 movw r18, r10 - ad4: 2d 0d add r18, r13 - ad6: 31 1d adc r19, r1 - ad8: 2f 3f cpi r18, 0xFF ; 255 - ada: 31 05 cpc r19, r1 - adc: 09 f0 breq .+2 ; 0xae0 - ade: 24 f4 brge .+8 ; 0xae8 - y = 255; - } else if (y + dy < 0) { - ae0: 37 fd sbrc r19, 7 - ae2: 05 c0 rjmp .+10 ; 0xaee - y = 0; - } else { - y = (y + dy); - ae4: d8 0e add r13, r24 - ae6: 04 c0 rjmp .+8 ; 0xaf0 - } else { - x = (x + dx); - } - - if (y + dy > 255) { - y = 255; - ae8: dd 24 eor r13, r13 - aea: da 94 dec r13 - aec: 01 c0 rjmp .+2 ; 0xaf0 - } else if (y + dy < 0) { - y = 0; - aee: dd 24 eor r13, r13 - } else { - y = (y + dy); - } - uart_puts("x_pos: "); - af0: 81 e3 ldi r24, 0x31 ; 49 - af2: 91 e0 ldi r25, 0x01 ; 1 - af4: 97 de rcall .-722 ; 0x824 - my_uitoa(x, stringbuffer, 4); - af6: 6c 2d mov r22, r12 - af8: 70 e0 ldi r23, 0x00 ; 0 - afa: 80 e0 ldi r24, 0x00 ; 0 - afc: 90 e0 ldi r25, 0x00 ; 0 - afe: a8 01 movw r20, r16 - b00: 24 e0 ldi r18, 0x04 ; 4 - b02: a3 de rcall .-698 ; 0x84a - uart_puts(stringbuffer); - b04: c8 01 movw r24, r16 - b06: 8e de rcall .-740 ; 0x824 - uart_puts(" y_pos: "); - b08: 89 e3 ldi r24, 0x39 ; 57 - b0a: 91 e0 ldi r25, 0x01 ; 1 - b0c: 8b de rcall .-746 ; 0x824 - my_uitoa(y, stringbuffer, 4); - b0e: 6d 2d mov r22, r13 - b10: 70 e0 ldi r23, 0x00 ; 0 - b12: 80 e0 ldi r24, 0x00 ; 0 - b14: 90 e0 ldi r25, 0x00 ; 0 - b16: a8 01 movw r20, r16 - b18: 24 e0 ldi r18, 0x04 ; 4 - b1a: 97 de rcall .-722 ; 0x84a - uart_puts(stringbuffer); - b1c: c8 01 movw r24, r16 - b1e: 82 de rcall .-764 ; 0x824 - uart_puts("\r"); - b20: 83 e4 ldi r24, 0x43 ; 67 - b22: 91 e0 ldi r25, 0x01 ; 1 - b24: 7f de rcall .-770 ; 0x824 - b26: af e3 ldi r26, 0x3F ; 63 - b28: bc e9 ldi r27, 0x9C ; 156 - b2a: 11 97 sbiw r26, 0x01 ; 1 - b2c: f1 f7 brne .-4 ; 0xb2a - b2e: 00 c0 rjmp .+0 ; 0xb30 - b30: 00 00 nop + plate_pos_x += dx; + e1c: 40 2f mov r20, r16 + e1e: 55 27 eor r21, r21 + e20: 47 fd sbrc r20, 7 + e22: 50 95 com r21 + e24: 20 91 7a 01 lds r18, 0x017A + e28: 30 91 7b 01 lds r19, 0x017B + e2c: 24 0f add r18, r20 + e2e: 35 1f adc r19, r21 + e30: 30 93 7b 01 sts 0x017B, r19 + e34: 20 93 7a 01 sts 0x017A, r18 + plate_pos_y += dy; + e38: 68 2f mov r22, r24 + e3a: 77 27 eor r23, r23 + e3c: 67 fd sbrc r22, 7 + e3e: 70 95 com r23 + e40: 80 91 7c 01 lds r24, 0x017C + e44: 90 91 7d 01 lds r25, 0x017D + e48: 86 0f add r24, r22 + e4a: 97 1f adc r25, r23 + e4c: 90 93 7d 01 sts 0x017D, r25 + e50: 80 93 7c 01 sts 0x017C, r24 - _delay_ms(10); - move_plate(dx>>0,dy>>0); - b32: c7 01 movw r24, r14 - b34: b5 01 movw r22, r10 - b36: 3c df rcall .-392 ; 0x9b0 - - - } - b38: b0 cf rjmp .-160 ; 0xa9a + + last_busy = busy; + busy = move_plate(dx,dy); + e54: ca 01 movw r24, r20 + e56: b2 dd rcall .-1180 ; 0x9bc + + + if (last_busy && !(busy)){ + e58: 11 23 and r17, r17 + e5a: 29 f0 breq .+10 ; 0xe66 + e5c: 88 23 and r24, r24 + e5e: 19 f4 brne .+6 ; 0xe66 + pos_report(); + e60: 89 83 std Y+1, r24 ; 0x01 + e62: f7 dd rcall .-1042 ; 0xa52 + e64: 89 81 ldd r24, Y+1 ; 0x01 + e66: af e3 ldi r26, 0x3F ; 63 + e68: bc e9 ldi r27, 0x9C ; 156 + e6a: 11 97 sbiw r26, 0x01 ; 1 + e6c: f1 f7 brne .-4 ; 0xe6a + e6e: 00 c0 rjmp .+0 ; 0xe70 + e70: 00 00 nop + plate_pos_x += dx; + plate_pos_y += dy; + + + last_busy = busy; + busy = move_plate(dx,dy); + e72: 18 2f mov r17, r24 + e74: cd cf rjmp .-102 ; 0xe10 -00000b3a : +00000e76 : const uint8_t DescriptorNumber = (wValue & 0xFF); const void* Address = NULL; uint16_t Size = NO_DESCRIPTOR; switch (DescriptorType) - b3a: 92 30 cpi r25, 0x02 ; 2 - b3c: 29 f0 breq .+10 ; 0xb48 - b3e: 93 30 cpi r25, 0x03 ; 3 - b40: 41 f0 breq .+16 ; 0xb52 - b42: 91 30 cpi r25, 0x01 ; 1 - b44: e9 f4 brne .+58 ; 0xb80 - b46: 17 c0 rjmp .+46 ; 0xb76 + e76: 92 30 cpi r25, 0x02 ; 2 + e78: 29 f0 breq .+10 ; 0xe84 + e7a: 93 30 cpi r25, 0x03 ; 3 + e7c: 41 f0 breq .+16 ; 0xe8e + e7e: 91 30 cpi r25, 0x01 ; 1 + e80: e9 f4 brne .+58 ; 0xebc + e82: 17 c0 rjmp .+46 ; 0xeb2 Address = &DeviceDescriptor; Size = sizeof(USB_Descriptor_Device_t); break; case DTYPE_Configuration: Address = &ConfigurationDescriptor; Size = sizeof(USB_Descriptor_Configuration_t); - b48: 2e e3 ldi r18, 0x3E ; 62 - b4a: 30 e0 ldi r19, 0x00 ; 0 + e84: 2e e3 ldi r18, 0x3E ; 62 + e86: 30 e0 ldi r19, 0x00 ; 0 case DTYPE_Device: Address = &DeviceDescriptor; Size = sizeof(USB_Descriptor_Device_t); break; case DTYPE_Configuration: Address = &ConfigurationDescriptor; - b4c: ea ea ldi r30, 0xAA ; 170 - b4e: f0 e0 ldi r31, 0x00 ; 0 + e88: ea ea ldi r30, 0xAA ; 170 + e8a: f0 e0 ldi r31, 0x00 ; 0 Size = sizeof(USB_Descriptor_Configuration_t); break; - b50: 1b c0 rjmp .+54 ; 0xb88 + e8c: 1b c0 rjmp .+54 ; 0xec4 case DTYPE_String: switch (DescriptorNumber) - b52: 81 30 cpi r24, 0x01 ; 1 - b54: 41 f0 breq .+16 ; 0xb66 - b56: 81 30 cpi r24, 0x01 ; 1 - b58: 18 f0 brcs .+6 ; 0xb60 - b5a: 82 30 cpi r24, 0x02 ; 2 - b5c: 89 f4 brne .+34 ; 0xb80 - b5e: 06 c0 rjmp .+12 ; 0xb6c + e8e: 81 30 cpi r24, 0x01 ; 1 + e90: 41 f0 breq .+16 ; 0xea2 + e92: 81 30 cpi r24, 0x01 ; 1 + e94: 18 f0 brcs .+6 ; 0xe9c + e96: 82 30 cpi r24, 0x02 ; 2 + e98: 89 f4 brne .+34 ; 0xebc + e9a: 06 c0 rjmp .+12 ; 0xea8 { case 0x00: Address = &LanguageString; Size = pgm_read_byte(&LanguageString.Header.Size); - b60: e8 ee ldi r30, 0xE8 ; 232 - b62: f0 e0 ldi r31, 0x00 ; 0 - b64: 05 c0 rjmp .+10 ; 0xb70 + e9c: e8 ee ldi r30, 0xE8 ; 232 + e9e: f0 e0 ldi r31, 0x00 ; 0 + ea0: 05 c0 rjmp .+10 ; 0xeac break; case 0x01: Address = &ManufacturerString; Size = pgm_read_byte(&ManufacturerString.Header.Size); - b66: ec ee ldi r30, 0xEC ; 236 - b68: f0 e0 ldi r31, 0x00 ; 0 - b6a: 02 c0 rjmp .+4 ; 0xb70 + ea2: ec ee ldi r30, 0xEC ; 236 + ea4: f0 e0 ldi r31, 0x00 ; 0 + ea6: 02 c0 rjmp .+4 ; 0xeac break; case 0x02: Address = &ProductString; Size = pgm_read_byte(&ProductString.Header.Size); - b6c: e6 e0 ldi r30, 0x06 ; 6 - b6e: f1 e0 ldi r31, 0x01 ; 1 - b70: 24 91 lpm r18, Z+ - b72: 30 e0 ldi r19, 0x00 ; 0 + ea8: e6 e0 ldi r30, 0x06 ; 6 + eaa: f1 e0 ldi r31, 0x01 ; 1 + eac: 24 91 lpm r18, Z+ + eae: 30 e0 ldi r19, 0x00 ; 0 break; - b74: 09 c0 rjmp .+18 ; 0xb88 + eb0: 09 c0 rjmp .+18 ; 0xec4 switch (DescriptorType) { case DTYPE_Device: Address = &DeviceDescriptor; Size = sizeof(USB_Descriptor_Device_t); - b76: 22 e1 ldi r18, 0x12 ; 18 - b78: 30 e0 ldi r19, 0x00 ; 0 + eb2: 22 e1 ldi r18, 0x12 ; 18 + eb4: 30 e0 ldi r19, 0x00 ; 0 uint16_t Size = NO_DESCRIPTOR; switch (DescriptorType) { case DTYPE_Device: Address = &DeviceDescriptor; - b7a: e8 e9 ldi r30, 0x98 ; 152 - b7c: f0 e0 ldi r31, 0x00 ; 0 - b7e: 04 c0 rjmp .+8 ; 0xb88 + eb6: e8 e9 ldi r30, 0x98 ; 152 + eb8: f0 e0 ldi r31, 0x00 ; 0 + eba: 04 c0 rjmp .+8 ; 0xec4 { const uint8_t DescriptorType = (wValue >> 8); const uint8_t DescriptorNumber = (wValue & 0xFF); const void* Address = NULL; uint16_t Size = NO_DESCRIPTOR; - b80: 20 e0 ldi r18, 0x00 ; 0 - b82: 30 e0 ldi r19, 0x00 ; 0 + ebc: 20 e0 ldi r18, 0x00 ; 0 + ebe: 30 e0 ldi r19, 0x00 ; 0 const void** const DescriptorAddress) { const uint8_t DescriptorType = (wValue >> 8); const uint8_t DescriptorNumber = (wValue & 0xFF); const void* Address = NULL; - b84: e0 e0 ldi r30, 0x00 ; 0 - b86: f0 e0 ldi r31, 0x00 ; 0 + ec0: e0 e0 ldi r30, 0x00 ; 0 + ec2: f0 e0 ldi r31, 0x00 ; 0 } break; } *DescriptorAddress = Address; - b88: da 01 movw r26, r20 - b8a: 11 96 adiw r26, 0x01 ; 1 - b8c: fc 93 st X, r31 - b8e: ee 93 st -X, r30 + ec4: da 01 movw r26, r20 + ec6: 11 96 adiw r26, 0x01 ; 1 + ec8: fc 93 st X, r31 + eca: ee 93 st -X, r30 return Size; } - b90: c9 01 movw r24, r18 - b92: 08 95 ret + ecc: c9 01 movw r24, r18 + ece: 08 95 ret -00000b94 : +00000ed0 : #if defined(TEMPLATE_FUNC_NAME) uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer, uint16_t Length) { uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); - b94: 28 2f mov r18, r24 - b96: 39 2f mov r19, r25 - b98: f9 01 movw r30, r18 + ed0: 28 2f mov r18, r24 + ed2: 39 2f mov r19, r25 + ed4: f9 01 movw r30, r18 bool LastPacketFull = false; if (Length > USB_ControlRequest.wLength) - b9a: 80 91 a2 02 lds r24, 0x02A2 - b9e: 90 91 a3 02 lds r25, 0x02A3 - ba2: 86 17 cp r24, r22 - ba4: 97 07 cpc r25, r23 - ba6: 18 f4 brcc .+6 ; 0xbae - ba8: bc 01 movw r22, r24 - baa: 20 e0 ldi r18, 0x00 ; 0 - bac: 34 c0 rjmp .+104 ; 0xc16 + ed6: 80 91 ee 02 lds r24, 0x02EE + eda: 90 91 ef 02 lds r25, 0x02EF + ede: 86 17 cp r24, r22 + ee0: 97 07 cpc r25, r23 + ee2: 18 f4 brcc .+6 ; 0xeea + ee4: bc 01 movw r22, r24 + ee6: 20 e0 ldi r18, 0x00 ; 0 + ee8: 34 c0 rjmp .+104 ; 0xf52 Length = USB_ControlRequest.wLength; else if (!(Length)) - bae: 61 15 cp r22, r1 - bb0: 71 05 cpc r23, r1 - bb2: d9 f7 brne .-10 ; 0xbaa + eea: 61 15 cp r22, r1 + eec: 71 05 cpc r23, r1 + eee: d9 f7 brne .-10 ; 0xee6 */ static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearIN(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << TXINI) | (1 << FIFOCON)); - bb4: 80 91 e8 00 lds r24, 0x00E8 - bb8: 8e 77 andi r24, 0x7E ; 126 - bba: 80 93 e8 00 sts 0x00E8, r24 - bbe: f5 cf rjmp .-22 ; 0xbaa + ef0: 80 91 e8 00 lds r24, 0x00E8 + ef4: 8e 77 andi r24, 0x7E ; 126 + ef6: 80 93 e8 00 sts 0x00E8, r24 + efa: f5 cf rjmp .-22 ; 0xee6 Endpoint_ClearIN(); while (Length || LastPacketFull) { uint8_t USB_DeviceState_LCL = USB_DeviceState; - bc0: 8e b3 in r24, 0x1e ; 30 + efc: 8e b3 in r24, 0x1e ; 30 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - bc2: 88 23 and r24, r24 - bc4: e9 f1 breq .+122 ; 0xc40 + efe: 88 23 and r24, r24 + f00: e9 f1 breq .+122 ; 0xf7c return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - bc6: 85 30 cpi r24, 0x05 ; 5 - bc8: b9 f1 breq .+110 ; 0xc38 + f02: 85 30 cpi r24, 0x05 ; 5 + f04: b9 f1 breq .+110 ; 0xf74 * \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise. */ static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsSETUPReceived(void) { return ((UEINTX & (1 << RXSTPI)) ? true : false); - bca: 80 91 e8 00 lds r24, 0x00E8 + f06: 80 91 e8 00 lds r24, 0x00E8 return ENDPOINT_RWCSTREAM_BusSuspended; else if (Endpoint_IsSETUPReceived()) - bce: 83 fd sbrc r24, 3 - bd0: 35 c0 rjmp .+106 ; 0xc3c + f0a: 83 fd sbrc r24, 3 + f0c: 35 c0 rjmp .+106 ; 0xf78 * \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise. */ static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsOUTReceived(void) { return ((UEINTX & (1 << RXOUTI)) ? true : false); - bd2: 80 91 e8 00 lds r24, 0x00E8 + f0e: 80 91 e8 00 lds r24, 0x00E8 return ENDPOINT_RWCSTREAM_HostAborted; else if (Endpoint_IsOUTReceived()) - bd6: 82 fd sbrc r24, 2 - bd8: 29 c0 rjmp .+82 ; 0xc2c + f12: 82 fd sbrc r24, 2 + f14: 29 c0 rjmp .+82 ; 0xf68 * \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise. */ static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsINReady(void) { return ((UEINTX & (1 << TXINI)) ? true : false); - bda: 80 91 e8 00 lds r24, 0x00E8 + f16: 80 91 e8 00 lds r24, 0x00E8 break; if (Endpoint_IsINReady()) - bde: 80 ff sbrs r24, 0 - be0: 1a c0 rjmp .+52 ; 0xc16 + f1a: 80 ff sbrs r24, 0 + f1c: 1a c0 rjmp .+52 ; 0xf52 #if (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) return UEBCX; #elif defined(USB_SERIES_4_AVR) return (((uint16_t)UEBCHX << 8) | UEBCLX); #elif defined(USB_SERIES_2_AVR) return UEBCLX; - be2: 80 91 f2 00 lds r24, 0x00F2 - be6: 90 e0 ldi r25, 0x00 ; 0 + f1e: 80 91 f2 00 lds r24, 0x00F2 + f22: 90 e0 ldi r25, 0x00 ; 0 { uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) - be8: 06 c0 rjmp .+12 ; 0xbf6 + f24: 06 c0 rjmp .+12 ; 0xf32 { TEMPLATE_TRANSFER_BYTE(DataStream); - bea: 21 91 ld r18, Z+ + f26: 21 91 ld r18, Z+ * \param[in] Data Data to write into the the currently selected endpoint's FIFO buffer. */ static inline void Endpoint_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE; static inline void Endpoint_Write_8(const uint8_t Data) { UEDATX = Data; - bec: 20 93 f1 00 sts 0x00F1, r18 + f28: 20 93 f1 00 sts 0x00F1, r18 TEMPLATE_BUFFER_MOVE(DataStream, 1); Length--; - bf0: 61 50 subi r22, 0x01 ; 1 - bf2: 70 40 sbci r23, 0x00 ; 0 + f2c: 61 50 subi r22, 0x01 ; 1 + f2e: 70 40 sbci r23, 0x00 ; 0 BytesInEndpoint++; - bf4: 01 96 adiw r24, 0x01 ; 1 + f30: 01 96 adiw r24, 0x01 ; 1 if (Endpoint_IsINReady()) { uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) - bf6: 61 15 cp r22, r1 - bf8: 71 05 cpc r23, r1 - bfa: 19 f0 breq .+6 ; 0xc02 - bfc: 88 30 cpi r24, 0x08 ; 8 - bfe: 91 05 cpc r25, r1 - c00: a0 f3 brcs .-24 ; 0xbea + f32: 61 15 cp r22, r1 + f34: 71 05 cpc r23, r1 + f36: 19 f0 breq .+6 ; 0xf3e + f38: 88 30 cpi r24, 0x08 ; 8 + f3a: 91 05 cpc r25, r1 + f3c: a0 f3 brcs .-24 ; 0xf26 TEMPLATE_BUFFER_MOVE(DataStream, 1); Length--; BytesInEndpoint++; } LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); - c02: 21 e0 ldi r18, 0x01 ; 1 - c04: 88 30 cpi r24, 0x08 ; 8 - c06: 91 05 cpc r25, r1 - c08: 09 f0 breq .+2 ; 0xc0c - c0a: 20 e0 ldi r18, 0x00 ; 0 + f3e: 21 e0 ldi r18, 0x01 ; 1 + f40: 88 30 cpi r24, 0x08 ; 8 + f42: 91 05 cpc r25, r1 + f44: 09 f0 breq .+2 ; 0xf48 + f46: 20 e0 ldi r18, 0x00 ; 0 */ static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearIN(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << TXINI) | (1 << FIFOCON)); - c0c: 80 91 e8 00 lds r24, 0x00E8 - c10: 8e 77 andi r24, 0x7E ; 126 - c12: 80 93 e8 00 sts 0x00E8, r24 + f48: 80 91 e8 00 lds r24, 0x00E8 + f4c: 8e 77 andi r24, 0x7E ; 126 + f4e: 80 93 e8 00 sts 0x00E8, r24 if (Length > USB_ControlRequest.wLength) Length = USB_ControlRequest.wLength; else if (!(Length)) Endpoint_ClearIN(); while (Length || LastPacketFull) - c16: 61 15 cp r22, r1 - c18: 71 05 cpc r23, r1 - c1a: 91 f6 brne .-92 ; 0xbc0 - c1c: 22 23 and r18, r18 - c1e: 81 f6 brne .-96 ; 0xbc0 - c20: 05 c0 rjmp .+10 ; 0xc2c + f52: 61 15 cp r22, r1 + f54: 71 05 cpc r23, r1 + f56: 91 f6 brne .-92 ; 0xefc + f58: 22 23 and r18, r18 + f5a: 81 f6 brne .-96 ; 0xefc + f5c: 05 c0 rjmp .+10 ; 0xf68 } } while (!(Endpoint_IsOUTReceived())) { uint8_t USB_DeviceState_LCL = USB_DeviceState; - c22: 8e b3 in r24, 0x1e ; 30 + f5e: 8e b3 in r24, 0x1e ; 30 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - c24: 88 23 and r24, r24 - c26: 61 f0 breq .+24 ; 0xc40 + f60: 88 23 and r24, r24 + f62: 61 f0 breq .+24 ; 0xf7c return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - c28: 85 30 cpi r24, 0x05 ; 5 - c2a: 61 f0 breq .+24 ; 0xc44 + f64: 85 30 cpi r24, 0x05 ; 5 + f66: 61 f0 breq .+24 ; 0xf80 * \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise. */ static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsOUTReceived(void) { return ((UEINTX & (1 << RXOUTI)) ? true : false); - c2c: 80 91 e8 00 lds r24, 0x00E8 + f68: 80 91 e8 00 lds r24, 0x00E8 LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); Endpoint_ClearIN(); } } while (!(Endpoint_IsOUTReceived())) - c30: 82 ff sbrs r24, 2 - c32: f7 cf rjmp .-18 ; 0xc22 + f6c: 82 ff sbrs r24, 2 + f6e: f7 cf rjmp .-18 ; 0xf5e return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) return ENDPOINT_RWCSTREAM_BusSuspended; } return ENDPOINT_RWCSTREAM_NoError; - c34: 80 e0 ldi r24, 0x00 ; 0 - c36: 08 95 ret + f70: 80 e0 ldi r24, 0x00 ; 0 + f72: 08 95 ret uint8_t USB_DeviceState_LCL = USB_DeviceState; if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) return ENDPOINT_RWCSTREAM_BusSuspended; - c38: 83 e0 ldi r24, 0x03 ; 3 - c3a: 08 95 ret + f74: 83 e0 ldi r24, 0x03 ; 3 + f76: 08 95 ret else if (Endpoint_IsSETUPReceived()) return ENDPOINT_RWCSTREAM_HostAborted; - c3c: 81 e0 ldi r24, 0x01 ; 1 - c3e: 08 95 ret + f78: 81 e0 ldi r24, 0x01 ; 1 + f7a: 08 95 ret while (!(Endpoint_IsOUTReceived())) { uint8_t USB_DeviceState_LCL = USB_DeviceState; if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) return ENDPOINT_RWCSTREAM_DeviceDisconnected; - c40: 82 e0 ldi r24, 0x02 ; 2 - c42: 08 95 ret + f7c: 82 e0 ldi r24, 0x02 ; 2 + f7e: 08 95 ret else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) return ENDPOINT_RWCSTREAM_BusSuspended; - c44: 83 e0 ldi r24, 0x03 ; 3 + f80: 83 e0 ldi r24, 0x03 ; 3 } return ENDPOINT_RWCSTREAM_NoError; } - c46: 08 95 ret + f82: 08 95 ret -00000c48 : +00000f84 : #if defined(TEMPLATE_FUNC_NAME) uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer, uint16_t Length) { uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); - c48: e8 2f mov r30, r24 - c4a: f9 2f mov r31, r25 + f84: e8 2f mov r30, r24 + f86: f9 2f mov r31, r25 bool LastPacketFull = false; if (Length > USB_ControlRequest.wLength) - c4c: 80 91 a2 02 lds r24, 0x02A2 - c50: 90 91 a3 02 lds r25, 0x02A3 - c54: 86 17 cp r24, r22 - c56: 97 07 cpc r25, r23 - c58: 18 f4 brcc .+6 ; 0xc60 - c5a: bc 01 movw r22, r24 - c5c: 20 e0 ldi r18, 0x00 ; 0 - c5e: 36 c0 rjmp .+108 ; 0xccc + f88: 80 91 ee 02 lds r24, 0x02EE + f8c: 90 91 ef 02 lds r25, 0x02EF + f90: 86 17 cp r24, r22 + f92: 97 07 cpc r25, r23 + f94: 18 f4 brcc .+6 ; 0xf9c + f96: bc 01 movw r22, r24 + f98: 20 e0 ldi r18, 0x00 ; 0 + f9a: 36 c0 rjmp .+108 ; 0x1008 Length = USB_ControlRequest.wLength; else if (!(Length)) - c60: 61 15 cp r22, r1 - c62: 71 05 cpc r23, r1 - c64: d9 f7 brne .-10 ; 0xc5c + f9c: 61 15 cp r22, r1 + f9e: 71 05 cpc r23, r1 + fa0: d9 f7 brne .-10 ; 0xf98 */ static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearIN(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << TXINI) | (1 << FIFOCON)); - c66: 80 91 e8 00 lds r24, 0x00E8 - c6a: 8e 77 andi r24, 0x7E ; 126 - c6c: 80 93 e8 00 sts 0x00E8, r24 - c70: f5 cf rjmp .-22 ; 0xc5c + fa2: 80 91 e8 00 lds r24, 0x00E8 + fa6: 8e 77 andi r24, 0x7E ; 126 + fa8: 80 93 e8 00 sts 0x00E8, r24 + fac: f5 cf rjmp .-22 ; 0xf98 Endpoint_ClearIN(); while (Length || LastPacketFull) { uint8_t USB_DeviceState_LCL = USB_DeviceState; - c72: 8e b3 in r24, 0x1e ; 30 + fae: 8e b3 in r24, 0x1e ; 30 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - c74: 88 23 and r24, r24 - c76: 09 f4 brne .+2 ; 0xc7a - c78: 3e c0 rjmp .+124 ; 0xcf6 + fb0: 88 23 and r24, r24 + fb2: 09 f4 brne .+2 ; 0xfb6 + fb4: 3e c0 rjmp .+124 ; 0x1032 return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - c7a: 85 30 cpi r24, 0x05 ; 5 - c7c: c1 f1 breq .+112 ; 0xcee + fb6: 85 30 cpi r24, 0x05 ; 5 + fb8: c1 f1 breq .+112 ; 0x102a * \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise. */ static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsSETUPReceived(void) { return ((UEINTX & (1 << RXSTPI)) ? true : false); - c7e: 80 91 e8 00 lds r24, 0x00E8 + fba: 80 91 e8 00 lds r24, 0x00E8 return ENDPOINT_RWCSTREAM_BusSuspended; else if (Endpoint_IsSETUPReceived()) - c82: 83 fd sbrc r24, 3 - c84: 36 c0 rjmp .+108 ; 0xcf2 + fbe: 83 fd sbrc r24, 3 + fc0: 36 c0 rjmp .+108 ; 0x102e * \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise. */ static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsOUTReceived(void) { return ((UEINTX & (1 << RXOUTI)) ? true : false); - c86: 80 91 e8 00 lds r24, 0x00E8 + fc2: 80 91 e8 00 lds r24, 0x00E8 return ENDPOINT_RWCSTREAM_HostAborted; else if (Endpoint_IsOUTReceived()) - c8a: 82 fd sbrc r24, 2 - c8c: 2a c0 rjmp .+84 ; 0xce2 + fc6: 82 fd sbrc r24, 2 + fc8: 2a c0 rjmp .+84 ; 0x101e * \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise. */ static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsINReady(void) { return ((UEINTX & (1 << TXINI)) ? true : false); - c8e: 80 91 e8 00 lds r24, 0x00E8 + fca: 80 91 e8 00 lds r24, 0x00E8 break; if (Endpoint_IsINReady()) - c92: 80 ff sbrs r24, 0 - c94: 1b c0 rjmp .+54 ; 0xccc + fce: 80 ff sbrs r24, 0 + fd0: 1b c0 rjmp .+54 ; 0x1008 #if (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) return UEBCX; #elif defined(USB_SERIES_4_AVR) return (((uint16_t)UEBCHX << 8) | UEBCLX); #elif defined(USB_SERIES_2_AVR) return UEBCLX; - c96: 80 91 f2 00 lds r24, 0x00F2 - c9a: 90 e0 ldi r25, 0x00 ; 0 + fd2: 80 91 f2 00 lds r24, 0x00F2 + fd6: 90 e0 ldi r25, 0x00 ; 0 { uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) - c9c: 07 c0 rjmp .+14 ; 0xcac + fd8: 07 c0 rjmp .+14 ; 0xfe8 { TEMPLATE_TRANSFER_BYTE(DataStream); - c9e: 24 91 lpm r18, Z+ + fda: 24 91 lpm r18, Z+ * \param[in] Data Data to write into the the currently selected endpoint's FIFO buffer. */ static inline void Endpoint_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE; static inline void Endpoint_Write_8(const uint8_t Data) { UEDATX = Data; - ca0: 20 93 f1 00 sts 0x00F1, r18 + fdc: 20 93 f1 00 sts 0x00F1, r18 TEMPLATE_BUFFER_MOVE(DataStream, 1); - ca4: 31 96 adiw r30, 0x01 ; 1 + fe0: 31 96 adiw r30, 0x01 ; 1 Length--; - ca6: 61 50 subi r22, 0x01 ; 1 - ca8: 70 40 sbci r23, 0x00 ; 0 + fe2: 61 50 subi r22, 0x01 ; 1 + fe4: 70 40 sbci r23, 0x00 ; 0 BytesInEndpoint++; - caa: 01 96 adiw r24, 0x01 ; 1 + fe6: 01 96 adiw r24, 0x01 ; 1 if (Endpoint_IsINReady()) { uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) - cac: 61 15 cp r22, r1 - cae: 71 05 cpc r23, r1 - cb0: 19 f0 breq .+6 ; 0xcb8 - cb2: 88 30 cpi r24, 0x08 ; 8 - cb4: 91 05 cpc r25, r1 - cb6: 98 f3 brcs .-26 ; 0xc9e + fe8: 61 15 cp r22, r1 + fea: 71 05 cpc r23, r1 + fec: 19 f0 breq .+6 ; 0xff4 + fee: 88 30 cpi r24, 0x08 ; 8 + ff0: 91 05 cpc r25, r1 + ff2: 98 f3 brcs .-26 ; 0xfda TEMPLATE_BUFFER_MOVE(DataStream, 1); Length--; BytesInEndpoint++; } LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); - cb8: 21 e0 ldi r18, 0x01 ; 1 - cba: 88 30 cpi r24, 0x08 ; 8 - cbc: 91 05 cpc r25, r1 - cbe: 09 f0 breq .+2 ; 0xcc2 - cc0: 20 e0 ldi r18, 0x00 ; 0 + ff4: 21 e0 ldi r18, 0x01 ; 1 + ff6: 88 30 cpi r24, 0x08 ; 8 + ff8: 91 05 cpc r25, r1 + ffa: 09 f0 breq .+2 ; 0xffe + ffc: 20 e0 ldi r18, 0x00 ; 0 */ static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearIN(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << TXINI) | (1 << FIFOCON)); - cc2: 80 91 e8 00 lds r24, 0x00E8 - cc6: 8e 77 andi r24, 0x7E ; 126 - cc8: 80 93 e8 00 sts 0x00E8, r24 + ffe: 80 91 e8 00 lds r24, 0x00E8 + 1002: 8e 77 andi r24, 0x7E ; 126 + 1004: 80 93 e8 00 sts 0x00E8, r24 if (Length > USB_ControlRequest.wLength) Length = USB_ControlRequest.wLength; else if (!(Length)) Endpoint_ClearIN(); while (Length || LastPacketFull) - ccc: 61 15 cp r22, r1 - cce: 71 05 cpc r23, r1 - cd0: 81 f6 brne .-96 ; 0xc72 - cd2: 22 23 and r18, r18 - cd4: 71 f6 brne .-100 ; 0xc72 - cd6: 05 c0 rjmp .+10 ; 0xce2 + 1008: 61 15 cp r22, r1 + 100a: 71 05 cpc r23, r1 + 100c: 81 f6 brne .-96 ; 0xfae + 100e: 22 23 and r18, r18 + 1010: 71 f6 brne .-100 ; 0xfae + 1012: 05 c0 rjmp .+10 ; 0x101e } } while (!(Endpoint_IsOUTReceived())) { uint8_t USB_DeviceState_LCL = USB_DeviceState; - cd8: 8e b3 in r24, 0x1e ; 30 + 1014: 8e b3 in r24, 0x1e ; 30 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - cda: 88 23 and r24, r24 - cdc: 61 f0 breq .+24 ; 0xcf6 + 1016: 88 23 and r24, r24 + 1018: 61 f0 breq .+24 ; 0x1032 return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - cde: 85 30 cpi r24, 0x05 ; 5 - ce0: 61 f0 breq .+24 ; 0xcfa + 101a: 85 30 cpi r24, 0x05 ; 5 + 101c: 61 f0 breq .+24 ; 0x1036 * \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise. */ static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsOUTReceived(void) { return ((UEINTX & (1 << RXOUTI)) ? true : false); - ce2: 80 91 e8 00 lds r24, 0x00E8 + 101e: 80 91 e8 00 lds r24, 0x00E8 LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); Endpoint_ClearIN(); } } while (!(Endpoint_IsOUTReceived())) - ce6: 82 ff sbrs r24, 2 - ce8: f7 cf rjmp .-18 ; 0xcd8 + 1022: 82 ff sbrs r24, 2 + 1024: f7 cf rjmp .-18 ; 0x1014 return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) return ENDPOINT_RWCSTREAM_BusSuspended; } return ENDPOINT_RWCSTREAM_NoError; - cea: 80 e0 ldi r24, 0x00 ; 0 - cec: 08 95 ret + 1026: 80 e0 ldi r24, 0x00 ; 0 + 1028: 08 95 ret uint8_t USB_DeviceState_LCL = USB_DeviceState; if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) return ENDPOINT_RWCSTREAM_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) return ENDPOINT_RWCSTREAM_BusSuspended; - cee: 83 e0 ldi r24, 0x03 ; 3 - cf0: 08 95 ret + 102a: 83 e0 ldi r24, 0x03 ; 3 + 102c: 08 95 ret else if (Endpoint_IsSETUPReceived()) return ENDPOINT_RWCSTREAM_HostAborted; - cf2: 81 e0 ldi r24, 0x01 ; 1 - cf4: 08 95 ret + 102e: 81 e0 ldi r24, 0x01 ; 1 + 1030: 08 95 ret while (!(Endpoint_IsOUTReceived())) { uint8_t USB_DeviceState_LCL = USB_DeviceState; if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) return ENDPOINT_RWCSTREAM_DeviceDisconnected; - cf6: 82 e0 ldi r24, 0x02 ; 2 - cf8: 08 95 ret + 1032: 82 e0 ldi r24, 0x02 ; 2 + 1034: 08 95 ret else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) return ENDPOINT_RWCSTREAM_BusSuspended; - cfa: 83 e0 ldi r24, 0x03 ; 3 + 1036: 83 e0 ldi r24, 0x03 ; 3 } return ENDPOINT_RWCSTREAM_NoError; } - cfc: 08 95 ret + 1038: 08 95 ret -00000cfe : +0000103a : UECFG0X = UECFG0XData; UECFG1X = UECFG1XData; return Endpoint_IsConfigured(); #else for (uint8_t EPNum = Number; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) - cfe: 98 2f mov r25, r24 - d00: 2c c0 rjmp .+88 ; 0xd5a + 103a: 98 2f mov r25, r24 + 103c: 2c c0 rjmp .+88 ; 0x1096 */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - d02: 29 2f mov r18, r25 - d04: 2f 70 andi r18, 0x0F ; 15 - d06: 20 93 e9 00 sts 0x00E9, r18 + 103e: 29 2f mov r18, r25 + 1040: 2f 70 andi r18, 0x0F ; 15 + 1042: 20 93 e9 00 sts 0x00E9, r18 uint8_t UECFG1XTemp; uint8_t UEIENXTemp; Endpoint_SelectEndpoint(EPNum); if (EPNum == Number) - d0a: 98 17 cp r25, r24 - d0c: 39 f0 breq .+14 ; 0xd1c + 1046: 98 17 cp r25, r24 + 1048: 39 f0 breq .+14 ; 0x1058 UECFG1XTemp = UECFG1XData; UEIENXTemp = 0; } else { UECFG0XTemp = UECFG0X; - d0e: 70 91 ec 00 lds r23, 0x00EC + 104a: 70 91 ec 00 lds r23, 0x00EC UECFG1XTemp = UECFG1X; - d12: 20 91 ed 00 lds r18, 0x00ED + 104e: 20 91 ed 00 lds r18, 0x00ED UEIENXTemp = UEIENX; - d16: 50 91 f0 00 lds r21, 0x00F0 - d1a: 03 c0 rjmp .+6 ; 0xd22 + 1052: 50 91 f0 00 lds r21, 0x00F0 + 1056: 03 c0 rjmp .+6 ; 0x105e Endpoint_SelectEndpoint(EPNum); if (EPNum == Number) { UECFG0XTemp = UECFG0XData; UECFG1XTemp = UECFG1XData; - d1c: 24 2f mov r18, r20 + 1058: 24 2f mov r18, r20 Endpoint_SelectEndpoint(EPNum); if (EPNum == Number) { UECFG0XTemp = UECFG0XData; - d1e: 76 2f mov r23, r22 + 105a: 76 2f mov r23, r22 UECFG1XTemp = UECFG1XData; UEIENXTemp = 0; - d20: 50 e0 ldi r21, 0x00 ; 0 + 105c: 50 e0 ldi r21, 0x00 ; 0 UECFG0XTemp = UECFG0X; UECFG1XTemp = UECFG1X; UEIENXTemp = UEIENX; } if (!(UECFG1XTemp & (1 << ALLOC))) - d22: 21 ff sbrs r18, 1 - d24: 19 c0 rjmp .+50 ; 0xd58 + 105e: 21 ff sbrs r18, 1 + 1060: 19 c0 rjmp .+50 ; 0x1094 * to and from a host. */ static inline void Endpoint_DisableEndpoint(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_DisableEndpoint(void) { UECONX &= ~(1 << EPEN); - d26: 30 91 eb 00 lds r19, 0x00EB - d2a: 3e 7f andi r19, 0xFE ; 254 - d2c: 30 93 eb 00 sts 0x00EB, r19 + 1062: 30 91 eb 00 lds r19, 0x00EB + 1066: 3e 7f andi r19, 0xFE ; 254 + 1068: 30 93 eb 00 sts 0x00EB, r19 continue; Endpoint_DisableEndpoint(); UECFG1X &= ~(1 << ALLOC); - d30: 30 91 ed 00 lds r19, 0x00ED - d34: 3d 7f andi r19, 0xFD ; 253 - d36: 30 93 ed 00 sts 0x00ED, r19 + 106c: 30 91 ed 00 lds r19, 0x00ED + 1070: 3d 7f andi r19, 0xFD ; 253 + 1072: 30 93 ed 00 sts 0x00ED, r19 * \note Endpoints must first be configured properly via \ref Endpoint_ConfigureEndpoint(). */ static inline void Endpoint_EnableEndpoint(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_EnableEndpoint(void) { UECONX |= (1 << EPEN); - d3a: 30 91 eb 00 lds r19, 0x00EB - d3e: 31 60 ori r19, 0x01 ; 1 - d40: 30 93 eb 00 sts 0x00EB, r19 + 1076: 30 91 eb 00 lds r19, 0x00EB + 107a: 31 60 ori r19, 0x01 ; 1 + 107c: 30 93 eb 00 sts 0x00EB, r19 Endpoint_EnableEndpoint(); UECFG0X = UECFG0XTemp; - d44: 70 93 ec 00 sts 0x00EC, r23 + 1080: 70 93 ec 00 sts 0x00EC, r23 UECFG1X = UECFG1XTemp; - d48: 20 93 ed 00 sts 0x00ED, r18 + 1084: 20 93 ed 00 sts 0x00ED, r18 UEIENX = UEIENXTemp; - d4c: 50 93 f0 00 sts 0x00F0, r21 + 1088: 50 93 f0 00 sts 0x00F0, r21 * \return Boolean \c true if the currently selected endpoint has been configured, \c false otherwise. */ static inline bool Endpoint_IsConfigured(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsConfigured(void) { return ((UESTA0X & (1 << CFGOK)) ? true : false); - d50: 20 91 ee 00 lds r18, 0x00EE + 108c: 20 91 ee 00 lds r18, 0x00EE if (!(Endpoint_IsConfigured())) - d54: 27 ff sbrs r18, 7 - d56: 08 c0 rjmp .+16 ; 0xd68 + 1090: 27 ff sbrs r18, 7 + 1092: 08 c0 rjmp .+16 ; 0x10a4 UECFG0X = UECFG0XData; UECFG1X = UECFG1XData; return Endpoint_IsConfigured(); #else for (uint8_t EPNum = Number; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) - d58: 9f 5f subi r25, 0xFF ; 255 - d5a: 95 30 cpi r25, 0x05 ; 5 - d5c: 90 f2 brcs .-92 ; 0xd02 + 1094: 9f 5f subi r25, 0xFF ; 255 + 1096: 95 30 cpi r25, 0x05 ; 5 + 1098: 90 f2 brcs .-92 ; 0x103e */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - d5e: 8f 70 andi r24, 0x0F ; 15 - d60: 80 93 e9 00 sts 0x00E9, r24 + 109a: 8f 70 andi r24, 0x0F ; 15 + 109c: 80 93 e9 00 sts 0x00E9, r24 if (!(Endpoint_IsConfigured())) return false; } Endpoint_SelectEndpoint(Number); return true; - d64: 81 e0 ldi r24, 0x01 ; 1 - d66: 08 95 ret + 10a0: 81 e0 ldi r24, 0x01 ; 1 + 10a2: 08 95 ret UECFG0X = UECFG0XTemp; UECFG1X = UECFG1XTemp; UEIENX = UEIENXTemp; if (!(Endpoint_IsConfigured())) return false; - d68: 80 e0 ldi r24, 0x00 ; 0 + 10a4: 80 e0 ldi r24, 0x00 ; 0 } Endpoint_SelectEndpoint(Number); return true; #endif } - d6a: 08 95 ret + 10a6: 08 95 ret -00000d6c : +000010a8 : uint8_t USB_Device_ControlEndpointSize = ENDPOINT_CONTROLEP_DEFAULT_SIZE; #endif bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, const uint8_t Entries) { - d6c: ef 92 push r14 - d6e: ff 92 push r15 - d70: 0f 93 push r16 - d72: 1f 93 push r17 - d74: cf 93 push r28 - d76: df 93 push r29 - d78: 16 2f mov r17, r22 + 10a8: ef 92 push r14 + 10aa: ff 92 push r15 + 10ac: 0f 93 push r16 + 10ae: 1f 93 push r17 + 10b0: cf 93 push r28 + 10b2: df 93 push r29 + 10b4: 16 2f mov r17, r22 { if (!(Table[i].Address)) continue; if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) return false; - d7a: e8 2e mov r14, r24 - d7c: e7 01 movw r28, r14 - d7e: 7e 01 movw r14, r28 - d80: f9 2e mov r15, r25 - d82: e7 01 movw r28, r14 + 10b6: e8 2e mov r14, r24 + 10b8: e7 01 movw r28, r14 + 10ba: 7e 01 movw r14, r28 + 10bc: f9 2e mov r15, r25 + 10be: e7 01 movw r28, r14 #endif bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, const uint8_t Entries) { for (uint8_t i = 0; i < Entries; i++) - d84: 00 e0 ldi r16, 0x00 ; 0 - d86: 2a c0 rjmp .+84 ; 0xddc + 10c0: 00 e0 ldi r16, 0x00 ; 0 + 10c2: 2a c0 rjmp .+84 ; 0x1118 { if (!(Table[i].Address)) - d88: 98 81 ld r25, Y - d8a: 99 23 and r25, r25 - d8c: 29 f1 breq .+74 ; 0xdd8 + 10c4: 98 81 ld r25, Y + 10c6: 99 23 and r25, r25 + 10c8: 29 f1 breq .+74 ; 0x1114 continue; if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) - d8e: 6b 81 ldd r22, Y+3 ; 0x03 - d90: e9 81 ldd r30, Y+1 ; 0x01 - d92: fa 81 ldd r31, Y+2 ; 0x02 - d94: 2c 81 ldd r18, Y+4 ; 0x04 + 10ca: 6b 81 ldd r22, Y+3 ; 0x03 + 10cc: e9 81 ldd r30, Y+1 ; 0x01 + 10ce: fa 81 ldd r31, Y+2 ; 0x02 + 10d0: 2c 81 ldd r18, Y+4 ; 0x04 static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address, const uint8_t Type, const uint16_t Size, const uint8_t Banks) { uint8_t Number = (Address & ENDPOINT_EPNUM_MASK); - d96: 89 2f mov r24, r25 - d98: 8f 70 andi r24, 0x0F ; 15 + 10d2: 89 2f mov r24, r25 + 10d4: 8f 70 andi r24, 0x0F ; 15 if (Number >= ENDPOINT_TOTAL_ENDPOINTS) - d9a: 85 30 cpi r24, 0x05 ; 5 - d9c: 18 f5 brcc .+70 ; 0xde4 + 10d6: 85 30 cpi r24, 0x05 ; 5 + 10d8: 18 f5 brcc .+70 ; 0x1120 return false; return Endpoint_ConfigureEndpoint_Prv(Number, ((Type << EPTYPE0) | ((Address & ENDPOINT_DIR_IN) ? (1 << EPDIR) : 0)), - d9e: 62 95 swap r22 - da0: 66 0f add r22, r22 - da2: 66 0f add r22, r22 - da4: 60 7c andi r22, 0xC0 ; 192 - da6: 99 1f adc r25, r25 - da8: 99 27 eor r25, r25 - daa: 99 1f adc r25, r25 + 10da: 62 95 swap r22 + 10dc: 66 0f add r22, r22 + 10de: 66 0f add r22, r22 + 10e0: 60 7c andi r22, 0xC0 ; 192 + 10e2: 99 1f adc r25, r25 + 10e4: 99 27 eor r25, r25 + 10e6: 99 1f adc r25, r25 uint8_t Number = (Address & ENDPOINT_EPNUM_MASK); if (Number >= ENDPOINT_TOTAL_ENDPOINTS) return false; return Endpoint_ConfigureEndpoint_Prv(Number, - dac: 69 2b or r22, r25 - dae: 22 30 cpi r18, 0x02 ; 2 - db0: 10 f0 brcs .+4 ; 0xdb6 - db2: 96 e0 ldi r25, 0x06 ; 6 - db4: 01 c0 rjmp .+2 ; 0xdb8 - db6: 92 e0 ldi r25, 0x02 ; 2 + 10e8: 69 2b or r22, r25 + 10ea: 22 30 cpi r18, 0x02 ; 2 + 10ec: 10 f0 brcs .+4 ; 0x10f2 + 10ee: 96 e0 ldi r25, 0x06 ; 6 + 10f0: 01 c0 rjmp .+2 ; 0x10f4 + 10f2: 92 e0 ldi r25, 0x02 ; 2 static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) { uint8_t MaskVal = 0; uint16_t CheckBytes = 8; - db8: 28 e0 ldi r18, 0x08 ; 8 - dba: 30 e0 ldi r19, 0x00 ; 0 + 10f4: 28 e0 ldi r18, 0x08 ; 8 + 10f6: 30 e0 ldi r19, 0x00 ; 0 /* Inline Functions: */ static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) { uint8_t MaskVal = 0; - dbc: 40 e0 ldi r20, 0x00 ; 0 - dbe: 03 c0 rjmp .+6 ; 0xdc6 + 10f8: 40 e0 ldi r20, 0x00 ; 0 + 10fa: 03 c0 rjmp .+6 ; 0x1102 uint16_t CheckBytes = 8; while (CheckBytes < Bytes) { MaskVal++; - dc0: 4f 5f subi r20, 0xFF ; 255 + 10fc: 4f 5f subi r20, 0xFF ; 255 CheckBytes <<= 1; - dc2: 22 0f add r18, r18 - dc4: 33 1f adc r19, r19 + 10fe: 22 0f add r18, r18 + 1100: 33 1f adc r19, r19 static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) { uint8_t MaskVal = 0; uint16_t CheckBytes = 8; while (CheckBytes < Bytes) - dc6: 2e 17 cp r18, r30 - dc8: 3f 07 cpc r19, r31 - dca: d0 f3 brcs .-12 ; 0xdc0 + 1102: 2e 17 cp r18, r30 + 1104: 3f 07 cpc r19, r31 + 1106: d0 f3 brcs .-12 ; 0x10fc { MaskVal++; CheckBytes <<= 1; } return (MaskVal << EPSIZE0); - dcc: 42 95 swap r20 - dce: 40 7f andi r20, 0xF0 ; 240 + 1108: 42 95 swap r20 + 110a: 40 7f andi r20, 0xF0 ; 240 uint8_t Number = (Address & ENDPOINT_EPNUM_MASK); if (Number >= ENDPOINT_TOTAL_ENDPOINTS) return false; return Endpoint_ConfigureEndpoint_Prv(Number, - dd0: 49 2b or r20, r25 - dd2: 95 df rcall .-214 ; 0xcfe - dd4: 88 23 and r24, r24 - dd6: 31 f0 breq .+12 ; 0xde4 + 110c: 49 2b or r20, r25 + 110e: 95 df rcall .-214 ; 0x103a + 1110: 88 23 and r24, r24 + 1112: 31 f0 breq .+12 ; 0x1120 #endif bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, const uint8_t Entries) { for (uint8_t i = 0; i < Entries; i++) - dd8: 0f 5f subi r16, 0xFF ; 255 - dda: 25 96 adiw r28, 0x05 ; 5 - ddc: 01 17 cp r16, r17 - dde: a0 f2 brcs .-88 ; 0xd88 + 1114: 0f 5f subi r16, 0xFF ; 255 + 1116: 25 96 adiw r28, 0x05 ; 5 + 1118: 01 17 cp r16, r17 + 111a: a0 f2 brcs .-88 ; 0x10c4 if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) return false; } return true; - de0: 81 e0 ldi r24, 0x01 ; 1 - de2: 01 c0 rjmp .+2 ; 0xde6 + 111c: 81 e0 ldi r24, 0x01 ; 1 + 111e: 01 c0 rjmp .+2 ; 0x1122 { if (!(Table[i].Address)) continue; if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) return false; - de4: 80 e0 ldi r24, 0x00 ; 0 + 1120: 80 e0 ldi r24, 0x00 ; 0 } return true; } - de6: df 91 pop r29 - de8: cf 91 pop r28 - dea: 1f 91 pop r17 - dec: 0f 91 pop r16 - dee: ff 90 pop r15 - df0: ef 90 pop r14 - df2: 08 95 ret - -00000df4 : + 1122: df 91 pop r29 + 1124: cf 91 pop r28 + 1126: 1f 91 pop r17 + 1128: 0f 91 pop r16 + 112a: ff 90 pop r15 + 112c: ef 90 pop r14 + 112e: 08 95 ret + +00001130 : } } void Endpoint_ClearStatusStage(void) { if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST) - df4: 80 91 9c 02 lds r24, 0x029C - df8: 87 ff sbrs r24, 7 - dfa: 11 c0 rjmp .+34 ; 0xe1e - dfc: 03 c0 rjmp .+6 ; 0xe04 + 1130: 80 91 e8 02 lds r24, 0x02E8 + 1134: 87 ff sbrs r24, 7 + 1136: 11 c0 rjmp .+34 ; 0x115a + 1138: 03 c0 rjmp .+6 ; 0x1140 { while (!(Endpoint_IsOUTReceived())) { if (USB_DeviceState == DEVICE_STATE_Unattached) - dfe: 8e b3 in r24, 0x1e ; 30 - e00: 88 23 and r24, r24 - e02: b1 f0 breq .+44 ; 0xe30 + 113a: 8e b3 in r24, 0x1e ; 30 + 113c: 88 23 and r24, r24 + 113e: b1 f0 breq .+44 ; 0x116c * \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise. */ static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsOUTReceived(void) { return ((UEINTX & (1 << RXOUTI)) ? true : false); - e04: 80 91 e8 00 lds r24, 0x00E8 + 1140: 80 91 e8 00 lds r24, 0x00E8 void Endpoint_ClearStatusStage(void) { if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST) { while (!(Endpoint_IsOUTReceived())) - e08: 82 ff sbrs r24, 2 - e0a: f9 cf rjmp .-14 ; 0xdfe + 1144: 82 ff sbrs r24, 2 + 1146: f9 cf rjmp .-14 ; 0x113a */ static inline void Endpoint_ClearOUT(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearOUT(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << RXOUTI) | (1 << FIFOCON)); - e0c: 80 91 e8 00 lds r24, 0x00E8 - e10: 8b 77 andi r24, 0x7B ; 123 - e12: 80 93 e8 00 sts 0x00E8, r24 - e16: 08 95 ret + 1148: 80 91 e8 00 lds r24, 0x00E8 + 114c: 8b 77 andi r24, 0x7B ; 123 + 114e: 80 93 e8 00 sts 0x00E8, r24 + 1152: 08 95 ret } else { while (!(Endpoint_IsINReady())) { if (USB_DeviceState == DEVICE_STATE_Unattached) - e18: 8e b3 in r24, 0x1e ; 30 - e1a: 88 23 and r24, r24 - e1c: 49 f0 breq .+18 ; 0xe30 + 1154: 8e b3 in r24, 0x1e ; 30 + 1156: 88 23 and r24, r24 + 1158: 49 f0 breq .+18 ; 0x116c * \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise. */ static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsINReady(void) { return ((UEINTX & (1 << TXINI)) ? true : false); - e1e: 80 91 e8 00 lds r24, 0x00E8 + 115a: 80 91 e8 00 lds r24, 0x00E8 Endpoint_ClearOUT(); } else { while (!(Endpoint_IsINReady())) - e22: 80 ff sbrs r24, 0 - e24: f9 cf rjmp .-14 ; 0xe18 + 115e: 80 ff sbrs r24, 0 + 1160: f9 cf rjmp .-14 ; 0x1154 */ static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearIN(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << TXINI) | (1 << FIFOCON)); - e26: 80 91 e8 00 lds r24, 0x00E8 - e2a: 8e 77 andi r24, 0x7E ; 126 - e2c: 80 93 e8 00 sts 0x00E8, r24 - e30: 08 95 ret + 1162: 80 91 e8 00 lds r24, 0x00E8 + 1166: 8e 77 andi r24, 0x7E ; 126 + 1168: 80 93 e8 00 sts 0x00E8, r24 + 116c: 08 95 ret -00000e32 : +0000116e : * \return Current USB frame number from the USB controller. */ static inline uint16_t USB_Device_GetFrameNumber(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; static inline uint16_t USB_Device_GetFrameNumber(void) { return UDFNUM; - e32: 80 91 e4 00 lds r24, 0x00E4 - e36: 90 91 e5 00 lds r25, 0x00E5 + 116e: 80 91 e4 00 lds r24, 0x00E4 + 1172: 90 91 e5 00 lds r25, 0x00E5 #if !defined(CONTROL_ONLY_DEVICE) uint8_t Endpoint_WaitUntilReady(void) { #if (USB_STREAM_TIMEOUT_MS < 0xFF) uint8_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS; - e3a: 44 e6 ldi r20, 0x64 ; 100 + 1176: 44 e6 ldi r20, 0x64 ; 100 * \return The currently selected endpoint's direction, as a \c ENDPOINT_DIR_* mask. */ static inline uint8_t Endpoint_GetEndpointDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_GetEndpointDirection(void) { return (UECFG0X & (1 << EPDIR)) ? ENDPOINT_DIR_IN : ENDPOINT_DIR_OUT; - e3c: 20 91 ec 00 lds r18, 0x00EC - e40: 20 ff sbrs r18, 0 - e42: 25 c0 rjmp .+74 ; 0xe8e + 1178: 20 91 ec 00 lds r18, 0x00EC + 117c: 20 ff sbrs r18, 0 + 117e: 25 c0 rjmp .+74 ; 0x11ca * \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise. */ static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsINReady(void) { return ((UEINTX & (1 << TXINI)) ? true : false); - e44: 20 91 e8 00 lds r18, 0x00E8 + 1180: 20 91 e8 00 lds r18, 0x00E8 for (;;) { if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN) { if (Endpoint_IsINReady()) - e48: 20 fd sbrc r18, 0 - e4a: 15 c0 rjmp .+42 ; 0xe76 + 1184: 20 fd sbrc r18, 0 + 1186: 15 c0 rjmp .+42 ; 0x11b2 { if (Endpoint_IsOUTReceived()) return ENDPOINT_READYWAIT_NoError; } uint8_t USB_DeviceState_LCL = USB_DeviceState; - e4c: 2e b3 in r18, 0x1e ; 30 + 1188: 2e b3 in r18, 0x1e ; 30 if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) - e4e: 22 23 and r18, r18 - e50: a1 f0 breq .+40 ; 0xe7a + 118a: 22 23 and r18, r18 + 118c: a1 f0 breq .+40 ; 0x11b6 return ENDPOINT_READYWAIT_DeviceDisconnected; else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) - e52: 25 30 cpi r18, 0x05 ; 5 - e54: a1 f0 breq .+40 ; 0xe7e + 118e: 25 30 cpi r18, 0x05 ; 5 + 1190: a1 f0 breq .+40 ; 0x11ba * \return Boolean \c true if the currently selected endpoint is stalled, \c false otherwise. */ static inline bool Endpoint_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsStalled(void) { return ((UECONX & (1 << STALLRQ)) ? true : false); - e56: 20 91 eb 00 lds r18, 0x00EB + 1192: 20 91 eb 00 lds r18, 0x00EB return ENDPOINT_READYWAIT_BusSuspended; else if (Endpoint_IsStalled()) - e5a: 25 fd sbrc r18, 5 - e5c: 12 c0 rjmp .+36 ; 0xe82 - e5e: 20 91 e4 00 lds r18, 0x00E4 - e62: 30 91 e5 00 lds r19, 0x00E5 + 1196: 25 fd sbrc r18, 5 + 1198: 12 c0 rjmp .+36 ; 0x11be + 119a: 20 91 e4 00 lds r18, 0x00E4 + 119e: 30 91 e5 00 lds r19, 0x00E5 return ENDPOINT_READYWAIT_EndpointStalled; uint16_t CurrentFrameNumber = USB_Device_GetFrameNumber(); if (CurrentFrameNumber != PreviousFrameNumber) - e66: 28 17 cp r18, r24 - e68: 39 07 cpc r19, r25 - e6a: 41 f3 breq .-48 ; 0xe3c + 11a2: 28 17 cp r18, r24 + 11a4: 39 07 cpc r19, r25 + 11a6: 41 f3 breq .-48 ; 0x1178 { PreviousFrameNumber = CurrentFrameNumber; if (!(TimeoutMSRem--)) - e6c: 44 23 and r20, r20 - e6e: 59 f0 breq .+22 ; 0xe86 - e70: 41 50 subi r20, 0x01 ; 1 - e72: c9 01 movw r24, r18 - e74: e3 cf rjmp .-58 ; 0xe3c + 11a8: 44 23 and r20, r20 + 11aa: 59 f0 breq .+22 ; 0x11c2 + 11ac: 41 50 subi r20, 0x01 ; 1 + 11ae: c9 01 movw r24, r18 + 11b0: e3 cf rjmp .-58 ; 0x1178 for (;;) { if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN) { if (Endpoint_IsINReady()) return ENDPOINT_READYWAIT_NoError; - e76: 80 e0 ldi r24, 0x00 ; 0 - e78: 08 95 ret + 11b2: 80 e0 ldi r24, 0x00 ; 0 + 11b4: 08 95 ret } uint8_t USB_DeviceState_LCL = USB_DeviceState; if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) return ENDPOINT_READYWAIT_DeviceDisconnected; - e7a: 82 e0 ldi r24, 0x02 ; 2 - e7c: 08 95 ret + 11b6: 82 e0 ldi r24, 0x02 ; 2 + 11b8: 08 95 ret else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) return ENDPOINT_READYWAIT_BusSuspended; - e7e: 83 e0 ldi r24, 0x03 ; 3 - e80: 08 95 ret + 11ba: 83 e0 ldi r24, 0x03 ; 3 + 11bc: 08 95 ret else if (Endpoint_IsStalled()) return ENDPOINT_READYWAIT_EndpointStalled; - e82: 81 e0 ldi r24, 0x01 ; 1 - e84: 08 95 ret + 11be: 81 e0 ldi r24, 0x01 ; 1 + 11c0: 08 95 ret if (CurrentFrameNumber != PreviousFrameNumber) { PreviousFrameNumber = CurrentFrameNumber; if (!(TimeoutMSRem--)) return ENDPOINT_READYWAIT_Timeout; - e86: 84 e0 ldi r24, 0x04 ; 4 - e88: 08 95 ret + 11c2: 84 e0 ldi r24, 0x04 ; 4 + 11c4: 08 95 ret return ENDPOINT_READYWAIT_NoError; } else { if (Endpoint_IsOUTReceived()) return ENDPOINT_READYWAIT_NoError; - e8a: 80 e0 ldi r24, 0x00 ; 0 + 11c6: 80 e0 ldi r24, 0x00 ; 0 if (!(TimeoutMSRem--)) return ENDPOINT_READYWAIT_Timeout; } } } - e8c: 08 95 ret + 11c8: 08 95 ret * \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise. */ static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsOUTReceived(void) { return ((UEINTX & (1 << RXOUTI)) ? true : false); - e8e: 20 91 e8 00 lds r18, 0x00E8 + 11ca: 20 91 e8 00 lds r18, 0x00E8 if (Endpoint_IsINReady()) return ENDPOINT_READYWAIT_NoError; } else { if (Endpoint_IsOUTReceived()) - e92: 22 ff sbrs r18, 2 - e94: db cf rjmp .-74 ; 0xe4c - e96: f9 cf rjmp .-14 ; 0xe8a + 11ce: 22 ff sbrs r18, 2 + 11d0: db cf rjmp .-74 ; 0x1188 + 11d2: f9 cf rjmp .-14 ; 0x11c6 -00000e98 : +000011d4 : { #if defined(USB_CAN_BE_BOTH) bool UIDModeSelectEnabled = ((UHWCON & (1 << UIDE)) != 0); #endif USB_INT_DisableAllInterrupts(); - e98: 40 d0 rcall .+128 ; 0xf1a + 11d4: 40 d0 rcall .+128 ; 0x1256 USB_INT_ClearAllInterrupts(); - e9a: 42 d0 rcall .+132 ; 0xf20 + 11d6: 42 d0 rcall .+132 ; 0x125c } static inline void USB_Controller_Reset(void) ATTR_ALWAYS_INLINE; static inline void USB_Controller_Reset(void) { USBCON &= ~(1 << USBE); - e9c: 80 91 d8 00 lds r24, 0x00D8 - ea0: 8f 77 andi r24, 0x7F ; 127 - ea2: 80 93 d8 00 sts 0x00D8, r24 + 11d8: 80 91 d8 00 lds r24, 0x00D8 + 11dc: 8f 77 andi r24, 0x7F ; 127 + 11de: 80 93 d8 00 sts 0x00D8, r24 USBCON |= (1 << USBE); - ea6: 80 91 d8 00 lds r24, 0x00D8 - eaa: 80 68 ori r24, 0x80 ; 128 - eac: 80 93 d8 00 sts 0x00D8, r24 + 11e2: 80 91 d8 00 lds r24, 0x00D8 + 11e6: 80 68 ori r24, 0x80 ; 128 + 11e8: 80 93 d8 00 sts 0x00D8, r24 } static inline void USB_CLK_Unfreeze(void) ATTR_ALWAYS_INLINE; static inline void USB_CLK_Unfreeze(void) { USBCON &= ~(1 << FRZCLK); - eb0: 80 91 d8 00 lds r24, 0x00D8 - eb4: 8f 7d andi r24, 0xDF ; 223 - eb6: 80 93 d8 00 sts 0x00D8, r24 + 11ec: 80 91 d8 00 lds r24, 0x00D8 + 11f0: 8f 7d andi r24, 0xDF ; 223 + 11f2: 80 93 d8 00 sts 0x00D8, r24 /* Inline Functions: */ static inline void USB_PLL_On(void) ATTR_ALWAYS_INLINE; static inline void USB_PLL_On(void) { PLLCSR = USB_PLL_PSC; - eba: 84 e0 ldi r24, 0x04 ; 4 - ebc: 89 bd out 0x29, r24 ; 41 + 11f6: 84 e0 ldi r24, 0x04 ; 4 + 11f8: 89 bd out 0x29, r24 ; 41 PLLCSR = (USB_PLL_PSC | (1 << PLLE)); - ebe: 86 e0 ldi r24, 0x06 ; 6 - ec0: 89 bd out 0x29, r24 ; 41 + 11fa: 86 e0 ldi r24, 0x06 ; 6 + 11fc: 89 bd out 0x29, r24 ; 41 if (!(USB_Options & USB_OPT_MANUAL_PLL)) { #if defined(USB_SERIES_2_AVR) USB_PLL_On(); while (!(USB_PLL_IsReady())); - ec2: 09 b4 in r0, 0x29 ; 41 - ec4: 00 fe sbrs r0, 0 - ec6: fd cf rjmp .-6 ; 0xec2 + 11fe: 09 b4 in r0, 0x29 ; 41 + 1200: 00 fe sbrs r0, 0 + 1202: fd cf rjmp .-6 ; 0x11fe } #if defined(USB_CAN_BE_DEVICE) static void USB_Init_Device(void) { USB_DeviceState = DEVICE_STATE_Unattached; - ec8: 1e ba out 0x1e, r1 ; 30 + 1204: 1e ba out 0x1e, r1 ; 30 USB_Device_ConfigurationNumber = 0; - eca: 10 92 98 02 sts 0x0298, r1 + 1206: 10 92 e4 02 sts 0x02E4, r1 #if !defined(NO_DEVICE_REMOTE_WAKEUP) USB_Device_RemoteWakeupEnabled = false; - ece: 10 92 9a 02 sts 0x029A, r1 + 120a: 10 92 e6 02 sts 0x02E6, r1 #endif #if !defined(NO_DEVICE_SELF_POWER) USB_Device_CurrentlySelfPowered = false; - ed2: 10 92 99 02 sts 0x0299, r1 + 120e: 10 92 e5 02 sts 0x02E5, r1 uint8_t Number = (Address & ENDPOINT_EPNUM_MASK); if (Number >= ENDPOINT_TOTAL_ENDPOINTS) return false; return Endpoint_ConfigureEndpoint_Prv(Number, - ed6: 80 e0 ldi r24, 0x00 ; 0 - ed8: 60 e0 ldi r22, 0x00 ; 0 - eda: 42 e0 ldi r20, 0x02 ; 2 - edc: 10 df rcall .-480 ; 0xcfe + 1212: 80 e0 ldi r24, 0x00 ; 0 + 1214: 60 e0 ldi r22, 0x00 ; 0 + 1216: 42 e0 ldi r20, 0x02 ; 2 + 1218: 10 df rcall .-480 ; 0x103a #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: UDINT &= ~(1 << WAKEUPI); break; case USB_INT_SUSPI: UDINT &= ~(1 << SUSPI); - ede: 80 91 e1 00 lds r24, 0x00E1 - ee2: 8e 7f andi r24, 0xFE ; 254 - ee4: 80 93 e1 00 sts 0x00E1, r24 + 121a: 80 91 e1 00 lds r24, 0x00E1 + 121e: 8e 7f andi r24, 0xFE ; 254 + 1220: 80 93 e1 00 sts 0x00E1, r24 #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: UDIEN |= (1 << WAKEUPE); break; case USB_INT_SUSPI: UDIEN |= (1 << SUSPE); - ee8: 80 91 e2 00 lds r24, 0x00E2 - eec: 81 60 ori r24, 0x01 ; 1 - eee: 80 93 e2 00 sts 0x00E2, r24 + 1224: 80 91 e2 00 lds r24, 0x00E2 + 1228: 81 60 ori r24, 0x01 ; 1 + 122a: 80 93 e2 00 sts 0x00E2, r24 break; case USB_INT_EORSTI: UDIEN |= (1 << EORSTE); - ef2: 80 91 e2 00 lds r24, 0x00E2 - ef6: 88 60 ori r24, 0x08 ; 8 - ef8: 80 93 e2 00 sts 0x00E2, r24 + 122e: 80 91 e2 00 lds r24, 0x00E2 + 1232: 88 60 ori r24, 0x08 ; 8 + 1234: 80 93 e2 00 sts 0x00E2, r24 * register and despite the datasheet making no mention of its requirement in host mode. */ static inline void USB_Attach(void) ATTR_ALWAYS_INLINE; static inline void USB_Attach(void) { UDCON &= ~(1 << DETACH); - efc: 80 91 e0 00 lds r24, 0x00E0 - f00: 8e 7f andi r24, 0xFE ; 254 - f02: 80 93 e0 00 sts 0x00E0, r24 + 1238: 80 91 e0 00 lds r24, 0x00E0 + 123c: 8e 7f andi r24, 0xFE ; 254 + 123e: 80 93 e0 00 sts 0x00E0, r24 } #if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) USB_OTGPAD_On(); #endif } - f06: 08 95 ret + 1242: 08 95 ret -00000f08 : +00001244 : static inline void USB_REG_On(void) { #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) UHWCON |= (1 << UVREGE); #else REGCR &= ~(1 << REGDIS); - f08: e3 e6 ldi r30, 0x63 ; 99 - f0a: f0 e0 ldi r31, 0x00 ; 0 - f0c: 80 81 ld r24, Z - f0e: 8e 7f andi r24, 0xFE ; 254 - f10: 80 83 st Z, r24 + 1244: e3 e6 ldi r30, 0x63 ; 99 + 1246: f0 e0 ldi r31, 0x00 ; 0 + 1248: 80 81 ld r24, Z + 124a: 8e 7f andi r24, 0xFE ; 254 + 124c: 80 83 st Z, r24 UHWCON &= ~(1 << UIDE); USB_CurrentMode = Mode; } #endif USB_IsInitialized = true; - f12: 81 e0 ldi r24, 0x01 ; 1 - f14: 80 93 9b 02 sts 0x029B, r24 + 124e: 81 e0 ldi r24, 0x01 ; 1 + 1250: 80 93 e7 02 sts 0x02E7, r24 USB_ResetInterface(); } - f18: bf cf rjmp .-130 ; 0xe98 + 1254: bf cf rjmp .-130 ; 0x11d4 -00000f1a : +00001256 : #if defined(USB_CAN_BE_HOST) UHIEN = 0; #endif #if defined(USB_CAN_BE_DEVICE) UDIEN = 0; - f1a: 10 92 e2 00 sts 0x00E2, r1 + 1256: 10 92 e2 00 sts 0x00E2, r1 #endif } - f1e: 08 95 ret + 125a: 08 95 ret -00000f20 : +0000125c : #if defined(USB_CAN_BE_HOST) UHINT = 0; #endif #if defined(USB_CAN_BE_DEVICE) UDINT = 0; - f20: 10 92 e1 00 sts 0x00E1, r1 + 125c: 10 92 e1 00 sts 0x00E1, r1 #endif } - f24: 08 95 ret + 1260: 08 95 ret -00000f26 <__vector_11>: +00001262 <__vector_11>: ISR(USB_GEN_vect, ISR_BLOCK) { - f26: 1f 92 push r1 - f28: 0f 92 push r0 - f2a: 0f b6 in r0, 0x3f ; 63 - f2c: 0f 92 push r0 - f2e: 11 24 eor r1, r1 - f30: 2f 93 push r18 - f32: 3f 93 push r19 - f34: 4f 93 push r20 - f36: 5f 93 push r21 - f38: 6f 93 push r22 - f3a: 7f 93 push r23 - f3c: 8f 93 push r24 - f3e: 9f 93 push r25 - f40: af 93 push r26 - f42: bf 93 push r27 - f44: ef 93 push r30 - f46: ff 93 push r31 + 1262: 1f 92 push r1 + 1264: 0f 92 push r0 + 1266: 0f b6 in r0, 0x3f ; 63 + 1268: 0f 92 push r0 + 126a: 11 24 eor r1, r1 + 126c: 2f 93 push r18 + 126e: 3f 93 push r19 + 1270: 4f 93 push r20 + 1272: 5f 93 push r21 + 1274: 6f 93 push r22 + 1276: 7f 93 push r23 + 1278: 8f 93 push r24 + 127a: 9f 93 push r25 + 127c: af 93 push r26 + 127e: bf 93 push r27 + 1280: ef 93 push r30 + 1282: ff 93 push r31 case USB_INT_SUSPI: return (UDINT & (1 << SUSPI)); case USB_INT_EORSTI: return (UDINT & (1 << EORSTI)); case USB_INT_SOFI: return (UDINT & (1 << SOFI)); - f48: 80 91 e1 00 lds r24, 0x00E1 + 1284: 80 91 e1 00 lds r24, 0x00E1 #if defined(USB_CAN_BE_DEVICE) #if !defined(NO_SOF_EVENTS) if (USB_INT_HasOccurred(USB_INT_SOFI) && USB_INT_IsEnabled(USB_INT_SOFI)) - f4c: 82 ff sbrs r24, 2 - f4e: 0a c0 rjmp .+20 ; 0xf64 <__vector_11+0x3e> + 1288: 82 ff sbrs r24, 2 + 128a: 0a c0 rjmp .+20 ; 0x12a0 <__vector_11+0x3e> case USB_INT_SUSPI: return (UDIEN & (1 << SUSPE)); case USB_INT_EORSTI: return (UDIEN & (1 << EORSTE)); case USB_INT_SOFI: return (UDIEN & (1 << SOFE)); - f50: 80 91 e2 00 lds r24, 0x00E2 - f54: 82 ff sbrs r24, 2 - f56: 06 c0 rjmp .+12 ; 0xf64 <__vector_11+0x3e> + 128c: 80 91 e2 00 lds r24, 0x00E2 + 1290: 82 ff sbrs r24, 2 + 1292: 06 c0 rjmp .+12 ; 0x12a0 <__vector_11+0x3e> break; case USB_INT_EORSTI: UDINT &= ~(1 << EORSTI); break; case USB_INT_SOFI: UDINT &= ~(1 << SOFI); - f58: 80 91 e1 00 lds r24, 0x00E1 - f5c: 8b 7f andi r24, 0xFB ; 251 - f5e: 80 93 e1 00 sts 0x00E1, r24 + 1294: 80 91 e1 00 lds r24, 0x00E1 + 1298: 8b 7f andi r24, 0xFB ; 251 + 129a: 80 93 e1 00 sts 0x00E1, r24 { USB_INT_Clear(USB_INT_SOFI); EVENT_USB_Device_StartOfFrame(); - f62: 21 d2 rcall .+1090 ; 0x13a6 + 129e: 22 d2 rcall .+1092 ; 0x16e4 #endif #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: return (UDINT & (1 << WAKEUPI)); case USB_INT_SUSPI: return (UDINT & (1 << SUSPI)); - f64: 80 91 e1 00 lds r24, 0x00E1 + 12a0: 80 91 e1 00 lds r24, 0x00E1 EVENT_USB_Device_Disconnect(); } } #endif if (USB_INT_HasOccurred(USB_INT_SUSPI) && USB_INT_IsEnabled(USB_INT_SUSPI)) - f68: 80 ff sbrs r24, 0 - f6a: 16 c0 rjmp .+44 ; 0xf98 <__vector_11+0x72> + 12a4: 80 ff sbrs r24, 0 + 12a6: 16 c0 rjmp .+44 ; 0x12d4 <__vector_11+0x72> #endif #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: return (UDIEN & (1 << WAKEUPE)); case USB_INT_SUSPI: return (UDIEN & (1 << SUSPE)); - f6c: 80 91 e2 00 lds r24, 0x00E2 - f70: 80 ff sbrs r24, 0 - f72: 12 c0 rjmp .+36 ; 0xf98 <__vector_11+0x72> + 12a8: 80 91 e2 00 lds r24, 0x00E2 + 12ac: 80 ff sbrs r24, 0 + 12ae: 12 c0 rjmp .+36 ; 0x12d4 <__vector_11+0x72> #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: UDIEN &= ~(1 << WAKEUPE); break; case USB_INT_SUSPI: UDIEN &= ~(1 << SUSPE); - f74: 80 91 e2 00 lds r24, 0x00E2 - f78: 8e 7f andi r24, 0xFE ; 254 - f7a: 80 93 e2 00 sts 0x00E2, r24 + 12b0: 80 91 e2 00 lds r24, 0x00E2 + 12b4: 8e 7f andi r24, 0xFE ; 254 + 12b6: 80 93 e2 00 sts 0x00E2, r24 USBCON |= (1 << IDTE); break; #endif #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: UDIEN |= (1 << WAKEUPE); - f7e: 80 91 e2 00 lds r24, 0x00E2 - f82: 80 61 ori r24, 0x10 ; 16 - f84: 80 93 e2 00 sts 0x00E2, r24 + 12ba: 80 91 e2 00 lds r24, 0x00E2 + 12be: 80 61 ori r24, 0x10 ; 16 + 12c0: 80 93 e2 00 sts 0x00E2, r24 #endif static inline void USB_CLK_Freeze(void) ATTR_ALWAYS_INLINE; static inline void USB_CLK_Freeze(void) { USBCON |= (1 << FRZCLK); - f88: 80 91 d8 00 lds r24, 0x00D8 - f8c: 80 62 ori r24, 0x20 ; 32 - f8e: 80 93 d8 00 sts 0x00D8, r24 + 12c4: 80 91 d8 00 lds r24, 0x00D8 + 12c8: 80 62 ori r24, 0x20 ; 32 + 12ca: 80 93 d8 00 sts 0x00D8, r24 } static inline void USB_PLL_Off(void) ATTR_ALWAYS_INLINE; static inline void USB_PLL_Off(void) { PLLCSR = 0; - f92: 19 bc out 0x29, r1 ; 41 + 12ce: 19 bc out 0x29, r1 ; 41 if (!(USB_Options & USB_OPT_MANUAL_PLL)) USB_PLL_Off(); #if defined(USB_SERIES_2_AVR) && !defined(NO_LIMITED_CONTROLLER_CONNECT) USB_DeviceState = DEVICE_STATE_Unattached; - f94: 1e ba out 0x1e, r1 ; 30 + 12d0: 1e ba out 0x1e, r1 ; 30 EVENT_USB_Device_Disconnect(); - f96: aa db rcall .-2220 ; 0x6ec + 12d2: df d9 rcall .-3138 ; 0x692 case USB_INT_IDTI: return (USBINT & (1 << IDTI)); #endif #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: return (UDINT & (1 << WAKEUPI)); - f98: 80 91 e1 00 lds r24, 0x00E1 + 12d4: 80 91 e1 00 lds r24, 0x00E1 USB_DeviceState = DEVICE_STATE_Suspended; EVENT_USB_Device_Suspend(); #endif } if (USB_INT_HasOccurred(USB_INT_WAKEUPI) && USB_INT_IsEnabled(USB_INT_WAKEUPI)) - f9c: 84 ff sbrs r24, 4 - f9e: 2c c0 rjmp .+88 ; 0xff8 <__vector_11+0xd2> + 12d8: 84 ff sbrs r24, 4 + 12da: 2c c0 rjmp .+88 ; 0x1334 <__vector_11+0xd2> case USB_INT_IDTI: return (USBCON & (1 << IDTE)); #endif #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: return (UDIEN & (1 << WAKEUPE)); - fa0: 80 91 e2 00 lds r24, 0x00E2 - fa4: 84 ff sbrs r24, 4 - fa6: 28 c0 rjmp .+80 ; 0xff8 <__vector_11+0xd2> + 12dc: 80 91 e2 00 lds r24, 0x00E2 + 12e0: 84 ff sbrs r24, 4 + 12e2: 28 c0 rjmp .+80 ; 0x1334 <__vector_11+0xd2> /* Inline Functions: */ static inline void USB_PLL_On(void) ATTR_ALWAYS_INLINE; static inline void USB_PLL_On(void) { PLLCSR = USB_PLL_PSC; - fa8: 84 e0 ldi r24, 0x04 ; 4 - faa: 89 bd out 0x29, r24 ; 41 + 12e4: 84 e0 ldi r24, 0x04 ; 4 + 12e6: 89 bd out 0x29, r24 ; 41 PLLCSR = (USB_PLL_PSC | (1 << PLLE)); - fac: 86 e0 ldi r24, 0x06 ; 6 - fae: 89 bd out 0x29, r24 ; 41 + 12e8: 86 e0 ldi r24, 0x06 ; 6 + 12ea: 89 bd out 0x29, r24 ; 41 { if (!(USB_Options & USB_OPT_MANUAL_PLL)) { USB_PLL_On(); while (!(USB_PLL_IsReady())); - fb0: 09 b4 in r0, 0x29 ; 41 - fb2: 00 fe sbrs r0, 0 - fb4: fd cf rjmp .-6 ; 0xfb0 <__vector_11+0x8a> + 12ec: 09 b4 in r0, 0x29 ; 41 + 12ee: 00 fe sbrs r0, 0 + 12f0: fd cf rjmp .-6 ; 0x12ec <__vector_11+0x8a> } static inline void USB_CLK_Unfreeze(void) ATTR_ALWAYS_INLINE; static inline void USB_CLK_Unfreeze(void) { USBCON &= ~(1 << FRZCLK); - fb6: 80 91 d8 00 lds r24, 0x00D8 - fba: 8f 7d andi r24, 0xDF ; 223 - fbc: 80 93 d8 00 sts 0x00D8, r24 + 12f2: 80 91 d8 00 lds r24, 0x00D8 + 12f6: 8f 7d andi r24, 0xDF ; 223 + 12f8: 80 93 d8 00 sts 0x00D8, r24 USBINT &= ~(1 << IDTI); break; #endif #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: UDINT &= ~(1 << WAKEUPI); - fc0: 80 91 e1 00 lds r24, 0x00E1 - fc4: 8f 7e andi r24, 0xEF ; 239 - fc6: 80 93 e1 00 sts 0x00E1, r24 + 12fc: 80 91 e1 00 lds r24, 0x00E1 + 1300: 8f 7e andi r24, 0xEF ; 239 + 1302: 80 93 e1 00 sts 0x00E1, r24 USBCON &= ~(1 << IDTE); break; #endif #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: UDIEN &= ~(1 << WAKEUPE); - fca: 80 91 e2 00 lds r24, 0x00E2 - fce: 8f 7e andi r24, 0xEF ; 239 - fd0: 80 93 e2 00 sts 0x00E2, r24 + 1306: 80 91 e2 00 lds r24, 0x00E2 + 130a: 8f 7e andi r24, 0xEF ; 239 + 130c: 80 93 e2 00 sts 0x00E2, r24 #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: UDIEN |= (1 << WAKEUPE); break; case USB_INT_SUSPI: UDIEN |= (1 << SUSPE); - fd4: 80 91 e2 00 lds r24, 0x00E2 - fd8: 81 60 ori r24, 0x01 ; 1 - fda: 80 93 e2 00 sts 0x00E2, r24 + 1310: 80 91 e2 00 lds r24, 0x00E2 + 1314: 81 60 ori r24, 0x01 ; 1 + 1316: 80 93 e2 00 sts 0x00E2, r24 USB_INT_Clear(USB_INT_WAKEUPI); USB_INT_Disable(USB_INT_WAKEUPI); USB_INT_Enable(USB_INT_SUSPI); if (USB_Device_ConfigurationNumber) - fde: 80 91 98 02 lds r24, 0x0298 - fe2: 88 23 and r24, r24 - fe4: 21 f4 brne .+8 ; 0xfee <__vector_11+0xc8> + 131a: 80 91 e4 02 lds r24, 0x02E4 + 131e: 88 23 and r24, r24 + 1320: 21 f4 brne .+8 ; 0x132a <__vector_11+0xc8> } static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; static inline bool USB_Device_IsAddressSet(void) { return (UDADDR & (1 << ADDEN)); - fe6: 80 91 e3 00 lds r24, 0x00E3 + 1322: 80 91 e3 00 lds r24, 0x00E3 USB_DeviceState = DEVICE_STATE_Configured; else USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered; - fea: 87 ff sbrs r24, 7 - fec: 02 c0 rjmp .+4 ; 0xff2 <__vector_11+0xcc> - fee: 84 e0 ldi r24, 0x04 ; 4 - ff0: 01 c0 rjmp .+2 ; 0xff4 <__vector_11+0xce> - ff2: 81 e0 ldi r24, 0x01 ; 1 - ff4: 8e bb out 0x1e, r24 ; 30 + 1326: 87 ff sbrs r24, 7 + 1328: 02 c0 rjmp .+4 ; 0x132e <__vector_11+0xcc> + 132a: 84 e0 ldi r24, 0x04 ; 4 + 132c: 01 c0 rjmp .+2 ; 0x1330 <__vector_11+0xce> + 132e: 81 e0 ldi r24, 0x01 ; 1 + 1330: 8e bb out 0x1e, r24 ; 30 #if defined(USB_SERIES_2_AVR) && !defined(NO_LIMITED_CONTROLLER_CONNECT) EVENT_USB_Device_Connect(); - ff6: 79 db rcall .-2318 ; 0x6ea + 1332: ae d9 rcall .-3236 ; 0x690 case USB_INT_WAKEUPI: return (UDINT & (1 << WAKEUPI)); case USB_INT_SUSPI: return (UDINT & (1 << SUSPI)); case USB_INT_EORSTI: return (UDINT & (1 << EORSTI)); - ff8: 80 91 e1 00 lds r24, 0x00E1 + 1334: 80 91 e1 00 lds r24, 0x00E1 #else EVENT_USB_Device_WakeUp(); #endif } if (USB_INT_HasOccurred(USB_INT_EORSTI) && USB_INT_IsEnabled(USB_INT_EORSTI)) - ffc: 83 ff sbrs r24, 3 - ffe: 26 c0 rjmp .+76 ; 0x104c <__vector_11+0x126> + 1338: 83 ff sbrs r24, 3 + 133a: 26 c0 rjmp .+76 ; 0x1388 <__vector_11+0x126> case USB_INT_WAKEUPI: return (UDIEN & (1 << WAKEUPE)); case USB_INT_SUSPI: return (UDIEN & (1 << SUSPE)); case USB_INT_EORSTI: return (UDIEN & (1 << EORSTE)); - 1000: 80 91 e2 00 lds r24, 0x00E2 - 1004: 83 ff sbrs r24, 3 - 1006: 22 c0 rjmp .+68 ; 0x104c <__vector_11+0x126> + 133c: 80 91 e2 00 lds r24, 0x00E2 + 1340: 83 ff sbrs r24, 3 + 1342: 22 c0 rjmp .+68 ; 0x1388 <__vector_11+0x126> break; case USB_INT_SUSPI: UDINT &= ~(1 << SUSPI); break; case USB_INT_EORSTI: UDINT &= ~(1 << EORSTI); - 1008: 80 91 e1 00 lds r24, 0x00E1 - 100c: 87 7f andi r24, 0xF7 ; 247 - 100e: 80 93 e1 00 sts 0x00E1, r24 + 1344: 80 91 e1 00 lds r24, 0x00E1 + 1348: 87 7f andi r24, 0xF7 ; 247 + 134a: 80 93 e1 00 sts 0x00E1, r24 { USB_INT_Clear(USB_INT_EORSTI); USB_DeviceState = DEVICE_STATE_Default; - 1012: 82 e0 ldi r24, 0x02 ; 2 - 1014: 8e bb out 0x1e, r24 ; 30 + 134e: 82 e0 ldi r24, 0x02 ; 2 + 1350: 8e bb out 0x1e, r24 ; 30 USB_Device_ConfigurationNumber = 0; - 1016: 10 92 98 02 sts 0x0298, r1 + 1352: 10 92 e4 02 sts 0x02E4, r1 #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: UDINT &= ~(1 << WAKEUPI); break; case USB_INT_SUSPI: UDINT &= ~(1 << SUSPI); - 101a: 80 91 e1 00 lds r24, 0x00E1 - 101e: 8e 7f andi r24, 0xFE ; 254 - 1020: 80 93 e1 00 sts 0x00E1, r24 + 1356: 80 91 e1 00 lds r24, 0x00E1 + 135a: 8e 7f andi r24, 0xFE ; 254 + 135c: 80 93 e1 00 sts 0x00E1, r24 #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: UDIEN &= ~(1 << WAKEUPE); break; case USB_INT_SUSPI: UDIEN &= ~(1 << SUSPE); - 1024: 80 91 e2 00 lds r24, 0x00E2 - 1028: 8e 7f andi r24, 0xFE ; 254 - 102a: 80 93 e2 00 sts 0x00E2, r24 + 1360: 80 91 e2 00 lds r24, 0x00E2 + 1364: 8e 7f andi r24, 0xFE ; 254 + 1366: 80 93 e2 00 sts 0x00E2, r24 USBCON |= (1 << IDTE); break; #endif #if defined(USB_CAN_BE_DEVICE) case USB_INT_WAKEUPI: UDIEN |= (1 << WAKEUPE); - 102e: 80 91 e2 00 lds r24, 0x00E2 - 1032: 80 61 ori r24, 0x10 ; 16 - 1034: 80 93 e2 00 sts 0x00E2, r24 + 136a: 80 91 e2 00 lds r24, 0x00E2 + 136e: 80 61 ori r24, 0x10 ; 16 + 1370: 80 93 e2 00 sts 0x00E2, r24 uint8_t Number = (Address & ENDPOINT_EPNUM_MASK); if (Number >= ENDPOINT_TOTAL_ENDPOINTS) return false; return Endpoint_ConfigureEndpoint_Prv(Number, - 1038: 80 e0 ldi r24, 0x00 ; 0 - 103a: 60 e0 ldi r22, 0x00 ; 0 - 103c: 42 e0 ldi r20, 0x02 ; 2 - 103e: 5f de rcall .-834 ; 0xcfe + 1374: 80 e0 ldi r24, 0x00 ; 0 + 1376: 60 e0 ldi r22, 0x00 ; 0 + 1378: 42 e0 ldi r20, 0x02 ; 2 + 137a: 5f de rcall .-834 ; 0x103a break; case USB_INT_SOFI: UDIEN |= (1 << SOFE); break; case USB_INT_RXSTPI: UEIENX |= (1 << RXSTPE); - 1040: 80 91 f0 00 lds r24, 0x00F0 - 1044: 88 60 ori r24, 0x08 ; 8 - 1046: 80 93 f0 00 sts 0x00F0, r24 + 137c: 80 91 f0 00 lds r24, 0x00F0 + 1380: 88 60 ori r24, 0x08 ; 8 + 1382: 80 93 f0 00 sts 0x00F0, r24 #if defined(INTERRUPT_CONTROL_ENDPOINT) USB_INT_Enable(USB_INT_RXSTPI); #endif EVENT_USB_Device_Reset(); - 104a: ad d1 rcall .+858 ; 0x13a6 + 1386: ae d1 rcall .+860 ; 0x16e4 USB_ResetInterface(); EVENT_USB_UIDChange(); } #endif } - 104c: ff 91 pop r31 - 104e: ef 91 pop r30 - 1050: bf 91 pop r27 - 1052: af 91 pop r26 - 1054: 9f 91 pop r25 - 1056: 8f 91 pop r24 - 1058: 7f 91 pop r23 - 105a: 6f 91 pop r22 - 105c: 5f 91 pop r21 - 105e: 4f 91 pop r20 - 1060: 3f 91 pop r19 - 1062: 2f 91 pop r18 - 1064: 0f 90 pop r0 - 1066: 0f be out 0x3f, r0 ; 63 - 1068: 0f 90 pop r0 - 106a: 1f 90 pop r1 - 106c: 18 95 reti - -0000106e <__vector_12>: + 1388: ff 91 pop r31 + 138a: ef 91 pop r30 + 138c: bf 91 pop r27 + 138e: af 91 pop r26 + 1390: 9f 91 pop r25 + 1392: 8f 91 pop r24 + 1394: 7f 91 pop r23 + 1396: 6f 91 pop r22 + 1398: 5f 91 pop r21 + 139a: 4f 91 pop r20 + 139c: 3f 91 pop r19 + 139e: 2f 91 pop r18 + 13a0: 0f 90 pop r0 + 13a2: 0f be out 0x3f, r0 ; 63 + 13a4: 0f 90 pop r0 + 13a6: 1f 90 pop r1 + 13a8: 18 95 reti + +000013aa <__vector_12>: #if defined(INTERRUPT_CONTROL_ENDPOINT) && defined(USB_CAN_BE_DEVICE) ISR(USB_COM_vect, ISR_BLOCK) { - 106e: 1f 92 push r1 - 1070: 0f 92 push r0 - 1072: 0f b6 in r0, 0x3f ; 63 - 1074: 0f 92 push r0 - 1076: 11 24 eor r1, r1 - 1078: 1f 93 push r17 - 107a: 2f 93 push r18 - 107c: 3f 93 push r19 - 107e: 4f 93 push r20 - 1080: 5f 93 push r21 - 1082: 6f 93 push r22 - 1084: 7f 93 push r23 - 1086: 8f 93 push r24 - 1088: 9f 93 push r25 - 108a: af 93 push r26 - 108c: bf 93 push r27 - 108e: ef 93 push r30 - 1090: ff 93 push r31 + 13aa: 1f 92 push r1 + 13ac: 0f 92 push r0 + 13ae: 0f b6 in r0, 0x3f ; 63 + 13b0: 0f 92 push r0 + 13b2: 11 24 eor r1, r1 + 13b4: 1f 93 push r17 + 13b6: 2f 93 push r18 + 13b8: 3f 93 push r19 + 13ba: 4f 93 push r20 + 13bc: 5f 93 push r21 + 13be: 6f 93 push r22 + 13c0: 7f 93 push r23 + 13c2: 8f 93 push r24 + 13c4: 9f 93 push r25 + 13c6: af 93 push r26 + 13c8: bf 93 push r27 + 13ca: ef 93 push r30 + 13cc: ff 93 push r31 */ static inline uint8_t Endpoint_GetCurrentEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_GetCurrentEndpoint(void) { #if !defined(CONTROL_ONLY_DEVICE) return ((UENUM & ENDPOINT_EPNUM_MASK) | Endpoint_GetEndpointDirection()); - 1092: 10 91 e9 00 lds r17, 0x00E9 - 1096: 1f 70 andi r17, 0x0F ; 15 + 13ce: 10 91 e9 00 lds r17, 0x00E9 + 13d2: 1f 70 andi r17, 0x0F ; 15 * \return The currently selected endpoint's direction, as a \c ENDPOINT_DIR_* mask. */ static inline uint8_t Endpoint_GetEndpointDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_GetEndpointDirection(void) { return (UECFG0X & (1 << EPDIR)) ? ENDPOINT_DIR_IN : ENDPOINT_DIR_OUT; - 1098: 80 91 ec 00 lds r24, 0x00EC + 13d4: 80 91 ec 00 lds r24, 0x00EC */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 109c: 10 92 e9 00 sts 0x00E9, r1 + 13d8: 10 92 e9 00 sts 0x00E9, r1 break; case USB_INT_SOFI: UDIEN &= ~(1 << SOFE); break; case USB_INT_RXSTPI: UEIENX &= ~(1 << RXSTPE); - 10a0: 80 91 f0 00 lds r24, 0x00F0 - 10a4: 87 7f andi r24, 0xF7 ; 247 - 10a6: 80 93 f0 00 sts 0x00F0, r24 + 13dc: 80 91 f0 00 lds r24, 0x00F0 + 13e0: 87 7f andi r24, 0xF7 ; 247 + 13e2: 80 93 f0 00 sts 0x00F0, r24 static inline void GlobalInterruptEnable(void) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) sei(); - 10aa: 78 94 sei + 13e6: 78 94 sei Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); USB_INT_Disable(USB_INT_RXSTPI); GlobalInterruptEnable(); USB_Device_ProcessControlRequest(); - 10ac: 1b d0 rcall .+54 ; 0x10e4 - 10ae: 10 92 e9 00 sts 0x00E9, r1 + 13e8: 1b d0 rcall .+54 ; 0x1420 + 13ea: 10 92 e9 00 sts 0x00E9, r1 break; case USB_INT_SOFI: UDIEN |= (1 << SOFE); break; case USB_INT_RXSTPI: UEIENX |= (1 << RXSTPE); - 10b2: 80 91 f0 00 lds r24, 0x00F0 - 10b6: 88 60 ori r24, 0x08 ; 8 - 10b8: 80 93 f0 00 sts 0x00F0, r24 - 10bc: 10 93 e9 00 sts 0x00E9, r17 + 13ee: 80 91 f0 00 lds r24, 0x00F0 + 13f2: 88 60 ori r24, 0x08 ; 8 + 13f4: 80 93 f0 00 sts 0x00F0, r24 + 13f8: 10 93 e9 00 sts 0x00E9, r17 Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); USB_INT_Enable(USB_INT_RXSTPI); Endpoint_SelectEndpoint(PrevSelectedEndpoint); } - 10c0: ff 91 pop r31 - 10c2: ef 91 pop r30 - 10c4: bf 91 pop r27 - 10c6: af 91 pop r26 - 10c8: 9f 91 pop r25 - 10ca: 8f 91 pop r24 - 10cc: 7f 91 pop r23 - 10ce: 6f 91 pop r22 - 10d0: 5f 91 pop r21 - 10d2: 4f 91 pop r20 - 10d4: 3f 91 pop r19 - 10d6: 2f 91 pop r18 - 10d8: 1f 91 pop r17 - 10da: 0f 90 pop r0 - 10dc: 0f be out 0x3f, r0 ; 63 - 10de: 0f 90 pop r0 - 10e0: 1f 90 pop r1 - 10e2: 18 95 reti - -000010e4 : + 13fc: ff 91 pop r31 + 13fe: ef 91 pop r30 + 1400: bf 91 pop r27 + 1402: af 91 pop r26 + 1404: 9f 91 pop r25 + 1406: 8f 91 pop r24 + 1408: 7f 91 pop r23 + 140a: 6f 91 pop r22 + 140c: 5f 91 pop r21 + 140e: 4f 91 pop r20 + 1410: 3f 91 pop r19 + 1412: 2f 91 pop r18 + 1414: 1f 91 pop r17 + 1416: 0f 90 pop r0 + 1418: 0f be out 0x3f, r0 ; 63 + 141a: 0f 90 pop r0 + 141c: 1f 90 pop r1 + 141e: 18 95 reti + +00001420 : #if !defined(NO_DEVICE_REMOTE_WAKEUP) bool USB_Device_RemoteWakeupEnabled; #endif void USB_Device_ProcessControlRequest(void) { - 10e4: 1f 93 push r17 - 10e6: df 93 push r29 - 10e8: cf 93 push r28 - 10ea: cd b7 in r28, 0x3d ; 61 - 10ec: de b7 in r29, 0x3e ; 62 - 10ee: ac 97 sbiw r28, 0x2c ; 44 - 10f0: 0f b6 in r0, 0x3f ; 63 - 10f2: f8 94 cli - 10f4: de bf out 0x3e, r29 ; 62 - 10f6: 0f be out 0x3f, r0 ; 63 - 10f8: cd bf out 0x3d, r28 ; 61 + 1420: 1f 93 push r17 + 1422: df 93 push r29 + 1424: cf 93 push r28 + 1426: cd b7 in r28, 0x3d ; 61 + 1428: de b7 in r29, 0x3e ; 62 + 142a: ac 97 sbiw r28, 0x2c ; 44 + 142c: 0f b6 in r0, 0x3f ; 63 + 142e: f8 94 cli + 1430: de bf out 0x3e, r29 ; 62 + 1432: 0f be out 0x3f, r0 ; 63 + 1434: cd bf out 0x3d, r28 ; 61 USB_ControlRequest.bRequest = Endpoint_Read_8(); USB_ControlRequest.wValue = Endpoint_Read_16_LE(); USB_ControlRequest.wIndex = Endpoint_Read_16_LE(); USB_ControlRequest.wLength = Endpoint_Read_16_LE(); #else uint8_t* RequestHeader = (uint8_t*)&USB_ControlRequest; - 10fa: ec e9 ldi r30, 0x9C ; 156 - 10fc: f2 e0 ldi r31, 0x02 ; 2 + 1436: e8 ee ldi r30, 0xE8 ; 232 + 1438: f2 e0 ldi r31, 0x02 ; 2 * \return Next byte in the currently selected endpoint's FIFO buffer. */ static inline uint8_t Endpoint_Read_8(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_Read_8(void) { return UEDATX; - 10fe: 80 91 f1 00 lds r24, 0x00F1 + 143a: 80 91 f1 00 lds r24, 0x00F1 for (uint8_t RequestHeaderByte = 0; RequestHeaderByte < sizeof(USB_Request_Header_t); RequestHeaderByte++) *(RequestHeader++) = Endpoint_Read_8(); - 1102: 81 93 st Z+, r24 + 143e: 81 93 st Z+, r24 USB_ControlRequest.wIndex = Endpoint_Read_16_LE(); USB_ControlRequest.wLength = Endpoint_Read_16_LE(); #else uint8_t* RequestHeader = (uint8_t*)&USB_ControlRequest; for (uint8_t RequestHeaderByte = 0; RequestHeaderByte < sizeof(USB_Request_Header_t); RequestHeaderByte++) - 1104: 22 e0 ldi r18, 0x02 ; 2 - 1106: e4 3a cpi r30, 0xA4 ; 164 - 1108: f2 07 cpc r31, r18 - 110a: c9 f7 brne .-14 ; 0x10fe + 1440: 22 e0 ldi r18, 0x02 ; 2 + 1442: e0 3f cpi r30, 0xF0 ; 240 + 1444: f2 07 cpc r31, r18 + 1446: c9 f7 brne .-14 ; 0x143a *(RequestHeader++) = Endpoint_Read_8(); #endif EVENT_USB_Device_ControlRequest(); - 110c: f3 da rcall .-2586 ; 0x6f4 + 1448: 29 d9 rcall .-3502 ; 0x69c * \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise. */ static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsSETUPReceived(void) { return ((UEINTX & (1 << RXSTPI)) ? true : false); - 110e: 80 91 e8 00 lds r24, 0x00E8 + 144a: 80 91 e8 00 lds r24, 0x00E8 if (Endpoint_IsSETUPReceived()) - 1112: 83 ff sbrs r24, 3 - 1114: 30 c1 rjmp .+608 ; 0x1376 + 144e: 83 ff sbrs r24, 3 + 1450: 31 c1 rjmp .+610 ; 0x16b4 { uint8_t bmRequestType = USB_ControlRequest.bmRequestType; - 1116: 80 91 9c 02 lds r24, 0x029C + 1452: 80 91 e8 02 lds r24, 0x02E8 switch (USB_ControlRequest.bRequest) - 111a: 20 91 9d 02 lds r18, 0x029D - 111e: 25 30 cpi r18, 0x05 ; 5 - 1120: 09 f4 brne .+2 ; 0x1124 - 1122: 84 c0 rjmp .+264 ; 0x122c - 1124: 26 30 cpi r18, 0x06 ; 6 - 1126: 40 f4 brcc .+16 ; 0x1138 - 1128: 21 30 cpi r18, 0x01 ; 1 - 112a: a1 f1 breq .+104 ; 0x1194 - 112c: 21 30 cpi r18, 0x01 ; 1 - 112e: 70 f0 brcs .+28 ; 0x114c - 1130: 23 30 cpi r18, 0x03 ; 3 - 1132: 09 f0 breq .+2 ; 0x1136 - 1134: 20 c1 rjmp .+576 ; 0x1376 - 1136: 2e c0 rjmp .+92 ; 0x1194 - 1138: 28 30 cpi r18, 0x08 ; 8 - 113a: 09 f4 brne .+2 ; 0x113e - 113c: ef c0 rjmp .+478 ; 0x131c - 113e: 29 30 cpi r18, 0x09 ; 9 - 1140: 09 f4 brne .+2 ; 0x1144 - 1142: fe c0 rjmp .+508 ; 0x1340 - 1144: 26 30 cpi r18, 0x06 ; 6 - 1146: 09 f0 breq .+2 ; 0x114a - 1148: 16 c1 rjmp .+556 ; 0x1376 - 114a: 92 c0 rjmp .+292 ; 0x1270 + 1456: 20 91 e9 02 lds r18, 0x02E9 + 145a: 25 30 cpi r18, 0x05 ; 5 + 145c: 09 f4 brne .+2 ; 0x1460 + 145e: 84 c0 rjmp .+264 ; 0x1568 + 1460: 26 30 cpi r18, 0x06 ; 6 + 1462: 40 f4 brcc .+16 ; 0x1474 + 1464: 21 30 cpi r18, 0x01 ; 1 + 1466: a1 f1 breq .+104 ; 0x14d0 + 1468: 21 30 cpi r18, 0x01 ; 1 + 146a: 70 f0 brcs .+28 ; 0x1488 + 146c: 23 30 cpi r18, 0x03 ; 3 + 146e: 09 f0 breq .+2 ; 0x1472 + 1470: 21 c1 rjmp .+578 ; 0x16b4 + 1472: 2e c0 rjmp .+92 ; 0x14d0 + 1474: 28 30 cpi r18, 0x08 ; 8 + 1476: 09 f4 brne .+2 ; 0x147a + 1478: ef c0 rjmp .+478 ; 0x1658 + 147a: 29 30 cpi r18, 0x09 ; 9 + 147c: 09 f4 brne .+2 ; 0x1480 + 147e: fe c0 rjmp .+508 ; 0x167c + 1480: 26 30 cpi r18, 0x06 ; 6 + 1482: 09 f0 breq .+2 ; 0x1486 + 1484: 17 c1 rjmp .+558 ; 0x16b4 + 1486: 92 c0 rjmp .+292 ; 0x15ac { case REQ_GetStatus: if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || - 114c: 80 38 cpi r24, 0x80 ; 128 - 114e: 21 f0 breq .+8 ; 0x1158 - 1150: 82 38 cpi r24, 0x82 ; 130 - 1152: 09 f0 breq .+2 ; 0x1156 - 1154: 10 c1 rjmp .+544 ; 0x1376 - 1156: 08 c0 rjmp .+16 ; 0x1168 + 1488: 80 38 cpi r24, 0x80 ; 128 + 148a: 21 f0 breq .+8 ; 0x1494 + 148c: 82 38 cpi r24, 0x82 ; 130 + 148e: 09 f0 breq .+2 ; 0x1492 + 1490: 11 c1 rjmp .+546 ; 0x16b4 + 1492: 08 c0 rjmp .+16 ; 0x14a4 Endpoint_ClearOUT(); } static void USB_Device_GetStatus(void) { uint8_t CurrentStatus = 0; - 1158: 80 91 99 02 lds r24, 0x0299 + 1494: 80 91 e5 02 lds r24, 0x02E5 if (USB_Device_CurrentlySelfPowered) CurrentStatus |= FEATURE_SELFPOWERED_ENABLED; #endif #if !defined(NO_DEVICE_REMOTE_WAKEUP) if (USB_Device_RemoteWakeupEnabled) - 115c: 90 91 9a 02 lds r25, 0x029A - 1160: 99 23 and r25, r25 - 1162: 71 f0 breq .+28 ; 0x1180 + 1498: 90 91 e6 02 lds r25, 0x02E6 + 149c: 99 23 and r25, r25 + 149e: 71 f0 breq .+28 ; 0x14bc CurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED; - 1164: 82 60 ori r24, 0x02 ; 2 - 1166: 0c c0 rjmp .+24 ; 0x1180 + 14a0: 82 60 ori r24, 0x02 ; 2 + 14a2: 0c c0 rjmp .+24 ; 0x14bc */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 1168: 80 91 a0 02 lds r24, 0x02A0 - 116c: 8f 70 andi r24, 0x0F ; 15 - 116e: 80 93 e9 00 sts 0x00E9, r24 + 14a4: 80 91 ec 02 lds r24, 0x02EC + 14a8: 8f 70 andi r24, 0x0F ; 15 + 14aa: 80 93 e9 00 sts 0x00E9, r24 * \return Boolean \c true if the currently selected endpoint is stalled, \c false otherwise. */ static inline bool Endpoint_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsStalled(void) { return ((UECONX & (1 << STALLRQ)) ? true : false); - 1172: 90 91 eb 00 lds r25, 0x00EB + 14ae: 90 91 eb 00 lds r25, 0x00EB break; case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT): #if !defined(CONTROL_ONLY_DEVICE) Endpoint_SelectEndpoint((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK); CurrentStatus = Endpoint_IsStalled(); - 1176: 81 e0 ldi r24, 0x01 ; 1 - 1178: 95 ff sbrs r25, 5 - 117a: 80 e0 ldi r24, 0x00 ; 0 + 14b2: 81 e0 ldi r24, 0x01 ; 1 + 14b4: 95 ff sbrs r25, 5 + 14b6: 80 e0 ldi r24, 0x00 ; 0 */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 117c: 10 92 e9 00 sts 0x00E9, r1 + 14b8: 10 92 e9 00 sts 0x00E9, r1 * \note This is not applicable for non CONTROL type endpoints. */ static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearSETUP(void) { UEINTX &= ~(1 << RXSTPI); - 1180: 90 91 e8 00 lds r25, 0x00E8 - 1184: 97 7f andi r25, 0xF7 ; 247 - 1186: 90 93 e8 00 sts 0x00E8, r25 + 14bc: 90 91 e8 00 lds r25, 0x00E8 + 14c0: 97 7f andi r25, 0xF7 ; 247 + 14c2: 90 93 e8 00 sts 0x00E8, r25 * \param[in] Data Data to write to the currently selected endpoint's FIFO buffer. */ static inline void Endpoint_Write_16_LE(const uint16_t Data) ATTR_ALWAYS_INLINE; static inline void Endpoint_Write_16_LE(const uint16_t Data) { UEDATX = (Data & 0xFF); - 118a: 80 93 f1 00 sts 0x00F1, r24 + 14c6: 80 93 f1 00 sts 0x00F1, r24 UEDATX = (Data >> 8); - 118e: 10 92 f1 00 sts 0x00F1, r1 - 1192: cf c0 rjmp .+414 ; 0x1332 + 14ca: 10 92 f1 00 sts 0x00F1, r1 + 14ce: cf c0 rjmp .+414 ; 0x166e } break; case REQ_ClearFeature: case REQ_SetFeature: if ((bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) || - 1194: 88 23 and r24, r24 - 1196: 19 f0 breq .+6 ; 0x119e - 1198: 82 30 cpi r24, 0x02 ; 2 - 119a: 09 f0 breq .+2 ; 0x119e - 119c: ec c0 rjmp .+472 ; 0x1376 + 14d0: 88 23 and r24, r24 + 14d2: 19 f0 breq .+6 ; 0x14da + 14d4: 82 30 cpi r24, 0x02 ; 2 + 14d6: 09 f0 breq .+2 ; 0x14da + 14d8: ed c0 rjmp .+474 ; 0x16b4 Endpoint_ClearStatusStage(); } static void USB_Device_ClearSetFeature(void) { switch (USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) - 119e: 90 e0 ldi r25, 0x00 ; 0 - 11a0: 8f 71 andi r24, 0x1F ; 31 - 11a2: 90 70 andi r25, 0x00 ; 0 - 11a4: 00 97 sbiw r24, 0x00 ; 0 - 11a6: 29 f0 breq .+10 ; 0x11b2 - 11a8: 82 30 cpi r24, 0x02 ; 2 - 11aa: 91 05 cpc r25, r1 - 11ac: 09 f0 breq .+2 ; 0x11b0 - 11ae: e3 c0 rjmp .+454 ; 0x1376 - 11b0: 0b c0 rjmp .+22 ; 0x11c8 + 14da: 90 e0 ldi r25, 0x00 ; 0 + 14dc: 8f 71 andi r24, 0x1F ; 31 + 14de: 90 70 andi r25, 0x00 ; 0 + 14e0: 00 97 sbiw r24, 0x00 ; 0 + 14e2: 29 f0 breq .+10 ; 0x14ee + 14e4: 82 30 cpi r24, 0x02 ; 2 + 14e6: 91 05 cpc r25, r1 + 14e8: 09 f0 breq .+2 ; 0x14ec + 14ea: e4 c0 rjmp .+456 ; 0x16b4 + 14ec: 0b c0 rjmp .+22 ; 0x1504 { #if !defined(NO_DEVICE_REMOTE_WAKEUP) case REQREC_DEVICE: if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_DeviceRemoteWakeup) - 11b2: 80 91 9e 02 lds r24, 0x029E - 11b6: 81 30 cpi r24, 0x01 ; 1 - 11b8: 09 f0 breq .+2 ; 0x11bc - 11ba: dd c0 rjmp .+442 ; 0x1376 + 14ee: 80 91 ea 02 lds r24, 0x02EA + 14f2: 81 30 cpi r24, 0x01 ; 1 + 14f4: 09 f0 breq .+2 ; 0x14f8 + 14f6: de c0 rjmp .+444 ; 0x16b4 USB_Device_RemoteWakeupEnabled = (USB_ControlRequest.bRequest == REQ_SetFeature); - 11bc: 23 30 cpi r18, 0x03 ; 3 - 11be: 09 f0 breq .+2 ; 0x11c2 - 11c0: 80 e0 ldi r24, 0x00 ; 0 - 11c2: 80 93 9a 02 sts 0x029A, r24 - 11c6: 2c c0 rjmp .+88 ; 0x1220 + 14f8: 23 30 cpi r18, 0x03 ; 3 + 14fa: 09 f0 breq .+2 ; 0x14fe + 14fc: 80 e0 ldi r24, 0x00 ; 0 + 14fe: 80 93 e6 02 sts 0x02E6, r24 + 1502: 2c c0 rjmp .+88 ; 0x155c break; #endif #if !defined(CONTROL_ONLY_DEVICE) case REQREC_ENDPOINT: if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_EndpointHalt) - 11c8: 80 91 9e 02 lds r24, 0x029E - 11cc: 88 23 and r24, r24 - 11ce: 41 f5 brne .+80 ; 0x1220 + 1504: 80 91 ea 02 lds r24, 0x02EA + 1508: 88 23 and r24, r24 + 150a: 41 f5 brne .+80 ; 0x155c { uint8_t EndpointIndex = ((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK); - 11d0: 20 91 a0 02 lds r18, 0x02A0 - 11d4: 2f 70 andi r18, 0x0F ; 15 + 150c: 20 91 ec 02 lds r18, 0x02EC + 1510: 2f 70 andi r18, 0x0F ; 15 if (EndpointIndex == ENDPOINT_CONTROLEP) - 11d6: 09 f4 brne .+2 ; 0x11da - 11d8: ce c0 rjmp .+412 ; 0x1376 + 1512: 09 f4 brne .+2 ; 0x1516 + 1514: cf c0 rjmp .+414 ; 0x16b4 */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 11da: 20 93 e9 00 sts 0x00E9, r18 + 1516: 20 93 e9 00 sts 0x00E9, r18 * \return Boolean \c true if the currently selected endpoint is enabled, \c false otherwise. */ static inline bool Endpoint_IsEnabled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsEnabled(void) { return ((UECONX & (1 << EPEN)) ? true : false); - 11de: 80 91 eb 00 lds r24, 0x00EB + 151a: 80 91 eb 00 lds r24, 0x00EB return; Endpoint_SelectEndpoint(EndpointIndex); if (Endpoint_IsEnabled()) - 11e2: 80 ff sbrs r24, 0 - 11e4: 1d c0 rjmp .+58 ; 0x1220 + 151e: 80 ff sbrs r24, 0 + 1520: 1d c0 rjmp .+58 ; 0x155c { if (USB_ControlRequest.bRequest == REQ_SetFeature) - 11e6: 80 91 9d 02 lds r24, 0x029D - 11ea: 83 30 cpi r24, 0x03 ; 3 - 11ec: 21 f4 brne .+8 ; 0x11f6 + 1522: 80 91 e9 02 lds r24, 0x02E9 + 1526: 83 30 cpi r24, 0x03 ; 3 + 1528: 21 f4 brne .+8 ; 0x1532 * \ingroup Group_EndpointPacketManagement_AVR8 */ static inline void Endpoint_StallTransaction(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_StallTransaction(void) { UECONX |= (1 << STALLRQ); - 11ee: 80 91 eb 00 lds r24, 0x00EB - 11f2: 80 62 ori r24, 0x20 ; 32 - 11f4: 13 c0 rjmp .+38 ; 0x121c + 152a: 80 91 eb 00 lds r24, 0x00EB + 152e: 80 62 ori r24, 0x20 ; 32 + 1530: 13 c0 rjmp .+38 ; 0x1558 * \ingroup Group_EndpointPacketManagement_AVR8 */ static inline void Endpoint_ClearStall(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearStall(void) { UECONX |= (1 << STALLRQC); - 11f6: 80 91 eb 00 lds r24, 0x00EB - 11fa: 80 61 ori r24, 0x10 ; 16 - 11fc: 80 93 eb 00 sts 0x00EB, r24 + 1532: 80 91 eb 00 lds r24, 0x00EB + 1536: 80 61 ori r24, 0x10 ; 16 + 1538: 80 93 eb 00 sts 0x00EB, r24 * \param[in] Address Endpoint address whose FIFO buffers are to be reset. */ static inline void Endpoint_ResetEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_ResetEndpoint(const uint8_t Address) { UERST = (1 << (Address & ENDPOINT_EPNUM_MASK)); - 1200: 81 e0 ldi r24, 0x01 ; 1 - 1202: 90 e0 ldi r25, 0x00 ; 0 - 1204: 02 c0 rjmp .+4 ; 0x120a - 1206: 88 0f add r24, r24 - 1208: 99 1f adc r25, r25 - 120a: 2a 95 dec r18 - 120c: e2 f7 brpl .-8 ; 0x1206 - 120e: 80 93 ea 00 sts 0x00EA, r24 + 153c: 81 e0 ldi r24, 0x01 ; 1 + 153e: 90 e0 ldi r25, 0x00 ; 0 + 1540: 02 c0 rjmp .+4 ; 0x1546 + 1542: 88 0f add r24, r24 + 1544: 99 1f adc r25, r25 + 1546: 2a 95 dec r18 + 1548: e2 f7 brpl .-8 ; 0x1542 + 154a: 80 93 ea 00 sts 0x00EA, r24 UERST = 0; - 1212: 10 92 ea 00 sts 0x00EA, r1 + 154e: 10 92 ea 00 sts 0x00EA, r1 /** Resets the data toggle of the currently selected endpoint. */ static inline void Endpoint_ResetDataToggle(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ResetDataToggle(void) { UECONX |= (1 << RSTDT); - 1216: 80 91 eb 00 lds r24, 0x00EB - 121a: 88 60 ori r24, 0x08 ; 8 - 121c: 80 93 eb 00 sts 0x00EB, r24 + 1552: 80 91 eb 00 lds r24, 0x00EB + 1556: 88 60 ori r24, 0x08 ; 8 + 1558: 80 93 eb 00 sts 0x00EB, r24 */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 1220: 10 92 e9 00 sts 0x00E9, r1 + 155c: 10 92 e9 00 sts 0x00E9, r1 * \note This is not applicable for non CONTROL type endpoints. */ static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearSETUP(void) { UEINTX &= ~(1 << RXSTPI); - 1224: 80 91 e8 00 lds r24, 0x00E8 - 1228: 87 7f andi r24, 0xF7 ; 247 - 122a: 86 c0 rjmp .+268 ; 0x1338 + 1560: 80 91 e8 00 lds r24, 0x00E8 + 1564: 87 7f andi r24, 0xF7 ; 247 + 1566: 86 c0 rjmp .+268 ; 0x1674 USB_Device_ClearSetFeature(); } break; case REQ_SetAddress: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) - 122c: 88 23 and r24, r24 - 122e: 09 f0 breq .+2 ; 0x1232 - 1230: a2 c0 rjmp .+324 ; 0x1376 + 1568: 88 23 and r24, r24 + 156a: 09 f0 breq .+2 ; 0x156e + 156c: a3 c0 rjmp .+326 ; 0x16b4 } } static void USB_Device_SetAddress(void) { uint8_t DeviceAddress = (USB_ControlRequest.wValue & 0x7F); - 1232: 10 91 9e 02 lds r17, 0x029E - 1236: 1f 77 andi r17, 0x7F ; 127 + 156e: 10 91 ea 02 lds r17, 0x02EA + 1572: 1f 77 andi r17, 0x7F ; 127 #endif static inline void USB_Device_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void USB_Device_SetDeviceAddress(const uint8_t Address) { UDADDR = (UDADDR & (1 << ADDEN)) | (Address & 0x7F); - 1238: 80 91 e3 00 lds r24, 0x00E3 - 123c: 80 78 andi r24, 0x80 ; 128 - 123e: 81 2b or r24, r17 - 1240: 80 93 e3 00 sts 0x00E3, r24 - 1244: 80 91 e8 00 lds r24, 0x00E8 - 1248: 87 7f andi r24, 0xF7 ; 247 - 124a: 80 93 e8 00 sts 0x00E8, r24 + 1574: 80 91 e3 00 lds r24, 0x00E3 + 1578: 80 78 andi r24, 0x80 ; 128 + 157a: 81 2b or r24, r17 + 157c: 80 93 e3 00 sts 0x00E3, r24 + 1580: 80 91 e8 00 lds r24, 0x00E8 + 1584: 87 7f andi r24, 0xF7 ; 247 + 1586: 80 93 e8 00 sts 0x00E8, r24 USB_Device_SetDeviceAddress(DeviceAddress); Endpoint_ClearSETUP(); Endpoint_ClearStatusStage(); - 124e: d2 dd rcall .-1116 ; 0xdf4 + 158a: d2 dd rcall .-1116 ; 0x1130 * \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise. */ static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsINReady(void) { return ((UEINTX & (1 << TXINI)) ? true : false); - 1250: 80 91 e8 00 lds r24, 0x00E8 + 158c: 80 91 e8 00 lds r24, 0x00E8 while (!(Endpoint_IsINReady())); - 1254: 80 ff sbrs r24, 0 - 1256: fc cf rjmp .-8 ; 0x1250 + 1590: 80 ff sbrs r24, 0 + 1592: fc cf rjmp .-8 ; 0x158c static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) { (void)Address; UDADDR |= (1 << ADDEN); - 1258: 80 91 e3 00 lds r24, 0x00E3 - 125c: 80 68 ori r24, 0x80 ; 128 - 125e: 80 93 e3 00 sts 0x00E3, r24 + 1594: 80 91 e3 00 lds r24, 0x00E3 + 1598: 80 68 ori r24, 0x80 ; 128 + 159a: 80 93 e3 00 sts 0x00E3, r24 USB_Device_EnableDeviceAddress(DeviceAddress); USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default; - 1262: 11 23 and r17, r17 - 1264: 11 f0 breq .+4 ; 0x126a - 1266: 83 e0 ldi r24, 0x03 ; 3 - 1268: 01 c0 rjmp .+2 ; 0x126c - 126a: 82 e0 ldi r24, 0x02 ; 2 - 126c: 8e bb out 0x1e, r24 ; 30 - 126e: 83 c0 rjmp .+262 ; 0x1376 + 159e: 11 23 and r17, r17 + 15a0: 11 f0 breq .+4 ; 0x15a6 + 15a2: 83 e0 ldi r24, 0x03 ; 3 + 15a4: 01 c0 rjmp .+2 ; 0x15a8 + 15a6: 82 e0 ldi r24, 0x02 ; 2 + 15a8: 8e bb out 0x1e, r24 ; 30 + 15aa: 84 c0 rjmp .+264 ; 0x16b4 if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) USB_Device_SetAddress(); break; case REQ_GetDescriptor: if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || - 1270: 80 58 subi r24, 0x80 ; 128 - 1272: 82 30 cpi r24, 0x02 ; 2 - 1274: 08 f0 brcs .+2 ; 0x1278 - 1276: 7f c0 rjmp .+254 ; 0x1376 + 15ac: 80 58 subi r24, 0x80 ; 128 + 15ae: 82 30 cpi r24, 0x02 ; 2 + 15b0: 08 f0 brcs .+2 ; 0x15b4 + 15b2: 80 c0 rjmp .+256 ; 0x16b4 !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS)) uint8_t DescriptorAddressSpace; #endif #if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR) if (USB_ControlRequest.wValue == ((DTYPE_String << 8) | USE_INTERNAL_SERIAL)) - 1278: 80 91 9e 02 lds r24, 0x029E - 127c: 90 91 9f 02 lds r25, 0x029F - 1280: 23 e0 ldi r18, 0x03 ; 3 - 1282: 8c 3d cpi r24, 0xDC ; 220 - 1284: 92 07 cpc r25, r18 - 1286: 91 f5 brne .+100 ; 0x12ec + 15b4: 80 91 ea 02 lds r24, 0x02EA + 15b8: 90 91 eb 02 lds r25, 0x02EB + 15bc: 23 e0 ldi r18, 0x03 ; 3 + 15be: 8c 3d cpi r24, 0xDC ; 220 + 15c0: 92 07 cpc r25, r18 + 15c2: 91 f5 brne .+100 ; 0x1628 { USB_Descriptor_Header_t Header; uint16_t UnicodeString[INTERNAL_SERIAL_LENGTH_BITS / 4]; } SignatureDescriptor; SignatureDescriptor.Header.Type = DTYPE_String; - 1288: 83 e0 ldi r24, 0x03 ; 3 - 128a: 8c 83 std Y+4, r24 ; 0x04 + 15c4: 83 e0 ldi r24, 0x03 ; 3 + 15c6: 8c 83 std Y+4, r24 ; 0x04 SignatureDescriptor.Header.Size = USB_STRING_LEN(INTERNAL_SERIAL_LENGTH_BITS / 4); - 128c: 8a e2 ldi r24, 0x2A ; 42 - 128e: 8b 83 std Y+3, r24 ; 0x03 + 15c8: 8a e2 ldi r24, 0x2A ; 42 + 15ca: 8b 83 std Y+3, r24 ; 0x03 static inline uint_reg_t GetGlobalInterruptMask(void) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) return SREG; - 1290: 5f b7 in r21, 0x3f ; 63 + 15cc: 5f b7 in r21, 0x3f ; 63 static inline void GlobalInterruptDisable(void) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) cli(); - 1292: f8 94 cli + 15ce: f8 94 cli __builtin_ssrf(AVR32_SR_GM_OFFSET); #elif (ARCH == ARCH_XMEGA) cli(); #endif GCC_MEMORY_BARRIER(); - 1294: de 01 movw r26, r28 - 1296: 15 96 adiw r26, 0x05 ; 5 - 1298: 80 e0 ldi r24, 0x00 ; 0 - 129a: 90 e0 ldi r25, 0x00 ; 0 + 15d0: de 01 movw r26, r28 + 15d2: 15 96 adiw r26, 0x05 ; 5 + 15d4: 80 e0 ldi r24, 0x00 ; 0 + 15d6: 90 e0 ldi r25, 0x00 ; 0 static inline void USB_Device_GetSerialString(uint16_t* const UnicodeString) { uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask(); GlobalInterruptDisable(); uint8_t SigReadAddress = INTERNAL_SERIAL_START_ADDRESS; - 129c: 4e e0 ldi r20, 0x0E ; 14 + 15d8: 4e e0 ldi r20, 0x0E ; 14 for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++) { uint8_t SerialByte = boot_signature_byte_get(SigReadAddress); - 129e: 61 e2 ldi r22, 0x21 ; 33 - 12a0: e4 2f mov r30, r20 - 12a2: f0 e0 ldi r31, 0x00 ; 0 - 12a4: 60 93 57 00 sts 0x0057, r22 - 12a8: e4 91 lpm r30, Z+ + 15da: 61 e2 ldi r22, 0x21 ; 33 + 15dc: e4 2f mov r30, r20 + 15de: f0 e0 ldi r31, 0x00 ; 0 + 15e0: 60 93 57 00 sts 0x0057, r22 + 15e4: e4 91 lpm r30, Z+ if (SerialCharNum & 0x01) - 12aa: 80 ff sbrs r24, 0 - 12ac: 03 c0 rjmp .+6 ; 0x12b4 + 15e6: 80 ff sbrs r24, 0 + 15e8: 03 c0 rjmp .+6 ; 0x15f0 { SerialByte >>= 4; - 12ae: e2 95 swap r30 - 12b0: ef 70 andi r30, 0x0F ; 15 + 15ea: e2 95 swap r30 + 15ec: ef 70 andi r30, 0x0F ; 15 SigReadAddress++; - 12b2: 4f 5f subi r20, 0xFF ; 255 + 15ee: 4f 5f subi r20, 0xFF ; 255 } SerialByte &= 0x0F; - 12b4: ef 70 andi r30, 0x0F ; 15 - 12b6: 2e 2f mov r18, r30 - 12b8: 30 e0 ldi r19, 0x00 ; 0 + 15f0: ef 70 andi r30, 0x0F ; 15 + 15f2: 2e 2f mov r18, r30 + 15f4: 30 e0 ldi r19, 0x00 ; 0 UnicodeString[SerialCharNum] = cpu_to_le16((SerialByte >= 10) ? - 12ba: ea 30 cpi r30, 0x0A ; 10 - 12bc: 18 f0 brcs .+6 ; 0x12c4 - 12be: 29 5c subi r18, 0xC9 ; 201 - 12c0: 3f 4f sbci r19, 0xFF ; 255 - 12c2: 02 c0 rjmp .+4 ; 0x12c8 - 12c4: 20 5d subi r18, 0xD0 ; 208 - 12c6: 3f 4f sbci r19, 0xFF ; 255 - 12c8: 2d 93 st X+, r18 - 12ca: 3d 93 st X+, r19 - 12cc: 01 96 adiw r24, 0x01 ; 1 + 15f6: ea 30 cpi r30, 0x0A ; 10 + 15f8: 18 f0 brcs .+6 ; 0x1600 + 15fa: 29 5c subi r18, 0xC9 ; 201 + 15fc: 3f 4f sbci r19, 0xFF ; 255 + 15fe: 02 c0 rjmp .+4 ; 0x1604 + 1600: 20 5d subi r18, 0xD0 ; 208 + 1602: 3f 4f sbci r19, 0xFF ; 255 + 1604: 2d 93 st X+, r18 + 1606: 3d 93 st X+, r19 + 1608: 01 96 adiw r24, 0x01 ; 1 uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask(); GlobalInterruptDisable(); uint8_t SigReadAddress = INTERNAL_SERIAL_START_ADDRESS; for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++) - 12ce: 84 31 cpi r24, 0x14 ; 20 - 12d0: 91 05 cpc r25, r1 - 12d2: 31 f7 brne .-52 ; 0x12a0 + 160a: 84 31 cpi r24, 0x14 ; 20 + 160c: 91 05 cpc r25, r1 + 160e: 31 f7 brne .-52 ; 0x15dc static inline void SetGlobalInterruptMask(const uint_reg_t GlobalIntState) { GCC_MEMORY_BARRIER(); #if (ARCH == ARCH_AVR8) SREG = GlobalIntState; - 12d4: 5f bf out 0x3f, r21 ; 63 + 1610: 5f bf out 0x3f, r21 ; 63 * \note This is not applicable for non CONTROL type endpoints. */ static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearSETUP(void) { UEINTX &= ~(1 << RXSTPI); - 12d6: 80 91 e8 00 lds r24, 0x00E8 - 12da: 87 7f andi r24, 0xF7 ; 247 - 12dc: 80 93 e8 00 sts 0x00E8, r24 + 1612: 80 91 e8 00 lds r24, 0x00E8 + 1616: 87 7f andi r24, 0xF7 ; 247 + 1618: 80 93 e8 00 sts 0x00E8, r24 USB_Device_GetSerialString(SignatureDescriptor.UnicodeString); Endpoint_ClearSETUP(); Endpoint_Write_Control_Stream_LE(&SignatureDescriptor, sizeof(SignatureDescriptor)); - 12e0: ce 01 movw r24, r28 - 12e2: 03 96 adiw r24, 0x03 ; 3 - 12e4: 6a e2 ldi r22, 0x2A ; 42 - 12e6: 70 e0 ldi r23, 0x00 ; 0 - 12e8: 55 dc rcall .-1878 ; 0xb94 - 12ea: 12 c0 rjmp .+36 ; 0x1310 + 161c: ce 01 movw r24, r28 + 161e: 03 96 adiw r24, 0x03 ; 3 + 1620: 6a e2 ldi r22, 0x2A ; 42 + 1622: 70 e0 ldi r23, 0x00 ; 0 + 1624: 55 dc rcall .-1878 ; 0xed0 + 1626: 12 c0 rjmp .+36 ; 0x164c USB_Device_GetInternalSerialDescriptor(); return; } #endif if ((DescriptorSize = CALLBACK_USB_GetDescriptor(USB_ControlRequest.wValue, USB_ControlRequest.wIndex, - 12ec: 60 91 a0 02 lds r22, 0x02A0 - 12f0: ae 01 movw r20, r28 - 12f2: 4f 5f subi r20, 0xFF ; 255 - 12f4: 5f 4f sbci r21, 0xFF ; 255 - 12f6: 21 dc rcall .-1982 ; 0xb3a - 12f8: bc 01 movw r22, r24 - 12fa: 00 97 sbiw r24, 0x00 ; 0 - 12fc: 09 f4 brne .+2 ; 0x1300 - 12fe: 3b c0 rjmp .+118 ; 0x1376 - 1300: 80 91 e8 00 lds r24, 0x00E8 - 1304: 87 7f andi r24, 0xF7 ; 247 - 1306: 80 93 e8 00 sts 0x00E8, r24 + 1628: 60 91 ec 02 lds r22, 0x02EC + 162c: ae 01 movw r20, r28 + 162e: 4f 5f subi r20, 0xFF ; 255 + 1630: 5f 4f sbci r21, 0xFF ; 255 + 1632: 21 dc rcall .-1982 ; 0xe76 + 1634: bc 01 movw r22, r24 + 1636: 00 97 sbiw r24, 0x00 ; 0 + 1638: 09 f4 brne .+2 ; 0x163c + 163a: 3c c0 rjmp .+120 ; 0x16b4 + 163c: 80 91 e8 00 lds r24, 0x00E8 + 1640: 87 7f andi r24, 0xF7 ; 247 + 1642: 80 93 e8 00 sts 0x00E8, r24 #if defined(USE_RAM_DESCRIPTORS) || !defined(ARCH_HAS_MULTI_ADDRESS_SPACE) Endpoint_Write_Control_Stream_LE(DescriptorPointer, DescriptorSize); #elif defined(USE_EEPROM_DESCRIPTORS) Endpoint_Write_Control_EStream_LE(DescriptorPointer, DescriptorSize); #elif defined(USE_FLASH_DESCRIPTORS) Endpoint_Write_Control_PStream_LE(DescriptorPointer, DescriptorSize); - 130a: 89 81 ldd r24, Y+1 ; 0x01 - 130c: 9a 81 ldd r25, Y+2 ; 0x02 - 130e: 9c dc rcall .-1736 ; 0xc48 + 1646: 89 81 ldd r24, Y+1 ; 0x01 + 1648: 9a 81 ldd r25, Y+2 ; 0x02 + 164a: 9c dc rcall .-1736 ; 0xf84 */ static inline void Endpoint_ClearOUT(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearOUT(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << RXOUTI) | (1 << FIFOCON)); - 1310: 80 91 e8 00 lds r24, 0x00E8 - 1314: 8b 77 andi r24, 0x7B ; 123 - 1316: 80 93 e8 00 sts 0x00E8, r24 - 131a: 2d c0 rjmp .+90 ; 0x1376 + 164c: 80 91 e8 00 lds r24, 0x00E8 + 1650: 8b 77 andi r24, 0x7B ; 123 + 1652: 80 93 e8 00 sts 0x00E8, r24 + 1656: 2e c0 rjmp .+92 ; 0x16b4 USB_Device_GetDescriptor(); } break; case REQ_GetConfiguration: if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) - 131c: 80 38 cpi r24, 0x80 ; 128 - 131e: 59 f5 brne .+86 ; 0x1376 + 1658: 80 38 cpi r24, 0x80 ; 128 + 165a: 61 f5 brne .+88 ; 0x16b4 * \note This is not applicable for non CONTROL type endpoints. */ static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearSETUP(void) { UEINTX &= ~(1 << RXSTPI); - 1320: 80 91 e8 00 lds r24, 0x00E8 - 1324: 87 7f andi r24, 0xF7 ; 247 - 1326: 80 93 e8 00 sts 0x00E8, r24 + 165c: 80 91 e8 00 lds r24, 0x00E8 + 1660: 87 7f andi r24, 0xF7 ; 247 + 1662: 80 93 e8 00 sts 0x00E8, r24 static void USB_Device_GetConfiguration(void) { Endpoint_ClearSETUP(); Endpoint_Write_8(USB_Device_ConfigurationNumber); - 132a: 80 91 98 02 lds r24, 0x0298 + 1666: 80 91 e4 02 lds r24, 0x02E4 * \param[in] Data Data to write into the the currently selected endpoint's FIFO buffer. */ static inline void Endpoint_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE; static inline void Endpoint_Write_8(const uint8_t Data) { UEDATX = Data; - 132e: 80 93 f1 00 sts 0x00F1, r24 + 166a: 80 93 f1 00 sts 0x00F1, r24 */ static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearIN(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << TXINI) | (1 << FIFOCON)); - 1332: 80 91 e8 00 lds r24, 0x00E8 - 1336: 8e 77 andi r24, 0x7E ; 126 - 1338: 80 93 e8 00 sts 0x00E8, r24 + 166e: 80 91 e8 00 lds r24, 0x00E8 + 1672: 8e 77 andi r24, 0x7E ; 126 + 1674: 80 93 e8 00 sts 0x00E8, r24 Endpoint_ClearIN(); Endpoint_ClearStatusStage(); - 133c: 5b dd rcall .-1354 ; 0xdf4 - 133e: 1b c0 rjmp .+54 ; 0x1376 + 1678: 5b dd rcall .-1354 ; 0x1130 + 167a: 1c c0 rjmp .+56 ; 0x16b4 if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) USB_Device_GetConfiguration(); break; case REQ_SetConfiguration: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) - 1340: 88 23 and r24, r24 - 1342: c9 f4 brne .+50 ; 0x1376 + 167c: 88 23 and r24, r24 + 167e: d1 f4 brne .+52 ; 0x16b4 } static void USB_Device_SetConfiguration(void) { #if defined(FIXED_NUM_CONFIGURATIONS) if ((uint8_t)USB_ControlRequest.wValue > FIXED_NUM_CONFIGURATIONS) - 1344: 90 91 9e 02 lds r25, 0x029E - 1348: 92 30 cpi r25, 0x02 ; 2 - 134a: a8 f4 brcc .+42 ; 0x1376 + 1680: 90 91 ea 02 lds r25, 0x02EA + 1684: 92 30 cpi r25, 0x02 ; 2 + 1686: b0 f4 brcc .+44 ; 0x16b4 * \note This is not applicable for non CONTROL type endpoints. */ static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearSETUP(void) { UEINTX &= ~(1 << RXSTPI); - 134c: 80 91 e8 00 lds r24, 0x00E8 - 1350: 87 7f andi r24, 0xF7 ; 247 - 1352: 80 93 e8 00 sts 0x00E8, r24 + 1688: 80 91 e8 00 lds r24, 0x00E8 + 168c: 87 7f andi r24, 0xF7 ; 247 + 168e: 80 93 e8 00 sts 0x00E8, r24 #endif #endif Endpoint_ClearSETUP(); USB_Device_ConfigurationNumber = (uint8_t)USB_ControlRequest.wValue; - 1356: 90 93 98 02 sts 0x0298, r25 + 1692: 90 93 e4 02 sts 0x02E4, r25 Endpoint_ClearStatusStage(); - 135a: 4c dd rcall .-1384 ; 0xdf4 + 1696: 4c dd rcall .-1384 ; 0x1130 if (USB_Device_ConfigurationNumber) - 135c: 80 91 98 02 lds r24, 0x0298 - 1360: 88 23 and r24, r24 - 1362: 21 f4 brne .+8 ; 0x136c + 1698: 80 91 e4 02 lds r24, 0x02E4 + 169c: 88 23 and r24, r24 + 169e: 21 f4 brne .+8 ; 0x16a8 } static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; static inline bool USB_Device_IsAddressSet(void) { return (UDADDR & (1 << ADDEN)); - 1364: 80 91 e3 00 lds r24, 0x00E3 + 16a0: 80 91 e3 00 lds r24, 0x00E3 USB_DeviceState = DEVICE_STATE_Configured; else USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered; - 1368: 87 ff sbrs r24, 7 - 136a: 02 c0 rjmp .+4 ; 0x1370 - 136c: 84 e0 ldi r24, 0x04 ; 4 - 136e: 01 c0 rjmp .+2 ; 0x1372 - 1370: 81 e0 ldi r24, 0x01 ; 1 - 1372: 8e bb out 0x1e, r24 ; 30 + 16a4: 87 ff sbrs r24, 7 + 16a6: 02 c0 rjmp .+4 ; 0x16ac + 16a8: 84 e0 ldi r24, 0x04 ; 4 + 16aa: 01 c0 rjmp .+2 ; 0x16ae + 16ac: 81 e0 ldi r24, 0x01 ; 1 + 16ae: 8e bb out 0x1e, r24 ; 30 EVENT_USB_Device_ConfigurationChanged(); - 1374: bc d9 rcall .-3208 ; 0x6ee + 16b0: 0e 94 4a 03 call 0x694 ; 0x694 * \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise. */ static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsSETUPReceived(void) { return ((UEINTX & (1 << RXSTPI)) ? true : false); - 1376: 80 91 e8 00 lds r24, 0x00E8 + 16b4: 80 91 e8 00 lds r24, 0x00E8 default: break; } } if (Endpoint_IsSETUPReceived()) - 137a: 83 ff sbrs r24, 3 - 137c: 0a c0 rjmp .+20 ; 0x1392 + 16b8: 83 ff sbrs r24, 3 + 16ba: 0a c0 rjmp .+20 ; 0x16d0 * \note This is not applicable for non CONTROL type endpoints. */ static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearSETUP(void) { UEINTX &= ~(1 << RXSTPI); - 137e: 80 91 e8 00 lds r24, 0x00E8 - 1382: 87 7f andi r24, 0xF7 ; 247 - 1384: 80 93 e8 00 sts 0x00E8, r24 + 16bc: 80 91 e8 00 lds r24, 0x00E8 + 16c0: 87 7f andi r24, 0xF7 ; 247 + 16c2: 80 93 e8 00 sts 0x00E8, r24 * \ingroup Group_EndpointPacketManagement_AVR8 */ static inline void Endpoint_StallTransaction(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_StallTransaction(void) { UECONX |= (1 << STALLRQ); - 1388: 80 91 eb 00 lds r24, 0x00EB - 138c: 80 62 ori r24, 0x20 ; 32 - 138e: 80 93 eb 00 sts 0x00EB, r24 + 16c6: 80 91 eb 00 lds r24, 0x00EB + 16ca: 80 62 ori r24, 0x20 ; 32 + 16cc: 80 93 eb 00 sts 0x00EB, r24 { Endpoint_ClearSETUP(); Endpoint_StallTransaction(); } } - 1392: ac 96 adiw r28, 0x2c ; 44 - 1394: 0f b6 in r0, 0x3f ; 63 - 1396: f8 94 cli - 1398: de bf out 0x3e, r29 ; 62 - 139a: 0f be out 0x3f, r0 ; 63 - 139c: cd bf out 0x3d, r28 ; 61 - 139e: cf 91 pop r28 - 13a0: df 91 pop r29 - 13a2: 1f 91 pop r17 - 13a4: 08 95 ret - -000013a6 : + 16d0: ac 96 adiw r28, 0x2c ; 44 + 16d2: 0f b6 in r0, 0x3f ; 63 + 16d4: f8 94 cli + 16d6: de bf out 0x3e, r29 ; 62 + 16d8: 0f be out 0x3f, r0 ; 63 + 16da: cd bf out 0x3d, r28 ; 61 + 16dc: cf 91 pop r28 + 16de: df 91 pop r29 + 16e0: 1f 91 pop r17 + 16e2: 08 95 ret + +000016e4 : #include "Events.h" void USB_Event_Stub(void) { } - 13a6: 08 95 ret + 16e4: 08 95 ret -000013a8 : +000016e6 : #if defined(USB_CAN_BE_DEVICE) && !defined(DEVICE_STATE_AS_GPIOR) volatile uint8_t USB_DeviceState; #endif void USB_USBTask(void) { - 13a8: 1f 93 push r17 + 16e6: 1f 93 push r17 } #if defined(USB_CAN_BE_DEVICE) static void USB_DeviceTask(void) { if (USB_DeviceState == DEVICE_STATE_Unattached) - 13aa: 8e b3 in r24, 0x1e ; 30 - 13ac: 88 23 and r24, r24 - 13ae: a9 f0 breq .+42 ; 0x13da + 16e8: 8e b3 in r24, 0x1e ; 30 + 16ea: 88 23 and r24, r24 + 16ec: a9 f0 breq .+42 ; 0x1718 */ static inline uint8_t Endpoint_GetCurrentEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_GetCurrentEndpoint(void) { #if !defined(CONTROL_ONLY_DEVICE) return ((UENUM & ENDPOINT_EPNUM_MASK) | Endpoint_GetEndpointDirection()); - 13b0: 80 91 e9 00 lds r24, 0x00E9 - 13b4: 8f 70 andi r24, 0x0F ; 15 + 16ee: 80 91 e9 00 lds r24, 0x00E9 + 16f2: 8f 70 andi r24, 0x0F ; 15 * \return The currently selected endpoint's direction, as a \c ENDPOINT_DIR_* mask. */ static inline uint8_t Endpoint_GetEndpointDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_GetEndpointDirection(void) { return (UECFG0X & (1 << EPDIR)) ? ENDPOINT_DIR_IN : ENDPOINT_DIR_OUT; - 13b6: 90 91 ec 00 lds r25, 0x00EC - 13ba: 90 ff sbrs r25, 0 - 13bc: 02 c0 rjmp .+4 ; 0x13c2 - 13be: 10 e8 ldi r17, 0x80 ; 128 - 13c0: 01 c0 rjmp .+2 ; 0x13c4 - 13c2: 10 e0 ldi r17, 0x00 ; 0 + 16f4: 90 91 ec 00 lds r25, 0x00EC + 16f8: 90 ff sbrs r25, 0 + 16fa: 02 c0 rjmp .+4 ; 0x1700 + 16fc: 10 e8 ldi r17, 0x80 ; 128 + 16fe: 01 c0 rjmp .+2 ; 0x1702 + 1700: 10 e0 ldi r17, 0x00 ; 0 */ static inline uint8_t Endpoint_GetCurrentEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_GetCurrentEndpoint(void) { #if !defined(CONTROL_ONLY_DEVICE) return ((UENUM & ENDPOINT_EPNUM_MASK) | Endpoint_GetEndpointDirection()); - 13c4: 18 2b or r17, r24 + 1702: 18 2b or r17, r24 */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 13c6: 10 92 e9 00 sts 0x00E9, r1 + 1704: 10 92 e9 00 sts 0x00E9, r1 * \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise. */ static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsSETUPReceived(void) { return ((UEINTX & (1 << RXSTPI)) ? true : false); - 13ca: 80 91 e8 00 lds r24, 0x00E8 + 1708: 80 91 e8 00 lds r24, 0x00E8 uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint(); Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); if (Endpoint_IsSETUPReceived()) - 13ce: 83 ff sbrs r24, 3 - 13d0: 01 c0 rjmp .+2 ; 0x13d4 + 170c: 83 ff sbrs r24, 3 + 170e: 01 c0 rjmp .+2 ; 0x1712 USB_Device_ProcessControlRequest(); - 13d2: 88 de rcall .-752 ; 0x10e4 + 1710: 87 de rcall .-754 ; 0x1420 */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 13d4: 1f 70 andi r17, 0x0F ; 15 - 13d6: 10 93 e9 00 sts 0x00E9, r17 + 1712: 1f 70 andi r17, 0x0F ; 15 + 1714: 10 93 e9 00 sts 0x00E9, r17 #elif defined(USB_CAN_BE_HOST) USB_HostTask(); #elif defined(USB_CAN_BE_DEVICE) USB_DeviceTask(); #endif } - 13da: 1f 91 pop r17 - 13dc: 08 95 ret + 1718: 1f 91 pop r17 + 171a: 08 95 ret -000013de : +0000171c : #define __INCLUDE_FROM_CDC_DRIVER #define __INCLUDE_FROM_CDC_DEVICE_C #include "CDCClassDevice.h" void CDC_Device_ProcessControlRequest(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { - 13de: cf 93 push r28 - 13e0: df 93 push r29 - 13e2: ec 01 movw r28, r24 + 171c: cf 93 push r28 + 171e: df 93 push r29 + 1720: ec 01 movw r28, r24 * \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise. */ static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsSETUPReceived(void) { return ((UEINTX & (1 << RXSTPI)) ? true : false); - 13e4: 80 91 e8 00 lds r24, 0x00E8 + 1722: 80 91 e8 00 lds r24, 0x00E8 if (!(Endpoint_IsSETUPReceived())) - 13e8: 83 ff sbrs r24, 3 - 13ea: a2 c0 rjmp .+324 ; 0x1530 + 1726: 83 ff sbrs r24, 3 + 1728: a3 c0 rjmp .+326 ; 0x1870 return; if (USB_ControlRequest.wIndex != CDCInterfaceInfo->Config.ControlInterfaceNumber) - 13ec: 88 81 ld r24, Y - 13ee: 90 e0 ldi r25, 0x00 ; 0 - 13f0: 20 91 a0 02 lds r18, 0x02A0 - 13f4: 30 91 a1 02 lds r19, 0x02A1 - 13f8: 28 17 cp r18, r24 - 13fa: 39 07 cpc r19, r25 - 13fc: 09 f0 breq .+2 ; 0x1400 - 13fe: 98 c0 rjmp .+304 ; 0x1530 + 172a: 88 81 ld r24, Y + 172c: 90 e0 ldi r25, 0x00 ; 0 + 172e: 20 91 ec 02 lds r18, 0x02EC + 1732: 30 91 ed 02 lds r19, 0x02ED + 1736: 28 17 cp r18, r24 + 1738: 39 07 cpc r19, r25 + 173a: 09 f0 breq .+2 ; 0x173e + 173c: 99 c0 rjmp .+306 ; 0x1870 return; switch (USB_ControlRequest.bRequest) - 1400: 80 91 9d 02 lds r24, 0x029D - 1404: 81 32 cpi r24, 0x21 ; 33 - 1406: 69 f0 breq .+26 ; 0x1422 - 1408: 82 32 cpi r24, 0x22 ; 34 - 140a: 20 f4 brcc .+8 ; 0x1414 - 140c: 80 32 cpi r24, 0x20 ; 32 - 140e: 09 f0 breq .+2 ; 0x1412 - 1410: 8f c0 rjmp .+286 ; 0x1530 - 1412: 3c c0 rjmp .+120 ; 0x148c - 1414: 82 32 cpi r24, 0x22 ; 34 - 1416: 09 f4 brne .+2 ; 0x141a - 1418: 6a c0 rjmp .+212 ; 0x14ee - 141a: 83 32 cpi r24, 0x23 ; 35 - 141c: 09 f0 breq .+2 ; 0x1420 - 141e: 88 c0 rjmp .+272 ; 0x1530 - 1420: 79 c0 rjmp .+242 ; 0x1514 + 173e: 80 91 e9 02 lds r24, 0x02E9 + 1742: 81 32 cpi r24, 0x21 ; 33 + 1744: 69 f0 breq .+26 ; 0x1760 + 1746: 82 32 cpi r24, 0x22 ; 34 + 1748: 20 f4 brcc .+8 ; 0x1752 + 174a: 80 32 cpi r24, 0x20 ; 32 + 174c: 09 f0 breq .+2 ; 0x1750 + 174e: 90 c0 rjmp .+288 ; 0x1870 + 1750: 3c c0 rjmp .+120 ; 0x17ca + 1752: 82 32 cpi r24, 0x22 ; 34 + 1754: 09 f4 brne .+2 ; 0x1758 + 1756: 6b c0 rjmp .+214 ; 0x182e + 1758: 83 32 cpi r24, 0x23 ; 35 + 175a: 09 f0 breq .+2 ; 0x175e + 175c: 89 c0 rjmp .+274 ; 0x1870 + 175e: 7a c0 rjmp .+244 ; 0x1854 { case CDC_REQ_GetLineEncoding: if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) - 1422: 80 91 9c 02 lds r24, 0x029C - 1426: 81 3a cpi r24, 0xA1 ; 161 - 1428: 09 f0 breq .+2 ; 0x142c - 142a: 82 c0 rjmp .+260 ; 0x1530 + 1760: 80 91 e8 02 lds r24, 0x02E8 + 1764: 81 3a cpi r24, 0xA1 ; 161 + 1766: 09 f0 breq .+2 ; 0x176a + 1768: 83 c0 rjmp .+262 ; 0x1870 * \note This is not applicable for non CONTROL type endpoints. */ static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearSETUP(void) { UEINTX &= ~(1 << RXSTPI); - 142c: 80 91 e8 00 lds r24, 0x00E8 - 1430: 87 7f andi r24, 0xF7 ; 247 - 1432: 80 93 e8 00 sts 0x00E8, r24 + 176a: 80 91 e8 00 lds r24, 0x00E8 + 176e: 87 7f andi r24, 0xF7 ; 247 + 1770: 80 93 e8 00 sts 0x00E8, r24 * \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise. */ static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsINReady(void) { return ((UEINTX & (1 << TXINI)) ? true : false); - 1436: 80 91 e8 00 lds r24, 0x00E8 + 1774: 80 91 e8 00 lds r24, 0x00E8 { Endpoint_ClearSETUP(); while (!(Endpoint_IsINReady())); - 143a: 80 ff sbrs r24, 0 - 143c: fc cf rjmp .-8 ; 0x1436 + 1778: 80 ff sbrs r24, 0 + 177a: fc cf rjmp .-8 ; 0x1774 Endpoint_Write_32_LE(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS); - 143e: 8c 89 ldd r24, Y+20 ; 0x14 - 1440: 9d 89 ldd r25, Y+21 ; 0x15 - 1442: ae 89 ldd r26, Y+22 ; 0x16 - 1444: bf 89 ldd r27, Y+23 ; 0x17 + 177c: 8c 89 ldd r24, Y+20 ; 0x14 + 177e: 9d 89 ldd r25, Y+21 ; 0x15 + 1780: ae 89 ldd r26, Y+22 ; 0x16 + 1782: bf 89 ldd r27, Y+23 ; 0x17 * \param[in] Data Data to write to the currently selected endpoint's FIFO buffer. */ static inline void Endpoint_Write_32_LE(const uint32_t Data) ATTR_ALWAYS_INLINE; static inline void Endpoint_Write_32_LE(const uint32_t Data) { UEDATX = (Data & 0xFF); - 1446: 80 93 f1 00 sts 0x00F1, r24 + 1784: 80 93 f1 00 sts 0x00F1, r24 UEDATX = (Data >> 8); - 144a: 29 2f mov r18, r25 - 144c: 3a 2f mov r19, r26 - 144e: 4b 2f mov r20, r27 - 1450: 55 27 eor r21, r21 - 1452: 20 93 f1 00 sts 0x00F1, r18 + 1788: 29 2f mov r18, r25 + 178a: 3a 2f mov r19, r26 + 178c: 4b 2f mov r20, r27 + 178e: 55 27 eor r21, r21 + 1790: 20 93 f1 00 sts 0x00F1, r18 UEDATX = (Data >> 16); - 1456: 9d 01 movw r18, r26 - 1458: 44 27 eor r20, r20 - 145a: 55 27 eor r21, r21 - 145c: 20 93 f1 00 sts 0x00F1, r18 + 1794: 9d 01 movw r18, r26 + 1796: 44 27 eor r20, r20 + 1798: 55 27 eor r21, r21 + 179a: 20 93 f1 00 sts 0x00F1, r18 UEDATX = (Data >> 24); - 1460: 8b 2f mov r24, r27 - 1462: 99 27 eor r25, r25 - 1464: aa 27 eor r26, r26 - 1466: bb 27 eor r27, r27 - 1468: 80 93 f1 00 sts 0x00F1, r24 + 179e: 8b 2f mov r24, r27 + 17a0: 99 27 eor r25, r25 + 17a2: aa 27 eor r26, r26 + 17a4: bb 27 eor r27, r27 + 17a6: 80 93 f1 00 sts 0x00F1, r24 Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.CharFormat); - 146c: 88 8d ldd r24, Y+24 ; 0x18 + 17aa: 88 8d ldd r24, Y+24 ; 0x18 * \param[in] Data Data to write into the the currently selected endpoint's FIFO buffer. */ static inline void Endpoint_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE; static inline void Endpoint_Write_8(const uint8_t Data) { UEDATX = Data; - 146e: 80 93 f1 00 sts 0x00F1, r24 + 17ac: 80 93 f1 00 sts 0x00F1, r24 Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.ParityType); - 1472: 89 8d ldd r24, Y+25 ; 0x19 - 1474: 80 93 f1 00 sts 0x00F1, r24 + 17b0: 89 8d ldd r24, Y+25 ; 0x19 + 17b2: 80 93 f1 00 sts 0x00F1, r24 Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.DataBits); - 1478: 8a 8d ldd r24, Y+26 ; 0x1a - 147a: 80 93 f1 00 sts 0x00F1, r24 + 17b6: 8a 8d ldd r24, Y+26 ; 0x1a + 17b8: 80 93 f1 00 sts 0x00F1, r24 */ static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearIN(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << TXINI) | (1 << FIFOCON)); - 147e: 80 91 e8 00 lds r24, 0x00E8 - 1482: 8e 77 andi r24, 0x7E ; 126 - 1484: 80 93 e8 00 sts 0x00E8, r24 + 17bc: 80 91 e8 00 lds r24, 0x00E8 + 17c0: 8e 77 andi r24, 0x7E ; 126 + 17c2: 80 93 e8 00 sts 0x00E8, r24 Endpoint_ClearIN(); Endpoint_ClearStatusStage(); - 1488: b5 dc rcall .-1686 ; 0xdf4 - 148a: 52 c0 rjmp .+164 ; 0x1530 + 17c6: b4 dc rcall .-1688 ; 0x1130 + 17c8: 53 c0 rjmp .+166 ; 0x1870 } break; case CDC_REQ_SetLineEncoding: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - 148c: 80 91 9c 02 lds r24, 0x029C - 1490: 81 32 cpi r24, 0x21 ; 33 - 1492: 09 f0 breq .+2 ; 0x1496 - 1494: 4d c0 rjmp .+154 ; 0x1530 + 17ca: 80 91 e8 02 lds r24, 0x02E8 + 17ce: 81 32 cpi r24, 0x21 ; 33 + 17d0: 09 f0 breq .+2 ; 0x17d4 + 17d2: 4e c0 rjmp .+156 ; 0x1870 * \note This is not applicable for non CONTROL type endpoints. */ static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearSETUP(void) { UEINTX &= ~(1 << RXSTPI); - 1496: 80 91 e8 00 lds r24, 0x00E8 - 149a: 87 7f andi r24, 0xF7 ; 247 - 149c: 80 93 e8 00 sts 0x00E8, r24 + 17d4: 80 91 e8 00 lds r24, 0x00E8 + 17d8: 87 7f andi r24, 0xF7 ; 247 + 17da: 80 93 e8 00 sts 0x00E8, r24 { Endpoint_ClearSETUP(); while (!(Endpoint_IsOUTReceived())) - 14a0: 04 c0 rjmp .+8 ; 0x14aa + 17de: 04 c0 rjmp .+8 ; 0x17e8 { if (USB_DeviceState == DEVICE_STATE_Unattached) - 14a2: 8e b3 in r24, 0x1e ; 30 - 14a4: 88 23 and r24, r24 - 14a6: 09 f4 brne .+2 ; 0x14aa - 14a8: 43 c0 rjmp .+134 ; 0x1530 + 17e0: 8e b3 in r24, 0x1e ; 30 + 17e2: 88 23 and r24, r24 + 17e4: 09 f4 brne .+2 ; 0x17e8 + 17e6: 44 c0 rjmp .+136 ; 0x1870 * \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise. */ static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsOUTReceived(void) { return ((UEINTX & (1 << RXOUTI)) ? true : false); - 14aa: 80 91 e8 00 lds r24, 0x00E8 + 17e8: 80 91 e8 00 lds r24, 0x00E8 case CDC_REQ_SetLineEncoding: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { Endpoint_ClearSETUP(); while (!(Endpoint_IsOUTReceived())) - 14ae: 82 ff sbrs r24, 2 - 14b0: f8 cf rjmp .-16 ; 0x14a2 + 17ec: 82 ff sbrs r24, 2 + 17ee: f8 cf rjmp .-16 ; 0x17e0 { uint32_t Value; uint8_t Bytes[4]; } Data; Data.Bytes[0] = UEDATX; - 14b2: 30 91 f1 00 lds r19, 0x00F1 + 17f0: 30 91 f1 00 lds r19, 0x00F1 Data.Bytes[1] = UEDATX; - 14b6: 20 91 f1 00 lds r18, 0x00F1 + 17f4: 20 91 f1 00 lds r18, 0x00F1 Data.Bytes[2] = UEDATX; - 14ba: 90 91 f1 00 lds r25, 0x00F1 + 17f8: 90 91 f1 00 lds r25, 0x00F1 Data.Bytes[3] = UEDATX; - 14be: 80 91 f1 00 lds r24, 0x00F1 + 17fc: 80 91 f1 00 lds r24, 0x00F1 { if (USB_DeviceState == DEVICE_STATE_Unattached) return; } CDCInterfaceInfo->State.LineEncoding.BaudRateBPS = Endpoint_Read_32_LE(); - 14c2: 3c 8b std Y+20, r19 ; 0x14 - 14c4: 2d 8b std Y+21, r18 ; 0x15 - 14c6: 9e 8b std Y+22, r25 ; 0x16 - 14c8: 8f 8b std Y+23, r24 ; 0x17 + 1800: 3c 8b std Y+20, r19 ; 0x14 + 1802: 2d 8b std Y+21, r18 ; 0x15 + 1804: 9e 8b std Y+22, r25 ; 0x16 + 1806: 8f 8b std Y+23, r24 ; 0x17 * \return Next byte in the currently selected endpoint's FIFO buffer. */ static inline uint8_t Endpoint_Read_8(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_Read_8(void) { return UEDATX; - 14ca: 80 91 f1 00 lds r24, 0x00F1 + 1808: 80 91 f1 00 lds r24, 0x00F1 CDCInterfaceInfo->State.LineEncoding.CharFormat = Endpoint_Read_8(); - 14ce: 88 8f std Y+24, r24 ; 0x18 - 14d0: 80 91 f1 00 lds r24, 0x00F1 + 180c: 88 8f std Y+24, r24 ; 0x18 + 180e: 80 91 f1 00 lds r24, 0x00F1 CDCInterfaceInfo->State.LineEncoding.ParityType = Endpoint_Read_8(); - 14d4: 89 8f std Y+25, r24 ; 0x19 - 14d6: 80 91 f1 00 lds r24, 0x00F1 + 1812: 89 8f std Y+25, r24 ; 0x19 + 1814: 80 91 f1 00 lds r24, 0x00F1 CDCInterfaceInfo->State.LineEncoding.DataBits = Endpoint_Read_8(); - 14da: 8a 8f std Y+26, r24 ; 0x1a + 1818: 8a 8f std Y+26, r24 ; 0x1a */ static inline void Endpoint_ClearOUT(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearOUT(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << RXOUTI) | (1 << FIFOCON)); - 14dc: 80 91 e8 00 lds r24, 0x00E8 - 14e0: 8b 77 andi r24, 0x7B ; 123 - 14e2: 80 93 e8 00 sts 0x00E8, r24 + 181a: 80 91 e8 00 lds r24, 0x00E8 + 181e: 8b 77 andi r24, 0x7B ; 123 + 1820: 80 93 e8 00 sts 0x00E8, r24 Endpoint_ClearOUT(); Endpoint_ClearStatusStage(); - 14e6: 86 dc rcall .-1780 ; 0xdf4 + 1824: 85 dc rcall .-1782 ; 0x1130 EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo); - 14e8: ce 01 movw r24, r28 - 14ea: 31 d9 rcall .-3486 ; 0x74e - 14ec: 21 c0 rjmp .+66 ; 0x1530 + 1826: ce 01 movw r24, r28 + 1828: 0e 94 7c 03 call 0x6f8 ; 0x6f8 + 182c: 21 c0 rjmp .+66 ; 0x1870 } break; case CDC_REQ_SetControlLineState: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - 14ee: 80 91 9c 02 lds r24, 0x029C - 14f2: 81 32 cpi r24, 0x21 ; 33 - 14f4: e9 f4 brne .+58 ; 0x1530 + 182e: 80 91 e8 02 lds r24, 0x02E8 + 1832: 81 32 cpi r24, 0x21 ; 33 + 1834: e9 f4 brne .+58 ; 0x1870 * \note This is not applicable for non CONTROL type endpoints. */ static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearSETUP(void) { UEINTX &= ~(1 << RXSTPI); - 14f6: 80 91 e8 00 lds r24, 0x00E8 - 14fa: 87 7f andi r24, 0xF7 ; 247 - 14fc: 80 93 e8 00 sts 0x00E8, r24 + 1836: 80 91 e8 00 lds r24, 0x00E8 + 183a: 87 7f andi r24, 0xF7 ; 247 + 183c: 80 93 e8 00 sts 0x00E8, r24 { Endpoint_ClearSETUP(); Endpoint_ClearStatusStage(); - 1500: 79 dc rcall .-1806 ; 0xdf4 + 1840: 77 dc rcall .-1810 ; 0x1130 CDCInterfaceInfo->State.ControlLineStates.HostToDevice = USB_ControlRequest.wValue; - 1502: 80 91 9e 02 lds r24, 0x029E - 1506: 90 91 9f 02 lds r25, 0x029F - 150a: 99 8b std Y+17, r25 ; 0x11 - 150c: 88 8b std Y+16, r24 ; 0x10 + 1842: 80 91 ea 02 lds r24, 0x02EA + 1846: 90 91 eb 02 lds r25, 0x02EB + 184a: 99 8b std Y+17, r25 ; 0x11 + 184c: 88 8b std Y+16, r24 ; 0x10 EVENT_CDC_Device_ControLineStateChanged(CDCInterfaceInfo); - 150e: ce 01 movw r24, r28 - 1510: d4 d0 rcall .+424 ; 0x16ba - 1512: 0e c0 rjmp .+28 ; 0x1530 + 184e: ce 01 movw r24, r28 + 1850: d4 d0 rcall .+424 ; 0x19fa + 1852: 0e c0 rjmp .+28 ; 0x1870 } break; case CDC_REQ_SendBreak: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) - 1514: 80 91 9c 02 lds r24, 0x029C - 1518: 81 32 cpi r24, 0x21 ; 33 - 151a: 51 f4 brne .+20 ; 0x1530 - 151c: 80 91 e8 00 lds r24, 0x00E8 - 1520: 87 7f andi r24, 0xF7 ; 247 - 1522: 80 93 e8 00 sts 0x00E8, r24 + 1854: 80 91 e8 02 lds r24, 0x02E8 + 1858: 81 32 cpi r24, 0x21 ; 33 + 185a: 51 f4 brne .+20 ; 0x1870 + 185c: 80 91 e8 00 lds r24, 0x00E8 + 1860: 87 7f andi r24, 0xF7 ; 247 + 1862: 80 93 e8 00 sts 0x00E8, r24 { Endpoint_ClearSETUP(); Endpoint_ClearStatusStage(); - 1526: 66 dc rcall .-1844 ; 0xdf4 + 1866: 64 dc rcall .-1848 ; 0x1130 EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); - 1528: ce 01 movw r24, r28 - 152a: 60 91 9e 02 lds r22, 0x029E - 152e: c5 d0 rcall .+394 ; 0x16ba + 1868: ce 01 movw r24, r28 + 186a: 60 91 ea 02 lds r22, 0x02EA + 186e: c5 d0 rcall .+394 ; 0x19fa } break; } } - 1530: df 91 pop r29 - 1532: cf 91 pop r28 - 1534: 08 95 ret + 1870: df 91 pop r29 + 1872: cf 91 pop r28 + 1874: 08 95 ret -00001536 : +00001876 : bool CDC_Device_ConfigureEndpoints(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { - 1536: cf 93 push r28 - 1538: df 93 push r29 - 153a: ec 01 movw r28, r24 + 1876: cf 93 push r28 + 1878: df 93 push r29 + 187a: ec 01 movw r28, r24 memset(&CDCInterfaceInfo->State, 0x00, sizeof(CDCInterfaceInfo->State)); - 153c: 40 96 adiw r24, 0x10 ; 16 - 153e: fc 01 movw r30, r24 - 1540: 8b e0 ldi r24, 0x0B ; 11 - 1542: df 01 movw r26, r30 - 1544: 1d 92 st X+, r1 - 1546: 8a 95 dec r24 - 1548: e9 f7 brne .-6 ; 0x1544 + 187c: 40 96 adiw r24, 0x10 ; 16 + 187e: fc 01 movw r30, r24 + 1880: 8b e0 ldi r24, 0x0B ; 11 + 1882: df 01 movw r26, r30 + 1884: 1d 92 st X+, r1 + 1886: 8a 95 dec r24 + 1888: e9 f7 brne .-6 ; 0x1884 CDCInterfaceInfo->Config.DataINEndpoint.Type = EP_TYPE_BULK; - 154a: 82 e0 ldi r24, 0x02 ; 2 - 154c: 8c 83 std Y+4, r24 ; 0x04 + 188a: 82 e0 ldi r24, 0x02 ; 2 + 188c: 8c 83 std Y+4, r24 ; 0x04 CDCInterfaceInfo->Config.DataOUTEndpoint.Type = EP_TYPE_BULK; - 154e: 89 87 std Y+9, r24 ; 0x09 + 188e: 89 87 std Y+9, r24 ; 0x09 CDCInterfaceInfo->Config.NotificationEndpoint.Type = EP_TYPE_INTERRUPT; - 1550: 83 e0 ldi r24, 0x03 ; 3 - 1552: 8e 87 std Y+14, r24 ; 0x0e + 1890: 83 e0 ldi r24, 0x03 ; 3 + 1892: 8e 87 std Y+14, r24 ; 0x0e if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.DataINEndpoint, 1))) - 1554: ce 01 movw r24, r28 - 1556: 01 96 adiw r24, 0x01 ; 1 - 1558: 61 e0 ldi r22, 0x01 ; 1 - 155a: 08 dc rcall .-2032 ; 0xd6c - 155c: 88 23 and r24, r24 - 155e: 59 f0 breq .+22 ; 0x1576 + 1894: ce 01 movw r24, r28 + 1896: 01 96 adiw r24, 0x01 ; 1 + 1898: 61 e0 ldi r22, 0x01 ; 1 + 189a: 06 dc rcall .-2036 ; 0x10a8 + 189c: 88 23 and r24, r24 + 189e: 59 f0 breq .+22 ; 0x18b6 return false; if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.DataOUTEndpoint, 1))) - 1560: ce 01 movw r24, r28 - 1562: 06 96 adiw r24, 0x06 ; 6 - 1564: 61 e0 ldi r22, 0x01 ; 1 - 1566: 02 dc rcall .-2044 ; 0xd6c - 1568: 88 23 and r24, r24 - 156a: 29 f0 breq .+10 ; 0x1576 + 18a0: ce 01 movw r24, r28 + 18a2: 06 96 adiw r24, 0x06 ; 6 + 18a4: 61 e0 ldi r22, 0x01 ; 1 + 18a6: 00 dc rcall .-2048 ; 0x10a8 + 18a8: 88 23 and r24, r24 + 18aa: 29 f0 breq .+10 ; 0x18b6 return false; if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.NotificationEndpoint, 1))) - 156c: ce 01 movw r24, r28 - 156e: 0b 96 adiw r24, 0x0b ; 11 - 1570: 61 e0 ldi r22, 0x01 ; 1 - 1572: fc db rcall .-2056 ; 0xd6c - 1574: 01 c0 rjmp .+2 ; 0x1578 + 18ac: ce 01 movw r24, r28 + 18ae: 0b 96 adiw r24, 0x0b ; 11 + 18b0: 61 e0 ldi r22, 0x01 ; 1 + 18b2: fa db rcall .-2060 ; 0x10a8 + 18b4: 01 c0 rjmp .+2 ; 0x18b8 if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.DataINEndpoint, 1))) return false; if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.DataOUTEndpoint, 1))) return false; - 1576: 80 e0 ldi r24, 0x00 ; 0 + 18b6: 80 e0 ldi r24, 0x00 ; 0 if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.NotificationEndpoint, 1))) return false; return true; } - 1578: df 91 pop r29 - 157a: cf 91 pop r28 - 157c: 08 95 ret + 18b8: df 91 pop r29 + 18ba: cf 91 pop r28 + 18bc: 08 95 ret -0000157e : +000018be : return Endpoint_Write_Stream_LE(Buffer, Length, NULL); } uint8_t CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, const uint8_t Data) { - 157e: df 93 push r29 - 1580: cf 93 push r28 - 1582: 0f 92 push r0 - 1584: cd b7 in r28, 0x3d ; 61 - 1586: de b7 in r29, 0x3e ; 62 - 1588: fc 01 movw r30, r24 + 18be: df 93 push r29 + 18c0: cf 93 push r28 + 18c2: 0f 92 push r0 + 18c4: cd b7 in r28, 0x3d ; 61 + 18c6: de b7 in r29, 0x3e ; 62 + 18c8: fc 01 movw r30, r24 if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 158a: 8e b3 in r24, 0x1e ; 30 - 158c: 84 30 cpi r24, 0x04 ; 4 - 158e: f9 f4 brne .+62 ; 0x15ce - 1590: 24 89 ldd r18, Z+20 ; 0x14 - 1592: 35 89 ldd r19, Z+21 ; 0x15 - 1594: 46 89 ldd r20, Z+22 ; 0x16 - 1596: 57 89 ldd r21, Z+23 ; 0x17 - 1598: 21 15 cp r18, r1 - 159a: 31 05 cpc r19, r1 - 159c: 41 05 cpc r20, r1 - 159e: 51 05 cpc r21, r1 - 15a0: b1 f0 breq .+44 ; 0x15ce + 18ca: 8e b3 in r24, 0x1e ; 30 + 18cc: 84 30 cpi r24, 0x04 ; 4 + 18ce: f9 f4 brne .+62 ; 0x190e + 18d0: 24 89 ldd r18, Z+20 ; 0x14 + 18d2: 35 89 ldd r19, Z+21 ; 0x15 + 18d4: 46 89 ldd r20, Z+22 ; 0x16 + 18d6: 57 89 ldd r21, Z+23 ; 0x17 + 18d8: 21 15 cp r18, r1 + 18da: 31 05 cpc r19, r1 + 18dc: 41 05 cpc r20, r1 + 18de: 51 05 cpc r21, r1 + 18e0: b1 f0 breq .+44 ; 0x190e */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 15a2: 81 81 ldd r24, Z+1 ; 0x01 - 15a4: 8f 70 andi r24, 0x0F ; 15 - 15a6: 80 93 e9 00 sts 0x00E9, r24 + 18e2: 81 81 ldd r24, Z+1 ; 0x01 + 18e4: 8f 70 andi r24, 0x0F ; 15 + 18e6: 80 93 e9 00 sts 0x00E9, r24 * on its direction. */ static inline bool Endpoint_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsReadWriteAllowed(void) { return ((UEINTX & (1 << RWAL)) ? true : false); - 15aa: 80 91 e8 00 lds r24, 0x00E8 + 18ea: 80 91 e8 00 lds r24, 0x00E8 return ENDPOINT_RWSTREAM_DeviceDisconnected; Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); if (!(Endpoint_IsReadWriteAllowed())) - 15ae: 85 fd sbrc r24, 5 - 15b0: 0a c0 rjmp .+20 ; 0x15c6 + 18ee: 85 fd sbrc r24, 5 + 18f0: 0a c0 rjmp .+20 ; 0x1906 */ static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearIN(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << TXINI) | (1 << FIFOCON)); - 15b2: 80 91 e8 00 lds r24, 0x00E8 - 15b6: 8e 77 andi r24, 0x7E ; 126 - 15b8: 80 93 e8 00 sts 0x00E8, r24 + 18f2: 80 91 e8 00 lds r24, 0x00E8 + 18f6: 8e 77 andi r24, 0x7E ; 126 + 18f8: 80 93 e8 00 sts 0x00E8, r24 { Endpoint_ClearIN(); uint8_t ErrorCode; if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError) - 15bc: 69 83 std Y+1, r22 ; 0x01 - 15be: 39 dc rcall .-1934 ; 0xe32 - 15c0: 69 81 ldd r22, Y+1 ; 0x01 - 15c2: 88 23 and r24, r24 - 15c4: 29 f4 brne .+10 ; 0x15d0 + 18fc: 69 83 std Y+1, r22 ; 0x01 + 18fe: 37 dc rcall .-1938 ; 0x116e + 1900: 69 81 ldd r22, Y+1 ; 0x01 + 1902: 88 23 and r24, r24 + 1904: 29 f4 brne .+10 ; 0x1910 * \param[in] Data Data to write into the the currently selected endpoint's FIFO buffer. */ static inline void Endpoint_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE; static inline void Endpoint_Write_8(const uint8_t Data) { UEDATX = Data; - 15c6: 60 93 f1 00 sts 0x00F1, r22 + 1906: 60 93 f1 00 sts 0x00F1, r22 return ErrorCode; } Endpoint_Write_8(Data); return ENDPOINT_READYWAIT_NoError; - 15ca: 80 e0 ldi r24, 0x00 ; 0 - 15cc: 01 c0 rjmp .+2 ; 0x15d0 + 190a: 80 e0 ldi r24, 0x00 ; 0 + 190c: 01 c0 rjmp .+2 ; 0x1910 uint8_t CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, const uint8_t Data) { if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) return ENDPOINT_RWSTREAM_DeviceDisconnected; - 15ce: 82 e0 ldi r24, 0x02 ; 2 + 190e: 82 e0 ldi r24, 0x02 ; 2 return ErrorCode; } Endpoint_Write_8(Data); return ENDPOINT_READYWAIT_NoError; } - 15d0: 0f 90 pop r0 - 15d2: cf 91 pop r28 - 15d4: df 91 pop r29 - 15d6: 08 95 ret + 1910: 0f 90 pop r0 + 1912: cf 91 pop r28 + 1914: df 91 pop r29 + 1916: 08 95 ret -000015d8 : +00001918 : uint8_t CDC_Device_Flush(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { - 15d8: fc 01 movw r30, r24 + 1918: fc 01 movw r30, r24 if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 15da: 8e b3 in r24, 0x1e ; 30 - 15dc: 84 30 cpi r24, 0x04 ; 4 - 15de: 19 f5 brne .+70 ; 0x1626 - 15e0: 24 89 ldd r18, Z+20 ; 0x14 - 15e2: 35 89 ldd r19, Z+21 ; 0x15 - 15e4: 46 89 ldd r20, Z+22 ; 0x16 - 15e6: 57 89 ldd r21, Z+23 ; 0x17 - 15e8: 21 15 cp r18, r1 - 15ea: 31 05 cpc r19, r1 - 15ec: 41 05 cpc r20, r1 - 15ee: 51 05 cpc r21, r1 - 15f0: d1 f0 breq .+52 ; 0x1626 + 191a: 8e b3 in r24, 0x1e ; 30 + 191c: 84 30 cpi r24, 0x04 ; 4 + 191e: 19 f5 brne .+70 ; 0x1966 + 1920: 24 89 ldd r18, Z+20 ; 0x14 + 1922: 35 89 ldd r19, Z+21 ; 0x15 + 1924: 46 89 ldd r20, Z+22 ; 0x16 + 1926: 57 89 ldd r21, Z+23 ; 0x17 + 1928: 21 15 cp r18, r1 + 192a: 31 05 cpc r19, r1 + 192c: 41 05 cpc r20, r1 + 192e: 51 05 cpc r21, r1 + 1930: d1 f0 breq .+52 ; 0x1966 */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 15f2: 81 81 ldd r24, Z+1 ; 0x01 - 15f4: 8f 70 andi r24, 0x0F ; 15 - 15f6: 80 93 e9 00 sts 0x00E9, r24 + 1932: 81 81 ldd r24, Z+1 ; 0x01 + 1934: 8f 70 andi r24, 0x0F ; 15 + 1936: 80 93 e9 00 sts 0x00E9, r24 #if (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) return UEBCX; #elif defined(USB_SERIES_4_AVR) return (((uint16_t)UEBCHX << 8) | UEBCLX); #elif defined(USB_SERIES_2_AVR) return UEBCLX; - 15fa: 80 91 f2 00 lds r24, 0x00F2 + 193a: 80 91 f2 00 lds r24, 0x00F2 uint8_t ErrorCode; Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); if (!(Endpoint_BytesInEndpoint())) - 15fe: 88 23 and r24, r24 - 1600: a1 f0 breq .+40 ; 0x162a + 193e: 88 23 and r24, r24 + 1940: a1 f0 breq .+40 ; 0x196a * on its direction. */ static inline bool Endpoint_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsReadWriteAllowed(void) { return ((UEINTX & (1 << RWAL)) ? true : false); - 1602: 90 91 e8 00 lds r25, 0x00E8 + 1942: 90 91 e8 00 lds r25, 0x00E8 */ static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearIN(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << TXINI) | (1 << FIFOCON)); - 1606: 80 91 e8 00 lds r24, 0x00E8 - 160a: 8e 77 andi r24, 0x7E ; 126 - 160c: 80 93 e8 00 sts 0x00E8, r24 + 1946: 80 91 e8 00 lds r24, 0x00E8 + 194a: 8e 77 andi r24, 0x7E ; 126 + 194c: 80 93 e8 00 sts 0x00E8, r24 bool BankFull = !(Endpoint_IsReadWriteAllowed()); Endpoint_ClearIN(); if (BankFull) - 1610: 95 fd sbrc r25, 5 - 1612: 0d c0 rjmp .+26 ; 0x162e + 1950: 95 fd sbrc r25, 5 + 1952: 0d c0 rjmp .+26 ; 0x196e { if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError) - 1614: 0e dc rcall .-2020 ; 0xe32 - 1616: 88 23 and r24, r24 - 1618: 59 f4 brne .+22 ; 0x1630 - 161a: 90 91 e8 00 lds r25, 0x00E8 - 161e: 9e 77 andi r25, 0x7E ; 126 - 1620: 90 93 e8 00 sts 0x00E8, r25 - 1624: 08 95 ret + 1954: 0c dc rcall .-2024 ; 0x116e + 1956: 88 23 and r24, r24 + 1958: 59 f4 brne .+22 ; 0x1970 + 195a: 90 91 e8 00 lds r25, 0x00E8 + 195e: 9e 77 andi r25, 0x7E ; 126 + 1960: 90 93 e8 00 sts 0x00E8, r25 + 1964: 08 95 ret } uint8_t CDC_Device_Flush(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) return ENDPOINT_RWSTREAM_DeviceDisconnected; - 1626: 82 e0 ldi r24, 0x02 ; 2 - 1628: 08 95 ret + 1966: 82 e0 ldi r24, 0x02 ; 2 + 1968: 08 95 ret uint8_t ErrorCode; Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); if (!(Endpoint_BytesInEndpoint())) return ENDPOINT_READYWAIT_NoError; - 162a: 80 e0 ldi r24, 0x00 ; 0 - 162c: 08 95 ret + 196a: 80 e0 ldi r24, 0x00 ; 0 + 196c: 08 95 ret return ErrorCode; Endpoint_ClearIN(); } return ENDPOINT_READYWAIT_NoError; - 162e: 80 e0 ldi r24, 0x00 ; 0 + 196e: 80 e0 ldi r24, 0x00 ; 0 } - 1630: 08 95 ret + 1970: 08 95 ret -00001632 : +00001972 : return true; } void CDC_Device_USBTask(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 1632: 2e b3 in r18, 0x1e ; 30 - 1634: 24 30 cpi r18, 0x04 ; 4 - 1636: 99 f4 brne .+38 ; 0x165e - 1638: fc 01 movw r30, r24 - 163a: 24 89 ldd r18, Z+20 ; 0x14 - 163c: 35 89 ldd r19, Z+21 ; 0x15 - 163e: 46 89 ldd r20, Z+22 ; 0x16 - 1640: 57 89 ldd r21, Z+23 ; 0x17 - 1642: 21 15 cp r18, r1 - 1644: 31 05 cpc r19, r1 - 1646: 41 05 cpc r20, r1 - 1648: 51 05 cpc r21, r1 - 164a: 49 f0 breq .+18 ; 0x165e + 1972: 2e b3 in r18, 0x1e ; 30 + 1974: 24 30 cpi r18, 0x04 ; 4 + 1976: 99 f4 brne .+38 ; 0x199e + 1978: fc 01 movw r30, r24 + 197a: 24 89 ldd r18, Z+20 ; 0x14 + 197c: 35 89 ldd r19, Z+21 ; 0x15 + 197e: 46 89 ldd r20, Z+22 ; 0x16 + 1980: 57 89 ldd r21, Z+23 ; 0x17 + 1982: 21 15 cp r18, r1 + 1984: 31 05 cpc r19, r1 + 1986: 41 05 cpc r20, r1 + 1988: 51 05 cpc r21, r1 + 198a: 49 f0 breq .+18 ; 0x199e */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 164c: 21 81 ldd r18, Z+1 ; 0x01 - 164e: 2f 70 andi r18, 0x0F ; 15 - 1650: 20 93 e9 00 sts 0x00E9, r18 + 198c: 21 81 ldd r18, Z+1 ; 0x01 + 198e: 2f 70 andi r18, 0x0F ; 15 + 1990: 20 93 e9 00 sts 0x00E9, r18 * \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise. */ static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsINReady(void) { return ((UEINTX & (1 << TXINI)) ? true : false); - 1654: 20 91 e8 00 lds r18, 0x00E8 + 1994: 20 91 e8 00 lds r18, 0x00E8 return; #if !defined(NO_CLASS_DRIVER_AUTOFLUSH) Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); if (Endpoint_IsINReady()) - 1658: 20 ff sbrs r18, 0 - 165a: 01 c0 rjmp .+2 ; 0x165e + 1998: 20 ff sbrs r18, 0 + 199a: 01 c0 rjmp .+2 ; 0x199e CDC_Device_Flush(CDCInterfaceInfo); - 165c: bd cf rjmp .-134 ; 0x15d8 - 165e: 08 95 ret + 199c: bd cf rjmp .-134 ; 0x1918 + 199e: 08 95 ret -00001660 : +000019a0 : return 0; } } int16_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { - 1660: fc 01 movw r30, r24 + 19a0: fc 01 movw r30, r24 if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) - 1662: 8e b3 in r24, 0x1e ; 30 - 1664: 84 30 cpi r24, 0x04 ; 4 - 1666: 29 f5 brne .+74 ; 0x16b2 - 1668: 24 89 ldd r18, Z+20 ; 0x14 - 166a: 35 89 ldd r19, Z+21 ; 0x15 - 166c: 46 89 ldd r20, Z+22 ; 0x16 - 166e: 57 89 ldd r21, Z+23 ; 0x17 - 1670: 21 15 cp r18, r1 - 1672: 31 05 cpc r19, r1 - 1674: 41 05 cpc r20, r1 - 1676: 51 05 cpc r21, r1 - 1678: e1 f0 breq .+56 ; 0x16b2 + 19a2: 8e b3 in r24, 0x1e ; 30 + 19a4: 84 30 cpi r24, 0x04 ; 4 + 19a6: 29 f5 brne .+74 ; 0x19f2 + 19a8: 24 89 ldd r18, Z+20 ; 0x14 + 19aa: 35 89 ldd r19, Z+21 ; 0x15 + 19ac: 46 89 ldd r20, Z+22 ; 0x16 + 19ae: 57 89 ldd r21, Z+23 ; 0x17 + 19b0: 21 15 cp r18, r1 + 19b2: 31 05 cpc r19, r1 + 19b4: 41 05 cpc r20, r1 + 19b6: 51 05 cpc r21, r1 + 19b8: e1 f0 breq .+56 ; 0x19f2 */ static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void Endpoint_SelectEndpoint(const uint8_t Address) { #if !defined(CONTROL_ONLY_DEVICE) UENUM = (Address & ENDPOINT_EPNUM_MASK); - 167a: 86 81 ldd r24, Z+6 ; 0x06 - 167c: 8f 70 andi r24, 0x0F ; 15 - 167e: 80 93 e9 00 sts 0x00E9, r24 + 19ba: 86 81 ldd r24, Z+6 ; 0x06 + 19bc: 8f 70 andi r24, 0x0F ; 15 + 19be: 80 93 e9 00 sts 0x00E9, r24 * \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise. */ static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsOUTReceived(void) { return ((UEINTX & (1 << RXOUTI)) ? true : false); - 1682: 80 91 e8 00 lds r24, 0x00E8 + 19c2: 80 91 e8 00 lds r24, 0x00E8 int16_t ReceivedByte = -1; Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataOUTEndpoint.Address); if (Endpoint_IsOUTReceived()) - 1686: 82 ff sbrs r24, 2 - 1688: 14 c0 rjmp .+40 ; 0x16b2 + 19c6: 82 ff sbrs r24, 2 + 19c8: 14 c0 rjmp .+40 ; 0x19f2 #if (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) return UEBCX; #elif defined(USB_SERIES_4_AVR) return (((uint16_t)UEBCHX << 8) | UEBCLX); #elif defined(USB_SERIES_2_AVR) return UEBCLX; - 168a: 80 91 f2 00 lds r24, 0x00F2 + 19ca: 80 91 f2 00 lds r24, 0x00F2 { if (Endpoint_BytesInEndpoint()) - 168e: 88 23 and r24, r24 - 1690: 21 f0 breq .+8 ; 0x169a + 19ce: 88 23 and r24, r24 + 19d0: 21 f0 breq .+8 ; 0x19da * \return Next byte in the currently selected endpoint's FIFO buffer. */ static inline uint8_t Endpoint_Read_8(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_Read_8(void) { return UEDATX; - 1692: 20 91 f1 00 lds r18, 0x00F1 + 19d2: 20 91 f1 00 lds r18, 0x00F1 ReceivedByte = Endpoint_Read_8(); - 1696: 30 e0 ldi r19, 0x00 ; 0 - 1698: 02 c0 rjmp .+4 ; 0x169e + 19d6: 30 e0 ldi r19, 0x00 ; 0 + 19d8: 02 c0 rjmp .+4 ; 0x19de int16_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) return -1; int16_t ReceivedByte = -1; - 169a: 2f ef ldi r18, 0xFF ; 255 - 169c: 3f ef ldi r19, 0xFF ; 255 + 19da: 2f ef ldi r18, 0xFF ; 255 + 19dc: 3f ef ldi r19, 0xFF ; 255 #if (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) return UEBCX; #elif defined(USB_SERIES_4_AVR) return (((uint16_t)UEBCHX << 8) | UEBCLX); #elif defined(USB_SERIES_2_AVR) return UEBCLX; - 169e: 80 91 f2 00 lds r24, 0x00F2 + 19de: 80 91 f2 00 lds r24, 0x00F2 if (Endpoint_IsOUTReceived()) { if (Endpoint_BytesInEndpoint()) ReceivedByte = Endpoint_Read_8(); if (!(Endpoint_BytesInEndpoint())) - 16a2: 88 23 and r24, r24 - 16a4: 41 f4 brne .+16 ; 0x16b6 + 19e2: 88 23 and r24, r24 + 19e4: 41 f4 brne .+16 ; 0x19f6 */ static inline void Endpoint_ClearOUT(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_ClearOUT(void) { #if !defined(CONTROL_ONLY_DEVICE) UEINTX &= ~((1 << RXOUTI) | (1 << FIFOCON)); - 16a6: 80 91 e8 00 lds r24, 0x00E8 - 16aa: 8b 77 andi r24, 0x7B ; 123 - 16ac: 80 93 e8 00 sts 0x00E8, r24 - 16b0: 02 c0 rjmp .+4 ; 0x16b6 + 19e6: 80 91 e8 00 lds r24, 0x00E8 + 19ea: 8b 77 andi r24, 0x7B ; 123 + 19ec: 80 93 e8 00 sts 0x00E8, r24 + 19f0: 02 c0 rjmp .+4 ; 0x19f6 int16_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) return -1; int16_t ReceivedByte = -1; - 16b2: 2f ef ldi r18, 0xFF ; 255 - 16b4: 3f ef ldi r19, 0xFF ; 255 + 19f2: 2f ef ldi r18, 0xFF ; 255 + 19f4: 3f ef ldi r19, 0xFF ; 255 if (!(Endpoint_BytesInEndpoint())) Endpoint_ClearOUT(); } return ReceivedByte; } - 16b6: c9 01 movw r24, r18 - 16b8: 08 95 ret + 19f6: c9 01 movw r24, r18 + 19f8: 08 95 ret -000016ba : +000019fa : #endif void CDC_Device_Event_Stub(void) { } - 16ba: 08 95 ret - -000016bc <__subsf3>: - 16bc: 50 58 subi r21, 0x80 ; 128 - -000016be <__addsf3>: - 16be: bb 27 eor r27, r27 - 16c0: aa 27 eor r26, r26 - 16c2: 0e d0 rcall .+28 ; 0x16e0 <__addsf3x> - 16c4: 70 c1 rjmp .+736 ; 0x19a6 <__fp_round> - 16c6: 61 d1 rcall .+706 ; 0x198a <__fp_pscA> - 16c8: 30 f0 brcs .+12 ; 0x16d6 <__addsf3+0x18> - 16ca: 66 d1 rcall .+716 ; 0x1998 <__fp_pscB> - 16cc: 20 f0 brcs .+8 ; 0x16d6 <__addsf3+0x18> - 16ce: 31 f4 brne .+12 ; 0x16dc <__addsf3+0x1e> - 16d0: 9f 3f cpi r25, 0xFF ; 255 - 16d2: 11 f4 brne .+4 ; 0x16d8 <__addsf3+0x1a> - 16d4: 1e f4 brtc .+6 ; 0x16dc <__addsf3+0x1e> - 16d6: 56 c1 rjmp .+684 ; 0x1984 <__fp_nan> - 16d8: 0e f4 brtc .+2 ; 0x16dc <__addsf3+0x1e> - 16da: e0 95 com r30 - 16dc: e7 fb bst r30, 7 - 16de: 4c c1 rjmp .+664 ; 0x1978 <__fp_inf> - -000016e0 <__addsf3x>: - 16e0: e9 2f mov r30, r25 - 16e2: 72 d1 rcall .+740 ; 0x19c8 <__fp_split3> - 16e4: 80 f3 brcs .-32 ; 0x16c6 <__addsf3+0x8> - 16e6: ba 17 cp r27, r26 - 16e8: 62 07 cpc r22, r18 - 16ea: 73 07 cpc r23, r19 - 16ec: 84 07 cpc r24, r20 - 16ee: 95 07 cpc r25, r21 - 16f0: 18 f0 brcs .+6 ; 0x16f8 <__addsf3x+0x18> - 16f2: 71 f4 brne .+28 ; 0x1710 <__addsf3x+0x30> - 16f4: 9e f5 brtc .+102 ; 0x175c <__addsf3x+0x7c> - 16f6: 8a c1 rjmp .+788 ; 0x1a0c <__fp_zero> - 16f8: 0e f4 brtc .+2 ; 0x16fc <__addsf3x+0x1c> - 16fa: e0 95 com r30 - 16fc: 0b 2e mov r0, r27 - 16fe: ba 2f mov r27, r26 - 1700: a0 2d mov r26, r0 - 1702: 0b 01 movw r0, r22 - 1704: b9 01 movw r22, r18 - 1706: 90 01 movw r18, r0 - 1708: 0c 01 movw r0, r24 - 170a: ca 01 movw r24, r20 - 170c: a0 01 movw r20, r0 - 170e: 11 24 eor r1, r1 - 1710: ff 27 eor r31, r31 - 1712: 59 1b sub r21, r25 - 1714: 99 f0 breq .+38 ; 0x173c <__addsf3x+0x5c> - 1716: 59 3f cpi r21, 0xF9 ; 249 - 1718: 50 f4 brcc .+20 ; 0x172e <__addsf3x+0x4e> - 171a: 50 3e cpi r21, 0xE0 ; 224 - 171c: 68 f1 brcs .+90 ; 0x1778 <__addsf3x+0x98> - 171e: 1a 16 cp r1, r26 - 1720: f0 40 sbci r31, 0x00 ; 0 - 1722: a2 2f mov r26, r18 - 1724: 23 2f mov r18, r19 - 1726: 34 2f mov r19, r20 - 1728: 44 27 eor r20, r20 - 172a: 58 5f subi r21, 0xF8 ; 248 - 172c: f3 cf rjmp .-26 ; 0x1714 <__addsf3x+0x34> - 172e: 46 95 lsr r20 - 1730: 37 95 ror r19 - 1732: 27 95 ror r18 - 1734: a7 95 ror r26 - 1736: f0 40 sbci r31, 0x00 ; 0 - 1738: 53 95 inc r21 - 173a: c9 f7 brne .-14 ; 0x172e <__addsf3x+0x4e> - 173c: 7e f4 brtc .+30 ; 0x175c <__addsf3x+0x7c> - 173e: 1f 16 cp r1, r31 - 1740: ba 0b sbc r27, r26 - 1742: 62 0b sbc r22, r18 - 1744: 73 0b sbc r23, r19 - 1746: 84 0b sbc r24, r20 - 1748: ba f0 brmi .+46 ; 0x1778 <__addsf3x+0x98> - 174a: 91 50 subi r25, 0x01 ; 1 - 174c: a1 f0 breq .+40 ; 0x1776 <__addsf3x+0x96> - 174e: ff 0f add r31, r31 - 1750: bb 1f adc r27, r27 - 1752: 66 1f adc r22, r22 - 1754: 77 1f adc r23, r23 - 1756: 88 1f adc r24, r24 - 1758: c2 f7 brpl .-16 ; 0x174a <__addsf3x+0x6a> - 175a: 0e c0 rjmp .+28 ; 0x1778 <__addsf3x+0x98> - 175c: ba 0f add r27, r26 - 175e: 62 1f adc r22, r18 - 1760: 73 1f adc r23, r19 - 1762: 84 1f adc r24, r20 - 1764: 48 f4 brcc .+18 ; 0x1778 <__addsf3x+0x98> - 1766: 87 95 ror r24 - 1768: 77 95 ror r23 - 176a: 67 95 ror r22 - 176c: b7 95 ror r27 - 176e: f7 95 ror r31 - 1770: 9e 3f cpi r25, 0xFE ; 254 - 1772: 08 f0 brcs .+2 ; 0x1776 <__addsf3x+0x96> - 1774: b3 cf rjmp .-154 ; 0x16dc <__addsf3+0x1e> - 1776: 93 95 inc r25 - 1778: 88 0f add r24, r24 - 177a: 08 f0 brcs .+2 ; 0x177e <__addsf3x+0x9e> - 177c: 99 27 eor r25, r25 - 177e: ee 0f add r30, r30 - 1780: 97 95 ror r25 - 1782: 87 95 ror r24 - 1784: 08 95 ret - -00001786 <__cmpsf2>: - 1786: d4 d0 rcall .+424 ; 0x1930 <__fp_cmp> - 1788: 08 f4 brcc .+2 ; 0x178c <__cmpsf2+0x6> - 178a: 81 e0 ldi r24, 0x01 ; 1 - 178c: 08 95 ret - -0000178e <__divsf3>: - 178e: 0c d0 rcall .+24 ; 0x17a8 <__divsf3x> - 1790: 0a c1 rjmp .+532 ; 0x19a6 <__fp_round> - 1792: 02 d1 rcall .+516 ; 0x1998 <__fp_pscB> - 1794: 40 f0 brcs .+16 ; 0x17a6 <__divsf3+0x18> - 1796: f9 d0 rcall .+498 ; 0x198a <__fp_pscA> - 1798: 30 f0 brcs .+12 ; 0x17a6 <__divsf3+0x18> - 179a: 21 f4 brne .+8 ; 0x17a4 <__divsf3+0x16> - 179c: 5f 3f cpi r21, 0xFF ; 255 - 179e: 19 f0 breq .+6 ; 0x17a6 <__divsf3+0x18> - 17a0: eb c0 rjmp .+470 ; 0x1978 <__fp_inf> - 17a2: 51 11 cpse r21, r1 - 17a4: 34 c1 rjmp .+616 ; 0x1a0e <__fp_szero> - 17a6: ee c0 rjmp .+476 ; 0x1984 <__fp_nan> - -000017a8 <__divsf3x>: - 17a8: 0f d1 rcall .+542 ; 0x19c8 <__fp_split3> - 17aa: 98 f3 brcs .-26 ; 0x1792 <__divsf3+0x4> - -000017ac <__divsf3_pse>: - 17ac: 99 23 and r25, r25 - 17ae: c9 f3 breq .-14 ; 0x17a2 <__divsf3+0x14> - 17b0: 55 23 and r21, r21 - 17b2: b1 f3 breq .-20 ; 0x17a0 <__divsf3+0x12> - 17b4: 95 1b sub r25, r21 - 17b6: 55 0b sbc r21, r21 - 17b8: bb 27 eor r27, r27 - 17ba: aa 27 eor r26, r26 - 17bc: 62 17 cp r22, r18 - 17be: 73 07 cpc r23, r19 - 17c0: 84 07 cpc r24, r20 - 17c2: 38 f0 brcs .+14 ; 0x17d2 <__divsf3_pse+0x26> - 17c4: 9f 5f subi r25, 0xFF ; 255 - 17c6: 5f 4f sbci r21, 0xFF ; 255 - 17c8: 22 0f add r18, r18 - 17ca: 33 1f adc r19, r19 - 17cc: 44 1f adc r20, r20 - 17ce: aa 1f adc r26, r26 - 17d0: a9 f3 breq .-22 ; 0x17bc <__divsf3_pse+0x10> - 17d2: 33 d0 rcall .+102 ; 0x183a <__divsf3_pse+0x8e> - 17d4: 0e 2e mov r0, r30 - 17d6: 3a f0 brmi .+14 ; 0x17e6 <__divsf3_pse+0x3a> - 17d8: e0 e8 ldi r30, 0x80 ; 128 - 17da: 30 d0 rcall .+96 ; 0x183c <__divsf3_pse+0x90> - 17dc: 91 50 subi r25, 0x01 ; 1 - 17de: 50 40 sbci r21, 0x00 ; 0 - 17e0: e6 95 lsr r30 - 17e2: 00 1c adc r0, r0 - 17e4: ca f7 brpl .-14 ; 0x17d8 <__divsf3_pse+0x2c> - 17e6: 29 d0 rcall .+82 ; 0x183a <__divsf3_pse+0x8e> - 17e8: fe 2f mov r31, r30 - 17ea: 27 d0 rcall .+78 ; 0x183a <__divsf3_pse+0x8e> - 17ec: 66 0f add r22, r22 - 17ee: 77 1f adc r23, r23 - 17f0: 88 1f adc r24, r24 - 17f2: bb 1f adc r27, r27 - 17f4: 26 17 cp r18, r22 - 17f6: 37 07 cpc r19, r23 - 17f8: 48 07 cpc r20, r24 - 17fa: ab 07 cpc r26, r27 - 17fc: b0 e8 ldi r27, 0x80 ; 128 - 17fe: 09 f0 breq .+2 ; 0x1802 <__divsf3_pse+0x56> - 1800: bb 0b sbc r27, r27 - 1802: 80 2d mov r24, r0 - 1804: bf 01 movw r22, r30 - 1806: ff 27 eor r31, r31 - 1808: 93 58 subi r25, 0x83 ; 131 - 180a: 5f 4f sbci r21, 0xFF ; 255 - 180c: 2a f0 brmi .+10 ; 0x1818 <__divsf3_pse+0x6c> - 180e: 9e 3f cpi r25, 0xFE ; 254 - 1810: 51 05 cpc r21, r1 - 1812: 68 f0 brcs .+26 ; 0x182e <__divsf3_pse+0x82> - 1814: b1 c0 rjmp .+354 ; 0x1978 <__fp_inf> - 1816: fb c0 rjmp .+502 ; 0x1a0e <__fp_szero> - 1818: 5f 3f cpi r21, 0xFF ; 255 - 181a: ec f3 brlt .-6 ; 0x1816 <__divsf3_pse+0x6a> - 181c: 98 3e cpi r25, 0xE8 ; 232 - 181e: dc f3 brlt .-10 ; 0x1816 <__divsf3_pse+0x6a> - 1820: 86 95 lsr r24 - 1822: 77 95 ror r23 - 1824: 67 95 ror r22 - 1826: b7 95 ror r27 - 1828: f7 95 ror r31 - 182a: 9f 5f subi r25, 0xFF ; 255 - 182c: c9 f7 brne .-14 ; 0x1820 <__divsf3_pse+0x74> - 182e: 88 0f add r24, r24 - 1830: 91 1d adc r25, r1 - 1832: 96 95 lsr r25 - 1834: 87 95 ror r24 - 1836: 97 f9 bld r25, 7 - 1838: 08 95 ret - 183a: e1 e0 ldi r30, 0x01 ; 1 - 183c: 66 0f add r22, r22 - 183e: 77 1f adc r23, r23 - 1840: 88 1f adc r24, r24 - 1842: bb 1f adc r27, r27 - 1844: 62 17 cp r22, r18 - 1846: 73 07 cpc r23, r19 - 1848: 84 07 cpc r24, r20 - 184a: ba 07 cpc r27, r26 - 184c: 20 f0 brcs .+8 ; 0x1856 <__divsf3_pse+0xaa> - 184e: 62 1b sub r22, r18 - 1850: 73 0b sbc r23, r19 - 1852: 84 0b sbc r24, r20 - 1854: ba 0b sbc r27, r26 - 1856: ee 1f adc r30, r30 - 1858: 88 f7 brcc .-30 ; 0x183c <__divsf3_pse+0x90> - 185a: e0 95 com r30 - 185c: 08 95 ret - -0000185e <__fixunssfsi>: - 185e: bc d0 rcall .+376 ; 0x19d8 <__fp_splitA> - 1860: 88 f0 brcs .+34 ; 0x1884 <__fixunssfsi+0x26> - 1862: 9f 57 subi r25, 0x7F ; 127 - 1864: 90 f0 brcs .+36 ; 0x188a <__fixunssfsi+0x2c> - 1866: b9 2f mov r27, r25 - 1868: 99 27 eor r25, r25 - 186a: b7 51 subi r27, 0x17 ; 23 - 186c: a0 f0 brcs .+40 ; 0x1896 <__fixunssfsi+0x38> - 186e: d1 f0 breq .+52 ; 0x18a4 <__fixunssfsi+0x46> - 1870: 66 0f add r22, r22 - 1872: 77 1f adc r23, r23 - 1874: 88 1f adc r24, r24 - 1876: 99 1f adc r25, r25 - 1878: 1a f0 brmi .+6 ; 0x1880 <__fixunssfsi+0x22> - 187a: ba 95 dec r27 - 187c: c9 f7 brne .-14 ; 0x1870 <__fixunssfsi+0x12> - 187e: 12 c0 rjmp .+36 ; 0x18a4 <__fixunssfsi+0x46> - 1880: b1 30 cpi r27, 0x01 ; 1 - 1882: 81 f0 breq .+32 ; 0x18a4 <__fixunssfsi+0x46> - 1884: c3 d0 rcall .+390 ; 0x1a0c <__fp_zero> - 1886: b1 e0 ldi r27, 0x01 ; 1 - 1888: 08 95 ret - 188a: c0 c0 rjmp .+384 ; 0x1a0c <__fp_zero> - 188c: 67 2f mov r22, r23 - 188e: 78 2f mov r23, r24 - 1890: 88 27 eor r24, r24 - 1892: b8 5f subi r27, 0xF8 ; 248 - 1894: 39 f0 breq .+14 ; 0x18a4 <__fixunssfsi+0x46> - 1896: b9 3f cpi r27, 0xF9 ; 249 - 1898: cc f3 brlt .-14 ; 0x188c <__fixunssfsi+0x2e> - 189a: 86 95 lsr r24 - 189c: 77 95 ror r23 - 189e: 67 95 ror r22 - 18a0: b3 95 inc r27 - 18a2: d9 f7 brne .-10 ; 0x189a <__fixunssfsi+0x3c> - 18a4: 3e f4 brtc .+14 ; 0x18b4 <__fixunssfsi+0x56> - 18a6: 90 95 com r25 - 18a8: 80 95 com r24 - 18aa: 70 95 com r23 - 18ac: 61 95 neg r22 - 18ae: 7f 4f sbci r23, 0xFF ; 255 - 18b0: 8f 4f sbci r24, 0xFF ; 255 - 18b2: 9f 4f sbci r25, 0xFF ; 255 - 18b4: 08 95 ret - -000018b6 <__floatunsisf>: - 18b6: e8 94 clt - 18b8: 09 c0 rjmp .+18 ; 0x18cc <__floatsisf+0x12> - -000018ba <__floatsisf>: - 18ba: 97 fb bst r25, 7 - 18bc: 3e f4 brtc .+14 ; 0x18cc <__floatsisf+0x12> - 18be: 90 95 com r25 - 18c0: 80 95 com r24 - 18c2: 70 95 com r23 - 18c4: 61 95 neg r22 - 18c6: 7f 4f sbci r23, 0xFF ; 255 - 18c8: 8f 4f sbci r24, 0xFF ; 255 - 18ca: 9f 4f sbci r25, 0xFF ; 255 - 18cc: 99 23 and r25, r25 - 18ce: a9 f0 breq .+42 ; 0x18fa <__floatsisf+0x40> - 18d0: f9 2f mov r31, r25 - 18d2: 96 e9 ldi r25, 0x96 ; 150 - 18d4: bb 27 eor r27, r27 - 18d6: 93 95 inc r25 - 18d8: f6 95 lsr r31 - 18da: 87 95 ror r24 - 18dc: 77 95 ror r23 - 18de: 67 95 ror r22 - 18e0: b7 95 ror r27 - 18e2: f1 11 cpse r31, r1 - 18e4: f8 cf rjmp .-16 ; 0x18d6 <__floatsisf+0x1c> - 18e6: fa f4 brpl .+62 ; 0x1926 <__floatsisf+0x6c> - 18e8: bb 0f add r27, r27 - 18ea: 11 f4 brne .+4 ; 0x18f0 <__floatsisf+0x36> - 18ec: 60 ff sbrs r22, 0 - 18ee: 1b c0 rjmp .+54 ; 0x1926 <__floatsisf+0x6c> - 18f0: 6f 5f subi r22, 0xFF ; 255 - 18f2: 7f 4f sbci r23, 0xFF ; 255 - 18f4: 8f 4f sbci r24, 0xFF ; 255 - 18f6: 9f 4f sbci r25, 0xFF ; 255 - 18f8: 16 c0 rjmp .+44 ; 0x1926 <__floatsisf+0x6c> - 18fa: 88 23 and r24, r24 - 18fc: 11 f0 breq .+4 ; 0x1902 <__floatsisf+0x48> - 18fe: 96 e9 ldi r25, 0x96 ; 150 - 1900: 11 c0 rjmp .+34 ; 0x1924 <__floatsisf+0x6a> - 1902: 77 23 and r23, r23 - 1904: 21 f0 breq .+8 ; 0x190e <__floatsisf+0x54> - 1906: 9e e8 ldi r25, 0x8E ; 142 - 1908: 87 2f mov r24, r23 - 190a: 76 2f mov r23, r22 - 190c: 05 c0 rjmp .+10 ; 0x1918 <__floatsisf+0x5e> - 190e: 66 23 and r22, r22 - 1910: 71 f0 breq .+28 ; 0x192e <__floatsisf+0x74> - 1912: 96 e8 ldi r25, 0x86 ; 134 - 1914: 86 2f mov r24, r22 - 1916: 70 e0 ldi r23, 0x00 ; 0 - 1918: 60 e0 ldi r22, 0x00 ; 0 - 191a: 2a f0 brmi .+10 ; 0x1926 <__floatsisf+0x6c> - 191c: 9a 95 dec r25 - 191e: 66 0f add r22, r22 - 1920: 77 1f adc r23, r23 - 1922: 88 1f adc r24, r24 - 1924: da f7 brpl .-10 ; 0x191c <__floatsisf+0x62> - 1926: 88 0f add r24, r24 - 1928: 96 95 lsr r25 - 192a: 87 95 ror r24 - 192c: 97 f9 bld r25, 7 - 192e: 08 95 ret - -00001930 <__fp_cmp>: - 1930: 99 0f add r25, r25 - 1932: 00 08 sbc r0, r0 - 1934: 55 0f add r21, r21 - 1936: aa 0b sbc r26, r26 - 1938: e0 e8 ldi r30, 0x80 ; 128 - 193a: fe ef ldi r31, 0xFE ; 254 - 193c: 16 16 cp r1, r22 - 193e: 17 06 cpc r1, r23 - 1940: e8 07 cpc r30, r24 - 1942: f9 07 cpc r31, r25 - 1944: c0 f0 brcs .+48 ; 0x1976 <__fp_cmp+0x46> - 1946: 12 16 cp r1, r18 - 1948: 13 06 cpc r1, r19 - 194a: e4 07 cpc r30, r20 - 194c: f5 07 cpc r31, r21 - 194e: 98 f0 brcs .+38 ; 0x1976 <__fp_cmp+0x46> - 1950: 62 1b sub r22, r18 - 1952: 73 0b sbc r23, r19 - 1954: 84 0b sbc r24, r20 - 1956: 95 0b sbc r25, r21 - 1958: 39 f4 brne .+14 ; 0x1968 <__fp_cmp+0x38> - 195a: 0a 26 eor r0, r26 - 195c: 61 f0 breq .+24 ; 0x1976 <__fp_cmp+0x46> - 195e: 23 2b or r18, r19 - 1960: 24 2b or r18, r20 - 1962: 25 2b or r18, r21 - 1964: 21 f4 brne .+8 ; 0x196e <__fp_cmp+0x3e> - 1966: 08 95 ret - 1968: 0a 26 eor r0, r26 - 196a: 09 f4 brne .+2 ; 0x196e <__fp_cmp+0x3e> - 196c: a1 40 sbci r26, 0x01 ; 1 - 196e: a6 95 lsr r26 - 1970: 8f ef ldi r24, 0xFF ; 255 - 1972: 81 1d adc r24, r1 - 1974: 81 1d adc r24, r1 - 1976: 08 95 ret - -00001978 <__fp_inf>: - 1978: 97 f9 bld r25, 7 - 197a: 9f 67 ori r25, 0x7F ; 127 - 197c: 80 e8 ldi r24, 0x80 ; 128 - 197e: 70 e0 ldi r23, 0x00 ; 0 - 1980: 60 e0 ldi r22, 0x00 ; 0 - 1982: 08 95 ret - -00001984 <__fp_nan>: - 1984: 9f ef ldi r25, 0xFF ; 255 - 1986: 80 ec ldi r24, 0xC0 ; 192 - 1988: 08 95 ret - -0000198a <__fp_pscA>: - 198a: 00 24 eor r0, r0 - 198c: 0a 94 dec r0 - 198e: 16 16 cp r1, r22 - 1990: 17 06 cpc r1, r23 - 1992: 18 06 cpc r1, r24 - 1994: 09 06 cpc r0, r25 - 1996: 08 95 ret - -00001998 <__fp_pscB>: - 1998: 00 24 eor r0, r0 - 199a: 0a 94 dec r0 - 199c: 12 16 cp r1, r18 - 199e: 13 06 cpc r1, r19 - 19a0: 14 06 cpc r1, r20 - 19a2: 05 06 cpc r0, r21 - 19a4: 08 95 ret - -000019a6 <__fp_round>: - 19a6: 09 2e mov r0, r25 - 19a8: 03 94 inc r0 - 19aa: 00 0c add r0, r0 - 19ac: 11 f4 brne .+4 ; 0x19b2 <__fp_round+0xc> - 19ae: 88 23 and r24, r24 - 19b0: 52 f0 brmi .+20 ; 0x19c6 <__fp_round+0x20> - 19b2: bb 0f add r27, r27 - 19b4: 40 f4 brcc .+16 ; 0x19c6 <__fp_round+0x20> - 19b6: bf 2b or r27, r31 - 19b8: 11 f4 brne .+4 ; 0x19be <__fp_round+0x18> - 19ba: 60 ff sbrs r22, 0 - 19bc: 04 c0 rjmp .+8 ; 0x19c6 <__fp_round+0x20> - 19be: 6f 5f subi r22, 0xFF ; 255 - 19c0: 7f 4f sbci r23, 0xFF ; 255 - 19c2: 8f 4f sbci r24, 0xFF ; 255 - 19c4: 9f 4f sbci r25, 0xFF ; 255 - 19c6: 08 95 ret - -000019c8 <__fp_split3>: - 19c8: 57 fd sbrc r21, 7 - 19ca: 90 58 subi r25, 0x80 ; 128 - 19cc: 44 0f add r20, r20 - 19ce: 55 1f adc r21, r21 - 19d0: 59 f0 breq .+22 ; 0x19e8 <__fp_splitA+0x10> - 19d2: 5f 3f cpi r21, 0xFF ; 255 - 19d4: 71 f0 breq .+28 ; 0x19f2 <__fp_splitA+0x1a> - 19d6: 47 95 ror r20 - -000019d8 <__fp_splitA>: - 19d8: 88 0f add r24, r24 - 19da: 97 fb bst r25, 7 - 19dc: 99 1f adc r25, r25 - 19de: 61 f0 breq .+24 ; 0x19f8 <__fp_splitA+0x20> - 19e0: 9f 3f cpi r25, 0xFF ; 255 - 19e2: 79 f0 breq .+30 ; 0x1a02 <__fp_splitA+0x2a> - 19e4: 87 95 ror r24 - 19e6: 08 95 ret - 19e8: 12 16 cp r1, r18 - 19ea: 13 06 cpc r1, r19 - 19ec: 14 06 cpc r1, r20 - 19ee: 55 1f adc r21, r21 - 19f0: f2 cf rjmp .-28 ; 0x19d6 <__fp_split3+0xe> - 19f2: 46 95 lsr r20 - 19f4: f1 df rcall .-30 ; 0x19d8 <__fp_splitA> - 19f6: 08 c0 rjmp .+16 ; 0x1a08 <__fp_splitA+0x30> - 19f8: 16 16 cp r1, r22 - 19fa: 17 06 cpc r1, r23 - 19fc: 18 06 cpc r1, r24 - 19fe: 99 1f adc r25, r25 - 1a00: f1 cf rjmp .-30 ; 0x19e4 <__fp_splitA+0xc> - 1a02: 86 95 lsr r24 - 1a04: 71 05 cpc r23, r1 - 1a06: 61 05 cpc r22, r1 - 1a08: 08 94 sec - 1a0a: 08 95 ret - -00001a0c <__fp_zero>: - 1a0c: e8 94 clt - -00001a0e <__fp_szero>: - 1a0e: bb 27 eor r27, r27 - 1a10: 66 27 eor r22, r22 - 1a12: 77 27 eor r23, r23 - 1a14: cb 01 movw r24, r22 - 1a16: 97 f9 bld r25, 7 - 1a18: 08 95 ret - -00001a1a <__gesf2>: - 1a1a: 8a df rcall .-236 ; 0x1930 <__fp_cmp> - 1a1c: 08 f4 brcc .+2 ; 0x1a20 <__gesf2+0x6> - 1a1e: 8f ef ldi r24, 0xFF ; 255 - 1a20: 08 95 ret - -00001a22 <__udivmodhi4>: - 1a22: aa 1b sub r26, r26 - 1a24: bb 1b sub r27, r27 - 1a26: 51 e1 ldi r21, 0x11 ; 17 - 1a28: 07 c0 rjmp .+14 ; 0x1a38 <__udivmodhi4_ep> - -00001a2a <__udivmodhi4_loop>: - 1a2a: aa 1f adc r26, r26 - 1a2c: bb 1f adc r27, r27 - 1a2e: a6 17 cp r26, r22 - 1a30: b7 07 cpc r27, r23 - 1a32: 10 f0 brcs .+4 ; 0x1a38 <__udivmodhi4_ep> - 1a34: a6 1b sub r26, r22 - 1a36: b7 0b sbc r27, r23 - -00001a38 <__udivmodhi4_ep>: - 1a38: 88 1f adc r24, r24 - 1a3a: 99 1f adc r25, r25 - 1a3c: 5a 95 dec r21 - 1a3e: a9 f7 brne .-22 ; 0x1a2a <__udivmodhi4_loop> - 1a40: 80 95 com r24 - 1a42: 90 95 com r25 - 1a44: bc 01 movw r22, r24 - 1a46: cd 01 movw r24, r26 - 1a48: 08 95 ret - -00001a4a <__divmodhi4>: - 1a4a: 97 fb bst r25, 7 - 1a4c: 09 2e mov r0, r25 - 1a4e: 07 26 eor r0, r23 - 1a50: 0a d0 rcall .+20 ; 0x1a66 <__divmodhi4_neg1> - 1a52: 77 fd sbrc r23, 7 - 1a54: 04 d0 rcall .+8 ; 0x1a5e <__divmodhi4_neg2> - 1a56: e5 df rcall .-54 ; 0x1a22 <__udivmodhi4> - 1a58: 06 d0 rcall .+12 ; 0x1a66 <__divmodhi4_neg1> - 1a5a: 00 20 and r0, r0 - 1a5c: 1a f4 brpl .+6 ; 0x1a64 <__divmodhi4_exit> - -00001a5e <__divmodhi4_neg2>: - 1a5e: 70 95 com r23 - 1a60: 61 95 neg r22 - 1a62: 7f 4f sbci r23, 0xFF ; 255 - -00001a64 <__divmodhi4_exit>: - 1a64: 08 95 ret - -00001a66 <__divmodhi4_neg1>: - 1a66: f6 f7 brtc .-4 ; 0x1a64 <__divmodhi4_exit> - 1a68: 90 95 com r25 - 1a6a: 81 95 neg r24 - 1a6c: 9f 4f sbci r25, 0xFF ; 255 - 1a6e: 08 95 ret - -00001a70 <__udivmodsi4>: - 1a70: a1 e2 ldi r26, 0x21 ; 33 - 1a72: 1a 2e mov r1, r26 - 1a74: aa 1b sub r26, r26 - 1a76: bb 1b sub r27, r27 - 1a78: fd 01 movw r30, r26 - 1a7a: 0d c0 rjmp .+26 ; 0x1a96 <__udivmodsi4_ep> - -00001a7c <__udivmodsi4_loop>: - 1a7c: aa 1f adc r26, r26 - 1a7e: bb 1f adc r27, r27 - 1a80: ee 1f adc r30, r30 - 1a82: ff 1f adc r31, r31 - 1a84: a2 17 cp r26, r18 - 1a86: b3 07 cpc r27, r19 - 1a88: e4 07 cpc r30, r20 - 1a8a: f5 07 cpc r31, r21 - 1a8c: 20 f0 brcs .+8 ; 0x1a96 <__udivmodsi4_ep> - 1a8e: a2 1b sub r26, r18 - 1a90: b3 0b sbc r27, r19 - 1a92: e4 0b sbc r30, r20 - 1a94: f5 0b sbc r31, r21 - -00001a96 <__udivmodsi4_ep>: - 1a96: 66 1f adc r22, r22 - 1a98: 77 1f adc r23, r23 - 1a9a: 88 1f adc r24, r24 - 1a9c: 99 1f adc r25, r25 - 1a9e: 1a 94 dec r1 - 1aa0: 69 f7 brne .-38 ; 0x1a7c <__udivmodsi4_loop> - 1aa2: 60 95 com r22 - 1aa4: 70 95 com r23 - 1aa6: 80 95 com r24 - 1aa8: 90 95 com r25 - 1aaa: 9b 01 movw r18, r22 - 1aac: ac 01 movw r20, r24 - 1aae: bd 01 movw r22, r26 - 1ab0: cf 01 movw r24, r30 - 1ab2: 08 95 ret - -00001ab4 <_exit>: - 1ab4: f8 94 cli - -00001ab6 <__stop_program>: - 1ab6: ff cf rjmp .-2 ; 0x1ab6 <__stop_program> + 19fa: 08 95 ret + +000019fc <__subsf3>: + 19fc: 50 58 subi r21, 0x80 ; 128 + +000019fe <__addsf3>: + 19fe: bb 27 eor r27, r27 + 1a00: aa 27 eor r26, r26 + 1a02: 0e d0 rcall .+28 ; 0x1a20 <__addsf3x> + 1a04: 70 c1 rjmp .+736 ; 0x1ce6 <__fp_round> + 1a06: 61 d1 rcall .+706 ; 0x1cca <__fp_pscA> + 1a08: 30 f0 brcs .+12 ; 0x1a16 <__addsf3+0x18> + 1a0a: 66 d1 rcall .+716 ; 0x1cd8 <__fp_pscB> + 1a0c: 20 f0 brcs .+8 ; 0x1a16 <__addsf3+0x18> + 1a0e: 31 f4 brne .+12 ; 0x1a1c <__addsf3+0x1e> + 1a10: 9f 3f cpi r25, 0xFF ; 255 + 1a12: 11 f4 brne .+4 ; 0x1a18 <__addsf3+0x1a> + 1a14: 1e f4 brtc .+6 ; 0x1a1c <__addsf3+0x1e> + 1a16: 56 c1 rjmp .+684 ; 0x1cc4 <__fp_nan> + 1a18: 0e f4 brtc .+2 ; 0x1a1c <__addsf3+0x1e> + 1a1a: e0 95 com r30 + 1a1c: e7 fb bst r30, 7 + 1a1e: 4c c1 rjmp .+664 ; 0x1cb8 <__fp_inf> + +00001a20 <__addsf3x>: + 1a20: e9 2f mov r30, r25 + 1a22: 72 d1 rcall .+740 ; 0x1d08 <__fp_split3> + 1a24: 80 f3 brcs .-32 ; 0x1a06 <__addsf3+0x8> + 1a26: ba 17 cp r27, r26 + 1a28: 62 07 cpc r22, r18 + 1a2a: 73 07 cpc r23, r19 + 1a2c: 84 07 cpc r24, r20 + 1a2e: 95 07 cpc r25, r21 + 1a30: 18 f0 brcs .+6 ; 0x1a38 <__addsf3x+0x18> + 1a32: 71 f4 brne .+28 ; 0x1a50 <__addsf3x+0x30> + 1a34: 9e f5 brtc .+102 ; 0x1a9c <__addsf3x+0x7c> + 1a36: 8a c1 rjmp .+788 ; 0x1d4c <__fp_zero> + 1a38: 0e f4 brtc .+2 ; 0x1a3c <__addsf3x+0x1c> + 1a3a: e0 95 com r30 + 1a3c: 0b 2e mov r0, r27 + 1a3e: ba 2f mov r27, r26 + 1a40: a0 2d mov r26, r0 + 1a42: 0b 01 movw r0, r22 + 1a44: b9 01 movw r22, r18 + 1a46: 90 01 movw r18, r0 + 1a48: 0c 01 movw r0, r24 + 1a4a: ca 01 movw r24, r20 + 1a4c: a0 01 movw r20, r0 + 1a4e: 11 24 eor r1, r1 + 1a50: ff 27 eor r31, r31 + 1a52: 59 1b sub r21, r25 + 1a54: 99 f0 breq .+38 ; 0x1a7c <__addsf3x+0x5c> + 1a56: 59 3f cpi r21, 0xF9 ; 249 + 1a58: 50 f4 brcc .+20 ; 0x1a6e <__addsf3x+0x4e> + 1a5a: 50 3e cpi r21, 0xE0 ; 224 + 1a5c: 68 f1 brcs .+90 ; 0x1ab8 <__addsf3x+0x98> + 1a5e: 1a 16 cp r1, r26 + 1a60: f0 40 sbci r31, 0x00 ; 0 + 1a62: a2 2f mov r26, r18 + 1a64: 23 2f mov r18, r19 + 1a66: 34 2f mov r19, r20 + 1a68: 44 27 eor r20, r20 + 1a6a: 58 5f subi r21, 0xF8 ; 248 + 1a6c: f3 cf rjmp .-26 ; 0x1a54 <__addsf3x+0x34> + 1a6e: 46 95 lsr r20 + 1a70: 37 95 ror r19 + 1a72: 27 95 ror r18 + 1a74: a7 95 ror r26 + 1a76: f0 40 sbci r31, 0x00 ; 0 + 1a78: 53 95 inc r21 + 1a7a: c9 f7 brne .-14 ; 0x1a6e <__addsf3x+0x4e> + 1a7c: 7e f4 brtc .+30 ; 0x1a9c <__addsf3x+0x7c> + 1a7e: 1f 16 cp r1, r31 + 1a80: ba 0b sbc r27, r26 + 1a82: 62 0b sbc r22, r18 + 1a84: 73 0b sbc r23, r19 + 1a86: 84 0b sbc r24, r20 + 1a88: ba f0 brmi .+46 ; 0x1ab8 <__addsf3x+0x98> + 1a8a: 91 50 subi r25, 0x01 ; 1 + 1a8c: a1 f0 breq .+40 ; 0x1ab6 <__addsf3x+0x96> + 1a8e: ff 0f add r31, r31 + 1a90: bb 1f adc r27, r27 + 1a92: 66 1f adc r22, r22 + 1a94: 77 1f adc r23, r23 + 1a96: 88 1f adc r24, r24 + 1a98: c2 f7 brpl .-16 ; 0x1a8a <__addsf3x+0x6a> + 1a9a: 0e c0 rjmp .+28 ; 0x1ab8 <__addsf3x+0x98> + 1a9c: ba 0f add r27, r26 + 1a9e: 62 1f adc r22, r18 + 1aa0: 73 1f adc r23, r19 + 1aa2: 84 1f adc r24, r20 + 1aa4: 48 f4 brcc .+18 ; 0x1ab8 <__addsf3x+0x98> + 1aa6: 87 95 ror r24 + 1aa8: 77 95 ror r23 + 1aaa: 67 95 ror r22 + 1aac: b7 95 ror r27 + 1aae: f7 95 ror r31 + 1ab0: 9e 3f cpi r25, 0xFE ; 254 + 1ab2: 08 f0 brcs .+2 ; 0x1ab6 <__addsf3x+0x96> + 1ab4: b3 cf rjmp .-154 ; 0x1a1c <__addsf3+0x1e> + 1ab6: 93 95 inc r25 + 1ab8: 88 0f add r24, r24 + 1aba: 08 f0 brcs .+2 ; 0x1abe <__addsf3x+0x9e> + 1abc: 99 27 eor r25, r25 + 1abe: ee 0f add r30, r30 + 1ac0: 97 95 ror r25 + 1ac2: 87 95 ror r24 + 1ac4: 08 95 ret + +00001ac6 <__cmpsf2>: + 1ac6: d4 d0 rcall .+424 ; 0x1c70 <__fp_cmp> + 1ac8: 08 f4 brcc .+2 ; 0x1acc <__cmpsf2+0x6> + 1aca: 81 e0 ldi r24, 0x01 ; 1 + 1acc: 08 95 ret + +00001ace <__divsf3>: + 1ace: 0c d0 rcall .+24 ; 0x1ae8 <__divsf3x> + 1ad0: 0a c1 rjmp .+532 ; 0x1ce6 <__fp_round> + 1ad2: 02 d1 rcall .+516 ; 0x1cd8 <__fp_pscB> + 1ad4: 40 f0 brcs .+16 ; 0x1ae6 <__divsf3+0x18> + 1ad6: f9 d0 rcall .+498 ; 0x1cca <__fp_pscA> + 1ad8: 30 f0 brcs .+12 ; 0x1ae6 <__divsf3+0x18> + 1ada: 21 f4 brne .+8 ; 0x1ae4 <__divsf3+0x16> + 1adc: 5f 3f cpi r21, 0xFF ; 255 + 1ade: 19 f0 breq .+6 ; 0x1ae6 <__divsf3+0x18> + 1ae0: eb c0 rjmp .+470 ; 0x1cb8 <__fp_inf> + 1ae2: 51 11 cpse r21, r1 + 1ae4: 34 c1 rjmp .+616 ; 0x1d4e <__fp_szero> + 1ae6: ee c0 rjmp .+476 ; 0x1cc4 <__fp_nan> + +00001ae8 <__divsf3x>: + 1ae8: 0f d1 rcall .+542 ; 0x1d08 <__fp_split3> + 1aea: 98 f3 brcs .-26 ; 0x1ad2 <__divsf3+0x4> + +00001aec <__divsf3_pse>: + 1aec: 99 23 and r25, r25 + 1aee: c9 f3 breq .-14 ; 0x1ae2 <__divsf3+0x14> + 1af0: 55 23 and r21, r21 + 1af2: b1 f3 breq .-20 ; 0x1ae0 <__divsf3+0x12> + 1af4: 95 1b sub r25, r21 + 1af6: 55 0b sbc r21, r21 + 1af8: bb 27 eor r27, r27 + 1afa: aa 27 eor r26, r26 + 1afc: 62 17 cp r22, r18 + 1afe: 73 07 cpc r23, r19 + 1b00: 84 07 cpc r24, r20 + 1b02: 38 f0 brcs .+14 ; 0x1b12 <__divsf3_pse+0x26> + 1b04: 9f 5f subi r25, 0xFF ; 255 + 1b06: 5f 4f sbci r21, 0xFF ; 255 + 1b08: 22 0f add r18, r18 + 1b0a: 33 1f adc r19, r19 + 1b0c: 44 1f adc r20, r20 + 1b0e: aa 1f adc r26, r26 + 1b10: a9 f3 breq .-22 ; 0x1afc <__divsf3_pse+0x10> + 1b12: 33 d0 rcall .+102 ; 0x1b7a <__divsf3_pse+0x8e> + 1b14: 0e 2e mov r0, r30 + 1b16: 3a f0 brmi .+14 ; 0x1b26 <__divsf3_pse+0x3a> + 1b18: e0 e8 ldi r30, 0x80 ; 128 + 1b1a: 30 d0 rcall .+96 ; 0x1b7c <__divsf3_pse+0x90> + 1b1c: 91 50 subi r25, 0x01 ; 1 + 1b1e: 50 40 sbci r21, 0x00 ; 0 + 1b20: e6 95 lsr r30 + 1b22: 00 1c adc r0, r0 + 1b24: ca f7 brpl .-14 ; 0x1b18 <__divsf3_pse+0x2c> + 1b26: 29 d0 rcall .+82 ; 0x1b7a <__divsf3_pse+0x8e> + 1b28: fe 2f mov r31, r30 + 1b2a: 27 d0 rcall .+78 ; 0x1b7a <__divsf3_pse+0x8e> + 1b2c: 66 0f add r22, r22 + 1b2e: 77 1f adc r23, r23 + 1b30: 88 1f adc r24, r24 + 1b32: bb 1f adc r27, r27 + 1b34: 26 17 cp r18, r22 + 1b36: 37 07 cpc r19, r23 + 1b38: 48 07 cpc r20, r24 + 1b3a: ab 07 cpc r26, r27 + 1b3c: b0 e8 ldi r27, 0x80 ; 128 + 1b3e: 09 f0 breq .+2 ; 0x1b42 <__divsf3_pse+0x56> + 1b40: bb 0b sbc r27, r27 + 1b42: 80 2d mov r24, r0 + 1b44: bf 01 movw r22, r30 + 1b46: ff 27 eor r31, r31 + 1b48: 93 58 subi r25, 0x83 ; 131 + 1b4a: 5f 4f sbci r21, 0xFF ; 255 + 1b4c: 2a f0 brmi .+10 ; 0x1b58 <__divsf3_pse+0x6c> + 1b4e: 9e 3f cpi r25, 0xFE ; 254 + 1b50: 51 05 cpc r21, r1 + 1b52: 68 f0 brcs .+26 ; 0x1b6e <__divsf3_pse+0x82> + 1b54: b1 c0 rjmp .+354 ; 0x1cb8 <__fp_inf> + 1b56: fb c0 rjmp .+502 ; 0x1d4e <__fp_szero> + 1b58: 5f 3f cpi r21, 0xFF ; 255 + 1b5a: ec f3 brlt .-6 ; 0x1b56 <__divsf3_pse+0x6a> + 1b5c: 98 3e cpi r25, 0xE8 ; 232 + 1b5e: dc f3 brlt .-10 ; 0x1b56 <__divsf3_pse+0x6a> + 1b60: 86 95 lsr r24 + 1b62: 77 95 ror r23 + 1b64: 67 95 ror r22 + 1b66: b7 95 ror r27 + 1b68: f7 95 ror r31 + 1b6a: 9f 5f subi r25, 0xFF ; 255 + 1b6c: c9 f7 brne .-14 ; 0x1b60 <__divsf3_pse+0x74> + 1b6e: 88 0f add r24, r24 + 1b70: 91 1d adc r25, r1 + 1b72: 96 95 lsr r25 + 1b74: 87 95 ror r24 + 1b76: 97 f9 bld r25, 7 + 1b78: 08 95 ret + 1b7a: e1 e0 ldi r30, 0x01 ; 1 + 1b7c: 66 0f add r22, r22 + 1b7e: 77 1f adc r23, r23 + 1b80: 88 1f adc r24, r24 + 1b82: bb 1f adc r27, r27 + 1b84: 62 17 cp r22, r18 + 1b86: 73 07 cpc r23, r19 + 1b88: 84 07 cpc r24, r20 + 1b8a: ba 07 cpc r27, r26 + 1b8c: 20 f0 brcs .+8 ; 0x1b96 <__divsf3_pse+0xaa> + 1b8e: 62 1b sub r22, r18 + 1b90: 73 0b sbc r23, r19 + 1b92: 84 0b sbc r24, r20 + 1b94: ba 0b sbc r27, r26 + 1b96: ee 1f adc r30, r30 + 1b98: 88 f7 brcc .-30 ; 0x1b7c <__divsf3_pse+0x90> + 1b9a: e0 95 com r30 + 1b9c: 08 95 ret + +00001b9e <__fixunssfsi>: + 1b9e: bc d0 rcall .+376 ; 0x1d18 <__fp_splitA> + 1ba0: 88 f0 brcs .+34 ; 0x1bc4 <__fixunssfsi+0x26> + 1ba2: 9f 57 subi r25, 0x7F ; 127 + 1ba4: 90 f0 brcs .+36 ; 0x1bca <__fixunssfsi+0x2c> + 1ba6: b9 2f mov r27, r25 + 1ba8: 99 27 eor r25, r25 + 1baa: b7 51 subi r27, 0x17 ; 23 + 1bac: a0 f0 brcs .+40 ; 0x1bd6 <__fixunssfsi+0x38> + 1bae: d1 f0 breq .+52 ; 0x1be4 <__fixunssfsi+0x46> + 1bb0: 66 0f add r22, r22 + 1bb2: 77 1f adc r23, r23 + 1bb4: 88 1f adc r24, r24 + 1bb6: 99 1f adc r25, r25 + 1bb8: 1a f0 brmi .+6 ; 0x1bc0 <__fixunssfsi+0x22> + 1bba: ba 95 dec r27 + 1bbc: c9 f7 brne .-14 ; 0x1bb0 <__fixunssfsi+0x12> + 1bbe: 12 c0 rjmp .+36 ; 0x1be4 <__fixunssfsi+0x46> + 1bc0: b1 30 cpi r27, 0x01 ; 1 + 1bc2: 81 f0 breq .+32 ; 0x1be4 <__fixunssfsi+0x46> + 1bc4: c3 d0 rcall .+390 ; 0x1d4c <__fp_zero> + 1bc6: b1 e0 ldi r27, 0x01 ; 1 + 1bc8: 08 95 ret + 1bca: c0 c0 rjmp .+384 ; 0x1d4c <__fp_zero> + 1bcc: 67 2f mov r22, r23 + 1bce: 78 2f mov r23, r24 + 1bd0: 88 27 eor r24, r24 + 1bd2: b8 5f subi r27, 0xF8 ; 248 + 1bd4: 39 f0 breq .+14 ; 0x1be4 <__fixunssfsi+0x46> + 1bd6: b9 3f cpi r27, 0xF9 ; 249 + 1bd8: cc f3 brlt .-14 ; 0x1bcc <__fixunssfsi+0x2e> + 1bda: 86 95 lsr r24 + 1bdc: 77 95 ror r23 + 1bde: 67 95 ror r22 + 1be0: b3 95 inc r27 + 1be2: d9 f7 brne .-10 ; 0x1bda <__fixunssfsi+0x3c> + 1be4: 3e f4 brtc .+14 ; 0x1bf4 <__fixunssfsi+0x56> + 1be6: 90 95 com r25 + 1be8: 80 95 com r24 + 1bea: 70 95 com r23 + 1bec: 61 95 neg r22 + 1bee: 7f 4f sbci r23, 0xFF ; 255 + 1bf0: 8f 4f sbci r24, 0xFF ; 255 + 1bf2: 9f 4f sbci r25, 0xFF ; 255 + 1bf4: 08 95 ret + +00001bf6 <__floatunsisf>: + 1bf6: e8 94 clt + 1bf8: 09 c0 rjmp .+18 ; 0x1c0c <__floatsisf+0x12> + +00001bfa <__floatsisf>: + 1bfa: 97 fb bst r25, 7 + 1bfc: 3e f4 brtc .+14 ; 0x1c0c <__floatsisf+0x12> + 1bfe: 90 95 com r25 + 1c00: 80 95 com r24 + 1c02: 70 95 com r23 + 1c04: 61 95 neg r22 + 1c06: 7f 4f sbci r23, 0xFF ; 255 + 1c08: 8f 4f sbci r24, 0xFF ; 255 + 1c0a: 9f 4f sbci r25, 0xFF ; 255 + 1c0c: 99 23 and r25, r25 + 1c0e: a9 f0 breq .+42 ; 0x1c3a <__floatsisf+0x40> + 1c10: f9 2f mov r31, r25 + 1c12: 96 e9 ldi r25, 0x96 ; 150 + 1c14: bb 27 eor r27, r27 + 1c16: 93 95 inc r25 + 1c18: f6 95 lsr r31 + 1c1a: 87 95 ror r24 + 1c1c: 77 95 ror r23 + 1c1e: 67 95 ror r22 + 1c20: b7 95 ror r27 + 1c22: f1 11 cpse r31, r1 + 1c24: f8 cf rjmp .-16 ; 0x1c16 <__floatsisf+0x1c> + 1c26: fa f4 brpl .+62 ; 0x1c66 <__floatsisf+0x6c> + 1c28: bb 0f add r27, r27 + 1c2a: 11 f4 brne .+4 ; 0x1c30 <__floatsisf+0x36> + 1c2c: 60 ff sbrs r22, 0 + 1c2e: 1b c0 rjmp .+54 ; 0x1c66 <__floatsisf+0x6c> + 1c30: 6f 5f subi r22, 0xFF ; 255 + 1c32: 7f 4f sbci r23, 0xFF ; 255 + 1c34: 8f 4f sbci r24, 0xFF ; 255 + 1c36: 9f 4f sbci r25, 0xFF ; 255 + 1c38: 16 c0 rjmp .+44 ; 0x1c66 <__floatsisf+0x6c> + 1c3a: 88 23 and r24, r24 + 1c3c: 11 f0 breq .+4 ; 0x1c42 <__floatsisf+0x48> + 1c3e: 96 e9 ldi r25, 0x96 ; 150 + 1c40: 11 c0 rjmp .+34 ; 0x1c64 <__floatsisf+0x6a> + 1c42: 77 23 and r23, r23 + 1c44: 21 f0 breq .+8 ; 0x1c4e <__floatsisf+0x54> + 1c46: 9e e8 ldi r25, 0x8E ; 142 + 1c48: 87 2f mov r24, r23 + 1c4a: 76 2f mov r23, r22 + 1c4c: 05 c0 rjmp .+10 ; 0x1c58 <__floatsisf+0x5e> + 1c4e: 66 23 and r22, r22 + 1c50: 71 f0 breq .+28 ; 0x1c6e <__floatsisf+0x74> + 1c52: 96 e8 ldi r25, 0x86 ; 134 + 1c54: 86 2f mov r24, r22 + 1c56: 70 e0 ldi r23, 0x00 ; 0 + 1c58: 60 e0 ldi r22, 0x00 ; 0 + 1c5a: 2a f0 brmi .+10 ; 0x1c66 <__floatsisf+0x6c> + 1c5c: 9a 95 dec r25 + 1c5e: 66 0f add r22, r22 + 1c60: 77 1f adc r23, r23 + 1c62: 88 1f adc r24, r24 + 1c64: da f7 brpl .-10 ; 0x1c5c <__floatsisf+0x62> + 1c66: 88 0f add r24, r24 + 1c68: 96 95 lsr r25 + 1c6a: 87 95 ror r24 + 1c6c: 97 f9 bld r25, 7 + 1c6e: 08 95 ret + +00001c70 <__fp_cmp>: + 1c70: 99 0f add r25, r25 + 1c72: 00 08 sbc r0, r0 + 1c74: 55 0f add r21, r21 + 1c76: aa 0b sbc r26, r26 + 1c78: e0 e8 ldi r30, 0x80 ; 128 + 1c7a: fe ef ldi r31, 0xFE ; 254 + 1c7c: 16 16 cp r1, r22 + 1c7e: 17 06 cpc r1, r23 + 1c80: e8 07 cpc r30, r24 + 1c82: f9 07 cpc r31, r25 + 1c84: c0 f0 brcs .+48 ; 0x1cb6 <__fp_cmp+0x46> + 1c86: 12 16 cp r1, r18 + 1c88: 13 06 cpc r1, r19 + 1c8a: e4 07 cpc r30, r20 + 1c8c: f5 07 cpc r31, r21 + 1c8e: 98 f0 brcs .+38 ; 0x1cb6 <__fp_cmp+0x46> + 1c90: 62 1b sub r22, r18 + 1c92: 73 0b sbc r23, r19 + 1c94: 84 0b sbc r24, r20 + 1c96: 95 0b sbc r25, r21 + 1c98: 39 f4 brne .+14 ; 0x1ca8 <__fp_cmp+0x38> + 1c9a: 0a 26 eor r0, r26 + 1c9c: 61 f0 breq .+24 ; 0x1cb6 <__fp_cmp+0x46> + 1c9e: 23 2b or r18, r19 + 1ca0: 24 2b or r18, r20 + 1ca2: 25 2b or r18, r21 + 1ca4: 21 f4 brne .+8 ; 0x1cae <__fp_cmp+0x3e> + 1ca6: 08 95 ret + 1ca8: 0a 26 eor r0, r26 + 1caa: 09 f4 brne .+2 ; 0x1cae <__fp_cmp+0x3e> + 1cac: a1 40 sbci r26, 0x01 ; 1 + 1cae: a6 95 lsr r26 + 1cb0: 8f ef ldi r24, 0xFF ; 255 + 1cb2: 81 1d adc r24, r1 + 1cb4: 81 1d adc r24, r1 + 1cb6: 08 95 ret + +00001cb8 <__fp_inf>: + 1cb8: 97 f9 bld r25, 7 + 1cba: 9f 67 ori r25, 0x7F ; 127 + 1cbc: 80 e8 ldi r24, 0x80 ; 128 + 1cbe: 70 e0 ldi r23, 0x00 ; 0 + 1cc0: 60 e0 ldi r22, 0x00 ; 0 + 1cc2: 08 95 ret + +00001cc4 <__fp_nan>: + 1cc4: 9f ef ldi r25, 0xFF ; 255 + 1cc6: 80 ec ldi r24, 0xC0 ; 192 + 1cc8: 08 95 ret + +00001cca <__fp_pscA>: + 1cca: 00 24 eor r0, r0 + 1ccc: 0a 94 dec r0 + 1cce: 16 16 cp r1, r22 + 1cd0: 17 06 cpc r1, r23 + 1cd2: 18 06 cpc r1, r24 + 1cd4: 09 06 cpc r0, r25 + 1cd6: 08 95 ret + +00001cd8 <__fp_pscB>: + 1cd8: 00 24 eor r0, r0 + 1cda: 0a 94 dec r0 + 1cdc: 12 16 cp r1, r18 + 1cde: 13 06 cpc r1, r19 + 1ce0: 14 06 cpc r1, r20 + 1ce2: 05 06 cpc r0, r21 + 1ce4: 08 95 ret + +00001ce6 <__fp_round>: + 1ce6: 09 2e mov r0, r25 + 1ce8: 03 94 inc r0 + 1cea: 00 0c add r0, r0 + 1cec: 11 f4 brne .+4 ; 0x1cf2 <__fp_round+0xc> + 1cee: 88 23 and r24, r24 + 1cf0: 52 f0 brmi .+20 ; 0x1d06 <__fp_round+0x20> + 1cf2: bb 0f add r27, r27 + 1cf4: 40 f4 brcc .+16 ; 0x1d06 <__fp_round+0x20> + 1cf6: bf 2b or r27, r31 + 1cf8: 11 f4 brne .+4 ; 0x1cfe <__fp_round+0x18> + 1cfa: 60 ff sbrs r22, 0 + 1cfc: 04 c0 rjmp .+8 ; 0x1d06 <__fp_round+0x20> + 1cfe: 6f 5f subi r22, 0xFF ; 255 + 1d00: 7f 4f sbci r23, 0xFF ; 255 + 1d02: 8f 4f sbci r24, 0xFF ; 255 + 1d04: 9f 4f sbci r25, 0xFF ; 255 + 1d06: 08 95 ret + +00001d08 <__fp_split3>: + 1d08: 57 fd sbrc r21, 7 + 1d0a: 90 58 subi r25, 0x80 ; 128 + 1d0c: 44 0f add r20, r20 + 1d0e: 55 1f adc r21, r21 + 1d10: 59 f0 breq .+22 ; 0x1d28 <__fp_splitA+0x10> + 1d12: 5f 3f cpi r21, 0xFF ; 255 + 1d14: 71 f0 breq .+28 ; 0x1d32 <__fp_splitA+0x1a> + 1d16: 47 95 ror r20 + +00001d18 <__fp_splitA>: + 1d18: 88 0f add r24, r24 + 1d1a: 97 fb bst r25, 7 + 1d1c: 99 1f adc r25, r25 + 1d1e: 61 f0 breq .+24 ; 0x1d38 <__fp_splitA+0x20> + 1d20: 9f 3f cpi r25, 0xFF ; 255 + 1d22: 79 f0 breq .+30 ; 0x1d42 <__fp_splitA+0x2a> + 1d24: 87 95 ror r24 + 1d26: 08 95 ret + 1d28: 12 16 cp r1, r18 + 1d2a: 13 06 cpc r1, r19 + 1d2c: 14 06 cpc r1, r20 + 1d2e: 55 1f adc r21, r21 + 1d30: f2 cf rjmp .-28 ; 0x1d16 <__fp_split3+0xe> + 1d32: 46 95 lsr r20 + 1d34: f1 df rcall .-30 ; 0x1d18 <__fp_splitA> + 1d36: 08 c0 rjmp .+16 ; 0x1d48 <__fp_splitA+0x30> + 1d38: 16 16 cp r1, r22 + 1d3a: 17 06 cpc r1, r23 + 1d3c: 18 06 cpc r1, r24 + 1d3e: 99 1f adc r25, r25 + 1d40: f1 cf rjmp .-30 ; 0x1d24 <__fp_splitA+0xc> + 1d42: 86 95 lsr r24 + 1d44: 71 05 cpc r23, r1 + 1d46: 61 05 cpc r22, r1 + 1d48: 08 94 sec + 1d4a: 08 95 ret + +00001d4c <__fp_zero>: + 1d4c: e8 94 clt + +00001d4e <__fp_szero>: + 1d4e: bb 27 eor r27, r27 + 1d50: 66 27 eor r22, r22 + 1d52: 77 27 eor r23, r23 + 1d54: cb 01 movw r24, r22 + 1d56: 97 f9 bld r25, 7 + 1d58: 08 95 ret + +00001d5a <__gesf2>: + 1d5a: 8a df rcall .-236 ; 0x1c70 <__fp_cmp> + 1d5c: 08 f4 brcc .+2 ; 0x1d60 <__gesf2+0x6> + 1d5e: 8f ef ldi r24, 0xFF ; 255 + 1d60: 08 95 ret + +00001d62 <__mulhi3>: + 1d62: 55 27 eor r21, r21 + 1d64: 00 24 eor r0, r0 + +00001d66 <__mulhi3_loop>: + 1d66: 80 ff sbrs r24, 0 + 1d68: 02 c0 rjmp .+4 ; 0x1d6e <__mulhi3_skip1> + 1d6a: 06 0e add r0, r22 + 1d6c: 57 1f adc r21, r23 + +00001d6e <__mulhi3_skip1>: + 1d6e: 66 0f add r22, r22 + 1d70: 77 1f adc r23, r23 + 1d72: 61 15 cp r22, r1 + 1d74: 71 05 cpc r23, r1 + 1d76: 21 f0 breq .+8 ; 0x1d80 <__mulhi3_exit> + 1d78: 96 95 lsr r25 + 1d7a: 87 95 ror r24 + 1d7c: 00 97 sbiw r24, 0x00 ; 0 + 1d7e: 99 f7 brne .-26 ; 0x1d66 <__mulhi3_loop> + +00001d80 <__mulhi3_exit>: + 1d80: 95 2f mov r25, r21 + 1d82: 80 2d mov r24, r0 + 1d84: 08 95 ret + +00001d86 <__udivmodhi4>: + 1d86: aa 1b sub r26, r26 + 1d88: bb 1b sub r27, r27 + 1d8a: 51 e1 ldi r21, 0x11 ; 17 + 1d8c: 07 c0 rjmp .+14 ; 0x1d9c <__udivmodhi4_ep> + +00001d8e <__udivmodhi4_loop>: + 1d8e: aa 1f adc r26, r26 + 1d90: bb 1f adc r27, r27 + 1d92: a6 17 cp r26, r22 + 1d94: b7 07 cpc r27, r23 + 1d96: 10 f0 brcs .+4 ; 0x1d9c <__udivmodhi4_ep> + 1d98: a6 1b sub r26, r22 + 1d9a: b7 0b sbc r27, r23 + +00001d9c <__udivmodhi4_ep>: + 1d9c: 88 1f adc r24, r24 + 1d9e: 99 1f adc r25, r25 + 1da0: 5a 95 dec r21 + 1da2: a9 f7 brne .-22 ; 0x1d8e <__udivmodhi4_loop> + 1da4: 80 95 com r24 + 1da6: 90 95 com r25 + 1da8: bc 01 movw r22, r24 + 1daa: cd 01 movw r24, r26 + 1dac: 08 95 ret + +00001dae <__divmodhi4>: + 1dae: 97 fb bst r25, 7 + 1db0: 09 2e mov r0, r25 + 1db2: 07 26 eor r0, r23 + 1db4: 0a d0 rcall .+20 ; 0x1dca <__divmodhi4_neg1> + 1db6: 77 fd sbrc r23, 7 + 1db8: 04 d0 rcall .+8 ; 0x1dc2 <__divmodhi4_neg2> + 1dba: e5 df rcall .-54 ; 0x1d86 <__udivmodhi4> + 1dbc: 06 d0 rcall .+12 ; 0x1dca <__divmodhi4_neg1> + 1dbe: 00 20 and r0, r0 + 1dc0: 1a f4 brpl .+6 ; 0x1dc8 <__divmodhi4_exit> + +00001dc2 <__divmodhi4_neg2>: + 1dc2: 70 95 com r23 + 1dc4: 61 95 neg r22 + 1dc6: 7f 4f sbci r23, 0xFF ; 255 + +00001dc8 <__divmodhi4_exit>: + 1dc8: 08 95 ret + +00001dca <__divmodhi4_neg1>: + 1dca: f6 f7 brtc .-4 ; 0x1dc8 <__divmodhi4_exit> + 1dcc: 90 95 com r25 + 1dce: 81 95 neg r24 + 1dd0: 9f 4f sbci r25, 0xFF ; 255 + 1dd2: 08 95 ret + +00001dd4 <__udivmodsi4>: + 1dd4: a1 e2 ldi r26, 0x21 ; 33 + 1dd6: 1a 2e mov r1, r26 + 1dd8: aa 1b sub r26, r26 + 1dda: bb 1b sub r27, r27 + 1ddc: fd 01 movw r30, r26 + 1dde: 0d c0 rjmp .+26 ; 0x1dfa <__udivmodsi4_ep> + +00001de0 <__udivmodsi4_loop>: + 1de0: aa 1f adc r26, r26 + 1de2: bb 1f adc r27, r27 + 1de4: ee 1f adc r30, r30 + 1de6: ff 1f adc r31, r31 + 1de8: a2 17 cp r26, r18 + 1dea: b3 07 cpc r27, r19 + 1dec: e4 07 cpc r30, r20 + 1dee: f5 07 cpc r31, r21 + 1df0: 20 f0 brcs .+8 ; 0x1dfa <__udivmodsi4_ep> + 1df2: a2 1b sub r26, r18 + 1df4: b3 0b sbc r27, r19 + 1df6: e4 0b sbc r30, r20 + 1df8: f5 0b sbc r31, r21 + +00001dfa <__udivmodsi4_ep>: + 1dfa: 66 1f adc r22, r22 + 1dfc: 77 1f adc r23, r23 + 1dfe: 88 1f adc r24, r24 + 1e00: 99 1f adc r25, r25 + 1e02: 1a 94 dec r1 + 1e04: 69 f7 brne .-38 ; 0x1de0 <__udivmodsi4_loop> + 1e06: 60 95 com r22 + 1e08: 70 95 com r23 + 1e0a: 80 95 com r24 + 1e0c: 90 95 com r25 + 1e0e: 9b 01 movw r18, r22 + 1e10: ac 01 movw r20, r24 + 1e12: bd 01 movw r22, r26 + 1e14: cf 01 movw r24, r30 + 1e16: 08 95 ret + +00001e18 : + 1e18: fc 01 movw r30, r24 + 1e1a: 88 27 eor r24, r24 + 1e1c: 99 27 eor r25, r25 + 1e1e: e8 94 clt + 1e20: 21 91 ld r18, Z+ + 1e22: 20 32 cpi r18, 0x20 ; 32 + 1e24: e9 f3 breq .-6 ; 0x1e20 + 1e26: 29 30 cpi r18, 0x09 ; 9 + 1e28: 10 f0 brcs .+4 ; 0x1e2e + 1e2a: 2e 30 cpi r18, 0x0E ; 14 + 1e2c: c8 f3 brcs .-14 ; 0x1e20 + 1e2e: 2b 32 cpi r18, 0x2B ; 43 + 1e30: 39 f0 breq .+14 ; 0x1e40 + 1e32: 2d 32 cpi r18, 0x2D ; 45 + 1e34: 31 f4 brne .+12 ; 0x1e42 + 1e36: 68 94 set + 1e38: 03 c0 rjmp .+6 ; 0x1e40 + 1e3a: 1a d0 rcall .+52 ; 0x1e70 <__mulhi_const_10> + 1e3c: 82 0f add r24, r18 + 1e3e: 91 1d adc r25, r1 + 1e40: 21 91 ld r18, Z+ + 1e42: 20 53 subi r18, 0x30 ; 48 + 1e44: 2a 30 cpi r18, 0x0A ; 10 + 1e46: c8 f3 brcs .-14 ; 0x1e3a + 1e48: 1e f4 brtc .+6 ; 0x1e50 + 1e4a: 90 95 com r25 + 1e4c: 81 95 neg r24 + 1e4e: 9f 4f sbci r25, 0xFF ; 255 + 1e50: 08 95 ret + +00001e52 : + 1e52: fb 01 movw r30, r22 + 1e54: dc 01 movw r26, r24 + 1e56: 41 50 subi r20, 0x01 ; 1 + 1e58: 50 40 sbci r21, 0x00 ; 0 + 1e5a: 48 f0 brcs .+18 ; 0x1e6e + 1e5c: 01 90 ld r0, Z+ + 1e5e: 0d 92 st X+, r0 + 1e60: 00 20 and r0, r0 + 1e62: c9 f7 brne .-14 ; 0x1e56 + 1e64: 01 c0 rjmp .+2 ; 0x1e68 + 1e66: 1d 92 st X+, r1 + 1e68: 41 50 subi r20, 0x01 ; 1 + 1e6a: 50 40 sbci r21, 0x00 ; 0 + 1e6c: e0 f7 brcc .-8 ; 0x1e66 + 1e6e: 08 95 ret + +00001e70 <__mulhi_const_10>: + 1e70: bc 01 movw r22, r24 + 1e72: 88 0f add r24, r24 + 1e74: 99 1f adc r25, r25 + 1e76: 88 0f add r24, r24 + 1e78: 99 1f adc r25, r25 + 1e7a: 86 0f add r24, r22 + 1e7c: 97 1f adc r25, r23 + 1e7e: 88 0f add r24, r24 + 1e80: 99 1f adc r25, r25 + 1e82: 08 95 ret + +00001e84 <_exit>: + 1e84: f8 94 cli + +00001e86 <__stop_program>: + 1e86: ff cf rjmp .-2 ; 0x1e86 <__stop_program> diff --git a/firmware/USBtoSerial.map b/firmware/USBtoSerial.map index 846a971..48e5678 100644 --- a/firmware/USBtoSerial.map +++ b/firmware/USBtoSerial.map @@ -33,7 +33,9 @@ Archive member included because of file (symbol) /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(gesf2.o) USBtoSerial.o (__gtsf2) /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_mulhi3.o) - ../../LUFA/Drivers/USB/Class/Common/HIDParser.o (__mulhi3) + USBtoSerial.o (__mulhi3) +/usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_mulsi3.o) + USBtoSerial.o (__mulsi3) /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodhi4.o) USBtoSerial.o (__udivmodhi4) /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_divmodhi4.o) @@ -46,6 +48,8 @@ Archive member included because of file (symbol) USBtoSerial.o (__do_copy_data) /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_clear_bss.o) USBtoSerial.o (__do_clear_bss) +/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(atoi.o) + USBtoSerial.o (atoi) /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcpy_P.o) ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o (memcpy_P) /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcmp.o) @@ -54,6 +58,10 @@ Archive member included because of file (symbol) ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o (memcpy) /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memset.o) ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o (memset) +/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(strncpy.o) + USBtoSerial.o (strncpy) +/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(mul10.o) + /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(atoi.o) (__mulhi_const_10) /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(eerd_byte_atmega32u2.o) ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o (__eerd_byte_m32u2) /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(eeupd_byte_atmega32u2.o) @@ -66,6 +74,7 @@ adb_werte 0x9 USBtoSerial.o USB_IsInitialized 0x1 ../../LUFA/Drivers/USB/Core/USBTask.o USB_Device_ConfigurationNumber 0x1 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o +stringbuffer 0x10 USBtoSerial.o USB_Device_CurrentlySelfPowered 0x1 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o USB_ControlRequest 0x8 ../../LUFA/Drivers/USB/Core/USBTask.o @@ -79,6 +88,8 @@ Discarded input sections .data 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o .bss 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o .text 0x0000000000000000 0x0 USBtoSerial.o + .text.touchpad_set_abs_mode + 0x0000000000000000 0x42 USBtoSerial.o .text.touchpad_set_rel_mode_200dpi 0x0000000000000000 0x2a USBtoSerial.o .text.z_pressure @@ -87,6 +98,8 @@ Discarded input sections .text.y_abs 0x0000000000000000 0x3e USBtoSerial.o .text.decode_field 0x0000000000000000 0x8c USBtoSerial.o + .text.times_ten_pow + 0x0000000000000000 0x3a USBtoSerial.o .text 0x0000000000000000 0x0 Descriptors.o .data 0x0000000000000000 0x0 Descriptors.o .bss 0x0000000000000000 0x0 Descriptors.o @@ -349,7 +362,10 @@ Discarded input sections .text 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_mulhi3.o) .data 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_mulhi3.o) .bss 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_mulhi3.o) - .text.libgcc 0x0000000000000000 0x24 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_mulhi3.o) + .text 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_mulsi3.o) + .data 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_mulsi3.o) + .bss 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_mulsi3.o) + .text.libgcc 0x0000000000000000 0x32 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_mulsi3.o) .text 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodhi4.o) .data 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodhi4.o) .bss 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodhi4.o) @@ -371,6 +387,9 @@ Discarded input sections .data 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_clear_bss.o) .bss 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_clear_bss.o) .text.libgcc 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_clear_bss.o) + .text 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(atoi.o) + .data 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(atoi.o) + .bss 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(atoi.o) .text 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcpy_P.o) .data 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcpy_P.o) .bss 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcpy_P.o) @@ -391,6 +410,12 @@ Discarded input sections .bss 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memset.o) .text.avr-libc 0x0000000000000000 0xe /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memset.o) + .text 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(strncpy.o) + .data 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(strncpy.o) + .bss 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(strncpy.o) + .text 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(mul10.o) + .data 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(mul10.o) + .bss 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(mul10.o) .text 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(eerd_byte_atmega32u2.o) .data 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(eerd_byte_atmega32u2.o) .bss 0x0000000000000000 0x0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(eerd_byte_atmega32u2.o) @@ -543,7 +568,7 @@ LOAD /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a .rela.plt *(.rela.plt) -.text 0x0000000000000000 0x1ab8 +.text 0x0000000000000000 0x1e88 *(.vectors) .vectors 0x0000000000000000 0x98 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o 0x0000000000000000 __vectors @@ -666,207 +691,227 @@ LOAD /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a .text.touchpad_read 0x0000000000000556 0x12 USBtoSerial.o 0x0000000000000556 touchpad_read - .text.touchpad_set_abs_mode - 0x0000000000000568 0x3c USBtoSerial.o - 0x0000000000000568 touchpad_set_abs_mode .text.touchpad_set_rel_mode_100dpi - 0x00000000000005a4 0x28 USBtoSerial.o - 0x00000000000005a4 touchpad_set_rel_mode_100dpi - .text.delta_y 0x00000000000005cc 0x20 USBtoSerial.o - 0x00000000000005cc delta_y - .text.delta_x 0x00000000000005ec 0x20 USBtoSerial.o - 0x00000000000005ec delta_x + 0x0000000000000568 0x28 USBtoSerial.o + 0x0000000000000568 touchpad_set_rel_mode_100dpi + .text.delta_y 0x0000000000000590 0x20 USBtoSerial.o + 0x0000000000000590 delta_y + .text.delta_x 0x00000000000005b0 0x20 USBtoSerial.o + 0x00000000000005b0 delta_x .text.Usb2SerialTask - 0x000000000000060c 0xb4 USBtoSerial.o - 0x000000000000060c Usb2SerialTask + 0x00000000000005d0 0x96 USBtoSerial.o + 0x00000000000005d0 Usb2SerialTask .text.SetupHardware - 0x00000000000006c0 0x2a USBtoSerial.o - 0x00000000000006c0 SetupHardware + 0x0000000000000666 0x2a USBtoSerial.o + 0x0000000000000666 SetupHardware .text.EVENT_USB_Device_Connect - 0x00000000000006ea 0x2 USBtoSerial.o - 0x00000000000006ea EVENT_USB_Device_Connect + 0x0000000000000690 0x2 USBtoSerial.o + 0x0000000000000690 EVENT_USB_Device_Connect .text.EVENT_USB_Device_Disconnect - 0x00000000000006ec 0x2 USBtoSerial.o - 0x00000000000006ec EVENT_USB_Device_Disconnect + 0x0000000000000692 0x2 USBtoSerial.o + 0x0000000000000692 EVENT_USB_Device_Disconnect .text.EVENT_USB_Device_ConfigurationChanged - 0x00000000000006ee 0x6 USBtoSerial.o - 0x00000000000006ee EVENT_USB_Device_ConfigurationChanged + 0x0000000000000694 0x8 USBtoSerial.o + 0x0000000000000694 EVENT_USB_Device_ConfigurationChanged .text.EVENT_USB_Device_ControlRequest - 0x00000000000006f4 0x6 USBtoSerial.o - 0x00000000000006f4 EVENT_USB_Device_ControlRequest + 0x000000000000069c 0x8 USBtoSerial.o + 0x000000000000069c EVENT_USB_Device_ControlRequest .text.__vector_23 - 0x00000000000006fa 0x54 USBtoSerial.o - 0x00000000000006fa __vector_23 + 0x00000000000006a4 0x54 USBtoSerial.o + 0x00000000000006a4 __vector_23 .text.EVENT_CDC_Device_LineEncodingChanged - 0x000000000000074e 0xc6 USBtoSerial.o - 0x000000000000074e EVENT_CDC_Device_LineEncodingChanged + 0x00000000000006f8 0xcc USBtoSerial.o + 0x00000000000006f8 EVENT_CDC_Device_LineEncodingChanged .text.uart_putc - 0x0000000000000814 0x10 USBtoSerial.o - 0x0000000000000814 uart_putc + 0x00000000000007c4 0x10 USBtoSerial.o + 0x00000000000007c4 uart_putc .text.uart_puts - 0x0000000000000824 0x26 USBtoSerial.o - 0x0000000000000824 uart_puts + 0x00000000000007d4 0x26 USBtoSerial.o + 0x00000000000007d4 uart_puts .text.my_uitoa - 0x000000000000084a 0xd0 USBtoSerial.o - 0x000000000000084a my_uitoa + 0x00000000000007fa 0xd0 USBtoSerial.o + 0x00000000000007fa my_uitoa + .text.sign 0x00000000000008ca 0x18 USBtoSerial.o + 0x00000000000008ca sign + .text.uart_print_number + 0x00000000000008e2 0x20 USBtoSerial.o + 0x00000000000008e2 uart_print_number + .text.uart_print_signed_number + 0x0000000000000902 0x3c USBtoSerial.o + 0x0000000000000902 uart_print_signed_number .text.init_motors - 0x000000000000091a 0x1a USBtoSerial.o - 0x000000000000091a init_motors + 0x000000000000093e 0x1a USBtoSerial.o + 0x000000000000093e init_motors .text.motor_step - 0x0000000000000934 0x64 USBtoSerial.o - 0x0000000000000934 motor_step - .text.sign 0x0000000000000998 0x18 USBtoSerial.o - 0x0000000000000998 sign + 0x0000000000000958 0x64 USBtoSerial.o + 0x0000000000000958 motor_step .text.move_plate - 0x00000000000009b0 0x84 USBtoSerial.o - 0x00000000000009b0 move_plate - .text.main 0x0000000000000a34 0x106 USBtoSerial.o - 0x0000000000000a34 main + 0x00000000000009bc 0x96 USBtoSerial.o + 0x00000000000009bc move_plate + .text.pos_report + 0x0000000000000a52 0x3a USBtoSerial.o + 0x0000000000000a52 pos_report + .text.parse_command + 0x0000000000000a8c 0x33c USBtoSerial.o + 0x0000000000000a8c parse_command + .text.main 0x0000000000000dc8 0xae USBtoSerial.o + 0x0000000000000dc8 main .text.CALLBACK_USB_GetDescriptor - 0x0000000000000b3a 0x5a Descriptors.o - 0x0000000000000b3a CALLBACK_USB_GetDescriptor + 0x0000000000000e76 0x5a Descriptors.o + 0x0000000000000e76 CALLBACK_USB_GetDescriptor .text.Endpoint_Write_Control_Stream_LE - 0x0000000000000b94 0xb4 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o - 0x0000000000000b94 Endpoint_Write_Control_Stream_LE + 0x0000000000000ed0 0xb4 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + 0x0000000000000ed0 Endpoint_Write_Control_Stream_LE .text.Endpoint_Write_Control_PStream_LE - 0x0000000000000c48 0xb6 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o - 0x0000000000000c48 Endpoint_Write_Control_PStream_LE + 0x0000000000000f84 0xb6 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + 0x0000000000000f84 Endpoint_Write_Control_PStream_LE .text.Endpoint_ConfigureEndpoint_Prv - 0x0000000000000cfe 0x6e ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - 0x0000000000000cfe Endpoint_ConfigureEndpoint_Prv + 0x000000000000103a 0x6e ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + 0x000000000000103a Endpoint_ConfigureEndpoint_Prv .text.Endpoint_ConfigureEndpointTable - 0x0000000000000d6c 0x88 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - 0x0000000000000d6c Endpoint_ConfigureEndpointTable + 0x00000000000010a8 0x88 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + 0x00000000000010a8 Endpoint_ConfigureEndpointTable .text.Endpoint_ClearStatusStage - 0x0000000000000df4 0x3e ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - 0x0000000000000df4 Endpoint_ClearStatusStage + 0x0000000000001130 0x3e ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + 0x0000000000001130 Endpoint_ClearStatusStage .text.Endpoint_WaitUntilReady - 0x0000000000000e32 0x66 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - 0x0000000000000e32 Endpoint_WaitUntilReady + 0x000000000000116e 0x66 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + 0x000000000000116e Endpoint_WaitUntilReady .text.USB_ResetInterface - 0x0000000000000e98 0x70 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o - 0x0000000000000e98 USB_ResetInterface + 0x00000000000011d4 0x70 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + 0x00000000000011d4 USB_ResetInterface .text.USB_Init - 0x0000000000000f08 0x12 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o - 0x0000000000000f08 USB_Init + 0x0000000000001244 0x12 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + 0x0000000000001244 USB_Init .text.USB_INT_DisableAllInterrupts - 0x0000000000000f1a 0x6 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - 0x0000000000000f1a USB_INT_DisableAllInterrupts + 0x0000000000001256 0x6 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + 0x0000000000001256 USB_INT_DisableAllInterrupts .text.USB_INT_ClearAllInterrupts - 0x0000000000000f20 0x6 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - 0x0000000000000f20 USB_INT_ClearAllInterrupts + 0x000000000000125c 0x6 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + 0x000000000000125c USB_INT_ClearAllInterrupts .text.__vector_11 - 0x0000000000000f26 0x148 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - 0x0000000000000f26 __vector_11 + 0x0000000000001262 0x148 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + 0x0000000000001262 __vector_11 .text.__vector_12 - 0x000000000000106e 0x76 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - 0x000000000000106e __vector_12 + 0x00000000000013aa 0x76 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + 0x00000000000013aa __vector_12 .text.USB_Device_ProcessControlRequest - 0x00000000000010e4 0x2c2 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o - 0x00000000000010e4 USB_Device_ProcessControlRequest + 0x0000000000001420 0x2c4 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + 0x0000000000001420 USB_Device_ProcessControlRequest .text.USB_Event_Stub - 0x00000000000013a6 0x2 ../../LUFA/Drivers/USB/Core/Events.o - 0x00000000000013a6 EVENT_USB_Device_WakeUp - 0x00000000000013a6 USB_Event_Stub - 0x00000000000013a6 EVENT_USB_Device_Suspend - 0x00000000000013a6 EVENT_USB_Device_StartOfFrame - 0x00000000000013a6 EVENT_USB_Device_Reset + 0x00000000000016e4 0x2 ../../LUFA/Drivers/USB/Core/Events.o + 0x00000000000016e4 EVENT_USB_Device_WakeUp + 0x00000000000016e4 USB_Event_Stub + 0x00000000000016e4 EVENT_USB_Device_Suspend + 0x00000000000016e4 EVENT_USB_Device_StartOfFrame + 0x00000000000016e4 EVENT_USB_Device_Reset .text.USB_USBTask - 0x00000000000013a8 0x36 ../../LUFA/Drivers/USB/Core/USBTask.o - 0x00000000000013a8 USB_USBTask + 0x00000000000016e6 0x36 ../../LUFA/Drivers/USB/Core/USBTask.o + 0x00000000000016e6 USB_USBTask .text.CDC_Device_ProcessControlRequest - 0x00000000000013de 0x158 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - 0x00000000000013de CDC_Device_ProcessControlRequest + 0x000000000000171c 0x15a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x000000000000171c CDC_Device_ProcessControlRequest .text.CDC_Device_ConfigureEndpoints - 0x0000000000001536 0x48 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - 0x0000000000001536 CDC_Device_ConfigureEndpoints + 0x0000000000001876 0x48 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x0000000000001876 CDC_Device_ConfigureEndpoints .text.CDC_Device_SendByte - 0x000000000000157e 0x5a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - 0x000000000000157e CDC_Device_SendByte + 0x00000000000018be 0x5a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x00000000000018be CDC_Device_SendByte .text.CDC_Device_Flush - 0x00000000000015d8 0x5a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - 0x00000000000015d8 CDC_Device_Flush + 0x0000000000001918 0x5a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x0000000000001918 CDC_Device_Flush .text.CDC_Device_USBTask - 0x0000000000001632 0x2e ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - 0x0000000000001632 CDC_Device_USBTask + 0x0000000000001972 0x2e ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x0000000000001972 CDC_Device_USBTask .text.CDC_Device_ReceiveByte - 0x0000000000001660 0x5a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - 0x0000000000001660 CDC_Device_ReceiveByte + 0x00000000000019a0 0x5a ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x00000000000019a0 CDC_Device_ReceiveByte .text.CDC_Device_Event_Stub - 0x00000000000016ba 0x2 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - 0x00000000000016ba EVENT_CDC_Device_ControLineStateChanged - 0x00000000000016ba EVENT_CDC_Device_BreakSent - 0x00000000000016ba CDC_Device_Event_Stub + 0x00000000000019fa 0x2 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x00000000000019fa EVENT_CDC_Device_ControLineStateChanged + 0x00000000000019fa EVENT_CDC_Device_BreakSent + 0x00000000000019fa CDC_Device_Event_Stub .text.avr-libc.fplib - 0x00000000000016bc 0xa /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3.o) - 0x00000000000016bc __subsf3 - 0x00000000000016be __addsf3 + 0x00000000000019fc 0xa /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3.o) + 0x00000000000019fc __subsf3 + 0x00000000000019fe __addsf3 .text.avr-libc.fplib - 0x00000000000016c6 0xc0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o) - 0x00000000000016e0 __addsf3x + 0x0000000000001a06 0xc0 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3x.o) + 0x0000000000001a20 __addsf3x .text.avr-libc.fplib - 0x0000000000001786 0x8 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(cmpsf2.o) - 0x0000000000001786 __lesf2 - 0x0000000000001786 __nesf2 - 0x0000000000001786 __eqsf2 - 0x0000000000001786 __cmpsf2 - 0x0000000000001786 __ltsf2 + 0x0000000000001ac6 0x8 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(cmpsf2.o) + 0x0000000000001ac6 __lesf2 + 0x0000000000001ac6 __nesf2 + 0x0000000000001ac6 __eqsf2 + 0x0000000000001ac6 __cmpsf2 + 0x0000000000001ac6 __ltsf2 .text.avr-libc.fplib - 0x000000000000178e 0x4 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3.o) - 0x000000000000178e __divsf3 + 0x0000000000001ace 0x4 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3.o) + 0x0000000000001ace __divsf3 .text.avr-libc.fplib - 0x0000000000001792 0xcc /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3x.o) - 0x00000000000017a8 __divsf3x - 0x00000000000017ac __divsf3_pse + 0x0000000000001ad2 0xcc /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(divsf3x.o) + 0x0000000000001ae8 __divsf3x + 0x0000000000001aec __divsf3_pse .text.avr-libc.fplib - 0x000000000000185e 0x58 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fixunssfsi.o) - 0x000000000000185e __fixunssfsi + 0x0000000000001b9e 0x58 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fixunssfsi.o) + 0x0000000000001b9e __fixunssfsi .text.avr-libc.fplib - 0x00000000000018b6 0x7a /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(floatsisf.o) - 0x00000000000018b6 __floatunsisf - 0x00000000000018ba __floatsisf + 0x0000000000001bf6 0x7a /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(floatsisf.o) + 0x0000000000001bf6 __floatunsisf + 0x0000000000001bfa __floatsisf .text.avr-libc.fplib - 0x0000000000001930 0x48 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_cmp.o) - 0x0000000000001930 __fp_cmp + 0x0000000000001c70 0x48 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_cmp.o) + 0x0000000000001c70 __fp_cmp .text.avr-libc.fplib - 0x0000000000001978 0xc /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_inf.o) - 0x0000000000001978 __fp_inf + 0x0000000000001cb8 0xc /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_inf.o) + 0x0000000000001cb8 __fp_inf .text.avr-libc.fplib - 0x0000000000001984 0x6 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_nan.o) - 0x0000000000001984 __fp_nan + 0x0000000000001cc4 0x6 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_nan.o) + 0x0000000000001cc4 __fp_nan .text.avr-libc.fplib - 0x000000000000198a 0xe /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscA.o) - 0x000000000000198a __fp_pscA + 0x0000000000001cca 0xe /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscA.o) + 0x0000000000001cca __fp_pscA .text.avr-libc.fplib - 0x0000000000001998 0xe /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscB.o) - 0x0000000000001998 __fp_pscB + 0x0000000000001cd8 0xe /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_pscB.o) + 0x0000000000001cd8 __fp_pscB .text.avr-libc.fplib - 0x00000000000019a6 0x22 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_round.o) - 0x00000000000019a6 __fp_round + 0x0000000000001ce6 0x22 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_round.o) + 0x0000000000001ce6 __fp_round .text.avr-libc.fplib - 0x00000000000019c8 0x44 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_split3.o) - 0x00000000000019c8 __fp_split3 - 0x00000000000019d8 __fp_splitA + 0x0000000000001d08 0x44 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_split3.o) + 0x0000000000001d08 __fp_split3 + 0x0000000000001d18 __fp_splitA .text.avr-libc.fplib - 0x0000000000001a0c 0xe /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_zero.o) - 0x0000000000001a0c __fp_zero - 0x0000000000001a0e __fp_szero + 0x0000000000001d4c 0xe /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(fp_zero.o) + 0x0000000000001d4c __fp_zero + 0x0000000000001d4e __fp_szero .text.avr-libc.fplib - 0x0000000000001a1a 0x8 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(gesf2.o) - 0x0000000000001a1a __gtsf2 - 0x0000000000001a1a __gesf2 - .text.libgcc 0x0000000000001a22 0x28 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodhi4.o) - 0x0000000000001a22 __udivmodhi4 - .text.libgcc 0x0000000000001a4a 0x26 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_divmodhi4.o) - 0x0000000000001a4a __divmodhi4 - 0x0000000000001a4a _div - .text.libgcc 0x0000000000001a70 0x44 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodsi4.o) - 0x0000000000001a70 __udivmodsi4 - 0x0000000000001ab4 . = ALIGN (0x2) + 0x0000000000001d5a 0x8 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(gesf2.o) + 0x0000000000001d5a __gtsf2 + 0x0000000000001d5a __gesf2 + .text.libgcc 0x0000000000001d62 0x24 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_mulhi3.o) + 0x0000000000001d62 __mulhi3 + .text.libgcc 0x0000000000001d86 0x28 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodhi4.o) + 0x0000000000001d86 __udivmodhi4 + .text.libgcc 0x0000000000001dae 0x26 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_divmodhi4.o) + 0x0000000000001dae __divmodhi4 + 0x0000000000001dae _div + .text.libgcc 0x0000000000001dd4 0x44 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_udivmodsi4.o) + 0x0000000000001dd4 __udivmodsi4 + .text.avr-libc + 0x0000000000001e18 0x3a /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(atoi.o) + 0x0000000000001e18 atoi + .text.avr-libc + 0x0000000000001e52 0x1e /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(strncpy.o) + 0x0000000000001e52 strncpy + .text.avr-libc + 0x0000000000001e70 0x14 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(mul10.o) + 0x0000000000001e70 __mulhi_const_10 + 0x0000000000001e84 . = ALIGN (0x2) *(.fini9) - .fini9 0x0000000000001ab4 0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_exit.o) - 0x0000000000001ab4 exit - 0x0000000000001ab4 _exit + .fini9 0x0000000000001e84 0x0 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_exit.o) + 0x0000000000001e84 exit + 0x0000000000001e84 _exit *(.fini9) *(.fini8) *(.fini8) @@ -885,51 +930,55 @@ LOAD /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a *(.fini1) *(.fini1) *(.fini0) - .fini0 0x0000000000001ab4 0x4 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_exit.o) + .fini0 0x0000000000001e84 0x4 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_exit.o) *(.fini0) - 0x0000000000001ab8 _etext = . + 0x0000000000001e88 _etext = . -.data 0x0000000000800100 0x6a load address 0x0000000000001ab8 +.data 0x0000000000800100 0x7a load address 0x0000000000001e88 0x0000000000800100 PROVIDE (__data_start, .) *(.data) - .data 0x0000000000800100 0x6a USBtoSerial.o - 0x0000000000800145 VirtualSerial_CDC_Interface - 0x0000000000800160 phase_pattern + .data 0x0000000000800100 0x79 USBtoSerial.o + 0x0000000000800154 VirtualSerial_CDC_Interface + 0x000000000080016f phase_pattern *(.data*) *(.rodata) *(.rodata*) *(.gnu.linkonce.d*) - 0x000000000080016a . = ALIGN (0x2) - 0x000000000080016a _edata = . - 0x000000000080016a PROVIDE (__data_end, .) + 0x000000000080017a . = ALIGN (0x2) + *fill* 0x0000000000800179 0x1 00 + 0x000000000080017a _edata = . + 0x000000000080017a PROVIDE (__data_end, .) -.bss 0x000000000080016a 0x13a - 0x000000000080016a PROVIDE (__bss_start, .) +.bss 0x000000000080017a 0x176 + 0x000000000080017a PROVIDE (__bss_start, .) *(.bss) - .bss 0x000000000080016a 0x123 USBtoSerial.o + .bss 0x000000000080017a 0x14f USBtoSerial.o + 0x000000000080017a plate_pos_x + 0x000000000080017c plate_pos_y *(.bss*) *(COMMON) - COMMON 0x000000000080028d 0xb USBtoSerial.o - 0x000000000080028d adb_werte - 0x0000000000800296 t0ovfcount - 0x0000000000800297 adb_data_length - COMMON 0x0000000000800298 0x3 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o - 0x0000000000800298 USB_Device_ConfigurationNumber - 0x0000000000800299 USB_Device_CurrentlySelfPowered - 0x000000000080029a USB_Device_RemoteWakeupEnabled - COMMON 0x000000000080029b 0x9 ../../LUFA/Drivers/USB/Core/USBTask.o - 0x000000000080029b USB_IsInitialized - 0x000000000080029c USB_ControlRequest - 0x00000000008002a4 PROVIDE (__bss_end, .) - 0x0000000000001ab8 __data_load_start = LOADADDR (.data) - 0x0000000000001b22 __data_load_end = (__data_load_start + SIZEOF (.data)) - -.noinit 0x00000000008002a4 0x0 - 0x00000000008002a4 PROVIDE (__noinit_start, .) + COMMON 0x00000000008002c9 0x1b USBtoSerial.o + 0x00000000008002c9 adb_werte + 0x00000000008002d2 stringbuffer + 0x00000000008002e2 t0ovfcount + 0x00000000008002e3 adb_data_length + COMMON 0x00000000008002e4 0x3 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + 0x00000000008002e4 USB_Device_ConfigurationNumber + 0x00000000008002e5 USB_Device_CurrentlySelfPowered + 0x00000000008002e6 USB_Device_RemoteWakeupEnabled + COMMON 0x00000000008002e7 0x9 ../../LUFA/Drivers/USB/Core/USBTask.o + 0x00000000008002e7 USB_IsInitialized + 0x00000000008002e8 USB_ControlRequest + 0x00000000008002f0 PROVIDE (__bss_end, .) + 0x0000000000001e88 __data_load_start = LOADADDR (.data) + 0x0000000000001f02 __data_load_end = (__data_load_start + SIZEOF (.data)) + +.noinit 0x00000000008002f0 0x0 + 0x00000000008002f0 PROVIDE (__noinit_start, .) *(.noinit*) - 0x00000000008002a4 PROVIDE (__noinit_end, .) - 0x00000000008002a4 _end = . - 0x00000000008002a4 PROVIDE (__heap_start, .) + 0x00000000008002f0 PROVIDE (__noinit_end, .) + 0x00000000008002f0 _end = . + 0x00000000008002f0 PROVIDE (__heap_start, .) .eeprom 0x0000000000810000 0x0 *(.eeprom*) @@ -947,7 +996,7 @@ LOAD /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a .signature *(.signature*) -.stab 0x0000000000000000 0x228c +.stab 0x0000000000000000 0x255c *(.stab) .stab 0x0000000000000000 0x6cc /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o .stab 0x00000000000006cc 0x78 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3.o) @@ -982,22 +1031,28 @@ LOAD /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a 0x9c (size before relaxing) .stab 0x0000000000001e54 0x6c /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(gesf2.o) 0x78 (size before relaxing) - .stab 0x0000000000001ec0 0x84 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcpy_P.o) + .stab 0x0000000000001ec0 0x174 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(atoi.o) + 0x180 (size before relaxing) + .stab 0x0000000000002034 0x84 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcpy_P.o) 0x90 (size before relaxing) - .stab 0x0000000000001f44 0xb4 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcmp.o) + .stab 0x00000000000020b8 0xb4 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcmp.o) 0xc0 (size before relaxing) - .stab 0x0000000000001ff8 0x84 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcpy.o) + .stab 0x000000000000216c 0x84 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memcpy.o) 0x90 (size before relaxing) - .stab 0x000000000000207c 0x6c /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memset.o) + .stab 0x00000000000021f0 0x6c /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(memset.o) 0x78 (size before relaxing) - .stab 0x00000000000020e8 0x90 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(eerd_byte_atmega32u2.o) + .stab 0x000000000000225c 0xcc /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(strncpy.o) + 0xd8 (size before relaxing) + .stab 0x0000000000002328 0x90 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(mul10.o) 0x9c (size before relaxing) - .stab 0x0000000000002178 0x114 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(eeupd_byte_atmega32u2.o) + .stab 0x00000000000023b8 0x90 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(eerd_byte_atmega32u2.o) + 0x9c (size before relaxing) + .stab 0x0000000000002448 0x114 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(eeupd_byte_atmega32u2.o) 0x120 (size before relaxing) -.stabstr 0x0000000000000000 0x44f +.stabstr 0x0000000000000000 0x4d5 *(.stabstr) - .stabstr 0x0000000000000000 0x44f /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o + .stabstr 0x0000000000000000 0x4d5 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o .stab.excl *(.stab.excl) @@ -1026,291 +1081,291 @@ LOAD /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a .debug_sfnames *(.debug_sfnames) -.debug_aranges 0x0000000000000000 0x568 +.debug_aranges 0x0000000000000000 0x590 *(.debug_aranges) .debug_aranges - 0x0000000000000000 0x138 USBtoSerial.o + 0x0000000000000000 0x160 USBtoSerial.o .debug_aranges - 0x0000000000000138 0x20 Descriptors.o + 0x0000000000000160 0x20 Descriptors.o .debug_aranges - 0x0000000000000158 0x38 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + 0x0000000000000180 0x38 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o .debug_aranges - 0x0000000000000190 0x20 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + 0x00000000000001b8 0x20 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o .debug_aranges - 0x00000000000001b0 0xc8 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + 0x00000000000001d8 0xc8 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o .debug_aranges - 0x0000000000000278 0x40 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + 0x00000000000002a0 0x40 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o .debug_aranges - 0x00000000000002b8 0x30 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + 0x00000000000002e0 0x30 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o .debug_aranges - 0x00000000000002e8 0x38 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + 0x0000000000000310 0x38 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o .debug_aranges - 0x0000000000000320 0x38 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o + 0x0000000000000348 0x38 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o .debug_aranges - 0x0000000000000358 0x20 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + 0x0000000000000380 0x20 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o .debug_aranges - 0x0000000000000378 0x20 ../../LUFA/Drivers/USB/Core/Events.o + 0x00000000000003a0 0x20 ../../LUFA/Drivers/USB/Core/Events.o .debug_aranges - 0x0000000000000398 0x20 ../../LUFA/Drivers/USB/Core/USBTask.o + 0x00000000000003c0 0x20 ../../LUFA/Drivers/USB/Core/USBTask.o .debug_aranges - 0x00000000000003b8 0x30 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o + 0x00000000000003e0 0x30 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o .debug_aranges - 0x00000000000003e8 0x98 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x0000000000000410 0x98 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o .debug_aranges - 0x0000000000000480 0x30 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o + 0x00000000000004a8 0x30 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o .debug_aranges - 0x00000000000004b0 0x30 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o + 0x00000000000004d8 0x30 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o .debug_aranges - 0x00000000000004e0 0x40 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o + 0x0000000000000508 0x40 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o .debug_aranges - 0x0000000000000520 0x48 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o + 0x0000000000000548 0x48 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o .debug_pubnames - 0x0000000000000000 0xe6e + 0x0000000000000000 0xf05 *(.debug_pubnames) .debug_pubnames - 0x0000000000000000 0x2d3 USBtoSerial.o + 0x0000000000000000 0x36a USBtoSerial.o .debug_pubnames - 0x00000000000002d3 0x9e Descriptors.o + 0x000000000000036a 0x9e Descriptors.o .debug_pubnames - 0x0000000000000371 0x7e ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + 0x0000000000000408 0x7e ../../LUFA/Drivers/USB/Class/Common/HIDParser.o .debug_pubnames - 0x00000000000003ef 0x32 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + 0x0000000000000486 0x32 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o .debug_pubnames - 0x0000000000000421 0x2df ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + 0x00000000000004b8 0x2df ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o .debug_pubnames - 0x0000000000000700 0xaf ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + 0x0000000000000797 0xaf ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o .debug_pubnames - 0x00000000000007af 0x46 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + 0x0000000000000846 0x46 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o .debug_pubnames - 0x00000000000007f5 0x72 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + 0x000000000000088c 0x72 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o .debug_pubnames - 0x0000000000000867 0x9b ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o + 0x00000000000008fe 0x9b ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o .debug_pubnames - 0x0000000000000902 0xa1 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + 0x0000000000000999 0xa1 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o .debug_pubnames - 0x00000000000009a3 0x25 ../../LUFA/Drivers/USB/Core/Events.o + 0x0000000000000a3a 0x25 ../../LUFA/Drivers/USB/Core/Events.o .debug_pubnames - 0x00000000000009c8 0x4f ../../LUFA/Drivers/USB/Core/USBTask.o + 0x0000000000000a5f 0x4f ../../LUFA/Drivers/USB/Core/USBTask.o .debug_pubnames - 0x0000000000000a17 0x79 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o + 0x0000000000000aae 0x79 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o .debug_pubnames - 0x0000000000000a90 0x18b ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + 0x0000000000000b27 0x18b ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o .debug_pubnames - 0x0000000000000c1b 0x70 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o + 0x0000000000000cb2 0x70 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o .debug_pubnames - 0x0000000000000c8b 0x6d ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o + 0x0000000000000d22 0x6d ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o .debug_pubnames - 0x0000000000000cf8 0xa6 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o + 0x0000000000000d8f 0xa6 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o .debug_pubnames - 0x0000000000000d9e 0xd0 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o + 0x0000000000000e35 0xd0 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o -.debug_info 0x0000000000000000 0x8f87 +.debug_info 0x0000000000000000 0x9207 *(.debug_info) - .debug_info 0x0000000000000000 0x11c9 USBtoSerial.o - .debug_info 0x00000000000011c9 0x77d Descriptors.o - .debug_info 0x0000000000001946 0x6f9 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o - .debug_info 0x000000000000203f 0xd8 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o - .debug_info 0x0000000000002117 0x154c ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o - .debug_info 0x0000000000003663 0x603 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - .debug_info 0x0000000000003c66 0x6c ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o - .debug_info 0x0000000000003cd2 0x6c ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o - .debug_info 0x0000000000003d3e 0x6c ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o - .debug_info 0x0000000000003daa 0x412 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o - .debug_info 0x00000000000041bc 0x662 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - .debug_info 0x000000000000481e 0x38c ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o - .debug_info 0x0000000000004baa 0x973 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o - .debug_info 0x000000000000551d 0x85 ../../LUFA/Drivers/USB/Core/Events.o - .debug_info 0x00000000000055a2 0x6c ../../LUFA/Drivers/USB/Core/HostStandardReq.o - .debug_info 0x000000000000560e 0x245 ../../LUFA/Drivers/USB/Core/USBTask.o - .debug_info 0x0000000000005853 0x56c ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o - .debug_info 0x0000000000005dbf 0xc3b ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - .debug_info 0x00000000000069fa 0x67a ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o - .debug_info 0x0000000000007074 0x7ca ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o - .debug_info 0x000000000000783e 0x4c1 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o - .debug_info 0x0000000000007cff 0xebc ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o - .debug_info 0x0000000000008bbb 0x6c ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o - .debug_info 0x0000000000008c27 0x6c ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o - .debug_info 0x0000000000008c93 0x6c ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o - .debug_info 0x0000000000008cff 0x6c ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o - .debug_info 0x0000000000008d6b 0x6c ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o - .debug_info 0x0000000000008dd7 0x6c ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o - .debug_info 0x0000000000008e43 0x6c ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o - .debug_info 0x0000000000008eaf 0x6c ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o - .debug_info 0x0000000000008f1b 0x6c ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o + .debug_info 0x0000000000000000 0x1449 USBtoSerial.o + .debug_info 0x0000000000001449 0x77d Descriptors.o + .debug_info 0x0000000000001bc6 0x6f9 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_info 0x00000000000022bf 0xd8 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + .debug_info 0x0000000000002397 0x154c ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + .debug_info 0x00000000000038e3 0x603 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + .debug_info 0x0000000000003ee6 0x6c ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .debug_info 0x0000000000003f52 0x6c ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .debug_info 0x0000000000003fbe 0x6c ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + .debug_info 0x000000000000402a 0x412 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .debug_info 0x000000000000443c 0x662 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_info 0x0000000000004a9e 0x38c ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o + .debug_info 0x0000000000004e2a 0x973 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + .debug_info 0x000000000000579d 0x85 ../../LUFA/Drivers/USB/Core/Events.o + .debug_info 0x0000000000005822 0x6c ../../LUFA/Drivers/USB/Core/HostStandardReq.o + .debug_info 0x000000000000588e 0x245 ../../LUFA/Drivers/USB/Core/USBTask.o + .debug_info 0x0000000000005ad3 0x56c ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o + .debug_info 0x000000000000603f 0xc3b ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + .debug_info 0x0000000000006c7a 0x67a ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o + .debug_info 0x00000000000072f4 0x7ca ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o + .debug_info 0x0000000000007abe 0x4c1 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o + .debug_info 0x0000000000007f7f 0xebc ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o + .debug_info 0x0000000000008e3b 0x6c ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o + .debug_info 0x0000000000008ea7 0x6c ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o + .debug_info 0x0000000000008f13 0x6c ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o + .debug_info 0x0000000000008f7f 0x6c ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o + .debug_info 0x0000000000008feb 0x6c ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o + .debug_info 0x0000000000009057 0x6c ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o + .debug_info 0x00000000000090c3 0x6c ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o + .debug_info 0x000000000000912f 0x6c ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o + .debug_info 0x000000000000919b 0x6c ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o *(.gnu.linkonce.wi.*) -.debug_abbrev 0x0000000000000000 0x21f5 +.debug_abbrev 0x0000000000000000 0x220b *(.debug_abbrev) - .debug_abbrev 0x0000000000000000 0x46c USBtoSerial.o - .debug_abbrev 0x000000000000046c 0x153 Descriptors.o - .debug_abbrev 0x00000000000005bf 0x1ec ../../LUFA/Drivers/USB/Class/Common/HIDParser.o - .debug_abbrev 0x00000000000007ab 0x7d ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o - .debug_abbrev 0x0000000000000828 0x18b ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o - .debug_abbrev 0x00000000000009b3 0x1ee ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - .debug_abbrev 0x0000000000000ba1 0x2a ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o - .debug_abbrev 0x0000000000000bcb 0x2a ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o - .debug_abbrev 0x0000000000000bf5 0x2a ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o - .debug_abbrev 0x0000000000000c1f 0x14d ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o - .debug_abbrev 0x0000000000000d6c 0x1e2 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - .debug_abbrev 0x0000000000000f4e 0x148 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o - .debug_abbrev 0x0000000000001096 0x20b ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o - .debug_abbrev 0x00000000000012a1 0x41 ../../LUFA/Drivers/USB/Core/Events.o - .debug_abbrev 0x00000000000012e2 0x2a ../../LUFA/Drivers/USB/Core/HostStandardReq.o - .debug_abbrev 0x000000000000130c 0x14b ../../LUFA/Drivers/USB/Core/USBTask.o - .debug_abbrev 0x0000000000001457 0x160 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o - .debug_abbrev 0x00000000000015b7 0x2ec ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - .debug_abbrev 0x00000000000018a3 0x1b5 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o - .debug_abbrev 0x0000000000001a58 0x205 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o - .debug_abbrev 0x0000000000001c5d 0x16c ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o - .debug_abbrev 0x0000000000001dc9 0x2b2 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o - .debug_abbrev 0x000000000000207b 0x2a ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o - .debug_abbrev 0x00000000000020a5 0x2a ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o - .debug_abbrev 0x00000000000020cf 0x2a ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o - .debug_abbrev 0x00000000000020f9 0x2a ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o - .debug_abbrev 0x0000000000002123 0x2a ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o - .debug_abbrev 0x000000000000214d 0x2a ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o - .debug_abbrev 0x0000000000002177 0x2a ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o - .debug_abbrev 0x00000000000021a1 0x2a ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o - .debug_abbrev 0x00000000000021cb 0x2a ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o - -.debug_line 0x0000000000000000 0x781c + .debug_abbrev 0x0000000000000000 0x482 USBtoSerial.o + .debug_abbrev 0x0000000000000482 0x153 Descriptors.o + .debug_abbrev 0x00000000000005d5 0x1ec ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_abbrev 0x00000000000007c1 0x7d ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + .debug_abbrev 0x000000000000083e 0x18b ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + .debug_abbrev 0x00000000000009c9 0x1ee ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + .debug_abbrev 0x0000000000000bb7 0x2a ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .debug_abbrev 0x0000000000000be1 0x2a ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .debug_abbrev 0x0000000000000c0b 0x2a ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + .debug_abbrev 0x0000000000000c35 0x14d ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .debug_abbrev 0x0000000000000d82 0x1e2 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_abbrev 0x0000000000000f64 0x148 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o + .debug_abbrev 0x00000000000010ac 0x20b ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + .debug_abbrev 0x00000000000012b7 0x41 ../../LUFA/Drivers/USB/Core/Events.o + .debug_abbrev 0x00000000000012f8 0x2a ../../LUFA/Drivers/USB/Core/HostStandardReq.o + .debug_abbrev 0x0000000000001322 0x14b ../../LUFA/Drivers/USB/Core/USBTask.o + .debug_abbrev 0x000000000000146d 0x160 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o + .debug_abbrev 0x00000000000015cd 0x2ec ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + .debug_abbrev 0x00000000000018b9 0x1b5 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o + .debug_abbrev 0x0000000000001a6e 0x205 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o + .debug_abbrev 0x0000000000001c73 0x16c ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o + .debug_abbrev 0x0000000000001ddf 0x2b2 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o + .debug_abbrev 0x0000000000002091 0x2a ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o + .debug_abbrev 0x00000000000020bb 0x2a ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o + .debug_abbrev 0x00000000000020e5 0x2a ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o + .debug_abbrev 0x000000000000210f 0x2a ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o + .debug_abbrev 0x0000000000002139 0x2a ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o + .debug_abbrev 0x0000000000002163 0x2a ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o + .debug_abbrev 0x000000000000218d 0x2a ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o + .debug_abbrev 0x00000000000021b7 0x2a ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o + .debug_abbrev 0x00000000000021e1 0x2a ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o + +.debug_line 0x0000000000000000 0x7b46 *(.debug_line) - .debug_line 0x0000000000000000 0x1239 USBtoSerial.o - .debug_line 0x0000000000001239 0x1d9 Descriptors.o - .debug_line 0x0000000000001412 0x762 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o - .debug_line 0x0000000000001b74 0x15f ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o - .debug_line 0x0000000000001cd3 0x1a80 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o - .debug_line 0x0000000000003753 0x5a1 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - .debug_line 0x0000000000003cf4 0x3e ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o - .debug_line 0x0000000000003d32 0x3e ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o - .debug_line 0x0000000000003d70 0x3e ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o - .debug_line 0x0000000000003dae 0x312 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o - .debug_line 0x00000000000040c0 0x55a ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - .debug_line 0x000000000000461a 0x269 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o - .debug_line 0x0000000000004883 0x5a2 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o - .debug_line 0x0000000000004e25 0x80 ../../LUFA/Drivers/USB/Core/Events.o - .debug_line 0x0000000000004ea5 0x3e ../../LUFA/Drivers/USB/Core/HostStandardReq.o - .debug_line 0x0000000000004ee3 0x1ae ../../LUFA/Drivers/USB/Core/USBTask.o - .debug_line 0x0000000000005091 0x4be ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o - .debug_line 0x000000000000554f 0x9c2 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - .debug_line 0x0000000000005f11 0x5c3 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o - .debug_line 0x00000000000064d4 0x5c6 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o - .debug_line 0x0000000000006a9a 0x3bc ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o - .debug_line 0x0000000000006e56 0x798 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o - .debug_line 0x00000000000075ee 0x3e ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o - .debug_line 0x000000000000762c 0x3e ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o - .debug_line 0x000000000000766a 0x3e ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o - .debug_line 0x00000000000076a8 0x3e ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o - .debug_line 0x00000000000076e6 0x3e ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o - .debug_line 0x0000000000007724 0x3e ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o - .debug_line 0x0000000000007762 0x3e ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o - .debug_line 0x00000000000077a0 0x3e ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o - .debug_line 0x00000000000077de 0x3e ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o - -.debug_frame 0x0000000000000000 0x890 + .debug_line 0x0000000000000000 0x1563 USBtoSerial.o + .debug_line 0x0000000000001563 0x1d9 Descriptors.o + .debug_line 0x000000000000173c 0x762 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_line 0x0000000000001e9e 0x15f ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + .debug_line 0x0000000000001ffd 0x1a80 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + .debug_line 0x0000000000003a7d 0x5a1 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + .debug_line 0x000000000000401e 0x3e ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .debug_line 0x000000000000405c 0x3e ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .debug_line 0x000000000000409a 0x3e ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + .debug_line 0x00000000000040d8 0x312 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .debug_line 0x00000000000043ea 0x55a ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_line 0x0000000000004944 0x269 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o + .debug_line 0x0000000000004bad 0x5a2 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + .debug_line 0x000000000000514f 0x80 ../../LUFA/Drivers/USB/Core/Events.o + .debug_line 0x00000000000051cf 0x3e ../../LUFA/Drivers/USB/Core/HostStandardReq.o + .debug_line 0x000000000000520d 0x1ae ../../LUFA/Drivers/USB/Core/USBTask.o + .debug_line 0x00000000000053bb 0x4be ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o + .debug_line 0x0000000000005879 0x9c2 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + .debug_line 0x000000000000623b 0x5c3 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o + .debug_line 0x00000000000067fe 0x5c6 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o + .debug_line 0x0000000000006dc4 0x3bc ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o + .debug_line 0x0000000000007180 0x798 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o + .debug_line 0x0000000000007918 0x3e ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o + .debug_line 0x0000000000007956 0x3e ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o + .debug_line 0x0000000000007994 0x3e ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o + .debug_line 0x00000000000079d2 0x3e ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o + .debug_line 0x0000000000007a10 0x3e ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o + .debug_line 0x0000000000007a4e 0x3e ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o + .debug_line 0x0000000000007a8c 0x3e ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o + .debug_line 0x0000000000007aca 0x3e ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o + .debug_line 0x0000000000007b08 0x3e ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o + +.debug_frame 0x0000000000000000 0x8e0 *(.debug_frame) - .debug_frame 0x0000000000000000 0x250 USBtoSerial.o - .debug_frame 0x0000000000000250 0x20 Descriptors.o - .debug_frame 0x0000000000000270 0x50 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o - .debug_frame 0x00000000000002c0 0x20 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o - .debug_frame 0x00000000000002e0 0x170 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o - .debug_frame 0x0000000000000450 0x60 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - .debug_frame 0x00000000000004b0 0x40 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o - .debug_frame 0x00000000000004f0 0x50 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - .debug_frame 0x0000000000000540 0x50 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o - .debug_frame 0x0000000000000590 0x20 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o - .debug_frame 0x00000000000005b0 0x20 ../../LUFA/Drivers/USB/Core/Events.o - .debug_frame 0x00000000000005d0 0x20 ../../LUFA/Drivers/USB/Core/USBTask.o - .debug_frame 0x00000000000005f0 0x40 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o - .debug_frame 0x0000000000000630 0x110 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - .debug_frame 0x0000000000000740 0x40 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o - .debug_frame 0x0000000000000780 0x40 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o - .debug_frame 0x00000000000007c0 0x60 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o - .debug_frame 0x0000000000000820 0x70 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o - -.debug_str 0x0000000000000000 0x3c87 + .debug_frame 0x0000000000000000 0x2a0 USBtoSerial.o + .debug_frame 0x00000000000002a0 0x20 Descriptors.o + .debug_frame 0x00000000000002c0 0x50 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_frame 0x0000000000000310 0x20 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + .debug_frame 0x0000000000000330 0x170 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + .debug_frame 0x00000000000004a0 0x60 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + .debug_frame 0x0000000000000500 0x40 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .debug_frame 0x0000000000000540 0x50 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_frame 0x0000000000000590 0x50 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o + .debug_frame 0x00000000000005e0 0x20 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + .debug_frame 0x0000000000000600 0x20 ../../LUFA/Drivers/USB/Core/Events.o + .debug_frame 0x0000000000000620 0x20 ../../LUFA/Drivers/USB/Core/USBTask.o + .debug_frame 0x0000000000000640 0x40 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o + .debug_frame 0x0000000000000680 0x110 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + .debug_frame 0x0000000000000790 0x40 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o + .debug_frame 0x00000000000007d0 0x40 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o + .debug_frame 0x0000000000000810 0x60 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o + .debug_frame 0x0000000000000870 0x70 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o + +.debug_str 0x0000000000000000 0x3d5d *(.debug_str) - .debug_str 0x0000000000000000 0x9c9 USBtoSerial.o - 0xa70 (size before relaxing) - .debug_str 0x00000000000009c9 0x8ba Descriptors.o + .debug_str 0x0000000000000000 0xa9f USBtoSerial.o + 0xb57 (size before relaxing) + .debug_str 0x0000000000000a9f 0x8ba Descriptors.o 0xa07 (size before relaxing) - .debug_str 0x0000000000001283 0x47c ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_str 0x0000000000001359 0x47c ../../LUFA/Drivers/USB/Class/Common/HIDParser.o 0x5e7 (size before relaxing) - .debug_str 0x00000000000016ff 0x77 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + .debug_str 0x00000000000017d5 0x77 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o 0x14a (size before relaxing) - .debug_str 0x0000000000001776 0x592 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + .debug_str 0x000000000000184c 0x592 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o 0x760 (size before relaxing) - .debug_str 0x0000000000001d08 0x212 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + .debug_str 0x0000000000001dde 0x212 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o 0x55c (size before relaxing) - .debug_str 0x0000000000001f1a 0x2d ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o + .debug_str 0x0000000000001ff0 0x2d ../../LUFA/Drivers/USB/Core/AVR8/Host_AVR8.o 0xf2 (size before relaxing) - .debug_str 0x0000000000001f47 0x33 ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o + .debug_str 0x000000000000201d 0x33 ../../LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.o 0xf8 (size before relaxing) - .debug_str 0x0000000000001f7a 0x2d ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o + .debug_str 0x0000000000002050 0x2d ../../LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.o 0xf2 (size before relaxing) - .debug_str 0x0000000000001fa7 0x209 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .debug_str 0x000000000000207d 0x209 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o 0x41b (size before relaxing) - .debug_str 0x00000000000021b0 0x113 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_str 0x0000000000002286 0x113 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o 0x41d (size before relaxing) - .debug_str 0x00000000000022c3 0x227 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o + .debug_str 0x0000000000002399 0x227 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o 0x332 (size before relaxing) - .debug_str 0x00000000000024ea 0x3b2 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + .debug_str 0x00000000000025c0 0x3b2 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o 0x850 (size before relaxing) - .debug_str 0x000000000000289c 0x34 ../../LUFA/Drivers/USB/Core/Events.o + .debug_str 0x0000000000002972 0x34 ../../LUFA/Drivers/USB/Core/Events.o 0xf9 (size before relaxing) - .debug_str 0x00000000000028d0 0x2e ../../LUFA/Drivers/USB/Core/HostStandardReq.o + .debug_str 0x00000000000029a6 0x2e ../../LUFA/Drivers/USB/Core/HostStandardReq.o 0xf3 (size before relaxing) - .debug_str 0x00000000000028fe 0x4e ../../LUFA/Drivers/USB/Core/USBTask.o + .debug_str 0x00000000000029d4 0x4e ../../LUFA/Drivers/USB/Core/USBTask.o 0x2a0 (size before relaxing) - .debug_str 0x000000000000294c 0x239 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o + .debug_str 0x0000000000002a22 0x239 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o 0x520 (size before relaxing) - .debug_str 0x0000000000002b85 0x2fa ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + .debug_str 0x0000000000002c5b 0x2fa ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o 0x8d4 (size before relaxing) - .debug_str 0x0000000000002e7f 0x1ed ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o + .debug_str 0x0000000000002f55 0x1ed ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o 0x54f (size before relaxing) - .debug_str 0x000000000000306c 0x23d ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o + .debug_str 0x0000000000003142 0x23d ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o 0x6b0 (size before relaxing) - .debug_str 0x00000000000032a9 0x118 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o + .debug_str 0x000000000000337f 0x118 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o 0x537 (size before relaxing) - .debug_str 0x00000000000033c1 0x6e8 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o + .debug_str 0x0000000000003497 0x6e8 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o 0xbe8 (size before relaxing) - .debug_str 0x0000000000003aa9 0x3e ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o + .debug_str 0x0000000000003b7f 0x3e ../../LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.o 0x103 (size before relaxing) - .debug_str 0x0000000000003ae7 0x33 ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o + .debug_str 0x0000000000003bbd 0x33 ../../LUFA/Drivers/USB/Class/Host/AudioClassHost.o 0xf8 (size before relaxing) - .debug_str 0x0000000000003b1a 0x31 ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o + .debug_str 0x0000000000003bf0 0x31 ../../LUFA/Drivers/USB/Class/Host/CDCClassHost.o 0xf6 (size before relaxing) - .debug_str 0x0000000000003b4b 0x31 ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o + .debug_str 0x0000000000003c21 0x31 ../../LUFA/Drivers/USB/Class/Host/HIDClassHost.o 0xf6 (size before relaxing) - .debug_str 0x0000000000003b7c 0x39 ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o + .debug_str 0x0000000000003c52 0x39 ../../LUFA/Drivers/USB/Class/Host/MassStorageClassHost.o 0xfe (size before relaxing) - .debug_str 0x0000000000003bb5 0x32 ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o + .debug_str 0x0000000000003c8b 0x32 ../../LUFA/Drivers/USB/Class/Host/MIDIClassHost.o 0xf7 (size before relaxing) - .debug_str 0x0000000000003be7 0x35 ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o + .debug_str 0x0000000000003cbd 0x35 ../../LUFA/Drivers/USB/Class/Host/PrinterClassHost.o 0xfa (size before relaxing) - .debug_str 0x0000000000003c1c 0x33 ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o + .debug_str 0x0000000000003cf2 0x33 ../../LUFA/Drivers/USB/Class/Host/RNDISClassHost.o 0xf8 (size before relaxing) - .debug_str 0x0000000000003c4f 0x38 ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o + .debug_str 0x0000000000003d25 0x38 ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o 0xfd (size before relaxing) -.debug_loc 0x0000000000000000 0x4764 +.debug_loc 0x0000000000000000 0x4a7a *(.debug_loc) - .debug_loc 0x0000000000000000 0x6c8 USBtoSerial.o - .debug_loc 0x00000000000006c8 0xd3 Descriptors.o - .debug_loc 0x000000000000079b 0x88f ../../LUFA/Drivers/USB/Class/Common/HIDParser.o - .debug_loc 0x000000000000102a 0x1982 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o - .debug_loc 0x00000000000029ac 0x390 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - .debug_loc 0x0000000000002d3c 0x190 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - .debug_loc 0x0000000000002ecc 0x2bc ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o - .debug_loc 0x0000000000003188 0x22a ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o - .debug_loc 0x00000000000033b2 0x27 ../../LUFA/Drivers/USB/Core/USBTask.o - .debug_loc 0x00000000000033d9 0x16d ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o - .debug_loc 0x0000000000003546 0x52b ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - .debug_loc 0x0000000000003a71 0x249 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o - .debug_loc 0x0000000000003cba 0x152 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o - .debug_loc 0x0000000000003e0c 0x1f6 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o - .debug_loc 0x0000000000004002 0x762 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o + .debug_loc 0x0000000000000000 0x9de USBtoSerial.o + .debug_loc 0x00000000000009de 0xd3 Descriptors.o + .debug_loc 0x0000000000000ab1 0x88f ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_loc 0x0000000000001340 0x1982 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + .debug_loc 0x0000000000002cc2 0x390 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + .debug_loc 0x0000000000003052 0x190 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_loc 0x00000000000031e2 0x2bc ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o + .debug_loc 0x000000000000349e 0x22a ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + .debug_loc 0x00000000000036c8 0x27 ../../LUFA/Drivers/USB/Core/USBTask.o + .debug_loc 0x00000000000036ef 0x16d ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o + .debug_loc 0x000000000000385c 0x52b ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + .debug_loc 0x0000000000003d87 0x249 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o + .debug_loc 0x0000000000003fd0 0x152 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o + .debug_loc 0x0000000000004122 0x1f6 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o + .debug_loc 0x0000000000004318 0x762 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o .debug_macinfo *(.debug_macinfo) @@ -1382,25 +1437,25 @@ LOAD linker stubs .debug_pubtypes 0x00000000000010ff 0x12 ../../LUFA/Drivers/USB/Class/Host/StillImageClassHost.o -.debug_ranges 0x0000000000000000 0x7c0 - .debug_ranges 0x0000000000000000 0x128 USBtoSerial.o - .debug_ranges 0x0000000000000128 0x10 Descriptors.o - .debug_ranges 0x0000000000000138 0x100 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o - .debug_ranges 0x0000000000000238 0x10 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o - .debug_ranges 0x0000000000000248 0x298 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o - .debug_ranges 0x00000000000004e0 0xa8 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o - .debug_ranges 0x0000000000000588 0x20 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o - .debug_ranges 0x00000000000005a8 0x28 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o - .debug_ranges 0x00000000000005d0 0x28 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o - .debug_ranges 0x00000000000005f8 0x10 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o - .debug_ranges 0x0000000000000608 0x10 ../../LUFA/Drivers/USB/Core/Events.o - .debug_ranges 0x0000000000000618 0x10 ../../LUFA/Drivers/USB/Core/USBTask.o - .debug_ranges 0x0000000000000628 0x20 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o - .debug_ranges 0x0000000000000648 0x88 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o - .debug_ranges 0x00000000000006d0 0x20 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o - .debug_ranges 0x00000000000006f0 0x20 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o - .debug_ranges 0x0000000000000710 0x30 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o - .debug_ranges 0x0000000000000740 0x80 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o +.debug_ranges 0x0000000000000000 0x818 + .debug_ranges 0x0000000000000000 0x180 USBtoSerial.o + .debug_ranges 0x0000000000000180 0x10 Descriptors.o + .debug_ranges 0x0000000000000190 0x100 ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + .debug_ranges 0x0000000000000290 0x10 ../../LUFA/Drivers/USB/Core/AVR8/Device_AVR8.o + .debug_ranges 0x00000000000002a0 0x298 ../../LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.o + .debug_ranges 0x0000000000000538 0xa8 ../../LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.o + .debug_ranges 0x00000000000005e0 0x20 ../../LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.o + .debug_ranges 0x0000000000000600 0x28 ../../LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.o + .debug_ranges 0x0000000000000628 0x28 ../../LUFA/Drivers/USB/Core/ConfigDescriptors.o + .debug_ranges 0x0000000000000650 0x10 ../../LUFA/Drivers/USB/Core/DeviceStandardReq.o + .debug_ranges 0x0000000000000660 0x10 ../../LUFA/Drivers/USB/Core/Events.o + .debug_ranges 0x0000000000000670 0x10 ../../LUFA/Drivers/USB/Core/USBTask.o + .debug_ranges 0x0000000000000680 0x20 ../../LUFA/Drivers/USB/Class/Device/AudioClassDevice.o + .debug_ranges 0x00000000000006a0 0x88 ../../LUFA/Drivers/USB/Class/Device/CDCClassDevice.o + .debug_ranges 0x0000000000000728 0x20 ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.o + .debug_ranges 0x0000000000000748 0x20 ../../LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.o + .debug_ranges 0x0000000000000768 0x30 ../../LUFA/Drivers/USB/Class/Device/MIDIClassDevice.o + .debug_ranges 0x0000000000000798 0x80 ../../LUFA/Drivers/USB/Class/Device/RNDISClassDevice.o Cross Reference Table @@ -1654,6 +1709,11 @@ __ltsf2 /usr/lib/gcc/avr/4.5.3/../../. USBtoSerial.o __mulhi3 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_mulhi3.o) ../../LUFA/Drivers/USB/Class/Common/HIDParser.o + USBtoSerial.o +__mulhi_const_10 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(mul10.o) + /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(atoi.o) +__mulsi3 /usr/lib/gcc/avr/4.5.3/avr35/libgcc.a(_mulsi3.o) + USBtoSerial.o __nesf2 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(cmpsf2.o) __stack /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/crtm32u2.o __subsf3 /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libm.a(addsf3.o) @@ -1711,6 +1771,8 @@ _exit /usr/lib/gcc/avr/4.5.3/avr35/l adb USBtoSerial.o adb_data_length USBtoSerial.o adb_werte USBtoSerial.o +atoi /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(atoi.o) + USBtoSerial.o decode_field USBtoSerial.o delta_x USBtoSerial.o delta_y USBtoSerial.o @@ -1731,18 +1793,28 @@ memset /usr/lib/gcc/avr/4.5.3/../../. motor_step USBtoSerial.o move_plate USBtoSerial.o my_uitoa USBtoSerial.o +parse_command USBtoSerial.o phase_pattern USBtoSerial.o +plate_pos_x USBtoSerial.o +plate_pos_y USBtoSerial.o +pos_report USBtoSerial.o set_x USBtoSerial.o set_y USBtoSerial.o sign USBtoSerial.o +stringbuffer USBtoSerial.o +strncpy /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr35/libc.a(strncpy.o) + USBtoSerial.o t0ext USBtoSerial.o t0ovfcount USBtoSerial.o t0rst USBtoSerial.o +times_ten_pow USBtoSerial.o touchpad_init USBtoSerial.o touchpad_read USBtoSerial.o touchpad_set_abs_mode USBtoSerial.o touchpad_set_rel_mode_100dpi USBtoSerial.o touchpad_set_rel_mode_200dpi USBtoSerial.o +uart_print_number USBtoSerial.o +uart_print_signed_number USBtoSerial.o uart_putc USBtoSerial.o uart_puts USBtoSerial.o x_abs USBtoSerial.o diff --git a/firmware/USBtoSerial.o b/firmware/USBtoSerial.o index 60e5cf015da05905281132bb19f3f1ab2c20d330..e19b913e8607ec2f57f4a7d3375226527c1c0998 100644 GIT binary patch literal 58600 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 CQ!@hq diff --git a/firmware/USBtoSerial.sym b/firmware/USBtoSerial.sym index 560cc8a..0d09d6c 100644 --- a/firmware/USBtoSerial.sym +++ b/firmware/USBtoSerial.sym @@ -255,124 +255,145 @@ 000004ff W __stack 00000546 T touchpad_init 00000556 T touchpad_read -00000568 T touchpad_set_abs_mode -000005a4 T touchpad_set_rel_mode_100dpi -000005cc T delta_y -000005ec T delta_x -0000060c T Usb2SerialTask -000006c0 T SetupHardware -000006ea T EVENT_USB_Device_Connect -000006ec T EVENT_USB_Device_Disconnect -000006ee T EVENT_USB_Device_ConfigurationChanged -000006f4 T EVENT_USB_Device_ControlRequest -000006fa T __vector_23 -0000074e T EVENT_CDC_Device_LineEncodingChanged -00000814 T uart_putc -00000824 T uart_puts -0000084a T my_uitoa -0000091a T init_motors -00000934 T motor_step -00000998 T sign -000009b0 T move_plate -00000a34 T main -00000b3a T CALLBACK_USB_GetDescriptor -00000b94 T Endpoint_Write_Control_Stream_LE -00000c48 T Endpoint_Write_Control_PStream_LE -00000cfe T Endpoint_ConfigureEndpoint_Prv -00000d6c T Endpoint_ConfigureEndpointTable -00000df4 T Endpoint_ClearStatusStage -00000e32 T Endpoint_WaitUntilReady -00000e98 T USB_ResetInterface -00000f08 T USB_Init -00000f1a T USB_INT_DisableAllInterrupts -00000f20 T USB_INT_ClearAllInterrupts -00000f26 T __vector_11 -0000106e T __vector_12 -000010e4 T USB_Device_ProcessControlRequest -000013a6 W EVENT_USB_Device_Reset -000013a6 W EVENT_USB_Device_StartOfFrame -000013a6 W EVENT_USB_Device_Suspend -000013a6 W EVENT_USB_Device_WakeUp -000013a6 T USB_Event_Stub -000013a8 T USB_USBTask -000013de T CDC_Device_ProcessControlRequest -00001536 T CDC_Device_ConfigureEndpoints -0000157e T CDC_Device_SendByte -000015d8 T CDC_Device_Flush -00001632 T CDC_Device_USBTask -00001660 T CDC_Device_ReceiveByte -000016ba T CDC_Device_Event_Stub -000016ba W EVENT_CDC_Device_BreakSent -000016ba W EVENT_CDC_Device_ControLineStateChanged -000016bc T __subsf3 -000016be T __addsf3 -000016e0 T __addsf3x -00001786 T __cmpsf2 -00001786 T __eqsf2 -00001786 T __lesf2 -00001786 T __ltsf2 -00001786 T __nesf2 -0000178e T __divsf3 -000017a8 T __divsf3x -000017ac T __divsf3_pse -0000185e T __fixunssfsi -000018b6 T __floatunsisf -000018ba T __floatsisf -00001930 T __fp_cmp -00001978 T __fp_inf -00001984 T __fp_nan -0000198a T __fp_pscA -00001998 T __fp_pscB -000019a6 T __fp_round -000019c8 T __fp_split3 -000019d8 T __fp_splitA -00001a0c T __fp_zero -00001a0e T __fp_szero -00001a1a T __gesf2 -00001a1a T __gtsf2 -00001a22 T __udivmodhi4 -00001a2a t __udivmodhi4_loop -00001a38 t __udivmodhi4_ep -00001a4a T __divmodhi4 -00001a4a T _div -00001a5e t __divmodhi4_neg2 -00001a64 t __divmodhi4_exit -00001a66 t __divmodhi4_neg1 -00001a70 T __udivmodsi4 -00001a7c t __udivmodsi4_loop -00001a96 t __udivmodsi4_ep -00001ab4 T _exit -00001ab4 W exit -00001ab6 t __stop_program -00001ab8 A __data_load_start -00001ab8 T _etext -00001b22 A __data_load_end +00000568 T touchpad_set_rel_mode_100dpi +00000590 T delta_y +000005b0 T delta_x +000005d0 T Usb2SerialTask +00000666 T SetupHardware +00000690 T EVENT_USB_Device_Connect +00000692 T EVENT_USB_Device_Disconnect +00000694 T EVENT_USB_Device_ConfigurationChanged +0000069c T EVENT_USB_Device_ControlRequest +000006a4 T __vector_23 +000006f8 T EVENT_CDC_Device_LineEncodingChanged +000007c4 T uart_putc +000007d4 T uart_puts +000007fa T my_uitoa +000008ca T sign +000008e2 T uart_print_number +00000902 T uart_print_signed_number +0000093e T init_motors +00000958 T motor_step +000009bc T move_plate +00000a52 T pos_report +00000a8c T parse_command +00000dc8 T main +00000e76 T CALLBACK_USB_GetDescriptor +00000ed0 T Endpoint_Write_Control_Stream_LE +00000f84 T Endpoint_Write_Control_PStream_LE +0000103a T Endpoint_ConfigureEndpoint_Prv +000010a8 T Endpoint_ConfigureEndpointTable +00001130 T Endpoint_ClearStatusStage +0000116e T Endpoint_WaitUntilReady +000011d4 T USB_ResetInterface +00001244 T USB_Init +00001256 T USB_INT_DisableAllInterrupts +0000125c T USB_INT_ClearAllInterrupts +00001262 T __vector_11 +000013aa T __vector_12 +00001420 T USB_Device_ProcessControlRequest +000016e4 W EVENT_USB_Device_Reset +000016e4 W EVENT_USB_Device_StartOfFrame +000016e4 W EVENT_USB_Device_Suspend +000016e4 W EVENT_USB_Device_WakeUp +000016e4 T USB_Event_Stub +000016e6 T USB_USBTask +0000171c T CDC_Device_ProcessControlRequest +00001876 T CDC_Device_ConfigureEndpoints +000018be T CDC_Device_SendByte +00001918 T CDC_Device_Flush +00001972 T CDC_Device_USBTask +000019a0 T CDC_Device_ReceiveByte +000019fa T CDC_Device_Event_Stub +000019fa W EVENT_CDC_Device_BreakSent +000019fa W EVENT_CDC_Device_ControLineStateChanged +000019fc T __subsf3 +000019fe T __addsf3 +00001a20 T __addsf3x +00001ac6 T __cmpsf2 +00001ac6 T __eqsf2 +00001ac6 T __lesf2 +00001ac6 T __ltsf2 +00001ac6 T __nesf2 +00001ace T __divsf3 +00001ae8 T __divsf3x +00001aec T __divsf3_pse +00001b9e T __fixunssfsi +00001bf6 T __floatunsisf +00001bfa T __floatsisf +00001c70 T __fp_cmp +00001cb8 T __fp_inf +00001cc4 T __fp_nan +00001cca T __fp_pscA +00001cd8 T __fp_pscB +00001ce6 T __fp_round +00001d08 T __fp_split3 +00001d18 T __fp_splitA +00001d4c T __fp_zero +00001d4e T __fp_szero +00001d5a T __gesf2 +00001d5a T __gtsf2 +00001d62 T __mulhi3 +00001d66 t __mulhi3_loop +00001d6e t __mulhi3_skip1 +00001d80 t __mulhi3_exit +00001d86 T __udivmodhi4 +00001d8e t __udivmodhi4_loop +00001d9c t __udivmodhi4_ep +00001dae T __divmodhi4 +00001dae T _div +00001dc2 t __divmodhi4_neg2 +00001dc8 t __divmodhi4_exit +00001dca t __divmodhi4_neg1 +00001dd4 T __udivmodsi4 +00001de0 t __udivmodsi4_loop +00001dfa t __udivmodsi4_ep +00001e18 T atoi +00001e52 T strncpy +00001e70 T __mulhi_const_10 +00001e84 T _exit +00001e84 W exit +00001e86 t __stop_program +00001e88 A __data_load_start +00001e88 T _etext +00001f02 A __data_load_end 00800100 D __data_start -00800145 D VirtualSerial_CDC_Interface -00800160 D phase_pattern -00800164 d CSWTCH.16 -00800166 d CSWTCH.19 -0080016a b USBtoUSART_Buffer -0080016a B __bss_start -0080016a D __data_end -0080016a D _edata -00800176 b USBtoUSART_Buffer_Data -008001f6 b USARTtoUSB_Buffer -00800202 b USARTtoUSB_Buffer_Data -00800282 b todo_y.4082 -00800284 b todo_x.4081 -00800286 b phase_memory.4068 -00800288 b y_mem.3984 -0080028a b x_mem.3983 -0080028c b last_pressure.3978 -0080028d B adb_werte -00800296 B t0ovfcount -00800297 B adb_data_length -00800298 B USB_Device_ConfigurationNumber -00800299 B USB_Device_CurrentlySelfPowered -0080029a B USB_Device_RemoteWakeupEnabled -0080029b B USB_IsInitialized -0080029c B USB_ControlRequest -008002a4 B __bss_end -008002a4 N _end +00800154 D VirtualSerial_CDC_Interface +0080016f D phase_pattern +00800173 d CSWTCH.34 +00800175 d CSWTCH.37 +0080017a B __bss_start +0080017a D __data_end +0080017a D _edata +0080017a B plate_pos_x +0080017c B plate_pos_y +0080017e b USBtoUSART_Buffer +0080018a b USBtoUSART_Buffer_Data +0080020a b USARTtoUSB_Buffer +00800216 b USARTtoUSB_Buffer_Data +00800296 b nums_found.4223 +00800297 b num_start.4222 +00800298 b curCmdLen.4221 +00800299 b cmdPos.4220 +0080029a b postdot.4219 +0080029c b predot.4218 +0080029e b numbuffer.4217 +008002ae b cmdbuffer.4216 +008002be b todo_y.4207 +008002c0 b todo_x.4206 +008002c2 b phase_memory.4188 +008002c4 b y_mem.4090 +008002c6 b x_mem.4089 +008002c8 b last_pressure.4084 +008002c9 B adb_werte +008002d2 B stringbuffer +008002e2 B t0ovfcount +008002e3 B adb_data_length +008002e4 B USB_Device_ConfigurationNumber +008002e5 B USB_Device_CurrentlySelfPowered +008002e6 B USB_Device_RemoteWakeupEnabled +008002e7 B USB_IsInitialized +008002e8 B USB_ControlRequest +008002f0 B __bss_end +008002f0 N _end 00810000 N __eeprom_end diff --git a/firmware/pins.h~ b/firmware/pins.h~ index c0f65af..a1c5389 100644 --- a/firmware/pins.h~ +++ b/firmware/pins.h~ @@ -28,7 +28,7 @@ #define Y1 6 #define DDRY1 DDRB #define PORTY1 PORTB -#define PINY1 PINC +#define PINY1 PINB #define Y2 7 #define DDRY2 DDRC @@ -40,3 +40,6 @@ #define PORTY3 PORTC #define PINY3 PINC +#define X 0 +#define Y 1 + -- 2.43.0