我一直在尝试编写一个产生一些声音的小程序,作为我目前在实模式下学习 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
可能是什么原因?任何建议表示赞赏。