VOGONS


Tandy Nano - 3 Voice Soundcard ISA - Lowprofile

Topic actions

Reply 140 of 145, by Benedikt

User metadata
Rank Oldbie
Rank
Oldbie
theelf wrote on 2025-07-02, 08:56:
I have a 286, put the tandy nano sound card, download patches games from ftp.oldskool.org ... and nothing, silence, tested wi […]
Show full quote

I have a 286, put the tandy nano sound card, download patches games from ftp.oldskool.org ... and nothing, silence, tested with maniac mansion or zak same result

This patched games redirect to 0c0h or whatever need or spect the card? sorry im a little lost

I id a little code to send a beep to 0c0h but i get no beep on tandy nano

#include <dos.h>

int main() {
union REGS regs;

regs.h.ah = 0x00;
regs.h.al = 0x00;

int86(0xC0, &regs, &regs);

return 0;
}

Sorry, im totally lost how to get sound in patched games in this card in my 286 PC!

thanks!

Firstly, do the patched games contain the "out 0c0h,al" to "int 0c0h" substitution or do they merely skip the hardware detection?
Secondly, if they contain it, where is the interrupt handler? Has it been embedded into the game or is it in a separate TSR driver?
Thirdly, your test code frankly does not look like it does anything sensible.

Reply 141 of 145, by theelf

User metadata
Rank Oldbie
Rank
Oldbie

Ok, sorry, my mistake, i believe the tandy patches are for redirect calls from 0C0h to 2C0h, my mistake, they just patch can be use tandy sound without tandy hardware/video!

then the isa tandy card in a 286 is more or less useless for games, true?

thanks for help

Sorry im lost @Benedikt , thank for your help […]
Show full quote

Sorry im lost @Benedikt , thank for your help

I have a Tandy ISA nano sound card, the ftp for patched games http://ftp.oldskool.org/pub/TandySoundPatches/Games/ a lot of games with the exe from patched games, a 286 PC... What i need to have tandy music on this games?¿

Tandy nano ISA
patches games
286 PC

= tandy sound?¿?¿

Same patched games sound great in a 386 with temu,

DAC on LPT
patched games
386

= Tandy sound!

but i get the ISA card because i have a 286... im totally lost, sorry!

PD: (About my test, you right, i mistake, was testing temu, get confused, sorry my fault. Erased to avoid confusion)

Reply 142 of 145, by Jo22

User metadata
Rank l33t++
Rank
l33t++

Hi, I'm probably stating the obvious, but to sumarize..

Address 0C0 hex is the location of the PSG in the original Tandy 1000 computers.
When Tandy later made some 286-based models, they switched to 1E0 hex.

Now the problem is that on PC/AT class computers the 0C0 hex address is already occupied by second DMA controller.
So using it can have strange side efffects.

So why not just using 1E0 hex on the Tandy card instead ?
Because IBM PCs can not read from addresses below 1F0 hex and it's safer to not use this range.
Despite the fact that the sound chips are only being written to.

So that's why 2C0 hex is default address for the card.
It's the least troublesome configuration (once the games are patched).

Edited.

PS: This is just about a resource conflict. The 286 processor isn't the issue.
You can use Turbo XTs with 286 or 386 upgrade CPUs no problem.

"Time, it seems, doesn't flow. For some it's fast, for some it's slow.
In what to one race is no time at all, another race can rise and fall..." - The Minstrel

//My video channel//

Reply 143 of 145, by theelf

User metadata
Rank Oldbie
Rank
Oldbie
Jo22 wrote on 2025-07-02, 22:31:
Hi, I'm probably stating the obvious, but to sumarize.. […]
Show full quote

Hi, I'm probably stating the obvious, but to sumarize..

Address 0C0 hex is the location of the PSG in the original Tandy 1000 computers.
When Tandy later made some 286-based models, they switched to 1E0 hex.

Now the problem is that on PC/AT class computers the 0C0 hex address is already occupied by second DMA controller.
So using it can have strange side efffects.

So why not just using 1E0 hex on the Tandy card instead ?
Because IBM PCs can not read from addresses below 1F0 hex and it's safer to not use this range.
Despite the fact that the sound chips are only being written to.

So that's why 2C0 hex is default address for the card.
It's the least troublesome configuration (once the games are patched).

Edited.

PS: This is just about a resource conflict. The 286 processor isn't the issue.
You can use Turbo XTs with 286 or 386 upgrade CPUs no problem.

Yes my fault, i dont know why i was thinking that patched games means output in 2C0 instead of 0C0

Reply 144 of 145, by carlostex

User metadata
Rank l33t
Rank
l33t
theelf wrote on 2025-07-03, 11:37:

Yes my fault, i dont know why i was thinking that patched games means output in 2C0 instead of 0C0

Patching to output directly in 2C0h is a huge endeavour. At least it is for me. Maybe if in the future we get an AI model specialized in real mode DOS asm we can somehow go around this.
So basically OUT C0, AL is a 2 byte instruction that translates to E6 C0. You can't OUT 2C0, AL, so you need to: MOV DX, 2c0 and then OUT DX, AL. This translate into a lot more bytes than originally, so every CALL and JMP instruction in between this code needs to be recalculated, otherwise they're gonna land into where it makes no sense and end in a crash.

Originally when i patched the idea was to defeat the Tandy detection only so data for the music chip is written to 0C0h. This requires a redirector TSR, which requires port trapping provided by QEMM or EMM386.

The alternative Benedict and others are suggesting is to patch OUT C0, AL to INT C0 instead. INT C0 is also a 2 byte instruction that translates to CD C0, IIRC. But someone needs to write the interrupt handler that will grab the data on the AL register and send it to port 2C0h or any other port. The advantage of this is that it wouldn't need EMM386 or QEMM, you just need to run the custom interrupt handler once every boot.

I never bothered to patch the games to INT C0h, but if someone writes an interrupt handler for it, i don't mind repatching some games to test and eventually repatch them all for that trick instead. Both option patched binaries could be maintained the same.

For instance, i've rewritten the Tandy 3 voice driver for the AIL2 library so that the driver will accept a 2 byte port. And it works just fine. But we have the source code for AIL2. Patching binaries for a 2 byte port is an insane amount of work.

Reply 145 of 145, by theelf

User metadata
Rank Oldbie
Rank
Oldbie
carlostex wrote on Yesterday, 19:41:
Patching to output directly in 2C0h is a huge endeavour. At least it is for me. Maybe if in the future we get an AI model specia […]
Show full quote
theelf wrote on 2025-07-03, 11:37:

Yes my fault, i dont know why i was thinking that patched games means output in 2C0 instead of 0C0

Patching to output directly in 2C0h is a huge endeavour. At least it is for me. Maybe if in the future we get an AI model specialized in real mode DOS asm we can somehow go around this.
So basically OUT C0, AL is a 2 byte instruction that translates to E6 C0. You can't OUT 2C0, AL, so you need to: MOV DX, 2c0 and then OUT DX, AL. This translate into a lot more bytes than originally, so every CALL and JMP instruction in between this code needs to be recalculated, otherwise they're gonna land into where it makes no sense and end in a crash.

Originally when i patched the idea was to defeat the Tandy detection only so data for the music chip is written to 0C0h. This requires a redirector TSR, which requires port trapping provided by QEMM or EMM386.

The alternative Benedict and others are suggesting is to patch OUT C0, AL to INT C0 instead. INT C0 is also a 2 byte instruction that translates to CD C0, IIRC. But someone needs to write the interrupt handler that will grab the data on the AL register and send it to port 2C0h or any other port. The advantage of this is that it wouldn't need EMM386 or QEMM, you just need to run the custom interrupt handler once every boot.

I never bothered to patch the games to INT C0h, but if someone writes an interrupt handler for it, i don't mind repatching some games to test and eventually repatch them all for that trick instead. Both option patched binaries could be maintained the same.

For instance, i've rewritten the Tandy 3 voice driver for the AIL2 library so that the driver will accept a 2 byte port. And it works just fine. But we have the source code for AIL2. Patching binaries for a 2 byte port is an insane amount of work.

Hi thanks a lot for your great anwer, reading you i understand much better what the patchs a re doing

I have a question, i was thinking what do you say to patch OUT C0, AL to INT C0, and I decide to do some test

I patched Zak McKracken changing all E6C0 calls to CDC0 ones

I did this small Borland C++ code, is a TSR to send game data directo to parallel, i have a covox

#include <dos.h>

void interrupt (*old_int_c0)();

void interrupt new_int_c0()
{
unsigned char al_val;

asm {
push ax
mov al_val, al
pop ax
}

outp(0x378, al_val);

}

int main()
{
old_int_c0 = getvect(0xC0);
setvect(0xC0, new_int_c0);

keep(0, _psp >> 4);

return 0;
}

and funny thing, i get sound! like i can hear zak steps or the clock in zak room, and i can know the music is playing because the rythm is same! i only need a SN76496 emulator in the middle jeje

My question is, if i redirect instead of 378 to 2C0 do you think will work if i have a tandy isa card in my 286?

thanks a lot