Simple program to send MIDI messages w/the SX family @ 50 MHz
Without further adieu, here's the code. Yes, I know that's all you're here for... you could at least have bought me flowers or gotten me drunk. Pigs.
Codice:
;=======================================================================
;-------------------------- DEVICE DIRECTIVES --------------------------
DEVICE SX28,OSChs,TURBO
IFDEF __SASM ;SASM Directives
DEVICE STACKX,OPTIONX
IRC_CAL IRC_SLOW
ELSE ;Parallax Assember Directives
DEVICE STACKX_OPTIONX
ENDIF
RESET Initialize
;------------------------------ VARIABLES ------------------------------
count1 EQU $08
count2 EQU $09
data equ $10
;---------------------------- DEBUG SETTINGS ---------------------------
FREQ 50_000_000
WATCH Count1,16,UDEC
;------------------------ INITIALIZATION ROUTINE -----------------------
Initialize
;Configure port settings
mov rc, #%00000000
mov !rc, #$00
;---------------------------- MAIN PROGRAM -----------------------------
Main
mov !option, #%11000011
setb rc.0
call midi_wait
call midi_wait
mov data, #$90 ;midi channel one
call midi_out
mov data, #$3c ;middle c
call midi_out
mov data, #$7f ;maximum velocity
call midi_out
stall jmp stall
midi_out mov count2, #$08
clrb rc.0 ;start bit
call midi_wait
midi_loop snb data.0 ;data bit
setb rc.0
sb data.0
clrb rc.0
call midi_wait
rr data
djnz count2, midi_loop
setb rc.0 ;stop bit
call midi_wait
ret
midi_wait clr rtcc
Loop cjne rtcc, #$62, loop
ret
You may have to modify the formatting some, and you'll have to save it as a .src file. All that this program does is send middle C at maximum volume on channel one, then it loops indefinitely doing nothing, which is a pretty accurate metaphor for my life.
As you'll probably notice, I'm using the RTCC counter to time the MIDI bit length; this is for MIDI output buffering. The way that I'd implement it is to make a table (buffer) where midi notes are stored, and send MIDI until the buffer is empty. Using RTCC as the timer will allow me to re-check whatever midi input (buttons, ADCs, etc.) might have changed while sending bits, and re-load that into the buffer; care must me taken, however, that the data check doesn't take longer than the RTCC countup to 0x63 (w/the prescaling set by the !OPTION register... it's actually an eternity by SX time). This should make it easy to check inputs while sending data, thereby assuring no data is lost.
I've never actually needed to use the RTCC mid-bit check, as previous experiments with the forementioned code were satisfactory- no dropped data that I could detect.
If you use this in a project I'd like to hear about it! asmidius{at}gmail(dot)com
I thought you loved me... but you just wanted to see my bits... sniff... cry... wheeze... I feel so alone, and optoisolated
Source: http://asmidius.googlepages.com/midi...laxubicomsx-28
Segnalibri