MPASM 02.15.06 Intermediate BMCNV.ASM 12-10-1998 22:30:45 PAGE 1 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00001 ; 00002 ; bmcnv.asm MIDI converter for PSX BeatMania Controler V1.0 00003 ; for Microchip PIC16F84-10 00004 ; Copyright(C)1998 By H.Kashima 00005 ; 00006 ; 98/11/28 Start 00007 ; 98/12/05 Ver1.0 00008 ; 00009 ; 00010 ; PIN I/O 00011 ; 00012 ; RA0: MIDI OUT in 00013 ; 1: n.c. 00014 ; 2: /LED out 00015 ; 3: MIDI IN out 00016 ; 4: n.c. 00017 ; RB0: data in 00018 ; 1: cmd out 00019 ; 2: mode0 in 00020 ; 3: mode1 in 00021 ; 4: /sel1 out 00022 ; 5: /sel2 out 00023 ; 6: clk out 00024 ; 7: ack in 00025 00026 00027 title bmcnv 00028 processor 16f84 Warning[216]: Radix superceded by command line. 00029 radix dec 00030 list c = 110, n = 88 00031 00032 ;#define debug 1 00033 #include 00001 LIST 00002 ; P16F84.INC Standard Header File, Version 2.00 Microchip Technology, Inc. 00136 LIST 00034 2007 3FF2 00035 __CONFIG _CP_OFF & _WDT_OFF & _HS_OSC & _PWRTE_ON 00036 00037 00038 #define BS(x) ( 1 << x ) ; bit set 00039 00040 ; supplyed clock 00041 #define XTAL 8000000 ; supplyed clock 00042 #define RTCLK ( XTAL / 4 ) ; internal timer clock, @500ns 00043 00044 ; PORTA contents 00045 #define P_MOUT 0 00046 #define P_LED 2 00047 #define P_MIN 3 00048 00049 ; PORTB contents 00050 #define P_DAT 0 00051 #define P_CMD 1 00052 #define P_MODE0 2 00053 #define P_MODE1 3 00054 #define P_SEL1 4 00055 #define P_SEL2 5 00056 #define P_CLK 6 00057 #define P_ACK 7 00058 00059 ; PSX_DATA[2] contents 00060 #define PSP0_LEFT 7 00061 #define PSP0_DOWN 6 00062 #define PSP0_RIGHT 5 00063 #define PSP0_UP 4 00064 #define PSP0_START 3 00065 #define PSP0_SELECT 0 00066 00067 ; PSX_DATA[3] contents 00068 #define PSP1_SQUARE 7 00069 #define PSP1_CROSS 6 00070 #define PSP1_CIRCLE 5 00071 #define PSP1_TRIANG 4 00072 #define PSP1_R1 3 00073 #define PSP1_L1 2 00074 #define PSP1_R2 1 00075 #define PSP1_L2 0 00076 00077 ;MODE_F contents 00078 #define M_1PCON 0 ; 1P connected MPASM 02.15.06 Intermediate BMCNV.ASM 12-10-1998 22:30:45 PAGE 2 bmcnv LOC OBJECT CODE LINE SOURCE TEXT VALUE 00079 #define M_2PCON 1 ; 2P connected 00080 #define M_TMMAP 5 ; TypeMania mode 00081 #define M_ALLMAP 6 ; liner keymap mode 00082 #define M_BULK 7 ; exclusive bulk mode 00083 00084 ;PREV_ETC contents 00085 #define M_TURNED 0 ; table direction changed flag 00086 00087 ;LED Delay cycle 00088 #define LED_DELAY 32 00089 00090 ;TurnTable ignore count value for TypeMania 00091 #define TM_IGNCNT 24 00092 00093 ; 00094 ; work area 00095 ; 00096 cblock 0x0c 00097 0000000C 00098 PSX_DAT1:8 ; 1P buffer 00000014 00099 PREV_ALLOW1, PREV_KEY1 ; previous key conditions 00000016 00100 PREV_ETC1 00101 00000017 00102 PSX_DAT2:8 ; 2P buffer 0000001F 00103 PREV_ALLOW2, PREV_KEY2 00000021 00104 PREV_ETC2 00105 00000022 00106 VAR1, VAR2, VAR3, VAR4, VAR5 ; variables 00000027 00107 AM_DAT1, AM_DAT2 ; temp. for allmap mode 00000029 00108 AM_PRV1, AM_PRV2 0000002B 00109 V_WAIT, SDATA, RDATA ; shift registers 0000002E 00110 MODE_F, LEDTMR ; others 00111 00112 endc 00113 ; 00114 ; 00115 ; program code 00116 ; 00117 ; reset vector 00118 ; 0000 00119 org 0x000 0000 2801 00120 goto start 00121 00122 ; interrupt vector 00123 ; 00124 ; org 0x004 00125 ; goto int_sub 00126 00127 ; 00128 ; cold start 00129 ; MCU initialize 00130 ; 0001 00131 start 0001 1683 00132 BANKSEL OPTION_REG ; bank select RP0 = 1 0002 3007 00133 movlw BS(PS2) | BS(PS1) | BS(PS0) Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct. 0003 0081 00134 movwf OPTION_REG ; pullup PORTB, PS=1:256 0004 30F3 00135 movlw b'11110011' ; initialize I/O port Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct. 0005 0085 00136 movwf TRISA 0006 308D 00137 movlw b'10001101' Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct. 0007 0086 00138 movwf TRISB 00139 0008 1283 00140 BANKSEL PORTA ; bank select RP0 = 0 0009 30FF 00141 movlw 0xff 000A 0085 00142 movwf PORTA ; initialize output 000B 0086 00143 movwf PORTB 00144 000C 0095 00145 movwf PREV_KEY1 000D 0094 00146 movwf PREV_ALLOW1 000E 00A0 00147 movwf PREV_KEY2 000F 009F 00148 movwf PREV_ALLOW2 0010 3020 00149 movlw LED_DELAY 0011 00AF 00150 movwf LEDTMR 0012 0196 00151 clrf PREV_ETC1 0013 01A1 00152 clrf PREV_ETC2 0014 01AE 00153 clrf MODE_F 00154 00155 ; set convertion mode 00156 ; 0015 0906 00157 comf PORTB, W MPASM 02.15.06 Intermediate BMCNV.ASM 12-10-1998 22:30:45 PAGE 3 bmcnv LOC OBJECT CODE LINE SOURCE TEXT VALUE 0016 390C 00158 andlw b'00001100' 0017 1903 00159 btfsc STATUS, Z 0018 2824 00160 goto chkkey 00161 0019 00A2 00162 movwf VAR1 001A 1DA2 00163 btfss VAR1, P_MODE1 ; PB3 bulk mode 001B 281E 00164 goto setc1 00165 001C 17AE 00166 bsf MODE_F, M_BULK 001D 285C 00167 goto mloop 00168 001E 1D22 00169 setc1 btfss VAR1, P_MODE0 ; PB2 keymap select 001F 2822 00170 goto setc2 00171 0020 172E 00172 bsf MODE_F, M_ALLMAP 0021 285C 00173 goto mloop 00174 0022 16AE 00175 setc2 bsf MODE_F, M_TMMAP 0023 285C 00176 goto mloop 00177 00178 ; 00179 ; mode pin has not specified, set mode by controler button 00180 ; 0024 3004 00181 chkkey movlw 4 ; configure retry 0025 00A3 00182 movwf VAR2 00183 0026 3080 00184 chkk0 movlw 128 ; wait 16ms 0027 21F7 00185 call w128 0028 1206 00186 bcf PORTB, P_SEL1 ; SEL1 goes low 0029 300C 00187 movlw PSX_DAT1 ; set buffer top 002A 219D 00188 call GetPSXC ; get data from 1P controler 002B 1606 00189 bsf PORTB, P_SEL1 ; SEL1 goes high 002C 39FF 00190 andlw 0xff ; read error? 002D 1903 00191 btfsc STATUS, Z 002E 2832 00192 goto chkk0a ; 1P connected 00193 002F 0BA3 00194 decfsz VAR2, F 0030 2826 00195 goto chkk0 00196 0031 2859 00197 goto getEEP ; not configured 00198 0032 198E 00199 chkk0a btfsc PSX_DAT1 + 2, PSP0_START 0033 2836 00200 goto chkk1 00201 0034 17AE 00202 bsf MODE_F, M_BULK ; START button = bulk mode 0035 2841 00203 goto setEEP 00204 0036 3041 00205 chkk1 movlw 0x41 ; check normal control pad ID 0037 020C 00206 subwf PSX_DAT1, W 0038 1D03 00207 btfss STATUS, Z 0039 2859 00208 goto getEEP 00209 003A 1B0F 00210 btfsc PSX_DAT1 + 3, PSP1_CROSS 003B 283E 00211 goto chkk2 00212 003C 172E 00213 bsf MODE_F, M_ALLMAP ; SQUARE button = all mapped mode 003D 2841 00214 goto setEEP 00215 003E 1B8F 00216 chkk2 btfsc PSX_DAT1 + 3, PSP1_SQUARE 003F 2859 00217 goto getEEP 00218 0040 16AE 00219 bsf MODE_F, M_TMMAP ; default = TypeMania mode 00220 0041 082E 00221 setEEP movfw MODE_F ; store config to EEPROM 0042 0088 00222 movwf EEDATA 0043 3000 00223 movlw 0 0044 0089 00224 movwf EEADR 0045 2205 00225 call eewrite 00226 0046 3004 00227 movlw 4 ; blink LED, mode configured 0047 00A2 00228 movwf VAR1 0048 1105 00229 blk1 bcf PORTA, P_LED ; LED on 0049 3005 00230 movlw 5 004A 00A3 00231 movwf VAR2 004B 30C3 00232 blk2 movlw 195 ; wait 25ms 004C 21F7 00233 call w128 004D 0BA3 00234 decfsz VAR2, F 004E 284B 00235 goto blk2 ; wait 125ms 00236 004F 1505 00237 bsf PORTA, P_LED ; LED off 0050 3005 00238 movlw 5 0051 00A3 00239 movwf VAR2 MPASM 02.15.06 Intermediate BMCNV.ASM 12-10-1998 22:30:45 PAGE 4 bmcnv LOC OBJECT CODE LINE SOURCE TEXT VALUE 0052 30C3 00240 blk3 movlw 195 ; wait 25ms 0053 21F7 00241 call w128 0054 0BA3 00242 decfsz VAR2, F 0055 2852 00243 goto blk3 ; wait 125ms 00244 0056 0BA2 00245 decfsz VAR1, F 0057 2848 00246 goto blk1 00247 0058 285C 00248 goto mloop 00249 0059 3000 00250 getEEP movlw 0 ; restore config form EEPROM 005A 21FF 00251 call eeread 005B 00AE 00252 movwf MODE_F 00253 00254 ; 00255 ; Main Loop 00256 ; 005C 1206 00257 mloop bcf PORTB, P_SEL1 ; SEL1 goes low 005D 300C 00258 movlw PSX_DAT1 ; set buffer top 005E 219D 00259 call GetPSXC ; get data from 1P controler 005F 1606 00260 bsf PORTB, P_SEL1 ; SEL1 goes high 0060 39FF 00261 andlw 0xff ; read error? 0061 1903 00262 btfsc STATUS, Z 0062 2869 00263 goto ml1 ; connected 00264 0063 102E 00265 bcf MODE_F, M_1PCON ; clear connect flag 0064 30FF 00266 movlw 0xff 0065 0094 00267 movwf PREV_ALLOW1 0066 0095 00268 movwf PREV_KEY1 0067 0196 00269 clrf PREV_ETC1 0068 286A 00270 goto ml2 00271 0069 142E 00272 ml1 bsf MODE_F, M_1PCON ; set connect flag 006A 1286 00273 ml2 bcf PORTB, P_SEL2 ; SEL2 goes low 006B 3017 00274 movlw PSX_DAT2 ; set buffer top 006C 219D 00275 call GetPSXC ; get data from 2P controler 006D 1686 00276 bsf PORTB, P_SEL2 ; SEL2 goes high 006E 39FF 00277 andlw 0xff ; read error? 006F 1903 00278 btfsc STATUS, Z 0070 2877 00279 goto ml3 00280 0071 10AE 00281 bcf MODE_F, M_2PCON ; clear connect flag 0072 30FF 00282 movlw 0xff 0073 009F 00283 movwf PREV_ALLOW2 0074 00A0 00284 movwf PREV_KEY2 0075 01A1 00285 clrf PREV_ETC2 0076 2878 00286 goto ml4 00287 0077 14AE 00288 ml3 bsf MODE_F, M_2PCON ; set connect flag 00289 00290 00291 ; bulk mode proccessing 00292 ; 0078 1FAE 00293 ml4 btfss MODE_F, M_BULK 0079 2887 00294 goto ml5 00295 ; 00296 ; bulk dump mode 00297 ; put MIDI Exclusive message 00298 ; + 0 0xf0 MIDI Exclusive 00299 ; + 1 0x00 maker ID 00300 ; b7 b6 b5 b4 b3 b2 b1 b0 00301 ; + 2 0 <-------data-------> 1P bulk data 00302 ; + 6 | 00303 ; + 7 1P remained bit7 datas 00304 ; + 8 0 <-------data-------> 2P bulk data 00305 ; +15 2P remained bit7 datas 00306 ; +16 0xf7 End of Exclusive 00307 ; 007A 30F0 00308 movlw 0xf0 007B 21D3 00309 call MIDIout 007C 3000 00310 movlw 0 007D 21D3 00311 call MIDIout 00312 007E 300C 00313 movlw PSX_DAT1 007F 00A5 00314 movwf VAR4 0080 2102 00315 call blk2mid 00316 0081 3017 00317 movlw PSX_DAT2 0082 00A5 00318 movwf VAR4 0083 2102 00319 call blk2mid 00320 0084 30F7 00321 movlw 0xf7 MPASM 02.15.06 Intermediate BMCNV.ASM 12-10-1998 22:30:45 PAGE 5 bmcnv LOC OBJECT CODE LINE SOURCE TEXT VALUE 0085 21D3 00322 call MIDIout 00323 0086 28FA 00324 goto ml8 ; loop end proc 00325 00326 ; TypeMania proccessing 00327 ; 0087 1EAE 00328 ml5 btfss MODE_F, M_TMMAP 0088 28D6 00329 goto ml7 00330 00331 ; (PSX_DATA 1P) -> (SDATA MIDI) 00332 ; PSP0_UP = ControlChange(#0x42:Softenute) 00333 ; PSP0_DOWN = ControlChange(#0x42:Softenute) 00334 ; PSP1_SQUARE = C3(0x3c) 00335 ; PSP1_L1 = C#3(0x3d) 00336 ; PSP1_CROSS = D3(0x3e) 00337 ; PSP1_R1 = D#3(0x3f) 00338 ; PSP1_CIRCLE = E3(0x40) 00339 0089 1C2E 00340 btfss MODE_F, M_1PCON ; connected? 008A 28AF 00341 goto ml6 00342 008B 3041 00343 movlw 0x41 ; check normal control pad ID 008C 020C 00344 subwf PSX_DAT1, W 008D 1D03 00345 btfss STATUS, Z 008E 28AF 00346 goto ml6 00347 008F 300C 00348 movlw PSX_DAT1 0090 00A5 00349 movwf VAR4 0091 303C 00350 movlw 0x3c 0092 00A3 00351 movwf VAR2 0093 3080 00352 movlw BS(PSP1_SQUARE) 0094 00A4 00353 movwf VAR3 0095 2116 00354 call key2mid 00355 0096 303D 00356 movlw 0x3d 0097 00A3 00357 movwf VAR2 0098 3004 00358 movlw BS(PSP1_L1) 0099 00A4 00359 movwf VAR3 009A 2116 00360 call key2mid 00361 009B 303E 00362 movlw 0x3e 009C 00A3 00363 movwf VAR2 009D 3040 00364 movlw BS(PSP1_CROSS) 009E 00A4 00365 movwf VAR3 009F 2116 00366 call key2mid 00367 00A0 303F 00368 movlw 0x3f 00A1 00A3 00369 movwf VAR2 00A2 3008 00370 movlw BS(PSP1_R1) 00A3 00A4 00371 movwf VAR3 00A4 2116 00372 call key2mid 00373 00A5 3040 00374 movlw 0x40 00A6 00A3 00375 movwf VAR2 00A7 3020 00376 movlw BS(PSP1_CIRCLE) 00A8 00A4 00377 movwf VAR3 00A9 2116 00378 call key2mid 00379 00AA 080F 00380 movfw PSX_DAT1 + 3 ; save current key 00AB 0095 00381 movwf PREV_KEY1 00382 ; 00383 ;turn table 00AC 3042 00384 movlw 0x42 ; C.C. softenute 00AD 00A3 00385 movwf VAR2 00AE 213A 00386 call TM2mid 00387 00388 ; (PSX_DATA 2P) -> (SDATA MIDI) 00389 ; PSP0_UP = ControlChange(#0x40:Hold1) 00390 ; PSP0_DOWN = ControlChange(#0x40:Hold1) 00391 ; PSP1_SQUARE = C3(0x48) 00392 ; PSP1_L1 = C#3(0x49) 00393 ; PSP1_CROSS = D3(0x4a) 00394 ; PSP1_R1 = D#3(0x4b) 00395 ; PSP1_CIRCLE = E3(0x4c) 00396 00AF 1CAE 00397 ml6 btfss MODE_F, M_2PCON ; connected? 00B0 28D6 00398 goto ml7 00399 00B1 3041 00400 movlw 0x41 ; check normal control pad ID 00B2 0217 00401 subwf PSX_DAT2, W 00B3 1D03 00402 btfss STATUS, Z 00B4 28D6 00403 goto ml7 MPASM 02.15.06 Intermediate BMCNV.ASM 12-10-1998 22:30:45 PAGE 6 bmcnv LOC OBJECT CODE LINE SOURCE TEXT VALUE 00404 00B5 3017 00405 movlw PSX_DAT2 00B6 00A5 00406 movwf VAR4 00B7 3048 00407 movlw 0x48 00B8 00A3 00408 movwf VAR2 00B9 3080 00409 movlw BS(PSP1_SQUARE) 00BA 00A4 00410 movwf VAR3 00BB 2116 00411 call key2mid 00412 00BC 3049 00413 movlw 0x49 00BD 00A3 00414 movwf VAR2 00BE 3004 00415 movlw BS(PSP1_L1) 00BF 00A4 00416 movwf VAR3 00C0 2116 00417 call key2mid 00418 00C1 304A 00419 movlw 0x4a 00C2 00A3 00420 movwf VAR2 00C3 3040 00421 movlw BS(PSP1_CROSS) 00C4 00A4 00422 movwf VAR3 00C5 2116 00423 call key2mid 00424 00C6 304B 00425 movlw 0x4b 00C7 00A3 00426 movwf VAR2 00C8 3008 00427 movlw BS(PSP1_R1) 00C9 00A4 00428 movwf VAR3 00CA 2116 00429 call key2mid 00430 00CB 304C 00431 movlw 0x4c 00CC 00A3 00432 movwf VAR2 00CD 3020 00433 movlw BS(PSP1_CIRCLE) 00CE 00A4 00434 movwf VAR3 00CF 2116 00435 call key2mid 00436 00D0 081A 00437 movfw PSX_DAT2 + 3 ; save current key 00D1 00A0 00438 movwf PREV_KEY2 00439 00440 ; 00441 ;turn table 00D2 3040 00442 movlw 0x40 ; C.C. Hold.1 00D3 00A3 00443 movwf VAR2 00D4 213A 00444 call TM2mid 00445 00D5 28FA 00446 goto ml8 ; loop end proc 00447 00448 00449 ; All keymap proccessing 00450 ; 00D6 1F2E 00451 ml7 btfss MODE_F, M_ALLMAP 00D7 28FA 00452 goto ml8 00453 00D8 1C2E 00454 btfss MODE_F, M_1PCON ; connected? 00D9 28E9 00455 goto ml7a 00456 00DA 303C 00457 movlw 60 ; MIDI C3 00DB 00A3 00458 movwf VAR2 00DC 080E 00459 movfw PSX_DAT1 + 2 ; push psx datas 00DD 00A7 00460 movwf AM_DAT1 00DE 080F 00461 movfw PSX_DAT1 + 3 00DF 00A8 00462 movwf AM_DAT2 00E0 0814 00463 movfw PREV_ALLOW1 00E1 00A9 00464 movwf AM_PRV1 00E2 0815 00465 movfw PREV_KEY1 00E3 00AA 00466 movwf AM_PRV2 00E4 217E 00467 call ModeA ; All keymap 00E5 080E 00468 movfw PSX_DAT1 + 2 ; save current condition 00E6 0094 00469 movwf PREV_ALLOW1 00E7 080F 00470 movfw PSX_DAT1 + 3 00E8 0095 00471 movwf PREV_KEY1 00472 00E9 1CAE 00473 ml7a btfss MODE_F, M_2PCON ; connected? 00EA 28FA 00474 goto ml8 00475 00EB 3054 00476 movlw 84 ; MIDI C5 00EC 00A3 00477 movwf VAR2 00ED 0819 00478 movfw PSX_DAT2 + 2 ; push psx datas 00EE 00A7 00479 movwf AM_DAT1 00EF 081A 00480 movfw PSX_DAT2 + 3 00F0 00A8 00481 movwf AM_DAT2 00F1 081F 00482 movfw PREV_ALLOW2 00F2 00A9 00483 movwf AM_PRV1 00F3 0820 00484 movfw PREV_KEY2 00F4 00AA 00485 movwf AM_PRV2 MPASM 02.15.06 Intermediate BMCNV.ASM 12-10-1998 22:30:45 PAGE 7 bmcnv LOC OBJECT CODE LINE SOURCE TEXT VALUE 00F5 217E 00486 call ModeA ; All keymap 00F6 0819 00487 movfw PSX_DAT2 + 2 ; save current condition 00F7 009F 00488 movwf PREV_ALLOW2 00F8 081A 00489 movfw PSX_DAT2 + 3 00F9 00A0 00490 movwf PREV_KEY2 00491 00492 ; 00493 ; 00FA 3020 00494 ml8 movlw LED_DELAY ; light timer 00FB 022F 00495 subwf LEDTMR, W 00FC 1903 00496 btfsc STATUS, Z 00FD 2900 00497 goto ml9 00498 00FE 0AAF 00499 incf LEDTMR, F ; count up timer 00FF 285C 00500 goto mloop 00501 0100 1505 00502 ml9 bsf PORTA, P_LED ; light down LED 00503 0101 285C 00504 goto mloop 00505 00506 00507 ; 00508 ; Subroutines 00509 ; 00510 ; 00511 00512 00513 ; 00514 ; bulk send to MIDI 00515 ; VAR4: PSX buffer top 00516 ; variable: VAR2, VAR3 0102 0825 00517 blk2mid movfw VAR4 0103 0084 00518 movwf FSR 0104 3008 00519 movlw 8 0105 00A4 00520 movwf VAR3 00521 0106 3007 00522 b2m movlw 7 0107 0224 00523 subwf VAR3, W ; skip fixed data 'Z' 0108 1903 00524 btfsc STATUS, Z 0109 2910 00525 goto b2m_2 00526 010A 0D00 00527 rlf INDF, W ; save bit7 010B 0CA3 00528 rrf VAR2, F 00529 010C 307F 00530 movlw 0x7f 010D 0500 00531 andwf INDF, W ; MIDI is 7bit 010E 21D3 00532 call MIDIout 00533 010F 0A84 00534 incf FSR, F 00535 0110 0BA4 00536 b2m_2 decfsz VAR3, F 0111 2906 00537 goto b2m 00538 0112 307F 00539 movlw 0x7f 0113 0523 00540 andwf VAR2, W ; send all bit7s 0114 21D3 00541 call MIDIout 00542 0115 0008 00543 return 00544 00545 ; 00546 ; key2mid 00547 ; VAR2: midi key number, VAR3: Key mask, VAR4: PSX_DAT top 00548 ; variable: VAR5 0116 0825 00549 key2mid movfw VAR4 0117 3E03 00550 addlw 3 0118 0084 00551 movwf FSR ; FSR = PSX_DAT[3] 0119 0900 00552 comf INDF, W ; check current condition 011A 0524 00553 andwf VAR3, W 011B 00A6 00554 movwf VAR5 ; VAR5 = ~PSX_DAT[3] & MASK 011C 1903 00555 btfsc STATUS, Z 011D 292C 00556 goto k2m_1 ; button released 00557 011E 3006 00558 movlw 6 ; button push downed 011F 0784 00559 addwf FSR, F ; FSR = PSX_DAT[9], PREV_KEY 0120 0900 00560 comf INDF, W ; check previous condition 0121 0524 00561 andwf VAR3, W 0122 0226 00562 subwf VAR5, W ; if( ( ~PREV & MASK ) == VAR5 ) 0123 1903 00563 btfsc STATUS, Z 0124 2939 00564 goto k2m_2 ; condition not changed 00565 0125 3090 00566 movlw 0x90 ; condition changed, NOTE ON 0126 21D3 00567 call MIDIout MPASM 02.15.06 Intermediate BMCNV.ASM 12-10-1998 22:30:45 PAGE 8 bmcnv LOC OBJECT CODE LINE SOURCE TEXT VALUE 0127 0823 00568 movfw VAR2 ; MIDI key value 0128 21D3 00569 call MIDIout 0129 307F 00570 movlw 0x7f ; velocity 127 012A 21D3 00571 call MIDIout 012B 2939 00572 goto k2m_2 00573 012C 3006 00574 k2m_1 movlw 6 ; button push downed 012D 0784 00575 addwf FSR, F ; FSR = PSX_DAT[9], PREV_KEY 012E 0900 00576 comf INDF, W ; check previous condition 012F 0524 00577 andwf VAR3, W 0130 0226 00578 subwf VAR5, W ; if((~PREV & MASK) == VAR5) 0131 1903 00579 btfsc STATUS, Z 0132 2939 00580 goto k2m_2 ; condition not changed 00581 0133 3080 00582 movlw 0x80 ; condition changed, NOTE ON 0134 21D3 00583 call MIDIout 0135 0823 00584 movfw VAR2 ; MIDI key value 0136 21D3 00585 call MIDIout 0137 3000 00586 movlw 0x00 ; velocity 0 0138 21D3 00587 call MIDIout 00588 0139 0008 00589 k2m_2 return 00590 00591 ; 00592 ; TM2mid, special routine for the turn table controled for TypeMania 00593 ; VAR2: ControlChange Function, VAR4: PSX_DAT buffer top 00594 ; variable: VAR5 013A 0825 00595 TM2mid movfw VAR4 ; check previous status 013B 3E0A 00596 addlw 10 013C 0084 00597 movwf FSR ; FSR = PSX_DAT[10], PREV_ETC 013D 0800 00598 movfw INDF 013E 1903 00599 btfsc STATUS, Z 013F 2945 00600 goto t2m_0 00601 0140 3001 00602 movlw 1 ; PREV_ETC -= 1 0141 0280 00603 subwf INDF, F 0142 1903 00604 btfsc STATUS, Z 0143 295F 00605 goto t2m_1 ; just changed 00606 0144 297D 00607 goto t2m_end 00608 0145 0825 00609 t2m_0 movfw VAR4 0146 3E02 00610 addlw 2 0147 0084 00611 movwf FSR ; FSR = PSX_DAT[2] 0148 0900 00612 comf INDF, W ; check current condition 0149 3950 00613 andlw BS(PSP0_UP) | BS(PSP0_DOWN) 014A 00A6 00614 movwf VAR5 ; VAR5 = ~PSX_DAT[2] & MASK 014B 1903 00615 btfsc STATUS, Z 014C 2967 00616 goto t2m_2 ; button released 00617 014D 3006 00618 movlw 6 ; button push downed 014E 0784 00619 addwf FSR, F ; FSR = PSX_DAT[8] 014F 0900 00620 comf INDF, W ; check previous condition 0150 3950 00621 andlw BS(PSP0_UP) | BS(PSP0_DOWN) 0151 0226 00622 subwf VAR5, W ; if( ( ~PREV & MASK ) == VAR5 ) 0152 1903 00623 btfsc STATUS, Z 0153 2974 00624 goto t2m_3 ; condition not changed 00625 0154 30B0 00626 movlw 0xb0 ; condition changed, send Control Change 0155 21D3 00627 call MIDIout 0156 0823 00628 movfw VAR2 ; Function 0157 21D3 00629 call MIDIout 0158 3000 00630 movlw 0x00 ; value(0:OFF) 0159 21D3 00631 call MIDIout 00632 015A 0A84 00633 incf FSR, F ; set turned flag 015B 0A84 00634 incf FSR, F 015C 3018 00635 movlw TM_IGNCNT ; set ignore count 015D 0080 00636 movwf INDF 015E 297D 00637 goto t2m_end 00638 015F 0180 00639 t2m_1 clrf INDF ; clear just changed flag 0160 30B0 00640 movlw 0xb0 ; Control Change 0161 21D3 00641 call MIDIout 0162 0823 00642 movfw VAR2 ; Function 0163 21D3 00643 call MIDIout 0164 307F 00644 movlw 0x7f ; value(0:ON) 0165 21D3 00645 call MIDIout 0166 2974 00646 goto t2m_3 00647 0167 3006 00648 t2m_2 movlw 6 0168 0784 00649 addwf FSR, F ; FSR = PSX_DAT[8] MPASM 02.15.06 Intermediate BMCNV.ASM 12-10-1998 22:30:45 PAGE 9 bmcnv LOC OBJECT CODE LINE SOURCE TEXT VALUE 0169 0900 00650 comf INDF, W ; check previous condition 016A 3950 00651 andlw BS(PSP0_UP) | BS(PSP0_DOWN) 016B 0226 00652 subwf VAR5, W ; if((~PREV & MASK) == VAR5) 016C 1903 00653 btfsc STATUS, Z 016D 2974 00654 goto t2m_3 ; condition not changed 00655 016E 30B0 00656 movlw 0xb0 ; Control Change 016F 21D3 00657 call MIDIout 0170 0823 00658 movfw VAR2 ; Control 0171 21D3 00659 call MIDIout 0172 3000 00660 movlw 0x00 ; value(0:OFF) 0173 21D3 00661 call MIDIout 00662 0174 0825 00663 t2m_3 movfw VAR4 0175 3E02 00664 addlw 2 0176 0084 00665 movwf FSR ; FSR = PSX_DAT[2] 0177 0800 00666 movfw INDF ; store current allow condition 0178 00A6 00667 movwf VAR5 0179 3006 00668 movlw 6 017A 0784 00669 addwf FSR, F ; FSR = PSX_DAT[8] 017B 0826 00670 movfw VAR5 017C 0080 00671 movwf INDF 00672 017D 0008 00673 t2m_end return 00674 00675 ; 00676 ; all keymap from (VAR2) 00677 ; VAR2: top midi key number, VAR4: PSX_DAT top 00678 ; variable: VAR5 017E 3010 00679 ModeA movlw 16 017F 00A6 00680 movwf VAR5 ; loop counter 00681 0180 0CA7 00682 mda1 rrf AM_DAT1, F ; AM_DAT >> 1 0181 0CA8 00683 rrf AM_DAT2, F 0182 1803 00684 btfsc STATUS, C 0183 298F 00685 goto mda2 ; key off 00686 0184 0CA9 00687 rrf AM_PRV1, F ; compare previous condition 0185 0CAA 00688 rrf AM_PRV2, F 0186 1C03 00689 btfss STATUS, C 0187 2999 00690 goto mda3 00691 0188 3090 00692 movlw 0x90 ; NOTE ON 0189 21D3 00693 call MIDIout 018A 0823 00694 movfw VAR2 ; key 018B 21D3 00695 call MIDIout 018C 307F 00696 movlw 0x7f ; velocity 018D 21D3 00697 call MIDIout 018E 2999 00698 goto mda3 00699 018F 0CA9 00700 mda2 rrf AM_PRV1, F ; compare previous condition 0190 0CAA 00701 rrf AM_PRV2, F 0191 1803 00702 btfsc STATUS, C 0192 2999 00703 goto mda3 00704 0193 3080 00705 movlw 0x80 ; NOTE OFF 0194 21D3 00706 call MIDIout 0195 0823 00707 movfw VAR2 0196 21D3 00708 call MIDIout 0197 307F 00709 movlw 0x7f ; velocity 0198 21D3 00710 call MIDIout 00711 0199 0AA3 00712 mda3 incf VAR2, F ; key++ 019A 0BA6 00713 decfsz VAR5, F 019B 2980 00714 goto mda1 00715 019C 0008 00716 mda4 return 00717 00718 00719 ; get data from PSX controler 00720 ; W: buffer top 00721 ; variable: FSR, SDATA, RDATA 00722 ; return: PSX_DAT[8] 019D 0084 00723 GetPSXC movwf FSR 019E 3001 00724 movlw 0x01 ; data request command[1] 019F 00AC 00725 movwf SDATA 01A0 21BB 00726 call PSrecv ; send data 01A1 21CC 00727 call PSwAck ; wait ACK 01A2 39FF 00728 andlw 0xff 01A3 1D03 00729 btfss STATUS, Z ; ACK returned? 01A4 34FF 00730 retlw 0xff ; return with error 00731 MPASM 02.15.06 Intermediate BMCNV.ASM 12-10-1998 22:30:45 PAGE 10 bmcnv LOC OBJECT CODE LINE SOURCE TEXT VALUE 01A5 3042 00732 movlw 0x42 ; request command[2] 01A6 00AC 00733 movwf SDATA 01A7 21BB 00734 call PSrecv ; send the request 01A8 21CC 00735 call PSwAck ; wait ACK 00736 01A9 082D 00737 movfw RDATA 01AA 0080 00738 movwf INDF ; get controler ID 01AB 0A84 00739 incf FSR, F 00740 01AC 0D2D 00741 rlf RDATA, W ; calculate data length 01AD 3906 00742 andlw 0x06 01AE 00A3 00743 movwf VAR2 01AF 01AC 00744 clrf SDATA 00745 01B0 21BB 00746 gpc1 call PSrecv ; send the request 01B1 21CC 00747 call PSwAck ; wait ACK 01B2 082D 00748 movfw RDATA 01B3 0080 00749 movwf INDF ; store buffer 01B4 0A84 00750 incf FSR, F ; incriment pointer 01B5 0BA3 00751 decfsz VAR2, F 01B6 29B0 00752 goto gpc1 00753 01B7 21BB 00754 call PSrecv ; send the request 00755 ; *not require wait for ACK 01B8 082D 00756 movfw RDATA 01B9 0080 00757 movwf INDF ; store buffer last data 00758 01BA 3400 00759 retlw 0 00760 00761 ; 00762 ; data transfer for PSX 00763 ; send SDATA, return: RDATA 00764 ; variable: VAR1 01BB 3008 00765 PSrecv movlw 8 01BC 00A2 00766 movwf VAR1 01BD 0CAC 00767 psr1 rrf SDATA, F 01BE 1803 00768 btfsc STATUS, C 01BF 29C3 00769 goto psr2 00770 01C0 1306 00771 bcf PORTB, P_CLK ; clock goes low 01C1 1086 00772 bcf PORTB, P_CMD 01C2 29C5 00773 goto psr3 00774 01C3 1306 00775 psr2 bcf PORTB, P_CLK ; clock goes low 01C4 1486 00776 bsf PORTB, P_CMD 00777 01C5 0C06 00778 psr3 rrf PORTB, W ; shift P_DAT => STATUS:C 01C6 0CAD 00779 rrf RDATA, F 01C7 1706 00780 bsf PORTB, P_CLK ; clock goes high 01C8 0000 00781 nop 01C9 0BA2 00782 decfsz VAR1, F 01CA 29BD 00783 goto psr1 00784 01CB 0008 00785 return 00786 00787 ; 00788 ; wait ACK with timeout 100us 00789 ; variable: VAR1 01CC 30C8 00790 PSwAck movlw 200 ; wait ACK with timeout 100us 01CD 00A2 00791 movwf VAR1 01CE 1F86 00792 psw1 btfss PORTB, P_ACK 01CF 3400 00793 retlw 0 ; ACK received, return 0 00794 01D0 0BA2 00795 decfsz VAR1, F 01D1 29CE 00796 goto psw1 00797 01D2 34FF 00798 retlw 0xff ; ACK no reaction, return -1 00799 00800 ; 00801 ; send MIDI port 00802 ; output W with 31.25Kbps, S8N1 01D3 00AC 00803 MIDIout movwf SDATA 01D4 01AF 00804 clrf LEDTMR ; light up LED 01D5 1105 00805 bcf PORTA, P_LED 01D6 3008 00806 movlw 8 01D7 00A2 00807 movwf VAR1 00808 01D8 1185 00809 bcf PORTA, P_MIN ; start bit 01D9 3011 00810 movlw 17 01DA 21F3 00811 call wait_W 01DB 0000 00812 nop 01DC 0000 00813 nop MPASM 02.15.06 Intermediate BMCNV.ASM 12-10-1998 22:30:45 PAGE 11 bmcnv LOC OBJECT CODE LINE SOURCE TEXT VALUE 00814 01DD 0CAC 00815 out1 rrf SDATA, F 01DE 1803 00816 btfsc STATUS, C 01DF 29E3 00817 goto out2 00818 01E0 0000 00819 nop 01E1 1185 00820 bcf PORTA, P_MIN 01E2 29E6 00821 goto out3 00822 01E3 1585 00823 out2 bsf PORTA, P_MIN 01E4 0000 00824 nop 01E5 0000 00825 nop 01E6 3010 00826 out3 movlw 16 01E7 21F3 00827 call wait_W 01E8 0BA2 00828 decfsz VAR1, F 01E9 29DD 00829 goto out1 00830 01EA 0000 00831 nop 01EB 0000 00832 nop 01EC 0000 00833 nop 01ED 0000 00834 nop 01EE 0000 00835 nop 01EF 1585 00836 bsf PORTA, P_MIN ; stop bit 01F0 3013 00837 movlw 19 01F1 21F3 00838 call wait_W 00839 01F2 0008 00840 return 00841 00842 ; 00843 ; wait loop (W) 00844 ; cyc = 3W + 4 01F3 00AB 00845 wait_W movwf V_WAIT 01F4 0BAB 00846 wait1 decfsz V_WAIT, F 01F5 29F4 00847 goto wait1 00848 01F6 0008 00849 return 00850 00851 ; 00852 ; wait @128us 00853 ; 01F7 00AB 00854 w128 movwf V_WAIT 01F8 09AB 00855 comf V_WAIT, F 01F9 0A2B 00856 incf V_WAIT, W ; TMR0 = - W 01FA 0081 00857 movwf TMR0 01FB 0801 00858 w128a movfw TMR0 ; TMR0 @128us 01FC 1D03 00859 btfss STATUS, Z 01FD 29FB 00860 goto w128a 01FE 0008 00861 return 00862 00863 ; read EEPROM 00864 ; W: EEPROM address, return W: EEPROM data 01FF 0089 00865 eeread movwf EEADR 0200 1683 00866 bsf STATUS, RP0 Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct. 0201 1408 00867 bsf EECON1, RD 0202 1283 00868 bcf STATUS, RP0 0203 0808 00869 movfw EEDATA 0204 0008 00870 return 00871 00872 ; write EEPROM 00873 ; EEDATA: data for write, EEADR: address for write 0205 1683 00874 eewrite bsf STATUS, RP0 Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct. 0206 1508 00875 bsf EECON1, WREN ; write enable 0207 3055 00876 movlw 0x55 Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct. 0208 0089 00877 movwf EECON2 0209 30AA 00878 movlw 0xaa Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct. 020A 0089 00879 movwf EECON2 Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct. 020B 1488 00880 bsf EECON1, WR Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct. 020C 1888 00881 wr1 btfsc EECON1, WR 020D 2A0C 00882 goto wr1 Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct. 020E 1108 00883 bcf EECON1, WREN ; write disable 020F 1283 00884 bcf STATUS, RP0 0210 0008 00885 return 00886 00887 end MPASM 02.15.06 Intermediate BMCNV.ASM 12-10-1998 22:30:45 PAGE 12 bmcnv SYMBOL TABLE LABEL VALUE AM_DAT1 00000027 AM_DAT2 00000028 AM_PRV1 00000029 AM_PRV2 0000002A BS ( 1 << x ) C 00000000 DC 00000001 EEADR 00000009 EECON1 00000088 EECON2 00000089 EEDATA 00000008 EEIE 00000006 EEIF 00000004 F 00000001 FSR 00000004 GIE 00000007 GetPSXC 0000019D INDF 00000000 INTCON 0000000B INTE 00000004 INTEDG 00000006 INTF 00000001 IRP 00000007 LEDTMR 0000002F LED_DELAY 32 MIDIout 000001D3 MODE_F 0000002E M_1PCON 0 M_2PCON 1 M_ALLMAP 6 M_BULK 7 M_TMMAP 5 M_TURNED 0 ModeA 0000017E NOT_PD 00000003 NOT_RBPU 00000007 NOT_TO 00000004 OPTION_REG 00000081 PCL 00000002 PCLATH 0000000A PORTA 00000005 PORTB 00000006 PREV_ALLOW1 00000014 PREV_ALLOW2 0000001F PREV_ETC1 00000016 PREV_ETC2 00000021 PREV_KEY1 00000015 PREV_KEY2 00000020 PS0 00000000 PS1 00000001 PS2 00000002 PSA 00000003 PSP0_DOWN 6 PSP0_LEFT 7 PSP0_RIGHT 5 PSP0_SELECT 0 PSP0_START 3 PSP0_UP 4 PSP1_CIRCLE 5 PSP1_CROSS 6 PSP1_L1 2 PSP1_L2 0 PSP1_R1 3 PSP1_R2 1 PSP1_SQUARE 7 PSP1_TRIANG 4 PSX_DAT1 0000000C PSX_DAT2 00000017 PSrecv 000001BB PSwAck 000001CC P_ACK 7 P_CLK 6 P_CMD 1 P_DAT 0 P_LED 2 P_MIN 3 P_MODE0 2 P_MODE1 3 P_MOUT 0 P_SEL1 4 P_SEL2 5 RBIE 00000003 MPASM 02.15.06 Intermediate BMCNV.ASM 12-10-1998 22:30:45 PAGE 13 bmcnv SYMBOL TABLE LABEL VALUE RBIF 00000000 RD 00000000 RDATA 0000002D RP0 00000005 RP1 00000006 RTCLK ( XTAL / 4 ) SDATA 0000002C STATUS 00000003 T0CS 00000005 T0IE 00000005 T0IF 00000002 T0SE 00000004 TM2mid 0000013A TMR0 00000001 TM_IGNCNT 24 TRISA 00000085 TRISB 00000086 VAR1 00000022 VAR2 00000023 VAR3 00000024 VAR4 00000025 VAR5 00000026 V_WAIT 0000002B W 00000000 WR 00000001 WREN 00000002 WRERR 00000003 XTAL 8000000 Z 00000002 _CP_OFF 00003FFF _CP_ON 0000000F _HS_OSC 00003FFE _LP_OSC 00003FFC _PWRTE_OFF 00003FFF _PWRTE_ON 00003FF7 _RC_OSC 00003FFF _WDT_OFF 00003FFB _WDT_ON 00003FFF _XT_OSC 00003FFD __16F84 00000001 b2m 00000106 b2m_2 00000110 blk1 00000048 blk2 0000004B blk2mid 00000102 blk3 00000052 chkk0 00000026 chkk0a 00000032 chkk1 00000036 chkk2 0000003E chkkey 00000024 eeread 000001FF eewrite 00000205 getEEP 00000059 gpc1 000001B0 k2m_1 0000012C k2m_2 00000139 key2mid 00000116 mda1 00000180 mda2 0000018F mda3 00000199 mda4 0000019C ml1 00000069 ml2 0000006A ml3 00000077 ml4 00000078 ml5 00000087 ml6 000000AF ml7 000000D6 ml7a 000000E9 ml8 000000FA ml9 00000100 mloop 0000005C out1 000001DD out2 000001E3 out3 000001E6 psr1 000001BD psr2 000001C3 psr3 000001C5 psw1 000001CE setEEP 00000041 setc1 0000001E MPASM 02.15.06 Intermediate BMCNV.ASM 12-10-1998 22:30:45 PAGE 14 bmcnv SYMBOL TABLE LABEL VALUE setc2 00000022 start 00000001 t2m_0 00000145 t2m_1 0000015F t2m_2 00000167 t2m_3 00000174 t2m_end 0000017D w128 000001F7 w128a 000001FB wait1 000001F4 wait_W 000001F3 wr1 0000020C MEMORY USAGE MAP ('X' = Used, '-' = Unused) 0000 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0040 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0080 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 00C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0100 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0140 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0180 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 01C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0200 : XXXXXXXXXXXXXXXX X--------------- ---------------- ---------------- 2000 : -------X-------- ---------------- ---------------- ---------------- All other memory blocks unused. Program Memory Words Used: 529 Program Memory Words Free: 495 Errors : 0 Warnings : 1 reported, 0 suppressed Messages : 10 reported, 0 suppressed