1

私は、現在リアル モードで 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

その理由は何ですか?任意の提案をいただければ幸いです。

4

0 に答える 0