I finally figured it out! I had given up months ago. I couldn't find any help other than this thread which died off.
This is totally because of a misunderstanding of when to use CTCM and when to use CTCU. The readme that comes with the software is not clear at all.
The short answer is never run CTCM and always run CTCU at boot.
Here are my steps:
1) Remove all references to anything sound blaster from config.sys and autoexec.bat
2) Delete the SB16 and CTCM folder (when installing SB16 it will check for presence of the ctcm folder)
3) Install SBBASIC first, during the install it will tell you that you need a PNP config manager, it will then ask you to install CTCM
4) After all of this go into CTCU and set the configuration to config 0 which is 220, 330, 388, IRQ5, DMA 1, DMA3
5) Saving this gets written to c:\ctcm\ctpnp.cfg
In config.sys there should be
DEVICE=C:\CTCM\CTCM.EXE
In autoexec.bat there should be
SET SOUND=C:\SB16
SET BLASTER=A220 I5 D1 H1 P330 T6
SET MIDI=SYNTH:1 MAP:E
SET CTCM=C:\CTCM
C:\SB16\DIAGNOSE /S /W=C:\WINDOWS
C:\SB16\MIXERSET /P /Q
C:\CTCM\CTCU /S /W=C:\WINDOWS
All of this was auto configured. Do not copy/paste this. I wrote it out by hand so expect typos.
I do now know how this happened before but I had CTCM being run in autoexec. This IS the problem. It appears that when you run CTCM what it does it auto configure the card to whatever irq it deems desirable. In my case this is always irq 9 and address of 240 which is undesirable. I have no idea why the program picks this when irq 5 220 is available. Anyway what CTCM does is probe, then sets the card then write this information to the config file.
For some reason I thought CTCM would read the config file and respect what's in it. It does not. Its job is to write to that file not read it.
CTCU is the right program for the job. It will read that config file and apply it.
This isn't intuitive because a) it's not documented anywhere and b) running CTCU produces a user interface for changing the pnp settings and writing out to that config file. So both CTCU and CTCM write out to this config file. My assumption was one program reads in the config and the other writes out to it. This is a bad assumption.
CTCU does two jobs. 1) a UI for setting card settings and writing the config to a file 2) reading that file in from the command line and applying those settings to the card.
That's it. I had CTCM running at each boot which would pick the wrong settings and overwrite my good config.
Never run CTCM.exe from autoexec.bat or manually from the command prompt. Doing so will overwrite your ctpnp.cfg file. You will have to run CTCU.exe and reconfigure the card again to update ctpnp.cfg back to your good config.
I think CTCM.exe is supposed to be loaded as a device driver, hence why it's in config.sys. But if you run it from the command prompt it acts like "go to defaults" auto setup. Or maybe it's like "ask the PNP BIOS what settings I should use".
Where as CTCU is "tell the card/pnp bios what settings the users specified" and "let the user build a config file using a UI".
So it's confusing that there are two programs, both which do two things each, and those two things are very different from each other. It would have been clearer with better documentation or with 4 exe files, each doing only one thing:
PNP BIOS Interface
Configuration Setter
Configuration Getter
Configuration Builder
Anyway I'm putting all this here so verbosely hoping it will save others some trouble down the road.