qberik

Untitled

Dec 22nd, 2022
247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.48 KB | None | 0 0
  1. .model small
  2. .stack 100h
  3.  
  4.  
  5. .data
  6.  
  7. old_int_offset dw ?
  8. old_int_seg dw ?
  9.  
  10. text1 db "Lorem ipsum dolor sit amet,",'$'
  11. text2 db "consectetur adipiscing elit",'$'
  12. text3 db "Suspendisse vel est a purus",'$'
  13. text4 db "pretium dictum sagittis nisi",'$'
  14. text5 db "Nullam non neque quam. Duis ",'$'
  15. text6 db "faucibus est et leo bibendum,",'$'
  16. text7 db "quis feugiat tellus eleifend",'$'
  17.  
  18. endl db 13,10,'$'
  19.  
  20. exit dw 0
  21.  
  22.  
  23. min_x db 0
  24. max_x db 51
  25. ;x_pos db 50
  26. x_pos db 25
  27. y_pos db 9
  28.  
  29.  
  30. .code
  31. input_int proc far
  32. ; можно и pusha
  33. push ax
  34. push bx
  35. push cx
  36. push dx
  37. push si
  38. push di
  39. push bp
  40. pushf
  41.  
  42.  
  43. ; очистка экрана
  44. mov ah, 06h
  45. mov al, 00h
  46. mov bh, 00001111b
  47. mov cx, 0000h
  48. mov dx, 184fh
  49. int 10h
  50.  
  51. ; двигаю курсор
  52. mov ah, 02h
  53. mov bh, 00h
  54. mov dl, x_pos
  55. mov dh, y_pos
  56. int 10h
  57.  
  58. ; печатаю
  59. mov ah, 09h
  60. mov dx, offset text1
  61. int 21h
  62.  
  63. mov ah, 02h
  64. mov bh, 00h
  65. mov dl, x_pos
  66. mov dh, y_pos
  67. add dh, 1
  68. int 10h
  69. ; печатаю
  70. mov ah, 09h
  71. mov dx, offset text2
  72. int 21h
  73.  
  74. mov ah, 02h
  75. mov bh, 00h
  76. mov dl, x_pos
  77. mov dh, y_pos
  78. add dh, 2
  79. int 10h
  80. ; печатаю
  81. mov ah, 09h
  82. mov dx, offset text3
  83. int 21h
  84.  
  85. mov ah, 02h
  86. mov bh, 00h
  87. mov dl, x_pos
  88. mov dh, y_pos
  89. add dh, 3
  90. int 10h
  91. ; печатаю
  92. mov ah, 09h
  93. mov dx, offset text4
  94. int 21h
  95.  
  96. mov ah, 02h
  97. mov bh, 00h
  98. mov dl, x_pos
  99. mov dh, y_pos
  100. add dh, 4
  101. int 10h
  102. ; печатаю
  103. mov ah, 09h
  104. mov dx, offset text5
  105. int 21h
  106.  
  107. mov ah, 02h
  108. mov bh, 00h
  109. mov dl, x_pos
  110. mov dh, y_pos
  111. add dh, 5
  112. int 10h
  113. ; печатаю
  114. mov ah, 09h
  115. mov dx, offset text6
  116. int 21h
  117.  
  118. mov ah, 02h
  119. mov bh, 00h
  120. mov dl, x_pos
  121. mov dh, y_pos
  122. add dh, 6
  123. int 10h
  124. ; печатаю
  125. mov ah, 09h
  126. mov dx, offset text7
  127. int 21h
  128.  
  129.  
  130. mov ah, 1 ; Проверка на то, что какая-то кнопка нажата
  131. int 16h
  132. jz _skip_int ; ничего не нажато
  133.  
  134.  
  135. mov ah, 0 ; Если что-то нажато, то надо узнать что
  136. int 16h
  137.  
  138. _key1:
  139. cmp al, '1' ; двигаем координаты влево <-
  140. jnz _key2
  141. mov cl, x_pos
  142. cmp cl, min_x
  143. jle _min_border
  144. dec cl
  145. mov x_pos, cl
  146. _min_border:
  147. _key2:
  148. cmp al, '2' ; двигаем координаты вправо ->
  149. jnz _key3
  150. mov cl, x_pos
  151. cmp cl, max_x
  152. jge _max_border
  153. inc cl
  154. mov x_pos, cl
  155. _max_border:
  156. _key3:
  157. cmp al, 'q' ; выход
  158. jnz _no_key
  159. mov ax, 1
  160. mov exit, ax
  161.  
  162. _no_key:
  163.  
  164. _skip_int:
  165.  
  166. ; можно и popa
  167. popf
  168. pop bp
  169. pop di
  170. pop si
  171. pop dx
  172. pop cx
  173. pop bx
  174. pop ax
  175. iret
  176. input_int endp
  177.  
  178. start:
  179. mov ax, @data
  180. mov ds, ax
  181.  
  182.  
  183. ; получим адреса прерываний, которые были ещё до нас
  184. mov ah, 35h ; получить вектор прерывания
  185. mov al, 1Ch ; прерывание таймера
  186. int 21h
  187. ; в bx записался сдвиг старого прерывания
  188. ; в ex записался сегмерт старого прерывания
  189.  
  190. ; их надо запомнить, чтобы потом вернуть всё на место
  191. mov old_int_offset, bx
  192. mov old_int_seg , es
  193.  
  194. ; теперь можем написать что-то своё заместо прошлого прерывания
  195.  
  196. ; пусть функция input_int будет нашим прерыванием
  197.  
  198. push ds ; будем трогать ds так что надо положить его в стек, чтобы не потерять
  199.  
  200. mov dx, offset input_int
  201. mov ax, seg input_int
  202. mov ds, ax ; можно поменять только через ax
  203.  
  204. mov ah, 25h ; поменятьменять вектор прерывания
  205. mov al, 1Ch ; наше прерывание таймера
  206. int 21h
  207.  
  208.  
  209. mov ah, 01h
  210. mov cx, 2607h
  211. int 10h
  212.  
  213. pop ds
  214. _loop:
  215. mov ax, exit
  216. cmp ax, 1
  217. je _end
  218. jmp _loop
  219. _end:
  220.  
  221.  
  222. ; надо вернуть всё как было
  223. mov dx, old_int_offset
  224. mov ax, old_int_seg
  225. mov ds, ax ; можно поменять только через ax
  226.  
  227. mov ah, 25h ; поменятьменять вектор прерывания
  228. mov al, 1Ch ; наше прерывание таймера
  229. int 21h
  230.  
  231.  
  232. mov ax, 4c00h
  233. int 21h
  234.  
  235.  
  236. end start
  237.  
Advertisement
Add Comment
Please, Sign In to add comment