gpasm-0.11.8 alpha midisend.asm5-16-2004 09:26:13 PAGE 1 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00001 ; File MIDISEND.ASM 00002 ; Assembly code for a 10MHz PIC16F84 microcontroller 00003 ; 00004 ; Description: Send a midi message once every second 00005 ; Author: Ross Bencina 00006 ; Last Modified: 25 / 8 / 99 00007 00008 ; 00009 ; CPU configuration 00010 processor 16f84 00011 include 00001 LIST 00002 ; P16F84.INC Standard Header File, Version 2.00 Microchip Technology, Inc. 00136 LIST 002007 3FF2 00012 __config _HS_OSC & _WDT_OFF & _PWRTE_ON 00013 00014 ; variables 00015 00016 0000001F 00017 temp equ H'1F' 0000001D 00018 xmit equ H'1D' 0000001C 00019 i equ H'1C' 0000001B 00020 j equ H'1B' 0000001A 00021 k equ H'1A' 00022 00023 00024 ; Program 00025 0000 00026 org 0 ; start at address 0 00027 00028 0000 00029 start: 0000 3000 00030 movlw B'00000000' Warning [224] : Use of this instruction is not recommended. 0001 0065 00031 tris PORTA ; init port A as output 00032 0002 1505 00033 bsf PORTA, 0x02 ; init midi out pin state 00034 0003 00035 mainloop: 00036 0003 2039 00037 call secdelay 00038 0004 3090 00039 movlw 0x90 ; note on, channel 1 0005 009D 00040 movwf xmit 0006 2018 00041 call sendmidi 00042 0007 303C 00043 movlw 0x3C ; middle C 0008 009D 00044 movwf xmit 0009 2018 00045 call sendmidi 00046 000A 307F 00047 movlw 0x7F ; velocity 127 000B 009D 00048 movwf xmit 000C 2018 00049 call sendmidi 00050 gpasm-0.11.8 alpha midisend.asm5-16-2004 09:26:13 PAGE 2 LOC OBJECT CODE LINE SOURCE TEXT VALUE 000D 2039 00051 call secdelay 00052 000E 3080 00053 movlw 0x80 ; note off, channel 1 000F 009D 00054 movwf xmit 0010 2018 00055 call sendmidi 00056 0011 303C 00057 movlw 0x3C ; middle C 0012 009D 00058 movwf xmit 0013 2018 00059 call sendmidi 00060 0014 307F 00061 movlw 0x7F ; velocity 127 0015 009D 00062 movwf xmit 0016 2018 00063 call sendmidi 00064 0017 2803 00065 goto mainloop 00066 00067 ; sendmidi transmits one midi byte on RA2 00068 ; at 10mhz there are 80 instructions per midi bit 00069 ; xmit contains byte to send 00070 ; * this should be rewritten to support variable delays for 00071 ; * different clock speeds 00072 0018 00073 sendmidi: 00074 0018 1105 00075 startb: bcf PORTA, 0x02 ; start bit 00076 0019 3018 00077 movlw D'24' ; delay 73 clocks: 2 + (23 * 3 + 1 * 2) 001A 009F 00078 movwf temp ; | 001B 0B9F 00079 loop1: decfsz temp,f ; | 001C 281B 00080 goto loop1 ; end delay 00081 001D 3008 00082 movlw D'8' 001E 009B 00083 movwf j 00084 001F 00085 sendloop: ; executes 5 instuctions before setting bit 001F 0C9D 00086 rrf xmit,f 0020 1803 00087 btfsc STATUS, C 0021 2825 00088 goto send1 00089 ; remember midi bits are opposite from our representation 0022 0000 00090 send0: nop 0023 1105 00091 bcf PORTA, 0x02 ;send a 0 bit 0024 2828 00092 goto endloop 00093 0025 1505 00094 send1: bsf PORTA, 0x02 ;send a 1 bit 0026 0000 00095 nop 0027 0000 00096 nop 00097 0028 00098 endloop: ; 00099 0028 3017 00100 movlw D'23' ;delay 70 instructions 2 + (22 * 3 + 1 * 2) 0029 009F 00101 movwf temp ; | 002A 0B9F 00102 loop2: decfsz temp,f ; | 002B 282A 00103 goto loop2 ; end delay 00104 gpasm-0.11.8 alpha midisend.asm5-16-2004 09:26:13 PAGE 3 LOC OBJECT CODE LINE SOURCE TEXT VALUE 002C 0B9B 00105 decfsz j,f ; 002D 281F 00106 goto sendloop 00107 002E 00108 stopb: 002E 0000 00109 nop 002F 0000 00110 nop 0030 0000 00111 nop 0031 0000 00112 nop 0032 0000 00113 nop 0033 1505 00114 bsf PORTA, 0x02 ; stop bit 0034 301A 00115 movlw D'26' ; delay 79 clocks: 2 + (25 * 3 + 1 * 2) 0035 009F 00116 movwf temp ; | 0036 0B9F 00117 loop3: decfsz temp,f ; | 0037 2836 00118 goto loop3 ; end delay 00119 0038 0008 00120 return 00121 00122 ; secdelay delays for one second ( 2500000 instructions ) 00123 ; kloop = (2 + 254 * 3 + 1 * 2) = 766 00124 ; jloop = 2 + kloop * 255 + (3 * 254 + 1 * 2) = 196096 00125 ; iloop = 2 + jloop * 13 + (3*254 + 1*2) = 2550014 = 1.02 seconds 00126 ; x = 0039 00127 secdelay: 0039 300D 00128 movlw D'13' 003A 009C 00129 movwf i 003B 30FF 00130 iloop: movlw D'255' 003C 009B 00131 movwf j 003D 30FF 00132 jloop: movlw D'255' 003E 009A 00133 movwf k 003F 0B9A 00134 kloop: decfsz k,f 0040 283F 00135 goto kloop 0041 0B9B 00136 decfsz j,f 0042 283D 00137 goto jloop 0043 0B9C 00138 decfsz i,f 0044 283B 00139 goto iloop 0045 0008 00140 return 00141 gpasm-0.11.8 alpha midisend.asm5-16-2004 09:26:13 PAGE 4 SYMBOL TABLE LABEL VALUE C 00000000 DC 00000001 EEADR 00000009 EECON1 00000088 EECON2 00000089 EEDATA 00000008 EEIE 00000006 EEIF 00000004 F 00000001 FSR 00000004 GIE 00000007 INDF 00000000 INTCON 0000000B INTE 00000004 INTEDG 00000006 INTF 00000001 IRP 00000007 NOT_PD 00000003 NOT_RBPU 00000007 NOT_TO 00000004 OPTION_REG 00000081 PCL 00000002 PCLATH 0000000A PORTA 00000005 PORTB 00000006 PS0 00000000 PS1 00000001 PS2 00000002 PSA 00000003 RBIE 00000003 RBIF 00000000 RD 00000000 RP0 00000005 RP1 00000006 STATUS 00000003 T0CS 00000005 T0IE 00000005 T0IF 00000002 T0SE 00000004 TMR0 00000001 TRISA 00000085 TRISB 00000086 W 00000000 WR 00000001 WREN 00000002 WRERR 00000003 Z 00000002 _CP_OFF 00003FFF _CP_ON 0000000F _HS_OSC 00003FFE _LP_OSC 00003FFC _PWRTE_OFF 00003FFF _PWRTE_ON 00003FF7 gpasm-0.11.8 alpha midisend.asm5-16-2004 09:26:13 PAGE 5 LOC OBJECT CODE LINE SOURCE TEXT VALUE _RC_OSC 00003FFF _WDT_OFF 00003FFB _WDT_ON 00003FFF _XT_OSC 00003FFD __16F84 00000001 endloop 00000028 i 0000001C iloop 0000003B j 0000001B jloop 0000003D k 0000001A kloop 0000003F loop1 0000001B loop2 0000002A loop3 00000036 mainloop 00000003 secdelay 00000039 send0 00000022 send1 00000025 sendloop 0000001F sendmidi 00000018 start 00000000 startb 00000018 stopb 0000002E temp 0000001F xmit 0000001D MEMORY USAGE MAP ('X' = Used, '-' = Unused) 0000 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0040 : XXXXXX---------- ---------------- ---------------- ---------------- 2000 : -------X-------- ---------------- ---------------- ---------------- All other memory blocks unused. Program Memory Words Used: 71 Errors : 0 Warnings : 1 reported, 0 suppressed Messages : 0 reported, 0 suppressed