I've done a bit of looking into the used addresses by the Sound Blaster:
Read: 3 out of 4 bits decoded by the DSP?
0 (0000) C/MS
2 (0010) C/MS
4 (0100) WHAT IS THIS? DSP Write buffer Status?
6 (0110) WHAT IS THIS? DSP Read buffer status & IRQ ACK? Keeps getting read for some reason?
8 (1000) Adlib status
A (1010) DSP Read data
C (1100) DSP Write buffer status
E (1110) DSP Read buffer status&IRQ ACK
0 (0000) CMS Data 0
1 (0001) CMS Register 0
2 (0010) CMS Data 1
3 (0011) CMS Register 1
4 (0100) WHAT IS THIS? DSP Write buffer?
6 (0110) DSP reset port
8 (1000) Adlib register (100x=Adlib redirect instead? Same chip as 0x388|bit0)
(9 (1001) Adlib data, see above)
A (1010) -
C (1100) DSP Write buffer
So it looks like upper 3 bits are used to redirect to different chips:
010b: Same as 110?
011b: Same as 110?
100b: Adlib chip. Bit 0 select address line for said chip.
101b: DSP Read data
110b: DSP Write buffer status
111b: DSP Read buffer status & IRQ ACQ.
000b: CMS data/register1
001b: CMS data/register2
010b: Unknown. Is this aliased to 110b?
011b: DSP reset port? Don't know if the low bit is used? Probably not?
100b: Adlib chip select. Bit 0 selects Address line for said chip?
So, looking at the data, you can assume:
000: Wired to CMS chip 0.
001: Wired to CMS chip 1.
010: Wired to DSP?
011: Wired to DSP?
100: Wired to OPL2 chip
101: Wired to DSP?
110: Wired to DSP?
111: Wired to DSP?
And bit 0 of the address is the A0 input to the selected chips?
Edit: Hmmm... https://github.com/schlae/snark-barker/blob/m … SnarkBarker.pdf sheds some light on that:
000: CMS chip 0. A0 is connected to the chip.
001: CMS chip 1. A0 is connected to the chip.
010: Not selected
011: DSPRST_CS. So this sets the line on the DSP RST? Only bit 0 is used to archieve an effect? Not actually directly connected to the DSP(triggers DSP reset through another chip). A0 is ignored. D0 is triggering RESET pin and latched by a chip in between. Reads are not connected to anything, thus floating the bus.
100: OPL2 chip CS. A0 is connected to the chip.
101: DSPRD_CS. So this sets the line on the DSP RD? So A0 is ignored?
110: DSPWR_CS. So this sets the line on the DSP WR? So A0 is ignored?
111: DAV_CS. So this sets the line on the DAV? Connected to DAV(Data Available?), reads bit 7 on D7. A0 is ignored?