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 ; множитель скорости
- text1 db "ASSEBLER GAVNO!!! ", 20 dup(' '), "$" ; позже изменить
- text2 db "KOROTKAYA STROKA ", 20 dup(' '), "$" ; позже изменить
- text3 db "STROKA ", 20 dup(' '), "$" ; позже изменить
- endl db 13,10,'$'
- text_lenght dw 18; максимальная длинна текста
- horisontal_vertical dw 0 ; направнение строки
- sleep_draw_flag dw 0; флаг зажержки рисования
- count dw 0; счётчик тактов
- iter_count dw 4; задержка в тактах
- ; 18 тактов - 1 секунда
- exit dw 0 ; флаг выхода
- x_pos1 db 5 ; положение слова
- y_pos1 db 2 ; cтроки 1
- sybmbol_x1 db 5 ; положение символа
- sybmbol_y1 db 5 ; строки 1
- x_pos2 db 30 ; положение слова
- y_pos2 db 8 ; cтроки 1
- sybmbol_x2 db 30 ; положение символа
- sybmbol_y2 db 20 ; строки 1
- x_pos3 db 60 ; положение слова
- y_pos3 db 2; cтроки 1
- sybmbol_x3 db 60 ; положение символа
- sybmbol_y3 db 5 ; строки 1
- draw_progress dw 1; количество нарисованных символов
- 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:
- mov cx, 1
- mov draw_progress, cx
- _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 ; сбрасываем количество итераций
- _set_flag:
- jmp _end_draw
- ; часть, где мы рисуем
- _draw:
- mov cx, draw_progress
- ; печатаем посимвольно
- ; повторяем печать столько раз
- ; сколько символов в строке
- _print_symbol:
- ; ставим позицию курсора
- mov ah, 02h
- mov bh, 00h
- mov dl, sybmbol_x1
- mov dh, sybmbol_y1
- int 10h
- ; печатаем символ
- mov ah, 02h
- mov bx, text_lenght
- sub bx, cx
- mov dl, text1[bx] ; i-й символ строки
- int 21h
- mov ah, 02h
- mov bh, 00h
- mov dl, sybmbol_x2
- mov dh, sybmbol_y2
- int 10h
- ; печатаем символ
- mov ah, 02h
- mov bx, text_lenght
- sub bx, cx
- mov dl, text2[bx] ; i-й символ строки
- int 21h
- mov ah, 02h
- mov bh, 00h
- mov dl, sybmbol_x3
- mov dh, sybmbol_y3
- int 10h
- ; печатаем символ
- mov ah, 02h
- mov bx, text_lenght
- sub bx, cx
- mov dl, text3[bx] ; i-й символ строки
- int 21h
- mov ax, horisontal_vertical
- cmp ax, 1
- je _sybm_add_vertical
- _sybm_add_horisontal:
- mov al, sybmbol_x1
- inc al
- mov sybmbol_x1, al
- mov al, sybmbol_x2
- inc al
- mov sybmbol_x2, al
- mov al, sybmbol_x3
- inc al
- mov sybmbol_x3, al
- jmp _end_add_sybm_pos
- _sybm_add_vertical:
- mov al, sybmbol_y1
- inc al
- mov sybmbol_y1, al
- mov al, sybmbol_y2
- inc al
- mov sybmbol_y2, al
- mov al, sybmbol_y3
- inc al
- mov sybmbol_y3, al
- jmp _end_add_sybm_pos
- _end_add_sybm_pos:
- dec cx
- mov draw_progress, cx
- ; проверяем, что дописали слово
- cmp cx, 0
- jne _draw_in_progress
- mov al, x_pos1
- mov sybmbol_x1, al
- mov al, y_pos1
- mov sybmbol_y1, al
- mov al, x_pos2
- mov sybmbol_x2, al
- mov al, y_pos2
- mov sybmbol_y2, al
- mov al, x_pos3
- mov sybmbol_x3, al
- mov al, y_pos3
- mov sybmbol_y3, al
- ; очистка экрана
- mov ah, 06h
- mov al, 00h
- mov bh, 00001111b
- mov cx, 0000h
- mov dx, 184fh
- int 10h
- mov cx, text_lenght
- mov draw_progress, cx
- _draw_in_progress:
- 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