![]() |
|
Модераторы: PILOT, ManiaK, Mazzi |
![]()
|
|
| jimmi |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
| val |
|
|||
![]() Program developer ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 992 Регистрация: 14.1.2003 Где: г. Киев Репутация: 2 Всего: 7 |
Не понял, а это к чему?
-------------------- Терпимость - величайшее благо человечества... Ярчайший признак интеллекта – постоянно хорошее настроение… |
|||
|
||||
| jimmi |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 20.9.2004 Репутация: 5 Всего: 5 |
Это сообщение отредактировал(а) jimmi - 7.9.2005, 17:29 |
|||
|
||||
![]()
|
| Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)" | |
|
|
На данный раздел помимо Правил форума распространяются текже следующие правила:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |