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