CCS PCW C Compiler, Version 3.110, 15448Filename: mb01a.LSTROM used: 1536 (75%)Largest free fragment is 512RAM used: 29 (17%) at main() level88 (50%) worst caseStack: 6 worst case (5 in main + 1 for interrupts)*0000: MOVLW 000001: MOVWF 0A0002: GOTO 5950003: NOP0004: MOVWF 7F0005: SWAPF 03,W0006: CLRF 030007: MOVWF 210008: MOVF 7F,W0009: MOVWF 20000A: MOVF 0A,W000B: MOVWF 28000C: CLRF 0A000D: SWAPF 20,F000E: MOVF 04,W000F: MOVWF 220010: MOVF 77,W0011: MOVWF 230012: MOVF 78,W0013: MOVWF 240014: MOVF 79,W0015: MOVWF 250016: MOVF 7A,W0017: MOVWF 260018: MOVF 7B,W0019: MOVWF 27001A: BCF 03.7001B: BCF 03.5001C: MOVLW 8C001D: MOVWF 04001E: BTFSS 00.2001F: GOTO 0220020: BTFSC 0C.20021: GOTO 0CB0022: MOVF 22,W0023: MOVWF 040024: MOVF 23,W0025: MOVWF 770026: MOVF 24,W0027: MOVWF 780028: MOVF 25,W0029: MOVWF 79002A: MOVF 26,W002B: MOVWF 7A002C: MOVF 27,W002D: MOVWF 7B002E: MOVF 28,W002F: MOVWF 0A0030: SWAPF 21,W0031: MOVWF 030032: SWAPF 7F,F0033: SWAPF 7F,W0034: RETFIE.................... // Melodicky zvonek MB01A_1_00.................... //.................... // Prohram pro melodicky zvonek s pouzitim knihovny Sound_t1.C.................... //.................... // (c)miho 2004, pefi 2004.................... //.................... // Historie:.................... // 1.00 Uvodni verze.................... // 1.01 Zaveden WDT........................................ #include <16F819.h> // Definice procesoru.................... //////// Standard Header file for the PIC16F628 device ////////////////.................... #device PIC16F819.................... #list........................................ #fuses HS,NOPROTECT,WDT,PUT,NOLVP,NOBROWNOUT,WRT // Definice konfiguracniho slova........................................ #define POWER_386 PIN_A4 // L zapne napajeni pro zesilovac LM386.................... #define POWER_PIC PIN_A3 // L pripoji GND pro procesor PIC........................................ #define SOUND_HI PIN_B3 // Akusticky vystup.................... #define SOUND_LO PIN_B2 // Akusticky vystup.................... #define SOUND_CLOCK 20000000 // Frekvence hodin.................... #define SOUND_LowOctave 1 // O oktavu vys protoze mame moc rychly krystal.................... #define SOUND_WDT 1 // Budeme pouzivat WDT.................... #include "Sound_T1.c" // Hudebni knihovna.................... // Knihovna pro generovani hudebnich zvuku dane frekvence a delky nebo.................... // dane noty temperovaneho ladeni a delky..................... //.................... // Pro gnerovani pouziva casovac T0, T1 a jednotku CCP1..................... //.................... // POZOR -- POZOR -- POZOR.................... // Pri nizsi frekvenci XTALu (nez asi 5MHz) je rezie preruseni tak velka, ze spotrebuje.................... // veskery strojovy cas a uz nedojde k ukonceni rozehraneho tonu vyssi frekvence (z oktavy 7.................... // nebo nad cca 8KHz). Resenim je pouzit vlastni INT proceduru s minimalni rezii..................... //.................... // (c)miho 2004, pefi 2004,.................... //.................... // Historie.................... // 1.00 Uvodni verze.................... // 1.01 Pridana podpora zapnuteho WDT........................................ // Konfiguracni parametry.................... //#define SOUND_HI PIN_xx // Pozitivni vystup.................... //#define SOUND_LO PIN_xx // Komplementarni vystup.................... //#define SOUND_WDT 1 // Pokud je pouzit WDT.................... #ifndef SOUND_CLOCK.................... #define SOUND_CLOCK 4000000 // Frelvence krystalu v Hz.................... #endif............................................................ // Definice hudebnich tonu (not) pro proceduru SoundNote().................... #define SOUND_C 0.................... #define SOUND_Cis 1.................... #define SOUND_D 2.................... #define SOUND_Dis 3.................... #define SOUND_E 4.................... #define SOUND_F 5.................... #define SOUND_Fis 6.................... #define SOUND_G 7.................... #define SOUND_Gis 8.................... #define SOUND_A 9.................... #define SOUND_Ais 10.................... #define SOUND_H 11.................... #define SOUND_Space 12 // Pomlka............................................................ // Prototypy verejnych procedur........................................ void SoundBeep(unsigned int16 Frequency, unsigned int16 Duration);.................... // Predava se frekvence v Hz a doba trvani v ms (0 znamena ticho)........................................ void SoundNote(unsigned int8 Note, Octave, unsigned int16 Duration);.................... // Predava se cislo noty (0 je C), posunuti v oktavach (0 nejnizsi ton,.................... // SOUND_Space je ticho), doba trvani v ms........................................ // Alternativni makra pro generovani konstatnich tonu.................... // SoundBeepMacro(Frequency, Duration) - frekvence nesmi byt 0.................... // SoundNoteMacro(Note, Octave, Duration) - nepodporuje SOUND_Space.................... // SoundSpaceMacro(Duration) - hraje ticho........................................ // Privatni cast............................................................ #int_ccp1.................... void IntCCP1().................... // Preruseni od jednotky CCP1 generuje vystup.................... {.................... volatile int1 Data; // Posledni stav vystupu.................... output_bit(SOUND_HI,Data); // Nastav vystup*00CB: BTFSC 72.000CC: GOTO 0CF00CD: BCF 06.300CE: GOTO 0D000CF: BSF 06.300D0: BSF 03.500D1: BCF 06.3.................... output_bit(SOUND_LO,~Data);00D2: BTFSS 72.000D3: GOTO 0D800D4: BCF 03.500D5: BCF 06.200D6: GOTO 0DA00D7: BSF 03.500D8: BCF 03.500D9: BSF 06.200DA: BSF 03.500DB: BCF 06.2.................... Data=~Data; // Otoc stav vystupu00DC: MOVLW 0100DD: XORWF 72,F.................... }............................................................ #if SOUND_CLOCK < (65535*32*4*2) // < 16.7 MHz.................... #define SOUND_PRESCALE 1.................... #elif SOUND_CLOCK < (65535*32*4*2*2) // < 33.6 MHz.................... #define SOUND_PRESCALE 2.................... #elif SOUND_CLOCK < (65535*32*4*2*4) // < 67.1 MHz.................... #define SOUND_PRESCALE 4.................... #elif SOUND_CLOCK < (65535*32*4*2*8) // < 134 MHz.................... #define SOUND_PRESCALE 8.................... #else.................... #error SOUND_CLOCK Frequency too high.................... #endif00DE: BCF 03.500DF: BCF 0C.200E0: BCF 0A.300E1: GOTO 022.................... #bit T0IF=0x0B.2.................... void SoundBeep(unsigned int16 Frequency, unsigned int16 Duration).................... // Predava se frekvence v Hz a doba trvani v ms (0 znamena ticho).................... // Rozumne frekvence jsou od 32Hz.................... {.................... unsigned int16 Time; // Pocitadlo zlomkoveho casu........................................ // Inicializace casovace.................... if (Frequency!=0) // Frekvence 0 znamena ticho.................... {.................... setup_ccp1(CCP_COMPARE_RESET_TIMER);.................... set_timer1(0);.................... (int16)CCP_1=SOUND_CLOCK/SOUND_PRESCALE/4/2/Frequency;.................... #if SOUND_PRESCALE==1.................... setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);.................... #elif SOUND_PRESCALE==2.................... setup_timer_1(T1_INTERNAL|T1_DIV_BY_2);.................... #elif SOUND_PRESCALE==4.................... setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);.................... #elif SOUND_PRESCALE==8.................... setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);.................... #endif.................... enable_interrupts(int_ccp1);.................... enable_interrupts(global);.................... }........................................ // Delka tonu merena casovacem T0 (bez preruseni).................... Time=0;.................... setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);.................... while (Duration).................... {.................... #ifdef SOUND_WDT.................... restart_wdt(); // Nuluj watchdog abychom se nezresetovali.................... #endif.................... if (T0IF) // Preteceni T0 - kazdych (1/CLK)*4*256.................... {.................... T0IF = 0;.................... Time += (256*4*1000*2048+SOUND_CLOCK/2)/SOUND_CLOCK;.................... }.................... if (Time>>11).................... {.................... Time -= 2048;.................... Duration--;.................... }.................... }........................................ // Konec casovace.................... disable_interrupts(int_ccp1);.................... disable_interrupts(global);.................... }............................................................ // Definice casu pulperody pro nejnizsi oktavu, v kvantech casovace T1.................... // Pulperiody tonu v dalsich oktavach se ziskavaji rotaci vpravo.................... #define SOUND_Peri_C ((30578*(SOUND_CLOCK/1000)/1000/4/2)/SOUND_PRESCALE) // Perioda 30578us.................... #define SOUND_Peri_Cis ((28862*(SOUND_CLOCK/1000)/1000/4/2)/SOUND_PRESCALE) // Perioda 28862us.................... #define SOUND_Peri_D ((27242*(SOUND_CLOCK/1000)/1000/4/2)/SOUND_PRESCALE) // Perioda 27242us.................... #define SOUND_Peri_Dis ((25713*(SOUND_CLOCK/1000)/1000/4/2)/SOUND_PRESCALE) // Perioda 25713us.................... #define SOUND_Peri_E ((24270*(SOUND_CLOCK/1000)/1000/4/2)/SOUND_PRESCALE) // Perioda 24270us.................... #define SOUND_Peri_F ((22908*(SOUND_CLOCK/1000)/1000/4/2)/SOUND_PRESCALE) // Perioda 22908us.................... #define SOUND_Peri_Fis ((21622*(SOUND_CLOCK/1000)/1000/4/2)/SOUND_PRESCALE) // Perioda 21622us.................... #define SOUND_Peri_G ((20408*(SOUND_CLOCK/1000)/1000/4/2)/SOUND_PRESCALE) // Perioda 20408us.................... #define SOUND_Peri_Gis ((19263*(SOUND_CLOCK/1000)/1000/4/2)/SOUND_PRESCALE) // Perioda 19263us.................... #define SOUND_Peri_A ((18182*(SOUND_CLOCK/1000)/1000/4/2)/SOUND_PRESCALE) // Perioda 18182us.................... #define SOUND_Peri_Ais ((17161*(SOUND_CLOCK/1000)/1000/4/2)/SOUND_PRESCALE) // Perioda 17161us.................... #define SOUND_Peri_H ((16198*(SOUND_CLOCK/1000)/1000/4/2)/SOUND_PRESCALE) // Perioda 16198us........................................ // Kontrola na delku konstanty (musi byt mensi nez delka citace).................... #if SOUND_Peri_C > 65535.................... #error "SOUND_Peri_C too long (Note C requires delay > 65535 cycles)".................... #endif........................................ // Casove konstanty pro noty nejnizsi oktavy.................... const unsigned int16 Table[12] =.................... SOUND_Peri_C, SOUND_Peri_Cis, SOUND_Peri_D, SOUND_Peri_Dis,.................... SOUND_Peri_E, SOUND_Peri_F, SOUND_Peri_Fis, SOUND_Peri_G,.................... SOUND_Peri_Gis, SOUND_Peri_A, SOUND_Peri_Ais, SOUND_Peri_H;*0035: BCF 0A.00036: BCF 0A.10037: BCF 0A.20038: ADDWF 02,F0039: RETLW 4E003A: RETLW 95003B: RETLW ED003C: RETLW 8C003D: RETLW 04003E: RETLW 85003F: RETLW 8D0040: RETLW 7D0041: RETLW 810042: RETLW 760043: RETLW DB0044: RETLW 6F0045: RETLW 930046: RETLW 690047: RETLW A60048: RETLW 630049: RETLW 0E004A: RETLW 5E004B: RETLW C7004C: RETLW 58004D: RETLW CB004E: RETLW 53004F: RETLW 170050: RETLW 4F............................................................ void SoundNote(unsigned int8 Note, Octave, unsigned int16 Duration).................... // Predava se cislo noty (0 je C), posunuti v oktavach (0 nejnizsi ton).................... // doba trvani v ms (0 znamena ticho).................... // Zahraje zadanou notu v zadane oktave dane delky.................... {.................... unsigned int16 Time; // Pocitadlo zlomkoveho casu........................................ // Inicializace casovace.................... if (Note!=SOUND_Space) // Pokud se ma hrat spust hrani*00E2: MOVF 69,W00E3: SUBLW 0C00E4: BTFSC 03.200E5: GOTO 109.................... {.................... setup_ccp1(CCP_COMPARE_RESET_TIMER);00E6: MOVLW 0B00E7: MOVWF 17.................... set_timer1(0);00E8: CLRF 0F00E9: CLRF 0E.................... (int16)CCP_1=Table[Note]>>Octave;00EA: BCF 03.000EB: RLF 69,W00EC: MOVWF 7700ED: MOVWF 6F00EE: INCF 6F,W00EF: CALL 03500F0: MOVWF 7A00F1: MOVF 6F,W00F2: CALL 03500F3: MOVWF 7000F4: MOVF 7A,W00F5: MOVWF 7100F6: MOVWF 1600F7: MOVF 70,W00F8: MOVWF 1500F9: MOVF 6A,W00FA: MOVWF 7700FB: BTFSC 03.200FC: GOTO 10200FD: BCF 03.000FE: RRF 16,F00FF: RRF 15,F0100: DECFSZ 77,F0101: GOTO 0FD.................... #if SOUND_PRESCALE==1.................... setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);.................... #elif SOUND_PRESCALE==2.................... setup_timer_1(T1_INTERNAL|T1_DIV_BY_2);0102: MOVLW 950103: MOVWF 10.................... #elif SOUND_PRESCALE==4.................... setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);.................... #elif SOUND_PRESCALE==8.................... setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);.................... #endif.................... enable_interrupts(int_ccp1);0104: BSF 03.50105: BSF 0C.2.................... enable_interrupts(global);0106: MOVLW C00107: BCF 03.50108: IORWF 0B,F.................... }........................................ // Delka tonu merena casovacem T0 (bez preruseni).................... Time=0;0109: CLRF 6E010A: CLRF 6D.................... setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);010B: BSF 03.5010C: MOVF 01,W010D: ANDLW C0010E: IORLW 08010F: MOVWF 01.................... while (Duration)0110: BCF 03.50111: MOVF 6B,W0112: IORWF 6C,W0113: BTFSC 03.20114: GOTO 133.................... {.................... if (T0IF) // Preteceni T0 - kazdych (1/CLK)*4*2560115: BTFSS 0B.20116: GOTO 11C.................... {.................... T0IF = 0;0117: BCF 0B.2.................... Time += (256*4*1000*2048+SOUND_CLOCK/2)/SOUND_CLOCK;0118: MOVLW 690119: ADDWF 6D,F011A: BTFSC 03.0011B: INCF 6E,F.................... }.................... if (Time>>11)011C: CLRF 7A011D: RRF 6E,W011E: MOVWF 79011F: RRF 79,F0120: RRF 79,F0121: MOVLW 1F0122: ANDWF 79,F0123: MOVF 79,W0124: IORWF 7A,W0125: BTFSC 03.20126: GOTO 131.................... {.................... Time -= 2048;0127: MOVLW 000128: SUBWF 6D,F0129: MOVLW 08012A: BTFSS 03.0012B: MOVLW 09012C: SUBWF 6E,F.................... Duration--;012D: MOVF 6B,W012E: BTFSC 03.2012F: DECF 6C,F0130: DECF 6B,F.................... }.................... #ifdef SOUND_WDT.................... restart_wdt(); // Nuluj watchdog abychom se nezresetovali0131: CLRWDT.................... #endif.................... }0132: GOTO 111........................................ // Konec casovace.................... disable_interrupts(int_ccp1);0133: BSF 03.50134: BCF 0C.2.................... disable_interrupts(global);0135: BCF 03.50136: BCF 0B.60137: BCF 0B.70138: BTFSC 0B.70139: GOTO 137013A: RETLW 00.................... }............................................................ #include "Data.c" // Datovy blok pro predpripravene skladby.................... // Tento soubor definuje vse potrebne pro ulozeni skladeb do pameti programu..................... // Dale definuje pislusna makra pro snadne definice. Tyto definice jsou voleny.................... // zamerne tak, aby mohl byt pouzit stejny soubor s definici skladby jak.................... // pro vlozeni primo do firmwaru v dobe prekladu tak i k dodatecnemu nahrani.................... // skladby pres seriovou linku......................................... // Definice hranic pameti pro ulozeni pisnicek.................... #define STARTMEM 0x600 // Zde zacina pametoa oblast pro pisnicky.................... #define ENDMEM 0x7ff // Zde konci pametova oblast pro pisnicky........................................ // Definice konstant pro kodovani dat.................... #define ENDOFDATA 0x3FFF // Priznak konce pisnicek (prazdna pamet).................... #define DATABEGIN 0x2000 // Kod zacatku skladby.................... #define MASKBEGIN 0x3800.................... #define DATATEMPO 0x2800 // Kod pro nastaveni tempa.................... #define MASKTEMPO 0x3800.................... #define DATAPAUSE 0x3000 // Kod pro nastaveni mezery mezi notami.................... #define MASKPAUSE 0x3800.................... #define MASKNOTE 0x2000 // Nejvissi bit 0 urcuje, ze jde o notu........................................ // Pseudomakra pro jednoduchy zapis skladeb do zdrojaku jazyka C.................... #define BEGIN DATABEGIN+ // Zacatek pisnicky + posunuti oktav.................... #define TEMPO DATATEMPO+ // Delka nejskratsi noty v ms.................... #define PAUSE DATAPAUSE+ // Delka mezery mezi notami.................... #define END // Konec skladby, zde nic neznamena........................................ // Pseudomakra pro zapis not, zapisuje se cislo oktavy, nota, delka noty.................... #define C *16 + SOUND_C + 128 *.................... #define Cis *16 + SOUND_Cis + 128 *.................... #define D *16 + SOUND_D + 128 *.................... #define Dis *16 + SOUND_Dis + 128 *.................... #define E *16 + SOUND_E + 128 *.................... #define F *16 + SOUND_F + 128 *.................... #define Fis *16 + SOUND_Fis + 128 *.................... #define G *16 + SOUND_G + 128 *.................... #define Gis *16 + SOUND_Gis + 128 *.................... #define A *16 + SOUND_A + 128 *.................... #define Ais *16 + SOUND_Ais + 128 *.................... #define H *16 + SOUND_H + 128 *.................... #define Space SOUND_Space + 128 *........................................ // Pametova oblast.................... #ORG 0x600,0x7FF {} // Vyhrazeni oblasti pameti pro ulozeni pisnicek.................... #ROM 0x600 = { // Naplneni oblasti pameti daty........................................ // Pisnicky jako soucast firwaru se vkladaji sem.................... // Museji mit stejny format jako uvedene priklady aby zafungovaly makra.................... #include "Skladby\TheFinalSoundDown.txt".................... // Pisnicka "The Final Sound Down".................... //.................... // Tato pisnicka je napsana ve formatu, ktery se da pouzit jak pro primy.................... // preklad do firmwaru melodickeho zvonku tak i pro dodatecne nahrani........................................ BEGIN 3, // Zacatek skladby.................... TEMPO 100, // Delka nejkratsi noty v ms.................... PAUSE 100, // Delka mezery mezi notami........................................ 1 A 1,.................... 1 G 1,.................... 1 A 4,.................... 1 D 4,.................... Space 2,........................................ 1 Ais 1,.................... 1 A 1,.................... 1 Ais 2,.................... 1 A 2,.................... 1 G 4,.................... Space 2,........................................ 1 Ais 1,.................... 1 A 1,.................... 1 Ais 4,.................... 1 D 4,.................... Space 2,........................................ 1 G 1,.................... 1 F 1,.................... 1 G 2,.................... 1 F 2,.................... 1 E 2,.................... 1 G 2,.................... 1 F 4,.................... Space 2,........................................ 1 E 1,.................... 1 F 1,.................... 1 G 4,.................... Space 2,........................................ 1 F 1,.................... 1 G 1,.................... 1 A 2,.................... 1 G 2,.................... 1 F 2,.................... 1 E 2,.................... 1 D 4,.................... 1 Ais 4,.................... 1 A 4,.................... Space 2,........................................ 1 A 1,.................... 1 Ais 1,.................... 1 A 1,.................... 1 G 1,.................... 1 A 4,.................... Space 2,........................................ END........................................ #include "Skladby\BednaOdWhisky.txt".................... // Pisnicka "Bedna od Whisky".................... //.................... // Tato pisnicka je napsana ve formatu, ktery se da pouzit jak pro primy.................... // preklad do firmwaru melodickeho zvonku tak i pro dodatecne nahrani........................................ BEGIN 2, // Zacatek skladby.................... TEMPO 100, // Delka nejkratsi noty v ms.................... PAUSE 100, // Delka mezery mezi notami........................................ 1 A 2,.................... 2 C 2,.................... 2 E 2,.................... 2 A 2,.................... 2 G 4,.................... 2 E 2,.................... 2 E 2,.................... 2 A 2,.................... 2 G 2,.................... 2 E 2,.................... 2 D 2,.................... 2 E 4,.................... Space 4,.................... 1 A 2,.................... 2 C 2,.................... 2 E 2,.................... 2 A 2,.................... 2 G 2,.................... 2 G 2,.................... 2 E 2,.................... 2 E 2,.................... 1 A 2,.................... 2 E 2,.................... 1 H 2,.................... 2 E 2,.................... 1 A 4,.................... Space 4,.................... 1 A 2,.................... 2 C 2,.................... 2 E 2,.................... 2 A 2,.................... 2 G 2,.................... 2 G 2,.................... 2 E 4,.................... 2 A 2,.................... 2 G 2,.................... 2 E 2,.................... 2 D 2,.................... 2 E 4,.................... Space 2,.................... 2 E 2,.................... 1 A 2,.................... 2 C 2,.................... 2 E 2,.................... 2 A 2,.................... 2 G 2,.................... 2 E 4,.................... 2 E 2,.................... 2 A 2,.................... 2 A 2,.................... 2 GIS 2,.................... 2 H 2,.................... 2 A 4,.................... Space 8,.................... 2 E 2,.................... 2 A 2,.................... 2 A 2,.................... 2 A 2,.................... 2 GIS 2,.................... 2 FIS 2,.................... 2 A 4,.................... 2 A 2,.................... 2 H 2,.................... 2 H 2,.................... 2 A 2,.................... 2 H 2,.................... 3 CIS 2,.................... 2 A 4,.................... 2 E 2,.................... 2 A 2,.................... 2 A 2,.................... 2 A 2,.................... 2 GIS 2,.................... 2 FIS 2,.................... 2 A 2,.................... 2 A 2,.................... 2 A 2,.................... 2 H 2,.................... 2 H 2,.................... 2 A 2,.................... 2 GIS 2,.................... 2 A 4,.................... Space 2,.................... 2 E 2,.................... 2 A 2,.................... 2 A 2,.................... 2 A 2,.................... 2 GIS 2,.................... 2 FIS 2,.................... 2 A 4,.................... 2 A 2,.................... 2 H 2,.................... 2 H 2,.................... 2 A 2,.................... 2 H 2,.................... 3 CIS 2,.................... 2 A 4,.................... 2 E 2,.................... 2 A 2,.................... 2 A 2,.................... 2 A 2,.................... 2 GIS 2,.................... 2 FIS 2,.................... 2 A 2,.................... Space 2,.................... 2 A 2,.................... 2 H 2,.................... 2 H 2,.................... 2 A 2,.................... 2 GIS 2,.................... 2 A 8,.................... 2 G 2,.................... 2 A 8,.................... 2 G 2,.................... 2 A 8,........................................ END........................................ #include "Skladby\KdyzMeBaliZaVojacka.txt".................... // Pisnicka "Kdyz me brali za vojacka".................... //.................... // Tato pisnicka je napsana ve formatu, ktery se da pouzit jak pro primy.................... // preklad do firmwaru melodickeho zvonku tak i pro dodatecne nahrani........................................ BEGIN 2, // Zacatek skladby.................... TEMPO 150, // Delka nejkratsi noty v ms.................... PAUSE 100, // Delka mezery mezi notami........................................ 1 A 1,.................... 2 C 1,.................... 2 E 1,.................... 2 D 1,.................... 2 C 1,.................... 1 H 1,.................... 2 C 2,.................... 2 D 1,.................... 2 E 2,.................... 2 D 1,.................... 2 G 1,.................... 2 G 1,.................... 2 G 1,.................... 2 G 1,.................... 2 A 1,.................... 2 E 2,.................... Space 4,.................... 2 D 1,.................... 2 F 1,.................... 2 A 1,.................... 2 G 1,.................... 2 F 1,.................... 2 E 1,.................... 2 E 1,.................... 2 F 1,.................... 2 E 1,.................... 2 C 1,.................... 1 A 2,.................... 1 GIS 1,.................... 1 H 1,.................... 2 E 1,.................... 2 D 1,.................... 1 H 1,.................... 2 C 1,.................... 1 A 2,.................... Space 2,.................... 1 H 2,.................... 2 C 2,.................... Space 2,.................... 2 D 2,.................... 2 E 1,.................... 2 E 1,.................... 2 E 1,.................... 2 D 1,.................... 1 H 1,.................... 2 C 1,.................... 1 A 2,........................................ END........................................ #include "Skladby\Medvedi.txt".................... // Pisnicka "Medvedi".................... //.................... // Tato pisnicka je napsana ve formatu, ktery se da pouzit jak pro primy.................... // preklad do firmwaru melodickeho zvonku tak i pro dodatecne nahrani........................................ BEGIN 1, // Zacatek skladby.................... TEMPO 150, // Delka nejkratsi noty v ms.................... PAUSE 100, // Delka mezery mezi notami........................................ 1 C 1, // 1.................... 1 C 1,.................... 1 C 1,.................... 1 E 1,.................... 1 D 1,.................... 0 G 1,........................................ 1 C 3, // 2.................... Space 4,........................................ 1 E 1, // 3.................... 1 E 1,.................... 1 E 1,.................... 1 E 1,.................... 1 D 1,.................... 1 G 1,........................................ 1 E 2, // 4.................... Space 4,........................................ 1 G 1, // 5.................... 1 G 1,.................... 1 A 1,.................... 1 G 1,.................... 1 F 1,.................... 1 E 1,........................................ 1 F 1, // 6.................... 1 A 1,.................... 1 G 1,.................... 1 F 1,.................... 1 E 1,.................... 1 D 1,........................................ 1 C 1, // 7.................... 0 H 1,.................... 1 C 1,.................... 1 E 1,.................... 1 D 1,.................... 0 G 1,........................................ 1 C 3, // 8.................... Space 4,.................... 1 A 1, // 9.................... 1 A 1,.................... 1 A 1,.................... 1 A 1,.................... 1 H 1,.................... 2 D 1,........................................ 2 C 4, // 10.................... Space 2,........................................ 2 E 1, // 11.................... 2 E 1,.................... 2 E 1,.................... 2 E 1,.................... 2 D 1,.................... 2 G 1,........................................ 2 E 4, // 12.................... Space 2,........................................ 2 G 1, // 13.................... 2 G 1,.................... 2 A 1,.................... 2 G 1,.................... 2 F 1,.................... 2 E 1,........................................ 2 F 1, // 14.................... 2 A 1,.................... 2 G 1,.................... 2 F 1,.................... 2 E 1,.................... 2 D 1,........................................ 2 C 1, // 15.................... 1 H 1,.................... 2 C 1,.................... 2 E 1,.................... 2 D 1,.................... 1 G 1,........................................ 2 C 4, // 16.................... Space 2,........................................ 1 C 6, // 1.................... 0 G 2,........................................ 1 D 3, // 2.................... Space 3,........................................ 1 G 1, // 3.................... 1 G 1,.................... 1 Fis 1,.................... 1 G 1,.................... 1 A 1,.................... 1 Fis 1,........................................ 1 G 2, // 4.................... Space 4,........................................ 1 G 1, // 5.................... 1 G 1,.................... 1 A 1,.................... 1 G 1,.................... 1 F 1,.................... 1 E 1,........................................ 1 F 1, // 6.................... 1 A 1,.................... 1 G 1,.................... 1 F 1,.................... 1 E 1,.................... 1 D 1,........................................ 1 C 6, // 7.................... 1 E 2,........................................ 1 D 3, // 8.................... Space 3,........................................ 1 C 6, // 9.................... 0 G 2,........................................ 1 D 3, // 10.................... Space 3,........................................ 1 G 1, // 11.................... 1 G 1,.................... 1 Fis 1,.................... 1 G 1,.................... 1 A 1,.................... 1 Fis 1,........................................ 1 G 2, // 12.................... Space 4,........................................ 1 G 1, // 13.................... 1 G 1,.................... 1 A 1,.................... 1 G 1,.................... 1 F 1,.................... 1 E 1,........................................ 1 F 1, // 14.................... 1 A 1,.................... 1 G 1,.................... 1 F 1,.................... 1 E 1,.................... 1 D 1,........................................ 1 C 1, // 15.................... 0 H 1,.................... 1 C 1,.................... 1 E 1,.................... 1 D 1,.................... 0 G 1,........................................ 1 C 2, // 16.................... Space 4,........................................ END............................................................ // Koncova znacka a konec oblasti pro skladby.................... ENDOFDATA.................... }........................................ // Zruseni definic maker pro definici skladeb.................... // V dalsim programu uz nebudou potreba.................... #undef BEGIN.................... #undef TEMPO.................... #undef PAUSE.................... #undef END.................... #undef C.................... #undef Cis.................... #undef D.................... #undef Dis.................... #undef E.................... #undef F.................... #undef Fis.................... #undef G.................... #undef Gis.................... #undef A.................... #undef Ais.................... #undef H.................... #undef Space............................................................ #define RXD PIN_B1 // Port pro RS232.................... #use delay(CLOCK=20000000,RESTART_WDT) // Konfigurace pro casovani RS232.................... #use rs232(BAUD=9600,RCV=RXD,RESTART_WDT,INVERT,PARITY=N,BITS=8) // Prenosove parametry RS232*0153: MOVLW 080154: MOVWF 770155: BSF 03.50156: BSF 06.10157: CLRWDT0158: BCF 03.50159: BTFSC 06.1015A: GOTO 15D015B: BSF 03.5015C: GOTO 157015D: CLRF 61015E: BSF 77.7015F: GOTO 16E0160: BCF 77.70161: GOTO 16E0162: BCF 03.00163: BTFSS 06.10164: BSF 03.00165: RRF 61,F0166: BSF 77.60167: GOTO 16E0168: BCF 77.60169: DECFSZ 77,F016A: GOTO 162016B: MOVF 61,W016C: MOVWF 78016D: GOTO 17A016E: MOVLW A7016F: BTFSC 77.70170: MOVLW 2D0171: MOVWF 780172: DECFSZ 78,F0173: GOTO 1720174: NOP0175: BTFSC 77.70176: GOTO 1600177: BTFSC 77.60178: GOTO 1680179: GOTO 162017A: RETLW 00............................................................ // Sada globalnich promennych.................... // --------------------------.................... // Vyuzivame globalni promenne protoze je to vyhodne z hlediska spotreby zdroju. Usetri.................... // se vyznmane mnoho pameti programu pri predavani parametru............................................................ unsigned int16 Adr; // Adresovy ukazatel do pameti skladeb.................... unsigned int16 Data; // Prectena data nebo data pro zapis.................... unsigned int1 Mode; // 0=rezim testovani, 1=rezim zapisu do FLASH........................................ unsigned int16 Tempo; // Tempo (delka nejkratsi skladby v ms).................... unsigned int16 Pause; // Delka mezery mezi notami v ms.................... unsigned int8 Octava; // Posunuti skladby v oktavach........................................ unsigned int8 Beep; // Druh pipnuti pro proceduru SoundSpec.................... unsigned int1 Error; // Priznak chyby........................................ unsigned int8 CisloSkladby; // Cislo skladby pro proceduru Find a Play............................................................ // Zvuky, posloupnost zadaneho poctu tonu.................... #define SoundEndOfLine 0x01 // Kratke pipnuti na konci radky.................... #define SoundPGM 0x03 // Trilek pri vstupu do rezimu programovani.................... #define SoundPostPlay 0x03 // Po ukonceni prehravani.................... #define SoundERASE 0x02 // Zvuk pri smazani bloku FLASH pameti.................... #define SoundERR 0x05 // Chyba syntaxe........................................ void SpecBeep().................... // Data - pocet pipnuti, 0 znamena ticho.................... {.................... int Oct;........................................ if (Error) Beep=SoundERR;*013B: BTFSS 2D.1013C: GOTO 13F013D: MOVLW 05013E: MOVWF 33........................................ for(Oct=2;Beep!=0;Beep--)013F: MOVLW 020140: MOVWF 610141: MOVF 33,F0142: BTFSC 03.20143: GOTO 151.................... {.................... SoundNote(SOUND_A,Oct++,50);0144: MOVF 61,W0145: INCF 61,F0146: MOVWF 620147: MOVLW 090148: MOVWF 690149: MOVF 62,W014A: MOVWF 6A014B: CLRF 6C014C: MOVLW 32014D: MOVWF 6B014E: CALL 0E2.................... }014F: DECF 33,F0150: GOTO 141........................................ Error=0;0151: BCF 2D.10152: RETLW 00.................... }............................................................ // Precti slovo z pameti programu.................... int16 ReadData().................... // Adr - adresa ze ktere se cte.................... // Data - prectena data.................... {.................... int8 a,b; // Pomocne promenne........................................ (int8)*EEADR = Adr; // Adresa, spodni cast*01EF: MOVF 29,W01F0: BSF 03.601F1: MOVWF 0D.................... (int8)*EEADRH = Adr >> 8; // Adresa, horni cast01F2: BCF 03.601F3: MOVF 2A,W01F4: BSF 03.601F5: MOVWF 0F.................... bit_set(*EECON1,EECON1_EEPGD); // Pamet programu01F6: BSF 03.501F7: BSF 0C.7.................... bit_set(*EECON1,EECON1_RD); // Operace cteni01F8: BSF 0C.0.................... #ASM.................... nop; // Povinne nop01F9: NOP.................... nop;.................... #ENDASM01FA: NOP.................... a = (int8)*EEDATA; // Prevezmi data01FB: BCF 03.501FC: MOVF 0C,W01FD: BCF 03.601FE: MOVWF 61.................... b = (int8)*EEDATAH;01FF: BSF 03.60200: MOVF 0E,W0201: BCF 03.60202: MOVWF 62.................... Data=make16(b,a); // Sestav vysledek ze 2 bajtu0203: MOVF 62,W0204: MOVWF 2C0205: MOVF 61,W0206: MOVWF 2B0207: RETLW 00.................... }............................................................ // Smazani cele pameti vyhrazene pro skladby.................... void Erase().................... {.................... for(Adr=STARTMEM; Adr<=ENDMEM; Adr++) // Cela oblast*0482: MOVLW 060483: MOVWF 2A0484: CLRF 290485: MOVF 2A,W0486: SUBLW 070487: BTFSS 03.00488: GOTO 4B8.................... {.................... ReadData();0489: CALL 1EF.................... if (Data!=0x3FFF) // Mazu jen bloky, ktere to potrebuji048A: INCFSZ 2B,W048B: GOTO 490048C: MOVF 2C,W048D: SUBLW 3F048E: BTFSC 03.2048F: GOTO 4B4.................... {.................... if (input(POWER_PIC)!=0) return; // Nezapisuj pokud neni jumper povoleni programovani0490: BSF 03.50491: BSF 05.30492: MOVLW 000493: BCF 03.50494: BTFSC 05.30495: MOVLW 010496: XORLW 000497: BTFSC 03.20498: GOTO 49A0499: GOTO 4B8.................... (int8)*EEADR = Adr; // Adresa bloku, spodni cast049A: MOVF 29,W049B: BSF 03.6049C: MOVWF 0D.................... (int8)*EEADRH = Adr >> 8; // Adresa bloku, horni cast049D: BCF 03.6049E: MOVF 2A,W049F: BSF 03.604A0: MOVWF 0F.................... bit_set(*EECON1,EECON1_EEPGD); // Pamet programu04A1: BSF 03.504A2: BSF 0C.7.................... bit_set(*EECON1,EECON1_WREN); // Povolit zapis04A3: BSF 0C.2.................... bit_set(*EECON1,EECON1_FREE); // Operace mazani04A4: BSF 0C.4.................... (int8)*EECON2 = 0x55; // Povinna sekvence pro zapis04A5: MOVLW 5504A6: MOVWF 0D.................... (int8)*EECON2 = 0xAA;04A7: MOVLW AA04A8: MOVWF 0D.................... bit_set(*EECON1,EECON1_WR); // Zahajeni mazani04A9: BSF 0C.1.................... #ASM.................... nop; // Povinne prazdne instrukce04AA: NOP.................... nop;.................... #ENDASM04AB: NOP.................... bit_clear(*EECON1,EECON1_WREN); // Uz ne zapis04AC: BCF 0C.2.................... bit_clear(*EECON1,EECON1_FREE); // Uz ne mazani04AD: BCF 0C.4.................... bit_clear(*EECON1,EECON1_EEPGD); // Uz ne pamet programu04AE: BCF 0C.7.................... Beep=SoundERASE;04AF: MOVLW 0204B0: BCF 03.504B1: BCF 03.604B2: MOVWF 33.................... SpecBeep();04B3: CALL 13B.................... }.................... }04B4: INCF 29,F04B5: BTFSC 03.204B6: INCF 2A,F04B7: GOTO 485.................... }............................................................ // Zapis do pameti programu po jednotlivych slovech..................... // Soucastka vyzaduje zapis vzdy celych osmi slov najednou. Vyuziva se toho, ze pamet FLASH.................... // umi zapisovat jen smerem do nuly a tak staci na pozice, ktere zrovna nechceme programovat.................... // zapsat same jednicky cimz se stav jejich stav nezmeni..................... void WriteData().................... // Adr - adresa, kam se bude zapisovat.................... // Data - data, ktera se budou zapisovat.................... {.................... int i;........................................ bit_set(*EECON1,EECON1_EEPGD); // Pamet programu*0304: BSF 03.50305: BSF 03.60306: BSF 0C.7.................... bit_set(*EECON1,EECON1_WREN); // Zapis0307: BSF 0C.2.................... (int8)*EEADR = Adr & ~3; // Adresa, spodni cast, zaokrouhleno dolu na nasobek 80308: BCF 03.50309: BCF 03.6030A: MOVF 29,W030B: ANDLW FC030C: BSF 03.6030D: MOVWF 0D.................... (int8)*EEADRH = Adr >> 8; // Adresa, horni cast030E: BCF 03.6030F: MOVF 2A,W0310: BSF 03.60311: MOVWF 0F.................... for (i=0; i<4; i++)0312: BCF 03.60313: CLRF 610314: MOVF 61,W0315: SUBLW 030316: BTFSS 03.00317: GOTO 33F.................... {.................... if ((Adr & 3) == i) // Pokud je adresa slova v bloku totozna s pozadovanou0318: MOVF 29,W0319: ANDLW 03031A: MOVWF 62031B: MOVF 2A,W031C: ANDLW 00031D: MOVWF 63031E: MOVF 61,W031F: SUBWF 62,W0320: BTFSS 03.20321: GOTO 32E0322: MOVF 63,F0323: BTFSS 03.20324: GOTO 32E.................... {.................... (int8)*EEDATA =Data; // Platne slovo, spodni cast0325: MOVF 2B,W0326: BSF 03.60327: MOVWF 0C.................... (int8)*EEDATAH=Data >> 8; // Platne slovo, horni cast0328: BCF 03.60329: MOVF 2C,W032A: BSF 03.6032B: MOVWF 0E.................... }.................... else // Ostatni bunky nemenime032C: GOTO 332032D: BCF 03.6.................... {.................... (int8)*EEDATA =0xFF; // Zbytek same jednicky032E: MOVLW FF032F: BSF 03.60330: MOVWF 0C.................... (int8)*EEDATAH=0xFF;0331: MOVWF 0E.................... }.................... (int8)*EECON2 = 0x55; // Povinna sekvence pro zapis0332: MOVLW 550333: BSF 03.50334: MOVWF 0D.................... (int8)*EECON2 = 0xAA;0335: MOVLW AA0336: MOVWF 0D.................... bit_set(*EECON1,EECON1_WR); // Zahajeni zapisu0337: BSF 0C.1.................... #ASM.................... nop; // Povinne dve prazdne instrukce0338: NOP.................... nop;.................... #ENDASM0339: NOP.................... ((int8)*EEADR) ++; // Dalsi slovo033A: BCF 03.5033B: INCF 0D,F.................... }033C: BCF 03.6033D: INCF 61,F033E: GOTO 314.................... bit_clear(*EECON1,EECON1_WREN); // Konec zapisu033F: BSF 03.50340: BSF 03.60341: BCF 0C.2.................... bit_clear(*EECON1,EECON1_EEPGD); // Uz ne pamet programu (bezpecnost)0342: BCF 0C.7.................... }............................................................ // Zapise data Data na adresu Adr a provede posun na dalsi adresu, zapisuje se jen do.................... // dovolene oblasti pameti a jen v pripade, ze je Mode=1.................... void WriteDataInc().................... // Data - co se zapisuje.................... // Adr - kam se zapisuje, po zapisu se adresa posouva.................... {.................... if (~Mode) return; // Neni rezim zapisu*02E0: BTFSC 2D.002E1: GOTO 2E302E2: GOTO 34A.................... if ( (Adr>=STARTMEM) & (Adr<=ENDMEM) & (input(POWER_PIC)==0) )02E3: MOVF 2A,W02E4: SUBLW 0502E5: BTFSS 03.002E6: GOTO 2E902E7: MOVLW 0002E8: GOTO 2EA02E9: MOVLW 0102EA: MOVWF 6102EB: MOVF 2A,W02EC: SUBLW 0702ED: BTFSC 03.002EE: GOTO 2F102EF: MOVLW 0002F0: GOTO 2F202F1: MOVLW 0102F2: ANDWF 61,W02F3: MOVWF 6202F4: BSF 03.502F5: BSF 05.302F6: MOVLW 0002F7: BCF 03.502F8: BTFSC 05.302F9: MOVLW 0102FA: XORLW 0002FB: BTFSC 03.202FC: GOTO 2FF02FD: MOVLW 0002FE: GOTO 30002FF: MOVLW 010300: ANDWF 62,W0301: XORLW 000302: BTFSC 03.20303: GOTO 349.................... {.................... WriteData();.................... Adr++;*0343: BCF 03.50344: BCF 03.60345: INCF 29,F0346: BTFSC 03.20347: INCF 2A,F.................... }.................... else0348: GOTO 34A.................... {.................... Error=1;0349: BSF 2D.1.................... }034A: RETLW 00.................... }............................................................ // Najdi zacatek zadaneho cisla skladby. Promenna Adr ukazuje na zacatek skladby..................... // Neni-li skladba nalezena ukazuje Adr na koncovou znacku (0x3FFF) posledni skladby.................... // nebo na konec pameti..................... int1 Find().................... // CisloSkladby - poradove cislo skladby.................... // Adr - adresa zacatku skladby.................... {.................... Adr=STARTMEM-1; // Od zacatku oblasti pro skladby*0208: MOVLW 050209: MOVWF 2A020A: MOVLW FF020B: MOVWF 29.................... for(;1;).................... {.................... Adr++;020C: INCF 29,F020D: BTFSC 03.2020E: INCF 2A,F.................... ReadData(); // Precti data020F: CALL 1EF.................... if (Data==ENDOFDATA) return 1; // Priznak konce dat0210: INCFSZ 2B,W0211: GOTO 2190212: MOVF 2C,W0213: SUBLW 3F0214: BTFSS 03.20215: GOTO 2190216: MOVLW 010217: MOVWF 780218: GOTO 236.................... if (Adr==ENDMEM+1) return 1; // Uz jsme prosli celou pamet0219: MOVF 29,F021A: BTFSS 03.2021B: GOTO 223021C: MOVF 2A,W021D: SUBLW 08021E: BTFSS 03.2021F: GOTO 2230220: MOVLW 010221: MOVWF 780222: GOTO 236.................... if ((Data&MASKBEGIN)==DATABEGIN) // Priznak zacatku skladby0223: MOVF 2B,W0224: ANDLW 000225: MOVWF 610226: MOVF 2C,W0227: ANDLW 380228: MOVWF 620229: MOVF 61,F022A: BTFSS 03.2022B: GOTO 235022C: MOVF 62,W022D: SUBLW 20022E: BTFSS 03.2022F: GOTO 235.................... {.................... CisloSkladby--; // Otestuj pocitadlo skladeb0230: DECFSZ 34,F.................... if (CisloSkladby==0) return 0; // Je to tato skladba0231: GOTO 2350232: MOVLW 000233: MOVWF 780234: GOTO 236.................... }.................... }0235: GOTO 20C0236: RETLW 00.................... }............................................................ // Zahraj jednu notu.................... void PlayData().................... // Data = zakodovana nota.................... // Tempo, Octava, Pause = parametry hrane noty.................... {.................... SoundNote((int8)Data&0xF,Octava+(((int8)Data>>4)&0x7),Tempo*((Data>>7)&0x3F)); // Nota0237: MOVF 2B,W0238: ANDLW 0F0239: MOVWF 61023A: SWAPF 2B,W023B: MOVWF 77023C: MOVLW 0F023D: ANDWF 77,F023E: MOVF 77,W023F: ANDLW 070240: ADDWF 32,W0241: MOVWF 630242: RRF 2C,W0243: MOVWF 650244: RRF 2B,W0245: MOVWF 640246: RRF 65,F0247: RRF 64,F0248: RRF 65,F0249: RRF 64,F024A: RRF 65,F024B: RRF 64,F024C: RRF 65,F024D: RRF 64,F024E: RRF 65,F024F: RRF 64,F0250: RRF 65,F0251: RRF 64,F0252: MOVLW 010253: ANDWF 65,F0254: MOVF 64,W0255: ANDLW 3F0256: MOVWF 770257: MOVF 65,W0258: ANDLW 000259: MOVWF 7A025A: MOVF 77,W025B: MOVWF 66025C: MOVF 7A,W025D: MOVWF 67025E: MOVF 2F,W025F: MOVWF 690260: MOVF 2E,W0261: MOVWF 680262: MOVF 7A,W0263: MOVWF 6B0264: MOVF 77,W0265: MOVWF 6A0266: CALL 17B0267: MOVF 79,W0268: MOVWF 680269: MOVF 78,W026A: MOVWF 67026B: MOVF 61,W026C: MOVWF 69026D: MOVF 63,W026E: MOVWF 6A026F: MOVF 79,W0270: MOVWF 6C0271: MOVF 78,W0272: MOVWF 6B0273: CALL 0E2.................... SoundNote(SOUND_Space,0,Pause); // Mezera0274: MOVLW 0C0275: MOVWF 690276: CLRF 6A0277: MOVF 31,W0278: MOVWF 6C0279: MOVF 30,W027A: MOVWF 6B027B: CALL 0E2027C: RETLW 00.................... }............................................................ // Zahraj skladbu od zadane adresy v promenne Adr..................... void Play().................... // CisloSkladby - cislo skladby k hrani.................... {.................... if (Find()) // Najdi zacatek skladby v pameti skladeb027D: CALL 208027E: MOVF 78,F027F: BTFSC 03.20280: GOTO 282.................... {.................... return; // Skladba nenalezena0281: GOTO 2DF.................... }........................................ Tempo=100; // Default delka noty0282: CLRF 2F0283: MOVLW 640284: MOVWF 2E.................... Pause=100; // Default mezera mezi notami0285: CLRF 310286: MOVWF 30........................................ Octava=Data&~MASKBEGIN; // Posunuti oktav (povinna soucast zacatku skladby)0287: MOVF 2B,W0288: MOVWF 32.................... Adr++;0289: INCF 29,F028A: BTFSC 03.2028B: INCF 2A,F........................................ for (;1;).................... {.................... if (Adr==ENDMEM+1) return; // Konec pametove oblasti028C: MOVF 29,F028D: BTFSS 03.2028E: GOTO 294028F: MOVF 2A,W0290: SUBLW 080291: BTFSS 03.20292: GOTO 2940293: GOTO 2DF.................... ReadData(); // Vezmi data0294: CALL 1EF.................... Adr++; // Posun adresu0295: INCF 29,F0296: BTFSC 03.20297: INCF 2A,F.................... if (Data==ENDOFDATA) return; // Konec dat0298: INCFSZ 2B,W0299: GOTO 29F029A: MOVF 2C,W029B: SUBLW 3F029C: BTFSS 03.2029D: GOTO 29F029E: GOTO 2DF.................... if ((Data&MASKBEGIN)==DATABEGIN) return; // Zacatek dalsi skladby029F: MOVF 2B,W02A0: ANDLW 0002A1: MOVWF 6102A2: MOVF 2C,W02A3: ANDLW 3802A4: MOVWF 6202A5: MOVF 61,F02A6: BTFSS 03.202A7: GOTO 2AD02A8: MOVF 62,W02A9: SUBLW 2002AA: BTFSS 03.202AB: GOTO 2AD02AC: GOTO 2DF.................... if ((Data&MASKTEMPO)==DATATEMPO) Tempo=Data&~DATATEMPO; // Paramter TEMPO02AD: MOVF 2B,W02AE: ANDLW 0002AF: MOVWF 6102B0: MOVF 2C,W02B1: ANDLW 3802B2: MOVWF 6202B3: MOVF 61,F02B4: BTFSS 03.202B5: GOTO 2BF02B6: MOVF 62,W02B7: SUBLW 2802B8: BTFSS 03.202B9: GOTO 2BF02BA: MOVF 2B,W02BB: MOVWF 2E02BC: MOVF 2C,W02BD: ANDLW D702BE: MOVWF 2F.................... if ((Data&MASKPAUSE)==DATAPAUSE) Pause=Data&~DATAPAUSE; // Parametr PAUSE02BF: MOVF 2B,W02C0: ANDLW 0002C1: MOVWF 6102C2: MOVF 2C,W02C3: ANDLW 3802C4: MOVWF 6202C5: MOVF 61,F02C6: BTFSS 03.202C7: GOTO 2D102C8: MOVF 62,W02C9: SUBLW 3002CA: BTFSS 03.202CB: GOTO 2D102CC: MOVF 2B,W02CD: MOVWF 3002CE: MOVF 2C,W02CF: ANDLW CF02D0: MOVWF 31.................... if ((Data&MASKNOTE)==0) // Nota02D1: MOVF 2B,W02D2: ANDLW 0002D3: MOVWF 6102D4: MOVF 2C,W02D5: ANDLW 2002D6: MOVWF 6202D7: MOVF 61,F02D8: BTFSS 03.202D9: GOTO 2DE02DA: MOVF 62,F02DB: BTFSS 03.202DC: GOTO 2DE.................... {.................... PlayData(); // Zahraj notu02DD: CALL 237.................... }.................... }02DE: GOTO 28C02DF: RETLW 00.................... }............................................................ // Vycisli cislo z bufferu, posune ukazovatko na prvni nezpracovany znak, preskakuje mezery.................... int16 Number(char line[], int *a, len).................... {.................... int16 Data;.................... char c;........................................ while((line[*a]==' ')&(*a<len)) // Vynech mezery na zacatku*0190: MOVF 62,W0191: MOVWF 040192: MOVF 61,W0193: ADDWF 00,W0194: MOVWF 040195: MOVF 00,W0196: SUBLW 200197: BTFSC 03.20198: GOTO 19B0199: MOVLW 00019A: GOTO 19C019B: MOVLW 01019C: MOVWF 69019D: MOVF 62,W019E: MOVWF 04019F: MOVF 63,W01A0: SUBWF 00,W01A1: BTFSS 03.001A2: GOTO 1A501A3: MOVLW 0001A4: GOTO 1A601A5: MOVLW 0101A6: ANDWF 69,W01A7: XORLW 0001A8: BTFSC 03.201A9: GOTO 1AE.................... (*a)++; // Posouvej ukazovatko01AA: MOVF 62,W01AB: MOVWF 0401AC: INCF 00,F01AD: GOTO 190........................................ Data=0;01AE: CLRF 6501AF: CLRF 64.................... while (1).................... {.................... if (*a>=len) return Data; // Konec retezce01B0: MOVF 62,W01B1: MOVWF 0401B2: MOVF 63,W01B3: SUBWF 00,W01B4: BTFSS 03.001B5: GOTO 1BB01B6: MOVF 64,W01B7: MOVWF 7801B8: MOVF 65,W01B9: MOVWF 7901BA: GOTO 1EE.................... c=line[*a]; // Vezmi znak z pole01BB: MOVF 62,W01BC: MOVWF 0401BD: MOVF 61,W01BE: ADDWF 00,W01BF: MOVWF 0401C0: MOVF 00,W01C1: MOVWF 66.................... if ((c<'0')|(c>'9')) return Data; // Koncime pokud znak neni cislice01C2: MOVF 66,W01C3: SUBLW 2F01C4: BTFSC 03.001C5: GOTO 1C801C6: MOVLW 0001C7: GOTO 1C901C8: MOVLW 0101C9: MOVWF 6701CA: MOVF 66,W01CB: SUBLW 3901CC: BTFSS 03.001CD: GOTO 1D001CE: MOVLW 0001CF: GOTO 1D101D0: MOVLW 0101D1: IORWF 67,W01D2: XORLW 0001D3: BTFSC 03.201D4: GOTO 1DA01D5: MOVF 64,W01D6: MOVWF 7801D7: MOVF 65,W01D8: MOVWF 7901D9: GOTO 1EE.................... Data = Data * 10 + (c-'0'); // Pouzij cislici01DA: MOVF 65,W01DB: MOVWF 6901DC: MOVF 64,W01DD: MOVWF 6801DE: CLRF 6B01DF: MOVLW 0A01E0: MOVWF 6A01E1: CALL 17B01E2: MOVLW 3001E3: SUBWF 66,W01E4: ADDWF 78,W01E5: MOVWF 6401E6: MOVF 79,W01E7: MOVWF 6501E8: BTFSC 03.001E9: INCF 65,F.................... (*a)++; // Dalsi znak01EA: MOVF 62,W01EB: MOVWF 0401EC: INCF 00,F.................... }01ED: GOTO 1B001EE: RETLW 00.................... }............................................................ // Vyhledej klicove slovo a vrat jeho zkraceny kod.................... // Pokud slovo neexistuje vraci -1.................... // Format definice - retezec ukonceny nulou + zastupny znak, na konci prazdny retezec (nula).................... const char KeyWords[] =.................... {.................... 'P','L','A','Y',0, 'P',.................... 'E','R','A','S','E',0, 'E',.................... 'T','E','M','P','O',0, 't',.................... 'P','A','U','S','E',0, 'p',.................... 'B','E','G','I','N',0, 'B',.................... 'T','E','S','T',0, 'b',.................... 'E','N','D',0, 'Z',.................... 'C',0. SOUND_C,.................... 'C','I','S',0, SOUND_Cis,.................... 'D',0, SOUND_D,.................... 'D','I','S',0, SOUND_Dis,.................... 'E',0, SOUND_E,.................... 'F',0, SOUND_F,.................... 'F','I','S',0, SOUND_Fis,.................... 'G',0, SOUND_G,.................... 'G','I','S',0, SOUND_Gis,.................... 'A',0, SOUND_A,.................... 'A','I','S',0, SOUND_Ais,.................... 'H',0, SOUND_H,.................... 'S','P','A','C','E',0, SOUND_Space.................... };*0051: BCF 0A.00052: BCF 0A.10053: BCF 0A.20054: ADDWF 02,F0055: RETLW 500056: RETLW 4C0057: RETLW 410058: RETLW 590059: RETLW 00005A: RETLW 50005B: RETLW 45005C: RETLW 52005D: RETLW 41005E: RETLW 53005F: RETLW 450060: RETLW 000061: RETLW 450062: RETLW 540063: RETLW 450064: RETLW 4D0065: RETLW 500066: RETLW 4F0067: RETLW 000068: RETLW 740069: RETLW 50006A: RETLW 41006B: RETLW 55006C: RETLW 53006D: RETLW 45006E: RETLW 00006F: RETLW 700070: RETLW 420071: RETLW 450072: RETLW 470073: RETLW 490074: RETLW 4E0075: RETLW 000076: RETLW 420077: RETLW 540078: RETLW 450079: RETLW 53007A: RETLW 54007B: RETLW 00007C: RETLW 62007D: RETLW 45007E: RETLW 4E007F: RETLW 440080: RETLW 000081: RETLW 5A0082: RETLW 430083: RETLW 000084: RETLW 000085: RETLW 430086: RETLW 490087: RETLW 530088: RETLW 000089: RETLW 01008A: RETLW 44008B: RETLW 00008C: RETLW 02008D: RETLW 44008E: RETLW 49008F: RETLW 530090: RETLW 000091: RETLW 030092: RETLW 450093: RETLW 000094: RETLW 040095: RETLW 460096: RETLW 000097: RETLW 050098: RETLW 460099: RETLW 49009A: RETLW 53009B: RETLW 00009C: RETLW 06009D: RETLW 47009E: RETLW 00009F: RETLW 0700A0: RETLW 4700A1: RETLW 4900A2: RETLW 5300A3: RETLW 0000A4: RETLW 0800A5: RETLW 4100A6: RETLW 0000A7: RETLW 0900A8: RETLW 4100A9: RETLW 4900AA: RETLW 5300AB: RETLW 0000AC: RETLW 0A00AD: RETLW 4800AE: RETLW 0000AF: RETLW 0B00B0: RETLW 5300B1: RETLW 5000B2: RETLW 4100B3: RETLW 4300B4: RETLW 4500B5: RETLW 0000B6: RETLW 0C.................... signed int Word(char line[], unsigned int8 *a, len).................... {.................... unsigned int8 i; // Index do pole klicovych slov.................... unsigned int8 j; // index do zpracovavane radky........................................ while((line[*a]==' ')&(*a<len)) // Vynech mezery na zacatku*03A6: MOVF 62,W03A7: MOVWF 0403A8: MOVF 61,W03A9: ADDWF 00,W03AA: MOVWF 0403AB: MOVF 00,W03AC: SUBLW 2003AD: BTFSC 03.203AE: GOTO 3B103AF: MOVLW 0003B0: GOTO 3B203B1: MOVLW 0103B2: MOVWF 6803B3: MOVF 62,W03B4: MOVWF 0403B5: MOVF 63,W03B6: SUBWF 00,W03B7: BTFSS 03.003B8: GOTO 3BB03B9: MOVLW 0003BA: GOTO 3BC03BB: MOVLW 0103BC: ANDWF 68,W03BD: XORLW 0003BE: BTFSC 03.203BF: GOTO 3C4.................... (*a)++; // Posouvej ukazovatko03C0: MOVF 62,W03C1: MOVWF 0403C2: INCF 00,F03C3: GOTO 3A6........................................ for (i=0;i<sizeof(KeyWords);) // Slova ze slovniku03C4: CLRF 6403C5: MOVF 64,W03C6: SUBLW 6103C7: BTFSS 03.003C8: GOTO 430.................... {.................... for (j=*a;(j<len)&(KeyWords[i]!=0)&(KeyWords[i]==line[j]);i++,j++) // Znaky ze slova03C9: MOVF 62,W03CA: MOVWF 0403CB: MOVF 00,W03CC: MOVWF 6503CD: MOVF 63,W03CE: SUBWF 65,W03CF: BTFSS 03.003D0: GOTO 3D303D1: MOVLW 0003D2: GOTO 3D403D3: MOVLW 0103D4: MOVWF 6603D5: MOVF 64,W03D6: CALL 05103D7: XORLW 0003D8: BTFSS 03.203D9: GOTO 3DC03DA: MOVLW 0003DB: GOTO 3DD03DC: MOVLW 0103DD: ANDWF 66,W03DE: MOVWF 6803DF: MOVF 64,W03E0: CALL 05103E1: MOVWF 6903E2: MOVF 61,W03E3: ADDWF 65,W03E4: MOVWF 0403E5: MOVF 00,W03E6: SUBWF 69,W03E7: BTFSC 03.203E8: GOTO 3EB03E9: MOVLW 0003EA: GOTO 3EC03EB: MOVLW 0103EC: ANDWF 68,W03ED: XORLW 0003EE: BTFSC 03.203EF: GOTO 3F4.................... {.................... }03F0: MOVF 64,W03F1: INCF 64,F03F2: INCF 65,F03F3: GOTO 3CD.................... if ((KeyWords[i]==0)&((line[j]==' ')|(j==len)))03F4: MOVF 64,W03F5: CALL 05103F6: XORLW 0003F7: BTFSC 03.203F8: GOTO 3FB03F9: MOVLW 0003FA: GOTO 3FC03FB: MOVLW 0103FC: MOVWF 6703FD: MOVF 61,W03FE: ADDWF 65,W03FF: MOVWF 040400: MOVF 00,W0401: SUBLW 200402: BTFSC 03.20403: GOTO 4060404: MOVLW 000405: GOTO 4070406: MOVLW 010407: MOVWF 690408: MOVF 63,W0409: SUBWF 65,W040A: BTFSC 03.2040B: GOTO 40E040C: MOVLW 00040D: GOTO 40F040E: MOVLW 01040F: IORWF 69,W0410: ANDWF 67,W0411: XORLW 000412: BTFSC 03.20413: GOTO 426.................... {.................... if (j>=len) j=len-1; // Korekce abychom se nedostali za konec retezce0414: MOVF 63,W0415: SUBWF 65,W0416: BTFSS 03.00417: GOTO 41B0418: MOVLW 010419: SUBWF 63,W041A: MOVWF 65.................... *a=j+1; // Posun ukazovatko za zpracovane slovo041B: MOVF 62,W041C: MOVWF 04041D: MOVLW 01041E: ADDWF 65,W041F: MOVWF 00........................................ return KeyWords[i+1]; // Vrat zastupnou hodnotu z tabulky klicovych slov0420: MOVLW 010421: ADDWF 64,W0422: CALL 0510423: MOVWF 780424: MOVWF 780425: GOTO 432.................... }.................... while(KeyWords[i]!=0) i++; // Preskoc zbytek slova v tabulce0426: MOVF 64,W0427: CALL 0510428: XORLW 000429: BTFSC 03.2042A: GOTO 42D042B: INCF 64,F042C: GOTO 426.................... i++; // Preskoc oddelovac042D: INCF 64,F.................... i++; // Preskoc polozku se zastupnou hodnotou042E: INCF 64,F.................... }042F: GOTO 3C5.................... return -1; // Prosli jsme cely slovnik a nedoslo ke shode0430: MOVLW FF0431: MOVWF 78.................... }............................................................ // Programovani pres RS232.................... #define LINELEN 40 // Delka radky pro RS232.................... #define CR 0x0D // Odradkovani.................... #define BS 0x08 // Back Space........................................ #separate.................... void Download().................... {.................... char line[LINELEN]; // Buffer na radku.................... unsigned char c; // Znak.................... unsigned int8 a; // Ukazovatko do bufferu.................... unsigned int8 len; // Delka retezce v radce.................... unsigned int8 Oct; // Cislo oktavy u noty........................................ output_low(POWER_386); // Zapni napajeni zesilovace*034B: BSF 03.5034C: BCF 05.4034D: BCF 03.5034E: BCF 05.4.................... SoundNote(SOUND_Space,3,10); // Mezera034F: MOVLW 0C0350: MOVWF 690351: MOVLW 030352: MOVWF 6A0353: CLRF 6C0354: MOVLW 0A0355: MOVWF 6B0356: CALL 0E2.................... Beep=SoundPGM;0357: MOVLW 030358: MOVWF 33.................... Error=0;0359: BCF 2D.1.................... SpecBeep(); // Pipni na znameni vstupu do programovani035A: CALL 13B........................................ Tempo=100; // Default hodnoty035B: CLRF 2F035C: MOVLW 64035D: MOVWF 2E.................... Pause=100;035E: CLRF 31035F: MOVWF 30.................... Octava=0;0360: CLRF 32.................... Mode=0; // Mod hrani0361: BCF 2D.0.................... Oct=0;0362: CLRF 60.................... a=0; // Na zacatku je radka prazdna0363: CLRF 5E........................................ for(;input(POWER_PIC)==0;) // Opakuj vse dokud je PGM rezim0364: BSF 03.50365: BSF 05.30366: MOVLW 000367: BCF 03.50368: BTFSC 05.30369: MOVLW 01036A: XORLW 00036B: BTFSS 03.2036C: GOTO 594.................... {.................... Loop:.................... c=Getc(); // Vezmi znak ze seriovky036D: CALL 153036E: MOVF 78,W036F: MOVWF 5D.................... if (c>=0x80) goto Loop; // Ignoruj znaky nad ASCII0370: MOVF 5D,W0371: SUBLW 7F0372: BTFSC 03.00373: GOTO 3750374: GOTO 36D.................... if (c>=0x60) c=c-0x20; // Preved velka pismena na velka pismena0375: MOVF 5D,W0376: SUBLW 5F0377: BTFSC 03.00378: GOTO 37B0379: MOVLW 20037A: SUBWF 5D,F.................... if ((c==CR)|(c=='/')) // Konec radky nebo komentar037B: MOVF 5D,W037C: SUBLW 0D037D: BTFSC 03.2037E: GOTO 381037F: MOVLW 000380: GOTO 3820381: MOVLW 010382: MOVWF 610383: MOVF 5D,W0384: SUBLW 2F0385: BTFSC 03.20386: GOTO 3890387: MOVLW 000388: GOTO 38A0389: MOVLW 01038A: IORWF 61,W038B: XORLW 00038C: BTFSC 03.2038D: GOTO 560.................... {.................... while (c!=CR) c=Getc(); // Zpracuj znaky komentare038E: MOVF 5D,W038F: SUBLW 0D0390: BTFSC 03.20391: GOTO 3960392: CALL 1530393: MOVF 78,W0394: MOVWF 5D0395: GOTO 38E.................... len=a; // Zapamatuj si delku radky0396: MOVF 5E,W0397: MOVWF 5F.................... a=0; // Postav se na zacatek radky0398: CLRF 5E.................... Beep=SoundEndOfLine; // Default zuk na konci radky0399: MOVLW 01039A: MOVWF 33.................... // Zpracovani radky.................... while(a<len)039B: MOVF 5F,W039C: SUBWF 5E,W039D: BTFSC 03.0039E: GOTO 55D.................... {.................... restart_wdt(); // Nuluj watchdog abychom se nezresetovali039F: CLRWDT.................... c=Word(line,&a,len);03A0: MOVLW 3503A1: MOVWF 6103A2: MOVLW 5E03A3: MOVWF 6203A4: MOVF 5F,W03A5: MOVWF 63*0432: MOVF 78,W0433: MOVWF 5D.................... if (c==-1) // Nezname klicove slovo0434: MOVF 5D,W0435: SUBLW FF0436: BTFSS 03.20437: GOTO 46B.................... {.................... if (a<len) // Nejsme uz na konci radky ??0438: MOVF 5F,W0439: SUBWF 5E,W043A: BTFSC 03.0043B: GOTO 46A.................... {.................... if ((line[a]>='0')&(line[a]<='9')) // Stojime na cislici -> je to cislo043C: MOVLW 35043D: ADDWF 5E,W043E: MOVWF 04043F: MOVF 00,W0440: SUBLW 2F0441: BTFSS 03.00442: GOTO 4450443: MOVLW 000444: GOTO 4460445: MOVLW 010446: MOVWF 620447: MOVLW 350448: ADDWF 5E,W0449: MOVWF 04044A: MOVF 00,W044B: SUBLW 39044C: BTFSC 03.0044D: GOTO 450044E: MOVLW 00044F: GOTO 4510450: MOVLW 010451: ANDWF 62,W0452: XORLW 000453: BTFSC 03.20454: GOTO 461.................... {.................... // Oct=Number(line,&a,len)&0x7; // tohle nefunguje protoze je chyba v prekladaci.................... Oct=Number(line,&a,len); // prekladac prepoklada, z W obsahuje spodni bajt vysledku0455: MOVLW 350456: MOVWF 610457: MOVLW 5E0458: MOVWF 620459: MOVF 5F,W045A: MOVWF 63045B: CALL 190045C: MOVF 78,W045D: MOVWF 60.................... Oct&=0x7; // ale k navratu pouziva RETLW 0 coz smaze W !045E: MOVLW 07045F: ANDWF 60,F.................... }.................... else // Stojime na pismenu nebo oddelovaci0460: GOTO 46A.................... {.................... if (line[a]!=' ') Error=1; // Neni to oddelovac - chyba0461: MOVLW 350462: ADDWF 5E,W0463: MOVWF 040464: MOVF 00,W0465: SUBLW 200466: BTFSC 03.20467: GOTO 4690468: BSF 2D.1.................... a++; // Preskocim 1 znak (a kdyz to nepomuze dostanu se zase sem)0469: INCF 5E,F.................... }.................... }.................... }.................... else if (c=='P') // Play046A: GOTO 55C046B: MOVF 5D,W046C: SUBLW 50046D: BTFSS 03.2046E: GOTO 47D.................... {.................... CisloSkladby=Number(line,&a,len);046F: MOVLW 350470: MOVWF 610471: MOVLW 5E0472: MOVWF 620473: MOVF 5F,W0474: MOVWF 630475: CALL 1900476: MOVF 78,W0477: MOVWF 34.................... Mode=0;0478: BCF 2D.0.................... Play();0479: CALL 27D.................... Beep=SoundPGM;047A: MOVLW 03047B: MOVWF 33.................... }.................... else if (c=='E') // Erase047C: GOTO 55C047D: MOVF 5D,W047E: SUBLW 45047F: BTFSS 03.20480: GOTO 4BB.................... {.................... Mode=0;0481: BCF 2D.0.................... Erase();.................... Beep=SoundPGM;*04B8: MOVLW 0304B9: MOVWF 33.................... }.................... else if (c=='t') // Tempo04BA: GOTO 55C04BB: MOVF 5D,W04BC: SUBLW 7404BD: BTFSS 03.204BE: GOTO 4DB.................... {.................... Tempo=Number(line,&a,len)&~MASKTEMPO;04BF: MOVLW 3504C0: MOVWF 6104C1: MOVLW 5E04C2: MOVWF 6204C3: MOVF 5F,W04C4: MOVWF 6304C5: CALL 19004C6: MOVF 78,W04C7: MOVWF 2E04C8: MOVF 79,W04C9: ANDLW C704CA: MOVWF 2F.................... if (Tempo==0) Tempo=100;04CB: MOVF 2E,F04CC: BTFSS 03.204CD: GOTO 4D404CE: MOVF 2F,F04CF: BTFSS 03.204D0: GOTO 4D404D1: CLRF 2F04D2: MOVLW 6404D3: MOVWF 2E.................... Data=Tempo|DATATEMPO;04D4: MOVF 2E,W04D5: MOVWF 2B04D6: MOVF 2F,W04D7: IORLW 2804D8: MOVWF 2C.................... WriteDataInc(); // Podmineny zapis do FLASH a posun na dalsi adresu04D9: CALL 2E0.................... }.................... else if (c=='p') // Pause04DA: GOTO 55C04DB: MOVF 5D,W04DC: SUBLW 7004DD: BTFSS 03.204DE: GOTO 4FB.................... {.................... Pause=Number(line,&a,len)&~MASKPAUSE;04DF: MOVLW 3504E0: MOVWF 6104E1: MOVLW 5E04E2: MOVWF 6204E3: MOVF 5F,W04E4: MOVWF 6304E5: CALL 19004E6: MOVF 78,W04E7: MOVWF 3004E8: MOVF 79,W04E9: ANDLW C704EA: MOVWF 31.................... if (Pause==0) Pause=100;04EB: MOVF 30,F04EC: BTFSS 03.204ED: GOTO 4F404EE: MOVF 31,F04EF: BTFSS 03.204F0: GOTO 4F404F1: CLRF 3104F2: MOVLW 6404F3: MOVWF 30.................... Data=Pause|DATAPAUSE;04F4: MOVF 30,W04F5: MOVWF 2B04F6: MOVF 31,W04F7: IORLW 3004F8: MOVWF 2C.................... WriteDataInc(); // Podmineny zapis do FLASH a posun na dalsi adresu04F9: CALL 2E0.................... }.................... else if (c=='B') // Begin04FA: GOTO 55C04FB: MOVF 5D,W04FC: SUBLW 4204FD: BTFSS 03.204FE: GOTO 512.................... {.................... CisloSkladby=~0; // Neplatne cislo skladby04FF: MOVLW FF0500: MOVWF 34.................... Find(); // najde konec posledni skladby0501: CALL 208.................... Octava=Number(line,&a,len)&~MASKBEGIN;0502: MOVLW 350503: MOVWF 610504: MOVLW 5E0505: MOVWF 620506: MOVF 5F,W0507: MOVWF 630508: CALL 1900509: MOVF 78,W050A: MOVWF 32.................... Data=DATABEGIN|Octava; // Zacatecni znacka050B: MOVF 32,W050C: MOVWF 2B050D: MOVLW 20050E: MOVWF 2C.................... Mode=1; // Mod zapisu do FLASH pameti050F: BSF 2D.0.................... WriteDataInc(); // Podmineny zapis do FLASH a posun na dalsi adresu0510: CALL 2E0.................... }.................... else if (c=='b') // Test0511: GOTO 55C0512: MOVF 5D,W0513: SUBLW 620514: BTFSS 03.20515: GOTO 521.................... {.................... Octava=Number(line,&a,len)&~MASKBEGIN;0516: MOVLW 350517: MOVWF 610518: MOVLW 5E0519: MOVWF 62051A: MOVF 5F,W051B: MOVWF 63051C: CALL 190051D: MOVF 78,W051E: MOVWF 32.................... Mode=0;051F: BCF 2D.0.................... }.................... else if (c=='Z') // End0520: GOTO 55C0521: MOVF 5D,W0522: SUBLW 5A0523: BTFSS 03.20524: GOTO 527.................... {.................... Mode=0;0525: BCF 2D.0.................... }.................... else // Nota0526: GOTO 55C.................... {.................... Data=Number(line,&a,len); // Delka noty (nepovinna)0527: MOVLW 350528: MOVWF 610529: MOVLW 5E052A: MOVWF 62052B: MOVF 5F,W052C: MOVWF 63052D: CALL 190052E: MOVF 79,W052F: MOVWF 2C0530: MOVF 78,W0531: MOVWF 2B.................... Data&=0x3F; // Jen platny rozsah0532: MOVLW 3F0533: ANDWF 2B,F0534: MOVLW 000535: ANDWF 2C,F.................... if (Data==0) Data++; // Je-li nulova delka - dej jednotkovou0536: MOVF 2B,F0537: BTFSS 03.20538: GOTO 53F0539: MOVF 2C,F053A: BTFSS 03.2053B: GOTO 53F053C: INCF 2B,F053D: BTFSC 03.2053E: INCF 2C,F.................... Data<<=7; // Delka053F: RLF 2B,F0540: RLF 2C,F0541: RLF 2B,F0542: RLF 2C,F0543: RLF 2B,F0544: RLF 2C,F0545: RLF 2B,F0546: RLF 2C,F0547: RLF 2B,F0548: RLF 2C,F0549: RLF 2B,F054A: RLF 2C,F054B: RLF 2B,F054C: RLF 2C,F054D: MOVLW 80054E: ANDWF 2B,F.................... Data|=c; // Nota054F: MOVF 5D,W0550: IORWF 2B,F.................... Data|=(Oct<<4); // Oktava0551: SWAPF 60,W0552: MOVWF 770553: MOVLW F00554: ANDWF 77,F0555: MOVF 77,W0556: IORWF 2B,F.................... WriteDataInc(); // Podmineny zapis do FLASH a posun na dalsi adresu0557: CALL 2E0.................... if (~Mode)0558: BTFSC 2D.00559: GOTO 55C.................... {.................... PlayData(); // Zahraj notu055A: CALL 237.................... Beep=0; // Po zahrani noty uz nepipej na konci radky055B: CLRF 33.................... }.................... }.................... }055C: GOTO 39B.................... a=0; // Radka zpracovana, nuluj jeji delku055D: CLRF 5E.................... SpecBeep(); // Pipni055E: CALL 13B.................... goto Loop;055F: GOTO 36D.................... }.................... if ((c==BS)&(a>0)) {a--;goto Loop;} // Smaz znak0560: MOVF 5D,W0561: SUBLW 080562: BTFSC 03.20563: GOTO 5660564: MOVLW 000565: GOTO 5670566: MOVLW 010567: MOVWF 610568: MOVF 5E,F0569: BTFSS 03.2056A: GOTO 56D056B: MOVLW 00056C: GOTO 56E056D: MOVLW 01056E: ANDWF 61,W056F: XORLW 000570: BTFSC 03.20571: GOTO 5740572: DECF 5E,F0573: GOTO 36D.................... if ((c==',')|(c<=' ')) c=' '; // Vsechny ostatni ridici znaky i carka jsou oddelovac0574: MOVF 5D,W0575: SUBLW 2C0576: BTFSC 03.20577: GOTO 57A0578: MOVLW 000579: GOTO 57B057A: MOVLW 01057B: MOVWF 61057C: MOVF 5D,W057D: SUBLW 20057E: BTFSC 03.0057F: GOTO 5820580: MOVLW 000581: GOTO 5830582: MOVLW 010583: IORWF 61,W0584: XORLW 000585: BTFSC 03.20586: GOTO 5890587: MOVLW 200588: MOVWF 5D.................... if (a<LINELEN) line[a++]=c; // Zapis znak do bufferu a posun ukazovatko0589: MOVF 5E,W058A: SUBLW 27058B: BTFSS 03.0058C: GOTO 593058D: MOVF 5E,W058E: INCF 5E,F058F: ADDLW 350590: MOVWF 040591: MOVF 5D,W0592: MOVWF 00.................... }0593: GOTO 3640594: GOTO 5CB (RETURN).................... }............................................................ // Tabulka pro prekodovani tlacitek.................... const int8 KeyTranslate[16] = {0, 1, 2, 5, 3, 6, 8, 11, 4, 7, 9, 12, 10, 13, 14, 15};*00B7: BCF 0A.000B8: BCF 0A.100B9: BCF 0A.200BA: ADDWF 02,F00BB: RETLW 0000BC: RETLW 0100BD: RETLW 0200BE: RETLW 0500BF: RETLW 0300C0: RETLW 0600C1: RETLW 0800C2: RETLW 0B00C3: RETLW 0400C4: RETLW 0700C5: RETLW 0900C6: RETLW 0C00C7: RETLW 0A00C8: RETLW 0D00C9: RETLW 0E00CA: RETLW 0F........................................ void main().................... {*0595: CLRF 040596: MOVLW 1F0597: ANDWF 03,F0598: MOVLW 070599: BSF 03.5059A: MOVWF 1F059B: BCF 05.0059C: BCF 03.5059D: BCF 05.0.................... Start:........................................ if (restart_cause()==WDT_FROM_SLEEP) // Osetreni probuzeni od WDT059E: MOVF 03,W059F: ANDLW 1805A0: XORLW 0005A1: BTFSS 03.205A2: GOTO 5A4.................... {.................... sleep();05A3: SLEEP.................... }.................... // Inicializace WDT.................... // setup_wdt(WDT_16MS); // nelze pouzit, zabira 15 instukci.................... #asm.................... bsf 0x03,5 // banka 1 nebo 3 aby se mohlo k OPTION registu05A4: BSF 03.5.................... bcf 0x81,3 // WDT primo tedy 16ms.................... #endasm05A5: BSF 03.505A6: BCF 01.3........................................ // Inicializace.................... port_b_pullups(TRUE); // Zapni pull-up odpory na portu B05A7: BCF 01.7.................... set_tris_a(0b00001000); // Nastav nepouzite vyvody jako vystupy05A8: MOVLW 0805A9: MOVWF 05.................... set_tris_b(0b11110000); // 1 znamena vstup05AA: MOVLW F005AB: MOVWF 06.................... *0x9F = 6; // Vsechny vstupy jsou digitalni05AC: MOVLW 0605AD: MOVWF 1F........................................ // Test na rezim programovani.................... if ((input(POWER_PIC)==0)&(input(RXD)==0)) // Podminka programovani05AE: BSF 05.305AF: MOVLW 0005B0: BCF 03.505B1: BTFSC 05.305B2: MOVLW 0105B3: XORLW 0005B4: BTFSC 03.205B5: GOTO 5B805B6: MOVLW 0005B7: GOTO 5B905B8: MOVLW 0105B9: MOVWF 3605BA: BSF 03.505BB: BSF 06.105BC: MOVLW 0005BD: BCF 03.505BE: BTFSC 06.105BF: MOVLW 0105C0: XORLW 0005C1: BTFSC 03.205C2: GOTO 5C505C3: MOVLW 0005C4: GOTO 5C605C5: MOVLW 0105C6: ANDWF 36,W05C7: XORLW 0005C8: BTFSC 03.205C9: GOTO 5CB.................... Download(); // Pripojen RS232 a propojka na PGM05CA: GOTO 34B........................................ // Zapnuti napajeni.................... output_low(POWER_PIC); // Pripoj GND pro procesor05CB: BSF 03.505CC: BCF 05.305CD: BCF 03.505CE: BCF 05.3.................... SoundNote(SOUND_Space,3,10); // Mezera05CF: MOVLW 0C05D0: MOVWF 6905D1: MOVLW 0305D2: MOVWF 6A05D3: CLRF 6C05D4: MOVLW 0A05D5: MOVWF 6B05D6: CALL 0E2.................... output_low(POWER_386); // Zapni napajeni zesilovace05D7: BSF 03.505D8: BCF 05.405D9: BCF 03.505DA: BCF 05.4.................... SoundNote(SOUND_Space,3,100); // Mezera (jinak se chybne detekuje tlacitko)05DB: MOVLW 0C05DC: MOVWF 6905DD: MOVLW 0305DE: MOVWF 6A05DF: CLRF 6C05E0: MOVLW 6405E1: MOVWF 6B05E2: CALL 0E2........................................ // Cteni tlacitek.................... #use FAST_IO(B).................... CisloSkladby=(input_b() >> 4) ^ 0xFF & 0xF; // Precti stav tlacitek05E3: SWAPF 06,W05E4: MOVWF 7705E5: MOVLW 0F05E6: ANDWF 77,F05E7: MOVF 77,W05E8: XORLW 0F05E9: MOVWF 34.................... #use STANDARD_IO(B).................... CisloSkladby=KeyTranslate[CisloSkladby]; // Prekoduj je do binarniho kodu05EA: MOVF 34,W05EB: CALL 0B705EC: MOVWF 7805ED: MOVWF 34........................................ // Prehrani skladby.................... Play(); // Zahraj skladbu05EE: CALL 27D........................................ // Po odehrani usni a cekej na zmacknuti tlacitka.................... #use FAST_IO(B).................... if (input_B()); // Precti stav portu B (vuci tomuto stavu se bude hlidat zmena)05EF: MOVF 06,W05F0: XORLW 0005F1: BTFSC 03.205F2: GOTO 5F3.................... #use STANDARD_IO(B).................... bit_clear(*0xB,0); // Nuluj priznak preruseni od zmeny stavu portu B05F3: BCF 0B.0.................... enable_interrupts(INT_RB); // Povol preruseni od zmeny stavu portu B05F4: BSF 0B.3........................................ output_high(POWER_386); // Vypni napajeni zesilovace05F5: BSF 03.505F6: BCF 05.405F7: BCF 03.505F8: BSF 05.4.................... output_float(POWER_PIC); // Odpoj GND05F9: BSF 03.505FA: BSF 05.3........................................ Sleep(); // Usni aby byla minimalni klidova spotreba05FB: SLEEP........................................ disable_interrupts(INT_RB); // Zakaz preruseni od portu05FC: BCF 03.505FD: BCF 0B.3.................... goto Start; // Po probuzeni skoc na zacatek05FE: GOTO 59E.................... }....................05FF: SLEEP