gpasm-0.11.8 alpha logimidi1.asm1-9-2004 06:07:30 PAGE 1 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00001 ; nebogeo corporation ltd 2004 00002 00003 ; CPU configuration 00004 processor 16f84 00005 include 00001 LIST 00002 ; P16F84.INC Standard Header File, Version 2.00 Microchip Technology, Inc. 00136 LIST 002007 3FF2 00006 __config _HS_OSC & _WDT_OFF & _PWRTE_ON 00007 0000001F 00008 temp equ H'1F' 0000001D 00009 xmit equ H'1D' 0000001C 00010 i equ H'1C' 0000001B 00011 j equ H'1B' 0000001A 00012 k equ H'1A' 00013 00000020 00014 state equ H'20' ; state of the pins 00000021 00015 note equ H'21' ; current note, offset from root 00000022 00016 root equ H'22' ; root note 00000023 00017 pin equ H'23' ; current pin for testing 00000024 00018 chktst equ H'24' ; value to bit check 00000025 00019 chkbit equ H'25' ; bit to check in checkbit func 00000026 00020 setbyte equ H'26' ; byte that gets set 00021 00022 #define NUM_NOTES 5 ; number of notes in the sequence 00023 0000 00024 org 0 ; start at address 0 00025 0000 00026 start: 0000 3000 00027 movlw B'00000000' Warning [224] : Use of this instruction is not recommended. 0001 0065 00028 tris PORTA ; init port A as output 0002 30FF 00029 movlw B'11111111' Warning [224] : Use of this instruction is not recommended. 0003 0066 00030 tris PORTB ; init port B as input 0004 1505 00031 bsf PORTA, 0x02 ; init midi out pin state 0005 01A0 00032 clrf state ; init state 0006 3005 00033 movlw NUM_NOTES 0007 00A1 00034 movwf note ; init start note 0008 303C 00035 movlw 0x3C 0009 00A2 00036 movwf root ; set root to middle C 00037 000A 00038 mainloop: 00039 ;call delay 00040 ;movlw B'00000001' ; checking pin one only for now 00041 ;movwf pin 00042 ;call checkinput 00043 00044 ;movlw H'3' 00045 ;movwf chkbit 00046 ;movlw B'00000100' 00047 ;movwf chktmp 00048 ;call checkbit 00049 gpasm-0.11.8 alpha logimidi1.asm1-9-2004 06:07:30 PAGE 2 LOC OBJECT CODE LINE SOURCE TEXT VALUE 000A 3000 00050 movlw H'0' 00051 000B 280A 00052 goto mainloop 00053 00054 ;---------------------------------------------------------------- 00055 000C 00056 checkinput: 00057 000C 281B 00058 goto checkforclear ; we are waiting to send a note off 00059 00060 ; check to see if there is a signal on this pin 00061 ; we are waiting to send a note on Warning [202] : Argument out of range. Least significant bits used. 000D 1D86 00062 btfss PORTB,pin ; skip if the pin is set 000E 0008 00063 return 00064 00065 ; we have a signal, so send a note on 000F 3090 00066 movlw 0x90 ; note on, channel 1 0010 009D 00067 movwf xmit 0011 2046 00068 call sendmidi 0012 0822 00069 movf root,w ; get the root note 0013 0721 00070 addwf note,w ; add the current note 0014 009D 00071 movwf xmit 0015 2046 00072 call sendmidi 0016 307F 00073 movlw 0x7F ; velocity 127 0017 009D 00074 movwf xmit 0018 2046 00075 call sendmidi 00076 Warning [202] : Argument out of range. Least significant bits used. 0019 15A0 00077 bsf state,pin ; set the state for this pin 001A 0008 00078 return 00079 001B 00080 checkforclear: 00081 ; check to see if the signal has gone low on this pin 00082 ; we are waiting to send a note off Error [113] : Symbol not previously defined (PIN). 001B 1806 00083 btfsc PORTB,PIN ; skip if the pin is clear 001C 0008 00084 return 00085 00086 ; we have no signal now, so send a note off 001D 3080 00087 movlw 0x80 ; note off, channel 1 001E 009D 00088 movwf xmit 001F 2046 00089 call sendmidi 0020 0822 00090 movf root,w ; get the root note 0021 0721 00091 addwf note,w ; add the current note 0022 009D 00092 movwf xmit 0023 2046 00093 call sendmidi 0024 3000 00094 movlw 0x0 ; velocity 0 0025 009D 00095 movwf xmit 0026 2046 00096 call sendmidi 00097 Error [113] : Symbol not previously defined (PIN). 0027 1020 00098 bcf state,PIN ; clear the state for this pin 0028 0008 00099 return gpasm-0.11.8 alpha logimidi1.asm1-9-2004 06:07:30 PAGE 3 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00100 0029 00101 checkbit: ; takes chkbit,w and returns 1 or 0 in w 0029 03A5 00102 decf chkbit,f ; take one away so we rotate correctly 002A 00103 checkbitrotloop: 002A 0CA4 00104 rrf chktst,f ; rotate & overwrite tmp 002B 0BA5 00105 decfsz chkbit,f ; dec until zero 002C 282A 00106 goto checkbitrotloop 00107 002D 1824 00108 btfsc chktst,H'0' ; skip if the state is clear for bit 0 002E 3401 00109 retlw H'1' 002F 3400 00110 retlw H'0' 00111 0030 00112 setbit: 0030 03A5 00113 decf chkbit,f 0031 3001 00114 movlw H'1' 0032 00A4 00115 movwf chktst 0033 00116 setbitrotloop: 0033 0DA4 00117 rlf chktst,f 0034 0BA5 00118 decfsz chkbit,f 0035 2833 00119 goto setbitrotloop 00120 0036 0824 00121 movf chktst,w 0037 05A6 00122 andwf setbyte,f 0038 0008 00123 return 00124 00125 ; delay 0039 00126 delay: 0039 300D 00127 movlw D'13' 003A 009C 00128 movwf i 003B 30FF 00129 iloop: movlw D'255' 003C 009B 00130 movwf j 003D 300A 00131 jloop: movlw D'10' 003E 009A 00132 movwf k 003F 0B9A 00133 kloop: decfsz k,f 0040 283F 00134 goto kloop 0041 0B9B 00135 decfsz j,f 0042 283D 00136 goto jloop 0043 0B9C 00137 decfsz i,f 0044 283B 00138 goto iloop 0045 0008 00139 return 00140 00141 ;---------------------------------------------------------------- 00142 ; many thanks to Ross Bencina for this function (and portaudio) 00143 ; sendmidi transmits one midi byte on RA2 00144 ; at 10mhz there are 80 instructions per midi bit 00145 ; xmit contains byte to send 00146 ; * this should be rewritten to support variable delays for 00147 ; * different clock speeds 00148 0046 00149 sendmidi: 00150 0046 1105 00151 startb: bcf PORTA, 0x02 ; start bit 00152 0047 3018 00153 movlw D'24' ; delay 73 clocks: 2 + (23 * 3 + 1 * 2) gpasm-0.11.8 alpha logimidi1.asm1-9-2004 06:07:30 PAGE 4 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0048 009F 00154 movwf temp ; | 0049 0B9F 00155 loop1: decfsz temp,f ; | 004A 2849 00156 goto loop1 ; end delay 00157 004B 3008 00158 movlw D'8' 004C 009B 00159 movwf j 00160 004D 00161 sendloop: ; executes 5 instuctions before setting bit 004D 0C9D 00162 rrf xmit,f 004E 1803 00163 btfsc STATUS, C 004F 2853 00164 goto send1 00165 ; remember midi bits are opposite from our representation 0050 0000 00166 send0: nop 0051 1105 00167 bcf PORTA, 0x02 ;send a 0 bit 0052 2856 00168 goto endloop 00169 0053 1505 00170 send1: bsf PORTA, 0x02 ;send a 1 bit 0054 0000 00171 nop 0055 0000 00172 nop 00173 0056 00174 endloop: ; 00175 0056 3017 00176 movlw D'23' ;delay 70 instructions 2 + (22 * 3 + 1 * 2) 0057 009F 00177 movwf temp ; | 0058 0B9F 00178 loop2: decfsz temp,f ; | 0059 2858 00179 goto loop2 ; end delay 00180 005A 0B9B 00181 decfsz j,f ; 005B 284D 00182 goto sendloop 00183 005C 00184 stopb: 005C 0000 00185 nop 005D 0000 00186 nop 005E 0000 00187 nop 005F 0000 00188 nop 0060 0000 00189 nop 0061 1505 00190 bsf PORTA, 0x02 ; stop bit 0062 301A 00191 movlw D'26' ; delay 79 clocks: 2 + (25 * 3 + 1 * 2) 0063 009F 00192 movwf temp ; | 0064 0B9F 00193 loop3: decfsz temp,f ; | 0065 2864 00194 goto loop3 ; end delay 00195 0066 0008 00196 return 00197 gpasm-0.11.8 alpha logimidi1.asm1-9-2004 06:07:30 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 logimidi1.asm1-9-2004 06:07:30 PAGE 6 LOC OBJECT CODE LINE SOURCE TEXT VALUE _RC_OSC 00003FFF _WDT_OFF 00003FFB _WDT_ON 00003FFF _XT_OSC 00003FFD __16F84 00000001 checkbit 00000029 checkbitrotloop 0000002A checkforclear 0000001B checkinput 0000000C chkbit 00000025 chktst 00000024 delay 00000039 endloop 00000056 i 0000001C iloop 0000003B j 0000001B jloop 0000003D k 0000001A kloop 0000003F loop1 00000049 loop2 00000058 loop3 00000064 mainloop 0000000A note 00000021 pin 00000023 root 00000022 send0 00000050 send1 00000053 sendloop 0000004D sendmidi 00000046 setbit 00000030 setbitrotloop 00000033 setbyte 00000026 start 00000000 startb 00000046 state 00000020 stopb 0000005C temp 0000001F xmit 0000001D NUM_NOTES 5 MEMORY USAGE MAP ('X' = Used, '-' = Unused) 0000 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0040 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXX--------- ---------------- 2000 : -------X-------- ---------------- ---------------- ---------------- All other memory blocks unused. Program Memory Words Used: 104 Errors : 2 Warnings : 4 reported, 0 suppressed Messages : 0 reported, 0 suppressed