Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.03.2018, 10:58   #1
ZuevAndrew
Новичок
Джуниор
 
Регистрация: 14.03.2018
Сообщений: 2
Стрелка Музыка внутренним динамиком ПК

Нужно на ассемблере написать программу, которая бы посылала сигнал определенной частоты на внутренний динамик. В результаты издавался "бип" (Тот же самый звук, который звучит при запуске ПК).

Известно, что это нужно сделать через микросхему 8255А. Заранее спасибо.
ZuevAndrew вне форума Ответить с цитированием
Старый 14.03.2018, 11:06   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

это что-то вроде такого?

http://programmersforum.ru/showpost....18&postcount=3
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.03.2018, 15:24   #3
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Код:
mov  al,7
int  29h
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 14.03.2018, 15:29   #4
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

..эт просто прикол, хотя "бипает"
если нужно именно контроллёр прогать, то доков достаточно..
навыки есть, или очередное требование???
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 17.03.2018, 13:06   #5
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Код:
;-- Sound: генерация звука ---------------------------------------------------------------------------------------------
; Вход: AX = частота звука (Гц)
; Меняет значения AX, CX, DX
Sound  		proc
		mov	dx,12h		; минимально допустимая частота (18 Гц)
		cmp	ax,dx		; если AX <= 18 Гц,
		jbe	@@done		; то на выход, чтобы избежать переполнения при делении
		xchg	cx,ax		; CX = частота
		in	al,61h		; получаем значение из управляющего регистра порта B PPI (контроллера 8255)
		or	al,3		; устанавливаем биты 0 и 1 (включить спикер и использовать 2-й канал для генерации импульсов спикера)
		out	61h,al		; выводим значение в управляющий регистр
		mov	al,10110110b	; управляющее слово таймера: канал 2; сначала записать младший байт, затем старший; режим 3 (прямоугольный генератор импульсов); двоичное слово
		out	43h,al		; выводим значение в порт таймера
		mov	ax,34DDh	; DX:AX = 1193181 - частота работы таймера
		div	cx		; значение счётчика таймера AX = DX:AX / CX
		out	42h,al		; выводим младший байт счетчика во 2-й канал таймера
		mov	al,ah
		out	42h,al		; выводим старший байт
	@@done:	ret
Sound		endp

;-- NoSound: отключение звука ------------------------------------------------------------------------------------------
; Меняет значение AX
NoSound		proc
		in	al,61h		; получаем значение из управляющего регистра порта B PPI (контроллера 8255)
		and	al,not 3	; сбрасываем биты 0 и 1 (отключить спикер и использование 2-го канала таймера для генерации импульсов спикера)
		out	61h,al		; выводим значение в управляющий регистр порта B PPI (контроллера 8255)
		ret
NoSound		endp
Короче:
Код:
;-- SoundCnt: генерация звука ------------------------------------------------------------------------------------------
; Вход: CX = значение счётчика таймера (1193181/частоту)
; Меняет значения AX и CX
SoundCnt	proc
		in	al,61h		; получаем значение из управляющего регистра порта B PPI (контроллера 8255)
		or	al,3		; устанавливаем биты 0 и 1 (включить спикер и использовать 2-й канал для генерации импульсов спикера)
		out	61h,al		; выводим значение в управляющий регистр
		mov	al,10110110b	; управляющее слово таймера: канал 2; сначала записать младший байт, затем старший; режим 3 (прямоугольный генератор импульсов); двоичное слово
		out	43h,al		; выводим значение в порт таймера
		xchg	ax,cx		; AX = счётчик таймера
		out	42h,al		; выводим младший байт счетчика во 2-й канал таймера
		mov	al,ah
		out	42h,al		; выводим старший байт
		ret
SoundCnt	endp

;-- NoSound: отключение звука ------------------------------------------------------------------------------------------
; Меняет значение AX
NoSound		proc
		in	al,61h		; получаем значение из управляющего регистра порта B PPI (контроллера 8255)
		and	al,not 3	; сбрасываем биты 0 и 1 (отключить спикер и использование 2-го канала таймера для генерации импульсов спикера)
		out	61h,al		; выводим значение в управляющий регистр порта B PPI (контроллера 8255)
		ret
NoSound		endp
Совсем коротко, но неточно:
Код:
;-- SoundMin: генерация звука (максимально сжатая процедура) -----------------------------------------------------------
; Вход: CL = старший байт значения счётчика таймера (4661/частоту)
; Меняет значения AX и CX
SoundMin	proc
;		in	al,61h		; получаем значение из управляющего регистра порта B PPI (контроллера 8255)
;		or	al,3		; устанавливаем биты 0 и 1 (включить спикер и использовать 2-й канал для генерации импульсов спикера)	
		mov	al,3		; [вместо in al,61h + or al,3] устанавливаем биты 0 и 1 (включить спикер и использовать 2-й канал для генерации импульсов спикера)	
		out	61h,al		; выводим значение в управляющий регистр
		mov	al,10100110b	; управляющее слово таймера: канал 2; записываем ТОЛЬКО старший байт; режим 3 (прямоугольный генератор импульсов); двоичное слово
		out	43h,al		; выводим значение в порт таймера
		xchg	ax,cx		; AL = старший байт счётчика таймера
		out	42h,al		; выводим старший байт счетчика во 2-й канал таймера
		ret
SoundMin	endp

