qberik

Untitled

Dec 19th, 2022
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.44 KB | None | 0 0
  1. .model small
  2. .stack 200h
  3. .486
  4. .data
  5. old_handler_offset dw ? ; Старый обработчик прерывания (смещение)
  6. old_handler_seg dw ? ; Старый обработчик прерывания (сегмент)
  7.  
  8. counter dw 0 ; счетчик
  9. timer dw 10 ; таймер
  10. time_const dw 18 ; константа времени для перевода в секунды
  11.  
  12. exit_flag db 0 ; флаг выхода из программы
  13.  
  14. sleep_flag dw 0 ; флаг сна
  15. sleep_time dw 18; сколько тиков надо спать
  16. sleep_now dw 0 ; сколько тиков уже поспали
  17.  
  18. old_int_offset dw ? ; старый сдвиг прерывания
  19. old_int_seg dw ? ; старый сегмент прерывания
  20.  
  21.  
  22. .code
  23. sleep_int proc far; процедура задержки
  24. ;local _END_INT, _WAKE_UP
  25. pusha
  26. mov ax, sleep_flag
  27. ; проверка флага сна
  28. cmp ax, 0 ; если флаг 0, то
  29. je _END_INT; НЕ СПАТЬ
  30. ; иначе СПИМ
  31. mov ax, sleep_now
  32. inc ax
  33. mov sleep_now, ax
  34.  
  35. mov bx, sleep_time
  36. cmp ax, bx
  37. jge _WAKE_UP; если поспали больше или сколько надо, то просыпаемся
  38. jmp _END_INT
  39. _WAKE_UP:
  40. ; ПРОСНУЛИСЬ
  41. mov ax, 0
  42. mov sleep_now, ax
  43. mov sleep_flag, ax
  44. _END_INT:
  45.  
  46. popa
  47. iret
  48. sleep_int endp
  49.  
  50. ; макрос для удобного сна
  51. sleep macro
  52. local _sleep_loop, _sleep_end
  53. pusha
  54. ; установим флаг сна
  55. mov ax, 1
  56. mov sleep_flag, ax
  57. _sleep_loop: ; спим
  58. nop
  59. mov ax, sleep_flag
  60. cmp ax, 0
  61. je _sleep_end
  62. jmp _sleep_loop
  63. _sleep_end: ; проснулись
  64. popa
  65. endm sleep
  66.  
  67.  
  68. Main PROC
  69. mov ax,@data
  70. mov ds,ax
  71.  
  72.  
  73.  
  74. ; получим адреса прерываний, которые были ещё до нас
  75. mov ah, 35h ; получить вектор прерывания
  76. mov al, 1Ch ; прерывание таймера
  77. int 21h
  78. ; в bx записался сдвиг старого прерывания
  79. ; в ex записался сегмерт старого прерывания
  80. ; их надо запомнить, чтобы потом вернуть всё на место
  81. mov old_int_offset, bx
  82. mov old_int_seg , es
  83. ; теперь можем написать что-то своё заместо прошлого прерывания
  84.  
  85. ; пусть функция sleep_int будет нашим прерыванием
  86. push ds ; будем трогать ds так что надо положить его в стек, чтобы не потерять
  87. mov dx, offset sleep_int
  88. mov ax, seg sleep_int
  89. mov ds, ax ; можно поменять только через ax
  90. mov ah, 25h ; поменять вектор прерывания
  91. mov al, 1Ch ; наше прерывание таймера
  92. int 21h
  93. pop ds
  94.  
  95.  
  96. mov ax,3
  97. int 10h
  98. mov bh,0
  99. xor ax,ax
  100. int 33h
  101. xchg ax,cx
  102. jcxz exit
  103.  
  104. mov ax,0Ch
  105. mov cx,10100b
  106. push cs
  107. pop es
  108. mov dx,offset mouse
  109. int 33h
  110.  
  111. mov ax,1
  112. int 33h
  113.  
  114. for:
  115. mov ah,0
  116. int 16h
  117. dec ah
  118. jnz for
  119. mov ax,14h
  120. xor cx,cx
  121. int 33h
  122. int 20h
  123. exit:
  124.  
  125. ; надо вернуть всё как было
  126. mov dx, old_int_offset
  127. mov ax, old_int_seg
  128. mov ds, ax ; можно поменять только через ax
  129.  
  130. mov ah, 25h ; поменятьменять вектор прерывания
  131. mov al, 1Ch ; наше прерывание таймера
  132. int 21h
  133.  
  134. mov ah,4Ch
  135. int 21h
  136. Main ENDP
  137.  
  138.  
  139. mouse proc
  140. mov ax,2; Спрятать курсор
  141. int 33h
  142.  
  143. mov ax, cx; ax <- x
  144. mov cl, 3
  145. shr ax, cl ; x : px -> #symbol
  146. shr dx, cl ; y : px -> #symbol
  147.  
  148. mov dh, dl
  149. mov dl,al
  150.  
  151. MOV AH,02
  152. MOV BH,00
  153. INT 10H
  154.  
  155. MOV AH,09 ;Функция вывода
  156. MOV al,'#' ;Выводимый символ
  157. MOV CX,1 ;Число повторений символа
  158. MOV BH,00
  159. MOV BL,0FH
  160. INT 10H ;Вызвать BIOS
  161.  
  162. call enter_check
  163. int 10H
  164.  
  165. mov ax,1 ; Возвращаем курсор
  166. int 33h
  167.  
  168. retf
  169. mouse endp
  170.  
  171.  
  172. enter_check proc
  173. back:
  174. mov bl,al ; сохраняем bl в dx
  175. mov ah,08h ; задаем функцию
  176. back_enter:
  177. int 21h ; вызов прерывания
  178. cmp al,0Dh ; проверяем нажатие Enter
  179. je click_enter ; если нажали Enter, то выход
  180. cmp al,30h ; проверяем нажатие Enter
  181. je exit_program ; если нажали Enter, то выход
  182. cmp al, 38h; провверяем нажатие '8'
  183. je click_8
  184. cmp al, 32h; провверяем нажатие '2'
  185. je click_2
  186. cmp al, 34h; провверяем нажатие '4'
  187. je click_4
  188. cmp al, 36h; провверяем нажатие '6'
  189. je click_6
  190.  
  191. mov bl,al
  192. jmp back_enter
  193.  
  194.  
  195.  
  196. click_8:
  197. sleep ; сначала поспать
  198. dec dh
  199. call izmen_poloj_kursora
  200. call vivod_sim
  201. inc dh
  202. call izmen_poloj_kursora
  203. jmp back
  204.  
  205. click_2:
  206. sleep ; сначала поспать
  207. inc dh
  208. call izmen_poloj_kursora
  209. call vivod_sim
  210. dec dh
  211. call izmen_poloj_kursora
  212. jmp back
  213.  
  214. click_6:
  215. sleep ; сначала поспать
  216. inc dl
  217. call izmen_poloj_kursora
  218. call vivod_sim
  219. dec dl
  220. call izmen_poloj_kursora
  221. jmp back
  222.  
  223. click_4:
  224. sleep ; сначала поспать
  225. dec dl
  226. call izmen_poloj_kursora
  227. call vivod_sim
  228. inc dl
  229. call izmen_poloj_kursora
  230. jmp back
  231.  
  232.  
  233. click_enter:
  234. ret
  235.  
  236. exit_program:
  237. mov ah,4Ch
  238. int 21h
  239.  
  240. enter_check endp
  241.  
  242.  
  243. vivod_sim proc
  244. MOV AH,09 ;Функция вывода
  245. MOV al,'#' ;Выводимый символ
  246. MOV CX,1 ;Число повторений символа
  247. MOV BH,00
  248. MOV BL,0FH
  249.  
  250.  
  251. INT 10H ;Вызвать BIOS
  252.  
  253. ret
  254. vivod_sim endp
  255.  
  256.  
  257. izmen_poloj_kursora proc
  258. MOV AH,02 ;Установить положение курсора
  259. MOV DH,dh ;Строка
  260. MOV DL,dl ;Столбец
  261. INT 10H ;Вызвать BIOS
  262. ret
  263. izmen_poloj_kursora endp
  264.  
  265. end Main
  266.  
Advertisement
Add Comment
Please, Sign In to add comment