私は、現在リアル モードで x86 アセンブリ プログラミングを学んでいる学生の例として、サウンドを生成する小さなプログラムを作成しようとしています。DOSBox から実行するとサウンドの再生に成功しますが、NTVDM で実行すると失敗します (私は Windows XP のものを使用しています)。
いわゆるダイレクト モード (DSP リセットを実行) で Sound Blaster にアクセスしようとすると、同じ問題が発生します。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
その理由は何ですか?任意の提案をいただければ幸いです。