Advertisement
qberik

Untitled

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