Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Music in DOS, :::::::::::::::::::::::::::::::::::; 
:(
    Опции темы
xach
  Дата 4.7.2005, 03:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 22.10.2004
Где: СПб

Репутация: нет
Всего: нет



Привет Друзья!

Как на счёт звука (пусть даже самого простейшего) на АСМе.
Можно ссылочку, но пожалуйста на русском, а то английский слишком
утомительным получается. Я имею ввиду чистый код, без всяких DLL и модулей.

smile
PM MAIL   Вверх
Akina
Дата 4.7.2005, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 1
Всего: 454



В ДОсе?

Код

Beep Proc
mov ah,2
mov dl,7
int 21h
ret
Beep endp


Проще уж просто некуда...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
xach
Дата 5.7.2005, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 22.10.2004
Где: СПб

Репутация: нет
Всего: нет



Я имею ввиду хотя б простую мелодию выдать.
Не обязательно из Спикера...
PM MAIL   Вверх
oleg1973
Дата 5.7.2005, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 2
Всего: 34



xach
если не на спикер то значит на звуковуху
если на звуковуху то нада знать модель, так как в досе HAL нету и подход персональный к каждой карте
кстати в инете куча сорцов о програмировании SB16-32
НО современные SB1024 и позже нихренам не совместимы, сам проверял, и прямому програмирования из доса не поддаются за неимением документации


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
xach
Дата 6.7.2005, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 22.10.2004
Где: СПб

Репутация: нет
Всего: нет



Раз всё так ужасно... Как на счёт спикера тогда уж... Возможно ли
извлечь из него мелодию, которая бы не раздражала уши? smile
Тогда уж подскажите про спикер (там уж всё просто должно быть (я так думаю))!
Именно мелодию, а не beep.
PM MAIL   Вверх
monax
Дата 14.7.2005, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 9.6.2005

Репутация: нет
Всего: 4



Раньше никогда этим не занимался, но стало интересно и вот...
Программа играет (точнее имитирует)
"-Чижик Пыжик, где ты был?
-На Фонтанке водку пил"
Информация о динамике взята отсюда.
Код

code segment
assume cs:code, ds:code, es:code
org 100h
start:

; -----сохранение старого вектора прерывания от таймера-----
mov ah,35h  
mov al,8h
int 21h
mov old_08_seg,es
mov old_08_off,bx
;-----замена прерывания от таймера------
lea dx,IsrTimer
mov ah,25h
mov al,8h
int 21h

mov ah,9h
lea dx,mymsg
int 21h
xor ah,ah ;ждём нажатия клавиши, пока не нажата, играет музыка
int 16h

;------восстанавливаю вектор прерывания от таймера------
mov ah,25h
mov al,8h
mov ds,old_08_seg
mov dx,old_08_off
int 21h

;-----выключение динамика------
in al,61h
and al,11111100b
out 61h,al

mov ax,4c00h ;выход в ДОС
int 21h


IsrTimer proc far ;обработчик прерывания от таймера
push ax
push si
push ds
push dx

    push cs
    pop ds    

    inc m    
    cmp index,30
    jl TimerMet1
    mov index,0 ;обнуление счётчика
TimerMet1:    
    lea si,delay
    add si,index
    mov cx,[si]    
    cmp m,cx
    jl TimerMet2
pop ds    
    mov al,10110110b
    out 43h,al

    in al,61h
    or al,00000011b
    out 61h,al
push ds
push cs
pop ds
    xor dx,dx    
    lea si,chast
    add si,index
    mov ax,[si]
    mov tone,ax    
    mov ax,11900
    div tone
    mul tt

    out 42h,al
    mov al,ah
    out 42h,al
    mov m,0    
    add index,2
TimerMet2:    
    
    ;inc m            
    mov al,20h ;разрешить другие прерывания

pop dx
pop ds
pop si
pop ax

iret
IsrTimer endp
;----------------------данные-------------------

mymsg db 'Press any key$'
old_08_seg dw 0
old_08_off dw 0
index dw 0
m dw 0
tt db 100
tone dw 0

delay dw 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 2, 2, 4, 4, 8
chast dw 392, 311, 392, 311, 415, 392, 349, 233, 233, 233, 261, 293, 311, 311, 311;частоты
code ends
end start


Вот как это выглядит на С++
Код

#include<dos.h>
#include<conio.h>

int chast[15]={392,311,392,311,415,392,349, 233,233,233,261,293,311,311,311};
int dlit[15]={200,200,200,200,200,200,400,200,200,200,100,100,200,200,400};//задержки в милисекундах
void main()
{
int i;
i=0;
while(!kbhit())
    {
    if(i>=15) i=0;
    sound(chast[i]);
    delay(dlit[i]);
    i++;
    }
nosound();
}


Вся идея довольно проста: зная частоту ноты и её длительность в мелодии, можно сделать некое подобие музыки.
Ассемблерный код компилировал 5-м тасмом, с++ - BC 3.1.
--------------------
Лаборатория программиста
PM MAIL WWW ICQ Jabber   Вверх
Mayk
Дата 14.7.2005, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: нет
Всего: 134



В игре Doom2D использовался спикер для воспроизведения голосовых сообщений. Качество, как у плохого телефона, но всё же. Как они это делают?


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
oleg1973
Дата 15.7.2005, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 2
Всего: 34



ну так никто не запрешает через спикер прогнать wav
толко нада сначала сделать его как бы однобитным имхо
тоесть там в порту спикера за звук если не путаю 1 бит только отвечает


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
xach
Дата 16.7.2005, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 22.10.2004
Где: СПб

Репутация: нет
Всего: нет



Со спикером я воспринял)... т.е. ещё не попробовал, но обязательно сдеалаю это
Вот увидел програмку в 111 байт с 0a000h (это party). Там звук выдаётся (по заверению
автора) через 220h порт... Хотя при дизассемблировании я увидел передачу в 226h и в 22ch
порты...(если ошибся извините))) Просто скопировал часть кода в Фасм, а звука нет
(уверен, что скопировал не то(или не всё) => не пишите, что я не то скопировал)))
Лучше помогите разобраться с кодом)))..
(под XP не работает(может можно через эмулятор какой-нибудь))

