Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- IDEAL
- MODEL small
- STACK 2048
- MACRO M_init ; Макрос для ініціалізації. Його початок
- mov ax, @data ; @data ідентифікатор, що створюються директивою MODEL
- mov ds, ax ; Завантаження початку сегменту даних в регістр DS
- mov es, ax ; Завантаження початку сегменту даних в регістр ES
- ENDM M_init ; Кінець макросу
- DATASEG
- ui db "Welcome to sound machine",13,10
- db 13,10
- db "Press w to play an awful noise",13,10
- db "Press e to exit",13,10
- db "------------------------",13,10,'$'
- ui_end db "Thanks for using our services!",13,10,'$'
- standby db " ___ ___",13,10
- db " __________________/ / __________________/ /",13,10
- db "| _ _______ / / | _ _______ / /",13,10
- db "|(_) .d########b. //)| _____________________ |(_) .d########b. //)|",13,10
- db "| .d############// || _____ || .d############// |",13,10
- db '| .d######""####//b. ||() || [Team1] || ()|| .d######""####//b. |',13,10
- db "| 9######( )#_//##P ||()|__| | = | |__|()|| 9######( )#_//##P |",13,10
- db "| 'b######++#/_/##d' ||() || | = | || ()|| 'b######++#/_/##d' |",13,10
- db '| "9############P" || || |___| || || "9############P" |',13,10
- db '| _"9a#######aP" || _ _____..__ _ || _"9a#######aP" |',13,10
- db '| |_| `"""""" || (_) |_____||__| (_) || |_| `"""""" |',13,10
- db "| ___..___________ ||_____________________|| ___..___________ |",13,10
- db "| |___||___________| | | |___||___________| |",13,10
- db "|____________________| |____________________|",13,10,'$'
- exCode db 0
- ; Константи
- frequency equ 255
- duration equ 1500
- CODESEG
- Start:
- M_init
- ; -----------------------------------------
- ; Ініціалізація таймера
- mov al,1
- out 42h, al
- ; Виводимо меню у консоль
- call draw_ui
- ask_for_input:
- ; Зчитуємо символ, введений із клавіатури (AL <- input)
- mov ah, 08h
- int 21h
- call draw_ui
- cmp al, "w"
- je W_pressed
- cmp al, "e"
- je e_pressed
- jmp ask_for_input
- w_pressed:
- ; Пищання у колонки
- call do_noise
- jmp ask_for_input
- e_pressed:
- ; Вихід із програми
- mov ah, 09h
- mov dx, offset ui_end
- int 21h
- ; -----------------------------------------
- mov ah, 4ch
- mov al, [exCode]
- int 21h
- ; =================================== Процедури ===================================
- ; ---------------------------------------------------------------------------------
- ; Призначення: вивід інтерфейсу
- ; Вхід: ---
- ; Вихід: ---
- ; ---------------------------------------------------------------------------------
- PROC draw_ui
- push ax
- push dx
- ; Очищаємо консоль
- mov ax,03h
- int 10h
- ; Виводим текст у консоль
- mov ah, 09h
- mov dx, offset ui
- int 21h
- pop dx
- pop ax
- ret
- ENDP draw_ui
- ; ---------------------------------------------------------------------------------
- ; Призначення: програш звуку
- ; Вхід:
- ; frequency <- частота звуку
- ; duration <- тривалість звуку
- ; Вихід:
- ; Максимально противний звук із колонок. Наслоджуйтесь
- ; ---------------------------------------------------------------------------------
- PROC do_noise
- ; Виводимо у консоль індикатор наявності звуку
- mov ax,03h
- int 10h
- mov ah, 09h
- mov dx, offset standby
- int 21h
- ; Зберігаємо початковий стан динаміка
- in al, 61h
- push ax
- or al, 00000011B ; Зміна стану на включений динамік (режим керування мікросхемою таймера)
- out 61h, al ; Занесення стану
- mov al, frequency ; Встановлюємо частоту (1.19МГц / frequency)
- out 42h, al ; Вмикаємо таймер, що буде подавати імпульси на динамік за заданою частотою
- call pause ; Виклик процедури очікування, під час виконання котрої в нас буде створюватись звук
- ; Повертаємо початковий стан динаміка
- pop ax
- out 61h, al
- ; Повертаємо звичайний інтерфейс
- call draw_ui
- ret
- ENDP do_noise
- ; ---------------------------------------------------------------------------------
- ; Призначення: очікування
- ; Вхід: ---
- ; Вихід: ---
- ; ---------------------------------------------------------------------------------
- PROC pause
- push cx
- ; Робимо duration^2 ітерацій циклу та сподіваємось, що це займе приблизно 1 секунду
- ; Єкспериментальним методом було доведено, що виконання duration^2 ітерацій циклу займає приблизно 1 секунду
- mov cx, duration
- loop1:
- push cx
- mov cx, duration
- loop2:
- loop loop2
- pop cx
- loop loop1
- pop cx
- ret
- ENDP pause
- end Start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement