NTVDM中的Sound Blaster仿真:直接模式和MPU无法按预期工作

时间:2016-04-22 01:50:50

标签: windows audio backwards-compatibility dos ntvdm

我一直在尝试编写一个小程序,以产生一些声音作为我的学生的一个例子,他们目前在实模式下学习x86汇编编程。它在从DOSBox运行时成功播放声音,但在NTVDM中运行时失败(我使用的是Windows XP)。

在所谓的直接模式下尝试访问Sound Blaster同样存在问题(执行DSP重置)。在NTVDM中似乎唯一可靠的DSP命令是0xE1 - 检索DSP版本信息。

我用于产生非内置扬声器声音的大多数MS-DOS程序在NTVDM中也不起作用。除了一些幸福的人之外。

几年前,我在内部扬声器输出方面遇到了类似的问题,事实证明,执行几个似乎可交换的初始化任务的顺序实际上很重要。但这次我找不到任何解决方案。

这是我的一段测试代码(FASM语法):

    include 'macro\proc16.inc'

MIDIPORT_DATA           = $0330
MIDIPORT_COMMAND        = $0331

        org 100h

Start:
        stdcall MIDI.Initialize

        stdcall MIDI._WriteData, $C0
        stdcall MIDI._WriteData, $00

        stdcall MIDI._WriteData, $90
        stdcall MIDI._WriteData, 60
        stdcall MIDI._WriteData, 127
        xor     ax, ax
        int     16h
        ret

proc MIDI._WriteCommand\
     bValue

     mov        dx, MIDIPORT_COMMAND
@@:
     in         al, dx
     test       al, $40
     jnz        @B

     mov        ax, [bValue]
     out        dx, al
     ret
endp

proc MIDI._WriteData\
     bValue

     mov        dx, MIDIPORT_COMMAND
@@:
     in         al, dx
     test       al, $40
     jnz        @B

     mov        dx, MIDIPORT_DATA
     mov        ax, [bValue]
     out        dx, al
     ret
endp

proc MIDI.Initialize
     stdcall    MIDI._WriteCommand, $FF
.WaitAck:
     mov        dx, MIDIPORT_COMMAND
@@:
     in         al, dx
     test       al, $80
     jnz        @B

     mov        dx, MIDIPORT_DATA
     in         al, dx
     cmp        al, $FE
     jne        .WaitAck

     stdcall    MIDI._WriteCommand, $3F
     ret
endp

可能是什么原因?任何建议都表示赞赏。

0 个答案:

没有答案