Присоединённый файл ( Кол-во скачиваний: 22 )
Присоединённый файл  Fuzz_snd.com 0,11 Kb
PM MAIL   Вверх
chyapay
Дата 18.8.2006, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 6.2.2006
Где: UA, Lviv

Репутация: нет
Всего: нет



Чувак, я так понял, ты наше какую-то дребедень про СаундБластер. Я тоже когда-то этим страдал. 
это старый хороший стандарт звуковых плат с портами 220h(227h, 22Fh) для восьмибитных и шестнадцатибитных 
Само собой, эта штука на новых звуковых проконает разве что из-под винды, которая спецыально эмулирует 
для досовских приложений этот интерфейс. Но и это - при большом везении. И я уверен, что ты правильно скопировал
эту хрень, но, к сожалению, играть она будет разве что на старом 386 динозавре с ИСАшной звуковой. 
В данном случае я могу порекоммендовать только одно : ищи в интернете документацию под свою звуковуху,
они обычно в формате ПДФ, типа AC97AudioController-specs.pdf, линков пока никаких дать не могу: сам этим делом страдаю, пока еще нифига не нашел. 
PM MAIL ICQ YIM   Вверх
10110111
Дата 29.8.2006, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 28.8.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 1



Спецификация на AC97 - не проблема:
http://www.intel.com/design/chipsets/audio/ac97r22.pdf
В DDK есть даже пример WDM-драйвера.
Проблема вот в чем: когда я под DOS пытаюсь читать из пространства I/O Mixer'а, проц зависает; но на этом же компе Windows ME без проблем воспроизводит звук. Я уже думал, может, под DOS AC97 выключен, но отключение APM не дало никакого результата.
Может, кто-нибудь знает, почему такое может быть?
PM MAIL   Вверх
10110111
Дата 30.10.2006, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 28.8.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 1



Я написал прогу, выводящую WAVы через спикер: по знаку выборки из WAV'а
Вызывается так:
<prgname> [[Path\]Filename.wav]
Если параметров нет, она их запрашивает.
Вот её код(извините, что без комментов - надеюсь, принцип действия очевиден. Если у без них не понятно, скажите - я поясню):
Код

    org    80h
CmdLineLength:
    org    $+1
CmdLine:
    org    256
    mov    al,byte [CmdLineLength]
    cmp    al,1
    jbe    CmdLineEmpty
GetCmdLoop:
    mov    al,20h
    mov    cx,80h
    mov    di,CmdLine
    repe    scasb
    je    CmdLineEmpty
    dec    di
    cmp    byte [di],0dh
    je    CmdLineEmpty
    mov    dx,di
    mov    al,0dh
    repne    scasb
    jne    CmdLineEmpty
    dec    di
    mov    byte [di],0
    jmp    OpenFile
CmdLineEmpty:
    mov    ah,9
    mov    dx,PromptStr
    int    21h
    mov    ah,0ah
    mov    dx,FileNameStr
    mov    si,dx
    inc    si
    int    21h
    mov    ah,9
    mov    dx,CrLf
    int    21h
    mov    bl,byte [si]
    test    bl,bl
    jz    FileReadError
    mov    bh,0
    inc    si
    cmp    byte [bx+si],0dh
    jne    FileReadError
    mov    byte [bx+si],0
    mov    dx,FileName
OpenFile:
    mov    ax,3d00h
    int    21h
    jc    FileReadError
    mov    bx,ax
    mov    word [FileHandler],ax
    mov    ah,3fh
    mov    cx,24h
    mov    dx,FileBuffer
    mov    si,dx
    int    21h
    jc    FileReadError
    cmp    dword [si],"RIFF"
    jne    FormatError
    cmp    dword [si+8],"WAVE"
    jne    FormatError
    cmp    dword [si+0ch],"fmt "
    jne    FormatError
    cmp    word [si+14h],1
    jne    FormatError
    mov    edi,dword [si+18h]
    mov    cx,word [si+22h]
    cmp    cx,8
    jne    Is16Bit
    dec    byte [Instruction0ToMod]
    dec    byte [Instruction1ToMod]
    jmp    DoneSelfModifying
Is16Bit:
    cmp    cx,16
    jne    FormatError
DoneSelfModifying:
    mov    ax,word [si+20h]
    mov    word [BXIncrement],ax
    mov    ah,3fh
    mov    dx,FileBuffer
    mov    cx,8
    int    21h
    jc    FileReadError
    cmp    dword [si],"data"
    je    ParsingEnded
    mov    dx,word [si+4]
    mov    cx,word [si+6]
ReReadFile:
    mov    ax,4201h
    int    21h
    jc    FormatError
    mov    ah,3fh
    mov    cx,8
    mov    dx,FileBuffer
    int    21h
    jc    FileReadError
    cmp    dword [si],"data"
    je    ParsingEnded
    mov    dx,word [si+4]
    mov    cx,word [si+6]
    jmp    ReReadFile
ParsingEnded:
    push    0
    pop    ds
    mov    eax,dword [8*4]
    mov    word [8*4],IRQ0Handler
    mov    word [8*4+2],cs
    mov    ds,word [8*4+2]
    mov    dword [OldHandler],eax
LP:
    cmp    byte [Flag],1
    jne    LP
    mov    eax,dword [Freq]
    mov    edx,dword [Freq+4]
    mov    ecx,596590
    mov    ebx,32768
    mul    ecx
    div    ebx
    xor    edx,edx
    div    edi
    mov    ebp,eax
    mov    ah,9
    mov    dx,TipStr
    int    21h
    jmp    NewPart
MainLoop:
    mov    al,byte [temp]
    out    61h,al
EnterMainLoop:
    rdtsc
    mov    esi,eax
    mov    edi,edx
Instruction0ToMod:
    mov    dx,word [bx] ;8bh -> 8ah = word -> byte
    cmp    bx,cx
    ja    NewPart
    add    bx,word [BXIncrement]
    in    al,61h
    or    al,2
Instruction1ToMod:
    test    dx,dx ;85h -> 84h = word -> byte
    sets    ah
    add    ah,ah
    or    al,ah
    sub    ah,3
    and    al,ah
    mov    byte [temp],al
    mov    ah,1
    int    16h
    jnz    OutOfMainLoop
