Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .model small
- .stack 100h
- .data
- ;rate dw 29 ; множитель скорости
- rate dw 1 ; множитель скорости
- text db "ASSEBLER GAVNO!!! ", "$" ; позже изменить
- endl db 13,10,'$'
- text_lenght dw 18; длинна текста
- horisontal_vertical dw 0 ; направнение строки
- sleep_draw_flag dw 0; флаг зажержки рисования
- count dw 0; счётчик тактов
- iter_count dw 18; задержка в тактах
- ; 18 тактов - 1 секунда
- exit dw 0 ; флаг выхода
- x_pos db 30 ; положение слова
- y_pos db 12
- sybmbol_x db 0 ; положение символа
- sybmbol_y db 0
- screen_w db 80; ширина эекрана в символах
- screen_h db 24 ; высота экрана в символах
- old_int_offset dw ?
- old_int_seg dw ?
- .code
- cool_interrup proc far
- ; можно и pusha
- push ax
- push bx
- push cx
- push dx
- push si
- push di
- push bp
- pushf
- mov ah, 1 ; Проверка на то, что какая-то кнопка нажата
- int 16h
- jz _skip_input ; ничего не нажато
- mov ah, 0 ; Если что-то нажато, то надо узнать что
- int 16h
- _key1:
- cmp al, 'p' ; кнопка вместо принт скрина
- jne _key2
- mov ax, horisontal_vertical
- cmp ax, 1
- je _ver
- _hor:
- mov ax, 1
- mov horisontal_vertical, ax
- jmp _change_end
- _ver:
- mov ax, 0
- mov horisontal_vertical, ax
- jmp _change_end
- _change_end:
- _key2:
- cmp al, '2'
- jne _key3
- mov ax, 2
- mov bx, rate
- mul bx
- mov iter_count, ax
- _key3:
- cmp al, '4'
- jne _key4
- mov ax, 4
- mov bx, rate
- mul bx
- mov iter_count, ax
- _key4:
- cmp al, '6'
- jne _key5
- mov ax, 6
- mov bx, rate
- mul bx
- mov iter_count, ax
- _key5:
- cmp al, '8'
- jne _key6
- mov ax, 8
- mov bx, rate
- mul bx
- mov iter_count, ax
- _key6:
- cmp al, '0' ; выход
- jnz _no_key
- mov ax, 1
- mov exit, ax
- _no_key:
- _skip_input:
- ; часть где рисуем
- xor ax, ax
- xor bx, bx
- mov ax, sleep_draw_flag
- cmp sleep_draw_flag, 0
- je _draw; если флад сброшен, то можно рисовать
- ; если нет, то уменьшаем счётчик тактов
- mov ax, count
- dec ax
- mov count, ax
- ; если счётчик == 0, то сбрасываем флаг
- cmp ax, 0 ; сравниваем с 0
- jg _set_flag ; если больше 0, то пропускаем
- mov ax, 0 ; ставим 0
- mov sleep_draw_flag, ax
- mov ax, iter_count
- mov count, ax ; сбрасываем количество итераций
- mov ax, horisontal_vertical
- cmp ax, 1
- je _pos_add_vertical
- _pos_add_horisontal:
- mov al, x_pos
- inc al
- mov x_pos, al
- cmp al, screen_w
- jl _normal_pos_x
- sub al, screen_w
- mov x_pos, al
- _normal_pos_x:
- jmp _end_add_pos
- _pos_add_vertical:
- mov al, y_pos
- inc al
- mov y_pos, al
- cmp al, screen_h
- jl _normal_pos_y
- sub al, screen_h
- mov y_pos, al
- _normal_pos_y:
- jmp _end_add_pos
- _end_add_pos:
- _set_flag:
- jmp _end_draw
- ; часть, где мы рисуем
- _draw:
- ; очистка экрана
- mov ah, 06h
- mov al, 00h
- mov bh, 00001111b
- mov cx, 0000h
- mov dx, 184fh
- int 10h
- ; печатаем посимвольно
- ; повторяем печать столько раз
- ; сколько символов в строке
- mov cx, text_lenght
- mov al, x_pos
- mov sybmbol_x, al
- mov al, y_pos
- mov sybmbol_y, al
- mov ax, horisontal_vertical
- cmp ax, 1
- je _word_ver
- _word_hor:
- mov al, x_pos
- jmp _word_end
- _word_ver:
- mov al, y_pos
- jmp _word_end
- _word_end:
- _print_symbol:
- ; проверка на то, что мы вышли за экран
- mov bx, horisontal_vertical
- cmp bx, 1
- je _sybm_pos_check_ver
- _sybm_pos_check_hor:
- cmp al, screen_w
- jl _normal_symol_x
- sub al, screen_w
- mov sybmbol_x, al
- _normal_symol_x:
- jmp _sybm_pos_check_end
- _sybm_pos_check_ver:
- cmp al, screen_h
- jl _normal_symol_y
- sub al, screen_h
- mov sybmbol_y, al
- _normal_symol_y:
- jmp _sybm_pos_check_end
- _sybm_pos_check_end:
- ; ставим позицию курсора
- mov ah, 02h
- mov bh, 00h
- mov dl, sybmbol_x
- mov dh, sybmbol_y
- int 10h
- ; печатаем символ
- mov ah, 02h
- mov bx, text_lenght
- sub bx, cx
- mov dl, text[bx] ; i-й символ строки
- int 21h
- mov ax, horisontal_vertical
- cmp ax, 1
- je _sybm_add_vertical
- _sybm_add_horisontal:
- mov al, sybmbol_x
- inc al
- mov sybmbol_x, al
- jmp _end_add_sybm_pos
- _sybm_add_vertical:
- mov al, sybmbol_y
- inc al
- mov sybmbol_y, al
- jmp _end_add_sybm_pos
- _end_add_sybm_pos:
- ;mov al, sybmbol_x
- loop _print_symbol
- mov ax, 1
- mov sleep_draw_flag, ax
- _end_draw:
- ; можно и popa
- popf
- pop bp
- pop di
- pop si
- pop dx
- pop cx
- pop bx
- pop ax
- iret
- cool_interrup endp
- start:
- mov ax, @data
- mov ds, ax
- jumps
- ; сделать курсор невидимым
- mov ah, 01h
- mov cx, 2607h
- int 10h
- ; получим адреса прерываний, которые были ещё до нас
- mov ah, 35h ; получить вектор прерывания
- mov al, 1Ch ; прерывание таймера
- int 21h
- ; в bx записался сдвиг старого прерывания
- ; в ex записался сегмерт старого прерывания
- ; их надо запомнить, чтобы потом вернуть всё на место
- mov old_int_offset, bx
- mov old_int_seg , es
- ; теперь можем написать что-то своё заместо прошлого прерывания
- ; пусть эта функция будет нашим прерыванием
- push ds ; будем трогать ds так что надо положить его в стек, чтобы не потерять
- mov dx, offset cool_interrup
- mov ax, seg cool_interrup
- mov ds, ax ; можно поменять только через ax
- mov ah, 25h ; поменятьменять вектор прерывания
- mov al, 1Ch ; наше прерывание таймера
- int 21h
- pop ds
- _loop:
- nop
- mov ax, exit
- cmp ax, 1
- je _end
- jmp _loop
- _end:
- ; надо вернуть всё как было
- mov dx, old_int_offset
- mov ax, old_int_seg
- mov ds, ax ; можно поменять только через ax
- mov ah, 25h ; поменятьменять вектор прерывания
- mov al, 1Ch ; наше прерывание таймера
- int 21h
- nojumps
- mov ax, 4c00h
- int 21h
- end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement