;MP2v003a.ASM by Dick Straker. Programmable selection-of-presets synthesiser module. ;"MIDI Partner" MIDI sound expander for WEM. PIC18F452 controlling ATSAM9773 SOUND SYNTH CHIP. ;MIDI Partner launched in AD2002. ;10MHz crystal osc + PLL (40MHz)gives 100ns single instruction cycle time. Basic ; main program loop time ~40us (Meausured on port RB7). ;................................................................................................................................................................................................................ ;Tab is 16 spaces. Font is Arial bold 10. ;................................................................................................................................................................................................................ ;Version MP2v003a adds direct access to sound-try-out mode from normal play mode using bass bank & rh2 mute buttons ; pressed simultaneously. ;Versions MP2v xx2x : RH1now has 3rd layer on some sounds (RH1-6 Accordion from 3 detuned layers). ; 6 extra buttons now available in hardware. All backwardly compatible with ; original MP1 hardware. 3 drum sounds available on bass and chords. ;Tremolo editing button now latching. ;Variable level 'solo' button added ;Variable pitch-bend function button added. ; ;Version 9A1 : Bass 9 release reduced - left variable. ;Version 9A0 adds : Pressing instrument select buttons again (toggles) mutes/unmutes the instrument. ; ;Version (8A3 - Jan 2007) makes the two Rh mute buttons into Inc & Dec controls for the sound tryout/edit ; mode. This adds to FSW1 & 2 for the same function. Rh1 mute=Dec, Rh2=Inc. ;Version (8A1 - Jan 2007) changes the drums operation to 3 individual on/off/Edit buttons & ; has a general rejig of the software here. ; ;Version (7C0) has been default version from date 27/11/2006 and changes the ; bass/chords percussion instruments in the different drum sets & adds master tune facility. ;Version (7B0) has been default version from date 27/10/2006. ; 7B0 - the last number being different sound versions of the same software version. ;................................................................................................................................................................................................................ ;May be directly programmed into MP1 unit using ICD2 using the following configuration ; bit settings (see config directives below at begining of code section): ;Oscillator = - HS/PLL Enabled. ;Oscillator switch - Disabled. ;Powerup timer - Enabled. ;Brownout detect - Enabled @2.7V. ;Watchdog timer - Disabled. ;Low voltage program - Disabled. ;Background Debug - Disabled. ;Stack overflow reset - Enabled. ;Code memory protects - Enabled. ;Data EE Read protect - Disabled. ; ;EEPROM address 0xC0 will show 1st software revision letter in ASCII. ; (e.g v = 0x76). and address 0xC1 will show 2nd software revision letter in ; ASCII. (e.g. 4 = 0x34).and address 0xC2,C3 will show 3rd, 4th software revision letter. ;See eeprom address chart at the end of this file. ; ;Receives MIDI :- Bass=Ch3, Chords=Ch2, Rh1=Ch1/4, Rh2=Ch4. Rh2 Copies Ch1 unless ; external Ch4 input is sensed. Once sensed stays locked to chan 4 until power reset. ; ;Internally, Ch5 is used for 2nd layer on Rh Ch1 and Ch7 for 3rd layer on Ch1. ;Ch6 is 2nd layer for bass Ch3. ; ;Also, can recieve simultaneously for 'Cavagnolo' compatibility ; Ch16,15,14. (Rh, Bas, Chd), if activated. ; ;4 Assignable Footswitches to all (instrument & mute/octave/select/effects) ; buttons. ; Press & hold pedal whilst pushing desired button, release pedal. ;Pedal assignments are remembered during power off. ;............................................................................................................................ ;Mode changing control sequences : ; ;If RH1 Mute button held down at startup, Sound-try-out or Sound-Programming mode is ; entered. ;From this version (MP2v003a), sound programming mode may be entered during normal use ; by pressing Bass bank and Rh2 Mute buttons together. Pressing again, exits back to normal mode. ;Also now, Mute 1 & 2 leds flash slowly to indicate that you are in programming mode. ;Also Mute 1 & 2 buttons are inc and dec respectively as well as Fsw 1 & 2 being inc and dec through ; the 128 sounds plus a blank between sound 127 and 0 on all 4 parts. ; Press a button to select it, press again to write in. All other controls work ; as normal. If a preset sound button is pressed then the sound is stored at ; this button, the reverb settings are also stored. ;If Rh1 Mute and Rh1-12 button held down at startup as above but MT32 sound-bank ; is used instead of GM bank. Reload factory presets to clear to GM Bank. ; ;To reload factory presets : Hold Chord Bank Button at power up. ; ;If Rh1-1 & Rh1-6 held down at power-on then Right-hand (Chan1) is converted to ; to Chan3 so Rhand plays the bass section. Holding buttons again at power-up ; toggles this mode which is otherwise 'remembered' in eeprom. ; ;If Rh2-1 & 6 held at power on, then 'Cavagnolo' compatibility of receiving ; Righthand on Ch16, Chords on 14 & Bass on 15 is enabled (reverse of previous versions). ; This is stored in EEPROM. Reload factory presets to cancel. ; ;If Rh2 7 & 12 held at power on, ATSAM9773 internal chip test performed, gives 3 ; sine tones out - see section. Useful as module check without MIDI. To exit press Rh2-8 ; & Rh2-11 together or power down/up. ; ;If Mute Rh2 held at power up, unit turns into GM module, no controls, just ; activity Led which blinks with recognised MIDI messages.(Analogue Master Vol ; only works). ; ;In normal operation 2 mutes held together produce alternate Rh1 to Rh2 mode. ; Rh2 mute toggles & Rh1 exits to normal mute modes. ; ;If Bass Bank (Change) button held at power-up, notes only (minimal) mode is ; toggled, where only MIDI note on/off info is responded to. Control change, ; program change etc are rejected. ; ;Percussion on/off if held down more than 1.5s, will turn LH Manual percussion ; on and Bass and Chord bank leds will flash quickly and Bass Fx control will ; set bass percussion volume level while Chord Fx control will set chord ; percussion volume level relative to bass or chord notes.Settings are ; remembered. ; ;Tremolo on/off button if held in more than 1.5s, will turn Rh1 Fx control into ; trem speeed and Rh2 Fx control into trem depth. Tremolo works on Rh1 & 2. ; Settings are remembered. ; ;Auto-repeat function has been removed - was never implemented physically. ; ;This version has a footswitch assignable pitch-bend (down up to a tone) ; effect button. Hold in until bass & chords leds flah for editing. BassFx control is recovery ; time, ChordFx is bend down pitch. Button is used to test amount of effect so hold button in ; again until leds stop flashing to store setting and exit. ; ;3 alternate drum set select buttons. Hold in for editing of bass and chord percussion. ; Each set has volume amounts which are memorized. ; ;Version 7C0+ adds MASTER TUNNING CONTROL. Hold Mute RH2 button in for ; 1.5secs until RH2 Mute Led starts flashing, RH2 Reverb control is now Master Tune ; control (A440 in centre), variable over approx 1/4 tone = +-1/8 tone. Press again to ; cancel. Value is stored in eeprom. ; ;Volume controls use midi Control 07 volume. ;Solo funtion uses control 11 expression [Rh1 & 2 only (chs 1,5,4)] Bass and chords ; use expression function as level correction only. ;Tremolo uses after touch pressure. Amplitude function set by sysx command. ;---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- include "p18f452.inc" ; ;Configuration bits:- config OSC = HSPLL ;OSCILLATOR IS HSPLL config OSCS = OFF ;OSCILLATOR SWITCH OFF. config PWRT = ON ;POWERUP TIMER ON. config BOR = ON ;BROWN OUT RESET IS ON. config BORV = 27 ;BROWN OUT VOLTAGE IS 2.7V. config WDT = OFF ;WATCHDOG TIMER IS OFF. config CCP2MUX = OFF ;DISABLE (RB3). config STVR = ON ;STACK OVERFLOW RESET. config LVP = OFF ;LV ICSP. CONFIG DEBUG = OFF ;BACKGROUND DEBUGGER. CONFIG CP0 = ON ;CODE PROTECTION BLOCK 0. CONFIG CP1 = ON ;CODE PROTECTION BLOCK 1. CONFIG CP2 = ON ;CODE PROTECTION BLOCK 2. CONFIG CP3 = ON ;CODE PROTECTION BLOCK 3. CONFIG CPB = ON ;CODE PROTECT BOOT BOOT BLOCK. CONFIG WRT0 = OFF ;WRITE PROTECT BLOCK 0. CONFIG WRT1 = OFF ;WRITE PROTECT BLOCK 1. CONFIG WRT2 = OFF ;WRITE PROTECT BLOCK 2. CONFIG WRT3 = OFF ;WRITE PROTECT BLOCK 3. CONFIG WRTB = OFF ;WRITE PROTECT BOOT BLOCK. CONFIG WRTC = OFF ;CONFIGURATION REGISTER WRITE PROTECT. CONFIG WRTD = OFF ;DATA EEPROM WRITE PROTECT. CONFIG EBTR0 = ON ;TABLE READ PROTECT BLOCK 0. CONFIG EBTR1 = ON ;TABLE READ PROTECT BLOCK 1. CONFIG EBTR2 = ON ;TABLE READ PROTECT BLOCK 2. CONFIG EBTR3 = ON ;TABLE READ PROTECT BLOCK 3. CONFIG EBTRB = ON ;BOOT BLOCK TABLE READ PROTECT. ; ;CONSTANT EQUATES: ; W equ D'0' ;(WREG). F equ D'1' ;(FILE). ;MIDISTAT. MIDI_RTS_FLAG equ D'0' ;IN MIDISTAT. SNDTRY_FLAG equ D'1' ; RS_FLAG equ D'2' ;RUNNING STATUS SET FLAG. DB1_FLAG equ D'3' ;DataByte1 Flag. DB2_FLAG equ D'4' ;DataByte2 Flag SINGLE_FLAG equ D'5' ;Single DataByte Flag. AS_FLAG equ D'6' ; NOSTAT_FLAG equ D'7' ;1st TIME IN STATUS FLAG. ;DISPLAYREG. - HOLDS LED CONDITIONS. MUTE2LED equ D'0' ;RH2 MUTE LED. DISPLAYREG. GREEN equ D'1' ;IN DISPLAY REG. MUTE1LED equ D'2' ;RH1 MUTE LED. DISPLAYREG. MIDI_LED equ D'3' ; CHORDBANK equ D'4' ;CHORD BANK LED. ON = BANK A. BASSBANK equ D'5' ;BASS BANK LED. ON = BANK A. ;MIDISTAT2. CH4LAYER_FLAG equ D'0' ;IN MIDISTAT2. CH6ON_FLAG equ D'1' ;IN MIDISTAT2. CH6MUTE_FLAG equ D'2' ;IN MIDISTAT2. CH4SB_FLAG equ D'3' ;IN MIDISTAT2. DBIGNOR_FLAG equ D'4' ;IN MIDISTAT2. SENDSNG_FLAG equ D'5' ;IN MIDISTAT2. SEND2DB_FLAG equ D'6' ;IN MIDISTAT2. CH5COND_FLAG equ D'7' ;IN MIDISTAT2. ;GENFLAGS1. NORPN_FLAG equ D'0' ;IN GENFLAGS1. BASSOCTBIT equ D'1' ;IN GENFLAGS1. CHORDOCTBIT equ D'2' ;IN GENFLAGS1. RH1OCTBIT equ D'3' ;IN GENFLAGS1. RH2OCTBIT equ D'4' ;IN GENFLAGS1. MUTE_FLAG equ D'5' ;IN GENFLAGS1. MUTE1_FLAG equ D'6' ;IN GENFLAGS1. MUTE2_FLAG equ D'7' ;IN GENFLAGS1. ;GENFLAGS2. FSW1ON_FLAG equ D'0' ;IN GENFLAGS2. FSWON2_FLAG equ D'1' ;IN GENFLAGS2. FSW_FLAG equ D'2' ;IN GENFLAGS2. SNG2_FLAG equ D'3' ;IN GENFLAGS2. DB12_FLAG equ D'4' ;IN GENFLAGS2. DB22_FLAG equ D'5' ;IN GENFLAGS2. CH5ON_FLAG equ D'6' ;IN GENFLAGS2. CH5MUTE_FLAG equ D'7' ;IN GENFLAGS2. ;GENFLAGS3. MUTOG_FLAG equ D'0' ;TOGGLE MUTE RH1 TO RH2. RH224OCTD_BIT equ D'1' ; CH4FIRST_FLAG equ D'2' ;FIRST TIME DETECT CH4 FLAG. PERCON2_BIT equ D'3' ;ENABLE Ch10 PERCUSSION ON Ch2. PERCON3_BIT equ D'4' ;ENABLE Ch10 PERCUSSION ON Ch3. ;PRTA_EN_BIT equ D'5' ;PORTAMENTO ENABLE. DRM1_BIT equ D'6' ;PERCUSSION ON/OFF (FROM FSW4). PERCVOLED_BIT equ D'7' ;PERCUSSION EDIT FLAG. ;GENFLAGS4. ;REPEATEN_BIT equ D'0' ;AUTO REPEAT ON/OFF. CHANCONV_BIT equ D'1' ;Channel convert for other systems. BLANK_RH1_FLAG equ D'2' ;PROGRAM A BLANK FLAG RH1. BLANK_RH2_FLAG equ D'3' ;PROGRAM A BLANK FLAG RH2. BASVEL0_FLAG equ D'4' ; CHDVEL0_FLAG equ D'5' ; ;DRMBWAIT_BIT equ D'6' ; BASS_RNG_BIT equ D'7' ; ;GENFLAGS5. EDBASBIT equ D'0' ;CONTROLS FOR TEST SOUND EDIT MODE. EDCHDBIT equ D'1' ;CONTROLS FOR TEST SOUND EDIT MODE. EDRH1BIT equ D'2' ;CONTROLS FOR TEST SOUND EDIT MODE. EDRH2BIT equ D'3' ;CONTROLS FOR TEST SOUND EDIT MODE. RH1OCTUPBIT equ D'4' ;RH1 OCTAVE UP. PORTA_BIT equ D'5' ;PORTAMENTO ON/OFF. ;TREMWAIT_BIT equ D'6' ;WAIT TIME FOR PORTAM TO BE ON. ;TREMSPDED_BIT equ D'7' ;PORTAMENTO ON TIME FLAG. ;GENFLAGS6. ;TREMONCEBIT equ D'0' ;SEND TREMELO ON ONCE ONLY. RPT2_INPROG equ D'1' ;REPEAT Ch4 NOTE1 ON ;TREMVOLED_BIT equ D'2' ;READY TO START REPEAT. ;TREMON_BIT equ D'3' ;TREMELO ON/OFF. SYSX11_B7_FLG equ D'4' ;SYSX 11, BYTE 7 FLAG. RHINSTCHNG equ D'5' ;RH INSTRUMENT BUTTON CHANGE. NOTESONLY equ D'6' ;NOTES ONLY BIT. ;RPT1_INPROG equ D'7' ;REPEAT1 IN PROGRESS BIT. ;GENFLAGS7. TREMVOLED_BIT equ D'0' ;TREMOLO EDIT ROUTINE. TREMTOG_FLAG equ D'1' ;TREMOLO EDIT ROUTINE. TREMWAIT_BIT equ D'2' ;TREMOLO EDIT ROUTINE. ;TREMSPDED_BIT equ D'3' ;TREMOLO EDIT ROUTINE. ;TREMONCEBIT equ D'4' ;TREMOLO EDIT ROUTINE. TREMON_BIT equ D'5' ;TREMOLO EDIT ROUTINE. ;GENFLAGS8. RH1L3EN equ D'0' ;RH1 LAYER 3 ENABLE. PB_EN_BIT equ D'1' ;PRESET PITCH-BEND ENABLE. PBHOLD_BIT equ D'3' ;PB BUTTON HOLD DOWN. DRM2_BIT equ D'4' ;DRUMSET 2 SELECT BIT. DRM3_BIT equ D'5' ;DRUMSET 3 SELECT BIT. CHAN1TO3_BIT equ D'6' ;RH1 CONVERT TO BASS CH3. CANCEL1TO3_BIT equ D'7' ;RH1 CONVERT TO BASS CH3 CANCEL. ;GENFLAGS9. MTUNED_FLAG equ D'0' ;MASTER TUNE MODE SET FLAG. MTWAIT_BIT equ D'1' ;MASTER TUNE MTTOG_FLAG equ D'2' ;MASTER TUNE DRM1WAIT_BIT equ D'3' ; DRM1TOG_FLAG equ D'4' ; DRM3TOG_FLAG equ D'5' ; DRM2WAIT_BIT equ D'6' ; DRM2TOG_FLAG equ D'7' ; ;GENFLAGS10. DRM3WAIT_BIT equ D'0' ;DRUMS3 EDITS. DIP_CHNG_LED equ D'1' ; MIDI_LED_FLAG equ D'2' ; STM_MUTDEC_FLAG equ D'3' ;SOUNDTRYOUT MODE FLAG FOR MUTE BUTTON. STM_MUTINC_FLAG equ D'4' ;SOUNDTRYOUT MODE FLAG FOR MUTE BUTTON. TREMHOLD_FLAG equ D'5' ;A TREMOLO ROUTINE FLAG. ;GENFLAGS11. SOLOTOG_FLAG equ D'0' ;SOLO ROUTINE BITS. SOLO_BIT equ D'1' ; SOLOWAIT_BIT equ D'2' ; SOLOVOLED_BIT equ D'3' ; SOLOSTAT_BIT equ D'4' ; ;GENFLAGS12 BENDVOLED_BIT equ D'0' ;BEND EDIT MODE IS NOW OFF. BENDTOG_FLAG equ D'1' ;FIRST TIME IN FLAG. BENDWAIT_BIT equ D'2' ;SET EDIT MODE OFF. BENDTERM_BIT equ D'3' ;BEND EDIT EXIT. ;FSW1ASIGNREG FSW1_MRH2_BIT equ D'0' ;IN FSW1ASIGNREG FSW1_ORH2_BIT equ D'1' ;IN FSW1ASIGNREG FSW1_MRH1_BIT equ D'2' ;IN FSW1ASIGNREG FSW1_ORH1_BIT equ D'3' ;IN FSW1ASIGNREG FSW1_OCHD_BIT equ D'4' ;IN FSW1ASIGNREG FSW1_OBAS_BIT equ D'5' ;IN FSW1ASIGNREG ; FSW2_MRH2_BIT equ D'0' ;IN FSW2ASIGNREG FSW2_ORH2_BIT equ D'1' ;IN FSW2ASIGNREG FSW2_MRH1_BIT equ D'2' ;IN FSW2ASIGNREG FSW2_ORH1_BIT equ D'3' ;IN FSW2ASIGNREG FSW2_OCHD_BIT equ D'4' ;IN FSW2ASIGNREG FSW2_OBAS_BIT equ D'5' ;IN FSW2ASIGNREG ; FSW3_MRH2_BIT equ D'0' ;IN FSW3ASIGNREG FSW3_ORH2_BIT equ D'1' ;IN FSW3ASIGNREG FSW3_MRH1_BIT equ D'2' ;IN FSW3ASIGNREG FSW3_ORH1_BIT equ D'3' ;IN FSW3ASIGNREG FSW3_OCHD_BIT equ D'4' ;IN FSW3ASIGNREG FSW3_OBAS_BIT equ D'5' ;IN FSW3ASIGNREG ; FSW4_MRH2_BIT equ D'0' ;IN FSW4ASIGNREG FSW4_ORH2_BIT equ D'1' ;IN FSW4ASIGNREG FSW4_MRH1_BIT equ D'2' ;IN FSW4ASIGNREG FSW4_ORH1_BIT equ D'3' ;IN FSW4ASIGNREG FSW4_OCHD_BIT equ D'4' ;IN FSW4ASIGNREG FSW4_OBAS_BIT equ D'5' ;IN FSW4ASIGNREG ; FSW1_BAS1_BIT equ D'0' ;IN FSW1ASIGNREGBA FSW1_BAS2_BIT equ D'1' ;IN FSW1ASIGNREGBA FSW1_BAS3_BIT equ D'2' ;IN FSW1ASIGNREGBA FSW1_BAS4_BIT equ D'3' ;IN FSW1ASIGNREGBA FSW1_BAS5_BIT equ D'4' ;IN FSW1ASIGNREGBA FSW1_BAS6_BIT equ D'5' ;IN FSW1ASIGNREGBA FSW1_BAS8_BIT equ D'6' ;IN FSW1ASIGNREGBA ; FSW1_CHD1_BIT equ D'0' ;IN FSW1ASIGNREGCH FSW1_CHD2_BIT equ D'1' ;IN FSW1ASIGNREGCH FSW1_CHD3_BIT equ D'2' ;IN FSW1ASIGNREGCH FSW1_CHD4_BIT equ D'3' ;IN FSW1ASIGNREGCH FSW1_CHD5_BIT equ D'4' ;IN FSW1ASIGNREGCH FSW1_CHD6_BIT equ D'5' ;IN FSW1ASIGNREGCH FSW1_CHD8_BIT equ D'6' ;IN FSW1ASIGNREGCH ; FSW1_RH111_BIT equ D'0' ;IN FSW1ASIGNREG11 FSW1_RH112_BIT equ D'1' ;IN FSW1ASIGNREG11 FSW1_RH113_BIT equ D'2' ;IN FSW1ASIGNREG11 FSW1_RH114_BIT equ D'3' ;IN FSW1ASIGNREG11 FSW1_RH115_BIT equ D'4' ;IN FSW1ASIGNREG11 FSW1_RH116_BIT equ D'5' ;IN FSW1ASIGNREG11 FSW1_RH118_BIT equ D'6' ;IN FSW1ASIGNREG11 ; FSW1_RH121_BIT equ D'0' ;IN FSW1ASIGNREG12 FSW1_RH122_BIT equ D'1' ;IN FSW1ASIGNREG12 FSW1_RH123_BIT equ D'2' ;IN FSW1ASIGNREG12 FSW1_RH124_BIT equ D'3' ;IN FSW1ASIGNREG12 FSW1_RH125_BIT equ D'4' ;IN FSW1ASIGNREG12 FSW1_RH126_BIT equ D'5' ;IN FSW1ASIGNREG12 FSW1_RH128_BIT equ D'6' ;IN FSW1ASIGNREG12 ; FSW1_RH211_BIT equ D'0' ;IN FSW1ASIGNREG21 FSW1_RH212_BIT equ D'1' ;IN FSW1ASIGNREG21 FSW1_RH213_BIT equ D'2' ;IN FSW1ASIGNREG21 FSW1_RH214_BIT equ D'3' ;IN FSW1ASIGNREG21 FSW1_RH215_BIT equ D'4' ;IN FSW1ASIGNREG21 FSW1_RH216_BIT equ D'5' ;IN FSW1ASIGNREG21 FSW1_RH218_BIT equ D'6' ;IN FSW1ASIGNREG21 ; FSW1_RH221_BIT equ D'0' ;IN FSW1ASIGNREG22 FSW1_RH222_BIT equ D'1' ;IN FSW1ASIGNREG22 FSW1_RH223_BIT equ D'2' ;IN FSW1ASIGNREG22 FSW1_RH224_BIT equ D'3' ;IN FSW1ASIGNREG22 FSW1_RH225_BIT equ D'4' ;IN FSW1ASIGNREG22 FSW1_RH226_BIT equ D'5' ;IN FSW1ASIGNREG22 FSW1_RH227_BIT equ D'6' ;IN FSW1ASIGNREG22 ; FSW2_BAS1_BIT equ D'0' ;IN FSW2ASIGNREGBA FSW2_BAS2_BIT equ D'1' ;IN FSW2ASIGNREGBA FSW2_BAS3_BIT equ D'2' ;IN FSW2ASIGNREGBA FSW2_BAS4_BIT equ D'3' ;IN FSW2ASIGNREGBA FSW2_BAS5_BIT equ D'4' ;IN FSW2ASIGNREGBA FSW2_BAS6_BIT equ D'5' ;IN FSW2ASIGNREGBA FSW2_BAS8_BIT equ D'6' ;IN FSW2ASIGNREGBA ; FSW2_CHD1_BIT equ D'0' ;IN FSW2ASIGNREGCH FSW2_CHD2_BIT equ D'1' ;IN FSW2ASIGNREGCH FSW2_CHD3_BIT equ D'2' ;IN FSW2ASIGNREGCH FSW2_CHD4_BIT equ D'3' ;IN FSW2ASIGNREGCH FSW2_CHD5_BIT equ D'4' ;IN FSW2ASIGNREGCH FSW2_CHD6_BIT equ D'5' ;IN FSW2ASIGNREGCH FSW2_CHD8_BIT equ D'6' ;IN FSW2ASIGNREGCH ; FSW2_RH111_BIT equ D'0' ;IN FSW2ASIGNREG11 FSW2_RH112_BIT equ D'1' ;IN FSW2ASIGNREG11 FSW2_RH113_BIT equ D'2' ;IN FSW2ASIGNREG11 FSW2_RH114_BIT equ D'3' ;IN FSW2ASIGNREG11 FSW2_RH115_BIT equ D'4' ;IN FSW2ASIGNREG11 FSW2_RH116_BIT equ D'5' ;IN FSW2ASIGNREG11 FSW2_RH118_BIT equ D'6' ;IN FSW2ASIGNREG11 ; FSW2_RH121_BIT equ D'0' ;IN FSW2ASIGNREG12 FSW2_RH122_BIT equ D'1' ;IN FSW2ASIGNREG12 FSW2_RH123_BIT equ D'2' ;IN FSW2ASIGNREG12 FSW2_RH124_BIT equ D'3' ;IN FSW2ASIGNREG12 FSW2_RH125_BIT equ D'4' ;IN FSW2ASIGNREG12 FSW2_RH126_BIT equ D'5' ;IN FSW2ASIGNREG12 FSW2_RH128_BIT equ D'6' ;IN FSW2ASIGNREG12 ; FSW2_RH211_BIT equ D'0' ;IN FSW2ASIGNREG21 FSW2_RH212_BIT equ D'1' ;IN FSW2ASIGNREG21 FSW2_RH213_BIT equ D'2' ;IN FSW2ASIGNREG21 FSW2_RH214_BIT equ D'3' ;IN FSW2ASIGNREG21 FSW2_RH215_BIT equ D'4' ;IN FSW2ASIGNREG21 FSW2_RH216_BIT equ D'5' ;IN FSW2ASIGNREG21 FSW2_RH218_BIT equ D'6' ;IN FSW2ASIGNREG21 ; FSW2_RH221_BIT equ D'0' ;IN FSW2ASIGNREG22 FSW2_RH222_BIT equ D'1' ;IN FSW2ASIGNREG22 FSW2_RH223_BIT equ D'2' ;IN FSW2ASIGNREG22 FSW2_RH224_BIT equ D'3' ;IN FSW2ASIGNREG22 FSW2_RH225_BIT equ D'4' ;IN FSW2ASIGNREG22 FSW2_RH226_BIT equ D'5' ;IN FSW2ASIGNREG22 FSW2_RH227_BIT equ D'6' ;IN FSW2ASIGNREG22 ; FSW3_BAS1_BIT equ D'0' ;IN FSW3ASIGNREGBA FSW3_BAS2_BIT equ D'1' ;IN FSW3ASIGNREGBA FSW3_BAS3_BIT equ D'2' ;IN FSW3ASIGNREGBA FSW3_BAS4_BIT equ D'3' ;IN FSW3ASIGNREGBA FSW3_BAS5_BIT equ D'4' ;IN FSW3ASIGNREGBA FSW3_BAS6_BIT equ D'5' ;IN FSW3ASIGNREGBA FSW3_BAS8_BIT equ D'6' ;IN FSW3ASIGNREGBA ; FSW3_CHD1_BIT equ D'0' ;IN FSW3ASIGNREGCH FSW3_CHD2_BIT equ D'1' ;IN FSW3ASIGNREGCH FSW3_CHD3_BIT equ D'2' ;IN FSW3ASIGNREGCH FSW3_CHD4_BIT equ D'3' ;IN FSW3ASIGNREGCH FSW3_CHD5_BIT equ D'4' ;IN FSW3ASIGNREGCH FSW3_CHD6_BIT equ D'5' ;IN FSW3ASIGNREGCH FSW3_CHD8_BIT equ D'6' ;IN FSW3ASIGNREGCH ; FSW3_RH111_BIT equ D'0' ;IN FSW3ASIGNREG11 FSW3_RH112_BIT equ D'1' ;IN FSW3ASIGNREG11 FSW3_RH113_BIT equ D'2' ;IN FSW3ASIGNREG11 FSW3_RH114_BIT equ D'3' ;IN FSW3ASIGNREG11 FSW3_RH115_BIT equ D'4' ;IN FSW3ASIGNREG11 FSW3_RH116_BIT equ D'5' ;IN FSW3ASIGNREG11 FSW3_RH118_BIT equ D'6' ;IN FSW3ASIGNREG11 ; FSW3_RH121_BIT equ D'0' ;IN FSW3ASIGNREG12 FSW3_RH122_BIT equ D'1' ;IN FSW3ASIGNREG12 FSW3_RH123_BIT equ D'2' ;IN FSW3ASIGNREG12 FSW3_RH124_BIT equ D'3' ;IN FSW3ASIGNREG12 FSW3_RH125_BIT equ D'4' ;IN FSW3ASIGNREG12 FSW3_RH126_BIT equ D'5' ;IN FSW3ASIGNREG12 FSW3_RH128_BIT equ D'6' ;IN FSW3ASIGNREG12 ; FSW3_RH211_BIT equ D'0' ;IN FSW3ASIGNREG21 FSW3_RH212_BIT equ D'1' ;IN FSW3ASIGNREG21 FSW3_RH213_BIT equ D'2' ;IN FSW3ASIGNREG21 FSW3_RH214_BIT equ D'3' ;IN FSW3ASIGNREG21 FSW3_RH215_BIT equ D'4' ;IN FSW3ASIGNREG21 FSW3_RH216_BIT equ D'5' ;IN FSW3ASIGNREG21 FSW3_RH218_BIT equ D'6' ;IN FSW3ASIGNREG21 ; FSW3_RH221_BIT equ D'0' ;IN FSW3ASIGNREG22 FSW3_RH222_BIT equ D'1' ;IN FSW3ASIGNREG22 FSW3_RH223_BIT equ D'2' ;IN FSW3ASIGNREG22 FSW3_RH224_BIT equ D'3' ;IN FSW3ASIGNREG22 FSW3_RH225_BIT equ D'4' ;IN FSW3ASIGNREG22 FSW3_RH226_BIT equ D'5' ;IN FSW3ASIGNREG22 FSW3_RH227_BIT equ D'6' ;IN FSW3ASIGNREG22 ; FSW4_BAS1_BIT equ D'0' ;IN FSW4ASIGNREGBA FSW4_BAS2_BIT equ D'1' ;IN FSW4ASIGNREGBA FSW4_BAS3_BIT equ D'2' ;IN FSW4ASIGNREGBA FSW4_BAS4_BIT equ D'3' ;IN FSW4ASIGNREGBA FSW4_BAS5_BIT equ D'4' ;IN FSW4ASIGNREGBA FSW4_BAS6_BIT equ D'5' ;IN FSW4ASIGNREGBA FSW4_BAS8_BIT equ D'6' ;IN FSW4ASIGNREGBA ; FSW4_CHD1_BIT equ D'0' ;IN FSW4ASIGNREGCH FSW4_CHD2_BIT equ D'1' ;IN FSW4ASIGNREGCH FSW4_CHD3_BIT equ D'2' ;IN FSW4ASIGNREGCH FSW4_CHD4_BIT equ D'3' ;IN FSW4ASIGNREGCH FSW4_CHD5_BIT equ D'4' ;IN FSW4ASIGNREGCH FSW4_CHD6_BIT equ D'5' ;IN FSW4ASIGNREGCH FSW4_CHD8_BIT equ D'6' ;IN FSW4ASIGNREGCH ; FSW4_RH111_BIT equ D'0' ;IN FSW4ASIGNREG11 FSW4_RH112_BIT equ D'1' ;IN FSW4ASIGNREG11 FSW4_RH113_BIT equ D'2' ;IN FSW4ASIGNREG11 FSW4_RH114_BIT equ D'3' ;IN FSW4ASIGNREG11 FSW4_RH115_BIT equ D'4' ;IN FSW4ASIGNREG11 FSW4_RH116_BIT equ D'5' ;IN FSW4ASIGNREG11 FSW4_RH118_BIT equ D'6' ;IN FSW4ASIGNREG11 ; FSW4_RH121_BIT equ D'0' ;IN FSW4ASIGNREG12 FSW4_RH122_BIT equ D'1' ;IN FSW4ASIGNREG12 FSW4_RH123_BIT equ D'2' ;IN FSW4ASIGNREG12 FSW4_RH124_BIT equ D'3' ;IN FSW4ASIGNREG12 FSW4_RH125_BIT equ D'4' ;IN FSW4ASIGNREG12 FSW4_RH126_BIT equ D'5' ;IN FSW4ASIGNREG12 FSW4_RH128_BIT equ D'6' ;IN FSW4ASIGNREG12 ; FSW4_RH211_BIT equ D'0' ;IN FSW4ASIGNREG21 FSW4_RH212_BIT equ D'1' ;IN FSW4ASIGNREG21 FSW4_RH213_BIT equ D'2' ;IN FSW4ASIGNREG21 FSW4_RH214_BIT equ D'3' ;IN FSW4ASIGNREG21 FSW4_RH215_BIT equ D'4' ;IN FSW4ASIGNREG21 FSW4_RH216_BIT equ D'5' ;IN FSW4ASIGNREG21 FSW4_RH218_BIT equ D'6' ;IN FSW4ASIGNREG21 ; FSW4_RH221_BIT equ D'0' ;IN FSW4ASIGNREG22 FSW4_RH222_BIT equ D'1' ;IN FSW4ASIGNREG22 FSW4_RH223_BIT equ D'2' ;IN FSW4ASIGNREG22 FSW4_RH224_BIT equ D'3' ;IN FSW4ASIGNREG22 FSW4_RH225_BIT equ D'4' ;IN FSW4ASIGNREG22 FSW4_RH226_BIT equ D'5' ;IN FSW4ASIGNREG22 FSW4_RH227_BIT equ D'6' ;IN FSW4ASIGNREG22 ;RECFLAGS1. REC_BAS1_BIT equ D'0' ;IN RECFLAGS1. REC_BAS2_BIT equ D'1' ; REC_BAS3_BIT equ D'2' ; REC_BAS4_BIT equ D'3' ; REC_BAS5_BIT equ D'4' ; REC_BAS6_BIT equ D'5' ; ; REC_CHD1_BIT equ D'0' ;;IN RECFLAGS2. REC_CHD2_BIT equ D'1' ; REC_CHD3_BIT equ D'2' ; REC_CHD4_BIT equ D'3' ; REC_CHD5_BIT equ D'4' ; REC_CHD6_BIT equ D'5' ; ; REC_RH11_BIT equ D'0' ;;IN RECFLAGS3. REC_RH12_BIT equ D'1' ; REC_RH13_BIT equ D'2' ; REC_RH14_BIT equ D'3' ; REC_RH15_BIT equ D'4' ; REC_RH16_BIT equ D'5' ; ; REC_RH17_BIT equ D'0' ;;IN RECFLAGS4. REC_RH18_BIT equ D'1' ; REC_RH19_BIT equ D'2' ; REC_RH110_BIT equ D'3' ; REC_RH111_BIT equ D'4' ; REC_RH112_BIT equ D'5' ; ; REC_RH21_BIT equ D'0' ;;IN RECFLAGS5. REC_RH22_BIT equ D'1' ; REC_RH23_BIT equ D'2' ; REC_RH24_BIT equ D'3' ; REC_RH25_BIT equ D'4' ; REC_RH26_BIT equ D'5' ; ; REC_RH27_BIT equ D'0' ;IN RECFLAGS6. REC_RH28_BIT equ D'1' ; REC_RH29_BIT equ D'2' ; REC_RH210_BIT equ D'3' ; REC_RH211_BIT equ D'4' ; REC_RH212_BIT equ D'5' ; ; REC_BAS7_BIT equ D'0' ;IN RECFLAGS7. REC_BAS8_BIT equ D'1' ; REC_BAS9_BIT equ D'2' ; REC_BAS10_BIT equ D'3' ; REC_BAS11_BIT equ D'4' ; REC_BAS12_BIT equ D'5' ; ; REC_CHD7_BIT equ D'0' ;IN RECFLAGS8. REC_CHD8_BIT equ D'1' ; REC_CHD9_BIT equ D'2' ; REC_CHD10_BIT equ D'3' ; REC_CHD11_BIT equ D'4' ; REC_CHD12_BIT equ D'5' ; ; BASS1_FLAG equ D'0' ;BASS 1. BASS2_FLAG equ D'1' ;BASS 2. BASS3_FLAG equ D'2' ;BASS 3. BASS4_FLAG equ D'3' ;BASS 4. BASS5_FLAG equ D'4' ;BASS 5. BASS6_FLAG equ D'5' ;BASS 6. ; CHORD1_FLAG equ D'0' ;CHORD 1. CHORD2_FLAG equ D'1' ;CHORD 2. CHORD3_FLAG equ D'2' ;CHORD 3. CHORD4_FLAG equ D'3' ;CHORD 4. CHORD5_FLAG equ D'4' ;CHORD 5. CHORD6_FLAG equ D'5' ;CHORD 6. ; REC_MBAS1_BIT equ D'0' ;IN RECFLAGS9, REC_MBAS2_BIT equ D'1' ; ('RECORD A BLANK' BITS). REC_MBAS3_BIT equ D'2' ; REC_MBAS4_BIT equ D'3' ; REC_MBAS5_BIT equ D'4' ; REC_MBAS6_BIT equ D'5' ; ; REC_MBAS7_BIT equ D'0' ;IN RECFLAGS10. REC_MBAS8_BIT equ D'1' ; REC_MBAS9_BIT equ D'2' ; REC_MBAS10_BIT equ D'3' ; REC_MBAS11_BIT equ D'4' ; REC_MBAS12_BIT equ D'5' ; ; REC_MCHD1_BIT equ D'0' ;IN RECFLAGS11. REC_MCHD2_BIT equ D'1' ; REC_MCHD3_BIT equ D'2' ; REC_MCHD4_BIT equ D'3' ; REC_MCHD5_BIT equ D'4' ; REC_MCHD6_BIT equ D'5' ; ; REC_MCHD7_BIT equ D'0' ;IN RECFLAGS12. REC_MCHD8_BIT equ D'1' ; REC_MCHD9_BIT equ D'2' ; REC_MCHD10_BIT equ D'3' ; REC_MCHD11_BIT equ D'4' ; REC_MCHD12_BIT equ D'5' ; ; ;....................................................................................................... RAM_ALLOCATION: ; GENTIME1 equ 0x00 ;INCREMENTED BY TIMER0 INTSRV. MIDITEMP1 equ 0x01 ;TEMPORARY HOLD. MIDITEMP2 equ 0x02 ;TEMPORARY HOLD. MIDIBYTCNT equ 0x03 ;MIDI BYTE IN COUNT. LEDFLASH equ 0x04 ; BASSCANHOLD equ 0x05 ; CHORDSCANHOLD equ 0x06 ; RH11TOOCTHOLD equ 0x07 ; RH17TOMUTHOLD equ 0x08 ; RH21TOOCTHOLD equ 0x09 ; RH27TOMUTHOLD equ 0x0A ; PROGCHHOLD1 equ 0x0B ; PROGCHHOLD2 equ 0x0C ; SCANSTAT equ 0x0D ; SCANDEL equ 0x0E ; SCANTEMP1 equ 0x0F ; ; RH11SCANHOLD equ 0x10 ; RH17SCANHOLD equ 0x11 ; RH21SCANHOLD equ 0x12 ; RH27SCANHOLD equ 0x13 ; MIDISTAT equ 0x14 ;MIDI BYTE SORT STATUS. MIDISENDREG equ 0x15 ;MIDI BYTE SEND. DISPLAYREG equ 0x16 ;LED DISPLAY HOLD. MTEMP equ 0x17 ;MIDI FILTER TEMP HOLD. BASSVOLPOT equ 0x18 ;POT VALUE STORE. BASSFXPOT equ 0x19 ;POT VALUE STORE. CHORDVOLPOT equ 0x1A ;POT VALUE STORE. CHORDFXPOT equ 0x1B ;POT VALUE STORE. RH1VOLPOT equ 0x1C ;POT VALUE STORE. RH1FXPOT equ 0x1D ;POT VALUE STORE. RH2VOLPOT equ 0x1E ;POT VALUE STORE. RH2FXPOT equ 0x1F ;POT VALUE STORE. ; POTSTAT equ 0x20 ;POT SEND STATUS. POTSTORE equ 0x21 ;POT VALUE HOLD. POTCHAN equ 0x22 ;POT CHANNEL HOLD. POTSCNCNT equ 0x23 ;POT SCAN LOOP. POTCONT equ 0x24 ;POT CONTROL NUMBER. AS_TIMER equ 0x25 ;ACTIVE SENSING TIMER. TEMP1 equ 0x26 ;HOLDS Ch.6 STATUS-BYTE. MIDISTAT2 equ 0x27 ; NORPN1 equ 0x28 ;Internal N or RPN MIDI CONTROL HOLD. NORPN2 equ 0x29 ;N or RPN MIDI CONTROL HOLD. NORPN3 equ 0x2A ;N or RPN MIDI CONTROL HOLD. NORPN4 equ 0x2B ;N or RPN MIDI CONTROL HOLD. NORPN5 equ 0x2C ;N or RPN MIDI CONTROL HOLD. NORPN6 equ 0x2D ;N or RPN MIDI CONTROL HOLD. NORPN7 equ 0x2E ;N or RPN MIDI CONTROL HOLD. GENFLAGS1 equ 0x2F ; ; CONTCHAN equ 0x30 ;CONTROL SEND HOLDING. CONTDB1 equ 0x31 ;CONTROL SEND HOLDING. CONTDB2 equ 0x32 ;CONTROL SEND HOLDING. GENFLAGS2 equ 0x33 ;GENERAL FLAGS REG 2. AS_COUNT equ 0x34 ;ACTIVE SENSING LOOP COUNTER. SYSX11BYTE9 equ 0x35 ;BYTE 9 OF 11 BYTE SYSX SEND. SYSX11BYTE8 equ 0x36 ;BYTE 8 OF 11 BYTE SYSX SEND. FSWINHOLD equ 0x37 ;FOOTSWITCH SCAN HOLD. MAINSBHOLD equ 0x38 ; MAINDB1HOLD equ 0x39 ; MAINDB2HOLD equ 0x3A ; PEDTEMP equ 0x3B ;FOOTSWITCH SCAN TEMP. CH4SBHOLD equ 0x3C ; GENFLAGS5 equ 0x3D ; CH4DB2HOLD equ 0x3E ; MAINSNGHOLD equ 0x3F ; ; FSW1ASIGNREG equ 0x40 ;FOOTSWITCH1 FUNCTION FLAGS. FSW2ASIGNREG equ 0x41 ;FOOTSWITCH2 FUNCTION FLAGS. FSW3ASIGNREG equ 0x42 ;FOOTSWITCH3 FUNCTION FLAGS. FSW4ASIGNREG equ 0x43 ;FOOTSWITCH4 FUNCTION FLAGS. ; FSW1ASIGNREG22 equ 0x44 ;FOOTSWITCH1 FUNCTION FLAGS. FSW1ASIGNREG21 equ 0x45 ;FOOTSWITCH1 FUNCTION FLAGS. FSW1ASIGNREG12 equ 0x46 ;FOOTSWITCH1 FUNCTION FLAGS. FSW1ASIGNREG11 equ 0x47 ;FOOTSWITCH1 FUNCTION FLAGS. FSW1ASIGNREGCH equ 0x48 ;FOOTSWITCH1 FUNCTION FLAGS. FSW1ASIGNREGBA equ 0x49 ;FOOTSWITCH1 FUNCTION FLAGS. ; FSW2ASIGNREG22 equ 0x4A ;FOOTSWITCH2 FUNCTION FLAGS. FSW2ASIGNREG21 equ 0x4B ;FOOTSWITCH2 FUNCTION FLAGS. FSW2ASIGNREG12 equ 0x4C ;FOOTSWITCH2 FUNCTION FLAGS. FSW2ASIGNREG11 equ 0x4D ;FOOTSWITCH2 FUNCTION FLAGS. FSW2ASIGNREGCH equ 0x4E ;FOOTSWITCH2 FUNCTION FLAGS. FSW2ASIGNREGBA equ 0x4F ;FOOTSWITCH2 FUNCTION FLAGS. ; FSW3ASIGNREG22 equ 0x50 ;FOOTSWITCH3 FUNCTION FLAGS. FSW3ASIGNREG21 equ 0x51 ;FOOTSWITCH3 FUNCTION FLAGS. FSW3ASIGNREG12 equ 0x52 ;FOOTSWITCH3 FUNCTION FLAGS. FSW3ASIGNREG11 equ 0x53 ;FOOTSWITCH3 FUNCTION FLAGS. FSW3ASIGNREGCH equ 0x54 ;FOOTSWITCH3 FUNCTION FLAGS. FSW3ASIGNREGBA equ 0x55 ;FOOTSWITCH3 FUNCTION FLAGS. ; FSW4ASIGNREG22 equ 0x56 ;FOOTSWITCH4 FUNCTION FLAGS. FSW4ASIGNREG21 equ 0x57 ;FOOTSWITCH4 FUNCTION FLAGS. FSW4ASIGNREG12 equ 0x58 ;FOOTSWITCH4 FUNCTION FLAGS. FSW4ASIGNREG11 equ 0x59 ;FOOTSWITCH4 FUNCTION FLAGS. FSW4ASIGNREGCH equ 0x5A ;FOOTSWITCH4 FUNCTION FLAGS. FSW4ASIGNREGBA equ 0x5B ;FOOTSWITCH4 FUNCTION FLAGS. ; NORPNR1 equ 0x5C ;Ext. 7 BYTE NRPN SEND ROUTINE. NORPNR2 equ 0x5D ;Ext. 7 BYTE NRPN SEND ROUTINE. NORPNR3 equ 0x5E ;Ext. 7 BYTE NRPN SEND ROUTINE. NORPNR4 equ 0x5F ;Ext. 7 BYTE NRPN SEND ROUTINE. NORPNR5 equ 0x60 ;Ext. 7 BYTE NRPN SEND ROUTINE. NORPNR6 equ 0x61 ;Ext. 7 BYTE NRPN SEND ROUTINE. NORPNR7 equ 0x62 ;Ext. 7 BYTE NRPN SEND ROUTINE. ; GENFLAGS3 equ 0x63 ;GENERAL FLAGS REGISTER. TEMP2 equ 0x64 ; ; RECFLAGS1 equ 0x65 ;BASS A EEPROM RECORD FLAGS. RECFLAGS2 equ 0x66 ;CHORD A EEPROM RECORD FLAGS. RECFLAGS3 equ 0x67 ;RH1 EEPROM RECORD FLAGS. RECFLAGS4 equ 0x68 ;RH1 EEPROM RECORD FLAGS. RECFLAGS5 equ 0x69 ;RH2 EEPROM RECORD FLAGS. RECFLAGS6 equ 0x6A ;RH2 EEPROM RECORD FLAGS. RECFLAGS7 equ 0x6B ;BASS B EEPROM RECORD FLAGS. RECFLAGS8 equ 0x6C ;CHORD B EEPROM RECORD FLAGS. ; BYTE1OF3 equ 0x6D ; BYTE2OF3 equ 0x6E ; BYTE3OF3 equ 0x6F ; TEMPHOLD equ 0x70 ; PORTATIMEH equ 0x71 ; SNDTRI equ 0x72 ; ; BASS_FLAGS equ 0x73 ;Shows which bass button active. CHORD_FLAGS equ 0x74 ;Shows which chord button active. CHORUSENDLEV equ 0x75 ;CHORUS SEND LEVEL HOLD. PERCON2TIME equ 0x76 ; PERCON3TIME equ 0x77 ; B1_PERCVOL equ 0x78 ;PERCUSSION VOL LEVEL HOLD. ;FSW4ONTIME equ 0x79 ;FSW4 HOLD-ON TIMER. GENFLAGS4 equ 0x7A ;VARIOUS FLAGS. ;FSW4FLASH equ 0x7B ; ;FSW4ONTIMEA equ 0x7C ;FSW4 HOLD-ON TIMER UNITS. ; EMFLASHTIME equ 0x7D ;EDITMODE LED FLASH TIMER. GENFLAGS12 equ 0x7E ;BEND EDIT FLAGS. ;PRTAONTIMEA equ 0x7F ;TREM HOLD-ON TIMER UNITS. ; GENFLAGS6 equ 0x80 ;GENERAL FLAGS REG 6. LEVEL_ADJ_CH1 equ 0x81 ;INSTRUMENT LEVEL BALANCE CH1. TREMSPEED equ 0x82 ;TREMELO SPEED VALUE HOLD. SYSX11BYTE7 equ 0x83 ;BYTE 7 OF 11 BYTE SYSX SEND. TREMDEPTH equ 0x84 ;TREMELO DEPTH VALUE HOLD. LEVEL_ADJ_CH4 equ 0x85 ;INSTRUMENT LEVEL BALANCE CH4. LEVEL_ADJ_CH5 equ 0x86 ;INSTRUMENT LEVEL BALANCE CH5. T0INTWHOLD equ 0x87 ; T0INTSTATHOLD equ 0x88 ; RH11_OFF_FLAGS equ 0x89 ; RH21_ON_FLAGS equ 0x8A ; RH11ONOFF_FLAGS equ 0x8B ; GENFLAGS7 equ 0x8C ;GENERAL FLAGS REG 7. RH12ONOFF_FLAGS equ 0x8D ; RH21ONOFF_FLAGS equ 0x8E ; RH22ONOFF_FLAGS equ 0x8F ; TEMPS equ 0x90 ; RH21_OFF_FLAGS equ 0x91 ;TREMOLO GENFLAGS8 equ 0x92 ;GENERAL FLAGS REG 8. MRPT01SB11 equ 0x93 ; MRPT01DB11 equ 0x94 ; MRPT01DB21 equ 0x95 ; MRPT01SB12 equ 0x96 ; MRPT01DB12 equ 0x97 ; MRPT01DB22 equ 0x98 ; ;PB_TIME equ 0x99 ;PITCH-BEND TIMER. ;PB_COUNT equ 0x9A ;PITCH-BEND TIME. PB_DEPTH_HI equ 0x9B ;PITCH-BEND DEPTH. MSDs PB_DEC_LO equ 0x9C ;PITCH-BEND DEC VALUE. PBTIMEHOLD equ 0x9D ;PBEND. PB_DEPTH_LO equ 0x9E ;PITCH-BEND DEPTH. LSDs PB_DEC_HI equ 0x9F ;PITCH-BEND DEC VALUE. C1_PERCVOL equ 0xA0 ;CHORDS PERCUSSION VOL LEVEL HOLD. CH2DB2HOLD equ 0xA1 ;CHAN 2 DATA BYTE 2 HOLD. CH3DB2HOLD equ 0xA2 ;CHAN 3 DATA BYTE 2 HOLD. GENFLAGS9 equ 0xA3 ;GENERAL FLAGS REGISTER 9. MTUNDAT1 equ 0xA4 ;MASTER TUNE DATA 1. MTUNDAT2 equ 0xA5 ;MASTER TUNE DATA 2. MTUNDAT3 equ 0xA6 ;MASTER TUNE DATA 3. MTUNDAT4 equ 0xA7 ;MASTER TUNE DATA 4. MTUNEDTIME equ 0xA8 ;MASTER TUNE BUTTON TIME. MTUNEDTIMEA equ 0xA9 ;MASTER TUNE BUTTON TIME. MTUNESCAN_HOLD equ 0xAA ;MASTER TUNE SELECT BUTTON. MTUNCTRL_HOLD equ 0xAB ;MASTER TUNE CONTROL VALUE HOLD. MTUNFLASH equ 0xAC ;MASTER TUNE LED FLASH RATE HOLD. DRM1SCAN_HOLD equ 0xAD ;DRUM1 VOL EDIT. DRM2SCAN_HOLD equ 0xAE ;DRUM2 VOL EDIT. DRM3SCAN_HOLD equ 0xAF ;DRUM3 VOL EDIT DRMEDTIME equ 0xB0 ;DRUM1 VOL EDIT. GENFLAGS10 equ 0xB1 ;GENERAL FLAGS REG. DRM1EDTIME equ 0xB2 ;DRUMS1 HOLD IN BUTTON TIME. POT8FILT equ 0xB3 ;POT7 INPUT FILTER. POT7FILT equ 0xB4 ;POT6 INPUT FILTER. DRM1EDTIMEA equ 0xB5 ;DRUMS1 HOLD IN BUTTON TIME. POT6FILT equ 0xB6 ;POT4 INPUT FILTER. POT5FILT equ 0xB7 ;POT2 INPUT FILTER. C2_PERCVOL equ 0xB8 ;CHORDS2 PERCUSSION VOL LEVEL HOLD. C3_PERCVOL equ 0xB9 ;CHORDS3 PERCUSSION VOL LEVEL HOLD. B2_PERCVOL equ 0xBA ;BASS2 PERCUSSION VOL LEVEL HOLD. B3_PERCVOL equ 0xBB ;BASS3 PERCUSSION VOL LEVEL HOLD. BASS_ON_FLAGS equ 0xBC ; BASS_OFF_FLAGS equ 0xBD ; CHORD_ON_FLAGS equ 0xBE ; CHORD_OFF_FLAGS equ 0xBF ; RH22_ON_FLAGS equ 0xC0 ; RH22_OFF_FLAGS equ 0xC1 ; POT4FILT equ 0xC2 ;POT7 INPUT FILTER. POT3FILT equ 0xC3 ;POT6 INPUT FILTER POT2FILT equ 0xC4 ;POT7 INPUT FILTER. POT1FILT equ 0xC5 ;POT6 INPUT FILTER MIDILEDFLASH equ 0xC6 ; GENFLAGS11 equ 0xC7 ;GENERAL FLAGS REG. SOLOVAL equ 0xC8 ;SOLO LEVEL VALUE. RH12_OFF_FLAGS equ 0xC9 ; RH12_ON_FLAGS equ 0xCA ; SOLOONTIME equ 0xCB ;SOLO ROUTINE TIMERS. SOLOONTIMEA equ 0xCC ;SOLO ROUTINE TIMERS. SOLOVALPOT equ 0xCD ;SOLO ROUTINE BENDVALPOT equ 0xCE ;HOLDS BEND AMOUNT. BENDTIMPOT equ 0xCF ;HOLDS BEND TIME. RH12SCANHOLD equ 0xD0 ; RH11_ON_FLAGS equ 0xD1 ; LEVEL_ADJ_CH7 equ 0xD2 ;RH1 3rd LAYER. PBBUTTIME equ 0xD3 ;BEND BUTTON TIMER. PBBUTTIMEA equ 0xD4 ;BEND BUTTON TIMER MULTIPLIER. ; ;0x200 -> 0x2FF IS MIDI-DATA-IN BUFFER. (0X2F4 -> 0x2FF USED BY ICD2 DEBUGGER, ; IGNORED AS BUFFER WILL NOT NORMALLY FILL UP THIS FAR - BUT BEWARE IF USING DEBUGGER.) ;............................................................................................................................................................................................................... org 0x0000 ;RESET POSITION. BRA STARTUP ; ;....................................................................... org 0x0008 ;LO PRIORITY INTERRUPTS POSITION. BTFSC PIR1, RCIF ;WAS INT INITIATED BY USART Rcv ? GOTO USARTRCVINTSRV ;YES. BTFSC INTCON, TMR0IF ;WAS INT INITIATED BY TIMER0 ? GOTO TIMER0INTSRV ;YES. ; BRA STARTUP ;ERROR ! - AS NO OTHER INTS SET. ;....................................................................... org 0x0018 BRA STARTUP ;HI PRIORITY INTERRUPTS POSITION. ;----------------------------------------------------------------------- STARTUP: ; BSF RCON, POR ;POWER-ON RESET STATUS BIT. BSF RCON, BOR ;RESET BROWN-OUT STATUS BIT. ; CLRF LATA ; CLRF LATB ; CLRF LATC ;~RESET FOR AUDIO SYNTH (RC4) IS LO. CLRF LATD ; CLRF LATE ; ; MOVLW 0x3F ;RA6 & 7 SET AS OUTPUT. MOVWF TRISA ; ; MOVLW 0x40 ;ALL SET AS ANALOGUE INPUTS. Fosc/16. MOVWF ADCON1 ;LEFT JUSTIFIED A/D O/P. MOVLW B'10110001' ;AD on. Fosc/64. AN6 = BASS VOL. MOVWF ADCON0 ; ; MOVLW 0x00 ;RB0->7 SET AS OUTPUTS. MOVWF TRISB ; ; MOVLW 0xE7 ;RC0,1,2,5,6,7 SET AS INPUTS. MOVWF TRISC ; ; MOVLW 0xFF ;RD0->7 SET AS INPUTS. MOVWF TRISD ; (0x7F FOR RD7 AS O/P). ; MOVLW 0x07 ;RE0,1,2 SET AS (ANALOGUE) INPUTS. MOVWF TRISE ; ;..................................................................... CLEAR_ALL_RAM: ; LFSR 0, 0x000 ;BANK 0. CLEARLOOP1: ; CLRF POSTINC0 ; BTFSS FSR0H, 0 ;FSR0 = FSR0H + FSR0L (8BITS EACH). BRA CLEARLOOP1 ; (12 BITS USED IN TOTAL). ;................................................................... MOVLW 0xB1 ;2ms INTERRUPT TIME. MOVWF TMR0H ; MOVLW 0xE0 ;2ms INTERRUPT TIME. MOVWF TMR0L ; ; MOVLW 0x88 ;ENABLE TIMER0 AS 16 BIT. MOVWF T0CON ; NO PRESCALER. ; MOVLW 0xA0 ;ENABLE TMR0 OVERFLOW INTERRUPT. MOVWF INTCON ;E0 BCF INTCON2, TMR0IP ;TIMER0 LOW PRIORITY INT. ;....................................................................... SYNTHRESET2: ; ;BCF PORTC, 4 ;~RESET(RC4) IS ALREADY LOW. CLRF DISPLAYREG ; BSF DISPLAYREG, MIDI_LED ; MOVLW 0x08 ; MOVWF PORTB ;SEND 1 TO RB3, SETS LED TO MIDI_LED. BCF PORTC, 3 ;SEND 0 TO RC3, ENABLE LED COMMON. ; MOVLW 0xFF ;>128ms. LONGISH DELAY TO KEEP SWITCH ON NOISES APART. MOVWF GENTIME1 ; SYNRSWAIT: ;WAIT PERIOD FOR ~RESET. TSTFSZ GENTIME1 ; BRA SYNRSWAIT ; BSF PORTC, 4 ;~RESET(RC4) IS HI (I.E. RUN). ISRUNSET: ;WAIT FOR SYNTH-RUNNING SIGNAL. ; (ATSAM9733 OUTPUT FLAG). BTFSS PORTC, 5 ;IS RUN SET (YES->SYNTH IS READY). BRA ISRUNSET ;NO, WAIT FOR RUN SIGNAL FROM SYNTH. ;....................................................................... MOVLW 0x80 ;MORE THAN 128ms SYNTH CHIP SETTLING TIME. MOVWF GENTIME1 ;THIS IS SYNTH SETTLING DELAY WAIT SYNRSWAIT2: ; PERIOD FOR BEFORE SENDING DATA. TSTFSZ GENTIME1 ; BRA SYNRSWAIT2 ; BSF PORTB, GREEN ;SEND 1 TO RB4, SETS LED TO GREEN. BSF GENFLAGS10, DIP_CHNG_LED ;SEND 1 TO RB4, SETS LED TO GREEN. ;....................................................................... USARTSETUP: ; MOVLW D'19' ;USART. FOR 31.25KBaud.(04). MOVWF SPBRG ;BAUDRATE GEN VALUE. BCF TXSTA, BRGH ;Select LOW baud rate ; BSF RCSTA, CREN ;CONTINUOUS RECEIVE ENABLE. BSF RCSTA, SPEN ;SERIAL PORT ENABLE. ; BCF PIR1, RCIF ;Clear RCIF Interrupt Flag BSF PIE1, RCIE ;Set RCIE Interrupt Enable ;.................................... LFSR 1, 0x200 ;MOVE START OF BANK TO FSR1. LFSR 2, 0x200 ;MOVE START OF BANK TO FSR2. ;.................................... MOVF RCREG, W ;CLEAR RCIF. BSF PIR1, TXIF ;TXIF BSF INTCON, PEIE ;Enable peripheral interrupts. BSF TXSTA, TXEN ; BASIC_SETUP_COMPLETE: ; ;======================================================================================================== SRTCONT1: ;START - REGISTER SETUPS. MOVLW 0x08 ; MOVWF POTSCNCNT ; ; CLRF BASSVOLPOT ; CLRF BASSFXPOT ; CLRF CHORDVOLPOT ; CLRF CHORDFXPOT ; CLRF RH1VOLPOT ; CLRF RH1FXPOT ; CLRF RH2VOLPOT ; CLRF RH2FXPOT ; ; CLRF MIDISTAT ;MIDI BYTE SORT, FLAG REG. CLRF MIDISTAT2 ;MIDI BYTE SORT, FLAG REG. CLRF GENFLAGS1 ;MIDI BYTE SORT, FLAG REG. CLRF GENFLAGS2 ;MIDI BYTE SORT, FLAG REG. CLRF GENFLAGS3 ;GENERAL FLAGS REG 3. CLRF GENFLAGS4 ;GENERAL FLAGS REG 4. CLRF GENFLAGS5 ;GENERAL FLAGS REG 5. CLRF GENFLAGS6 ;GENERAL FLAGS REG 6. CLRF GENFLAGS7 ;GENERAL FLAGS REG 7. CLRF GENFLAGS8 ;GENERAL FLAGS REG 8. CLRF GENFLAGS9 ;GENERAL FLAGS REG 9. CLRF GENFLAGS10 ;GENERAL FLAGS REG 10. CLRF GENFLAGS11 ;GENERAL FLAGS REG 11. CLRF GENFLAGS12 ;GENERAL FLAGS REG 12. CLRF MIDIBYTCNT ;MIDI BUFFER BYTE COUNTER. CLRF SCANDEL ;COUNTER. CLRF BASSCANHOLD ;BASS SCAN HOLD. CLRF CHORDSCANHOLD ;CHORDS SCAN HOLD. CLRF RH11SCANHOLD ; CLRF RH17SCANHOLD ; CLRF RH21SCANHOLD ; CLRF RH27SCANHOLD ; CLRF FSWINHOLD ;FSW SCAN HOLD. CLRF DRM1SCAN_HOLD ; CLRF DRM2SCAN_HOLD ; CLRF DRM3SCAN_HOLD ; ; CLRF POT1FILT ;CONTROL POTENTIOMETER FILTERS. CLRF POT2FILT ;CONTROL POTENTIOMETER FILTERS. CLRF POT3FILT ;CONTROL POTENTIOMETER FILTERS. CLRF POT4FILT ;CONTROL POTENTIOMETER FILTERS. CLRF POT5FILT ;CONTROL POTENTIOMETER FILTERS. CLRF POT6FILT ;CONTROL POTENTIOMETER FILTERS. CLRF POT7FILT ;CONTROL POTENTIOMETER FILTERS. CLRF POT8FILT ;CONTROL POTENTIOMETER FILTERS. ; CLRF RECFLAGS1 ; CLRF RECFLAGS2 ; CLRF RECFLAGS3 ; CLRF RECFLAGS4 ; CLRF RECFLAGS5 ; CLRF RECFLAGS6 ; ; CLRF BASS_ON_FLAGS ; CLRF BASS_OFF_FLAGS ; CLRF CHORD_ON_FLAGS ; CLRF CHORD_OFF_FLAGS ; CLRF RH11_ON_FLAGS ; CLRF RH11_OFF_FLAGS ; CLRF RH12_ON_FLAGS ; CLRF RH12_OFF_FLAGS ; CLRF RH22_ON_FLAGS ; CLRF RH22_OFF_FLAGS ; ; CLRF RH11ONOFF_FLAGS ; CLRF RH12ONOFF_FLAGS ; CLRF RH21ONOFF_FLAGS ; CLRF RH22ONOFF_FLAGS ; ; CALL FSW1REGCLEAR ; CALL FSW2REGCLEAR ; CALL FSW3REGCLEAR ; CALL FSW4REGCLEAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;======================================================================================================== ATSAMTEST: ;ATSAM9773 INTERNAL TEST, IF CLRF PORTB ; RH2-7 & RH2-12 HELD DOWN AT POWER UP. MOVLW 0x01 ; RESULT IS 3 SINE TONES :- MOVWF PORTB ; NOP ; NOP ; NOP ; NOP ; MOVF PORTD, W ; 1st. OF 1.18KHz. 2nd. of 876Hz. ANDLW 0x7F ; 3rd of 295hz continuous for XORLW 0x21 ; internal diags pass. BNZ ATSAMTESTEND ; MOVLW 0xB0 ;SENDS NRPN 3751=23h MOVWF NORPNR1 ; MOVLW 0x63 ;CONTROL #99. MOVWF NORPNR2 ; MOVLW 0x37 ;VALUE. MOVWF NORPNR3 ; MOVLW 0x62 ;CONTROL #98. MOVWF NORPNR4 ; MOVLW 0x51 ;VALUE MOVWF NORPNR5 ; MOVLW 0x06 ;CONTROL #6. MOVWF NORPNR6 ; MOVLW 0x23 ;VALUE. MOVWF NORPNR7 ; CALL NORPN7BYTE ; BSF DISPLAYREG, GREEN ;GREEN LED ONLY LEFT ON. BCF DISPLAYREG, MUTE1LED ;MUTE 1 LED. BCF DISPLAYREG, MUTE2LED ;MUTE 2 LED. BCF DISPLAYREG, MIDI_LED ;SET RB4, MIDI_LED LED TO OFF. MOVFF DISPLAYREG, PORTB ; BCF PORTC, 3 ;ENABLE LED COM BUSS. ; ATSAMTESTLOOP: ; CLRF PORTB ; RH2-8 & RH2-11 HELD DOWN TO EXIT. MOVLW 0x01 ; RESULT IS 3 SINE TONES :- MOVWF PORTB ; NOP ; NOP ; NOP ; NOP ; MOVF PORTD, W ; ANDLW 0x7F ; XORLW 0x12 ;PRESS RH2-8 & RH2-11 TO EXIT TEST TONE LOOP. BNZ ATSAMTESTLOOP ;TONES CONTINUE UNTIL RELEASE BUTTONS PRESSED. ;........................................................................................................................................................................................ ATSAMTESTEND: ; BCF PORTC, 4 ;~RESET(RC4) IS LO. CLRF DISPLAYREG ; BSF DISPLAYREG, MIDI_LED ; MOVLW 0x08 ; MOVWF PORTB ;SEND 1 TO RB3, SETS LED TO MIDI_LED. BCF PORTC, 3 ;SEND 0 TO RC3, ENABLE LED COMMON. ; MOVLW 0x60 ;>128ms. MOVWF GENTIME1 ; ASYNRSWAIT: ;WAIT PERIOD FOR ~RESET. TSTFSZ GENTIME1 ; BRA ASYNRSWAIT ; BSF PORTC, 4 ;~RESET(RC4) IS HI (I.E. RUN). AISRUNSET: ;WAIT FOR SYNTH-RUNNING SIGNAL. ; (ATSAM9733 OUTPUT FLAG). BTFSS PORTC, 5 ;IS RUN SET (YES->SYNTH IS READY). BRA AISRUNSET ;NO, WAIT FOR RUN SIGNAL FROM SYNTH. ;....................................................................... MOVLW 0x80 ;MORE THAN 128ms SYNTH CHIP SETTLING TIME.. MOVWF GENTIME1 ;THIS IS SYNTH SETTLING DELAY WAIT ASYNRSWAIT2: ; PERIOD FOR BEFORE SENDING DATA. TSTFSZ GENTIME1 ; BRA ASYNRSWAIT2 ; BSF PORTB, GREEN ;SEND 1 TO RB4, SETS LED TO GREEN. BSF GENFLAGS10, DIP_CHNG_LED ;SEND 1 TO RB4, SETS LED TO GREEN. ;======================================================================================================== RHTOBASSCHECK: ;CONVERT RH1 (CH1) TO BASS (CH3). CLRF PORTB ; So called orchestral bass mode . MOVLW 0x08 ; RH11 & RH16 HELD DOWN AT POWER UP. MOVWF PORTB ; NOP ; NOP ; NOP ; NOP ; NOP ; MOVF PORTD, W ; ANDLW 0x7F ; XORLW 0x21 ; BNZ RHTOBASSCHKEND ; MOVLW 0xF0 ;EEPROM ADDRESS. MOVWF EEADR ; BCF EECON1, EEPGD ;SELECT DATA EEPROM MEMORY. BCF EECON1, CFGS ; BSF EECON1, RD ;ENABLE EEPROM READ. MOVF EEDATA, W ;VALUE IN WREG. ; BTG WREG, 0 ; ; MOVWF EEDATA ;VALUE TO WRITE. MOVLW 0xF0 ; MOVWF EEADR ;DATA MEMORY TO WRITE TO. CALL EEPROM_WRITE ; RHTOBASSCHKEND: ; CLRF PORTB ; ;-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- CAVAGCOMPATCHECK: ;COMPATIBILITY WITH CAVAGNOLO SYSTEM CLRF PORTB ; ON Ch16, 15, 14. MOVLW 0x02 ; RH21 & RH26 HELD DOWN AT POWER UP. MOVWF PORTB ; NOP ; NOP ; NOP ; NOP ; MOVF PORTD, W ; ANDLW 0x7F ; XORLW 0x21 ; BNZ CAVAGCOMPATEND ; MOVLW 0x00 ;ENABLE 'CAVAGNOLO' COMPATIBILITY. MOVWF EEDATA ;VALUE TO WRITE. MOVLW 0xF9 ; MOVWF EEADR ;DATA MEMORY TO WRITE TO. CALL EEPROM_WRITE ; CAVAGCOMPATEND: ; CLRF PORTB ; ;---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- GMMODULESET: ; MOVLW 0x01 ;RH2MUTE HELD DOWN AT POWER UP. MOVWF PORTB ; RESULT IS GM MODULE. NOP ; NOP ; MOVF PORTD, W ; ANDLW 0x7F ; XORLW 0x40 ; BNZ GMMODEND ; BCF DISPLAYREG, MUTE1LED ;MUTE LED. BCF DISPLAYREG, MUTE2LED ;MUTE LED. BCF PORTC, 3 ;ENABLE LED COM BUSS. CLRF MIDIBYTCNT ;MIDI BUFFER BYTE COUNTER. GMJ1: ;..................... TSTFSZ LEDFLASH ; BRA GMLEDFMJ1 ; BCF DISPLAYREG, MIDI_LED ;SET RB4, MIDI_LED LED TO OFF. BSF DISPLAYREG, GREEN ;TURN ON GREEN GMLEDFMJ1: ; MOVFF DISPLAYREG, PORTB ; ;...................... TSTFSZ MIDIBYTCNT ;ARE THERE ANY BYTES IN BUFFER ? BRA GMIDIFILJ0 ;YES. GOTO GMJ1 ;NO. -> EXIT TO WAIT. GMIDIFILJ0: ;....................... MOVF POSTINC2, W ;GET BYTE FROM BUFFER. MOVWF MIDITEMP1 ;HOLD INPUT BYTE. BTFSC FSR2H, 0 ;TEST BUFFER INDEX. LFSR 2, 0x200 ;MIDI BUFFER START >0x2FF. DECF MIDIBYTCNT ;HOLDS NUMBER OF BYTES TO GO. GMIDISNGJ1: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA GMIDISNGJ1 ; MOVFF MIDITEMP1, TXREG ;SEND MIDI. ; BSF DISPLAYREG, MIDI_LED ;MIDI_LED LED FLASHES WITH MIDI BYTES. BCF DISPLAYREG, GREEN ;GREEN LED ONLY LEFT ON. MOVLW 0x10 ;LED DIP TIME. MOVWF LEDFLASH ; BRA GMJ1 ; ;....................................................................... GMMODEND: ; CLRF PORTB ; ;================================================================================================= BASSBUTTON_ON_POWERUP: ;REJECT ALL MESSAGES BUT NOTES - UNLESS YOU :- MOVLW 0x20 ; HOLD Bass BANK CHANGE, ON POWER-UP, MOVWF PORTB ; TO NOP ; NOP ; NOP ; NOP ; NOP ; MOVF PORTD, W ;IS BASS BANK BUTTON ON ? ANDLW 0x7F ; XORLW 0x40 ; BNZ BBPWRUPEND ; ; MOVLW 0xF3 ;EEPROM ADDRESS. MOVWF EEADR ; BCF EECON1, EEPGD ;SELECT DATA EEPROM MEMORY. BCF EECON1, CFGS ; BSF EECON1, RD ;ENABLE EEPROM READ. MOVF EEDATA, W ;VALUE IN WREG. ; BTG WREG, 6 ;MIDI NOTE ON/OFF INFO ONLY. ; MOVWF EEDATA ;VALUE TO WRITE. MOVLW 0xF3 ; MOVWF EEADR ;DATA MEMORY TO WRITE TO. CALL EEPROM_WRITE ; BBPWRUPEND: ; ;================================================================================================= EDIT_MODE_SET: ;SOUND TRY-OUT MODE SET. MOVLW 0x04 ;HOLD DOWN RH1 MUTE AT POWER UP. MOVWF PORTB ; NOP ; NOP ; NOP ; NOP ; MOVF PORTD, W ; ANDLW 0x7F ; MOVWF TEMPHOLD ; XORLW 0x40 ;BASS OCT BUTTON HELD. BNZ EMSTST2 ; BSF MIDISTAT, SNDTRY_FLAG ;SOUND TRY OUT MODE FLAG. ; MOVLW 0x00 ;GM BANK SEL MSB. MOVWF EEDATA ;VALUE TO WRITE. MOVLW 0xFD ; MOVWF EEADR ;DATA MEMORY TO WRITE TO. CALL EEPROM_WRITE ; MOVLW 0x00 ;GM BANK SEL MSB. MOVWF EEDATA ;VALUE TO WRITE. MOVLW 0xFC ; MOVWF EEADR ;DATA MEMORY TO WRITE TO. CALL EEPROM_WRITE ; BRA EMSEND ; EMSTST2: ; MOVF TEMPHOLD, W ; XORLW 0x60 ;RH1 MUTE & RH112 BUTTONS HELD. BNZ EMSEND ; BSF MIDISTAT, SNDTRY_FLAG ;SOUND TRY OUT MODE FLAG. ; MOVLW 0x7F ;MT32 BANK SEL MSB. MOVWF EEDATA ;VALUE TO WRITE. MOVLW 0xFD ; MOVWF EEADR ;DATA MEMORY TO WRITE TO. CALL EEPROM_WRITE ; MOVLW 0x7F ;MT32 BANK SEL MSB. MOVWF EEDATA ;VALUE TO WRITE. MOVLW 0xFC ; MOVWF EEADR ;DATA MEMORY TO WRITE TO. CALL EEPROM_WRITE ; EMSEND: ; CLRF PORTB ; ;================================================================================================= RACFE: ;REASSIGN CONTROLS FOR SOUND EDITING. - NOT IMPLEMENTED AS YET................. MOVLW 0x02 ;HOLD RH2-OCT ON POWERUP + ANOTHER MOVWF PORTB ; BUTTON TO SET SOUND EDIT. NOP ; NOP ; NOP ; NOP ; MOVF PORTD, W ; ANDLW 0x7F ; XORLW 0x40 ;IS RH2-OCT BUTTON ON ? BNZ RACFE_END ;................ MOVLW 0x20 ;BASS 1. MOVWF PORTB ; BUTTON TO SET SOUND EDIT. NOP ; NOP ; NOP ; NOP ; MOVF PORTD, W ; ANDLW 0x7F ; XORLW 0x01 ;IS BASS 1 BUTTON ON ? BNZ RACFE_CHORD ; BSF GENFLAGS5, EDBASBIT ; BRA RACFE_END ;................ RACFE_CHORD: ; MOVLW 0x10 ;CHORD 1. MOVWF PORTB ; BUTTON TO SET SOUND EDIT. NOP ; NOP ; NOP ; NOP ; MOVF PORTD, W ; ANDLW 0x7F ; XORLW 0x01 ;IS CHORD 1 BUTTON ON ? BNZ RACFE_RH1 ; BSF GENFLAGS5, EDCHDBIT ; BRA RACFE_END ;................ RACFE_RH1: ; MOVLW 0x08 ;RH1. MOVWF PORTB ; BUTTON TO SET SOUND EDIT. NOP ; NOP ; NOP ; NOP ; MOVF PORTD, W ; ANDLW 0x7F ; XORLW 0x01 ;IS RH1-1 BUTTON ON ? BNZ RACFE_RH2 ; BSF GENFLAGS5, EDRH1BIT ; BRA RACFE_END ;................ RACFE_RH2: ; MOVLW 0x02 ;RH2. MOVWF PORTB ; BUTTON TO SET SOUND EDIT. NOP ; NOP ; NOP ; NOP ; MOVF PORTD, W ; ANDLW 0x7F ; XORLW 0x01 ;IS RH2-1 BUTTON ON ? BNZ RACFE_RH2ONLY ; BSF GENFLAGS5, EDRH2BIT ; BRA RACFE_END ;................ RACFE_RH2ONLY: ; ;................ RACFE_END: ; CLRF PORTB ; ;========================================================================================================= FACTORY_PRESETS: ;ARE SECURITY BYTES IN PLACE ? MOVLW 0xAA ; MOVWF TEMP1 ; MOVLW 0xFF ;EEPROM CORRUPT1 ADDRESS. MOVWF EEADR ; BCF EECON1, EEPGD ;SELECT DATA EEPROM MEMORY. BCF EECON1, CFGS ; BSF EECON1, RD ;ENABLE EEPROM READ. MOVF EEDATA, W ;VALUE IN WREG. CPFSEQ TEMP1 ; BRA LOADPRESETS ; ; MOVLW 0x55 ; MOVWF TEMP1 ; MOVLW 0xFE ;EEPROM CORRUPT2 ADDRESS. MOVWF EEADR ; BCF EECON1, EEPGD ;SELECT DATA EEPROM MEMORY. BCF EECON1, CFGS ; BSF EECON1, RD ;ENABLE EEPROM READ. MOVF EEDATA, W ;VALUE IN WREG. CPFSEQ TEMP1 ; BRA LOADPRESETS ; ;............................................................................ MOVLW 0x10 ;HOLD CHORD BANK ON POWERUP. MOVWF PORTB ;TO WRITE PRESETS TO EEPROM. NOP ; NOP ; NOP ; NOP ; NOP ; MOVF PORTD, W ;IS CHORD BANK BUTTON ON ? ANDLW 0x7F ; XORLW 0x40 ; BZ LOADPRESETS ; GOTO PRELOADEND ; LOADPRESETS: ;........................................................................................................................................... MOVLW 0x7C ;Top EEProm address +1. MOVWF TEMP1 ; PL1: ; DECF TEMP1 ; MOVFF TEMP1, TEMP2 ; CALL FACTORYLOAD ;GET INSTRUMENT NUMBER IN WREG. MOVWF EEDATA ;VALUE TO WRITE. MOVF TEMP1, W ; MOVWF EEADR ;DATA MEMORY TO WRITE TO. CALL EEPROM_WRITE ; TSTFSZ TEMP1 ; BRA PL1 ;WRITE LOOP. ;............................................................................................................................................ MOVLW 0xAA ;CHECK-BYTE1. MOVWF EEDATA ;VALUE TO WRITE. MOVLW 0xFF ; MOVWF EEADR ;DATA MEMORY TO WRITE TO. CALL EEPROM_WRITE ; MOVLW 0x55 ;CHECK-BYTE2. MOVWF EEDATA ;VALUE TO WRITE. MOVLW 0xFE ; MOVWF EEADR ;DATA MEMORY TO WRITE TO. CALL EEPROM_WRITE ; ; MOVLW 0x00 ;BANK SEL LSB. MOVWF EEDATA ;VALUE TO WRITE. MOVLW 0xFD ; MOVWF EEADR ;DATA MEMORY TO WRITE TO. CALL EEPROM_WRITE ; MOVLW 0x00 ;BANK SEL MSB. MOVWF EEDATA ;VALUE TO WRITE. MOVLW 0xFC ; MOVWF EEADR ;DATA MEMORY TO WRITE TO. CALL EEPROM_WRITE ; ; MOVLW 0x20 ;PORTAMENTO PRESET VALUE. MOVWF EEDATA ;VALUE TO WRITE. MOVLW 0xFB ; MOVWF EEADR ;DATA MEMORY TO WRITE TO. CALL EEPROM_WRITE ; ; MOVLW 0x60 ;PERCUSSION VOLUME LEVEL. MOVWF EEDATA ;VALUE TO WRITE. MOVLW 0xFA ; MOVWF EEADR ;DATA MEMORY TO WRITE TO. CALL EEPROM_WRITE ; ; MOVLW 0x01 ;DISABLE'CAVAGNOLO'COMPATIBILITY MOVWF EEDATA ;VALUE TO WRITE. MOVLW 0xF9 ; MOVWF EEADR ;DATA MEMORY TO WRITE TO. CALL EEPROM_WRITE ; ;VERSION WAS HERE F5,F7,F8 NOW AT C0 -> C3. ;................................................................ MOVLW 0x58 ;TREM DEPTH DEFAULT VALUE. MOVWF EEDATA ;VALUE TO WRITE. MOVLW 0xF5 ;
EXIT TO INTERNAL DATA SEND. MIDIFILJ0: ;....................... MOVLW 0xFF ;ANY EXTERNAL INPUT BYTES WILL MOVWF AS_TIMER ; RESET ACTIVE-SENSING TIMER. ;...................... MOVF POSTINC2, W ;GET BYTE FROM BUFFER. MOVWF MIDITEMP1 ;HOLD INPUT BYTE. BTFSC FSR2H, 0 ;TEST BUFFER INDEX. LFSR 2, 0x200 ;MIDI BUFFER START >0x2FF. DECF MIDIBYTCNT ;HOLDS NUMBER OF BYTES TO GO. FIRSTIMEIN: ;..................................................................... BTFSS MIDISTAT, NOSTAT_FLAG ;WAIT FOR A STATUS BYTE FLAG,1st BRA MNOSTAT ; TIME IN. GOTO MFIRST_TIME ; MNOSTAT: ; BTFSS MIDITEMP1, 7 ;IS IT A STATUSBYTE ? GOTO MIDITHRUND ;NO - EXIT. >>>>>>>>>>>>> BSF MIDISTAT, NOSTAT_FLAG ;YES. FLAG IT. MFIRST_TIME: ;..................................................................... BTFSS MIDITEMP1, 7 ;IS IT A STATUS OR DATABYTE ? GOTO M_DATA_BYTES ;DATABYTE. ;.................................................................. SETF AS_TIMER ;ASCERTAIN SORT STATE. ;STATUS RESETS ACTIVE SENSING TIMER. ANDLW 0xF8 ; XORLW 0xF8 ;REAL TIME. BNZ MIDINOTRT ;IS IT A REAL TIME STATUS BYTE MOVLW 0xFE ;0xFE = ACTIVE SENSING. CPFSEQ MIDITEMP1 ; BRA MRTND ; BSF MIDISTAT, AS_FLAG ;ACTIVE SENSING ENGAGED BIT. GOTO MIDIEXIT ;EXIT FILTER. ;.................................... MRTND: ; ;ALL OTHER RT BYTES IGNORED. GOTO MIDITHRUND ;EXIT FILTER. MIDINOTRT: ;..................................................................... BCF MIDISTAT2, DBIGNOR_FLAG ; IGNORE BYTE FLAG. BCF MIDISTAT, RS_FLAG ;NEW STATUS CLEARS:- RUNNING-STATUS. BCF MIDISTAT, DB1_FLAG ; 1st DATA BYTE FLAG. BCF MIDISTAT, DB2_FLAG ; 2nd DATA BYTE FLAG. BCF MIDISTAT, SINGLE_FLAG ; SINGLE DATA BYTE FLAG. ;.................................. MOVF MIDITEMP1, W ;HAS CURRENT STATUS BYTE. ; ANDLW 0xF0 ; XORLW 0xF0 ;SYSTEM COMMON. BNZ M_CHAN_CHECK ;IS IT A SYSCOM STATUS BYTE ? ;.................................... MOVFF MIDITEMP1, MTEMP ; MOVLW 0xF0 ;SYSX START. CPFSEQ MTEMP ; BRA MNOT_SYSXSRT ;IT IS NOT SYSX START. BSF MIDISTAT2, DBIGNOR_FLAG ;IGNORE DATABYTES FLAG. GOTO MIDITHRUND ;IGNORE SYS COM & EXIT FILTER. ;.................................... MNOT_SYSXSRT: ; MOVFF MIDITEMP1, MTEMP ; MOVLW 0xF7 ;EOX. CPFSEQ MTEMP ; BRA MNOT_EOX ; BCF MIDISTAT2, DBIGNOR_FLAG ;IGNORE SUCCEEDING DATABYTES FLAG. GOTO MIDITHRUND ;IGNORE SYS COM & EXIT FILTER. MNOT_EOX: ;................................... MOVFF MIDITEMP1, MTEMP ; MOVLW 0xF6 ;TUNE REQUEST. CPFSEQ MTEMP ; BRA M_F5 ;IT IS NOT TUNE REQUEST. GOTO MIDITHRUND ; ;.................................... M_F5: ; MOVFF MIDITEMP1, MTEMP ; MOVLW 0xF5 ;UNDEFINED. CPFSEQ MTEMP ; BRA M_F4 ; GOTO MIDITHRUND ; ;.................................... M_F4: ; MOVFF MIDITEMP1, MTEMP ; MOVLW 0xF4 ;UNDEFINED. CPFSEQ MTEMP ; BRA M_F3 ; GOTO MIDITHRUND ; ;.................................... M_F3: ; MOVFF MIDITEMP1, MTEMP ; MOVLW 0xF3 ;SONG SELECT. (HAS 1 DB). CPFSEQ MTEMP ; BRA M_F2 ; BSF MIDISTAT2, DBIGNOR_FLAG ;IGNORE SUCCEEDING DATABYTES FLAG. GOTO MIDITHRUND ; ;.................................... M_F2: ; MOVFF MIDITEMP1, MTEMP ; MOVLW 0xF2 ;SONG POSITION. (HAS 2 DBs). CPFSEQ MTEMP ; BRA M_F1 ; BSF MIDISTAT2, DBIGNOR_FLAG ;IGNORE SUCCEEDING DATABYTES FLAG. GOTO MIDITHRUND ; ;.................................... M_F1: ; MOVFF MIDITEMP1, MTEMP ; MOVLW 0xF1 ;MTC QUARTER FRAME MESSAGE. CPFSEQ MTEMP ; (HAS 1 DB). BRA MSYSCOMND ; BSF MIDISTAT2, DBIGNOR_FLAG ;IGNORE SUCCEEDING DATABYTES FLAG. GOTO MIDITHRUND ; ;.................................... MSYSCOMND: ; GOTO MIDITHRUND ;IGNORE SYS COM & EXIT FILTER. ;....................................................................... M_CHAN_CHECK: ; BTFSC GENFLAGS4, CHANCONV_BIT ;CANCEL CHANNEL CONVERSION. BRA M_CHAN_CHNG_END ; ;....................................Ch14,15,16 converter, MOVF MIDITEMP1, W ; convert content of MIDITEMP1. ANDLW 0x0F ; to other channels. MOVWF MTEMP ; MOVLW D'15' ;Ch 16 = TREB. CPFSEQ MTEMP ; BRA M_NOTCH16 ; MOVF MIDITEMP1, W ; ANDLW 0xF0 ; ;IORLW 0x00 ;Convert to CHAN 1. MOVWF MIDITEMP1 ; BRA M_CHAN_CHNG_END ; M_NOTCH16: ; MOVF MIDITEMP1, W ; ANDLW 0x0F ; MOVWF MTEMP ; MOVLW D'14' ;Ch 15 = BASS. CPFSEQ MTEMP ; BRA M_NOTCH15 ; MOVF MIDITEMP1, W ; ANDLW 0xF0 ; IORLW 0x02 ;CHAN 3. MOVWF MIDITEMP1 ; BRA M_CHAN_CHNG_END ; M_NOTCH15: ; MOVF MIDITEMP1, W ; ANDLW 0x0F ; MOVWF MTEMP ; MOVLW D'13' ;Ch 14 = CHORDS. CPFSEQ MTEMP ; BRA M_NOTCH14 ; MOVF MIDITEMP1, W ; ANDLW 0xF0 ; IORLW 0x01 ;CHAN 2. MOVWF MIDITEMP1 ; ;BRA M_CHAN_CHNG_END ; M_NOTCH14: ; M_CHAN_CHNG_END: ; ;.................................... BTFSS GENFLAGS8, CHAN1TO3_BIT ;CANCEL CHANNEL CONVERSION of Ch1 to Ch3. BRA M_NOTCH1 ; BSF GENFLAGS8, CANCEL1TO3_BIT; MOVF MIDITEMP1, W ; ANDLW 0x0F ; MOVWF MTEMP ; MOVLW D'0' ;Ch 1 = Main Right-hand. CPFSEQ MTEMP ; BRA M_NOTCH1 ; BCF GENFLAGS8, CANCEL1TO3_BIT; MOVF MIDITEMP1, W ; ANDLW 0xF0 ; IORLW 0x02 ;CHAN 3. MOVWF MIDITEMP1 ; M_NOTCH1: ; ;....................................................................... M_NOTE_OFF: ; MOVF MIDITEMP1, W ; ANDLW 0xF0 ; MOVWF MTEMP ; MOVLW 0x80 ; CPFSEQ MTEMP ; BRA MNOT_8N ; MOVF MIDITEMP1, W ; ANDLW 0x0F ;KEEP LOWEST NIBBLE. MOVWF MTEMP ; BTFSS GENFLAGS6, NOTESONLY ;NOTES ONLY MODE BIT. MOVLW 0x02 ;ONLY RESPOND TO CHANS<4. BTFSC GENFLAGS6, NOTESONLY ;NOTES ONLY MODE BIT. MOVLW 0x03 ;ONLY RESPOND TO CHANS<5. CPFSGT MTEMP ;SKIP IF f>W. BRA M_NOTEOFF_1 ;SEND TO SYNTH. BSF MIDISTAT2, DBIGNOR_FLAG ;IGNORE SUCCEEDING DATABYTES FLAG. GOTO MIDITHRUND ;IT IS NOT NOTE ON, ON CHAN5 OR LESS. ; M_NOTEOFF_1: ; MOVF MIDITEMP1, W ; ANDLW 0x0F ;KEEP LOWEST NIBBLE. MOVWF MTEMP ; MOVLW 0x03 ;CHANNEL 4. CPFSEQ MTEMP ; BRA M_NOTEOFF_2 ;SEND TO SYNTH. BCF MIDISTAT2, CH4LAYER_FLAG; M_NOTEOFF_2: ; BSF MIDISTAT, DB1_FLAG ;1st DATA BYTE FLAG. BSF MIDISTAT, DB2_FLAG ;2nd DATA BYTE FLAG. MOVFF MIDITEMP1, MAINSBHOLD ; GOTO MIDITHRUND ; ;........................................................................ MNOT_8N: ; MOVF MIDITEMP1, W ; ANDLW 0xF0 ; MOVWF MTEMP ; MOVLW 0x90 ;NOTE ON. CPFSEQ MTEMP ; BRA MNOT_9N ;IT IS NOT NOTE ON. ; MOVF MIDITEMP1, W ; ANDLW 0x0F ;KEEP LOWEST NIBBLE. MOVWF MTEMP ; BTFSS GENFLAGS6, NOTESONLY ;NOTES ONLY MODE BIT. MOVLW 0x02 ;ONLY RESPOND TO CHANS<4. BTFSC GENFLAGS6, NOTESONLY ;NOTES ONLY MODE BIT. MOVLW 0x03 ;ONLY RESPOND TO CHANS<5. CPFSGT MTEMP ;SKIP IF f>W. BRA M_NOTEON_TST2 ;CHANS 4,3,2,1 ONLY. BSF MIDISTAT2, DBIGNOR_FLAG ;IGNORE SUCCEEDING DATABYTES FLAG. GOTO MIDITHRUND ;IT IS NOT NOTE ON, ON CHAN5 OR LESS. ; M_NOTEON_TST2: ; MOVF MIDITEMP1, W ; ANDLW 0x0F ;KEEP LOWEST NIBBLE. MOVWF MTEMP ; MOVLW 0x03 ;CHANNEL 4. CPFSEQ MTEMP ; BRA M_NOTEON_1 ;SEND TO SYNTH. BCF MIDISTAT2, CH4LAYER_FLAG ; BTFSC GENFLAGS3, CH4FIRST_FLAG ; BRA M_NOTEON_1 ;SEND TO SYNTH. BSF GENFLAGS3, CH4FIRST_FLAG ;CH4 FIRST TIME IN FLAG - CLEARS MOVLW 0xB3 ; NOTEON IN CH1->CH4 CONVERTER. MOVWF BYTE1OF3 ; MOVLW 0x7B ;ALL NOTES OFF CH4. MOVWF BYTE2OF3 ; MOVLW 0x00 ; MOVWF BYTE3OF3 ; CALL MIDI3BYTE ; ; M_NOTEON_1: ; BSF MIDISTAT, DB1_FLAG ;1st DATA BYTE FLAG. BSF MIDISTAT, DB2_FLAG ;2nd DATA BYTE FLAG. MOVFF MIDITEMP1, MAINSBHOLD ; GOTO MIDITHRUND ; MNOT_9N: ;........................................................................ MOVF MIDITEMP1, W ;PRESSURE IS NOT RECOGNISED. ANDLW 0xF0 ; MOVWF MTEMP ; MOVLW 0xA0 ;POLY PRESSURE. CPFSEQ MTEMP ; BRA MNOT_AN ;IT IS NOT POLY PRESSURE. BSF MIDISTAT2, DBIGNOR_FLAG ;IGNORE SUCCEEDING DATABYTES FLAG. GOTO MIDITHRUND ; MNOT_AN: ;........................................................................ MOVF MIDITEMP1, W ; ANDLW 0xF0 ; MOVWF MTEMP ; MOVLW 0xB0 ;CONTROL CHANGE. CPFSEQ MTEMP ; BRA MNOT_BN ;IT IS NOT CONTROL CHANGE. ; BTFSC GENFLAGS6, NOTESONLY ;NOTES ONLY MODE BIT. BRA MCONT1 ; BSF MIDISTAT2, DBIGNOR_FLAG ;IGNORE SUCCEEDING DATABYTES FLAG. GOTO MIDITHRUND ; MCONT1: ; MOVF MIDITEMP1, W ; ANDLW 0x0F ;KEEP LOWEST NIBBLE. MOVWF MTEMP ; MOVLW 0x03 ;ONLY RESPOND TO CHANS<5. CPFSGT MTEMP ;SKIP IF f>W. GOTO M_CONTROL_1 ;SEND TO SYNTH. BSF MIDISTAT2, DBIGNOR_FLAG ;IGNORE SUCCEEDING DATABYTES FLAG. GOTO MIDITHRUND ;IT IS NOT CONTROL, ON CHAN4 OR LESS. ; M_CONTROL_1: ; BSF MIDISTAT, DB1_FLAG ;1st DATA BYTE FLAG. BSF MIDISTAT, DB2_FLAG ;2nd DATA BYTE FLAG. MOVFF MIDITEMP1, MAINSBHOLD ; GOTO MIDITHRUND ; MNOT_BN: ;....................................................................... MOVF MIDITEMP1, W ; ANDLW 0xF0 ; MOVWF MTEMP ; MOVLW 0xC0 ;PROGRAMME CHANGE. CPFSEQ MTEMP ; BRA MNOT_CN ;IT IS NOT PROGRAMME CHANGE. ; BTFSC GENFLAGS6, NOTESONLY ;NOTES ONLY MODE BIT. BRA MPROG1 ; BSF MIDISTAT2, DBIGNOR_FLAG ;IGNORE SUCCEEDING DATABYTES FLAG. GOTO MIDITHRUND ; MPROG1: ; ; MOVF MIDITEMP1, W ; ANDLW 0x0F ;KEEP LOWEST NIBBLE. MOVWF MTEMP ; MOVLW 0x05 ;ONLY RESPOND TO CHANS<7. CPFSGT MTEMP ;SKIP IF f>W. BRA M_PC_1 ;SEND TO SYNTH. BSF MIDISTAT2, DBIGNOR_FLAG ;IGNORE SUCCEEDING DATABYTES FLAG. GOTO MIDITHRUND ; ; M_PC_1: ; BSF MIDISTAT, SINGLE_FLAG ;SINGLE DATA BYTE FLAG. MOVFF MIDITEMP1, MAINSBHOLD ; GOTO MIDITHRUND ; MNOT_CN: ;.................................... MOVF MIDITEMP1, W ;CHAN PRESSURE IS NOT RECOGNISED. ANDLW 0xF0 ; MOVWF MTEMP ; MOVLW 0xD0 ;CHANNEL PRESSURE. CPFSEQ MTEMP ; BRA MNOT_DN ;IT IS NOT CHANNEL PRESSURE. BSF MIDISTAT2, DBIGNOR_FLAG ;IGNORE SUCCEEDING DATABYTES FLAG. GOTO MIDITHRUND ; MNOT_DN: ;................................... MOVF MIDITEMP1, W ; ANDLW 0xF0 ; MOVWF MTEMP ; MOVLW 0xE0 ;PITCH WHEEL. CPFSEQ MTEMP ; BRA MNOT_EN ;IT IS NOT PITCH WHEEL. ; BTFSC GENFLAGS6, NOTESONLY ;NOTES ONLY MODE BIT. BRA MPWHL1 ; BSF MIDISTAT2, DBIGNOR_FLAG ;IGNORE SUCCEEDING DATABYTES FLAG. GOTO MIDITHRUND ; MPWHL1: ; MOVF MIDITEMP1, W ; ANDLW 0x0F ;KEEP LOWEST NIBBLE. MOVWF MTEMP ; MOVLW 0x03 ;ONLY RESPOND TO CHANS<5. CPFSGT MTEMP ;SKIP IF f>W. GOTO M_PW_1 ;SEND TO SYNTH. BSF MIDISTAT2, DBIGNOR_FLAG ;IGNORE SUCCEEDING DATABYTES FLAG. GOTO MIDITHRUND ; ; M_PW_1: ; BSF MIDISTAT, DB1_FLAG ;1st DATA BYTE FLAG. BSF MIDISTAT, DB2_FLAG ;2nd DATA BYTE FLAG. MOVFF MIDITEMP1, MAINSBHOLD ; GOTO MIDITHRUND ; MNOT_EN: ;.................................................. NOT En ? GOTO MIDITHRUND ; ;...................................................................... M_DATA_BYTES: ; BTFSC MIDISTAT2, DBIGNOR_FLAG ; GOTO MIDITHRUND ; BTFSC MIDISTAT, SINGLE_FLAG ; BRA M_SINGLEDB ; BTFSC MIDISTAT, DB1_FLAG ; BRA M_DATA1 ; BTFSC MIDISTAT, DB2_FLAG ; BRA M_DATA2 ; BRA M_RUNNING ; ; M_SINGLEDB: ;.................................... BCF MIDISTAT, SINGLE_FLAG ; BSF MIDISTAT2, SENDSNG_FLAG ; BSF GENFLAGS2, SNG2_FLAG ; MOVFF MIDITEMP1, MAINSNGHOLD ; BRA MIDINTSEND ; M_DATA1: ;.................................... BCF MIDISTAT, DB1_FLAG ;1st DATA BYTE OF 2. BSF GENFLAGS2, DB12_FLAG ; MOVFF MIDITEMP1, MAINDB1HOLD ; BRA MIDITHRUND ;> M_DATA2: ;.................................... BCF MIDISTAT, DB2_FLAG ;2nd DATA BYTE OF 2. BSF MIDISTAT2, SEND2DB_FLAG ;WILL NOW SEND-> BSF GENFLAGS2, DB22_FLAG ; MOVFF MIDITEMP1, MAINDB2HOLD ; BRA MIDINTSEND ; M_RUNNING: ;.................................... BSF MIDISTAT, RS_FLAG ;SET RUNNING-STATUS FLAG. BTFSS GENFLAGS2, SNG2_FLAG ; BRA M_RS1 ; BSF MIDISTAT, SINGLE_FLAG ; BCF GENFLAGS2, SNG2_FLAG ; BRA M_SINGLEDB ;> M_RS1: ; BTFSS GENFLAGS2, DB12_FLAG ; BRA MIDITHRUND ;> BSF MIDISTAT, DB1_FLAG ; BSF MIDISTAT, DB2_FLAG ; BCF GENFLAGS2, DB12_FLAG ; BRA M_DATA_BYTES ;> ;...................................................................................................... MIDITHRUND: ;SEND INTERNAL DATAto SYNTH CHIP (ATSAM9773) IF READY. BTFSC SCANSTAT, MIDI_RTS_FLAG ;SCANSTAT, 0. CALL PROGCHNGSEND ;PROGRAM CHANGE SEND ROUTINE. BCF SCANSTAT, MIDI_RTS_FLAG ;NO MORE PROG CHANGE TO SEND. ;............................................................................. TSTFSZ POTSTAT ;SEE IF ANY POTS HAVE CHANGED. BRA MCONTROLP ; BRA CONTEND ; MCONTROLP: ; MOVF POTCHAN, W ;CONTROL. MCONTROL0: ;POT SEND. BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MCONTROL0 ; MOVWF TXREG ;SEND MIDI. MOVF POTCONT, W ;CONTROL NUMBER. MCONTROL1: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MCONTROL1 ; MOVWF TXREG ;SEND MIDI. MOVF POTSTORE, W ; MCONTROL2: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MCONTROL2 ; MOVWF TXREG ;SEND MIDI. CLRF POTSTAT ; ;........................................................................ BTFSS MIDISTAT2, CH6ON_FLAG ; BRA MCONT6END ; MOVF POTCHAN, W ; ANDLW 0x0F ; MOVWF TEMP1 ; MOVLW 0x02 ; CPFSEQ TEMP1 ; BRA MCONT6END ; ; MOVF POTCHAN, W ;CONTROL. ADDLW 0x03 ;CONVERT TO CHAN 6. MCONTROL3: ;POT SEND. BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MCONTROL3 ; MOVWF TXREG ;SEND MIDI. MOVF POTCONT, W ;CONTROL NUMBER. MCONTROL4: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MCONTROL4 ; MOVWF TXREG ;SEND MIDI. MOVF POTSTORE, W ; MCONTROL5: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MCONTROL5 ; MOVWF TXREG ;SEND MIDI. BRA CONTEND ; MCONT6END: ; ;........................................................................ BTFSS GENFLAGS2, CH5ON_FLAG ; BRA MCONT5END ; MOVF POTCHAN, W ; ANDLW 0x0F ; MOVWF TEMP1 ; MOVLW 0x00 ; CPFSEQ TEMP1 ; BRA MCONT5END ; ; MOVLW 0xB4 ;CONTROL. CONVERT TO CHAN 5. M5CONTROL3: ;POT SEND. BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA M5CONTROL3 ; MOVWF TXREG ;SEND MIDI. MOVF POTCONT, W ;CONTROL NUMBER. M5CONTROL4: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA M5CONTROL4 ; MOVWF TXREG ;SEND MIDI. MOVF POTSTORE, W ; M5CONTROL5: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA M5CONTROL5 ; MOVWF TXREG ;SEND MIDI. MCONT5END: ; ; BTFSS GENFLAGS8, RH1L3EN ; BRA MCONT7END ; MOVF POTCHAN, W ; ANDLW 0x0F ; MOVWF TEMP1 ; MOVLW 0x00 ; CPFSEQ TEMP1 ; BRA MCONT7END ; ; MOVLW 0xB6 ;CONTROL. CONVERT TO CHAN 7. M7CONTROL3: ;POT SEND. BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA M7CONTROL3 ; MOVWF TXREG ;SEND MIDI. MOVF POTCONT, W ;CONTROL NUMBER. M7CONTROL4: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA M7CONTROL4 ; MOVWF TXREG ;SEND MIDI. MOVF POTSTORE, W ; M7CONTROL5: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA M7CONTROL5 ; MOVWF TXREG ;SEND MIDI. MCONT7END: ; ;....................................................................... CONTEND: ;Rotary controls send end. ;........................................................................................................................................................................................ M_NORPN_SEND: ;SENDS 7 BYTE NoRPN MESSAGES. BTFSS GENFLAGS1, NORPN_FLAG ;used for coarse tunning down 12. BRA M_NORPN_END ; M_NORPN_SEND1: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA M_NORPN_SEND1 ; MOVFF NORPN1, TXREG ;SEND MIDI. M_NORPN_SEND2: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA M_NORPN_SEND2 ; MOVFF NORPN2, TXREG ;SEND MIDI. M_NORPN_SEND3: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA M_NORPN_SEND3 ; MOVFF NORPN3, TXREG ;SEND MIDI. M_NORPN_SEND4: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA M_NORPN_SEND4 ; MOVFF NORPN4, TXREG ;SEND MIDI. M_NORPN_SEND5: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA M_NORPN_SEND5 ; MOVFF NORPN5, TXREG ;SEND MIDI. M_NORPN_SEND6: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA M_NORPN_SEND6 ; MOVFF NORPN6, TXREG ;SEND MIDI. M_NORPN_SEND7: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA M_NORPN_SEND7 ; MOVFF NORPN7, TXREG ;SEND MIDI. BCF GENFLAGS1, NORPN_FLAG ; M_NORPN_END: ; ;..................................................................... M_CONTROLS_2: ;CONTROL CHANGE MIDI SEND. BTFSS GENFLAGS1, MUTE_FLAG ;USED FOR ALL NOTES OFF. BRA CONTS2END ; MOVF CONTCHAN, W ;CONTROL. MCONTS2ROL0: ;POT SEND. BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MCONTS2ROL0 ; MOVWF TXREG ;SEND MIDI. MOVF CONTDB1, W ;CONTROL NUMBER. MCONTS2ROL1: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MCONTS2ROL1 ; MOVWF TXREG ;SEND MIDI. MOVF CONTDB2, W ; MCONTS2ROL2: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MCONTS2ROL2 ; MOVWF TXREG ;SEND MIDI. BCF GENFLAGS1, MUTE_FLAG ; ; BTFSC GENFLAGS2, CH5ON_FLAG ; BRA CONTS2END ; MOVLW 0xB4 ;ALL SOUND OFF CHAN 5. RH12ROL0: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA RH12ROL0 ; MOVWF TXREG ;SEND MIDI. MOVF CONTDB1, W ;CONTROL NUMBER. RH12ROL1: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA RH12ROL1 ; MOVWF TXREG ;SEND MIDI. MOVF CONTDB2, W ; RH12ROL2: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA RH12ROL2 ; MOVWF TXREG ;SEND MIDI. CONTS2END: ; ;------------------------------------------------------------------------ MIDINTSEND ; BTFSS MIDISTAT2, SENDSNG_FLAG ; BRA MIDI2DBTST ; ; BSF GENFLAGS10, DIP_CHNG_LED ; BSF GENFLAGS10, MIDI_LED_FLAG ; MIDISNGJ1: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MIDISNGJ1 ; MOVFF MAINSBHOLD, TXREG ;SEND MIDI. ; BCF MIDISTAT2, SENDSNG_FLAG ; MIDISNGJ2: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MIDISNGJ2 ; MOVFF MAINSNGHOLD, TXREG ;SEND MIDI. ; GOTO MIDINTXIT ;>single db message sent. ;....................................................................... MIDI2DBTST: ; BTFSS MIDISTAT2, SEND2DB_FLAG ; BRA MIDIRSTST ; BSF GENFLAGS10, DIP_CHNG_LED ; BSF GENFLAGS10, MIDI_LED_FLAG ;FLASH MIDI_LED LED FOR RECOGNISED MIDI. ;....................... BTFSS GENFLAGS4, BASS_RNG_BIT ; BRA MIDI3RNG1 ; ; MOVF MAINSBHOLD, W ;BASS RANGE MODIFY. ANDLW 0x0F ;KEEP LOWEST NIBBLE. MOVWF MTEMP ; MOVLW 0x02 ;CH3 CPFSEQ MTEMP ;SKIP IF f=W. BRA MIDI3RNG1 ; MOVLW 0x27 ; CPFSGT MAINDB1HOLD ; BRA MIDI3RNG1 ; MOVLW 0x0C ;GO DOWN OCTAVE FOR NOTES SUBWF MAINDB1HOLD ; ABOVE 0x27. RESULT IN FILE. MIDI3RNG1: ;......................... ; BTFSC GENFLAGS8, CANCEL1TO3_BIT;If from Ch3 then no convert. BRA MIDI3RNG3 ; BTFSS GENFLAGS8, CHAN1TO3_BIT ;Rhand plays bass mode. BRA MIDI3RNG3 ; MOVF MAINSBHOLD, W ;BASS RANGE MODIFY. ANDLW 0x0F ;KEEP LOWEST NIBBLE. MOVWF MTEMP ; MOVLW 0x02 ;CH3 CPFSEQ MTEMP ;SKIP IF f=W. BRA MIDI3RNG3 ; MOVLW 0x18 ;GO DOWN 2 OCTAVES. SUBWF MAINDB1HOLD ; RESULT IN FILE. BSF GENFLAGS1, MUTE1_FLAG ; BCF DISPLAYREG, MUTE1LED ;'RH1-ON' LED, OFF. BCF GENFLAGS2, CH5ON_FLAG ;Ch5 OFF AS WELL. BSF GENFLAGS1, MUTE2_FLAG ; BCF DISPLAYREG, MUTE2LED ;RH2 ON LED, OFF. BCF MIDISTAT2, CH4LAYER_FLAG;CH4 MIMICS CH1. MIDI3RNG3: ; ;......................... MOVF MAINSBHOLD, W ; ANDLW 0x0F ;KEEP LOWEST NIBBLE. MOVWF MTEMP ; MOVLW 0x00 ;CH1 CPFSEQ MTEMP ;SKIP IF f=W. BRA MIDI2CH4TST1 ; MOVF MAINSBHOLD, W ; ADDLW 0x03 ;CONVERT TO Ch4. MOVWF CH4SBHOLD ;HOLD Ch4 STATUS BYTE. MOVFF MAINDB2HOLD, CH4DB2HOLD ; ; BTFSS GENFLAGS1, MUTE1_FLAG ;MUTE RH1. BRA MIDI2SND ; BRA MIDI2CH4SEND ; ;.................................... MIDI2CH4TST1: ; MOVF MAINSBHOLD, W ; ANDLW 0x0F ;KEEP LOWEST NIBBLE. MOVWF MTEMP ; MOVLW 0x03 ;CH4. CPFSEQ MTEMP ;SKIP IF f=W. BRA MIDI2SND ; BTFSC GENFLAGS1, MUTE2_FLAG ;MUTE RH2. BRA MIDI2END ;> ;.................................... MIDI2SND: ;CHECK ACTIVE CHANNEL. For ; MOVF MAINSBHOLD, W ; 'blank-instrument' muting. ANDLW 0x0F ;KEEP LOWEST NIBBLE. MOVWF MTEMP ; MOVLW 0x02 ;CH3 CPFSEQ MTEMP ;SKIP IF f=W. BRA MIDI2BYTJ0 ; MOVFF MAINDB2HOLD, CH3DB2HOLD ; BTFSC GENFLAGS4, BASVEL0_FLAG ; CLRF MAINDB2HOLD ; MOVF MAINDB2HOLD, W ; BRA MIDI2BTSTX ; MIDI2BYTJ0: ; MOVLW 0x01 ;CH2 CPFSEQ MTEMP ;SKIP IF f=W. BRA MIDI2BYTJ1 ; MOVFF MAINDB2HOLD, CH2DB2HOLD ; BTFSC GENFLAGS4, CHDVEL0_FLAG ; CLRF MAINDB2HOLD ; MOVF MAINDB2HOLD, W ; BRA MIDI2BTSTX ; MIDI2BYTJ1: ; MOVLW 0x00 ;CH1 CPFSEQ MTEMP ;SKIP IF f=W. BRA MIDI2BYTJ2 ; BTFSC GENFLAGS4, BLANK_RH1_FLAG; CLRF MAINDB2HOLD ; MOVF MAINDB2HOLD, W ; BRA MIDI2BTSTX ; MIDI2BYTJ2: ; MOVLW 0x03 ;CH4 CPFSEQ MTEMP ;SKIP IF f=W. BRA MIDI2BYTJ3 ; BTFSC GENFLAGS4, BLANK_RH2_FLAG; CLRF MAINDB2HOLD ; MOVF MAINDB2HOLD, W ; MIDI2BYTJ3: ; MIDI2BTSTX: ; ;........................ MIDI2DBJ1: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MIDI2DBJ1 ; MOVFF MAINSBHOLD, TXREG ;SEND MIDI SBYTE. ; MOVF MAINDB1HOLD, W ; MIDI2DBJ2: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MIDI2DBJ2 ; MOVWF TXREG ;SEND MIDI DBYTE 1. ; MOVF MAINDB2HOLD, W ; MIDI2DBJ3: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MIDI2DBJ3 ; MOVWF TXREG ;SEND MIDI DBYTE 2. ;........................................................................ MIDI2CH6TST1: ; BTFSC MIDISTAT2, CH6ON_FLAG ;ADD Ch6. LAYER TO BASS. BRA MIDI6CHK ; BTFSS MIDISTAT2, CH6MUTE_FLAG ;USED FOR ALL NOTES OFF. BRA MIDI6END ; ; MOVLW 0xB5 ;CONTROL. ALL SOUND OFF CHAN 6. MCONTS6ROL0: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MCONTS6ROL0 ; MOVWF TXREG ;SEND MIDI. MOVLW 0x78 ;CONTROL NUMBER. MCONTS6ROL1: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MCONTS6ROL1 ; MOVWF TXREG ;SEND MIDI. MOVLW 0x00 ; MCONTS6ROL2: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MCONTS6ROL2 ; MOVWF TXREG ;SEND MIDI. BCF MIDISTAT2, CH6MUTE_FLAG ; BRA MIDI6END ; ;............. MIDI6CHK: ; MOVF MAINSBHOLD, W ; ANDLW 0x0F ;KEEP LOWEST NIBBLE. MOVWF MTEMP ; MOVLW 0x02 ;CH3 CPFSEQ MTEMP ;SKIP IF f=W. BRA MIDI6END ; MOVF MAINSBHOLD, W ; ADDLW 0x03 ;CONVERT TO Ch6. MIDI6DBJ1: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MIDI6DBJ1 ; MOVWF TXREG ;SEND MIDI. MIDI6DBJ2: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MIDI6DBJ2 ; MOVFF MAINDB1HOLD, TXREG ;SEND MIDI DB1. MOVF MAINDB2HOLD, W ; MIDI6DBJ3: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MIDI6DBJ3 ; MOVWF TXREG ;SEND MIDI DB2. BSF MIDISTAT2, CH6MUTE_FLAG ; MIDI6END: ; ;....................................................................... MIDI2CH4SEND: ; BTFSS MIDISTAT2, CH4LAYER_FLAG; CH4 MIMICS CH1. BRA MIDI41END ; BTFSC GENFLAGS1, MUTE2_FLAG ;MUTE RH2. BRA MIDI41END ; MOVF MAINSBHOLD, W ; ANDLW 0x0F ;KEEP LOWEST NIBBLE. MOVWF MTEMP ; MOVLW 0x00 ;CH1 CPFSEQ MTEMP ;SKIP IF f=W. BRA MIDI41END ; MOVF CH4SBHOLD, W ; MIDI2DB4J1: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MIDI2DB4J1 ; MOVWF TXREG ;SEND MIDI. ; MOVF MAINDB1HOLD, W ; MIDI2DB4J2: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MIDI2DB4J2 ; MOVWF TXREG ;SEND MIDI. ; BTFSC GENFLAGS4, BLANK_RH2_FLAG ; CLRF CH4DB2HOLD ; MOVF CH4DB2HOLD, W ;SEND NOTE OFF. MIDI2DB4J3: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MIDI2DB4J3 ; MOVWF TXREG ;SEND MIDI. MIDI41END: ; ;........................................................................................................................................................................................ MIDI2CH5TST1: ;ADD Ch5.LAYER TO RH1. BTFSC GENFLAGS2, CH5ON_FLAG ; BRA MIDI5CHK ; BTFSS GENFLAGS2, CH5MUTE_FLAG ;USED FOR ALL NOTES OFF. BRA MIDI7END ; ; MOVLW 0xB4 ;CONTROL. ALL SOUND OFF CHAN 5. MCONTS5ROL0: ;POT SEND. BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MCONTS5ROL0 ; MOVWF TXREG ;SEND MIDI. MOVLW 0x78 ;CONTROL NUMBER. MCONTS5ROL1: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MCONTS5ROL1 ; MOVWF TXREG ;SEND MIDI. MOVLW 0x00 ; MCONTS5ROL2: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MCONTS5ROL2 ; MOVWF TXREG ;SEND MIDI. BCF GENFLAGS2, CH5MUTE_FLAG ; ;....................................................................... MOVLW 0xB6 ;CONTROL. ALL SOUND OFF CHAN 7. MCONTS7ROL0: ;POT SEND. BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MCONTS7ROL0 ; MOVWF TXREG ;SEND MIDI. MOVLW 0x78 ;CONTROL NUMBER. MCONTS7ROL1: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MCONTS7ROL1 ; MOVWF TXREG ;SEND MIDI. MOVLW 0x00 ; MCONTS7ROL2: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MCONTS7ROL2 ; MOVWF TXREG ;SEND MIDI. ; BCF GENFLAGS8, RH1L3EN ;3RD LAYER DISABLE. BRA MIDILSEND ; ;................................................................................................................. MIDI5CHK: ; MOVF MAINSBHOLD, W ; ANDLW 0x0F ;KEEP LOWEST NIBBLE. MOVWF MTEMP ; MOVLW 0x00 ;Ch1. CPFSEQ MTEMP ;SKIP IF f=W. BRA MIDI5END ; MOVF MAINSBHOLD, W ; ADDLW 0x04 ;CONVERT TO Ch5. MIDI5DBJ1: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MIDI5DBJ1 ; MOVWF TXREG ;SEND MIDI. MIDI5DBJ2: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MIDI5DBJ2 ; MOVFF MAINDB1HOLD, TXREG ;SEND MIDI. MIDI5DBJ3: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MIDI5DBJ3 ; MOVFF MAINDB2HOLD, TXREG ;SEND MIDI. BSF GENFLAGS2, CH5MUTE_FLAG ; BCF GENFLAGS8, RH1L3EN ;RD LAYER DISABLE. MIDI5END: ; ;........................................................................ BTFSS GENFLAGS8, RH1L3EN ; BRA MIDILSEND ; MOVF MAINSBHOLD, W ; ANDLW 0x0F ;KEEP LOWEST NIBBLE. MOVWF MTEMP ; MOVLW 0x00 ;Ch1. CPFSEQ MTEMP ;SKIP IF f=W. BRA MIDI7END ; MOVF MAINSBHOLD, W ; ADDLW 0x06 ;CONVERT TO Ch7. MIDI7DBJ1: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MIDI7DBJ1 ; MOVWF TXREG ;SEND MIDI. MIDI7DBJ2: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MIDI7DBJ2 ; MOVFF MAINDB1HOLD, TXREG ;SEND MIDI. MIDI7DBJ3: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MIDI7DBJ3 ; MOVFF MAINDB2HOLD, TXREG ;SEND MIDI. MIDI7END: ; BRA MIDILSEND ; ;....................................................................... MIDILSEND: ; ;................................................................................................................................................................................................................ ;PERCUSSION ON Ch10 from Ch2. BTFSC GENFLAGS3, DRM1_BIT ;Percussion1 on/off bit. BRA PERC2J1 ;> BTFSC GENFLAGS8, DRM2_BIT ;Percussion2 on/off bit. BRA PERC2J1 ;> BTFSS GENFLAGS8, DRM3_BIT ;Percussion3 on/off bit. BRA MIDIPERCEND ;> PERC2J1: ; BTFSS GENFLAGS3, PERCON2_BIT ;PERC ON CH 2 ENABLE FLAG. BRA MIDI210END ;> CLRF WREG ; CPFSEQ PERCON2TIME ; BRA MIDI210END ;> ; MOVFF MAINSBHOLD, MTEMP ; MOVLW 0x91 ;NOTE ON Ch2. CPFSEQ MTEMP ;SKIP IF f=W. BRA MIDI210_OTHER ; MOVF MAINSBHOLD, W ; ADDLW 0x08 ;CONVERT TO Ch10. MIDI210DBJ1: ; BTFSS TXSTA, TRMT ;SET WHEN TxShiftReg IS EMPTY. BRA MIDI210DBJ1 ; MOVWF TXREG ;SEND MIDI. ; BTFSC GENFLAGS8, DRM2_BIT ; BRA MCHDDRM2SEL ; BTFSC GENFLAGS8, DRM3_BIT ; BRA MCHDDRM3SEL ; MOVLW 0x40 ;ATTENUATION AMOUNT. MOVWF TEMP1 ; MOVLW D'38' ;STANDARD KIT INST - (Note D2) SNARE 1. BRA MIDI210DBJ2