Advertisement
SosnoviyBor

TASM. Программа, издающая звук

May 31st, 2021
2,390
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. IDEAL
  3. MODEL small
  4. STACK 2048
  5.  
  6. MACRO M_init        ; Макрос для ініціалізації. Його початок
  7.     mov ax, @data   ; @data ідентифікатор, що створюються директивою MODEL
  8.     mov ds, ax      ; Завантаження початку сегменту даних в регістр DS
  9.     mov es, ax      ; Завантаження початку сегменту даних в регістр ES
  10.     ENDM M_init     ; Кінець макросу
  11.  
  12. DATASEG
  13.  
  14. ui db "Welcome to sound machine",13,10
  15.    db 13,10
  16.    db "Press w to play an awful noise",13,10
  17.    db "Press e to exit",13,10
  18.    db "------------------------",13,10,'$'
  19. ui_end db "Thanks for using our services!",13,10,'$'
  20.  
  21. standby db "                    ___                                          ___",13,10
  22.         db " __________________/  /                       __________________/  /",13,10
  23.         db "| _    _______    /  /                       | _    _______    /  /",13,10
  24.         db "|(_) .d########b. //)| _____________________ |(_) .d########b. //)|",13,10
  25.         db "|  .d############//  ||        _____        ||  .d############//  |",13,10
  26.         db '| .d######""####//b. ||() ||  [Team1]  || ()|| .d######""####//b. |',13,10
  27.         db "| 9######(  )#_//##P ||()|__|  | = |  |__|()|| 9######(  )#_//##P |",13,10
  28.         db "| 'b######++#/_/##d' ||() ||   | = |   || ()|| 'b######++#/_/##d' |",13,10
  29.         db '|  "9############P"  ||   ||   |___|   ||   ||  "9############P"  |',13,10
  30.         db '|  _"9a#######aP"    ||  _   _____..__   _  ||  _"9a#######aP"    |',13,10
  31.         db '| |_|  `""""""       || (_) |_____||__| (_) || |_|  `""""""       |',13,10
  32.         db "|  ___..___________  ||_____________________||  ___..___________  |",13,10
  33.         db "| |___||___________| |                       | |___||___________| |",13,10
  34.         db "|____________________|                       |____________________|",13,10,'$'
  35.  
  36. exCode db 0
  37.  
  38. ; Константи
  39. frequency equ 255
  40. duration equ 1500
  41.  
  42. CODESEG
  43. Start:
  44.     M_init
  45.     ; -----------------------------------------
  46.     ; Ініціалізація таймера
  47.     mov al,1
  48.     out 42h, al
  49.     ; Виводимо меню у консоль
  50.     call draw_ui
  51.  
  52.     ask_for_input:
  53.     ; Зчитуємо символ, введений із клавіатури (AL <- input)
  54.     mov ah, 08h
  55.     int 21h
  56.     call draw_ui
  57.  
  58.     cmp al, "w"
  59.     je W_pressed
  60.     cmp al, "e"
  61.     je e_pressed
  62.     jmp ask_for_input
  63.  
  64.     w_pressed:
  65.     ; Пищання у колонки
  66.     call do_noise
  67.     jmp ask_for_input
  68.  
  69.     e_pressed:
  70.     ; Вихід із програми
  71.     mov ah, 09h
  72.     mov dx, offset ui_end
  73.     int 21h
  74.     ; -----------------------------------------
  75.     mov ah, 4ch
  76.     mov al, [exCode]
  77.     int 21h
  78.  
  79.     ; =================================== Процедури ===================================
  80.     ; ---------------------------------------------------------------------------------
  81.     ; Призначення: вивід інтерфейсу
  82.     ; Вхід: ---
  83.     ; Вихід: ---
  84.     ; ---------------------------------------------------------------------------------
  85.     PROC draw_ui
  86.         push ax
  87.         push dx
  88.  
  89.         ; Очищаємо консоль
  90.         mov ax,03h
  91.         int 10h
  92.         ; Виводим текст у консоль
  93.         mov ah, 09h
  94.         mov dx, offset ui
  95.         int 21h
  96.  
  97.         pop dx
  98.         pop ax
  99.         ret
  100.         ENDP draw_ui
  101.  
  102.     ; ---------------------------------------------------------------------------------
  103.     ; Призначення: програш звуку
  104.     ; Вхід:
  105.     ; frequency <- частота звуку
  106.     ; duration <- тривалість звуку
  107.     ; Вихід:
  108.     ; Максимально противний звук із колонок. Наслоджуйтесь
  109.     ; ---------------------------------------------------------------------------------
  110.     PROC do_noise
  111.         ; Виводимо у консоль індикатор наявності звуку
  112.         mov ax,03h
  113.         int 10h
  114.         mov ah, 09h
  115.         mov dx, offset standby
  116.         int 21h
  117.  
  118.         ; Зберігаємо початковий стан динаміка
  119.         in al, 61h
  120.         push ax
  121.  
  122.         or al, 00000011B    ; Зміна стану на включений динамік (режим керування мікросхемою таймера)
  123.         out 61h, al         ; Занесення стану
  124.         mov al, frequency   ; Встановлюємо частоту (1.19МГц / frequency)
  125.         out 42h, al         ; Вмикаємо таймер, що буде подавати імпульси на динамік за заданою частотою
  126.         call pause          ; Виклик процедури очікування, під час виконання котрої в нас буде створюватись звук
  127.  
  128.         ; Повертаємо початковий стан динаміка
  129.         pop ax
  130.         out 61h, al
  131.  
  132.         ; Повертаємо звичайний інтерфейс
  133.         call draw_ui
  134.         ret
  135.         ENDP do_noise
  136.  
  137.     ; ---------------------------------------------------------------------------------
  138.     ; Призначення: очікування
  139.     ; Вхід: ---
  140.     ; Вихід: ---
  141.     ; ---------------------------------------------------------------------------------
  142.     PROC pause
  143.         push cx
  144.        
  145.         ; Робимо duration^2 ітерацій циклу та сподіваємось, що це займе приблизно 1 секунду
  146.         ; Єкспериментальним методом було доведено, що виконання duration^2 ітерацій циклу займає приблизно 1 секунду
  147.         mov cx, duration
  148.         loop1:
  149.             push cx
  150.             mov cx, duration
  151.             loop2:
  152.                 loop loop2
  153.                 pop cx
  154.             loop loop1
  155.        
  156.         pop cx
  157.         ret
  158.         ENDP pause
  159.  
  160. end Start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement