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