The WonderSwan sound hardware
The sound processor uses wave samples at the address defined by port 08Fh. Each channel uses 16 bytes (32 4 bit samples) If we define the base as being 0D00h (by writing 34h to port 08Fh) the following addresses will define the samples used by the sound processor: |
|
Port | Direction | Function | Bits | Details |
080h | RW | REG_SND_CH1_PITCH L | LLLLLLLL | Pitch (Higher number=Higher pitch) |
081h | RW | REG_SND_CH1_PITCH H | -----HHH | |
082h | RW | REG_SND_CH2_PITCH L | LLLLLLLL | Pitch (Higher number=Higher pitch) |
083h | RW | REG_SND_CH2_PITCH H | -----HHH | |
084h | RW | REG_SND_CH3_PITCH L | LLLLLLLL | Pitch (Higher number=Higher pitch) |
085h | RW | REG_SND_CH3_PITCH H | -----HHH | |
086h | RW | REG_SND_CH4_PITCH L | LLLLLLLL | Pitch (Higher number=Higher pitch) |
087h | RW | REG_SND_CH4_PITCH H | -----HHH | |
088h | RW | REG_SND_CH1_VOL | LLLLRRRR | L=Left R=Right (15=loud) |
089h | RW | REG_SND_CH2_VOL | LLLLRRRR | L=Left R=Right (15=loud) |
08Ah | RW | REG_SND_CH3_VOL | LLLLRRRR | L=Left R=Right (15=loud) |
08Bh | RW | REG_SND_CH4_VOL | LLLLRRRR | L=Left R=Right (15=loud) |
08Ch | RW | REG_SND_SWEEP_VALUE | SSSSSSSS | |
08Dh | RW | REG_SND_SWEEP_TIME | ---TTTTT | |
08Eh | RW | REG_SND_NOISE | ---ERMMM | E=Enable / R=Reset / M=Mode |
08Fh | RW | REG_SND_WAVE_BASE | AAAAAAAA | Wave address >>6 (34h= 0D00h) |
090h | RW | REG_SND_CTRL | NSV-4321 | N= ch4 Noise / S= ch3 Sweep / V= ch2 Voice / M=Channel Modes / 4321 - Channel enable |
091h | RW | REG_SND_OUTPUT | ||
092h | R | REG_SND_RANDOM L | ||
093h | R | REG_SND_RANDOM H | ||
094h | RW | REG_SND_VOICE_CTRL | ||
095h | RW | REG_SND_HYPERVOICE | ||
096h | RW | REG_SND_9697 L | ||
097h | RW | REG_SND_9697 H | ||
098h | RW | REG_SND_9899 L | ||
099h | RW | REG_SND_9899 H | ||
09Ah | R | REG_SND_9A | ||
09Bh | R | REG_SND_9B | ||
09Ch | R | REG_SND_9C | ||
09Dh | R | REG_SND_9D | ||
09Eh | R | REG_SND_9E |
Since the earliest of my tutorials,
I've handled sound with a simple sound driver knows as
'ChibiSound' This takes an 8 bit byte value from 0-255, and make a sound of selectable pitch, with noise or half volume in a similar way on all our systems! This was created for Grime Z80, and allows common sound code to give similar effects on all the systems! All we do is load the AL register with a value, and call ChibiSound! Of course, this won't be enough to make music (please wait for ChibiSound Pro - yes really!) but it will give us some simple SFX, and make it easy to compare doing simple tasks on our various systems! |
|
Before we can make a sound we need to do two things! First we need to set the base memory address of our sound samples 0D00h, we write 34h to port 08Fh to set the memory address. Next we need to create a wave - We write 16 bytes, one nibble per sample.... We make a square wave by writing a sequence of 0 and F bytes We need to make noise in some cases, so we use Channel 4 in all cases in this example |
|
First we check if AL=0, if it is, we need to turn off the sound. We silence the channels by setting bit 3 to zero of port 090h |
|
Next we set the volume, we only have 1 bit setting our volume in
the parameter - bit 6. we set the bits of port 08Bh to set the volume - 15 is the maximum - 0 is the minimum volume |
|
We need to set the pitch. The Wonderswan uses a 11 bit
frequency. We set the pitch using ports 086h (L) and 087h (H)... we only have 6 pitch bits in our chibisound parameter, so we need to bitshift! |
|
If bit 7 of our chibisound parameter is 1, we need to set the
noise to on! We need to set the Noise on with bit 7 of port 090h (we also set channel 4 on with bit 3). We also need to set the noise to ON, and configure it with port 08Eh |
|
If noise is off, we just need to set bit 3 of port 090h to 1 to
enable the channel without noise. |
Sound channels 2,3 and 4 on the Wonderswan all have different capabilities, but at a basic level they all play digital samples with frequency synthesis. |