Генерация звука musi c с помощью динамика P C - PullRequest
0 голосов
/ 08 мая 2020

У меня есть этот код:

IDEAL
MODEL small
STACK 100h
DATASEG
CODESEG

PROC PLAY
        mov al, 182         
        out 43h, al          

        out 42h, al        
        mov al, ah          
        out 42h, al 
        in al, 61h         
        or al, 00000011b   
        out 61h, al        
        mov bx, 15         
pauseSound:
        mov cx, 65535
pause2:
        dec cx
        jne pause2
        dec bx
        jne pauseSound

        in  al, 61h         

        and al, 11111100b   
        out 61h, al         

        RET
    END PLAY

start:      


       mov ax, 2712
       call PLAY


       MOV AX, 3834
       call PLAY
exit :

    mov ax, 4C00h
    int 21h
    END start

Эта программа должна воспроизводить один звук в течение нескольких секунд, а затем другой звук в течение нескольких секунд. Однако я слышу только первый, а не второй, в чем проблема / ошибка?
Спасибо

1 Ответ

1 голос
/ 08 мая 2020

Директива END предписывает TASM прервать сборку, а также указывает точку входа в программу. В исходном коде TASM должна быть только одна такая директива, обычно в последней строке. Из-за вашей опечатки TASM собирает только подпрограмму PLAY, и он недостаточно умен, чтобы предупредить вас, что PROC PLAY не завершен правильно.

Измените END PLAY на ENDP PLAY, и ваша программа будет работать .

Обновление : Я собрал вашу программу с помощью

> tasm Meow.asm
Turbo Assembler  Version 4.0  Copyright (c) 1988, 1993 Borland International
Assembling file:   Meow.asm
Error messages:    None
Warning messages:  None
Passes:            1

, а затем скомпоновал и запустил в DOSBox на Windows 10 64-битных:

> ver
> DOSBox version 0.74-2. Reported DOS version 5.00.
> tlink Meow.obj
Turbo Link  Version 3.01 Copyright (c) 1987,1990 Borland International
> Meow.exe
>

, и он сыграл два тона с высоким и низким тоном, длительностью примерно 0,8 секунды каждый, а затем завершил работу, как и ожидалось. . Вы также можете добавить несколько фиктивных инструкций в pause2, но, как правило, измерение времени с помощью jne pause2 очень ненадежно на новых компьютерах, особенно с эмуляторами.

...