MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 1 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00001 #define MidiChannel 9 00002 ;#define ICD 00003 ;#define MIDITHROUGHTEST 00004 00005 00006 ; harmal.asm 00007 ; Dec 2005 00008 ; by Johannes Taelman 00009 00010 list p=18f252 ;list directive to define processor 00011 #include ;processor specific definitions 00001 LIST 00002 ; P18F252.INC Standard Header File, Version 1.4 Microchip Technology, Inc. 00947 LIST 00012 00013 ; #define simulate 1 ; enable simulation 00014 ; #define heartbeat 1 ; enable heatbeats 00015 ;****************************************************************************** 00016 00017 #define ErrorLed LATC, 0; 00018 #define ClearErrorLed BCF ErrorLed 00019 #define SetErrorLed BSF ErrorLed 00020 00021 #include "..\midi.asm" 00001 ;---------------------------------------------------------------------------- 00002 ; MIDI IO 00003 ; 00004 ; error codes (appear on uart TX output when some error conditions occur: 00005 ; 00006 ; 0xFA - buffer overflow 00007 ; 0xFB - receive buffer overflow 00008 ; 0xFC - framing error 00009 ; 00010 ; changes 200506 00011 ; - full status byte parsing, sysex support etc 00012 ; changes 20050719 00013 ; - removed EndHighInt code 00014 ; - removed OutsC error readout 00015 00016 ;---------------------------------------------------------------------------- 00017 ;Constants 00018 0000004F 00019 SPBRG_VAL EQU 04Fh ;set baud rate 31250 for 40Mhz clock 00000010 00020 TX_BUF_LEN EQU 010h ;length of transmit circular buffer 00000010 00021 RX_BUF_LEN EQU TX_BUF_LEN ;length of receive circular buffer 00022 00023 ;---------------------------------------------------------------------------- 00024 ;Bit Definitions 00025 00000000 00026 TxBufFull EQU 0 ;bit indicates Tx buffer is full 00000001 00027 TxBufEmpty EQU 1 ;bit indicates Tx buffer is empty 00000002 00028 RxBufFull EQU 2 ;bit indicates Rx buffer is full 00000003 00029 RxBufEmpty EQU 3 ;bit indicates Rx buffer is empty MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 2 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00030 00031 ;---------------------------------------------------------------------------- 00032 ;Memory map 00033 00034 CBLOCK 0x50 ; 00000050 00035 MidiInByte ; Rcv'd Byte 00000051 00036 MidiByte0 ; status 00000052 00037 MidiByte1 ; data1 00000053 00038 MidiByte2 ; data2 00000054 00039 MidiCurData ; current data byte index 00000055 00040 MidiNumData ; expected data bytes 00041 ; MidiTestByte ; for testing only 00000056 00042 Flags ;byte for indicator flag bits 00000057 00043 TempData ;temporary data in main routines 00000058 00044 TempRxData ;temporary data in Rx buffer routines 00000059 00045 TempTxData ;temporary data in Tx buffer routines 0000005A 00046 TxStartPtrH ;pointer to start of data in Tx buffer 0000005B 00047 TxStartPtrL ;pointer to start of data in Tx buffer 0000005C 00048 TxEndPtrH ;pointer to end of data in Tx buffer 0000005D 00049 TxEndPtrL ;pointer to end of data in Tx buffer 0000005E 00050 RxStartPtrH ;pointer to start of data in Rx buffer 0000005F 00051 RxStartPtrL ;pointer to start of data in Rx buffer 00000060 00052 RxEndPtrH ;pointer to end of data in Rx buffer 00000061 00053 RxEndPtrL ;pointer to end of data in Rx buffer 00000062 00054 TxBuffer:TX_BUF_LEN ;Tx buffer for data to transmit 00000072 00055 RxBuffer:RX_BUF_LEN ;Rx buffer for received data 00056 ENDC 00057 00058 00059 000700 00060 ORG 0x0700 00061 00062 ;------------------------------------ 00063 ;Read data from the transmit buffer and put into transmit register. 00064 000700 00065 PutData: 000700 A256 00066 btfss Flags,TxBufEmpty ;check if transmit buffer is empty 000702 D002 00067 BRA PutDat1 ;if not then go transmit 000704 989D 00068 bcf PIE1,TXIE ;else disable Tx interrupt 000706 D4A1 00069 BRA EndLowInt 00070 000708 00071 PutDat1: 000708 D882 00072 rcall GetTxBuffer ;get data from transmit buffer 00070A 6EAD 00073 MOVWF TXREG ;and transmit 00070C D49E 00074 BRA EndLowInt ;this was implicit 00075 00076 ;------------------------------------ 00077 ;Get received data and write into receive buffer. 00078 00070E 00079 GetData: 00070E B2AB 00080 btfsc RCSTA,OERR ;if overrun error 000710 D007 00081 BRA ErrOERR ;then go handle error 000712 B4AB 00082 btfsc RCSTA,FERR ;if framing error MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 3 LOC OBJECT CODE LINE SOURCE TEXT VALUE 000714 D00A 00083 BRA ErrFERR ;then go handle error 000716 B456 00084 btfsc Flags,RxBufFull ;if buffer full 000718 D00E 00085 BRA ErrRxOver ;then go handle error 00071A 50AE 00086 MOVF RCREG,W ;get received data 00071C D85B 00087 rcall PutRxBuffer ;and put in buffer 00071E D495 00088 BRA EndLowInt 00089 00090 ;error because OERR overrun error bit is set 00091 ;can do special error handling here - this code simply clears and continues 00092 000720 00093 ErrOERR: 000720 98AB 00094 bcf RCSTA,CREN ;reset the receiver logic 000722 88AB 00095 bsf RCSTA,CREN ;enable reception again 000724 0EFA 00096 MOVLW 0xFA; ; MIDI RT Start 000726 D836 00097 rcall PutTxBuffer ;put data in transmit buffer 000728 D490 00098 BRA EndLowInt 00099 00100 ;error because FERR framing error bit is set 00101 ;can do special error handling here - this code simply clears and continues 00102 00072A 00103 ErrFERR: 00072A 50AE 00104 MOVF RCREG,W ;discard received data that has error 00072C 98AB 00105 bcf RCSTA,CREN ;reset the receiver logic 00072E 88AB 00106 bsf RCSTA,CREN ;enable reception again 000730 0EFC 00107 MOVLW 0xFC; ; MIDI RT Stop 000732 D830 00108 rcall PutTxBuffer ;put data in transmit buffer 000734 D48A 00109 BRA EndLowInt 00110 00111 ;error because receive buffer is full 00112 ;can do special error handling here - this code checks and discards the data 00113 000736 00114 ErrRxOver: 000736 50AE 00115 MOVF RCREG,W ;discard received data 000738 0EFB 00116 MOVLW 0xFB; ; MIDI RT Start 00073A D82C 00117 rcall PutTxBuffer ;put data in transmit buffer 00073C D486 00118 BRA EndLowInt 00119 00120 ;---------------------------------------------------------------------------- 00121 ;End of high priority interrupt routine restores context. 00122 00123 ;EndHighInt: 00124 ; MOVFF FSR0L_SHADOW,FSR0L ;restore FSR0L register 00125 ; MOVFF FSR0H_SHADOW,FSR0H ;restore FSR0H register 00126 ; retfie FAST ;return and restore context 00127 00128 ;---------------------------------------------------------------------------- 00129 ;Set up serial port and buffers. 00130 00073E 00131 SetupMidi: 00073E 0EC0 00132 MOVLW 0xc0 ;set tris bits for Tx and RX 000740 1294 00133 iorwf TRISC,F 000742 0E4F 00134 MOVLW SPBRG_VAL ;set baud rate 000744 6EAF 00135 MOVWF SPBRG MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 4 LOC OBJECT CODE LINE SOURCE TEXT VALUE 000746 0E24 00136 MOVLW 0x24 ;enable transmission and high baud rate 000748 6EAC 00137 MOVWF TXSTA 00074A 0E90 00138 MOVLW 0x90 ;enable serial port and reception 00074C 6EAB 00139 MOVWF RCSTA 00074E 6A56 00140 CLRF Flags ;clear all flags 00141 000750 6A51 00142 CLRF MidiByte0 000752 6A52 00143 CLRF MidiByte1 000754 6A53 00144 CLRF MidiByte2 000756 6A50 00145 CLRF MidiInByte 000758 6A54 00146 CLRF MidiCurData 00075A 6A55 00147 CLRF MidiNumData 00148 00075C D809 00149 rcall InitTxBuffer ;initialize transmit buffer 00075E D811 00150 rcall InitRxBuffer ;initialize receive buffer 00151 000760 8A9D 00152 BSF PIE1,RCIE 000762 889D 00153 BSF PIE1,TXIE 000764 9A9F 00154 BCF IPR1,RCIP ;set Rx low and Tx low priority 000766 989F 00155 BCF IPR1,TXIP 000768 8ED0 00156 BSF RCON,IPEN ;enable interrupt priorities 00076A 8CF2 00157 BSF INTCON,PEIE 00076C 8EF2 00158 BSF INTCON,GIE 00159 ; MOVLW 0xc0 ;enable global high and low ints 00160 ; MOVWF INTCON 00076E 0012 00161 RETURN 00162 00163 ;---------------------------------------------------------------------------- 00164 ;Circular buffer routines. 00165 00166 ;---------------------------------------------------------------------------- 00167 ;Initialize transmit buffer. 00168 000770 00169 InitTxBuffer: 000770 0E00 00170 MOVLW HIGH TxBuffer ;take high address of transmit buffer 000772 6E5A 00171 MOVWF TxStartPtrH ;and place in transmit start pointer 000774 6E5C 00172 MOVWF TxEndPtrH ;and place in transmit end pointer 000776 0E62 00173 MOVLW LOW TxBuffer ;take low address of transmit buffer 000778 6E5B 00174 MOVWF TxStartPtrL ;and place in transmit start pointer 00077A 6E5D 00175 MOVWF TxEndPtrL ;and place in transmit end pointer 00077C 9056 00176 bcf Flags,TxBufFull ;indicate Tx buffer is not full 00077E 8256 00177 bsf Flags,TxBufEmpty ;indicate Tx buffer is empty 000780 0012 00178 RETURN 00179 00180 ;---------------------------------------------- 00181 ;Initialize receive buffer. 00182 000782 00183 InitRxBuffer: 000782 0E00 00184 MOVLW HIGH RxBuffer ;take high address of receive buffer 000784 6E5E 00185 MOVWF RxStartPtrH ;and place in receive start pointer 000786 6E60 00186 MOVWF RxEndPtrH ;and place in receive end pointer 000788 0E72 00187 MOVLW LOW RxBuffer ;take low address of receive buffer 00078A 6E5F 00188 MOVWF RxStartPtrL ;and place in receive start pointer MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 5 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00078C 6E61 00189 MOVWF RxEndPtrL ;and place in receive end pointer 00078E 9456 00190 bcf Flags,RxBufFull ;indicate Rx buffer is not full 000790 8656 00191 bsf Flags,RxBufEmpty ;indicate Rx buffer is empty 000792 0012 00192 RETURN 00193 00194 ;---------------------------------------------------------------------------- 00195 ;Add a byte (in WREG) to the end of the transmit buffer. 00196 000794 00197 PutTxBuffer: 000794 989D 00198 bcf PIE1,TXIE ;disable Tx interrupt to avoid conflict 000796 B056 00199 btfsc Flags,TxBufFull ;check if transmit buffer full 000798 D01B 00200 BRA ErrTxBufFull ;go handle error if full 00079A C05C FFEA 00201 MOVFF TxEndPtrH,FSR0H ;put EndPointer into FSR0 00079E C05D FFE9 00202 MOVFF TxEndPtrL,FSR0L ;put EndPointer into FSR0 0007A2 6EEE 00203 MOVWF POSTINC0 ;copy data to buffer 00204 ;test if buffer pointer needs to wrap around to beginning of buffer memory 0007A4 0E00 00205 MOVLW HIGH (TxBuffer+TX_BUF_LEN) ;get last address of buffer 0007A6 62EA 00206 cpfseq FSR0H ;and compare with end pointer 0007A8 D005 00207 BRA PutTxBuf1 ;skip low bytes if high bytes not equal 0007AA 0E72 00208 MOVLW LOW (TxBuffer+TX_BUF_LEN) ;get last address of buffer 0007AC 62E9 00209 cpfseq FSR0L ;and compare with end pointer 0007AE D002 00210 BRA PutTxBuf1 ;go save new pointer if at end 0007B0 EE00 F062 00211 lfsr 0,TxBuffer ;point to beginning of buffer if at end 0007B4 00212 PutTxBuf1: 0007B4 CFEA F05C 00213 MOVFF FSR0H,TxEndPtrH ;save new EndPointer high byte 0007B8 CFE9 F05D 00214 MOVFF FSR0L,TxEndPtrL ;save new EndPointer low byte 00215 00216 ;test if buffer is full 00217 0007BC 505A 00218 MOVF TxStartPtrH,W ;get start pointer 0007BE 625C 00219 cpfseq TxEndPtrH ;and compare with end pointer 0007C0 D004 00220 BRA PutTxBuf2 ;skip low bytes if high bytes not equal 0007C2 505B 00221 MOVF TxStartPtrL,W ;get start pointer 0007C4 625D 00222 cpfseq TxEndPtrL ;and compare with end pointer 0007C6 D001 00223 BRA PutTxBuf2 0007C8 8056 00224 bsf Flags,TxBufFull ;if same then indicate buffer full 00225 0007CA 00226 PutTxBuf2: 0007CA 9256 00227 bcf Flags,TxBufEmpty ;Tx buffer cannot be empty 0007CC 889D 00228 bsf PIE1,TXIE ;enable transmit interrupt 0007CE 0012 00229 RETURN 00230 00231 ;error because attempting to store new data and the buffer is full 00232 ;can do special error handling here - this code simply ignores the byte 00233 0007D0 00234 ErrTxBufFull: 0007D0 889D 00235 bsf PIE1,TXIE ;enable transmit interrupt 0007D2 0012 00236 RETURN ;no save of data because buffer is full 00237 00238 ;---------------------------------------------- 00239 ;Add a byte (in WREG) to the end of the receive buffer. 00240 0007D4 00241 PutRxBuffer: MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 6 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0007D4 B456 00242 btfsc Flags,RxBufFull ;check if receive buffer full 0007D6 D01A 00243 BRA ErrRxBufFull ;go handle error if full 00244 0007D8 C060 FFEA 00245 MOVFF RxEndPtrH,FSR0H ;put EndPointer into FSR0 0007DC C061 FFE9 00246 MOVFF RxEndPtrL,FSR0L ;put EndPointer into FSR0 0007E0 6EEE 00247 MOVWF POSTINC0 ;copy data to buffer 00248 00249 ;test if buffer pointer needs to wrap around to beginning of buffer memory 00250 0007E2 0E00 00251 MOVLW HIGH (RxBuffer+RX_BUF_LEN) ;get last address of buffer 0007E4 62EA 00252 cpfseq FSR0H ;and compare with end pointer 0007E6 D005 00253 BRA PutRxBuf1 ;skip low bytes if high bytes not equal 0007E8 0E82 00254 MOVLW LOW (RxBuffer+RX_BUF_LEN) ;get last address of buffer 0007EA 62E9 00255 cpfseq FSR0L ;and compare with end pointer 0007EC D002 00256 BRA PutRxBuf1 ;go save new pointer if not at end 0007EE EE00 F072 00257 lfsr 0,RxBuffer ;point to beginning of buffer if at end 00258 0007F2 00259 PutRxBuf1: 0007F2 CFEA F060 00260 MOVFF FSR0H,RxEndPtrH ;save new EndPointer high byte 0007F6 CFE9 F061 00261 MOVFF FSR0L,RxEndPtrL ;save new EndPointer low byte 00262 ;test if buffer is full 0007FA 505E 00263 MOVF RxStartPtrH,W ;get start pointer 0007FC 6260 00264 cpfseq RxEndPtrH ;and compare with end pointer 0007FE D004 00265 BRA PutRxBuf2 ;skip low bytes if high bytes not equal 000800 505F 00266 MOVF RxStartPtrL,W ;get start pointer 000802 6261 00267 cpfseq RxEndPtrL ;and compare with end pointer 000804 D001 00268 BRA PutRxBuf2 000806 8456 00269 bsf Flags,RxBufFull ;if same then indicate buffer full 00270 000808 00271 PutRxBuf2: 000808 9656 00272 bcf Flags,RxBufEmpty ;Rx buffer cannot be empty 00080A 0012 00273 RETURN 00274 00275 ;error because attempting to store new data and the buffer is full 00276 ;can do special error handling here - this code simply ignores the byte 00277 00080C 00278 ErrRxBufFull: 00080C 0012 00279 RETURN ;no save of data because buffer is full 00280 00281 ;---------------------------------------------- 00282 ;Remove and return (in WREG) the byte at the start of the transmit buffer. 00283 00080E 00284 GetTxBuffer: 00080E B256 00285 btfsc Flags,TxBufEmpty ;check if transmit buffer empty 000810 D01C 00286 BRA ErrTxBufEmpty ;go handle error if empty 00287 000812 C05A FFEA 00288 MOVFF TxStartPtrH,FSR0H ;put StartPointer into FSR0 000816 C05B FFE9 00289 MOVFF TxStartPtrL,FSR0L ;put StartPointer into FSR0 00081A CFEE F059 00290 MOVFF POSTINC0,TempTxData ;save data from buffer 00291 00292 ;test if buffer pointer needs to wrap around to beginning of buffer memory 00293 00081E 0E00 00294 MOVLW HIGH (TxBuffer+TX_BUF_LEN) ;get last address of buffer MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 7 LOC OBJECT CODE LINE SOURCE TEXT VALUE 000820 62EA 00295 cpfseq FSR0H ;and compare with start pointer 000822 D005 00296 BRA GetTxBuf1 ;skip low bytes if high bytes not equal 000824 0E72 00297 MOVLW LOW (TxBuffer+TX_BUF_LEN) ;get last address of buffer 000826 62E9 00298 cpfseq FSR0L ;and compare with start pointer 000828 D002 00299 BRA GetTxBuf1 ;go save new pointer if at end 00082A EE00 F062 00300 lfsr 0,TxBuffer ;point to beginning of buffer if at end 00301 00082E 00302 GetTxBuf1: 00082E CFEA F05A 00303 MOVFF FSR0H,TxStartPtrH ;save new StartPointer value 000832 CFE9 F05B 00304 MOVFF FSR0L,TxStartPtrL ;save new StartPointer value 00305 00306 ;test if buffer is now empty 00307 000836 505C 00308 MOVF TxEndPtrH,W ;get end pointer 000838 625A 00309 cpfseq TxStartPtrH ;and compare with start pointer 00083A D004 00310 BRA GetTxBuf2 ;skip low bytes if high bytes not equal 00083C 505D 00311 MOVF TxEndPtrL,W ;get end pointer 00083E 625B 00312 cpfseq TxStartPtrL ;and compare with start pointer 000840 D001 00313 BRA GetTxBuf2 000842 8256 00314 bsf Flags,TxBufEmpty ;if same then indicate buffer empty 00315 000844 00316 GetTxBuf2: 000844 9056 00317 bcf Flags,TxBufFull ;Tx buffer cannot be full 000846 5059 00318 MOVF TempTxData,W ;restore data from buffer 000848 0012 00319 RETURN 00320 00321 ;error because attempting to read data from an empty buffer 00322 ;can do special error handling here - this code simply returns zero 00323 00084A 00324 ErrTxBufEmpty: 00084A 0C00 00325 retlw 0 ;buffer empty, return zero 00326 00327 ;---------------------------------------------- 00328 ;Remove and return (in WREG) the byte at the start of the receive buffer. 00329 00084C 00330 GetRxBuffer: 00084C 9A9D 00331 bcf PIE1,RCIE ;disable Rx interrupt to avoid conflict 00084E B656 00332 btfsc Flags,RxBufEmpty ;check if receive buffer empty 000850 D01D 00333 BRA ErrRxBufEmpty ;go handle error if empty 00334 000852 C05E FFEA 00335 MOVFF RxStartPtrH,FSR0H ;put StartPointer into FSR0 000856 C05F FFE9 00336 MOVFF RxStartPtrL,FSR0L ;put StartPointer into FSR0 00085A CFEE F058 00337 MOVFF POSTINC0,TempRxData ;save data from buffer 00338 00339 ;test if buffer pointer needs to wrap around to beginning of buffer memory 00340 00085E 0E00 00341 MOVLW HIGH (RxBuffer+RX_BUF_LEN) ;get last address of buffer 000860 62EA 00342 cpfseq FSR0H ;and compare with start pointer 000862 D005 00343 BRA GetRxBuf1 ;skip low bytes if high bytes not equal 000864 0E82 00344 MOVLW LOW (RxBuffer+RX_BUF_LEN) ;get last address of buffer 000866 62E9 00345 cpfseq FSR0L ;and compare with start pointer 000868 D002 00346 BRA GetRxBuf1 ;go save new pointer if at end 00086A EE00 F072 00347 lfsr 0,RxBuffer ;point to beginning of buffer if at end MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 8 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00348 00086E 00349 GetRxBuf1: 00086E CFEA F05E 00350 MOVFF FSR0H,RxStartPtrH ;save new StartPointer value 000872 CFE9 F05F 00351 MOVFF FSR0L,RxStartPtrL ;save new StartPointer value 00352 00353 ;test if buffer is now empty 00354 000876 5060 00355 MOVF RxEndPtrH,W ;get end pointer 000878 625E 00356 cpfseq RxStartPtrH ;and compare with start pointer 00087A D004 00357 BRA GetRxBuf2 ;skip low bytes if high bytes not equal 00087C 5061 00358 MOVF RxEndPtrL,W ;get end pointer 00087E 625F 00359 cpfseq RxStartPtrL ; and compare with start pointer 000880 D001 00360 BRA GetRxBuf2 000882 8656 00361 bsf Flags,RxBufEmpty ;if same then indicate buffer empty 00362 000884 00363 GetRxBuf2: 000884 9456 00364 bcf Flags,RxBufFull ;Rx buffer cannot be full 000886 5058 00365 MOVF TempRxData,W ;restore data from buffer 000888 8A9D 00366 bsf PIE1,RCIE ;enable receive interrupt 00088A 0012 00367 RETURN 00368 00369 ;error because attempting to read data from an empty buffer 00370 ;can do special error handling here - this code simply returns zero 00371 00088C 00372 ErrRxBufEmpty: 00088C 8A9D 00373 bsf PIE1,RCIE ;enable receive interrupt 00088E 0C00 00374 retlw 0 ;buffer empty, return zero 00375 00376 ;---------------------------------------------------------------------------- 00377 ;Move data from receive buffer to transmit buffer to echo the line back. 00378 000890 00379 CopyRxToTx: 000890 00380 Copy1: 000890 B656 00381 btfsc Flags,RxBufEmpty ;check if Rx buffer is empty 000892 0012 00382 RETURN ;if so then return 000894 DFDB 00383 rcall GetRxBuffer ;get data from receive buffer 000896 DF7E 00384 rcall PutTxBuffer ;put data in transmit buffer 000898 D7FB 00385 BRA Copy1 00089A 0012 00386 RETURN 00387 00388 ;---------------------------------------------------------------------------- 00389 ; MIDI Input parser 00390 ;--------------------------------------------------------- 00391 ; STATUS BYTE BINARY HEX DATA WORDS 00392 ;--------------------------------------------------------- 00393 ; CHANNEL MESSAGES 00394 ; noteon: b'1000cccc' 0x8c 2 00395 ; noteoff: b'1001cccc' 0x9c 2 00396 ; aftertouch: b'1010cccc' 0xAc 2 00397 ; control change b'1011cccc' 0xBc 2 00398 ; program change b'1100cccc' 0xCc 1 00399 ; channel pressure b'1101cccc' 0xDc 1 00400 ; pitch wheel b'1110cccc' 0xEc 2 MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 9 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00401 ; SYSTEM COMMON MESSAGES 00402 ; system exclusive b'11110000' 0xF0 x 00403 ; MTC Quarter Frame b'11110001' 0xF1 1 00404 ; Song Position Pointer b'11110010' 0xF2 2 00405 ; song select b'11110011' 0xF3 1 00406 ; reserved b'11110100' 0xF4 0 00407 ; reserved b'11110101' 0xF5 0 00408 ; tune request b'11110110' 0xF6 0 00409 ; sysex end b'11110111' 0xF7 0 00410 ; SYSTEM REALTIME MESSAGES 00411 ; midi clock b'11111000' 0xF8 0 00412 ; midi tick b'11111001' 0xF9 0 00413 ; midi start b'11111010' 0xFA 0 00414 ; midi continue b'11111011' 0xFB 0 00415 ; midi stop b'11111100' 0xFC 0 00416 ; 0xFD check wi th mima 00417 ; active sense b'11111110' 0xFE 0 00418 ; reset b'11111110' 0xFF 0 00419 ;--------------------------------------------------------- 00420 00089C 00421 PollMidiIn: 00089C B656 00422 btfsc Flags,RxBufEmpty ;check if Rx buffer is empty 00089E 0012 00423 RETURN ;if so then return 0008A0 DFD5 00424 rcall GetRxBuffer ;get data from receive buffer 0008A2 00425 MidiInParser: 0008A2 6E50 00426 MOVWF MidiInByte; 00427 #ifdef MIDITHROUGHTEST 00428 rcall PutTxBuffer; MIDI thru for test purposes 00429 return 00430 #endif 0008A4 5050 00431 MOVF MidiInByte,W; 0008A6 AE50 00432 btfss MidiInByte,7; 0008A8 D035 00433 BRA MidiInData; ; jump if it wasn't a status byte 0008AA 6E51 00434 MOVWF MidiByte0; 0008AC 00435 MidiInStatus: 00436 ; check for note on, not e off, 00437 ; aftertouch, control ch ange 0008AC AC51 00438 BTFSS MidiByte0,6; 0008AE D02E 00439 BRA MidiInStatus2words; 00440 ; check for pitch wheel 0008B0 5051 00441 MOVF MidiByte0,W 0008B2 0BF0 00442 ANDLW 0xF0 0008B4 08E0 00443 SUBLW 0xE0 0008B6 E02A 00444 BZ MidiInStatus2words 00445 ; other chennel messages : 1 data word 0008B8 5051 00446 MOVF MidiByte0,W 0008BA 0BF0 00447 ANDLW 0xF0 0008BC 08F0 00448 SUBLW 0xF0 0008BE E122 00449 BNZ MidiInStatus1word MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 10 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00450 ; check for Song positio n pointer 0008C0 5051 00451 MOVF MidiByte0,W 0008C2 08F2 00452 SUBLW 0xF2 0008C4 E023 00453 BZ MidiInStatus2words 00454 ; check for MTC quarter frame 0008C6 5051 00455 MOVF MidiByte0,W 0008C8 08F1 00456 SUBLW 0xF1 0008CA E01C 00457 BZ MidiInStatus1word 00458 ; check for Song Select 0008CC 5051 00459 MOVF MidiByte0,W 0008CE 08F3 00460 SUBLW 0xF3 0008D0 E019 00461 BZ MidiInStatus1word 00462 ; SYSTEM COMMON and SYST EM REALTIME 00463 00464 ; check for SysEx start 0008D2 5051 00465 MOVF MidiByte0,W 0008D4 08F0 00466 SUBLW 0xF0 0008D6 E044 00467 BZ MidiInSysExStart1 00468 0008D8 5051 00469 MOVF MidiByte0,W 0008DA 4AE8 00470 INFSNZ WREG 0008DC D62E 00471 BRA MidiInRTReset 0008DE 4AE8 00472 INFSNZ WREG 0008E0 D62C 00473 BRA MidiInRTActiveSense 0008E2 4AE8 00474 INFSNZ WREG 0008E4 D62A 00475 BRA MidiInRTReset 0008E6 4AE8 00476 INFSNZ WREG 0008E8 D628 00477 BRA MidiInRTStop 0008EA 4AE8 00478 INFSNZ WREG 0008EC D626 00479 BRA MidiInRTContinue 0008EE 4AE8 00480 INFSNZ WREG 0008F0 D624 00481 BRA MidiInRTStart 0008F2 4AE8 00482 INFSNZ WREG 0008F4 D622 00483 BRA MidiInRTTick 0008F6 4AE8 00484 INFSNZ WREG 0008F8 D620 00485 BRA MidiInRTClock 0008FA 4AE8 00486 INFSNZ WREG 0008FC D61E 00487 BRA MidiInSysExEnd 0008FE 4AE8 00488 INFSNZ WREG 000900 D61C 00489 BRA MidiInTuneRequest 00490 ; ignoring MidiInReservedF5, MidiInReservedF4 000902 0012 00491 RETURN 00492 000904 00493 MidiInStatus1word: 000904 6A54 00494 CLRF MidiCurData; 000906 0E01 00495 MOVLW 1; 000908 6E55 00496 MOVWF MidiNumData; 00090A 0012 00497 RETURN 00498 00090C 00499 MidiInStatus2words: MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 11 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00090C 6A54 00500 CLRF MidiCurData; 00090E 0E02 00501 MOVLW 2; 000910 6E55 00502 MOVWF MidiNumData; 000912 0012 00503 RETURN 00504 000914 00505 MidiInData: 000914 BE55 00506 BTFSC MidiNumData,7 000916 D611 00507 BRA MidiInSysExByte 000918 6654 00508 tstfsz MidiCurData; 00091A D00F 00509 BRA MidiInDataM2; 00091C 00510 MidiInDataM1: 00091C C050 F052 00511 MOVFF MidiInByte,MidiByte1; 000920 2A54 00512 INCF MidiCurData; 000922 5054 00513 MOVF MidiCurData,W; 000924 5C55 00514 SUBWF MidiNumData,W; 000926 E001 00515 BZ MidiInAction1Byte; 000928 0012 00516 RETURN; 00517 00092A 00518 MidiInAction1Byte: 00092A 6A54 00519 CLRF MidiCurData; 00092C 0ED9 00520 MOVLW 0D0h + MidiChannel; ChannelPressure 00092E 5C51 00521 SUBWF MidiByte0,0; 000930 E020 00522 BZ MidiInChannelPressure1; 000932 0EC9 00523 MOVLW 0C0h + MidiChannel; PgmChange 000934 5C51 00524 SUBWF MidiByte0,0; 000936 E01B 00525 BZ MidiInProgramChange1; 000938 0012 00526 RETURN; 00527 00093A 00528 MidiInDataM2: 00529 ; 2nd byte 00093A C050 F053 00530 MOVFF MidiInByte,MidiByte2; 00093E 6A54 00531 CLRF MidiCurData; 000940 0E99 00532 MOVLW 090h + MidiChannel; noteOn 000942 5C51 00533 SUBWF MidiByte0,0; 000944 E010 00534 BZ MidiInNoteOn1; 000946 0E89 00535 MOVLW 080h + MidiChannel; noteOff 000948 5C51 00536 SUBWF MidiByte0,0; 00094A E00F 00537 BZ MidiInNoteOff1; 00094C 0EB9 00538 MOVLW 0B0h + MidiChannel; CtrlChange 00094E 5C51 00539 SUBWF MidiByte0,0; 000950 E00D 00540 BZ MidiInCtrlChange1; 000952 0EA9 00541 MOVLW 0A0h + MidiChannel; Aftertouch 000954 5C51 00542 SUBWF MidiByte0,0; 000956 E00C 00543 BZ MidiInAfterTouch1; 000958 0EE9 00544 MOVLW 0E0h + MidiChannel; PitchWheel 00095A 5C51 00545 SUBWF MidiByte0,0; 00095C E00B 00546 BZ MidiInPitchWheel1; 00095E 0012 00547 RETURN; 00548 000960 00549 MidiInSysExStart1: 000960 0E80 00550 MOVLW 0x80 000962 6E55 00551 MOVWF MidiNumData 000964 D5EA 00552 BRA MidiInSysExStart MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 12 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00553 00554 ; proxies for a far jump 000966 00555 MidiInNoteOn1: 000966 EF9D F002 00556 GOTO MidiInNoteOn 00557 00096A 00558 MidiInNoteOff1: 00096A D5E7 00559 BRA MidiInNoteOff 00560 00096C 00561 MidiInCtrlChange1: 00096C D5CA 00562 BRA MidiInCtrlChange 00563 00096E 00564 MidiInProgramChange1: 00096E D5DE 00565 BRA MidiInProgramChange 00566 000970 00567 MidiInAfterTouch1: 000970 D5E4 00568 BRA MidiInAfterTouch 00569 000972 00570 MidiInChannelPressure1: 000972 D5E3 00571 BRA MidiInChannelPressure 00572 000974 00573 MidiInPitchWheel1: 000974 D5E2 00574 BRA MidiInPitchWheel 00575 00576 00577 00578 ; LED art 00579 000976 00580 LedGlowIn: ; takes duration on WREG 000976 6E50 00581 movwf MidiInByte 000978 6A51 00582 clrf MidiByte0; 00097A 6A52 00583 clrf MidiByte1 00097C 00584 _outerloop1: 00585 ; inner loop 00097C 5050 00586 movf MidiInByte,W; 00097E 6E53 00587 movwf MidiByte2 000980 00588 _innerloop1: 000980 00589 _ininnerloop1: 000980 5051 00590 MOVF MidiByte0,W 000982 6452 00591 CPFSGT MidiByte1 000984 808B 00592 SetErrorLed 000986 6052 00593 CPFSLT MidiByte1 000988 908B 00594 ClearErrorLed 00098A 0000 00595 nop 00098C 0000 00596 nop 00098E 0000 00597 nop 000990 0000 00598 nop 000992 0000 00599 nop 000994 0000 00600 nop 000996 0000 00601 nop 000998 3E52 00602 incfsz MidiByte1 00099A D7F2 00603 bra _ininnerloop1 00099C 2E53 00604 decfsz MidiByte2 00099E D7F0 00605 bra _innerloop1 MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 13 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0009A0 3E51 00606 incfsz MidiByte0 0009A2 D7EC 00607 bra _outerloop1 0009A4 808B 00608 SetErrorLed 0009A6 6A51 00609 clrf MidiByte0 0009A8 6A52 00610 clrf MidiByte1 0009AA 6A53 00611 clrf MidiByte2 0009AC 6A50 00612 clrf MidiInByte 0009AE 0012 00613 RETURN 00614 0009B0 00615 LedGlowOut: 0009B0 6E50 00616 movwf MidiInByte 0009B2 6A51 00617 clrf MidiByte0; 0009B4 6A52 00618 clrf MidiByte1 0009B6 00619 _outerloop2: 0009B6 5050 00620 movf MidiInByte,W; 0009B8 6E53 00621 movwf MidiByte2 0009BA 00622 _innerloop2: 0009BA 00623 _ininnerloop2: 0009BA 5051 00624 MOVF MidiByte0,W 0009BC 6452 00625 CPFSGT MidiByte1 0009BE 908B 00626 ClearErrorLed 0009C0 6052 00627 CPFSLT MidiByte1 0009C2 808B 00628 SetErrorLed 0009C4 0000 00629 nop 0009C6 0000 00630 nop 0009C8 0000 00631 nop 0009CA 0000 00632 nop 0009CC 0000 00633 nop 0009CE 0000 00634 nop 0009D0 0000 00635 nop 0009D2 3E52 00636 incfsz MidiByte1 0009D4 D7F2 00637 bra _ininnerloop2 0009D6 2E53 00638 decfsz MidiByte2 0009D8 D7F0 00639 bra _innerloop2 0009DA 3E51 00640 incfsz MidiByte0 0009DC D7EC 00641 bra _outerloop2 00642 0009DE 908B 00643 ClearErrorLed 0009E0 6A51 00644 clrf MidiByte0 0009E2 6A52 00645 clrf MidiByte1 0009E4 6A53 00646 clrf MidiByte2 0009E6 6A50 00647 clrf MidiInByte 0009E8 0012 00648 return 00022 00023 ;Configuration bits 00024 26 0A 00 00 81 0F C0 000025 CONFIG OSC = HSPLL F E0 0F 40 00026 CONFIG OSCS = OFF 00027 CONFIG PWRT = ON 00028 CONFIG BOR = ON 00029 CONFIG BORV = 27 00030 CONFIG WDT = OFF MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 14 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00031 CONFIG WDTPS = 1 00032 CONFIG CCP2MUX = OFF 00033 CONFIG STVR = ON 00034 CONFIG LVP = OFF 00035 00036 ;---------------------------------------------------------------------------- 00037 ; Variables 00038 ; memory map 00039 ;---------------------------------------------------------------------------- 00040 00041 CBLOCK 0x000 00000000 00042 WREG_TEMP ;to save WREG during interrupt 00000001 00043 STATUS_TEMP ;to save STATUS during interrupt 00000002 00044 BSR_TEMP ;to save BSR during interrupt 00000003 00045 FSR0H_TEMP ;to save FSR0H during interrupt 00000004 00046 FSR0L_TEMP ;to save FSR0L during interrupt 00000005 00047 TBLPTRH_TEMP 00000006 00048 TBLPTRL_TEMP 00000007 00049 TABLAT_TEMP 00000008 00050 FSR0H_SHADOW ;to save FSR0H during high interrupt 00000009 00051 FSR0L_SHADOW ;to save FSR0L during high interrupt 0000000A 00052 TmpM ; non-ISR scratch 0000000B 00053 TmpT ; non-ISR scratch 00054 ENDC 00055 ;---------------------------------------------------------------------------- 00056 ; end of memory map 00057 ;---------------------------------------------------------------------------- 00058 00059 00060 ;---------------------------------------------------------------------------- 00061 ;This code executes when a reset occurs. 00062 000000 00063 ORG 0x0000 ;place code at reset vector 00064 000000 D035 00065 ResetVector: bra Main ;go to beginning of program 00066 00067 ;---------------------------------------------------------------------------- 00068 ;This code executes when a high priority interrupt occurs. 00069 000008 00070 ORG 0x0008 00071 000008 00072 HighInt: 000008 00FF 00073 reset ;error if no valid interrupt so reset 00074 00075 ;---------------------------------------------------------------------------- 00076 ;This code executes when a low priority interrupt occurs. 00077 000018 00078 ORG 0x0018 00079 000018 00080 LowInt: 000018 CFD8 F001 00081 movff STATUS,STATUS_TEMP ;save STATUS register 00001C CFE8 F000 00082 movff WREG,WREG_TEMP ;save working register 000020 CFE0 F002 00083 movff BSR,BSR_TEMP ;save BSR register MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 15 LOC OBJECT CODE LINE SOURCE TEXT VALUE 000024 CFEA F003 00084 movff FSR0H,FSR0H_TEMP ;save FSR0H register 000028 CFE9 F004 00085 movff FSR0L,FSR0L_TEMP ;save FSR0L register 00002C CFF7 F005 00086 movff TBLPTRH,TBLPTRH_TEMP 000030 CFF6 F006 00087 movff TBLPTRL,TBLPTRL_TEMP 000034 CFF5 F007 00088 movff TABLAT, TABLAT_TEMP 00089 ;test other interrupt flags here 00090 00091 ; btfss PIR1,TMR1IF ;test for Timer1 interrupt flag 00092 ; bra LowInt1 00093 ; btfsc PIE1,TMR1IE ;else test if Timer3 interrupt enabled 00094 ; bra Timer1ISR ;if so, go get received data 000038 00095 LowInt1: 000038 AA9E 00096 btfss PIR1,RCIF ;test for RCIF receive interrupt flag 00003A D002 00097 bra LowInt2 ;if RCIF is not set, done with test 00003C BA9D 00098 btfsc PIE1,RCIE ;else test if Rx interrupt enabled 00003E D367 00099 bra GetData ;if so, go get received data 000040 00100 LowInt2: 000040 A89E 00101 btfss PIR1,TXIF ;test for TXIF transmit interrupt flag 000042 D002 00102 bra LowInt3 ;if TXIF is not set, done with test 000044 B89D 00103 btfsc PIE1,TXIE ;else test if Tx interrupt is enabled 000046 D35C 00104 bra PutData ;if so, go transmit data 000048 00105 LowInt3: 000048 00FF 00106 reset ;error if no valid interrupt so reset 00107 00108 ; ORG 0x0300 ;place code after midi code 00109 00110 00111 ;------------------------------------ 00112 ;End of low priority interrupt routine restores context. 00113 00004A 00114 EndLowInt: 00004A C005 FFF7 00115 movff TBLPTRH_TEMP,TBLPTRH 00004E C006 FFF6 00116 movff TBLPTRL_TEMP,TBLPTRL 000052 C007 FFF5 00117 movff TABLAT_TEMP,TABLAT 000056 C004 FFE9 00118 movff FSR0L_TEMP,FSR0L ;restore FSR0L register 00005A C003 FFEA 00119 movff FSR0H_TEMP,FSR0H ;restore FSR0H register 00005E C002 FFE0 00120 movff BSR_TEMP,BSR ;restore BSR register 000062 C000 FFE8 00121 movff WREG_TEMP,WREG ;restore working register 000066 C001 FFD8 00122 movff STATUS_TEMP,STATUS ;restore STATUS register 00006A 0010 00123 retfie 00124 00125 00126 00127 ;---------------------------------------------------------------------------- 00128 ;Main routine checks for for reception of a and then calls a routine to 00129 ; move the data to transmit back. 00130 00006C 00131 Main: 00006C 6889 00132 setf LATA ; Address strobes high 00006E 6A8A 00133 clrf LATB ; All outputs low 000070 688B 00134 setf LATC ; All outputs low 00135 000072 6A92 00136 clrf TRISA ; Config PORTA as all outputs MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 16 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00137 #ifdef ICD 00138 movlw 0xE0; 00139 movwf TRISB 00140 #else 000074 6A93 00141 clrf TRISB ; Config PORTB as all outputs 00142 #endif 000076 0E80 00143 movlw 0x80 ; 000078 6E94 00144 movwf TRISC ; Config PORTC all outputs + tristate for serial rx 00007A 0E07 00145 movlw 0x07 ; init adc 00007C 6EC1 00146 movwf ADCON1 ; init adc 00007E 6AC2 00147 clrf ADCON0 ; poweroff adc 000080 6A92 00148 clrf TRISA ; Config PORTA again as all outputs 00149 000082 ECBB F004 00150 call LedGlowIn 00151 ; call LedGlowOut defect 00152 000086 EC94 F002 00153 call MidiInCCMotorOff 00154 00155 ; init PWM 00008A 0E7E 00156 movlw 0x7E; 00008C 6ECB 00157 movwf PR2 00008E 6ABE 00158 clrf CCPR1L 000090 0E0F 00159 movlw 0x0F; 000092 6EBD 00160 movwf CCP1CON 000094 0E05 00161 movlw 0x05 000096 6ECA 00162 movwf T2CON 000098 0E7F 00163 movlw 0x7F; 00009A 6EBE 00164 movwf CCPR1L 00165 00009C EE00 F000 00166 lfsr FSR0 ,0000h 0000A0 EE10 F000 00167 lfsr FSR1 ,0000h 0000A4 DB4C 00168 rcall SetupMidi ;set up serial port and buffers 00169 0000A6 00170 MainLoop: 0000A6 EC4E F004 00171 call PollMidiIn; 0000AA D7FD 00172 bra MainLoop ;go wait for more data 00173 00174 00175 ;---------------------------------------------------------------------------- 00176 ; Timer3 setup 00177 00178 ;SetupTimer3: 00179 ; movlw 0x01 00180 ; movwf T3CON ; timer3 on, other bits cleared 00181 ; bsf IPR2,1 ; timer3 = high priority interrupt 00182 ; bsf PIE2,1 ; timer3 interrupt enable 00183 ; return 00184 00185 ;Timer3ISR: 00186 ; retfie FAST ;return and restore context 00187 000500 00188 ORG 0x500 00189 MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 17 LOC OBJECT CODE LINE SOURCE TEXT VALUE 000500 00190 MidiInCCAllNotesOff: 000500 0012 00191 RETURN 00192 000502 00193 MidiInCtrlChange: 000502 0E7B 00194 movlw 0x7B; CC NotesOff 000504 5C52 00195 subwf MidiByte1,0; 000506 E0FC 00196 bz MidiInCCAllNotesOff; 00197 000508 0E07 00198 movlw 0x07; CC Volume 00050A 5C52 00199 subwf MidiByte1,0; 00050C E004 00200 bz MidiInCCVolume; 00201 00050E 0E42 00202 movlw 0x42; CC motor control aan/uit 000510 5C52 00203 subwf MidiByte1,0; 000512 E005 00204 bz MidiInCCMotorOnOff; 00205 000514 0012 00206 return 00207 000516 00208 MidiInCCVolume: 000516 5053 00209 movf MidiByte2,W 000518 0A7F 00210 xorlw 0x7F; 00051A 6EBE 00211 movwf CCPR1L 00051C 0012 00212 return 00213 00051E 00214 MidiInCCMotorOnOff: 00051E 5053 00215 movf MidiByte2,W 000520 0B7F 00216 andlw 0x7F; 000522 E002 00217 bz MidiInCCMotorOff; 000524 968B 00218 bcf LATC,3; 000526 0012 00219 return 00220 000528 00221 MidiInCCMotorOff: 000528 868B 00222 bsf LATC,3; 00052A 0012 00223 return 00224 00052C 00225 MidiInProgramChange: 00052C 5052 00226 movf MidiByte1,W 00052E 0BF0 00227 andlw 0xF0; 000530 E103 00228 bnz irrelevantPGC; 000532 5052 00229 movf MidiByte1,W 000534 6E89 00230 movwf LATA; 000536 0012 00231 return 00232 00233 000538 00234 irrelevantPGC: 000538 0012 00235 return 00236 00053A 00237 MidiInNoteOn 00053A 00238 MidiInNoteOff 00053A 00239 MidiInChannelPressure: 00240 00241 00242 MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 18 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00053A 00243 MidiInRTReset: 00053A 00244 MidiInRTActiveSense: 00053A 00245 MidiInRTStop: 00053A 00246 MidiInRTContinue: 00053A 00247 MidiInRTStart: 00053A 00248 MidiInRTTick: 00053A 00249 MidiInRTClock: 00053A 00250 MidiInTuneRequest: 00053A 00251 MidiInAfterTouch: 00053A 00252 MidiInPitchWheel: 00053A 00253 MidiInSysExStart: 00053A 00254 MidiInSysExByte: 00053A 00255 MidiInSysExEnd: 00053A 0012 00256 RETURN 00257 00258 00259 END MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 19 SYMBOL TABLE LABEL VALUE A 00000000 ACCESS 00000000 ACKDT 00000005 ACKEN 00000004 ACKSTAT 00000006 ADCON0 00000FC2 ADCON1 00000FC1 ADCS0 00000006 ADCS1 00000007 ADCS2 00000006 ADDEN 00000003 ADFM 00000007 ADIE 00000006 ADIF 00000006 ADIP 00000006 ADON 00000000 ADRESH 00000FC4 ADRESL 00000FC3 AN0 00000000 AN1 00000001 AN2 00000002 AN3 00000003 AN4 00000005 BANKED 00000001 BCLIE 00000003 BCLIF 00000003 BCLIP 00000003 BF 00000000 BOR 00000000 BRGH 00000002 BSR 00000FE0 BSR_TEMP 00000002 C 00000000 CCP1 00000002 CCP1CON 00000FBD CCP1IE 00000002 CCP1IF 00000002 CCP1IP 00000002 CCP1M0 00000000 CCP1M1 00000001 CCP1M2 00000002 CCP1M3 00000003 CCP1X 00000005 CCP1Y 00000004 CCP2 00000001 CCP2A 00000003 CCP2CON 00000FBA CCP2IE 00000000 CCP2IF 00000000 CCP2IP 00000000 CCP2M0 00000000 CCP2M1 00000001 CCP2M2 00000002 MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 20 SYMBOL TABLE LABEL VALUE CCP2M3 00000003 CCP2X 00000005 CCP2Y 00000004 CCPR1H 00000FBF CCPR1L 00000FBE CCPR2H 00000FBC CCPR2L 00000FBB CFGS 00000006 CHS0 00000003 CHS1 00000004 CHS2 00000005 CK 00000006 CKE 00000006 CKP 00000004 CLKO 00000006 CREN 00000004 CSRC 00000007 ClearErrorLed BCF ErrorLed Copy1 00000890 CopyRxToTx 00000890 D 00000005 DATA_ADDRESS 00000005 DC 00000001 DC1B0 00000004 DC1B1 00000005 DC2B0 00000004 DC2B1 00000005 DDRA TRISA DDRB TRISB DDRC TRISC DONE 00000002 D_A 00000005 EEADR 00000FA9 EECON1 00000FA6 EECON2 00000FA7 EEDATA 00000FA8 EEIE 00000004 EEIF 00000004 EEIP 00000004 EEPGD 00000007 EndLowInt 0000004A ErrFERR 0000072A ErrOERR 00000720 ErrRxBufEmpty 0000088C ErrRxBufFull 0000080C ErrRxOver 00000736 ErrTxBufEmpty 0000084A ErrTxBufFull 000007D0 ErrorLed LATC, 0 FAST 00000001 FERR 00000002 FREE 00000004 FSR0 00000000 MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 21 SYMBOL TABLE LABEL VALUE FSR0H 00000FEA FSR0H_SHADOW 00000008 FSR0H_TEMP 00000003 FSR0L 00000FE9 FSR0L_SHADOW 00000009 FSR0L_TEMP 00000004 FSR1 00000001 FSR1H 00000FE2 FSR1L 00000FE1 FSR2 00000002 FSR2H 00000FDA FSR2L 00000FD9 Flags 00000056 GCEN 00000007 GIE 00000007 GIEH 00000007 GIEL 00000006 GO 00000002 GO_DONE 00000002 GetData 0000070E GetRxBuf1 0000086E GetRxBuf2 00000884 GetRxBuffer 0000084C GetTxBuf1 0000082E GetTxBuf2 00000844 GetTxBuffer 0000080E HighInt 00000008 I2C_DAT 00000005 I2C_READ 00000002 I2C_START 00000003 I2C_STOP 00000004 INDF0 00000FEF INDF1 00000FE7 INDF2 00000FDF INT0 00000000 INT0E 00000004 INT0F 00000001 INT0IE 00000004 INT0IF 00000001 INT1 00000001 INT1IE 00000003 INT1IF 00000000 INT1IP 00000006 INT2 00000002 INT2IE 00000004 INT2IF 00000001 INT2IP 00000007 INTCON 00000FF2 INTCON1 00000FF2 INTCON2 00000FF1 INTCON3 00000FF0 INTEDG0 00000006 INTEDG1 00000005 MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 22 SYMBOL TABLE LABEL VALUE INTEDG2 00000004 IPEN 00000007 IPR1 00000F9F IPR2 00000FA2 IRVST 00000005 InitRxBuffer 00000782 InitTxBuffer 00000770 LATA 00000F89 LATB 00000F8A LATC 00000F8B LVDCON 00000FD2 LVDEN 00000004 LVDIE 00000002 LVDIF 00000002 LVDIN 00000005 LVDIP 00000002 LVDL0 00000000 LVDL1 00000001 LVDL2 00000002 LVDL3 00000003 LedGlowIn 00000976 LedGlowOut 000009B0 LowInt 00000018 LowInt1 00000038 LowInt2 00000040 LowInt3 00000048 Main 0000006C MainLoop 000000A6 MidiByte0 00000051 MidiByte1 00000052 MidiByte2 00000053 MidiChannel 9 MidiCurData 00000054 MidiInAction1Byte 0000092A MidiInAfterTouch 0000053A MidiInAfterTouch1 00000970 MidiInByte 00000050 MidiInCCAllNotesOff 00000500 MidiInCCMotorOff 00000528 MidiInCCMotorOnOff 0000051E MidiInCCVolume 00000516 MidiInChannelPressure 0000053A MidiInChannelPressure1 00000972 MidiInCtrlChange 00000502 MidiInCtrlChange1 0000096C MidiInData 00000914 MidiInDataM1 0000091C MidiInDataM2 0000093A MidiInNoteOff 0000053A MidiInNoteOff1 0000096A MidiInNoteOn 0000053A MidiInNoteOn1 00000966 MidiInParser 000008A2 MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 23 SYMBOL TABLE LABEL VALUE MidiInPitchWheel 0000053A MidiInPitchWheel1 00000974 MidiInProgramChange 0000052C MidiInProgramChange1 0000096E MidiInRTActiveSense 0000053A MidiInRTClock 0000053A MidiInRTContinue 0000053A MidiInRTReset 0000053A MidiInRTStart 0000053A MidiInRTStop 0000053A MidiInRTTick 0000053A MidiInStatus 000008AC MidiInStatus1word 00000904 MidiInStatus2words 0000090C MidiInSysExByte 0000053A MidiInSysExEnd 0000053A MidiInSysExStart 0000053A MidiInSysExStart1 00000960 MidiInTuneRequest 0000053A MidiNumData 00000055 N 00000004 NOT_A 00000005 NOT_ADDRESS 00000005 NOT_BOR 00000000 NOT_DONE 00000002 NOT_PD 00000002 NOT_POR 00000001 NOT_RBPU 00000007 NOT_RC8 00000006 NOT_RI 00000004 NOT_T1SYNC 00000002 NOT_T3SYNC 00000002 NOT_TO 00000003 NOT_TX8 00000006 NOT_W 00000002 NOT_WRITE 00000002 OERR 00000001 OSC2 00000006 OSCCON 00000FD3 OV 00000003 P 00000004 PCFG0 00000000 PCFG1 00000001 PCFG2 00000002 PCFG3 00000003 PCL 00000FF9 PCLATH 00000FFA PCLATU 00000FFB PD 00000002 PEIE 00000006 PEN 00000002 PIE1 00000F9D PIE2 00000FA0 MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 24 SYMBOL TABLE LABEL VALUE PIR1 00000F9E PIR2 00000FA1 PLUSW0 00000FEB PLUSW1 00000FE3 PLUSW2 00000FDB POR 00000001 PORTA 00000F80 PORTB 00000F81 PORTC 00000F82 POSTDEC0 00000FED POSTDEC1 00000FE5 POSTDEC2 00000FDD POSTINC0 00000FEE POSTINC1 00000FE6 POSTINC2 00000FDE PR2 00000FCB PREINC0 00000FEC PREINC1 00000FE4 PREINC2 00000FDC PRODH 00000FF4 PRODL 00000FF3 PSA 00000003 PSPIE 00000007 PSPIF 00000007 PSPIP 00000007 PollMidiIn 0000089C PutDat1 00000708 PutData 00000700 PutRxBuf1 000007F2 PutRxBuf2 00000808 PutRxBuffer 000007D4 PutTxBuf1 000007B4 PutTxBuf2 000007CA PutTxBuffer 00000794 R 00000002 RA0 00000000 RA1 00000001 RA2 00000002 RA3 00000003 RA4 00000004 RA5 00000005 RA6 00000006 RB0 00000000 RB1 00000001 RB2 00000002 RB3 00000003 RB4 00000004 RB5 00000005 RB6 00000006 RB7 00000007 RBIE 00000003 RBIF 00000000 RBIP 00000000 MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 25 SYMBOL TABLE LABEL VALUE RBPU 00000007 RC0 00000000 RC1 00000001 RC2 00000002 RC3 00000003 RC4 00000004 RC5 00000005 RC6 00000006 RC7 00000007 RC8_9 00000006 RC9 00000006 RCD8 00000000 RCEN 00000003 RCIE 00000005 RCIF 00000005 RCIP 00000005 RCON 00000FD0 RCREG 00000FAE RCSTA 00000FAB RD 00000000 RD16 00000007 READ_WRITE 00000002 RI 00000004 RSEN 00000001 RX 00000007 RX9 00000006 RX9D 00000000 RX_BUF_LEN 00000010 R_W 00000002 ResetVector 00000000 RxBufEmpty 00000003 RxBufFull 00000002 RxBuffer 00000072 RxEndPtrH 00000060 RxEndPtrL 00000061 RxStartPtrH 0000005E RxStartPtrL 0000005F S 00000003 SCK 00000003 SCL 00000003 SCS 00000000 SDA 00000004 SDI 00000004 SDO 00000005 SEN 00000000 SMP 00000007 SPBRG 00000FAF SPBRG_VAL 0000004F SPEN 00000007 SREN 00000005 SS 00000005 SSPADD 00000FC8 SSPBUF 00000FC9 MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 26 SYMBOL TABLE LABEL VALUE SSPCON1 00000FC6 SSPCON2 00000FC5 SSPEN 00000005 SSPIE 00000003 SSPIF 00000003 SSPIP 00000003 SSPM0 00000000 SSPM1 00000001 SSPM2 00000002 SSPM3 00000003 SSPOV 00000006 SSPSTAT 00000FC7 STATUS 00000FD8 STATUS_TEMP 00000001 STKFUL 00000007 STKPTR 00000FFC STKUNF 00000006 SWDTE 00000000 SWDTEN 00000000 SYNC 00000004 SetErrorLed BSF ErrorLed SetupMidi 0000073E T08BIT 00000006 T0CKI 00000004 T0CON 00000FD5 T0CS 00000005 T0IE 00000005 T0IF 00000002 T0IP 00000002 T0PS0 00000000 T0PS1 00000001 T0PS2 00000002 T0SE 00000004 T1CKI 00000000 T1CKPS0 00000004 T1CKPS1 00000005 T1CON 00000FCD T1INSYNC 00000002 T1OSCEN 00000003 T1OSI 00000001 T1OSO 00000000 T1SYNC 00000002 T2CKPS0 00000000 T2CKPS1 00000001 T2CON 00000FCA T3CCP1 00000003 T3CCP2 00000006 T3CKPS0 00000004 T3CKPS1 00000005 T3CON 00000FB1 T3INSYNC 00000002 T3SYNC 00000002 TABLAT 00000FF5 MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 27 SYMBOL TABLE LABEL VALUE TABLAT_TEMP 00000007 TBLPTRH 00000FF7 TBLPTRH_TEMP 00000005 TBLPTRL 00000FF6 TBLPTRL_TEMP 00000006 TBLPTRU 00000FF8 TMR0H 00000FD7 TMR0IE 00000005 TMR0IF 00000002 TMR0IP 00000002 TMR0L 00000FD6 TMR0ON 00000007 TMR1CS 00000001 TMR1H 00000FCF TMR1IE 00000000 TMR1IF 00000000 TMR1IP 00000000 TMR1L 00000FCE TMR1ON 00000000 TMR2 00000FCC TMR2IE 00000001 TMR2IF 00000001 TMR2IP 00000001 TMR2ON 00000002 TMR3CS 00000001 TMR3H 00000FB3 TMR3IE 00000001 TMR3IF 00000001 TMR3IP 00000001 TMR3L 00000FB2 TMR3ON 00000000 TO 00000003 TOSH 00000FFE TOSL 00000FFD TOSU 00000FFF TOUTPS0 00000003 TOUTPS1 00000004 TOUTPS2 00000005 TOUTPS3 00000006 TRISA 00000F92 TRISB 00000F93 TRISC 00000F94 TRMT 00000001 TX 00000006 TX8_9 00000006 TX9 00000006 TX9D 00000000 TXD8 00000000 TXEN 00000005 TXIE 00000004 TXIF 00000004 TXIP 00000004 TXREG 00000FAD MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 28 SYMBOL TABLE LABEL VALUE TXSTA 00000FAC TX_BUF_LEN 00000010 TempData 00000057 TempRxData 00000058 TempTxData 00000059 TmpM 0000000A TmpT 0000000B TxBufEmpty 00000001 TxBufFull 00000000 TxBuffer 00000062 TxEndPtrH 0000005C TxEndPtrL 0000005D TxStartPtrH 0000005A TxStartPtrL 0000005B UA 00000001 VREFM 00000002 VREFP 00000003 W 00000000 WCOL 00000007 WDTCON 00000FD1 WR 00000001 WREG 00000FE8 WREG_TEMP 00000000 WREN 00000002 WRERR 00000003 Z 00000002 _BORV_20_2L 000000FF _BORV_27_2L 000000FB _BORV_42_2L 000000F7 _BORV_45_2L 000000F3 _BOR_OFF_2L 000000FD _BOR_ON_2L 000000FF _CCP2MX_OFF_3H 000000FE _CCP2MX_ON_3H 000000FF _CONFIG1H 00300001 _CONFIG1L 00300000 _CONFIG2H 00300003 _CONFIG2L 00300002 _CONFIG3H 00300005 _CONFIG3L 00300004 _CONFIG4H 00300007 _CONFIG4L 00300006 _CONFIG5H 00300009 _CONFIG5L 00300008 _CONFIG6H 0030000B _CONFIG6L 0030000A _CONFIG7H 0030000D _CONFIG7L 0030000C _CP0_OFF_5L 000000FF _CP0_ON_5L 000000FE _CP1_OFF_5L 000000FF _CP1_ON_5L 000000FD _CP2_OFF_5L 000000FF MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 29 SYMBOL TABLE LABEL VALUE _CP2_ON_5L 000000FB _CP3_OFF_5L 000000FF _CP3_ON_5L 000000F7 _CPB_OFF_5H 000000FF _CPB_ON_5H 000000BF _CPD_OFF_5H 000000FF _CPD_ON_5H 0000007F _DEBUG_OFF_4L 000000FF _DEBUG_ON_4L 0000007F _DEVID1 003FFFFE _DEVID2 003FFFFF _EBTR0_OFF_7L 000000FF _EBTR0_ON_7L 000000FE _EBTR1_OFF_7L 000000FF _EBTR1_ON_7L 000000FD _EBTR2_OFF_7L 000000FF _EBTR2_ON_7L 000000FB _EBTR3_OFF_7L 000000FF _EBTR3_ON_7L 000000F7 _EBTRB_OFF_7H 000000FF _EBTRB_ON_7H 000000BF _ECIO_OSC_1H 000000FD _EC_OSC_1H 000000FC _HSPLL_OSC_1H 000000FE _HS_OSC_1H 000000FA _IDLOC0 00200000 _IDLOC1 00200001 _IDLOC2 00200002 _IDLOC3 00200003 _IDLOC4 00200004 _IDLOC5 00200005 _IDLOC6 00200006 _IDLOC7 00200007 _LP_OSC_1H 000000F8 _LVP_OFF_4L 000000FB _LVP_ON_4L 000000FF _OSCS_OFF_1H 000000FF _OSCS_ON_1H 000000DF _PWRT_OFF_2L 000000FF _PWRT_ON_2L 000000FE _RCIO_OSC_1H 000000FF _RC_OSC_1H 000000FB _STVR_OFF_4L 000000FE _STVR_ON_4L 000000FF _WDTPS_128_2H 000000FF _WDTPS_16_2H 000000F9 _WDTPS_1_2H 000000F1 _WDTPS_2_2H 000000F3 _WDTPS_32_2H 000000FB _WDTPS_4_2H 000000F5 _WDTPS_64_2H 000000FD _WDTPS_8_2H 000000F7 _WDT_OFF_2H 000000FE MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 30 SYMBOL TABLE LABEL VALUE _WDT_ON_2H 000000FF _WRT0_OFF_6L 000000FF _WRT0_ON_6L 000000FE _WRT1_OFF_6L 000000FF _WRT1_ON_6L 000000FD _WRT2_OFF_6L 000000FF _WRT2_ON_6L 000000FB _WRT3_OFF_6L 000000FF _WRT3_ON_6L 000000F7 _WRTB_OFF_6H 000000FF _WRTB_ON_6H 000000BF _WRTC_OFF_6H 000000FF _WRTC_ON_6H 000000DF _WRTD_OFF_6H 000000FF _WRTD_ON_6H 0000007F _XT_OSC_1H 000000F9 __18F252 00000001 _ininnerloop1 00000980 _ininnerloop2 000009BA _innerloop1 00000980 _innerloop2 000009BA _outerloop1 0000097C _outerloop2 000009B6 irrelevantPGC 00000538 MEMORY USAGE MAP ('X' = Used, '-' = Unused) 0000 : XX------XX------ --------XXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0040 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0080 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXX---- ---------------- 0500 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXX---- 0700 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0740 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0780 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 07C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0800 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0840 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0880 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 08C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0900 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0940 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0980 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 09C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXX------ ---------------- 0000 : -XXX-XX-XXXXXX-- ---------------- ---------------- ---------------- All other memory blocks unused. Program Memory Bytes Used: 969 Program Memory Bytes Free: 31799 MPASM 5.00 HARMA1.ASM 12-2-2005 18:15:05 PAGE 31 Errors : 0 Warnings : 0 reported, 0 suppressed Messages : 0 reported, 0 suppressed