Advertisement
qberik

Untitled

Dec 22nd, 2022
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.25 KB | None | 0 0
  1. .model small
  2. .stack 100h
  3.  
  4.  
  5. .data
  6.  
  7.  
  8. ;rate dw 29 ; множитель скорости
  9. rate dw 1 ; множитель скорости
  10.  
  11.  
  12. text db "ASSEBLER GAVNO!!! ", "$" ; позже изменить
  13. endl db 13,10,'$'
  14. text_lenght dw 18; длинна текста
  15. horisontal_vertical dw 0 ; направнение строки
  16. sleep_draw_flag dw 0; флаг зажержки рисования
  17. count dw 0; счётчик тактов
  18. iter_count dw 4; задержка в тактах
  19. ; 18 тактов - 1 секунда
  20.  
  21.  
  22. exit dw 0 ; флаг выхода
  23.  
  24. x_pos db 5 ; положение слова
  25. y_pos db 5
  26.  
  27. sybmbol_x db 5 ; положение символа
  28. sybmbol_y db 5
  29.  
  30. draw_progress dw 1 ; количество нарисованных символов
  31.  
  32.  
  33. old_int_offset dw ?
  34. old_int_seg dw ?
  35.  
  36. .code
  37. cool_interrup proc far
  38. ; можно и pusha
  39. push ax
  40. push bx
  41. push cx
  42. push dx
  43. push si
  44. push di
  45. push bp
  46. pushf
  47.  
  48.  
  49. mov ah, 1 ; Проверка на то, что какая-то кнопка нажата
  50. int 16h
  51. jz _skip_input ; ничего не нажато
  52.  
  53.  
  54. mov ah, 0 ; Если что-то нажато, то надо узнать что
  55. int 16h
  56.  
  57. _key1:
  58. cmp al, 'p' ; кнопка вместо принт скрина
  59. jne _key2
  60. mov ax, horisontal_vertical
  61. cmp ax, 1
  62. je _ver
  63. _hor:
  64. mov ax, 1
  65. mov horisontal_vertical, ax
  66. jmp _change_end
  67. _ver:
  68. mov ax, 0
  69. mov horisontal_vertical, ax
  70. jmp _change_end
  71. _change_end:
  72. _key2:
  73. cmp al, '2'
  74. jne _key3
  75. mov ax, 2
  76. mov bx, rate
  77. mul bx
  78. mov iter_count, ax
  79. _key3:
  80. cmp al, '4'
  81. jne _key4
  82. mov ax, 4
  83. mov bx, rate
  84. mul bx
  85. mov iter_count, ax
  86. _key4:
  87. cmp al, '6'
  88. jne _key5
  89. mov ax, 6
  90. mov bx, rate
  91. mul bx
  92. mov iter_count, ax
  93. _key5:
  94. cmp al, '8'
  95. jne _key6
  96. mov ax, 8
  97. mov bx, rate
  98. mul bx
  99. mov iter_count, ax
  100. _key6:
  101. cmp al, '0' ; выход
  102. jnz _no_key
  103. mov ax, 1
  104. mov exit, ax
  105.  
  106. _no_key:
  107.  
  108.  
  109. _skip_input:
  110.  
  111.  
  112. ; часть где рисуем
  113. xor ax, ax
  114. xor bx, bx
  115. mov ax, sleep_draw_flag
  116. cmp sleep_draw_flag, 0
  117. je _draw; если флад сброшен, то можно рисовать
  118. ; если нет, то уменьшаем счётчик тактов
  119. mov ax, count
  120. dec ax
  121. mov count, ax
  122.  
  123. ; если счётчик == 0, то сбрасываем флаг
  124. cmp ax, 0 ; сравниваем с 0
  125. jg _set_flag ; если больше 0, то пропускаем
  126. mov ax, 0 ; ставим 0
  127. mov sleep_draw_flag, ax
  128.  
  129. mov ax, iter_count
  130. mov count, ax ; сбрасываем количество итераций
  131.  
  132. _set_flag:
  133. jmp _end_draw
  134.  
  135.  
  136. ; часть, где мы рисуем
  137. _draw:
  138.  
  139. mov cx, draw_progress
  140.  
  141. ; печатаем посимвольно
  142. ; повторяем печать столько раз
  143. ; сколько символов в строке
  144.  
  145. _print_symbol:
  146.  
  147. ; ставим позицию курсора
  148. mov ah, 02h
  149. mov bh, 00h
  150. mov dl, sybmbol_x
  151. mov dh, sybmbol_y
  152. int 10h
  153.  
  154. ; печатаем символ
  155. mov ah, 02h
  156. mov bx, text_lenght
  157. sub bx, cx
  158. mov dl, text[bx] ; i-й символ строки
  159. int 21h
  160.  
  161.  
  162. mov ax, horisontal_vertical
  163. cmp ax, 1
  164. je _sybm_add_vertical
  165. _sybm_add_horisontal:
  166. mov al, sybmbol_x
  167. inc al
  168. mov sybmbol_x, al
  169.  
  170. jmp _end_add_sybm_pos
  171. _sybm_add_vertical:
  172. mov al, sybmbol_y
  173. inc al
  174. mov sybmbol_y, al
  175. jmp _end_add_sybm_pos
  176. _end_add_sybm_pos:
  177.  
  178. dec cx
  179. mov draw_progress, cx
  180.  
  181. ; проверяем, что дописали слово
  182. cmp cx, 0
  183. jne _draw_in_progress
  184. mov al, x_pos
  185. mov sybmbol_x, al
  186.  
  187. mov al, y_pos
  188. mov sybmbol_y, al
  189.  
  190. ; очистка экрана
  191. mov ah, 06h
  192. mov al, 00h
  193. mov bh, 00001111b
  194. mov cx, 0000h
  195. mov dx, 184fh
  196. int 10h
  197.  
  198. mov cx, text_lenght
  199. mov draw_progress, cx
  200. _draw_in_progress:
  201.  
  202.  
  203. mov ax, 1
  204. mov sleep_draw_flag, ax
  205.  
  206.  
  207.  
  208. _end_draw:
  209.  
  210.  
  211. ; можно и popa
  212. popf
  213. pop bp
  214. pop di
  215. pop si
  216. pop dx
  217. pop cx
  218. pop bx
  219. pop ax
  220. iret
  221. cool_interrup endp
  222.  
  223. start:
  224. mov ax, @data
  225. mov ds, ax
  226.  
  227. jumps
  228.  
  229. ; сделать курсор невидимым
  230. mov ah, 01h
  231. mov cx, 2607h
  232. int 10h
  233.  
  234.  
  235. ; получим адреса прерываний, которые были ещё до нас
  236. mov ah, 35h ; получить вектор прерывания
  237. mov al, 1Ch ; прерывание таймера
  238. int 21h
  239. ; в bx записался сдвиг старого прерывания
  240. ; в ex записался сегмерт старого прерывания
  241.  
  242. ; их надо запомнить, чтобы потом вернуть всё на место
  243. mov old_int_offset, bx
  244. mov old_int_seg , es
  245.  
  246. ; теперь можем написать что-то своё заместо прошлого прерывания
  247.  
  248.  
  249.  
  250. ; пусть эта функция будет нашим прерыванием
  251.  
  252. push ds ; будем трогать ds так что надо положить его в стек, чтобы не потерять
  253.  
  254. mov dx, offset cool_interrup
  255. mov ax, seg cool_interrup
  256. mov ds, ax ; можно поменять только через ax
  257.  
  258. mov ah, 25h ; поменятьменять вектор прерывания
  259. mov al, 1Ch ; наше прерывание таймера
  260. int 21h
  261.  
  262. pop ds
  263.  
  264.  
  265. _loop:
  266. nop
  267.  
  268. mov ax, exit
  269. cmp ax, 1
  270. je _end
  271. jmp _loop
  272.  
  273. _end:
  274.  
  275.  
  276. ; надо вернуть всё как было
  277. mov dx, old_int_offset
  278. mov ax, old_int_seg
  279. mov ds, ax ; можно поменять только через ax
  280.  
  281. mov ah, 25h ; поменятьменять вектор прерывания
  282. mov al, 1Ch ; наше прерывание таймера
  283. int 21h
  284.  
  285.  
  286. nojumps
  287.  
  288. mov ax, 4c00h
  289. int 21h
  290.  
  291.  
  292. end start
  293.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement