Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

WAV через PC-Speaker...

0 views
Skip to first unread message

Vlad Ushanyov

unread,
Jan 6, 1999, 3:00:00 AM1/6/99
to
[ ] Здорово, All!

Вот откопал я неплохенький алгоритм проигрывания Wave через PC-Speaker.
Единственный недостаток, это то что нормально она играет только на 286 ;)

В каком месте вставить LOOP, чтобы и на пентаках поперла?

=== ачало BOB2.ASM ===
start:
cli
lea bx,[Wave_Data]
mov si,0
in al,61h
and al,0FEh
out 61h,al
Get_Byte:
mov ah,2
Twice:
mov cl,[bx+si]
cmp cl,0
je Exit
mov ch,0
in al,61h
or al,2
out 61h,al
shr cl,1
DL1: loop DL1
mov cl,7Eh
sub cl,[bx+si]
mov ch,0
in al,61h
and al,0FDh
out 61h,al
shr cl,1
DL2: loop DL2
dec ah
jnz Twice
inc si
jmp Get_Byte
Exit:
sti
int 20h

;Wave_Table db ....... , 0
;8 бит, МОHО, до неприличия низкая частота дискретизации ;)
=== Конец BOB2.ASM ===


Удачи вам в Hовом Году, All!

... Format completed!

Rostislav Romanenko

unread,
Jan 8, 1999, 3:00:00 AM1/8/99
to
Hello, Vlad!

Сpд Янв 06 1999 18:55, Vlad Ushanyov написал All:

VU> Вот откопал я неплохенький алгоритм проигрывания Wave через
VU> PC-Speaker. Единственный недостаток, это то что нормально она играет
VU> только на 286 ;)
VU>
VU> В каком месте вставить LOOP, чтобы и на пентаках поперла?
VU>
VU> === ачало BOB2.ASM ===
VU> start:
VU> cli
VU> lea bx,[Wave_Data]
VU> mov si,0
VU> in al,61h
VU> and al,0FEh
VU> out 61h,al

Лучше:
xor cx,cx
Get_Byte:
mov ah,2
Twice:
or cl,[bx][si]
je Exit

VU> in al,61h
VU> or al,2
VU> out 61h,al
VU> shr cl,1
VU> DL1: loop DL1

Пихать нада внутрь ентого цикла LOOP ...

VU> mov cl,7Eh
VU> sub cl,[bx+si]
VU> mov ch,0

^ Эта команда - лишняя.

VU> in al,61h
VU> and al,0FDh
VU> out 61h,al
VU> shr cl,1
VU> DL2: loop DL2

...и сюда тоже такую же задержку.
(Кстати пустой LOOP пень имхо может оптимизировать до NOP ;) ).

VU> dec ah
VU> jnz Twice
VU> inc si
VU> jmp Get_Byte
VU> Exit:
VU> sti
VU> int 20h
VU>
VU> ;Wave_Table db ....... , 0
VU> ;8 бит, МОHО, до неприличия низкая частота дискретизации ;)
VU> === Конец BOB2.ASM ===

Bye, Rostislav


Vlad Ushanyov

unread,
Jan 9, 1999, 3:00:00 AM1/9/99
to
[ ] Здорово, Rostislav!

RR> or cl,[bx][si]
RR> je Exit


VU>> in al,61h
VU>> or al,2
VU>> out 61h,al
VU>> shr cl,1
VU>> DL1: loop DL1

RR> Пихать нада внутрь ентого цикла LOOP ...
Hа сколько видно, тут loop зависит от содержимого Wave_Data.
Hо Wave данные это же не нота,длительность.

И вообще порт 61h для чего? Знаю что PC-Speaker'овский, но что в него пихать?

Удачи вам в Hовом Году, Rostislav!

... Format completed!

Rostislav Romanenko

unread,
Jan 10, 1999, 3:00:00 AM1/10/99
to
Hello, Vlad!

Суб Янв 09 1999 22:41, Vlad Ushanyov написал Rostislav Romanenko:

RR>> or cl,[bx][si]
RR>> je Exit
VU>>> in al,61h
VU>>> or al,2
VU>>> out 61h,al
VU>>> shr cl,1
VU>>> DL1: loop DL1
RR>> Пихать нада внутрь ентого цикла LOOP ...

VU> Hа сколько видно, тут loop зависит от содержимого Wave_Data.
VU> Hо Wave данные это же не нота,длительность.

Hасколько можно судить по программе - каждый байт - это длительность
периода колебания, исчисляемая в неких единицах.

VU> И вообще порт 61h для чего? Знаю что PC-Speaker'овский, но что в него
VU> пихать?

Он вовсе и не PC-спикеровский, точнее не только евоный (от РС-спикера
тама тока 2 младших бита). Вот глянь:
=== Cut ===
Порт B (61H)
бит 0 PC,XT,PCjr: управляет каналом 2 таймера 8253
1 PC,XT,PCjr: вывод на динамик
2 PC: выбор содержимого порта C
PCjr: 1 = символьный режим, 0 = графический
3 PC,PCjr: 1 = кассетный мотор выключен
XT: выбор содержимого порта C
4 PC,XT: 0 = разрешение ОЗУ
PCjr: 1 = запрет динамика и мотора кассеты
5 PC,XT: 0 = разрешение ошибок щелей расширения
6 PC,XT: 1 = разрешение часов клавиатуры
5-6 PCjr: выбор динамика (00 = 8253, 01 = кассета,
10 = ввод/вывод, 11 = микросхема 76496)
7 PC: выбор содержимого порта A
PC,XT: подтверждение клавиатуры
=== Cut ===
Бит 0 управляет работой 2-го канала таймера (сигнал GATE2), если он
=1 - канал работает.
Бит 1: =1/=0 - разрешение/запрет подачи звука на динамик.
Ладно нарисую:

канал 2 ┌─────┐
таймера ───┤ & │
│ O───┐
бит 1 ───┤ │ │ ┌─────┐
└─────┘ └───┤ & │
│ ├─── на динамик
бит 0 ─────────────────┤ │
└─────┘
Эта я сам придумал ;)
Хотя бит 1 в действительности используется немного не так, но в
общем конечный результат тот же.
Исходя из схемы, формировать звук на РС-спикере можно либо через таймер,
либо через бит 0, либо и так и так.

Bye, Rostislav

... p9R

Vadim Ochkin

unread,
Jan 16, 1999, 3:00:00 AM1/16/99
to
Пpивет, Vlad!

Сpд Янв 06 1999 18:55, Vlad Ushanyov wrote to All:

VU> Вот откопал я неплохенький алгоритм проигрывания Wave через
VU> PC-Speaker. Единственный недостаток, это то что нормально она играет
VU> только на 286 ;)

VU> В каком месте вставить LOOP, чтобы и на пентаках поперла?

От пpеpываний делать надо имхо. Тогда пpоблем нигде не будет, кpоме
многозадачных ос ес-но.

Пока!

0 new messages