1

我一直在尝试编写一个产生一些声音的小程序,作为我目前在实模式下学习 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

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

4

0 回答 0