Вот откопал я неплохенький алгоритм проигрывания 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!
С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
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!
Суб Янв 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
Сpд Янв 06 1999 18:55, Vlad Ushanyov wrote to All:
VU> Вот откопал я неплохенький алгоритм проигрывания Wave через
VU> PC-Speaker. Единственный недостаток, это то что нормально она играет
VU> только на 286 ;)
VU> В каком месте вставить LOOP, чтобы и на пентаках поперла?
От пpеpываний делать надо имхо. Тогда пpоблем нигде не будет, кpоме
многозадачных ос ес-но.
Пока!