Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм Брезенхема, музыка, Лабораторная работа для студентов 
:(
    Опции темы
jimmi
Дата 12.11.2004, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Компьютер тоже микропроцессор, только имеет богатую периферию.
Лабораторная работа по рисованию линий и генерации звуков
Берем ассемблер здесь
Компилируем и смотрим работу программы. Делаем другой рисунок и мелодию и сдаем зачет. Нужно подбирать задержку под свой процессор. У меня Пентиум 800 и виндовс 98.
Исходник программы

;NAME LABORATORY_WORK_9

;IMAGE-SOUND'S CREATION STUDY
.MODEL SMALL
.STACK 0FF0H
.DATA
;--------------------Данные для звука----------------------------------
;Длительность нот
BEAT DB 8,8,8,8,16,8,8,16,16,32,8,8,8,8,16,8,8,32
DB 16,16,8,8,16,8,16,8,12,4,16,16,8,8,16,8,8,16,16,32
;Частоты нот

FREQ DW 4293,3610,2865,3610,3216,3610,3825,2865,3216,4293

DW 3610,2865,2409,2409,2146,2409,2553,2865,3035,2146

DW 1912,2146,2865,2865,3825,4293,2865,3216,2553,2553

DW 2409,2553,2865,3216,3610,2865,3216,4293
;Последовательность воспроизведения нот
MELODY DB 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
DB 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37
DB 38,0FFH ;?pЁ§­ Є ®Є®­з ­Ёп §ўгЄ 
HOLDIP DW 00h
HOLDCS DW 00h
SOU_NOW? DB 1
FIR_NOTE? DB 1
END_NOTE DW 00h
WHICH_NO DW 00h
;-------------------Данные для изображения-------------------------------
;Координаты X начал отрезков
ST_X DW 000,120,120,200,120,100,160,220,170,170,190,130,130,160
DW 160,145,130,150,150,170,170,160,180,180,185,270,270,250
DW 265,255,265,260,273,285,280,290,280,295,275
;Координаты X концов отрезков
END_X DW 319,120,200,200,100,160,220,200,170,190,190,130,160,160
DW 130,145,145,150,170,170,150,160,180,185,185,270,250,265
DW 255,265,260,272,285,280,290,280,295,275,275
;Координаты Y
ST_Y DW 170,170,100,100,100,100,040,100,170,130,130,150,120,120
DW 150,120,130,090,070,070,090,070,060,040,040,170,150,150
DW 135,135,125,125,110,125,125,135,135,150,150

END_Y DW 170,100,100,170,100,040,100,100,130,130,170,120,120,150
DW 150,150,130,070,070,090,090,090,040,040,065,150,150,135
DW 135,125,125,110,125,125,135,135,150,150,170
COLOR DB 2 ;выбираем цвет изображения
DI_Y_IN DW ?
DI_X_IN DW ?
SH_DI DW ?
ST_X_IN DW ?
ST_Y_IN DW ?
ST_CO DW ?
DI_CO DW ?
MODE_NUMBER DB ?
;========================================================================
.CODE
BEGIN:
MOV AX,@DATA
MOV DS,AX
;------------------------------------------------------------------------
; Основная программа
MOV AH,35H ;Определяем начало прерывания 1Ch
MOV AL,1CH
INT 21H
MOV HOLDIP,BX ;Запоминаем истинный адрес
MOV HOLDCS,ES
PUSH DS
MOV AX,SEG MELODY_
MOV DS,AX ;Берем адрес собственной процедуры
MOV DX,OFFSET MELODY_
MOV AL,1CH ;Переадресуем прерывание таймера
MOV AH,25H
INT 21H ;Теперь музыка играет по прерываниям таймера
POP DS ;независимо от действий процессора
;-------------------------------------------------------------------------
MOV AH,0FH ;Определяем текущий режим дисплея
INT 10H
MOV MODE_NUMBER,AL ;Запоминаем его
MOV AH,0 ;Устанавливаем режим цветной
MOV AL,4 ;графики 320 * 200
INT 10H
;-------------------------Рисуем картинку---------------------------------
MOV SI,0
PROD1: CMP SI,78 ;Это последняя линия ?
JE PROD2 ;Нет - выходим
MOV BX,OFFSET ST_X ;Да- берем данные
MOV AX,[BX][SI]
MOV ST_X,AX
MOV BX,OFFSET END_X
MOV AX,[BX][SI]
MOV END_X,AX
MOV BX,OFFSET ST_Y
MOV AX,[BX][SI]
MOV ST_Y,AX
MOV BX,OFFSET END_Y
MOV AX,[BX][SI]
MOV END_Y,AX
CALL IMAGE ;Вызываем процедуру рисования линии
CALL DELAY ;вызываем процедуру задержки времени
INC SI ;переадресуем на данные для
INC SI ;следующей линии
JMP PROD1
PROD2: JMP END_IM
;--------------------Процедура рисования линии--------------------------
; Алгоритм Брезенхема
IMAGE PROC NEAR
PUSH BX
PUSH SI
MOV CX,1
MOV DX,1
MOV DI,END_Y
SUB DI,ST_Y
JGE KEEP_Y
NEG DX
NEG DI
KEEP_Y: MOV DI_Y_IN,DX
;----------------------------
MOV SI,END_X
SUB SI,ST_X
JGE KEEP_X
NEG CX
NEG SI
KEEP_X: MOV DI_X_IN,CX
;----------------------------
CMP SI,DI
JGE HORS
MOV CX,0
XCHG SI,DI
JMP SAVS
HORS: MOV DX,0
SAVS: MOV SH_DI,DI
MOV ST_X_IN,CX
MOV ST_Y_IN,DX
;----------------------------
MOV AX,SH_DI
SHL AX,1
MOV ST_CO,AX
SUB AX,SI
MOV BX,AX
SUB AX,SI
MOV DI_CO,AX
;----------------------------
MOV CX,ST_X
MOV DX,ST_Y
INC SI
MOV AL,COLOR
;----------------------------
MLOOP: DEC SI
JZ FINAL
MOV AH,12
INT 10H
CMP BX,0
JGE DILIN
;----------------------------
ADD CX,ST_X_IN
ADD DX,ST_Y_IN
ADD BX,ST_CO
JMP SHORT MLOOP
;----------------------------
DILIN: ADD CX,DI_X_IN
ADD DX,DI_Y_IN
ADD BX,DI_CO
JMP SHORT MLOOP
FINAL: POP SI
POP BX
RET
IMAGE ENDP
;-------------------------Процедура задержки времени----------------------
DELAY PROC NEAR
MOV BX,9FFFH
DEL1: MOV CX,100H
DEL2: LOOP DEL2
DEC BX
CMP BX,0
JNZ DEL1
RET
DELAY ENDP
;------------------------------------------------------------------------
END_IM: CMP SOU_NOW?,1 ;Ждем окончания мелодии
JE END_IM
CALL DELAY
;==============================
;================================
MOV AH,0
MOV AL,MODE_NUMBER
INT 10H ;Восстанавливаем режим дисплея
;------------------------------------------------------------------------
MOV DX,HOLDIP
MOV AX,HOLDCS
MOV DS,AX
MOV AL,1CH
MOV AH,25H
INT 21H ;Восстанавливаем вектор прерывания
JMP FINISH ;Выходим из программы
;========================================================================
;--------------------Процедура воспроизведения звука ---------------------
; Из книги Роберта Джордейна 
MELODY_ PROC FAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
PUSH SI
PUSH DS
MOV AX,@data ;Восстанавливаем адрес сегмента данных
MOV DS,AX
CMP SOU_NOW?,1 ;Нужна мелодия?
JE PLAY_IT ;Да - играем
JMP NO_NOW ;Нет - выходим
PLAY_IT:
CMP FIR_NOTE?,0
JE TIM_CHK
;-----------------------------------------------------------------------
PORT_B EQU 61H
COM_REG EQU 43H
LATCH2 EQU 42H
IN AL,PORT_B
OR AL,00000011B
OUT PORT_B,AL
MOV SI,0
MOV AL,0B6H
OUT COM_REG,AL
MOV FIR_NOTE?,0
;----------------------------
NEXT: LEA BX,MELODY
MOV SI,WHICH_NO
MOV AL,[BX][SI]
CMP AL,0FFH
JE NO_MOR
CBW
;-------------------------------Частоты нот-----------------------------
MOV BX,OFFSET FREQ
DEC AX
SHL AX,1
MOV DI,AX
MOV DX,[BX][DI]
;---------------------------
MOV AL,DL
OUT LATCH2,AL
MOV AL,DH
OUT LATCH2,AL
;------------------------------Длительность нот-------------------------
TIME_IT:
MOV AH,0
INT 1AH
MOV BX,OFFSET BEAT
MOV CL,[BX][SI]
MOV CH,0
MOV BX,DX
ADD BX,CX
MOV END_NOTE,BX
TIM_CHK:
MOV AH,0
INT 1AH
CMP DX,END_NOTE
JNE NO_NOW
MOV SI,WHICH_NO
INC SI
MOV WHICH_NO,SI
JMP NEXT
;----------------------------
NO_MOR:
IN AL,PORT_B
AND AL,0FCH
OUT 61H,AL
MOV SOU_NOW?,0
MOV FIR_NOTE?,1
NO_NOW:
POP DS
POP SI
POP DI
POP DX
POP CX
POP BX
POP AX
IRET
MELODY_ ENDP
;=======================================================================
FINISH:
MOV AH,4CH
INT 21H
END BEGIN


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


Program developer
**


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

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



Не понял, а это к чему?


--------------------
Терпимость - величайшее благо человечества...
Ярчайший признак интеллекта – постоянно хорошее настроение…
PM MAIL ICQ   Вверх
jimmi
Дата 12.11.2004, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



smile

Это сообщение отредактировал(а) jimmi - 7.9.2005, 17:29
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




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


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

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