Немига/Звук

Материал из Emuverse
Версия от 12:49, 3 июня 2016; Nzeemin (обсуждение | вклад) (Новая страница: «{{Emuverse}} = Работа со звуком в ПЗУ Немига 3.03 = Точка входа подпрограммы SOUND в начале ПЗУ: <pre> 1…»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Этот документ создан для Emuverse и распространяется на условиях лицензии CC-BY-SA-3.0.

Работа со звуком в ПЗУ Немига 3.03

Точка входа подпрограммы SOUND в начале ПЗУ:

160126: JMP	@177754			; SOUND

Звук нажатия клавиши:

160360: TSTB	@#177761		; Флаг блокировки вызова SOUND
160364: BNE	160402			; <> 0 => не вызывать повторно
160366: CALL	@#160126		; SOUND
160372: BR	160402
160374: DW	160376			; Адрес мелодии
160376: DB	011, 214, 001, 000	; Мелодия -- звук длиной 1/50 сек

Обработка продолжения SOUND в обработчике прерывания HALT:

160602: BIT	#010000, @#170006	; Сигнал Н3?
160610: BEQ	161060			; Нет => Завершаем обработку прерывания HALT
; Обработка сигнала Н3
160612: MOV	R4, -(SP)		; Сохраняем R4
160614: TSTB	@#177761		; Флаг блокировки SOUND
160620: BPL	160746			; bit7=0 - блокировано => переходим
160622: MOV	@#177752, R4		; Берём адрес продолжения мелодии
160626: INCB	@#177760		; Увеличиваем счётчик??
160632: CMPB	@#177760, 177777(R4)	; Сравниваем с длительностью ноты
160640: BLO	160746			; пока не кончилась => переходим
160642: TSTB	(R4)			; 200 ?
160644: BMI	160742			; да => переходим
160646: BITB	#000037, (R4)		; Есть ещё нота мелодии?
160652: BNE	160736			; да => переходим
160654: BICB	#000200, @#177761	; Снимаем флаг блокировки SOUND
; Обработка флагов завершения мелодии
160662: BITB	#000040, (R4)		; 040 и 140 ?
160666: BNE	160712			; да => переходим
160670: TSTB	(R4)			; 000 ? (никаких действий по окончании мелодии)
160672: BEQ	160746			; да => переходим
160674: MOV    	@#177750, @#160710	; Копируем адрес начала мелодии??
160702: CALL   	@#160126		; SOUND
160706: BR     	160746
160710: DW	??
; Окончание мелодии
160712: BITB   	#000100, (R4)+
160716: BNE    	160732
160720: MOV    	(SP)+, R4
160722: CLRB   	@#170006
; Переход на прерывание по вектору 110
160726: MOV    	@#000110, PC
; Очистка байта после мелодии
160732: CLRB   	(R4)
160734: BR     	160746
;
160736: MOVB   	(R4)+, @#170030		; Октава и громкость
160742: CALL   	@#162560		; Обработка продолжения мелодии

Подпрограмма SOUND:

162474: MOV	R4, -(SP)		; Сохраняем R4
162476: BICB	#000200, @#177761	; Предотвращаем повторный вызов SOUND: bit7=0
162504: CLR	@#170024		; Сброс таймер 2 (длительности)
162510: MOV	000002(SP), R4		; Откуда вызвали SOUND
162514: MOV	000002(R4), R4		; Получаем адрес мелодии 
162520: TSTB	(R4)
162522: BEQ	162554
162524: MOV	R4, @#177750		; Запоминаем адрес начала мелодии
162530: MOV	#001516, @#170020	; Пишем в регистр состояния таймера
162536: MOVB	(R4)+, @#170030		; Октава и громкость
162542: CALL	@#162560		; Обработка продолжения мелодии
162546: BISB	#000200, @#177761	; Возвращаем флаг блокировки SOUND: bit7=1
162554: MOV	(SP)+, R4		; Восстанавливаем R4
162556: RETURN	
;
162560: MOV	R3, -(SP)		; Сохраняем R3
162562: MOVB	(R4)+, R3
162564: BIC	#177760, R3		; Оставляем нижние 4 бита -- 00..17
162570: ASL	R3			; и умножаем на 2
162572: MOV	162624(R3), @#170022	; Выбираем по R3 слово и пишем в первый счётчик
162600: MOVB	(R4)+, @#170024		; Задаём длительность
162604: CLRB	@#177760		; Очищаем счётчик??
162610: MOV	R4, @#177752		; Запоминаем адрес продолжения мелодии
162614: TST	@#170026		; Устанавливаем триггер таймера
162620: MOV	(SP)+, R3		; Восстанавливаем R3
162622: RETURN
; Значения задержки первого таймера для нот
162624: DW	000000, 003570, 003414, 003246, 003110, 002754, 002630, 002510
162644: DW	002374, 002264, 002160, 002061, 001764, 000000, 000000, 000000

Переменные:

177750: DW      ; Адрес начала мелодии
177752: DW      ; Текущий адрес мелодии
177760: DB      ; Счётчик
177761: DB      ; Флаги