1 .file "yack.c" 2 __SREG__ = 0x3f 3 __SP_H__ = 0x3e 4 __SP_L__ = 0x3d 5 __CCP__ = 0x34 6 __tmp_reg__ = 0 7 __zero_reg__ = 1 9 .text 10 .Ltext0: 96 .global __vector_2 98 __vector_2: 1:yack.c **** /*! 2:yack.c **** 3:yack.c **** @file yack.c 4:yack.c **** @brief CW Keyer library 5:yack.c **** @author Jan Lategahn DK3LJ jan@lategahn.com (C) 2011; modified by Jack Welch AI4SV; modified by 6:yack.c **** 7:yack.c **** @version 0.87 8:yack.c **** 9:yack.c **** This program is free software: you can redistribute it and/or modify 10:yack.c **** it under the terms of the GNU General Public License as published by 11:yack.c **** the Free Software Foundation, either version 3 of the License, or 12:yack.c **** (at your option) any later version. 13:yack.c **** 14:yack.c **** This program is distributed in the hope that it will be useful, 15:yack.c **** but WITHOUT ANY WARRANTY; without even the implied warranty of 16:yack.c **** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17:yack.c **** GNU General Public License for more details. 18:yack.c **** 19:yack.c **** You should have received a copy of the GNU General Public License 20:yack.c **** along with this program. If not, see . 21:yack.c **** 22:yack.c **** @date 15.10.2010 - Created 23:yack.c **** @date 03.10.2013 - Last update 24:yack.c **** @date 21.12.2016 - Added additional prosigns and punctuation. Added 2 additional memories fo 25:yack.c **** @date 03.01.2017 - If memory recording is interrupted by command button, keyer now returns t 26:yack.c **** Memory playback halts immediately on command key instead of looping throu 27:yack.c **** Removed playback of recorded message before saving. 28:yack.c **** Changed yackstring command to return to command mode instead of normal mode if interrupted 29:yack.c **** 30:yack.c **** @todo Make the delay dependent on T/C 1 31:yack.c **** 32:yack.c **** */ 33:yack.c **** 34:yack.c **** 35:yack.c **** #include 36:yack.c **** #include 37:yack.c **** #include 38:yack.c **** #include 39:yack.c **** #include 40:yack.c **** #include 41:yack.c **** #include 42:yack.c **** #include "yack.h" 43:yack.c **** 44:yack.c **** // Forward declaration of private functions 45:yack.c **** static void key( byte mode); 46:yack.c **** static char morsechar(byte buffer); 47:yack.c **** static void keylatch(void); 48:yack.c **** 49:yack.c **** // Enumerations 50:yack.c **** 51:yack.c **** enum FSMSTATE { 52:yack.c **** IDLE, //!< Not keyed, waiting for paddle 53:yack.c **** KEYED, //!< Keyed, waiting for duration of current element 54:yack.c **** IEG //!< In Inter-Element-Gap 55:yack.c **** }; 56:yack.c **** 57:yack.c **** // Module local definitions 58:yack.c **** 59:yack.c **** static byte yackflags; // Permanent (stored) status of module flags 60:yack.c **** static byte volflags=0; // Temporary working flags (volatile) 61:yack.c **** static word ctcvalue; // Pitch 62:yack.c **** static word wpmcnt; // Speed 63:yack.c **** static byte wpm; // Real wpm 64:yack.c **** static byte farnsworth; // Additional Farnsworth pause 65:yack.c **** 66:yack.c **** // EEPROM Data 67:yack.c **** 68:yack.c **** byte magic EEMEM = MAGPAT; // Needs to contain 'A5' if mem is valid 69:yack.c **** byte flagstor EEMEM = ( IAMBICB | TXKEY | SIDETONE); // Defaults 70:yack.c **** word ctcstor EEMEM = DEFCTC; // Pitch = 800Hz 71:yack.c **** byte wpmstor EEMEM = DEFWPM; // 15 WPM 72:yack.c **** byte fwstor EEMEM = 0; // No farnsworth pause 73:yack.c **** word user1 EEMEM = 0; // User storage 74:yack.c **** word user2 EEMEM = 0; // User storage 75:yack.c **** 76:yack.c **** //char eebuffer1[100] EEMEM = "message 1"; 77:yack.c **** //char eebuffer2[100] EEMEM = "message 2"; 78:yack.c **** char eebuffer1[100] EEMEM = "message 1"; 79:yack.c **** char eebuffer2[100] EEMEM = "message 2"; 80:yack.c **** char eebuffer3[100] EEMEM = "message 3"; 81:yack.c **** char eebuffer4[100] EEMEM = "message 4"; 82:yack.c **** 83:yack.c **** // Flash data 84:yack.c **** 85:yack.c **** //! Morse code table in Flash 86:yack.c **** 87:yack.c **** //! Encoding: Each byte is read from the left. 0 stands for a dot, 1 88:yack.c **** //! stands for a dash. After each played element the content is shifted 89:yack.c **** //! left. Playback stops when the leftmost bit contains a "1" and the rest 90:yack.c **** //! of the bits are all zero. 91:yack.c **** //! 92:yack.c **** //! Example: A = .- 93:yack.c **** //! Encoding: 01100000 94:yack.c **** //! .- 95:yack.c **** //! | This is the stop marker (1 with all trailing zeros) 96:yack.c **** 97:yack.c **** const byte morse[] PROGMEM = 98:yack.c **** { 99:yack.c **** 100:yack.c **** 0b11111100, // 0 101:yack.c **** 0b01111100, // 1 102:yack.c **** 0b00111100, // 2 103:yack.c **** 0b00011100, // 3 104:yack.c **** 0b00001100, // 4 105:yack.c **** 0b00000100, // 5 106:yack.c **** 0b10000100, // 6 107:yack.c **** 0b11000100, // 7 108:yack.c **** 0b11100100, // 8 109:yack.c **** 0b11110100, // 9 110:yack.c **** 0b01100000, // A 111:yack.c **** 0b10001000, // B 112:yack.c **** 0b10101000, // C 113:yack.c **** 0b10010000, // D 114:yack.c **** 0b01000000, // E 115:yack.c **** 0b00101000, // F 116:yack.c **** 0b11010000, // G 117:yack.c **** 0b00001000, // H 118:yack.c **** 0b00100000, // I 119:yack.c **** 0b01111000, // J 120:yack.c **** 0b10110000, // K 121:yack.c **** 0b01001000, // L 122:yack.c **** 0b11100000, // M 123:yack.c **** 0b10100000, // N 124:yack.c **** 0b11110000, // O 125:yack.c **** 0b01101000, // P 126:yack.c **** 0b11011000, // Q 127:yack.c **** 0b01010000, // R 128:yack.c **** 0b00010000, // S 129:yack.c **** 0b11000000, // T 130:yack.c **** 0b00110000, // U 131:yack.c **** 0b00011000, // V 132:yack.c **** 0b01110000, // W 133:yack.c **** 0b10011000, // X 134:yack.c **** 0b10111000, // Y 135:yack.c **** 0b11001000, // Z 136:yack.c **** 0b00110010, // ? 137:yack.c **** 0b01010110, // . 138:yack.c **** 0b10010100, // / 139:yack.c **** 0b11101000, // ! (American Morse version, commonly used in ham circles) 140:yack.c **** 0b11001110, // , 141:yack.c **** 0b11100010, // : 142:yack.c **** 0b10101010, // ; 143:yack.c **** 0b01001010, // " 144:yack.c **** 0b00010011, // $ 145:yack.c **** 0b01111010, // ' (Apostrophe) 146:yack.c **** 0b10110100, // ( or [ (also prosign KN) 147:yack.c **** 0b10110110, // ) or ] 148:yack.c **** 0b10000110, // - (Hyphen or single dash) 149:yack.c **** 0b01101010, // @ 150:yack.c **** 0b00110110, // _ (Underline) 151:yack.c **** 0b01010010, // Paragaraph break symbol 152:yack.c **** 0b10001100, // = and BT 153:yack.c **** 0b00010110, // SK 154:yack.c **** 0b01010100, // + and AR 155:yack.c **** 0b10001011, // BK 156:yack.c **** 0b01000100, // AS 157:yack.c **** 0b10101100, // KA (also ! in alternate Continental Morse) 158:yack.c **** 0b00010100, // VE 159:yack.c **** 0b01011000 // AA 160:yack.c **** }; 161:yack.c **** 162:yack.c **** 163:yack.c **** // The special characters at the end of the above table can not be decoded 164:yack.c **** // without a small table to define their content. # stands for SK, $ for AR 165:yack.c **** 166:yack.c **** // To add new characters, add them in the code table above at the end and below 167:yack.c **** // Do not forget to increase the legth of the array.. 168:yack.c **** 169:yack.c **** const char spechar[24] PROGMEM = "?./!,:;~$^()-@_|=#+*%&<>"; 170:yack.c **** 171:yack.c **** 172:yack.c **** 173:yack.c **** // Functions 174:yack.c **** 175:yack.c **** // *************************************************************************** 176:yack.c **** // Control functions 177:yack.c **** // *************************************************************************** 178:yack.c **** 179:yack.c **** void yackreset (void) 180:yack.c **** /*! 181:yack.c **** @brief Sets all yack parameters to standard values 182:yack.c **** 183:yack.c **** This function resets all YACK EEPROM settings to their default values as 184:yack.c **** stored in the .h file. It sets the dirty flag and calls the save routine 185:yack.c **** to write the data into EEPROM immediately. 186:yack.c **** */ 187:yack.c **** { 188:yack.c **** 189:yack.c **** ctcvalue=DEFCTC; // Initialize to 800 Hz 190:yack.c **** wpm=DEFWPM; // Init to default speed 191:yack.c **** wpmcnt=(1200/YACKBEAT)/DEFWPM; // default speed 192:yack.c **** farnsworth=0; // No Farnsworth gap 193:yack.c **** yackflags = FLAGDEFAULT; 194:yack.c **** 195:yack.c **** volflags |= DIRTYFLAG; 196:yack.c **** yacksave(); // Store them in EEPROM 197:yack.c **** 198:yack.c **** } 199:yack.c **** 200:yack.c **** 201:yack.c **** void yackinit (void) 202:yack.c **** /*! 203:yack.c **** @brief Initializes the YACK library 204:yack.c **** 205:yack.c **** This function initializes the keyer hardware according to configurations in the .h file. 206:yack.c **** Then it attempts to read saved configuration settings from EEPROM. If not possible, it 207:yack.c **** will reset all values to their defaults. 208:yack.c **** This function must be called once before the remaining fuctions can be used. 209:yack.c **** */ 210:yack.c **** { 211:yack.c **** 212:yack.c **** byte magval; 213:yack.c **** 214:yack.c **** // Configure DDR. Make OUT and ST output ports 215:yack.c **** SETBIT (OUTDDR,OUTPIN); 216:yack.c **** SETBIT (STDDR,STPIN); 217:yack.c **** 218:yack.c **** // Raise internal pullups for all inputs 219:yack.c **** SETBIT (KEYPORT,DITPIN); 220:yack.c **** SETBIT (KEYPORT,DAHPIN); 221:yack.c **** SETBIT (BTNPORT,BTNPIN); 222:yack.c **** 223:yack.c **** magval = eeprom_read_byte(&magic); // Retrieve magic value 224:yack.c **** 225:yack.c **** if (magval == MAGPAT) // Is memory valid 226:yack.c **** { 227:yack.c **** ctcvalue = eeprom_read_word(&ctcstor); // Retrieve last ctc setting 228:yack.c **** wpm = eeprom_read_byte(&wpmstor); // Retrieve last wpm setting 229:yack.c **** wpmcnt=(1200/YACKBEAT)/wpm; // Calculate speed 230:yack.c **** farnsworth = eeprom_read_byte(&fwstor); // Retrieve last wpm setting 231:yack.c **** yackflags = eeprom_read_byte(&flagstor); // Retrieve last flags 232:yack.c **** } 233:yack.c **** else 234:yack.c **** { 235:yack.c **** yackreset(); 236:yack.c **** } 237:yack.c **** 238:yack.c **** yackinhibit(OFF); 239:yack.c **** 240:yack.c **** #ifdef POWERSAVE 241:yack.c **** 242:yack.c **** PCMSK |= PWRWAKE; // Define which keys wake us up 243:yack.c **** GIMSK |= (1< 0)) 438:yack.c **** farnsworth--; 439:yack.c **** 440:yack.c **** if ((dir == DOWN) && (farnsworth < MAXFARN)) 441:yack.c **** farnsworth++; 442:yack.c **** } 443:yack.c **** else // WPMSPEED 444:yack.c **** { 445:yack.c **** if ((dir == UP) && (wpm < MAXWPM)) 446:yack.c **** wpm++; 447:yack.c **** 448:yack.c **** if ((dir == DOWN) && (wpm > MINWPM)) 449:yack.c **** wpm--; 450:yack.c **** 451:yack.c **** wpmcnt=(1200/YACKBEAT)/wpm; // Calculate beats 452:yack.c **** 453:yack.c **** } 454:yack.c **** 455:yack.c **** volflags |= DIRTYFLAG; // Set the dirty flag 456:yack.c **** 457:yack.c **** yackplay(DIT); 458:yack.c **** yackdelay(IEGLEN); // Inter Element gap 459:yack.c **** yackplay(DAH); 460:yack.c **** yackdelay(ICGLEN); // Inter Character gap 461:yack.c **** yackfarns(); // Additional Farnsworth delay 462:yack.c **** 463:yack.c **** } 464:yack.c **** 465:yack.c **** 466:yack.c **** 467:yack.c **** void yackbeat (void) 468:yack.c **** /*! 469:yack.c **** @brief Heartbeat delay 470:yack.c **** 471:yack.c **** Several functions in the keyer are timing dependent. The most prominent example is the 472:yack.c **** yackiambic function that implements the IAMBIC keyer finite state machine. 473:yack.c **** The same expects to be called in intervals of YACKBEAT milliseconds. How this is 474:yack.c **** implemented is left to the user. In a more complex application this would be done 475:yack.c **** using an interrupt or a timer. For simpler cases this is a busy wait routine 476:yack.c **** that delays exactly YACKBEAT ms. 477:yack.c **** 478:yack.c **** */ 479:yack.c **** { 480:yack.c **** while((TIFR & (1< MINCTC) 506:yack.c **** ctcvalue = MINCTC; 507:yack.c **** 269 ,0,507,.LM19-.LFBB5 270 .LM19: 271 .LFBB5: 272 /* prologue: function */ 273 /* frame size = 0 */ 508:yack.c **** DIRTYFLAG; // Set the dirty flag 274 bn 68,0,508,.LM20-.LFBB5 275 .LM20: 276 00a8 8130 cpi r24,lo8(1) 277 00aa 01F4 brne .L14 509:yack.c **** 278 abn 68,0,509,.LM21-.LFBB5 279 .LM21: 280 00ac 8091 0000 lds r24,ctcvalue 281 00b0 9091 0000 lds r25,(ctcvalue)+1 282 00b4 0197 sbiw r24,1 283 00b6 00C0 rjmp .L19 284 .L14: 510:yack.c **** } 285 68,0,510,.LM22-.LFBB5 286 .LM22: 287 00b8 8230 cpi r24,lo8(2) 288 00ba 01F4 brne .L15 511:yack.c **** 289 abn 68,0,511,.LM23-.LFBB5 290 .LM23: 291 00bc 8091 0000 lds r24,ctcvalue 292 00c0 9091 0000 lds r25,(ctcvalue)+1 293 00c4 0196 adiw r24,1 294 .L19: 295 00c6 9093 0000 sts (ctcvalue)+1,r25 296 00ca 8093 0000 sts ctcvalue,r24 297 .L15: 512:yack.c **** 513:yack.c **** 298 8,0,513,.LM24-.LFBB5 299 .LM24: 300 00ce 8091 0000 lds r24,ctcvalue 301 00d2 9091 0000 lds r25,(ctcvalue)+1 302 00d6 8897 sbiw r24,40 303 00d8 00F4 brsh .L16 514:yack.c **** oid yacktune (void) 304 n 68,0,514,.LM25-.LFBB5 305 .LM25: 306 00da 88E2 ldi r24,lo8(40) 307 00dc 90E0 ldi r25,hi8(40) 308 00de 9093 0000 sts (ctcvalue)+1,r25 309 00e2 8093 0000 sts ctcvalue,r24 310 .L16: 515:yack.c **** *! 516:yack.c **** @brief Activates Tuning mode 311 68,0,516,.LM26-.LFBB5 312 .LM26: 313 00e6 8091 0000 lds r24,ctcvalue 314 00ea 9091 0000 lds r25,(ctcvalue)+1 315 00ee 8C39 cpi r24,156 316 00f0 9105 cpc r25,__zero_reg__ 317 00f2 00F0 brlo .L17 517:yack.c **** This produces a solid keydown for TUNEDURATION seconds. After this the TX is unkeyed. 318 68,0,517,.LM27-.LFBB5 319 .LM27: 320 00f4 8BE9 ldi r24,lo8(155) 321 00f6 90E0 ldi r25,hi8(155) 322 00f8 9093 0000 sts (ctcvalue)+1,r25 323 00fc 8093 0000 sts ctcvalue,r24 324 .L17: 518:yack.c **** The same can be achieved by presing either the DIT or the DAH contact or the control key. 519:yack.c **** 325 68,0,519,.LM28-.LFBB5 326 .LM28: 327 0100 8091 0000 lds r24,volflags 328 0104 8460 ori r24,lo8(4) 329 0106 8093 0000 sts volflags,r24 330 /* epilogue start */ 520:yack.c **** 521:yack.c **** { 331 n 68,0,521,.LM29-.LFBB5 332 .LM29: 333 010a 0895 ret 335 .Lscope5: 338 .global yackmode 340 yackmode: 522:yack.c **** word timer = YACKSECS(TUNEDURATION); 523:yack.c **** 524:yack.c **** key(DOWN); 525:yack.c **** 526:yack.c **** while(timer && (KEYINP & (1<0 if flag(s) were set 565:yack.c **** 346 bn 68,0,565,.LM31-.LFBB6 347 .LM31: 348 010c 9091 0000 lds r25,yackflags 349 0110 937F andi r25,lo8(-13) 350 0112 982B or r25,r24 351 0114 9093 0000 sts yackflags,r25 566:yack.c **** 567:yack.c **** { 352 n 68,0,567,.LM32-.LFBB6 353 .LM32: 354 0118 8091 0000 lds r24,volflags 355 011c 8460 ori r24,lo8(4) 356 011e 8093 0000 sts volflags,r24 357 /* epilogue start */ 568:yack.c **** return yackflags & flag; 569:yack.c **** } 358 n 68,0,569,.LM33-.LFBB6 359 .LM33: 360 0122 0895 ret 362 .Lscope6: 365 .global yackflag 367 yackflag: 570:yack.c **** 571:yack.c **** void yacktoggle(byte flag) 572:yack.c **** /*! 573:yack.c **** @brief Toggle feature flags 574:yack.c **** 575:yack.c **** When passed one (or more) flags, this routine flips the according bit in yackflags and 576:yack.c **** thereby enables or disables the corresponding feature. 577:yack.c **** 578:yack.c **** @param flag A byte where any bit to toggle is set e.g. SIDETONE 579:yack.c **** @return TRUE if all was OK, FALSE if configuration lock prevented changes 580:yack.c **** 368 ,0,580,.LM34-.LFBB7 369 .LM34: 370 .LFBB7: 371 /* prologue: function */ 372 /* frame size = 0 */ 374 .LM35: 375 0124 9091 0000 lds r25,yackflags 581:yack.c **** 582:yack.c **** yackflags ^= flag; // Toggle the feature bit 376 68,0,582,.LM36-.LFBB7 377 .LM36: 378 0128 8923 and r24,r25 379 /* epilogue start */ 380 012a 0895 ret 382 .Lscope7: 385 .global yacktoggle 387 yacktoggle: 583:yack.c **** volflags |= DIRTYFLAG; // Set the dirty flag 584:yack.c **** 585:yack.c **** } 586:yack.c **** 587:yack.c **** 588:yack.c **** 589:yack.c **** 590:yack.c **** void yackerror (void) 591:yack.c **** /*! 592:yack.c **** @brief Creates a series of 8 dits 593:yack.c **** 594:yack.c **** The error prosign (8 dits) can not be encoded in our coding table. A call to this 595:yack.c **** function produces it.. 596:yack.c **** 597:yack.c **** */ 388 ,597,.LM37-.LFBB8 389 .LM37: 390 .LFBB8: 391 /* prologue: function */ 392 /* frame size = 0 */ 598:yack.c **** or (i=0;i<8;i++) 599:yack.c **** { 393 bn 68,0,599,.LM38-.LFBB8 394 .LM38: 395 012c 9091 0000 lds r25,yackflags 396 0130 9827 eor r25,r24 397 0132 9093 0000 sts yackflags,r25 600:yack.c **** yackplay(DIT); 398 bn 68,0,600,.LM39-.LFBB8 399 .LM39: 400 0136 8091 0000 lds r24,volflags 401 013a 8460 ori r24,lo8(4) 402 013c 8093 0000 sts volflags,r24 403 /* epilogue start */ 601:yack.c **** yackdelay(DITLEN); 602:yack.c **** } 404 n 68,0,602,.LM40-.LFBB8 405 .LM40: 406 0140 0895 ret 408 .Lscope8: 412 key: 603:yack.c **** ackdelay(DAHLEN); 604:yack.c **** 605:yack.c **** } 606:yack.c **** 607:yack.c **** 608:yack.c **** 609:yack.c **** 610:yack.c **** // *************************************************************************** 611:yack.c **** // CW Playback related functions 612:yack.c **** // *************************************************************************** 613:yack.c **** 614:yack.c **** static void key(byte mode) 615:yack.c **** /*! 616:yack.c **** @brief Keys the transmitter and produces a sidetone 617:yack.c **** 618:yack.c **** .. but only if the corresponding functions (TXKEY and SIDETONE) have been set in 619:yack.c **** the feature register. This function also handles a request to invert the keyer line 620:yack.c **** if necessary (TXINV bit). 621:yack.c **** 622:yack.c **** This is a private function. 623:yack.c **** 624:yack.c **** @param mode UP or DOWN 625:yack.c **** 626:yack.c **** */ 627:yack.c **** { 628:yack.c **** 629:yack.c **** if (mode == DOWN) 630:yack.c **** { 631:yack.c **** if (volflags & SIDETONE) // Are we generating a Sidetone? 632:yack.c **** { 633:yack.c **** OCR0A = ctcvalue; // Then switch on the Sidetone generator 634:yack.c **** OCR0B = ctcvalue; 635:yack.c **** 636:yack.c **** // Activate CTC mode 637:yack.c **** TCCR0A |= (1<='0' && c<='9') // Is it a numerical digit? 768:yack.c **** code = pgm_read_byte(&morse[c-'0']); // Find it in the beginning of array 660 17 661 ret 663 021e 00D0 .Lscope13: 769:yack.c **** 770:yack.c **** if(c>='a' && c<='z') // Is it a character? 665 al yackerror 667 0220 1F91 yackerror: 669 .LM83: 670 .LFBB14: 671 push r17 672 /* prologue: function */ 673 /* frame size = 0 */ 675 .LM84: 676 ldi r17,lo8(0) 677 .L58: 679 .LM85: 680 ldi r24,lo8(1) 681 rcall yackplay 683 0226 10E0 .LM86: 684 ldi r24,lo8(1) 685 rcall yackdelay 687 0228 81E0 .LM87: 688 022a 00D0 subi r17,lo8(-(1)) 689 cpi r17,lo8(8) 690 brne .L58 692 022e 00D0 .LM88: 693 ldi r24,lo8(3) 694 rcall yackdelay 695 0230 1F5F /* epilogue start */ 697 0234 01F4 .LM89: 698 pop r17 699 ret 704 .Lscope14: 708 .global yackspeed 710 yackspeed: 712 .LM90: 713 .LFBB15: 714 /* prologue: function */ 715 /* frame size = 0 */ 717 .LM91: 718 cpi r22,lo8(1) 719 brne .L62 721 .LM92: 722 cpi r24,lo8(1) 723 brne .L63 724 lds r24,farnsworth 725 023e 6130 tst r24 726 0240 01F4 breq .L64 728 .LM93: 729 0242 8130 subi r24,lo8(-(-1)) 730 0244 01F4 rjmp .L69 731 0246 8091 0000 .L63: 733 024c 01F0 .LM94: 734 cpi r24,lo8(2) 735 brne .L64 736 024e 8150 lds r24,farnsworth 737 0250 00C0 cpi r24,lo8(-1) 738 breq .L64 740 .LM95: 741 0252 8230 subi r24,lo8(-(1)) 742 0254 01F4 .L69: 743 0256 8091 0000 sts farnsworth,r24 744 025a 8F3F rjmp .L64 745 025c 01F0 .L62: 747 .LM96: 748 025e 8F5F cpi r24,lo8(1) 749 brne .L65 750 0260 8093 0000 lds r24,wpm 751 0264 00C0 cpi r24,lo8(50) 752 brsh .L66 754 .LM97: 755 0266 8130 subi r24,lo8(-(1)) 756 0268 01F4 rjmp .L68 757 026a 8091 0000 .L65: 759 0270 00F4 .LM98: 760 cpi r24,lo8(2) 761 brne .L66 762 0272 8F5F lds r24,wpm 763 0274 00C0 cpi r24,lo8(6) 764 brlo .L66 766 .LM99: 767 0276 8230 subi r24,lo8(-(-1)) 768 0278 01F4 .L68: 769 027a 8091 0000 sts wpm,r24 770 027e 8630 .L66: 772 .LM100: 773 lds r22,wpm 774 0282 8150 ldi r24,lo8(240) 775 ldi r25,hi8(240) 776 0284 8093 0000 ldi r23,lo8(0) 777 rcall __divmodhi4 778 sts (wpmcnt)+1,r23 779 sts wpmcnt,r22 780 0288 6091 0000 .L64: 782 028e 90E0 .LM101: 783 0290 70E0 lds r24,volflags 784 0292 00D0 ori r24,lo8(4) 785 0294 7093 0000 sts volflags,r24 787 .LM102: 788 ldi r24,lo8(1) 789 rcall yackplay 791 02a0 8460 .LM103: 792 02a2 8093 0000 ldi r24,lo8(1) 793 rcall yackdelay 795 02a6 81E0 .LM104: 796 02a8 00D0 ldi r24,lo8(2) 797 rcall yackplay 799 02aa 81E0 .LM105: 800 02ac 00D0 ldi r24,lo8(3) 801 rcall yackdelay 803 02ae 82E0 .LM106: 804 02b0 00D0 rcall yackfarns 805 /* epilogue start */ 807 02b2 83E0 .LM107: 808 02b4 00D0 ret 810 .Lscope15: 813 keylatch: 815 02b8 0895 .LM108: 816 .LFBB16: 817 /* prologue: function */ 818 /* frame size = 0 */ 820 .LM109: 771:yack.c **** code = pgm_read_byte(&morse[c-'a'+10]); // Find it from position 10 772:yack.c **** 773:yack.c **** if(c>='A' && c<='Z') // Is it a character in upper case? 774:yack.c **** code = pgm_read_byte(&morse[c-'A'+10]); // Same as above 775:yack.c **** 776:yack.c **** // Last we need to handle special characters. There is a small char 777:yack.c **** // array "spechar" which contains the characters for the morse elements 778:yack.c **** // at the end of the "morse" array (see there!) 779:yack.c **** for(i=0;i=RBSIZE) // End of buffer reached? 1043:yack.c **** { 1044:yack.c **** yackerror(); 1045:yack.c **** i = 0; 1046:yack.c **** } 1047:yack.c **** 1048:yack.c **** yackbeat(); // 10 ms heartbeat 1049:yack.c **** } 1050:yack.c **** 1051:yack.c **** // Extimer has expired. Message has ended 1052:yack.c **** 1053:yack.c **** if(i) // Was anything received at all? 1054:yack.c **** { 1055:yack.c **** rambuffer[--i] = 0; // Add a \0 end marker over last space 1056:yack.c **** 1057:yack.c **** // Replay the message 1058:yack.c **** //for (n=0;n 38:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** 39:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** /** \file */ 40:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** /** \defgroup util_delay_basic : Basic busy-wait delay loops 41:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** \code 42:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** #include 43:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** \endcode 44:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** 45:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** The functions in this header file implement simple delay loops 46:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** that perform a busy-waiting. They are typically used to 47:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** facilitate short delays in the program execution. They are 48:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** implemented as count-down loops with a well-known CPU cycle 49:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** count per loop iteration. As such, no other processing can 50:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** occur simultaneously. It should be kept in mind that the 51:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** functions described here do not disable interrupts. 52:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** 53:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** In general, for long delays, the use of hardware timers is 54:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** much preferrable, as they free the CPU, and allow for 55:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** concurrent processing of other events while the timer is 56:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** running. However, in particular for very short delays, the 57:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** overhead of setting up a hardware timer is too much compared 58:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** to the overall delay time. 59:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** 60:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** Two inline functions are provided for the actual delay algorithms. 61:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** 62:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** */ 63:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** 64:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** #if !defined(__DOXYGEN__) 65:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** static inline void _delay_loop_1(uint8_t __count) __attribute__((always_inline)); 66:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** static inline void _delay_loop_2(uint16_t __count) __attribute__((always_inline)); 67:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** #endif 68:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** 69:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** /** \ingroup util_delay_basic 70:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** 71:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** Delay loop using an 8-bit counter \c __count, so up to 256 72:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** iterations are possible. (The value 256 would have to be passed 73:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** as 0.) The loop executes three CPU cycles per iteration, not 74:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** including the overhead the compiler needs to setup the counter 75:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** register. 76:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** 77:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** Thus, at a CPU speed of 1 MHz, delays of up to 768 microseconds 78:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** can be achieved. 79:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** */ 80:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** void 81:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** _delay_loop_1(uint8_t __count) 82:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** { 83:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** __asm__ volatile ( 84:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** "1: dec %0" "\n\t" 85:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** "brne 1b" 86:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** : "=r" (__count) 87:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** : "0" (__count) 88:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** ); 89:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** } 90:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** 91:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** /** \ingroup util_delay_basic 92:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** 93:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** Delay loop using a 16-bit counter \c __count, so up to 65536 94:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** iterations are possible. (The value 65536 would have to be 95:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** passed as 0.) The loop executes four CPU cycles per iteration, 96:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** not including the overhead the compiler requires to setup the 97:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** counter register pair. 98:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** 99:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** Thus, at a CPU speed of 1 MHz, delays of up to about 262.1 100:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** milliseconds can be achieved. 101:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** */ 102:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** void 103:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** _delay_loop_2(uint16_t __count) 104:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** { 105:d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h **** __asm__ volatile ( 1424 ldi r22,lo8(0) 1425 rcall yackspeed 1427 05bc 90E3 .LM197: 1428 andi r17,lo8(-9) 1429 .L130: 1431 05c0 01F4 .LM198: 1432 sbis 54-32,2 1433 rjmp .L125 1434 05c2 00C0 .LBB39: 1435 .LBB40: 1436 .LBB41: 1437 .LBB42: 1439 .Ltext3: 1441 .LM199: 1442 ldi r24,lo8(12500) 1443 ldi r25,hi8(12500) 1444 05c4 B399 /* #APP */ 1445 05c6 00C0 ; 105 "d:/applications/winavr/lib/gcc/../../avr/include/util/delay_basic.h" 1 1446 1: sbiw r24,1 1447 brne 1b 1448 05c8 82E0 ; 0 "" 2 1449 05ca 60E0 /* #NOAPP */ 1450 05cc 00D0 .LBE42: 1451 .LBE41: 1452 .LBE40: 1453 05ce 177F .LBE39: 1455 .Ltext4: 1457 05d0 B499 .LM200: 1458 05d2 00C0 rcall yacksave 1459 .L122: 1461 05d4 81E0 .LM201: 1462 05d6 60E0 sts volflags,r17 1464 .LM202: 1465 cpi r16,lo8(1) 1466 05da 177F brne .L126 1468 .LM203: 1469 mov r24,r17 1470 05dc B29B andi r24,lo8(-9) 1471 05de 00C0 sts volflags,r24 1472 .L126: 1473 mov r24,r17 1474 ldi r25,lo8(0) 1475 ldi r20,3 1476 1: lsr r25 1477 ror r24 1478 dec r20 1479 brne 1b 1481 05e2 90E3 .LM204: 1482 andi r24,lo8(1) 1483 /* epilogue start */ 1484 05e4 0197 pop r17 1485 05e6 01F4 pop r16 1486 ret 1491 .Lscope20: 1494 .global yackchar 1496 05e8 00D0 yackchar: 1498 .LM205: 1499 .LFBB21: 1500 05ea 1093 0000 push r17 1501 /* prologue: function */ 1502 /* frame size = 0 */ 1503 05ee 0130 mov r18,r24 1505 .LM206: 1506 subi r24,lo8(-(-48)) 1507 05f2 812F cpi r24,lo8(10) 1508 05f4 877F brlo .L132 1509 05f6 8093 0000 ldi r17,lo8(-128) 1510 rjmp .L133 1511 05fa 812F .L132: 1512 05fc 90E0 .LBB43: 1514 0600 9695 .LM207: 1515 0602 8795 mov r30,r18 1516 0604 4A95 ldi r31,lo8(0) 1517 0606 01F4 subi r30,lo8(-(morse-48)) 1518 sbci r31,hi8(-(morse-48)) 1519 /* #APP */ 1520 0608 8170 ; 799 "yack.c" 1 1521 lpm r17, Z 1522 060a 1F91 1523 060c 0F91 ; 0 "" 2 1524 060e 0895 /* #NOAPP */ 1525 .L133: 1526 .LBE43: 1528 .LM208: 1529 mov r24,r18 1530 subi r24,lo8(-(-97)) 1531 cpi r24,lo8(26) 1532 brsh .L134 1533 .LBB44: 1535 .LM209: 1536 mov r30,r18 1537 ldi r31,lo8(0) 1538 0610 1F93 subi r30,lo8(-(morse-87)) 1539 sbci r31,hi8(-(morse-87)) 1540 /* #APP */ 1541 0612 282F ; 802 "yack.c" 1 1542 lpm r17, Z 1543 1544 0614 8053 ; 0 "" 2 1545 0616 8A30 /* #NOAPP */ 1546 0618 00F0 .L134: 1547 061a 10E8 .LBE44: 1549 .LM210: 1550 mov r24,r18 1551 subi r24,lo8(-(-65)) 1552 cpi r24,lo8(26) 1553 061e E22F brsh .L135 1554 0620 F0E0 .LBB45: 1556 0624 F040 .LM211: 1557 mov r30,r18 1558 ldi r31,lo8(0) 1559 0626 1491 subi r30,lo8(-(morse-55)) 1560 sbci r31,hi8(-(morse-55)) 1561 /* #APP */ 1562 ; 805 "yack.c" 1 1563 lpm r17, Z 1564 1565 ; 0 "" 2 1566 /* #NOAPP */ 1567 0628 822F .L135: 1568 062a 8156 ldi r24,lo8(0) 1569 062c 8A31 ldi r25,hi8(0) 1570 062e 00F4 .L137: 1571 .LBE45: 1572 .LBB46: 1574 0630 E22F .LM212: 1575 0632 F0E0 movw r30,r24 1576 0634 E050 subi r30,lo8(-(spechar)) 1577 0636 F040 sbci r31,hi8(-(spechar)) 1578 /* #APP */ 1579 ; 811 "yack.c" 1 1580 0638 1491 lpm r30, Z 1581 1582 ; 0 "" 2 1583 /* #NOAPP */ 1584 .LBE46: 1585 cp r18,r30 1586 brne .L136 1587 .LBB47: 1589 063c 8154 .LM213: 1590 063e 8A31 movw r30,r24 1591 0640 00F4 subi r30,lo8(-(morse+36)) 1592 sbci r31,hi8(-(morse+36)) 1593 /* #APP */ 1594 ; 812 "yack.c" 1 1595 0642 E22F lpm r17, Z 1596 0644 F0E0 1597 0646 E050 ; 0 "" 2 1598 0648 F040 /* #NOAPP */ 1599 .L136: 1600 adiw r24,1 1601 064a 1491 .LBE47: 1603 .LM214: 1604 cpi r24,24 1605 cpc r25,__zero_reg__ 1606 064c 80E0 brne .L137 1608 .LM215: 1609 cpi r18,lo8(32) 1610 brne .L145 1612 .LM216: 1613 0650 FC01 ldi r24,lo8(4) 1614 0652 E050 rcall yackdelay 1615 0654 F040 rjmp .L143 1616 .L142: 1618 0656 E491 .LM217: 1619 ldi r24,lo8(0) 1620 rcall yackctrlkey 1621 tst r24 1622 brne .L143 1624 065a 01F4 .LM218: 1625 sbrs r17,7 1626 rjmp .L140 1628 065c FC01 .LM219: 1629 065e E050 ldi r24,lo8(2) 1630 0660 F040 rjmp .L146 1631 .L140: 1633 0662 1491 .LM220: 1634 ldi r24,lo8(1) 1635 .L146: 1636 rcall yackplay 1638 0664 0196 .LM221: 1639 ldi r24,lo8(1) 1640 rcall yackdelay 1642 0666 8831 .LM222: 1643 0668 9105 lsl r17 1644 066a 01F4 .L145: 1646 .LM223: 1647 066c 2032 cpi r17,lo8(-128) 1648 066e 01F4 brne .L142 1650 .LM224: 1651 0670 84E0 ldi r24,lo8(2) 1652 0672 00D0 rcall yackdelay 1654 .LM225: 1655 rcall yackfarns 1656 .L143: 1657 0676 80E0 /* epilogue start */ 1659 067a 8823 .LM226: 1660 067c 01F4 pop r17 1661 ret 1669 .Lscope21: 1673 .global yackmessage 1675 yackmessage: 1677 068a 81E0 .LM227: 1678 068c 00D0 .LFBB22: 1679 push r12 1680 push r13 1681 068e 110F push r14 1682 push r15 1683 push r16 1684 push r17 1685 0690 1038 push r29 1686 0692 01F4 push r28 1687 in r28,__SP_L__ 1688 in r29,__SP_H__ 1689 0694 82E0 subi r28,lo8(-(-100)) 1690 0696 00D0 sbci r29,hi8(-(-100)) 1691 in __tmp_reg__,__SREG__ 1692 cli 1693 0698 00D0 out __SP_H__,r29 1694 out __SREG__,__tmp_reg__ 1695 out __SP_L__,r28 1696 /* prologue: function */ 1697 /* frame size = 100 */ 1698 069a 1F91 mov r16,r22 1700 .LM228: 1701 cpi r24,lo8(1) 1702 breq .+2 1703 rjmp .L148 1704 ldi r22,lo8(1000) 1705 mov r14,r22 1706 ldi r22,hi8(1000) 1707 mov r15,r22 1708 ldi r17,lo8(0) 1710 .LM229: 1711 movw r12,r28 1712 sec 1713 adc r12,__zero_reg__ 1714 adc r13,__zero_reg__ 1715 .L153: 1717 069e CF92 .LM230: 1718 06a0 DF92 ldi r24,lo8(1) 1719 06a2 EF92 rcall yackctrlkey 1720 06a4 FF92 tst r24 1721 06a6 0F93 breq .+2 1722 06a8 1F93 rjmp .L164 1724 06ac CF93 .LM231: 1725 06ae CDB7 ldi r24,lo8(1) 1726 06b0 DEB7 rcall yackiambic 1727 06b2 C456 tst r24 1728 06b4 D040 brne .L150 1730 06b8 F894 .LM232: 1731 06ba DEBF sec 1732 06bc 0FBE sbc r14,__zero_reg__ 1733 06be CDBF sbc r15,__zero_reg__ 1734 rjmp .L151 1735 .L150: 1737 .LM233: 1738 movw r30,r12 1739 06c2 8130 add r30,r17 1740 06c4 01F0 adc r31,__zero_reg__ 1741 06c6 00C0 st Z,r24 1742 06c8 68EE subi r17,lo8(-(1)) 1743 06ca E62E ldi r21,lo8(1000) 1744 06cc 63E0 mov r14,r21 1745 06ce F62E ldi r21,hi8(1000) 1746 06d0 10E0 mov r15,r21 1747 .L151: 1749 06d2 6E01 .LM234: 1750 06d4 0894 cpi r17,lo8(100) 1751 06d6 C11C brlo .L165 1753 .LM235: 1754 rcall yackerror 1755 ldi r17,lo8(0) 1756 06da 81E0 .L165: 1757 06dc 00D0 .LBB48: 1758 06de 8823 .LBB49: 1760 06e2 00C0 .LM236: 1761 in __tmp_reg__,88-32 1762 sbrs __tmp_reg__,6 1763 06e4 81E0 rjmp .L165 1765 06e8 8823 .LM237: 1766 06ea 01F4 in r24,88-32 1767 ori r24,lo8(64) 1768 out 88-32,r24 1769 06ec 0894 .LBE49: 1770 06ee E108 .LBE48: 1772 06f2 00C0 .LM238: 1773 cp r14,__zero_reg__ 1774 cpc r15,__zero_reg__ 1775 brne .L153 1777 06f6 E10F .LM239: 1778 06f8 F11D tst r17 1779 06fa 8083 breq .L154 1781 06fe 58EE .LM240: 1782 0700 E52E subi r17,lo8(-(-1)) 1783 0702 53E0 movw r24,r28 1784 0704 F52E adiw r24,1 1785 movw r30,r24 1786 add r30,r17 1787 adc r31,__zero_reg__ 1788 0706 1436 st Z,__zero_reg__ 1790 .LM241: 1791 cpi r16,lo8(1) 1792 070a 00D0 brne .L155 1794 .LM242: 1795 ldi r22,lo8(eebuffer1) 1796 ldi r23,hi8(eebuffer1) 1797 rjmp .L169 1798 .L155: 1800 0710 06FE .LM243: 1801 0712 00C0 cpi r16,lo8(2) 1802 brne .L156 1804 0714 88B7 .LM244: 1805 0716 8064 ldi r22,lo8(eebuffer2) 1806 0718 88BF ldi r23,hi8(eebuffer2) 1807 .L169: 1808 ldi r20,lo8(100) 1809 ldi r21,hi8(100) 1810 rcall __eewr_block_tn85 1811 071a E114 rjmp .L164 1812 071c F104 .L156: 1814 .LM245: 1815 cpi r16,lo8(3) 1816 0720 1123 brne .L157 1818 .LM246: 1819 ldi r22,lo8(eebuffer3) 1820 0724 1150 ldi r23,hi8(eebuffer3) 1821 0726 CE01 rjmp .L169 1822 0728 0196 .L157: 1824 072c E10F .LM247: 1825 072e F11D cpi r16,lo8(4) 1826 0730 1082 brne .L164 1828 .LM248: 1829 0732 0130 ldi r22,lo8(eebuffer4) 1830 0734 01F4 ldi r23,hi8(eebuffer4) 1831 rjmp .L169 1832 .L154: 1834 0738 70E0 .LM249: 1835 073a 00C0 rcall yackerror 1836 rjmp .L164 1837 .L148: 1839 073c 0230 .LM250: 1840 073e 01F4 cpi r24,lo8(2) 1841 brne .L164 1843 0740 60E0 .LM251: 1844 0742 70E0 cpi r22,lo8(1) 1845 brne .L158 1847 0746 50E0 .LM252: 1848 0748 00D0 movw r24,r28 1849 074a 00C0 adiw r24,1 1850 ldi r22,lo8(eebuffer1) 1851 ldi r23,hi8(eebuffer1) 1852 rjmp .L168 1853 074c 0330 .L158: 1855 .LM253: 1856 cpi r22,lo8(2) 1857 0750 60E0 brne .L160 1859 0754 00C0 .LM254: 1860 movw r24,r28 1861 adiw r24,1 1862 ldi r22,lo8(eebuffer2) 1863 0756 0430 ldi r23,hi8(eebuffer2) 1864 0758 01F4 rjmp .L168 1865 .L160: 1867 075a 60E0 .LM255: 1868 075c 70E0 cpi r22,lo8(3) 1869 075e 00C0 brne .L161 1871 .LM256: 1872 movw r24,r28 1873 0760 00D0 adiw r24,1 1874 0762 00C0 ldi r22,lo8(eebuffer3) 1875 ldi r23,hi8(eebuffer3) 1876 rjmp .L168 1877 .L161: 1879 0766 01F4 .LM257: 1880 cpi r22,lo8(4) 1881 brne .L159 1883 076a 01F4 .LM258: 1884 movw r24,r28 1885 adiw r24,1 1886 076c CE01 ldi r22,lo8(eebuffer4) 1887 076e 0196 ldi r23,hi8(eebuffer4) 1888 0770 60E0 .L168: 1889 0772 70E0 ldi r20,lo8(100) 1890 0774 00C0 ldi r21,hi8(100) 1891 rcall __eerd_block_tn85 1892 .L159: 1893 ldi r17,lo8(0) 1895 0778 01F4 .LM259: 1896 movw r14,r28 1897 sec 1898 077a CE01 adc r14,__zero_reg__ 1899 077c 0196 adc r15,__zero_reg__ 1900 077e 60E0 rjmp .L162 1901 0780 70E0 .L163: 1903 .LM260: 1904 ldi r24,lo8(0) 1905 rcall yackctrlkey 1906 0784 6330 tst r24 1907 0786 01F4 brne .L164 1909 .LM261: 1910 0788 CE01 mov r24,r16 1911 078a 0196 rcall yackchar 1913 078e 70E0 .LM262: 1914 0790 00C0 subi r17,lo8(-(1)) 1915 .L162: 1916 movw r30,r14 1917 add r30,r17 1918 0792 6430 adc r31,__zero_reg__ 1919 0794 01F4 ld r16,Z 1920 tst r16 1921 brne .L163 1922 0796 CE01 .L164: 1923 0798 0196 /* epilogue start */ 1925 079c 70E0 .LM263: 1926 subi r28,lo8(-(100)) 1927 079e 44E6 sbci r29,hi8(-(100)) 1928 07a0 50E0 in __tmp_reg__,__SREG__ 1929 07a2 00D0 cli 1930 out __SP_H__,r29 1931 07a4 10E0 out __SREG__,__tmp_reg__ 1932 out __SP_L__,r28 1933 pop r28 1934 07a6 7E01 pop r29 1935 07a8 0894 pop r17 1936 07aa E11C pop r16 1937 07ac F11C pop r15 1938 07ae 00C0 pop r14 1939 pop r13 1940 pop r12 1941 ret 1950 .Lscope22: 1953 .global yacknumber 1955 07c0 E10F yacknumber: 1957 07c4 0081 .LM264: 1958 07c6 0023 .LFBB23: 1959 07c8 01F4 push r14 1960 push r15 1961 push r17 1962 push r29 1963 push r28 1964 07ca CC59 rcall . 1965 07cc DF4F rcall . 1966 07ce 0FB6 push __tmp_reg__ 1967 07d0 F894 in r28,__SP_L__ 1968 07d2 DEBF in r29,__SP_H__ 1969 07d4 0FBE /* prologue: function */ 1970 07d6 CDBF /* frame size = 5 */ 1971 07d8 CF91 movw r18,r24 1973 07dc 1F91 .LM265: 1974 07de 0F91 ldi r17,lo8(0) 1976 07e2 EF90 .LM266: 1977 07e4 DF90 movw r14,r28 1978 07e6 CF90 sec 1979 07e8 0895 adc r14,__zero_reg__ 1980 adc r15,__zero_reg__ 1981 rjmp .L171 1982 .L172: 1983 movw r30,r14 1984 add r30,r17 1985 adc r31,__zero_reg__ 1986 movw r24,r18 1987 ldi r22,lo8(10) 1988 ldi r23,hi8(10) 1989 rcall __udivmodhi4 1990 subi r24,lo8(-(48)) 1991 st Z,r24 1992 subi r17,lo8(-(1)) 1994 .LM267: 1995 movw r24,r18 1996 ldi r22,lo8(10) 1997 07ea EF92 ldi r23,hi8(10) 1998 07ec FF92 rcall __udivmodhi4 1999 07ee 1F93 movw r18,r22 2000 07f0 DF93 .L171: 2002 07f4 00D0 .LM268: 2003 07f6 00D0 cp r18,__zero_reg__ 2004 07f8 0F92 cpc r19,__zero_reg__ 2005 07fa CDB7 brne .L172 2006 07fc DEB7 rjmp .L179 2007 .L175: 2009 07fe 9C01 .LM269: 2010 ldi r24,lo8(1) 2011 rcall yackctrlkey 2012 0800 10E0 tst r24 2013 brne .L174 2015 0802 7E01 .LM270: 2016 0804 0894 subi r17,lo8(-(-1)) 2017 0806 E11C movw r30,r14 2018 0808 F11C add r30,r17 2019 080a 00C0 adc r31,__zero_reg__ 2020 ld r24,Z 2021 080c F701 rcall yackchar 2022 080e E10F rjmp .L178 2023 0810 F11D .L179: 2024 0812 C901 movw r14,r28 2025 0814 6AE0 sec 2026 0816 70E0 adc r14,__zero_reg__ 2027 0818 00D0 adc r15,__zero_reg__ 2028 081a 805D .L178: 2030 081e 1F5F .LM271: 2031 tst r17 2032 brne .L175 2033 0820 C901 .L174: 2035 0824 70E0 .LM272: 2036 0826 00D0 ldi r24,lo8(32) 2037 0828 9B01 rcall yackchar 2038 /* epilogue start */ 2040 .LM273: 2041 082a 2115 pop __tmp_reg__ 2042 082c 3105 pop __tmp_reg__ 2043 082e 01F4 pop __tmp_reg__ 2044 0830 00C0 pop __tmp_reg__ 2045 pop __tmp_reg__ 2046 pop r28 2047 pop r29 2048 0832 81E0 pop r17 2049 0834 00D0 pop r15 2050 0836 8823 pop r14 2051 0838 01F4 ret 2057 0840 F11D .Lscope23: 2060 0846 00C0 .global yackstring 2062 0848 7E01 yackstring: 2064 084c E11C .LM274: 2065 084e F11C .LFBB24: 2066 push r17 2067 push r28 2068 push r29 2069 0850 1123 /* prologue: function */ 2070 0852 01F4 /* frame size = 0 */ 2071 movw r28,r24 2072 rjmp .L181 2073 .L183: 2075 0856 00D0 .LM275: 2076 mov r24,r17 2077 rcall yackchar 2078 .L181: 2079 0858 0F90 movw r30,r28 2080 085a 0F90 .LBB50: 2082 085e 0F90 .LM276: 2083 0860 0F90 adiw r28,1 2084 0862 CF91 /* #APP */ 2085 0864 DF91 ; 857 "yack.c" 1 2086 0866 1F91 lpm r17, Z 2087 0868 FF90 2088 086a EF90 ; 0 "" 2 2089 086c 0895 /* #NOAPP */ 2090 .LBE50: 2091 tst r17 2092 breq .L184 2093 ldi r24,lo8(1) 2094 rcall yackctrlkey 2095 tst r24 2096 breq .L183 2097 .L184: 2098 /* epilogue start */ 2100 .LM277: 2101 pop r29 2102 pop r28 2103 pop r17 2104 086e 1F93 ret 2110 0876 00C0 .Lscope24: 2112 .global yacktune 2114 0878 812F yacktune: 2116 .LM278: 2117 087c FE01 .LFBB25: 2118 push r28 2119 push r29 2120 /* prologue: function */ 2121 087e 2196 /* frame size = 0 */ 2123 .LM279: 2124 0880 1491 ldi r24,lo8(2) 2125 rcall key 2126 ldi r28,lo8(4000) 2127 ldi r29,hi8(4000) 2128 rjmp .L186 2129 0882 1123 .L189: 2131 0886 81E0 .LM280: 2132 0888 00D0 sbiw r28,1 2133 088a 8823 .L187: 2134 088c 01F0 .LBB51: 2135 .LBB52: 2137 .LM281: 2138 in __tmp_reg__,88-32 2139 088e DF91 sbrs __tmp_reg__,6 2140 0890 CF91 rjmp .L187 2142 0894 0895 .LM282: 2143 in r24,88-32 2144 ori r24,lo8(64) 2145 out 88-32,r24 2146 .LBE52: 2147 .LBE51: 2149 .LM283: 2150 sbiw r28,0 2151 breq .L188 2152 .L186: 2153 sbis 54-32,3 2154 rjmp .L188 2155 sbis 54-32,4 2156 0896 CF93 rjmp .L188 2157 0898 DF93 ldi r24,lo8(1) 2158 rcall yackctrlkey 2159 tst r24 2160 breq .L189 2161 .L188: 2163 089c 00D0 .LM284: 2164 089e C0EA ldi r24,lo8(1) 2165 08a0 DFE0 rcall key 2166 08a2 00C0 /* epilogue start */ 2168 .LM285: 2169 pop r29 2170 08a4 2197 pop r28 2171 ret 2176 08a6 08B6 .Lscope25: 2178 08aa 00C0 .global yackreset 2180 yackreset: 2182 08ae 8064 .LM286: 2183 08b0 88BF .LFBB26: 2184 /* prologue: function */ 2185 /* frame size = 0 */ 2187 .LM287: 2188 08b2 2097 ldi r24,lo8(77) 2189 08b4 01F0 ldi r25,hi8(77) 2190 sts (ctcvalue)+1,r25 2191 08b6 B39B sts ctcvalue,r24 2193 08ba B49B .LM288: 2194 08bc 00C0 ldi r24,lo8(15) 2195 08be 81E0 sts wpm,r24 2197 08c2 8823 .LM289: 2198 08c4 01F0 ldi r24,lo8(16) 2199 ldi r25,hi8(16) 2200 sts (wpmcnt)+1,r25 2201 sts wpmcnt,r24 2203 08c8 00D0 .LM290: 2204 sts farnsworth,__zero_reg__ 2206 .LM291: 2207 08ca DF91 ldi r24,lo8(52) 2208 08cc CF91 sts yackflags,r24 2210 .LM292: 2211 lds r24,volflags 2212 ori r24,lo8(4) 2213 sts volflags,r24 2215 .LM293: 2216 rcall yacksave 2217 /* epilogue start */ 2219 .LM294: 2220 ret 2222 .Lscope26: 2224 .global yackinit 2226 08d0 8DE4 yackinit: 2228 08d4 9093 0000 .LM295: 2229 08d8 8093 0000 .LFBB27: 2230 /* prologue: function */ 2231 /* frame size = 0 */ 2233 08de 8093 0000 .LM296: 2234 sbi 55-32,0 2236 08e2 80E1 .LM297: 2237 08e4 90E0 sbi 55-32,1 2239 08ea 8093 0000 .LM298: 2240 sbi 56-32,3 2242 08ee 1092 0000 .LM299: 2243 sbi 56-32,4 2245 08f2 84E3 .LM300: 2246 08f4 8093 0000 sbi 56-32,2 2248 .LM301: 2249 08f8 8091 0000 ldi r24,lo8(magic) 2250 08fc 8460 ldi r25,hi8(magic) 2251 08fe 8093 0000 rcall __eerd_byte_tn85 2253 .LM302: 2254 0902 00D0 cpi r24,lo8(-91) 2255 brne .L195 2257 .LM303: 2258 0904 0895 ldi r24,lo8(ctcstor) 2259 ldi r25,hi8(ctcstor) 2260 rcall __eerd_word_tn85 2261 sts (ctcvalue)+1,r25 2262 sts ctcvalue,r24 2264 .LM304: 2265 ldi r24,lo8(wpmstor) 2266 ldi r25,hi8(wpmstor) 2267 rcall __eerd_byte_tn85 2268 mov r22,r24 2269 sts wpm,r24 2271 .LM305: 2272 0906 B89A ldi r24,lo8(240) 2273 ldi r25,hi8(240) 2274 ldi r23,lo8(0) 2275 0908 B99A rcall __divmodhi4 2276 sts (wpmcnt)+1,r23 2277 sts wpmcnt,r22 2279 .LM306: 2280 ldi r24,lo8(fwstor) 2281 090c C49A ldi r25,hi8(fwstor) 2282 rcall __eerd_byte_tn85 2283 sts farnsworth,r24 2285 .LM307: 2286 ldi r24,lo8(flagstor) 2287 0910 80E0 ldi r25,hi8(flagstor) 2288 0912 90E0 rcall __eerd_byte_tn85 2289 0914 00D0 sts yackflags,r24 2290 rjmp .L196 2291 .L195: 2293 0918 01F4 .LM308: 2294 rcall yackreset 2295 .L196: 2297 091c 90E0 .LM309: 2298 091e 00D0 ldi r24,lo8(0) 2299 0920 9093 0000 rcall yackinhibit 2301 .LM310: 2302 in r24,53-32 2303 0928 80E0 ori r24,lo8(28) 2304 092a 90E0 out 53-32,r24 2306 092e 682F .LM311: 2307 0930 8093 0000 in r24,91-32 2308 ori r24,lo8(32) 2309 out 91-32,r24 2311 0936 90E0 .LM312: 2312 0938 70E0 ldi r24,lo8(78) 2313 093a 00D0 out 77-32,r24 2315 0940 6093 0000 .LM313: 2316 in r24,80-32 2317 ori r24,lo8(-121) 2318 0944 80E0 out 80-32,r24 2320 0948 00D0 .LM314: 2321 094a 8093 0000 ldi r24,lo8(1) 2322 out 78-32,r24 2323 /* epilogue start */ 2325 0950 90E0 .LM315: 2326 0952 00D0 ret 2328 0958 00C0 .Lscope27: 2329 .global magic 2330 .section .eeprom,"aw",@progbits 2333 magic: 2334 .byte -91 2335 .global flagstor 2338 flagstor: 2339 .byte 52 2340 0960 85B3 .global ctcstor 2343 ctcstor: 2344 .word 77 2345 0966 8BB7 .global wpmstor 2348 wpmstor: 2349 .byte 15 2350 096c 8EE4 .global fwstor 2353 fwstor: 2354 0970 80B7 .skip 1,0 2355 0972 8768 .global user1 2358 user1: 2359 0976 81E0 .skip 2,0 2360 0978 8EBD .global user2 2363 user2: 2364 097a 0895 .skip 2,0 2365 .global eebuffer1 2368 eebuffer1: 2369 .string "message 1" 2370 .skip 90,0 2371 .global eebuffer2 2374 eebuffer2: 2375 .string "message 2" 2376 .skip 90,0 2377 0001 34 .global eebuffer3 2380 eebuffer3: 2381 .string "message 3" 2382 0002 4D00 .skip 90,0 2383 .global eebuffer4 2386 eebuffer4: 2387 0004 0F .string "message 4" 2388 .skip 90,0 2389 .global morse 2390 .section .progmem.data,"a",@progbits 2393 morse: 2394 .byte -4 2395 .byte 124 2396 .byte 60 2397 0006 0000 .byte 28 2398 .byte 12 2399 .byte 4 2400 .byte -124 2401 .byte -60 2402 0008 0000 .byte -28 2403 .byte -12 2404 .byte 96 2405 .byte -120 2406 .byte -88 2407 000a 6D65 7373 .byte -112 2407 6167 6520 2407 3100 2408 0014 0000 0000 .byte 64 2408 0000 0000 2408 0000 0000 2408 0000 0000 2408 0000 0000 2409 .byte 40 2410 .byte -48 2411 .byte 8 2412 .byte 32 2413 006e 6D65 7373 .byte 120 2413 6167 6520 2413 3200 2414 0078 0000 0000 .byte -80 2414 0000 0000 2414 0000 0000 2414 0000 0000 2414 0000 0000 2415 .byte 72 2416 .byte -32 2417 .byte -96 2418 .byte -16 2419 00d2 6D65 7373 .byte 104 2419 6167 6520 2419 3300 2420 00dc 0000 0000 .byte -40 2420 0000 0000 2420 0000 0000 2420 0000 0000 2420 0000 0000 2421 .byte 80 2422 .byte 16 2423 .byte -64 2424 .byte 48 2425 0136 6D65 7373 .byte 24 2425 6167 6520 2425 3400 2426 0140 0000 0000 .byte 112 2426 0000 0000 2426 0000 0000 2426 0000 0000 2426 0000 0000 2427 .byte -104 2428 .byte -72 2429 .byte -56 2430 .byte 50 2431 .byte 86 2432 0000 FC .byte -108 2433 0001 7C .byte -24 2434 0002 3C .byte -50 2435 0003 1C .byte -30 2436 0004 0C .byte -86 2437 0005 04 .byte 74 2438 0006 84 .byte 19 2439 0007 C4 .byte 122 2440 0008 E4 .byte -76 2441 0009 F4 .byte -74 2442 000a 60 .byte -122 2443 000b 88 .byte 106 2444 000c A8 .byte 54 2445 000d 90 .byte 82 2446 000e 40 .byte -116 2447 000f 28 .byte 22 2448 0010 D0 .byte 84 2449 0011 08 .byte -117 2450 0012 20 .byte 68 2451 0013 78 .byte -84 2452 0014 B0 .byte 20 2453 0015 48 .byte 88 2454 0016 E0 .global spechar 2457 0019 68 spechar: 2458 001a D8 .ascii "?./!,:;~$^()-@_|=#+*%&<>" 2459 001b 50 .lcomm volflags,1 2460 001c 10 .lcomm ultimem.1874,1 2461 001d C0 .lcomm iwgflag.1873,1 2462 001e 30 .lcomm bcntr.1872,1 2463 001f 18 .lcomm buffer.1871,1 2464 0020 70 .lcomm lastsymbol.1870,1 2465 0021 98 .lcomm timer.1869,2 2466 0022 B8 .lcomm fsms.1868,1 2467 0023 C8 .lcomm shdntimer.1529,4 2468 0024 32 .lcomm yackflags,1 2469 0025 56 .lcomm ctcvalue,2 2470 0026 94 .lcomm wpmcnt,2 2471 0027 E8 .lcomm wpm,1 2472 0028 CE .lcomm farnsworth,1 2500 .text 2502 .Letext0: 2503 .global __do_clear_bss 2504 ... DEFINED SYMBOLS *ABS*:00000000 yack.c C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2 *ABS*:0000003f __SREG__ C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:3 *ABS*:0000003e __SP_H__ C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:4 *ABS*:0000003d __SP_L__ C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:5 *ABS*:00000034 __CCP__ C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:6 *ABS*:00000000 __tmp_reg__ C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:7 *ABS*:00000001 __zero_reg__ C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:98 .text:00000000 __vector_2 C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:123 .text:00000014 yackpower C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2504 .bss:00000009 shdntimer.1529 C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:224 .text:00000092 yackwpm C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2508 .bss:00000012 wpm C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:241 .text:0000009a yackbeat C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:268 .text:000000a8 yackpitch C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2506 .bss:0000000e ctcvalue .bss:00000000 volflags C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:340 .text:0000010c yackmode C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2505 .bss:0000000d yackflags C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:367 .text:00000124 yackflag C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:387 .text:0000012c yacktoggle C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:412 .text:00000142 key C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:501 .text:00000196 yackinhibit C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:537 .text:000001bc yackdelay C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2507 .bss:00000010 wpmcnt C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:587 .text:000001e2 yackfarns C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2509 .bss:00000013 farnsworth C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:627 .text:00000200 yackplay C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:674 .text:00000224 yackerror C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:717 .text:0000023e yackspeed C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:820 .text:000002ba keylatch C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:874 .text:000002f2 yackiambic C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2502 .bss:00000006 timer.1869 C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2498 .bss:00000002 iwgflag.1873 C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2503 .bss:00000008 fsms.1868 C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2501 .bss:00000005 lastsymbol.1870 C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2497 .bss:00000001 ultimem.1874 C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2499 .bss:00000003 bcntr.1872 C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2500 .bss:00000004 buffer.1871 C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2431 .progmem.data:00000000 morse C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2495 .progmem.data:0000003c spechar C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:1267 .text:0000051e yackuser C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2396 .eeprom:00000006 user1 C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2401 .eeprom:00000008 user2 C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:1340 .text:0000055e yacksave C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2371 .eeprom:00000000 magic C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2381 .eeprom:00000002 ctcstor C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2386 .eeprom:00000004 wpmstor C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2376 .eeprom:00000001 flagstor C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2391 .eeprom:00000005 fwstor C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:1395 .text:000005a6 yackctrlkey C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:1534 .text:00000610 yackchar C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:1713 .text:0000069e yackmessage C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2406 .eeprom:0000000a eebuffer1 C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2412 .eeprom:0000006e eebuffer2 C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2418 .eeprom:000000d2 eebuffer3 C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2424 .eeprom:00000136 eebuffer4 C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:1993 .text:000007ea yacknumber C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2100 .text:0000086e yackstring C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2152 .text:00000896 yacktune C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2218 .text:000008d0 yackreset C:\Users\Don\AppData\Local\Temp/ccmNMTqW.s:2264 .text:00000906 yackinit UNDEFINED SYMBOLS __divmodhi4 __mulhi3 __eerd_word_tn85 __eewr_word_tn85 __eewr_byte_tn85 __eewr_block_tn85 __eerd_block_tn85 __udivmodhi4 __eerd_byte_tn85 __do_clear_bss