;-- NoSound: отключение звука (максимально сжатая процедура) -----------------------------------------------------------
; Меняет значение AX
NoSound		proc
;		in	al,61h		; получаем значение из управляющего регистра порта B PPI (контроллера 8255)
;		and	al,not 3	; сбрасываем биты 0 и 1 (отключить спикер и использование 2-го канала таймера для генерации импульсов спикера)
		xor	al,al		; [вместо in al,61h + and al,not 3] сбрасываем биты 0 и 1 (отключить спикер и использование 2-го канала таймера для генерации импульсов спикера)
		out	61h,al		; выводим значение в управляющий регистр порта B PPI (контроллера 8255)
		ret
NoSound		endp
p.s. Лучше использовать первый вариант.
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru

Последний раз редактировалось 7in; 17.03.2018 в 17:44.
7in вне форума Ответить с цитированием
Старый 17.03.2018, 17:46   #6
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Вычисление частоты ноты (использовать с первой процедурой из предыдущего поста – Sound):
Код:
; GetNoteFreqFast v1.00 (c) 2017 by Jin X

MaxNoteNumber	=	119			; максимальный номер ноты
MaxOctaveNumber	=	MaxNoteNumber/12	; максимальный номер октавы

;-- Процедура GetNoteFreqFast: Вычислить частоту ноты -------------------------------------------------
; Вход: AL = нота (от 0 - "ля" субконтроктавы до 119 (MaxNoteNumber) - "соль-диез" 7-й октавы)
; Выход: AX = частота ноты или ноль при входном значении > MaxNoteNumber
;------------------------------------------------------------------------------------------------------

.DATA
NoteFreqTable	DW	14080,14917,15804,16744,17740,18795,19912,21096,22351,23680,25088,26580	; октава №9 (от "ля" 6-й до "соль-диез" 7-й), таблица для 120 значений (10 октав)

.CODE

; БЫСТРАЯ ВЕРСИЯ ПРОЦЕДУРЫ (достаточно точная, с использованием таблицы частот)
; Меняет регистры BX, CX
GetNoteFreqFast PROC
		cmp     al,MaxNoteNumber
		jbe     @@NoteOk
		xor     ax,ax
		ret
	@@NoteOk:
		cbw
		mov	bl,12
		div	bl			; AL = октава (0=субконтроктава, 1=контроктава, 2=большая, 3=малая, 4=первая...), AH = нота в октаве (0..11, начиная с "ля")
		neg	al
		add	al,9
		xchg	cx,ax			; CL = MaxOctaveNumber-октава
		mov	bl,ch
		xor	bh,bh
		shl	bx,1			; BX = нота*2
		mov	ax,NoteFreqTable[bx]
		shr	ax,cl			; AX = частота ноты
		adc	ax,0			; правильное округление
		ret
GetNoteFreqFast ENDP
Вычисление значения счётчика таймера (использовать со второй процедурой из предыдущего поста – SoundCnt):
Код:
; GetNoteFreqFast v1.00 (c) 2017 by Jin X

MaxNoteNumber	=	119			; максимальный номер ноты
MaxOctaveNumber	=	MaxNoteNumber/12	; максимальный номер октавы

;-- Процедура GetNoteCounterFast: Вычислить значение счётчика таймера для ноты ------------------------
; Вход: AL = нота (от 0 - "ля" субконтроктавы до 119 (MaxNoteNumber) - "соль-диез" 7-й октавы)
; Выход: AX = частота ноты или ноль при входном значении > MaxNoteNumber
;------------------------------------------------------------------------------------------------------

.DATA
NoteFreqTable	DW	43388,40953,38655,36485,34437,32505,30680,28958,27333,25799,24351,22984	; октава №9 (от "ля" 6-й до "соль-диез" 7-й), таблица для 120 значений (10 октав)			

.CODE

; БЫСТРАЯ ВЕРСИЯ ПРОЦЕДУРЫ (достаточно точная, с использованием таблицы частот)
; Меняет регистры BX, CX
GetNoteCounterFast PROC
		cmp     al,MaxNoteNumber
		jbe     @@NoteOk
		xor     ax,ax
		ret
	@@NoteOk:
		cbw
		mov	bl,12
		div	bl			; AL = октава (0=субконтроктава, 1=контроктава, 2=большая, 3=малая, 4=первая...), AH = нота в октаве (0..11, начиная с "ля")
		xchg	cx,ax			; CL = октава
		mov	bl,ch
		xor	bh,bh
		shl	bx,1			; BX = нота*2
		mov	ax,NoteFreqTable[bx]
		shr	ax,cl			; AX = частота ноты
		adc	ax,0			; правильное округление
		ret
GetNoteCounterFast ENDP
Связка GetNoteCounterFast + SoundCnt будет выдавать более точные частоты звука.
Всё это есть в прикреплённом файле.
Вложения
Тип файла: zip NoteFreq.zip (68.6 Кб, 19 просмотров)
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 19.03.2018, 09:13   #7
ZuevAndrew
Новичок
Джуниор
 
Регистрация: 14.03.2018
Сообщений: 2
По умолчанию

Всем спасибо за помощь! Тему можно закрывать.
ZuevAndrew вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление внутренним зонированием многофункционалного объекта коммерческой недвижимости. Doc888 Помощь студентам 1 15.06.2012 21:05
Функция работаяшая с динамиком progN Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 04.06.2010 19:01
Проблема с внутренним картридером? Aleha-D Компьютерное железо 0 15.04.2010 11:27
Непонял с динамиком Михаил Юрьевич Общие вопросы Delphi 5 28.01.2008 08:33