Advertisement
qberik

Untitled

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