LP0:
    rdtsc
    sub    eax,esi
    sbb    edx,edi
    test    edx,edx
    jnz    MainLoop
    cmp    eax,ebp
    jb    LP0
    jmp    MainLoop
OutOfMainLoop:
    mov    ah,0
    int    16h
    retn
NewPart:
    mov    ah,3fh
    mov    bx,word [FileHandler]
    mov    cx,7ffch
    mov    dx,FileBuffer
    int    21h
    jc    FileReadError
    test    ax,ax
    jz    Exit
    mov    cx,ax
    add    cx,FileBuffer
    mov    bx,FileBuffer
    jmp    EnterMainLoop
FileReadError:
    mov    dx,FileReadErrorMessage
    jmp    CommonError
FormatError:
    mov    dx,FormatErrorMessage
CommonError:
    mov    ah,9
    push    cs
    pop    ds
    int    21h
Exit:
    retn
IRQ0Handler:
    pushad
    rdtsc
    push    ds
    push    cs
    pop    ds
    cmp    byte [Flag],0ffh
    jne    NotFF
    mov    byte [Flag],0
    jmp    IntRet
NotFF:
    sub    eax,dword [Freq]
    sbb    edx,dword [Freq+4]
    mov    byte [Flag],1
    mov    ecx,[OldHandler]
    push    0
    pop    ds
    mov    dword [8*4],ecx
IntRet:
    mov    dword [cs:Freq],eax
    mov    dword [cs:Freq+4],edx
    pop    ds
    mov    al,20h
    out    20h,al
    popad
    iret
FileReadErrorMessage:
    db    "Error reading file",13,10,24h
FormatErrorMessage:
    db    "Error parsing file"
CrLf:
    db    0dh,0ah,24h
PromptStr:
    db    "Enter file name (PCM WAV format)",13,10,24h
TipStr:
    db    "Press any key to stop playback & quit",13,10,24h
Flag:
    db    0ffh
FileNameStr:
    dw    254
FileName:
    org    $+255
temp:
    org    $+1
BXIncrement:
    org    $+2
Freq:
    org    $+8
OldHandler:
    org    $+4
FileHandler:
    org    $+2
FileBuffer:

Да, компилил я её с помощью FASM 1.65

Это сообщение отредактировал(а) 10110111 - 11.11.2006, 23:38
PM MAIL   Вверх
xach
  Дата 28.12.2007, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 22.10.2004
Где: СПб

Репутация: нет
Всего: нет



10110111

волшебная программа!  smile  ..очень юзабельна! =) спасибо

теперь вопросы:
 - как происходит временная синхронизация? (я в коде узрел rdtsc, подозреваю что с помощью неё, но подробности не помешают!)
 - какой код отвечает за установку и сброс спикера? (и про инициализацию его тоже оч интересно)

заранее мерси!
PM MAIL   Вверх
SABROG
Дата 29.12.2007, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: нет
Всего: 91



Помню была у меня такая прога, работала только в досе, а жаль, вот бы юзер обкакался запустив какой-нибудь кейген в винде ;)


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
xach
Дата 30.12.2007, 04:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 22.10.2004
Где: СПб

Репутация: нет
Всего: нет



итак, со спикером я разобрался, а вот с синхронизацией - нет.

очень бы хотелось повесить перезагрузку 2-го таймера на прерывание, а как это сделать гугл не говорит...возможен, конечно следующий вариант:
зная период 0-го таймера (18 с чем-то герц (при надобности легко узнать точное значение)) замерить его в тактах процессора (rdtsc) а потом ориентироваться чисто на rdtsc. получается точно, но не элегантно: прога постоянно зациклена и опрашивает tsc. 

В варианте же с прерыванием точность почти 100%, а затраты процессорного времени - минимальны (такую прогу можно даже резидентной сделать).

smile

З.Ы. всё, естественно под чистый dos.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для Windows/DOS"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для Windows/Dos | Следующая тема »


 




[ Время генерации скрипта: 0.1264 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.