gpasm-0.11.8 alpha midibyte.asm6-2-2004 13:59:27 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 3FFB 00012 __config _WDT_OFF 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' 00000019 00022 c equ H'19' 00000018 00023 random equ 0x18 00024 00025 00026 ; Program 00027 0000 00028 org 0 ; start at address 0 00029 00030 0000 00031 start: 0000 3000 00032 movlw B'00000000' Warning [224] : Use of this instruction is not recommended. 0001 0065 00033 tris PORTA ; init port A as output 00034 0002 1505 00035 bsf PORTA, 0x02 ; init midi out pin state 00036 0003 0199 00037 clrf c 00038 0004 00039 mainloop: 00040 0004 2048 00041 call rand 00042 0005 3090 00043 movlw 0x90 ; note on, channel 1 0006 009D 00044 movwf xmit 0007 201A 00045 call sendmidi 00046 0008 0818 00047 movf random,w 0009 009D 00048 movwf xmit 000A 201A 00049 call sendmidi 00050 gpasm-0.11.8 alpha midibyte.asm6-2-2004 13:59:27 PAGE 2 LOC OBJECT CODE LINE SOURCE TEXT VALUE 000B 307F 00051 movlw 0x7F ; velocity 127 000C 009D 00052 movwf xmit 000D 201A 00053 call sendmidi 00054 000E 203B 00055 call secdelay 00056 000F 3080 00057 movlw 0x80 ; note off, channel 1 0010 009D 00058 movwf xmit 0011 201A 00059 call sendmidi 00060 0012 0818 00061 movf random,w 0013 009D 00062 movwf xmit 0014 201A 00063 call sendmidi 00064 0015 307F 00065 movlw 0x7F ; velocity 127 0016 009D 00066 movwf xmit 0017 201A 00067 call sendmidi 00068 0018 203B 00069 call secdelay 00070 0019 2804 00071 goto mainloop 00072 00073 ; sendmidi transmits one midi byte on RA2 00074 ; at 10mhz there are 80 instructions per midi bit 00075 ; xmit contains byte to send 00076 ; * this should be rewritten to support variable delays for 00077 ; * different clock speeds 00078 001A 00079 sendmidi: 00080 001A 1105 00081 startb: bcf PORTA, 0x02 ; start bit 00082 001B 3018 00083 movlw D'24' ; delay 73 clocks: 2 + (23 * 3 + 1 * 2) 001C 009F 00084 movwf temp ; | 001D 0B9F 00085 loop1: decfsz temp,f ; | 001E 281D 00086 goto loop1 ; end delay 00087 001F 3008 00088 movlw D'8' 0020 009B 00089 movwf j 00090 0021 00091 sendloop: ; executes 5 instuctions before setting bit 0021 0C9D 00092 rrf xmit,f 0022 1803 00093 btfsc STATUS, C 0023 2827 00094 goto send1 00095 ; remember midi bits are opposite from our representation 0024 0000 00096 send0: nop 0025 1105 00097 bcf PORTA, 0x02 ;send a 0 bit 0026 282A 00098 goto endloop 00099 0027 1505 00100 send1: bsf PORTA, 0x02 ;send a 1 bit 0028 0000 00101 nop 0029 0000 00102 nop 00103 002A 00104 endloop: ; gpasm-0.11.8 alpha midibyte.asm6-2-2004 13:59:27 PAGE 3 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00105 002A 3017 00106 movlw D'23' ;delay 70 instructions 2 + (22 * 3 + 1 * 2) 002B 009F 00107 movwf temp ; | 002C 0B9F 00108 loop2: decfsz temp,f ; | 002D 282C 00109 goto loop2 ; end delay 00110 002E 0B9B 00111 decfsz j,f ; 002F 2821 00112 goto sendloop 00113 0030 00114 stopb: 0030 0000 00115 nop 0031 0000 00116 nop 0032 0000 00117 nop 0033 0000 00118 nop 0034 0000 00119 nop 0035 1505 00120 bsf PORTA, 0x02 ; stop bit 0036 301A 00121 movlw D'26' ; delay 79 clocks: 2 + (25 * 3 + 1 * 2) 0037 009F 00122 movwf temp ; | 0038 0B9F 00123 loop3: decfsz temp,f ; | 0039 2838 00124 goto loop3 ; end delay 00125 003A 0008 00126 return 00127 00128 ; secdelay delays for one second ( 2500000 instructions ) 00129 ; kloop = (2 + 254 * 3 + 1 * 2) = 766 00130 ; jloop = 2 + kloop * 255 + (3 * 254 + 1 * 2) = 196096 00131 ; iloop = 2 + jloop * 13 + (3*254 + 1*2) = 2550014 = 1.02 seconds 00132 ; x = 003B 00133 secdelay: 003B 300D 00134 movlw D'13' 003C 009C 00135 movwf i 003D 30FF 00136 iloop: movlw D'255' 003E 009B 00137 movwf j 003F 30FF 00138 jloop: movlw D'255' 0040 009A 00139 movwf k 0041 0B9A 00140 kloop: decfsz k,f 0042 2841 00141 goto kloop 0043 0B9B 00142 decfsz j,f 0044 283F 00143 goto jloop 0045 0B9C 00144 decfsz i,f 0046 283D 00145 goto iloop 0047 0008 00146 return 00147 00148 00149 ;--------------------------------------------------------- 00150 ; dodgy 8 bit random 00151 0048 00152 rand: 0048 3001 00153 movlw 0x01 0049 0798 00154 addwf random,f 004A 1003 00155 clrc 004B 0D98 00156 rlf random,f 004C 1803 00157 skpnc 004D 0698 00158 xorwf random,f gpasm-0.11.8 alpha midibyte.asm6-2-2004 13:59:27 PAGE 4 LOC OBJECT CODE LINE SOURCE TEXT VALUE 004E 3400 00159 retlw 0 00160 00161 gpasm-0.11.8 alpha midibyte.asm6-2-2004 13:59:27 PAGE 5 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 midibyte.asm6-2-2004 13:59:27 PAGE 6 LOC OBJECT CODE LINE SOURCE TEXT VALUE _RC_OSC 00003FFF _WDT_OFF 00003FFB _WDT_ON 00003FFF _XT_OSC 00003FFD __16F84 00000001 c 00000019 endloop 0000002A i 0000001C iloop 0000003D j 0000001B jloop 0000003F k 0000001A kloop 00000041 loop1 0000001D loop2 0000002C loop3 00000038 mainloop 00000004 rand 00000048 random 00000018 secdelay 0000003B send0 00000024 send1 00000027 sendloop 00000021 sendmidi 0000001A start 00000000 startb 0000001A stopb 00000030 temp 0000001F xmit 0000001D MEMORY USAGE MAP ('X' = Used, '-' = Unused) 0000 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0040 : XXXXXXXXXXXXXXX- ---------------- ---------------- ---------------- 2000 : -------X-------- ---------------- ---------------- ---------------- All other memory blocks unused. Program Memory Words Used: 80 Errors : 0 Warnings : 1 reported, 0 suppressed Messages : 0 reported, 0 suppressed