1 .file "main.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:
90 .global lfsr
92 lfsr:
1:main.c **** /*!
2:main.c ****
3:main.c **** @file main.c
4:main.c **** @brief CW Keyer application
5:main.c **** @author Jan Lategahn DK3LJ jan@lategahn.com (C) 2010 modified by Jack Welch AI4SV; modified by
6:main.c ****
7:main.c **** This file implements a sample CW keyer application by using the yack.c
8:main.c **** library. It is targeted at the ATTINY45 microcontroller but can be used
9:main.c **** for other ATMEL controllers in the same way. Note the enclosed documentation
10:main.c **** for further defails.
11:main.c ****
12:main.c **** This program is free software: you can redistribute it and/or modify
13:main.c **** it under the terms of the GNU General Public License as published by
14:main.c **** the Free Software Foundation, either version 3 of the License, or
15:main.c **** (at your option) any later version.
16:main.c ****
17:main.c **** This program is distributed in the hope that it will be useful,
18:main.c **** but WITHOUT ANY WARRANTY; without even the implied warranty of
19:main.c **** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20:main.c **** GNU General Public License for more details.
21:main.c ****
22:main.c **** You should have received a copy of the GNU General Public License
23:main.c **** along with this program. If not, see .
24:main.c ****
25:main.c **** @version 0.87
26:main.c ****
27:main.c **** @date 15.10.2010 - Created
28:main.c **** @date 16.12.2010 - Submitted to SVN
29:main.c **** @date 03.10.2013 - Last change
30:main.c **** @date 21.12.2016 - Added additional prosigns and punctuation. Added 2 additional memories fo
31:main.c **** Fixed pitch change not saving after timeout. (WD9DMP)
32:main.c **** @date 21.12.2016 - Added a call to save changes to EEPROM while in command mode loop if DIRT
33:main.c **** Changed "SK" response when leaving command mode to "#" which now decodes
34:main.c **** Beacon command ("N") was in both the lockable and unlockable command list, making it unlock
35:main.c ****
36:main.c **** @date 03.01.2017 - Added short 3 DAH delay after command returns before txok ("R") is sent t
37:main.c **** If memory recording is interrupted by command button, keyer now returns t
38:main.c **** Removed playback of recorded message before saving.
39:main.c **** When in Pitch change routine, allow breaking back to command mode with key press. Changes a
40:main.c **** When in Farnsworth spacing change routine, allow breaking back to command mode with key pre
41:main.c **** Changed Farnsworth setting mode to play continuous DIT-DAH when not holding paddle to adjus
42:main.c **** Changed Version command to return to command mode instead of normal mode if interrupted wit
43:main.c **** */
44:main.c ****
45:main.c ****
46:main.c **** #ifndef F_CPU
47:main.c **** #error F_CPU undefined!! Please define in Makefile
48:main.c **** #endif
49:main.c ****
50:main.c **** #include
51:main.c **** #include
52:main.c **** #include
53:main.c **** #include "yack.h"
54:main.c ****
55:main.c **** // Time after which callsign training is assumed complete
56:main.c **** #define TRAINTIMEOUT 10 // 10 Seconds
57:main.c **** #define PITCHREPEAT 10 // 10 e's will be played for pitch adjust
58:main.c **** #define FARNSREPEAT 10 // 10 a's will be played for Farnsworth
59:main.c ****
60:main.c **** // Some texts in Flash used by the application
61:main.c **** const char txok[] PROGMEM = "R";
62:main.c **** const char vers[] PROGMEM = "V0.87";
63:main.c **** const char prgx[] PROGMEM = "#"; // # decodes to prosign SK with no intercharacter gap
64:main.c **** const char imok[] PROGMEM = "73";
65:main.c ****
66:main.c **** void pitch(void)
67:main.c **** /*!
68:main.c **** @brief Pitch change mode
69:main.c ****
70:main.c **** This function implements pitch change mode. A series of dots is played and pitch can
71:main.c **** be adjusted using the paddle levers.
72:main.c ****
73:main.c **** Once 10 dots have been played at the same pitch, the mode terminates
74:main.c **** */
75:main.c **** {
76:main.c **** word timer=PITCHREPEAT;
77:main.c ****
78:main.c **** while (timer) // while not yet timed out
79:main.c **** {
80:main.c **** timer--;
81:main.c **** yackchar('E'); // play an 'e'
82:main.c ****
83:main.c **** if (yackctrlkey(TRUE)) {return;}
84:main.c ****
85:main.c **** if(!(KEYINP & (1<> 1) ^ (-(lfsr & 1u) & 0xB400u);
161:main.c ****
162:main.c **** random = lfsr >> 8; // Byte = upper byte of word
163:main.c ****
164:main.c **** while (random >= n) random -= n; // Cheap modulo :-)
99 r24,lo8(1)
100 andi r25,hi8(1)
101 0002 2091 0000 com r25
102 0006 3091 0000 neg r24
103 000a C901 sbci r25,lo8(-1)
104 000c 8170 andi r24,lo8(-19456)
105 000e 9070 andi r25,hi8(-19456)
106 0010 9095 lsr r19
107 0012 8195 ror r18
108 0014 9F4F eor r24,r18
109 0016 8070 eor r25,r19
110 0018 947B sts (lfsr.1444)+1,r25
111 001a 3695 sts lfsr.1444,r24
113 001e 8227 .LM2:
114 0020 9327 mov r24,r25
115 0022 9093 0000 rjmp .L2
116 0026 8093 0000 .L3:
165:main.c **** turn random;
166:main.c ****
117 LM3-.LFBB1
118 .LM3:
119 002a 892F sub r24,r20
120 002c 00C0 .L2:
121 cp r24,r20
167:main.c ****
168:main.c ****
122 .L3
124 002e 841B .LM4:
125 ldi r25,lo8(0)
126 0030 8417 /* epilogue start */
127 0032 00F4 ret
169:main.c ****
170:main.c ****
171:main.c **** void rndcall(char* call)
172:main.c **** /*!
128 lfsr, .-lfsr
133 .Lscope1:
136 .global rndcall
138 rndcall:
140 .LM5:
141 .LFBB2:
142 push r14
143 push r15
173:main.c **** rief Randomize a callsign
174:main.c ****
175:main.c **** This creates a random callsign with 2 letters + 1 digit + 2 letters
176:main.c ****
177:main.c **** @param call a pointer to a buffer of sufficient size to store the callsign
178:main.c **** */
179:main.c **** {
180:main.c **** byte i;
181:main.c ****
182:main.c **** // Generate a random callsign 2 Char, 1 Digit, 2 Char
183:main.c ****
184:main.c **** for (i=0;i<5;i++)
185:main.c **** {
186:main.c **** if (i == 2)
144 r28
145 push r29
146 /* prologue: function */
147 0038 EF92 /* frame size = 0 */
148 003a FF92 movw r14,r24
150 003e CF93 .LM6:
151 0040 DF93 movw r28,r24
152 ldi r17,lo8(0)
153 .L8:
155 .LM7:
156 cpi r17,lo8(2)
157 0044 EC01 brne .L6
159 .LM8:
187:main.c **** r(10) + '0';
188:main.c **** else
189:main.c **** call[i]=lfsr(26) + 'A';
190:main.c ****
191:main.c **** }
192:main.c **** }
193:main.c ****
160
161 rcall lfsr
162 0048 1230 subi r24,lo8(-(48))
163 004a 01F4 movw r30,r14
194:main.c **** cstrain(void)
164 d Z+2,r24
165 rjmp .L7
166 004c 8AE0 .L6:
168 0050 805D .LM9:
169 0052 F701 ldi r24,lo8(26)
170 0054 8283 rcall lfsr
171 0056 00C0 subi r24,lo8(-(65))
172 st Y,r24
195:main.c **** *!
196:main.c **** @brief Callsign trainer mode
173 abn 68,0,191,.LM10-.LFBB2
174 .LM10:
175 0058 8AE1 subi r17,lo8(-(1))
176 005a 00D0 adiw r28,1
177 005c 8F5B cpi r17,lo8(5)
178 005e 8883 brne .L8
179 /* epilogue start */
181 .LM11:
182 0060 1F5F pop r29
183 0062 2196 pop r28
184 0064 1530 pop r17
185 0066 01F4 pop r15
186 pop r14
197:main.c **** This implements callsign training. The keyer plays a random callsign and the
198:main.c **** user repeats it on the paddle. If a mistake happens, the error prosign is
199:main.c **** sounded, the callsign sent again and the user attempts one more time.
187 dcall, .-rndcall
191 006c 1F91 .Lscope2:
194 0072 0895 .global beacon
196 beacon:
198 .LM12:
199 .LFBB3:
200 push r17
201 push r28
202 push r29
203 /* prologue: function */
204 /* frame size = 0 */
200:main.c ****
201:main.c **** {
202:main.c **** char call[5]; // A buffer to store the callsign
203:main.c **** char c; // The character returned by IAMBIC keyer
204:main.c **** byte i; // Counter
205:main.c **** byte n; // Playback counter
206:main.c **** word timer; // Timeout timer
207:main.c ****
208:main.c **** while(1) // Endless loop will exit throught RETURN statement only
209:main.c ****
210:main.c **** {
211:main.c **** rndcall(call); // Make up a callsign
212:main.c ****
213:main.c **** i=0; // i counts the number of chracters correctly guessed
214:main.c ****
215:main.c **** while(i<5)
216:main.c **** {
217:main.c **** if (!i) // If nothing guessed yet, play the callsign
218:main.c **** {
219:main.c **** yackdelay(2 * IWGLEN); // Give him some time to breathe b4 next callsign
220:main.c **** for (n=0;n<5;n++)
221:main.c **** {
222:main.c **** yackchar(call[n]);
223:main.c **** yackfarns(); // Add potential farnsworth delays
224:main.c **** if(yackctrlkey(TRUE))
225:main.c **** return; // Abort if requested..
226:main.c **** }
227:main.c **** }
228:main.c ****
229:main.c **** timer = YACKSECS(TRAINTIMEOUT);
230:main.c ****
231:main.c **** do
232:main.c **** {
233:main.c ****
234:main.c **** c=yackiambic(OFF); // Wait for a character
235:main.c **** yackbeat(); // FSM heartbeat
236:main.c **** timer--; // Countdown
237:main.c ****
238:main.c **** } while ((!c) && timer && !(yackctrlkey(FALSE))); // Stop when character or timeout
239:main.c ****
240:main.c **** if (timer == 0 || yackctrlkey(TRUE)) // If termination because of timeout
241:main.c **** return; // then return
242:main.c ****
243:main.c **** if (call[i] == c) // Was it the right character?
244:main.c **** i++; // then increment counter
245:main.c **** else
246:main.c **** {
247:main.c **** yackerror(); // Send an error prosign
248:main.c **** i=0; // And reset the counter
249:main.c **** }
250:main.c ****
251:main.c **** }
252:main.c ****
253:main.c **** yackchar ('R');
254:main.c ****
255:main.c **** }
256:main.c **** }
257:main.c ****
258:main.c ****
259:main.c ****
260:main.c **** void beacon(byte mode)
261:main.c **** /*!
262:main.c **** @brief Beacon mode
263:main.c ****
264:main.c **** This routine can read a beacon transmission interval up to
265:main.c **** 9999 seconds and store it in EEPROM (RECORD mode)
266:main.c **** In PLAY mode, when called in the YACKBEAT loop, it plays back
267:main.c **** message 2 in the programmed interval
268:main.c ****
269:main.c **** @param mode RECORD (read and store the beacon interval) or PLAY (beacon)
270:main.c ****
271:main.c **** @see main
272:main.c ****
273:main.c **** */
274:main.c **** {
275:main.c ****
276:main.c **** static word interval = 65000; // A dummy value that can not be reached
277:main.c **** static word timer;
278:main.c **** char c;
279:main.c ****
280:main.c ****
281:main.c **** if (interval == 65000) //
282:main.c **** interval = yackuser(READ, 1, 0);
283:main.c ****
284:main.c **** if (mode == RECORD)
285:main.c **** {
205 bn 68,0,292,.LM13-.LFBB3
206 .LM13:
207 lds r24,interval.1502
208 0074 1F93 lds r25,(interval.1502)+1
209 0076 CF93 subi r24,lo8(-536)
210 0078 DF93 sbci r25,hi8(-536)
211 brne .L12
213 007a 182F .LM14:
286:main.c **** har('N');
287:main.c ****
288:main.c **** while(--timer)
289:main.c **** {
290:main.c **** c=yackiambic(FALSE);
291:main.c **** yackbeat();
292:main.c ****
214 lo8(1)
215 ldi r22,lo8(1)
216 007c 8091 0000 ldi r20,lo8(0)
217 0080 9091 0000 ldi r21,hi8(0)
218 0084 885E rcall yackuser
219 0086 9D4F sts (interval.1502)+1,r25
220 0088 01F4 sts interval.1502,r24
293:main.c **** c>='0' && c<='9')
222 .LM15:
223 008a 81E0 cpi r17,lo8(1)
224 008c 61E0 breq .+2
225 008e 40E0 rjmp .L13
227 0092 00D0 .LM16:
228 0094 9093 0000 sts (interval.1502)+1,__zero_reg__
229 0098 8093 0000 sts interval.1502,__zero_reg__
294:main.c **** {
295:main.c **** interval *= 10;
231 i r24,lo8(1000)
232 ldi r25,hi8(1000)
233 009c 1130 sts (timer.1503)+1,r25
234 009e 01F0 sts timer.1503,r24
296:main.c **** interval += c - '0';
297:main.c **** timer = YACKSECS(DEFTIMEOUT);
236 :
237 ldi r24,lo8(78)
238 00a2 1092 0000 rcall yackchar
298:main.c **** }
240 9:
241 ldi r28,lo8(1000)
242 00aa 88EE ldi r29,hi8(1000)
243 00ac 93E0 rjmp .L22
244 00ae 9093 0000 .L15:
299:main.c **** }
300:main.c ****
246
247 ldi r24,lo8(0)
248 00b6 8EE4 rcall yackiambic
249 00b8 00D0 mov r17,r24
301:main.c **** if (interval >= 0 && interval <= 9999)
302:main.c **** {
303:main.c **** yackuser(WRITE, 1, interval); // Record interval
304:main.c **** yacknumber(interval); // Playback number
305:main.c **** }
306:main.c **** else
307:main.c **** {
308:main.c **** yackerror();
309:main.c **** }
310:main.c ****
311:main.c **** }
250 tabn 68,0,305,.LM21-.LFBB3
251 .LM21:
252 00ba C8EE rcall yackbeat
254 00be 00C0 .LM22:
255 mov r24,r17
256 subi r24,lo8(-(-48))
257 cpi r24,lo8(10)
258 00c0 80E0 brsh .L22
260 00c4 182F .LM23:
261 lds r24,interval.1502
262 lds r25,(interval.1502)+1
263 00c6 00D0 ldi r22,lo8(10)
264 ldi r23,hi8(10)
265 rcall __mulhi3
267 00ca 8053 .LM24:
268 00cc 8A30 sbiw r24,48
269 00ce 00F4 add r24,r17
270 adc r25,__zero_reg__
271 sts (interval.1502)+1,r25
272 00d0 8091 0000 sts interval.1502,r24
274 00d8 6AE0 .LM25:
275 00da 70E0 sts (timer.1503)+1,r29
276 00dc 00D0 sts timer.1503,r28
277 .L22:
279 00de C097 .LM26:
280 00e0 810F lds r24,timer.1503
281 00e2 911D lds r25,(timer.1503)+1
282 00e4 9093 0000 sbiw r24,1
283 00e8 8093 0000 sts (timer.1503)+1,r25
284 sts timer.1503,r24
285 or r24,r25
286 00ec D093 0000 brne .L15
288 .LM27:
289 lds r20,interval.1502
290 lds r21,(interval.1502)+1
291 00f4 8091 0000 ldi r24,hi8(10000)
292 00f8 9091 0000 cpi r20,lo8(10000)
293 00fc 0197 cpc r21,r24
294 00fe 9093 0000 brsh .L16
296 0106 892B .LM28:
297 0108 01F4 ldi r24,lo8(2)
312:main.c **** de == PLAY) && interval)
313:main.c **** {
314:main.c ****
315:main.c **** #ifdef POWERSAVE
298 ,.LM29-.LFBB3
299 .LM29:
300 010a 4091 0000 lds r24,interval.1502
301 010e 5091 0000 lds r25,(interval.1502)+1
302 0112 87E2 rcall yacknumber
303 0114 4031 rjmp .L19
304 0116 5807 .L16:
316:main.c **** // If we execute this, the interval counter is positive which means we are waiting
317:main.c **** // for a message playback. In this case we must not allow the CPU to enter sleep mode.
306 rcall yackerror
307 rjmp .L19
308 011a 82E0 .L13:
310 011e 00D0 .LM31:
318:main.c ****
311 r17,lo8(2)
312 brne .L19
313 0120 8091 0000 lds r24,interval.1502
314 0124 9091 0000 lds r25,(interval.1502)+1
315 0128 00D0 or r24,r25
316 012a 00C0 breq .L19
319:main.c **** yackpower(FALSE); // Inhibit sleep mode
320:main.c ****
321:main.c **** #endif
322:main.c ****
318 ldi r24,lo8(0)
319 rcall yackpower
321 012e 00C0 .LM33:
322 lds r24,timer.1503
323:main.c **** (timer) timer--; // Countdown until a second has expired
324:main.c **** else
325:main.c **** {
326:main.c **** timer = YACKSECS(1); // Reset timer
327:main.c ****
328:main.c **** if ((--interval)==0) // Interval was > 0. Did decrement bring it to 0?
323 r25,(timer.1503)+1
324 sbiw r24,0
325 0130 1230 breq .L18
326 0132 01F4 sbiw r24,1
327 0134 8091 0000 sts (timer.1503)+1,r25
328 0138 9091 0000 sts timer.1503,r24
329 013c 892B rjmp .L19
330 013e 01F0 .L18:
329:main.c **** interval = yackuser(READ, 1, 0); // Reset the interval timer
330:main.c **** yackmessage(PLAY,4); // And play message 4
331:main.c ****
332:main.c ****
333:main.c **** }
334:main.c ****
335:main.c **** }
336:main.c ****
331 68,0,343,.LM34-.LFBB3
332 .LM34:
333 0140 80E0 ldi r24,lo8(200)
334 0142 00D0 ldi r25,hi8(200)
337:main.c ****
338:main.c ****
339:main.c ****
340:main.c **** void commandmode(void)
335 (timer.1503)+1,r25
336 sts timer.1503,r24
338 0148 9091 0000 .LM35:
339 014c 0097 lds r24,interval.1502
340 014e 01F0 lds r25,(interval.1502)+1
341 0150 0197 sbiw r24,1
342 0152 9093 0000 sts (interval.1502)+1,r25
343 0156 8093 0000 sts interval.1502,r24
344 015a 00C0 or r24,r25
345 brne .L19
341:main.c ****
342:main.c **** @brief Command mode
343:main.c ****
346 0,348,.LM36-.LFBB3
347 .LM36:
348 015c 88EC ldi r24,lo8(1)
349 015e 90E0 ldi r22,lo8(1)
350 0160 9093 0000 ldi r20,lo8(0)
351 0164 8093 0000 ldi r21,hi8(0)
344:main.c **** is routine implements command mode. Entries are read from the paddle
345:main.c **** and interpreted as commands.
352 yackuser
353 sts (interval.1502)+1,r25
354 0168 8091 0000 sts interval.1502,r24
356 0170 0197 .LM37:
357 0172 9093 0000 ldi r24,lo8(2)
358 0176 8093 0000 ldi r22,lo8(4)
359 017a 892B rcall yackmessage
360 017c 01F4 .L19:
346:main.c **** */
347:main.c **** {
348:main.c ****
361 ue start */
363 017e 81E0 .LM38:
364 0180 61E0 pop r29
365 0182 40E0 pop r28
366 0184 50E0 pop r17
367 0186 00D0 ret
349:main.c **** ar c; // Character from Morse key
370 timer:V(8,2)",40,0,0,timer.1503
374 0194 00D0 .Lscope3:
376 .global cstrain
350:main.c **** word timer; // Exit timer
351:main.c ****
352:main.c **** yackinhibit(ON); // Sidetone = on, Keyer = off
353:main.c ****
354:main.c **** yackchar('?'); // Play Greeting
355:main.c ****
356:main.c **** timer = YACKSECS(DEFTIMEOUT); // Time out after 10 seconds
357:main.c ****
358:main.c **** while ((yackctrlkey(TRUE)==0) && (timer-- > 0))
377 cstrain, @function
378 cstrain:
380 0198 CF91 .LM39:
381 019a 1F91 .LFBB4:
382 019c 0895 push r10
383 push r11
384 push r12
385 push r13
386 push r14
387 push r15
388 push r16
389 push r17
390 push r29
391 push r28
392 rcall .
393 rcall .
394 push __tmp_reg__
395 in r28,__SP_L__
396 in r29,__SP_H__
397 019e AF92 /* prologue: function */
398 01a0 BF92 /* frame size = 5 */
400 01a4 DF92 .LM40:
401 01a6 EF92 movw r12,r28
402 01a8 FF92 sec
403 01aa 0F93 adc r12,__zero_reg__
404 01ac 1F93 adc r13,__zero_reg__
406 01b0 CF93 .LM41:
407 01b2 00D0 ldi r22,lo8(6)
408 01b4 00D0 mov r10,r22
409 01b6 0F92 mov r11,__zero_reg__
410 01b8 CDB7 add r10,r28
411 01ba DEB7 adc r11,r29
412 .L33:
414 .LM42:
415 movw r24,r12
416 01bc 6E01 rcall rndcall
417 01be 0894 clr r15
418 01c0 C11C .L35:
420 .LM43:
421 tst r15
422 01c4 66E0 brne .L24
423 01c6 A62E .L40:
425 01ca AC0E .LM44:
426 01cc BD1E ldi r24,lo8(14)
427 rcall yackdelay
428 movw r16,r12
429 .L26:
431 01d0 00D0 .LM45:
432 01d2 FF24 movw r30,r16
433 ld r24,Z
434 rcall yackchar
436 01d4 FF20 .LM46:
437 01d6 01F4 rcall yackfarns
439 .LM47:
440 ldi r24,lo8(1)
441 01d8 8EE0 rcall yackctrlkey
442 01da 00D0 tst r24
443 01dc 8601 brne .L34
445 .LM48:
446 subi r16,lo8(-(1))
447 01de F801 sbci r17,hi8(-(1))
449 01e2 00D0 .LM49:
450 cp r16,r10
451 cpc r17,r11
452 01e4 00D0 brne .L26
453 .L24:
454 ldi r16,lo8(2000)
455 01e6 81E0 ldi r17,hi8(2000)
456 01e8 00D0 .L28:
458 01ec 01F4 .LM50:
459 ldi r24,lo8(0)
460 rcall yackiambic
461 01ee 0F5F mov r14,r24
463 .LM51:
464 rcall yackbeat
466 01f4 1B05 .LM52:
467 01f6 01F4 subi r16,lo8(-(-1))
468 sbci r17,hi8(-(-1))
470 01fa 17E0 .LM53:
471 tst r14
472 brne .L27
473 cp r16,__zero_reg__
474 01fc 80E0 cpc r17,__zero_reg__
475 01fe 00D0 breq .L34
476 0200 E82E ldi r24,lo8(0)
477 rcall yackctrlkey
478 tst r24
479 0202 00D0 breq .L28
480 rjmp .L29
481 .L27:
483 0206 1040 .LM54:
484 or r16,r17
485 breq .L34
486 0208 EE20 .L29:
487 020a 01F4 ldi r24,lo8(1)
488 020c 0115 rcall yackctrlkey
489 020e 1105 tst r24
490 0210 01F0 brne .L34
492 0214 00D0 .LM55:
493 0216 8823 movw r30,r12
494 0218 01F0 add r30,r15
495 021a 00C0 adc r31,__zero_reg__
496 ld r24,Z
497 cp r24,r14
498 brne .L30
500 021e 01F0 .LM56:
501 inc r15
503 0222 00D0 .LM57:
504 0224 8823 ldi r31,lo8(4)
505 0226 01F4 cp r31,r15
506 brsh .L35
507 rjmp .L41
508 0228 F601 .L30:
510 022c F11D .LM58:
511 022e 8081 rcall yackerror
512 0230 8E15 clr r15
513 0232 01F4 rjmp .L40
514 .L41:
516 0234 F394 .LM59:
517 ldi r24,lo8(82)
518 rcall yackchar
519 0236 F4E0 rjmp .L33
520 0238 FF15 .L34:
521 023a 00F4 /* epilogue start */
523 .LM60:
524 pop __tmp_reg__
525 pop __tmp_reg__
526 023e 00D0 pop __tmp_reg__
527 0240 FF24 pop __tmp_reg__
528 0242 00C0 pop __tmp_reg__
529 pop r28
530 pop r29
531 pop r17
532 0244 82E5 pop r16
533 0246 00D0 pop r15
534 0248 00C0 pop r14
535 pop r13
536 pop r12
537 pop r11
538 pop r10
539 024a 0F90 ret
547 025a 0F91 .Lscope4:
549 025e EF90 .global setfarns
551 0262 CF90 setfarns:
553 0266 AF90 .LM61:
554 0268 0895 .LFBB5:
555 push r17
556 .L51:
557 /* prologue: function */
558 /* frame size = 0 */
560 .LM62:
561 ldi r17,lo8(0)
562 .L50:
564 .LM63:
565 ldi r24,lo8(1)
566 rcall yackctrlkey
567 tst r24
568 brne .L48
570 026a 1F93 .LM64:
571 ldi r24,lo8(1)
572 rcall yackplay
574 .LM65:
575 ldi r24,lo8(1)
576 026c 10E0 rcall yackdelay
578 .LM66:
579 ldi r24,lo8(2)
580 026e 81E0 rcall yackplay
582 0272 8823 .LM67:
583 0274 01F4 ldi r24,lo8(3)
584 rcall yackdelay
586 0276 81E0 .LM68:
587 0278 00D0 rcall yackfarns
589 .LM69:
590 027a 81E0 sbic 54-32,3
591 027c 00D0 rjmp .L44
593 .LM70:
594 027e 82E0 ldi r24,lo8(2)
595 0280 00D0 rjmp .L52
596 .L44:
598 0282 83E0 .LM71:
599 0284 00D0 sbis 54-32,4
600 rjmp .L46
602 0286 00D0 .LM72:
603 subi r17,lo8(-(1))
604 cpi r17,lo8(10)
605 0288 B399 brne .L50
606 028a 00C0 rjmp .L48
607 .L46:
609 028c 82E0 .LM73:
610 028e 00C0 ldi r24,lo8(1)
611 .L52:
612 ldi r22,lo8(1)
613 rcall yackspeed
614 0290 B49B rjmp .L51
615 0292 00C0 .L48:
616 /* epilogue start */
618 0294 1F5F .LM74:
619 0296 1A30 pop r17
620 0298 01F4 ret
625 029c 81E0 .Lscope5:
627 029e 61E0 .global pitch
629 02a2 00C0 pitch:
631 .LM75:
632 .LFBB6:
633 push r28
634 02a4 1F91 push r29
635 02a6 0895 .L63:
636 /* prologue: function */
637 /* frame size = 0 */
639 .LM76:
640 ldi r28,lo8(10)
641 ldi r29,hi8(10)
642 .L62:
644 .LM77:
645 ldi r24,lo8(69)
646 rcall yackchar
648 02a8 CF93 .LM78:
649 02aa DF93 ldi r24,lo8(1)
650 rcall yackctrlkey
651 tst r24
652 brne .L59
654 .LM79:
655 02ac CAE0 sbis 54-32,3
656 02ae D0E0 rjmp .L55
658 .LM80:
659 sbiw r28,1
660 02b0 85E4 rjmp .L56
661 02b2 00D0 .L55:
663 .LM81:
664 02b4 81E0 ldi r24,lo8(2)
665 02b6 00D0 rcall yackpitch
666 02b8 8823 ldi r28,lo8(10)
667 02ba 01F4 ldi r29,hi8(10)
668 .L56:
670 02bc B39B .LM82:
671 02be 00C0 sbic 54-32,4
672 rjmp .L57
674 02c0 2197 .LM83:
675 02c2 00C0 ldi r24,lo8(1)
676 rcall yackpitch
677 rjmp .L63
678 .L57:
680 02c6 00D0 .LM84:
681 02c8 CAE0 sbiw r28,0
682 02ca D0E0 brne .L62
683 .L59:
684 /* epilogue start */
686 02cc B499 .LM85:
687 02ce 00C0 pop r29
688 pop r28
689 ret
694 .Lscope6:
696 02d6 2097 .global commandmode
698 commandmode:
700 .LM86:
701 .LFBB7:
702 02da DF91 push r17
703 02dc CF91 push r28
704 02de 0895 push r29
705 /* prologue: function */
706 /* frame size = 0 */
708 .LM87:
709 ldi r24,lo8(1)
710 rcall yackinhibit
712 .LM88:
713 ldi r24,lo8(63)
359:main.c **** =yackiambic(OFF);
360:main.c **** if (c) timer = YACKSECS(DEFTIMEOUT); // Reset timeout if character read
361:main.c ****
362:main.c **** yackbeat();
363:main.c ****
364:main.c **** lfsr(255); // Keep seeding the LFSR so we get different callsigns
365:main.c ****
366:main.c **** if (!yackflag(CONFLOCK)) // No Configuration lock?
367:main.c **** {
368:main.c **** switch (c) // These are the lockable configuration commands
369:main.c **** {
370:main.c ****
371:main.c **** case 'R': // Reset
714 abn 68,0,385,.LM89-.LFBB7
715 .LM89:
716 ldi r24,lo8(0)
717 02e0 1F93 rcall yackiambic
718 02e2 CF93 mov r17,r24
720 .LM90:
721 tst r24
372:main.c **** yackreset();
373:main.c **** c = TRUE;
374:main.c **** break;
375:main.c ****
376:main.c **** case 'A': // IAMBIC A
722 66
723 ldi r28,lo8(1000)
724 02e6 81E0 ldi r29,hi8(1000)
725 02e8 00D0 rjmp .L67
377:main.c **** yackmode(IAMBICA);
378:main.c **** c = TRUE;
726 :
728 02ea 8FE3 .LM91:
729 02ec 00D0 sbiw r28,1
730 02ee C8EE .L67:
732 02f2 00C0 .LM92:
733 rcall yackbeat
379:main.c **** break;
380:main.c ****
381:main.c **** case 'B': // IAMBIC B
382:main.c **** yackmode(IAMBICB);
383:main.c **** c = TRUE;
384:main.c **** break;
385:main.c ****
734 68,0,390,.LM93-.LFBB7
735 .LM93:
736 02f4 80E0 ldi r24,lo8(-1)
737 02f6 00D0 rcall lfsr
386:main.c **** case 'L': // ULTIMATIC
739 :
740 ldi r24,lo8(2)
741 02fa 8823 rcall yackflag
742 02fc 01F0 tst r24
743 02fe C8EE brne .L68
745 0302 00C0 .LM95:
746 mov r24,r17
747 ldi r25,lo8(0)
748 movw r30,r24
749 0304 2197 sbiw r30,49
750 cpi r30,42
387:main.c **** yackmode(ULTIMATIC);
388:main.c **** c = TRUE;
751 ero_reg__
752 brsh .L68
753 0306 00D0 subi r30,lo8(-(gs(.L84)))
389:main.c **** break;
390:main.c ****
754 ci r31,hi8(-(gs(.L84)))
755 ijmp
756 0308 8FEF .data
757 030a 00D0 .section .progmem.gcc_sw_table, "ax", @progbits
391:main.c **** case 'D': // DAHPRIO
392:main.c **** yackmode(DAHPRIO);
758 align 1
759 .L84:
760 030c 82E0 .data
761 030e 00D0 .section .progmem.gcc_sw_table, "ax", @progbits
762 0310 8823 .p2align 1
763 0312 01F4 rjmp .L69
393:main.c **** c = TRUE;
394:main.c **** break;
764 .L70
765 rjmp .L71
766 0314 812F rjmp .L72
767 0316 90E0 rjmp .L68
768 0318 FC01 rjmp .L68
769 031a F197 rjmp .L68
770 031c EA32 rjmp .L68
771 031e F105 rjmp .L68
772 0320 00F4 rjmp .L68
773 0322 E050 rjmp .L68
774 0324 F040 rjmp .L68
775 0326 0994 rjmp .L68
776 rjmp .L68
777 rjmp .L68
778 rjmp .L68
779 rjmp .L73
780 rjmp .L74
781 rjmp .L68
782 rjmp .L75
783 0000 00C0 rjmp .L68
784 0002 00C0 rjmp .L76
785 0004 00C0 rjmp .L68
786 0006 00C0 rjmp .L68
787 0008 00C0 rjmp .L68
788 000a 00C0 rjmp .L68
789 000c 00C0 rjmp .L77
790 000e 00C0 rjmp .L78
791 0010 00C0 rjmp .L68
792 0012 00C0 rjmp .L79
793 0014 00C0 rjmp .L68
794 0016 00C0 rjmp .L68
795 0018 00C0 rjmp .L68
796 001a 00C0 rjmp .L80
797 001c 00C0 rjmp .L81
798 001e 00C0 rjmp .L68
799 0020 00C0 rjmp .L68
800 0022 00C0 rjmp .L68
801 0024 00C0 rjmp .L68
802 0026 00C0 rjmp .L82
803 0028 00C0 rjmp .L68
804 002a 00C0 rjmp .L83
805 002c 00C0 .text
806 002e 00C0 .L80:
808 0032 00C0 .LM96:
809 0034 00C0 rcall yackreset
810 0036 00C0 rjmp .L85
811 0038 00C0 .L73:
813 003c 00C0 .LM97:
814 003e 00C0 ldi r24,lo8(0)
815 0040 00C0 rjmp .L110
816 0042 00C0 .L74:
818 0046 00C0 .LM98:
819 0048 00C0 ldi r24,lo8(4)
820 004a 00C0 .L110:
821 004c 00C0 rcall yackmode
822 004e 00C0 rjmp .L85
823 0050 00C0 .L78:
825 .LM99:
826 ldi r24,lo8(8)
395:main.c ****
396:main.c **** case 'X': // Paddle swapping
397:main.c **** yacktoggle(PDLSWAP);
398:main.c **** c = TRUE;
827 24,lo8(12)
828 rjmp .L110
829 0328 00D0 .L82:
831 .LM101:
399:main.c **** break;
400:main.c ****
401:main.c **** case 'S': // Sidetone toggle
402:main.c **** yacktoggle(SIDETONE);
403:main.c **** c = TRUE;
832 r24,lo8(-128)
833 rjmp .L109
834 032c 80E0 .L81:
836 .LM102:
404:main.c **** break;
405:main.c ****
406:main.c **** case 'K': // TX keying toggle
407:main.c **** yacktoggle(TXKEY);
408:main.c **** c = TRUE;
837 r24,lo8(16)
838 rjmp .L109
839 0330 84E0 .L77:
841 0332 00D0 .LM103:
842 0334 00C0 ldi r24,lo8(32)
843 rjmp .L109
409:main.c **** break;
410:main.c ****
411:main.c **** case 'Z': // Farnsworth pause
412:main.c **** setfarns();
413:main.c **** c = TRUE;
845 .LM104:
846 0336 88E0 rcall setfarns
847 0338 00C0 rjmp .L85
848 .L76:
414:main.c **** break;
415:main.c ****
416:main.c **** case 'F': // TX level inverter toggle
417:main.c **** yacktoggle(TXINV);
418:main.c **** c = TRUE;
849 bn 68,0,443,.LM105-.LFBB7
850 .LM105:
851 033a 8CE0 ldi r24,lo8(64)
852 033c 00C0 rjmp .L109
853 .L69:
419:main.c **** break;
420:main.c ****
421:main.c **** case '1': // Record Macro 1
422:main.c **** yackchar('1');
423:main.c **** yackmessage(RECORD,1);
854 bn 68,0,448,.LM106-.LFBB7
855 .LM106:
856 033e 80E8 ldi r24,lo8(49)
857 0340 00C0 rcall yackchar
424:main.c **** break;
425:main.c ****
426:main.c **** case '1': // Record Macro 1
427:main.c **** yackchar('1');
428:main.c **** yackmessage(RECORD,1);
859 7:
860 ldi r24,lo8(1)
861 0342 80E1 ldi r22,lo8(1)
862 0344 00C0 rjmp .L108
863 .L70:
429:main.c **** break;
430:main.c ****
431:main.c **** case '1': // Record Macro 1
432:main.c **** yackchar('1');
433:main.c **** yackmessage(RECORD,1);
864 bn 68,0,454,.LM108-.LFBB7
865 .LM108:
866 0346 80E2 ldi r24,lo8(50)
867 0348 00C0 rcall yackchar
434:main.c **** break;
435:main.c ****
436:main.c **** case '1': // Record Macro 1
437:main.c **** yackchar('1');
438:main.c **** yackmessage(RECORD,1);
869 9:
870 ldi r24,lo8(1)
871 034a 00D0 ldi r22,lo8(2)
872 034c 00C0 rjmp .L108
873 .L71:
439:main.c **** break;
440:main.c ****
441:main.c **** case '1': // Record Macro 1
442:main.c **** yackchar('1');
443:main.c **** yackmessage(RECORD,1);
874 bn 68,0,460,.LM110-.LFBB7
875 .LM110:
876 034e 80E4 ldi r24,lo8(51)
877 0350 00C0 rcall yackchar
444:main.c **** break;
445:main.c ****
446:main.c **** case '1': // Record Macro 1
447:main.c **** yackchar('1');
448:main.c **** yackmessage(RECORD,1);
879 1:
880 ldi r24,lo8(1)
881 0352 81E3 ldi r22,lo8(3)
882 0354 00D0 rjmp .L108
449:main.c **** break;
883 :
885 0356 81E0 .LM112:
886 0358 61E0 ldi r24,lo8(52)
887 035a 00C0 rcall yackchar
450:main.c ****
451:main.c **** case 'F': // TX level inverter toggle
452:main.c **** yacktoggle(TXINV);
453:main.c **** c = TRUE;
454:main.c **** break;
889 :
890 ldi r24,lo8(1)
891 035c 82E3 ldi r22,lo8(4)
892 035e 00D0 .L108:
455:main.c ****
893 ll yackmessage
894 rjmp .L85
895 0360 81E0 .L79:
897 0364 00C0 .LM114:
898 ldi r24,lo8(1)
456:main.c **** ase 'F': // TX level inverter toggle
457:main.c **** yacktoggle(TXINV);
458:main.c **** c = TRUE;
459:main.c **** break;
460:main.c ****
899 beacon
900 rjmp .L85
901 0366 83E3 .L68:
461:main.c **** case '1': // Record Macro 1
903 15:
904 cpi r17,lo8(77)
905 036a 81E0 breq .L91
906 036c 63E0 cpi r17,lo8(78)
907 036e 00C0 brsh .L97
908 cpi r17,lo8(67)
462:main.c **** yacktoggle(TXINV);
463:main.c **** c = TRUE;
464:main.c **** break;
465:main.c ****
466:main.c **** case '1': // Record Macro 1
909 .L88
910 cpi r17,lo8(68)
911 0370 84E3 brsh .L98
912 0372 00D0 cpi r17,lo8(48)
467:main.c **** yackchar('1');
913 q .+2
914 rjmp .L86
915 0374 81E0 rjmp .L112
916 0376 64E0 .L98:
917 cpi r17,lo8(69)
918 0378 00D0 breq .L89
919 037a 00C0 cpi r17,lo8(73)
920 brne .L86
468:main.c **** c = TRUE;
469:main.c **** break;
470:main.c ****
471:main.c **** case '1': // Record Macro 1
472:main.c **** yackchar('1');
921 113
922 .L97:
923 037c 81E0 cpi r17,lo8(85)
924 037e 00D0 breq .L94
925 0380 00C0 cpi r17,lo8(86)
926 brsh .L99
473:main.c **** yackmessage(RECORD,1);
474:main.c **** c = TRUE;
475:main.c **** break;
476:main.c ****
477:main.c **** case '2': // Record Macro 2
478:main.c **** yackchar('2');
479:main.c **** yackmessage(RECORD,2);
480:main.c **** c = TRUE;
927 17,lo8(80)
928 breq .L92
929 0382 1D34 cpi r17,lo8(84)
930 0384 01F0 brne .L86
931 0386 1E34 rjmp .L114
932 0388 00F4 .L99:
933 038a 1334 cpi r17,lo8(86)
934 038c 01F0 breq .L95
935 038e 1434 cpi r17,lo8(87)
936 0390 00F4 brne .L86
937 0392 1033 rjmp .L115
938 0394 01F0 .L95:
940 0398 00C0 .LM116:
941 ldi r24,lo8(vers)
942 039a 1534 ldi r25,hi8(vers)
943 039c 01F0 rcall yackstring
944 039e 1934 rjmp .L85
945 03a0 01F4 .L92:
947 .LM117:
948 03a4 1535 rcall pitch
949 03a6 01F0 rjmp .L85
950 03a8 1635 .L94:
952 03ac 1035 .LM118:
953 03ae 01F0 ldi r24,lo8(0)
954 03b0 1435 rcall yackinhibit
956 03b4 00C0 .LM119:
957 rcall yacktune
959 03b8 01F0 .LM120:
960 03ba 1735 ldi r24,lo8(1)
961 03bc 01F4 rcall yackinhibit
962 03be 00C0 rjmp .L85
963 .L88:
481:main.c **** case '2': // Record Macro 2
482:main.c **** yackchar('2');
483:main.c **** yackmessage(RECORD,2);
484:main.c **** c = TRUE;
964 :
965 rcall cstrain
966 03c0 80E0 rjmp .L85
967 03c2 90E0 .L112:
969 03c6 00C0 .LM122:
970 ldi r24,lo8(2)
485:main.c **** case '2': // Record Macro 2
486:main.c **** yackchar('2');
487:main.c **** yackmessage(RECORD,2);
488:main.c **** c = TRUE;
489:main.c **** break;
490:main.c ****
971 68,0,497,.LM120-.LFBB7
972 .LM120:
973 03c8 00D0 ldi r24,lo8(1)
974 03ca 00C0 rcall yackinhibit
975 rjmp .L85
491:main.c **** 2
492:main.c **** yackchar('2');
493:main.c **** yackmessage(RECORD,2);
494:main.c **** c = TRUE;
495:main.c **** break;
976 L94:
978 03cc 80E0 .LM118:
979 03ce 00D0 ldi r24,lo8(0)
496:main.c **** d Macro 2
980 68,0,484,.LM116-.LFBB7
981 .LM116:
982 03d0 00D0 ldi r24,lo8(vers)
497:main.c **** yackmessage(RECORD,1);
983 i r25,hi8(vers)
984 rcall yackstring
985 03d2 81E0 rjmp .L85
986 03d4 00D0 .L92:
988 .LM117:
498:main.c **** break;
499:main.c ****
500:main.c **** case '1': // Record Macro 1
501:main.c **** yackchar('1');
502:main.c **** yackmessage(RECORD,1);
989 pitch
990 rjmp .L85
991 03d8 00D0 .L94:
993 .LM118:
503:main.c **** break;
504:main.c ****
505:main.c **** case '1': // Record Macro 1
506:main.c **** yackchar('1');
507:main.c **** yackmessage(RECORD,1);
994 r24,lo8(0)
995 rcall yackinhibit
997 .LM119:
998 03de 00D0 rcall yacktune
1000 .LM120:
508:main.c **** break;
509:main.c ****
510:main.c **** case '1': // Record Macro 1
511:main.c **** yackchar('1');
512:main.c **** yackmessage(RECORD,1);
1001 0,.LM117-.LFBB7
1002 .LM117:
1003 03e2 80E0 rcall pitch
1004 03e4 00D0 rjmp .L85
513:main.c **** break;
1005 :
1007 03e6 82E0 .LM118:
1008 03e8 61E0 ldi r24,lo8(0)
1009 03ea 00C0 rcall yackinhibit
514:main.c ****
515:main.c **** case 'F': // TX level inverter toggle
516:main.c **** yacktoggle(TXINV);
517:main.c **** c = TRUE;
518:main.c **** break;
519:main.c ****
520:main.c **** case '1': // Record Macro 1
1011 di r25,hi8(vers)
1012 rcall yackstring
1013 03ec 80E0 rjmp .L85
1014 03ee 00D0 .L92:
521:main.c **** yackchar('1');
1015 abn 68,0,490,.LM117-.LFBB7
1016 .LM117:
1017 03f0 82E0 rcall pitch
1018 03f2 62E0 rjmp .L85
1019 03f4 00C0 .L94:
522:main.c **** c = TRUE;
523:main.c **** break;
524:main.c ****
525:main.c **** case '1': // Record Macro 1
526:main.c **** yackchar('1');
527:main.c **** yackmessage(RECORD,1);
528:main.c **** c = TRUE;
1021 :
1022 ldi r24,lo8(0)
1023 03f6 80E0 rcall yackinhibit
529:main.c **** break;
1025 di r25,hi8(vers)
1026 rcall yackstring
1027 03fa 82E0 rjmp .L85
1028 03fc 63E0 .L92:
1030 .LM117:
530:main.c **** Record Macro 1
531:main.c **** yackchar('1');
532:main.c **** yackmessage(RECORD,1);
533:main.c **** c = TRUE;
534:main.c **** break;
535:main.c ****
536:main.c **** case '2': // Record Macro 2
1031 pitch
1032 rjmp .L85
1033 0400 80E0 .L94:
537:main.c **** yackmessage(RECORD,1);
1035 18:
1036 ldi r24,lo8(0)
1037 0404 82E0 rcall yackinhibit
1039 .LM119:
1040 0408 00D0 rcall yacktune
538:main.c **** break;
1041 ckstring
1042 rjmp .L85
1043 040a 81E0 .L92:
539:main.c ****
540:main.c **** case 'F': // TX level inverter toggle
541:main.c **** yacktoggle(TXINV);
542:main.c **** c = TRUE;
543:main.c **** break;
544:main.c ****
545:main.c **** case '1': // Record Macro 1
546:main.c **** yackchar('1');
547:main.c **** yackmessage(RECORD,1);
548:main.c **** c = TRUE;
549:main.c **** break;
550:main.c ****
551:main.c **** case '2': // Record Macro 2
552:main.c **** yackchar('2');
553:main.c **** yackmessage(RECORD,2);
554:main.c **** c = TRUE;
555:main.c **** break;
556:main.c ****
557:main.c **** case '3': // Record Macro 3
558:main.c **** yackchar('3');
559:main.c **** yackmessage(RECORD,3);
560:main.c **** c = TRUE;
561:main.c **** break;
562:main.c ****
563:main.c **** case '4': // Record Macro 4
564:main.c **** yackchar('4');
565:main.c **** yackmessage(RECORD,4);
566:main.c **** c = TRUE;
567:main.c **** break;
1045 17:
1046 rcall pitch
1047 040e C8EB rjmp .L85
1048 0410 DBE0 .L94:
1050 .LM118:
1051 ldi r24,lo8(0)
1052 rcall yackinhibit
1054 0416 00D0 .LM119:
1055 0418 00C0 rcall yacktune
1057 .LM120:
1058 ldi r24,lo8(1)
1059 041a 1130 rcall yackinhibit
1060 041c 01F4 rjmp .L85
1061 .L88:
1063 .LM121:
1064 041e 00D0 rcall cstrain
1065 rjmp .L85
1066 .L112:
1068 0422 00D0 .LM122:
1069 ldi r24,lo8(2)
1070 .L109:
1071 0424 80E0 rcall yacktoggle
1072 0426 90E0 rjmp .L85
1073 0428 00D0 .L89:
1075 .LM123:
1076 ldi r24,lo8(0)
1077 rcall yackinhibit
1079 .LM124:
1080 ldi r24,lo8(2)
1081 042e 00D0 ldi r22,lo8(1)
1082 rjmp .L111
1083 .L113:
1085 0430 81E0 .LM125:
1086 0432 00D0 ldi r24,lo8(0)
1087 0434 8823 rcall yackinhibit
1089 0438 2097 .LM126:
1090 043a 01F0 ldi r24,lo8(2)
1091 043c 00C0 ldi r22,lo8(2)
1092 rjmp .L111
1093 .L114:
1095 043e 80E0 .LM127:
1096 0440 90E0 ldi r24,lo8(0)
1097 0442 00D0 rcall yackinhibit
1099 .LM128:
1100 0444 80E0 ldi r24,lo8(2)
1101 0446 00D0 ldi r22,lo8(3)
1102 rjmp .L111
1103 .L91:
1105 0448 DF91 .LM129:
1106 044a CF91 ldi r24,lo8(0)
1107 044c 1F91 rcall yackinhibit
1109 .LM130:
1110 ldi r24,lo8(2)
1111 ldi r22,lo8(4)
1112 .L111:
1113 rcall yackmessage
1115 .LM131:
1116 ldi r24,lo8(1)
1117 rcall yackinhibit
568:main.c **** case 'N': // Automatic Beacon
569:main.c **** beacon(RECORD);
570:main.c **** c = TRUE;
571:main.c **** break;
572:main.c ****
573:main.c **** }
574:main.c ****
575:main.c **** }
576:main.c ****
577:main.c **** switch (c) // Commands that can be used anytime
578:main.c **** {
579:main.c ****
580:main.c **** case 'V': // Version
1119 8,0,544,.LM133-.LFBB7
1120 .LM133:
1121 rcall yackwpm
1122 rcall yacknumber
1123 rjmp .L85
581:main.c ****
582:main.c **** switch (c) // Commands that can be used anytime
1124 B7
1125 .LM132:
1126 0450 00D0 ldi r28,lo8(3000)
583:main.c ****
584:main.c **** }
1127
1128 .L111:
1129 0452 81E0 rcall yackmessage
585:main.c **** beacon(RECORD);
1131 :
1132 ldi r24,lo8(0)
1133 0456 80E0 rcall yackinhibit
1135 045a 00D0 .LM130:
586:main.c **** break;
1136 LM128:
1137 ldi r24,lo8(2)
1138 045c 80E0 ldi r22,lo8(3)
1139 045e 00D0 rjmp .L111
1140 .L91:
587:main.c **** yackchar('4');
588:main.c **** yackmessage(RECORD,4);
589:main.c **** c = TRUE;
590:main.c **** break;
591:main.c ****
1141 .L111
1142 .L114:
1144 0462 00D0 .LM127:
1145 0464 8111 ldi r24,lo8(0)
592:main.c **** har('4');
1146 5:
1147 ldi r24,lo8(0)
1148 0466 00D0 rcall yackinhibit
593:main.c **** RECORD,3);
594:main.c **** c = TRUE;
1150 abn 68,0,513,.LM124-.LFBB7
1151 .LM124:
1152 0468 00D0 ldi r24,lo8(2)
595:main.c **** case '3': // Record Macro 3
1153 BB7
1154 .LM122:
1155 046a 82E0 ldi r24,lo8(2)
1156 046c 00D0 .L109:
596:main.c **** 2');
1157 ,.LM120-.LFBB7
1158 .LM120:
1159 046e 80E0 ldi r24,lo8(1)
1160 0470 00D0 rcall yackinhibit
1161 0472 00C0 rjmp .L85
1162 .L88:
1164 .LM121:
1165 rcall cstrain
1166 rjmp .L85
1167 .L112:
1169 0000 5200 .LM122:
1170 ldi r24,lo8(2)
1171 .L109:
1172 rcall yacktoggle
1173 rjmp .L85
1174 0002 5630 2E38 .L89:
1174 3700
1176 .LM123:
1177 ldi r24,lo8(0)
1178 rcall yackinhibit
1180 .LM124:
1181 ldi r24,lo8(2)
1182 ldi r22,lo8(1)
1183 rjmp .L111
1184 000a 3733 00 .L113:
1186 .LM125:
1187 ldi r24,lo8(0)
1188 rcall yackinhibit
1190 0000 E8FD .LM126:
1191 ldi r24,lo8(2)
1192 ldi r22,lo8(2)
1193 rjmp .L111
1194 0002 E1AC .L114:
1196 .LM127:
1197 ldi r24,lo8(0)
1198 rcall yackinhibit
1200 .LM128:
1201 ldi r24,lo8(2)
1202 ldi r22,lo8(3)
1203 rjmp .L111
1204 .L91:
1206 .LM129:
DEFINED SYMBOLS
*ABS*:00000000 main.c
C:\Users\Don\AppData\Local\Temp/ccNoWyzg.s:2 *ABS*:0000003f __SREG__
C:\Users\Don\AppData\Local\Temp/ccNoWyzg.s:3 *ABS*:0000003e __SP_H__
C:\Users\Don\AppData\Local\Temp/ccNoWyzg.s:4 *ABS*:0000003d __SP_L__
C:\Users\Don\AppData\Local\Temp/ccNoWyzg.s:5 *ABS*:00000034 __CCP__
C:\Users\Don\AppData\Local\Temp/ccNoWyzg.s:6 *ABS*:00000000 __tmp_reg__
C:\Users\Don\AppData\Local\Temp/ccNoWyzg.s:7 *ABS*:00000001 __zero_reg__
C:\Users\Don\AppData\Local\Temp/ccNoWyzg.s:92 .text:00000000 lfsr
C:\Users\Don\AppData\Local\Temp/ccNoWyzg.s:1193 .data:00000002 lfsr.1444
C:\Users\Don\AppData\Local\Temp/ccNoWyzg.s:143 .text:00000038 rndcall
C:\Users\Don\AppData\Local\Temp/ccNoWyzg.s:204 .text:00000074 beacon
C:\Users\Don\AppData\Local\Temp/ccNoWyzg.s:1189 .data:00000000 interval.1502
.bss:00000000 timer.1503
C:\Users\Don\AppData\Local\Temp/ccNoWyzg.s:393 .text:0000019e cstrain
C:\Users\Don\AppData\Local\Temp/ccNoWyzg.s:566 .text:0000026a setfarns
C:\Users\Don\AppData\Local\Temp/ccNoWyzg.s:644 .text:000002a8 pitch
C:\Users\Don\AppData\Local\Temp/ccNoWyzg.s:713 .text:000002e0 commandmode
C:\Users\Don\AppData\Local\Temp/ccNoWyzg.s:1173 .progmem.data:00000002 vers
C:\Users\Don\AppData\Local\Temp/ccNoWyzg.s:1168 .progmem.data:00000000 txok
C:\Users\Don\AppData\Local\Temp/ccNoWyzg.s:1178 .progmem.data:00000008 prgx
C:\Users\Don\AppData\Local\Temp/ccNoWyzg.s:1118 .text:00000450 main
C:\Users\Don\AppData\Local\Temp/ccNoWyzg.s:1183 .progmem.data:0000000a imok
UNDEFINED SYMBOLS
yackuser
yackchar
yackiambic
yackbeat
__mulhi3
yacknumber
yackerror
yackpower
yackmessage
yackdelay
yackfarns
yackctrlkey
yackplay
yackspeed
yackpitch
yackinhibit
yackflag
yackreset
yackmode
yackstring
yacktune
yacktoggle
yackwpm
yacksave
yackinit
__do_copy_data
__do_clear_bss