CCS PCW C Compiler, Version 3.110, 15448Filename: c:\krouzek\test\mb01a.LSTROM used: 1523 (74%)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 5900003: 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.................... //.................... // Historie:.................... // 1.00 Uvodni verze........................................ #include <16F819.h> // Definice procesoru.................... //////// Standard Header file for the PIC16F628 device ////////////////.................... #device PIC16F819.................... #list........................................ #fuses HS,NOPROTECT,NOWDT,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.................... #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.................... //.................... // Historie.................... // 1.00 Uvodni verze............................................................ // Konfiguracni parametry.................... //#define SOUND_HI PIN_xx // Pozitivni vystup.................... //#define SOUND_LO PIN_xx // Komplementarni vystup.................... #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).................... {.................... 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 132.................... {.................... 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.................... }.................... }0131: GOTO 111........................................ // Konec casovace.................... disable_interrupts(int_ccp1);0132: BSF 03.50133: BCF 0C.2.................... disable_interrupts(global);0134: BCF 03.50135: BCF 0B.60136: BCF 0B.70137: BTFSC 0B.70138: GOTO 1360139: 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) // Konfigurace pro casovani RS232.................... #use rs232(BAUD=9600,RCV=RXD,INVERT,PARITY=N,BITS=8) // Prenosove parametry RS232*0152: MOVLW 080153: MOVWF 770154: BSF 03.50155: BSF 06.10156: BCF 03.50157: BTFSS 06.10158: GOTO 1570159: CLRF 61015A: BSF 77.7015B: GOTO 16A015C: BCF 77.7015D: GOTO 16A015E: BCF 03.0015F: BTFSS 06.10160: BSF 03.00161: RRF 61,F0162: BSF 77.60163: GOTO 16A0164: BCF 77.60165: DECFSZ 77,F0166: GOTO 15E0167: MOVF 61,W0168: MOVWF 780169: GOTO 176016A: MOVLW A7016B: BTFSC 77.7016C: MOVLW 2D016D: MOVWF 78016E: DECFSZ 78,F016F: GOTO 16E0170: NOP0171: BTFSC 77.70172: GOTO 15C0173: BTFSC 77.60174: GOTO 1640175: GOTO 15E0176: 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;*013A: BTFSS 2D.1013B: GOTO 13E013C: MOVLW 05013D: MOVWF 33........................................ for(Oct=2;Beep!=0;Beep--)013E: MOVLW 02013F: MOVWF 610140: MOVF 33,F0141: BTFSC 03.20142: GOTO 150.................... {.................... SoundNote(SOUND_A,Oct++,50);0143: MOVF 61,W0144: INCF 61,F0145: MOVWF 620146: MOVLW 090147: MOVWF 690148: MOVF 62,W0149: MOVWF 6A014A: CLRF 6C014B: MOVLW 32014C: MOVWF 6B014D: CALL 0E2.................... }014E: DECF 33,F014F: GOTO 140........................................ Error=0;0150: BCF 2D.10151: 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*01EB: MOVF 29,W01EC: BSF 03.601ED: MOVWF 0D.................... (int8)*EEADRH = Adr >> 8; // Adresa, horni cast01EE: BCF 03.601EF: MOVF 2A,W01F0: BSF 03.601F1: MOVWF 0F.................... bit_set(*EECON1,EECON1_EEPGD); // Pamet programu01F2: BSF 03.501F3: BSF 0C.7.................... bit_set(*EECON1,EECON1_RD); // Operace cteni01F4: BSF 0C.0.................... #ASM.................... nop; // Povinne nop01F5: NOP.................... nop;.................... #ENDASM01F6: NOP.................... a = (int8)*EEDATA; // Prevezmi data01F7: BCF 03.501F8: MOVF 0C,W01F9: BCF 03.601FA: MOVWF 61.................... b = (int8)*EEDATAH;01FB: BSF 03.601FC: MOVF 0E,W01FD: BCF 03.601FE: MOVWF 62.................... Data=make16(b,a); // Sestav vysledek ze 2 bajtu01FF: MOVF 62,W0200: MOVWF 2C0201: MOVF 61,W0202: MOVWF 2B0203: RETLW 00.................... }............................................................ // Smazani cele pameti vyhrazene pro skladby.................... void Erase().................... {.................... for(Adr=STARTMEM; Adr<=ENDMEM; Adr++) // Cela oblast*047D: MOVLW 06047E: MOVWF 2A047F: CLRF 290480: MOVF 2A,W0481: SUBLW 070482: BTFSS 03.00483: GOTO 4B3.................... {.................... ReadData();0484: CALL 1EB.................... if (Data!=0x3FFF) // Mazu jen bloky, ktere to potrebuji0485: INCFSZ 2B,W0486: GOTO 48B0487: MOVF 2C,W0488: SUBLW 3F0489: BTFSC 03.2048A: GOTO 4AF.................... {.................... if (input(POWER_PIC)!=0) return; // Nezapisuj pokud neni jumper povoleni programovani048B: BSF 03.5048C: BSF 05.3048D: MOVLW 00048E: BCF 03.5048F: BTFSC 05.30490: MOVLW 010491: XORLW 000492: BTFSC 03.20493: GOTO 4950494: GOTO 4B3.................... (int8)*EEADR = Adr; // Adresa bloku, spodni cast0495: MOVF 29,W0496: BSF 03.60497: MOVWF 0D.................... (int8)*EEADRH = Adr >> 8; // Adresa bloku, horni cast0498: BCF 03.60499: MOVF 2A,W049A: BSF 03.6049B: MOVWF 0F.................... bit_set(*EECON1,EECON1_EEPGD); // Pamet programu049C: BSF 03.5049D: BSF 0C.7.................... bit_set(*EECON1,EECON1_WREN); // Povolit zapis049E: BSF 0C.2.................... bit_set(*EECON1,EECON1_FREE); // Operace mazani049F: BSF 0C.4.................... (int8)*EECON2 = 0x55; // Povinna segvence pro zapis04A0: MOVLW 5504A1: MOVWF 0D.................... (int8)*EECON2 = 0xAA;04A2: MOVLW AA04A3: MOVWF 0D.................... bit_set(*EECON1,EECON1_WR); // Zahajeni mazani04A4: BSF 0C.1.................... #ASM.................... nop; // Povinne prazdne instrukce04A5: NOP.................... nop;.................... #ENDASM04A6: NOP.................... bit_clear(*EECON1,EECON1_WREN); // Uz ne zapis04A7: BCF 0C.2.................... bit_clear(*EECON1,EECON1_FREE); // Uz ne mazani04A8: BCF 0C.4.................... bit_clear(*EECON1,EECON1_EEPGD); // Uz ne pamet programu04A9: BCF 0C.7.................... Beep=SoundERASE;04AA: MOVLW 0204AB: BCF 03.504AC: BCF 03.604AD: MOVWF 33.................... SpecBeep();04AE: CALL 13A.................... }.................... }04AF: INCF 29,F04B0: BTFSC 03.204B1: INCF 2A,F04B2: GOTO 480.................... }............................................................ // 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*0300: BSF 03.50301: BSF 03.60302: BSF 0C.7.................... bit_set(*EECON1,EECON1_WREN); // Zapis0303: BSF 0C.2.................... (int8)*EEADR = Adr & ~3; // Adresa, spodni cast, zaokrouhleno dolu na nasobek 80304: BCF 03.50305: BCF 03.60306: MOVF 29,W0307: ANDLW FC0308: BSF 03.60309: MOVWF 0D.................... (int8)*EEADRH = Adr >> 8; // Adresa, horni cast030A: BCF 03.6030B: MOVF 2A,W030C: BSF 03.6030D: MOVWF 0F.................... for (i=0; i<4; i++)030E: BCF 03.6030F: CLRF 610310: MOVF 61,W0311: SUBLW 030312: BTFSS 03.00313: GOTO 33B.................... {.................... if ((Adr & 3) == i) // Pokud je adresa slova v bloku totozna s pozadovanou0314: MOVF 29,W0315: ANDLW 030316: MOVWF 620317: MOVF 2A,W0318: ANDLW 000319: MOVWF 63031A: MOVF 61,W031B: SUBWF 62,W031C: BTFSS 03.2031D: GOTO 32A031E: MOVF 63,F031F: BTFSS 03.20320: GOTO 32A.................... {.................... (int8)*EEDATA =Data; // Platne slovo, spodni cast0321: MOVF 2B,W0322: BSF 03.60323: MOVWF 0C.................... (int8)*EEDATAH=Data >> 8; // Platne slovo, horni cast0324: BCF 03.60325: MOVF 2C,W0326: BSF 03.60327: MOVWF 0E.................... }.................... else // Ostatni bunky nemenime0328: GOTO 32E0329: BCF 03.6.................... {.................... (int8)*EEDATA =0xFF; // Zbytek same jednicky032A: MOVLW FF032B: BSF 03.6032C: MOVWF 0C.................... (int8)*EEDATAH=0xFF;032D: MOVWF 0E.................... }.................... (int8)*EECON2 = 0x55; // Povinna sekvence pro zapis032E: MOVLW 55032F: BSF 03.50330: MOVWF 0D.................... (int8)*EECON2 = 0xAA;0331: MOVLW AA0332: MOVWF 0D.................... bit_set(*EECON1,EECON1_WR); // Zahajeni zapisu0333: BSF 0C.1.................... #ASM.................... nop; // Povinne dve prazdne instrukce0334: NOP.................... nop;.................... #ENDASM0335: NOP.................... ((int8)*EEADR) ++; // Dalsi slovo0336: BCF 03.50337: INCF 0D,F.................... }0338: BCF 03.60339: INCF 61,F033A: GOTO 310.................... bit_clear(*EECON1,EECON1_WREN); // Konec zapisu033B: BSF 03.5033C: BSF 03.6033D: BCF 0C.2.................... bit_clear(*EECON1,EECON1_EEPGD); // Uz ne pamet programu (bezpecnost)033E: 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*02DC: BTFSC 2D.002DD: GOTO 2DF02DE: GOTO 346.................... if ( (Adr>=STARTMEM) & (Adr<=ENDMEM) & (input(POWER_PIC)==0) )02DF: MOVF 2A,W02E0: SUBLW 0502E1: BTFSS 03.002E2: GOTO 2E502E3: MOVLW 0002E4: GOTO 2E602E5: MOVLW 0102E6: MOVWF 6102E7: MOVF 2A,W02E8: SUBLW 0702E9: BTFSC 03.002EA: GOTO 2ED02EB: MOVLW 0002EC: GOTO 2EE02ED: MOVLW 0102EE: ANDWF 61,W02EF: MOVWF 6202F0: BSF 03.502F1: BSF 05.302F2: MOVLW 0002F3: BCF 03.502F4: BTFSC 05.302F5: MOVLW 0102F6: XORLW 0002F7: BTFSC 03.202F8: GOTO 2FB02F9: MOVLW 0002FA: GOTO 2FC02FB: MOVLW 0102FC: ANDWF 62,W02FD: XORLW 0002FE: BTFSC 03.202FF: GOTO 345.................... {.................... WriteData();.................... Adr++;*033F: BCF 03.50340: BCF 03.60341: INCF 29,F0342: BTFSC 03.20343: INCF 2A,F.................... }.................... else0344: GOTO 346.................... {.................... Error=1;0345: BSF 2D.1.................... }0346: 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*0204: MOVLW 050205: MOVWF 2A0206: MOVLW FF0207: MOVWF 29.................... for(;1;).................... {.................... Adr++;0208: INCF 29,F0209: BTFSC 03.2020A: INCF 2A,F.................... ReadData(); // Precti data020B: CALL 1EB.................... if (Data==ENDOFDATA) return 1; // Priznak konce dat020C: INCFSZ 2B,W020D: GOTO 215020E: MOVF 2C,W020F: SUBLW 3F0210: BTFSS 03.20211: GOTO 2150212: MOVLW 010213: MOVWF 780214: GOTO 232.................... if (Adr==ENDMEM+1) return 1; // Uz jsme prosli celou pamet0215: MOVF 29,F0216: BTFSS 03.20217: GOTO 21F0218: MOVF 2A,W0219: SUBLW 08021A: BTFSS 03.2021B: GOTO 21F021C: MOVLW 01021D: MOVWF 78021E: GOTO 232.................... if ((Data&MASKBEGIN)==DATABEGIN) // Priznak zacatku skladby021F: MOVF 2B,W0220: ANDLW 000221: MOVWF 610222: MOVF 2C,W0223: ANDLW 380224: MOVWF 620225: MOVF 61,F0226: BTFSS 03.20227: GOTO 2310228: MOVF 62,W0229: SUBLW 20022A: BTFSS 03.2022B: GOTO 231.................... {.................... CisloSkladby--; // Otestuj pocitadlo skladeb022C: DECFSZ 34,F.................... if (CisloSkladby==0) return 0; // Je to tato skladba022D: GOTO 231022E: MOVLW 00022F: MOVWF 780230: GOTO 232.................... }.................... }0231: GOTO 2080232: 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)); // Zahraj notu0233: MOVF 2B,W0234: ANDLW 0F0235: MOVWF 610236: SWAPF 2B,W0237: MOVWF 770238: MOVLW 0F0239: ANDWF 77,F023A: MOVF 77,W023B: ANDLW 07023C: ADDWF 32,W023D: MOVWF 63023E: RRF 2C,W023F: MOVWF 650240: RRF 2B,W0241: MOVWF 640242: RRF 65,F0243: RRF 64,F0244: RRF 65,F0245: RRF 64,F0246: RRF 65,F0247: RRF 64,F0248: RRF 65,F0249: RRF 64,F024A: RRF 65,F024B: RRF 64,F024C: RRF 65,F024D: RRF 64,F024E: MOVLW 01024F: ANDWF 65,F0250: MOVF 64,W0251: ANDLW 3F0252: MOVWF 770253: MOVF 65,W0254: ANDLW 000255: MOVWF 7A0256: MOVF 77,W0257: MOVWF 660258: MOVF 7A,W0259: MOVWF 67025A: MOVF 2F,W025B: MOVWF 69025C: MOVF 2E,W025D: MOVWF 68025E: MOVF 7A,W025F: MOVWF 6B0260: MOVF 77,W0261: MOVWF 6A0262: CALL 1770263: MOVF 79,W0264: MOVWF 680265: MOVF 78,W0266: MOVWF 670267: MOVF 61,W0268: MOVWF 690269: MOVF 63,W026A: MOVWF 6A026B: MOVF 79,W026C: MOVWF 6C026D: MOVF 78,W026E: MOVWF 6B026F: CALL 0E2.................... SoundNote(SOUND_Space,0,Pause); // Zahraj mezeru mezi notami0270: MOVLW 0C0271: MOVWF 690272: CLRF 6A0273: MOVF 31,W0274: MOVWF 6C0275: MOVF 30,W0276: MOVWF 6B0277: CALL 0E20278: RETLW 00.................... }............................................................ // Zahraj skladbu od zadane adresy v promenne Adr..................... void Play().................... // CisloSkladby - cislo skladby k hrani.................... {.................... if (Find()) // Najdi zacatek skladby v pameti skladeb0279: CALL 204027A: MOVF 78,F027B: BTFSC 03.2027C: GOTO 27E.................... {.................... return; // Skladba nenalezena027D: GOTO 2DB.................... }........................................ Tempo=100; // Default delka noty027E: CLRF 2F027F: MOVLW 640280: MOVWF 2E.................... Pause=100; // Default mezera mezi notami0281: CLRF 310282: MOVWF 30........................................ Octava=Data&~MASKBEGIN; // Posunuti oktav (povinna soucast zacatku skladby)0283: MOVF 2B,W0284: MOVWF 32.................... Adr++;0285: INCF 29,F0286: BTFSC 03.20287: INCF 2A,F........................................ for (;1;).................... {.................... if (Adr==ENDMEM+1) return; // Konec pametove oblasti0288: MOVF 29,F0289: BTFSS 03.2028A: GOTO 290028B: MOVF 2A,W028C: SUBLW 08028D: BTFSS 03.2028E: GOTO 290028F: GOTO 2DB.................... ReadData(); // Vezmi data0290: CALL 1EB.................... Adr++; // Posun adresu0291: INCF 29,F0292: BTFSC 03.20293: INCF 2A,F.................... if (Data==ENDOFDATA) return; // Konec dat0294: INCFSZ 2B,W0295: GOTO 29B0296: MOVF 2C,W0297: SUBLW 3F0298: BTFSS 03.20299: GOTO 29B029A: GOTO 2DB.................... if ((Data&MASKBEGIN)==DATABEGIN) return; // Zacatek dalsi skladby029B: MOVF 2B,W029C: ANDLW 00029D: MOVWF 61029E: MOVF 2C,W029F: ANDLW 3802A0: MOVWF 6202A1: MOVF 61,F02A2: BTFSS 03.202A3: GOTO 2A902A4: MOVF 62,W02A5: SUBLW 2002A6: BTFSS 03.202A7: GOTO 2A902A8: GOTO 2DB.................... if ((Data&MASKTEMPO)==DATATEMPO) Tempo=Data&~DATATEMPO; // Paramter TEMPO02A9: MOVF 2B,W02AA: ANDLW 0002AB: MOVWF 6102AC: MOVF 2C,W02AD: ANDLW 3802AE: MOVWF 6202AF: MOVF 61,F02B0: BTFSS 03.202B1: GOTO 2BB02B2: MOVF 62,W02B3: SUBLW 2802B4: BTFSS 03.202B5: GOTO 2BB02B6: MOVF 2B,W02B7: MOVWF 2E02B8: MOVF 2C,W02B9: ANDLW D702BA: MOVWF 2F.................... if ((Data&MASKPAUSE)==DATAPAUSE) Pause=Data&~DATAPAUSE; // Parametr PAUSE02BB: MOVF 2B,W02BC: ANDLW 0002BD: MOVWF 6102BE: MOVF 2C,W02BF: ANDLW 3802C0: MOVWF 6202C1: MOVF 61,F02C2: BTFSS 03.202C3: GOTO 2CD02C4: MOVF 62,W02C5: SUBLW 3002C6: BTFSS 03.202C7: GOTO 2CD02C8: MOVF 2B,W02C9: MOVWF 3002CA: MOVF 2C,W02CB: ANDLW CF02CC: MOVWF 31.................... if ((Data&MASKNOTE)==0) // Nota02CD: MOVF 2B,W02CE: ANDLW 0002CF: MOVWF 6102D0: MOVF 2C,W02D1: ANDLW 2002D2: MOVWF 6202D3: MOVF 61,F02D4: BTFSS 03.202D5: GOTO 2DA02D6: MOVF 62,F02D7: BTFSS 03.202D8: GOTO 2DA.................... {.................... PlayData(); // Zahraj notu02D9: CALL 233.................... }.................... }02DA: GOTO 28802DB: 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*018C: MOVF 62,W018D: MOVWF 04018E: MOVF 61,W018F: ADDWF 00,W0190: MOVWF 040191: MOVF 00,W0192: SUBLW 200193: BTFSC 03.20194: GOTO 1970195: MOVLW 000196: GOTO 1980197: MOVLW 010198: MOVWF 690199: MOVF 62,W019A: MOVWF 04019B: MOVF 63,W019C: SUBWF 00,W019D: BTFSS 03.0019E: GOTO 1A1019F: MOVLW 0001A0: GOTO 1A201A1: MOVLW 0101A2: ANDWF 69,W01A3: XORLW 0001A4: BTFSC 03.201A5: GOTO 1AA.................... (*a)++; // Posouvej ukazovatko01A6: MOVF 62,W01A7: MOVWF 0401A8: INCF 00,F01A9: GOTO 18C........................................ Data=0;01AA: CLRF 6501AB: CLRF 64.................... while (1).................... {.................... if (*a>=len) return Data; // Konec retezce01AC: MOVF 62,W01AD: MOVWF 0401AE: MOVF 63,W01AF: SUBWF 00,W01B0: BTFSS 03.001B1: GOTO 1B701B2: MOVF 64,W01B3: MOVWF 7801B4: MOVF 65,W01B5: MOVWF 7901B6: GOTO 1EA.................... c=line[*a]; // Vezmi znak z pole01B7: MOVF 62,W01B8: MOVWF 0401B9: MOVF 61,W01BA: ADDWF 00,W01BB: MOVWF 0401BC: MOVF 00,W01BD: MOVWF 66.................... if ((c<'0')|(c>'9')) return Data; // Koncime pokud znak neni cislice01BE: MOVF 66,W01BF: SUBLW 2F01C0: BTFSC 03.001C1: GOTO 1C401C2: MOVLW 0001C3: GOTO 1C501C4: MOVLW 0101C5: MOVWF 6701C6: MOVF 66,W01C7: SUBLW 3901C8: BTFSS 03.001C9: GOTO 1CC01CA: MOVLW 0001CB: GOTO 1CD01CC: MOVLW 0101CD: IORWF 67,W01CE: XORLW 0001CF: BTFSC 03.201D0: GOTO 1D601D1: MOVF 64,W01D2: MOVWF 7801D3: MOVF 65,W01D4: MOVWF 7901D5: GOTO 1EA.................... Data = Data * 10 + (c-'0'); // Pouzij cislici01D6: MOVF 65,W01D7: MOVWF 6901D8: MOVF 64,W01D9: MOVWF 6801DA: CLRF 6B01DB: MOVLW 0A01DC: MOVWF 6A01DD: CALL 17701DE: MOVLW 3001DF: SUBWF 66,W01E0: ADDWF 78,W01E1: MOVWF 6401E2: MOVF 79,W01E3: MOVWF 6501E4: BTFSC 03.001E5: INCF 65,F.................... (*a)++; // Dalsi znak01E6: MOVF 62,W01E7: MOVWF 0401E8: INCF 00,F.................... }01E9: GOTO 1AC01EA: 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*03A1: MOVF 62,W03A2: MOVWF 0403A3: MOVF 61,W03A4: ADDWF 00,W03A5: MOVWF 0403A6: MOVF 00,W03A7: SUBLW 2003A8: BTFSC 03.203A9: GOTO 3AC03AA: MOVLW 0003AB: GOTO 3AD03AC: MOVLW 0103AD: MOVWF 6803AE: MOVF 62,W03AF: MOVWF 0403B0: MOVF 63,W03B1: SUBWF 00,W03B2: BTFSS 03.003B3: GOTO 3B603B4: MOVLW 0003B5: GOTO 3B703B6: MOVLW 0103B7: ANDWF 68,W03B8: XORLW 0003B9: BTFSC 03.203BA: GOTO 3BF.................... (*a)++; // Posouvej ukazovatko03BB: MOVF 62,W03BC: MOVWF 0403BD: INCF 00,F03BE: GOTO 3A1........................................ for (i=0;i<sizeof(KeyWords);) // Slova ze slovniku03BF: CLRF 6403C0: MOVF 64,W03C1: SUBLW 6103C2: BTFSS 03.003C3: GOTO 42B.................... {.................... for (j=*a;(j<len)&(KeyWords[i]!=0)&(KeyWords[i]==line[j]);i++,j++) // Znaky ze slova03C4: MOVF 62,W03C5: MOVWF 0403C6: MOVF 00,W03C7: MOVWF 6503C8: MOVF 63,W03C9: SUBWF 65,W03CA: BTFSS 03.003CB: GOTO 3CE03CC: MOVLW 0003CD: GOTO 3CF03CE: MOVLW 0103CF: MOVWF 6603D0: MOVF 64,W03D1: CALL 05103D2: XORLW 0003D3: BTFSS 03.203D4: GOTO 3D703D5: MOVLW 0003D6: GOTO 3D803D7: MOVLW 0103D8: ANDWF 66,W03D9: MOVWF 6803DA: MOVF 64,W03DB: CALL 05103DC: MOVWF 6903DD: MOVF 61,W03DE: ADDWF 65,W03DF: MOVWF 0403E0: MOVF 00,W03E1: SUBWF 69,W03E2: BTFSC 03.203E3: GOTO 3E603E4: MOVLW 0003E5: GOTO 3E703E6: MOVLW 0103E7: ANDWF 68,W03E8: XORLW 0003E9: BTFSC 03.203EA: GOTO 3EF.................... {.................... }03EB: MOVF 64,W03EC: INCF 64,F03ED: INCF 65,F03EE: GOTO 3C8.................... if ((KeyWords[i]==0)&((line[j]==' ')|(j==len)))03EF: MOVF 64,W03F0: CALL 05103F1: XORLW 0003F2: BTFSC 03.203F3: GOTO 3F603F4: MOVLW 0003F5: GOTO 3F703F6: MOVLW 0103F7: MOVWF 6703F8: MOVF 61,W03F9: ADDWF 65,W03FA: MOVWF 0403FB: MOVF 00,W03FC: SUBLW 2003FD: BTFSC 03.203FE: GOTO 40103FF: MOVLW 000400: GOTO 4020401: MOVLW 010402: MOVWF 690403: MOVF 63,W0404: SUBWF 65,W0405: BTFSC 03.20406: GOTO 4090407: MOVLW 000408: GOTO 40A0409: MOVLW 01040A: IORWF 69,W040B: ANDWF 67,W040C: XORLW 00040D: BTFSC 03.2040E: GOTO 421.................... {.................... if (j>=len) j=len-1; // Korekce abychom se nedostali za konec retezce040F: MOVF 63,W0410: SUBWF 65,W0411: BTFSS 03.00412: GOTO 4160413: MOVLW 010414: SUBWF 63,W0415: MOVWF 65.................... *a=j+1; // Posun ukazovatko za zpracovane slovo0416: MOVF 62,W0417: MOVWF 040418: MOVLW 010419: ADDWF 65,W041A: MOVWF 00........................................ return KeyWords[i+1]; // Vrat zastupnou hodnotu z tabulky klicovych slov041B: MOVLW 01041C: ADDWF 64,W041D: CALL 051041E: MOVWF 78041F: MOVWF 780420: GOTO 42D.................... }.................... while(KeyWords[i]!=0) i++; // Preskoc zbytek slova v tabulce0421: MOVF 64,W0422: CALL 0510423: XORLW 000424: BTFSC 03.20425: GOTO 4280426: INCF 64,F0427: GOTO 421.................... i++; // Preskoc oddelovac0428: INCF 64,F.................... i++; // Preskoc polozku se zastupnou hodnotou0429: INCF 64,F.................... }042A: GOTO 3C0.................... return -1; // Prosli jsme cely slovnik a nedoslo ke shode042B: MOVLW FF042C: MOVWF 78.................... }............................................................ // Programovani pres RS232.................... #define LINELEN 40 // Delka radky pro RS232.................... #define CR 0x0D // Odradkovani.................... #define BS 0x08 // Back Space.................... 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*0347: BSF 03.50348: BCF 05.40349: BCF 03.5034A: BCF 05.4.................... SoundNote(SOUND_Space,3,10); // Mezera034B: MOVLW 0C034C: MOVWF 69034D: MOVLW 03034E: MOVWF 6A034F: CLRF 6C0350: MOVLW 0A0351: MOVWF 6B0352: CALL 0E2.................... Beep=SoundPGM;0353: MOVLW 030354: MOVWF 33.................... Error=0;0355: BCF 2D.1.................... SpecBeep(); // Pipni na znameni vstupu do programovani0356: CALL 13A........................................ Tempo=100; // Default hodnoty0357: CLRF 2F0358: MOVLW 640359: MOVWF 2E.................... Pause=100;035A: CLRF 31035B: MOVWF 30.................... Octava=0;035C: CLRF 32.................... Mode=0; // Mod hrani035D: BCF 2D.0.................... Oct=0;035E: CLRF 60.................... a=0; // Na zacatku je radka prazdna035F: CLRF 5E........................................ for(;input(POWER_PIC)==0;) // Opakuj vse dokud je PGM rezim0360: BSF 03.50361: BSF 05.30362: MOVLW 000363: BCF 03.50364: BTFSC 05.30365: MOVLW 010366: XORLW 000367: BTFSS 03.20368: GOTO 58F.................... {.................... Loop:.................... c=Getc(); // Vezmi znak ze seriovky0369: CALL 152036A: MOVF 78,W036B: MOVWF 5D.................... if (c>=0x80) goto Loop; // Ignoruj znaky nad ASCII036C: MOVF 5D,W036D: SUBLW 7F036E: BTFSC 03.0036F: GOTO 3710370: GOTO 369.................... if (c>=0x60) c=c-0x20; // Preved velka pismena na velka pismena0371: MOVF 5D,W0372: SUBLW 5F0373: BTFSC 03.00374: GOTO 3770375: MOVLW 200376: SUBWF 5D,F.................... if ((c==CR)|(c=='/')) // Konec radky nebo komentar0377: MOVF 5D,W0378: SUBLW 0D0379: BTFSC 03.2037A: GOTO 37D037B: MOVLW 00037C: GOTO 37E037D: MOVLW 01037E: MOVWF 61037F: MOVF 5D,W0380: SUBLW 2F0381: BTFSC 03.20382: GOTO 3850383: MOVLW 000384: GOTO 3860385: MOVLW 010386: IORWF 61,W0387: XORLW 000388: BTFSC 03.20389: GOTO 55B.................... {.................... while (c!=CR) c=Getc(); // Zpracuj znaky komentare038A: MOVF 5D,W038B: SUBLW 0D038C: BTFSC 03.2038D: GOTO 392038E: CALL 152038F: MOVF 78,W0390: MOVWF 5D0391: GOTO 38A.................... len=a; // Zapamatuj si delku radky0392: MOVF 5E,W0393: MOVWF 5F.................... a=0; // Postav se na zacatek radky0394: CLRF 5E.................... Beep=SoundEndOfLine; // Default zuk na konci radky0395: MOVLW 010396: MOVWF 33.................... // Zpracovani radky.................... while(a<len)0397: MOVF 5F,W0398: SUBWF 5E,W0399: BTFSC 03.0039A: GOTO 558.................... {.................... c=Word(line,&a,len);039B: MOVLW 35039C: MOVWF 61039D: MOVLW 5E039E: MOVWF 62039F: MOVF 5F,W03A0: MOVWF 63*042D: MOVF 78,W042E: MOVWF 5D.................... if (c==-1) // Nezname klicove slovo042F: MOVF 5D,W0430: SUBLW FF0431: BTFSS 03.20432: GOTO 466.................... {.................... if (a<len) // Nejsme uz na konci radky ??0433: MOVF 5F,W0434: SUBWF 5E,W0435: BTFSC 03.00436: GOTO 465.................... {.................... if ((line[a]>='0')&(line[a]<='9')) // Stojime na cislici -> je to cislo0437: MOVLW 350438: ADDWF 5E,W0439: MOVWF 04043A: MOVF 00,W043B: SUBLW 2F043C: BTFSS 03.0043D: GOTO 440043E: MOVLW 00043F: GOTO 4410440: MOVLW 010441: MOVWF 620442: MOVLW 350443: ADDWF 5E,W0444: MOVWF 040445: MOVF 00,W0446: SUBLW 390447: BTFSC 03.00448: GOTO 44B0449: MOVLW 00044A: GOTO 44C044B: MOVLW 01044C: ANDWF 62,W044D: XORLW 00044E: BTFSC 03.2044F: GOTO 45C.................... {.................... // 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 vysledku0450: MOVLW 350451: MOVWF 610452: MOVLW 5E0453: MOVWF 620454: MOVF 5F,W0455: MOVWF 630456: CALL 18C0457: MOVF 78,W0458: MOVWF 60.................... Oct&=0x7; // ale k navratu pouziva RETLW 0 coz smaze W !0459: MOVLW 07045A: ANDWF 60,F.................... }.................... else // Stojime na pismenu nebo oddelovaci045B: GOTO 465.................... {.................... if (line[a]!=' ') Error=1; // Neni to oddelovac - chyba045C: MOVLW 35045D: ADDWF 5E,W045E: MOVWF 04045F: MOVF 00,W0460: SUBLW 200461: BTFSC 03.20462: GOTO 4640463: BSF 2D.1.................... a++; // Preskocim 1 znak (a kdyz to nepomuze dostanu se zase sem)0464: INCF 5E,F.................... }.................... }.................... }.................... else if (c=='P') // Play0465: GOTO 5570466: MOVF 5D,W0467: SUBLW 500468: BTFSS 03.20469: GOTO 478.................... {.................... CisloSkladby=Number(line,&a,len);046A: MOVLW 35046B: MOVWF 61046C: MOVLW 5E046D: MOVWF 62046E: MOVF 5F,W046F: MOVWF 630470: CALL 18C0471: MOVF 78,W0472: MOVWF 34.................... Mode=0;0473: BCF 2D.0.................... Play();0474: CALL 279.................... Beep=SoundPGM;0475: MOVLW 030476: MOVWF 33.................... }.................... else if (c=='E') // Erase0477: GOTO 5570478: MOVF 5D,W0479: SUBLW 45047A: BTFSS 03.2047B: GOTO 4B6.................... {.................... Mode=0;047C: BCF 2D.0.................... Erase();.................... Beep=SoundPGM;*04B3: MOVLW 0304B4: MOVWF 33.................... }.................... else if (c=='t') // Tempo04B5: GOTO 55704B6: MOVF 5D,W04B7: SUBLW 7404B8: BTFSS 03.204B9: GOTO 4D6.................... {.................... Tempo=Number(line,&a,len)&~MASKTEMPO;04BA: MOVLW 3504BB: MOVWF 6104BC: MOVLW 5E04BD: MOVWF 6204BE: MOVF 5F,W04BF: MOVWF 6304C0: CALL 18C04C1: MOVF 78,W04C2: MOVWF 2E04C3: MOVF 79,W04C4: ANDLW C704C5: MOVWF 2F.................... if (Tempo==0) Tempo=100;04C6: MOVF 2E,F04C7: BTFSS 03.204C8: GOTO 4CF04C9: MOVF 2F,F04CA: BTFSS 03.204CB: GOTO 4CF04CC: CLRF 2F04CD: MOVLW 6404CE: MOVWF 2E.................... Data=Tempo|DATATEMPO;04CF: MOVF 2E,W04D0: MOVWF 2B04D1: MOVF 2F,W04D2: IORLW 2804D3: MOVWF 2C.................... WriteDataInc(); // Podmineny zapis do FLASH a posun na dalsi adresu04D4: CALL 2DC.................... }.................... else if (c=='p') // Pause04D5: GOTO 55704D6: MOVF 5D,W04D7: SUBLW 7004D8: BTFSS 03.204D9: GOTO 4F6.................... {.................... Pause=Number(line,&a,len)&~MASKPAUSE;04DA: MOVLW 3504DB: MOVWF 6104DC: MOVLW 5E04DD: MOVWF 6204DE: MOVF 5F,W04DF: MOVWF 6304E0: CALL 18C04E1: MOVF 78,W04E2: MOVWF 3004E3: MOVF 79,W04E4: ANDLW C704E5: MOVWF 31.................... if (Pause==0) Pause=100;04E6: MOVF 30,F04E7: BTFSS 03.204E8: GOTO 4EF04E9: MOVF 31,F04EA: BTFSS 03.204EB: GOTO 4EF04EC: CLRF 3104ED: MOVLW 6404EE: MOVWF 30.................... Data=Pause|DATAPAUSE;04EF: MOVF 30,W04F0: MOVWF 2B04F1: MOVF 31,W04F2: IORLW 3004F3: MOVWF 2C.................... WriteDataInc(); // Podmineny zapis do FLASH a posun na dalsi adresu04F4: CALL 2DC.................... }.................... else if (c=='B') // Begin04F5: GOTO 55704F6: MOVF 5D,W04F7: SUBLW 4204F8: BTFSS 03.204F9: GOTO 50D.................... {.................... CisloSkladby=~0; // Neplatne cislo skladby04FA: MOVLW FF04FB: MOVWF 34.................... Find(); // najde konec posledni skladby04FC: CALL 204.................... Octava=Number(line,&a,len)&~MASKBEGIN;04FD: MOVLW 3504FE: MOVWF 6104FF: MOVLW 5E0500: MOVWF 620501: MOVF 5F,W0502: MOVWF 630503: CALL 18C0504: MOVF 78,W0505: MOVWF 32.................... Data=DATABEGIN|Octava; // Zacatecni znacka0506: MOVF 32,W0507: MOVWF 2B0508: MOVLW 200509: MOVWF 2C.................... Mode=1; // Mod zapisu do FLASH pameti050A: BSF 2D.0.................... WriteDataInc(); // Podmineny zapis do FLASH a posun na dalsi adresu050B: CALL 2DC.................... }.................... else if (c=='b') // Test050C: GOTO 557050D: MOVF 5D,W050E: SUBLW 62050F: BTFSS 03.20510: GOTO 51C.................... {.................... Octava=Number(line,&a,len)&~MASKBEGIN;0511: MOVLW 350512: MOVWF 610513: MOVLW 5E0514: MOVWF 620515: MOVF 5F,W0516: MOVWF 630517: CALL 18C0518: MOVF 78,W0519: MOVWF 32.................... Mode=0;051A: BCF 2D.0.................... }.................... else if (c=='Z') // End051B: GOTO 557051C: MOVF 5D,W051D: SUBLW 5A051E: BTFSS 03.2051F: GOTO 522.................... {.................... Mode=0;0520: BCF 2D.0.................... }.................... else // Nota0521: GOTO 557.................... {.................... Data=Number(line,&a,len); // Delka noty (nepovinna)0522: MOVLW 350523: MOVWF 610524: MOVLW 5E0525: MOVWF 620526: MOVF 5F,W0527: MOVWF 630528: CALL 18C0529: MOVF 79,W052A: MOVWF 2C052B: MOVF 78,W052C: MOVWF 2B.................... Data&=0x3F; // Jen platny rozsah052D: MOVLW 3F052E: ANDWF 2B,F052F: MOVLW 000530: ANDWF 2C,F.................... if (Data==0) Data++; // Je-li nulova delka - dej jednotkovou0531: MOVF 2B,F0532: BTFSS 03.20533: GOTO 53A0534: MOVF 2C,F0535: BTFSS 03.20536: GOTO 53A0537: INCF 2B,F0538: BTFSC 03.20539: INCF 2C,F.................... Data<<=7; // Delka053A: RLF 2B,F053B: RLF 2C,F053C: RLF 2B,F053D: RLF 2C,F053E: RLF 2B,F053F: RLF 2C,F0540: RLF 2B,F0541: RLF 2C,F0542: RLF 2B,F0543: RLF 2C,F0544: RLF 2B,F0545: RLF 2C,F0546: RLF 2B,F0547: RLF 2C,F0548: MOVLW 800549: ANDWF 2B,F.................... Data|=c; // Nota054A: MOVF 5D,W054B: IORWF 2B,F.................... Data|=(Oct<<4); // Oktava054C: SWAPF 60,W054D: MOVWF 77054E: MOVLW F0054F: ANDWF 77,F0550: MOVF 77,W0551: IORWF 2B,F.................... WriteDataInc(); // Podmineny zapis do FLASH a posun na dalsi adresu0552: CALL 2DC.................... if (~Mode)0553: BTFSC 2D.00554: GOTO 557.................... {.................... PlayData(); // Zahraj notu0555: CALL 233.................... Beep=0; // Po zahrani noty uz nepipej na konci radky0556: CLRF 33.................... }.................... }.................... }0557: GOTO 397.................... a=0; // Radka zpracovana, nuluj jeji delku0558: CLRF 5E.................... SpecBeep(); // Pipni0559: CALL 13A.................... goto Loop;055A: GOTO 369.................... }.................... if ((c==BS)&(a>0)) {a--;goto Loop;} // Smaz znak055B: MOVF 5D,W055C: SUBLW 08055D: BTFSC 03.2055E: GOTO 561055F: MOVLW 000560: GOTO 5620561: MOVLW 010562: MOVWF 610563: MOVF 5E,F0564: BTFSS 03.20565: GOTO 5680566: MOVLW 000567: GOTO 5690568: MOVLW 010569: ANDWF 61,W056A: XORLW 00056B: BTFSC 03.2056C: GOTO 56F056D: DECF 5E,F056E: GOTO 369.................... if ((c==',')|(c<=' ')) c=' '; // Vsechny ostatni ridici znaky i carka jsou oddelovac056F: MOVF 5D,W0570: SUBLW 2C0571: BTFSC 03.20572: GOTO 5750573: MOVLW 000574: GOTO 5760575: MOVLW 010576: MOVWF 610577: MOVF 5D,W0578: SUBLW 200579: BTFSC 03.0057A: GOTO 57D057B: MOVLW 00057C: GOTO 57E057D: MOVLW 01057E: IORWF 61,W057F: XORLW 000580: BTFSC 03.20581: GOTO 5840582: MOVLW 200583: MOVWF 5D.................... if (a<LINELEN) line[a++]=c; // Zapis znak do bufferu a posun ukazovatko0584: MOVF 5E,W0585: SUBLW 270586: BTFSS 03.00587: GOTO 58E0588: MOVF 5E,W0589: INCF 5E,F058A: ADDLW 35058B: MOVWF 04058C: MOVF 5D,W058D: MOVWF 00.................... }058E: GOTO 360058F: GOTO 5BE (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().................... {*0590: CLRF 040591: MOVLW 1F0592: ANDWF 03,F0593: MOVLW 070594: BSF 03.50595: MOVWF 1F0596: BCF 05.00597: BCF 03.50598: BCF 05.0.................... Start:........................................ // Inicializace.................... port_b_pullups(TRUE); // Zapni pull-up odpory na portu B0599: BSF 03.5059A: BCF 01.7.................... set_tris_a(0b00001000); // Nastav nepouzite vyvody jako vystupy059B: MOVLW 08059C: MOVWF 05.................... set_tris_b(0b11110000); // 1 znamena vstup059D: MOVLW F0059E: MOVWF 06.................... *0x9F = 6; // Vsechny vstupy jsou digitalni059F: MOVLW 0605A0: MOVWF 1F........................................ // Test na rezim programovani.................... if ((input(POWER_PIC)==0)&(input(RXD)==0)) // Podminka programovani05A1: BSF 05.305A2: MOVLW 0005A3: BCF 03.505A4: BTFSC 05.305A5: MOVLW 0105A6: XORLW 0005A7: BTFSC 03.205A8: GOTO 5AB05A9: MOVLW 0005AA: GOTO 5AC05AB: MOVLW 0105AC: MOVWF 3605AD: BSF 03.505AE: BSF 06.105AF: MOVLW 0005B0: BCF 03.505B1: BTFSC 06.105B2: MOVLW 0105B3: XORLW 0005B4: BTFSC 03.205B5: GOTO 5B805B6: MOVLW 0005B7: GOTO 5B905B8: MOVLW 0105B9: ANDWF 36,W05BA: XORLW 0005BB: BTFSC 03.205BC: GOTO 5BE.................... Download(); // Pripojen RS232 a propojka na PGM05BD: GOTO 347........................................ // Zapnuti napajeni.................... output_low(POWER_PIC); // Pripoj GND pro procesor05BE: BSF 03.505BF: BCF 05.305C0: BCF 03.505C1: BCF 05.3.................... SoundNote(SOUND_Space,3,10); // Mezera05C2: MOVLW 0C05C3: MOVWF 6905C4: MOVLW 0305C5: MOVWF 6A05C6: CLRF 6C05C7: MOVLW 0A05C8: MOVWF 6B05C9: CALL 0E2.................... output_low(POWER_386); // Zapni napajeni zesilovace05CA: BSF 03.505CB: BCF 05.405CC: BCF 03.505CD: BCF 05.4.................... SoundNote(SOUND_Space,3,100); // Mezera (jinak se chybne detekuje tlacitko)05CE: MOVLW 0C05CF: MOVWF 6905D0: MOVLW 0305D1: MOVWF 6A05D2: CLRF 6C05D3: MOVLW 6405D4: MOVWF 6B05D5: CALL 0E2........................................ // Cteni tlacitek.................... #use FAST_IO(B).................... CisloSkladby=(input_b() >> 4) ^ 0xFF & 0xF; // Precti stav tlacitek05D6: SWAPF 06,W05D7: MOVWF 7705D8: MOVLW 0F05D9: ANDWF 77,F05DA: MOVF 77,W05DB: XORLW 0F05DC: MOVWF 34.................... #use STANDARD_IO(B).................... CisloSkladby=KeyTranslate[CisloSkladby]; // Prekoduj je do binarniho kodu05DD: MOVF 34,W05DE: CALL 0B705DF: MOVWF 7805E0: MOVWF 34........................................ // Prehrani skladby.................... Play(); // Zahraj skladbu05E1: CALL 279........................................ // 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)05E2: MOVF 06,W05E3: XORLW 0005E4: BTFSC 03.205E5: GOTO 5E6.................... #use STANDARD_IO(B).................... bit_clear(*0xB,0); // Nuluj priznak preruseni od zmeny stavu portu B05E6: BCF 0B.0.................... enable_interrupts(INT_RB); // Povol preruseni od zmeny stavu portu B05E7: BSF 0B.3........................................ output_high(POWER_386); // Vypni napajeni zesilovace05E8: BSF 03.505E9: BCF 05.405EA: BCF 03.505EB: BSF 05.4.................... output_float(POWER_PIC); // Odpoj GND05EC: BSF 03.505ED: BSF 05.3.................... Sleep(); // Usni aby byla minimalni klidova spotreba05EE: SLEEP........................................ disable_interrupts(INT_RB); // Zakaz preruseni od portu05EF: BCF 03.505F0: BCF 0B.3.................... goto Start; // Po probuzeni skoc na zacatek05F1: GOTO 599.................... }....................05F2: SLEEP