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