YAMAHA Sound Generator LSI YMZ294 interface
YMZ294.cpp@0:4d1fe8f35716, 2011-07-06 (annotated)
- Committer:
- yamaguch
- Date:
- Wed Jul 06 09:34:54 2011 +0000
- Revision:
- 0:4d1fe8f35716
0.9
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yamaguch | 0:4d1fe8f35716 | 1 | #include "YMZ294.h" |
yamaguch | 0:4d1fe8f35716 | 2 | |
yamaguch | 0:4d1fe8f35716 | 3 | const int ADDR_FREQ[] = {0, 2, 4}; |
yamaguch | 0:4d1fe8f35716 | 4 | const int ADDR_NOISE = 6; |
yamaguch | 0:4d1fe8f35716 | 5 | const int ADDR_MIXER = 7; |
yamaguch | 0:4d1fe8f35716 | 6 | const int ADDR_VOL[] = {8, 9, 10}; |
yamaguch | 0:4d1fe8f35716 | 7 | const int ADDR_ENV_FREQ = 11; |
yamaguch | 0:4d1fe8f35716 | 8 | const int ADDR_ENV_SHAPE = 13; |
yamaguch | 0:4d1fe8f35716 | 9 | |
yamaguch | 0:4d1fe8f35716 | 10 | YMZ294::YMZ294(PinName dataPin0, PinName dataPin1, PinName dataPin2, PinName dataPin3, |
yamaguch | 0:4d1fe8f35716 | 11 | PinName dataPin4, PinName dataPin5, PinName dataPin6, PinName dataPin7, |
yamaguch | 0:4d1fe8f35716 | 12 | PinName csPin, PinName wrPin, PinName a0Pin) : |
yamaguch | 0:4d1fe8f35716 | 13 | dataPins(dataPin0, dataPin1, dataPin2, dataPin3, dataPin4, dataPin5, dataPin6, dataPin7), |
yamaguch | 0:4d1fe8f35716 | 14 | csPin(csPin), wrPin(wrPin), a0Pin(a0Pin) {} |
yamaguch | 0:4d1fe8f35716 | 15 | |
yamaguch | 0:4d1fe8f35716 | 16 | void YMZ294::setTone(Channel channel, float freq) { |
yamaguch | 0:4d1fe8f35716 | 17 | if (freqs[channel] != freq) { |
yamaguch | 0:4d1fe8f35716 | 18 | int tp = 125000.0 / freq; // tp <= 4095 or freq > 30.525 |
yamaguch | 0:4d1fe8f35716 | 19 | writeData(ADDR_FREQ[channel], tp, 2); |
yamaguch | 0:4d1fe8f35716 | 20 | freqs[channel] = freq; |
yamaguch | 0:4d1fe8f35716 | 21 | } |
yamaguch | 0:4d1fe8f35716 | 22 | } |
yamaguch | 0:4d1fe8f35716 | 23 | |
yamaguch | 0:4d1fe8f35716 | 24 | void YMZ294::setVolume(Channel channel, int volume) { |
yamaguch | 0:4d1fe8f35716 | 25 | if (volumes[channel] != volume || volume == 16) { |
yamaguch | 0:4d1fe8f35716 | 26 | writeData(ADDR_VOL[channel], volume & 0x1F); |
yamaguch | 0:4d1fe8f35716 | 27 | volumes[channel] = volume; |
yamaguch | 0:4d1fe8f35716 | 28 | } |
yamaguch | 0:4d1fe8f35716 | 29 | } |
yamaguch | 0:4d1fe8f35716 | 30 | |
yamaguch | 0:4d1fe8f35716 | 31 | void YMZ294::setNoise(int freq) { |
yamaguch | 0:4d1fe8f35716 | 32 | if (noiseFreq != freq) { |
yamaguch | 0:4d1fe8f35716 | 33 | writeData(ADDR_NOISE, freq & 0x1F); |
yamaguch | 0:4d1fe8f35716 | 34 | noiseFreq = freq; |
yamaguch | 0:4d1fe8f35716 | 35 | } |
yamaguch | 0:4d1fe8f35716 | 36 | } |
yamaguch | 0:4d1fe8f35716 | 37 | |
yamaguch | 0:4d1fe8f35716 | 38 | void YMZ294::setEnvelope(int freq, int shape) { |
yamaguch | 0:4d1fe8f35716 | 39 | writeData(ADDR_ENV_FREQ, freq, 2); |
yamaguch | 0:4d1fe8f35716 | 40 | writeData(ADDR_ENV_SHAPE, shape); |
yamaguch | 0:4d1fe8f35716 | 41 | } |
yamaguch | 0:4d1fe8f35716 | 42 | |
yamaguch | 0:4d1fe8f35716 | 43 | void YMZ294::setMixer(Mixer m0, Mixer m1, Mixer m2, Mixer m3, Mixer m4, Mixer m5) { |
yamaguch | 0:4d1fe8f35716 | 44 | writeData(ADDR_MIXER, m0 & m1 & m2 & m3 & m4 & m5); |
yamaguch | 0:4d1fe8f35716 | 45 | } |
yamaguch | 0:4d1fe8f35716 | 46 | |
yamaguch | 0:4d1fe8f35716 | 47 | void YMZ294::write(char data, bool dataWrite) { |
yamaguch | 0:4d1fe8f35716 | 48 | wrPin = 0; |
yamaguch | 0:4d1fe8f35716 | 49 | csPin = 0; |
yamaguch | 0:4d1fe8f35716 | 50 | a0Pin = dataWrite; |
yamaguch | 0:4d1fe8f35716 | 51 | dataPins = data; |
yamaguch | 0:4d1fe8f35716 | 52 | wrPin = 1; |
yamaguch | 0:4d1fe8f35716 | 53 | csPin = 1; |
yamaguch | 0:4d1fe8f35716 | 54 | } |
yamaguch | 0:4d1fe8f35716 | 55 | |
yamaguch | 0:4d1fe8f35716 | 56 | void YMZ294::writeData(char address, int data, int nBytes) { |
yamaguch | 0:4d1fe8f35716 | 57 | write(address); |
yamaguch | 0:4d1fe8f35716 | 58 | write(data & 0xFF, true); |
yamaguch | 0:4d1fe8f35716 | 59 | while (--nBytes) { |
yamaguch | 0:4d1fe8f35716 | 60 | write(++address); |
yamaguch | 0:4d1fe8f35716 | 61 | write((data >>= 8) & 0xFF, true); |
yamaguch | 0:4d1fe8f35716 | 62 | } |
yamaguch | 0:4d1fe8f35716 | 63 | } |