;********************************************************************************* ; ; File: main.asm ; Date: 10 May, 2007 Victor Liu - Original code ; Version: 1.00 ; ;********************************************************************************* ; Default Tempo = 120 quarter notes per minute, so whole notes are 2 seconds long list p=12f683 ; list directive to define processor #include ; processor specific variable definitions __CONFIG _FCMEN_OFF & _IESO_OFF & _BOD_ON & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTOSCIO ; Memory variables (anywhere in 0x20-0x7f): #DEFINE TEMP2 20H ;ONLY USED INSIDE OF THE INTERRUPT #DEFINE TEMP3 21H ;ONLY USED INSIDE OF THE INTERRUPT #DEFINE DBG1 22H ;Debugging variable #DEFINE INTTEMP1 23H ;ONLY USED INSIDE THE INTERRUPT #DEFINE CurOctave 40H ;0-6, 3 starts at middle C #DEFINE CurLength 41H ;0-63, 0 is whole note, 1 = half note, 3 = quarter note (ranged checked when stored) #DEFINE CurPause 42H ;0 = not a pause, 1 = current note is a pause #DEFINE SongPtr 43H ;Gives the offset from MYSONG that we're looking at #define STARTING_ASCII_CODE '<' #define INVALID_CHAR -1 ;used in the parsing table BANK1 MACRO BSF STATUS, RP0 ;MACRO TO SELECT BANK 1 ENDM BANK0 MACRO BCF STATUS, RP0 ;MACRO TO SELECT BANK 0 ENDM SETVAR MACRO VAR,VAL MOVLW VAL MOVWF VAR ENDM ORG 0x000 ;RESET VECTOR BANK0 GOTO INIT ;GO TO BEGINING OF THE PROGRAM ;INTERRUPT SERVICE ROUTINE ;INTERRUPT WILL RUN BASED OFF THE TMR1 INTERRUPT ORG 0x004 ;INTERRUPT VECTOR LOCATION ; Disable output BANK1 BSF TRISIO, 2 BANK0 BCF T1CON, TMR1ON ; Stop TMR1 ;BCF T2CON, TMR2ON ; Stop TMR2 ParseLoop MOVLW HIGH MySong MOVWF PCLATH MOVF SongPtr, W ; Get current character in song string CALL MySong ; After this, W contains current character MOVWF INTTEMP1 ; Save W register for PCLATH loading MOVLW HIGH PARSE_TABLE MOVWF PCLATH MOVLW STARTING_ASCII_CODE SUBWF INTTEMP1, W ; Trim off non printable chars CALL PARSE_TABLE ; Go ahead and run it thru the parse table MOVWF INTTEMP1 SUBLW 0 SKPNZ GOTO ParseLoop MOVFW INTTEMP1 SUBLW 1 SKPNZ GOTO PlayedANote ; Else invalid character, go to next character INCF SongPtr, F GOTO ParseLoop PlayedANote ; My debugging toggle ; MOVLW 0ffh ; MOVWF TMR1H ; in bank 0 ; CLRF TMR1L ; ; COMF DBG1, F ; BTFSS DBG1, 0 ; GOTO SkipTurnOff ; BCF GPIO, 5 ; GOTO EndSkipTurnOff ;SkipTurnOff ; BSF GPIO, 5 ;EndSkipTurnOff ; Re-enable output BANK1 BCF TRISIO, 2 BANK0 ;BSF T2CON, TMR2ON ; Start TMR2 BSF T1CON, TMR1ON ; Start TMR1 BCF PIR1, TMR1IF ; Clear the interrupt flag RETFIE ;RETURN FROM INTERRUPT ; START OF MAIN PROGRAM INIT BANKSEL OSCCON MOVLW 031h ; Use 0.5 Mhz internal oscillator for system clock MOVWF OSCCON BANKSEL OSCTUNE ; Use factory default tuning CLRF OSCTUNE BANKSEL GPIO CLRF GPIO MOVLW 07h ; set GP<2:0> to digital IO MOVWF CMCON0 ; Turn off comparator, use as IOs instead BANKSEL ANSEL CLRF ANSEL ; Turn off A/D converter MOVLW 0 ; Set all to output MOVWF TRISIO ; Variable initialization BANK0 SETVAR CurOctave, 3 SETVAR CurLength, 4 SETVAR CurPause, 0 SETVAR SongPtr, 0 ; Initialize TMR1 BANK0 MOVLW 0ffh MOVWF TMR1H CLRF TMR1L BCF PIR1, TMR1IF MOVLW 031h ; disable gate, 1:8 prescale, no LP osc, use internal clock, turn on count ;MOVLW 001h ; disable gate, 1:1 prescale, no LP osc, use internal clock, turn on count MOVWF T1CON ; Initialize PWM (as per 11.3.7) BSF TRISIO, 2 ; Disable PWM pin BANKSEL PR2 ; Load PR2 value MOVLW b'10001101' MOVWF PR2 BANKSEL CCP1CON ; Load CCP1CON value MOVLW b'00011100' MOVWF CCP1CON BANKSEL CCPR1L ; Load CCPR1L MOVLW b'00111011' MOVWF CCPR1L BANKSEL PIR1 ; Turn off TMR2 interrupts BCF PIR1, TMR2IF BANKSEL T2CON ; Start TMR2 MOVLW b'00000101' MOVWF T2CON ; Should wait for TMR2 overflow, but who has the time? BANKSEL TRISIO ; Enable output BCF TRISIO, 2 BANK0 ; Initialize TMR1 interrupts BANK1 BSF PIE1, TMR1IE ; Interrupt enable for TMR1 in PIE1 BSF INTCON, PEIE BSF INTCON, GIE BANK0 ; Set Timer 0 to interrupt on note length ; Upon interrupt, update PWM output, increment pointer to next note MAIN ; BSF GPIO, 4 ; NOP ; BCF GPIO, 4 GOTO MAIN org 0x100 ; W contains the current ASCII char of the song string PARSE_TABLE ADDWF PCL, F ; RETLW INVALID_CHAR ; 0 ; RETLW INVALID_CHAR ; 1 ; RETLW INVALID_CHAR ; 2 ; RETLW INVALID_CHAR ; 3 ; RETLW INVALID_CHAR ; 4 ; RETLW INVALID_CHAR ; 5 ; RETLW INVALID_CHAR ; 6 ; RETLW INVALID_CHAR ; 7 ; RETLW INVALID_CHAR ; 8 ; RETLW INVALID_CHAR ; 9 ; RETLW INVALID_CHAR ; 10 ; RETLW INVALID_CHAR ; 11 ; RETLW INVALID_CHAR ; 12 ; RETLW INVALID_CHAR ; 13 ; RETLW INVALID_CHAR ; 14 ; RETLW INVALID_CHAR ; 15 ; RETLW INVALID_CHAR ; 16 ; RETLW INVALID_CHAR ; 17 ; RETLW INVALID_CHAR ; 18 ; RETLW INVALID_CHAR ; 19 ; RETLW INVALID_CHAR ; 20 ; RETLW INVALID_CHAR ; 21 ; RETLW INVALID_CHAR ; 22 ; RETLW INVALID_CHAR ; 23 ; RETLW INVALID_CHAR ; 24 ; RETLW INVALID_CHAR ; 25 ; RETLW INVALID_CHAR ; 26 ; RETLW INVALID_CHAR ; 27 ; RETLW INVALID_CHAR ; 28 ; RETLW INVALID_CHAR ; 29 ; RETLW INVALID_CHAR ; 30 ; RETLW INVALID_CHAR ; 31 ; RETLW INVALID_CHAR ; [SPACE] ; RETLW INVALID_CHAR ; ! ; RETLW INVALID_CHAR ; " ; RETLW INVALID_CHAR ; # ; RETLW INVALID_CHAR ; $ ; RETLW INVALID_CHAR ; % ; RETLW INVALID_CHAR ; & ; RETLW INVALID_CHAR ; ' ; RETLW INVALID_CHAR ; ( ; RETLW INVALID_CHAR ; ) ; RETLW INVALID_CHAR ; * ; RETLW INVALID_CHAR ; + ; RETLW INVALID_CHAR ; , ; RETLW INVALID_CHAR ; - ; RETLW INVALID_CHAR ; . ; RETLW INVALID_CHAR ; / ; RETLW INVALID_CHAR ; 0 ; RETLW INVALID_CHAR ; 1 ; RETLW INVALID_CHAR ; 2 ; RETLW INVALID_CHAR ; 3 ; RETLW INVALID_CHAR ; 4 ; RETLW INVALID_CHAR ; 5 ; RETLW INVALID_CHAR ; 6 ; RETLW INVALID_CHAR ; 7 ; RETLW INVALID_CHAR ; 8 ; RETLW INVALID_CHAR ; 9 ; RETLW INVALID_CHAR ; : ; RETLW INVALID_CHAR ; ; GOTO PARSE_UP_OCTAVE ; < RETLW INVALID_CHAR ; = GOTO PARSE_DOWN_OCTAVE ; > RETLW INVALID_CHAR ; ? RETLW INVALID_CHAR ; @ GOTO PARSE_PLAY_NOTE ; A GOTO PARSE_PLAY_NOTE ; B GOTO PARSE_PLAY_NOTE ; C GOTO PARSE_PLAY_NOTE ; D GOTO PARSE_PLAY_NOTE ; E GOTO PARSE_PLAY_NOTE ; F GOTO PARSE_PLAY_NOTE ; G RETLW INVALID_CHAR ; H RETLW INVALID_CHAR ; I RETLW INVALID_CHAR ; J RETLW INVALID_CHAR ; K GOTO PARSE_SET_NOTE_LENGTH ; L RETLW INVALID_CHAR ; M RETLW INVALID_CHAR ; N GOTO PARSE_SET_OCTAVE ; O GOTO PARSE_PLAY_PAUSE ; P RETLW INVALID_CHAR ; Q GOTO PARSE_RESTART ; R RETLW INVALID_CHAR ; S RETLW INVALID_CHAR ; T RETLW INVALID_CHAR ; U RETLW INVALID_CHAR ; V RETLW INVALID_CHAR ; W RETLW INVALID_CHAR ; X RETLW INVALID_CHAR ; Y GOTO PARSE_STOP ; Z RETLW INVALID_CHAR ; [ RETLW INVALID_CHAR ; \ RETLW INVALID_CHAR ; ] RETLW INVALID_CHAR ; ^ RETLW INVALID_CHAR ; _ ; RETLW INVALID_CHAR ; ` ; RETLW INVALID_CHAR ; a ; RETLW INVALID_CHAR ; b ; RETLW INVALID_CHAR ; c ; RETLW INVALID_CHAR ; d ; RETLW INVALID_CHAR ; e ; RETLW INVALID_CHAR ; f ; RETLW INVALID_CHAR ; g ; RETLW INVALID_CHAR ; h ; RETLW INVALID_CHAR ; i ; RETLW INVALID_CHAR ; j ; RETLW INVALID_CHAR ; k ; RETLW INVALID_CHAR ; l ; RETLW INVALID_CHAR ; m ; RETLW INVALID_CHAR ; n ; RETLW INVALID_CHAR ; o ; RETLW INVALID_CHAR ; p ; RETLW INVALID_CHAR ; q ; RETLW INVALID_CHAR ; r ; RETLW INVALID_CHAR ; s ; RETLW INVALID_CHAR ; t ; RETLW INVALID_CHAR ; u ; RETLW INVALID_CHAR ; v ; RETLW INVALID_CHAR ; w ; RETLW INVALID_CHAR ; x ; RETLW INVALID_CHAR ; y ; RETLW INVALID_CHAR ; z ; RETLW INVALID_CHAR ; { ; RETLW INVALID_CHAR ; | ; RETLW INVALID_CHAR ; } ; RETLW INVALID_CHAR ; ~ ; RETLW INVALID_CHAR ; [DEL] PARSE_RESTART MOVLW 0 MOVWF SongPtr RETLW 0 PARSE_STOP BANKSEL TRISIO BSF TRISIO, 2 SLEEP RETLW 0 ; Probably wrong, just don't go out of bounds for now PARSE_UP_OCTAVE INCF SongPtr, F ; Move to next char INCF CurOctave, F MOVFW CurOctave SUBLW 6 MOVLW 6 SKPC; SkipOctaveTooLarge MOVWF CurOctave SkipOctaveTooLarge RETLW 0 PARSE_DOWN_OCTAVE INCF SongPtr, F ; Move to next char DECF CurOctave, F MOVFW CurOctave SUBLW 0ffh ; -1 MOVLW 0 SKPC; SkipOctaveTooSmall MOVWF CurOctave SkipOctaveTooSmall RETLW 0 PARSE_SET_NOTE_LENGTH MOVLW HIGH MySong MOVWF PCLATH INCF SongPtr, F ; Move to L's argument MOVF SongPtr, W INCF SongPtr, F ; Move to next command CALL MySong ; Get L's argument (arg) MOVWF CurLength DECF CurLength, W ; W now contains (arg-1) ANDLW 03Fh ; mask W to 0-63 MOVWF CurLength RETLW 0 ; return 1 if plays something, else 0 PARSE_SET_OCTAVE MOVLW HIGH MySong MOVWF PCLATH INCF SongPtr, F ; Move to O's argument MOVF SongPtr, W INCF SongPtr, F ; Move to next command CALL MySong ; Get O's argument (arg) MOVWF CurOctave SUBLW 6 ; 6-CurOctave, if carry, then bad MOVLW 6 ; Doesn't change carry flag SKPC ; Skip if no carry MOVWF CurOctave ; cap CurOctave to 6 if it was larger RETLW 0 ; return 1 if plays something, else 0 ; W must be one of ABCDEFG PARSE_PLAY_NOTE ; pasted stuff here, fix it MOVWF TEMP2 ; keep a copy in TEMP2 MOVLW ('A'-STARTING_ASCII_CODE) SUBWF TEMP2, F ; TEMP2 = 0-6 now instead of 'A'-'G' ; TEMP2 CANNOT BE CHANGED ; Preload length into TMR1* regs MOVFW CurLength MOVWF TEMP3 BCF STATUS, C RLF TEMP3, F ; Multiply by 2 for table offset MOVLW HIGH LENGTH_TABLE MOVWF PCLATH MOVFW TEMP3 ; Get hi byte first CALL LENGTH_TABLE MOVWF TMR1H INCF TEMP3, F ; Get lo byte MOVFW TEMP3 CALL LENGTH_TABLE MOVWF TMR1L ; To get table index I, ; I = 12*CurOctave + [Column offset of note] ; = 4*CO + 8*CO + base BCF STATUS, C ; Clear carry flag MOVFW CurOctave MOVWF TEMP3 RLF TEMP3, F RLF TEMP3, W ; W = CurOct*4 MOVWF TEMP3 RLF TEMP3, F ; TEMP3 = CurOct*8 ADDWF TEMP3, F ; TEMP3 = CurOct*12 MOVLW HIGH NOTE_BASE_OFFSET MOVWF PCLATH MOVF TEMP2, W ; Get the column index CALL NOTE_BASE_OFFSET ADDWF TEMP3, F ; TEMP3 = CurOct*12 + note_offset ; TEMP2 CAN BE CHANGED AGAIN ; Process any suffixes FindSuffix MOVLW HIGH MySong MOVWF PCLATH INCF SongPtr, F ; Move to next char MOVFW SongPtr CALL MySong ; Get next char in W MOVWF TEMP2 SUBLW '#' SKPZ ; If not equal, goto SkipSharp GOTO SkipSharp INCF TEMP3, F ; For a sharp, just go to next note GOTO FindSuffix ; See if there are more suffixes SkipSharp MOVFW TEMP2 SUBLW '+' SKPZ ; If not equal, goto SkipSharp GOTO SkipSharp2 INCF TEMP3, F ; For a sharp, just go to next note GOTO FindSuffix ; See if there are more suffixes SkipSharp2 MOVFW TEMP2 SUBLW '-' SKPZ ; If not equal, goto SkipSharp GOTO SkipFlat DECF TEMP3, F ; For a flat, just go to prev note GOTO FindSuffix ; See if there are more suffixes SkipFlat MOVFW TEMP2 SUBLW '.' SKPZ ; If not equal, goto SkipSharp GOTO SkipDot ; Make length 50% longer MOVFW TMR1L MOVWF TEMP2 BCF STATUS, C RRF TEMP2, F ; TEMP2 = TMR1LO/2 ADDWF TEMP2, W MOVWF TMR1L ; TMR1LO has been adjusted, carry bit still hanging around SKPNC INCF TMR1H, F ; Include carry if there was any MOVFW TMR1H MOVWF TEMP2 BCF STATUS, C RRF TEMP2, F ; TEMP2 = TMR1HI/2 ADDWF TEMP2, W MOVWF TMR1H ; Now TMR1HI has been adjusted as well GOTO FindSuffix ; See if there are more suffixes SkipDot ; Now, cap TEMP3 to 0-83 MOVF TEMP3, W SUBLW 83 ; W = 83-W MOVLW 83 SKPC MOVWF TEMP3 ; if was greater (had carry) then cap to 83 BCF STATUS, C ; clear carry flag for shift RLF TEMP3, F ; multiply by 2 to get actual table offset MOVLW HIGH NOTE_TABLE_1 MOVWF PCLATH MOVFW TEMP3 ; Get PR2 CALL NOTE_TABLE_1 BANK1 MOVWF PR2 BANK0 MOVLW HIGH NOTE_TABLE_2 MOVWF PCLATH MOVFW TEMP3 ; Get CCPR1L CALL NOTE_TABLE_2 MOVWF CCPR1L MOVLW HIGH NOTE_TABLE_1 MOVWF PCLATH INCF TEMP3, F MOVFW TEMP3 ; Get T2CON CALL NOTE_TABLE_1 MOVWF T2CON MOVLW HIGH NOTE_TABLE_2 MOVWF PCLATH MOVFW TEMP3 ; Get CCP1CON CALL NOTE_TABLE_2 MOVWF CCP1CON RETLW 1 ; return 1 if plays something, else 0 PARSE_PLAY_PAUSE MOVLW HIGH MySong MOVWF PCLATH INCF SongPtr, F ; Move to P's argument MOVF SongPtr, W INCF SongPtr, F ; Move to next command CALL MySong ; Get P's argument (arg) MOVWF CurLength DECF CurLength, W ; W now contains (arg-1) ANDLW 03Fh ; mask W to 0-63 MOVWF TEMP3 BCF STATUS, C RLF TEMP3, F ; Multiply by 2 for table offset MOVLW HIGH LENGTH_TABLE MOVWF PCLATH MOVFW TEMP3 ; Get hi byte first CALL LENGTH_TABLE MOVWF TMR1H INCF TEMP3, F ; Get lo byte MOVFW TEMP3 CALL LENGTH_TABLE MOVWF TMR1L MOVLW 000h MOVWF CCP1CON ; Disable CCP/PWM RETLW 1 ; return 1 if plays something, else 0 org 0x400 ; input: note index 0-6 (for 'A'-'G') ; output: offset (0-11) in each octave block of NOTE_TABLE where the note is NOTE_BASE_OFFSET ; 0 1 2 3 4 5 6 7 8 9 10 11 ADDWF PCL, F ; C C# D D# E F F# G G# A A# B RETLW d'9' ; A RETLW d'11' ; B RETLW d'0' ; C RETLW d'2' ; D RETLW d'4' ; E RETLW d'5' ; F RETLW d'7' ; G ; Note lengths, L1...L64, we index from 0-63 ; stores TMR1HI and TMR1LO values (in this order) LENGTH_TABLE ADDWF PCL, F RETLW 085h ; 1 RETLW 0eeh RETLW 0c2h ; 2 RETLW 0f7h RETLW 0d7h ; 3 RETLW 050h RETLW 0e1h ; 4 RETLW 07ch RETLW 0e7h ; 5 RETLW 096h RETLW 0ebh ; 6 RETLW 0a8h RETLW 0eeh ; 7 RETLW 090h RETLW 0f0h ; 8 RETLW 0beh RETLW 0f2h ; 9 RETLW 070h RETLW 0f3h ; 10 RETLW 0cbh RETLW 0f4h ; 11 RETLW 0e8h RETLW 0f5h ; 12 RETLW 0d4h RETLW 0f6h ; 13 RETLW 09dh RETLW 0f7h ; 14 RETLW 048h RETLW 0f7h ; 15 RETLW 0ddh RETLW 0f8h ; 16 RETLW 05fh RETLW 0f8h ; 17 RETLW 0d2h RETLW 0f9h ; 18 RETLW 038h RETLW 0f9h ; 19 RETLW 094h RETLW 0f9h ; 20 RETLW 0e6h RETLW 0fah ; 21 RETLW 030h RETLW 0fah ; 22 RETLW 074h RETLW 0fah ; 23 RETLW 0b2h RETLW 0fah ; 24 RETLW 0eah RETLW 0fbh ; 25 RETLW 01eh RETLW 0fbh ; 26 RETLW 04fh RETLW 0fbh ; 27 RETLW 07bh RETLW 0fbh ; 28 RETLW 0a4h RETLW 0fbh ; 29 RETLW 0cbh RETLW 0fbh ; 30 RETLW 0efh RETLW 0fch ; 31 RETLW 010h RETLW 0fch ; 32 RETLW 030h RETLW 0fch ; 33 RETLW 04eh RETLW 0fch ; 34 RETLW 069h RETLW 0fch ; 35 RETLW 084h RETLW 0fch ; 36 RETLW 09ch RETLW 0fch ; 37 RETLW 0b4h RETLW 0fch ; 38 RETLW 0cah RETLW 0fch ; 39 RETLW 0dfh RETLW 0fch ; 40 RETLW 0f3h RETLW 0fdh ; 41 RETLW 006h RETLW 0fdh ; 42 RETLW 018h RETLW 0fdh ; 43 RETLW 02ah RETLW 0fdh ; 44 RETLW 03ah RETLW 0fdh ; 45 RETLW 04ah RETLW 0fdh ; 46 RETLW 059h RETLW 0fdh ; 47 RETLW 068h RETLW 0fdh ; 48 RETLW 075h RETLW 0fdh ; 49 RETLW 083h RETLW 0fdh ; 50 RETLW 08fh RETLW 0fdh ; 51 RETLW 09ch RETLW 0fdh ; 52 RETLW 0a8h RETLW 0fdh ; 53 RETLW 0b3h RETLW 0fdh ; 54 RETLW 0beh RETLW 0fdh ; 55 RETLW 0c8h RETLW 0fdh ; 56 RETLW 0d2h RETLW 0fdh ; 57 RETLW 0dch RETLW 0fdh ; 58 RETLW 0e6h RETLW 0fdh ; 59 RETLW 0efh RETLW 0fdh ; 60 RETLW 0f8h RETLW 0feh ; 61 RETLW 000h RETLW 0feh ; 62 RETLW 008h RETLW 0feh ; 63 RETLW 010h RETLW 0feh ; 64 RETLW 018h org 0x500 TABENTRY MACRO PR2VAL,T2CONVAL,CCPR1LVAL,CCP1CONVAL RETLW PR2VAL RETLW T2CONVAL ENDM ; Example call to this table would be ; MOVLW 04h (want entry of offset 4) ; CALL NOTE_TABLE ; MOVWF [result loc] NOTE_TABLE_1 ADDWF PCL, F ; PR2 T2CON CCPR1L CCP1CON ; Octave 0 TABENTRY b'11101110', b'00000111', b'01110111', b'00011100' ; C 32.7 Hz TABENTRY b'11100001', b'00000111', b'01110000', b'00111100' ; C# TABENTRY b'11010100', b'00000111', b'01101010', b'00011100' ; D TABENTRY b'11001000', b'00000111', b'01100100', b'00011100' ; D# TABENTRY b'10111101', b'00000111', b'01011110', b'00111100' ; E TABENTRY b'10110010', b'00000111', b'01011001', b'00011100' ; F TABENTRY b'10101000', b'00000111', b'01010100', b'00011100' ; F# TABENTRY b'10011110', b'00000111', b'01001111', b'00011100' ; G TABENTRY b'10010110', b'00000111', b'01001011', b'00011100' ; G# TABENTRY b'10001101', b'00000111', b'01000110', b'00111100' ; A TABENTRY b'10000101', b'00000111', b'01000010', b'00111100' ; A# TABENTRY b'01111110', b'00000111', b'00111111', b'00011100' ; B ; Octave 1' TABENTRY b'01110110', b'00000111', b'00111011', b'00011100' ; C 65.4 Hz TABENTRY b'01110000', b'00000111', b'00111000', b'00011100' TABENTRY b'01101001', b'00000111', b'00110100', b'00111100' TABENTRY b'01100011', b'00000111', b'00110001', b'00111100' TABENTRY b'01011110', b'00000111', b'00101111', b'00011100' TABENTRY b'01011000', b'00000111', b'00101100', b'00011100' TABENTRY b'01010011', b'00000111', b'00101001', b'00111100' TABENTRY b'01001111', b'00000111', b'00100111', b'00111100' TABENTRY b'01001010', b'00000111', b'00100101', b'00011100' TABENTRY b'01000110', b'00000111', b'00100011', b'00011100' TABENTRY b'01000010', b'00000111', b'00100001', b'00011100' TABENTRY b'11111100', b'00000101', b'01111110', b'00011100' ; Octave 2 TABENTRY b'11101110', b'00000101', b'01110111', b'00011100' TABENTRY b'11100000', b'00000101', b'01110000', b'00011100' TABENTRY b'11010100', b'00000101', b'01101010', b'00011100' TABENTRY b'11001000', b'00000101', b'01100100', b'00011100' TABENTRY b'10111101', b'00000101', b'01011110', b'00111100' TABENTRY b'10110010', b'00000101', b'01011001', b'00011100' TABENTRY b'10101000', b'00000101', b'01010100', b'00011100' TABENTRY b'10011110', b'00000101', b'01001111', b'00011100' TABENTRY b'10010110', b'00000101', b'01001011', b'00011100' TABENTRY b'10001101', b'00000101', b'01000110', b'00111100' TABENTRY b'10000101', b'00000101', b'01000010', b'00111100' TABENTRY b'01111110', b'00000101', b'00111111', b'00011100' ; Octave 3 TABENTRY b'01110110', b'00000101', b'00111011', b'00011100' TABENTRY b'01110000', b'00000101', b'00111000', b'00011100' TABENTRY b'01101001', b'00000101', b'00110100', b'00111100' TABENTRY b'00011000', b'00000111', b'00001100', b'00011100' TABENTRY b'01011110', b'00000101', b'00101111', b'00011100' TABENTRY b'01011000', b'00000101', b'00101100', b'00011100' TABENTRY b'00010100', b'00000111', b'00001010', b'00011100' TABENTRY b'00010011', b'00000111', b'00001001', b'00111100' TABENTRY b'01001010', b'00000101', b'00100101', b'00011100' TABENTRY b'01000110', b'00000101', b'00100011', b'00011100' TABENTRY b'01000010', b'00000101', b'00100001', b'00011100' TABENTRY b'11111100', b'00000100' ,b'01111110', b'00011100' ; Octave 4 TABENTRY b'11101110', b'00000100', b'01110111', b'00011100' TABENTRY b'11100000', b'00000100', b'01110000', b'00011100' TABENTRY b'11010100', b'00000100', b'01101010', b'00011100' TABENTRY b'11001000', b'00000100', b'01100100', b'00011100' TABENTRY b'10111101', b'00000100', b'01011110', b'00111100' TABENTRY b'10110010', b'00000100', b'01011001', b'00011100' TABENTRY b'10101000', b'00000100', b'01010100', b'00011100' TABENTRY b'10011110', b'00000100', b'01001111', b'00011100' TABENTRY b'10010101', b'00000100', b'01001010', b'00111100' TABENTRY b'10001101', b'00000100', b'01000110', b'00111100' TABENTRY b'10000101', b'00000100', b'01000010', b'00111100' TABENTRY b'01111110', b'00000100', b'00111111', b'00011100' ; Octave 5 TABENTRY b'01110110', b'00000100', b'00111011', b'00011100' TABENTRY b'01110000', b'00000100', b'00111000', b'00011100' TABENTRY b'01101001', b'00000100', b'00110100', b'00111100' TABENTRY b'00011000', b'00000101', b'00001100', b'00011100' TABENTRY b'01011110', b'00000100', b'00101111', b'00011100' TABENTRY b'01011001', b'00000100', b'00101100', b'00111100' TABENTRY b'01010100', b'00000100', b'00101010', b'00011100' TABENTRY b'00000100', b'00000111', b'00000010', b'00011100' TABENTRY b'01001010', b'00000100', b'00100101', b'00011100' TABENTRY b'01000110', b'00000100', b'00100011', b'00011100' TABENTRY b'01000010', b'00000100', b'00100001', b'00011100' TABENTRY b'00111110', b'00000100', b'00011111', b'00011100' ; Octave 6 TABENTRY b'00001110', b'00000101', b'00000111', b'00011100' TABENTRY b'00001101', b'00000101', b'00000110', b'00111100' TABENTRY b'00110100', b'00000100', b'00011010', b'00011100' TABENTRY b'00110001', b'00000100', b'00011000', b'00111100' TABENTRY b'00101110', b'00000100', b'00010111', b'00011100' TABENTRY b'00101100', b'00000100', b'00010110', b'00011100' TABENTRY b'00101001', b'00000100', b'00010100', b'00111100' TABENTRY b'00001001', b'00000101', b'00000100', b'00111100' TABENTRY b'00100101', b'00000100', b'00010010', b'00111100' TABENTRY b'00001000', b'00000101', b'00000100', b'00011100' TABENTRY b'00100001', b'00000100', b'00010000', b'00111100' TABENTRY b'00000001', b'00000111', b'00000000', b'00111100' org 0x600 TABENTRY2 MACRO PR2VAL,T2CONVAL,CCPR1LVAL,CCP1CONVAL RETLW CCPR1LVAL RETLW CCP1CONVAL ENDM NOTE_TABLE_2 ADDWF PCL, F ; PR2 T2CON CCPR1L CCP1CON ; Octave 0 TABENTRY2 b'11101110', b'00000111', b'01110111', b'00011100' ; C 32.7 Hz TABENTRY2 b'11100001', b'00000111', b'01110000', b'00111100' ; C# TABENTRY2 b'11010100', b'00000111', b'01101010', b'00011100' ; D TABENTRY2 b'11001000', b'00000111', b'01100100', b'00011100' ; D# TABENTRY2 b'10111101', b'00000111', b'01011110', b'00111100' ; E TABENTRY2 b'10110010', b'00000111', b'01011001', b'00011100' ; F TABENTRY2 b'10101000', b'00000111', b'01010100', b'00011100' ; F# TABENTRY2 b'10011110', b'00000111', b'01001111', b'00011100' ; G TABENTRY2 b'10010110', b'00000111', b'01001011', b'00011100' ; G# TABENTRY2 b'10001101', b'00000111', b'01000110', b'00111100' ; A TABENTRY2 b'10000101', b'00000111', b'01000010', b'00111100' ; A# TABENTRY2 b'01111110', b'00000111', b'00111111', b'00011100' ; B ; Octave 1' TABENTRY2 b'01110110', b'00000111', b'00111011', b'00011100' ; C 65.4 Hz TABENTRY2 b'01110000', b'00000111', b'00111000', b'00011100' TABENTRY2 b'01101001', b'00000111', b'00110100', b'00111100' TABENTRY2 b'01100011', b'00000111', b'00110001', b'00111100' TABENTRY2 b'01011110', b'00000111', b'00101111', b'00011100' TABENTRY2 b'01011000', b'00000111', b'00101100', b'00011100' TABENTRY2 b'01010011', b'00000111', b'00101001', b'00111100' TABENTRY2 b'01001111', b'00000111', b'00100111', b'00111100' TABENTRY2 b'01001010', b'00000111', b'00100101', b'00011100' TABENTRY2 b'01000110', b'00000111', b'00100011', b'00011100' TABENTRY2 b'01000010', b'00000111', b'00100001', b'00011100' TABENTRY2 b'11111100', b'00000101', b'01111110', b'00011100' ; Octave 2 TABENTRY2 b'11101110', b'00000101', b'01110111', b'00011100' TABENTRY2 b'11100000', b'00000101', b'01110000', b'00011100' TABENTRY2 b'11010100', b'00000101', b'01101010', b'00011100' TABENTRY2 b'11001000', b'00000101', b'01100100', b'00011100' TABENTRY2 b'10111101', b'00000101', b'01011110', b'00111100' TABENTRY2 b'10110010', b'00000101', b'01011001', b'00011100' TABENTRY2 b'10101000', b'00000101', b'01010100', b'00011100' TABENTRY2 b'10011110', b'00000101', b'01001111', b'00011100' TABENTRY2 b'10010110', b'00000101', b'01001011', b'00011100' TABENTRY2 b'10001101', b'00000101', b'01000110', b'00111100' TABENTRY2 b'10000101', b'00000101', b'01000010', b'00111100' TABENTRY2 b'01111110', b'00000101', b'00111111', b'00011100' ; Octave 3 TABENTRY2 b'01110110', b'00000101', b'00111011', b'00011100' TABENTRY2 b'01110000', b'00000101', b'00111000', b'00011100' TABENTRY2 b'01101001', b'00000101', b'00110100', b'00111100' TABENTRY2 b'00011000', b'00000111', b'00001100', b'00011100' TABENTRY2 b'01011110', b'00000101', b'00101111', b'00011100' TABENTRY2 b'01011000', b'00000101', b'00101100', b'00011100' TABENTRY2 b'00010100', b'00000111', b'00001010', b'00011100' TABENTRY2 b'00010011', b'00000111', b'00001001', b'00111100' TABENTRY2 b'01001010', b'00000101', b'00100101', b'00011100' TABENTRY2 b'01000110', b'00000101', b'00100011', b'00011100' TABENTRY2 b'01000010', b'00000101', b'00100001', b'00011100' TABENTRY2 b'11111100', b'00000100' ,b'01111110', b'00011100' ; Octave 4 TABENTRY2 b'11101110', b'00000100', b'01110111', b'00011100' TABENTRY2 b'11100000', b'00000100', b'01110000', b'00011100' TABENTRY2 b'11010100', b'00000100', b'01101010', b'00011100' TABENTRY2 b'11001000', b'00000100', b'01100100', b'00011100' TABENTRY2 b'10111101', b'00000100', b'01011110', b'00111100' TABENTRY2 b'10110010', b'00000100', b'01011001', b'00011100' TABENTRY2 b'10101000', b'00000100', b'01010100', b'00011100' TABENTRY2 b'10011110', b'00000100', b'01001111', b'00011100' TABENTRY2 b'10010101', b'00000100', b'01001010', b'00111100' TABENTRY2 b'10001101', b'00000100', b'01000110', b'00111100' TABENTRY2 b'10000101', b'00000100', b'01000010', b'00111100' TABENTRY2 b'01111110', b'00000100', b'00111111', b'00011100' ; Octave 5 TABENTRY2 b'01110110', b'00000100', b'00111011', b'00011100' TABENTRY2 b'01110000', b'00000100', b'00111000', b'00011100' TABENTRY2 b'01101001', b'00000100', b'00110100', b'00111100' TABENTRY2 b'00011000', b'00000101', b'00001100', b'00011100' TABENTRY2 b'01011110', b'00000100', b'00101111', b'00011100' TABENTRY2 b'01011001', b'00000100', b'00101100', b'00111100' TABENTRY2 b'01010100', b'00000100', b'00101010', b'00011100' TABENTRY2 b'00000100', b'00000111', b'00000010', b'00011100' TABENTRY2 b'01001010', b'00000100', b'00100101', b'00011100' TABENTRY2 b'01000110', b'00000100', b'00100011', b'00011100' TABENTRY2 b'01000010', b'00000100', b'00100001', b'00011100' TABENTRY2 b'00111110', b'00000100', b'00011111', b'00011100' ; Octave 6 TABENTRY2 b'00001110', b'00000101', b'00000111', b'00011100' TABENTRY2 b'00001101', b'00000101', b'00000110', b'00111100' TABENTRY2 b'00110100', b'00000100', b'00011010', b'00011100' TABENTRY2 b'00110001', b'00000100', b'00011000', b'00111100' TABENTRY2 b'00101110', b'00000100', b'00010111', b'00011100' TABENTRY2 b'00101100', b'00000100', b'00010110', b'00011100' TABENTRY2 b'00101001', b'00000100', b'00010100', b'00111100' TABENTRY2 b'00001001', b'00000101', b'00000100', b'00111100' TABENTRY2 b'00100101', b'00000100', b'00010010', b'00111100' TABENTRY2 b'00001000', b'00000101', b'00000100', b'00011100' TABENTRY2 b'00100001', b'00000100', b'00010000', b'00111100' TABENTRY2 b'00000001', b'00000111', b'00000000', b'00111100' org 0x700 MySong ADDWF PCL, F RETLW 'O' RETLW d'3' RETLW 'L' RETLW d'16' RETLW 'D' RETLW '-' RETLW 'E' RETLW '-' RETLW 'F' RETLW 'G' RETLW 'D' RETLW '-' RETLW 'E' RETLW '-' RETLW 'F' RETLW 'G' RETLW 'D' RETLW 'E' RETLW 'F' RETLW '#' RETLW 'G' RETLW '#' RETLW 'D' RETLW 'E' RETLW 'F' RETLW '#' RETLW 'G' RETLW '#' RETLW 'D' RETLW '-' RETLW 'E' RETLW '-' RETLW 'F' RETLW 'G' RETLW 'D' RETLW '-' RETLW 'E' RETLW '-' RETLW 'F' RETLW 'G' RETLW 'D' RETLW 'E' RETLW 'F' RETLW '#' RETLW 'G' RETLW '#' RETLW 'D' RETLW 'E' RETLW 'F' RETLW '#' RETLW 'G' RETLW '#' RETLW 'E' RETLW '-' RETLW 'F' RETLW 'G' RETLW 'A' RETLW 'E' RETLW 'F' RETLW '#' RETLW 'G' RETLW '#' RETLW 'A' RETLW '#' RETLW 'F' RETLW 'G' RETLW 'A' RETLW 'B' RETLW 'F' RETLW '+' RETLW 'G' RETLW '+' RETLW 'A' RETLW '+' RETLW 'O' RETLW d'4' RETLW 'C' RETLW 'P' RETLW d'8' RETLW 'L' RETLW d'8' RETLW 'O' RETLW d'3' RETLW 'A' RETLW 'A' RETLW '#' RETLW 'B' RETLW 'O' RETLW d'4' RETLW 'L' RETLW d'2' RETLW 'C' RETLW 'Z' ; LOL Internet!!! ; RETLW 'A' ; RETLW 'E' ; RETLW 'A' ; RETLW '<' ; RETLW 'E' ; RETLW 'D' ; RETLW 'C' ; RETLW '>' ; RETLW 'A' ; RETLW 'P' ; RETLW d'16' ; ; RETLW 'A' ; RETLW 'E' ; RETLW 'A' ; RETLW '<' ; RETLW 'E' ; RETLW 'D' ; RETLW 'C' ; RETLW '>' ; RETLW 'A' ; RETLW 'P' ; RETLW d'16' ; ; RETLW '<' ; RETLW 'C' ; RETLW '>' ; RETLW 'B' ; RETLW 'G' ; RETLW 'L' ; RETLW d'8' ; RETLW '<' ; RETLW 'C' ; RETLW '>' ; RETLW 'L' ; RETLW d'16' ; RETLW 'B' ; RETLW 'G' ; RETLW 'P' ; RETLW d'16' ; ; RETLW '<' ; RETLW 'C' ; RETLW '>' ; RETLW 'B' ; RETLW 'G' ; RETLW 'L' ; RETLW d'8' ; RETLW '<' ; RETLW 'D' ; RETLW '>' ; RETLW 'L' ; RETLW d'16' ; RETLW 'B' ; RETLW 'G' ; RETLW 'P' ; RETLW d'16' ; ; RETLW 'A' ; RETLW 'E' ; RETLW 'A' ; RETLW '<' ; RETLW 'E' ; RETLW 'D' ; RETLW 'C' ; RETLW '>' ; RETLW 'A' ; RETLW 'P' ; RETLW d'16' ; ; RETLW 'A' ; RETLW 'E' ; RETLW 'A' ; RETLW '<' ; RETLW 'E' ; RETLW 'D' ; RETLW 'C' ; RETLW '>' ; RETLW 'A' ; RETLW 'P' ; RETLW d'16' ; ; RETLW '<' ; RETLW 'C' ; RETLW 'C' ; RETLW 'P' ; RETLW d'16' ; RETLW 'C' ; RETLW 'D' ; RETLW 'D' ; RETLW 'P' ; RETLW d'16' ; RETLW 'D' ; RETLW 'E' ; RETLW 'E' ; RETLW 'P' ; RETLW d'16' ; RETLW 'E' ; RETLW 'D' ; RETLW 'D' RETLW 'Z' END