SquirrelInBox

Untitled

May 24th, 2016
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.47 KB | None | 0 0
  1. .model tiny
  2. .code
  3. org 100h
  4. .386
  5.  
  6. start:
  7. jmp main
  8.  
  9. ext_flag db 00
  10. play db 14 dup(0)
  11. notes dw 4559, 4062, 3620, 3417, 3044, 2712, 2416, 2279, 2031, 1810, 1708, 1522, 1356, 1208
  12. sound_on_command db 00
  13. sound_off_command db 00
  14. sync db 00
  15.  
  16. sounds dw 3225, 3044, 2712, 2416, 3044, 3620, 2416, 2712, 3044, 3255, 3044, 2712, 2416, 3044, 3620, 3620, 40, 2280, 2712, 1810, 2032, 2280, 2416, 2280, 2416, 2712, 3044, 3225, 3044, 2712, 2416, 3044, 3620, 3620
  17. sound_times db 9, 3, 6, 6, 6, 6, 6, 3, 3, 9, 3, 6, 6, 6, 3, 9, 3, 9, 3, 6, 3, 3, 9, 3, 6, 3, 3, 9, 3, 6, 6, 6, 6, 12
  18. sound_size db 34
  19. cur_melody db ?
  20.  
  21. m08_handler:
  22. pusha
  23.  
  24. mov al, sync
  25. test al, al
  26. jnz old_08_handler
  27.  
  28. mov ax, offset play
  29. mov si, ax
  30. mov cx, 14
  31. xor bx, bx
  32.  
  33. check_next_note:
  34. lodsb
  35. cmp al, 1
  36. jz after_check
  37. inc bx
  38. loop check_next_note
  39.  
  40. after_check:
  41. cmp bx, 14
  42. jnz need_play_sound
  43.  
  44. mov al, sound_off_command
  45. out 61h, al
  46.  
  47. jmp old_08_handler
  48.  
  49. need_play_sound:
  50. mov ax, bx
  51. add ax, bx ; bx * 2 - размер ноты dw
  52.  
  53. add ax, offset notes
  54. mov si, ax
  55. lodsw
  56.  
  57. out 42h, al
  58. mov al, ah
  59. out 42h, al
  60.  
  61. mov al, sound_on_command
  62. out 61h, al
  63.  
  64. old_08_handler:
  65. popa
  66. old_08_code db 0eah, 00, 00, 00, 00
  67.  
  68.  
  69. melody_play proc
  70. in al, 61h ;получаем текущий статус
  71. or al,00000011b ;разрешаем динамик и таймер
  72. out 61h, al ;заменяем байт
  73. mov si, 0 ;инициализируем указатель
  74. mov al, 10110110b ;установка для канала 2
  75. out 43h, al ;посылаем в командный регистр
  76. mov cur_melody, 1
  77.  
  78.  
  79. ;---смотрим ноту, получаем ее частоту и помещаем в канал 2
  80. next_note:
  81. mov al, cur_melody
  82. inc cur_melody
  83. cmp al, sound_size
  84. je no_more
  85. cbw ;переводим в слово
  86. ;---получение частоты
  87. mov bx,offset sounds;смещение таблицы частот
  88. dec ax ;начинаем отсчет с 0
  89. shl ax,1 ;умножаем на 2, т.к. слова
  90. mov di,ax ;адресуем через DI
  91. mov dx,[bx][di] ;получаем частоту из таблицы
  92. ;начинаем исполнение ноты
  93. mov al, dl ;готовим младший байт частоты
  94. out 42h, al ;посылаем его
  95. mov al,dh ;готовим старший байт частоты
  96. out 42h, al ;посылаем его
  97. ;---создание цикла задержки
  98. mov ah,0 ;номер функции чтения счетчика
  99. int 1ah ;получаем значение счетчика
  100. mov bx,offset sound_times ;смещение таблицы длин
  101. mov cl,[bx][si] ;берем длину очередной ноты
  102. mov ch,0
  103. mov bx,dx ;берем младшее слово счетчика
  104. add bx,cx ;определяем момент окончания
  105. still_sound:
  106. int 1ah ;берем значение счетчика
  107. cmp dx,bx ;сравниваем с окончанием
  108. jne still_sound ;неравны-продолжаем звук
  109. inc si ;переходим к следующей ноте
  110. jmp next_note ;
  111. ;---завершение
  112. no_more:
  113. in al, 61h ;полчаем статус порта В
  114. and al, 11111100b ;выключаем динамик
  115. out 61H,al
  116. ret
  117. melody_play endp
  118.  
  119.  
  120. m09_handler:
  121. pusha
  122.  
  123. mov al, sync
  124. test al, al
  125. jnz out_of_keyboard
  126. mov sync, 1
  127.  
  128. in al, 60h
  129. push ax
  130.  
  131. in al, 61h
  132. mov ah, al
  133. or al, 80h
  134. out 61H, al
  135. xchg ah, al
  136. out 61H, al
  137.  
  138. pop ax
  139.  
  140. cmp al, 1
  141. jnz non_esc
  142. mov ext_flag, 1
  143. jmp interrupt_end
  144.  
  145.  
  146. non_esc:
  147. cmp al, 39h
  148. jnz non_melody
  149. call melody_play
  150. jmp interrupt_end
  151.  
  152. non_melody:
  153.  
  154. cmp al, 1eh
  155. jl not_push
  156. cmp al, 24h
  157. jg not_push
  158.  
  159.  
  160.  
  161. next_step:
  162.  
  163. sub al, 1eh
  164. mov dx, ax
  165.  
  166. xor ah, ah
  167. add ax, offset play
  168. mov si, ax
  169. lodsb
  170.  
  171. test al, al
  172.  
  173. jnz interrupt_end
  174. mov ax, dx
  175.  
  176. push ax
  177. mov ax, offset play
  178. mov si, ax
  179. mov di, ax
  180. mov cx, 14
  181.  
  182. inc_all_plays:
  183. lodsb
  184. test al, al
  185. jz temp_1
  186. inc al
  187.  
  188. temp_1:
  189. stosb
  190. loop inc_all_plays
  191. pop ax
  192.  
  193. ;sub al, 1eh
  194.  
  195. xor ah, ah
  196. add ax, offset play
  197. mov di, ax
  198. mov al, 1
  199. stosb
  200.  
  201. jmp interrupt_end
  202.  
  203. not_push:
  204. cmp al, 2ch
  205. jl not_new_push
  206. cmp al, 32h
  207. jg not_new_push
  208. sub al, 7h
  209. jmp next_step
  210.  
  211. not_new_push:
  212. cmp al, 0ach
  213. jl not_new_non_push
  214. cmp al, 0b3h
  215. jg not_new_non_push
  216. sub al, 7h
  217. jmp next_non_push
  218.  
  219. not_new_non_push:
  220.  
  221. cmp al, 9eh
  222. jl old_keyboard_handler
  223. cmp al, 0a4h
  224. jg old_keyboard_handler
  225.  
  226. next_non_push:
  227. sub al, 9eh
  228. xor ah, ah
  229. add ax, offset play
  230. mov si, ax
  231. mov di, ax
  232.  
  233. lodsb
  234. mov dl, al
  235. xor al, al
  236. stosb
  237.  
  238. mov ax, offset play
  239. mov si, ax
  240. mov di, ax
  241. mov cx, 14
  242.  
  243. dec_all_plays:
  244. lodsb
  245. test al, al
  246. jz temp_2
  247. cmp al, dl
  248. jl temp_2
  249.  
  250. dec al
  251.  
  252. temp_2:
  253. stosb
  254. loop dec_all_plays
  255.  
  256. interrupt_end:
  257. mov al, 20h
  258. out 20h, al
  259.  
  260. popa
  261. mov sync, 0
  262. iret
  263.  
  264. old_keyboard_handler:
  265. mov sync, 0
  266. out_of_keyboard:
  267. popa
  268. old_09_code db 0eah, 00, 00, 00, 00
  269.  
  270. main:
  271. mov al, 10110110b ; 2 канал, 3 режим
  272. out 43h, al ; установили его
  273.  
  274. in al, 42h
  275. mov sound_off_command, al
  276. or al, 3
  277. mov sound_on_command, al
  278.  
  279. push es
  280. mov ah, 35h
  281. mov al, 09h
  282. int 21h
  283. mov word ptr old_09_code + 1, bx
  284. mov word ptr old_09_code + 3, es
  285. mov dx, offset m09_handler
  286. mov ah, 25h
  287. mov al, 09h
  288. int 21h
  289.  
  290. mov ah, 35h
  291. mov al, 08h
  292. int 21h
  293. mov word ptr old_08_code + 1, bx
  294. mov word ptr old_08_code + 3, es
  295. mov dx, offset m08_handler
  296. mov ah, 25h
  297. mov al, 08h
  298. int 21h
  299. pop es
  300.  
  301. main_loop:
  302. mov al, ext_flag
  303. test al, al
  304. jz main_loop
  305.  
  306. push ds
  307. mov dx, word ptr old_08_code + 1
  308. mov ds, word ptr old_08_code + 3
  309. mov ah, 25h
  310. mov al, 08h
  311. int 21h
  312. pop ds
  313.  
  314. push ds
  315. mov dx, word ptr old_09_code + 1
  316. mov ds, word ptr old_09_code + 3
  317. mov ah, 25h
  318. mov al, 09h
  319. int 21h
  320. pop ds
  321.  
  322. mov al, sound_off_command
  323. out 61h, al
  324.  
  325. mov ax, 4c00h
  326. int 21h
  327. end start
Advertisement
Add Comment
Please, Sign In to add comment