Advertisement
qberik

Untitled

Dec 22nd, 2022
174
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
Advertisement